private Task<QueryResult<BaseItem>> GetChildrenSorted(BaseItem item, User user, SearchCriteria search, SortCriteria sort, int? startIndex, int? limit) { var folder = (Folder)item; var sortOrders = new List<string>(); if (!folder.IsPreSorted) { sortOrders.Add(ItemSortBy.SortName); } var mediaTypes = new List<string>(); bool? isFolder = null; if (search.SearchType == SearchType.Audio) { mediaTypes.Add(MediaType.Audio); isFolder = false; } else if (search.SearchType == SearchType.Video) { mediaTypes.Add(MediaType.Video); isFolder = false; } else if (search.SearchType == SearchType.Image) { mediaTypes.Add(MediaType.Photo); isFolder = false; } else if (search.SearchType == SearchType.Playlist) { //items = items.OfType<Playlist>(); isFolder = true; } else if (search.SearchType == SearchType.MusicAlbum) { //items = items.OfType<MusicAlbum>(); isFolder = true; } return folder.GetItems(new InternalItemsQuery { Limit = limit, StartIndex = startIndex, SortBy = sortOrders.ToArray(), SortOrder = sort.SortOrder, User = user, Recursive = true, Filter = FilterUnsupportedContent, IsFolder = isFolder, MediaTypes = mediaTypes.ToArray() }); }
private async Task<IEnumerable<KeyValuePair<string, string>>> HandleSearch(Headers sparams, User user, string deviceId) { var searchCriteria = new SearchCriteria(sparams.GetValueOrDefault("SearchCriteria", "")); var sortCriteria = new SortCriteria(sparams.GetValueOrDefault("SortCriteria", "")); var filter = new Filter(sparams.GetValueOrDefault("Filter", "*")); // sort example: dc:title, dc:date // Default to null instead of 0 // Upnp inspector sends 0 as requestedCount when it wants everything int? requestedCount = null; int? start = 0; int requestedVal; if (sparams.ContainsKey("RequestedCount") && int.TryParse(sparams["RequestedCount"], out requestedVal) && requestedVal > 0) { requestedCount = requestedVal; } int startVal; if (sparams.ContainsKey("StartingIndex") && int.TryParse(sparams["StartingIndex"], out startVal) && startVal > 0) { start = startVal; } //var root = GetItem(id) as IMediaFolder; var result = new XmlDocument(); var didl = result.CreateElement(string.Empty, "DIDL-Lite", NS_DIDL); didl.SetAttribute("xmlns:dc", NS_DC); didl.SetAttribute("xmlns:dlna", NS_DLNA); didl.SetAttribute("xmlns:upnp", NS_UPNP); foreach (var att in _profile.XmlRootAttributes) { didl.SetAttribute(att.Name, att.Value); } result.AppendChild(didl); var serverItem = GetItemFromObjectId(sparams["ContainerID"], user); var item = serverItem.Item; var childrenResult = (await GetChildrenSorted(item, user, searchCriteria, sortCriteria, start, requestedCount).ConfigureAwait(false)); var totalCount = childrenResult.TotalRecordCount; var provided = childrenResult.Items.Length; foreach (var i in childrenResult.Items) { if (i.IsFolder) { var childCount = (await GetChildrenSorted(i, user, searchCriteria, sortCriteria, null, 0).ConfigureAwait(false)) .TotalRecordCount; result.DocumentElement.AppendChild(_didlBuilder.GetFolderElement(result, i, null, item, childCount, filter)); } else { result.DocumentElement.AppendChild(_didlBuilder.GetItemElement(result, i, item, serverItem.StubType, deviceId, filter)); } } var resXML = result.OuterXml; return new List<KeyValuePair<string, string>> { new KeyValuePair<string,string>("Result", resXML), new KeyValuePair<string,string>("NumberReturned", provided.ToString(_usCulture)), new KeyValuePair<string,string>("TotalMatches", totalCount.ToString(_usCulture)), new KeyValuePair<string,string>("UpdateID", _systemUpdateId.ToString(_usCulture)) }; }
private IEnumerable<KeyValuePair<string, string>> HandleSearch(Headers sparams, User user, string deviceId) { var searchCriteria = new SearchCriteria(sparams.GetValueOrDefault("SearchCriteria", "")); var sortCriteria = new SortCriteria(sparams.GetValueOrDefault("SortCriteria", "")); var filter = new Filter(sparams.GetValueOrDefault("Filter", "*")); // sort example: dc:title, dc:date var provided = 0; var requested = 0; var start = 0; if (sparams.ContainsKey("RequestedCount") && int.TryParse(sparams["RequestedCount"], out requested) && requested <= 0) { requested = 0; } if (sparams.ContainsKey("StartingIndex") && int.TryParse(sparams["StartingIndex"], out start) && start <= 0) { start = 0; } //var root = GetItem(id) as IMediaFolder; var result = new XmlDocument(); var didl = result.CreateElement(string.Empty, "DIDL-Lite", NS_DIDL); didl.SetAttribute("xmlns:dc", NS_DC); didl.SetAttribute("xmlns:dlna", NS_DLNA); didl.SetAttribute("xmlns:upnp", NS_UPNP); didl.SetAttribute("xmlns:sec", NS_SEC); result.AppendChild(didl); var folder = (Folder)GetItemFromObjectId(sparams["ContainerID"], user); var children = GetChildrenSorted(folder, user, searchCriteria, sortCriteria).ToList(); var totalCount = children.Count; if (start > 0) { children = children.Skip(start).ToList(); } if (requested > 0) { children = children.Take(requested).ToList(); } provided = children.Count; foreach (var i in children) { if (i.IsFolder) { var f = (Folder)i; var childCount = GetChildrenSorted(f, user, searchCriteria, sortCriteria).Count(); Browse_AddFolder(result, f, childCount, filter); } else { Browse_AddItem(result, i, user, deviceId, filter); } } var resXML = result.OuterXml; return new List<KeyValuePair<string, string>> { new KeyValuePair<string,string>("Result", resXML), new KeyValuePair<string,string>("NumberReturned", provided.ToString(_usCulture)), new KeyValuePair<string,string>("TotalMatches", totalCount.ToString(_usCulture)), new KeyValuePair<string,string>("UpdateID", _systemUpdateId.ToString(_usCulture)) }; }
private IEnumerable<BaseItem> GetChildrenSorted(Folder folder, User user, SearchCriteria search, SortCriteria sort) { if (search.SearchType == SearchType.Unknown) { return GetChildrenSorted(folder, user, sort); } var items = folder.GetRecursiveChildren(user); items = FilterUnsupportedContent(items); if (search.SearchType == SearchType.Audio) { items = items.OfType<Audio>(); } else if (search.SearchType == SearchType.Video) { items = items.OfType<Video>(); } else if (search.SearchType == SearchType.Image) { items = items.OfType<Photo>(); } else if (search.SearchType == SearchType.Playlist) { } return SortItems(items, user, sort); }
private async Task<QueryResult<BaseItem>> GetChildrenSorted(Folder folder, User user, SearchCriteria search, SortCriteria sort, int? startIndex, int? limit) { if (search.SearchType == SearchType.Unknown) { return await GetChildrenSorted(folder, user, sort, startIndex, limit).ConfigureAwait(false); } var result = await GetChildrenSorted(folder, user, sort, null, null).ConfigureAwait(false); var items = FilterUnsupportedContent(result.Items); if (search.SearchType == SearchType.Audio) { items = items.OfType<Audio>(); } else if (search.SearchType == SearchType.Video) { items = items.OfType<Video>(); } else if (search.SearchType == SearchType.Image) { items = items.OfType<Photo>(); } else if (search.SearchType == SearchType.Playlist) { items = items.OfType<Playlist>(); } items = SortItems(items, user, sort); return ToResult(items, startIndex, limit); }