FixPlaylistOwner.cs 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  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. /// Properly set playlist owner.
  12. /// </summary>
  13. #pragma warning disable CS0618 // Type or member is obsolete
  14. [JellyfinMigration("2025-04-20T15:00:00", nameof(FixPlaylistOwner), "615DFA9E-2497-4DBB-A472-61938B752C5B")]
  15. internal class FixPlaylistOwner : IMigrationRoutine
  16. #pragma warning restore CS0618 // Type or member is obsolete
  17. {
  18. private readonly ILogger<FixPlaylistOwner> _logger;
  19. private readonly ILibraryManager _libraryManager;
  20. private readonly IPlaylistManager _playlistManager;
  21. public FixPlaylistOwner(
  22. ILogger<FixPlaylistOwner> logger,
  23. ILibraryManager libraryManager,
  24. IPlaylistManager playlistManager)
  25. {
  26. _logger = logger;
  27. _libraryManager = libraryManager;
  28. _playlistManager = playlistManager;
  29. }
  30. /// <inheritdoc/>
  31. public void Perform()
  32. {
  33. var playlists = _libraryManager.GetItemList(new InternalItemsQuery
  34. {
  35. IncludeItemTypes = new[] { BaseItemKind.Playlist }
  36. })
  37. .Cast<Playlist>()
  38. .Where(x => x.OwnerUserId.Equals(Guid.Empty))
  39. .ToArray();
  40. if (playlists.Length > 0)
  41. {
  42. foreach (var playlist in playlists)
  43. {
  44. var shares = playlist.Shares;
  45. if (shares.Count > 0)
  46. {
  47. var firstEditShare = shares.First(x => x.CanEdit);
  48. if (firstEditShare is not null)
  49. {
  50. playlist.OwnerUserId = firstEditShare.UserId;
  51. playlist.Shares = shares.Where(x => x != firstEditShare).ToArray();
  52. playlist.UpdateToRepositoryAsync(ItemUpdateType.MetadataEdit, CancellationToken.None).GetAwaiter().GetResult();
  53. _playlistManager.SavePlaylistFile(playlist);
  54. }
  55. }
  56. else
  57. {
  58. playlist.OpenAccess = true;
  59. playlist.UpdateToRepositoryAsync(ItemUpdateType.MetadataEdit, CancellationToken.None).GetAwaiter().GetResult();
  60. }
  61. }
  62. }
  63. }
  64. }