ConfigurationService.cs 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  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.Audio;
  6. using MediaBrowser.Controller.Entities.Movies;
  7. using MediaBrowser.Controller.Entities.TV;
  8. using MediaBrowser.Controller.Providers;
  9. using MediaBrowser.Model.Configuration;
  10. using MediaBrowser.Model.Serialization;
  11. using ServiceStack;
  12. using System;
  13. using System.Collections.Generic;
  14. using System.Linq;
  15. namespace MediaBrowser.Api
  16. {
  17. /// <summary>
  18. /// Class GetConfiguration
  19. /// </summary>
  20. [Route("/System/Configuration", "GET")]
  21. [Api(("Gets application configuration"))]
  22. public class GetConfiguration : IReturn<ServerConfiguration>
  23. {
  24. }
  25. /// <summary>
  26. /// Class UpdateConfiguration
  27. /// </summary>
  28. [Route("/System/Configuration", "POST")]
  29. [Api(("Updates application configuration"))]
  30. public class UpdateConfiguration : ServerConfiguration, IReturnVoid
  31. {
  32. }
  33. [Route("/System/Configuration/MetadataOptions/Default", "GET")]
  34. [Api(("Gets a default MetadataOptions object"))]
  35. public class GetDefaultMetadataOptions : IReturn<MetadataOptions>
  36. {
  37. }
  38. [Route("/System/Configuration/MetadataPlugins", "GET")]
  39. [Api(("Gets all available metadata plugins"))]
  40. public class GetMetadataPlugins : IReturn<List<MetadataPluginSummary>>
  41. {
  42. }
  43. [Route("/System/Configuration/SaveLocalMetadata", "POST")]
  44. [Api(("Updates saving of local metadata and images for all types"))]
  45. public class UpdateSaveLocalMetadata : IReturnVoid
  46. {
  47. public bool Enabled { get; set; }
  48. }
  49. [Route("/System/Configuration/VideoImageExtraction", "POST")]
  50. [Api(("Updates image extraction for all types"))]
  51. public class UpdateVideoImageExtraction : IReturnVoid
  52. {
  53. public bool Enabled { get; set; }
  54. }
  55. public class ConfigurationService : BaseApiService
  56. {
  57. /// <summary>
  58. /// The _json serializer
  59. /// </summary>
  60. private readonly IJsonSerializer _jsonSerializer;
  61. /// <summary>
  62. /// The _configuration manager
  63. /// </summary>
  64. private readonly IServerConfigurationManager _configurationManager;
  65. private readonly IFileSystem _fileSystem;
  66. private readonly IProviderManager _providerManager;
  67. public ConfigurationService(IJsonSerializer jsonSerializer, IServerConfigurationManager configurationManager, IFileSystem fileSystem, IProviderManager providerManager)
  68. {
  69. _jsonSerializer = jsonSerializer;
  70. _configurationManager = configurationManager;
  71. _fileSystem = fileSystem;
  72. _providerManager = providerManager;
  73. }
  74. /// <summary>
  75. /// Gets the specified request.
  76. /// </summary>
  77. /// <param name="request">The request.</param>
  78. /// <returns>System.Object.</returns>
  79. public object Get(GetConfiguration request)
  80. {
  81. var configPath = _configurationManager.ApplicationPaths.SystemConfigurationFilePath;
  82. var dateModified = _fileSystem.GetLastWriteTimeUtc(configPath);
  83. var cacheKey = (configPath + dateModified.Ticks).GetMD5();
  84. return ToOptimizedResultUsingCache(cacheKey, dateModified, null, () => _configurationManager.Configuration);
  85. }
  86. /// <summary>
  87. /// Posts the specified configuraiton.
  88. /// </summary>
  89. /// <param name="request">The request.</param>
  90. public void Post(UpdateConfiguration request)
  91. {
  92. // Silly, but we need to serialize and deserialize or the XmlSerializer will write the xml with an element name of UpdateConfiguration
  93. var json = _jsonSerializer.SerializeToString(request);
  94. var config = _jsonSerializer.DeserializeFromString<ServerConfiguration>(json);
  95. _configurationManager.ReplaceConfiguration(config);
  96. }
  97. public object Get(GetDefaultMetadataOptions request)
  98. {
  99. return ToOptimizedSerializedResultUsingCache(new MetadataOptions());
  100. }
  101. public object Get(GetMetadataPlugins request)
  102. {
  103. return ToOptimizedSerializedResultUsingCache(_providerManager.GetAllMetadataPlugins().ToList());
  104. }
  105. /// <summary>
  106. /// This is a temporary method used until image settings get broken out.
  107. /// </summary>
  108. /// <param name="request"></param>
  109. public void Post(UpdateVideoImageExtraction request)
  110. {
  111. var config = _configurationManager.Configuration;
  112. EnableImageExtractionForType(typeof(Movie), config, request.Enabled);
  113. EnableImageExtractionForType(typeof(Episode), config, request.Enabled);
  114. EnableImageExtractionForType(typeof(AdultVideo), config, request.Enabled);
  115. EnableImageExtractionForType(typeof(MusicVideo), config, request.Enabled);
  116. EnableImageExtractionForType(typeof(Video), config, request.Enabled);
  117. EnableImageExtractionForType(typeof(Trailer), config, request.Enabled);
  118. _configurationManager.SaveConfiguration();
  119. }
  120. public void Post(UpdateSaveLocalMetadata request)
  121. {
  122. var config = _configurationManager.Configuration;
  123. if (request.Enabled)
  124. {
  125. config.SaveLocalMeta = true;
  126. foreach (var options in config.MetadataOptions)
  127. {
  128. options.DisabledMetadataSavers = new string[] { };
  129. }
  130. }
  131. else
  132. {
  133. config.SaveLocalMeta = false;
  134. DisableSaversForType(typeof(Game), config);
  135. DisableSaversForType(typeof(GameSystem), config);
  136. DisableSaversForType(typeof(Movie), config);
  137. DisableSaversForType(typeof(BoxSet), config);
  138. DisableSaversForType(typeof(Book), config);
  139. DisableSaversForType(typeof(Series), config);
  140. DisableSaversForType(typeof(Season), config);
  141. DisableSaversForType(typeof(Episode), config);
  142. DisableSaversForType(typeof(MusicAlbum), config);
  143. DisableSaversForType(typeof(MusicArtist), config);
  144. DisableSaversForType(typeof(AdultVideo), config);
  145. DisableSaversForType(typeof(MusicVideo), config);
  146. DisableSaversForType(typeof(Video), config);
  147. }
  148. _configurationManager.SaveConfiguration();
  149. }
  150. private void DisableSaversForType(Type type, ServerConfiguration config)
  151. {
  152. var options = GetMetadataOptions(type, config);
  153. const string mediabrowserSaverName = "Media Browser Xml";
  154. if (!options.DisabledMetadataSavers.Contains(mediabrowserSaverName, StringComparer.OrdinalIgnoreCase))
  155. {
  156. var list = options.DisabledMetadataSavers.ToList();
  157. list.Add(mediabrowserSaverName);
  158. options.DisabledMetadataSavers = list.ToArray();
  159. }
  160. }
  161. private void EnableImageExtractionForType(Type type, ServerConfiguration config, bool enabled)
  162. {
  163. var options = GetMetadataOptions(type, config);
  164. const string imageProviderName = "Screen Grabber";
  165. var contains = options.DisabledImageFetchers.Contains(imageProviderName, StringComparer.OrdinalIgnoreCase);
  166. if (!enabled && !contains)
  167. {
  168. var list = options.DisabledImageFetchers.ToList();
  169. list.Add(imageProviderName);
  170. options.DisabledImageFetchers = list.ToArray();
  171. }
  172. else if (enabled && contains)
  173. {
  174. var list = options.DisabledImageFetchers.ToList();
  175. list.Remove(imageProviderName);
  176. options.DisabledImageFetchers = list.ToArray();
  177. }
  178. }
  179. private MetadataOptions GetMetadataOptions(Type type, ServerConfiguration config)
  180. {
  181. var options = config.MetadataOptions
  182. .FirstOrDefault(i => string.Equals(i.ItemType, type.Name, StringComparison.OrdinalIgnoreCase));
  183. if (options == null)
  184. {
  185. var list = config.MetadataOptions.ToList();
  186. options = new MetadataOptions
  187. {
  188. ItemType = type.Name
  189. };
  190. list.Add(options);
  191. config.MetadataOptions = list.ToArray();
  192. }
  193. return options;
  194. }
  195. }
  196. }