protected async Task<IItemDetailSection> GetItemsSection(ItemsResult itemsResult, Func<ItemsResult, bool> listCondition, bool expandSingleItem = true)
        {
            if (itemsResult.Items.Length == 1 && expandSingleItem && itemsResult.Items[0].IsFolder) {
                var query = new ItemQuery { ParentId = itemsResult.Items[0].Id, UserId = _sessionManager.CurrentUser.Id };
                return await GetItemsSection(await _apiClient.GetItemsAsync(query), listCondition);
            }

            if (listCondition(itemsResult)) {
                return new ItemsListViewModel(itemsResult, _apiClient, _imageManager, _serverEvents, _navigator, _playbackManager);
            }

            return new ItemsGridViewModel(itemsResult, _apiClient, _imageManager, _serverEvents, _navigator, _playbackManager);
        }
Beispiel #2
0
        public ItemsListViewModel(ItemsResult itemsResult, IApiClient apiClient, IImageManager imageManager, IServerEvents serverEvents, INavigator navigator, IPlaybackManager playbackManager)
        {
            _itemsResult = itemsResult;
            _apiClient = apiClient;
            _imageManager = imageManager;
            _serverEvents = serverEvents;
            _navigator = navigator;
            _playbackManager = playbackManager;

            var itemType = itemsResult.Items.Length > 0 ? itemsResult.Items.First().Type : null;
            if (itemType == "Episode") {
                _preferredImageTypes = new[] { ImageType.Screenshot, ImageType.Thumb, ImageType.Art, ImageType.Primary };
            } else {
                _preferredImageTypes = new[] { ImageType.Backdrop, ImageType.Thumb, ImageType.Art };
            }

            Title = SelectHeader(itemsResult.Items.Length > 0 ? itemsResult.Items.First().Type : null);
            Items = new RangeObservableCollection<ItemTileViewModel>();
            LoadItems();
        }
Beispiel #3
0
        private async Task<object> GetResult(IEnumerable<Audio> items, User user, BaseGetSimilarItems request)
        {
            var list = items.ToList();

            var result = new ItemsResult
            {
                TotalRecordCount = list.Count
            };

            var dtoOptions = GetDtoOptions(request);

            result.Items = (await _dtoService.GetBaseItemDtos(list.Take(request.Limit ?? list.Count), dtoOptions, user).ConfigureAwait(false)).ToArray();

            return ToOptimizedResult(result);
        }
        private object GetResult(IEnumerable<Audio> items, User user, BaseGetSimilarItems request)
        {
            var fields = request.GetItemFields().ToList();

            var list = items.ToList();

            var result = new ItemsResult
            {
                TotalRecordCount = list.Count
            };

            var dtos = list.Take(request.Limit ?? list.Count)
                .Select(i => _dtoService.GetBaseItemDto(i, fields, user));

            result.Items = dtos.ToArray();

            return ToOptimizedResult(result);
        }
 protected async Task<IItemDetailSection> GetItemsSection(ItemsResult itemsResult, bool expandSingleItem = true)
 {
     return await GetItemsSection(itemsResult, result => (result.Items.Length > 0 && result.Items[0].Type == "Episode") || result.Items.Length > ListThreshold, expandSingleItem);
 }
        private bool SetLatestUnwatched(ItemsResult itemResponse)
        {
            SetProgressBar();

            if (itemResponse == null || !itemResponse.Items.Any())
            {
                return false;
            }

            LatestUnwatched = itemResponse.Items.ToList();

            return true;
        }
