コード例 #1
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");
            }

            Guid?           userProfile = null;
            IUserManagement userProfileDataManagement = ServiceRegistration.Get <IUserManagement>();

            if (userProfileDataManagement != null && userProfileDataManagement.IsValidUser)
            {
                userProfile = userProfileDataManagement.CurrentUser.ProfileId;
            }

            IEnumerable <Guid> mias    = _necessaryMIATypeIds ?? necessaryMIATypeIds;
            IEnumerable <Guid> optMias = _optionalMIATypeIds != null?_optionalMIATypeIds.Except(mias) : null;

            bool    showVirtual = VirtualMediaHelper.ShowVirtualMedia(necessaryMIATypeIds);
            IFilter queryFilter = new FilteredRelationshipFilter(_role, _linkedRole, filter);

            MediaItemQuery query = new MediaItemQuery(mias, optMias, queryFilter);

            if (_sortInformation != null)
            {
                query.SortInformation = new List <ISortInformation> {
                    _sortInformation
                }
            }
            ;

            IList <MediaItem> items = await cd.SearchAsync(query, true, userProfile, showVirtual);

            CertificationHelper.ConvertCertifications(items);
            IList <FilterValue> result = new List <FilterValue>(items.Count);

            foreach (MediaItem item in items)
            {
                string name;
                MediaItemAspect.TryGetAttribute(item.Aspects, MediaAspect.ATTR_TITLE, out name);
                result.Add(new FilterValue(name,
                                           new FilterTreePath(_role),
                                           null,
                                           item,
                                           this));
            }

            //ToDo: Add support for an empty entry for all filtered items that don't have this relationship
            //The below works OK in simple cases but results in an extra, relatively long running query. Maybe this should be handled
            //at the server for all relationship queries...
            //IFilter emptyRelationshipFilter = new NotFilter(new RelationshipFilter(_linkedRole, _role, Guid.Empty));
            //queryFilter = filter != null ? BooleanCombinationFilter.CombineFilters(BooleanOperator.And, filter, emptyRelationshipFilter) : emptyRelationshipFilter;
            //int numEmptyEntries = cd.CountMediaItems(necessaryMIATypeIds, queryFilter, true, showVirtual);
            //if(numEmptyEntries > 0)
            //  result.Insert(0, new FilterValue(Consts.RES_VALUE_EMPTY_TITLE, emptyRelationshipFilter, null, this));

            return(result);
        }
コード例 #2
0
        protected void FillList(IContentDirectory contentDirectory, Guid[] necessaryMIAs, ItemsList list, MediaItemToListItemAction converterAction)
        {
            MediaItemQuery query = new MediaItemQuery(necessaryMIAs, null)
            {
                Limit           = (uint)QueryLimit, // Last 5 imported items
                SortInformation = new List <SortInformation> {
                    new SortInformation(ImporterAspect.ATTR_DATEADDED, SortDirection.Descending)
                }
            };

            Guid?           userProfile = null;
            IUserManagement userProfileDataManagement = ServiceRegistration.Get <IUserManagement>();

            if (userProfileDataManagement != null && userProfileDataManagement.IsValidUser)
            {
                userProfile = userProfileDataManagement.CurrentUser.ProfileId;
            }

            var items = contentDirectory.Search(query, false, userProfile, false);

            list.Clear();
            foreach (MediaItem mediaItem in items)
            {
                PlayableMediaItem listItem = converterAction(mediaItem);
                listItem.Command = new MethodDelegateCommand(() => PlayItemsModel.CheckQueryPlayAction(listItem.MediaItem));
                list.Add(listItem);
            }
            list.FireChange();
        }
コード例 #3
0
        protected internal override void ReLoadItemsAndSubViewSpecifications(out IList <MediaItem> mediaItems, out IList <ViewSpecification> subViewSpecifications)
        {
            mediaItems            = null;
            subViewSpecifications = new List <ViewSpecification>();
            IContentDirectory cd = ServiceRegistration.Get <IServerConnectionManager>().ContentDirectory;

            if (cd == null)
            {
                return;
            }

            Guid?           userProfile = null;
            IUserManagement userProfileDataManagement = ServiceRegistration.Get <IUserManagement>();

            if (userProfileDataManagement != null && userProfileDataManagement.IsValidUser)
            {
                userProfile = userProfileDataManagement.CurrentUser.ProfileId;
            }
            bool showVirtual = VirtualMediaHelper.ShowVirtualMedia(_necessaryMIATypeIds);

            try
            {
                MediaItemQuery query = new MediaItemQuery(_necessaryMIATypeIds, _optionalMIATypeIds, _filter)
                {
                    Limit = Consts.MAX_NUM_ITEMS_VISIBLE
                };
                mediaItems = cd.SearchAsync(query, true, userProfile, showVirtual).Result;
            }
            catch (UPnPRemoteException e)
            {
                ServiceRegistration.Get <ILogger>().Error("SimpleTextSearchViewSpecification.ReLoadItemsAndSubViewSpecifications: Error requesting server", e);
                mediaItems = new List <MediaItem>();
            }
        }
