RemoveDuplicatePlaylistChildren.cs 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. using System;
  2. using System.Linq;
  3. using System.Threading;
  4. using Jellyfin.Data.Enums;
  5. using MediaBrowser.Controller.Entities;
  6. using MediaBrowser.Controller.Library;
  7. using MediaBrowser.Controller.Playlists;
  8. using Microsoft.Extensions.Logging;
  9. namespace Jellyfin.Server.Migrations.Routines;
  10. /// <summary>
  11. /// Remove duplicate playlist entries.
  12. /// </summary>
  13. internal class RemoveDuplicatePlaylistChildren : IMigrationRoutine
  14. {
  15. private readonly ILogger<RemoveDuplicatePlaylistChildren> _logger;
  16. private readonly ILibraryManager _libraryManager;
  17. private readonly IPlaylistManager _playlistManager;
  18. public RemoveDuplicatePlaylistChildren(
  19. ILogger<RemoveDuplicatePlaylistChildren> logger,
  20. ILibraryManager libraryManager,
  21. IPlaylistManager playlistManager)
  22. {
  23. _logger = logger;
  24. _libraryManager = libraryManager;
  25. _playlistManager = playlistManager;
  26. }
  27. /// <inheritdoc/>
  28. public Guid Id => Guid.Parse("{96C156A2-7A13-4B3B-A8B8-FB80C94D20C0}");
  29. /// <inheritdoc/>
  30. public string Name => "RemoveDuplicatePlaylistChildren";
  31. /// <inheritdoc/>
  32. public bool PerformOnNewInstall => false;
  33. /// <inheritdoc/>
  34. public void Perform()
  35. {
  36. var playlists = _libraryManager.GetItemList(new InternalItemsQuery
  37. {
  38. IncludeItemTypes = [BaseItemKind.Playlist]
  39. })
  40. .Cast<Playlist>()
  41. .ToArray();
  42. if (playlists.Length > 0)
  43. {
  44. foreach (var playlist in playlists)
  45. {
  46. var linkedChildren = playlist.LinkedChildren;
  47. if (linkedChildren.Length > 0)
  48. {
  49. var nullItemChildren = linkedChildren.Where(c => c.ItemId is null);
  50. var deduplicatedChildren = linkedChildren.DistinctBy(c => c.ItemId);
  51. var newLinkedChildren = nullItemChildren.Concat(deduplicatedChildren);
  52. playlist.LinkedChildren = linkedChildren;
  53. playlist.UpdateToRepositoryAsync(ItemUpdateType.MetadataEdit, CancellationToken.None).GetAwaiter().GetResult();
  54. _playlistManager.SavePlaylistFile(playlist);
  55. }
  56. }
  57. }
  58. }
  59. }