sync updates

This commit is contained in:
Luke Pulverenti 2014-12-30 11:36:49 -05:00
parent 8a9f16ff6a
commit 048b6a7fbd
72 changed files with 389 additions and 150 deletions

View file

@ -467,7 +467,7 @@ namespace MediaBrowser.Api.Library
var auth = _authContext.GetAuthorizationInfo(Request);
var user = _userManager.GetUserById(auth.UserId);
if (item is Playlist)
if (item is Playlist || item is BoxSet)
{
// For now this is allowed if user can see the playlist
}

View file

@ -1,6 +1,7 @@
using MediaBrowser.Common.Extensions;
using MediaBrowser.Common.Net;
using MediaBrowser.Controller.Configuration;
using MediaBrowser.Controller.Devices;
using MediaBrowser.Controller.Dto;
using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.Net;
@ -216,16 +217,18 @@ namespace MediaBrowser.Api
private readonly ISessionManager _sessionMananger;
private readonly IServerConfigurationManager _config;
private readonly INetworkManager _networkManager;
private readonly IDeviceManager _deviceManager;
public IAuthorizationContext AuthorizationContext { get; set; }
public UserService(IUserManager userManager, IDtoService dtoService, ISessionManager sessionMananger, IServerConfigurationManager config, INetworkManager networkManager)
public UserService(IUserManager userManager, IDtoService dtoService, ISessionManager sessionMananger, IServerConfigurationManager config, INetworkManager networkManager, IDeviceManager deviceManager)
{
_userManager = userManager;
_dtoService = dtoService;
_sessionMananger = sessionMananger;
_config = config;
_networkManager = networkManager;
_deviceManager = deviceManager;
}
public object Get(GetPublicUsers request)
@ -239,18 +242,12 @@ namespace MediaBrowser.Api
});
}
// TODO: Uncomment once clients can handle an empty user list (and below)
//if (Request.IsLocal || IsInLocalNetwork(Request.RemoteIp))
return Get(new GetUsers
{
return Get(new GetUsers
{
IsHidden = false,
IsDisabled = false
});
}
IsHidden = false,
IsDisabled = false
//// Return empty when external
//return ToOptimizedResult(new List<UserDto>());
}, true);
}
/// <summary>
@ -259,6 +256,11 @@ namespace MediaBrowser.Api
/// <param name="request">The request.</param>
/// <returns>System.Object.</returns>
public object Get(GetUsers request)
{
return Get(request, false);
}
private object Get(GetUsers request, bool filterByDevice)
{
var users = _userManager.Users;
@ -274,10 +276,19 @@ namespace MediaBrowser.Api
if (request.IsGuest.HasValue)
{
users = users.Where(i => (i.ConnectLinkType.HasValue && i.ConnectLinkType.Value == UserLinkType.Guest) == request.IsGuest.Value);
}
if (filterByDevice)
{
var deviceId = AuthorizationContext.GetAuthorizationInfo(Request).DeviceId;
if (!string.IsNullOrWhiteSpace(deviceId))
{
users = users.Where(i => _deviceManager.CanAccessDevice(i.Id.ToString("N"), deviceId));
}
}
var result = users
.OrderBy(u => u.Name)
.Select(i => _userManager.GetUserDto(i, Request.RemoteIp))

View file

@ -466,7 +466,7 @@ namespace MediaBrowser.Common.Implementations
RegisterSingleInstance(FileSystemManager);
HttpClient = new HttpClientManager.HttpClientManager(ApplicationPaths, Logger, FileSystemManager, ConfigurationManager);
HttpClient = new HttpClientManager.HttpClientManager(ApplicationPaths, Logger, FileSystemManager);
RegisterSingleInstance(HttpClient);
NetworkManager = CreateNetworkManager(LogManager.GetLogger("NetworkManager"));

View file

@ -41,7 +41,6 @@ namespace MediaBrowser.Common.Implementations.HttpClientManager
private readonly IApplicationPaths _appPaths;
private readonly IFileSystem _fileSystem;
private readonly IConfigurationManager _config;
/// <summary>
/// Initializes a new instance of the <see cref="HttpClientManager" /> class.
@ -52,7 +51,7 @@ namespace MediaBrowser.Common.Implementations.HttpClientManager
/// <exception cref="System.ArgumentNullException">appPaths
/// or
/// logger</exception>
public HttpClientManager(IApplicationPaths appPaths, ILogger logger, IFileSystem fileSystem, IConfigurationManager config)
public HttpClientManager(IApplicationPaths appPaths, ILogger logger, IFileSystem fileSystem)
{
if (appPaths == null)
{
@ -65,7 +64,6 @@ namespace MediaBrowser.Common.Implementations.HttpClientManager
_logger = logger;
_fileSystem = fileSystem;
_config = config;
_appPaths = appPaths;
// http://stackoverflow.com/questions/566437/http-post-returns-the-error-417-expectation-failed-c

View file

@ -62,6 +62,7 @@ namespace MediaBrowser.Model.Sync
{
List<SyncOptions> options = new List<SyncOptions>();
options.Add(SyncOptions.Name);
options.Add(SyncOptions.Quality);
options.Add(SyncOptions.UnwatchedOnly);
options.Add(SyncOptions.SyncNewContent);

View file

@ -28,10 +28,5 @@ namespace MediaBrowser.Model.Sync
/// </summary>
/// <value>The status.</value>
public SyncJobItemStatus? Status { get; set; }
/// <summary>
/// Gets or sets a value indicating whether this instance is completed.
/// </summary>
/// <value><c>null</c> if [is completed] contains no value, <c>true</c> if [is completed]; otherwise, <c>false</c>.</value>
public bool? IsCompleted { get; set; }
}
}

View file

@ -6,7 +6,8 @@ namespace MediaBrowser.Model.Sync
Queued = 0,
Converting = 1,
Transferring = 2,
Completed = 3,
Failed = 4
Synced = 3,
Failed = 4,
RemovedFromDevice = 5
}
}

View file

@ -6,7 +6,6 @@ using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using WebSocketSharp.Net;
@ -15,7 +14,6 @@ namespace MediaBrowser.Server.Implementations.HttpServer.SocketSharp
public class WebSocketSharpListener : IHttpListener
{
private HttpListener _listener;
private readonly ManualResetEventSlim _listenForNextRequest = new ManualResetEventSlim(false);
private readonly ILogger _logger;
private readonly Action<string> _endpointListener;
@ -43,70 +41,13 @@ namespace MediaBrowser.Server.Implementations.HttpServer.SocketSharp
_listener.Prefixes.Add(prefix);
}
_listener.OnContext = ProcessContext;
_listener.Start();
Task.Factory.StartNew(Listen, TaskCreationOptions.LongRunning);
}
private bool IsListening
private void ProcessContext(HttpListenerContext context)
{
get { return _listener != null && _listener.IsListening; }
}
// Loop here to begin processing of new requests.
private void Listen()
{
while (IsListening)
{
if (_listener == null) return;
_listenForNextRequest.Reset();
try
{
_listener.BeginGetContext(ListenerCallback, _listener);
_listenForNextRequest.Wait();
}
catch (Exception ex)
{
_logger.Error("Listen()", ex);
return;
}
if (_listener == null) return;
}
}
// Handle the processing of a request in here.
private void ListenerCallback(IAsyncResult asyncResult)
{
_listenForNextRequest.Set();
var listener = asyncResult.AsyncState as HttpListener;
HttpListenerContext context;
if (listener == null) return;
var isListening = listener.IsListening;
try
{
if (!isListening)
{
_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.
context = listener.EndGetContext(asyncResult);
}
catch (Exception ex)
{
// You will get an exception when httpListener.Stop() is called
// because there will be a thread stopped waiting on the .EndGetContext()
// method, and again, that is just the way most Begin/End asynchronous
// methods of the .NET Framework work.
var errMsg = ex + ": " + IsListening;
_logger.Warn(errMsg);
return;
}
Task.Factory.StartNew(() => InitTask(context));
}
@ -117,10 +58,10 @@ namespace MediaBrowser.Server.Implementations.HttpServer.SocketSharp
var task = this.ProcessRequestAsync(context);
task.ContinueWith(x => HandleError(x.Exception, context), TaskContinuationOptions.OnlyOnFaulted | TaskContinuationOptions.AttachedToParent);
if (task.Status == TaskStatus.Created)
{
task.RunSynchronously();
}
//if (task.Status == TaskStatus.Created)
//{
// task.RunSynchronously();
//}
}
catch (Exception ex)
{

View file

@ -41,6 +41,10 @@
"LabelCancelled": "(cancelled)",
"LabelFailed": "(failed)",
"ButtonHelp": "Help",
"HeaderLibraryAccess": "Library Access",
"HeaderChannelAccess": "Channel Access",
"HeaderDeviceAccess": "Device Access",
"HeaderSelectDevices": "Select Devices",
"LabelAbortedByServerShutdown": "(Aborted by server shutdown)",
"LabelScheduledTaskLastRan": "Last ran {0}, taking {1}.",
"HeaderDeleteTaskTrigger": "Delete Task Trigger",

View file

@ -41,6 +41,10 @@
"LabelCancelled": "(cancelled)",
"LabelFailed": "(failed)",
"ButtonHelp": "Help",
"HeaderLibraryAccess": "Library Access",
"HeaderChannelAccess": "Channel Access",
"HeaderDeviceAccess": "Device Access",
"HeaderSelectDevices": "Select Devices",
"LabelAbortedByServerShutdown": "(Aborted by server shutdown)",
"LabelScheduledTaskLastRan": "Last ran {0}, taking {1}.",
"HeaderDeleteTaskTrigger": "Delete Task Trigger",

View file

@ -41,6 +41,10 @@
"LabelCancelled": "(zru\u0161eno)",
"LabelFailed": "(failed)",
"ButtonHelp": "Help",
"HeaderLibraryAccess": "Library Access",
"HeaderChannelAccess": "Channel Access",
"HeaderDeviceAccess": "Device Access",
"HeaderSelectDevices": "Select Devices",
"LabelAbortedByServerShutdown": "(Aborted by server shutdown)",
"LabelScheduledTaskLastRan": "Last ran {0}, taking {1}.",
"HeaderDeleteTaskTrigger": "Delete Task Trigger",

View file

@ -41,6 +41,10 @@
"LabelCancelled": "(cancelled)",
"LabelFailed": "(failed)",
"ButtonHelp": "Help",
"HeaderLibraryAccess": "Library Access",
"HeaderChannelAccess": "Channel Access",
"HeaderDeviceAccess": "Device Access",
"HeaderSelectDevices": "Select Devices",
"LabelAbortedByServerShutdown": "(Aborted by server shutdown)",
"LabelScheduledTaskLastRan": "Last ran {0}, taking {1}.",
"HeaderDeleteTaskTrigger": "Delete Task Trigger",

View file

@ -41,6 +41,10 @@
"LabelCancelled": "(abgebrochen)",
"LabelFailed": "(fehlgeschlagen)",
"ButtonHelp": "Help",
"HeaderLibraryAccess": "Bibliothekszugriff",
"HeaderChannelAccess": "Channelzugriff",
"HeaderDeviceAccess": "Device Access",
"HeaderSelectDevices": "Select Devices",
"LabelAbortedByServerShutdown": "(Durch herunterfahrenden Server abgebrochen)",
"LabelScheduledTaskLastRan": "Zuletzt ausgef\u00fchrt vor: {0}. Ben\u00f6tigte Zeit: {1}.",
"HeaderDeleteTaskTrigger": "Entferne Aufgabenausl\u00f6ser",

View file

@ -41,6 +41,10 @@
"LabelCancelled": "(cancelled)",
"LabelFailed": "(failed)",
"ButtonHelp": "Help",
"HeaderLibraryAccess": "Library Access",
"HeaderChannelAccess": "Channel Access",
"HeaderDeviceAccess": "Device Access",
"HeaderSelectDevices": "Select Devices",
"LabelAbortedByServerShutdown": "(Aborted by server shutdown)",
"LabelScheduledTaskLastRan": "Last ran {0}, taking {1}.",
"HeaderDeleteTaskTrigger": "Delete Task Trigger",

View file

@ -41,6 +41,10 @@
"LabelCancelled": "(cancelled)",
"LabelFailed": "(failed)",
"ButtonHelp": "Help",
"HeaderLibraryAccess": "Library Access",
"HeaderChannelAccess": "Channel Access",
"HeaderDeviceAccess": "Device Access",
"HeaderSelectDevices": "Select Devices",
"LabelAbortedByServerShutdown": "(Aborted by server shutdown)",
"LabelScheduledTaskLastRan": "Last ran {0}, taking {1}.",
"HeaderDeleteTaskTrigger": "Delete Task Trigger",

View file

@ -41,6 +41,10 @@
"LabelCancelled": "(cancelled)",
"LabelFailed": "(failed)",
"ButtonHelp": "Help",
"HeaderLibraryAccess": "Library Access",
"HeaderChannelAccess": "Channel Access",
"HeaderDeviceAccess": "Device Access",
"HeaderSelectDevices": "Select Devices",
"LabelAbortedByServerShutdown": "(Aborted by server shutdown)",
"LabelScheduledTaskLastRan": "Last ran {0}, taking {1}.",
"HeaderDeleteTaskTrigger": "Delete Task Trigger",

View file

@ -41,6 +41,10 @@
"LabelCancelled": "(cancelado)",
"LabelFailed": "(failed)",
"ButtonHelp": "Help",
"HeaderLibraryAccess": "Library Access",
"HeaderChannelAccess": "Channel Access",
"HeaderDeviceAccess": "Device Access",
"HeaderSelectDevices": "Select Devices",
"LabelAbortedByServerShutdown": "(Abortado por cierre del servidor)",
"LabelScheduledTaskLastRan": "\u00daltima ejecuci\u00f3n {0}, teniendo {1}.",
"HeaderDeleteTaskTrigger": "Eliminar tarea de activaci\u00f3n",

View file

@ -41,6 +41,10 @@
"LabelCancelled": "(cancelado)",
"LabelFailed": "(Fallido)",
"ButtonHelp": "Ayuda",
"HeaderLibraryAccess": "Acceso a la Biblioteca",
"HeaderChannelAccess": "Acceso a los Canales",
"HeaderDeviceAccess": "Device Access",
"HeaderSelectDevices": "Select Devices",
"LabelAbortedByServerShutdown": "(Abortada por apagado del servidor)",
"LabelScheduledTaskLastRan": "Ejecutado hace {0}, tomando {1}.",
"HeaderDeleteTaskTrigger": "Borrar Disparador de Tarea",

View file

@ -41,6 +41,10 @@
"LabelCancelled": "(cancelled)",
"LabelFailed": "(failed)",
"ButtonHelp": "Help",
"HeaderLibraryAccess": "Library Access",
"HeaderChannelAccess": "Channel Access",
"HeaderDeviceAccess": "Device Access",
"HeaderSelectDevices": "Select Devices",
"LabelAbortedByServerShutdown": "(Aborted by server shutdown)",
"LabelScheduledTaskLastRan": "Last ran {0}, taking {1}.",
"HeaderDeleteTaskTrigger": "Delete Task Trigger",

View file

@ -41,6 +41,10 @@
"LabelCancelled": "(annul\u00e9)",
"LabelFailed": "(\u00e9chou\u00e9)",
"ButtonHelp": "Aide",
"HeaderLibraryAccess": "Acc\u00e8s \u00e0 la librairie",
"HeaderChannelAccess": "Acc\u00e8s Cha\u00eene",
"HeaderDeviceAccess": "Acc\u00e8s \u00e0 l'appareil",
"HeaderSelectDevices": "S\u00e9lectionnez un appareil",
"LabelAbortedByServerShutdown": "(Annul\u00e9 par fermeture du serveur)",
"LabelScheduledTaskLastRan": "Derni\u00e8re ex\u00e9cution {0}, dur\u00e9e {1}.",
"HeaderDeleteTaskTrigger": "Supprimer le d\u00e9clencheur de t\u00e2che",

View file

@ -41,6 +41,10 @@
"LabelCancelled": "(cancelled)",
"LabelFailed": "(failed)",
"ButtonHelp": "Help",
"HeaderLibraryAccess": "Library Access",
"HeaderChannelAccess": "Channel Access",
"HeaderDeviceAccess": "Device Access",
"HeaderSelectDevices": "Select Devices",
"LabelAbortedByServerShutdown": "(Aborted by server shutdown)",
"LabelScheduledTaskLastRan": "Last ran {0}, taking {1}.",
"HeaderDeleteTaskTrigger": "Delete Task Trigger",

View file

@ -41,6 +41,10 @@
"LabelCancelled": "(cancelled)",
"LabelFailed": "(failed)",
"ButtonHelp": "Help",
"HeaderLibraryAccess": "Library Access",
"HeaderChannelAccess": "Channel Access",
"HeaderDeviceAccess": "Device Access",
"HeaderSelectDevices": "Select Devices",
"LabelAbortedByServerShutdown": "(Aborted by server shutdown)",
"LabelScheduledTaskLastRan": "Last ran {0}, taking {1}.",
"HeaderDeleteTaskTrigger": "Delete Task Trigger",

View file

@ -41,6 +41,10 @@
"LabelCancelled": "(cancellato)",
"LabelFailed": "(fallito)",
"ButtonHelp": "Help",
"HeaderLibraryAccess": "Accesso libreria",
"HeaderChannelAccess": "Accesso canali",
"HeaderDeviceAccess": "Device Access",
"HeaderSelectDevices": "Select Devices",
"LabelAbortedByServerShutdown": "(Interrotto dalla chiusura del server)",
"LabelScheduledTaskLastRan": "Ultima esecuzione {0}, taking {1}.",
"HeaderDeleteTaskTrigger": "Elimina Operazione pianificata",

View file

@ -422,7 +422,7 @@
"ButtonChangeType": "Change type",
"ButtonRemove": "Remove",
"HeaderMediaLocations": "Media Locations",
"LabelFolderTypeValue": "Folder type: {0}",
"LabelContentTypeValue": "Content type: {0}",
"LabelPathSubstitutionHelp": "Optional: Path substitution can map server paths to network shares that clients can access for direct playback.",
"FolderTypeUnset": "Unset (mixed content)",
"FolderTypeMovies": "Movies",

View file

@ -41,6 +41,10 @@
"LabelCancelled": "(\u0431\u043e\u043b\u0434\u044b\u0440\u044b\u043b\u043c\u0430\u0434\u044b)",
"LabelFailed": "(\u0441\u04d9\u0442\u0441\u0456\u0437)",
"ButtonHelp": "\u0410\u043d\u044b\u049b\u0442\u0430\u043c\u0430",
"HeaderLibraryAccess": "\u0422\u0430\u0441\u0443\u0448\u044b\u0445\u0430\u043d\u0430\u0493\u0430 \u049b\u0430\u0442\u044b\u043d\u0430\u0441\u0443",
"HeaderChannelAccess": "\u0410\u0440\u043d\u0430\u0493\u0430 \u049b\u0430\u0442\u044b\u043d\u0430\u0441\u0443",
"HeaderDeviceAccess": "Device Access",
"HeaderSelectDevices": "Select Devices",
"LabelAbortedByServerShutdown": "(\u0421\u0435\u0440\u0432\u0435\u0440 \u0436\u04b1\u043c\u044b\u0441\u044b \u0430\u044f\u049b\u0442\u0430\u043b\u0443\u044b\u043d\u0430 \u0431\u0430\u0439\u043b\u0430\u043d\u044b\u0441\u0442\u044b \u04af\u0437\u0456\u043b\u0434\u0456)",
"LabelScheduledTaskLastRan": "\u0421\u043e\u04a3\u0493\u044b \u0456\u0441\u043a\u0435 \u049b\u043e\u0441\u044b\u043b\u0493\u0430\u043d\u044b {0}, {1} \u0443\u0430\u049b\u044b\u0442 \u0430\u043b\u0434\u044b.",
"HeaderDeleteTaskTrigger": "\u0422\u0430\u043f\u0441\u044b\u0440\u043c\u0430 \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u0456\u043d \u0436\u043e\u044e",

View file

@ -41,6 +41,10 @@
"LabelCancelled": "(cancelled)",
"LabelFailed": "(failed)",
"ButtonHelp": "Help",
"HeaderLibraryAccess": "Library Access",
"HeaderChannelAccess": "Channel Access",
"HeaderDeviceAccess": "Device Access",
"HeaderSelectDevices": "Select Devices",
"LabelAbortedByServerShutdown": "(Aborted by server shutdown)",
"LabelScheduledTaskLastRan": "Last ran {0}, taking {1}.",
"HeaderDeleteTaskTrigger": "Delete Task Trigger",

View file

@ -41,6 +41,10 @@
"LabelCancelled": "(kansellert)",
"LabelFailed": "(Feilet)",
"ButtonHelp": "Help",
"HeaderLibraryAccess": "Bibliotek tilgang",
"HeaderChannelAccess": "Kanal tilgang",
"HeaderDeviceAccess": "Device Access",
"HeaderSelectDevices": "Select Devices",
"LabelAbortedByServerShutdown": "(Avbrutt av server shutdown)",
"LabelScheduledTaskLastRan": "Sist kj\u00f8rt {0}, tar {1}.",
"HeaderDeleteTaskTrigger": "Slett Oppgave Trigger",

View file

@ -41,6 +41,10 @@
"LabelCancelled": "(Geannuleerd)",
"LabelFailed": "(mislukt)",
"ButtonHelp": "Help",
"HeaderLibraryAccess": "Bibliotheek toegang",
"HeaderChannelAccess": "Kanaal toegang",
"HeaderDeviceAccess": "Device Access",
"HeaderSelectDevices": "Select Devices",
"LabelAbortedByServerShutdown": "(Afgebroken door afsluiten van de server)",
"LabelScheduledTaskLastRan": "Laatste keer {0}, duur {1}.",
"HeaderDeleteTaskTrigger": "Verwijderen Taak Trigger",

View file

@ -41,6 +41,10 @@
"LabelCancelled": "(cancelled)",
"LabelFailed": "(failed)",
"ButtonHelp": "Help",
"HeaderLibraryAccess": "Library Access",
"HeaderChannelAccess": "Channel Access",
"HeaderDeviceAccess": "Device Access",
"HeaderSelectDevices": "Select Devices",
"LabelAbortedByServerShutdown": "(Aborted by server shutdown)",
"LabelScheduledTaskLastRan": "Last ran {0}, taking {1}.",
"HeaderDeleteTaskTrigger": "Delete Task Trigger",

View file

@ -41,6 +41,10 @@
"LabelCancelled": "(cancelado)",
"LabelFailed": "(falhou)",
"ButtonHelp": "Ajuda",
"HeaderLibraryAccess": "Acesso \u00e0 Biblioteca",
"HeaderChannelAccess": "Acesso ao Canal",
"HeaderDeviceAccess": "Device Access",
"HeaderSelectDevices": "Select Devices",
"LabelAbortedByServerShutdown": "(Abortada pelo desligamento do servidor)",
"LabelScheduledTaskLastRan": "\u00daltima execu\u00e7\u00e3o {0}, demorando {1}.",
"HeaderDeleteTaskTrigger": "Excluir Disparador da Tarefa",
@ -413,7 +417,7 @@
"HeaderMediaLocations": "Localiza\u00e7\u00f5es de M\u00eddia",
"LabelFolderTypeValue": "Tipo de pasta: {0}",
"LabelPathSubstitutionHelp": "Opcional: Substitui\u00e7\u00e3o de caminho pode mapear caminhos do servidor para compartilhamentos de rede de forma a que os clientes possam acessar para reprodu\u00e7\u00e3o direta.",
"FolderTypeUnset": "Unset (mixed content)",
"FolderTypeUnset": "Indefinida (conte\u00fado misto)",
"FolderTypeMovies": "Filmes",
"FolderTypeMusic": "M\u00fasica",
"FolderTypeAdultVideos": "V\u00eddeos adultos",
@ -652,5 +656,5 @@
"LabelItemLimitHelp": "Opcional. Defina o n\u00famero limite de itens que ser\u00e3o sincronizados.",
"MessageBookPluginRequired": "Requer a instala\u00e7\u00e3o do plugin Bookshelf",
"MessageGamePluginRequired": "Requer a instala\u00e7\u00e3o do plugin GameBrowser",
"MessageUnsetContentHelp": "Content will be displayed as plain folders. For best results use the metadata manager to set the content types of sub-folders."
"MessageUnsetContentHelp": "O conte\u00fado ser\u00e1 exibido em pastas simples. Para melhor resultado, use o gerenciador de metadados para definir os tipos de conte\u00fado das sub-pastas."
}

View file

@ -41,6 +41,10 @@
"LabelCancelled": "(cancelled)",
"LabelFailed": "(falhou)",
"ButtonHelp": "Help",
"HeaderLibraryAccess": "Library Access",
"HeaderChannelAccess": "Channel Access",
"HeaderDeviceAccess": "Device Access",
"HeaderSelectDevices": "Select Devices",
"LabelAbortedByServerShutdown": "(Aborted by server shutdown)",
"LabelScheduledTaskLastRan": "Last ran {0}, taking {1}.",
"HeaderDeleteTaskTrigger": "Delete Task Trigger",

View file

@ -41,6 +41,10 @@
"LabelCancelled": "(\u043e\u0442\u043c\u0435\u043d\u0435\u043d\u043e)",
"LabelFailed": "(\u043d\u0435\u0443\u0434\u0430\u0447\u043d\u043e)",
"ButtonHelp": "\u0421\u043f\u0440\u0430\u0432\u043a\u0430",
"HeaderLibraryAccess": "\u0414\u043e\u0441\u0442\u0443\u043f \u043a \u043c\u0435\u0434\u0438\u0430\u0442\u0435\u043a\u0435",
"HeaderChannelAccess": "\u0414\u043e\u0441\u0442\u0443\u043f \u043a \u043a\u0430\u043d\u0430\u043b\u0430\u043c",
"HeaderDeviceAccess": "Device Access",
"HeaderSelectDevices": "Select Devices",
"LabelAbortedByServerShutdown": "(\u041f\u0440\u0435\u0440\u0432\u0430\u043d\u043e \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u0430)",
"LabelScheduledTaskLastRan": "\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u043b\u0430\u0441\u044c {0}, \u0437\u0430\u043d\u044f\u043b\u0430 {1}.",
"HeaderDeleteTaskTrigger": "\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u0430 \u0437\u0430\u0434\u0430\u0447\u0438",
@ -413,7 +417,7 @@
"HeaderMediaLocations": "\u0420\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043c\u0435\u0434\u0438\u0430\u0434\u0430\u043d\u043d\u044b\u0445",
"LabelFolderTypeValue": "\u0422\u0438\u043f \u043f\u0430\u043f\u043a\u0438: {0}",
"LabelPathSubstitutionHelp": "\u041d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e: \u041f\u043e\u0434\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u043f\u0443\u0442\u0435\u0439 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u0440\u0432\u0435\u0440\u043d\u044b\u0445 \u043f\u0443\u0442\u0435\u0439 \u0441\u043e \u0441\u0435\u0442\u0435\u0432\u044b\u043c\u0438 \u043e\u0431\u0449\u0438\u043c\u0438 \u0440\u0435\u0441\u0443\u0440\u0441\u0430\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u043a\u043b\u0438\u0435\u043d\u0442\u0430\u043c \u0434\u043b\u044f \u043f\u0440\u044f\u043c\u043e\u0433\u043e \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f.",
"FolderTypeUnset": "Unset (mixed content)",
"FolderTypeUnset": "\u041d\u0435\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u043d\u044b\u0439 (\u0440\u0430\u0437\u043d\u043e\u0442\u0438\u043f\u043d\u043e\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435)",
"FolderTypeMovies": "\u0424\u0438\u043b\u044c\u043c\u044b",
"FolderTypeMusic": "\u041c\u0443\u0437\u044b\u043a\u0430",
"FolderTypeAdultVideos": "\u0412\u0437\u0440\u043e\u0441\u043b\u044b\u0435 \u0432\u0438\u0434\u0435\u043e",
@ -652,5 +656,5 @@
"LabelItemLimitHelp": "\u041d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e. \u0417\u0430\u0434\u0430\u0442\u044c \u043f\u0440\u0435\u0434\u0435\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f.",
"MessageBookPluginRequired": "\u0422\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u043f\u043b\u0430\u0433\u0438\u043d\u0430 Bookshelf",
"MessageGamePluginRequired": "\u0422\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u043f\u043b\u0430\u0433\u0438\u043d\u0430 GameBrowser",
"MessageUnsetContentHelp": "Content will be displayed as plain folders. For best results use the metadata manager to set the content types of sub-folders."
"MessageUnsetContentHelp": "\u0421\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u044b\u0435 \u043f\u0430\u043f\u043a\u0438. \u0414\u043b\u044f \u043d\u0430\u0438\u043b\u0443\u0447\u0448\u0438\u0445 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u0434\u0438\u0441\u043f\u0435\u0442\u0447\u0435\u0440 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445, \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0437\u043d\u0430\u0447\u0430\u0442\u044c \u0442\u0438\u043f \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u044f \u043f\u043e\u0434\u043f\u0430\u043f\u043e\u043a."
}

View file

@ -41,6 +41,10 @@
"LabelCancelled": "(avbr\u00f6ts)",
"LabelFailed": "(misslyckades)",
"ButtonHelp": "Help",
"HeaderLibraryAccess": "Library Access",
"HeaderChannelAccess": "Channel Access",
"HeaderDeviceAccess": "Device Access",
"HeaderSelectDevices": "Select Devices",
"LabelAbortedByServerShutdown": "(avbr\u00f6ts eftersom servern st\u00e4ngdes av)",
"LabelScheduledTaskLastRan": "Senast k\u00f6rd {0}, tog {1}",
"HeaderDeleteTaskTrigger": "Ta bort aktivitetsutl\u00f6sare",

View file

@ -41,6 +41,10 @@
"LabelCancelled": "(cancelled)",
"LabelFailed": "(failed)",
"ButtonHelp": "Help",
"HeaderLibraryAccess": "Library Access",
"HeaderChannelAccess": "Channel Access",
"HeaderDeviceAccess": "Device Access",
"HeaderSelectDevices": "Select Devices",
"LabelAbortedByServerShutdown": "(Aborted by server shutdown)",
"LabelScheduledTaskLastRan": "Last ran {0}, taking {1}.",
"HeaderDeleteTaskTrigger": "Delete Task Trigger",

View file

@ -41,6 +41,10 @@
"LabelCancelled": "(cancelled)",
"LabelFailed": "(failed)",
"ButtonHelp": "Help",
"HeaderLibraryAccess": "Library Access",
"HeaderChannelAccess": "Channel Access",
"HeaderDeviceAccess": "Device Access",
"HeaderSelectDevices": "Select Devices",
"LabelAbortedByServerShutdown": "(Aborted by server shutdown)",
"LabelScheduledTaskLastRan": "Last ran {0}, taking {1}.",
"HeaderDeleteTaskTrigger": "Delete Task Trigger",

View file

@ -41,6 +41,10 @@
"LabelCancelled": "(\u5df2\u53d6\u6d88)",
"LabelFailed": "(\u5931\u8d25)",
"ButtonHelp": "Help",
"HeaderLibraryAccess": "Library Access",
"HeaderChannelAccess": "Channel Access",
"HeaderDeviceAccess": "Device Access",
"HeaderSelectDevices": "Select Devices",
"LabelAbortedByServerShutdown": "(\u56e0\u4e3a\u670d\u52a1\u5668\u5173\u95ed\u88ab\u4e2d\u6b62)",
"LabelScheduledTaskLastRan": "\u6700\u540e\u8fd0\u884c {0}, \u82b1\u8d39\u65f6\u95f4 {1}.",
"HeaderDeleteTaskTrigger": "\u5220\u9664\u4efb\u52a1\u89e6\u53d1\u6761\u4ef6",

View file

@ -41,6 +41,10 @@
"LabelCancelled": "(cancelled)",
"LabelFailed": "(failed)",
"ButtonHelp": "Help",
"HeaderLibraryAccess": "Library Access",
"HeaderChannelAccess": "Channel Access",
"HeaderDeviceAccess": "Device Access",
"HeaderSelectDevices": "Select Devices",
"LabelAbortedByServerShutdown": "(Aborted by server shutdown)",
"LabelScheduledTaskLastRan": "Last ran {0}, taking {1}.",
"HeaderDeleteTaskTrigger": "Delete Task Trigger",

View file

@ -63,12 +63,16 @@
"TabPreferences": "\u062a\u0641\u0636\u064a\u0644\u0627\u062a",
"TabPassword": "\u0643\u0644\u0645\u0629 \u0627\u0644\u0633\u0631",
"TabLibraryAccess": "\u0627\u0644\u062f\u062e\u0648\u0644 \u0627\u0644\u0649 \u0627\u0644\u0645\u0643\u062a\u0628\u0629",
"TabAccess": "Access",
"TabImage": "\u0635\u0648\u0631\u0629",
"TabProfile": "\u0633\u062c\u0644",
"TabMetadata": "Metadata",
"TabImages": "Images",
"TabNotifications": "Notifications",
"TabCollectionTitles": "Titles",
"HeaderDeviceAccess": "Device Access",
"OptionEnableAccessFromAllDevices": "Enable access from all devices",
"DeviceAccessHelp": "This only applies to devices that can be uniquely identified and will not prevent browser access. Filtering user device access will prevent them from using new devices until they've been approved here.",
"LabelDisplayMissingEpisodesWithinSeasons": "Display missing episodes within seasons",
"LabelUnairedMissingEpisodesWithinSeasons": "Display unaired episodes within seasons",
"HeaderVideoPlaybackSettings": "\u0627\u0639\u062f\u0627\u062f\u0627\u062a \u062a\u0634\u063a\u064a\u0644 \u0627\u0644\u0641\u064a\u062f\u064a\u0648",

View file