コード例 #4
0
        public void TestMediaItemLoader_SingleMIAs_IdFilter()
        {
            MockDBUtils.Reset();
            SingleTestMIA single1 = TestBackendUtils.CreateSingleMIA("SINGLE1", Cardinality.Inline, true, false);
            SingleTestMIA single2 = TestBackendUtils.CreateSingleMIA("SINGLE2", Cardinality.Inline, false, true);

            Guid         itemId = new Guid("aaaaaaaa-1111-1111-1111-aaaaaaaaaaaa");
            IList <Guid> ids    = new List <Guid>();

            ids.Add(itemId);
            IFilter filter = new MediaItemIdFilter(ids);

            MockReader reader = MockDBUtils.AddReader(
                "SELECT T0.MEDIA_ITEM_ID A2, T0.MEDIA_ITEM_ID A3, T1.MEDIA_ITEM_ID A4, T0.ATTR_STRING A0, T1.ATTR_INTEGER A1 FROM M_SINGLE1 T0 INNER JOIN M_SINGLE2 T1 ON T1.MEDIA_ITEM_ID = T0.MEDIA_ITEM_ID " +
                " WHERE T0.MEDIA_ITEM_ID = @V0", "A2", "A3", "A4", "A0", "A1");

            reader.AddResult(itemId, itemId, itemId, "zero", 0);

            Guid[]                 requiredAspects = new Guid[] { single1.ASPECT_ID, single2.ASPECT_ID };
            Guid[]                 optionalAspects = null;
            MediaItemQuery         query           = new MediaItemQuery(requiredAspects, optionalAspects, filter);
            CompiledMediaItemQuery compiledQuery   = CompiledMediaItemQuery.Compile(MockCore.Management, query);
            MediaItem              result          = compiledQuery.QueryMediaItem();

            Assert.AreEqual(itemId, result.MediaItemId, "MediaItem ID");
            // TODO: More asserts
        }
コード例 #5
0
        public void TestRelationshipFilter()
        {
            Guid itemId           = new Guid("11111111-aaaa-aaaa-aaaa-111111111111");
            Guid itemType         = new Guid("22222222-bbbb-bbbb-bbbb-222222222222");
            Guid relationshipType = new Guid("33333333-cccc-cccc-cccc-333333333333");

            MediaItemQuery query1 = new MediaItemQuery(new Guid[] { MediaAspect.ASPECT_ID }, new RelationshipFilter(itemType, relationshipType, itemId));

            TextWriter writer     = new StringWriter();
            XmlWriter  serialiser = new XmlTextWriter(writer);

            query1.Serialize(serialiser);

            //Console.WriteLine("XML: {0}", writer.ToString());

            XmlReader      reader = XmlReader.Create(new StringReader(writer.ToString()));
            MediaItemQuery query2 = MediaItemQuery.Deserialize(reader);

            Assert.IsTrue(query2.Filter is RelationshipFilter, "Query filter type");
            RelationshipFilter filter = (RelationshipFilter)query2.Filter;

            Assert.AreEqual(filter.LinkedMediaItemId, itemId, "Filter item linked ID");
            Assert.AreEqual(filter.Role, itemType, "Filter item type");
            Assert.AreEqual(filter.LinkedRole, relationshipType, "Filter item linked role");
        }
コード例 #6
0
        //Performs the actual query and updates the target property with the returned media item(s)
        protected void QueryMediaItems()
        {
            IFilter filter = Filter;

            if (filter == null)
            {
                //Set target property to null if invalid to remove any previously assigned media items
                UpdateTargetProperty(null, QueryMode);
                return;
            }

            IContentDirectory cd = ServiceRegistration.Get <IServerConnectionManager>().ContentDirectory;

            if (cd == null)
            {
                return;
            }

            MediaItemQueryMode queryMode = QueryMode;
            MediaItemQuery     query     = new MediaItemQuery(NecessaryRequestedMIAs, OptionalRequestedMIAs, filter);

            if (queryMode == MediaItemQueryMode.SingleItem)
            {
                query.Limit = 1;
            }

            IList <MediaItem> items = cd.Search(query, true, GetCurrentUserId(), false);

            UpdateTargetProperty(items, queryMode);
        }
コード例 #7
0
        public bool TryGetFanArt(FanArtConstants.FanArtMediaType mediaType, FanArtConstants.FanArtType fanArtType, string name, int maxWidth, int maxHeight, bool singleRandom, out IList <FanArtImage> result)
        {
            result = null;
            if (mediaType != FanArtConstants.FanArtMediaType.Album || fanArtType != FanArtConstants.FanArtType.Poster || string.IsNullOrEmpty(name))
            {
                return(false);
            }

            IMediaLibrary mediaLibrary = ServiceRegistration.Get <IMediaLibrary>(false);

            if (mediaLibrary == null)
            {
                return(false);
            }

            IFilter        filter = new RelationalFilter(AudioAspect.ATTR_ALBUM, RelationalOperator.EQ, name);
            MediaItemQuery query  = new MediaItemQuery(NECESSARY_MIAS, filter);
            var            items  = mediaLibrary.Search(query, false);

            result = new List <FanArtImage>();
            foreach (var mediaItem in items)
            {
                byte[] textureData;
                if (!MediaItemAspect.TryGetAttribute(mediaItem.Aspects, ThumbnailLargeAspect.ATTR_THUMBNAIL, out textureData))
                {
                    continue;
                }

                // Only one record required
                result.Add(new FanArtImage(name, textureData));
                return(true);
            }
            return(true);
        }
