From 1a5a75854bd3ec4cdd771c9afdaefe0acb62c03c Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Sun, 29 Jun 2014 15:59:52 -0400 Subject: update translations --- MediaBrowser.Server.Implementations/Localization/LocalizationManager.cs | 1 + 1 file changed, 1 insertion(+) (limited to 'MediaBrowser.Server.Implementations/Localization/LocalizationManager.cs') diff --git a/MediaBrowser.Server.Implementations/Localization/LocalizationManager.cs b/MediaBrowser.Server.Implementations/Localization/LocalizationManager.cs index e1f5bcfdc..c21c9fa17 100644 --- a/MediaBrowser.Server.Implementations/Localization/LocalizationManager.cs +++ b/MediaBrowser.Server.Implementations/Localization/LocalizationManager.cs @@ -371,6 +371,7 @@ namespace MediaBrowser.Server.Implementations.Localization new LocalizatonOption{ Name="Italian", Value="it"}, new LocalizatonOption{ Name="Kazakh", Value="kk"}, new LocalizatonOption{ Name="Norwegian Bokmål", Value="nb"}, + new LocalizatonOption{ Name="Polish", Value="pl"}, new LocalizatonOption{ Name="Portuguese (Brazil)", Value="pt-BR"}, new LocalizatonOption{ Name="Portuguese (Portugal)", Value="pt-PT"}, new LocalizatonOption{ Name="Russian", Value="ru"}, -- cgit v1.2.3 From 651d483dec489a84bf93fe900e537cc7be9c4cbd Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Tue, 8 Jul 2014 20:46:11 -0400 Subject: rework nfo savers --- MediaBrowser.Api/Playback/BaseStreamingService.cs | 2 +- .../Channels/ChannelManager.cs | 6 +- .../HttpServer/HttpListenerHost.cs | 226 ++--- .../HttpServer/HttpResultFactory.cs | 7 +- .../HttpServer/LoggerUtils.cs | 15 +- .../HttpServer/Security/AuthService.cs | 6 +- .../Localization/JavaScript/es_ES.json | 219 +++++ .../Localization/JavaScript/ru.json | 2 +- .../Localization/LocalizationManager.cs | 2 +- .../Localization/Server/es_ES.json | 850 ++++++++++++++++++ .../Localization/Server/es_MX.json | 8 +- .../Localization/Server/it.json | 12 +- .../Localization/Server/pl.json | 14 +- .../Localization/Server/pt_BR.json | 10 +- .../Localization/Server/ru.json | 24 +- .../Localization/Server/sv.json | 16 +- .../MediaBrowser.Server.Implementations.csproj | 2 + .../FFMpeg/FFMpegDownloadInfo.cs | 19 +- MediaBrowser.Tests/MediaBrowser.Tests.csproj | 4 + .../MediaBrowser.XbmcMetadata.csproj | 14 +- MediaBrowser.XbmcMetadata/Parsers/BaseNfoParser.cs | 9 +- MediaBrowser.XbmcMetadata/Savers/AlbumNfoSaver.cs | 112 +++ MediaBrowser.XbmcMetadata/Savers/AlbumXmlSaver.cs | 134 --- MediaBrowser.XbmcMetadata/Savers/ArtistNfoSaver.cs | 94 ++ MediaBrowser.XbmcMetadata/Savers/ArtistXmlSaver.cs | 116 --- MediaBrowser.XbmcMetadata/Savers/BaseNfoSaver.cs | 997 +++++++++++++++++++++ .../Savers/EpisodeNfoSaver.cs | 122 +++ .../Savers/EpisodeXmlSaver.cs | 141 --- MediaBrowser.XbmcMetadata/Savers/MovieNfoSaver.cs | 113 +++ MediaBrowser.XbmcMetadata/Savers/MovieXmlSaver.cs | 137 --- MediaBrowser.XbmcMetadata/Savers/SeasonNfoSaver.cs | 63 ++ MediaBrowser.XbmcMetadata/Savers/SeasonXmlSaver.cs | 86 -- MediaBrowser.XbmcMetadata/Savers/SeriesNfoSaver.cs | 113 +++ MediaBrowser.XbmcMetadata/Savers/SeriesXmlSaver.cs | 122 --- .../Savers/XmlSaverHelpers.cs | 910 ------------------- 35 files changed, 2897 insertions(+), 1830 deletions(-) create mode 100644 MediaBrowser.Server.Implementations/Localization/JavaScript/es_ES.json create mode 100644 MediaBrowser.Server.Implementations/Localization/Server/es_ES.json create mode 100644 MediaBrowser.XbmcMetadata/Savers/AlbumNfoSaver.cs delete mode 100644 MediaBrowser.XbmcMetadata/Savers/AlbumXmlSaver.cs create mode 100644 MediaBrowser.XbmcMetadata/Savers/ArtistNfoSaver.cs delete mode 100644 MediaBrowser.XbmcMetadata/Savers/ArtistXmlSaver.cs create mode 100644 MediaBrowser.XbmcMetadata/Savers/BaseNfoSaver.cs create mode 100644 MediaBrowser.XbmcMetadata/Savers/EpisodeNfoSaver.cs delete mode 100644 MediaBrowser.XbmcMetadata/Savers/EpisodeXmlSaver.cs create mode 100644 MediaBrowser.XbmcMetadata/Savers/MovieNfoSaver.cs delete mode 100644 MediaBrowser.XbmcMetadata/Savers/MovieXmlSaver.cs create mode 100644 MediaBrowser.XbmcMetadata/Savers/SeasonNfoSaver.cs delete mode 100644 MediaBrowser.XbmcMetadata/Savers/SeasonXmlSaver.cs create mode 100644 MediaBrowser.XbmcMetadata/Savers/SeriesNfoSaver.cs delete mode 100644 MediaBrowser.XbmcMetadata/Savers/SeriesXmlSaver.cs delete mode 100644 MediaBrowser.XbmcMetadata/Savers/XmlSaverHelpers.cs (limited to 'MediaBrowser.Server.Implementations/Localization/LocalizationManager.cs') diff --git a/MediaBrowser.Api/Playback/BaseStreamingService.cs b/MediaBrowser.Api/Playback/BaseStreamingService.cs index d8e3ee75d..094a9034d 100644 --- a/MediaBrowser.Api/Playback/BaseStreamingService.cs +++ b/MediaBrowser.Api/Playback/BaseStreamingService.cs @@ -953,7 +953,7 @@ namespace MediaBrowser.Api.Playback // This is arbitrary, but add a little buffer time when internet streaming if (state.InputProtocol != MediaProtocol.File) { - await Task.Delay(3000, cancellationTokenSource.Token).ConfigureAwait(false); + await Task.Delay(2500, cancellationTokenSource.Token).ConfigureAwait(false); } } diff --git a/MediaBrowser.Server.Implementations/Channels/ChannelManager.cs b/MediaBrowser.Server.Implementations/Channels/ChannelManager.cs index d0ea64e0f..91bb1cbe6 100644 --- a/MediaBrowser.Server.Implementations/Channels/ChannelManager.cs +++ b/MediaBrowser.Server.Implementations/Channels/ChannelManager.cs @@ -1,5 +1,4 @@ -using System.Collections.Concurrent; -using MediaBrowser.Common.Extensions; +using MediaBrowser.Common.Extensions; using MediaBrowser.Common.IO; using MediaBrowser.Controller.Channels; using MediaBrowser.Controller.Configuration; @@ -16,6 +15,7 @@ using MediaBrowser.Model.Logging; using MediaBrowser.Model.Querying; using MediaBrowser.Model.Serialization; using System; +using System.Collections.Concurrent; using System.Collections.Generic; using System.IO; using System.Linq; @@ -1167,6 +1167,8 @@ namespace MediaBrowser.Server.Implementations.Channels var mediaSource = info.MediaSources.FirstOrDefault(); item.Path = mediaSource == null ? null : mediaSource.Path; + + item.DisplayMediaType = channelMediaItem.ContentType.ToString(); } if (isNew) diff --git a/MediaBrowser.Server.Implementations/HttpServer/HttpListenerHost.cs b/MediaBrowser.Server.Implementations/HttpServer/HttpListenerHost.cs index cfcbb077e..340149182 100644 --- a/MediaBrowser.Server.Implementations/HttpServer/HttpListenerHost.cs +++ b/MediaBrowser.Server.Implementations/HttpServer/HttpListenerHost.cs @@ -1,13 +1,12 @@ -using Funq; +using Amib.Threading; +using Funq; using MediaBrowser.Common; using MediaBrowser.Common.Extensions; using MediaBrowser.Common.Net; using MediaBrowser.Controller.Net; using MediaBrowser.Model.Logging; -using MediaBrowser.Server.Implementations.HttpServer.Security; using ServiceStack; using ServiceStack.Api.Swagger; -using ServiceStack.Auth; using ServiceStack.Host; using ServiceStack.Host.Handlers; using ServiceStack.Host.HttpListener; @@ -38,8 +37,11 @@ namespace MediaBrowser.Server.Implementations.HttpServer private HttpListener Listener { get; set; } protected bool IsStarted = false; - private readonly List _autoResetEvents = new List(); + private readonly AutoResetEvent _listenForNextRequest = new AutoResetEvent(false); + private readonly SmartThreadPool _threadPoolManager; + private const int IdleTimeout = 300; + private readonly ContainerAdapter _containerAdapter; private readonly ConcurrentDictionary _localEndPoints = new ConcurrentDictionary(StringComparer.OrdinalIgnoreCase); @@ -64,10 +66,8 @@ namespace MediaBrowser.Server.Implementations.HttpServer _containerAdapter = new ContainerAdapter(applicationHost); - for (var i = 0; i < 1; i++) - { - _autoResetEvents.Add(new AutoResetEvent(false)); - } + _threadPoolManager = new SmartThreadPool(IdleTimeout, + maxWorkerThreads: Math.Max(16, Environment.ProcessorCount * 2)); } public override void Configure(Container container) @@ -95,9 +95,9 @@ namespace MediaBrowser.Server.Implementations.HttpServer Plugins.Add(new SwaggerFeature()); Plugins.Add(new CorsFeature(allowedHeaders: "Content-Type, Authorization")); - Plugins.Add(new AuthFeature(() => new AuthUserSession(), new IAuthProvider[] { - new SessionAuthProvider(_containerAdapter.Resolve()), - })); + //Plugins.Add(new AuthFeature(() => new AuthUserSession(), new IAuthProvider[] { + // new SessionAuthProvider(_containerAdapter.Resolve()), + //})); HostContext.GlobalResponseFilters.Add(new ResponseFilter(_logger).FilterResponse); } @@ -115,7 +115,7 @@ namespace MediaBrowser.Server.Implementations.HttpServer Config.HandlerFactoryPath = string.IsNullOrEmpty(HandlerPath) ? null - : "/" + HandlerPath; + : HandlerPath; Config.MetadataRedirectPath = string.IsNullOrEmpty(HandlerPath) ? "metadata" @@ -148,14 +148,14 @@ namespace MediaBrowser.Server.Implementations.HttpServer public override ServiceStackHost Start(string listeningAtUrlBase) { - StartListener(); + StartListener(Listen); return this; } /// /// Starts the Web Service /// - private void StartListener() + private void StartListener(WaitCallback listenCallback) { // *** Already running - just leave it in place if (IsStarted) @@ -164,6 +164,8 @@ namespace MediaBrowser.Server.Implementations.HttpServer if (Listener == null) Listener = new HttpListener(); + HostContext.Config.HandlerFactoryPath = ListenerRequest.GetHandlerPathIfAny(UrlPrefixes.First()); + foreach (var prefix in UrlPrefixes) { _logger.Info("Adding HttpListener prefix " + prefix); @@ -175,11 +177,7 @@ namespace MediaBrowser.Server.Implementations.HttpServer Listener.Start(); _logger.Info("HttpListener started"); - for (var i = 0; i < _autoResetEvents.Count; i++) - { - var index = i; - ThreadPool.QueueUserWorkItem(o => Listen(o, index)); - } + ThreadPool.QueueUserWorkItem(listenCallback); } private bool IsListening @@ -188,7 +186,7 @@ namespace MediaBrowser.Server.Implementations.HttpServer } // Loop here to begin processing of new requests. - private void Listen(object state, int index) + private void Listen(object state) { while (IsListening) { @@ -196,9 +194,8 @@ namespace MediaBrowser.Server.Implementations.HttpServer try { - Listener.BeginGetContext(c => ListenerCallback(c, index), Listener); - - _autoResetEvents[index].WaitOne(); + Listener.BeginGetContext(ListenerCallback, Listener); + _listenForNextRequest.WaitOne(); } catch (Exception ex) { @@ -210,19 +207,19 @@ namespace MediaBrowser.Server.Implementations.HttpServer } // Handle the processing of a request in here. - private void ListenerCallback(IAsyncResult asyncResult, int index) + private void ListenerCallback(IAsyncResult asyncResult) { var listener = asyncResult.AsyncState as HttpListener; - HttpListenerContext context = null; + HttpListenerContext context; if (listener == null) return; + var isListening = listener.IsListening; try { - if (!IsListening) + if (!isListening) { - _logger.Debug("Ignoring ListenerCallback() as HttpListener is no longer listening"); - return; + _logger.Debug("Ignoring ListenerCallback() as HttpListener is no longer listening"); return; } // The EndGetContext() method, as with all Begin/End asynchronous methods in the .NET Framework, // blocks until there is a request to be processed or some type of data is available. @@ -244,80 +241,35 @@ namespace MediaBrowser.Server.Implementations.HttpServer // so that it calls the BeginGetContext() (or possibly exits if we're not // listening any more) method to start handling the next incoming request // while we continue to process this request on a different thread. - _autoResetEvents[index].Set(); + _listenForNextRequest.Set(); } - var date = DateTime.Now; + _threadPoolManager.QueueWorkItem(() => InitTask(context)); + } - Task.Factory.StartNew(async () => + public virtual void InitTask(HttpListenerContext context) + { + try { - try - { - var request = context.Request; - - LogHttpRequest(request, index); - - if (request.IsWebSocketRequest) - { - await ProcessWebSocketRequest(context).ConfigureAwait(false); - return; - } - - var localPath = request.Url.LocalPath; - - if (string.Equals(localPath, "/" + HandlerPath + "/", StringComparison.OrdinalIgnoreCase)) - { - context.Response.Redirect(DefaultRedirectPath); - context.Response.Close(); - return; - } - if (string.Equals(localPath, "/" + HandlerPath, StringComparison.OrdinalIgnoreCase)) - { - context.Response.Redirect(HandlerPath + "/" + DefaultRedirectPath); - context.Response.Close(); - return; - } - if (string.Equals(localPath, "/", StringComparison.OrdinalIgnoreCase)) - { - context.Response.Redirect(HandlerPath + "/" + DefaultRedirectPath); - context.Response.Close(); - return; - } - if (string.IsNullOrEmpty(localPath)) - { - context.Response.Redirect("/" + HandlerPath + "/" + DefaultRedirectPath); - context.Response.Close(); - return; - } - - var url = request.Url.ToString(); - var endPoint = request.RemoteEndPoint; - - await ProcessRequestAsync(context).ConfigureAwait(false); + var task = this.ProcessRequestAsync(context); + task.ContinueWith(x => HandleError(x.Exception, context), TaskContinuationOptions.OnlyOnFaulted | TaskContinuationOptions.AttachedToParent); - var duration = DateTime.Now - date; - - if (EnableHttpRequestLogging) - { - LoggerUtils.LogResponse(_logger, context.Response, url, endPoint, duration); - } - } - catch (Exception ex) + if (task.Status == TaskStatus.Created) { - _logger.ErrorException("ProcessRequest failure", ex); - - HandleError(ex, context, _logger); + task.RunSynchronously(); } - - }); + } + catch (Exception ex) + { + HandleError(ex, context); + } } /// /// Logs the HTTP request. /// /// The request. - /// The index. - private void LogHttpRequest(HttpListenerRequest request, int index) + private void LogHttpRequest(HttpListenerRequest request) { var endpoint = request.LocalEndPoint; @@ -330,7 +282,7 @@ namespace MediaBrowser.Server.Implementations.HttpServer if (EnableHttpRequestLogging) { - LoggerUtils.LogRequest(_logger, request, index); + LoggerUtils.LogRequest(_logger, request); } } @@ -359,7 +311,7 @@ namespace MediaBrowser.Server.Implementations.HttpServer #endif } - public static void HandleError(Exception ex, HttpListenerContext context, ILogger logger) + private void HandleError(Exception ex, HttpListenerContext context) { try { @@ -372,6 +324,16 @@ namespace MediaBrowser.Server.Implementations.HttpServer return; } + var errorResponse = new ErrorResponse + { + ResponseStatus = new ResponseStatus + { + ErrorCode = ex.GetType().GetOperationName(), + Message = ex.Message, + StackTrace = ex.StackTrace, + } + }; + var contentType = httpReq.ResponseContentType; var serializer = HostContext.ContentTypes.GetResponseSerializer(contentType); @@ -394,23 +356,13 @@ namespace MediaBrowser.Server.Implementations.HttpServer httpRes.ContentType = contentType; - var errorResponse = new ErrorResponse - { - ResponseStatus = new ResponseStatus - { - ErrorCode = ex.GetType().GetOperationName(), - Message = ex.Message, - StackTrace = ex.StackTrace, - } - }; - serializer(httpReq, errorResponse, httpRes); httpRes.Close(); } catch (Exception errorEx) { - logger.ErrorException("Error this.ProcessRequest(context)(Exception while writing error to the response)", errorEx); + _logger.ErrorException("Error this.ProcessRequest(context)(Exception while writing error to the response)", errorEx); } } @@ -444,6 +396,44 @@ namespace MediaBrowser.Server.Implementations.HttpServer /// protected Task ProcessRequestAsync(HttpListenerContext context) { + var request = context.Request; + + LogHttpRequest(request); + + if (request.IsWebSocketRequest) + { + return ProcessWebSocketRequest(context); + } + + var localPath = request.Url.LocalPath; + + if (string.Equals(localPath, "/" + HandlerPath + "/", StringComparison.OrdinalIgnoreCase)) + { + context.Response.Redirect(DefaultRedirectPath); + context.Response.Close(); + return Task.FromResult(true); + } + if (string.Equals(localPath, "/" + HandlerPath, StringComparison.OrdinalIgnoreCase)) + { + context.Response.Redirect(HandlerPath + "/" + DefaultRedirectPath); + context.Response.Close(); + return Task.FromResult(true); + } + if (string.Equals(localPath, "/", StringComparison.OrdinalIgnoreCase)) + { + context.Response.Redirect(HandlerPath + "/" + DefaultRedirectPath); + context.Response.Close(); + return Task.FromResult(true); + } + if (string.IsNullOrEmpty(localPath)) + { + context.Response.Redirect("/" + HandlerPath + "/" + DefaultRedirectPath); + context.Response.Close(); + return Task.FromResult(true); + } + + var date = DateTime.Now; + if (string.IsNullOrEmpty(context.Request.RawUrl)) return ((object)null).AsTaskResult(); @@ -451,10 +441,10 @@ namespace MediaBrowser.Server.Implementations.HttpServer var httpReq = GetRequest(context, operationName); var httpRes = httpReq.Response; - //var pathInfo = httpReq.PathInfo; - var handler = HttpHandlerFactory.GetHandler(httpReq); - //var handler = HttpHandlerFactory.GetHandlerForPathInfo(httpReq.HttpMethod, pathInfo, pathInfo, httpReq.GetPhysicalPath()); + + var url = request.Url.ToString(); + var remoteIp = httpReq.RemoteIp; var serviceStackHandler = handler as IServiceStackHandler; if (serviceStackHandler != null) @@ -466,7 +456,22 @@ namespace MediaBrowser.Server.Implementations.HttpServer } var task = serviceStackHandler.ProcessRequestAsync(httpReq, httpRes, operationName); - task.ContinueWith(x => httpRes.Close()); + + task.ContinueWith(x => httpRes.Close(), TaskContinuationOptions.OnlyOnRanToCompletion | TaskContinuationOptions.AttachedToParent); + //Matches Exceptions handled in HttpListenerBase.InitTask() + + var statusCode = httpRes.StatusCode; + + task.ContinueWith(x => + { + var duration = DateTime.Now - date; + + if (EnableHttpRequestLogging) + { + LoggerUtils.LogResponse(_logger, statusCode, url, remoteIp, duration); + } + + }, TaskContinuationOptions.None); return task; } @@ -496,6 +501,13 @@ namespace MediaBrowser.Server.Implementations.HttpServer base.Init(); } + //public override RouteAttribute[] GetRouteAttributes(System.Type requestType) + //{ + // var routes = base.GetRouteAttributes(requestType); + // routes.Each(x => x.Path = "/api" + x.Path); + // return routes; + //} + /// /// Releases the specified instance. /// @@ -518,6 +530,8 @@ namespace MediaBrowser.Server.Implementations.HttpServer if (disposing) { + _threadPoolManager.Dispose(); + Stop(); } diff --git a/MediaBrowser.Server.Implementations/HttpServer/HttpResultFactory.cs b/MediaBrowser.Server.Implementations/HttpServer/HttpResultFactory.cs index 925ef8050..8831d635c 100644 --- a/MediaBrowser.Server.Implementations/HttpServer/HttpResultFactory.cs +++ b/MediaBrowser.Server.Implementations/HttpServer/HttpResultFactory.cs @@ -382,9 +382,14 @@ namespace MediaBrowser.Server.Implementations.HttpServer return result; } + return GetNonCachedResult(requestContext, contentType, factoryFn, responseHeaders, isHeadRequest); + } + + private async Task GetNonCachedResult(IRequest requestContext, string contentType, Func> factoryFn, IDictionary responseHeaders = null, bool isHeadRequest = false) + { var compress = ShouldCompressResponse(requestContext, contentType); - var hasOptions = GetStaticResult(requestContext, responseHeaders, contentType, factoryFn, compress, isHeadRequest).Result; + var hasOptions = await GetStaticResult(requestContext, responseHeaders, contentType, factoryFn, compress, isHeadRequest).ConfigureAwait(false); AddResponseHeaders(hasOptions, responseHeaders); diff --git a/MediaBrowser.Server.Implementations/HttpServer/LoggerUtils.cs b/MediaBrowser.Server.Implementations/HttpServer/LoggerUtils.cs index 3c8f86b1e..19d2f9c45 100644 --- a/MediaBrowser.Server.Implementations/HttpServer/LoggerUtils.cs +++ b/MediaBrowser.Server.Implementations/HttpServer/LoggerUtils.cs @@ -1,7 +1,5 @@ -using System.Globalization; -using MediaBrowser.Model.Logging; +using MediaBrowser.Model.Logging; using System; -using System.Linq; using System.Net; using System.Text; @@ -14,8 +12,7 @@ namespace MediaBrowser.Server.Implementations.HttpServer /// /// The logger. /// The request. - /// Index of the worker. - public static void LogRequest(ILogger logger, HttpListenerRequest request, int workerIndex) + public static void LogRequest(ILogger logger, HttpListenerRequest request) { var log = new StringBuilder(); @@ -32,21 +29,19 @@ namespace MediaBrowser.Server.Implementations.HttpServer /// Logs the response. /// /// The logger. - /// The response. + /// The status code. /// The URL. /// The end point. /// The duration. - public static void LogResponse(ILogger logger, HttpListenerResponse response, string url, IPEndPoint endPoint, TimeSpan duration) + public static void LogResponse(ILogger logger, int statusCode, string url, string endPoint, TimeSpan duration) { - var statusCode = response.StatusCode; - var log = new StringBuilder(); log.AppendLine(string.Format("Url: {0}", url)); //log.AppendLine("Headers: " + string.Join(",", response.Headers.AllKeys.Select(k => k + "=" + response.Headers[k]))); - var responseTime = string.Format(". Response time: {0} ms. Content length: {1} bytes.", duration.TotalMilliseconds, response.ContentLength64.ToString(CultureInfo.InvariantCulture)); + var responseTime = string.Format(". Response time: {0} ms.", duration.TotalMilliseconds); var msg = "HTTP Response " + statusCode + " to " + endPoint + responseTime; diff --git a/MediaBrowser.Server.Implementations/HttpServer/Security/AuthService.cs b/MediaBrowser.Server.Implementations/HttpServer/Security/AuthService.cs index 6894d7ac7..74ec325c6 100644 --- a/MediaBrowser.Server.Implementations/HttpServer/Security/AuthService.cs +++ b/MediaBrowser.Server.Implementations/HttpServer/Security/AuthService.cs @@ -46,10 +46,10 @@ namespace MediaBrowser.Server.Implementations.HttpServer.Security if (HostContext.HasValidAuthSecret(req)) return; - ExecuteBasic(req, res, requestDto); //first check if session is authenticated - if (res.IsClosed) return; //AuthenticateAttribute already closed the request (ie auth failed) + //ExecuteBasic(req, res, requestDto); //first check if session is authenticated + //if (res.IsClosed) return; //AuthenticateAttribute already closed the request (ie auth failed) - ValidateUser(req); + //ValidateUser(req); } private void ValidateUser(IRequest req) diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/es_ES.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/es_ES.json new file mode 100644 index 000000000..1073d16cf --- /dev/null +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/es_ES.json @@ -0,0 +1,219 @@ +{ + "SettingsSaved": "Configuraci\u00f3n guardada", + "AddUser": "Agregar usuario", + "Users": "Usuarios", + "Delete": "Borrar", + "Administrator": "Administrador", + "Password": "Contrase\u00f1a", + "DeleteImage": "Borrar Imagen", + "DeleteImageConfirmation": "Est\u00e1 seguro que desea borrar esta imagen?", + "FileReadCancelled": "La lectura del archivo se ha cancelado.", + "FileNotFound": "Archivo no encontrado.", + "FileReadError": "Se encontr\u00f3 un error al leer el archivo.", + "DeleteUser": "Borrar Usuario", + "DeleteUserConfirmation": "Esta seguro que desea eliminar a {0}?", + "PasswordResetHeader": "Restablecer contrase\u00f1a", + "PasswordResetComplete": "La contrase\u00f1a se ha restablecido.", + "PasswordResetConfirmation": "Esta seguro que desea restablecer la contrase\u00f1a?", + "PasswordSaved": "Contrase\u00f1a guardada.", + "PasswordMatchError": "La contrase\u00f1a y la confirmaci\u00f3n de la contrase\u00f1a deben de ser iguales.", + "OptionRelease": "Release Oficial", + "OptionBeta": "Beta", + "OptionDev": "Desarrollo", + "UninstallPluginHeader": "Desinstalar Plugin", + "UninstallPluginConfirmation": "Esta seguro que desea desinstalar {0}?", + "NoPluginConfigurationMessage": "El plugin no requiere configuraci\u00f3n", + "NoPluginsInstalledMessage": "No tiene plugins instalados.", + "BrowsePluginCatalogMessage": "Navegar el catalogo de plugins para ver los plugins disponibles.", + "MessageKeyEmailedTo": "Clave enviada por email a {0}.", + "MessageKeysLinked": "Claves vinculadas.", + "HeaderConfirmation": "Confirmaci\u00f3n", + "MessageKeyUpdated": "Gracias. Su clave de seguidor ha sido actualizada.", + "MessageKeyRemoved": "Gracias. Su clave de seguidor ha sido eliminada.", + "ErrorLaunchingChromecast": "Ha habido un error al lanzar chromecast. Asegurese que su dispositivo est\u00e1 conectado a su red inal\u00e1mbrica.", + "HeaderSearch": "Buscar", + "LabelArtist": "Artista", + "LabelMovie": "Pel\u00edcula", + "LabelMusicVideo": "Video Musical", + "LabelEpisode": "Episodio", + "LabelSeries": "Series", + "LabelStopping": "Deteniendo", + "ButtonStop": "Detener", + "LabelCancelled": "(cancelado)", + "LabelFailed": "(fracasado)", + "LabelAbortedByServerShutdown": "(Abortado por cierre del servidor)", + "LabelScheduledTaskLastRan": "\u00daltima ejecuci\u00f3n {0}, teniendo {1}.", + "HeaderDeleteTaskTrigger": "Eliminar tarea de activaci\u00f3n", + "HeaderTaskTriggers": "Tareas de activaci\u00f3n", + "MessageDeleteTaskTrigger": "\u00bfEst\u00e1 seguro que desea eliminar esta tarea de activaci\u00f3n?", + "MessageNoPluginsInstalled": "No tiene plugins instalados.", + "LabelVersionInstalled": "{0} instalado", + "LabelNumberReviews": "{0} Revisiones", + "LabelFree": "Libre", + "HeaderSelectAudio": "Seleccionar Audio", + "HeaderSelectSubtitles": "Seleccionar Subt\u00edtulos", + "LabelDefaultStream": "(Por defecto)", + "LabelForcedStream": "(Forzado)", + "LabelDefaultForcedStream": "(Por defecto\/Forzado)", + "LabelUnknownLanguage": "Idioma desconocido", + "ButtonMute": "Silencio", + "ButtonUnmute": "Activar audio", + "ButtonNextTrack": "Next Track", + "ButtonPause": "Pausa", + "ButtonPlay": "Reproducir", + "ButtonEdit": "Editar", + "ButtonQueue": "En cola", + "ButtonPlayTrailer": "Reproducir trailer", + "ButtonPlaylist": "Lista de reproducci\u00f3n", + "ButtonPreviousTrack": "Previous Track", + "LabelEnabled": "Activado", + "LabelDisabled": "Desactivado", + "ButtonMoreInformation": "M\u00e1s informaci\u00f3n", + "LabelNoUnreadNotifications": "No hay notificaciones sin leer.", + "ButtonViewNotifications": "Ver notificaciones", + "ButtonMarkTheseRead": "Marcar como le\u00eddo", + "ButtonClose": "Cerrar", + "LabelAllPlaysSentToPlayer": "Todas las reproducciones se enviar\u00e1n al reproductor seleccionado.", + "MessageInvalidUser": "Usuario o contrase\u00f1a no v\u00e1lido.", + "HeaderAllRecordings": "Todas la grabaciones", + "RecommendationBecauseYouLike": "Como le gusta {0}", + "RecommendationBecauseYouWatched": "Ya que vi\u00f3 {0}", + "RecommendationDirectedBy": "Dirigida por {0}", + "RecommendationStarring": "Protagonizada por {0}", + "HeaderConfirmRecordingCancellation": "Confirmar la cancelaci\u00f3n de la grabaci\u00f3n", + "MessageConfirmRecordingCancellation": "\u00bfEst\u00e1 seguro que desea cancelar esta grabaci\u00f3n?", + "MessageRecordingCancelled": "Grabaci\u00f3n cancelada.", + "HeaderConfirmSeriesCancellation": "Confirmar cancelaci\u00f3n de serie", + "MessageConfirmSeriesCancellation": "\u00bfEst\u00e1 seguro que desea cancelar esta serie?", + "MessageSeriesCancelled": "Serie cancelada", + "HeaderConfirmRecordingDeletion": "Confirmar borrado de la grabaci\u00f3n", + "MessageConfirmRecordingDeletion": "\u00bfEst\u00e1 seguro que desea borrar esta grabaci\u00f3n?", + "MessageRecordingDeleted": "Grabaci\u00f3n eliminada.", + "ButonCancelRecording": "Cancelar Grabaci\u00f3n", + "MessageRecordingSaved": "Grabaci\u00f3n guardada.", + "OptionSunday": "Domingo", + "OptionMonday": "Lunes", + "OptionTuesday": "Martes", + "OptionWednesday": "Mi\u00e9rcoles", + "OptionThursday": "Jueves", + "OptionFriday": "Viernes", + "OptionSaturday": "S\u00e1bado", + "HeaderConfirmDeletion": "Confirmar borrado", + "MessageConfirmPathSubstitutionDeletion": "\u00bfEst\u00e1 seguro que desea borrar esta ruta de sustituci\u00f3n?", + "LiveTvUpdateAvailable": "(Actualizaci\u00f3n disponible)", + "LabelVersionUpToDate": "\u00a1Actualizado!", + "ButtonResetTuner": "Reiniciar sintonizador", + "HeaderResetTuner": "Reinicio del sintonizador", + "MessageConfirmResetTuner": "\u00bfEst\u00e1 seguro que desea reiniciar este sintonizador? Cualquier reproducci\u00f3n o grabaci\u00f3n activa se detendr\u00e1 inmediatamente.", + "ButtonCancelSeries": "Cancelar serie", + "LabelAllChannels": "Todos los canales", + "HeaderSeriesRecordings": "Grabaciones de series", + "LabelAnytime": "A cualquier hora", + "StatusRecording": "Grabando", + "StatusWatching": "Viendo", + "StatusRecordingProgram": "Grabando {0}", + "StatusWatchingProgram": "Viendo {0}", + "HeaderSplitMedia": "Divisi\u00f3n de medios", + "MessageConfirmSplitMedia": "\u00bfEst\u00e1 seguro que desea dividir los medios en partes separadas?", + "HeaderError": "Error", + "MessagePleaseSelectOneItem": "Seleccione al menos un elemento.", + "MessagePleaseSelectTwoItems": "Seleccione al menos dos elementos.", + "MessageTheFollowingItemsWillBeGrouped": "Los siguientes t\u00edtulos se agrupar\u00e1n en un elemento.", + "MessageConfirmItemGrouping": "Los clientes de Media Browser elegir\u00e1n autom\u00e1ticamente la mejor forma de reproduccion sobre la base de dispositivo y rendimiento de la red. \u00bfEst\u00e1 seguro que desea continuar?", + "HeaderResume": "Continuar", + "HeaderMyViews": "Mis vistas", + "HeaderLibraryFolders": "Vista de carpeta", + "HeaderLatestMedia": "\u00daltimos medios", + "ButtonMore": "M\u00e1s...", + "HeaderFavoriteMovies": "Pel\u00edculas favoritas", + "HeaderFavoriteShows": "Programas favoritos", + "HeaderFavoriteEpisodes": "Episodios favoritos", + "HeaderFavoriteGames": "Juegos favoritos", + "HeaderRatingsDownloads": "\nClasificaci\u00f3n \/ Descargas", + "HeaderConfirmProfileDeletion": "Confirmar borrado del perfil", + "MessageConfirmProfileDeletion": "\u00bfEst\u00e1 seguro que desea eliminar este perfil?", + "HeaderSelectServerCachePath": "Seleccione la ruta para el cach\u00e9 del servidor", + "HeaderSelectTranscodingPath": "Seleccione la ruta temporal del transcodificador", + "HeaderSelectImagesByNamePath": "Seleccione la ruta para im\u00e1genes", + "HeaderSelectMetadataPath": "Seleccione la ruta para Metadatos", + "HeaderSelectServerCachePathHelp": "Busque o escriba la ruta de acceso que se utilizar\u00e1 para los archivos de cach\u00e9 del servidor. La carpeta debe tener permiso de escritura. La ubicaci\u00f3n de esta carpeta afectar\u00e1 directamente al rendimiento del servidor e idealmente debe ser colocado en una unidad de estado s\u00f3lido.", + "HeaderSelectTranscodingPathHelp": "Busque o escriba la ruta de acceso que se utilizar\u00e1 para la transcodificaci\u00f3n de archivos temporales. La carpeta debe tener permiso de escritura.", + "HeaderSelectImagesByNamePathHelp": "Busque o escriba la ruta de sus elementos por nombre de carpeta. La carpeta debe tener permisos de escritura.", + "HeaderSelectMetadataPathHelp": "Busque o escriba la ruta donde desea almacenar los metadatos. La carpeta debe tener permiso de escritura.", + "HeaderSelectChannelDownloadPath": "Seleccione la ruta de descargas de canal", + "HeaderSelectChannelDownloadPathHelp": "Navege o escriba la ruta para guardar el los archivos de cach\u00e9 de canales. La carpeta debe tener permisos de escritura.", + "OptionNewCollection": "Nuevo...", + "ButtonAdd": "A\u00f1adir", + "ButtonRemove": "Quitar", + "LabelChapterDownloaders": "Downloaders de cap\u00edtulos:", + "LabelChapterDownloadersHelp": "Habilitar y clasificar sus descargadores de cap\u00edtulos preferidos en orden de prioridad. Descargadores de menor prioridad s\u00f3lo se utilizar\u00e1n para completar la informaci\u00f3n que falta.", + "HeaderFavoriteAlbums": "\u00c1lbumes favoritos", + "HeaderLatestChannelMedia": "\u00dcltimos elementos de canal", + "ButtonOrganizeFile": "Organizar archivos", + "ButtonDeleteFile": "Borrar archivos", + "HeaderOrganizeFile": "Organizar archivos", + "HeaderDeleteFile": "Borrar archivos", + "StatusSkipped": "Saltado", + "StatusFailed": "Err\u00f3neo", + "StatusSuccess": "\u00c9xito", + "MessageFileWillBeDeleted": "El siguiente archivo se eliminar\u00e1:", + "MessageSureYouWishToProceed": "\u00bfEst\u00e1 seguro que desea proceder?", + "MessageDuplicatesWillBeDeleted": "Adem\u00e1s se eliminar\u00e1n los siguientes duplicados:", + "MessageFollowingFileWillBeMovedFrom": "El siguiente archivo se mover\u00e1 desde:", + "MessageDestinationTo": "hasta:", + "HeaderSelectWatchFolder": "Seleccionar carpeta para el reloj", + "HeaderSelectWatchFolderHelp": "Navegue o introduzca la ruta para la carpeta para el reloj. La carpeta debe tener permisos de escritura.", + "OrganizePatternResult": "Resultado: {0}", + "HeaderRestart": "Reiniciar", + "HeaderShutdown": "Apagar", + "MessageConfirmRestart": "\u00bfEst\u00e1 seguro que desea reiniciar Media Browser Server?", + "MessageConfirmShutdown": "\u00bfEst\u00e1 seguro que desea apagar Media Browser Server?", + "ButtonUpdateNow": "Actualizar ahora", + "NewVersionOfSomethingAvailable": "\u00a1Hay disponible una nueva versi\u00f3n de {0}!", + "VersionXIsAvailableForDownload": "La versi\u00f3n {0} est\u00e1 disponible para su descarga.", + "LabelVersionNumber": "Versi\u00f3n {0}", + "LabelPlayMethodTranscoding": "Transcodificaci\u00f3n", + "LabelPlayMethodDirectStream": "Streaming directo", + "LabelPlayMethodDirectPlay": "Reproducci\u00f3n directa", + "LabelAudioCodec": "Audio: {0}", + "LabelVideoCodec": "Video: {0}", + "LabelRemoteAccessUrl": "Acceso remoto: {0}", + "LabelRunningOnPort": "Ejecut\u00e1ndose en el puerto {0}.", + "LabelRunningOnPorts": "Ejecut\u00e1ndose en los puertos {0} y {1}.", + "HeaderLatestFromChannel": "Lo \u00faltimo de {0}", + "ButtonDownload": "Descargar", + "LabelUnknownLanaguage": "Idioma desconocido", + "HeaderCurrentSubtitles": "Subt\u00edtulos actuales", + "MessageDownloadQueued": "La descarga se ha a\u00f1adido a la cola", + "MessageAreYouSureDeleteSubtitles": "\u00bfEst\u00e1 seguro que desea eliminar este archivo de subt\u00edtulos?", + "ButtonRemoteControl": "Control remoto", + "HeaderLatestTvRecordings": "\u00daltimas grabaciones", + "ButtonOk": "OK", + "ButtonCancel": "Cancelar", + "ButtonRefresh": "Refrescar", + "LabelCurrentPath": "Ruta actual:", + "HeaderSelectMediaPath": "Seleccionar la ruta para Medios", + "ButtonNetwork": "Red", + "MessageDirectoryPickerInstruction": "Rutas de red pueden ser introducidas manualmente en el caso de que el bot\u00f3n de la red no pueda localizar sus dispositivos. Por ejemplo, {0} o {1}.", + "HeaderMenu": "Men\u00fa", + "ButtonOpen": "Abrir", + "ButtonOpenInNewTab": "Abrir en nueva pesta\u00f1a", + "ButtonShuffle": "Mezclar", + "ButtonInstantMix": "Mix instant\u00e1neo", + "ButtonResume": "Continuar", + "HeaderScenes": "Escenas", + "HeaderAudioTracks": "Pistas de audio", + "HeaderSubtitles": "Subt\u00edtulos", + "HeaderVideoQuality": "Calidad de video", + "MessageErrorPlayingVideo": "Ha habido un error reproduciendo el video.", + "MessageEnsureOpenTuner": "Aseg\u00farese que hay un sintonizador disponible.", + "ButtonHome": "Inicio", + "ButtonDashboard": "Panel de control", + "ButtonReports": "Informes", + "ButtonMetadataManager": "Metadata Manager", + "HeaderTime": "Duraci\u00f3n", + "HeaderName": "Nombre", + "HeaderAlbum": "Album", + "HeaderAlbumArtist": "Artista del album", + "HeaderArtist": "Artista" +} \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/ru.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/ru.json index 84a2efa83..0d6bc9e83 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/ru.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/ru.json @@ -197,7 +197,7 @@ "MessageDirectoryPickerInstruction": "\u0421\u0435\u0442\u0435\u0432\u044b\u0435 \u043f\u0443\u0442\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0432\u0432\u043e\u0434\u0438\u0442\u044c \u0432\u0440\u0443\u0447\u043d\u0443\u044e, \u0432 \u0441\u043b\u0443\u0447\u0430\u0435, \u0435\u0441\u043b\u0438 \u043f\u0440\u0438 \u043d\u0430\u0436\u0430\u0442\u0438\u0438 \u043a\u043d\u043e\u043f\u043a\u0438 \u0421\u0435\u0442\u044c \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0441\u0431\u043e\u0439 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, {0} \u0438\u043b\u0438 {1}.", "HeaderMenu": "\u041c\u0435\u043d\u044e", "ButtonOpen": "\u041e\u0442\u043a\u0440\u044b\u0442\u044c", - "ButtonOpenInNewTab": "\u041e\u0442\u043a\u0440\u044b\u0442\u044c \u0432 \u043d\u043e\u0432\u043e\u0439 \u0432\u043a\u043b\u0430\u0434\u043a\u0435", + "ButtonOpenInNewTab": "\u0412 \u043d\u043e\u0432\u043e\u0439 \u0432\u043a\u043b\u0430\u0434\u043a\u0435", "ButtonShuffle": "\u041f\u0435\u0440\u0435\u043c\u0435\u0448\u0430\u0442\u044c", "ButtonInstantMix": "\u0410\u0432\u0442\u043e\u043c\u0438\u043a\u0441", "ButtonResume": "\u0412\u043e\u0437\u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c", diff --git a/MediaBrowser.Server.Implementations/Localization/LocalizationManager.cs b/MediaBrowser.Server.Implementations/Localization/LocalizationManager.cs index c21c9fa17..05de4d65a 100644 --- a/MediaBrowser.Server.Implementations/Localization/LocalizationManager.cs +++ b/MediaBrowser.Server.Implementations/Localization/LocalizationManager.cs @@ -375,7 +375,7 @@ namespace MediaBrowser.Server.Implementations.Localization new LocalizatonOption{ Name="Portuguese (Brazil)", Value="pt-BR"}, new LocalizatonOption{ Name="Portuguese (Portugal)", Value="pt-PT"}, new LocalizatonOption{ Name="Russian", Value="ru"}, - new LocalizatonOption{ Name="Spanish", Value="es"}, + new LocalizatonOption{ Name="Spanish", Value="es-ES"}, new LocalizatonOption{ Name="Spanish (Mexico)", Value="es-MX"}, new LocalizatonOption{ Name="Swedish", Value="sv"}, new LocalizatonOption{ Name="Vietnamese", Value="vi"} diff --git a/MediaBrowser.Server.Implementations/Localization/Server/es_ES.json b/MediaBrowser.Server.Implementations/Localization/Server/es_ES.json new file mode 100644 index 000000000..fbd39b960 --- /dev/null +++ b/MediaBrowser.Server.Implementations/Localization/Server/es_ES.json @@ -0,0 +1,850 @@ +{ + "LabelExit": "Salir", + "LabelVisitCommunity": "Visitar la comunidad", + "LabelGithubWiki": "Wiki de Github", + "LabelSwagger": "Swagger", + "LabelStandard": "Est\u00e1ndar", + "LabelViewApiDocumentation": "Ver documentacion de Api", + "LabelBrowseLibrary": "Navegar biblioteca", + "LabelConfigureMediaBrowser": "Configurar Media Browser", + "LabelOpenLibraryViewer": "Abrir el visor de la biblioteca", + "LabelRestartServer": "Reiniciar el servidor", + "LabelShowLogWindow": "Mostrar la ventana del log", + "LabelPrevious": "Anterior", + "LabelFinish": "Terminar", + "LabelNext": "Siguiente", + "LabelYoureDone": "Ha Terminado!", + "WelcomeToMediaBrowser": "\u00a1Bienvenido a Media Browser!", + "TitleMediaBrowser": "Media Browser", + "ThisWizardWillGuideYou": "Este asistente lo guiar\u00e1 por el proceso de instalaci\u00f3n. Para comenzar seleccione su idioma preferido.", + "TellUsAboutYourself": "D\u00edganos acerca de usted", + "LabelYourFirstName": "Su nombre:", + "MoreUsersCanBeAddedLater": "M\u00e1s usuarios pueden agregarse m\u00e1s tarde en el panel de control.", + "UserProfilesIntro": "Media Browser incluye soporte integrado para los perfiles de usuario, lo que permite que cada usuario tenga su propia configuraci\u00f3n de la pantalla, estado de reproducci\u00f3n y control parental.", + "LabelWindowsService": "Servicio de Windows", + "AWindowsServiceHasBeenInstalled": "Un servicio de Windows se ha instalado", + "WindowsServiceIntro1": "Media Browser Server se ejecuta normalmente como una aplicaci\u00f3n de escritorio con un icono de la bandeja, pero si prefiere ejecutarlo como un servicio en segundo plano, se puede iniciar desde el panel de control de servicios de Windows en su lugar.", + "WindowsServiceIntro2": "Si se utiliza el servicio de Windows, tenga en cuenta que no se puede ejecutar al mismo tiempo que el icono de la bandeja, por lo que tendr\u00e1 que salir de la bandeja con el fin de ejecutar el servicio. Tambi\u00e9n tendr\u00e1 que ser configurado con privilegios administrativos a trav\u00e9s del panel de control del servicio. Tenga en cuenta que en este momento el servicio no es capaz de auto-actualizaci\u00f3n, por lo que las nuevas versiones requieren la interacci\u00f3n manual.", + "WizardCompleted": "Eso es todo lo que necesitamos por ahora. Media Browser ha comenzado a reunir informaci\u00f3n sobre su biblioteca de medios. Echa un vistazo a algunas de nuestras aplicaciones, y luego haga clic en Finalizar<\/b> para ver el Panel de control<\/b>.", + "LabelConfigureSettings": "Configuraci\u00f3n de opciones", + "LabelEnableVideoImageExtraction": "Habilitar extracci\u00f3n de im\u00e1genes de video", + "VideoImageExtractionHelp": "Para los v\u00eddeos que no dispongan de im\u00e1genes y que no podemos encontrar en Internet. Esto agregar\u00e1 un tiempo adicional para la exploraci\u00f3n inicial de bibliotecas, pero resultar\u00e1 en una presentaci\u00f3n m\u00e1s agradable.", + "LabelEnableChapterImageExtractionForMovies": "Extraer im\u00e1genes de cap\u00edtulos para pel\u00edculas", + "LabelChapterImageExtractionForMoviesHelp": "Extraer im\u00e1genes de cap\u00edtulo permitir\u00e1 a los clientes mostrar men\u00fas gr\u00e1ficos de selecci\u00f3n de escenas. El proceso puede ser lento, intensivo en utilizaci\u00f3n del CPU y puede requerir varios gigabytes de espacio. Se ejecuta como una tarea nocturna, a las 4 de la ma\u00f1ana, aunque esto se puede configurar en el \u00e1rea de tareas programadas. No se recomienda ejecutar esta tarea durante las horas pico de uso.", + "LabelEnableAutomaticPortMapping": "Habilitar asignaci\u00f3n de puertos autom\u00e1tico", + "LabelEnableAutomaticPortMappingHelp": "UPnP permite la configuraci\u00f3n del router para acceso externo de forma f\u00e1cil y autom\u00e1tica. Esto puede no funcionar en algunos modelos de routers.", + "ButtonOk": "OK", + "ButtonCancel": "Cancelar", + "ButtonNew": "Nuevo", + "HeaderSetupLibrary": "Configurar biblioteca de medios", + "ButtonAddMediaFolder": "Agregar una carpeta de medios", + "LabelFolderType": "Tipo de carpeta:", + "MediaFolderHelpPluginRequired": "* Requiere el uso de un plugin, por ejemplo GameBrowser o MB Bookshelf", + "ReferToMediaLibraryWiki": "Consultar el wiki de la biblioteca de medios", + "LabelCountry": "Pa\u00eds:", + "LabelLanguage": "Idioma:", + "HeaderPreferredMetadataLanguage": "Idioma preferido para metadata", + "LabelSaveLocalMetadata": "Guardar im\u00e1genes y metadata en las carpetas de medios", + "LabelSaveLocalMetadataHelp": "Guardar im\u00e1genes y metadata directamente en las carpetas de medios, permitir\u00e1 colocarlas en un lugar donde se pueden editar f\u00e1cilmente.", + "LabelDownloadInternetMetadata": "Descargar imagenes y metadata de internet", + "LabelDownloadInternetMetadataHelp": "Media Browser permite descargar informaci\u00f3n acerca de su media para enriquecer la presentaci\u00f3n.", + "TabPreferences": "Preferencias", + "TabPassword": "Contrase\u00f1a", + "TabLibraryAccess": "Acceso a biblioteca", + "TabImage": "imagen", + "TabProfile": "Perfil", + "TabMetadata": "Metadata", + "TabImages": "Im\u00e1genes", + "TabNotifications": "Notificaciones", + "TabCollectionTitles": "T\u00edtulos", + "LabelDisplayMissingEpisodesWithinSeasons": "Mostar episodios no disponibles en temporadas", + "LabelUnairedMissingEpisodesWithinSeasons": "Mostrar episodios a\u00fan no emitidos en temporadas", + "HeaderVideoPlaybackSettings": "Ajustes de Reproducci\u00f3n de Video", + "HeaderPlaybackSettings": "Ajustes de reproducci\u00f3n", + "LabelAudioLanguagePreference": "Preferencia de idioma de audio", + "LabelSubtitleLanguagePreference": "Preferencia de idioma de subtitulos", + "OptionDefaultSubtitles": "Por defecto", + "OptionOnlyForcedSubtitles": "S\u00f3lo subt\u00edtulos forzados", + "OptionAlwaysPlaySubtitles": "Mostrar siempre subt\u00edtulos", + "OptionNoSubtitles": "Sin subt\u00edtulos", + "OptionDefaultSubtitlesHelp": "Los subt\u00edtulos que concuerden con la preferencia de idioma se cargar\u00e1n cuando el audio est\u00e9 en un idioma extranjero.", + "OptionOnlyForcedSubtitlesHelp": "S\u00f3lo se cargar\u00e1n los subt\u00edtulos marcados como forzados.", + "OptionAlwaysPlaySubtitlesHelp": "Los subt\u00edtulos que concuerden con la preferencia de idioma se cargar\u00e1n independientemente del idioma de audio.", + "OptionNoSubtitlesHelp": "Los subt\u00edtulos no se cargar\u00e1n de forma predeterminada.", + "TabProfiles": "Perfiles", + "TabSecurity": "Seguridad", + "ButtonAddUser": "Agregar Usuario", + "ButtonSave": "Grabar", + "ButtonResetPassword": "Reiniciar Contrase\u00f1a", + "LabelNewPassword": "Nueva Contrase\u00f1a:", + "LabelNewPasswordConfirm": "Confirmaci\u00f3n de contrase\u00f1a nueva:", + "HeaderCreatePassword": "Crear Contrase\u00f1a", + "LabelCurrentPassword": "Contrase\u00f1a actual", + "LabelMaxParentalRating": "M\u00e1xima clasificaci\u00f3n permitida", + "MaxParentalRatingHelp": "El contenido con clasificaci\u00f3n parental superior se ocultar\u00e1 para este usuario.", + "LibraryAccessHelp": "Seleccione las carpetas de medios para compartir con este usuario. Los administradores podr\u00e1n editar todas las carpetas usando el gestor de metadata.", + "ChannelAccessHelp": "Seleccione los canales para compartir con este usuario. Los administradores podr\u00e1n editar todos los canales mediante el gestor de metadatos.", + "ButtonDeleteImage": "Borrar imagen", + "LabelSelectUsers": "Seleccionar usuarios:", + "ButtonUpload": "Subir", + "HeaderUploadNewImage": "Subir nueva imagen", + "LabelDropImageHere": "Depositar Imagen Aqu\u00ed", + "ImageUploadAspectRatioHelp": "Se Recomienda una Proporci\u00f3n de Aspecto 1:1. Solo JPG\/PNG", + "MessageNothingHere": "Nada aqu\u00ed.", + "MessagePleaseEnsureInternetMetadata": "Por favor aseg\u00farese que la descarga de metadata de internet esta habilitada", + "TabSuggested": "Sugerencia", + "TabLatest": "Novedades", + "TabUpcoming": "Pr\u00f3ximos", + "TabShows": "Programas", + "TabEpisodes": "Episodios", + "TabGenres": "G\u00e9neros", + "TabPeople": "Gente", + "TabNetworks": "redes", + "HeaderUsers": "Usuarios", + "HeaderFilters": "Filtros:", + "ButtonFilter": "Filtro", + "OptionFavorite": "Favoritos", + "OptionLikes": "Me gusta", + "OptionDislikes": "No me gusta", + "OptionActors": "Actores", + "OptionGuestStars": "Estrellas invitadas", + "OptionDirectors": "Directores", + "OptionWriters": "Guionistas", + "OptionProducers": "Productores", + "HeaderResume": "Continuar", + "HeaderNextUp": "Siguiendo", + "NoNextUpItemsMessage": "Nada encontrado. \u00a1Comienza a ver tus programas!", + "HeaderLatestEpisodes": "Ultimos episodios", + "HeaderPersonTypes": "Tipos de personas:", + "TabSongs": "Canciones", + "TabAlbums": "Albums", + "TabArtists": "Artistas", + "TabAlbumArtists": "Album Artistas", + "TabMusicVideos": "Videos Musicales", + "ButtonSort": "Ordenar", + "HeaderSortBy": "Ordenar por:", + "HeaderSortOrder": "Ordenado por:", + "OptionPlayed": "Reproducido", + "OptionUnplayed": "No reproducido", + "OptionAscending": "Ascendente", + "OptionDescending": "Descendente", + "OptionRuntime": "Tiempo", + "OptionReleaseDate": "Fecha de estreno", + "OptionPlayCount": "N\u00famero de reproducc.", + "OptionDatePlayed": "Fecha de reproducci\u00f3n", + "OptionDateAdded": "A\u00f1adido el", + "OptionAlbumArtist": "Album Artista", + "OptionArtist": "Artista", + "OptionAlbum": "Album", + "OptionTrackName": "Nombre de pista", + "OptionCommunityRating": "Valoraci\u00f3n comunidad", + "OptionNameSort": "Nombre", + "OptionFolderSort": "Carpetas", + "OptionBudget": "Presupuesto", + "OptionRevenue": "Recaudaci\u00f3n", + "OptionPoster": "Poster", + "OptionBackdrop": "Imagen de fondo", + "OptionTimeline": "L\u00ednea de tiempo", + "OptionThumb": "Miniatura", + "OptionBanner": "Banner", + "OptionCriticRating": "Valoraci\u00f3n cr\u00edtica", + "OptionVideoBitrate": "Video Bitrate", + "OptionResumable": "Se puede continuar", + "ScheduledTasksHelp": "Click en una tarea para ajustar su programaci\u00f3n", + "ScheduledTasksTitle": "Tareas programadas", + "TabMyPlugins": "Mis Plugins", + "TabCatalog": "Cat\u00e1logo", + "PluginsTitle": "Plugins", + "HeaderAutomaticUpdates": "Actualizaciones autom\u00e1ticas", + "HeaderNowPlaying": "Reproduciendo ahora", + "HeaderLatestAlbums": "\u00dcltimos Albums", + "HeaderLatestSongs": "\u00daltimas canciones", + "HeaderRecentlyPlayed": "Reproducido recientemente", + "HeaderFrequentlyPlayed": "Reproducido frequentemente", + "DevBuildWarning": "Las actualizaciones en desarrollo no est\u00e1n convenientemente probadas. La aplicaci\u00f3n se puede bloquear y caracter\u00edsticas completas pueden no funcionar del todo.", + "LabelVideoType": "Tipo de video", + "OptionBluray": "Bluray", + "OptionDvd": "Dvd", + "OptionIso": "Iso", + "Option3D": "3D", + "LabelFeatures": "Caracter\u00edsticas", + "LabelService": "Servicio:", + "LabelStatus": "Estado:", + "LabelVersion": "Versi\u00f3n:", + "LabelLastResult": "\u00daltimo resultado:", + "OptionHasSubtitles": "Subt\u00edtulos", + "OptionHasTrailer": "Trailer", + "OptionHasThemeSong": "Banda sonora", + "OptionHasThemeVideo": "Viideotema", + "TabMovies": "Pel\u00edculas", + "TabStudios": "Estudios", + "TabTrailers": "Trailers", + "HeaderLatestMovies": "\u00daltimas pel\u00edculas", + "HeaderLatestTrailers": "\u00daltimos trailers", + "OptionHasSpecialFeatures": "Caracter\u00edsticas especiales", + "OptionImdbRating": "Valoraci\u00f3n IMDb", + "OptionParentalRating": "Clasificaci\u00f3n parental", + "OptionPremiereDate": "Fecha de estreno", + "TabBasic": "B\u00e1sico", + "TabAdvanced": "Avanzado", + "HeaderStatus": "Estado", + "OptionContinuing": "Continuando", + "OptionEnded": "Finalizado", + "HeaderAirDays": "D\u00eda emisi\u00f3n", + "OptionSunday": "Domingo", + "OptionMonday": "Lunes", + "OptionTuesday": "Martes", + "OptionWednesday": "Mi\u00e9rcoles", + "OptionThursday": "Jueves", + "OptionFriday": "Viernes", + "OptionSaturday": "S\u00e1bado", + "HeaderManagement": "Administraci\u00f3n", + "OptionMissingImdbId": "Falta IMDb Id", + "OptionMissingTvdbId": "Falta TheTVDB Id", + "OptionMissingOverview": "Falta argumento", + "OptionFileMetadataYearMismatch": "Archivo\/Metadata a\u00f1os no coinciden", + "TabGeneral": "General", + "TitleSupport": "Soporte", + "TabLog": "Log", + "TabAbout": "Acerca de", + "TabSupporterKey": "Clave de Seguidor", + "TabBecomeSupporter": "Hazte Seguidor", + "MediaBrowserHasCommunity": "Media Browser cuenta con una pr\u00f3spera comunidad de usuarios y colaboradores.", + "CheckoutKnowledgeBase": "Echa un vistazo a nuestra base de conocimiento para ayudarte a sacar el m\u00e1ximo provecho de Media Browser.", + "SearchKnowledgeBase": "Buscar en la base de conocimiento", + "VisitTheCommunity": "Visitar la comunidad", + "VisitMediaBrowserWebsite": "Visitar la web de Media Browser", + "VisitMediaBrowserWebsiteLong": "Visita la web de Media Browser para estar informado de las \u00faltimas not\u00edcias y mantenerte al d\u00eda con el blog de desarrolladores.", + "OptionHideUser": "Ocultar este usuario en las pantallas de inicio de sesi\u00f3n", + "OptionDisableUser": "Deshabilitar este usuario", + "OptionDisableUserHelp": "Si est\u00e1 deshabilitado, el servidor no aceptar\u00e1 conexiones de este usuario. Si existen conexiones de este usuario, finalizar\u00e1n inmediatamente.", + "HeaderAdvancedControl": "Control avanzado", + "LabelName": "Nombre:", + "OptionAllowUserToManageServer": "Permite a este usuario administrar el servidor", + "HeaderFeatureAccess": "Permisos de acceso", + "OptionAllowMediaPlayback": "Permitir reproducci\u00f3n de medios", + "OptionAllowBrowsingLiveTv": "Acceso a TV en vivo", + "OptionAllowDeleteLibraryContent": "Permitir a este usuario eliminar contenido de la biblioteca", + "OptionAllowManageLiveTv": "Permitir la gesti\u00f3n de las grabaciones de TV en vivo", + "OptionAllowRemoteControlOthers": "Permitir a este usuario controlar rem\u00f3tamente a otros usuarios", + "OptionMissingTmdbId": "Falta Tmdb Id", + "OptionIsHD": "HD", + "OptionIsSD": "SD", + "OptionMetascore": "Metavalor", + "ButtonSelect": "Seleccionar", + "ButtonSearch": "Buscar", + "ButtonGroupVersions": "Versiones de Grupo", + "ButtonAddToCollection": "A\u00f1adir a la colecci\u00f3n", + "PismoMessage": "Usando Pismo File Mount a trav\u00e9s de una licencia donada.", + "TangibleSoftwareMessage": "Utilizamos convertidores Java\/C# de Tangible Solutions a trav\u00e9s de una licencia donada.", + "HeaderCredits": "Cr\u00e9ditos", + "PleaseSupportOtherProduces": "Por favor apoye otros productos gratuitos que utilizamos:", + "VersionNumber": "Versi\u00f3n {0}", + "TabPaths": "Ruta", + "TabServer": "Servidor", + "TabTranscoding": "Transcodificaci\u00f3n", + "TitleAdvanced": "Avanzado", + "LabelAutomaticUpdateLevel": "Actualizaci\u00f3n de nivel autom\u00e1tica", + "OptionRelease": "Release Oficial", + "OptionBeta": "Beta", + "OptionDev": "Desarrollo", + "LabelAllowServerAutoRestart": "Permitir al servidor reiniciarse autom\u00e1ticamente para aplicar las actualizaciones", + "LabelAllowServerAutoRestartHelp": "El servidor s\u00f3lo se reiniciar\u00e1 durante periodos de reposo, cuando no hayan usuarios activos.", + "LabelEnableDebugLogging": "Habilitar entrada de debug", + "LabelRunServerAtStartup": "Arrancar servidor al iniciar", + "LabelRunServerAtStartupHelp": "Esto iniciar\u00e1 como aplicaci\u00f3n en el inicio. Para iniciar en modo servicio de windows, desmarque esto e inicie el servicio desde el panel de control de windows. Tenga en cuenta que no es posible inciar de las dos formas a la vez, usted debe salir de la aplicaci\u00f3n para iniciar el servicio.", + "ButtonSelectDirectory": "Seleccionar directorio", + "LabelCustomPaths": "Especificar las rutas personalizadas que desee. D\u00e9jelo en blanco para usar las rutas por defecto.", + "LabelCachePath": "Ruta del cach\u00e9:", + "LabelCachePathHelp": "Esta carpeta contienes archivos de cach\u00e9 del servidor, tales como im\u00e1genes.", + "LabelImagesByNamePath": "Ruta de im\u00e1genes:", + "LabelImagesByNamePathHelp": "Esta carpeta contiene im\u00e1genes de actores, artistas, g\u00e9neros y estudios.", + "LabelMetadataPath": "Ruta de Metadata:", + "LabelMetadataPathHelp": "Esta localizaci\u00f3n contiene im\u00e1genes y metadata descargados que no est\u00e1n configurados para ser guardados en carpetas de medios.", + "LabelTranscodingTempPath": "Ruta temporal de transcodificaci\u00f3n:", + "LabelTranscodingTempPathHelp": "Esta carpeta contiene archivos de trabajo usados por el transcodificador.", + "TabBasics": "Basicos", + "TabTV": "TV", + "TabGames": "Juegos", + "TabMusic": "M\u00fasica", + "TabOthers": "Otros", + "HeaderExtractChapterImagesFor": "Extraer im\u00e1genes de cap\u00edtulos para:", + "OptionMovies": "Pel\u00edculas", + "OptionEpisodes": "Episodios", + "OptionOtherVideos": "Otros v\u00eddeos", + "TitleMetadata": "Metadata", + "LabelAutomaticUpdatesFanart": "Activar actualizaciones autom\u00e1ticas desde FanArt.tv", + "LabelAutomaticUpdatesTmdb": "Activar actualizaciones autom\u00e1ticas desde TheMovieDB.org", + "LabelAutomaticUpdatesTvdb": "Activar actualizaciones autom\u00e1ticas desde TheTVDB.com", + "LabelAutomaticUpdatesFanartHelp": "Si est\u00e1 activado, las nuevas im\u00e1genes se descargan autom\u00e1ticamente a medida que se a\u00f1aden a fanart.tv. Im\u00e1genes existentes no ser\u00e1n reemplazadas.", + "LabelAutomaticUpdatesTmdbHelp": "Si est\u00e1 activado, las nuevas im\u00e1genes se descargan autom\u00e1ticamente a medida que se a\u00f1aden a TheMovieDB.org. Im\u00e1genes existentes no ser\u00e1n reemplazados.", + "LabelAutomaticUpdatesTvdbHelp": "Si est\u00e1 activado, las nuevas im\u00e1genes se descargan autom\u00e1ticamente a medida que se a\u00f1aden a TheTVDB.com. Im\u00e1genes existentes no ser\u00e1n reemplazados.", + "ExtractChapterImagesHelp": "Extraer im\u00e1genes de cap\u00edtulo permitir\u00e1 a los clientes mostrar men\u00fas gr\u00e1ficos de selecci\u00f3n de escenas. El proceso puede ser lento, uso de CPU intensivo y puede requerir varios gigabytes de espacio. Se ejecuta como una tarea nocturna, a las 4 de la ma\u00f1ana, aunque esto se puede configurar en el \u00e1rea de tareas programadas. No se recomienda ejecutar esta tarea durante las horas pico.", + "LabelMetadataDownloadLanguage": "Idioma preferido:", + "ButtonAutoScroll": "Auto-desplazamiento", + "LabelImageSavingConvention": "Sistema de guardado de im\u00e1genes:", + "LabelImageSavingConventionHelp": "Media Browser reconoce im\u00e1genes de la mayor\u00eda de aplicaciones de medios. La elecci\u00f3n de su sistema de descarga es \u00fatil si tambi\u00e9n usa otros productos.", + "OptionImageSavingCompatible": "Compatible - MB3\/Plex\/Xbmc", + "OptionImageSavingStandard": "Est\u00e1ndard - MB3\/MB2", + "ButtonSignIn": "Registrarse", + "TitleSignIn": "Registrarse", + "HeaderPleaseSignIn": "Por favor reg\u00edstrese", + "LabelUser": "Usuario:", + "LabelPassword": "Contrase\u00f1a:", + "ButtonManualLogin": "Registro manual:", + "PasswordLocalhostMessage": "No se necesitan contrase\u00f1as al iniciar sesi\u00f3n desde localhost.", + "TabGuide": "Gu\u00eda", + "TabChannels": "Canales", + "TabCollections": "Colecciones", + "HeaderChannels": "Canales", + "TabRecordings": "Grabaciones", + "TabScheduled": "Programado", + "TabSeries": "Series", + "TabFavorites": "Favoritos", + "TabMyLibrary": "Mi biblioteca", + "ButtonCancelRecording": "Cancelar grabaci\u00f3n", + "HeaderPrePostPadding": "Pre\/post grabaci\u00f3n extra", + "LabelPrePaddingMinutes": "Minutos previos extras:", + "OptionPrePaddingRequired": "Minutos previos extras requeridos para grabar.", + "LabelPostPaddingMinutes": "Minutos extras post grabaci\u00f3n:", + "OptionPostPaddingRequired": "Minutos post grabaci\u00f3n extras requeridos para grabar.", + "HeaderWhatsOnTV": "Que hacen ahora", + "HeaderUpcomingTV": "Pr\u00f3ximos programas", + "TabStatus": "Estado", + "TabSettings": "Opciones", + "ButtonRefreshGuideData": "Actualizar datos de la gu\u00eda", + "OptionPriority": "Prioridad", + "OptionRecordOnAllChannels": "Grabar programa en cualquier canal", + "OptionRecordAnytime": "Grabar programa a cualquier hora", + "OptionRecordOnlyNewEpisodes": "Grabar s\u00f3lo nuevos episodios", + "HeaderDays": "D\u00edas", + "HeaderActiveRecordings": "Grabaciones activas", + "HeaderLatestRecordings": "\u00daltimas grabaciones", + "HeaderAllRecordings": "Todas la grabaciones", + "ButtonPlay": "Reproducir", + "ButtonEdit": "Editar", + "ButtonRecord": "Grabar", + "ButtonDelete": "Borrar", + "ButtonRemove": "Quitar", + "OptionRecordSeries": "Grabar serie", + "HeaderDetails": "Detalles", + "TitleLiveTV": "Tv en vivo", + "LabelNumberOfGuideDays": "N\u00famero de d\u00edas de descarga de la gu\u00eda.", + "LabelNumberOfGuideDaysHelp": "Descargar m\u00e1s d\u00edas de la gu\u00eda ofrece la posibilidad de programar grabaciones con mayor antelaci\u00f3n y ver m\u00e1s listas, pero tambi\u00e9n tarda m\u00e1s en descargarse. Auto elegir\u00e1 en funci\u00f3n del n\u00famero de canales.", + "LabelActiveService": "Activar servicio", + "LabelActiveServiceHelp": "Es posible instalar m\u00faltiples plugins de tv, pero s\u00f3lo puede estar activo uno a la vez.", + "OptionAutomatic": "Auto", + "LiveTvPluginRequired": "El servicio de TV en vivo es necesario para poder continuar.", + "LiveTvPluginRequiredHelp": "Instale uno de los plugins disponibles, como Next Pvr o ServerVmc.", + "LabelCustomizeOptionsPerMediaType": "Personalizar por tipo de medio:", + "OptionDownloadThumbImage": "Miniatura", + "OptionDownloadMenuImage": "Men\u00fa", + "OptionDownloadLogoImage": "Logo", + "OptionDownloadBoxImage": "Caja", + "OptionDownloadDiscImage": "Disco", + "OptionDownloadBannerImage": "Pancarta", + "OptionDownloadBackImage": "Atr\u00e1s", + "OptionDownloadArtImage": "Arte", + "OptionDownloadPrimaryImage": "Principal", + "HeaderFetchImages": "Buscar im\u00e1genes", + "HeaderImageSettings": "Opciones de im\u00e1gen", + "TabOther": "Otros", + "LabelMaxBackdropsPerItem": "M\u00e1ximo n\u00famero de im\u00e1genes de fondo por \u00edtem:", + "LabelMaxScreenshotsPerItem": "M\u00e1ximo n\u00famero de capturas de pantalla por \u00edtem:", + "LabelMinBackdropDownloadWidth": "Anchura m\u00ednima de descarga de im\u00e1genes de fondo:", + "LabelMinScreenshotDownloadWidth": "Anchura m\u00ednima de descarga de capturas de pantalla:", + "ButtonAddScheduledTaskTrigger": "A\u00f1adir eventos", + "HeaderAddScheduledTaskTrigger": "A\u00f1adir eventos de ejecuci\u00f3n", + "ButtonAdd": "A\u00f1adir", + "LabelTriggerType": "Tipo de evento:", + "OptionDaily": "Diario", + "OptionWeekly": "Semanal", + "OptionOnInterval": "En un intervalo", + "OptionOnAppStartup": "Al iniciar la aplicaci\u00f3n", + "OptionAfterSystemEvent": "Despu\u00e9s de un evento de sistema", + "LabelDay": "D\u00eda:", + "LabelTime": "Hora:", + "LabelEvent": "Evento:", + "OptionWakeFromSleep": "Despertar", + "LabelEveryXMinutes": "Cada:", + "HeaderTvTuners": "Sintonizadores", + "HeaderGallery": "Galer\u00eda", + "HeaderLatestGames": "\u00daltimos Juegos", + "HeaderRecentlyPlayedGames": "Juegos utilizados recientemente", + "TabGameSystems": "Sistema de Juego", + "TitleMediaLibrary": "Librer\u00eda de medios", + "TabFolders": "Carpetas", + "TabPathSubstitution": "Ruta alternativa", + "LabelSeasonZeroDisplayName": "Nombre de la Temporada 0:", + "LabelEnableRealtimeMonitor": "Activar monitoreo en tiempo real", + "LabelEnableRealtimeMonitorHelp": "Los cambios se procesar\u00e1n inmediatamente, en sistemas de archivo que lo soporten.", + "ButtonScanLibrary": "Escanear Librer\u00eda", + "HeaderNumberOfPlayers": "Jugadores:", + "OptionAnyNumberOfPlayers": "Cualquiera", + "Option1Player": "1+", + "Option2Player": "2+", + "Option3Player": "3+", + "Option4Player": "4+", + "HeaderMediaFolders": "Carpetas de medios", + "HeaderThemeVideos": "V\u00eddeos de tema", + "HeaderThemeSongs": "Canciones de tema", + "HeaderScenes": "Escenas", + "HeaderAwardsAndReviews": "Premios y reconocimientos", + "HeaderSoundtracks": "Pistas de audio", + "HeaderMusicVideos": "V\u00eddeos musicales", + "HeaderSpecialFeatures": "Caracter\u00edsticas especiales", + "HeaderCastCrew": "Reparto y equipo t\u00e9cnico", + "HeaderAdditionalParts": "Partes adicionales", + "ButtonSplitVersionsApart": "Dividir versiones aparte", + "ButtonPlayTrailer": "Trailer", + "LabelMissing": "Falta", + "LabelOffline": "Apagado", + "PathSubstitutionHelp": "Las rutas alternativas se utilizan para mapear una ruta en el servidor a la que los clientes puedan acceder. El permitir que los clientes se conecten directamente a trav\u00e9s de la red y puedan reproducir los medios directamente, evita utilizar recursos del servidor para la transcodificaci\u00f3n y el stream,", + "HeaderFrom": "Desde", + "HeaderTo": "Hasta", + "LabelFrom": "Desde:", + "LabelFromHelp": "Ejemplo: D:\\Pel\u00edculas (en el servidor)", + "LabelTo": "Hasta:", + "LabelToHelp": "Ejemplo: \\\\MiServidor\\Pel\u00edculas (ruta a la que puedan acceder los clientes)", + "ButtonAddPathSubstitution": "A\u00f1adir ruta alternativa", + "OptionSpecialEpisode": "Especiales", + "OptionMissingEpisode": "Episodios que faltan", + "OptionUnairedEpisode": "Episodios no emitidos", + "OptionEpisodeSortName": "Nombre corto del episodio", + "OptionSeriesSortName": "Nombre de la serie", + "OptionTvdbRating": "Valoraci\u00f3n tvdb", + "HeaderTranscodingQualityPreference": "Preferencia de calidad de transcodificaci\u00f3n:", + "OptionAutomaticTranscodingHelp": "El servidor decidir\u00e1 la calidad y la velocidad", + "OptionHighSpeedTranscodingHelp": "Calidad menor, pero codificaci\u00f3n r\u00e1pida", + "OptionHighQualityTranscodingHelp": "C\u00e1lidad mayor, pero codificaci\u00f3n lenta", + "OptionMaxQualityTranscodingHelp": "La mayor calidad posible con codificaci\u00f3n lenta y alto uso de CPU", + "OptionHighSpeedTranscoding": "Mayor velocidad", + "OptionHighQualityTranscoding": "Mayor calidad", + "OptionMaxQualityTranscoding": "M\u00e1xima calidad", + "OptionEnableDebugTranscodingLogging": "Activar el registro de depuraci\u00f3n del transcodificador", + "OptionEnableDebugTranscodingLoggingHelp": "Esto crear\u00e1 archivos de registro muy grandes y s\u00f3lo se recomienda cuando sea necesario para solucionar problemas.", + "OptionUpscaling": "Permitir que los clientes soliciten v\u00eddeo upscaled", + "OptionUpscalingHelp": "En algunos casos esto se traducir\u00e1 en una mejora de la calidad del v\u00eddeo, pero aumentar\u00e1 el uso de CPU.", + "EditCollectionItemsHelp": "Agregar o quitar pel\u00edculas, series, discos, libros o juegos que desee agrupar dentro de esta colecci\u00f3n.", + "HeaderAddTitles": "A\u00f1adir T\u00edtulos", + "LabelEnableDlnaPlayTo": "Actvar la reproducci\u00f3n en DLNAi", + "LabelEnableDlnaPlayToHelp": "Media Browser puede detectar dispositivos en su red y ofrecer la posibilidad de controlarlos remotamente.", + "LabelEnableDlnaDebugLogging": "Activar el registro de depuraci\u00f3n de DLNA", + "LabelEnableDlnaDebugLoggingHelp": "Esto crear\u00e1 archivos de registro de gran tama\u00f1o y s\u00f3lo debe ser utilizado cuando sea necesario para solucionar problemas.", + "LabelEnableDlnaClientDiscoveryInterval": "Intervalo de detecci\u00f3n de cliente (segundos)", + "LabelEnableDlnaClientDiscoveryIntervalHelp": "Determina la duraci\u00f3n en segundos del intervalo entre las b\u00fasquedas SSDP realizadas por Media Browser.", + "HeaderCustomDlnaProfiles": "Perfiles personalizados", + "HeaderSystemDlnaProfiles": "Perfiles del sistema", + "CustomDlnaProfilesHelp": "Crear un perfil personalizado para un nuevo dispositivo o reemplazar un perfil del sistema.", + "SystemDlnaProfilesHelp": "Los perfiles del sistema son de s\u00f3lo lectura. Para anular un perfil del sistema, crear un perfil personalizado del mismo dispositivo.", + "TitleDashboard": "Panel de control", + "TabHome": "Inicio", + "TabInfo": "Info", + "HeaderLinks": "Enlaces", + "HeaderSystemPaths": "Rutas del sistema", + "LinkCommunity": "Comunidad", + "LinkGithub": "Github", + "LinkApiDocumentation": "Documentaci\u00f3n API", + "LabelFriendlyServerName": "Nombre informal del servidor:", + "LabelFriendlyServerNameHelp": "Este nombre se podr\u00e1 utilizar para identificar este servidor. Si se deja en blanco se usar\u00e1 el nombre del ordenador.", + "LabelPreferredDisplayLanguage": "Idioma de pantalla preferido", + "LabelPreferredDisplayLanguageHelp": "La traducci\u00f3n de Media Browser es un proyecto en curso y a\u00fan no est\u00e1 completado.", + "LabelReadHowYouCanContribute": "Lea acerca de c\u00f3mo usted puede contribuir.", + "HeaderNewCollection": "Nueva colecci\u00f3n", + "HeaderAddToCollection": "A\u00f1adir a la colecci\u00f3n", + "ButtonSubmit": "Enviar", + "NewCollectionNameExample": "Ejemplo: Star Wars Colecci\u00f3n", + "OptionSearchForInternetMetadata": "Buscar en internet ilustraciones y metadatos", + "ButtonCreate": "Crear", + "LabelHttpServerPortNumber": "Puerto Http del servidor:", + "LabelWebSocketPortNumber": "N\u00famero de puerto WebSocket:", + "LabelEnableAutomaticPortHelp": "UPnP permite automatizar la configuraci\u00f3n del router para el acceso remoto. Esto puede no funcionar en algunos modelos de router.", + "LabelExternalDDNS": "DDNS externa:", + "LabelExternalDDNSHelp": "Si dispone de DNS din\u00e1mica, escr\u00edbala aqu\u00ed. Media Brower la utilizar\u00e1 para las conexiones remotas.", + "TabResume": "Continuar", + "TabWeather": "El tiempo", + "TitleAppSettings": "Opciones de la App", + "LabelMinResumePercentage": "Porcentaje m\u00ednimo para reanudaci\u00f3n:", + "LabelMaxResumePercentage": "Porcentaje m\u00e1ximo para reanudaci\u00f3n::", + "LabelMinResumeDuration": "Duraci\u00f3n m\u00ednima de reanudaci\u00f3n (segundos):", + "LabelMinResumePercentageHelp": "Los t\u00edtulos se asumir\u00e1n como no reproducidos si se paran antes de este momento", + "LabelMaxResumePercentageHelp": "Los t\u00edtulos se asumir\u00e1n como reproducidos si se paran despu\u00e9s de este momento", + "LabelMinResumeDurationHelp": "Los t\u00edtulos m\u00e1s cortos de esto no ser\u00e1n reanudables", + "TitleAutoOrganize": "Organizaci\u00f3n autom\u00e1tica", + "TabActivityLog": "Log de actividad", + "HeaderName": "Nombre", + "HeaderDate": "Fecha", + "HeaderSource": "Origen", + "HeaderDestination": "Destino", + "HeaderProgram": "Programa", + "HeaderClients": "Clientes", + "LabelCompleted": "Completado", + "LabelFailed": "Err\u00f3neo", + "LabelSkipped": "Omitido", + "HeaderEpisodeOrganization": "Organizaci\u00f3n de episodios", + "LabelSeries": "Serie:", + "LabelSeasonNumber": "Temporada n\u00famero:", + "LabelEpisodeNumber": "Episodio n\u00famero:", + "LabelEndingEpisodeNumber": "N\u00famero episodio final:", + "LabelEndingEpisodeNumberHelp": "S\u00f3lo requerido para archivos multi-episodio", + "HeaderSupportTheTeam": "Apoye al Equipo de Media Browser", + "LabelSupportAmount": "Importe (USD)", + "HeaderSupportTheTeamHelp": "Ayude a garantizar el desarrollo continuo de este proyecto mediante una donaci\u00f3n. Una parte de todas las donaciones ir\u00e1n a parar a otras herramientas gratuitas de las que dependemos.", + "ButtonEnterSupporterKey": "Entre la Key de Seguidor", + "DonationNextStep": "Cuando haya terminado, vuelva y entre su key de seguidor que recibir\u00e1 por email.", + "AutoOrganizeHelp": "Organizaci\u00f3n autom\u00e1tica monitoriza sus carpetas de descarga en busca de nuevos archivos y los mueve a sus directorios de medios.", + "AutoOrganizeTvHelp": "La organizaci\u00f3n de archivos de TV s\u00f3lo a\u00f1adir\u00e1 episodios a series existentes. No crear\u00e1 carpetas para series nuevas.", + "OptionEnableEpisodeOrganization": "Activar la organizaci\u00f3n de nuevos episodios", + "LabelWatchFolder": "Ver carpeta:", + "LabelWatchFolderHelp": "El servidor sondear\u00e1 esta carpeta durante la tarea programada \"Organizar nuevos archivos de medios\".", + "ButtonViewScheduledTasks": "Ver tareas programadas", + "LabelMinFileSizeForOrganize": "Tama\u00f1o m\u00ednimo de archivo (MB):", + "LabelMinFileSizeForOrganizeHelp": "Los archivos menores de este tama\u00f1po se ignorar\u00e1n.", + "LabelSeasonFolderPattern": "Patr\u00f3n de la carpeta para temporadas:", + "LabelSeasonZeroFolderName": "Nombre de la carpeta para la temporada cero:", + "HeaderEpisodeFilePattern": "Patr\u00f3n para archivos de episodio", + "LabelEpisodePattern": "Patr\u00f3n de episodio:", + "LabelMultiEpisodePattern": "Patr\u00f3n para multi-episodio:", + "HeaderSupportedPatterns": "Patrones soportados", + "HeaderTerm": "Plazo", + "HeaderPattern": "Patr\u00f3n", + "HeaderResult": "Resultado", + "LabelDeleteEmptyFolders": "Borrar carpetas vacias despu\u00e9s de la organizaci\u00f3n", + "LabelDeleteEmptyFoldersHelp": "Activar para mantener el directorio de descargas limpio.", + "LabelDeleteLeftOverFiles": "Eliminar los archivos sobrantes con las siguientes extensiones:", + "LabelDeleteLeftOverFilesHelp": "Separar con ;. Por ejemplo: .nfo;.txt", + "OptionOverwriteExistingEpisodes": "Sobreescribir episodios ya existentes", + "LabelTransferMethod": "M\u00e9todo de transferencia", + "OptionCopy": "Copiar", + "OptionMove": "Mover", + "LabelTransferMethodHelp": "Copiar o mover archivos desde la carpeta de inspecci\u00f3n", + "HeaderLatestNews": "Ultimas noticias", + "HeaderHelpImproveMediaBrowser": "Ayuda a mejorar Media Browser", + "HeaderRunningTasks": "Tareas en ejecuci\u00f3n", + "HeaderActiveDevices": "Dispositivos activos", + "HeaderPendingInstallations": "Instalaciones pendientes", + "HeaerServerInformation": "Informaci\u00f3n del servidor", + "ButtonRestartNow": "Reiniciar ahora", + "ButtonRestart": "Reiniciar", + "ButtonShutdown": "Apagar", + "ButtonUpdateNow": "Actualizar ahora", + "PleaseUpdateManually": "Por favor cierre el servidor y actualice manualmente.", + "NewServerVersionAvailable": "\u00a1Hay disponible una nueva versi\u00f3n de Media Browser Server!", + "ServerUpToDate": "Media Browser Server est\u00e1 actualizado", + "ErrorConnectingToMediaBrowserRepository": "Hubo un error al conectarse remotamente al repositorio de Media Browser,", + "LabelComponentsUpdated": "Los componentes siguientes se han instalado o actualizado:", + "MessagePleaseRestartServerToFinishUpdating": "Reinicie el servidor para acabar de aplicar las actualizaciones.", + "LabelDownMixAudioScale": "Escala de reducci\u00f3n de potencia de audio:", + "LabelDownMixAudioScaleHelp": "Potenciador de audio. Establecer a 1 para preservar el volumen original.", + "ButtonLinkKeys": "Enlazar claves", + "LabelOldSupporterKey": "Antigua clave de seguidor", + "LabelNewSupporterKey": "Nueva clave de seguidor", + "HeaderMultipleKeyLinking": "Vinculaci\u00f3n de m\u00faltiples claves", + "MultipleKeyLinkingHelp": "Si usted tiene m\u00e1s de una clave de seguidor, utilice este formulario para vincular los registros de la antigua clave con la nueva.", + "LabelCurrentEmailAddress": "Cuenta de correo actual", + "LabelCurrentEmailAddressHelp": "La direcci\u00f3n de correo electr\u00f3nico actual a la que se envi\u00f3 la nueva clave.", + "HeaderForgotKey": "Perd\u00ed mi clave", + "LabelEmailAddress": "Direcci\u00f3n de correo", + "LabelSupporterEmailAddress": "La direcci\u00f3n de correo que utliz\u00f3 para comprar la clave.", + "ButtonRetrieveKey": "Recuperar clave", + "LabelSupporterKey": "Clave de seguidor (pegar desde el correo)", + "LabelSupporterKeyHelp": "Entre su clave de seguidor para empezar a disfrutar de los beneficios adicionales que la comunidad ha creado para Media Browser.", + "MessageInvalidKey": "La clave MB3 falta o es inv\u00e1lida", + "ErrorMessageInvalidKey": "Para acceder al contenido premium debe registrarse, tambi\u00e9n debe ser un MB3 Seguidor. Por favor, done y apoye el desarrollo continuado del producto principal. Gracias.", + "HeaderDisplaySettings": "Opciones de pantalla", + "TabPlayTo": "Reproducir en", + "LabelEnableDlnaServer": "Habilitar servidor Dlna", + "LabelEnableDlnaServerHelp": "Permite que los dispositivos UPnp de su red puedan navegar y repoducir contenidos de Media Browser.", + "LabelEnableBlastAliveMessages": "Explotar mensajes en vivo", + "LabelEnableBlastAliveMessagesHelp": "Active aqu\u00ed si el servidor no es detectado correctamente por otros dispositivos UPnP en su red.", + "LabelBlastMessageInterval": "Intervalo para mensajes en vivo (segundos)", + "LabelBlastMessageIntervalHelp": "Determina la duraci\u00f3n en segundos entre los mensajes en vivo del servidor .", + "LabelDefaultUser": "Usuario por defecto:", + "LabelDefaultUserHelp": "Determina de q\u00fae usuario se utilizar\u00e1 su biblioteca de medios para mostrarla por defecto en los dipositivos conectados. Esto puede cambiarse para cada dispositivo mediante el uso de perfiles.", + "TitleDlna": "DLNA", + "TitleChannels": "Canales", + "HeaderServerSettings": "Ajustes del Servidor", + "LabelWeatherDisplayLocation": "Lugar del que mostar el tiempo:", + "LabelWeatherDisplayLocationHelp": "C\u00f3digo postal USA \/ Ciudad, Estado, Pa\u00eds \/ Ciudad, Pa\u00eds", + "LabelWeatherDisplayUnit": "Unidad de media para la temperatura:", + "OptionCelsius": "Celsius", + "OptionFahrenheit": "Fahrenheit", + "HeaderRequireManualLogin": "Requerir entrada de usuario manual para:", + "HeaderRequireManualLoginHelp": "Cuando est\u00e1 desactivado los clientes saldr\u00e1n en la pantalla de inicio para seleccionarlos visualmente.", + "OptionOtherApps": "Otras aplicaciones", + "OptionMobileApps": "Aplicaciones m\u00f3viles", + "HeaderNotificationList": "Haga click en una notificaci\u00f3n para configurar sus opciones de env\u00edo.", + "NotificationOptionApplicationUpdateAvailable": "Disponible actualizaci\u00f3n de la aplicaci\u00f3n", + "NotificationOptionApplicationUpdateInstalled": "Se ha instalado la actualizaci\u00f3n de la aplicaci\u00f3n", + "NotificationOptionPluginUpdateInstalled": "Se ha instalado la actualizaci\u00f3n del plugin", + "NotificationOptionPluginInstalled": "Plugin instalado", + "NotificationOptionPluginUninstalled": "Plugin desinstalado", + "NotificationOptionVideoPlayback": "Reproducci\u00f3n de video", + "NotificationOptionAudioPlayback": "Reproducci\u00f3n de audio", + "NotificationOptionGamePlayback": "Iniciar juegos", + "NotificationOptionVideoPlaybackStopped": "Reproducci\u00f3n de video detenida", + "NotificationOptionAudioPlaybackStopped": "Reproducci\u00f3n de audio detenida", + "NotificationOptionGamePlaybackStopped": "Reproducci\u00f3n de juego detenida", + "NotificationOptionTaskFailed": "La tarea programada ha fallado", + "NotificationOptionInstallationFailed": "Fallo en la instalaci\u00f3n", + "NotificationOptionNewLibraryContent": "Nuevo contenido a\u00f1adido", + "NotificationOptionNewLibraryContentMultiple": "Nuevo contenido a\u00f1adido (multiple)", + "SendNotificationHelp": "Por defecto, las notificaciones aparecer\u00e1n en el panel de control. Compruebe el cat\u00e1logo de plugins para instalar opciones adicionales para las notificaciones.", + "NotificationOptionServerRestartRequired": "Se requiere el reinicio del servidor", + "LabelNotificationEnabled": "Activar esta notificaci\u00f3n", + "LabelMonitorUsers": "Supervisar la actividad de:", + "LabelSendNotificationToUsers": "Enviar la notificaci\u00f3n a:", + "UsersNotNotifiedAboutSelfActivity": "Los usuarios no ser\u00e1n notificados acerca de sus propias actividades.", + "LabelUseNotificationServices": "Usar los siguientes servicios:", + "CategoryUser": "Usuario", + "CategorySystem": "Sistema", + "CategoryApplication": "Aplicaci\u00f3n", + "CategoryPlugin": "Plugin", + "LabelMessageTitle": "T\u00edtulo del mensaje:", + "LabelAvailableTokens": "Tokens disponibles:", + "AdditionalNotificationServices": "Visite el cat\u00e1logo de plugins para instalar servicios de notificaci\u00f3n adicionales.", + "OptionAllUsers": "Todos los usuarios", + "OptionAdminUsers": "Administradores", + "OptionCustomUsers": "A medida", + "ButtonArrowUp": "Arriba", + "ButtonArrowDown": "Abajo", + "ButtonArrowLeft": "Izquierda", + "ButtonArrowRight": "Derecha", + "ButtonBack": "Atr\u00e1s", + "ButtonInfo": "Info", + "ButtonOsd": "Visualizaci\u00f3n en pantalla", + "ButtonPageUp": "P\u00e1gina arriba", + "ButtonPageDown": "P\u00e1gina abajo", + "PageAbbreviation": "PG", + "ButtonHome": "Inicio", + "ButtonSettings": "Opciones", + "ButtonTakeScreenshot": "Captura de pantalla", + "ButtonLetterUp": "Letter arriba", + "ButtonLetterDown": "Letter abajo", + "PageButtonAbbreviation": "PG", + "LetterButtonAbbreviation": "A", + "TabNowPlaying": "Reproduciendo ahora", + "TabNavigation": "Navegaci\u00f3n", + "TabControls": "Controles", + "ButtonFullscreen": "Pantalla completa", + "ButtonScenes": "Escenas", + "ButtonSubtitles": "Subt\u00edtulos", + "ButtonAudioTracks": "Pistas de audio", + "ButtonPreviousTrack": "Pista anterior", + "ButtonNextTrack": "Pista siguiente", + "ButtonStop": "Detener", + "ButtonPause": "Pausa", + "LabelGroupMoviesIntoCollections": "Agrupar pel\u00edculas en colecciones", + "LabelGroupMoviesIntoCollectionsHelp": "Cuando se muestran las listas de pel\u00edculas, las pel\u00edculas pertenecientes a una colecci\u00f3n se mostrar\u00e1n como un elemento agrupado.", + "NotificationOptionPluginError": "Error en plugin", + "ButtonVolumeUp": "Subir volumen", + "ButtonVolumeDown": "Bajar volumen", + "ButtonMute": "Silencio", + "HeaderLatestMedia": "\u00daltimos medios", + "OptionSpecialFeatures": "Caracter\u00edsticas especiales", + "HeaderCollections": "Colecciones", + "LabelProfileCodecsHelp": "Separados por comas. Esto se puede dejar vac\u00edo para aplicar a todos los codecs.", + "LabelProfileContainersHelp": "Separados por comas. Esto se puede dejar vac\u00edo para aplicar a todos los contenedores.", + "HeaderResponseProfile": "Perfil de respuesta", + "LabelType": "Tipo:", + "LabelProfileContainer": "Contenedor:", + "LabelProfileVideoCodecs": "Codecs de video:", + "LabelProfileAudioCodecs": "Codecs de audio:", + "LabelProfileCodecs": "Codecs:", + "HeaderDirectPlayProfile": "Perfil de reproducci\u00f3n directa", + "HeaderTranscodingProfile": "Perfil de transcodificaci\u00f3n", + "HeaderCodecProfile": "Perfil de codec", + "HeaderCodecProfileHelp": "Perfiles de codec indican las limitaciones de un dispositivo cuando se reproducen codecs espec\u00edficos. Si se aplica una limitaci\u00f3n entonces el medio se transcodificar\u00e1, incluso si el codec est\u00e1 configurado para reproducci\u00f3n directa.", + "HeaderContainerProfile": "Perfil de contenedor", + "HeaderContainerProfileHelp": "Perfiles de codec indican las limitaciones de un dispositivo mientras reproduce formatos espec\u00edficos. If se aplica una limitaci\u00f3n entonces el medio se transcodificar\u00e1, incluso si el formato est\u00e1 configurado para reproducci\u00f3n directa.", + "OptionProfileVideo": "Video", + "OptionProfileAudio": "Audio", + "OptionProfileVideoAudio": "Video audio", + "OptionProfilePhoto": "Foto", + "LabelUserLibrary": "Librer\u00eda de usuario:", + "LabelUserLibraryHelp": "Seleccione de qu\u00e9 usuario se utilizar\u00e1 la librer\u00eda en el dispositivo. D\u00e9jelo vac\u00edo para utilizar la configuraci\u00f3n por defecto.", + "OptionPlainStorageFolders": "Ver todas las carpetas como carpetas de almacenamiento sin formato.", + "OptionPlainStorageFoldersHelp": "Si est\u00e1 activado, todas las carpetas se representan en DIDL como \"object.container.storageFolder\" en lugar de un tipo m\u00e1s espec\u00edfico, como por ejemplo \"object.container.person.musicArtist\".", + "OptionPlainVideoItems": "Mostrar todos los videos como elementos de video sin formato", + "OptionPlainVideoItemsHelp": "Si est\u00e1 habilitado, todos los v\u00eddeos est\u00e1n representados en DIDL como \"object.item.videoItem\" en lugar de un tipo m\u00e1s espec\u00edfico, como por ejemplo \"object.item.videoItem.movie\".", + "LabelSupportedMediaTypes": "Tipos de medio soportados:", + "TabIdentification": "Identificaci\u00f3n", + "TabDirectPlay": "Reproducci\u00f3n directa", + "TabContainers": "Contenedores", + "TabCodecs": "Codecs", + "TabResponses": "Respuestas", + "HeaderProfileInformation": "Informaci\u00f3n del perfil", + "LabelEmbedAlbumArtDidl": "Incorporar la car\u00e1tula del \u00e1lbum en didl", + "LabelEmbedAlbumArtDidlHelp": "Algunos dispositivos prefieren este m\u00e9todo para obtener la car\u00e1tula del \u00e1lbum. Otros pueden fallar al reproducir con esta opci\u00f3n habilitada.", + "LabelAlbumArtPN": "Car\u00e1tula del album PN:", + "LabelAlbumArtHelp": "PN utilizado para la car\u00e1tula del \u00e1lbum, dentro del atributo dlna:profileID en upnp:albumArtURI. Algunos clientes requieren un valor espec\u00edfico, independientemente del tama\u00f1o de la imagen.", + "LabelAlbumArtMaxWidth": "Anchura m\u00e1xima de la car\u00e1tula del album:", + "LabelAlbumArtMaxWidthHelp": "Resoluci\u00f3n m\u00e1xima de la car\u00e1tula del \u00e1lbum expuesta a trav\u00e9s de upnp:albumArtURI.", + "LabelAlbumArtMaxHeight": "Altura m\u00e1xima de la car\u00e1tula del album:", + "LabelAlbumArtMaxHeightHelp": "Resoluci\u00f3n m\u00e1xima de la car\u00e1tula del \u00e1lbum expuesta a trav\u00e9s de upnp:albumArtURI.", + "LabelIconMaxWidth": "Anchura m\u00e1xima de icono:", + "LabelIconMaxWidthHelp": "Resoluci\u00f3n m\u00e1xima de los iconos expuestos via upnp:icon.", + "LabelIconMaxHeight": "Altura m\u00e1xima de icono:", + "LabelIconMaxHeightHelp": "Resoluci\u00f3n m\u00e1xima de los iconos expuestos via upnp:icon.", + "LabelIdentificationFieldHelp": "Una subcadena insensible a may\u00fasculas o min\u00fasculas o una expresi\u00f3n regex.", + "HeaderProfileServerSettingsHelp": "Estos valores controlan el modo en que Media Browser se presentar\u00e1 en el dispositivo.", + "LabelMaxBitrate": "Bitrate m\u00e1ximo:", + "LabelMaxBitrateHelp": "Especificar una tasa de bits m\u00e1xima en entornos de ancho de banda limitado, o si el dispositivo impone su propio l\u00edmite.", + "OptionIgnoreTranscodeByteRangeRequests": "Ignorar las solicitudes de intervalo de bytes de transcodificaci\u00f3n", + "OptionIgnoreTranscodeByteRangeRequestsHelp": "Si est\u00e1 activado, estas solicitudes ser\u00e1n atendidas pero ignorar\u00e1n el encabezado de intervalo de bytes.", + "LabelFriendlyName": "Nombre amigable", + "LabelManufacturer": "Fabricante", + "LabelManufacturerUrl": "Url del fabricante", + "LabelModelName": "Nombre de modelo", + "LabelModelNumber": "N\u00famero de modelo", + "LabelModelDescription": "Descripci\u00f3n de modelo", + "LabelModelUrl": "Url del modelo", + "LabelSerialNumber": "N\u00famero de serie", + "LabelDeviceDescription": "Descripci\u00f3n del dispositivo", + "HeaderIdentificationCriteriaHelp": "Entre al menos un criterio de identificaci\u00f3n.", + "HeaderDirectPlayProfileHelp": "A\u00f1adir perfiles de reproducci\u00f3n directa para indicar qu\u00e9 formatos puede utilizar el dispositivo de forma nativa.", + "HeaderTranscodingProfileHelp": "A\u00f1adir perfiles de transcodificaci\u00f3n para indicar qu\u00e9 formatos se deben utilizar cuando se requiera transcodificaci\u00f3n.", + "HeaderResponseProfileHelp": "Perfiles de respuesta proporcionan una forma de personalizar la informaci\u00f3n que se env\u00eda al dispositivo cuando se reproducen ciertos tipos de medios.", + "LabelXDlnaCap": "X-Dlna cap:", + "LabelXDlnaCapHelp": "Determina el contenido del elemento X_DLNACAP en el espacio de nombre urn:schemas-dlna-org:device-1-0.", + "LabelXDlnaDoc": "X-Dlna doc:", + "LabelXDlnaDocHelp": "Determina el contenido del elemento X_DLNADOC en el espacio de nombreurn:schemas-dlna-org:device-1-0.", + "LabelSonyAggregationFlags": "Agregaci\u00f3n de banderas Sony:", + "LabelSonyAggregationFlagsHelp": "Determina el contenido del elemento aggregationFlags en el espacio de nombre urn:schemas-sonycom:av.", + "LabelTranscodingContainer": "Contenedor:", + "LabelTranscodingVideoCodec": "Codec de video:", + "LabelTranscodingVideoProfile": "Perfil de video:", + "LabelTranscodingAudioCodec": "Codec de audio:", + "OptionEnableM2tsMode": "Activar modo M2ts", + "OptionEnableM2tsModeHelp": "Activar modo m2ts cuando se codifique a mpegts", + "OptionEstimateContentLength": "Estimar longitud del contenido al transcodificar", + "OptionReportByteRangeSeekingWhenTranscoding": "Indicar que el servidor soporta la b\u00fasqueda de byte al transcodificar", + "OptionReportByteRangeSeekingWhenTranscodingHelp": "Esto es necesario para algunos dispositivos que no buscan el tiempo muy bien.", + "HeaderSubtitleDownloadingHelp": "Cuando Media Browser escanea los archivos de v\u00eddeo, puede buscar subt\u00edtulos faltantes y descargarlos usando un proveedor de subt\u00edtulos como OpenSubtitles.org.", + "HeaderDownloadSubtitlesFor": "Descarga subt\u00edtulos para:", + "MessageNoChapterProviders": "Instalar un plugin proveedor de cap\u00edtulos como ChapterDb o tagChimp para permitir opciones de cap\u00edtulo adicionales.", + "LabelSkipIfGraphicalSubsPresent": "Omitir si el video ya contiene subt\u00edtulos gr\u00e1ficos", + "LabelSkipIfGraphicalSubsPresentHelp": "Mantener versiones de texto de los subt\u00edtulos se traducir\u00e1 en una prestaci\u00f3n m\u00e1s eficiente para los clientes m\u00f3viles.", + "TabSubtitles": "Subt\u00edtulos", + "TabChapters": "Cap\u00edtulos", + "HeaderDownloadChaptersFor": "Descarga nombres de los cap\u00edtulos de:", + "LabelOpenSubtitlesUsername": "Usuario de Open Subtitles:", + "LabelOpenSubtitlesPassword": "Contrase\u00f1a de Open Subtitles:", + "HeaderChapterDownloadingHelp": "Cuando Media Browser escanea los archivos de v\u00eddeo, puede descargar nombres de los cap\u00edtulos desde la red utilizando plugins de cap\u00edtulos como ChapterDb y tagChimp.", + "LabelPlayDefaultAudioTrack": "\nReproducir pista de audio predeterminado, independientemente del idioma", + "LabelSubtitlePlaybackMode": "Modo de Subt\u00edtulo:", + "LabelDownloadLanguages": "Idiomas de descarga:", + "ButtonRegister": "Registrar", + "LabelSkipIfAudioTrackPresent": "Omitir si la pista de audio por defecto coincide con el idioma de descarga", + "LabelSkipIfAudioTrackPresentHelp": "Desactive esta opci\u00f3n para asegurar que todos los v\u00eddeos tienen subt\u00edtulos, sin importar el idioma de audio.", + "HeaderSendMessage": "Enviar mensaje", + "ButtonSend": "Enviar", + "LabelMessageText": "Mensaje de texto:", + "MessageNoAvailablePlugins": "No hay plugins disponibles.", + "LabelDisplayPluginsFor": "Mostrar plugins para:", + "PluginTabMediaBrowserClassic": "MB Classic", + "PluginTabMediaBrowserTheater": "MB Theater", + "TabOtherPlugins": "Otros", + "LabelEpisodeName": "Nombre episodio", + "LabelSeriesName": "Nombre de la serie", + "ValueSeriesNamePeriod": "Series.name", + "ValueSeriesNameUnderscore": "Series_name", + "ValueEpisodeNamePeriod": "Episode.name", + "ValueEpisodeNameUnderscore": "Episode_name", + "HeaderTypeText": "Entrar texto", + "LabelTypeText": "Texto", + "HeaderSearchForSubtitles": "B\u00fasqueda de Subt\u00edtulos", + "MessageNoSubtitleSearchResultsFound": "No se han encontrado resultados en la b\u00fasqueda.", + "TabDisplay": "Pantalla", + "TabLanguages": "Idiomas", + "TabWebClient": "Cliente web", + "LabelEnableThemeSongs": "Habilitar temas musicales", + "LabelEnableBackdrops": "Habilitar im\u00e1genes de fondo", + "LabelEnableThemeSongsHelp": "Si est\u00e1 habilitado, se reproducir\u00e1n temas musicales de fondo mientras navega por la biblioteca.", + "LabelEnableBackdropsHelp": "Si est\u00e1 habilitado, se mostrar\u00e1n im\u00e1genes de fondo en algunas p\u00e1ginas mientras navega por la biblioteca.", + "HeaderHomePage": "P\u00e1gina de inicio", + "HeaderSettingsForThisDevice": "Opciones para este dispositivo", + "OptionAuto": "Auto", + "OptionYes": "Si", + "OptionNo": "No", + "LabelHomePageSection1": "Secci\u00f3n uno de la p\u00e1gina de inicio:", + "LabelHomePageSection2": "Secci\u00f3n dos de la p\u00e1gina de inicio:", + "LabelHomePageSection3": "Secci\u00f3n tres de la p\u00e1gina de inicio:", + "LabelHomePageSection4": "Secci\u00f3n cuarta de la p\u00e1gina de inicio", + "OptionMyViewsButtons": "Mis vistas (botones)", + "OptionMyViews": "Mis vistas", + "OptionMyViewsSmall": "Mis vistas (peque\u00f1o)", + "OptionResumablemedia": "Continuar", + "OptionLatestMedia": "\u00daltimos medios", + "OptionLatestChannelMedia": "Ultimos elementos de canales", + "HeaderLatestChannelItems": "Ultimos elementos de canales", + "OptionNone": "Nada", + "HeaderLiveTv": "TV en vivo", + "HeaderReports": "Informes", + "HeaderMetadataManager": "Metadata Manager", + "HeaderPreferences": "Preferencias", + "MessageLoadingChannels": "Cargando contenidos del canal...", + "ButtonMarkRead": "Marcar como le\u00eddo", + "OptionDefaultSort": "Por defecto", + "OptionCommunityMostWatchedSort": "M\u00e1s visto", + "TabNextUp": "Siguiendo", + "MessageNoMovieSuggestionsAvailable": "No hay sugerencias de pel\u00edculas disponibles. Comience ver y calificar sus pel\u00edculas y vuelva para ver las recomendaciones.", + "MessageNoCollectionsAvailable": "Colecciones le permitir\u00e1 disfrutar de grupos personalizados de Pel\u00edculas, Series, Discos, Libros y Juegos. Haga click en el bot\u00f3n nuevo para empezar a crear Colecciones.", + "HeaderWelcomeToMediaBrowserWebClient": "Vienvenido al Cliente Web de Media Browser", + "ButtonDismiss": "Descartar", + "MessageLearnHowToCustomize": "Aprenda c\u00f3mo personalizar esta p\u00e1gina a sus propios gustos personales. Haga clic en su icono de usuario en la esquina superior derecha de la pantalla para ver y actualizar sus preferencias.", + "ButtonEditOtherUserPreferences": "Editar preferencias personales de este usuario.", + "LabelChannelStreamQuality": "Calidad preferida para la transmisi\u00f3n por Internet:", + "LabelChannelStreamQualityHelp": "En un entorno de bajo ancho de banda, limitar la calidad puede ayudar a asegurar una experiencia de streaming suave.", + "OptionBestAvailableStreamQuality": "Mejor disponible", + "LabelEnableChannelContentDownloadingFor": "Habilitar descargas de contenido para el canal:", + "LabelEnableChannelContentDownloadingForHelp": "Algunos canales soportan descargar contenido antes de ver. Habilite esta en ambientes de poco ancho de banda para descargar el contenido del canal durante las horas libres. El contenido se descarga como parte de la tarea programada de descargas de canal.", + "LabelChannelDownloadPath": "Ruta para descargas de contenidos de canales:", + "LabelChannelDownloadPathHelp": "Especifique una ruta personalizada si lo desea. D\u00e9jelo en blanco para utilizar un carpeta interna del programa.", + "LabelChannelDownloadAge": "Borrar contenido despues de: (d\u00edas)", + "LabelChannelDownloadAgeHelp": "Todo contenido descargado anterior se borrar\u00e1. Continuar\u00e1 estando disponible v\u00eda streaming de internet.", + "ChannelSettingsFormHelp": "Instale canales como Trailers y Vimeo desde el cat\u00e1logo de plugins.", + "LabelSelectCollection": "Seleccionar colecci\u00f3n:", + "ViewTypeMovies": "Pel\u00edculas", + "ViewTypeTvShows": "TV", + "ViewTypeGames": "Juegos", + "ViewTypeMusic": "M\u00fasica", + "ViewTypeBoxSets": "Colecciones", + "ViewTypeChannels": "Canales", + "ViewTypeLiveTV": "Tv en vivo", + "HeaderOtherDisplaySettings": "Configuraci\u00f3n de pantalla", + "HeaderMyViews": "Mis vistas", + "LabelSelectFolderGroups": "Agrupar autom\u00e1ticamente las siguientes carpetas en vistas tales como pel\u00edculas, m\u00fasica y televisi\u00f3n", + "LabelSelectFolderGroupsHelp": "Las carpetas que no est\u00e9n marcadas se mostrar\u00e1n por s\u00ed mismas en su propia secci\u00f3n.", + "OptionDisplayAdultContent": "Mostrar contenido para adultos", + "OptionLibraryFolders": "Vista de carpeta", + "TitleRemoteControl": "Control remoto", + "OptionLatestTvRecordings": "\u00daltimas grabaciones", + "LabelProtocolInfo": "Informaci\u00f3n de protocolo:", + "LabelProtocolInfoHelp": "El valor que se utilizar\u00e1 cuando se responde a una solicitud GetProtocolInfo desde el dispositivo.", + "TabXbmcMetadata": "Xbmc", + "HeaderXbmcMetadataHelp": "Media Browser incluye soporte nativo para XBMC, Nfo, metadatos e im\u00e1genes. Para activar o desactivar los metadatos XBMC, utilice la ficha Avanzadas para configurar opciones para sus tipos de medios.", + "LabelXbmcMetadataUser": "A\u00f1adir datos de reproducciones de usuario a los nfo\u00b4s para:", + "LabelXbmcMetadataUserHelp": "Activar esto para mantener sincronizados los datos de reproducci\u00f3n entre Media Browser y Xbmc.", + "LabelXbmcMetadataDateFormat": "Formato de fecha de estreno:", + "LabelXbmcMetadataDateFormatHelp": "Todas las fechas dentro de los nfo se leer\u00e1n y se escribir\u00e1n usando este formato.", + "LabelXbmcMetadataSaveImagePaths": "Grabar las rutas de las im\u00e1genes en los archivos nfo", + "LabelXbmcMetadataSaveImagePathsHelp": "\nEsto se recomienda si usted tiene los nombres de archivo de imagen que no se ajusten a las directrices de XBMC.", + "LabelXbmcMetadataEnablePathSubstitution": "Habilitar rutas de sustituci\u00f3n", + "LabelXbmcMetadataEnablePathSubstitutionHelp": "Permite la sustituci\u00f3n de las rutas de im\u00e1genes utilizando la configuraci\u00f3n de rutas de sustituci\u00f3n en las opciones del servidor.", + "LabelXbmcMetadataEnablePathSubstitutionHelp2": "Ver rutas de sustituci\u00f3n.", + "LabelGroupChannelsIntoViews": "Visualice los siguientes canales dentro de mis vistas:", + "LabelGroupChannelsIntoViewsHelp": "Si est\u00e1 activado, estos canales se mostrar\u00e1n directamente junto a Mis Vistas. Si est\u00e1 desactivada, ser\u00e1n mostrados separadamente en la vista de Canales.", + "LabelDisplayCollectionsView": "Mostrar una vista Colecciones para mostrar colecciones de pel\u00edculas", + "LabelXbmcMetadataEnableExtraThumbs": "Copiar extrafanart en extrathumbs", + "LabelXbmcMetadataEnableExtraThumbsHelp": "Cuando se descargan im\u00e1genes se pueden guardar tanto en extrafanart como en extrathumbs para una m\u00e1xima compatibilidad con el skin de XBMC.", + "TabServices": "Servicios", + "TabLogs": "Logs", + "HeaderServerLogFiles": "Archivos de log del servidor:", + "TabBranding": "Branding", + "HeaderBrandingHelp": "Personalizar la apariencia de Explorador de medios para satisfacer las necesidades de su grupo u organizaci\u00f3n.", + "LabelLoginDisclaimer": "Login renuncia:", + "LabelLoginDisclaimerHelp": "This will be displayed at the bottom of the login page.", + "LabelAutomaticallyDonate": "Donar autom\u00e1ticamente esta cantidad cada mes", + "LabelAutomaticallyDonateHelp": "Usted puede cancelar en cualquier momento desde su cuenta de PayPal." +} \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/Server/es_MX.json b/MediaBrowser.Server.Implementations/Localization/Server/es_MX.json index d09fdedee..c8f3bcb05 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/es_MX.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/es_MX.json @@ -837,14 +837,14 @@ "LabelGroupChannelsIntoViewsHelp": "Al habilitarse, estos canales ser\u00e1n desplegados directamente junto con otras vistas. Si permanecen deshabilitados, ser\u00e1n desplegados dentro de una vista independiente de Canales.", "LabelDisplayCollectionsView": "Desplegar una Vista de colecciones para mostrar las colecciones de pel\u00edculas", "LabelXbmcMetadataEnableExtraThumbs": "Copiar extrafanart en extrathumbs", - "LabelXbmcMetadataEnableExtraThumbsHelp": "Cuando se descargan las im\u00e1genes \u00e9stas pueden ser almacenadas en extrafanart y extrathumbs para una m\u00e1xima compatibilidad con los skins de Xbmc.", + "LabelXbmcMetadataEnableExtraThumbsHelp": "Cuando se descargan im\u00e1genes \u00e9stas pueden ser almacenadas en extrafanart y extrathumbs para una m\u00e1xima compatibilidad con los skins de Xbmc.", "TabServices": "Servicios", "TabLogs": "Registros", "HeaderServerLogFiles": "Archivos de registro del servidor:", - "TabBranding": "Branding", + "TabBranding": "Establecer Marca", "HeaderBrandingHelp": "Personaliza la apariencia de Media Browser para ajustarla a las necesidades de tu grupo u organizaci\u00f3n.", - "LabelLoginDisclaimer": "Aviso legal de Inicio de Sesi\u00f3n:", - "LabelLoginDisclaimerHelp": "Se mostrara al final de la pagina de inicio de sesi\u00f3n.", + "LabelLoginDisclaimer": "Aviso de Inicio de Sesi\u00f3n:", + "LabelLoginDisclaimerHelp": "Esto se mostrara al final de la pagina de inicio de sesi\u00f3n.", "LabelAutomaticallyDonate": "Donar autom\u00e1ticamente esta cantidad cada mes", "LabelAutomaticallyDonateHelp": "Puedes cancelarlo en cualquier momento por medio de tu cuenta PayPal." } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/Server/it.json b/MediaBrowser.Server.Implementations/Localization/Server/it.json index 13e385da3..591fe98b9 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/it.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/it.json @@ -837,14 +837,14 @@ "LabelGroupChannelsIntoViewsHelp": "Se abilitata, questi canali verranno visualizzati direttamente accanto ad altri punti di vista. Se disattivato, saranno visualizzati all'interno di una visione canali separati.", "LabelDisplayCollectionsView": "Visualizzare una vista Collezioni per mostrare collezioni di film", "LabelXbmcMetadataEnableExtraThumbs": "Copy extrafanart into extrathumbs", - "LabelXbmcMetadataEnableExtraThumbsHelp": "When downloading images they can be saved into both extrafanart and extrathumbs for maximum Xbmc skin compatibility.", - "TabServices": "Services", + "LabelXbmcMetadataEnableExtraThumbsHelp": "Quando si scaricano le immagini possono essere salvate in entrambi extrafanart e extrathumbs per la massima compatibilit\u00e0 cutanea XBMC.", + "TabServices": "Servizi", "TabLogs": "Logs", "HeaderServerLogFiles": "Server log files:", "TabBranding": "Branding", - "HeaderBrandingHelp": "Customize the appearance of Media Browser to fit the needs of your group or organization.", + "HeaderBrandingHelp": "Personalizzare l'aspetto del browser media per soddisfare le esigenze del vostro gruppo o organizzazione.", "LabelLoginDisclaimer": "Login disclaimer:", - "LabelLoginDisclaimerHelp": "This will be displayed at the bottom of the login page.", - "LabelAutomaticallyDonate": "Automatically donate this amount each month", - "LabelAutomaticallyDonateHelp": "You can cancel at any time via your PayPal account." + "LabelLoginDisclaimerHelp": "Questo verr\u00e0 visualizzato nella parte inferiore della pagina di accesso.", + "LabelAutomaticallyDonate": "Donare automaticamente questo importo ogni mese", + "LabelAutomaticallyDonateHelp": "\u00c8 possibile annullare in qualsiasi momento tramite il vostro conto PayPal." } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/Server/pl.json b/MediaBrowser.Server.Implementations/Localization/Server/pl.json index 85066b4fb..b4d49e5b3 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/pl.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/pl.json @@ -253,7 +253,7 @@ "LabelEnableDebugLogging": "Enable debug logging", "LabelRunServerAtStartup": "Run server at startup", "LabelRunServerAtStartupHelp": "This will start the tray icon on windows startup. To start the windows service, uncheck this and run the service from the windows control panel. Please note that you cannot run both at the same time, so you will need to exit the tray icon before starting the service.", - "ButtonSelectDirectory": "Select Directory", + "ButtonSelectDirectory": "Wybierz folder", "LabelCustomPaths": "Specify custom paths where desired. Leave fields empty to use the defaults.", "LabelCachePath": "Cache path:", "LabelCachePathHelp": "This folder contains server cache files, such as images.", @@ -265,13 +265,13 @@ "LabelTranscodingTempPathHelp": "This folder contains working files used by the transcoder. Specify a custom path, or leave empty to use the default within the server's data folder.", "TabBasics": "Basics", "TabTV": "TV", - "TabGames": "Games", - "TabMusic": "Music", - "TabOthers": "Others", + "TabGames": "Gry", + "TabMusic": "Muzyka", + "TabOthers": "Inne", "HeaderExtractChapterImagesFor": "Extract chapter images for:", - "OptionMovies": "Movies", - "OptionEpisodes": "Episodes", - "OptionOtherVideos": "Other Videos", + "OptionMovies": "Filmy", + "OptionEpisodes": "Odcinki", + "OptionOtherVideos": "Inne widea", "TitleMetadata": "Metadata", "LabelAutomaticUpdatesFanart": "Enable automatic updates from FanArt.tv", "LabelAutomaticUpdatesTmdb": "Enable automatic updates from TheMovieDB.org", diff --git a/MediaBrowser.Server.Implementations/Localization/Server/pt_BR.json b/MediaBrowser.Server.Implementations/Localization/Server/pt_BR.json index 1716dc66a..96c3429c9 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/pt_BR.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/pt_BR.json @@ -837,14 +837,14 @@ "LabelGroupChannelsIntoViewsHelp": "Se ativado, estes canais ser\u00e3o exibidos imediatamente ao lado de outras visualiza\u00e7\u00f5es. Se desativado, eles ser\u00e3o exibidos dentro de uma visualiza\u00e7\u00e3o separada de Canais.", "LabelDisplayCollectionsView": "Exibir uma visualiza\u00e7\u00e3o de Cole\u00e7\u00f5es para mostrar colet\u00e2neas de filmes", "LabelXbmcMetadataEnableExtraThumbs": "Copiar extrafanart para dentro de extrathumbs", - "LabelXbmcMetadataEnableExtraThumbsHelp": "Ao fazer o download de imagens elas podem ser salvas em ambas extrafanart e extrathumbs para uma maior compatibilidade com a skin do Xbmc", + "LabelXbmcMetadataEnableExtraThumbsHelp": "Ao fazer o download de imagens elas podem ser salvas em ambas extrafanart e extrathumbs para uma maior compatibilidade com a skin do Xbmc.", "TabServices": "Servi\u00e7os", "TabLogs": "Logs", "HeaderServerLogFiles": "Arquivos de log do servidor:", "TabBranding": "Marca", "HeaderBrandingHelp": "Personalizar a apar\u00eancia do Media Browser para as necessidades de seu grupo ou organiza\u00e7\u00e3o.", - "LabelLoginDisclaimer": "Login disclaimer:", - "LabelLoginDisclaimerHelp": "This will be displayed at the bottom of the login page.", - "LabelAutomaticallyDonate": "Automatically donate this amount each month", - "LabelAutomaticallyDonateHelp": "You can cancel at any time via your PayPal account." + "LabelLoginDisclaimer": "Aviso legal no login:", + "LabelLoginDisclaimerHelp": "Isto ser\u00e1 exibido na parte inferior da p\u00e1gina de login.", + "LabelAutomaticallyDonate": "Doar automaticamente esta quantidade a cada m\u00eas", + "LabelAutomaticallyDonateHelp": "Voc\u00ea pode cancelar a qualquer hora atrav\u00e9s de sua conta do PayPal." } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/Server/ru.json b/MediaBrowser.Server.Implementations/Localization/Server/ru.json index 5e00322d8..c1150bc2b 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/ru.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/ru.json @@ -284,7 +284,7 @@ "ButtonAutoScroll": "\u0410\u0432\u0442\u043e\u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430", "LabelImageSavingConvention": "\u0424\u043e\u0440\u043c\u0430\u0442 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0440\u0438\u0441\u0443\u043d\u043a\u043e\u0432:", "LabelImageSavingConventionHelp": "\u0412 Media Browser \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u044e\u0442\u0441\u044f \u0440\u0438\u0441\u0443\u043d\u043a\u0438 \u0438\u043c\u0435\u044e\u0449\u0438\u0435\u0441\u044f \u0432 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0451\u043d\u043d\u044b\u0445 \u043c\u0435\u0434\u0438\u0430\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u0445. \u0412\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c\u044b\u0439 \u0444\u043e\u0440\u043c\u0430\u0442 \u043f\u043e\u043b\u0435\u0437\u043d\u043e \u0442\u0430\u043a\u0436\u0435 \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u0438 \u0434\u0440\u0443\u0433\u0438\u0445 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u043e\u0432.", - "OptionImageSavingCompatible": "\u0421\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u044b\u0439 - Media Browse\/XBMCr\/Plex", + "OptionImageSavingCompatible": "\u0421\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u044b\u0439 - Media Browser\/XBMC\/Plex", "OptionImageSavingStandard": "\u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 - MB2", "ButtonSignIn": "\u0412\u043e\u0439\u0442\u0438", "TitleSignIn": "\u0412\u0445\u043e\u0434", @@ -427,7 +427,7 @@ "OptionUpscalingHelp": "\u0412 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445, \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043f\u0440\u043e\u0438\u0437\u043e\u0439\u0434\u0451\u0442 \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u0435 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0430 \u0432\u0438\u0434\u0435\u043e, \u043d\u043e \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u0441\u044f \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u043d\u0430 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440.", "EditCollectionItemsHelp": "\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0439\u0442\u0435 \u0438\u043b\u0438 \u0443\u0431\u0438\u0440\u0430\u0439\u0442\u0435 \u043b\u044e\u0431\u044b\u0435 \u0444\u0438\u043b\u044c\u043c\u044b, \u0441\u0435\u0440\u0438\u0430\u043b\u044b, \u0430\u043b\u044c\u0431\u043e\u043c\u044b, \u043a\u043d\u0438\u0433\u0438 \u0438\u043b\u0438 \u0438\u0433\u0440\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0436\u0435\u043b\u0430\u0435\u0442\u0435 \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432 \u0434\u0430\u043d\u043d\u0443\u044e \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044e.", "HeaderAddTitles": "\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u0430\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u044f", - "LabelEnableDlnaPlayTo": "\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043d\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0435 DLNA", + "LabelEnableDlnaPlayTo": "\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c DLNA-\u0440\u0435\u0436\u0438\u043c \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043d\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\u0445", "LabelEnableDlnaPlayToHelp": "Media Browser \u0438\u043c\u0435\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u0432\u0430\u0442\u044c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0432 \u0441\u0435\u0442\u0438 \u0438 \u0443\u0434\u0430\u043b\u0451\u043d\u043d\u043e \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0438\u043c\u0438.", "LabelEnableDlnaDebugLogging": "\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043e\u0442\u043b\u0430\u0434\u043e\u0447\u043d\u044b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 DLNA \u0432 \u0416\u0443\u0440\u043d\u0430\u043b\u0435", "LabelEnableDlnaDebugLoggingHelp": "\u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0431\u0443\u0434\u0443\u0442 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c\u0441\u044f \u0444\u0430\u0439\u043b\u044b \u0416\u0443\u0440\u043d\u0430\u043b\u0430 \u043e\u0447\u0435\u043d\u044c \u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u043e\u0431\u044a\u0451\u043c\u0430, \u0430 \u044d\u0442\u043e \u0434\u043e\u043b\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0441\u0438\u043b\u0443 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u0443\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043d\u0435\u043f\u043e\u043b\u0430\u0434\u043e\u043a.", @@ -553,15 +553,15 @@ "ErrorMessageInvalidKey": "\u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043b\u044e\u0431\u043e\u0435 \u043f\u0440\u0435\u043c\u0438\u0443\u043c \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435, \u0432\u044b \u0442\u0430\u043a\u0436\u0435 \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0441\u043f\u043e\u043d\u0441\u043e\u0440\u043e\u043c Media Browser. \u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u0434\u0430\u0440\u0441\u0442\u0432\u0443\u0439\u0442\u0435 \u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0439\u0442\u0435 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u044e\u0449\u0435\u0435\u0441\u044f \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u0435 \u043e\u0441\u043d\u043e\u0432\u043e\u043f\u043e\u043b\u0430\u0433\u0430\u044e\u0449\u0435\u0433\u043e \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0430. \u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u0438\u043c \u0432\u0430\u0441.", "HeaderDisplaySettings": "\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f", "TabPlayTo": " \u0412\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043d\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0435", - "LabelEnableDlnaServer": "\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c DLNA \u0441\u0435\u0440\u0432\u0435\u0440", - "LabelEnableDlnaServerHelp": "\u041f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 UPnP \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\u043c \u0432 \u0441\u0435\u0442\u0438 \u043e\u0431\u0437\u043e\u0440 \u0438 \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u044f Media Browser.", + "LabelEnableDlnaServer": "\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c DLNA-\u0441\u0435\u0440\u0432\u0435\u0440", + "LabelEnableDlnaServerHelp": "\u041f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 UPnP-\u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\u043c \u0432 \u0441\u0435\u0442\u0438 \u043e\u0431\u0437\u043e\u0440 \u0438 \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u044f Media Browser.", "LabelEnableBlastAliveMessages": "\u0423\u0447\u0430\u0449\u0430\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438", "LabelEnableBlastAliveMessagesHelp": "\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c, \u0435\u0441\u043b\u0438 \u0441\u0435\u0440\u0432\u0435\u0440 \u043d\u0435 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430\u0434\u0451\u0436\u043d\u043e \u0434\u0440\u0443\u0433\u0438\u043c\u0438 UPnP \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\u043c\u0438 \u0432 \u0441\u0435\u0442\u0438.", "LabelBlastMessageInterval": "\u0418\u043d\u0442\u0435\u0440\u0432\u0430\u043b \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438, \u0441", "LabelBlastMessageIntervalHelp": "\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0434\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0430\u0445 \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f\u043c\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 \u0441\u0435\u0440\u0432\u0435\u0440\u0430.", "LabelDefaultUser": "\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e", "LabelDefaultUserHelp": "\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c, \u0447\u044c\u044f \u043c\u0435\u0434\u0438\u0430\u0442\u0435\u043a\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u0445 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\u0445. \u041f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u044d\u0442\u043e\u0433\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043f\u0440\u043e\u0444\u0438\u043b\u0435\u0439.", - "TitleDlna": "DLNA \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430", + "TitleDlna": "DLNA-\u0440\u0435\u0436\u0438\u043c", "TitleChannels": "\u041a\u0430\u043d\u0430\u043b\u044b", "HeaderServerSettings": "\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0441\u0435\u0440\u0432\u0435\u0440\u0430", "LabelWeatherDisplayLocation": "\u041f\u043e\u0433\u043e\u0434\u0430 \u0434\u043b\u044f \u043c\u0435\u0441\u0442\u043d\u043e\u0441\u0442\u0438:", @@ -822,14 +822,14 @@ "OptionLatestTvRecordings": "\u041d\u043e\u0432\u0438\u043d\u043a\u0438 \u0437\u0430\u043f\u0438\u0441\u0435\u0439", "LabelProtocolInfo": "\u0421\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043e \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0435:", "LabelProtocolInfoHelp": "\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u0440\u0438 \u043e\u0442\u043a\u043b\u0438\u043a\u0435 \u043d\u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u044b GetProtocolInfo \u043e\u0442 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430.", - "TabXbmcMetadata": "Xbmc", - "HeaderXbmcMetadataHelp": "Media Browser \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u0443\u044e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0440\u0438\u0441\u0443\u043d\u043a\u043e\u0432 \u0434\u043b\u044f Xbmc Nfo. \u0414\u043b\u044f \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0438\u043b\u0438 \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445 Xbmc, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u0432\u043a\u043b\u0430\u0434\u043a\u0443 \u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u043d\u044b\u0435, \u0447\u0442\u043e\u0431\u044b \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043f\u043e \u0442\u0438\u043f\u0430\u043c \u043d\u043e\u0441\u0438\u0442\u0435\u043b\u0435\u0439.", - "LabelXbmcMetadataUser": "\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432 nfo \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u0434\u043b\u044f:", - "LabelXbmcMetadataUserHelp": "\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c, \u0447\u0442\u043e\u0431\u044b \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0435\u0436\u0434\u0443 Media Browser \u0438 Xbmc \u0445\u0440\u0430\u043d\u0438\u043c\u044b\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430.", + "TabXbmcMetadata": "XBMC", + "HeaderXbmcMetadataHelp": "Media Browser \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u0443\u044e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 XBMC \u0434\u043b\u044f NFO \u0444\u0430\u0439\u043b\u043e\u0432 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0440\u0438\u0441\u0443\u043d\u043a\u043e\u0432. \u0414\u043b\u044f \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0438\u043b\u0438 \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445 XBMC, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u0432\u043a\u043b\u0430\u0434\u043a\u0443 \u0421\u043b\u0443\u0436\u0431\u044b, \u0447\u0442\u043e\u0431\u044b \u0441\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043f\u043e \u0442\u0438\u043f\u0430\u043c \u043d\u043e\u0441\u0438\u0442\u0435\u043b\u0435\u0439.", + "LabelXbmcMetadataUser": "\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432 NFO \u0444\u0430\u0439\u043b\u044b \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u0434\u043b\u044f:", + "LabelXbmcMetadataUserHelp": "\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c, \u0447\u0442\u043e\u0431\u044b \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0445\u0440\u0430\u043d\u0438\u043c\u044b\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u043c\u0435\u0436\u0434\u0443 Media Browser \u0438 XBMC.", "LabelXbmcMetadataDateFormat": "\u0424\u043e\u0440\u043c\u0430\u0442 \u0434\u0430\u0442\u044b \u0432\u044b\u043f\u0443\u0441\u043a\u0430:", - "LabelXbmcMetadataDateFormatHelp": "\u0412\u0441\u0435 \u0434\u0430\u0442\u044b \u0432 nfo \u0431\u0443\u0434\u0443\u0442 \u0447\u0438\u0442\u0430\u0442\u044c\u0441\u044f \u0438 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0444\u043e\u0440\u043c\u0430\u0442\u0430.", - "LabelXbmcMetadataSaveImagePaths": "\u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c \u043f\u0443\u0442\u0438 \u0440\u0438\u0441\u0443\u043d\u043a\u043e\u0432 \u0432 nfo \u0444\u0430\u0439\u043b\u0430\u0445", - "LabelXbmcMetadataSaveImagePathsHelp": "\u0420\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f, \u0435\u0441\u043b\u0438 \u0438\u043c\u0435\u043d\u0430 \u0444\u0430\u0439\u043b\u043e\u0432 \u0440\u0438\u0441\u0443\u043d\u043a\u043e\u0432 \u043d\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u044f\u0449\u0438\u043c \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0430\u043c Xbmc.", + "LabelXbmcMetadataDateFormatHelp": "\u0412\u0441\u0435 \u0434\u0430\u0442\u044b \u0432 NFO \u0444\u0430\u0439\u043b\u0430\u0445 \u0431\u0443\u0434\u0443\u0442 \u0447\u0438\u0442\u0430\u0442\u044c\u0441\u044f \u0438 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0444\u043e\u0440\u043c\u0430\u0442\u0430.", + "LabelXbmcMetadataSaveImagePaths": "\u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c \u043f\u0443\u0442\u0438 \u0440\u0438\u0441\u0443\u043d\u043a\u043e\u0432 \u0432 NFO \u0444\u0430\u0439\u043b\u0430\u0445", + "LabelXbmcMetadataSaveImagePathsHelp": "\u0420\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f, \u0435\u0441\u043b\u0438 \u0438\u043c\u0435\u043d\u0430 \u0444\u0430\u0439\u043b\u043e\u0432 \u0440\u0438\u0441\u0443\u043d\u043a\u043e\u0432 \u043d\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u044f\u0449\u0438\u043c \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0430\u043c XBMC.", "LabelXbmcMetadataEnablePathSubstitution": "\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043f\u043e\u0434\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u043f\u0443\u0442\u0435\u0439", "LabelXbmcMetadataEnablePathSubstitutionHelp": "\u0412\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u043f\u043e\u0434\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u043f\u0443\u0442\u0435\u0439 \u043a \u0440\u0438\u0441\u0443\u043d\u043a\u0430\u043c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a \u043f\u043e\u0434\u0441\u0442\u0430\u043d\u043e\u0432\u043e\u043a \u043f\u0443\u0442\u0435\u0439 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435.", "LabelXbmcMetadataEnablePathSubstitutionHelp2": "\u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043f\u043e\u0434\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u043f\u0443\u0442\u0435\u0439.", diff --git a/MediaBrowser.Server.Implementations/Localization/Server/sv.json b/MediaBrowser.Server.Implementations/Localization/Server/sv.json index 028689093..c2e49294f 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/sv.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/sv.json @@ -838,13 +838,13 @@ "LabelDisplayCollectionsView": "Visa en Samlingar-vy f\u00f6r filmsamlingar", "LabelXbmcMetadataEnableExtraThumbs": "Kopiera extrafanart till extrathumbs", "LabelXbmcMetadataEnableExtraThumbsHelp": "N\u00e4r bilder h\u00e4mtas fr\u00e5n Internet kan de sparas i b\u00e5de extrafanart- och extrathumbs-mapparna f\u00f6r att ge maximal kompatibilitet med Xbmc-skins.", - "TabServices": "Services", - "TabLogs": "Logs", - "HeaderServerLogFiles": "Server log files:", + "TabServices": "Tj\u00e4nster", + "TabLogs": "Loggfiler", + "HeaderServerLogFiles": "Serverloggfiler:", "TabBranding": "Branding", - "HeaderBrandingHelp": "Customize the appearance of Media Browser to fit the needs of your group or organization.", - "LabelLoginDisclaimer": "Login disclaimer:", - "LabelLoginDisclaimerHelp": "This will be displayed at the bottom of the login page.", - "LabelAutomaticallyDonate": "Automatically donate this amount each month", - "LabelAutomaticallyDonateHelp": "You can cancel at any time via your PayPal account." + "HeaderBrandingHelp": "Anpassa utseendet p\u00e5 Media Browser till din grupp eller f\u00f6retags \u00f6nskem\u00e5l.", + "LabelLoginDisclaimer": "Ansvarsbegr\u00e4nsning vid inloggning:", + "LabelLoginDisclaimerHelp": "Detta visas l\u00e4ngst ned p\u00e5 inloggningssidan.", + "LabelAutomaticallyDonate": "Donera automatiskt detta belopp varje m\u00e5nad", + "LabelAutomaticallyDonateHelp": "Du kan avbryta n\u00e4r som helst via ditt PayPal-konto." } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj b/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj index 859011f6e..a3dea9e47 100644 --- a/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj +++ b/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj @@ -354,6 +354,8 @@ + + diff --git a/MediaBrowser.ServerApplication/FFMpeg/FFMpegDownloadInfo.cs b/MediaBrowser.ServerApplication/FFMpeg/FFMpegDownloadInfo.cs index b8566ee51..206a04460 100644 --- a/MediaBrowser.ServerApplication/FFMpeg/FFMpegDownloadInfo.cs +++ b/MediaBrowser.ServerApplication/FFMpeg/FFMpegDownloadInfo.cs @@ -14,6 +14,7 @@ namespace MediaBrowser.ServerApplication.FFMpeg // Windows builds: http://ffmpeg.zeranoe.com/builds/ // Linux builds: http://ffmpeg.gusari.org/static/ // OS X builds: http://ffmpegmac.net/ + // OS X x64: http://www.evermeet.cx/ffmpeg/ public static string Version = ffmpegOsType("Version"); @@ -113,15 +114,23 @@ namespace MediaBrowser.ServerApplication.FFMpeg return new[] { "http://ffmpeg.zeranoe.com/builds/win32/static/ffmpeg-20140612-git-3a1c895-win32-static.7z", - "https://www.dropbox.com/s/lllit55bynbz6zc/ffmpeg-20140612-git-3a1c895-win32-static.7z?dl=1" + "https://github.com/MediaBrowser/MediaBrowser.Resources/raw/master/ffmpeg/windows/ffmpeg-20140612-git-3a1c895-win32-static.7z" }; case PlatformID.Unix: + if (PlatformDetection.IsMac && PlatformDetection.IsX86) + { + return new[] + { + "https://github.com/MediaBrowser/MediaBrowser.Resources/raw/master/ffmpeg/osx/ffmpeg-osx-20131121.gz" + }; + } + if (PlatformDetection.IsMac && PlatformDetection.IsX86_64) { return new[] { - "https://www.dropbox.com/s/n188rxbulqem8ry/ffmpeg-osx-20131121.gz?dl=1" + "https://github.com/MediaBrowser/MediaBrowser.Resources/raw/master/ffmpeg/osx/ffprobe-x64-2.2.4.7z" }; } @@ -132,7 +141,7 @@ namespace MediaBrowser.ServerApplication.FFMpeg return new[] { "http://ffmpeg.gusari.org/static/32bit/ffmpeg.static.32bit.latest.tar.gz", - "https://www.dropbox.com/s/k9s02pv5to6slfb/ffmpeg.static.32bit.2014-05-06.tar.gz?dl=1" + "https://github.com/MediaBrowser/MediaBrowser.Resources/raw/master/ffmpeg/linux/ffmpeg.static.32bit.2014-05-06.tar.gz" }; } @@ -141,13 +150,13 @@ namespace MediaBrowser.ServerApplication.FFMpeg return new[] { "http://ffmpeg.gusari.org/static/64bit/ffmpeg.static.64bit.latest.tar.gz", - "https://www.dropbox.com/s/onuregwghywnzjo/ffmpeg.static.64bit.2014-05-05.tar.gz?dl=1" + "https://github.com/MediaBrowser/MediaBrowser.Resources/raw/master/ffmpeg/linux/ffmpeg.static.64bit.2014-05-05.tar.gz" }; } } - //No Unix version available + // No Unix version available return new string[] { }; default: diff --git a/MediaBrowser.Tests/MediaBrowser.Tests.csproj b/MediaBrowser.Tests/MediaBrowser.Tests.csproj index d31615952..95ae25f93 100644 --- a/MediaBrowser.Tests/MediaBrowser.Tests.csproj +++ b/MediaBrowser.Tests/MediaBrowser.Tests.csproj @@ -80,6 +80,10 @@ {2E781478-814D-4A48-9D80-BFF206441A65} MediaBrowser.Server.Implementations + + {23499896-b135-4527-8574-c26e926ea99e} + MediaBrowser.XbmcMetadata + diff --git a/MediaBrowser.XbmcMetadata/MediaBrowser.XbmcMetadata.csproj b/MediaBrowser.XbmcMetadata/MediaBrowser.XbmcMetadata.csproj index a3928d774..972595b94 100644 --- a/MediaBrowser.XbmcMetadata/MediaBrowser.XbmcMetadata.csproj +++ b/MediaBrowser.XbmcMetadata/MediaBrowser.XbmcMetadata.csproj @@ -56,13 +56,13 @@ - - - - - - - + + + + + + + diff --git a/MediaBrowser.XbmcMetadata/Parsers/BaseNfoParser.cs b/MediaBrowser.XbmcMetadata/Parsers/BaseNfoParser.cs index 49851f42a..6e31b0178 100644 --- a/MediaBrowser.XbmcMetadata/Parsers/BaseNfoParser.cs +++ b/MediaBrowser.XbmcMetadata/Parsers/BaseNfoParser.cs @@ -11,6 +11,7 @@ using System.Linq; using System.Text; using System.Threading; using System.Xml; +using MediaBrowser.XbmcMetadata.Savers; namespace MediaBrowser.XbmcMetadata.Parsers { @@ -63,8 +64,7 @@ namespace MediaBrowser.XbmcMetadata.Parsers ValidationType = ValidationType.None }; - //Fetch(item, metadataFile, settings, Encoding.GetEncoding("ISO-8859-1"), cancellationToken); - Fetch(item, metadataFile, settings, Encoding.UTF8, cancellationToken); + Fetch(item, metadataFile, settings, cancellationToken); } /// @@ -73,11 +73,10 @@ namespace MediaBrowser.XbmcMetadata.Parsers /// The item. /// The metadata file. /// The settings. - /// The encoding. /// The cancellation token. - private void Fetch(T item, string metadataFile, XmlReaderSettings settings, Encoding encoding, CancellationToken cancellationToken) + private void Fetch(T item, string metadataFile, XmlReaderSettings settings, CancellationToken cancellationToken) { - using (var streamReader = new StreamReader(metadataFile)) + using (var streamReader = BaseNfoSaver.GetStreamReader(metadataFile)) { // Use XmlReader for best performance using (var reader = XmlReader.Create(streamReader, settings)) diff --git a/MediaBrowser.XbmcMetadata/Savers/AlbumNfoSaver.cs b/MediaBrowser.XbmcMetadata/Savers/AlbumNfoSaver.cs new file mode 100644 index 000000000..800cb8e10 --- /dev/null +++ b/MediaBrowser.XbmcMetadata/Savers/AlbumNfoSaver.cs @@ -0,0 +1,112 @@ +using MediaBrowser.Common.IO; +using MediaBrowser.Controller.Configuration; +using MediaBrowser.Controller.Entities; +using MediaBrowser.Controller.Entities.Audio; +using MediaBrowser.Controller.Library; +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Xml; + +namespace MediaBrowser.XbmcMetadata.Savers +{ + public class AlbumNfoSaver : BaseNfoSaver + { + public AlbumNfoSaver(IFileSystem fileSystem, IServerConfigurationManager configurationManager, ILibraryManager libraryManager, IUserManager userManager, IUserDataManager userDataManager) + : base(fileSystem, configurationManager, libraryManager, userManager, userDataManager) + { + } + + public override string GetSavePath(IHasMetadata item) + { + return Path.Combine(item.Path, "album.nfo"); + } + + protected override string GetRootElementName(IHasMetadata item) + { + return "album"; + } + + public override bool IsEnabledFor(IHasMetadata item, ItemUpdateType updateType) + { + if (!item.SupportsLocalMetadata) + { + return false; + } + + return item is MusicAlbum && updateType >= ItemUpdateType.MetadataDownload; + } + + protected override void WriteCustomElements(IHasMetadata item, XmlWriter writer) + { + var album = (MusicAlbum)item; + + var tracks = album.Tracks + .ToList(); + + var artists = tracks + .SelectMany(i => + { + var list = new List(); + + if (!string.IsNullOrEmpty(i.AlbumArtist)) + { + list.Add(i.AlbumArtist); + } + list.AddRange(i.Artists); + + return list; + }) + .Distinct(StringComparer.OrdinalIgnoreCase); + + foreach (var artist in artists) + { + writer.WriteElementString("artist", artist); + } + + AddTracks(tracks, writer); + } + + private static readonly CultureInfo UsCulture = new CultureInfo("en-US"); + + private void AddTracks(IEnumerable - /// The path. - /// The XML tags used. - /// System.String. - private static string GetCustomTags(string path, List xmlTagsUsed) - { - var settings = new XmlReaderSettings - { - CheckCharacters = false, - IgnoreProcessingInstructions = true, - IgnoreComments = true, - ValidationType = ValidationType.None - }; - - var builder = new StringBuilder(); - - using (var streamReader = new StreamReader(path, Encoding.UTF8)) - { - // Use XmlReader for best performance - using (var reader = XmlReader.Create(streamReader, settings)) - { - reader.MoveToContent(); - - // Loop through each element - while (reader.Read()) - { - if (reader.NodeType == XmlNodeType.Element) - { - var name = reader.Name; - - if (!CommonTags.ContainsKey(name) && !xmlTagsUsed.Contains(name, StringComparer.OrdinalIgnoreCase)) - { - builder.AppendLine(reader.ReadOuterXml()); - } - else - { - reader.Skip(); - } - } - } - } - } - - return builder.ToString(); - } - - public static void AddMediaInfo(T item, StringBuilder builder) - where T : BaseItem, IHasMediaSources - { - builder.Append(""); - builder.Append(""); - - foreach (var stream in item.GetMediaSources(false).First().MediaStreams) - { - builder.Append("<" + stream.Type.ToString().ToLower() + ">"); - - if (!string.IsNullOrEmpty(stream.Codec)) - { - builder.Append("" + SecurityElement.Escape(stream.Codec) + ""); - builder.Append("" + SecurityElement.Escape(stream.Codec) + ""); - } - - if (stream.BitRate.HasValue) - { - builder.Append("" + stream.BitRate.Value.ToString(UsCulture) + ""); - } - - if (stream.Width.HasValue) - { - builder.Append("" + stream.Width.Value.ToString(UsCulture) + ""); - } - - if (stream.Height.HasValue) - { - builder.Append("" + stream.Height.Value.ToString(UsCulture) + ""); - } - - if (!string.IsNullOrEmpty(stream.AspectRatio)) - { - builder.Append("" + SecurityElement.Escape(stream.AspectRatio) + ""); - builder.Append("" + SecurityElement.Escape(stream.AspectRatio) + ""); - } - - var framerate = stream.AverageFrameRate ?? stream.RealFrameRate; - - if (framerate.HasValue) - { - builder.Append("" + framerate.Value.ToString(UsCulture) + ""); - } - - if (!string.IsNullOrEmpty(stream.Language)) - { - builder.Append("" + SecurityElement.Escape(stream.Language) + ""); - } - - var scanType = stream.IsInterlaced ? "interlaced" : "progressive"; - if (!string.IsNullOrEmpty(scanType)) - { - builder.Append("" + SecurityElement.Escape(scanType) + ""); - } - - if (stream.Channels.HasValue) - { - builder.Append("" + stream.Channels.Value.ToString(UsCulture) + ""); - } - - if (stream.SampleRate.HasValue) - { - builder.Append("" + stream.SampleRate.Value.ToString(UsCulture) + ""); - } - - builder.Append("" + SecurityElement.Escape(stream.IsDefault.ToString()) + ""); - builder.Append("" + SecurityElement.Escape(stream.IsForced.ToString()) + ""); - - if (stream.Type == MediaStreamType.Video) - { - if (item.RunTimeTicks.HasValue) - { - var timespan = TimeSpan.FromTicks(item.RunTimeTicks.Value); - - builder.Append("" + Convert.ToInt32(timespan.TotalMinutes).ToString(UsCulture) + ""); - builder.Append("" + Convert.ToInt32(timespan.TotalSeconds).ToString(UsCulture) + ""); - } - - var video = item as Video; - - if (video != null) - { - //AddChapters(video, builder, itemRepository); - - if (video.Video3DFormat.HasValue) - { - switch (video.Video3DFormat.Value) - { - case Video3DFormat.FullSideBySide: - builder.Append("FSBS"); - break; - case Video3DFormat.FullTopAndBottom: - builder.Append("FTAB"); - break; - case Video3DFormat.HalfSideBySide: - builder.Append("HSBS"); - break; - case Video3DFormat.HalfTopAndBottom: - builder.Append("HTAB"); - break; - } - } - } - } - - builder.Append(""); - } - - builder.Append(""); - builder.Append(""); - } - - /// - /// Adds the common nodes. - /// - /// Task. - public static void AddCommonNodes(BaseItem item, StringBuilder builder, ILibraryManager libraryManager, IUserManager userManager, IUserDataManager userDataRepo, IFileSystem fileSystem, IServerConfigurationManager config) - { - var overview = (item.Overview ?? string.Empty) - .StripHtml() - .Replace(""", "'"); - - var options = config.GetNfoConfiguration(); - - if (item is MusicArtist) - { - builder.Append(""); - } - else if (item is MusicAlbum) - { - builder.Append(""); - } - else - { - builder.Append(""); - } - - var hasShortOverview = item as IHasShortOverview; - if (hasShortOverview != null) - { - var outline = (hasShortOverview.ShortOverview ?? string.Empty) - .StripHtml() - .Replace(""", "'"); - - builder.Append(""); - } - else - { - builder.Append(""); - } - - builder.Append("" + SecurityElement.Escape(item.CustomRating ?? string.Empty) + ""); - builder.Append("" + item.IsLocked.ToString().ToLower() + ""); - - if (item.LockedFields.Count > 0) - { - builder.Append("" + string.Join("|", item.LockedFields.Select(i => i.ToString()).ToArray()) + ""); - } - - if (!string.IsNullOrEmpty(item.DisplayMediaType)) - { - builder.Append("" + SecurityElement.Escape(item.DisplayMediaType) + ""); - } - - builder.Append("" + SecurityElement.Escape(item.DateCreated.ToString("yyyy-MM-dd HH:mm:ss")) + ""); - - builder.Append("" + SecurityElement.Escape(item.Name ?? string.Empty) + ""); - builder.Append("" + SecurityElement.Escape(item.Name ?? string.Empty) + ""); - - var directors = item.People - .Where(i => IsPersonType(i, PersonType.Director)) - .Select(i => i.Name) - .ToList(); - - foreach (var person in directors) - { - builder.Append("" + SecurityElement.Escape(person) + ""); - } - - var writers = item.People - .Where(i => IsPersonType(i, PersonType.Writer)) - .Select(i => i.Name) - .Distinct(StringComparer.OrdinalIgnoreCase) - .ToList(); - - foreach (var person in writers) - { - builder.Append("" + SecurityElement.Escape(person) + ""); - } - - foreach (var person in writers) - { - builder.Append("" + SecurityElement.Escape(person) + ""); - } - - var hasTrailer = item as IHasTrailers; - if (hasTrailer != null) - { - foreach (var trailer in hasTrailer.RemoteTrailers) - { - builder.Append("" + SecurityElement.Escape(GetOutputTrailerUrl(trailer.Url)) + ""); - } - } - - if (item.CommunityRating.HasValue) - { - builder.Append("" + SecurityElement.Escape(item.CommunityRating.Value.ToString(UsCulture)) + ""); - } - - if (item.ProductionYear.HasValue) - { - builder.Append("" + SecurityElement.Escape(item.ProductionYear.Value.ToString(UsCulture)) + ""); - } - - if (!string.IsNullOrEmpty(item.ForcedSortName)) - { - builder.Append("" + SecurityElement.Escape(item.ForcedSortName) + ""); - } - - if (!string.IsNullOrEmpty(item.OfficialRating)) - { - builder.Append("" + SecurityElement.Escape(item.OfficialRating) + ""); - } - - if (!string.IsNullOrEmpty(item.OfficialRatingDescription)) - { - builder.Append("" + SecurityElement.Escape(item.OfficialRatingDescription) + ""); - } - - var hasAspectRatio = item as IHasAspectRatio; - if (hasAspectRatio != null) - { - if (!string.IsNullOrEmpty(hasAspectRatio.AspectRatio)) - { - builder.Append("" + SecurityElement.Escape(hasAspectRatio.AspectRatio) + ""); - } - } - - if (!string.IsNullOrEmpty(item.HomePageUrl)) - { - builder.Append("" + SecurityElement.Escape(item.HomePageUrl) + ""); - } - - var rt = item.GetProviderId(MetadataProviders.RottenTomatoes); - - if (!string.IsNullOrEmpty(rt)) - { - builder.Append("" + SecurityElement.Escape(rt) + ""); - } - - var tmdbCollection = item.GetProviderId(MetadataProviders.TmdbCollection); - - if (!string.IsNullOrEmpty(tmdbCollection)) - { - builder.Append("" + SecurityElement.Escape(tmdbCollection) + ""); - } - - var imdb = item.GetProviderId(MetadataProviders.Imdb); - if (!string.IsNullOrEmpty(imdb)) - { - if (item is Series) - { - builder.Append("" + SecurityElement.Escape(imdb) + ""); - } - else - { - builder.Append("" + SecurityElement.Escape(imdb) + ""); - } - } - - // Series xml saver already saves this - if (!(item is Series)) - { - var tvdb = item.GetProviderId(MetadataProviders.Tvdb); - if (!string.IsNullOrEmpty(tvdb)) - { - builder.Append("" + SecurityElement.Escape(tvdb) + ""); - } - } - - var tmdb = item.GetProviderId(MetadataProviders.Tmdb); - if (!string.IsNullOrEmpty(tmdb)) - { - builder.Append("" + SecurityElement.Escape(tmdb) + ""); - } - - var tvcom = item.GetProviderId(MetadataProviders.Tvcom); - if (!string.IsNullOrEmpty(tvcom)) - { - builder.Append("" + SecurityElement.Escape(tvcom) + ""); - } - - var hasLanguage = item as IHasPreferredMetadataLanguage; - if (hasLanguage != null) - { - if (!string.IsNullOrEmpty(hasLanguage.PreferredMetadataLanguage)) - { - builder.Append("" + SecurityElement.Escape(hasLanguage.PreferredMetadataLanguage) + ""); - } - } - - if (item.PremiereDate.HasValue && !(item is Episode)) - { - var formatString = options.ReleaseDateFormat; - - if (item is MusicArtist) - { - builder.Append("" + SecurityElement.Escape(item.PremiereDate.Value.ToString(formatString)) + ""); - } - else - { - builder.Append("" + SecurityElement.Escape(item.PremiereDate.Value.ToString(formatString)) + ""); - builder.Append("" + SecurityElement.Escape(item.PremiereDate.Value.ToString(formatString)) + ""); - } - } - - if (item.EndDate.HasValue) - { - if (!(item is Episode)) - { - var formatString = options.ReleaseDateFormat; - - builder.Append("" + SecurityElement.Escape(item.EndDate.Value.ToString(formatString)) + ""); - } - } - - var hasCriticRating = item as IHasCriticRating; - - if (hasCriticRating != null) - { - if (hasCriticRating.CriticRating.HasValue) - { - builder.Append("" + SecurityElement.Escape(hasCriticRating.CriticRating.Value.ToString(UsCulture)) + ""); - } - - if (!string.IsNullOrEmpty(hasCriticRating.CriticRatingSummary)) - { - builder.Append(""); - } - } - - var hasDisplayOrder = item as IHasDisplayOrder; - - if (hasDisplayOrder != null) - { - if (!string.IsNullOrEmpty(hasDisplayOrder.DisplayOrder)) - { - builder.Append("" + SecurityElement.Escape(hasDisplayOrder.DisplayOrder) + ""); - } - } - - if (item.VoteCount.HasValue) - { - builder.Append("" + SecurityElement.Escape(item.VoteCount.Value.ToString(UsCulture)) + ""); - } - - var hasBudget = item as IHasBudget; - if (hasBudget != null) - { - if (hasBudget.Budget.HasValue) - { - builder.Append("" + SecurityElement.Escape(hasBudget.Budget.Value.ToString(UsCulture)) + ""); - } - - if (hasBudget.Revenue.HasValue) - { - builder.Append("" + SecurityElement.Escape(hasBudget.Revenue.Value.ToString(UsCulture)) + ""); - } - } - - var hasMetascore = item as IHasMetascore; - if (hasMetascore != null && hasMetascore.Metascore.HasValue) - { - builder.Append("" + SecurityElement.Escape(hasMetascore.Metascore.Value.ToString(UsCulture)) + ""); - } - - // Use original runtime here, actual file runtime later in MediaInfo - var runTimeTicks = item.RunTimeTicks; - - if (runTimeTicks.HasValue) - { - var timespan = TimeSpan.FromTicks(runTimeTicks.Value); - - builder.Append("" + Convert.ToInt32(timespan.TotalMinutes).ToString(UsCulture) + ""); - } - - var hasTaglines = item as IHasTaglines; - if (hasTaglines != null) - { - foreach (var tagline in hasTaglines.Taglines) - { - builder.Append("" + SecurityElement.Escape(tagline) + ""); - } - } - - var hasProductionLocations = item as IHasProductionLocations; - if (hasProductionLocations != null) - { - foreach (var country in hasProductionLocations.ProductionLocations) - { - builder.Append("" + SecurityElement.Escape(country) + ""); - } - } - - foreach (var genre in item.Genres) - { - builder.Append("" + SecurityElement.Escape(genre) + ""); - } - - foreach (var studio in item.Studios) - { - builder.Append("" + SecurityElement.Escape(studio) + ""); - } - - var hasTags = item as IHasTags; - if (hasTags != null) - { - foreach (var tag in hasTags.Tags) - { - if (item is MusicAlbum || item is MusicArtist) - { - builder.Append(""); - } - else - { - builder.Append("" + SecurityElement.Escape(tag) + ""); - } - } - } - - var hasKeywords = item as IHasKeywords; - if (hasKeywords != null) - { - foreach (var tag in hasKeywords.Keywords) - { - builder.Append("" + SecurityElement.Escape(tag) + ""); - } - } - - var hasAwards = item as IHasAwards; - if (hasAwards != null && !string.IsNullOrEmpty(hasAwards.AwardSummary)) - { - builder.Append("" + SecurityElement.Escape(hasAwards.AwardSummary) + ""); - } - - var externalId = item.GetProviderId(MetadataProviders.AudioDbArtist); - - if (!string.IsNullOrEmpty(externalId)) - { - builder.Append("" + SecurityElement.Escape(externalId) + ""); - } - - externalId = item.GetProviderId(MetadataProviders.AudioDbAlbum); - - if (!string.IsNullOrEmpty(externalId)) - { - builder.Append("" + SecurityElement.Escape(externalId) + ""); - } - - externalId = item.GetProviderId(MetadataProviders.Zap2It); - - if (!string.IsNullOrEmpty(externalId)) - { - builder.Append("" + SecurityElement.Escape(externalId) + ""); - } - - externalId = item.GetProviderId(MetadataProviders.MusicBrainzAlbum); - - if (!string.IsNullOrEmpty(externalId)) - { - builder.Append("" + SecurityElement.Escape(externalId) + ""); - } - - externalId = item.GetProviderId(MetadataProviders.MusicBrainzAlbumArtist); - - if (!string.IsNullOrEmpty(externalId)) - { - builder.Append("" + SecurityElement.Escape(externalId) + ""); - } - - externalId = item.GetProviderId(MetadataProviders.MusicBrainzArtist); - - if (!string.IsNullOrEmpty(externalId)) - { - builder.Append("" + SecurityElement.Escape(externalId) + ""); - } - - externalId = item.GetProviderId(MetadataProviders.MusicBrainzReleaseGroup); - - if (!string.IsNullOrEmpty(externalId)) - { - builder.Append("" + SecurityElement.Escape(externalId) + ""); - } - - externalId = item.GetProviderId(MetadataProviders.Gamesdb); - if (!string.IsNullOrEmpty(externalId)) - { - builder.Append("" + SecurityElement.Escape(externalId) + ""); - } - - externalId = item.GetProviderId(MetadataProviders.TvRage); - if (!string.IsNullOrEmpty(externalId)) - { - builder.Append("" + SecurityElement.Escape(externalId) + ""); - } - - if (options.SaveImagePathsInNfo) - { - AddImages(item, builder, fileSystem, config); - } - - AddUserData(item, builder, userManager, userDataRepo, options); - - AddActors(item, builder, libraryManager, fileSystem, config); - - var folder = item as BoxSet; - if (folder != null) - { - AddCollectionItems(folder, builder); - } - } - - public static void AddChapters(Video item, StringBuilder builder, IItemRepository repository) - { - var chapters = repository.GetChapters(item.Id); - - foreach (var chapter in chapters) - { - builder.Append(""); - builder.Append("" + SecurityElement.Escape(chapter.Name) + ""); - - var time = TimeSpan.FromTicks(chapter.StartPositionTicks); - var ms = Convert.ToInt64(time.TotalMilliseconds); - - builder.Append("" + SecurityElement.Escape(ms.ToString(UsCulture)) + ""); - builder.Append(""); - } - } - - public static void AddCollectionItems(Folder item, StringBuilder builder) - { - var items = item.LinkedChildren - .Where(i => i.Type == LinkedChildType.Manual && !string.IsNullOrWhiteSpace(i.ItemName)) - .ToList(); - - foreach (var link in items) - { - builder.Append(""); - - builder.Append("" + SecurityElement.Escape(link.ItemName) + ""); - builder.Append("" + SecurityElement.Escape(link.ItemType) + ""); - - if (link.ItemYear.HasValue) - { - builder.Append("" + SecurityElement.Escape(link.ItemYear.Value.ToString(UsCulture)) + ""); - } - - builder.Append(""); - } - } - - /// - /// Gets the output trailer URL. - /// - /// The URL. - /// System.String. - private static string GetOutputTrailerUrl(string url) - { - // This is what xbmc expects - - return url.Replace("http://www.youtube.com/watch?v=", - "plugin://plugin.video.youtube/?action=play_video&videoid=", - StringComparison.OrdinalIgnoreCase); - } - - private static void AddImages(BaseItem item, StringBuilder builder, IFileSystem fileSystem, IServerConfigurationManager config) - { - builder.Append(""); - - var poster = item.PrimaryImagePath; - - if (!string.IsNullOrEmpty(poster)) - { - builder.Append("" + SecurityElement.Escape(GetPathToSave(item.PrimaryImagePath, fileSystem, config)) + ""); - } - - foreach (var backdrop in item.GetImages(ImageType.Backdrop)) - { - builder.Append("" + SecurityElement.Escape(GetPathToSave(backdrop.Path, fileSystem, config)) + ""); - } - - builder.Append(""); - } - - private static void AddUserData(BaseItem item, StringBuilder builder, IUserManager userManager, IUserDataManager userDataRepo, XbmcMetadataOptions options) - { - var userId = options.UserId; - if (string.IsNullOrWhiteSpace(userId)) - { - return; - } - - var user = userManager.GetUserById(new Guid(userId)); - - if (user == null) - { - return; - } - - if (item.IsFolder) - { - return; - } - - var userdata = userDataRepo.GetUserData(user.Id, item.GetUserDataKey()); - - builder.Append("" + userdata.PlayCount.ToString(UsCulture) + ""); - builder.Append("" + userdata.Played.ToString().ToLower() + ""); - - if (userdata.LastPlayedDate.HasValue) - { - builder.Append("" + SecurityElement.Escape(userdata.LastPlayedDate.Value.ToString("yyyy-MM-dd HH:mm:ss")) + ""); - } - - builder.Append(""); - - var runTimeTicks = item.RunTimeTicks ?? 0; - - builder.Append("" + TimeSpan.FromTicks(userdata.PlaybackPositionTicks).TotalSeconds.ToString(UsCulture) + ""); - builder.Append("" + TimeSpan.FromTicks(runTimeTicks).TotalSeconds.ToString(UsCulture) + ""); - - builder.Append(""); - } - - public static void AddActors(BaseItem item, StringBuilder builder, ILibraryManager libraryManager, IFileSystem fileSystem, IServerConfigurationManager config) - { - var actors = item.People - .Where(i => !IsPersonType(i, PersonType.Director) && !IsPersonType(i, PersonType.Writer)) - .ToList(); - - foreach (var person in actors) - { - builder.Append(""); - builder.Append("" + SecurityElement.Escape(person.Name ?? string.Empty) + ""); - builder.Append("" + SecurityElement.Escape(person.Role ?? string.Empty) + ""); - builder.Append("" + SecurityElement.Escape(person.Type ?? string.Empty) + ""); - - if (person.SortOrder.HasValue) - { - builder.Append("" + SecurityElement.Escape(person.SortOrder.Value.ToString(UsCulture)) + ""); - } - - try - { - var personEntity = libraryManager.GetPerson(person.Name); - - if (!string.IsNullOrEmpty(personEntity.PrimaryImagePath)) - { - builder.Append("" + SecurityElement.Escape(GetPathToSave(personEntity.PrimaryImagePath, fileSystem, config)) + ""); - } - } - catch (Exception) - { - // Already logged in core - } - - builder.Append(""); - } - } - - private static bool IsPersonType(PersonInfo person, string type) - { - return string.Equals(person.Type, type, StringComparison.OrdinalIgnoreCase) || string.Equals(person.Role, type, StringComparison.OrdinalIgnoreCase); - } - - private static string GetPathToSave(string path, IFileSystem fileSystem, IServerConfigurationManager config) - { - foreach (var map in config.Configuration.PathSubstitutions) - { - path = fileSystem.SubstitutePath(path, map.From, map.To); - } - - return path; - } - - public static string ReplaceString(string str, string oldValue, string newValue, StringComparison comparison) - { - var sb = new StringBuilder(); - - int previousIndex = 0; - int index = str.IndexOf(oldValue, comparison); - while (index != -1) - { - sb.Append(str.Substring(previousIndex, index - previousIndex)); - sb.Append(newValue); - index += oldValue.Length; - - previousIndex = index; - index = str.IndexOf(oldValue, index, comparison); - } - sb.Append(str.Substring(previousIndex)); - - return sb.ToString(); - } - } -} -- cgit v1.2.3 From 37c27a26e90b7eff62cec9e2b6a6c003e79fcbe4 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Sat, 26 Jul 2014 13:30:15 -0400 Subject: added sync job database --- MediaBrowser.Api/Images/ImageByNameService.cs | 8 +- MediaBrowser.Api/Library/LibraryHelpers.cs | 2 +- MediaBrowser.Api/Sync/SyncService.cs | 67 +--- .../IO/CommonFileSystem.cs | 15 + MediaBrowser.Common/IO/IFileSystem.cs | 14 + MediaBrowser.Controller/Entities/BaseItem.cs | 8 +- MediaBrowser.Controller/Library/TVUtils.cs | 14 +- .../MediaBrowser.Controller.csproj | 1 + MediaBrowser.Controller/Sync/ISyncManager.cs | 22 +- MediaBrowser.Controller/Sync/ISyncRepository.cs | 58 +++ MediaBrowser.Dlna/Channels/DlnaChannelFactory.cs | 112 +++++- .../ContentDirectory/ContentDirectoryBrowser.cs | 126 ++++++ MediaBrowser.Dlna/DlnaManager.cs | 2 +- MediaBrowser.Dlna/MediaBrowser.Dlna.csproj | 1 + MediaBrowser.Dlna/PlayTo/Device.cs | 4 +- .../Images/CollectionFolderImageProvider.cs | 12 +- .../Images/EpisodeLocalImageProvider.cs | 14 +- .../Images/ImagesByNameImageProvider.cs | 2 +- .../Images/InternalMetadataFolderImageProvider.cs | 11 +- .../Images/LocalImageProvider.cs | 27 +- .../Providers/GameXmlProvider.cs | 2 +- .../Providers/MovieXmlProvider.cs | 10 +- .../MediaBrowser.Model.Portable.csproj | 12 +- .../MediaBrowser.Model.net35.csproj | 12 +- MediaBrowser.Model/MediaBrowser.Model.csproj | 4 +- MediaBrowser.Model/Sync/SyncJob.cs | 80 +++- MediaBrowser.Model/Sync/SyncJobCreationResult.cs | 8 + MediaBrowser.Model/Sync/SyncJobItem.cs | 48 +++ MediaBrowser.Model/Sync/SyncJobQuery.cs | 10 + MediaBrowser.Model/Sync/SyncJobRequest.cs | 32 +- MediaBrowser.Model/Sync/SyncJobStatus.cs | 28 +- MediaBrowser.Model/Sync/SyncSchedule.cs | 12 - MediaBrowser.Model/Sync/SyncScheduleQuery.cs | 7 - .../BoxSets/MovieDbBoxSetProvider.cs | 6 - MediaBrowser.Providers/Manager/ImageSaver.cs | 10 +- .../MediaInfo/FFProbeProvider.cs | 2 +- .../MediaInfo/FFProbeVideoInfo.cs | 6 +- .../MediaInfo/SubtitleResolver.cs | 19 +- MediaBrowser.Providers/Movies/MovieDbProvider.cs | 2 +- .../Subtitles/SubtitleManager.cs | 2 +- .../FileOrganization/EpisodeFileOrganizer.cs | 6 +- .../HttpServer/HttpListenerHost.cs | 14 +- .../HttpServer/NetListener/HttpListenerServer.cs | 18 +- .../SocketSharp/WebSocketSharpListener.cs | 21 +- .../Library/CoreResolutionIgnoreRule.cs | 2 +- .../Library/LibraryManager.cs | 17 +- .../Library/Resolvers/Audio/MusicAlbumResolver.cs | 43 ++- .../Library/Resolvers/Audio/MusicArtistResolver.cs | 15 +- .../Library/Resolvers/FolderResolver.cs | 12 +- .../Library/Resolvers/LocalTrailerResolver.cs | 12 +- .../Library/Resolvers/Movies/MovieResolver.cs | 7 +- .../Library/Resolvers/TV/SeriesResolver.cs | 12 +- .../Library/UserManager.cs | 2 +- .../Localization/JavaScript/es_MX.json | 8 +- .../Localization/JavaScript/fr.json | 2 +- .../Localization/JavaScript/nl.json | 14 +- .../Localization/JavaScript/pt_BR.json | 4 +- .../Localization/JavaScript/ru.json | 4 +- .../Localization/LocalizationManager.cs | 4 +- .../Localization/Server/ar.json | 12 +- .../Localization/Server/ca.json | 12 +- .../Localization/Server/cs.json | 12 +- .../Localization/Server/da.json | 12 +- .../Localization/Server/de.json | 12 +- .../Localization/Server/el.json | 12 +- .../Localization/Server/en_GB.json | 12 +- .../Localization/Server/en_US.json | 12 +- .../Localization/Server/es.json | 4 +- .../Localization/Server/es_MX.json | 28 +- .../Localization/Server/fr.json | 8 +- .../Localization/Server/he.json | 12 +- .../Localization/Server/it.json | 4 +- .../Localization/Server/kk.json | 4 +- .../Localization/Server/ko.json | 12 +- .../Localization/Server/ms.json | 12 +- .../Localization/Server/nb.json | 12 +- .../Localization/Server/nl.json | 48 +-- .../Localization/Server/pl.json | 12 +- .../Localization/Server/pt_BR.json | 26 +- .../Localization/Server/pt_PT.json | 12 +- .../Localization/Server/ru.json | 18 +- .../Localization/Server/server.json | 24 +- .../Localization/Server/sv.json | 4 +- .../Localization/Server/vi.json | 12 +- .../Localization/Server/zh_TW.json | 12 +- .../MediaBrowser.Server.Implementations.csproj | 5 +- .../Sync/SyncManager.cs | 150 ++++++- .../Sync/SyncRepository.cs | 429 +++++++++++++++++++++ .../packages.config | 2 +- MediaBrowser.ServerApplication/ApplicationHost.cs | 15 +- .../FFMpeg/FFMpegDownloader.cs | 2 +- MediaBrowser.Tests/Resolvers/MovieResolverTests.cs | 2 + MediaBrowser.WebDashboard/Api/DashboardService.cs | 2 + .../MediaBrowser.WebDashboard.csproj | 12 + MediaBrowser.XbmcMetadata/Images/XbmcImageSaver.cs | 2 +- .../Providers/BaseVideoNfoProvider.cs | 6 +- MediaBrowser.XbmcMetadata/Savers/MovieNfoSaver.cs | 6 +- 97 files changed, 1537 insertions(+), 505 deletions(-) create mode 100644 MediaBrowser.Controller/Sync/ISyncRepository.cs create mode 100644 MediaBrowser.Dlna/ContentDirectory/ContentDirectoryBrowser.cs create mode 100644 MediaBrowser.Model/Sync/SyncJobCreationResult.cs create mode 100644 MediaBrowser.Model/Sync/SyncJobItem.cs delete mode 100644 MediaBrowser.Model/Sync/SyncSchedule.cs delete mode 100644 MediaBrowser.Model/Sync/SyncScheduleQuery.cs create mode 100644 MediaBrowser.Server.Implementations/Sync/SyncRepository.cs (limited to 'MediaBrowser.Server.Implementations/Localization/LocalizationManager.cs') diff --git a/MediaBrowser.Api/Images/ImageByNameService.cs b/MediaBrowser.Api/Images/ImageByNameService.cs index d40762964..99d2f144b 100644 --- a/MediaBrowser.Api/Images/ImageByNameService.cs +++ b/MediaBrowser.Api/Images/ImageByNameService.cs @@ -1,4 +1,5 @@ using MediaBrowser.Common.Extensions; +using MediaBrowser.Common.IO; using MediaBrowser.Controller; using MediaBrowser.Controller.Entities; using MediaBrowser.Model.Dto; @@ -100,13 +101,16 @@ namespace MediaBrowser.Api.Images /// private readonly IServerApplicationPaths _appPaths; + private readonly IFileSystem _fileSystem; + /// /// Initializes a new instance of the class. /// /// The app paths. - public ImageByNameService(IServerApplicationPaths appPaths) + public ImageByNameService(IServerApplicationPaths appPaths, IFileSystem fileSystem) { _appPaths = appPaths; + _fileSystem = fileSystem; } public object Get(GetMediaInfoImages request) @@ -133,7 +137,7 @@ namespace MediaBrowser.Api.Images .Where(i => BaseItem.SupportedImageExtensions.Contains(i.Extension, StringComparer.Ordinal)) .Select(i => new ImageByNameInfo { - Name = Path.GetFileNameWithoutExtension(i.FullName), + Name = _fileSystem.GetFileNameWithoutExtension(i), FileLength = i.Length, // For themeable images, use the Theme property diff --git a/MediaBrowser.Api/Library/LibraryHelpers.cs b/MediaBrowser.Api/Library/LibraryHelpers.cs index be9f00a61..e21dc4a73 100644 --- a/MediaBrowser.Api/Library/LibraryHelpers.cs +++ b/MediaBrowser.Api/Library/LibraryHelpers.cs @@ -65,7 +65,7 @@ namespace MediaBrowser.Api.Library var rootFolderPath = appPaths.DefaultUserViewsPath; var virtualFolderPath = Path.Combine(rootFolderPath, virtualFolderName); - var shortcutFilename = Path.GetFileNameWithoutExtension(path); + var shortcutFilename = fileSystem.GetFileNameWithoutExtension(path); var lnk = Path.Combine(virtualFolderPath, shortcutFilename + ShortcutFileExtension); diff --git a/MediaBrowser.Api/Sync/SyncService.cs b/MediaBrowser.Api/Sync/SyncService.cs index 929d0a463..e0dc07cdc 100644 --- a/MediaBrowser.Api/Sync/SyncService.cs +++ b/MediaBrowser.Api/Sync/SyncService.cs @@ -15,13 +15,6 @@ namespace MediaBrowser.Api.Sync public string Id { get; set; } } - [Route("/Sync/Schedules/{Id}", "DELETE", Summary = "Cancels a sync job.")] - public class CancelSyncSchedule : IReturnVoid - { - [ApiMember(Name = "Id", Description = "Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "GET")] - public string Id { get; set; } - } - [Route("/Sync/Jobs/{Id}", "GET", Summary = "Gets a sync job.")] public class GetSyncJob : IReturn { @@ -29,25 +22,26 @@ namespace MediaBrowser.Api.Sync public string Id { get; set; } } - [Route("/Sync/Schedules/{Id}", "GET", Summary = "Gets a sync job.")] - public class GetSyncSchedule : IReturn - { - [ApiMember(Name = "Id", Description = "Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "GET")] - public string Id { get; set; } - } - [Route("/Sync/Jobs", "GET", Summary = "Gets sync jobs.")] public class GetSyncJobs : IReturn> { - } - - [Route("/Sync/Schedules", "GET", Summary = "Gets sync schedules.")] - public class GetSyncSchedules : IReturn> - { + /// + /// Skips over a given number of items within the results. Use for paging. + /// + /// The start index. + [ApiMember(Name = "StartIndex", Description = "Optional. The record index to start at. All items with a lower index will be dropped from the results.", IsRequired = false, DataType = "int", ParameterType = "query", Verb = "GET")] + public int? StartIndex { get; set; } + + /// + /// The maximum number of items to return + /// + /// The limit. + [ApiMember(Name = "Limit", Description = "Optional. The maximum number of records to return", IsRequired = false, DataType = "int", ParameterType = "query", Verb = "GET")] + public int? Limit { get; set; } } [Route("/Sync/Jobs", "POST", Summary = "Gets sync jobs.")] - public class CreateSyncJob : SyncJobRequest + public class CreateSyncJob : SyncJobRequest, IReturn { } @@ -79,22 +73,13 @@ namespace MediaBrowser.Api.Sync { var result = _syncManager.GetJobs(new SyncJobQuery { - + StartIndex = request.StartIndex, + Limit = request.Limit }); return ToOptimizedResult(result); } - public object Get(GetSyncSchedules request) - { - var result = _syncManager.GetSchedules(new SyncScheduleQuery - { - - }); - - return ToOptimizedResult(result); - } - public object Get(GetSyncJob request) { var result = _syncManager.GetJob(request.Id); @@ -102,13 +87,6 @@ namespace MediaBrowser.Api.Sync return ToOptimizedResult(result); } - public object Get(GetSyncSchedule request) - { - var result = _syncManager.GetSchedule(request.Id); - - return ToOptimizedResult(result); - } - public void Delete(CancelSyncJob request) { var task = _syncManager.CancelJob(request.Id); @@ -116,18 +94,11 @@ namespace MediaBrowser.Api.Sync Task.WaitAll(task); } - public void Delete(CancelSyncSchedule request) + public object Post(CreateSyncJob request) { - var task = _syncManager.CancelSchedule(request.Id); + var result = _syncManager.CreateJob(request); - Task.WaitAll(task); - } - - public void Post(CreateSyncJob request) - { - var task = _syncManager.CreateJob(request); - - Task.WaitAll(task); + return ToOptimizedResult(result); } } } diff --git a/MediaBrowser.Common.Implementations/IO/CommonFileSystem.cs b/MediaBrowser.Common.Implementations/IO/CommonFileSystem.cs index dfe93c5c9..2d67ec975 100644 --- a/MediaBrowser.Common.Implementations/IO/CommonFileSystem.cs +++ b/MediaBrowser.Common.Implementations/IO/CommonFileSystem.cs @@ -367,5 +367,20 @@ namespace MediaBrowser.Common.Implementations.IO return newPath; } + + public string GetFileNameWithoutExtension(FileSystemInfo info) + { + if (info is DirectoryInfo) + { + return info.Name; + } + + return Path.GetFileNameWithoutExtension(info.FullName); + } + + public string GetFileNameWithoutExtension(string path) + { + return Path.GetFileNameWithoutExtension(path); + } } } diff --git a/MediaBrowser.Common/IO/IFileSystem.cs b/MediaBrowser.Common/IO/IFileSystem.cs index de9b7e88a..27307a0e9 100644 --- a/MediaBrowser.Common/IO/IFileSystem.cs +++ b/MediaBrowser.Common/IO/IFileSystem.cs @@ -112,5 +112,19 @@ namespace MediaBrowser.Common.IO /// To. /// System.String. string SubstitutePath(string path, string from, string to); + + /// + /// Gets the file name without extension. + /// + /// The information. + /// System.String. + string GetFileNameWithoutExtension(FileSystemInfo info); + + /// + /// Gets the file name without extension. + /// + /// The path. + /// System.String. + string GetFileNameWithoutExtension(string path); } } diff --git a/MediaBrowser.Controller/Entities/BaseItem.cs b/MediaBrowser.Controller/Entities/BaseItem.cs index b891bcfb2..2bdbab084 100644 --- a/MediaBrowser.Controller/Entities/BaseItem.cs +++ b/MediaBrowser.Controller/Entities/BaseItem.cs @@ -529,10 +529,10 @@ namespace MediaBrowser.Controller.Entities .Where(i => string.Equals(i.Name, TrailerFolderName, StringComparison.OrdinalIgnoreCase)) .SelectMany(i => i.EnumerateFiles("*", SearchOption.TopDirectoryOnly)) .ToList(); - + // Support plex/xbmc convention files.AddRange(fileSystemChildren.OfType() - .Where(i => System.IO.Path.GetFileNameWithoutExtension(i.Name).EndsWith(XbmcTrailerFileSuffix, StringComparison.OrdinalIgnoreCase) && !string.Equals(Path, i.FullName, StringComparison.OrdinalIgnoreCase)) + .Where(i => FileSystem.GetFileNameWithoutExtension(i).EndsWith(XbmcTrailerFileSuffix, StringComparison.OrdinalIgnoreCase) && !string.Equals(Path, i.FullName, StringComparison.OrdinalIgnoreCase)) ); return LibraryManager.ResolvePaths(files, directoryService, null).Select(video => @@ -564,7 +564,7 @@ namespace MediaBrowser.Controller.Entities // Support plex/xbmc convention files.AddRange(fileSystemChildren.OfType() - .Where(i => string.Equals(System.IO.Path.GetFileNameWithoutExtension(i.Name), ThemeSongFilename, StringComparison.OrdinalIgnoreCase)) + .Where(i => string.Equals(FileSystem.GetFileNameWithoutExtension(i), ThemeSongFilename, StringComparison.OrdinalIgnoreCase)) ); return LibraryManager.ResolvePaths(files, directoryService, null).Select(audio => @@ -1564,7 +1564,7 @@ namespace MediaBrowser.Controller.Entities if (string.IsNullOrEmpty(Name) && !string.IsNullOrEmpty(Path)) { - Name = System.IO.Path.GetFileNameWithoutExtension(Path); + Name = FileSystem.GetFileNameWithoutExtension(Path); hasChanges = true; } diff --git a/MediaBrowser.Controller/Library/TVUtils.cs b/MediaBrowser.Controller/Library/TVUtils.cs index af0ff8319..86699272e 100644 --- a/MediaBrowser.Controller/Library/TVUtils.cs +++ b/MediaBrowser.Controller/Library/TVUtils.cs @@ -1,4 +1,5 @@ -using MediaBrowser.Controller.Entities; +using MediaBrowser.Common.IO; +using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Providers; using MediaBrowser.Controller.Resolvers; using System; @@ -189,11 +190,14 @@ namespace MediaBrowser.Controller.Library /// /// The path. /// The directory service. + /// The file system. /// true if [is season folder] [the specified path]; otherwise, false. - private static bool IsSeasonFolder(string path, IDirectoryService directoryService) + private static bool IsSeasonFolder(string path, IDirectoryService directoryService, IFileSystem fileSystem) { // It's a season folder if it's named as such and does not contain any audio files, apart from theme.mp3 - return GetSeasonNumberFromPath(path) != null && !directoryService.GetFiles(path).Any(i => EntityResolutionHelper.IsAudioFile(i.FullName) && !string.Equals(Path.GetFileNameWithoutExtension(i.FullName), BaseItem.ThemeSongFilename)); + return GetSeasonNumberFromPath(path) != null && + !directoryService.GetFiles(path) + .Any(i => EntityResolutionHelper.IsAudioFile(i.FullName) && !string.Equals(fileSystem.GetFileNameWithoutExtension(i), BaseItem.ThemeSongFilename)); } /// @@ -204,7 +208,7 @@ namespace MediaBrowser.Controller.Library /// The file system children. /// The directory service. /// true if [is series folder] [the specified path]; otherwise, false. - public static bool IsSeriesFolder(string path, bool considerSeasonlessSeries, IEnumerable fileSystemChildren, IDirectoryService directoryService) + public static bool IsSeriesFolder(string path, bool considerSeasonlessSeries, IEnumerable fileSystemChildren, IDirectoryService directoryService, IFileSystem fileSystem) { // A folder with more than 3 non-season folders in will not becounted as a series var nonSeriesFolders = 0; @@ -225,7 +229,7 @@ namespace MediaBrowser.Controller.Library if ((attributes & FileAttributes.Directory) == FileAttributes.Directory) { - if (IsSeasonFolder(child.FullName, directoryService)) + if (IsSeasonFolder(child.FullName, directoryService, fileSystem)) { return true; } diff --git a/MediaBrowser.Controller/MediaBrowser.Controller.csproj b/MediaBrowser.Controller/MediaBrowser.Controller.csproj index 5c3f10b54..aee118f9a 100644 --- a/MediaBrowser.Controller/MediaBrowser.Controller.csproj +++ b/MediaBrowser.Controller/MediaBrowser.Controller.csproj @@ -322,6 +322,7 @@ + diff --git a/MediaBrowser.Controller/Sync/ISyncManager.cs b/MediaBrowser.Controller/Sync/ISyncManager.cs index 714e71a1f..1d5ab7d3e 100644 --- a/MediaBrowser.Controller/Sync/ISyncManager.cs +++ b/MediaBrowser.Controller/Sync/ISyncManager.cs @@ -13,7 +13,7 @@ namespace MediaBrowser.Controller.Sync /// /// The request. /// Task. - Task> CreateJob(SyncJobRequest request); + Task CreateJob(SyncJobRequest request); /// /// Gets the jobs. @@ -21,25 +21,12 @@ namespace MediaBrowser.Controller.Sync /// QueryResult<SyncJob>. QueryResult GetJobs(SyncJobQuery query); - /// - /// Gets the schedules. - /// - /// QueryResult<SyncSchedule>. - QueryResult GetSchedules(SyncScheduleQuery query); - /// /// Gets the job. /// /// The identifier. /// SyncJob. SyncJob GetJob(string id); - - /// - /// Gets the schedule. - /// - /// The identifier. - /// SyncSchedule. - SyncSchedule GetSchedule(string id); /// /// Cancels the job. @@ -48,13 +35,6 @@ namespace MediaBrowser.Controller.Sync /// Task. Task CancelJob(string id); - /// - /// Cancels the schedule. - /// - /// The identifier. - /// Task. - Task CancelSchedule(string id); - /// /// Adds the parts. /// diff --git a/MediaBrowser.Controller/Sync/ISyncRepository.cs b/MediaBrowser.Controller/Sync/ISyncRepository.cs new file mode 100644 index 000000000..9cce69bdc --- /dev/null +++ b/MediaBrowser.Controller/Sync/ISyncRepository.cs @@ -0,0 +1,58 @@ +using MediaBrowser.Model.Querying; +using MediaBrowser.Model.Sync; +using System.Threading.Tasks; + +namespace MediaBrowser.Controller.Sync +{ + public interface ISyncRepository + { + /// + /// Gets the job. + /// + /// The identifier. + /// SyncJob. + SyncJob GetJob(string id); + + /// + /// Creates the specified job. + /// + /// The job. + /// Task. + Task Create(SyncJob job); + + /// + /// Updates the specified job. + /// + /// The job. + /// Task. + Task Update(SyncJob job); + + /// + /// Gets the jobs. + /// + /// The query. + /// QueryResult<SyncJob>. + QueryResult GetJobs(SyncJobQuery query); + + /// + /// Gets the job item. + /// + /// The identifier. + /// SyncJobItem. + SyncJobItem GetJobItem(string id); + + /// + /// Creates the specified job item. + /// + /// The job item. + /// Task. + Task Create(SyncJobItem jobItem); + + /// + /// Updates the specified job item. + /// + /// The job item. + /// Task. + Task Update(SyncJobItem jobItem); + } +} diff --git a/MediaBrowser.Dlna/Channels/DlnaChannelFactory.cs b/MediaBrowser.Dlna/Channels/DlnaChannelFactory.cs index 230b5e145..fc5fd4061 100644 --- a/MediaBrowser.Dlna/Channels/DlnaChannelFactory.cs +++ b/MediaBrowser.Dlna/Channels/DlnaChannelFactory.cs @@ -1,7 +1,9 @@ -using MediaBrowser.Common.Net; +using MediaBrowser.Common.Extensions; +using MediaBrowser.Common.Net; using MediaBrowser.Controller.Channels; using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Providers; +using MediaBrowser.Dlna.ContentDirectory; using MediaBrowser.Dlna.PlayTo; using MediaBrowser.Dlna.Ssdp; using MediaBrowser.Model.Channels; @@ -20,7 +22,7 @@ namespace MediaBrowser.Dlna.Channels private readonly IServerConfigurationManager _config; private readonly ILogger _logger; private readonly IHttpClient _httpClient; - + private DeviceDiscovery _deviceDiscovery; private readonly SemaphoreSlim _syncLock = new SemaphoreSlim(1, 1); @@ -96,7 +98,7 @@ namespace MediaBrowser.Dlna.Channels } catch (Exception ex) { - + } finally { @@ -123,7 +125,7 @@ namespace MediaBrowser.Dlna.Channels } await _syncLock.WaitAsync().ConfigureAwait(false); - + try { var list = _servers.ToList(); @@ -163,7 +165,23 @@ namespace MediaBrowser.Dlna.Channels public IEnumerable GetChannels() { - return _servers.Select(i => new ServerChannel(i)).ToList(); + //if (_servers.Count > 0) + //{ + // var service = _servers[0].Properties.Services + // .FirstOrDefault(i => string.Equals(i.ServiceType, "urn:schemas-upnp-org:service:ContentDirectory:1", StringComparison.OrdinalIgnoreCase)); + + // var controlUrl = service == null ? null : (_servers[0].Properties.BaseUrl.TrimEnd('/') + "/" + service.ControlUrl.TrimStart('/')); + + // if (!string.IsNullOrEmpty(controlUrl)) + // { + // return new List + // { + // new ServerChannel(_servers.ToList(), _httpClient, _logger, controlUrl) + // }; + // } + //} + + return new List(); } public void Dispose() @@ -178,31 +196,37 @@ namespace MediaBrowser.Dlna.Channels public class ServerChannel : IChannel, IFactoryChannel { - private readonly Device _device; + private readonly List _servers = new List(); + private readonly IHttpClient _httpClient; + private readonly ILogger _logger; + private readonly string _controlUrl; - public ServerChannel(Device device) + public ServerChannel(List servers, IHttpClient httpClient, ILogger logger, string controlUrl) { - _device = device; + _servers = servers; + _httpClient = httpClient; + _logger = logger; + _controlUrl = controlUrl; } public string Name { - get { return _device.Properties.Name; } + get { return "Devices"; } } public string Description { - get { return _device.Properties.ModelDescription; } + get { return string.Empty; } } public string DataVersion { - get { return "1"; } + get { return DateTime.UtcNow.Ticks.ToString(); } } public string HomePageUrl { - get { return _device.Properties.ModelUrl; } + get { return string.Empty; } } public ChannelParentalRating ParentalRating @@ -234,10 +258,68 @@ namespace MediaBrowser.Dlna.Channels return true; } - public Task GetChannelItems(InternalChannelItemQuery query, CancellationToken cancellationToken) + public async Task GetChannelItems(InternalChannelItemQuery query, CancellationToken cancellationToken) { - // TODO: Implement - return Task.FromResult(new ChannelItemResult()); + IEnumerable items; + + if (string.IsNullOrWhiteSpace(query.FolderId)) + { + items = _servers.Select(i => new ChannelItemInfo + { + FolderType = ChannelFolderType.Container, + Id = GetServerId(i), + Name = i.Properties.Name, + Overview = i.Properties.ModelDescription, + Type = ChannelItemType.Folder + }); + } + else + { + var idParts = query.FolderId.Split('|'); + var folderId = idParts.Length == 2 ? idParts[1] : null; + + var result = await new ContentDirectoryBrowser(_httpClient, _logger).Browse(new ContentDirectoryBrowseRequest + { + Limit = query.Limit, + StartIndex = query.StartIndex, + ParentId = folderId, + ContentDirectoryUrl = _controlUrl + + }, cancellationToken).ConfigureAwait(false); + + items = result.Items.ToList(); + } + + var list = items.ToList(); + var count = list.Count; + + list = ApplyPaging(list, query).ToList(); + + return new ChannelItemResult + { + Items = list, + TotalRecordCount = count + }; + } + + private string GetServerId(Device device) + { + return device.Properties.UUID.GetMD5().ToString("N"); + } + + private IEnumerable ApplyPaging(IEnumerable items, InternalChannelItemQuery query) + { + if (query.StartIndex.HasValue) + { + items = items.Skip(query.StartIndex.Value); + } + + if (query.Limit.HasValue) + { + items = items.Take(query.Limit.Value); + } + + return items; } public Task GetChannelImage(ImageType type, CancellationToken cancellationToken) diff --git a/MediaBrowser.Dlna/ContentDirectory/ContentDirectoryBrowser.cs b/MediaBrowser.Dlna/ContentDirectory/ContentDirectoryBrowser.cs new file mode 100644 index 000000000..0c62ada80 --- /dev/null +++ b/MediaBrowser.Dlna/ContentDirectory/ContentDirectoryBrowser.cs @@ -0,0 +1,126 @@ +using System.Linq; +using System.Xml.Linq; +using MediaBrowser.Common.Net; +using MediaBrowser.Controller.Channels; +using MediaBrowser.Dlna.PlayTo; +using MediaBrowser.Model.Logging; +using MediaBrowser.Model.Querying; +using System; +using System.Globalization; +using System.IO; +using System.Security; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + +namespace MediaBrowser.Dlna.ContentDirectory +{ + public class ContentDirectoryBrowser + { + private readonly IHttpClient _httpClient; + private readonly ILogger _logger; + + public ContentDirectoryBrowser(IHttpClient httpClient, ILogger logger) + { + _httpClient = httpClient; + _logger = logger; + } + + private static XNamespace UNamespace = "u"; + + public async Task> Browse(ContentDirectoryBrowseRequest request, CancellationToken cancellationToken) + { + var options = new HttpRequestOptions + { + CancellationToken = cancellationToken, + UserAgent = "Media Browser", + RequestContentType = "text/xml; charset=\"utf-8\"", + LogErrorResponseBody = true, + Url = request.ContentDirectoryUrl + }; + + options.RequestHeaders["SOAPACTION"] = "urn:schemas-upnp-org:service:ContentDirectory:1#Browse"; + + options.RequestContent = GetRequestBody(request); + + var response = await _httpClient.SendAsync(options, "POST"); + + using (var reader = new StreamReader(response.Content)) + { + var doc = XDocument.Parse(reader.ReadToEnd(), LoadOptions.PreserveWhitespace); + + var queryResult = new QueryResult(); + + if (doc.Document == null) + return queryResult; + + var responseElement = doc.Document.Descendants(UNamespace + "BrowseResponse").ToList(); + + var countElement = responseElement.Select(i => i.Element("TotalMatches")).FirstOrDefault(i => i != null); + var countValue = countElement == null ? null : countElement.Value; + + int count; + if (!string.IsNullOrWhiteSpace(countValue) && int.TryParse(countValue, NumberStyles.Integer, CultureInfo.InvariantCulture, out count)) + { + queryResult.TotalRecordCount = count; + + var resultElement = responseElement.Select(i => i.Element("Result")).FirstOrDefault(i => i != null); + var resultString = (string)resultElement; + + if (resultElement != null) + { + var xElement = XElement.Parse(resultString); + } + } + + return queryResult; + } + } + + private string GetRequestBody(ContentDirectoryBrowseRequest request) + { + var builder = new StringBuilder(); + + builder.Append(""); + + builder.Append(""); + builder.Append(""); + + if (string.IsNullOrWhiteSpace(request.ParentId)) + { + request.ParentId = "1"; + } + + builder.AppendFormat("{0}", SecurityElement.Escape(request.ParentId)); + builder.Append("BrowseDirectChildren"); + + //builder.Append("BrowseMetadata"); + + builder.Append("*"); + + request.StartIndex = request.StartIndex ?? 0; + builder.AppendFormat("{0}", SecurityElement.Escape(request.StartIndex.Value.ToString(CultureInfo.InvariantCulture))); + + request.Limit = request.Limit ?? 20; + if (request.Limit.HasValue) + { + builder.AppendFormat("{0}", SecurityElement.Escape(request.Limit.Value.ToString(CultureInfo.InvariantCulture))); + } + + builder.Append(""); + + builder.Append(""); + builder.Append(""); + + return builder.ToString(); + } + } + + public class ContentDirectoryBrowseRequest + { + public int? StartIndex { get; set; } + public int? Limit { get; set; } + public string ParentId { get; set; } + public string ContentDirectoryUrl { get; set; } + } +} diff --git a/MediaBrowser.Dlna/DlnaManager.cs b/MediaBrowser.Dlna/DlnaManager.cs index 333521bb5..29bd21407 100644 --- a/MediaBrowser.Dlna/DlnaManager.cs +++ b/MediaBrowser.Dlna/DlnaManager.cs @@ -372,7 +372,7 @@ namespace MediaBrowser.Dlna Info = new DeviceProfileInfo { Id = i.FullName.ToLower().GetMD5().ToString("N"), - Name = Path.GetFileNameWithoutExtension(i.FullName), + Name = _fileSystem.GetFileNameWithoutExtension(i), Type = type } }) diff --git a/MediaBrowser.Dlna/MediaBrowser.Dlna.csproj b/MediaBrowser.Dlna/MediaBrowser.Dlna.csproj index ec8527738..461470b7a 100644 --- a/MediaBrowser.Dlna/MediaBrowser.Dlna.csproj +++ b/MediaBrowser.Dlna/MediaBrowser.Dlna.csproj @@ -57,6 +57,7 @@ + diff --git a/MediaBrowser.Dlna/PlayTo/Device.cs b/MediaBrowser.Dlna/PlayTo/Device.cs index 0d7c450d6..85e18150e 100644 --- a/MediaBrowser.Dlna/PlayTo/Device.cs +++ b/MediaBrowser.Dlna/PlayTo/Device.cs @@ -819,12 +819,12 @@ namespace MediaBrowser.Dlna.PlayTo foreach (var services in document.Descendants(uPnpNamespaces.ud.GetName("serviceList"))) { if (services == null) - return null; + continue; var servicesList = services.Descendants(uPnpNamespaces.ud.GetName("service")); if (servicesList == null) - return null; + continue; foreach (var element in servicesList) { diff --git a/MediaBrowser.LocalMetadata/Images/CollectionFolderImageProvider.cs b/MediaBrowser.LocalMetadata/Images/CollectionFolderImageProvider.cs index 29fd76aa5..ccb2acd1d 100644 --- a/MediaBrowser.LocalMetadata/Images/CollectionFolderImageProvider.cs +++ b/MediaBrowser.LocalMetadata/Images/CollectionFolderImageProvider.cs @@ -1,11 +1,19 @@ -using System.Collections.Generic; +using MediaBrowser.Common.IO; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Providers; +using System.Collections.Generic; namespace MediaBrowser.LocalMetadata.Images { public class CollectionFolderLocalImageProvider : ILocalImageFileProvider, IHasOrder { + private readonly IFileSystem _fileSystem; + + public CollectionFolderLocalImageProvider(IFileSystem fileSystem) + { + _fileSystem = fileSystem; + } + public string Name { get { return "Collection Folder Images"; } @@ -29,7 +37,7 @@ namespace MediaBrowser.LocalMetadata.Images { var collectionFolder = (CollectionFolder)item; - return new LocalImageProvider().GetImages(item, collectionFolder.PhysicalLocations, directoryService); + return new LocalImageProvider(_fileSystem).GetImages(item, collectionFolder.PhysicalLocations, directoryService); } } } diff --git a/MediaBrowser.LocalMetadata/Images/EpisodeLocalImageProvider.cs b/MediaBrowser.LocalMetadata/Images/EpisodeLocalImageProvider.cs index f40020c84..cd9b78201 100644 --- a/MediaBrowser.LocalMetadata/Images/EpisodeLocalImageProvider.cs +++ b/MediaBrowser.LocalMetadata/Images/EpisodeLocalImageProvider.cs @@ -1,4 +1,5 @@ -using MediaBrowser.Controller.Entities; +using MediaBrowser.Common.IO; +using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities.TV; using MediaBrowser.Controller.Providers; using MediaBrowser.Model.Entities; @@ -11,6 +12,13 @@ namespace MediaBrowser.LocalMetadata.Images { public class EpisodeLocalLocalImageProvider : ILocalImageFileProvider { + private readonly IFileSystem _fileSystem; + + public EpisodeLocalLocalImageProvider(IFileSystem fileSystem) + { + _fileSystem = fileSystem; + } + public string Name { get { return "Local Images"; } @@ -27,7 +35,7 @@ namespace MediaBrowser.LocalMetadata.Images var parentPathFiles = directoryService.GetFileSystemEntries(parentPath); - var nameWithoutExtension = Path.GetFileNameWithoutExtension(item.Path); + var nameWithoutExtension = _fileSystem.GetFileNameWithoutExtension(item.Path); var files = GetFilesFromParentFolder(nameWithoutExtension, parentPathFiles); @@ -60,7 +68,7 @@ namespace MediaBrowser.LocalMetadata.Images if (BaseItem.SupportedImageExtensions.Contains(i.Extension, StringComparer.OrdinalIgnoreCase)) { - var currentNameWithoutExtension = Path.GetFileNameWithoutExtension(i.Name); + var currentNameWithoutExtension = _fileSystem.GetFileNameWithoutExtension(i); if (string.Equals(filenameWithoutExtension, currentNameWithoutExtension, StringComparison.OrdinalIgnoreCase)) { diff --git a/MediaBrowser.LocalMetadata/Images/ImagesByNameImageProvider.cs b/MediaBrowser.LocalMetadata/Images/ImagesByNameImageProvider.cs index 3f84df462..d992e2026 100644 --- a/MediaBrowser.LocalMetadata/Images/ImagesByNameImageProvider.cs +++ b/MediaBrowser.LocalMetadata/Images/ImagesByNameImageProvider.cs @@ -45,7 +45,7 @@ namespace MediaBrowser.LocalMetadata.Images try { - return new LocalImageProvider().GetImages(item, path, directoryService); + return new LocalImageProvider(_fileSystem).GetImages(item, path, directoryService); } catch (DirectoryNotFoundException) { diff --git a/MediaBrowser.LocalMetadata/Images/InternalMetadataFolderImageProvider.cs b/MediaBrowser.LocalMetadata/Images/InternalMetadataFolderImageProvider.cs index 8c4f6247c..c126af884 100644 --- a/MediaBrowser.LocalMetadata/Images/InternalMetadataFolderImageProvider.cs +++ b/MediaBrowser.LocalMetadata/Images/InternalMetadataFolderImageProvider.cs @@ -1,19 +1,22 @@ -using System.Collections.Generic; -using System.IO; +using MediaBrowser.Common.IO; using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities.Audio; using MediaBrowser.Controller.Providers; +using System.Collections.Generic; +using System.IO; namespace MediaBrowser.LocalMetadata.Images { public class InternalMetadataFolderImageProvider : ILocalImageFileProvider, IHasOrder { private readonly IServerConfigurationManager _config; + private readonly IFileSystem _fileSystem; - public InternalMetadataFolderImageProvider(IServerConfigurationManager config) + public InternalMetadataFolderImageProvider(IServerConfigurationManager config, IFileSystem fileSystem) { _config = config; + _fileSystem = fileSystem; } public string Name @@ -57,7 +60,7 @@ namespace MediaBrowser.LocalMetadata.Images try { - return new LocalImageProvider().GetImages(item, path, directoryService); + return new LocalImageProvider(_fileSystem).GetImages(item, path, directoryService); } catch (DirectoryNotFoundException) { diff --git a/MediaBrowser.LocalMetadata/Images/LocalImageProvider.cs b/MediaBrowser.LocalMetadata/Images/LocalImageProvider.cs index 5d7762823..f69c261d8 100644 --- a/MediaBrowser.LocalMetadata/Images/LocalImageProvider.cs +++ b/MediaBrowser.LocalMetadata/Images/LocalImageProvider.cs @@ -1,19 +1,27 @@ -using System; -using System.Collections.Generic; -using System.Globalization; -using System.IO; -using System.Linq; +using MediaBrowser.Common.IO; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities.Audio; using MediaBrowser.Controller.Entities.Movies; using MediaBrowser.Controller.Entities.TV; using MediaBrowser.Controller.Providers; using MediaBrowser.Model.Entities; +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Linq; namespace MediaBrowser.LocalMetadata.Images { public class LocalImageProvider : ILocalImageFileProvider { + private readonly IFileSystem _fileSystem; + + public LocalImageProvider(IFileSystem fileSystem) + { + _fileSystem = fileSystem; + } + public string Name { get { return "Local Images"; } @@ -117,7 +125,7 @@ namespace MediaBrowser.LocalMetadata.Images var baseItem = item as BaseItem; if (baseItem != null && baseItem.IsInMixedFolder) { - imagePrefix = Path.GetFileNameWithoutExtension(item.Path) + "-"; + imagePrefix = _fileSystem.GetFileNameWithoutExtension(item.Path) + "-"; } PopulatePrimaryImages(item, images, files, imagePrefix); @@ -172,7 +180,7 @@ namespace MediaBrowser.LocalMetadata.Images if (!string.IsNullOrEmpty(item.Path)) { - var name = Path.GetFileNameWithoutExtension(item.Path); + var name = _fileSystem.GetFileNameWithoutExtension(item.Path); if (!string.IsNullOrEmpty(name)) { @@ -188,7 +196,7 @@ namespace MediaBrowser.LocalMetadata.Images if (!string.IsNullOrEmpty(item.Path)) { - var name = Path.GetFileNameWithoutExtension(item.Path); + var name = _fileSystem.GetFileNameWithoutExtension(item.Path); if (!string.IsNullOrEmpty(name)) { @@ -259,6 +267,7 @@ namespace MediaBrowser.LocalMetadata.Images } private readonly CultureInfo _usCulture = new CultureInfo("en-US"); + private void PopulateSeasonImagesFromSeriesFolder(Season season, List images, IDirectoryService directoryService) { var seasonNumber = season.IndexNumber; @@ -316,7 +325,7 @@ namespace MediaBrowser.LocalMetadata.Images private FileSystemInfo GetImage(IEnumerable files, string name) { var candidates = files - .Where(i => string.Equals(name, Path.GetFileNameWithoutExtension(i.Name), StringComparison.OrdinalIgnoreCase)) + .Where(i => string.Equals(name, _fileSystem.GetFileNameWithoutExtension(i), StringComparison.OrdinalIgnoreCase)) .ToList(); return BaseItem.SupportedImageExtensions diff --git a/MediaBrowser.LocalMetadata/Providers/GameXmlProvider.cs b/MediaBrowser.LocalMetadata/Providers/GameXmlProvider.cs index 681706321..83ef6e424 100644 --- a/MediaBrowser.LocalMetadata/Providers/GameXmlProvider.cs +++ b/MediaBrowser.LocalMetadata/Providers/GameXmlProvider.cs @@ -36,7 +36,7 @@ namespace MediaBrowser.LocalMetadata.Providers var directoryPath = directoryInfo.FullName; - var specificFile = Path.Combine(directoryPath, Path.GetFileNameWithoutExtension(info.Path) + ".xml"); + var specificFile = Path.Combine(directoryPath, FileSystem.GetFileNameWithoutExtension(info.Path) + ".xml"); var file = new FileInfo(specificFile); diff --git a/MediaBrowser.LocalMetadata/Providers/MovieXmlProvider.cs b/MediaBrowser.LocalMetadata/Providers/MovieXmlProvider.cs index 6ba1912a5..fb3a01bf2 100644 --- a/MediaBrowser.LocalMetadata/Providers/MovieXmlProvider.cs +++ b/MediaBrowser.LocalMetadata/Providers/MovieXmlProvider.cs @@ -1,12 +1,12 @@ -using System.Collections.Generic; -using System.IO; -using System.Threading; -using MediaBrowser.Common.IO; +using MediaBrowser.Common.IO; using MediaBrowser.Controller.Entities.Movies; using MediaBrowser.Controller.Providers; using MediaBrowser.LocalMetadata.Parsers; using MediaBrowser.Model.Entities; using MediaBrowser.Model.Logging; +using System.Collections.Generic; +using System.IO; +using System.Threading; namespace MediaBrowser.LocalMetadata.Providers { @@ -47,7 +47,7 @@ namespace MediaBrowser.LocalMetadata.Providers var directoryPath = directoryInfo.FullName; - var specificFile = Path.Combine(directoryPath, Path.GetFileNameWithoutExtension(info.Path) + ".xml"); + var specificFile = Path.Combine(directoryPath, fileSystem.GetFileNameWithoutExtension(info.Path) + ".xml"); var file = new FileInfo(specificFile); diff --git a/MediaBrowser.Model.Portable/MediaBrowser.Model.Portable.csproj b/MediaBrowser.Model.Portable/MediaBrowser.Model.Portable.csproj index a892f8bf1..c397cdcd5 100644 --- a/MediaBrowser.Model.Portable/MediaBrowser.Model.Portable.csproj +++ b/MediaBrowser.Model.Portable/MediaBrowser.Model.Portable.csproj @@ -848,6 +848,12 @@ Sync\SyncJob.cs + + Sync\SyncJobCreationResult.cs + + + Sync\SyncJobItem.cs + Sync\SyncJobQuery.cs @@ -860,12 +866,6 @@ Sync\SyncQuality.cs - - Sync\SyncSchedule.cs - - - Sync\SyncScheduleQuery.cs - Sync\SyncTarget.cs diff --git a/MediaBrowser.Model.net35/MediaBrowser.Model.net35.csproj b/MediaBrowser.Model.net35/MediaBrowser.Model.net35.csproj index ab2a99109..1b74fcf51 100644 --- a/MediaBrowser.Model.net35/MediaBrowser.Model.net35.csproj +++ b/MediaBrowser.Model.net35/MediaBrowser.Model.net35.csproj @@ -805,6 +805,12 @@ Sync\SyncJob.cs + + Sync\SyncJobCreationResult.cs + + + Sync\SyncJobItem.cs + Sync\SyncJobQuery.cs @@ -817,12 +823,6 @@ Sync\SyncQuality.cs - - Sync\SyncSchedule.cs - - - Sync\SyncScheduleQuery.cs - Sync\SyncTarget.cs diff --git a/MediaBrowser.Model/MediaBrowser.Model.csproj b/MediaBrowser.Model/MediaBrowser.Model.csproj index 6cdd2b8f5..fd38ff723 100644 --- a/MediaBrowser.Model/MediaBrowser.Model.csproj +++ b/MediaBrowser.Model/MediaBrowser.Model.csproj @@ -297,12 +297,12 @@ + + - - diff --git a/MediaBrowser.Model/Sync/SyncJob.cs b/MediaBrowser.Model/Sync/SyncJob.cs index 74dd79497..f69fccae5 100644 --- a/MediaBrowser.Model/Sync/SyncJob.cs +++ b/MediaBrowser.Model/Sync/SyncJob.cs @@ -1,4 +1,6 @@ - +using System; +using System.Collections.Generic; + namespace MediaBrowser.Model.Sync { public class SyncJob @@ -14,39 +16,79 @@ namespace MediaBrowser.Model.Sync /// The device identifier. public string TargetId { get; set; } /// - /// Gets or sets the item identifier. - /// - /// The item identifier. - public string ItemId { get; set; } - /// /// Gets or sets the quality. /// /// The quality. public SyncQuality Quality { get; set; } /// + /// Gets or sets the current progress. + /// + /// The current progress. + public double? Progress { get; set; } + /// + /// Gets or sets the name. + /// + /// The name. + public string Name { get; set; } + /// /// Gets or sets the status. /// /// The status. - public SyncJobStatus Status { get; set; } + public SyncJobStatus Status { get; set; } /// - /// Gets or sets the current progress. + /// Gets or sets the user identifier. /// - /// The current progress. - public double? CurrentProgress { get; set; } + /// The user identifier. + public string UserId { get; set; } /// - /// Gets or sets the synchronize rule identifier. + /// Gets or sets a value indicating whether [unwatched only]. /// - /// The synchronize rule identifier. - public string SyncScheduleId { get; set; } + /// true if [unwatched only]; otherwise, false. + public bool UnwatchedOnly { get; set; } /// - /// Gets or sets the transcoded path. + /// Gets or sets the limit. /// - /// The transcoded path. - public string TranscodedPath { get; set; } + /// The limit. + public long? Limit { get; set; } /// - /// Gets or sets the name. + /// Gets or sets the type of the limit. /// - /// The name. - public string Name { get; set; } + /// The type of the limit. + public SyncLimitType? LimitType { get; set; } + /// + /// Gets or sets the requested item ids. + /// + /// The requested item ids. + public List RequestedItemIds { get; set; } + /// + /// Gets or sets a value indicating whether this instance is dynamic. + /// + /// true if this instance is dynamic; otherwise, false. + public bool IsDynamic { get; set; } + /// + /// Gets or sets the date created. + /// + /// The date created. + public DateTime DateCreated { get; set; } + /// + /// Gets or sets the date last modified. + /// + /// The date last modified. + public DateTime DateLastModified { get; set; } + /// + /// Gets or sets the item count. + /// + /// The item count. + public int ItemCount { get; set; } + + public string ParentName { get; set; } + public string PrimaryImageItemId { get; set; } + public string PrimaryImageTag { get; set; } + public double? PrimaryImageAspectRatio { get; set; } + + public SyncJob() + { + RequestedItemIds = new List(); + } } } diff --git a/MediaBrowser.Model/Sync/SyncJobCreationResult.cs b/MediaBrowser.Model/Sync/SyncJobCreationResult.cs new file mode 100644 index 000000000..797318b2a --- /dev/null +++ b/MediaBrowser.Model/Sync/SyncJobCreationResult.cs @@ -0,0 +1,8 @@ + +namespace MediaBrowser.Model.Sync +{ + public class SyncJobCreationResult + { + public SyncJob Job { get; set; } + } +} diff --git a/MediaBrowser.Model/Sync/SyncJobItem.cs b/MediaBrowser.Model/Sync/SyncJobItem.cs new file mode 100644 index 000000000..141546eb5 --- /dev/null +++ b/MediaBrowser.Model/Sync/SyncJobItem.cs @@ -0,0 +1,48 @@ + +namespace MediaBrowser.Model.Sync +{ + public class SyncJobItem + { + /// + /// Gets or sets the identifier. + /// + /// The identifier. + public string Id { get; set; } + + /// + /// Gets or sets the job identifier. + /// + /// The job identifier. + public string JobId { get; set; } + + /// + /// Gets or sets the item identifier. + /// + /// The item identifier. + public string ItemId { get; set; } + + /// + /// Gets or sets the target identifier. + /// + /// The target identifier. + public string TargetId { get; set; } + + /// + /// Gets or sets the output path. + /// + /// The output path. + public string OutputPath { get; set; } + + /// + /// Gets or sets the status. + /// + /// The status. + public SyncJobStatus Status { get; set; } + + /// + /// Gets or sets the current progress. + /// + /// The current progress. + public double? CurrentProgress { get; set; } + } +} diff --git a/MediaBrowser.Model/Sync/SyncJobQuery.cs b/MediaBrowser.Model/Sync/SyncJobQuery.cs index f41544db9..74b35186e 100644 --- a/MediaBrowser.Model/Sync/SyncJobQuery.cs +++ b/MediaBrowser.Model/Sync/SyncJobQuery.cs @@ -3,5 +3,15 @@ namespace MediaBrowser.Model.Sync { public class SyncJobQuery { + /// + /// Gets or sets the start index. + /// + /// The start index. + public int? StartIndex { get; set; } + /// + /// Gets or sets the limit. + /// + /// The limit. + public int? Limit { get; set; } } } diff --git a/MediaBrowser.Model/Sync/SyncJobRequest.cs b/MediaBrowser.Model/Sync/SyncJobRequest.cs index cd833068e..7728aad9b 100644 --- a/MediaBrowser.Model/Sync/SyncJobRequest.cs +++ b/MediaBrowser.Model/Sync/SyncJobRequest.cs @@ -5,10 +5,10 @@ namespace MediaBrowser.Model.Sync public class SyncJobRequest { /// - /// Gets or sets the device identifier. + /// Gets or sets the target identifier. /// - /// The device identifier. - public List TargetIds { get; set; } + /// The target identifier. + public string TargetId { get; set; } /// /// Gets or sets the item ids. /// @@ -24,11 +24,35 @@ namespace MediaBrowser.Model.Sync /// /// The name. public string Name { get; set; } + /// + /// Gets or sets the user identifier. + /// + /// The user identifier. + public string UserId { get; set; } + /// + /// Gets or sets a value indicating whether [unwatched only]. + /// + /// true if [unwatched only]; otherwise, false. + public bool UnwatchedOnly { get; set; } + /// + /// Gets or sets the limit. + /// + /// The limit. + public long? Limit { get; set; } + /// + /// Gets or sets the type of the limit. + /// + /// The type of the limit. + public SyncLimitType? LimitType { get; set; } public SyncJobRequest() { - TargetIds = new List(); ItemIds = new List(); } } + + public enum SyncLimitType + { + ItemCount = 0 + } } diff --git a/MediaBrowser.Model/Sync/SyncJobStatus.cs b/MediaBrowser.Model/Sync/SyncJobStatus.cs index 2a216fe04..ef4d8d7bf 100644 --- a/MediaBrowser.Model/Sync/SyncJobStatus.cs +++ b/MediaBrowser.Model/Sync/SyncJobStatus.cs @@ -3,33 +3,11 @@ namespace MediaBrowser.Model.Sync { public enum SyncJobStatus { - /// - /// The queued - /// Queued = 0, - /// - /// The transcoding - /// Transcoding = 1, - /// - /// The transcoding failed - /// TranscodingFailed = 2, - /// - /// The transcoding completed - /// - TranscodingCompleted = 3, - /// - /// The transfering - /// - Transfering = 4, - /// - /// The transfer failed - /// - TransferFailed = 4, - /// - /// The completed - /// - Completed = 6 + Transfering = 3, + Completed = 4, + Cancelled = 5 } } diff --git a/MediaBrowser.Model/Sync/SyncSchedule.cs b/MediaBrowser.Model/Sync/SyncSchedule.cs deleted file mode 100644 index 297cbd145..000000000 --- a/MediaBrowser.Model/Sync/SyncSchedule.cs +++ /dev/null @@ -1,12 +0,0 @@ - -namespace MediaBrowser.Model.Sync -{ - public class SyncSchedule - { - /// - /// Gets or sets the identifier. - /// - /// The identifier. - public string Id { get; set; } - } -} diff --git a/MediaBrowser.Model/Sync/SyncScheduleQuery.cs b/MediaBrowser.Model/Sync/SyncScheduleQuery.cs deleted file mode 100644 index b704a358c..000000000 --- a/MediaBrowser.Model/Sync/SyncScheduleQuery.cs +++ /dev/null @@ -1,7 +0,0 @@ - -namespace MediaBrowser.Model.Sync -{ - public class SyncScheduleQuery - { - } -} diff --git a/MediaBrowser.Providers/BoxSets/MovieDbBoxSetProvider.cs b/MediaBrowser.Providers/BoxSets/MovieDbBoxSetProvider.cs index cf7904e5c..e17a96a43 100644 --- a/MediaBrowser.Providers/BoxSets/MovieDbBoxSetProvider.cs +++ b/MediaBrowser.Providers/BoxSets/MovieDbBoxSetProvider.cs @@ -216,12 +216,6 @@ namespace MediaBrowser.Providers.BoxSets { mainResult = _json.DeserializeFromStream(json); } - - if (String.IsNullOrEmpty(mainResult.overview)) - { - _logger.Error("Unable to find information for (id:" + id + ")"); - return null; - } } } return mainResult; diff --git a/MediaBrowser.Providers/Manager/ImageSaver.cs b/MediaBrowser.Providers/Manager/ImageSaver.cs index 1b2e9fa6d..d7110c1ec 100644 --- a/MediaBrowser.Providers/Manager/ImageSaver.cs +++ b/MediaBrowser.Providers/Manager/ImageSaver.cs @@ -292,7 +292,7 @@ namespace MediaBrowser.Providers.Manager private string GetStandardSavePath(IHasImages item, ImageType type, int? imageIndex, string mimeType, bool saveLocally) { string filename; - + switch (type) { case ImageType.Art: @@ -305,7 +305,7 @@ namespace MediaBrowser.Providers.Manager filename = item is MusicAlbum ? "cdart" : "disc"; break; case ImageType.Primary: - filename = item is Episode ? Path.GetFileNameWithoutExtension(item.Path) : "folder"; + filename = item is Episode ? _fileSystem.GetFileNameWithoutExtension(item.Path) : "folder"; break; case ImageType.Backdrop: filename = GetBackdropSaveFilename(item.GetImages(type), "backdrop", "backdrop", imageIndex); @@ -367,7 +367,7 @@ namespace MediaBrowser.Providers.Manager return zeroIndexFilename; } - var filenames = images.Select(i => Path.GetFileNameWithoutExtension(i.Path)).ToList(); + var filenames = images.Select(i => _fileSystem.GetFileNameWithoutExtension(i.Path)).ToList(); var current = 1; while (filenames.Contains(numberedIndexPrefix + current.ToString(UsCulture), StringComparer.OrdinalIgnoreCase)) @@ -473,7 +473,7 @@ namespace MediaBrowser.Providers.Manager { var seasonFolder = Path.GetDirectoryName(item.Path); - var imageFilename = Path.GetFileNameWithoutExtension(item.Path) + "-thumb" + extension; + var imageFilename = _fileSystem.GetFileNameWithoutExtension(item.Path) + "-thumb" + extension; return new[] { Path.Combine(seasonFolder, imageFilename) }; } @@ -560,7 +560,7 @@ namespace MediaBrowser.Providers.Manager } var folder = Path.GetDirectoryName(item.Path); - return Path.Combine(folder, Path.GetFileNameWithoutExtension(item.Path) + "-" + imageFilename + extension); + return Path.Combine(folder, _fileSystem.GetFileNameWithoutExtension(item.Path) + "-" + imageFilename + extension); } } } diff --git a/MediaBrowser.Providers/MediaInfo/FFProbeProvider.cs b/MediaBrowser.Providers/MediaInfo/FFProbeProvider.cs index 9e9936cab..33b69d71a 100644 --- a/MediaBrowser.Providers/MediaInfo/FFProbeProvider.cs +++ b/MediaBrowser.Providers/MediaInfo/FFProbeProvider.cs @@ -175,7 +175,7 @@ namespace MediaBrowser.Providers.MediaInfo if (video != null && !video.IsPlaceHolder) { return !video.SubtitleFiles - .SequenceEqual(SubtitleResolver.GetSubtitleFiles(video, directoryService, false) + .SequenceEqual(SubtitleResolver.GetSubtitleFiles(video, directoryService, _fileSystem, false) .Select(i => i.FullName) .OrderBy(i => i), StringComparer.OrdinalIgnoreCase); } diff --git a/MediaBrowser.Providers/MediaInfo/FFProbeVideoInfo.cs b/MediaBrowser.Providers/MediaInfo/FFProbeVideoInfo.cs index c0313561a..a2e1ba05a 100644 --- a/MediaBrowser.Providers/MediaInfo/FFProbeVideoInfo.cs +++ b/MediaBrowser.Providers/MediaInfo/FFProbeVideoInfo.cs @@ -477,7 +477,7 @@ namespace MediaBrowser.Providers.MediaInfo MetadataRefreshOptions options, CancellationToken cancellationToken) { - var subtitleResolver = new SubtitleResolver(_localization); + var subtitleResolver = new SubtitleResolver(_localization, _fileSystem); var externalSubtitleStreams = subtitleResolver.GetExternalSubtitleStreams(video, currentStreams.Count, options.DirectoryService, false).ToList(); @@ -790,7 +790,7 @@ namespace MediaBrowser.Providers.MediaInfo // Assuming they're named "vts_05_01", take all files whose second part matches that of the first file if (files.Count > 0) { - var parts = Path.GetFileNameWithoutExtension(files[0].FullName).Split('_'); + var parts = _fileSystem.GetFileNameWithoutExtension(files[0]).Split('_'); if (parts.Length == 3) { @@ -798,7 +798,7 @@ namespace MediaBrowser.Providers.MediaInfo files = files.TakeWhile(f => { - var fileParts = Path.GetFileNameWithoutExtension(f.FullName).Split('_'); + var fileParts = _fileSystem.GetFileNameWithoutExtension(f).Split('_'); return fileParts.Length == 3 && string.Equals(title, fileParts[1], StringComparison.OrdinalIgnoreCase); diff --git a/MediaBrowser.Providers/MediaInfo/SubtitleResolver.cs b/MediaBrowser.Providers/MediaInfo/SubtitleResolver.cs index c12f74fa6..78d1fac47 100644 --- a/MediaBrowser.Providers/MediaInfo/SubtitleResolver.cs +++ b/MediaBrowser.Providers/MediaInfo/SubtitleResolver.cs @@ -1,4 +1,5 @@ using MediaBrowser.Common.Extensions; +using MediaBrowser.Common.IO; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Localization; using MediaBrowser.Controller.Providers; @@ -13,10 +14,12 @@ namespace MediaBrowser.Providers.MediaInfo public class SubtitleResolver { private readonly ILocalizationManager _localization; + private readonly IFileSystem _fileSystem; - public SubtitleResolver(ILocalizationManager localization) + public SubtitleResolver(ILocalizationManager localization, IFileSystem fileSystem) { _localization = localization; + _fileSystem = fileSystem; } public IEnumerable GetExternalSubtitleStreams(Video video, @@ -24,17 +27,17 @@ namespace MediaBrowser.Providers.MediaInfo IDirectoryService directoryService, bool clearCache) { - var files = GetSubtitleFiles(video, directoryService, clearCache); + var files = GetSubtitleFiles(video, directoryService, _fileSystem, clearCache); var streams = new List(); - var videoFileNameWithoutExtension = Path.GetFileNameWithoutExtension(video.Path); + var videoFileNameWithoutExtension = _fileSystem.GetFileNameWithoutExtension(video.Path); foreach (var file in files) { var fullName = file.FullName; - var fileNameWithoutExtension = Path.GetFileNameWithoutExtension(fullName); + var fileNameWithoutExtension = _fileSystem.GetFileNameWithoutExtension(file); var codec = Path.GetExtension(fullName).ToLower().TrimStart('.'); @@ -96,7 +99,7 @@ namespace MediaBrowser.Providers.MediaInfo } } - public static IEnumerable GetSubtitleFiles(Video video, IDirectoryService directoryService, bool clearCache) + public static IEnumerable GetSubtitleFiles(Video video, IDirectoryService directoryService, IFileSystem fileSystem, bool clearCache) { var containingPath = video.ContainingFolderPath; @@ -107,16 +110,14 @@ namespace MediaBrowser.Providers.MediaInfo var files = directoryService.GetFiles(containingPath, clearCache); - var videoFileNameWithoutExtension = Path.GetFileNameWithoutExtension(video.Path); + var videoFileNameWithoutExtension = fileSystem.GetFileNameWithoutExtension(video.Path); return files.Where(i => { if (!i.Attributes.HasFlag(FileAttributes.Directory) && SubtitleExtensions.Contains(i.Extension, StringComparer.OrdinalIgnoreCase)) { - var fullName = i.FullName; - - var fileNameWithoutExtension = Path.GetFileNameWithoutExtension(fullName); + var fileNameWithoutExtension = fileSystem.GetFileNameWithoutExtension(i); if (string.Equals(videoFileNameWithoutExtension, fileNameWithoutExtension, StringComparison.OrdinalIgnoreCase)) { diff --git a/MediaBrowser.Providers/Movies/MovieDbProvider.cs b/MediaBrowser.Providers/Movies/MovieDbProvider.cs index 65fe32a99..32d53db43 100644 --- a/MediaBrowser.Providers/Movies/MovieDbProvider.cs +++ b/MediaBrowser.Providers/Movies/MovieDbProvider.cs @@ -252,7 +252,7 @@ namespace MediaBrowser.Providers.Movies var path = GetMovieDataPath(_configurationManager.ApplicationPaths, tmdbId); var filename = string.Format("all-{0}.json", - preferredLanguage ?? string.Empty); + preferredLanguage); return Path.Combine(path, filename); } diff --git a/MediaBrowser.Providers/Subtitles/SubtitleManager.cs b/MediaBrowser.Providers/Subtitles/SubtitleManager.cs index 08499a20b..34656f05b 100644 --- a/MediaBrowser.Providers/Subtitles/SubtitleManager.cs +++ b/MediaBrowser.Providers/Subtitles/SubtitleManager.cs @@ -105,7 +105,7 @@ namespace MediaBrowser.Providers.Subtitles using (var stream = response.Stream) { var savePath = Path.Combine(Path.GetDirectoryName(video.Path), - Path.GetFileNameWithoutExtension(video.Path) + "." + response.Language.ToLower()); + _fileSystem.GetFileNameWithoutExtension(video.Path) + "." + response.Language.ToLower()); if (response.IsForced) { diff --git a/MediaBrowser.Server.Implementations/FileOrganization/EpisodeFileOrganizer.cs b/MediaBrowser.Server.Implementations/FileOrganization/EpisodeFileOrganizer.cs index d44811886..594ba9d23 100644 --- a/MediaBrowser.Server.Implementations/FileOrganization/EpisodeFileOrganizer.cs +++ b/MediaBrowser.Server.Implementations/FileOrganization/EpisodeFileOrganizer.cs @@ -248,12 +248,12 @@ namespace MediaBrowser.Server.Implementations.FileOrganization .ToList(); var folder = Path.GetDirectoryName(targetPath); - var targetFileNameWithoutExtension = Path.GetFileNameWithoutExtension(targetPath); - + var targetFileNameWithoutExtension = _fileSystem.GetFileNameWithoutExtension(targetPath); + try { var filesOfOtherExtensions = Directory.EnumerateFiles(folder, "*", SearchOption.TopDirectoryOnly) - .Where(i => EntityResolutionHelper.IsVideoFile(i) && string.Equals(Path.GetFileNameWithoutExtension(i), targetFileNameWithoutExtension, StringComparison.OrdinalIgnoreCase)); + .Where(i => EntityResolutionHelper.IsVideoFile(i) && string.Equals(_fileSystem.GetFileNameWithoutExtension(i), targetFileNameWithoutExtension, StringComparison.OrdinalIgnoreCase)); episodePaths.AddRange(filesOfOtherExtensions); } diff --git a/MediaBrowser.Server.Implementations/HttpServer/HttpListenerHost.cs b/MediaBrowser.Server.Implementations/HttpServer/HttpListenerHost.cs index d0ea07056..6e0b654fd 100644 --- a/MediaBrowser.Server.Implementations/HttpServer/HttpListenerHost.cs +++ b/MediaBrowser.Server.Implementations/HttpServer/HttpListenerHost.cs @@ -1,5 +1,4 @@ -using Amib.Threading; -using Funq; +using Funq; using MediaBrowser.Common; using MediaBrowser.Common.Extensions; using MediaBrowser.Common.Net; @@ -15,7 +14,6 @@ using ServiceStack.Host.HttpListener; using ServiceStack.Logging; using ServiceStack.Web; using System; -using System.Collections.Concurrent; using System.Collections.Generic; using System.IO; using System.Linq; @@ -37,7 +35,6 @@ namespace MediaBrowser.Server.Implementations.HttpServer private IHttpListener _listener; - private readonly SmartThreadPool _threadPoolManager; private const int IdleTimeout = 300; private readonly ContainerAdapter _containerAdapter; @@ -62,9 +59,6 @@ namespace MediaBrowser.Server.Implementations.HttpServer _logger = logManager.GetLogger("HttpServer"); _containerAdapter = new ContainerAdapter(applicationHost); - - _threadPoolManager = new SmartThreadPool(IdleTimeout, - maxWorkerThreads: Math.Max(16, Environment.ProcessorCount * 2)); } public override void Configure(Container container) @@ -158,8 +152,8 @@ namespace MediaBrowser.Server.Implementations.HttpServer HostContext.Config.HandlerFactoryPath = ListenerRequest.GetHandlerPathIfAny(UrlPrefixes.First()); _listener = NativeWebSocket.IsSupported - ? _listener = new HttpListenerServer(_logger, _threadPoolManager) - : _listener = new WebSocketSharpListener(_logger, _threadPoolManager); + ? _listener = new HttpListenerServer(_logger) + : _listener = new WebSocketSharpListener(_logger); _listener.WebSocketHandler = WebSocketHandler; _listener.ErrorHandler = ErrorHandler; @@ -356,8 +350,6 @@ namespace MediaBrowser.Server.Implementations.HttpServer if (disposing) { - _threadPoolManager.Dispose(); - Stop(); } diff --git a/MediaBrowser.Server.Implementations/HttpServer/NetListener/HttpListenerServer.cs b/MediaBrowser.Server.Implementations/HttpServer/NetListener/HttpListenerServer.cs index 7f766129e..12106c32e 100644 --- a/MediaBrowser.Server.Implementations/HttpServer/NetListener/HttpListenerServer.cs +++ b/MediaBrowser.Server.Implementations/HttpServer/NetListener/HttpListenerServer.cs @@ -1,6 +1,4 @@ -using System.Text; -using Amib.Threading; -using MediaBrowser.Common.Net; +using MediaBrowser.Common.Net; using MediaBrowser.Model.Logging; using ServiceStack; using ServiceStack.Host.HttpListener; @@ -10,6 +8,7 @@ using System.Collections.Concurrent; using System.Collections.Generic; using System.Linq; using System.Net; +using System.Text; using System.Threading; using System.Threading.Tasks; @@ -20,7 +19,6 @@ namespace MediaBrowser.Server.Implementations.HttpServer.NetListener private readonly ILogger _logger; private HttpListener _listener; private readonly AutoResetEvent _listenForNextRequest = new AutoResetEvent(false); - private readonly SmartThreadPool _threadPoolManager; public System.Action ErrorHandler { get; set; } public Action WebSocketHandler { get; set; } @@ -28,11 +26,9 @@ namespace MediaBrowser.Server.Implementations.HttpServer.NetListener private readonly ConcurrentDictionary _localEndPoints = new ConcurrentDictionary(StringComparer.OrdinalIgnoreCase); - public HttpListenerServer(ILogger logger, SmartThreadPool threadPoolManager) + public HttpListenerServer(ILogger logger) { _logger = logger; - - _threadPoolManager = threadPoolManager; } /// @@ -63,7 +59,7 @@ namespace MediaBrowser.Server.Implementations.HttpServer.NetListener _listener.Start(); - ThreadPool.QueueUserWorkItem(Listen); + Task.Factory.StartNew(Listen, TaskCreationOptions.LongRunning); } private bool IsListening @@ -72,7 +68,7 @@ namespace MediaBrowser.Server.Implementations.HttpServer.NetListener } // Loop here to begin processing of new requests. - private void Listen(object state) + private void Listen() { while (IsListening) { @@ -130,7 +126,7 @@ namespace MediaBrowser.Server.Implementations.HttpServer.NetListener _listenForNextRequest.Set(); } - _threadPoolManager.QueueWorkItem(() => InitTask(context)); + Task.Factory.StartNew(() => InitTask(context)); } private void InitTask(HttpListenerContext context) @@ -287,8 +283,6 @@ namespace MediaBrowser.Server.Implementations.HttpServer.NetListener if (disposing) { - _threadPoolManager.Dispose(); - Stop(); } diff --git a/MediaBrowser.Server.Implementations/HttpServer/SocketSharp/WebSocketSharpListener.cs b/MediaBrowser.Server.Implementations/HttpServer/SocketSharp/WebSocketSharpListener.cs index cf756d9f2..b18d0df5e 100644 --- a/MediaBrowser.Server.Implementations/HttpServer/SocketSharp/WebSocketSharpListener.cs +++ b/MediaBrowser.Server.Implementations/HttpServer/SocketSharp/WebSocketSharpListener.cs @@ -1,14 +1,13 @@ -using System; +using MediaBrowser.Common.Net; +using MediaBrowser.Model.Logging; +using ServiceStack; +using ServiceStack.Web; +using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; -using Amib.Threading; -using MediaBrowser.Common.Net; -using MediaBrowser.Model.Logging; -using ServiceStack; -using ServiceStack.Web; using WebSocketSharp.Net; using WebSocketSharp.Server; @@ -20,12 +19,10 @@ namespace MediaBrowser.Server.Implementations.HttpServer.SocketSharp private WebSocketSharp.Server.HttpServer _httpsv; private readonly ILogger _logger; - private readonly SmartThreadPool _threadPoolManager; - public WebSocketSharpListener(ILogger logger, SmartThreadPool threadPoolManager) + public WebSocketSharpListener(ILogger logger) { _logger = logger; - _threadPoolManager = threadPoolManager; } public IEnumerable LocalEndPoints @@ -33,9 +30,9 @@ namespace MediaBrowser.Server.Implementations.HttpServer.SocketSharp get { return _localEndPoints.Keys.ToList(); } } - public System.Action ErrorHandler { get; set; } + public Action ErrorHandler { get; set; } - public System.Func RequestHandler { get; set; } + public Func RequestHandler { get; set; } public Action WebSocketHandler { get; set; } @@ -50,7 +47,7 @@ namespace MediaBrowser.Server.Implementations.HttpServer.SocketSharp void _httpsv_OnRequest(object sender, HttpRequestEventArgs e) { - _threadPoolManager.QueueWorkItem(() => InitTask(e.Context)); + Task.Factory.StartNew(() => InitTask(e.Context)); } private void InitTask(HttpListenerContext context) diff --git a/MediaBrowser.Server.Implementations/Library/CoreResolutionIgnoreRule.cs b/MediaBrowser.Server.Implementations/Library/CoreResolutionIgnoreRule.cs index 8229c8a2f..7b58dd7c4 100644 --- a/MediaBrowser.Server.Implementations/Library/CoreResolutionIgnoreRule.cs +++ b/MediaBrowser.Server.Implementations/Library/CoreResolutionIgnoreRule.cs @@ -90,7 +90,7 @@ namespace MediaBrowser.Server.Implementations.Library if (args.Parent != null) { // Don't resolve these into audio files - if (string.Equals(Path.GetFileNameWithoutExtension(filename), BaseItem.ThemeSongFilename) && EntityResolutionHelper.IsAudioFile(filename)) + if (string.Equals(_fileSystem.GetFileNameWithoutExtension(filename), BaseItem.ThemeSongFilename) && EntityResolutionHelper.IsAudioFile(filename)) { return true; } diff --git a/MediaBrowser.Server.Implementations/Library/LibraryManager.cs b/MediaBrowser.Server.Implementations/Library/LibraryManager.cs index 64e0a6662..8310895e6 100644 --- a/MediaBrowser.Server.Implementations/Library/LibraryManager.cs +++ b/MediaBrowser.Server.Implementations/Library/LibraryManager.cs @@ -1157,7 +1157,7 @@ namespace MediaBrowser.Server.Implementations.Library private string GetCollectionType(string path) { return new DirectoryInfo(path).EnumerateFiles("*.collection", SearchOption.TopDirectoryOnly) - .Select(i => Path.GetFileNameWithoutExtension(i.FullName)) + .Select(i => _fileSystem.GetFileNameWithoutExtension(i)) .FirstOrDefault(); } @@ -1486,23 +1486,22 @@ namespace MediaBrowser.Server.Implementations.Library public async Task GetNamedView(string name, string type, string sortName, CancellationToken cancellationToken) { - var id = "namedview_3_" + name; - var guid = id.GetMD5(); + var path = Path.Combine(ConfigurationManager.ApplicationPaths.ItemsByNamePath, + "views", + _fileSystem.GetValidFilename(type)); - var item = GetItemById(guid) as UserView; + var id = (path + "_namedview_" + name).GetMBId(typeof(UserView)); + + var item = GetItemById(id) as UserView; if (item == null) { - var path = Path.Combine(ConfigurationManager.ApplicationPaths.ItemsByNamePath, - "views", - _fileSystem.GetValidFilename(type)); - Directory.CreateDirectory(Path.GetDirectoryName(path)); item = new UserView { Path = path, - Id = guid, + Id = id, DateCreated = DateTime.UtcNow, Name = name, ViewType = type, diff --git a/MediaBrowser.Server.Implementations/Library/Resolvers/Audio/MusicAlbumResolver.cs b/MediaBrowser.Server.Implementations/Library/Resolvers/Audio/MusicAlbumResolver.cs index 64d2db2e4..2ee3d49a4 100644 --- a/MediaBrowser.Server.Implementations/Library/Resolvers/Audio/MusicAlbumResolver.cs +++ b/MediaBrowser.Server.Implementations/Library/Resolvers/Audio/MusicAlbumResolver.cs @@ -1,4 +1,5 @@ -using MediaBrowser.Controller.Entities; +using MediaBrowser.Common.IO; +using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities.Audio; using MediaBrowser.Controller.Entities.Movies; using MediaBrowser.Controller.Entities.TV; @@ -6,6 +7,7 @@ using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Providers; using MediaBrowser.Controller.Resolvers; using MediaBrowser.Model.Entities; +using MediaBrowser.Model.Logging; using System; using System.Collections.Generic; using System.IO; @@ -17,6 +19,15 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers.Audio /// public class MusicAlbumResolver : ItemResolver { + private readonly ILogger _logger; + private readonly IFileSystem _fileSystem; + + public MusicAlbumResolver(ILogger logger, IFileSystem fileSystem) + { + _logger = logger; + _fileSystem = fileSystem; + } + /// /// Gets the priority. /// @@ -64,10 +75,12 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers.Audio /// /// The path. /// The directory service. + /// The logger. + /// The file system. /// true if [is music album] [the specified data]; otherwise, false. - public static bool IsMusicAlbum(string path, IDirectoryService directoryService) + public static bool IsMusicAlbum(string path, IDirectoryService directoryService, ILogger logger, IFileSystem fileSystem) { - return ContainsMusic(directoryService.GetFileSystemEntries(path), true, directoryService); + return ContainsMusic(directoryService.GetFileSystemEntries(path), true, directoryService, logger, fileSystem); } /// @@ -75,13 +88,13 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers.Audio /// /// The args. /// true if [is music album] [the specified args]; otherwise, false. - public static bool IsMusicAlbum(ItemResolveArgs args) + private bool IsMusicAlbum(ItemResolveArgs args) { // Args points to an album if parent is an Artist folder or it directly contains music if (args.IsDirectory) { //if (args.Parent is MusicArtist) return true; //saves us from testing children twice - if (ContainsMusic(args.FileSystemChildren, true, args.DirectoryService)) return true; + if (ContainsMusic(args.FileSystemChildren, true, args.DirectoryService, _logger, _fileSystem)) return true; } return false; @@ -93,19 +106,23 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers.Audio /// The list. /// if set to true [allow subfolders]. /// The directory service. + /// The logger. + /// The file system. /// true if the specified list contains music; otherwise, false. - private static bool ContainsMusic(IEnumerable list, bool allowSubfolders, IDirectoryService directoryService) + private static bool ContainsMusic(IEnumerable list, bool allowSubfolders, IDirectoryService directoryService, ILogger logger, IFileSystem fileSystem) { // If list contains at least 2 audio files or at least one and no video files consider it to contain music var foundAudio = 0; + var discSubfolderCount = 0; + foreach (var fileSystemInfo in list) { if ((fileSystemInfo.Attributes & FileAttributes.Directory) == FileAttributes.Directory) { - if (allowSubfolders && IsAlbumSubfolder(fileSystemInfo, directoryService)) + if (allowSubfolders && IsAlbumSubfolder(fileSystemInfo, directoryService, logger, fileSystem)) { - return true; + discSubfolderCount++; } if (!IsAdditionalSubfolderAllowed(fileSystemInfo)) { @@ -118,7 +135,7 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers.Audio if (EntityResolutionHelper.IsAudioFile(fullName)) { // Don't resolve these into audio files - if (string.Equals(Path.GetFileNameWithoutExtension(fullName), BaseItem.ThemeSongFilename) && EntityResolutionHelper.IsAudioFile(fullName)) + if (string.Equals(fileSystem.GetFileNameWithoutExtension(fullName), BaseItem.ThemeSongFilename) && EntityResolutionHelper.IsAudioFile(fullName)) { continue; } @@ -135,16 +152,18 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers.Audio } // or a single audio file and no video files - return foundAudio > 0; + return foundAudio > 0 || discSubfolderCount > 0; } - private static bool IsAlbumSubfolder(FileSystemInfo directory, IDirectoryService directoryService) + private static bool IsAlbumSubfolder(FileSystemInfo directory, IDirectoryService directoryService, ILogger logger, IFileSystem fileSystem) { var path = directory.FullName; if (IsMultiDiscFolder(path)) { - return ContainsMusic(directoryService.GetFileSystemEntries(path), false, directoryService); + logger.Debug("Found multi-disc folder: " + path); + + return ContainsMusic(directoryService.GetFileSystemEntries(path), false, directoryService, logger, fileSystem); } return false; diff --git a/MediaBrowser.Server.Implementations/Library/Resolvers/Audio/MusicArtistResolver.cs b/MediaBrowser.Server.Implementations/Library/Resolvers/Audio/MusicArtistResolver.cs index 4fa97fc9d..19a284d15 100644 --- a/MediaBrowser.Server.Implementations/Library/Resolvers/Audio/MusicArtistResolver.cs +++ b/MediaBrowser.Server.Implementations/Library/Resolvers/Audio/MusicArtistResolver.cs @@ -1,9 +1,11 @@ -using MediaBrowser.Controller.Entities.Audio; +using MediaBrowser.Common.IO; +using MediaBrowser.Controller.Entities.Audio; using MediaBrowser.Controller.Entities.Movies; using MediaBrowser.Controller.Entities.TV; using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Resolvers; using MediaBrowser.Model.Entities; +using MediaBrowser.Model.Logging; using System; using System.IO; using System.Linq; @@ -15,6 +17,15 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers.Audio /// public class MusicArtistResolver : ItemResolver { + private readonly ILogger _logger; + private readonly IFileSystem _fileSystem; + + public MusicArtistResolver(ILogger logger, IFileSystem fileSystem) + { + _logger = logger; + _fileSystem = fileSystem; + } + /// /// Gets the priority. /// @@ -61,7 +72,7 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers.Audio var directoryService = args.DirectoryService; // If we contain an album assume we are an artist folder - return args.FileSystemChildren.Where(i => (i.Attributes & FileAttributes.Directory) == FileAttributes.Directory).Any(i => MusicAlbumResolver.IsMusicAlbum(i.FullName, directoryService)) ? new MusicArtist() : null; + return args.FileSystemChildren.Where(i => (i.Attributes & FileAttributes.Directory) == FileAttributes.Directory).Any(i => MusicAlbumResolver.IsMusicAlbum(i.FullName, directoryService, _logger, _fileSystem)) ? new MusicArtist() : null; } } diff --git a/MediaBrowser.Server.Implementations/Library/Resolvers/FolderResolver.cs b/MediaBrowser.Server.Implementations/Library/Resolvers/FolderResolver.cs index 594277ef7..166465f72 100644 --- a/MediaBrowser.Server.Implementations/Library/Resolvers/FolderResolver.cs +++ b/MediaBrowser.Server.Implementations/Library/Resolvers/FolderResolver.cs @@ -1,4 +1,5 @@ -using MediaBrowser.Controller.Entities; +using MediaBrowser.Common.IO; +using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Resolvers; using System; @@ -12,6 +13,13 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers /// public class FolderResolver : FolderResolver { + private readonly IFileSystem _fileSystem; + + public FolderResolver(IFileSystem fileSystem) + { + _fileSystem = fileSystem; + } + /// /// Gets the priority. /// @@ -69,7 +77,7 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers } }) - .Select(i => Path.GetFileNameWithoutExtension(i.FullName)) + .Select(i => _fileSystem.GetFileNameWithoutExtension(i)) .FirstOrDefault(); } } diff --git a/MediaBrowser.Server.Implementations/Library/Resolvers/LocalTrailerResolver.cs b/MediaBrowser.Server.Implementations/Library/Resolvers/LocalTrailerResolver.cs index 10ee3586d..b483f7c42 100644 --- a/MediaBrowser.Server.Implementations/Library/Resolvers/LocalTrailerResolver.cs +++ b/MediaBrowser.Server.Implementations/Library/Resolvers/LocalTrailerResolver.cs @@ -1,4 +1,5 @@ -using MediaBrowser.Controller.Entities; +using MediaBrowser.Common.IO; +using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Resolvers; using System; @@ -11,6 +12,13 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers /// public class LocalTrailerResolver : BaseVideoResolver { + private readonly IFileSystem _fileSystem; + + public LocalTrailerResolver(IFileSystem fileSystem) + { + _fileSystem = fileSystem; + } + /// /// Resolves the specified args. /// @@ -33,7 +41,7 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers } // Support xbmc local trailer convention, but only when looking for local trailers (hence the parent == null check) - if (args.Parent == null && Path.GetFileNameWithoutExtension(args.Path).EndsWith(BaseItem.XbmcTrailerFileSuffix, StringComparison.OrdinalIgnoreCase)) + if (args.Parent == null && _fileSystem.GetFileNameWithoutExtension(args.Path).EndsWith(BaseItem.XbmcTrailerFileSuffix, StringComparison.OrdinalIgnoreCase)) { return base.Resolve(args); } diff --git a/MediaBrowser.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs b/MediaBrowser.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs index f3e6fcdba..215cff22f 100644 --- a/MediaBrowser.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs +++ b/MediaBrowser.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs @@ -1,4 +1,5 @@ using MediaBrowser.Common.Extensions; +using MediaBrowser.Common.IO; using MediaBrowser.Controller; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities.Movies; @@ -22,12 +23,14 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers.Movies private readonly IServerApplicationPaths _applicationPaths; private readonly ILibraryManager _libraryManager; private readonly ILogger _logger; + private readonly IFileSystem _fileSystem; - public MovieResolver(IServerApplicationPaths appPaths, ILibraryManager libraryManager, ILogger logger) + public MovieResolver(IServerApplicationPaths appPaths, ILibraryManager libraryManager, ILogger logger, IFileSystem fileSystem) { _applicationPaths = appPaths; _libraryManager = libraryManager; _logger = logger; + _fileSystem = fileSystem; } /// @@ -407,7 +410,7 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers.Movies if (!string.IsNullOrWhiteSpace(filenamePrefix)) { - if (sortedMovies.All(i => Path.GetFileNameWithoutExtension(i.Path).StartsWith(filenamePrefix + " - ", StringComparison.OrdinalIgnoreCase))) + if (sortedMovies.All(i => _fileSystem.GetFileNameWithoutExtension(i.Path).StartsWith(filenamePrefix + " - ", StringComparison.OrdinalIgnoreCase))) { firstMovie.HasLocalAlternateVersions = true; diff --git a/MediaBrowser.Server.Implementations/Library/Resolvers/TV/SeriesResolver.cs b/MediaBrowser.Server.Implementations/Library/Resolvers/TV/SeriesResolver.cs index a756dc794..519d775de 100644 --- a/MediaBrowser.Server.Implementations/Library/Resolvers/TV/SeriesResolver.cs +++ b/MediaBrowser.Server.Implementations/Library/Resolvers/TV/SeriesResolver.cs @@ -1,4 +1,5 @@ using MediaBrowser.Common.Extensions; +using MediaBrowser.Common.IO; using MediaBrowser.Controller.Entities.Audio; using MediaBrowser.Controller.Entities.TV; using MediaBrowser.Controller.Library; @@ -14,6 +15,13 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers.TV /// public class SeriesResolver : FolderResolver { + private readonly IFileSystem _fileSystem; + + public SeriesResolver(IFileSystem fileSystem) + { + _fileSystem = fileSystem; + } + /// /// Gets the priority. /// @@ -67,8 +75,8 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers.TV { return null; } - - if (TVUtils.IsSeriesFolder(args.Path, collectionType == CollectionType.TvShows, args.FileSystemChildren, args.DirectoryService)) + + if (TVUtils.IsSeriesFolder(args.Path, collectionType == CollectionType.TvShows, args.FileSystemChildren, args.DirectoryService, _fileSystem)) { return new Series(); } diff --git a/MediaBrowser.Server.Implementations/Library/UserManager.cs b/MediaBrowser.Server.Implementations/Library/UserManager.cs index dbe020908..43c9f3b9c 100644 --- a/MediaBrowser.Server.Implementations/Library/UserManager.cs +++ b/MediaBrowser.Server.Implementations/Library/UserManager.cs @@ -282,7 +282,7 @@ namespace MediaBrowser.Server.Implementations.Library /// public async Task CreateUser(string name) { - if (string.IsNullOrEmpty(name)) + if (string.IsNullOrWhiteSpace(name)) { throw new ArgumentNullException("name"); } diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/es_MX.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/es_MX.json index 53047104c..d9855c52f 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/es_MX.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/es_MX.json @@ -314,10 +314,10 @@ "ButtonSubtitles": "Subt\u00edtulos", "ButtonScenes": "Escenas", "ButtonQuality": "Calidad", - "HeaderNotifications": "Notifications", - "HeaderSelectPlayer": "Select Player:", + "HeaderNotifications": "Notificaciones", + "HeaderSelectPlayer": "Seleccionar Reproductor:", "ButtonSelect": "Seleccionar", "ButtonNew": "Nuevo", - "MessageInternetExplorerWebm": "For best results with Internet Explorer please install the WebM plugin for IE.", - "HeaderVideoError": "Video Error" + "MessageInternetExplorerWebm": "Para mejores resultados con Internet Explorer por favor instale el complemento WebM para IE.", + "HeaderVideoError": "Error de Video" } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/fr.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/fr.json index 6bcb5aed5..5086dcfac 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/fr.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/fr.json @@ -77,7 +77,7 @@ "MessageInvalidUser": "Nom d'utilisateur et mot de passe invalides.", "HeaderAllRecordings": "Tous les enregistrements", "RecommendationBecauseYouLike": "Parce-que vous aimez {0}", - "RecommendationBecauseYouWatched": "Parece-que vous avez regard\u00e9 {0}", + "RecommendationBecauseYouWatched": "Parce que vous avez regard\u00e9 {0}", "RecommendationDirectedBy": "R\u00e9alis\u00e9 par {0}", "RecommendationStarring": "Mettant en vedette {0}", "HeaderConfirmRecordingCancellation": "Confirmer l'annulation de l'enregistrement.", diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/nl.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/nl.json index 191a89000..37cff9888 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/nl.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/nl.json @@ -20,11 +20,11 @@ "OptionRelease": "Offici\u00eble Release", "OptionBeta": "Beta", "OptionDev": "Dev (Instabiel)", - "UninstallPluginHeader": "Invoegtoepassing de\u00efnstalleren", + "UninstallPluginHeader": "Plug-in de\u00efnstalleren", "UninstallPluginConfirmation": "Weet u zeker dat u {0} wilt de\u00efnstalleren?", - "NoPluginConfigurationMessage": "Deze Invoegtoepassing heeft niets in te stellen", - "NoPluginsInstalledMessage": "U heeft geen Invoegtoepassingen ge\u00efnstalleerd", - "BrowsePluginCatalogMessage": "Bekijk de Invoegtoepassings catalogus voor beschikbare Invoegtoepassingen.", + "NoPluginConfigurationMessage": "Deze Plug-in heeft niets in te stellen", + "NoPluginsInstalledMessage": "U heeft geen Plug-in ge\u00efnstalleerd", + "BrowsePluginCatalogMessage": "Bekijk de Plug-in catalogus voor beschikbare Plug-ins.", "MessageKeyEmailedTo": "Sleutel gemaild naar {0}.", "MessageKeysLinked": "Sleutels gekoppeld.", "HeaderConfirmation": "Bevestiging", @@ -45,7 +45,7 @@ "HeaderDeleteTaskTrigger": "Verwijderen Taak Trigger", "HeaderTaskTriggers": "Taak Triggers", "MessageDeleteTaskTrigger": "Weet u zeker dat u deze taak trigger wilt verwijderen?", - "MessageNoPluginsInstalled": "U heeft geen Invoegtoepassingen ge\u00efnstalleerd.", + "MessageNoPluginsInstalled": "U heeft geen Plug-ins ge\u00efnstalleerd.", "LabelVersionInstalled": "{0} ge\u00efnstalleerd", "LabelNumberReviews": "{0} Recensies", "LabelFree": "Gratis", @@ -305,7 +305,7 @@ "TabDLNA": "DLNA", "TabLiveTV": "Live TV", "TabAutoOrganize": "Automatisch-Organiseren", - "TabPlugins": "Invoegtoepassingen", + "TabPlugins": "Plug-ins", "TabAdvanced": "Geavanceerd", "TabHelp": "Hulp", "TabScheduledTasks": "Geplande taken", @@ -318,6 +318,6 @@ "HeaderSelectPlayer": "Selecteer Speler:", "ButtonSelect": "Selecteer", "ButtonNew": "Nieuw", - "MessageInternetExplorerWebm": "For best results with Internet Explorer please install the WebM plugin for IE.", + "MessageInternetExplorerWebm": "Voor het beste resultaat met Internet Explorer installeert u de WebM plugin voor IE.", "HeaderVideoError": "Video Fout" } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/pt_BR.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/pt_BR.json index 51559053d..622ad2c05 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/pt_BR.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/pt_BR.json @@ -318,6 +318,6 @@ "HeaderSelectPlayer": "Selecione onde executar:", "ButtonSelect": "Selecionar", "ButtonNew": "Nova", - "MessageInternetExplorerWebm": "For best results with Internet Explorer please install the WebM plugin for IE.", - "HeaderVideoError": "Video Error" + "MessageInternetExplorerWebm": "Para melhores resultados com o Internet Explorer, por favor instale o plugin WebM para IE.", + "HeaderVideoError": "Erro de V\u00eddeo" } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/ru.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/ru.json index 2fa7f2ea7..80bdc43f7 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/ru.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/ru.json @@ -60,7 +60,7 @@ "ButtonStop": "\u041e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c", "ButtonNextTrack": "\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u0434\u043e\u0440\u043e\u0436\u043a\u0430", "ButtonPause": "\u041f\u0430\u0443\u0437\u0430", - "ButtonPlay": "\u0412\u043e\u0441\u043f\u0440", + "ButtonPlay": "\u0412\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0441\u0442\u0438", "ButtonEdit": "\u041f\u0440\u0430\u0432\u0438\u0442\u044c", "ButtonQueue": "\u041e\u0447\u0435\u0440\u0435\u0434\u044c", "ButtonPlayTrailer": "\u0412\u043e\u0441\u043f\u0440 \u0442\u0440\u0435\u0439\u043b\u0435\u0440", @@ -276,7 +276,7 @@ "OptionParentalRating": "\u0412\u043e\u0437\u0440\u0430\u0441\u0442\u043d\u0430\u044f \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f", "OptionPeople": "\u041b\u044e\u0434\u0438", "OptionRuntime": "\u0414\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c", - "OptionProductionLocations": "\u041c\u0435\u0441\u0442\u0430 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0441\u0442\u0432\u0430", + "OptionProductionLocations": "\u041c\u0435\u0441\u0442\u0430 \u0441\u044a\u0451\u043c\u043e\u043a", "OptionBirthLocation": "\u041c\u0435\u0441\u0442\u043e \u0440\u043e\u0436\u0434\u0435\u043d\u0438\u044f", "LabelAllChannels": "\u0412\u0441\u0435 \u043a\u0430\u043d\u0430\u043b\u044b", "LabelLiveProgram": "\u041f\u0420\u042f\u041c\u041e\u0419 \u042d\u0424\u0418\u0420", diff --git a/MediaBrowser.Server.Implementations/Localization/LocalizationManager.cs b/MediaBrowser.Server.Implementations/Localization/LocalizationManager.cs index 05de4d65a..1f993f0d4 100644 --- a/MediaBrowser.Server.Implementations/Localization/LocalizationManager.cs +++ b/MediaBrowser.Server.Implementations/Localization/LocalizationManager.cs @@ -235,7 +235,9 @@ namespace MediaBrowser.Server.Implementations.Localization .Where(i => i != null) .ToDictionary(i => i.Name, StringComparer.OrdinalIgnoreCase); - var countryCode = Path.GetFileNameWithoutExtension(file).Split('-').Last(); + var countryCode = _fileSystem.GetFileNameWithoutExtension(file) + .Split('-') + .Last(); _allParentalRatings.TryAdd(countryCode, dict); } diff --git a/MediaBrowser.Server.Implementations/Localization/Server/ar.json b/MediaBrowser.Server.Implementations/Localization/Server/ar.json index 81922f713..667245839 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/ar.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/ar.json @@ -767,10 +767,10 @@ "OptionAuto": "Auto", "OptionYes": "Yes", "OptionNo": "No", - "LabelHomePageSection1": "Home page section one:", - "LabelHomePageSection2": "Home page section two:", - "LabelHomePageSection3": "Home page section three:", - "LabelHomePageSection4": "Home page section four:", + "LabelHomePageSection1": "Home page section 1:", + "LabelHomePageSection2": "Home page section 2:", + "LabelHomePageSection3": "Home page section 3:", + "LabelHomePageSection4": "Home page section 4:", "OptionMyViewsButtons": "My views (buttons)", "OptionMyViews": "My views", "OptionMyViewsSmall": "My views (small)", @@ -888,5 +888,7 @@ "ButtonSync": "Sync", "TabScheduledTasks": "Scheduled Tasks", "HeaderChapters": "Chapters", - "HeaderResumeSettings": "Resume Settings" + "HeaderResumeSettings": "Resume Settings", + "TabSync": "Sync", + "TitleUsers": "Users" } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/Server/ca.json b/MediaBrowser.Server.Implementations/Localization/Server/ca.json index a56ccf4de..bcca3aeb9 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/ca.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/ca.json @@ -767,10 +767,10 @@ "OptionAuto": "Auto", "OptionYes": "Yes", "OptionNo": "No", - "LabelHomePageSection1": "Home page section one:", - "LabelHomePageSection2": "Home page section two:", - "LabelHomePageSection3": "Home page section three:", - "LabelHomePageSection4": "Home page section four:", + "LabelHomePageSection1": "Home page section 1:", + "LabelHomePageSection2": "Home page section 2:", + "LabelHomePageSection3": "Home page section 3:", + "LabelHomePageSection4": "Home page section 4:", "OptionMyViewsButtons": "My views (buttons)", "OptionMyViews": "My views", "OptionMyViewsSmall": "My views (small)", @@ -888,5 +888,7 @@ "ButtonSync": "Sync", "TabScheduledTasks": "Scheduled Tasks", "HeaderChapters": "Chapters", - "HeaderResumeSettings": "Resume Settings" + "HeaderResumeSettings": "Resume Settings", + "TabSync": "Sync", + "TitleUsers": "Users" } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/Server/cs.json b/MediaBrowser.Server.Implementations/Localization/Server/cs.json index 729768b78..71ca6fc49 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/cs.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/cs.json @@ -767,10 +767,10 @@ "OptionAuto": "Auto", "OptionYes": "Ano", "OptionNo": "Ne", - "LabelHomePageSection1": "Home page section one:", - "LabelHomePageSection2": "Home page section two:", - "LabelHomePageSection3": "Home page section three:", - "LabelHomePageSection4": "Home page section four:", + "LabelHomePageSection1": "Home page section 1:", + "LabelHomePageSection2": "Home page section 2:", + "LabelHomePageSection3": "Home page section 3:", + "LabelHomePageSection4": "Home page section 4:", "OptionMyViewsButtons": "My views (buttons)", "OptionMyViews": "My views", "OptionMyViewsSmall": "My views (small)", @@ -888,5 +888,7 @@ "ButtonSync": "Sync", "TabScheduledTasks": "Scheduled Tasks", "HeaderChapters": "Chapters", - "HeaderResumeSettings": "Resume Settings" + "HeaderResumeSettings": "Resume Settings", + "TabSync": "Sync", + "TitleUsers": "Users" } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/Server/da.json b/MediaBrowser.Server.Implementations/Localization/Server/da.json index c2fafba45..7a5bd7632 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/da.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/da.json @@ -767,10 +767,10 @@ "OptionAuto": "Auto", "OptionYes": "Yes", "OptionNo": "No", - "LabelHomePageSection1": "Home page section one:", - "LabelHomePageSection2": "Home page section two:", - "LabelHomePageSection3": "Home page section three:", - "LabelHomePageSection4": "Home page section four:", + "LabelHomePageSection1": "Home page section 1:", + "LabelHomePageSection2": "Home page section 2:", + "LabelHomePageSection3": "Home page section 3:", + "LabelHomePageSection4": "Home page section 4:", "OptionMyViewsButtons": "My views (buttons)", "OptionMyViews": "My views", "OptionMyViewsSmall": "My views (small)", @@ -888,5 +888,7 @@ "ButtonSync": "Sync", "TabScheduledTasks": "Scheduled Tasks", "HeaderChapters": "Chapters", - "HeaderResumeSettings": "Resume Settings" + "HeaderResumeSettings": "Resume Settings", + "TabSync": "Sync", + "TitleUsers": "Users" } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/Server/de.json b/MediaBrowser.Server.Implementations/Localization/Server/de.json index 5ffff96dd..ea1b4a1bc 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/de.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/de.json @@ -767,10 +767,10 @@ "OptionAuto": "Auto", "OptionYes": "Ja", "OptionNo": "Nein", - "LabelHomePageSection1": "Home page section one:", - "LabelHomePageSection2": "Home page section two:", - "LabelHomePageSection3": "Home page section three:", - "LabelHomePageSection4": "Home page section four:", + "LabelHomePageSection1": "Home page section 1:", + "LabelHomePageSection2": "Home page section 2:", + "LabelHomePageSection3": "Home page section 3:", + "LabelHomePageSection4": "Home page section 4:", "OptionMyViewsButtons": "My views (buttons)", "OptionMyViews": "My views", "OptionMyViewsSmall": "My views (small)", @@ -888,5 +888,7 @@ "ButtonSync": "Sync", "TabScheduledTasks": "Scheduled Tasks", "HeaderChapters": "Chapters", - "HeaderResumeSettings": "Resume Settings" + "HeaderResumeSettings": "Resume Settings", + "TabSync": "Sync", + "TitleUsers": "Users" } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/Server/el.json b/MediaBrowser.Server.Implementations/Localization/Server/el.json index fe7451fed..2edf37326 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/el.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/el.json @@ -767,10 +767,10 @@ "OptionAuto": "Auto", "OptionYes": "Yes", "OptionNo": "No", - "LabelHomePageSection1": "Home page section one:", - "LabelHomePageSection2": "Home page section two:", - "LabelHomePageSection3": "Home page section three:", - "LabelHomePageSection4": "Home page section four:", + "LabelHomePageSection1": "Home page section 1:", + "LabelHomePageSection2": "Home page section 2:", + "LabelHomePageSection3": "Home page section 3:", + "LabelHomePageSection4": "Home page section 4:", "OptionMyViewsButtons": "My views (buttons)", "OptionMyViews": "My views", "OptionMyViewsSmall": "My views (small)", @@ -888,5 +888,7 @@ "ButtonSync": "Sync", "TabScheduledTasks": "Scheduled Tasks", "HeaderChapters": "Chapters", - "HeaderResumeSettings": "Resume Settings" + "HeaderResumeSettings": "Resume Settings", + "TabSync": "Sync", + "TitleUsers": "Users" } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/Server/en_GB.json b/MediaBrowser.Server.Implementations/Localization/Server/en_GB.json index 5044e6d95..7ff88733a 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/en_GB.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/en_GB.json @@ -767,10 +767,10 @@ "OptionAuto": "Auto", "OptionYes": "Yes", "OptionNo": "No", - "LabelHomePageSection1": "Home page section one:", - "LabelHomePageSection2": "Home page section two:", - "LabelHomePageSection3": "Home page section three:", - "LabelHomePageSection4": "Home page section four:", + "LabelHomePageSection1": "Home page section 1:", + "LabelHomePageSection2": "Home page section 2:", + "LabelHomePageSection3": "Home page section 3:", + "LabelHomePageSection4": "Home page section 4:", "OptionMyViewsButtons": "My views (buttons)", "OptionMyViews": "My views", "OptionMyViewsSmall": "My views (small)", @@ -888,5 +888,7 @@ "ButtonSync": "Sync", "TabScheduledTasks": "Scheduled Tasks", "HeaderChapters": "Chapters", - "HeaderResumeSettings": "Resume Settings" + "HeaderResumeSettings": "Resume Settings", + "TabSync": "Sync", + "TitleUsers": "Users" } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/Server/en_US.json b/MediaBrowser.Server.Implementations/Localization/Server/en_US.json index dc4ac80cb..930401e5c 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/en_US.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/en_US.json @@ -767,10 +767,10 @@ "OptionAuto": "Auto", "OptionYes": "Yes", "OptionNo": "No", - "LabelHomePageSection1": "Home page section one:", - "LabelHomePageSection2": "Home page section two:", - "LabelHomePageSection3": "Home page section three:", - "LabelHomePageSection4": "Home page section four:", + "LabelHomePageSection1": "Home page section 1:", + "LabelHomePageSection2": "Home page section 2:", + "LabelHomePageSection3": "Home page section 3:", + "LabelHomePageSection4": "Home page section 4:", "OptionMyViewsButtons": "My views (buttons)", "OptionMyViews": "My views", "OptionMyViewsSmall": "My views (small)", @@ -888,5 +888,7 @@ "ButtonSync": "Sync", "TabScheduledTasks": "Scheduled Tasks", "HeaderChapters": "Chapters", - "HeaderResumeSettings": "Resume Settings" + "HeaderResumeSettings": "Resume Settings", + "TabSync": "Sync", + "TitleUsers": "Users" } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/Server/es.json b/MediaBrowser.Server.Implementations/Localization/Server/es.json index 9c43a9c9e..94c6c9ec4 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/es.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/es.json @@ -888,5 +888,7 @@ "ButtonSync": "Sync", "TabScheduledTasks": "Scheduled Tasks", "HeaderChapters": "Chapters", - "HeaderResumeSettings": "Resume Settings" + "HeaderResumeSettings": "Resume Settings", + "TabSync": "Sync", + "TitleUsers": "Users" } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/Server/es_MX.json b/MediaBrowser.Server.Implementations/Localization/Server/es_MX.json index 98a36f8dd..f1a323e6d 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/es_MX.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/es_MX.json @@ -190,7 +190,7 @@ "HeaderStatus": "Estado", "OptionContinuing": "Continuando", "OptionEnded": "Finalizado", - "HeaderAirDays": "D\u00edas de Emisi\u00f3n:", + "HeaderAirDays": "D\u00edas de Emisi\u00f3n", "OptionSunday": "Domingo", "OptionMonday": "Lunes", "OptionTuesday": "Martes", @@ -198,8 +198,8 @@ "OptionThursday": "Jueves", "OptionFriday": "Viernes", "OptionSaturday": "S\u00e1bado", - "HeaderManagement": "Administraci\u00f3n:", - "LabelManagement": "Management:", + "HeaderManagement": "Administraci\u00f3n", + "LabelManagement": "Administraci\u00f3n:", "OptionMissingImdbId": "Falta Id de IMDb", "OptionMissingTvdbId": "Falta Id de TheTVDB", "OptionMissingOverview": "Falta Sinopsis", @@ -257,11 +257,11 @@ "ButtonSelectDirectory": "Seleccionar Carpeta", "LabelCustomPaths": "Especificar rutas personalizadas cuando se desee. Deje los campos vac\u00edos para usar los valores predeterminados.", "LabelCachePath": "Ruta para el Cach\u00e9:", - "LabelCachePathHelp": "Esta carpeta contiene los archivos de cach\u00e9 del servidor, por ejemplo im\u00e1genes.", + "LabelCachePathHelp": "Especifique una ubicaci\u00f3n personalizada para los archivos de cach\u00e9 del servidor, tales como im\u00e1genes.", "LabelImagesByNamePath": "Ruta para Im\u00e1genes por nombre:", - "LabelImagesByNamePathHelp": "Esta carpeta contiene im\u00e1genes descargadas de actores, artistas, g\u00e9neros y estudios.", + "LabelImagesByNamePathHelp": "Especifique una ubicaci\u00f3n personalizada para im\u00e1genes descargadas de actores, artistas, g\u00e9neros y estudios.", "LabelMetadataPath": "Ruta para metadatos:", - "LabelMetadataPathHelp": "Esta ubicaci\u00f3n contiene ilustraciones descargadas y metadatos cuando no han sido configurados para almacenarse en carpetas de medios.", + "LabelMetadataPathHelp": "Especifique una ubicaci\u00f3n personalizada para ilustraciones descargadas y metadatos cuando no han sido configurados para almacenarse en carpetas de medios.", "LabelTranscodingTempPath": "Ruta para transcodificaci\u00f3n temporal:", "LabelTranscodingTempPathHelp": "Esta carpeta contiene archivos de trabajo usados por el transcodificador. Especifique una trayectoria personalizada, o d\u00e9jela vac\u00eda para utilizar su valor por omisi\u00f3n en la carpeta de datos del servidor.", "TabBasics": "B\u00e1sicos", @@ -627,10 +627,10 @@ "TabNowPlaying": "Reproduci\u00e9ndo Ahora", "TabNavigation": "Navegaci\u00f3n", "TabControls": "Controles", - "ButtonFullscreen": "Toggle fullscreen", + "ButtonFullscreen": "Cambiar a pantalla completa", "ButtonScenes": "Escenas", "ButtonSubtitles": "Subt\u00edtulos", - "ButtonAudioTracks": "Audio tracks", + "ButtonAudioTracks": "Pistas de audio", "ButtonPreviousTrack": "Pista anterior", "ButtonNextTrack": "Pista siguiente", "ButtonStop": "Detener", @@ -880,13 +880,13 @@ "TabSort": "Ordenaci\u00f3n", "TabFilter": "Filtro", "ButtonView": "Vista", - "LabelPageSize": "Tama\u00f1o de Pantalla:", + "LabelPageSize": "Cantidad de \u00cdtems:", "LabelView": "Vista:", "TabUsers": "Usuarios", - "HeaderFeatures": "Features", - "HeaderAdvanced": "Advanced", - "ButtonSync": "Sync", + "HeaderFeatures": "Caracter\u00edsticas", + "HeaderAdvanced": "Avanzado", + "ButtonSync": "Sincronizar", "TabScheduledTasks": "Tareas Programadas", - "HeaderChapters": "Chapters", - "HeaderResumeSettings": "Resume Settings" + "HeaderChapters": "Cap\u00edtulos", + "HeaderResumeSettings": "Configuraci\u00f3n para Continuar" } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/Server/fr.json b/MediaBrowser.Server.Implementations/Localization/Server/fr.json index f5f3d9387..275cd20c3 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/fr.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/fr.json @@ -824,8 +824,8 @@ "LabelProtocolInfoHelp": "La valeur sera utilis\u00e9e par le p\u00e9riph\u00e9rique pour r\u00e9pondre aux requ\u00eates GetProtocolInfo.", "TabXbmcMetadata": "Xbmc", "HeaderXbmcMetadataHelp": "Media Browser inclut un support natif pour les m\u00e9tadonn\u00e9es Nfo Xbmc et les images. Pour activer ou d\u00e9sactiver les m\u00e9tadonn\u00e9es Xbmc, utiliser l'onglet Avanc\u00e9 pour configurer les options de vos types de m\u00e9dia.", - "LabelXbmcMetadataUser": "Add user watch data to nfo's for:", - "LabelXbmcMetadataUserHelp": "Activer ceci pour synchroniser en permanence Media Browser et Xbmc", + "LabelXbmcMetadataUser": "Ajouter aux nfo, les donn\u00e9es de surveillance de l'utilisateur :", + "LabelXbmcMetadataUserHelp": "Activer ceci pour synchroniser les donn\u00e9es de surveillance entre Media Browser et Xbmc", "LabelXbmcMetadataDateFormat": "Format de la date de sortie :", "LabelXbmcMetadataDateFormatHelp": "Toutes les dates provenant des nfo seront lues et \u00e9crites en utilisant ce format.", "LabelXbmcMetadataSaveImagePaths": "Sauvegarder les chemins d'images dans les fichiers nfo.", @@ -888,5 +888,7 @@ "ButtonSync": "Sync", "TabScheduledTasks": "T\u00e2ches planifi\u00e9es", "HeaderChapters": "Chapitres", - "HeaderResumeSettings": "Reprendre les param\u00e8tres" + "HeaderResumeSettings": "Reprendre les param\u00e8tres", + "TabSync": "Sync", + "TitleUsers": "Users" } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/Server/he.json b/MediaBrowser.Server.Implementations/Localization/Server/he.json index 43135ec81..51a27549e 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/he.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/he.json @@ -767,10 +767,10 @@ "OptionAuto": "Auto", "OptionYes": "Yes", "OptionNo": "No", - "LabelHomePageSection1": "Home page section one:", - "LabelHomePageSection2": "Home page section two:", - "LabelHomePageSection3": "Home page section three:", - "LabelHomePageSection4": "Home page section four:", + "LabelHomePageSection1": "Home page section 1:", + "LabelHomePageSection2": "Home page section 2:", + "LabelHomePageSection3": "Home page section 3:", + "LabelHomePageSection4": "Home page section 4:", "OptionMyViewsButtons": "My views (buttons)", "OptionMyViews": "My views", "OptionMyViewsSmall": "My views (small)", @@ -888,5 +888,7 @@ "ButtonSync": "Sync", "TabScheduledTasks": "Scheduled Tasks", "HeaderChapters": "Chapters", - "HeaderResumeSettings": "Resume Settings" + "HeaderResumeSettings": "Resume Settings", + "TabSync": "Sync", + "TitleUsers": "Users" } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/Server/it.json b/MediaBrowser.Server.Implementations/Localization/Server/it.json index e76d47a04..dba80e2b4 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/it.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/it.json @@ -888,5 +888,7 @@ "ButtonSync": "Sync", "TabScheduledTasks": "Operazioni pianificate", "HeaderChapters": "Chapters", - "HeaderResumeSettings": "Resume Settings" + "HeaderResumeSettings": "Resume Settings", + "TabSync": "Sync", + "TitleUsers": "Users" } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/Server/kk.json b/MediaBrowser.Server.Implementations/Localization/Server/kk.json index 9a1847ea4..a3120ffe4 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/kk.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/kk.json @@ -888,5 +888,7 @@ "ButtonSync": "\u0421\u0438\u043d\u0445\u0440\u043e\u043d\u0434\u0430\u0443", "TabScheduledTasks": "\u0416\u043e\u0441\u043f\u0430\u0440\u043b\u0430\u0443\u0448\u044b", "HeaderChapters": "\u0421\u0430\u0445\u043d\u0430\u043b\u0430\u0440", - "HeaderResumeSettings": "\u0416\u0430\u043b\u0493\u0430\u0441\u0442\u044b\u0440\u0443 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043b\u0435\u0440\u0456" + "HeaderResumeSettings": "\u0416\u0430\u043b\u0493\u0430\u0441\u0442\u044b\u0440\u0443 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043b\u0435\u0440\u0456", + "TabSync": "Sync", + "TitleUsers": "Users" } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/Server/ko.json b/MediaBrowser.Server.Implementations/Localization/Server/ko.json index f474225fd..c558cbe8d 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/ko.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/ko.json @@ -767,10 +767,10 @@ "OptionAuto": "Auto", "OptionYes": "Yes", "OptionNo": "No", - "LabelHomePageSection1": "Home page section one:", - "LabelHomePageSection2": "Home page section two:", - "LabelHomePageSection3": "Home page section three:", - "LabelHomePageSection4": "Home page section four:", + "LabelHomePageSection1": "Home page section 1:", + "LabelHomePageSection2": "Home page section 2:", + "LabelHomePageSection3": "Home page section 3:", + "LabelHomePageSection4": "Home page section 4:", "OptionMyViewsButtons": "My views (buttons)", "OptionMyViews": "My views", "OptionMyViewsSmall": "My views (small)", @@ -888,5 +888,7 @@ "ButtonSync": "Sync", "TabScheduledTasks": "Scheduled Tasks", "HeaderChapters": "Chapters", - "HeaderResumeSettings": "Resume Settings" + "HeaderResumeSettings": "Resume Settings", + "TabSync": "Sync", + "TitleUsers": "Users" } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/Server/ms.json b/MediaBrowser.Server.Implementations/Localization/Server/ms.json index 232e94a72..134ff44d8 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/ms.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/ms.json @@ -767,10 +767,10 @@ "OptionAuto": "Auto", "OptionYes": "Yes", "OptionNo": "No", - "LabelHomePageSection1": "Home page section one:", - "LabelHomePageSection2": "Home page section two:", - "LabelHomePageSection3": "Home page section three:", - "LabelHomePageSection4": "Home page section four:", + "LabelHomePageSection1": "Home page section 1:", + "LabelHomePageSection2": "Home page section 2:", + "LabelHomePageSection3": "Home page section 3:", + "LabelHomePageSection4": "Home page section 4:", "OptionMyViewsButtons": "My views (buttons)", "OptionMyViews": "My views", "OptionMyViewsSmall": "My views (small)", @@ -888,5 +888,7 @@ "ButtonSync": "Sync", "TabScheduledTasks": "Scheduled Tasks", "HeaderChapters": "Chapters", - "HeaderResumeSettings": "Resume Settings" + "HeaderResumeSettings": "Resume Settings", + "TabSync": "Sync", + "TitleUsers": "Users" } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/Server/nb.json b/MediaBrowser.Server.Implementations/Localization/Server/nb.json index c10e19102..165bf3f66 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/nb.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/nb.json @@ -767,10 +767,10 @@ "OptionAuto": "Auto", "OptionYes": "Yes", "OptionNo": "No", - "LabelHomePageSection1": "Home page section one:", - "LabelHomePageSection2": "Home page section two:", - "LabelHomePageSection3": "Home page section three:", - "LabelHomePageSection4": "Home page section four:", + "LabelHomePageSection1": "Home page section 1:", + "LabelHomePageSection2": "Home page section 2:", + "LabelHomePageSection3": "Home page section 3:", + "LabelHomePageSection4": "Home page section 4:", "OptionMyViewsButtons": "My views (buttons)", "OptionMyViews": "My views", "OptionMyViewsSmall": "My views (small)", @@ -888,5 +888,7 @@ "ButtonSync": "Sync", "TabScheduledTasks": "Scheduled Tasks", "HeaderChapters": "Chapters", - "HeaderResumeSettings": "Resume Settings" + "HeaderResumeSettings": "Resume Settings", + "TabSync": "Sync", + "TitleUsers": "Users" } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/Server/nl.json b/MediaBrowser.Server.Implementations/Localization/Server/nl.json index c1a871095..5862688a6 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/nl.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/nl.json @@ -39,7 +39,7 @@ "HeaderSetupLibrary": "Stel uw mediabibliotheek in", "ButtonAddMediaFolder": "Mediamap toevoegen", "LabelFolderType": "Maptype:", - "MediaFolderHelpPluginRequired": "* Hiervoor is het gebruik van een Invoegtoepassing vereist, bijvoorbeeld GameBrowser of MB Bookshelf.", + "MediaFolderHelpPluginRequired": "* Hiervoor is het gebruik van een Plug-in vereist, bijvoorbeeld GameBrowser of MB Bookshelf.", "ReferToMediaLibraryWiki": "Raadpleeg de mediabibliotheek wiki.", "LabelCountry": "Land:", "LabelLanguage": "Taal:", @@ -152,16 +152,16 @@ "OptionResumable": "Hervatbaar", "ScheduledTasksHelp": "Klik op een taak om het schema aan te passen.", "ScheduledTasksTitle": "Geplande taken", - "TabMyPlugins": "Mijn Invoegtoepassingen", + "TabMyPlugins": "Mijn Plug-ins", "TabCatalog": "Catalogus", - "PluginsTitle": "Invoegtoepassingen", + "PluginsTitle": "Plug-ins", "HeaderAutomaticUpdates": "Automatische updates", "HeaderNowPlaying": "Wordt nu afgespeeld", "HeaderLatestAlbums": "Nieuwste Albums", "HeaderLatestSongs": "Nieuwste Songs", "HeaderRecentlyPlayed": "Recent afgespeeld", "HeaderFrequentlyPlayed": "Vaak afgespeeld", - "DevBuildWarning": "Development versies zijn voor eigen risico. Ze worden vaak uitgegeven, deze versies zijn niet getest!. De Applicatie kan crashen en sommige functies kunnen mogelijk niet meer werken.", + "DevBuildWarning": "Development versies zijn geheel voor eigen risico. Deze versies worden vaak vrijgegeven en zijn niet getest!. De Applicatie kan crashen en sommige functies kunnen mogelijk niet meer werken.", "LabelVideoType": "Video Type:", "OptionBluray": "Blu-ray", "OptionDvd": "Dvd", @@ -249,11 +249,11 @@ "OptionRelease": "Offici\u00eble Release", "OptionBeta": "Beta", "OptionDev": "Dev (Instabiel)", - "LabelAllowServerAutoRestart": "Sta de server toe automatisch te herstarten om updates toe te passen", - "LabelAllowServerAutoRestartHelp": "De server zal alleen opnieuw op tijdens inactieve perioden, wanneer er geen gebruikers actief zijn.", + "LabelAllowServerAutoRestart": "Automatisch herstarten van de server toestaan om updates toe te passen", + "LabelAllowServerAutoRestartHelp": "De server zal alleen opnieuw opstarten tijdens inactieve perioden, wanneer er geen gebruikers actief zijn.", "LabelEnableDebugLogging": "Foutopsporings logboek inschakelen", "LabelRunServerAtStartup": "Start server bij het aanmelden", - "LabelRunServerAtStartupHelp": "Dit zal de applicatie starten als pictogram in het systeemvak tijdens het aanmelden van Windows. Om de Windows-service te starten, schakelt u deze uit en start u de service via het Configuratiescherm van Windows. Houd er rekening mee dat u de service en de applicatie niet tegelijk kunt uitvoeren, u moet dus eerst de applicatie sluiten alvorens u de service start.", + "LabelRunServerAtStartupHelp": "Dit start de applicatie als pictogram in het systeemvak tijdens het aanmelden van Windows. Om de Windows-service te starten, schakelt u deze uit en start u de service via het Configuratiescherm van Windows. Houd er rekening mee dat u de service en de applicatie niet tegelijk kunt uitvoeren, u moet dus eerst de applicatie sluiten alvorens u de service start.", "ButtonSelectDirectory": "Selecteer map", "LabelCustomPaths": "Geef aangepaste paden op waar gewenst. Laat velden leeg om de standaardinstellingen te gebruiken.", "LabelCachePath": "Cache pad:", @@ -333,10 +333,10 @@ "LabelNumberOfGuideDays": "Aantal dagen van de gids om te downloaden:", "LabelNumberOfGuideDaysHelp": "Het downloaden van meer dagen van de gids gegevens biedt de mogelijkheid verder vooruit te plannen en een beter overzicht geven, maar het zal ook langer duren om te downloaden. Auto kiest op basis van het aantal kanalen.", "LabelActiveService": "Actieve Service:", - "LabelActiveServiceHelp": "Er kunnen meerdere tv Invoegtoepassingen worden ge\u00efnstalleerd, maar er kan er slechts een per keer actief zijn.", + "LabelActiveServiceHelp": "Er kunnen meerdere tv Plug-ins worden ge\u00efnstalleerd, maar er kan er slechts een per keer actief zijn.", "OptionAutomatic": "Automatisch", - "LiveTvPluginRequired": "Een Live TV service provider Invoegtoepassing is vereist om door te gaan.", - "LiveTvPluginRequiredHelp": "Installeer a.u b een van onze beschikbare Invoegtoepassingen, zoals Next PVR of ServerWmc.", + "LiveTvPluginRequired": "Een Live TV service provider Plug-in is vereist om door te gaan.", + "LiveTvPluginRequiredHelp": "Installeer a.u b een van onze beschikbare Plug-ins, zoals Next PVR of ServerWmc.", "LabelCustomizeOptionsPerMediaType": "Aanpassen voor mediatype", "OptionDownloadThumbImage": "Miniatuur", "OptionDownloadMenuImage": "Menu", @@ -577,9 +577,9 @@ "HeaderNotificationList": "Klik op een melding om de opties voor het versturen ervan te configureren .", "NotificationOptionApplicationUpdateAvailable": "Programma-update beschikbaar", "NotificationOptionApplicationUpdateInstalled": "Programma-update ge\u00efnstalleerd", - "NotificationOptionPluginUpdateInstalled": "Invoegtoepassings-update ge\u00efnstalleerd", - "NotificationOptionPluginInstalled": "Invoegtoepassing ge\u00efnstalleerd", - "NotificationOptionPluginUninstalled": "Invoegtoepassing verwijderd", + "NotificationOptionPluginUpdateInstalled": "Plug-in-update ge\u00efnstalleerd", + "NotificationOptionPluginInstalled": "Plug-in ge\u00efnstalleerd", + "NotificationOptionPluginUninstalled": "Plug-in verwijderd", "NotificationOptionVideoPlayback": "Video afspelen gestart", "NotificationOptionAudioPlayback": "Audio afspelen gestart", "NotificationOptionGamePlayback": "Game gestart", @@ -590,7 +590,7 @@ "NotificationOptionInstallationFailed": "Mislukken van de installatie", "NotificationOptionNewLibraryContent": "Nieuwe content toegevoegd", "NotificationOptionNewLibraryContentMultiple": "Nieuwe content toegevoegd (meerdere)", - "SendNotificationHelp": "Meldingen worden geplaatst in de inbox op het dashboard. Blader door de Invoegtoepassings catalogus om aanvullende opties voor meldingen te installeren.", + "SendNotificationHelp": "Meldingen worden geplaatst in de inbox op het dashboard. Blader door de Plug-in catalogus om aanvullende opties voor meldingen te installeren.", "NotificationOptionServerRestartRequired": "Server herstart nodig", "LabelNotificationEnabled": "Deze melding inschakelen", "LabelMonitorUsers": "Monitor activiteit van:", @@ -600,10 +600,10 @@ "CategoryUser": "Gebruiker", "CategorySystem": "Systeem", "CategoryApplication": "Toepassing", - "CategoryPlugin": "Invoegtoepassing", + "CategoryPlugin": "Plug-in", "LabelMessageTitle": "Titel van het bericht:", "LabelAvailableTokens": "Beschikbaar tokens:", - "AdditionalNotificationServices": "Blader door de Invoegtoepassings catalogus om aanvullende meldingsdiensten te installeren.", + "AdditionalNotificationServices": "Blader door de Plug-in catalogus om aanvullende meldingsdiensten te installeren.", "OptionAllUsers": "Alle gebruikers", "OptionAdminUsers": "Beheerders", "OptionCustomUsers": "Aangepast", @@ -637,7 +637,7 @@ "ButtonPause": "Pauze", "LabelGroupMoviesIntoCollections": "Groepeer films in verzamelingen", "LabelGroupMoviesIntoCollectionsHelp": "Bij de weergave van film lijsten, zullen films die behoren tot een verzameling worden weergegeven als een gegroepeerd object.", - "NotificationOptionPluginError": "Invoegtoepassings fout", + "NotificationOptionPluginError": "Plug-in fout", "ButtonVolumeUp": "Volume omhoog", "ButtonVolumeDown": "Volume omlaag", "ButtonMute": "Dempen", @@ -723,7 +723,7 @@ "OptionReportByteRangeSeekingWhenTranscodingHelp": "Dit is vereist voor bepaalde apparaten die zo goed op tijd zoeken.", "HeaderSubtitleDownloadingHelp": "Bij het scannen van uw videobestanden kan Media Browser naar ontbrekende ondertiteling zoeken en deze downloaden bij ondertiteling providers zoals OpenSubtitles.org.", "HeaderDownloadSubtitlesFor": "Download ondertiteling voor:", - "MessageNoChapterProviders": "Installeer een hoofdstuk provider Invoegtoepassing zoals ChapterDb om extra hoofdstuk opties in te schakelen.", + "MessageNoChapterProviders": "Installeer een hoofdstuk provider Plug-in zoals ChapterDb om extra hoofdstuk opties in te schakelen.", "LabelSkipIfGraphicalSubsPresent": "Overslaan als de video al grafische ondertitels bevat", "LabelSkipIfGraphicalSubsPresentHelp": "Tekstversies houden van ondertitels zal resulteren in meer effici\u00ebnte levering aan mobiele clients.", "TabSubtitles": "Ondertiteling", @@ -731,7 +731,7 @@ "HeaderDownloadChaptersFor": "Download hoofdstuk namen voor:", "LabelOpenSubtitlesUsername": "Gebruikersnaam Open Subtitles:", "LabelOpenSubtitlesPassword": "Wachtwoord Open Subtitles:", - "HeaderChapterDownloadingHelp": "Wanneer Media Browser uw videobestanden scant kan het gebruiksvriendelijke namen voor hoofdstukken downloaden van het internet met behulp van hoofdstuk Invoegtoepassing zoals ChapterDb.", + "HeaderChapterDownloadingHelp": "Wanneer Media Browser uw videobestanden scant kan het gebruiksvriendelijke namen voor hoofdstukken downloaden van het internet met behulp van hoofdstuk Plug-in zoals ChapterDb.", "LabelPlayDefaultAudioTrack": "Speel standaard audio spoor ongeacht taal", "LabelSubtitlePlaybackMode": "Ondertitelingsmode:", "LabelDownloadLanguages": "Download talen:", @@ -741,8 +741,8 @@ "HeaderSendMessage": "Stuur bericht", "ButtonSend": "Stuur", "LabelMessageText": "Bericht tekst:", - "MessageNoAvailablePlugins": "Geen beschikbare Invoegtoepassingen.", - "LabelDisplayPluginsFor": "Toon Invoegtoepassingen voor:", + "MessageNoAvailablePlugins": "Geen beschikbare Plug-ins.", + "LabelDisplayPluginsFor": "Toon Plug-ins voor:", "PluginTabMediaBrowserClassic": "MB Classic", "PluginTabMediaBrowserTheater": "MB Theater", "LabelEpisodeName": "Naam aflevering", @@ -803,7 +803,7 @@ "LabelChannelDownloadPathHelp": "Geef een eigen download pad op als dit gewenst is, leeglaten voor dowloaden naar de interne program data map.", "LabelChannelDownloadAge": "Verwijder inhoud na: (dagen)", "LabelChannelDownloadAgeHelp": "Gedownloade inhoud die ouder is zal worden verwijderd. Afspelen via internet streaming blijft mogelijk.", - "ChannelSettingsFormHelp": "Installeer kanalen zoals Trailers en Vimeo in de Invoegtoepassings catalogus.", + "ChannelSettingsFormHelp": "Installeer kanalen zoals Trailers en Vimeo in de Plug-in catalogus.", "LabelSelectCollection": "Selecteer verzameling:", "ViewTypeMovies": "Films", "ViewTypeTvShows": "TV", @@ -888,5 +888,7 @@ "ButtonSync": "Sync", "TabScheduledTasks": "Geplande taken", "HeaderChapters": "Hoofdstukken", - "HeaderResumeSettings": "Resume Settings" + "HeaderResumeSettings": "Instellingen voor Hervatten", + "TabSync": "Sync", + "TitleUsers": "Users" } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/Server/pl.json b/MediaBrowser.Server.Implementations/Localization/Server/pl.json index 3032f71f0..135b640f2 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/pl.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/pl.json @@ -767,10 +767,10 @@ "OptionAuto": "Auto", "OptionYes": "Yes", "OptionNo": "No", - "LabelHomePageSection1": "Home page section one:", - "LabelHomePageSection2": "Home page section two:", - "LabelHomePageSection3": "Home page section three:", - "LabelHomePageSection4": "Home page section four:", + "LabelHomePageSection1": "Home page section 1:", + "LabelHomePageSection2": "Home page section 2:", + "LabelHomePageSection3": "Home page section 3:", + "LabelHomePageSection4": "Home page section 4:", "OptionMyViewsButtons": "My views (buttons)", "OptionMyViews": "My views", "OptionMyViewsSmall": "My views (small)", @@ -888,5 +888,7 @@ "ButtonSync": "Sync", "TabScheduledTasks": "Scheduled Tasks", "HeaderChapters": "Chapters", - "HeaderResumeSettings": "Resume Settings" + "HeaderResumeSettings": "Resume Settings", + "TabSync": "Sync", + "TitleUsers": "Users" } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/Server/pt_BR.json b/MediaBrowser.Server.Implementations/Localization/Server/pt_BR.json index a80d352b9..55d76aa8b 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/pt_BR.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/pt_BR.json @@ -190,7 +190,7 @@ "HeaderStatus": "Status", "OptionContinuing": "Em Exibi\u00e7\u00e3o", "OptionEnded": "Finalizada", - "HeaderAirDays": "Dias de Exibi\u00e7\u00e3o:", + "HeaderAirDays": "Dias de Exibi\u00e7\u00e3o", "OptionSunday": "Domingo", "OptionMonday": "Segunda-feira", "OptionTuesday": "Ter\u00e7a-feira", @@ -198,7 +198,7 @@ "OptionThursday": "Quinta-feira", "OptionFriday": "Sexta-feira", "OptionSaturday": "S\u00e1bado", - "HeaderManagement": "Gerenciamento:", + "HeaderManagement": "Gerenciamento", "LabelManagement": "Administra\u00e7\u00e3o:", "OptionMissingImdbId": "Faltando Id IMDb", "OptionMissingTvdbId": "Faltando Id TheTVDB", @@ -257,11 +257,11 @@ "ButtonSelectDirectory": "Selecionar Diret\u00f3rio", "LabelCustomPaths": "Defina caminhos personalizados. Deixe os campos em branco para usar o padr\u00e3o.", "LabelCachePath": "Caminho do cache:", - "LabelCachePathHelp": "Esta pasta cont\u00e9m arquivos de cache do servidor como, por exemplo, imagens.", + "LabelCachePathHelp": "Defina uma localiza\u00e7\u00e3o para os arquivos de cache como, por exemplo, imagens.", "LabelImagesByNamePath": "Caminho do Images by name:", - "LabelImagesByNamePathHelp": "Esta pasta cont\u00e9m imagens transferidas para ator, artista, g\u00eanero e est\u00fadio.", + "LabelImagesByNamePathHelp": "Defina uma localiza\u00e7\u00e3o para imagens baixadas para ator, artista, g\u00eanero e est\u00fadio.", "LabelMetadataPath": "Caminho dos Metadados:", - "LabelMetadataPathHelp": "Esta localiza\u00e7\u00e3o cont\u00e9m artwork e metadados transferidos que n\u00e3o foram configurados para serem armazenados nas pastas de m\u00eddia.", + "LabelMetadataPathHelp": "Defina uma localiza\u00e7\u00e3o para artwork e metadados baixados, caso n\u00e3o sejam salvos dentro das pastas de m\u00eddia.", "LabelTranscodingTempPath": "Caminho tempor\u00e1rio para transcodifica\u00e7\u00e3o:", "LabelTranscodingTempPathHelp": "Esta pasta cont\u00e9m arquivos ativos usados pelo transcodificador. Especifique um caminho personalizado ou deixe em branco para usar o padr\u00e3o dentro da pasta de dados do servidor.", "TabBasics": "B\u00e1sico", @@ -692,7 +692,7 @@ "LabelMaxBitrate": "Taxa de bits m\u00e1xima:", "LabelMaxBitrateHelp": "Especifique uma taxa de bits m\u00e1xima para ambientes com restri\u00e7\u00e3o de tamanho de banda, ou se o dispositivo imp\u00f5e esse limite.", "OptionIgnoreTranscodeByteRangeRequests": "Ignorar requisi\u00e7\u00f5es de extens\u00e3o do byte de transcodifica\u00e7\u00e3o", - "OptionIgnoreTranscodeByteRangeRequestsHelp": "Se ativado, estas requisi\u00e7\u00f5es ser\u00e3o honradas mas ir\u00e3o ignorar o cabe\u00e7alho da extens\u00e3o do byte.", + "OptionIgnoreTranscodeByteRangeRequestsHelp": "Se ativadas, estas requisi\u00e7\u00f5es ser\u00e3o honradas mas ir\u00e3o ignorar o cabe\u00e7alho da extens\u00e3o do byte.", "LabelFriendlyName": "Nome amig\u00e1vel", "LabelManufacturer": "Fabricante", "LabelManufacturerUrl": "Url do fabricante", @@ -834,7 +834,7 @@ "LabelXbmcMetadataEnablePathSubstitutionHelp": "Ativa a substitui\u00e7\u00e3o do caminho da imagem usando as configura\u00e7\u00f5es de suvbstitui\u00e7\u00e3o de caminho do servidor.", "LabelXbmcMetadataEnablePathSubstitutionHelp2": "Ver substitui\u00e7\u00e3o de caminho.", "LabelGroupChannelsIntoViews": "Exibir os seguintes canais diretamente dentro de minhas visualiza\u00e7\u00f5es:", - "LabelGroupChannelsIntoViewsHelp": "Se ativado, estes canais ser\u00e3o exibidos imediatamente ao lado de outras visualiza\u00e7\u00f5es. Se desativado, eles ser\u00e3o exibidos dentro de uma visualiza\u00e7\u00e3o separada de Canais.", + "LabelGroupChannelsIntoViewsHelp": "Se ativados, estes canais ser\u00e3o exibidos imediatamente ao lado de outras visualiza\u00e7\u00f5es. Se desativado, eles ser\u00e3o exibidos dentro de uma visualiza\u00e7\u00e3o separada de Canais.", "LabelDisplayCollectionsView": "Exibir uma visualiza\u00e7\u00e3o de cole\u00e7\u00f5es para mostrar colet\u00e2neas de filmes", "LabelXbmcMetadataEnableExtraThumbs": "Copiar extrafanart para dentro de extrathumbs", "LabelXbmcMetadataEnableExtraThumbsHelp": "Ao fazer o download de imagens elas podem ser salvas em ambas extrafanart e extrathumbs para uma maior compatibilidade com a skin do Xbmc.", @@ -842,7 +842,7 @@ "TabLogs": "Logs", "HeaderServerLogFiles": "Arquivos de log do servidor:", "TabBranding": "Marca", - "HeaderBrandingHelp": "Personalizar a apar\u00eancia do Media Browser para as necessidades de seu grupo ou organiza\u00e7\u00e3o.", + "HeaderBrandingHelp": "Personalize a apar\u00eancia do Media Browser para as necessidades de seu grupo ou organiza\u00e7\u00e3o.", "LabelLoginDisclaimer": "Aviso legal no login:", "LabelLoginDisclaimerHelp": "Isto ser\u00e1 exibido na parte inferior da p\u00e1gina de login.", "LabelAutomaticallyDonate": "Doar automaticamente esta quantidade a cada seis meses", @@ -880,13 +880,15 @@ "TabSort": "Ordenar", "TabFilter": "Filtro", "ButtonView": "Visualizar", - "LabelPageSize": "Tamanho de exibi\u00e7\u00e3o:", + "LabelPageSize": "Limite do item:", "LabelView": "Visualizar:", "TabUsers": "Usu\u00e1rios", "HeaderFeatures": "Inclui", "HeaderAdvanced": "Avan\u00e7ado", - "ButtonSync": "Sync", + "ButtonSync": "Sincronizar", "TabScheduledTasks": "Tarefas Agendadas", - "HeaderChapters": "Chapters", - "HeaderResumeSettings": "Resume Settings" + "HeaderChapters": "Cap\u00edtulos", + "HeaderResumeSettings": "Ajustes para Retomar", + "TabSync": "Sync", + "TitleUsers": "Users" } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/Server/pt_PT.json b/MediaBrowser.Server.Implementations/Localization/Server/pt_PT.json index 83e82070a..966365f7c 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/pt_PT.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/pt_PT.json @@ -767,10 +767,10 @@ "OptionAuto": "Auto", "OptionYes": "Yes", "OptionNo": "No", - "LabelHomePageSection1": "Home page section one:", - "LabelHomePageSection2": "Home page section two:", - "LabelHomePageSection3": "Home page section three:", - "LabelHomePageSection4": "Home page section four:", + "LabelHomePageSection1": "Home page section 1:", + "LabelHomePageSection2": "Home page section 2:", + "LabelHomePageSection3": "Home page section 3:", + "LabelHomePageSection4": "Home page section 4:", "OptionMyViewsButtons": "My views (buttons)", "OptionMyViews": "My views", "OptionMyViewsSmall": "My views (small)", @@ -888,5 +888,7 @@ "ButtonSync": "Sync", "TabScheduledTasks": "Scheduled Tasks", "HeaderChapters": "Chapters", - "HeaderResumeSettings": "Resume Settings" + "HeaderResumeSettings": "Resume Settings", + "TabSync": "Sync", + "TitleUsers": "Users" } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/Server/ru.json b/MediaBrowser.Server.Implementations/Localization/Server/ru.json index abdb98e97..c5ea589e8 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/ru.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/ru.json @@ -322,7 +322,7 @@ "HeaderActiveRecordings": "\u0410\u043a\u0442\u0438\u0432\u043d\u044b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438", "HeaderLatestRecordings": "\u041d\u043e\u0432\u0438\u043d\u043a\u0438 \u0437\u0430\u043f\u0438\u0441\u0435\u0439", "HeaderAllRecordings": "\u0412\u0441\u0435 \u0437\u0430\u043f\u0438\u0441\u0438", - "ButtonPlay": "\u0412\u043e\u0441\u043f\u0440", + "ButtonPlay": "\u0412\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0441\u0442\u0438", "ButtonEdit": "\u041f\u0440\u0430\u0432\u0438\u0442\u044c", "ButtonRecord": "\u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c", "ButtonDelete": "\u0423\u0434\u0430\u043b\u0438\u0442\u044c", @@ -551,7 +551,7 @@ "LabelSupporterKey": "\u041a\u043b\u044e\u0447 \u0441\u043f\u043e\u043d\u0441\u043e\u0440\u0430 (\u0432\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0438\u0437 \u043f\u0438\u0441\u044c\u043c\u0430 \u043f\u043e \u042d-\u043f\u043e\u0447\u0442\u0435)", "LabelSupporterKeyHelp": "\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u043a\u043b\u044e\u0447 \u0441\u043f\u043e\u043d\u0441\u043e\u0440\u0430, \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0447\u0430\u0442\u044c \u043d\u0430\u0441\u043b\u0430\u0436\u0434\u0430\u0442\u044c\u0441\u044f \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c\u0438 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u044b\u043b\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u044b \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u043e\u043c \u0434\u043b\u044f Media Browser.", "MessageInvalidKey": "\u041a\u043b\u044e\u0447 \u0441\u043f\u043e\u043d\u0441\u043e\u0440\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0438\u043b\u0438 \u043d\u0435\u0432\u0435\u0440\u0435\u043d", - "ErrorMessageInvalidKey": "\u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043b\u044e\u0431\u043e\u0435 \u043f\u0440\u0435\u043c\u0438\u0443\u043c \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435, \u0432\u044b \u0442\u0430\u043a\u0436\u0435 \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0441\u043f\u043e\u043d\u0441\u043e\u0440\u043e\u043c Media Browser. \u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u0434\u0430\u0440\u0441\u0442\u0432\u0443\u0439\u0442\u0435 \u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0439\u0442\u0435 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u044e\u0449\u0435\u0435\u0441\u044f \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u0435 \u043e\u0441\u043d\u043e\u0432\u043e\u043f\u043e\u043b\u0430\u0433\u0430\u044e\u0449\u0435\u0433\u043e \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0430. \u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u0438\u043c \u0432\u0430\u0441.", + "ErrorMessageInvalidKey": "\u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043b\u044e\u0431\u043e\u0435 \u043f\u0440\u0435\u043c\u0438\u0443\u043c \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435, \u0432\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0442\u0430\u043a\u0436\u0435 \u0441\u043f\u043e\u043d\u0441\u043e\u0440\u043e\u043c Media Browser. \u0416\u0435\u0440\u0442\u0432\u0443\u0439\u0442\u0435 \u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0439\u0442\u0435 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0443\u044e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u043e\u0441\u043d\u043e\u0432\u043e\u043f\u043e\u043b\u0430\u0433\u0430\u044e\u0449\u0435\u0433\u043e \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0430.", "HeaderDisplaySettings": "\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f", "TabPlayTo": "\u0412\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0441\u0442\u0438 \u041d\u0430", "LabelEnableDlnaServer": "\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c DLNA-\u0441\u0435\u0440\u0432\u0435\u0440", @@ -845,8 +845,8 @@ "HeaderBrandingHelp": "\u041f\u043e\u0434\u0433\u043e\u043d\u043a\u0430 \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u0432\u0438\u0434\u0430 Media Browser \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441 \u043f\u043e\u0442\u0440\u0435\u0431\u043d\u043e\u0441\u0442\u044f\u043c\u0438 \u0432\u0430\u0448\u0435\u0439 \u0433\u0440\u0443\u043f\u043f\u044b \u0438\u043b\u0438 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438.", "LabelLoginDisclaimer": "\u041e\u0433\u043e\u0432\u043e\u0440\u043a\u0430 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435 \u0432\u0445\u043e\u0434\u0430:", "LabelLoginDisclaimerHelp": "\u042d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c\u0441\u044f \u0432 \u043d\u0438\u0436\u043d\u0435\u0439 \u0447\u0430\u0441\u0442\u0438 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0432\u0445\u043e\u0434\u0430 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443.", - "LabelAutomaticallyDonate": "\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0434\u0430\u0440\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u0443\u044e \u0441\u0443\u043c\u043c\u0443 \u043a\u0430\u0436\u0434\u044b\u0435 \u0448\u0435\u0441\u0442\u044c \u043c\u0435\u0441\u044f\u0446\u0435\u0432", - "LabelAutomaticallyDonateHelp": "\u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0432 \u043b\u044e\u0431\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043f\u0440\u0435\u043a\u0440\u0430\u0442\u0438\u0442\u044c \u044d\u0442\u043e \u0447\u0435\u0440\u0435\u0437 \u0441\u0432\u043e\u044e \u0443\u0447\u0435\u0442\u043d\u0443\u044e \u0437\u0430\u043f\u0438\u0441\u044c PayPal.", + "LabelAutomaticallyDonate": "\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0436\u0435\u0440\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u0443\u044e \u0441\u0443\u043c\u043c\u0443 \u043a\u0430\u0436\u0434\u044b\u0435 \u0448\u0435\u0441\u0442\u044c \u043c\u0435\u0441\u044f\u0446\u0435\u0432", + "LabelAutomaticallyDonateHelp": "\u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0432 \u043b\u044e\u0431\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u044d\u0442\u043e \u0447\u0435\u0440\u0435\u0437 \u0441\u0432\u043e\u044e \u0443\u0447\u0435\u0442\u043d\u0443\u044e \u0437\u0430\u043f\u0438\u0441\u044c PayPal.", "OptionList": "\u0421\u043f\u0438\u0441\u043e\u043a", "TabDashboard": "\u0418\u043d\u0444\u043e\u043f\u0430\u043d\u0435\u043b\u044c", "TitleServer": "\u0421\u0435\u0440\u0432\u0435\u0440", @@ -878,15 +878,17 @@ "OptionSubstring": "\u041f\u043e\u0434\u0441\u0442\u0440\u043e\u043a\u0430", "TabView": "\u0412\u0438\u0434", "TabSort": "\u0421\u043e\u0440\u0442-\u043a\u0430", - "TabFilter": "\u0424\u0438\u043b\u044c\u0442\u0440-\u043a\u0430", + "TabFilter": "\u0424\u0438\u043b\u044c\u0442\u0440\u044b", "ButtonView": "\u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c", "LabelPageSize": "\u041c\u0430\u043a\u0441. \u0447\u0438\u0441\u043b\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432:", - "LabelView": "\u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440:", + "LabelView": "\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435:", "TabUsers": "\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438", "HeaderFeatures": "\u041c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u044b", "HeaderAdvanced": "\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e", - "ButtonSync": "\u0421\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c", + "ButtonSync": "\u0421\u0438\u043d\u0445\u0440\u043e", "TabScheduledTasks": "\u041f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a", "HeaderChapters": "\u0421\u0446\u0435\u043d\u044b", - "HeaderResumeSettings": "\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0432\u043e\u0437\u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f" + "HeaderResumeSettings": "\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0432\u043e\u0437\u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f", + "TabSync": "Sync", + "TitleUsers": "Users" } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/Server/server.json b/MediaBrowser.Server.Implementations/Localization/Server/server.json index 3a49024f9..8b3a5e8c9 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/server.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/server.json @@ -781,10 +781,10 @@ "OptionAuto": "Auto", "OptionYes": "Yes", "OptionNo": "No", - "LabelHomePageSection1": "Home page section one:", - "LabelHomePageSection2": "Home page section two:", - "LabelHomePageSection3": "Home page section three:", - "LabelHomePageSection4": "Home page section four:", + "LabelHomePageSection1": "Home page section 1:", + "LabelHomePageSection2": "Home page section 2:", + "LabelHomePageSection3": "Home page section 3:", + "LabelHomePageSection4": "Home page section 4:", "OptionMyViewsButtons": "My views (buttons)", "OptionMyViews": "My views", "OptionMyViewsSmall": "My views (small)", @@ -897,11 +897,13 @@ "ButtonView": "View", "LabelPageSize": "Item limit:", "LabelView": "View:", - "TabUsers": "Users", - "HeaderFeatures": "Features", - "HeaderAdvanced": "Advanced", - "ButtonSync": "Sync", - "TabScheduledTasks": "Scheduled Tasks", - "HeaderChapters": "Chapters", - "HeaderResumeSettings": "Resume Settings" + "TabUsers": "Users", + "HeaderFeatures": "Features", + "HeaderAdvanced": "Advanced", + "ButtonSync": "Sync", + "TabScheduledTasks": "Scheduled Tasks", + "HeaderChapters": "Chapters", + "HeaderResumeSettings": "Resume Settings", + "TabSync": "Sync", + "TitleUsers": "Users" } diff --git a/MediaBrowser.Server.Implementations/Localization/Server/sv.json b/MediaBrowser.Server.Implementations/Localization/Server/sv.json index 9988af0fa..c6c042640 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/sv.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/sv.json @@ -888,5 +888,7 @@ "ButtonSync": "Sync", "TabScheduledTasks": "Scheduled Tasks", "HeaderChapters": "Chapters", - "HeaderResumeSettings": "Resume Settings" + "HeaderResumeSettings": "Resume Settings", + "TabSync": "Sync", + "TitleUsers": "Users" } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/Server/vi.json b/MediaBrowser.Server.Implementations/Localization/Server/vi.json index 98f108421..17748ecc7 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/vi.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/vi.json @@ -767,10 +767,10 @@ "OptionAuto": "Auto", "OptionYes": "Yes", "OptionNo": "No", - "LabelHomePageSection1": "Home page section one:", - "LabelHomePageSection2": "Home page section two:", - "LabelHomePageSection3": "Home page section three:", - "LabelHomePageSection4": "Home page section four:", + "LabelHomePageSection1": "Home page section 1:", + "LabelHomePageSection2": "Home page section 2:", + "LabelHomePageSection3": "Home page section 3:", + "LabelHomePageSection4": "Home page section 4:", "OptionMyViewsButtons": "My views (buttons)", "OptionMyViews": "My views", "OptionMyViewsSmall": "My views (small)", @@ -888,5 +888,7 @@ "ButtonSync": "Sync", "TabScheduledTasks": "Scheduled Tasks", "HeaderChapters": "Chapters", - "HeaderResumeSettings": "Resume Settings" + "HeaderResumeSettings": "Resume Settings", + "TabSync": "Sync", + "TitleUsers": "Users" } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/Server/zh_TW.json b/MediaBrowser.Server.Implementations/Localization/Server/zh_TW.json index 6511dd7d0..352a031e1 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/zh_TW.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/zh_TW.json @@ -767,10 +767,10 @@ "OptionAuto": "Auto", "OptionYes": "Yes", "OptionNo": "No", - "LabelHomePageSection1": "Home page section one:", - "LabelHomePageSection2": "Home page section two:", - "LabelHomePageSection3": "Home page section three:", - "LabelHomePageSection4": "Home page section four:", + "LabelHomePageSection1": "Home page section 1:", + "LabelHomePageSection2": "Home page section 2:", + "LabelHomePageSection3": "Home page section 3:", + "LabelHomePageSection4": "Home page section 4:", "OptionMyViewsButtons": "My views (buttons)", "OptionMyViews": "My views", "OptionMyViewsSmall": "My views (small)", @@ -888,5 +888,7 @@ "ButtonSync": "Sync", "TabScheduledTasks": "Scheduled Tasks", "HeaderChapters": "Chapters", - "HeaderResumeSettings": "Resume Settings" + "HeaderResumeSettings": "Resume Settings", + "TabSync": "Sync", + "TitleUsers": "Users" } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj b/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj index 9655771c6..ef6730b75 100644 --- a/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj +++ b/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj @@ -45,9 +45,9 @@ v4.5 - + False - ..\packages\Mono.Nat.1.2.20.0\lib\net40\Mono.Nat.dll + ..\packages\Mono.Nat.1.2.21.0\lib\net40\Mono.Nat.dll ..\ThirdParty\Nowin\Nowin.dll @@ -274,6 +274,7 @@ + diff --git a/MediaBrowser.Server.Implementations/Sync/SyncManager.cs b/MediaBrowser.Server.Implementations/Sync/SyncManager.cs index 50f1030f3..a8d723ce3 100644 --- a/MediaBrowser.Server.Implementations/Sync/SyncManager.cs +++ b/MediaBrowser.Server.Implementations/Sync/SyncManager.cs @@ -1,9 +1,14 @@ using MediaBrowser.Common.Extensions; +using MediaBrowser.Controller.Drawing; using MediaBrowser.Controller.Entities; +using MediaBrowser.Controller.Entities.Audio; +using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Sync; using MediaBrowser.Model.Entities; +using MediaBrowser.Model.Logging; using MediaBrowser.Model.Querying; using MediaBrowser.Model.Sync; +using MoreLinq; using System; using System.Collections.Generic; using System.Linq; @@ -13,56 +18,131 @@ namespace MediaBrowser.Server.Implementations.Sync { public class SyncManager : ISyncManager { - private ISyncProvider[] _providers = new ISyncProvider[] { }; + private readonly ILibraryManager _libraryManager; + private readonly ISyncRepository _repo; + private readonly IImageProcessor _imageProcessor; + private readonly ILogger _logger; + + private ISyncProvider[] _providers = { }; + + public SyncManager(ILibraryManager libraryManager, ISyncRepository repo, IImageProcessor imageProcessor, ILogger logger) + { + _libraryManager = libraryManager; + _repo = repo; + _imageProcessor = imageProcessor; + _logger = logger; + } public void AddParts(IEnumerable providers) { _providers = providers.ToArray(); } - public Task> CreateJob(SyncJobRequest request) + public async Task CreateJob(SyncJobRequest request) { - throw new NotImplementedException(); + var items = GetItemsForSync(request.ItemIds).ToList(); + + if (items.Count == 1) + { + request.Name = GetDefaultName(items[0]); + } + + if (string.IsNullOrWhiteSpace(request.Name)) + { + throw new ArgumentException("Please supply a name for the sync job."); + } + + var target = GetSyncTargets(request.UserId) + .First(i => string.Equals(request.TargetId, i.Id)); + + var jobId = Guid.NewGuid().ToString("N"); + + var job = new SyncJob + { + Id = jobId, + Name = request.Name, + TargetId = target.Id, + UserId = request.UserId, + UnwatchedOnly = request.UnwatchedOnly, + Limit = request.Limit, + LimitType = request.LimitType, + RequestedItemIds = request.ItemIds, + DateCreated = DateTime.UtcNow, + DateLastModified = DateTime.UtcNow + }; + + await _repo.Create(job).ConfigureAwait(false); + + return new SyncJobCreationResult + { + Job = GetJob(jobId) + }; } public QueryResult GetJobs(SyncJobQuery query) { - throw new NotImplementedException(); - } + var result = _repo.GetJobs(query); - public QueryResult GetSchedules(SyncScheduleQuery query) - { - throw new NotImplementedException(); - } + result.Items.ForEach(FillMetadata); - public Task CancelJob(string id) - { - throw new NotImplementedException(); + return result; } - public Task CancelSchedule(string id) + private void FillMetadata(SyncJob job) { - throw new NotImplementedException(); + var item = GetItemsForSync(job.RequestedItemIds) + .FirstOrDefault(); + + if (item != null) + { + var hasSeries = item as IHasSeries; + if (hasSeries != null) + { + job.ParentName = hasSeries.SeriesName; + } + + var hasAlbumArtist = item as IHasAlbumArtist; + if (hasAlbumArtist != null) + { + job.ParentName = hasAlbumArtist.AlbumArtists.FirstOrDefault(); + } + + var primaryImage = item.GetImageInfo(ImageType.Primary, 0); + + if (primaryImage != null) + { + try + { + job.PrimaryImageTag = _imageProcessor.GetImageCacheTag(item, ImageType.Primary); + job.PrimaryImageItemId = item.Id.ToString("N"); + + } + catch (Exception ex) + { + _logger.ErrorException("Error getting image info", ex); + } + } + } } - public SyncJob GetJob(string id) + public Task CancelJob(string id) { throw new NotImplementedException(); } - public SyncSchedule GetSchedule(string id) + public SyncJob GetJob(string id) { - throw new NotImplementedException(); + return _repo.GetJob(id); } public IEnumerable GetSyncTargets(string userId) { return _providers - .SelectMany(GetSyncTargets) + .SelectMany(i => GetSyncTargets(i, userId)) .OrderBy(i => i.Name); } - private IEnumerable GetSyncTargets(ISyncProvider provider) + private IEnumerable GetSyncTargets(ISyncProvider provider, string userId) { var providerId = GetSyncProviderId(provider); @@ -120,5 +200,37 @@ namespace MediaBrowser.Server.Implementations.Sync return false; } + + private IEnumerable GetItemsForSync(IEnumerable itemIds) + { + return itemIds.SelectMany(GetItemsForSync).DistinctBy(i => i.Id); + } + + private IEnumerable GetItemsForSync(string id) + { + var item = _libraryManager.GetItemById(id); + + if (item == null) + { + throw new ArgumentException("Item with Id " + id + " not found."); + } + + if (!SupportsSync(item)) + { + throw new ArgumentException("Item with Id " + id + " does not support sync."); + } + + return GetItemsForSync(item); + } + + private IEnumerable GetItemsForSync(BaseItem item) + { + return new[] { item }; + } + + private string GetDefaultName(BaseItem item) + { + return item.Name; + } } } diff --git a/MediaBrowser.Server.Implementations/Sync/SyncRepository.cs b/MediaBrowser.Server.Implementations/Sync/SyncRepository.cs new file mode 100644 index 000000000..bb22e992b --- /dev/null +++ b/MediaBrowser.Server.Implementations/Sync/SyncRepository.cs @@ -0,0 +1,429 @@ +using MediaBrowser.Controller; +using MediaBrowser.Controller.Sync; +using MediaBrowser.Model.Logging; +using MediaBrowser.Model.Querying; +using MediaBrowser.Model.Sync; +using MediaBrowser.Server.Implementations.Persistence; +using System; +using System.Collections.Generic; +using System.Data; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; + +namespace MediaBrowser.Server.Implementations.Sync +{ + public class SyncRepository : ISyncRepository + { + private IDbConnection _connection; + private readonly ILogger _logger; + private readonly SemaphoreSlim _writeLock = new SemaphoreSlim(1, 1); + private readonly IServerApplicationPaths _appPaths; + private readonly CultureInfo _usCulture = new CultureInfo("en-US"); + + private IDbCommand _saveJobCommand; + private IDbCommand _saveJobItemCommand; + + public SyncRepository(ILogger logger, IServerApplicationPaths appPaths) + { + _logger = logger; + _appPaths = appPaths; + } + + public async Task Initialize() + { + var dbFile = Path.Combine(_appPaths.DataPath, "sync.db"); + + _connection = await SqliteExtensions.ConnectToDb(dbFile, _logger).ConfigureAwait(false); + + string[] queries = { + + "create table if not exists SyncJobs (Id GUID PRIMARY KEY, TargetId TEXT NOT NULL, Name TEXT NOT NULL, Quality TEXT NOT NULL, Status TEXT NOT NULL, Progress FLOAT, UserId TEXT NOT NULL, ItemIds TEXT NOT NULL, UnwatchedOnly BIT, SyncLimit BigInt, LimitType TEXT, IsDynamic BIT, DateCreated DateTime, DateLastModified DateTime, ItemCount int)", + "create index if not exists idx_SyncJobs on SyncJobs(Id)", + + "create table if not exists SyncJobItems (Id GUID PRIMARY KEY, ItemId TEXT, JobId TEXT, OutputPath TEXT, Status TEXT, TargetId TEXT)", + "create index if not exists idx_SyncJobItems on SyncJobs(Id)", + + //pragmas + "pragma temp_store = memory", + + "pragma shrink_memory" + }; + + _connection.RunQueries(queries, _logger); + + PrepareStatements(); + } + + private void PrepareStatements() + { + _saveJobCommand = _connection.CreateCommand(); + _saveJobCommand.CommandText = "replace into SyncJobs (Id, TargetId, Name, Quality, Status, Progress, UserId, ItemIds, UnwatchedOnly, SyncLimit, LimitType, IsDynamic, DateCreated, DateLastModified, ItemCount) values (@Id, @TargetId, @Name, @Quality, @Status, @Progress, @UserId, @ItemIds, @UnwatchedOnly, @SyncLimit, @LimitType, @IsDynamic, @DateCreated, @DateLastModified, @ItemCount)"; + + _saveJobCommand.Parameters.Add(_saveJobCommand, "@Id"); + _saveJobCommand.Parameters.Add(_saveJobCommand, "@TargetId"); + _saveJobCommand.Parameters.Add(_saveJobCommand, "@Name"); + _saveJobCommand.Parameters.Add(_saveJobCommand, "@Quality"); + _saveJobCommand.Parameters.Add(_saveJobCommand, "@Status"); + _saveJobCommand.Parameters.Add(_saveJobCommand, "@Progress"); + _saveJobCommand.Parameters.Add(_saveJobCommand, "@UserId"); + _saveJobCommand.Parameters.Add(_saveJobCommand, "@ItemIds"); + _saveJobCommand.Parameters.Add(_saveJobCommand, "@UnwatchedOnly"); + _saveJobCommand.Parameters.Add(_saveJobCommand, "@SyncLimit"); + _saveJobCommand.Parameters.Add(_saveJobCommand, "@LimitType"); + _saveJobCommand.Parameters.Add(_saveJobCommand, "@IsDynamic"); + _saveJobCommand.Parameters.Add(_saveJobCommand, "@DateCreated"); + _saveJobCommand.Parameters.Add(_saveJobCommand, "@DateLastModified"); + _saveJobCommand.Parameters.Add(_saveJobCommand, "@ItemCount"); + + _saveJobItemCommand = _connection.CreateCommand(); + _saveJobItemCommand.CommandText = "replace into SyncJobItems (Id, ItemId, JobId, OutputPath, Status, TargetId) values (@Id, @ItemId, @JobId, @OutputPath, @Status, @TargetId)"; + + _saveJobItemCommand.Parameters.Add(_saveJobCommand, "@Id"); + _saveJobItemCommand.Parameters.Add(_saveJobCommand, "@ItemId"); + _saveJobItemCommand.Parameters.Add(_saveJobCommand, "@JobId"); + _saveJobItemCommand.Parameters.Add(_saveJobCommand, "@OutputPath"); + _saveJobItemCommand.Parameters.Add(_saveJobCommand, "@Status"); + } + + private const string BaseJobSelectText = "select Id, TargetId, Name, Quality, Status, Progress, UserId, ItemIds, UnwatchedOnly, SyncLimit, LimitType, IsDynamic, DateCreated, DateLastModified, ItemCount from SyncJobs"; + private const string BaseJobItemSelectText = "select Id, ItemId, JobId, OutputPath, Status, TargetId from SyncJobItems"; + + public SyncJob GetJob(string id) + { + if (string.IsNullOrEmpty(id)) + { + throw new ArgumentNullException("id"); + } + + var guid = new Guid(id); + + using (var cmd = _connection.CreateCommand()) + { + cmd.CommandText = BaseJobSelectText + " where Id=@Id"; + + cmd.Parameters.Add(cmd, "@Id", DbType.Guid).Value = guid; + + using (var reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess | CommandBehavior.SingleResult | CommandBehavior.SingleRow)) + { + if (reader.Read()) + { + return GetJob(reader); + } + } + } + + return null; + } + + private SyncJob GetJob(IDataReader reader) + { + var info = new SyncJob + { + Id = reader.GetGuid(0).ToString("N"), + TargetId = reader.GetString(1), + Name = reader.GetString(2) + }; + + if (!reader.IsDBNull(3)) + { + info.Quality = (SyncQuality)Enum.Parse(typeof(SyncQuality), reader.GetString(3), true); + } + + if (!reader.IsDBNull(4)) + { + info.Status = (SyncJobStatus)Enum.Parse(typeof(SyncJobStatus), reader.GetString(4), true); + } + + if (!reader.IsDBNull(5)) + { + info.Progress = reader.GetDouble(5); + } + + if (!reader.IsDBNull(6)) + { + info.UserId = reader.GetString(6); + } + + if (!reader.IsDBNull(7)) + { + info.RequestedItemIds = reader.GetString(7).Split(',').ToList(); + } + + if (!reader.IsDBNull(8)) + { + info.UnwatchedOnly = reader.GetBoolean(8); + } + + if (!reader.IsDBNull(9)) + { + info.Limit = reader.GetInt64(9); + } + + if (!reader.IsDBNull(10)) + { + info.LimitType = (SyncLimitType)Enum.Parse(typeof(SyncLimitType), reader.GetString(10), true); + } + + info.IsDynamic = reader.GetBoolean(11); + info.DateCreated = reader.GetDateTime(12).ToUniversalTime(); + info.DateLastModified = reader.GetDateTime(13).ToUniversalTime(); + info.ItemCount = reader.GetInt32(14); + + return info; + } + + public Task Create(SyncJob job) + { + return Update(job); + } + + public async Task Update(SyncJob job) + { + if (job == null) + { + throw new ArgumentNullException("job"); + } + + await _writeLock.WaitAsync().ConfigureAwait(false); + + IDbTransaction transaction = null; + + try + { + transaction = _connection.BeginTransaction(); + + var index = 0; + + _saveJobCommand.GetParameter(index++).Value = new Guid(job.Id); + _saveJobCommand.GetParameter(index++).Value = job.TargetId; + _saveJobCommand.GetParameter(index++).Value = job.Name; + _saveJobCommand.GetParameter(index++).Value = job.Quality; + _saveJobCommand.GetParameter(index++).Value = job.Status; + _saveJobCommand.GetParameter(index++).Value = job.Progress; + _saveJobCommand.GetParameter(index++).Value = job.UserId; + _saveJobCommand.GetParameter(index++).Value = string.Join(",", job.RequestedItemIds.ToArray()); + _saveJobCommand.GetParameter(index++).Value = job.UnwatchedOnly; + _saveJobCommand.GetParameter(index++).Value = job.Limit; + _saveJobCommand.GetParameter(index++).Value = job.LimitType; + _saveJobCommand.GetParameter(index++).Value = job.IsDynamic; + _saveJobCommand.GetParameter(index++).Value = job.DateCreated; + _saveJobCommand.GetParameter(index++).Value = job.DateLastModified; + _saveJobCommand.GetParameter(index++).Value = job.ItemCount; + + _saveJobCommand.Transaction = transaction; + + _saveJobCommand.ExecuteNonQuery(); + + transaction.Commit(); + } + catch (OperationCanceledException) + { + if (transaction != null) + { + transaction.Rollback(); + } + + throw; + } + catch (Exception e) + { + _logger.ErrorException("Failed to save record:", e); + + if (transaction != null) + { + transaction.Rollback(); + } + + throw; + } + finally + { + if (transaction != null) + { + transaction.Dispose(); + } + + _writeLock.Release(); + } + } + + public QueryResult GetJobs(SyncJobQuery query) + { + if (query == null) + { + throw new ArgumentNullException("query"); + } + + using (var cmd = _connection.CreateCommand()) + { + cmd.CommandText = BaseJobSelectText; + + var whereClauses = new List(); + + var startIndex = query.StartIndex ?? 0; + + if (startIndex > 0) + { + whereClauses.Add(string.Format("Id NOT IN (SELECT Id FROM SyncJobs ORDER BY DateLastModified DESC LIMIT {0})", + startIndex.ToString(_usCulture))); + } + + if (whereClauses.Count > 0) + { + cmd.CommandText += " where " + string.Join(" AND ", whereClauses.ToArray()); + } + + cmd.CommandText += " ORDER BY DateLastModified DESC"; + + if (query.Limit.HasValue) + { + cmd.CommandText += " LIMIT " + query.Limit.Value.ToString(_usCulture); + } + + cmd.CommandText += "; select count (Id) from SyncJobs"; + + var list = new List(); + var count = 0; + + using (var reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess)) + { + while (reader.Read()) + { + list.Add(GetJob(reader)); + } + + if (reader.NextResult() && reader.Read()) + { + count = reader.GetInt32(0); + } + } + + return new QueryResult() + { + Items = list.ToArray(), + TotalRecordCount = count + }; + } + } + + public SyncJobItem GetJobItem(string id) + { + if (string.IsNullOrEmpty(id)) + { + throw new ArgumentNullException("id"); + } + + var guid = new Guid(id); + + using (var cmd = _connection.CreateCommand()) + { + cmd.CommandText = BaseJobItemSelectText + " where Id=@Id"; + + cmd.Parameters.Add(cmd, "@Id", DbType.Guid).Value = guid; + + using (var reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess | CommandBehavior.SingleResult | CommandBehavior.SingleRow)) + { + if (reader.Read()) + { + return GetSyncJobItem(reader); + } + } + } + + return null; + } + + public Task Create(SyncJobItem jobItem) + { + return Update(jobItem); + } + + public async Task Update(SyncJobItem jobItem) + { + if (jobItem == null) + { + throw new ArgumentNullException("jobItem"); + } + + await _writeLock.WaitAsync().ConfigureAwait(false); + + IDbTransaction transaction = null; + + try + { + transaction = _connection.BeginTransaction(); + + var index = 0; + + _saveJobItemCommand.GetParameter(index++).Value = new Guid(jobItem.Id); + _saveJobItemCommand.GetParameter(index++).Value = jobItem.ItemId; + _saveJobItemCommand.GetParameter(index++).Value = jobItem.JobId; + _saveJobItemCommand.GetParameter(index++).Value = jobItem.OutputPath; + _saveJobItemCommand.GetParameter(index++).Value = jobItem.Status; + _saveJobItemCommand.GetParameter(index++).Value = jobItem.TargetId; + + _saveJobItemCommand.Transaction = transaction; + + _saveJobItemCommand.ExecuteNonQuery(); + + transaction.Commit(); + } + catch (OperationCanceledException) + { + if (transaction != null) + { + transaction.Rollback(); + } + + throw; + } + catch (Exception e) + { + _logger.ErrorException("Failed to save record:", e); + + if (transaction != null) + { + transaction.Rollback(); + } + + throw; + } + finally + { + if (transaction != null) + { + transaction.Dispose(); + } + + _writeLock.Release(); + } + } + + private SyncJobItem GetSyncJobItem(IDataReader reader) + { + var info = new SyncJobItem + { + Id = reader.GetGuid(0).ToString("N"), + ItemId = reader.GetString(1), + JobId = reader.GetString(2) + }; + + if (!reader.IsDBNull(3)) + { + info.OutputPath = reader.GetString(3); + } + + if (!reader.IsDBNull(4)) + { + info.Status = (SyncJobStatus)Enum.Parse(typeof(SyncJobStatus), reader.GetString(4), true); + } + + info.TargetId = reader.GetString(5); + + return info; + } + } +} diff --git a/MediaBrowser.Server.Implementations/packages.config b/MediaBrowser.Server.Implementations/packages.config index 907500ae3..18739ddb3 100644 --- a/MediaBrowser.Server.Implementations/packages.config +++ b/MediaBrowser.Server.Implementations/packages.config @@ -1,6 +1,6 @@  - + \ No newline at end of file diff --git a/MediaBrowser.ServerApplication/ApplicationHost.cs b/MediaBrowser.ServerApplication/ApplicationHost.cs index 55843bbdb..5c086c8cc 100644 --- a/MediaBrowser.ServerApplication/ApplicationHost.cs +++ b/MediaBrowser.ServerApplication/ApplicationHost.cs @@ -209,6 +209,7 @@ namespace MediaBrowser.ServerApplication private IUserViewManager UserViewManager { get; set; } private IAuthenticationRepository AuthenticationRepository { get; set; } + private ISyncRepository SyncRepository { get; set; } /// /// Initializes a new instance of the class. @@ -525,6 +526,9 @@ namespace MediaBrowser.ServerApplication AuthenticationRepository = await GetAuthenticationRepository().ConfigureAwait(false); RegisterSingleInstance(AuthenticationRepository); + SyncRepository = await GetSyncRepository().ConfigureAwait(false); + RegisterSingleInstance(SyncRepository); + UserManager = new UserManager(LogManager.GetLogger("UserManager"), ServerConfigurationManager, UserRepository, XmlSerializer); RegisterSingleInstance(UserManager); @@ -561,7 +565,7 @@ namespace MediaBrowser.ServerApplication ImageProcessor = new ImageProcessor(LogManager.GetLogger("ImageProcessor"), ServerConfigurationManager.ApplicationPaths, FileSystemManager, JsonSerializer, MediaEncoder); RegisterSingleInstance(ImageProcessor); - SyncManager = new SyncManager(); + SyncManager = new SyncManager(LibraryManager, SyncRepository, ImageProcessor, LogManager.GetLogger("SyncManager")); RegisterSingleInstance(SyncManager); DtoService = new DtoService(Logger, LibraryManager, UserDataManager, ItemRepository, ImageProcessor, ServerConfigurationManager, FileSystemManager, ProviderManager, () => ChannelManager, SyncManager); @@ -706,6 +710,15 @@ namespace MediaBrowser.ServerApplication return repo; } + private async Task GetSyncRepository() + { + var repo = new SyncRepository(LogManager.GetLogger("SyncRepository"), ServerConfigurationManager.ApplicationPaths); + + await repo.Initialize().ConfigureAwait(false); + + return repo; + } + /// /// Configures the repositories. /// diff --git a/MediaBrowser.ServerApplication/FFMpeg/FFMpegDownloader.cs b/MediaBrowser.ServerApplication/FFMpeg/FFMpegDownloader.cs index a93ed9196..2642ffde7 100644 --- a/MediaBrowser.ServerApplication/FFMpeg/FFMpegDownloader.cs +++ b/MediaBrowser.ServerApplication/FFMpeg/FFMpegDownloader.cs @@ -101,7 +101,7 @@ namespace MediaBrowser.ServerApplication.FFMpeg { EncoderPath = encoder, ProbePath = probe, - Version = Path.GetFileNameWithoutExtension(Path.GetDirectoryName(probe)) + Version = Path.GetFileName(Path.GetDirectoryName(probe)) }; } } diff --git a/MediaBrowser.Tests/Resolvers/MovieResolverTests.cs b/MediaBrowser.Tests/Resolvers/MovieResolverTests.cs index 768e4ee5c..af24609e8 100644 --- a/MediaBrowser.Tests/Resolvers/MovieResolverTests.cs +++ b/MediaBrowser.Tests/Resolvers/MovieResolverTests.cs @@ -38,6 +38,8 @@ namespace MediaBrowser.Tests.Resolvers public void TestMultiPartFolders() { Assert.IsFalse(EntityResolutionHelper.IsMultiPartFolder(@"blah blah")); + Assert.IsFalse(EntityResolutionHelper.IsMultiPartFolder(@"d:\\music\weezer\\03 Pinkerton")); + Assert.IsFalse(EntityResolutionHelper.IsMultiPartFolder(@"d:\\music\\michael jackson\\Bad (2012 Remaster)")); Assert.IsTrue(EntityResolutionHelper.IsMultiPartFolder(@"blah blah - cd1")); Assert.IsTrue(EntityResolutionHelper.IsMultiPartFolder(@"blah blah - disc1")); diff --git a/MediaBrowser.WebDashboard/Api/DashboardService.cs b/MediaBrowser.WebDashboard/Api/DashboardService.cs index 92487959d..9235beacf 100644 --- a/MediaBrowser.WebDashboard/Api/DashboardService.cs +++ b/MediaBrowser.WebDashboard/Api/DashboardService.cs @@ -548,6 +548,7 @@ namespace MediaBrowser.WebDashboard.Api "channelsettings.js", "dashboardgeneral.js", "dashboardpage.js", + "dashboardsync.js", "directorybrowser.js", "dlnaprofile.js", "dlnaprofiles.js", @@ -676,6 +677,7 @@ namespace MediaBrowser.WebDashboard.Api "librarybrowser.css", "detailtable.css", "posteritem.css", + "card.css", "tileitem.css", "metadataeditor.css", "notifications.css", diff --git a/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj b/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj index 25cff11cf..73174dacf 100644 --- a/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj +++ b/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj @@ -287,9 +287,15 @@ PreserveNewest + + PreserveNewest + PreserveNewest + + PreserveNewest + PreserveNewest @@ -602,6 +608,9 @@ PreserveNewest + + PreserveNewest + PreserveNewest @@ -2074,6 +2083,9 @@ + + PreserveNewest + PreserveNewest diff --git a/MediaBrowser.XbmcMetadata/Images/XbmcImageSaver.cs b/MediaBrowser.XbmcMetadata/Images/XbmcImageSaver.cs index a45a44904..6071db6b5 100644 --- a/MediaBrowser.XbmcMetadata/Images/XbmcImageSaver.cs +++ b/MediaBrowser.XbmcMetadata/Images/XbmcImageSaver.cs @@ -88,7 +88,7 @@ namespace MediaBrowser.XbmcMetadata.Images if (item is Episode) { var seasonFolder = Path.GetDirectoryName(item.Path); - + var imageFilename = Path.GetFileNameWithoutExtension(item.Path) + "-thumb" + extension; return new[] { Path.Combine(seasonFolder, imageFilename) }; diff --git a/MediaBrowser.XbmcMetadata/Providers/BaseVideoNfoProvider.cs b/MediaBrowser.XbmcMetadata/Providers/BaseVideoNfoProvider.cs index d51c44ad4..c4edfb461 100644 --- a/MediaBrowser.XbmcMetadata/Providers/BaseVideoNfoProvider.cs +++ b/MediaBrowser.XbmcMetadata/Providers/BaseVideoNfoProvider.cs @@ -35,18 +35,18 @@ namespace MediaBrowser.XbmcMetadata.Providers protected override FileSystemInfo GetXmlFile(ItemInfo info, IDirectoryService directoryService) { - var path = GetMovieSavePath(info); + var path = GetMovieSavePath(info, FileSystem); return directoryService.GetFile(path); } - public static string GetMovieSavePath(ItemInfo item) + public static string GetMovieSavePath(ItemInfo item, IFileSystem fileSystem) { if (Directory.Exists(item.Path)) { var path = item.Path; - return Path.Combine(path, Path.GetFileNameWithoutExtension(path) + ".nfo"); + return Path.Combine(path, fileSystem.GetFileNameWithoutExtension(path) + ".nfo"); } return Path.ChangeExtension(item.Path, ".nfo"); diff --git a/MediaBrowser.XbmcMetadata/Savers/MovieNfoSaver.cs b/MediaBrowser.XbmcMetadata/Savers/MovieNfoSaver.cs index b23473295..210c743bf 100644 --- a/MediaBrowser.XbmcMetadata/Savers/MovieNfoSaver.cs +++ b/MediaBrowser.XbmcMetadata/Savers/MovieNfoSaver.cs @@ -21,10 +21,10 @@ namespace MediaBrowser.XbmcMetadata.Savers public override string GetSavePath(IHasMetadata item) { - return GetMovieSavePath(item); + return GetMovieSavePath(item, FileSystem); } - public static string GetMovieSavePath(IHasMetadata item) + public static string GetMovieSavePath(IHasMetadata item, IFileSystem fileSystem) { var video = (Video)item; @@ -32,7 +32,7 @@ namespace MediaBrowser.XbmcMetadata.Savers { var path = item.ContainingFolderPath; - return Path.Combine(path, Path.GetFileNameWithoutExtension(path) + ".nfo"); + return Path.Combine(path, fileSystem.GetFileNameWithoutExtension(path) + ".nfo"); } return Path.ChangeExtension(item.Path, ".nfo"); -- cgit v1.2.3 From 3fa2a001c7275737e4ff4011c23ca9dc359d721d Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Thu, 31 Jul 2014 20:37:06 -0400 Subject: add error handling to dlna channel support --- MediaBrowser.Api/Images/ImageService.cs | 41 +- .../Drawing/ImageProcessingOptions.cs | 30 +- .../ContentDirectory/ControlHandler.cs | 42 +- MediaBrowser.Dlna/Didl/DidlBuilder.cs | 86 +- MediaBrowser.Dlna/Profiles/DefaultProfile.cs | 9 +- MediaBrowser.Dlna/Profiles/Xml/Android.xml | 10 +- MediaBrowser.Dlna/Profiles/Xml/Default.xml | 10 +- MediaBrowser.Dlna/Profiles/Xml/Denon AVR.xml | 10 +- MediaBrowser.Dlna/Profiles/Xml/LG Smart TV.xml | 10 +- MediaBrowser.Dlna/Profiles/Xml/Linksys DMA2100.xml | 10 +- MediaBrowser.Dlna/Profiles/Xml/MediaMonkey.xml | 10 +- MediaBrowser.Dlna/Profiles/Xml/Panasonic Viera.xml | 10 +- .../Profiles/Xml/Samsung Smart TV.xml | 8 +- .../Profiles/Xml/Sony Blu-ray Player 2013.xml | 10 +- .../Profiles/Xml/Sony Blu-ray Player.xml | 10 +- .../Profiles/Xml/Sony Bravia (2010).xml | 10 +- .../Profiles/Xml/Sony Bravia (2011).xml | 10 +- .../Profiles/Xml/Sony Bravia (2012).xml | 10 +- .../Profiles/Xml/Sony Bravia (2013).xml | 10 +- .../Profiles/Xml/Sony PlayStation 3.xml | 10 +- MediaBrowser.Dlna/Profiles/Xml/WDTV Live.xml | 10 +- MediaBrowser.Dlna/Profiles/Xml/Windows 8 RT.xml | 10 +- MediaBrowser.Dlna/Profiles/Xml/Windows Phone.xml | 10 +- MediaBrowser.Dlna/Profiles/Xml/Xbox 360.xml | 10 +- MediaBrowser.Dlna/Profiles/Xml/Xbox One.xml | 10 +- MediaBrowser.Dlna/Profiles/Xml/foobar2000.xml | 10 +- MediaBrowser.Dlna/Service/BaseControlHandler.cs | 24 +- MediaBrowser.Model/ApiClient/IApiClient.cs | 30 +- MediaBrowser.Model/Dlna/DeviceProfile.cs | 4 +- .../Dlna/MediaFormatProfileResolver.cs | 7 +- .../Drawing/ImageProcessor.cs | 4 +- .../Localization/JavaScript/it.json | 2 +- .../Localization/JavaScript/kk.json | 8 +- .../Localization/JavaScript/ru.json | 10 +- .../Localization/JavaScript/sv.json | 136 ++-- .../Localization/JavaScript/tr.json | 323 ++++++++ .../Localization/LocalizationManager.cs | 1 + .../Localization/Server/es_MX.json | 36 +- .../Localization/Server/it.json | 32 +- .../Localization/Server/kk.json | 40 +- .../Localization/Server/nl.json | 32 +- .../Localization/Server/pt_BR.json | 16 +- .../Localization/Server/ru.json | 34 +- .../Localization/Server/sv.json | 66 +- .../Localization/Server/tr.json | 904 +++++++++++++++++++++ .../MediaBrowser.Server.Implementations.csproj | 3 + 46 files changed, 1689 insertions(+), 439 deletions(-) create mode 100644 MediaBrowser.Server.Implementations/Localization/JavaScript/tr.json create mode 100644 MediaBrowser.Server.Implementations/Localization/Server/tr.json (limited to 'MediaBrowser.Server.Implementations/Localization/LocalizationManager.cs') diff --git a/MediaBrowser.Api/Images/ImageService.cs b/MediaBrowser.Api/Images/ImageService.cs index 30db91da8..276aba365 100644 --- a/MediaBrowser.Api/Images/ImageService.cs +++ b/MediaBrowser.Api/Images/ImageService.cs @@ -40,6 +40,7 @@ namespace MediaBrowser.Api.Images [Route("/Items/{Id}/Images/{Type}", "GET")] [Route("/Items/{Id}/Images/{Type}/{Index}", "GET")] + [Route("/Items/{Id}/Images/{Type}/{Index}/{Tag}/{Format}/{MaxWidth}/{MaxHeight}", "GET")] [Api(Description = "Gets an item image")] public class GetItemImage : ImageRequest { @@ -49,8 +50,6 @@ namespace MediaBrowser.Api.Images /// The id. [ApiMember(Name = "Id", Description = "Item Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "GET")] public string Id { get; set; } - - public string Params { get; set; } } /// @@ -366,47 +365,9 @@ namespace MediaBrowser.Api.Images _libraryManager.RootFolder : _libraryManager.GetItemById(request.Id); - if (!string.IsNullOrEmpty(request.Params)) - { - ParseOptions(request, request.Params); - } - return GetImage(request, item); } - private readonly CultureInfo _usCulture = new CultureInfo("en-US"); - private void ParseOptions(ImageRequest request, string options) - { - var vals = options.Split(';'); - - for (var i = 0; i < vals.Length; i++) - { - var val = vals[i]; - - if (string.IsNullOrWhiteSpace(val)) - { - continue; - } - - if (i == 0) - { - request.Tag = val; - } - else if (i == 1) - { - request.Format = (ImageOutputFormat)Enum.Parse(typeof(ImageOutputFormat), val, true); - } - else if (i == 2) - { - request.MaxWidth = int.Parse(val, _usCulture); - } - else if (i == 3) - { - request.MaxHeight = int.Parse(val, _usCulture); - } - } - } - /// /// Gets the specified request. /// diff --git a/MediaBrowser.Controller/Drawing/ImageProcessingOptions.cs b/MediaBrowser.Controller/Drawing/ImageProcessingOptions.cs index 912ad012d..f4a76be00 100644 --- a/MediaBrowser.Controller/Drawing/ImageProcessingOptions.cs +++ b/MediaBrowser.Controller/Drawing/ImageProcessingOptions.cs @@ -2,6 +2,7 @@ using MediaBrowser.Controller.Providers; using MediaBrowser.Model.Drawing; using System.Collections.Generic; +using System.IO; namespace MediaBrowser.Controller.Drawing { @@ -34,39 +35,36 @@ namespace MediaBrowser.Controller.Drawing public int? UnplayedCount { get; set; } public double? PercentPlayed { get; set; } - + public string BackgroundColor { get; set; } - public bool HasDefaultOptions() + public bool HasDefaultOptions(string originalImagePath) { - return HasDefaultOptionsWithoutSize() && - !Width.HasValue && - !Height.HasValue && - !MaxWidth.HasValue && + return HasDefaultOptionsWithoutSize(originalImagePath) && + !Width.HasValue && + !Height.HasValue && + !MaxWidth.HasValue && !MaxHeight.HasValue; } - public bool HasDefaultOptionsWithoutSize() + public bool HasDefaultOptionsWithoutSize(string originalImagePath) { return (!Quality.HasValue || Quality.Value == 100) && - IsOutputFormatDefault && + IsOutputFormatDefault(originalImagePath) && !AddPlayedIndicator && !PercentPlayed.HasValue && !UnplayedCount.HasValue && string.IsNullOrEmpty(BackgroundColor); } - private bool IsOutputFormatDefault + private bool IsOutputFormatDefault(string originalImagePath) { - get + if (OutputFormat == ImageOutputFormat.Original) { - if (OutputFormat == ImageOutputFormat.Original) - { - return true; - } - - return false; + return true; } + + return string.Equals(Path.GetExtension(originalImagePath), "." + OutputFormat); } } } diff --git a/MediaBrowser.Dlna/ContentDirectory/ControlHandler.cs b/MediaBrowser.Dlna/ContentDirectory/ControlHandler.cs index 1553435ae..826777841 100644 --- a/MediaBrowser.Dlna/ContentDirectory/ControlHandler.cs +++ b/MediaBrowser.Dlna/ContentDirectory/ControlHandler.cs @@ -358,29 +358,45 @@ namespace MediaBrowser.Dlna.ContentDirectory if (channel != null) { - return await _channelManager.GetChannelItemsInternal(new ChannelItemQuery + try { - ChannelId = channel.Id.ToString("N"), - Limit = limit, - StartIndex = startIndex, - UserId = user.Id.ToString("N") + // Don't blow up here because it could cause parent screens with other content to fail + return await _channelManager.GetChannelItemsInternal(new ChannelItemQuery + { + ChannelId = channel.Id.ToString("N"), + Limit = limit, + StartIndex = startIndex, + UserId = user.Id.ToString("N") - }, CancellationToken.None); + }, CancellationToken.None); + } + catch + { + // Already logged at lower levels + } } var channelFolderItem = folder as ChannelFolderItem; if (channelFolderItem != null) { - return await _channelManager.GetChannelItemsInternal(new ChannelItemQuery + try { - ChannelId = channelFolderItem.ChannelId, - FolderId = channelFolderItem.Id.ToString("N"), - Limit = limit, - StartIndex = startIndex, - UserId = user.Id.ToString("N") + // Don't blow up here because it could cause parent screens with other content to fail + return await _channelManager.GetChannelItemsInternal(new ChannelItemQuery + { + ChannelId = channelFolderItem.ChannelId, + FolderId = channelFolderItem.Id.ToString("N"), + Limit = limit, + StartIndex = startIndex, + UserId = user.Id.ToString("N") - }, CancellationToken.None); + }, CancellationToken.None); + } + catch + { + // Already logged at lower levels + } } return ToResult(GetPlainFolderChildrenSorted(folder, user, sort), startIndex, limit); diff --git a/MediaBrowser.Dlna/Didl/DidlBuilder.cs b/MediaBrowser.Dlna/Didl/DidlBuilder.cs index f1377727b..8ad225770 100644 --- a/MediaBrowser.Dlna/Didl/DidlBuilder.cs +++ b/MediaBrowser.Dlna/Didl/DidlBuilder.cs @@ -394,9 +394,17 @@ namespace MediaBrowser.Dlna.Didl if (filter.Contains("dc:description")) { - if (!string.IsNullOrWhiteSpace(item.Overview)) + var desc = item.Overview; + + var hasShortOverview = item as IHasShortOverview; + if (hasShortOverview != null && !string.IsNullOrEmpty(hasShortOverview.ShortOverview)) + { + desc = hasShortOverview.ShortOverview; + } + + if (!string.IsNullOrWhiteSpace(desc)) { - AddValue(element, "dc", "description", item.Overview, NS_DC); + AddValue(element, "dc", "description", desc, NS_DC); } } if (filter.Contains("upnp:longDescription")) @@ -569,7 +577,7 @@ namespace MediaBrowser.Dlna.Didl var result = element.OwnerDocument; - var albumartUrlInfo = GetImageUrl(imageInfo, _profile.MaxAlbumArtWidth, _profile.MaxAlbumArtHeight); + var albumartUrlInfo = GetImageUrl(imageInfo, _profile.MaxAlbumArtWidth, _profile.MaxAlbumArtHeight, "jpg"); var icon = result.CreateElement("upnp", "albumArtURI", NS_UPNP); var profile = result.CreateAttribute("dlna", "profileID", NS_DLNA); @@ -578,11 +586,9 @@ namespace MediaBrowser.Dlna.Didl icon.InnerText = albumartUrlInfo.Url; element.AppendChild(icon); - var iconUrlInfo = GetImageUrl(imageInfo, _profile.MaxIconWidth, _profile.MaxIconHeight); + // TOOD: Remove these default values + var iconUrlInfo = GetImageUrl(imageInfo, _profile.MaxIconWidth ?? 48, _profile.MaxIconHeight ?? 48, "jpg"); icon = result.CreateElement("upnp", "icon", NS_UPNP); - profile = result.CreateAttribute("dlna", "profileID", NS_DLNA); - profile.InnerText = _profile.AlbumArtPn; - icon.SetAttributeNode(profile); icon.InnerText = iconUrlInfo.Url; element.AppendChild(icon); @@ -591,6 +597,25 @@ namespace MediaBrowser.Dlna.Didl return; } + AddImageResElement(item, element, 4096, 4096, "jpg"); + AddImageResElement(item, element, 1024, 768, "jpg"); + AddImageResElement(item, element, 640, 480, "jpg"); + AddImageResElement(item, element, 160, 160, "jpg"); + } + + private void AddImageResElement(BaseItem item, XmlElement element, int maxWidth, int maxHeight, string format) + { + var imageInfo = GetImageInfo(item); + + if (imageInfo == null) + { + return; + } + + var result = element.OwnerDocument; + + var albumartUrlInfo = GetImageUrl(imageInfo, maxWidth, maxHeight, format); + var res = result.CreateElement(string.Empty, "res", NS_DIDL); res.InnerText = albumartUrlInfo.Url; @@ -598,11 +623,11 @@ namespace MediaBrowser.Dlna.Didl var width = albumartUrlInfo.Width; var height = albumartUrlInfo.Height; - var contentFeatures = new ContentFeatureBuilder(_profile).BuildImageHeader("jpg", width, height); + var contentFeatures = new ContentFeatureBuilder(_profile).BuildImageHeader(format, width, height); res.SetAttribute("protocolInfo", String.Format( "http-get:*:{0}:{1}", - "image/jpeg", + MimeTypes.GetMimeType("file." + format), contentFeatures )); @@ -677,7 +702,7 @@ namespace MediaBrowser.Dlna.Didl return new ImageDownloadInfo { ItemId = item.Id.ToString("N"), - Type = ImageType.Primary, + Type = type, ImageTag = tag, Width = width, Height = height @@ -702,48 +727,31 @@ namespace MediaBrowser.Dlna.Didl internal int? Height; } - private ImageUrlInfo GetImageUrl(ImageDownloadInfo info, int? maxWidth, int? maxHeight) + private ImageUrlInfo GetImageUrl(ImageDownloadInfo info, int maxWidth, int maxHeight, string format) { - var url = string.Format("{0}/Items/{1}/Images/{2}?params=", + var url = string.Format("{0}/Items/{1}/Images/{2}/0/{3}/{4}/{5}/{6}", _serverAddress, info.ItemId, - info.Type); - - var options = new List - { + info.Type, info.ImageTag, - "jpg" - }; - - if (maxWidth.HasValue) - { - options.Add(maxWidth.Value.ToString(_usCulture)); - } - - if (maxHeight.HasValue) - { - options.Add(maxHeight.Value.ToString(_usCulture)); - } - - url += string.Join(";", options.ToArray()); + format, + maxWidth, + maxHeight); var width = info.Width; var height = info.Height; if (width.HasValue && height.HasValue) { - if (maxWidth.HasValue || maxHeight.HasValue) + var newSize = DrawingUtils.Resize(new ImageSize { - var newSize = DrawingUtils.Resize(new ImageSize - { - Height = height.Value, - Width = width.Value + Height = height.Value, + Width = width.Value - }, null, null, maxWidth, maxHeight); + }, null, null, maxWidth, maxHeight); - width = Convert.ToInt32(newSize.Width); - height = Convert.ToInt32(newSize.Height); - } + width = Convert.ToInt32(newSize.Width); + height = Convert.ToInt32(newSize.Height); } return new ImageUrlInfo diff --git a/MediaBrowser.Dlna/Profiles/DefaultProfile.cs b/MediaBrowser.Dlna/Profiles/DefaultProfile.cs index badb37cfc..ff5b3a046 100644 --- a/MediaBrowser.Dlna/Profiles/DefaultProfile.cs +++ b/MediaBrowser.Dlna/Profiles/DefaultProfile.cs @@ -24,13 +24,16 @@ namespace MediaBrowser.Dlna.Profiles AlbumArtPn = "JPEG_SM"; - MaxAlbumArtHeight = 512; - MaxAlbumArtWidth = 512; + MaxAlbumArtHeight = 480; + MaxAlbumArtWidth = 480; + + MaxIconWidth = 48; + MaxIconHeight = 48; MaxStreamingBitrate = 8000000; MaxStaticBitrate = 8000000; - EnableAlbumArtInDidl = true; + EnableAlbumArtInDidl = false; TranscodingProfiles = new[] { diff --git a/MediaBrowser.Dlna/Profiles/Xml/Android.xml b/MediaBrowser.Dlna/Profiles/Xml/Android.xml index 549bea59e..b7a6cc19c 100644 --- a/MediaBrowser.Dlna/Profiles/Xml/Android.xml +++ b/MediaBrowser.Dlna/Profiles/Xml/Android.xml @@ -9,13 +9,13 @@ Media Browser http://mediabrowser.tv/ false - true + false Audio,Photo,Video JPEG_SM - 512 - 512 - - + 480 + 480 + 48 + 48 8000000 8000000 DMS-1.50 diff --git a/MediaBrowser.Dlna/Profiles/Xml/Default.xml b/MediaBrowser.Dlna/Profiles/Xml/Default.xml index 2ac840f44..6aafbe86e 100644 --- a/MediaBrowser.Dlna/Profiles/Xml/Default.xml +++ b/MediaBrowser.Dlna/Profiles/Xml/Default.xml @@ -9,13 +9,13 @@ Media Browser http://mediabrowser.tv/ false - true + false Audio,Photo,Video JPEG_SM - 512 - 512 - - + 480 + 480 + 48 + 48 8000000 8000000 DMS-1.50 diff --git a/MediaBrowser.Dlna/Profiles/Xml/Denon AVR.xml b/MediaBrowser.Dlna/Profiles/Xml/Denon AVR.xml index 891353f32..28fe6e0c9 100644 --- a/MediaBrowser.Dlna/Profiles/Xml/Denon AVR.xml +++ b/MediaBrowser.Dlna/Profiles/Xml/Denon AVR.xml @@ -14,13 +14,13 @@ Media Browser http://mediabrowser.tv/ false - true + false Audio,Photo,Video JPEG_SM - 512 - 512 - - + 480 + 480 + 48 + 48 8000000 8000000 DMS-1.50 diff --git a/MediaBrowser.Dlna/Profiles/Xml/LG Smart TV.xml b/MediaBrowser.Dlna/Profiles/Xml/LG Smart TV.xml index 2acee1306..f0cf1e96c 100644 --- a/MediaBrowser.Dlna/Profiles/Xml/LG Smart TV.xml +++ b/MediaBrowser.Dlna/Profiles/Xml/LG Smart TV.xml @@ -15,13 +15,13 @@ Media Browser http://mediabrowser.tv/ false - true + false Audio,Photo,Video JPEG_SM - 512 - 512 - - + 480 + 480 + 48 + 48 8000000 8000000 DMS-1.50 diff --git a/MediaBrowser.Dlna/Profiles/Xml/Linksys DMA2100.xml b/MediaBrowser.Dlna/Profiles/Xml/Linksys DMA2100.xml index e5e726cc6..775c7e466 100644 --- a/MediaBrowser.Dlna/Profiles/Xml/Linksys DMA2100.xml +++ b/MediaBrowser.Dlna/Profiles/Xml/Linksys DMA2100.xml @@ -13,13 +13,13 @@ Media Browser http://mediabrowser.tv/ false - true + false Audio,Photo,Video JPEG_SM - 512 - 512 - - + 480 + 480 + 48 + 48 8000000 8000000 DMS-1.50 diff --git a/MediaBrowser.Dlna/Profiles/Xml/MediaMonkey.xml b/MediaBrowser.Dlna/Profiles/Xml/MediaMonkey.xml index fe1a987ab..1461c2255 100644 --- a/MediaBrowser.Dlna/Profiles/Xml/MediaMonkey.xml +++ b/MediaBrowser.Dlna/Profiles/Xml/MediaMonkey.xml @@ -15,13 +15,13 @@ Media Browser http://mediabrowser.tv/ false - true + false Audio JPEG_SM - 512 - 512 - - + 480 + 480 + 48 + 48 8000000 8000000 DMS-1.50 diff --git a/MediaBrowser.Dlna/Profiles/Xml/Panasonic Viera.xml b/MediaBrowser.Dlna/Profiles/Xml/Panasonic Viera.xml index 9b59393b4..5b5125b30 100644 --- a/MediaBrowser.Dlna/Profiles/Xml/Panasonic Viera.xml +++ b/MediaBrowser.Dlna/Profiles/Xml/Panasonic Viera.xml @@ -16,13 +16,13 @@ Media Browser http://mediabrowser.tv/ false - true + false Audio,Photo,Video JPEG_SM - 512 - 512 - - + 480 + 480 + 48 + 48 8000000 8000000 DMS-1.50 diff --git a/MediaBrowser.Dlna/Profiles/Xml/Samsung Smart TV.xml b/MediaBrowser.Dlna/Profiles/Xml/Samsung Smart TV.xml index 980983f13..209c029b5 100644 --- a/MediaBrowser.Dlna/Profiles/Xml/Samsung Smart TV.xml +++ b/MediaBrowser.Dlna/Profiles/Xml/Samsung Smart TV.xml @@ -18,10 +18,10 @@ true Audio,Photo,Video JPEG_SM - 512 - 512 - - + 480 + 480 + 48 + 48 8000000 8000000 DMS-1.50 diff --git a/MediaBrowser.Dlna/Profiles/Xml/Sony Blu-ray Player 2013.xml b/MediaBrowser.Dlna/Profiles/Xml/Sony Blu-ray Player 2013.xml index f3ffd438c..2e32b77c6 100644 --- a/MediaBrowser.Dlna/Profiles/Xml/Sony Blu-ray Player 2013.xml +++ b/MediaBrowser.Dlna/Profiles/Xml/Sony Blu-ray Player 2013.xml @@ -15,13 +15,13 @@ 3.0 http://mediabrowser.tv/ false - true + false Audio,Photo,Video JPEG_SM - 512 - 512 - - + 480 + 480 + 48 + 48 8000000 8000000 DMS-1.50 diff --git a/MediaBrowser.Dlna/Profiles/Xml/Sony Blu-ray Player.xml b/MediaBrowser.Dlna/Profiles/Xml/Sony Blu-ray Player.xml index 2ddb362ac..87ba6e33b 100644 --- a/MediaBrowser.Dlna/Profiles/Xml/Sony Blu-ray Player.xml +++ b/MediaBrowser.Dlna/Profiles/Xml/Sony Blu-ray Player.xml @@ -17,13 +17,13 @@ 3.0 http://mediabrowser.tv/ false - true + false Audio,Photo,Video JPEG_SM - 512 - 512 - - + 480 + 480 + 48 + 48 8000000 8000000 DMS-1.50 diff --git a/MediaBrowser.Dlna/Profiles/Xml/Sony Bravia (2010).xml b/MediaBrowser.Dlna/Profiles/Xml/Sony Bravia (2010).xml index 00f94455a..698bb44b1 100644 --- a/MediaBrowser.Dlna/Profiles/Xml/Sony Bravia (2010).xml +++ b/MediaBrowser.Dlna/Profiles/Xml/Sony Bravia (2010).xml @@ -16,13 +16,13 @@ 3.0 http://www.microsoft.com/ false - true + false Audio,Photo,Video JPEG_TN - 512 - 512 - - + 480 + 480 + 48 + 48 8000000 8000000 DMS-1.50 diff --git a/MediaBrowser.Dlna/Profiles/Xml/Sony Bravia (2011).xml b/MediaBrowser.Dlna/Profiles/Xml/Sony Bravia (2011).xml index c985b041e..f07536fcb 100644 --- a/MediaBrowser.Dlna/Profiles/Xml/Sony Bravia (2011).xml +++ b/MediaBrowser.Dlna/Profiles/Xml/Sony Bravia (2011).xml @@ -16,13 +16,13 @@ 3.0 http://www.microsoft.com/ false - true + false Audio,Photo,Video JPEG_TN - 512 - 512 - - + 480 + 480 + 48 + 48 8000000 8000000 DMS-1.50 diff --git a/MediaBrowser.Dlna/Profiles/Xml/Sony Bravia (2012).xml b/MediaBrowser.Dlna/Profiles/Xml/Sony Bravia (2012).xml index 8b44b67a6..a99e4fa1e 100644 --- a/MediaBrowser.Dlna/Profiles/Xml/Sony Bravia (2012).xml +++ b/MediaBrowser.Dlna/Profiles/Xml/Sony Bravia (2012).xml @@ -16,13 +16,13 @@ 3.0 http://www.microsoft.com/ false - true + false Audio,Photo,Video JPEG_TN - 512 - 512 - - + 480 + 480 + 48 + 48 8000000 8000000 DMS-1.50 diff --git a/MediaBrowser.Dlna/Profiles/Xml/Sony Bravia (2013).xml b/MediaBrowser.Dlna/Profiles/Xml/Sony Bravia (2013).xml index 843dc7819..3d4661621 100644 --- a/MediaBrowser.Dlna/Profiles/Xml/Sony Bravia (2013).xml +++ b/MediaBrowser.Dlna/Profiles/Xml/Sony Bravia (2013).xml @@ -16,13 +16,13 @@ 3.0 http://www.microsoft.com/ false - true + false Audio,Photo,Video JPEG_TN - 512 - 512 - - + 480 + 480 + 48 + 48 8000000 8000000 DMS-1.50 diff --git a/MediaBrowser.Dlna/Profiles/Xml/Sony PlayStation 3.xml b/MediaBrowser.Dlna/Profiles/Xml/Sony PlayStation 3.xml index b9e7c62a3..55f89e3eb 100644 --- a/MediaBrowser.Dlna/Profiles/Xml/Sony PlayStation 3.xml +++ b/MediaBrowser.Dlna/Profiles/Xml/Sony PlayStation 3.xml @@ -16,13 +16,13 @@ Media Browser http://mediabrowser.tv/ false - true + false Audio,Photo,Video JPEG_TN - 512 - 512 - - + 480 + 480 + 48 + 48 8000000 8000000 DMS-1.50 diff --git a/MediaBrowser.Dlna/Profiles/Xml/WDTV Live.xml b/MediaBrowser.Dlna/Profiles/Xml/WDTV Live.xml index b2b4c31d3..5d12b65c8 100644 --- a/MediaBrowser.Dlna/Profiles/Xml/WDTV Live.xml +++ b/MediaBrowser.Dlna/Profiles/Xml/WDTV Live.xml @@ -16,13 +16,13 @@ Media Browser http://mediabrowser.tv/ true - true + false Audio,Photo,Video JPEG_SM - 512 - 512 - - + 480 + 480 + 48 + 48 8000000 8000000 DMS-1.50 diff --git a/MediaBrowser.Dlna/Profiles/Xml/Windows 8 RT.xml b/MediaBrowser.Dlna/Profiles/Xml/Windows 8 RT.xml index 766bfdecd..61ee59549 100644 --- a/MediaBrowser.Dlna/Profiles/Xml/Windows 8 RT.xml +++ b/MediaBrowser.Dlna/Profiles/Xml/Windows 8 RT.xml @@ -13,13 +13,13 @@ Media Browser http://mediabrowser.tv/ false - true + false Audio,Photo,Video JPEG_SM - 512 - 512 - - + 480 + 480 + 48 + 48 8000000 8000000 DMS-1.50 diff --git a/MediaBrowser.Dlna/Profiles/Xml/Windows Phone.xml b/MediaBrowser.Dlna/Profiles/Xml/Windows Phone.xml index 3c9528dc2..12b7fe9c9 100644 --- a/MediaBrowser.Dlna/Profiles/Xml/Windows Phone.xml +++ b/MediaBrowser.Dlna/Profiles/Xml/Windows Phone.xml @@ -9,13 +9,13 @@ Media Browser http://mediabrowser.tv/ false - true + false Audio,Photo,Video JPEG_SM - 512 - 512 - - + 480 + 480 + 48 + 48 8000000 8000000 DMS-1.50 diff --git a/MediaBrowser.Dlna/Profiles/Xml/Xbox 360.xml b/MediaBrowser.Dlna/Profiles/Xml/Xbox 360.xml index 339b8debd..f3e153130 100644 --- a/MediaBrowser.Dlna/Profiles/Xml/Xbox 360.xml +++ b/MediaBrowser.Dlna/Profiles/Xml/Xbox 360.xml @@ -16,13 +16,13 @@ 12.0 http://www.microsoft.com/ false - true + false Audio,Photo,Video JPEG_SM - 512 - 512 - - + 480 + 480 + 48 + 48 8000000 8000000 DMS-1.50 diff --git a/MediaBrowser.Dlna/Profiles/Xml/Xbox One.xml b/MediaBrowser.Dlna/Profiles/Xml/Xbox One.xml index 63223fea7..7e057a3f9 100644 --- a/MediaBrowser.Dlna/Profiles/Xml/Xbox One.xml +++ b/MediaBrowser.Dlna/Profiles/Xml/Xbox One.xml @@ -14,13 +14,13 @@ Media Browser http://mediabrowser.tv/ false - true + false Audio,Photo,Video JPEG_SM - 512 - 512 - - + 480 + 480 + 48 + 48 8000000 8000000 DMS-1.50 diff --git a/MediaBrowser.Dlna/Profiles/Xml/foobar2000.xml b/MediaBrowser.Dlna/Profiles/Xml/foobar2000.xml index 865d343b2..d09911308 100644 --- a/MediaBrowser.Dlna/Profiles/Xml/foobar2000.xml +++ b/MediaBrowser.Dlna/Profiles/Xml/foobar2000.xml @@ -15,13 +15,13 @@ Media Browser http://mediabrowser.tv/ false - true + false Audio JPEG_SM - 512 - 512 - - + 480 + 480 + 48 + 48 8000000 8000000 DMS-1.50 diff --git a/MediaBrowser.Dlna/Service/BaseControlHandler.cs b/MediaBrowser.Dlna/Service/BaseControlHandler.cs index c2af1f5a1..a17182a7e 100644 --- a/MediaBrowser.Dlna/Service/BaseControlHandler.cs +++ b/MediaBrowser.Dlna/Service/BaseControlHandler.cs @@ -1,5 +1,4 @@ -using System.Security; -using MediaBrowser.Controller.Configuration; +using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Dlna; using MediaBrowser.Dlna.Server; using MediaBrowser.Model.Logging; @@ -33,7 +32,14 @@ namespace MediaBrowser.Dlna.Service LogRequest(request); } - return ProcessControlRequestInternal(request); + var response = ProcessControlRequestInternal(request); + + if (Config.GetDlnaConfiguration().EnableDebugLogging) + { + LogResponse(response); + } + + return response; } catch (Exception ex) { @@ -113,5 +119,17 @@ namespace MediaBrowser.Dlna.Service Logger.LogMultiline("Control request", LogSeverity.Debug, builder); } + + private void LogResponse(ControlResponse response) + { + var builder = new StringBuilder(); + + var headers = string.Join(", ", response.Headers.Select(i => string.Format("{0}={1}", i.Key, i.Value)).ToArray()); + builder.AppendFormat("Headers: {0}", headers); + builder.AppendLine(); + builder.Append(response.Xml); + + Logger.LogMultiline("Control response", LogSeverity.Debug, builder); + } } } diff --git a/MediaBrowser.Model/ApiClient/IApiClient.cs b/MediaBrowser.Model/ApiClient/IApiClient.cs index e1c736f84..f4f45ec8e 100644 --- a/MediaBrowser.Model/ApiClient/IApiClient.cs +++ b/MediaBrowser.Model/ApiClient/IApiClient.cs @@ -265,23 +265,26 @@ namespace MediaBrowser.Model.ApiClient /// Gets the episodes asynchronous. /// /// The query. + /// The cancellation token. /// Task{ItemsResult}. - Task GetEpisodesAsync(EpisodeQuery query); + Task GetEpisodesAsync(EpisodeQuery query, CancellationToken cancellationToken); /// /// Gets the seasons asynchronous. /// /// The query. + /// The cancellation token. /// Task{ItemsResult}. - Task GetSeasonsAsync(SeasonQuery query); + Task GetSeasonsAsync(SeasonQuery query, CancellationToken cancellationToken); /// /// Queries for items /// /// The query. + /// The cancellation token. /// Task{ItemsResult}. /// query - Task GetItemsAsync(ItemQuery query); + Task GetItemsAsync(ItemQuery query, CancellationToken cancellationToken); /// /// Gets the instant mix from song async. @@ -315,44 +318,50 @@ namespace MediaBrowser.Model.ApiClient /// Gets the similar movies async. /// /// The query. + /// The cancellation token. /// Task{ItemsResult}. - Task GetSimilarMoviesAsync(SimilarItemsQuery query); + Task GetSimilarMoviesAsync(SimilarItemsQuery query, CancellationToken cancellationToken); /// /// Gets the similar trailers async. /// /// The query. + /// The cancellation token. /// Task{ItemsResult}. - Task GetSimilarTrailersAsync(SimilarItemsQuery query); + Task GetSimilarTrailersAsync(SimilarItemsQuery query, CancellationToken cancellationToken); /// /// Gets the similar series async. /// /// The query. + /// The cancellation token. /// Task{ItemsResult}. - Task GetSimilarSeriesAsync(SimilarItemsQuery query); + Task GetSimilarSeriesAsync(SimilarItemsQuery query, CancellationToken cancellationToken); /// /// Gets the similar albums async. /// /// The query. + /// The cancellation token. /// Task{ItemsResult}. - Task GetSimilarAlbumsAsync(SimilarItemsQuery query); + Task GetSimilarAlbumsAsync(SimilarItemsQuery query, CancellationToken cancellationToken); /// /// Gets the similar games async. /// /// The query. + /// The cancellation token. /// Task{ItemsResult}. - Task GetSimilarGamesAsync(SimilarItemsQuery query); + Task GetSimilarGamesAsync(SimilarItemsQuery query, CancellationToken cancellationToken); /// /// Gets the people async. /// /// The query. + /// The cancellation token. /// Task{ItemsResult}. /// userId - Task GetPeopleAsync(PersonsQuery query); + Task GetPeopleAsync(PersonsQuery query, CancellationToken cancellationToken); /// /// Gets the artists. @@ -382,8 +391,9 @@ namespace MediaBrowser.Model.ApiClient /// Gets the next up async. /// /// The query. + /// The cancellation token. /// Task{ItemsResult}. - Task GetNextUpEpisodesAsync(NextUpQuery query); + Task GetNextUpEpisodesAsync(NextUpQuery query, CancellationToken cancellationToken); /// /// Gets the upcoming episodes asynchronous. diff --git a/MediaBrowser.Model/Dlna/DeviceProfile.cs b/MediaBrowser.Model/Dlna/DeviceProfile.cs index 9a55068bf..630e7fa60 100644 --- a/MediaBrowser.Model/Dlna/DeviceProfile.cs +++ b/MediaBrowser.Model/Dlna/DeviceProfile.cs @@ -43,8 +43,8 @@ namespace MediaBrowser.Model.Dlna public string AlbumArtPn { get; set; } - public int? MaxAlbumArtWidth { get; set; } - public int? MaxAlbumArtHeight { get; set; } + public int MaxAlbumArtWidth { get; set; } + public int MaxAlbumArtHeight { get; set; } public int? MaxIconWidth { get; set; } public int? MaxIconHeight { get; set; } diff --git a/MediaBrowser.Model/Dlna/MediaFormatProfileResolver.cs b/MediaBrowser.Model/Dlna/MediaFormatProfileResolver.cs index 9bbe52dbf..3b4cc30ac 100644 --- a/MediaBrowser.Model/Dlna/MediaFormatProfileResolver.cs +++ b/MediaBrowser.Model/Dlna/MediaFormatProfileResolver.cs @@ -400,6 +400,9 @@ namespace MediaBrowser.Model.Dlna { if (width.HasValue && height.HasValue) { + if ((width.Value <= 160) && (height.Value <= 160)) + return MediaFormatProfile.JPEG_SM; + if ((width.Value <= 640) && (height.Value <= 480)) return MediaFormatProfile.JPEG_SM; @@ -407,9 +410,11 @@ namespace MediaBrowser.Model.Dlna { return MediaFormatProfile.JPEG_MED; } + + return MediaFormatProfile.JPEG_LRG; } - return MediaFormatProfile.JPEG_LRG; + return MediaFormatProfile.JPEG_SM; } } } diff --git a/MediaBrowser.Server.Implementations/Drawing/ImageProcessor.cs b/MediaBrowser.Server.Implementations/Drawing/ImageProcessor.cs index 09071cbf9..803b4389f 100644 --- a/MediaBrowser.Server.Implementations/Drawing/ImageProcessor.cs +++ b/MediaBrowser.Server.Implementations/Drawing/ImageProcessor.cs @@ -135,7 +135,7 @@ namespace MediaBrowser.Server.Implementations.Drawing var originalImagePath = options.Image.Path; - if (options.HasDefaultOptions() && options.Enhancers.Count == 0 && !options.CropWhiteSpace) + if (options.HasDefaultOptions(originalImagePath) && options.Enhancers.Count == 0 && !options.CropWhiteSpace) { // Just spit out the original file if all the options are default return originalImagePath; @@ -164,7 +164,7 @@ namespace MediaBrowser.Server.Implementations.Drawing // Determine the output size based on incoming parameters var newSize = DrawingUtils.Resize(originalImageSize, options.Width, options.Height, options.MaxWidth, options.MaxHeight); - if (options.HasDefaultOptionsWithoutSize() && newSize.Equals(originalImageSize) && options.Enhancers.Count == 0) + if (options.HasDefaultOptionsWithoutSize(originalImagePath) && newSize.Equals(originalImageSize) && options.Enhancers.Count == 0) { // Just spit out the original file if the new size equals the old return originalImagePath; diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/it.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/it.json index 4cf04f2a7..463b079e9 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/it.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/it.json @@ -318,6 +318,6 @@ "HeaderSelectPlayer": "Utente selezionato:", "ButtonSelect": "Seleziona", "ButtonNew": "Nuovo", - "MessageInternetExplorerWebm": "For best results with Internet Explorer please install the WebM plugin for IE.", + "MessageInternetExplorerWebm": "Se utilizzi internet explorer installa WebM plugin", "HeaderVideoError": "Video Error" } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/kk.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/kk.json index a3f636e62..a2d284938 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/kk.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/kk.json @@ -160,8 +160,8 @@ "MessageDuplicatesWillBeDeleted": "\u049a\u043e\u0441\u044b\u043c\u0448\u0430 \u0440\u0435\u0442\u0456\u043d\u0434\u0435, \u043a\u0435\u043b\u0435\u0441\u0456 \u0442\u0435\u043b\u043d\u04b1\u0441\u049b\u0430\u043b\u0430\u0440 \u0436\u043e\u0439\u044b\u043b\u0430\u0434\u044b:", "MessageFollowingFileWillBeMovedFrom": "\u041a\u0435\u043b\u0435\u0441\u0456 \u0444\u0430\u0439\u043b \u0436\u044b\u043b\u0436\u044b\u0442\u044b\u043b\u0430\u0434\u044b, \u043c\u044b\u043d\u0430\u0434\u0430\u043d:", "MessageDestinationTo": "\u043c\u044b\u043d\u0430\u0493\u0430\u043d:", - "HeaderSelectWatchFolder": "\u0411\u0430\u049b\u044b\u043b\u0430\u0443\u0434\u0430\u0493\u044b \u049b\u0430\u043b\u0442\u0430\u043d\u044b \u0442\u0430\u04a3\u0434\u0430\u0443", - "HeaderSelectWatchFolderHelp": "\u0411\u0430\u049b\u044b\u043b\u0430\u0443\u0434\u0430\u0493\u044b \u049b\u0430\u043b\u0442\u0430\u0493\u0430 \u0436\u043e\u043b\u0434\u044b \u0448\u043e\u043b\u044b\u04a3\u044b\u0437 \u043d\u0435\u043c\u0435\u0441\u0435 \u0435\u043d\u0433\u0456\u0437\u0456\u04a3\u0456\u0437. \u041e\u0441\u044b \u049b\u0430\u043b\u0442\u0430 \u0436\u0430\u0437\u0443 \u04af\u0448\u0456\u043d \u049b\u043e\u043b \u0436\u0435\u0442\u0456\u043c\u0434\u0456 \u0431\u043e\u043b\u0443\u044b \u049b\u0430\u0436\u0435\u0442.", + "HeaderSelectWatchFolder": "\u049a\u0430\u0434\u0430\u0493\u0430\u043b\u0430\u0443\u0434\u0430\u0493\u044b \u049b\u0430\u043b\u0442\u0430\u043d\u044b \u0442\u0430\u04a3\u0434\u0430\u0443", + "HeaderSelectWatchFolderHelp": "\u049a\u0430\u0434\u0430\u0493\u0430\u043b\u0430\u0443\u0434\u0430\u0493\u044b \u049b\u0430\u043b\u0442\u0430\u0493\u0430 \u0436\u043e\u043b\u0434\u044b \u0448\u043e\u043b\u044b\u04a3\u044b\u0437 \u043d\u0435\u043c\u0435\u0441\u0435 \u0435\u043d\u0433\u0456\u0437\u0456\u04a3\u0456\u0437. \u041e\u0441\u044b \u049b\u0430\u043b\u0442\u0430 \u0436\u0430\u0437\u0443 \u04af\u0448\u0456\u043d \u049b\u043e\u043b \u0436\u0435\u0442\u0456\u043c\u0434\u0456 \u0431\u043e\u043b\u0443\u044b \u049b\u0430\u0436\u0435\u0442.", "OrganizePatternResult": "\u041d\u04d9\u0442\u0438\u0436\u0435\u0441\u0456: {0}", "HeaderRestart": "\u049a\u0430\u0439\u0442\u0430 \u0456\u0441\u043a\u0435 \u049b\u043e\u0441\u0443", "HeaderShutdown": "\u0416\u04b1\u043c\u044b\u0441\u0442\u044b \u0430\u044f\u049b\u0442\u0430\u0443", @@ -227,8 +227,8 @@ "OptionBlockMovies": "\u0424\u0438\u043b\u044c\u043c\u0434\u0435\u0440", "OptionBlockBooks": "\u041a\u0456\u0442\u0430\u043f\u0442\u0430\u0440", "OptionBlockGames": "\u041e\u0439\u044b\u043d\u0434\u0430\u0440", - "OptionBlockLiveTvPrograms": "\u042d\u0444\u0438\u0440\u043b\u0456\u043a \u0422\u0414-\u0442\u0430\u0440\u0430\u0442\u044b\u043c\u0434\u0430\u0440", - "OptionBlockLiveTvChannels": "\u042d\u0444\u0438\u0440\u043b\u0456\u043a \u0422\u0414-\u0430\u0440\u043d\u0430\u043b\u0430\u0440", + "OptionBlockLiveTvPrograms": "\u042d\u0444\u0438\u0440\u043b\u0456\u043a \u0422\u0414 \u0442\u0430\u0440\u0430\u0442\u044b\u043c\u0434\u0430\u0440\u044b", + "OptionBlockLiveTvChannels": "\u042d\u0444\u0438\u0440\u043b\u0456\u043a \u0422\u0414 \u0430\u0440\u043d\u0430\u043b\u0430\u0440\u044b", "OptionBlockChannelContent": "\u0418\u043d\u0442\u0435\u0440\u043d\u0435\u0442 \u0430\u0440\u043d\u0430 \u043c\u0430\u0437\u043c\u04b1\u043d\u044b", "ButtonRevoke": "\u0411\u0430\u0441 \u0442\u0430\u0440\u0442\u0443", "MessageConfirmRevokeApiKey": "\u0428\u044b\u043d\u044b\u043c\u0435\u043d \u043e\u0441\u044b API \u043a\u0456\u043b\u0442\u0456\u043d\u0435\u043d \u0431\u0430\u0441 \u0442\u0430\u0440\u0442\u0443 \u049b\u0430\u0436\u0435\u0442 \u043f\u0435? \u049a\u043e\u043b\u0434\u0430\u043d\u0431\u0430 \u043c\u0435\u043d Media Browser \u0430\u0440\u0430\u0441\u044b\u043d\u0434\u0430\u0493\u044b \u049b\u043e\u0441\u044b\u043b\u044b\u043c \u043a\u0435\u043d\u0435\u0442 \u04af\u0437\u0456\u043b\u0435\u0434\u0456.", diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/ru.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/ru.json index 2fd2d8ae9..2e71def61 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/ru.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/ru.json @@ -48,7 +48,7 @@ "MessageNoPluginsInstalled": "\u041d\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043e \u043d\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u043f\u043b\u0430\u0433\u0438\u043d\u0430.", "LabelVersionInstalled": "\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0430: {0}", "LabelNumberReviews": "\u041e\u0442\u0437\u044b\u0432\u044b: {0}", - "LabelFree": "\u0411\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u043e", + "LabelFree": "\u0411\u0435\u0441\u043f\u043b.", "HeaderSelectAudio": "\u0412\u044b\u0431\u043e\u0440 \u0430\u0443\u0434\u0438\u043e", "HeaderSelectSubtitles": "\u0412\u044b\u0431\u043e\u0440 \u0441\u0443\u0431\u0442\u0438\u0442\u0440\u043e\u0432", "LabelDefaultStream": "(\u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e)", @@ -161,7 +161,7 @@ "MessageFollowingFileWillBeMovedFrom": "\u0411\u0443\u0434\u0435\u0442 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0451\u043d \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0444\u0430\u0439\u043b \u0438\u0437:", "MessageDestinationTo": "\u0432:", "HeaderSelectWatchFolder": "\u0412\u044b\u0431\u043e\u0440 \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0435\u043c\u043e\u0439 \u043f\u0430\u043f\u043a\u0438", - "HeaderSelectWatchFolderHelp": "\u041f\u0435\u0440\u0435\u0439\u0434\u0438\u0442\u0435 \u0438\u043b\u0438 \u0432\u0432\u0435\u0434\u0438\u0442\u0435 \u043f\u0443\u0442\u044c \u043a \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0435\u043c\u043e\u0439 \u043f\u0430\u043f\u043a\u0435. \u041f\u0430\u043f\u043a\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430 \u0434\u043b\u044f \u0437\u0430\u043f\u0438\u0441\u0438.", + "HeaderSelectWatchFolderHelp": "\u041f\u0435\u0440\u0435\u0439\u0434\u0438\u0442\u0435 \u0438\u043b\u0438 \u0432\u0432\u0435\u0434\u0438\u0442\u0435 \u043f\u0443\u0442\u044c \u043a \u043f\u0430\u043f\u043a\u0435 \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u043d\u0438\u044f. \u041f\u0430\u043f\u043a\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430 \u0434\u043b\u044f \u0437\u0430\u043f\u0438\u0441\u0438.", "OrganizePatternResult": "\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442: {0}", "HeaderRestart": "\u041f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a", "HeaderShutdown": "\u0417\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0435 \u0440\u0430\u0431\u043e\u0442\u044b", @@ -258,7 +258,7 @@ "OptionOn": "\u0412\u043a\u043b", "HeaderFields": "\u041f\u043e\u043b\u044f", "HeaderFieldsHelp": "\u041f\u0435\u0440\u0435\u0434\u0432\u0438\u043d\u044c\u0442\u0435 \u043f\u043e\u043b\u0435 \u043d\u0430 \"\u0412\u042b\u041a\u041b\", \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u0438 \u043f\u0440\u0435\u0434\u043e\u0442\u0432\u0440\u0430\u0442\u0438\u0442\u044c \u043e\u0442 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0435\u0433\u043e \u0434\u0430\u043d\u043d\u044b\u0445.", - "HeaderLiveTV": "\u0422\u0412 \u044d\u0444\u0438\u0440", + "HeaderLiveTV": "\u042d\u0444\u0438\u0440\u043d\u043e\u0435 \u0422\u0412", "MissingLocalTrailer": "\u041f\u0440\u043e\u043f\u0443\u0449\u0435\u043d\u043d\u044b\u0439 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0442\u0440\u0435\u0439\u043b\u0435\u0440.", "MissingPrimaryImage": "\u041f\u0440\u043e\u043f\u0443\u0449\u0435\u043d\u043d\u044b\u0439 \u043f\u0435\u0440\u0432\u0438\u0447\u043d\u044b\u0439 \u0440\u0438\u0441\u0443\u043d\u043e\u043a.", "MissingBackdropImage": "\u041f\u0440\u043e\u043f\u0443\u0449\u0435\u043d\u043d\u044b\u0439 \u0440\u0438\u0441\u0443\u043d\u043e\u043a \u0437\u0430\u0434\u043d\u0438\u043a\u0430.", @@ -302,8 +302,8 @@ "TabUsers": "\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438", "TabLibrary": "\u041c\u0435\u0434\u0438\u0430\u0442\u0435\u043a\u0430", "TabMetadata": "\u041c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435", - "TabDLNA": "DLNA \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044f", - "TabLiveTV": "\u0422\u0412 \u044d\u0444\u0438\u0440", + "TabDLNA": "DLNA", + "TabLiveTV": "\u042d\u0444\u0438\u0440\u043d\u043e\u0435 \u0422\u0412", "TabAutoOrganize": "\u0410\u0432\u0442\u043e\u0440\u0435\u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u044f", "TabPlugins": "\u041f\u043b\u0430\u0433\u0438\u043d\u044b", "TabAdvanced": "\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e", diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/sv.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/sv.json index a8ae113be..4af6f9272 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/sv.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/sv.json @@ -234,90 +234,90 @@ "MessageConfirmRevokeApiKey": "\u00c4r du s\u00e4ker p\u00e5 att du vill \u00e5terkalla den h\u00e4r API-nyckeln? Programmets anslutning till Media Browser kommer att avbrytas omg\u00e5ende.", "HeaderConfirmRevokeApiKey": "\u00c5terkalla API-nyckel", "ValueContainer": "Container: {0}", - "ValueAudioCodec": "Audio Codec: {0}", - "ValueVideoCodec": "Video Codec: {0}", + "ValueAudioCodec": "Audiocodec: {0}", + "ValueVideoCodec": "Videocodec: {0}", "ValueCodec": "Codec: {0}", - "ValueConditions": "Conditions: {0}", - "LabelAll": "All", - "HeaderDeleteImage": "Delete Image", - "MessageFileNotFound": "File not found.", - "MessageFileReadError": "An error occurred reading this file.", - "ButtonNextPage": "Next Page", - "ButtonPreviousPage": "Previous Page", - "ButtonMoveLeft": "Move left", - "ButtonMoveRight": "Move right", - "ButtonBrowseOnlineImages": "Browse online images", - "HeaderDeleteItem": "Delete Item", - "ConfirmDeleteItem": "Are you sure you wish to delete this item from your library?", - "MessagePleaseEnterNameOrId": "Please enter a name or an external Id.", - "MessageValueNotCorrect": "The value entered is not correct. Please try again.", - "MessageItemSaved": "Item saved.", + "ValueConditions": "Villkor: {0}", + "LabelAll": "Alla", + "HeaderDeleteImage": "Radera bild", + "MessageFileNotFound": "Filen hittades ej.", + "MessageFileReadError": "Ett fel uppstod vid l\u00e4sning av filen.", + "ButtonNextPage": "N\u00e4sta sida", + "ButtonPreviousPage": "F\u00f6reg\u00e5ende sida", + "ButtonMoveLeft": "V\u00e4nster", + "ButtonMoveRight": "H\u00f6ger", + "ButtonBrowseOnlineImages": "Bl\u00e4ddra bland bilder online", + "HeaderDeleteItem": "Radera objekt", + "ConfirmDeleteItem": "\u00c4r du s\u00e4ker p\u00e5 att du vill radera det h\u00e4r objektet fr\u00e5n biblioteket?", + "MessagePleaseEnterNameOrId": "Ange ett namn eller externt id.", + "MessageValueNotCorrect": "Det angivna v\u00e4rdet \u00e4r felaktigt. Var god f\u00f6rs\u00f6k igen.", + "MessageItemSaved": "Objektet har sparats.", "OptionEnded": "Avslutad", "OptionContinuing": "P\u00e5g\u00e5ende", "OptionOff": "Av", "OptionOn": "P\u00e5", - "HeaderFields": "Fields", - "HeaderFieldsHelp": "Slide a field to 'off' to lock it and prevent it's data from being changed.", - "HeaderLiveTV": "Live TV", - "MissingLocalTrailer": "Missing local trailer.", - "MissingPrimaryImage": "Missing primary image.", - "MissingBackdropImage": "Missing backdrop image.", - "MissingLogoImage": "Missing logo image.", - "MissingEpisode": "Missing episode.", - "OptionScreenshots": "Screenshots", - "OptionBackdrops": "Backdrops", - "OptionImages": "Images", - "OptionKeywords": "Keywords", - "OptionTags": "Tags", - "OptionStudios": "Studios", - "OptionName": "Name", - "OptionOverview": "Overview", - "OptionGenres": "Genres", + "HeaderFields": "F\u00e4lt", + "HeaderFieldsHelp": "Dra ett f\u00e4lt till \"av\" f\u00f6r att l\u00e5sa det och f\u00f6rhindra att dess data \u00e4ndras.", + "HeaderLiveTV": "Live-TV", + "MissingLocalTrailer": "Lokalt sparad trailer saknas.", + "MissingPrimaryImage": "Huvudbild saknas.", + "MissingBackdropImage": "Fondbild saknas.", + "MissingLogoImage": "Logo saknas.", + "MissingEpisode": "Avsnitt saknas.", + "OptionScreenshots": "Sk\u00e4rmklipp", + "OptionBackdrops": "Fondbilder", + "OptionImages": "Bilder", + "OptionKeywords": "Nyckelord", + "OptionTags": "Etiketter", + "OptionStudios": "Studior", + "OptionName": "Namn", + "OptionOverview": "\u00d6versikt", + "OptionGenres": "Genrer", "OptionParentalRating": "F\u00f6r\u00e4ldraklassning", - "OptionPeople": "People", + "OptionPeople": "Personer", "OptionRuntime": "Speltid", - "OptionProductionLocations": "Production Locations", - "OptionBirthLocation": "Birth Location", + "OptionProductionLocations": "Produktionsplatser", + "OptionBirthLocation": "F\u00f6delseort", "LabelAllChannels": "Alla kanaler", "LabelLiveProgram": "LIVE", - "LabelNewProgram": "NEW", - "LabelPremiereProgram": "PREMIERE", - "HeaderChangeFolderType": "Change Folder Type", - "HeaderChangeFolderTypeHelp": "To change the folder type, please remove and rebuild the collection with the new type.", - "HeaderAlert": "Alert", - "MessagePleaseRestart": "Please restart to finish updating.", + "LabelNewProgram": "NY", + "LabelPremiereProgram": "PREMI\u00c4R", + "HeaderChangeFolderType": "\u00c4ndra mapptyp", + "HeaderChangeFolderTypeHelp": "F\u00f6r att \u00e4ndra mapptyp, ta bort den existerande och skapa en ny av den \u00f6nskade typen.", + "HeaderAlert": "Varning", + "MessagePleaseRestart": "V\u00e4nligen starta om f\u00f6r att slutf\u00f6ra uppdateringarna.", "ButtonRestart": "Starta om", - "MessagePleaseRefreshPage": "Please refresh this page to receive new updates from the server.", - "ButtonHide": "Hide", - "MessageSettingsSaved": "Settings saved.", - "ButtonSignOut": "Sign Out", - "ButtonMyProfile": "My Profile", - "ButtonMyPreferences": "My Preferences", - "MessageBrowserDoesNotSupportWebSockets": "This browser does not support web sockets. For a better experience, try a newer browser such as Chrome, Firefox, IE10+, Safari (iOS) or Opera.", - "LabelInstallingPackage": "Installing {0}", - "LabelPackageInstallCompleted": "{0} installation completed.", - "LabelPackageInstallFailed": "{0} installation failed.", - "LabelPackageInstallCancelled": "{0} installation cancelled.", + "MessagePleaseRefreshPage": "V\u00e4nligen ladda om den h\u00e4r sidan f\u00f6r att ta emot nya uppdateringar fr\u00e5n servern.", + "ButtonHide": "D\u00f6lj", + "MessageSettingsSaved": "Inst\u00e4llningarna har sparats.", + "ButtonSignOut": "Logga ut", + "ButtonMyProfile": "Min profil", + "ButtonMyPreferences": "Mina inst\u00e4llningar", + "MessageBrowserDoesNotSupportWebSockets": "Den h\u00e4r webbl\u00e4saren st\u00f6djer inte web sockets. F\u00f6r att f\u00e5 en b\u00e4ttre upplevelse, prova en nyare webbl\u00e4sare, t ex Chrome, Firefox, IE10+, Safari (iOS) eller Opera.", + "LabelInstallingPackage": "Installerar {0}", + "LabelPackageInstallCompleted": "Installationen av {0} slutf\u00f6rdes.", + "LabelPackageInstallFailed": "Installationen av {0} misslyckades.", + "LabelPackageInstallCancelled": "Installationen av {0} avbr\u00f6ts.", "TabServer": "Server", - "TabUsers": "Users", - "TabLibrary": "Library", + "TabUsers": "Anv\u00e4ndare", + "TabLibrary": "Bibliotek", "TabMetadata": "Metadata", "TabDLNA": "DLNA", - "TabLiveTV": "Live TV", - "TabAutoOrganize": "Auto-Organize", - "TabPlugins": "Plugins", + "TabLiveTV": "Live-TV", + "TabAutoOrganize": "Katalogisera automatiskt", + "TabPlugins": "Till\u00e4gg", "TabAdvanced": "Avancerat", - "TabHelp": "Help", - "TabScheduledTasks": "Scheduled Tasks", - "ButtonFullscreen": "Fullscreen", - "ButtonAudioTracks": "Audio Tracks", + "TabHelp": "Hj\u00e4lp", + "TabScheduledTasks": "Schemalagda aktiviteter", + "ButtonFullscreen": "Fullsk\u00e4rm", + "ButtonAudioTracks": "Ljudsp\u00e5r", "ButtonSubtitles": "Undertexter", "ButtonScenes": "Scener", - "ButtonQuality": "Quality", - "HeaderNotifications": "Notifications", - "HeaderSelectPlayer": "Select Player:", + "ButtonQuality": "Kvalitet", + "HeaderNotifications": "Meddelanden", + "HeaderSelectPlayer": "V\u00e4lj uppspelare:", "ButtonSelect": "V\u00e4lj", "ButtonNew": "Nytillkommet", - "MessageInternetExplorerWebm": "For best results with Internet Explorer please install the WebM plugin for IE.", - "HeaderVideoError": "Video Error" + "MessageInternetExplorerWebm": "F\u00f6r b\u00e4sta resultat med Internet Explorer, installera WebM-till\u00e4gget f\u00f6r IE.", + "HeaderVideoError": "Videofel" } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/tr.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/tr.json new file mode 100644 index 000000000..03a4ff2ce --- /dev/null +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/tr.json @@ -0,0 +1,323 @@ +{ + "SettingsSaved": "Ayarlar Kaydedildi", + "AddUser": "Kullan\u0131c\u0131 Ekle", + "Users": "Kullan\u0131c\u0131lar", + "Delete": "Sil", + "Administrator": "Y\u00f6netici", + "Password": "\u015eifre", + "DeleteImage": "Resmi Sil", + "DeleteImageConfirmation": "Bu G\u00f6r\u00fcnt\u00fcy\u00fc Silmek \u0130stedi\u011finizden Eminmisiniz?", + "FileReadCancelled": "Dosya Okuma \u0130ptal Edildi", + "FileNotFound": "Dosya Bulunamad\u0131", + "FileReadError": "Dosya Okunurken Bir Hata Olu\u015ftu", + "DeleteUser": "Kullan\u0131c\u0131 Sil", + "DeleteUserConfirmation": "Silmek \u0130stedi\u011finizden Eminmisiniz {0} ?", + "PasswordResetHeader": "\u015eifre S\u0131f\u0131rland\u0131", + "PasswordResetComplete": "Parolan\u0131z S\u0131f\u0131rlanm\u0131\u015ft\u0131r.", + "PasswordResetConfirmation": "\u015eifrenizi S\u0131f\u0131rlamak \u0130stesi\u011finizden Eminmisiniz?", + "PasswordSaved": "\u015eifre Kaydedildi", + "PasswordMatchError": "Parola ve \u015eifre E\u015fle\u015fmelidir.", + "OptionRelease": "Resmi Yay\u0131n", + "OptionBeta": "Beta", + "OptionDev": "Dev (Unstable)", + "UninstallPluginHeader": "Uninstall Plugin", + "UninstallPluginConfirmation": "Kald\u0131rmak \u0130stedi\u011finizden Eminmisiniz {0} ?", + "NoPluginConfigurationMessage": "This plugin has nothing to configure.", + "NoPluginsInstalledMessage": "Eklentiler Y\u00fckl\u00fc De\u011fil", + "BrowsePluginCatalogMessage": "Mevcut Eklentileri G\u00f6rebilmek \u0130\u00e7in Eklenti Kato\u011funa G\u00f6z At\u0131n.", + "MessageKeyEmailedTo": "Key emailed to {0}.", + "MessageKeysLinked": "Keys linked.", + "HeaderConfirmation": "Confirmation", + "MessageKeyUpdated": "Thank you. Your supporter key has been updated.", + "MessageKeyRemoved": "Thank you. Your supporter key has been removed.", + "ErrorLaunchingChromecast": "There was an error launching chromecast. Please ensure your device is connected to your wireless network.", + "HeaderSearch": "Search", + "LabelArtist": "Artist", + "LabelMovie": "Movie", + "LabelMusicVideo": "Music Video", + "LabelEpisode": "Episode", + "LabelSeries": "Series", + "LabelStopping": "Stopping", + "LabelCancelled": "(cancelled)", + "LabelFailed": "(failed)", + "LabelAbortedByServerShutdown": "(Aborted by server shutdown)", + "LabelScheduledTaskLastRan": "Last ran {0}, taking {1}.", + "HeaderDeleteTaskTrigger": "Delete Task Trigger", + "HeaderTaskTriggers": "Task Triggers", + "MessageDeleteTaskTrigger": "Are you sure you wish to delete this task trigger?", + "MessageNoPluginsInstalled": "You have no plugins installed.", + "LabelVersionInstalled": "{0} installed", + "LabelNumberReviews": "{0} Reviews", + "LabelFree": "Free", + "HeaderSelectAudio": "Select Audio", + "HeaderSelectSubtitles": "Select Subtitles", + "LabelDefaultStream": "(Default)", + "LabelForcedStream": "(Forced)", + "LabelDefaultForcedStream": "(Default\/Forced)", + "LabelUnknownLanguage": "Unknown language", + "ButtonMute": "Mute", + "ButtonUnmute": "Unmute", + "ButtonStop": "Stop", + "ButtonNextTrack": "Next Track", + "ButtonPause": "Pause", + "ButtonPlay": "\u00c7al", + "ButtonEdit": "D\u00fczenle", + "ButtonQueue": "Queue", + "ButtonPlayTrailer": "Play trailer", + "ButtonPlaylist": "Playlist", + "ButtonPreviousTrack": "Previous Track", + "LabelEnabled": "Enabled", + "LabelDisabled": "Disabled", + "ButtonMoreInformation": "More Information", + "LabelNoUnreadNotifications": "No unread notifications.", + "ButtonViewNotifications": "View notifications", + "ButtonMarkTheseRead": "Mark these read", + "ButtonClose": "Close", + "LabelAllPlaysSentToPlayer": "All plays will be sent to the selected player.", + "MessageInvalidUser": "Invalid user or password.", + "HeaderAllRecordings": "T\u00fcm Kay\u0131tlar", + "RecommendationBecauseYouLike": "Because you like {0}", + "RecommendationBecauseYouWatched": "Because you watched {0}", + "RecommendationDirectedBy": "Directed by {0}", + "RecommendationStarring": "Starring {0}", + "HeaderConfirmRecordingCancellation": "Confirm Recording Cancellation", + "MessageConfirmRecordingCancellation": "Are you sure you wish to cancel this recording?", + "MessageRecordingCancelled": "Recording cancelled.", + "HeaderConfirmSeriesCancellation": "Confirm Series Cancellation", + "MessageConfirmSeriesCancellation": "Are you sure you wish to cancel this series?", + "MessageSeriesCancelled": "Series cancelled.", + "HeaderConfirmRecordingDeletion": "Confirm Recording Deletion", + "MessageConfirmRecordingDeletion": "Are you sure you wish to delete this recording?", + "MessageRecordingDeleted": "Recording deleted.", + "ButonCancelRecording": "Cancel Recording", + "MessageRecordingSaved": "Recording saved.", + "OptionSunday": "Pazar", + "OptionMonday": "Pazartesi", + "OptionTuesday": "Sal\u0131", + "OptionWednesday": "\u00c7ar\u015famba", + "OptionThursday": "Per\u015fembe", + "OptionFriday": "Cuma", + "OptionSaturday": "Cumartesi", + "HeaderConfirmDeletion": "Confirm Deletion", + "MessageConfirmPathSubstitutionDeletion": "Are you sure you wish to delete this path substitution?", + "LiveTvUpdateAvailable": "(Update available)", + "LabelVersionUpToDate": "Up to date!", + "ButtonResetTuner": "Reset tuner", + "HeaderResetTuner": "Reset Tuner", + "MessageConfirmResetTuner": "Are you sure you wish to reset this tuner? Any active players or recordings will be abruptly stopped.", + "ButtonCancelSeries": "Cancel Series", + "HeaderSeriesRecordings": "Series Recordings", + "LabelAnytime": "Any time", + "StatusRecording": "Recording", + "StatusWatching": "Watching", + "StatusRecordingProgram": "Recording {0}", + "StatusWatchingProgram": "Watching {0}", + "HeaderSplitMedia": "Split Media Apart", + "MessageConfirmSplitMedia": "Are you sure you wish to split the media sources into separate items?", + "HeaderError": "Error", + "MessagePleaseSelectOneItem": "Please select at least one item.", + "MessagePleaseSelectTwoItems": "Please select at least two items.", + "MessageTheFollowingItemsWillBeGrouped": "The following titles will be grouped into one item:", + "MessageConfirmItemGrouping": "Media Browser clients will automatically choose the optimal version to play based on device and network performance. Are you sure you wish to continue?", + "HeaderResume": "Devam", + "HeaderMyViews": "My Views", + "HeaderLibraryFolders": "Media Folders", + "HeaderLatestMedia": "Latest Media", + "ButtonMore": "More...", + "HeaderFavoriteMovies": "Favorite Movies", + "HeaderFavoriteShows": "Favorite Shows", + "HeaderFavoriteEpisodes": "Favorite Episodes", + "HeaderFavoriteGames": "Favorite Games", + "HeaderRatingsDownloads": "Rating \/ Downloads", + "HeaderConfirmProfileDeletion": "Confirm Profile Deletion", + "MessageConfirmProfileDeletion": "Are you sure you wish to delete this profile?", + "HeaderSelectServerCachePath": "Select Server Cache Path", + "HeaderSelectTranscodingPath": "Select Transcoding Temporary Path", + "HeaderSelectImagesByNamePath": "Select Images By Name Path", + "HeaderSelectMetadataPath": "Select Metadata Path", + "HeaderSelectServerCachePathHelp": "Browse or enter the path to use for server cache files. The folder must be writeable. The location of this folder will directly impact server performance and should ideally be placed on a solid state drive.", + "HeaderSelectTranscodingPathHelp": "Browse or enter the path to use for transcoding temporary files. The folder must be writeable.", + "HeaderSelectImagesByNamePathHelp": "Browse or enter the path to your items by name folder. The folder must be writeable.", + "HeaderSelectMetadataPathHelp": "Browse or enter the path you'd like to store metadata within. The folder must be writeable.", + "HeaderSelectChannelDownloadPath": "Select Channel Download Path", + "HeaderSelectChannelDownloadPathHelp": "Browse or enter the path to use for storing channel cache files. The folder must be writeable.", + "OptionNewCollection": "New...", + "ButtonAdd": "Ekle", + "ButtonRemove": "Sil", + "LabelChapterDownloaders": "Chapter downloaders:", + "LabelChapterDownloadersHelp": "Enable and rank your preferred chapter downloaders in order of priority. Lower priority downloaders will only be used to fill in missing information.", + "HeaderFavoriteAlbums": "Favorite Albums", + "HeaderLatestChannelMedia": "Latest Channel Items", + "ButtonOrganizeFile": "Organize File", + "ButtonDeleteFile": "Delete File", + "HeaderOrganizeFile": "Organize File", + "HeaderDeleteFile": "Delete File", + "StatusSkipped": "Skipped", + "StatusFailed": "Failed", + "StatusSuccess": "Success", + "MessageFileWillBeDeleted": "The following file will be deleted:", + "MessageSureYouWishToProceed": "Are you sure you wish to proceed?", + "MessageDuplicatesWillBeDeleted": "In addition the following dupliates will be deleted:", + "MessageFollowingFileWillBeMovedFrom": "The following file will be moved from:", + "MessageDestinationTo": "to:", + "HeaderSelectWatchFolder": "Select Watch Folder", + "HeaderSelectWatchFolderHelp": "Browse or enter the path to your watch folder. The folder must be writeable.", + "OrganizePatternResult": "Result: {0}", + "HeaderRestart": "Restart", + "HeaderShutdown": "Shutdown", + "MessageConfirmRestart": "Are you sure you wish to restart Media Browser Server?", + "MessageConfirmShutdown": "Are you sure you wish to shutdown Media Browser Server?", + "ButtonUpdateNow": "Update Now", + "NewVersionOfSomethingAvailable": "A new version of {0} is available!", + "VersionXIsAvailableForDownload": "Version {0} is now available for download.", + "LabelVersionNumber": "Version {0}", + "LabelPlayMethodTranscoding": "Transcoding", + "LabelPlayMethodDirectStream": "Direct Streaming", + "LabelPlayMethodDirectPlay": "Direct Playing", + "LabelAudioCodec": "Audio: {0}", + "LabelVideoCodec": "Video: {0}", + "LabelRemoteAccessUrl": "Remote access: {0}", + "LabelRunningOnPort": "Running on port {0}.", + "LabelRunningOnPorts": "Running on ports {0} and {1}.", + "HeaderLatestFromChannel": "Latest from {0}", + "ButtonDownload": "Download", + "LabelUnknownLanaguage": "Unknown language", + "HeaderCurrentSubtitles": "Current Subtitles", + "MessageDownloadQueued": "The download has been queued.", + "MessageAreYouSureDeleteSubtitles": "Are you sure you wish to delete this subtitle file?", + "ButtonRemoteControl": "Remote Control", + "HeaderLatestTvRecordings": "Latest Recordings", + "ButtonOk": "Tamam", + "ButtonCancel": "\u0130ptal", + "ButtonRefresh": "Refresh", + "LabelCurrentPath": "Current path:", + "HeaderSelectMediaPath": "Select Media Path", + "ButtonNetwork": "Network", + "MessageDirectoryPickerInstruction": "Network paths can be entered manually in the event the Network button fails to locate your devices. For example, {0} or {1}.", + "HeaderMenu": "Menu", + "ButtonOpen": "Open", + "ButtonOpenInNewTab": "Open in new tab", + "ButtonShuffle": "Shuffle", + "ButtonInstantMix": "Instant mix", + "ButtonResume": "Resume", + "HeaderScenes": "Diziler", + "HeaderAudioTracks": "Audio Tracks", + "HeaderSubtitles": "Subtitles", + "HeaderVideoQuality": "Video Quality", + "MessageErrorPlayingVideo": "There was an error playing the video.", + "MessageEnsureOpenTuner": "Please ensure there is an open tuner availalble.", + "ButtonHome": "Home", + "ButtonDashboard": "Dashboard", + "ButtonReports": "Reports", + "ButtonMetadataManager": "Metadata Manager", + "HeaderTime": "Time", + "HeaderName": "Name", + "HeaderAlbum": "Album", + "HeaderAlbumArtist": "Album Artist", + "HeaderArtist": "Artist", + "LabelAddedOnDate": "Added {0}", + "ButtonStart": "Start", + "HeaderChannels": "Kanallar", + "HeaderMediaFolders": "Media Klas\u00f6rleri", + "HeaderBlockItemsWithNoRating": "Block items with no rating information:", + "OptionBlockOthers": "Others", + "OptionBlockTvShows": "TV Shows", + "OptionBlockTrailers": "Trailers", + "OptionBlockMusic": "Music", + "OptionBlockMovies": "Movies", + "OptionBlockBooks": "Books", + "OptionBlockGames": "Games", + "OptionBlockLiveTvPrograms": "Live TV Programs", + "OptionBlockLiveTvChannels": "Live TV Channels", + "OptionBlockChannelContent": "Internet Channel Content", + "ButtonRevoke": "Revoke", + "MessageConfirmRevokeApiKey": "Are you sure you wish to revoke this api key? The application's connection to Media Browser will be abruptly terminated.", + "HeaderConfirmRevokeApiKey": "Revoke Api Key", + "ValueContainer": "Container: {0}", + "ValueAudioCodec": "Audio Codec: {0}", + "ValueVideoCodec": "Video Codec: {0}", + "ValueCodec": "Codec: {0}", + "ValueConditions": "Conditions: {0}", + "LabelAll": "All", + "HeaderDeleteImage": "Delete Image", + "MessageFileNotFound": "File not found.", + "MessageFileReadError": "An error occurred reading this file.", + "ButtonNextPage": "Next Page", + "ButtonPreviousPage": "Previous Page", + "ButtonMoveLeft": "Move left", + "ButtonMoveRight": "Move right", + "ButtonBrowseOnlineImages": "Browse online images", + "HeaderDeleteItem": "Delete Item", + "ConfirmDeleteItem": "Are you sure you wish to delete this item from your library?", + "MessagePleaseEnterNameOrId": "Please enter a name or an external Id.", + "MessageValueNotCorrect": "The value entered is not correct. Please try again.", + "MessageItemSaved": "Item saved.", + "OptionEnded": "Bitmi\u015f", + "OptionContinuing": "Continuing", + "OptionOff": "Off", + "OptionOn": "On", + "HeaderFields": "Fields", + "HeaderFieldsHelp": "Slide a field to 'off' to lock it and prevent it's data from being changed.", + "HeaderLiveTV": "Live TV", + "MissingLocalTrailer": "Missing local trailer.", + "MissingPrimaryImage": "Missing primary image.", + "MissingBackdropImage": "Missing backdrop image.", + "MissingLogoImage": "Missing logo image.", + "MissingEpisode": "Missing episode.", + "OptionScreenshots": "Screenshots", + "OptionBackdrops": "Backdrops", + "OptionImages": "Images", + "OptionKeywords": "Keywords", + "OptionTags": "Tags", + "OptionStudios": "Studios", + "OptionName": "Name", + "OptionOverview": "Overview", + "OptionGenres": "Genres", + "OptionParentalRating": "Parental Rating", + "OptionPeople": "People", + "OptionRuntime": "Runtime", + "OptionProductionLocations": "Production Locations", + "OptionBirthLocation": "Birth Location", + "LabelAllChannels": "All channels", + "LabelLiveProgram": "LIVE", + "LabelNewProgram": "NEW", + "LabelPremiereProgram": "PREMIERE", + "HeaderChangeFolderType": "Change Folder Type", + "HeaderChangeFolderTypeHelp": "To change the folder type, please remove and rebuild the collection with the new type.", + "HeaderAlert": "Alert", + "MessagePleaseRestart": "Please restart to finish updating.", + "ButtonRestart": "Restart", + "MessagePleaseRefreshPage": "Please refresh this page to receive new updates from the server.", + "ButtonHide": "Hide", + "MessageSettingsSaved": "Settings saved.", + "ButtonSignOut": "Sign Out", + "ButtonMyProfile": "My Profile", + "ButtonMyPreferences": "My Preferences", + "MessageBrowserDoesNotSupportWebSockets": "This browser does not support web sockets. For a better experience, try a newer browser such as Chrome, Firefox, IE10+, Safari (iOS) or Opera.", + "LabelInstallingPackage": "Installing {0}", + "LabelPackageInstallCompleted": "{0} installation completed.", + "LabelPackageInstallFailed": "{0} installation failed.", + "LabelPackageInstallCancelled": "{0} installation cancelled.", + "TabServer": "Server", + "TabUsers": "Users", + "TabLibrary": "Library", + "TabMetadata": "Metadata", + "TabDLNA": "DLNA", + "TabLiveTV": "Live TV", + "TabAutoOrganize": "Auto-Organize", + "TabPlugins": "Plugins", + "TabAdvanced": "Geli\u015fmi\u015f", + "TabHelp": "Help", + "TabScheduledTasks": "Scheduled Tasks", + "ButtonFullscreen": "Fullscreen", + "ButtonAudioTracks": "Audio Tracks", + "ButtonSubtitles": "Subtitles", + "ButtonScenes": "Scenes", + "ButtonQuality": "Quality", + "HeaderNotifications": "Notifications", + "HeaderSelectPlayer": "Select Player:", + "ButtonSelect": "Se\u00e7im", + "ButtonNew": "Yeni", + "MessageInternetExplorerWebm": "For best results with Internet Explorer please install the WebM plugin for IE.", + "HeaderVideoError": "Video Error" +} \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/LocalizationManager.cs b/MediaBrowser.Server.Implementations/Localization/LocalizationManager.cs index 1f993f0d4..38a3730e8 100644 --- a/MediaBrowser.Server.Implementations/Localization/LocalizationManager.cs +++ b/MediaBrowser.Server.Implementations/Localization/LocalizationManager.cs @@ -380,6 +380,7 @@ namespace MediaBrowser.Server.Implementations.Localization new LocalizatonOption{ Name="Spanish", Value="es-ES"}, new LocalizatonOption{ Name="Spanish (Mexico)", Value="es-MX"}, new LocalizatonOption{ Name="Swedish", Value="sv"}, + new LocalizatonOption{ Name="Turkish", Value="tr"}, new LocalizatonOption{ Name="Vietnamese", Value="vi"} }.OrderBy(i => i.Name); diff --git a/MediaBrowser.Server.Implementations/Localization/Server/es_MX.json b/MediaBrowser.Server.Implementations/Localization/Server/es_MX.json index d6e96d1ed..bec77ac61 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/es_MX.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/es_MX.json @@ -148,7 +148,7 @@ "OptionThumb": "Miniatura", "OptionBanner": "T\u00edtulo", "OptionCriticRating": "Calificaci\u00f3n de la Cr\u00edtica", - "OptionVideoBitrate": "Tasa de Bits de Video", + "OptionVideoBitrate": "Tasa de bits de Video", "OptionResumable": "Reanudable", "ScheduledTasksHelp": "Da click en una tarea para ajustar su programaci\u00f3n.", "ScheduledTasksTitle": "Tareas Programadas", @@ -691,10 +691,10 @@ "HeaderProfileServerSettingsHelp": "Estos valores controlan la manera en que Media Browser se presentar\u00e1 a s\u00ed mismo ante el dispositivo.", "LabelMaxBitrate": "Tasa de bits m\u00e1xima:", "LabelMaxBitrateHelp": "Especifique la tasa de bits m\u00e1xima para ambientes con un ancho de banda limitado, o si el dispositivo impone sus propios l\u00edmites.", - "LabelMaxStreamingBitrate": "Max streaming bitrate:", - "LabelMaxStreamingBitrateHelp": "Specify a max bitrate when streaming.", - "LabelMaxStaticBitrate": "Max sync bitrate:", - "LabelMaxStaticBitrateHelp": "Specify a max bitrate when syncing content at high quality.", + "LabelMaxStreamingBitrate": "Tasa de bits m\u00e1xima para transmisi\u00f3n :", + "LabelMaxStreamingBitrateHelp": "Especifique una tasa de bits m\u00e1xima para transmitir.", + "LabelMaxStaticBitrate": "Tasa m\u00e1xima de bits de sinc", + "LabelMaxStaticBitrateHelp": "Especifique una tasa de bits cuando se sincronice contenido en alta calidad.", "OptionIgnoreTranscodeByteRangeRequests": "Ignorar solicitudes de transcodificaci\u00f3n de rango de byte.", "OptionIgnoreTranscodeByteRangeRequestsHelp": "Si se habilita, estas solicitudes seran honradas pero se ignorar\u00e1 el encabezado de rango de byte.", "LabelFriendlyName": "Nombre amistoso:", @@ -771,10 +771,10 @@ "OptionAuto": "Autom\u00e1tico", "OptionYes": "Si", "OptionNo": "No", - "LabelHomePageSection1": "Pagina principal secci\u00f3n uno:", - "LabelHomePageSection2": "Pagina principal secci\u00f3n dos:", - "LabelHomePageSection3": "Pagina principal secci\u00f3n tres:", - "LabelHomePageSection4": "Pagina principal secci\u00f3n cuatro:", + "LabelHomePageSection1": "Pagina de Inicio secci\u00f3n uno:", + "LabelHomePageSection2": "Pagina de Inicio secci\u00f3n dos:", + "LabelHomePageSection3": "Pagina de Inicio secci\u00f3n tres:", + "LabelHomePageSection4": "Pagina de Inicio secci\u00f3n cuatro:", "OptionMyViewsButtons": "Mis vistas (botones)", "OptionMyViews": "Mis vistas", "OptionMyViewsSmall": "Mis vistas (peque\u00f1o)", @@ -799,7 +799,7 @@ "MessageLearnHowToCustomize": "Aprenda c\u00f3mo personalizar esta p\u00e1gina a sus gustos personales. Haga clic en su icono de usuario en la esquina superior derecha de la pantalla para ver y actualizar sus preferencias.", "ButtonEditOtherUserPreferences": "Edita las preferencias personales de este usuario.", "LabelChannelStreamQuality": "Calidad por defecto para transmisi\u00f3n por internet:", - "LabelChannelStreamQualityHelp": "En un ambiente de ancho de banda limitados, limitar la calidad puede ayudar a asegurar una experiencia de transimisi\u00f3n fluida.", + "LabelChannelStreamQualityHelp": "En un ambiente de ancho de banda limitado, limitar la calidad puede ayudar a asegurar una experiencia de transimisi\u00f3n fluida.", "OptionBestAvailableStreamQuality": "La mejor disponible", "LabelEnableChannelContentDownloadingFor": "Habilitar descarga de contenidos del canal para:", "LabelEnableChannelContentDownloadingForHelp": "Algunos canales soportan la descarga de contenido previo a su despliegue. Habilite esto en ambientes de ancho de banda limitados para descargar contenido del canal en horarios no pico. El contenido es descargado como parte de la tarea programada para descarga del canal.", @@ -889,16 +889,16 @@ "TabUsers": "Usuarios", "HeaderFeatures": "Caracter\u00edsticas", "HeaderAdvanced": "Avanzado", - "ButtonSync": "Sincronizar", + "ButtonSync": "Sinc", "TabScheduledTasks": "Tareas Programadas", "HeaderChapters": "Cap\u00edtulos", "HeaderResumeSettings": "Configuraci\u00f3n para Continuar", - "TabSync": "Sync", - "TitleUsers": "Users", - "LabelProtocol": "Protocol:", + "TabSync": "Sinc", + "TitleUsers": "Usuarios", + "LabelProtocol": "Protocolo:", "OptionProtocolHttp": "Http", - "OptionProtocolHls": "Http Live Streaming", - "LabelContext": "Context:", - "OptionContextStreaming": "Streaming", - "OptionContextStatic": "Sync" + "OptionProtocolHls": "Transmisi\u00f3n en vivo por Http", + "LabelContext": "Contexto:", + "OptionContextStreaming": "Transmisi\u00f3n", + "OptionContextStatic": "Sinc." } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/Server/it.json b/MediaBrowser.Server.Implementations/Localization/Server/it.json index 2101e854a..0aa4a2731 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/it.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/it.json @@ -691,10 +691,10 @@ "HeaderProfileServerSettingsHelp": "Controllano questi valori come Media Browser si presenter\u00e0 al dispositivo.", "LabelMaxBitrate": "Max bitrate:", "LabelMaxBitrateHelp": "Specificare un bitrate massimo in ambienti larghezza di banda limitata, o se il dispositivo impone il suo limite proprio.", - "LabelMaxStreamingBitrate": "Max streaming bitrate:", - "LabelMaxStreamingBitrateHelp": "Specify a max bitrate when streaming.", - "LabelMaxStaticBitrate": "Max sync bitrate:", - "LabelMaxStaticBitrateHelp": "Specify a max bitrate when syncing content at high quality.", + "LabelMaxStreamingBitrate": "Massimo Bitrate streaming", + "LabelMaxStreamingBitrateHelp": "Specifica il bitrate massimo per lo streaming", + "LabelMaxStaticBitrate": "Massimo sinc. Bitrate", + "LabelMaxStaticBitrateHelp": "Specifica il bitrate massimo quando sincronizzi ad alta qualit\u00e0", "OptionIgnoreTranscodeByteRangeRequests": "Ignorare le richieste di intervallo di byte di trascodifica", "OptionIgnoreTranscodeByteRangeRequestsHelp": "Se abilitata, queste richieste saranno onorati, ma ignorano l'intestazione intervallo di byte.", "LabelFriendlyName": "Nome Condiviso", @@ -771,10 +771,10 @@ "OptionAuto": "Automatico", "OptionYes": "Si", "OptionNo": "No", - "LabelHomePageSection1": "Sezione 1 pagina iniziale", - "LabelHomePageSection2": "Sezione 2 pagina iniziale", - "LabelHomePageSection3": "Sezione 3 pagina iniziale", - "LabelHomePageSection4": "Sezione Home page sezione quattro:", + "LabelHomePageSection1": "Sezione 1 pagina iniziale:", + "LabelHomePageSection2": "Sezione 2 pagina iniziale:", + "LabelHomePageSection3": "Sezione 3 pagina iniziale:", + "LabelHomePageSection4": "Sezione 4 pagina iniziale:", "OptionMyViewsButtons": "Mie Viste", "OptionMyViews": "Mie Viste", "OptionMyViewsSmall": "Mie Viste", @@ -889,16 +889,16 @@ "TabUsers": "Utenti", "HeaderFeatures": "Caratteristiche", "HeaderAdvanced": "Avanzato", - "ButtonSync": "Sync", + "ButtonSync": "Sinc.", "TabScheduledTasks": "Operazioni pianificate", - "HeaderChapters": "Chapters", - "HeaderResumeSettings": "Resume Settings", - "TabSync": "Sync", - "TitleUsers": "Users", - "LabelProtocol": "Protocol:", + "HeaderChapters": "Capitoli", + "HeaderResumeSettings": "Recupera impostazioni", + "TabSync": "Sinc", + "TitleUsers": "Utenti", + "LabelProtocol": "Protocollo:", "OptionProtocolHttp": "Http", "OptionProtocolHls": "Http Live Streaming", - "LabelContext": "Context:", + "LabelContext": "Contenuto:", "OptionContextStreaming": "Streaming", - "OptionContextStatic": "Sync" + "OptionContextStatic": "Sinc" } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/Server/kk.json b/MediaBrowser.Server.Implementations/Localization/Server/kk.json index aabaffb51..718c5b96e 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/kk.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/kk.json @@ -107,7 +107,7 @@ "OptionLikes": "\u04b0\u043d\u0430\u0442\u0443\u043b\u0430\u0440", "OptionDislikes": "\u04b0\u043d\u0430\u0442\u043f\u0430\u0443\u043b\u0430\u0440", "OptionActors": "\u0410\u043a\u0442\u0435\u0440\u043b\u0435\u0440", - "OptionGuestStars": "\u049a\u043e\u043d\u0430\u049b \u0436\u04b1\u043b\u0434\u044b\u0437\u0434\u0430\u0440", + "OptionGuestStars": "\u0428\u0430\u049b\u044b\u0440\u044b\u043b\u0493\u0430\u043d \u0430\u043a\u0442\u0435\u0440\u043b\u0435\u0440", "OptionDirectors": "\u0420\u0435\u0436\u0438\u0441\u0441\u0435\u0440\u043b\u0435\u0440", "OptionWriters": "\u0416\u0430\u0437\u0443\u0448\u044b\u043b\u0430\u0440", "OptionProducers": "\u041f\u0440\u043e\u0434\u044e\u0441\u0435\u0440\u043b\u0435\u0440", @@ -433,7 +433,7 @@ "LabelEnableDlnaDebugLogging": "DLNA \u043a\u04af\u0439\u043a\u0435\u043b\u0442\u0456\u0440\u0443 \u0436\u0430\u0437\u0431\u0430\u043b\u0430\u0440\u044b\u043d \u0436\u04b1\u0440\u043d\u0430\u043b\u0434\u0430 \u049b\u043e\u0441\u0443", "LabelEnableDlnaDebugLoggingHelp": "\u04e8\u0442\u0435 \u0430\u0443\u049b\u044b\u043c\u0434\u044b \u0436\u04b1\u0440\u043d\u0430\u043b \u0444\u0430\u0439\u043b\u0434\u0430\u0440\u044b \u0436\u0430\u0441\u0430\u043b\u0430\u0434\u044b \u0436\u04d9\u043d\u0435 \u0442\u0435\u043a \u049b\u0430\u043d\u0430 \u0430\u049b\u0430\u0443\u043b\u044b\u049b\u0442\u0430\u0440\u0434\u044b \u0436\u043e\u044e \u04af\u0448\u0456\u043d \u049b\u0430\u0436\u0435\u0442 \u0431\u043e\u043b\u0493\u0430\u043d \u0440\u0435\u0442\u0456\u043d\u0434\u0435 \u043f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u044b\u043b\u0430\u0434\u044b.", "LabelEnableDlnaClientDiscoveryInterval": "\u041a\u043b\u0438\u0435\u043d\u0442\u0442\u0435\u0440\u0434\u0456 \u0442\u0430\u0443\u044b\u043f \u0430\u0448\u0443 \u0430\u0440\u0430\u043b\u044b\u0493\u044b, \u0441:", - "LabelEnableDlnaClientDiscoveryIntervalHelp": "\u0421\u0435\u0440\u0432\u0435\u0440 \u0431\u0435\u043b\u0441\u0435\u043d\u0434\u0456\u043b\u0456\u0433\u0456\u043d \u0442\u0435\u043a\u0441\u0435\u0440\u0443 \u0445\u0430\u0431\u0430\u0440\u043b\u0430\u0440\u0434\u044b\u04a3 \u0430\u0440\u0430\u0441\u044b\u043d\u0434\u0430\u0493\u044b \u04b1\u0437\u0430\u049b\u0442\u044b\u0493\u044b\u043d \u0441\u0435\u043a\u0443\u043d\u0434\u0442\u0430\u0440 \u0430\u0440\u049b\u044b\u043b\u044b \u0430\u043d\u044b\u049b\u0442\u0430\u0443.", + "LabelEnableDlnaClientDiscoveryIntervalHelp": "\u0421\u0435\u0440\u0432\u0435\u0440 \u0431\u0435\u043b\u0441\u0435\u043d\u0434\u0456\u043b\u0456\u0433\u0456\u043d \u0442\u0435\u043a\u0441\u0435\u0440\u0443 \u0445\u0430\u0431\u0430\u0440\u043b\u0430\u0440\u0434\u044b\u04a3 \u0430\u0440\u0430\u0441\u044b\u043d\u0434\u0430\u0493\u044b \u04b1\u0437\u0430\u049b\u0442\u044b\u0493\u044b\u043d \u0441\u0435\u043a\u0443\u043d\u0434\u0442\u0430\u0440 \u0430\u0440\u049b\u044b\u043b\u044b \u0430\u043d\u044b\u049b\u0442\u0430\u0439\u0434\u044b.", "HeaderCustomDlnaProfiles": "\u0422\u0435\u04a3\u0448\u0435\u043b\u0433\u0435\u043d \u043f\u0440\u043e\u0444\u0438\u043b\u044c\u0434\u0435\u0440", "HeaderSystemDlnaProfiles": "\u0416\u04af\u0439\u0435\u043b\u0456\u043a \u043f\u0440\u043e\u0444\u0438\u043b\u044c\u0434\u0435\u0440", "CustomDlnaProfilesHelp": "\u0416\u0430\u04a3\u0430 \u049b\u04b1\u0440\u044b\u043b\u0493\u044b \u043c\u0430\u049b\u0441\u0430\u0442\u044b \u04af\u0448\u0456\u043d \u0442\u0435\u04a3\u0448\u0435\u043b\u0433\u0435\u043d \u043f\u0440\u043e\u0444\u0438\u043b\u044c\u0434\u0456 \u0436\u0430\u0441\u0430\u0443 \u043d\u0435 \u0436\u04af\u0439\u0435\u043b\u0456\u043a \u043f\u0440\u043e\u0444\u0438\u043b\u044c\u0434\u0456 \u049b\u0430\u0439\u0442\u0430 \u0430\u043d\u044b\u049b\u0442\u0430\u0443.", @@ -496,7 +496,7 @@ "AutoOrganizeHelp": "\u0410\u0432\u0442\u043e\u04b1\u0439\u044b\u043c\u0434\u0430\u0441\u0442\u044b\u0440\u0443 \u0436\u04af\u043a\u0442\u0435\u043f \u0430\u043b\u0443 \u049b\u0430\u043b\u0442\u0430\u043b\u0430\u0440\u044b\u043d\u0434\u0430\u0493\u044b \u0436\u0430\u04a3\u0430 \u0444\u0430\u0439\u043b\u0434\u0430\u0440\u0434\u044b \u0431\u0430\u049b\u044b\u043b\u0430\u0439\u0434\u044b \u0436\u04d9\u043d\u0435 \u0431\u04b1\u043b\u0430\u0440\u0434\u044b \u0442\u0430\u0441\u0443\u0448\u044b \u049b\u0430\u043b\u0442\u0430\u043b\u0430\u0440\u044b\u043d\u0430 \u0436\u044b\u043b\u0436\u044b\u0442\u0430\u0434\u044b.", "AutoOrganizeTvHelp": "\u0422\u0414 \u0444\u0430\u0439\u043b\u0434\u0430\u0440\u044b\u043d \u04b1\u0439\u044b\u043c\u0434\u0430\u0441\u0442\u044b\u0440\u0443 \u043a\u0435\u0437\u0456\u043d\u0434\u0435 \u044d\u043f\u0438\u0437\u043e\u0434\u0442\u0430\u0440 \u0442\u0435\u043a \u049b\u0430\u043d\u0430 \u0431\u0430\u0440 \u0441\u0435\u0440\u0438\u0430\u043b\u0434\u0430\u0440\u0493\u0430 \u04af\u0441\u0442\u0435\u043b\u0456\u043d\u0435\u0434\u0456.", "OptionEnableEpisodeOrganization": "\u0416\u0430\u04a3\u0430 \u044d\u043f\u0438\u0437\u043e\u0434 \u04b1\u0439\u044b\u043c\u0434\u0430\u0441\u0442\u044b\u0440\u0443\u044b\u043d \u049b\u043e\u0441\u0443", - "LabelWatchFolder": "\u0411\u0430\u049b\u044b\u043b\u0430\u0443\u0434\u0430\u0493\u044b \u049b\u0430\u043b\u0442\u0430:", + "LabelWatchFolder": "\u049a\u0430\u0434\u0430\u0493\u0430\u043b\u0430\u0443\u0434\u0430\u0493\u044b \u049b\u0430\u043b\u0442\u0430:", "LabelWatchFolderHelp": "\"\u0416\u0430\u04a3\u0430 \u0442\u0430\u0441\u0443\u0448\u044b \u0444\u0430\u0439\u043b\u0434\u0430\u0440\u044b\u043d \u04b1\u0439\u044b\u043c\u0434\u0430\u0441\u0442\u044b\u0440\u0443\" \u0434\u0435\u0433\u0435\u043d \u0436\u043e\u0441\u043f\u0430\u0440\u043b\u0430\u0493\u0430\u043d \u0442\u0430\u043f\u0441\u044b\u0440\u043c\u0430 \u043e\u0440\u044b\u043d\u0434\u0430\u043b\u0493\u0430\u043d \u043a\u0435\u0437\u0434\u0435 \u0441\u0435\u0440\u0432\u0435\u0440 \u0431\u04b1\u043b \u049b\u0430\u043b\u0442\u0430\u043d\u044b \u0441\u0430\u0443\u0430\u043b\u0434\u0430\u043f \u0442\u04b1\u0440\u0430\u0434\u044b.", "ButtonViewScheduledTasks": "\u0416\u043e\u0441\u043f\u0430\u0440\u043b\u0430\u0493\u0430\u043d \u0442\u0430\u043f\u0441\u044b\u0440\u043c\u0430\u043b\u0430\u0440\u0434\u044b \u049b\u0430\u0440\u0430\u0443", "LabelMinFileSizeForOrganize": "\u0415\u04a3 \u0430\u0437 \u0444\u0430\u0439\u043b \u0430\u0443\u049b\u044b\u043c\u044b (\u041c\u0411):", @@ -507,7 +507,7 @@ "LabelEpisodePattern": "\u042d\u043f\u0438\u0437\u043e\u0434 \u04af\u043b\u0433\u0456\u0441\u0456:", "LabelMultiEpisodePattern": "\u0411\u0456\u0440\u043d\u0435\u0448\u0435 \u044d\u043f\u0438\u0437\u043e\u0434 \u04af\u043b\u0433\u0456\u0441\u0456:", "HeaderSupportedPatterns": "\u049a\u043e\u043b\u0434\u0430\u043d\u044b\u0441\u0442\u0430\u0493\u044b \u04af\u043b\u0433\u0456\u043b\u0435\u0440", - "HeaderTerm": "\u0410\u0442\u0430\u043b\u044b\u043c", + "HeaderTerm": "\u04b0\u0493\u044b\u043c", "HeaderPattern": "\u04ae\u043b\u0433\u0456", "HeaderResult": "\u041d\u04d9\u0442\u0438\u0436\u0435", "LabelDeleteEmptyFolders": "\u04b0\u0439\u044b\u043c\u0434\u0430\u0441\u0442\u044b\u0440\u0443\u0434\u0430\u043d \u043a\u0435\u0439\u0456\u043d \u0431\u043e\u0441 \u049b\u0430\u043b\u0442\u0430\u043b\u0430\u0440\u0434\u044b \u0436\u043e\u044e", @@ -518,7 +518,7 @@ "LabelTransferMethod": "\u0422\u0430\u0441\u044b\u043c\u0430\u043b\u0434\u0430\u0443 \u04d9\u0434\u0456\u0441\u0456", "OptionCopy": "\u041a\u04e9\u0448\u0456\u0440\u0443", "OptionMove": "\u0416\u044b\u043b\u0436\u044b\u0442\u0443", - "LabelTransferMethodHelp": "\u0411\u0430\u049b\u044b\u043b\u0430\u0443\u0434\u0430\u0493\u044b \u049b\u0430\u043b\u0442\u0430\u0434\u0430\u043d \u0444\u0430\u0439\u043b\u0434\u0430\u0440\u0434\u044b \u043a\u04e9\u0448\u0456\u0440\u0443 \u043d\u0435 \u0436\u044b\u043b\u0436\u044b\u0442\u0443", + "LabelTransferMethodHelp": "\u049a\u0430\u0434\u0430\u0493\u0430\u043b\u0430\u0443\u0434\u0430\u0493\u044b \u049b\u0430\u043b\u0442\u0430\u0434\u0430\u043d \u0444\u0430\u0439\u043b\u0434\u0430\u0440\u0434\u044b \u043a\u04e9\u0448\u0456\u0440\u0443 \u043d\u0435 \u0436\u044b\u043b\u0436\u044b\u0442\u0443", "HeaderLatestNews": "\u0415\u04a3 \u043a\u0435\u0439\u0456\u04a3\u0433\u0456 \u0436\u0430\u04a3\u0430\u043b\u044b\u049b\u0442\u0430\u0440", "HeaderHelpImproveMediaBrowser": "Media Browser \u04e9\u043d\u0456\u043c\u0434\u0435\u0440\u0456\u043d \u0436\u0435\u0442\u0456\u043b\u0434\u0456\u0440\u0443\u0433\u0435 \u043a\u04e9\u043c\u0435\u043a", "HeaderRunningTasks": "\u041e\u0440\u044b\u043d\u0434\u0430\u043b\u044b\u043f \u0436\u0430\u0442\u049b\u0430\u043d \u0442\u0430\u043f\u0441\u044b\u0440\u043c\u0430\u043b\u0430\u0440", @@ -559,10 +559,10 @@ "LabelEnableBlastAliveMessages": "\u0411\u0435\u043b\u0441\u0435\u043d\u0434\u0456\u043b\u0456\u043a\u0442\u0456 \u0442\u0435\u043a\u0441\u0435\u0440\u0443 \u0445\u0430\u0431\u0430\u0440\u043b\u0430\u0440\u0434\u044b \u0436\u0438\u0435\u043b\u0456\u0442\u0443", "LabelEnableBlastAliveMessagesHelp": "\u0415\u0433\u0435\u0440 \u0436\u0435\u043b\u0456\u0434\u0435\u0433\u0456 \u0431\u0430\u0441\u049b\u0430 UPnP \u049b\u04b1\u0440\u044b\u043b\u0493\u044b\u043b\u0430\u0440\u044b\u043c\u0435\u043d \u0441\u0435\u0440\u0432\u0435\u0440 \u043d\u044b\u049b \u0442\u0430\u0431\u044b\u043b\u043c\u0430\u0441\u0430 \u0431\u04b1\u043d\u044b \u049b\u043e\u0441\u044b\u04a3\u044b\u0437.", "LabelBlastMessageInterval": "\u0411\u0435\u043b\u0441\u0435\u043d\u0434\u0456\u043b\u0456\u043a\u0442\u0456 \u0442\u0435\u043a\u0441\u0435\u0440\u0443 \u0445\u0430\u0431\u0430\u0440\u043b\u0430\u0440 \u0430\u0440\u0430\u043b\u044b\u0493\u044b, \u0441", - "LabelBlastMessageIntervalHelp": "Media Browser \u043e\u0440\u044b\u043d\u0434\u0430\u0439\u0442\u044b\u043d SSDP \u0441\u0430\u0443\u0430\u043b\u0434\u0430\u0440 \u0430\u0440\u0430 \u04b1\u0437\u0430\u049b\u0442\u044b\u0493\u044b\u043d \u0441\u0435\u043a\u0443\u043d\u0434\u0442\u0430\u0440 \u0430\u0440\u049b\u044b\u043b\u044b \u0430\u043d\u044b\u049b\u0442\u0430\u0443.", + "LabelBlastMessageIntervalHelp": "Media Browser \u043e\u0440\u044b\u043d\u0434\u0430\u0439\u0442\u044b\u043d SSDP \u0441\u0430\u0443\u0430\u043b\u0434\u0430\u0440 \u0430\u0440\u0430 \u04b1\u0437\u0430\u049b\u0442\u044b\u0493\u044b\u043d \u0441\u0435\u043a\u0443\u043d\u0434\u0442\u0430\u0440 \u0430\u0440\u049b\u044b\u043b\u044b \u0430\u043d\u044b\u049b\u0442\u0430\u0439\u0434\u044b.", "LabelDefaultUser": "\u04d8\u0434\u0435\u043f\u043a\u0456 \u043f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0448\u044b:", - "LabelDefaultUserHelp": "\u049a\u04b1\u0440\u044b\u043b\u0493\u044b\u043b\u0430\u0440 \u049b\u043e\u0441\u044b\u043b\u0493\u0430\u043d\u0434\u0430 \u049b\u0430\u0439 \u043f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0448\u044b\u043d\u044b\u04a3 \u0442\u0430\u0441\u0443\u0448\u044b\u0445\u0430\u043d\u0430\u0441\u044b \u0431\u0435\u0439\u043d\u0435\u043b\u0435\u043d\u0443\u0456 \u0442\u0438\u0456\u0441\u0442\u0456\u043b\u0456\u0433\u0456\u043d \u0430\u043d\u044b\u049b\u0442\u0430\u0443. \u041f\u0440\u043e\u0444\u0438\u043b\u044c\u0434\u0435\u0440\u0434\u0456 \u043f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0493\u0430\u043d\u0434\u0430 \u0431\u04b1\u043b \u04d9\u0440 \u049b\u04b1\u0440\u044b\u043b\u0493\u044b \u04af\u0448\u0456\u043d \u049b\u0430\u0439\u0442\u0430 \u0430\u043d\u044b\u049b\u0442\u0430\u043b\u0443\u044b \u043c\u04af\u043c\u043a\u0456\u043d.", - "TitleDlna": "DLNA \u049b\u04b1\u0440\u044b\u043b\u0493\u044b\u043b\u0430\u0440", + "LabelDefaultUserHelp": "\u049a\u04b1\u0440\u044b\u043b\u0493\u044b\u043b\u0430\u0440 \u049b\u043e\u0441\u044b\u043b\u0493\u0430\u043d\u0434\u0430 \u049b\u0430\u0439 \u043f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0448\u044b\u043d\u044b\u04a3 \u0442\u0430\u0441\u0443\u0448\u044b\u0445\u0430\u043d\u0430\u0441\u044b \u0431\u0435\u0439\u043d\u0435\u043b\u0435\u043d\u0443\u0456 \u0442\u0438\u0456\u0441\u0442\u0456\u043b\u0456\u0433\u0456\u043d \u0430\u043d\u044b\u049b\u0442\u0430\u0439\u0434\u044b. \u041f\u0440\u043e\u0444\u0438\u043b\u044c\u0434\u0435\u0440\u0434\u0456 \u043f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0493\u0430\u043d\u0434\u0430 \u0431\u04b1\u043b \u04d9\u0440 \u049b\u04b1\u0440\u044b\u043b\u0493\u044b \u04af\u0448\u0456\u043d \u049b\u0430\u0439\u0442\u0430 \u0442\u0430\u0493\u0430\u0439\u044b\u043d\u0434\u0430\u043b\u0443\u044b \u043c\u04af\u043c\u043a\u0456\u043d.", + "TitleDlna": "DLNA", "TitleChannels": "\u0410\u0440\u043d\u0430\u043b\u0430\u0440", "HeaderServerSettings": "\u0421\u0435\u0440\u0432\u0435\u0440 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043b\u0435\u0440\u0456", "LabelWeatherDisplayLocation": "\u0410\u0443\u0430 \u0440\u0430\u0439\u044b \u0435\u043b\u0434\u0456\u043c\u0435\u043a\u0435\u043d\u0456:", @@ -691,10 +691,10 @@ "HeaderProfileServerSettingsHelp": "\u0411\u04b1\u043b \u043c\u04d9\u043d\u0434\u0435\u0440 Media Browser \u049b\u0430\u043b\u0430\u0439 \u04e9\u0437\u0456\u043d \u0436\u0430\u0431\u0434\u044b\u049b\u0442\u0430 \u043a\u04e9\u0440\u0441\u0435\u0442\u0435\u0442\u0456\u043d\u0456\u04a3 \u0431\u0430\u0441\u049b\u0430\u0440\u0430\u0434\u044b.", "LabelMaxBitrate": "\u0415\u04a3 \u0436\u043e\u0493\u0430\u0440\u044b \u049b\u0430\u0440\u049b\u044b\u043d:", "LabelMaxBitrateHelp": "\u04e8\u0442\u043a\u0456\u0437\u0443 \u043c\u04af\u043c\u043a\u0456\u043d\u0434\u0456\u0433\u0456 \u0448\u0435\u043a\u0442\u0435\u043b\u0433\u0435\u043d \u043e\u0440\u0442\u0430\u043b\u0430\u0440\u0434\u0430\u0493\u044b \u0435\u04a3 \u0436\u043e\u0493\u0430\u0440\u044b \u049b\u0430\u0440\u049b\u044b\u043d\u0434\u044b \u0430\u043d\u044b\u049b\u0442\u0430\u04a3\u044b\u0437.", - "LabelMaxStreamingBitrate": "Max streaming bitrate:", - "LabelMaxStreamingBitrateHelp": "Specify a max bitrate when streaming.", - "LabelMaxStaticBitrate": "Max sync bitrate:", - "LabelMaxStaticBitrateHelp": "Specify a max bitrate when syncing content at high quality.", + "LabelMaxStreamingBitrate": "\u0415\u04a3 \u0436\u043e\u0493\u0430\u0440\u044b \u0430\u0493\u044b\u043d \u049b\u0430\u0440\u049b\u044b\u043d\u044b:", + "LabelMaxStreamingBitrateHelp": "\u0410\u0493\u044b\u043d\u043c\u0435\u043d \u0442\u0430\u0441\u044b\u043c\u0430\u043b\u0434\u0430\u0443 \u043a\u0435\u0437\u0456\u043d\u0434\u0435 \u0435\u04a3 \u0436\u043e\u0493\u0430\u0440\u044b \u049b\u0430\u0440\u049b\u044b\u043d\u0434\u044b \u0430\u043d\u044b\u049b\u0442\u0430\u04a3\u044b\u0437.", + "LabelMaxStaticBitrate": "\u0415\u04a3 \u0436\u043e\u0493\u0430\u0440\u044b \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0434\u0430\u0443 \u049b\u0430\u0440\u049b\u044b\u043d\u044b:", + "LabelMaxStaticBitrateHelp": "\u0416\u043e\u0493\u0430\u0440\u044b \u0441\u0430\u043f\u0430\u043c\u0435\u043d \u043c\u0430\u0437\u043c\u04b1\u043d\u0434\u044b \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0434\u0430\u0443 \u043a\u0435\u0437\u0456\u043d\u0434\u0435 \u0435\u04a3 \u0436\u043e\u0493\u0430\u0440\u044b \u049b\u0430\u0440\u049b\u044b\u043d\u0434\u044b \u0430\u043d\u044b\u049b\u0442\u0430\u04a3\u044b\u0437.", "OptionIgnoreTranscodeByteRangeRequests": "\u049a\u0430\u0439\u0442\u0430 \u043a\u043e\u0434\u0442\u0430\u0443 \u0431\u0430\u0439\u0442 \u0430\u0443\u049b\u044b\u043c\u044b \u0441\u04b1\u0440\u0430\u043d\u044b\u0441\u0442\u0430\u0440\u044b\u043d \u0435\u043b\u0435\u043c\u0435\u0443", "OptionIgnoreTranscodeByteRangeRequestsHelp": "\u049a\u043e\u0441\u044b\u043b\u0493\u0430\u043d\u0434\u0430, \u043e\u0441\u044b \u0441\u04b1\u0440\u0430\u043d\u044b\u0441\u0442\u0430\u0440\u043c\u0435\u043d \u0441\u0430\u043d\u0430\u0441\u0443 \u0431\u043e\u043b\u0430\u0434\u044b, \u0431\u0456\u0440\u0430\u049b \u0431\u0430\u0439\u0442 \u0430\u0443\u049b\u044b\u043c\u044b\u043d\u044b\u04a3 \u0431\u0430\u0441 \u0434\u0435\u0440\u0435\u043a\u0442\u0435\u043c\u0435\u0441\u0456 \u0435\u043b\u0435\u043f \u0435\u0441\u043a\u0435\u0440\u0456\u043b\u043c\u0435\u0439\u0434\u0456.", "LabelFriendlyName": "\u0422\u04af\u0441\u0456\u043d\u0456\u043a\u0442\u0456 \u0430\u0442\u044b", @@ -711,11 +711,11 @@ "HeaderTranscodingProfileHelp": "\u049a\u0430\u0436\u0435\u0442 \u0431\u043e\u043b\u0493\u0430\u043d\u0434\u0430 \u049b\u0430\u043d\u0434\u0430\u0439 \u043f\u0456\u0448\u0456\u043c\u0434\u0435\u0440\u0434\u0456 \u043f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443 \u043c\u0456\u043d\u0434\u0435\u0442\u0456\u043b\u0456\u0433\u0456\u043d \u043a\u04e9\u0440\u0441\u0435\u0442\u0443 \u04b1\u0448\u0456\u043d \u049b\u0430\u0439\u0442\u0430 \u043a\u043e\u0434\u0442\u0430\u0443 \u043f\u0440\u043e\u0444\u0430\u0439\u043b\u0434\u0430\u0440\u044b\u043d \u049b\u043e\u0441\u0443.", "HeaderResponseProfileHelp": "\u041a\u0435\u0439\u0431\u0456\u0440 \u0442\u0430\u0441\u0443\u0448\u044b \u0442\u04af\u0440\u043b\u0435\u0440\u0456\u043d \u043e\u0439\u043d\u0430\u0442\u049b\u0430\u043d\u0434\u0430 \u04af\u043d \u049b\u0430\u0442\u0443 \u043f\u0440\u043e\u0444\u0430\u0439\u043b\u0434\u0430\u0440\u044b \u0436\u0430\u0431\u0434\u044b\u049b\u049b\u0430 \u0436\u0456\u0431\u0435\u0440\u0456\u043b\u0435\u0442\u0456\u043d \u0430\u049b\u043f\u0430\u0440\u0430\u0442\u0442\u044b \u0442\u0435\u04a3\u0448\u0435\u0443 \u04af\u0448\u0456\u043d \u0436\u043e\u043b \u0431\u0435\u0440\u0435\u0434\u0456.", "LabelXDlnaCap": "X-Dlna \u0441\u0438\u043f\u0430\u0442\u0442\u0430\u0440\u044b:", - "LabelXDlnaCapHelp": "urn:schemas-dlna-org:device-1-0 \u0430\u0442\u0430\u0443\u043b\u0430\u0440 \u043a\u0435\u04a3\u0456\u0441\u0442\u0456\u0433\u0456\u043d\u0434\u0435\u0433\u0456 X_DLNACAP \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0456 \u043c\u0430\u0437\u043c\u04b1\u043d\u044b\u043d \u0430\u043d\u044b\u049b\u0442\u0430\u04a3\u044b\u0437.", + "LabelXDlnaCapHelp": "urn:schemas-dlna-org:device-1-0 \u0430\u0442\u0430\u0443\u043b\u0430\u0440 \u043a\u0435\u04a3\u0456\u0441\u0442\u0456\u0433\u0456\u043d\u0434\u0435\u0433\u0456 X_DLNACAP \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0456 \u043c\u0430\u0437\u043c\u04b1\u043d\u044b\u043d \u0430\u043d\u044b\u049b\u0442\u0430\u0439\u0434\u044b.", "LabelXDlnaDoc": "X-Dlna \u0442\u04d9\u0441\u0456\u043c\u0456:", - "LabelXDlnaDocHelp": "urn:schemas-dlna-org:device-1-0 \u0430\u0442\u0430\u0443\u043b\u0430\u0440 \u043a\u0435\u04a3\u0456\u0441\u0442\u0456\u0433\u0456\u043d\u0434\u0435\u0433\u0456 X_DLNADOC \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0456 \u043c\u0430\u0437\u043c\u04b1\u043d\u044b\u043d \u0430\u043d\u044b\u049b\u0442\u0430\u04a3\u044b\u0437.", + "LabelXDlnaDocHelp": "urn:schemas-dlna-org:device-1-0 \u0430\u0442\u0430\u0443\u043b\u0430\u0440 \u043a\u0435\u04a3\u0456\u0441\u0442\u0456\u0433\u0456\u043d\u0434\u0435\u0433\u0456 X_DLNADOC \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0456 \u043c\u0430\u0437\u043c\u04b1\u043d\u044b\u043d \u0430\u043d\u044b\u049b\u0442\u0430\u0439\u0434\u044b.", "LabelSonyAggregationFlags": "Sony \u0431\u0456\u0440\u0456\u043a\u0442\u0456\u0440\u0443 \u0436\u0430\u043b\u0430\u0443\u0448\u0430\u043b\u0430\u0440\u044b:", - "LabelSonyAggregationFlagsHelp": "urn:schemas-sonycom:av \u0430\u0442\u0430\u0443\u043b\u0430\u0440 \u043a\u0435\u04a3\u0456\u0441\u0442\u0456\u0433\u0456\u043d\u0434\u0435\u0433\u0456 aggregationFlags \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0456 \u043c\u0430\u0437\u043c\u04b1\u043d\u044b\u043d \u0430\u043d\u044b\u049b\u0442\u0430\u04a3\u044b\u0437.", + "LabelSonyAggregationFlagsHelp": "urn:schemas-sonycom:av \u0430\u0442\u0430\u0443\u043b\u0430\u0440 \u043a\u0435\u04a3\u0456\u0441\u0442\u0456\u0433\u0456\u043d\u0434\u0435\u0433\u0456 aggregationFlags \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0456 \u043c\u0430\u0437\u043c\u04b1\u043d\u044b\u043d \u0430\u043d\u044b\u049b\u0442\u0430\u0439\u0434\u044b.", "LabelTranscodingContainer": "\u041a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440:", "LabelTranscodingVideoCodec": "\u0411\u0435\u0439\u043d\u0435\u043b\u0456\u043a \u043a\u043e\u0434\u0435\u043a:", "LabelTranscodingVideoProfile": "\u0411\u0435\u0439\u043d\u0435\u043b\u0456\u043a \u043f\u0440\u043e\u0444\u0430\u0439\u043b:", @@ -895,10 +895,10 @@ "HeaderResumeSettings": "\u0416\u0430\u043b\u0493\u0430\u0441\u0442\u044b\u0440\u0443 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043b\u0435\u0440\u0456", "TabSync": "\u0421\u0438\u043d\u0445\u0440\u043e\u043d\u0434\u0430\u0443", "TitleUsers": "\u041f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0448\u044b\u043b\u0430\u0440", - "LabelProtocol": "Protocol:", + "LabelProtocol": "\u041f\u0440\u043e\u0442\u043e\u043a\u043e\u043b:", "OptionProtocolHttp": "Http", - "OptionProtocolHls": "Http Live Streaming", - "LabelContext": "Context:", - "OptionContextStreaming": "Streaming", - "OptionContextStatic": "Sync" + "OptionProtocolHls": "Http \u0422\u0456\u043a\u0435\u043b\u0435\u0439 \u0410\u0493\u044b\u043d (HLS)", + "LabelContext": "\u041c\u04d9\u0442\u0456\u043d\u043c\u04d9\u043d:", + "OptionContextStreaming": "\u0410\u0493\u044b\u043d\u043c\u0435\u043d \u0442\u0430\u0441\u044b\u043c\u0430\u043b\u0434\u0430\u0443", + "OptionContextStatic": "\u0421\u0438\u043d\u0445\u0440\u043e\u043d\u0434\u0430\u0443" } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/Server/nl.json b/MediaBrowser.Server.Implementations/Localization/Server/nl.json index bb014d6c1..24eacd739 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/nl.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/nl.json @@ -257,9 +257,9 @@ "ButtonSelectDirectory": "Selecteer map", "LabelCustomPaths": "Geef aangepaste paden op waar gewenst. Laat velden leeg om de standaardinstellingen te gebruiken.", "LabelCachePath": "Cache pad:", - "LabelCachePathHelp": "Deze map bevat server cache-bestanden, zoals afbeeldingen.", + "LabelCachePathHelp": "Deze locatie bevat server cache-bestanden, zoals afbeeldingen.", "LabelImagesByNamePath": "Afbeeldingen op naam pad:", - "LabelImagesByNamePathHelp": "Deze map bevat afbeeldingen van: acteurs, artiesten, genres en studio's.", + "LabelImagesByNamePathHelp": "Deze locatie bevat afbeeldingen van: acteurs, artiesten, genres en studio's.", "LabelMetadataPath": "metagegevens pad:", "LabelMetadataPathHelp": "Deze locatie bevat gedownloade afbeeldingen en metagegevens die niet zijn geconfigureerd om te worden opgeslagen in mediamappen .", "LabelTranscodingTempPath": "Tijdelijk Transcodeer pad:", @@ -554,7 +554,7 @@ "ErrorMessageInvalidKey": "Voordat U premium content kunt registreren, moet u eerst een MediaBrowser Supporter zijn. Ondersteun en doneer a.u.b. om de continue verdere ontwikkeling van MediaBrowser te waarborgen. Dank u.", "HeaderDisplaySettings": "Weergave-instellingen", "TabPlayTo": "Afspelen met", - "LabelEnableDlnaServer": "Dlna Server inschakelen", + "LabelEnableDlnaServer": "DLNA Server inschakelen", "LabelEnableDlnaServerHelp": "Hiermee kunnen UPnP-apparaten op uw netwerk Media Browser inhoud doorzoeken en afspelen.", "LabelEnableBlastAliveMessages": "Zend alive berichten", "LabelEnableBlastAliveMessagesHelp": "Zet dit aan als de server niet betrouwbaar door andere UPnP-apparaten op uw netwerk wordt gedetecteerd.", @@ -691,10 +691,10 @@ "HeaderProfileServerSettingsHelp": "Deze waarden bepalen hoe Media Browser zichzelf zal presenteren aan het apparaat.", "LabelMaxBitrate": "Max. bitrate:", "LabelMaxBitrateHelp": "Geef een max. bitrate in bandbreedte beperkte omgevingen, of als het apparaat zijn eigen limiet heeft.", - "LabelMaxStreamingBitrate": "Max streaming bitrate:", - "LabelMaxStreamingBitrateHelp": "Specify a max bitrate when streaming.", - "LabelMaxStaticBitrate": "Max sync bitrate:", - "LabelMaxStaticBitrateHelp": "Specify a max bitrate when syncing content at high quality.", + "LabelMaxStreamingBitrate": "Maximale streaming bitrate:", + "LabelMaxStreamingBitrateHelp": "Geef een maximale bitrate voor streaming op.", + "LabelMaxStaticBitrate": "Maxmimale sync bitrate:", + "LabelMaxStaticBitrateHelp": "Geef een maximale bitrate voor sync in hoge kwaliteit op.", "OptionIgnoreTranscodeByteRangeRequests": "Transcodeer byte range-aanvragen negeren", "OptionIgnoreTranscodeByteRangeRequestsHelp": "Indien ingeschakeld, zal deze verzoeken worden gehonoreerd, maar zal de byte bereik header worden genegerd.", "LabelFriendlyName": "Aangepaste naam", @@ -826,17 +826,17 @@ "OptionLatestTvRecordings": "Nieuwste opnames", "LabelProtocolInfo": "Protocol info:", "LabelProtocolInfoHelp": "De waarde die wordt gebruikt bij het reageren op GetProtocolInfo verzoeken van het apparaat.", - "TabXbmcMetadata": "Xbmc", - "HeaderXbmcMetadataHelp": "Media Browser omvat native ondersteuning voor XBMC Nfo metadata en afbeeldingen. Of uit te schakelen XBMC metadata, gebruikt u het tabblad Geavanceerd om opties voor uw mediatypen configureren.", + "TabXbmcMetadata": "XBMC", + "HeaderXbmcMetadataHelp": "Media Browser heeft ondersteuning voor XBMC NFO metadata en afbeeldingen. Om XBMC metadata aan of uit te zetten gebruikt u het tabblad Geavanceerd om opties voor uw mediatypen configureren.", "LabelXbmcMetadataUser": "Voeg gekeken gegevens toe aan NFO's voor (gebruiker):", - "LabelXbmcMetadataUserHelp": "Activeer dit om gekeken gegevens sync te houden tussen Media Browser en XBMC.", + "LabelXbmcMetadataUserHelp": "Activeer dit om gekeken gegevens gelijk te houden tussen Media Browser en XBMC.", "LabelXbmcMetadataDateFormat": "Release datum formaat:", - "LabelXbmcMetadataDateFormatHelp": "Alle datums binnen nfo zullen worden gelezen en geschreven en gebruik maken van dit formaat.", - "LabelXbmcMetadataSaveImagePaths": "Bewaar afbeeldingen paden in nfo-bestanden", - "LabelXbmcMetadataSaveImagePathsHelp": "Dit wordt aanbevolen als je bestandsnamen hbt die niet voldoen aan XBMC richtlijnen.", + "LabelXbmcMetadataDateFormatHelp": "Alle datums binnen NFO's zullen worden gelezen en geschreven en gebruik maken van dit formaat.", + "LabelXbmcMetadataSaveImagePaths": "Bewaar afbeeldingspaden in NFO-bestanden", + "LabelXbmcMetadataSaveImagePathsHelp": "Dit wordt aanbevolen als je bestandsnamen hebt die niet voldoen aan XBMC richtlijnen.", "LabelXbmcMetadataEnablePathSubstitution": "Pad vervanging inschakelen", - "LabelXbmcMetadataEnablePathSubstitutionHelp": "Stelt pad vervanging in voor afbeeldings paden en maakt gebruik van de pad vervangings instellingen van de server", - "LabelXbmcMetadataEnablePathSubstitutionHelp2": "Zie pad vervanging.", + "LabelXbmcMetadataEnablePathSubstitutionHelp": "Stelt pad vervanging in voor afbeeldingspaden en maakt gebruik van de Pad Vervangen instellingen van de server", + "LabelXbmcMetadataEnablePathSubstitutionHelp2": "Zie Pad Vervanging.", "LabelGroupChannelsIntoViews": "Toon de volgende kanalen binnen mijn overzichten:", "LabelGroupChannelsIntoViewsHelp": "Indien ingeschakeld, zullen deze kanalen direct naast andere overzichten worden weergegeven. Indien uitgeschakeld, zullen ze worden weergegeven in een aparte kanalen overzicht.", "LabelDisplayCollectionsView": "Toon Collecties in Mijn Overzichten om film collecties te tonen", @@ -884,7 +884,7 @@ "TabSort": "Sorteren", "TabFilter": "Filter", "ButtonView": "Weergave", - "LabelPageSize": "Schermgrootte:", + "LabelPageSize": "Itemlimiet:", "LabelView": "Weergave:", "TabUsers": "Gebruikers", "HeaderFeatures": "Functies", diff --git a/MediaBrowser.Server.Implementations/Localization/Server/pt_BR.json b/MediaBrowser.Server.Implementations/Localization/Server/pt_BR.json index dec101dfd..d3091c8e2 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/pt_BR.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/pt_BR.json @@ -691,10 +691,10 @@ "HeaderProfileServerSettingsHelp": "Estes valores controlam como o Media Browser ser\u00e1 exibido no dispositivo.", "LabelMaxBitrate": "Taxa de bits m\u00e1xima:", "LabelMaxBitrateHelp": "Especifique uma taxa de bits m\u00e1xima para ambientes com restri\u00e7\u00e3o de tamanho de banda, ou se o dispositivo imp\u00f5e esse limite.", - "LabelMaxStreamingBitrate": "Max streaming bitrate:", - "LabelMaxStreamingBitrateHelp": "Specify a max bitrate when streaming.", - "LabelMaxStaticBitrate": "Max sync bitrate:", - "LabelMaxStaticBitrateHelp": "Specify a max bitrate when syncing content at high quality.", + "LabelMaxStreamingBitrate": "Taxa m\u00e1xima para streaming:", + "LabelMaxStreamingBitrateHelp": "Defina uma taxa m\u00e1xima para fazer streaming.", + "LabelMaxStaticBitrate": "Taxa m\u00e1xima para sincronizar:", + "LabelMaxStaticBitrateHelp": "Defina uma taxa m\u00e1xima quando sincronizar conte\u00fado em alta qualidade.", "OptionIgnoreTranscodeByteRangeRequests": "Ignorar requisi\u00e7\u00f5es de extens\u00e3o do byte de transcodifica\u00e7\u00e3o", "OptionIgnoreTranscodeByteRangeRequestsHelp": "Se ativadas, estas requisi\u00e7\u00f5es ser\u00e3o honradas mas ir\u00e3o ignorar o cabe\u00e7alho da extens\u00e3o do byte.", "LabelFriendlyName": "Nome amig\u00e1vel", @@ -887,7 +887,7 @@ "LabelPageSize": "Limite do item:", "LabelView": "Visualizar:", "TabUsers": "Usu\u00e1rios", - "HeaderFeatures": "Inclui", + "HeaderFeatures": "Caracter\u00edsticas", "HeaderAdvanced": "Avan\u00e7ado", "ButtonSync": "Sincronizar", "TabScheduledTasks": "Tarefas Agendadas", @@ -895,10 +895,10 @@ "HeaderResumeSettings": "Ajustes para Retomar", "TabSync": "Sincroniza\u00e7\u00e3o", "TitleUsers": "Usu\u00e1rios", - "LabelProtocol": "Protocol:", + "LabelProtocol": "Protocolo:", "OptionProtocolHttp": "Http", "OptionProtocolHls": "Http Live Streaming", - "LabelContext": "Context:", + "LabelContext": "Contexto:", "OptionContextStreaming": "Streaming", - "OptionContextStatic": "Sync" + "OptionContextStatic": "Sinc" } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/Server/ru.json b/MediaBrowser.Server.Implementations/Localization/Server/ru.json index aa6dd94f3..87f31d415 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/ru.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/ru.json @@ -107,13 +107,13 @@ "OptionLikes": "\u041d\u0440\u0430\u0432\u044f\u0449\u0438\u0435\u0441\u044f", "OptionDislikes": "\u041d\u0435 \u043d\u0440\u0430\u0432\u044f\u0449\u0438\u0435\u0441\u044f", "OptionActors": "\u0410\u043a\u0442\u0451\u0440\u044b", - "OptionGuestStars": "\u041f\u0440\u0438\u0433\u043b\u0430\u0448\u0451\u043d\u043d\u044b\u0435 \u0437\u0432\u0451\u0437\u0434\u044b", + "OptionGuestStars": "\u041f\u0440\u0438\u0433\u043b\u0430\u0448\u0451\u043d\u043d\u044b\u0435 \u0430\u043a\u0442\u0451\u0440\u044b", "OptionDirectors": "\u0420\u0435\u0436\u0438\u0441\u0441\u0451\u0440\u044b", "OptionWriters": "\u0421\u0446\u0435\u043d\u0430\u0440\u0438\u0441\u0442\u044b", "OptionProducers": "\u041f\u0440\u043e\u0434\u044e\u0441\u0435\u0440\u044b", "HeaderResume": "\u0412\u043e\u0437\u043e\u0431\u043d\u043e\u0432\u0438\u043c\u044b\u0435", "HeaderNextUp": "\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u044f", - "NoNextUpItemsMessage": "\u041d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e. \u0421\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u0441\u0432\u043e\u0438 \u0441\u0435\u0440\u0438\u0430\u043b\u044b \u0441 \u043d\u0430\u0447\u0430\u043b\u0430!", + "NoNextUpItemsMessage": "\u041d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e. \u041d\u0430\u0447\u043d\u0438\u0442\u0435 \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0441\u0432\u043e\u0438 \u0441\u0435\u0440\u0438\u0430\u043b\u044b!", "HeaderLatestEpisodes": "\u041d\u043e\u0432\u0438\u043d\u043a\u0438 \u044d\u043f\u0438\u0437\u043e\u0434\u043e\u0432", "HeaderPersonTypes": "\u0422\u0438\u043f\u044b \u043b\u044e\u0434\u0435\u0439:", "TabSongs": "\u041c\u0435\u043b\u043e\u0434\u0438\u0438", @@ -239,7 +239,7 @@ "PismoMessage": "Pismo File Mount \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043f\u043e \u043f\u043e\u0434\u0430\u0440\u0435\u043d\u043d\u043e\u0439 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0438.", "TangibleSoftwareMessage": "Tangible Solutions Java\/C# \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043f\u043e \u043f\u043e\u0434\u0430\u0440\u0435\u043d\u043d\u043e\u0439 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0438.", "HeaderCredits": "\u0423\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u0438", - "PleaseSupportOtherProduces": "\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0442\u0435 \u0442\u0430\u043a\u0436\u0435 \u0434\u0440\u0443\u0433\u043e\u0435 \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u0435 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c:", + "PleaseSupportOtherProduces": "\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0442\u0435 \u0438 \u0438\u043d\u043e\u0435 \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u0435 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043c\u044b \u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f:", "VersionNumber": "\u0412\u0435\u0440\u0441\u0438\u044f {0}", "TabPaths": "\u041f\u0443\u0442\u0438", "TabServer": "\u0421\u0435\u0440\u0432\u0435\u0440", @@ -490,13 +490,13 @@ "LabelEndingEpisodeNumberHelp": "\u0422\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0444\u0430\u0439\u043b\u043e\u0432 \u0441 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u044d\u043f\u0438\u0437\u043e\u0434\u0430\u043c\u0438", "HeaderSupportTheTeam": "\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u044b Media Browser", "LabelSupportAmount": "\u0421\u0443\u043c\u043c\u0430 (USD)", - "HeaderSupportTheTeamHelp": "\u041f\u043e\u043c\u043e\u0433\u0438\u0442\u0435 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442\u044c \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0435 \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u0435 \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043f\u0443\u0442\u0451\u043c \u0434\u0430\u0440\u0435\u043d\u0438\u044f. \u041d\u0435\u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0432\u0441\u0435\u0445 \u043f\u043e\u0436\u0435\u0440\u0442\u0432\u043e\u0432\u0430\u043d\u0438\u0439 \u0431\u0443\u0434\u0435\u0442 \u0432\u043b\u043e\u0436\u0435\u043d\u0430 \u0432 \u0434\u0440\u0443\u0433\u043e\u0435 \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u0435 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043d\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e.", + "HeaderSupportTheTeamHelp": "\u041f\u043e\u043c\u043e\u0433\u0438\u0442\u0435 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442\u044c, \u0436\u0435\u0440\u0442\u0432\u0443\u044f, \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0435 \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u0435 \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430. \u041d\u0435\u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0438\u0437 \u0432\u0441\u0435\u0445 \u043f\u043e\u0436\u0435\u0440\u0442\u0432\u043e\u0432\u0430\u043d\u0438\u0439 \u0431\u0443\u0434\u0435\u0442 \u0432\u043b\u043e\u0436\u0435\u043d\u0430 \u0432 \u0438\u043d\u043e\u0435 \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u0435 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043d\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e.", "ButtonEnterSupporterKey": "\u0412\u0432\u0435\u0441\u0442\u0438 \u043a\u043b\u044e\u0447 \u0441\u043f\u043e\u043d\u0441\u043e\u0440\u0430", "DonationNextStep": "\u041f\u043e\u0441\u043b\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0432\u0435\u0440\u043d\u0438\u0442\u0435\u0441\u044c, \u0438 \u0432\u0432\u0435\u0434\u0438\u0442\u0435 \u043a\u043b\u044e\u0447 \u0441\u043f\u043e\u043d\u0441\u043e\u0440\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0435 \u043f\u043e \u042d-\u043f\u043e\u0447\u0442\u0435.", "AutoOrganizeHelp": "\u041f\u0440\u0438 \u0430\u0432\u0442\u043e\u0440\u0435\u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0430\u043f\u043a\u0430, \u043a\u0443\u0434\u0430 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u044e\u0442\u0441\u044f \u043d\u043e\u0432\u044b\u0435 \u0444\u0430\u0439\u043b\u044b, \u0430 \u0437\u0430\u0442\u0435\u043c \u0442\u0435 \u0431\u0443\u0434\u0443\u0442 \u043f\u0435\u0440\u0435\u043d\u0435\u0441\u0435\u043d\u044b \u0432 \u0432\u0430\u0448\u0438 \u043c\u0435\u0434\u0438\u0430\u043f\u0430\u043f\u043a\u0438.", "AutoOrganizeTvHelp": "\u041f\u0440\u0438 \u0440\u0435\u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0422\u0412 \u0444\u0430\u0439\u043b\u043e\u0432 \u044d\u043f\u0438\u0437\u043e\u0434\u044b \u0431\u0443\u0434\u0443\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0441\u0435\u0440\u0438\u0430\u043b\u044b. \u041d\u043e\u0432\u044b\u0435 \u043f\u0430\u043f\u043a\u0438 \u0441\u0435\u0440\u0438\u0430\u043b\u043e\u0432 \u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u044b.", "OptionEnableEpisodeOrganization": "\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0440\u0435\u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u044e \u043d\u043e\u0432\u044b\u0445 \u044d\u043f\u0438\u0437\u043e\u0434\u043e\u0432", - "LabelWatchFolder": "\u041e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0435\u043c\u0430\u044f \u043f\u0430\u043f\u043a\u0430:", + "LabelWatchFolder": "\u041f\u0430\u043f\u043a\u0430 \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u043d\u0438\u044f:", "LabelWatchFolderHelp": "\u0421\u0435\u0440\u0432\u0435\u0440\u043e\u043c \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043e\u043f\u0440\u043e\u0441 \u0434\u0430\u043d\u043d\u043e\u0439 \u043f\u0430\u043f\u043a\u0438 \u0432 \u0445\u043e\u0434\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u043d\u043e\u0433\u043e \u0437\u0430\u0434\u0430\u043d\u0438\u044f \"\u0420\u0435\u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u043e\u0432\u044b\u0445 \u043c\u0435\u0434\u0438\u0430\u0444\u0430\u0439\u043b\u043e\u0432\".", "ButtonViewScheduledTasks": "\u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u043d\u044b\u0435 \u0437\u0430\u0434\u0430\u043d\u0438\u044f", "LabelMinFileSizeForOrganize": "\u041c\u0438\u043d. \u0440\u0430\u0437\u043c\u0435\u0440 \u0444\u0430\u0439\u043b\u0430 (\u041c\u0411):", @@ -507,7 +507,7 @@ "LabelEpisodePattern": "\u0428\u0430\u0431\u043b\u043e\u043d \u0434\u043b\u044f \u044d\u043f\u0438\u0437\u043e\u0434\u0430:", "LabelMultiEpisodePattern": "\u0428\u0430\u0431\u043b\u043e\u043d \u0434\u043b\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u044d\u043f\u0438\u0437\u043e\u0434\u043e\u0432:", "HeaderSupportedPatterns": "\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0435 \u0448\u0430\u0431\u043b\u043e\u043d\u044b", - "HeaderTerm": "\u041e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435", + "HeaderTerm": "\u041f\u043e\u043d\u044f\u0442\u0438\u0435", "HeaderPattern": "\u0428\u0430\u0431\u043b\u043e\u043d", "HeaderResult": "\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442", "LabelDeleteEmptyFolders": "\u0423\u0434\u0430\u043b\u044f\u0442\u044c \u043f\u0443\u0441\u0442\u044b\u0435 \u043f\u0430\u043f\u043a\u0438 \u043f\u043e\u0441\u043b\u0435 \u0440\u0435\u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438", @@ -518,7 +518,7 @@ "LabelTransferMethod": "\u041c\u0435\u0442\u043e\u0434 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0430", "OptionCopy": "\u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435", "OptionMove": "\u041f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u0435", - "LabelTransferMethodHelp": "\u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438\u043b\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u0444\u0430\u0439\u043b\u043e\u0432 \u0438\u0437 \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0435\u043c\u043e\u0439 \u043f\u0430\u043f\u043a\u0438", + "LabelTransferMethodHelp": "\u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438\u043b\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u0444\u0430\u0439\u043b\u043e\u0432 \u0438\u0437 \u043f\u0430\u043f\u043a\u0438 \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u043d\u0438\u044f", "HeaderLatestNews": "\u041d\u043e\u0432\u043e\u0441\u0442\u0438", "HeaderHelpImproveMediaBrowser": "\u041f\u043e\u043c\u043e\u0449\u044c \u0432 \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u0438\u0438 Media Browser", "HeaderRunningTasks": "\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0449\u0438\u0435\u0441\u044f \u0437\u0430\u0434\u0430\u043d\u0438\u044f", @@ -562,7 +562,7 @@ "LabelBlastMessageIntervalHelp": "\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0434\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0430\u0445 \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f\u043c\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 \u0441\u0435\u0440\u0432\u0435\u0440\u0430.", "LabelDefaultUser": "\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e", "LabelDefaultUserHelp": "\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c, \u0447\u044c\u044f \u043c\u0435\u0434\u0438\u0430\u0442\u0435\u043a\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u0445 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\u0445. \u041f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u044d\u0442\u043e\u0433\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043f\u0440\u043e\u0444\u0438\u043b\u0435\u0439.", - "TitleDlna": "DLNA \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044f", + "TitleDlna": "DLNA", "TitleChannels": "\u041a\u0430\u043d\u0430\u043b\u044b", "HeaderServerSettings": "\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0441\u0435\u0440\u0432\u0435\u0440\u0430", "LabelWeatherDisplayLocation": "\u041f\u043e\u0433\u043e\u0434\u0430 \u0434\u043b\u044f \u043c\u0435\u0441\u0442\u043d\u043e\u0441\u0442\u0438:", @@ -691,10 +691,10 @@ "HeaderProfileServerSettingsHelp": "\u042d\u0442\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0442, \u043a\u0430\u043a Media Browser \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u043d\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0435.", "LabelMaxBitrate": "\u041c\u0430\u043a\u0441. \u043f\u043e\u0442\u043e\u043a\u043e\u0432\u0430\u044f \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c:", "LabelMaxBitrateHelp": "\u0423\u043a\u0430\u0436\u0438\u0442\u0435 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u043f\u043e\u0442\u043e\u043a\u043e\u0432\u0443\u044e \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0432 \u0441\u0440\u0435\u0434\u0430\u0445 \u0441 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u043e\u0439 \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u043d\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c\u044e, \u043b\u0438\u0431\u043e \u0435\u0441\u043b\u0438 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u043d\u0430\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442 \u0441\u0432\u043e\u0451 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435.", - "LabelMaxStreamingBitrate": "Max streaming bitrate:", - "LabelMaxStreamingBitrateHelp": "Specify a max bitrate when streaming.", - "LabelMaxStaticBitrate": "Max sync bitrate:", - "LabelMaxStaticBitrateHelp": "Specify a max bitrate when syncing content at high quality.", + "LabelMaxStreamingBitrate": "\u041c\u0430\u043a\u0441. \u043f\u043e\u0442\u043e\u043a\u043e\u0432\u0430\u044f \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c:", + "LabelMaxStreamingBitrateHelp": "\u0423\u043a\u0430\u0437\u0430\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u043f\u0440\u0438 \u043f\u043e\u0442\u043e\u043a\u043e\u0432\u043e\u0439 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0435.", + "LabelMaxStaticBitrate": "\u041c\u0430\u043a\u0441. \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438:", + "LabelMaxStaticBitrateHelp": "\u0423\u043a\u0430\u0437\u0430\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u043f\u0440\u0438 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u044f \u0432\u043e \u0432\u044b\u0441\u043e\u043a\u043e\u043c \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435.", "OptionIgnoreTranscodeByteRangeRequests": "\u0418\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430 \u0431\u0430\u0439\u0442\u043e\u0432 \u043f\u0435\u0440\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0438", "OptionIgnoreTranscodeByteRangeRequestsHelp": "\u041f\u0440\u0438 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438, \u044d\u0442\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0431\u0443\u0434\u0443\u0442 \u0443\u0447\u0442\u0435\u043d\u044b, \u043d\u043e \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430 \u0431\u0430\u0439\u0442\u043e\u0432 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0438\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u043d.", "LabelFriendlyName": "\u041f\u043e\u043d\u044f\u0442\u043d\u043e\u0435 \u0438\u043c\u044f", @@ -895,10 +895,10 @@ "HeaderResumeSettings": "\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0432\u043e\u0437\u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f", "TabSync": "\u0421\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044f", "TitleUsers": "\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438", - "LabelProtocol": "Protocol:", + "LabelProtocol": "\u041f\u0440\u043e\u0442\u043e\u043a\u043e\u043b:", "OptionProtocolHttp": "Http", - "OptionProtocolHls": "Http Live Streaming", - "LabelContext": "Context:", - "OptionContextStreaming": "Streaming", - "OptionContextStatic": "Sync" + "OptionProtocolHls": "Http \u041f\u0440\u044f\u043c\u043e\u0439 \u041f\u043e\u0442\u043e\u043a (HLS)", + "LabelContext": "\u041a\u043e\u043d\u0442\u0435\u043a\u0441\u0442", + "OptionContextStreaming": "\u041f\u043e\u0442\u043e\u043a\u043e\u0432\u0430\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0430", + "OptionContextStatic": "\u0421\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044f" } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/Server/sv.json b/MediaBrowser.Server.Implementations/Localization/Server/sv.json index 5e76f85c9..4a7e529f0 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/sv.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/sv.json @@ -199,7 +199,7 @@ "OptionFriday": "Fredag", "OptionSaturday": "L\u00f6rdag", "HeaderManagement": "Administration:", - "LabelManagement": "Management:", + "LabelManagement": "Administration:", "OptionMissingImdbId": "IMDB-ID saknas", "OptionMissingTvdbId": "TVDB-ID saknas", "OptionMissingOverview": "Synopsis saknas", @@ -627,10 +627,10 @@ "TabNowPlaying": "Nu spelas", "TabNavigation": "Navigering", "TabControls": "Kontroller", - "ButtonFullscreen": "Toggle fullscreen", + "ButtonFullscreen": "V\u00e4xla fullsk\u00e4rmsl\u00e4ge", "ButtonScenes": "Scener", "ButtonSubtitles": "Undertexter", - "ButtonAudioTracks": "Audio tracks", + "ButtonAudioTracks": "Ljudsp\u00e5r", "ButtonPreviousTrack": "Previous track", "ButtonNextTrack": "Next track", "ButtonStop": "Stopp", @@ -691,10 +691,10 @@ "HeaderProfileServerSettingsHelp": "Dessa v\u00e4rden styr hur Media Browser presenterar sig f\u00f6r enheten.", "LabelMaxBitrate": "H\u00f6gsta bithastighet:", "LabelMaxBitrateHelp": "Ange en h\u00f6gsta bithastighet i bandbreddsbegr\u00e4nsade milj\u00f6er, eller i fall d\u00e4r enheten har sina egna begr\u00e4nsningar.", - "LabelMaxStreamingBitrate": "Max streaming bitrate:", - "LabelMaxStreamingBitrateHelp": "Specify a max bitrate when streaming.", - "LabelMaxStaticBitrate": "Max sync bitrate:", - "LabelMaxStaticBitrateHelp": "Specify a max bitrate when syncing content at high quality.", + "LabelMaxStreamingBitrate": "Max bithastighet f\u00f6r str\u00f6mning:", + "LabelMaxStreamingBitrateHelp": "Ange h\u00f6gsta bithastighet f\u00f6r str\u00f6mning.", + "LabelMaxStaticBitrate": "Max bithastighet vid synkronisering:", + "LabelMaxStaticBitrateHelp": "Ange h\u00f6gsta bithastighet vid synkronisering.", "OptionIgnoreTranscodeByteRangeRequests": "Ignorera beg\u00e4ran om \"byte range\" vid omkodning", "OptionIgnoreTranscodeByteRangeRequestsHelp": "Om aktiverad kommer beg\u00e4ran att uppfyllas, men \"byte range\"-rubriken ignoreras.", "LabelFriendlyName": "\u00d6nskat namn", @@ -873,32 +873,32 @@ "LabelAppName": "Appens namn", "LabelAppNameExample": "Exempel: Sickbeard, NzbDrone", "HeaderNewApiKeyHelp": "Till\u00e5t en app att kommunicera med Media Browser", - "HeaderHttpHeaders": "Http Headers", - "HeaderIdentificationHeader": "Identification Header", - "LabelValue": "Value:", - "LabelMatchType": "Match type:", - "OptionEquals": "Equals", + "HeaderHttpHeaders": "Http-rubriker", + "HeaderIdentificationHeader": "ID-rubrik", + "LabelValue": "V\u00e4rde:", + "LabelMatchType": "Matchningstyp:", + "OptionEquals": "Lika med", "OptionRegex": "Regex", - "OptionSubstring": "Substring", - "TabView": "View", - "TabSort": "Sort", - "TabFilter": "Filter", - "ButtonView": "View", - "LabelPageSize": "Item limit:", - "LabelView": "View:", - "TabUsers": "Users", - "HeaderFeatures": "Features", - "HeaderAdvanced": "Advanced", - "ButtonSync": "Sync", - "TabScheduledTasks": "Scheduled Tasks", - "HeaderChapters": "Chapters", - "HeaderResumeSettings": "Resume Settings", - "TabSync": "Sync", - "TitleUsers": "Users", - "LabelProtocol": "Protocol:", + "OptionSubstring": "Delstr\u00e4ng", + "TabView": "Vy", + "TabSort": "Sortera", + "TabFilter": "Filtrera", + "ButtonView": "Visa", + "LabelPageSize": "Max antal objekt:", + "LabelView": "Vy:", + "TabUsers": "Anv\u00e4ndare", + "HeaderFeatures": "Extramaterial", + "HeaderAdvanced": "Avancerat", + "ButtonSync": "Synk", + "TabScheduledTasks": "Schemalagda aktiviteter", + "HeaderChapters": "Kapitel", + "HeaderResumeSettings": "\u00c5teruppta-inst\u00e4llningar", + "TabSync": "Synk", + "TitleUsers": "Anv\u00e4ndare", + "LabelProtocol": "Protokoll:", "OptionProtocolHttp": "Http", - "OptionProtocolHls": "Http Live Streaming", - "LabelContext": "Context:", - "OptionContextStreaming": "Streaming", - "OptionContextStatic": "Sync" + "OptionProtocolHls": "Live-str\u00f6mning via Http", + "LabelContext": "Metod:", + "OptionContextStreaming": "Str\u00f6mning", + "OptionContextStatic": "Synk" } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/Server/tr.json b/MediaBrowser.Server.Implementations/Localization/Server/tr.json new file mode 100644 index 000000000..af2b0b031 --- /dev/null +++ b/MediaBrowser.Server.Implementations/Localization/Server/tr.json @@ -0,0 +1,904 @@ +{ + "LabelExit": "\u00c7\u0131k\u0131\u015f", + "LabelVisitCommunity": "Bizi Ziyaret Edin", + "LabelGithubWiki": "Github Wiki", + "LabelSwagger": "Swagger", + "LabelStandard": "Standart", + "LabelViewApiDocumentation": "Api D\u00f6k\u00fcman\u0131", + "LabelBrowseLibrary": "K\u00fct\u00fcphane", + "LabelConfigureMediaBrowser": "Media Taray\u0131c\u0131 Konfig\u00fcrasyon", + "LabelOpenLibraryViewer": "Open Library Viewer", + "LabelRestartServer": "Server Yeniden Ba\u015flat", + "LabelShowLogWindow": "Show Log Window", + "LabelPrevious": "\u00d6nceki", + "LabelFinish": "Bitir", + "LabelNext": "Sonraki", + "LabelYoureDone": "You're Done!", + "WelcomeToMediaBrowser": "Media Taray\u0131c\u0131ya Ho\u015fgeldiniz !", + "TitleMediaBrowser": "Media Taray\u0131c\u0131", + "ThisWizardWillGuideYou": "Bu sihirbaz kurulum i\u015flemi boyunca size yard\u0131mc\u0131 olacakt\u0131r. Ba\u015flamak i\u00e7in, tercih etti\u011finiz dili se\u00e7iniz.", + "TellUsAboutYourself": "Kendinizden Bahsedin", + "LabelYourFirstName": "\u0130lk Ad", + "MoreUsersCanBeAddedLater": "More users can be added later within the Dashboard.", + "UserProfilesIntro": "Media Browser includes built-in support for user profiles, enabling each user to have their own display settings, playstate and parental controls.", + "LabelWindowsService": "Windows Servis", + "AWindowsServiceHasBeenInstalled": "Windows Servisi Y\u00fcklenmi\u015ftir.", + "WindowsServiceIntro1": "Medya Taray\u0131c\u0131 Sunucu normalde bir tepsi simgesi ile bir masa\u00fcst\u00fc uygulamas\u0131 olarak \u00e7al\u0131\u015f\u0131r, ancak bir arka plan servisi olarak \u00e7al\u0131\u015ft\u0131rmak isterseniz, bunun yerine windows servisleri kontrol panelinden ba\u015flat\u0131labilirsiniz.", + "WindowsServiceIntro2": "Windows hizmeti kullan\u0131yorsan\u0131z, o tepsi simgesi olarak ayn\u0131 anda \u00e7al\u0131\u015ft\u0131rabilirsiniz unutmay\u0131n, b\u00f6ylece hizmetini \u00e7al\u0131\u015ft\u0131rmak i\u00e7in tepsiyi \u00e7\u0131kmak gerekir l\u00fctfen. Hizmeti de kontrol paneli \u00fczerinden y\u00f6netim ayr\u0131cal\u0131klar\u0131yla yap\u0131land\u0131r\u0131lm\u0131\u015f olmas\u0131 gerekir. \u015eu anda hizmet kendine g\u00fcncelleme m\u00fcmk\u00fcn oldu\u011funu unutmay\u0131n, bu y\u00fczden yeni s\u00fcr\u00fcmleri manuel etkile\u015fimi gerektirir.", + "WizardCompleted": "That's all we need for now. Media Browser has begun collecting information about your media library. Check out some of our apps, and then click Finish<\/b> to view the Dashboard<\/b>.", + "LabelConfigureSettings": "Ayarlar\u0131 De\u011fi\u015ftir", + "LabelEnableVideoImageExtraction": "Enable video image extraction", + "VideoImageExtractionHelp": "For videos that don't already have images, and that we're unable to find internet images for. This will add some additional time to the initial library scan but will result in a more pleasing presentation.", + "LabelEnableChapterImageExtractionForMovies": "Extract chapter image extraction for Movies", + "LabelChapterImageExtractionForMoviesHelp": "Extracting chapter images will allow clients to display graphical scene selection menus. The process can be slow, cpu-intensive and may require several gigabytes of space. It runs as a nightly scheduled task at 4am, although this is configurable in the scheduled tasks area. It is not recommended to run this task during peak usage hours.", + "LabelEnableAutomaticPortMapping": "Enable automatic port mapping", + "LabelEnableAutomaticPortMappingHelp": "UPnP allows automated router configuration for easy remote access. This may not work with some router models.", + "ButtonOk": "Tamam", + "ButtonCancel": "\u0130ptal", + "ButtonNew": "Yeni", + "HeaderSetupLibrary": "Setup your media library", + "ButtonAddMediaFolder": "Yeni Media Klas\u00f6r\u00fc", + "LabelFolderType": "Klas\u00f6r T\u00fcr\u00fc:", + "MediaFolderHelpPluginRequired": "* Requires the use of a plugin, e.g. GameBrowser or MB Bookshelf.", + "ReferToMediaLibraryWiki": "Refer to the media library wiki.", + "LabelCountry": "\u00dclke", + "LabelLanguage": "Dil", + "HeaderPreferredMetadataLanguage": "Tercih edilen Meta Dili:", + "LabelSaveLocalMetadata": "Save artwork and metadata into media folders", + "LabelSaveLocalMetadataHelp": "Saving artwork and metadata directly into media folders will put them in a place where they can be easily edited.", + "LabelDownloadInternetMetadata": "\u0130nternetten \u0130\u00e7erik Y\u00fckleyin", + "LabelDownloadInternetMetadataHelp": "Media Browser can download information about your media to enable rich presentations.", + "TabPreferences": "Tercihler", + "TabPassword": "\u015eifre", + "TabLibraryAccess": "K\u00fct\u00fcphane Eri\u015fim", + "TabImage": "Resim", + "TabProfile": "Profil", + "TabMetadata": "Metadata", + "TabImages": "Resimler", + "TabNotifications": "Notifications", + "TabCollectionTitles": "Titles", + "LabelDisplayMissingEpisodesWithinSeasons": "Display missing episodes within seasons", + "LabelUnairedMissingEpisodesWithinSeasons": "Display unaired episodes within seasons", + "HeaderVideoPlaybackSettings": "Video Oynatma Ayarlar\u0131", + "HeaderPlaybackSettings": "Playback Settings", + "LabelAudioLanguagePreference": "Ses Dili Tercihi:", + "LabelSubtitleLanguagePreference": "Altyaz\u0131 Dili Tercihi:", + "OptionDefaultSubtitles": "Default", + "OptionOnlyForcedSubtitles": "Only forced subtitles", + "OptionAlwaysPlaySubtitles": "Always play subtitles", + "OptionNoSubtitles": "No Subtitles", + "OptionDefaultSubtitlesHelp": "Subtitles matching the language preference will be loaded when the audio is in a foreign language.", + "OptionOnlyForcedSubtitlesHelp": "Only subtitles marked as forced will be loaded.", + "OptionAlwaysPlaySubtitlesHelp": "Subtitles matching the language preference will be loaded regardless of the audio language.", + "OptionNoSubtitlesHelp": "Subtitles will not be loaded by default.", + "TabProfiles": "Profiller", + "TabSecurity": "G\u00fcvenlik", + "ButtonAddUser": "Kullan\u0131c\u0131 Ekle", + "ButtonSave": "Kay\u0131t", + "ButtonResetPassword": "\u015eifre S\u0131f\u0131rla", + "LabelNewPassword": "Yeni \u015eifre", + "LabelNewPasswordConfirm": "Yeni \u015eifreyi Onayla", + "HeaderCreatePassword": "\u015eifre Olu\u015ftur", + "LabelCurrentPassword": "Kullan\u0131mdaki \u015eifreniz", + "LabelMaxParentalRating": "Maksimum izin verilen ebeveyn de\u011ferlendirmesi:", + "MaxParentalRatingHelp": "Daha y\u00fcksek bir derece ile \u0130\u00e7erik Bu kullan\u0131c\u0131dan gizli olacak.", + "LibraryAccessHelp": "Bu kullan\u0131c\u0131 ile payla\u015fmak i\u00e7in medya klas\u00f6rleri se\u00e7in. Y\u00f6neticiler meta y\u00f6neticisini kullanarak t\u00fcm klas\u00f6rleri d\u00fczenlemesi m\u00fcmk\u00fcn olacakt\u0131r.", + "ChannelAccessHelp": "Select the channels to share with this user. Administrators will be able to edit all channels using the metadata manager.", + "ButtonDeleteImage": "Resim Sil", + "LabelSelectUsers": "Select users:", + "ButtonUpload": "Y\u00fckle", + "HeaderUploadNewImage": "Yeni Resim Y\u00fckle", + "LabelDropImageHere": "Drop Image Here", + "ImageUploadAspectRatioHelp": "1:1 Aspect Ratio Recommended. JPG\/PNG only.", + "MessageNothingHere": "Nothing here.", + "MessagePleaseEnsureInternetMetadata": "Please ensure downloading of internet metadata is enabled.", + "TabSuggested": "\u00d6nerilen", + "TabLatest": "Son", + "TabUpcoming": "Gelecek", + "TabShows": "G\u00f6steriler", + "TabEpisodes": "B\u00f6l\u00fcmler", + "TabGenres": "T\u00fcrler", + "TabPeople": "Oyuncular", + "TabNetworks": "A\u011flar", + "HeaderUsers": "Kullan\u0131c\u0131lar", + "HeaderFilters": "Filtrelemeler", + "ButtonFilter": "Filtre", + "OptionFavorite": "Favoriler", + "OptionLikes": "Be\u011feniler", + "OptionDislikes": "Be\u011fenmeyenler", + "OptionActors": "Akt\u00f6rler", + "OptionGuestStars": "Guest Stars", + "OptionDirectors": "Directors", + "OptionWriters": "Writers", + "OptionProducers": "Producers", + "HeaderResume": "Devam", + "HeaderNextUp": "Sonraki", + "NoNextUpItemsMessage": "None found. Start watching your shows!", + "HeaderLatestEpisodes": "Latest Episodes", + "HeaderPersonTypes": "Person Types:", + "TabSongs": "\u015eark\u0131lar", + "TabAlbums": "Alb\u00fcm", + "TabArtists": "Sanat\u00e7\u0131", + "TabAlbumArtists": "Sanat\u00e7\u0131 Alb\u00fcm\u00fc", + "TabMusicVideos": "Klipler", + "ButtonSort": "Sort", + "HeaderSortBy": "Sort By:", + "HeaderSortOrder": "Sort Order:", + "OptionPlayed": "\u00c7al\u0131n\u0131yor", + "OptionUnplayed": "\u00c7al\u0131nm\u0131yor", + "OptionAscending": "Ascending", + "OptionDescending": "Descending", + "OptionRuntime": "Runtime", + "OptionReleaseDate": "Release Date", + "OptionPlayCount": "Play Count", + "OptionDatePlayed": "Date Played", + "OptionDateAdded": "Date Added", + "OptionAlbumArtist": "Sanat\u00e7\u0131 Alb\u00fcm\u00fc", + "OptionArtist": "Sanat\u00e7\u0131", + "OptionAlbum": "Alb\u00fcm", + "OptionTrackName": "Par\u00e7a \u0130smi", + "OptionCommunityRating": "Community Rating", + "OptionNameSort": "\u0130sim", + "OptionFolderSort": "Klas\u00f6r", + "OptionBudget": "Budget", + "OptionRevenue": "Revenue", + "OptionPoster": "Poster", + "OptionBackdrop": "Backdrop", + "OptionTimeline": "Timeline", + "OptionThumb": "Thumb", + "OptionBanner": "Banner", + "OptionCriticRating": "Kritik Rating", + "OptionVideoBitrate": "Video Kalitesi", + "OptionResumable": "Resumable", + "ScheduledTasksHelp": "Click a task to adjust its schedule.", + "ScheduledTasksTitle": "Zamanlanm\u0131\u015f G\u00f6revler", + "TabMyPlugins": "Eklentilerim", + "TabCatalog": "Katalog", + "PluginsTitle": "Eklentiler", + "HeaderAutomaticUpdates": "Otomatik G\u00fcncelleme", + "HeaderNowPlaying": "\u015eimdi \u00c7al\u0131n\u0131yor", + "HeaderLatestAlbums": "Latest Albums", + "HeaderLatestSongs": "Latest Songs", + "HeaderRecentlyPlayed": "Recently Played", + "HeaderFrequentlyPlayed": "Frequently Played", + "DevBuildWarning": "Dev builds are the bleeding edge. Released often, these build have not been tested. The application may crash and entire features may not work at all.", + "LabelVideoType": "Video Tipi", + "OptionBluray": "Bluray", + "OptionDvd": "Dvd", + "OptionIso": "\u0130so", + "Option3D": "3D", + "LabelFeatures": "Features:", + "LabelService": "Service:", + "LabelStatus": "Status:", + "LabelVersion": "Version:", + "LabelLastResult": "Last result:", + "OptionHasSubtitles": "Altyaz\u0131", + "OptionHasTrailer": "Tan\u0131t\u0131m Video", + "OptionHasThemeSong": "Tema \u015eark\u0131s\u0131", + "OptionHasThemeVideo": "Tema Videosu", + "TabMovies": "Filmler", + "TabStudios": "St\u00fcdyo", + "TabTrailers": "Trailers", + "HeaderLatestMovies": "Latest Movies", + "HeaderLatestTrailers": "Latest Trailers", + "OptionHasSpecialFeatures": "Special Features", + "OptionImdbRating": "\u0130MDb Reyting", + "OptionParentalRating": "Parental Rating", + "OptionPremiereDate": "Premiere Date", + "TabBasic": "Basit", + "TabAdvanced": "Geli\u015fmi\u015f", + "HeaderStatus": "Durum", + "OptionContinuing": "Continuing", + "OptionEnded": "Bitmi\u015f", + "HeaderAirDays": "Air Days", + "OptionSunday": "Pazar", + "OptionMonday": "Pazartesi", + "OptionTuesday": "Sal\u0131", + "OptionWednesday": "\u00c7ar\u015famba", + "OptionThursday": "Per\u015fembe", + "OptionFriday": "Cuma", + "OptionSaturday": "Cumartesi", + "HeaderManagement": "Y\u00f6netim", + "LabelManagement": "Management:", + "OptionMissingImdbId": "Missing IMDb Id", + "OptionMissingTvdbId": "Missing TheTVDB Id", + "OptionMissingOverview": "Missing Overview", + "OptionFileMetadataYearMismatch": "File\/Metadata Years Mismatched", + "TabGeneral": "Genel", + "TitleSupport": "Destek", + "TabLog": "Log", + "TabAbout": "Hakk\u0131nda", + "TabSupporterKey": "Supporter Key", + "TabBecomeSupporter": "Become a Supporter", + "MediaBrowserHasCommunity": "Media Browser has a thriving community of users and contributors.", + "CheckoutKnowledgeBase": "Check out our knowledge base to help you get the most out of Media Browser.", + "SearchKnowledgeBase": "Search the Knowledge Base", + "VisitTheCommunity": "Visit the Community", + "VisitMediaBrowserWebsite": "Visit the Media Browser Web Site", + "VisitMediaBrowserWebsiteLong": "Visit the Media Browser Web site to catch the latest news and keep up with the developer blog.", + "OptionHideUser": "Hide this user from login screens", + "OptionDisableUser": "Kullan\u0131c\u0131 Devre D\u0131\u015f\u0131 B\u0131rak", + "OptionDisableUserHelp": "If disabled the server will not allow any connections from this user. Existing connections will be abruptly terminated.", + "HeaderAdvancedControl": "Geli\u015fmi\u015f Kontrol", + "LabelName": "\u0130sim", + "OptionAllowUserToManageServer": "Allow this user to manage the server", + "HeaderFeatureAccess": "Feature Access", + "OptionAllowMediaPlayback": "Allow media playback", + "OptionAllowBrowsingLiveTv": "Allow browsing of live tv", + "OptionAllowDeleteLibraryContent": "Allow this user to delete library content", + "OptionAllowManageLiveTv": "Allow management of live tv recordings", + "OptionAllowRemoteControlOthers": "Allow this user to remote control other users", + "OptionMissingTmdbId": "Missing Tmdb Id", + "OptionIsHD": "HD", + "OptionIsSD": "SD", + "OptionMetascore": "Metascore", + "ButtonSelect": "Se\u00e7im", + "ButtonSearch": "Arama", + "ButtonGroupVersions": "Grup Versionlar\u0131", + "ButtonAddToCollection": "Add to Collection", + "PismoMessage": "Utilizing Pismo File Mount through a donated license.", + "TangibleSoftwareMessage": "Utilizing Tangible Solutions Java\/C# converters through a donated license.", + "HeaderCredits": "Credits", + "PleaseSupportOtherProduces": "Please support other free products we utilize:", + "VersionNumber": "Versiyon {0}", + "TabPaths": "Paths", + "TabServer": "Server", + "TabTranscoding": "Kodlay\u0131c\u0131", + "TitleAdvanced": "Geli\u015fmi\u015f", + "LabelAutomaticUpdateLevel": "Otomatik G\u00fcncelleme seviyesi", + "OptionRelease": "Resmi Yay\u0131n", + "OptionBeta": "Beta", + "OptionDev": "Dev (Unstable)", + "LabelAllowServerAutoRestart": "Allow the server to restart automatically to apply updates", + "LabelAllowServerAutoRestartHelp": "The server will only restart during idle periods, when no users are active.", + "LabelEnableDebugLogging": "Enable debug logging", + "LabelRunServerAtStartup": "Ba\u015flang\u0131\u00e7ta Server\u0131 \u00c7al\u0131\u015ft\u0131r", + "LabelRunServerAtStartupHelp": "This will start the tray icon on windows startup. To start the windows service, uncheck this and run the service from the windows control panel. Please note that you cannot run both at the same time, so you will need to exit the tray icon before starting the service.", + "ButtonSelectDirectory": "Select Directory", + "LabelCustomPaths": "Specify custom paths where desired. Leave fields empty to use the defaults.", + "LabelCachePath": "Cache path:", + "LabelCachePathHelp": "Specify a custom location for server cache files, such as images.", + "LabelImagesByNamePath": "Images by name path:", + "LabelImagesByNamePathHelp": "Specify a custom location for downloaded actor, artist, genre and studio images.", + "LabelMetadataPath": "Metadata path:", + "LabelMetadataPathHelp": "Specify a custom location for downloaded artwork and metadata, if not saving within media folders.", + "LabelTranscodingTempPath": "Transcoding temporary path:", + "LabelTranscodingTempPathHelp": "This folder contains working files used by the transcoder. Specify a custom path, or leave empty to use the default within the server's data folder.", + "TabBasics": "Basics", + "TabTV": "TV", + "TabGames": "Oyunlar", + "TabMusic": "Muzik", + "TabOthers": "Di\u011ferleri", + "HeaderExtractChapterImagesFor": "Extract chapter images for:", + "OptionMovies": "Filmler", + "OptionEpisodes": "Episodes", + "OptionOtherVideos": "Di\u011fer Videolar", + "TitleMetadata": "Metadata", + "LabelAutomaticUpdatesFanart": "Enable automatic updates from FanArt.tv", + "LabelAutomaticUpdatesTmdb": "Enable automatic updates from TheMovieDB.org", + "LabelAutomaticUpdatesTvdb": "Enable automatic updates from TheTVDB.com", + "LabelAutomaticUpdatesFanartHelp": "If enabled, new images will be downloaded automatically as they're added to fanart.tv. Existing images will not be replaced.", + "LabelAutomaticUpdatesTmdbHelp": "If enabled, new images will be downloaded automatically as they're added to TheMovieDB.org. Existing images will not be replaced.", + "LabelAutomaticUpdatesTvdbHelp": "If enabled, new images will be downloaded automatically as they're added to TheTVDB.com. Existing images will not be replaced.", + "ExtractChapterImagesHelp": "Extracting chapter images will allow clients to display graphical scene selection menus. The process can be slow, cpu-intensive and may require several gigabytes of space. It runs when videos are discovered, and also as a nightly scheduled task at 4am. The schedule is configurable in the scheduled tasks area. It is not recommended to run this task during peak usage hours.", + "LabelMetadataDownloadLanguage": "Preferred download language:", + "ButtonAutoScroll": "Auto-scroll", + "LabelImageSavingConvention": "Image saving convention:", + "LabelImageSavingConventionHelp": "Media Browser recognizes images from most major media applications. Choosing your downloading convention is useful if you also use other products.", + "OptionImageSavingCompatible": "Compatible - Media Browser\/Xbmc\/Plex", + "OptionImageSavingStandard": "Standart - MB2", + "ButtonSignIn": "Giri\u015f Yap\u0131n", + "TitleSignIn": "Giri\u015f Yap\u0131n", + "HeaderPleaseSignIn": "L\u00fctfen Giri\u015f Yap\u0131n", + "LabelUser": "Kullan\u0131c\u0131", + "LabelPassword": "\u015eifre", + "ButtonManualLogin": "Manuel Giri\u015f", + "PasswordLocalhostMessage": "Passwords are not required when logging in from localhost.", + "TabGuide": "Guide", + "TabChannels": "Kanallar", + "TabCollections": "Collections", + "HeaderChannels": "Kanallar", + "TabRecordings": "Kay\u0131tlar", + "TabScheduled": "G\u00f6revler", + "TabSeries": "Seriler", + "TabFavorites": "Favorites", + "TabMyLibrary": "My Library", + "ButtonCancelRecording": "Kay\u0131t \u0130ptal", + "HeaderPrePostPadding": "Pre\/Post Padding", + "LabelPrePaddingMinutes": "Pre-padding minutes:", + "OptionPrePaddingRequired": "Pre-padding is required in order to record.", + "LabelPostPaddingMinutes": "Post-padding minutes:", + "OptionPostPaddingRequired": "Post-padding is required in order to record.", + "HeaderWhatsOnTV": "What's On", + "HeaderUpcomingTV": "Upcoming TV", + "TabStatus": "Durum", + "TabSettings": "Ayarlar", + "ButtonRefreshGuideData": "Refresh Guide Data", + "OptionPriority": "Priority", + "OptionRecordOnAllChannels": "Record program on all channels", + "OptionRecordAnytime": "Record program at any time", + "OptionRecordOnlyNewEpisodes": "Record only new episodes", + "HeaderDays": "G\u00fcnler", + "HeaderActiveRecordings": "Aktif Kay\u0131tlar", + "HeaderLatestRecordings": "Ge\u00e7mi\u015f Kay\u0131tlar", + "HeaderAllRecordings": "T\u00fcm Kay\u0131tlar", + "ButtonPlay": "\u00c7al", + "ButtonEdit": "D\u00fczenle", + "ButtonRecord": "Kay\u0131t", + "ButtonDelete": "Sil", + "ButtonRemove": "Sil", + "OptionRecordSeries": "Kay\u0131t Serisi", + "HeaderDetails": "Detay", + "TitleLiveTV": "Canl\u0131 TV", + "LabelNumberOfGuideDays": "Number of days of guide data to download:", + "LabelNumberOfGuideDaysHelp": "Downloading more days worth of guide data provides the ability to schedule out further in advance and view more listings, but it will also take longer to download. Auto will choose based on the number of channels.", + "LabelActiveService": "Aktif Servis:", + "LabelActiveServiceHelp": "Multiple tv plugins can be installed but only one can be active at a time.", + "OptionAutomatic": "Otomatik", + "LiveTvPluginRequired": "A Live TV service provider plugin is required in order to continue.", + "LiveTvPluginRequiredHelp": "Please install one of our available plugins, such as Next Pvr or ServerWmc.", + "LabelCustomizeOptionsPerMediaType": "Customize for media type:", + "OptionDownloadThumbImage": "K\u00fc\u00e7\u00fck Resim", + "OptionDownloadMenuImage": "Men\u00fc", + "OptionDownloadLogoImage": "Logo", + "OptionDownloadBoxImage": "Kutu", + "OptionDownloadDiscImage": "Disc", + "OptionDownloadBannerImage": "Banner", + "OptionDownloadBackImage": "Geri", + "OptionDownloadArtImage": "Galeri", + "OptionDownloadPrimaryImage": "Birincil", + "HeaderFetchImages": "Fetch Images:", + "HeaderImageSettings": "Resim Ayarlar\u0131", + "TabOther": "Other", + "LabelMaxBackdropsPerItem": "Maximum number of backdrops per item:", + "LabelMaxScreenshotsPerItem": "Maximum number of screenshots per item:", + "LabelMinBackdropDownloadWidth": "Minimum backdrop download width:", + "LabelMinScreenshotDownloadWidth": "Minimum screenshot download width:", + "ButtonAddScheduledTaskTrigger": "Add Task Trigger", + "HeaderAddScheduledTaskTrigger": "Add Task Trigger", + "ButtonAdd": "Ekle", + "LabelTriggerType": "Trigger Type:", + "OptionDaily": "G\u00fcnl\u00fck", + "OptionWeekly": "Haftal\u0131k", + "OptionOnInterval": "On an interval", + "OptionOnAppStartup": "On application startup", + "OptionAfterSystemEvent": "After a system event", + "LabelDay": "G\u00fcn:", + "LabelTime": "Zaman:", + "LabelEvent": "Event:", + "OptionWakeFromSleep": "Wake from sleep", + "LabelEveryXMinutes": "Every:", + "HeaderTvTuners": "Tuners", + "HeaderGallery": "Galeri", + "HeaderLatestGames": "Ge\u00e7mi\u015f Oyunlar", + "HeaderRecentlyPlayedGames": "Silinen Oyanan Oyunlar", + "TabGameSystems": "Oyun Sistemleri", + "TitleMediaLibrary": "Medya K\u00fct\u00fcphanesi", + "TabFolders": "Klas\u00f6rler", + "TabPathSubstitution": "Path Substitution", + "LabelSeasonZeroDisplayName": "Season 0 display name:", + "LabelEnableRealtimeMonitor": "Enable real time monitoring", + "LabelEnableRealtimeMonitorHelp": "Changes will be processed immediately, on supported file systems.", + "ButtonScanLibrary": "K\u00fct\u00fcphaneyi Tara", + "HeaderNumberOfPlayers": "Players:", + "OptionAnyNumberOfPlayers": "Hepsi", + "Option1Player": "1+", + "Option2Player": "2+", + "Option3Player": "3+", + "Option4Player": "4+", + "HeaderMediaFolders": "Media Klas\u00f6rleri", + "HeaderThemeVideos": "Video Temalar\u0131", + "HeaderThemeSongs": "Tema \u015eark\u0131lar", + "HeaderScenes": "Diziler", + "HeaderAwardsAndReviews": "Awards and Reviews", + "HeaderSoundtracks": "Soundtracks", + "HeaderMusicVideos": "Music Videos", + "HeaderSpecialFeatures": "Special Features", + "HeaderCastCrew": "Cast & Crew", + "HeaderAdditionalParts": "Additional Parts", + "ButtonSplitVersionsApart": "Split Versions Apart", + "ButtonPlayTrailer": "Trailer", + "LabelMissing": "Missing", + "LabelOffline": "Offline", + "PathSubstitutionHelp": "Path substitutions are used for mapping a path on the server to a path that clients are able to access. By allowing clients direct access to media on the server they may be able to play them directly over the network and avoid using server resources to stream and transcode them.", + "HeaderFrom": "From", + "HeaderTo": "To", + "LabelFrom": "From:", + "LabelFromHelp": "Example: D:\\Movies (on the server)", + "LabelTo": "To:", + "LabelToHelp": "Example: \\\\MyServer\\Movies (a path clients can access)", + "ButtonAddPathSubstitution": "Add Substitution", + "OptionSpecialEpisode": "Specials", + "OptionMissingEpisode": "Missing Episodes", + "OptionUnairedEpisode": "Unaired Episodes", + "OptionEpisodeSortName": "Episode Sort Name", + "OptionSeriesSortName": "Seri Ad\u0131", + "OptionTvdbRating": "Tvdb Reyting", + "HeaderTranscodingQualityPreference": "Kodlay\u0131c\u0131 Kalite Ayarlar\u0131", + "OptionAutomaticTranscodingHelp": "The server will decide quality and speed", + "OptionHighSpeedTranscodingHelp": "D\u00fc\u015f\u00fck Kalite,H\u0131zl\u0131 Kodlama", + "OptionHighQualityTranscodingHelp": "Y\u00fcksek Kalite,Yava\u015f Kodlama", + "OptionMaxQualityTranscodingHelp": "En iyi Kalite,Yava\u015f Kodlama,Y\u00fcksek CPU Kullan\u0131m\u0131", + "OptionHighSpeedTranscoding": "Y\u00fcksek H\u0131z", + "OptionHighQualityTranscoding": "Y\u00fcksek Kalite", + "OptionMaxQualityTranscoding": "Max Kalite", + "OptionEnableDebugTranscodingLogging": "Enable debug transcoding logging", + "OptionEnableDebugTranscodingLoggingHelp": "This will create very large log files and is only recommended as needed for troubleshooting purposes.", + "OptionUpscaling": "Allow clients to request upscaled video", + "OptionUpscalingHelp": "In some cases this will result in improved video quality but will increase CPU usage.", + "EditCollectionItemsHelp": "Add or remove any movies, series, albums, books or games you wish to group within this collection.", + "HeaderAddTitles": "Add Titles", + "LabelEnableDlnaPlayTo": "Enable DLNA Play To", + "LabelEnableDlnaPlayToHelp": "Media Browser can detect devices within your network and offer the ability to remote control them.", + "LabelEnableDlnaDebugLogging": "Enable DLNA debug logging", + "LabelEnableDlnaDebugLoggingHelp": "This will create large log files and should only be used as needed for troubleshooting purposes.", + "LabelEnableDlnaClientDiscoveryInterval": "Client discovery interval (seconds)", + "LabelEnableDlnaClientDiscoveryIntervalHelp": "Determines the duration in seconds between SSDP searches performed by Media Browser.", + "HeaderCustomDlnaProfiles": "\u00d6zel Profiller", + "HeaderSystemDlnaProfiles": "Sistem Profilleri", + "CustomDlnaProfilesHelp": "Create a custom profile to target a new device or override a system profile.", + "SystemDlnaProfilesHelp": "System profiles are read-only. Changes to a system profile will be saved to a new custom profile.", + "TitleDashboard": "Dashboard", + "TabHome": "Anasayfa", + "TabInfo": "Info", + "HeaderLinks": "Links", + "HeaderSystemPaths": "System Paths", + "LinkCommunity": "Community", + "LinkGithub": "Github", + "LinkApiDocumentation": "Api D\u00f6k\u00fcmanlar\u0131", + "LabelFriendlyServerName": "Friendly server name:", + "LabelFriendlyServerNameHelp": "This name will be used to identify this server. If left blank, the computer name will be used.", + "LabelPreferredDisplayLanguage": "Preferred display language", + "LabelPreferredDisplayLanguageHelp": "Translating Media Browser is an ongoing project and is not yet complete.", + "LabelReadHowYouCanContribute": "Read about how you can contribute.", + "HeaderNewCollection": "Yeni Koleksiyon", + "HeaderAddToCollection": "Add to Collection", + "ButtonSubmit": "Submit", + "NewCollectionNameExample": "Example: Star Wars Collection", + "OptionSearchForInternetMetadata": "Search the internet for artwork and metadata", + "ButtonCreate": "Create", + "LabelHttpServerPortNumber": "Http server port number:", + "LabelWebSocketPortNumber": "Web socket port number:", + "LabelEnableAutomaticPortHelp": "UPnP allows automated router configuration for remote access. This may not work with some router models.", + "LabelExternalDDNS": "External DDNS:", + "LabelExternalDDNSHelp": "If you have a dynamic DNS enter it here. Media Browser apps will use it when connecting remotely.", + "TabResume": "Resume", + "TabWeather": "Weather", + "TitleAppSettings": "App Settings", + "LabelMinResumePercentage": "Min resume percentage:", + "LabelMaxResumePercentage": "Max resume percentage:", + "LabelMinResumeDuration": "Min resume duration (seconds):", + "LabelMinResumePercentageHelp": "Titles are assumed unplayed if stopped before this time", + "LabelMaxResumePercentageHelp": "Titles are assumed fully played if stopped after this time", + "LabelMinResumeDurationHelp": "Titles shorter than this will not be resumable", + "TitleAutoOrganize": "Auto-Organize", + "TabActivityLog": "Activity Log", + "HeaderName": "Name", + "HeaderDate": "Date", + "HeaderSource": "Source", + "HeaderDestination": "Destination", + "HeaderProgram": "Program", + "HeaderClients": "Clients", + "LabelCompleted": "Completed", + "LabelFailed": "Failed", + "LabelSkipped": "Skipped", + "HeaderEpisodeOrganization": "Episode Organization", + "LabelSeries": "Series:", + "LabelSeasonNumber": "Season number", + "LabelEpisodeNumber": "Episode number", + "LabelEndingEpisodeNumber": "Ending episode number", + "LabelEndingEpisodeNumberHelp": "Only required for multi-episode files", + "HeaderSupportTheTeam": "Support the Media Browser Team", + "LabelSupportAmount": "Amount (USD)", + "HeaderSupportTheTeamHelp": "Help ensure the continued development of this project by donating. A portion of all donations will be contributed to other free tools we depend on.", + "ButtonEnterSupporterKey": "Enter supporter key", + "DonationNextStep": "Once complete, please return and enter your supporter key, which you will receive by email.", + "AutoOrganizeHelp": "Auto-organize monitors your download folders for new files and moves them to your media directories.", + "AutoOrganizeTvHelp": "TV file organizing will only add episodes to existing series. It will not create new series folders.", + "OptionEnableEpisodeOrganization": "Enable new episode organization", + "LabelWatchFolder": "Watch folder:", + "LabelWatchFolderHelp": "The server will poll this folder during the 'Organize new media files' scheduled task.", + "ButtonViewScheduledTasks": "View scheduled tasks", + "LabelMinFileSizeForOrganize": "Minimum file size (MB):", + "LabelMinFileSizeForOrganizeHelp": "Files under this size will be ignored.", + "LabelSeasonFolderPattern": "Season folder pattern:", + "LabelSeasonZeroFolderName": "Season zero folder name:", + "HeaderEpisodeFilePattern": "Episode file pattern", + "LabelEpisodePattern": "Episode pattern:", + "LabelMultiEpisodePattern": "Multi-Episode pattern:", + "HeaderSupportedPatterns": "Supported Patterns", + "HeaderTerm": "Term", + "HeaderPattern": "Pattern", + "HeaderResult": "Result", + "LabelDeleteEmptyFolders": "Delete empty folders after organizing", + "LabelDeleteEmptyFoldersHelp": "Enable this to keep the download directory clean.", + "LabelDeleteLeftOverFiles": "Delete left over files with the following extensions:", + "LabelDeleteLeftOverFilesHelp": "Separate with ;. For example: .nfo;.txt", + "OptionOverwriteExistingEpisodes": "Overwrite existing episodes", + "LabelTransferMethod": "Transfer method", + "OptionCopy": "Copy", + "OptionMove": "Move", + "LabelTransferMethodHelp": "Copy or move files from the watch folder", + "HeaderLatestNews": "Latest News", + "HeaderHelpImproveMediaBrowser": "Help Improve Media Browser", + "HeaderRunningTasks": "Running Tasks", + "HeaderActiveDevices": "Active Devices", + "HeaderPendingInstallations": "Pending Installations", + "HeaerServerInformation": "Server Information", + "ButtonRestartNow": "Restart Now", + "ButtonRestart": "Restart", + "ButtonShutdown": "Shutdown", + "ButtonUpdateNow": "Update Now", + "PleaseUpdateManually": "Please shutdown the server and update manually.", + "NewServerVersionAvailable": "A new version of Media Browser Server is available!", + "ServerUpToDate": "Media Browser Server is up to date", + "ErrorConnectingToMediaBrowserRepository": "There was an error connecting to the remote Media Browser repository.", + "LabelComponentsUpdated": "The following components have been installed or updated:", + "MessagePleaseRestartServerToFinishUpdating": "Please restart the server to finish applying updates.", + "LabelDownMixAudioScale": "Audio boost when downmixing:", + "LabelDownMixAudioScaleHelp": "Boost audio when downmixing. Set to 1 to preserve original volume value.", + "ButtonLinkKeys": "Link Keys", + "LabelOldSupporterKey": "Old supporter key", + "LabelNewSupporterKey": "New supporter key", + "HeaderMultipleKeyLinking": "Multiple Key Linking", + "MultipleKeyLinkingHelp": "If you have more than one supporter key, use this form to link the old key's registrations with your new one.", + "LabelCurrentEmailAddress": "Current email address", + "LabelCurrentEmailAddressHelp": "The current email address to which your new key was sent.", + "HeaderForgotKey": "Forgot Key", + "LabelEmailAddress": "Email address", + "LabelSupporterEmailAddress": "The email address that was used to purchase the key.", + "ButtonRetrieveKey": "Retrieve Key", + "LabelSupporterKey": "Supporter Key (paste from email)", + "LabelSupporterKeyHelp": "Enter your supporter key to start enjoying additional benefits the community has developed for Media Browser.", + "MessageInvalidKey": "Supporter key is missing or invalid.", + "ErrorMessageInvalidKey": "In order for any premium content to be registered, you must also be a Media Browser Supporter. Please donate and support the continued development of the core product. Thank you.", + "HeaderDisplaySettings": "Display Settings", + "TabPlayTo": "Play To", + "LabelEnableDlnaServer": "Enable Dlna server", + "LabelEnableDlnaServerHelp": "Allows UPnP devices on your network to browse and play Media Browser content.", + "LabelEnableBlastAliveMessages": "Blast alive messages", + "LabelEnableBlastAliveMessagesHelp": "Enable this if the server is not detected reliably by other UPnP devices on your network.", + "LabelBlastMessageInterval": "Alive message interval (seconds)", + "LabelBlastMessageIntervalHelp": "Determines the duration in seconds between server alive messages.", + "LabelDefaultUser": "Default user:", + "LabelDefaultUserHelp": "Determines which user library should be displayed on connected devices. This can be overridden for each device using profiles.", + "TitleDlna": "DLNA", + "TitleChannels": "Channels", + "HeaderServerSettings": "Server Settings", + "LabelWeatherDisplayLocation": "Weather display location:", + "LabelWeatherDisplayLocationHelp": "US zip code \/ City, State, Country \/ City, Country", + "LabelWeatherDisplayUnit": "Weather display unit:", + "OptionCelsius": "Celsius", + "OptionFahrenheit": "Fahrenheit", + "HeaderRequireManualLogin": "Require manual username entry for:", + "HeaderRequireManualLoginHelp": "When disabled clients may present a login screen with a visual selection of users.", + "OptionOtherApps": "Other apps", + "OptionMobileApps": "Mobile apps", + "HeaderNotificationList": "Click on a notification to configure it's sending options.", + "NotificationOptionApplicationUpdateAvailable": "Application update available", + "NotificationOptionApplicationUpdateInstalled": "Application update installed", + "NotificationOptionPluginUpdateInstalled": "Plugin update installed", + "NotificationOptionPluginInstalled": "Plugin installed", + "NotificationOptionPluginUninstalled": "Plugin uninstalled", + "NotificationOptionVideoPlayback": "Video playback started", + "NotificationOptionAudioPlayback": "Audio playback started", + "NotificationOptionGamePlayback": "Game playback started", + "NotificationOptionVideoPlaybackStopped": "Video playback stopped", + "NotificationOptionAudioPlaybackStopped": "Audio playback stopped", + "NotificationOptionGamePlaybackStopped": "Game playback stopped", + "NotificationOptionTaskFailed": "Scheduled task failure", + "NotificationOptionInstallationFailed": "Installation failure", + "NotificationOptionNewLibraryContent": "New content added", + "NotificationOptionNewLibraryContentMultiple": "New content added (multiple)", + "SendNotificationHelp": "By default, notifications are delivered to the dashboard inbox. Browse the plugin catalog to install additional notification options.", + "NotificationOptionServerRestartRequired": "Server restart required", + "LabelNotificationEnabled": "Enable this notification", + "LabelMonitorUsers": "Monitor activity from:", + "LabelSendNotificationToUsers": "Send the notification to:", + "UsersNotNotifiedAboutSelfActivity": "Users will not be notified about their own activities.", + "LabelUseNotificationServices": "Use the following services:", + "CategoryUser": "User", + "CategorySystem": "System", + "CategoryApplication": "Application", + "CategoryPlugin": "Plugin", + "LabelMessageTitle": "Message title:", + "LabelAvailableTokens": "Available tokens:", + "AdditionalNotificationServices": "Browse the plugin catalog to install additional notification services.", + "OptionAllUsers": "All users", + "OptionAdminUsers": "Administrators", + "OptionCustomUsers": "Custom", + "ButtonArrowUp": "Up", + "ButtonArrowDown": "Down", + "ButtonArrowLeft": "Left", + "ButtonArrowRight": "Right", + "ButtonBack": "Back", + "ButtonInfo": "Info", + "ButtonOsd": "On screen display", + "ButtonPageUp": "Page Up", + "ButtonPageDown": "Page Down", + "PageAbbreviation": "PG", + "ButtonHome": "Home", + "ButtonSettings": "Settings", + "ButtonTakeScreenshot": "Capture Screenshot", + "ButtonLetterUp": "Letter Up", + "ButtonLetterDown": "Letter Down", + "PageButtonAbbreviation": "PG", + "LetterButtonAbbreviation": "A", + "TabNowPlaying": "Now Playing", + "TabNavigation": "Navigation", + "TabControls": "Controls", + "ButtonFullscreen": "Toggle fullscreen", + "ButtonScenes": "Scenes", + "ButtonSubtitles": "Subtitles", + "ButtonAudioTracks": "Audio tracks", + "ButtonPreviousTrack": "Previous track", + "ButtonNextTrack": "Next track", + "ButtonStop": "Stop", + "ButtonPause": "Pause", + "LabelGroupMoviesIntoCollections": "Group movies into collections", + "LabelGroupMoviesIntoCollectionsHelp": "When displaying movie lists, movies belonging to a collection will be displayed as one grouped item.", + "NotificationOptionPluginError": "Plugin failure", + "ButtonVolumeUp": "Volume up", + "ButtonVolumeDown": "Volume down", + "ButtonMute": "Mute", + "HeaderLatestMedia": "Latest Media", + "OptionSpecialFeatures": "Special Features", + "HeaderCollections": "Collections", + "LabelProfileCodecsHelp": "Separated by comma. This can be left empty to apply to all codecs.", + "LabelProfileContainersHelp": "Separated by comma. This can be left empty to apply to all containers.", + "HeaderResponseProfile": "Response Profile", + "LabelType": "Type:", + "LabelProfileContainer": "Container:", + "LabelProfileVideoCodecs": "Video codecs:", + "LabelProfileAudioCodecs": "Audio codecs:", + "LabelProfileCodecs": "Codecs:", + "HeaderDirectPlayProfile": "Direct Play Profile", + "HeaderTranscodingProfile": "Transcoding Profile", + "HeaderCodecProfile": "Codec Profile", + "HeaderCodecProfileHelp": "Codec profiles indicate the limitations of a device when playing specific codecs. If a limitation applies then the media will be transcoded, even if the codec is configured for direct play.", + "HeaderContainerProfile": "Container Profile", + "HeaderContainerProfileHelp": "Container profiles indicate the limitations of a device when playing specific formats. If a limitation applies then the media will be transcoded, even if the format is configured for direct play.", + "OptionProfileVideo": "Video", + "OptionProfileAudio": "Audio", + "OptionProfileVideoAudio": "Video Audio", + "OptionProfilePhoto": "Photo", + "LabelUserLibrary": "User library:", + "LabelUserLibraryHelp": "Select which user library to display to the device. Leave empty to inherit the default setting.", + "OptionPlainStorageFolders": "Display all folders as plain storage folders", + "OptionPlainStorageFoldersHelp": "If enabled, all folders are represented in DIDL as \"object.container.storageFolder\" instead of a more specific type, such as \"object.container.person.musicArtist\".", + "OptionPlainVideoItems": "Display all videos as plain video items", + "OptionPlainVideoItemsHelp": "If enabled, all videos are represented in DIDL as \"object.item.videoItem\" instead of a more specific type, such as \"object.item.videoItem.movie\".", + "LabelSupportedMediaTypes": "Supported Media Types:", + "TabIdentification": "Identification", + "TabDirectPlay": "Direct Play", + "TabContainers": "Containers", + "TabCodecs": "Codecs", + "TabResponses": "Responses", + "HeaderProfileInformation": "Profile Information", + "LabelEmbedAlbumArtDidl": "Embed album art in Didl", + "LabelEmbedAlbumArtDidlHelp": "Some devices prefer this method for obtaining album art. Others may fail to play with this option enabled.", + "LabelAlbumArtPN": "Album art PN:", + "LabelAlbumArtHelp": "PN used for album art, within the dlna:profileID attribute on upnp:albumArtURI. Some clients require a specific value, regardless of the size of the image.", + "LabelAlbumArtMaxWidth": "Album art max width:", + "LabelAlbumArtMaxWidthHelp": "Max resolution of album art exposed via upnp:albumArtURI.", + "LabelAlbumArtMaxHeight": "Album art max height:", + "LabelAlbumArtMaxHeightHelp": "Max resolution of album art exposed via upnp:albumArtURI.", + "LabelIconMaxWidth": "Icon max width:", + "LabelIconMaxWidthHelp": "Max resolution of icons exposed via upnp:icon.", + "LabelIconMaxHeight": "Icon max height:", + "LabelIconMaxHeightHelp": "Max resolution of icons exposed via upnp:icon.", + "LabelIdentificationFieldHelp": "A case-insensitive substring or regex expression.", + "HeaderProfileServerSettingsHelp": "These values control how Media Browser will present itself to the device.", + "LabelMaxBitrate": "Max bitrate:", + "LabelMaxBitrateHelp": "Specify a max bitrate in bandwidth constrained environments, or if the device imposes it's own limit.", + "LabelMaxStreamingBitrate": "Max streaming bitrate:", + "LabelMaxStreamingBitrateHelp": "Specify a max bitrate when streaming.", + "LabelMaxStaticBitrate": "Max sync bitrate:", + "LabelMaxStaticBitrateHelp": "Specify a max bitrate when syncing content at high quality.", + "OptionIgnoreTranscodeByteRangeRequests": "Ignore transcode byte range requests", + "OptionIgnoreTranscodeByteRangeRequestsHelp": "If enabled, these requests will be honored but will ignore the byte range header.", + "LabelFriendlyName": "Friendly name", + "LabelManufacturer": "Manufacturer", + "LabelManufacturerUrl": "Manufacturer url", + "LabelModelName": "Model name", + "LabelModelNumber": "Model number", + "LabelModelDescription": "Model description", + "LabelModelUrl": "Model url", + "LabelSerialNumber": "Serial number", + "LabelDeviceDescription": "Device description", + "HeaderIdentificationCriteriaHelp": "Enter at least one identification criteria.", + "HeaderDirectPlayProfileHelp": "Add direct play profiles to indicate which formats the device can handle natively.", + "HeaderTranscodingProfileHelp": "Add transcoding profiles to indicate which formats should be used when transcoding is required.", + "HeaderResponseProfileHelp": "Response profiles provide a way to customize information sent to the device when playing certain kinds of media.", + "LabelXDlnaCap": "X-Dlna cap:", + "LabelXDlnaCapHelp": "Determines the content of the X_DLNACAP element in the urn:schemas-dlna-org:device-1-0 namespace.", + "LabelXDlnaDoc": "X-Dlna doc:", + "LabelXDlnaDocHelp": "Determines the content of the X_DLNADOC element in the urn:schemas-dlna-org:device-1-0 namespace.", + "LabelSonyAggregationFlags": "Sony aggregation flags:", + "LabelSonyAggregationFlagsHelp": "Determines the content of the aggregationFlags element in the urn:schemas-sonycom:av namespace.", + "LabelTranscodingContainer": "Container:", + "LabelTranscodingVideoCodec": "Video codec:", + "LabelTranscodingVideoProfile": "Video profile:", + "LabelTranscodingAudioCodec": "Audio codec:", + "OptionEnableM2tsMode": "Enable M2ts mode", + "OptionEnableM2tsModeHelp": "Enable m2ts mode when encoding to mpegts.", + "OptionEstimateContentLength": "Estimate content length when transcoding", + "OptionReportByteRangeSeekingWhenTranscoding": "Report that the server supports byte seeking when transcoding", + "OptionReportByteRangeSeekingWhenTranscodingHelp": "This is required for some devices that don't time seek very well.", + "HeaderSubtitleDownloadingHelp": "When Media Browser scans your video files it can search for missing subtitles, and download them using a subtitle provider such as OpenSubtitles.org.", + "HeaderDownloadSubtitlesFor": "Download subtitles for:", + "MessageNoChapterProviders": "Install a chapter provider plugin such as ChapterDb to enable additional chapter options.", + "LabelSkipIfGraphicalSubsPresent": "Skip if the video already contains graphical subtitles", + "LabelSkipIfGraphicalSubsPresentHelp": "Keeping text versions of subtitles will result in more efficient delivery to mobile clients.", + "TabSubtitles": "Subtitles", + "TabChapters": "Chapters", + "HeaderDownloadChaptersFor": "Download chapter names for:", + "LabelOpenSubtitlesUsername": "Open Subtitles username:", + "LabelOpenSubtitlesPassword": "Open Subtitles password:", + "HeaderChapterDownloadingHelp": "When Media Browser scans your video files it can download friendly chapter names from the internet using chapter plugins such as ChapterDb.", + "LabelPlayDefaultAudioTrack": "Play default audio track regardless of language", + "LabelSubtitlePlaybackMode": "Subtitle mode:", + "LabelDownloadLanguages": "Download languages:", + "ButtonRegister": "Register", + "LabelSkipIfAudioTrackPresent": "Skip if the default audio track matches the download language", + "LabelSkipIfAudioTrackPresentHelp": "Uncheck this to ensure all videos have subtitles, regardless of audio language.", + "HeaderSendMessage": "Send Message", + "ButtonSend": "Send", + "LabelMessageText": "Message text:", + "MessageNoAvailablePlugins": "No available plugins.", + "LabelDisplayPluginsFor": "Display plugins for:", + "PluginTabMediaBrowserClassic": "MB Classic", + "PluginTabMediaBrowserTheater": "MB Theater", + "LabelEpisodeName": "Episode name", + "LabelSeriesName": "Series name", + "ValueSeriesNamePeriod": "Series.name", + "ValueSeriesNameUnderscore": "Series_name", + "ValueEpisodeNamePeriod": "Episode.name", + "ValueEpisodeNameUnderscore": "Episode_name", + "HeaderTypeText": "Enter Text", + "LabelTypeText": "Text", + "HeaderSearchForSubtitles": "Search for Subtitles", + "MessageNoSubtitleSearchResultsFound": "No search results founds.", + "TabDisplay": "Display", + "TabLanguages": "Languages", + "TabWebClient": "Web Client", + "LabelEnableThemeSongs": "Enable theme songs", + "LabelEnableBackdrops": "Enable backdrops", + "LabelEnableThemeSongsHelp": "If enabled, theme songs will be played in the background while browsing the library.", + "LabelEnableBackdropsHelp": "If enabled, backdrops will be displayed in the background of some pages while browsing the library.", + "HeaderHomePage": "Home Page", + "HeaderSettingsForThisDevice": "Settings for This Device", + "OptionAuto": "Auto", + "OptionYes": "Yes", + "OptionNo": "No", + "LabelHomePageSection1": "Home page section 1:", + "LabelHomePageSection2": "Home page section 2:", + "LabelHomePageSection3": "Home page section 3:", + "LabelHomePageSection4": "Home page section 4:", + "OptionMyViewsButtons": "My views (buttons)", + "OptionMyViews": "My views", + "OptionMyViewsSmall": "My views (small)", + "OptionResumablemedia": "Resume", + "OptionLatestMedia": "Latest media", + "OptionLatestChannelMedia": "Latest channel items", + "HeaderLatestChannelItems": "Latest Channel Items", + "OptionNone": "None", + "HeaderLiveTv": "Live TV", + "HeaderReports": "Reports", + "HeaderMetadataManager": "Metadata Manager", + "HeaderPreferences": "Preferences", + "MessageLoadingChannels": "Loading channel content...", + "ButtonMarkRead": "Mark Read", + "OptionDefaultSort": "Default", + "OptionCommunityMostWatchedSort": "Most Watched", + "TabNextUp": "Next Up", + "MessageNoMovieSuggestionsAvailable": "No movie suggestions are currently available. Start watching and rating your movies, and then come back to view your recommendations.", + "MessageNoCollectionsAvailable": "Collections allow you to enjoy personalized groupings of Movies, Series, Albums, Books and Games. Click the New button to start creating Collections.", + "HeaderWelcomeToMediaBrowserWebClient": "Welcome to the Media Browser Web Client", + "ButtonDismiss": "Dismiss", + "MessageLearnHowToCustomize": "Learn how to customize this page to your own personal tastes. Click your user icon in the top right corner of the screen to view and update your preferences.", + "ButtonEditOtherUserPreferences": "Edit this user's personal preferences.", + "LabelChannelStreamQuality": "Preferred internet stream quality:", + "LabelChannelStreamQualityHelp": "In a low bandwidth environment, limiting quality can help ensure a smooth streaming experience.", + "OptionBestAvailableStreamQuality": "Best available", + "LabelEnableChannelContentDownloadingFor": "Enable channel content downloading for:", + "LabelEnableChannelContentDownloadingForHelp": "Some channels support downloading content prior to viewing. Enable this in low bandwidth enviornments to download channel content during off hours. Content is downloaded as part of the channel download scheduled task.", + "LabelChannelDownloadPath": "Channel content download path:", + "LabelChannelDownloadPathHelp": "Specify a custom download path if desired. Leave empty to download to an internal program data folder.", + "LabelChannelDownloadAge": "Delete content after: (days)", + "LabelChannelDownloadAgeHelp": "Downloaded content older than this will be deleted. It will remain playable via internet streaming.", + "ChannelSettingsFormHelp": "Install channels such as Trailers and Vimeo in the plugin catalog.", + "LabelSelectCollection": "Select collection:", + "ViewTypeMovies": "Movies", + "ViewTypeTvShows": "TV", + "ViewTypeGames": "Games", + "ViewTypeMusic": "Music", + "ViewTypeBoxSets": "Collections", + "ViewTypeChannels": "Channels", + "ViewTypeLiveTV": "Live TV", + "HeaderOtherDisplaySettings": "Display Settings", + "HeaderMyViews": "My Views", + "LabelSelectFolderGroups": "Automatically group content from the following folders into views such as Movies, Music and TV:", + "LabelSelectFolderGroupsHelp": "Folders that are unchecked will be displayed by themselves in their own view.", + "OptionDisplayAdultContent": "Display adult content", + "OptionLibraryFolders": "Media folders", + "TitleRemoteControl": "Remote Control", + "OptionLatestTvRecordings": "Latest recordings", + "LabelProtocolInfo": "Protocol info:", + "LabelProtocolInfoHelp": "The value that will be used when responding to GetProtocolInfo requests from the device.", + "TabXbmcMetadata": "Xbmc", + "HeaderXbmcMetadataHelp": "Media Browser includes native support for Xbmc Nfo metadata and images. To enable or disable Xbmc metadata, use the Advanced tab to configure options for your media types.", + "LabelXbmcMetadataUser": "Add user watch data to nfo's for:", + "LabelXbmcMetadataUserHelp": "Enable this to keep watch data in sync between Media Browser and Xbmc.", + "LabelXbmcMetadataDateFormat": "Release date format:", + "LabelXbmcMetadataDateFormatHelp": "All dates within nfo's will be read and written to using this format.", + "LabelXbmcMetadataSaveImagePaths": "Save image paths within nfo files", + "LabelXbmcMetadataSaveImagePathsHelp": "This is recommended if you have image file names that don't conform to Xbmc guidelines.", + "LabelXbmcMetadataEnablePathSubstitution": "Enable path substitution", + "LabelXbmcMetadataEnablePathSubstitutionHelp": "Enables path substitution of image paths using the server's path substitution settings.", + "LabelXbmcMetadataEnablePathSubstitutionHelp2": "See path substitution.", + "LabelGroupChannelsIntoViews": "Display the following channels directly within my views:", + "LabelGroupChannelsIntoViewsHelp": "If enabled, these channels will be displayed directly alongside other views. If disabled, they'll be displayed within a separate Channels view.", + "LabelDisplayCollectionsView": "Display a collections view to show movie collections", + "LabelXbmcMetadataEnableExtraThumbs": "Copy extrafanart into extrathumbs", + "LabelXbmcMetadataEnableExtraThumbsHelp": "When downloading images they can be saved into both extrafanart and extrathumbs for maximum Xbmc skin compatibility.", + "TabServices": "Services", + "TabLogs": "Logs", + "HeaderServerLogFiles": "Server log files:", + "TabBranding": "Branding", + "HeaderBrandingHelp": "Customize the appearance of Media Browser to fit the needs of your group or organization.", + "LabelLoginDisclaimer": "Login disclaimer:", + "LabelLoginDisclaimerHelp": "This will be displayed at the bottom of the login page.", + "LabelAutomaticallyDonate": "Automatically donate this amount every six months", + "LabelAutomaticallyDonateHelp": "You can cancel at any time via your PayPal account.", + "OptionList": "List", + "TabDashboard": "Dashboard", + "TitleServer": "Server", + "LabelCache": "Cache:", + "LabelLogs": "Logs:", + "LabelMetadata": "Metadata:", + "LabelImagesByName": "Images by name:", + "LabelTranscodingTemporaryFiles": "Transcoding temporary files:", + "HeaderLatestMusic": "Latest Music", + "HeaderBranding": "Branding", + "HeaderApiKeys": "Api Keys", + "HeaderApiKeysHelp": "External applications are required to have an Api key in order to communicate with Media Browser. Keys are issued by logging in with a Media Browser account, or by manually granting the application a key.", + "HeaderApiKey": "Api Key", + "HeaderApp": "App", + "HeaderDevice": "Device", + "HeaderUser": "User", + "HeaderDateIssued": "Date Issued", + "LabelChapterName": "Chapter {0}", + "HeaderNewApiKey": "New Api Key", + "LabelAppName": "App name", + "LabelAppNameExample": "Example: Sickbeard, NzbDrone", + "HeaderNewApiKeyHelp": "Grant an application permission to communicate with Media Browser.", + "HeaderHttpHeaders": "Http Headers", + "HeaderIdentificationHeader": "Identification Header", + "LabelValue": "Value:", + "LabelMatchType": "Match type:", + "OptionEquals": "Equals", + "OptionRegex": "Regex", + "OptionSubstring": "Substring", + "TabView": "View", + "TabSort": "Sort", + "TabFilter": "Filter", + "ButtonView": "View", + "LabelPageSize": "Item limit:", + "LabelView": "View:", + "TabUsers": "Users", + "HeaderFeatures": "Features", + "HeaderAdvanced": "Advanced", + "ButtonSync": "Sync", + "TabScheduledTasks": "Scheduled Tasks", + "HeaderChapters": "Chapters", + "HeaderResumeSettings": "Resume Settings", + "TabSync": "Sync", + "TitleUsers": "Users", + "LabelProtocol": "Protocol:", + "OptionProtocolHttp": "Http", + "OptionProtocolHls": "Http Live Streaming", + "LabelContext": "Context:", + "OptionContextStreaming": "Streaming", + "OptionContextStatic": "Sync" +} \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj b/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj index 5cc22ac64..214d4c6c7 100644 --- a/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj +++ b/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj @@ -371,6 +371,9 @@ + + + -- cgit v1.2.3