@ -63,12 +63,16 @@
"TabPreferences": "Preferences",
"TabPassword": "Password",
"TabLibraryAccess": "Library Access",
"TabAccess": "Access",
"TabImage": "Image",
"TabProfile": "Profile",
"TabMetadata": "Metadata",
"TabImages": "Images",
"TabNotifications": "Notifications",
"TabCollectionTitles": "Titles",
"HeaderDeviceAccess": "Device Access",
"OptionEnableAccessFromAllDevices": "Enable access from all devices",
"DeviceAccessHelp": "This only applies to devices that can be uniquely identified and will not prevent browser access. Filtering user device access will prevent them from using new devices until they've been approved here.",
"LabelDisplayMissingEpisodesWithinSeasons": "Display missing episodes within seasons",
"LabelUnairedMissingEpisodesWithinSeasons": "Display unaired episodes within seasons",
"HeaderVideoPlaybackSettings": "Video Playback Settings",

View file

@ -63,12 +63,16 @@
"TabPreferences": "P\u0159edvolby",
"TabPassword": "Heslo",
"TabLibraryAccess": "P\u0159\u00edstup ke knihovn\u011b",
"TabAccess": "Access",
"TabImage": "Obr\u00e1zek",
"TabProfile": "Profil",
"TabMetadata": "Metadata",
"TabImages": "Obr\u00e1zky",
"TabNotifications": "Notifications",
"TabCollectionTitles": "N\u00e1zvy",
"HeaderDeviceAccess": "Device Access",
"OptionEnableAccessFromAllDevices": "Enable access from all devices",
"DeviceAccessHelp": "This only applies to devices that can be uniquely identified and will not prevent browser access. Filtering user device access will prevent them from using new devices until they've been approved here.",
"LabelDisplayMissingEpisodesWithinSeasons": "Zobrazit chyb\u011bj\u00edc\u00ed epizody",
"LabelUnairedMissingEpisodesWithinSeasons": "Zobrazit neprov\u011btran\u00e9 epizody v r\u00e1mci sez\u00f3n",
"HeaderVideoPlaybackSettings": "Nastaven\u00ed p\u0159ehr\u00e1v\u00e1n\u00ed videa",

View file

@ -63,12 +63,16 @@
"TabPreferences": "Indstillinger",
"TabPassword": "Kode",
"TabLibraryAccess": "Bibliotek adgang",
"TabAccess": "Access",
"TabImage": "Billede",
"TabProfile": "Profil",
"TabMetadata": "Metadata",
"TabImages": "Billeder",
"TabNotifications": "Notifications",
"TabCollectionTitles": "Titler",
"HeaderDeviceAccess": "Device Access",
"OptionEnableAccessFromAllDevices": "Enable access from all devices",
"DeviceAccessHelp": "This only applies to devices that can be uniquely identified and will not prevent browser access. Filtering user device access will prevent them from using new devices until they've been approved here.",
"LabelDisplayMissingEpisodesWithinSeasons": "Vis manglende episoder i s\u00e6soner",
"LabelUnairedMissingEpisodesWithinSeasons": "Vis endnu ikke sendte episoder i s\u00e6soner",
"HeaderVideoPlaybackSettings": "Video afspilnings indstillinger",

View file

@ -63,12 +63,16 @@
"TabPreferences": "Einstellungen",
"TabPassword": "Passwort",
"TabLibraryAccess": "Bibliothekenzugriff",
"TabAccess": "Access",
"TabImage": "Bild",
"TabProfile": "Profil",
"TabMetadata": "Metadata",
"TabImages": "Bilder",
"TabNotifications": "Benachrichtigungen",
"TabCollectionTitles": "Titel",
"HeaderDeviceAccess": "Device Access",
"OptionEnableAccessFromAllDevices": "Enable access from all devices",
"DeviceAccessHelp": "This only applies to devices that can be uniquely identified and will not prevent browser access. Filtering user device access will prevent them from using new devices until they've been approved here.",
"LabelDisplayMissingEpisodesWithinSeasons": "Zeige fehlende Episoden innerhalb von Staffeln",
"LabelUnairedMissingEpisodesWithinSeasons": "Zeige noch nicht ausgestahlte Episoden innerhalb von Staffeln",
"HeaderVideoPlaybackSettings": "Videowiedergabe Einstellungen",

View file

@ -63,12 +63,16 @@
"TabPreferences": "\u03a0\u03c1\u03bf\u03c4\u03b9\u03bc\u03ae\u03c3\u03b5\u03b9\u03c2 ",
"TabPassword": "\u03c4\u03bf\u03bd \u03ba\u03c9\u03b4\u03b9\u03ba\u03cc",
"TabLibraryAccess": "\u03a0\u03c1\u03cc\u03c3\u03b2\u03b1\u03c3\u03b7 \u03c3\u03c4\u03b7 \u03b2\u03b9\u03b2\u03bb\u03b9\u03bf\u03b8\u03ae\u03ba\u03b7",
"TabAccess": "Access",
"TabImage": "\u03b5\u03b9\u03ba\u03cc\u03bd\u03b1",
"TabProfile": "\u03c0\u03c1\u03bf\u03c6\u03af\u03bb ",
"TabMetadata": "Metadata",
"TabImages": "Images",
"TabNotifications": "Notifications",
"TabCollectionTitles": "Titles",
"HeaderDeviceAccess": "Device Access",
"OptionEnableAccessFromAllDevices": "Enable access from all devices",
"DeviceAccessHelp": "This only applies to devices that can be uniquely identified and will not prevent browser access. Filtering user device access will prevent them from using new devices until they've been approved here.",
"LabelDisplayMissingEpisodesWithinSeasons": "\u03b4\u03b5\u03af\u03c7\u03bd\u03bf\u03c5\u03bd \u03bb\u03b5\u03af\u03c0\u03b5\u03b9 \u03b5\u03c0\u03b5\u03b9\u03c3\u03cc\u03b4\u03b9\u03b1 \u03b5\u03bd\u03c4\u03cc\u03c2 \u03b5\u03c0\u03bf\u03c7\u03ad\u03c2",
"LabelUnairedMissingEpisodesWithinSeasons": "\u03b4\u03b5\u03af\u03c7\u03bd\u03bf\u03c5\u03bd unaired \u03b5\u03c0\u03b5\u03b9\u03c3\u03cc\u03b4\u03b9\u03b1 \u03b5\u03bd\u03c4\u03cc\u03c2 \u03b5\u03c0\u03bf\u03c7\u03ad\u03c2",
"HeaderVideoPlaybackSettings": "\u0391\u03bd\u03b1\u03c0\u03b1\u03c1\u03b1\u03b3\u03c9\u03b3\u03ae \u03b2\u03af\u03bd\u03c4\u03b5\u03bf \u03c1\u03c5\u03b8\u03bc\u03af\u03c3\u03b5\u03b9\u03c2.",

View file

@ -63,12 +63,16 @@
"TabPreferences": "Preferences",
"TabPassword": "Password",
"TabLibraryAccess": "Library Access",
"TabAccess": "Access",
"TabImage": "Image",
"TabProfile": "Profile",
"TabMetadata": "Metadata",
"TabImages": "Images",
"TabNotifications": "Notifications",
"TabCollectionTitles": "Titles",
"HeaderDeviceAccess": "Device Access",
"OptionEnableAccessFromAllDevices": "Enable access from all devices",
"DeviceAccessHelp": "This only applies to devices that can be uniquely identified and will not prevent browser access. Filtering user device access will prevent them from using new devices until they've been approved here.",
"LabelDisplayMissingEpisodesWithinSeasons": "Display missing episodes within seasons",
"LabelUnairedMissingEpisodesWithinSeasons": "Display unaired episodes within seasons",
"HeaderVideoPlaybackSettings": "Video Playback Settings",

View file

@ -63,12 +63,16 @@
"TabPreferences": "Preferences",
"TabPassword": "Password",
"TabLibraryAccess": "Library Access",
"TabAccess": "Access",
"TabImage": "Image",
"TabProfile": "Profile",
"TabMetadata": "Metadata",
"TabImages": "Images",
"TabNotifications": "Notifications",
"TabCollectionTitles": "Titles",
"HeaderDeviceAccess": "Device Access",
"OptionEnableAccessFromAllDevices": "Enable access from all devices",
"DeviceAccessHelp": "This only applies to devices that can be uniquely identified and will not prevent browser access. Filtering user device access will prevent them from using new devices until they've been approved here.",
"LabelDisplayMissingEpisodesWithinSeasons": "Display missing episodes within seasons",
"LabelUnairedMissingEpisodesWithinSeasons": "Display unaired episodes within seasons",
"HeaderVideoPlaybackSettings": "Video Playback Settings",

View file

@ -63,12 +63,16 @@
"TabPreferences": "Preferencias",
"TabPassword": "Contrase\u00f1a",
"TabLibraryAccess": "Acceso a biblioteca",
"TabAccess": "Access",
"TabImage": "imagen",
"TabProfile": "Perfil",
"TabMetadata": "Metadata",
"TabImages": "Im\u00e1genes",
"TabNotifications": "Notificaciones",
"TabCollectionTitles": "T\u00edtulos",
"HeaderDeviceAccess": "Device Access",
"OptionEnableAccessFromAllDevices": "Enable access from all devices",
"DeviceAccessHelp": "This only applies to devices that can be uniquely identified and will not prevent browser access. Filtering user device access will prevent them from using new devices until they've been approved here.",
"LabelDisplayMissingEpisodesWithinSeasons": "Mostar episodios no disponibles en temporadas",
"LabelUnairedMissingEpisodesWithinSeasons": "Mostrar episodios a\u00fan no emitidos en temporadas",
"HeaderVideoPlaybackSettings": "Ajustes de Reproducci\u00f3n de Video",

View file

@ -63,12 +63,16 @@
"TabPreferences": "Preferencias",
"TabPassword": "Contrase\u00f1a",
"TabLibraryAccess": "Acceso a biblioteca",
"TabAccess": "Access",
"TabImage": "Imagen",
"TabProfile": "Perf\u00edl",
"TabMetadata": "Metadatos",
"TabImages": "Im\u00e1genes",
"TabNotifications": "Notificaciones",
"TabCollectionTitles": "T\u00edtulos",
"HeaderDeviceAccess": "Device Access",
"OptionEnableAccessFromAllDevices": "Enable access from all devices",
"DeviceAccessHelp": "This only applies to devices that can be uniquely identified and will not prevent browser access. Filtering user device access will prevent them from using new devices until they've been approved here.",
"LabelDisplayMissingEpisodesWithinSeasons": "Mostar episodios no disponibles en las temporadas",
"LabelUnairedMissingEpisodesWithinSeasons": "Mostrar episodios a\u00fan no emitidos en las temporadas",
"HeaderVideoPlaybackSettings": "Ajustes de Reproducci\u00f3n de Video",

View file

@ -63,12 +63,16 @@
"TabPreferences": "Asetukset",
"TabPassword": "Salasana",
"TabLibraryAccess": "Kirjaston P\u00e4\u00e4sy",
"TabAccess": "Access",
"TabImage": "Kuva",
"TabProfile": "Profiili",
"TabMetadata": "Metadata",
"TabImages": "Images",
"TabNotifications": "Notifications",
"TabCollectionTitles": "Titles",
"HeaderDeviceAccess": "Device Access",
"OptionEnableAccessFromAllDevices": "Enable access from all devices",
"DeviceAccessHelp": "This only applies to devices that can be uniquely identified and will not prevent browser access. Filtering user device access will prevent them from using new devices until they've been approved here.",
"LabelDisplayMissingEpisodesWithinSeasons": "N\u00e4yt\u00e4 puuttuvat jaksot tuotantokausissa",
"LabelUnairedMissingEpisodesWithinSeasons": "N\u00e4yt\u00e4 julkaisemattomat jaksot tuotantokausissa",
"HeaderVideoPlaybackSettings": "Videon Toistamisen Asetukset",

