move user image into profile settings

pull/702/head
Luke Pulverenti 10 years ago
parent b889c31f56
commit 6ca771cc79

@ -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>
{

@ -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('.');

@ -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();

@ -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();
}

@ -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

@ -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; }

@ -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
{

@ -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;
}
}
}

@ -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;
}
}

@ -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)

@ -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" />

@ -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>

@ -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>

@ -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>

@ -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
}
}

@ -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; }
}
}

@ -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" />

@ -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;
}
}
}
}

@ -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);
}

@ -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

@ -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."
}

@ -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."
}

@ -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."
}

@ -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."
}

@ -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."
}

@ -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."
}

@ -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."
}

@ -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."
}

@ -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."
}

@ -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"
}

@ -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."
}

@ -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."
}

@ -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."
}

@ -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."
}

@ -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."
}

@ -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."
}

@ -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."
}

@ -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."
}

@ -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."
}

@ -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."
}

@ -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."
}

@ -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."
}

@ -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."
}

@ -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."
}

@ -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."
}

@ -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."
}

@ -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",

@ -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",

@ -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",

@ -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",

@ -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",

@ -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",

@ -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",

@ -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",

@ -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",

@ -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",

@ -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",

@ -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",

@ -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",

@ -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",

@ -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",

@ -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",

@ -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",

@ -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",

@ -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",

@ -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",

@ -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",

@ -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",

@ -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",

@ -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"
}

@ -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",

@ -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",

@ -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",

@ -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",

@ -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);

@ -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",

@ -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">

@ -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" />

@ -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>

@ -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>

@ -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>

Loading…
Cancel
Save