Beispiel #7
0
        private Task<ItemsResult> GetResumeablesAsync(ItemListViewModel viewModel)
        {
            var result = new ItemsResult
            {
                Items = _tvView.ResumableEpisodes.ToArray(),
                TotalRecordCount = _tvView.ResumableEpisodes.Count
            };

            ResumeVisibility = result.TotalRecordCount > 0 ? Visibility.Visible : Visibility.Collapsed;

            return Task.FromResult(result);
        }
        private async Task<Boolean> GeSearchPeopleAsync()
        {
            SearchHintResult searchHintResult = await _apiClient.GetSearchHintsAsync(new SearchQuery { UserId = _apiClient.CurrentUserId, SearchTerm = CurrentSearch, IncludePeople = true, IncludeArtists = false, IncludeGenres = false, IncludeMedia = false, IncludeStudios = false, Limit = 9 });

            var ids = (searchHintResult.TotalRecordCount > 0) ? searchHintResult.SearchHints.Select(s => s.ItemId).ToArray() : null;
            if (ids != null && ids.Length > 0)
            {
                var query = new ItemQuery
                {
                    Ids = ids,
                    UserId = _apiClient.CurrentUserId,
                    Fields = FolderPage.QueryFields
                };

                _searchedPeopleItemsResult = await _apiClient.GetItemsAsync(query);
            }
            else
            {
                _searchedPeopleItemsResult = _emptyItemsResult;
            }

            return true;
        }
        private async Task<bool> SetBoxsets(ItemsResult itemResponse)
        {
            if (itemResponse == null)
            {
                return false;
            }

            Boxsets = await Utils.GroupItemsByName(itemResponse.Items);
            SetProgressBar();

            return true;
        }
        private ItemsResult GetInstantMixResult(BaseGetSimilarItems request, IEnumerable<string> genres)
        {
            var user = request.UserId.HasValue ? _userManager.GetUserById(request.UserId.Value) : null;

            var fields = request.GetItemFields().ToList();

            var inputItems = user == null
                                 ? _libraryManager.RootFolder.RecursiveChildren
                                 : user.RootFolder.GetRecursiveChildren(user);

            var genresDictionary = genres.ToDictionary(i => i, StringComparer.OrdinalIgnoreCase);

            var limit = request.Limit.HasValue ? request.Limit.Value * 2 : 100;

            var items = inputItems
                .OfType<Audio>()
                .Select(i => new Tuple<Audio, int>(i, i.Genres.Count(genresDictionary.ContainsKey)))
                .OrderByDescending(i => i.Item2)
                .ThenBy(i => Guid.NewGuid())
                .Select(i => i.Item1)
                .Take(limit)
                .OrderBy(i => Guid.NewGuid())
                .ToList();

            var result = new ItemsResult
            {
                TotalRecordCount = items.Count
            };

            var dtos = items.Take(request.Limit ?? items.Count)
                .Select(i => _dtoService.GetBaseItemDto(i, fields, user));

            result.Items = dtos.ToArray();

            return result;
        }
        private bool SetUpcomingItems(ItemsResult itemResponse)
        {
            SetProgressBar();

            if (itemResponse == null || !itemResponse.Items.Any())
            {
                return false;
            }

            var upcomingItems = itemResponse.Items;
            var groupedItems = (from u in upcomingItems
                                group u by u.PremiereDate.HasValue ? u.PremiereDate.Value.ToLocalTime().Date : DateTime.MinValue
                                    into grp
                                    orderby grp.Key
                                    select new Group<BaseItemDto>(Utils.CoolDateName(grp.Key.ToLocalTime().Date), grp)).ToList();

            Upcoming = groupedItems;

            return true;
        }
        private async Task<bool> SetFilms(ItemsResult itemResponse)
        {
            Films = await Utils.GroupItemsByName(itemResponse.Items);

            SetProgressBar();

            return true;
        }
        private async Task SendItemsToPlaylist(ItemsResult itemResponse)
        {
            if (itemResponse == null || itemResponse.Items.IsNullOrEmpty())
            {
                return;
            }

            var items = itemResponse.Items.ToList();

            var newList = await items.ToPlayListItems(ApiClient);

            Messenger.Default.Send(new NotificationMessage<List<PlaylistItem>>(newList, Constants.Messages.SetPlaylistAsMsg));

            Deployment.Current.Dispatcher.BeginInvoke(() => NavigationService.NavigateTo(Constants.Pages.NowPlayingView));
        }
Beispiel #14
0
        private async Task<ItemsResult> GetInstantMixResult(BaseGetSimilarItems request, IEnumerable<string> genres)
        {
            var user = request.UserId.HasValue ? _userManager.GetUserById(request.UserId.Value) : null;

            var fields = request.GetItemFields().ToList();

            var dtoBuilder = new DtoBuilder(Logger, _libraryManager, _userDataRepository, _itemRepo);

            var inputItems = user == null
                                 ? _libraryManager.RootFolder.RecursiveChildren
                                 : user.RootFolder.GetRecursiveChildren(user);

            var genresDictionary = genres.ToDictionary(i => i, StringComparer.OrdinalIgnoreCase);

            var limit = request.Limit.HasValue ? request.Limit.Value * 2 : 100;

            var items = inputItems
                .OfType<Audio>()
                .Select(i => new Tuple<Audio, int>(i, i.Genres.Count(genresDictionary.ContainsKey)))
                .OrderByDescending(i => i.Item2)
                .ThenBy(i => Guid.NewGuid())
                .Select(i => i.Item1)
                .Take(limit)
                .OrderBy(i => Guid.NewGuid())
                .ToArray();

            var result = new ItemsResult
            {
                TotalRecordCount = items.Length
            };

            var tasks = items.Take(request.Limit ?? items.Length)
                .Select(i => dtoBuilder.GetBaseItemDto(i, fields, user));

            result.Items = await Task.WhenAll(tasks).ConfigureAwait(false);

            return result;
        }
        private Task<ItemsResult> GetLatestMoviesAsync(ItemListViewModel viewModel)
        {
            var result = new ItemsResult
            {
                Items = _moviesView.LatestMovies.ToArray(),
                TotalRecordCount = _moviesView.LatestMovies.Count
            };

            return Task.FromResult(result);
        }
        private async Task<bool> SetMovies(ItemsResult moviesResponse)
        {
            if (moviesResponse != null)
            {
                Movies = await Utils.GroupItemsByName(moviesResponse.Items);
            }

            SetProgressBar();

            return true;
        }
        private Task<ItemsResult> GetGameSystems(ItemListViewModel viewModel)
        {
            var result = new ItemsResult
            {
                Items = _gamesView.GameSystems.ToArray(),
                TotalRecordCount = _gamesView.GameSystems.Count
            };

            return Task.FromResult(result);
        }
        private bool SetLatestUnwatched(ItemsResult itemResponse)
        {
            if (itemResponse != null && !itemResponse.Items.IsNullOrEmpty())
            {
                var items = itemResponse.Items.ToList();
                UnseenHeader = items[0];

                items.RemoveAt(0);

                LatestUnwatched = items;

                SetProgressBar();

                return true;
            }
            return false;
        }
        private Task<ItemsResult> GetRecentlyPlayedAsync(ItemListViewModel viewModel)
        {
            var result = new ItemsResult
            {
                Items = _gamesView.RecentlyPlayedGames.ToArray(),
                TotalRecordCount = _gamesView.RecentlyPlayedGames.Count
            };

            RecentlyPlayedVisibility = result.Items.Length > 0 ? Visibility.Visible : Visibility.Collapsed;

            return Task.FromResult(result);
        }
        private async void UpdateSearch()
        {
            MatchedPeopleVisibility = String.IsNullOrEmpty(CurrentSearch) ? Visibility.Hidden : Visibility.Visible;
            MatchedItemsVisibility = String.IsNullOrEmpty(CurrentSearch) ? Visibility.Hidden : Visibility.Visible;
            
            if (EmptyResultsTextBlockVisibility == Visibility.Visible)
                EmptyResultsTextBlockVisibility = Visibility.Collapsed;

            if (!String.IsNullOrEmpty(CurrentSearch))
            {
                var searchTasks = new Task[2];

                searchTasks[0] = Task.Run(() => GeSearchItemsAsync());
                searchTasks[1] = Task.Run(() => GeSearchPeopleAsync());

                await Task.WhenAll(searchTasks);
            }
            else
            {
                _searchedItemsResult = _emptyItemsResult;
                _searchedPeopleItemsResult = _emptyItemsResult;
            }

            await MatchedItemsViewModel.ReloadItems(true);
            await MatchedPeopleViewModel.ReloadItems(true);
        }
