ConfigurationService.cs 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. using MediaBrowser.Common.Extensions;
  2. using MediaBrowser.Common.IO;
  3. using MediaBrowser.Controller.Configuration;
  4. using MediaBrowser.Controller.Entities;
  5. using MediaBrowser.Controller.Entities.Movies;
  6. using MediaBrowser.Controller.Entities.TV;
  7. using MediaBrowser.Controller.Providers;
  8. using MediaBrowser.Model.Configuration;
  9. using MediaBrowser.Model.Serialization;
  10. using ServiceStack;
  11. using System;
  12. using System.Collections.Generic;
  13. using System.Linq;
  14. namespace MediaBrowser.Api
  15. {
  16. /// <summary>
  17. /// Class GetConfiguration
  18. /// </summary>
  19. [Route("/System/Configuration", "GET", Summary = "Gets application configuration")]
  20. public class GetConfiguration : IReturn<ServerConfiguration>
  21. {
  22. }
  23. /// <summary>
  24. /// Class UpdateConfiguration
  25. /// </summary>
  26. [Route("/System/Configuration", "POST", Summary = "Updates application configuration")]
  27. public class UpdateConfiguration : ServerConfiguration, IReturnVoid
  28. {
  29. }
  30. [Route("/System/Configuration/MetadataOptions/Default", "GET", Summary = "Gets a default MetadataOptions object")]
  31. public class GetDefaultMetadataOptions : IReturn<MetadataOptions>
  32. {
  33. }
  34. [Route("/System/Configuration/MetadataPlugins", "GET", Summary = "Gets all available metadata plugins")]
  35. public class GetMetadataPlugins : IReturn<List<MetadataPluginSummary>>
  36. {
  37. }
  38. [Route("/System/Configuration/VideoImageExtraction", "POST", Summary = "Updates image extraction for all types")]
  39. public class UpdateVideoImageExtraction : IReturnVoid
  40. {
  41. public bool Enabled { get; set; }
  42. }
  43. public class ConfigurationService : BaseApiService
  44. {
  45. /// <summary>
  46. /// The _json serializer
  47. /// </summary>
  48. private readonly IJsonSerializer _jsonSerializer;
  49. /// <summary>
  50. /// The _configuration manager
  51. /// </summary>
  52. private readonly IServerConfigurationManager _configurationManager;
  53. private readonly IFileSystem _fileSystem;
  54. private readonly IProviderManager _providerManager;
  55. public ConfigurationService(IJsonSerializer jsonSerializer, IServerConfigurationManager configurationManager, IFileSystem fileSystem, IProviderManager providerManager)
  56. {
  57. _jsonSerializer = jsonSerializer;
  58. _configurationManager = configurationManager;
  59. _fileSystem = fileSystem;
  60. _providerManager = providerManager;
  61. }
  62. /// <summary>
  63. /// Gets the specified request.
  64. /// </summary>
  65. /// <param name="request">The request.</param>
  66. /// <returns>System.Object.</returns>
  67. public object Get(GetConfiguration request)
  68. {
  69. var configPath = _configurationManager.ApplicationPaths.SystemConfigurationFilePath;
  70. var dateModified = _fileSystem.GetLastWriteTimeUtc(configPath);
  71. var cacheKey = (configPath + dateModified.Ticks).GetMD5();
  72. return ToOptimizedResultUsingCache(cacheKey, dateModified, null, () => _configurationManager.Configuration);
  73. }
  74. /// <summary>
  75. /// Posts the specified configuraiton.
  76. /// </summary>
  77. /// <param name="request">The request.</param>
  78. public void Post(UpdateConfiguration request)
  79. {
  80. // Silly, but we need to serialize and deserialize or the XmlSerializer will write the xml with an element name of UpdateConfiguration
  81. var json = _jsonSerializer.SerializeToString(request);
  82. var config = _jsonSerializer.DeserializeFromString<ServerConfiguration>(json);
  83. _configurationManager.ReplaceConfiguration(config);
  84. }
  85. public object Get(GetDefaultMetadataOptions request)
  86. {
  87. return ToOptimizedSerializedResultUsingCache(new MetadataOptions());
  88. }
  89. public object Get(GetMetadataPlugins request)
  90. {
  91. return ToOptimizedSerializedResultUsingCache(_providerManager.GetAllMetadataPlugins().ToList());
  92. }
  93. /// <summary>
  94. /// This is a temporary method used until image settings get broken out.
  95. /// </summary>
  96. /// <param name="request"></param>
  97. public void Post(UpdateVideoImageExtraction request)
  98. {
  99. var config = _configurationManager.Configuration;
  100. EnableImageExtractionForType(typeof(Movie), config, request.Enabled);
  101. EnableImageExtractionForType(typeof(Episode), config, request.Enabled);
  102. EnableImageExtractionForType(typeof(AdultVideo), config, request.Enabled);
  103. EnableImageExtractionForType(typeof(MusicVideo), config, request.Enabled);
  104. EnableImageExtractionForType(typeof(Video), config, request.Enabled);
  105. EnableImageExtractionForType(typeof(Trailer), config, request.Enabled);
  106. _configurationManager.SaveConfiguration();
  107. }
  108. private void EnableImageExtractionForType(Type type, ServerConfiguration config, bool enabled)
  109. {
  110. var options = GetMetadataOptions(type, config);
  111. const string imageProviderName = "Screen Grabber";
  112. var contains = options.DisabledImageFetchers.Contains(imageProviderName, StringComparer.OrdinalIgnoreCase);
  113. if (!enabled && !contains)
  114. {
  115. var list = options.DisabledImageFetchers.ToList();
  116. list.Add(imageProviderName);
  117. options.DisabledImageFetchers = list.ToArray();
  118. }
  119. else if (enabled && contains)
  120. {
  121. var list = options.DisabledImageFetchers.ToList();
  122. list.Remove(imageProviderName);
  123. options.DisabledImageFetchers = list.ToArray();
  124. }
  125. }
  126. private MetadataOptions GetMetadataOptions(Type type, ServerConfiguration config)
  127. {
  128. var options = config.MetadataOptions
  129. .FirstOrDefault(i => string.Equals(i.ItemType, type.Name, StringComparison.OrdinalIgnoreCase));
  130. if (options == null)
  131. {
  132. var list = config.MetadataOptions.ToList();
  133. options = new MetadataOptions
  134. {
  135. ItemType = type.Name
  136. };
  137. list.Add(options);
  138. config.MetadataOptions = list.ToArray();
  139. }
  140. return options;
  141. }
  142. }
  143. }