aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Server.Implementations
diff options
context:
space:
mode:
authorLuke Pulverenti <luke.pulverenti@gmail.com>2015-01-20 22:54:45 -0500
committerLuke Pulverenti <luke.pulverenti@gmail.com>2015-01-20 22:54:45 -0500
commitf636c10e24a6f26f1c8e41ba6d3751334d6dcb90 (patch)
tree288d39c3fb3d4aebcee877caa74d719d787d58a7 /MediaBrowser.Server.Implementations
parent9e809b06c4132514cfdbba29c2121035d4555247 (diff)
sync updates
Diffstat (limited to 'MediaBrowser.Server.Implementations')
-rw-r--r--MediaBrowser.Server.Implementations/Configuration/ServerConfigurationManager.cs12
-rw-r--r--MediaBrowser.Server.Implementations/Library/LibraryManager.cs12
-rw-r--r--MediaBrowser.Server.Implementations/Library/UserManager.cs88
-rw-r--r--MediaBrowser.Server.Implementations/Localization/JavaScript/javascript.json5
-rw-r--r--MediaBrowser.Server.Implementations/Sync/SyncJobProcessor.cs20
-rw-r--r--MediaBrowser.Server.Implementations/Sync/SyncManager.cs83
-rw-r--r--MediaBrowser.Server.Implementations/Sync/SyncRepository.cs12
7 files changed, 119 insertions, 113 deletions
diff --git a/MediaBrowser.Server.Implementations/Configuration/ServerConfigurationManager.cs b/MediaBrowser.Server.Implementations/Configuration/ServerConfigurationManager.cs
index b3b8ccbd8..5f7ccec4b 100644
--- a/MediaBrowser.Server.Implementations/Configuration/ServerConfigurationManager.cs
+++ b/MediaBrowser.Server.Implementations/Configuration/ServerConfigurationManager.cs
@@ -99,10 +99,20 @@ namespace MediaBrowser.Server.Implementations.Configuration
private void UpdateMetadataPath()
{
((ServerApplicationPaths)ApplicationPaths).InternalMetadataPath = string.IsNullOrEmpty(Configuration.MetadataPath) ?
- null :
+ GetInternalMetadataPath() :
Configuration.MetadataPath;
}
+ private string GetInternalMetadataPath()
+ {
+ if (Configuration.EnableStandaloneMetadata)
+ {
+ return Path.Combine(ApplicationPaths.ProgramDataPath, "metadata");
+ }
+
+ return null;
+ }
+
/// <summary>
/// Updates the transcoding temporary path.
/// </summary>
diff --git a/MediaBrowser.Server.Implementations/Library/LibraryManager.cs b/MediaBrowser.Server.Implementations/Library/LibraryManager.cs
index eaab469f5..b28c98728 100644
--- a/MediaBrowser.Server.Implementations/Library/LibraryManager.cs
+++ b/MediaBrowser.Server.Implementations/Library/LibraryManager.cs
@@ -1124,7 +1124,7 @@ namespace MediaBrowser.Server.Implementations.Library
/// Gets the default view.
/// </summary>
/// <returns>IEnumerable{VirtualFolderInfo}.</returns>
- public IEnumerable<VirtualFolderInfo> GetDefaultVirtualFolders()
+ public IEnumerable<VirtualFolderInfo> GetVirtualFolders()
{
return GetView(ConfigurationManager.ApplicationPaths.DefaultUserViewsPath);
}
@@ -1132,16 +1132,6 @@ namespace MediaBrowser.Server.Implementations.Library
/// <summary>
/// Gets the view.
/// </summary>
- /// <param name="user">The user.</param>
- /// <returns>IEnumerable{VirtualFolderInfo}.</returns>
- public IEnumerable<VirtualFolderInfo> GetVirtualFolders(User user)
- {
- return GetDefaultVirtualFolders();
- }
-
- /// <summary>
- /// Gets the view.
- /// </summary>
/// <param name="path">The path.</param>
/// <returns>IEnumerable{VirtualFolderInfo}.</returns>
private IEnumerable<VirtualFolderInfo> GetView(string path)
diff --git a/MediaBrowser.Server.Implementations/Library/UserManager.cs b/MediaBrowser.Server.Implementations/Library/UserManager.cs
index 3020a224d..c4c0e5395 100644
--- a/MediaBrowser.Server.Implementations/Library/UserManager.cs
+++ b/MediaBrowser.Server.Implementations/Library/UserManager.cs
@@ -3,7 +3,6 @@ using MediaBrowser.Common.Extensions;
using MediaBrowser.Common.IO;
using MediaBrowser.Common.Net;
using MediaBrowser.Controller;
-using MediaBrowser.Controller.Channels;
using MediaBrowser.Controller.Configuration;
using MediaBrowser.Controller.Connect;
using MediaBrowser.Controller.Drawing;
@@ -13,7 +12,6 @@ using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.Net;
using MediaBrowser.Controller.Persistence;
using MediaBrowser.Controller.Providers;
-using MediaBrowser.Model.Channels;
using MediaBrowser.Model.Configuration;
using MediaBrowser.Model.Connect;
using MediaBrowser.Model.Dto;
@@ -72,12 +70,10 @@ namespace MediaBrowser.Server.Implementations.Library
private readonly Func<IImageProcessor> _imageProcessorFactory;
private readonly Func<IDtoService> _dtoServiceFactory;
private readonly Func<IConnectManager> _connectFactory;
- private readonly Func<IChannelManager> _channelManager;
- private readonly Func<ILibraryManager> _libraryManager;
private readonly IServerApplicationHost _appHost;
private readonly IFileSystem _fileSystem;
- public UserManager(ILogger logger, IServerConfigurationManager configurationManager, IUserRepository userRepository, IXmlSerializer xmlSerializer, INetworkManager networkManager, Func<IImageProcessor> imageProcessorFactory, Func<IDtoService> dtoServiceFactory, Func<IConnectManager> connectFactory, IServerApplicationHost appHost, IJsonSerializer jsonSerializer, IFileSystem fileSystem, Func<IChannelManager> channelManager, Func<ILibraryManager> libraryManager)
+ public UserManager(ILogger logger, IServerConfigurationManager configurationManager, IUserRepository userRepository, IXmlSerializer xmlSerializer, INetworkManager networkManager, Func<IImageProcessor> imageProcessorFactory, Func<IDtoService> dtoServiceFactory, Func<IConnectManager> connectFactory, IServerApplicationHost appHost, IJsonSerializer jsonSerializer, IFileSystem fileSystem)
{
_logger = logger;
UserRepository = userRepository;
@@ -89,8 +85,6 @@ namespace MediaBrowser.Server.Implementations.Library
_appHost = appHost;
_jsonSerializer = jsonSerializer;
_fileSystem = fileSystem;
- _channelManager = channelManager;
- _libraryManager = libraryManager;
ConfigurationManager = configurationManager;
Users = new List<User>();
@@ -174,8 +168,6 @@ namespace MediaBrowser.Server.Implementations.Library
foreach (var user in users)
{
await DoPolicyMigration(user).ConfigureAwait(false);
- await DoChannelMigration(user).ConfigureAwait(false);
- await DoLibraryMigration(user).ConfigureAwait(false);
}
// If there are no local users with admin rights, make them all admins
@@ -354,84 +346,6 @@ namespace MediaBrowser.Server.Implementations.Library
}
}
- private async Task DoChannelMigration(User user)
- {
- if (user.Policy.BlockedChannels != null)
- {
- if (user.Policy.BlockedChannels.Length > 0)
- {
- user.Policy.EnableAllChannels = false;
-
- try
- {
- var channelResult = await _channelManager().GetChannelsInternal(new ChannelQuery
- {
- UserId = user.Id.ToString("N")
-
- }, CancellationToken.None).ConfigureAwait(false);
-
- user.Policy.EnabledChannels = channelResult.Items
- .Select(i => i.Id.ToString("N"))
- .Except(user.Policy.BlockedChannels)
- .ToArray();
- }
- catch
- {
- user.Policy.EnabledChannels = new string[] { };
- }
- }
- else
- {
- user.Policy.EnableAllChannels = true;
- user.Policy.EnabledChannels = new string[] { };
- }
-
- user.Policy.BlockedChannels = null;
-
- await UpdateUserPolicy(user, user.Policy, false);
- }
- }
-
- private async Task DoLibraryMigration(User user)
- {
- if (user.Policy.BlockedMediaFolders != null)
- {
- if (user.Policy.BlockedMediaFolders.Length > 0)
- {
- user.Policy.EnableAllFolders = false;
-
- try
- {
- user.Policy.EnabledFolders = _libraryManager().RootFolder
- .Children
- .Where(i => !user.Policy.BlockedMediaFolders.Contains(i.Name, StringComparer.OrdinalIgnoreCase) && !user.Policy.BlockedMediaFolders.Contains(i.Id.ToString("N"), StringComparer.OrdinalIgnoreCase))
- .Select(i => i.Id.ToString("N"))
- .ToArray();
- }
- catch
- {
- user.Policy.EnabledFolders = new string[] { };
- user.Policy.EnableAllFolders = true;
- }
- }
- else
- {
- user.Policy.EnableAllFolders = true;
- user.Policy.EnabledFolders = new string[] { };
- }
-
- // Just to be safe
- if (user.Policy.EnabledFolders.Length == 0)
- {
- user.Policy.EnableAllFolders = true;
- }
-
- user.Policy.BlockedMediaFolders = null;
-
- await UpdateUserPolicy(user, user.Policy, false);
- }
- }
-
public UserDto GetUserDto(User user, string remoteEndPoint = null)
{
if (user == null)
diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/javascript.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/javascript.json
index afc9bff62..e4d20d3a1 100644
--- a/MediaBrowser.Server.Implementations/Localization/JavaScript/javascript.json
+++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/javascript.json
@@ -56,6 +56,9 @@
"HeaderChannelAccess": "Channel Access",
"HeaderDeviceAccess": "Device Access",
"HeaderSelectDevices": "Select Devices",
+ "ButtonCancelItem": "Cancel item",
+ "ButtonQueueForRetry": "Queue for retry",
+ "ButtonReenable": "Re-enable",
"LabelAbortedByServerShutdown": "(Aborted by server shutdown)",
"LabelScheduledTaskLastRan": "Last ran {0}, taking {1}.",
"HeaderDeleteTaskTrigger": "Delete Task Trigger",
@@ -71,6 +74,8 @@
"LabelForcedStream": "(Forced)",
"LabelDefaultForcedStream": "(Default/Forced)",
"LabelUnknownLanguage": "Unknown language",
+ "HeaderConfirmation": "Confirmation",
+ "MessageConfirmSyncJobItemCancellation": "Are you sure you wish to cancel this item?",
"ButtonMute": "Mute",
"ButtonUnmute": "Unmute",
"ButtonStop": "Stop",
diff --git a/MediaBrowser.Server.Implementations/Sync/SyncJobProcessor.cs b/MediaBrowser.Server.Implementations/Sync/SyncJobProcessor.cs
index cf0138a29..67f9d363e 100644
--- a/MediaBrowser.Server.Implementations/Sync/SyncJobProcessor.cs
+++ b/MediaBrowser.Server.Implementations/Sync/SyncJobProcessor.cs
@@ -1,5 +1,4 @@
-using System.Globalization;
-using MediaBrowser.Common.Configuration;
+using MediaBrowser.Common.Configuration;
using MediaBrowser.Common.IO;
using MediaBrowser.Common.Progress;
using MediaBrowser.Controller.Entities;
@@ -361,11 +360,20 @@ namespace MediaBrowser.Server.Implementations.Sync
var innerProgress = new ActionableProgress<double>();
innerProgress.RegisterAction(p => progress.Report(startingPercent + (percentPerItem * p)));
- var job = _syncRepo.GetJob(item.JobId);
- await ProcessJobItem(job, item, enableConversion, innerProgress, cancellationToken).ConfigureAwait(false);
+ // Pull it fresh from the db just to make sure it wasn't deleted or cancelled while another item was converting
+ var jobItem = enableConversion ? _syncRepo.GetJobItem(item.Id) : item;
- job = _syncRepo.GetJob(item.JobId);
- await UpdateJobStatus(job).ConfigureAwait(false);
+ if (jobItem != null)
+ {
+ var job = _syncRepo.GetJob(jobItem.JobId);
+ if (jobItem.Status != SyncJobItemStatus.Cancelled)
+ {
+ await ProcessJobItem(job, jobItem, enableConversion, innerProgress, cancellationToken).ConfigureAwait(false);
+ }
+
+ job = _syncRepo.GetJob(jobItem.JobId);
+ await UpdateJobStatus(job).ConfigureAwait(false);
+ }
numComplete++;
double percent = numComplete;
diff --git a/MediaBrowser.Server.Implementations/Sync/SyncManager.cs b/MediaBrowser.Server.Implementations/Sync/SyncManager.cs
index b8d884cee..7e4455ab3 100644
--- a/MediaBrowser.Server.Implementations/Sync/SyncManager.cs
+++ b/MediaBrowser.Server.Implementations/Sync/SyncManager.cs
@@ -1,5 +1,6 @@
using MediaBrowser.Common;
using MediaBrowser.Common.Configuration;
+using MediaBrowser.Common.Events;
using MediaBrowser.Common.Extensions;
using MediaBrowser.Common.IO;
using MediaBrowser.Controller.Channels;
@@ -16,6 +17,7 @@ using MediaBrowser.Controller.TV;
using MediaBrowser.Model.Dlna;
using MediaBrowser.Model.Dto;
using MediaBrowser.Model.Entities;
+using MediaBrowser.Model.Events;
using MediaBrowser.Model.Logging;
using MediaBrowser.Model.Querying;
using MediaBrowser.Model.Sync;
@@ -47,6 +49,9 @@ namespace MediaBrowser.Server.Implementations.Sync
private ISyncProvider[] _providers = { };
+ public event EventHandler<GenericEventArgs<SyncJob>> SyncJobCreated;
+ public event EventHandler<GenericEventArgs<SyncJob>> SyncJobCancelled;
+
public SyncManager(ILibraryManager libraryManager, ISyncRepository repo, IImageProcessor imageProcessor, ILogger logger, IUserManager userManager, Func<IDtoService> dtoService, IApplicationHost appHost, ITVSeriesManager tvSeriesManager, Func<IMediaEncoder> mediaEncoder, IFileSystem fileSystem, Func<ISubtitleEncoder> subtitleEncoder, IConfigurationManager config)
{
_libraryManager = libraryManager;
@@ -144,6 +149,15 @@ namespace MediaBrowser.Server.Implementations.Sync
await processor.SyncJobItems(jobItemsResult.Items, false, new Progress<double>(), CancellationToken.None)
.ConfigureAwait(false);
+ if (SyncJobCreated != null)
+ {
+ EventHelper.FireEventIfNotNull(SyncJobCreated, this, new GenericEventArgs<SyncJob>
+ {
+ Argument = job
+
+ }, _logger);
+ }
+
return new SyncJobCreationResult
{
Job = GetJob(jobId)
@@ -275,9 +289,25 @@ namespace MediaBrowser.Server.Implementations.Sync
}
}
- public Task CancelJob(string id)
+ public async Task CancelJob(string id)
{
- return _repo.DeleteJob(id);
+ var job = GetJob(id);
+
+ if (job == null)
+ {
+ throw new ArgumentException("Job not found.");
+ }
+
+ await _repo.DeleteJob(id).ConfigureAwait(false);
+
+ if (SyncJobCancelled != null)
+ {
+ EventHelper.FireEventIfNotNull(SyncJobCancelled, this, new GenericEventArgs<SyncJob>
+ {
+ Argument = job
+
+ }, _logger);
+ }
}
public SyncJob GetJob(string id)
@@ -496,7 +526,7 @@ namespace MediaBrowser.Server.Implementations.Sync
.FirstOrDefault(i => string.Equals(i.Id, jobItem.MediaSourceId));
syncedItem.Item.MediaSources = new List<MediaSourceInfo>();
-
+
// This will be null for items that are not audio/video
if (mediaSource == null)
{
@@ -545,7 +575,12 @@ namespace MediaBrowser.Server.Implementations.Sync
var job = _repo.GetJob(jobItem.JobId);
var user = _userManager.GetUserById(job.UserId);
- if (user == null)
+ if (jobItem.IsMarkedForRemoval)
+ {
+ // Tell the device to remove it since it has been marked for removal
+ response.ItemIdsToRemove.Add(jobItem.ItemId);
+ }
+ else if (user == null)
{
// Tell the device to remove it since the user is gone now
response.ItemIdsToRemove.Add(jobItem.ItemId);
@@ -609,5 +644,45 @@ namespace MediaBrowser.Server.Implementations.Sync
return true;
}
+
+ public async Task ReEnableJobItem(string id)
+ {
+ var jobItem = _repo.GetJobItem(id);
+
+ if (jobItem.Status != SyncJobItemStatus.Failed && jobItem.Status != SyncJobItemStatus.Cancelled)
+ {
+ throw new ArgumentException("Operation is not valid for this job item");
+ }
+
+ jobItem.Status = SyncJobItemStatus.Queued;
+ jobItem.Progress = 0;
+ jobItem.IsMarkedForRemoval = false;
+
+ await _repo.Update(jobItem).ConfigureAwait(false);
+
+ var processor = GetSyncJobProcessor();
+
+ await processor.UpdateJobStatus(jobItem.JobId).ConfigureAwait(false);
+ }
+
+ public async Task CancelJobItem(string id)
+ {
+ var jobItem = _repo.GetJobItem(id);
+
+ if (jobItem.Status != SyncJobItemStatus.Queued && jobItem.Status != SyncJobItemStatus.Transferring && jobItem.Status != SyncJobItemStatus.Converting)
+ {
+ throw new ArgumentException("Operation is not valid for this job item");
+ }
+
+ jobItem.Status = SyncJobItemStatus.Cancelled;
+ jobItem.Progress = 0;
+ jobItem.IsMarkedForRemoval = true;
+
+ await _repo.Update(jobItem).ConfigureAwait(false);
+
+ var processor = GetSyncJobProcessor();
+
+ await processor.UpdateJobStatus(jobItem.JobId).ConfigureAwait(false);
+ }
}
}
diff --git a/MediaBrowser.Server.Implementations/Sync/SyncRepository.cs b/MediaBrowser.Server.Implementations/Sync/SyncRepository.cs
index ae9143710..1cd8e8a9d 100644
--- a/MediaBrowser.Server.Implementations/Sync/SyncRepository.cs
+++ b/MediaBrowser.Server.Implementations/Sync/SyncRepository.cs
@@ -41,7 +41,7 @@ namespace MediaBrowser.Server.Implementations.Sync
public async Task Initialize()
{
- var dbFile = Path.Combine(_appPaths.DataPath, "sync12.db");
+ var dbFile = Path.Combine(_appPaths.DataPath, "sync13.db");
_connection = await SqliteExtensions.ConnectToDb(dbFile, _logger).ConfigureAwait(false);
@@ -50,7 +50,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, ItemName TEXT, MediaSourceId TEXT, JobId TEXT, TemporaryPath TEXT, OutputPath TEXT, Status TEXT, TargetId TEXT, DateCreated DateTime, Progress FLOAT, AdditionalFiles TEXT, MediaSource TEXT)",
+ "create table if not exists SyncJobItems (Id GUID PRIMARY KEY, ItemId TEXT, ItemName TEXT, MediaSourceId TEXT, JobId TEXT, TemporaryPath TEXT, OutputPath TEXT, Status TEXT, TargetId TEXT, DateCreated DateTime, Progress FLOAT, AdditionalFiles TEXT, MediaSource TEXT, IsMarkedForRemoval BIT)",
"create index if not exists idx_SyncJobItems on SyncJobs(Id)",
//pragmas
@@ -95,7 +95,7 @@ namespace MediaBrowser.Server.Implementations.Sync
_saveJobCommand.Parameters.Add(_saveJobCommand, "@ItemCount");
_saveJobItemCommand = _connection.CreateCommand();
- _saveJobItemCommand.CommandText = "replace into SyncJobItems (Id, ItemId, ItemName, MediaSourceId, JobId, TemporaryPath, OutputPath, Status, TargetId, DateCreated, Progress, AdditionalFiles, MediaSource) values (@Id, @ItemId, @ItemName, @MediaSourceId, @JobId, @TemporaryPath, @OutputPath, @Status, @TargetId, @DateCreated, @Progress, @AdditionalFiles, @MediaSource)";
+ _saveJobItemCommand.CommandText = "replace into SyncJobItems (Id, ItemId, ItemName, MediaSourceId, JobId, TemporaryPath, OutputPath, Status, TargetId, DateCreated, Progress, AdditionalFiles, MediaSource, IsMarkedForRemoval) values (@Id, @ItemId, @ItemName, @MediaSourceId, @JobId, @TemporaryPath, @OutputPath, @Status, @TargetId, @DateCreated, @Progress, @AdditionalFiles, @MediaSource, @IsMarkedForRemoval)";
_saveJobItemCommand.Parameters.Add(_saveJobItemCommand, "@Id");
_saveJobItemCommand.Parameters.Add(_saveJobItemCommand, "@ItemId");
@@ -110,10 +110,11 @@ namespace MediaBrowser.Server.Implementations.Sync
_saveJobItemCommand.Parameters.Add(_saveJobItemCommand, "@Progress");
_saveJobItemCommand.Parameters.Add(_saveJobItemCommand, "@AdditionalFiles");
_saveJobItemCommand.Parameters.Add(_saveJobItemCommand, "@MediaSource");
+ _saveJobItemCommand.Parameters.Add(_saveJobItemCommand, "@IsMarkedForRemoval");
}
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, ItemName, MediaSourceId, JobId, TemporaryPath, OutputPath, Status, TargetId, DateCreated, Progress, AdditionalFiles, MediaSource from SyncJobItems";
+ private const string BaseJobItemSelectText = "select Id, ItemId, ItemName, MediaSourceId, JobId, TemporaryPath, OutputPath, Status, TargetId, DateCreated, Progress, AdditionalFiles, MediaSource, IsMarkedForRemoval from SyncJobItems";
public SyncJob GetJob(string id)
{
@@ -572,6 +573,7 @@ namespace MediaBrowser.Server.Implementations.Sync
_saveJobItemCommand.GetParameter(index++).Value = jobItem.Progress;
_saveJobItemCommand.GetParameter(index++).Value = _json.SerializeToString(jobItem.AdditionalFiles);
_saveJobItemCommand.GetParameter(index++).Value = jobItem.MediaSource == null ? null : _json.SerializeToString(jobItem.MediaSource);
+ _saveJobItemCommand.GetParameter(index++).Value = jobItem.IsMarkedForRemoval;
_saveJobItemCommand.Transaction = transaction;
@@ -673,6 +675,8 @@ namespace MediaBrowser.Server.Implementations.Sync
}
}
+ info.IsMarkedForRemoval = reader.GetBoolean(13);
+
return info;
}