diff options
Diffstat (limited to 'MediaBrowser.Controller/Entities/BaseItem.cs')
| -rw-r--r-- | MediaBrowser.Controller/Entities/BaseItem.cs | 85 |
1 files changed, 63 insertions, 22 deletions
diff --git a/MediaBrowser.Controller/Entities/BaseItem.cs b/MediaBrowser.Controller/Entities/BaseItem.cs index 94fc76125..22efd3fba 100644 --- a/MediaBrowser.Controller/Entities/BaseItem.cs +++ b/MediaBrowser.Controller/Entities/BaseItem.cs @@ -17,6 +17,7 @@ using MediaBrowser.Model.Logging; using MediaBrowser.Model.Users; using System; using System.Collections.Generic; +using System.Globalization; using System.IO; using System.Linq; using System.Runtime.Serialization; @@ -44,7 +45,7 @@ namespace MediaBrowser.Controller.Entities /// <summary> /// The supported image extensions /// </summary> - public static readonly string[] SupportedImageExtensions = { ".png", ".jpg", ".jpeg", ".tbn" }; + public static readonly string[] SupportedImageExtensions = { ".png", ".jpg", ".jpeg" }; public static readonly List<string> SupportedImageExtensionsList = SupportedImageExtensions.ToList(); @@ -1144,6 +1145,11 @@ namespace MediaBrowser.Controller.Entities public virtual bool IsVisibleStandalone(User user) { + return IsVisibleStandaloneInternal(user, true); + } + + protected bool IsVisibleStandaloneInternal(User user, bool checkFolders) + { if (!IsVisible(user)) { return false; @@ -1154,7 +1160,23 @@ namespace MediaBrowser.Controller.Entities return false; } - // TODO: Need some work here, e.g. is in user library, for channels, can user access channel, etc. + if (checkFolders) + { + var topParent = Parents.LastOrDefault() ?? this; + + if (string.IsNullOrWhiteSpace(topParent.Path)) + { + return true; + } + + var userCollectionFolders = user.RootFolder.GetChildren(user, true).Select(i => i.Id).ToList(); + var itemCollectionFolders = LibraryManager.GetCollectionFolders(this).Select(i => i.Id); + + if (!itemCollectionFolders.Any(userCollectionFolders.Contains)) + { + return false; + } + } return true; } @@ -1490,7 +1512,6 @@ namespace MediaBrowser.Controller.Entities image.Path = file.FullName; image.DateModified = imageInfo.DateModified; - image.Length = imageInfo.Length; } } @@ -1511,7 +1532,7 @@ namespace MediaBrowser.Controller.Entities } // Remove it from the item - ImageInfos.Remove(info); + RemoveImage(info); // Delete the source file var currentFile = new FileInfo(info.Path); @@ -1530,6 +1551,11 @@ namespace MediaBrowser.Controller.Entities return UpdateToRepository(ItemUpdateType.ImageUpdate, CancellationToken.None); } + public void RemoveImage(ItemImageInfo image) + { + ImageInfos.Remove(image); + } + public virtual Task UpdateToRepository(ItemUpdateType updateReason, CancellationToken cancellationToken) { return LibraryManager.UpdateItem(this, updateReason, cancellationToken); @@ -1595,14 +1621,11 @@ namespace MediaBrowser.Controller.Entities return null; } - var fileInfo = new FileInfo(path); - return new ItemImageInfo { Path = path, - DateModified = FileSystem.GetLastWriteTimeUtc(fileInfo), - Type = imageType, - Length = fileInfo.Length + DateModified = FileSystem.GetLastWriteTimeUtc(path), + Type = imageType }; } @@ -1622,7 +1645,7 @@ namespace MediaBrowser.Controller.Entities public bool AddImages(ImageType imageType, IEnumerable<FileInfo> images) { - return AddImages(imageType, images.Cast<FileSystemInfo>()); + return AddImages(imageType, images.Cast<FileSystemInfo>().ToList()); } /// <summary> @@ -1632,7 +1655,7 @@ namespace MediaBrowser.Controller.Entities /// <param name="images">The images.</param> /// <returns><c>true</c> if XXXX, <c>false</c> otherwise.</returns> /// <exception cref="System.ArgumentException">Cannot call AddImages with chapter images</exception> - public bool AddImages(ImageType imageType, IEnumerable<FileSystemInfo> images) + public bool AddImages(ImageType imageType, List<FileSystemInfo> images) { if (imageType == ImageType.Chapter) { @@ -1643,6 +1666,7 @@ namespace MediaBrowser.Controller.Entities .ToList(); var newImageList = new List<FileSystemInfo>(); + var imageAdded = false; foreach (var newImage in images) { @@ -1657,14 +1681,25 @@ namespace MediaBrowser.Controller.Entities if (existing == null) { newImageList.Add(newImage); + imageAdded = true; } else { existing.DateModified = FileSystem.GetLastWriteTimeUtc(newImage); - existing.Length = ((FileInfo) newImage).Length; } } + if (imageAdded || images.Count != existingImages.Count) + { + var newImagePaths = images.Select(i => i.FullName).ToList(); + + var deleted = existingImages + .Where(i => !newImagePaths.Contains(i.Path, StringComparer.OrdinalIgnoreCase) && !File.Exists(i.Path)) + .ToList(); + + ImageInfos = ImageInfos.Except(deleted).ToList(); + } + ImageInfos.AddRange(newImageList.Select(i => GetImageInfo(i, imageType))); return newImageList.Count > 0; @@ -1676,8 +1711,7 @@ namespace MediaBrowser.Controller.Entities { Path = file.FullName, Type = type, - DateModified = FileSystem.GetLastWriteTimeUtc(file), - Length = ((FileInfo)file).Length + DateModified = FileSystem.GetLastWriteTimeUtc(file) }; } @@ -1716,15 +1750,9 @@ namespace MediaBrowser.Controller.Entities FileSystem.SwapFiles(path1, path2); - var file1 = new FileInfo(info1.Path); - var file2 = new FileInfo(info2.Path); - // Refresh these values - info1.DateModified = FileSystem.GetLastWriteTimeUtc(file1); - info2.DateModified = FileSystem.GetLastWriteTimeUtc(file2); - - info1.Length = file1.Length; - info2.Length = file2.Length; + info1.DateModified = FileSystem.GetLastWriteTimeUtc(info1.Path); + info2.DateModified = FileSystem.GetLastWriteTimeUtc(info2.Path); return UpdateToRepository(ItemUpdateType.ImageUpdate, CancellationToken.None); } @@ -1853,5 +1881,18 @@ namespace MediaBrowser.Controller.Entities return video.RefreshMetadata(newOptions, cancellationToken); } + + public string GetEtag(User user) + { + return string.Join("|", GetEtagValues(user).ToArray()).GetMD5().ToString("N"); + } + + protected virtual List<string> GetEtagValues(User user) + { + return new List<string> + { + DateLastSaved.Ticks.ToString(CultureInfo.InvariantCulture) + }; + } } } |
