diff options
Diffstat (limited to 'MediaBrowser.Server.Implementations/Library/LibraryManager.cs')
| -rw-r--r-- | MediaBrowser.Server.Implementations/Library/LibraryManager.cs | 150 |
1 files changed, 65 insertions, 85 deletions
diff --git a/MediaBrowser.Server.Implementations/Library/LibraryManager.cs b/MediaBrowser.Server.Implementations/Library/LibraryManager.cs index dfddae24d..9c3255833 100644 --- a/MediaBrowser.Server.Implementations/Library/LibraryManager.cs +++ b/MediaBrowser.Server.Implementations/Library/LibraryManager.cs @@ -17,6 +17,7 @@ using MediaBrowser.Model.Entities; using MediaBrowser.Model.Logging; using MediaBrowser.Naming.Audio; using MediaBrowser.Naming.Common; +using MediaBrowser.Naming.IO; using MediaBrowser.Naming.Video; using MediaBrowser.Server.Implementations.Library.Resolvers.TV; using MediaBrowser.Server.Implementations.Library.Validators; @@ -1700,82 +1701,40 @@ namespace MediaBrowser.Server.Implementations.Library }; } - public IEnumerable<FileSystemInfo> GetAdditionalParts(string file, - VideoType type, - IEnumerable<FileSystemInfo> files) - { - var resolver = new StackResolver(new ExtendedNamingOptions(), new Naming.Logging.NullLogger()); - - StackResult result; - List<FileSystemInfo> filteredFiles; - - if (type == VideoType.BluRay || type == VideoType.Dvd) - { - filteredFiles = files.Where(i => (i.Attributes & FileAttributes.Directory) == FileAttributes.Directory) - .ToList(); - - result = resolver.ResolveDirectories(filteredFiles.Select(i => i.FullName)); - } - else - { - filteredFiles = files.Where(i => (i.Attributes & FileAttributes.Directory) != FileAttributes.Directory) - .ToList(); - - result = resolver.ResolveFiles(filteredFiles.Select(i => i.FullName)); - } - - var stack = result.Stacks - .FirstOrDefault(i => i.Files.Contains(file, StringComparer.OrdinalIgnoreCase)); - - if (stack != null) - { - return stack.Files.Where(i => !string.Equals(i, file, StringComparison.OrdinalIgnoreCase)) - .Select(i => filteredFiles.FirstOrDefault(f => string.Equals(i, f.FullName, StringComparison.OrdinalIgnoreCase))) - .Where(i => i != null); - } - - return new List<FileSystemInfo>(); - } - - public IEnumerable<Trailer> FindTrailers(BaseItem owner, List<FileSystemInfo> fileSystemChildren, IDirectoryService directoryService) + public IEnumerable<Video> FindTrailers(BaseItem owner, List<FileSystemInfo> fileSystemChildren, IDirectoryService directoryService) { var files = fileSystemChildren.OfType<DirectoryInfo>() .Where(i => string.Equals(i.Name, BaseItem.TrailerFolderName, StringComparison.OrdinalIgnoreCase)) .SelectMany(i => i.EnumerateFiles("*", SearchOption.TopDirectoryOnly)) .ToList(); - var extraTypes = new List<ExtraType> { ExtraType.Trailer }; - var suffixes = BaseItem.ExtraSuffixes.Where(i => extraTypes.Contains(i.Value)) - .Select(i => i.Key) - .ToList(); + var videoListResolver = new VideoListResolver(new ExtendedNamingOptions(), new Naming.Logging.NullLogger()); - files.AddRange(fileSystemChildren.OfType<FileInfo>() - .Where(i => - { - var nameEithoutExtension = _fileSystem.GetFileNameWithoutExtension(i); + var videos = videoListResolver.Resolve(fileSystemChildren.Select(i => new PortableFileInfo + { + FullName = i.FullName, + Type = GetFileType(i) - if (!suffixes.Any(s => nameEithoutExtension.EndsWith(s, StringComparison.OrdinalIgnoreCase))) - { - return false; - } + }).ToList()); - return !string.Equals(owner.Path, i.FullName, StringComparison.OrdinalIgnoreCase); - })); + var currentVideo = videos.FirstOrDefault(i => string.Equals(owner.Path, i.Files.First().Path, StringComparison.OrdinalIgnoreCase)); - return ResolvePaths<Trailer>(files, directoryService, null).Select(video => + if (currentVideo != null) + { + files.AddRange(currentVideo.Extras.Where(i => string.Equals(i.ExtraType, "trailer", StringComparison.OrdinalIgnoreCase)).Select(i => new FileInfo(i.Path))); + } + + return ResolvePaths<Video>(files, directoryService, null).Select(video => { // Try to retrieve it from the db. If we don't find it, use the resolved version - var dbItem = GetItemById(video.Id) as Trailer; + var dbItem = GetItemById(video.Id) as Video; if (dbItem != null) { video = dbItem; } - if (video != null) - { - video.ExtraType = ExtraType.Trailer; - } + video.ExtraType = ExtraType.Trailer; return video; @@ -1783,6 +1742,16 @@ namespace MediaBrowser.Server.Implementations.Library }).OrderBy(i => i.Path).ToList(); } + private FileInfoType GetFileType(FileSystemInfo info) + { + if ((info.Attributes & FileAttributes.Directory) == FileAttributes.Directory) + { + return FileInfoType.Directory; + } + + return FileInfoType.File; + } + public IEnumerable<Video> FindExtras(BaseItem owner, List<FileSystemInfo> fileSystemChildren, IDirectoryService directoryService) { var files = fileSystemChildren.OfType<DirectoryInfo>() @@ -1790,23 +1759,21 @@ namespace MediaBrowser.Server.Implementations.Library .SelectMany(i => i.EnumerateFiles("*", SearchOption.TopDirectoryOnly)) .ToList(); - var extraTypes = new List<ExtraType> { ExtraType.BehindTheScenes, ExtraType.DeletedScene, ExtraType.Interview, ExtraType.Sample, ExtraType.Scene, ExtraType.Clip }; - var suffixes = BaseItem.ExtraSuffixes.Where(i => extraTypes.Contains(i.Value)) - .Select(i => i.Key) - .ToList(); + var videoListResolver = new VideoListResolver(new ExtendedNamingOptions(), new Naming.Logging.NullLogger()); - files.AddRange(fileSystemChildren.OfType<FileInfo>() - .Where(i => - { - var nameEithoutExtension = _fileSystem.GetFileNameWithoutExtension(i); + var videos = videoListResolver.Resolve(fileSystemChildren.Select(i => new PortableFileInfo + { + FullName = i.FullName, + Type = GetFileType(i) - if (!suffixes.Any(s => nameEithoutExtension.EndsWith(s, StringComparison.OrdinalIgnoreCase))) - { - return false; - } + }).ToList()); - return !string.Equals(owner.Path, i.FullName, StringComparison.OrdinalIgnoreCase); - })); + var currentVideo = videos.FirstOrDefault(i => string.Equals(owner.Path, i.Files.First().Path, StringComparison.OrdinalIgnoreCase)); + + if (currentVideo != null) + { + files.AddRange(currentVideo.Extras.Where(i => !string.Equals(i.ExtraType, "trailer", StringComparison.OrdinalIgnoreCase)).Select(i => new FileInfo(i.Path))); + } return ResolvePaths<Video>(files, directoryService, null).Select(video => { @@ -1818,10 +1785,7 @@ namespace MediaBrowser.Server.Implementations.Library video = dbItem; } - if (video != null) - { - SetExtraTypeFromFilename(video); - } + SetExtraTypeFromFilename(video); return video; @@ -1831,18 +1795,34 @@ namespace MediaBrowser.Server.Implementations.Library private void SetExtraTypeFromFilename(Video item) { - var name = System.IO.Path.GetFileNameWithoutExtension(item.Path) ?? string.Empty; + var resolver = new ExtraResolver(new ExtendedNamingOptions(), new Naming.Logging.NullLogger()); - foreach (var suffix in BaseItem.ExtraSuffixes) + var result = resolver.GetExtraInfo(item.Path); + + if (string.Equals(result.ExtraType, "deletedscene", StringComparison.OrdinalIgnoreCase)) { - if (name.EndsWith(suffix.Key, StringComparison.OrdinalIgnoreCase)) - { - item.ExtraType = suffix.Value; - return; - } + item.ExtraType = ExtraType.DeletedScene; + } + else if (string.Equals(result.ExtraType, "behindthescenes", StringComparison.OrdinalIgnoreCase)) + { + item.ExtraType = ExtraType.BehindTheScenes; + } + else if (string.Equals(result.ExtraType, "interview", StringComparison.OrdinalIgnoreCase)) + { + item.ExtraType = ExtraType.Interview; + } + else if (string.Equals(result.ExtraType, "scene", StringComparison.OrdinalIgnoreCase)) + { + item.ExtraType = ExtraType.Scene; + } + else if (string.Equals(result.ExtraType, "sample", StringComparison.OrdinalIgnoreCase)) + { + item.ExtraType = ExtraType.Sample; + } + else + { + item.ExtraType = ExtraType.Clip; } - - item.ExtraType = ExtraType.Clip; } } } |
