start using user policy
This commit is contained in:
parent
e55ab989d2
commit
8807e80d0a
|
@ -479,14 +479,14 @@ namespace MediaBrowser.Api.Library
|
||||||
}
|
}
|
||||||
else if (item is ILiveTvRecording)
|
else if (item is ILiveTvRecording)
|
||||||
{
|
{
|
||||||
if (!user.Configuration.EnableLiveTvManagement)
|
if (!user.Policy.EnableLiveTvManagement)
|
||||||
{
|
{
|
||||||
throw new UnauthorizedAccessException();
|
throw new UnauthorizedAccessException();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (!user.Configuration.EnableContentDeletion)
|
if (!user.Policy.EnableContentDeletion)
|
||||||
{
|
{
|
||||||
throw new UnauthorizedAccessException();
|
throw new UnauthorizedAccessException();
|
||||||
}
|
}
|
||||||
|
|
|
@ -319,7 +319,7 @@ namespace MediaBrowser.Api.LiveTv
|
||||||
throw new UnauthorizedAccessException("Anonymous live tv management is not allowed.");
|
throw new UnauthorizedAccessException("Anonymous live tv management is not allowed.");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!user.Configuration.EnableLiveTvManagement)
|
if (!user.Policy.EnableLiveTvManagement)
|
||||||
{
|
{
|
||||||
throw new UnauthorizedAccessException("The current user does not have permission to manage live tv.");
|
throw new UnauthorizedAccessException("The current user does not have permission to manage live tv.");
|
||||||
}
|
}
|
||||||
|
|
|
@ -135,7 +135,7 @@ namespace MediaBrowser.Api
|
||||||
Level = request.Level,
|
Level = request.Level,
|
||||||
Name = request.Name,
|
Name = request.Name,
|
||||||
Url = request.Url,
|
Url = request.Url,
|
||||||
UserIds = _userManager.Users.Where(i => i.Configuration.IsAdministrator).Select(i => i.Id.ToString("N")).ToList()
|
UserIds = _userManager.Users.Where(i => i.Policy.IsAdministrator).Select(i => i.Id.ToString("N")).ToList()
|
||||||
};
|
};
|
||||||
|
|
||||||
await _notificationManager.SendNotification(notification, CancellationToken.None).ConfigureAwait(false);
|
await _notificationManager.SendNotification(notification, CancellationToken.None).ConfigureAwait(false);
|
||||||
|
|
|
@ -202,6 +202,10 @@ namespace MediaBrowser.Api.Playback
|
||||||
{
|
{
|
||||||
args += " -map -0:s";
|
args += " -map -0:s";
|
||||||
}
|
}
|
||||||
|
else if (state.SubtitleStream.IsExternal && !state.SubtitleStream.IsTextSubtitleStream)
|
||||||
|
{
|
||||||
|
args += " -map 1:0 -sn";
|
||||||
|
}
|
||||||
|
|
||||||
return args;
|
return args;
|
||||||
}
|
}
|
||||||
|
@ -273,7 +277,7 @@ namespace MediaBrowser.Api.Playback
|
||||||
// Recommended per docs
|
// Recommended per docs
|
||||||
return Math.Max(Environment.ProcessorCount - 1, 2);
|
return Math.Max(Environment.ProcessorCount - 1, 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Use more when this is true. -re will keep cpu usage under control
|
// Use more when this is true. -re will keep cpu usage under control
|
||||||
if (state.ReadInputAtNativeFramerate)
|
if (state.ReadInputAtNativeFramerate)
|
||||||
{
|
{
|
||||||
|
@ -666,9 +670,18 @@ namespace MediaBrowser.Api.Playback
|
||||||
videoSizeParam = string.Format(",scale={0}:{1}", state.VideoStream.Width.Value.ToString(UsCulture), state.VideoStream.Height.Value.ToString(UsCulture));
|
videoSizeParam = string.Format(",scale={0}:{1}", state.VideoStream.Width.Value.ToString(UsCulture), state.VideoStream.Height.Value.ToString(UsCulture));
|
||||||
}
|
}
|
||||||
|
|
||||||
return string.Format(" -filter_complex \"[0:{0}]format=yuva444p{3},lut=u=128:v=128:y=gammaval(.3)[sub] ; [0:{1}] [sub] overlay{2}\"",
|
var mapPrefix = state.SubtitleStream.IsExternal ?
|
||||||
state.SubtitleStream.Index,
|
1 :
|
||||||
state.VideoStream.Index,
|
0;
|
||||||
|
|
||||||
|
var subtitleStreamIndex = state.SubtitleStream.IsExternal
|
||||||
|
? 0
|
||||||
|
: state.SubtitleStream.Index;
|
||||||
|
|
||||||
|
return string.Format(" -filter_complex \"[{0}:{1}]format=yuva444p{4},lut=u=128:v=128:y=gammaval(.3)[sub] ; [0:{2}] [sub] overlay{3}\"",
|
||||||
|
mapPrefix.ToString(UsCulture),
|
||||||
|
subtitleStreamIndex.ToString(UsCulture),
|
||||||
|
state.VideoStream.Index.ToString(UsCulture),
|
||||||
outputSizeParam,
|
outputSizeParam,
|
||||||
videoSizeParam);
|
videoSizeParam);
|
||||||
}
|
}
|
||||||
|
@ -812,6 +825,21 @@ namespace MediaBrowser.Api.Playback
|
||||||
/// <param name="state">The state.</param>
|
/// <param name="state">The state.</param>
|
||||||
/// <returns>System.String.</returns>
|
/// <returns>System.String.</returns>
|
||||||
protected string GetInputArgument(string transcodingJobId, StreamState state)
|
protected string GetInputArgument(string transcodingJobId, StreamState state)
|
||||||
|
{
|
||||||
|
var arg = "-i " + GetInputPathArgument(transcodingJobId, state);
|
||||||
|
|
||||||
|
if (state.SubtitleStream != null)
|
||||||
|
{
|
||||||
|
if (state.SubtitleStream.IsExternal && !state.SubtitleStream.IsTextSubtitleStream)
|
||||||
|
{
|
||||||
|
arg += " -i " + state.SubtitleStream.Path;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return arg;
|
||||||
|
}
|
||||||
|
|
||||||
|
private string GetInputPathArgument(string transcodingJobId, StreamState state)
|
||||||
{
|
{
|
||||||
if (state.InputProtocol == MediaProtocol.File &&
|
if (state.InputProtocol == MediaProtocol.File &&
|
||||||
state.RunTimeTicks.HasValue &&
|
state.RunTimeTicks.HasValue &&
|
||||||
|
@ -883,7 +911,7 @@ namespace MediaBrowser.Api.Playback
|
||||||
state.InputProtocol = streamInfo.Protocol;
|
state.InputProtocol = streamInfo.Protocol;
|
||||||
|
|
||||||
await Task.Delay(1500, cancellationTokenSource.Token).ConfigureAwait(false);
|
await Task.Delay(1500, cancellationTokenSource.Token).ConfigureAwait(false);
|
||||||
|
|
||||||
AttachMediaStreamInfo(state, streamInfo, state.VideoRequest, state.RequestedUrl);
|
AttachMediaStreamInfo(state, streamInfo, state.VideoRequest, state.RequestedUrl);
|
||||||
checkCodecs = true;
|
checkCodecs = true;
|
||||||
}
|
}
|
||||||
|
@ -913,8 +941,8 @@ namespace MediaBrowser.Api.Playback
|
||||||
/// <param name="cancellationTokenSource">The cancellation token source.</param>
|
/// <param name="cancellationTokenSource">The cancellation token source.</param>
|
||||||
/// <param name="workingDirectory">The working directory.</param>
|
/// <param name="workingDirectory">The working directory.</param>
|
||||||
/// <returns>Task.</returns>
|
/// <returns>Task.</returns>
|
||||||
protected async Task<TranscodingJob> StartFfMpeg(StreamState state,
|
protected async Task<TranscodingJob> StartFfMpeg(StreamState state,
|
||||||
string outputPath,
|
string outputPath,
|
||||||
CancellationTokenSource cancellationTokenSource,
|
CancellationTokenSource cancellationTokenSource,
|
||||||
string workingDirectory = null)
|
string workingDirectory = null)
|
||||||
{
|
{
|
||||||
|
@ -1103,7 +1131,7 @@ namespace MediaBrowser.Api.Playback
|
||||||
if (scale.HasValue)
|
if (scale.HasValue)
|
||||||
{
|
{
|
||||||
long val;
|
long val;
|
||||||
|
|
||||||
if (long.TryParse(size, NumberStyles.Any, UsCulture, out val))
|
if (long.TryParse(size, NumberStyles.Any, UsCulture, out val))
|
||||||
{
|
{
|
||||||
bytesTranscoded = val * scale.Value;
|
bytesTranscoded = val * scale.Value;
|
||||||
|
@ -1642,7 +1670,7 @@ namespace MediaBrowser.Api.Playback
|
||||||
|
|
||||||
if (string.IsNullOrEmpty(container))
|
if (string.IsNullOrEmpty(container))
|
||||||
{
|
{
|
||||||
container = request.Static ?
|
container = request.Static ?
|
||||||
state.InputContainer :
|
state.InputContainer :
|
||||||
(Path.GetExtension(GetOutputFilePath(state)) ?? string.Empty).TrimStart('.');
|
(Path.GetExtension(GetOutputFilePath(state)) ?? string.Empty).TrimStart('.');
|
||||||
}
|
}
|
||||||
|
@ -1717,7 +1745,7 @@ namespace MediaBrowser.Api.Playback
|
||||||
|
|
||||||
AttachMediaStreamInfo(state, mediaSource.MediaStreams, videoRequest, requestedUrl);
|
AttachMediaStreamInfo(state, mediaSource.MediaStreams, videoRequest, requestedUrl);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void AttachMediaStreamInfo(StreamState state,
|
private void AttachMediaStreamInfo(StreamState state,
|
||||||
List<MediaStream> mediaStreams,
|
List<MediaStream> mediaStreams,
|
||||||
VideoStreamRequest videoRequest,
|
VideoStreamRequest videoRequest,
|
||||||
|
|
|
@ -239,7 +239,7 @@ namespace MediaBrowser.Api.Playback.Hls
|
||||||
"hls/" + Path.GetFileNameWithoutExtension(outputPath));
|
"hls/" + Path.GetFileNameWithoutExtension(outputPath));
|
||||||
}
|
}
|
||||||
|
|
||||||
var args = string.Format("{0} {1} -i {2} -map_metadata -1 -threads {3} {4} {5} -sc_threshold 0 {6} -hls_time {7} -start_number {8} -hls_list_size {9}{10} -y \"{11}\"",
|
var args = string.Format("{0} {1} {2} -map_metadata -1 -threads {3} {4} {5} -sc_threshold 0 {6} -hls_time {7} -start_number {8} -hls_list_size {9}{10} -y \"{11}\"",
|
||||||
itsOffset,
|
itsOffset,
|
||||||
inputModifier,
|
inputModifier,
|
||||||
GetInputArgument(transcodingJobId, state),
|
GetInputArgument(transcodingJobId, state),
|
||||||
|
|
|
@ -677,7 +677,7 @@ namespace MediaBrowser.Api.Playback.Hls
|
||||||
// If isEncoding is true we're actually starting ffmpeg
|
// If isEncoding is true we're actually starting ffmpeg
|
||||||
var startNumberParam = isEncoding ? GetStartNumber(state).ToString(UsCulture) : "0";
|
var startNumberParam = isEncoding ? GetStartNumber(state).ToString(UsCulture) : "0";
|
||||||
|
|
||||||
var args = string.Format("{0} -i {1} -map_metadata -1 -threads {2} {3} {4} -copyts -flags -global_header {5} -hls_time {6} -start_number {7} -hls_list_size {8} -y \"{9}\"",
|
var args = string.Format("{0} {1} -map_metadata -1 -threads {2} {3} {4} -copyts -flags -global_header {5} -hls_time {6} -start_number {7} -hls_list_size {8} -y \"{9}\"",
|
||||||
inputModifier,
|
inputModifier,
|
||||||
GetInputArgument(transcodingJobId, state),
|
GetInputArgument(transcodingJobId, state),
|
||||||
threads,
|
threads,
|
||||||
|
|
|
@ -627,7 +627,7 @@ namespace MediaBrowser.Api.Playback.Hls
|
||||||
|
|
||||||
var segmentFilename = Path.GetFileNameWithoutExtension(outputPath) + "%03d" + GetSegmentFileExtension(state);
|
var segmentFilename = Path.GetFileNameWithoutExtension(outputPath) + "%03d" + GetSegmentFileExtension(state);
|
||||||
|
|
||||||
var args = string.Format("{0} -i {1} -map_metadata -1 -threads {2} {3} {4} -copyts {5} -f ssegment -segment_time {6} -segment_list_size {8} -segment_list \"{9}\" {10}",
|
var args = string.Format("{0} {1} -map_metadata -1 -threads {2} {3} {4} -copyts {5} -f ssegment -segment_time {6} -segment_list_size {8} -segment_list \"{9}\" {10}",
|
||||||
inputModifier,
|
inputModifier,
|
||||||
GetInputArgument(transcodingJobId, state),
|
GetInputArgument(transcodingJobId, state),
|
||||||
threads,
|
threads,
|
||||||
|
|
|
@ -82,7 +82,7 @@ namespace MediaBrowser.Api.Playback.Progressive
|
||||||
|
|
||||||
var inputModifier = GetInputModifier(state);
|
var inputModifier = GetInputModifier(state);
|
||||||
|
|
||||||
return string.Format("{0} -i {1} -threads {2}{3} {4} -id3v2_version 3 -write_id3v1 1 -y \"{5}\"",
|
return string.Format("{0} {1} -threads {2}{3} {4} -id3v2_version 3 -write_id3v1 1 -y \"{5}\"",
|
||||||
inputModifier,
|
inputModifier,
|
||||||
GetInputArgument(transcodingJobId, state),
|
GetInputArgument(transcodingJobId, state),
|
||||||
threads,
|
threads,
|
||||||
|
|
|
@ -103,7 +103,7 @@ namespace MediaBrowser.Api.Playback.Progressive
|
||||||
|
|
||||||
var inputModifier = GetInputModifier(state);
|
var inputModifier = GetInputModifier(state);
|
||||||
|
|
||||||
return string.Format("{0} -i {1}{2} {3} {4} -map_metadata -1 -threads {5} {6}{7} -y \"{8}\"",
|
return string.Format("{0} {1}{2} {3} {4} -map_metadata -1 -threads {5} {6}{7} -y \"{8}\"",
|
||||||
inputModifier,
|
inputModifier,
|
||||||
GetInputArgument(transcodingJobId, state),
|
GetInputArgument(transcodingJobId, state),
|
||||||
keyFrame,
|
keyFrame,
|
||||||
|
|
|
@ -373,12 +373,12 @@ namespace MediaBrowser.Api.Session
|
||||||
|
|
||||||
var user = _userManager.GetUserById(request.ControllableByUserId.Value);
|
var user = _userManager.GetUserById(request.ControllableByUserId.Value);
|
||||||
|
|
||||||
if (!user.Configuration.EnableRemoteControlOfOtherUsers)
|
if (!user.Policy.EnableRemoteControlOfOtherUsers)
|
||||||
{
|
{
|
||||||
result = result.Where(i => i.ContainsUser(request.ControllableByUserId.Value));
|
result = result.Where(i => i.ContainsUser(request.ControllableByUserId.Value));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!user.Configuration.EnableSharedDeviceControl)
|
if (!user.Policy.EnableSharedDeviceControl)
|
||||||
{
|
{
|
||||||
result = result.Where(i => !i.UserId.HasValue);
|
result = result.Where(i => !i.UserId.HasValue);
|
||||||
}
|
}
|
||||||
|
|
|
@ -264,12 +264,12 @@ namespace MediaBrowser.Api
|
||||||
|
|
||||||
if (request.IsDisabled.HasValue)
|
if (request.IsDisabled.HasValue)
|
||||||
{
|
{
|
||||||
users = users.Where(i => i.Configuration.IsDisabled == request.IsDisabled.Value);
|
users = users.Where(i => i.Policy.IsDisabled == request.IsDisabled.Value);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (request.IsHidden.HasValue)
|
if (request.IsHidden.HasValue)
|
||||||
{
|
{
|
||||||
users = users.Where(i => i.Configuration.IsHidden == request.IsHidden.Value);
|
users = users.Where(i => i.Policy.IsHidden == request.IsHidden.Value);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (request.IsGuest.HasValue)
|
if (request.IsGuest.HasValue)
|
||||||
|
@ -445,39 +445,13 @@ namespace MediaBrowser.Api
|
||||||
|
|
||||||
var user = _userManager.GetUserById(id);
|
var user = _userManager.GetUserById(id);
|
||||||
|
|
||||||
// If removing admin access
|
|
||||||
if (!dtoUser.Configuration.IsAdministrator && user.Configuration.IsAdministrator)
|
|
||||||
{
|
|
||||||
if (_userManager.Users.Count(i => i.Configuration.IsAdministrator) == 1)
|
|
||||||
{
|
|
||||||
throw new ArgumentException("There must be at least one user in the system with administrative access.");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// If disabling
|
|
||||||
if (dtoUser.Configuration.IsDisabled && user.Configuration.IsAdministrator)
|
|
||||||
{
|
|
||||||
throw new ArgumentException("Administrators cannot be disabled.");
|
|
||||||
}
|
|
||||||
|
|
||||||
// If disabling
|
|
||||||
if (dtoUser.Configuration.IsDisabled && !user.Configuration.IsDisabled)
|
|
||||||
{
|
|
||||||
if (_userManager.Users.Count(i => !i.Configuration.IsDisabled) == 1)
|
|
||||||
{
|
|
||||||
throw new ArgumentException("There must be at least one enabled user in the system.");
|
|
||||||
}
|
|
||||||
|
|
||||||
await _sessionMananger.RevokeUserTokens(user.Id.ToString("N")).ConfigureAwait(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
var task = user.Name.Equals(dtoUser.Name, StringComparison.Ordinal) ?
|
var task = user.Name.Equals(dtoUser.Name, StringComparison.Ordinal) ?
|
||||||
_userManager.UpdateUser(user) :
|
_userManager.UpdateUser(user) :
|
||||||
_userManager.RenameUser(user, dtoUser.Name);
|
_userManager.RenameUser(user, dtoUser.Name);
|
||||||
|
|
||||||
await task.ConfigureAwait(false);
|
await task.ConfigureAwait(false);
|
||||||
|
|
||||||
user.UpdateConfiguration(dtoUser.Configuration);
|
await _userManager.UpdateConfiguration(dtoUser.Id, dtoUser.Configuration);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -515,14 +489,48 @@ namespace MediaBrowser.Api
|
||||||
|
|
||||||
public void Post(UpdateUserConfiguration request)
|
public void Post(UpdateUserConfiguration request)
|
||||||
{
|
{
|
||||||
var user = _userManager.GetUserById(request.Id);
|
var task = _userManager.UpdateConfiguration(request.Id, request);
|
||||||
user.UpdateConfiguration(request);
|
|
||||||
|
Task.WaitAll(task);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Post(UpdateUserPolicy request)
|
public void Post(UpdateUserPolicy request)
|
||||||
{
|
{
|
||||||
var task = _userManager.UpdateUserPolicy(request.Id, request);
|
var task = UpdateUserPolicy(request);
|
||||||
Task.WaitAll(task);
|
Task.WaitAll(task);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private async Task UpdateUserPolicy(UpdateUserPolicy request)
|
||||||
|
{
|
||||||
|
var user = _userManager.GetUserById(request.Id);
|
||||||
|
|
||||||
|
// If removing admin access
|
||||||
|
if (!request.IsAdministrator && user.Policy.IsAdministrator)
|
||||||
|
{
|
||||||
|
if (_userManager.Users.Count(i => i.Policy.IsAdministrator) == 1)
|
||||||
|
{
|
||||||
|
throw new ArgumentException("There must be at least one user in the system with administrative access.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// If disabling
|
||||||
|
if (request.IsDisabled && user.Policy.IsAdministrator)
|
||||||
|
{
|
||||||
|
throw new ArgumentException("Administrators cannot be disabled.");
|
||||||
|
}
|
||||||
|
|
||||||
|
// If disabling
|
||||||
|
if (request.IsDisabled && !user.Policy.IsDisabled)
|
||||||
|
{
|
||||||
|
if (_userManager.Users.Count(i => !i.Policy.IsDisabled) == 1)
|
||||||
|
{
|
||||||
|
throw new ArgumentException("There must be at least one enabled user in the system.");
|
||||||
|
}
|
||||||
|
|
||||||
|
await _sessionMananger.RevokeUserTokens(user.Id.ToString("N")).ConfigureAwait(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
await _userManager.UpdateUserPolicy(request.Id, request).ConfigureAwait(false);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,7 +14,7 @@ namespace MediaBrowser.Controller.Channels
|
||||||
|
|
||||||
public override bool IsVisible(User user)
|
public override bool IsVisible(User user)
|
||||||
{
|
{
|
||||||
if (user.Configuration.BlockedChannels.Contains(Id.ToString("N"), StringComparer.OrdinalIgnoreCase))
|
if (user.Policy.BlockedChannels.Contains(Id.ToString("N"), StringComparer.OrdinalIgnoreCase))
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,6 +6,7 @@ using MediaBrowser.Model.Entities;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
|
using MediaBrowser.Model.Users;
|
||||||
|
|
||||||
namespace MediaBrowser.Controller.Channels
|
namespace MediaBrowser.Controller.Channels
|
||||||
{
|
{
|
||||||
|
@ -25,8 +26,8 @@ namespace MediaBrowser.Controller.Channels
|
||||||
public string OriginalImageUrl { get; set; }
|
public string OriginalImageUrl { get; set; }
|
||||||
|
|
||||||
public List<ChannelMediaInfo> ChannelMediaSources { get; set; }
|
public List<ChannelMediaInfo> ChannelMediaSources { get; set; }
|
||||||
|
|
||||||
protected override bool GetBlockUnratedValue(UserConfiguration config)
|
protected override bool GetBlockUnratedValue(UserPolicy config)
|
||||||
{
|
{
|
||||||
return config.BlockUnratedItems.Contains(UnratedItem.ChannelContent);
|
return config.BlockUnratedItems.Contains(UnratedItem.ChannelContent);
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,6 +5,7 @@ using MediaBrowser.Model.Configuration;
|
||||||
using MediaBrowser.Model.Querying;
|
using MediaBrowser.Model.Querying;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
using MediaBrowser.Model.Users;
|
||||||
|
|
||||||
namespace MediaBrowser.Controller.Channels
|
namespace MediaBrowser.Controller.Channels
|
||||||
{
|
{
|
||||||
|
@ -20,7 +21,7 @@ namespace MediaBrowser.Controller.Channels
|
||||||
|
|
||||||
public string OriginalImageUrl { get; set; }
|
public string OriginalImageUrl { get; set; }
|
||||||
|
|
||||||
protected override bool GetBlockUnratedValue(UserConfiguration config)
|
protected override bool GetBlockUnratedValue(UserPolicy config)
|
||||||
{
|
{
|
||||||
// Don't block.
|
// Don't block.
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -8,6 +8,7 @@ using System.Collections.Generic;
|
||||||
using System.Globalization;
|
using System.Globalization;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
|
using MediaBrowser.Model.Users;
|
||||||
|
|
||||||
namespace MediaBrowser.Controller.Channels
|
namespace MediaBrowser.Controller.Channels
|
||||||
{
|
{
|
||||||
|
@ -51,7 +52,7 @@ namespace MediaBrowser.Controller.Channels
|
||||||
return ExternalId;
|
return ExternalId;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override bool GetBlockUnratedValue(UserConfiguration config)
|
protected override bool GetBlockUnratedValue(UserPolicy config)
|
||||||
{
|
{
|
||||||
return config.BlockUnratedItems.Contains(UnratedItem.ChannelContent);
|
return config.BlockUnratedItems.Contains(UnratedItem.ChannelContent);
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,6 +8,7 @@ using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Runtime.Serialization;
|
using System.Runtime.Serialization;
|
||||||
|
using MediaBrowser.Model.Users;
|
||||||
|
|
||||||
namespace MediaBrowser.Controller.Entities.Audio
|
namespace MediaBrowser.Controller.Entities.Audio
|
||||||
{
|
{
|
||||||
|
@ -173,7 +174,7 @@ namespace MediaBrowser.Controller.Entities.Audio
|
||||||
return base.GetUserDataKey();
|
return base.GetUserDataKey();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override bool GetBlockUnratedValue(UserConfiguration config)
|
protected override bool GetBlockUnratedValue(UserPolicy config)
|
||||||
{
|
{
|
||||||
return config.BlockUnratedItems.Contains(UnratedItem.Music);
|
return config.BlockUnratedItems.Contains(UnratedItem.Music);
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,6 +5,7 @@ using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Runtime.Serialization;
|
using System.Runtime.Serialization;
|
||||||
|
using MediaBrowser.Model.Users;
|
||||||
|
|
||||||
namespace MediaBrowser.Controller.Entities.Audio
|
namespace MediaBrowser.Controller.Entities.Audio
|
||||||
{
|
{
|
||||||
|
@ -154,7 +155,7 @@ namespace MediaBrowser.Controller.Entities.Audio
|
||||||
return base.GetUserDataKey();
|
return base.GetUserDataKey();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override bool GetBlockUnratedValue(UserConfiguration config)
|
protected override bool GetBlockUnratedValue(UserPolicy config)
|
||||||
{
|
{
|
||||||
return config.BlockUnratedItems.Contains(UnratedItem.Music);
|
return config.BlockUnratedItems.Contains(UnratedItem.Music);
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,6 +8,7 @@ using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
using MediaBrowser.Model.Users;
|
||||||
|
|
||||||
namespace MediaBrowser.Controller.Entities.Audio
|
namespace MediaBrowser.Controller.Entities.Audio
|
||||||
{
|
{
|
||||||
|
@ -114,7 +115,7 @@ namespace MediaBrowser.Controller.Entities.Audio
|
||||||
return "Artist-" + item.Name;
|
return "Artist-" + item.Name;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override bool GetBlockUnratedValue(UserConfiguration config)
|
protected override bool GetBlockUnratedValue(UserPolicy config)
|
||||||
{
|
{
|
||||||
return config.BlockUnratedItems.Contains(UnratedItem.Music);
|
return config.BlockUnratedItems.Contains(UnratedItem.Music);
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,6 +21,7 @@ using System.Linq;
|
||||||
using System.Runtime.Serialization;
|
using System.Runtime.Serialization;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
using MediaBrowser.Model.Users;
|
||||||
|
|
||||||
namespace MediaBrowser.Controller.Entities
|
namespace MediaBrowser.Controller.Entities
|
||||||
{
|
{
|
||||||
|
@ -595,7 +596,7 @@ namespace MediaBrowser.Controller.Entities
|
||||||
/// <returns>PlayAccess.</returns>
|
/// <returns>PlayAccess.</returns>
|
||||||
public PlayAccess GetPlayAccess(User user)
|
public PlayAccess GetPlayAccess(User user)
|
||||||
{
|
{
|
||||||
if (!user.Configuration.EnableMediaPlayback)
|
if (!user.Policy.EnableMediaPlayback)
|
||||||
{
|
{
|
||||||
return PlayAccess.None;
|
return PlayAccess.None;
|
||||||
}
|
}
|
||||||
|
@ -987,7 +988,7 @@ namespace MediaBrowser.Controller.Entities
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
var maxAllowedRating = user.Configuration.MaxParentalRating;
|
var maxAllowedRating = user.Policy.MaxParentalRating;
|
||||||
|
|
||||||
if (maxAllowedRating == null)
|
if (maxAllowedRating == null)
|
||||||
{
|
{
|
||||||
|
@ -1003,7 +1004,7 @@ namespace MediaBrowser.Controller.Entities
|
||||||
|
|
||||||
if (string.IsNullOrWhiteSpace(rating))
|
if (string.IsNullOrWhiteSpace(rating))
|
||||||
{
|
{
|
||||||
return !GetBlockUnratedValue(user.Configuration);
|
return !GetBlockUnratedValue(user.Policy);
|
||||||
}
|
}
|
||||||
|
|
||||||
var value = LocalizationManager.GetRatingLevel(rating);
|
var value = LocalizationManager.GetRatingLevel(rating);
|
||||||
|
@ -1023,7 +1024,7 @@ namespace MediaBrowser.Controller.Entities
|
||||||
|
|
||||||
if (hasTags != null)
|
if (hasTags != null)
|
||||||
{
|
{
|
||||||
if (user.Configuration.BlockedTags.Any(i => hasTags.Tags.Contains(i, StringComparer.OrdinalIgnoreCase)))
|
if (user.Policy.BlockedTags.Any(i => hasTags.Tags.Contains(i, StringComparer.OrdinalIgnoreCase)))
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -1037,7 +1038,7 @@ namespace MediaBrowser.Controller.Entities
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="config">The configuration.</param>
|
/// <param name="config">The configuration.</param>
|
||||||
/// <returns><c>true</c> if XXXX, <c>false</c> otherwise.</returns>
|
/// <returns><c>true</c> if XXXX, <c>false</c> otherwise.</returns>
|
||||||
protected virtual bool GetBlockUnratedValue(UserConfiguration config)
|
protected virtual bool GetBlockUnratedValue(UserPolicy config)
|
||||||
{
|
{
|
||||||
return config.BlockUnratedItems.Contains(UnratedItem.Other);
|
return config.BlockUnratedItems.Contains(UnratedItem.Other);
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
using MediaBrowser.Model.Configuration;
|
using MediaBrowser.Model.Configuration;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
using MediaBrowser.Model.Users;
|
||||||
|
|
||||||
namespace MediaBrowser.Controller.Entities
|
namespace MediaBrowser.Controller.Entities
|
||||||
{
|
{
|
||||||
|
@ -36,7 +37,7 @@ namespace MediaBrowser.Controller.Entities
|
||||||
Tags = new List<string>();
|
Tags = new List<string>();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override bool GetBlockUnratedValue(UserConfiguration config)
|
protected override bool GetBlockUnratedValue(UserPolicy config)
|
||||||
{
|
{
|
||||||
return config.BlockUnratedItems.Contains(UnratedItem.Book);
|
return config.BlockUnratedItems.Contains(UnratedItem.Book);
|
||||||
}
|
}
|
||||||
|
|
|
@ -303,10 +303,10 @@ namespace MediaBrowser.Controller.Entities
|
||||||
{
|
{
|
||||||
if (this is ICollectionFolder)
|
if (this is ICollectionFolder)
|
||||||
{
|
{
|
||||||
if (user.Configuration.BlockedMediaFolders.Contains(Id.ToString("N"), StringComparer.OrdinalIgnoreCase) ||
|
if (user.Policy.BlockedMediaFolders.Contains(Id.ToString("N"), StringComparer.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
// Backwards compatibility
|
// Backwards compatibility
|
||||||
user.Configuration.BlockedMediaFolders.Contains(Name, StringComparer.OrdinalIgnoreCase))
|
user.Policy.BlockedMediaFolders.Contains(Name, StringComparer.OrdinalIgnoreCase))
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,6 +4,7 @@ using MediaBrowser.Model.Entities;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
using MediaBrowser.Model.Users;
|
||||||
|
|
||||||
namespace MediaBrowser.Controller.Entities
|
namespace MediaBrowser.Controller.Entities
|
||||||
{
|
{
|
||||||
|
@ -108,7 +109,7 @@ namespace MediaBrowser.Controller.Entities
|
||||||
return base.GetDeletePaths();
|
return base.GetDeletePaths();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override bool GetBlockUnratedValue(UserConfiguration config)
|
protected override bool GetBlockUnratedValue(UserPolicy config)
|
||||||
{
|
{
|
||||||
return config.BlockUnratedItems.Contains(UnratedItem.Game);
|
return config.BlockUnratedItems.Contains(UnratedItem.Game);
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
using MediaBrowser.Controller.Providers;
|
using MediaBrowser.Controller.Providers;
|
||||||
using MediaBrowser.Model.Configuration;
|
using MediaBrowser.Model.Configuration;
|
||||||
using System;
|
using System;
|
||||||
|
using MediaBrowser.Model.Users;
|
||||||
|
|
||||||
namespace MediaBrowser.Controller.Entities
|
namespace MediaBrowser.Controller.Entities
|
||||||
{
|
{
|
||||||
|
@ -43,7 +44,7 @@ namespace MediaBrowser.Controller.Entities
|
||||||
return base.GetUserDataKey();
|
return base.GetUserDataKey();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override bool GetBlockUnratedValue(UserConfiguration config)
|
protected override bool GetBlockUnratedValue(UserPolicy config)
|
||||||
{
|
{
|
||||||
// Don't block. Determine by game
|
// Don't block. Determine by game
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -9,6 +9,7 @@ using System.Linq;
|
||||||
using System.Runtime.Serialization;
|
using System.Runtime.Serialization;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
using MediaBrowser.Model.Users;
|
||||||
|
|
||||||
namespace MediaBrowser.Controller.Entities.Movies
|
namespace MediaBrowser.Controller.Entities.Movies
|
||||||
{
|
{
|
||||||
|
@ -67,7 +68,7 @@ namespace MediaBrowser.Controller.Entities.Movies
|
||||||
/// <value>The display order.</value>
|
/// <value>The display order.</value>
|
||||||
public string DisplayOrder { get; set; }
|
public string DisplayOrder { get; set; }
|
||||||
|
|
||||||
protected override bool GetBlockUnratedValue(UserConfiguration config)
|
protected override bool GetBlockUnratedValue(UserPolicy config)
|
||||||
{
|
{
|
||||||
return config.BlockUnratedItems.Contains(UnratedItem.Movie);
|
return config.BlockUnratedItems.Contains(UnratedItem.Movie);
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,6 +8,7 @@ using System.Linq;
|
||||||
using System.Runtime.Serialization;
|
using System.Runtime.Serialization;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
using MediaBrowser.Model.Users;
|
||||||
|
|
||||||
namespace MediaBrowser.Controller.Entities.Movies
|
namespace MediaBrowser.Controller.Entities.Movies
|
||||||
{
|
{
|
||||||
|
@ -146,7 +147,7 @@ namespace MediaBrowser.Controller.Entities.Movies
|
||||||
return itemsChanged;
|
return itemsChanged;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override bool GetBlockUnratedValue(UserConfiguration config)
|
protected override bool GetBlockUnratedValue(UserPolicy config)
|
||||||
{
|
{
|
||||||
return config.BlockUnratedItems.Contains(UnratedItem.Movie);
|
return config.BlockUnratedItems.Contains(UnratedItem.Movie);
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,6 +6,7 @@ using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Runtime.Serialization;
|
using System.Runtime.Serialization;
|
||||||
|
using MediaBrowser.Model.Users;
|
||||||
|
|
||||||
namespace MediaBrowser.Controller.Entities
|
namespace MediaBrowser.Controller.Entities
|
||||||
{
|
{
|
||||||
|
@ -80,7 +81,7 @@ namespace MediaBrowser.Controller.Entities
|
||||||
return this.GetProviderId(MetadataProviders.Tmdb) ?? this.GetProviderId(MetadataProviders.Imdb) ?? base.GetUserDataKey();
|
return this.GetProviderId(MetadataProviders.Tmdb) ?? this.GetProviderId(MetadataProviders.Imdb) ?? base.GetUserDataKey();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override bool GetBlockUnratedValue(UserConfiguration config)
|
protected override bool GetBlockUnratedValue(UserPolicy config)
|
||||||
{
|
{
|
||||||
return config.BlockUnratedItems.Contains(UnratedItem.Music);
|
return config.BlockUnratedItems.Contains(UnratedItem.Music);
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,6 +3,7 @@ using MediaBrowser.Model.Drawing;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Runtime.Serialization;
|
using System.Runtime.Serialization;
|
||||||
|
using MediaBrowser.Model.Users;
|
||||||
|
|
||||||
namespace MediaBrowser.Controller.Entities
|
namespace MediaBrowser.Controller.Entities
|
||||||
{
|
{
|
||||||
|
@ -69,8 +70,8 @@ namespace MediaBrowser.Controller.Entities
|
||||||
public double? Longitude { get; set; }
|
public double? Longitude { get; set; }
|
||||||
public double? Altitude { get; set; }
|
public double? Altitude { get; set; }
|
||||||
public int? IsoSpeedRating { get; set; }
|
public int? IsoSpeedRating { get; set; }
|
||||||
|
|
||||||
protected override bool GetBlockUnratedValue(UserConfiguration config)
|
protected override bool GetBlockUnratedValue(UserPolicy config)
|
||||||
{
|
{
|
||||||
return config.BlockUnratedItems.Contains(UnratedItem.Other);
|
return config.BlockUnratedItems.Contains(UnratedItem.Other);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
using MediaBrowser.Model.Configuration;
|
using MediaBrowser.Model.Configuration;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Runtime.Serialization;
|
using System.Runtime.Serialization;
|
||||||
|
using MediaBrowser.Model.Users;
|
||||||
|
|
||||||
namespace MediaBrowser.Controller.Entities
|
namespace MediaBrowser.Controller.Entities
|
||||||
{
|
{
|
||||||
|
@ -22,8 +23,8 @@ namespace MediaBrowser.Controller.Entities
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override bool GetBlockUnratedValue(UserConfiguration config)
|
protected override bool GetBlockUnratedValue(UserPolicy config)
|
||||||
{
|
{
|
||||||
return config.BlockUnratedItems.Contains(UnratedItem.Other);
|
return config.BlockUnratedItems.Contains(UnratedItem.Other);
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,6 +5,7 @@ using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Runtime.Serialization;
|
using System.Runtime.Serialization;
|
||||||
|
using MediaBrowser.Model.Users;
|
||||||
|
|
||||||
namespace MediaBrowser.Controller.Entities.TV
|
namespace MediaBrowser.Controller.Entities.TV
|
||||||
{
|
{
|
||||||
|
@ -274,7 +275,7 @@ namespace MediaBrowser.Controller.Entities.TV
|
||||||
return new[] { Path };
|
return new[] { Path };
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override bool GetBlockUnratedValue(UserConfiguration config)
|
protected override bool GetBlockUnratedValue(UserPolicy config)
|
||||||
{
|
{
|
||||||
return config.BlockUnratedItems.Contains(UnratedItem.Series);
|
return config.BlockUnratedItems.Contains(UnratedItem.Series);
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,6 +7,7 @@ using MediaBrowser.Model.Querying;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Runtime.Serialization;
|
using System.Runtime.Serialization;
|
||||||
|
using MediaBrowser.Model.Users;
|
||||||
|
|
||||||
namespace MediaBrowser.Controller.Entities.TV
|
namespace MediaBrowser.Controller.Entities.TV
|
||||||
{
|
{
|
||||||
|
@ -249,7 +250,7 @@ namespace MediaBrowser.Controller.Entities.TV
|
||||||
return GetEpisodes(user);
|
return GetEpisodes(user);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override bool GetBlockUnratedValue(UserConfiguration config)
|
protected override bool GetBlockUnratedValue(UserPolicy config)
|
||||||
{
|
{
|
||||||
// Don't block. Let either the entire series rating or episode rating determine it
|
// Don't block. Let either the entire series rating or episode rating determine it
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -7,6 +7,7 @@ using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Runtime.Serialization;
|
using System.Runtime.Serialization;
|
||||||
|
using MediaBrowser.Model.Users;
|
||||||
|
|
||||||
namespace MediaBrowser.Controller.Entities.TV
|
namespace MediaBrowser.Controller.Entities.TV
|
||||||
{
|
{
|
||||||
|
@ -246,7 +247,7 @@ namespace MediaBrowser.Controller.Entities.TV
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override bool GetBlockUnratedValue(UserConfiguration config)
|
protected override bool GetBlockUnratedValue(UserPolicy config)
|
||||||
{
|
{
|
||||||
return config.BlockUnratedItems.Contains(UnratedItem.Series);
|
return config.BlockUnratedItems.Contains(UnratedItem.Series);
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,6 +6,7 @@ using System.Collections.Generic;
|
||||||
using System.Globalization;
|
using System.Globalization;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Runtime.Serialization;
|
using System.Runtime.Serialization;
|
||||||
|
using MediaBrowser.Model.Users;
|
||||||
|
|
||||||
namespace MediaBrowser.Controller.Entities
|
namespace MediaBrowser.Controller.Entities
|
||||||
{
|
{
|
||||||
|
@ -98,7 +99,7 @@ namespace MediaBrowser.Controller.Entities
|
||||||
return base.GetUserDataKey();
|
return base.GetUserDataKey();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override bool GetBlockUnratedValue(UserConfiguration config)
|
protected override bool GetBlockUnratedValue(UserPolicy config)
|
||||||
{
|
{
|
||||||
return config.BlockUnratedItems.Contains(UnratedItem.Trailer);
|
return config.BlockUnratedItems.Contains(UnratedItem.Trailer);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
using MediaBrowser.Common.Configuration;
|
using MediaBrowser.Controller.Library;
|
||||||
using MediaBrowser.Controller.Library;
|
|
||||||
using MediaBrowser.Controller.Providers;
|
using MediaBrowser.Controller.Providers;
|
||||||
using MediaBrowser.Model.Configuration;
|
using MediaBrowser.Model.Configuration;
|
||||||
using MediaBrowser.Model.Connect;
|
using MediaBrowser.Model.Connect;
|
||||||
|
@ -107,37 +106,27 @@ namespace MediaBrowser.Controller.Entities
|
||||||
/// <value>The last activity date.</value>
|
/// <value>The last activity date.</value>
|
||||||
public DateTime? LastActivityDate { get; set; }
|
public DateTime? LastActivityDate { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
private UserConfiguration _config;
|
||||||
/// The _configuration
|
private readonly object _configSyncLock = new object();
|
||||||
/// </summary>
|
|
||||||
private UserConfiguration _configuration;
|
|
||||||
/// <summary>
|
|
||||||
/// The _configuration initialized
|
|
||||||
/// </summary>
|
|
||||||
private bool _configurationInitialized;
|
|
||||||
/// <summary>
|
|
||||||
/// The _configuration sync lock
|
|
||||||
/// </summary>
|
|
||||||
private object _configurationSyncLock = new object();
|
|
||||||
/// <summary>
|
|
||||||
/// Gets the user's configuration
|
|
||||||
/// </summary>
|
|
||||||
/// <value>The configuration.</value>
|
|
||||||
[IgnoreDataMember]
|
[IgnoreDataMember]
|
||||||
public UserConfiguration Configuration
|
public UserConfiguration Configuration
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
// Lazy load
|
if (_config == null)
|
||||||
LazyInitializer.EnsureInitialized(ref _configuration, ref _configurationInitialized, ref _configurationSyncLock, () => (UserConfiguration)ConfigurationHelper.GetXmlConfiguration(typeof(UserConfiguration), ConfigurationFilePath, XmlSerializer));
|
{
|
||||||
return _configuration;
|
lock (_configSyncLock)
|
||||||
}
|
{
|
||||||
private set
|
if (_config == null)
|
||||||
{
|
{
|
||||||
_configuration = value;
|
_config = UserManager.GetUserConfiguration(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
_configurationInitialized = value != null;
|
return _config;
|
||||||
}
|
}
|
||||||
|
set { _config = value; }
|
||||||
}
|
}
|
||||||
|
|
||||||
private UserPolicy _policy;
|
private UserPolicy _policy;
|
||||||
|
@ -256,35 +245,6 @@ namespace MediaBrowser.Controller.Entities
|
||||||
return System.IO.Path.Combine(parentPath, Id.ToString("N"));
|
return System.IO.Path.Combine(parentPath, Id.ToString("N"));
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Gets the path to the user's configuration file
|
|
||||||
/// </summary>
|
|
||||||
/// <value>The configuration file path.</value>
|
|
||||||
[IgnoreDataMember]
|
|
||||||
public string ConfigurationFilePath
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return System.IO.Path.Combine(ConfigurationDirectoryPath, "config.xml");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Updates the configuration.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="config">The config.</param>
|
|
||||||
/// <exception cref="System.ArgumentNullException">config</exception>
|
|
||||||
public void UpdateConfiguration(UserConfiguration config)
|
|
||||||
{
|
|
||||||
if (config == null)
|
|
||||||
{
|
|
||||||
throw new ArgumentNullException("config");
|
|
||||||
}
|
|
||||||
|
|
||||||
Configuration = config;
|
|
||||||
UserManager.UpdateConfiguration(this, Configuration);
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool IsParentalScheduleAllowed()
|
public bool IsParentalScheduleAllowed()
|
||||||
{
|
{
|
||||||
return IsParentalScheduleAllowed(DateTime.UtcNow);
|
return IsParentalScheduleAllowed(DateTime.UtcNow);
|
||||||
|
@ -292,7 +252,7 @@ namespace MediaBrowser.Controller.Entities
|
||||||
|
|
||||||
public bool IsParentalScheduleAllowed(DateTime date)
|
public bool IsParentalScheduleAllowed(DateTime date)
|
||||||
{
|
{
|
||||||
var schedules = Configuration.AccessSchedules;
|
var schedules = Policy.AccessSchedules;
|
||||||
|
|
||||||
if (schedules.Length == 0)
|
if (schedules.Length == 0)
|
||||||
{
|
{
|
||||||
|
|
|
@ -63,7 +63,8 @@ namespace MediaBrowser.Controller.Entities
|
||||||
{
|
{
|
||||||
CollectionType.Books,
|
CollectionType.Books,
|
||||||
CollectionType.HomeVideos,
|
CollectionType.HomeVideos,
|
||||||
CollectionType.Photos
|
CollectionType.Photos,
|
||||||
|
string.Empty
|
||||||
};
|
};
|
||||||
|
|
||||||
var collectionFolder = folder as ICollectionFolder;
|
var collectionFolder = folder as ICollectionFolder;
|
||||||
|
|
|
@ -35,13 +35,6 @@ namespace MediaBrowser.Controller.Library
|
||||||
event EventHandler<GenericEventArgs<User>> UserConfigurationUpdated;
|
event EventHandler<GenericEventArgs<User>> UserConfigurationUpdated;
|
||||||
event EventHandler<GenericEventArgs<User>> UserPasswordChanged;
|
event EventHandler<GenericEventArgs<User>> UserPasswordChanged;
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Updates the configuration.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="user">The user.</param>
|
|
||||||
/// <param name="newConfiguration">The new configuration.</param>
|
|
||||||
void UpdateConfiguration(User user, UserConfiguration newConfiguration);
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets a User by Id
|
/// Gets a User by Id
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -172,6 +165,21 @@ namespace MediaBrowser.Controller.Library
|
||||||
/// <returns>UserPolicy.</returns>
|
/// <returns>UserPolicy.</returns>
|
||||||
UserPolicy GetUserPolicy(User user);
|
UserPolicy GetUserPolicy(User user);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the user configuration.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="user">The user.</param>
|
||||||
|
/// <returns>UserConfiguration.</returns>
|
||||||
|
UserConfiguration GetUserConfiguration(User user);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Updates the configuration.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="userId">The user identifier.</param>
|
||||||
|
/// <param name="newConfiguration">The new configuration.</param>
|
||||||
|
/// <returns>Task.</returns>
|
||||||
|
Task UpdateConfiguration(string userId, UserConfiguration newConfiguration);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Updates the user policy.
|
/// Updates the user policy.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
using MediaBrowser.Model.Configuration;
|
using MediaBrowser.Model.Configuration;
|
||||||
using MediaBrowser.Model.Entities;
|
using MediaBrowser.Model.Entities;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
using MediaBrowser.Model.Users;
|
||||||
|
|
||||||
namespace MediaBrowser.Controller.LiveTv
|
namespace MediaBrowser.Controller.LiveTv
|
||||||
{
|
{
|
||||||
|
@ -78,7 +79,7 @@ namespace MediaBrowser.Controller.LiveTv
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override bool GetBlockUnratedValue(UserConfiguration config)
|
protected override bool GetBlockUnratedValue(UserPolicy config)
|
||||||
{
|
{
|
||||||
return config.BlockUnratedItems.Contains(UnratedItem.LiveTvProgram);
|
return config.BlockUnratedItems.Contains(UnratedItem.LiveTvProgram);
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,6 +6,7 @@ using MediaBrowser.Model.LiveTv;
|
||||||
using MediaBrowser.Model.MediaInfo;
|
using MediaBrowser.Model.MediaInfo;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
using MediaBrowser.Model.Users;
|
||||||
|
|
||||||
namespace MediaBrowser.Controller.LiveTv
|
namespace MediaBrowser.Controller.LiveTv
|
||||||
{
|
{
|
||||||
|
@ -33,7 +34,7 @@ namespace MediaBrowser.Controller.LiveTv
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override bool GetBlockUnratedValue(UserConfiguration config)
|
protected override bool GetBlockUnratedValue(UserPolicy config)
|
||||||
{
|
{
|
||||||
return config.BlockUnratedItems.Contains(UnratedItem.LiveTvChannel);
|
return config.BlockUnratedItems.Contains(UnratedItem.LiveTvChannel);
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,6 +6,7 @@ using System;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
using MediaBrowser.Model.Users;
|
||||||
|
|
||||||
namespace MediaBrowser.Controller.LiveTv
|
namespace MediaBrowser.Controller.LiveTv
|
||||||
{
|
{
|
||||||
|
@ -199,7 +200,7 @@ namespace MediaBrowser.Controller.LiveTv
|
||||||
return ItemRepository.SaveItem(this, cancellationToken);
|
return ItemRepository.SaveItem(this, cancellationToken);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override bool GetBlockUnratedValue(UserConfiguration config)
|
protected override bool GetBlockUnratedValue(UserPolicy config)
|
||||||
{
|
{
|
||||||
return config.BlockUnratedItems.Contains(UnratedItem.LiveTvProgram);
|
return config.BlockUnratedItems.Contains(UnratedItem.LiveTvProgram);
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
using MediaBrowser.Model.Configuration;
|
using MediaBrowser.Model.Configuration;
|
||||||
using MediaBrowser.Model.Entities;
|
using MediaBrowser.Model.Entities;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
using MediaBrowser.Model.Users;
|
||||||
|
|
||||||
namespace MediaBrowser.Controller.LiveTv
|
namespace MediaBrowser.Controller.LiveTv
|
||||||
{
|
{
|
||||||
|
@ -78,7 +79,7 @@ namespace MediaBrowser.Controller.LiveTv
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override bool GetBlockUnratedValue(UserConfiguration config)
|
protected override bool GetBlockUnratedValue(UserPolicy config)
|
||||||
{
|
{
|
||||||
return config.BlockUnratedItems.Contains(UnratedItem.LiveTvProgram);
|
return config.BlockUnratedItems.Contains(UnratedItem.LiveTvProgram);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,11 +1,12 @@
|
||||||
using MediaBrowser.Controller.Entities;
|
using MediaBrowser.Controller.Entities;
|
||||||
using MediaBrowser.Model.Configuration;
|
using MediaBrowser.Model.Configuration;
|
||||||
|
using MediaBrowser.Model.Users;
|
||||||
|
|
||||||
namespace MediaBrowser.Controller.LiveTv
|
namespace MediaBrowser.Controller.LiveTv
|
||||||
{
|
{
|
||||||
public class RecordingGroup : Folder
|
public class RecordingGroup : Folder
|
||||||
{
|
{
|
||||||
protected override bool GetBlockUnratedValue(UserConfiguration config)
|
protected override bool GetBlockUnratedValue(UserPolicy config)
|
||||||
{
|
{
|
||||||
// Don't block.
|
// Don't block.
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -1034,6 +1034,9 @@
|
||||||
<Compile Include="..\MediaBrowser.Model\Sync\SyncDialogOptions.cs">
|
<Compile Include="..\MediaBrowser.Model\Sync\SyncDialogOptions.cs">
|
||||||
<Link>Sync\SyncDialogOptions.cs</Link>
|
<Link>Sync\SyncDialogOptions.cs</Link>
|
||||||
</Compile>
|
</Compile>
|
||||||
|
<Compile Include="..\MediaBrowser.Model\Sync\SyncItem.cs">
|
||||||
|
<Link>Sync\SyncItem.cs</Link>
|
||||||
|
</Compile>
|
||||||
<Compile Include="..\MediaBrowser.Model\Sync\SyncJob.cs">
|
<Compile Include="..\MediaBrowser.Model\Sync\SyncJob.cs">
|
||||||
<Link>Sync\SyncJob.cs</Link>
|
<Link>Sync\SyncJob.cs</Link>
|
||||||
</Compile>
|
</Compile>
|
||||||
|
|
|
@ -993,6 +993,9 @@
|
||||||
<Compile Include="..\MediaBrowser.Model\Sync\SyncDialogOptions.cs">
|
<Compile Include="..\MediaBrowser.Model\Sync\SyncDialogOptions.cs">
|
||||||
<Link>Sync\SyncDialogOptions.cs</Link>
|
<Link>Sync\SyncDialogOptions.cs</Link>
|
||||||
</Compile>
|
</Compile>
|
||||||
|
<Compile Include="..\MediaBrowser.Model\Sync\SyncItem.cs">
|
||||||
|
<Link>Sync\SyncItem.cs</Link>
|
||||||
|
</Compile>
|
||||||
<Compile Include="..\MediaBrowser.Model\Sync\SyncJob.cs">
|
<Compile Include="..\MediaBrowser.Model\Sync\SyncJob.cs">
|
||||||
<Link>Sync\SyncJob.cs</Link>
|
<Link>Sync\SyncJob.cs</Link>
|
||||||
</Compile>
|
</Compile>
|
||||||
|
|
|
@ -42,6 +42,10 @@ namespace MediaBrowser.Model.Configuration
|
||||||
/// <value><c>true</c> if this instance is hidden; otherwise, <c>false</c>.</value>
|
/// <value><c>true</c> if this instance is hidden; otherwise, <c>false</c>.</value>
|
||||||
public bool IsHidden { get; set; }
|
public bool IsHidden { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets a value indicating whether this instance is disabled.
|
||||||
|
/// </summary>
|
||||||
|
/// <value><c>true</c> if this instance is disabled; otherwise, <c>false</c>.</value>
|
||||||
public bool IsDisabled { get; set; }
|
public bool IsDisabled { get; set; }
|
||||||
|
|
||||||
public bool DisplayMissingEpisodes { get; set; }
|
public bool DisplayMissingEpisodes { get; set; }
|
||||||
|
@ -74,9 +78,6 @@ namespace MediaBrowser.Model.Configuration
|
||||||
|
|
||||||
public string[] OrderedViews { get; set; }
|
public string[] OrderedViews { get; set; }
|
||||||
|
|
||||||
public bool SyncConnectName { get; set; }
|
|
||||||
public bool SyncConnectImage { get; set; }
|
|
||||||
|
|
||||||
public bool IncludeTrailersInSuggestions { get; set; }
|
public bool IncludeTrailersInSuggestions { get; set; }
|
||||||
|
|
||||||
public bool EnableCinemaMode { get; set; }
|
public bool EnableCinemaMode { get; set; }
|
||||||
|
@ -87,7 +88,9 @@ namespace MediaBrowser.Model.Configuration
|
||||||
|
|
||||||
public string[] LatestItemsExcludes { get; set; }
|
public string[] LatestItemsExcludes { get; set; }
|
||||||
public string[] BlockedTags { get; set; }
|
public string[] BlockedTags { get; set; }
|
||||||
|
|
||||||
|
public bool ValuesMigratedToPolicy { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Initializes a new instance of the <see cref="UserConfiguration" /> class.
|
/// Initializes a new instance of the <see cref="UserConfiguration" /> class.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -110,8 +113,6 @@ namespace MediaBrowser.Model.Configuration
|
||||||
ExcludeFoldersFromGrouping = new string[] { };
|
ExcludeFoldersFromGrouping = new string[] { };
|
||||||
DisplayCollectionsView = true;
|
DisplayCollectionsView = true;
|
||||||
|
|
||||||
SyncConnectName = true;
|
|
||||||
SyncConnectImage = true;
|
|
||||||
IncludeTrailersInSuggestions = true;
|
IncludeTrailersInSuggestions = true;
|
||||||
EnableCinemaMode = true;
|
EnableCinemaMode = true;
|
||||||
EnableUserPreferenceAccess = true;
|
EnableUserPreferenceAccess = true;
|
||||||
|
|
|
@ -366,6 +366,7 @@
|
||||||
<Compile Include="Sync\SyncCategory.cs" />
|
<Compile Include="Sync\SyncCategory.cs" />
|
||||||
<Compile Include="Sync\SyncDialogOptions.cs" />
|
<Compile Include="Sync\SyncDialogOptions.cs" />
|
||||||
<Compile Include="Sync\SyncHelper.cs" />
|
<Compile Include="Sync\SyncHelper.cs" />
|
||||||
|
<Compile Include="Sync\SyncItem.cs" />
|
||||||
<Compile Include="Sync\SyncJob.cs" />
|
<Compile Include="Sync\SyncJob.cs" />
|
||||||
<Compile Include="Sync\SyncJobCreationResult.cs" />
|
<Compile Include="Sync\SyncJobCreationResult.cs" />
|
||||||
<Compile Include="Sync\SyncJobItem.cs" />
|
<Compile Include="Sync\SyncJobItem.cs" />
|
||||||
|
|
|
@ -1,8 +1,69 @@
|
||||||
|
using MediaBrowser.Model.Configuration;
|
||||||
|
|
||||||
namespace MediaBrowser.Model.Users
|
namespace MediaBrowser.Model.Users
|
||||||
{
|
{
|
||||||
public class UserPolicy
|
public class UserPolicy
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets a value indicating whether this instance is administrator.
|
||||||
|
/// </summary>
|
||||||
|
/// <value><c>true</c> if this instance is administrator; otherwise, <c>false</c>.</value>
|
||||||
|
public bool IsAdministrator { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets a value indicating whether this instance is hidden.
|
||||||
|
/// </summary>
|
||||||
|
/// <value><c>true</c> if this instance is hidden; otherwise, <c>false</c>.</value>
|
||||||
|
public bool IsHidden { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets a value indicating whether this instance is disabled.
|
||||||
|
/// </summary>
|
||||||
|
/// <value><c>true</c> if this instance is disabled; otherwise, <c>false</c>.</value>
|
||||||
|
public bool IsDisabled { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets the max parental rating.
|
||||||
|
/// </summary>
|
||||||
|
/// <value>The max parental rating.</value>
|
||||||
|
public int? MaxParentalRating { get; set; }
|
||||||
|
|
||||||
|
public string[] BlockedTags { get; set; }
|
||||||
|
public bool EnableUserPreferenceAccess { get; set; }
|
||||||
|
public AccessSchedule[] AccessSchedules { get; set; }
|
||||||
|
public UnratedItem[] BlockUnratedItems { get; set; }
|
||||||
|
public string[] BlockedMediaFolders { get; set; }
|
||||||
|
public string[] BlockedChannels { get; set; }
|
||||||
|
public bool EnableRemoteControlOfOtherUsers { get; set; }
|
||||||
|
public bool EnableSharedDeviceControl { get; set; }
|
||||||
|
|
||||||
|
public bool EnableLiveTvManagement { get; set; }
|
||||||
|
public bool EnableLiveTvAccess { get; set; }
|
||||||
|
|
||||||
|
public bool EnableMediaPlayback { get; set; }
|
||||||
|
public bool EnableContentDeletion { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets a value indicating whether [enable synchronize].
|
||||||
|
/// </summary>
|
||||||
|
/// <value><c>true</c> if [enable synchronize]; otherwise, <c>false</c>.</value>
|
||||||
public bool EnableSync { get; set; }
|
public bool EnableSync { get; set; }
|
||||||
|
|
||||||
|
public UserPolicy()
|
||||||
|
{
|
||||||
|
EnableLiveTvManagement = true;
|
||||||
|
EnableMediaPlayback = true;
|
||||||
|
EnableLiveTvAccess = true;
|
||||||
|
EnableSharedDeviceControl = true;
|
||||||
|
|
||||||
|
BlockedMediaFolders = new string[] { };
|
||||||
|
BlockedTags = new string[] { };
|
||||||
|
BlockedChannels = new string[] { };
|
||||||
|
BlockUnratedItems = new UnratedItem[] { };
|
||||||
|
|
||||||
|
EnableUserPreferenceAccess = true;
|
||||||
|
|
||||||
|
AccessSchedules = new AccessSchedule[] { };
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -95,7 +95,7 @@ namespace MediaBrowser.Server.Implementations.Channels
|
||||||
|
|
||||||
public static string GetUserDistinctValue(User user)
|
public static string GetUserDistinctValue(User user)
|
||||||
{
|
{
|
||||||
var channels = user.Configuration.BlockedChannels
|
var channels = user.Policy.BlockedChannels
|
||||||
.OrderBy(i => i)
|
.OrderBy(i => i)
|
||||||
.ToList();
|
.ToList();
|
||||||
|
|
||||||
|
|
|
@ -432,9 +432,7 @@ namespace MediaBrowser.Server.Implementations.Connect
|
||||||
|
|
||||||
await user.UpdateToRepository(ItemUpdateType.MetadataEdit, CancellationToken.None).ConfigureAwait(false);
|
await user.UpdateToRepository(ItemUpdateType.MetadataEdit, CancellationToken.None).ConfigureAwait(false);
|
||||||
|
|
||||||
user.Configuration.SyncConnectImage = false;
|
await _userManager.UpdateConfiguration(user.Id.ToString("N"), user.Configuration);
|
||||||
user.Configuration.SyncConnectName = false;
|
|
||||||
_userManager.UpdateConfiguration(user, user.Configuration);
|
|
||||||
|
|
||||||
await RefreshAuthorizationsInternal(false, CancellationToken.None).ConfigureAwait(false);
|
await RefreshAuthorizationsInternal(false, CancellationToken.None).ConfigureAwait(false);
|
||||||
|
|
||||||
|
@ -800,23 +798,21 @@ namespace MediaBrowser.Server.Implementations.Connect
|
||||||
|
|
||||||
await _userManager.UpdateUser(user).ConfigureAwait(false);
|
await _userManager.UpdateUser(user).ConfigureAwait(false);
|
||||||
|
|
||||||
user.Configuration.SyncConnectImage = true;
|
user.Policy.IsHidden = true;
|
||||||
user.Configuration.SyncConnectName = true;
|
user.Policy.EnableLiveTvManagement = false;
|
||||||
user.Configuration.IsHidden = true;
|
user.Policy.EnableContentDeletion = false;
|
||||||
user.Configuration.EnableLiveTvManagement = false;
|
user.Policy.EnableRemoteControlOfOtherUsers = false;
|
||||||
user.Configuration.EnableContentDeletion = false;
|
user.Policy.EnableSharedDeviceControl = false;
|
||||||
user.Configuration.EnableRemoteControlOfOtherUsers = false;
|
user.Policy.IsAdministrator = false;
|
||||||
user.Configuration.EnableSharedDeviceControl = false;
|
|
||||||
user.Configuration.IsAdministrator = false;
|
|
||||||
|
|
||||||
if (currentPendingEntry != null)
|
if (currentPendingEntry != null)
|
||||||
{
|
{
|
||||||
user.Configuration.EnableLiveTvAccess = currentPendingEntry.EnableLiveTv;
|
user.Policy.EnableLiveTvAccess = currentPendingEntry.EnableLiveTv;
|
||||||
user.Configuration.BlockedMediaFolders = currentPendingEntry.ExcludedLibraries;
|
user.Policy.BlockedMediaFolders = currentPendingEntry.ExcludedLibraries;
|
||||||
user.Configuration.BlockedChannels = currentPendingEntry.ExcludedChannels;
|
user.Policy.BlockedChannels = currentPendingEntry.ExcludedChannels;
|
||||||
}
|
}
|
||||||
|
|
||||||
_userManager.UpdateConfiguration(user, user.Configuration);
|
await _userManager.UpdateConfiguration(user.Id.ToString("N"), user.Configuration);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (string.Equals(connectEntry.AcceptStatus, "waiting", StringComparison.OrdinalIgnoreCase))
|
else if (string.Equals(connectEntry.AcceptStatus, "waiting", StringComparison.OrdinalIgnoreCase))
|
||||||
|
@ -844,7 +840,7 @@ namespace MediaBrowser.Server.Implementations.Connect
|
||||||
{
|
{
|
||||||
var users = _userManager.Users
|
var users = _userManager.Users
|
||||||
.Where(i => !string.IsNullOrEmpty(i.ConnectUserId) &&
|
.Where(i => !string.IsNullOrEmpty(i.ConnectUserId) &&
|
||||||
(i.Configuration.SyncConnectImage || i.Configuration.SyncConnectName))
|
(i.ConnectLinkType.HasValue && i.ConnectLinkType.Value == UserLinkType.Guest))
|
||||||
.ToList();
|
.ToList();
|
||||||
|
|
||||||
foreach (var user in users)
|
foreach (var user in users)
|
||||||
|
@ -857,7 +853,10 @@ namespace MediaBrowser.Server.Implementations.Connect
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (user.Configuration.SyncConnectName)
|
var syncConnectName = true;
|
||||||
|
var syncConnectImage = true;
|
||||||
|
|
||||||
|
if (syncConnectName)
|
||||||
{
|
{
|
||||||
var changed = !string.Equals(authorization.UserName, user.Name, StringComparison.OrdinalIgnoreCase);
|
var changed = !string.Equals(authorization.UserName, user.Name, StringComparison.OrdinalIgnoreCase);
|
||||||
|
|
||||||
|
@ -867,7 +866,7 @@ namespace MediaBrowser.Server.Implementations.Connect
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (user.Configuration.SyncConnectImage)
|
if (syncConnectImage)
|
||||||
{
|
{
|
||||||
var imageUrl = authorization.UserImageUrl;
|
var imageUrl = authorization.UserImageUrl;
|
||||||
|
|
||||||
|
|
|
@ -206,8 +206,8 @@ namespace MediaBrowser.Server.Implementations.HttpServer
|
||||||
HostContext.Config.HandlerFactoryPath = ListenerRequest.GetHandlerPathIfAny(UrlPrefixes.First());
|
HostContext.Config.HandlerFactoryPath = ListenerRequest.GetHandlerPathIfAny(UrlPrefixes.First());
|
||||||
|
|
||||||
_listener = _supportsNativeWebSocket && NativeWebSocket.IsSupported
|
_listener = _supportsNativeWebSocket && NativeWebSocket.IsSupported
|
||||||
? _listener = new HttpListenerServer(_logger, OnRequestReceived)
|
//? _listener = new HttpListenerServer(_logger, OnRequestReceived)
|
||||||
//? _listener = new WebSocketSharpListener(_logger, OnRequestReceived)
|
? _listener = new WebSocketSharpListener(_logger, OnRequestReceived)
|
||||||
: _listener = new WebSocketSharpListener(_logger, OnRequestReceived);
|
: _listener = new WebSocketSharpListener(_logger, OnRequestReceived);
|
||||||
|
|
||||||
_listener.WebSocketHandler = WebSocketHandler;
|
_listener.WebSocketHandler = WebSocketHandler;
|
||||||
|
|
|
@ -68,7 +68,7 @@ namespace MediaBrowser.Server.Implementations.HttpServer.Security
|
||||||
|
|
||||||
if (user != null)
|
if (user != null)
|
||||||
{
|
{
|
||||||
if (user.Configuration.IsDisabled)
|
if (user.Policy.IsDisabled)
|
||||||
{
|
{
|
||||||
throw new SecurityException("User account has been disabled.")
|
throw new SecurityException("User account has been disabled.")
|
||||||
{
|
{
|
||||||
|
@ -76,7 +76,7 @@ namespace MediaBrowser.Server.Implementations.HttpServer.Security
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!user.Configuration.IsAdministrator &&
|
if (!user.Policy.IsAdministrator &&
|
||||||
!authAttribtues.EscapeParentalControl &&
|
!authAttribtues.EscapeParentalControl &&
|
||||||
!user.IsParentalScheduleAllowed())
|
!user.IsParentalScheduleAllowed())
|
||||||
{
|
{
|
||||||
|
@ -135,7 +135,7 @@ namespace MediaBrowser.Server.Implementations.HttpServer.Security
|
||||||
{
|
{
|
||||||
if (roles.Contains("admin", StringComparer.OrdinalIgnoreCase))
|
if (roles.Contains("admin", StringComparer.OrdinalIgnoreCase))
|
||||||
{
|
{
|
||||||
if (user == null || !user.Configuration.IsAdministrator)
|
if (user == null || !user.Policy.IsAdministrator)
|
||||||
{
|
{
|
||||||
throw new SecurityException("User does not have admin access.")
|
throw new SecurityException("User does not have admin access.")
|
||||||
{
|
{
|
||||||
|
@ -145,7 +145,7 @@ namespace MediaBrowser.Server.Implementations.HttpServer.Security
|
||||||
}
|
}
|
||||||
if (roles.Contains("delete", StringComparer.OrdinalIgnoreCase))
|
if (roles.Contains("delete", StringComparer.OrdinalIgnoreCase))
|
||||||
{
|
{
|
||||||
if (user == null || !user.Configuration.EnableContentDeletion)
|
if (user == null || !user.Policy.EnableContentDeletion)
|
||||||
{
|
{
|
||||||
throw new SecurityException("User does not have delete access.")
|
throw new SecurityException("User does not have delete access.")
|
||||||
{
|
{
|
||||||
|
|
|
@ -37,7 +37,11 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers.Audio
|
||||||
/// <value>The priority.</value>
|
/// <value>The priority.</value>
|
||||||
public override ResolverPriority Priority
|
public override ResolverPriority Priority
|
||||||
{
|
{
|
||||||
get { return ResolverPriority.Third; } // we need to be ahead of the generic folder resolver but behind the movie one
|
get
|
||||||
|
{
|
||||||
|
// Behind special folder resolver
|
||||||
|
return ResolverPriority.Second;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -49,21 +53,13 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers.Audio
|
||||||
{
|
{
|
||||||
if (!args.IsDirectory) return null;
|
if (!args.IsDirectory) return null;
|
||||||
|
|
||||||
//Avoid mis-identifying top folders
|
// Avoid mis-identifying top folders
|
||||||
if (args.Parent == null) return null;
|
|
||||||
if (args.Parent.IsRoot) return null;
|
if (args.Parent.IsRoot) return null;
|
||||||
if (args.HasParent<MusicAlbum>()) return null;
|
if (args.HasParent<MusicAlbum>()) return null;
|
||||||
|
|
||||||
// Optimization
|
|
||||||
if (args.HasParent<BoxSet>() || args.HasParent<Series>() || args.HasParent<Season>())
|
|
||||||
{
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
var collectionType = args.GetCollectionType();
|
var collectionType = args.GetCollectionType();
|
||||||
|
|
||||||
var isMusicMediaFolder = string.Equals(collectionType, CollectionType.Music,
|
var isMusicMediaFolder = string.Equals(collectionType, CollectionType.Music, StringComparison.OrdinalIgnoreCase);
|
||||||
StringComparison.OrdinalIgnoreCase);
|
|
||||||
|
|
||||||
// If there's a collection type and it's not music, don't allow it.
|
// If there's a collection type and it's not music, don't allow it.
|
||||||
if (!isMusicMediaFolder)
|
if (!isMusicMediaFolder)
|
||||||
|
|
|
@ -34,7 +34,11 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers.Audio
|
||||||
/// <value>The priority.</value>
|
/// <value>The priority.</value>
|
||||||
public override ResolverPriority Priority
|
public override ResolverPriority Priority
|
||||||
{
|
{
|
||||||
get { return ResolverPriority.Third; } // we need to be ahead of the generic folder resolver but behind the movie one
|
get
|
||||||
|
{
|
||||||
|
// Behind special folder resolver
|
||||||
|
return ResolverPriority.Second;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -46,8 +50,7 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers.Audio
|
||||||
{
|
{
|
||||||
if (!args.IsDirectory) return null;
|
if (!args.IsDirectory) return null;
|
||||||
|
|
||||||
//Avoid mis-identifying top folders
|
// Avoid mis-identifying top folders
|
||||||
if (args.Parent == null) return null;
|
|
||||||
if (args.Parent.IsRoot) return null;
|
if (args.Parent.IsRoot) return null;
|
||||||
|
|
||||||
// Don't allow nested artists
|
// Don't allow nested artists
|
||||||
|
@ -56,16 +59,9 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers.Audio
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Optimization
|
|
||||||
if (args.HasParent<BoxSet>() || args.HasParent<Series>() || args.HasParent<Season>())
|
|
||||||
{
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
var collectionType = args.GetCollectionType();
|
var collectionType = args.GetCollectionType();
|
||||||
|
|
||||||
var isMusicMediaFolder = string.Equals(collectionType, CollectionType.Music,
|
var isMusicMediaFolder = string.Equals(collectionType, CollectionType.Music, StringComparison.OrdinalIgnoreCase);
|
||||||
StringComparison.OrdinalIgnoreCase);
|
|
||||||
|
|
||||||
// If there's a collection type and it's not music, it can't be a series
|
// If there's a collection type and it's not music, it can't be a series
|
||||||
if (!isMusicMediaFolder)
|
if (!isMusicMediaFolder)
|
||||||
|
|
|
@ -1,10 +1,6 @@
|
||||||
using MediaBrowser.Common.IO;
|
using MediaBrowser.Controller.Entities;
|
||||||
using MediaBrowser.Controller.Entities;
|
|
||||||
using MediaBrowser.Controller.Library;
|
using MediaBrowser.Controller.Library;
|
||||||
using MediaBrowser.Controller.Resolvers;
|
using MediaBrowser.Controller.Resolvers;
|
||||||
using System;
|
|
||||||
using System.IO;
|
|
||||||
using System.Linq;
|
|
||||||
|
|
||||||
namespace MediaBrowser.Server.Implementations.Library.Resolvers
|
namespace MediaBrowser.Server.Implementations.Library.Resolvers
|
||||||
{
|
{
|
||||||
|
@ -13,13 +9,6 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class FolderResolver : FolderResolver<Folder>
|
public class FolderResolver : FolderResolver<Folder>
|
||||||
{
|
{
|
||||||
private readonly IFileSystem _fileSystem;
|
|
||||||
|
|
||||||
public FolderResolver(IFileSystem fileSystem)
|
|
||||||
{
|
|
||||||
_fileSystem = fileSystem;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets the priority.
|
/// Gets the priority.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -38,48 +27,11 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers
|
||||||
{
|
{
|
||||||
if (args.IsDirectory)
|
if (args.IsDirectory)
|
||||||
{
|
{
|
||||||
if (args.IsPhysicalRoot)
|
|
||||||
{
|
|
||||||
return new AggregateFolder();
|
|
||||||
}
|
|
||||||
if (args.IsRoot)
|
|
||||||
{
|
|
||||||
return new UserRootFolder(); //if we got here and still a root - must be user root
|
|
||||||
}
|
|
||||||
if (args.IsVf)
|
|
||||||
{
|
|
||||||
return new CollectionFolder
|
|
||||||
{
|
|
||||||
CollectionType = GetCollectionType(args)
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
return new Folder();
|
return new Folder();
|
||||||
}
|
}
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
private string GetCollectionType(ItemResolveArgs args)
|
|
||||||
{
|
|
||||||
return args.FileSystemChildren
|
|
||||||
.Where(i =>
|
|
||||||
{
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
return (i.Attributes & FileAttributes.Directory) != FileAttributes.Directory &&
|
|
||||||
string.Equals(".collection", i.Extension, StringComparison.OrdinalIgnoreCase);
|
|
||||||
}
|
|
||||||
catch (IOException)
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
})
|
|
||||||
.Select(i => _fileSystem.GetFileNameWithoutExtension(i))
|
|
||||||
.FirstOrDefault();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|
|
@ -183,12 +183,6 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers.Movies
|
||||||
return FindMovie<Video>(args.Path, args.Parent, args.FileSystemChildren.ToList(), args.DirectoryService, collectionType);
|
return FindMovie<Video>(args.Path, args.Parent, args.FileSystemChildren.ToList(), args.DirectoryService, collectionType);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Since the looping is expensive, this is an optimization to help us avoid it
|
|
||||||
if (args.ContainsMetaFileByName("series.xml"))
|
|
||||||
{
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
return FindMovie<Movie>(args.Path, args.Parent, args.FileSystemChildren.ToList(), args.DirectoryService, collectionType);
|
return FindMovie<Movie>(args.Path, args.Parent, args.FileSystemChildren.ToList(), args.DirectoryService, collectionType);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
using MediaBrowser.Controller.Entities;
|
using MediaBrowser.Controller.Entities;
|
||||||
using MediaBrowser.Controller.Library;
|
using MediaBrowser.Controller.Library;
|
||||||
|
using MediaBrowser.Controller.Resolvers;
|
||||||
using MediaBrowser.Model.Entities;
|
using MediaBrowser.Model.Entities;
|
||||||
using System;
|
using System;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
|
@ -17,7 +18,7 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers
|
||||||
protected override PhotoAlbum Resolve(ItemResolveArgs args)
|
protected override PhotoAlbum Resolve(ItemResolveArgs args)
|
||||||
{
|
{
|
||||||
// Must be an image file within a photo collection
|
// Must be an image file within a photo collection
|
||||||
if (!args.IsRoot && args.IsDirectory && string.Equals(args.GetCollectionType(), CollectionType.Photos, StringComparison.OrdinalIgnoreCase))
|
if (args.IsDirectory && string.Equals(args.GetCollectionType(), CollectionType.Photos, StringComparison.OrdinalIgnoreCase))
|
||||||
{
|
{
|
||||||
if (HasPhotos(args))
|
if (HasPhotos(args))
|
||||||
{
|
{
|
||||||
|
@ -35,5 +36,14 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers
|
||||||
{
|
{
|
||||||
return args.FileSystemChildren.Any(i => ((i.Attributes & FileAttributes.Directory) != FileAttributes.Directory) && PhotoResolver.IsImageFile(i.FullName));
|
return args.FileSystemChildren.Any(i => ((i.Attributes & FileAttributes.Directory) != FileAttributes.Directory) && PhotoResolver.IsImageFile(i.FullName));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public override ResolverPriority Priority
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
// Behind special folder resolver
|
||||||
|
return ResolverPriority.Second;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,79 @@
|
||||||
|
using MediaBrowser.Common.IO;
|
||||||
|
using MediaBrowser.Controller.Entities;
|
||||||
|
using MediaBrowser.Controller.Library;
|
||||||
|
using MediaBrowser.Controller.Resolvers;
|
||||||
|
using System;
|
||||||
|
using System.IO;
|
||||||
|
using System.Linq;
|
||||||
|
|
||||||
|
namespace MediaBrowser.Server.Implementations.Library.Resolvers
|
||||||
|
{
|
||||||
|
class SpecialFolderResolver : FolderResolver<Folder>
|
||||||
|
{
|
||||||
|
private readonly IFileSystem _fileSystem;
|
||||||
|
|
||||||
|
public SpecialFolderResolver(IFileSystem fileSystem)
|
||||||
|
{
|
||||||
|
_fileSystem = fileSystem;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the priority.
|
||||||
|
/// </summary>
|
||||||
|
/// <value>The priority.</value>
|
||||||
|
public override ResolverPriority Priority
|
||||||
|
{
|
||||||
|
get { return ResolverPriority.First; }
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Resolves the specified args.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="args">The args.</param>
|
||||||
|
/// <returns>Folder.</returns>
|
||||||
|
protected override Folder Resolve(ItemResolveArgs args)
|
||||||
|
{
|
||||||
|
if (args.IsDirectory)
|
||||||
|
{
|
||||||
|
if (args.IsPhysicalRoot)
|
||||||
|
{
|
||||||
|
return new AggregateFolder();
|
||||||
|
}
|
||||||
|
if (args.IsRoot)
|
||||||
|
{
|
||||||
|
return new UserRootFolder(); //if we got here and still a root - must be user root
|
||||||
|
}
|
||||||
|
if (args.IsVf)
|
||||||
|
{
|
||||||
|
return new CollectionFolder
|
||||||
|
{
|
||||||
|
CollectionType = GetCollectionType(args)
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private string GetCollectionType(ItemResolveArgs args)
|
||||||
|
{
|
||||||
|
return args.FileSystemChildren
|
||||||
|
.Where(i =>
|
||||||
|
{
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
return (i.Attributes & FileAttributes.Directory) != FileAttributes.Directory &&
|
||||||
|
string.Equals(".collection", i.Extension, StringComparison.OrdinalIgnoreCase);
|
||||||
|
}
|
||||||
|
catch (IOException)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
})
|
||||||
|
.Select(i => _fileSystem.GetFileNameWithoutExtension(i))
|
||||||
|
.FirstOrDefault();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -53,13 +53,7 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers.TV
|
||||||
if (args.IsDirectory)
|
if (args.IsDirectory)
|
||||||
{
|
{
|
||||||
// Avoid expensive tests against VF's and all their children by not allowing this
|
// Avoid expensive tests against VF's and all their children by not allowing this
|
||||||
if (args.Parent == null || args.Parent.IsRoot)
|
if (args.Parent.IsRoot)
|
||||||
{
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Optimization to avoid running these tests against Seasons
|
|
||||||
if (args.HasParent<Series>() || args.HasParent<Season>() || args.HasParent<MusicArtist>() || args.HasParent<MusicAlbum>())
|
|
||||||
{
|
{
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
@ -69,8 +63,12 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers.TV
|
||||||
var isTvShowsFolder = string.Equals(collectionType, CollectionType.TvShows, StringComparison.OrdinalIgnoreCase);
|
var isTvShowsFolder = string.Equals(collectionType, CollectionType.TvShows, StringComparison.OrdinalIgnoreCase);
|
||||||
|
|
||||||
// If there's a collection type and it's not tv, it can't be a series
|
// If there's a collection type and it's not tv, it can't be a series
|
||||||
if (!string.IsNullOrEmpty(collectionType) &&
|
if (!isTvShowsFolder)
|
||||||
!isTvShowsFolder)
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (args.HasParent<Series>() || args.HasParent<Season>())
|
||||||
{
|
{
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
using System.Collections.Concurrent;
|
using MediaBrowser.Common.Events;
|
||||||
using MediaBrowser.Common.Events;
|
|
||||||
using MediaBrowser.Common.Extensions;
|
using MediaBrowser.Common.Extensions;
|
||||||
using MediaBrowser.Common.Net;
|
using MediaBrowser.Common.Net;
|
||||||
using MediaBrowser.Controller;
|
using MediaBrowser.Controller;
|
||||||
|
@ -63,6 +62,7 @@ namespace MediaBrowser.Server.Implementations.Library
|
||||||
public event EventHandler<GenericEventArgs<User>> UserPasswordChanged;
|
public event EventHandler<GenericEventArgs<User>> UserPasswordChanged;
|
||||||
|
|
||||||
private readonly IXmlSerializer _xmlSerializer;
|
private readonly IXmlSerializer _xmlSerializer;
|
||||||
|
private readonly IJsonSerializer _jsonSerializer;
|
||||||
|
|
||||||
private readonly INetworkManager _networkManager;
|
private readonly INetworkManager _networkManager;
|
||||||
|
|
||||||
|
@ -71,13 +71,7 @@ namespace MediaBrowser.Server.Implementations.Library
|
||||||
private readonly Func<IConnectManager> _connectFactory;
|
private readonly Func<IConnectManager> _connectFactory;
|
||||||
private readonly IServerApplicationHost _appHost;
|
private readonly IServerApplicationHost _appHost;
|
||||||
|
|
||||||
/// <summary>
|
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)
|
||||||
/// Initializes a new instance of the <see cref="UserManager" /> class.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="logger">The logger.</param>
|
|
||||||
/// <param name="configurationManager">The configuration manager.</param>
|
|
||||||
/// <param name="userRepository">The user repository.</param>
|
|
||||||
public UserManager(ILogger logger, IServerConfigurationManager configurationManager, IUserRepository userRepository, IXmlSerializer xmlSerializer, INetworkManager networkManager, Func<IImageProcessor> imageProcessorFactory, Func<IDtoService> dtoServiceFactory, Func<IConnectManager> connectFactory, IServerApplicationHost appHost)
|
|
||||||
{
|
{
|
||||||
_logger = logger;
|
_logger = logger;
|
||||||
UserRepository = userRepository;
|
UserRepository = userRepository;
|
||||||
|
@ -87,6 +81,7 @@ namespace MediaBrowser.Server.Implementations.Library
|
||||||
_dtoServiceFactory = dtoServiceFactory;
|
_dtoServiceFactory = dtoServiceFactory;
|
||||||
_connectFactory = connectFactory;
|
_connectFactory = connectFactory;
|
||||||
_appHost = appHost;
|
_appHost = appHost;
|
||||||
|
_jsonSerializer = jsonSerializer;
|
||||||
ConfigurationManager = configurationManager;
|
ConfigurationManager = configurationManager;
|
||||||
Users = new List<User>();
|
Users = new List<User>();
|
||||||
|
|
||||||
|
@ -164,6 +159,11 @@ namespace MediaBrowser.Server.Implementations.Library
|
||||||
public async Task Initialize()
|
public async Task Initialize()
|
||||||
{
|
{
|
||||||
Users = await LoadUsers().ConfigureAwait(false);
|
Users = await LoadUsers().ConfigureAwait(false);
|
||||||
|
|
||||||
|
foreach (var user in Users.ToList())
|
||||||
|
{
|
||||||
|
await DoPolicyMigration(user).ConfigureAwait(false);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public Task<bool> AuthenticateUser(string username, string passwordSha1, string remoteEndPoint)
|
public Task<bool> AuthenticateUser(string username, string passwordSha1, string remoteEndPoint)
|
||||||
|
@ -185,7 +185,7 @@ namespace MediaBrowser.Server.Implementations.Library
|
||||||
throw new SecurityException("Invalid username or password entered.");
|
throw new SecurityException("Invalid username or password entered.");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (user.Configuration.IsDisabled)
|
if (user.Policy.IsDisabled)
|
||||||
{
|
{
|
||||||
throw new SecurityException(string.Format("The {0} account is currently disabled. Please consult with your administrator.", user.Name));
|
throw new SecurityException(string.Format("The {0} account is currently disabled. Please consult with your administrator.", user.Name));
|
||||||
}
|
}
|
||||||
|
@ -283,14 +283,42 @@ namespace MediaBrowser.Server.Implementations.Library
|
||||||
|
|
||||||
users.Add(user);
|
users.Add(user);
|
||||||
|
|
||||||
user.Configuration.IsAdministrator = true;
|
user.Policy.IsAdministrator = true;
|
||||||
user.Configuration.EnableRemoteControlOfOtherUsers = true;
|
user.Policy.EnableRemoteControlOfOtherUsers = true;
|
||||||
UpdateConfiguration(user, user.Configuration);
|
await UpdateUserPolicy(user, user.Policy, false).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
return users;
|
return users;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private async Task DoPolicyMigration(User user)
|
||||||
|
{
|
||||||
|
if (!user.Configuration.ValuesMigratedToPolicy)
|
||||||
|
{
|
||||||
|
user.Policy.AccessSchedules = user.Configuration.AccessSchedules;
|
||||||
|
user.Policy.BlockedChannels = user.Configuration.BlockedChannels;
|
||||||
|
user.Policy.BlockedMediaFolders = user.Configuration.BlockedMediaFolders;
|
||||||
|
user.Policy.BlockedTags = user.Configuration.BlockedTags;
|
||||||
|
user.Policy.BlockUnratedItems = user.Configuration.BlockUnratedItems;
|
||||||
|
user.Policy.EnableContentDeletion = user.Configuration.EnableContentDeletion;
|
||||||
|
user.Policy.EnableLiveTvAccess = user.Configuration.EnableLiveTvAccess;
|
||||||
|
user.Policy.EnableLiveTvManagement = user.Configuration.EnableLiveTvManagement;
|
||||||
|
user.Policy.EnableMediaPlayback = user.Configuration.EnableMediaPlayback;
|
||||||
|
user.Policy.EnableRemoteControlOfOtherUsers = user.Configuration.EnableRemoteControlOfOtherUsers;
|
||||||
|
user.Policy.EnableSharedDeviceControl = user.Configuration.EnableSharedDeviceControl;
|
||||||
|
user.Policy.EnableUserPreferenceAccess = user.Configuration.EnableUserPreferenceAccess;
|
||||||
|
user.Policy.IsAdministrator = user.Configuration.IsAdministrator;
|
||||||
|
user.Policy.IsDisabled = user.Configuration.IsDisabled;
|
||||||
|
user.Policy.IsHidden = user.Configuration.IsHidden;
|
||||||
|
user.Policy.MaxParentalRating = user.Configuration.MaxParentalRating;
|
||||||
|
|
||||||
|
await UpdateUserPolicy(user.Id.ToString("N"), user.Policy);
|
||||||
|
|
||||||
|
user.Configuration.ValuesMigratedToPolicy = true;
|
||||||
|
await UpdateConfiguration(user, user.Configuration, true).ConfigureAwait(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public UserDto GetUserDto(User user, string remoteEndPoint = null)
|
public UserDto GetUserDto(User user, string remoteEndPoint = null)
|
||||||
{
|
{
|
||||||
if (user == null)
|
if (user == null)
|
||||||
|
@ -509,7 +537,7 @@ namespace MediaBrowser.Server.Implementations.Library
|
||||||
throw new ArgumentException(string.Format("The user '{0}' cannot be deleted because there must be at least one user in the system.", user.Name));
|
throw new ArgumentException(string.Format("The user '{0}' cannot be deleted because there must be at least one user in the system.", user.Name));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (user.Configuration.IsAdministrator && allUsers.Count(i => i.Configuration.IsAdministrator) == 1)
|
if (user.Policy.IsAdministrator && allUsers.Count(i => i.Policy.IsAdministrator) == 1)
|
||||||
{
|
{
|
||||||
throw new ArgumentException(string.Format("The user '{0}' cannot be deleted because there must be at least one admin user in the system.", user.Name));
|
throw new ArgumentException(string.Format("The user '{0}' cannot be deleted because there must be at least one admin user in the system.", user.Name));
|
||||||
}
|
}
|
||||||
|
@ -518,17 +546,17 @@ namespace MediaBrowser.Server.Implementations.Library
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
await UserRepository.DeleteUser(user, CancellationToken.None).ConfigureAwait(false);
|
var configPath = GetConfigurationFilePath(user);
|
||||||
|
|
||||||
var path = user.ConfigurationFilePath;
|
await UserRepository.DeleteUser(user, CancellationToken.None).ConfigureAwait(false);
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
File.Delete(path);
|
File.Delete(configPath);
|
||||||
}
|
}
|
||||||
catch (IOException ex)
|
catch (IOException ex)
|
||||||
{
|
{
|
||||||
_logger.ErrorException("Error deleting file {0}", ex, path);
|
_logger.ErrorException("Error deleting file {0}", ex, configPath);
|
||||||
}
|
}
|
||||||
|
|
||||||
DeleteUserPolicy(user);
|
DeleteUserPolicy(user);
|
||||||
|
@ -613,15 +641,6 @@ namespace MediaBrowser.Server.Implementations.Library
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
public void UpdateConfiguration(User user, UserConfiguration newConfiguration)
|
|
||||||
{
|
|
||||||
var xmlPath = user.ConfigurationFilePath;
|
|
||||||
Directory.CreateDirectory(Path.GetDirectoryName(xmlPath));
|
|
||||||
_xmlSerializer.SerializeToFile(newConfiguration, xmlPath);
|
|
||||||
|
|
||||||
EventHelper.FireEventIfNotNull(UserConfigurationUpdated, this, new GenericEventArgs<User> { Argument = user }, _logger);
|
|
||||||
}
|
|
||||||
|
|
||||||
private string PasswordResetFile
|
private string PasswordResetFile
|
||||||
{
|
{
|
||||||
get { return Path.Combine(ConfigurationManager.ApplicationPaths.ProgramDataPath, "passwordreset.txt"); }
|
get { return Path.Combine(ConfigurationManager.ApplicationPaths.ProgramDataPath, "passwordreset.txt"); }
|
||||||
|
@ -689,7 +708,7 @@ namespace MediaBrowser.Server.Implementations.Library
|
||||||
string pinFile = null;
|
string pinFile = null;
|
||||||
DateTime? expirationDate = null;
|
DateTime? expirationDate = null;
|
||||||
|
|
||||||
if (user != null && !user.Configuration.IsAdministrator)
|
if (user != null && !user.Policy.IsAdministrator)
|
||||||
{
|
{
|
||||||
action = ForgotPasswordAction.ContactAdmin;
|
action = ForgotPasswordAction.ContactAdmin;
|
||||||
}
|
}
|
||||||
|
@ -781,7 +800,7 @@ namespace MediaBrowser.Server.Implementations.Library
|
||||||
{
|
{
|
||||||
lock (_policySyncLock)
|
lock (_policySyncLock)
|
||||||
{
|
{
|
||||||
return (UserPolicy) _xmlSerializer.DeserializeFromFile(typeof (UserPolicy), path);
|
return (UserPolicy)_jsonSerializer.DeserializeFromFile(typeof(UserPolicy), path);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (FileNotFoundException)
|
catch (FileNotFoundException)
|
||||||
|
@ -805,16 +824,38 @@ namespace MediaBrowser.Server.Implementations.Library
|
||||||
}
|
}
|
||||||
|
|
||||||
private readonly object _policySyncLock = new object();
|
private readonly object _policySyncLock = new object();
|
||||||
public async Task UpdateUserPolicy(string userId, UserPolicy userPolicy)
|
public Task UpdateUserPolicy(string userId, UserPolicy userPolicy)
|
||||||
{
|
{
|
||||||
var user = GetUserById(userId);
|
var user = GetUserById(userId);
|
||||||
|
return UpdateUserPolicy(user, userPolicy, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task UpdateUserPolicy(User user, UserPolicy userPolicy, bool fireEvent)
|
||||||
|
{
|
||||||
|
var updateConfig = user.Policy.IsAdministrator != userPolicy.IsAdministrator ||
|
||||||
|
user.Policy.EnableLiveTvManagement != userPolicy.EnableLiveTvManagement ||
|
||||||
|
user.Policy.EnableLiveTvAccess != userPolicy.EnableLiveTvAccess ||
|
||||||
|
user.Policy.EnableMediaPlayback != userPolicy.EnableMediaPlayback ||
|
||||||
|
user.Policy.EnableContentDeletion != userPolicy.EnableContentDeletion;
|
||||||
|
|
||||||
var path = GetPolifyFilePath(user);
|
var path = GetPolifyFilePath(user);
|
||||||
|
|
||||||
lock (_policySyncLock)
|
lock (_policySyncLock)
|
||||||
{
|
{
|
||||||
_xmlSerializer.SerializeToFile(userPolicy, path);
|
_jsonSerializer.SerializeToFile(userPolicy, path);
|
||||||
user.Policy = userPolicy;
|
user.Policy = userPolicy;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (updateConfig)
|
||||||
|
{
|
||||||
|
user.Configuration.IsAdministrator = user.Policy.IsAdministrator;
|
||||||
|
user.Configuration.EnableLiveTvManagement = user.Policy.EnableLiveTvManagement;
|
||||||
|
user.Configuration.EnableLiveTvAccess = user.Policy.EnableLiveTvAccess;
|
||||||
|
user.Configuration.EnableMediaPlayback = user.Policy.EnableMediaPlayback;
|
||||||
|
user.Configuration.EnableContentDeletion = user.Policy.EnableContentDeletion;
|
||||||
|
|
||||||
|
await UpdateConfiguration(user, user.Configuration, true).ConfigureAwait(false);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void DeleteUserPolicy(User user)
|
private void DeleteUserPolicy(User user)
|
||||||
|
@ -840,7 +881,65 @@ namespace MediaBrowser.Server.Implementations.Library
|
||||||
|
|
||||||
private string GetPolifyFilePath(User user)
|
private string GetPolifyFilePath(User user)
|
||||||
{
|
{
|
||||||
return Path.Combine(user.ConfigurationDirectoryPath, "policy.xml");
|
return Path.Combine(user.ConfigurationDirectoryPath, "policy.json");
|
||||||
|
}
|
||||||
|
|
||||||
|
private string GetConfigurationFilePath(User user)
|
||||||
|
{
|
||||||
|
return Path.Combine(user.ConfigurationDirectoryPath, "config.xml");
|
||||||
|
}
|
||||||
|
|
||||||
|
public UserConfiguration GetUserConfiguration(User user)
|
||||||
|
{
|
||||||
|
var path = GetConfigurationFilePath(user);
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
lock (_configSyncLock)
|
||||||
|
{
|
||||||
|
return (UserConfiguration)_xmlSerializer.DeserializeFromFile(typeof(UserConfiguration), path);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (FileNotFoundException)
|
||||||
|
{
|
||||||
|
return new UserConfiguration();
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
_logger.ErrorException("Error reading policy file: {0}", ex, path);
|
||||||
|
|
||||||
|
return new UserConfiguration();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private readonly object _configSyncLock = new object();
|
||||||
|
public Task UpdateConfiguration(string userId, UserConfiguration config)
|
||||||
|
{
|
||||||
|
var user = GetUserById(userId);
|
||||||
|
return UpdateConfiguration(user, config, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task UpdateConfiguration(User user, UserConfiguration config, bool fireEvent)
|
||||||
|
{
|
||||||
|
var path = GetConfigurationFilePath(user);
|
||||||
|
|
||||||
|
// The xml serializer will output differently if the type is not exact
|
||||||
|
if (config.GetType() != typeof (UserConfiguration))
|
||||||
|
{
|
||||||
|
var json = _jsonSerializer.SerializeToString(config);
|
||||||
|
config = _jsonSerializer.DeserializeFromString<UserConfiguration>(json);
|
||||||
|
}
|
||||||
|
|
||||||
|
lock (_configSyncLock)
|
||||||
|
{
|
||||||
|
_xmlSerializer.SerializeToFile(config, path);
|
||||||
|
user.Configuration = config;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fireEvent)
|
||||||
|
{
|
||||||
|
EventHelper.FireEventIfNotNull(UserConfigurationUpdated, this, new GenericEventArgs<User> { Argument = user }, _logger);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1846,7 +1846,7 @@ namespace MediaBrowser.Server.Implementations.LiveTv
|
||||||
|
|
||||||
private bool IsLiveTvEnabled(User user)
|
private bool IsLiveTvEnabled(User user)
|
||||||
{
|
{
|
||||||
return user.Configuration.EnableLiveTvAccess && ActiveService != null;
|
return user.Policy.EnableLiveTvAccess && ActiveService != null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public IEnumerable<User> GetEnabledUsers()
|
public IEnumerable<User> GetEnabledUsers()
|
||||||
|
@ -1854,7 +1854,7 @@ namespace MediaBrowser.Server.Implementations.LiveTv
|
||||||
var service = ActiveService;
|
var service = ActiveService;
|
||||||
|
|
||||||
return _userManager.Users
|
return _userManager.Users
|
||||||
.Where(i => i.Configuration.EnableLiveTvAccess && service != null);
|
.Where(i => i.Policy.EnableLiveTvAccess && service != null);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|
|
@ -418,7 +418,7 @@
|
||||||
"HeaderMediaLocations": "Media Locations",
|
"HeaderMediaLocations": "Media Locations",
|
||||||
"LabelFolderTypeValue": "Folder type: {0}",
|
"LabelFolderTypeValue": "Folder type: {0}",
|
||||||
"LabelPathSubstitutionHelp": "Optional: Path substitution can map server paths to network shares that clients can access for direct playback.",
|
"LabelPathSubstitutionHelp": "Optional: Path substitution can map server paths to network shares that clients can access for direct playback.",
|
||||||
"FolderTypeMixed": "Mixed movies & tv",
|
"FolderTypeMixed": "Mixed videos",
|
||||||
"FolderTypeMovies": "Movies",
|
"FolderTypeMovies": "Movies",
|
||||||
"FolderTypeMusic": "Music",
|
"FolderTypeMusic": "Music",
|
||||||
"FolderTypeAdultVideos": "Adult videos",
|
"FolderTypeAdultVideos": "Adult videos",
|
||||||
|
@ -427,7 +427,7 @@
|
||||||
"FolderTypeHomeVideos": "Home videos",
|
"FolderTypeHomeVideos": "Home videos",
|
||||||
"FolderTypeGames": "Games",
|
"FolderTypeGames": "Games",
|
||||||
"FolderTypeBooks": "Books",
|
"FolderTypeBooks": "Books",
|
||||||
"FolderTypeTvShows": "TV shows",
|
"FolderTypeTvShows": "TV",
|
||||||
"TabMovies": "Movies",
|
"TabMovies": "Movies",
|
||||||
"TabSeries": "Series",
|
"TabSeries": "Series",
|
||||||
"TabEpisodes": "Episodes",
|
"TabEpisodes": "Episodes",
|
||||||
|
@ -654,5 +654,8 @@
|
||||||
"OptionSyncUnwatchedVideosOnly": "Sync unwatched videos only",
|
"OptionSyncUnwatchedVideosOnly": "Sync unwatched videos only",
|
||||||
"OptionSyncUnwatchedVideosOnlyHelp": "Only unwatched videos will be synced, and videos will be removed from the device as they are watched.",
|
"OptionSyncUnwatchedVideosOnlyHelp": "Only unwatched videos will be synced, and videos will be removed from the device as they are watched.",
|
||||||
"LabelItemLimit": "Item limit:",
|
"LabelItemLimit": "Item limit:",
|
||||||
"LabelItemLimitHelp": "Optional. Set a limit to the number of items that will be synced."
|
"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",
|
||||||
|
"MessageMixedContentHelp": "Content will be displayed with as a plain folder structure"
|
||||||
}
|
}
|
||||||
|
|
|
@ -40,7 +40,6 @@
|
||||||
"HeaderSetupLibrary": "Setup your media library",
|
"HeaderSetupLibrary": "Setup your media library",
|
||||||
"ButtonAddMediaFolder": "Add media folder",
|
"ButtonAddMediaFolder": "Add media folder",
|
||||||
"LabelFolderType": "Folder type:",
|
"LabelFolderType": "Folder type:",
|
||||||
"MediaFolderHelpPluginRequired": "* Requires the use of a plugin, e.g. GameBrowser or MB Bookshelf.",
|
|
||||||
"ReferToMediaLibraryWiki": "Refer to the media library wiki.",
|
"ReferToMediaLibraryWiki": "Refer to the media library wiki.",
|
||||||
"LabelCountry": "Country:",
|
"LabelCountry": "Country:",
|
||||||
"LabelLanguage": "Language:",
|
"LabelLanguage": "Language:",
|
||||||
|
|
|
@ -183,6 +183,7 @@
|
||||||
<Compile Include="Library\LocalTrailerPostScanTask.cs" />
|
<Compile Include="Library\LocalTrailerPostScanTask.cs" />
|
||||||
<Compile Include="Library\MusicManager.cs" />
|
<Compile Include="Library\MusicManager.cs" />
|
||||||
<Compile Include="Library\PathExtensions.cs" />
|
<Compile Include="Library\PathExtensions.cs" />
|
||||||
|
<Compile Include="Library\Resolvers\SpecialFolderResolver.cs" />
|
||||||
<Compile Include="Library\Resolvers\BaseVideoResolver.cs" />
|
<Compile Include="Library\Resolvers\BaseVideoResolver.cs" />
|
||||||
<Compile Include="Library\Resolvers\PhotoAlbumResolver.cs" />
|
<Compile Include="Library\Resolvers\PhotoAlbumResolver.cs" />
|
||||||
<Compile Include="Library\Resolvers\PhotoResolver.cs" />
|
<Compile Include="Library\Resolvers\PhotoResolver.cs" />
|
||||||
|
|
|
@ -78,7 +78,7 @@ namespace MediaBrowser.Server.Implementations.Notifications
|
||||||
switch (request.SendToUserMode.Value)
|
switch (request.SendToUserMode.Value)
|
||||||
{
|
{
|
||||||
case SendToUserType.Admins:
|
case SendToUserType.Admins:
|
||||||
return _userManager.Users.Where(i => i.Configuration.IsAdministrator)
|
return _userManager.Users.Where(i => i.Policy.IsAdministrator)
|
||||||
.Select(i => i.Id.ToString("N"));
|
.Select(i => i.Id.ToString("N"));
|
||||||
case SendToUserType.All:
|
case SendToUserType.All:
|
||||||
return _userManager.Users.Select(i => i.Id.ToString("N"));
|
return _userManager.Users.Select(i => i.Id.ToString("N"));
|
||||||
|
|
|
@ -4,6 +4,7 @@ using MediaBrowser.Controller.Entities;
|
||||||
using MediaBrowser.Controller.Entities.Audio;
|
using MediaBrowser.Controller.Entities.Audio;
|
||||||
using MediaBrowser.Controller.Entities.TV;
|
using MediaBrowser.Controller.Entities.TV;
|
||||||
using MediaBrowser.Controller.Library;
|
using MediaBrowser.Controller.Library;
|
||||||
|
using MediaBrowser.Controller.LiveTv;
|
||||||
using MediaBrowser.Controller.Sync;
|
using MediaBrowser.Controller.Sync;
|
||||||
using MediaBrowser.Model.Dlna;
|
using MediaBrowser.Model.Dlna;
|
||||||
using MediaBrowser.Model.Entities;
|
using MediaBrowser.Model.Entities;
|
||||||
|
@ -242,7 +243,7 @@ namespace MediaBrowser.Server.Implementations.Sync
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
return item.LocationType == LocationType.FileSystem || item is Season;
|
return item.LocationType == LocationType.FileSystem || item is Season || item is ILiveTvRecording;
|
||||||
}
|
}
|
||||||
|
|
||||||
private string GetDefaultName(BaseItem item)
|
private string GetDefaultName(BaseItem item)
|
||||||
|
|
|
@ -24,6 +24,7 @@ namespace MediaBrowser.Server.Implementations.Sync
|
||||||
private readonly CultureInfo _usCulture = new CultureInfo("en-US");
|
private readonly CultureInfo _usCulture = new CultureInfo("en-US");
|
||||||
|
|
||||||
private IDbCommand _deleteJobCommand;
|
private IDbCommand _deleteJobCommand;
|
||||||
|
private IDbCommand _deleteJobItemsCommand;
|
||||||
private IDbCommand _saveJobCommand;
|
private IDbCommand _saveJobCommand;
|
||||||
private IDbCommand _saveJobItemCommand;
|
private IDbCommand _saveJobItemCommand;
|
||||||
|
|
||||||
|
@ -61,9 +62,13 @@ namespace MediaBrowser.Server.Implementations.Sync
|
||||||
private void PrepareStatements()
|
private void PrepareStatements()
|
||||||
{
|
{
|
||||||
_deleteJobCommand = _connection.CreateCommand();
|
_deleteJobCommand = _connection.CreateCommand();
|
||||||
_deleteJobCommand.CommandText = "delete from SyncJobs where Id=@Id; delete from SyncJobItems where JobId=@Id";
|
_deleteJobCommand.CommandText = "delete from SyncJobs where Id=@Id";
|
||||||
_deleteJobCommand.Parameters.Add(_deleteJobCommand, "@Id");
|
_deleteJobCommand.Parameters.Add(_deleteJobCommand, "@Id");
|
||||||
|
|
||||||
|
_deleteJobItemsCommand = _connection.CreateCommand();
|
||||||
|
_deleteJobItemsCommand.CommandText = "delete from SyncJobItems where JobId=@JobId";
|
||||||
|
_deleteJobItemsCommand.Parameters.Add(_deleteJobItemsCommand, "@JobId");
|
||||||
|
|
||||||
_saveJobCommand = _connection.CreateCommand();
|
_saveJobCommand = _connection.CreateCommand();
|
||||||
_saveJobCommand.CommandText = "replace into SyncJobs (Id, TargetId, Name, Quality, Status, Progress, UserId, ItemIds, Category, ParentId, UnwatchedOnly, ItemLimit, SyncNewContent, DateCreated, DateLastModified, ItemCount) values (@Id, @TargetId, @Name, @Quality, @Status, @Progress, @UserId, @ItemIds, @Category, @ParentId, @UnwatchedOnly, @ItemLimit, @SyncNewContent, @DateCreated, @DateLastModified, @ItemCount)";
|
_saveJobCommand.CommandText = "replace into SyncJobs (Id, TargetId, Name, Quality, Status, Progress, UserId, ItemIds, Category, ParentId, UnwatchedOnly, ItemLimit, SyncNewContent, DateCreated, DateLastModified, ItemCount) values (@Id, @TargetId, @Name, @Quality, @Status, @Progress, @UserId, @ItemIds, @Category, @ParentId, @UnwatchedOnly, @ItemLimit, @SyncNewContent, @DateCreated, @DateLastModified, @ItemCount)";
|
||||||
|
|
||||||
|
@ -289,11 +294,13 @@ namespace MediaBrowser.Server.Implementations.Sync
|
||||||
var index = 0;
|
var index = 0;
|
||||||
|
|
||||||
_deleteJobCommand.GetParameter(index++).Value = new Guid(id);
|
_deleteJobCommand.GetParameter(index++).Value = new Guid(id);
|
||||||
|
|
||||||
_deleteJobCommand.Transaction = transaction;
|
_deleteJobCommand.Transaction = transaction;
|
||||||
|
|
||||||
_deleteJobCommand.ExecuteNonQuery();
|
_deleteJobCommand.ExecuteNonQuery();
|
||||||
|
|
||||||
|
_deleteJobItemsCommand.GetParameter(index++).Value = new Guid(id);
|
||||||
|
_deleteJobItemsCommand.Transaction = transaction;
|
||||||
|
_deleteJobItemsCommand.ExecuteNonQuery();
|
||||||
|
|
||||||
transaction.Commit();
|
transaction.Commit();
|
||||||
}
|
}
|
||||||
catch (OperationCanceledException)
|
catch (OperationCanceledException)
|
||||||
|
|
|
@ -419,7 +419,7 @@ namespace MediaBrowser.Server.Startup.Common
|
||||||
SyncRepository = await GetSyncRepository().ConfigureAwait(false);
|
SyncRepository = await GetSyncRepository().ConfigureAwait(false);
|
||||||
RegisterSingleInstance(SyncRepository);
|
RegisterSingleInstance(SyncRepository);
|
||||||
|
|
||||||
UserManager = new UserManager(LogManager.GetLogger("UserManager"), ServerConfigurationManager, UserRepository, XmlSerializer, NetworkManager, () => ImageProcessor, () => DtoService, () => ConnectManager, this);
|
UserManager = new UserManager(LogManager.GetLogger("UserManager"), ServerConfigurationManager, UserRepository, XmlSerializer, NetworkManager, () => ImageProcessor, () => DtoService, () => ConnectManager, this, JsonSerializer);
|
||||||
RegisterSingleInstance(UserManager);
|
RegisterSingleInstance(UserManager);
|
||||||
|
|
||||||
LibraryManager = new LibraryManager(Logger, TaskManager, UserManager, ServerConfigurationManager, UserDataManager, () => LibraryMonitor, FileSystemManager, () => ProviderManager);
|
LibraryManager = new LibraryManager(Logger, TaskManager, UserManager, ServerConfigurationManager, UserDataManager, () => LibraryMonitor, FileSystemManager, () => ProviderManager);
|
||||||
|
|
|
@ -210,9 +210,6 @@
|
||||||
<Content Include="dashboard-ui\css\images\favicon.ico">
|
<Content Include="dashboard-ui\css\images\favicon.ico">
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
</Content>
|
</Content>
|
||||||
<Content Include="dashboard-ui\css\images\headersearch.png">
|
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
|
||||||
</Content>
|
|
||||||
<Content Include="dashboard-ui\css\images\icons\ellipsis-v.png">
|
<Content Include="dashboard-ui\css\images\icons\ellipsis-v.png">
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
</Content>
|
</Content>
|
||||||
|
@ -228,9 +225,6 @@
|
||||||
<Content Include="dashboard-ui\css\images\items\folders\report.png">
|
<Content Include="dashboard-ui\css\images\items\folders\report.png">
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
</Content>
|
</Content>
|
||||||
<Content Include="dashboard-ui\css\images\items\folders\settings.png">
|
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
|
||||||
</Content>
|
|
||||||
<Content Include="dashboard-ui\css\images\icons\audiocd.png">
|
<Content Include="dashboard-ui\css\images\icons\audiocd.png">
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
</Content>
|
</Content>
|
||||||
|
@ -594,9 +588,6 @@
|
||||||
<Content Include="dashboard-ui\css\images\rotten.png">
|
<Content Include="dashboard-ui\css\images\rotten.png">
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
</Content>
|
</Content>
|
||||||
<Content Include="dashboard-ui\css\images\currentuserdefaultwhite.png">
|
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
|
||||||
</Content>
|
|
||||||
<Content Include="dashboard-ui\css\images\items\detail\person.png">
|
<Content Include="dashboard-ui\css\images\items\detail\person.png">
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
</Content>
|
</Content>
|
||||||
|
|
Loading…
Reference in New Issue
Block a user