From 6ca771cc7906ae6524f737ae9bf0bc1b916efb40 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Wed, 15 Oct 2014 23:26:39 -0400 Subject: [PATCH] move user image into profile settings --- MediaBrowser.Api/LiveTv/LiveTvService.cs | 3 + .../Playback/BaseStreamingService.cs | 53 ++- .../Playback/Hls/BaseHlsService.cs | 19 +- .../Playback/Hls/DynamicHlsService.cs | 28 +- .../Playback/Hls/MpegDashService.cs | 323 +++++++++++++++++- MediaBrowser.Api/Playback/StreamState.cs | 12 +- MediaBrowser.Api/UserService.cs | 20 +- .../Entities/DayOfWeekHelper.cs | 71 ++++ .../Entities/TV/Episode.cs | 41 +-- MediaBrowser.Controller/Entities/User.cs | 3 +- .../MediaBrowser.Controller.csproj | 1 + .../MediaBrowser.Model.Portable.csproj | 6 + .../MediaBrowser.Model.net35.csproj | 6 + .../Configuration/AccessSchedule.cs | 5 +- .../Configuration/DynamicDayOfWeek.cs | 17 + .../Connect/ConnectUserServer.cs | 12 + MediaBrowser.Model/MediaBrowser.Model.csproj | 2 + .../Movies/MovieMetadataService.cs | 7 +- .../Connect/ConnectManager.cs | 15 +- .../Library/UserManager.cs | 22 +- .../Localization/JavaScript/ar.json | 3 +- .../Localization/JavaScript/ca.json | 3 +- .../Localization/JavaScript/cs.json | 3 +- .../Localization/JavaScript/da.json | 3 +- .../Localization/JavaScript/de.json | 3 +- .../Localization/JavaScript/el.json | 3 +- .../Localization/JavaScript/en_GB.json | 3 +- .../Localization/JavaScript/en_US.json | 3 +- .../Localization/JavaScript/es.json | 3 +- .../Localization/JavaScript/es_MX.json | 3 +- .../Localization/JavaScript/fr.json | 3 +- .../Localization/JavaScript/he.json | 3 +- .../Localization/JavaScript/hr.json | 3 +- .../Localization/JavaScript/it.json | 3 +- .../Localization/JavaScript/kk.json | 3 +- .../Localization/JavaScript/ms.json | 3 +- .../Localization/JavaScript/nb.json | 3 +- .../Localization/JavaScript/nl.json | 9 +- .../Localization/JavaScript/pl.json | 3 +- .../Localization/JavaScript/pt_BR.json | 17 +- .../Localization/JavaScript/pt_PT.json | 3 +- .../Localization/JavaScript/ru.json | 3 +- .../Localization/JavaScript/sv.json | 3 +- .../Localization/JavaScript/tr.json | 3 +- .../Localization/JavaScript/vi.json | 3 +- .../Localization/JavaScript/zh_TW.json | 3 +- .../Localization/Server/ar.json | 7 + .../Localization/Server/ca.json | 7 + .../Localization/Server/cs.json | 7 + .../Localization/Server/da.json | 7 + .../Localization/Server/de.json | 7 + .../Localization/Server/el.json | 7 + .../Localization/Server/en_GB.json | 7 + .../Localization/Server/en_US.json | 7 + .../Localization/Server/es.json | 7 + .../Localization/Server/es_MX.json | 9 +- .../Localization/Server/fr.json | 7 + .../Localization/Server/he.json | 7 + .../Localization/Server/hr.json | 7 + .../Localization/Server/it.json | 7 + .../Localization/Server/kk.json | 7 + .../Localization/Server/ko.json | 7 + .../Localization/Server/ms.json | 7 + .../Localization/Server/nb.json | 7 + .../Localization/Server/nl.json | 31 +- .../Localization/Server/pl.json | 7 + .../Localization/Server/pt_BR.json | 69 ++-- .../Localization/Server/pt_PT.json | 7 + .../Localization/Server/ru.json | 7 + .../Localization/Server/server.json | 7 +- .../Localization/Server/sv.json | 7 + .../Localization/Server/tr.json | 7 + .../Localization/Server/vi.json | 7 + .../Localization/Server/zh_TW.json | 7 + .../Session/SessionManager.cs | 13 +- .../Api/DashboardService.cs | 20 +- .../MediaBrowser.WebDashboard.csproj | 12 +- Nuget/MediaBrowser.Common.Internal.nuspec | 4 +- Nuget/MediaBrowser.Common.nuspec | 2 +- Nuget/MediaBrowser.Model.Signed.nuspec | 2 +- Nuget/MediaBrowser.Server.Core.nuspec | 4 +- 81 files changed, 886 insertions(+), 219 deletions(-) create mode 100644 MediaBrowser.Controller/Entities/DayOfWeekHelper.cs create mode 100644 MediaBrowser.Model/Configuration/DynamicDayOfWeek.cs create mode 100644 MediaBrowser.Model/Connect/ConnectUserServer.cs diff --git a/MediaBrowser.Api/LiveTv/LiveTvService.cs b/MediaBrowser.Api/LiveTv/LiveTvService.cs index 377decc4ca..906c0d830a 100644 --- a/MediaBrowser.Api/LiveTv/LiveTvService.cs +++ b/MediaBrowser.Api/LiveTv/LiveTvService.cs @@ -14,6 +14,9 @@ using System.Threading.Tasks; namespace MediaBrowser.Api.LiveTv { + /// + /// This is insecure right now to avoid windows phone refactoring + /// [Route("/LiveTv/Info", "GET", Summary = "Gets available live tv services.")] public class GetLiveTvInfo : IReturn { diff --git a/MediaBrowser.Api/Playback/BaseStreamingService.cs b/MediaBrowser.Api/Playback/BaseStreamingService.cs index 919e51eccf..dccf459eb8 100644 --- a/MediaBrowser.Api/Playback/BaseStreamingService.cs +++ b/MediaBrowser.Api/Playback/BaseStreamingService.cs @@ -267,9 +267,14 @@ namespace MediaBrowser.Api.Playback /// Gets the number of threads. /// /// System.Int32. - /// Unrecognized MediaEncodingQuality value. protected int GetNumberOfThreads(StreamState state, bool isWebm) { + if (isWebm) + { + // Recommended per docs + return Math.Max(Environment.ProcessorCount - 1, 2); + } + // Use more when this is true. -re will keep cpu usage under control if (state.ReadInputAtNativeFramerate) { @@ -907,9 +912,12 @@ namespace MediaBrowser.Api.Playback /// The state. /// The output path. /// The cancellation token source. + /// The working directory. /// Task. - /// ffmpeg was not found at + MediaEncoder.EncoderPath - protected async Task StartFfMpeg(StreamState state, string outputPath, CancellationTokenSource cancellationTokenSource) + protected async Task StartFfMpeg(StreamState state, + string outputPath, + CancellationTokenSource cancellationTokenSource, + string workingDirectory = null) { Directory.CreateDirectory(Path.GetDirectoryName(outputPath)); @@ -945,6 +953,11 @@ namespace MediaBrowser.Api.Playback EnableRaisingEvents = true }; + if (!string.IsNullOrWhiteSpace(workingDirectory)) + { + process.StartInfo.WorkingDirectory = workingDirectory; + } + var transcodingJob = ApiEntryPoint.Instance.OnTranscodeBeginning(outputPath, transcodingId, TranscodingJobType, @@ -1540,19 +1553,9 @@ namespace MediaBrowser.Api.Playback state.MediaPath = mediaUrl; state.InputProtocol = MediaProtocol.Http; } - else - { - // No media info, so this is probably needed - state.DeInterlace = true; - } - - if (recording.RecordingInfo.Status == RecordingStatus.InProgress) - { - state.ReadInputAtNativeFramerate = true; - } state.RunTimeTicks = recording.RunTimeTicks; - + state.DeInterlace = true; state.OutputAudioSync = "1000"; state.InputVideoSync = "-1"; state.InputAudioSync = "1"; @@ -1566,9 +1569,8 @@ namespace MediaBrowser.Api.Playback state.IsInputVideo = string.Equals(channel.MediaType, MediaType.Video, StringComparison.OrdinalIgnoreCase); mediaStreams = new List(); - state.ReadInputAtNativeFramerate = true; - state.OutputAudioSync = "1000"; state.DeInterlace = true; + state.OutputAudioSync = "1000"; state.InputVideoSync = "-1"; state.InputAudioSync = "1"; @@ -1626,30 +1628,19 @@ namespace MediaBrowser.Api.Playback state.RunTimeTicks = mediaSource.RunTimeTicks; } - // If it's a wtv and we don't have media info, we will probably need to deinterlace - if (string.Equals(state.InputContainer, "wtv", StringComparison.OrdinalIgnoreCase) && - mediaStreams.Count == 0) - { - state.DeInterlace = true; - } - - if (state.InputProtocol == MediaProtocol.Rtmp) - { - state.ReadInputAtNativeFramerate = true; - } - var videoRequest = request as VideoStreamRequest; AttachMediaStreamInfo(state, mediaStreams, videoRequest, url); - state.SegmentLength = state.ReadInputAtNativeFramerate ? 5 : 6; - state.HlsListSize = state.ReadInputAtNativeFramerate ? 100 : 1440; + state.SegmentLength = 6; var container = Path.GetExtension(state.RequestedUrl); if (string.IsNullOrEmpty(container)) { - container = request.Static ? state.InputContainer : Path.GetExtension(GetOutputFilePath(state)); + container = request.Static ? + state.InputContainer : + (Path.GetExtension(GetOutputFilePath(state)) ?? string.Empty).TrimStart('.'); } state.OutputContainer = (container ?? string.Empty).TrimStart('.'); diff --git a/MediaBrowser.Api/Playback/Hls/BaseHlsService.cs b/MediaBrowser.Api/Playback/Hls/BaseHlsService.cs index 4af94aeeb2..613039d23a 100644 --- a/MediaBrowser.Api/Playback/Hls/BaseHlsService.cs +++ b/MediaBrowser.Api/Playback/Hls/BaseHlsService.cs @@ -107,7 +107,7 @@ namespace MediaBrowser.Api.Playback.Hls throw; } - var waitCount = isLive ? 1 : GetSegmentWait(); + var waitCount = isLive ? 3 : 2; await WaitForMinimumSegmentCount(playlist, waitCount, cancellationTokenSource.Token).ConfigureAwait(false); } } @@ -144,23 +144,6 @@ namespace MediaBrowser.Api.Playback.Hls return ResultFactory.GetResult(playlistText, MimeTypes.GetMimeType("playlist.m3u8"), new Dictionary()); } - /// - /// Gets the segment wait. - /// - /// System.Int32. - protected int GetSegmentWait() - { - var minimumSegmentCount = 2; - var quality = GetQualitySetting(); - - if (quality == EncodingQuality.HighSpeed || quality == EncodingQuality.HighQuality) - { - minimumSegmentCount = 2; - } - - return minimumSegmentCount; - } - private string GetMasterPlaylistFileText(string firstPlaylist, int bitrate, bool includeBaselineStream, int baselineStreamBitrate) { var builder = new StringBuilder(); diff --git a/MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs b/MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs index aa28ee90ac..b41686cb6c 100644 --- a/MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs +++ b/MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs @@ -114,11 +114,13 @@ namespace MediaBrowser.Api.Playback.Hls var segmentPath = GetSegmentPath(playlistPath, index); var segmentLength = state.SegmentLength; + var segmentExtension = GetSegmentFileExtension(state); + TranscodingJob job = null; if (File.Exists(segmentPath)) { - job = ApiEntryPoint.Instance.OnTranscodeBeginRequest(playlistPath, TranscodingJobType.Hls); + job = ApiEntryPoint.Instance.OnTranscodeBeginRequest(playlistPath, TranscodingJobType); return await GetSegmentResult(playlistPath, segmentPath, index, segmentLength, job, cancellationToken).ConfigureAwait(false); } @@ -127,23 +129,23 @@ namespace MediaBrowser.Api.Playback.Hls { if (File.Exists(segmentPath)) { - job = ApiEntryPoint.Instance.OnTranscodeBeginRequest(playlistPath, TranscodingJobType.Hls); + job = ApiEntryPoint.Instance.OnTranscodeBeginRequest(playlistPath, TranscodingJobType); return await GetSegmentResult(playlistPath, segmentPath, index, segmentLength, job, cancellationToken).ConfigureAwait(false); } else { - var currentTranscodingIndex = GetCurrentTranscodingIndex(playlistPath); + var currentTranscodingIndex = GetCurrentTranscodingIndex(playlistPath, segmentExtension); if (currentTranscodingIndex == null || index < currentTranscodingIndex.Value || (index - currentTranscodingIndex.Value) > 4) { // If the playlist doesn't already exist, startup ffmpeg try { - ApiEntryPoint.Instance.KillTranscodingJobs(j => j.Type == TranscodingJobType.Hls && string.Equals(j.DeviceId, request.DeviceId, StringComparison.OrdinalIgnoreCase), p => !string.Equals(p, playlistPath, StringComparison.OrdinalIgnoreCase)); + ApiEntryPoint.Instance.KillTranscodingJobs(j => j.Type == TranscodingJobType && string.Equals(j.DeviceId, request.DeviceId, StringComparison.OrdinalIgnoreCase), p => !string.Equals(p, playlistPath, StringComparison.OrdinalIgnoreCase)); if (currentTranscodingIndex.HasValue) { - DeleteLastFile(playlistPath, 0); + DeleteLastFile(playlistPath, segmentExtension, 0); } var startSeconds = index * state.SegmentLength; @@ -173,13 +175,13 @@ namespace MediaBrowser.Api.Playback.Hls } Logger.Info("returning {0}", segmentPath); - job = job ?? ApiEntryPoint.Instance.GetTranscodingJob(playlistPath, TranscodingJobType.Hls); + job = job ?? ApiEntryPoint.Instance.GetTranscodingJob(playlistPath, TranscodingJobType); return await GetSegmentResult(playlistPath, segmentPath, index, segmentLength, job, cancellationToken).ConfigureAwait(false); } - public int? GetCurrentTranscodingIndex(string playlist) + public int? GetCurrentTranscodingIndex(string playlist, string segmentExtension) { - var file = GetLastTranscodingFile(playlist, FileSystem); + var file = GetLastTranscodingFile(playlist, segmentExtension, FileSystem); if (file == null) { @@ -193,14 +195,14 @@ namespace MediaBrowser.Api.Playback.Hls return int.Parse(indexString, NumberStyles.Integer, UsCulture); } - private void DeleteLastFile(string path, int retryCount) + private void DeleteLastFile(string path, string segmentExtension, int retryCount) { if (retryCount >= 5) { return; } - var file = GetLastTranscodingFile(path, FileSystem); + var file = GetLastTranscodingFile(path, segmentExtension, FileSystem); if (file != null) { @@ -213,7 +215,7 @@ namespace MediaBrowser.Api.Playback.Hls Logger.ErrorException("Error deleting partial stream file(s) {0}", ex, file.FullName); Thread.Sleep(100); - DeleteLastFile(path, retryCount + 1); + DeleteLastFile(path, segmentExtension, retryCount + 1); } catch (Exception ex) { @@ -222,7 +224,7 @@ namespace MediaBrowser.Api.Playback.Hls } } - private static FileInfo GetLastTranscodingFile(string playlist, IFileSystem fileSystem) + private static FileInfo GetLastTranscodingFile(string playlist, string segmentExtension, IFileSystem fileSystem) { var folder = Path.GetDirectoryName(playlist); @@ -230,7 +232,7 @@ namespace MediaBrowser.Api.Playback.Hls { return new DirectoryInfo(folder) .EnumerateFiles("*", SearchOption.TopDirectoryOnly) - .Where(i => string.Equals(i.Extension, ".ts", StringComparison.OrdinalIgnoreCase)) + .Where(i => string.Equals(i.Extension, segmentExtension, StringComparison.OrdinalIgnoreCase)) .OrderByDescending(fileSystem.GetLastWriteTimeUtc) .FirstOrDefault(); } diff --git a/MediaBrowser.Api/Playback/Hls/MpegDashService.cs b/MediaBrowser.Api/Playback/Hls/MpegDashService.cs index baa6233809..7135d9b84b 100644 --- a/MediaBrowser.Api/Playback/Hls/MpegDashService.cs +++ b/MediaBrowser.Api/Playback/Hls/MpegDashService.cs @@ -1,5 +1,4 @@ -using System.Security; -using MediaBrowser.Common.IO; +using MediaBrowser.Common.IO; using MediaBrowser.Common.Net; using MediaBrowser.Controller.Channels; using MediaBrowser.Controller.Configuration; @@ -7,11 +6,15 @@ using MediaBrowser.Controller.Dlna; using MediaBrowser.Controller.Library; using MediaBrowser.Controller.LiveTv; using MediaBrowser.Controller.MediaEncoding; +using MediaBrowser.Controller.Net; using MediaBrowser.Model.IO; using ServiceStack; using System; using System.Collections.Generic; using System.Globalization; +using System.IO; +using System.Linq; +using System.Security; using System.Text; using System.Threading; using System.Threading.Tasks; @@ -34,6 +37,7 @@ namespace MediaBrowser.Api.Playback.Hls } [Route("/Videos/{Id}/dash/{SegmentId}.ts", "GET")] + [Route("/Videos/{Id}/dash/{SegmentId}.mp4", "GET")] public class GetDashSegment : VideoStreamRequest { /// @@ -98,9 +102,6 @@ namespace MediaBrowser.Api.Playback.Hls private string GetManifestText(StreamState state) { - var audioBitrate = state.OutputAudioBitrate ?? 0; - var videoBitrate = state.OutputVideoBitrate ?? 0; - var builder = new StringBuilder(); var time = TimeSpan.FromTicks(state.RunTimeTicks.Value); @@ -108,8 +109,13 @@ namespace MediaBrowser.Api.Playback.Hls var duration = "PT" + time.Hours.ToString("00", UsCulture) + "H" + time.Minutes.ToString("00", UsCulture) + "M" + time.Seconds.ToString("00", UsCulture) + ".00S"; builder.Append(""); + + var profile = string.Equals(GetSegmentFileExtension(state), ".ts", StringComparison.OrdinalIgnoreCase) + ? "urn:mpeg:dash:profile:mp2t-simple:2011" + : "urn:mpeg:dash:profile:mp2t-simple:2011"; + builder.AppendFormat( - "", + "", duration, state.SegmentLength.ToString(CultureInfo.InvariantCulture)); @@ -143,7 +149,11 @@ namespace MediaBrowser.Api.Playback.Hls { var codecs = GetVideoCodecDescriptor(state) + "," + GetAudioCodecDescriptor(state); - var xml = ""); + while (seconds > 0) { - var segmentUrl = string.Format("{0}.ts{1}", index.ToString(UsCulture), SecurityElement.Escape(queryString)); + var segmentUrl = string.Format("dash/{0}{1}{2}", + index.ToString(UsCulture), + extension, + SecurityElement.Escape(queryString)); - builder.AppendFormat("", segmentUrl); + if (index == 0) + { + builder.AppendFormat("", segmentUrl); + } + else + { + builder.AppendFormat("", segmentUrl); + } seconds -= state.SegmentLength; index++; @@ -259,6 +283,274 @@ namespace MediaBrowser.Api.Playback.Hls builder.Append(""); } + private async Task GetDynamicSegment(VideoStreamRequest request, string segmentId) + { + if ((request.StartTimeTicks ?? 0) > 0) + { + throw new ArgumentException("StartTimeTicks is not allowed."); + } + + var cancellationTokenSource = new CancellationTokenSource(); + var cancellationToken = cancellationTokenSource.Token; + + var index = int.Parse(segmentId, NumberStyles.Integer, UsCulture); + + var state = await GetState(request, cancellationToken).ConfigureAwait(false); + + var playlistPath = Path.ChangeExtension(state.OutputFilePath, ".m3u8"); + + var segmentExtension = GetSegmentFileExtension(state); + + var segmentPath = GetSegmentPath(playlistPath, segmentExtension, index); + var segmentLength = state.SegmentLength; + + TranscodingJob job = null; + + if (File.Exists(segmentPath)) + { + job = ApiEntryPoint.Instance.OnTranscodeBeginRequest(playlistPath, TranscodingJobType); + return await GetSegmentResult(playlistPath, segmentPath, index, segmentLength, job, cancellationToken).ConfigureAwait(false); + } + + await ApiEntryPoint.Instance.TranscodingStartLock.WaitAsync(cancellationTokenSource.Token).ConfigureAwait(false); + try + { + if (File.Exists(segmentPath)) + { + job = ApiEntryPoint.Instance.OnTranscodeBeginRequest(playlistPath, TranscodingJobType); + return await GetSegmentResult(playlistPath, segmentPath, index, segmentLength, job, cancellationToken).ConfigureAwait(false); + } + else + { + var currentTranscodingIndex = GetCurrentTranscodingIndex(playlistPath, segmentExtension); + + if (currentTranscodingIndex == null || index < currentTranscodingIndex.Value || (index - currentTranscodingIndex.Value) > 4) + { + // If the playlist doesn't already exist, startup ffmpeg + try + { + ApiEntryPoint.Instance.KillTranscodingJobs(j => j.Type == TranscodingJobType && string.Equals(j.DeviceId, request.DeviceId, StringComparison.OrdinalIgnoreCase), p => !string.Equals(p, playlistPath, StringComparison.OrdinalIgnoreCase)); + + if (currentTranscodingIndex.HasValue) + { + DeleteLastFile(playlistPath, segmentExtension, 0); + } + + var startSeconds = index * state.SegmentLength; + request.StartTimeTicks = TimeSpan.FromSeconds(startSeconds).Ticks; + + job = await StartFfMpeg(state, playlistPath, cancellationTokenSource, Path.GetDirectoryName(playlistPath)).ConfigureAwait(false); + } + catch + { + state.Dispose(); + throw; + } + + await WaitForMinimumSegmentCount(playlistPath, 2, cancellationTokenSource.Token).ConfigureAwait(false); + } + } + } + finally + { + ApiEntryPoint.Instance.TranscodingStartLock.Release(); + } + + Logger.Info("waiting for {0}", segmentPath); + while (!File.Exists(segmentPath)) + { + await Task.Delay(50, cancellationToken).ConfigureAwait(false); + } + + Logger.Info("returning {0}", segmentPath); + job = job ?? ApiEntryPoint.Instance.GetTranscodingJob(playlistPath, TranscodingJobType); + return await GetSegmentResult(playlistPath, segmentPath, index, segmentLength, job, cancellationToken).ConfigureAwait(false); + } + + private async Task GetSegmentResult(string playlistPath, + string segmentPath, + int segmentIndex, + int segmentLength, + TranscodingJob transcodingJob, + CancellationToken cancellationToken) + { + // If all transcoding has completed, just return immediately + if (!IsTranscoding(playlistPath)) + { + return GetSegmentResult(segmentPath, segmentIndex, segmentLength, transcodingJob); + } + + var segmentFilename = Path.GetFileName(segmentPath); + + using (var fileStream = FileSystem.GetFileStream(playlistPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite, true)) + { + using (var reader = new StreamReader(fileStream)) + { + var text = await reader.ReadToEndAsync().ConfigureAwait(false); + + // If it appears in the playlist, it's done + if (text.IndexOf(segmentFilename, StringComparison.OrdinalIgnoreCase) != -1) + { + return GetSegmentResult(segmentPath, segmentIndex, segmentLength, transcodingJob); + } + } + } + + // if a different file is encoding, it's done + //var currentTranscodingIndex = GetCurrentTranscodingIndex(playlistPath); + //if (currentTranscodingIndex > segmentIndex) + //{ + //return GetSegmentResult(segmentPath, segmentIndex); + //} + + // Wait for the file to stop being written to, then stream it + var length = new FileInfo(segmentPath).Length; + var eofCount = 0; + + while (eofCount < 10) + { + var info = new FileInfo(segmentPath); + + if (!info.Exists) + { + break; + } + + var newLength = info.Length; + + if (newLength == length) + { + eofCount++; + } + else + { + eofCount = 0; + } + + length = newLength; + await Task.Delay(100, cancellationToken).ConfigureAwait(false); + } + + return GetSegmentResult(segmentPath, segmentIndex, segmentLength, transcodingJob); + } + + private object GetSegmentResult(string segmentPath, int index, int segmentLength, TranscodingJob transcodingJob) + { + var segmentEndingSeconds = (1 + index) * segmentLength; + var segmentEndingPositionTicks = TimeSpan.FromSeconds(segmentEndingSeconds).Ticks; + + return ResultFactory.GetStaticFileResult(Request, new StaticFileResultOptions + { + Path = segmentPath, + FileShare = FileShare.ReadWrite, + OnComplete = () => + { + if (transcodingJob != null) + { + transcodingJob.DownloadPositionTicks = Math.Max(transcodingJob.DownloadPositionTicks ?? segmentEndingPositionTicks, segmentEndingPositionTicks); + } + + } + }); + } + + private bool IsTranscoding(string playlistPath) + { + var job = ApiEntryPoint.Instance.GetTranscodingJob(playlistPath, TranscodingJobType); + + return job != null && !job.HasExited; + } + + public int? GetCurrentTranscodingIndex(string playlist, string segmentExtension) + { + var file = GetLastTranscodingFile(playlist, segmentExtension, FileSystem); + + if (file == null) + { + return null; + } + + var playlistFilename = Path.GetFileNameWithoutExtension(playlist); + + var indexString = Path.GetFileNameWithoutExtension(file.Name).Substring(playlistFilename.Length); + + return int.Parse(indexString, NumberStyles.Integer, UsCulture); + } + + private void DeleteLastFile(string path, string segmentExtension, int retryCount) + { + if (retryCount >= 5) + { + return; + } + + var file = GetLastTranscodingFile(path, segmentExtension, FileSystem); + + if (file != null) + { + try + { + File.Delete(file.FullName); + } + catch (IOException ex) + { + Logger.ErrorException("Error deleting partial stream file(s) {0}", ex, file.FullName); + + Thread.Sleep(100); + DeleteLastFile(path, segmentExtension, retryCount + 1); + } + catch (Exception ex) + { + Logger.ErrorException("Error deleting partial stream file(s) {0}", ex, file.FullName); + } + } + } + + private static FileInfo GetLastTranscodingFile(string playlist, string segmentExtension, IFileSystem fileSystem) + { + var folder = Path.GetDirectoryName(playlist); + + try + { + return new DirectoryInfo(folder) + .EnumerateFiles("*", SearchOption.TopDirectoryOnly) + .Where(i => string.Equals(i.Extension, segmentExtension, StringComparison.OrdinalIgnoreCase)) + .OrderByDescending(fileSystem.GetLastWriteTimeUtc) + .FirstOrDefault(); + } + catch (DirectoryNotFoundException) + { + return null; + } + } + + protected override int GetStartNumber(StreamState state) + { + return GetStartNumber(state.VideoRequest); + } + + private int GetStartNumber(VideoStreamRequest request) + { + var segmentId = "0"; + + var segmentRequest = request as GetDynamicHlsVideoSegment; + if (segmentRequest != null) + { + segmentId = segmentRequest.SegmentId; + } + + return int.Parse(segmentId, NumberStyles.Integer, UsCulture); + } + + private string GetSegmentPath(string playlist, string segmentExtension, int index) + { + var folder = Path.GetDirectoryName(playlist); + + var filename = Path.GetFileNameWithoutExtension(playlist); + + return Path.Combine(folder, filename + index.ToString("000", UsCulture) + segmentExtension); + } + protected override string GetAudioArguments(StreamState state) { var codec = state.OutputAudioCodec; @@ -330,7 +622,9 @@ namespace MediaBrowser.Api.Playback.Hls // If isEncoding is true we're actually starting ffmpeg 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 segmentFilename = Path.GetFileNameWithoutExtension(outputPath) + "%03d" + GetSegmentFileExtension(state); + + var args = string.Format("{0} -i {1} -map_metadata -1 -threads {2} {3} {4} -copyts -flags -global_header {5} -f ssegment -segment_time {6} -segment_format_options movflags=+faststart -segment_list_size {8} -segment_list \"{9}\" {10}", inputModifier, GetInputArgument(transcodingJobId, state), threads, @@ -340,7 +634,8 @@ namespace MediaBrowser.Api.Playback.Hls state.SegmentLength.ToString(UsCulture), startNumberParam, state.HlsListSize.ToString(UsCulture), - outputPath + outputPath, + segmentFilename ).Trim(); return args; @@ -353,7 +648,7 @@ namespace MediaBrowser.Api.Playback.Hls /// System.String. protected override string GetSegmentFileExtension(StreamState state) { - return ".ts"; + return ".mp4"; } protected override TranscodingJobType TranscodingJobType diff --git a/MediaBrowser.Api/Playback/StreamState.cs b/MediaBrowser.Api/Playback/StreamState.cs index dd5065e530..de803037df 100644 --- a/MediaBrowser.Api/Playback/StreamState.cs +++ b/MediaBrowser.Api/Playback/StreamState.cs @@ -64,7 +64,11 @@ namespace MediaBrowser.Api.Playback public string LiveTvStreamId { get; set; } public int SegmentLength = 10; - public int HlsListSize; + + public int HlsListSize + { + get { return ReadInputAtNativeFramerate ? 100 : 1440; } + } public long? RunTimeTicks; @@ -90,7 +94,11 @@ namespace MediaBrowser.Api.Playback public string InputVideoSync { get; set; } public bool DeInterlace { get; set; } - public bool ReadInputAtNativeFramerate { get; set; } + + public bool ReadInputAtNativeFramerate + { + get { return InputProtocol == MediaProtocol.Rtmp || string.Equals(InputContainer, "wtv", StringComparison.OrdinalIgnoreCase); } + } public TransportStreamTimestamp InputTimestamp { get; set; } diff --git a/MediaBrowser.Api/UserService.cs b/MediaBrowser.Api/UserService.cs index a30ecf7d6a..01111a9988 100644 --- a/MediaBrowser.Api/UserService.cs +++ b/MediaBrowser.Api/UserService.cs @@ -5,6 +5,7 @@ using MediaBrowser.Controller.Dto; using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Net; using MediaBrowser.Controller.Session; +using MediaBrowser.Model.Connect; using MediaBrowser.Model.Dto; using MediaBrowser.Model.Users; using ServiceStack; @@ -190,11 +191,8 @@ namespace MediaBrowser.Api public object Get(GetPublicUsers request) { - var authInfo = AuthorizationContext.GetAuthorizationInfo(Request); - var isDashboard = string.Equals(authInfo.Client, "Dashboard", StringComparison.OrdinalIgnoreCase); - - if ((Request.IsLocal && isDashboard) || - !_config.Configuration.IsStartupWizardCompleted) + // If the startup wizard hasn't been completed then just return all users + if (!_config.Configuration.IsStartupWizardCompleted) { return Get(new GetUsers { @@ -202,6 +200,18 @@ namespace MediaBrowser.Api }); } + var authInfo = AuthorizationContext.GetAuthorizationInfo(Request); + var isDashboard = string.Equals(authInfo.Client, "Dashboard", StringComparison.OrdinalIgnoreCase); + + if (Request.IsLocal && isDashboard) + { + var users = _userManager.Users + .Where(i => !i.Configuration.IsDisabled && !(i.ConnectLinkType.HasValue && i.ConnectLinkType.Value == UserLinkType.Guest)) + .ToList(); + + return ToOptimizedResult(users); + } + // TODO: Uncomment this once all clients can handle an empty user list. return Get(new GetUsers { diff --git a/MediaBrowser.Controller/Entities/DayOfWeekHelper.cs b/MediaBrowser.Controller/Entities/DayOfWeekHelper.cs new file mode 100644 index 0000000000..80ba206cc6 --- /dev/null +++ b/MediaBrowser.Controller/Entities/DayOfWeekHelper.cs @@ -0,0 +1,71 @@ +using MediaBrowser.Model.Configuration; +using System; +using System.Collections.Generic; + +namespace MediaBrowser.Controller.Entities +{ + public static class DayOfWeekHelper + { + public static List GetDaysOfWeek(DynamicDayOfWeek day) + { + return GetDaysOfWeek(new List { day }); + } + + public static List GetDaysOfWeek(List days) + { + var list = new List(); + + if (days.Contains(DynamicDayOfWeek.Sunday) || + days.Contains(DynamicDayOfWeek.Weekend) || + days.Contains(DynamicDayOfWeek.Everyday)) + { + list.Add(DayOfWeek.Sunday); + } + + if (days.Contains(DynamicDayOfWeek.Saturday) || + days.Contains(DynamicDayOfWeek.Weekend) || + days.Contains(DynamicDayOfWeek.Everyday)) + { + list.Add(DayOfWeek.Saturday); + } + + if (days.Contains(DynamicDayOfWeek.Monday) || + days.Contains(DynamicDayOfWeek.Weekday) || + days.Contains(DynamicDayOfWeek.Everyday)) + { + list.Add(DayOfWeek.Monday); + } + + if (days.Contains(DynamicDayOfWeek.Monday) || + days.Contains(DynamicDayOfWeek.Weekday) || + days.Contains(DynamicDayOfWeek.Everyday)) + { + list.Add(DayOfWeek.Tuesday + ); + } + + if (days.Contains(DynamicDayOfWeek.Wednesday) || + days.Contains(DynamicDayOfWeek.Weekday) || + days.Contains(DynamicDayOfWeek.Everyday)) + { + list.Add(DayOfWeek.Wednesday); + } + + if (days.Contains(DynamicDayOfWeek.Thursday) || + days.Contains(DynamicDayOfWeek.Weekday) || + days.Contains(DynamicDayOfWeek.Everyday)) + { + list.Add(DayOfWeek.Thursday); + } + + if (days.Contains(DynamicDayOfWeek.Friday) || + days.Contains(DynamicDayOfWeek.Weekday) || + days.Contains(DynamicDayOfWeek.Everyday)) + { + list.Add(DayOfWeek.Friday); + } + + return list; + } + } +} diff --git a/MediaBrowser.Controller/Entities/TV/Episode.cs b/MediaBrowser.Controller/Entities/TV/Episode.cs index b95c7df9c5..87074ca022 100644 --- a/MediaBrowser.Controller/Entities/TV/Episode.cs +++ b/MediaBrowser.Controller/Entities/TV/Episode.cs @@ -146,7 +146,27 @@ namespace MediaBrowser.Controller.Entities.TV [IgnoreDataMember] public Season Season { - get { return FindParent(); } + get + { + var season = FindParent(); + + // Episodes directly in series folder + if (season == null) + { + var series = FindParent(); + + if (ParentIndexNumber.HasValue) + { + var findNumber = ParentIndexNumber.Value; + + season = series.Children + .OfType() + .FirstOrDefault(i => i.IndexNumber.HasValue && i.IndexNumber.Value == findNumber); + } + } + + return season; + } } [IgnoreDataMember] @@ -237,25 +257,6 @@ namespace MediaBrowser.Controller.Entities.TV return season.Id; } - var seasonNumber = ParentIndexNumber; - - // Parent is a Series - if (seasonNumber.HasValue) - { - var series = Series; - - if (series != null) - { - season = series.Children.OfType() - .FirstOrDefault(i => i.IndexNumber.HasValue && i.IndexNumber.Value == seasonNumber.Value); - - if (season != null) - { - return season.Id; - } - } - } - return null; } } diff --git a/MediaBrowser.Controller/Entities/User.cs b/MediaBrowser.Controller/Entities/User.cs index 6ba8701f74..5d1a213878 100644 --- a/MediaBrowser.Controller/Entities/User.cs +++ b/MediaBrowser.Controller/Entities/User.cs @@ -287,7 +287,8 @@ namespace MediaBrowser.Controller.Entities var localTime = date.ToLocalTime(); - return localTime.DayOfWeek == schedule.DayOfWeek && IsWithinTime(schedule, localTime); + return DayOfWeekHelper.GetDaysOfWeek(schedule.DayOfWeek).Contains(localTime.DayOfWeek) && + IsWithinTime(schedule, localTime); } private bool IsWithinTime(AccessSchedule schedule, DateTime localTime) diff --git a/MediaBrowser.Controller/MediaBrowser.Controller.csproj b/MediaBrowser.Controller/MediaBrowser.Controller.csproj index 7039a00eb2..7e2892c6ef 100644 --- a/MediaBrowser.Controller/MediaBrowser.Controller.csproj +++ b/MediaBrowser.Controller/MediaBrowser.Controller.csproj @@ -123,6 +123,7 @@ + diff --git a/MediaBrowser.Model.Portable/MediaBrowser.Model.Portable.csproj b/MediaBrowser.Model.Portable/MediaBrowser.Model.Portable.csproj index 3a62522c6d..0217c2dc72 100644 --- a/MediaBrowser.Model.Portable/MediaBrowser.Model.Portable.csproj +++ b/MediaBrowser.Model.Portable/MediaBrowser.Model.Portable.csproj @@ -173,6 +173,9 @@ Configuration\DlnaOptions.cs + + Configuration\DynamicDayOfWeek.cs + Configuration\EncodingQuality.cs @@ -230,6 +233,9 @@ Connect\ConnectUserQuery.cs + + Connect\ConnectUserServer.cs + Connect\PinCreationResult.cs diff --git a/MediaBrowser.Model.net35/MediaBrowser.Model.net35.csproj b/MediaBrowser.Model.net35/MediaBrowser.Model.net35.csproj index c7b3b5ed27..4fc9f479e6 100644 --- a/MediaBrowser.Model.net35/MediaBrowser.Model.net35.csproj +++ b/MediaBrowser.Model.net35/MediaBrowser.Model.net35.csproj @@ -139,6 +139,9 @@ Configuration\DlnaOptions.cs + + Configuration\DynamicDayOfWeek.cs + Configuration\EncodingQuality.cs @@ -196,6 +199,9 @@ Connect\ConnectUserQuery.cs + + Connect\ConnectUserServer.cs + Connect\PinCreationResult.cs diff --git a/MediaBrowser.Model/Configuration/AccessSchedule.cs b/MediaBrowser.Model/Configuration/AccessSchedule.cs index 65f2f62917..3a66cf5bbc 100644 --- a/MediaBrowser.Model/Configuration/AccessSchedule.cs +++ b/MediaBrowser.Model/Configuration/AccessSchedule.cs @@ -1,5 +1,4 @@ -using System; - + namespace MediaBrowser.Model.Configuration { public class AccessSchedule @@ -8,7 +7,7 @@ namespace MediaBrowser.Model.Configuration /// Gets or sets the day of week. /// /// The day of week. - public DayOfWeek DayOfWeek { get; set; } + public DynamicDayOfWeek DayOfWeek { get; set; } /// /// Gets or sets the start hour. /// diff --git a/MediaBrowser.Model/Configuration/DynamicDayOfWeek.cs b/MediaBrowser.Model/Configuration/DynamicDayOfWeek.cs new file mode 100644 index 0000000000..1c7de11fd8 --- /dev/null +++ b/MediaBrowser.Model/Configuration/DynamicDayOfWeek.cs @@ -0,0 +1,17 @@ + +namespace MediaBrowser.Model.Configuration +{ + public enum DynamicDayOfWeek + { + Sunday = 0, + Monday = 1, + Tuesday = 2, + Wednesday = 3, + Thursday = 4, + Friday = 5, + Saturday = 6, + Everyday = 7, + Weekday = 8, + Weekend = 9 + } +} diff --git a/MediaBrowser.Model/Connect/ConnectUserServer.cs b/MediaBrowser.Model/Connect/ConnectUserServer.cs new file mode 100644 index 0000000000..6214633d8c --- /dev/null +++ b/MediaBrowser.Model/Connect/ConnectUserServer.cs @@ -0,0 +1,12 @@ + +namespace MediaBrowser.Model.Connect +{ + public class ConnectUserServer + { + public string Id { get; set; } + public string Url { get; set; } + public string Name { get; set; } + public string AccessKey { get; set; } + public string SystemId { get; set; } + } +} diff --git a/MediaBrowser.Model/MediaBrowser.Model.csproj b/MediaBrowser.Model/MediaBrowser.Model.csproj index 470b1dcaf5..80c1259330 100644 --- a/MediaBrowser.Model/MediaBrowser.Model.csproj +++ b/MediaBrowser.Model/MediaBrowser.Model.csproj @@ -101,6 +101,7 @@ + @@ -121,6 +122,7 @@ + diff --git a/MediaBrowser.Providers/Movies/MovieMetadataService.cs b/MediaBrowser.Providers/Movies/MovieMetadataService.cs index abddb5f165..af9970b699 100644 --- a/MediaBrowser.Providers/Movies/MovieMetadataService.cs +++ b/MediaBrowser.Providers/Movies/MovieMetadataService.cs @@ -7,8 +7,6 @@ using MediaBrowser.Model.Entities; using MediaBrowser.Model.Logging; using MediaBrowser.Providers.Manager; using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; namespace MediaBrowser.Providers.Movies { @@ -29,6 +27,11 @@ namespace MediaBrowser.Providers.Movies protected override void MergeData(Movie source, Movie target, List lockedFields, bool replaceData, bool mergeMetadataSettings) { ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); + + if (replaceData || string.IsNullOrEmpty(target.TmdbCollectionName)) + { + target.TmdbCollectionName = source.TmdbCollectionName; + } } } } diff --git a/MediaBrowser.Server.Implementations/Connect/ConnectManager.cs b/MediaBrowser.Server.Implementations/Connect/ConnectManager.cs index 2a006b677e..e3d4b600ca 100644 --- a/MediaBrowser.Server.Implementations/Connect/ConnectManager.cs +++ b/MediaBrowser.Server.Implementations/Connect/ConnectManager.cs @@ -427,13 +427,19 @@ namespace MediaBrowser.Server.Implementations.Connect var accessToken = Guid.NewGuid().ToString("N"); var sendingUser = GetUser(sendingUserId); + var requesterUserName = sendingUser.ConnectUserName; + if (string.IsNullOrWhiteSpace(requesterUserName)) + { + requesterUserName = sendingUser.Name; + } + var postData = new Dictionary { {"serverId", ConnectServerId}, {"userId", connectUser.Id}, {"userType", "Guest"}, {"accessToken", accessToken}, - {"requesterUserName", sendingUser.ConnectUserName} + {"requesterUserName", requesterUserName} }; options.SetPostData(postData); @@ -608,8 +614,6 @@ namespace MediaBrowser.Server.Implementations.Connect } } - users = _userManager.Users.ToList(); - var pending = new List(); foreach (var connectEntry in list) @@ -618,7 +622,8 @@ namespace MediaBrowser.Server.Implementations.Connect { if (string.Equals(connectEntry.AcceptStatus, "accepted", StringComparison.OrdinalIgnoreCase)) { - var user = users.FirstOrDefault(i => string.Equals(i.ConnectUserId, connectEntry.UserId, StringComparison.OrdinalIgnoreCase)); + var user = _userManager.Users + .FirstOrDefault(i => string.Equals(i.ConnectUserId, connectEntry.UserId, StringComparison.OrdinalIgnoreCase)); if (user == null) { @@ -635,6 +640,8 @@ namespace MediaBrowser.Server.Implementations.Connect user.Configuration.SyncConnectImage = true; user.Configuration.SyncConnectName = true; user.Configuration.IsHidden = true; + user.Configuration.EnableLiveTvManagement = false; + user.Configuration.IsAdministrator = false; _userManager.UpdateConfiguration(user, user.Configuration); } diff --git a/MediaBrowser.Server.Implementations/Library/UserManager.cs b/MediaBrowser.Server.Implementations/Library/UserManager.cs index bb52fe35e7..163ad943e8 100644 --- a/MediaBrowser.Server.Implementations/Library/UserManager.cs +++ b/MediaBrowser.Server.Implementations/Library/UserManager.cs @@ -10,6 +10,7 @@ using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Persistence; using MediaBrowser.Controller.Providers; using MediaBrowser.Model.Configuration; +using MediaBrowser.Model.Connect; using MediaBrowser.Model.Dto; using MediaBrowser.Model.Entities; using MediaBrowser.Model.Events; @@ -225,7 +226,7 @@ namespace MediaBrowser.Server.Implementations.Library { var name = Environment.UserName; - var user = InstantiateNewUser(name); + var user = InstantiateNewUser(name, false); user.DateLastSaved = DateTime.UtcNow; @@ -403,7 +404,7 @@ namespace MediaBrowser.Server.Implementations.Library try { - var user = InstantiateNewUser(name); + var user = InstantiateNewUser(name, true); var list = Users.ToList(); list.Add(user); @@ -509,6 +510,11 @@ namespace MediaBrowser.Server.Implementations.Library throw new ArgumentNullException("user"); } + if (user.ConnectLinkType.HasValue && user.ConnectLinkType.Value == UserLinkType.Guest) + { + throw new ArgumentException("Passwords for guests cannot be changed."); + } + user.Password = string.IsNullOrEmpty(newPassword) ? GetSha1String(string.Empty) : GetSha1String(newPassword); await UpdateUser(user).ConfigureAwait(false); @@ -520,15 +526,21 @@ namespace MediaBrowser.Server.Implementations.Library /// Instantiates the new user. /// /// The name. + /// if set to true [check identifier]. /// User. - private User InstantiateNewUser(string name) + private User InstantiateNewUser(string name, bool checkId) { - var idSalt = ("MBUser" + name); + var id = ("MBUser" + name).GetMD5(); + + if (checkId && Users.Select(i => i.Id).Contains(id)) + { + id = Guid.NewGuid(); + } return new User { Name = name, - Id = idSalt.GetMD5(), + Id = id, DateCreated = DateTime.UtcNow, DateModified = DateTime.UtcNow, UsesIdForConfigurationPath = true diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/ar.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/ar.json index a94b7166f6..f612bfd744 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/ar.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/ar.json @@ -601,5 +601,6 @@ "DeleteDeviceConfirmation": "Are you sure you wish to delete this device? It will reappear the next time a user signs in with it.", "LabelEnableCameraUploadFor": "Enable camera upload for:", "HeaderSelectUploadPath": "Select Upload Path", - "LabelEnableCameraUploadForHelp": "Uploads will occur automatically in the background when signed into Media Browser." + "LabelEnableCameraUploadForHelp": "Uploads will occur automatically in the background when signed into Media Browser.", + "ErrorMessageStartHourGreaterThanEnd": "End time must be greater than the start time." } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/ca.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/ca.json index 9476331c95..99518b1ca3 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/ca.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/ca.json @@ -601,5 +601,6 @@ "DeleteDeviceConfirmation": "Are you sure you wish to delete this device? It will reappear the next time a user signs in with it.", "LabelEnableCameraUploadFor": "Enable camera upload for:", "HeaderSelectUploadPath": "Select Upload Path", - "LabelEnableCameraUploadForHelp": "Uploads will occur automatically in the background when signed into Media Browser." + "LabelEnableCameraUploadForHelp": "Uploads will occur automatically in the background when signed into Media Browser.", + "ErrorMessageStartHourGreaterThanEnd": "End time must be greater than the start time." } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/cs.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/cs.json index cdbc0bceeb..71a26ba3cb 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/cs.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/cs.json @@ -601,5 +601,6 @@ "DeleteDeviceConfirmation": "Are you sure you wish to delete this device? It will reappear the next time a user signs in with it.", "LabelEnableCameraUploadFor": "Enable camera upload for:", "HeaderSelectUploadPath": "Select Upload Path", - "LabelEnableCameraUploadForHelp": "Uploads will occur automatically in the background when signed into Media Browser." + "LabelEnableCameraUploadForHelp": "Uploads will occur automatically in the background when signed into Media Browser.", + "ErrorMessageStartHourGreaterThanEnd": "End time must be greater than the start time." } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/da.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/da.json index a278ca45ee..8a19230cac 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/da.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/da.json @@ -601,5 +601,6 @@ "DeleteDeviceConfirmation": "Are you sure you wish to delete this device? It will reappear the next time a user signs in with it.", "LabelEnableCameraUploadFor": "Enable camera upload for:", "HeaderSelectUploadPath": "Select Upload Path", - "LabelEnableCameraUploadForHelp": "Uploads will occur automatically in the background when signed into Media Browser." + "LabelEnableCameraUploadForHelp": "Uploads will occur automatically in the background when signed into Media Browser.", + "ErrorMessageStartHourGreaterThanEnd": "End time must be greater than the start time." } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/de.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/de.json index c0abc5a559..5fbb82a4de 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/de.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/de.json @@ -601,5 +601,6 @@ "DeleteDeviceConfirmation": "Are you sure you wish to delete this device? It will reappear the next time a user signs in with it.", "LabelEnableCameraUploadFor": "Enable camera upload for:", "HeaderSelectUploadPath": "Select Upload Path", - "LabelEnableCameraUploadForHelp": "Uploads will occur automatically in the background when signed into Media Browser." + "LabelEnableCameraUploadForHelp": "Uploads will occur automatically in the background when signed into Media Browser.", + "ErrorMessageStartHourGreaterThanEnd": "End time must be greater than the start time." } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/el.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/el.json index f8d1bb7b56..aac19bcf7e 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/el.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/el.json @@ -601,5 +601,6 @@ "DeleteDeviceConfirmation": "Are you sure you wish to delete this device? It will reappear the next time a user signs in with it.", "LabelEnableCameraUploadFor": "Enable camera upload for:", "HeaderSelectUploadPath": "Select Upload Path", - "LabelEnableCameraUploadForHelp": "Uploads will occur automatically in the background when signed into Media Browser." + "LabelEnableCameraUploadForHelp": "Uploads will occur automatically in the background when signed into Media Browser.", + "ErrorMessageStartHourGreaterThanEnd": "End time must be greater than the start time." } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/en_GB.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/en_GB.json index 9e9bee689d..9696ada9b9 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/en_GB.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/en_GB.json @@ -601,5 +601,6 @@ "DeleteDeviceConfirmation": "Are you sure you wish to delete this device? It will reappear the next time a user signs in with it.", "LabelEnableCameraUploadFor": "Enable camera upload for:", "HeaderSelectUploadPath": "Select Upload Path", - "LabelEnableCameraUploadForHelp": "Uploads will occur automatically in the background when signed into Media Browser." + "LabelEnableCameraUploadForHelp": "Uploads will occur automatically in the background when signed into Media Browser.", + "ErrorMessageStartHourGreaterThanEnd": "End time must be greater than the start time." } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/en_US.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/en_US.json index 6cfaee2acc..d63cfa1fe4 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/en_US.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/en_US.json @@ -601,5 +601,6 @@ "DeleteDeviceConfirmation": "Are you sure you wish to delete this device? It will reappear the next time a user signs in with it.", "LabelEnableCameraUploadFor": "Enable camera upload for:", "HeaderSelectUploadPath": "Select Upload Path", - "LabelEnableCameraUploadForHelp": "Uploads will occur automatically in the background when signed into Media Browser." + "LabelEnableCameraUploadForHelp": "Uploads will occur automatically in the background when signed into Media Browser.", + "ErrorMessageStartHourGreaterThanEnd": "End time must be greater than the start time." } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/es.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/es.json index a612e763f2..085fe13159 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/es.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/es.json @@ -601,5 +601,6 @@ "DeleteDeviceConfirmation": "Are you sure you wish to delete this device? It will reappear the next time a user signs in with it.", "LabelEnableCameraUploadFor": "Enable camera upload for:", "HeaderSelectUploadPath": "Select Upload Path", - "LabelEnableCameraUploadForHelp": "Uploads will occur automatically in the background when signed into Media Browser." + "LabelEnableCameraUploadForHelp": "Uploads will occur automatically in the background when signed into Media Browser.", + "ErrorMessageStartHourGreaterThanEnd": "End time must be greater than the start time." } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/es_MX.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/es_MX.json index 3572246985..e0e75beca2 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/es_MX.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/es_MX.json @@ -601,5 +601,6 @@ "DeleteDeviceConfirmation": "\u00bfEsta seguro de querer eliminar este dispositivo? Volver\u00e1 a aparecer la siguiente vez que un usuario inicie sesi\u00f3n en \u00e9l.", "LabelEnableCameraUploadFor": "Habilitar subida desde la c\u00e1mara para:", "HeaderSelectUploadPath": "Seleccionar trayectoria de subida", - "LabelEnableCameraUploadForHelp": "La subida ocurrir\u00e1 autom\u00e1ticamente en segundo plano al iniciar sesi\u00f3n en Media Browser." + "LabelEnableCameraUploadForHelp": "La subida ocurrir\u00e1 autom\u00e1ticamente en segundo plano al iniciar sesi\u00f3n en Media Browser.", + "ErrorMessageStartHourGreaterThanEnd": "El tiempo de fin debe ser mayor al tiempo de inicio" } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/fr.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/fr.json index b992a74655..ecbe009047 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/fr.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/fr.json @@ -601,5 +601,6 @@ "DeleteDeviceConfirmation": "\u00cates-vous s\u00fbr de vouloir supprimer ce p\u00e9riph\u00e9rique? La prochaine fois qu'un utilisateur se connecte au p\u00e9riph\u00e9rique, il sera ajout\u00e9 de nouveau.", "LabelEnableCameraUploadFor": "Autoriser l'upload de la cam\u00e9ra pour:", "HeaderSelectUploadPath": "S\u00e9lectionner le r\u00e9pertoire d'upload", - "LabelEnableCameraUploadForHelp": "Les uploads se lanceront automatiquement en arri\u00e8re plan apr\u00e8s l'authentification dans Media Browser." + "LabelEnableCameraUploadForHelp": "Les uploads se lanceront automatiquement en arri\u00e8re plan apr\u00e8s l'authentification dans Media Browser.", + "ErrorMessageStartHourGreaterThanEnd": "End time must be greater than the start time." } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/he.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/he.json index c583962823..5deeb6bb16 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/he.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/he.json @@ -601,5 +601,6 @@ "DeleteDeviceConfirmation": "Are you sure you wish to delete this device? It will reappear the next time a user signs in with it.", "LabelEnableCameraUploadFor": "Enable camera upload for:", "HeaderSelectUploadPath": "Select Upload Path", - "LabelEnableCameraUploadForHelp": "Uploads will occur automatically in the background when signed into Media Browser." + "LabelEnableCameraUploadForHelp": "Uploads will occur automatically in the background when signed into Media Browser.", + "ErrorMessageStartHourGreaterThanEnd": "End time must be greater than the start time." } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/hr.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/hr.json index c454b254a5..adb1263640 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/hr.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/hr.json @@ -601,5 +601,6 @@ "DeleteDeviceConfirmation": "Are you sure you wish to delete this device? It will reappear the next time a user signs in with it.", "LabelEnableCameraUploadFor": "Enable camera upload for:", "HeaderSelectUploadPath": "Select Upload Path", - "LabelEnableCameraUploadForHelp": "Uploads will occur automatically in the background when signed into Media Browser." + "LabelEnableCameraUploadForHelp": "Uploads will occur automatically in the background when signed into Media Browser.", + "ErrorMessageStartHourGreaterThanEnd": "End time must be greater than the start time." } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/it.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/it.json index 3dab6c4745..4c58055a2e 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/it.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/it.json @@ -601,5 +601,6 @@ "DeleteDeviceConfirmation": "Are you sure you wish to delete this device? It will reappear the next time a user signs in with it.", "LabelEnableCameraUploadFor": "Enable camera upload for:", "HeaderSelectUploadPath": "Select Upload Path", - "LabelEnableCameraUploadForHelp": "Uploads will occur automatically in the background when signed into Media Browser." + "LabelEnableCameraUploadForHelp": "Uploads will occur automatically in the background when signed into Media Browser.", + "ErrorMessageStartHourGreaterThanEnd": "End time must be greater than the start time." } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/kk.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/kk.json index 70f8fd0f25..78be468eb7 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/kk.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/kk.json @@ -601,5 +601,6 @@ "DeleteDeviceConfirmation": "Are you sure you wish to delete this device? It will reappear the next time a user signs in with it.", "LabelEnableCameraUploadFor": "Enable camera upload for:", "HeaderSelectUploadPath": "Select Upload Path", - "LabelEnableCameraUploadForHelp": "Uploads will occur automatically in the background when signed into Media Browser." + "LabelEnableCameraUploadForHelp": "Uploads will occur automatically in the background when signed into Media Browser.", + "ErrorMessageStartHourGreaterThanEnd": "End time must be greater than the start time." } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/ms.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/ms.json index b378e6b871..b65ab37001 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/ms.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/ms.json @@ -601,5 +601,6 @@ "DeleteDeviceConfirmation": "Are you sure you wish to delete this device? It will reappear the next time a user signs in with it.", "LabelEnableCameraUploadFor": "Enable camera upload for:", "HeaderSelectUploadPath": "Select Upload Path", - "LabelEnableCameraUploadForHelp": "Uploads will occur automatically in the background when signed into Media Browser." + "LabelEnableCameraUploadForHelp": "Uploads will occur automatically in the background when signed into Media Browser.", + "ErrorMessageStartHourGreaterThanEnd": "End time must be greater than the start time." } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/nb.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/nb.json index 1047bc38af..83a18459f3 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/nb.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/nb.json @@ -601,5 +601,6 @@ "DeleteDeviceConfirmation": "Are you sure you wish to delete this device? It will reappear the next time a user signs in with it.", "LabelEnableCameraUploadFor": "Enable camera upload for:", "HeaderSelectUploadPath": "Select Upload Path", - "LabelEnableCameraUploadForHelp": "Uploads will occur automatically in the background when signed into Media Browser." + "LabelEnableCameraUploadForHelp": "Uploads will occur automatically in the background when signed into Media Browser.", + "ErrorMessageStartHourGreaterThanEnd": "End time must be greater than the start time." } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/nl.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/nl.json index e18a3475c2..4d01b890bc 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/nl.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/nl.json @@ -595,11 +595,12 @@ "DashboardTourScheduledTasks": "Beheer eenvoudig langlopende transacties met geplande taken. Beslis zelf wanneer ze worden uitgevoerd en hoe vaak.", "DashboardTourMobile": "Het dashboard van Media Browser werkt geweldig op smartphones en tablets. Uw server beheren vanuit de palm van uw hand, overal en altijd.", "MessageRefreshQueued": "Vernieuwen wachtrij", - "TabDevices": "Devices", - "DeviceLastUsedByUserName": "Last used by {0}", - "HeaderDeleteDevice": "Delete Device", + "TabDevices": "Apparaten", + "DeviceLastUsedByUserName": "Het laatste gebruikt door {0}", + "HeaderDeleteDevice": "Verwijder apparaat", "DeleteDeviceConfirmation": "Are you sure you wish to delete this device? It will reappear the next time a user signs in with it.", "LabelEnableCameraUploadFor": "Enable camera upload for:", "HeaderSelectUploadPath": "Select Upload Path", - "LabelEnableCameraUploadForHelp": "Uploads will occur automatically in the background when signed into Media Browser." + "LabelEnableCameraUploadForHelp": "Uploads will occur automatically in the background when signed into Media Browser.", + "ErrorMessageStartHourGreaterThanEnd": "End time must be greater than the start time." } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/pl.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/pl.json index 2055dd0a58..cb449c3c63 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/pl.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/pl.json @@ -601,5 +601,6 @@ "DeleteDeviceConfirmation": "Are you sure you wish to delete this device? It will reappear the next time a user signs in with it.", "LabelEnableCameraUploadFor": "Enable camera upload for:", "HeaderSelectUploadPath": "Select Upload Path", - "LabelEnableCameraUploadForHelp": "Uploads will occur automatically in the background when signed into Media Browser." + "LabelEnableCameraUploadForHelp": "Uploads will occur automatically in the background when signed into Media Browser.", + "ErrorMessageStartHourGreaterThanEnd": "End time must be greater than the start time." } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/pt_BR.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/pt_BR.json index e50f69c565..1dd5ee0749 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/pt_BR.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/pt_BR.json @@ -594,12 +594,13 @@ "DashboardTourNotifications": "Envie, automaticamente, notifica\u00e7\u00f5es de eventos do servidor para seus dispositivos m\u00f3veis, email e mais.", "DashboardTourScheduledTasks": "Gerencie facilmente opera\u00e7\u00f5es longas com tarefas agendadas. Decida quando executar e com que frequ\u00eancia.", "DashboardTourMobile": "O painel do M\u00e9dia Browser funciona perfeitamente em smartphones e tablets. Gerencie seu servidor da palma de sua m\u00e3o, a qualquer hora e em qualquer lugar.", - "MessageRefreshQueued": "Refresh queued", - "TabDevices": "Devices", - "DeviceLastUsedByUserName": "Last used by {0}", - "HeaderDeleteDevice": "Delete Device", - "DeleteDeviceConfirmation": "Are you sure you wish to delete this device? It will reappear the next time a user signs in with it.", - "LabelEnableCameraUploadFor": "Enable camera upload for:", - "HeaderSelectUploadPath": "Select Upload Path", - "LabelEnableCameraUploadForHelp": "Uploads will occur automatically in the background when signed into Media Browser." + "MessageRefreshQueued": "Atualiza\u00e7\u00e3o iniciada", + "TabDevices": "Dispositivos", + "DeviceLastUsedByUserName": "Utilizado por \u00faltimo por {0}", + "HeaderDeleteDevice": "Excluir Dispositivo", + "DeleteDeviceConfirmation": "Tem certeza de que deseja excluir este dispositivo? Ele reaparecer\u00e1 a pr\u00f3xima vez que um usu\u00e1rio utiliz\u00e1-lo.", + "LabelEnableCameraUploadFor": "Habilitar envio atrav\u00e9s de c\u00e2mera para:", + "HeaderSelectUploadPath": "Selecione o caminho para carga", + "LabelEnableCameraUploadForHelp": "Cargas ser\u00e3o executadas automaticamente em retaguarda quando logar no Media Browser.", + "ErrorMessageStartHourGreaterThanEnd": "End time must be greater than the start time." } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/pt_PT.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/pt_PT.json index 68ef481e19..0f234b0883 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/pt_PT.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/pt_PT.json @@ -601,5 +601,6 @@ "DeleteDeviceConfirmation": "Are you sure you wish to delete this device? It will reappear the next time a user signs in with it.", "LabelEnableCameraUploadFor": "Enable camera upload for:", "HeaderSelectUploadPath": "Select Upload Path", - "LabelEnableCameraUploadForHelp": "Uploads will occur automatically in the background when signed into Media Browser." + "LabelEnableCameraUploadForHelp": "Uploads will occur automatically in the background when signed into Media Browser.", + "ErrorMessageStartHourGreaterThanEnd": "End time must be greater than the start time." } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/ru.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/ru.json index 8cdc61cc98..36789f57d2 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/ru.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/ru.json @@ -601,5 +601,6 @@ "DeleteDeviceConfirmation": "Are you sure you wish to delete this device? It will reappear the next time a user signs in with it.", "LabelEnableCameraUploadFor": "Enable camera upload for:", "HeaderSelectUploadPath": "Select Upload Path", - "LabelEnableCameraUploadForHelp": "Uploads will occur automatically in the background when signed into Media Browser." + "LabelEnableCameraUploadForHelp": "Uploads will occur automatically in the background when signed into Media Browser.", + "ErrorMessageStartHourGreaterThanEnd": "End time must be greater than the start time." } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/sv.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/sv.json index f5d2dc62d6..fa63530695 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/sv.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/sv.json @@ -601,5 +601,6 @@ "DeleteDeviceConfirmation": "Are you sure you wish to delete this device? It will reappear the next time a user signs in with it.", "LabelEnableCameraUploadFor": "Enable camera upload for:", "HeaderSelectUploadPath": "Select Upload Path", - "LabelEnableCameraUploadForHelp": "Uploads will occur automatically in the background when signed into Media Browser." + "LabelEnableCameraUploadForHelp": "Uploads will occur automatically in the background when signed into Media Browser.", + "ErrorMessageStartHourGreaterThanEnd": "End time must be greater than the start time." } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/tr.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/tr.json index ec43032bd7..cc987bcada 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/tr.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/tr.json @@ -601,5 +601,6 @@ "DeleteDeviceConfirmation": "Are you sure you wish to delete this device? It will reappear the next time a user signs in with it.", "LabelEnableCameraUploadFor": "Enable camera upload for:", "HeaderSelectUploadPath": "Select Upload Path", - "LabelEnableCameraUploadForHelp": "Uploads will occur automatically in the background when signed into Media Browser." + "LabelEnableCameraUploadForHelp": "Uploads will occur automatically in the background when signed into Media Browser.", + "ErrorMessageStartHourGreaterThanEnd": "End time must be greater than the start time." } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/vi.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/vi.json index 643f7140ca..fafdcf33ca 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/vi.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/vi.json @@ -601,5 +601,6 @@ "DeleteDeviceConfirmation": "Are you sure you wish to delete this device? It will reappear the next time a user signs in with it.", "LabelEnableCameraUploadFor": "Enable camera upload for:", "HeaderSelectUploadPath": "Select Upload Path", - "LabelEnableCameraUploadForHelp": "Uploads will occur automatically in the background when signed into Media Browser." + "LabelEnableCameraUploadForHelp": "Uploads will occur automatically in the background when signed into Media Browser.", + "ErrorMessageStartHourGreaterThanEnd": "End time must be greater than the start time." } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/zh_TW.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/zh_TW.json index 6994beb1f9..ace114c8d8 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/zh_TW.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/zh_TW.json @@ -601,5 +601,6 @@ "DeleteDeviceConfirmation": "Are you sure you wish to delete this device? It will reappear the next time a user signs in with it.", "LabelEnableCameraUploadFor": "Enable camera upload for:", "HeaderSelectUploadPath": "Select Upload Path", - "LabelEnableCameraUploadForHelp": "Uploads will occur automatically in the background when signed into Media Browser." + "LabelEnableCameraUploadForHelp": "Uploads will occur automatically in the background when signed into Media Browser.", + "ErrorMessageStartHourGreaterThanEnd": "End time must be greater than the start time." } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/Server/ar.json b/MediaBrowser.Server.Implementations/Localization/Server/ar.json index 74854f0757..a0094c5b27 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/ar.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/ar.json @@ -440,12 +440,19 @@ "VisitMediaBrowserWebsite": "Visit the Media Browser Web Site", "HeaderPendingInvitations": "Pending Invitations", "VisitMediaBrowserWebsiteLong": "Visit the Media Browser Web site to catch the latest news and keep up with the developer blog.", + "TabParentalControl": "Parental Control", "OptionHideUser": "Hide this user from login screens", + "HeaderAccessSchedule": "Access Schedule", "OptionDisableUser": "Disable this user", + "HeaderAccessScheduleHelp": "Create an access schedule to limit access to certain hours.", "OptionDisableUserHelp": "If disabled the server will not allow any connections from this user. Existing connections will be abruptly terminated.", + "ButtonAddSchedule": "Add Schedule", "HeaderAdvancedControl": "Advanced Control", + "LabelAccessDay": "Day of week:", "LabelName": "Name:", + "LabelAccessStart": "Start hour:", "OptionAllowUserToManageServer": "Allow this user to manage the server", + "LabelAccessEnd": "End hour:", "HeaderFeatureAccess": "Feature Access", "OptionAllowMediaPlayback": "Allow media playback", "OptionAllowBrowsingLiveTv": "Allow browsing of live tv", diff --git a/MediaBrowser.Server.Implementations/Localization/Server/ca.json b/MediaBrowser.Server.Implementations/Localization/Server/ca.json index 49a93e00be..2efa7c4619 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/ca.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/ca.json @@ -440,12 +440,19 @@ "VisitMediaBrowserWebsite": "Visit the Media Browser Web Site", "HeaderPendingInvitations": "Pending Invitations", "VisitMediaBrowserWebsiteLong": "Visit the Media Browser Web site to catch the latest news and keep up with the developer blog.", + "TabParentalControl": "Parental Control", "OptionHideUser": "Hide this user from login screens", + "HeaderAccessSchedule": "Access Schedule", "OptionDisableUser": "Disable this user", + "HeaderAccessScheduleHelp": "Create an access schedule to limit access to certain hours.", "OptionDisableUserHelp": "If disabled the server will not allow any connections from this user. Existing connections will be abruptly terminated.", + "ButtonAddSchedule": "Add Schedule", "HeaderAdvancedControl": "Advanced Control", + "LabelAccessDay": "Day of week:", "LabelName": "Name:", + "LabelAccessStart": "Start hour:", "OptionAllowUserToManageServer": "Allow this user to manage the server", + "LabelAccessEnd": "End hour:", "HeaderFeatureAccess": "Feature Access", "OptionAllowMediaPlayback": "Allow media playback", "OptionAllowBrowsingLiveTv": "Allow browsing of live tv", diff --git a/MediaBrowser.Server.Implementations/Localization/Server/cs.json b/MediaBrowser.Server.Implementations/Localization/Server/cs.json index 19ad31c6d5..ae340a34cb 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/cs.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/cs.json @@ -440,12 +440,19 @@ "VisitMediaBrowserWebsite": "Nav\u0161t\u00edvit str\u00e1nku programu Media Browser", "HeaderPendingInvitations": "Pending Invitations", "VisitMediaBrowserWebsiteLong": "Nav\u0161tivte str\u00e1nku programu Media Browser pro zji\u0161t\u011bn\u00ed posledn\u00edch novinek a informac\u00ed od v\u00fdvoj\u00e1\u0159\u016f.", + "TabParentalControl": "Parental Control", "OptionHideUser": "Skr\u00fdt tohoto u\u017eivatele z p\u0159ihla\u0161ovac\u00edch obrazovek", + "HeaderAccessSchedule": "Access Schedule", "OptionDisableUser": "Zablokovat tohoto u\u017eivatele", + "HeaderAccessScheduleHelp": "Create an access schedule to limit access to certain hours.", "OptionDisableUserHelp": "Pokud je zablokov\u00e1n, server nepovol\u00ed tomuto u\u017eivateli \u017e\u00e1dn\u00e9 p\u0159ipojen\u00ed. Existuj\u00edc\u00ed p\u0159ipojen\u00ed bude okam\u017eit\u011b p\u0159eru\u0161eno.", + "ButtonAddSchedule": "Add Schedule", "HeaderAdvancedControl": "Pokro\u010dil\u00e9 nastaven\u00ed", + "LabelAccessDay": "Day of week:", "LabelName": "Jm\u00e9no:", + "LabelAccessStart": "Start hour:", "OptionAllowUserToManageServer": "Povolit tomuto u\u017eivateli spr\u00e1vu serveru", + "LabelAccessEnd": "End hour:", "HeaderFeatureAccess": "P\u0159\u00edstup k funkc\u00edm", "OptionAllowMediaPlayback": "Povolit p\u0159ehr\u00e1v\u00e1n\u00ed medi\u00ed", "OptionAllowBrowsingLiveTv": "Provolit \u017eiv\u00e9 vys\u00edl\u00e1n\u00ed", diff --git a/MediaBrowser.Server.Implementations/Localization/Server/da.json b/MediaBrowser.Server.Implementations/Localization/Server/da.json index 74f2e050be..174ef2c635 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/da.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/da.json @@ -440,12 +440,19 @@ "VisitMediaBrowserWebsite": "Bes\u00f8g Media Browsers Webside", "HeaderPendingInvitations": "Pending Invitations", "VisitMediaBrowserWebsiteLong": "Visit the Media Browser Web site to catch the latest news and keep up with the developer blog.", + "TabParentalControl": "Parental Control", "OptionHideUser": "Vis ikke denne bruger p\u00e5 logind siden", + "HeaderAccessSchedule": "Access Schedule", "OptionDisableUser": "Deaktiver denne bruger", + "HeaderAccessScheduleHelp": "Create an access schedule to limit access to certain hours.", "OptionDisableUserHelp": "Hvis deaktiveret vil serveren ikke tillade forbindelser fra denne bruger. Eksisterende forbindelser vil blive afbrudt.", + "ButtonAddSchedule": "Add Schedule", "HeaderAdvancedControl": "Avanceret Kontrol", + "LabelAccessDay": "Day of week:", "LabelName": "Navn:", + "LabelAccessStart": "Start hour:", "OptionAllowUserToManageServer": "Tillad denne bruger at administrere serveren", + "LabelAccessEnd": "End hour:", "HeaderFeatureAccess": "Funktion Adgang", "OptionAllowMediaPlayback": "Tillad medie afspilning", "OptionAllowBrowsingLiveTv": "Tillad gennemsyn af direkte tv", diff --git a/MediaBrowser.Server.Implementations/Localization/Server/de.json b/MediaBrowser.Server.Implementations/Localization/Server/de.json index 728f7acc9d..2daba2c55e 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/de.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/de.json @@ -440,12 +440,19 @@ "VisitMediaBrowserWebsite": "Besuche die Media Browser Website", "HeaderPendingInvitations": "Pending Invitations", "VisitMediaBrowserWebsiteLong": "Besuche die Media Browser Website um die aktuellsten Neuigkeiten zu erfahren und halte dich auf dem Laufenden mit dem Entwicklerblog.", + "TabParentalControl": "Parental Control", "OptionHideUser": "Verberge diesen Benutzer in den Anmeldebildschirmen", + "HeaderAccessSchedule": "Access Schedule", "OptionDisableUser": "Sperre diesen Benutzer", + "HeaderAccessScheduleHelp": "Create an access schedule to limit access to certain hours.", "OptionDisableUserHelp": "Wenn deaktiviert,wird der Server keine Verbindung von diesem Benutzer erlauben. Bestehenden Verbindungen werden sofort beendet.", + "ButtonAddSchedule": "Add Schedule", "HeaderAdvancedControl": "Erweiterte Kontrolle", + "LabelAccessDay": "Day of week:", "LabelName": "Name:", + "LabelAccessStart": "Start hour:", "OptionAllowUserToManageServer": "Dieser Benutzer kann den Server managen", + "LabelAccessEnd": "End hour:", "HeaderFeatureAccess": "Funktionszugriff", "OptionAllowMediaPlayback": "Erlaube das Abspielen von Medien", "OptionAllowBrowsingLiveTv": "Erlaube das durchsuchen von Live-TV", diff --git a/MediaBrowser.Server.Implementations/Localization/Server/el.json b/MediaBrowser.Server.Implementations/Localization/Server/el.json index 130b9f3b23..6815f46af1 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/el.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/el.json @@ -440,12 +440,19 @@ "VisitMediaBrowserWebsite": "Visit the Media Browser Web Site", "HeaderPendingInvitations": "Pending Invitations", "VisitMediaBrowserWebsiteLong": "Visit the Media Browser Web site to catch the latest news and keep up with the developer blog.", + "TabParentalControl": "Parental Control", "OptionHideUser": "Hide this user from login screens", + "HeaderAccessSchedule": "Access Schedule", "OptionDisableUser": "Disable this user", + "HeaderAccessScheduleHelp": "Create an access schedule to limit access to certain hours.", "OptionDisableUserHelp": "If disabled the server will not allow any connections from this user. Existing connections will be abruptly terminated.", + "ButtonAddSchedule": "Add Schedule", "HeaderAdvancedControl": "Advanced Control", + "LabelAccessDay": "Day of week:", "LabelName": "Name:", + "LabelAccessStart": "Start hour:", "OptionAllowUserToManageServer": "Allow this user to manage the server", + "LabelAccessEnd": "End hour:", "HeaderFeatureAccess": "Feature Access", "OptionAllowMediaPlayback": "Allow media playback", "OptionAllowBrowsingLiveTv": "Allow browsing of live tv", diff --git a/MediaBrowser.Server.Implementations/Localization/Server/en_GB.json b/MediaBrowser.Server.Implementations/Localization/Server/en_GB.json index 0a2d7c3e62..363f7b7ed9 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/en_GB.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/en_GB.json @@ -440,12 +440,19 @@ "VisitMediaBrowserWebsite": "Visit the Media Browser Web Site", "HeaderPendingInvitations": "Pending Invitations", "VisitMediaBrowserWebsiteLong": "Visit the Media Browser Web site to catch the latest news and keep up with the developer blog.", + "TabParentalControl": "Parental Control", "OptionHideUser": "Hide this user from login screens", + "HeaderAccessSchedule": "Access Schedule", "OptionDisableUser": "Disable this user", + "HeaderAccessScheduleHelp": "Create an access schedule to limit access to certain hours.", "OptionDisableUserHelp": "If disabled the server will not allow any connections from this user. Existing connections will be abruptly terminated.", + "ButtonAddSchedule": "Add Schedule", "HeaderAdvancedControl": "Advanced Control", + "LabelAccessDay": "Day of week:", "LabelName": "Name:", + "LabelAccessStart": "Start hour:", "OptionAllowUserToManageServer": "Allow this user to manage the server", + "LabelAccessEnd": "End hour:", "HeaderFeatureAccess": "Feature Access", "OptionAllowMediaPlayback": "Allow media playback", "OptionAllowBrowsingLiveTv": "Allow browsing of live tv", diff --git a/MediaBrowser.Server.Implementations/Localization/Server/en_US.json b/MediaBrowser.Server.Implementations/Localization/Server/en_US.json index 88ef2b80e8..a7640ef00b 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/en_US.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/en_US.json @@ -440,12 +440,19 @@ "VisitMediaBrowserWebsite": "Visit the Media Browser Web Site", "HeaderPendingInvitations": "Pending Invitations", "VisitMediaBrowserWebsiteLong": "Visit the Media Browser Web site to catch the latest news and keep up with the developer blog.", + "TabParentalControl": "Parental Control", "OptionHideUser": "Hide this user from login screens", + "HeaderAccessSchedule": "Access Schedule", "OptionDisableUser": "Disable this user", + "HeaderAccessScheduleHelp": "Create an access schedule to limit access to certain hours.", "OptionDisableUserHelp": "If disabled the server will not allow any connections from this user. Existing connections will be abruptly terminated.", + "ButtonAddSchedule": "Add Schedule", "HeaderAdvancedControl": "Advanced Control", + "LabelAccessDay": "Day of week:", "LabelName": "Name:", + "LabelAccessStart": "Start hour:", "OptionAllowUserToManageServer": "Allow this user to manage the server", + "LabelAccessEnd": "End hour:", "HeaderFeatureAccess": "Feature Access", "OptionAllowMediaPlayback": "Allow media playback", "OptionAllowBrowsingLiveTv": "Allow browsing of live tv", diff --git a/MediaBrowser.Server.Implementations/Localization/Server/es.json b/MediaBrowser.Server.Implementations/Localization/Server/es.json index 5dc9cab69c..4bbd3ebb9e 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/es.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/es.json @@ -440,12 +440,19 @@ "VisitMediaBrowserWebsite": "Visitar la web de Media Browser", "HeaderPendingInvitations": "Pending Invitations", "VisitMediaBrowserWebsiteLong": "Visita la web de Media Browser para estar informado de las \u00faltimas not\u00edcias y mantenerte al d\u00eda con el blog de desarrolladores.", + "TabParentalControl": "Parental Control", "OptionHideUser": "Ocultar este usuario en las pantallas de inicio de sesi\u00f3n", + "HeaderAccessSchedule": "Access Schedule", "OptionDisableUser": "Deshabilitar este usuario", + "HeaderAccessScheduleHelp": "Create an access schedule to limit access to certain hours.", "OptionDisableUserHelp": "Si est\u00e1 deshabilitado, el servidor no aceptar\u00e1 conexiones de este usuario. Si existen conexiones de este usuario, finalizar\u00e1n inmediatamente.", + "ButtonAddSchedule": "Add Schedule", "HeaderAdvancedControl": "Control avanzado", + "LabelAccessDay": "Day of week:", "LabelName": "Nombre:", + "LabelAccessStart": "Start hour:", "OptionAllowUserToManageServer": "Permite a este usuario administrar el servidor", + "LabelAccessEnd": "End hour:", "HeaderFeatureAccess": "Permisos de acceso", "OptionAllowMediaPlayback": "Permitir reproducci\u00f3n de medios", "OptionAllowBrowsingLiveTv": "Acceso a TV en vivo", diff --git a/MediaBrowser.Server.Implementations/Localization/Server/es_MX.json b/MediaBrowser.Server.Implementations/Localization/Server/es_MX.json index 879b2ff774..1cb870fb81 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/es_MX.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/es_MX.json @@ -440,12 +440,19 @@ "VisitMediaBrowserWebsite": "Visitar el Sitio Web de Media Browser", "HeaderPendingInvitations": "Invitaciones Pendientes", "VisitMediaBrowserWebsiteLong": "Visite el Sitio Web de Media Browser para estar conocer las \u00faltimas not\u00edcias y mantenerse al d\u00eda con el blog de los desarrolladores.", + "TabParentalControl": "Control Parental", "OptionHideUser": "Ocultar este usuario en las pantallas de inicio de sesi\u00f3n", + "HeaderAccessSchedule": "Acceder Programaci\u00f3n", "OptionDisableUser": "Desactivar este usuario", + "HeaderAccessScheduleHelp": "Crear programaci\u00f3n de acceso para limitar el acceso a ciertos horarios.", "OptionDisableUserHelp": "Si est\u00e1 desactivado, el servidor no aceptar\u00e1 conexiones de este usuario. Las conexiones existentes ser\u00e1n finalizadas abruptamente.", + "ButtonAddSchedule": "Agregar Programaci\u00f3n", "HeaderAdvancedControl": "Control Avanzado", + "LabelAccessDay": "D\u00eda de la semana:", "LabelName": "Nombre:", + "LabelAccessStart": "Hora de inicio:", "OptionAllowUserToManageServer": "Permitir a este usuario administrar el servidor", + "LabelAccessEnd": "Hora de fin:", "HeaderFeatureAccess": "Permisos de acceso", "OptionAllowMediaPlayback": "Permitir reproducci\u00f3n de medios", "OptionAllowBrowsingLiveTv": "Permitir acceder a TV en vivo", @@ -532,7 +539,7 @@ "OptionPrePaddingRequired": "Prtecci\u00f3n previa es requerida para grabar.", "LabelPostPaddingMinutes": "Minutos de protecci\u00f3n posterior:", "OptionPostPaddingRequired": "Protecci\u00f3n posterior es requerida para grabar.", - "HeaderWhatsOnTV": "\u00bfQu\u00e9 se V\u00e9?", + "HeaderWhatsOnTV": "\u00bfQu\u00e9 hay?", "HeaderUpcomingTV": "Pr\u00f3ximos Programas", "TabStatus": "Estado", "TabSettings": "Configuraci\u00f3n", diff --git a/MediaBrowser.Server.Implementations/Localization/Server/fr.json b/MediaBrowser.Server.Implementations/Localization/Server/fr.json index 9520ca45fd..13c6822334 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/fr.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/fr.json @@ -440,12 +440,19 @@ "VisitMediaBrowserWebsite": "Visiter le site Web de Media Browser", "HeaderPendingInvitations": "Pending Invitations", "VisitMediaBrowserWebsiteLong": "Visiter le site Web de Media Browser pour lire les derni\u00e8res nouvelles et parcourir le journal des d\u00e9veloppeurs.", + "TabParentalControl": "Parental Control", "OptionHideUser": "Ne pas afficher cet utilisateur dans les \u00e9crans de connexion", + "HeaderAccessSchedule": "Access Schedule", "OptionDisableUser": "D\u00e9sactiver cet utilisateur", + "HeaderAccessScheduleHelp": "Create an access schedule to limit access to certain hours.", "OptionDisableUserHelp": "Si d\u00e9sactiv\u00e9, le serveur n'autorisera pas de connexion de cet utilisateur. Les connexions existantes seront interrompues.", + "ButtonAddSchedule": "Add Schedule", "HeaderAdvancedControl": "Contr\u00f4le avanc\u00e9", + "LabelAccessDay": "Day of week:", "LabelName": "Nom :", + "LabelAccessStart": "Start hour:", "OptionAllowUserToManageServer": "Autoriser la gestion du serveur \u00e0 cet utilisateur", + "LabelAccessEnd": "End hour:", "HeaderFeatureAccess": "Acc\u00e8s aux caract\u00e9ristiques", "OptionAllowMediaPlayback": "Autoriser la lecture du m\u00e9dia", "OptionAllowBrowsingLiveTv": "Autoriser la TV en direct", diff --git a/MediaBrowser.Server.Implementations/Localization/Server/he.json b/MediaBrowser.Server.Implementations/Localization/Server/he.json index 2a01876b7f..e949d74ae4 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/he.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/he.json @@ -440,12 +440,19 @@ "VisitMediaBrowserWebsite": "\u05d1\u05e7\u05e8 \u05d1\u05d0\u05ea\u05e8 \u05e9\u05dc Media Browser", "HeaderPendingInvitations": "Pending Invitations", "VisitMediaBrowserWebsiteLong": "\u05d1\u05e7\u05e8 \u05d1\u05d0\u05ea\u05e8 \u05e9\u05dc Media Browser \u05db\u05d3\u05d9 \u05dc\u05d4\u05ea\u05e2\u05d3\u05db\u05df \u05d1\u05d7\u05e9\u05d3\u05d5\u05ea \u05d4\u05d0\u05d7\u05e8\u05d5\u05e0\u05d5\u05ea \u05d5\u05d1\u05d1\u05dc\u05d5\u05d2 \u05d4\u05de\u05e4\u05ea\u05d7\u05d9\u05dd.", + "TabParentalControl": "Parental Control", "OptionHideUser": "\u05d4\u05e1\u05ea\u05e8 \u05de\u05e9\u05ea\u05de\u05e9 \u05d6\u05d4 \u05d1\u05d7\u05dc\u05d5\u05df \u05d4\u05d4\u05ea\u05d7\u05d1\u05e8\u05d5\u05ea", + "HeaderAccessSchedule": "Access Schedule", "OptionDisableUser": "\u05d1\u05d8\u05dc \u05de\u05e9\u05ea\u05de\u05e9 \u05d6\u05d4", + "HeaderAccessScheduleHelp": "Create an access schedule to limit access to certain hours.", "OptionDisableUserHelp": "\u05d0\u05dd \u05de\u05d1\u05d5\u05d8\u05dc, \u05d4\u05e9\u05e8\u05ea \u05e9\u05dc\u05d0 \u05d9\u05d0\u05e4\u05e9\u05e8 \u05d7\u05d9\u05d1\u05d5\u05e8\u05d9\u05dd \u05de\u05de\u05e9\u05ea\u05de\u05e9 \u05d6\u05d4. \u05d7\u05d9\u05d1\u05d5\u05e8\u05d9\u05dd \u05e4\u05e2\u05d9\u05dc\u05d9\u05dd \u05d9\u05d1\u05d5\u05d8\u05dc\u05d5 \u05de\u05d9\u05d9\u05d3.", + "ButtonAddSchedule": "Add Schedule", "HeaderAdvancedControl": "\u05e9\u05dc\u05d9\u05d8\u05d4 \u05de\u05ea\u05e7\u05d3\u05de\u05d5\u05ea", + "LabelAccessDay": "Day of week:", "LabelName": "\u05e9\u05dd:", + "LabelAccessStart": "Start hour:", "OptionAllowUserToManageServer": "\u05d0\u05e4\u05e9\u05e8 \u05dc\u05de\u05e9\u05ea\u05de\u05e9 \u05d6\u05d4 \u05dc\u05e0\u05d4\u05dc \u05d0\u05ea \u05d4\u05e9\u05e8\u05ea", + "LabelAccessEnd": "End hour:", "HeaderFeatureAccess": "\u05d2\u05d9\u05e9\u05d4 \u05dc\u05de\u05d0\u05e4\u05d9\u05d9\u05e0\u05d9\u05dd", "OptionAllowMediaPlayback": "\u05d0\u05e4\u05e9\u05e8 \u05e0\u05d9\u05d2\u05d5\u05df \u05de\u05d3\u05d9\u05d4", "OptionAllowBrowsingLiveTv": "\u05d0\u05e4\u05e9\u05e8 \u05d3\u05e4\u05d3\u05d5\u05e3 \u05d1\u05d8\u05dc\u05d5\u05d5\u05d9\u05d6\u05d9\u05d4 \u05d7\u05d9\u05d4", diff --git a/MediaBrowser.Server.Implementations/Localization/Server/hr.json b/MediaBrowser.Server.Implementations/Localization/Server/hr.json index c76c3cf4e3..23142b377e 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/hr.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/hr.json @@ -440,12 +440,19 @@ "VisitMediaBrowserWebsite": "Posjeti Media Browser web stranicu", "HeaderPendingInvitations": "Pending Invitations", "VisitMediaBrowserWebsiteLong": "Posjeti Media Browser web stranicu kako bi vidjeli najnovije vijesti i bili u toku sa programerskim blogom", + "TabParentalControl": "Parental Control", "OptionHideUser": "Sakrij korisnika sa prozora prijave", + "HeaderAccessSchedule": "Access Schedule", "OptionDisableUser": "Onemogu\u0107i ovog korisnika", + "HeaderAccessScheduleHelp": "Create an access schedule to limit access to certain hours.", "OptionDisableUserHelp": "Ako je onemogu\u0107en server ne\u0107e dopustiti nikakve veze od ovog korisnika. Postoje\u0107e veze \u0107e odmah biti prekinute.", + "ButtonAddSchedule": "Add Schedule", "HeaderAdvancedControl": "Napredna kontrola", + "LabelAccessDay": "Day of week:", "LabelName": "Ime:", + "LabelAccessStart": "Start hour:", "OptionAllowUserToManageServer": "Dopusti ovom korisniku da upravlja serverom", + "LabelAccessEnd": "End hour:", "HeaderFeatureAccess": "Pristup opcijama", "OptionAllowMediaPlayback": "Dopusti reprodukciju medijskog sadr\u017eaja", "OptionAllowBrowsingLiveTv": "Omogu\u0107i pregled TV programa", diff --git a/MediaBrowser.Server.Implementations/Localization/Server/it.json b/MediaBrowser.Server.Implementations/Localization/Server/it.json index 30eaa6c4f6..ce26873074 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/it.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/it.json @@ -440,12 +440,19 @@ "VisitMediaBrowserWebsite": "Visita il sito di Media Browser", "HeaderPendingInvitations": "Pending Invitations", "VisitMediaBrowserWebsiteLong": "Vuoi saperne di pi\u00f9 sulle ultime novit\u00e0?", + "TabParentalControl": "Parental Control", "OptionHideUser": "Nascondi questo utente dalla schermata di Accesso", + "HeaderAccessSchedule": "Access Schedule", "OptionDisableUser": "Disabilita utente", + "HeaderAccessScheduleHelp": "Create an access schedule to limit access to certain hours.", "OptionDisableUserHelp": "Se disabilitato, il server non sar\u00e0 disponibile per questo utente.La connessione corrente verr\u00e0 TERMINATA", + "ButtonAddSchedule": "Add Schedule", "HeaderAdvancedControl": "Controlli avanzati", + "LabelAccessDay": "Day of week:", "LabelName": "Nome:", + "LabelAccessStart": "Start hour:", "OptionAllowUserToManageServer": "Consenti a questo utente di accedere alla configurazione del SERVER", + "LabelAccessEnd": "End hour:", "HeaderFeatureAccess": "Caratteristiche di accesso", "OptionAllowMediaPlayback": "Consenti la riproduzione", "OptionAllowBrowsingLiveTv": "Consenti la navigazione sulla Tv indiretta", diff --git a/MediaBrowser.Server.Implementations/Localization/Server/kk.json b/MediaBrowser.Server.Implementations/Localization/Server/kk.json index e9eaafc58d..2237c9292b 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/kk.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/kk.json @@ -440,12 +440,19 @@ "VisitMediaBrowserWebsite": "Media Browser \u0441\u0430\u0439\u0442\u044b\u043d\u0430 \u0431\u0430\u0440\u0443", "HeaderPendingInvitations": "Pending Invitations", "VisitMediaBrowserWebsiteLong": "\u0421\u043e\u04a3\u0493\u044b \u0436\u0430\u04a3\u0430\u043b\u044b\u049b\u0442\u0430\u0440\u0434\u044b \u0431\u0456\u043b\u0456\u043f \u0430\u043b\u0443 \u04af\u0448\u0456\u043d \u0436\u04d9\u043d\u0435 \u0436\u0430\u0441\u0430\u049b\u0442\u0430\u0443\u0448\u044b\u043b\u0430\u0440 \u0431\u043b\u043e\u0433\u0456\u043c\u0435\u043d \u0442\u0430\u043d\u044b\u0441\u044b\u043f \u0442\u04b1\u0440\u0443 \u04af\u0448\u0456\u043d Media Browser \u0441\u0430\u0439\u0442\u044b\u043d\u0430 \u0431\u0430\u0440\u044b\u04a3\u044b\u0437.", + "TabParentalControl": "Parental Control", "OptionHideUser": "\u0411\u04b1\u043b \u043f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0448\u044b\u043d\u044b \u043a\u0456\u0440\u0443 \u044d\u043a\u0440\u0430\u043d\u0434\u0430\u0440\u044b\u043d\u0430\u043d \u0436\u0430\u0441\u044b\u0440\u0443", + "HeaderAccessSchedule": "Access Schedule", "OptionDisableUser": "\u0411\u04b1\u043b \u043f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0448\u044b\u0493\u0430 \u0442\u044b\u0439\u044b\u043c \u0441\u0430\u043b\u0443", + "HeaderAccessScheduleHelp": "Create an access schedule to limit access to certain hours.", "OptionDisableUserHelp": "\u0415\u0433\u0435\u0440 \u0442\u044b\u0439\u044b\u043c \u0441\u0430\u043b\u044b\u043d\u0441\u0430, \u0441\u0435\u0440\u0432\u0435\u0440 \u0431\u04b1\u043b \u043f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0448\u044b\u0434\u0430\u043d \u0435\u0448\u049b\u0430\u043d\u0434\u0430\u0439 \u049b\u043e\u0441\u044b\u043b\u044b\u043c\u0493\u0430 \u0440\u04b1\u049b\u0441\u0430\u0442 \u0435\u0442\u043f\u0435\u0439\u0434\u0456. \u0411\u0430\u0440 \u049b\u043e\u0441\u044b\u043b\u044b\u043c\u0434\u0430\u0440 \u043a\u0435\u043d\u0435\u0442 \u04af\u0437\u0456\u043b\u0435\u0434\u0456.", + "ButtonAddSchedule": "Add Schedule", "HeaderAdvancedControl": "\u041a\u0435\u04a3\u0435\u0439\u0442\u0456\u043b\u0433\u0435\u043d \u0431\u0430\u0441\u049b\u0430\u0440\u0443", + "LabelAccessDay": "Day of week:", "LabelName": "\u0410\u0442\u044b:", + "LabelAccessStart": "Start hour:", "OptionAllowUserToManageServer": "\u0411\u0443\u043b \u043f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0448\u044b\u0493\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0434\u0456 \u0431\u0430\u0441\u049b\u0430\u0440\u0443 \u04af\u0448\u0456\u043d \u0440\u04b1\u049b\u0441\u0430\u0442 \u0435\u0442\u0443", + "LabelAccessEnd": "End hour:", "HeaderFeatureAccess": "\u041c\u04af\u043c\u043a\u0456\u043d\u0434\u0456\u043a\u0442\u0435\u0440\u0433\u0435 \u049b\u0430\u0442\u044b\u043d\u0430\u0441", "OptionAllowMediaPlayback": "\u0422\u0430\u0441\u0443\u0448\u044b\u0434\u0435\u0440\u0435\u043a\u0442\u0435\u0440\u0434\u0456 \u043e\u0439\u043d\u0430\u0442\u0443\u044b\u043d\u0430 \u0440\u04b1\u049b\u0441\u0430\u0442 \u0435\u0442\u0443", "OptionAllowBrowsingLiveTv": "\u042d\u0444\u0438\u0440\u043b\u0456\u043a \u0422\u0414 \u0448\u043e\u043b\u0443\u044b\u043d\u0430 \u0440\u04b1\u049b\u0441\u0430\u0442 \u0435\u0442\u0443", diff --git a/MediaBrowser.Server.Implementations/Localization/Server/ko.json b/MediaBrowser.Server.Implementations/Localization/Server/ko.json index cf7cb0795d..2e94e5014e 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/ko.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/ko.json @@ -440,12 +440,19 @@ "VisitMediaBrowserWebsite": "Visit the Media Browser Web Site", "HeaderPendingInvitations": "Pending Invitations", "VisitMediaBrowserWebsiteLong": "Visit the Media Browser Web site to catch the latest news and keep up with the developer blog.", + "TabParentalControl": "Parental Control", "OptionHideUser": "Hide this user from login screens", + "HeaderAccessSchedule": "Access Schedule", "OptionDisableUser": "Disable this user", + "HeaderAccessScheduleHelp": "Create an access schedule to limit access to certain hours.", "OptionDisableUserHelp": "If disabled the server will not allow any connections from this user. Existing connections will be abruptly terminated.", + "ButtonAddSchedule": "Add Schedule", "HeaderAdvancedControl": "Advanced Control", + "LabelAccessDay": "Day of week:", "LabelName": "Name:", + "LabelAccessStart": "Start hour:", "OptionAllowUserToManageServer": "Allow this user to manage the server", + "LabelAccessEnd": "End hour:", "HeaderFeatureAccess": "Feature Access", "OptionAllowMediaPlayback": "Allow media playback", "OptionAllowBrowsingLiveTv": "Allow browsing of live tv", diff --git a/MediaBrowser.Server.Implementations/Localization/Server/ms.json b/MediaBrowser.Server.Implementations/Localization/Server/ms.json index d04dd58aab..783928c6c6 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/ms.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/ms.json @@ -440,12 +440,19 @@ "VisitMediaBrowserWebsite": "Visit the Media Browser Web Site", "HeaderPendingInvitations": "Pending Invitations", "VisitMediaBrowserWebsiteLong": "Visit the Media Browser Web site to catch the latest news and keep up with the developer blog.", + "TabParentalControl": "Parental Control", "OptionHideUser": "Hide this user from login screens", + "HeaderAccessSchedule": "Access Schedule", "OptionDisableUser": "Disable this user", + "HeaderAccessScheduleHelp": "Create an access schedule to limit access to certain hours.", "OptionDisableUserHelp": "If disabled the server will not allow any connections from this user. Existing connections will be abruptly terminated.", + "ButtonAddSchedule": "Add Schedule", "HeaderAdvancedControl": "Advanced Control", + "LabelAccessDay": "Day of week:", "LabelName": "Name:", + "LabelAccessStart": "Start hour:", "OptionAllowUserToManageServer": "Allow this user to manage the server", + "LabelAccessEnd": "End hour:", "HeaderFeatureAccess": "Feature Access", "OptionAllowMediaPlayback": "Allow media playback", "OptionAllowBrowsingLiveTv": "Allow browsing of live tv", diff --git a/MediaBrowser.Server.Implementations/Localization/Server/nb.json b/MediaBrowser.Server.Implementations/Localization/Server/nb.json index aa8a1fd042..3eb8bca504 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/nb.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/nb.json @@ -440,12 +440,19 @@ "VisitMediaBrowserWebsite": "Bes\u00f8k Media Browsers nettside", "HeaderPendingInvitations": "Pending Invitations", "VisitMediaBrowserWebsiteLong": "Bes\u00f8k Media Browser sin side for \u00e5 f\u00e5 de siste nyhetene og for \u00e5 f\u00f8lge med p\u00e5 utviklerbloggen.", + "TabParentalControl": "Parental Control", "OptionHideUser": "Skjul brukere fra logginn-skjermen", + "HeaderAccessSchedule": "Access Schedule", "OptionDisableUser": "Deaktiver denne brukeren", + "HeaderAccessScheduleHelp": "Create an access schedule to limit access to certain hours.", "OptionDisableUserHelp": "Hvis avsl\u00e5tt, serveren vil ikke godta noen forbindelser fra denne brukeren. eksisterende forbindelser vil bli br\u00e5tt avsluttet.", + "ButtonAddSchedule": "Add Schedule", "HeaderAdvancedControl": "Avansert Kontroll", + "LabelAccessDay": "Day of week:", "LabelName": "Navn", + "LabelAccessStart": "Start hour:", "OptionAllowUserToManageServer": "TIllatt denne brukeren \u00e5 administrere serveren", + "LabelAccessEnd": "End hour:", "HeaderFeatureAccess": "Funksjon Tilgang", "OptionAllowMediaPlayback": "Tillatt medieavspilling", "OptionAllowBrowsingLiveTv": "Tillat surfing av Live TV", diff --git a/MediaBrowser.Server.Implementations/Localization/Server/nl.json b/MediaBrowser.Server.Implementations/Localization/Server/nl.json index 1472371371..335cb790bc 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/nl.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/nl.json @@ -394,21 +394,21 @@ "OptionSunday": "Zondag", "HeaderWelcomeToMediaBrowserServerDashboard": "Welkom bij de Media Browser Dashboard", "OptionMonday": "Maandag", - "LabelDateAddedBehavior": "Date added behavior for new content:", + "LabelDateAddedBehavior": "Datum toegevoegd gedrag voor nieuwe content:", "OptionTuesday": "Dinsdag", - "OptionDateAddedImportTime": "Use date scanned into the library", + "OptionDateAddedImportTime": "Gebruik scan datum", "OptionWednesday": "Woensdag", - "OptionDateAddedFileTime": "Use file creation date", + "OptionDateAddedFileTime": "Gebruik aanmaak datum bestand", "OptionThursday": "Donderdag", - "LabelDateAddedBehaviorHelp": "If a metadata value is present it will always be used before either of these options.", + "LabelDateAddedBehaviorHelp": "Als er metadata gegevens zijn hebben deze voorrang op deze opties.", "OptionFriday": "Vrijdag", - "LabelNumberTrailerToPlay": "Number of trailers to play:", + "LabelNumberTrailerToPlay": "Aantal af te spelen trailers:", "OptionSaturday": "Zaterdag", "TitleDevices": "Devices", "HeaderManagement": "Beheer", "TabCameraUpload": "Camera Upload", "LabelManagement": "Management:", - "TabDevices": "Devices", + "TabDevices": "Apparaten", "OptionMissingImdbId": "IMDb Id ontbreekt", "HeaderCameraUploadHelp": "Automatically upload photos and videos taken from your mobile devices into Media Browser.", "OptionMissingTvdbId": "TheTVDB Id ontbreekt", @@ -440,12 +440,19 @@ "VisitMediaBrowserWebsite": "Bezoek de Media Browser Website", "HeaderPendingInvitations": "Pending Invitations", "VisitMediaBrowserWebsiteLong": "Bezoek de Media Browser-website voor het laatste nieuws en blijf op de hoogte via de ontwikkelaars blog.", + "TabParentalControl": "Parental Control", "OptionHideUser": "Verberg deze gebruiker op de aanmeldschermen", + "HeaderAccessSchedule": "Access Schedule", "OptionDisableUser": "Deze account uitschakelen", + "HeaderAccessScheduleHelp": "Create an access schedule to limit access to certain hours.", "OptionDisableUserHelp": "Indien uitgeschakeld zal de server geen verbindingen van deze gebruiker toe staan. Bestaande verbindingen zullen abrupt worden be\u00ebindigd.", + "ButtonAddSchedule": "Add Schedule", "HeaderAdvancedControl": "Geavanceerd Beheer", + "LabelAccessDay": "Day of week:", "LabelName": "Naam:", + "LabelAccessStart": "Start hour:", "OptionAllowUserToManageServer": "Deze gebruiker kan de server te beheren", + "LabelAccessEnd": "End hour:", "HeaderFeatureAccess": "Functie toegang", "OptionAllowMediaPlayback": "Afspelen van media toestaan", "OptionAllowBrowsingLiveTv": "Bladeren door live tv toestaan", @@ -682,13 +689,13 @@ "NewCollectionNameExample": "Voorbeeld: Star Wars Collectie", "OptionSearchForInternetMetadata": "Zoeken op het internet voor afbeeldingen en metadata", "ButtonCreate": "Cre\u00ebren", - "LabelLocalHttpServerPortNumber": "Local port number:", - "LabelLocalHttpServerPortNumberHelp": "The tcp port number that Media Browser's http server should bind to.", - "LabelPublicPort": "Public port number:", - "LabelPublicPortHelp": "The public port number that should be mapped to the local port.", + "LabelLocalHttpServerPortNumber": "Lokaal poort nummer:", + "LabelLocalHttpServerPortNumberHelp": "De TCP poort waarop de Media Browser Server beschikbaar is.", + "LabelPublicPort": "Publieke poort nummer:", + "LabelPublicPortHelp": "Het poortnummer op het internet waarop Media Browser beschikbaar is.", "LabelWebSocketPortNumber": "Web socket poortnummer:", - "LabelEnableAutomaticPortMap": "Enable automatic port mapping", - "LabelEnableAutomaticPortMapHelp": "Attempt to automatically map the public port to the local port via UPnP. This may not work with some router models.", + "LabelEnableAutomaticPortMap": "Schakel automatisch poort vertalen in", + "LabelEnableAutomaticPortMapHelp": "Probeer om de publieke poort automatisch te vertalen naar de lokale poort via UPnP. Dit werk niet op alle routers.", "LabelExternalDDNS": "Externe DDNS:", "LabelExternalDDNSHelp": "Als u een dynamische DNS heeft kun u die hier invoeren. Media Browser apps zullen het gebruiken om op afstand verbinding te maken.", "TabResume": "Hervatten", diff --git a/MediaBrowser.Server.Implementations/Localization/Server/pl.json b/MediaBrowser.Server.Implementations/Localization/Server/pl.json index 752185288c..cbd5fca36e 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/pl.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/pl.json @@ -440,12 +440,19 @@ "VisitMediaBrowserWebsite": "Odwied\u017a stron\u0119 Media Browser", "HeaderPendingInvitations": "Pending Invitations", "VisitMediaBrowserWebsiteLong": "Visit the Media Browser Web site to catch the latest news and keep up with the developer blog.", + "TabParentalControl": "Parental Control", "OptionHideUser": "Hide this user from login screens", + "HeaderAccessSchedule": "Access Schedule", "OptionDisableUser": "Disable this user", + "HeaderAccessScheduleHelp": "Create an access schedule to limit access to certain hours.", "OptionDisableUserHelp": "If disabled the server will not allow any connections from this user. Existing connections will be abruptly terminated.", + "ButtonAddSchedule": "Add Schedule", "HeaderAdvancedControl": "Advanced Control", + "LabelAccessDay": "Day of week:", "LabelName": "Name:", + "LabelAccessStart": "Start hour:", "OptionAllowUserToManageServer": "Allow this user to manage the server", + "LabelAccessEnd": "End hour:", "HeaderFeatureAccess": "Feature Access", "OptionAllowMediaPlayback": "Allow media playback", "OptionAllowBrowsingLiveTv": "Allow browsing of live tv", diff --git a/MediaBrowser.Server.Implementations/Localization/Server/pt_BR.json b/MediaBrowser.Server.Implementations/Localization/Server/pt_BR.json index 32148cd7f1..f129aaa261 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/pt_BR.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/pt_BR.json @@ -70,7 +70,7 @@ "ButtonOk": "Ok", "LabelChannelDownloadSizeLimit": "Limite do tamanho para download (GB):", "ButtonCancel": "Cancelar", - "LabelChannelDownloadSizeLimitHelpText": "Limit the size of the channel download folder.", + "LabelChannelDownloadSizeLimitHelpText": "Limitar o tamanho da pasta de download do canal.", "HeaderRecentActivity": "Atividade Recente", "ButtonNew": "Novo", "HeaderPeople": "Pessoas", @@ -152,7 +152,7 @@ "LabelWebsite": "Website:", "ButtonAddLocalUser": "Adicionar Usu\u00e1rio Local", "LabelTagline": "Slogan:", - "ButtonInviteUser": "Invite User", + "ButtonInviteUser": "Convidar Usu\u00e1rio", "ButtonSave": "Salvar", "LabelOverview": "Sinopse:", "ButtonResetPassword": "Redefinir Senha", @@ -394,58 +394,65 @@ "OptionSunday": "Domingo", "HeaderWelcomeToMediaBrowserServerDashboard": "Bem Vindo ao Painel do Media Browser", "OptionMonday": "Segunda-feira", - "LabelDateAddedBehavior": "Date added behavior for new content:", + "LabelDateAddedBehavior": "Data de adi\u00e7\u00e3o de comportamento para o novo conte\u00fado:", "OptionTuesday": "Ter\u00e7a-feira", - "OptionDateAddedImportTime": "Use date scanned into the library", + "OptionDateAddedImportTime": "Use a data obtida na biblioteca", "OptionWednesday": "Quarta-feira", - "OptionDateAddedFileTime": "Use file creation date", + "OptionDateAddedFileTime": "Use a data de cria\u00e7\u00e3o do arquivo", "OptionThursday": "Quinta-feira", - "LabelDateAddedBehaviorHelp": "If a metadata value is present it will always be used before either of these options.", + "LabelDateAddedBehaviorHelp": "Se um valor de metadata estiver presente, ele sempre ser\u00e1 utilizado antes destas op\u00e7\u00f5es.", "OptionFriday": "Sexta-feira", - "LabelNumberTrailerToPlay": "Number of trailers to play:", + "LabelNumberTrailerToPlay": "N\u00famero de trailers a serem apresentados:", "OptionSaturday": "S\u00e1bado", - "TitleDevices": "Devices", + "TitleDevices": "Dispositivos", "HeaderManagement": "Gerenciamento", - "TabCameraUpload": "Camera Upload", + "TabCameraUpload": "Carga atrav\u00e9s de c\u00e2mera", "LabelManagement": "Administra\u00e7\u00e3o:", - "TabDevices": "Devices", + "TabDevices": "Dispositivos", "OptionMissingImdbId": "Faltando Id IMDb", - "HeaderCameraUploadHelp": "Automatically upload photos and videos taken from your mobile devices into Media Browser.", + "HeaderCameraUploadHelp": "Carga autom\u00e1tica de fotos e v\u00eddeos de seus dispositivos m\u00f3veis para o Media Browser.", "OptionMissingTvdbId": "Faltando Id TheTVDB", - "MessageNoDevicesSupportCameraUpload": "You currently don't have any devices that support camera upload.", + "MessageNoDevicesSupportCameraUpload": "Atualmente voc\u00ea n\u00e3o tem nenhum dispositivo que suporte carga atrav\u00e9s da c\u00e2mera.", "OptionMissingOverview": "Faltando Sinopse", - "LabelCameraUploadPath": "Camera upload path:", + "LabelCameraUploadPath": "Caminho para carga atrav\u00e9s da c\u00e2mera:", "OptionFileMetadataYearMismatch": "Anos do Arquivo e Metadados n\u00e3o conferem", - "LabelCameraUploadPathHelp": "Select a custom upload path, if desired. If unspecified a default folder will be used.", + "LabelCameraUploadPathHelp": "Selecione o caminho, caso desejado. Se n\u00e3o for especificado um caminho, ser\u00e1 usada uma pasta padr\u00e3o.", "TabGeneral": "Geral", - "LabelCreateCameraUploadSubfolder": "Create a subfolder for each device", + "LabelCreateCameraUploadSubfolder": "Criar uma subpasta para cada dispositivo", "TitleSupport": "Suporte", - "LabelCreateCameraUploadSubfolderHelp": "Specific folders can be assigned to a device by clicking on it from the Devices page.", + "LabelCreateCameraUploadSubfolderHelp": "Pastas espec\u00edficas podem ser atribu\u00eddas a um dispositivo clicando-as na p\u00e1gina de Dispositivos.", "TabLog": "Log", - "LabelCustomDeviceDisplayName": "Display name:", + "LabelCustomDeviceDisplayName": "Nome para exibi\u00e7\u00e3o:", "TabAbout": "Sobre", - "LabelCustomDeviceDisplayNameHelp": "Supply a custom display name or leave empty to use the name reported by the device.", + "LabelCustomDeviceDisplayNameHelp": "Forne\u00e7a um nome para exibi\u00e7\u00e3o ou deixe vazio para usar o nome informado pelo dispositivo.", "TabSupporterKey": "Chave de Colaborador", - "HeaderInviteUser": "Invite User", + "HeaderInviteUser": "Convidar usu\u00e1rio", "TabBecomeSupporter": "Torne-se um Colaborador", - "LabelConnectInviteUserHelp": "This is the username or email that your friend uses to sign in to the Media Browser website.", + "LabelConnectInviteUserHelp": "Este \u00e9 o nome do usu\u00e1rio ou email que seu amigo usa para o website do Media Browser", "MediaBrowserHasCommunity": "Media Browser tem uma comunidade que cresce em usu\u00e1rios e colaboradores.", - "HeaderInviteUserHelp": "Sharing your media with friends is easier than ever before with Media Browser Connect.", + "HeaderInviteUserHelp": "Compartilhar suas m\u00eddias com seus amigos \u00e9 muito mais facil com o Media Browser Connect", "CheckoutKnowledgeBase": "Verifique nossa base de conhecimento para ajud\u00e1-lo a obter o m\u00e1ximo do Media Browser.", - "ButtonSendInvitation": "Send Invitation", + "ButtonSendInvitation": "Enviar convite", "SearchKnowledgeBase": "Pesquisar na Base de Conhecimento", - "HeaderGuests": "Guests", + "HeaderGuests": "Convidados", "VisitTheCommunity": "Visitar a Comunidade", - "HeaderLocalUsers": "Local Users", + "HeaderLocalUsers": "Usu\u00e1rios Locais", "VisitMediaBrowserWebsite": "Visitar o Web Site do Media Browser", - "HeaderPendingInvitations": "Pending Invitations", + "HeaderPendingInvitations": "Convites pendentes", "VisitMediaBrowserWebsiteLong": "Visite o Web Site do Media Browser para obter as \u00faltimas novidades e atualizar-se com o blog de desenvolvedores.", + "TabParentalControl": "Parental Control", "OptionHideUser": "Ocultar este usu\u00e1rio das telas de login", + "HeaderAccessSchedule": "Access Schedule", "OptionDisableUser": "Desativar este usu\u00e1rio", + "HeaderAccessScheduleHelp": "Create an access schedule to limit access to certain hours.", "OptionDisableUserHelp": "Se estiver desativado o servidor n\u00e3o permitir\u00e1 nenhuma conex\u00e3o deste usu\u00e1rio. Conex\u00f5es existentes ser\u00e3o abruptamente terminadas.", + "ButtonAddSchedule": "Add Schedule", "HeaderAdvancedControl": "Controle Avan\u00e7ado", + "LabelAccessDay": "Day of week:", "LabelName": "Nome:", + "LabelAccessStart": "Start hour:", "OptionAllowUserToManageServer": "Permitir a este usu\u00e1rio administrar o servidor", + "LabelAccessEnd": "End hour:", "HeaderFeatureAccess": "Acesso aos Recursos", "OptionAllowMediaPlayback": "Permitir reprodu\u00e7\u00e3o de m\u00eddia", "OptionAllowBrowsingLiveTv": "Permitir navega\u00e7\u00e3o na tv ao vivo", @@ -682,13 +689,13 @@ "NewCollectionNameExample": "Exemplo: Cole\u00e7\u00e3o Star Wars", "OptionSearchForInternetMetadata": "Buscar artwork e metadados na internet", "ButtonCreate": "Criar", - "LabelLocalHttpServerPortNumber": "Local port number:", - "LabelLocalHttpServerPortNumberHelp": "The tcp port number that Media Browser's http server should bind to.", - "LabelPublicPort": "Public port number:", - "LabelPublicPortHelp": "The public port number that should be mapped to the local port.", + "LabelLocalHttpServerPortNumber": "N\u00famero da porta local:", + "LabelLocalHttpServerPortNumberHelp": "O n\u00famero da porta tcp que o servidor http do Media Browser utilizar\u00e1.", + "LabelPublicPort": "N\u00famero da porta p\u00fablica:", + "LabelPublicPortHelp": "O n\u00famero da porta p\u00fablica que deve ser mapeado para a porta local.", "LabelWebSocketPortNumber": "N\u00famero da porta do web socket:", - "LabelEnableAutomaticPortMap": "Enable automatic port mapping", - "LabelEnableAutomaticPortMapHelp": "Attempt to automatically map the public port to the local port via UPnP. This may not work with some router models.", + "LabelEnableAutomaticPortMap": "Habilitar mapeamento autom\u00e1tico de portas", + "LabelEnableAutomaticPortMapHelp": "Tentativa de mapear automaticamente a porta p\u00fablica para a local atrav\u00e9s de uPnP. Isto poder\u00e1 n\u00e3o funcionar em alguns modelos de roteadores.", "LabelExternalDDNS": "DDNS Externo:", "LabelExternalDDNSHelp": "Se voc\u00ea tem um DNS din\u00e2mico digite aqui. O Media Browser o usar\u00e1 quando conectar remotamente.", "TabResume": "Retomar", diff --git a/MediaBrowser.Server.Implementations/Localization/Server/pt_PT.json b/MediaBrowser.Server.Implementations/Localization/Server/pt_PT.json index 723c3b9840..e0f5e1eb95 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/pt_PT.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/pt_PT.json @@ -440,12 +440,19 @@ "VisitMediaBrowserWebsite": "Visite a p\u00e1gina web do Media Browser", "HeaderPendingInvitations": "Pending Invitations", "VisitMediaBrowserWebsiteLong": "Visite a p\u00e1gina do Media Browser para ficar a par das \u00faltimas novidades e para acompanhar o blog do programador.", + "TabParentalControl": "Parental Control", "OptionHideUser": "Ocultar este utilizador dos formul\u00e1rios de in\u00edcio de sess\u00e3o", + "HeaderAccessSchedule": "Access Schedule", "OptionDisableUser": "Desativar este utilizador", + "HeaderAccessScheduleHelp": "Create an access schedule to limit access to certain hours.", "OptionDisableUserHelp": "Se desativado, o servidor n\u00e3o permite nenhuma conex\u00e3o deste utilizador. Conex\u00f5es existentes ser\u00e3o terminadas.", + "ButtonAddSchedule": "Add Schedule", "HeaderAdvancedControl": "Controlo Avan\u00e7ado", + "LabelAccessDay": "Day of week:", "LabelName": "Nome:", + "LabelAccessStart": "Start hour:", "OptionAllowUserToManageServer": "Permitir a este utilizador gerir o servidor", + "LabelAccessEnd": "End hour:", "HeaderFeatureAccess": "Acesso a Caracter\u00edsticas", "OptionAllowMediaPlayback": "Permitir reprodu\u00e7\u00e3o de multim\u00e9dia", "OptionAllowBrowsingLiveTv": "Permitir navega\u00e7\u00e3o da tv ao vivo", diff --git a/MediaBrowser.Server.Implementations/Localization/Server/ru.json b/MediaBrowser.Server.Implementations/Localization/Server/ru.json index 64b166124a..039f057f98 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/ru.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/ru.json @@ -440,12 +440,19 @@ "VisitMediaBrowserWebsite": "\u041f\u043e\u0441\u0435\u0442\u0438\u0442\u044c \u0441\u0430\u0439\u0442 Media Browser", "HeaderPendingInvitations": "Pending Invitations", "VisitMediaBrowserWebsiteLong": "\u041f\u043e\u0441\u0435\u0442\u0438\u0442\u0435 \u0441\u0430\u0439\u0442 Media Browser, \u0447\u0442\u043e\u0431\u044b \u0441\u043b\u0435\u0434\u0438\u0442\u044c \u0437\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u043c\u0438 \u043d\u043e\u0432\u043e\u0441\u0442\u044f\u043c\u0438 \u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c \u043e\u0441\u0432\u0435\u0434\u043e\u043c\u043b\u0451\u043d\u043d\u043e\u0441\u0442\u044c \u043f\u043e \u0431\u043b\u043e\u0433\u0443 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432.", + "TabParentalControl": "Parental Control", "OptionHideUser": "\u0421\u043a\u0440\u044b\u0442\u044c \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0441 \u044d\u043a\u0440\u0430\u043d\u043e\u0432 \u0432\u0445\u043e\u0434\u0430", + "HeaderAccessSchedule": "Access Schedule", "OptionDisableUser": "\u0417\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f", + "HeaderAccessScheduleHelp": "Create an access schedule to limit access to certain hours.", "OptionDisableUserHelp": "\u041f\u0440\u0438 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438, \u0441\u0435\u0440\u0432\u0435\u0440 \u043d\u0435 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0438\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u043b\u044e\u0431\u044b\u0445 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0439 \u043e\u0442 \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f. \u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0431\u0443\u0434\u0443\u0442 \u0440\u0435\u0437\u043a\u043e \u043e\u0431\u043e\u0440\u0432\u0430\u043d\u044b.", + "ButtonAddSchedule": "Add Schedule", "HeaderAdvancedControl": "\u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u043d\u043e\u0435 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435", + "LabelAccessDay": "Day of week:", "LabelName": "\u0418\u043c\u044f (\u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435):", + "LabelAccessStart": "Start hour:", "OptionAllowUserToManageServer": "\u042d\u0442\u043e\u043c\u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c", + "LabelAccessEnd": "End hour:", "HeaderFeatureAccess": "\u0414\u043e\u0441\u0442\u0443\u043f \u043a \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438", "OptionAllowMediaPlayback": "\u0420\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044c \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043c\u0435\u0434\u0438\u0430\u0434\u0430\u043d\u043d\u044b\u0445", "OptionAllowBrowsingLiveTv": "\u0420\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044c \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 \u044d\u0444\u0438\u0440\u043d\u043e\u0433\u043e \u0442\u0432", diff --git a/MediaBrowser.Server.Implementations/Localization/Server/server.json b/MediaBrowser.Server.Implementations/Localization/Server/server.json index 2a56037b3f..07faaf884e 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/server.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/server.json @@ -830,7 +830,7 @@ "HeaderWelcomeToMediaBrowserWebClient": "Welcome to the Media Browser Web Client", "ButtonDismiss": "Dismiss", "ButtonTakeTheTour": "Take the tour", - "ButtonEditOtherUserPreferences": "Edit this user's personal preferences.", + "ButtonEditOtherUserPreferences": "Edit this user's profile and personal preferences.", "LabelChannelStreamQuality": "Preferred internet stream quality:", "LabelChannelStreamQualityHelp": "In a low bandwidth environment, limiting quality can help ensure a smooth streaming experience.", "OptionBestAvailableStreamQuality": "Best available", @@ -1242,5 +1242,8 @@ "LabelAccessDay": "Day of week:", "LabelAccessStart": "Start time:", "LabelAccessEnd": "End time:", - "HeaderSchedule": "Schedule" + "HeaderSchedule": "Schedule", + "OptionEveryday": "Every day", + "OptionWeekdays": "Weekdays", + "OptionWeekends": "Weekends" } diff --git a/MediaBrowser.Server.Implementations/Localization/Server/sv.json b/MediaBrowser.Server.Implementations/Localization/Server/sv.json index 53874af25c..206a54b332 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/sv.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/sv.json @@ -440,12 +440,19 @@ "VisitMediaBrowserWebsite": "G\u00e5 till Media Browsers hemsida", "HeaderPendingInvitations": "Pending Invitations", "VisitMediaBrowserWebsiteLong": "G\u00e5 till Media Browsers hemsida och l\u00e4s de senaste nyheterna och utvecklarbloggen", + "TabParentalControl": "Parental Control", "OptionHideUser": "Visa inte den h\u00e4r anv\u00e4ndaren p\u00e5 inloggningssidorna", + "HeaderAccessSchedule": "Access Schedule", "OptionDisableUser": "Sp\u00e4rra den h\u00e4r anv\u00e4ndaren", + "HeaderAccessScheduleHelp": "Create an access schedule to limit access to certain hours.", "OptionDisableUserHelp": "Sp\u00e4rrade anv\u00e4ndare till\u00e5ts ej kontakta servern. Eventuella p\u00e5g\u00e5ende anslutningar avbryts omedelbart.", + "ButtonAddSchedule": "Add Schedule", "HeaderAdvancedControl": "Avancerade anv\u00e4ndarinst\u00e4llningar", + "LabelAccessDay": "Day of week:", "LabelName": "Namn:", + "LabelAccessStart": "Start hour:", "OptionAllowUserToManageServer": "Till\u00e5t denna anv\u00e4ndare att administrera servern", + "LabelAccessEnd": "End hour:", "HeaderFeatureAccess": "Tillg\u00e5ng till funktioner", "OptionAllowMediaPlayback": "Till\u00e5t mediauppspelning", "OptionAllowBrowsingLiveTv": "Till\u00e5t bl\u00e4ddring i live-TV", diff --git a/MediaBrowser.Server.Implementations/Localization/Server/tr.json b/MediaBrowser.Server.Implementations/Localization/Server/tr.json index de67f6957e..5fa3a8b926 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/tr.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/tr.json @@ -440,12 +440,19 @@ "VisitMediaBrowserWebsite": "Visit the Media Browser Web Site", "HeaderPendingInvitations": "Pending Invitations", "VisitMediaBrowserWebsiteLong": "Visit the Media Browser Web site to catch the latest news and keep up with the developer blog.", + "TabParentalControl": "Parental Control", "OptionHideUser": "Hide this user from login screens", + "HeaderAccessSchedule": "Access Schedule", "OptionDisableUser": "Kullan\u0131c\u0131 Devre D\u0131\u015f\u0131 B\u0131rak", + "HeaderAccessScheduleHelp": "Create an access schedule to limit access to certain hours.", "OptionDisableUserHelp": "If disabled the server will not allow any connections from this user. Existing connections will be abruptly terminated.", + "ButtonAddSchedule": "Add Schedule", "HeaderAdvancedControl": "Geli\u015fmi\u015f Kontrol", + "LabelAccessDay": "Day of week:", "LabelName": "\u0130sim", + "LabelAccessStart": "Start hour:", "OptionAllowUserToManageServer": "Allow this user to manage the server", + "LabelAccessEnd": "End hour:", "HeaderFeatureAccess": "Feature Access", "OptionAllowMediaPlayback": "Allow media playback", "OptionAllowBrowsingLiveTv": "Allow browsing of live tv", diff --git a/MediaBrowser.Server.Implementations/Localization/Server/vi.json b/MediaBrowser.Server.Implementations/Localization/Server/vi.json index e55b66bedc..f8cb6828ce 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/vi.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/vi.json @@ -440,12 +440,19 @@ "VisitMediaBrowserWebsite": "Gh\u00e9 th\u0103m web site Media Browser", "HeaderPendingInvitations": "Pending Invitations", "VisitMediaBrowserWebsiteLong": "Visit the Media Browser Web site to catch the latest news and keep up with the developer blog.", + "TabParentalControl": "Parental Control", "OptionHideUser": "\u1ea8n ng\u01b0\u1eddi d\u00f9ng n\u00e0y t\u1eeb m\u00e0n h\u00ecnh \u0111\u0103ng nh\u1eadp", + "HeaderAccessSchedule": "Access Schedule", "OptionDisableUser": "V\u00f4 hi\u1ec7u h\u00f3a ng\u01b0\u1eddi d\u00f9ng n\u00e0y", + "HeaderAccessScheduleHelp": "Create an access schedule to limit access to certain hours.", "OptionDisableUserHelp": "If disabled the server will not allow any connections from this user. Existing connections will be abruptly terminated.", + "ButtonAddSchedule": "Add Schedule", "HeaderAdvancedControl": "Advanced Control", + "LabelAccessDay": "Day of week:", "LabelName": "T\u00ean:", + "LabelAccessStart": "Start hour:", "OptionAllowUserToManageServer": "Cho ph\u00e9p ng\u01b0\u1eddi d\u00f9ng n\u00e0y qu\u1ea3n l\u00fd m\u00e1y ch\u1ee7", + "LabelAccessEnd": "End hour:", "HeaderFeatureAccess": "Truy c\u1eadp t\u00ednh n\u0103ng", "OptionAllowMediaPlayback": "Cho ph\u00e9p ch\u1ea1y media", "OptionAllowBrowsingLiveTv": "Cho ph\u00e9p duy\u1ec7t ch\u01b0\u01a1ng tr\u00ecnh truy\u1ec1n h\u00ecnh tr\u1ef1c ti\u1ebfp", diff --git a/MediaBrowser.Server.Implementations/Localization/Server/zh_TW.json b/MediaBrowser.Server.Implementations/Localization/Server/zh_TW.json index 57cebb71fa..d6200fc0d8 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/zh_TW.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/zh_TW.json @@ -440,12 +440,19 @@ "VisitMediaBrowserWebsite": "\u8a2a\u554fMedia Browser\u7db2\u7ad9", "HeaderPendingInvitations": "Pending Invitations", "VisitMediaBrowserWebsiteLong": "\u8a2a\u554fMedia Browser\u7684\u7db2\u7ad9\uff0c\u4ee5\u7dca\u8cbc\u6700\u65b0\u7684\u6d88\u606f\u548c\u8ddf\u4e0a\u958b\u767c\u8005\u535a\u5ba2\u3002", + "TabParentalControl": "Parental Control", "OptionHideUser": "\u5f9e\u767b\u9304\u9801\u9762\u96b1\u85cf\u6b64\u7528\u6236", + "HeaderAccessSchedule": "Access Schedule", "OptionDisableUser": "\u7981\u7528\u6b64\u7528\u6236", + "HeaderAccessScheduleHelp": "Create an access schedule to limit access to certain hours.", "OptionDisableUserHelp": "\u88ab\u7981\u7528\u7684\u7528\u6236\u5c07\u4e0d\u5141\u8a31\u9023\u63a5\u4f3a\u670d\u5668\u3002\u73fe\u6709\u7684\u9023\u63a5\u5c07\u88ab\u5373\u6642\u7d42\u6b62\u3002", + "ButtonAddSchedule": "Add Schedule", "HeaderAdvancedControl": "\u9ad8\u7d1a\u63a7\u5236", + "LabelAccessDay": "Day of week:", "LabelName": "\u540d\u5b57\uff1a", + "LabelAccessStart": "Start hour:", "OptionAllowUserToManageServer": "\u5141\u8a31\u9019\u7528\u6236\u7ba1\u7406\u4f3a\u670d\u5668", + "LabelAccessEnd": "End hour:", "HeaderFeatureAccess": "\u53ef\u4ee5\u4f7f\u7528\u7684\u529f\u80fd", "OptionAllowMediaPlayback": "\u5141\u8a31\u5a92\u9ad4\u64ad\u653e", "OptionAllowBrowsingLiveTv": "\u5141\u8a31\u4f7f\u7528\u96fb\u8996\u529f\u80fd", diff --git a/MediaBrowser.Server.Implementations/Session/SessionManager.cs b/MediaBrowser.Server.Implementations/Session/SessionManager.cs index 21467ccda9..9f77f52949 100644 --- a/MediaBrowser.Server.Implementations/Session/SessionManager.cs +++ b/MediaBrowser.Server.Implementations/Session/SessionManager.cs @@ -14,6 +14,7 @@ using MediaBrowser.Controller.LiveTv; using MediaBrowser.Controller.Persistence; using MediaBrowser.Controller.Security; using MediaBrowser.Controller.Session; +using MediaBrowser.Model.Connect; using MediaBrowser.Model.Devices; using MediaBrowser.Model.Entities; using MediaBrowser.Model.Events; @@ -1243,7 +1244,14 @@ namespace MediaBrowser.Server.Implementations.Session public async Task AuthenticateNewSession(AuthenticationRequest request, bool isLocal) { - var result = (isLocal && string.Equals(request.App, "Dashboard", StringComparison.OrdinalIgnoreCase)) || + var user = _userManager.Users + .FirstOrDefault(i => string.Equals(request.Username, i.Name, StringComparison.OrdinalIgnoreCase)); + + var allowWithoutPassword = isLocal && + string.Equals(request.App, "Dashboard", StringComparison.OrdinalIgnoreCase) + && !(user != null && user.ConnectLinkType.HasValue && user.ConnectLinkType.Value == UserLinkType.Guest); + + var result = allowWithoutPassword || await _userManager.AuthenticateUser(request.Username, request.Password, request.RemoteEndPoint).ConfigureAwait(false); if (!result) @@ -1253,9 +1261,6 @@ namespace MediaBrowser.Server.Implementations.Session throw new AuthenticationException("Invalid user or password entered."); } - var user = _userManager.Users - .First(i => string.Equals(request.Username, i.Name, StringComparison.OrdinalIgnoreCase)); - var token = await GetAuthorizationToken(user.Id.ToString("N"), request.DeviceId, request.App, request.DeviceName).ConfigureAwait(false); EventHelper.FireEventIfNotNull(AuthenticationSucceeded, this, new GenericEventArgs(request), _logger); diff --git a/MediaBrowser.WebDashboard/Api/DashboardService.cs b/MediaBrowser.WebDashboard/Api/DashboardService.cs index 69bf1a0f38..1b8e21e201 100644 --- a/MediaBrowser.WebDashboard/Api/DashboardService.cs +++ b/MediaBrowser.WebDashboard/Api/DashboardService.cs @@ -483,13 +483,21 @@ namespace MediaBrowser.WebDashboard.Api var builder = new StringBuilder(); - using (var fs = _fileSystem.GetFileStream(GetDashboardResourcePath("thirdparty/mediabrowser.apiclient.js"), FileMode.Open, FileAccess.Read, FileShare.ReadWrite, true)) + foreach (var file in new[] { - using (var streamReader = new StreamReader(fs)) + "thirdparty/apiclient/sha1.js", + "thirdparty/apiclient/mediabrowser.apiclient.js", + "thirdparty/apiclient/connectionmanager.js" + }) + { + using (var fs = _fileSystem.GetFileStream(GetDashboardResourcePath(file), FileMode.Open, FileAccess.Read, FileShare.ReadWrite, true)) { - var text = await streamReader.ReadToEndAsync().ConfigureAwait(false); - builder.Append(text); - builder.Append(Environment.NewLine); + using (var streamReader = new StreamReader(fs)) + { + var text = await streamReader.ReadToEndAsync().ConfigureAwait(false); + builder.Append(text); + builder.Append(Environment.NewLine); + } } } @@ -668,7 +676,7 @@ namespace MediaBrowser.WebDashboard.Api "tvupcoming.js", "useredit.js", "userpassword.js", - "userimagepage.js", + "myprofile.js", "userprofilespage.js", "userparentalcontrol.js", "userlibraryaccess.js", diff --git a/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj b/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj index 5eb8a200e5..3f9ef8db7d 100644 --- a/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj +++ b/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj @@ -85,7 +85,7 @@ - + PreserveNewest @@ -898,6 +898,12 @@ PreserveNewest + + PreserveNewest + + + PreserveNewest + PreserveNewest @@ -1896,7 +1902,7 @@ - + PreserveNewest @@ -1952,7 +1958,7 @@ PreserveNewest - + PreserveNewest diff --git a/Nuget/MediaBrowser.Common.Internal.nuspec b/Nuget/MediaBrowser.Common.Internal.nuspec index a776cd0599..7591687ed3 100644 --- a/Nuget/MediaBrowser.Common.Internal.nuspec +++ b/Nuget/MediaBrowser.Common.Internal.nuspec @@ -2,7 +2,7 @@ MediaBrowser.Common.Internal - 3.0.486 + 3.0.487 MediaBrowser.Common.Internal Luke ebr,Luke,scottisafool @@ -12,7 +12,7 @@ Contains common components shared by Media Browser Theater and Media Browser Server. Not intended for plugin developer consumption. Copyright © Media Browser 2013 - + diff --git a/Nuget/MediaBrowser.Common.nuspec b/Nuget/MediaBrowser.Common.nuspec index faeb5b0cf1..c130fa9936 100644 --- a/Nuget/MediaBrowser.Common.nuspec +++ b/Nuget/MediaBrowser.Common.nuspec @@ -2,7 +2,7 @@ MediaBrowser.Common - 3.0.486 + 3.0.487 MediaBrowser.Common Media Browser Team ebr,Luke,scottisafool diff --git a/Nuget/MediaBrowser.Model.Signed.nuspec b/Nuget/MediaBrowser.Model.Signed.nuspec index b73d4a80f7..9e4971e1f7 100644 --- a/Nuget/MediaBrowser.Model.Signed.nuspec +++ b/Nuget/MediaBrowser.Model.Signed.nuspec @@ -2,7 +2,7 @@ MediaBrowser.Model.Signed - 3.0.486 + 3.0.487 MediaBrowser.Model - Signed Edition Media Browser Team ebr,Luke,scottisafool diff --git a/Nuget/MediaBrowser.Server.Core.nuspec b/Nuget/MediaBrowser.Server.Core.nuspec index fa1a9aa62e..d9cbadb18a 100644 --- a/Nuget/MediaBrowser.Server.Core.nuspec +++ b/Nuget/MediaBrowser.Server.Core.nuspec @@ -2,7 +2,7 @@ MediaBrowser.Server.Core - 3.0.486 + 3.0.487 Media Browser.Server.Core Media Browser Team ebr,Luke,scottisafool @@ -12,7 +12,7 @@ Contains core components required to build plugins for Media Browser Server. Copyright © Media Browser 2013 - +