Пример #1
0
        /// <summary>
        /// Gets the specified request.
        /// </summary>
        /// <param name="request">The request.</param>
        /// <returns>System.Object.</returns>
        public object Get(GetAdditionalParts request)
        {
            var user = request.UserId.HasValue ? _userManager.GetUserById(request.UserId.Value) : null;

            var item = string.IsNullOrEmpty(request.Id)
                           ? (request.UserId.HasValue
                                  ? user.RootFolder
                                  : _libraryManager.RootFolder)
                           : _dtoService.GetItemByDtoId(request.Id, request.UserId);

            // Get everything
            var fields = Enum.GetNames(typeof(ItemFields))
                         .Select(i => (ItemFields)Enum.Parse(typeof(ItemFields), i, true))
                         .ToList();

            var video = (Video)item;

            var items = video.GetAdditionalParts()
                        .Select(i => _dtoService.GetBaseItemDto(i, fields, user, video))
                        .ToArray();

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

            return(ToOptimizedSerializedResultUsingCache(result));
        }
Пример #2
0
        /// <summary>
        /// Reports the playback start.
        /// </summary>
        /// <param name="message">The message.</param>
        private void ReportPlaybackStart(WebSocketMessageInfo message)
        {
            _logger.Debug("Received PlaybackStart message");

            var session = GetSessionFromMessage(message);

            if (session != null && session.User != null)
            {
                var vals = message.Data.Split('|');

                var item = _dtoService.GetItemByDtoId(vals[0]);

                var queueableMediaTypes = string.Empty;
                var canSeek             = true;

                if (vals.Length > 1)
                {
                    canSeek = string.Equals(vals[1], "true", StringComparison.OrdinalIgnoreCase);
                }
                if (vals.Length > 2)
                {
                    queueableMediaTypes = vals[2];
                }

                var info = new PlaybackInfo
                {
                    CanSeek             = canSeek,
                    Item                = item,
                    SessionId           = session.Id,
                    QueueableMediaTypes = queueableMediaTypes.Split(',').ToList()
                };

                _sessionManager.OnPlaybackStart(info);
            }
        }
Пример #3
0
        public object Get(GetInstantMixFromSong request)
        {
            var item = _dtoService.GetItemByDtoId(request.Id);

            var result = GetInstantMixResult(request, item.Genres).Result;

            return(ToOptimizedResult(result));
        }
Пример #4
0
        public object Get(GetRemoteImageProviders request)
        {
            var item = _dtoService.GetItemByDtoId(request.Id);

            var result = GetImageProviders(item);

            return(ToOptimizedSerializedResultUsingCache(result));
        }
Пример #5
0
        public object Get(GetInstantMixFromSong request)
        {
            var item = (Audio)_dtoService.GetItemByDtoId(request.Id);

            var user = _userManager.GetUserById(request.UserId.Value);

            var items = _musicManager.GetInstantMixFromSong(item, user);

            return(GetResult(items, user, request));
        }
Пример #6
0
        private Task <BaseItemDto[]> GetAsync(GetSpecialFeatures request)
        {
            var user = _userManager.GetUserById(request.UserId);

            var item = string.IsNullOrEmpty(request.Id) ? user.RootFolder : _dtoService.GetItemByDtoId(request.Id, user.Id);

            // Get everything
            var fields = Enum.GetNames(typeof(ItemFields)).Select(i => (ItemFields)Enum.Parse(typeof(ItemFields), i, true)).ToList();

            var movie = item as Movie;

            // Get them from the db
            if (movie != null)
            {
                // Avoid implicitly captured closure
                var movie1 = movie;

                var tasks = movie.SpecialFeatureIds
                            .Select(_itemRepo.RetrieveItem)
                            .OrderBy(i => i.SortName)
                            .Select(i => _dtoService.GetBaseItemDto(i, fields, user, movie1));

                return(Task.WhenAll(tasks));
            }

            var series = item as Series;

            // Get them from the child tree
            if (series != null)
            {
                var tasks = series
                            .RecursiveChildren
                            .OfType <Episode>()
                            .Where(i => i.ParentIndexNumber.HasValue && i.ParentIndexNumber.Value == 0)
                            .OrderBy(i =>
                {
                    if (i.PremiereDate.HasValue)
                    {
                        return(i.PremiereDate.Value);
                    }

                    if (i.ProductionYear.HasValue)
                    {
                        return(new DateTime(i.ProductionYear.Value, 1, 1, 0, 0, 0, DateTimeKind.Utc));
                    }
                    return(DateTime.MinValue);
                })
                            .ThenBy(i => i.SortName)
                            .Select(i => _dtoService.GetBaseItemDto(i, fields, user));

                return(Task.WhenAll(tasks));
            }

            throw new ArgumentException("The item does not support special features");
        }