コード例 #8
0
        protected static async Task FillListAsync(IContentDirectory contentDirectory, Guid[] necessaryMIATypeIds, ItemsList list, MediaItemToListItemAction converterAction)
        {
            MediaItemQuery query = new MediaItemQuery(necessaryMIATypeIds, null)
            {
                Limit           = QUERY_LIMIT, // Last 5 imported items
                SortInformation = new List <ISortInformation> {
                    new AttributeSortInformation(ImporterAspect.ATTR_DATEADDED, SortDirection.Descending)
                }
            };

            Guid?           userProfile = null;
            IUserManagement userProfileDataManagement = ServiceRegistration.Get <IUserManagement>();

            if (userProfileDataManagement != null && userProfileDataManagement.IsValidUser)
            {
                userProfile = userProfileDataManagement.CurrentUser.ProfileId;
            }
            bool showVirtual = VirtualMediaHelper.ShowVirtualMedia(necessaryMIATypeIds);

            var items = await contentDirectory.SearchAsync(query, false, userProfile, showVirtual);

            list.Clear();
            foreach (MediaItem mediaItem in items)
            {
                PlayableMediaItem listItem = converterAction(mediaItem);
                listItem.Command = new MethodDelegateCommand(() => PlayItemsModel.CheckQueryPlayAction(listItem.MediaItem));
                list.Add(listItem);
            }
            list.FireChange();
        }
コード例 #9
0
        public override async Task <IEnumerable <MediaItem> > GetAllMediaItems()
        {
            IContentDirectory cd = ServiceRegistration.Get <IServerConnectionManager>().ContentDirectory;

            if (cd == null)
            {
                return(new List <MediaItem>());
            }

            UserProfile     userProfile = null;
            IUserManagement userProfileDataManagement = ServiceRegistration.Get <IUserManagement>();

            if (userProfileDataManagement != null && userProfileDataManagement.IsValidUser)
            {
                userProfile = userProfileDataManagement.CurrentUser;
            }

            MediaItemQuery query = new MediaItemQuery(
                _necessaryMIATypeIds,
                _optionalMIATypeIds,
                UserHelper.GetUserRestrictionFilter(_necessaryMIATypeIds, userProfile, new BooleanCombinationFilter(BooleanOperator.And,
                                                                                                                    new IFilter[]
            {
                new RelationalFilter(ProviderResourceAspect.ATTR_SYSTEM_ID, RelationalOperator.EQ, _systemId),
                new LikeFilter(ProviderResourceAspect.ATTR_RESOURCE_ACCESSOR_PATH, SqlUtils.LikeEscape(_basePath.Serialize(), '\\') + "%", '\\', true)
            })));

            bool showVirtual = VirtualMediaHelper.ShowVirtualMedia(_necessaryMIATypeIds);

            return(await cd.SearchAsync(query, false, userProfile?.ProfileId, showVirtual));
        }
コード例 #10
0
        /// <summary>
        /// Checks whether the <paramref name="action"/> has any aspects and if not
        /// tries to restore them from the media library.
        /// </summary>
        /// <param name="action">The action to check.</param>
        /// <returns>True if the aspects were present or successfully restored.</returns>
        protected async Task <bool> TryRestoreAspects(FanArtManagerAction action)
        {
            //Already has aspects, nothing to do
            if (action.Aspects != null)
            {
                return(true);
            }

            //No aspects, this resource was restored from disk, try and restore the aspects from the media library.
            //Throttle the number of concurrent queries To avoid a spike during startup.
            await _loadItemThrottle.WaitAsync(_cts.Token);

            try
            {
                IMediaLibrary  mediaLibrary = ServiceRegistration.Get <IMediaLibrary>();
                MediaItemQuery query        = new MediaItemQuery(null,
                                                                 mediaLibrary.GetManagedMediaItemAspectMetadata().Keys,
                                                                 new MediaItemIdFilter(action.MediaItemId));
                var items = mediaLibrary.Search(query, false, null, true);
                if (items != null && items.Count > 0)
                {
                    action.Aspects = items[0].Aspects;
                    return(true);
                }
                ServiceRegistration.Get <ILogger>().Warn("FanArtActionBlock: Unable to restore FanArtAction, media item with id {0} was not found in the media library", action.MediaItemId);
                return(false);
            }
            finally
            {
                _loadItemThrottle.Release();
            }
        }
コード例 #11
0
        public IList <MediaItem> Search(MediaItemQuery query, bool filterOnlyOnline, Guid?userProfile, bool includeVirtual)
        {
            Logger.Info("Browsing {0}", query);
            IList <MediaItem> items = new List <MediaItem>();

            items.Add(new MediaItem(Guid.NewGuid()));
            return(items);
        }
