diff --git a/MediaBrowser.Api/Movies/MoviesService.cs b/MediaBrowser.Api/Movies/MoviesService.cs index 3360d97363..f9b7608696 100644 --- a/MediaBrowser.Api/Movies/MoviesService.cs +++ b/MediaBrowser.Api/Movies/MoviesService.cs @@ -106,7 +106,10 @@ namespace MediaBrowser.Api.Movies _userDataRepository, _dtoService, Logger, - request, item => item is Movie || (item is Trailer && request.IncludeTrailers), + + // Strip out secondary versions + request, item => (item is Movie || (item is Trailer && request.IncludeTrailers)) && !((Video)item).PrimaryVersionId.HasValue, + SimilarItemsHelper.GetSimiliarityScore); return ToOptimizedSerializedResultUsingCache(result); diff --git a/MediaBrowser.Api/Movies/TrailersService.cs b/MediaBrowser.Api/Movies/TrailersService.cs index 4e17bc7b50..0575066350 100644 --- a/MediaBrowser.Api/Movies/TrailersService.cs +++ b/MediaBrowser.Api/Movies/TrailersService.cs @@ -66,7 +66,10 @@ namespace MediaBrowser.Api.Movies _userDataRepository, _dtoService, Logger, - request, item => item is Movie || item is Trailer, + + // Strip out secondary versions + request, item => (item is Movie || item is Trailer) && !((Video)item).PrimaryVersionId.HasValue, + SimilarItemsHelper.GetSimiliarityScore); return ToOptimizedSerializedResultUsingCache(result); diff --git a/MediaBrowser.Api/TvShowsService.cs b/MediaBrowser.Api/TvShowsService.cs index 9e58c9f53d..a805b7b551 100644 --- a/MediaBrowser.Api/TvShowsService.cs +++ b/MediaBrowser.Api/TvShowsService.cs @@ -532,6 +532,8 @@ namespace MediaBrowser.Api var fields = request.GetItemFields().ToList(); + episodes = _libraryManager.ReplaceVideosWithPrimaryVersions(episodes).Cast(); + var returnItems = episodes.Select(i => _dtoService.GetBaseItemDto(i, fields, user)) .ToArray(); diff --git a/MediaBrowser.Api/UserLibrary/ItemsService.cs b/MediaBrowser.Api/UserLibrary/ItemsService.cs index f70a21eaff..a787684bbf 100644 --- a/MediaBrowser.Api/UserLibrary/ItemsService.cs +++ b/MediaBrowser.Api/UserLibrary/ItemsService.cs @@ -392,12 +392,16 @@ namespace MediaBrowser.Api.UserLibrary items = user == null ? ((Folder)item).RecursiveChildren : ((Folder)item).GetRecursiveChildren(user); + + items = _libraryManager.ReplaceVideosWithPrimaryVersions(items); } else { items = user == null ? ((Folder)item).Children : ((Folder)item).GetChildren(user, true); + + items = _libraryManager.ReplaceVideosWithPrimaryVersions(items); } if (request.IncludeIndexContainers) diff --git a/MediaBrowser.Api/VideosService.cs b/MediaBrowser.Api/VideosService.cs index 9dfeb216e5..7d7baa5761 100644 --- a/MediaBrowser.Api/VideosService.cs +++ b/MediaBrowser.Api/VideosService.cs @@ -1,9 +1,15 @@ -using MediaBrowser.Controller.Dto; +using MediaBrowser.Common.IO; +using MediaBrowser.Controller.Configuration; +using MediaBrowser.Controller.Dto; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Library; +using MediaBrowser.Controller.Persistence; +using MediaBrowser.Model.Dto; +using MediaBrowser.Model.Entities; using MediaBrowser.Model.Querying; using ServiceStack; using System; +using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; @@ -27,11 +33,8 @@ namespace MediaBrowser.Api [Route("/Videos/{Id}/AlternateVersions", "GET")] [Api(Description = "Gets alternate versions of a video.")] - public class GetAlternateVersions : IReturn + public class GetAlternateVersions : IReturn> { - [ApiMember(Name = "UserId", Description = "Optional. Filter by user id, and attach user data", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")] - public Guid? UserId { get; set; } - /// /// Gets or sets the id. /// @@ -61,12 +64,18 @@ namespace MediaBrowser.Api private readonly ILibraryManager _libraryManager; private readonly IUserManager _userManager; private readonly IDtoService _dtoService; + private readonly IFileSystem _fileSystem; + private readonly IItemRepository _itemRepo; + private readonly IServerConfigurationManager _config; - public VideosService(ILibraryManager libraryManager, IUserManager userManager, IDtoService dtoService) + public VideosService(ILibraryManager libraryManager, IUserManager userManager, IDtoService dtoService, IItemRepository itemRepo, IFileSystem fileSystem, IServerConfigurationManager config) { _libraryManager = libraryManager; _userManager = userManager; _dtoService = dtoService; + _itemRepo = itemRepo; + _fileSystem = fileSystem; + _config = config; } /// @@ -106,34 +115,141 @@ namespace MediaBrowser.Api public object Get(GetAlternateVersions 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 item = _libraryManager.GetItemById(new Guid(request.Id)); var video = (Video)item; - var items = video.GetAlternateVersions() - .Select(i => _dtoService.GetBaseItemDto(i, fields, user, video)) - .ToArray(); + var items = video.GetAlternateVersions(); - var result = new ItemsResult + var result = items.Select(i => new AlternateVersionInfo { - Items = items, - TotalRecordCount = items.Length - }; + Chapters = _itemRepo.GetChapters(i.Id).Select(c => _dtoService.GetChapterInfoDto(c, i)).ToList(), + + Id = i.Id.ToString("N"), + IsoType = i.IsoType, + LocationType = i.LocationType, + MediaStreams = _itemRepo.GetMediaStreams(new MediaStreamQuery { ItemId = i.Id }).ToList(), + Name = GetAlternateVersionName(i), + Path = GetMappedPath(i), + RunTimeTicks = i.RunTimeTicks, + Video3DFormat = i.Video3DFormat, + VideoType = i.VideoType, + IsHD = i.IsHD + + }).ToList(); return ToOptimizedSerializedResultUsingCache(result); } + private string GetMappedPath(Video video) + { + var path = video.Path; + + var locationType = video.LocationType; + + if (locationType != LocationType.FileSystem && locationType != LocationType.Offline) + { + return path; + } + + foreach (var map in _config.Configuration.PathSubstitutions) + { + path = _fileSystem.SubstitutePath(path, map.From, map.To); + } + + return path; + } + + private string GetAlternateVersionName(Video video) + { + var name = ""; + + var stream = video.GetDefaultVideoStream(); + + if (video.Video3DFormat.HasValue) + { + name = "3D " + name; + name = name.Trim(); + } + + if (video.VideoType == VideoType.BluRay) + { + name = name + " " + "Bluray"; + name = name.Trim(); + } + else if (video.VideoType == VideoType.Dvd) + { + name = name + " " + "DVD"; + name = name.Trim(); + } + else if (video.VideoType == VideoType.HdDvd) + { + name = name + " " + "HD-DVD"; + name = name.Trim(); + } + else if (video.VideoType == VideoType.Iso) + { + if (video.IsoType.HasValue) + { + if (video.IsoType.Value == IsoType.BluRay) + { + name = name + " " + "Bluray"; + } + else if (video.IsoType.Value == IsoType.Dvd) + { + name = name + " " + "DVD"; + } + } + else + { + name = name + " " + "ISO"; + } + name = name.Trim(); + } + else if (video.VideoType == VideoType.VideoFile) + { + if (stream != null) + { + if (stream.Width.HasValue) + { + if (stream.Width.Value >= 1900) + { + name = name + " " + "1080P"; + name = name.Trim(); + } + else if (stream.Width.Value >= 1270) + { + name = name + " " + "720P"; + name = name.Trim(); + } + else if (stream.Width.Value >= 700) + { + name = name + " " + "480p"; + name = name.Trim(); + } + else + { + name = name + " " + "SD"; + name = name.Trim(); + } + } + } + } + + if (stream != null && !string.IsNullOrWhiteSpace(stream.Codec)) + { + name = name + " " + stream.Codec.ToUpper(); + name = name.Trim(); + } + + if (string.IsNullOrWhiteSpace(name)) + { + return video.Name; + } + + return name; + } + public void Delete(DeleteAlternateVersions request) { var task = RemoveAlternateVersions(request); @@ -168,7 +284,6 @@ namespace MediaBrowser.Api var items = request.Ids.Split(',') .Select(i => new Guid(i)) .Select(i => _libraryManager.GetItemById(i)) - .Cast