Пример #7
0
        public object Get(GetFile request)
        {
            var item = _dtoService.GetItemByDtoId(request.Id);

            if (item.LocationType == LocationType.Remote || item.LocationType == LocationType.Virtual)
            {
                throw new ArgumentException("This command cannot be used for remote or virtual items.");
            }
            if (Directory.Exists(item.Path))
            {
                throw new ArgumentException("This command cannot be used for directories.");
            }

            return(ToStaticFileResult(item.Path));
        }
Пример #8
0
        /// <summary>
        /// Refreshes the item.
        /// </summary>
        /// <param name="request">The request.</param>
        /// <returns>Task.</returns>
        private async Task RefreshItem(RefreshItem request)
        {
            var item = _dtoService.GetItemByDtoId(request.Id);

            var folder = item as Folder;

            try
            {
                await item.RefreshMetadata(CancellationToken.None, forceRefresh : request.Forced).ConfigureAwait(false);

                if (folder != null)
                {
                    // Collection folders don't validate their children so we'll have to simulate that here
                    var collectionFolder = folder as CollectionFolder;

                    if (collectionFolder != null)
                    {
                        await RefreshCollectionFolderChildren(request, collectionFolder).ConfigureAwait(false);
                    }
                    else
                    {
                        await folder.ValidateChildren(new Progress <double>(), CancellationToken.None, request.Recursive, request.Forced).ConfigureAwait(false);
                    }
                }
            }
            catch (Exception ex)
            {
                Logger.ErrorException("Error refreshing library", ex);
            }
        }
Пример #9
0
        /// <summary>
        /// Gets the similar items.
        /// </summary>
        /// <param name="userManager">The user manager.</param>
        /// <param name="itemRepository">The item repository.</param>
        /// <param name="libraryManager">The library manager.</param>
        /// <param name="userDataRepository">The user data repository.</param>
        /// <param name="dtoService">The dto service.</param>
        /// <param name="logger">The logger.</param>
        /// <param name="request">The request.</param>
        /// <param name="includeInSearch">The include in search.</param>
        /// <param name="getSimilarityScore">The get similarity score.</param>
        /// <returns>ItemsResult.</returns>
        internal static ItemsResult GetSimilarItemsResult(IUserManager userManager, IItemRepository itemRepository, ILibraryManager libraryManager, IUserDataManager userDataRepository, IDtoService dtoService, ILogger logger, BaseGetSimilarItemsFromItem request, Func <BaseItem, bool> includeInSearch, Func <BaseItem, BaseItem, int> getSimilarityScore)
        {
            var user = request.UserId.HasValue ? userManager.GetUserById(request.UserId.Value) : null;

            var item = string.IsNullOrEmpty(request.Id) ?
                       (request.UserId.HasValue ? user.RootFolder :
                        (Folder)libraryManager.RootFolder) : dtoService.GetItemByDtoId(request.Id, request.UserId);

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

            var inputItems = user == null
                                 ? libraryManager.RootFolder.GetRecursiveChildren(i => i.Id != item.Id)
                                 : user.RootFolder.GetRecursiveChildren(user, i => i.Id != item.Id);

            var items = GetSimilaritems(item, inputItems, includeInSearch, getSimilarityScore)
                        .ToList();

            IEnumerable <BaseItem> returnItems = items;

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

            var result = new ItemsResult
            {
                Items = returnItems.Select(i => dtoService.GetBaseItemDto(i, fields, user)).ToArray(),

                TotalRecordCount = items.Count
            };

            return(result);
        }
