using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; using System.Threading.Tasks; using MediaBrowser.Controller.Resolvers; using MediaBrowser.Controller.Library; namespace MediaBrowser.Controller.IO { public static class FileSystemHelper { /// /// Transforms shortcuts into their actual paths and filters out items that should be ignored /// public static ItemResolveEventArgs FilterChildFileSystemEntries(ItemResolveEventArgs args, bool flattenShortcuts) { List returnChildren = new List(); List resolvedShortcuts = new List(); foreach (var file in args.FileSystemChildren) { // If it's a shortcut, resolve it if (Shortcut.IsShortcut(file.Path)) { string newPath = Shortcut.ResolveShortcut(file.Path); WIN32_FIND_DATA newPathData = FileData.GetFileData(newPath); // Find out if the shortcut is pointing to a directory or file if (newPathData.IsDirectory) { // add to our physical locations args.AdditionalLocations.Add(newPath); // If we're flattening then get the shortcut's children if (flattenShortcuts) { returnChildren.Add(file); ItemResolveEventArgs newArgs = new ItemResolveEventArgs() { FileSystemChildren = FileData.GetFileSystemEntries(newPath, "*").ToArray() }; resolvedShortcuts.AddRange(FilterChildFileSystemEntries(newArgs, false).FileSystemChildren); } else { returnChildren.Add(newPathData); } } else { returnChildren.Add(newPathData); } } else { //not a shortcut check to see if we should filter it out if (EntityResolutionHelper.ShouldResolvePath(file)) { returnChildren.Add(file); } else { //filtered - see if it is one of our "indicator" folders and mark it now - no reason to search for it again args.IsBDFolder |= file.cFileName.Equals("bdmv", StringComparison.OrdinalIgnoreCase); args.IsDVDFolder |= file.cFileName.Equals("video_ts", StringComparison.OrdinalIgnoreCase); args.IsHDDVDFolder |= file.cFileName.Equals("hvdvd_ts", StringComparison.OrdinalIgnoreCase); //and check to see if it is a metadata folder and collect contents now if so if (IsMetadataFolder(file.cFileName)) { args.MetadataFiles = Directory.GetFiles(Path.Combine(args.Path, "metadata"), "*", SearchOption.TopDirectoryOnly); } } } } if (resolvedShortcuts.Count > 0) { resolvedShortcuts.InsertRange(0, returnChildren); args.FileSystemChildren = resolvedShortcuts.ToArray(); } else { args.FileSystemChildren = returnChildren.ToArray(); } return args; } public static bool IsMetadataFolder(string path) { return path.TrimEnd('\\').EndsWith("metadata", StringComparison.OrdinalIgnoreCase); } public static bool IsVideoFile(string path) { string extension = System.IO.Path.GetExtension(path).ToLower(); switch (extension) { case ".mkv": case ".m2ts": case ".iso": case ".ts": case ".rmvb": case ".mov": case ".avi": case ".mpg": case ".mpeg": case ".wmv": case ".mp4": case ".divx": case ".dvr-ms": case ".wtv": case ".ogm": case ".ogv": case ".asf": case ".m4v": case ".flv": case ".f4v": case ".3gp": return true; default: return false; } } } }