Beispiel #21
0
        private ItemsResult GetSimilarItemsResult(BaseGetSimilarItemsFromItem request, Func<BaseItem, List<PersonInfo>, List<PersonInfo>, BaseItem, int> getSimilarityScore)
        {
            var user = !string.IsNullOrWhiteSpace(request.UserId) ? _userManager.GetUserById(request.UserId) : null;

            var item = string.IsNullOrEmpty(request.Id) ?
                (!string.IsNullOrWhiteSpace(request.UserId) ? user.RootFolder :
                _libraryManager.RootFolder) : _libraryManager.GetItemById(request.Id);

            var inputItems = _libraryManager.GetArtists(user.RootFolder.GetRecursiveChildren(user, i => i is IHasArtist).OfType<IHasArtist>());

            var list = inputItems.ToList();

            var items = SimilarItemsHelper.GetSimilaritems(item, _libraryManager, list, getSimilarityScore).ToList();

            IEnumerable<BaseItem> returnItems = items;

            if (request.Limit.HasValue)
            {
                returnItems = returnItems.Take(request.Limit.Value);
            }

            var dtoOptions = GetDtoOptions(request);

            var result = new ItemsResult
            {
                Items = _dtoService.GetBaseItemDtos(returnItems, dtoOptions, user).ToArray(),

                TotalRecordCount = items.Count
            };

            return result;
        }
        private async Task<bool> SetShows(ItemsResult itemResponse)
        {
            SetProgressBar();

            if (itemResponse == null || itemResponse.Items.IsNullOrEmpty())
            {
                return false;
            }

            Shows = await Utils.GroupItemsByName(itemResponse.Items.ToList());

            return true;
        }
        private void SendItemsToPlaylist(ItemsResult itemResponse)
        {
            if (itemResponse == null || itemResponse.Items.IsNullOrEmpty())
            {
                return;
            }

            var items = itemResponse.Items.ToList();

            var newList = items.ToPlayListItems(_apiClient);

            Messenger.Default.Send(new NotificationMessage<List<PlaylistItem>>(newList, Constants.Messages.SetPlaylistAsMsg));

            _navigationService.NavigateTo(Constants.Pages.NowPlayingView);
        }
        private bool SetNextUpItems(ItemsResult itemResponse)
        {
            SetProgressBar(); 
            
            if (itemResponse == null || !itemResponse.Items.Any())
            {
                return false;
            }

            NextUpList = itemResponse.Items.ToList();

            return true;
        }
        private async void LoadItems(ItemsResult result)
        {
            BaseItemDto[] items = result.Items;

            for (int i = 0; i < items.Length; i++)
            {
                if (Items.Count > i)
                {
                    Items[i].Item = items[i];
                }
                else
                {
                    ItemTileViewModel vm = CreateItem();
                    vm.Item = items[i];

                    Items.Add(vm);
                }
            }

            if (Items.Count > items.Length)
            {
                List<ItemTileViewModel> toRemove = Items.Skip(items.Length).ToList();
                Items.RemoveRange(toRemove);
            }

            IsVisible = Items.Count > 0;
            OnPropertyChanged("Size");
        }