From bf30936550a0b9be69e646a1b27988914ce9ec4a Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Sat, 15 Mar 2014 18:52:43 -0400 Subject: #712 - Support grouping multiple versions of a movie --- .../Library/Resolvers/Movies/MovieResolver.cs | 86 ++++++++++++++++++---- 1 file changed, 71 insertions(+), 15 deletions(-) (limited to 'MediaBrowser.Server.Implementations/Library/Resolvers') diff --git a/MediaBrowser.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs b/MediaBrowser.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs index 16c0d1a275..de10e669e2 100644 --- a/MediaBrowser.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs +++ b/MediaBrowser.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs @@ -10,6 +10,7 @@ using System; using System.Collections.Generic; using System.IO; using System.Linq; +using MediaBrowser.Model.Logging; namespace MediaBrowser.Server.Implementations.Library.Resolvers.Movies { @@ -20,11 +21,13 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers.Movies { private readonly IServerApplicationPaths _applicationPaths; private readonly ILibraryManager _libraryManager; + private readonly ILogger _logger; - public MovieResolver(IServerApplicationPaths appPaths, ILibraryManager libraryManager) + public MovieResolver(IServerApplicationPaths appPaths, ILibraryManager libraryManager, ILogger logger) { _applicationPaths = appPaths; _libraryManager = libraryManager; + _logger = logger; } /// @@ -76,29 +79,29 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers.Movies { if (string.Equals(collectionType, CollectionType.Trailers, StringComparison.OrdinalIgnoreCase)) { - return FindMovie(args.Path, args.Parent, args.FileSystemChildren, args.DirectoryService, false); + return FindMovie(args.Path, args.Parent, args.FileSystemChildren, args.DirectoryService, false, false); } if (string.Equals(collectionType, CollectionType.MusicVideos, StringComparison.OrdinalIgnoreCase)) { - return FindMovie(args.Path, args.Parent, args.FileSystemChildren, args.DirectoryService, false); + return FindMovie(args.Path, args.Parent, args.FileSystemChildren, args.DirectoryService, false, false); } if (string.Equals(collectionType, CollectionType.AdultVideos, StringComparison.OrdinalIgnoreCase)) { - return FindMovie(args.Path, args.Parent, args.FileSystemChildren, args.DirectoryService, true); + return FindMovie(args.Path, args.Parent, args.FileSystemChildren, args.DirectoryService, true, false); } if (string.Equals(collectionType, CollectionType.HomeVideos, StringComparison.OrdinalIgnoreCase)) { - return FindMovie /// The part count. public int? PartCount { get; set; } - public bool? HasAlternateVersions { get; set; } + public int? AlternateVersionCount { get; set; } + public string PrimaryVersionId { get; set; } /// /// Determines whether the specified type is type. diff --git a/MediaBrowser.Model/Session/PlayRequest.cs b/MediaBrowser.Model/Session/PlayRequest.cs index 57f6c37f57..949274a5d5 100644 --- a/MediaBrowser.Model/Session/PlayRequest.cs +++ b/MediaBrowser.Model/Session/PlayRequest.cs @@ -23,6 +23,12 @@ namespace MediaBrowser.Model.Session /// /// The play command. public PlayCommand PlayCommand { get; set; } + + /// + /// Gets or sets the controlling user identifier. + /// + /// The controlling user identifier. + public string ControllingUserId { get; set; } } /// diff --git a/MediaBrowser.Model/Session/PlaystateCommand.cs b/MediaBrowser.Model/Session/PlaystateCommand.cs index 918f4f70f4..b0dec66d4f 100644 --- a/MediaBrowser.Model/Session/PlaystateCommand.cs +++ b/MediaBrowser.Model/Session/PlaystateCommand.cs @@ -37,5 +37,11 @@ namespace MediaBrowser.Model.Session public PlaystateCommand Command { get; set; } public long? SeekPositionTicks { get; set; } + + /// + /// Gets or sets the controlling user identifier. + /// + /// The controlling user identifier. + public string ControllingUserId { get; set; } } } \ No newline at end of file diff --git a/MediaBrowser.Providers/All/LocalImageProvider.cs b/MediaBrowser.Providers/All/LocalImageProvider.cs index 6ef5f6bf37..1d10fcfa35 100644 --- a/MediaBrowser.Providers/All/LocalImageProvider.cs +++ b/MediaBrowser.Providers/All/LocalImageProvider.cs @@ -94,14 +94,13 @@ namespace MediaBrowser.Providers.All public List GetImages(IHasImages item, IEnumerable paths, IDirectoryService directoryService) { var files = paths.SelectMany(directoryService.GetFiles) - .Where(i => - { - var ext = i.Extension; - - return !string.IsNullOrEmpty(ext) && - BaseItem.SupportedImageExtensions.Contains(ext, StringComparer.OrdinalIgnoreCase); - }) - .Cast() + .Where(i => + { + var ext = i.Extension; + + return !string.IsNullOrEmpty(ext) && + BaseItem.SupportedImageExtensions.Contains(ext, StringComparer.OrdinalIgnoreCase); + }) .ToList(); var list = new List(); diff --git a/MediaBrowser.Server.Implementations/Collections/CollectionManager.cs b/MediaBrowser.Server.Implementations/Collections/CollectionManager.cs index 60d631c1ad..c188562935 100644 --- a/MediaBrowser.Server.Implementations/Collections/CollectionManager.cs +++ b/MediaBrowser.Server.Implementations/Collections/CollectionManager.cs @@ -111,6 +111,7 @@ namespace MediaBrowser.Server.Implementations.Collections } var list = new List(); + var currentLinkedChildren = collection.GetLinkedChildren().ToList(); foreach (var itemId in ids) { @@ -121,7 +122,7 @@ namespace MediaBrowser.Server.Implementations.Collections throw new ArgumentException("No item exists with the supplied Id"); } - if (collection.LinkedChildren.Any(i => i.ItemId.HasValue && i.ItemId == itemId)) + if (currentLinkedChildren.Any(i => i.Id == itemId)) { throw new ArgumentException("Item already exists in collection"); } diff --git a/MediaBrowser.Server.Implementations/Dto/DtoService.cs b/MediaBrowser.Server.Implementations/Dto/DtoService.cs index 6f6a3f0435..19d834c208 100644 --- a/MediaBrowser.Server.Implementations/Dto/DtoService.cs +++ b/MediaBrowser.Server.Implementations/Dto/DtoService.cs @@ -1082,7 +1082,12 @@ namespace MediaBrowser.Server.Implementations.Dto dto.IsHD = video.IsHD; dto.PartCount = video.AdditionalPartIds.Count + 1; - dto.HasAlternateVersions = video.HasAlternateVersions; + dto.AlternateVersionCount = video.AlternateVersionCount; + + if (video.PrimaryVersionId.HasValue) + { + dto.PrimaryVersionId = video.PrimaryVersionId.Value.ToString("N"); + } if (fields.Contains(ItemFields.Chapters)) { diff --git a/MediaBrowser.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs b/MediaBrowser.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs index de10e669e2..b11457ec54 100644 --- a/MediaBrowser.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs +++ b/MediaBrowser.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs @@ -410,7 +410,7 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers.Movies if (!string.IsNullOrWhiteSpace(filenamePrefix)) { - if (sortedMovies.All(i => Path.GetFileNameWithoutExtension(i.Path).StartsWith(filenamePrefix, StringComparison.OrdinalIgnoreCase))) + if (sortedMovies.Skip(1).All(i => Path.GetFileNameWithoutExtension(i.Path).StartsWith(filenamePrefix + " - ", StringComparison.OrdinalIgnoreCase))) { firstMovie.HasLocalAlternateVersions = true; diff --git a/MediaBrowser.Server.Implementations/Session/SessionManager.cs b/MediaBrowser.Server.Implementations/Session/SessionManager.cs index 71d95b97bd..cea70a8b4e 100644 --- a/MediaBrowser.Server.Implementations/Session/SessionManager.cs +++ b/MediaBrowser.Server.Implementations/Session/SessionManager.cs @@ -690,6 +690,11 @@ namespace MediaBrowser.Server.Implementations.Session } } + if (session.UserId.HasValue) + { + command.ControllingUserId = session.UserId.Value.ToString("N"); + } + return session.SessionController.SendPlayCommand(command, cancellationToken); } @@ -723,6 +728,11 @@ namespace MediaBrowser.Server.Implementations.Session throw new ArgumentException(string.Format("Session {0} is unable to seek.", session.Id)); } + if (session.UserId.HasValue) + { + command.ControllingUserId = session.UserId.Value.ToString("N"); + } + return session.SessionController.SendPlaystateCommand(command, cancellationToken); } -- cgit v1.2.3