diff options
| author | Luke Pulverenti <luke.pulverenti@gmail.com> | 2014-03-19 00:59:45 -0400 |
|---|---|---|
| committer | Luke Pulverenti <luke.pulverenti@gmail.com> | 2014-03-19 00:59:45 -0400 |
| commit | 683d8455c6ce75bcefc8749fe5a5d15d90a28625 (patch) | |
| tree | ecae2ce3365c839d20756545c83f4cf246f9c88c | |
| parent | 94f5ba6ce6cc46c2918dbb74c3bbb7d5ee554699 (diff) | |
#712 - Group multiple versions
| -rw-r--r-- | MediaBrowser.Api/Movies/MoviesService.cs | 5 | ||||
| -rw-r--r-- | MediaBrowser.Api/Movies/TrailersService.cs | 5 | ||||
| -rw-r--r-- | MediaBrowser.Api/TvShowsService.cs | 2 | ||||
| -rw-r--r-- | MediaBrowser.Api/UserLibrary/ItemsService.cs | 4 | ||||
| -rw-r--r-- | MediaBrowser.Api/VideosService.cs | 180 | ||||
| -rw-r--r-- | MediaBrowser.Controller/Dto/IDtoService.cs | 8 | ||||
| -rw-r--r-- | MediaBrowser.Controller/Library/ILibraryManager.cs | 7 | ||||
| -rw-r--r-- | MediaBrowser.Model.Portable/MediaBrowser.Model.Portable.csproj | 3 | ||||
| -rw-r--r-- | MediaBrowser.Model.net35/MediaBrowser.Model.net35.csproj | 3 | ||||
| -rw-r--r-- | MediaBrowser.Model/Dto/AlternateVersionInfo.cs | 30 | ||||
| -rw-r--r-- | MediaBrowser.Model/MediaBrowser.Model.csproj | 1 | ||||
| -rw-r--r-- | MediaBrowser.Server.Implementations/Dto/DtoService.cs | 2 | ||||
| -rw-r--r-- | MediaBrowser.Server.Implementations/Library/LibraryManager.cs | 24 |
13 files changed, 242 insertions, 32 deletions
diff --git a/MediaBrowser.Api/Movies/MoviesService.cs b/MediaBrowser.Api/Movies/MoviesService.cs index 3360d9736..f9b760869 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 4e17bc7b5..057506635 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 9e58c9f53..a805b7b55 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<Episode>(); + 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 f70a21eaf..a787684bb 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 9dfeb216e..7d7baa576 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<ItemsResult> + public class GetAlternateVersions : IReturn<List<AlternateVersionInfo>> { - [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; } - /// <summary> /// Gets or sets the id. /// </summary> @@ -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; } /// <summary> @@ -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<Video>() .ToList(); if (items.Count < 2) @@ -176,7 +291,14 @@ namespace MediaBrowser.Api throw new ArgumentException("Please supply at least two videos to merge."); } - var videosWithVersions = items.Where(i => i.AlternateVersionCount > 0) + if (items.Any(i => !(i is Video))) + { + throw new ArgumentException("Only videos can be grouped together."); + } + + var videos = items.Cast<Video>().ToList(); + + var videosWithVersions = videos.Where(i => i.AlternateVersionCount > 0) .ToList(); if (videosWithVersions.Count > 1) @@ -188,7 +310,7 @@ namespace MediaBrowser.Api if (primaryVersion == null) { - primaryVersion = items.OrderByDescending(i => + primaryVersion = videos.OrderByDescending(i => { var stream = i.GetDefaultVideoStream(); @@ -198,7 +320,7 @@ namespace MediaBrowser.Api .First(); } - foreach (var item in items.Where(i => i.Id != primaryVersion.Id)) + foreach (var item in videos.Where(i => i.Id != primaryVersion.Id)) { item.PrimaryVersionId = primaryVersion.Id; diff --git a/MediaBrowser.Controller/Dto/IDtoService.cs b/MediaBrowser.Controller/Dto/IDtoService.cs index 606b51628..03039dc83 100644 --- a/MediaBrowser.Controller/Dto/IDtoService.cs +++ b/MediaBrowser.Controller/Dto/IDtoService.cs @@ -85,6 +85,14 @@ namespace MediaBrowser.Controller.Dto where T : BaseItem, IItemByName; /// <summary> + /// Gets the chapter information dto. + /// </summary> + /// <param name="chapterInfo">The chapter information.</param> + /// <param name="item">The item.</param> + /// <returns>ChapterInfoDto.</returns> + ChapterInfoDto GetChapterInfoDto(ChapterInfo chapterInfo, BaseItem item); + + /// <summary> /// Gets the item by name dto. /// </summary> /// <param name="item">The item.</param> diff --git a/MediaBrowser.Controller/Library/ILibraryManager.cs b/MediaBrowser.Controller/Library/ILibraryManager.cs index 9bde9aa29..680317237 100644 --- a/MediaBrowser.Controller/Library/ILibraryManager.cs +++ b/MediaBrowser.Controller/Library/ILibraryManager.cs @@ -324,6 +324,13 @@ namespace MediaBrowser.Controller.Library /// <param name="options">The options.</param> /// <returns>Task.</returns> Task DeleteItem(BaseItem item, DeleteOptions options); + + /// <summary> + /// Replaces the videos with primary versions. + /// </summary> + /// <param name="items">The items.</param> + /// <returns>IEnumerable{BaseItem}.</returns> + IEnumerable<BaseItem> ReplaceVideosWithPrimaryVersions(IEnumerable<BaseItem> items); } public static class LibraryManagerExtensions diff --git a/MediaBrowser.Model.Portable/MediaBrowser.Model.Portable.csproj b/MediaBrowser.Model.Portable/MediaBrowser.Model.Portable.csproj index 4a96c580c..acfaaed28 100644 --- a/MediaBrowser.Model.Portable/MediaBrowser.Model.Portable.csproj +++ b/MediaBrowser.Model.Portable/MediaBrowser.Model.Portable.csproj @@ -107,6 +107,9 @@ <Compile Include="..\MediaBrowser.Model\Drawing\ImageOutputFormat.cs"> <Link>Drawing\ImageOutputFormat.cs</Link> </Compile> + <Compile Include="..\MediaBrowser.Model\Dto\AlternateVersionInfo.cs"> + <Link>Dto\AlternateVersionInfo.cs</Link> + </Compile> <Compile Include="..\MediaBrowser.Model\Dto\BaseItemDto.cs"> <Link>Dto\BaseItemDto.cs</Link> </Compile> diff --git a/MediaBrowser.Model.net35/MediaBrowser.Model.net35.csproj b/MediaBrowser.Model.net35/MediaBrowser.Model.net35.csproj index 958a4a726..c956dad00 100644 --- a/MediaBrowser.Model.net35/MediaBrowser.Model.net35.csproj +++ b/MediaBrowser.Model.net35/MediaBrowser.Model.net35.csproj @@ -94,6 +94,9 @@ <Compile Include="..\MediaBrowser.Model\Drawing\ImageOutputFormat.cs"> <Link>Drawing\ImageOutputFormat.cs</Link> </Compile> + <Compile Include="..\MediaBrowser.Model\Dto\AlternateVersionInfo.cs"> + <Link>Dto\AlternateVersionInfo.cs</Link> + </Compile> <Compile Include="..\MediaBrowser.Model\Dto\BaseItemDto.cs"> <Link>Dto\BaseItemDto.cs</Link> </Compile> diff --git a/MediaBrowser.Model/Dto/AlternateVersionInfo.cs b/MediaBrowser.Model/Dto/AlternateVersionInfo.cs new file mode 100644 index 000000000..0cc41d6e4 --- /dev/null +++ b/MediaBrowser.Model/Dto/AlternateVersionInfo.cs @@ -0,0 +1,30 @@ +using MediaBrowser.Model.Entities; +using System.Collections.Generic; + +namespace MediaBrowser.Model.Dto +{ + public class AlternateVersionInfo + { + public string Id { get; set; } + + public string Path { get; set; } + + public LocationType LocationType { get; set; } + + public string Name { get; set; } + + public long? RunTimeTicks { get; set; } + + public VideoType? VideoType { get; set; } + + public IsoType? IsoType { get; set; } + + public Video3DFormat? Video3DFormat { get; set; } + + public List<MediaStream> MediaStreams { get; set; } + + public List<ChapterInfoDto> Chapters { get; set; } + + public bool? IsHD { get; set; } + } +} diff --git a/MediaBrowser.Model/MediaBrowser.Model.csproj b/MediaBrowser.Model/MediaBrowser.Model.csproj index cce3e74cc..47db8f7f2 100644 --- a/MediaBrowser.Model/MediaBrowser.Model.csproj +++ b/MediaBrowser.Model/MediaBrowser.Model.csproj @@ -76,6 +76,7 @@ <Compile Include="Dto\ItemCounts.cs" /> <Compile Include="Dto\ItemIndex.cs" /> <Compile Include="Dto\RecommendationDto.cs" /> + <Compile Include="Dto\AlternateVersionInfo.cs" /> <Compile Include="Entities\PackageReviewInfo.cs" /> <Compile Include="FileOrganization\FileOrganizationResult.cs" /> <Compile Include="FileOrganization\FileOrganizationQuery.cs" /> diff --git a/MediaBrowser.Server.Implementations/Dto/DtoService.cs b/MediaBrowser.Server.Implementations/Dto/DtoService.cs index 3aaf6eb80..a66cb148f 100644 --- a/MediaBrowser.Server.Implementations/Dto/DtoService.cs +++ b/MediaBrowser.Server.Implementations/Dto/DtoService.cs @@ -651,7 +651,7 @@ namespace MediaBrowser.Server.Implementations.Dto /// <param name="chapterInfo">The chapter info.</param> /// <param name="item">The item.</param> /// <returns>ChapterInfoDto.</returns> - private ChapterInfoDto GetChapterInfoDto(ChapterInfo chapterInfo, BaseItem item) + public ChapterInfoDto GetChapterInfoDto(ChapterInfo chapterInfo, BaseItem item) { var dto = new ChapterInfoDto { diff --git a/MediaBrowser.Server.Implementations/Library/LibraryManager.cs b/MediaBrowser.Server.Implementations/Library/LibraryManager.cs index 0b1947d4c..91abb6b4f 100644 --- a/MediaBrowser.Server.Implementations/Library/LibraryManager.cs +++ b/MediaBrowser.Server.Implementations/Library/LibraryManager.cs @@ -26,6 +26,7 @@ using System.IO; using System.Linq; using System.Threading; using System.Threading.Tasks; +using MoreLinq; using SortOrder = MediaBrowser.Model.Entities.SortOrder; namespace MediaBrowser.Server.Implementations.Library @@ -540,6 +541,29 @@ namespace MediaBrowser.Server.Implementations.Library return item; } + public IEnumerable<BaseItem> ReplaceVideosWithPrimaryVersions(IEnumerable<BaseItem> items) + { + return items.Select(i => + { + var video = i as Video; + + if (video != null) + { + if (video.PrimaryVersionId.HasValue) + { + var primary = GetItemById(video.PrimaryVersionId.Value) as Video; + + if (primary != null) + { + return primary; + } + } + } + + return i; + + }).DistinctBy(i => i.Id); + } /// <summary> /// Ensure supplied item has only one instance throughout |
