PackageService.cs 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. using MediaBrowser.Common.Extensions;
  2. using MediaBrowser.Common.Implementations.HttpServer;
  3. using MediaBrowser.Common.Kernel;
  4. using MediaBrowser.Controller;
  5. using MediaBrowser.Model.Updates;
  6. using ServiceStack.ServiceHost;
  7. using System;
  8. using System.Collections.Generic;
  9. using System.Linq;
  10. using System.Threading;
  11. using System.Threading.Tasks;
  12. namespace MediaBrowser.Api
  13. {
  14. /// <summary>
  15. /// Class GetPackage
  16. /// </summary>
  17. [Route("/Packages/{Name}", "GET")]
  18. public class GetPackage : IReturn<PackageInfo>
  19. {
  20. /// <summary>
  21. /// Gets or sets the name.
  22. /// </summary>
  23. /// <value>The name.</value>
  24. public string Name { get; set; }
  25. }
  26. /// <summary>
  27. /// Class GetPackages
  28. /// </summary>
  29. [Route("/Packages", "GET")]
  30. public class GetPackages : IReturn<List<PackageInfo>>
  31. {
  32. /// <summary>
  33. /// Gets or sets the name.
  34. /// </summary>
  35. /// <value>The name.</value>
  36. public PackageType? PackageType { get; set; }
  37. }
  38. /// <summary>
  39. /// Class GetPackageVersionUpdates
  40. /// </summary>
  41. [Route("/Packages/Updates", "GET")]
  42. public class GetPackageVersionUpdates : IReturn<List<PackageVersionInfo>>
  43. {
  44. /// <summary>
  45. /// Gets or sets the name.
  46. /// </summary>
  47. /// <value>The name.</value>
  48. public PackageType PackageType { get; set; }
  49. }
  50. /// <summary>
  51. /// Class InstallPackage
  52. /// </summary>
  53. [Route("/Packages/Installed/{Name}", "POST")]
  54. public class InstallPackage : IReturnVoid
  55. {
  56. /// <summary>
  57. /// Gets or sets the name.
  58. /// </summary>
  59. /// <value>The name.</value>
  60. public string Name { get; set; }
  61. /// <summary>
  62. /// Gets or sets the version.
  63. /// </summary>
  64. /// <value>The version.</value>
  65. public string Version { get; set; }
  66. /// <summary>
  67. /// Gets or sets the update class.
  68. /// </summary>
  69. /// <value>The update class.</value>
  70. public PackageVersionClass UpdateClass { get; set; }
  71. }
  72. /// <summary>
  73. /// Class CancelPackageInstallation
  74. /// </summary>
  75. [Route("/Packages/Installing/{Id}", "DELETE")]
  76. public class CancelPackageInstallation : IReturnVoid
  77. {
  78. /// <summary>
  79. /// Gets or sets the id.
  80. /// </summary>
  81. /// <value>The id.</value>
  82. public Guid Id { get; set; }
  83. }
  84. /// <summary>
  85. /// Class PackageService
  86. /// </summary>
  87. public class PackageService : BaseRestService
  88. {
  89. /// <summary>
  90. /// Gets or sets the application host.
  91. /// </summary>
  92. /// <value>The application host.</value>
  93. public IApplicationHost ApplicationHost { get; set; }
  94. /// <summary>
  95. /// Gets the specified request.
  96. /// </summary>
  97. /// <param name="request">The request.</param>
  98. /// <returns>System.Object.</returns>
  99. /// <exception cref="System.ArgumentException">Unsupported PackageType</exception>
  100. public object Get(GetPackageVersionUpdates request)
  101. {
  102. var kernel = (Kernel)Kernel;
  103. var result = new List<PackageVersionInfo>();
  104. if (request.PackageType == PackageType.UserInstalled || request.PackageType == PackageType.All)
  105. {
  106. result.AddRange(kernel.InstallationManager.GetAvailablePluginUpdates(false, CancellationToken.None).Result.ToList());
  107. }
  108. else if (request.PackageType == PackageType.System || request.PackageType == PackageType.All)
  109. {
  110. var updateCheckResult = ApplicationHost.CheckForApplicationUpdate(CancellationToken.None, new Progress<double> { }).Result;
  111. if (updateCheckResult.IsUpdateAvailable)
  112. {
  113. result.Add(new PackageVersionInfo
  114. {
  115. versionStr = updateCheckResult.AvailableVersion.ToString()
  116. });
  117. }
  118. }
  119. return ToOptimizedResult(result);
  120. }
  121. /// <summary>
  122. /// Gets the specified request.
  123. /// </summary>
  124. /// <param name="request">The request.</param>
  125. /// <returns>System.Object.</returns>
  126. public object Get(GetPackage request)
  127. {
  128. var kernel = (Kernel)Kernel;
  129. var packages = kernel.InstallationManager.GetAvailablePackages(CancellationToken.None, applicationVersion: ApplicationHost.ApplicationVersion).Result;
  130. var result = packages.FirstOrDefault(p => p.name.Equals(request.Name, StringComparison.OrdinalIgnoreCase));
  131. return ToOptimizedResult(result);
  132. }
  133. /// <summary>
  134. /// Gets the specified request.
  135. /// </summary>
  136. /// <param name="request">The request.</param>
  137. /// <returns>System.Object.</returns>
  138. public object Get(GetPackages request)
  139. {
  140. var kernel = (Kernel)Kernel;
  141. var packages = kernel.InstallationManager.GetAvailablePackages(CancellationToken.None, request.PackageType, ApplicationHost.ApplicationVersion).Result;
  142. return ToOptimizedResult(packages.ToList());
  143. }
  144. /// <summary>
  145. /// Posts the specified request.
  146. /// </summary>
  147. /// <param name="request">The request.</param>
  148. /// <exception cref="ResourceNotFoundException"></exception>
  149. public void Post(InstallPackage request)
  150. {
  151. var kernel = (Kernel)Kernel;
  152. var package = string.IsNullOrEmpty(request.Version) ?
  153. kernel.InstallationManager.GetLatestCompatibleVersion(request.Name, request.UpdateClass).Result :
  154. kernel.InstallationManager.GetPackage(request.Name, request.UpdateClass, Version.Parse(request.Version)).Result;
  155. if (package == null)
  156. {
  157. throw new ResourceNotFoundException(string.Format("Package not found: {0}", request.Name));
  158. }
  159. Task.Run(() => kernel.InstallationManager.InstallPackage(package, new Progress<double> { }, CancellationToken.None));
  160. }
  161. /// <summary>
  162. /// Deletes the specified request.
  163. /// </summary>
  164. /// <param name="request">The request.</param>
  165. public void Delete(CancelPackageInstallation request)
  166. {
  167. var kernel = (Kernel)Kernel;
  168. var info = kernel.InstallationManager.CurrentInstallations.FirstOrDefault(i => i.Item1.Id == request.Id);
  169. if (info != null)
  170. {
  171. info.Item2.Cancel();
  172. }
  173. }
  174. }
  175. }