コード例 #12
0
        protected override object DoDeserializeValue(XmlReader reader, bool isSimpleValue)
        {
            reader.ReadStartElement(); // Read start of enclosing element
            MediaItemQuery result = MediaItemQuery.Deserialize(reader);

            reader.ReadEndElement(); // End of enclosing element
            return(result);
        }
コード例 #13
0
 public MediaLibraryQueryViewSpecification(string viewDisplayName, IFilterTree filterTree,
                                           IEnumerable <Guid> necessaryMIATypeIDs, IEnumerable <Guid> optionalMIATypeIDs, bool onlyOnline) :
     base(viewDisplayName, necessaryMIATypeIDs, optionalMIATypeIDs)
 {
     _filterTree = filterTree ?? new SimpleFilterTree();
     _query      = new MediaItemQuery(necessaryMIATypeIDs, optionalMIATypeIDs, _filterTree.BuildFilter());
     _onlyOnline = onlyOnline;
 }
コード例 #14
0
 public MediaLibraryQueryViewSpecification(string viewDisplayName, IFilter filter,
                                           IEnumerable <Guid> necessaryMIATypeIDs, IEnumerable <Guid> optionalMIATypeIDs, bool onlyOnline) :
     base(viewDisplayName, necessaryMIATypeIDs, optionalMIATypeIDs)
 {
     _filter     = filter;
     _query      = new MediaItemQuery(necessaryMIATypeIDs, optionalMIATypeIDs, filter);
     _onlyOnline = onlyOnline;
 }
コード例 #15
0
        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");
            }

            Guid?           userProfile = null;
            IUserManagement userProfileDataManagement = ServiceRegistration.Get <IUserManagement>();

            if (userProfileDataManagement != null && userProfileDataManagement.IsValidUser)
            {
                userProfile = userProfileDataManagement.CurrentUser.ProfileId;
            }

            IEnumerable <Guid> mias    = _necessaryMIATypeIds ?? necessaryMIATypeIds;
            IEnumerable <Guid> optMias = _optionalMIATypeIds != null?_optionalMIATypeIds.Except(mias) : null;

            IFilter queryFilter;

            if (filter != null)
            {
                queryFilter = new FilteredRelationshipFilter(_role, filter);
            }
            else
            {
                queryFilter = new RelationshipFilter(_role, _linkedRole, Guid.Empty);
            }
            MediaItemQuery query = new MediaItemQuery(mias, optMias, queryFilter);

            if (_sortInformation != null)
            {
                query.SortInformation = new List <SortInformation> {
                    _sortInformation
                }
            }
            ;
            IList <MediaItem>   items  = cd.Search(query, true, userProfile, ShowVirtualSetting.ShowVirtualMedia(necessaryMIATypeIds));
            IList <FilterValue> result = new List <FilterValue>(items.Count);

            foreach (MediaItem item in items)
            {
                string name;
                MediaItemAspect.TryGetAttribute(item.Aspects, MediaAspect.ATTR_TITLE, out name);
                result.Add(new FilterValue(name,
                                           new RelationshipFilter(_linkedRole, _role, item.MediaItemId),
                                           null,
                                           item,
                                           this));
            }
            return(result);
        }
コード例 #16
0
        public IList <MediaItem> Search(MediaItemQuery query, bool onlyOnline)
        {
            CpAction       action         = GetAction("Search");
            String         onlineStateStr = SerializeOnlineState(onlyOnline);
            IList <object> inParameters   = new List <object> {
                query, onlineStateStr
            };
            IList <object> outParameters = action.InvokeAction(inParameters);

            return((IList <MediaItem>)outParameters[0]);
        }
コード例 #17
0
        internal static IList <MediaItem> Search(IOwinContext context, ISet <Guid> necessaryMIATypes, ISet <Guid> optionalMIATypes, IFilter filter, uint?limit = null)
        {
            Guid?          user         = ResourceAccessUtils.GetUser(context);
            IFilter        searchFilter = ResourceAccessUtils.AppendUserFilter(user, filter, necessaryMIATypes);
            MediaItemQuery searchQuery  = new MediaItemQuery(necessaryMIATypes, optionalMIATypes, searchFilter)
            {
                Limit = limit
            };

            return(MediaLibrary.Search(searchQuery, false, user, false));
        }
コード例 #18
0
        /// <summary>
        /// Checks whether the <paramref name="actions"/> has any aspects and if not
        /// tries to load them from the media library.
        /// </summary>
        /// <param name="actions">The action to check.</param>
        /// <returns>True if the aspects were present or successfully loaded.</returns>
        protected async Task LoadAspects(FanArtManagerAction[] actions)
        {
            var mediaItemIds = actions.Where(a => a.Type == ActionType.Collect && (a.Aspects == null || a.Aspects.Count == 0))
                               .Select(a => a.MediaItemId).Distinct();

            var queryFilter = new MediaItemIdFilter(mediaItemIds);

            if (queryFilter.MediaItemIds.Count == 0)
            {
                return;
            }

            IMediaLibrary mediaLibrary = ServiceRegistration.Get <IMediaLibrary>();

            MediaItemQuery query = new MediaItemQuery(null,
                                                      mediaLibrary.GetManagedMediaItemAspectMetadata().Keys,
                                                      queryFilter);

            // Throttle the number of concurrent queries To avoid spikes when loading aspects.
            await _loadItemThrottle.WaitAsync(_cts.Token);

            try
            {
                var items = mediaLibrary.Search(query, false, null, true);
                if (items != null && items.Count > 0)
                {
                    foreach (var item in items)
                    {
                        foreach (var action in actions)
                        {
                            if (action.MediaItemId == item.MediaItemId)
                            {
                                action.Aspects = item.Aspects;
                                break;
                            }
                        }
                    }
                }
                else
                {
                    ServiceRegistration.Get <ILogger>().Warn("FanArtActionBlock: Unable to load aspects, no matching media items were found in the media library");
                }
            }
            catch (Exception ex)
            {
                ServiceRegistration.Get <ILogger>().Error("FanArtActionBlock: Error loading aspects from the media library", ex);
            }
            finally
            {
                _loadItemThrottle.Release();
            }
        }