View file

@ -63,12 +63,16 @@
"TabPreferences": "Pr\u00e9f\u00e9rences",
"TabPassword": "Mot de passe",
"TabLibraryAccess": "Acc\u00e8s aux biblioth\u00e8ques",
"TabAccess": "Acc\u00e8s",
"TabImage": "Image",
"TabProfile": "Profil",
"TabMetadata": "M\u00e9tadonn\u00e9es",
"TabImages": "Images",
"TabNotifications": "Notifications",
"TabCollectionTitles": "Titres",
"HeaderDeviceAccess": "Acc\u00e8s \u00e0 l'appareil",
"OptionEnableAccessFromAllDevices": "Autoriser l'acc\u00e8s \u00e0 tous les appareils",
"DeviceAccessHelp": "Ceci ne s'applique qu'aux appareils qui peuvent \u00eatre identifi\u00e9s de mani\u00e8re unique et qui n'emp\u00eachent pas l'acc\u00e8s au navigateur. Le filtrage de l'acc\u00e8s aux appareil par utilisateur emp\u00eachera l'utilisation de nouveaux appareils jusqu'\u00e0 ce qu'ils soient approuv\u00e9s ici.",
"LabelDisplayMissingEpisodesWithinSeasons": "Afficher les \u00e9pisodes manquants dans les saisons",
"LabelUnairedMissingEpisodesWithinSeasons": "Afficher les \u00e9pisodes non diffus\u00e9s dans les saisons",
"HeaderVideoPlaybackSettings": "Param\u00e8tres de lecture video",

View file

@ -63,12 +63,16 @@
"TabPreferences": "\u05d4\u05e2\u05d3\u05e4\u05d5\u05ea",
"TabPassword": "\u05e1\u05d9\u05e1\u05de\u05d0",
"TabLibraryAccess": "\u05d2\u05d9\u05e9\u05d4 \u05dc\u05ea\u05d9\u05e7\u05d9\u05d5\u05ea",
"TabAccess": "Access",
"TabImage": "\u05ea\u05de\u05d5\u05e0\u05d4",
"TabProfile": "\u05e4\u05e8\u05d5\u05e4\u05d9\u05dc",
"TabMetadata": "Metadata",
"TabImages": "\u05ea\u05de\u05d5\u05e0\u05d5\u05ea",
"TabNotifications": "\u05d4\u05ea\u05e8\u05d0\u05d5\u05ea",
"TabCollectionTitles": "\u05db\u05d5\u05ea\u05e8\u05d9\u05dd",
"HeaderDeviceAccess": "Device Access",
"OptionEnableAccessFromAllDevices": "Enable access from all devices",
"DeviceAccessHelp": "This only applies to devices that can be uniquely identified and will not prevent browser access. Filtering user device access will prevent them from using new devices until they've been approved here.",
"LabelDisplayMissingEpisodesWithinSeasons": "\u05d4\u05e6\u05d2 \u05e4\u05e8\u05e7\u05d9\u05dd \u05d7\u05e1\u05e8\u05d9\u05dd \u05d1\u05ea\u05d5\u05da \u05d4\u05e2\u05d5\u05e0\u05d5\u05ea",
"LabelUnairedMissingEpisodesWithinSeasons": "\u05d4\u05e6\u05d2 \u05e4\u05e8\u05e7\u05d9\u05dd \u05e9\u05e2\u05d3\u05d9\u05df \u05d0\u05dc \u05e9\u05d5\u05d3\u05e8\u05d5 \u05d1\u05ea\u05d5\u05da \u05d4\u05e2\u05d5\u05e0\u05d5\u05ea",
"HeaderVideoPlaybackSettings": "\u05d4\u05d2\u05d3\u05e8\u05d5\u05ea \u05e0\u05d9\u05d2\u05d5\u05df",

View file

@ -63,12 +63,16 @@
"TabPreferences": "Postavke",
"TabPassword": "Lozinka",
"TabLibraryAccess": "Pristup biblioteci",
"TabAccess": "Access",
"TabImage": "Slika",
"TabProfile": "Profil",
"TabMetadata": "Metadata",
"TabImages": "Slike",
"TabNotifications": "Obavijesti",
"TabCollectionTitles": "Naslovi",
"HeaderDeviceAccess": "Device Access",
"OptionEnableAccessFromAllDevices": "Enable access from all devices",
"DeviceAccessHelp": "This only applies to devices that can be uniquely identified and will not prevent browser access. Filtering user device access will prevent them from using new devices until they've been approved here.",
"LabelDisplayMissingEpisodesWithinSeasons": "Prika\u017ei epizode koje nedostaju unutar sezone",
"LabelUnairedMissingEpisodesWithinSeasons": "Prika\u017ei epizode koje nisu emitirane unutar sezone",
"HeaderVideoPlaybackSettings": "Postavke video reprodukcije",

View file

@ -63,12 +63,16 @@
"TabPreferences": "Preferenze",
"TabPassword": "Password",
"TabLibraryAccess": "Accesso libreria",
"TabAccess": "Access",
"TabImage": "Immagine",
"TabProfile": "Profilo",
"TabMetadata": "Metadata",
"TabImages": "Immagini",
"TabNotifications": "Notifiche",
"TabCollectionTitles": "Titolo",
"HeaderDeviceAccess": "Device Access",
"OptionEnableAccessFromAllDevices": "Enable access from all devices",
"DeviceAccessHelp": "This only applies to devices that can be uniquely identified and will not prevent browser access. Filtering user device access will prevent them from using new devices until they've been approved here.",
"LabelDisplayMissingEpisodesWithinSeasons": "Visualizza gli episodi mancanti nelle stagioni",
"LabelUnairedMissingEpisodesWithinSeasons": "Visualizzare episodi mai andati in onda all'interno stagioni",
"HeaderVideoPlaybackSettings": "Impostazioni di riproduzione video",

View file

@ -63,12 +63,16 @@
"TabPreferences": "\u0422\u0435\u04a3\u0448\u0435\u043b\u0456\u043c\u0434\u0435\u0440",
"TabPassword": "\u049a\u04b1\u043f\u0438\u044f \u0441\u04e9\u0437",
"TabLibraryAccess": "\u0422\u0430\u0441\u0443\u0448\u044b\u0445\u0430\u043d\u0430\u0493\u0430 \u049b\u0430\u0442\u044b\u043d\u0430\u0441",
"TabAccess": "Access",
"TabImage": "\u0421\u0443\u0440\u0435\u0442",
"TabProfile": "\u041f\u0440\u043e\u0444\u0438\u043b\u044c",
"TabMetadata": "\u041c\u0435\u0442\u0430\u0434\u0435\u0440\u0435\u043a",
"TabImages": "\u0421\u0443\u0440\u0435\u0442\u0442\u0435\u0440",
"TabNotifications": "\u0425\u0430\u0431\u0430\u0440\u043b\u0430\u043d\u0434\u044b\u0440\u0443\u043b\u0430\u0440",
"TabCollectionTitles": "\u0422\u0443\u044b\u043d\u0434\u044b\u043b\u0430\u0440",
"HeaderDeviceAccess": "Device Access",
"OptionEnableAccessFromAllDevices": "Enable access from all devices",
"DeviceAccessHelp": "This only applies to devices that can be uniquely identified and will not prevent browser access. Filtering user device access will prevent them from using new devices until they've been approved here.",
"LabelDisplayMissingEpisodesWithinSeasons": "\u0416\u043e\u049b \u044d\u043f\u0438\u0437\u043e\u0434\u0442\u0430\u0440\u0434\u044b \u043c\u0430\u0443\u0441\u044b\u043c \u0456\u0448\u0456\u043d\u0434\u0435 \u0431\u0435\u0439\u043d\u0435\u043b\u0435\u0443",
"LabelUnairedMissingEpisodesWithinSeasons": "\u041a\u04e9\u0440\u0441\u0435\u0442\u0456\u043b\u043c\u0435\u0433\u0435\u043d \u044d\u043f\u0438\u0437\u043e\u0434\u0442\u0430\u0440\u0434\u044b \u043c\u0430\u0443\u0441\u044b\u043c \u0456\u0448\u0456\u043d\u0434\u0435 \u0431\u0435\u0439\u043d\u0435\u043b\u0435\u0443",
"HeaderVideoPlaybackSettings": "\u0411\u0435\u0439\u043d\u0435 \u043e\u0439\u043d\u0430\u0442\u0443 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043b\u0435\u0440\u0456",
@ -376,8 +380,8 @@
"LabelMaxScreenshotsPerItem": "\u042d\u043b\u0435\u043c\u0435\u043d\u0442 \u0431\u043e\u0439\u044b\u043d\u0448\u0430 \u0435\u04a3 \u043a\u04e9\u043f \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442 \u0441\u0430\u043d\u044b:",
"LabelMinBackdropDownloadWidth": "\u0410\u0440\u0442\u049b\u044b \u0441\u0443\u0440\u0435\u0442\u0442\u0456\u04a3 \u0436\u04af\u043a\u0442\u0435\u043f \u0430\u043b\u044b\u043d\u0430\u0442\u044b\u043d \u0435\u04a3 \u0430\u0437 \u0435\u043d\u0456:",
"LabelMinScreenshotDownloadWidth": "\u0416\u04af\u043a\u0442\u0435\u043f \u0430\u043b\u0443 \u04af\u0448\u0456\u043d \u0435\u04a3 \u0430\u0437 \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442 \u0435\u043d\u0456:",
"ButtonAddScheduledTaskTrigger": "\u0422\u0430\u043f\u0441\u044b\u0440\u043c\u0430 \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u0456\u043d \u04af\u0441\u0442\u0435\u0443",
"HeaderAddScheduledTaskTrigger": "\u0422\u0430\u043f\u0441\u044b\u0440\u043c\u0430 \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u0456\u043d \u04af\u0441\u0442\u0435\u0443",
"ButtonAddScheduledTaskTrigger": "\u0422\u0440\u0438\u0433\u0433\u0435\u0440\u0434\u0456 \u04af\u0441\u0442\u0435\u0443",
"HeaderAddScheduledTaskTrigger": "\u0422\u0440\u0438\u0433\u0433\u0435\u0440\u0434\u0456 \u04af\u0441\u0442\u0435\u0443",
"ButtonAdd": "\u04ae\u0441\u0442\u0435\u0443",
"LabelTriggerType": "\u0422\u0440\u0438\u0433\u0433\u0435\u0440 \u0442\u04af\u0440\u0456:",
"OptionDaily": "\u041a\u04af\u043d \u0441\u0430\u0439\u044b\u043d",

View file

@ -63,12 +63,16 @@
"TabPreferences": "Preferences",
"TabPassword": "Password",
"TabLibraryAccess": "Library Access",
"TabAccess": "Access",
"TabImage": "Image",
"TabProfile": "Profile",
"TabMetadata": "Metadata",
"TabImages": "Images",
"TabNotifications": "Notifications",
"TabCollectionTitles": "Titles",
"HeaderDeviceAccess": "Device Access",
"OptionEnableAccessFromAllDevices": "Enable access from all devices",
"DeviceAccessHelp": "This only applies to devices that can be uniquely identified and will not prevent browser access. Filtering user device access will prevent them from using new devices until they've been approved here.",
"LabelDisplayMissingEpisodesWithinSeasons": "Display missing episodes within seasons",
"LabelUnairedMissingEpisodesWithinSeasons": "Display unaired episodes within seasons",
"HeaderVideoPlaybackSettings": "Video Playback Settings",

