2
0

MigrateRatingLevels.cs 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. using System;
  2. using System.Linq;
  3. using Jellyfin.Database.Implementations;
  4. using MediaBrowser.Model.Globalization;
  5. using Microsoft.EntityFrameworkCore;
  6. using Microsoft.Extensions.Logging;
  7. namespace Jellyfin.Server.Migrations.Routines
  8. {
  9. /// <summary>
  10. /// Migrate rating levels.
  11. /// </summary>
  12. internal class MigrateRatingLevels : IDatabaseMigrationRoutine
  13. {
  14. private readonly ILogger<MigrateRatingLevels> _logger;
  15. private readonly IDbContextFactory<JellyfinDbContext> _provider;
  16. private readonly ILocalizationManager _localizationManager;
  17. public MigrateRatingLevels(
  18. IDbContextFactory<JellyfinDbContext> provider,
  19. ILoggerFactory loggerFactory,
  20. ILocalizationManager localizationManager)
  21. {
  22. _provider = provider;
  23. _localizationManager = localizationManager;
  24. _logger = loggerFactory.CreateLogger<MigrateRatingLevels>();
  25. }
  26. /// <inheritdoc/>
  27. public Guid Id => Guid.Parse("{98724538-EB11-40E3-931A-252C55BDDE7A}");
  28. /// <inheritdoc/>
  29. public string Name => "MigrateRatingLevels";
  30. /// <inheritdoc/>
  31. public bool PerformOnNewInstall => false;
  32. /// <inheritdoc/>
  33. public void Perform()
  34. {
  35. _logger.LogInformation("Recalculating parental rating levels based on rating string.");
  36. using var context = _provider.CreateDbContext();
  37. using var transaction = context.Database.BeginTransaction();
  38. var ratings = context.BaseItems.AsNoTracking().Select(e => e.OfficialRating).Distinct();
  39. foreach (var rating in ratings)
  40. {
  41. if (string.IsNullOrEmpty(rating))
  42. {
  43. int? value = null;
  44. context.BaseItems
  45. .Where(e => e.OfficialRating == null || e.OfficialRating == string.Empty)
  46. .ExecuteUpdate(f => f.SetProperty(e => e.InheritedParentalRatingValue, value));
  47. context.BaseItems
  48. .Where(e => e.OfficialRating == null || e.OfficialRating == string.Empty)
  49. .ExecuteUpdate(f => f.SetProperty(e => e.InheritedParentalRatingSubValue, value));
  50. }
  51. else
  52. {
  53. var ratingValue = _localizationManager.GetRatingScore(rating);
  54. var score = ratingValue?.Score;
  55. var subScore = ratingValue?.SubScore;
  56. context.BaseItems
  57. .Where(e => e.OfficialRating == rating)
  58. .ExecuteUpdate(f => f.SetProperty(e => e.InheritedParentalRatingValue, score));
  59. context.BaseItems
  60. .Where(e => e.OfficialRating == rating)
  61. .ExecuteUpdate(f => f.SetProperty(e => e.InheritedParentalRatingSubValue, subScore));
  62. }
  63. }
  64. transaction.Commit();
  65. }
  66. }
  67. }