mirror of
https://github.com/jellyfin/jellyfin.git
synced 2025-04-23 21:47:14 -04:00
sync updates
This commit is contained in:
parent
8a9f16ff6a
commit
048b6a7fbd
72 changed files with 389 additions and 150 deletions
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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))
|
||||
|
|
|
@ -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"));
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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; }
|
||||
}
|
||||
}
|
||||
|
|
|
@ -6,7 +6,8 @@ namespace MediaBrowser.Model.Sync
|
|||
Queued = 0,
|
||||
Converting = 1,
|
||||
Transferring = 2,
|
||||
Completed = 3,
|
||||
Failed = 4
|
||||
Synced = 3,
|
||||
Failed = 4,
|
||||
RemovedFromDevice = 5
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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."
|
||||
}
|
|
@ -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",
|
||||
|
|
|
@ -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."
|
||||
}
|
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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.",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue