using MediaBrowser.ApiInteraction; using MediaBrowser.Common.IO; using MediaBrowser.Common.Kernel; using MediaBrowser.Model.Connectivity; using MediaBrowser.Model.Logging; using MediaBrowser.Model.Net; using MediaBrowser.UI.Configuration; using MediaBrowser.UI.Playback; using System; using System.Collections.Generic; using System.ComponentModel.Composition; using System.Net; using System.Net.Cache; using System.Net.Http; using System.Threading.Tasks; namespace MediaBrowser.UI.Controller { /// /// This controls application logic as well as server interaction within the UI. /// public class UIKernel : BaseKernel { /// /// Gets the instance. /// /// The instance. public static UIKernel Instance { get; private set; } /// /// Gets the API client. /// /// The API client. public ApiClient ApiClient { get; private set; } /// /// Gets the playback manager. /// /// The playback manager. public PlaybackManager PlaybackManager { get; private set; } /// /// Initializes a new instance of the class. /// public UIKernel(IApplicationHost appHost, IIsoManager isoManager, ILogger logger) : base(appHost, isoManager, logger) { Instance = this; } /// /// Gets the media players. /// /// The media players. [ImportMany(typeof(BaseMediaPlayer))] public IEnumerable MediaPlayers { get; private set; } /// /// Gets the list of currently loaded themes /// /// The themes. [ImportMany(typeof(BaseTheme))] public IEnumerable Themes { get; private set; } /// /// Gets the kernel context. /// /// The kernel context. public override KernelContext KernelContext { get { return KernelContext.Ui; } } /// /// Gets the UDP server port number. /// /// The UDP server port number. public override int UdpServerPortNumber { get { return 7360; } } /// /// Give the UI a different url prefix so that they can share the same port, in case they are installed on the same machine. /// /// The HTTP server URL prefix. public override string HttpServerUrlPrefix { get { return "http://+:" + Configuration.HttpServerPortNumber + "/mediabrowserui/"; } } /// /// Reload api client and update plugins after loading configuration /// /// Task. protected override async Task OnConfigurationLoaded() { ReloadApiClient(); try { await new PluginUpdater(Logger).UpdatePlugins().ConfigureAwait(false); } catch (HttpException ex) { Logger.ErrorException("Error updating plugins from the server", ex); } } /// /// Disposes the current ApiClient and creates a new one /// private void ReloadApiClient() { DisposeApiClient(); ApiClient = new ApiClient(Logger, new AsyncHttpClient(new WebRequestHandler { AutomaticDecompression = DecompressionMethods.Deflate, CachePolicy = new RequestCachePolicy(RequestCacheLevel.Revalidate) })) { ServerHostName = Configuration.ServerHostName, ServerApiPort = Configuration.ServerApiPort, ClientType = ClientType.Pc, DeviceName = Environment.MachineName, SerializationFormat = SerializationFormats.Json }; } /// /// Reloads the internal. /// /// Task. protected override Task ReloadInternal() { PlaybackManager = new PlaybackManager(this, Logger); return base.ReloadInternal(); } /// /// Called when [composable parts loaded]. /// /// Task. protected override async Task OnComposablePartsLoaded() { await base.OnComposablePartsLoaded().ConfigureAwait(false); // Once plugins have loaded give the api a reference to our protobuf serializer DataSerializer.DynamicSerializer = ProtobufSerializer.TypeModel; } /// /// Disposes the current ApiClient /// private void DisposeApiClient() { if (ApiClient != null) { ApiClient.Dispose(); } } /// /// Releases unmanaged and - optionally - managed resources. /// /// true to release both managed and unmanaged resources; false to release only unmanaged resources. protected override void Dispose(bool dispose) { if (dispose) { DisposeApiClient(); } base.Dispose(dispose); } } }