using System; using System.Collections.Generic; using System.IO; using System.Linq; using MediaBrowser.Controller.Events; using MediaBrowser.Model.Entities; namespace MediaBrowser.Controller.Resolvers { public abstract class BaseItemResolver : IBaseItemResolver where T : BaseItem, new () { protected virtual T Resolve(ItemResolveEventArgs args) { return null; } /// /// Sets initial values on the newly resolved item /// protected virtual void SetItemValues(T item, ItemResolveEventArgs args) { // If the subclass didn't specify this if (string.IsNullOrEmpty(item.Path)) { item.Path = args.Path; } // If the subclass didn't specify this if (args.Parent != null) { item.Parent = args.Parent; } item.Id = Kernel.GetMD5(item.Path); PopulateImages(item, args); PopulateLocalTrailers(item, args); } public BaseItem ResolvePath(ItemResolveEventArgs args) { T item = Resolve(args); if (item != null) { // Set initial values on the newly resolved item SetItemValues(item, args); // Make sure the item has a name EnsureName(item); // Make sure DateCreated and DateModified have values EnsureDates(item); } return item; } private void EnsureName(T item) { // If the subclass didn't supply a name, add it here if (string.IsNullOrEmpty(item.Name)) { item.Name = Path.GetFileNameWithoutExtension(item.Path); } } /// /// Ensures DateCreated and DateModified have values /// private void EnsureDates(T item) { // If the subclass didn't supply dates, add them here if (item.DateCreated == DateTime.MinValue) { item.DateCreated = Path.IsPathRooted(item.Path) ? File.GetCreationTime(item.Path) : DateTime.Now; } if (item.DateModified == DateTime.MinValue) { item.DateModified = Path.IsPathRooted(item.Path) ? File.GetLastWriteTime(item.Path) : DateTime.Now; } } /// /// Fills in image paths based on files win the folder /// protected virtual void PopulateImages(T item, ItemResolveEventArgs args) { List backdropFiles = new List(); foreach (KeyValuePair file in args.FileSystemChildren) { if (file.Value.HasFlag(FileAttributes.Directory)) { continue; } string filePath = file.Key; string ext = Path.GetExtension(filePath); // Only support png and jpg files if (!ext.EndsWith("png", StringComparison.OrdinalIgnoreCase) && !ext.EndsWith("jpg", StringComparison.OrdinalIgnoreCase)) { continue; } string name = Path.GetFileNameWithoutExtension(filePath); if (name.Equals("folder", StringComparison.OrdinalIgnoreCase)) { item.PrimaryImagePath = filePath; } else if (name.StartsWith("backdrop", StringComparison.OrdinalIgnoreCase)) { backdropFiles.Add(filePath); } if (name.Equals("logo", StringComparison.OrdinalIgnoreCase)) { item.LogoImagePath = filePath; } if (name.Equals("banner", StringComparison.OrdinalIgnoreCase)) { item.BannerImagePath = filePath; } if (name.Equals("art", StringComparison.OrdinalIgnoreCase)) { item.ArtImagePath = filePath; } if (name.Equals("thumb", StringComparison.OrdinalIgnoreCase)) { item.ThumbnailImagePath = filePath; } } item.BackdropImagePaths = backdropFiles; } protected virtual void PopulateLocalTrailers(T item, ItemResolveEventArgs args) { var trailerPath = args.GetFolderByName("trailers"); if (trailerPath.HasValue) { string[] allFiles = Directory.GetFileSystemEntries(trailerPath.Value.Key, "*", SearchOption.TopDirectoryOnly); item.LocalTrailers = allFiles.Select(f => Kernel.Instance.ItemController.GetItem(f)).OfType