From 0ec3d217e71ea20a9e377e479db88c4d4cd39baf Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Fri, 26 Dec 2014 12:45:06 -0500 Subject: sync updates --- MediaBrowser.Controller/Sync/ISyncManager.cs | 15 +++++++++++++++ 1 file changed, 15 insertions(+) (limited to 'MediaBrowser.Controller/Sync/ISyncManager.cs') diff --git a/MediaBrowser.Controller/Sync/ISyncManager.cs b/MediaBrowser.Controller/Sync/ISyncManager.cs index 47339f677..e16a978c3 100644 --- a/MediaBrowser.Controller/Sync/ISyncManager.cs +++ b/MediaBrowser.Controller/Sync/ISyncManager.cs @@ -4,6 +4,7 @@ using MediaBrowser.Model.Querying; using MediaBrowser.Model.Sync; using System.Collections.Generic; using System.Threading.Tasks; +using MediaBrowser.Model.Users; namespace MediaBrowser.Controller.Sync { @@ -80,5 +81,19 @@ namespace MediaBrowser.Controller.Sync /// The identifier. /// SyncJobItem. SyncJobItem GetJobItem(string id); + + /// + /// Gets the job item information. + /// + /// The identifier. + /// SyncedItem. + SyncedItem GetJobItemInfo(string id); + + /// + /// Reports the offline action. + /// + /// The action. + /// Task. + Task ReportOfflineAction(UserAction action); } } -- cgit v1.2.3 From 7bce2e04b618671faafc32a39978d0d8c87cba21 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Sat, 27 Dec 2014 17:52:41 -0500 Subject: sync updates --- MediaBrowser.Api/Sync/SyncService.cs | 12 ++++++++ MediaBrowser.Controller/Entities/BaseItem.cs | 2 +- .../Net/IWebSocketConnection.cs | 3 +- MediaBrowser.Controller/Sync/ISyncManager.cs | 14 ++++----- MediaBrowser.Dlna/Main/DlnaEntryPoint.cs | 1 - .../Configuration/ServerConfiguration.cs | 2 ++ MediaBrowser.Model/Sync/DeviceFileInfo.cs | 2 +- MediaBrowser.Model/Sync/ItemFIleInfo.cs | 2 +- .../Connect/ConnectEntryPoint.cs | 1 - .../EntryPoints/UdpServerEntryPoint.cs | 1 - .../EntryPoints/UsageEntryPoint.cs | 2 -- .../EntryPoints/UsageReporter.cs | 1 - .../HttpServer/HttpListenerHost.cs | 16 ++++++---- .../HttpServer/IHttpListener.cs | 5 ++-- .../HttpServer/NativeWebSocket.cs | 5 ++-- .../HttpServer/NetListener/HttpListenerServer.cs | 3 +- .../HttpServer/SocketSharp/SharpWebSocket.cs | 5 +--- .../SocketSharp/WebSocketSharpListener.cs | 3 +- .../ServerManager/WebSocketConnection.cs | 1 - .../Session/WebSocketController.cs | 3 +- .../Sync/SyncManager.cs | 20 +++++++++---- .../Sync/SyncRepository.cs | 16 ++++++---- .../Udp/UdpServer.cs | 1 - MediaBrowser.Server.Mac/Native/BaseMonoApp.cs | 2 +- MediaBrowser.Server.Mono/Native/BaseMonoApp.cs | 3 +- .../Networking/NetworkManager.cs | 1 - .../ApplicationHost.cs | 35 +++++++++++----------- MediaBrowser.Server.Startup.Common/INativeApp.cs | 6 ++-- .../Native/RegisterServer.bat | 18 ++++------- .../Native/ServerAuthorization.cs | 9 ++---- .../Native/WindowsApp.cs | 5 ++-- .../Networking/NetworkManager.cs | 1 - Nuget/MediaBrowser.Common.Internal.nuspec | 4 +-- Nuget/MediaBrowser.Common.nuspec | 2 +- Nuget/MediaBrowser.Model.Signed.nuspec | 2 +- Nuget/MediaBrowser.Server.Core.nuspec | 4 +-- 36 files changed, 109 insertions(+), 104 deletions(-) (limited to 'MediaBrowser.Controller/Sync/ISyncManager.cs') diff --git a/MediaBrowser.Api/Sync/SyncService.cs b/MediaBrowser.Api/Sync/SyncService.cs index ab4e75923..0036b316f 100644 --- a/MediaBrowser.Api/Sync/SyncService.cs +++ b/MediaBrowser.Api/Sync/SyncService.cs @@ -85,6 +85,13 @@ namespace MediaBrowser.Api.Sync { } + [Route("/Sync/Items/Ready", "GET", Summary = "Gets ready to download sync items.")] + public class GetReadySyncItems : IReturn> + { + [ApiMember(Name = "TargetId", Description = "TargetId", IsRequired = true, DataType = "string", ParameterType = "query", Verb = "GET")] + public string TargetId { get; set; } + } + [Authenticated] public class SyncService : BaseApiService { @@ -207,5 +214,10 @@ namespace MediaBrowser.Api.Sync await _syncManager.ReportOfflineAction(action).ConfigureAwait(false); } } + + public object Get(GetReadySyncItems request) + { + return ToOptimizedResult(_syncManager.GetReadySyncItems(request.TargetId)); + } } } diff --git a/MediaBrowser.Controller/Entities/BaseItem.cs b/MediaBrowser.Controller/Entities/BaseItem.cs index aea04187d..90427de75 100644 --- a/MediaBrowser.Controller/Entities/BaseItem.cs +++ b/MediaBrowser.Controller/Entities/BaseItem.cs @@ -14,6 +14,7 @@ using MediaBrowser.Model.Dto; using MediaBrowser.Model.Entities; using MediaBrowser.Model.Library; using MediaBrowser.Model.Logging; +using MediaBrowser.Model.Users; using System; using System.Collections.Generic; using System.IO; @@ -21,7 +22,6 @@ using System.Linq; using System.Runtime.Serialization; using System.Threading; using System.Threading.Tasks; -using MediaBrowser.Model.Users; namespace MediaBrowser.Controller.Entities { diff --git a/MediaBrowser.Controller/Net/IWebSocketConnection.cs b/MediaBrowser.Controller/Net/IWebSocketConnection.cs index 83ead5a12..37fd6708d 100644 --- a/MediaBrowser.Controller/Net/IWebSocketConnection.cs +++ b/MediaBrowser.Controller/Net/IWebSocketConnection.cs @@ -1,5 +1,4 @@ -using MediaBrowser.Common.Net; -using MediaBrowser.Model.Net; +using MediaBrowser.Model.Net; using System; using System.Threading; using System.Threading.Tasks; diff --git a/MediaBrowser.Controller/Sync/ISyncManager.cs b/MediaBrowser.Controller/Sync/ISyncManager.cs index e16a978c3..39cec4f00 100644 --- a/MediaBrowser.Controller/Sync/ISyncManager.cs +++ b/MediaBrowser.Controller/Sync/ISyncManager.cs @@ -82,18 +82,18 @@ namespace MediaBrowser.Controller.Sync /// SyncJobItem. SyncJobItem GetJobItem(string id); - /// - /// Gets the job item information. - /// - /// The identifier. - /// SyncedItem. - SyncedItem GetJobItemInfo(string id); - /// /// Reports the offline action. /// /// The action. /// Task. Task ReportOfflineAction(UserAction action); + + /// + /// Gets the ready synchronize items. + /// + /// The target identifier. + /// List<SyncedItem>. + List GetReadySyncItems(string targetId); } } diff --git a/MediaBrowser.Dlna/Main/DlnaEntryPoint.cs b/MediaBrowser.Dlna/Main/DlnaEntryPoint.cs index dc4aff190..810b1e568 100644 --- a/MediaBrowser.Dlna/Main/DlnaEntryPoint.cs +++ b/MediaBrowser.Dlna/Main/DlnaEntryPoint.cs @@ -7,7 +7,6 @@ using MediaBrowser.Controller.Dlna; using MediaBrowser.Controller.Drawing; using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Localization; -using MediaBrowser.Controller.Net; using MediaBrowser.Controller.Persistence; using MediaBrowser.Controller.Plugins; using MediaBrowser.Controller.Session; diff --git a/MediaBrowser.Model/Configuration/ServerConfiguration.cs b/MediaBrowser.Model/Configuration/ServerConfiguration.cs index 730735499..ba5b6a122 100644 --- a/MediaBrowser.Model/Configuration/ServerConfiguration.cs +++ b/MediaBrowser.Model/Configuration/ServerConfiguration.cs @@ -165,6 +165,7 @@ namespace MediaBrowser.Model.Configuration public string[] InsecureApps7 { get; set; } public bool SaveMetadataHidden { get; set; } + public bool EnableWin8HttpListener { get; set; } public NameValuePair[] ContentTypes { get; set; } @@ -180,6 +181,7 @@ namespace MediaBrowser.Model.Configuration EnableDashboardResponseCaching = true; EnableAutomaticRestart = true; + EnableWin8HttpListener = true; EnableUPnP = true; diff --git a/MediaBrowser.Model/Sync/DeviceFileInfo.cs b/MediaBrowser.Model/Sync/DeviceFileInfo.cs index bc93b69bc..bb9a0c6ef 100644 --- a/MediaBrowser.Model/Sync/DeviceFileInfo.cs +++ b/MediaBrowser.Model/Sync/DeviceFileInfo.cs @@ -3,7 +3,7 @@ namespace MediaBrowser.Model.Sync { public class DeviceFileInfo { - public string Path { get; set; } + public string[] Path { get; set; } public string Name { get; set; } } } diff --git a/MediaBrowser.Model/Sync/ItemFIleInfo.cs b/MediaBrowser.Model/Sync/ItemFIleInfo.cs index 8095b0cff..ef19973a2 100644 --- a/MediaBrowser.Model/Sync/ItemFIleInfo.cs +++ b/MediaBrowser.Model/Sync/ItemFIleInfo.cs @@ -18,7 +18,7 @@ namespace MediaBrowser.Model.Sync /// Gets or sets the path. /// /// The path. - public string Path { get; set; } + public string[] Path { get; set; } /// /// Gets or sets the type of the image. /// diff --git a/MediaBrowser.Server.Implementations/Connect/ConnectEntryPoint.cs b/MediaBrowser.Server.Implementations/Connect/ConnectEntryPoint.cs index 5acec2d6b..52ec5c9b1 100644 --- a/MediaBrowser.Server.Implementations/Connect/ConnectEntryPoint.cs +++ b/MediaBrowser.Server.Implementations/Connect/ConnectEntryPoint.cs @@ -1,7 +1,6 @@ using MediaBrowser.Common.Configuration; using MediaBrowser.Common.Net; using MediaBrowser.Controller.Connect; -using MediaBrowser.Controller.Net; using MediaBrowser.Controller.Plugins; using MediaBrowser.Model.Logging; using System; diff --git a/MediaBrowser.Server.Implementations/EntryPoints/UdpServerEntryPoint.cs b/MediaBrowser.Server.Implementations/EntryPoints/UdpServerEntryPoint.cs index d97ccb9bd..386c16513 100644 --- a/MediaBrowser.Server.Implementations/EntryPoints/UdpServerEntryPoint.cs +++ b/MediaBrowser.Server.Implementations/EntryPoints/UdpServerEntryPoint.cs @@ -1,6 +1,5 @@ using MediaBrowser.Common.Net; using MediaBrowser.Controller; -using MediaBrowser.Controller.Net; using MediaBrowser.Controller.Plugins; using MediaBrowser.Model.Logging; using MediaBrowser.Model.Serialization; diff --git a/MediaBrowser.Server.Implementations/EntryPoints/UsageEntryPoint.cs b/MediaBrowser.Server.Implementations/EntryPoints/UsageEntryPoint.cs index 098a1d2bd..fcc664011 100644 --- a/MediaBrowser.Server.Implementations/EntryPoints/UsageEntryPoint.cs +++ b/MediaBrowser.Server.Implementations/EntryPoints/UsageEntryPoint.cs @@ -1,8 +1,6 @@ using MediaBrowser.Common; using MediaBrowser.Common.Extensions; -using MediaBrowser.Common.Implementations.Security; using MediaBrowser.Common.Net; -using MediaBrowser.Controller.Net; using MediaBrowser.Controller.Plugins; using MediaBrowser.Controller.Session; using MediaBrowser.Model.Logging; diff --git a/MediaBrowser.Server.Implementations/EntryPoints/UsageReporter.cs b/MediaBrowser.Server.Implementations/EntryPoints/UsageReporter.cs index 940be6d02..36ba55828 100644 --- a/MediaBrowser.Server.Implementations/EntryPoints/UsageReporter.cs +++ b/MediaBrowser.Server.Implementations/EntryPoints/UsageReporter.cs @@ -4,7 +4,6 @@ using System; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; -using MediaBrowser.Controller.Net; namespace MediaBrowser.Server.Implementations.EntryPoints { diff --git a/MediaBrowser.Server.Implementations/HttpServer/HttpListenerHost.cs b/MediaBrowser.Server.Implementations/HttpServer/HttpListenerHost.cs index b754a943a..c3228db92 100644 --- a/MediaBrowser.Server.Implementations/HttpServer/HttpListenerHost.cs +++ b/MediaBrowser.Server.Implementations/HttpServer/HttpListenerHost.cs @@ -1,7 +1,6 @@ using Funq; using MediaBrowser.Common; using MediaBrowser.Common.Extensions; -using MediaBrowser.Common.Net; using MediaBrowser.Controller.Net; using MediaBrowser.Model.Logging; using MediaBrowser.Server.Implementations.HttpServer.NetListener; @@ -205,10 +204,7 @@ namespace MediaBrowser.Server.Implementations.HttpServer { HostContext.Config.HandlerFactoryPath = ListenerRequest.GetHandlerPathIfAny(UrlPrefixes.First()); - _listener = _supportsNativeWebSocket && NativeWebSocket.IsSupported - //? _listener = new HttpListenerServer(_logger, OnRequestReceived) - ? _listener = new WebSocketSharpListener(_logger, OnRequestReceived) - : _listener = new WebSocketSharpListener(_logger, OnRequestReceived); + _listener = GetListener(); _listener.WebSocketHandler = WebSocketHandler; _listener.ErrorHandler = ErrorHandler; @@ -217,6 +213,16 @@ namespace MediaBrowser.Server.Implementations.HttpServer _listener.Start(UrlPrefixes); } + private IHttpListener GetListener() + { + if (_supportsNativeWebSocket && NativeWebSocket.IsSupported) + { + return new HttpListenerServer(_logger, OnRequestReceived); + } + + return new WebSocketSharpListener(_logger, OnRequestReceived); + } + private void WebSocketHandler(WebSocketConnectEventArgs args) { if (WebSocketConnected != null) diff --git a/MediaBrowser.Server.Implementations/HttpServer/IHttpListener.cs b/MediaBrowser.Server.Implementations/HttpServer/IHttpListener.cs index dfde34e25..e77600e93 100644 --- a/MediaBrowser.Server.Implementations/HttpServer/IHttpListener.cs +++ b/MediaBrowser.Server.Implementations/HttpServer/IHttpListener.cs @@ -1,9 +1,8 @@ -using System.Threading.Tasks; -using MediaBrowser.Common.Net; -using MediaBrowser.Controller.Net; +using MediaBrowser.Controller.Net; using ServiceStack.Web; using System; using System.Collections.Generic; +using System.Threading.Tasks; namespace MediaBrowser.Server.Implementations.HttpServer { diff --git a/MediaBrowser.Server.Implementations/HttpServer/NativeWebSocket.cs b/MediaBrowser.Server.Implementations/HttpServer/NativeWebSocket.cs index f8e8bb9dd..cac2f8e09 100644 --- a/MediaBrowser.Server.Implementations/HttpServer/NativeWebSocket.cs +++ b/MediaBrowser.Server.Implementations/HttpServer/NativeWebSocket.cs @@ -1,10 +1,9 @@ -using System.Text; -using MediaBrowser.Common.Events; -using MediaBrowser.Common.Net; +using MediaBrowser.Common.Events; using MediaBrowser.Controller.Net; using MediaBrowser.Model.Logging; using System; using System.Net.WebSockets; +using System.Text; using System.Threading; using System.Threading.Tasks; using WebSocketMessageType = MediaBrowser.Model.Net.WebSocketMessageType; diff --git a/MediaBrowser.Server.Implementations/HttpServer/NetListener/HttpListenerServer.cs b/MediaBrowser.Server.Implementations/HttpServer/NetListener/HttpListenerServer.cs index 9635854d4..31c0e87b3 100644 --- a/MediaBrowser.Server.Implementations/HttpServer/NetListener/HttpListenerServer.cs +++ b/MediaBrowser.Server.Implementations/HttpServer/NetListener/HttpListenerServer.cs @@ -1,5 +1,4 @@ -using MediaBrowser.Common.Net; -using MediaBrowser.Controller.Net; +using MediaBrowser.Controller.Net; using MediaBrowser.Model.Logging; using ServiceStack; using ServiceStack.Host.HttpListener; diff --git a/MediaBrowser.Server.Implementations/HttpServer/SocketSharp/SharpWebSocket.cs b/MediaBrowser.Server.Implementations/HttpServer/SocketSharp/SharpWebSocket.cs index 354b1e20f..401d49325 100644 --- a/MediaBrowser.Server.Implementations/HttpServer/SocketSharp/SharpWebSocket.cs +++ b/MediaBrowser.Server.Implementations/HttpServer/SocketSharp/SharpWebSocket.cs @@ -1,12 +1,9 @@ -using System.Text; -using MediaBrowser.Common.Events; -using MediaBrowser.Common.Net; +using MediaBrowser.Common.Events; using MediaBrowser.Controller.Net; using MediaBrowser.Model.Logging; using System; using System.Threading; using System.Threading.Tasks; -using WebSocketMessageType = MediaBrowser.Model.Net.WebSocketMessageType; using WebSocketState = MediaBrowser.Model.Net.WebSocketState; namespace MediaBrowser.Server.Implementations.HttpServer.SocketSharp diff --git a/MediaBrowser.Server.Implementations/HttpServer/SocketSharp/WebSocketSharpListener.cs b/MediaBrowser.Server.Implementations/HttpServer/SocketSharp/WebSocketSharpListener.cs index ffaecc0d5..4d2d57b6e 100644 --- a/MediaBrowser.Server.Implementations/HttpServer/SocketSharp/WebSocketSharpListener.cs +++ b/MediaBrowser.Server.Implementations/HttpServer/SocketSharp/WebSocketSharpListener.cs @@ -1,5 +1,4 @@ -using MediaBrowser.Common.Net; -using MediaBrowser.Controller.Net; +using MediaBrowser.Controller.Net; using MediaBrowser.Model.Logging; using ServiceStack; using ServiceStack.Web; diff --git a/MediaBrowser.Server.Implementations/ServerManager/WebSocketConnection.cs b/MediaBrowser.Server.Implementations/ServerManager/WebSocketConnection.cs index a8950da89..9f75d522c 100644 --- a/MediaBrowser.Server.Implementations/ServerManager/WebSocketConnection.cs +++ b/MediaBrowser.Server.Implementations/ServerManager/WebSocketConnection.cs @@ -1,5 +1,4 @@ using MediaBrowser.Common.Events; -using MediaBrowser.Common.Net; using MediaBrowser.Controller.Net; using MediaBrowser.Model.Logging; using MediaBrowser.Model.Net; diff --git a/MediaBrowser.Server.Implementations/Session/WebSocketController.cs b/MediaBrowser.Server.Implementations/Session/WebSocketController.cs index 0788ed2ce..8eb129876 100644 --- a/MediaBrowser.Server.Implementations/Session/WebSocketController.cs +++ b/MediaBrowser.Server.Implementations/Session/WebSocketController.cs @@ -1,5 +1,4 @@ -using MediaBrowser.Common.Net; -using MediaBrowser.Controller.Net; +using MediaBrowser.Controller.Net; using MediaBrowser.Controller.Session; using MediaBrowser.Model.Entities; using MediaBrowser.Model.Logging; diff --git a/MediaBrowser.Server.Implementations/Sync/SyncManager.cs b/MediaBrowser.Server.Implementations/Sync/SyncManager.cs index a9e257a8c..22d0ee5e7 100644 --- a/MediaBrowser.Server.Implementations/Sync/SyncManager.cs +++ b/MediaBrowser.Server.Implementations/Sync/SyncManager.cs @@ -32,12 +32,12 @@ namespace MediaBrowser.Server.Implementations.Sync private readonly IImageProcessor _imageProcessor; private readonly ILogger _logger; private readonly IUserManager _userManager; - private readonly IDtoService _dtoService; + private readonly Func _dtoService; private readonly IApplicationHost _appHost; private ISyncProvider[] _providers = { }; - public SyncManager(ILibraryManager libraryManager, ISyncRepository repo, IImageProcessor imageProcessor, ILogger logger, IUserManager userManager, IDtoService dtoService, IApplicationHost appHost) + public SyncManager(ILibraryManager libraryManager, ISyncRepository repo, IImageProcessor imageProcessor, ILogger logger, IUserManager userManager, Func dtoService, IApplicationHost appHost) { _libraryManager = libraryManager; _repo = repo; @@ -323,9 +323,8 @@ namespace MediaBrowser.Server.Implementations.Sync return _repo.GetJobItems(query); } - public SyncedItem GetJobItemInfo(string id) + private SyncedItem GetJobItemInfo(SyncJobItem jobItem) { - var jobItem = GetJobItem(id); var job = _repo.GetJob(jobItem.JobId); var libraryItem = _libraryManager.GetItemById(jobItem.ItemId); @@ -338,7 +337,7 @@ namespace MediaBrowser.Server.Implementations.Sync UserId = job.UserId }; - syncedItem.Item = _dtoService.GetBaseItemDto(libraryItem, new DtoOptions()); + syncedItem.Item = _dtoService().GetBaseItemDto(libraryItem, new DtoOptions()); // TODO: this should be the media source of the transcoded output syncedItem.Item.MediaSources = syncedItem.Item.MediaSources @@ -365,5 +364,16 @@ namespace MediaBrowser.Server.Implementations.Sync { return Task.FromResult(true); } + + public List GetReadySyncItems(string targetId) + { + var jobItemResult = GetJobItems(new SyncJobItemQuery + { + TargetId = targetId, + //Status = SyncJobItemStatus.Transferring + }); + + return jobItemResult.Items.Select(GetJobItemInfo).ToList(); + } } } diff --git a/MediaBrowser.Server.Implementations/Sync/SyncRepository.cs b/MediaBrowser.Server.Implementations/Sync/SyncRepository.cs index 2ff6d7ae6..a981ffc57 100644 --- a/MediaBrowser.Server.Implementations/Sync/SyncRepository.cs +++ b/MediaBrowser.Server.Implementations/Sync/SyncRepository.cs @@ -36,7 +36,7 @@ namespace MediaBrowser.Server.Implementations.Sync public async Task Initialize() { - var dbFile = Path.Combine(_appPaths.DataPath, "sync7.db"); + var dbFile = Path.Combine(_appPaths.DataPath, "sync8.db"); _connection = await SqliteExtensions.ConnectToDb(dbFile, _logger).ConfigureAwait(false); @@ -298,7 +298,8 @@ namespace MediaBrowser.Server.Implementations.Sync _deleteJobCommand.Transaction = transaction; _deleteJobCommand.ExecuteNonQuery(); - _deleteJobItemsCommand.GetParameter(index++).Value = new Guid(id); + index = 0; + _deleteJobItemsCommand.GetParameter(index++).Value = id; _deleteJobItemsCommand.Transaction = transaction; _deleteJobItemsCommand.ExecuteNonQuery(); @@ -607,11 +608,16 @@ namespace MediaBrowser.Server.Implementations.Sync var info = new SyncJobItem { Id = reader.GetGuid(0).ToString("N"), - ItemId = reader.GetString(1), - MediaSourceId = reader.GetString(2), - JobId = reader.GetString(3) + ItemId = reader.GetString(1) }; + if (!reader.IsDBNull(2)) + { + info.MediaSourceId = reader.GetString(2); + } + + info.JobId = reader.GetString(3); + if (!reader.IsDBNull(4)) { info.OutputPath = reader.GetString(4); diff --git a/MediaBrowser.Server.Implementations/Udp/UdpServer.cs b/MediaBrowser.Server.Implementations/Udp/UdpServer.cs index d80e0b66e..91a4940ae 100644 --- a/MediaBrowser.Server.Implementations/Udp/UdpServer.cs +++ b/MediaBrowser.Server.Implementations/Udp/UdpServer.cs @@ -1,6 +1,5 @@ using MediaBrowser.Common.Net; using MediaBrowser.Controller; -using MediaBrowser.Controller.Net; using MediaBrowser.Model.ApiClient; using MediaBrowser.Model.Logging; using MediaBrowser.Model.Serialization; diff --git a/MediaBrowser.Server.Mac/Native/BaseMonoApp.cs b/MediaBrowser.Server.Mac/Native/BaseMonoApp.cs index a2c860413..576b5b75f 100644 --- a/MediaBrowser.Server.Mac/Native/BaseMonoApp.cs +++ b/MediaBrowser.Server.Mac/Native/BaseMonoApp.cs @@ -67,7 +67,7 @@ namespace MediaBrowser.Server.Mac return list; } - public void AuthorizeServer(int httpServerPort, string httpServerUrlPrefix, int udpPort, string tempDirectory) + public void AuthorizeServer(int udpPort, int httpServerPort, string tempDirectory) { } diff --git a/MediaBrowser.Server.Mono/Native/BaseMonoApp.cs b/MediaBrowser.Server.Mono/Native/BaseMonoApp.cs index 227c32242..7f61570a4 100644 --- a/MediaBrowser.Server.Mono/Native/BaseMonoApp.cs +++ b/MediaBrowser.Server.Mono/Native/BaseMonoApp.cs @@ -1,5 +1,4 @@ using MediaBrowser.Common.Net; -using MediaBrowser.Controller.Net; using MediaBrowser.IsoMounter; using MediaBrowser.Model.Logging; using MediaBrowser.Server.Mono.Networking; @@ -84,7 +83,7 @@ namespace MediaBrowser.Server.Mono.Native return list; } - public void AuthorizeServer(int httpServerPort, string httpServerUrlPrefix, int udpPort, string tempDirectory) + public void AuthorizeServer(int udpPort, int httpServerPort, string tempDirectory) { } diff --git a/MediaBrowser.Server.Mono/Networking/NetworkManager.cs b/MediaBrowser.Server.Mono/Networking/NetworkManager.cs index d76a7c7ee..60c250115 100644 --- a/MediaBrowser.Server.Mono/Networking/NetworkManager.cs +++ b/MediaBrowser.Server.Mono/Networking/NetworkManager.cs @@ -1,6 +1,5 @@ using MediaBrowser.Common.Implementations.Networking; using MediaBrowser.Common.Net; -using MediaBrowser.Controller.Net; using MediaBrowser.Model.IO; using MediaBrowser.Model.Logging; using MediaBrowser.Model.Net; diff --git a/MediaBrowser.Server.Startup.Common/ApplicationHost.cs b/MediaBrowser.Server.Startup.Common/ApplicationHost.cs index 06d63b355..8398c63cb 100644 --- a/MediaBrowser.Server.Startup.Common/ApplicationHost.cs +++ b/MediaBrowser.Server.Startup.Common/ApplicationHost.cs @@ -224,7 +224,7 @@ namespace MediaBrowser.Server.Startup.Common private readonly StartupOptions _startupOptions; private readonly string _remotePackageName; - private readonly bool _supportsNativeWebSocket; + private bool _supportsNativeWebSocket; internal INativeApp NativeApp { get; set; } @@ -454,6 +454,18 @@ namespace MediaBrowser.Server.Startup.Common RegisterSingleInstance(() => new SearchEngine(LogManager, LibraryManager, UserManager)); + if (IsFirstRun) + { + ServerConfigurationManager.Configuration.EnableWin8HttpListener = false; + ServerConfigurationManager.SaveConfiguration(); + _supportsNativeWebSocket = false; + } + + if (!ServerConfigurationManager.Configuration.EnableWin8HttpListener) + { + _supportsNativeWebSocket = false; + } + HttpServer = ServerFactory.CreateServer(this, LogManager, "Media Browser", WebApplicationName, "dashboard/index.html", _supportsNativeWebSocket); RegisterSingleInstance(HttpServer, false); progress.Report(10); @@ -470,7 +482,7 @@ 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); + SyncManager = new SyncManager(LibraryManager, SyncRepository, ImageProcessor, LogManager.GetLogger("SyncManager"), UserManager, () => DtoService, this); RegisterSingleInstance(SyncManager); DtoService = new DtoService(Logger, LibraryManager, UserDataManager, ItemRepository, ImageProcessor, ServerConfigurationManager, FileSystemManager, ProviderManager, () => ChannelManager, SyncManager, this); @@ -735,7 +747,7 @@ namespace MediaBrowser.Server.Startup.Common ServerManager.AddWebSocketListeners(GetExports(false)); - StartServer(true); + StartServer(); LibraryManager.AddParts(GetExports(), GetExports(), @@ -773,8 +785,7 @@ namespace MediaBrowser.Server.Startup.Common /// /// Starts the server. /// - /// if set to true [retry on failure]. - private void StartServer(bool retryOnFailure) + private void StartServer() { try { @@ -784,16 +795,7 @@ namespace MediaBrowser.Server.Startup.Common { Logger.ErrorException("Error starting http server", ex); - if (retryOnFailure) - { - RegisterServerWithAdministratorAccess(); - - StartServer(false); - } - else - { - throw; - } + throw; } } @@ -1070,9 +1072,8 @@ namespace MediaBrowser.Server.Startup.Common try { NativeApp.AuthorizeServer( - ServerConfigurationManager.Configuration.HttpServerPortNumber, - HttpServerUrlPrefixes.First(), UdpServerEntryPoint.PortNumber, + ServerConfigurationManager.Configuration.HttpServerPortNumber, ConfigurationManager.CommonApplicationPaths.TempDirectory); } catch (Exception ex) diff --git a/MediaBrowser.Server.Startup.Common/INativeApp.cs b/MediaBrowser.Server.Startup.Common/INativeApp.cs index cf0135fa8..4abea57fb 100644 --- a/MediaBrowser.Server.Startup.Common/INativeApp.cs +++ b/MediaBrowser.Server.Startup.Common/INativeApp.cs @@ -1,5 +1,4 @@ using MediaBrowser.Common.Net; -using MediaBrowser.Controller.Net; using MediaBrowser.Model.Logging; using System.Collections.Generic; using System.Reflection; @@ -17,11 +16,10 @@ namespace MediaBrowser.Server.Startup.Common /// /// Authorizes the server. /// - /// The HTTP server port. - /// The HTTP server URL prefix. /// The UDP port. + /// The HTTP server port. /// The temporary directory. - void AuthorizeServer(int httpServerPort, string httpServerUrlPrefix, int udpPort, string tempDirectory); + void AuthorizeServer(int udpPort, int httpServerPort, string tempDirectory); /// /// Gets the environment. diff --git a/MediaBrowser.ServerApplication/Native/RegisterServer.bat b/MediaBrowser.ServerApplication/Native/RegisterServer.bat index 350412344..3346ecb31 100644 --- a/MediaBrowser.ServerApplication/Native/RegisterServer.bat +++ b/MediaBrowser.ServerApplication/Native/RegisterServer.bat @@ -1,21 +1,15 @@ -rem %1 = http server port -rem %2 = http server url -rem %3 = udp server port +rem %1 = udp server port +rem %2 = http server port if [%1]==[] GOTO DONE -netsh advfirewall firewall delete rule name="Port %1" protocol=TCP localport=%1 -netsh advfirewall firewall add rule name="Port %1" dir=in action=allow protocol=TCP localport=%1 +netsh advfirewall firewall delete rule name="Port %1" protocol=UDP localport=%1 +netsh advfirewall firewall add rule name="Port %1" dir=in action=allow protocol=UDP localport=%1 if [%2]==[] GOTO DONE -netsh http del urlacl url="%2" user="NT AUTHORITY\Authenticated Users" -netsh http add urlacl url="%2" user="NT AUTHORITY\Authenticated Users" - -if [%3]==[] GOTO DONE - -netsh advfirewall firewall delete rule name="Port %3" protocol=UDP localport=%3 -netsh advfirewall firewall add rule name="Port %3" dir=in action=allow protocol=UDP localport=%3 +netsh advfirewall firewall delete rule name="Port %2" protocol=TCP localport=%2 +netsh advfirewall firewall add rule name="Port %2" dir=in action=allow protocol=TCP localport=%2 :DONE diff --git a/MediaBrowser.ServerApplication/Native/ServerAuthorization.cs b/MediaBrowser.ServerApplication/Native/ServerAuthorization.cs index e5989db3b..d9063aa58 100644 --- a/MediaBrowser.ServerApplication/Native/ServerAuthorization.cs +++ b/MediaBrowser.ServerApplication/Native/ServerAuthorization.cs @@ -13,11 +13,10 @@ namespace MediaBrowser.ServerApplication.Native /// /// Authorizes the server. /// - /// The HTTP server port. - /// The HTTP server URL prefix. /// The UDP port. + /// The HTTP server port. /// The temp directory. - public static void AuthorizeServer(int httpServerPort, string httpServerUrlPrefix, int udpPort, string tempDirectory) + public static void AuthorizeServer(int udpPort, int httpServerPort, string tempDirectory) { Directory.CreateDirectory(tempDirectory); @@ -37,9 +36,7 @@ namespace MediaBrowser.ServerApplication.Native { FileName = tmpFile, - Arguments = string.Format("{0} {1} {2}", httpServerPort, - httpServerUrlPrefix, - udpPort), + Arguments = string.Format("{0} {1}", udpPort, httpServerPort), CreateNoWindow = true, WindowStyle = ProcessWindowStyle.Hidden, diff --git a/MediaBrowser.ServerApplication/Native/WindowsApp.cs b/MediaBrowser.ServerApplication/Native/WindowsApp.cs index 071216418..0970d6537 100644 --- a/MediaBrowser.ServerApplication/Native/WindowsApp.cs +++ b/MediaBrowser.ServerApplication/Native/WindowsApp.cs @@ -1,5 +1,4 @@ using MediaBrowser.Common.Net; -using MediaBrowser.Controller.Net; using MediaBrowser.IsoMounter; using MediaBrowser.Model.Logging; using MediaBrowser.Server.Startup.Common; @@ -22,9 +21,9 @@ namespace MediaBrowser.ServerApplication.Native return list; } - public void AuthorizeServer(int httpServerPort, string httpServerUrlPrefix, int udpPort, string tempDirectory) + public void AuthorizeServer(int httpServerPort, int udpPort, string tempDirectory) { - ServerAuthorization.AuthorizeServer(httpServerPort, httpServerUrlPrefix, udpPort, tempDirectory); + ServerAuthorization.AuthorizeServer(udpPort, httpServerPort, tempDirectory); } public NativeEnvironment Environment diff --git a/MediaBrowser.ServerApplication/Networking/NetworkManager.cs b/MediaBrowser.ServerApplication/Networking/NetworkManager.cs index 4dbe0f347..fc4d26363 100644 --- a/MediaBrowser.ServerApplication/Networking/NetworkManager.cs +++ b/MediaBrowser.ServerApplication/Networking/NetworkManager.cs @@ -1,6 +1,5 @@ using MediaBrowser.Common.Implementations.Networking; using MediaBrowser.Common.Net; -using MediaBrowser.Controller.Net; using MediaBrowser.Model.IO; using MediaBrowser.Model.Logging; using MediaBrowser.Model.Net; diff --git a/Nuget/MediaBrowser.Common.Internal.nuspec b/Nuget/MediaBrowser.Common.Internal.nuspec index 3fd559a4d..80e2f32f7 100644 --- a/Nuget/MediaBrowser.Common.Internal.nuspec +++ b/Nuget/MediaBrowser.Common.Internal.nuspec @@ -2,7 +2,7 @@ MediaBrowser.Common.Internal - 3.0.532 + 3.0.533 MediaBrowser.Common.Internal Luke ebr,Luke,scottisafool @@ -12,7 +12,7 @@ Contains common components shared by Media Browser Theater and Media Browser Server. Not intended for plugin developer consumption. Copyright © Media Browser 2013 - + diff --git a/Nuget/MediaBrowser.Common.nuspec b/Nuget/MediaBrowser.Common.nuspec index 84eec30d6..8c22ebb5d 100644 --- a/Nuget/MediaBrowser.Common.nuspec +++ b/Nuget/MediaBrowser.Common.nuspec @@ -2,7 +2,7 @@ MediaBrowser.Common - 3.0.532 + 3.0.533 MediaBrowser.Common Media Browser Team ebr,Luke,scottisafool diff --git a/Nuget/MediaBrowser.Model.Signed.nuspec b/Nuget/MediaBrowser.Model.Signed.nuspec index ad3bd826d..f313bd7a5 100644 --- a/Nuget/MediaBrowser.Model.Signed.nuspec +++ b/Nuget/MediaBrowser.Model.Signed.nuspec @@ -2,7 +2,7 @@ MediaBrowser.Model.Signed - 3.0.532 + 3.0.533 MediaBrowser.Model - Signed Edition Media Browser Team ebr,Luke,scottisafool diff --git a/Nuget/MediaBrowser.Server.Core.nuspec b/Nuget/MediaBrowser.Server.Core.nuspec index 191ab9e88..a31f8023b 100644 --- a/Nuget/MediaBrowser.Server.Core.nuspec +++ b/Nuget/MediaBrowser.Server.Core.nuspec @@ -2,7 +2,7 @@ MediaBrowser.Server.Core - 3.0.532 + 3.0.533 Media Browser.Server.Core Media Browser Team ebr,Luke,scottisafool @@ -12,7 +12,7 @@ Contains core components required to build plugins for Media Browser Server. Copyright © Media Browser 2013 - + -- cgit v1.2.3 From 800a16a2130ed49204a8b1358e62901077285a82 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Mon, 29 Dec 2014 00:56:55 -0500 Subject: sync updates --- MediaBrowser.Api/Sync/SyncService.cs | 12 ++++++++++++ MediaBrowser.Controller/Sync/ISyncManager.cs | 7 +++++++ .../MediaBrowser.Model.Portable.csproj | 6 ++++++ MediaBrowser.Model.net35/MediaBrowser.Model.net35.csproj | 6 ++++++ MediaBrowser.Model/ApiClient/IApiClient.cs | 7 +++++++ MediaBrowser.Model/MediaBrowser.Model.csproj | 2 ++ MediaBrowser.Model/Sync/DeviceFileInfo.cs | 2 +- MediaBrowser.Model/Sync/ItemFIleInfo.cs | 2 +- MediaBrowser.Model/Sync/LocalItem.cs | 2 +- MediaBrowser.Model/Sync/SyncDataRequest.cs | 16 ++++++++++++++++ MediaBrowser.Model/Sync/SyncDataResponse.cs | 14 ++++++++++++++ MediaBrowser.Server.Implementations/Sync/SyncManager.cs | 7 +++++++ Nuget/MediaBrowser.Common.Internal.nuspec | 4 ++-- Nuget/MediaBrowser.Common.nuspec | 2 +- Nuget/MediaBrowser.Model.Signed.nuspec | 2 +- Nuget/MediaBrowser.Server.Core.nuspec | 4 ++-- 16 files changed, 86 insertions(+), 9 deletions(-) create mode 100644 MediaBrowser.Model/Sync/SyncDataRequest.cs create mode 100644 MediaBrowser.Model/Sync/SyncDataResponse.cs (limited to 'MediaBrowser.Controller/Sync/ISyncManager.cs') diff --git a/MediaBrowser.Api/Sync/SyncService.cs b/MediaBrowser.Api/Sync/SyncService.cs index 0036b316f..31442c1d9 100644 --- a/MediaBrowser.Api/Sync/SyncService.cs +++ b/MediaBrowser.Api/Sync/SyncService.cs @@ -92,6 +92,11 @@ namespace MediaBrowser.Api.Sync public string TargetId { get; set; } } + [Route("/Sync/Data", "POST", Summary = "Syncs data between device and server")] + public class SyncData : SyncDataRequest, IReturn + { + } + [Authenticated] public class SyncService : BaseApiService { @@ -219,5 +224,12 @@ namespace MediaBrowser.Api.Sync { return ToOptimizedResult(_syncManager.GetReadySyncItems(request.TargetId)); } + + public async Task Post(SyncData request) + { + var response = await _syncManager.SyncData(request).ConfigureAwait(false); + + return ToOptimizedResult(response); + } } } diff --git a/MediaBrowser.Controller/Sync/ISyncManager.cs b/MediaBrowser.Controller/Sync/ISyncManager.cs index 39cec4f00..6cad19736 100644 --- a/MediaBrowser.Controller/Sync/ISyncManager.cs +++ b/MediaBrowser.Controller/Sync/ISyncManager.cs @@ -95,5 +95,12 @@ namespace MediaBrowser.Controller.Sync /// The target identifier. /// List<SyncedItem>. List GetReadySyncItems(string targetId); + + /// + /// Synchronizes the data. + /// + /// The request. + /// Task<SyncDataResponse>. + Task SyncData(SyncDataRequest request); } } diff --git a/MediaBrowser.Model.Portable/MediaBrowser.Model.Portable.csproj b/MediaBrowser.Model.Portable/MediaBrowser.Model.Portable.csproj index f4d92b6f3..e4cfab571 100644 --- a/MediaBrowser.Model.Portable/MediaBrowser.Model.Portable.csproj +++ b/MediaBrowser.Model.Portable/MediaBrowser.Model.Portable.csproj @@ -1055,6 +1055,12 @@ Sync\SyncCategory.cs + + Sync\SyncDataRequest.cs + + + Sync\SyncDataResponse.cs + Sync\SyncDialogOptions.cs diff --git a/MediaBrowser.Model.net35/MediaBrowser.Model.net35.csproj b/MediaBrowser.Model.net35/MediaBrowser.Model.net35.csproj index b07e8557f..3fc5201a7 100644 --- a/MediaBrowser.Model.net35/MediaBrowser.Model.net35.csproj +++ b/MediaBrowser.Model.net35/MediaBrowser.Model.net35.csproj @@ -1014,6 +1014,12 @@ Sync\SyncCategory.cs + + Sync\SyncDataRequest.cs + + + Sync\SyncDataResponse.cs + Sync\SyncDialogOptions.cs diff --git a/MediaBrowser.Model/ApiClient/IApiClient.cs b/MediaBrowser.Model/ApiClient/IApiClient.cs index 883e54308..9faa8fced 100644 --- a/MediaBrowser.Model/ApiClient/IApiClient.cs +++ b/MediaBrowser.Model/ApiClient/IApiClient.cs @@ -1433,5 +1433,12 @@ namespace MediaBrowser.Model.ApiClient /// The target identifier. /// List<SyncedItem>. Task> GetReadySyncItems(string targetId); + + /// + /// Synchronizes the data. + /// + /// The request. + /// Task<SyncDataResponse>. + Task SyncData(SyncDataRequest request); } } \ No newline at end of file diff --git a/MediaBrowser.Model/MediaBrowser.Model.csproj b/MediaBrowser.Model/MediaBrowser.Model.csproj index 8ec271626..d5280f4b1 100644 --- a/MediaBrowser.Model/MediaBrowser.Model.csproj +++ b/MediaBrowser.Model/MediaBrowser.Model.csproj @@ -372,6 +372,8 @@ + + diff --git a/MediaBrowser.Model/Sync/DeviceFileInfo.cs b/MediaBrowser.Model/Sync/DeviceFileInfo.cs index bb9a0c6ef..bc93b69bc 100644 --- a/MediaBrowser.Model/Sync/DeviceFileInfo.cs +++ b/MediaBrowser.Model/Sync/DeviceFileInfo.cs @@ -3,7 +3,7 @@ namespace MediaBrowser.Model.Sync { public class DeviceFileInfo { - public string[] Path { get; set; } + public string Path { get; set; } public string Name { get; set; } } } diff --git a/MediaBrowser.Model/Sync/ItemFIleInfo.cs b/MediaBrowser.Model/Sync/ItemFIleInfo.cs index f0829bc2b..b110af6b5 100644 --- a/MediaBrowser.Model/Sync/ItemFIleInfo.cs +++ b/MediaBrowser.Model/Sync/ItemFIleInfo.cs @@ -18,7 +18,7 @@ namespace MediaBrowser.Model.Sync /// Gets or sets the path. /// /// The path. - public string[] Path { get; set; } + public string Path { get; set; } /// /// Gets or sets the type of the image. /// diff --git a/MediaBrowser.Model/Sync/LocalItem.cs b/MediaBrowser.Model/Sync/LocalItem.cs index 9e660c590..51faaff90 100644 --- a/MediaBrowser.Model/Sync/LocalItem.cs +++ b/MediaBrowser.Model/Sync/LocalItem.cs @@ -13,7 +13,7 @@ namespace MediaBrowser.Model.Sync /// Gets or sets the local path. /// /// The local path. - public string[] LocalPath { get; set; } + public string LocalPath { get; set; } /// /// Gets or sets the server identifier. /// diff --git a/MediaBrowser.Model/Sync/SyncDataRequest.cs b/MediaBrowser.Model/Sync/SyncDataRequest.cs new file mode 100644 index 000000000..3eb447b3f --- /dev/null +++ b/MediaBrowser.Model/Sync/SyncDataRequest.cs @@ -0,0 +1,16 @@ +using System.Collections.Generic; + +namespace MediaBrowser.Model.Sync +{ + public class SyncDataRequest + { + public List LocalItemIds { get; set; } + + public string TargetId { get; set; } + + public SyncDataRequest() + { + LocalItemIds = new List(); + } + } +} diff --git a/MediaBrowser.Model/Sync/SyncDataResponse.cs b/MediaBrowser.Model/Sync/SyncDataResponse.cs new file mode 100644 index 000000000..ac7ff5c84 --- /dev/null +++ b/MediaBrowser.Model/Sync/SyncDataResponse.cs @@ -0,0 +1,14 @@ +using System.Collections.Generic; + +namespace MediaBrowser.Model.Sync +{ + public class SyncDataResponse + { + public List ItemIdsToRemove { get; set; } + + public SyncDataResponse() + { + ItemIdsToRemove = new List(); + } + } +} diff --git a/MediaBrowser.Server.Implementations/Sync/SyncManager.cs b/MediaBrowser.Server.Implementations/Sync/SyncManager.cs index 24b9b0b83..3f30dcb1c 100644 --- a/MediaBrowser.Server.Implementations/Sync/SyncManager.cs +++ b/MediaBrowser.Server.Implementations/Sync/SyncManager.cs @@ -388,5 +388,12 @@ namespace MediaBrowser.Server.Implementations.Sync return jobItemResult.Items.Select(GetJobItemInfo) .ToList(); } + + public async Task SyncData(SyncDataRequest request) + { + var response = new SyncDataResponse(); + + return response; + } } } diff --git a/Nuget/MediaBrowser.Common.Internal.nuspec b/Nuget/MediaBrowser.Common.Internal.nuspec index f637622ef..c4588f825 100644 --- a/Nuget/MediaBrowser.Common.Internal.nuspec +++ b/Nuget/MediaBrowser.Common.Internal.nuspec @@ -2,7 +2,7 @@ MediaBrowser.Common.Internal - 3.0.534 + 3.0.537 MediaBrowser.Common.Internal Luke ebr,Luke,scottisafool @@ -12,7 +12,7 @@ Contains common components shared by Media Browser Theater and Media Browser Server. Not intended for plugin developer consumption. Copyright © Media Browser 2013 - + diff --git a/Nuget/MediaBrowser.Common.nuspec b/Nuget/MediaBrowser.Common.nuspec index eddbcd0d2..125dd6d28 100644 --- a/Nuget/MediaBrowser.Common.nuspec +++ b/Nuget/MediaBrowser.Common.nuspec @@ -2,7 +2,7 @@ MediaBrowser.Common - 3.0.534 + 3.0.537 MediaBrowser.Common Media Browser Team ebr,Luke,scottisafool diff --git a/Nuget/MediaBrowser.Model.Signed.nuspec b/Nuget/MediaBrowser.Model.Signed.nuspec index 7e10950b0..1a7d948c5 100644 --- a/Nuget/MediaBrowser.Model.Signed.nuspec +++ b/Nuget/MediaBrowser.Model.Signed.nuspec @@ -2,7 +2,7 @@ MediaBrowser.Model.Signed - 3.0.534 + 3.0.537 MediaBrowser.Model - Signed Edition Media Browser Team ebr,Luke,scottisafool diff --git a/Nuget/MediaBrowser.Server.Core.nuspec b/Nuget/MediaBrowser.Server.Core.nuspec index 7fde54fe4..b63ff3ca1 100644 --- a/Nuget/MediaBrowser.Server.Core.nuspec +++ b/Nuget/MediaBrowser.Server.Core.nuspec @@ -2,7 +2,7 @@ MediaBrowser.Server.Core - 3.0.534 + 3.0.537 Media Browser.Server.Core Media Browser Team ebr,Luke,scottisafool @@ -12,7 +12,7 @@ Contains core components required to build plugins for Media Browser Server. Copyright © Media Browser 2013 - + -- cgit v1.2.3 From 8f26921d0056f1146e8f773700078174b9642a26 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Wed, 31 Dec 2014 01:24:49 -0500 Subject: create sync job items pages --- MediaBrowser.Api/Sync/SyncService.cs | 18 +++- MediaBrowser.Controller/Sync/ISyncManager.cs | 11 ++- MediaBrowser.Controller/Sync/ISyncProvider.cs | 7 ++ MediaBrowser.Model/Devices/DeviceQuery.cs | 5 + MediaBrowser.Model/Sync/SyncJob.cs | 1 - MediaBrowser.Model/Sync/SyncJobItem.cs | 16 +++ MediaBrowser.Model/Sync/SyncJobItemQuery.cs | 5 + MediaBrowser.Model/Sync/SyncJobItemStatus.cs | 5 +- MediaBrowser.Model/Sync/SyncJobQuery.cs | 5 + MediaBrowser.Model/Sync/SyncQuality.cs | 6 +- .../Devices/DeviceManager.cs | 7 +- .../Localization/JavaScript/de.json | 14 +-- .../Localization/JavaScript/it.json | 52 +++++----- .../Localization/JavaScript/javascript.json | 12 ++- .../Localization/JavaScript/pt_BR.json | 4 +- .../Localization/Server/de.json | 14 +-- .../Localization/Server/it.json | 46 ++++----- .../Localization/Server/pt_BR.json | 6 +- .../Localization/Server/server.json | 6 +- .../MediaBrowser.Server.Implementations.csproj | 1 - .../Sync/AppSyncProvider.cs | 14 +++ .../Sync/CloudSyncProvider.cs | 8 +- .../Sync/MockSyncProvider.cs | 33 ------- .../Sync/SyncJobProcessor.cs | 6 ++ .../Sync/SyncManager.cs | 107 ++++++++++++++++++--- .../Sync/SyncRepository.cs | 60 +++++++----- MediaBrowser.WebDashboard/Api/PackageCreator.cs | 1 + .../MediaBrowser.WebDashboard.csproj | 12 +++ 28 files changed, 326 insertions(+), 156 deletions(-) delete mode 100644 MediaBrowser.Server.Implementations/Sync/MockSyncProvider.cs (limited to 'MediaBrowser.Controller/Sync/ISyncManager.cs') diff --git a/MediaBrowser.Api/Sync/SyncService.cs b/MediaBrowser.Api/Sync/SyncService.cs index 31442c1d9..a7467c12f 100644 --- a/MediaBrowser.Api/Sync/SyncService.cs +++ b/MediaBrowser.Api/Sync/SyncService.cs @@ -28,6 +28,11 @@ namespace MediaBrowser.Api.Sync public string Id { get; set; } } + [Route("/Sync/Jobs/{Id}", "POST", Summary = "Updates a sync job.")] + public class UpdateSyncJob : SyncJob, IReturnVoid + { + } + [Route("/Sync/JobItems", "GET", Summary = "Gets sync job items.")] public class GetSyncJobItems : SyncJobItemQuery, IReturn> { @@ -118,9 +123,9 @@ namespace MediaBrowser.Api.Sync return ToOptimizedResult(result); } - public object Get(GetSyncJobs request) + public async Task Get(GetSyncJobs request) { - var result = _syncManager.GetJobs(request); + var result = await _syncManager.GetJobs(request).ConfigureAwait(false); return ToOptimizedResult(result); } @@ -193,7 +198,7 @@ namespace MediaBrowser.Api.Sync } }; - var dtos = request.ItemIds.Split(',') + var dtos = request.ItemIds.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries) .Select(_libraryManager.GetItemById) .Where(i => i != null) .Select(i => _dtoService.GetBaseItemDto(i, dtoOptions)) @@ -231,5 +236,12 @@ namespace MediaBrowser.Api.Sync return ToOptimizedResult(response); } + + public void Post(UpdateSyncJob request) + { + var task = _syncManager.UpdateJob(request); + + Task.WaitAll(task); + } } } diff --git a/MediaBrowser.Controller/Sync/ISyncManager.cs b/MediaBrowser.Controller/Sync/ISyncManager.cs index 6cad19736..59136c0e6 100644 --- a/MediaBrowser.Controller/Sync/ISyncManager.cs +++ b/MediaBrowser.Controller/Sync/ISyncManager.cs @@ -2,9 +2,9 @@ using MediaBrowser.Model.Dlna; using MediaBrowser.Model.Querying; using MediaBrowser.Model.Sync; +using MediaBrowser.Model.Users; using System.Collections.Generic; using System.Threading.Tasks; -using MediaBrowser.Model.Users; namespace MediaBrowser.Controller.Sync { @@ -21,7 +21,7 @@ namespace MediaBrowser.Controller.Sync /// Gets the jobs. /// /// QueryResult<SyncJob>. - QueryResult GetJobs(SyncJobQuery query); + Task> GetJobs(SyncJobQuery query); /// /// Gets the job items. @@ -37,6 +37,13 @@ namespace MediaBrowser.Controller.Sync /// SyncJob. SyncJob GetJob(string id); + /// + /// Updates the job. + /// + /// The job. + /// Task. + Task UpdateJob(SyncJob job); + /// /// Cancels the job. /// diff --git a/MediaBrowser.Controller/Sync/ISyncProvider.cs b/MediaBrowser.Controller/Sync/ISyncProvider.cs index 5ebdee207..af08edb5e 100644 --- a/MediaBrowser.Controller/Sync/ISyncProvider.cs +++ b/MediaBrowser.Controller/Sync/ISyncProvider.cs @@ -18,6 +18,13 @@ namespace MediaBrowser.Controller.Sync /// IEnumerable<SyncTarget>. IEnumerable GetSyncTargets(); + /// + /// Gets the synchronize targets. + /// + /// The user identifier. + /// IEnumerable<SyncTarget>. + IEnumerable GetSyncTargets(string userId); + /// /// Gets the device profile. /// diff --git a/MediaBrowser.Model/Devices/DeviceQuery.cs b/MediaBrowser.Model/Devices/DeviceQuery.cs index c3b4313f4..2cd2389d8 100644 --- a/MediaBrowser.Model/Devices/DeviceQuery.cs +++ b/MediaBrowser.Model/Devices/DeviceQuery.cs @@ -18,5 +18,10 @@ namespace MediaBrowser.Model.Devices /// /// null if [supports synchronize] contains no value, true if [supports synchronize]; otherwise, false. public bool? SupportsSync { get; set; } + /// + /// Gets or sets the user identifier. + /// + /// The user identifier. + public string UserId { get; set; } } } diff --git a/MediaBrowser.Model/Sync/SyncJob.cs b/MediaBrowser.Model/Sync/SyncJob.cs index 92662d7bb..24680d172 100644 --- a/MediaBrowser.Model/Sync/SyncJob.cs +++ b/MediaBrowser.Model/Sync/SyncJob.cs @@ -89,7 +89,6 @@ namespace MediaBrowser.Model.Sync public string ParentName { get; set; } public string PrimaryImageItemId { get; set; } public string PrimaryImageTag { get; set; } - public double? PrimaryImageAspectRatio { get; set; } public SyncJob() { diff --git a/MediaBrowser.Model/Sync/SyncJobItem.cs b/MediaBrowser.Model/Sync/SyncJobItem.cs index d9fb1ed09..4090d82b0 100644 --- a/MediaBrowser.Model/Sync/SyncJobItem.cs +++ b/MediaBrowser.Model/Sync/SyncJobItem.cs @@ -22,6 +22,12 @@ namespace MediaBrowser.Model.Sync /// The item identifier. public string ItemId { get; set; } + /// + /// Gets or sets the name of the item. + /// + /// The name of the item. + public string ItemName { get; set; } + /// /// Gets or sets the media source identifier. /// @@ -57,5 +63,15 @@ namespace MediaBrowser.Model.Sync /// /// The date created. public DateTime DateCreated { get; set; } + /// + /// Gets or sets the primary image item identifier. + /// + /// The primary image item identifier. + public string PrimaryImageItemId { get; set; } + /// + /// Gets or sets the primary image tag. + /// + /// The primary image tag. + public string PrimaryImageTag { get; set; } } } diff --git a/MediaBrowser.Model/Sync/SyncJobItemQuery.cs b/MediaBrowser.Model/Sync/SyncJobItemQuery.cs index f2cf781a3..d21138204 100644 --- a/MediaBrowser.Model/Sync/SyncJobItemQuery.cs +++ b/MediaBrowser.Model/Sync/SyncJobItemQuery.cs @@ -29,6 +29,11 @@ namespace MediaBrowser.Model.Sync /// /// The status. public List Statuses { get; set; } + /// + /// Gets or sets a value indicating whether [add metadata]. + /// + /// true if [add metadata]; otherwise, false. + public bool AddMetadata { get; set; } public SyncJobItemQuery() { diff --git a/MediaBrowser.Model/Sync/SyncJobItemStatus.cs b/MediaBrowser.Model/Sync/SyncJobItemStatus.cs index 606f8cde4..913f9e259 100644 --- a/MediaBrowser.Model/Sync/SyncJobItemStatus.cs +++ b/MediaBrowser.Model/Sync/SyncJobItemStatus.cs @@ -7,7 +7,8 @@ namespace MediaBrowser.Model.Sync Converting = 1, Transferring = 2, Synced = 3, - Failed = 4, - RemovedFromDevice = 5 + RemovedFromDevice = 4, + Failed = 5, + Cancelled = 6 } } diff --git a/MediaBrowser.Model/Sync/SyncJobQuery.cs b/MediaBrowser.Model/Sync/SyncJobQuery.cs index 2af06bcfa..35f0e076d 100644 --- a/MediaBrowser.Model/Sync/SyncJobQuery.cs +++ b/MediaBrowser.Model/Sync/SyncJobQuery.cs @@ -23,5 +23,10 @@ namespace MediaBrowser.Model.Sync /// /// The target identifier. public string TargetId { get; set; } + /// + /// Gets or sets the user identifier. + /// + /// The user identifier. + public string UserId { get; set; } } } diff --git a/MediaBrowser.Model/Sync/SyncQuality.cs b/MediaBrowser.Model/Sync/SyncQuality.cs index f915e2768..d34ad22c2 100644 --- a/MediaBrowser.Model/Sync/SyncQuality.cs +++ b/MediaBrowser.Model/Sync/SyncQuality.cs @@ -6,16 +6,16 @@ namespace MediaBrowser.Model.Sync /// /// The good /// - Good = 0, + Low = 0, /// /// The better /// - Better = 1, + Medium = 1, /// /// The best /// - Best = 2 + High = 2 } } diff --git a/MediaBrowser.Server.Implementations/Devices/DeviceManager.cs b/MediaBrowser.Server.Implementations/Devices/DeviceManager.cs index 3810fec66..99fa40789 100644 --- a/MediaBrowser.Server.Implementations/Devices/DeviceManager.cs +++ b/MediaBrowser.Server.Implementations/Devices/DeviceManager.cs @@ -105,7 +105,12 @@ namespace MediaBrowser.Server.Implementations.Devices var val = query.SupportsUniqueIdentifier.Value; devices = devices.Where(i => GetCapabilities(i.Id).SupportsUniqueIdentifier == val); - } + } + + if (!string.IsNullOrWhiteSpace(query.UserId)) + { + devices = devices.Where(i => CanAccessDevice(query.UserId, i.Id)); + } var array = devices.ToArray(); return new QueryResult diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/de.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/de.json index 051e8a745..3b34c2ca5 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/de.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/de.json @@ -40,11 +40,11 @@ "LabelStopping": "Stoppe", "LabelCancelled": "(abgebrochen)", "LabelFailed": "(fehlgeschlagen)", - "ButtonHelp": "Help", + "ButtonHelp": "Hilfe", "HeaderLibraryAccess": "Bibliothekszugriff", "HeaderChannelAccess": "Channelzugriff", - "HeaderDeviceAccess": "Device Access", - "HeaderSelectDevices": "Select Devices", + "HeaderDeviceAccess": "Ger\u00e4te Zugang", + "HeaderSelectDevices": "Ger\u00e4t w\u00e4hlen", "LabelAbortedByServerShutdown": "(Durch herunterfahrenden Server abgebrochen)", "LabelScheduledTaskLastRan": "Zuletzt ausgef\u00fchrt vor: {0}. Ben\u00f6tigte Zeit: {1}.", "HeaderDeleteTaskTrigger": "Entferne Aufgabenausl\u00f6ser", @@ -254,7 +254,7 @@ "ButtonMoveRight": "Nach rechts", "ButtonBrowseOnlineImages": "Durchsuche Onlinebilder", "HeaderDeleteItem": "L\u00f6sche Element", - "ConfirmDeleteItem": "Deleting this item will delete it from both the file system and your media library. Are you sure you wish to continue?", + "ConfirmDeleteItem": "L\u00f6schen dieses Eintrages bedeutet das L\u00f6schen der Datei und das Entfernen aus der Medien-Bibliothek. M\u00f6chten Sie wirklich fortfahren?", "MessagePleaseEnterNameOrId": "Bitte gib einen Namen oder eine externe Id an.", "MessageValueNotCorrect": "Der eingegeben Wert ist nicht korrekt. Bitte versuche es noch einmal.", "MessageItemSaved": "Element gespeichert", @@ -417,7 +417,7 @@ "HeaderMediaLocations": "Medienquellen", "LabelFolderTypeValue": "Verzeichnistyp: {0}", "LabelPathSubstitutionHelp": "Optional: Die Pfadersetzung kann Serverpfade zu Netzwerkfreigaben umleiten, die von Endger\u00e4ten f\u00fcr die direkte Wiedergabe genutzt werden k\u00f6nnen.", - "FolderTypeUnset": "Unset (mixed content)", + "FolderTypeUnset": "Keine Auswahl (gemischter Inhalt)", "FolderTypeMovies": "Filme", "FolderTypeMusic": "Musik", "FolderTypeAdultVideos": "Videos f\u00fcr Erwachsene", @@ -593,7 +593,7 @@ "WebClientTourMobile2": "und steuert einfach andere Ger\u00e4te und Media Browser Anwendungen", "MessageEnjoyYourStay": "Genie\u00dfe deinen Aufenthalt", "DashboardTourDashboard": "Die Server\u00fcbersicht erlaubt es dir deinen Server und dessen Benutzer im Blick zu behalten. Somit wei\u00dft du immer wer gerade was macht und wo er sich befindet.", - "DashboardTourHelp": "In-app help provides easy buttons to open wiki pages relating to the on-screen content.", + "DashboardTourHelp": "Die In-App-Hilfe Schaltfl\u00e4che bietet eine schnelle M\u00f6glichkeit um eine Wiki-Seite zum aktuellen Inhalt zu \u00f6ffnen.", "DashboardTourUsers": "Erstelle einfach Benutzeraccounts f\u00fcr Freunde und Familie. Jeder mit seinen individuellen Einstellungen bei Berechtigungen, Blibliothekenzugriff, Kindersicherung und mehr.", "DashboardTourCinemaMode": "Der Kino-Modus bringt das Kinoerlebnis direkt in dein Wohnzimmer, mit der F\u00e4higkeit Trailer und benutzerdefinierte Intros vor dem Hauptfilm zu spielen.", "DashboardTourChapters": "Aktiviere die Bildgenerierung f\u00fcr die Kapitel deiner Videos f\u00fcr eine bessere Darstellung w\u00e4hrend des Ansehens.", @@ -656,5 +656,5 @@ "LabelItemLimitHelp": "Optional. Legen Sie die maximale Anzahl der zu synchronisierenden Eintr\u00e4ge fest.", "MessageBookPluginRequired": "Setzt die Installation des Bookshelf-Plugins voraus.", "MessageGamePluginRequired": "Setzt die Installation des GameBrowser-Plugins voraus.", - "MessageUnsetContentHelp": "Content will be displayed as plain folders. For best results use the metadata manager to set the content types of sub-folders." + "MessageUnsetContentHelp": "Inhalte werden als Verzeichnisse dargestellt. F\u00fcr eine besser Anzeige nutzen Sie nach M\u00f6glichkeit den Meta-Data Manager und w\u00e4hlen Sie einen Medien-Typen f\u00fcr Unterverzeichnisse." } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/it.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/it.json index f6d57b44c..8892ce5f8 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/it.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/it.json @@ -40,11 +40,11 @@ "LabelStopping": "Sto fermando", "LabelCancelled": "(cancellato)", "LabelFailed": "(fallito)", - "ButtonHelp": "Help", + "ButtonHelp": "Aiuto", "HeaderLibraryAccess": "Accesso libreria", "HeaderChannelAccess": "Accesso canali", - "HeaderDeviceAccess": "Device Access", - "HeaderSelectDevices": "Select Devices", + "HeaderDeviceAccess": "Accesso dispositivo", + "HeaderSelectDevices": "Seleziona periferiche", "LabelAbortedByServerShutdown": "(Interrotto dalla chiusura del server)", "LabelScheduledTaskLastRan": "Ultima esecuzione {0}, taking {1}.", "HeaderDeleteTaskTrigger": "Elimina Operazione pianificata", @@ -254,7 +254,7 @@ "ButtonMoveRight": "Muovi a destra", "ButtonBrowseOnlineImages": "Sfoglia le immagini Online", "HeaderDeleteItem": "Elimina elemento", - "ConfirmDeleteItem": "Deleting this item will delete it from both the file system and your media library. Are you sure you wish to continue?", + "ConfirmDeleteItem": "L'eliminazione di questo articolo sar\u00e0 eliminarlo sia dal file system e la vostra libreria multimediale. Sei sicuro di voler continuare?", "MessagePleaseEnterNameOrId": "Inserisci il nome o id esterno.", "MessageValueNotCorrect": "Il valore inserito non \u00e8 corretto.Riprova di nuovo.", "MessageItemSaved": "Elemento salvato.", @@ -401,7 +401,7 @@ "LabelYear": "Anno:", "LabelDateOfBirth": "Data nascita:", "LabelBirthYear": "Anno nascita:", - "LabelBirthDate": "Birth date:", + "LabelBirthDate": "Data nascita:", "LabelDeathDate": "Anno morte:", "HeaderRemoveMediaLocation": "Rimuovi percorso media", "MessageConfirmRemoveMediaLocation": "Sei sicuro di voler rimuovere questa posizione?", @@ -417,7 +417,7 @@ "HeaderMediaLocations": "Posizioni Media", "LabelFolderTypeValue": "Tipo cartella: {0}", "LabelPathSubstitutionHelp": "Opzionale: cambio Path pu\u00f2 mappare i percorsi del server a condivisioni di rete che i clienti possono accedere per la riproduzione diretta.", - "FolderTypeUnset": "Unset (mixed content)", + "FolderTypeUnset": "Disinserito (contenuto misto)", "FolderTypeMovies": "Film", "FolderTypeMusic": "Musica", "FolderTypeAdultVideos": "Video per adulti", @@ -426,7 +426,7 @@ "FolderTypeHomeVideos": "Video personali", "FolderTypeGames": "Giochi", "FolderTypeBooks": "Libri", - "FolderTypeTvShows": "TV", + "FolderTypeTvShows": "Tv", "TabMovies": "Film", "TabSeries": "Serie TV", "TabEpisodes": "Episodi", @@ -593,7 +593,7 @@ "WebClientTourMobile2": "e controlla facilmente altri dispositivi e applicazioni Media Browser", "MessageEnjoyYourStay": "Godetevi il vostro soggiorno", "DashboardTourDashboard": "Il pannello di controllo del server consente di monitorare il vostro server e gli utenti. Potrai sempre sapere chi sta facendo cosa e dove sono.", - "DashboardTourHelp": "In-app help provides easy buttons to open wiki pages relating to the on-screen content.", + "DashboardTourHelp": "In-app help offre pulsanti facili da aprire le pagine wiki relative al contenuto sullo schermo.", "DashboardTourUsers": "Facile creazione di account utente per i vostri amici e la famiglia, ognuno con le proprie autorizzazioni, accesso alla libreria, controlli parentali e altro ancora.", "DashboardTourCinemaMode": "Modalit\u00e0 Cinema porta l'esperienza del teatro direttamente nel tuo salotto con la possibilit\u00e0 di giocare trailer e intro personalizzati prima la caratteristica principale.", "DashboardTourChapters": "Abilita capitolo generazione di immagini per i vostri video per una presentazione pi\u00f9 gradevole durante la visualizzazione.", @@ -617,7 +617,7 @@ "MessageInvitationSentToUser": "Una e-mail \u00e8 stata inviata a {0}, invitandoli ad accettare l'invito di condivisione.", "MessageInvitationSentToNewUser": "Una e-mail \u00e8 stata inviata a {0} invitandoli a firmare con Media Browser.", "HeaderConnectionFailure": "Errore di connessione", - "MessageUnableToConnectToServer": "We're unable to connect to the selected server right now. Please try again later.", + "MessageUnableToConnectToServer": "Non siamo in grado di connettersi al server selezionato al momento. Si prega di riprovare pi\u00f9 tardi.", "ButtonSelectServer": "Selezionare il server", "MessagePluginConfigurationRequiresLocalAccess": "Per configurare questo plugin si prega di accedere al proprio server locale direttamente.", "MessageLoggedOutParentalControl": "L'accesso \u00e8 attualmente limitato. Si prega di riprovare pi\u00f9 tardi.", @@ -635,26 +635,26 @@ "ButtonLinkMyMediaBrowserAccount": "Collega il mio account", "MessageConnectAccountRequiredToInviteGuest": "Per invitare gli ospiti \u00e8 necessario collegare prima il tuo account browser media a questo server.", "ButtonSync": "Sinc.", - "SyncMedia": "Sync Media", + "SyncMedia": "Sync media", "HeaderCancelSyncJob": "Cancel Sync", - "CancelSyncJobConfirmation": "Are you sure you wish to cancel this sync job?", + "CancelSyncJobConfirmation": "Sei sicuro di voler annullare questo lavoro di sincronizzazione?", "TabSync": "Sinc", - "MessagePleaseSelectDeviceToSyncTo": "Please select a device to sync to.", + "MessagePleaseSelectDeviceToSyncTo": "Selezionare un dispositivo per la sincronizzazione", "MessageSyncJobCreated": "Sync job created.", "LabelSyncTo": "Sync to:", "LabelSyncJobName": "Sync job name:", - "LabelQuality": "Quality:", - "OptionHigh": "High", - "OptionMedium": "Medium", - "OptionLow": "Low", - "HeaderSettings": "Settings", - "OptionAutomaticallySyncNewContent": "Automatically sync new content", - "OptionAutomaticallySyncNewContentHelp": "New content added to this category will be automatically synced to the device.", - "OptionSyncUnwatchedVideosOnly": "Sync unwatched videos only", - "OptionSyncUnwatchedVideosOnlyHelp": "Only unwatched videos will be synced, and videos will be removed from the device as they are watched.", - "LabelItemLimit": "Item limit:", - "LabelItemLimitHelp": "Optional. Set a limit to the number of items that will be synced.", - "MessageBookPluginRequired": "Requires installation of the Bookshelf plugin", - "MessageGamePluginRequired": "Requires installation of the GameBrowser plugin", - "MessageUnsetContentHelp": "Content will be displayed as plain folders. For best results use the metadata manager to set the content types of sub-folders." + "LabelQuality": "Qualit\u00e0:", + "OptionHigh": "Alto", + "OptionMedium": "Medio", + "OptionLow": "Basso", + "HeaderSettings": "Configurazione", + "OptionAutomaticallySyncNewContent": "Sincronizza automaticamente nuovi contenuti", + "OptionAutomaticallySyncNewContentHelp": "Nuovi contenuti aggiunti a questa categoria viene sincronizzata automaticamente al dispositivo.", + "OptionSyncUnwatchedVideosOnly": "Sincronizza solo i video non visti", + "OptionSyncUnwatchedVideosOnlyHelp": "Solo i video non visti saranno sincronizzati, e video saranno rimossi dal dispositivo in cui sono guardato.", + "LabelItemLimit": "limite elementi:", + "LabelItemLimitHelp": "Opzionale. Impostare un limite al numero di elementi che verranno sincronizzati.", + "MessageBookPluginRequired": "Richiede l'installazione del plugin Bookshelf", + "MessageGamePluginRequired": "Richiede l'installazione del plugin GameBrowser", + "MessageUnsetContentHelp": "Il contenuto verr\u00e0 visualizzato come pianura cartelle. Per ottenere i migliori risultati utilizzare il gestore di metadati per impostare i tipi di contenuto di sottocartelle." } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/javascript.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/javascript.json index ed52684c1..02fdf9b93 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/javascript.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/javascript.json @@ -41,6 +41,8 @@ "LabelCancelled": "(cancelled)", "LabelFailed": "(failed)", "ButtonHelp": "Help", + "ButtonSave": "Save", + "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the web interface.", "HeaderLibraryAccess": "Library Access", "HeaderChannelAccess": "Channel Access", "HeaderDeviceAccess": "Device Access", @@ -664,5 +666,13 @@ "LabelItemLimitHelp": "Optional. Set a limit to the number of items that will be synced.", "MessageBookPluginRequired": "Requires installation of the Bookshelf plugin", "MessageGamePluginRequired": "Requires installation of the GameBrowser plugin", - "MessageUnsetContentHelp": "Content will be displayed as plain folders. For best results use the metadata manager to set the content types of sub-folders." + "MessageUnsetContentHelp": "Content will be displayed as plain folders. For best results use the metadata manager to set the content types of sub-folders.", + "SyncJobItemStatusQueued": "Queued", + "SyncJobItemStatusConverting": "Converting", + "SyncJobItemStatusTransferring": "Transferring", + "SyncJobItemStatusSynced": "Synced", + "SyncJobItemStatusFailed": "Failed", + "SyncJobItemStatusRemovedFromDevice": "Removed from device", + "SyncJobItemStatusCancelled": "Cancelled", + "MessageJobItemHasNoActions": "d" } diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/pt_BR.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/pt_BR.json index 96f55451c..76ce474cf 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/pt_BR.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/pt_BR.json @@ -43,8 +43,8 @@ "ButtonHelp": "Ajuda", "HeaderLibraryAccess": "Acesso \u00e0 Biblioteca", "HeaderChannelAccess": "Acesso ao Canal", - "HeaderDeviceAccess": "Device Access", - "HeaderSelectDevices": "Select Devices", + "HeaderDeviceAccess": "Acesso ao Dispositivo", + "HeaderSelectDevices": "Selecionar Dispositivos", "LabelAbortedByServerShutdown": "(Abortada pelo desligamento do servidor)", "LabelScheduledTaskLastRan": "\u00daltima execu\u00e7\u00e3o {0}, demorando {1}.", "HeaderDeleteTaskTrigger": "Excluir Disparador da Tarefa", diff --git a/MediaBrowser.Server.Implementations/Localization/Server/de.json b/MediaBrowser.Server.Implementations/Localization/Server/de.json index fb886e32d..5571fa71a 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/de.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/de.json @@ -63,16 +63,16 @@ "TabPreferences": "Einstellungen", "TabPassword": "Passwort", "TabLibraryAccess": "Bibliothekenzugriff", - "TabAccess": "Access", + "TabAccess": "Zugang", "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.", + "HeaderDeviceAccess": "Ger\u00e4te Zugang", + "OptionEnableAccessFromAllDevices": "Zugriff von allen Ger\u00e4ten erlauben", + "DeviceAccessHelp": "Dies wird nur auf Ger\u00e4te angewandt die eindeutig identifiziert werden k\u00f6nnen und verhindert nicht den Web-Zugriff. Gefilterter Zugriff auf Ger\u00e4te verhindert die Nutzung neuer Ger\u00e4te solange, bis der Zugriff f\u00fcr diese freigegeben wird.", "LabelDisplayMissingEpisodesWithinSeasons": "Zeige fehlende Episoden innerhalb von Staffeln", "LabelUnairedMissingEpisodesWithinSeasons": "Zeige noch nicht ausgestahlte Episoden innerhalb von Staffeln", "HeaderVideoPlaybackSettings": "Videowiedergabe Einstellungen", @@ -380,8 +380,8 @@ "LabelMaxScreenshotsPerItem": "Maximale Anzahl von Screenshots pro Element:", "LabelMinBackdropDownloadWidth": "Minimale Breite f\u00fcr zu herunterladende Hintergr\u00fcnde:", "LabelMinScreenshotDownloadWidth": "Minimale Breite f\u00fcr zu herunterladende Screenshot:", - "ButtonAddScheduledTaskTrigger": "F\u00fcge Task Ausl\u00f6ser hinzu", - "HeaderAddScheduledTaskTrigger": "F\u00fcge Task Ausl\u00f6ser hinzu", + "ButtonAddScheduledTaskTrigger": "Ausl\u00f6ser hinzuf\u00fcgen", + "HeaderAddScheduledTaskTrigger": "Ausl\u00f6ser hinzuf\u00fcgen", "ButtonAdd": "Hinzuf\u00fcgen", "LabelTriggerType": "Ausl\u00f6ser Typ:", "OptionDaily": "T\u00e4glich", @@ -1261,7 +1261,7 @@ "HeaderTrailerReel": "Trailer Rolle", "OptionPlayUnwatchedTrailersOnly": "Spiele nur bisher nicht gesehene Trailer", "HeaderTrailerReelHelp": "Starte eine Trailer Rolle, um dir eine lang andauernde Playlist mit Trailern anzuschauen.", - "MessageNoTrailersFound": "No trailers found. Install the Trailer channel to enhance your movie experience by adding a library of internet trailers.", + "MessageNoTrailersFound": "Keine Trailer gefunden. Installieren Sie den Trailer-Channel um Ihre Film-Bibliothek mit Trailer aus dem Internet zu erweitern.", "HeaderNewUsers": "Neue Benutzer", "ButtonSignUp": "Anmeldung", "ButtonForgotPassword": "Passwort vergessen?", diff --git a/MediaBrowser.Server.Implementations/Localization/Server/it.json b/MediaBrowser.Server.Implementations/Localization/Server/it.json index c551052bd..0835b2ef5 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/it.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/it.json @@ -37,7 +37,7 @@ "ButtonOk": "OK", "ButtonCancel": "Annulla", "ButtonNew": "Nuovo", - "FolderTypeMixed": "Mixed content", + "FolderTypeMixed": "contenuto misto", "FolderTypeMovies": "Film", "FolderTypeMusic": "Musica", "FolderTypeAdultVideos": "Video per adulti", @@ -46,9 +46,9 @@ "FolderTypeHomeVideos": "Video personali", "FolderTypeGames": "Giochi", "FolderTypeBooks": "Libri", - "FolderTypeTvShows": "TV", - "FolderTypeInherit": "Inherit", - "LabelContentType": "Content type:", + "FolderTypeTvShows": "Tv", + "FolderTypeInherit": "ereditare", + "LabelContentType": "Tipo di contenuto:", "HeaderSetupLibrary": "Configura la tua libreria", "ButtonAddMediaFolder": "Aggiungi cartella", "LabelFolderType": "Tipo cartella", @@ -63,16 +63,16 @@ "TabPreferences": "Preferenze", "TabPassword": "Password", "TabLibraryAccess": "Accesso libreria", - "TabAccess": "Access", + "TabAccess": "Accesso", "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.", + "HeaderDeviceAccess": "Accesso dispositivo", + "OptionEnableAccessFromAllDevices": "Abilitare l'accesso da tutti i dispositivi", + "DeviceAccessHelp": "Questo vale solo per i dispositivi che possono essere identificati in modo univoco e non impedire l'accesso del browser. Filtraggio di accesso al dispositivo dell'utente impedir\u00e0 loro di usare nuovi dispositivi fino a quando non sono state approvate qui.", "LabelDisplayMissingEpisodesWithinSeasons": "Visualizza gli episodi mancanti nelle stagioni", "LabelUnairedMissingEpisodesWithinSeasons": "Visualizzare episodi mai andati in onda all'interno stagioni", "HeaderVideoPlaybackSettings": "Impostazioni di riproduzione video", @@ -247,10 +247,10 @@ "HeaderFeatureAccess": "Caratteristiche di accesso", "OptionAllowMediaPlayback": "Consenti la riproduzione", "OptionAllowBrowsingLiveTv": "Consenti la navigazione sulla Tv indiretta", - "OptionAllowDeleteLibraryContent": "Allow deletion of library content", + "OptionAllowDeleteLibraryContent": "Consenti cancellazione di contenuti biblioteca", "OptionAllowManageLiveTv": "Consenti la modifica delle operazioni pianificate della TV", - "OptionAllowRemoteControlOthers": "Allow remote control of other users", - "OptionAllowRemoteSharedDevices": "Allow remote control of shared devices", + "OptionAllowRemoteControlOthers": "Consenti controllo remoto di altri utenti", + "OptionAllowRemoteSharedDevices": "Consenti controllo remoto di dispositivi condivisi", "OptionAllowRemoteSharedDevicesHelp": "Dispositivi DLNA sono considerati condivisa fino a quando un utente inizia controllarlo.", "HeaderRemoteControl": "telecomando", "OptionMissingTmdbId": "Tmdb Id mancante", @@ -380,8 +380,8 @@ "LabelMaxScreenshotsPerItem": "Massimo numero di foto per oggetto:", "LabelMinBackdropDownloadWidth": "Massima larghezza sfondo:", "LabelMinScreenshotDownloadWidth": "Minima larghezza foto:", - "ButtonAddScheduledTaskTrigger": "Aggiungi operazione:", - "HeaderAddScheduledTaskTrigger": "Aggiungi operazione:", + "ButtonAddScheduledTaskTrigger": "Aggiungi operazione", + "HeaderAddScheduledTaskTrigger": "Aggiungi operazione", "ButtonAdd": "Aggiungi", "LabelTriggerType": "Tipo Evento:", "OptionDaily": "Giornal.", @@ -1261,7 +1261,7 @@ "HeaderTrailerReel": "Trailer b.", "OptionPlayUnwatchedTrailersOnly": "Riproduci solo i trailer non visti", "HeaderTrailerReelHelp": "Inizia a riprodurre una lunga playlist di trailer", - "MessageNoTrailersFound": "No trailers found. Install the Trailer channel to enhance your movie experience by adding a library of internet trailers.", + "MessageNoTrailersFound": "Nessun Trailer trovato.Installa Il plug in dei trailer per importare la libreria dei trailer da internet", "HeaderNewUsers": "Nuovo Utente", "ButtonSignUp": "Iscriviti", "ButtonForgotPassword": "Dimenticato la password?", @@ -1288,15 +1288,15 @@ "HeaderParentalRatings": "Valutazioni genitori", "HeaderVideoTypes": "Tipi Video", "HeaderYears": "Anni", - "HeaderAddTag": "Add Tag", - "LabelBlockItemsWithTags": "Block items with tags:", + "HeaderAddTag": "Aggiungi Tag", + "LabelBlockItemsWithTags": "Oggetti di blocco con tag:", "LabelTag": "Tag:", - "LabelEnableSingleImageInDidlLimit": "Limit to single embedded image", - "LabelEnableSingleImageInDidlLimitHelp": "Some devices will not render properly if multiple images are embedded within Didl.", - "TabActivity": "Activity", + "LabelEnableSingleImageInDidlLimit": "Limitato a singola immagine incorporata", + "LabelEnableSingleImageInDidlLimitHelp": "Alcuni dispositivi non renderanno correttamente se pi\u00f9 immagini sono incorporati all'interno didl.", + "TabActivity": "Attivit\u00e0", "TitleSync": "Sync", - "OptionAllowSyncContent": "Allow syncing media to devices", - "NameSeasonUnknown": "Season Unknown", - "NameSeasonNumber": "Season {0}", - "LabelNewUserNameHelp": "Usernames can contain letters (a-z), numbers (0-9), dashes (-), underscores (_), apostrophes ('), and periods (.)" + "OptionAllowSyncContent": "Consenti sincronizzazione media per dispositivi", + "NameSeasonUnknown": "Stagione sconosciuto", + "NameSeasonNumber": "Stagione {0}", + "LabelNewUserNameHelp": "I nomi utente possono contenere lettere (az), numeri (0-9), trattini (-), underscore (_), apostrofi ('), e periodi (.)" } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/Server/pt_BR.json b/MediaBrowser.Server.Implementations/Localization/Server/pt_BR.json index 4c3b9c6bb..0ae8a400f 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/pt_BR.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/pt_BR.json @@ -70,9 +70,9 @@ "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.", + "HeaderDeviceAccess": "Acesso ao Dispositivo", + "OptionEnableAccessFromAllDevices": "Ativar o acesso de todos os dispositivos", + "DeviceAccessHelp": "Isto apenas aplica para dispositivos que podem ser identificados como \u00fanicos e n\u00e3o evitar\u00e3o o acesso do navegador. Filtrar o acesso ao dispositivo do usu\u00e1rio evitar\u00e1 que sejam usados novos dispositivos at\u00e9 que sejam aprovados aqui.", "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", diff --git a/MediaBrowser.Server.Implementations/Localization/Server/server.json b/MediaBrowser.Server.Implementations/Localization/Server/server.json index 64b183b7e..cf4f0c4bf 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/server.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/server.json @@ -19,7 +19,7 @@ "TitleMediaBrowser": "Media Browser", "ThisWizardWillGuideYou": "This wizard will help guide you through the setup process. To begin, please select your preferred language.", "TellUsAboutYourself": "Tell us about yourself", - "ButtonQuickStartGuide": "Quick start guide", + "ButtonQuickStartGuide": "Quick start guide", "LabelYourFirstName": "Your first name:", "MoreUsersCanBeAddedLater": "More users can be added later within the Dashboard.", "UserProfilesIntro": "Media Browser includes built-in support for user profiles, enabling each user to have their own display settings, playstate and parental controls.", @@ -38,6 +38,7 @@ "ButtonOk": "Ok", "ButtonCancel": "Cancel", "ButtonNew": "New", + "HeaderSyncJobInfo": "Sync Job", "FolderTypeMixed": "Mixed content", "FolderTypeMovies": "Movies", "FolderTypeMusic": "Music", @@ -1315,5 +1316,6 @@ "OptionAllowSyncContent": "Allow syncing media to devices", "NameSeasonUnknown": "Season Unknown", "NameSeasonNumber": "Season {0}", - "LabelNewUserNameHelp": "Usernames can contain letters (a-z), numbers (0-9), dashes (-), underscores (_), apostrophes ('), and periods (.)" + "LabelNewUserNameHelp": "Usernames can contain letters (a-z), numbers (0-9), dashes (-), underscores (_), apostrophes ('), and periods (.)", + "TabSyncJobs": "Sync Jobs" } diff --git a/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj b/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj index f9f482b96..4e698b12f 100644 --- a/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj +++ b/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj @@ -302,7 +302,6 @@ - diff --git a/MediaBrowser.Server.Implementations/Sync/AppSyncProvider.cs b/MediaBrowser.Server.Implementations/Sync/AppSyncProvider.cs index deef503ea..8f6129dca 100644 --- a/MediaBrowser.Server.Implementations/Sync/AppSyncProvider.cs +++ b/MediaBrowser.Server.Implementations/Sync/AppSyncProvider.cs @@ -30,6 +30,20 @@ namespace MediaBrowser.Server.Implementations.Sync }); } + public IEnumerable GetSyncTargets(string userId) + { + return _deviceManager.GetDevices(new DeviceQuery + { + SupportsSync = true, + UserId = userId + + }).Items.Select(i => new SyncTarget + { + Id = i.Id, + Name = i.Name + }); + } + public DeviceProfile GetDeviceProfile(SyncTarget target) { return new DeviceProfile(); diff --git a/MediaBrowser.Server.Implementations/Sync/CloudSyncProvider.cs b/MediaBrowser.Server.Implementations/Sync/CloudSyncProvider.cs index fd12b1f8a..da3ecdfa6 100644 --- a/MediaBrowser.Server.Implementations/Sync/CloudSyncProvider.cs +++ b/MediaBrowser.Server.Implementations/Sync/CloudSyncProvider.cs @@ -2,7 +2,6 @@ using MediaBrowser.Controller.Sync; using MediaBrowser.Model.Dlna; using MediaBrowser.Model.Sync; -using System; using System.Collections.Generic; using System.Linq; @@ -10,7 +9,7 @@ namespace MediaBrowser.Server.Implementations.Sync { public class CloudSyncProvider : ISyncProvider { - private ICloudSyncProvider[] _providers = new ICloudSyncProvider[] {}; + private ICloudSyncProvider[] _providers = {}; public CloudSyncProvider(IApplicationHost appHost) { @@ -22,6 +21,11 @@ namespace MediaBrowser.Server.Implementations.Sync return new List(); } + public IEnumerable GetSyncTargets(string userId) + { + return new List(); + } + public DeviceProfile GetDeviceProfile(SyncTarget target) { return new DeviceProfile(); diff --git a/MediaBrowser.Server.Implementations/Sync/MockSyncProvider.cs b/MediaBrowser.Server.Implementations/Sync/MockSyncProvider.cs deleted file mode 100644 index 7d29446b9..000000000 --- a/MediaBrowser.Server.Implementations/Sync/MockSyncProvider.cs +++ /dev/null @@ -1,33 +0,0 @@ -using MediaBrowser.Common.Extensions; -using MediaBrowser.Controller.Sync; -using MediaBrowser.Model.Dlna; -using MediaBrowser.Model.Sync; -using System.Collections.Generic; - -namespace MediaBrowser.Server.Implementations.Sync -{ - public class MockSyncProvider : ISyncProvider - { - public string Name - { - get { return "Test Sync"; } - } - - public IEnumerable GetSyncTargets() - { - return new List - { - new SyncTarget - { - Id = GetType().Name.GetMD5().ToString("N"), - Name = Name - } - }; - } - - public DeviceProfile GetDeviceProfile(SyncTarget target) - { - return new DeviceProfile(); - } - } -} diff --git a/MediaBrowser.Server.Implementations/Sync/SyncJobProcessor.cs b/MediaBrowser.Server.Implementations/Sync/SyncJobProcessor.cs index 44e95f07d..97c6a6dc8 100644 --- a/MediaBrowser.Server.Implementations/Sync/SyncJobProcessor.cs +++ b/MediaBrowser.Server.Implementations/Sync/SyncJobProcessor.cs @@ -81,6 +81,7 @@ namespace MediaBrowser.Server.Implementations.Sync { Id = Guid.NewGuid().ToString("N"), ItemId = itemId, + ItemName = GetSyncJobItemName(item), JobId = job.Id, TargetId = job.TargetId, DateCreated = DateTime.UtcNow @@ -98,6 +99,11 @@ namespace MediaBrowser.Server.Implementations.Sync await UpdateJobStatus(job, jobItems).ConfigureAwait(false); } + private string GetSyncJobItemName(BaseItem item) + { + return item.Name; + } + public Task UpdateJobStatus(string id) { var job = _syncRepo.GetJob(id); diff --git a/MediaBrowser.Server.Implementations/Sync/SyncManager.cs b/MediaBrowser.Server.Implementations/Sync/SyncManager.cs index 199c6a975..7e8db3e6a 100644 --- a/MediaBrowser.Server.Implementations/Sync/SyncManager.cs +++ b/MediaBrowser.Server.Implementations/Sync/SyncManager.cs @@ -73,11 +73,7 @@ namespace MediaBrowser.Server.Implementations.Sync if (string.IsNullOrWhiteSpace(request.Name)) { - if (request.Category.HasValue) - { - request.Name = request.Category.Value.ToString(); - } - else if (request.ItemIds.Count == 1) + if (request.ItemIds.Count == 1) { request.Name = GetDefaultName(_libraryManager.GetItemById(request.ItemIds[0])); } @@ -132,21 +128,49 @@ namespace MediaBrowser.Server.Implementations.Sync }; } - public QueryResult GetJobs(SyncJobQuery query) + public Task UpdateJob(SyncJob job) + { + // Get fresh from the db and only update the fields that are supported to be changed. + var instance = _repo.GetJob(job.Id); + + instance.Name = job.Name; + instance.Quality = job.Quality; + instance.UnwatchedOnly = job.UnwatchedOnly; + instance.SyncNewContent = job.SyncNewContent; + instance.ItemLimit = job.ItemLimit; + + return _repo.Update(instance); + } + + public async Task> GetJobs(SyncJobQuery query) { var result = _repo.GetJobs(query); - result.Items.ForEach(FillMetadata); + foreach (var item in result.Items) + { + await FillMetadata(item).ConfigureAwait(false); + } return result; } - private void FillMetadata(SyncJob job) + private async Task FillMetadata(SyncJob job) { var item = job.RequestedItemIds .Select(_libraryManager.GetItemById) .FirstOrDefault(i => i != null); + if (item == null) + { + var processor = new SyncJobProcessor(_libraryManager, _repo, this, _logger, _userManager, _tvSeriesManager); + + var user = _userManager.GetUserById(job.UserId); + + item = (await processor + .GetItemsForSync(job.Category, job.ParentId, job.RequestedItemIds, user, job.UnwatchedOnly).ConfigureAwait(false)) + .FirstOrDefault(); + } + if (item != null) { var hasSeries = item as IHasSeries; @@ -162,13 +186,25 @@ namespace MediaBrowser.Server.Implementations.Sync } var primaryImage = item.GetImageInfo(ImageType.Primary, 0); + var itemWithImage = item; + + if (primaryImage == null) + { + var parentWithImage = item.Parents.FirstOrDefault(i => i.HasImage(ImageType.Primary)); + + if (parentWithImage != null) + { + itemWithImage = parentWithImage; + primaryImage = parentWithImage.GetImageInfo(ImageType.Primary, 0); + } + } if (primaryImage != null) { try { - job.PrimaryImageTag = _imageProcessor.GetImageCacheTag(item, ImageType.Primary); - job.PrimaryImageItemId = item.Id.ToString("N"); + job.PrimaryImageTag = _imageProcessor.GetImageCacheTag(itemWithImage, ImageType.Primary); + job.PrimaryImageItemId = itemWithImage.Id.ToString("N"); } catch (Exception ex) @@ -179,6 +215,44 @@ namespace MediaBrowser.Server.Implementations.Sync } } + private void FillMetadata(SyncJobItem jobItem) + { + var item = _libraryManager.GetItemById(jobItem.ItemId); + + if (item == null) + { + return; + } + + var primaryImage = item.GetImageInfo(ImageType.Primary, 0); + var itemWithImage = item; + + if (primaryImage == null) + { + var parentWithImage = item.Parents.FirstOrDefault(i => i.HasImage(ImageType.Primary)); + + if (parentWithImage != null) + { + itemWithImage = parentWithImage; + primaryImage = parentWithImage.GetImageInfo(ImageType.Primary, 0); + } + } + + if (primaryImage != null) + { + try + { + jobItem.PrimaryImageTag = _imageProcessor.GetImageCacheTag(itemWithImage, ImageType.Primary); + jobItem.PrimaryImageItemId = itemWithImage.Id.ToString("N"); + + } + catch (Exception ex) + { + _logger.ErrorException("Error getting image info", ex); + } + } + } + public Task CancelJob(string id) { return _repo.DeleteJob(id); @@ -198,7 +272,7 @@ namespace MediaBrowser.Server.Implementations.Sync private IEnumerable GetSyncTargets(ISyncProvider provider, string userId) { - return provider.GetSyncTargets().Select(i => new SyncTarget + return provider.GetSyncTargets(userId).Select(i => new SyncTarget { Name = i.Name, Id = GetSyncTargetId(provider, i) @@ -330,7 +404,14 @@ namespace MediaBrowser.Server.Implementations.Sync public QueryResult GetJobItems(SyncJobItemQuery query) { - return _repo.GetJobItems(query); + var result = _repo.GetJobItems(query); + + if (query.AddMetadata) + { + result.Items.ForEach(FillMetadata); + } + + return result; } private SyncedItem GetJobItemInfo(SyncJobItem jobItem) @@ -449,7 +530,7 @@ namespace MediaBrowser.Server.Implementations.Sync } response.ItemIdsToRemove = response.ItemIdsToRemove.Distinct(StringComparer.OrdinalIgnoreCase).ToList(); - + return response; } diff --git a/MediaBrowser.Server.Implementations/Sync/SyncRepository.cs b/MediaBrowser.Server.Implementations/Sync/SyncRepository.cs index 323e3f964..09c1b316e 100644 --- a/MediaBrowser.Server.Implementations/Sync/SyncRepository.cs +++ b/MediaBrowser.Server.Implementations/Sync/SyncRepository.cs @@ -36,7 +36,7 @@ namespace MediaBrowser.Server.Implementations.Sync public async Task Initialize() { - var dbFile = Path.Combine(_appPaths.DataPath, "sync9.db"); + var dbFile = Path.Combine(_appPaths.DataPath, "sync10.db"); _connection = await SqliteExtensions.ConnectToDb(dbFile, _logger).ConfigureAwait(false); @@ -45,7 +45,7 @@ namespace MediaBrowser.Server.Implementations.Sync "create table if not exists SyncJobs (Id GUID PRIMARY KEY, TargetId TEXT NOT NULL, Name TEXT NOT NULL, Quality TEXT NOT NULL, Status TEXT NOT NULL, Progress FLOAT, UserId TEXT NOT NULL, ItemIds TEXT NOT NULL, Category TEXT, ParentId TEXT, UnwatchedOnly BIT, ItemLimit INT, SyncNewContent BIT, DateCreated DateTime, DateLastModified DateTime, ItemCount int)", "create index if not exists idx_SyncJobs on SyncJobs(Id)", - "create table if not exists SyncJobItems (Id GUID PRIMARY KEY, ItemId TEXT, MediaSourceId TEXT, JobId TEXT, OutputPath TEXT, Status TEXT, TargetId TEXT, DateCreated DateTime, Progress FLOAT)", + "create table if not exists SyncJobItems (Id GUID PRIMARY KEY, ItemId TEXT, ItemName TEXT, MediaSourceId TEXT, JobId TEXT, OutputPath TEXT, Status TEXT, TargetId TEXT, DateCreated DateTime, Progress FLOAT)", "create index if not exists idx_SyncJobItems on SyncJobs(Id)", //pragmas @@ -90,21 +90,22 @@ namespace MediaBrowser.Server.Implementations.Sync _saveJobCommand.Parameters.Add(_saveJobCommand, "@ItemCount"); _saveJobItemCommand = _connection.CreateCommand(); - _saveJobItemCommand.CommandText = "replace into SyncJobItems (Id, ItemId, MediaSourceId, JobId, OutputPath, Status, TargetId, DateCreated, Progress) values (@Id, @ItemId, @MediaSourceId, @JobId, @OutputPath, @Status, @TargetId, @DateCreated, @Progress)"; - - _saveJobItemCommand.Parameters.Add(_saveJobCommand, "@Id"); - _saveJobItemCommand.Parameters.Add(_saveJobCommand, "@ItemId"); - _saveJobItemCommand.Parameters.Add(_saveJobCommand, "@MediaSourceId"); - _saveJobItemCommand.Parameters.Add(_saveJobCommand, "@JobId"); - _saveJobItemCommand.Parameters.Add(_saveJobCommand, "@OutputPath"); - _saveJobItemCommand.Parameters.Add(_saveJobCommand, "@Status"); - _saveJobItemCommand.Parameters.Add(_saveJobCommand, "@TargetId"); - _saveJobItemCommand.Parameters.Add(_saveJobCommand, "@DateCreated"); - _saveJobItemCommand.Parameters.Add(_saveJobCommand, "@Progress"); + _saveJobItemCommand.CommandText = "replace into SyncJobItems (Id, ItemId, ItemName, MediaSourceId, JobId, OutputPath, Status, TargetId, DateCreated, Progress) values (@Id, @ItemId, @ItemName, @MediaSourceId, @JobId, @OutputPath, @Status, @TargetId, @DateCreated, @Progress)"; + + _saveJobItemCommand.Parameters.Add(_saveJobItemCommand, "@Id"); + _saveJobItemCommand.Parameters.Add(_saveJobItemCommand, "@ItemId"); + _saveJobItemCommand.Parameters.Add(_saveJobItemCommand, "@ItemName"); + _saveJobItemCommand.Parameters.Add(_saveJobItemCommand, "@MediaSourceId"); + _saveJobItemCommand.Parameters.Add(_saveJobItemCommand, "@JobId"); + _saveJobItemCommand.Parameters.Add(_saveJobItemCommand, "@OutputPath"); + _saveJobItemCommand.Parameters.Add(_saveJobItemCommand, "@Status"); + _saveJobItemCommand.Parameters.Add(_saveJobItemCommand, "@TargetId"); + _saveJobItemCommand.Parameters.Add(_saveJobItemCommand, "@DateCreated"); + _saveJobItemCommand.Parameters.Add(_saveJobItemCommand, "@Progress"); } private const string BaseJobSelectText = "select Id, TargetId, Name, Quality, Status, Progress, UserId, ItemIds, Category, ParentId, UnwatchedOnly, ItemLimit, SyncNewContent, DateCreated, DateLastModified, ItemCount from SyncJobs"; - private const string BaseJobItemSelectText = "select Id, ItemId, MediaSourceId, JobId, OutputPath, Status, TargetId, DateCreated, Progress from SyncJobItems"; + private const string BaseJobItemSelectText = "select Id, ItemId, ItemName, MediaSourceId, JobId, OutputPath, Status, TargetId, DateCreated, Progress from SyncJobItems"; public SyncJob GetJob(string id) { @@ -366,6 +367,11 @@ namespace MediaBrowser.Server.Implementations.Sync whereClauses.Add("TargetId=@TargetId"); cmd.Parameters.Add(cmd, "@TargetId", DbType.String).Value = query.TargetId; } + if (!string.IsNullOrWhiteSpace(query.UserId)) + { + whereClauses.Add("UserId=@UserId"); + cmd.Parameters.Add(cmd, "@UserId", DbType.String).Value = query.UserId; + } var whereTextWithoutPaging = whereClauses.Count == 0 ? string.Empty : @@ -547,6 +553,7 @@ namespace MediaBrowser.Server.Implementations.Sync _saveJobItemCommand.GetParameter(index++).Value = new Guid(jobItem.Id); _saveJobItemCommand.GetParameter(index++).Value = jobItem.ItemId; + _saveJobItemCommand.GetParameter(index++).Value = jobItem.ItemName; _saveJobItemCommand.GetParameter(index++).Value = jobItem.MediaSourceId; _saveJobItemCommand.GetParameter(index++).Value = jobItem.JobId; _saveJobItemCommand.GetParameter(index++).Value = jobItem.OutputPath; @@ -602,28 +609,33 @@ namespace MediaBrowser.Server.Implementations.Sync if (!reader.IsDBNull(2)) { - info.MediaSourceId = reader.GetString(2); + info.ItemName = reader.GetString(2); } - info.JobId = reader.GetString(3); - - if (!reader.IsDBNull(4)) + if (!reader.IsDBNull(3)) { - info.OutputPath = reader.GetString(4); + info.MediaSourceId = reader.GetString(3); } + info.JobId = reader.GetString(4); + if (!reader.IsDBNull(5)) { - info.Status = (SyncJobItemStatus)Enum.Parse(typeof(SyncJobItemStatus), reader.GetString(5), true); + info.OutputPath = reader.GetString(5); } - info.TargetId = reader.GetString(6); + if (!reader.IsDBNull(6)) + { + info.Status = (SyncJobItemStatus)Enum.Parse(typeof(SyncJobItemStatus), reader.GetString(6), true); + } - info.DateCreated = reader.GetDateTime(7); + info.TargetId = reader.GetString(7); - if (!reader.IsDBNull(8)) + info.DateCreated = reader.GetDateTime(8); + + if (!reader.IsDBNull(9)) { - info.Progress = reader.GetDouble(8); + info.Progress = reader.GetDouble(9); } return info; diff --git a/MediaBrowser.WebDashboard/Api/PackageCreator.cs b/MediaBrowser.WebDashboard/Api/PackageCreator.cs index d727dda6e..2f9f3f5f5 100644 --- a/MediaBrowser.WebDashboard/Api/PackageCreator.cs +++ b/MediaBrowser.WebDashboard/Api/PackageCreator.cs @@ -334,6 +334,7 @@ namespace MediaBrowser.WebDashboard.Api "chromecast.js", "backdrops.js", "sync.js", + "syncjob.js", "playlistmanager.js", "mediaplayer.js", diff --git a/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj b/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj index 166d3ce67..df8f4072a 100644 --- a/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj +++ b/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj @@ -93,6 +93,12 @@ PreserveNewest + + PreserveNewest + + + PreserveNewest + PreserveNewest @@ -102,6 +108,9 @@ PreserveNewest + + PreserveNewest + PreserveNewest @@ -114,6 +123,9 @@ PreserveNewest + + PreserveNewest + PreserveNewest -- cgit v1.2.3