aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Server.Implementations/Dto/DtoService.cs
diff options
context:
space:
mode:
Diffstat (limited to 'MediaBrowser.Server.Implementations/Dto/DtoService.cs')
-rw-r--r--MediaBrowser.Server.Implementations/Dto/DtoService.cs296
1 files changed, 96 insertions, 200 deletions
diff --git a/MediaBrowser.Server.Implementations/Dto/DtoService.cs b/MediaBrowser.Server.Implementations/Dto/DtoService.cs
index 616625bc9..be68162ca 100644
--- a/MediaBrowser.Server.Implementations/Dto/DtoService.cs
+++ b/MediaBrowser.Server.Implementations/Dto/DtoService.cs
@@ -11,7 +11,6 @@ using MediaBrowser.Controller.Entities.TV;
using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.LiveTv;
using MediaBrowser.Controller.Persistence;
-using MediaBrowser.Controller.Playlists;
using MediaBrowser.Controller.Providers;
using MediaBrowser.Controller.Sync;
using MediaBrowser.Model.Drawing;
@@ -98,16 +97,15 @@ namespace MediaBrowser.Server.Implementations.Dto
throw new ArgumentNullException("options");
}
- var syncJobItems = GetSyncedItemProgress(options);
- var syncDictionary = GetSyncedItemProgressDictionary(syncJobItems);
+ var syncDictionary = GetSyncedItemProgress(options);
var list = new List<BaseItemDto>();
- var programTuples = new List<Tuple<BaseItem, BaseItemDto>> { };
- var channelTuples = new List<Tuple<BaseItemDto, LiveTvChannel>> { };
+ var programTuples = new List<Tuple<BaseItem, BaseItemDto>>();
+ var channelTuples = new List<Tuple<BaseItemDto, LiveTvChannel>>();
foreach (var item in items)
{
- var dto = await GetBaseItemDtoInternal(item, options, syncDictionary, user, owner).ConfigureAwait(false);
+ var dto = await GetBaseItemDtoInternal(item, options, user, owner).ConfigureAwait(false);
var tvChannel = item as LiveTvChannel;
if (tvChannel != null)
@@ -134,7 +132,7 @@ namespace MediaBrowser.Server.Implementations.Dto
}
}
- FillSyncInfo(dto, item, syncJobItems, options, user);
+ FillSyncInfo(dto, item, options, user, syncDictionary);
list.Add(dto);
}
@@ -152,23 +150,11 @@ namespace MediaBrowser.Server.Implementations.Dto
return list;
}
- private Dictionary<string, SyncedItemProgress> GetSyncedItemProgressDictionary(IEnumerable<SyncedItemProgress> items)
- {
- var dict = new Dictionary<string, SyncedItemProgress>();
-
- foreach (var item in items)
- {
- dict[item.ItemId] = item;
- }
-
- return dict;
- }
-
public BaseItemDto GetBaseItemDto(BaseItem item, DtoOptions options, User user = null, BaseItem owner = null)
{
- var syncProgress = GetSyncedItemProgress(options);
+ var syncDictionary = GetSyncedItemProgress(options);
- var dto = GetBaseItemDtoInternal(item, options, GetSyncedItemProgressDictionary(syncProgress), user, owner).Result;
+ var dto = GetBaseItemDtoInternal(item, options, user, owner).Result;
var tvChannel = item as LiveTvChannel;
if (tvChannel != null)
{
@@ -191,11 +177,11 @@ namespace MediaBrowser.Server.Implementations.Dto
SetItemByNameInfo(item, dto, GetTaggedItems(byName, user), user);
}
- FillSyncInfo(dto, item, options, user, syncProgress);
+ FillSyncInfo(dto, item, options, user, syncDictionary);
return dto;
}
- FillSyncInfo(dto, item, options, user, syncProgress);
+ FillSyncInfo(dto, item, options, user, syncDictionary);
return dto;
}
@@ -211,23 +197,24 @@ namespace MediaBrowser.Server.Implementations.Dto
return items;
}
- private SyncedItemProgress[] GetSyncedItemProgress(DtoOptions options)
+ public Dictionary<string, SyncedItemProgress> GetSyncedItemProgress(DtoOptions options)
{
- if (!options.Fields.Contains(ItemFields.SyncInfo))
+ if (!options.Fields.Contains(ItemFields.BasicSyncInfo) &&
+ !options.Fields.Contains(ItemFields.SyncInfo))
{
- return new SyncedItemProgress[] { };
+ return new Dictionary<string, SyncedItemProgress>();
}
var deviceId = options.DeviceId;
if (string.IsNullOrWhiteSpace(deviceId))
{
- return new SyncedItemProgress[] { };
+ return new Dictionary<string, SyncedItemProgress>();
}
var caps = _deviceManager().GetCapabilities(deviceId);
if (caps == null || !caps.SupportsSync)
{
- return new SyncedItemProgress[] { };
+ return new Dictionary<string, SyncedItemProgress>();
}
return _syncManager.GetSyncedItemProgresses(new SyncJobItemQuery
@@ -241,12 +228,13 @@ namespace MediaBrowser.Server.Implementations.Dto
SyncJobItemStatus.ReadyToTransfer,
SyncJobItemStatus.Synced
}
- }).Items;
+ });
}
public void FillSyncInfo(IEnumerable<Tuple<BaseItem, BaseItemDto>> tuples, DtoOptions options, User user)
{
- if (options.Fields.Contains(ItemFields.SyncInfo))
+ if (options.Fields.Contains(ItemFields.BasicSyncInfo) ||
+ options.Fields.Contains(ItemFields.SyncInfo))
{
var syncProgress = GetSyncedItemProgress(options);
@@ -254,62 +242,45 @@ namespace MediaBrowser.Server.Implementations.Dto
{
var item = tuple.Item1;
- FillSyncInfo(tuple.Item2, item, syncProgress, options, user);
+ FillSyncInfo(tuple.Item2, item, options, user, syncProgress);
}
}
}
- private void FillSyncInfo(IHasSyncInfo dto, BaseItem item, DtoOptions options, User user, SyncedItemProgress[] syncProgress)
+ private void FillSyncInfo(IHasSyncInfo dto, BaseItem item, DtoOptions options, User user, Dictionary<string, SyncedItemProgress> syncProgress)
{
- if (options.Fields.Contains(ItemFields.SyncInfo))
- {
- var userCanSync = user != null && user.Policy.EnableSync;
- dto.SupportsSync = userCanSync && _syncManager.SupportsSync(item);
- }
+ var hasFullSyncInfo = options.Fields.Contains(ItemFields.SyncInfo);
- if (dto.SupportsSync ?? false)
+ if (!options.Fields.Contains(ItemFields.BasicSyncInfo) &&
+ !hasFullSyncInfo)
{
- 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)
- {
- dto.SyncStatus = SyncJobItemStatus.Synced;
- }
-
- else if (dto.HasSyncJob.Value)
- {
- dto.SyncStatus = syncProgress.Where(i => string.Equals(i.ItemId, dto.Id, StringComparison.OrdinalIgnoreCase)).Select(i => i.Status).Max();
- }
- }
- }
-
- private void FillSyncInfo(IHasSyncInfo dto, BaseItem item, SyncedItemProgress[] syncProgress, DtoOptions options, User user)
- {
- if (options.Fields.Contains(ItemFields.SyncInfo))
- {
- var userCanSync = user != null && user.Policy.EnableSync;
- dto.SupportsSync = userCanSync && _syncManager.SupportsSync(item);
+ return;
}
if (dto.SupportsSync ?? false)
{
- 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)
+ SyncedItemProgress syncStatus;
+ if (syncProgress.TryGetValue(dto.Id, out syncStatus))
{
- dto.SyncStatus = SyncJobItemStatus.Synced;
- }
+ if (syncStatus.Status == SyncJobItemStatus.Synced)
+ {
+ dto.SyncPercent = 100;
+ }
+ else
+ {
+ dto.SyncPercent = syncStatus.Progress;
+ }
- else if (dto.HasSyncJob.Value)
- {
- dto.SyncStatus = syncProgress.Where(i => string.Equals(i.ItemId, dto.Id, StringComparison.OrdinalIgnoreCase)).Select(i => i.Status).Max();
+ if (hasFullSyncInfo)
+ {
+ dto.HasSyncJob = true;
+ dto.SyncStatus = syncStatus.Status;
+ }
}
}
}
- private async Task<BaseItemDto> GetBaseItemDtoInternal(BaseItem item, DtoOptions options, Dictionary<string, SyncedItemProgress> syncProgress, User user = null, BaseItem owner = null)
+ private async Task<BaseItemDto> GetBaseItemDtoInternal(BaseItem item, DtoOptions options, User user = null, BaseItem owner = null)
{
var fields = options.Fields;
@@ -358,7 +329,7 @@ namespace MediaBrowser.Server.Implementations.Dto
if (user != null)
{
- await AttachUserSpecificInfo(dto, item, user, fields, syncProgress).ConfigureAwait(false);
+ await AttachUserSpecificInfo(dto, item, user, options).ConfigureAwait(false);
}
var hasMediaSources = item as IHasMediaSources;
@@ -421,11 +392,9 @@ namespace MediaBrowser.Server.Implementations.Dto
return dto;
}
- public BaseItemDto GetItemByNameDto(BaseItem item, DtoOptions options, List<BaseItem> taggedItems, User user = null)
+ public BaseItemDto GetItemByNameDto(BaseItem item, DtoOptions options, List<BaseItem> taggedItems, Dictionary<string, SyncedItemProgress> syncProgress, User user = null)
{
- var syncProgress = GetSyncedItemProgress(options);
-
- var dto = GetBaseItemDtoInternal(item, options, GetSyncedItemProgressDictionary(syncProgress), user).Result;
+ var dto = GetBaseItemDtoInternal(item, options, user).Result;
if (taggedItems != null && options.Fields.Contains(ItemFields.ItemCounts))
{
@@ -439,12 +408,19 @@ namespace MediaBrowser.Server.Implementations.Dto
private void SetItemByNameInfo(BaseItem item, BaseItemDto dto, List<BaseItem> taggedItems, User user = null)
{
- if (item is MusicArtist || item is MusicGenre)
+ if (item is MusicArtist)
{
dto.AlbumCount = taggedItems.Count(i => i is MusicAlbum);
dto.MusicVideoCount = taggedItems.Count(i => i is MusicVideo);
dto.SongCount = taggedItems.Count(i => i is Audio);
}
+ else if (item is MusicGenre)
+ {
+ dto.ArtistCount = taggedItems.Count(i => i is MusicArtist);
+ dto.AlbumCount = taggedItems.Count(i => i is MusicAlbum);
+ dto.MusicVideoCount = taggedItems.Count(i => i is MusicVideo);
+ dto.SongCount = taggedItems.Count(i => i is Audio);
+ }
else if (item is GameGenre)
{
dto.GameCount = taggedItems.Count(i => i is Game);
@@ -453,6 +429,7 @@ namespace MediaBrowser.Server.Implementations.Dto
{
// This populates them all and covers Genre, Person, Studio, Year
+ dto.ArtistCount = taggedItems.Count(i => i is MusicArtist);
dto.AlbumCount = taggedItems.Count(i => i is MusicAlbum);
dto.EpisodeCount = taggedItems.Count(i => i is Episode);
dto.GameCount = taggedItems.Count(i => i is Game);
@@ -469,34 +446,20 @@ namespace MediaBrowser.Server.Implementations.Dto
/// <summary>
/// Attaches the user specific info.
/// </summary>
- /// <param name="dto">The dto.</param>
- /// <param name="item">The item.</param>
- /// <param name="user">The user.</param>
- /// <param name="fields">The fields.</param>
- /// <param name="syncProgress">The synchronize progress.</param>
- private async Task AttachUserSpecificInfo(BaseItemDto dto, BaseItem item, User user, List<ItemFields> fields, Dictionary<string, SyncedItemProgress> syncProgress)
+ private async Task AttachUserSpecificInfo(BaseItemDto dto, BaseItem item, User user, DtoOptions dtoOptions)
{
+ var fields = dtoOptions.Fields;
+
if (item.IsFolder)
{
var folder = (Folder)item;
- if (item.SourceType == SourceType.Library && folder.SupportsUserDataFromChildren && fields.Contains(ItemFields.SyncInfo))
- {
- // Skip the user data manager because we've already looped through the recursive tree and don't want to do it twice
- // TODO: Improve in future
- dto.UserData = GetUserItemDataDto(_userDataRepository.GetUserData(user, item));
-
- await SetSpecialCounts(folder, user, dto, fields, syncProgress).ConfigureAwait(false);
-
- dto.UserData.Played = dto.UserData.PlayedPercentage.HasValue &&
- dto.UserData.PlayedPercentage.Value >= 100;
- }
- else
+ if (dtoOptions.EnableUserData)
{
dto.UserData = await _userDataRepository.GetUserDataDto(item, dto, user).ConfigureAwait(false);
}
- if (item.SourceType == SourceType.Library)
+ if (!dto.ChildCount.HasValue && item.SourceType == SourceType.Library)
{
dto.ChildCount = GetChildCount(folder, user);
}
@@ -514,11 +477,23 @@ namespace MediaBrowser.Server.Implementations.Dto
else
{
- dto.UserData = _userDataRepository.GetUserDataDto(item, user).Result;
+ if (dtoOptions.EnableUserData)
+ {
+ dto.UserData = _userDataRepository.GetUserDataDto(item, user).Result;
+ }
}
dto.PlayAccess = item.GetPlayAccess(user);
+ if (fields.Contains(ItemFields.BasicSyncInfo) || fields.Contains(ItemFields.SyncInfo))
+ {
+ var userCanSync = user != null && user.Policy.EnableSync;
+ if (userCanSync && _syncManager.SupportsSync(item))
+ {
+ dto.SupportsSync = true;
+ }
+ }
+
if (fields.Contains(ItemFields.SeasonUserData))
{
var episode = item as Episode;
@@ -980,20 +955,23 @@ namespace MediaBrowser.Server.Implementations.Dto
dto.Genres = item.Genres;
}
- 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.EnableImages)
{
- if (options.GetImageLimit(image.Type) > 0)
- {
- var tag = GetImageCacheTag(item, image);
+ dto.ImageTags = new Dictionary<ImageType, string>();
- if (tag != null)
+ // 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)
{
- dto.ImageTags[image.Type] = tag;
+ var tag = GetImageCacheTag(item, image);
+
+ if (tag != null)
+ {
+ dto.ImageTags[image.Type] = tag;
+ }
}
}
}
@@ -1001,7 +979,16 @@ namespace MediaBrowser.Server.Implementations.Dto
dto.Id = GetDtoId(item);
dto.IndexNumber = item.IndexNumber;
dto.ParentIndexNumber = item.ParentIndexNumber;
- dto.IsFolder = item.IsFolder;
+
+ if (item.IsFolder)
+ {
+ dto.IsFolder = true;
+ }
+ else if (item is IHasMediaSources)
+ {
+ dto.IsFolder = false;
+ }
+
dto.MediaType = item.MediaType;
dto.LocationType = item.LocationType;
if (item.IsHD.HasValue && item.IsHD.Value)
@@ -1445,7 +1432,7 @@ namespace MediaBrowser.Server.Implementations.Dto
BaseItem parent = null;
var isFirst = true;
- while (((!dto.HasLogo && logoLimit > 0) || (!dto.HasArtImage && artLimit > 0) || (!dto.HasThumb && thumbLimit > 0) || parent is Series) &&
+ while (((!dto.HasLogo && logoLimit > 0) || (!dto.HasArtImage && artLimit > 0) || (!dto.HasThumb && thumbLimit > 0) || parent is Series) &&
(parent = parent ?? (isFirst ? item.GetParent() ?? owner : parent)) != null)
{
if (parent == null)
@@ -1544,97 +1531,6 @@ namespace MediaBrowser.Server.Implementations.Dto
}
/// <summary>
- /// Since it can be slow to make all of these calculations independently, this method will provide a way to do them all at once
- /// </summary>
- /// <param name="folder">The folder.</param>
- /// <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 async Task SetSpecialCounts(Folder folder, User user, BaseItemDto dto, List<ItemFields> fields, Dictionary<string, SyncedItemProgress> syncProgress)
- {
- var recursiveItemCount = 0;
- var unplayed = 0;
-
- double totalPercentPlayed = 0;
- double totalSyncPercent = 0;
-
- var children = await folder.GetItems(new InternalItemsQuery
- {
- IsFolder = false,
- Recursive = true,
- ExcludeLocationTypes = new[] { LocationType.Virtual },
- User = user
-
- }).ConfigureAwait(false);
-
- // Loop through each recursive child
- foreach (var child in children.Items)
- {
- var userdata = _userDataRepository.GetUserData(user, child);
-
- recursiveItemCount++;
-
- var isUnplayed = true;
-
- // Incrememt totalPercentPlayed
- if (userdata != null)
- {
- if (userdata.Played)
- {
- totalPercentPlayed += 100;
-
- isUnplayed = false;
- }
- else if (userdata.PlaybackPositionTicks > 0 && child.RunTimeTicks.HasValue && child.RunTimeTicks.Value > 0)
- {
- double itemPercent = userdata.PlaybackPositionTicks;
- itemPercent /= child.RunTimeTicks.Value;
- totalPercentPlayed += itemPercent;
- }
- }
-
- if (isUnplayed)
- {
- unplayed++;
- }
-
- double percent = 0;
- SyncedItemProgress syncItemProgress;
- if (syncProgress.TryGetValue(child.Id.ToString("N"), 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;
- dto.UserData.UnplayedItemCount = unplayed;
-
- if (recursiveItemCount > 0)
- {
- dto.UserData.PlayedPercentage = totalPercentPlayed / recursiveItemCount;
-
- var pct = totalSyncPercent / recursiveItemCount;
- if (pct > 0)
- {
- dto.SyncPercent = pct;
- }
- }
- }
-
- /// <summary>
/// Attaches the primary image aspect ratio.
/// </summary>
/// <param name="dto">The dto.</param>
@@ -1660,7 +1556,7 @@ namespace MediaBrowser.Server.Implementations.Dto
{
size = _imageProcessor.GetImageSize(imageInfo);
}
- catch (Exception ex)
+ catch
{
//_logger.ErrorException("Failed to determine primary image aspect ratio for {0}", ex, path);
return null;