Example #1
0
        /// <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;
            }
        }
Example #2
0
        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));
            }
            }
        }
Example #3
0
        /// <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;
                }
            }
        }