コード例 #19
0
        private IList <MediaItem> GetItems(string sortCriteria)
        {
            IMediaLibrary  library = ServiceRegistration.Get <IMediaLibrary>();
            IFilter        filter  = new FilteredRelationshipFilter(_role, _linkedRole, AppendUserFilter(null, _necessaryMIAs));
            MediaItemQuery query   = new MediaItemQuery(NECESSARY_PERSON_MIA_TYPE_IDS, filter)
            {
                SortInformation = new List <ISortInformation> {
                    new AttributeSortInformation(PersonAspect.ATTR_PERSON_NAME, SortDirection.Ascending)
                },
            };

            return(library.Search(query, true, UserId, false));
        }
        static UPnPError OnSearch(DvAction action, IList <object> inParams, out IList <object> outParams, CallContext context)
        {
            // In parameters
            var containerId    = (string)inParams[0];
            var searchCriteria = inParams[1].ToString();
            var filter         = inParams[2].ToString();
            var startingIndex  = Convert.ToInt32(inParams[3]);
            var requestedCount = Convert.ToInt32(inParams[4]);
            var sortCriteria   = (string)inParams[5];

            // Out parameters
            int numberReturned     = 0;
            int totalMatches       = 0;
            int containterUpdateId = 0;

            UPnPContentDirectorySearch query = new UPnPContentDirectorySearch();
            StringWriter sw = new StringWriter();

            query.Construct(searchCriteria, sw);
            query.searchCrit();
            PegNode pn = query.GetRoot();

            string xml = ParserHelper.PegNodeToXml(pn, searchCriteria);

            Logger.Debug("MediaServer - Parsed: \"{0}\" to make \"{1}\"", searchCriteria, xml);

            var parentDirectoryId = containerId == "0" ? Guid.Empty : MarshallingHelper.DeserializeGuid(containerId);
            var necessaryMIATypes = new List <Guid> {
                DirectoryAspect.ASPECT_ID
            };

            var searchQuery = new MediaItemQuery(necessaryMIATypes, null);
            //searchQuery.Filter

            var searchItems = ServiceRegistration.Get <IMediaLibrary>().Search(searchQuery, true);

            /*
             * foreach (var item in browseItems)
             * {
             *
             * }
             */
            outParams = new List <object>(3)
            {
                numberReturned, totalMatches, containterUpdateId
            };
            return(null);
        }
コード例 #21
0
 public async Task<IList<MediaItem>> SearchAsync(MediaItemQuery query, bool onlyOnline, Guid? userProfile, bool includeVirtual,  uint? offset = null, uint? limit = null)
 {
   CpAction action = GetAction("X_MediaPortal_Search");
   String onlineStateStr = SerializeOnlineState(onlyOnline);
   IList<object> inParameters = new List<object>
   {
     query,
     onlineStateStr,
     userProfile.HasValue ? MarshallingHelper.SerializeGuid(userProfile.Value) : null,
     includeVirtual,
     offset,
     limit,
   };
   IList<object> outParameters = await action.InvokeAsync(inParameters);
   return (IList<MediaItem>) outParameters[0];
 }
コード例 #22
0
    protected static void FillList(IContentDirectory contentDirectory, Guid[] necessaryMIAs, ItemsList list, MediaItemToListItemAction converterAction)
    {
      MediaItemQuery query = new MediaItemQuery(necessaryMIAs, null)
      {
        Limit = QUERY_LIMIT, // Last 5 imported items
        SortInformation = new List<SortInformation> { new SortInformation(ImporterAspect.ATTR_DATEADDED, SortDirection.Descending) }
      };

      var items = contentDirectory.Search(query, false);
      list.Clear();
      foreach (MediaItem mediaItem in items)
      {
        PlayableMediaItem listItem = converterAction(mediaItem);
        listItem.Command = new MethodDelegateCommand(() => PlayItemsModel.CheckQueryPlayAction(listItem.MediaItem));
        list.Add(listItem);
      }
      list.FireChange();
    }
