From 17106ea5c72511f5871178c7f1def629c20191ac Mon Sep 17 00:00:00 2001 From: ebr11 Eric Reed spam Date: Mon, 17 Sep 2012 11:12:43 -0400 Subject: Initial commit changing to on-demand child loading and validations --- MediaBrowser.Controller/IO/FileSystemHelper.cs | 86 ++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 MediaBrowser.Controller/IO/FileSystemHelper.cs (limited to 'MediaBrowser.Controller/IO/FileSystemHelper.cs') diff --git a/MediaBrowser.Controller/IO/FileSystemHelper.cs b/MediaBrowser.Controller/IO/FileSystemHelper.cs new file mode 100644 index 000000000..0a80a4d97 --- /dev/null +++ b/MediaBrowser.Controller/IO/FileSystemHelper.cs @@ -0,0 +1,86 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +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); + } + } + } + + if (resolvedShortcuts.Count > 0) + { + resolvedShortcuts.InsertRange(0, returnChildren); + args.FileSystemChildren = resolvedShortcuts.ToArray(); + } + else + { + args.FileSystemChildren = returnChildren.ToArray(); + } + return args; + } + + } +} -- cgit v1.2.3 From 68de4a65680ae1e7b6f7b4ab14901678bd1a154b Mon Sep 17 00:00:00 2001 From: ebr11 Eric Reed spam Date: Tue, 18 Sep 2012 16:20:27 -0400 Subject: Add HDDVD recognition --- MediaBrowser.Controller/IO/FileSystemHelper.cs | 1 + MediaBrowser.Controller/Library/ItemResolveEventArgs.cs | 1 + MediaBrowser.Controller/Resolvers/EntityResolutionHelper.cs | 4 +++- MediaBrowser.Controller/Resolvers/Movies/MovieResolver.cs | 8 ++++++++ MediaBrowser.Model/Entities/VideoType.cs | 3 ++- 5 files changed, 15 insertions(+), 2 deletions(-) (limited to 'MediaBrowser.Controller/IO/FileSystemHelper.cs') diff --git a/MediaBrowser.Controller/IO/FileSystemHelper.cs b/MediaBrowser.Controller/IO/FileSystemHelper.cs index 0a80a4d97..cafd64fcf 100644 --- a/MediaBrowser.Controller/IO/FileSystemHelper.cs +++ b/MediaBrowser.Controller/IO/FileSystemHelper.cs @@ -66,6 +66,7 @@ namespace MediaBrowser.Controller.IO //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); } } } diff --git a/MediaBrowser.Controller/Library/ItemResolveEventArgs.cs b/MediaBrowser.Controller/Library/ItemResolveEventArgs.cs index 4194517be..0a7c29d06 100644 --- a/MediaBrowser.Controller/Library/ItemResolveEventArgs.cs +++ b/MediaBrowser.Controller/Library/ItemResolveEventArgs.cs @@ -37,6 +37,7 @@ namespace MediaBrowser.Controller.Library public bool IsBDFolder { get; set; } public bool IsDVDFolder { get; set; } + public bool IsHDDVDFolder { get; set; } public WIN32_FIND_DATA? GetFileSystemEntry(string path) { diff --git a/MediaBrowser.Controller/Resolvers/EntityResolutionHelper.cs b/MediaBrowser.Controller/Resolvers/EntityResolutionHelper.cs index 7a09139fe..5b1365c6d 100644 --- a/MediaBrowser.Controller/Resolvers/EntityResolutionHelper.cs +++ b/MediaBrowser.Controller/Resolvers/EntityResolutionHelper.cs @@ -24,7 +24,9 @@ namespace MediaBrowser.Controller.Resolvers "video_ts", "audio_ts", "ps3_update", - "ps3_vprm" + "ps3_vprm", + "adv_obj", + "hvdvd_ts" }; /// /// Determines whether a path should be resolved or ignored entirely - called before we even look at the contents diff --git a/MediaBrowser.Controller/Resolvers/Movies/MovieResolver.cs b/MediaBrowser.Controller/Resolvers/Movies/MovieResolver.cs index e29af64f8..825850b20 100644 --- a/MediaBrowser.Controller/Resolvers/Movies/MovieResolver.cs +++ b/MediaBrowser.Controller/Resolvers/Movies/MovieResolver.cs @@ -79,6 +79,14 @@ namespace MediaBrowser.Controller.Resolvers.Movies VideoType = VideoType.BluRay }; } + else if (args.IsHDDVDFolder) + { + return new Movie() + { + Path = args.Path, + VideoType = VideoType.HdDvd + }; + } // Loop through each child file/folder and see if we find a video foreach (var child in args.FileSystemChildren) diff --git a/MediaBrowser.Model/Entities/VideoType.cs b/MediaBrowser.Model/Entities/VideoType.cs index b30b14690..0d46ff770 100644 --- a/MediaBrowser.Model/Entities/VideoType.cs +++ b/MediaBrowser.Model/Entities/VideoType.cs @@ -6,6 +6,7 @@ namespace MediaBrowser.Model.Entities VideoFile, Iso, Dvd, - BluRay + BluRay, + HdDvd } } -- cgit v1.2.3 From 2c563ac92f28fbe6804219ace6a1767f88ac52cd Mon Sep 17 00:00:00 2001 From: ebr11 Eric Reed spam Date: Tue, 18 Sep 2012 17:07:01 -0400 Subject: Hopefully the last of dealing with the metadata folder --- MediaBrowser.Controller/IO/FileSystemHelper.cs | 33 ++++++++++++++++++++ MediaBrowser.Controller/Kernel.cs | 4 +-- .../Library/ItemResolveEventArgs.cs | 8 +++++ .../Resolvers/EntityResolutionHelper.cs | 5 +++ .../Resolvers/FolderResolver.cs | 2 +- .../Resolvers/TV/SeasonResolver.cs | 2 +- MediaBrowser.Controller/Resolvers/TV/TVUtils.cs | 2 +- MediaBrowser.Controller/Resolvers/VideoResolver.cs | 36 ++-------------------- 8 files changed, 53 insertions(+), 39 deletions(-) (limited to 'MediaBrowser.Controller/IO/FileSystemHelper.cs') diff --git a/MediaBrowser.Controller/IO/FileSystemHelper.cs b/MediaBrowser.Controller/IO/FileSystemHelper.cs index cafd64fcf..2897150a8 100644 --- a/MediaBrowser.Controller/IO/FileSystemHelper.cs +++ b/MediaBrowser.Controller/IO/FileSystemHelper.cs @@ -83,5 +83,38 @@ namespace MediaBrowser.Controller.IO return args; } + 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; + } + } } } diff --git a/MediaBrowser.Controller/Kernel.cs b/MediaBrowser.Controller/Kernel.cs index 1daa43dcd..c61473784 100644 --- a/MediaBrowser.Controller/Kernel.cs +++ b/MediaBrowser.Controller/Kernel.cs @@ -200,10 +200,10 @@ namespace MediaBrowser.Controller DirectoryWatchers.Start(); //Task.Delay(30000); //let's wait and see if more data gets filled in... var allChildren = RootFolder.RecursiveChildren; - Logger.LogInfo(string.Format("Loading complete. Movies: {0} Episodes: {1}", allChildren.OfType().Count(), allChildren.OfType().Count())); + Logger.LogDebugInfo(string.Format("Loading complete. Movies: {0} Episodes: {1} Folders: {2}", allChildren.OfType().Count(), allChildren.OfType().Count(), allChildren.Where(i => i is Folder && !(i is Series || i is Season)).Count())); foreach (var child in allChildren) { - Logger.LogDebugInfo("(" + child.GetType().Name + ") " + child.Name + " Overview " + (child.Overview != null ? child.Overview.Substring(0,Math.Min(25,child.Overview.Length)): "") + " (" + child.Path + ")"); + Logger.LogDebugInfo("(" + child.GetType().Name + ") " + child.Name + " (" + child.Path + ")"); } } diff --git a/MediaBrowser.Controller/Library/ItemResolveEventArgs.cs b/MediaBrowser.Controller/Library/ItemResolveEventArgs.cs index 0a7c29d06..02cffcf0f 100644 --- a/MediaBrowser.Controller/Library/ItemResolveEventArgs.cs +++ b/MediaBrowser.Controller/Library/ItemResolveEventArgs.cs @@ -39,6 +39,14 @@ namespace MediaBrowser.Controller.Library public bool IsDVDFolder { get; set; } public bool IsHDDVDFolder { get; set; } + public bool IsMetadataFolder + { + get + { + return this.FileInfo.cFileName.Equals("metadata", StringComparison.OrdinalIgnoreCase); + } + } + public WIN32_FIND_DATA? GetFileSystemEntry(string path) { WIN32_FIND_DATA entry = FileSystemChildren.FirstOrDefault(f => f.Path.Equals(path, StringComparison.OrdinalIgnoreCase)); diff --git a/MediaBrowser.Controller/Resolvers/EntityResolutionHelper.cs b/MediaBrowser.Controller/Resolvers/EntityResolutionHelper.cs index 5b1365c6d..043453bc0 100644 --- a/MediaBrowser.Controller/Resolvers/EntityResolutionHelper.cs +++ b/MediaBrowser.Controller/Resolvers/EntityResolutionHelper.cs @@ -62,6 +62,11 @@ namespace MediaBrowser.Controller.Resolvers // Ignore any folders containing a file called .ignore resolve = false; } + else if (args.IsMetadataFolder) + { + // Don't retrieve these children here - we'll get them in the season resolver + resolve = false; + } return resolve; } diff --git a/MediaBrowser.Controller/Resolvers/FolderResolver.cs b/MediaBrowser.Controller/Resolvers/FolderResolver.cs index 3c6083c5d..b34d8163b 100644 --- a/MediaBrowser.Controller/Resolvers/FolderResolver.cs +++ b/MediaBrowser.Controller/Resolvers/FolderResolver.cs @@ -14,7 +14,7 @@ namespace MediaBrowser.Controller.Resolvers protected override Folder Resolve(ItemResolveEventArgs args) { - if (args.IsDirectory && !args.FileInfo.cFileName.Equals("metadata",System.StringComparison.OrdinalIgnoreCase)) + if (args.IsDirectory && !args.IsMetadataFolder) { return new Folder() { PhysicalLocations = args.PhysicalLocations }; } diff --git a/MediaBrowser.Controller/Resolvers/TV/SeasonResolver.cs b/MediaBrowser.Controller/Resolvers/TV/SeasonResolver.cs index 528a55ae4..d01e1ce31 100644 --- a/MediaBrowser.Controller/Resolvers/TV/SeasonResolver.cs +++ b/MediaBrowser.Controller/Resolvers/TV/SeasonResolver.cs @@ -10,7 +10,7 @@ namespace MediaBrowser.Controller.Resolvers.TV { protected override Season Resolve(ItemResolveEventArgs args) { - if (args.Parent is Series && args.IsDirectory) + if (args.Parent is Series && args.IsDirectory && !args.IsMetadataFolder) { var season = new Season { }; diff --git a/MediaBrowser.Controller/Resolvers/TV/TVUtils.cs b/MediaBrowser.Controller/Resolvers/TV/TVUtils.cs index c40f3fa63..ec3305e16 100644 --- a/MediaBrowser.Controller/Resolvers/TV/TVUtils.cs +++ b/MediaBrowser.Controller/Resolvers/TV/TVUtils.cs @@ -128,7 +128,7 @@ namespace MediaBrowser.Controller.Resolvers.TV } else { - if (!string.IsNullOrEmpty(EpisodeNumberFromFile(child.Path, false))) + if (FileSystemHelper.IsVideoFile(child.Path) && !string.IsNullOrEmpty(EpisodeNumberFromFile(child.Path, false))) { return true; } diff --git a/MediaBrowser.Controller/Resolvers/VideoResolver.cs b/MediaBrowser.Controller/Resolvers/VideoResolver.cs index e162fa509..bc3be5e43 100644 --- a/MediaBrowser.Controller/Resolvers/VideoResolver.cs +++ b/MediaBrowser.Controller/Resolvers/VideoResolver.cs @@ -1,6 +1,7 @@ using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Library; using MediaBrowser.Model.Entities; +using MediaBrowser.Controller.IO; using System.ComponentModel.Composition; using System.IO; @@ -29,7 +30,7 @@ namespace MediaBrowser.Controller.Resolvers // If the path is a file check for a matching extensions if (!args.IsDirectory) { - if (IsVideoFile(args.Path)) + if (FileSystemHelper.IsVideoFile(args.Path)) { VideoType type = Path.GetExtension(args.Path).EndsWith("iso", System.StringComparison.OrdinalIgnoreCase) ? VideoType.Iso : VideoType.VideoFile; @@ -95,38 +96,5 @@ namespace MediaBrowser.Controller.Resolvers return null; } - private static bool IsVideoFile(string path) - { - string extension = 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; - } - } } } -- cgit v1.2.3 From 6edc836ce591c466743a1d94a75cb3537c4835bd Mon Sep 17 00:00:00 2001 From: ebr11 Eric Reed spam Date: Wed, 19 Sep 2012 10:22:53 -0400 Subject: I lied - re-worked metadata folder handling again. Should now really only hit once and is available for other item types --- MediaBrowser.Controller/Entities/TV/Season.cs | 8 +++++++- MediaBrowser.Controller/IO/FileSystemHelper.cs | 12 ++++++++++++ MediaBrowser.Controller/Library/ItemResolveEventArgs.cs | 11 ++++------- MediaBrowser.Controller/Resolvers/EntityResolutionHelper.cs | 6 +----- MediaBrowser.Controller/Resolvers/FolderResolver.cs | 2 +- MediaBrowser.Controller/Resolvers/TV/SeasonResolver.cs | 5 +---- 6 files changed, 26 insertions(+), 18 deletions(-) (limited to 'MediaBrowser.Controller/IO/FileSystemHelper.cs') diff --git a/MediaBrowser.Controller/Entities/TV/Season.cs b/MediaBrowser.Controller/Entities/TV/Season.cs index 98ad31220..f9c7fecb3 100644 --- a/MediaBrowser.Controller/Entities/TV/Season.cs +++ b/MediaBrowser.Controller/Entities/TV/Season.cs @@ -7,7 +7,13 @@ namespace MediaBrowser.Controller.Entities.TV /// /// Store these to reduce disk access in Episode Resolver /// - public string[] MetadataFiles { get; set; } + public string[] MetadataFiles + { + get + { + return ResolveArgs.MetadataFiles ?? new string[] { }; + } + } /// /// Determines if the metafolder contains a given file diff --git a/MediaBrowser.Controller/IO/FileSystemHelper.cs b/MediaBrowser.Controller/IO/FileSystemHelper.cs index 2897150a8..732cf0803 100644 --- a/MediaBrowser.Controller/IO/FileSystemHelper.cs +++ b/MediaBrowser.Controller/IO/FileSystemHelper.cs @@ -2,6 +2,7 @@ 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; @@ -67,6 +68,12 @@ namespace MediaBrowser.Controller.IO 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); + } } } } @@ -83,6 +90,11 @@ namespace MediaBrowser.Controller.IO 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(); diff --git a/MediaBrowser.Controller/Library/ItemResolveEventArgs.cs b/MediaBrowser.Controller/Library/ItemResolveEventArgs.cs index 02cffcf0f..32b8783df 100644 --- a/MediaBrowser.Controller/Library/ItemResolveEventArgs.cs +++ b/MediaBrowser.Controller/Library/ItemResolveEventArgs.cs @@ -39,13 +39,10 @@ namespace MediaBrowser.Controller.Library public bool IsDVDFolder { get; set; } public bool IsHDDVDFolder { get; set; } - public bool IsMetadataFolder - { - get - { - return this.FileInfo.cFileName.Equals("metadata", StringComparison.OrdinalIgnoreCase); - } - } + /// + /// Store these to reduce disk access in Resolvers + /// + public string[] MetadataFiles { get; set; } public WIN32_FIND_DATA? GetFileSystemEntry(string path) { diff --git a/MediaBrowser.Controller/Resolvers/EntityResolutionHelper.cs b/MediaBrowser.Controller/Resolvers/EntityResolutionHelper.cs index ebb1f4103..b821f8801 100644 --- a/MediaBrowser.Controller/Resolvers/EntityResolutionHelper.cs +++ b/MediaBrowser.Controller/Resolvers/EntityResolutionHelper.cs @@ -18,6 +18,7 @@ namespace MediaBrowser.Controller.Resolvers public static List IgnoreFolders = new List() { "trailers", + "metadata", "bdmv", "certificate", "backup", @@ -62,11 +63,6 @@ namespace MediaBrowser.Controller.Resolvers // Ignore any folders containing a file called .ignore resolve = false; } - else if (args.IsMetadataFolder) - { - // I think this is redundant, but... - resolve = false; - } return resolve; } diff --git a/MediaBrowser.Controller/Resolvers/FolderResolver.cs b/MediaBrowser.Controller/Resolvers/FolderResolver.cs index b34d8163b..408e513d4 100644 --- a/MediaBrowser.Controller/Resolvers/FolderResolver.cs +++ b/MediaBrowser.Controller/Resolvers/FolderResolver.cs @@ -14,7 +14,7 @@ namespace MediaBrowser.Controller.Resolvers protected override Folder Resolve(ItemResolveEventArgs args) { - if (args.IsDirectory && !args.IsMetadataFolder) + if (args.IsDirectory) { return new Folder() { PhysicalLocations = args.PhysicalLocations }; } diff --git a/MediaBrowser.Controller/Resolvers/TV/SeasonResolver.cs b/MediaBrowser.Controller/Resolvers/TV/SeasonResolver.cs index d01e1ce31..0ad0782e0 100644 --- a/MediaBrowser.Controller/Resolvers/TV/SeasonResolver.cs +++ b/MediaBrowser.Controller/Resolvers/TV/SeasonResolver.cs @@ -10,15 +10,12 @@ namespace MediaBrowser.Controller.Resolvers.TV { protected override Season Resolve(ItemResolveEventArgs args) { - if (args.Parent is Series && args.IsDirectory && !args.IsMetadataFolder) + if (args.Parent is Series && args.IsDirectory) { var season = new Season { }; season.IndexNumber = TVUtils.GetSeasonNumberFromPath(args.Path); - // Gather these now so that the episode provider classes can utilize them instead of having to make their own file system calls - season.MetadataFiles = args.ContainsFolder("metadata") ? Directory.GetFiles(Path.Combine(args.Path, "metadata"), "*", SearchOption.TopDirectoryOnly) : new string[] { }; - return season; } -- cgit v1.2.3