/// <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 void SetSpecialCounts(Folder folder, User user, BaseItemDto dto, List<ItemFields> fields, Dictionary<string, SyncedItemProgress> syncProgress) { var recursiveItemCount = 0; var unplayed = 0; long runtime = 0; DateTime? dateLastMediaAdded = null; double totalPercentPlayed = 0; double totalSyncPercent = 0; var addSyncInfo = fields.Contains(ItemFields.SyncInfo); var children = folder.GetItems(new InternalItemsQuery { IsFolder = false, Recursive = true, IsVirtualUnaired = false, IsMissing = false, User = user }).Result.Items; // Loop through each recursive child foreach (var child in children) { if (!dateLastMediaAdded.HasValue) { dateLastMediaAdded = child.DateCreated; } else { dateLastMediaAdded = new[] { dateLastMediaAdded.Value, child.DateCreated }.Max(); } var userdata = _userDataRepository.GetUserData(user.Id, child.GetUserDataKey()); 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++; } runtime += child.RunTimeTicks ?? 0; if (addSyncInfo) { 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; if (addSyncInfo) { var pct = totalSyncPercent / recursiveItemCount; if (pct > 0) { dto.SyncPercent = pct; } } } if (runtime > 0 && fields.Contains(ItemFields.CumulativeRunTimeTicks)) { dto.CumulativeRunTimeTicks = runtime; } if (fields.Contains(ItemFields.DateLastMediaAdded)) { dto.DateLastMediaAdded = dateLastMediaAdded; } }
public QueryResult <BaseItem> GetUserItems(Folder queryParent, Folder displayParent, string viewType, InternalItemsQuery query) { var user = query.User; //if (query.IncludeItemTypes != null && // query.IncludeItemTypes.Length == 1 && // string.Equals(query.IncludeItemTypes[0], "Playlist", StringComparison.OrdinalIgnoreCase)) //{ // if (!string.Equals(viewType, CollectionType.Playlists, StringComparison.OrdinalIgnoreCase)) // { // return await FindPlaylists(queryParent, user, query).ConfigureAwait(false); // } //} switch (viewType) { case CollectionType.Folders: return(GetResult(_libraryManager.GetUserRootFolder().GetChildren(user, true), queryParent, query)); case CollectionType.TvShows: return(GetTvView(queryParent, user, query)); case CollectionType.Movies: return(GetMovieFolders(queryParent, user, query)); case SpecialFolder.TvShowSeries: return(GetTvSeries(queryParent, user, query)); case SpecialFolder.TvGenres: return(GetTvGenres(queryParent, user, query)); case SpecialFolder.TvGenre: return(GetTvGenreItems(queryParent, displayParent, user, query)); case SpecialFolder.TvResume: return(GetTvResume(queryParent, user, query)); case SpecialFolder.TvNextUp: return(GetTvNextUp(queryParent, query)); case SpecialFolder.TvLatest: return(GetTvLatest(queryParent, user, query)); case SpecialFolder.MovieFavorites: return(GetFavoriteMovies(queryParent, user, query)); case SpecialFolder.MovieLatest: return(GetMovieLatest(queryParent, user, query)); case SpecialFolder.MovieGenres: return(GetMovieGenres(queryParent, user, query)); case SpecialFolder.MovieGenre: return(GetMovieGenreItems(queryParent, displayParent, user, query)); case SpecialFolder.MovieResume: return(GetMovieResume(queryParent, user, query)); case SpecialFolder.MovieMovies: return(GetMovieMovies(queryParent, user, query)); case SpecialFolder.MovieCollections: return(GetMovieCollections(queryParent, user, query)); case SpecialFolder.TvFavoriteEpisodes: return(GetFavoriteEpisodes(queryParent, user, query)); case SpecialFolder.TvFavoriteSeries: return(GetFavoriteSeries(queryParent, user, query)); default: { if (queryParent is UserView) { return(GetResult(GetMediaFolders(user).OfType <Folder>().SelectMany(i => i.GetChildren(user, true)), queryParent, query)); } return(queryParent.GetItems(query)); } } }
/// <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, SyncJobItemStatus> 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; SyncJobItemStatus syncItemProgress; if (syncProgress.TryGetValue(child.Id.ToString("N"), out syncItemProgress)) { switch (syncItemProgress) { 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; } } }