コード例 #23
0
        public void TestMediaItemLoader_MultipleMIAs_IdFilter()
        {
            MockDBUtils.Reset();
            MultipleTestMIA mia1 = TestBackendUtils.CreateMultipleMIA("MULTIPLE1", Cardinality.Inline, true, false);
            MultipleTestMIA mia2 = TestBackendUtils.CreateMultipleMIA("MULTIPLE2", Cardinality.Inline, false, true);

            Guid         itemId = new Guid("aaaaaaaa-1111-1111-1111-aaaaaaaaaaaa");
            IList <Guid> ids    = new List <Guid>();

            ids.Add(itemId);
            IFilter filter = new MediaItemIdFilter(ids);

            MockReader multipleReader1 = MockDBUtils.AddReader(1, "SELECT T0.MEDIA_ITEM_ID A2, T0.MEDIA_ITEM_ID A3, T0.ATTR_ID A0, T0.ATTR_STRING A1 FROM M_MULTIPLE1 T0  WHERE T0.MEDIA_ITEM_ID = @V0", "A2", "A3", "A0", "A1");

            multipleReader1.AddResult(itemId, itemId, "1_1", "oneone");

            MockReader multipleReader2 = MockDBUtils.AddReader(2, "SELECT T0.MEDIA_ITEM_ID A2, T0.MEDIA_ITEM_ID A3, T0.ATTR_ID A0, T0.ATTR_INTEGER A1 FROM M_MULTIPLE2 T0  WHERE T0.MEDIA_ITEM_ID = @V0", "A2", "A3", "A0", "A1");

            multipleReader2.AddResult(itemId, itemId, "2_1", 21);
            multipleReader2.AddResult(itemId, itemId, "2_2", 22);

            MockReader multipleReader3 = MockDBUtils.AddReader(3, "SELECT T0.MEDIA_ITEM_ID A0, T0.MEDIA_ITEM_ID A1, T1.MEDIA_ITEM_ID A2 FROM M_MULTIPLE1 T0 " +
                                                               "INNER JOIN M_MULTIPLE2 T1 ON T1.MEDIA_ITEM_ID = T0.MEDIA_ITEM_ID  WHERE T0.MEDIA_ITEM_ID = @V0", "A0");

            multipleReader3.AddResult(itemId, itemId, itemId, "1_1", "oneone", "1_1", 11);
            multipleReader3.AddResult(itemId, itemId, itemId, "2_2", "twotwo", "2_2", 22);

            Guid[]                 requiredAspects = new Guid[] { mia1.ASPECT_ID, mia2.ASPECT_ID };
            Guid[]                 optionalAspects = null;
            MediaItemQuery         query           = new MediaItemQuery(requiredAspects, optionalAspects, filter);
            CompiledMediaItemQuery compiledQuery   = CompiledMediaItemQuery.Compile(MockCore.Management, query);
            MediaItem              result          = compiledQuery.QueryMediaItem();
            //Console.WriteLine("Query result " + result.MediaItemId + ": " + string.Join(",", result.Aspects) + ": " + result);

            IList <MultipleMediaItemAspect> values;

            Assert.AreEqual(itemId, result.MediaItemId, "MediaItem ID");
            Assert.IsTrue(MediaItemAspect.TryGetAspects(result.Aspects, mia1.Metadata, out values), "MIA1");
            Assert.AreEqual("oneone", values[0].GetAttributeValue(mia1.ATTR_STRING), "MIA1 string attibute");
            Assert.IsTrue(MediaItemAspect.TryGetAspects(result.Aspects, mia2.Metadata, out values), "MIA2");
            Assert.AreEqual(21, values[0].GetAttributeValue(mia2.ATTR_INTEGER), "MIA2 integer attibute #0");
            Assert.AreEqual(22, values[1].GetAttributeValue(mia2.ATTR_INTEGER), "MIA2 integer attibute #1");
        }
コード例 #24
0
ファイル: Helper.cs プロジェクト: zmshan2008/MediaPortal-2
        internal static async Task PlayMediaItemAsync(Guid mediaItemGuid, int startPos)
        {
            ISet <Guid> necessaryMIATypes = new HashSet <Guid>();

            necessaryMIATypes.Add(MediaAspect.ASPECT_ID);
            necessaryMIATypes.Add(ProviderResourceAspect.ASPECT_ID);
            necessaryMIATypes.Add(ImporterAspect.ASPECT_ID);

            ISet <Guid> optionalMIATypes = new HashSet <Guid>();

            optionalMIATypes.Add(AudioAspect.ASPECT_ID);
            optionalMIATypes.Add(VideoAspect.ASPECT_ID);
            optionalMIATypes.Add(MovieAspect.ASPECT_ID);
            optionalMIATypes.Add(SeriesAspect.ASPECT_ID);
            optionalMIATypes.Add(ImageAspect.ASPECT_ID);

            IList <MediaItem> items        = new List <MediaItem>();
            IFilter           searchFilter = new MediaItemIdFilter(mediaItemGuid);
            MediaItemQuery    searchQuery  = new MediaItemQuery(necessaryMIATypes, optionalMIATypes, searchFilter)
            {
                Limit = 1
            };
            var cd = ServiceRegistration.Get <IServerConnectionManager>(false);

            if (cd?.ContentDirectory != null)
            {
                items = await cd.ContentDirectory.SearchAsync(searchQuery, false, null, false);
            }

            if (items.Count == 0)
            {
                ServiceRegistration.Get <ILogger>().Info("WifiRemote: PlayFile: No media item found");
                return;
            }

            await PlayItemsModel.PlayItem(items[0]);

            if (startPos > 0)
            {
                SetPosition(startPos, true);
            }
        }
