using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities.Movies; using MediaBrowser.Controller.IO; using MediaBrowser.Controller.Library; using MediaBrowser.Model.Entities; using System.ComponentModel.Composition; namespace MediaBrowser.Controller.Resolvers.Movies { [Export(typeof(IBaseItemResolver))] public class MovieResolver : BaseVideoResolver { protected override Movie Resolve(ItemResolveEventArgs args) { // Must be a directory and under a 'Movies' VF if (args.IsDirectory) { // If the parent is not a boxset, the only other allowed parent type is Folder if (!(args.Parent is BoxSet)) { if (args.Parent != null && args.Parent.GetType() != typeof(Folder)) { return null; } } // Optimization to avoid running all these tests against VF's if (args.Parent != null && args.Parent.IsRoot) { return null; } // Return a movie if the video resolver finds something in the folder return GetMovie(args); } return null; } protected override void SetInitialItemValues(Movie item, ItemResolveEventArgs args) { base.SetInitialItemValues(item, args); SetProviderIdFromPath(item); } private void SetProviderIdFromPath(Movie item) { const string srch = "[tmdbid="; int index = item.Path.IndexOf(srch, System.StringComparison.OrdinalIgnoreCase); if (index != -1) { string id = item.Path.Substring(index + srch.Length); id = id.Substring(0, id.IndexOf(']')); item.SetProviderId(MetadataProviders.Tmdb, id); } } private Movie GetMovie(ItemResolveEventArgs args) { // Loop through each child file/folder and see if we find a video for (var i = 0; i < args.FileSystemChildren.Length; i++) { var child = args.FileSystemChildren[i]; var childArgs = new ItemResolveEventArgs { FileInfo = child, FileSystemChildren = new WIN32_FIND_DATA[] { }, Path = child.Path }; var item = base.Resolve(childArgs); if (item != null) { return new Movie { Path = item.Path, VideoType = item.VideoType }; } } return null; } } }