diff --git a/MediaBrowser.Api/ChannelService.cs b/MediaBrowser.Api/ChannelService.cs index 3736814e57..2dfa0918d6 100644 --- a/MediaBrowser.Api/ChannelService.cs +++ b/MediaBrowser.Api/ChannelService.cs @@ -9,6 +9,7 @@ using System; using System.Collections.Generic; using System.Linq; using System.Threading; +using System.Threading.Tasks; namespace MediaBrowser.Api { @@ -198,14 +199,14 @@ namespace MediaBrowser.Api return ToOptimizedResult(result); } - public object Get(GetChannelFolder request) + public async Task Get(GetChannelFolder request) { - return ToOptimizedResult(_channelManager.GetChannelFolder(request.UserId, CancellationToken.None).Result); + return ToOptimizedResult(await _channelManager.GetChannelFolder(request.UserId, CancellationToken.None).ConfigureAwait(false)); } - - public object Get(GetChannels request) + + public async Task Get(GetChannels request) { - var result = _channelManager.GetChannels(new ChannelQuery + var result = await _channelManager.GetChannels(new ChannelQuery { Limit = request.Limit, StartIndex = request.StartIndex, @@ -213,14 +214,14 @@ namespace MediaBrowser.Api SupportsLatestItems = request.SupportsLatestItems, IsFavorite = request.IsFavorite - }, CancellationToken.None).Result; + }, CancellationToken.None).ConfigureAwait(false); return ToOptimizedResult(result); } - public object Get(GetChannelItems request) + public async Task Get(GetChannelItems request) { - var result = _channelManager.GetChannelItems(new ChannelItemQuery + var result = await _channelManager.GetChannelItems(new ChannelItemQuery { Limit = request.Limit, StartIndex = request.StartIndex, @@ -232,14 +233,14 @@ namespace MediaBrowser.Api Filters = request.GetFilters().ToArray(), Fields = request.GetItemFields().ToArray() - }, CancellationToken.None).Result; + }, CancellationToken.None).ConfigureAwait(false); return ToOptimizedResult(result); } - public object Get(GetLatestChannelItems request) + public async Task Get(GetLatestChannelItems request) { - var result = _channelManager.GetLatestChannelItems(new AllChannelMediaQuery + var result = await _channelManager.GetLatestChannelItems(new AllChannelMediaQuery { Limit = request.Limit, StartIndex = request.StartIndex, @@ -248,7 +249,7 @@ namespace MediaBrowser.Api Filters = request.GetFilters().ToArray(), Fields = request.GetItemFields().ToList() - }, CancellationToken.None).Result; + }, CancellationToken.None).ConfigureAwait(false); return ToOptimizedResult(result); } diff --git a/MediaBrowser.Api/ConfigurationService.cs b/MediaBrowser.Api/ConfigurationService.cs index 29848cfc04..1e7f9d8b06 100644 --- a/MediaBrowser.Api/ConfigurationService.cs +++ b/MediaBrowser.Api/ConfigurationService.cs @@ -1,5 +1,4 @@ -using System; -using MediaBrowser.Common.Extensions; +using MediaBrowser.Common.Extensions; using MediaBrowser.Common.IO; using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Library; @@ -10,6 +9,7 @@ using MediaBrowser.Model.Serialization; using ServiceStack; using ServiceStack.Text.Controller; using ServiceStack.Web; +using System; using System.Collections.Generic; using System.IO; using System.Linq; diff --git a/MediaBrowser.Api/Dlna/DlnaServerService.cs b/MediaBrowser.Api/Dlna/DlnaServerService.cs index 82bd394f0c..c6066f0643 100644 --- a/MediaBrowser.Api/Dlna/DlnaServerService.cs +++ b/MediaBrowser.Api/Dlna/DlnaServerService.cs @@ -109,16 +109,16 @@ namespace MediaBrowser.Api.Dlna return ResultFactory.GetResult(xml, "text/xml"); } - public object Post(ProcessContentDirectoryControlRequest request) + public async Task Post(ProcessContentDirectoryControlRequest request) { - var response = PostAsync(request.RequestStream, _contentDirectory).Result; + var response = await PostAsync(request.RequestStream, _contentDirectory).ConfigureAwait(false); return ResultFactory.GetResult(response.Xml, "text/xml"); } - public object Post(ProcessConnectionManagerControlRequest request) + public async Task Post(ProcessConnectionManagerControlRequest request) { - var response = PostAsync(request.RequestStream, _connectionManager).Result; + var response = await PostAsync(request.RequestStream, _connectionManager).ConfigureAwait(false); return ResultFactory.GetResult(response.Xml, "text/xml"); } diff --git a/MediaBrowser.Api/Images/RemoteImageService.cs b/MediaBrowser.Api/Images/RemoteImageService.cs index c765063577..06b99e1751 100644 --- a/MediaBrowser.Api/Images/RemoteImageService.cs +++ b/MediaBrowser.Api/Images/RemoteImageService.cs @@ -203,9 +203,7 @@ namespace MediaBrowser.Api.Images { var item = _libraryManager.GetItemById(request.Id); - var result = GetRemoteImageResult(item, request); - - return ToOptimizedSerializedResultUsingCache(result); + return GetRemoteImageResult(item, request); } public object Get(GetItemByNameRemoteImages request) @@ -218,16 +216,16 @@ namespace MediaBrowser.Api.Images return GetRemoteImageResult(item, request); } - private RemoteImageResult GetRemoteImageResult(BaseItem item, BaseRemoteImageRequest request) + private async Task GetRemoteImageResult(BaseItem item, BaseRemoteImageRequest request) { - var images = _providerManager.GetAvailableRemoteImages(item, new RemoteImageQuery + var images = await _providerManager.GetAvailableRemoteImages(item, new RemoteImageQuery { ProviderName = request.ProviderName, IncludeAllLanguages = request.IncludeAllLanguages, IncludeDisabledProviders = true, ImageType = request.Type - }, CancellationToken.None).Result; + }, CancellationToken.None).ConfigureAwait(false); var imagesList = images.ToList(); @@ -306,19 +304,7 @@ namespace MediaBrowser.Api.Images /// /// The request. /// System.Object. - public object Get(GetRemoteImage request) - { - var task = GetRemoteImage(request); - - return task.Result; - } - - /// - /// Gets the remote image. - /// - /// The request. - /// Task{System.Object}. - private async Task GetRemoteImage(GetRemoteImage request) + public async Task Get(GetRemoteImage request) { var urlHash = request.ImageUrl.GetMD5(); var pointerCachePath = GetFullCachePath(urlHash.ToString()); diff --git a/MediaBrowser.Api/LiveTv/LiveTvService.cs b/MediaBrowser.Api/LiveTv/LiveTvService.cs index 497f2d0a35..35420c9360 100644 --- a/MediaBrowser.Api/LiveTv/LiveTvService.cs +++ b/MediaBrowser.Api/LiveTv/LiveTvService.cs @@ -295,16 +295,16 @@ namespace MediaBrowser.Api.LiveTv } } - public object Get(GetLiveTvInfo request) + public async Task Get(GetLiveTvInfo request) { - var info = _liveTvManager.GetLiveTvInfo(CancellationToken.None).Result; + var info = await _liveTvManager.GetLiveTvInfo(CancellationToken.None).ConfigureAwait(false); return ToOptimizedSerializedResultUsingCache(info); } - public object Get(GetChannels request) + public async Task Get(GetChannels request) { - var result = _liveTvManager.GetChannels(new LiveTvChannelQuery + var result = await _liveTvManager.GetChannels(new LiveTvChannelQuery { ChannelType = request.Type, UserId = request.UserId, @@ -314,26 +314,26 @@ namespace MediaBrowser.Api.LiveTv IsLiked = request.IsLiked, IsDisliked = request.IsDisliked - }, CancellationToken.None).Result; + }, CancellationToken.None).ConfigureAwait(false); return ToOptimizedSerializedResultUsingCache(result); } - public object Get(GetChannel request) + public async Task Get(GetChannel request) { var user = string.IsNullOrEmpty(request.UserId) ? null : _userManager.GetUserById(new Guid(request.UserId)); - var result = _liveTvManager.GetChannel(request.Id, CancellationToken.None, user).Result; + var result = await _liveTvManager.GetChannel(request.Id, CancellationToken.None, user).ConfigureAwait(false); return ToOptimizedSerializedResultUsingCache(result); } - public object Get(GetLiveTvFolder request) + public async Task Get(GetLiveTvFolder request) { - return ToOptimizedResult(_liveTvManager.GetLiveTvFolder(request.UserId, CancellationToken.None).Result); + return ToOptimizedResult(await _liveTvManager.GetLiveTvFolder(request.UserId, CancellationToken.None).ConfigureAwait(false)); } - public object Get(GetPrograms request) + public async Task Get(GetPrograms request) { var query = new ProgramQuery { @@ -361,12 +361,12 @@ namespace MediaBrowser.Api.LiveTv query.MaxEndDate = DateTime.Parse(request.MaxEndDate, null, DateTimeStyles.RoundtripKind).ToUniversalTime(); } - var result = _liveTvManager.GetPrograms(query, CancellationToken.None).Result; + var result = await _liveTvManager.GetPrograms(query, CancellationToken.None).ConfigureAwait(false); return ToOptimizedSerializedResultUsingCache(result); } - public object Get(GetRecommendedPrograms request) + public async Task Get(GetRecommendedPrograms request) { var query = new RecommendedProgramQuery { @@ -376,7 +376,7 @@ namespace MediaBrowser.Api.LiveTv HasAired = request.HasAired }; - var result = _liveTvManager.GetRecommendedPrograms(query, CancellationToken.None).Result; + var result = await _liveTvManager.GetRecommendedPrograms(query, CancellationToken.None).ConfigureAwait(false); return ToOptimizedSerializedResultUsingCache(result); } @@ -386,9 +386,9 @@ namespace MediaBrowser.Api.LiveTv return Get(request); } - public object Get(GetRecordings request) + public async Task Get(GetRecordings request) { - var result = _liveTvManager.GetRecordings(new RecordingQuery + var result = await _liveTvManager.GetRecordings(new RecordingQuery { ChannelId = request.ChannelId, UserId = request.UserId, @@ -399,35 +399,35 @@ namespace MediaBrowser.Api.LiveTv SeriesTimerId = request.SeriesTimerId, IsInProgress = request.IsInProgress - }, CancellationToken.None).Result; + }, CancellationToken.None).ConfigureAwait(false); return ToOptimizedSerializedResultUsingCache(result); } - public object Get(GetRecording request) + public async Task Get(GetRecording request) { var user = string.IsNullOrEmpty(request.UserId) ? null : _userManager.GetUserById(new Guid(request.UserId)); - var result = _liveTvManager.GetRecording(request.Id, CancellationToken.None, user).Result; + var result = await _liveTvManager.GetRecording(request.Id, CancellationToken.None, user).ConfigureAwait(false); return ToOptimizedSerializedResultUsingCache(result); } - public object Get(GetTimer request) + public async Task Get(GetTimer request) { - var result = _liveTvManager.GetTimer(request.Id, CancellationToken.None).Result; + var result = await _liveTvManager.GetTimer(request.Id, CancellationToken.None).ConfigureAwait(false); return ToOptimizedSerializedResultUsingCache(result); } - public object Get(GetTimers request) + public async Task Get(GetTimers request) { - var result = _liveTvManager.GetTimers(new TimerQuery + var result = await _liveTvManager.GetTimers(new TimerQuery { ChannelId = request.ChannelId, SeriesTimerId = request.SeriesTimerId - }, CancellationToken.None).Result; + }, CancellationToken.None).ConfigureAwait(false); return ToOptimizedSerializedResultUsingCache(result); } @@ -459,21 +459,21 @@ namespace MediaBrowser.Api.LiveTv Task.WaitAll(task); } - public object Get(GetSeriesTimers request) + public async Task Get(GetSeriesTimers request) { - var result = _liveTvManager.GetSeriesTimers(new SeriesTimerQuery + var result = await _liveTvManager.GetSeriesTimers(new SeriesTimerQuery { SortOrder = request.SortOrder, SortBy = request.SortBy - }, CancellationToken.None).Result; + }, CancellationToken.None).ConfigureAwait(false); return ToOptimizedSerializedResultUsingCache(result); } - public object Get(GetSeriesTimer request) + public async Task Get(GetSeriesTimer request) { - var result = _liveTvManager.GetSeriesTimer(request.Id, CancellationToken.None).Result; + var result = await _liveTvManager.GetSeriesTimer(request.Id, CancellationToken.None).ConfigureAwait(false); return ToOptimizedSerializedResultUsingCache(result); } @@ -496,27 +496,27 @@ namespace MediaBrowser.Api.LiveTv Task.WaitAll(task); } - public object Get(GetDefaultTimer request) + public async Task Get(GetDefaultTimer request) { if (string.IsNullOrEmpty(request.ProgramId)) { - var result = _liveTvManager.GetNewTimerDefaults(CancellationToken.None).Result; + var result = await _liveTvManager.GetNewTimerDefaults(CancellationToken.None).ConfigureAwait(false); return ToOptimizedSerializedResultUsingCache(result); } else { - var result = _liveTvManager.GetNewTimerDefaults(request.ProgramId, CancellationToken.None).Result; + var result = await _liveTvManager.GetNewTimerDefaults(request.ProgramId, CancellationToken.None).ConfigureAwait(false); return ToOptimizedSerializedResultUsingCache(result); } } - public object Get(GetProgram request) + public async Task Get(GetProgram request) { var user = string.IsNullOrEmpty(request.UserId) ? null : _userManager.GetUserById(new Guid(request.UserId)); - var result = _liveTvManager.GetProgram(request.Id, CancellationToken.None, user).Result; + var result = await _liveTvManager.GetProgram(request.Id, CancellationToken.None, user).ConfigureAwait(false); return ToOptimizedSerializedResultUsingCache(result); } @@ -539,23 +539,23 @@ namespace MediaBrowser.Api.LiveTv Task.WaitAll(task); } - public object Get(GetRecordingGroups request) + public async Task Get(GetRecordingGroups request) { - var result = _liveTvManager.GetRecordingGroups(new RecordingGroupQuery + var result = await _liveTvManager.GetRecordingGroups(new RecordingGroupQuery { UserId = request.UserId - }, CancellationToken.None).Result; + }, CancellationToken.None).ConfigureAwait(false); return ToOptimizedSerializedResultUsingCache(result); } - public object Get(GetRecordingGroup request) + public async Task Get(GetRecordingGroup request) { - var result = _liveTvManager.GetRecordingGroups(new RecordingGroupQuery + var result = await _liveTvManager.GetRecordingGroups(new RecordingGroupQuery { - }, CancellationToken.None).Result; + }, CancellationToken.None).ConfigureAwait(false); var group = result.Items.FirstOrDefault(i => string.Equals(i.Id, request.Id, StringComparison.OrdinalIgnoreCase)); diff --git a/MediaBrowser.Api/Movies/CollectionService.cs b/MediaBrowser.Api/Movies/CollectionService.cs index e3816aa518..346c085f8c 100644 --- a/MediaBrowser.Api/Movies/CollectionService.cs +++ b/MediaBrowser.Api/Movies/CollectionService.cs @@ -59,17 +59,16 @@ namespace MediaBrowser.Api.Movies _dtoService = dtoService; } - public object Post(CreateCollection request) + public async Task Post(CreateCollection request) { - var task = _collectionManager.CreateCollection(new CollectionCreationOptions + var item = await _collectionManager.CreateCollection(new CollectionCreationOptions { IsLocked = request.IsLocked, Name = request.Name, ParentId = request.ParentId, ItemIdList = (request.Ids ?? string.Empty).Split(',').Where(i => !string.IsNullOrWhiteSpace(i)).Select(i => new Guid(i)).ToList() - }); - var item = task.Result; + }).ConfigureAwait(false); var dto = _dtoService.GetBaseItemDto(item, new List()); diff --git a/MediaBrowser.Api/Playback/BaseStreamingService.cs b/MediaBrowser.Api/Playback/BaseStreamingService.cs index b77c6fd015..162c57b914 100644 --- a/MediaBrowser.Api/Playback/BaseStreamingService.cs +++ b/MediaBrowser.Api/Playback/BaseStreamingService.cs @@ -468,11 +468,9 @@ namespace MediaBrowser.Api.Playback /// The state. /// The output video codec. /// if set to true [allow time stamp copy]. - /// The cancellation token. /// System.String. protected string GetOutputSizeParam(StreamState state, string outputVideoCodec, - CancellationToken cancellationToken, bool allowTimeStampCopy = true) { // http://sonnati.wordpress.com/2012/10/19/ffmpeg-the-swiss-army-knife-of-internet-streaming-part-vi/ @@ -562,7 +560,7 @@ namespace MediaBrowser.Api.Playback if (state.SubtitleStream != null && state.SubtitleStream.IsTextSubtitleStream) { - var subParam = GetTextSubtitleParam(state, cancellationToken); + var subParam = GetTextSubtitleParam(state); filters.Add(subParam); @@ -584,10 +582,8 @@ namespace MediaBrowser.Api.Playback /// Gets the text subtitle param. /// /// The state. - /// The cancellation token. /// System.String. - protected string GetTextSubtitleParam(StreamState state, - CancellationToken cancellationToken) + protected string GetTextSubtitleParam(StreamState state) { var seconds = Math.Round(TimeSpan.FromTicks(state.Request.StartTimeTicks ?? 0).TotalSeconds); @@ -635,7 +631,7 @@ namespace MediaBrowser.Api.Playback // Add resolution params, if specified if (request.Width.HasValue || request.Height.HasValue || request.MaxHeight.HasValue || request.MaxWidth.HasValue) { - outputSizeParam = GetOutputSizeParam(state, outputVideoCodec, CancellationToken.None).TrimEnd('"'); + outputSizeParam = GetOutputSizeParam(state, outputVideoCodec).TrimEnd('"'); outputSizeParam = "," + outputSizeParam.Substring(outputSizeParam.IndexOf("scale", StringComparison.OrdinalIgnoreCase)); } diff --git a/MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs b/MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs index 42fa63fb7a..340073e9ee 100644 --- a/MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs +++ b/MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs @@ -20,7 +20,12 @@ using System.Threading.Tasks; namespace MediaBrowser.Api.Playback.Hls { + /// + /// Options is needed for chromecast. Threw Head in there since it's related + /// [Route("/Videos/{Id}/master.m3u8", "GET", Summary = "Gets a video stream using HTTP live streaming.")] + [Route("/Videos/{Id}/master.m3u8", "HEAD", Summary = "Gets a video stream using HTTP live streaming.")] + [Route("/Videos/{Id}/master.m3u8", "OPTIONS", Summary = "Gets a video stream using HTTP live streaming.")] public class GetMasterHlsVideoStream : VideoStreamRequest { public bool EnableAdaptiveBitrateStreaming { get; set; } @@ -61,7 +66,21 @@ namespace MediaBrowser.Api.Playback.Hls public object Get(GetMasterHlsVideoStream request) { - var result = GetAsync(request).Result; + var result = GetAsync(request, "GET").Result; + + return result; + } + + public object Options(GetMasterHlsVideoStream request) + { + var result = GetAsync(request, "OPTIONS").Result; + + return result; + } + + public object Head(GetMasterHlsVideoStream request) + { + var result = GetAsync(request, "HEAD").Result; return result; } @@ -70,10 +89,6 @@ namespace MediaBrowser.Api.Playback.Hls { var result = GetPlaylistAsync(request, "main").Result; - // Get the transcoding started - //var start = GetStartNumber(request); - //var segment = GetDynamicSegment(request, start.ToString(UsCulture)).Result; - return result; } @@ -319,7 +334,7 @@ namespace MediaBrowser.Api.Playback.Hls return job != null && !job.HasExited; } - private async Task GetAsync(GetMasterHlsVideoStream request) + private async Task GetAsync(GetMasterHlsVideoStream request, string method) { var state = await GetState(request, CancellationToken.None).ConfigureAwait(false); @@ -338,10 +353,15 @@ namespace MediaBrowser.Api.Playback.Hls throw new ArgumentException("MediaSourceId is required"); } - var audioBitrate = state.OutputAudioBitrate ?? 0; - var videoBitrate = state.OutputVideoBitrate ?? 0; + var playlistText = string.Empty; + + if (string.Equals(method, "GET", StringComparison.OrdinalIgnoreCase)) + { + var audioBitrate = state.OutputAudioBitrate ?? 0; + var videoBitrate = state.OutputVideoBitrate ?? 0; - var playlistText = GetMasterPlaylistFileText(state, videoBitrate + audioBitrate); + playlistText = GetMasterPlaylistFileText(state, videoBitrate + audioBitrate); + } return ResultFactory.GetResult(playlistText, Common.Net.MimeTypes.GetMimeType("playlist.m3u8"), new Dictionary()); } @@ -359,14 +379,14 @@ namespace MediaBrowser.Api.Playback.Hls var playlistUrl = (state.RunTimeTicks ?? 0) > 0 ? "main.m3u8" : "live.m3u8"; playlistUrl += queryString; - var request = (GetMasterHlsVideoStream) state.Request; + var request = (GetMasterHlsVideoStream)state.Request; var subtitleStreams = state.AllMediaStreams .Where(i => i.IsTextSubtitleStream) .ToList(); - var subtitleGroup = subtitleStreams.Count > 0 && request.SubtitleMethod == SubtitleDeliveryMethod.Hls ? - "subs" : + var subtitleGroup = subtitleStreams.Count > 0 && request.SubtitleMethod == SubtitleDeliveryMethod.Hls ? + "subs" : null; AppendPlaylist(builder, playlistUrl, totalBitrate, subtitleGroup); @@ -582,7 +602,7 @@ namespace MediaBrowser.Api.Playback.Hls // Add resolution params, if specified if (!hasGraphicalSubs) { - args += GetOutputSizeParam(state, codec, CancellationToken.None, false); + args += GetOutputSizeParam(state, codec, false); } // This is for internal graphical subs diff --git a/MediaBrowser.Api/Playback/Hls/VideoHlsService.cs b/MediaBrowser.Api/Playback/Hls/VideoHlsService.cs index 1dffa54114..d4aa0836ff 100644 --- a/MediaBrowser.Api/Playback/Hls/VideoHlsService.cs +++ b/MediaBrowser.Api/Playback/Hls/VideoHlsService.cs @@ -180,7 +180,7 @@ namespace MediaBrowser.Api.Playback.Hls // Add resolution params, if specified if (!hasGraphicalSubs) { - args += GetOutputSizeParam(state, codec, CancellationToken.None); + args += GetOutputSizeParam(state, codec); } // This is for internal graphical subs diff --git a/MediaBrowser.Api/Playback/Progressive/AudioService.cs b/MediaBrowser.Api/Playback/Progressive/AudioService.cs index 6fae65ffcb..21f0599e37 100644 --- a/MediaBrowser.Api/Playback/Progressive/AudioService.cs +++ b/MediaBrowser.Api/Playback/Progressive/AudioService.cs @@ -20,6 +20,8 @@ namespace MediaBrowser.Api.Playback.Progressive [Route("/Audio/{Id}/stream", "GET", Summary = "Gets an audio stream")] [Route("/Audio/{Id}/stream.{Container}", "HEAD", Summary = "Gets an audio stream")] [Route("/Audio/{Id}/stream", "HEAD", Summary = "Gets an audio stream")] + [Route("/Audio/{Id}/stream.{Container}", "OPTIONS", Summary = "Gets an audio stream")] + [Route("/Audio/{Id}/stream", "OPTIONS", Summary = "Gets an audio stream")] public class GetAudioStream : StreamRequest { [ApiMember(Name = "Container", Description = "Container", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "GET")] @@ -55,6 +57,16 @@ namespace MediaBrowser.Api.Playback.Progressive return ProcessRequest(request, true); } + /// + /// Gets the specified request. + /// + /// The request. + /// System.Object. + public object Options(GetAudioStream request) + { + return ProcessRequest(request, true); + } + /// /// Gets the command line arguments. /// diff --git a/MediaBrowser.Api/Playback/Progressive/BaseProgressiveStreamingService.cs b/MediaBrowser.Api/Playback/Progressive/BaseProgressiveStreamingService.cs index 80428269b9..028ada37b9 100644 --- a/MediaBrowser.Api/Playback/Progressive/BaseProgressiveStreamingService.cs +++ b/MediaBrowser.Api/Playback/Progressive/BaseProgressiveStreamingService.cs @@ -114,7 +114,9 @@ namespace MediaBrowser.Api.Playback.Progressive /// Task. protected object ProcessRequest(StreamRequest request, bool isHeadRequest) { - var state = GetState(request, CancellationToken.None).Result; + var cancellationTokenSource = new CancellationTokenSource(); + + var state = GetState(request, cancellationTokenSource.Token).Result; var responseHeaders = new Dictionary(); @@ -125,7 +127,7 @@ namespace MediaBrowser.Api.Playback.Progressive using (state) { - return GetStaticRemoteStreamResult(state, responseHeaders, isHeadRequest).Result; + return GetStaticRemoteStreamResult(state, responseHeaders, isHeadRequest, cancellationTokenSource).Result; } } @@ -171,7 +173,7 @@ namespace MediaBrowser.Api.Playback.Progressive // Need to start ffmpeg try { - return GetStreamResult(state, responseHeaders, isHeadRequest).Result; + return GetStreamResult(state, responseHeaders, isHeadRequest, cancellationTokenSource).Result; } catch { @@ -187,8 +189,9 @@ namespace MediaBrowser.Api.Playback.Progressive /// The state. /// The response headers. /// if set to true [is head request]. + /// The cancellation token source. /// Task{System.Object}. - private async Task GetStaticRemoteStreamResult(StreamState state, Dictionary responseHeaders, bool isHeadRequest) + private async Task GetStaticRemoteStreamResult(StreamState state, Dictionary responseHeaders, bool isHeadRequest, CancellationTokenSource cancellationTokenSource) { string useragent = null; state.RemoteHttpHeaders.TryGetValue("User-Agent", out useragent); @@ -197,7 +200,8 @@ namespace MediaBrowser.Api.Playback.Progressive { Url = state.MediaPath, UserAgent = useragent, - BufferContent = false + BufferContent = false, + CancellationToken = cancellationTokenSource.Token }; var response = await HttpClient.GetResponse(options).ConfigureAwait(false); @@ -238,8 +242,9 @@ namespace MediaBrowser.Api.Playback.Progressive /// The state. /// The response headers. /// if set to true [is head request]. + /// The cancellation token source. /// Task{System.Object}. - private async Task GetStreamResult(StreamState state, IDictionary responseHeaders, bool isHeadRequest) + private async Task GetStreamResult(StreamState state, IDictionary responseHeaders, bool isHeadRequest, CancellationTokenSource cancellationTokenSource) { // Use the command line args with a dummy playlist path var outputPath = state.OutputFilePath; @@ -275,28 +280,36 @@ namespace MediaBrowser.Api.Playback.Progressive return streamResult; } - if (!File.Exists(outputPath)) - { - await StartFfMpeg(state, outputPath, new CancellationTokenSource()).ConfigureAwait(false); - } - else + await ApiEntryPoint.Instance.TranscodingStartLock.WaitAsync(cancellationTokenSource.Token).ConfigureAwait(false); + try { - ApiEntryPoint.Instance.OnTranscodeBeginRequest(outputPath, TranscodingJobType.Progressive); - state.Dispose(); - } + if (!File.Exists(outputPath)) + { + await StartFfMpeg(state, outputPath, cancellationTokenSource).ConfigureAwait(false); + } + else + { + ApiEntryPoint.Instance.OnTranscodeBeginRequest(outputPath, TranscodingJobType.Progressive); + state.Dispose(); + } - var job = ApiEntryPoint.Instance.GetTranscodingJob(outputPath, TranscodingJobType.Progressive); - var result = new ProgressiveStreamWriter(outputPath, Logger, FileSystem, job); + var job = ApiEntryPoint.Instance.GetTranscodingJob(outputPath, TranscodingJobType.Progressive); + var result = new ProgressiveStreamWriter(outputPath, Logger, FileSystem, job); - result.Options["Content-Type"] = contentType; + result.Options["Content-Type"] = contentType; - // Add the response headers to the result object - foreach (var item in responseHeaders) + // Add the response headers to the result object + foreach (var item in responseHeaders) + { + result.Options[item.Key] = item.Value; + } + + return result; + } + finally { - result.Options[item.Key] = item.Value; + ApiEntryPoint.Instance.TranscodingStartLock.Release(); } - - return result; } /// diff --git a/MediaBrowser.Api/Playback/Progressive/ProgressiveStreamWriter.cs b/MediaBrowser.Api/Playback/Progressive/ProgressiveStreamWriter.cs index a4c55443c5..a62f3dc9fc 100644 --- a/MediaBrowser.Api/Playback/Progressive/ProgressiveStreamWriter.cs +++ b/MediaBrowser.Api/Playback/Progressive/ProgressiveStreamWriter.cs @@ -1,4 +1,5 @@ -using MediaBrowser.Common.IO; +using System; +using MediaBrowser.Common.IO; using MediaBrowser.Model.Logging; using ServiceStack.Web; using System.Collections.Generic; @@ -64,9 +65,9 @@ namespace MediaBrowser.Api.Playback.Progressive await new ProgressiveFileCopier(_fileSystem, _job) .StreamFile(Path, responseStream).ConfigureAwait(false); } - catch + catch (Exception ex) { - Logger.Error("Error streaming media. The client has most likely disconnected or transcoding has failed."); + Logger.ErrorException("Error streaming media. The client has most likely disconnected or transcoding has failed.", ex); throw; } diff --git a/MediaBrowser.Api/Playback/Progressive/VideoService.cs b/MediaBrowser.Api/Playback/Progressive/VideoService.cs index cdaa99130b..54d441dc53 100644 --- a/MediaBrowser.Api/Playback/Progressive/VideoService.cs +++ b/MediaBrowser.Api/Playback/Progressive/VideoService.cs @@ -11,7 +11,6 @@ using MediaBrowser.Model.IO; using ServiceStack; using System; using System.IO; -using System.Threading; namespace MediaBrowser.Api.Playback.Progressive { @@ -50,6 +49,12 @@ namespace MediaBrowser.Api.Playback.Progressive [Route("/Videos/{Id}/stream.wtv", "HEAD")] [Route("/Videos/{Id}/stream.m2ts", "HEAD")] [Route("/Videos/{Id}/stream", "HEAD")] + [Route("/Videos/{Id}/stream.mp4", "OPTIONS")] + [Route("/Videos/{Id}/stream.m4v", "OPTIONS")] + [Route("/Videos/{Id}/stream.mkv", "OPTIONS")] + [Route("/Videos/{Id}/stream.avi", "OPTIONS")] + [Route("/Videos/{Id}/stream.webm", "OPTIONS")] + [Route("/Videos/{Id}/stream.ts", "OPTIONS")] [Api(Description = "Gets a video stream")] public class GetVideoStream : VideoStreamRequest { @@ -85,6 +90,16 @@ namespace MediaBrowser.Api.Playback.Progressive return ProcessRequest(request, true); } + /// + /// Optionses the specified request. + /// + /// The request. + /// System.Object. + public object Options(GetVideoStream request) + { + return ProcessRequest(request, true); + } + /// /// Gets the command line arguments. /// @@ -154,7 +169,7 @@ namespace MediaBrowser.Api.Playback.Progressive // Add resolution params, if specified if (!hasGraphicalSubs) { - args += GetOutputSizeParam(state, codec, CancellationToken.None); + args += GetOutputSizeParam(state, codec); } var qualityParam = GetVideoQualityParam(state, codec, false); diff --git a/MediaBrowser.Api/PlaylistService.cs b/MediaBrowser.Api/PlaylistService.cs index bc289f9f7b..c6a4bb20c2 100644 --- a/MediaBrowser.Api/PlaylistService.cs +++ b/MediaBrowser.Api/PlaylistService.cs @@ -97,16 +97,15 @@ namespace MediaBrowser.Api _libraryManager = libraryManager; } - public object Post(CreatePlaylist request) + public async Task Post(CreatePlaylist request) { - var task = _playlistManager.CreatePlaylist(new PlaylistCreationOptions + var item = await _playlistManager.CreatePlaylist(new PlaylistCreationOptions { Name = request.Name, ItemIdList = (request.Ids ?? string.Empty).Split(',').Where(i => !string.IsNullOrWhiteSpace(i)).ToList(), UserId = request.UserId - }); - var item = task.Result; + }).ConfigureAwait(false); var dto = _dtoService.GetBaseItemDto(item, new List()); diff --git a/MediaBrowser.Api/SearchService.cs b/MediaBrowser.Api/SearchService.cs index a6fcaf4381..61c7305b5d 100644 --- a/MediaBrowser.Api/SearchService.cs +++ b/MediaBrowser.Api/SearchService.cs @@ -111,9 +111,9 @@ namespace MediaBrowser.Api /// /// The request. /// System.Object. - public object Get(GetSearchHints request) + public async Task Get(GetSearchHints request) { - var result = GetSearchHintsAsync(request).Result; + var result = await GetSearchHintsAsync(request).ConfigureAwait(false); return ToOptimizedSerializedResultUsingCache(result); } diff --git a/MediaBrowser.Api/Sync/SyncService.cs b/MediaBrowser.Api/Sync/SyncService.cs index e0dc07cdcf..591b1abadd 100644 --- a/MediaBrowser.Api/Sync/SyncService.cs +++ b/MediaBrowser.Api/Sync/SyncService.cs @@ -87,16 +87,14 @@ namespace MediaBrowser.Api.Sync return ToOptimizedResult(result); } - public void Delete(CancelSyncJob request) + public Task Delete(CancelSyncJob request) { - var task = _syncManager.CancelJob(request.Id); - - Task.WaitAll(task); + return _syncManager.CancelJob(request.Id); } - public object Post(CreateSyncJob request) + public async Task Post(CreateSyncJob request) { - var result = _syncManager.CreateJob(request); + var result = await _syncManager.CreateJob(request).ConfigureAwait(false); return ToOptimizedResult(result); } diff --git a/MediaBrowser.Api/UserLibrary/PlaystateService.cs b/MediaBrowser.Api/UserLibrary/PlaystateService.cs index ccebb912b0..6bcd369d6e 100644 --- a/MediaBrowser.Api/UserLibrary/PlaystateService.cs +++ b/MediaBrowser.Api/UserLibrary/PlaystateService.cs @@ -221,14 +221,7 @@ namespace MediaBrowser.Api.UserLibrary /// Posts the specified request. /// /// The request. - public object Post(MarkPlayedItem request) - { - var result = MarkPlayed(request).Result; - - return ToOptimizedResult(result); - } - - private async Task MarkPlayed(MarkPlayedItem request) + public async Task Post(MarkPlayedItem request) { var user = _userManager.GetUserById(request.UserId); @@ -250,18 +243,18 @@ namespace MediaBrowser.Api.UserLibrary await UpdatePlayedStatus(additionalUser, request.Id, true, datePlayed).ConfigureAwait(false); } - return dto; + return ToOptimizedResult(dto); } /// /// Posts the specified request. /// /// The request. - public void Post(OnPlaybackStart request) + public Task Post(OnPlaybackStart request) { var queueableMediaTypes = (request.QueueableMediaTypes ?? string.Empty); - Post(new ReportPlaybackStart + return Post(new ReportPlaybackStart { CanSeek = request.CanSeek, ItemId = request.Id, @@ -272,22 +265,20 @@ namespace MediaBrowser.Api.UserLibrary }); } - public void Post(ReportPlaybackStart request) + public Task Post(ReportPlaybackStart request) { request.SessionId = GetSession().Id; - var task = _sessionManager.OnPlaybackStart(request); - - Task.WaitAll(task); + return _sessionManager.OnPlaybackStart(request); } /// /// Posts the specified request. /// /// The request. - public void Post(OnPlaybackProgress request) + public Task Post(OnPlaybackProgress request) { - Post(new ReportPlaybackProgress + return Post(new ReportPlaybackProgress { ItemId = request.Id, PositionTicks = request.PositionTicks, @@ -300,22 +291,20 @@ namespace MediaBrowser.Api.UserLibrary }); } - public void Post(ReportPlaybackProgress request) + public Task Post(ReportPlaybackProgress request) { request.SessionId = GetSession().Id; - var task = _sessionManager.OnPlaybackProgress(request); - - Task.WaitAll(task); + return _sessionManager.OnPlaybackProgress(request); } /// /// Posts the specified request. /// /// The request. - public void Delete(OnPlaybackStopped request) + public Task Delete(OnPlaybackStopped request) { - Post(new ReportPlaybackStopped + return Post(new ReportPlaybackStopped { ItemId = request.Id, PositionTicks = request.PositionTicks, @@ -323,13 +312,11 @@ namespace MediaBrowser.Api.UserLibrary }); } - public void Post(ReportPlaybackStopped request) + public Task Post(ReportPlaybackStopped request) { request.SessionId = GetSession().Id; - var task = _sessionManager.OnPlaybackStopped(request); - - Task.WaitAll(task); + return _sessionManager.OnPlaybackStopped(request); } /// diff --git a/MediaBrowser.Api/UserLibrary/UserLibraryService.cs b/MediaBrowser.Api/UserLibrary/UserLibraryService.cs index d746d47ff2..16ed0ee296 100644 --- a/MediaBrowser.Api/UserLibrary/UserLibraryService.cs +++ b/MediaBrowser.Api/UserLibrary/UserLibraryService.cs @@ -400,7 +400,7 @@ namespace MediaBrowser.Api.UserLibrary return ToOptimizedResult(dtos.ToList()); } - public object Get(GetUserViews request) + public async Task Get(GetUserViews request) { var user = _userManager.GetUserById(new Guid(request.UserId)); @@ -418,7 +418,7 @@ namespace MediaBrowser.Api.UserLibrary query.IncludeExternalContent = request.IncludeExternalContent.Value; } - var folders = _userViewManager.GetUserViews(query, CancellationToken.None).Result; + var folders = await _userViewManager.GetUserViews(query, CancellationToken.None).ConfigureAwait(false); var dtos = folders.OrderBy(i => i.SortName) .Select(i => _dtoService.GetBaseItemDto(i, fields, user)) diff --git a/MediaBrowser.Api/UserService.cs b/MediaBrowser.Api/UserService.cs index 6fe428274a..3761cf4248 100644 --- a/MediaBrowser.Api/UserService.cs +++ b/MediaBrowser.Api/UserService.cs @@ -12,7 +12,6 @@ using ServiceStack.Text.Controller; using System; using System.Collections.Generic; using System.Linq; -using System.Net; using System.Threading.Tasks; namespace MediaBrowser.Api @@ -275,7 +274,7 @@ namespace MediaBrowser.Api /// Deletes the specified request. /// /// The request. - public void Delete(DeleteUser request) + public async Task Delete(DeleteUser request) { var user = _userManager.GetUserById(request.Id); @@ -284,13 +283,8 @@ namespace MediaBrowser.Api throw new ResourceNotFoundException("User not found"); } - var revokeTask = _sessionMananger.RevokeUserTokens(user.Id.ToString("N")); - - Task.WaitAll(revokeTask); - - var task = _userManager.DeleteUser(user); - - Task.WaitAll(task); + await _sessionMananger.RevokeUserTokens(user.Id.ToString("N")).ConfigureAwait(false); + await _userManager.DeleteUser(user).ConfigureAwait(false); } /// @@ -313,7 +307,7 @@ namespace MediaBrowser.Api }); } - public object Post(AuthenticateUserByName request) + public async Task Post(AuthenticateUserByName request) { var auth = AuthorizationContext.GetAuthorizationInfo(Request); @@ -334,7 +328,7 @@ namespace MediaBrowser.Api auth.DeviceId = "Unknown device id"; } - var result = _sessionMananger.AuthenticateNewSession(new AuthenticationRequest + var result = await _sessionMananger.AuthenticateNewSession(new AuthenticationRequest { App = auth.Client, AppVersion = auth.Version, @@ -344,7 +338,7 @@ namespace MediaBrowser.Api RemoteEndPoint = Request.RemoteIp, Username = request.Username - }, Request.IsLocal).Result; + }, Request.IsLocal).ConfigureAwait(false); return ToOptimizedResult(result); } @@ -353,7 +347,7 @@ namespace MediaBrowser.Api /// Posts the specified request. /// /// The request. - public void Post(UpdateUserPassword request) + public async Task Post(UpdateUserPassword request) { var user = _userManager.GetUserById(request.Id); @@ -364,22 +358,18 @@ namespace MediaBrowser.Api if (request.ResetPassword) { - var task = _userManager.ResetPassword(user); - - Task.WaitAll(task); + await _userManager.ResetPassword(user).ConfigureAwait(false); } else { - var success = _userManager.AuthenticateUser(user.Name, request.CurrentPassword, Request.RemoteIp).Result; + var success = await _userManager.AuthenticateUser(user.Name, request.CurrentPassword, Request.RemoteIp).ConfigureAwait(false); if (!success) { throw new ArgumentException("Invalid user or password entered."); } - var task = _userManager.ChangePassword(user, request.NewPassword); - - Task.WaitAll(task); + await _userManager.ChangePassword(user, request.NewPassword).ConfigureAwait(false); } } @@ -387,7 +377,7 @@ namespace MediaBrowser.Api /// Posts the specified request. /// /// The request. - public void Post(UpdateUser request) + public async Task Post(UpdateUser request) { // We need to parse this manually because we told service stack not to with IRequiresRequestStream // https://code.google.com/p/servicestack/source/browse/trunk/Common/ServiceStack.Text/ServiceStack.Text/Controller/PathInfo.cs @@ -421,16 +411,14 @@ namespace MediaBrowser.Api throw new ArgumentException("There must be at least one enabled user in the system."); } - var revokeTask = _sessionMananger.RevokeUserTokens(user.Id.ToString("N")); - - Task.WaitAll(revokeTask); + await _sessionMananger.RevokeUserTokens(user.Id.ToString("N")).ConfigureAwait(false); } var task = user.Name.Equals(dtoUser.Name, StringComparison.Ordinal) ? _userManager.UpdateUser(user) : _userManager.RenameUser(user, dtoUser.Name); - Task.WaitAll(task); + await task.ConfigureAwait(false); user.UpdateConfiguration(dtoUser.Configuration); } diff --git a/MediaBrowser.Api/VideosService.cs b/MediaBrowser.Api/VideosService.cs index 2407a1a391..5ce1341b0b 100644 --- a/MediaBrowser.Api/VideosService.cs +++ b/MediaBrowser.Api/VideosService.cs @@ -97,14 +97,7 @@ namespace MediaBrowser.Api return ToOptimizedSerializedResultUsingCache(result); } - public void Delete(DeleteAlternateSources request) - { - var task = RemoveAlternateVersions(request); - - Task.WaitAll(task); - } - - private async Task RemoveAlternateVersions(DeleteAlternateSources request) + public async Task Delete(DeleteAlternateSources request) { var video = (Video)_libraryManager.GetItemById(request.Id); @@ -119,14 +112,7 @@ namespace MediaBrowser.Api await video.UpdateToRepository(ItemUpdateType.MetadataDownload, CancellationToken.None).ConfigureAwait(false); } - public void Post(MergeVersions request) - { - var task = MergeVersions(request); - - Task.WaitAll(task); - } - - private async Task MergeVersions(MergeVersions request) + public async Task Post(MergeVersions request) { var items = request.Ids.Split(',') .Select(i => new Guid(i)) @@ -172,12 +158,12 @@ namespace MediaBrowser.Api return 0; }) .ThenByDescending(i => - { - var stream = i.GetDefaultVideoStream(); + { + var stream = i.GetDefaultVideoStream(); - return stream == null || stream.Width == null ? 0 : stream.Width.Value; + return stream == null || stream.Width == null ? 0 : stream.Width.Value; - }).First(); + }).First(); } foreach (var item in videos.Where(i => i.Id != primaryVersion.Id)) diff --git a/MediaBrowser.Dlna/ContentDirectory/ControlHandler.cs b/MediaBrowser.Dlna/ContentDirectory/ControlHandler.cs index 35522dd06c..6d5ed9eb8d 100644 --- a/MediaBrowser.Dlna/ContentDirectory/ControlHandler.cs +++ b/MediaBrowser.Dlna/ContentDirectory/ControlHandler.cs @@ -112,12 +112,12 @@ namespace MediaBrowser.Dlna.ContentDirectory private IEnumerable> HandleGetSearchCapabilities() { - return new Headers(true) { { "SearchCaps", "upnp:class,dc:title,upnp:artist" } }; + return new Headers(true) { { "SearchCaps", "res@resolution,res@size,res@duration,dc:title,dc:creator,upnp:actor,upnp:artist,upnp:genre,upnp:album,dc:date,upnp:class,@id,@refID,@protocolInfo,upnp:author,dc:description,pv:avKeywords" } }; } private IEnumerable> HandleGetSortCapabilities() { - return new Headers(true) { { "SortCaps", string.Empty } }; + return new Headers(true) { { "SortCaps", "res@duration,res@size,res@bitrate,dc:date,dc:title,dc:size,upnp:album,upnp:artist,upnp:albumArtist,upnp:episodeNumber,upnp:genre,upnp:originalTrackNumber,upnp:rating" } }; } private IEnumerable> HandleGetSystemUpdateID() @@ -317,14 +317,10 @@ namespace MediaBrowser.Dlna.ContentDirectory private async Task> GetChildrenSorted(Folder folder, User user, SearchCriteria search, SortCriteria sort, int? startIndex, int? limit) { - if (search.SearchType == SearchType.Unknown) - { - return await GetChildrenSorted(folder, user, sort, startIndex, limit).ConfigureAwait(false); - } - - var result = await GetChildrenSorted(folder, user, sort, null, null).ConfigureAwait(false); + // TODO: Make a recursive version of GetChildrenSorted (although sorting isn't needed) + var result = folder.GetRecursiveChildren(user, true); - var items = FilterUnsupportedContent(result.Items); + var items = FilterUnsupportedContent(result); if (search.SearchType == SearchType.Audio) { @@ -342,6 +338,10 @@ namespace MediaBrowser.Dlna.ContentDirectory { items = items.OfType(); } + else if (search.SearchType == SearchType.MusicAlbum) + { + items = items.OfType(); + } items = SortItems(items, user, sort); diff --git a/MediaBrowser.Dlna/Didl/DidlBuilder.cs b/MediaBrowser.Dlna/Didl/DidlBuilder.cs index 296c968bbe..5cf4222a8d 100644 --- a/MediaBrowser.Dlna/Didl/DidlBuilder.cs +++ b/MediaBrowser.Dlna/Didl/DidlBuilder.cs @@ -6,6 +6,7 @@ using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities.Audio; using MediaBrowser.Controller.Entities.Movies; using MediaBrowser.Controller.Entities.TV; +using MediaBrowser.Controller.Playlists; using MediaBrowser.Model.Dlna; using MediaBrowser.Model.Drawing; using MediaBrowser.Model.Entities; @@ -496,6 +497,10 @@ namespace MediaBrowser.Dlna.Didl { classType = "object.container.album.videoAlbum"; } + else if (item is Playlist) + { + classType = "object.container.playlistContainer"; + } } objectClass.InnerText = classType ?? "object.container.storageFolder"; @@ -560,7 +565,7 @@ namespace MediaBrowser.Dlna.Didl foreach (var artist in audio.AlbumArtists) { - AddValue(element, "upnp", "albumArtist", artist, NS_UPNP); + AddAlbumArtist(element, artist); } } @@ -569,9 +574,13 @@ namespace MediaBrowser.Dlna.Didl if (album != null) { foreach (var artist in album.AlbumArtists) + { + AddAlbumArtist(element, artist); + AddValue(element, "upnp", "artist", artist, NS_UPNP); + } + foreach (var artist in album.Artists) { AddValue(element, "upnp", "artist", artist, NS_UPNP); - AddValue(element, "upnp", "albumArtist", artist, NS_UPNP); } } @@ -582,6 +591,7 @@ namespace MediaBrowser.Dlna.Didl if (!string.IsNullOrEmpty(musicVideo.Artist)) { AddValue(element, "upnp", "artist", musicVideo.Artist, NS_UPNP); + AddAlbumArtist(element, musicVideo.Artist); } if (!string.IsNullOrEmpty(musicVideo.Album)) @@ -593,6 +603,28 @@ namespace MediaBrowser.Dlna.Didl if (item.IndexNumber.HasValue) { AddValue(element, "upnp", "originalTrackNumber", item.IndexNumber.Value.ToString(_usCulture), NS_UPNP); + + if (item is Episode) + { + AddValue(element, "upnp", "episodeNumber", item.IndexNumber.Value.ToString(_usCulture), NS_UPNP); + } + } + } + + private void AddAlbumArtist(XmlElement elem, string name) + { + try + { + var newNode = elem.OwnerDocument.CreateElement("upnp", "artist", NS_UPNP); + newNode.InnerText = name; + + newNode.SetAttribute("role", "AlbumArtist"); + + elem.AppendChild(newNode); + } + catch (XmlException) + { + //_logger.Error("Error adding xml value: " + value); } } diff --git a/MediaBrowser.Model/Configuration/ServerConfiguration.cs b/MediaBrowser.Model/Configuration/ServerConfiguration.cs index d96412335e..8363afc38c 100644 --- a/MediaBrowser.Model/Configuration/ServerConfiguration.cs +++ b/MediaBrowser.Model/Configuration/ServerConfiguration.cs @@ -180,9 +180,6 @@ namespace MediaBrowser.Model.Configuration public SubtitleOptions SubtitleOptions { get; set; } - public ChannelOptions ChannelOptions { get; set; } - public ChapterOptions ChapterOptions { get; set; } - public bool DefaultMetadataSettingsApplied { get; set; } public bool EnableTokenAuthentication { get; set; } diff --git a/MediaBrowser.Model/Dlna/SearchCriteria.cs b/MediaBrowser.Model/Dlna/SearchCriteria.cs index ced8525839..67c1b90422 100644 --- a/MediaBrowser.Model/Dlna/SearchCriteria.cs +++ b/MediaBrowser.Model/Dlna/SearchCriteria.cs @@ -16,24 +16,34 @@ namespace MediaBrowser.Model.Dlna SearchType = SearchType.Unknown; - if (StringHelper.IndexOfIgnoreCase(search, "upnp:class") != -1 && - StringHelper.IndexOfIgnoreCase(search, "derivedfrom") != -1) + String[] factors = StringHelper.RegexSplit(search, "(and|or)"); + foreach (String factor in factors) { - if (StringHelper.IndexOfIgnoreCase(search, "object.item.audioItem") != -1) - { - SearchType = SearchType.Audio; - } - else if (StringHelper.IndexOfIgnoreCase(search, "object.item.imageItem") != -1) - { - SearchType = SearchType.Image; - } - else if (StringHelper.IndexOfIgnoreCase(search, "object.item.videoItem") != -1) - { - SearchType = SearchType.Video; - } - else if (StringHelper.IndexOfIgnoreCase(search, "object.container.playlistContainer") != -1) + String[] subFactors = StringHelper.RegexSplit(factor.Trim().Trim('(').Trim(')').Trim(), "\\s", 3); + + if (subFactors.Length == 3) { - SearchType = SearchType.Playlist; + + if (StringHelper.EqualsIgnoreCase("upnp:class", subFactors[0]) && + (StringHelper.EqualsIgnoreCase("=", subFactors[1]) || StringHelper.EqualsIgnoreCase("derivedfrom", subFactors[1]))) + { + if (StringHelper.EqualsIgnoreCase("\"object.item.imageItem\"", subFactors[2]) || StringHelper.EqualsIgnoreCase("\"object.item.imageItem.photo\"", subFactors[2])) + { + SearchType = SearchType.Image; + } + else if (StringHelper.EqualsIgnoreCase("\"object.item.videoItem\"", subFactors[2])) + { + SearchType = SearchType.Video; + } + else if (StringHelper.EqualsIgnoreCase("\"object.container.playlistContainer\"", subFactors[2])) + { + SearchType = SearchType.Playlist; + } + else if (StringHelper.EqualsIgnoreCase("\"object.container.album.musicAlbum\"", subFactors[2])) + { + SearchType = SearchType.MusicAlbum; + } + } } } } diff --git a/MediaBrowser.Model/Dlna/SearchType.cs b/MediaBrowser.Model/Dlna/SearchType.cs index 68c047603d..27b2078792 100644 --- a/MediaBrowser.Model/Dlna/SearchType.cs +++ b/MediaBrowser.Model/Dlna/SearchType.cs @@ -6,6 +6,7 @@ Audio = 1, Image = 2, Video = 3, - Playlist = 4 + Playlist = 4, + MusicAlbum = 5 } } \ No newline at end of file diff --git a/MediaBrowser.Model/Dto/BaseItemDto.cs b/MediaBrowser.Model/Dto/BaseItemDto.cs index fbe9664c00..d3e61792fa 100644 --- a/MediaBrowser.Model/Dto/BaseItemDto.cs +++ b/MediaBrowser.Model/Dto/BaseItemDto.cs @@ -347,24 +347,12 @@ namespace MediaBrowser.Model.Dto /// The user data. public UserItemDataDto UserData { get; set; } - /// - /// Gets or sets the played percentage. - /// - /// The played percentage. - public double? PlayedPercentage { get; set; } - /// /// Gets or sets the recursive item count. /// /// The recursive item count. public int? RecursiveItemCount { get; set; } - /// - /// Gets or sets the recursive unplayed item count. - /// - /// The recursive unplayed item count. - public int? RecursiveUnplayedItemCount { get; set; } - /// /// Gets or sets the child count. /// diff --git a/MediaBrowser.Model/Extensions/StringHelper.cs b/MediaBrowser.Model/Extensions/StringHelper.cs index 2eae56cd4f..206723467c 100644 --- a/MediaBrowser.Model/Extensions/StringHelper.cs +++ b/MediaBrowser.Model/Extensions/StringHelper.cs @@ -1,5 +1,6 @@ using System; using System.Globalization; +using System.Text.RegularExpressions; namespace MediaBrowser.Model.Extensions { @@ -70,5 +71,28 @@ namespace MediaBrowser.Model.Extensions { return str.TrimStart(c); } + + /// + /// Splits the specified string. + /// + /// The string. + /// The term. + /// System.String[]. + public static string[] RegexSplit(string str, string term) + { + return Regex.Split(str, term, RegexOptions.IgnoreCase); + } + + /// + /// Splits the specified string. + /// + /// The string. + /// The term. + /// The limit. + /// System.String[]. + public static string[] RegexSplit(string str, string term, int limit) + { + return new Regex(term).Split(str, limit); + } } } diff --git a/MediaBrowser.Model/Logging/ILogger.cs b/MediaBrowser.Model/Logging/ILogger.cs index fd704a2547..f4eb79a281 100644 --- a/MediaBrowser.Model/Logging/ILogger.cs +++ b/MediaBrowser.Model/Logging/ILogger.cs @@ -51,14 +51,6 @@ namespace MediaBrowser.Model.Logging /// The param list. void FatalException(string message, Exception exception, params object[] paramList); - /// - /// Logs the specified severity. - /// - /// The severity. - /// The message. - /// The param list. - void Log(LogSeverity severity, string message, params object[] paramList); - /// /// Logs the exception. /// diff --git a/MediaBrowser.Server.Implementations/Dto/DtoService.cs b/MediaBrowser.Server.Implementations/Dto/DtoService.cs index ace794b197..0b680c87c1 100644 --- a/MediaBrowser.Server.Implementations/Dto/DtoService.cs +++ b/MediaBrowser.Server.Implementations/Dto/DtoService.cs @@ -256,9 +256,7 @@ namespace MediaBrowser.Server.Implementations.Dto SetSpecialCounts(folder, user, dto, fields); } - dto.UserData.Played = dto.PlayedPercentage.HasValue && dto.PlayedPercentage.Value >= 100; - dto.UserData.PlayedPercentage = dto.PlayedPercentage; - dto.UserData.UnplayedItemCount = dto.RecursiveUnplayedItemCount; + dto.UserData.Played = dto.UserData.PlayedPercentage.HasValue && dto.UserData.PlayedPercentage.Value >= 100; } else @@ -1365,11 +1363,11 @@ namespace MediaBrowser.Server.Implementations.Dto } dto.RecursiveItemCount = recursiveItemCount; - dto.RecursiveUnplayedItemCount = unplayed; + dto.UserData.UnplayedItemCount = unplayed; if (recursiveItemCount > 0) { - dto.PlayedPercentage = totalPercentPlayed / recursiveItemCount; + dto.UserData.PlayedPercentage = totalPercentPlayed / recursiveItemCount; } if (runtime > 0 && fields.Contains(ItemFields.CumulativeRunTimeTicks)) diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/es.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/es.json index ad1757900a..7351fe7347 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/es.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/es.json @@ -231,59 +231,59 @@ "OptionBlockLiveTvChannels": "Canales de Tv en vivo", "OptionBlockChannelContent": "Contenido de canales de Internet", "ButtonRevoke": "Revocar", - "MessageConfirmRevokeApiKey": "Are you sure you wish to revoke this api key? The application's connection to Media Browser will be abruptly terminated.", - "HeaderConfirmRevokeApiKey": "Revoke Api Key", - "ValueContainer": "Container: {0}", - "ValueAudioCodec": "Audio Codec: {0}", - "ValueVideoCodec": "Video Codec: {0}", + "MessageConfirmRevokeApiKey": "\u00bfEst\u00e1 seguro de que desea revocar esta clave api? La conexi\u00f3n de la aplicaci\u00f3n con Mediabrowser terminar\u00e1 abruptamente.", + "HeaderConfirmRevokeApiKey": "Revocar Clave Api", + "ValueContainer": "Contenedor: {0}", + "ValueAudioCodec": "Codec de audio: {0}", + "ValueVideoCodec": "Codec de video: {0}", "ValueCodec": "Codec: {0}", - "ValueConditions": "Conditions: {0}", - "LabelAll": "All", - "HeaderDeleteImage": "Delete Image", - "MessageFileNotFound": "File not found.", - "MessageFileReadError": "An error occurred reading this file.", - "ButtonNextPage": "Next Page", - "ButtonPreviousPage": "Previous Page", - "ButtonMoveLeft": "Move left", - "ButtonMoveRight": "Move right", - "ButtonBrowseOnlineImages": "Browse online images", - "HeaderDeleteItem": "Delete Item", - "ConfirmDeleteItem": "Are you sure you wish to delete this item from your library?", - "MessagePleaseEnterNameOrId": "Please enter a name or an external Id.", - "MessageValueNotCorrect": "The value entered is not correct. Please try again.", - "MessageItemSaved": "Item saved.", + "ValueConditions": "Condiciones: {0}", + "LabelAll": "Todo", + "HeaderDeleteImage": "Borrar imagen", + "MessageFileNotFound": "Archivo no encontrado.", + "MessageFileReadError": "Ha ocurrido un error leyendo este archivo.", + "ButtonNextPage": "P\u00e1gina siguiente", + "ButtonPreviousPage": "P\u00e1gina anterior", + "ButtonMoveLeft": "Mover izquierda", + "ButtonMoveRight": "Mover derecha", + "ButtonBrowseOnlineImages": "Navegar im\u00e1genes online", + "HeaderDeleteItem": "Borrar elemento", + "ConfirmDeleteItem": "\u00bfEst\u00e1 seguro que desea borrar este elemento de su biblioteca?", + "MessagePleaseEnterNameOrId": "Introduzca un nombre o un identificador externo.", + "MessageValueNotCorrect": "El valor introducido no es correcto. Intentelo de nuevo.", + "MessageItemSaved": "Elemento grabado.", "OptionEnded": "Finalizado", "OptionContinuing": "Continuando", "OptionOff": "Apagado", "OptionOn": "Encendido", - "HeaderFields": "Fields", - "HeaderFieldsHelp": "Slide a field to 'off' to lock it and prevent it's data from being changed.", - "HeaderLiveTV": "Live TV", - "MissingLocalTrailer": "Missing local trailer.", - "MissingPrimaryImage": "Missing primary image.", - "MissingBackdropImage": "Missing backdrop image.", - "MissingLogoImage": "Missing logo image.", - "MissingEpisode": "Missing episode.", - "OptionScreenshots": "Screenshots", - "OptionBackdrops": "Backdrops", - "OptionImages": "Images", - "OptionKeywords": "Keywords", - "OptionTags": "Tags", - "OptionStudios": "Studios", - "OptionName": "Name", - "OptionOverview": "Overview", - "OptionGenres": "Genres", + "HeaderFields": "Campos", + "HeaderFieldsHelp": "Deslice un campo en 'off' para bloquearlo y evitar que la informaci\u00f3n sea cambiada.", + "HeaderLiveTV": "Tv en vivo", + "MissingLocalTrailer": "Falta trailer local.", + "MissingPrimaryImage": "Falta imagen principal.", + "MissingBackdropImage": "Falta imagen de fondo.", + "MissingLogoImage": "Falta logo.", + "MissingEpisode": "Falta episodio.", + "OptionScreenshots": "Capturas del pantalla", + "OptionBackdrops": "Im\u00e1genes de fondo", + "OptionImages": "Im\u00e1genes", + "OptionKeywords": "Palabras clave", + "OptionTags": "Etiquetas", + "OptionStudios": "Estudios", + "OptionName": "Nombre", + "OptionOverview": "Sinopsis", + "OptionGenres": "G\u00e9neros", "OptionParentalRating": "Clasificaci\u00f3n parental", - "OptionPeople": "People", + "OptionPeople": "Gente", "OptionRuntime": "Tiempo", - "OptionProductionLocations": "Production Locations", - "OptionBirthLocation": "Birth Location", + "OptionProductionLocations": "Localizaciones de producci\u00f3n", + "OptionBirthLocation": "Lugar de nacimiento", "LabelAllChannels": "Todos los canales", - "LabelLiveProgram": "LIVE", - "LabelNewProgram": "NEW", - "LabelPremiereProgram": "PREMIERE", + "LabelLiveProgram": "EN VIVO", + "LabelNewProgram": "NUEVO", + "LabelPremiereProgram": "ESTRENO", "LabelHDProgram": "HD", - "HeaderChangeFolderType": "Change Folder Type", + "HeaderChangeFolderType": "Cambiar tipo de carpeta", "HeaderChangeFolderTypeHelp": "To change the folder type, please remove and rebuild the collection with the new type.", "HeaderAlert": "Alert", "MessagePleaseRestart": "Please restart to finish updating.", diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/es_MX.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/es_MX.json index 885109fcb3..83532d27e5 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/es_MX.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/es_MX.json @@ -346,33 +346,33 @@ "HeaderSeasonNumber": "N\u00famero de temporada", "HeaderNetwork": "Cadena", "HeaderYear": "A\u00f1o", - "HeaderGameSystem": "Sistema de Juegos", + "HeaderGameSystem": "Sistema de juegos", "HeaderPlayers": "Jugadores", "HeaderEmbeddedImage": "Im\u00e1gen embebida", "HeaderTrack": "Pista", "HeaderDisc": "Disco", "OptionMovies": "Pel\u00edculas", - "OptionCollections": "Collection", + "OptionCollections": "Colecci\u00f3n", "OptionSeries": "Series", - "OptionSeasons": "Seasons", + "OptionSeasons": "Temporadas", "OptionEpisodes": "Episodios", - "OptionGames": "Games", - "OptionGameSystems": "Game systems", - "OptionMusicArtists": "Music artists", - "OptionMusicAlbums": "Music albums", - "OptionMusicVideos": "Music videos", - "OptionSongs": "Songs", - "OptionHomeVideos": "Home videos", - "OptionBooks": "Books", - "OptionAdultVideos": "Adult videos", - "ButtonUp": "Up", - "ButtonDown": "Down", - "LabelMetadataReaders": "Metadata readers:", - "LabelMetadataReadersHelp": "Rank your preferred local metadata sources in order of priority. The first file found will be read.", - "LabelMetadataDownloaders": "Metadata downloaders:", - "LabelMetadataDownloadersHelp": "Enable and rank your preferred metadata downloaders in order of priority. Lower priority downloaders will only be used to fill in missing information.", - "LabelMetadataSavers": "Metadata savers:", - "LabelMetadataSaversHelp": "Choose the file formats to save your metadata to.", - "LabelImageFetchers": "Image fetchers:", - "LabelImageFetchersHelp": "Enable and rank your preferred image fetchers in order of priority." + "OptionGames": "Juegos", + "OptionGameSystems": "Sistemas de juegos", + "OptionMusicArtists": "Int\u00e9rpretes", + "OptionMusicAlbums": "\u00c1lbums musicales", + "OptionMusicVideos": "Videos musicales", + "OptionSongs": "Canciones", + "OptionHomeVideos": "Videos caseros", + "OptionBooks": "Libros", + "OptionAdultVideos": "Videos para adultos", + "ButtonUp": "Arriba", + "ButtonDown": "Abajo", + "LabelMetadataReaders": "Lectores de metadatos:", + "LabelMetadataReadersHelp": "Ordene sus fuentes de metadatos locales por prioridad. El primer archivo encontrado ser\u00e1 le\u00eddo.", + "LabelMetadataDownloaders": "Recolectores de metadatos:", + "LabelMetadataDownloadersHelp": "Habilite y priorice sus recolectores de metadatos preferidos. Los recolectores de metadatos de menor prioridad solo ser\u00e1n utilizados para llenar informaci\u00f3n faltante.", + "LabelMetadataSavers": "Grabadores de metadatos:", + "LabelMetadataSaversHelp": "Seleccione los formatos de archivo con los que se guardaran sus metadatos.", + "LabelImageFetchers": "Recolectores de im\u00e1genes:", + "LabelImageFetchersHelp": "Habilite y priorice sus recolectores de im\u00e1genes preferidos." } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/fr.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/fr.json index 49a5803d0e..6387d75cee 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/fr.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/fr.json @@ -222,7 +222,7 @@ "HeaderBlockItemsWithNoRating": "Bloquer les items ne comportant aucune information de classement :", "OptionBlockOthers": "Autres", "OptionBlockTvShows": "Emissions TV", - "OptionBlockTrailers": "Bande-annonces", + "OptionBlockTrailers": "Bandes-annonces", "OptionBlockMusic": "Musiques", "OptionBlockMovies": "Films", "OptionBlockBooks": "Livres", @@ -332,7 +332,7 @@ "ValueOriginalAirDate": "Date de diffusion originale: {0}", "ButtonRemoveFromPlaylist": "Remove from playlist", "HeaderSpecials": "Specials", - "HeaderTrailers": "Bande-Annonces", + "HeaderTrailers": "Bandes-annonces", "HeaderAudio": "Audio", "HeaderResolution": "R\u00e9solution", "HeaderVideo": "Vid\u00e9o", @@ -354,16 +354,16 @@ "OptionMovies": "Films", "OptionCollections": "Collection", "OptionSeries": "Series", - "OptionSeasons": "Seasons", + "OptionSeasons": "Saisons", "OptionEpisodes": "\u00c9pisodes", - "OptionGames": "Games", + "OptionGames": "Jeux", "OptionGameSystems": "Game systems", "OptionMusicArtists": "Music artists", "OptionMusicAlbums": "Music albums", "OptionMusicVideos": "Music videos", - "OptionSongs": "Songs", + "OptionSongs": "Chansons", "OptionHomeVideos": "Home videos", - "OptionBooks": "Books", + "OptionBooks": "Livres", "OptionAdultVideos": "Adult videos", "ButtonUp": "Up", "ButtonDown": "Down", diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/javascript.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/javascript.json index ef979a2c99..d274e1b3b0 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/javascript.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/javascript.json @@ -358,7 +358,7 @@ "HeaderTrack": "Track", "HeaderDisc": "Disc", "OptionMovies": "Movies", - "OptionCollections": "Collection", + "OptionCollections": "Collections", "OptionSeries": "Series", "OptionSeasons": "Seasons", "OptionEpisodes": "Episodes", diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/kk.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/kk.json index 9520907ac7..36deb05e47 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/kk.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/kk.json @@ -146,7 +146,7 @@ "ButtonAdd": "\u04ae\u0441\u0442\u0435\u0443", "ButtonRemove": "\u0410\u043b\u0430\u0441\u0442\u0430\u0443", "LabelChapterDownloaders": "\u0421\u0430\u0445\u043d\u0430\u043b\u0430\u0440\u0434\u044b \u0436\u04af\u043a\u0442\u0435\u0443\u0448\u0456\u043b\u0435\u0440:", - "LabelChapterDownloadersHelp": "\u0421\u0430\u0445\u043d\u0430 \u0436\u04af\u043a\u0442\u0435\u0443\u0448\u0456\u043b\u0435\u0440\u0456\u043d \u049b\u043e\u0441\u044b\u04a3\u044b\u0437 \u0436\u04d9\u043d\u0435 \u0431\u0430\u0441\u044b\u043c\u0434\u044b\u043b\u044b\u049b \u0440\u0435\u0442\u0456 \u0431\u043e\u0439\u044b\u043d\u0448\u0430 \u0434\u04d9\u0440\u0435\u0436\u0435 \u0431\u0435\u0440\u0456\u04a3\u0456\u0437. \u0422\u04e9\u043c\u0435\u043d\u0433\u0456 \u0431\u0430\u0441\u044b\u043c\u0434\u044b\u043b\u044b\u0493\u044b \u0431\u0430\u0440 \u0436\u04af\u043a\u0442\u0435\u0443\u0448\u0456\u043b\u0435\u0440 \u0442\u0435\u043a \u049b\u0430\u043d\u0430 \u0436\u043e\u049b \u0430\u049b\u043f\u0430\u0440\u0430\u0442\u0442\u044b \u0442\u043e\u043b\u0442\u044b\u0440\u0443 \u04af\u0448\u0456\u043d \u043f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u044b\u043b\u0430\u0434\u044b.", + "LabelChapterDownloadersHelp": "\u0422\u0435\u04a3\u0448\u0435\u043b\u0433\u0435\u043d \u0441\u0430\u0445\u043d\u0430 \u0436\u04af\u043a\u0442\u0435\u0443\u0448\u0456\u043b\u0435\u0440\u0456\u043d \u049b\u043e\u0441\u044b\u04a3\u044b\u0437 \u0436\u04d9\u043d\u0435 \u0431\u0430\u0441\u044b\u043c\u0434\u044b\u043b\u044b\u049b \u0440\u0435\u0442\u0456 \u0431\u043e\u0439\u044b\u043d\u0448\u0430 \u0434\u04d9\u0440\u0435\u0436\u0435 \u0431\u0435\u0440\u0456\u04a3\u0456\u0437. \u0422\u04e9\u043c\u0435\u043d\u0433\u0456 \u0431\u0430\u0441\u044b\u043c\u0434\u044b\u043b\u044b\u0493\u044b \u0431\u0430\u0440 \u0436\u04af\u043a\u0442\u0435\u0443\u0448\u0456\u043b\u0435\u0440 \u0442\u0435\u043a \u049b\u0430\u043d\u0430 \u0436\u043e\u049b \u0430\u049b\u043f\u0430\u0440\u0430\u0442\u0442\u044b \u0442\u043e\u043b\u0442\u044b\u0440\u0443 \u04af\u0448\u0456\u043d \u043f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u044b\u043b\u0430\u0434\u044b.", "HeaderFavoriteAlbums": "\u0422\u0430\u04a3\u0434\u0430\u0443\u043b\u044b \u0430\u043b\u044c\u0431\u043e\u043c\u0434\u0430\u0440", "HeaderLatestChannelMedia": "\u0410\u0440\u043d\u0430\u043b\u0430\u0440\u0434\u044b\u04a3 \u0435\u04a3 \u043a\u0435\u0439\u0456\u043d\u0433\u0456 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0442\u0435\u0440\u0456", "ButtonOrganizeFile": "\u0424\u0430\u0439\u043b\u0434\u044b \u04b1\u0439\u044b\u043c\u0434\u0430\u0441\u0442\u044b\u0440\u0443", @@ -352,27 +352,27 @@ "HeaderTrack": "\u0416\u043e\u043b\u0448\u044b\u049b", "HeaderDisc": "\u0414\u0438\u0441\u043a\u0456", "OptionMovies": "\u0424\u0438\u043b\u044c\u043c\u0434\u0435\u0440", - "OptionCollections": "Collection", - "OptionSeries": "Series", - "OptionSeasons": "Seasons", + "OptionCollections": "\u0416\u0438\u043d\u0430\u049b\u0442\u0430\u0440", + "OptionSeries": "\u0421\u0435\u0440\u0438\u0430\u043b\u0434\u0430\u0440", + "OptionSeasons": "\u041c\u0430\u0443\u0441\u044b\u043c\u0434\u0430\u0440", "OptionEpisodes": "\u042d\u043f\u0438\u0437\u043e\u0434\u0442\u0430\u0440", - "OptionGames": "Games", - "OptionGameSystems": "Game systems", - "OptionMusicArtists": "Music artists", - "OptionMusicAlbums": "Music albums", - "OptionMusicVideos": "Music videos", - "OptionSongs": "Songs", - "OptionHomeVideos": "Home videos", - "OptionBooks": "Books", - "OptionAdultVideos": "Adult videos", - "ButtonUp": "Up", - "ButtonDown": "Down", - "LabelMetadataReaders": "Metadata readers:", - "LabelMetadataReadersHelp": "Rank your preferred local metadata sources in order of priority. The first file found will be read.", - "LabelMetadataDownloaders": "Metadata downloaders:", - "LabelMetadataDownloadersHelp": "Enable and rank your preferred metadata downloaders in order of priority. Lower priority downloaders will only be used to fill in missing information.", - "LabelMetadataSavers": "Metadata savers:", - "LabelMetadataSaversHelp": "Choose the file formats to save your metadata to.", - "LabelImageFetchers": "Image fetchers:", - "LabelImageFetchersHelp": "Enable and rank your preferred image fetchers in order of priority." + "OptionGames": "\u041e\u0439\u044b\u043d\u0434\u0430\u0440", + "OptionGameSystems": "\u041e\u0439\u044b\u043d \u0436\u04af\u0439\u0435\u043b\u0435\u0440\u0456", + "OptionMusicArtists": "\u041c\u0443\u0437\u044b\u043a\u0430 \u043e\u0440\u044b\u043d\u0434\u0430\u0443\u0448\u044b\u043b\u0430\u0440\u044b", + "OptionMusicAlbums": "\u041c\u0443\u0437\u044b\u043a\u0430 \u0430\u043b\u044c\u0431\u043e\u043c\u0434\u0430\u0440\u044b", + "OptionMusicVideos": "\u041c\u0443\u0437\u044b\u043a\u0430 \u043a\u043b\u0438\u043f\u0442\u0435\u0440\u0456", + "OptionSongs": "\u04d8\u0443\u0435\u043d\u0434\u0435\u0440", + "OptionHomeVideos": "\u04ae\u0439 \u0431\u0435\u0439\u043d\u0435\u043b\u0435\u0440\u0456", + "OptionBooks": "\u041a\u0456\u0442\u0430\u043f\u0442\u0430\u0440", + "OptionAdultVideos": "\u0415\u0440\u0435\u0441\u0435\u043a \u0431\u0435\u0439\u043d\u0435\u043b\u0435\u0440\u0456", + "ButtonUp": "\u0416\u043e\u0493\u0430\u0440\u044b\u0493\u0430", + "ButtonDown": "\u0422\u04e9\u043c\u0435\u043d\u0433\u0435", + "LabelMetadataReaders": "\u041c\u0435\u0442\u0430\u0434\u0435\u0440\u0435\u043a \u043e\u049b\u0443\u0448\u044b\u043b\u0430\u0440\u044b:", + "LabelMetadataReadersHelp": "\u0422\u0435\u04a3\u0448\u0435\u043b\u0433\u0435\u043d \u043c\u0435\u0442\u0430\u0434\u0435\u0440\u0435\u043a \u049b\u0430\u0439\u043d\u0430\u0440 \u043a\u04e9\u0437\u0434\u0435\u0440\u0456\u043d\u0435 \u0431\u0430\u0441\u044b\u043c\u0434\u044b\u043b\u044b\u049b \u0440\u0435\u0442\u0456 \u0431\u043e\u0439\u044b\u043d\u0448\u0430 \u0434\u04d9\u0440\u0435\u0436\u0435 \u0431\u0435\u0440\u0456\u04a3\u0456\u0437. \u0411\u0456\u0440\u0456\u043d\u0448\u0456 \u0442\u0430\u0431\u044b\u043b\u0493\u0430\u043d \u0444\u0430\u0439\u043b \u043e\u049b\u044b\u043b\u0430\u0434\u044b.", + "LabelMetadataDownloaders": "\u041c\u0435\u0442\u0430\u0434\u0435\u0440\u0435\u043a \u0436\u04af\u043a\u0442\u0435\u0443\u0448\u0456\u043b\u0435\u0440\u0456:", + "LabelMetadataDownloadersHelp": "\u0422\u0435\u04a3\u0448\u0435\u043b\u0433\u0435\u043d \u043c\u0435\u0442\u0430\u0434\u0435\u0440\u0435\u043a \u0436\u04af\u043a\u0442\u0435\u0443\u0448\u0456\u043b\u0435\u0440\u0456\u043d \u049b\u043e\u0441\u044b\u04a3\u044b\u0437 \u0436\u04d9\u043d\u0435 \u0431\u0430\u0441\u044b\u043c\u0434\u044b\u043b\u044b\u049b \u0440\u0435\u0442\u0456 \u0431\u043e\u0439\u044b\u043d\u0448\u0430 \u0434\u04d9\u0440\u0435\u0436\u0435 \u0431\u0435\u0440\u0456\u04a3\u0456\u0437. \u0422\u04e9\u043c\u0435\u043d\u0433\u0456 \u0431\u0430\u0441\u044b\u043c\u0434\u044b\u043b\u044b\u0493\u044b \u0431\u0430\u0440 \u0436\u04af\u043a\u0442\u0435\u0443\u0448\u0456\u043b\u0435\u0440 \u0442\u0435\u043a \u049b\u0430\u043d\u0430 \u0436\u043e\u049b \u0430\u049b\u043f\u0430\u0440\u0430\u0442\u0442\u044b \u0442\u043e\u043b\u0442\u044b\u0440\u0443 \u04af\u0448\u0456\u043d \u043f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u044b\u043b\u0430\u0434\u044b.", + "LabelMetadataSavers": "\u041c\u0435\u0442\u0430\u0434\u0435\u0440\u0435\u043a \u0441\u0430\u049b\u0442\u0430\u0443\u0448\u044b\u043b\u0430\u0440\u044b:", + "LabelMetadataSaversHelp": "\u041c\u0435\u0442\u0430\u0434\u0435\u0440\u0435\u043a\u0442\u0435\u0440\u0434\u0456 \u049b\u0430\u0439\u0434\u0430 \u0441\u0430\u049b\u0442\u0430\u0439\u0442\u044b\u043d \u0444\u0430\u0439\u043b \u043f\u0456\u0448\u0456\u043c\u0434\u0435\u0440\u0456\u043d \u0442\u0430\u04a3\u0434\u0430\u0443.", + "LabelImageFetchers": "\u0421\u0443\u0440\u0435\u0442 \u0456\u0440\u0456\u043a\u0442\u0435\u0443\u0448\u0456\u043b\u0435\u0440\u0456:", + "LabelImageFetchersHelp": "\u0422\u0435\u04a3\u0448\u0435\u043b\u0433\u0435\u043d \u0441\u0443\u0440\u0435\u0442 \u0456\u0440\u0456\u043a\u0442\u0435\u0443\u0448\u0456\u043b\u0435\u0440\u0456\u043d \u049b\u043e\u0441\u044b\u04a3\u044b\u0437 \u0436\u04d9\u043d\u0435 \u0431\u0430\u0441\u044b\u043c\u0434\u044b\u043b\u044b\u049b \u0440\u0435\u0442\u0456 \u0431\u043e\u0439\u044b\u043d\u0448\u0430 \u0434\u04d9\u0440\u0435\u0436\u0435 \u0431\u0435\u0440\u0456\u04a3\u0456\u0437." } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/nl.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/nl.json index 781ef70cf6..ce3641e23a 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/nl.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/nl.json @@ -352,27 +352,27 @@ "HeaderTrack": "Track", "HeaderDisc": "Schijf", "OptionMovies": "Films", - "OptionCollections": "Collection", + "OptionCollections": "Collectie", "OptionSeries": "Series", - "OptionSeasons": "Seasons", + "OptionSeasons": "Seizoenen", "OptionEpisodes": "Afleveringen", - "OptionGames": "Games", - "OptionGameSystems": "Game systems", - "OptionMusicArtists": "Music artists", - "OptionMusicAlbums": "Music albums", + "OptionGames": "Spellen", + "OptionGameSystems": "Spel Systemen", + "OptionMusicArtists": "Muziek artiesten", + "OptionMusicAlbums": "Muziek albums", "OptionMusicVideos": "Music videos", - "OptionSongs": "Songs", - "OptionHomeVideos": "Home videos", - "OptionBooks": "Books", - "OptionAdultVideos": "Adult videos", - "ButtonUp": "Up", - "ButtonDown": "Down", - "LabelMetadataReaders": "Metadata readers:", - "LabelMetadataReadersHelp": "Rank your preferred local metadata sources in order of priority. The first file found will be read.", - "LabelMetadataDownloaders": "Metadata downloaders:", - "LabelMetadataDownloadersHelp": "Enable and rank your preferred metadata downloaders in order of priority. Lower priority downloaders will only be used to fill in missing information.", - "LabelMetadataSavers": "Metadata savers:", - "LabelMetadataSaversHelp": "Choose the file formats to save your metadata to.", - "LabelImageFetchers": "Image fetchers:", - "LabelImageFetchersHelp": "Enable and rank your preferred image fetchers in order of priority." + "OptionSongs": "Nummers ", + "OptionHomeVideos": "Home video's", + "OptionBooks": "Boeken", + "OptionAdultVideos": "Erotische video's", + "ButtonUp": "Omhoog", + "ButtonDown": "Omlaag", + "LabelMetadataReaders": "Metagedata lezers:", + "LabelMetadataReadersHelp": "Rangschik de gewenste lokale metadata bronnen in volgorde van prioriteit. Het eerst gevonden bestand zal worden gelezen.", + "LabelMetadataDownloaders": "Metadata Downloaders:", + "LabelMetadataDownloadersHelp": "Schakelen in en rangschik uw voorkeurs metadata downloader, gerangschikt in volgorde van prioriteit. Lagere prioriteit downloaders zullen alleen worden gebruikt om de ontbrekende informatie in te vullen.", + "LabelMetadataSavers": "Metadata Opslag:", + "LabelMetadataSaversHelp": "Kies de bestandsindeling om uw metadata op te slaan.", + "LabelImageFetchers": "Afbeeldingen Downloaders:", + "LabelImageFetchersHelp": "Schakelen in en rangschik uw voorkeurs Afbeeldingen downloader, gerangschikt in volgorde van prioriteit." } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/pt_BR.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/pt_BR.json index 6bd2717566..c8fe455601 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/pt_BR.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/pt_BR.json @@ -58,14 +58,14 @@ "ButtonMute": "Mudo", "ButtonUnmute": "Remover Mudo", "ButtonStop": "Parar", - "ButtonNextTrack": "Pr\u00f3xima faixa", + "ButtonNextTrack": "Pr\u00f3xima Faixa", "ButtonPause": "Pausar", "ButtonPlay": "Reproduzir", "ButtonEdit": "Editar", "ButtonQueue": "Adicionar \u00e0 fila", "ButtonPlayTrailer": "Reproduzir trailer", "ButtonPlaylist": "Lista de reprodu\u00e7\u00e3o", - "ButtonPreviousTrack": "Faixa anterior", + "ButtonPreviousTrack": "Faixa Anterior", "LabelEnabled": "Ativada", "LabelDisabled": "Desativada", "ButtonMoreInformation": "Mais informa\u00e7\u00f5es", @@ -153,7 +153,7 @@ "ButtonDeleteFile": "Excluir Arquivo", "HeaderOrganizeFile": "Organizar Arquivo", "HeaderDeleteFile": "Excluir Arquivo", - "StatusSkipped": "Ignorado", + "StatusSkipped": "Ignorada", "StatusFailed": "Com Falha", "StatusSuccess": "Sucesso", "MessageFileWillBeDeleted": "Ser\u00e1 exclu\u00eddo o seguinte arquivo:", @@ -326,7 +326,7 @@ "LabelName": "Nome:", "ButtonSubmit": "Enviar", "LabelSelectPlaylist": "Lista de Reprodu\u00e7\u00e3o:", - "OptionNewPlaylist": "Nova lista de reprodu\u00e7\u00e3o...", + "OptionNewPlaylist": "Nova lista de reprodu\u00e7\u00e3o", "MessageAddedToPlaylistSuccess": "Ok", "ButtonViewSeriesRecording": "Visualizar grava\u00e7\u00e3o de s\u00e9ries", "ValueOriginalAirDate": "Data original de exibi\u00e7\u00e3o: {0}", @@ -352,27 +352,27 @@ "HeaderTrack": "Faixa", "HeaderDisc": "Disco", "OptionMovies": "Filmes", - "OptionCollections": "Collection", - "OptionSeries": "Series", - "OptionSeasons": "Seasons", + "OptionCollections": "Cole\u00e7\u00e3o", + "OptionSeries": "S\u00e9ries", + "OptionSeasons": "Temporadas", "OptionEpisodes": "Epis\u00f3dios", - "OptionGames": "Games", - "OptionGameSystems": "Game systems", - "OptionMusicArtists": "Music artists", - "OptionMusicAlbums": "Music albums", - "OptionMusicVideos": "Music videos", - "OptionSongs": "Songs", - "OptionHomeVideos": "Home videos", - "OptionBooks": "Books", - "OptionAdultVideos": "Adult videos", - "ButtonUp": "Up", - "ButtonDown": "Down", - "LabelMetadataReaders": "Metadata readers:", - "LabelMetadataReadersHelp": "Rank your preferred local metadata sources in order of priority. The first file found will be read.", - "LabelMetadataDownloaders": "Metadata downloaders:", - "LabelMetadataDownloadersHelp": "Enable and rank your preferred metadata downloaders in order of priority. Lower priority downloaders will only be used to fill in missing information.", - "LabelMetadataSavers": "Metadata savers:", - "LabelMetadataSaversHelp": "Choose the file formats to save your metadata to.", - "LabelImageFetchers": "Image fetchers:", - "LabelImageFetchersHelp": "Enable and rank your preferred image fetchers in order of priority." + "OptionGames": "Jogos", + "OptionGameSystems": "Sistemas de jogos", + "OptionMusicArtists": "Artistas da M\u00fasica", + "OptionMusicAlbums": "\u00c1lbuns de m\u00fasica", + "OptionMusicVideos": "V\u00eddeos Musicais", + "OptionSongs": "M\u00fasicas", + "OptionHomeVideos": "V\u00eddeos caseiros", + "OptionBooks": "Livros", + "OptionAdultVideos": "V\u00eddeos adultos", + "ButtonUp": "Para cima", + "ButtonDown": "Para baixo", + "LabelMetadataReaders": "Leitores de metadados:", + "LabelMetadataReadersHelp": "Classifique suas fontes preferidas de metadados locais por ordem de prioridade. O primeiro arquivo encontrado ser\u00e1 lido.", + "LabelMetadataDownloaders": "Downloaders de metadados:", + "LabelMetadataDownloadersHelp": "Ative e classifique seus downloaders preferidos de metadados por ordem de prioridade. Downloaders com prioridade mais baixa s\u00f3 ser\u00e3o usados para baixar informa\u00e7\u00e3o que n\u00e3o existe.", + "LabelMetadataSavers": "Gravadores de metadados:", + "LabelMetadataSaversHelp": "Escolha os formatos de arquivos nos quais deseja gravar seus metadados.", + "LabelImageFetchers": "Buscadores de imagem:", + "LabelImageFetchersHelp": "Ative e classifique seus buscadores preferidos de imagem por ordem de prioridade." } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/ru.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/ru.json index 25c2731e9d..d7e7e725bf 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/ru.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/ru.json @@ -146,7 +146,7 @@ "ButtonAdd": "\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c", "ButtonRemove": "\u0418\u0437\u044a\u044f\u0442\u044c", "LabelChapterDownloaders": "\u0417\u0430\u0433\u0440\u0443\u0437\u0447\u0438\u043a\u0438 \u0441\u0446\u0435\u043d:", - "LabelChapterDownloadersHelp": "\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u0435 \u0438 \u0440\u0430\u043d\u0436\u0438\u0440\u0443\u0439\u0442\u0435 \u043f\u0440\u0435\u0434\u043f\u043e\u0447\u0438\u0442\u0430\u0435\u043c\u044b\u0435 \u0437\u0430\u0433\u0440\u0443\u0437\u0447\u0438\u043a\u0438 \u0441\u0446\u0435\u043d \u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442\u0430. \u0417\u0430\u0433\u0440\u0443\u0437\u0447\u0438\u043a\u0438 \u043d\u0438\u0437\u043a\u043e\u0433\u043e \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442\u0430 \u0431\u0443\u0434\u0443\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u0439.", + "LabelChapterDownloadersHelp": "\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u0435 \u0438 \u0440\u0430\u043d\u0436\u0438\u0440\u0443\u0439\u0442\u0435 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0435 \u0437\u0430\u0433\u0440\u0443\u0437\u0447\u0438\u043a\u0438 \u0441\u0446\u0435\u043d \u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442\u0430. \u0417\u0430\u0433\u0440\u0443\u0437\u0447\u0438\u043a\u0438 \u043d\u0438\u0437\u043a\u043e\u0433\u043e \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442\u0430 \u0431\u0443\u0434\u0443\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u044e\u0449\u0435\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438.", "HeaderFavoriteAlbums": "\u0418\u0437\u0431\u0440\u0430\u043d\u043d\u044b\u0435 \u0430\u043b\u044c\u0431\u043e\u043c\u044b", "HeaderLatestChannelMedia": "\u041d\u043e\u0432\u0438\u043d\u043a\u0438 \u043a\u0430\u043d\u0430\u043b\u043e\u0432", "ButtonOrganizeFile": "\u0420\u0435\u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0444\u0430\u0439\u043b", @@ -352,27 +352,27 @@ "HeaderTrack": "\u0414\u043e\u0440\u043e\u0436\u043a\u0430", "HeaderDisc": "\u0414\u0438\u0441\u043a", "OptionMovies": "\u0424\u0438\u043b\u044c\u043c\u044b", - "OptionCollections": "Collection", - "OptionSeries": "Series", - "OptionSeasons": "Seasons", + "OptionCollections": "\u041a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438", + "OptionSeries": "\u0421\u0435\u0440\u0438\u0430\u043b\u044b", + "OptionSeasons": "\u0421\u0435\u0437\u043e\u043d\u044b", "OptionEpisodes": "\u042d\u043f\u0438\u0437\u043e\u0434\u044b", - "OptionGames": "Games", - "OptionGameSystems": "Game systems", - "OptionMusicArtists": "Music artists", - "OptionMusicAlbums": "Music albums", - "OptionMusicVideos": "Music videos", - "OptionSongs": "Songs", - "OptionHomeVideos": "Home videos", - "OptionBooks": "Books", - "OptionAdultVideos": "Adult videos", - "ButtonUp": "Up", - "ButtonDown": "Down", - "LabelMetadataReaders": "Metadata readers:", - "LabelMetadataReadersHelp": "Rank your preferred local metadata sources in order of priority. The first file found will be read.", - "LabelMetadataDownloaders": "Metadata downloaders:", - "LabelMetadataDownloadersHelp": "Enable and rank your preferred metadata downloaders in order of priority. Lower priority downloaders will only be used to fill in missing information.", - "LabelMetadataSavers": "Metadata savers:", - "LabelMetadataSaversHelp": "Choose the file formats to save your metadata to.", - "LabelImageFetchers": "Image fetchers:", - "LabelImageFetchersHelp": "Enable and rank your preferred image fetchers in order of priority." + "OptionGames": "\u0418\u0433\u0440\u044b", + "OptionGameSystems": "\u0418\u0433\u0440\u043e\u0432\u044b\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b", + "OptionMusicArtists": "\u041c\u0443\u0437\u044b\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u0438\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u0438", + "OptionMusicAlbums": "\u041c\u0443\u0437\u044b\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u0430\u043b\u044c\u0431\u043e\u043c\u044b", + "OptionMusicVideos": "\u041c\u0443\u0437\u044b\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u043a\u043b\u0438\u043f\u044b", + "OptionSongs": "\u041c\u0435\u043b\u043e\u0434\u0438\u0438", + "OptionHomeVideos": "\u0414\u043e\u043c\u0430\u0448\u043d\u0435\u0435 \u0432\u0438\u0434\u0435\u043e", + "OptionBooks": "\u041a\u043d\u0438\u0433\u0438", + "OptionAdultVideos": "\u0412\u0437\u0440\u043e\u0441\u043b\u043e\u0435 \u0432\u0438\u0434\u0435\u043e", + "ButtonUp": "\u0412\u0432\u0435\u0440\u0445", + "ButtonDown": "\u0412\u043d\u0438\u0437", + "LabelMetadataReaders": "\u0421\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u0435\u043b\u0438 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445:", + "LabelMetadataReadersHelp": "\u0420\u0430\u043d\u0436\u0438\u0440\u0443\u0439\u0442\u0435 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0435 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0438 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442\u0430. \u0411\u0443\u0434\u0435\u0442 \u0441\u0447\u0438\u0442\u0430\u043d \u043f\u0435\u0440\u0432\u044b\u0439 \u0436\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u044b\u0439 \u0444\u0430\u0439\u043b.", + "LabelMetadataDownloaders": "\u0417\u0430\u0433\u0440\u0443\u0437\u0447\u0438\u043a\u0438 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445:", + "LabelMetadataDownloadersHelp": "\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u0435 \u0438 \u0440\u0430\u043d\u0436\u0438\u0440\u0443\u0439\u0442\u0435 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0435 \u0437\u0430\u0433\u0440\u0443\u0437\u0447\u0438\u043a\u0438 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442\u0430. \u0417\u0430\u0433\u0440\u0443\u0437\u0447\u0438\u043a\u0438 \u0441 \u043d\u0438\u0437\u043a\u0438\u043c \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442\u043e\u043c \u0431\u0443\u0434\u0443\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u044e\u0449\u0435\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438.", + "LabelMetadataSavers": "\u0425\u0440\u0430\u043d\u0438\u0442\u0435\u043b\u0438 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445:", + "LabelMetadataSaversHelp": "\u0412\u044b\u0431\u0440\u0430\u0442\u044c \u0444\u043e\u0440\u043c\u0430\u0442\u044b \u0444\u0430\u0439\u043b\u043e\u0432, \u043a\u0443\u0434\u0430 \u0431\u0443\u0434\u0443\u0442 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c\u0441\u044f \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435.", + "LabelImageFetchers": "\u041e\u0442\u0431\u043e\u0440\u0449\u0438\u043a\u0438 \u0440\u0438\u0441\u0443\u043d\u043a\u043e\u0432:", + "LabelImageFetchersHelp": "\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u0435 \u0438 \u0440\u0430\u043d\u0436\u0438\u0440\u0443\u0439\u0442\u0435 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0435 \u043e\u0442\u0431\u043e\u0440\u0449\u0438\u043a\u0438 \u0440\u0438\u0441\u0443\u043d\u043a\u043e\u0432 \u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442\u0430." } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/sv.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/sv.json index a49dda0dc0..f767c99261 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/sv.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/sv.json @@ -321,12 +321,12 @@ "ButtonNew": "Nytillkommet", "MessageInternetExplorerWebm": "F\u00f6r b\u00e4sta resultat med Internet Explorer, installera WebM-till\u00e4gget f\u00f6r IE.", "HeaderVideoError": "Videofel", - "ButtonAddToPlaylist": "Add to playlist", - "HeaderAddToPlaylist": "Add to Playlist", + "ButtonAddToPlaylist": "L\u00e4gg till i spellista", + "HeaderAddToPlaylist": "L\u00e4gg till i Spellista", "LabelName": "Namn:", "ButtonSubmit": "Bekr\u00e4fta", - "LabelSelectPlaylist": "Playlist:", - "OptionNewPlaylist": "New playlist...", + "LabelSelectPlaylist": "Spellista:", + "OptionNewPlaylist": "Ny spellista...", "MessageAddedToPlaylistSuccess": "Ok", "ButtonViewSeriesRecording": "View series recording", "ValueOriginalAirDate": "Original air date: {0}", diff --git a/MediaBrowser.Server.Implementations/Localization/Server/es.json b/MediaBrowser.Server.Implementations/Localization/Server/es.json index 31ddbbbede..3570ac997f 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/es.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/es.json @@ -877,11 +877,11 @@ "HeaderDevice": "Dispositivo", "HeaderUser": "Usuario", "HeaderDateIssued": "Fecha de emisi\u00f3n", - "LabelChapterName": "Chapter {0}", - "HeaderNewApiKey": "New Api Key", - "LabelAppName": "App name", - "LabelAppNameExample": "Example: Sickbeard, NzbDrone", - "HeaderNewApiKeyHelp": "Grant an application permission to communicate with Media Browser.", + "LabelChapterName": "Cap\u00edtulo {0}", + "HeaderNewApiKey": "Nueva Clave Api", + "LabelAppName": "Nombre de la app", + "LabelAppNameExample": "Ejemplo: Sickbeard, NzbDrone", + "HeaderNewApiKeyHelp": "Otorgar un permiso a la aplicaci\u00f3n para comunicarse con Media Browser.", "HeaderHttpHeaders": "Http Headers", "HeaderIdentificationHeader": "Identification Header", "LabelValue": "Value:", diff --git a/MediaBrowser.Server.Implementations/Localization/Server/es_MX.json b/MediaBrowser.Server.Implementations/Localization/Server/es_MX.json index af3dcc765c..7bd37891bd 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/es_MX.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/es_MX.json @@ -374,7 +374,7 @@ "HeaderGallery": "Galer\u00eda", "HeaderLatestGames": "Juegos Recientes", "HeaderRecentlyPlayedGames": "Juegos Usados Recientemente", - "TabGameSystems": "Sistemas de Juego", + "TabGameSystems": "Sistemas de Juegos", "TitleMediaLibrary": "Biblioteca de Medios", "TabFolders": "Carpetas", "TabPathSubstitution": "Rutas Alternativas", diff --git a/MediaBrowser.Server.Implementations/Localization/Server/fr.json b/MediaBrowser.Server.Implementations/Localization/Server/fr.json index 9e9c42197b..0a44fd6018 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/fr.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/fr.json @@ -1,6 +1,6 @@ { "LabelExit": "Quitter", - "HeaderPassword": "Password", + "HeaderPassword": "Mot de passe", "LabelVisitCommunity": "Visiter la Communaut\u00e9", "HeaderLocalAccess": "Local Access", "LabelGithubWiki": "GitHub Wiki", @@ -180,7 +180,7 @@ "OptionHasThemeVideo": "Vid\u00e9o th\u00e8me", "TabMovies": "Films", "TabStudios": "Studios", - "TabTrailers": "Bande-annonces", + "TabTrailers": "Bandes-annonces", "HeaderLatestMovies": "Films les plus r\u00e9cents", "HeaderLatestTrailers": "Bande-annonces les plus r\u00e9centes", "OptionHasSpecialFeatures": "Bonus:", @@ -980,7 +980,7 @@ "UserDeletedWithName": "L'utilisateur {0} a \u00e9t\u00e9 supprim\u00e9.", "MessageServerConfigurationUpdated": "Server configuration has been updated", "MessageNamedServerConfigurationUpdatedWithValue": "Server configuration section {0} has been updated", - "MessageApplicationUpdated": "Media Browser Server has been updated", + "MessageApplicationUpdated": "Media Browser Server a \u00e9t\u00e9 mise \u00e0 jour.", "AuthenticationSucceededWithUserName": "{0} successfully authenticated", "FailedLoginAttemptWithUserName": "Failed login attempt from {0}", "UserStartedPlayingItemWithValues": "{0} has started playing {1}", diff --git a/MediaBrowser.Server.Implementations/Localization/Server/kk.json b/MediaBrowser.Server.Implementations/Localization/Server/kk.json index e466c73001..fa671945ca 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/kk.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/kk.json @@ -349,7 +349,7 @@ "OptionDownloadBackImage": "\u0410\u0440\u0442\u049b\u044b \u043c\u04b1\u049b\u0430\u0431\u0430", "OptionDownloadArtImage": "\u041e\u044e \u0441\u0443\u0440\u0435\u0442", "OptionDownloadPrimaryImage": "\u0411\u0430\u0441\u0442\u0430\u043f\u049b\u044b", - "HeaderFetchImages": "\u0421\u0443\u0440\u0435\u0442\u0442\u0435\u0440\u0434\u0456 \u0448\u044b\u0493\u0430\u0440\u044b\u043f \u0430\u043b\u0443:", + "HeaderFetchImages": "\u0421\u0443\u0440\u0435\u0442\u0442\u0435\u0440\u0434\u0456 \u0456\u0440\u0456\u043a\u0442\u0435\u0443:", "HeaderImageSettings": "\u0421\u0443\u0440\u0435\u0442 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043b\u0435\u0440\u0456", "TabOther": "\u0411\u0430\u0441\u049b\u0430\u043b\u0430\u0440", "LabelMaxBackdropsPerItem": "\u042d\u043b\u0435\u043c\u0435\u043d\u0442 \u0431\u043e\u0439\u044b\u043d\u0448\u0430 \u0430\u0440\u0442\u049b\u044b \u0441\u0443\u0440\u0435\u0442\u0442\u0435\u0440\u0434\u0456\u04a3 \u0435\u04a3 \u043a\u04e9\u043f \u0441\u0430\u043d\u044b:", @@ -829,7 +829,7 @@ "HeaderMyViews": "\u041c\u0435\u043d\u0456\u04a3 \u043a\u04e9\u0440\u0456\u043d\u0456\u0441\u0442\u0435\u0440\u0456\u043c", "LabelSelectFolderGroups": "\u041a\u0435\u043b\u0435\u0441\u0456 \u049b\u0430\u043b\u0442\u0430\u043b\u0430\u0440\u0434\u0430\u0493\u044b \u043c\u0430\u0437\u043c\u04b1\u043d\u0434\u044b \u041a\u0438\u043d\u043e, \u041c\u0443\u0437\u044b\u043a\u0430 \u0436\u04d9\u043d\u0435 \u0422\u0414 \u0441\u0438\u044f\u049b\u0442\u044b \u043a\u04e9\u0440\u0456\u043d\u0456\u0441\u0442\u0435\u0440\u0433\u0435 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0442\u044b \u0442\u04af\u0440\u0434\u0435 \u0442\u043e\u043f\u0442\u0430\u0441\u0442\u044b\u0440\u0443:", "LabelSelectFolderGroupsHelp": "\u0411\u0435\u043b\u0433\u0456\u043b\u0435\u043d\u0431\u0435\u0433\u0435\u043d \u049b\u0430\u043b\u0442\u0430\u043b\u0430\u0440 \u04e9\u0437 \u0431\u0435\u0442\u0456\u043c\u0435\u043d \u04e9\u0437\u0456\u043d\u0456\u04a3 \u043a\u04e9\u0440\u0456\u043d\u0456\u0441\u0456\u043d\u0434\u0435 \u0431\u0435\u0439\u043d\u0435\u043b\u0435\u043d\u0435\u0434\u0456.", - "OptionDisplayAdultContent": "\u0415\u0440\u0435\u0441\u0435\u043a\u0442\u0456\u043a \u043c\u0430\u0437\u043c\u04b1\u043d\u0434\u044b \u043a\u04e9\u0440\u0441\u0435\u0442\u0443", + "OptionDisplayAdultContent": "\u0415\u0440\u0435\u0441\u0435\u043a \u043c\u0430\u0437\u043c\u04b1\u043d\u044b\u043d \u043a\u04e9\u0440\u0441\u0435\u0442\u0443", "OptionLibraryFolders": "\u0422\u0430\u0441\u0443\u0448\u044b \u049b\u0430\u043b\u0442\u0430\u043b\u0430\u0440\u044b", "TitleRemoteControl": "\u049a\u0430\u0448\u044b\u049b\u0442\u0430\u043d \u0431\u0430\u0441\u049b\u0430\u0440\u0443", "OptionLatestTvRecordings": "\u0415\u04a3 \u043a\u0435\u0439\u0456\u043d\u0433\u0456 \u0436\u0430\u0437\u0431\u0430\u043b\u0430\u0440", @@ -946,14 +946,14 @@ "OptionReportTrailers": "\u0422\u0440\u0435\u0439\u043b\u0435\u0440\u043b\u0435\u0440", "OptionReportMusicVideos": "\u041a\u043b\u0438\u043f\u0442\u0435\u0440", "OptionReportMovies": "\u0424\u0438\u043b\u044c\u043c\u0434\u0435\u0440", - "OptionReportHomeVideos": "\u04ae\u0439\u043b\u0456\u043a \u0431\u0435\u0439\u043d\u0435\u043b\u0435\u0440", + "OptionReportHomeVideos": "\u04ae\u0439 \u0431\u0435\u0439\u043d\u0435\u043b\u0435\u0440\u0456", "OptionReportGames": "\u041e\u0439\u044b\u043d\u0434\u0430\u0440", "OptionReportEpisodes": "\u042d\u043f\u0438\u0437\u043e\u0434\u0442\u0430\u0440", "OptionReportCollections": "\u0416\u0438\u043d\u0430\u049b\u0442\u0430\u0440", "OptionReportBooks": "\u041a\u0456\u0442\u0430\u043f\u0442\u0430\u0440", "OptionReportArtists": "\u041e\u0440\u044b\u043d\u0434\u0430\u0443\u0448\u044b\u043b\u0430\u0440", "OptionReportAlbums": "\u0410\u043b\u044c\u0431\u043e\u043c\u0434\u0430\u0440", - "OptionReportAdultVideos": "\u0415\u0440\u0435\u0441\u0435\u043a\u0442\u0456\u043a \u0431\u0435\u0439\u043d\u0435\u043b\u0435\u0440", + "OptionReportAdultVideos": "\u0415\u0440\u0435\u0441\u0435\u043a \u0431\u0435\u0439\u043d\u0435\u043b\u0435\u0440\u0456", "ButtonMore": "\u041a\u04e9\u0431\u0456\u0440\u0435\u043a", "HeaderActivity": "\u04d8\u0440\u0435\u043a\u0435\u0442\u0442\u0435\u0440", "ScheduledTaskStartedWithName": "{0} \u0456\u0441\u043a\u0435 \u049b\u043e\u0441\u044b\u043b\u0434\u044b", diff --git a/MediaBrowser.Server.Implementations/Localization/Server/nl.json b/MediaBrowser.Server.Implementations/Localization/Server/nl.json index 9286fa7110..8b05fe9316 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/nl.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/nl.json @@ -45,10 +45,10 @@ "ReferToMediaLibraryWiki": "Raadpleeg de mediabibliotheek wiki.", "LabelCountry": "Land:", "LabelLanguage": "Taal:", - "HeaderPreferredMetadataLanguage": "Gewenste metagegevens taal:", - "LabelSaveLocalMetadata": "Sla afbeeldingen en metagegevens op in de mediamappen", - "LabelSaveLocalMetadataHelp": "Door afbeeldingen en metagegevens op te slaan in de mediamappen kunnen ze makkelijker worden gevonden en bewerkt.", - "LabelDownloadInternetMetadata": "Download afbeeldingen en metagegevens van het internet", + "HeaderPreferredMetadataLanguage": "Gewenste metadata taal:", + "LabelSaveLocalMetadata": "Sla afbeeldingen en metadata op in de mediamappen", + "LabelSaveLocalMetadataHelp": "Door afbeeldingen en metadata op te slaan in de mediamappen kunnen ze makkelijker worden gevonden en bewerkt.", + "LabelDownloadInternetMetadata": "Download afbeeldingen en metadata van het internet", "LabelDownloadInternetMetadataHelp": "Media Browser kan informatie en afbeeldingen van uw media downloaden, om zo een mooie en uitgebreide weergave mogelijk te maken.", "TabPreferences": "Voorkeuren", "TabPassword": "Wachtwoord", @@ -84,8 +84,8 @@ "LabelCurrentPassword": "Huidig wachtwoord", "LabelMaxParentalRating": "Leeftijdsgrens", "MaxParentalRatingHelp": "Media met een hogere classificatie wordt niet weergegeven", - "LibraryAccessHelp": "Selecteer de mediamappen om met deze gebruiker te delen. Beheerders kunnen alle mappen bewerken via de metagegevens manager.", - "ChannelAccessHelp": "Selecteer de kanalen om te delen met deze gebruiker. Beheerders kunnen alle kanalen bewerken met de metagegevens manager.", + "LibraryAccessHelp": "Selecteer de mediamappen om met deze gebruiker te delen. Beheerders kunnen alle mappen bewerken via de metadata manager.", + "ChannelAccessHelp": "Selecteer de kanalen om te delen met deze gebruiker. Beheerders kunnen alle kanalen bewerken met de metadata manager.", "ButtonDeleteImage": "Verwijder afbeelding", "LabelSelectUsers": "Selecteer gebruikers:", "ButtonUpload": "Uploaden", @@ -93,7 +93,7 @@ "LabelDropImageHere": "Hier afbeelding plaatsen", "ImageUploadAspectRatioHelp": "1:1 beeldverhouding geadviseerd. Alleen JPG\/PNG.", "MessageNothingHere": "Lijst is leeg.", - "MessagePleaseEnsureInternetMetadata": "Zorg ervoor dat het downloaden van metagegevens van het internet is ingeschakeld.", + "MessagePleaseEnsureInternetMetadata": "Zorg ervoor dat het downloaden van metadata van het internet is ingeschakeld.", "TabSuggested": "Aanbevolen", "TabLatest": "Nieuw", "TabUpcoming": "Binnenkort", @@ -205,7 +205,7 @@ "OptionMissingImdbId": "IMDb Id ontbreekt", "OptionMissingTvdbId": "TheTVDB Id ontbreekt", "OptionMissingOverview": "Overzicht ontbreekt", - "OptionFileMetadataYearMismatch": "Jaartal in Bestands\/metagegevens komt niet overeen", + "OptionFileMetadataYearMismatch": "Jaartal in Bestands\/metadata komt niet overeen", "TabGeneral": "Algemeen", "TitleSupport": "Ondersteuning", "TabLog": "Logboek", @@ -262,8 +262,8 @@ "LabelCachePathHelp": "Deze locatie bevat server cache-bestanden, zoals afbeeldingen.", "LabelImagesByNamePath": "Afbeeldingen op naam pad:", "LabelImagesByNamePathHelp": "Deze locatie bevat afbeeldingen van: acteurs, artiesten, genres en studio's.", - "LabelMetadataPath": "metagegevens pad:", - "LabelMetadataPathHelp": "Geef een aangepaste locatie op voor gedownloade afbeeldingen en metagegevens, indien niet opgeslagen in mediamappen.", + "LabelMetadataPath": "metadata pad:", + "LabelMetadataPathHelp": "Geef een aangepaste locatie op voor gedownloade afbeeldingen en metadata, indien niet opgeslagen in mediamappen.", "LabelTranscodingTempPath": "Tijdelijk Transcodeer pad:", "LabelTranscodingTempPathHelp": "Deze map bevat werkbestanden die worden gebruikt door de transcoder. Geef een eigen locatie op of laat leeg om de standaardlocatie te gebruiken.", "TabBasics": "Basis", @@ -275,7 +275,7 @@ "OptionMovies": "Films", "OptionEpisodes": "Afleveringen", "OptionOtherVideos": "Overige Video's", - "TitleMetadata": "Metagegevens", + "TitleMetadata": "Metadata", "LabelAutomaticUpdatesFanart": "Schakel de automatische update in van FanArt.tv", "LabelAutomaticUpdatesTmdb": "Schakel de automatische update in van TheMovieDB.org", "LabelAutomaticUpdatesTvdb": "Schakel de automatische update in van TheTVDB.com", @@ -457,7 +457,7 @@ "HeaderAddToCollection": "Toevoegen aan verzameling", "ButtonSubmit": "Uitvoeren", "NewCollectionNameExample": "Voorbeeld: Star Wars Collectie", - "OptionSearchForInternetMetadata": "Zoeken op het internet voor afbeeldingen en metagegevens", + "OptionSearchForInternetMetadata": "Zoeken op het internet voor afbeeldingen en metadata", "ButtonCreate": "Cre\u00ebren", "LabelHttpServerPortNumber": "Http server poortnummer:", "LabelWebSocketPortNumber": "Web socket poortnummer:", @@ -865,7 +865,7 @@ "TitleServer": "Server", "LabelCache": "Cache:", "LabelLogs": "Logboeken:", - "LabelMetadata": "Metagegevens:", + "LabelMetadata": "Metadata:", "LabelImagesByName": "Afbeeldingen op naam:", "LabelTranscodingTemporaryFiles": "Tijdelijke transcodeer bestanden:", "HeaderLatestMusic": "Nieuwste muziek", diff --git a/MediaBrowser.Server.Implementations/Localization/Server/pt_BR.json b/MediaBrowser.Server.Implementations/Localization/Server/pt_BR.json index b252ef6be4..050304df19 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/pt_BR.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/pt_BR.json @@ -1,8 +1,8 @@ { "LabelExit": "Sair", - "HeaderPassword": "Password", + "HeaderPassword": "Senha", "LabelVisitCommunity": "Visitar a Comunidade", - "HeaderLocalAccess": "Local Access", + "HeaderLocalAccess": "Acesso Local", "LabelGithubWiki": "Wiki do Github", "LabelSwagger": "Swagger", "LabelStandard": "Padr\u00e3o", @@ -481,9 +481,9 @@ "HeaderDestination": "Destino", "HeaderProgram": "Programa", "HeaderClients": "Clientes", - "LabelCompleted": "Completado", + "LabelCompleted": "Completa", "LabelFailed": "Falhou", - "LabelSkipped": "Ignorado", + "LabelSkipped": "Ignorada", "HeaderEpisodeOrganization": "Organiza\u00e7\u00e3o do Epis\u00f3dio", "LabelSeries": "S\u00e9rie:", "LabelSeasonNumber": "N\u00famero da temporada", @@ -994,11 +994,11 @@ "HeaderDownloadPeopleMetadataFor": "Fazer download da biografia e imagens para:", "OptionComposers": "Compositores", "OptionOthers": "Outros", - "HeaderDownloadPeopleMetadataForHelp": "Enabling additional options will provide more on-screen information but will result in slower library scans.", - "ViewTypeFolders": "Folders", - "LabelDisplayFoldersView": "Display a folders view to show plain media folders", - "ViewTypeLiveTvRecordingGroups": "Recordings", - "ViewTypeLiveTvChannels": "Channels", - "LabelAllowLocalAccessWithoutPassword": "Allow local access without a password", - "LabelAllowLocalAccessWithoutPasswordHelp": "When enabled, a password will not be required when signing in from within your home network." + "HeaderDownloadPeopleMetadataForHelp": "Ativar op\u00e7\u00f5es adicionais disponibilizar\u00e1 mais informa\u00e7\u00f5es na tela mas deixar\u00e1 os rastreamentos de biblioteca mais lentos.", + "ViewTypeFolders": "Pastas", + "LabelDisplayFoldersView": "Exibir visualiza\u00e7\u00e3o de pastas para mostrar pastas simples de m\u00eddia", + "ViewTypeLiveTvRecordingGroups": "Grava\u00e7\u00f5es", + "ViewTypeLiveTvChannels": "Canais", + "LabelAllowLocalAccessWithoutPassword": "Permtir acesso local sem senha", + "LabelAllowLocalAccessWithoutPasswordHelp": "Quando ativado, uma senha n\u00e3o ser\u00e1 necess\u00e1ria para entrar atrav\u00e9s de sua rede dom\u00e9stica." } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/Server/ru.json b/MediaBrowser.Server.Implementations/Localization/Server/ru.json index afd3cf5bb4..6d70faaffa 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/ru.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/ru.json @@ -18,7 +18,7 @@ "LabelYoureDone": "\u0412\u0441\u0451 \u0433\u043e\u0442\u043e\u0432\u043e!", "WelcomeToMediaBrowser": "\u0412\u0430\u0441 \u043f\u0440\u0438\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 Media Browser!", "TitleMediaBrowser": "Media Browser", - "ThisWizardWillGuideYou": "\u042d\u0442\u043e\u0442 \u043f\u043e\u043c\u043e\u0449\u043d\u0438\u043a \u043f\u043e \u043f\u0435\u0440\u0432\u043e\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u043c\u0443 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e \u043f\u0440\u043e\u0432\u0435\u0434\u0451\u0442 \u0447\u0435\u0440\u0435\u0437 \u0432\u0441\u0435 \u0444\u0430\u0437\u044b \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430. \u0427\u0442\u043e\u0431\u044b \u043d\u0430\u0447\u0430\u0442\u044c, \u0432\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0441\u0432\u043e\u0439 \u044f\u0437\u044b\u043a.", + "ThisWizardWillGuideYou": "\u042d\u0442\u043e\u0442 \u043f\u043e\u043c\u043e\u0449\u043d\u0438\u043a \u043f\u043e \u043f\u0435\u0440\u0432\u043e\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u043c\u0443 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e \u043f\u0440\u043e\u0432\u0435\u0434\u0451\u0442 \u0432\u0430\u0441 \u0447\u0435\u0440\u0435\u0437 \u0432\u0441\u0435 \u0444\u0430\u0437\u044b \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438. \u0427\u0442\u043e\u0431\u044b \u043d\u0430\u0447\u0430\u0442\u044c, \u0432\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0441\u0432\u043e\u0439 \u044f\u0437\u044b\u043a.", "TellUsAboutYourself": "\u0420\u0430\u0441\u0441\u043a\u0430\u0436\u0438\u0442\u0435 \u043e \u0441\u0435\u0431\u0435", "LabelYourFirstName": "\u0412\u0430\u0448\u0435 \u0438\u043c\u044f:", "MoreUsersCanBeAddedLater": "\u041f\u043e\u0442\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0435\u0449\u0451 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0447\u0435\u0440\u0435\u0437 \u0418\u043d\u0444\u043e\u043f\u0430\u043d\u0435\u043b\u044c.", @@ -45,7 +45,7 @@ "ReferToMediaLibraryWiki": "C\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043f\u043e \u043c\u0435\u0434\u0438\u0430\u0442\u0435\u043a\u0435 \u0441\u043c. \u0432 \u0432\u0438\u043a\u0438.", "LabelCountry": "\u0421\u0442\u0440\u0430\u043d\u0430:", "LabelLanguage": "\u042f\u0437\u044b\u043a:", - "HeaderPreferredMetadataLanguage": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u044f\u0437\u044b\u043a\u0430 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445:", + "HeaderPreferredMetadataLanguage": "\u0412\u044b\u0431\u043e\u0440 \u044f\u0437\u044b\u043a\u0430 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445:", "LabelSaveLocalMetadata": "\u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c \u0438\u043b\u043b\u044e\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u0438 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u0432\u043d\u0443\u0442\u0440\u044c \u043c\u0435\u0434\u0438\u0430\u043f\u0430\u043f\u043e\u043a", "LabelSaveLocalMetadataHelp": "\u041f\u0440\u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0438 \u0438\u043b\u043b\u044e\u0441\u0442\u0440\u0430\u0446\u0438\u0439 \u0438 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0432\u043d\u0443\u0442\u0440\u044c \u043c\u0435\u0434\u0438\u0430\u043f\u0430\u043f\u043e\u043a, \u043e\u043d\u0438 \u0431\u0443\u0434\u0443\u0442 \u0432 \u0442\u0430\u043a\u043e\u043c \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0438, \u0433\u0434\u0435 \u0438\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043b\u0435\u0433\u043a\u043e \u043f\u0440\u0430\u0432\u0438\u0442\u044c.", "LabelDownloadInternetMetadata": "\u0417\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u0438\u043b\u043b\u044e\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u0438 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0430", @@ -283,7 +283,7 @@ "LabelAutomaticUpdatesTmdbHelp": "\u041f\u0440\u0438 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438, \u043d\u043e\u0432\u044b\u0435 \u0440\u0438\u0441\u0443\u043d\u043a\u0438 \u0431\u0443\u0434\u0443\u0442 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u044b \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438, \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u0441\u043b\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043d\u0430 TheMovieDB.org. \u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0440\u0438\u0441\u0443\u043d\u043a\u0438 \u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u0437\u0430\u043c\u0435\u0449\u0430\u0442\u044c\u0441\u044f.", "LabelAutomaticUpdatesTvdbHelp": "\u041f\u0440\u0438 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438, \u043d\u043e\u0432\u044b\u0435 \u0440\u0438\u0441\u0443\u043d\u043a\u0438 \u0431\u0443\u0434\u0443\u0442 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u044b \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438, \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u0441\u043b\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043d\u0430 TheTVDB.com. \u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0440\u0438\u0441\u0443\u043d\u043a\u0438 \u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u0437\u0430\u043c\u0435\u0449\u0430\u0442\u044c\u0441\u044f.", "ExtractChapterImagesHelp": "\u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0440\u0438\u0441\u0443\u043d\u043a\u043e\u0432 \u0441\u0446\u0435\u043d \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043a\u043b\u0438\u0435\u043d\u0442\u0430\u043c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043c\u0435\u043d\u044e \u0432\u044b\u0431\u043e\u0440\u0430 \u0441\u0446\u0435\u043d\u044b. \u0414\u0430\u043d\u043d\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u044b\u043c, \u043d\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 \u0438 \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0433\u0438\u0433\u0430\u0431\u0430\u0439\u0442 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430. \u041e\u043d \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f, \u043a\u043e\u0433\u0434\u0430 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0432\u0438\u0434\u0435\u043e\u0444\u0430\u0439\u043b\u044b, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043a\u0430\u043a \u0437\u0430\u0434\u0430\u043d\u0438\u0435 \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u043d\u043e\u0435 \u043d\u0430 4:00 \u0443\u0442\u0440\u0430, \u0420\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0432 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u041f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u0430. \u041d\u0435 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0434\u0430\u043d\u043d\u043e\u0435 \u0437\u0430\u0434\u0430\u043d\u0438\u0435 \u0432 \u0447\u0430\u0441\u044b \u043f\u0438\u043a.", - "LabelMetadataDownloadLanguage": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u044f\u0437\u044b\u043a\u0430 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445:", + "LabelMetadataDownloadLanguage": "\u0412\u044b\u0431\u043e\u0440 \u044f\u0437\u044b\u043a\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438:", "ButtonAutoScroll": "\u0410\u0432\u0442\u043e\u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430", "LabelImageSavingConvention": "\u0424\u043e\u0440\u043c\u0430\u0442 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0440\u0438\u0441\u0443\u043d\u043a\u043e\u0432:", "LabelImageSavingConventionHelp": "\u0412 Media Browser \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u044e\u0442\u0441\u044f \u0440\u0438\u0441\u0443\u043d\u043a\u0438 \u0438\u043c\u0435\u044e\u0449\u0438\u0435\u0441\u044f \u0432 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0451\u043d\u043d\u044b\u0445 \u043c\u0435\u0434\u0438\u0430\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u0445. \u0412\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c\u044b\u0439 \u0444\u043e\u0440\u043c\u0430\u0442 \u043f\u043e\u043b\u0435\u0437\u043d\u043e \u0442\u0430\u043a\u0436\u0435 \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u0438 \u0434\u0440\u0443\u0433\u0438\u0445 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u043e\u0432.", @@ -339,7 +339,7 @@ "OptionAutomatic": "\u0410\u0432\u0442\u043e", "LiveTvPluginRequired": "\u0422\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043f\u043b\u0430\u0433\u0438\u043d-\u043f\u043e\u0441\u0442\u0430\u0432\u0449\u0438\u043a \u0443\u0441\u043b\u0443\u0433 \u044d\u0444\u0438\u0440\u043d\u043e\u0433\u043e \u0422\u0412 \u0434\u043b\u044f \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u044f.", "LiveTvPluginRequiredHelp": "\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0435 \u043e\u0434\u0438\u043d \u0438\u0437 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, NextPVR \u0438\u043b\u0438 ServerWMC.", - "LabelCustomizeOptionsPerMediaType": "\u041f\u043e\u0434\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043f\u043e \u0442\u0438\u043f\u0443 \u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044f:", + "LabelCustomizeOptionsPerMediaType": "\u0410\u0434\u0430\u043f\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u043b\u044f \u0442\u0438\u043f\u0430 \u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044f:", "OptionDownloadThumbImage": "\u0411\u0435\u0433\u0443\u043d\u043e\u043a", "OptionDownloadMenuImage": "\u041c\u0435\u043d\u044e", "OptionDownloadLogoImage": "\u041b\u043e\u0433\u043e\u0442\u0438\u043f", @@ -349,7 +349,7 @@ "OptionDownloadBackImage": "\u0421\u043f\u0438\u043d\u043a\u0430", "OptionDownloadArtImage": "\u0412\u0438\u043d\u044c\u0435\u0442\u043a\u0430", "OptionDownloadPrimaryImage": "\u041f\u0435\u0440\u0432\u0438\u0447\u043d\u044b\u0439", - "HeaderFetchImages": "\u0412\u044b\u0431\u043e\u0440\u043a\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u043e\u0432:", + "HeaderFetchImages": "\u041e\u0442\u0431\u043e\u0440\u043a\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u043e\u0432:", "HeaderImageSettings": "\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0440\u0438\u0441\u0443\u043d\u043a\u043e\u0432", "TabOther": "\u0414\u0440\u0443\u0433\u0438\u0435", "LabelMaxBackdropsPerItem": "\u041c\u0430\u043a\u0441. \u0447\u0438\u0441\u043b\u043e \u0437\u0430\u0434\u043d\u0438\u043a\u043e\u0432 \u043d\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442:", @@ -439,7 +439,7 @@ "HeaderCustomDlnaProfiles": "\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0435 \u043f\u0440\u043e\u0444\u0438\u043b\u0438", "HeaderSystemDlnaProfiles": "\u0421\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0435 \u043f\u0440\u043e\u0444\u0438\u043b\u0438", "CustomDlnaProfilesHelp": "\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u043f\u0440\u043e\u0444\u0438\u043b\u044c \u0434\u043b\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0438\u043b\u0438 \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 \u043f\u0440\u043e\u0444\u0438\u043b\u044c.", - "SystemDlnaProfilesHelp": "\u0421\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0435 \u043f\u0440\u043e\u0444\u0438\u043b\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f. \u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u043c \u043f\u0440\u043e\u0444\u0438\u043b\u0435 \u0431\u0443\u0434\u0443\u0442 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u044b \u0432 \u043d\u043e\u0432\u043e\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u043c \u043f\u0440\u043e\u0444\u0438\u043b\u0435.", + "SystemDlnaProfilesHelp": "\u0421\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0435 \u043f\u0440\u043e\u0444\u0438\u043b\u0438 \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f. \u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u043c \u043f\u0440\u043e\u0444\u0438\u043b\u0435 \u0431\u0443\u0434\u0443\u0442 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u044b \u0432 \u043d\u043e\u0432\u043e\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u043c \u043f\u0440\u043e\u0444\u0438\u043b\u0435.", "TitleDashboard": "\u0418\u043d\u0444\u043e\u043f\u0430\u043d\u0435\u043b\u044c", "TabHome": "\u0413\u043b\u0430\u0432\u043d\u0430\u044f", "TabInfo": "\u0421\u0432\u0435\u0434\u0435\u043d\u0438\u044f", @@ -450,8 +450,8 @@ "LinkApiDocumentation": "\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043f\u043e API", "LabelFriendlyServerName": "\u041f\u043e\u043d\u044f\u0442\u043d\u043e\u0435 \u0438\u043c\u044f \u0441\u0435\u0440\u0432\u0435\u0440\u0430:", "LabelFriendlyServerNameHelp": "\u042d\u0442\u043e \u0438\u043c\u044f \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u043e \u0434\u043b\u044f \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u0430. \u0415\u0441\u043b\u0438 \u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043f\u043e\u043b\u0435 \u043f\u0443\u0441\u0442\u044b\u043c, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0438\u043c\u044f \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0430.", - "LabelPreferredDisplayLanguage": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u043c\u043e\u0433\u043e \u044f\u0437\u044b\u043a\u0430", - "LabelPreferredDisplayLanguageHelp": "\u041f\u0440\u043e\u0435\u043a\u0442 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0430 Media Browser \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0438 \u0435\u0449\u0451 \u043d\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0451\u043d.", + "LabelPreferredDisplayLanguage": "\u0412\u044b\u0431\u043e\u0440 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u043c\u043e\u0433\u043e \u044f\u0437\u044b\u043a\u0430", + "LabelPreferredDisplayLanguageHelp": "\u041f\u0435\u0440\u0435\u0432\u043e\u0434 Media Browser \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u044e\u0449\u0438\u043c\u0441\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u043c \u0438 \u0432\u0441\u0451 \u0435\u0449\u0451 \u043d\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0451\u043d.", "LabelReadHowYouCanContribute": "\u0427\u0438\u0442\u0430\u0439\u0442\u0435 \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0432\u043d\u0435\u0441\u0442\u0438 \u0441\u0432\u043e\u0439 \u0432\u043a\u043b\u0430\u0434.", "HeaderNewCollection": "\u041d\u043e\u0432\u0430\u044f \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044f", "HeaderAddToCollection": "\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044e", @@ -715,7 +715,7 @@ "HeaderIdentificationCriteriaHelp": "\u0412\u0432\u0435\u0434\u0438\u0442\u0435, \u043f\u043e \u043a\u0440\u0430\u0439\u043d\u0435\u0439 \u043c\u0435\u0440\u0435, \u043e\u0434\u0438\u043d \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0439 \u043a\u0440\u0438\u0442\u0435\u0440\u0438\u0439.", "HeaderDirectPlayProfileHelp": "\u0414\u043e\u0431\u0430\u0432\u044c\u0442\u0435 \u043f\u0440\u043e\u0444\u0438\u043b\u0438 \u043f\u0440\u044f\u043c\u043e\u0433\u043e \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f, \u0447\u0442\u043e\u0431\u044b \u0443\u043a\u0430\u0437\u0430\u0442\u044c, \u043a\u0430\u043a\u0438\u0435 \u0444\u043e\u0440\u043c\u0430\u0442\u044b \u043c\u043e\u0433\u0443\u0442 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e\u043c \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e.", "HeaderTranscodingProfileHelp": "\u0414\u043e\u0431\u0430\u0432\u044c\u0442\u0435 \u043f\u0440\u043e\u0444\u0438\u043b\u0438 \u043f\u0435\u0440\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0438, \u0447\u0442\u043e\u0431\u044b \u0443\u043a\u0430\u0437\u0430\u0442\u044c, \u043a\u0430\u043a\u0438\u0435 \u0444\u043e\u0440\u043c\u0430\u0442\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f, \u043a\u043e\u0433\u0434\u0430 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0430.", - "HeaderResponseProfileHelp": "\u041f\u0440\u043e\u0444\u0438\u043b\u0438 \u043e\u0442\u043a\u043b\u0438\u043a\u043e\u0432 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0441\u043f\u043e\u0441\u043e\u0431 \u0434\u043b\u044f \u043f\u043e\u0434\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438, \u043f\u043e\u0441\u044b\u043b\u0430\u0435\u043c\u043e\u0439 \u043d\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u043f\u0440\u0438 \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0438 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0432\u0438\u0434\u043e\u0432 \u043d\u043e\u0441\u0438\u0442\u0435\u043b\u0435\u0439.", + "HeaderResponseProfileHelp": "\u041f\u0440\u043e\u0444\u0438\u043b\u0438 \u043e\u0442\u043a\u043b\u0438\u043a\u043e\u0432 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u044e\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0434\u043b\u044f \u0430\u0434\u0430\u043f\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438, \u043f\u043e\u0441\u044b\u043b\u0430\u0435\u043c\u043e\u0439 \u043d\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u043f\u0440\u0438 \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0438 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0432\u0438\u0434\u043e\u0432 \u043d\u043e\u0441\u0438\u0442\u0435\u043b\u0435\u0439.", "LabelXDlnaCap": "\u0421\u0432\u043e\u0439\u0441\u0442\u0432\u0430 X-Dlna:", "LabelXDlnaCapHelp": "\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 X_DLNACAP \u0432 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435 \u0438\u043c\u0451\u043d urn:schemas-dlna-org:device-1-0", "LabelXDlnaDoc": "\u0421\u0445\u0435\u043c\u0430 X-Dlna:", @@ -805,9 +805,9 @@ "MessageNoPlaylistItemsAvailable": "\u0414\u0430\u043d\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0432 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u043f\u0443\u0441\u0442.", "HeaderWelcomeToMediaBrowserWebClient": "\u0412\u0435\u0431-\u043a\u043b\u0438\u0435\u043d\u0442 Media Browser \u043f\u0440\u0438\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0432\u0430\u0441!", "ButtonDismiss": "\u0421\u043a\u0440\u044b\u0442\u044c", - "MessageLearnHowToCustomize": "\u041e\u0437\u043d\u0430\u043a\u043e\u043c\u044c\u0442\u0435\u0441\u044c, \u043a\u0430\u043a \u043f\u043e\u0434\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u0443\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u043f\u043e \u0441\u0432\u043e\u0435\u043c\u0443 \u043b\u0438\u0447\u043d\u043e\u043c\u0443 \u0432\u043a\u0443\u0441\u0443. \u041d\u0430\u0436\u043c\u0438\u0442\u0435 \u0430\u0432\u0430\u0442\u0430\u0440\u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u043f\u0440\u0430\u0432\u043e\u043c \u0432\u0435\u0440\u0445\u043d\u0435\u043c \u0443\u0433\u043b\u0443 \u044d\u043a\u0440\u0430\u043d\u0430, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u0432\u043e\u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438.", + "MessageLearnHowToCustomize": "\u041e\u0437\u043d\u0430\u043a\u043e\u043c\u044c\u0442\u0435\u0441\u044c, \u043a\u0430\u043a \u0430\u0434\u0430\u043f\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u0443\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u043f\u043e \u0441\u0432\u043e\u0435\u043c\u0443 \u043b\u0438\u0447\u043d\u043e\u043c\u0443 \u0432\u043a\u0443\u0441\u0443. \u041d\u0430\u0436\u043c\u0438\u0442\u0435 \u0430\u0432\u0430\u0442\u0430\u0440\u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u043f\u0440\u0430\u0432\u043e\u043c \u0432\u0435\u0440\u0445\u043d\u0435\u043c \u0443\u0433\u043b\u0443 \u044d\u043a\u0440\u0430\u043d\u0430, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u0432\u043e\u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438.", "ButtonEditOtherUserPreferences": "\u041f\u0440\u0430\u0432\u0438\u0442\u044c \u043b\u0438\u0447\u043d\u044b\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.", - "LabelChannelStreamQuality": "\u041a\u0430\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u043e\u0442\u043e\u043a\u043e\u0432\u043e\u0439 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0447\u0435\u0440\u0435\u0437 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442:", + "LabelChannelStreamQuality": "\u0412\u044b\u0431\u043e\u0440 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0430 \u043f\u043e\u0442\u043e\u043a\u043e\u0432\u043e\u0439 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0432 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0435:", "LabelChannelStreamQualityHelp": "\u0412 \u0441\u0440\u0435\u0434\u0435 \u0441 \u043d\u0438\u0437\u043a\u043e\u0439 \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u043d\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c\u044e, \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0430 \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043c\u043e\u0447\u044c \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442\u044c \u0432\u043f\u0435\u0447\u0430\u0442\u043b\u0435\u043d\u0438\u0435 \u0431\u043e\u043b\u0435\u0435 \u043f\u043b\u0430\u0432\u043d\u043e\u0433\u043e \u043f\u043e\u0442\u043e\u043a\u043e\u0432\u043e\u0433\u043e \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f.", "OptionBestAvailableStreamQuality": "\u041d\u0430\u0438\u043b\u0443\u0447\u0448\u0435\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0435", "LabelEnableChannelContentDownloadingFor": "\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u044f \u043a\u0430\u043d\u0430\u043b\u0430 \u0434\u043b\u044f:", @@ -855,7 +855,7 @@ "TabLogs": "\u0416\u0443\u0440\u043d\u0430\u043b\u044b", "HeaderServerLogFiles": "\u0424\u0430\u0439\u043b\u044b \u0436\u0443\u0440\u043d\u0430\u043b\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0430:", "TabBranding": "\u0411\u0440\u0435\u043d\u0434\u0438\u043d\u0433", - "HeaderBrandingHelp": "\u041f\u043e\u0434\u0441\u0442\u0440\u043e\u0439\u0442\u0435 \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u0432\u0438\u0434 Media Browser \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441 \u043f\u043e\u0442\u0440\u0435\u0431\u043d\u043e\u0441\u0442\u044f\u043c\u0438 \u0432\u0430\u0448\u0435\u0439 \u0433\u0440\u0443\u043f\u043f\u044b \u0438\u043b\u0438 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438.", + "HeaderBrandingHelp": "\u0410\u0434\u0430\u043f\u0442\u0438\u0440\u0443\u0439\u0442\u0435 \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u0432\u0438\u0434 Media Browser \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441 \u043f\u043e\u0442\u0440\u0435\u0431\u043d\u043e\u0441\u0442\u044f\u043c\u0438 \u0432\u0430\u0448\u0435\u0439 \u0433\u0440\u0443\u043f\u043f\u044b \u0438\u043b\u0438 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438.", "LabelLoginDisclaimer": "\u041e\u0433\u043e\u0432\u043e\u0440\u043a\u0430 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435 \u0432\u0445\u043e\u0434\u0430:", "LabelLoginDisclaimerHelp": "\u042d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c\u0441\u044f \u0432 \u043d\u0438\u0436\u043d\u0435\u0439 \u0447\u0430\u0441\u0442\u0438 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0432\u0445\u043e\u0434\u0430 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443.", "LabelAutomaticallyDonate": "\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0436\u0435\u0440\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u0443\u044e \u0441\u0443\u043c\u043c\u0443 \u043a\u0430\u0436\u0434\u044b\u0435 \u0448\u0435\u0441\u0442\u044c \u043c\u0435\u0441\u044f\u0446\u0435\u0432", diff --git a/MediaBrowser.Server.Implementations/Localization/Server/server.json b/MediaBrowser.Server.Implementations/Localization/Server/server.json index c790b7b0fb..8b392f8129 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/server.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/server.json @@ -870,7 +870,7 @@ "HeaderBrandingHelp": "Customize the appearance of Media Browser to fit the needs of your group or organization.", "LabelLoginDisclaimer": "Login disclaimer:", "LabelLoginDisclaimerHelp": "This will be displayed at the bottom of the login page.", - "LabelAutomaticallyDonate": "Automatically donate this amount every six months", + "LabelAutomaticallyDonate": "Automatically donate this amount every month", "LabelAutomaticallyDonateHelp": "You can cancel at any time via your PayPal account.", "OptionList": "List", "TabDashboard": "Dashboard", diff --git a/MediaBrowser.Server.Implementations/Localization/Server/sv.json b/MediaBrowser.Server.Implementations/Localization/Server/sv.json index 6fb0398fc9..c0a736bb91 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/sv.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/sv.json @@ -482,10 +482,10 @@ "HeaderProgram": "Program", "HeaderClients": "Klienter", "LabelCompleted": "Klar", - "LabelFailed": "Failed", + "LabelFailed": "Misslyckades", "LabelSkipped": "Hoppades \u00f6ver", "HeaderEpisodeOrganization": "Katalogisering av avsnitt", - "LabelSeries": "Series:", + "LabelSeries": "Serie:", "LabelSeasonNumber": "S\u00e4songsnummer:", "LabelEpisodeNumber": "Avsnittsnummer:", "LabelEndingEpisodeNumber": "Avslutande avsnittsnummer:", @@ -633,8 +633,8 @@ "ButtonScenes": "Scener", "ButtonSubtitles": "Undertexter", "ButtonAudioTracks": "Ljudsp\u00e5r", - "ButtonPreviousTrack": "Previous track", - "ButtonNextTrack": "Next track", + "ButtonPreviousTrack": "F\u00f6reg\u00e5ende sp\u00e5r:", + "ButtonNextTrack": "N\u00e4sta sp\u00e5r:", "ButtonStop": "Stopp", "ButtonPause": "Paus", "LabelGroupMoviesIntoCollections": "Gruppera filmer i samlingsboxar", @@ -910,7 +910,7 @@ "LabelContext": "Metod:", "OptionContextStreaming": "Str\u00f6mning", "OptionContextStatic": "Synk", - "ButtonAddToPlaylist": "Add to playlist", + "ButtonAddToPlaylist": "L\u00e4gg till i spellista", "TabPlaylists": "Playlists", "ButtonClose": "St\u00e4ng", "LabelAllLanguages": "All languages", @@ -934,19 +934,19 @@ "OptionMenu": "Menu", "OptionScreenshot": "Screenshot", "OptionLocked": "Locked", - "OptionUnidentified": "Unidentified", - "OptionMissingParentalRating": "Missing parental rating", + "OptionUnidentified": "Oidentifierad", + "OptionMissingParentalRating": "\u00c5ldersgr\u00e4ns saknas", "OptionStub": "Stub", - "HeaderEpisodes": "Episodes:", - "OptionSeason0": "Season 0", + "HeaderEpisodes": "Avsnitt:", + "OptionSeason0": "S\u00e4song 0", "LabelReport": "Report:", - "OptionReportSongs": "Songs", - "OptionReportSeries": "Series", - "OptionReportSeasons": "Seasons", + "OptionReportSongs": "L\u00e5tar", + "OptionReportSeries": "Serier", + "OptionReportSeasons": "S\u00e4songer", "OptionReportTrailers": "Trailers", - "OptionReportMusicVideos": "Music videos", - "OptionReportMovies": "Movies", - "OptionReportHomeVideos": "Home videos", + "OptionReportMusicVideos": "Musikvideos", + "OptionReportMovies": "Filmer", + "OptionReportHomeVideos": "Hemvideos", "OptionReportGames": "Games", "OptionReportEpisodes": "Episodes", "OptionReportCollections": "Collections", diff --git a/MediaBrowser.ServerApplication/ApplicationHost.cs b/MediaBrowser.ServerApplication/ApplicationHost.cs index 9f9cd8e753..39a7981b24 100644 --- a/MediaBrowser.ServerApplication/ApplicationHost.cs +++ b/MediaBrowser.ServerApplication/ApplicationHost.cs @@ -1,4 +1,5 @@ -using MediaBrowser.Api; +using System.Net; +using MediaBrowser.Api; using MediaBrowser.Common; using MediaBrowser.Common.Configuration; using MediaBrowser.Common.Events; @@ -310,20 +311,6 @@ namespace MediaBrowser.ServerApplication saveConfig = true; } - if (ServerConfigurationManager.Configuration.ChapterOptions != null) - { - ServerConfigurationManager.SaveConfiguration("chapters", ServerConfigurationManager.Configuration.ChapterOptions); - ServerConfigurationManager.Configuration.ChapterOptions = null; - saveConfig = true; - } - - if (ServerConfigurationManager.Configuration.ChannelOptions != null) - { - ServerConfigurationManager.SaveConfiguration("channels", ServerConfigurationManager.Configuration.ChannelOptions); - ServerConfigurationManager.Configuration.ChannelOptions = null; - saveConfig = true; - } - if (ServerConfigurationManager.Configuration.NotificationOptions != null) { ServerConfigurationManager.SaveConfiguration("notifications", ServerConfigurationManager.Configuration.NotificationOptions); @@ -385,117 +372,6 @@ namespace MediaBrowser.ServerApplication { // Not there, no big deal } - - Task.Run(() => - { - try - { - Directory.Delete(Path.Combine(ApplicationPaths.DataPath, "remote-images"), true); - } - catch (IOException) - { - // Not there, no big deal - } - - try - { - Directory.Delete(Path.Combine(ApplicationPaths.DataPath, "chapter-images"), true); - } - catch (IOException) - { - // Not there, no big deal - } - - try - { - Directory.Delete(Path.Combine(ApplicationPaths.DataPath, "extracted-video-images"), true); - } - catch (IOException) - { - // Not there, no big deal - } - - try - { - Directory.Delete(Path.Combine(ApplicationPaths.DataPath, "extracted-audio-images"), true); - } - catch (IOException) - { - // Not there, no big deal - } - - try - { - Directory.Delete(Path.Combine(ApplicationPaths.DataPath, "tmdb-tv"), true); - } - catch (IOException) - { - // Not there, no big deal - } - - try - { - Directory.Delete(Path.Combine(ApplicationPaths.DataPath, "tmdb-collections"), true); - } - catch (IOException) - { - // Not there, no big deal - } - - try - { - Directory.Delete(Path.Combine(ApplicationPaths.DataPath, "tmdb-movies"), true); - } - catch (IOException) - { - // Not there, no big deal - } - - try - { - Directory.Delete(Path.Combine(ApplicationPaths.DataPath, "fanart-movies"), true); - } - catch (IOException) - { - // Not there, no big deal - } - - try - { - Directory.Delete(Path.Combine(ApplicationPaths.DataPath, "fanart-music"), true); - } - catch (IOException) - { - // Not there, no big deal - } - - try - { - Directory.Delete(Path.Combine(ApplicationPaths.DataPath, "fanart-tv"), true); - } - catch (IOException) - { - // Not there, no big deal - } - - try - { - Directory.Delete(Path.Combine(ApplicationPaths.DataPath, "tmdb-people"), true); - } - catch (IOException) - { - // Not there, no big deal - } - - try - { - Directory.Delete(Path.Combine(ApplicationPaths.DataPath, "tvdb-v3"), true); - } - catch (IOException) - { - // Not there, no big deal - } - }); } private void MigrateUserFolders() diff --git a/MediaBrowser.WebDashboard/Api/DashboardService.cs b/MediaBrowser.WebDashboard/Api/DashboardService.cs index 7bc124eb59..2269d308e1 100644 --- a/MediaBrowser.WebDashboard/Api/DashboardService.cs +++ b/MediaBrowser.WebDashboard/Api/DashboardService.cs @@ -231,6 +231,8 @@ namespace MediaBrowser.WebDashboard.Api } } + path = path.Replace("scripts/jquery.mobile-1.4.3.min.map", "thirdparty/jquerymobile-1.4.3/jquery.mobile-1.4.3.min.map", StringComparison.OrdinalIgnoreCase); + var localizationCulture = GetLocalizationCulture(); // Don't cache if not configured to do so