MigrateMusicBrainzTimeout.cs 3.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. using System;
  2. using System.IO;
  3. using System.Xml;
  4. using System.Xml.Serialization;
  5. using Emby.Server.Implementations;
  6. using MediaBrowser.Providers.Plugins.MusicBrainz.Configuration;
  7. using Microsoft.Extensions.Logging;
  8. namespace Jellyfin.Server.Migrations.PreStartupRoutines;
  9. /// <inheritdoc />
  10. #pragma warning disable CS0618 // Type or member is obsolete
  11. [JellyfinMigration("2025-04-20T02:00:00", nameof(MigrateMusicBrainzTimeout), "A6DCACF4-C057-4Ef9-80D3-61CEF9DDB4F0", Stage = Stages.JellyfinMigrationStageTypes.PreInitialisation)]
  12. public class MigrateMusicBrainzTimeout : IMigrationRoutine
  13. #pragma warning restore CS0618 // Type or member is obsolete
  14. {
  15. private readonly ServerApplicationPaths _applicationPaths;
  16. private readonly ILogger<MigrateMusicBrainzTimeout> _logger;
  17. /// <summary>
  18. /// Initializes a new instance of the <see cref="MigrateMusicBrainzTimeout"/> class.
  19. /// </summary>
  20. /// <param name="applicationPaths">An instance of <see cref="ServerApplicationPaths"/>.</param>
  21. /// <param name="loggerFactory">An instance of the <see cref="ILoggerFactory"/> interface.</param>
  22. public MigrateMusicBrainzTimeout(ServerApplicationPaths applicationPaths, ILoggerFactory loggerFactory)
  23. {
  24. _applicationPaths = applicationPaths;
  25. _logger = loggerFactory.CreateLogger<MigrateMusicBrainzTimeout>();
  26. }
  27. /// <inheritdoc />
  28. public void Perform()
  29. {
  30. string path = Path.Combine(_applicationPaths.PluginConfigurationsPath, "Jellyfin.Plugin.MusicBrainz.xml");
  31. if (!File.Exists(path))
  32. {
  33. _logger.LogDebug("No MusicBrainz plugin configuration file found, skipping");
  34. return;
  35. }
  36. var oldPluginConfiguration = ReadOld(path);
  37. if (oldPluginConfiguration is not null)
  38. {
  39. var newPluginConfiguration = new PluginConfiguration
  40. {
  41. Server = oldPluginConfiguration.Server,
  42. ReplaceArtistName = oldPluginConfiguration.ReplaceArtistName
  43. };
  44. var newRateLimit = oldPluginConfiguration.RateLimit / 1000.0;
  45. newPluginConfiguration.RateLimit = newRateLimit < 1.0 ? 1.0 : newRateLimit;
  46. WriteNew(path, newPluginConfiguration);
  47. }
  48. }
  49. private OldMusicBrainzConfiguration? ReadOld(string path)
  50. {
  51. using var xmlReader = XmlReader.Create(path);
  52. var serverConfigSerializer = new XmlSerializer(typeof(OldMusicBrainzConfiguration), new XmlRootAttribute("PluginConfiguration"));
  53. return serverConfigSerializer.Deserialize(xmlReader) as OldMusicBrainzConfiguration;
  54. }
  55. private void WriteNew(string path, PluginConfiguration newPluginConfiguration)
  56. {
  57. var pluginConfigurationSerializer = new XmlSerializer(typeof(PluginConfiguration), new XmlRootAttribute("PluginConfiguration"));
  58. var xmlWriterSettings = new XmlWriterSettings { Indent = true };
  59. using var xmlWriter = XmlWriter.Create(path, xmlWriterSettings);
  60. pluginConfigurationSerializer.Serialize(xmlWriter, newPluginConfiguration);
  61. }
  62. #pragma warning disable
  63. public sealed class OldMusicBrainzConfiguration
  64. {
  65. private string _server = string.Empty;
  66. private long _rateLimit = 0L;
  67. public string Server
  68. {
  69. get => _server;
  70. set => _server = value.TrimEnd('/');
  71. }
  72. public long RateLimit
  73. {
  74. get => _rateLimit;
  75. set => _rateLimit = value;
  76. }
  77. public bool ReplaceArtistName { get; set; }
  78. }
  79. }