コード例 #25
0
        public override IEnumerable <MediaItem> GetAllMediaItems()
        {
            IContentDirectory cd = ServiceRegistration.Get <IServerConnectionManager>().ContentDirectory;

            if (cd == null)
            {
                return(new List <MediaItem>());
            }
            MediaItemQuery query = new MediaItemQuery(
                _necessaryMIATypeIds,
                _optionalMIATypeIds,
                new BooleanCombinationFilter(BooleanOperator.And,
                                             new IFilter[]
            {
                new RelationalFilter(ProviderResourceAspect.ATTR_SYSTEM_ID, RelationalOperator.EQ, _systemId),
                new LikeFilter(ProviderResourceAspect.ATTR_RESOURCE_ACCESSOR_PATH, SqlUtils.LikeEscape(_basePath.Serialize(), '\\') + "%", '\\', true)
            }));

            return(cd.Search(query, false));
        }
コード例 #26
0
        public bool TryGetFanArt(string mediaType, string fanArtType, string name, int maxWidth, int maxHeight, bool singleRandom, out IList <FanArtImage> result)
        {
            result = null;
            if ((mediaType != FanArtMediaTypes.Album && mediaType != FanArtMediaTypes.Audio) ||
                (fanArtType != FanArtTypes.Poster && fanArtType != FanArtTypes.Cover) ||
                string.IsNullOrEmpty(name))
            {
                return(false);
            }

            IMediaLibrary mediaLibrary = ServiceRegistration.Get <IMediaLibrary>(false);

            if (mediaLibrary == null)
            {
                return(false);
            }

            IFilter filter = BooleanCombinationFilter.CombineFilters(BooleanOperator.Or, new MediaItemIdFilter(new Guid(name)),
                                                                     new RelationshipFilter(AudioAlbumAspect.ROLE_ALBUM, AudioAspect.ROLE_TRACK, new Guid(name)));
            MediaItemQuery query = new MediaItemQuery(NECESSARY_MIAS, OPTIONAL_MIAS, filter)
            {
                Limit = 1, // Only one needed
            };

            var items = mediaLibrary.Search(query, false, null, true);

            result = new List <FanArtImage>();
            foreach (var mediaItem in items)
            {
                byte[] textureData;
                if (!MediaItemAspect.TryGetAttribute(mediaItem.Aspects, ThumbnailLargeAspect.ATTR_THUMBNAIL, out textureData))
                {
                    continue;
                }

                // Only one record required
                result.Add(new FanArtImage(name, textureData));
                return(true);
            }
            return(false);
        }
コード例 #27
0
        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");
            }

            Guid?           userProfile = null;
            IUserManagement userProfileDataManagement = ServiceRegistration.Get <IUserManagement>();

            if (userProfileDataManagement != null && userProfileDataManagement.IsValidUser)
            {
                userProfile = userProfileDataManagement.CurrentUser.ProfileId;
            }

            IEnumerable <Guid> mias = new[] { MediaAspect.ASPECT_ID, ProviderResourceAspect.ASPECT_ID, EpisodeAspect.ASPECT_ID }.Concat(necessaryMIATypeIds);
            MediaItemQuery     query = new MediaItemQuery(mias, filter)
            {
                SortInformation = new List <SortInformation> {
                    new SortInformation(EpisodeAspect.ATTR_EPISODE, SortDirection.Ascending)
                }
            };
            var items = cd.Search(query, true, userProfile, ShowVirtualSetting.ShowVirtualMedia(necessaryMIATypeIds));
            IList <FilterValue> result = new List <FilterValue>(items.Count);

            foreach (var item in items)
            {
                string title;
                MediaItemAspect.TryGetAttribute(item.Aspects, MediaAspect.ATTR_TITLE, out title);
                // TODO: Now what? There's no values for an episode
                result.Add(new FilterValue(title,
                                           null,
                                           null,
                                           item,
                                           null));
            }
            return(result);
        }
コード例 #28
0
ファイル: Helper.cs プロジェクト: zmshan2008/MediaPortal-2
        private static async Task <IList <MediaItem> > SearchAsync(Guid?userId, ISet <Guid> necessaryMIATypes, ISet <Guid> optionalMIATypes, IFilter filter, uint?limit = null, uint?offset = null, IList <ISortInformation> sort = null)
        {
            var scm     = ServiceRegistration.Get <IServerConnectionManager>(false);
            var library = scm?.ContentDirectory;
            var userProfileDataManagement = ServiceRegistration.Get <IUserManagement>(false);

            if (library == null || userProfileDataManagement == null)
            {
                return(new List <MediaItem>());
            }

            UserProfile user = null;

            if (userId == null)
            {
                user = userProfileDataManagement?.CurrentUser;
            }
            else
            {
                user = (await userProfileDataManagement?.UserProfileDataManagement.GetProfileAsync(userId.Value))?.Result;
            }
            if (user != null)
            {
                IDictionary <Guid, Share> serverShares = new Dictionary <Guid, Share>();
                var userFilter = user.GetUserFilter(necessaryMIATypes);
                filter = filter == null ? userFilter : userFilter != null?BooleanCombinationFilter.CombineFilters(BooleanOperator.And, filter, userFilter) : filter;

                MediaItemQuery searchQuery = new MediaItemQuery(necessaryMIATypes, optionalMIATypes, filter)
                {
                    Limit           = limit,
                    Offset          = offset,
                    SortInformation = sort
                };
                return(await library.SearchAsync(searchQuery, false, user.ProfileId, false));
            }

            return(new List <MediaItem>());
        }
