mirror of
https://github.com/jellyfin/jellyfin.git
synced 2024-11-16 02:18:54 -07:00
Merge branch 'master' of https://github.com/MediaBrowser/MediaBrowser
This commit is contained in:
commit
f9eede391b
@ -319,7 +319,7 @@ namespace MediaBrowser.Api.Playback
|
||||
{
|
||||
var param = string.Empty;
|
||||
|
||||
var isVc1 = state.VideoStream != null &&
|
||||
var isVc1 = state.VideoStream != null &&
|
||||
string.Equals(state.VideoStream.Codec, "vc1", StringComparison.OrdinalIgnoreCase);
|
||||
|
||||
var qualitySetting = GetQualitySetting();
|
||||
@ -438,9 +438,12 @@ namespace MediaBrowser.Api.Playback
|
||||
var channels = GetNumAudioChannelsParam(state.Request, state.AudioStream);
|
||||
|
||||
// Boost volume to 200% when downsampling from 6ch to 2ch
|
||||
if (channels.HasValue && channels.Value <= 2 && state.AudioStream.Channels.HasValue && state.AudioStream.Channels.Value > 5)
|
||||
if (channels.HasValue && channels.Value <= 2)
|
||||
{
|
||||
volParam = ",volume=2.000000";
|
||||
if (state.AudioStream != null && state.AudioStream.Channels.HasValue && state.AudioStream.Channels.Value > 5)
|
||||
{
|
||||
volParam = ",volume=2.000000";
|
||||
}
|
||||
}
|
||||
|
||||
if (state.Request.AudioSampleRate.HasValue)
|
||||
@ -916,7 +919,7 @@ namespace MediaBrowser.Api.Playback
|
||||
var commandLineLogMessage = process.StartInfo.FileName + " " + process.StartInfo.Arguments;
|
||||
Logger.Info(commandLineLogMessage);
|
||||
|
||||
var logFilePath = Path.Combine(ServerConfigurationManager.ApplicationPaths.LogDirectoryPath, "ffmpeg-" + Guid.NewGuid() + ".txt");
|
||||
var logFilePath = Path.Combine(ServerConfigurationManager.ApplicationPaths.LogDirectoryPath, "transcode-" + Guid.NewGuid() + ".txt");
|
||||
Directory.CreateDirectory(Path.GetDirectoryName(logFilePath));
|
||||
|
||||
// FFMpeg writes debug/error info to stderr. This is useful when debugging so let's put it in the log directory.
|
||||
@ -1482,17 +1485,14 @@ namespace MediaBrowser.Api.Playback
|
||||
|
||||
ApplyDeviceProfileSettings(state);
|
||||
|
||||
if (videoRequest != null && state.VideoStream != null)
|
||||
if (videoRequest != null)
|
||||
{
|
||||
if (CanStreamCopyVideo(videoRequest, state.VideoStream, state.VideoType))
|
||||
if (state.VideoStream != null && CanStreamCopyVideo(videoRequest, state.VideoStream, state.VideoType))
|
||||
{
|
||||
videoRequest.VideoCodec = "copy";
|
||||
}
|
||||
}
|
||||
|
||||
if (state.AudioStream != null)
|
||||
{
|
||||
//if (CanStreamCopyAudio(request, state.AudioStream))
|
||||
//if (state.AudioStream != null && CanStreamCopyAudio(request, state.AudioStream))
|
||||
//{
|
||||
// request.AudioCodec = "copy";
|
||||
//}
|
||||
@ -1625,7 +1625,7 @@ namespace MediaBrowser.Api.Playback
|
||||
|
||||
return SupportsAutomaticVideoStreamCopy;
|
||||
}
|
||||
|
||||
|
||||
protected virtual bool SupportsAutomaticVideoStreamCopy
|
||||
{
|
||||
get
|
||||
|
@ -186,7 +186,7 @@ namespace MediaBrowser.Api.Playback.Progressive
|
||||
private string GetAudioArguments(StreamState state)
|
||||
{
|
||||
// If the video doesn't have an audio stream, return a default.
|
||||
if (state.AudioStream == null)
|
||||
if (state.AudioStream == null && state.HasMediaStreams)
|
||||
{
|
||||
return string.Empty;
|
||||
}
|
||||
|
@ -110,11 +110,11 @@ namespace MediaBrowser.Api
|
||||
{
|
||||
link.PrimaryVersionId = null;
|
||||
|
||||
await link.UpdateToRepository(ItemUpdateType.MetadataEdit, CancellationToken.None).ConfigureAwait(false);
|
||||
await link.UpdateToRepository(ItemUpdateType.MetadataDownload, CancellationToken.None).ConfigureAwait(false);
|
||||
}
|
||||
|
||||
video.LinkedAlternateVersions.Clear();
|
||||
await video.UpdateToRepository(ItemUpdateType.MetadataEdit, CancellationToken.None).ConfigureAwait(false);
|
||||
await video.UpdateToRepository(ItemUpdateType.MetadataDownload, CancellationToken.None).ConfigureAwait(false);
|
||||
}
|
||||
|
||||
public void Post(MergeVersions request)
|
||||
@ -182,7 +182,7 @@ namespace MediaBrowser.Api
|
||||
{
|
||||
item.PrimaryVersionId = primaryVersion.Id;
|
||||
|
||||
await item.UpdateToRepository(ItemUpdateType.MetadataEdit, CancellationToken.None).ConfigureAwait(false);
|
||||
await item.UpdateToRepository(ItemUpdateType.MetadataDownload, CancellationToken.None).ConfigureAwait(false);
|
||||
|
||||
primaryVersion.LinkedAlternateVersions.Add(new LinkedChild
|
||||
{
|
||||
@ -191,7 +191,7 @@ namespace MediaBrowser.Api
|
||||
});
|
||||
}
|
||||
|
||||
await primaryVersion.UpdateToRepository(ItemUpdateType.MetadataEdit, CancellationToken.None).ConfigureAwait(false);
|
||||
await primaryVersion.UpdateToRepository(ItemUpdateType.MetadataDownload, CancellationToken.None).ConfigureAwait(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -113,11 +113,11 @@ namespace MediaBrowser.Common.Implementations.HttpClientManager
|
||||
AddRequestHeaders(request, options);
|
||||
|
||||
request.AutomaticDecompression = enableHttpCompression ? DecompressionMethods.Deflate : DecompressionMethods.None;
|
||||
|
||||
|
||||
request.CachePolicy = options.CachePolicy == Net.HttpRequestCachePolicy.None ?
|
||||
new RequestCachePolicy(RequestCacheLevel.BypassCache) :
|
||||
new RequestCachePolicy(RequestCacheLevel.Revalidate);
|
||||
|
||||
|
||||
request.ConnectionGroupName = GetHostFromUrl(options.Url);
|
||||
request.KeepAlive = true;
|
||||
request.Method = method;
|
||||
@ -162,8 +162,6 @@ namespace MediaBrowser.Common.Implementations.HttpClientManager
|
||||
/// </summary>
|
||||
/// <param name="options">The options.</param>
|
||||
/// <returns>Task{HttpResponseInfo}.</returns>
|
||||
/// <exception cref="HttpException">
|
||||
/// </exception>
|
||||
public Task<HttpResponseInfo> GetResponse(HttpRequestOptions options)
|
||||
{
|
||||
return SendAsync(options, "GET");
|
||||
@ -174,8 +172,6 @@ namespace MediaBrowser.Common.Implementations.HttpClientManager
|
||||
/// </summary>
|
||||
/// <param name="options">The options.</param>
|
||||
/// <returns>Task{Stream}.</returns>
|
||||
/// <exception cref="HttpException"></exception>
|
||||
/// <exception cref="MediaBrowser.Model.Net.HttpException"></exception>
|
||||
public async Task<Stream> Get(HttpRequestOptions options)
|
||||
{
|
||||
var response = await GetResponse(options).ConfigureAwait(false);
|
||||
@ -274,18 +270,18 @@ namespace MediaBrowser.Common.Implementations.HttpClientManager
|
||||
|
||||
var httpResponse = (HttpWebResponse)response;
|
||||
|
||||
EnsureSuccessStatusCode(httpResponse);
|
||||
EnsureSuccessStatusCode(httpResponse, options);
|
||||
|
||||
options.CancellationToken.ThrowIfCancellationRequested();
|
||||
|
||||
return GetResponseInfo(httpResponse, httpResponse.GetResponseStream(), GetContentLength(httpResponse));
|
||||
}
|
||||
|
||||
|
||||
using (var response = await httpWebRequest.GetResponseAsync().ConfigureAwait(false))
|
||||
{
|
||||
var httpResponse = (HttpWebResponse)response;
|
||||
|
||||
EnsureSuccessStatusCode(httpResponse);
|
||||
EnsureSuccessStatusCode(httpResponse, options);
|
||||
|
||||
options.CancellationToken.ThrowIfCancellationRequested();
|
||||
|
||||
@ -322,9 +318,7 @@ namespace MediaBrowser.Common.Implementations.HttpClientManager
|
||||
}
|
||||
catch (WebException ex)
|
||||
{
|
||||
_logger.ErrorException("Error getting response from " + options.Url, ex);
|
||||
|
||||
throw new HttpException(ex.Message, ex);
|
||||
throw GetException(ex, options);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
@ -341,6 +335,19 @@ namespace MediaBrowser.Common.Implementations.HttpClientManager
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the exception.
|
||||
/// </summary>
|
||||
/// <param name="ex">The ex.</param>
|
||||
/// <param name="options">The options.</param>
|
||||
/// <returns>HttpException.</returns>
|
||||
private HttpException GetException(WebException ex, HttpRequestOptions options)
|
||||
{
|
||||
_logger.ErrorException("Error getting response from " + options.Url, ex);
|
||||
|
||||
return new HttpException(ex.Message, ex);
|
||||
}
|
||||
|
||||
private HttpResponseInfo GetResponseInfo(HttpWebResponse httpResponse, Stream content, long? contentLength)
|
||||
{
|
||||
return new HttpResponseInfo
|
||||
@ -384,10 +391,6 @@ namespace MediaBrowser.Common.Implementations.HttpClientManager
|
||||
/// <param name="options">The options.</param>
|
||||
/// <param name="postData">Params to add to the POST data.</param>
|
||||
/// <returns>stream on success, null on failure</returns>
|
||||
/// <exception cref="HttpException">
|
||||
/// </exception>
|
||||
/// <exception cref="System.ArgumentNullException">postData</exception>
|
||||
/// <exception cref="MediaBrowser.Model.Net.HttpException"></exception>
|
||||
public async Task<Stream> Post(HttpRequestOptions options, Dictionary<string, string> postData)
|
||||
{
|
||||
var strings = postData.Keys.Select(key => string.Format("{0}={1}", key, postData[key]));
|
||||
@ -426,8 +429,6 @@ namespace MediaBrowser.Common.Implementations.HttpClientManager
|
||||
/// <param name="options">The options.</param>
|
||||
/// <returns>Task{System.String}.</returns>
|
||||
/// <exception cref="System.ArgumentNullException">progress</exception>
|
||||
/// <exception cref="HttpException"></exception>
|
||||
/// <exception cref="MediaBrowser.Model.Net.HttpException"></exception>
|
||||
public async Task<string> GetTempFile(HttpRequestOptions options)
|
||||
{
|
||||
var response = await GetTempFileResponse(options).ConfigureAwait(false);
|
||||
@ -472,7 +473,7 @@ namespace MediaBrowser.Common.Implementations.HttpClientManager
|
||||
{
|
||||
var httpResponse = (HttpWebResponse)response;
|
||||
|
||||
EnsureSuccessStatusCode(httpResponse);
|
||||
EnsureSuccessStatusCode(httpResponse, options);
|
||||
|
||||
options.CancellationToken.ThrowIfCancellationRequested();
|
||||
|
||||
@ -580,7 +581,7 @@ namespace MediaBrowser.Common.Implementations.HttpClientManager
|
||||
|
||||
if (webException != null)
|
||||
{
|
||||
return new HttpException(ex.Message, ex);
|
||||
throw GetException(webException, options);
|
||||
}
|
||||
|
||||
return ex;
|
||||
@ -662,13 +663,35 @@ namespace MediaBrowser.Common.Implementations.HttpClientManager
|
||||
return exception;
|
||||
}
|
||||
|
||||
private void EnsureSuccessStatusCode(HttpWebResponse response)
|
||||
private void EnsureSuccessStatusCode(HttpWebResponse response, HttpRequestOptions options)
|
||||
{
|
||||
var statusCode = response.StatusCode;
|
||||
var isSuccessful = statusCode >= HttpStatusCode.OK && statusCode <= (HttpStatusCode)299;
|
||||
|
||||
if (!isSuccessful)
|
||||
{
|
||||
if (options.LogErrorResponseBody)
|
||||
{
|
||||
try
|
||||
{
|
||||
using (var stream = response.GetResponseStream())
|
||||
{
|
||||
if (stream != null)
|
||||
{
|
||||
using (var reader = new StreamReader(stream))
|
||||
{
|
||||
var msg = reader.ReadToEnd();
|
||||
|
||||
_logger.Error(msg);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
throw new HttpException(response.StatusDescription) { StatusCode = response.StatusCode };
|
||||
}
|
||||
}
|
||||
|
@ -184,7 +184,7 @@ namespace MediaBrowser.Common.Implementations.Logging
|
||||
/// <param name="level">The level.</param>
|
||||
public void ReloadLogger(LogSeverity level)
|
||||
{
|
||||
LogFilePath = Path.Combine(LogDirectory, LogFilePrefix + "-" + decimal.Round(DateTime.Now.Ticks / 10000000) + ".log");
|
||||
LogFilePath = Path.Combine(LogDirectory, LogFilePrefix + "-" + decimal.Round(DateTime.Now.Ticks / 10000000) + ".txt");
|
||||
|
||||
Directory.CreateDirectory(Path.GetDirectoryName(LogFilePath));
|
||||
|
||||
|
@ -73,6 +73,8 @@ namespace MediaBrowser.Common.Net
|
||||
public bool BufferContent { get; set; }
|
||||
|
||||
public bool LogRequest { get; set; }
|
||||
|
||||
public bool LogErrorResponseBody { get; set; }
|
||||
|
||||
public HttpRequestCachePolicy CachePolicy { get; set; }
|
||||
|
||||
|
@ -406,7 +406,7 @@ namespace MediaBrowser.Controller.Entities
|
||||
item.Genres = Genres;
|
||||
item.ProviderIds = ProviderIds;
|
||||
|
||||
await item.UpdateToRepository(ItemUpdateType.MetadataEdit, cancellationToken).ConfigureAwait(false);
|
||||
await item.UpdateToRepository(ItemUpdateType.MetadataDownload, cancellationToken).ConfigureAwait(false);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -476,7 +476,7 @@ namespace MediaBrowser.Dlna.PlayTo
|
||||
if (service == null)
|
||||
return;
|
||||
|
||||
var result = await new SsdpHttpClient(_httpClient, _config).SendCommandAsync(Properties.BaseUrl, service, command.Name, RendererCommands.BuildPost(command, service.ServiceType))
|
||||
var result = await new SsdpHttpClient(_httpClient, _config).SendCommandAsync(Properties.BaseUrl, service, command.Name, AvCommands.BuildPost(command, service.ServiceType))
|
||||
.ConfigureAwait(false);
|
||||
|
||||
if (result == null || result.Document == null)
|
||||
@ -575,7 +575,26 @@ namespace MediaBrowser.Dlna.PlayTo
|
||||
return false;
|
||||
}
|
||||
|
||||
var e = track.Element(uPnpNamespaces.items) ?? track;
|
||||
var trackString = (string) track;
|
||||
|
||||
if (string.IsNullOrWhiteSpace(trackString) || string.Equals(trackString, "NOT_IMPLEMENTED", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
XElement uPnpResponse;
|
||||
|
||||
try
|
||||
{
|
||||
uPnpResponse = XElement.Parse(trackString);
|
||||
}
|
||||
catch
|
||||
{
|
||||
_logger.Error("Unable to parse xml {0}", trackString);
|
||||
return false;
|
||||
}
|
||||
|
||||
var e = uPnpResponse.Element(uPnpNamespaces.items);
|
||||
|
||||
var uTrack = CreateUBaseObject(e);
|
||||
|
||||
|
@ -24,8 +24,8 @@ namespace MediaBrowser.Dlna.PlayTo
|
||||
const string DIDL_RELEASEDATE = @" <dc:date xmlns:dc=""http://purl.org/dc/elements/1.1/"">{0}</dc:date>" + CRLF;
|
||||
const string DIDL_GENRE = @" <upnp:genre xmlns:upnp=""urn:schemas-upnp-org:metadata-1-0/upnp/"">{0}</upnp:genre>" + CRLF;
|
||||
const string DESCRIPTION = @" <dc:description xmlns:dc=""http://purl.org/dc/elements/1.1/"">{0}</dc:description>" + CRLF;
|
||||
const string DIDL_VIDEO_RES = @" <res bitrate=""{0}"" duration=""{1}"" protocolInfo=""http-get:*:video/x-msvideo:DLNA.ORG_PN=AVI;DLNA.ORG_OP=01;DLNA.ORG_CI=0;DLNA.ORG_FLAGS=01500000000000000000000000000000"" resolution=""{2}x{3}"" size=""0"">{4}</res>" + CRLF;
|
||||
const string DIDL_AUDIO_RES = @" <res bitrate=""{0}"" duration=""{1}"" nrAudioChannels=""2"" protocolInfo=""http-get:*:audio/mp3:DLNA.ORG_OP=01;DLNA.ORG_CI=0;DLNA.ORG_FLAGS=01500000000000000000000000000000"" sampleFrequency=""{2}"" size=""0"">{3}</res>" + CRLF;
|
||||
const string DIDL_VIDEO_RES = @" <res bitrate=""{0}"" duration=""{1}"" protocolInfo=""http-get:*:video/x-msvideo:DLNA.ORG_PN=AVI;DLNA.ORG_OP=01;DLNA.ORG_CI=0;DLNA.ORG_FLAGS=01500000000000000000000000000000"" resolution=""{2}x{3}"">{4}</res>" + CRLF;
|
||||
const string DIDL_AUDIO_RES = @" <res bitrate=""{0}"" duration=""{1}"" nrAudioChannels=""2"" protocolInfo=""http-get:*:audio/mp3:DLNA.ORG_OP=01;DLNA.ORG_CI=0;DLNA.ORG_FLAGS=01500000000000000000000000000000"" sampleFrequency=""{2}"">{3}</res>" + CRLF;
|
||||
const string DIDL_IMAGE_RES = @" <res protocolInfo=""http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_TN;DLNA.ORG_OP=00;DLNA.ORG_CI=1;DLNA.ORG_FLAGS=00D00000000000000000000000000000"" resolution=""212x320"">{0}</res>" + CRLF;
|
||||
const string DIDL_ALBUMIMAGE_RES = @" <res protocolInfo=""http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_TN;DLNA.ORG_OP=00;DLNA.ORG_CI=1;DLNA.ORG_FLAGS=00D00000000000000000000000000000"" resolution=""320x320"">{0}</res>" + CRLF;
|
||||
const string DIDL_RATING = @" <upnp:rating xmlns:upnp=""urn:schemas-upnp-org:metadata-1-0/upnp/"">{0}</upnp:rating>" + CRLF;
|
||||
@ -105,7 +105,12 @@ namespace MediaBrowser.Dlna.PlayTo
|
||||
return string.Empty;
|
||||
}
|
||||
|
||||
return string.Format(DIDL_VIDEO_RES, videostream.BitRate.HasValue ? videostream.BitRate.Value / 10 : 0, GetDurationString(dto), videostream.Width ?? 0, videostream.Height ?? 0, streamUrl);
|
||||
return string.Format(DIDL_VIDEO_RES,
|
||||
videostream.BitRate.HasValue ? videostream.BitRate.Value / 10 : 0,
|
||||
GetDurationString(dto),
|
||||
videostream.Width ?? 0,
|
||||
videostream.Height ?? 0,
|
||||
streamUrl);
|
||||
}
|
||||
|
||||
private static string GetAudioDIDL(BaseItem dto, string streamUrl, IEnumerable<MediaStream> streams)
|
||||
@ -118,7 +123,11 @@ namespace MediaBrowser.Dlna.PlayTo
|
||||
return string.Empty;
|
||||
}
|
||||
|
||||
return string.Format(DIDL_AUDIO_RES, audiostream.BitRate.HasValue ? audiostream.BitRate.Value / 10 : 16000, GetDurationString(dto), audiostream.SampleRate ?? 0, streamUrl);
|
||||
return string.Format(DIDL_AUDIO_RES,
|
||||
audiostream.BitRate.HasValue ? audiostream.BitRate.Value / 10 : 16000,
|
||||
GetDurationString(dto),
|
||||
audiostream.SampleRate ?? 0,
|
||||
streamUrl);
|
||||
}
|
||||
|
||||
private static string GetImageUrl(BaseItem dto, string serverAddress)
|
||||
|
@ -59,7 +59,7 @@ namespace MediaBrowser.Dlna.PlayTo
|
||||
{
|
||||
_locations = new ConcurrentDictionary<string, DateTime>();
|
||||
|
||||
foreach (var network in NetworkInterface.GetAllNetworkInterfaces())
|
||||
foreach (var network in GetNetworkInterfaces())
|
||||
{
|
||||
_logger.Debug("Found interface: {0}. Type: {1}. Status: {2}", network.Name, network.NetworkInterfaceType, network.OperationalStatus);
|
||||
|
||||
@ -97,6 +97,19 @@ namespace MediaBrowser.Dlna.PlayTo
|
||||
}
|
||||
}
|
||||
|
||||
private IEnumerable<NetworkInterface> GetNetworkInterfaces()
|
||||
{
|
||||
try
|
||||
{
|
||||
return NetworkInterface.GetAllNetworkInterfaces();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.ErrorException("Error in GetAllNetworkInterfaces", ex);
|
||||
return new List<NetworkInterface>();
|
||||
}
|
||||
}
|
||||
|
||||
public void Stop()
|
||||
{
|
||||
}
|
||||
|
@ -58,7 +58,8 @@ namespace MediaBrowser.Dlna.PlayTo
|
||||
{
|
||||
Url = url,
|
||||
UserAgent = USERAGENT,
|
||||
LogRequest = _config.Configuration.DlnaOptions.EnableDebugLogging
|
||||
LogRequest = _config.Configuration.DlnaOptions.EnableDebugLogging,
|
||||
LogErrorResponseBody = true
|
||||
};
|
||||
|
||||
options.RequestHeaders["HOST"] = ip + ":" + port.ToString(_usCulture);
|
||||
@ -102,7 +103,8 @@ namespace MediaBrowser.Dlna.PlayTo
|
||||
{
|
||||
Url = url,
|
||||
UserAgent = USERAGENT,
|
||||
LogRequest = _config.Configuration.DlnaOptions.EnableDebugLogging
|
||||
LogRequest = _config.Configuration.DlnaOptions.EnableDebugLogging,
|
||||
LogErrorResponseBody = true
|
||||
};
|
||||
|
||||
options.RequestHeaders["FriendlyName.DLNA.ORG"] = FriendlyName;
|
||||
@ -128,7 +130,8 @@ namespace MediaBrowser.Dlna.PlayTo
|
||||
{
|
||||
Url = url,
|
||||
UserAgent = USERAGENT,
|
||||
LogRequest = _config.Configuration.DlnaOptions.EnableDebugLogging
|
||||
LogRequest = _config.Configuration.DlnaOptions.EnableDebugLogging,
|
||||
LogErrorResponseBody = true
|
||||
};
|
||||
|
||||
options.RequestHeaders["SOAPAction"] = soapAction;
|
||||
|
@ -31,7 +31,7 @@ namespace MediaBrowser.Dlna.Profiles
|
||||
|
||||
new TranscodingProfile
|
||||
{
|
||||
Container = "mp4",
|
||||
Container = "ts",
|
||||
Type = DlnaProfileType.Video,
|
||||
AudioCodec = "aac",
|
||||
VideoCodec = "h264",
|
||||
|
@ -97,7 +97,7 @@ namespace MediaBrowser.Dlna.Profiles
|
||||
{
|
||||
new ProfileCondition
|
||||
{
|
||||
Condition = ProfileConditionType.LessThanEqual,
|
||||
Condition = ProfileConditionType.Equals,
|
||||
Property = ProfileConditionValue.Has64BitOffsets,
|
||||
Value = "false",
|
||||
IsRequired = false
|
||||
|
@ -126,7 +126,7 @@ namespace MediaBrowser.Dlna.Profiles
|
||||
{
|
||||
new ProfileCondition
|
||||
{
|
||||
Condition = ProfileConditionType.LessThanEqual,
|
||||
Condition = ProfileConditionType.Equals,
|
||||
Property = ProfileConditionValue.Has64BitOffsets,
|
||||
Value = "false",
|
||||
IsRequired = false
|
||||
|
@ -9,6 +9,7 @@ namespace MediaBrowser.Dlna.Profiles
|
||||
public XboxOneProfile()
|
||||
{
|
||||
Name = "Xbox One";
|
||||
XDlnaDoc = "DMS-1.50";
|
||||
|
||||
Identification = new DeviceIdentification
|
||||
{
|
||||
@ -28,8 +29,9 @@ namespace MediaBrowser.Dlna.Profiles
|
||||
{
|
||||
Container = "ts",
|
||||
VideoCodec = "h264",
|
||||
AudioCodec = "aac",
|
||||
Type = DlnaProfileType.Video
|
||||
AudioCodec = "ac3",
|
||||
Type = DlnaProfileType.Video,
|
||||
EstimateContentLength = true
|
||||
}
|
||||
};
|
||||
|
||||
@ -37,17 +39,217 @@ namespace MediaBrowser.Dlna.Profiles
|
||||
{
|
||||
new DirectPlayProfile
|
||||
{
|
||||
Container = "mp3,wma",
|
||||
Container = "ts",
|
||||
VideoCodec = "h264",
|
||||
AudioCodec = "ac3",
|
||||
Type = DlnaProfileType.Video
|
||||
},
|
||||
new DirectPlayProfile
|
||||
{
|
||||
Container = "avi",
|
||||
VideoCodec = "mpeg4",
|
||||
AudioCodec = "ac3,mp3",
|
||||
Type = DlnaProfileType.Video
|
||||
},
|
||||
new DirectPlayProfile
|
||||
{
|
||||
Container = "avi",
|
||||
VideoCodec = "h264",
|
||||
AudioCodec = "aac",
|
||||
Type = DlnaProfileType.Video
|
||||
},
|
||||
new DirectPlayProfile
|
||||
{
|
||||
Container = "mp4,mov,mkv",
|
||||
VideoCodec = "h264,mpeg4",
|
||||
AudioCodec = "aac,ac3",
|
||||
Type = DlnaProfileType.Video
|
||||
},
|
||||
new DirectPlayProfile
|
||||
{
|
||||
Container = "asf",
|
||||
VideoCodec = "wmv2,wmv3,vc1",
|
||||
AudioCodec = "wmav2,wmapro",
|
||||
Type = DlnaProfileType.Video
|
||||
},
|
||||
new DirectPlayProfile
|
||||
{
|
||||
Container = "asf",
|
||||
AudioCodec = "wmav2,wmapro,wmavoice",
|
||||
Type = DlnaProfileType.Audio
|
||||
},
|
||||
new DirectPlayProfile
|
||||
{
|
||||
Container = "mp3",
|
||||
AudioCodec = "mp3",
|
||||
Type = DlnaProfileType.Audio
|
||||
},
|
||||
new DirectPlayProfile
|
||||
{
|
||||
Container = "jpeg",
|
||||
Type = DlnaProfileType.Photo
|
||||
}
|
||||
};
|
||||
|
||||
ContainerProfiles = new[]
|
||||
{
|
||||
new ContainerProfile
|
||||
{
|
||||
Type = DlnaProfileType.Video,
|
||||
Container = "mp4,mov",
|
||||
|
||||
Conditions = new []
|
||||
{
|
||||
new ProfileCondition
|
||||
{
|
||||
Condition = ProfileConditionType.Equals,
|
||||
Property = ProfileConditionValue.Has64BitOffsets,
|
||||
Value = "false",
|
||||
IsRequired = false
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
CodecProfiles = new[]
|
||||
{
|
||||
new CodecProfile
|
||||
{
|
||||
Type = CodecType.Video,
|
||||
Codec = "mpeg4",
|
||||
Conditions = new []
|
||||
{
|
||||
new ProfileCondition
|
||||
{
|
||||
Condition = ProfileConditionType.LessThanEqual,
|
||||
Property = ProfileConditionValue.Width,
|
||||
Value = "1920"
|
||||
},
|
||||
new ProfileCondition
|
||||
{
|
||||
Condition = ProfileConditionType.LessThanEqual,
|
||||
Property = ProfileConditionValue.Height,
|
||||
Value = "1080"
|
||||
},
|
||||
new ProfileCondition
|
||||
{
|
||||
Condition = ProfileConditionType.LessThanEqual,
|
||||
Property = ProfileConditionValue.VideoFramerate,
|
||||
Value = "30",
|
||||
IsRequired = false
|
||||
},
|
||||
new ProfileCondition
|
||||
{
|
||||
Condition = ProfileConditionType.LessThanEqual,
|
||||
Property = ProfileConditionValue.VideoBitrate,
|
||||
Value = "5120000",
|
||||
IsRequired = false
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
new CodecProfile
|
||||
{
|
||||
Type = CodecType.Video,
|
||||
Codec = "h264",
|
||||
Conditions = new []
|
||||
{
|
||||
new ProfileCondition
|
||||
{
|
||||
Condition = ProfileConditionType.LessThanEqual,
|
||||
Property = ProfileConditionValue.Width,
|
||||
Value = "1920"
|
||||
},
|
||||
new ProfileCondition
|
||||
{
|
||||
Condition = ProfileConditionType.LessThanEqual,
|
||||
Property = ProfileConditionValue.Height,
|
||||
Value = "1080"
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
new CodecProfile
|
||||
{
|
||||
Type = CodecType.Video,
|
||||
Codec = "wmv2,wmv3,vc1",
|
||||
Conditions = new []
|
||||
{
|
||||
new ProfileCondition
|
||||
{
|
||||
Condition = ProfileConditionType.LessThanEqual,
|
||||
Property = ProfileConditionValue.Width,
|
||||
Value = "1920"
|
||||
},
|
||||
new ProfileCondition
|
||||
{
|
||||
Condition = ProfileConditionType.LessThanEqual,
|
||||
Property = ProfileConditionValue.Height,
|
||||
Value = "1080"
|
||||
},
|
||||
new ProfileCondition
|
||||
{
|
||||
Condition = ProfileConditionType.LessThanEqual,
|
||||
Property = ProfileConditionValue.VideoFramerate,
|
||||
Value = "30",
|
||||
IsRequired = false
|
||||
},
|
||||
new ProfileCondition
|
||||
{
|
||||
Condition = ProfileConditionType.LessThanEqual,
|
||||
Property = ProfileConditionValue.VideoBitrate,
|
||||
Value = "15360000",
|
||||
IsRequired = false
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
new CodecProfile
|
||||
{
|
||||
Type = CodecType.VideoAudio,
|
||||
Codec = "ac3,wmav2,wmapro",
|
||||
Conditions = new []
|
||||
{
|
||||
new ProfileCondition
|
||||
{
|
||||
Condition = ProfileConditionType.LessThanEqual,
|
||||
Property = ProfileConditionValue.AudioChannels,
|
||||
Value = "6",
|
||||
IsRequired = false
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
new CodecProfile
|
||||
{
|
||||
Type = CodecType.VideoAudio,
|
||||
Codec = "aac",
|
||||
Conditions = new []
|
||||
{
|
||||
new ProfileCondition
|
||||
{
|
||||
Condition = ProfileConditionType.LessThanEqual,
|
||||
Property = ProfileConditionValue.AudioChannels,
|
||||
Value = "2",
|
||||
IsRequired = false
|
||||
},
|
||||
new ProfileCondition
|
||||
{
|
||||
Condition = ProfileConditionType.Equals,
|
||||
Property = ProfileConditionValue.AudioProfile,
|
||||
Value = "lc",
|
||||
IsRequired = false
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
ResponseProfiles = new[]
|
||||
{
|
||||
new ResponseProfile
|
||||
{
|
||||
Container = "avi",
|
||||
MimeType = "video/x-msvideo",
|
||||
MimeType = "video/avi",
|
||||
Type = DlnaProfileType.Video
|
||||
}
|
||||
};
|
||||
|
@ -40,7 +40,7 @@
|
||||
<ContainerProfiles>
|
||||
<ContainerProfile type="Video" container="mp4,mov">
|
||||
<Conditions>
|
||||
<ProfileCondition condition="LessThanEqual" property="Has64BitOffsets" value="false" isRequired="false" />
|
||||
<ProfileCondition condition="Equals" property="Has64BitOffsets" value="false" isRequired="false" />
|
||||
</Conditions>
|
||||
</ContainerProfile>
|
||||
<ContainerProfile type="Photo">
|
||||
|
@ -16,21 +16,69 @@
|
||||
<IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
|
||||
<EnableAlbumArtInDidl>false</EnableAlbumArtInDidl>
|
||||
<SupportedMediaTypes>Audio,Photo,Video</SupportedMediaTypes>
|
||||
<XDlnaDoc>DMS-1.50</XDlnaDoc>
|
||||
<ProtocolInfo>DLNA</ProtocolInfo>
|
||||
<TimelineOffsetSeconds>0</TimelineOffsetSeconds>
|
||||
<RequiresPlainVideoItems>false</RequiresPlainVideoItems>
|
||||
<RequiresPlainFolders>false</RequiresPlainFolders>
|
||||
<DirectPlayProfiles>
|
||||
<DirectPlayProfile container="mp3,wma" type="Audio" />
|
||||
<DirectPlayProfile container="ts" audioCodec="ac3" videoCodec="h264" type="Video" />
|
||||
<DirectPlayProfile container="avi" audioCodec="ac3,mp3" videoCodec="mpeg4" type="Video" />
|
||||
<DirectPlayProfile container="avi" audioCodec="aac" videoCodec="h264" type="Video" />
|
||||
<DirectPlayProfile container="mp4,mov,mkv" audioCodec="aac,ac3" videoCodec="h264,mpeg4" type="Video" />
|
||||
<DirectPlayProfile container="asf" audioCodec="wmav2,wmapro" videoCodec="wmv2,wmv3,vc1" type="Video" />
|
||||
<DirectPlayProfile container="asf" audioCodec="wmav2,wmapro,wmavoice" type="Audio" />
|
||||
<DirectPlayProfile container="mp3" audioCodec="mp3" type="Audio" />
|
||||
<DirectPlayProfile container="jpeg" type="Photo" />
|
||||
</DirectPlayProfiles>
|
||||
<TranscodingProfiles>
|
||||
<TranscodingProfile container="mp3" type="Audio" audioCodec="mp3" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" />
|
||||
<TranscodingProfile container="ts" type="Video" videoCodec="h264" audioCodec="aac" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" />
|
||||
<TranscodingProfile container="ts" type="Video" videoCodec="h264" audioCodec="ac3" estimateContentLength="true" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" />
|
||||
</TranscodingProfiles>
|
||||
<ContainerProfiles />
|
||||
<CodecProfiles />
|
||||
<ContainerProfiles>
|
||||
<ContainerProfile type="Video" container="mp4,mov">
|
||||
<Conditions>
|
||||
<ProfileCondition condition="Equals" property="Has64BitOffsets" value="false" isRequired="false" />
|
||||
</Conditions>
|
||||
</ContainerProfile>
|
||||
</ContainerProfiles>
|
||||
<CodecProfiles>
|
||||
<CodecProfile type="Video" codec="mpeg4">
|
||||
<Conditions>
|
||||
<ProfileCondition condition="LessThanEqual" property="Width" value="1920" isRequired="true" />
|
||||
<ProfileCondition condition="LessThanEqual" property="Height" value="1080" isRequired="true" />
|
||||
<ProfileCondition condition="LessThanEqual" property="VideoFramerate" value="30" isRequired="false" />
|
||||
<ProfileCondition condition="LessThanEqual" property="VideoBitrate" value="5120000" isRequired="false" />
|
||||
</Conditions>
|
||||
</CodecProfile>
|
||||
<CodecProfile type="Video" codec="h264">
|
||||
<Conditions>
|
||||
<ProfileCondition condition="LessThanEqual" property="Width" value="1920" isRequired="true" />
|
||||
<ProfileCondition condition="LessThanEqual" property="Height" value="1080" isRequired="true" />
|
||||
</Conditions>
|
||||
</CodecProfile>
|
||||
<CodecProfile type="Video" codec="wmv2,wmv3,vc1">
|
||||
<Conditions>
|
||||
<ProfileCondition condition="LessThanEqual" property="Width" value="1920" isRequired="true" />
|
||||
<ProfileCondition condition="LessThanEqual" property="Height" value="1080" isRequired="true" />
|
||||
<ProfileCondition condition="LessThanEqual" property="VideoFramerate" value="30" isRequired="false" />
|
||||
<ProfileCondition condition="LessThanEqual" property="VideoBitrate" value="15360000" isRequired="false" />
|
||||
</Conditions>
|
||||
</CodecProfile>
|
||||
<CodecProfile type="VideoAudio" codec="ac3,wmav2,wmapro">
|
||||
<Conditions>
|
||||
<ProfileCondition condition="LessThanEqual" property="AudioChannels" value="6" isRequired="false" />
|
||||
</Conditions>
|
||||
</CodecProfile>
|
||||
<CodecProfile type="VideoAudio" codec="aac">
|
||||
<Conditions>
|
||||
<ProfileCondition condition="LessThanEqual" property="AudioChannels" value="2" isRequired="false" />
|
||||
<ProfileCondition condition="Equals" property="AudioProfile" value="lc" isRequired="false" />
|
||||
</Conditions>
|
||||
</CodecProfile>
|
||||
</CodecProfiles>
|
||||
<ResponseProfiles>
|
||||
<ResponseProfile container="avi" type="Video" mimeType="video/x-msvideo">
|
||||
<ResponseProfile container="avi" type="Video" mimeType="video/avi">
|
||||
<Conditions />
|
||||
</ResponseProfile>
|
||||
</ResponseProfiles>
|
||||
|
@ -66,7 +66,6 @@ namespace MediaBrowser.Model.Configuration
|
||||
IsAdministrator = true;
|
||||
|
||||
EnableRemoteControlOfOtherUsers = true;
|
||||
EnableContentDeletion = true;
|
||||
EnableLiveTvManagement = true;
|
||||
EnableMediaPlayback = true;
|
||||
EnableLiveTvAccess = true;
|
||||
|
@ -174,7 +174,7 @@ namespace MediaBrowser.Providers.Manager
|
||||
if (string.IsNullOrEmpty(item.Name) && !string.IsNullOrEmpty(item.Path))
|
||||
{
|
||||
item.Name = Path.GetFileNameWithoutExtension(item.Path);
|
||||
updateType = updateType | ItemUpdateType.MetadataEdit;
|
||||
updateType = updateType | ItemUpdateType.MetadataDownload;
|
||||
}
|
||||
|
||||
return updateType;
|
||||
|
@ -613,15 +613,31 @@ namespace MediaBrowser.Providers.Manager
|
||||
{
|
||||
if (!includeDisabled)
|
||||
{
|
||||
if (!item.IsSaveLocalMetadataEnabled())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (options.DisabledMetadataSavers.Contains(saver.Name, StringComparer.OrdinalIgnoreCase))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!item.IsSaveLocalMetadataEnabled())
|
||||
{
|
||||
if (updateType >= ItemUpdateType.MetadataEdit)
|
||||
{
|
||||
var fileSaver = saver as IMetadataFileSaver;
|
||||
|
||||
// Manual edit occurred
|
||||
// Even if save local is off, save locally anyway if the metadata file already exists
|
||||
if (fileSaver == null || !File.Exists(fileSaver.GetSavePath(item)))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// Manual edit did not occur
|
||||
// Since local metadata saving is disabled, consider it disabled
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return saver.IsEnabledFor(item, updateType);
|
||||
|
@ -1,7 +1,6 @@
|
||||
using MediaBrowser.Controller.Entities;
|
||||
using MediaBrowser.Controller.Entities.Audio;
|
||||
using MediaBrowser.Controller.Library;
|
||||
using MediaBrowser.Model.Entities;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Text;
|
||||
|
@ -91,6 +91,8 @@ namespace MediaBrowser.Providers.TV
|
||||
.Where(i => i.Item1 != -1 && i.Item2 != -1)
|
||||
.ToList();
|
||||
|
||||
var hasBadData = HasInvalidContent(group);
|
||||
|
||||
var anySeasonsRemoved = await RemoveObsoleteOrMissingSeasons(group, episodeLookup, cancellationToken)
|
||||
.ConfigureAwait(false);
|
||||
|
||||
@ -105,7 +107,7 @@ namespace MediaBrowser.Providers.TV
|
||||
hasNewSeasons = await AddDummySeasonFolders(series, cancellationToken).ConfigureAwait(false);
|
||||
}
|
||||
|
||||
if (_config.Configuration.EnableInternetProviders)
|
||||
if (!hasBadData && _config.Configuration.EnableInternetProviders)
|
||||
{
|
||||
var seriesConfig = _config.Configuration.MetadataOptions.FirstOrDefault(i => string.Equals(i.ItemType, typeof(Series).Name, StringComparison.OrdinalIgnoreCase));
|
||||
|
||||
@ -130,6 +132,20 @@ namespace MediaBrowser.Providers.TV
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns true if a series has any seasons or episodes without season or episode numbers
|
||||
/// If this data is missing no virtual items will be added in order to prevent possible duplicates
|
||||
/// </summary>
|
||||
/// <param name="group"></param>
|
||||
/// <returns></returns>
|
||||
private bool HasInvalidContent(IEnumerable<Series> group)
|
||||
{
|
||||
var allItems = group.ToList().SelectMany(i => i.RecursiveChildren).ToList();
|
||||
|
||||
return allItems.OfType<Season>().Any(i => !i.IndexNumber.HasValue) ||
|
||||
allItems.OfType<Episode>().Any(i => !i.IndexNumber.HasValue || !i.ParentIndexNumber.HasValue);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// For series with episodes directly under the series folder, this adds dummy seasons to enable regular browsing and metadata
|
||||
/// </summary>
|
||||
|
@ -1,5 +1,6 @@
|
||||
using MediaBrowser.Common.ScheduledTasks;
|
||||
using MediaBrowser.Controller;
|
||||
using MediaBrowser.Controller.Configuration;
|
||||
using MediaBrowser.Controller.Plugins;
|
||||
using MediaBrowser.Controller.Session;
|
||||
using MediaBrowser.Model.Logging;
|
||||
@ -16,15 +17,17 @@ namespace MediaBrowser.Server.Implementations.EntryPoints
|
||||
private readonly ILogger _logger;
|
||||
private readonly ITaskManager _iTaskManager;
|
||||
private readonly ISessionManager _sessionManager;
|
||||
private readonly IServerConfigurationManager _config;
|
||||
|
||||
private Timer _timer;
|
||||
|
||||
public AutomaticRestartEntryPoint(IServerApplicationHost appHost, ILogger logger, ITaskManager iTaskManager, ISessionManager sessionManager)
|
||||
public AutomaticRestartEntryPoint(IServerApplicationHost appHost, ILogger logger, ITaskManager iTaskManager, ISessionManager sessionManager, IServerConfigurationManager config)
|
||||
{
|
||||
_appHost = appHost;
|
||||
_logger = logger;
|
||||
_iTaskManager = iTaskManager;
|
||||
_sessionManager = sessionManager;
|
||||
_config = config;
|
||||
}
|
||||
|
||||
public void Run()
|
||||
@ -47,7 +50,7 @@ namespace MediaBrowser.Server.Implementations.EntryPoints
|
||||
|
||||
private void TimerCallback(object state)
|
||||
{
|
||||
if (IsIdle())
|
||||
if (_config.Configuration.EnableAutomaticRestart && IsIdle())
|
||||
{
|
||||
DisposeTimer();
|
||||
|
||||
@ -70,12 +73,8 @@ namespace MediaBrowser.Server.Implementations.EntryPoints
|
||||
}
|
||||
|
||||
var now = DateTime.UtcNow;
|
||||
if (_sessionManager.Sessions.Any(i => !string.IsNullOrEmpty(i.NowViewingItemName) || (now - i.LastActivityDate).TotalMinutes < 30))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
return !_sessionManager.Sessions.Any(i => !string.IsNullOrEmpty(i.NowViewingItemName) || (now - i.LastActivityDate).TotalMinutes < 30);
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
|
@ -1,4 +1,5 @@
|
||||
using ServiceStack.Web;
|
||||
using System.Threading;
|
||||
using ServiceStack.Web;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Globalization;
|
||||
@ -64,7 +65,7 @@ namespace MediaBrowser.Server.Implementations.HttpServer
|
||||
{
|
||||
throw new ArgumentNullException("contentType");
|
||||
}
|
||||
|
||||
|
||||
RangeHeader = rangeHeader;
|
||||
SourceStream = source;
|
||||
IsHeadRequest = isHeadRequest;
|
||||
@ -98,11 +99,11 @@ namespace MediaBrowser.Server.Implementations.HttpServer
|
||||
|
||||
RangeStart = requestedRange.Key;
|
||||
RangeLength = 1 + RangeEnd - RangeStart;
|
||||
|
||||
|
||||
// Content-Length is the length of what we're serving, not the original content
|
||||
Options["Content-Length"] = RangeLength.ToString(UsCulture);
|
||||
Options["Content-Range"] = string.Format("bytes {0}-{1}/{2}", RangeStart, RangeEnd, TotalContentLength);
|
||||
|
||||
|
||||
if (RangeStart > 0)
|
||||
{
|
||||
SourceStream.Position = RangeStart;
|
||||
@ -179,17 +180,33 @@ namespace MediaBrowser.Server.Implementations.HttpServer
|
||||
using (var source = SourceStream)
|
||||
{
|
||||
// If the requested range is "0-", we can optimize by just doing a stream copy
|
||||
if (RangeEnd == TotalContentLength - 1)
|
||||
if (RangeEnd >= TotalContentLength - 1)
|
||||
{
|
||||
await source.CopyToAsync(responseStream).ConfigureAwait(false);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Read the bytes we need
|
||||
var buffer = new byte[Convert.ToInt32(RangeLength)];
|
||||
await source.ReadAsync(buffer, 0, buffer.Length).ConfigureAwait(false);
|
||||
await CopyToAsyncInternal(source, responseStream, Convert.ToInt32(RangeLength), CancellationToken.None).ConfigureAwait(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
await responseStream.WriteAsync(buffer, 0, Convert.ToInt32(RangeLength)).ConfigureAwait(false);
|
||||
private async Task CopyToAsyncInternal(Stream source, Stream destination, int copyLength, CancellationToken cancellationToken)
|
||||
{
|
||||
const int bufferSize = 81920;
|
||||
var array = new byte[bufferSize];
|
||||
int count;
|
||||
while ((count = await source.ReadAsync(array, 0, array.Length, cancellationToken).ConfigureAwait(false)) != 0)
|
||||
{
|
||||
var bytesToCopy = Math.Min(count, copyLength);
|
||||
|
||||
await destination.WriteAsync(array, 0, bytesToCopy, cancellationToken).ConfigureAwait(false);
|
||||
|
||||
copyLength -= bytesToCopy;
|
||||
|
||||
if (copyLength <= 0)
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -212,4 +229,4 @@ namespace MediaBrowser.Server.Implementations.HttpServer
|
||||
|
||||
public string StatusDescription { get; set; }
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1 @@
|
||||
{"SettingsSaved":"Nastaven\u00ed ulo\u017eeno.","AddUser":"P\u0159idat u\u017eivatele","Users":"U\u017eivatel\u00e9","Delete":"Odstranit","Administrator":"Administr\u00e1tor","Password":"Heslo","DeleteImage":"Odstranit obr\u00e1zek","DeleteImageConfirmation":"Jste si jisti, \u017ee chcete odstranit tento obr\u00e1zek?","FileReadCancelled":"\u010cten\u00ed souboru bylo zru\u0161eno.","FileNotFound":"Soubor nebyl nalezen.","FileReadError":"Nastala chyba p\u0159i na\u010d\u00edt\u00e1n\u00ed souboru.","DeleteUser":"Odstranit u\u017eivatele","DeleteUserConfirmation":"Jste si jisti, \u017ee chcete odstranit {0}?","PasswordResetHeader":"Obnovit heslo","PasswordResetComplete":"Heslo bylo obnoveno.","PasswordResetConfirmation":"Jste si jisti, \u017ee chcete obnovit heslo?","PasswordSaved":"Heslo ulo\u017eeno.","PasswordMatchError":"Heslo a potvrzen\u00ed hesla mus\u00ed souhlasit.","OptionOff":"Vypnout","OptionOn":"Zapnout","OptionRelease":"Ofici\u00e1ln\u00ed vyd\u00e1n\u00ed","OptionBeta":"Betaverze","OptionDev":"Dev (Nestabiln\u00ed\/V\u00fdvoj\u00e1\u0159sk\u00e1)","UninstallPluginHeader":"Odinstalovat plugin","UninstallPluginConfirmation":"Jste si jisti, \u017ee chcete odinstalovat {0}?","NoPluginConfigurationMessage":"Tento plugin nem\u00e1 nastaven\u00ed.","NoPluginsInstalledMessage":"Nem\u00e1te nainstalov\u00e1n \u017e\u00e1dn\u00fd plugin.","BrowsePluginCatalogMessage":"Prohl\u00e9dn\u011bte si n\u00e1\u0161 katalog, kde najdete dostupn\u00e9 pluginy."}
|
@ -1 +1 @@
|
||||
{"SettingsSaved":"\u039f\u03b9 \u03c1\u03c5\u03b8\u03bc\u03af\u03c3\u03b5\u03b9\u03c2 \u03b1\u03c0\u03bf\u03b8\u03b7\u03ba\u03b5\u03cd\u03c4\u03b7\u03ba\u03b1\u03bd","AddUser":"\u03a0\u03c1\u03bf\u03c3\u03b8\u03ae\u03ba\u03b7 \u03c7\u03c1\u03ae\u03c3\u03c4\u03b7","Users":"\u039f\u03b9 \u03c7\u03c1\u03ae\u03c3\u03c4\u03b5\u03c2","Delete":"\u0394\u03b9\u03b1\u03b3\u03c1\u03ac\u03c8\u03c4\u03b5","Administrator":"\u03c4\u03bf \u03b4\u03b9\u03b1\u03c7\u03b5\u03b9\u03c1\u03b9\u03c3\u03c4\u03ae\u03c2","Password":"\u03c4\u03bf\u03bd \u03ba\u03ce\u03b4\u03b9\u03ba\u03b1\u03c2 \u03c0\u03c1\u03cc\u03c3\u03b2\u03b1\u03c3\u03b7\u03c2","DeleteImage":"\u03b4\u03b9\u03b1\u03b3\u03c1\u03ac\u03c8\u03c4\u03b5 \u03c4\u03b7\u03bd \u03b5\u03b9\u03ba\u03cc\u03bd\u03b1","DeleteImageConfirmation":"\u0395\u03af\u03c3\u03c4\u03b5 \u03c3\u03af\u03b3\u03bf\u03c5\u03c1\u03bf\u03b9 \u03cc\u03c4\u03b9 \u03b8\u03ad\u03bb\u03b5\u03c4\u03b5 \u03bd\u03b1 \u03b4\u03b9\u03b1\u03b3\u03c1\u03ac\u03c8\u03b5\u03c4\u03b5 \u03b1\u03c5\u03c4\u03ae \u03c4\u03b7\u03bd \u03b5\u03b9\u03ba\u03cc\u03bd\u03b1;","FileReadCancelled":"\u03a4\u03bf \u03b1\u03c1\u03c7\u03b5\u03af\u03bf \u03b4\u03b9\u03b1\u03b2\u03ac\u03b6\u03b5\u03c4\u03b1\u03b9 \u03ad\u03c7\u03b5\u03b9 \u03b1\u03ba\u03c5\u03c1\u03c9\u03b8\u03b5\u03af","FileNotFound":"\u03a4\u03bf \u03b1\u03c1\u03c7\u03b5\u03af\u03bf \u03b4\u03b5\u03bd \u03b2\u03c1\u03ad\u03b8\u03b7\u03ba\u03b5","FileReadError":"\u03a0\u03b1\u03c1\u03bf\u03c5\u03c3\u03b9\u03ac\u03c3\u03c4\u03b7\u03ba\u03b5 \u03c3\u03c6\u03ac\u03bb\u03bc\u03b1 \u03ba\u03b1\u03c4\u03ac \u03c4\u03b7\u03bd \u03b1\u03bd\u03ac\u03b3\u03bd\u03c9\u03c3\u03b7 \u03c4\u03bf\u03c5 \u03b1\u03c1\u03c7\u03b5\u03af\u03bf\u03c5","DeleteUser":"\u0394\u03b9\u03b1\u03b3\u03c1\u03b1\u03c6\u03ae \u03c7\u03c1\u03ae\u03c3\u03c4\u03b7","DeleteUserConfirmation":"\u0395\u03af\u03c3\u03c4\u03b5 \u03c3\u03af\u03b3\u03bf\u03c5\u03c1\u03bf\u03b9 \u03cc\u03c4\u03b9 \u03b8\u03ad\u03bb\u03b5\u03c4\u03b5 \u03bd\u03b1 \u03b4\u03b9\u03b1\u03b3\u03c1\u03ac\u03c8\u03b5\u03c4\u03b5","PasswordResetHeader":"\u0395\u03c0\u03b1\u03bd\u03b1\u03c6\u03bf\u03c1\u03ac \u03ba\u03c9\u03b4\u03b9\u03ba\u03bf\u03cd \u03c0\u03c1\u03cc\u03c3\u03b2\u03b1\u03c3\u03b7\u03c2","PasswordResetComplete":"\u039f \u03ba\u03c9\u03b4\u03b9\u03ba\u03cc\u03c2 \u03c0\u03c1\u03cc\u03c3\u03b2\u03b1\u03c3\u03b7\u03c2 \u03ad\u03c7\u03b5\u03b9 \u03b3\u03af\u03bd\u03b5\u03b9 \u03b5\u03c0\u03b1\u03bd\u03b1\u03c6\u03bf\u03c1\u03ac","PasswordResetConfirmation":"\u0395\u03af\u03c3\u03c4\u03b5 \u03c3\u03af\u03b3\u03bf\u03c5\u03c1\u03bf\u03b9 \u03cc\u03c4\u03b9 \u03b8\u03ad\u03bb\u03b5\u03c4\u03b5 \u03bd\u03b1 \u03b5\u03c0\u03b1\u03bd\u03b1\u03c6\u03ad\u03c1\u03b5\u03c4\u03b5 \u03c4\u03bf\u03bd \u03ba\u03c9\u03b4\u03b9\u03ba\u03cc \u03c0\u03c1\u03cc\u03c3\u03b2\u03b1\u03c3\u03b7\u03c2;","PasswordSaved":"\u039f \u03ba\u03c9\u03b4\u03b9\u03ba\u03cc\u03c2 \u03c0\u03c1\u03cc\u03c3\u03b2\u03b1\u03c3\u03b7\u03c2 \u03b1\u03c0\u03bf\u03b8\u03b7\u03ba\u03b5\u03cd\u03c4\u03b7\u03ba\u03b5","PasswordMatchError":"\u039f \u03ba\u03c9\u03b4\u03b9\u03ba\u03cc\u03c2 \u03c0\u03c1\u03cc\u03c3\u03b2\u03b1\u03c3\u03b7\u03c2 \u03ba\u03b1\u03b9 \u03c4\u03bf\u03bd \u03ba\u03c9\u03b4\u03b9\u03ba\u03cc \u03b5\u03c0\u03b9\u03b2\u03b5\u03b2\u03b1\u03af\u03c9\u03c3\u03b7\u03c2 \u03c0\u03c1\u03ad\u03c0\u03b5\u03b9 \u03bd\u03b1 \u03c4\u03b1\u03b9\u03c1\u03b9\u03ac\u03b6\u03bf\u03c5\u03bd","OptionOff":"Off","OptionOn":"On","OptionRelease":"Official Release","OptionBeta":"Beta","OptionDev":"Dev (Unstable)","UninstallPluginHeader":"Uninstall Plugin","UninstallPluginConfirmation":"Are you sure you wish to uninstall {0}?","NoPluginConfigurationMessage":"This plugin has nothing to configure.","NoPluginsInstalledMessage":"You have no plugins installed.","BrowsePluginCatalogMessage":"Browse our plugin catalog to view available plugins."}
|
||||
{"SettingsSaved":"\u039f\u03b9 \u03c1\u03c5\u03b8\u03bc\u03af\u03c3\u03b5\u03b9\u03c2 \u03b1\u03c0\u03bf\u03b8\u03b7\u03ba\u03b5\u03cd\u03c4\u03b7\u03ba\u03b1\u03bd","AddUser":"\u03a0\u03c1\u03bf\u03c3\u03b8\u03ae\u03ba\u03b7 \u03c7\u03c1\u03ae\u03c3\u03c4\u03b7","Users":"\u039f\u03b9 \u03c7\u03c1\u03ae\u03c3\u03c4\u03b5\u03c2","Delete":"\u0394\u03b9\u03b1\u03b3\u03c1\u03ac\u03c8\u03c4\u03b5","Administrator":"\u03c4\u03bf \u03b4\u03b9\u03b1\u03c7\u03b5\u03b9\u03c1\u03b9\u03c3\u03c4\u03ae\u03c2","Password":"\u03c4\u03bf\u03bd \u03ba\u03ce\u03b4\u03b9\u03ba\u03b1\u03c2 \u03c0\u03c1\u03cc\u03c3\u03b2\u03b1\u03c3\u03b7\u03c2","DeleteImage":"\u03b4\u03b9\u03b1\u03b3\u03c1\u03ac\u03c8\u03c4\u03b5 \u03c4\u03b7\u03bd \u03b5\u03b9\u03ba\u03cc\u03bd\u03b1","DeleteImageConfirmation":"\u0395\u03af\u03c3\u03c4\u03b5 \u03c3\u03af\u03b3\u03bf\u03c5\u03c1\u03bf\u03b9 \u03cc\u03c4\u03b9 \u03b8\u03ad\u03bb\u03b5\u03c4\u03b5 \u03bd\u03b1 \u03b4\u03b9\u03b1\u03b3\u03c1\u03ac\u03c8\u03b5\u03c4\u03b5 \u03b1\u03c5\u03c4\u03ae \u03c4\u03b7\u03bd \u03b5\u03b9\u03ba\u03cc\u03bd\u03b1;","FileReadCancelled":"\u03a4\u03bf \u03b1\u03c1\u03c7\u03b5\u03af\u03bf \u03b4\u03b9\u03b1\u03b2\u03ac\u03b6\u03b5\u03c4\u03b1\u03b9 \u03ad\u03c7\u03b5\u03b9 \u03b1\u03ba\u03c5\u03c1\u03c9\u03b8\u03b5\u03af","FileNotFound":"\u03a4\u03bf \u03b1\u03c1\u03c7\u03b5\u03af\u03bf \u03b4\u03b5\u03bd \u03b2\u03c1\u03ad\u03b8\u03b7\u03ba\u03b5","FileReadError":"\u03a0\u03b1\u03c1\u03bf\u03c5\u03c3\u03b9\u03ac\u03c3\u03c4\u03b7\u03ba\u03b5 \u03c3\u03c6\u03ac\u03bb\u03bc\u03b1 \u03ba\u03b1\u03c4\u03ac \u03c4\u03b7\u03bd \u03b1\u03bd\u03ac\u03b3\u03bd\u03c9\u03c3\u03b7 \u03c4\u03bf\u03c5 \u03b1\u03c1\u03c7\u03b5\u03af\u03bf\u03c5","DeleteUser":"\u0394\u03b9\u03b1\u03b3\u03c1\u03b1\u03c6\u03ae \u03c7\u03c1\u03ae\u03c3\u03c4\u03b7","DeleteUserConfirmation":"\u0395\u03af\u03c3\u03c4\u03b5 \u03c3\u03af\u03b3\u03bf\u03c5\u03c1\u03bf\u03b9 \u03cc\u03c4\u03b9 \u03b8\u03ad\u03bb\u03b5\u03c4\u03b5 \u03bd\u03b1 \u03b4\u03b9\u03b1\u03b3\u03c1\u03ac\u03c8\u03b5\u03c4\u03b5","PasswordResetHeader":"\u0395\u03c0\u03b1\u03bd\u03b1\u03c6\u03bf\u03c1\u03ac \u03ba\u03c9\u03b4\u03b9\u03ba\u03bf\u03cd \u03c0\u03c1\u03cc\u03c3\u03b2\u03b1\u03c3\u03b7\u03c2","PasswordResetComplete":"\u039f \u03ba\u03c9\u03b4\u03b9\u03ba\u03cc\u03c2 \u03c0\u03c1\u03cc\u03c3\u03b2\u03b1\u03c3\u03b7\u03c2 \u03ad\u03c7\u03b5\u03b9 \u03b3\u03af\u03bd\u03b5\u03b9 \u03b5\u03c0\u03b1\u03bd\u03b1\u03c6\u03bf\u03c1\u03ac","PasswordResetConfirmation":"\u0395\u03af\u03c3\u03c4\u03b5 \u03c3\u03af\u03b3\u03bf\u03c5\u03c1\u03bf\u03b9 \u03cc\u03c4\u03b9 \u03b8\u03ad\u03bb\u03b5\u03c4\u03b5 \u03bd\u03b1 \u03b5\u03c0\u03b1\u03bd\u03b1\u03c6\u03ad\u03c1\u03b5\u03c4\u03b5 \u03c4\u03bf\u03bd \u03ba\u03c9\u03b4\u03b9\u03ba\u03cc \u03c0\u03c1\u03cc\u03c3\u03b2\u03b1\u03c3\u03b7\u03c2;","PasswordSaved":"\u039f \u03ba\u03c9\u03b4\u03b9\u03ba\u03cc\u03c2 \u03c0\u03c1\u03cc\u03c3\u03b2\u03b1\u03c3\u03b7\u03c2 \u03b1\u03c0\u03bf\u03b8\u03b7\u03ba\u03b5\u03cd\u03c4\u03b7\u03ba\u03b5","PasswordMatchError":"\u039f \u03ba\u03c9\u03b4\u03b9\u03ba\u03cc\u03c2 \u03c0\u03c1\u03cc\u03c3\u03b2\u03b1\u03c3\u03b7\u03c2 \u03ba\u03b1\u03b9 \u03c4\u03bf\u03bd \u03ba\u03c9\u03b4\u03b9\u03ba\u03cc \u03b5\u03c0\u03b9\u03b2\u03b5\u03b2\u03b1\u03af\u03c9\u03c3\u03b7\u03c2 \u03c0\u03c1\u03ad\u03c0\u03b5\u03b9 \u03bd\u03b1 \u03c4\u03b1\u03b9\u03c1\u03b9\u03ac\u03b6\u03bf\u03c5\u03bd","OptionOff":"\u03c3\u03b2\u03b7\u03c3\u03c4\u03cc\u03c2","OptionOn":"On","OptionRelease":"\u0397 \u03b5\u03c0\u03af\u03c3\u03b7\u03bc\u03b7 \u03ad\u03ba\u03b4\u03bf\u03c3\u03b7","OptionBeta":"\u03b2\u03ae\u03c4\u03b1","OptionDev":"\u03b1\u03bd\u03ac\u03c0\u03c4\u03c5\u03be\u03b7 (\u03b1\u03c3\u03c4\u03b1\u03b8\u03ae\u03c2)","UninstallPluginHeader":"Uninstall Plugin","UninstallPluginConfirmation":"\u0395\u03af\u03c3\u03c4\u03b5 \u03c3\u03af\u03b3\u03bf\u03c5\u03c1\u03bf\u03b9 \u03cc\u03c4\u03b9 \u03b8\u03ad\u03bb\u03b5\u03c4\u03b5 \u03bd\u03b1 \u03b1\u03c0\u03b5\u03b3\u03ba\u03b1\u03c4\u03b1\u03c3\u03c4\u03ae\u03c3\u03b5\u03c4\u03b5;","NoPluginConfigurationMessage":"This plugin has nothing to configure.","NoPluginsInstalledMessage":"You have no plugins installed.","BrowsePluginCatalogMessage":"Browse our plugin catalog to view available plugins."}
|
@ -1 +1 @@
|
||||
{"SettingsSaved":"Param\u00e8tres sauvegard\u00e9s.","AddUser":"Ajouter utilisateur","Users":"Utilisateurs","Delete":"Supprimer","Administrator":"Administrateur","Password":"Mot de passe","DeleteImage":"Supprimer Image","DeleteImageConfirmation":"\u00cates-vous s\u00fbr de vouloir supprimer l'image?","FileReadCancelled":"La lecture du fichier a \u00e9t\u00e9 annul\u00e9e.","FileNotFound":"Fichier non trouv\u00e9","FileReadError":"Un erreur est survenue pendant la lecture du fichier.","DeleteUser":"Supprimer utilisateur","DeleteUserConfirmation":"\u00cates-vous s\u00fbr de vouloir supprimer {0}?","PasswordResetHeader":"R\u00e9initialisation du mot de passe","PasswordResetComplete":"Le mot de passe a \u00e9t\u00e9 r\u00e9initialis\u00e9.","PasswordResetConfirmation":"\u00cates-vous s\u00fbr de vouloir r\u00e9initialiser le mot de passe?","PasswordSaved":"Mot de passe sauvegard\u00e9.","PasswordMatchError":"Le mot de passe et sa confirmation doivent correspondre.","OptionOff":"Off","OptionOn":"On","OptionRelease":"Lancement","OptionBeta":"Beta","OptionDev":"Dev (Instable)","UninstallPluginHeader":"D\u00e9sinstaller Plug-in","UninstallPluginConfirmation":"\u00cates-vous s\u00fbr de vouloir d\u00e9sinstaller {0}?","NoPluginConfigurationMessage":"Ce module d'extension n'a rien \u00e0 configurer.","NoPluginsInstalledMessage":"Vous n'avez aucun module d'extension install\u00e9.","BrowsePluginCatalogMessage":"Explorer notre catalogue de Plug-ins disponibles."}
|
||||
{"SettingsSaved":"Param\u00e8tres sauvegard\u00e9s.","AddUser":"Ajouter utilisateur","Users":"Utilisateurs","Delete":"Supprimer","Administrator":"Administrateur","Password":"Mot de passe","DeleteImage":"Supprimer Image","DeleteImageConfirmation":"\u00cates-vous s\u00fbr de vouloir supprimer l'image?","FileReadCancelled":"La lecture du fichier a \u00e9t\u00e9 annul\u00e9e.","FileNotFound":"Fichier non trouv\u00e9","FileReadError":"Un erreur est survenue pendant la lecture du fichier.","DeleteUser":"Supprimer utilisateur","DeleteUserConfirmation":"\u00cates-vous s\u00fbr de vouloir supprimer {0}?","PasswordResetHeader":"R\u00e9initialisation du mot de passe","PasswordResetComplete":"Le mot de passe a \u00e9t\u00e9 r\u00e9initialis\u00e9.","PasswordResetConfirmation":"\u00cates-vous s\u00fbr de vouloir r\u00e9initialiser le mot de passe?","PasswordSaved":"Mot de passe sauvegard\u00e9.","PasswordMatchError":"Le mot de passe et sa confirmation doivent correspondre.","OptionOff":"Off","OptionOn":"On","OptionRelease":"Version officielle","OptionBeta":"Beta","OptionDev":"Dev (Instable)","UninstallPluginHeader":"D\u00e9sinstaller Plug-in","UninstallPluginConfirmation":"\u00cates-vous s\u00fbr de vouloir d\u00e9sinstaller {0}?","NoPluginConfigurationMessage":"Ce module d'extension n'a rien \u00e0 configurer.","NoPluginsInstalledMessage":"Vous n'avez aucun Plugin install\u00e9.","BrowsePluginCatalogMessage":"Explorer notre catalogue de Plugins disponibles."}
|
@ -1 +1 @@
|
||||
{"SettingsSaved":"\u05d4\u05d4\u05d2\u05d3\u05e8\u05d5\u05ea \u05e0\u05e9\u05de\u05e8\u05d5.","AddUser":"\u05d4\u05d5\u05e1\u05e3 \u05de\u05e9\u05ea\u05de\u05e9","Users":"\u05de\u05e9\u05ea\u05de\u05e9\u05d9\u05dd","Delete":"\u05de\u05d7\u05e7","Administrator":"\u05de\u05e0\u05d4\u05dc","Password":"\u05e1\u05d9\u05e1\u05de\u05d0","DeleteImage":"\u05de\u05d7\u05e7 \u05ea\u05de\u05d5\u05e0\u05d4","DeleteImageConfirmation":"\u05d4\u05d0\u05dd \u05d0\u05ea\u05d4 \u05d1\u05d8\u05d5\u05d7 \u05e9\u05d1\u05e8\u05e6\u05d5\u05e0\u05da \u05dc\u05de\u05d7\u05d5\u05e7 \u05ea\u05de\u05d5\u05e0\u05d4 \u05d6\u05d5?","FileReadCancelled":"\u05e7\u05e8\u05d9\u05d0\u05ea \u05d4\u05e7\u05d5\u05d1\u05e5 \u05d1\u05d5\u05d8\u05dc\u05d4.","FileNotFound":"\u05e7\u05d5\u05d1\u05e5 \u05dc\u05d0 \u05e0\u05de\u05e6\u05d0.","FileReadError":"\u05d7\u05dc\u05d4 \u05e9\u05d2\u05d9\u05d0\u05d4 \u05d1\u05e7\u05e8\u05d9\u05d0\u05ea \u05d4\u05e7\u05d5\u05d1\u05e5.","DeleteUser":"\u05de\u05d7\u05e7 \u05de\u05e9\u05ea\u05de\u05e9","DeleteUserConfirmation":"\u05d4\u05d0\u05dd \u05d0\u05ea\u05d4 \u05d1\u05d8\u05d5\u05d7 \u05db\u05d9 \u05d1\u05e8\u05e6\u05d5\u05e0\u05da \u05dc\u05de\u05d7\u05d5\u05e7 {0}?","PasswordResetHeader":"\u05d0\u05d9\u05e4\u05d5\u05e1 \u05e1\u05d9\u05e1\u05de\u05d0","PasswordResetComplete":"\u05d4\u05e1\u05d9\u05e1\u05de\u05d0 \u05d0\u05d5\u05e4\u05e1\u05d4.","PasswordResetConfirmation":"\u05d4\u05d0\u05dd \u05d0\u05ea\u05d4 \u05d1\u05d8\u05d5\u05d7 \u05e9\u05d1\u05e8\u05e6\u05d5\u05e0\u05da \u05dc\u05d0\u05e4\u05e1 \u05d0\u05ea \u05d4\u05e1\u05d9\u05e1\u05de\u05d0?","PasswordSaved":"\u05d4\u05e1\u05d9\u05e1\u05de\u05d0 \u05e0\u05e9\u05de\u05e8\u05d4.","PasswordMatchError":"\u05d4\u05e1\u05d9\u05e1\u05de\u05d0 \u05d5\u05d0\u05d9\u05de\u05d5\u05ea \u05d4\u05e1\u05d9\u05e1\u05de\u05d0 \u05e6\u05e8\u05d9\u05db\u05d5\u05ea \u05dc\u05d4\u05d9\u05d5\u05ea \u05d6\u05d4\u05d5\u05ea.","OptionOff":"\u05e1\u05db\u05d5\u05d9","OptionOn":"\u05e4\u05d5\u05e2\u05dc","OptionRelease":"\u05e9\u05d9\u05d7\u05e8\u05d5\u05e8 \u05e8\u05e9\u05de\u05d9","OptionBeta":"\u05d1\u05d8\u05d0","OptionDev":"\u05de\u05e4\u05ea\u05d7 (\u05dc\u05d0 \u05d9\u05e6\u05d9\u05d1)","UninstallPluginHeader":"\u05d4\u05e1\u05e8 \u05ea\u05d5\u05e1\u05e3","UninstallPluginConfirmation":"\u05d4\u05d0\u05dd \u05d0\u05ea\u05d4 \u05d1\u05d8\u05d5\u05d7 \u05e9\u05d1\u05e8\u05e6\u05d5\u05e0\u05da \u05dc\u05d4\u05e1\u05d9\u05e8 {0}?","NoPluginConfigurationMessage":"\u05dc\u05ea\u05d5\u05e1\u05e3 \u05d4\u05d6\u05d4 \u05d0\u05d9\u05df \u05d4\u05d2\u05d3\u05e8\u05d5\u05ea \u05de\u05d9\u05d5\u05d7\u05d3\u05d5\u05ea.","NoPluginsInstalledMessage":"\u05d0\u05d9\u05df \u05dc\u05da \u05ea\u05d5\u05e1\u05e4\u05d9\u05dd \u05de\u05d5\u05ea\u05e7\u05e0\u05d9\u05dd.","BrowsePluginCatalogMessage":"\u05e2\u05d1\u05d5\u05e8 \u05dc\u05e7\u05d8\u05dc\u05d5\u05d2 \u05d4\u05ea\u05d5\u05e1\u05e4\u05d9\u05dd \u05dc\u05e8\u05d0\u05d5\u05ea \u05d0\u05d9\u05dc\u05d5 \u05d6\u05de\u05d9\u05e0\u05d9\u05dd."}
|
||||
{"SettingsSaved":"\u05d4\u05d4\u05d2\u05d3\u05e8\u05d5\u05ea \u05e0\u05e9\u05de\u05e8\u05d5.","AddUser":"\u05d4\u05d5\u05e1\u05e3 \u05de\u05e9\u05ea\u05de\u05e9","Users":"\u05de\u05e9\u05ea\u05de\u05e9\u05d9\u05dd","Delete":"\u05de\u05d7\u05e7","Administrator":"\u05de\u05e0\u05d4\u05dc","Password":"\u05e1\u05d9\u05e1\u05de\u05d0","DeleteImage":"\u05de\u05d7\u05e7 \u05ea\u05de\u05d5\u05e0\u05d4","DeleteImageConfirmation":"\u05d4\u05d0\u05dd \u05d0\u05ea\u05d4 \u05d1\u05d8\u05d5\u05d7 \u05e9\u05d1\u05e8\u05e6\u05d5\u05e0\u05da \u05dc\u05de\u05d7\u05d5\u05e7 \u05ea\u05de\u05d5\u05e0\u05d4 \u05d6\u05d5?","FileReadCancelled":"\u05e7\u05e8\u05d9\u05d0\u05ea \u05d4\u05e7\u05d5\u05d1\u05e5 \u05d1\u05d5\u05d8\u05dc\u05d4.","FileNotFound":"\u05e7\u05d5\u05d1\u05e5 \u05dc\u05d0 \u05e0\u05de\u05e6\u05d0.","FileReadError":"\u05d7\u05dc\u05d4 \u05e9\u05d2\u05d9\u05d0\u05d4 \u05d1\u05e7\u05e8\u05d9\u05d0\u05ea \u05d4\u05e7\u05d5\u05d1\u05e5.","DeleteUser":"\u05de\u05d7\u05e7 \u05de\u05e9\u05ea\u05de\u05e9","DeleteUserConfirmation":"\u05d4\u05d0\u05dd \u05d0\u05ea\u05d4 \u05d1\u05d8\u05d5\u05d7 \u05db\u05d9 \u05d1\u05e8\u05e6\u05d5\u05e0\u05da \u05dc\u05de\u05d7\u05d5\u05e7 {0}?","PasswordResetHeader":"\u05d0\u05d9\u05e4\u05d5\u05e1 \u05e1\u05d9\u05e1\u05de\u05d0","PasswordResetComplete":"\u05d4\u05e1\u05d9\u05e1\u05de\u05d0 \u05d0\u05d5\u05e4\u05e1\u05d4.","PasswordResetConfirmation":"\u05d4\u05d0\u05dd \u05d0\u05ea\u05d4 \u05d1\u05d8\u05d5\u05d7 \u05e9\u05d1\u05e8\u05e6\u05d5\u05e0\u05da \u05dc\u05d0\u05e4\u05e1 \u05d0\u05ea \u05d4\u05e1\u05d9\u05e1\u05de\u05d0?","PasswordSaved":"\u05d4\u05e1\u05d9\u05e1\u05de\u05d0 \u05e0\u05e9\u05de\u05e8\u05d4.","PasswordMatchError":"\u05d4\u05e1\u05d9\u05e1\u05de\u05d0 \u05d5\u05d0\u05d9\u05de\u05d5\u05ea \u05d4\u05e1\u05d9\u05e1\u05de\u05d0 \u05e6\u05e8\u05d9\u05db\u05d5\u05ea \u05dc\u05d4\u05d9\u05d5\u05ea \u05d6\u05d4\u05d5\u05ea.","OptionOff":"\u05db\u05d1\u05d5\u05d9","OptionOn":"\u05e4\u05d5\u05e2\u05dc","OptionRelease":"\u05e9\u05d9\u05d7\u05e8\u05d5\u05e8 \u05e8\u05e9\u05de\u05d9","OptionBeta":"\u05d1\u05d8\u05d0","OptionDev":"\u05de\u05e4\u05ea\u05d7 (\u05dc\u05d0 \u05d9\u05e6\u05d9\u05d1)","UninstallPluginHeader":"\u05d4\u05e1\u05e8 \u05ea\u05d5\u05e1\u05e3","UninstallPluginConfirmation":"\u05d4\u05d0\u05dd \u05d0\u05ea\u05d4 \u05d1\u05d8\u05d5\u05d7 \u05e9\u05d1\u05e8\u05e6\u05d5\u05e0\u05da \u05dc\u05d4\u05e1\u05d9\u05e8 {0}?","NoPluginConfigurationMessage":"\u05dc\u05ea\u05d5\u05e1\u05e3 \u05d4\u05d6\u05d4 \u05d0\u05d9\u05df \u05d4\u05d2\u05d3\u05e8\u05d5\u05ea \u05de\u05d9\u05d5\u05d7\u05d3\u05d5\u05ea.","NoPluginsInstalledMessage":"\u05d0\u05d9\u05df \u05dc\u05da \u05ea\u05d5\u05e1\u05e4\u05d9\u05dd \u05de\u05d5\u05ea\u05e7\u05e0\u05d9\u05dd.","BrowsePluginCatalogMessage":"\u05e2\u05d1\u05d5\u05e8 \u05dc\u05e7\u05d8\u05dc\u05d5\u05d2 \u05d4\u05ea\u05d5\u05e1\u05e4\u05d9\u05dd \u05dc\u05e8\u05d0\u05d5\u05ea \u05d0\u05d9\u05dc\u05d5 \u05d6\u05de\u05d9\u05e0\u05d9\u05dd."}
|
@ -1 +1 @@
|
||||
{"SettingsSaved":"Instellingen opgeslagen.","AddUser":"Gebruiker toevoegen","Users":"Gebruikers","Delete":"Verwijderen","Administrator":"Beheerder","Password":"Wachtwoord","DeleteImage":"Verwijder afbeelding","DeleteImageConfirmation":"Weet je zeker dat je deze afbeelding wilt verwijderen?","FileReadCancelled":"Bestand lezen is geannuleerd.","FileNotFound":"Bestand niet gevonden.","FileReadError":"Er is een fout opgetreden bij het lezen van het bestand.","DeleteUser":"Verwijder gebruiker","DeleteUserConfirmation":"Weet je zeker dat je {0} wilt verwijderen?","PasswordResetHeader":"Wachtwoord opnieuw instellen","PasswordResetComplete":"Het wachtwoord is opnieuw ingesteld.","PasswordResetConfirmation":"Weet je zeker dat je het wachtwoord opnieuw in wilt stellen?","PasswordSaved":"Wachtwoord opgeslagen.","PasswordMatchError":"Wachtwoord en wachtwoord bevestiging moeten hetzelfde zijn.","OptionOff":"Uit","OptionOn":"Aan","OptionRelease":"Offici\u00eble Release","OptionBeta":"Beta","OptionDev":"Alpha (Onstabiel)","UninstallPluginHeader":"Plug-in de\u00efnstalleren","UninstallPluginConfirmation":"Weet u zeker dat u {0} wilt de\u00efnstalleren?","NoPluginConfigurationMessage":"Deze plug-in heeft niets in te stellen","NoPluginsInstalledMessage":"U heeft geen plug-ins ge\u00efnstalleerd","BrowsePluginCatalogMessage":"Bekijk de Plug-in catalogus voor beschikbare plug-ins."}
|
||||
{"SettingsSaved":"Instellingen opgeslagen.","AddUser":"Gebruiker toevoegen","Users":"Gebruikers","Delete":"Verwijderen","Administrator":"Beheerder","Password":"Wachtwoord","DeleteImage":"Verwijder afbeelding","DeleteImageConfirmation":"Weet je zeker dat je deze afbeelding wilt verwijderen?","FileReadCancelled":"Bestand lezen is geannuleerd.","FileNotFound":"Bestand niet gevonden.","FileReadError":"Er is een fout opgetreden bij het lezen van het bestand.","DeleteUser":"Verwijder gebruiker","DeleteUserConfirmation":"Weet je zeker dat je {0} wilt verwijderen?","PasswordResetHeader":"Wachtwoord opnieuw instellen","PasswordResetComplete":"Het wachtwoord is opnieuw ingesteld.","PasswordResetConfirmation":"Weet je zeker dat je het wachtwoord opnieuw in wilt stellen?","PasswordSaved":"Wachtwoord opgeslagen.","PasswordMatchError":"Wachtwoord en wachtwoord bevestiging moeten hetzelfde zijn.","OptionOff":"Uit","OptionOn":"Aan","OptionRelease":"Offici\u00eble Release","OptionBeta":"Beta","OptionDev":"Dev (Instabiel)","UninstallPluginHeader":"Plug-in de\u00efnstalleren","UninstallPluginConfirmation":"Weet u zeker dat u {0} wilt de\u00efnstalleren?","NoPluginConfigurationMessage":"Deze plug-in heeft niets in te stellen","NoPluginsInstalledMessage":"U heeft geen plug-ins ge\u00efnstalleerd","BrowsePluginCatalogMessage":"Bekijk de Plug-in catalogus voor beschikbare plug-ins."}
|
@ -1 +1 @@
|
||||
{"SettingsSaved":"Configura\u00e7\u00f5es guardadas.","AddUser":"Adicionar Utilizador","Users":"Utilizadores","Delete":"Apagar","Administrator":"Administrador","Password":"Senha","DeleteImage":"Apagar Imagem","DeleteImageConfirmation":"Tem a certeza que deseja apagar a imagem?","FileReadCancelled":"A leitura do ficheiro foi cancelada.","FileNotFound":"Ficheiro n\u00e3o encontrado.","FileReadError":"Ocorreu um erro ao ler o ficheiro.","DeleteUser":"Apagar Utilizador","DeleteUserConfirmation":"Tem a certeza que deseja apagar {0}?","PasswordResetHeader":"Redefinir Senha","PasswordResetComplete":"A senha foi redefinida.","PasswordResetConfirmation":"Tem a certeza que deseja redefinir a senha?","PasswordSaved":"Senha guardada.","PasswordMatchError":"A senha e a confirma\u00e7\u00e3o da senha devem coincidir.","OptionOff":"Desligado","OptionOn":"Ligado","OptionRelease":"Lan\u00e7amento Oficial","OptionBeta":"Beta","OptionDev":"Dev (Inst\u00e1vel)","UninstallPluginHeader":"Desinstalar extens\u00e3o","UninstallPluginConfirmation":"Tem a certeza que deseja desinstalar {0}?","NoPluginConfigurationMessage":"Esta extens\u00e3o n\u00e3o \u00e9 configur\u00e1vel.","NoPluginsInstalledMessage":"N\u00e3o tem extens\u00f5es instaladas.","BrowsePluginCatalogMessage":"Navegue o nosso cat\u00e1logo de extens\u00f5es, para ver as extens\u00f5es dispon\u00edveis."}
|
||||
{"SettingsSaved":"Configura\u00e7\u00f5es guardadas.","AddUser":"Adicionar Utilizador","Users":"Utilizadores","Delete":"Apagar","Administrator":"Administrador","Password":"Senha","DeleteImage":"Apagar Imagem","DeleteImageConfirmation":"Tem a certeza que deseja apagar a imagem?","FileReadCancelled":"A leitura do ficheiro foi cancelada.","FileNotFound":"Ficheiro n\u00e3o encontrado.","FileReadError":"Ocorreu um erro ao ler o ficheiro.","DeleteUser":"Apagar Utilizador","DeleteUserConfirmation":"Tem a certeza que deseja apagar {0}?","PasswordResetHeader":"Redefinir Senha","PasswordResetComplete":"A senha foi redefinida.","PasswordResetConfirmation":"Tem a certeza que deseja redefinir a senha?","PasswordSaved":"Senha guardada.","PasswordMatchError":"A senha e a confirma\u00e7\u00e3o da senha devem coincidir.","OptionOff":"Desligar","OptionOn":"Ligar","OptionRelease":"Lan\u00e7amento Oficial","OptionBeta":"Beta","OptionDev":"Dev (Inst\u00e1vel)","UninstallPluginHeader":"Desinstalar extens\u00e3o","UninstallPluginConfirmation":"Tem a certeza que deseja desinstalar {0}?","NoPluginConfigurationMessage":"Esta extens\u00e3o n\u00e3o \u00e9 configur\u00e1vel.","NoPluginsInstalledMessage":"N\u00e3o tem extens\u00f5es instaladas.","BrowsePluginCatalogMessage":"Navegue o nosso cat\u00e1logo de extens\u00f5es, para ver as extens\u00f5es dispon\u00edveis."}
|
@ -1 +1 @@
|
||||
{"SettingsSaved":"\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u044b","AddUser":"\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f","Users":"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438","Delete":"\u0423\u0434\u0430\u043b\u0438\u0442\u044c","Administrator":"\u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440","Password":"\u041f\u0430\u0440\u043e\u043b\u044c","DeleteImage":"\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435","DeleteImageConfirmation":"\u0412\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0436\u0435\u043b\u0430\u0435\u0442\u0435 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435?","FileReadCancelled":"\u0427\u0442\u0435\u043d\u0438\u0435 \u0444\u0430\u0439\u043b\u0430 \u0431\u044b\u043b\u043e \u043e\u0442\u043c\u0435\u043d\u0435\u043d\u043e","FileNotFound":"\u0424\u0430\u0439\u043b \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d","FileReadError":"\u0412\u043e \u0432\u0440\u0435\u043c\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u0444\u0430\u0439\u043b\u0430 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0430 \u043e\u0448\u0438\u0431\u043a\u0430","DeleteUser":"\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f","DeleteUserConfirmation":"\u0412\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0436\u0435\u043b\u0430\u0435\u0442\u0435 \u0443\u0434\u0430\u043b\u0438\u0442\u044c {0}?","PasswordResetHeader":"\u0421\u0431\u0440\u043e\u0441 \u043f\u0430\u0440\u043e\u043b\u044f","PasswordResetComplete":"\u041f\u0430\u0440\u043e\u043b\u044c \u0431\u044b\u043b \u0441\u0431\u0440\u043e\u0448\u0435\u043d","PasswordResetConfirmation":"\u0412\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0436\u0435\u043b\u0430\u0435\u0442\u0435 \u0441\u0431\u0440\u043e\u0441\u0438\u0442\u044c \u043f\u0430\u0440\u043e\u043b\u044c?","PasswordSaved":"\u041f\u0430\u0440\u043e\u043b\u044c \u0441\u043e\u0445\u0440\u0430\u043d\u0451\u043d","PasswordMatchError":"\u041f\u043e\u043b\u044f \u041f\u0430\u0440\u043e\u043b\u044c \u0438 \u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f \u043f\u0430\u0440\u043e\u043b\u044f \u0434\u043e\u043b\u0436\u043d\u044b \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0442\u044c","OptionOff":"\u0412\u044b\u043a\u043b","OptionOn":"\u0412\u043a\u043b","OptionRelease":"\u041e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u0432\u044b\u043f\u0443\u0441\u043a","OptionBeta":"\u0411\u0435\u0442\u0430","OptionDev":"\u0420\u0430\u0437\u0440\u0430\u0431 (\u043d\u0435\u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e)","UninstallPluginHeader":"\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u043f\u043b\u0430\u0433\u0438\u043d","UninstallPluginConfirmation":"\u0412\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0436\u0435\u043b\u0430\u0435\u0442\u0435 \u0443\u0434\u0430\u043b\u0438\u0442\u044c {0}?","NoPluginConfigurationMessage":"\u0414\u043b\u044f \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u043b\u0430\u0433\u0438\u043d\u0430 \u043d\u0435\u0447\u0435\u0433\u043e \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c.","NoPluginsInstalledMessage":"\u0423 \u0412\u0430\u0441 \u043d\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043e \u043d\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u043f\u043b\u0430\u0433\u0438\u043d\u0430.","BrowsePluginCatalogMessage":"\u041e\u0437\u043d\u0430\u043a\u043e\u043c\u044c\u0442\u0435\u0441\u044c \u0441 \u043d\u0430\u0448\u0438\u043c \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u043e\u043c \u0434\u043b\u044f \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432."}
|
||||
{"SettingsSaved":"\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u044b","AddUser":"\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f","Users":"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438","Delete":"\u0423\u0434\u0430\u043b\u0438\u0442\u044c","Administrator":"\u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440","Password":"\u041f\u0430\u0440\u043e\u043b\u044c","DeleteImage":"\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435","DeleteImageConfirmation":"\u0412\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0436\u0435\u043b\u0430\u0435\u0442\u0435 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435?","FileReadCancelled":"\u0427\u0442\u0435\u043d\u0438\u0435 \u0444\u0430\u0439\u043b\u0430 \u0431\u044b\u043b\u043e \u043e\u0442\u043c\u0435\u043d\u0435\u043d\u043e.","FileNotFound":"\u0424\u0430\u0439\u043b \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d","FileReadError":"\u0412\u043e \u0432\u0440\u0435\u043c\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u0444\u0430\u0439\u043b\u0430 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0430 \u043e\u0448\u0438\u0431\u043a\u0430","DeleteUser":"\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f","DeleteUserConfirmation":"\u0412\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0436\u0435\u043b\u0430\u0435\u0442\u0435 \u0443\u0434\u0430\u043b\u0438\u0442\u044c {0}?","PasswordResetHeader":"\u0421\u0431\u0440\u043e\u0441 \u043f\u0430\u0440\u043e\u043b\u044f","PasswordResetComplete":"\u041f\u0430\u0440\u043e\u043b\u044c \u0431\u044b\u043b \u0441\u0431\u0440\u043e\u0448\u0435\u043d","PasswordResetConfirmation":"\u0412\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0436\u0435\u043b\u0430\u0435\u0442\u0435 \u0441\u0431\u0440\u043e\u0441\u0438\u0442\u044c \u043f\u0430\u0440\u043e\u043b\u044c?","PasswordSaved":"\u041f\u0430\u0440\u043e\u043b\u044c \u0441\u043e\u0445\u0440\u0430\u043d\u0451\u043d","PasswordMatchError":"\u041f\u043e\u043b\u044f \u041f\u0430\u0440\u043e\u043b\u044c \u0438 \u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f \u043f\u0430\u0440\u043e\u043b\u044f \u0434\u043e\u043b\u0436\u043d\u044b \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0442\u044c","OptionOff":"\u0412\u044b\u043a\u043b","OptionOn":"\u0412\u043a\u043b","OptionRelease":"\u041e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u0432\u044b\u043f\u0443\u0441\u043a","OptionBeta":"\u0411\u0435\u0442\u0430","OptionDev":"\u0420\u0430\u0437\u0440\u0430\u0431 (\u043d\u0435\u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e)","UninstallPluginHeader":"\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u043f\u043b\u0430\u0433\u0438\u043d","UninstallPluginConfirmation":"\u0412\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0436\u0435\u043b\u0430\u0435\u0442\u0435 \u0443\u0434\u0430\u043b\u0438\u0442\u044c {0}?","NoPluginConfigurationMessage":"\u0414\u043b\u044f \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u043b\u0430\u0433\u0438\u043d\u0430 \u043d\u0435\u0447\u0435\u0433\u043e \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c.","NoPluginsInstalledMessage":"\u0423 \u0412\u0430\u0441 \u043d\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043e \u043d\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u043f\u043b\u0430\u0433\u0438\u043d\u0430.","BrowsePluginCatalogMessage":"\u041e\u0437\u043d\u0430\u043a\u043e\u043c\u044c\u0442\u0435\u0441\u044c \u0441 \u043d\u0430\u0448\u0438\u043c \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u043e\u043c \u0434\u043b\u044f \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432."}
|
@ -0,0 +1 @@
|
||||
{"SettingsSaved":"Inst\u00e4llningarna sparade.","AddUser":"Skapa anv\u00e4ndare","Users":"Anv\u00e4ndare","Delete":"Ta bort","Administrator":"Administrat\u00f6r","Password":"L\u00f6senord","DeleteImage":"Ta bort bild","DeleteImageConfirmation":"\u00c4r du s\u00e4ker p\u00e5 att du vill ta bort den h\u00e4r bilden?","FileReadCancelled":"Inl\u00e4sningen av filen har avbrutits.","FileNotFound":"Kan inte hitta filen.","FileReadError":"Ett fel intr\u00e4ffade vid inl\u00e4sningen av filen.","DeleteUser":"Ta bort anv\u00e4ndare","DeleteUserConfirmation":"\u00c4r du s\u00e4ker p\u00e5 att du vill ta bort {0}?","PasswordResetHeader":"\u00c5terst\u00e4ll l\u00f6senordet","PasswordResetComplete":"L\u00f6senordet har \u00e5terst\u00e4llts.","PasswordResetConfirmation":"\u00c4r du s\u00e4ker p\u00e5 att du vill \u00e5terst\u00e4lla l\u00f6senordet?","PasswordSaved":"L\u00f6senordet har sparats.","PasswordMatchError":"L\u00f6senordet och bekr\u00e4ftelsen m\u00e5ste \u00f6verensst\u00e4mma.","OptionOff":"Av","OptionOn":"P\u00e5","OptionRelease":"Officiell version","OptionBeta":"Betaversion","OptionDev":"Utvecklarversion (instabil)","UninstallPluginHeader":"Avinstallera till\u00e4gg","UninstallPluginConfirmation":"\u00c4r du s\u00e4ker p\u00e5 att du vill avinstallera {0}?","NoPluginConfigurationMessage":"Detta till\u00e4gg har inga inst\u00e4llningar.","NoPluginsInstalledMessage":"Du har inte installerat n\u00e5gra till\u00e4gg.","BrowsePluginCatalogMessage":"Bes\u00f6k katalogen f\u00f6r att se tillg\u00e4ngliga till\u00e4gg."}
|
@ -336,7 +336,9 @@ namespace MediaBrowser.Server.Implementations.Localization
|
||||
new LocalizatonOption{ Name="Arabic", Value="ar"},
|
||||
new LocalizatonOption{ Name="English (United Kingdom)", Value="en-GB"},
|
||||
new LocalizatonOption{ Name="English (United States)", Value="en-us"},
|
||||
new LocalizatonOption{ Name="Catalan", Value="ca"},
|
||||
new LocalizatonOption{ Name="Chinese Traditional", Value="zh-TW"},
|
||||
new LocalizatonOption{ Name="Czech", Value="cs"},
|
||||
new LocalizatonOption{ Name="Dutch", Value="nl"},
|
||||
new LocalizatonOption{ Name="French", Value="fr"},
|
||||
new LocalizatonOption{ Name="German", Value="de"},
|
||||
@ -348,7 +350,8 @@ namespace MediaBrowser.Server.Implementations.Localization
|
||||
new LocalizatonOption{ Name="Portuguese (Portugal)", Value="pt-PT"},
|
||||
new LocalizatonOption{ Name="Russian", Value="ru"},
|
||||
new LocalizatonOption{ Name="Spanish", Value="es"},
|
||||
new LocalizatonOption{ Name="Spanish (Mexico)", Value="es-MX"}
|
||||
new LocalizatonOption{ Name="Spanish (Mexico)", Value="es-MX"},
|
||||
new LocalizatonOption{ Name="Swedish", Value="sv"}
|
||||
|
||||
}.OrderBy(i => i.Name);
|
||||
}
|
||||
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -35,6 +35,7 @@
|
||||
"LabelEnableAutomaticPortMappingHelp": "UPnP allows automated router configuration for easy remote access. This may not work with some router models.",
|
||||
"ButtonOk": "Ok",
|
||||
"ButtonCancel": "Cancel",
|
||||
"ButtonNew": "New",
|
||||
"HeaderSetupLibrary": "Setup your media library",
|
||||
"ButtonAddMediaFolder": "Add media folder",
|
||||
"LabelFolderType": "Folder type:",
|
||||
@ -52,6 +53,9 @@
|
||||
"TabLibraryAccess": "Library Access",
|
||||
"TabImage": "Image",
|
||||
"TabProfile": "Profile",
|
||||
"TabMetadata": "Metadata",
|
||||
"TabImages": "Images",
|
||||
"TabCollectionTitles": "Titles",
|
||||
"LabelDisplayMissingEpisodesWithinSeasons": "Display missing episodes within seasons",
|
||||
"LabelUnairedMissingEpisodesWithinSeasons": "Display unaired episodes within seasons",
|
||||
"HeaderVideoPlaybackSettings": "Video Playback Settings",
|
||||
@ -124,9 +128,11 @@
|
||||
"OptionTrackName": "Track Name",
|
||||
"OptionCommunityRating": "Community Rating",
|
||||
"OptionNameSort": "Name",
|
||||
"OptionFolderSort": "Folders",
|
||||
"OptionBudget": "Budget",
|
||||
"OptionRevenue": "Revenue",
|
||||
"OptionPoster": "Poster",
|
||||
"OptionBackdrop": "Backdrop",
|
||||
"OptionTimeline": "Timeline",
|
||||
"OptionThumb": "Thumb",
|
||||
"OptionBanner": "Banner",
|
||||
@ -212,8 +218,8 @@
|
||||
"OptionIsHD": "HD",
|
||||
"OptionIsSD": "SD",
|
||||
"OptionMetascore": "Metascore",
|
||||
"OptionImdbRating": "IMDb rating",
|
||||
"ButtonSelect": "Select",
|
||||
"ButtonSearch": "Search",
|
||||
"ButtonGroupVersions": "Group Versions",
|
||||
"PismoMessage": "Utilizing Pismo File Mount through a donated license.",
|
||||
"PleaseSupportOtherProduces": "Please support other free products we utilize:",
|
||||
@ -300,7 +306,149 @@
|
||||
"ButtonEdit": "Edit",
|
||||
"ButtonRecord": "Record",
|
||||
"ButtonDelete": "Delete",
|
||||
"ButtonRemove": "Remove",
|
||||
"OptionRecordSeries": "Record Series",
|
||||
"HeaderDetails": "Details",
|
||||
"ButtonCancelRecording": "Cancel Recording"
|
||||
"ButtonCancelRecording": "Cancel Recording",
|
||||
"TitleLiveTV": "Live TV",
|
||||
"LabelNumberOfGuideDays": "Number of days of guide data to download:",
|
||||
"LabelNumberOfGuideDaysHelp": "Downloading more days worth of guide data provides the ability to schedule out further in advance and view more listings, but it will also take longer to download. Auto will choose based on the number of channels.",
|
||||
"LabelActiveService": "Active Service:",
|
||||
"LabelActiveServiceHelp": "Multiple tv plugins can be installed but only one can be active at a time.",
|
||||
"OptionAutomatic": "Auto",
|
||||
"LiveTvPluginRequired": "A Live TV service provider plugin is required in order to continue.",
|
||||
"LiveTvPluginRequiredHelp": "Please install one of our available plugins, such as Next Pvr or ServerWmc.",
|
||||
"HeaderCustomizeOptionsPerMediaType": "Customize options per media type",
|
||||
"OptionDownloadThumbImage": "Thumb",
|
||||
"OptionDownloadMenuImage": "Menu",
|
||||
"OptionDownloadLogoImage": "Logo",
|
||||
"OptionDownloadBoxImage": "Box",
|
||||
"OptionDownloadDiscImage": "Disc",
|
||||
"OptionDownloadBannerImage": "Banner",
|
||||
"OptionDownloadBackImage": "Back",
|
||||
"OptionDownloadArtImage": "Art",
|
||||
"OptionDownloadPrimaryImage": "Primary",
|
||||
"HeaderFetchImages": "Fetch Images:",
|
||||
"HeaderImageSettings": "Image Settings",
|
||||
"LabelMaxBackdropsPerItem": "Maximum number of backdrops per item:",
|
||||
"LabelMaxScreenshotsPerItem": "Maximum number of screenshots per item:",
|
||||
"LabelMinBackdropDownloadWidth": "Minimum backdrop download width:",
|
||||
"LabelMinScreenshotDownloadWidth": "Minimum screenshot download width:",
|
||||
"ButtonAddScheduledTaskTrigger": "Add Task Trigger",
|
||||
"HeaderAddScheduledTaskTrigger": "Add Task Trigger",
|
||||
"ButtonAdd": "Add",
|
||||
"LabelTriggerType": "Trigger Type:",
|
||||
"OptionDaily": "Daily",
|
||||
"OptionWeekly": "Weekly",
|
||||
"OptionOnInterval": "On an interval",
|
||||
"OptionOnAppStartup": "On application startup",
|
||||
"OptionAfterSystemEvent": "After a system event",
|
||||
"LabelDay": "Day:",
|
||||
"LabelTime": "Time:",
|
||||
"LabelEvent": "Event:",
|
||||
"OptionWakeFromSleep": "Wake from sleep",
|
||||
"LabelEveryXMinutes": "Every:",
|
||||
"HeaderTvTuners": "Tuners",
|
||||
"HeaderGallery": "Gallery",
|
||||
"HeaderLatestGames": "Latest Games",
|
||||
"HeaderRecentlyPlayedGames": "Recently Played Games",
|
||||
"TabGameSystems": "Game Systems",
|
||||
"TitleMediaLibrary": "Media Library",
|
||||
"TabFolders": "Folders",
|
||||
"TabPathSubstitution": "Path Substitution",
|
||||
"LabelSeasonZeroDisplayName": "Season 0 display name:",
|
||||
"LabelEnableRealtimeMonitor": "Enable real time monitoring",
|
||||
"LabelEnableRealtimeMonitorHelp": "Changes will be processed immediately, on supported file systems.",
|
||||
"ButtonScanLibrary": "Scan Library",
|
||||
"HeaderNumberOfPlayers": "Players:",
|
||||
"OptionAnyNumberOfPlayers": "Any",
|
||||
"Option1Player": "1+",
|
||||
"Option2Player": "2+",
|
||||
"Option3Player": "3+",
|
||||
"Option4Player": "4+",
|
||||
"HeaderMediaFolders": "Media Folders",
|
||||
"HeaderThemeVideos": "Theme Videos",
|
||||
"HeaderThemeSongs": "Theme Songs",
|
||||
"HeaderScenes": "Scenes",
|
||||
"HeaderAwardsAndReviews": "Awards and Reviews",
|
||||
"HeaderSoundtracks": "Soundtracks",
|
||||
"HeaderMusicVideos": "Music Videos",
|
||||
"HeaderSpecialFeatures": "Special Features",
|
||||
"HeaderCastCrew": "Cast & Crew",
|
||||
"HeaderAdditionalParts": "Additional Parts",
|
||||
"ButtonSplitVersionsApart": "Split Versions Apart",
|
||||
"ButtonPlayTrailer": "Trailer",
|
||||
"LabelMissing": "Missing",
|
||||
"LabelOffline": "Offline",
|
||||
"PathSubstitutionHelp": "Path substitutions are used for mapping a path on the server to a path that clients are able to access. By allowing clients direct access to media on the server they may be able to play them directly over the network and avoid using server resources to stream and transcode them.",
|
||||
"HeaderFrom": "From",
|
||||
"HeaderTo": "To",
|
||||
"LabelFrom": "From:",
|
||||
"LabelFromHelp": "Example: D:\\Movies (on the server)",
|
||||
"LabelTo": "To:",
|
||||
"LabelToHelp": "Example: \\\\MyServer\\Movies (a path clients can access)",
|
||||
"ButtonAddPathSubstitution": "Add Substitution",
|
||||
"OptionSpecialEpisode": "Specials",
|
||||
"OptionMissingEpisode": "Missing Episodes",
|
||||
"OptionUnairedEpisode": "Unaired Episodes",
|
||||
"OptionEpisodeSortName": "Episode Sort Name",
|
||||
"OptionSeriesSortName": "Series Name",
|
||||
"OptionTvdbRating": "Tvdb Rating",
|
||||
"HeaderTranscodingQualityPreference": "Transcoding Quality Preference:",
|
||||
"OptionAutomaticTranscodingHelp": "The server will decide quality and speed",
|
||||
"OptionHighSpeedTranscodingHelp": "Lower quality, but faster encoding",
|
||||
"OptionHighQualityTranscodingHelp": "Higher quality, but slower encoding",
|
||||
"OptionMaxQualityTranscodingHelp": "Best quality with slower encoding and high CPU usage",
|
||||
"OptionHighSpeedTranscoding": "Higher speed",
|
||||
"OptionHighQualityTranscoding": "Higher quality",
|
||||
"OptionMaxQualityTranscoding": "Max quality",
|
||||
"OptionEnableDebugTranscodingLogging": "Enable debug transcoding logging",
|
||||
"OptionEnableDebugTranscodingLoggingHelp": "This will create very large log files and is only recommended as needed for troubleshooting purposes.",
|
||||
"OptionEnableDebugTranscodingLogging": "Enable debug transcoding logging",
|
||||
"OptionUpscaling": "Allow clients to request upscaled video",
|
||||
"OptionUpscalingHelp": "In some cases this will result in improved video quality but will increase CPU usage.",
|
||||
"EditCollectionItemsHelp": "Add or remove any movies, series, albums, books or games you wish to group within this collection.",
|
||||
"HeaderAddTitles": "Add Titles",
|
||||
"LabelEnableDlnaPlayTo": "Enable DLNA Play To",
|
||||
"LabelEnableDlnaPlayToHelp": "Media Browser can detect devices within your network and offer the ability to remote control them.",
|
||||
"LabelEnableDlnaDebugLogging": "Enable DLNA debug logging",
|
||||
"LabelEnableDlnaDebugLoggingHelp": "This will create large log files and should only be used as needed for troubleshooting purposes.",
|
||||
"LabelEnableDlnaClientDiscoveryInterval": "Client discovery interval (seconds)",
|
||||
"LabelEnableDlnaClientDiscoveryIntervalHelp": "Determines the duration in seconds of the interval between SSDP searches performed by Media Browser.",
|
||||
"HeaderCustomDlnaProfiles": "Custom Profiles",
|
||||
"HeaderSystemDlnaProfiles": "System Profiles",
|
||||
"CustomDlnaProfilesHelp": "Create a custom profile to target a new device or override a system profile.",
|
||||
"SystemDlnaProfilesHelp": "System profiles are read-only. To override a system profile, create a custom profile targeting the same device.",
|
||||
"TitleDashboard": "Dashboard",
|
||||
"TabHome": "Home",
|
||||
"TabInfo": "Info",
|
||||
"HeaderLinks": "Links",
|
||||
"HeaderSystemPaths": "System Paths",
|
||||
"LinkCommunity": "Community",
|
||||
"LinkGithub": "Github",
|
||||
"LinkApiDocumentation": "Api Documentation",
|
||||
"LabelFriendlyServerName": "Friendly server name:",
|
||||
"LabelFriendlyServerNameHelp": "This name will be used to identify this server. If left blank, the computer name will be used.",
|
||||
"LabelPreferredDisplayLanguage": "Preferred display language",
|
||||
"LabelPreferredDisplayLanguageHelp": "Translating Media Browser is an ongoing project and is not yet complete.",
|
||||
"LabelReadHowYouCanContribute": "Read about how you can contribute.",
|
||||
"HeaderNewCollection": "New Collection",
|
||||
"NewCollectionNameExample": "Example: Star Wars Collection",
|
||||
"OptionSearchForInternetMetadata": "Search the internet for artwork and metadata",
|
||||
"ButtonCreate": "Create",
|
||||
"LabelHttpServerPortNumber": "Http server port number:",
|
||||
"LabelWebSocketPortNumber": "Web socket port number:",
|
||||
"LabelEnableAutomaticPortMapping": "Enable automatic port mapping",
|
||||
"LabelEnableAutomaticPortHelp": "UPnP allows automated router configuration for remote access. This may not work with some router models.",
|
||||
"LabelExternalDDNS": "External DDNS:",
|
||||
"LabelExternalDDNSHelp": "If you have a dynamic DNS enter it here. Media Browser apps will use it when connecting remotely.",
|
||||
"TabResume": "Resume",
|
||||
"TabWeather": "Weather",
|
||||
"TitleAppSettings": "App Settings",
|
||||
"LabelMinResumePercentage": "Min resume percentage:",
|
||||
"LabelMaxResumePercentage": "Max resume percentage:",
|
||||
"LabelMinResumeDuration": "Min resume duration (seconds):",
|
||||
"LabelMinResumePercentageHelp": "Titles are assumed unplayed if stopped before this time",
|
||||
"LabelMaxResumePercentageHelp": "Titles are assumed fully played if stopped after this time",
|
||||
"LabelMinResumeDurationHelp": "Titles shorter than this will not be resumable"
|
||||
}
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -315,6 +315,10 @@
|
||||
<EmbeddedResource Include="Localization\Server\nb.json" />
|
||||
<EmbeddedResource Include="Localization\JavaScript\el.json" />
|
||||
<EmbeddedResource Include="Localization\Server\en_GB.json" />
|
||||
<EmbeddedResource Include="Localization\JavaScript\sv.json" />
|
||||
<EmbeddedResource Include="Localization\Server\sv.json" />
|
||||
<EmbeddedResource Include="Localization\JavaScript\cs.json" />
|
||||
<EmbeddedResource Include="Localization\Server\cs.json" />
|
||||
<None Include="packages.config" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
|
@ -223,6 +223,9 @@ MediaBrowser.ApiClient = function ($, navigator, JSON, WebSocket, setTimeout, wi
|
||||
if (!userId) {
|
||||
throw new Error("null userId");
|
||||
}
|
||||
if (!itemId) {
|
||||
throw new Error("null itemId");
|
||||
}
|
||||
|
||||
var url = self.getUrl("Users/" + userId + "/Items/" + itemId);
|
||||
|
||||
|
@ -2,7 +2,7 @@
|
||||
<package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd">
|
||||
<metadata>
|
||||
<id>MediaBrowser.Common.Internal</id>
|
||||
<version>3.0.348</version>
|
||||
<version>3.0.349</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.348" />
|
||||
<dependency id="MediaBrowser.Common" version="3.0.349" />
|
||||
<dependency id="NLog" version="2.1.0" />
|
||||
<dependency id="SimpleInjector" version="2.4.1" />
|
||||
<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.348</version>
|
||||
<version>3.0.349</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/2010/07/nuspec.xsd">
|
||||
<metadata>
|
||||
<id>MediaBrowser.Server.Core</id>
|
||||
<version>3.0.348</version>
|
||||
<version>3.0.349</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.348" />
|
||||
<dependency id="MediaBrowser.Common" version="3.0.349" />
|
||||
</dependencies>
|
||||
</metadata>
|
||||
<files>
|
||||
|
Loading…
Reference in New Issue
Block a user