Ejemplo n.º 1
0
        /// <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);
            }
        }