コード例 #29
0
        public virtual IList <MediaItem> GetItems(string sortCriteria)
        {
            IMediaLibrary library = ServiceRegistration.Get <IMediaLibrary>();
            //TODO: Check if this is correct handling of missing filter

            List <IFilter> filters = new List <IFilter>();

            if (_filter != null)
            {
                filters.Add(_filter);
            }
            if (MediaItemId.HasValue)
            {
                filters.Add(new RelationalFilter(ProviderResourceAspect.ATTR_PARENT_DIRECTORY_ID, RelationalOperator.EQ, MediaItemId.Value));
            }

            IFilter filter = BooleanCombinationFilter.CombineFilters(BooleanOperator.And, filters);
            var     query  = new MediaItemQuery(_necessaryMiaTypeIds, _optionalMiaTypeIds, AppendUserFilter(filter, _necessaryMiaTypeIds));

            query.Limit           = _queryLimit;
            query.SortInformation = _sortInformation;
            return(library.Search(query, true, UserId, false));
        }
コード例 #30
0
        public void TestMediaItemLoader_SingleMIAs_LikeFilter()
        {
            MockDBUtils.Reset();
            SingleTestMIA mia1 = TestBackendUtils.CreateSingleMIA("SINGLE1", Cardinality.Inline, true, false);
            SingleTestMIA mia2 = TestBackendUtils.CreateSingleMIA("SINGLE2", Cardinality.Inline, false, true);
            SingleTestMIA mia3 = TestBackendUtils.CreateSingleMIA("SINGLE3", Cardinality.Inline, true, true);

            Guid itemId = new Guid("aaaaaaaa-1111-1111-1111-aaaaaaaaaaaa");

            IFilter filter = new LikeFilter(mia1.ATTR_STRING, "%", null);

            MockReader reader = MockDBUtils.AddReader(
                "SELECT T0.MEDIA_ITEM_ID A4, T0.MEDIA_ITEM_ID A5, T1.MEDIA_ITEM_ID A6, T2.MEDIA_ITEM_ID A7, T0.ATTR_STRING A0, T1.ATTR_INTEGER A1, T2.ATTR_STRING A2, T2.ATTR_INTEGER A3 " +
                "FROM M_SINGLE1 T0 INNER JOIN M_SINGLE2 T1 ON T1.MEDIA_ITEM_ID = T0.MEDIA_ITEM_ID LEFT OUTER JOIN M_SINGLE3 T2 ON T2.MEDIA_ITEM_ID = T0.MEDIA_ITEM_ID " +
                " WHERE T0.ATTR_STRING LIKE @V0", "A4", "A5", "A6", "A7", "A0", "A1", "A2", "A3");

            reader.AddResult(itemId, itemId, itemId, itemId, "zerozero", 11, "twotwo", 33);

            Guid[]                 requiredAspects = new Guid[] { mia1.ASPECT_ID, mia2.ASPECT_ID };
            Guid[]                 optionalAspects = new Guid[] { mia3.ASPECT_ID };
            MediaItemQuery         query           = new MediaItemQuery(requiredAspects, optionalAspects, filter);
            CompiledMediaItemQuery compiledQuery   = CompiledMediaItemQuery.Compile(MockCore.Management, query);
            MediaItem              result          = compiledQuery.QueryMediaItem();

            //Console.WriteLine("Query result " + result.MediaItemId + ": " + string.Join(",", result.Aspects) + ": " + result);

            Assert.AreEqual(itemId, result.MediaItemId, "MediaItem ID");
            SingleMediaItemAspect value = null;

            Assert.IsTrue(MediaItemAspect.TryGetAspect(result.Aspects, mia1.Metadata, out value), "MIA1");
            Assert.AreEqual("zerozero", value.GetAttributeValue(mia1.ATTR_STRING), "MIA1 string attibute");
            Assert.IsTrue(MediaItemAspect.TryGetAspect(result.Aspects, mia2.Metadata, out value), "MIA2");
            Assert.AreEqual(11, value.GetAttributeValue(mia2.ATTR_INTEGER), "MIA2 integer attibute");
            Assert.IsTrue(MediaItemAspect.TryGetAspect(result.Aspects, mia3.Metadata, out value), "MIA3");
            Assert.AreEqual("twotwo", value.GetAttributeValue(mia3.ATTR_STRING), "MIA3 string attibute");
            Assert.AreEqual(33, value.GetAttributeValue(mia3.ATTR_INTEGER), "MIA3 integer attibute");
        }