private MultiItemResolverResult ResolveMultiple <T>(Folder parent, IEnumerable <FileSystemMetadata> fileSystemEntries, IDirectoryService directoryService, string collectionType) where T : Game, new() { var gameSystem = parent as GameSystem ?? parent.FindParent <GameSystem>(); if (gameSystem == null) { return(null); } var files = new List <FileSystemMetadata>(); var items = new List <BaseItem>(); var leftOver = new List <FileSystemMetadata>(); // Loop through each child file/folder and see if we find a video foreach (var child in fileSystemEntries) { if (child.IsDirectory) { leftOver.Add(child); } else if (IsIgnored(child.Name)) { } else { var game = ResolveGame(child, gameSystem); if (game != null) { items.Add(game); } else { leftOver.Add(child); } } } var result = new MultiItemResolverResult { ExtraFiles = leftOver, Items = items }; return(result); }
private MultiItemResolverResult ResolveVideos <T>(Folder parent, IEnumerable <FileSystemMetadata> fileSystemEntries, IDirectoryService directoryService, bool suppportMultiEditions, string collectionType, bool parseName) where T : Video, new() { var files = new List <FileSystemMetadata>(); var videos = new List <BaseItem>(); var leftOver = new List <FileSystemMetadata>(); // Loop through each child file/folder and see if we find a video foreach (var child in fileSystemEntries) { // This is a hack but currently no better way to resolve a sometimes ambiguous situation if (string.IsNullOrWhiteSpace(collectionType)) { if (string.Equals(child.Name, "tvshow.nfo", StringComparison.OrdinalIgnoreCase) || string.Equals(child.Name, "season.nfo", StringComparison.OrdinalIgnoreCase)) { return(null); } } if (child.IsDirectory) { leftOver.Add(child); } else if (IsIgnored(child.Name)) { } else { files.Add(child); } } var namingOptions = ((LibraryManager)LibraryManager).GetNamingOptions(); var resolver = new VideoListResolver(namingOptions); var resolverResult = resolver.Resolve(files, suppportMultiEditions).ToList(); var result = new MultiItemResolverResult { ExtraFiles = leftOver, Items = videos }; var isInMixedFolder = resolverResult.Count > 1 || (parent != null && parent.IsTopParent); foreach (var video in resolverResult) { var firstVideo = video.Files.First(); var videoItem = new T { Path = video.Files[0].Path, IsInMixedFolder = isInMixedFolder, ProductionYear = video.Year, Name = parseName ? video.Name : Path.GetFileName(video.Files[0].Path), AdditionalParts = video.Files.Skip(1).Select(i => i.Path).ToArray(), LocalAlternateVersions = video.AlternateVersions.Select(i => i.Path).ToArray() }; SetVideoType(videoItem, firstVideo); Set3DFormat(videoItem, firstVideo); result.Items.Add(videoItem); } result.ExtraFiles.AddRange(files.Where(i => !ContainsFile(resolverResult, i))); return(result); }
private MultiItemResolverResult ResolveMultipleAudio <T>(Folder parent, IEnumerable <FileSystemMetadata> fileSystemEntries, IDirectoryService directoryService, bool suppportMultiEditions, string collectionType, bool parseName) where T : MediaBrowser.Controller.Entities.Audio.Audio, new() { var files = new List <FileSystemMetadata>(); var items = new List <BaseItem>(); var leftOver = new List <FileSystemMetadata>(); // Loop through each child file/folder and see if we find a video foreach (var child in fileSystemEntries) { if (child.IsDirectory) { leftOver.Add(child); } else if (!IsIgnored(child.Name)) { files.Add(child); } } var namingOptions = ((LibraryManager)LibraryManager).GetNamingOptions(); var resolver = new AudioBookListResolver(namingOptions); var resolverResult = resolver.Resolve(files).ToList(); var result = new MultiItemResolverResult { ExtraFiles = leftOver, Items = items }; var isInMixedFolder = resolverResult.Count > 1 || (parent != null && parent.IsTopParent); foreach (var resolvedItem in resolverResult) { if (resolvedItem.Files.Count > 1) { // For now, until we sort out naming for multi-part books continue; } var firstMedia = resolvedItem.Files.First(); var libraryItem = new T { Path = firstMedia.Path, IsInMixedFolder = isInMixedFolder, ProductionYear = resolvedItem.Year, Name = parseName ? resolvedItem.Name : Path.GetFileNameWithoutExtension(firstMedia.Path), //AdditionalParts = resolvedItem.Files.Skip(1).Select(i => i.Path).ToArray(), //LocalAlternateVersions = resolvedItem.AlternateVersions.Select(i => i.Path).ToArray() }; result.Items.Add(libraryItem); } result.ExtraFiles.AddRange(files.Where(i => !ContainsFile(resolverResult, i))); return(result); }
private MultiItemResolverResult ResolveVideos <T>( Folder parent, IEnumerable <FileSystemMetadata> fileSystemEntries, bool supportMultiEditions, string collectionType, bool parseName) where T : Video, new() { var files = new List <FileSystemMetadata>(); var leftOver = new List <FileSystemMetadata>(); var hasCollectionType = !string.IsNullOrEmpty(collectionType); // Loop through each child file/folder and see if we find a video foreach (var child in fileSystemEntries) { // This is a hack but currently no better way to resolve a sometimes ambiguous situation if (!hasCollectionType) { if (string.Equals(child.Name, "tvshow.nfo", StringComparison.OrdinalIgnoreCase) || string.Equals(child.Name, "season.nfo", StringComparison.OrdinalIgnoreCase)) { return(null); } } if (child.IsDirectory) { leftOver.Add(child); } else if (!IsIgnored(child.Name)) { files.Add(child); } } var resolverResult = VideoListResolver.Resolve(files, NamingOptions, supportMultiEditions, parseName); var result = new MultiItemResolverResult { ExtraFiles = leftOver }; var isInMixedFolder = resolverResult.Count > 1 || parent?.IsTopParent == true; foreach (var video in resolverResult) { var firstVideo = video.Files[0]; var path = firstVideo.Path; if (video.ExtraType != null) { result.ExtraFiles.Add(files.Find(f => string.Equals(f.FullName, path, StringComparison.OrdinalIgnoreCase))); continue; } var additionalParts = video.Files.Count > 1 ? video.Files.Skip(1).Select(i => i.Path).ToArray() : Array.Empty <string>(); var videoItem = new T { Path = path, IsInMixedFolder = isInMixedFolder, ProductionYear = video.Year, Name = parseName ? video.Name : firstVideo.Name, AdditionalParts = additionalParts, LocalAlternateVersions = video.AlternateVersions.Select(i => i.Path).ToArray() }; SetVideoType(videoItem, firstVideo); Set3DFormat(videoItem, firstVideo); result.Items.Add(videoItem); } result.ExtraFiles.AddRange(files.Where(i => !ContainsFile(resolverResult, i))); return(result); }
private MultiItemResolverResult ResolveVideos <T>(Folder parent, IEnumerable <FileSystemInfo> fileSystemEntries, IDirectoryService directoryService, string collectionType, bool suppportMultiEditions) where T : Video, new() { var files = new List <FileSystemInfo>(); var videos = new List <BaseItem>(); var leftOver = new List <FileSystemInfo>(); // Loop through each child file/folder and see if we find a video foreach (var child in fileSystemEntries) { if ((child.Attributes & FileAttributes.Directory) == FileAttributes.Directory) { leftOver.Add(child); } else if (IsIgnored(child.Name)) { } else { files.Add(child); } } var namingOptions = ((LibraryManager)LibraryManager).GetNamingOptions(); var resolver = new VideoListResolver(namingOptions, new PatternsLogger()); var resolverResult = resolver.Resolve(files.Select(i => new FileMetadata { Id = i.FullName, IsFolder = false }).ToList(), suppportMultiEditions).ToList(); var result = new MultiItemResolverResult { ExtraFiles = leftOver, Items = videos }; var isInMixedFolder = resolverResult.Count > 1; foreach (var video in resolverResult) { var firstVideo = video.Files.First(); var videoItem = new T { Path = video.Files[0].Path, IsInMixedFolder = isInMixedFolder, ProductionYear = video.Year, Name = video.Name, AdditionalParts = video.Files.Skip(1).Select(i => i.Path).ToList(), LocalAlternateVersions = video.AlternateVersions.Select(i => i.Path).ToList() }; SetVideoType(videoItem, firstVideo); Set3DFormat(videoItem, firstVideo); result.Items.Add(videoItem); } return(result); }