diff options
| author | Luke Pulverenti <luke.pulverenti@gmail.com> | 2014-10-15 23:26:39 -0400 |
|---|---|---|
| committer | Luke Pulverenti <luke.pulverenti@gmail.com> | 2014-10-15 23:26:39 -0400 |
| commit | 6ca771cc7906ae6524f737ae9bf0bc1b916efb40 (patch) | |
| tree | 98d4c8fad6868d0836caec61446f2cffc4a232f8 | |
| parent | b889c31f5629b0d46fdd8f71d62f1546e18efc11 (diff) | |
move user image into profile settings
81 files changed, 886 insertions, 219 deletions
diff --git a/MediaBrowser.Api/LiveTv/LiveTvService.cs b/MediaBrowser.Api/LiveTv/LiveTvService.cs index 377decc4c..906c0d830 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 { + /// <summary> + /// This is insecure right now to avoid windows phone refactoring + /// </summary> [Route("/LiveTv/Info", "GET", Summary = "Gets available live tv services.")] public class GetLiveTvInfo : IReturn<LiveTvInfo> { diff --git a/MediaBrowser.Api/Playback/BaseStreamingService.cs b/MediaBrowser.Api/Playback/BaseStreamingService.cs index 919e51ecc..dccf459eb 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. /// </summary> /// <returns>System.Int32.</returns> - /// <exception cref="System.Exception">Unrecognized MediaEncodingQuality value.</exception> 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 /// <param name="state">The state.</param> /// <param name="outputPath">The output path.</param> /// <param name="cancellationTokenSource">The cancellation token source.</param> + /// <param name="workingDirectory">The working directory.</param> /// <returns>Task.</returns> - /// <exception cref="System.InvalidOperationException">ffmpeg was not found at + MediaEncoder.EncoderPath</exception> - protected async Task<TranscodingJob> StartFfMpeg(StreamState state, string outputPath, CancellationTokenSource cancellationTokenSource) + protected async Task<TranscodingJob> 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<MediaStream>(); - 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 4af94aeeb..613039d23 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<string, string>()); } - /// <summary> - /// Gets the segment wait. - /// </summary> - /// <returns>System.Int32.</returns> - 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 aa28ee90a..b41686cb6 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 baa623380..7135d9b84 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 { /// <summary> @@ -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("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"); + + 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( - "<MPD xmlns=\"urn:mpeg:dash:schema:mpd:2011\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"urn:mpeg:dash:schema:mpd:2011 http://standards.iso.org/ittf/PubliclyAvailableStandards/MPEG-DASH_schema_files/DASH-MPD.xsd\" minBufferTime=\"PT2.00S\" mediaPresentationDuration=\"{0}\" maxSegmentDuration=\"PT{1}S\" type=\"static\" profiles=\"urn:mpeg:dash:profile:mp2t-simple:2011\">", + "<MPD xmlns=\"urn:mpeg:dash:schema:mpd:2011\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"urn:mpeg:dash:schema:mpd:2011 http://standards.iso.org/ittf/PubliclyAvailableStandards/MPEG-DASH_schema_files/DASH-MPD.xsd\" minBufferTime=\"PT2.00S\" mediaPresentationDuration=\"{0}\" maxSegmentDuration=\"PT{1}S\" type=\"static\" profiles=\""+profile+"\">", duration, state.SegmentLength.ToString(CultureInfo.InvariantCulture)); @@ -143,7 +149,11 @@ namespace MediaBrowser.Api.Playback.Hls { var codecs = GetVideoCodecDescriptor(state) + "," + GetAudioCodecDescriptor(state); - var xml = "<Representation id=\"1\" mimeType=\"video/mp2t\" startWithSAP=\"1\" codecs=\"" + codecs + "\""; + var mime = string.Equals(GetSegmentFileExtension(state), ".ts", StringComparison.OrdinalIgnoreCase) + ? "video/mp2t" + : "video/mp4"; + + var xml = "<Representation id=\"1\" mimeType=\"" + mime + "\" startWithSAP=\"1\" codecs=\"" + codecs + "\""; if (state.OutputWidth.HasValue) { @@ -171,6 +181,7 @@ namespace MediaBrowser.Api.Playback.Hls private string GetVideoCodecDescriptor(StreamState state) { // https://developer.apple.com/library/ios/documentation/networkinginternet/conceptual/streamingmediaguide/FrequentlyAskedQuestions/FrequentlyAskedQuestions.html + // http://www.chipwreck.de/blog/2010/02/25/html-5-video-tag-and-attributes/ var level = state.TargetVideoLevel ?? 0; var profile = state.TargetVideoProfile ?? string.Empty; @@ -210,7 +221,7 @@ namespace MediaBrowser.Api.Playback.Hls return "avc1.42001f"; } - return "avc1.42001e"; + return "avc1.42E01E"; } private string GetAudioCodecDescriptor(StreamState state) @@ -234,11 +245,13 @@ namespace MediaBrowser.Api.Playback.Hls public object Get(GetDashSegment request) { - return null; + return GetDynamicSegment(request, request.SegmentId).Result; } private void AppendSegmentList(StreamState state, StringBuilder builder) { + var extension = GetSegmentFileExtension(state); + var seconds = TimeSpan.FromTicks(state.RunTimeTicks ?? 0).TotalSeconds; var queryStringIndex = Request.RawUrl.IndexOf('?'); @@ -247,11 +260,22 @@ namespace MediaBrowser.Api.Playback.Hls var index = 0; builder.Append("<SegmentList timescale=\"1000\" duration=\"10000\">"); + 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 media=\"{0}\"/>", segmentUrl); + if (index == 0) + { + builder.AppendFormat("<Initialization sourceURL=\"{0}\"/>", segmentUrl); + } + else + { + builder.AppendFormat("<SegmentURL media=\"{0}\"/>", segmentUrl); + } seconds -= state.SegmentLength; index++; @@ -259,6 +283,274 @@ namespace MediaBrowser.Api.Playback.Hls builder.Append("</SegmentList>"); } + private async Task<object> 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<object> 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 /// <returns>System.String.</returns> 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 dd5065e53..de803037d 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 a30ecf7d6..01111a998 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 000000000..80ba206cc --- /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<DayOfWeek> GetDaysOfWeek(DynamicDayOfWeek day) + { + return GetDaysOfWeek(new List<DynamicDayOfWeek> { day }); + } + + public static List<DayOfWeek> GetDaysOfWeek(List<DynamicDayOfWeek> days) + { + var list = new List<DayOfWeek>(); + + 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 b95c7df9c..87074ca02 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<Season>(); } + get + { + var season = FindParent<Season>(); + + // Episodes directly in series folder + if (season == null) + { + var series = FindParent<Series>(); + + if (ParentIndexNumber.HasValue) + { + var findNumber = ParentIndexNumber.Value; + + season = series.Children + .OfType<Season>() + .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<Season>() - .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 6ba8701f7..5d1a21387 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 7039a00eb..7e2892c6e 100644 --- a/MediaBrowser.Controller/MediaBrowser.Controller.csproj +++ b/MediaBrowser.Controller/MediaBrowser.Controller.csproj @@ -123,6 +123,7 @@ <Compile Include="Entities\Book.cs" /> <Compile Include="Configuration\IServerConfigurationManager.cs" /> <Compile Include="Entities\Audio\MusicGenre.cs" /> + <Compile Include="Entities\DayOfWeekHelper.cs" /> <Compile Include="Entities\Extensions.cs" /> <Compile Include="Entities\Game.cs" /> <Compile Include="Entities\GameGenre.cs" /> diff --git a/MediaBrowser.Model.Portable/MediaBrowser.Model.Portable.csproj b/MediaBrowser.Model.Portable/MediaBrowser.Model.Portable.csproj index 3a62522c6..0217c2dc7 100644 --- a/MediaBrowser.Model.Portable/MediaBrowser.Model.Portable.csproj +++ b/MediaBrowser.Model.Portable/MediaBrowser.Model.Portable.csproj @@ -173,6 +173,9 @@ <Compile Include="..\MediaBrowser.Model\Configuration\DlnaOptions.cs"> <Link>Configuration\DlnaOptions.cs</Link> </Compile> + <Compile Include="..\MediaBrowser.Model\Configuration\DynamicDayOfWeek.cs"> + <Link>Configuration\DynamicDayOfWeek.cs</Link> + </Compile> <Compile Include="..\MediaBrowser.Model\Configuration\EncodingQuality.cs"> <Link>Configuration\EncodingQuality.cs</Link> </Compile> @@ -230,6 +233,9 @@ <Compile Include="..\MediaBrowser.Model\Connect\ConnectUserQuery.cs"> <Link>Connect\ConnectUserQuery.cs</Link> </Compile> + <Compile Include="..\MediaBrowser.Model\Connect\ConnectUserServer.cs"> + <Link>Connect\ConnectUserServer.cs</Link> + </Compile> <Compile Include="..\MediaBrowser.Model\Connect\PinCreationResult.cs"> <Link>Connect\PinCreationResult.cs</Link> </Compile> diff --git a/MediaBrowser.Model.net35/MediaBrowser.Model.net35.csproj b/MediaBrowser.Model.net35/MediaBrowser.Model.net35.csproj index c7b3b5ed2..4fc9f479e 100644 --- a/MediaBrowser.Model.net35/MediaBrowser.Model.net35.csproj +++ b/MediaBrowser.Model.net35/MediaBrowser.Model.net35.csproj @@ -139,6 +139,9 @@ <Compile Include="..\MediaBrowser.Model\Configuration\DlnaOptions.cs"> <Link>Configuration\DlnaOptions.cs</Link> </Compile> + <Compile Include="..\MediaBrowser.Model\Configuration\DynamicDayOfWeek.cs"> + <Link>Configuration\DynamicDayOfWeek.cs</Link> + </Compile> <Compile Include="..\MediaBrowser.Model\Configuration\EncodingQuality.cs"> <Link>Configuration\EncodingQuality.cs</Link> </Compile> @@ -196,6 +199,9 @@ <Compile Include="..\MediaBrowser.Model\Connect\ConnectUserQuery.cs"> <Link>Connect\ConnectUserQuery.cs</Link> </Compile> + <Compile Include="..\MediaBrowser.Model\Connect\ConnectUserServer.cs"> + <Link>Connect\ConnectUserServer.cs</Link> + </Compile> <Compile Include="..\MediaBrowser.Model\Connect\PinCreationResult.cs"> <Link>Connect\PinCreationResult.cs</Link> </Compile> diff --git a/MediaBrowser.Model/Configuration/AccessSchedule.cs b/MediaBrowser.Model/Configuration/AccessSchedule.cs index 65f2f6291..3a66cf5bb 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. /// </summary> /// <value>The day of week.</value> - public DayOfWeek DayOfWeek { get; set; } + public DynamicDayOfWeek DayOfWeek { get; set; } /// <summary> /// Gets or sets the start hour. /// </summary> diff --git a/MediaBrowser.Model/Configuration/DynamicDayOfWeek.cs b/MediaBrowser.Model/Configuration/DynamicDayOfWeek.cs new file mode 100644 index 000000000..1c7de11fd --- /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 000000000..6214633d8 --- /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 470b1dcaf..80c125933 100644 --- a/MediaBrowser.Model/MediaBrowser.Model.csproj +++ b/MediaBrowser.Model/MediaBrowser.Model.csproj @@ -101,6 +101,7 @@ <Compile Include="Connect\ConnectAuthorization.cs" /> <Compile Include="Connect\ConnectUser.cs" /> <Compile Include="Connect\ConnectUserQuery.cs" /> + <Compile Include="Connect\ConnectUserServer.cs" /> <Compile Include="Connect\PinCreationResult.cs" /> <Compile Include="Connect\PinExchangeResult.cs" /> <Compile Include="Connect\PinStatusResult.cs" /> @@ -121,6 +122,7 @@ <Compile Include="Dto\MediaSourceType.cs" /> <Compile Include="Dto\StreamOptions.cs" /> <Compile Include="Dto\VideoStreamOptions.cs" /> + <Compile Include="Configuration\DynamicDayOfWeek.cs" /> <Compile Include="Entities\ExtraType.cs" /> <Compile Include="Entities\SupporterInfo.cs" /> <Compile Include="Entities\TrailerType.cs" /> diff --git a/MediaBrowser.Providers/Movies/MovieMetadataService.cs b/MediaBrowser.Providers/Movies/MovieMetadataService.cs index abddb5f16..af9970b69 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<MetadataFields> 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 2a006b677..e3d4b600c 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<string, string> { {"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<ConnectAuthorization>(); 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 bb52fe35e..163ad943e 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. /// </summary> /// <param name="name">The name.</param> + /// <param name="checkId">if set to <c>true</c> [check identifier].</param> /// <returns>User.</returns> - 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 a94b7166f..f612bfd74 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 9476331c9..99518b1ca 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 cdbc0bcee..71a26ba3c 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 a278ca45e..8a19230ca 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 c0abc5a55..5fbb82a4d 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 f8d1bb7b5..aac19bcf7 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 9e9bee689..9696ada9b 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 6cfaee2ac..d63cfa1fe 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 a612e763f..085fe1315 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 357224698..e0e75beca 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 b992a7465..ecbe00904 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 c58396282..5deeb6bb1 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 c454b254a..adb126364 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 3dab6c474..4c58055a2 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 70f8fd0f2..78be468eb 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 b378e6b87..b65ab3700 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 1047bc38a..83a18459f 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 e18a3475c..4d01b890b 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 2055dd0a5..cb449c3c6 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 e50f69c56..1dd5ee074 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 68ef481e1..0f234b088 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 8cdc61cc9..36789f57d 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 f5d2dc62d..fa6353069 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 ec43032bd..cc987bcad 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 643f7140c..fafdcf33c 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 6994beb1f..ace114c8d 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 74854f075..a0094c5b2 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 49a93e00b..2efa7c461 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 19ad31c6d..ae340a34c 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 74f2e050b..174ef2c63 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 728f7acc9..2daba2c55 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 130b9f3b2..6815f46af 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 0a2d7c3e6..363f7b7ed 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 88ef2b80e..a7640ef00 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 5dc9cab69..4bbd3ebb9 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 879b2ff77..1cb870fb8 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 9520ca45f..13c682233 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 2a01876b7..e949d74ae 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 c76c3cf4e..23142b377 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 30eaa6c4f..ce2687307 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 e9eaafc58..2237c9292 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 cf7cb0795..2e94e5014 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 d04dd58aa..783928c6c 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 aa8a1fd04..3eb8bca50 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 147237137..335cb790b 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 752185288..cbd5fca36 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 32148cd7f..f129aaa26 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 723c3b984..e0f5e1eb9 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 64b166124..039f057f9 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 2a56037b3..07faaf884 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 53874af25..206a54b33 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 de67f6957..5fa3a8b92 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 e55b66bed..f8cb6828c 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 57cebb71f..d6200fc0d 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 21467ccda..9f77f5294 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<AuthenticationResult> 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<AuthenticationRequest>(request), _logger); diff --git a/MediaBrowser.WebDashboard/Api/DashboardService.cs b/MediaBrowser.WebDashboard/Api/DashboardService.cs index 69bf1a0f3..1b8e21e20 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 5eb8a200e..3f9ef8db7 100644 --- a/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj +++ b/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj @@ -85,7 +85,7 @@ </ProjectReference>
</ItemGroup>
<ItemGroup>
- <EmbeddedResource Include="dashboard-ui\thirdparty\mediabrowser.apiclient.js">
+ <EmbeddedResource Include="dashboard-ui\thirdparty\apiclient\mediabrowser.apiclient.js">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</EmbeddedResource>
<Content Include="dashboard-ui\channelitems.html">
@@ -898,6 +898,12 @@ <Content Include="dashboard-ui\serversecurity.html">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
+ <Content Include="dashboard-ui\thirdparty\apiclient\connectionmanager.js">
+ <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+ </Content>
+ <Content Include="dashboard-ui\thirdparty\apiclient\sha1.js">
+ <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+ </Content>
<Content Include="dashboard-ui\thirdparty\cast_sender.js">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
@@ -1896,7 +1902,7 @@ </Content>
</ItemGroup>
<ItemGroup>
- <Content Include="dashboard-ui\userimage.html">
+ <Content Include="dashboard-ui\myprofile.html">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
</ItemGroup>
@@ -1952,7 +1958,7 @@ <Content Include="dashboard-ui\scripts\useredit.js">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
- <Content Include="dashboard-ui\scripts\userimagepage.js">
+ <Content Include="dashboard-ui\scripts\myprofile.js">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="dashboard-ui\scripts\userprofilespage.js">
diff --git a/Nuget/MediaBrowser.Common.Internal.nuspec b/Nuget/MediaBrowser.Common.Internal.nuspec index a776cd059..7591687ed 100644 --- a/Nuget/MediaBrowser.Common.Internal.nuspec +++ b/Nuget/MediaBrowser.Common.Internal.nuspec @@ -2,7 +2,7 @@ <package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd"> <metadata> <id>MediaBrowser.Common.Internal</id> - <version>3.0.486</version> + <version>3.0.487</version> <title>MediaBrowser.Common.Internal</title> <authors>Luke</authors> <owners>ebr,Luke,scottisafool</owners> @@ -12,7 +12,7 @@ <description>Contains common components shared by Media Browser Theater and Media Browser Server. Not intended for plugin developer consumption.</description> <copyright>Copyright © Media Browser 2013</copyright> <dependencies> - <dependency id="MediaBrowser.Common" version="3.0.486" /> + <dependency id="MediaBrowser.Common" version="3.0.487" /> <dependency id="NLog" version="3.1.0.0" /> <dependency id="SimpleInjector" version="2.5.2" /> <dependency id="sharpcompress" version="0.10.2" /> diff --git a/Nuget/MediaBrowser.Common.nuspec b/Nuget/MediaBrowser.Common.nuspec index faeb5b0cf..c130fa993 100644 --- a/Nuget/MediaBrowser.Common.nuspec +++ b/Nuget/MediaBrowser.Common.nuspec @@ -2,7 +2,7 @@ <package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd"> <metadata> <id>MediaBrowser.Common</id> - <version>3.0.486</version> + <version>3.0.487</version> <title>MediaBrowser.Common</title> <authors>Media Browser Team</authors> <owners>ebr,Luke,scottisafool</owners> diff --git a/Nuget/MediaBrowser.Model.Signed.nuspec b/Nuget/MediaBrowser.Model.Signed.nuspec index b73d4a80f..9e4971e1f 100644 --- a/Nuget/MediaBrowser.Model.Signed.nuspec +++ b/Nuget/MediaBrowser.Model.Signed.nuspec @@ -2,7 +2,7 @@ <package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd"> <metadata> <id>MediaBrowser.Model.Signed</id> - <version>3.0.486</version> + <version>3.0.487</version> <title>MediaBrowser.Model - Signed Edition</title> <authors>Media Browser Team</authors> <owners>ebr,Luke,scottisafool</owners> diff --git a/Nuget/MediaBrowser.Server.Core.nuspec b/Nuget/MediaBrowser.Server.Core.nuspec index fa1a9aa62..d9cbadb18 100644 --- a/Nuget/MediaBrowser.Server.Core.nuspec +++ b/Nuget/MediaBrowser.Server.Core.nuspec @@ -2,7 +2,7 @@ <package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd"> <metadata> <id>MediaBrowser.Server.Core</id> - <version>3.0.486</version> + <version>3.0.487</version> <title>Media Browser.Server.Core</title> <authors>Media Browser Team</authors> <owners>ebr,Luke,scottisafool</owners> @@ -12,7 +12,7 @@ <description>Contains core components required to build plugins for Media Browser Server.</description> <copyright>Copyright © Media Browser 2013</copyright> <dependencies> - <dependency id="MediaBrowser.Common" version="3.0.486" /> + <dependency id="MediaBrowser.Common" version="3.0.487" /> </dependencies> </metadata> <files> |