View file

@ -63,12 +63,16 @@
"TabPreferences": "Preferences",
"TabPassword": "Password",
"TabLibraryAccess": "Library Access",
"TabAccess": "Access",
"TabImage": "Image",
"TabProfile": "Profile",
"TabMetadata": "Metadata",
"TabImages": "Images",
"TabNotifications": "Notifications",
"TabCollectionTitles": "Titles",
"HeaderDeviceAccess": "Device Access",
"OptionEnableAccessFromAllDevices": "Enable access from all devices",
"DeviceAccessHelp": "This only applies to devices that can be uniquely identified and will not prevent browser access. Filtering user device access will prevent them from using new devices until they've been approved here.",
"LabelDisplayMissingEpisodesWithinSeasons": "Display missing episodes within seasons",
"LabelUnairedMissingEpisodesWithinSeasons": "Display unaired episodes within seasons",
"HeaderVideoPlaybackSettings": "Video Playback Settings",

View file

@ -63,12 +63,16 @@
"TabPreferences": "Preferanser",
"TabPassword": "Passord",
"TabLibraryAccess": "Bibliotektilgang",
"TabAccess": "Access",
"TabImage": "Bilde",
"TabProfile": "profil",
"TabMetadata": "Metadata",
"TabImages": "Bilder",
"TabNotifications": "Varslinger",
"TabCollectionTitles": "Titler",
"HeaderDeviceAccess": "Device Access",
"OptionEnableAccessFromAllDevices": "Enable access from all devices",
"DeviceAccessHelp": "This only applies to devices that can be uniquely identified and will not prevent browser access. Filtering user device access will prevent them from using new devices until they've been approved here.",
"LabelDisplayMissingEpisodesWithinSeasons": "Vis episoder som sesongen mangler",
"LabelUnairedMissingEpisodesWithinSeasons": "Vis episoder som enn\u00e5 ikke har blitt sendt",
"HeaderVideoPlaybackSettings": "Innstillinger for video-avspilling",

View file

@ -63,12 +63,16 @@
"TabPreferences": "Voorkeuren",
"TabPassword": "Wachtwoord",
"TabLibraryAccess": "Bibliotheek toegang",
"TabAccess": "Access",
"TabImage": "Afbeelding",
"TabProfile": "Profiel",
"TabMetadata": "Metagegevens",
"TabImages": "Afbeeldingen",
"TabNotifications": "Meldingen",
"TabCollectionTitles": "Titels",
"HeaderDeviceAccess": "Device Access",
"OptionEnableAccessFromAllDevices": "Enable access from all devices",
"DeviceAccessHelp": "This only applies to devices that can be uniquely identified and will not prevent browser access. Filtering user device access will prevent them from using new devices until they've been approved here.",
"LabelDisplayMissingEpisodesWithinSeasons": "Toon ontbrekende afleveringen binnen een seizoen",
"LabelUnairedMissingEpisodesWithinSeasons": "Toon komende afleveringen binnen een seizoen",
"HeaderVideoPlaybackSettings": "Video afspeel instellingen",

View file

@ -63,12 +63,16 @@
"TabPreferences": "Preferencje",
"TabPassword": "Has\u0142o",
"TabLibraryAccess": "Dost\u0119p do biblioteki",
"TabAccess": "Access",
"TabImage": "Obraz",
"TabProfile": "Profil",
"TabMetadata": "Metadata",
"TabImages": "Images",
"TabNotifications": "Notifications",
"TabCollectionTitles": "Titles",
"HeaderDeviceAccess": "Device Access",
"OptionEnableAccessFromAllDevices": "Enable access from all devices",
"DeviceAccessHelp": "This only applies to devices that can be uniquely identified and will not prevent browser access. Filtering user device access will prevent them from using new devices until they've been approved here.",
"LabelDisplayMissingEpisodesWithinSeasons": "Wy\u015bwietl brakuj\u0105ce odcinki w sezonach",
"LabelUnairedMissingEpisodesWithinSeasons": "Wy\u015bwietl nie wydanie odcinki w sezonach",
"HeaderVideoPlaybackSettings": "Ustawienia odtwarzania wideo",

View file

@ -63,12 +63,16 @@
"TabPreferences": "Prefer\u00eancias",
"TabPassword": "Senha",
"TabLibraryAccess": "Acesso \u00e0 Biblioteca",
"TabAccess": "Acesso",
"TabImage": "Imagem",
"TabProfile": "Perfil",
"TabMetadata": "Metadados",
"TabImages": "Imagens",
"TabNotifications": "Notifica\u00e7\u00f5es",
"TabCollectionTitles": "T\u00edtulos",
"HeaderDeviceAccess": "Device Access",
"OptionEnableAccessFromAllDevices": "Enable access from all devices",
"DeviceAccessHelp": "This only applies to devices that can be uniquely identified and will not prevent browser access. Filtering user device access will prevent them from using new devices until they've been approved here.",
"LabelDisplayMissingEpisodesWithinSeasons": "Exibir epis\u00f3dios que faltam dentro das temporadas",
"LabelUnairedMissingEpisodesWithinSeasons": "Exibir epis\u00f3dios por estrear dentro das temporadas",
"HeaderVideoPlaybackSettings": "Ajustes da Reprodu\u00e7\u00e3o de V\u00eddeo",
@ -376,8 +380,8 @@
"LabelMaxScreenshotsPerItem": "N\u00famero m\u00e1ximo de imagens de tela por item:",
"LabelMinBackdropDownloadWidth": "Tamanho m\u00ednimo da imagem de fundo para download:",
"LabelMinScreenshotDownloadWidth": "Tamanho m\u00ednimo da imagem de tela para download:",
"ButtonAddScheduledTaskTrigger": "Adicionar Disparador da Tarefa",
"HeaderAddScheduledTaskTrigger": "Adicionar Disparador da Tarefa",
"ButtonAddScheduledTaskTrigger": "Adicionar Disparador",
"HeaderAddScheduledTaskTrigger": "Adicionar Disparador",
"ButtonAdd": "Adicionar",
"LabelTriggerType": "Tipo de Disparador:",
"OptionDaily": "Di\u00e1rio",

View file

@ -63,12 +63,16 @@
"TabPreferences": "Prefer\u00eancias",
"TabPassword": "Senha",
"TabLibraryAccess": "Aceder \u00e0 Biblioteca",
"TabAccess": "Access",
"TabImage": "Imagem",
"TabProfile": "Perfil",
"TabMetadata": "Metadados",
"TabImages": "Imagens",
"TabNotifications": "Notifica\u00e7\u00f5es",
"TabCollectionTitles": "T\u00edtulos",
"HeaderDeviceAccess": "Device Access",
"OptionEnableAccessFromAllDevices": "Enable access from all devices",
"DeviceAccessHelp": "This only applies to devices that can be uniquely identified and will not prevent browser access. Filtering user device access will prevent them from using new devices until they've been approved here.",
"LabelDisplayMissingEpisodesWithinSeasons": "Mostrar epis\u00f3dios em falta dentro das temporadas",
"LabelUnairedMissingEpisodesWithinSeasons": "Mostrar epis\u00f3dios por estrear dentro das temporadas",
"HeaderVideoPlaybackSettings": "Configura\u00e7\u00f5es de Reprodu\u00e7\u00e3o de V\u00eddeo",

View file

@ -63,12 +63,16 @@
"TabPreferences": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438",
"TabPassword": "\u041f\u0430\u0440\u043e\u043b\u044c",
"TabLibraryAccess": "\u0414\u043e\u0441\u0442\u0443\u043f \u043a \u043c\u0435\u0434\u0438\u0430\u0442\u0435\u043a\u0435",
"TabAccess": "Access",
"TabImage": "\u0420\u0438\u0441\u0443\u043d\u043e\u043a",
"TabProfile": "\u041f\u0440\u043e\u0444\u0438\u043b\u044c",
"TabMetadata": "\u041c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435",
"TabImages": "\u0420\u0438\u0441\u0443\u043d\u043a\u0438",
"TabNotifications": "\u0423\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u044f",
"TabCollectionTitles": "\u041f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f",
"HeaderDeviceAccess": "Device Access",
"OptionEnableAccessFromAllDevices": "Enable access from all devices",
"DeviceAccessHelp": "This only applies to devices that can be uniquely identified and will not prevent browser access. Filtering user device access will prevent them from using new devices until they've been approved here.",
"LabelDisplayMissingEpisodesWithinSeasons": "\u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u044d\u043f\u0438\u0437\u043e\u0434\u044b \u0432 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445 \u0441\u0435\u0437\u043e\u043d\u043e\u0432",
"LabelUnairedMissingEpisodesWithinSeasons": "\u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0435 \u044d\u043f\u0438\u0437\u043e\u0434\u044b \u0432 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445 \u0441\u0435\u0437\u043e\u043d\u043e\u0432",
"HeaderVideoPlaybackSettings": "\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0432\u0438\u0434\u0435\u043e",
@ -376,8 +380,8 @@
"LabelMaxScreenshotsPerItem": "\u041c\u0430\u043a\u0441. \u0447\u0438\u0441\u043b\u043e \u0441\u043d\u0438\u043c\u043a\u043e\u0432 \u044d\u043a\u0440\u0430\u043d\u0430 \u043d\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442:",
"LabelMinBackdropDownloadWidth": "\u041c\u0438\u043d. \u0448\u0438\u0440\u0438\u043d\u0430 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c\u043e\u0433\u043e \u0437\u0430\u0434\u043d\u0438\u043a\u0430:",
"LabelMinScreenshotDownloadWidth": "\u041c\u0438\u043d. \u0448\u0438\u0440\u0438\u043d\u0430 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c\u043e\u0433\u043e \u0441\u043d\u0438\u043c\u043a\u0430 \u044d\u043a\u0440\u0430\u043d\u0430:",
"ButtonAddScheduledTaskTrigger": "\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0442\u0440\u0438\u0433\u0433\u0435\u0440 \u0437\u0430\u0434\u0430\u0447\u0438",
"HeaderAddScheduledTaskTrigger": "\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u0430 \u0437\u0430\u0434\u0430\u0447\u0438",
"ButtonAddScheduledTaskTrigger": "\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0442\u0440\u0438\u0433\u0433\u0435\u0440",
"HeaderAddScheduledTaskTrigger": "\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u0430",
"ButtonAdd": "\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c",
"LabelTriggerType": "\u0422\u0438\u043f \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u0430:",
"OptionDaily": "\u0415\u0436\u0435\u0434\u043d\u0435\u0432\u043d\u043e",

View file

@ -72,7 +72,7 @@
"TabCollectionTitles": "Titles",
"HeaderDeviceAccess": "Device Access",
"OptionEnableAccessFromAllDevices": "Enable access from all devices",
"DeviceAccessHelp": "This only applies to devices that can be uniquely identified and will not prevent browser access.",
"DeviceAccessHelp": "This only applies to devices that can be uniquely identified and will not prevent browser access. Filtering user device access will prevent them from using new devices until they've been approved here.",
"LabelDisplayMissingEpisodesWithinSeasons": "Display missing episodes within seasons",
"LabelUnairedMissingEpisodesWithinSeasons": "Display unaired episodes within seasons",
"HeaderVideoPlaybackSettings": "Video Playback Settings",

