UpdateLevelMigration.cs 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Threading;
  4. using System.Threading.Tasks;
  5. using Emby.Common.Implementations.Updates;
  6. using MediaBrowser.Common.Net;
  7. using MediaBrowser.Controller;
  8. using MediaBrowser.Controller.Configuration;
  9. using MediaBrowser.Model.Logging;
  10. using MediaBrowser.Model.Serialization;
  11. using MediaBrowser.Model.Updates;
  12. namespace Emby.Server.Core.Migrations
  13. {
  14. public class UpdateLevelMigration : IVersionMigration
  15. {
  16. private readonly IServerConfigurationManager _config;
  17. private readonly IServerApplicationHost _appHost;
  18. private readonly IHttpClient _httpClient;
  19. private readonly IJsonSerializer _jsonSerializer;
  20. private readonly string _releaseAssetFilename;
  21. private readonly ILogger _logger;
  22. public UpdateLevelMigration(IServerConfigurationManager config, IServerApplicationHost appHost, IHttpClient httpClient, IJsonSerializer jsonSerializer, string releaseAssetFilename, ILogger logger)
  23. {
  24. _config = config;
  25. _appHost = appHost;
  26. _httpClient = httpClient;
  27. _jsonSerializer = jsonSerializer;
  28. _releaseAssetFilename = releaseAssetFilename;
  29. _logger = logger;
  30. }
  31. public async Task Run()
  32. {
  33. var lastVersion = _config.Configuration.LastVersion;
  34. var currentVersion = _appHost.ApplicationVersion;
  35. if (string.Equals(lastVersion, currentVersion.ToString(), StringComparison.OrdinalIgnoreCase))
  36. {
  37. return;
  38. }
  39. try
  40. {
  41. var updateLevel = _config.Configuration.SystemUpdateLevel;
  42. await CheckVersion(currentVersion, updateLevel, CancellationToken.None).ConfigureAwait(false);
  43. }
  44. catch (Exception ex)
  45. {
  46. _logger.ErrorException("Error in update migration", ex);
  47. }
  48. }
  49. private async Task CheckVersion(Version currentVersion, PackageVersionClass currentUpdateLevel, CancellationToken cancellationToken)
  50. {
  51. var releases = await new GithubUpdater(_httpClient, _jsonSerializer)
  52. .GetLatestReleases("MediaBrowser", "Emby", _releaseAssetFilename, cancellationToken).ConfigureAwait(false);
  53. var newUpdateLevel = GetNewUpdateLevel(currentVersion, currentUpdateLevel, releases);
  54. if (newUpdateLevel != currentUpdateLevel)
  55. {
  56. _config.Configuration.SystemUpdateLevel = newUpdateLevel;
  57. _config.SaveConfiguration();
  58. }
  59. }
  60. private PackageVersionClass GetNewUpdateLevel(Version currentVersion, PackageVersionClass currentUpdateLevel, List<GithubUpdater.RootObject> releases)
  61. {
  62. var newUpdateLevel = currentUpdateLevel;
  63. // If the current version is later than current stable, set the update level to beta
  64. if (releases.Count >= 1)
  65. {
  66. var release = releases[0];
  67. var version = ParseVersion(release.tag_name);
  68. if (version != null)
  69. {
  70. if (currentVersion > version)
  71. {
  72. newUpdateLevel = PackageVersionClass.Beta;
  73. }
  74. else
  75. {
  76. return PackageVersionClass.Release;
  77. }
  78. }
  79. }
  80. // If the current version is later than current beta, set the update level to dev
  81. if (releases.Count >= 2)
  82. {
  83. var release = releases[1];
  84. var version = ParseVersion(release.tag_name);
  85. if (version != null)
  86. {
  87. if (currentVersion > version)
  88. {
  89. newUpdateLevel = PackageVersionClass.Dev;
  90. }
  91. else
  92. {
  93. return PackageVersionClass.Beta;
  94. }
  95. }
  96. }
  97. return newUpdateLevel;
  98. }
  99. private Version ParseVersion(string versionString)
  100. {
  101. if (!string.IsNullOrWhiteSpace(versionString))
  102. {
  103. var parts = versionString.Split('.');
  104. if (parts.Length == 3)
  105. {
  106. versionString += ".0";
  107. }
  108. }
  109. Version version;
  110. Version.TryParse(versionString, out version);
  111. return version;
  112. }
  113. }
  114. }