Пример #10
0
        /// <summary>
        /// Gets the specified request.
        /// </summary>
        /// <param name="request">The request.</param>
        /// <returns>System.Object.</returns>
        public object Get(GetItemImageInfos request)
        {
            var item = _dtoService.GetItemByDtoId(request.Id);

            var result = GetItemImageInfos(item);

            return(ToOptimizedResult(result));
        }
Пример #11
0
        public object Get(GetExternalIdInfos request)
        {
            var item = _dtoService.GetItemByDtoId(request.Id);

            var infos = _providerManager.GetExternalIdInfos(item).ToList();

            return(ToOptimizedResult(infos));
        }
Пример #12
0
        private Task UpdateItem(UpdateItem request)
        {
            var item = _dtoService.GetItemByDtoId(request.ItemId);

            UpdateItem(request, item);

            return(_libraryManager.UpdateItem(item, ItemUpdateType.MetadataEdit, CancellationToken.None));
        }
Пример #13
0
        /// <summary>
        /// Gets the items to serialize.
        /// </summary>
        /// <param name="request">The request.</param>
        /// <param name="user">The user.</param>
        /// <returns>IEnumerable{BaseItem}.</returns>
        /// <exception cref="System.InvalidOperationException"></exception>
        private IEnumerable <BaseItem> GetItemsToSerialize(GetItems request, User user)
        {
            var item = string.IsNullOrEmpty(request.ParentId) ? user.RootFolder : _dtoService.GetItemByDtoId(request.ParentId, user.Id);

            // Default list type = children

            if (!string.IsNullOrEmpty(request.Ids))
            {
                var idList = request.Ids.Split(',').ToList();

                return(idList.Select(i => _dtoService.GetItemByDtoId(i, user.Id)));
            }

            if (request.Recursive)
            {
                return(((Folder)item).GetRecursiveChildren(user));
            }

            return(((Folder)item).GetChildren(user, true, request.IndexBy));
        }
Пример #14
0
        /// <summary>
        /// Gets the items to serialize.
        /// </summary>
        /// <param name="request">The request.</param>
        /// <param name="user">The user.</param>
        /// <returns>IEnumerable{BaseItem}.</returns>
        /// <exception cref="System.InvalidOperationException"></exception>
        private IEnumerable <BaseItem> GetItemsToSerialize(GetItems request, User user)
        {
            var item = string.IsNullOrEmpty(request.ParentId) ? user.RootFolder : _dtoService.GetItemByDtoId(request.ParentId, user.Id);

            // Default list type = children
            IEnumerable <BaseItem> items;

            if (!string.IsNullOrEmpty(request.Ids))
            {
                var idList = request.Ids.Split(',').ToList();

                items = idList.Select(i => _dtoService.GetItemByDtoId(i, user.Id));
            }

            else if (request.Recursive)
            {
                items = ((Folder)item).GetRecursiveChildren(user);
            }
            else
            {
                items = ((Folder)item).GetChildren(user, true, request.IndexBy);
            }

            if (request.IncludeIndexContainers)
            {
                var list = items.ToList();

                var containers = list.Select(i => i.IndexContainer)
                                 .Where(i => i != null);

                list.AddRange(containers);

                return(list.Distinct());
            }

            return(items);
        }
