diff options
| author | Mark Monteiro <marknr.monteiro@protonmail.com> | 2020-03-03 17:47:16 +0100 |
|---|---|---|
| committer | Mark Monteiro <marknr.monteiro@protonmail.com> | 2020-03-03 17:47:16 +0100 |
| commit | 4d32b59a0b0c1ce1709781760a4d623bd08c38a2 (patch) | |
| tree | 5fff480a66d4769464b0692b623c3a1692b308ef | |
| parent | 7f96fce15d550423685eba2d6a702f1e4c24916d (diff) | |
Performance improvements
Use arrays instead of lists; use Array.CopyTo to concat playlist items; only count number of duplicates once
| -rw-r--r-- | Emby.Server.Implementations/Playlists/PlaylistManager.cs | 17 |
1 files changed, 11 insertions, 6 deletions
diff --git a/Emby.Server.Implementations/Playlists/PlaylistManager.cs b/Emby.Server.Implementations/Playlists/PlaylistManager.cs index 0adb714b4..78b29be43 100644 --- a/Emby.Server.Implementations/Playlists/PlaylistManager.cs +++ b/Emby.Server.Implementations/Playlists/PlaylistManager.cs @@ -196,7 +196,7 @@ namespace Emby.Server.Implementations.Playlists // Retrieve all the items to be added to the playlist var items = GetPlaylistItems(itemIds, playlist.MediaType, user, options) .Where(i => i.SupportsAddingToPlaylist) - .ToList(); + .ToArray(); // Remove duplicates from the new items to be added var existingIds = playlist.LinkedChildren.Select(c => c.ItemId).ToHashSet(); @@ -204,18 +204,23 @@ namespace Emby.Server.Implementations.Playlists .Where(i => !existingIds.Contains(i.Id)) .GroupBy(i => i.Id) .Select(group => group.First()) - .ToList(); + .Select(i => LinkedChild.Create(i)) + .ToArray(); // Log duplicates that have been ignored, if any - if (uniqueItems.Count != items.Count) + int numDuplicates = items.Length - uniqueItems.Length; + if (numDuplicates > 0) { - var numDuplicates = items.Count - uniqueItems.Count; _logger.LogWarning("Ignored adding {DuplicateCount} duplicate items to playlist {PlaylistName}.", numDuplicates, playlist.Name); } + // Create a new array with the updated playlist items + var newLinkedChildren = new LinkedChild[playlist.LinkedChildren.Length + uniqueItems.Length]; + playlist.LinkedChildren.CopyTo(newLinkedChildren, 0); + uniqueItems.CopyTo(newLinkedChildren, playlist.LinkedChildren.Length); + // Update the playlist in the repository - var linkedItems = uniqueItems.Select(i => LinkedChild.Create(i)); - playlist.LinkedChildren = playlist.LinkedChildren.Concat(linkedItems).ToArray(); + playlist.LinkedChildren = newLinkedChildren; playlist.UpdateToRepository(ItemUpdateType.MetadataEdit, CancellationToken.None); // Update the playlist on disk |
