RemoveDuplicatePlaylistChildren.cs 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  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. namespace Jellyfin.Server.Migrations.Routines;
  9. /// <summary>
  10. /// Remove duplicate playlist entries.
  11. /// </summary>
  12. internal class RemoveDuplicatePlaylistChildren : IMigrationRoutine
  13. {
  14. private readonly ILibraryManager _libraryManager;
  15. private readonly IPlaylistManager _playlistManager;
  16. public RemoveDuplicatePlaylistChildren(
  17. ILibraryManager libraryManager,
  18. IPlaylistManager playlistManager)
  19. {
  20. _libraryManager = libraryManager;
  21. _playlistManager = playlistManager;
  22. }
  23. /// <inheritdoc/>
  24. public Guid Id => Guid.Parse("{96C156A2-7A13-4B3B-A8B8-FB80C94D20C0}");
  25. /// <inheritdoc/>
  26. public string Name => "RemoveDuplicatePlaylistChildren";
  27. /// <inheritdoc/>
  28. public bool PerformOnNewInstall => false;
  29. /// <inheritdoc/>
  30. public void Perform()
  31. {
  32. var playlists = _libraryManager.GetItemList(new InternalItemsQuery
  33. {
  34. IncludeItemTypes = [BaseItemKind.Playlist]
  35. })
  36. .Cast<Playlist>()
  37. .Where(p => !p.OpenAccess || !p.OwnerUserId.Equals(Guid.Empty))
  38. .ToArray();
  39. if (playlists.Length > 0)
  40. {
  41. foreach (var playlist in playlists)
  42. {
  43. var linkedChildren = playlist.LinkedChildren;
  44. if (linkedChildren.Length > 0)
  45. {
  46. var nullItemChildren = linkedChildren.Where(c => c.ItemId is null);
  47. var deduplicatedChildren = linkedChildren.DistinctBy(c => c.ItemId);
  48. var newLinkedChildren = nullItemChildren.Concat(deduplicatedChildren);
  49. playlist.LinkedChildren = linkedChildren;
  50. playlist.UpdateToRepositoryAsync(ItemUpdateType.MetadataEdit, CancellationToken.None).GetAwaiter().GetResult();
  51. _playlistManager.SavePlaylistFile(playlist);
  52. }
  53. }
  54. }
  55. }
  56. }