diff options
Diffstat (limited to 'MediaBrowser.Controller/Entities')
| -rw-r--r-- | MediaBrowser.Controller/Entities/BaseItem.cs | 24 | ||||
| -rw-r--r-- | MediaBrowser.Controller/Entities/CollectionFolder.cs | 11 | ||||
| -rw-r--r-- | MediaBrowser.Controller/Entities/Folder.cs | 49 |
3 files changed, 59 insertions, 25 deletions
diff --git a/MediaBrowser.Controller/Entities/BaseItem.cs b/MediaBrowser.Controller/Entities/BaseItem.cs index ddcc994a0..5f9840b1b 100644 --- a/MediaBrowser.Controller/Entities/BaseItem.cs +++ b/MediaBrowser.Controller/Entities/BaseItem.cs @@ -62,7 +62,9 @@ namespace MediaBrowser.Controller.Entities ".edl", ".bif", ".smi", - ".ttml" + ".ttml", + ".lrc", + ".elrc" }; /// <summary> @@ -831,7 +833,7 @@ namespace MediaBrowser.Controller.Entities return CanDelete() && IsAuthorizedToDelete(user, allCollectionFolders); } - public bool CanDelete(User user) + public virtual bool CanDelete(User user) { var allCollectionFolders = LibraryManager.GetUserRootFolder().Children.OfType<Folder>().ToList(); @@ -962,7 +964,13 @@ namespace MediaBrowser.Controller.Entities AppendChunk(builder, isDigitChunk, name.Slice(chunkStart)); // logger.LogDebug("ModifySortChunks Start: {0} End: {1}", name, builder.ToString()); - return builder.ToString().RemoveDiacritics(); + var result = builder.ToString().RemoveDiacritics(); + if (!result.All(char.IsAscii)) + { + result = result.Transliterated(); + } + + return result; } public BaseItem GetParent() @@ -1578,18 +1586,24 @@ namespace MediaBrowser.Controller.Entities list.AddRange(parent.Tags); } + foreach (var folder in LibraryManager.GetCollectionFolders(this)) + { + list.AddRange(folder.Tags); + } + return list.Distinct(StringComparer.OrdinalIgnoreCase).ToList(); } private bool IsVisibleViaTags(User user) { - if (user.GetPreference(PreferenceKind.BlockedTags).Any(i => Tags.Contains(i, StringComparison.OrdinalIgnoreCase))) + var allTags = GetInheritedTags(); + if (user.GetPreference(PreferenceKind.BlockedTags).Any(i => allTags.Contains(i, StringComparison.OrdinalIgnoreCase))) { return false; } var allowedTagsPreference = user.GetPreference(PreferenceKind.AllowedTags); - if (allowedTagsPreference.Any() && !allowedTagsPreference.Any(i => Tags.Contains(i, StringComparison.OrdinalIgnoreCase))) + if (allowedTagsPreference.Length != 0 && !allowedTagsPreference.Any(i => allTags.Contains(i, StringComparison.OrdinalIgnoreCase))) { return false; } diff --git a/MediaBrowser.Controller/Entities/CollectionFolder.cs b/MediaBrowser.Controller/Entities/CollectionFolder.cs index 992bb19bb..676a47c88 100644 --- a/MediaBrowser.Controller/Entities/CollectionFolder.cs +++ b/MediaBrowser.Controller/Entities/CollectionFolder.cs @@ -11,6 +11,7 @@ using System.Text.Json; using System.Text.Json.Serialization; using System.Threading; using System.Threading.Tasks; +using Jellyfin.Data.Entities; using Jellyfin.Data.Enums; using Jellyfin.Extensions.Json; using MediaBrowser.Controller.IO; @@ -95,6 +96,16 @@ namespace MediaBrowser.Controller.Entities return GetLibraryOptions(Path); } + public override bool IsVisible(User user) + { + if (GetLibraryOptions().Enabled) + { + return base.IsVisible(user); + } + + return false; + } + private static LibraryOptions LoadLibraryOptions(string path) { try diff --git a/MediaBrowser.Controller/Entities/Folder.cs b/MediaBrowser.Controller/Entities/Folder.cs index 1f13c833b..8bfcf5dee 100644 --- a/MediaBrowser.Controller/Entities/Folder.cs +++ b/MediaBrowser.Controller/Entities/Folder.cs @@ -331,8 +331,25 @@ namespace MediaBrowser.Controller.Entities } } + private static bool IsLibraryFolderAccessible(IDirectoryService directoryService, BaseItem item) + { + // For top parents i.e. Library folders, skip the validation if it's empty or inaccessible + if (item.IsTopParent && !directoryService.IsAccessible(item.ContainingFolderPath)) + { + Logger.LogWarning("Library folder {LibraryFolderPath} is inaccessible or empty, skipping", item.ContainingFolderPath); + return false; + } + + return true; + } + private async Task ValidateChildrenInternal2(IProgress<double> progress, bool recursive, bool refreshChildMetadata, MetadataRefreshOptions refreshOptions, IDirectoryService directoryService, CancellationToken cancellationToken) { + if (!IsLibraryFolderAccessible(directoryService, this)) + { + return; + } + cancellationToken.ThrowIfCancellationRequested(); var validChildren = new List<BaseItem>(); @@ -369,6 +386,11 @@ namespace MediaBrowser.Controller.Entities foreach (var child in nonCachedChildren) { + if (!IsLibraryFolderAccessible(directoryService, child)) + { + continue; + } + if (currentChildren.TryGetValue(child.Id, out BaseItem currentChild)) { validChildren.Add(currentChild); @@ -392,8 +414,8 @@ namespace MediaBrowser.Controller.Entities validChildren.Add(child); } - // If any items were added or removed.... - if (newItems.Count > 0 || currentChildren.Count != validChildren.Count) + // If it's an AggregateFolder, don't remove + if (!IsRoot && currentChildren.Count != validChildren.Count) { // That's all the new and changed ones - now see if there are any that are missing var itemsRemoved = currentChildren.Values.Except(validChildren).ToList(); @@ -408,7 +430,10 @@ namespace MediaBrowser.Controller.Entities LibraryManager.DeleteItem(item, new DeleteOptions { DeleteFileLocation = false }, this, false); } } + } + if (newItems.Count > 0) + { LibraryManager.CreateItems(newItems, this, cancellationToken); } } @@ -435,15 +460,7 @@ namespace MediaBrowser.Controller.Entities progress.Report(percent); - // TODO: this is sometimes being called after the refresh has completed. - try - { - ProviderManager.OnRefreshProgress(folder, percent); - } - catch (InvalidOperationException e) - { - Logger.LogError(e, "Error refreshing folder"); - } + ProviderManager.OnRefreshProgress(folder, percent); }); if (validChildrenNeedGeneration) @@ -475,15 +492,7 @@ namespace MediaBrowser.Controller.Entities if (recursive) { - // TODO: this is sometimes being called after the refresh has completed. - try - { - ProviderManager.OnRefreshProgress(folder, percent); - } - catch (InvalidOperationException e) - { - Logger.LogError(e, "Error refreshing folder"); - } + ProviderManager.OnRefreshProgress(folder, percent); } }); |
