示例#1
0
        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);
        }
示例#2
0
        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);
        }
示例#3
0
        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);
        }
示例#4
0
        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);
        }
示例#5
0
        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);
        }