View file

@ -63,12 +63,16 @@
"TabPreferences": "Inst\u00e4llningar",
"TabPassword": "L\u00f6senord",
"TabLibraryAccess": "\u00c5tkomst till biblioteket",
"TabAccess": "Access",
"TabImage": "Bild",
"TabProfile": "Profil",
"TabMetadata": "Metadata",
"TabImages": "Bilder",
"TabNotifications": "Meddelanden",
"TabCollectionTitles": "Titlar",
"HeaderDeviceAccess": "Device Access",
"OptionEnableAccessFromAllDevices": "Enable access from all devices",
"DeviceAccessHelp": "This only applies to devices that can be uniquely identified and will not prevent browser access. Filtering user device access will prevent them from using new devices until they've been approved here.",
"LabelDisplayMissingEpisodesWithinSeasons": "Visa saknade avsnitt i s\u00e4songer",
"LabelUnairedMissingEpisodesWithinSeasons": "Visa \u00e4nnu ej s\u00e4nda avsnitt i s\u00e4songer",
"HeaderVideoPlaybackSettings": "Inst\u00e4llningar f\u00f6r videouppspelning",

View file

@ -63,12 +63,16 @@
"TabPreferences": "Tercihler",
"TabPassword": "\u015eifre",
"TabLibraryAccess": "K\u00fct\u00fcphane Eri\u015fim",
"TabAccess": "Access",
"TabImage": "Resim",
"TabProfile": "Profil",
"TabMetadata": "Metadata",
"TabImages": "Resimler",
"TabNotifications": "Notifications",
"TabCollectionTitles": "Titles",
"HeaderDeviceAccess": "Device Access",
"OptionEnableAccessFromAllDevices": "Enable access from all devices",
"DeviceAccessHelp": "This only applies to devices that can be uniquely identified and will not prevent browser access. Filtering user device access will prevent them from using new devices until they've been approved here.",
"LabelDisplayMissingEpisodesWithinSeasons": "Sezondaki kay\u0131p b\u00f6l\u00fcmleri g\u00f6ster",
"LabelUnairedMissingEpisodesWithinSeasons": "Display unaired episodes within seasons",
"HeaderVideoPlaybackSettings": "Video Oynatma Ayarlar\u0131",

View file

@ -63,12 +63,16 @@
"TabPreferences": "\u01afa th\u00edch",
"TabPassword": "M\u1eadt kh\u1ea9u",
"TabLibraryAccess": "Truy c\u1eadp th\u01b0 vi\u1ec7n",
"TabAccess": "Access",
"TabImage": "H\u00ecnh \u1ea3nh",
"TabProfile": "H\u1ed3 s\u01a1",
"TabMetadata": "Metadata",
"TabImages": "H\u00ecnh \u1ea3nh",
"TabNotifications": "Notifications",
"TabCollectionTitles": "Ti\u00eau \u0111\u1ec1",
"HeaderDeviceAccess": "Device Access",
"OptionEnableAccessFromAllDevices": "Enable access from all devices",
"DeviceAccessHelp": "This only applies to devices that can be uniquely identified and will not prevent browser access. Filtering user device access will prevent them from using new devices until they've been approved here.",
"LabelDisplayMissingEpisodesWithinSeasons": "Display missing episodes within seasons",
"LabelUnairedMissingEpisodesWithinSeasons": "Display unaired episodes within seasons",
"HeaderVideoPlaybackSettings": "C\u00e1c c\u00e0i \u0111\u1eb7t ph\u00e1t Video",

View file

@ -63,12 +63,16 @@
"TabPreferences": "\u504f\u597d",
"TabPassword": "\u5bc6\u7801",
"TabLibraryAccess": "\u5a92\u4f53\u5e93\u8bbf\u95ee\u6743\u9650",
"TabAccess": "Access",
"TabImage": "\u56fe\u7247",
"TabProfile": "\u4e2a\u4eba\u914d\u7f6e",
"TabMetadata": "\u5a92\u4f53\u8d44\u6599",
"TabImages": "\u56fe\u50cf",
"TabNotifications": "\u901a\u77e5",
"TabCollectionTitles": "\u6807\u9898",
"HeaderDeviceAccess": "Device Access",
"OptionEnableAccessFromAllDevices": "Enable access from all devices",
"DeviceAccessHelp": "This only applies to devices that can be uniquely identified and will not prevent browser access. Filtering user device access will prevent them from using new devices until they've been approved here.",
"LabelDisplayMissingEpisodesWithinSeasons": "\u663e\u793a\u6bcf\u5b63\u91cc\u7f3a\u5c11\u7684\u5267\u96c6",
"LabelUnairedMissingEpisodesWithinSeasons": "\u663e\u793a\u6bcf\u5b63\u91cc\u672a\u53d1\u5e03\u7684\u5267\u96c6",
"HeaderVideoPlaybackSettings": "\u89c6\u9891\u56de\u653e\u8bbe\u7f6e",

View file

@ -63,12 +63,16 @@
"TabPreferences": "\u504f\u597d",
"TabPassword": "\u5bc6\u78bc",
"TabLibraryAccess": "\u5a92\u9ad4\u5eab\u700f\u89bd\u6b0a\u9650",
"TabAccess": "Access",
"TabImage": "\u5716\u50cf",
"TabProfile": "\u914d\u7f6e",
"TabMetadata": "\u5a92\u9ad4\u8cc7\u6599",
"TabImages": "\u5716\u50cf",
"TabNotifications": "Notifications",
"TabCollectionTitles": "\u6a19\u984c",
"HeaderDeviceAccess": "Device Access",
"OptionEnableAccessFromAllDevices": "Enable access from all devices",
"DeviceAccessHelp": "This only applies to devices that can be uniquely identified and will not prevent browser access. Filtering user device access will prevent them from using new devices until they've been approved here.",
"LabelDisplayMissingEpisodesWithinSeasons": "\u986f\u793a\u7bc0\u76ee\u5b63\u5ea6\u5167\u7f3a\u5c11\u7684\u55ae\u5143",
"LabelUnairedMissingEpisodesWithinSeasons": "\u5728\u7bc0\u76ee\u5b63\u5ea6\u5167\u986f\u793a\u9084\u672a\u767c\u4f48\u7684\u55ae\u5143",
"HeaderVideoPlaybackSettings": "\u8996\u983b\u56de\u653e\u8a2d\u7f6e",

View file