Пример #15
0
        private async Task UpdateItem(UpdateItem request)
        {
            var item = _dtoService.GetItemByDtoId(request.ItemId);

            var newLockData          = request.LockData ?? false;
            var dontFetchMetaChanged = item.DontFetchMeta != newLockData;

            UpdateItem(request, item);

            await _libraryManager.UpdateItem(item, ItemUpdateType.MetadataEdit, CancellationToken.None).ConfigureAwait(false);

            if (dontFetchMetaChanged && item.IsFolder)
            {
                var folder = (Folder)item;

                foreach (var child in folder.RecursiveChildren.ToList())
                {
                    child.DontFetchMeta = newLockData;
                    await _libraryManager.UpdateItem(child, ItemUpdateType.MetadataEdit, CancellationToken.None).ConfigureAwait(false);
                }
            }
        }
        /// <summary>
        /// Processes the message.
        /// </summary>
        /// <param name="message">The message.</param>
        /// <returns>Task.</returns>
        public Task ProcessMessage(WebSocketMessageInfo message)
        {
            if (string.Equals(message.MessageType, "Identity", StringComparison.OrdinalIgnoreCase))
            {
                _logger.Debug("Received Identity message");

                var vals = message.Data.Split('|');

                var client   = vals[0];
                var deviceId = vals[1];
                var version  = vals[2];

                var session = _sessionManager.Sessions
                              .FirstOrDefault(i => string.Equals(i.DeviceId, deviceId) &&
                                              string.Equals(i.Client, client) &&
                                              string.Equals(i.ApplicationVersion, version));

                if (session != null)
                {
                    var sockets = session.WebSockets.Where(i => i.State == WebSocketState.Open).ToList();
                    sockets.Add(message.Connection);

                    session.WebSockets = sockets;
                }
                else
                {
                    _logger.Warn("Unable to determine session based on identity message: {0}", message.Data);
                }
            }
            else if (string.Equals(message.MessageType, "Context", StringComparison.OrdinalIgnoreCase))
            {
                var session = _sessionManager.Sessions.FirstOrDefault(i => i.WebSockets.Contains(message.Connection));

                if (session != null)
                {
                    var vals = message.Data.Split('|');

                    session.NowViewingItemType = vals[0];
                    session.NowViewingItemId   = vals[1];
                    session.NowViewingItemName = vals[2];
                    session.NowViewingContext  = vals.Length > 3 ? vals[3] : null;
                }
                else
                {
                    _logger.Warn("Unable to determine session based on context message: {0}", message.Data);
                }
            }
            else if (string.Equals(message.MessageType, "PlaybackStart", StringComparison.OrdinalIgnoreCase))
            {
                _logger.Debug("Received PlaybackStart message");

                var session = _sessionManager.Sessions.FirstOrDefault(i => i.WebSockets.Contains(message.Connection));

                if (session != null && session.User != null)
                {
                    var item = _dtoService.GetItemByDtoId(message.Data);

                    _sessionManager.OnPlaybackStart(item, session.Id);
                }
            }
            else if (string.Equals(message.MessageType, "PlaybackProgress", StringComparison.OrdinalIgnoreCase))
            {
                var session = _sessionManager.Sessions.FirstOrDefault(i => i.WebSockets.Contains(message.Connection));

                if (session != null && session.User != null)
                {
                    var vals = message.Data.Split('|');

                    var item = _dtoService.GetItemByDtoId(vals[0]);

                    long?positionTicks = null;

                    if (vals.Length > 1)
                    {
                        long pos;

                        if (long.TryParse(vals[1], out pos))
                        {
                            positionTicks = pos;
                        }
                    }

                    var isPaused = vals.Length > 2 && string.Equals(vals[2], "true", StringComparison.OrdinalIgnoreCase);
                    var isMuted  = vals.Length > 3 && string.Equals(vals[3], "true", StringComparison.OrdinalIgnoreCase);

                    _sessionManager.OnPlaybackProgress(item, positionTicks, isPaused, isMuted, session.Id);
                }
            }
            else if (string.Equals(message.MessageType, "PlaybackStopped", StringComparison.OrdinalIgnoreCase))
            {
                _logger.Debug("Received PlaybackStopped message");

                var session = _sessionManager.Sessions.FirstOrDefault(i => i.WebSockets.Contains(message.Connection));

                if (session != null && session.User != null)
                {
                    var vals = message.Data.Split('|');

                    var item = _dtoService.GetItemByDtoId(vals[0]);

                    long?positionTicks = null;

                    if (vals.Length > 1)
                    {
                        long pos;

                        if (long.TryParse(vals[1], out pos))
                        {
                            positionTicks = pos;
                        }
                    }

                    _sessionManager.OnPlaybackStopped(item, positionTicks, session.Id);
                }
            }

            return(_trueTaskResult);
        }