aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorClaus Vium <cvium@users.noreply.github.com>2022-01-28 12:21:40 +0100
committerGitHub <noreply@github.com>2022-01-28 12:21:40 +0100
commit488ce510321ebcec36bccc45398feffe725cb5f0 (patch)
tree9a7a52acf8169a7406cd41b166066198cfd19124
parent42724ef4118ca8225da537db0c087d6ae86dbae1 (diff)
Remove some allocations (#7246)
-rw-r--r--Emby.Server.Implementations/Library/LibraryManager.cs2
-rw-r--r--MediaBrowser.Controller/Entities/BaseItem.cs38
-rw-r--r--MediaBrowser.Controller/Entities/Folder.cs2
-rw-r--r--MediaBrowser.Controller/Entities/Video.cs2
-rw-r--r--MediaBrowser.Controller/Library/ILibraryManager.cs2
-rw-r--r--MediaBrowser.LocalMetadata/Images/LocalImageProvider.cs43
-rw-r--r--MediaBrowser.Providers/Manager/ItemImageProvider.cs2
7 files changed, 52 insertions, 39 deletions
diff --git a/Emby.Server.Implementations/Library/LibraryManager.cs b/Emby.Server.Implementations/Library/LibraryManager.cs
index 262d9fed7..c4ff33c1b 100644
--- a/Emby.Server.Implementations/Library/LibraryManager.cs
+++ b/Emby.Server.Implementations/Library/LibraryManager.cs
@@ -2686,7 +2686,7 @@ namespace Emby.Server.Implementations.Library
};
}
- public IEnumerable<BaseItem> FindExtras(BaseItem owner, List<FileSystemMetadata> fileSystemChildren, IDirectoryService directoryService)
+ public IEnumerable<BaseItem> FindExtras(BaseItem owner, IReadOnlyList<FileSystemMetadata> fileSystemChildren, IDirectoryService directoryService)
{
var ownerVideoInfo = VideoResolver.Resolve(owner.Path, owner.IsFolder, _namingOptions);
if (ownerVideoInfo == null)
diff --git a/MediaBrowser.Controller/Entities/BaseItem.cs b/MediaBrowser.Controller/Entities/BaseItem.cs
index 915971adc..0f62e8e1e 100644
--- a/MediaBrowser.Controller/Entities/BaseItem.cs
+++ b/MediaBrowser.Controller/Entities/BaseItem.cs
@@ -5,6 +5,7 @@
using System;
using System.Collections.Generic;
using System.Globalization;
+using System.IO;
using System.Linq;
using System.Text;
using System.Text.Json.Serialization;
@@ -1286,7 +1287,7 @@ namespace MediaBrowser.Controller.Entities
{
if (IsFileProtocol)
{
- requiresSave = await RefreshedOwnedItems(options, GetFileSystemChildren(options.DirectoryService).ToList(), cancellationToken).ConfigureAwait(false);
+ requiresSave = await RefreshedOwnedItems(options, GetFileSystemChildren(options.DirectoryService), cancellationToken).ConfigureAwait(false);
}
await LibraryManager.UpdateImagesAsync(this).ConfigureAwait(false); // ensure all image properties in DB are fresh
@@ -1363,7 +1364,7 @@ namespace MediaBrowser.Controller.Entities
/// <param name="fileSystemChildren">The list of filesystem children.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns><c>true</c> if any items have changed, else <c>false</c>.</returns>
- protected virtual async Task<bool> RefreshedOwnedItems(MetadataRefreshOptions options, List<FileSystemMetadata> fileSystemChildren, CancellationToken cancellationToken)
+ protected virtual async Task<bool> RefreshedOwnedItems(MetadataRefreshOptions options, IReadOnlyList<FileSystemMetadata> fileSystemChildren, CancellationToken cancellationToken)
{
if (!IsFileProtocol || !SupportsOwnedItems || IsInMixedFolder || this is ICollectionFolder or UserRootFolder or AggregateFolder || this.GetType() == typeof(Folder))
{
@@ -1380,7 +1381,7 @@ namespace MediaBrowser.Controller.Entities
return directoryService.GetFileSystemEntries(path);
}
- private async Task<bool> RefreshExtras(BaseItem item, MetadataRefreshOptions options, List<FileSystemMetadata> fileSystemChildren, CancellationToken cancellationToken)
+ private async Task<bool> RefreshExtras(BaseItem item, MetadataRefreshOptions options, IReadOnlyList<FileSystemMetadata> fileSystemChildren, CancellationToken cancellationToken)
{
var extras = LibraryManager.FindExtras(item, fileSystemChildren, options.DirectoryService).ToArray();
var newExtraIds = extras.Select(i => i.Id).ToArray();
@@ -2041,27 +2042,32 @@ namespace MediaBrowser.Controller.Entities
/// <summary>
/// Validates that images within the item are still on the filesystem.
/// </summary>
- /// <param name="directoryService">The directory service to use.</param>
/// <returns><c>true</c> if the images validate, <c>false</c> if not.</returns>
- public bool ValidateImages(IDirectoryService directoryService)
+ public bool ValidateImages()
{
- var allFiles = ImageInfos
- .Where(i => i.IsLocalFile)
- .Select(i => System.IO.Path.GetDirectoryName(i.Path))
- .Distinct(StringComparer.OrdinalIgnoreCase)
- .SelectMany(path => directoryService.GetFilePaths(path))
- .ToList();
+ List<ItemImageInfo> deletedImages = null;
+ foreach (var imageInfo in ImageInfos)
+ {
+ if (!imageInfo.IsLocalFile)
+ {
+ continue;
+ }
- var deletedImages = ImageInfos
- .Where(image => image.IsLocalFile && !allFiles.Contains(image.Path, StringComparison.OrdinalIgnoreCase))
- .ToList();
+ if (File.Exists(imageInfo.Path))
+ {
+ continue;
+ }
+
+ (deletedImages ??= new List<ItemImageInfo>()).Add(imageInfo);
+ }
- if (deletedImages.Count > 0)
+ var anyImagesRemoved = deletedImages?.Count > 0;
+ if (anyImagesRemoved)
{
RemoveImages(deletedImages);
}
- return deletedImages.Count > 0;
+ return anyImagesRemoved;
}
/// <summary>
diff --git a/MediaBrowser.Controller/Entities/Folder.cs b/MediaBrowser.Controller/Entities/Folder.cs
index 52b975a94..4d9aac6f9 100644
--- a/MediaBrowser.Controller/Entities/Folder.cs
+++ b/MediaBrowser.Controller/Entities/Folder.cs
@@ -1585,7 +1585,7 @@ namespace MediaBrowser.Controller.Entities
.Where(i => i.Item2 != null);
}
- protected override async Task<bool> RefreshedOwnedItems(MetadataRefreshOptions options, List<FileSystemMetadata> fileSystemChildren, CancellationToken cancellationToken)
+ protected override async Task<bool> RefreshedOwnedItems(MetadataRefreshOptions options, IReadOnlyList<FileSystemMetadata> fileSystemChildren, CancellationToken cancellationToken)
{
var changesFound = false;
diff --git a/MediaBrowser.Controller/Entities/Video.cs b/MediaBrowser.Controller/Entities/Video.cs
index 3e125602a..5ab7808c3 100644
--- a/MediaBrowser.Controller/Entities/Video.cs
+++ b/MediaBrowser.Controller/Entities/Video.cs
@@ -419,7 +419,7 @@ namespace MediaBrowser.Controller.Entities
return updateType;
}
- protected override async Task<bool> RefreshedOwnedItems(MetadataRefreshOptions options, List<FileSystemMetadata> fileSystemChildren, CancellationToken cancellationToken)
+ protected override async Task<bool> RefreshedOwnedItems(MetadataRefreshOptions options, IReadOnlyList<FileSystemMetadata> fileSystemChildren, CancellationToken cancellationToken)
{
var hasChanges = await base.RefreshedOwnedItems(options, fileSystemChildren, cancellationToken).ConfigureAwait(false);
diff --git a/MediaBrowser.Controller/Library/ILibraryManager.cs b/MediaBrowser.Controller/Library/ILibraryManager.cs
index 8db528330..2b0193771 100644
--- a/MediaBrowser.Controller/Library/ILibraryManager.cs
+++ b/MediaBrowser.Controller/Library/ILibraryManager.cs
@@ -434,7 +434,7 @@ namespace MediaBrowser.Controller.Library
/// <param name="fileSystemChildren">The file system children.</param>
/// <param name="directoryService">An instance of <see cref="IDirectoryService"/>.</param>
/// <returns>IEnumerable&lt;BaseItem&gt;.</returns>
- IEnumerable<BaseItem> FindExtras(BaseItem owner, List<FileSystemMetadata> fileSystemChildren, IDirectoryService directoryService);
+ IEnumerable<BaseItem> FindExtras(BaseItem owner, IReadOnlyList<FileSystemMetadata> fileSystemChildren, IDirectoryService directoryService);
/// <summary>
/// Gets the collection folders.
diff --git a/MediaBrowser.LocalMetadata/Images/LocalImageProvider.cs b/MediaBrowser.LocalMetadata/Images/LocalImageProvider.cs
index 7dc6149f4..70fd68129 100644
--- a/MediaBrowser.LocalMetadata/Images/LocalImageProvider.cs
+++ b/MediaBrowser.LocalMetadata/Images/LocalImageProvider.cs
@@ -291,7 +291,7 @@ namespace MediaBrowser.LocalMetadata.Images
foreach (var name in imageFileNames)
{
- if (AddImage(files, images, imagePrefix + name, ImageType.Primary))
+ if (AddImage(files, images, name, ImageType.Primary, imagePrefix))
{
return;
}
@@ -317,7 +317,7 @@ namespace MediaBrowser.LocalMetadata.Images
if (!string.IsNullOrEmpty(name))
{
- AddImage(files, images, imagePrefix + name + "-fanart", ImageType.Backdrop);
+ AddImage(files, images, name + "-fanart", ImageType.Backdrop, imagePrefix);
// Support without the prefix if it's in it's own folder
if (!isInMixedFolder)
@@ -436,7 +436,7 @@ namespace MediaBrowser.LocalMetadata.Images
private bool AddImage(List<FileSystemMetadata> files, List<LocalImageInfo> images, string name, string imagePrefix, bool isInMixedFolder, ImageType type)
{
- var added = AddImage(files, images, imagePrefix + name, type);
+ var added = AddImage(files, images, name, type, imagePrefix);
if (!isInMixedFolder)
{
@@ -449,32 +449,39 @@ namespace MediaBrowser.LocalMetadata.Images
return added;
}
- private bool AddImage(List<FileSystemMetadata> files, List<LocalImageInfo> images, string name, ImageType type)
+ private static bool AddImage(IReadOnlyList<FileSystemMetadata> files, List<LocalImageInfo> images, string name, ImageType type, string? prefix = null)
{
- var image = GetImage(files, name);
+ var image = GetImage(files, name, prefix);
- if (image != null)
+ if (image == null)
{
- images.Add(new LocalImageInfo
- {
- FileInfo = image,
- Type = type
- });
-
- return true;
+ return false;
}
- return false;
+ images.Add(new LocalImageInfo
+ {
+ FileInfo = image,
+ Type = type
+ });
+
+ return true;
}
- private static FileSystemMetadata? GetImage(IReadOnlyList<FileSystemMetadata> files, string name)
+ private static FileSystemMetadata? GetImage(IReadOnlyList<FileSystemMetadata> files, string name, string? prefix = null)
{
+ var fileNameLength = name.Length + (prefix?.Length ?? 0);
for (var i = 0; i < files.Count; i++)
{
var file = files[i];
- if (!file.IsDirectory
- && file.Length > 0
- && Path.GetFileNameWithoutExtension(file.FullName.AsSpan()).Equals(name, StringComparison.OrdinalIgnoreCase))
+ if (file.IsDirectory || file.Length <= 0)
+ {
+ continue;
+ }
+
+ var fileName = Path.GetFileNameWithoutExtension(file.FullName.AsSpan());
+ if (fileName.Length == fileNameLength
+ && fileName.StartsWith(prefix, StringComparison.OrdinalIgnoreCase)
+ && fileName.EndsWith(name, StringComparison.OrdinalIgnoreCase))
{
return file;
}
diff --git a/MediaBrowser.Providers/Manager/ItemImageProvider.cs b/MediaBrowser.Providers/Manager/ItemImageProvider.cs
index 0f21ec7b2..bbbbfad54 100644
--- a/MediaBrowser.Providers/Manager/ItemImageProvider.cs
+++ b/MediaBrowser.Providers/Manager/ItemImageProvider.cs
@@ -388,7 +388,7 @@ namespace MediaBrowser.Providers.Manager
/// <returns><c>true</c> if changes were made to the item; otherwise <c>false</c>.</returns>
public bool MergeImages(BaseItem item, IReadOnlyList<LocalImageInfo> images)
{
- var changed = item.ValidateImages(new DirectoryService(_fileSystem));
+ var changed = item.ValidateImages();
for (var i = 0; i < _singularImages.Length; i++)
{