diff options
Diffstat (limited to 'MediaBrowser.Server.Implementations/Dto/DtoService.cs')
| -rw-r--r-- | MediaBrowser.Server.Implementations/Dto/DtoService.cs | 103 |
1 files changed, 63 insertions, 40 deletions
diff --git a/MediaBrowser.Server.Implementations/Dto/DtoService.cs b/MediaBrowser.Server.Implementations/Dto/DtoService.cs index 5853b5b75..f9dfb1350 100644 --- a/MediaBrowser.Server.Implementations/Dto/DtoService.cs +++ b/MediaBrowser.Server.Implementations/Dto/DtoService.cs @@ -87,13 +87,14 @@ namespace MediaBrowser.Server.Implementations.Dto public IEnumerable<BaseItemDto> GetBaseItemDtos(IEnumerable<BaseItem> items, DtoOptions options, User user = null, BaseItem owner = null) { - var tuple = GetItemIdsWithSyncJobs(options); + var syncJobItems = GetSyncedItemProgress(options); + var syncDictionary = syncJobItems.ToDictionary(i => i.ItemId); var list = new List<BaseItemDto>(); foreach (var item in items) { - var dto = GetBaseItemDtoInternal(item, options, user, owner); + var dto = GetBaseItemDtoInternal(item, options, syncDictionary, user, owner); var byName = item as IItemByName; @@ -111,7 +112,7 @@ namespace MediaBrowser.Server.Implementations.Dto } } - FillSyncInfo(dto, item, tuple.Item1, tuple.Item2, options, user); + FillSyncInfo(dto, item, syncJobItems, options, user); list.Add(dto); } @@ -121,7 +122,9 @@ namespace MediaBrowser.Server.Implementations.Dto public BaseItemDto GetBaseItemDto(BaseItem item, DtoOptions options, User user = null, BaseItem owner = null) { - var dto = GetBaseItemDtoInternal(item, options, user, owner); + var syncProgress = GetSyncedItemProgress(options); + + var dto = GetBaseItemDtoInternal(item, options, syncProgress.ToDictionary(i => i.ItemId), user, owner); var byName = item as IItemByName; @@ -138,35 +141,35 @@ namespace MediaBrowser.Server.Implementations.Dto SetItemByNameInfo(item, dto, libraryItems.ToList(), user); } - FillSyncInfo(dto, item, options, user); + FillSyncInfo(dto, item, options, user, syncProgress); return dto; } - FillSyncInfo(dto, item, options, user); + FillSyncInfo(dto, item, options, user, syncProgress); return dto; } - private Tuple<IEnumerable<string>, IEnumerable<string>> GetItemIdsWithSyncJobs(DtoOptions options) + private SyncedItemProgress[] GetSyncedItemProgress(DtoOptions options) { if (!options.Fields.Contains(ItemFields.SyncInfo)) { - return new Tuple<IEnumerable<string>, IEnumerable<string>>(new List<string>(), new List<string>()); + return new SyncedItemProgress[]{}; } var deviceId = options.DeviceId; if (string.IsNullOrWhiteSpace(deviceId)) { - return new Tuple<IEnumerable<string>, IEnumerable<string>>(new List<string>(), new List<string>()); + return new SyncedItemProgress[] { }; } var caps = _deviceManager().GetCapabilities(deviceId); if (caps == null || !caps.SupportsSync) { - return new Tuple<IEnumerable<string>, IEnumerable<string>>(new List<string>(), new List<string>()); + return new SyncedItemProgress[] { }; } - var result1 = _syncManager.GetLibraryItemIds(new SyncJobItemQuery + return _syncManager.GetSyncedItemProgresses(new SyncJobItemQuery { TargetId = deviceId, Statuses = new[] @@ -174,38 +177,28 @@ namespace MediaBrowser.Server.Implementations.Dto SyncJobItemStatus.Converting, SyncJobItemStatus.Queued, SyncJobItemStatus.Transferring, - SyncJobItemStatus.ReadyToTransfer - } - }); - - var result2 = _syncManager.GetLibraryItemIds(new SyncJobItemQuery - { - TargetId = deviceId, - Statuses = new[] - { + SyncJobItemStatus.ReadyToTransfer, SyncJobItemStatus.Synced } - }); - - return new Tuple<IEnumerable<string>, IEnumerable<string>>(result1.Items, result2.Items); + }).Items; } public void FillSyncInfo(IEnumerable<IHasSyncInfo> dtos, DtoOptions options, User user) { if (options.Fields.Contains(ItemFields.SyncInfo)) { - var tuple = GetItemIdsWithSyncJobs(options); + var syncProgress = GetSyncedItemProgress(options); foreach (var dto in dtos) { var item = _libraryManager.GetItemById(dto.Id); - FillSyncInfo(dto, item, tuple.Item1, tuple.Item2, options, user); + FillSyncInfo(dto, item, syncProgress, options, user); } } } - private void FillSyncInfo(IHasSyncInfo dto, BaseItem item, DtoOptions options, User user) + private void FillSyncInfo(IHasSyncInfo dto, BaseItem item, DtoOptions options, User user, SyncedItemProgress[] syncProgress) { if (options.Fields.Contains(ItemFields.SyncInfo)) { @@ -215,10 +208,8 @@ namespace MediaBrowser.Server.Implementations.Dto if (dto.SupportsSync ?? false) { - var tuple = GetItemIdsWithSyncJobs(options); - - dto.HasSyncJob = tuple.Item1.Contains(dto.Id, StringComparer.OrdinalIgnoreCase); - dto.IsSynced = tuple.Item2.Contains(dto.Id, StringComparer.OrdinalIgnoreCase); + dto.HasSyncJob = syncProgress.Any(i => i.Status != SyncJobItemStatus.Synced && string.Equals(i.ItemId, dto.Id, StringComparison.OrdinalIgnoreCase)); + dto.IsSynced = syncProgress.Any(i => i.Status == SyncJobItemStatus.Synced && string.Equals(i.ItemId, dto.Id, StringComparison.OrdinalIgnoreCase)); if (dto.IsSynced.Value) { @@ -232,7 +223,7 @@ namespace MediaBrowser.Server.Implementations.Dto } } - private void FillSyncInfo(IHasSyncInfo dto, BaseItem item, IEnumerable<string> itemIdsWithPendingSyncJobs, IEnumerable<string> syncedItemIds, DtoOptions options, User user) + private void FillSyncInfo(IHasSyncInfo dto, BaseItem item, SyncedItemProgress[] syncProgress, DtoOptions options, User user) { if (options.Fields.Contains(ItemFields.SyncInfo)) { @@ -242,8 +233,8 @@ namespace MediaBrowser.Server.Implementations.Dto if (dto.SupportsSync ?? false) { - dto.HasSyncJob = itemIdsWithPendingSyncJobs.Contains(dto.Id, StringComparer.OrdinalIgnoreCase); - dto.IsSynced = syncedItemIds.Contains(dto.Id, StringComparer.OrdinalIgnoreCase); + dto.HasSyncJob = syncProgress.Any(i => i.Status != SyncJobItemStatus.Synced && string.Equals(i.ItemId, dto.Id, StringComparison.OrdinalIgnoreCase)); + dto.IsSynced = syncProgress.Any(i => i.Status == SyncJobItemStatus.Synced && string.Equals(i.ItemId, dto.Id, StringComparison.OrdinalIgnoreCase)); if (dto.IsSynced.Value) { @@ -257,7 +248,7 @@ namespace MediaBrowser.Server.Implementations.Dto } } - private BaseItemDto GetBaseItemDtoInternal(BaseItem item, DtoOptions options, User user = null, BaseItem owner = null) + private BaseItemDto GetBaseItemDtoInternal(BaseItem item, DtoOptions options, Dictionary<string,SyncedItemProgress> syncProgress, User user = null, BaseItem owner = null) { var fields = options.Fields; @@ -301,7 +292,7 @@ namespace MediaBrowser.Server.Implementations.Dto if (user != null) { - AttachUserSpecificInfo(dto, item, user, fields); + AttachUserSpecificInfo(dto, item, user, fields, syncProgress); } var hasMediaSources = item as IHasMediaSources; @@ -368,14 +359,16 @@ namespace MediaBrowser.Server.Implementations.Dto public BaseItemDto GetItemByNameDto<T>(T item, DtoOptions options, List<BaseItem> taggedItems, User user = null) where T : BaseItem, IItemByName { - var dto = GetBaseItemDtoInternal(item, options, user); + var syncProgress = GetSyncedItemProgress(options); + + var dto = GetBaseItemDtoInternal(item, options, syncProgress.ToDictionary(i => i.ItemId), user); if (options.Fields.Contains(ItemFields.ItemCounts)) { SetItemByNameInfo(item, dto, taggedItems, user); } - FillSyncInfo(dto, item, options, user); + FillSyncInfo(dto, item, options, user, syncProgress); return dto; } @@ -415,7 +408,8 @@ namespace MediaBrowser.Server.Implementations.Dto /// <param name="item">The item.</param> /// <param name="user">The user.</param> /// <param name="fields">The fields.</param> - private void AttachUserSpecificInfo(BaseItemDto dto, BaseItem item, User user, List<ItemFields> fields) + /// <param name="syncProgress">The synchronize progress.</param> + private void AttachUserSpecificInfo(BaseItemDto dto, BaseItem item, User user, List<ItemFields> fields, Dictionary<string, SyncedItemProgress> syncProgress) { if (item.IsFolder) { @@ -433,7 +427,7 @@ namespace MediaBrowser.Server.Implementations.Dto // TODO: Disable for CollectionFolder if (!(folder is UserRootFolder) && !(folder is UserView)) { - SetSpecialCounts(folder, user, dto, fields); + SetSpecialCounts(folder, user, dto, fields, syncProgress); } dto.UserData.Played = dto.UserData.PlayedPercentage.HasValue && dto.UserData.PlayedPercentage.Value >= 100; @@ -1599,8 +1593,9 @@ namespace MediaBrowser.Server.Implementations.Dto /// <param name="user">The user.</param> /// <param name="dto">The dto.</param> /// <param name="fields">The fields.</param> + /// <param name="syncProgress">The synchronize progress.</param> /// <returns>Task.</returns> - private void SetSpecialCounts(Folder folder, User user, BaseItemDto dto, List<ItemFields> fields) + private void SetSpecialCounts(Folder folder, User user, BaseItemDto dto, List<ItemFields> fields, Dictionary<string,SyncedItemProgress> syncProgress) { var recursiveItemCount = 0; var unplayed = 0; @@ -1608,6 +1603,8 @@ namespace MediaBrowser.Server.Implementations.Dto DateTime? dateLastMediaAdded = null; double totalPercentPlayed = 0; + double totalSyncPercent = 0; + var addSyncInfo = fields.Contains(ItemFields.SyncInfo); IEnumerable<BaseItem> children; @@ -1666,6 +1663,27 @@ namespace MediaBrowser.Server.Implementations.Dto } runtime += child.RunTimeTicks ?? 0; + + if (addSyncInfo) + { + double percent = 0; + SyncedItemProgress syncItemProgress; + if (syncProgress.TryGetValue(dto.Id, out syncItemProgress)) + { + switch (syncItemProgress.Status) + { + case SyncJobItemStatus.Synced: + percent = 100; + break; + case SyncJobItemStatus.Converting: + case SyncJobItemStatus.ReadyToTransfer: + case SyncJobItemStatus.Transferring: + percent = 50; + break; + } + } + totalSyncPercent += percent; + } } dto.RecursiveItemCount = recursiveItemCount; @@ -1674,6 +1692,11 @@ namespace MediaBrowser.Server.Implementations.Dto if (recursiveItemCount > 0) { dto.UserData.PlayedPercentage = totalPercentPlayed / recursiveItemCount; + + if (addSyncInfo) + { + dto.SyncPercent = totalSyncPercent / recursiveItemCount; + } } if (runtime > 0 && fields.Contains(ItemFields.CumulativeRunTimeTicks)) |
