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); }
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(); }
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>(); } }
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 }
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"); }
//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); }
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); }
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(); }
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)); }
/// <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(); } }
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); }
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); }
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; }
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; }
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); }
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]); }
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)); }
/// <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(); } }
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); }
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]; }
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(); }
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"); }
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); } }
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)); }
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); }
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); }
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>()); }
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)); }
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"); }