/// <summary> /// Searches for a media of type <typeparamref name="TMedia"/>. /// </summary> /// <typeparam name="TMedia"> /// The type of media items to search. /// </typeparam> /// <returns> /// A list of found media items of type <typeparamref name="TMedia"/>. /// </returns> /// <exception cref="MediaServerException"> /// An error occurred when receiving result from media server. /// </exception> public async Task <IEnumerable <TMedia> > SearchAsync <TMedia>() where TMedia : MediaItem { var objectClass = MediaObject.GetClass <TMedia>(); try { await this.EnsureSearchCapabilitesReceivedAsync(); var searchCriteria = "upnp:class derivedfrom \"{0}\"".F(objectClass); var searchResult = await this.contentDirectoryService.SearchAsync("0", searchCriteria, "*", 0, 0, string.Empty); // TODO: Optimize it return(searchResult.Result.Select(o => (TMedia)o).GroupBy(m => m.Title).Select(g => g.FirstOrDefault())); } catch (FormatException ex) { throw new MediaServerException(this, MediaServerError.UnexpectedError, "Received result is in a bad format", ex); } catch (UPnPServiceException ex) { throw new MediaServerException(this, ex.ErrorCode.ToMediaServerError(), "An error occurred when searching for items of '{0}' class".F(objectClass), ex); } }