@ -2,10 +2,13 @@
using MediaBrowser.Controller.Entities.Audio;
using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.Sync;
using MediaBrowser.Controller.TV;
using MediaBrowser.Model.Dlna;
using MediaBrowser.Model.Dto;
using MediaBrowser.Model.Entities;
using MediaBrowser.Model.Logging;
using MediaBrowser.Model.MediaInfo;
using MediaBrowser.Model.Querying;
using MediaBrowser.Model.Session;
using MediaBrowser.Model.Sync;
using MoreLinq;
@ -24,19 +27,16 @@ namespace MediaBrowser.Server.Implementations.Sync
private readonly ISyncManager _syncManager;
private readonly ILogger _logger;
private readonly IUserManager _userManager;
private readonly ITVSeriesManager _tvSeriesManager;
public SyncJobProcessor(ILibraryManager libraryManager, ISyncRepository syncRepo, ISyncManager syncManager, ILogger logger, IUserManager userManager)
public SyncJobProcessor(ILibraryManager libraryManager, ISyncRepository syncRepo, ISyncManager syncManager, ILogger logger, IUserManager userManager, ITVSeriesManager tvSeriesManager)
{
_libraryManager = libraryManager;
_syncRepo = syncRepo;
_syncManager = syncManager;
_logger = logger;
_userManager = userManager;
}
public void ProcessJobItem(SyncJob job, SyncJobItem jobItem, SyncTarget target)
{
_tvSeriesManager = tvSeriesManager;
}
public async Task EnsureJobItems(SyncJob job)
@ -48,7 +48,7 @@ namespace MediaBrowser.Server.Implementations.Sync
throw new InvalidOperationException("Cannot proceed with sync because user no longer exists.");
}
var items = GetItemsForSync(job.RequestedItemIds, user, job.UnwatchedOnly)
var items = (await GetItemsForSync(job.Category, job.ParentId, job.RequestedItemIds, user, job.UnwatchedOnly).ConfigureAwait(false))
.ToList();
var jobItems = _syncRepo.GetJobItems(new SyncJobItemQuery
@ -128,7 +128,7 @@ namespace MediaBrowser.Server.Implementations.Sync
foreach (var item in jobItems)
{
if (item.Status == SyncJobItemStatus.Failed || item.Status == SyncJobItemStatus.Completed)
if (item.Status == SyncJobItemStatus.Failed || item.Status == SyncJobItemStatus.Synced || item.Status == SyncJobItemStatus.RemovedFromDevice)
{
pct += 100;
}
@ -171,10 +171,11 @@ namespace MediaBrowser.Server.Implementations.Sync
return _syncRepo.Update(job);
}
public IEnumerable<BaseItem> GetItemsForSync(IEnumerable<string> itemIds, User user, bool unwatchedOnly)
public async Task<IEnumerable<BaseItem>> GetItemsForSync(SyncCategory? category, string parentId, IEnumerable<string> itemIds, User user, bool unwatchedOnly)
{
var items = itemIds
.SelectMany(i => GetItemsForSync(i, user))
var items = category.HasValue ?
await GetItemsForSync(category.Value, parentId, user).ConfigureAwait(false) :
itemIds.SelectMany(i => GetItemsForSync(i, user))
.Where(_syncManager.SupportsSync);
if (unwatchedOnly)
@ -198,6 +199,54 @@ namespace MediaBrowser.Server.Implementations.Sync
return items.DistinctBy(i => i.Id);
}
private async Task<IEnumerable<BaseItem>> GetItemsForSync(SyncCategory category, string parentId, User user)
{
var parent = string.IsNullOrWhiteSpace(parentId)
? user.RootFolder
: (Folder)_libraryManager.GetItemById(parentId);
InternalItemsQuery query;
switch (category)
{
case SyncCategory.Latest:
query = new InternalItemsQuery
{
IsFolder = false,
SortBy = new[] { ItemSortBy.DateCreated, ItemSortBy.SortName },
SortOrder = SortOrder.Descending,
Recursive = true
};
break;
case SyncCategory.Resume:
query = new InternalItemsQuery
{
IsFolder = false,
SortBy = new[] { ItemSortBy.DatePlayed, ItemSortBy.SortName },
SortOrder = SortOrder.Descending,
Recursive = true,
IsResumable = true,
MediaTypes = new[] { MediaType.Video }
};
break;
case SyncCategory.NextUp:
return _tvSeriesManager.GetNextUp(new NextUpQuery
{
ParentId = parentId,
UserId = user.Id.ToString("N")
}).Items;
default:
throw new ArgumentException("Unrecognized category: " + category);
}
query.User = user;
var result = await parent.GetItems(query).ConfigureAwait(false);
return result.Items;
}
private IEnumerable<BaseItem> GetItemsForSync(string id, User user)
{
var item = _libraryManager.GetItemById(id);
@ -263,7 +312,7 @@ namespace MediaBrowser.Server.Implementations.Sync
var result = _syncRepo.GetJobItems(new SyncJobItemQuery
{
IsCompleted = false
Status = SyncJobItemStatus.Queued
});
var jobItems = result.Items;

View file

@ -9,6 +9,7 @@ using MediaBrowser.Controller.Entities.TV;
using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.LiveTv;
using MediaBrowser.Controller.Sync;
using MediaBrowser.Controller.TV;
using MediaBrowser.Model.Dlna;
using MediaBrowser.Model.Dto;
using MediaBrowser.Model.Entities;
@ -34,10 +35,11 @@ namespace MediaBrowser.Server.Implementations.Sync
private readonly IUserManager _userManager;
private readonly Func<IDtoService> _dtoService;
private readonly IApplicationHost _appHost;
private readonly ITVSeriesManager _tvSeriesManager;
private ISyncProvider[] _providers = { };
public SyncManager(ILibraryManager libraryManager, ISyncRepository repo, IImageProcessor imageProcessor, ILogger logger, IUserManager userManager, Func<IDtoService> dtoService, IApplicationHost appHost)
public SyncManager(ILibraryManager libraryManager, ISyncRepository repo, IImageProcessor imageProcessor, ILogger logger, IUserManager userManager, Func<IDtoService> dtoService, IApplicationHost appHost, ITVSeriesManager tvSeriesManager)
{
_libraryManager = libraryManager;
_repo = repo;
@ -46,6 +48,7 @@ namespace MediaBrowser.Server.Implementations.Sync
_userManager = userManager;
_dtoService = dtoService;
_appHost = appHost;
_tvSeriesManager = tvSeriesManager;
}
public void AddParts(IEnumerable<ISyncProvider> providers)
@ -55,12 +58,12 @@ namespace MediaBrowser.Server.Implementations.Sync
public async Task<SyncJobCreationResult> CreateJob(SyncJobRequest request)
{
var processor = new SyncJobProcessor(_libraryManager, _repo, this, _logger, _userManager);
var processor = new SyncJobProcessor(_libraryManager, _repo, this, _logger, _userManager, _tvSeriesManager);
var user = _userManager.GetUserById(request.UserId);
var items = processor
.GetItemsForSync(request.ItemIds, user, request.UnwatchedOnly)
var items = (await processor
.GetItemsForSync(request.Category, request.ParentId, request.ItemIds, user, request.UnwatchedOnly).ConfigureAwait(false))
.ToList();
if (items.Any(i => !SupportsSync(i)))
@ -68,9 +71,16 @@ namespace MediaBrowser.Server.Implementations.Sync
throw new ArgumentException("Item does not support sync.");
}
if (string.IsNullOrWhiteSpace(request.Name) && request.ItemIds.Count == 1)
if (string.IsNullOrWhiteSpace(request.Name))
{
request.Name = GetDefaultName(_libraryManager.GetItemById(request.ItemIds[0]));
if (request.Category.HasValue)
{
request.Name = request.Category.Value.ToString();
}
else if (request.ItemIds.Count == 1)
{
request.Name = GetDefaultName(_libraryManager.GetItemById(request.ItemIds[0]));
}
}
if (string.IsNullOrWhiteSpace(request.Name))
@ -96,7 +106,7 @@ namespace MediaBrowser.Server.Implementations.Sync
UserId = request.UserId,
UnwatchedOnly = request.UnwatchedOnly,
ItemLimit = request.ItemLimit,
RequestedItemIds = request.ItemIds,
RequestedItemIds = request.ItemIds ?? new List<string> { },
DateCreated = DateTime.UtcNow,
DateLastModified = DateTime.UtcNow,
SyncNewContent = request.SyncNewContent,
@ -303,12 +313,12 @@ namespace MediaBrowser.Server.Implementations.Sync
{
var jobItem = _repo.GetJobItem(id);
jobItem.Status = SyncJobItemStatus.Completed;
jobItem.Status = SyncJobItemStatus.Synced;
jobItem.Progress = 100;
await _repo.Update(jobItem).ConfigureAwait(false);
var processor = new SyncJobProcessor(_libraryManager, _repo, this, _logger, _userManager);
var processor = new SyncJobProcessor(_libraryManager, _repo, this, _logger, _userManager, _tvSeriesManager);
await processor.UpdateJobStatus(jobItem.JobId).ConfigureAwait(false);
}
@ -391,6 +401,21 @@ namespace MediaBrowser.Server.Implementations.Sync
public async Task<SyncDataResponse> SyncData(SyncDataRequest request)
{
var jobItemResult = GetJobItems(new SyncJobItemQuery
{
TargetId = request.TargetId,
Status = SyncJobItemStatus.Synced
});
foreach (var jobItem in jobItemResult.Items)
{
if (!request.LocalItemIds.Contains(jobItem.ItemId, StringComparer.OrdinalIgnoreCase))
{
jobItem.Status = SyncJobItemStatus.RemovedFromDevice;
await _repo.Update(jobItem).ConfigureAwait(false);
}
}
var response = new SyncDataResponse();
return response;

View file

@ -36,7 +36,7 @@ namespace MediaBrowser.Server.Implementations.Sync
public async Task Initialize()
{
var dbFile = Path.Combine(_appPaths.DataPath, "sync8.db");
var dbFile = Path.Combine(_appPaths.DataPath, "sync9.db");
_connection = await SqliteExtensions.ConnectToDb(dbFile, _logger).ConfigureAwait(false);
@ -68,7 +68,7 @@ namespace MediaBrowser.Server.Implementations.Sync
_deleteJobItemsCommand = _connection.CreateCommand();
_deleteJobItemsCommand.CommandText = "delete from SyncJobItems where JobId=@JobId";
_deleteJobItemsCommand.Parameters.Add(_deleteJobItemsCommand, "@JobId");
_saveJobCommand = _connection.CreateCommand();
_saveJobCommand.CommandText = "replace into SyncJobs (Id, TargetId, Name, Quality, Status, Progress, UserId, ItemIds, Category, ParentId, UnwatchedOnly, ItemLimit, SyncNewContent, DateCreated, DateLastModified, ItemCount) values (@Id, @TargetId, @Name, @Quality, @Status, @Progress, @UserId, @ItemIds, @Category, @ParentId, @UnwatchedOnly, @ItemLimit, @SyncNewContent, @DateCreated, @DateLastModified, @ItemCount)";
@ -119,7 +119,7 @@ namespace MediaBrowser.Server.Implementations.Sync
{
throw new ArgumentNullException("id");
}
using (var cmd = _connection.CreateCommand())
{
cmd.CommandText = BaseJobSelectText + " where Id=@Id";
@ -169,7 +169,7 @@ namespace MediaBrowser.Server.Implementations.Sync
if (!reader.IsDBNull(7))
{
info.RequestedItemIds = reader.GetString(7).Split(',').ToList();
info.RequestedItemIds = reader.GetString(7).Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries).ToList();
}
if (!reader.IsDBNull(8))
@ -302,7 +302,7 @@ namespace MediaBrowser.Server.Implementations.Sync
_deleteJobItemsCommand.GetParameter(index++).Value = id;
_deleteJobItemsCommand.Transaction = transaction;
_deleteJobItemsCommand.ExecuteNonQuery();
transaction.Commit();
}
catch (OperationCanceledException)
@ -473,19 +473,6 @@ namespace MediaBrowser.Server.Implementations.Sync
cmd.Parameters.Add(cmd, "@Status", DbType.String).Value = query.Status.Value.ToString();
}
else if (query.IsCompleted.HasValue)
{
if (query.IsCompleted.Value)
{
whereClauses.Add("Status=@Status");
}
else
{
whereClauses.Add("Status<>@Status");
}
cmd.Parameters.Add(cmd, "@Status", DbType.String).Value = SyncJobStatus.Completed.ToString();
}
var whereTextWithoutPaging = whereClauses.Count == 0 ?
string.Empty :
" where " + string.Join(" AND ", whereClauses.ToArray());
@ -616,9 +603,9 @@ namespace MediaBrowser.Server.Implementations.Sync
{
info.MediaSourceId = reader.GetString(2);
}
info.JobId = reader.GetString(3);
if (!reader.IsDBNull(4))
{
info.OutputPath = reader.GetString(4);
@ -637,7 +624,7 @@ namespace MediaBrowser.Server.Implementations.Sync
{
info.Progress = reader.GetDouble(8);
}
return info;
}

View file

@ -1,6 +1,7 @@
using MediaBrowser.Common.ScheduledTasks;
using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.Sync;
using MediaBrowser.Controller.TV;
using MediaBrowser.Model.Logging;
using System;
using System.Collections.Generic;
@ -16,14 +17,16 @@ namespace MediaBrowser.Server.Implementations.Sync
private readonly ISyncManager _syncManager;
private readonly ILogger _logger;
private readonly IUserManager _userManager;
private readonly ITVSeriesManager _tvSeriesManager;
public SyncScheduledTask(ILibraryManager libraryManager, ISyncRepository syncRepo, ISyncManager syncManager, ILogger logger, IUserManager userManager)
public SyncScheduledTask(ILibraryManager libraryManager, ISyncRepository syncRepo, ISyncManager syncManager, ILogger logger, IUserManager userManager, ITVSeriesManager tvSeriesManager)
{
_libraryManager = libraryManager;
_syncRepo = syncRepo;
_syncManager = syncManager;
_logger = logger;
_userManager = userManager;
_tvSeriesManager = tvSeriesManager;
}
public string Name
@ -46,7 +49,7 @@ namespace MediaBrowser.Server.Implementations.Sync
public Task Execute(CancellationToken cancellationToken, IProgress<double> progress)
{
return new SyncJobProcessor(_libraryManager, _syncRepo, _syncManager, _logger, _userManager).Sync(progress,
return new SyncJobProcessor(_libraryManager, _syncRepo, _syncManager, _logger, _userManager, _tvSeriesManager).Sync(progress,
cancellationToken);
}

View file

@ -482,7 +482,10 @@ namespace MediaBrowser.Server.Startup.Common
ImageProcessor = new ImageProcessor(LogManager.GetLogger("ImageProcessor"), ServerConfigurationManager.ApplicationPaths, FileSystemManager, JsonSerializer, MediaEncoder);
RegisterSingleInstance(ImageProcessor);
SyncManager = new SyncManager(LibraryManager, SyncRepository, ImageProcessor, LogManager.GetLogger("SyncManager"), UserManager, () => DtoService, this);
TVSeriesManager = new TVSeriesManager(UserManager, UserDataManager, LibraryManager);
RegisterSingleInstance(TVSeriesManager);
SyncManager = new SyncManager(LibraryManager, SyncRepository, ImageProcessor, LogManager.GetLogger("SyncManager"), UserManager, () => DtoService, this, TVSeriesManager);
RegisterSingleInstance(SyncManager);
DtoService = new DtoService(Logger, LibraryManager, UserDataManager, ItemRepository, ImageProcessor, ServerConfigurationManager, FileSystemManager, ProviderManager, () => ChannelManager, SyncManager, this);
@ -511,9 +514,6 @@ namespace MediaBrowser.Server.Startup.Common
ChannelManager = new ChannelManager(UserManager, DtoService, LibraryManager, Logger, ServerConfigurationManager, FileSystemManager, UserDataManager, JsonSerializer, LocalizationManager, HttpClient);
RegisterSingleInstance(ChannelManager);
TVSeriesManager = new TVSeriesManager(UserManager, UserDataManager, LibraryManager);
RegisterSingleInstance(TVSeriesManager);
var appThemeManager = new AppThemeManager(ApplicationPaths, FileSystemManager, JsonSerializer, Logger);
RegisterSingleInstance<IAppThemeManager>(appThemeManager);