public BaseItemDto GetBaseItemDto(BaseItem item, DtoOptions options, User user = null, BaseItem owner = null) { var dto = GetBaseItemDtoInternal(item, options, user, owner); if (item is LiveTvChannel tvChannel) { var list = new List <(BaseItemDto, LiveTvChannel)>(1) { (dto, tvChannel) }; _livetvManager().AddChannelInfo(list, options, user); } else if (item is LiveTvProgram) { var list = new List <(BaseItem, BaseItemDto)>(1) { (item, dto) }; var task = _livetvManager().AddInfoToProgramDto(list, options.Fields, user); Task.WaitAll(task); } if (item is IItemByName itemByName && options.ContainsField(ItemFields.ItemCounts)) { SetItemByNameInfo( item, dto, GetTaggedItems( itemByName, user, new DtoOptions(false) { EnableImages = false }), user); } return(dto); }
public BaseItemDto GetBaseItemDto(BaseItem item, DtoOptions options, User user = null, BaseItem owner = null) { var allCollectionFolders = _libraryManager.GetUserRootFolder().Children.OfType <Folder>().ToList(); var dto = GetBaseItemDtoInternal(item, options, allCollectionFolders, user, owner); var tvChannel = item as LiveTvChannel; if (tvChannel != null) { var list = new List <Tuple <BaseItemDto, LiveTvChannel> > { new Tuple <BaseItemDto, LiveTvChannel>(dto, tvChannel) }; _livetvManager().AddChannelInfo(list, options, user); } else if (item is LiveTvProgram) { var list = new List <Tuple <BaseItem, BaseItemDto> > { new Tuple <BaseItem, BaseItemDto>(item, dto) }; var task = _livetvManager().AddInfoToProgramDto(list, options.Fields, user); Task.WaitAll(task); } var byName = item as IItemByName; if (byName != null) { if (options.ContainsField(ItemFields.ItemCounts)) { SetItemByNameInfo(item, dto, GetTaggedItems(byName, user, new DtoOptions(false) { EnableImages = false }), user); } return(dto); } return(dto); }
protected DtoOptions GetDtoOptions(IAuthorizationContext authContext, object request) { var options = new DtoOptions(); var hasFields = request as IHasItemFields; if (hasFields != null) { options.Fields = hasFields.GetItemFields(); } if (!options.ContainsField(Model.Querying.ItemFields.RecursiveItemCount) || !options.ContainsField(Model.Querying.ItemFields.ChildCount)) { var client = authContext.GetAuthorizationInfo(Request).Client ?? string.Empty; if (client.IndexOf("kodi", StringComparison.OrdinalIgnoreCase) != -1 || client.IndexOf("wmc", StringComparison.OrdinalIgnoreCase) != -1 || client.IndexOf("media center", StringComparison.OrdinalIgnoreCase) != -1 || client.IndexOf("classic", StringComparison.OrdinalIgnoreCase) != -1) { var list = options.Fields.ToList(); list.Add(Model.Querying.ItemFields.RecursiveItemCount); options.Fields = list.ToArray(); } if (client.IndexOf("kodi", StringComparison.OrdinalIgnoreCase) != -1 || client.IndexOf("wmc", StringComparison.OrdinalIgnoreCase) != -1 || client.IndexOf("media center", StringComparison.OrdinalIgnoreCase) != -1 || client.IndexOf("classic", StringComparison.OrdinalIgnoreCase) != -1 || client.IndexOf("roku", StringComparison.OrdinalIgnoreCase) != -1 || client.IndexOf("samsung", StringComparison.OrdinalIgnoreCase) != -1 || client.IndexOf("androidtv", StringComparison.OrdinalIgnoreCase) != -1) { var list = options.Fields.ToList(); list.Add(Model.Querying.ItemFields.ChildCount); options.Fields = list.ToArray(); } } var hasDtoOptions = request as IHasDtoOptions; if (hasDtoOptions != null) { options.EnableImages = hasDtoOptions.EnableImages ?? true; if (hasDtoOptions.ImageTypeLimit.HasValue) { options.ImageTypeLimit = hasDtoOptions.ImageTypeLimit.Value; } if (hasDtoOptions.EnableUserData.HasValue) { options.EnableUserData = hasDtoOptions.EnableUserData.Value; } if (!string.IsNullOrWhiteSpace(hasDtoOptions.EnableImageTypes)) { options.ImageTypes = (hasDtoOptions.EnableImageTypes ?? string.Empty).Split(',').Where(i => !string.IsNullOrWhiteSpace(i)).Select(v => (ImageType)Enum.Parse(typeof(ImageType), v, true)).ToArray(); } } return(options); }
/// <summary> /// Sets simple property values on a DTOBaseItem /// </summary> /// <param name="dto">The dto.</param> /// <param name="item">The item.</param> /// <param name="owner">The owner.</param> /// <param name="options">The options.</param> private void AttachBasicFields(BaseItemDto dto, BaseItem item, BaseItem owner, DtoOptions options) { if (options.ContainsField(ItemFields.DateCreated)) { dto.DateCreated = item.DateCreated; } if (options.ContainsField(ItemFields.Settings)) { dto.LockedFields = item.LockedFields; dto.LockData = item.IsLocked; dto.ForcedSortName = item.ForcedSortName; } dto.Container = item.Container; dto.EndDate = item.EndDate; if (options.ContainsField(ItemFields.ExternalUrls)) { dto.ExternalUrls = _providerManager.GetExternalUrls(item).ToArray(); } if (options.ContainsField(ItemFields.Tags)) { dto.Tags = item.Tags; } var hasAspectRatio = item as IHasAspectRatio; if (hasAspectRatio != null) { dto.AspectRatio = hasAspectRatio.AspectRatio; } var backdropLimit = options.GetImageLimit(ImageType.Backdrop); if (backdropLimit > 0) { dto.BackdropImageTags = GetImageTags(item, item.GetImages(ImageType.Backdrop).Take(backdropLimit).ToList()); } if (options.ContainsField(ItemFields.ScreenshotImageTags)) { var screenshotLimit = options.GetImageLimit(ImageType.Screenshot); if (screenshotLimit > 0) { dto.ScreenshotImageTags = GetImageTags(item, item.GetImages(ImageType.Screenshot).Take(screenshotLimit).ToList()); } } if (options.ContainsField(ItemFields.Genres)) { dto.Genres = item.Genres; AttachGenreItems(dto, item); } if (options.EnableImages) { dto.ImageTags = new Dictionary <ImageType, string>(); // Prevent implicitly captured closure var currentItem = item; foreach (var image in currentItem.ImageInfos.Where(i => !currentItem.AllowsMultipleImages(i.Type)) .ToList()) { if (options.GetImageLimit(image.Type) > 0) { var tag = GetImageCacheTag(item, image); if (tag != null) { dto.ImageTags[image.Type] = tag; } } } } dto.Id = item.Id; dto.IndexNumber = item.IndexNumber; dto.ParentIndexNumber = item.ParentIndexNumber; if (item.IsFolder) { dto.IsFolder = true; } else if (item is IHasMediaSources) { dto.IsFolder = false; } dto.MediaType = item.MediaType; if (!(item is LiveTvProgram)) { dto.LocationType = item.LocationType; } dto.Audio = item.Audio; if (options.ContainsField(ItemFields.Settings)) { dto.PreferredMetadataCountryCode = item.PreferredMetadataCountryCode; dto.PreferredMetadataLanguage = item.PreferredMetadataLanguage; } dto.CriticRating = item.CriticRating; var hasDisplayOrder = item as IHasDisplayOrder; if (hasDisplayOrder != null) { dto.DisplayOrder = hasDisplayOrder.DisplayOrder; } var hasCollectionType = item as IHasCollectionType; if (hasCollectionType != null) { dto.CollectionType = hasCollectionType.CollectionType; } if (options.ContainsField(ItemFields.RemoteTrailers)) { dto.RemoteTrailers = item.RemoteTrailers; } dto.Name = item.Name; dto.OfficialRating = item.OfficialRating; if (options.ContainsField(ItemFields.Overview)) { dto.Overview = item.Overview; } if (options.ContainsField(ItemFields.OriginalTitle)) { dto.OriginalTitle = item.OriginalTitle; } if (options.ContainsField(ItemFields.ParentId)) { dto.ParentId = item.DisplayParentId; } AddInheritedImages(dto, item, options, owner); if (options.ContainsField(ItemFields.Path)) { dto.Path = GetMappedPath(item, owner); } if (options.ContainsField(ItemFields.EnableMediaSourceDisplay)) { dto.EnableMediaSourceDisplay = item.EnableMediaSourceDisplay; } dto.PremiereDate = item.PremiereDate; dto.ProductionYear = item.ProductionYear; if (options.ContainsField(ItemFields.ProviderIds)) { dto.ProviderIds = item.ProviderIds; } dto.RunTimeTicks = item.RunTimeTicks; if (options.ContainsField(ItemFields.SortName)) { dto.SortName = item.SortName; } if (options.ContainsField(ItemFields.CustomRating)) { dto.CustomRating = item.CustomRating; } if (options.ContainsField(ItemFields.Taglines)) { if (!string.IsNullOrEmpty(item.Tagline)) { dto.Taglines = new string[] { item.Tagline }; } if (dto.Taglines == null) { dto.Taglines = Array.Empty <string>(); } } dto.Type = item.GetClientTypeName(); if ((item.CommunityRating ?? 0) > 0) { dto.CommunityRating = item.CommunityRating; } var supportsPlaceHolders = item as ISupportsPlaceHolders; if (supportsPlaceHolders != null && supportsPlaceHolders.IsPlaceHolder) { dto.IsPlaceHolder = supportsPlaceHolders.IsPlaceHolder; } // Add audio info var audio = item as Audio; if (audio != null) { dto.Album = audio.Album; if (audio.ExtraType.HasValue) { dto.ExtraType = audio.ExtraType.Value.ToString(); } var albumParent = audio.AlbumEntity; if (albumParent != null) { dto.AlbumId = albumParent.Id; dto.AlbumPrimaryImageTag = GetImageCacheTag(albumParent, ImageType.Primary); } //if (options.ContainsField(ItemFields.MediaSourceCount)) //{ // Songs always have one //} } var hasArtist = item as IHasArtist; if (hasArtist != null) { dto.Artists = hasArtist.Artists; //var artistItems = _libraryManager.GetArtists(new InternalItemsQuery //{ // EnableTotalRecordCount = false, // ItemIds = new[] { item.Id.ToString("N") } //}); //dto.ArtistItems = artistItems.Items // .Select(i => // { // var artist = i.Item1; // return new NameIdPair // { // Name = artist.Name, // Id = artist.Id.ToString("N") // }; // }) // .ToList(); // Include artists that are not in the database yet, e.g., just added via metadata editor //var foundArtists = artistItems.Items.Select(i => i.Item1.Name).ToList(); dto.ArtistItems = hasArtist.Artists //.Except(foundArtists, new DistinctNameComparer()) .Select(i => { // This should not be necessary but we're seeing some cases of it if (string.IsNullOrEmpty(i)) { return(null); } var artist = _libraryManager.GetArtist(i, new DtoOptions(false) { EnableImages = false }); if (artist != null) { return(new NameGuidPair { Name = artist.Name, Id = artist.Id }); } return(null); }).Where(i => i != null).ToArray(); } var hasAlbumArtist = item as IHasAlbumArtist; if (hasAlbumArtist != null) { dto.AlbumArtist = hasAlbumArtist.AlbumArtists.FirstOrDefault(); //var artistItems = _libraryManager.GetAlbumArtists(new InternalItemsQuery //{ // EnableTotalRecordCount = false, // ItemIds = new[] { item.Id.ToString("N") } //}); //dto.AlbumArtists = artistItems.Items // .Select(i => // { // var artist = i.Item1; // return new NameIdPair // { // Name = artist.Name, // Id = artist.Id.ToString("N") // }; // }) // .ToList(); dto.AlbumArtists = hasAlbumArtist.AlbumArtists //.Except(foundArtists, new DistinctNameComparer()) .Select(i => { // This should not be necessary but we're seeing some cases of it if (string.IsNullOrEmpty(i)) { return(null); } var artist = _libraryManager.GetArtist(i, new DtoOptions(false) { EnableImages = false }); if (artist != null) { return(new NameGuidPair { Name = artist.Name, Id = artist.Id }); } return(null); }).Where(i => i != null).ToArray(); } // Add video info var video = item as Video; if (video != null) { dto.VideoType = video.VideoType; dto.Video3DFormat = video.Video3DFormat; dto.IsoType = video.IsoType; if (video.HasSubtitles) { dto.HasSubtitles = video.HasSubtitles; } if (video.AdditionalParts.Length != 0) { dto.PartCount = video.AdditionalParts.Length + 1; } if (options.ContainsField(ItemFields.MediaSourceCount)) { var mediaSourceCount = video.MediaSourceCount; if (mediaSourceCount != 1) { dto.MediaSourceCount = mediaSourceCount; } } if (options.ContainsField(ItemFields.Chapters)) { dto.Chapters = _itemRepo.GetChapters(item); } if (video.ExtraType.HasValue) { dto.ExtraType = video.ExtraType.Value.ToString(); } } if (options.ContainsField(ItemFields.MediaStreams)) { // Add VideoInfo var iHasMediaSources = item as IHasMediaSources; if (iHasMediaSources != null) { MediaStream[] mediaStreams; if (dto.MediaSources != null && dto.MediaSources.Length > 0) { if (item.SourceType == SourceType.Channel) { mediaStreams = dto.MediaSources[0].MediaStreams.ToArray(); } else { mediaStreams = dto.MediaSources.Where(i => string.Equals(i.Id, item.Id.ToString("N"), StringComparison.OrdinalIgnoreCase)) .SelectMany(i => i.MediaStreams) .ToArray(); } } else { mediaStreams = _mediaSourceManager().GetStaticMediaSources(item, true).First().MediaStreams.ToArray(); } dto.MediaStreams = mediaStreams; } } BaseItem[] allExtras = null; if (options.ContainsField(ItemFields.SpecialFeatureCount)) { if (allExtras == null) { allExtras = item.GetExtras().ToArray(); } dto.SpecialFeatureCount = allExtras.Count(i => i.ExtraType.HasValue && BaseItem.DisplayExtraTypes.Contains(i.ExtraType.Value)); } if (options.ContainsField(ItemFields.LocalTrailerCount)) { if (allExtras == null) { allExtras = item.GetExtras().ToArray(); } dto.LocalTrailerCount = allExtras.Count(i => i.ExtraType.HasValue && i.ExtraType.Value == ExtraType.Trailer); } // Add EpisodeInfo var episode = item as Episode; if (episode != null) { dto.IndexNumberEnd = episode.IndexNumberEnd; dto.SeriesName = episode.SeriesName; if (options.ContainsField(ItemFields.SpecialEpisodeNumbers)) { dto.AirsAfterSeasonNumber = episode.AirsAfterSeasonNumber; dto.AirsBeforeEpisodeNumber = episode.AirsBeforeEpisodeNumber; dto.AirsBeforeSeasonNumber = episode.AirsBeforeSeasonNumber; } dto.SeasonName = episode.SeasonName; dto.SeasonId = episode.SeasonId; dto.SeriesId = episode.SeriesId; Series episodeSeries = null; //if (options.ContainsField(ItemFields.SeriesPrimaryImage)) { episodeSeries = episodeSeries ?? episode.Series; if (episodeSeries != null) { dto.SeriesPrimaryImageTag = GetImageCacheTag(episodeSeries, ImageType.Primary); } } if (options.ContainsField(ItemFields.SeriesStudio)) { episodeSeries = episodeSeries ?? episode.Series; if (episodeSeries != null) { dto.SeriesStudio = episodeSeries.Studios.FirstOrDefault(); } } } // Add SeriesInfo var series = item as Series; if (series != null) { dto.AirDays = series.AirDays; dto.AirTime = series.AirTime; dto.Status = series.Status.HasValue ? series.Status.Value.ToString() : null; } // Add SeasonInfo var season = item as Season; if (season != null) { dto.SeriesName = season.SeriesName; dto.SeriesId = season.SeriesId; series = null; if (options.ContainsField(ItemFields.SeriesStudio)) { series = series ?? season.Series; if (series != null) { dto.SeriesStudio = series.Studios.FirstOrDefault(); } } //if (options.ContainsField(ItemFields.SeriesPrimaryImage)) { series = series ?? season.Series; if (series != null) { dto.SeriesPrimaryImageTag = GetImageCacheTag(series, ImageType.Primary); } } } var musicVideo = item as MusicVideo; if (musicVideo != null) { SetMusicVideoProperties(dto, musicVideo); } var book = item as Book; if (book != null) { SetBookProperties(dto, book); } if (options.ContainsField(ItemFields.ProductionLocations)) { if (item.ProductionLocations.Length > 0 || item is Movie) { dto.ProductionLocations = item.ProductionLocations; } } if (options.ContainsField(ItemFields.Width)) { var width = item.Width; if (width > 0) { dto.Width = width; } } if (options.ContainsField(ItemFields.Height)) { var height = item.Height; if (height > 0) { dto.Height = height; } } if (options.ContainsField(ItemFields.IsHD)) { // Compatibility if (item.IsHD) { dto.IsHD = true; } } var photo = item as Photo; if (photo != null) { SetPhotoProperties(dto, photo); } dto.ChannelId = item.ChannelId; if (item.SourceType == SourceType.Channel) { var channel = _libraryManager.GetItemById(item.ChannelId); if (channel != null) { dto.ChannelName = channel.Name; } } }
private BaseItemDto GetBaseItemDtoInternal(BaseItem item, DtoOptions options, List <Folder> allCollectionFolders, User user = null, BaseItem owner = null) { var dto = new BaseItemDto { ServerId = _appHost.SystemId }; if (item.SourceType == SourceType.Channel) { dto.SourceType = item.SourceType.ToString(); } if (options.ContainsField(ItemFields.People)) { AttachPeople(dto, item); } if (options.ContainsField(ItemFields.PrimaryImageAspectRatio)) { try { AttachPrimaryImageAspectRatio(dto, item); } catch (Exception ex) { // Have to use a catch-all unfortunately because some .net image methods throw plain Exceptions _logger.LogError(ex, "Error generating PrimaryImageAspectRatio for {itemName}", item.Name); } } if (options.ContainsField(ItemFields.DisplayPreferencesId)) { dto.DisplayPreferencesId = item.DisplayPreferencesId.ToString("N"); } if (user != null) { AttachUserSpecificInfo(dto, item, user, options); } var hasMediaSources = item as IHasMediaSources; if (hasMediaSources != null) { if (options.ContainsField(ItemFields.MediaSources)) { dto.MediaSources = _mediaSourceManager().GetStaticMediaSources(item, true, user).ToArray(); NormalizeMediaSourceContainers(dto); } } if (options.ContainsField(ItemFields.Studios)) { AttachStudios(dto, item); } AttachBasicFields(dto, item, owner, options); if (options.ContainsField(ItemFields.CanDelete)) { dto.CanDelete = user == null ? item.CanDelete() : item.CanDelete(user); } if (options.ContainsField(ItemFields.CanDownload)) { dto.CanDownload = user == null ? item.CanDownload() : item.CanDownload(user); } if (options.ContainsField(ItemFields.Etag)) { dto.Etag = item.GetEtag(user); } var liveTvManager = _livetvManager(); var activeRecording = liveTvManager.GetActiveRecordingInfo(item.Path); if (activeRecording != null) { dto.Type = "Recording"; dto.CanDownload = false; dto.RunTimeTicks = null; if (!string.IsNullOrEmpty(dto.SeriesName)) { dto.EpisodeTitle = dto.Name; dto.Name = dto.SeriesName; } liveTvManager.AddInfoToRecordingDto(item, dto, activeRecording, user); } return(dto); }
protected DtoOptions GetDtoOptions(IAuthorizationContext authContext, object request) { var options = new DtoOptions(); if (request is IHasItemFields hasFields) { options.Fields = hasFields.GetItemFields(); } if (!options.ContainsField(Model.Querying.ItemFields.RecursiveItemCount) || !options.ContainsField(Model.Querying.ItemFields.ChildCount)) { var client = authContext.GetAuthorizationInfo(Request).Client ?? string.Empty; if (client.IndexOf("kodi", StringComparison.OrdinalIgnoreCase) != -1 || client.IndexOf("wmc", StringComparison.OrdinalIgnoreCase) != -1 || client.IndexOf("media center", StringComparison.OrdinalIgnoreCase) != -1 || client.IndexOf("classic", StringComparison.OrdinalIgnoreCase) != -1) { int oldLen = options.Fields.Length; var arr = new ItemFields[oldLen + 1]; options.Fields.CopyTo(arr, 0); arr[oldLen] = Model.Querying.ItemFields.RecursiveItemCount; options.Fields = arr; } if (client.IndexOf("kodi", StringComparison.OrdinalIgnoreCase) != -1 || client.IndexOf("wmc", StringComparison.OrdinalIgnoreCase) != -1 || client.IndexOf("media center", StringComparison.OrdinalIgnoreCase) != -1 || client.IndexOf("classic", StringComparison.OrdinalIgnoreCase) != -1 || client.IndexOf("roku", StringComparison.OrdinalIgnoreCase) != -1 || client.IndexOf("samsung", StringComparison.OrdinalIgnoreCase) != -1 || client.IndexOf("androidtv", StringComparison.OrdinalIgnoreCase) != -1) { int oldLen = options.Fields.Length; var arr = new ItemFields[oldLen + 1]; options.Fields.CopyTo(arr, 0); arr[oldLen] = Model.Querying.ItemFields.ChildCount; options.Fields = arr; } } if (request is IHasDtoOptions hasDtoOptions) { options.EnableImages = hasDtoOptions.EnableImages ?? true; if (hasDtoOptions.ImageTypeLimit.HasValue) { options.ImageTypeLimit = hasDtoOptions.ImageTypeLimit.Value; } if (hasDtoOptions.EnableUserData.HasValue) { options.EnableUserData = hasDtoOptions.EnableUserData.Value; } if (!string.IsNullOrWhiteSpace(hasDtoOptions.EnableImageTypes)) { options.ImageTypes = hasDtoOptions.EnableImageTypes.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries) .Select(v => (ImageType)Enum.Parse(typeof(ImageType), v, true)) .ToArray(); } } return(options); }