From 0d025f7fb620bf2a24ca9aa4e5994f132e02e7c0 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Tue, 6 May 2014 22:28:19 -0400 Subject: beginning remote subtitle downloading --- MediaBrowser.Model/ApiClient/IApiClient.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'MediaBrowser.Model/ApiClient/IApiClient.cs') diff --git a/MediaBrowser.Model/ApiClient/IApiClient.cs b/MediaBrowser.Model/ApiClient/IApiClient.cs index dd1603d01..c9f5f3ae7 100644 --- a/MediaBrowser.Model/ApiClient/IApiClient.cs +++ b/MediaBrowser.Model/ApiClient/IApiClient.cs @@ -760,7 +760,7 @@ namespace MediaBrowser.Model.ApiClient /// /// The options. /// System.String. - string GetSubtitleUrl(SubtitleOptions options); + string GetSubtitleUrl(SubtitleDownloadOptions options); /// /// Gets an image url that can be used to download an image from the api -- cgit v1.2.3 From f02c3260273a09f465c4e7a97d8b90f0f6909734 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Thu, 8 May 2014 16:09:53 -0400 Subject: Removed guids from the model project --- .../DefaultTheme/DefaultThemeService.cs | 6 +- MediaBrowser.Api/DefaultTheme/Models.cs | 2 +- MediaBrowser.Api/DisplayPreferencesService.cs | 11 +- MediaBrowser.Api/Images/ImageService.cs | 2 +- MediaBrowser.Api/PackageService.cs | 4 +- MediaBrowser.Api/SearchService.cs | 12 +- MediaBrowser.Api/UserLibrary/UserLibraryService.cs | 4 +- .../BaseApplicationHost.cs | 1 + .../ScheduledTasks/ScheduledTaskWorker.cs | 2 +- .../ScheduledTasks/TaskManager.cs | 1 + .../Updates/InstallationManager.cs | 8 +- MediaBrowser.Common/Events/GenericEventArgs.cs | 17 --- MediaBrowser.Common/IApplicationHost.cs | 4 +- MediaBrowser.Common/MediaBrowser.Common.csproj | 1 - MediaBrowser.Common/ScheduledTasks/ITaskManager.cs | 2 +- .../ScheduledTasks/ScheduledTaskHelpers.cs | 2 +- .../Updates/IInstallationManager.cs | 4 +- .../Configuration/IServerConfigurationManager.cs | 2 +- MediaBrowser.Controller/Drawing/IImageProcessor.cs | 8 +- MediaBrowser.Controller/Library/IUserManager.cs | 4 +- .../Persistence/IDisplayPreferencesRepository.cs | 2 +- .../Session/ISessionController.cs | 8 -- MediaBrowser.Dlna/Didl/DidlBuilder.cs | 6 +- MediaBrowser.Dlna/PlayTo/DlnaController.cs | 5 - .../MediaBrowser.Model.Portable.csproj | 3 + .../MediaBrowser.Model.net35.csproj | 3 + MediaBrowser.Model/ApiClient/IApiClient.cs | 38 +++++- MediaBrowser.Model/ApiClient/IServerEvents.cs | 55 +++++--- MediaBrowser.Model/ApiClient/ServerEventArgs.cs | 148 +-------------------- .../Configuration/MetadataOptions.cs | 6 +- .../Dlna/MediaFormatProfileResolver.cs | 5 +- MediaBrowser.Model/Dlna/StreamBuilder.cs | 118 ++++++++-------- MediaBrowser.Model/Dlna/StreamInfo.cs | 72 +++++----- MediaBrowser.Model/Drawing/DrawingUtils.cs | 35 +++-- MediaBrowser.Model/Dto/BaseItemDto.cs | 20 +-- MediaBrowser.Model/Dto/BaseItemPerson.cs | 4 +- MediaBrowser.Model/Dto/ChapterInfoDto.cs | 4 +- MediaBrowser.Model/Dto/ImageInfo.cs | 2 +- MediaBrowser.Model/Dto/ImageOptions.cs | 2 +- MediaBrowser.Model/Dto/ItemByNameCounts.cs | 2 +- MediaBrowser.Model/Dto/StudioDto.cs | 4 +- MediaBrowser.Model/Dto/UserDto.cs | 4 +- MediaBrowser.Model/Entities/BaseItemInfo.cs | 10 +- MediaBrowser.Model/Entities/DisplayPreferences.cs | 4 +- MediaBrowser.Model/Entities/LibraryUpdateInfo.cs | 20 +-- MediaBrowser.Model/Events/GenericEventArgs.cs | 17 +++ MediaBrowser.Model/LiveTv/ChannelInfoDto.cs | 4 +- MediaBrowser.Model/LiveTv/ProgramInfoDto.cs | 6 +- MediaBrowser.Model/LiveTv/RecordingInfoDto.cs | 6 +- MediaBrowser.Model/LiveTv/SeriesTimerInfoDto.cs | 4 +- MediaBrowser.Model/MediaBrowser.Model.csproj | 1 + MediaBrowser.Model/Search/SearchHint.cs | 6 +- MediaBrowser.Model/Session/GeneralCommand.cs | 3 +- MediaBrowser.Model/Session/SessionInfoDto.cs | 2 +- MediaBrowser.Model/Tasks/TaskInfo.cs | 2 +- MediaBrowser.Model/Tasks/TaskResult.cs | 2 +- MediaBrowser.Model/Updates/InstallationInfo.cs | 2 +- MediaBrowser.Model/Updates/PackageVersionInfo.cs | 4 +- MediaBrowser.Model/Web/QueryStringDictionary.cs | 44 ------ .../MediaInfo/SubtitleDownloader.cs | 11 +- .../Subtitles/OpenSubtitleDownloader.cs | 4 +- .../Configuration/ServerConfigurationManager.cs | 1 + .../Drawing/ImageProcessor.cs | 8 +- .../Dto/DtoService.cs | 23 ++-- .../EntryPoints/LibraryChangedNotifier.cs | 10 +- .../EntryPoints/Notifications/Notifier.cs | 1 + .../EntryPoints/ServerEventNotifier.cs | 1 + .../Library/UserManager.cs | 1 + .../LiveTv/LiveTvDtoService.cs | 14 +- .../SqliteDisplayPreferencesRepository.cs | 12 +- .../Roku/RokuSessionController.cs | 10 -- .../Session/SessionManager.cs | 27 ++-- .../Session/WebSocketController.cs | 12 -- 73 files changed, 396 insertions(+), 519 deletions(-) delete mode 100644 MediaBrowser.Common/Events/GenericEventArgs.cs create mode 100644 MediaBrowser.Model/Events/GenericEventArgs.cs (limited to 'MediaBrowser.Model/ApiClient/IApiClient.cs') diff --git a/MediaBrowser.Api/DefaultTheme/DefaultThemeService.cs b/MediaBrowser.Api/DefaultTheme/DefaultThemeService.cs index c9c4cbc43..cd04a8212 100644 --- a/MediaBrowser.Api/DefaultTheme/DefaultThemeService.cs +++ b/MediaBrowser.Api/DefaultTheme/DefaultThemeService.cs @@ -556,7 +556,7 @@ namespace MediaBrowser.Api.DefaultTheme // Avoid implicitly captured closure var currentUserId1 = user.Id; - + view.LatestMovies = movies .OrderByDescending(i => i.DateCreated) .Where(i => !_userDataManager.GetUserData(currentUserId1, i.GetUserDataKey()).Played) @@ -622,9 +622,9 @@ namespace MediaBrowser.Api.DefaultTheme { var tag = _imageProcessor.GetImageCacheTag(item, imageType); - if (tag.HasValue) + if (tag != null) { - stub.ImageTag = tag.Value; + stub.ImageTag = tag; } } catch (Exception ex) diff --git a/MediaBrowser.Api/DefaultTheme/Models.cs b/MediaBrowser.Api/DefaultTheme/Models.cs index f261a9aff..6cc7af499 100644 --- a/MediaBrowser.Api/DefaultTheme/Models.cs +++ b/MediaBrowser.Api/DefaultTheme/Models.cs @@ -9,7 +9,7 @@ namespace MediaBrowser.Api.DefaultTheme { public string Name { get; set; } public string Id { get; set; } - public Guid ImageTag { get; set; } + public string ImageTag { get; set; } public ImageType ImageType { get; set; } } diff --git a/MediaBrowser.Api/DisplayPreferencesService.cs b/MediaBrowser.Api/DisplayPreferencesService.cs index 4060b42b4..16aafafb0 100644 --- a/MediaBrowser.Api/DisplayPreferencesService.cs +++ b/MediaBrowser.Api/DisplayPreferencesService.cs @@ -77,15 +77,16 @@ namespace MediaBrowser.Api /// The request. public object Get(GetDisplayPreferences request) { - Guid displayPreferencesId; + var result = _displayPreferencesManager.GetDisplayPreferences(request.Id, request.UserId, request.Client); - if (!Guid.TryParse(request.Id, out displayPreferencesId)) + if (result == null) { - displayPreferencesId = request.Id.GetMD5(); + result = new DisplayPreferences + { + Id = request.Id + }; } - var result = _displayPreferencesManager.GetDisplayPreferences(displayPreferencesId, request.UserId, request.Client); - return ToOptimizedSerializedResultUsingCache(result); } diff --git a/MediaBrowser.Api/Images/ImageService.cs b/MediaBrowser.Api/Images/ImageService.cs index ce3eaf053..a760819d6 100644 --- a/MediaBrowser.Api/Images/ImageService.cs +++ b/MediaBrowser.Api/Images/ImageService.cs @@ -548,7 +548,7 @@ namespace MediaBrowser.Api.Images var contentType = GetMimeType(request.Format, imageInfo.Path); - var cacheGuid = _imageProcessor.GetImageCacheTag(item, request.Type, imageInfo.Path, originalFileImageDateModified, supportedImageEnhancers); + var cacheGuid = new Guid(_imageProcessor.GetImageCacheTag(item, request.Type, imageInfo.Path, originalFileImageDateModified, supportedImageEnhancers)); TimeSpan? cacheDuration = null; diff --git a/MediaBrowser.Api/PackageService.cs b/MediaBrowser.Api/PackageService.cs index 948a67f16..0a8f0d83f 100644 --- a/MediaBrowser.Api/PackageService.cs +++ b/MediaBrowser.Api/PackageService.cs @@ -112,7 +112,7 @@ namespace MediaBrowser.Api /// /// The id. [ApiMember(Name = "Id", Description = "Installation Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "DELETE")] - public Guid Id { get; set; } + public string Id { get; set; } } /// @@ -221,7 +221,7 @@ namespace MediaBrowser.Api /// The request. public void Delete(CancelPackageInstallation request) { - var info = _installationManager.CurrentInstallations.FirstOrDefault(i => i.Item1.Id == request.Id); + var info = _installationManager.CurrentInstallations.FirstOrDefault(i => string.Equals(i.Item1.Id, request.Id)); if (info != null) { diff --git a/MediaBrowser.Api/SearchService.cs b/MediaBrowser.Api/SearchService.cs index 662c728e4..db646344a 100644 --- a/MediaBrowser.Api/SearchService.cs +++ b/MediaBrowser.Api/SearchService.cs @@ -171,9 +171,9 @@ namespace MediaBrowser.Api var primaryImageTag = _imageProcessor.GetImageCacheTag(item, ImageType.Primary); - if (primaryImageTag.HasValue) + if (primaryImageTag != null) { - result.PrimaryImageTag = primaryImageTag.Value; + result.PrimaryImageTag = primaryImageTag; } SetThumbImageInfo(result, item); @@ -250,9 +250,9 @@ namespace MediaBrowser.Api { var tag = _imageProcessor.GetImageCacheTag(itemWithImage, ImageType.Thumb); - if (tag.HasValue) + if (tag != null) { - hint.ThumbImageTag = tag.Value; + hint.ThumbImageTag = tag; hint.ThumbImageItemId = itemWithImage.Id.ToString("N"); } } @@ -271,9 +271,9 @@ namespace MediaBrowser.Api { var tag = _imageProcessor.GetImageCacheTag(itemWithImage, ImageType.Backdrop); - if (tag.HasValue) + if (tag != null) { - hint.BackdropImageTag = tag.Value; + hint.BackdropImageTag = tag; hint.BackdropImageItemId = itemWithImage.Id.ToString("N"); } } diff --git a/MediaBrowser.Api/UserLibrary/UserLibraryService.cs b/MediaBrowser.Api/UserLibrary/UserLibraryService.cs index d145dd054..008730ef6 100644 --- a/MediaBrowser.Api/UserLibrary/UserLibraryService.cs +++ b/MediaBrowser.Api/UserLibrary/UserLibraryService.cs @@ -1,5 +1,4 @@ -using MediaBrowser.Common.Extensions; -using MediaBrowser.Controller.Dto; +using MediaBrowser.Controller.Dto; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities.Movies; using MediaBrowser.Controller.Entities.TV; @@ -8,7 +7,6 @@ using MediaBrowser.Controller.Session; using MediaBrowser.Model.Dto; using MediaBrowser.Model.Entities; using MediaBrowser.Model.Querying; -using MediaBrowser.Model.Serialization; using MediaBrowser.Model.Session; using ServiceStack; using System; diff --git a/MediaBrowser.Common.Implementations/BaseApplicationHost.cs b/MediaBrowser.Common.Implementations/BaseApplicationHost.cs index 4946241fd..e488fd9bf 100644 --- a/MediaBrowser.Common.Implementations/BaseApplicationHost.cs +++ b/MediaBrowser.Common.Implementations/BaseApplicationHost.cs @@ -13,6 +13,7 @@ using MediaBrowser.Common.Progress; using MediaBrowser.Common.ScheduledTasks; using MediaBrowser.Common.Security; using MediaBrowser.Common.Updates; +using MediaBrowser.Model.Events; using MediaBrowser.Model.IO; using MediaBrowser.Model.Logging; using MediaBrowser.Model.Serialization; diff --git a/MediaBrowser.Common.Implementations/ScheduledTasks/ScheduledTaskWorker.cs b/MediaBrowser.Common.Implementations/ScheduledTasks/ScheduledTaskWorker.cs index 8f3f9b0a6..1e97de0c5 100644 --- a/MediaBrowser.Common.Implementations/ScheduledTasks/ScheduledTaskWorker.cs +++ b/MediaBrowser.Common.Implementations/ScheduledTasks/ScheduledTaskWorker.cs @@ -531,7 +531,7 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks EndTimeUtc = endTime, Status = status, Name = Name, - Id = Id + Id = Id.ToString("N") }; if (ex != null) diff --git a/MediaBrowser.Common.Implementations/ScheduledTasks/TaskManager.cs b/MediaBrowser.Common.Implementations/ScheduledTasks/TaskManager.cs index 6605432fa..cead5de04 100644 --- a/MediaBrowser.Common.Implementations/ScheduledTasks/TaskManager.cs +++ b/MediaBrowser.Common.Implementations/ScheduledTasks/TaskManager.cs @@ -1,6 +1,7 @@ using MediaBrowser.Common.Configuration; using MediaBrowser.Common.Events; using MediaBrowser.Common.ScheduledTasks; +using MediaBrowser.Model.Events; using MediaBrowser.Model.Logging; using MediaBrowser.Model.Serialization; using MediaBrowser.Model.Tasks; diff --git a/MediaBrowser.Common.Implementations/Updates/InstallationManager.cs b/MediaBrowser.Common.Implementations/Updates/InstallationManager.cs index 18462ba9b..92e5f894f 100644 --- a/MediaBrowser.Common.Implementations/Updates/InstallationManager.cs +++ b/MediaBrowser.Common.Implementations/Updates/InstallationManager.cs @@ -5,6 +5,7 @@ using MediaBrowser.Common.Plugins; using MediaBrowser.Common.Progress; using MediaBrowser.Common.Security; using MediaBrowser.Common.Updates; +using MediaBrowser.Model.Events; using MediaBrowser.Model.Logging; using MediaBrowser.Model.Serialization; using MediaBrowser.Model.Updates; @@ -367,7 +368,7 @@ namespace MediaBrowser.Common.Implementations.Updates var installationInfo = new InstallationInfo { - Id = Guid.NewGuid(), + Id = Guid.NewGuid().ToString("N"), Name = package.name, AssemblyGuid = package.guid, UpdateClass = package.classification, @@ -510,13 +511,14 @@ namespace MediaBrowser.Common.Implementations.Updates cancellationToken.ThrowIfCancellationRequested(); // Validate with a checksum - if (package.checksum != Guid.Empty) // support for legacy uploads for now + var packageChecksum = string.IsNullOrWhiteSpace(package.checksum) ? Guid.Empty : new Guid(package.checksum); + if (packageChecksum != Guid.Empty) // support for legacy uploads for now { using (var crypto = new MD5CryptoServiceProvider()) using (var stream = new BufferedStream(File.OpenRead(tempFile), 100000)) { var check = Guid.Parse(BitConverter.ToString(crypto.ComputeHash(stream)).Replace("-", String.Empty)); - if (check != package.checksum) + if (check != packageChecksum) { throw new ApplicationException(string.Format("Download validation failed for {0}. Probably corrupted during transfer.", package.name)); } diff --git a/MediaBrowser.Common/Events/GenericEventArgs.cs b/MediaBrowser.Common/Events/GenericEventArgs.cs deleted file mode 100644 index e7cf524d4..000000000 --- a/MediaBrowser.Common/Events/GenericEventArgs.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System; - -namespace MediaBrowser.Common.Events -{ - /// - /// Provides a generic EventArgs subclass that can hold any kind of object - /// - /// - public class GenericEventArgs : EventArgs - { - /// - /// Gets or sets the argument. - /// - /// The argument. - public T Argument { get; set; } - } -} diff --git a/MediaBrowser.Common/IApplicationHost.cs b/MediaBrowser.Common/IApplicationHost.cs index ecd099711..0e2fef1e6 100644 --- a/MediaBrowser.Common/IApplicationHost.cs +++ b/MediaBrowser.Common/IApplicationHost.cs @@ -1,5 +1,5 @@ -using MediaBrowser.Common.Events; -using MediaBrowser.Common.Plugins; +using MediaBrowser.Common.Plugins; +using MediaBrowser.Model.Events; using MediaBrowser.Model.Updates; using System; using System.Collections.Generic; diff --git a/MediaBrowser.Common/MediaBrowser.Common.csproj b/MediaBrowser.Common/MediaBrowser.Common.csproj index 5e0d3aa24..1da144649 100644 --- a/MediaBrowser.Common/MediaBrowser.Common.csproj +++ b/MediaBrowser.Common/MediaBrowser.Common.csproj @@ -59,7 +59,6 @@ - diff --git a/MediaBrowser.Common/ScheduledTasks/ITaskManager.cs b/MediaBrowser.Common/ScheduledTasks/ITaskManager.cs index 394872783..38548801b 100644 --- a/MediaBrowser.Common/ScheduledTasks/ITaskManager.cs +++ b/MediaBrowser.Common/ScheduledTasks/ITaskManager.cs @@ -1,4 +1,4 @@ -using MediaBrowser.Common.Events; +using MediaBrowser.Model.Events; using MediaBrowser.Model.Tasks; using System; using System.Collections.Generic; diff --git a/MediaBrowser.Common/ScheduledTasks/ScheduledTaskHelpers.cs b/MediaBrowser.Common/ScheduledTasks/ScheduledTaskHelpers.cs index 4364153c9..92c44dea1 100644 --- a/MediaBrowser.Common/ScheduledTasks/ScheduledTaskHelpers.cs +++ b/MediaBrowser.Common/ScheduledTasks/ScheduledTaskHelpers.cs @@ -38,7 +38,7 @@ namespace MediaBrowser.Common.ScheduledTasks Name = task.Name, CurrentProgressPercentage = task.CurrentProgress, State = task.State, - Id = task.Id, + Id = task.Id.ToString("N"), LastExecutionResult = task.LastExecutionResult, Triggers = task.Triggers.Select(GetTriggerInfo).ToList(), Description = task.Description, diff --git a/MediaBrowser.Common/Updates/IInstallationManager.cs b/MediaBrowser.Common/Updates/IInstallationManager.cs index f162f8dc8..592613c54 100644 --- a/MediaBrowser.Common/Updates/IInstallationManager.cs +++ b/MediaBrowser.Common/Updates/IInstallationManager.cs @@ -1,5 +1,5 @@ -using MediaBrowser.Common.Events; -using MediaBrowser.Common.Plugins; +using MediaBrowser.Common.Plugins; +using MediaBrowser.Model.Events; using MediaBrowser.Model.Updates; using System; using System.Collections.Concurrent; diff --git a/MediaBrowser.Controller/Configuration/IServerConfigurationManager.cs b/MediaBrowser.Controller/Configuration/IServerConfigurationManager.cs index 535e74fee..6a2343a00 100644 --- a/MediaBrowser.Controller/Configuration/IServerConfigurationManager.cs +++ b/MediaBrowser.Controller/Configuration/IServerConfigurationManager.cs @@ -1,6 +1,6 @@ using MediaBrowser.Common.Configuration; -using MediaBrowser.Common.Events; using MediaBrowser.Model.Configuration; +using MediaBrowser.Model.Events; using System; namespace MediaBrowser.Controller.Configuration diff --git a/MediaBrowser.Controller/Drawing/IImageProcessor.cs b/MediaBrowser.Controller/Drawing/IImageProcessor.cs index ad5e622fc..b0e44a200 100644 --- a/MediaBrowser.Controller/Drawing/IImageProcessor.cs +++ b/MediaBrowser.Controller/Drawing/IImageProcessor.cs @@ -55,7 +55,7 @@ namespace MediaBrowser.Controller.Drawing /// The item. /// The image. /// Guid. - Guid GetImageCacheTag(IHasImages item, ItemImageInfo image); + string GetImageCacheTag(IHasImages item, ItemImageInfo image); /// /// Gets the image cache tag. @@ -66,7 +66,7 @@ namespace MediaBrowser.Controller.Drawing /// The date modified. /// The image enhancers. /// Guid. - Guid GetImageCacheTag(IHasImages item, ImageType imageType, string originalImagePath, DateTime dateModified, + string GetImageCacheTag(IHasImages item, ImageType imageType, string originalImagePath, DateTime dateModified, List imageEnhancers); /// @@ -89,12 +89,12 @@ namespace MediaBrowser.Controller.Drawing public static class ImageProcessorExtensions { - public static Guid? GetImageCacheTag(this IImageProcessor processor, IHasImages item, ImageType imageType) + public static string GetImageCacheTag(this IImageProcessor processor, IHasImages item, ImageType imageType) { return processor.GetImageCacheTag(item, imageType, 0); } - public static Guid? GetImageCacheTag(this IImageProcessor processor, IHasImages item, ImageType imageType, int imageIndex) + public static string GetImageCacheTag(this IImageProcessor processor, IHasImages item, ImageType imageType, int imageIndex) { var imageInfo = item.GetImageInfo(imageType, imageIndex); diff --git a/MediaBrowser.Controller/Library/IUserManager.cs b/MediaBrowser.Controller/Library/IUserManager.cs index c3b0748cf..0a0174b6d 100644 --- a/MediaBrowser.Controller/Library/IUserManager.cs +++ b/MediaBrowser.Controller/Library/IUserManager.cs @@ -1,5 +1,5 @@ -using MediaBrowser.Common.Events; -using MediaBrowser.Controller.Entities; +using MediaBrowser.Controller.Entities; +using MediaBrowser.Model.Events; using System; using System.Collections.Generic; using System.Threading; diff --git a/MediaBrowser.Controller/Persistence/IDisplayPreferencesRepository.cs b/MediaBrowser.Controller/Persistence/IDisplayPreferencesRepository.cs index 4e56932ec..84fedebce 100644 --- a/MediaBrowser.Controller/Persistence/IDisplayPreferencesRepository.cs +++ b/MediaBrowser.Controller/Persistence/IDisplayPreferencesRepository.cs @@ -34,6 +34,6 @@ namespace MediaBrowser.Controller.Persistence /// The user id. /// The client. /// Task{DisplayPreferences}. - DisplayPreferences GetDisplayPreferences(Guid displayPreferencesId, Guid userId, string client); + DisplayPreferences GetDisplayPreferences(string displayPreferencesId, Guid userId, string client); } } diff --git a/MediaBrowser.Controller/Session/ISessionController.cs b/MediaBrowser.Controller/Session/ISessionController.cs index d4612acb5..9c818284d 100644 --- a/MediaBrowser.Controller/Session/ISessionController.cs +++ b/MediaBrowser.Controller/Session/ISessionController.cs @@ -19,14 +19,6 @@ namespace MediaBrowser.Controller.Session /// true if this instance is session active; otherwise, false. bool IsSessionActive { get; } - /// - /// Sends the message command. - /// - /// The command. - /// The cancellation token. - /// Task. - Task SendMessageCommand(MessageCommand command, CancellationToken cancellationToken); - /// /// Sends the play command. /// diff --git a/MediaBrowser.Dlna/Didl/DidlBuilder.cs b/MediaBrowser.Dlna/Didl/DidlBuilder.cs index 7c627104b..1cd4a4cbd 100644 --- a/MediaBrowser.Dlna/Didl/DidlBuilder.cs +++ b/MediaBrowser.Dlna/Didl/DidlBuilder.cs @@ -623,9 +623,7 @@ namespace MediaBrowser.Dlna.Didl try { - var guid = _imageProcessor.GetImageCacheTag(item, ImageType.Primary); - - tag = guid.HasValue ? guid.Value.ToString("N") : null; + tag = _imageProcessor.GetImageCacheTag(item, ImageType.Primary); } catch { @@ -712,7 +710,7 @@ namespace MediaBrowser.Dlna.Didl Height = height.Value, Width = width.Value - }, maxWidth: maxWidth, maxHeight: maxHeight); + }, null, null, maxWidth, maxHeight); width = Convert.ToInt32(newSize.Width); height = Convert.ToInt32(newSize.Height); diff --git a/MediaBrowser.Dlna/PlayTo/DlnaController.cs b/MediaBrowser.Dlna/PlayTo/DlnaController.cs index 673a7c245..ab342d635 100644 --- a/MediaBrowser.Dlna/PlayTo/DlnaController.cs +++ b/MediaBrowser.Dlna/PlayTo/DlnaController.cs @@ -355,11 +355,6 @@ namespace MediaBrowser.Dlna.PlayTo return Task.FromResult(true); } - public Task SendMessageCommand(MessageCommand command, CancellationToken cancellationToken) - { - return Task.FromResult(true); - } - #endregion #region Playlist diff --git a/MediaBrowser.Model.Portable/MediaBrowser.Model.Portable.csproj b/MediaBrowser.Model.Portable/MediaBrowser.Model.Portable.csproj index 991fe3b2a..7f8f4c325 100644 --- a/MediaBrowser.Model.Portable/MediaBrowser.Model.Portable.csproj +++ b/MediaBrowser.Model.Portable/MediaBrowser.Model.Portable.csproj @@ -278,6 +278,9 @@ Entities\VirtualFolderInfo.cs + + Events\GenericEventArgs.cs + FileOrganization\FileOrganizationQuery.cs diff --git a/MediaBrowser.Model.net35/MediaBrowser.Model.net35.csproj b/MediaBrowser.Model.net35/MediaBrowser.Model.net35.csproj index 771e739bc..d65aef7f0 100644 --- a/MediaBrowser.Model.net35/MediaBrowser.Model.net35.csproj +++ b/MediaBrowser.Model.net35/MediaBrowser.Model.net35.csproj @@ -265,6 +265,9 @@ Entities\VirtualFolderInfo.cs + + Events\GenericEventArgs.cs + FileOrganization\FileOrganizationQuery.cs diff --git a/MediaBrowser.Model/ApiClient/IApiClient.cs b/MediaBrowser.Model/ApiClient/IApiClient.cs index c9f5f3ae7..bfc631c79 100644 --- a/MediaBrowser.Model/ApiClient/IApiClient.cs +++ b/MediaBrowser.Model/ApiClient/IApiClient.cs @@ -138,7 +138,7 @@ namespace MediaBrowser.Model.ApiClient /// The notification id list. /// if set to true [is read]. /// Task. - Task MarkNotificationsRead(string userId, IEnumerable notificationIdList, bool isRead); + Task MarkNotificationsRead(string userId, IEnumerable notificationIdList, bool isRead); /// /// Gets the notifications summary. @@ -447,7 +447,7 @@ namespace MediaBrowser.Model.ApiClient /// The id. /// Task{TaskInfo}. /// id - Task GetScheduledTaskAsync(Guid id); + Task GetScheduledTaskAsync(string id); /// /// Gets a user by id @@ -581,6 +581,38 @@ namespace MediaBrowser.Model.ApiClient /// Task. Task SendCommandAsync(string sessionId, GeneralCommand command); + /// + /// Sends the string. + /// + /// The session identifier. + /// The text. + /// Task. + Task SendString(string sessionId, string text); + + /// + /// Sets the volume. + /// + /// The session identifier. + /// The volume. + /// Task. + Task SetVolume(string sessionId, int volume); + + /// + /// Sets the index of the audio stream. + /// + /// The session identifier. + /// The volume. + /// Task. + Task SetAudioStreamIndex(string sessionId, int? volume); + + /// + /// Sets the index of the subtitle stream. + /// + /// The session identifier. + /// The volume. + /// Task. + Task SetSubtitleStreamIndex(string sessionId, int? volume); + /// /// Instructs the client to display a message to the user /// @@ -632,7 +664,7 @@ namespace MediaBrowser.Model.ApiClient /// The triggers. /// Task{RequestResult}. /// id - Task UpdateScheduledTaskTriggersAsync(Guid id, TaskTriggerInfo[] triggers); + Task UpdateScheduledTaskTriggersAsync(string id, TaskTriggerInfo[] triggers); /// /// Gets the display preferences. diff --git a/MediaBrowser.Model/ApiClient/IServerEvents.cs b/MediaBrowser.Model/ApiClient/IServerEvents.cs index e13f3cc2c..8e46f3d9f 100644 --- a/MediaBrowser.Model/ApiClient/IServerEvents.cs +++ b/MediaBrowser.Model/ApiClient/IServerEvents.cs @@ -1,4 +1,11 @@ -using System; +using MediaBrowser.Model.Dto; +using MediaBrowser.Model.Entities; +using MediaBrowser.Model.Events; +using MediaBrowser.Model.Plugins; +using MediaBrowser.Model.Session; +using MediaBrowser.Model.Tasks; +using MediaBrowser.Model.Updates; +using System; namespace MediaBrowser.Model.ApiClient { @@ -10,59 +17,59 @@ namespace MediaBrowser.Model.ApiClient /// /// Occurs when [user deleted]. /// - event EventHandler UserDeleted; + event EventHandler> UserDeleted; /// /// Occurs when [scheduled task started]. /// - event EventHandler ScheduledTaskStarted; + event EventHandler> ScheduledTaskStarted; /// /// Occurs when [scheduled task ended]. /// - event EventHandler ScheduledTaskEnded; + event EventHandler> ScheduledTaskEnded; /// /// Occurs when [package installing]. /// - event EventHandler PackageInstalling; + event EventHandler> PackageInstalling; /// /// Occurs when [package installation failed]. /// - event EventHandler PackageInstallationFailed; + event EventHandler> PackageInstallationFailed; /// /// Occurs when [package installation completed]. /// - event EventHandler PackageInstallationCompleted; + event EventHandler> PackageInstallationCompleted; /// /// Occurs when [package installation cancelled]. /// - event EventHandler PackageInstallationCancelled; + event EventHandler> PackageInstallationCancelled; /// /// Occurs when [user updated]. /// - event EventHandler UserUpdated; + event EventHandler> UserUpdated; /// /// Occurs when [plugin uninstalled]. /// - event EventHandler PluginUninstalled; + event EventHandler> PluginUninstalled; /// /// Occurs when [library changed]. /// - event EventHandler LibraryChanged; + event EventHandler> LibraryChanged; /// /// Occurs when [browse command]. /// - event EventHandler BrowseCommand; + event EventHandler> BrowseCommand; /// /// Occurs when [play command]. /// - event EventHandler PlayCommand; + event EventHandler> PlayCommand; /// /// Occurs when [playstate command]. /// - event EventHandler PlaystateCommand; + event EventHandler> PlaystateCommand; /// /// Occurs when [message command]. /// - event EventHandler MessageCommand; + event EventHandler> MessageCommand; /// /// Occurs when [system command]. /// @@ -88,6 +95,22 @@ namespace MediaBrowser.Model.ApiClient /// event EventHandler ServerShuttingDown; /// + /// Occurs when [send text command]. + /// + event EventHandler> SendTextCommand; + /// + /// Occurs when [set volume command]. + /// + event EventHandler> SetVolumeCommand; + /// + /// Occurs when [set audio stream index command]. + /// + event EventHandler> SetAudioStreamIndexCommand; + /// + /// Occurs when [set video stream index command]. + /// + event EventHandler> SetVideoStreamIndexCommand; + /// /// Occurs when [sessions updated]. /// event EventHandler SessionsUpdated; @@ -98,7 +121,7 @@ namespace MediaBrowser.Model.ApiClient /// /// Occurs when [user data changed]. /// - event EventHandler UserDataChanged; + event EventHandler> UserDataChanged; /// /// Occurs when [connected]. /// diff --git a/MediaBrowser.Model/ApiClient/ServerEventArgs.cs b/MediaBrowser.Model/ApiClient/ServerEventArgs.cs index 6637edd74..ad0defe68 100644 --- a/MediaBrowser.Model/ApiClient/ServerEventArgs.cs +++ b/MediaBrowser.Model/ApiClient/ServerEventArgs.cs @@ -1,154 +1,8 @@ -using MediaBrowser.Model.Dto; -using MediaBrowser.Model.Entities; -using MediaBrowser.Model.Plugins; -using MediaBrowser.Model.Session; -using MediaBrowser.Model.Tasks; -using MediaBrowser.Model.Updates; +using MediaBrowser.Model.Session; using System; namespace MediaBrowser.Model.ApiClient { - /// - /// Class UserDeletedEventArgs - /// - public class UserDeletedEventArgs : EventArgs - { - /// - /// Gets or sets the id. - /// - /// The id. - public string Id { get; set; } - } - - public class UserDataChangedEventArgs : EventArgs - { - /// - /// Gets or sets the user. - /// - /// The user. - public UserDataChangeInfo ChangeInfo { get; set; } - } - - /// - /// Class UserUpdatedEventArgs - /// - public class UserUpdatedEventArgs : EventArgs - { - /// - /// Gets or sets the user. - /// - /// The user. - public UserDto User { get; set; } - } - - /// - /// Class ScheduledTaskStartedEventArgs - /// - public class ScheduledTaskStartedEventArgs : EventArgs - { - /// - /// Gets or sets the name. - /// - /// The name. - public string Name { get; set; } - } - - /// - /// Class ScheduledTaskEndedEventArgs - /// - public class ScheduledTaskEndedEventArgs : EventArgs - { - /// - /// Gets or sets the result. - /// - /// The result. - public TaskResult Result { get; set; } - } - - /// - /// Class PackageInstallationEventArgs - /// - public class PackageInstallationEventArgs : EventArgs - { - /// - /// Gets or sets the installation info. - /// - /// The installation info. - public InstallationInfo InstallationInfo { get; set; } - } - - /// - /// Class PluginUninstallEventArgs - /// - public class PluginUninstallEventArgs : EventArgs - { - /// - /// Gets or sets the plugin info. - /// - /// The plugin info. - public PluginInfo PluginInfo { get; set; } - } - - /// - /// Class LibraryChangedEventArgs - /// - public class LibraryChangedEventArgs : EventArgs - { - /// - /// Gets or sets the update info. - /// - /// The update info. - public LibraryUpdateInfo UpdateInfo { get; set; } - } - - /// - /// Class BrowseRequestEventArgs - /// - public class BrowseRequestEventArgs : EventArgs - { - /// - /// Gets or sets the request. - /// - /// The request. - public BrowseRequest Request { get; set; } - } - - /// - /// Class PlayRequestEventArgs - /// - public class PlayRequestEventArgs : EventArgs - { - /// - /// Gets or sets the request. - /// - /// The request. - public PlayRequest Request { get; set; } - } - - /// - /// Class PlaystateRequestEventArgs - /// - public class PlaystateRequestEventArgs : EventArgs - { - /// - /// Gets or sets the request. - /// - /// The request. - public PlaystateRequest Request { get; set; } - } - - /// - /// Class MessageCommandEventArgs - /// - public class MessageCommandEventArgs : EventArgs - { - /// - /// Gets or sets the request. - /// - /// The request. - public MessageCommand Request { get; set; } - } - /// /// Class SystemCommandEventArgs /// diff --git a/MediaBrowser.Model/Configuration/MetadataOptions.cs b/MediaBrowser.Model/Configuration/MetadataOptions.cs index d666f6cce..7b2bcc178 100644 --- a/MediaBrowser.Model/Configuration/MetadataOptions.cs +++ b/MediaBrowser.Model/Configuration/MetadataOptions.cs @@ -30,7 +30,7 @@ namespace MediaBrowser.Model.Configuration public MetadataOptions(int backdropLimit, int minBackdropWidth) { - var imageOptions = new List + List imageOptions = new List { new ImageOption { @@ -52,14 +52,14 @@ namespace MediaBrowser.Model.Configuration public int GetLimit(ImageType type) { - var option = ImageOptions.FirstOrDefault(i => i.Type == type); + ImageOption option = ImageOptions.FirstOrDefault(i => i.Type == type); return option == null ? 1 : option.Limit; } public int GetMinWidth(ImageType type) { - var option = ImageOptions.FirstOrDefault(i => i.Type == type); + ImageOption option = ImageOptions.FirstOrDefault(i => i.Type == type); return option == null ? 0 : option.MinWidth; } diff --git a/MediaBrowser.Model/Dlna/MediaFormatProfileResolver.cs b/MediaBrowser.Model/Dlna/MediaFormatProfileResolver.cs index a62508fb1..b5f5dd138 100644 --- a/MediaBrowser.Model/Dlna/MediaFormatProfileResolver.cs +++ b/MediaBrowser.Model/Dlna/MediaFormatProfileResolver.cs @@ -1,7 +1,6 @@ -using System; +using MediaBrowser.Model.MediaInfo; +using System; using System.Collections.Generic; -using MediaBrowser.Model.Entities; -using MediaBrowser.Model.MediaInfo; namespace MediaBrowser.Model.Dlna { diff --git a/MediaBrowser.Model/Dlna/StreamBuilder.cs b/MediaBrowser.Model/Dlna/StreamBuilder.cs index 21441d36a..02cee0dce 100644 --- a/MediaBrowser.Model/Dlna/StreamBuilder.cs +++ b/MediaBrowser.Model/Dlna/StreamBuilder.cs @@ -16,22 +16,22 @@ namespace MediaBrowser.Model.Dlna { ValidateAudioInput(options); - var mediaSources = options.MediaSources; + List mediaSources = options.MediaSources; // If the client wants a specific media soure, filter now if (!string.IsNullOrEmpty(options.MediaSourceId)) { // Avoid implicitly captured closure - var mediaSourceId = options.MediaSourceId; + string mediaSourceId = options.MediaSourceId; mediaSources = mediaSources .Where(i => string.Equals(i.Id, mediaSourceId, StringComparison.OrdinalIgnoreCase)) .ToList(); } - var streams = mediaSources.Select(i => BuildAudioItem(i, options)).ToList(); + List streams = mediaSources.Select(i => BuildAudioItem(i, options)).ToList(); - foreach (var stream in streams) + foreach (StreamInfo stream in streams) { stream.DeviceId = options.DeviceId; stream.DeviceProfileId = options.Profile.Id; @@ -44,22 +44,22 @@ namespace MediaBrowser.Model.Dlna { ValidateInput(options); - var mediaSources = options.MediaSources; + List mediaSources = options.MediaSources; // If the client wants a specific media soure, filter now if (!string.IsNullOrEmpty(options.MediaSourceId)) { // Avoid implicitly captured closure - var mediaSourceId = options.MediaSourceId; + string mediaSourceId = options.MediaSourceId; mediaSources = mediaSources .Where(i => string.Equals(i.Id, mediaSourceId, StringComparison.OrdinalIgnoreCase)) .ToList(); } - var streams = mediaSources.Select(i => BuildVideoItem(i, options)).ToList(); + List streams = mediaSources.Select(i => BuildVideoItem(i, options)).ToList(); - foreach (var stream in streams) + foreach (StreamInfo stream in streams) { stream.DeviceId = options.DeviceId; stream.DeviceProfileId = options.Profile.Id; @@ -78,7 +78,7 @@ namespace MediaBrowser.Model.Dlna private StreamInfo BuildAudioItem(MediaSourceInfo item, AudioOptions options) { - var playlistItem = new StreamInfo + StreamInfo playlistItem = new StreamInfo { ItemId = options.ItemId, MediaType = DlnaProfileType.Audio, @@ -86,30 +86,30 @@ namespace MediaBrowser.Model.Dlna RunTimeTicks = item.RunTimeTicks }; - var maxBitrateSetting = options.MaxBitrate ?? options.Profile.MaxBitrate; + int? maxBitrateSetting = options.MaxBitrate ?? options.Profile.MaxBitrate; - var audioStream = item.MediaStreams.FirstOrDefault(i => i.Type == MediaStreamType.Audio); + MediaStream audioStream = item.MediaStreams.FirstOrDefault(i => i.Type == MediaStreamType.Audio); // Honor the max bitrate setting if (IsAudioEligibleForDirectPlay(item, maxBitrateSetting)) { - var directPlay = options.Profile.DirectPlayProfiles + DirectPlayProfile directPlay = options.Profile.DirectPlayProfiles .FirstOrDefault(i => i.Type == playlistItem.MediaType && IsAudioDirectPlaySupported(i, item, audioStream)); if (directPlay != null) { - var audioCodec = audioStream == null ? null : audioStream.Codec; + string audioCodec = audioStream == null ? null : audioStream.Codec; // Make sure audio codec profiles are satisfied if (!string.IsNullOrEmpty(audioCodec)) { - var conditionProcessor = new ConditionProcessor(); + ConditionProcessor conditionProcessor = new ConditionProcessor(); - var conditions = options.Profile.CodecProfiles.Where(i => i.Type == CodecType.Audio && i.ContainsCodec(audioCodec)) + IEnumerable conditions = options.Profile.CodecProfiles.Where(i => i.Type == CodecType.Audio && i.ContainsCodec(audioCodec)) .SelectMany(i => i.Conditions); - var audioChannels = audioStream == null ? null : audioStream.Channels; - var audioBitrate = audioStream == null ? null : audioStream.BitRate; + int? audioChannels = audioStream.Channels; + int? audioBitrate = audioStream.BitRate; if (conditions.All(c => conditionProcessor.IsAudioConditionSatisfied(c, audioChannels, audioBitrate))) { @@ -122,7 +122,7 @@ namespace MediaBrowser.Model.Dlna } } - var transcodingProfile = options.Profile.TranscodingProfiles + TranscodingProfile transcodingProfile = options.Profile.TranscodingProfiles .FirstOrDefault(i => i.Type == playlistItem.MediaType); if (transcodingProfile != null) @@ -134,7 +134,7 @@ namespace MediaBrowser.Model.Dlna playlistItem.AudioCodec = transcodingProfile.AudioCodec; playlistItem.Protocol = transcodingProfile.Protocol; - var audioTranscodingConditions = options.Profile.CodecProfiles + IEnumerable audioTranscodingConditions = options.Profile.CodecProfiles .Where(i => i.Type == CodecType.Audio && i.ContainsCodec(transcodingProfile.AudioCodec)) .Take(1) .SelectMany(i => i.Conditions); @@ -144,7 +144,7 @@ namespace MediaBrowser.Model.Dlna // Honor requested max channels if (options.MaxAudioChannels.HasValue) { - var currentValue = playlistItem.MaxAudioChannels ?? options.MaxAudioChannels.Value; + int currentValue = playlistItem.MaxAudioChannels ?? options.MaxAudioChannels.Value; playlistItem.MaxAudioChannels = Math.Min(options.MaxAudioChannels.Value, currentValue); } @@ -152,7 +152,7 @@ namespace MediaBrowser.Model.Dlna // Honor requested max bitrate if (maxBitrateSetting.HasValue) { - var currentValue = playlistItem.AudioBitrate ?? maxBitrateSetting.Value; + int currentValue = playlistItem.AudioBitrate ?? maxBitrateSetting.Value; playlistItem.AudioBitrate = Math.Min(maxBitrateSetting.Value, currentValue); } @@ -163,7 +163,7 @@ namespace MediaBrowser.Model.Dlna private StreamInfo BuildVideoItem(MediaSourceInfo item, VideoOptions options) { - var playlistItem = new StreamInfo + StreamInfo playlistItem = new StreamInfo { ItemId = options.ItemId, MediaType = DlnaProfileType.Video, @@ -171,15 +171,15 @@ namespace MediaBrowser.Model.Dlna RunTimeTicks = item.RunTimeTicks }; - var audioStream = item.MediaStreams.FirstOrDefault(i => i.Type == MediaStreamType.Audio); - var videoStream = item.MediaStreams.FirstOrDefault(i => i.Type == MediaStreamType.Video); + MediaStream audioStream = item.MediaStreams.FirstOrDefault(i => i.Type == MediaStreamType.Audio); + MediaStream videoStream = item.MediaStreams.FirstOrDefault(i => i.Type == MediaStreamType.Video); - var maxBitrateSetting = options.MaxBitrate ?? options.Profile.MaxBitrate; + int? maxBitrateSetting = options.MaxBitrate ?? options.Profile.MaxBitrate; if (IsEligibleForDirectPlay(item, options, maxBitrateSetting)) { // See if it can be direct played - var directPlay = GetVideoDirectPlayProfile(options.Profile, item, videoStream, audioStream); + DirectPlayProfile directPlay = GetVideoDirectPlayProfile(options.Profile, item, videoStream, audioStream); if (directPlay != null) { @@ -191,7 +191,7 @@ namespace MediaBrowser.Model.Dlna } // Can't direct play, find the transcoding profile - var transcodingProfile = options.Profile.TranscodingProfiles + TranscodingProfile transcodingProfile = options.Profile.TranscodingProfiles .FirstOrDefault(i => i.Type == playlistItem.MediaType); if (transcodingProfile != null) @@ -206,14 +206,14 @@ namespace MediaBrowser.Model.Dlna playlistItem.AudioStreamIndex = options.AudioStreamIndex; playlistItem.SubtitleStreamIndex = options.SubtitleStreamIndex; - var videoTranscodingConditions = options.Profile.CodecProfiles + IEnumerable videoTranscodingConditions = options.Profile.CodecProfiles .Where(i => i.Type == CodecType.Video && i.ContainsCodec(transcodingProfile.VideoCodec)) .Take(1) .SelectMany(i => i.Conditions); ApplyTranscodingConditions(playlistItem, videoTranscodingConditions); - var audioTranscodingConditions = options.Profile.CodecProfiles + IEnumerable audioTranscodingConditions = options.Profile.CodecProfiles .Where(i => i.Type == CodecType.VideoAudio && i.ContainsCodec(transcodingProfile.AudioCodec)) .Take(1) .SelectMany(i => i.Conditions); @@ -223,7 +223,7 @@ namespace MediaBrowser.Model.Dlna // Honor requested max channels if (options.MaxAudioChannels.HasValue) { - var currentValue = playlistItem.MaxAudioChannels ?? options.MaxAudioChannels.Value; + int currentValue = playlistItem.MaxAudioChannels ?? options.MaxAudioChannels.Value; playlistItem.MaxAudioChannels = Math.Min(options.MaxAudioChannels.Value, currentValue); } @@ -231,7 +231,7 @@ namespace MediaBrowser.Model.Dlna // Honor requested max bitrate if (options.MaxAudioTranscodingBitrate.HasValue) { - var currentValue = playlistItem.AudioBitrate ?? options.MaxAudioTranscodingBitrate.Value; + int currentValue = playlistItem.AudioBitrate ?? options.MaxAudioTranscodingBitrate.Value; playlistItem.AudioBitrate = Math.Min(options.MaxAudioTranscodingBitrate.Value, currentValue); } @@ -239,14 +239,14 @@ namespace MediaBrowser.Model.Dlna // Honor max rate if (maxBitrateSetting.HasValue) { - var videoBitrate = maxBitrateSetting.Value; + int videoBitrate = maxBitrateSetting.Value; if (playlistItem.AudioBitrate.HasValue) { videoBitrate -= playlistItem.AudioBitrate.Value; } - var currentValue = playlistItem.VideoBitrate ?? videoBitrate; + int currentValue = playlistItem.VideoBitrate ?? videoBitrate; playlistItem.VideoBitrate = Math.Min(videoBitrate, currentValue); } @@ -261,7 +261,7 @@ namespace MediaBrowser.Model.Dlna MediaStream audioStream) { // See if it can be direct played - var directPlay = profile.DirectPlayProfiles + DirectPlayProfile directPlay = profile.DirectPlayProfiles .FirstOrDefault(i => i.Type == DlnaProfileType.Video && IsVideoDirectPlaySupported(i, mediaSource, videoStream, audioStream)); if (directPlay == null) @@ -269,28 +269,28 @@ namespace MediaBrowser.Model.Dlna return null; } - var container = mediaSource.Container; + string container = mediaSource.Container; - var conditions = profile.ContainerProfiles + IEnumerable conditions = profile.ContainerProfiles .Where(i => i.Type == DlnaProfileType.Video && i.GetContainers().Contains(container, StringComparer.OrdinalIgnoreCase)) .SelectMany(i => i.Conditions); - var conditionProcessor = new ConditionProcessor(); + ConditionProcessor conditionProcessor = new ConditionProcessor(); - var width = videoStream == null ? null : videoStream.Width; - var height = videoStream == null ? null : videoStream.Height; - var bitDepth = videoStream == null ? null : videoStream.BitDepth; - var videoBitrate = videoStream == null ? null : videoStream.BitRate; - var videoLevel = videoStream == null ? null : videoStream.Level; - var videoProfile = videoStream == null ? null : videoStream.Profile; - var videoFramerate = videoStream == null ? null : videoStream.AverageFrameRate ?? videoStream.AverageFrameRate; + int? width = videoStream == null ? null : videoStream.Width; + int? height = videoStream == null ? null : videoStream.Height; + int? bitDepth = videoStream == null ? null : videoStream.BitDepth; + int? videoBitrate = videoStream == null ? null : videoStream.BitRate; + double? videoLevel = videoStream == null ? null : videoStream.Level; + string videoProfile = videoStream == null ? null : videoStream.Profile; + float? videoFramerate = videoStream == null ? null : videoStream.AverageFrameRate ?? videoStream.AverageFrameRate; - var audioBitrate = audioStream == null ? null : audioStream.BitRate; - var audioChannels = audioStream == null ? null : audioStream.Channels; - var audioProfile = audioStream == null ? null : audioStream.Profile; + int? audioBitrate = audioStream == null ? null : audioStream.BitRate; + int? audioChannels = audioStream == null ? null : audioStream.Channels; + string audioProfile = audioStream == null ? null : audioStream.Profile; - var timestamp = videoStream == null ? TransportStreamTimestamp.None : mediaSource.Timestamp; - var packetLength = videoStream == null ? null : videoStream.PacketLength; + TransportStreamTimestamp? timestamp = videoStream == null ? TransportStreamTimestamp.None : mediaSource.Timestamp; + int? packetLength = videoStream == null ? null : videoStream.PacketLength; // Check container conditions if (!conditions.All(i => conditionProcessor.IsVideoConditionSatisfied(i, @@ -309,7 +309,7 @@ namespace MediaBrowser.Model.Dlna return null; } - var videoCodec = videoStream == null ? null : videoStream.Codec; + string videoCodec = videoStream == null ? null : videoStream.Codec; if (string.IsNullOrEmpty(videoCodec)) { @@ -338,7 +338,7 @@ namespace MediaBrowser.Model.Dlna if (audioStream != null) { - var audioCodec = audioStream.Codec; + string audioCodec = audioStream.Codec; if (string.IsNullOrEmpty(audioCodec)) { @@ -420,10 +420,10 @@ namespace MediaBrowser.Model.Dlna private void ApplyTranscodingConditions(StreamInfo item, IEnumerable conditions) { - foreach (var condition in conditions + foreach (ProfileCondition condition in conditions .Where(i => !string.IsNullOrEmpty(i.Value))) { - var value = condition.Value; + string value = condition.Value; switch (condition.Property) { @@ -515,7 +515,7 @@ namespace MediaBrowser.Model.Dlna if (profile.Container.Length > 0) { // Check container type - var mediaContainer = item.Container ?? string.Empty; + string mediaContainer = item.Container ?? string.Empty; if (!profile.GetContainers().Any(i => string.Equals(i, mediaContainer, StringComparison.OrdinalIgnoreCase))) { return false; @@ -536,7 +536,7 @@ namespace MediaBrowser.Model.Dlna if (profile.Container.Length > 0) { // Check container type - var mediaContainer = item.Container ?? string.Empty; + string mediaContainer = item.Container ?? string.Empty; if (!profile.GetContainers().Any(i => string.Equals(i, mediaContainer, StringComparison.OrdinalIgnoreCase))) { return false; @@ -544,21 +544,21 @@ namespace MediaBrowser.Model.Dlna } // Check video codec - var videoCodecs = profile.GetVideoCodecs(); + List videoCodecs = profile.GetVideoCodecs(); if (videoCodecs.Count > 0) { - var videoCodec = videoStream == null ? null : videoStream.Codec; + string videoCodec = videoStream == null ? null : videoStream.Codec; if (string.IsNullOrEmpty(videoCodec) || !videoCodecs.Contains(videoCodec, StringComparer.OrdinalIgnoreCase)) { return false; } } - var audioCodecs = profile.GetAudioCodecs(); + List audioCodecs = profile.GetAudioCodecs(); if (audioCodecs.Count > 0) { // Check audio codecs - var audioCodec = audioStream == null ? null : audioStream.Codec; + string audioCodec = audioStream == null ? null : audioStream.Codec; if (string.IsNullOrEmpty(audioCodec) || !audioCodecs.Contains(audioCodec, StringComparer.OrdinalIgnoreCase)) { return false; diff --git a/MediaBrowser.Model/Dlna/StreamInfo.cs b/MediaBrowser.Model/Dlna/StreamInfo.cs index fe49227e4..ae9806f97 100644 --- a/MediaBrowser.Model/Dlna/StreamInfo.cs +++ b/MediaBrowser.Model/Dlna/StreamInfo.cs @@ -79,9 +79,9 @@ namespace MediaBrowser.Model.Dlna throw new ArgumentNullException(baseUrl); } - var dlnaCommand = BuildDlnaParam(this); + string dlnaCommand = BuildDlnaParam(this); - var extension = string.IsNullOrEmpty(Container) ? string.Empty : "." + Container; + string extension = string.IsNullOrEmpty(Container) ? string.Empty : "." + Container; baseUrl = baseUrl.TrimEnd('/'); @@ -98,11 +98,11 @@ namespace MediaBrowser.Model.Dlna return string.Format("{0}/videos/{1}/stream{2}?{3}", baseUrl, ItemId, extension, dlnaCommand); } + private static readonly CultureInfo UsCulture = new CultureInfo("en-US"); + private static string BuildDlnaParam(StreamInfo item) { - var usCulture = new CultureInfo("en-US"); - - var list = new List + List list = new List { item.DeviceProfileId ?? string.Empty, item.DeviceId ?? string.Empty, @@ -110,16 +110,16 @@ namespace MediaBrowser.Model.Dlna (item.IsDirectStream).ToString().ToLower(), item.VideoCodec ?? string.Empty, item.AudioCodec ?? string.Empty, - item.AudioStreamIndex.HasValue ? item.AudioStreamIndex.Value.ToString(usCulture) : string.Empty, - item.SubtitleStreamIndex.HasValue ? item.SubtitleStreamIndex.Value.ToString(usCulture) : string.Empty, - item.VideoBitrate.HasValue ? item.VideoBitrate.Value.ToString(usCulture) : string.Empty, - item.AudioBitrate.HasValue ? item.AudioBitrate.Value.ToString(usCulture) : string.Empty, - item.MaxAudioChannels.HasValue ? item.MaxAudioChannels.Value.ToString(usCulture) : string.Empty, - item.MaxFramerate.HasValue ? item.MaxFramerate.Value.ToString(usCulture) : string.Empty, - item.MaxWidth.HasValue ? item.MaxWidth.Value.ToString(usCulture) : string.Empty, - item.MaxHeight.HasValue ? item.MaxHeight.Value.ToString(usCulture) : string.Empty, - item.StartPositionTicks.ToString(usCulture), - item.VideoLevel.HasValue ? item.VideoLevel.Value.ToString(usCulture) : string.Empty + item.AudioStreamIndex.HasValue ? item.AudioStreamIndex.Value.ToString(UsCulture) : string.Empty, + item.SubtitleStreamIndex.HasValue ? item.SubtitleStreamIndex.Value.ToString(UsCulture) : string.Empty, + item.VideoBitrate.HasValue ? item.VideoBitrate.Value.ToString(UsCulture) : string.Empty, + item.AudioBitrate.HasValue ? item.AudioBitrate.Value.ToString(UsCulture) : string.Empty, + item.MaxAudioChannels.HasValue ? item.MaxAudioChannels.Value.ToString(UsCulture) : string.Empty, + item.MaxFramerate.HasValue ? item.MaxFramerate.Value.ToString(UsCulture) : string.Empty, + item.MaxWidth.HasValue ? item.MaxWidth.Value.ToString(UsCulture) : string.Empty, + item.MaxHeight.HasValue ? item.MaxHeight.Value.ToString(UsCulture) : string.Empty, + item.StartPositionTicks.ToString(UsCulture), + item.VideoLevel.HasValue ? item.VideoLevel.Value.ToString(UsCulture) : string.Empty }; return string.Format("Params={0}", string.Join(";", list.ToArray())); @@ -134,7 +134,7 @@ namespace MediaBrowser.Model.Dlna { if (MediaSource != null) { - var audioStreams = MediaSource.MediaStreams.Where(i => i.Type == MediaStreamType.Audio); + IEnumerable audioStreams = MediaSource.MediaStreams.Where(i => i.Type == MediaStreamType.Audio); if (AudioStreamIndex.HasValue) { @@ -172,7 +172,7 @@ namespace MediaBrowser.Model.Dlna { get { - var stream = TargetAudioStream; + MediaStream stream = TargetAudioStream; return stream == null ? null : stream.SampleRate; } } @@ -184,7 +184,7 @@ namespace MediaBrowser.Model.Dlna { get { - var stream = TargetVideoStream; + MediaStream stream = TargetVideoStream; return stream == null || !IsDirectStream ? null : stream.BitDepth; } } @@ -196,7 +196,7 @@ namespace MediaBrowser.Model.Dlna { get { - var stream = TargetVideoStream; + MediaStream stream = TargetVideoStream; return MaxFramerate.HasValue && !IsDirectStream ? MaxFramerate : stream == null ? null : stream.AverageFrameRate ?? stream.RealFrameRate; @@ -210,7 +210,7 @@ namespace MediaBrowser.Model.Dlna { get { - var stream = TargetVideoStream; + MediaStream stream = TargetVideoStream; return VideoLevel.HasValue && !IsDirectStream ? VideoLevel : stream == null ? null : stream.Level; @@ -224,7 +224,7 @@ namespace MediaBrowser.Model.Dlna { get { - var stream = TargetVideoStream; + MediaStream stream = TargetVideoStream; return !IsDirectStream ? null : stream == null ? null : stream.PacketLength; @@ -238,7 +238,7 @@ namespace MediaBrowser.Model.Dlna { get { - var stream = TargetVideoStream; + MediaStream stream = TargetVideoStream; return !string.IsNullOrEmpty(VideoProfile) && !IsDirectStream ? VideoProfile : stream == null ? null : stream.Profile; @@ -252,7 +252,7 @@ namespace MediaBrowser.Model.Dlna { get { - var stream = TargetAudioStream; + MediaStream stream = TargetAudioStream; return AudioBitrate.HasValue && !IsDirectStream ? AudioBitrate : stream == null ? null : stream.BitRate; @@ -266,8 +266,8 @@ namespace MediaBrowser.Model.Dlna { get { - var stream = TargetAudioStream; - var streamChannels = stream == null ? null : stream.Channels; + MediaStream stream = TargetAudioStream; + int? streamChannels = stream == null ? null : stream.Channels; return MaxAudioChannels.HasValue && !IsDirectStream ? (streamChannels.HasValue ? Math.Min(MaxAudioChannels.Value, streamChannels.Value) : MaxAudioChannels.Value) @@ -282,7 +282,7 @@ namespace MediaBrowser.Model.Dlna { get { - var stream = TargetAudioStream; + MediaStream stream = TargetAudioStream; return IsDirectStream ? (stream == null ? null : stream.Codec) @@ -304,10 +304,10 @@ namespace MediaBrowser.Model.Dlna if (RunTimeTicks.HasValue) { - var totalBitrate = TargetTotalBitrate; + int? totalBitrate = TargetTotalBitrate; return totalBitrate.HasValue ? - Convert.ToInt64(totalBitrate * TimeSpan.FromTicks(RunTimeTicks.Value).TotalSeconds) : + Convert.ToInt64(totalBitrate.Value * TimeSpan.FromTicks(RunTimeTicks.Value).TotalSeconds) : (long?)null; } @@ -319,7 +319,7 @@ namespace MediaBrowser.Model.Dlna { get { - var stream = TargetVideoStream; + MediaStream stream = TargetVideoStream; return VideoBitrate.HasValue && !IsDirectStream ? VideoBitrate @@ -331,7 +331,7 @@ namespace MediaBrowser.Model.Dlna { get { - var defaultValue = string.Equals(Container, "m2ts", StringComparison.OrdinalIgnoreCase) + TransportStreamTimestamp defaultValue = string.Equals(Container, "m2ts", StringComparison.OrdinalIgnoreCase) ? TransportStreamTimestamp.Valid : TransportStreamTimestamp.None; @@ -353,17 +353,17 @@ namespace MediaBrowser.Model.Dlna { get { - var videoStream = TargetVideoStream; + MediaStream videoStream = TargetVideoStream; if (videoStream != null && videoStream.Width.HasValue && videoStream.Height.HasValue) { - var size = new ImageSize + ImageSize size = new ImageSize { Width = videoStream.Width.Value, Height = videoStream.Height.Value }; - var newSize = DrawingUtils.Resize(size, + ImageSize newSize = DrawingUtils.Resize(size, null, null, MaxWidth, @@ -380,17 +380,17 @@ namespace MediaBrowser.Model.Dlna { get { - var videoStream = TargetVideoStream; + MediaStream videoStream = TargetVideoStream; if (videoStream != null && videoStream.Width.HasValue && videoStream.Height.HasValue) { - var size = new ImageSize + ImageSize size = new ImageSize { Width = videoStream.Width.Value, Height = videoStream.Height.Value }; - var newSize = DrawingUtils.Resize(size, + ImageSize newSize = DrawingUtils.Resize(size, null, null, MaxWidth, diff --git a/MediaBrowser.Model/Drawing/DrawingUtils.cs b/MediaBrowser.Model/Drawing/DrawingUtils.cs index e95b5e375..ae483b6f6 100644 --- a/MediaBrowser.Model/Drawing/DrawingUtils.cs +++ b/MediaBrowser.Model/Drawing/DrawingUtils.cs @@ -16,7 +16,12 @@ namespace MediaBrowser.Model.Drawing /// ImageSize. public static ImageSize Scale(double currentWidth, double currentHeight, double scaleFactor) { - return Scale(new ImageSize { Width = currentWidth, Height = currentHeight }, scaleFactor); + return Scale(new ImageSize + { + Width = currentWidth, + Height = currentHeight + + }, scaleFactor); } /// @@ -29,7 +34,7 @@ namespace MediaBrowser.Model.Drawing { var newWidth = size.Width * scaleFactor; - return Resize(size.Width, size.Height, newWidth); + return Resize(size.Width, size.Height, newWidth, null, null, null); } /// @@ -42,9 +47,19 @@ namespace MediaBrowser.Model.Drawing /// A max fixed width, if desired /// A max fixed height, if desired /// ImageSize. - public static ImageSize Resize(double currentWidth, double currentHeight, double? width = null, double? height = null, double? maxWidth = null, double? maxHeight = null) + public static ImageSize Resize(double currentWidth, + double currentHeight, + double? width, + double? height, + double? maxWidth, + double? maxHeight) { - return Resize(new ImageSize { Width = currentWidth, Height = currentHeight }, width, height, maxWidth, maxHeight); + return Resize(new ImageSize + { + Width = currentWidth, + Height = currentHeight + + }, width, height, maxWidth, maxHeight); } /// @@ -56,7 +71,11 @@ namespace MediaBrowser.Model.Drawing /// A max fixed width, if desired /// A max fixed height, if desired /// A new size object - public static ImageSize Resize(ImageSize size, double? width = null, double? height = null, double? maxWidth = null, double? maxHeight = null) + public static ImageSize Resize(ImageSize size, + double? width, + double? height, + double? maxWidth, + double? maxHeight) { double newWidth = size.Width; double newHeight = size.Height; @@ -79,13 +98,13 @@ namespace MediaBrowser.Model.Drawing newWidth = width.Value; } - if (maxHeight.HasValue && maxHeight < newHeight) + if (maxHeight.HasValue && maxHeight.Value < newHeight) { newWidth = GetNewWidth(newHeight, newWidth, maxHeight.Value); newHeight = maxHeight.Value; } - if (maxWidth.HasValue && maxWidth < newWidth) + if (maxWidth.HasValue && maxWidth.Value < newWidth) { newHeight = GetNewHeight(newHeight, newWidth, maxWidth.Value); newWidth = maxWidth.Value; @@ -186,7 +205,7 @@ namespace MediaBrowser.Model.Drawing { if (!string.IsNullOrEmpty(value)) { - var parts = value.Split('-'); + string[] parts = value.Split('-'); if (parts.Length == 2) { diff --git a/MediaBrowser.Model/Dto/BaseItemDto.cs b/MediaBrowser.Model/Dto/BaseItemDto.cs index a4bb0646a..f2434afe3 100644 --- a/MediaBrowser.Model/Dto/BaseItemDto.cs +++ b/MediaBrowser.Model/Dto/BaseItemDto.cs @@ -311,7 +311,7 @@ namespace MediaBrowser.Model.Dto /// Gets or sets the parent backdrop image tags. /// /// The parent backdrop image tags. - public List ParentBackdropImageTags { get; set; } + public List ParentBackdropImageTags { get; set; } /// /// Gets or sets the local trailer count. @@ -466,13 +466,13 @@ namespace MediaBrowser.Model.Dto /// Gets or sets the album image tag. /// /// The album image tag. - public Guid? AlbumPrimaryImageTag { get; set; } + public string AlbumPrimaryImageTag { get; set; } /// /// Gets or sets the series primary image tag. /// /// The series primary image tag. - public Guid? SeriesPrimaryImageTag { get; set; } + public string SeriesPrimaryImageTag { get; set; } /// /// Gets or sets the album artist. @@ -529,25 +529,25 @@ namespace MediaBrowser.Model.Dto /// Gets or sets the image tags. /// /// The image tags. - public Dictionary ImageTags { get; set; } + public Dictionary ImageTags { get; set; } /// /// Gets or sets the backdrop image tags. /// /// The backdrop image tags. - public List BackdropImageTags { get; set; } + public List BackdropImageTags { get; set; } /// /// Gets or sets the screenshot image tags. /// /// The screenshot image tags. - public List ScreenshotImageTags { get; set; } + public List ScreenshotImageTags { get; set; } /// /// Gets or sets the parent logo image tag. /// /// The parent logo image tag. - public Guid? ParentLogoImageTag { get; set; } + public string ParentLogoImageTag { get; set; } /// /// If the item does not have a art, this will hold the Id of the Parent that has one. @@ -559,13 +559,13 @@ namespace MediaBrowser.Model.Dto /// Gets or sets the parent art image tag. /// /// The parent art image tag. - public Guid? ParentArtImageTag { get; set; } + public string ParentArtImageTag { get; set; } /// /// Gets or sets the series thumb image tag. /// /// The series thumb image tag. - public Guid? SeriesThumbImageTag { get; set; } + public string SeriesThumbImageTag { get; set; } /// /// Gets or sets the series studio. @@ -583,7 +583,7 @@ namespace MediaBrowser.Model.Dto /// Gets or sets the parent thumb image tag. /// /// The parent thumb image tag. - public Guid? ParentThumbImageTag { get; set; } + public string ParentThumbImageTag { get; set; } /// /// Gets or sets the chapters. diff --git a/MediaBrowser.Model/Dto/BaseItemPerson.cs b/MediaBrowser.Model/Dto/BaseItemPerson.cs index 1cc3f722d..376ba239d 100644 --- a/MediaBrowser.Model/Dto/BaseItemPerson.cs +++ b/MediaBrowser.Model/Dto/BaseItemPerson.cs @@ -33,7 +33,7 @@ namespace MediaBrowser.Model.Dto /// Gets or sets the primary image tag. /// /// The primary image tag. - public Guid? PrimaryImageTag { get; set; } + public string PrimaryImageTag { get; set; } /// /// Gets a value indicating whether this instance has primary image. @@ -44,7 +44,7 @@ namespace MediaBrowser.Model.Dto { get { - return PrimaryImageTag.HasValue; + return PrimaryImageTag != null; } } diff --git a/MediaBrowser.Model/Dto/ChapterInfoDto.cs b/MediaBrowser.Model/Dto/ChapterInfoDto.cs index 5a72110ce..09dd2d582 100644 --- a/MediaBrowser.Model/Dto/ChapterInfoDto.cs +++ b/MediaBrowser.Model/Dto/ChapterInfoDto.cs @@ -27,7 +27,7 @@ namespace MediaBrowser.Model.Dto /// Gets or sets the image tag. /// /// The image tag. - public Guid? ImageTag { get; set; } + public string ImageTag { get; set; } /// /// Gets a value indicating whether this instance has image. @@ -36,7 +36,7 @@ namespace MediaBrowser.Model.Dto [IgnoreDataMember] public bool HasImage { - get { return ImageTag.HasValue; } + get { return ImageTag != null; } } public event PropertyChangedEventHandler PropertyChanged; diff --git a/MediaBrowser.Model/Dto/ImageInfo.cs b/MediaBrowser.Model/Dto/ImageInfo.cs index 0850ee0a4..fa3a38fcb 100644 --- a/MediaBrowser.Model/Dto/ImageInfo.cs +++ b/MediaBrowser.Model/Dto/ImageInfo.cs @@ -23,7 +23,7 @@ namespace MediaBrowser.Model.Dto /// /// The image tag /// - public Guid ImageTag; + public string ImageTag; /// /// Gets or sets the path. diff --git a/MediaBrowser.Model/Dto/ImageOptions.cs b/MediaBrowser.Model/Dto/ImageOptions.cs index 7fe162ff9..08ac7906a 100644 --- a/MediaBrowser.Model/Dto/ImageOptions.cs +++ b/MediaBrowser.Model/Dto/ImageOptions.cs @@ -56,7 +56,7 @@ namespace MediaBrowser.Model.Dto /// If set this will result in strong, unconditional response caching /// /// The hash. - public Guid? Tag { get; set; } + public string Tag { get; set; } /// /// Gets or sets a value indicating whether [crop whitespace]. diff --git a/MediaBrowser.Model/Dto/ItemByNameCounts.cs b/MediaBrowser.Model/Dto/ItemByNameCounts.cs index 31b6d2da0..7c51f07bd 100644 --- a/MediaBrowser.Model/Dto/ItemByNameCounts.cs +++ b/MediaBrowser.Model/Dto/ItemByNameCounts.cs @@ -7,7 +7,7 @@ namespace MediaBrowser.Model.Dto /// public class ItemByNameCounts { - public Guid UserId { get; set; } + public string UserId { get; set; } /// /// Gets or sets the total count. diff --git a/MediaBrowser.Model/Dto/StudioDto.cs b/MediaBrowser.Model/Dto/StudioDto.cs index 696213a40..4f21784fd 100644 --- a/MediaBrowser.Model/Dto/StudioDto.cs +++ b/MediaBrowser.Model/Dto/StudioDto.cs @@ -21,7 +21,7 @@ namespace MediaBrowser.Model.Dto /// Gets or sets the primary image tag. /// /// The primary image tag. - public Guid? PrimaryImageTag { get; set; } + public string PrimaryImageTag { get; set; } /// /// Gets a value indicating whether this instance has primary image. @@ -32,7 +32,7 @@ namespace MediaBrowser.Model.Dto { get { - return PrimaryImageTag.HasValue; + return PrimaryImageTag != null; } } diff --git a/MediaBrowser.Model/Dto/UserDto.cs b/MediaBrowser.Model/Dto/UserDto.cs index efbd64343..c4a43c512 100644 --- a/MediaBrowser.Model/Dto/UserDto.cs +++ b/MediaBrowser.Model/Dto/UserDto.cs @@ -28,7 +28,7 @@ namespace MediaBrowser.Model.Dto /// Gets or sets the primary image tag. /// /// The primary image tag. - public Guid? PrimaryImageTag { get; set; } + public string PrimaryImageTag { get; set; } /// /// Gets or sets a value indicating whether this instance has password. @@ -73,7 +73,7 @@ namespace MediaBrowser.Model.Dto [IgnoreDataMember] public bool HasPrimaryImage { - get { return PrimaryImageTag.HasValue; } + get { return PrimaryImageTag != null; } } /// diff --git a/MediaBrowser.Model/Entities/BaseItemInfo.cs b/MediaBrowser.Model/Entities/BaseItemInfo.cs index c2e6a7631..88af18289 100644 --- a/MediaBrowser.Model/Entities/BaseItemInfo.cs +++ b/MediaBrowser.Model/Entities/BaseItemInfo.cs @@ -46,7 +46,7 @@ namespace MediaBrowser.Model.Entities /// Gets or sets the primary image tag. /// /// The primary image tag. - public Guid? PrimaryImageTag { get; set; } + public string PrimaryImageTag { get; set; } /// /// Gets or sets the primary image item identifier. @@ -58,7 +58,7 @@ namespace MediaBrowser.Model.Entities /// Gets or sets the logo image tag. /// /// The logo image tag. - public Guid? LogoImageTag { get; set; } + public string LogoImageTag { get; set; } /// /// Gets or sets the logo item identifier. @@ -70,7 +70,7 @@ namespace MediaBrowser.Model.Entities /// Gets or sets the thumb image tag. /// /// The thumb image tag. - public Guid? ThumbImageTag { get; set; } + public string ThumbImageTag { get; set; } /// /// Gets or sets the thumb item identifier. @@ -82,7 +82,7 @@ namespace MediaBrowser.Model.Entities /// Gets or sets the thumb image tag. /// /// The thumb image tag. - public Guid? BackdropImageTag { get; set; } + public string BackdropImageTag { get; set; } /// /// Gets or sets the thumb item identifier. @@ -163,7 +163,7 @@ namespace MediaBrowser.Model.Entities [IgnoreDataMember] public bool HasPrimaryImage { - get { return PrimaryImageTag.HasValue; } + get { return PrimaryImageTag != null; } } public BaseItemInfo() diff --git a/MediaBrowser.Model/Entities/DisplayPreferences.cs b/MediaBrowser.Model/Entities/DisplayPreferences.cs index 829affd01..62233ac27 100644 --- a/MediaBrowser.Model/Entities/DisplayPreferences.cs +++ b/MediaBrowser.Model/Entities/DisplayPreferences.cs @@ -36,7 +36,7 @@ namespace MediaBrowser.Model.Entities /// Gets or sets the user id. /// /// The user id. - public Guid Id { get; set; } + public string Id { get; set; } /// /// Gets or sets the type of the view. /// @@ -105,7 +105,7 @@ namespace MediaBrowser.Model.Entities { var newWidth = PrimaryImageWidth / ImageScale; - var size = DrawingUtils.Resize(PrimaryImageWidth, PrimaryImageHeight, newWidth); + var size = DrawingUtils.Resize(PrimaryImageWidth, PrimaryImageHeight, newWidth, null, null, null); PrimaryImageWidth = Convert.ToInt32(size.Width); PrimaryImageHeight = Convert.ToInt32(size.Height); diff --git a/MediaBrowser.Model/Entities/LibraryUpdateInfo.cs b/MediaBrowser.Model/Entities/LibraryUpdateInfo.cs index dca8cd584..4371ddae4 100644 --- a/MediaBrowser.Model/Entities/LibraryUpdateInfo.cs +++ b/MediaBrowser.Model/Entities/LibraryUpdateInfo.cs @@ -12,41 +12,41 @@ namespace MediaBrowser.Model.Entities /// Gets or sets the folders added to. /// /// The folders added to. - public List FoldersAddedTo { get; set; } + public List FoldersAddedTo { get; set; } /// /// Gets or sets the folders removed from. /// /// The folders removed from. - public List FoldersRemovedFrom { get; set; } + public List FoldersRemovedFrom { get; set; } /// /// Gets or sets the items added. /// /// The items added. - public List ItemsAdded { get; set; } + public List ItemsAdded { get; set; } /// /// Gets or sets the items removed. /// /// The items removed. - public List ItemsRemoved { get; set; } + public List ItemsRemoved { get; set; } /// /// Gets or sets the items updated. /// /// The items updated. - public List ItemsUpdated { get; set; } + public List ItemsUpdated { get; set; } /// /// Initializes a new instance of the class. /// public LibraryUpdateInfo() { - FoldersAddedTo = new List(); - FoldersRemovedFrom = new List(); - ItemsAdded = new List(); - ItemsRemoved = new List(); - ItemsUpdated = new List(); + FoldersAddedTo = new List(); + FoldersRemovedFrom = new List(); + ItemsAdded = new List(); + ItemsRemoved = new List(); + ItemsUpdated = new List(); } } } diff --git a/MediaBrowser.Model/Events/GenericEventArgs.cs b/MediaBrowser.Model/Events/GenericEventArgs.cs new file mode 100644 index 000000000..5a83419e1 --- /dev/null +++ b/MediaBrowser.Model/Events/GenericEventArgs.cs @@ -0,0 +1,17 @@ +using System; + +namespace MediaBrowser.Model.Events +{ + /// + /// Provides a generic EventArgs subclass that can hold any kind of object + /// + /// + public class GenericEventArgs : EventArgs + { + /// + /// Gets or sets the argument. + /// + /// The argument. + public T Argument { get; set; } + } +} diff --git a/MediaBrowser.Model/LiveTv/ChannelInfoDto.cs b/MediaBrowser.Model/LiveTv/ChannelInfoDto.cs index fe6faf363..3fec0ee56 100644 --- a/MediaBrowser.Model/LiveTv/ChannelInfoDto.cs +++ b/MediaBrowser.Model/LiveTv/ChannelInfoDto.cs @@ -39,7 +39,7 @@ namespace MediaBrowser.Model.LiveTv /// Gets or sets the image tags. /// /// The image tags. - public Dictionary ImageTags { get; set; } + public Dictionary ImageTags { get; set; } /// /// Gets or sets the number. @@ -113,7 +113,7 @@ namespace MediaBrowser.Model.LiveTv public ChannelInfoDto() { - ImageTags = new Dictionary(); + ImageTags = new Dictionary(); MediaSources = new List(); } diff --git a/MediaBrowser.Model/LiveTv/ProgramInfoDto.cs b/MediaBrowser.Model/LiveTv/ProgramInfoDto.cs index f6b343bdb..4e7ab8224 100644 --- a/MediaBrowser.Model/LiveTv/ProgramInfoDto.cs +++ b/MediaBrowser.Model/LiveTv/ProgramInfoDto.cs @@ -45,7 +45,7 @@ namespace MediaBrowser.Model.LiveTv /// Gets or sets the channel primary image tag. /// /// The channel primary image tag. - public Guid? ChannelPrimaryImageTag { get; set; } + public string ChannelPrimaryImageTag { get; set; } /// /// Gets or sets the play access. @@ -136,7 +136,7 @@ namespace MediaBrowser.Model.LiveTv /// Gets or sets the image tags. /// /// The image tags. - public Dictionary ImageTags { get; set; } + public Dictionary ImageTags { get; set; } /// /// Gets or sets the user data. @@ -211,7 +211,7 @@ namespace MediaBrowser.Model.LiveTv public ProgramInfoDto() { Genres = new List(); - ImageTags = new Dictionary(); + ImageTags = new Dictionary(); } public event PropertyChangedEventHandler PropertyChanged; diff --git a/MediaBrowser.Model/LiveTv/RecordingInfoDto.cs b/MediaBrowser.Model/LiveTv/RecordingInfoDto.cs index de07382c0..3705b7a29 100644 --- a/MediaBrowser.Model/LiveTv/RecordingInfoDto.cs +++ b/MediaBrowser.Model/LiveTv/RecordingInfoDto.cs @@ -50,7 +50,7 @@ namespace MediaBrowser.Model.LiveTv /// Gets or sets the channel primary image tag. /// /// The channel primary image tag. - public Guid? ChannelPrimaryImageTag { get; set; } + public string ChannelPrimaryImageTag { get; set; } /// /// ChannelName of the recording. @@ -224,7 +224,7 @@ namespace MediaBrowser.Model.LiveTv /// Gets or sets the image tags. /// /// The image tags. - public Dictionary ImageTags { get; set; } + public Dictionary ImageTags { get; set; } /// /// Gets or sets the user data. @@ -253,7 +253,7 @@ namespace MediaBrowser.Model.LiveTv public RecordingInfoDto() { Genres = new List(); - ImageTags = new Dictionary(); + ImageTags = new Dictionary(); MediaSources = new List(); } diff --git a/MediaBrowser.Model/LiveTv/SeriesTimerInfoDto.cs b/MediaBrowser.Model/LiveTv/SeriesTimerInfoDto.cs index 393233c1b..7c590307f 100644 --- a/MediaBrowser.Model/LiveTv/SeriesTimerInfoDto.cs +++ b/MediaBrowser.Model/LiveTv/SeriesTimerInfoDto.cs @@ -43,7 +43,7 @@ namespace MediaBrowser.Model.LiveTv /// Gets or sets the image tags. /// /// The image tags. - public Dictionary ImageTags { get; set; } + public Dictionary ImageTags { get; set; } /// /// Gets a value indicating whether this instance has primary image. @@ -57,7 +57,7 @@ namespace MediaBrowser.Model.LiveTv public SeriesTimerInfoDto() { - ImageTags = new Dictionary(); + ImageTags = new Dictionary(); Days = new List(); } } diff --git a/MediaBrowser.Model/MediaBrowser.Model.csproj b/MediaBrowser.Model/MediaBrowser.Model.csproj index aaa29d21c..1f7284422 100644 --- a/MediaBrowser.Model/MediaBrowser.Model.csproj +++ b/MediaBrowser.Model/MediaBrowser.Model.csproj @@ -97,6 +97,7 @@ + diff --git a/MediaBrowser.Model/Search/SearchHint.cs b/MediaBrowser.Model/Search/SearchHint.cs index 002200c0f..4eced7706 100644 --- a/MediaBrowser.Model/Search/SearchHint.cs +++ b/MediaBrowser.Model/Search/SearchHint.cs @@ -47,13 +47,13 @@ namespace MediaBrowser.Model.Search /// Gets or sets the image tag. /// /// The image tag. - public Guid? PrimaryImageTag { get; set; } + public string PrimaryImageTag { get; set; } /// /// Gets or sets the thumb image tag. /// /// The thumb image tag. - public Guid? ThumbImageTag { get; set; } + public string ThumbImageTag { get; set; } /// /// Gets or sets the thumb image item identifier. @@ -65,7 +65,7 @@ namespace MediaBrowser.Model.Search /// Gets or sets the backdrop image tag. /// /// The backdrop image tag. - public Guid? BackdropImageTag { get; set; } + public string BackdropImageTag { get; set; } /// /// Gets or sets the backdrop image item identifier. diff --git a/MediaBrowser.Model/Session/GeneralCommand.cs b/MediaBrowser.Model/Session/GeneralCommand.cs index 071eac954..98b3c50b3 100644 --- a/MediaBrowser.Model/Session/GeneralCommand.cs +++ b/MediaBrowser.Model/Session/GeneralCommand.cs @@ -49,6 +49,7 @@ namespace MediaBrowser.Model.Session SetSubtitleStreamIndex = 24, ToggleFullscreen = 25, DisplayContent = 26, - GoToSearch = 27 + GoToSearch = 27, + DisplayMessage = 28 } } diff --git a/MediaBrowser.Model/Session/SessionInfoDto.cs b/MediaBrowser.Model/Session/SessionInfoDto.cs index cd6ecbbb2..0dc119500 100644 --- a/MediaBrowser.Model/Session/SessionInfoDto.cs +++ b/MediaBrowser.Model/Session/SessionInfoDto.cs @@ -55,7 +55,7 @@ namespace MediaBrowser.Model.Session /// Gets or sets the user primary image tag. /// /// The user primary image tag. - public Guid? UserPrimaryImageTag { get; set; } + public string UserPrimaryImageTag { get; set; } /// /// Gets or sets the name of the user. diff --git a/MediaBrowser.Model/Tasks/TaskInfo.cs b/MediaBrowser.Model/Tasks/TaskInfo.cs index 8e795f22f..83ee0b7e6 100644 --- a/MediaBrowser.Model/Tasks/TaskInfo.cs +++ b/MediaBrowser.Model/Tasks/TaskInfo.cs @@ -30,7 +30,7 @@ namespace MediaBrowser.Model.Tasks /// Gets or sets the id. /// /// The id. - public Guid Id { get; set; } + public string Id { get; set; } /// /// Gets or sets the last execution result. diff --git a/MediaBrowser.Model/Tasks/TaskResult.cs b/MediaBrowser.Model/Tasks/TaskResult.cs index c04d2f2fe..e73b4c9a1 100644 --- a/MediaBrowser.Model/Tasks/TaskResult.cs +++ b/MediaBrowser.Model/Tasks/TaskResult.cs @@ -35,7 +35,7 @@ namespace MediaBrowser.Model.Tasks /// Gets or sets the id. /// /// The id. - public Guid Id { get; set; } + public string Id { get; set; } /// /// Gets or sets the error message. diff --git a/MediaBrowser.Model/Updates/InstallationInfo.cs b/MediaBrowser.Model/Updates/InstallationInfo.cs index 09b4975a8..b904a0e58 100644 --- a/MediaBrowser.Model/Updates/InstallationInfo.cs +++ b/MediaBrowser.Model/Updates/InstallationInfo.cs @@ -11,7 +11,7 @@ namespace MediaBrowser.Model.Updates /// Gets or sets the id. /// /// The id. - public Guid Id { get; set; } + public string Id { get; set; } /// /// Gets or sets the name. diff --git a/MediaBrowser.Model/Updates/PackageVersionInfo.cs b/MediaBrowser.Model/Updates/PackageVersionInfo.cs index 3b0a94019..b3d297e8e 100644 --- a/MediaBrowser.Model/Updates/PackageVersionInfo.cs +++ b/MediaBrowser.Model/Updates/PackageVersionInfo.cs @@ -47,7 +47,7 @@ namespace MediaBrowser.Model.Updates /// The STR. /// The def. /// System.String. - private static string ValueOrDefault(string str, string def = "") + private static string ValueOrDefault(string str, string def) { return string.IsNullOrEmpty(str) ? def : str; } @@ -80,7 +80,7 @@ namespace MediaBrowser.Model.Updates /// Gets or sets the source URL. /// /// The source URL. - public Guid checksum { get; set; } + public string checksum { get; set; } /// /// Gets or sets the target filename. diff --git a/MediaBrowser.Model/Web/QueryStringDictionary.cs b/MediaBrowser.Model/Web/QueryStringDictionary.cs index 905fbb215..6b035fa45 100644 --- a/MediaBrowser.Model/Web/QueryStringDictionary.cs +++ b/MediaBrowser.Model/Web/QueryStringDictionary.cs @@ -122,50 +122,6 @@ namespace MediaBrowser.Model.Web } } - /// - /// Adds the specified name. - /// - /// The name. - /// The value. - /// value - public void Add(string name, Guid value) - { - if (value == Guid.Empty) - { - throw new ArgumentNullException("value"); - } - - Add(name, value.ToString()); - } - - /// - /// Adds if not empty. - /// - /// The name. - /// The value. - public void AddIfNotEmpty(string name, Guid value) - { - if (value != Guid.Empty) - { - Add(name, value); - } - - Add(name, value); - } - - /// - /// Adds if not null. - /// - /// The name. - /// The value. - public void AddIfNotNull(string name, Guid? value) - { - if (value.HasValue) - { - Add(name, value.Value); - } - } - /// /// Adds the specified name. /// diff --git a/MediaBrowser.Providers/MediaInfo/SubtitleDownloader.cs b/MediaBrowser.Providers/MediaInfo/SubtitleDownloader.cs index ba241931c..2f1c9fd53 100644 --- a/MediaBrowser.Providers/MediaInfo/SubtitleDownloader.cs +++ b/MediaBrowser.Providers/MediaInfo/SubtitleDownloader.cs @@ -91,9 +91,18 @@ namespace MediaBrowser.Providers.MediaInfo return false; } + var audioStreams = internalMediaStreams.Where(i => i.Type == MediaStreamType.Audio).ToList(); + var defaultAudioStreams = audioStreams.Where(i => i.IsDefault).ToList(); + + // If none are marked as default, just take a guess + if (defaultAudioStreams.Count == 0) + { + defaultAudioStreams = audioStreams.Take(1).ToList(); + } + // There's already a default audio stream for this language if (skipIfAudioTrackMatches && - internalMediaStreams.Any(i => i.Type == MediaStreamType.Audio && i.IsDefault && string.Equals(i.Language, language, StringComparison.OrdinalIgnoreCase))) + defaultAudioStreams.Any(i => string.Equals(i.Language, language, StringComparison.OrdinalIgnoreCase))) { return false; } diff --git a/MediaBrowser.Providers/Subtitles/OpenSubtitleDownloader.cs b/MediaBrowser.Providers/Subtitles/OpenSubtitleDownloader.cs index 1b53483c4..7b40b5673 100644 --- a/MediaBrowser.Providers/Subtitles/OpenSubtitleDownloader.cs +++ b/MediaBrowser.Providers/Subtitles/OpenSubtitleDownloader.cs @@ -1,11 +1,11 @@ -using MediaBrowser.Common.Events; -using MediaBrowser.Common.Extensions; +using MediaBrowser.Common.Extensions; using MediaBrowser.Common.Net; using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Security; using MediaBrowser.Controller.Subtitles; using MediaBrowser.Model.Configuration; using MediaBrowser.Model.Entities; +using MediaBrowser.Model.Events; using MediaBrowser.Model.Logging; using MediaBrowser.Model.Providers; using OpenSubtitlesHandler; diff --git a/MediaBrowser.Server.Implementations/Configuration/ServerConfigurationManager.cs b/MediaBrowser.Server.Implementations/Configuration/ServerConfigurationManager.cs index ab79c6a1a..59267e856 100644 --- a/MediaBrowser.Server.Implementations/Configuration/ServerConfigurationManager.cs +++ b/MediaBrowser.Server.Implementations/Configuration/ServerConfigurationManager.cs @@ -4,6 +4,7 @@ using MediaBrowser.Common.Implementations.Configuration; using MediaBrowser.Controller; using MediaBrowser.Controller.Configuration; using MediaBrowser.Model.Configuration; +using MediaBrowser.Model.Events; using MediaBrowser.Model.Logging; using MediaBrowser.Model.Serialization; using System; diff --git a/MediaBrowser.Server.Implementations/Drawing/ImageProcessor.cs b/MediaBrowser.Server.Implementations/Drawing/ImageProcessor.cs index c6c1ec050..38f812809 100644 --- a/MediaBrowser.Server.Implementations/Drawing/ImageProcessor.cs +++ b/MediaBrowser.Server.Implementations/Drawing/ImageProcessor.cs @@ -649,7 +649,7 @@ namespace MediaBrowser.Server.Implementations.Drawing /// The image. /// Guid. /// item - public Guid GetImageCacheTag(IHasImages item, ItemImageInfo image) + public string GetImageCacheTag(IHasImages item, ItemImageInfo image) { if (item == null) { @@ -676,7 +676,7 @@ namespace MediaBrowser.Server.Implementations.Drawing /// The image enhancers. /// Guid. /// item - public Guid GetImageCacheTag(IHasImages item, ImageType imageType, string originalImagePath, DateTime dateModified, List imageEnhancers) + public string GetImageCacheTag(IHasImages item, ImageType imageType, string originalImagePath, DateTime dateModified, List imageEnhancers) { if (item == null) { @@ -696,14 +696,14 @@ namespace MediaBrowser.Server.Implementations.Drawing // Optimization if (imageEnhancers.Count == 0) { - return (originalImagePath + dateModified.Ticks).GetMD5(); + return (originalImagePath + dateModified.Ticks).GetMD5().ToString("N"); } // Cache name is created with supported enhancers combined with the last config change so we pick up new config changes var cacheKeys = imageEnhancers.Select(i => i.GetConfigurationCacheKey(item, imageType)).ToList(); cacheKeys.Add(originalImagePath + dateModified.Ticks); - return string.Join("|", cacheKeys.ToArray()).GetMD5(); + return string.Join("|", cacheKeys.ToArray()).GetMD5().ToString("N"); } /// diff --git a/MediaBrowser.Server.Implementations/Dto/DtoService.cs b/MediaBrowser.Server.Implementations/Dto/DtoService.cs index c88cefdb3..8a0d4ca49 100644 --- a/MediaBrowser.Server.Implementations/Dto/DtoService.cs +++ b/MediaBrowser.Server.Implementations/Dto/DtoService.cs @@ -326,7 +326,7 @@ namespace MediaBrowser.Server.Implementations.Dto /// /// The item. /// List{System.String}. - private List GetBackdropImageTags(BaseItem item) + private List GetBackdropImageTags(BaseItem item) { return GetCacheTags(item, ImageType.Backdrop).ToList(); } @@ -336,26 +336,25 @@ namespace MediaBrowser.Server.Implementations.Dto /// /// The item. /// List{Guid}. - private List GetScreenshotImageTags(BaseItem item) + private List GetScreenshotImageTags(BaseItem item) { var hasScreenshots = item as IHasScreenshots; if (hasScreenshots == null) { - return new List(); + return new List(); } return GetCacheTags(item, ImageType.Screenshot).ToList(); } - private IEnumerable GetCacheTags(BaseItem item, ImageType type) + private IEnumerable GetCacheTags(BaseItem item, ImageType type) { return item.GetImages(type) .Select(p => GetImageCacheTag(item, p)) - .Where(i => i.HasValue) - .Select(i => i.Value) + .Where(i => i != null) .ToList(); } - private Guid? GetImageCacheTag(BaseItem item, ImageType type) + private string GetImageCacheTag(BaseItem item, ImageType type) { try { @@ -368,7 +367,7 @@ namespace MediaBrowser.Server.Implementations.Dto } } - private Guid? GetImageCacheTag(BaseItem item, ItemImageInfo image) + private string GetImageCacheTag(BaseItem item, ItemImageInfo image) { try { @@ -677,7 +676,7 @@ namespace MediaBrowser.Server.Implementations.Dto dto.Genres = item.Genres; } - dto.ImageTags = new Dictionary(); + dto.ImageTags = new Dictionary(); // Prevent implicitly captured closure var currentItem = item; @@ -685,9 +684,9 @@ namespace MediaBrowser.Server.Implementations.Dto { var tag = GetImageCacheTag(item, image); - if (tag.HasValue) + if (tag != null) { - dto.ImageTags[image.Type] = tag.Value; + dto.ImageTags[image.Type] = tag; } } @@ -1216,7 +1215,7 @@ namespace MediaBrowser.Server.Implementations.Dto } } - var bitrate = i.TotalBitrate ?? + var bitrate = i.TotalBitrate ?? info.MediaStreams.Where(m => m.Type != MediaStreamType.Subtitle && !string.Equals(m.Codec, "mjpeg", StringComparison.OrdinalIgnoreCase)) .Select(m => m.BitRate ?? 0) .Sum(); diff --git a/MediaBrowser.Server.Implementations/EntryPoints/LibraryChangedNotifier.cs b/MediaBrowser.Server.Implementations/EntryPoints/LibraryChangedNotifier.cs index 59fa78a00..40eeea651 100644 --- a/MediaBrowser.Server.Implementations/EntryPoints/LibraryChangedNotifier.cs +++ b/MediaBrowser.Server.Implementations/EntryPoints/LibraryChangedNotifier.cs @@ -252,15 +252,15 @@ namespace MediaBrowser.Server.Implementations.EntryPoints return new LibraryUpdateInfo { - ItemsAdded = itemsAdded.SelectMany(i => TranslatePhysicalItemToUserLibrary(i, user, collections, allRecursiveChildren)).Select(i => i.Id).Distinct().ToList(), + ItemsAdded = itemsAdded.SelectMany(i => TranslatePhysicalItemToUserLibrary(i, user, collections, allRecursiveChildren)).Select(i => i.Id.ToString("N")).Distinct().ToList(), - ItemsUpdated = itemsUpdated.SelectMany(i => TranslatePhysicalItemToUserLibrary(i, user, collections, allRecursiveChildren)).Select(i => i.Id).Distinct().ToList(), + ItemsUpdated = itemsUpdated.SelectMany(i => TranslatePhysicalItemToUserLibrary(i, user, collections, allRecursiveChildren)).Select(i => i.Id.ToString("N")).Distinct().ToList(), - ItemsRemoved = itemsRemoved.SelectMany(i => TranslatePhysicalItemToUserLibrary(i, user, collections, allRecursiveChildren, true)).Select(i => i.Id).Distinct().ToList(), + ItemsRemoved = itemsRemoved.SelectMany(i => TranslatePhysicalItemToUserLibrary(i, user, collections, allRecursiveChildren, true)).Select(i => i.Id.ToString("N")).Distinct().ToList(), - FoldersAddedTo = foldersAddedTo.SelectMany(i => TranslatePhysicalItemToUserLibrary(i, user, collections, allRecursiveChildren)).Select(i => i.Id).Distinct().ToList(), + FoldersAddedTo = foldersAddedTo.SelectMany(i => TranslatePhysicalItemToUserLibrary(i, user, collections, allRecursiveChildren)).Select(i => i.Id.ToString("N")).Distinct().ToList(), - FoldersRemovedFrom = foldersRemovedFrom.SelectMany(i => TranslatePhysicalItemToUserLibrary(i, user, collections, allRecursiveChildren)).Select(i => i.Id).Distinct().ToList() + FoldersRemovedFrom = foldersRemovedFrom.SelectMany(i => TranslatePhysicalItemToUserLibrary(i, user, collections, allRecursiveChildren)).Select(i => i.Id.ToString("N")).Distinct().ToList() }; } diff --git a/MediaBrowser.Server.Implementations/EntryPoints/Notifications/Notifier.cs b/MediaBrowser.Server.Implementations/EntryPoints/Notifications/Notifier.cs index 0081c6243..9d2de0f6d 100644 --- a/MediaBrowser.Server.Implementations/EntryPoints/Notifications/Notifier.cs +++ b/MediaBrowser.Server.Implementations/EntryPoints/Notifications/Notifier.cs @@ -11,6 +11,7 @@ using MediaBrowser.Controller.Plugins; using MediaBrowser.Controller.Session; using MediaBrowser.Model.Configuration; using MediaBrowser.Model.Entities; +using MediaBrowser.Model.Events; using MediaBrowser.Model.Logging; using MediaBrowser.Model.Notifications; using MediaBrowser.Model.Tasks; diff --git a/MediaBrowser.Server.Implementations/EntryPoints/ServerEventNotifier.cs b/MediaBrowser.Server.Implementations/EntryPoints/ServerEventNotifier.cs index 0925ca86c..773ee24a9 100644 --- a/MediaBrowser.Server.Implementations/EntryPoints/ServerEventNotifier.cs +++ b/MediaBrowser.Server.Implementations/EntryPoints/ServerEventNotifier.cs @@ -9,6 +9,7 @@ using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Plugins; using MediaBrowser.Controller.Session; +using MediaBrowser.Model.Events; using MediaBrowser.Model.Tasks; using System; using System.Threading; diff --git a/MediaBrowser.Server.Implementations/Library/UserManager.cs b/MediaBrowser.Server.Implementations/Library/UserManager.cs index 2ee843f09..23303c41f 100644 --- a/MediaBrowser.Server.Implementations/Library/UserManager.cs +++ b/MediaBrowser.Server.Implementations/Library/UserManager.cs @@ -5,6 +5,7 @@ using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Persistence; using MediaBrowser.Controller.Providers; +using MediaBrowser.Model.Events; using MediaBrowser.Model.Logging; using System; using System.Collections.Generic; diff --git a/MediaBrowser.Server.Implementations/LiveTv/LiveTvDtoService.cs b/MediaBrowser.Server.Implementations/LiveTv/LiveTvDtoService.cs index cf7358cce..7bf484689 100644 --- a/MediaBrowser.Server.Implementations/LiveTv/LiveTvDtoService.cs +++ b/MediaBrowser.Server.Implementations/LiveTv/LiveTvDtoService.cs @@ -241,9 +241,9 @@ namespace MediaBrowser.Server.Implementations.LiveTv var imageTag = GetImageTag(recording); - if (imageTag.HasValue) + if (imageTag != null) { - dto.ImageTags[ImageType.Primary] = imageTag.Value; + dto.ImageTags[ImageType.Primary] = imageTag; } if (user != null) @@ -328,9 +328,9 @@ namespace MediaBrowser.Server.Implementations.LiveTv var imageTag = GetImageTag(info); - if (imageTag.HasValue) + if (imageTag != null) { - dto.ImageTags[ImageType.Primary] = imageTag.Value; + dto.ImageTags[ImageType.Primary] = imageTag; } if (currentProgram != null) @@ -389,9 +389,9 @@ namespace MediaBrowser.Server.Implementations.LiveTv var imageTag = GetImageTag(item); - if (imageTag.HasValue) + if (imageTag != null) { - dto.ImageTags[ImageType.Primary] = imageTag.Value; + dto.ImageTags[ImageType.Primary] = imageTag; } if (user != null) @@ -404,7 +404,7 @@ namespace MediaBrowser.Server.Implementations.LiveTv return dto; } - private Guid? GetImageTag(IHasImages info) + private string GetImageTag(IHasImages info) { try { diff --git a/MediaBrowser.Server.Implementations/Persistence/SqliteDisplayPreferencesRepository.cs b/MediaBrowser.Server.Implementations/Persistence/SqliteDisplayPreferencesRepository.cs index 9f6ec0f24..0b4d78de3 100644 --- a/MediaBrowser.Server.Implementations/Persistence/SqliteDisplayPreferencesRepository.cs +++ b/MediaBrowser.Server.Implementations/Persistence/SqliteDisplayPreferencesRepository.cs @@ -111,7 +111,7 @@ namespace MediaBrowser.Server.Implementations.Persistence { throw new ArgumentNullException("displayPreferences"); } - if (displayPreferences.Id == Guid.Empty) + if (string.IsNullOrWhiteSpace(displayPreferences.Id)) { throw new ArgumentNullException("displayPreferences.Id"); } @@ -132,7 +132,7 @@ namespace MediaBrowser.Server.Implementations.Persistence { cmd.CommandText = "replace into userdisplaypreferences (id, userid, client, data) values (@1, @2, @3, @4)"; - cmd.Parameters.Add(cmd, "@1", DbType.Guid).Value = displayPreferences.Id; + cmd.Parameters.Add(cmd, "@1", DbType.Guid).Value = new Guid(displayPreferences.Id); cmd.Parameters.Add(cmd, "@2", DbType.Guid).Value = userId; cmd.Parameters.Add(cmd, "@3", DbType.String).Value = client; cmd.Parameters.Add(cmd, "@4", DbType.Binary).Value = serialized; @@ -183,9 +183,9 @@ namespace MediaBrowser.Server.Implementations.Persistence /// The client. /// Task{DisplayPreferences}. /// item - public DisplayPreferences GetDisplayPreferences(Guid displayPreferencesId, Guid userId, string client) + public DisplayPreferences GetDisplayPreferences(string displayPreferencesId, Guid userId, string client) { - if (displayPreferencesId == Guid.Empty) + if (string.IsNullOrWhiteSpace(displayPreferencesId)) { throw new ArgumentNullException("displayPreferencesId"); } @@ -193,7 +193,7 @@ namespace MediaBrowser.Server.Implementations.Persistence var cmd = _connection.CreateCommand(); cmd.CommandText = "select data from userdisplaypreferences where id = @id and userId=@userId and client=@client"; - cmd.Parameters.Add(cmd, "@id", DbType.Guid).Value = displayPreferencesId; + cmd.Parameters.Add(cmd, "@id", DbType.Guid).Value = new Guid(displayPreferencesId); cmd.Parameters.Add(cmd, "@userId", DbType.Guid).Value = userId; cmd.Parameters.Add(cmd, "@client", DbType.String).Value = client; @@ -208,7 +208,7 @@ namespace MediaBrowser.Server.Implementations.Persistence } } - return new DisplayPreferences { Id = displayPreferencesId }; + return null; } /// diff --git a/MediaBrowser.Server.Implementations/Roku/RokuSessionController.cs b/MediaBrowser.Server.Implementations/Roku/RokuSessionController.cs index cdaf03fbe..ad9db947a 100644 --- a/MediaBrowser.Server.Implementations/Roku/RokuSessionController.cs +++ b/MediaBrowser.Server.Implementations/Roku/RokuSessionController.cs @@ -56,16 +56,6 @@ namespace MediaBrowser.Server.Implementations.Roku return Task.FromResult(true); } - public Task SendMessageCommand(MessageCommand command, CancellationToken cancellationToken) - { - return SendCommand(new WebSocketMessage - { - MessageType = "MessageCommand", - Data = command - - }, cancellationToken); - } - public Task SendPlayCommand(PlayRequest command, CancellationToken cancellationToken) { return SendCommand(new WebSocketMessage diff --git a/MediaBrowser.Server.Implementations/Session/SessionManager.cs b/MediaBrowser.Server.Implementations/Session/SessionManager.cs index b187c8d6b..ea709cd24 100644 --- a/MediaBrowser.Server.Implementations/Session/SessionManager.cs +++ b/MediaBrowser.Server.Implementations/Session/SessionManager.cs @@ -1,4 +1,5 @@ -using MediaBrowser.Common.Events; +using System.Globalization; +using MediaBrowser.Common.Events; using MediaBrowser.Common.Extensions; using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Drawing; @@ -712,12 +713,20 @@ namespace MediaBrowser.Server.Implementations.Session public Task SendMessageCommand(string controllingSessionId, string sessionId, MessageCommand command, CancellationToken cancellationToken) { - var session = GetSessionForRemoteControl(sessionId); + var generalCommand = new GeneralCommand + { + Name = GeneralCommandType.DisplayMessage.ToString() + }; - var controllingSession = GetSession(controllingSessionId); - AssertCanControl(session, controllingSession); + generalCommand.Arguments["Header"] = command.Header; + generalCommand.Arguments["Text"] = command.Text; - return session.SessionController.SendMessageCommand(command, cancellationToken); + if (command.TimeoutMs.HasValue) + { + generalCommand.Arguments["TimeoutMs"] = command.TimeoutMs.Value.ToString(CultureInfo.InvariantCulture); + } + + return SendGeneralCommand(controllingSessionId, sessionId, generalCommand, cancellationToken); } public Task SendGeneralCommand(string controllingSessionId, string sessionId, GeneralCommand command, CancellationToken cancellationToken) @@ -1199,7 +1208,7 @@ namespace MediaBrowser.Server.Implementations.Session }; info.PrimaryImageTag = GetImageCacheTag(item, ImageType.Primary); - if (info.PrimaryImageTag.HasValue) + if (info.PrimaryImageTag != null) { info.PrimaryImageItemId = GetDtoId(item); } @@ -1237,14 +1246,14 @@ namespace MediaBrowser.Server.Implementations.Session info.Album = audio.Album; info.Artists = audio.Artists; - if (!info.PrimaryImageTag.HasValue) + if (info.PrimaryImageTag == null) { var album = audio.Parents.OfType().FirstOrDefault(); if (album != null && album.HasImage(ImageType.Primary)) { info.PrimaryImageTag = GetImageCacheTag(album, ImageType.Primary); - if (info.PrimaryImageTag.HasValue) + if (info.PrimaryImageTag != null) { info.PrimaryImageItemId = GetDtoId(album); } @@ -1345,7 +1354,7 @@ namespace MediaBrowser.Server.Implementations.Session return info; } - private Guid? GetImageCacheTag(BaseItem item, ImageType type) + private string GetImageCacheTag(BaseItem item, ImageType type) { try { diff --git a/MediaBrowser.Server.Implementations/Session/WebSocketController.cs b/MediaBrowser.Server.Implementations/Session/WebSocketController.cs index 4b0c25a87..3b6ecd21e 100644 --- a/MediaBrowser.Server.Implementations/Session/WebSocketController.cs +++ b/MediaBrowser.Server.Implementations/Session/WebSocketController.cs @@ -57,18 +57,6 @@ namespace MediaBrowser.Server.Implementations.Session return socket; } - public Task SendMessageCommand(MessageCommand command, CancellationToken cancellationToken) - { - var socket = GetActiveSocket(); - - return socket.SendAsync(new WebSocketMessage - { - MessageType = "MessageCommand", - Data = command - - }, cancellationToken); - } - public Task SendPlayCommand(PlayRequest command, CancellationToken cancellationToken) { var socket = GetActiveSocket(); -- cgit v1.2.3 From a938d0854d08e18a8e21fc8ab8b481e26c6f3479 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Thu, 8 May 2014 21:49:12 -0400 Subject: updated nuget --- MediaBrowser.Model/ApiClient/IApiClient.cs | 8 ++++---- MediaBrowser.Model/ApiClient/IServerEvents.cs | 8 ++------ .../EntryPoints/ServerEventNotifier.cs | 16 ++++++---------- .../MediaBrowser.WebDashboard.csproj | 3 --- Nuget/MediaBrowser.Common.Internal.nuspec | 6 +++--- Nuget/MediaBrowser.Common.nuspec | 2 +- Nuget/MediaBrowser.Server.Core.nuspec | 4 ++-- 7 files changed, 18 insertions(+), 29 deletions(-) (limited to 'MediaBrowser.Model/ApiClient/IApiClient.cs') diff --git a/MediaBrowser.Model/ApiClient/IApiClient.cs b/MediaBrowser.Model/ApiClient/IApiClient.cs index bfc631c79..f4620acf7 100644 --- a/MediaBrowser.Model/ApiClient/IApiClient.cs +++ b/MediaBrowser.Model/ApiClient/IApiClient.cs @@ -601,17 +601,17 @@ namespace MediaBrowser.Model.ApiClient /// Sets the index of the audio stream. /// /// The session identifier. - /// The volume. + /// The index. /// Task. - Task SetAudioStreamIndex(string sessionId, int? volume); + Task SetAudioStreamIndex(string sessionId, int index); /// /// Sets the index of the subtitle stream. /// /// The session identifier. - /// The volume. + /// The index. /// Task. - Task SetSubtitleStreamIndex(string sessionId, int? volume); + Task SetSubtitleStreamIndex(string sessionId, int? index); /// /// Instructs the client to display a message to the user diff --git a/MediaBrowser.Model/ApiClient/IServerEvents.cs b/MediaBrowser.Model/ApiClient/IServerEvents.cs index 8e46f3d9f..62d8fdff3 100644 --- a/MediaBrowser.Model/ApiClient/IServerEvents.cs +++ b/MediaBrowser.Model/ApiClient/IServerEvents.cs @@ -19,10 +19,6 @@ namespace MediaBrowser.Model.ApiClient /// event EventHandler> UserDeleted; /// - /// Occurs when [scheduled task started]. - /// - event EventHandler> ScheduledTaskStarted; - /// /// Occurs when [scheduled task ended]. /// event EventHandler> ScheduledTaskEnded; @@ -97,7 +93,7 @@ namespace MediaBrowser.Model.ApiClient /// /// Occurs when [send text command]. /// - event EventHandler> SendTextCommand; + event EventHandler> SendStringCommand; /// /// Occurs when [set volume command]. /// @@ -109,7 +105,7 @@ namespace MediaBrowser.Model.ApiClient /// /// Occurs when [set video stream index command]. /// - event EventHandler> SetVideoStreamIndexCommand; + event EventHandler> SetSubtitleStreamIndexCommand; /// /// Occurs when [sessions updated]. /// diff --git a/MediaBrowser.Server.Implementations/EntryPoints/ServerEventNotifier.cs b/MediaBrowser.Server.Implementations/EntryPoints/ServerEventNotifier.cs index 773ee24a9..54cd21cdf 100644 --- a/MediaBrowser.Server.Implementations/EntryPoints/ServerEventNotifier.cs +++ b/MediaBrowser.Server.Implementations/EntryPoints/ServerEventNotifier.cs @@ -1,5 +1,4 @@ -using MediaBrowser.Common.Events; -using MediaBrowser.Common.Net; +using MediaBrowser.Common.Net; using MediaBrowser.Common.Plugins; using MediaBrowser.Common.ScheduledTasks; using MediaBrowser.Common.Updates; @@ -54,8 +53,12 @@ namespace MediaBrowser.Server.Implementations.EntryPoints /// Initializes a new instance of the class. /// /// The server manager. - /// The logger. + /// The application host. /// The user manager. + /// The installation manager. + /// The task manager. + /// The dto service. + /// The session manager. public ServerEventNotifier(IServerManager serverManager, IServerApplicationHost appHost, IUserManager userManager, IInstallationManager installationManager, ITaskManager taskManager, IDtoService dtoService, ISessionManager sessionManager) { _serverManager = serverManager; @@ -80,7 +83,6 @@ namespace MediaBrowser.Server.Implementations.EntryPoints _installationManager.PackageInstallationCompleted += _installationManager_PackageInstallationCompleted; _installationManager.PackageInstallationFailed += _installationManager_PackageInstallationFailed; - _taskManager.TaskExecuting += _taskManager_TaskExecuting; _taskManager.TaskCompleted += _taskManager_TaskCompleted; } @@ -109,12 +111,6 @@ namespace MediaBrowser.Server.Implementations.EntryPoints _serverManager.SendWebSocketMessage("ScheduledTaskEnded", e.Argument); } - void _taskManager_TaskExecuting(object sender, EventArgs e) - { - var task = (IScheduledTask)sender; - _serverManager.SendWebSocketMessage("ScheduledTaskStarted", task.Name); - } - /// /// Installations the manager_ plugin uninstalled. /// diff --git a/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj b/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj index 7f9d6919e..ac9d700fa 100644 --- a/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj +++ b/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj @@ -2069,9 +2069,6 @@ PreserveNewest - - Designer - diff --git a/Nuget/MediaBrowser.Common.Internal.nuspec b/Nuget/MediaBrowser.Common.Internal.nuspec index bf60bf700..8890d754f 100644 --- a/Nuget/MediaBrowser.Common.Internal.nuspec +++ b/Nuget/MediaBrowser.Common.Internal.nuspec @@ -2,7 +2,7 @@ MediaBrowser.Common.Internal - 3.0.362 + 3.0.365 MediaBrowser.Common.Internal Luke ebr,Luke,scottisafool @@ -12,9 +12,9 @@ Contains common components shared by Media Browser Theater and Media Browser Server. Not intended for plugin developer consumption. Copyright © Media Browser 2013 - + - + diff --git a/Nuget/MediaBrowser.Common.nuspec b/Nuget/MediaBrowser.Common.nuspec index 3065ba17d..4a3bac116 100644 --- a/Nuget/MediaBrowser.Common.nuspec +++ b/Nuget/MediaBrowser.Common.nuspec @@ -2,7 +2,7 @@ MediaBrowser.Common - 3.0.362 + 3.0.365 MediaBrowser.Common Media Browser Team ebr,Luke,scottisafool diff --git a/Nuget/MediaBrowser.Server.Core.nuspec b/Nuget/MediaBrowser.Server.Core.nuspec index 140d02ece..6d35ea755 100644 --- a/Nuget/MediaBrowser.Server.Core.nuspec +++ b/Nuget/MediaBrowser.Server.Core.nuspec @@ -2,7 +2,7 @@ MediaBrowser.Server.Core - 3.0.362 + 3.0.365 Media Browser.Server.Core Media Browser Team ebr,Luke,scottisafool @@ -12,7 +12,7 @@ Contains core components required to build plugins for Media Browser Server. Copyright © Media Browser 2013 - + -- cgit v1.2.3 From 8619b5ab380666bcdd5d648820dde48b65128af9 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Fri, 9 May 2014 15:43:06 -0400 Subject: update translations --- .../ScheduledTasks/ScheduledTaskService.cs | 18 +- .../ScheduledTasks/ScheduledTaskWorker.cs | 16 +- .../Updates/InstallationManager.cs | 4 +- MediaBrowser.Common/Plugins/BasePlugin.cs | 2 - .../ScheduledTasks/IScheduledTaskWorker.cs | 2 +- .../ScheduledTasks/ScheduledTaskHelpers.cs | 2 +- .../MediaEncoding/MediaEncoderHelpers.cs | 4 +- MediaBrowser.Model/ApiClient/IApiClient.cs | 24 - MediaBrowser.Model/Dlna/ContentFeatureBuilder.cs | 12 +- MediaBrowser.Model/Dlna/DeviceProfile.cs | 126 ++-- MediaBrowser.Model/Dlna/StreamBuilder.cs | 188 ++++-- .../Plugins/BasePluginConfiguration.cs | 24 +- MediaBrowser.Model/Plugins/PluginInfo.cs | 20 - MediaBrowser.Providers/Xbmc/XbmcImageSaver.cs | 2 +- .../Localization/JavaScript/da.json | 30 + .../Localization/JavaScript/ru.json | 2 +- .../Localization/LocalizationManager.cs | 1 + .../Localization/Server/ar.json | 13 +- .../Localization/Server/ca.json | 13 +- .../Localization/Server/cs.json | 13 +- .../Localization/Server/da.json | 715 +++++++++++++++++++++ .../Localization/Server/de.json | 13 +- .../Localization/Server/el.json | 13 +- .../Localization/Server/en_GB.json | 13 +- .../Localization/Server/en_US.json | 13 +- .../Localization/Server/es.json | 175 ++--- .../Localization/Server/es_MX.json | 31 +- .../Localization/Server/fr.json | 145 +++-- .../Localization/Server/he.json | 11 +- .../Localization/Server/it.json | 11 +- .../Localization/Server/kk.json | 11 +- .../Localization/Server/ms.json | 13 +- .../Localization/Server/nb.json | 13 +- .../Localization/Server/nl.json | 29 +- .../Localization/Server/pt_BR.json | 29 +- .../Localization/Server/pt_PT.json | 67 +- .../Localization/Server/ru.json | 11 +- .../Localization/Server/server.json | 31 +- .../Localization/Server/sv.json | 81 +-- .../Localization/Server/zh_TW.json | 13 +- .../SqliteDisplayPreferencesRepository.cs | 3 +- 41 files changed, 1424 insertions(+), 533 deletions(-) create mode 100644 MediaBrowser.Server.Implementations/Localization/JavaScript/da.json create mode 100644 MediaBrowser.Server.Implementations/Localization/Server/da.json (limited to 'MediaBrowser.Model/ApiClient/IApiClient.cs') diff --git a/MediaBrowser.Api/ScheduledTasks/ScheduledTaskService.cs b/MediaBrowser.Api/ScheduledTasks/ScheduledTaskService.cs index 80080fbb3..aaf14ce71 100644 --- a/MediaBrowser.Api/ScheduledTasks/ScheduledTaskService.cs +++ b/MediaBrowser.Api/ScheduledTasks/ScheduledTaskService.cs @@ -20,7 +20,7 @@ namespace MediaBrowser.Api.ScheduledTasks /// /// The id. [ApiMember(Name = "Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "GET")] - public Guid Id { get; set; } + public string Id { get; set; } } /// @@ -44,7 +44,7 @@ namespace MediaBrowser.Api.ScheduledTasks /// /// The id. [ApiMember(Name = "Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "POST")] - public Guid Id { get; set; } + public string Id { get; set; } } /// @@ -58,7 +58,7 @@ namespace MediaBrowser.Api.ScheduledTasks /// /// The id. [ApiMember(Name = "Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "DELETE")] - public Guid Id { get; set; } + public string Id { get; set; } } /// @@ -72,7 +72,7 @@ namespace MediaBrowser.Api.ScheduledTasks /// /// The task id. [ApiMember(Name = "Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "POST")] - public Guid Id { get; set; } + public string Id { get; set; } } /// @@ -145,7 +145,7 @@ namespace MediaBrowser.Api.ScheduledTasks /// Task not found public object Get(GetScheduledTask request) { - var task = TaskManager.ScheduledTasks.FirstOrDefault(i => i.Id == request.Id); + var task = TaskManager.ScheduledTasks.FirstOrDefault(i => string.Equals(i.Id, request.Id)); if (task == null) { @@ -164,7 +164,7 @@ namespace MediaBrowser.Api.ScheduledTasks /// Task not found public void Post(StartScheduledTask request) { - var task = TaskManager.ScheduledTasks.FirstOrDefault(i => i.Id == request.Id); + var task = TaskManager.ScheduledTasks.FirstOrDefault(i => string.Equals(i.Id, request.Id)); if (task == null) { @@ -181,7 +181,7 @@ namespace MediaBrowser.Api.ScheduledTasks /// Task not found public void Delete(StopScheduledTask request) { - var task = TaskManager.ScheduledTasks.FirstOrDefault(i => i.Id == request.Id); + var task = TaskManager.ScheduledTasks.FirstOrDefault(i => string.Equals(i.Id, request.Id)); if (task == null) { @@ -201,9 +201,9 @@ namespace MediaBrowser.Api.ScheduledTasks // 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 var pathInfo = PathInfo.Parse(Request.PathInfo); - var id = new Guid(pathInfo.GetArgumentValue(1)); + var id = pathInfo.GetArgumentValue(1); - var task = TaskManager.ScheduledTasks.FirstOrDefault(i => i.Id == id); + var task = TaskManager.ScheduledTasks.FirstOrDefault(i => string.Equals(i.Id, id)); if (task == null) { diff --git a/MediaBrowser.Common.Implementations/ScheduledTasks/ScheduledTaskWorker.cs b/MediaBrowser.Common.Implementations/ScheduledTasks/ScheduledTaskWorker.cs index 1e97de0c5..d7d0cb886 100644 --- a/MediaBrowser.Common.Implementations/ScheduledTasks/ScheduledTaskWorker.cs +++ b/MediaBrowser.Common.Implementations/ScheduledTasks/ScheduledTaskWorker.cs @@ -269,22 +269,22 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks /// /// The _id /// - private Guid? _id; + private string _id; /// /// Gets the unique id. /// /// The unique id. - public Guid Id + public string Id { get { - if (!_id.HasValue) + if (_id == null) { - _id = ScheduledTask.GetType().FullName.GetMD5(); + _id = ScheduledTask.GetType().FullName.GetMD5().ToString("N"); } - return _id.Value; + return _id; } } @@ -464,7 +464,7 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks /// The history file path. private string GetHistoryFilePath() { - return Path.Combine(GetScheduledTasksDataDirectory(), Id + ".js"); + return Path.Combine(GetScheduledTasksDataDirectory(), new Guid(Id) + ".js"); } /// @@ -473,7 +473,7 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks /// System.String. private string GetConfigurationFilePath() { - return Path.Combine(GetScheduledTasksConfigurationDirectory(), Id + ".js"); + return Path.Combine(GetScheduledTasksConfigurationDirectory(), new Guid(Id) + ".js"); } /// @@ -531,7 +531,7 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks EndTimeUtc = endTime, Status = status, Name = Name, - Id = Id.ToString("N") + Id = Id }; if (ex != null) diff --git a/MediaBrowser.Common.Implementations/Updates/InstallationManager.cs b/MediaBrowser.Common.Implementations/Updates/InstallationManager.cs index 92e5f894f..fe484840a 100644 --- a/MediaBrowser.Common.Implementations/Updates/InstallationManager.cs +++ b/MediaBrowser.Common.Implementations/Updates/InstallationManager.cs @@ -329,14 +329,14 @@ namespace MediaBrowser.Common.Implementations.Updates if (withAutoUpdateEnabled) { plugins = plugins - .Where(p => p.Configuration.EnableAutoUpdate) + .Where(p => _config.CommonConfiguration.EnableAutoUpdate) .ToList(); } // Figure out what needs to be installed var packages = plugins.Select(p => { - var latestPluginInfo = GetLatestCompatibleVersion(catalog, p.Name, p.Id.ToString(), applicationVersion, p.Configuration.UpdateClass); + var latestPluginInfo = GetLatestCompatibleVersion(catalog, p.Name, p.Id.ToString(), applicationVersion, _config.CommonConfiguration.SystemUpdateLevel); return latestPluginInfo != null && latestPluginInfo.version != null && latestPluginInfo.version > p.Version ? latestPluginInfo : null; diff --git a/MediaBrowser.Common/Plugins/BasePlugin.cs b/MediaBrowser.Common/Plugins/BasePlugin.cs index aa1369c4e..6bbd69f04 100644 --- a/MediaBrowser.Common/Plugins/BasePlugin.cs +++ b/MediaBrowser.Common/Plugins/BasePlugin.cs @@ -305,8 +305,6 @@ namespace MediaBrowser.Common.Plugins ConfigurationDateLastModified = ConfigurationDateLastModified, Description = Description, Id = Id.ToString("N"), - EnableAutoUpdate = Configuration.EnableAutoUpdate, - UpdateClass = Configuration.UpdateClass, ConfigurationFileName = ConfigurationFileName }; diff --git a/MediaBrowser.Common/ScheduledTasks/IScheduledTaskWorker.cs b/MediaBrowser.Common/ScheduledTasks/IScheduledTaskWorker.cs index 2fa76472d..d0d363df7 100644 --- a/MediaBrowser.Common/ScheduledTasks/IScheduledTaskWorker.cs +++ b/MediaBrowser.Common/ScheduledTasks/IScheduledTaskWorker.cs @@ -62,6 +62,6 @@ namespace MediaBrowser.Common.ScheduledTasks /// Gets the unique id. /// /// The unique id. - Guid Id { get; } + string Id { get; } } } \ No newline at end of file diff --git a/MediaBrowser.Common/ScheduledTasks/ScheduledTaskHelpers.cs b/MediaBrowser.Common/ScheduledTasks/ScheduledTaskHelpers.cs index 92c44dea1..4364153c9 100644 --- a/MediaBrowser.Common/ScheduledTasks/ScheduledTaskHelpers.cs +++ b/MediaBrowser.Common/ScheduledTasks/ScheduledTaskHelpers.cs @@ -38,7 +38,7 @@ namespace MediaBrowser.Common.ScheduledTasks Name = task.Name, CurrentProgressPercentage = task.CurrentProgress, State = task.State, - Id = task.Id.ToString("N"), + Id = task.Id, LastExecutionResult = task.LastExecutionResult, Triggers = task.Triggers.Select(GetTriggerInfo).ToList(), Description = task.Description, diff --git a/MediaBrowser.Controller/MediaEncoding/MediaEncoderHelpers.cs b/MediaBrowser.Controller/MediaEncoding/MediaEncoderHelpers.cs index 521bf7a81..6a37626b7 100644 --- a/MediaBrowser.Controller/MediaEncoding/MediaEncoderHelpers.cs +++ b/MediaBrowser.Controller/MediaEncoding/MediaEncoderHelpers.cs @@ -187,7 +187,9 @@ namespace MediaBrowser.Controller.MediaEncoding } else if (string.Equals(streamInfo.codec_type, "video", StringComparison.OrdinalIgnoreCase)) { - stream.Type = MediaStreamType.Video; + stream.Type = (streamInfo.codec_name ?? string.Empty).IndexOf("mjpeg", StringComparison.OrdinalIgnoreCase) != -1 + ? MediaStreamType.EmbeddedImage + : MediaStreamType.Video; stream.Width = streamInfo.width; stream.Height = streamInfo.height; diff --git a/MediaBrowser.Model/ApiClient/IApiClient.cs b/MediaBrowser.Model/ApiClient/IApiClient.cs index f4620acf7..e12a6cf2b 100644 --- a/MediaBrowser.Model/ApiClient/IApiClient.cs +++ b/MediaBrowser.Model/ApiClient/IApiClient.cs @@ -924,30 +924,6 @@ namespace MediaBrowser.Model.ApiClient /// System.String. string GetThumbImageUrl(BaseItemDto item, ImageOptions options); - /// - /// Gets the url needed to stream an audio file - /// - /// The options. - /// System.String. - /// options - string GetAudioStreamUrl(StreamOptions options); - - /// - /// Gets the url needed to stream a video file - /// - /// The options. - /// System.String. - /// options - string GetVideoStreamUrl(VideoStreamOptions options); - - /// - /// Formulates a url for streaming video using the HLS protocol - /// - /// The options. - /// System.String. - /// options - string GetHlsVideoStreamUrl(VideoStreamOptions options); - /// /// Gets the live tv information asynchronous. /// diff --git a/MediaBrowser.Model/Dlna/ContentFeatureBuilder.cs b/MediaBrowser.Model/Dlna/ContentFeatureBuilder.cs index a7ad49cba..c97c06d34 100644 --- a/MediaBrowser.Model/Dlna/ContentFeatureBuilder.cs +++ b/MediaBrowser.Model/Dlna/ContentFeatureBuilder.cs @@ -26,7 +26,7 @@ namespace MediaBrowser.Model.Dlna DlnaFlags.DlnaV15; string dlnaflags = string.Format(";DLNA.ORG_FLAGS={0}", - FlagsToString(flagValue)); + DlnaMaps.FlagsToString(flagValue)); ResponseProfile mediaProfile = _profile.GetImageMediaProfile(container, width, @@ -73,7 +73,7 @@ namespace MediaBrowser.Model.Dlna } string dlnaflags = string.Format(";DLNA.ORG_FLAGS={0}", - FlagsToString(flagValue)); + DlnaMaps.FlagsToString(flagValue)); ResponseProfile mediaProfile = _profile.GetAudioMediaProfile(container, audioCodec, @@ -92,12 +92,6 @@ namespace MediaBrowser.Model.Dlna return (contentFeatures + orgOp + orgCi + dlnaflags).Trim(';'); } - private static string FlagsToString(DlnaFlags flags) - { - //return Enum.Format(typeof(DlnaFlags), flags, "x"); - return string.Format("{0:X8}{1:D24}", (ulong)flags, 0); - } - public string BuildVideoHeader(string container, string videoCodec, string audioCodec, @@ -136,7 +130,7 @@ namespace MediaBrowser.Model.Dlna } string dlnaflags = string.Format(";DLNA.ORG_FLAGS={0}", - FlagsToString(flagValue)); + DlnaMaps.FlagsToString(flagValue)); ResponseProfile mediaProfile = _profile.GetVideoMediaProfile(container, audioCodec, diff --git a/MediaBrowser.Model/Dlna/DeviceProfile.cs b/MediaBrowser.Model/Dlna/DeviceProfile.cs index 2b2453a23..9f599f3e3 100644 --- a/MediaBrowser.Model/Dlna/DeviceProfile.cs +++ b/MediaBrowser.Model/Dlna/DeviceProfile.cs @@ -108,7 +108,8 @@ namespace MediaBrowser.Model.Dlna List list = new List(); foreach (string i in (SupportedMediaTypes ?? string.Empty).Split(',')) { - if (!string.IsNullOrEmpty(i)) list.Add(i); + if (!string.IsNullOrEmpty(i)) + list.Add(i); } return list; } @@ -117,85 +118,102 @@ namespace MediaBrowser.Model.Dlna { container = (container ?? string.Empty).TrimStart('.'); - return TranscodingProfiles.FirstOrDefault(i => + foreach (var i in TranscodingProfiles) { if (i.Type != DlnaProfileType.Audio) { - return false; + continue; } if (!string.Equals(container, i.Container, StringComparison.OrdinalIgnoreCase)) { - return false; + continue; } - if (!i.GetAudioCodecs().Contains(audioCodec ?? string.Empty)) + if (!i.GetAudioCodecs().Contains(audioCodec ?? string.Empty, StringComparer.OrdinalIgnoreCase)) { - return false; + continue; } - return true; - }); + return i; + } + return null; } public TranscodingProfile GetVideoTranscodingProfile(string container, string audioCodec, string videoCodec) { container = (container ?? string.Empty).TrimStart('.'); - return TranscodingProfiles.FirstOrDefault(i => + foreach (var i in TranscodingProfiles) { if (i.Type != DlnaProfileType.Video) { - return false; + continue; } if (!string.Equals(container, i.Container, StringComparison.OrdinalIgnoreCase)) { - return false; + continue; } if (!i.GetAudioCodecs().Contains(audioCodec ?? string.Empty)) { - return false; + continue; } if (!string.Equals(videoCodec, i.VideoCodec, StringComparison.OrdinalIgnoreCase)) { - return false; + continue; } - return true; - }); + return i; + } + return null; } public ResponseProfile GetAudioMediaProfile(string container, string audioCodec, int? audioChannels, int? audioBitrate) { container = (container ?? string.Empty).TrimStart('.'); - return ResponseProfiles.FirstOrDefault(i => + foreach (var i in ResponseProfiles) { if (i.Type != DlnaProfileType.Audio) { - return false; + continue; } - List containers = i.GetContainers().ToList(); - if (containers.Count > 0 && !containers.Contains(container)) + List containers = i.GetContainers(); + if (containers.Count > 0 && !containers.Contains(container, StringComparer.OrdinalIgnoreCase)) { - return false; + continue; } - List audioCodecs = i.GetAudioCodecs().ToList(); - if (audioCodecs.Count > 0 && !audioCodecs.Contains(audioCodec ?? string.Empty)) + List audioCodecs = i.GetAudioCodecs(); + if (audioCodecs.Count > 0 && !audioCodecs.Contains(audioCodec ?? string.Empty, StringComparer.OrdinalIgnoreCase)) { - return false; + continue; } ConditionProcessor conditionProcessor = new ConditionProcessor(); - return i.Conditions.All(c => conditionProcessor.IsAudioConditionSatisfied(c, - audioChannels, - audioBitrate)); - }); + + var anyOff = false; + foreach (ProfileCondition c in i.Conditions) + { + if (!conditionProcessor.IsAudioConditionSatisfied(c, audioChannels, audioBitrate)) + { + anyOff = true; + break; + } + } + + if (anyOff) + { + continue; + } + + return i; + } + return null; } public ResponseProfile GetImageMediaProfile(string container, int? width, int? height) @@ -209,16 +227,19 @@ namespace MediaBrowser.Model.Dlna return false; } - List containers = i.GetContainers().ToList(); - if (containers.Count > 0 && !containers.Contains(container)) + List containers = i.GetContainers(); + if (containers.Count > 0 && !containers.Contains(container, StringComparer.OrdinalIgnoreCase)) { return false; } ConditionProcessor conditionProcessor = new ConditionProcessor(); - return i.Conditions.All(c => conditionProcessor.IsImageConditionSatisfied(c, - width, - height)); + foreach (ProfileCondition c in i.Conditions) + { + if (!conditionProcessor.IsImageConditionSatisfied(c, width, height)) + return false; + } + return true; }); } @@ -246,37 +267,31 @@ namespace MediaBrowser.Model.Dlna return false; } - List containers = i.GetContainers().ToList(); - if (containers.Count > 0 && !containers.Contains(container)) + List containers = i.GetContainers(); + if (containers.Count > 0 && !containers.Contains(container, StringComparer.OrdinalIgnoreCase)) { return false; } - List audioCodecs = i.GetAudioCodecs().ToList(); - if (audioCodecs.Count > 0 && !audioCodecs.Contains(audioCodec ?? string.Empty)) + List audioCodecs = i.GetAudioCodecs(); + if (audioCodecs.Count > 0 && !audioCodecs.Contains(audioCodec ?? string.Empty, StringComparer.OrdinalIgnoreCase)) { return false; } - List videoCodecs = i.GetVideoCodecs().ToList(); - if (videoCodecs.Count > 0 && !videoCodecs.Contains(videoCodec ?? string.Empty)) + List videoCodecs = i.GetVideoCodecs(); + if (videoCodecs.Count > 0 && !videoCodecs.Contains(videoCodec ?? string.Empty, StringComparer.OrdinalIgnoreCase)) { return false; } ConditionProcessor conditionProcessor = new ConditionProcessor(); - return i.Conditions.All(c => conditionProcessor.IsVideoConditionSatisfied(c, - audioBitrate, - audioChannels, - width, - height, - bitDepth, - videoBitrate, - videoProfile, - videoLevel, - videoFramerate, - packetLength, - timestamp)); + foreach (ProfileCondition c in i.Conditions) + { + if (!conditionProcessor.IsVideoConditionSatisfied(c, audioBitrate, audioChannels, width, height, bitDepth, videoBitrate, videoProfile, videoLevel, videoFramerate, packetLength, timestamp)) + return false; + } + return true; }); } @@ -292,15 +307,18 @@ namespace MediaBrowser.Model.Dlna } List containers = i.GetContainers().ToList(); - if (containers.Count > 0 && !containers.Contains(container)) + if (containers.Count > 0 && !containers.Contains(container, StringComparer.OrdinalIgnoreCase)) { return false; } ConditionProcessor conditionProcessor = new ConditionProcessor(); - return i.Conditions.All(c => conditionProcessor.IsImageConditionSatisfied(c, - width, - height)); + foreach (ProfileCondition c in i.Conditions) + { + if (!conditionProcessor.IsImageConditionSatisfied(c, width, height)) + return false; + } + return true; }); } } diff --git a/MediaBrowser.Model/Dlna/StreamBuilder.cs b/MediaBrowser.Model/Dlna/StreamBuilder.cs index 9acec20aa..d87fbb109 100644 --- a/MediaBrowser.Model/Dlna/StreamBuilder.cs +++ b/MediaBrowser.Model/Dlna/StreamBuilder.cs @@ -27,7 +27,7 @@ namespace MediaBrowser.Model.Dlna mediaSources = new List(); foreach (MediaSourceInfo i in mediaSources) { - if (string.Equals(i.Id, mediaSourceId, StringComparison.OrdinalIgnoreCase)) + if (string.Equals(i.Id, mediaSourceId, StringComparison.OrdinalIgnoreCase)) mediaSources.Add(i); } } @@ -60,7 +60,7 @@ namespace MediaBrowser.Model.Dlna mediaSources = new List(); foreach (MediaSourceInfo i in mediaSources) { - if (string.Equals(i.Id, mediaSourceId, StringComparison.OrdinalIgnoreCase)) + if (string.Equals(i.Id, mediaSourceId, StringComparison.OrdinalIgnoreCase)) mediaSources.Add(i); } } @@ -109,13 +109,28 @@ namespace MediaBrowser.Model.Dlna int? maxBitrateSetting = options.MaxBitrate ?? options.Profile.MaxBitrate; - MediaStream audioStream = item.MediaStreams.FirstOrDefault(i => i.Type == MediaStreamType.Audio); + MediaStream audioStream = null; + foreach (MediaStream i in item.MediaStreams) + { + if (i.Type == MediaStreamType.Audio) + { + audioStream = i; + break; + } + } // Honor the max bitrate setting if (IsAudioEligibleForDirectPlay(item, maxBitrateSetting)) { - DirectPlayProfile directPlay = options.Profile.DirectPlayProfiles - .FirstOrDefault(i => i.Type == playlistItem.MediaType && IsAudioDirectPlaySupported(i, item, audioStream)); + DirectPlayProfile directPlay = null; + foreach (DirectPlayProfile i in options.Profile.DirectPlayProfiles) + { + if (i.Type == playlistItem.MediaType && IsAudioDirectPlaySupported(i, item, audioStream)) + { + directPlay = i; + break; + } + } if (directPlay != null) { @@ -126,13 +141,27 @@ namespace MediaBrowser.Model.Dlna { ConditionProcessor conditionProcessor = new ConditionProcessor(); - IEnumerable conditions = options.Profile.CodecProfiles.Where(i => i.Type == CodecType.Audio && i.ContainsCodec(audioCodec)) - .SelectMany(i => i.Conditions); + List conditions = new List(); + foreach (CodecProfile i in options.Profile.CodecProfiles) + { + if (i.Type == CodecType.Audio && i.ContainsCodec(audioCodec)) + conditions.AddRange(i.Conditions); + } int? audioChannels = audioStream.Channels; int? audioBitrate = audioStream.BitRate; - if (conditions.All(c => conditionProcessor.IsAudioConditionSatisfied(c, audioChannels, audioBitrate))) + bool all = true; + foreach (ProfileCondition c in conditions) + { + if (!conditionProcessor.IsAudioConditionSatisfied(c, audioChannels, audioBitrate)) + { + all = false; + break; + } + } + + if (all) { playlistItem.IsDirectStream = true; playlistItem.Container = item.Container; @@ -143,8 +172,15 @@ namespace MediaBrowser.Model.Dlna } } - TranscodingProfile transcodingProfile = options.Profile.TranscodingProfiles - .FirstOrDefault(i => i.Type == playlistItem.MediaType); + TranscodingProfile transcodingProfile = null; + foreach (TranscodingProfile i in options.Profile.TranscodingProfiles) + { + if (i.Type == playlistItem.MediaType) + { + transcodingProfile = i; + break; + } + } if (transcodingProfile != null) { @@ -155,10 +191,11 @@ namespace MediaBrowser.Model.Dlna playlistItem.AudioCodec = transcodingProfile.AudioCodec; playlistItem.Protocol = transcodingProfile.Protocol; - IEnumerable audioTranscodingConditions = options.Profile.CodecProfiles + List audioTranscodingConditions = options.Profile.CodecProfiles .Where(i => i.Type == CodecType.Audio && i.ContainsCodec(transcodingProfile.AudioCodec)) .Take(1) - .SelectMany(i => i.Conditions); + .SelectMany(i => i.Conditions) + .ToList(); ApplyTranscodingConditions(playlistItem, audioTranscodingConditions); @@ -192,8 +229,25 @@ namespace MediaBrowser.Model.Dlna RunTimeTicks = item.RunTimeTicks }; - MediaStream audioStream = item.MediaStreams.FirstOrDefault(i => i.Type == MediaStreamType.Audio); - MediaStream videoStream = item.MediaStreams.FirstOrDefault(i => i.Type == MediaStreamType.Video); + MediaStream audioStream = null; + foreach (MediaStream i in item.MediaStreams) + { + if (i.Type == MediaStreamType.Audio) + { + audioStream = i; + break; + } + } + + MediaStream videoStream = null; + foreach (MediaStream i in item.MediaStreams) + { + if (i.Type == MediaStreamType.Video) + { + videoStream = i; + break; + } + } int? maxBitrateSetting = options.MaxBitrate ?? options.Profile.MaxBitrate; @@ -306,9 +360,15 @@ namespace MediaBrowser.Model.Dlna string container = mediaSource.Container; - IEnumerable conditions = profile.ContainerProfiles - .Where(i => i.Type == DlnaProfileType.Video && i.GetContainers().Contains(container, StringComparer.OrdinalIgnoreCase)) - .SelectMany(i => i.Conditions); + List conditions = new List(); + foreach (ContainerProfile i in profile.ContainerProfiles) + { + if (i.Type == DlnaProfileType.Video && + i.GetContainers().Contains(container, StringComparer.OrdinalIgnoreCase)) + { + conditions.AddRange(i.Conditions); + } + } ConditionProcessor conditionProcessor = new ConditionProcessor(); @@ -328,20 +388,12 @@ namespace MediaBrowser.Model.Dlna int? packetLength = videoStream == null ? null : videoStream.PacketLength; // Check container conditions - if (!conditions.All(i => conditionProcessor.IsVideoConditionSatisfied(i, - audioBitrate, - audioChannels, - width, - height, - bitDepth, - videoBitrate, - videoProfile, - videoLevel, - videoFramerate, - packetLength, - timestamp))) + foreach (ProfileCondition i in conditions) { - return null; + if (!conditionProcessor.IsVideoConditionSatisfied(i, audioBitrate, audioChannels, width, height, bitDepth, videoBitrate, videoProfile, videoLevel, videoFramerate, packetLength, timestamp)) + { + return null; + } } string videoCodec = videoStream == null ? null : videoStream.Codec; @@ -351,24 +403,19 @@ namespace MediaBrowser.Model.Dlna return null; } - conditions = profile.CodecProfiles - .Where(i => i.Type == CodecType.Video && i.ContainsCodec(videoCodec)) - .SelectMany(i => i.Conditions); + conditions = new List(); + foreach (CodecProfile i in profile.CodecProfiles) + { + if (i.Type == CodecType.Video && i.ContainsCodec(videoCodec)) + conditions.AddRange(i.Conditions); + } - if (!conditions.All(i => conditionProcessor.IsVideoConditionSatisfied(i, - audioBitrate, - audioChannels, - width, - height, - bitDepth, - videoBitrate, - videoProfile, - videoLevel, - videoFramerate, - packetLength, - timestamp))) + foreach (ProfileCondition i in conditions) { - return null; + if (!conditionProcessor.IsVideoConditionSatisfied(i, audioBitrate, audioChannels, width, height, bitDepth, videoBitrate, videoProfile, videoLevel, videoFramerate, packetLength, timestamp)) + { + return null; + } } if (audioStream != null) @@ -380,16 +427,19 @@ namespace MediaBrowser.Model.Dlna return null; } - conditions = profile.CodecProfiles - .Where(i => i.Type == CodecType.VideoAudio && i.ContainsCodec(audioCodec)) - .SelectMany(i => i.Conditions); + conditions = new List(); + foreach (CodecProfile i in profile.CodecProfiles) + { + if (i.Type == CodecType.VideoAudio && i.ContainsCodec(audioCodec)) + conditions.AddRange(i.Conditions); + } - if (!conditions.All(i => conditionProcessor.IsVideoAudioConditionSatisfied(i, - audioChannels, - audioBitrate, - audioProfile))) + foreach (ProfileCondition i in conditions) { - return null; + if (!conditionProcessor.IsVideoAudioConditionSatisfied(i, audioChannels, audioBitrate, audioProfile)) + { + return null; + } } } @@ -455,11 +505,15 @@ namespace MediaBrowser.Model.Dlna private void ApplyTranscodingConditions(StreamInfo item, IEnumerable conditions) { - foreach (ProfileCondition condition in conditions - .Where(i => !string.IsNullOrEmpty(i.Value))) + foreach (ProfileCondition condition in conditions) { string value = condition.Value; + if (string.IsNullOrEmpty(value)) + { + continue; + } + switch (condition.Property) { case ProfileConditionValue.AudioBitrate: @@ -551,7 +605,16 @@ namespace MediaBrowser.Model.Dlna { // Check container type string mediaContainer = item.Container ?? string.Empty; - if (!profile.GetContainers().Any(i => string.Equals(i, mediaContainer, StringComparison.OrdinalIgnoreCase))) + bool any = false; + foreach (string i in profile.GetContainers()) + { + if (string.Equals(i, mediaContainer, StringComparison.OrdinalIgnoreCase)) + { + any = true; + break; + } + } + if (!any) { return false; } @@ -572,7 +635,16 @@ namespace MediaBrowser.Model.Dlna { // Check container type string mediaContainer = item.Container ?? string.Empty; - if (!profile.GetContainers().Any(i => string.Equals(i, mediaContainer, StringComparison.OrdinalIgnoreCase))) + bool any = false; + foreach (string i in profile.GetContainers()) + { + if (string.Equals(i, mediaContainer, StringComparison.OrdinalIgnoreCase)) + { + any = true; + break; + } + } + if (!any) { return false; } diff --git a/MediaBrowser.Model/Plugins/BasePluginConfiguration.cs b/MediaBrowser.Model/Plugins/BasePluginConfiguration.cs index 4c7b8812f..9a8bfadd1 100644 --- a/MediaBrowser.Model/Plugins/BasePluginConfiguration.cs +++ b/MediaBrowser.Model/Plugins/BasePluginConfiguration.cs @@ -1,5 +1,4 @@ -using MediaBrowser.Model.Updates; - + namespace MediaBrowser.Model.Plugins { /// @@ -7,26 +6,5 @@ namespace MediaBrowser.Model.Plugins /// public class BasePluginConfiguration { - /// - /// Whether or not this plug-in should be automatically updated when a - /// compatible new version is released - /// - /// true if [enable auto update]; otherwise, false. - public bool EnableAutoUpdate { get; set; } - - /// - /// The classification of updates to which to subscribe. - /// Options are: Dev, Beta or Release - /// - /// The update class. - public PackageVersionClass UpdateClass { get; set; } - - /// - /// Initializes a new instance of the class. - /// - public BasePluginConfiguration() - { - EnableAutoUpdate = true; - } } } diff --git a/MediaBrowser.Model/Plugins/PluginInfo.cs b/MediaBrowser.Model/Plugins/PluginInfo.cs index fbc2e2927..e84c06c21 100644 --- a/MediaBrowser.Model/Plugins/PluginInfo.cs +++ b/MediaBrowser.Model/Plugins/PluginInfo.cs @@ -49,25 +49,5 @@ namespace MediaBrowser.Model.Plugins /// /// The unique id. public string Id { get; set; } - - /// - /// Whether or not this plug-in should be automatically updated when a - /// compatible new version is released - /// - /// true if [enable auto update]; otherwise, false. - public bool EnableAutoUpdate { get; set; } - - /// - /// The classification of updates to which to subscribe. - /// Options are: Dev, Beta or Release - /// - /// The update class. - public PackageVersionClass UpdateClass { get; set; } - - /// - /// Gets or sets the minimum required UI version. - /// - /// The minimum required UI version. - public string MinimumRequiredUIVersion { get; set; } } } diff --git a/MediaBrowser.Providers/Xbmc/XbmcImageSaver.cs b/MediaBrowser.Providers/Xbmc/XbmcImageSaver.cs index 5a4408f1b..93231e1e3 100644 --- a/MediaBrowser.Providers/Xbmc/XbmcImageSaver.cs +++ b/MediaBrowser.Providers/Xbmc/XbmcImageSaver.cs @@ -266,7 +266,7 @@ namespace MediaBrowser.Providers.Xbmc public string Name { - get { return "MB3/Plex/Xbmc Images"; } + get { return "Media Browser/Plex/Xbmc Images"; } } } } diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/da.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/da.json new file mode 100644 index 000000000..fee6f74a6 --- /dev/null +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/da.json @@ -0,0 +1,30 @@ +{ + "SettingsSaved": "Indstillinger er gemt", + "AddUser": "Tilf\u00f8j bruger", + "Users": "Brugere", + "Delete": "Slet", + "Administrator": "Administrator", + "Password": "Kode", + "DeleteImage": "Slet Image", + "DeleteImageConfirmation": "Er du sikker p\u00e5 du vil slette dette image?", + "FileReadCancelled": "The file read has been canceled.", + "FileNotFound": "Filen blev ikke fundet", + "FileReadError": "An error occurred while reading the file.", + "DeleteUser": "Slet bruger", + "DeleteUserConfirmation": "Er du sikker p\u00e5 du \u00f8nsker at slette {0}?", + "PasswordResetHeader": "Nulstil kode", + "PasswordResetComplete": "Koden er blevet nulstillet", + "PasswordResetConfirmation": "Er du sikker p\u00e5 at koden skal nulstilles", + "PasswordSaved": "Koden er gemt", + "PasswordMatchError": "Password and password confirmation must match.", + "OptionOff": "Off", + "OptionOn": "On", + "OptionRelease": "Official Release", + "OptionBeta": "Beta", + "OptionDev": "Dev (Ustabil)", + "UninstallPluginHeader": "Afinstaller plugin", + "UninstallPluginConfirmation": "Are you sure you wish to uninstall {0}?", + "NoPluginConfigurationMessage": "Der er igenting at konfigurere i dette plugin.", + "NoPluginsInstalledMessage": "Der er ikke installeret nogle plugins", + "BrowsePluginCatalogMessage": "Browse our plugin catalog to view available plugins." +} \ 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 f3d4d88f8..86ffe5863 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/ru.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/ru.json @@ -26,5 +26,5 @@ "UninstallPluginConfirmation": "\u0412\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0443\u0434\u0430\u043b\u0438\u0442\u044c {0}?", "NoPluginConfigurationMessage": "\u0414\u043b\u044f \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u043b\u0430\u0433\u0438\u043d\u0430 \u043d\u0435\u0447\u0435\u0433\u043e \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c.", "NoPluginsInstalledMessage": "\u041d\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043e \u043d\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u043f\u043b\u0430\u0433\u0438\u043d\u0430.", - "BrowsePluginCatalogMessage": "\u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u043d\u0430\u0448 \u043a\u0430\u0442\u0430\u043b\u043e\u0433, \u0447\u0442\u043e\u0431\u044b \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u043c\u0438 \u043f\u043b\u0430\u0433\u0438\u043d\u0430\u043c\u0438." + "BrowsePluginCatalogMessage": "\u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u043a\u0430\u0442\u0430\u043b\u043e\u0433, \u0447\u0442\u043e\u0431\u044b \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u043c\u0438 \u043f\u043b\u0430\u0433\u0438\u043d\u0430\u043c\u0438." } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/LocalizationManager.cs b/MediaBrowser.Server.Implementations/Localization/LocalizationManager.cs index 8eaaaacc0..1888d14fd 100644 --- a/MediaBrowser.Server.Implementations/Localization/LocalizationManager.cs +++ b/MediaBrowser.Server.Implementations/Localization/LocalizationManager.cs @@ -331,6 +331,7 @@ namespace MediaBrowser.Server.Implementations.Localization new LocalizatonOption{ Name="Catalan", Value="ca"}, new LocalizatonOption{ Name="Chinese Traditional", Value="zh-TW"}, new LocalizatonOption{ Name="Czech", Value="cs"}, + new LocalizatonOption{ Name="Danish", Value="da"}, new LocalizatonOption{ Name="Dutch", Value="nl"}, new LocalizatonOption{ Name="French", Value="fr"}, new LocalizatonOption{ Name="German", Value="de"}, diff --git a/MediaBrowser.Server.Implementations/Localization/Server/ar.json b/MediaBrowser.Server.Implementations/Localization/Server/ar.json index 4b9d9f5a8..2bf2edeb2 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/ar.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/ar.json @@ -514,7 +514,7 @@ "ErrorConnectingToMediaBrowserRepository": "There was an error connecting to the remote Media Browser repository.", "LabelComponentsUpdated": "The following components have been installed or updated:", "MessagePleaseRestartServerToFinishUpdating": "Please restart the server to finish applying updates.", - "LabelDownMixAudioScale": "Down mix audio boost scale:", + "LabelDownMixAudioScale": "Audio boost when downmixing:", "LabelDownMixAudioScaleHelp": "Boost audio when downmixing. Set to 1 to preserve original volume value.", "ButtonLinkKeys": "Link Keys", "LabelOldSupporterKey": "Old supporter key", @@ -564,6 +564,7 @@ "NotificationOptionTaskFailed": "Scheduled task failure", "NotificationOptionInstallationFailed": "Installation failure", "NotificationOptionNewLibraryContent": "New content added", + "NotificationOptionNewLibraryContentMultiple": "New content added (multiple)", "SendNotificationHelp": "By default, notifications are delivered to the dashboard inbox. Browse the plugin catalog to install additional notification options.", "NotificationOptionServerRestartRequired": "Server restart required", "LabelNotificationEnabled": "Enable this notification", @@ -698,13 +699,17 @@ "OptionReportByteRangeSeekingWhenTranscodingHelp": "This is required for some devices that don't time seek very well.", "HeaderSubtitleDownloadingHelp": "When Media Browser scans your video files it can search for missing subtitles, and download them using a subtitle provider such as OpenSubtitles.org.", "HeaderDownloadSubtitlesFor": "Download subtitles for:", - "LabelRequireTextSubtitles": "Download even if the video already contains graphical subtitles", - "LabelRequireTextSubtitlesHelp": "Keeping text versions of subtitles will result in more efficient delivery to mobile clients.", + "LabelSkipIfGraphicalSubsPresent": "Skip if the video already contains graphical subtitles", + "LabelSkipIfGraphicalSubsPresentHelp": "Keeping text versions of subtitles will result in more efficient delivery to mobile clients.", "TabSubtitles": "Subtitles", "LabelOpenSubtitlesUsername": "Open Subtitles username:", "LabelOpenSubtitlesPassword": "Open Subtitles password:", "LabelAudioLanguagePreferenceHelp": "If empty, the default audio track will be selected, regardless of language.", "LabelDownloadLanguages": "Download languages:", "ButtonRegister": "Register", - "HeaderSubtitleDownloadingMoreHelp": "Subtitles are considered missing when the audio track is in a foreign language, and there are no subtitles available in the preferred language." + "LabelSkipIfAudioTrackPresent": "Skip if the default audio track matches the download language", + "LabelSkipIfAudioTrackPresentHelp": "Uncheck this to ensure all videos have subtitles, regardless of audio language.", + "HeaderSendMessage": "Send Message", + "ButtonSend": "Send", + "LabelMessageText": "Message text:" } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/Server/ca.json b/MediaBrowser.Server.Implementations/Localization/Server/ca.json index 30283099c..59649d7ca 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/ca.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/ca.json @@ -514,7 +514,7 @@ "ErrorConnectingToMediaBrowserRepository": "There was an error connecting to the remote Media Browser repository.", "LabelComponentsUpdated": "The following components have been installed or updated:", "MessagePleaseRestartServerToFinishUpdating": "Please restart the server to finish applying updates.", - "LabelDownMixAudioScale": "Down mix audio boost scale:", + "LabelDownMixAudioScale": "Audio boost when downmixing:", "LabelDownMixAudioScaleHelp": "Boost audio when downmixing. Set to 1 to preserve original volume value.", "ButtonLinkKeys": "Link Keys", "LabelOldSupporterKey": "Old supporter key", @@ -564,6 +564,7 @@ "NotificationOptionTaskFailed": "Scheduled task failure", "NotificationOptionInstallationFailed": "Installation failure", "NotificationOptionNewLibraryContent": "New content added", + "NotificationOptionNewLibraryContentMultiple": "New content added (multiple)", "SendNotificationHelp": "By default, notifications are delivered to the dashboard inbox. Browse the plugin catalog to install additional notification options.", "NotificationOptionServerRestartRequired": "Server restart required", "LabelNotificationEnabled": "Enable this notification", @@ -698,13 +699,17 @@ "OptionReportByteRangeSeekingWhenTranscodingHelp": "This is required for some devices that don't time seek very well.", "HeaderSubtitleDownloadingHelp": "When Media Browser scans your video files it can search for missing subtitles, and download them using a subtitle provider such as OpenSubtitles.org.", "HeaderDownloadSubtitlesFor": "Download subtitles for:", - "LabelRequireTextSubtitles": "Download even if the video already contains graphical subtitles", - "LabelRequireTextSubtitlesHelp": "Keeping text versions of subtitles will result in more efficient delivery to mobile clients.", + "LabelSkipIfGraphicalSubsPresent": "Skip if the video already contains graphical subtitles", + "LabelSkipIfGraphicalSubsPresentHelp": "Keeping text versions of subtitles will result in more efficient delivery to mobile clients.", "TabSubtitles": "Subtitles", "LabelOpenSubtitlesUsername": "Open Subtitles username:", "LabelOpenSubtitlesPassword": "Open Subtitles password:", "LabelAudioLanguagePreferenceHelp": "If empty, the default audio track will be selected, regardless of language.", "LabelDownloadLanguages": "Download languages:", "ButtonRegister": "Register", - "HeaderSubtitleDownloadingMoreHelp": "Subtitles are considered missing when the audio track is in a foreign language, and there are no subtitles available in the preferred language." + "LabelSkipIfAudioTrackPresent": "Skip if the default audio track matches the download language", + "LabelSkipIfAudioTrackPresentHelp": "Uncheck this to ensure all videos have subtitles, regardless of audio language.", + "HeaderSendMessage": "Send Message", + "ButtonSend": "Send", + "LabelMessageText": "Message text:" } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/Server/cs.json b/MediaBrowser.Server.Implementations/Localization/Server/cs.json index 6ccda40df..59a02e6ec 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/cs.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/cs.json @@ -514,7 +514,7 @@ "ErrorConnectingToMediaBrowserRepository": "There was an error connecting to the remote Media Browser repository.", "LabelComponentsUpdated": "The following components have been installed or updated:", "MessagePleaseRestartServerToFinishUpdating": "Please restart the server to finish applying updates.", - "LabelDownMixAudioScale": "Down mix audio boost scale:", + "LabelDownMixAudioScale": "Audio boost when downmixing:", "LabelDownMixAudioScaleHelp": "Boost audio when downmixing. Set to 1 to preserve original volume value.", "ButtonLinkKeys": "Link Keys", "LabelOldSupporterKey": "Old supporter key", @@ -564,6 +564,7 @@ "NotificationOptionTaskFailed": "Scheduled task failure", "NotificationOptionInstallationFailed": "Installation failure", "NotificationOptionNewLibraryContent": "New content added", + "NotificationOptionNewLibraryContentMultiple": "New content added (multiple)", "SendNotificationHelp": "By default, notifications are delivered to the dashboard inbox. Browse the plugin catalog to install additional notification options.", "NotificationOptionServerRestartRequired": "Server restart required", "LabelNotificationEnabled": "Enable this notification", @@ -698,13 +699,17 @@ "OptionReportByteRangeSeekingWhenTranscodingHelp": "This is required for some devices that don't time seek very well.", "HeaderSubtitleDownloadingHelp": "When Media Browser scans your video files it can search for missing subtitles, and download them using a subtitle provider such as OpenSubtitles.org.", "HeaderDownloadSubtitlesFor": "Download subtitles for:", - "LabelRequireTextSubtitles": "Download even if the video already contains graphical subtitles", - "LabelRequireTextSubtitlesHelp": "Keeping text versions of subtitles will result in more efficient delivery to mobile clients.", + "LabelSkipIfGraphicalSubsPresent": "Skip if the video already contains graphical subtitles", + "LabelSkipIfGraphicalSubsPresentHelp": "Keeping text versions of subtitles will result in more efficient delivery to mobile clients.", "TabSubtitles": "Subtitles", "LabelOpenSubtitlesUsername": "Open Subtitles username:", "LabelOpenSubtitlesPassword": "Open Subtitles password:", "LabelAudioLanguagePreferenceHelp": "If empty, the default audio track will be selected, regardless of language.", "LabelDownloadLanguages": "Download languages:", "ButtonRegister": "Register", - "HeaderSubtitleDownloadingMoreHelp": "Subtitles are considered missing when the audio track is in a foreign language, and there are no subtitles available in the preferred language." + "LabelSkipIfAudioTrackPresent": "Skip if the default audio track matches the download language", + "LabelSkipIfAudioTrackPresentHelp": "Uncheck this to ensure all videos have subtitles, regardless of audio language.", + "HeaderSendMessage": "Send Message", + "ButtonSend": "Send", + "LabelMessageText": "Message text:" } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/Server/da.json b/MediaBrowser.Server.Implementations/Localization/Server/da.json new file mode 100644 index 000000000..0f782994f --- /dev/null +++ b/MediaBrowser.Server.Implementations/Localization/Server/da.json @@ -0,0 +1,715 @@ +{ + "LabelExit": "Exit", + "LabelVisitCommunity": "Visit Community", + "LabelGithubWiki": "Github Wiki", + "LabelSwagger": "Swagger", + "LabelStandard": "Standard", + "LabelViewApiDocumentation": "Se Api dokumentation", + "LabelBrowseLibrary": "Gennemse biblitek", + "LabelConfigureMediaBrowser": "Konfigurere Media Browser", + "LabelOpenLibraryViewer": "Open Library Viewer", + "LabelRestartServer": "Genstart Server", + "LabelShowLogWindow": "Show Log Window", + "LabelPrevious": "Tidligere", + "LabelFinish": "Slut", + "LabelNext": "N\u00e6ste", + "LabelYoureDone": "Du er f\u00e6rdig!", + "WelcomeToMediaBrowser": "Welcome to Media Browser!", + "TitleMediaBrowser": "Media Browser", + "ThisWizardWillGuideYou": "Denne guide vil hj\u00e6lpe dig igennem ops\u00e6tningen. For at begynde, venligst v\u00e6lg dit fortrukne sprog.", + "TellUsAboutYourself": "Fort\u00e6l os lidt om dig selv", + "LabelYourFirstName": "Dit fornavn", + "MoreUsersCanBeAddedLater": "More users can be added later within the Dashboard.", + "UserProfilesIntro": "Media Browser includes built-in support for user profiles, enabling each user to have their own display settings, playstate and parental controls.", + "LabelWindowsService": "Windows Service", + "AWindowsServiceHasBeenInstalled": "A Windows Service has been installed.", + "WindowsServiceIntro1": "Media Browser Server normally runs as a desktop application with a tray icon, but if you prefer to run it as a background service, it can be started from the windows services control panel instead.", + "WindowsServiceIntro2": "If using the windows service, please note that it cannot be run at the same time as the tray icon, so you'll need to exit the tray in order to run the service. The service will also need to be configured with administrative privileges via the control panel. Please note that at this time the service is unable to self-update, so new versions will require manual interaction.", + "WizardCompleted": "That's all we need for now. Media Browser has begun collecting information about your media library. Check out some of our apps, and then click Finish<\/b> to view the Dashboard<\/b>.", + "LabelConfigureSettings": "Configure settings", + "LabelEnableVideoImageExtraction": "Enable video image extraction", + "VideoImageExtractionHelp": "For videos that don't already have images, and that we're unable to find internet images for. This will add some additional time to the initial library scan but will result in a more pleasing presentation.", + "LabelEnableChapterImageExtractionForMovies": "Extract chapter image extraction for Movies", + "LabelChapterImageExtractionForMoviesHelp": "Extracting chapter images will allow clients to display graphical scene selection menus. The process can be slow, cpu-intensive and may require several gigabytes of space. It runs as a nightly scheduled task at 4am, although this is configurable in the scheduled tasks area. It is not recommended to run this task during peak usage hours.", + "LabelEnableAutomaticPortMapping": "Enable automatic port mapping", + "LabelEnableAutomaticPortMappingHelp": "UPnP allows automated router configuration for easy remote access. This may not work with some router models.", + "ButtonOk": "Ok", + "ButtonCancel": "Cancel", + "ButtonNew": "New", + "HeaderSetupLibrary": "Setup your media library", + "ButtonAddMediaFolder": "Add media folder", + "LabelFolderType": "Folder type:", + "MediaFolderHelpPluginRequired": "* Requires the use of a plugin, e.g. GameBrowser or MB Bookshelf.", + "ReferToMediaLibraryWiki": "Refer to the media library wiki.", + "LabelCountry": "Country:", + "LabelLanguage": "Language:", + "HeaderPreferredMetadataLanguage": "Preferred metadata language:", + "LabelSaveLocalMetadata": "Save artwork and metadata into media folders", + "LabelSaveLocalMetadataHelp": "Saving artwork and metadata directly into media folders will put them in a place where they can be easily edited.", + "LabelDownloadInternetMetadata": "Download artwork and metadata from the internet", + "LabelDownloadInternetMetadataHelp": "Media Browser can download information about your media to enable rich presentations.", + "TabPreferences": "Preferences", + "TabPassword": "Password", + "TabLibraryAccess": "Library Access", + "TabImage": "Image", + "TabProfile": "Profile", + "TabMetadata": "Metadata", + "TabImages": "Images", + "TabNotifications": "Notifications", + "TabCollectionTitles": "Titles", + "LabelDisplayMissingEpisodesWithinSeasons": "Display missing episodes within seasons", + "LabelUnairedMissingEpisodesWithinSeasons": "Display unaired episodes within seasons", + "HeaderVideoPlaybackSettings": "Video Playback Settings", + "HeaderPlaybackSettings": "Playback Settings", + "LabelAudioLanguagePreference": "Audio language preference:", + "LabelSubtitleLanguagePreference": "Subtitle language preference:", + "LabelDisplayForcedSubtitlesOnly": "Display only forced subtitles", + "TabProfiles": "Profiles", + "TabSecurity": "Security", + "ButtonAddUser": "Add User", + "ButtonSave": "Save", + "ButtonResetPassword": "Reset Password", + "LabelNewPassword": "New password:", + "LabelNewPasswordConfirm": "New password confirm:", + "HeaderCreatePassword": "Create Password", + "LabelCurrentPassword": "Current password:", + "LabelMaxParentalRating": "Maximum allowed parental rating:", + "MaxParentalRatingHelp": "Content with a higher rating will be hidden from this user.", + "LibraryAccessHelp": "Select the media folders to share with this user. Administrators will be able to edit all folders using the metadata manager.", + "ChannelAccessHelp": "Select the channels to share with this user. Administrators will be able to edit all channels using the metadata manager.", + "ButtonDeleteImage": "Delete Image", + "LabelSelectUsers": "Select users:", + "ButtonUpload": "Upload", + "HeaderUploadNewImage": "Upload New Image", + "LabelDropImageHere": "Drop Image Here", + "ImageUploadAspectRatioHelp": "1:1 Aspect Ratio Recommended. JPG\/PNG only.", + "MessageNothingHere": "Nothing here.", + "MessagePleaseEnsureInternetMetadata": "Please ensure downloading of internet metadata is enabled.", + "TabSuggested": "Suggested", + "TabLatest": "Latest", + "TabUpcoming": "Upcoming", + "TabShows": "Shows", + "TabEpisodes": "Episodes", + "TabGenres": "Genres", + "TabPeople": "People", + "TabNetworks": "Networks", + "HeaderUsers": "Users", + "HeaderFilters": "Filters:", + "ButtonFilter": "Filter", + "OptionFavorite": "Favorites", + "OptionLikes": "Likes", + "OptionDislikes": "Dislikes", + "OptionActors": "Actors", + "OptionGuestStars": "Guest Stars", + "OptionDirectors": "Directors", + "OptionWriters": "Writers", + "OptionProducers": "Producers", + "HeaderResume": "Resume", + "HeaderNextUp": "Next Up", + "NoNextUpItemsMessage": "None found. Start watching your shows!", + "HeaderLatestEpisodes": "Latest Episodes", + "HeaderPersonTypes": "Person Types:", + "TabSongs": "Songs", + "TabAlbums": "Albums", + "TabArtists": "Artists", + "TabAlbumArtists": "Album Artists", + "TabMusicVideos": "Music Videos", + "ButtonSort": "Sort", + "HeaderSortBy": "Sort By:", + "HeaderSortOrder": "Sort Order:", + "OptionPlayed": "Played", + "OptionUnplayed": "Unplayed", + "OptionAscending": "Ascending", + "OptionDescending": "Descending", + "OptionRuntime": "Runtime", + "OptionReleaseDate": "Release Date", + "OptionPlayCount": "Play Count", + "OptionDatePlayed": "Date Played", + "OptionDateAdded": "Date Added", + "OptionAlbumArtist": "Album Artist", + "OptionArtist": "Artist", + "OptionAlbum": "Album", + "OptionTrackName": "Track Name", + "OptionCommunityRating": "Community Rating", + "OptionNameSort": "Name", + "OptionFolderSort": "Folders", + "OptionBudget": "Budget", + "OptionRevenue": "Revenue", + "OptionPoster": "Poster", + "OptionBackdrop": "Backdrop", + "OptionTimeline": "Timeline", + "OptionThumb": "Thumb", + "OptionBanner": "Banner", + "OptionCriticRating": "Critic Rating", + "OptionVideoBitrate": "Video Bitrate", + "OptionResumable": "Resumable", + "ScheduledTasksHelp": "Click a task to adjust its schedule.", + "ScheduledTasksTitle": "Scheduled Tasks", + "TabMyPlugins": "My Plugins", + "TabCatalog": "Catalog", + "PluginsTitle": "Plugins", + "HeaderAutomaticUpdates": "Automatic Updates", + "HeaderNowPlaying": "Now Playing", + "HeaderLatestAlbums": "Latest Albums", + "HeaderLatestSongs": "Latest Songs", + "HeaderRecentlyPlayed": "Recently Played", + "HeaderFrequentlyPlayed": "Frequently Played", + "DevBuildWarning": "Dev builds are the bleeding edge. Released often, these build have not been tested. The application may crash and entire features may not work at all.", + "LabelVideoType": "Video Type:", + "OptionBluray": "Bluray", + "OptionDvd": "Dvd", + "OptionIso": "Iso", + "Option3D": "3D", + "LabelFeatures": "Features:", + "OptionHasSubtitles": "Subtitles", + "OptionHasTrailer": "Trailer", + "OptionHasThemeSong": "Theme Song", + "OptionHasThemeVideo": "Theme Video", + "TabMovies": "Movies", + "TabStudios": "Studios", + "TabTrailers": "Trailers", + "HeaderLatestMovies": "Latest Movies", + "HeaderLatestTrailers": "Latest Trailers", + "OptionHasSpecialFeatures": "Special Features", + "OptionImdbRating": "IMDb Rating", + "OptionParentalRating": "Parental Rating", + "OptionPremiereDate": "Premiere Date", + "TabBasic": "Basic", + "TabAdvanced": "Advanced", + "HeaderStatus": "Status", + "OptionContinuing": "Continuing", + "OptionEnded": "Ended", + "HeaderAirDays": "Air Days:", + "OptionSunday": "Sunday", + "OptionMonday": "Monday", + "OptionTuesday": "Tuesday", + "OptionWednesday": "Wednesday", + "OptionThursday": "Thursday", + "OptionFriday": "Friday", + "OptionSaturday": "Saturday", + "HeaderManagement": "Management:", + "OptionMissingImdbId": "Missing IMDb Id", + "OptionMissingTvdbId": "Missing TheTVDB Id", + "OptionMissingOverview": "Missing Overview", + "OptionFileMetadataYearMismatch": "File\/Metadata Years Mismatched", + "TabGeneral": "General", + "TitleSupport": "Support", + "TabLog": "Log", + "TabAbout": "About", + "TabSupporterKey": "Supporter Key", + "TabBecomeSupporter": "Become a Supporter", + "MediaBrowserHasCommunity": "Media Browser has a thriving community of users and contributors.", + "CheckoutKnowledgeBase": "Check out our knowledge base to help you get the most out of Media Browser.", + "SearchKnowledgeBase": "Search the Knowledge Base", + "VisitTheCommunity": "Visit the Community", + "VisitMediaBrowserWebsite": "Visit the Media Browser Web Site", + "VisitMediaBrowserWebsiteLong": "Visit the Media Browser Web site to catch the latest news and keep up with the developer blog.", + "OptionHideUser": "Hide this user from login screens", + "OptionDisableUser": "Disable this user", + "OptionDisableUserHelp": "If disabled the server will not allow any connections from this user. Existing connections will be abruptly terminated.", + "HeaderAdvancedControl": "Advanced Control", + "LabelName": "Name:", + "OptionAllowUserToManageServer": "Allow this user to manage the server", + "HeaderFeatureAccess": "Feature Access", + "OptionAllowMediaPlayback": "Allow media playback", + "OptionAllowBrowsingLiveTv": "Allow browsing of live tv", + "OptionAllowDeleteLibraryContent": "Allow this user to delete library content", + "OptionAllowManageLiveTv": "Allow management of live tv recordings", + "OptionAllowRemoteControlOthers": "Allow this user to remote control other users", + "OptionMissingTmdbId": "Missing Tmdb Id", + "OptionIsHD": "HD", + "OptionIsSD": "SD", + "OptionMetascore": "Metascore", + "ButtonSelect": "Select", + "ButtonSearch": "Search", + "ButtonGroupVersions": "Group Versions", + "PismoMessage": "Utilizing Pismo File Mount through a donated license.", + "PleaseSupportOtherProduces": "Please support other free products we utilize:", + "VersionNumber": "Version {0}", + "TabPaths": "Paths", + "TabServer": "Server", + "TabTranscoding": "Transcoding", + "TitleAdvanced": "Advanced", + "LabelAutomaticUpdateLevel": "Automatic update level", + "OptionRelease": "Official Release", + "OptionBeta": "Beta", + "OptionDev": "Dev (Ustabil)", + "LabelAllowServerAutoRestart": "Allow the server to restart automatically to apply updates", + "LabelAllowServerAutoRestartHelp": "The server will only restart during idle periods, when no users are active.", + "LabelEnableDebugLogging": "Enable debug logging", + "LabelRunServerAtStartup": "Run server at startup", + "LabelRunServerAtStartupHelp": "This will start the tray icon on windows startup. To start the windows service, uncheck this and run the service from the windows control panel. Please note that you cannot run both at the same time, so you will need to exit the tray icon before starting the service.", + "ButtonSelectDirectory": "Select Directory", + "LabelCustomPaths": "Specify custom paths where desired. Leave fields empty to use the defaults.", + "LabelCachePath": "Cache path:", + "LabelCachePathHelp": "This folder contains server cache files, such as images.", + "LabelImagesByNamePath": "Images by name path:", + "LabelImagesByNamePathHelp": "This folder contains actor, artist, genre and studio images.", + "LabelMetadataPath": "Metadata path:", + "LabelMetadataPathHelp": "This location contains downloaded artwork and metadata that is not configured to be stored in media folders.", + "LabelTranscodingTempPath": "Transcoding temporary path:", + "LabelTranscodingTempPathHelp": "This folder contains working files used by the transcoder.", + "TabBasics": "Basics", + "TabTV": "TV", + "TabGames": "Games", + "TabMusic": "Music", + "TabOthers": "Others", + "HeaderExtractChapterImagesFor": "Extract chapter images for:", + "OptionMovies": "Movies", + "OptionEpisodes": "Episodes", + "OptionOtherVideos": "Other Videos", + "TitleMetadata": "Metadata", + "LabelAutomaticUpdatesFanart": "Enable automatic updates from FanArt.tv", + "LabelAutomaticUpdatesTmdb": "Enable automatic updates from TheMovieDB.org", + "LabelAutomaticUpdatesTvdb": "Enable automatic updates from TheTVDB.com", + "LabelAutomaticUpdatesFanartHelp": "If enabled, new images will be downloaded automatically as they're added to fanart.tv. Existing images will not be replaced.", + "LabelAutomaticUpdatesTmdbHelp": "If enabled, new images will be downloaded automatically as they're added to TheMovieDB.org. Existing images will not be replaced.", + "LabelAutomaticUpdatesTvdbHelp": "If enabled, new images will be downloaded automatically as they're added to TheTVDB.com. Existing images will not be replaced.", + "ExtractChapterImagesHelp": "Extracting chapter images will allow clients to display graphical scene selection menus. The process can be slow, cpu-intensive and may require several gigabytes of space. It runs as a nightly scheduled task at 4am, although this is configurable in the scheduled tasks area. It is not recommended to run this task during peak usage hours.", + "LabelMetadataDownloadLanguage": "Preferred download language:", + "ButtonAutoScroll": "Auto-scroll", + "LabelImageSavingConvention": "Image saving convention:", + "LabelImageSavingConventionHelp": "Media Browser recognizes images from most major media applications. Choosing your downloading convention is useful if you also use other products.", + "OptionImageSavingCompatible": "Compatible - MB3\/Plex\/Xbmc", + "OptionImageSavingStandard": "Standard - MB3\/MB2", + "ButtonSignIn": "Sign In", + "TitleSignIn": "Sign In", + "HeaderPleaseSignIn": "Please sign in", + "LabelUser": "User:", + "LabelPassword": "Password:", + "ButtonManualLogin": "Manual Login", + "PasswordLocalhostMessage": "Passwords are not required when logging in from localhost.", + "TabGuide": "Guide", + "TabChannels": "Channels", + "HeaderChannels": "Channels", + "TabRecordings": "Recordings", + "TabScheduled": "Scheduled", + "TabSeries": "Series", + "ButtonCancelRecording": "Cancel Recording", + "HeaderPrePostPadding": "Pre\/Post Padding", + "LabelPrePaddingMinutes": "Pre-padding minutes:", + "OptionPrePaddingRequired": "Pre-padding is required in order to record.", + "LabelPostPaddingMinutes": "Post-padding minutes:", + "OptionPostPaddingRequired": "Post-padding is required in order to record.", + "HeaderWhatsOnTV": "What's On", + "HeaderUpcomingTV": "Upcoming TV", + "TabStatus": "Status", + "TabSettings": "Settings", + "ButtonRefreshGuideData": "Refresh Guide Data", + "OptionPriority": "Priority", + "OptionRecordOnAllChannels": "Record program on all channels", + "OptionRecordAnytime": "Record program at any time", + "OptionRecordOnlyNewEpisodes": "Record only new episodes", + "HeaderDays": "Days", + "HeaderActiveRecordings": "Active Recordings", + "HeaderLatestRecordings": "Latest Recordings", + "HeaderAllRecordings": "All Recordings", + "ButtonPlay": "Play", + "ButtonEdit": "Edit", + "ButtonRecord": "Record", + "ButtonDelete": "Delete", + "ButtonRemove": "Remove", + "OptionRecordSeries": "Record Series", + "HeaderDetails": "Details", + "TitleLiveTV": "Live TV", + "LabelNumberOfGuideDays": "Number of days of guide data to download:", + "LabelNumberOfGuideDaysHelp": "Downloading more days worth of guide data provides the ability to schedule out further in advance and view more listings, but it will also take longer to download. Auto will choose based on the number of channels.", + "LabelActiveService": "Active Service:", + "LabelActiveServiceHelp": "Multiple tv plugins can be installed but only one can be active at a time.", + "OptionAutomatic": "Auto", + "LiveTvPluginRequired": "A Live TV service provider plugin is required in order to continue.", + "LiveTvPluginRequiredHelp": "Please install one of our available plugins, such as Next Pvr or ServerWmc.", + "HeaderCustomizeOptionsPerMediaType": "Customize options per media type", + "OptionDownloadThumbImage": "Thumb", + "OptionDownloadMenuImage": "Menu", + "OptionDownloadLogoImage": "Logo", + "OptionDownloadBoxImage": "Box", + "OptionDownloadDiscImage": "Disc", + "OptionDownloadBannerImage": "Banner", + "OptionDownloadBackImage": "Back", + "OptionDownloadArtImage": "Art", + "OptionDownloadPrimaryImage": "Primary", + "HeaderFetchImages": "Fetch Images:", + "HeaderImageSettings": "Image Settings", + "LabelMaxBackdropsPerItem": "Maximum number of backdrops per item:", + "LabelMaxScreenshotsPerItem": "Maximum number of screenshots per item:", + "LabelMinBackdropDownloadWidth": "Minimum backdrop download width:", + "LabelMinScreenshotDownloadWidth": "Minimum screenshot download width:", + "ButtonAddScheduledTaskTrigger": "Add Task Trigger", + "HeaderAddScheduledTaskTrigger": "Add Task Trigger", + "ButtonAdd": "Add", + "LabelTriggerType": "Trigger Type:", + "OptionDaily": "Daily", + "OptionWeekly": "Weekly", + "OptionOnInterval": "On an interval", + "OptionOnAppStartup": "On application startup", + "OptionAfterSystemEvent": "After a system event", + "LabelDay": "Day:", + "LabelTime": "Time:", + "LabelEvent": "Event:", + "OptionWakeFromSleep": "Wake from sleep", + "LabelEveryXMinutes": "Every:", + "HeaderTvTuners": "Tuners", + "HeaderGallery": "Gallery", + "HeaderLatestGames": "Latest Games", + "HeaderRecentlyPlayedGames": "Recently Played Games", + "TabGameSystems": "Game Systems", + "TitleMediaLibrary": "Media Library", + "TabFolders": "Folders", + "TabPathSubstitution": "Path Substitution", + "LabelSeasonZeroDisplayName": "Season 0 display name:", + "LabelEnableRealtimeMonitor": "Enable real time monitoring", + "LabelEnableRealtimeMonitorHelp": "Changes will be processed immediately, on supported file systems.", + "ButtonScanLibrary": "Scan Library", + "HeaderNumberOfPlayers": "Players:", + "OptionAnyNumberOfPlayers": "Any", + "Option1Player": "1+", + "Option2Player": "2+", + "Option3Player": "3+", + "Option4Player": "4+", + "HeaderMediaFolders": "Media Folders", + "HeaderThemeVideos": "Theme Videos", + "HeaderThemeSongs": "Theme Songs", + "HeaderScenes": "Scenes", + "HeaderAwardsAndReviews": "Awards and Reviews", + "HeaderSoundtracks": "Soundtracks", + "HeaderMusicVideos": "Music Videos", + "HeaderSpecialFeatures": "Special Features", + "HeaderCastCrew": "Cast & Crew", + "HeaderAdditionalParts": "Additional Parts", + "ButtonSplitVersionsApart": "Split Versions Apart", + "ButtonPlayTrailer": "Trailer", + "LabelMissing": "Missing", + "LabelOffline": "Offline", + "PathSubstitutionHelp": "Path substitutions are used for mapping a path on the server to a path that clients are able to access. By allowing clients direct access to media on the server they may be able to play them directly over the network and avoid using server resources to stream and transcode them.", + "HeaderFrom": "From", + "HeaderTo": "To", + "LabelFrom": "From:", + "LabelFromHelp": "Example: D:\\Movies (on the server)", + "LabelTo": "To:", + "LabelToHelp": "Example: \\\\MyServer\\Movies (a path clients can access)", + "ButtonAddPathSubstitution": "Add Substitution", + "OptionSpecialEpisode": "Specials", + "OptionMissingEpisode": "Missing Episodes", + "OptionUnairedEpisode": "Unaired Episodes", + "OptionEpisodeSortName": "Episode Sort Name", + "OptionSeriesSortName": "Series Name", + "OptionTvdbRating": "Tvdb Rating", + "HeaderTranscodingQualityPreference": "Transcoding Quality Preference:", + "OptionAutomaticTranscodingHelp": "The server will decide quality and speed", + "OptionHighSpeedTranscodingHelp": "Lower quality, but faster encoding", + "OptionHighQualityTranscodingHelp": "Higher quality, but slower encoding", + "OptionMaxQualityTranscodingHelp": "Best quality with slower encoding and high CPU usage", + "OptionHighSpeedTranscoding": "Higher speed", + "OptionHighQualityTranscoding": "Higher quality", + "OptionMaxQualityTranscoding": "Max quality", + "OptionEnableDebugTranscodingLogging": "Enable debug transcoding logging", + "OptionEnableDebugTranscodingLoggingHelp": "This will create very large log files and is only recommended as needed for troubleshooting purposes.", + "OptionUpscaling": "Allow clients to request upscaled video", + "OptionUpscalingHelp": "In some cases this will result in improved video quality but will increase CPU usage.", + "EditCollectionItemsHelp": "Add or remove any movies, series, albums, books or games you wish to group within this collection.", + "HeaderAddTitles": "Add Titles", + "LabelEnableDlnaPlayTo": "Enable DLNA Play To", + "LabelEnableDlnaPlayToHelp": "Media Browser can detect devices within your network and offer the ability to remote control them.", + "LabelEnableDlnaDebugLogging": "Enable DLNA debug logging", + "LabelEnableDlnaDebugLoggingHelp": "This will create large log files and should only be used as needed for troubleshooting purposes.", + "LabelEnableDlnaClientDiscoveryInterval": "Client discovery interval (seconds)", + "LabelEnableDlnaClientDiscoveryIntervalHelp": "Determines the duration in seconds between SSDP searches performed by Media Browser.", + "HeaderCustomDlnaProfiles": "Custom Profiles", + "HeaderSystemDlnaProfiles": "System Profiles", + "CustomDlnaProfilesHelp": "Create a custom profile to target a new device or override a system profile.", + "SystemDlnaProfilesHelp": "System profiles are read-only. Changes to a system profile will be saved to a new custom profile.", + "TitleDashboard": "Dashboard", + "TabHome": "Home", + "TabInfo": "Info", + "HeaderLinks": "Links", + "HeaderSystemPaths": "System Paths", + "LinkCommunity": "Community", + "LinkGithub": "Github", + "LinkApiDocumentation": "Api Documentation", + "LabelFriendlyServerName": "Friendly server name:", + "LabelFriendlyServerNameHelp": "This name will be used to identify this server. If left blank, the computer name will be used.", + "LabelPreferredDisplayLanguage": "Preferred display language", + "LabelPreferredDisplayLanguageHelp": "Translating Media Browser is an ongoing project and is not yet complete.", + "LabelReadHowYouCanContribute": "Read about how you can contribute.", + "HeaderNewCollection": "New Collection", + "NewCollectionNameExample": "Example: Star Wars Collection", + "OptionSearchForInternetMetadata": "Search the internet for artwork and metadata", + "ButtonCreate": "Create", + "LabelHttpServerPortNumber": "Http server port number:", + "LabelWebSocketPortNumber": "Web socket port number:", + "LabelEnableAutomaticPortHelp": "UPnP allows automated router configuration for remote access. This may not work with some router models.", + "LabelExternalDDNS": "External DDNS:", + "LabelExternalDDNSHelp": "If you have a dynamic DNS enter it here. Media Browser apps will use it when connecting remotely.", + "TabResume": "Resume", + "TabWeather": "Weather", + "TitleAppSettings": "App Settings", + "LabelMinResumePercentage": "Min resume percentage:", + "LabelMaxResumePercentage": "Max resume percentage:", + "LabelMinResumeDuration": "Min resume duration (seconds):", + "LabelMinResumePercentageHelp": "Titles are assumed unplayed if stopped before this time", + "LabelMaxResumePercentageHelp": "Titles are assumed fully played if stopped after this time", + "LabelMinResumeDurationHelp": "Titles shorter than this will not be resumable", + "TitleAutoOrganize": "Auto-Organize", + "TabActivityLog": "Activity Log", + "HeaderName": "Name", + "HeaderDate": "Date", + "HeaderSource": "Source", + "HeaderDestination": "Destination", + "HeaderProgram": "Program", + "HeaderClients": "Clients", + "LabelCompleted": "Completed", + "LabelFailed": "Failed", + "LabelSkipped": "Skipped", + "HeaderEpisodeOrganization": "Episode Organization", + "LabelSeries": "Series:", + "LabelSeasonNumber": "Season number:", + "LabelEpisodeNumber": "Episode number:", + "LabelEndingEpisodeNumber": "Ending episode number:", + "LabelEndingEpisodeNumberHelp": "Only required for multi-episode files", + "HeaderSupportTheTeam": "Support the Media Browser Team", + "LabelSupportAmount": "Amount (USD)", + "HeaderSupportTheTeamHelp": "Help ensure the continued development of this project by donating. A portion of all donations will be contributed to other free tools we depend on.", + "ButtonEnterSupporterKey": "Enter supporter key", + "DonationNextStep": "Once complete, please return and enter your supporter key, which you will receive by email.", + "AutoOrganizeHelp": "Auto-organize monitors your download folders for new files and moves them to your media directories.", + "AutoOrganizeTvHelp": "TV file organizing will only add episodes to existing series. It will not create new series folders.", + "OptionEnableEpisodeOrganization": "Enable new episode organization", + "LabelWatchFolder": "Watch folder:", + "LabelWatchFolderHelp": "The server will poll this folder during the 'Organize new media files' scheduled task.", + "ButtonViewScheduledTasks": "View scheduled tasks", + "LabelMinFileSizeForOrganize": "Minimum file size (MB):", + "LabelMinFileSizeForOrganizeHelp": "Files under this size will be ignored.", + "LabelSeasonFolderPattern": "Season folder pattern:", + "LabelSeasonZeroFolderName": "Season zero folder name:", + "HeaderEpisodeFilePattern": "Episode file pattern", + "LabelEpisodePattern": "Episode pattern:", + "LabelMultiEpisodePattern": "Multi-Episode pattern:", + "HeaderSupportedPatterns": "Supported Patterns", + "HeaderTerm": "Term", + "HeaderPattern": "Pattern", + "HeaderResult": "Result", + "LabelDeleteEmptyFolders": "Delete empty folders after organizing", + "LabelDeleteEmptyFoldersHelp": "Enable this to keep the download directory clean.", + "LabelDeleteLeftOverFiles": "Delete left over files with the following extensions:", + "LabelDeleteLeftOverFilesHelp": "Separate with ;. For example: .nfo;.txt", + "OptionOverwriteExistingEpisodes": "Overwrite existing episodes", + "LabelTransferMethod": "Transfer method", + "OptionCopy": "Copy", + "OptionMove": "Move", + "LabelTransferMethodHelp": "Copy or move files from the watch folder", + "HeaderLatestNews": "Latest News", + "HeaderHelpImproveMediaBrowser": "Help Improve Media Browser", + "HeaderRunningTasks": "Running Tasks", + "HeaderActiveDevices": "Active Devices", + "HeaderPendingInstallations": "Pending Installations", + "HeaerServerInformation": "Server Information", + "ButtonRestartNow": "Restart Now", + "ButtonRestart": "Restart", + "ButtonShutdown": "Shutdown", + "ButtonUpdateNow": "Update Now", + "PleaseUpdateManually": "Please shutdown the server and update manually.", + "NewServerVersionAvailable": "A new version of Media Browser Server is available!", + "ServerUpToDate": "Media Browser Server is up to date", + "ErrorConnectingToMediaBrowserRepository": "There was an error connecting to the remote Media Browser repository.", + "LabelComponentsUpdated": "The following components have been installed or updated:", + "MessagePleaseRestartServerToFinishUpdating": "Please restart the server to finish applying updates.", + "LabelDownMixAudioScale": "Audio boost when downmixing:", + "LabelDownMixAudioScaleHelp": "Boost audio when downmixing. Set to 1 to preserve original volume value.", + "ButtonLinkKeys": "Link Keys", + "LabelOldSupporterKey": "Old supporter key", + "LabelNewSupporterKey": "New supporter key", + "HeaderMultipleKeyLinking": "Multiple Key Linking", + "MultipleKeyLinkingHelp": "If you have more than one supporter key, use this form to link the old key's registrations with your new one.", + "LabelCurrentEmailAddress": "Current email address", + "LabelCurrentEmailAddressHelp": "The current email address to which your new key was sent.", + "HeaderForgotKey": "Forgot Key", + "LabelEmailAddress": "Email address", + "LabelSupporterEmailAddress": "The email address that was used to purchase the key.", + "ButtonRetrieveKey": "Retrieve Key", + "LabelSupporterKey": "Supporter Key (paste from email)", + "LabelSupporterKeyHelp": "Enter your supporter key to start enjoying additional benefits the community has developed for Media Browser.", + "MessageInvalidKey": "MB3 Key Missing or Invalid", + "ErrorMessageInvalidKey": "In order for any premium content to be registered, you must also be an MB3 Supporter. Please donate and support the continued development of the core product. Thank you.", + "HeaderDisplaySettings": "Display Settings", + "TabPlayTo": "Play To", + "LabelEnableDlnaServer": "Enable Dlna server", + "LabelEnableDlnaServerHelp": "Allows UPnP devices on your network to browse and play Media Browser content.", + "LabelEnableBlastAliveMessages": "Blast alive messages", + "LabelEnableBlastAliveMessagesHelp": "Enable this if the server is not detected reliably by other UPnP devices on your network.", + "LabelBlastMessageInterval": "Alive message interval (seconds)", + "LabelBlastMessageIntervalHelp": "Determines the duration in seconds between server alive messages.", + "LabelDefaultUser": "Default user:", + "LabelDefaultUserHelp": "Determines which user library should be displayed on connected devices. This can be overridden for each device using profiles.", + "TitleDlna": "DLNA", + "HeaderServerSettings": "Server Settings", + "LabelWeatherDisplayLocation": "Weather display location:", + "LabelWeatherDisplayLocationHelp": "US zip code \/ City, State, Country \/ City, Country", + "LabelWeatherDisplayUnit": "Weather display unit:", + "OptionCelsius": "Celsius", + "OptionFahrenheit": "Fahrenheit", + "HeaderRequireManualLogin": "Require manual username entry for:", + "HeaderRequireManualLoginHelp": "When disabled clients may present a login screen with a visual selection of users.", + "OptionOtherApps": "Other apps", + "OptionMobileApps": "Mobile apps", + "HeaderNotificationList": "Click on a notification to configure it's sending options.", + "NotificationOptionApplicationUpdateAvailable": "Application update available", + "NotificationOptionApplicationUpdateInstalled": "Application update installed", + "NotificationOptionPluginUpdateInstalled": "Plugin update installed", + "NotificationOptionPluginInstalled": "Plugin installed", + "NotificationOptionPluginUninstalled": "Plugin uninstalled", + "NotificationOptionVideoPlayback": "Video playback", + "NotificationOptionAudioPlayback": "Audio playback", + "NotificationOptionGamePlayback": "Game playback", + "NotificationOptionTaskFailed": "Scheduled task failure", + "NotificationOptionInstallationFailed": "Installation failure", + "NotificationOptionNewLibraryContent": "New content added", + "NotificationOptionNewLibraryContentMultiple": "Nyt indhold tilf\u00f8jet (flere)", + "SendNotificationHelp": "By default, notifications are delivered to the dashboard inbox. Browse the plugin catalog to install additional notification options.", + "NotificationOptionServerRestartRequired": "Server restart required", + "LabelNotificationEnabled": "Enable this notification", + "LabelMonitorUsers": "Monitor activity from:", + "LabelSendNotificationToUsers": "Send the notification to:", + "UsersNotNotifiedAboutSelfActivity": "Users will not be notified about their own activities.", + "LabelUseNotificationServices": "Use the following services:", + "CategoryUser": "User", + "CategorySystem": "System", + "CategoryApplication": "Program", + "CategoryPlugin": "Plugin", + "LabelMessageTitle": "Message title:", + "LabelAvailableTokens": "Available tokens:", + "AdditionalNotificationServices": "Browse the plugin catalog to install additional notification services.", + "OptionAllUsers": "All users", + "OptionAdminUsers": "Administrators", + "OptionCustomUsers": "Custom", + "ButtonArrowUp": "Op", + "ButtonArrowDown": "Ned", + "ButtonArrowLeft": "Venstre", + "ButtonArrowRight": "H\u00f8jre", + "ButtonBack": "Tilbage", + "ButtonInfo": "Info", + "ButtonPageUp": "Side op", + "ButtonPageDown": "Side ned", + "PageAbbreviation": "PG", + "ButtonHome": "Hjem", + "ButtonSettings": "Indstillinger", + "ButtonTakeScreenshot": "Capture Screenshot", + "ButtonLetterUp": "Bogstav op", + "ButtonLetterDown": "Bogstav ned", + "PageButtonAbbreviation": "PG", + "LetterButtonAbbreviation": "A", + "TabNowPlaying": "Spiler nu", + "TabNavigation": "Navigation", + "TabControls": "Controls", + "ButtonFullscreen": "Skift til fuldsk\u00e6rm", + "ButtonScenes": "Scener", + "ButtonSubtitles": "Undertekster", + "ButtonAudioTracks": "Lyd filer", + "ButtonPreviousTrack": "Previous track", + "ButtonNextTrack": "Next track", + "ButtonStop": "Stop", + "ButtonPause": "Pause", + "LabelGroupMoviesIntoCollections": "Group movies into collections", + "LabelGroupMoviesIntoCollectionsHelp": "When displaying movie lists, movies belonging to a collection will be displayed as one grouped item.", + "NotificationOptionPluginError": "Plugin fejl", + "ButtonVolumeUp": "Volume up", + "ButtonVolumeDown": "Volume down", + "ButtonMute": "Mute", + "HeaderLatestMedia": "Latest Media", + "OptionNoSubtitles": "Ingen undertekster", + "OptionSpecialFeatures": "Special Features", + "HeaderCollections": "Collections", + "HeaderMyLibrary": "Mit bibliotek", + "LabelProfileCodecsHelp": "Separated by comma. This can be left empty to apply to all codecs.", + "LabelProfileContainersHelp": "Separated by comma. This can be left empty to apply to all containers.", + "HeaderResponseProfile": "Response Profile", + "LabelType": "Type:", + "LabelProfileContainer": "Container:", + "LabelProfileVideoCodecs": "Video codecs:", + "LabelProfileAudioCodecs": "Audio codecs:", + "LabelProfileCodecs": "Codecs:", + "HeaderDirectPlayProfile": "Direct Play Profile", + "HeaderTranscodingProfile": "Transcoding Profile", + "HeaderCodecProfile": "Codec Profile", + "HeaderCodecProfileHelp": "Codec profiles indicate the limitations of a device when playing specific codecs. If a limitation applies then the media will be transcoded, even if the codec is configured for direct play.", + "HeaderContainerProfile": "Container Profile", + "HeaderContainerProfileHelp": "Container profiles indicate the limitations of a device when playing specific formats. If a limitation applies then the media will be transcoded, even if the format is configured for direct play.", + "OptionProfileVideo": "Video", + "OptionProfileAudio": "Lyd", + "OptionProfileVideoAudio": "Video lyd", + "OptionProfilePhoto": "Foto", + "LabelUserLibrary": "bruger bibliotek", + "LabelUserLibraryHelp": "Select which user library to display to the device. Leave empty to inherit the default setting.", + "OptionPlainStorageFolders": "Display all folders as plain storage folders", + "OptionPlainStorageFoldersHelp": "If enabled, all folders are represented in DIDL as \"object.container.storageFolder\" instead of a more specific type, such as \"object.container.person.musicArtist\".", + "OptionPlainVideoItems": "Display all videos as plain video items", + "OptionPlainVideoItemsHelp": "If enabled, all videos are represented in DIDL as \"object.item.videoItem\" instead of a more specific type, such as \"object.item.videoItem.movie\".", + "LabelSupportedMediaTypes": "Supported Media Types:", + "TabIdentification": "Identification", + "TabDirectPlay": "Direct Play", + "TabContainers": "Containers", + "TabCodecs": "Codecs", + "TabResponses": "Responses", + "HeaderProfileInformation": "Profile Information", + "LabelEmbedAlbumArtDidl": "Embed album art in Didl", + "LabelEmbedAlbumArtDidlHelp": "Some devices prefer this method for obtaining album art. Others may fail to play with this option enabled.", + "LabelAlbumArtPN": "Album art PN:", + "LabelAlbumArtHelp": "PN used for album art, within the dlna:profileID attribute on upnp:albumArtURI. Some clients require a specific value, regardless of the size of the image.", + "LabelAlbumArtMaxWidth": "Album art max width:", + "LabelAlbumArtMaxWidthHelp": "Max resolution of album art exposed via upnp:albumArtURI.", + "LabelAlbumArtMaxHeight": "Album art max height:", + "LabelAlbumArtMaxHeightHelp": "Max resolution of album art exposed via upnp:albumArtURI.", + "LabelIconMaxWidth": "Icon max width:", + "LabelIconMaxWidthHelp": "Max resolution of icons exposed via upnp:icon.", + "LabelIconMaxHeight": "Icon max height:", + "LabelIconMaxHeightHelp": "Max resolution of icons exposed via upnp:icon.", + "LabelIdentificationFieldHelp": "A case-insensitive substring or regex expression.", + "HeaderProfileServerSettingsHelp": "These values control how Media Browser will present itself to the device.", + "LabelMaxBitrate": "Max bitrate:", + "LabelMaxBitrateHelp": "Specify a max bitrate in bandwidth constrained environments, or if the device imposes it's own limit.", + "OptionIgnoreTranscodeByteRangeRequests": "Ignore transcode byte range requests", + "OptionIgnoreTranscodeByteRangeRequestsHelp": "If enabled, these requests will be honored but will ignore the byte range header.", + "LabelFriendlyName": "System venligt navn", + "LabelManufacturer": "Producent", + "LabelManufacturerUrl": "Producent url", + "LabelModelName": "Model navn", + "LabelModelNumber": "Model nummer", + "LabelModelDescription": "Model beskrivelse", + "LabelModelUrl": "Model url", + "LabelSerialNumber": "Serial number", + "LabelDeviceDescription": "Device description", + "HeaderIdentificationCriteriaHelp": "Enter at least one identification criteria.", + "HeaderDirectPlayProfileHelp": "Add direct play profiles to indicate which formats the device can handle natively.", + "HeaderTranscodingProfileHelp": "Add transcoding profiles to indicate which formats should be used when transcoding is required.", + "HeaderResponseProfileHelp": "Response profiles provide a way to customize information sent to the device when playing certain kinds of media.", + "LabelXDlnaCap": "X-Dlna cap:", + "LabelXDlnaCapHelp": "Determines the content of the X_DLNACAP element in the urn:schemas-dlna-org:device-1-0 namespace.", + "LabelXDlnaDoc": "X-Dlna doc:", + "LabelXDlnaDocHelp": "Determines the content of the X_DLNADOC element in the urn:schemas-dlna-org:device-1-0 namespace.", + "LabelSonyAggregationFlags": "Sony aggregation flags:", + "LabelSonyAggregationFlagsHelp": "Determines the content of the aggregationFlags element in the urn:schemas-sonycom:av namespace.", + "LabelTranscodingContainer": "Container:", + "LabelTranscodingVideoCodec": "Video codec:", + "LabelTranscodingVideoProfile": "Video profile:", + "LabelTranscodingAudioCodec": "Audio codec:", + "OptionEnableM2tsMode": "Enable M2ts mode", + "OptionEnableM2tsModeHelp": "Enable m2ts mode when encoding to mpegts.", + "OptionEstimateContentLength": "Estimate content length when transcoding", + "OptionReportByteRangeSeekingWhenTranscoding": "Report that the server supports byte seeking when transcoding", + "OptionReportByteRangeSeekingWhenTranscodingHelp": "This is required for some devices that don't time seek very well.", + "HeaderSubtitleDownloadingHelp": "When Media Browser scans your video files it can search for missing subtitles, and download them using a subtitle provider such as OpenSubtitles.org.", + "HeaderDownloadSubtitlesFor": "Download subtitles for:", + "LabelSkipIfGraphicalSubsPresent": "Spring over hvis videioen allerede indeholder grafiske undertekster", + "LabelSkipIfGraphicalSubsPresentHelp": "Keeping text versions of subtitles will result in more efficient delivery to mobile clients.", + "TabSubtitles": "Undertekster", + "LabelOpenSubtitlesUsername": "Open Subtitles brugernavn:", + "LabelOpenSubtitlesPassword": "Open Subtitles kode:", + "LabelAudioLanguagePreferenceHelp": "If empty, the default audio track will be selected, regardless of language.", + "LabelDownloadLanguages": "Download languages:", + "ButtonRegister": "Register", + "LabelSkipIfAudioTrackPresent": "Skip if the default audio track matches the download language", + "LabelSkipIfAudioTrackPresentHelp": "Uncheck dette for at sikre at alle videoer har undertekster, uanset hvilket sprog lydsporet anvender.", + "HeaderSendMessage": "Send besked", + "ButtonSend": "Send", + "LabelMessageText": "Tekst besked" +} \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/Server/de.json b/MediaBrowser.Server.Implementations/Localization/Server/de.json index 197cb921e..6e8c072bd 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/de.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/de.json @@ -514,7 +514,7 @@ "ErrorConnectingToMediaBrowserRepository": "Es trat ein Fehler bei der Verbindung zum Media Browser Repository auf.", "LabelComponentsUpdated": "Die folgenden Komponenten wurden installiert oder aktualisiert:", "MessagePleaseRestartServerToFinishUpdating": "Bitte den Server neustarten, um die Aktualisierungen abzuschlie\u00dfen.", - "LabelDownMixAudioScale": "Down mix audio boost scale:", + "LabelDownMixAudioScale": "Audio boost when downmixing:", "LabelDownMixAudioScaleHelp": "Erh\u00f6he die Audiolautst\u00e4rke beim Heruntermischen. Setzte auf 1 um die original Lautst\u00e4rke zu erhalten.", "ButtonLinkKeys": "Schl\u00fcssel zusammenf\u00fchren", "LabelOldSupporterKey": "Alter Unterst\u00fctzerschl\u00fcssel", @@ -564,6 +564,7 @@ "NotificationOptionTaskFailed": "Scheduled task failure", "NotificationOptionInstallationFailed": "Installation failure", "NotificationOptionNewLibraryContent": "Neuer Inhalt hinzugef\u00fcgt", + "NotificationOptionNewLibraryContentMultiple": "New content added (multiple)", "SendNotificationHelp": "By default, notifications are delivered to the dashboard inbox. Browse the plugin catalog to install additional notification options.", "NotificationOptionServerRestartRequired": "Serverneustart notwendig", "LabelNotificationEnabled": "Aktiviere diese Benachrichtigung", @@ -698,13 +699,17 @@ "OptionReportByteRangeSeekingWhenTranscodingHelp": "This is required for some devices that don't time seek very well.", "HeaderSubtitleDownloadingHelp": "When Media Browser scans your video files it can search for missing subtitles, and download them using a subtitle provider such as OpenSubtitles.org.", "HeaderDownloadSubtitlesFor": "Download subtitles for:", - "LabelRequireTextSubtitles": "Download even if the video already contains graphical subtitles", - "LabelRequireTextSubtitlesHelp": "Keeping text versions of subtitles will result in more efficient delivery to mobile clients.", + "LabelSkipIfGraphicalSubsPresent": "Skip if the video already contains graphical subtitles", + "LabelSkipIfGraphicalSubsPresentHelp": "Keeping text versions of subtitles will result in more efficient delivery to mobile clients.", "TabSubtitles": "Subtitles", "LabelOpenSubtitlesUsername": "Open Subtitles username:", "LabelOpenSubtitlesPassword": "Open Subtitles password:", "LabelAudioLanguagePreferenceHelp": "If empty, the default audio track will be selected, regardless of language.", "LabelDownloadLanguages": "Download languages:", "ButtonRegister": "Register", - "HeaderSubtitleDownloadingMoreHelp": "Subtitles are considered missing when the audio track is in a foreign language, and there are no subtitles available in the preferred language." + "LabelSkipIfAudioTrackPresent": "Skip if the default audio track matches the download language", + "LabelSkipIfAudioTrackPresentHelp": "Uncheck this to ensure all videos have subtitles, regardless of audio language.", + "HeaderSendMessage": "Send Message", + "ButtonSend": "Send", + "LabelMessageText": "Message text:" } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/Server/el.json b/MediaBrowser.Server.Implementations/Localization/Server/el.json index f6d0f1d5d..082850a6b 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/el.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/el.json @@ -514,7 +514,7 @@ "ErrorConnectingToMediaBrowserRepository": "There was an error connecting to the remote Media Browser repository.", "LabelComponentsUpdated": "The following components have been installed or updated:", "MessagePleaseRestartServerToFinishUpdating": "Please restart the server to finish applying updates.", - "LabelDownMixAudioScale": "Down mix audio boost scale:", + "LabelDownMixAudioScale": "Audio boost when downmixing:", "LabelDownMixAudioScaleHelp": "Boost audio when downmixing. Set to 1 to preserve original volume value.", "ButtonLinkKeys": "Link Keys", "LabelOldSupporterKey": "Old supporter key", @@ -564,6 +564,7 @@ "NotificationOptionTaskFailed": "Scheduled task failure", "NotificationOptionInstallationFailed": "Installation failure", "NotificationOptionNewLibraryContent": "New content added", + "NotificationOptionNewLibraryContentMultiple": "New content added (multiple)", "SendNotificationHelp": "By default, notifications are delivered to the dashboard inbox. Browse the plugin catalog to install additional notification options.", "NotificationOptionServerRestartRequired": "Server restart required", "LabelNotificationEnabled": "Enable this notification", @@ -698,13 +699,17 @@ "OptionReportByteRangeSeekingWhenTranscodingHelp": "This is required for some devices that don't time seek very well.", "HeaderSubtitleDownloadingHelp": "When Media Browser scans your video files it can search for missing subtitles, and download them using a subtitle provider such as OpenSubtitles.org.", "HeaderDownloadSubtitlesFor": "Download subtitles for:", - "LabelRequireTextSubtitles": "Download even if the video already contains graphical subtitles", - "LabelRequireTextSubtitlesHelp": "Keeping text versions of subtitles will result in more efficient delivery to mobile clients.", + "LabelSkipIfGraphicalSubsPresent": "Skip if the video already contains graphical subtitles", + "LabelSkipIfGraphicalSubsPresentHelp": "Keeping text versions of subtitles will result in more efficient delivery to mobile clients.", "TabSubtitles": "Subtitles", "LabelOpenSubtitlesUsername": "Open Subtitles username:", "LabelOpenSubtitlesPassword": "Open Subtitles password:", "LabelAudioLanguagePreferenceHelp": "If empty, the default audio track will be selected, regardless of language.", "LabelDownloadLanguages": "Download languages:", "ButtonRegister": "Register", - "HeaderSubtitleDownloadingMoreHelp": "Subtitles are considered missing when the audio track is in a foreign language, and there are no subtitles available in the preferred language." + "LabelSkipIfAudioTrackPresent": "Skip if the default audio track matches the download language", + "LabelSkipIfAudioTrackPresentHelp": "Uncheck this to ensure all videos have subtitles, regardless of audio language.", + "HeaderSendMessage": "Send Message", + "ButtonSend": "Send", + "LabelMessageText": "Message text:" } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/Server/en_GB.json b/MediaBrowser.Server.Implementations/Localization/Server/en_GB.json index 9f4847b72..4b9914f29 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/en_GB.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/en_GB.json @@ -514,7 +514,7 @@ "ErrorConnectingToMediaBrowserRepository": "There was an error connecting to the remote Media Browser repository.", "LabelComponentsUpdated": "The following components have been installed or updated:", "MessagePleaseRestartServerToFinishUpdating": "Please restart the server to finish applying updates.", - "LabelDownMixAudioScale": "Down mix audio boost scale:", + "LabelDownMixAudioScale": "Audio boost when downmixing:", "LabelDownMixAudioScaleHelp": "Boost audio when downmixing. Set to 1 to preserve original volume value.", "ButtonLinkKeys": "Link Keys", "LabelOldSupporterKey": "Old supporter key", @@ -564,6 +564,7 @@ "NotificationOptionTaskFailed": "Scheduled task failure", "NotificationOptionInstallationFailed": "Installation failure", "NotificationOptionNewLibraryContent": "New content added", + "NotificationOptionNewLibraryContentMultiple": "New content added (multiple)", "SendNotificationHelp": "By default, notifications are delivered to the dashboard inbox. Browse the plugin catalog to install additional notification options.", "NotificationOptionServerRestartRequired": "Server restart required", "LabelNotificationEnabled": "Enable this notification", @@ -698,13 +699,17 @@ "OptionReportByteRangeSeekingWhenTranscodingHelp": "This is required for some devices that don't time seek very well.", "HeaderSubtitleDownloadingHelp": "When Media Browser scans your video files it can search for missing subtitles, and download them using a subtitle provider such as OpenSubtitles.org.", "HeaderDownloadSubtitlesFor": "Download subtitles for:", - "LabelRequireTextSubtitles": "Download even if the video already contains graphical subtitles", - "LabelRequireTextSubtitlesHelp": "Keeping text versions of subtitles will result in more efficient delivery to mobile clients.", + "LabelSkipIfGraphicalSubsPresent": "Skip if the video already contains graphical subtitles", + "LabelSkipIfGraphicalSubsPresentHelp": "Keeping text versions of subtitles will result in more efficient delivery to mobile clients.", "TabSubtitles": "Subtitles", "LabelOpenSubtitlesUsername": "Open Subtitles username:", "LabelOpenSubtitlesPassword": "Open Subtitles password:", "LabelAudioLanguagePreferenceHelp": "If empty, the default audio track will be selected, regardless of language.", "LabelDownloadLanguages": "Download languages:", "ButtonRegister": "Register", - "HeaderSubtitleDownloadingMoreHelp": "Subtitles are considered missing when the audio track is in a foreign language, and there are no subtitles available in the preferred language." + "LabelSkipIfAudioTrackPresent": "Skip if the default audio track matches the download language", + "LabelSkipIfAudioTrackPresentHelp": "Uncheck this to ensure all videos have subtitles, regardless of audio language.", + "HeaderSendMessage": "Send Message", + "ButtonSend": "Send", + "LabelMessageText": "Message text:" } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/Server/en_US.json b/MediaBrowser.Server.Implementations/Localization/Server/en_US.json index 54de8e138..35596c401 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/en_US.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/en_US.json @@ -514,7 +514,7 @@ "ErrorConnectingToMediaBrowserRepository": "There was an error connecting to the remote Media Browser repository.", "LabelComponentsUpdated": "The following components have been installed or updated:", "MessagePleaseRestartServerToFinishUpdating": "Please restart the server to finish applying updates.", - "LabelDownMixAudioScale": "Down mix audio boost scale:", + "LabelDownMixAudioScale": "Audio boost when downmixing:", "LabelDownMixAudioScaleHelp": "Boost audio when downmixing. Set to 1 to preserve original volume value.", "ButtonLinkKeys": "Link Keys", "LabelOldSupporterKey": "Old supporter key", @@ -564,6 +564,7 @@ "NotificationOptionTaskFailed": "Scheduled task failure", "NotificationOptionInstallationFailed": "Installation failure", "NotificationOptionNewLibraryContent": "New content added", + "NotificationOptionNewLibraryContentMultiple": "New content added (multiple)", "SendNotificationHelp": "By default, notifications are delivered to the dashboard inbox. Browse the plugin catalog to install additional notification options.", "NotificationOptionServerRestartRequired": "Server restart required", "LabelNotificationEnabled": "Enable this notification", @@ -698,13 +699,17 @@ "OptionReportByteRangeSeekingWhenTranscodingHelp": "This is required for some devices that don't time seek very well.", "HeaderSubtitleDownloadingHelp": "When Media Browser scans your video files it can search for missing subtitles, and download them using a subtitle provider such as OpenSubtitles.org.", "HeaderDownloadSubtitlesFor": "Download subtitles for:", - "LabelRequireTextSubtitles": "Download even if the video already contains graphical subtitles", - "LabelRequireTextSubtitlesHelp": "Keeping text versions of subtitles will result in more efficient delivery to mobile clients.", + "LabelSkipIfGraphicalSubsPresent": "Skip if the video already contains graphical subtitles", + "LabelSkipIfGraphicalSubsPresentHelp": "Keeping text versions of subtitles will result in more efficient delivery to mobile clients.", "TabSubtitles": "Subtitles", "LabelOpenSubtitlesUsername": "Open Subtitles username:", "LabelOpenSubtitlesPassword": "Open Subtitles password:", "LabelAudioLanguagePreferenceHelp": "If empty, the default audio track will be selected, regardless of language.", "LabelDownloadLanguages": "Download languages:", "ButtonRegister": "Register", - "HeaderSubtitleDownloadingMoreHelp": "Subtitles are considered missing when the audio track is in a foreign language, and there are no subtitles available in the preferred language." + "LabelSkipIfAudioTrackPresent": "Skip if the default audio track matches the download language", + "LabelSkipIfAudioTrackPresentHelp": "Uncheck this to ensure all videos have subtitles, regardless of audio language.", + "HeaderSendMessage": "Send Message", + "ButtonSend": "Send", + "LabelMessageText": "Message text:" } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/Server/es.json b/MediaBrowser.Server.Implementations/Localization/Server/es.json index cbbc536db..f699ef62c 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/es.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/es.json @@ -76,7 +76,7 @@ "LabelMaxParentalRating": "M\u00e1xima clasificaci\u00f3n permitida", "MaxParentalRatingHelp": "El contenido con clasificaci\u00f3n parental superior se ocultar\u00e1 para este usuario.", "LibraryAccessHelp": "Seleccione las carpetas de medios para compartir con este usuario. Los administradores podr\u00e1n editar todas las carpetas usando el gestor de metadata.", - "ChannelAccessHelp": "Select the channels to share with this user. Administrators will be able to edit all channels using the metadata manager.", + "ChannelAccessHelp": "Seleccione los canales para compartir con este usuario. Los administradores podr\u00e1n editar todos los canales mediante el gestor de metadatos.", "ButtonDeleteImage": "Borrar imagen", "LabelSelectUsers": "Seleccionar usuarios:", "ButtonUpload": "Subir", @@ -564,6 +564,7 @@ "NotificationOptionTaskFailed": "La tarea programada ha fallado", "NotificationOptionInstallationFailed": "Fallo en la instalaci\u00f3n", "NotificationOptionNewLibraryContent": "Nuevo contenido a\u00f1adido", + "NotificationOptionNewLibraryContentMultiple": "New content added (multiple)", "SendNotificationHelp": "Por defecto, las notificaciones aparecer\u00e1n en el panel de control. Compruebe el cat\u00e1logo de plugins para instalar opciones adicionales para las notificaciones.", "NotificationOptionServerRestartRequired": "Se requiere el reinicio del servidor", "LabelNotificationEnabled": "Activar esta notificaci\u00f3n", @@ -617,94 +618,98 @@ "HeaderLatestMedia": "\u00daltimos medios", "OptionNoSubtitles": "Sin subt\u00edtulos", "OptionSpecialFeatures": "Caracter\u00edsticas especiales", - "HeaderCollections": "Collections", - "HeaderMyLibrary": "My Library", - "LabelProfileCodecsHelp": "Separated by comma. This can be left empty to apply to all codecs.", - "LabelProfileContainersHelp": "Separated by comma. This can be left empty to apply to all containers.", - "HeaderResponseProfile": "Response Profile", - "LabelType": "Type:", - "LabelProfileContainer": "Container:", - "LabelProfileVideoCodecs": "Video codecs:", - "LabelProfileAudioCodecs": "Audio codecs:", + "HeaderCollections": "Colecciones", + "HeaderMyLibrary": "Mi librer\u00eda", + "LabelProfileCodecsHelp": "Separados por comas. Esto se puede dejar vac\u00edo para aplicar a todos los codecs.", + "LabelProfileContainersHelp": "Separados por comas. Esto se puede dejar vac\u00edo para aplicar a todos los contenedores.", + "HeaderResponseProfile": "Perfil de respuesta", + "LabelType": "Tipo:", + "LabelProfileContainer": "Contenedor:", + "LabelProfileVideoCodecs": "Codecs de video:", + "LabelProfileAudioCodecs": "Codecs de audio:", "LabelProfileCodecs": "Codecs:", - "HeaderDirectPlayProfile": "Direct Play Profile", - "HeaderTranscodingProfile": "Transcoding Profile", - "HeaderCodecProfile": "Codec Profile", - "HeaderCodecProfileHelp": "Codec profiles indicate the limitations of a device when playing specific codecs. If a limitation applies then the media will be transcoded, even if the codec is configured for direct play.", - "HeaderContainerProfile": "Container Profile", - "HeaderContainerProfileHelp": "Container profiles indicate the limitations of a device when playing specific formats. If a limitation applies then the media will be transcoded, even if the format is configured for direct play.", + "HeaderDirectPlayProfile": "Perfil de reproducci\u00f3n directa", + "HeaderTranscodingProfile": "Perfil de transcodificaci\u00f3n", + "HeaderCodecProfile": "Perfil de codec", + "HeaderCodecProfileHelp": "Perfiles de codec indican las limitaciones de un dispositivo cuando se reproducen codecs espec\u00edficos. Si se aplica una limitaci\u00f3n entonces el medio se transcodificar\u00e1, incluso si el codec est\u00e1 configurado para reproducci\u00f3n directa.", + "HeaderContainerProfile": "Perfil de contenedor", + "HeaderContainerProfileHelp": "Perfiles de codec indican las limitaciones de un dispositivo mientras reproduce formatos espec\u00edficos. If se aplica una limitaci\u00f3n entonces el medio se transcodificar\u00e1, incluso si el formato est\u00e1 configurado para reproducci\u00f3n directa.", "OptionProfileVideo": "Video", "OptionProfileAudio": "Audio", - "OptionProfileVideoAudio": "Video Audio", - "OptionProfilePhoto": "Photo", - "LabelUserLibrary": "User library:", - "LabelUserLibraryHelp": "Select which user library to display to the device. Leave empty to inherit the default setting.", - "OptionPlainStorageFolders": "Display all folders as plain storage folders", - "OptionPlainStorageFoldersHelp": "If enabled, all folders are represented in DIDL as \"object.container.storageFolder\" instead of a more specific type, such as \"object.container.person.musicArtist\".", - "OptionPlainVideoItems": "Display all videos as plain video items", - "OptionPlainVideoItemsHelp": "If enabled, all videos are represented in DIDL as \"object.item.videoItem\" instead of a more specific type, such as \"object.item.videoItem.movie\".", - "LabelSupportedMediaTypes": "Supported Media Types:", - "TabIdentification": "Identification", - "TabDirectPlay": "Direct Play", - "TabContainers": "Containers", + "OptionProfileVideoAudio": "Video audio", + "OptionProfilePhoto": "Foto", + "LabelUserLibrary": "Librer\u00eda de usuario:", + "LabelUserLibraryHelp": "Seleccione de qu\u00e9 usuario se utilizar\u00e1 la librer\u00eda en el dispositivo. D\u00e9jelo vac\u00edo para utilizar la configuraci\u00f3n por defecto.", + "OptionPlainStorageFolders": "Ver todas las carpetas como carpetas de almacenamiento sin formato.", + "OptionPlainStorageFoldersHelp": "Si est\u00e1 activado, todas las carpetas se representan en DIDL como \"object.container.storageFolder\" en lugar de un tipo m\u00e1s espec\u00edfico, como por ejemplo \"object.container.person.musicArtist\".", + "OptionPlainVideoItems": "Mostrar todos los videos como elementos de video sin formato", + "OptionPlainVideoItemsHelp": "Si est\u00e1 habilitado, todos los v\u00eddeos est\u00e1n representados en DIDL como \"object.item.videoItem\" en lugar de un tipo m\u00e1s espec\u00edfico, como por ejemplo \"object.item.videoItem.movie\".", + "LabelSupportedMediaTypes": "Tipos de medio soportados:", + "TabIdentification": "Identificaci\u00f3n", + "TabDirectPlay": "Reproducci\u00f3n directa", + "TabContainers": "Contenedores", "TabCodecs": "Codecs", - "TabResponses": "Responses", - "HeaderProfileInformation": "Profile Information", - "LabelEmbedAlbumArtDidl": "Embed album art in Didl", - "LabelEmbedAlbumArtDidlHelp": "Some devices prefer this method for obtaining album art. Others may fail to play with this option enabled.", - "LabelAlbumArtPN": "Album art PN:", - "LabelAlbumArtHelp": "PN used for album art, within the dlna:profileID attribute on upnp:albumArtURI. Some clients require a specific value, regardless of the size of the image.", - "LabelAlbumArtMaxWidth": "Album art max width:", - "LabelAlbumArtMaxWidthHelp": "Max resolution of album art exposed via upnp:albumArtURI.", - "LabelAlbumArtMaxHeight": "Album art max height:", - "LabelAlbumArtMaxHeightHelp": "Max resolution of album art exposed via upnp:albumArtURI.", - "LabelIconMaxWidth": "Icon max width:", - "LabelIconMaxWidthHelp": "Max resolution of icons exposed via upnp:icon.", - "LabelIconMaxHeight": "Icon max height:", - "LabelIconMaxHeightHelp": "Max resolution of icons exposed via upnp:icon.", - "LabelIdentificationFieldHelp": "A case-insensitive substring or regex expression.", - "HeaderProfileServerSettingsHelp": "These values control how Media Browser will present itself to the device.", - "LabelMaxBitrate": "Max bitrate:", - "LabelMaxBitrateHelp": "Specify a max bitrate in bandwidth constrained environments, or if the device imposes it's own limit.", - "OptionIgnoreTranscodeByteRangeRequests": "Ignore transcode byte range requests", - "OptionIgnoreTranscodeByteRangeRequestsHelp": "If enabled, these requests will be honored but will ignore the byte range header.", - "LabelFriendlyName": "Friendly name", - "LabelManufacturer": "Manufacturer", - "LabelManufacturerUrl": "Manufacturer url", - "LabelModelName": "Model name", - "LabelModelNumber": "Model number", - "LabelModelDescription": "Model description", - "LabelModelUrl": "Model url", - "LabelSerialNumber": "Serial number", - "LabelDeviceDescription": "Device description", - "HeaderIdentificationCriteriaHelp": "Enter at least one identification criteria.", - "HeaderDirectPlayProfileHelp": "Add direct play profiles to indicate which formats the device can handle natively.", - "HeaderTranscodingProfileHelp": "Add transcoding profiles to indicate which formats should be used when transcoding is required.", - "HeaderResponseProfileHelp": "Response profiles provide a way to customize information sent to the device when playing certain kinds of media.", + "TabResponses": "Respuestas", + "HeaderProfileInformation": "Informaci\u00f3n del perfil", + "LabelEmbedAlbumArtDidl": "Incorporar la car\u00e1tula del \u00e1lbum en didl", + "LabelEmbedAlbumArtDidlHelp": "Algunos dispositivos prefieren este m\u00e9todo para obtener la car\u00e1tula del \u00e1lbum. Otros pueden fallar al reproducir con esta opci\u00f3n habilitada.", + "LabelAlbumArtPN": "Car\u00e1tula del album PN:", + "LabelAlbumArtHelp": "PN utilizado para la car\u00e1tula del \u00e1lbum, dentro del atributo dlna:profileID en upnp:albumArtURI. Algunos clientes requieren un valor espec\u00edfico, independientemente del tama\u00f1o de la imagen.", + "LabelAlbumArtMaxWidth": "Anchura m\u00e1xima de la car\u00e1tula del album:", + "LabelAlbumArtMaxWidthHelp": "Resoluci\u00f3n m\u00e1xima de la car\u00e1tula del \u00e1lbum expuesta a trav\u00e9s de upnp:albumArtURI.", + "LabelAlbumArtMaxHeight": "Altura m\u00e1xima de la car\u00e1tula del album:", + "LabelAlbumArtMaxHeightHelp": "Resoluci\u00f3n m\u00e1xima de la car\u00e1tula del \u00e1lbum expuesta a trav\u00e9s de upnp:albumArtURI.", + "LabelIconMaxWidth": "Anchura m\u00e1xima de icono:", + "LabelIconMaxWidthHelp": "Resoluci\u00f3n m\u00e1xima de los iconos expuestos via upnp:icon.", + "LabelIconMaxHeight": "Altura m\u00e1xima de icono:", + "LabelIconMaxHeightHelp": "Resoluci\u00f3n m\u00e1xima de los iconos expuestos via upnp:icon.", + "LabelIdentificationFieldHelp": "Una subcadena insensible a may\u00fasculas o min\u00fasculas o una expresi\u00f3n regex.", + "HeaderProfileServerSettingsHelp": "Estos valores controlan el modo en que Media Browser se presentar\u00e1 en el dispositivo.", + "LabelMaxBitrate": "Bitrate m\u00e1ximo:", + "LabelMaxBitrateHelp": "Especificar una tasa de bits m\u00e1xima en entornos de ancho de banda limitado, o si el dispositivo impone su propio l\u00edmite.", + "OptionIgnoreTranscodeByteRangeRequests": "Ignorar las solicitudes de intervalo de bytes de transcodificaci\u00f3n", + "OptionIgnoreTranscodeByteRangeRequestsHelp": "Si est\u00e1 activado, estas solicitudes ser\u00e1n atendidas pero ignorar\u00e1n el encabezado de intervalo de bytes.", + "LabelFriendlyName": "Nombre amigable", + "LabelManufacturer": "Fabricante", + "LabelManufacturerUrl": "Url del fabricante", + "LabelModelName": "Nombre de modelo", + "LabelModelNumber": "N\u00famero de modelo", + "LabelModelDescription": "Descripci\u00f3n de modelo", + "LabelModelUrl": "Url del modelo", + "LabelSerialNumber": "N\u00famero de serie", + "LabelDeviceDescription": "Descripci\u00f3n del dispositivo", + "HeaderIdentificationCriteriaHelp": "Entre al menos un criterio de identificaci\u00f3n.", + "HeaderDirectPlayProfileHelp": "A\u00f1adir perfiles de reproducci\u00f3n directa para indicar qu\u00e9 formatos puede utilizar el dispositivo de forma nativa.", + "HeaderTranscodingProfileHelp": "A\u00f1adir perfiles de transcodificaci\u00f3n para indicar qu\u00e9 formatos se deben utilizar cuando se requiera transcodificaci\u00f3n.", + "HeaderResponseProfileHelp": "Perfiles de respuesta proporcionan una forma de personalizar la informaci\u00f3n que se env\u00eda al dispositivo cuando se reproducen ciertos tipos de medios.", "LabelXDlnaCap": "X-Dlna cap:", - "LabelXDlnaCapHelp": "Determines the content of the X_DLNACAP element in the urn:schemas-dlna-org:device-1-0 namespace.", + "LabelXDlnaCapHelp": "Determina el contenido del elemento X_DLNACAP en el espacio de nombre urn:schemas-dlna-org:device-1-0.", "LabelXDlnaDoc": "X-Dlna doc:", - "LabelXDlnaDocHelp": "Determines the content of the X_DLNADOC element in the urn:schemas-dlna-org:device-1-0 namespace.", - "LabelSonyAggregationFlags": "Sony aggregation flags:", - "LabelSonyAggregationFlagsHelp": "Determines the content of the aggregationFlags element in the urn:schemas-sonycom:av namespace.", - "LabelTranscodingContainer": "Container:", - "LabelTranscodingVideoCodec": "Video codec:", - "LabelTranscodingVideoProfile": "Video profile:", - "LabelTranscodingAudioCodec": "Audio codec:", - "OptionEnableM2tsMode": "Enable M2ts mode", - "OptionEnableM2tsModeHelp": "Enable m2ts mode when encoding to mpegts.", - "OptionEstimateContentLength": "Estimate content length when transcoding", - "OptionReportByteRangeSeekingWhenTranscoding": "Report that the server supports byte seeking when transcoding", - "OptionReportByteRangeSeekingWhenTranscodingHelp": "This is required for some devices that don't time seek very well.", - "HeaderSubtitleDownloadingHelp": "When Media Browser scans your video files it can search for missing subtitles, and download them using a subtitle provider such as OpenSubtitles.org.", - "HeaderDownloadSubtitlesFor": "Download subtitles for:", - "LabelRequireTextSubtitles": "Download even if the video already contains graphical subtitles", - "LabelRequireTextSubtitlesHelp": "Keeping text versions of subtitles will result in more efficient delivery to mobile clients.", - "TabSubtitles": "Subtitles", - "LabelOpenSubtitlesUsername": "Open Subtitles username:", - "LabelOpenSubtitlesPassword": "Open Subtitles password:", - "LabelAudioLanguagePreferenceHelp": "If empty, the default audio track will be selected, regardless of language.", - "LabelDownloadLanguages": "Download languages:", - "ButtonRegister": "Register", - "HeaderSubtitleDownloadingMoreHelp": "Subtitles are considered missing when the audio track is in a foreign language, and there are no subtitles available in the preferred language." + "LabelXDlnaDocHelp": "Determina el contenido del elemento X_DLNADOC en el espacio de nombreurn:schemas-dlna-org:device-1-0.", + "LabelSonyAggregationFlags": "Agregaci\u00f3n de banderas Sony:", + "LabelSonyAggregationFlagsHelp": "Determina el contenido del elemento aggregationFlags en el espacio de nombre urn:schemas-sonycom:av.", + "LabelTranscodingContainer": "Contenedor:", + "LabelTranscodingVideoCodec": "Codec de video:", + "LabelTranscodingVideoProfile": "Perfil de video:", + "LabelTranscodingAudioCodec": "Codec de audio:", + "OptionEnableM2tsMode": "Activar modo M2ts", + "OptionEnableM2tsModeHelp": "Activar modo m2ts cuando se codifique a mpegts", + "OptionEstimateContentLength": "Estimar longitud del contenido al transcodificar", + "OptionReportByteRangeSeekingWhenTranscoding": "Indicar que el servidor soporta la b\u00fasqueda de byte al transcodificar", + "OptionReportByteRangeSeekingWhenTranscodingHelp": "Esto es necesario para algunos dispositivos que no buscan el tiempo muy bien.", + "HeaderSubtitleDownloadingHelp": "Cuando Media Browser escanea los archivos de v\u00eddeo, puede buscar subt\u00edtulos faltantes y descargarlos usando un proveedor de subt\u00edtulos como OpenSubtitles.org.", + "HeaderDownloadSubtitlesFor": "Descarga subt\u00edtulos para:", + "LabelSkipIfGraphicalSubsPresent": "Skip if the video already contains graphical subtitles", + "LabelSkipIfGraphicalSubsPresentHelp": "Keeping text versions of subtitles will result in more efficient delivery to mobile clients.", + "TabSubtitles": "Subt\u00edtulos", + "LabelOpenSubtitlesUsername": "Usuario de Open Subtitles:", + "LabelOpenSubtitlesPassword": "Contrase\u00f1a de Open Subtitles:", + "LabelAudioLanguagePreferenceHelp": "Si est\u00e1 vac\u00edo, se seleccionar\u00e1 la pista de audio por defecto, sin importar el idioma.", + "LabelDownloadLanguages": "Idiomas de descarga:", + "ButtonRegister": "Registrar", + "LabelSkipIfAudioTrackPresent": "Skip if the default audio track matches the download language", + "LabelSkipIfAudioTrackPresentHelp": "Uncheck this to ensure all videos have subtitles, regardless of audio language.", + "HeaderSendMessage": "Send Message", + "ButtonSend": "Send", + "LabelMessageText": "Message text:" } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/Server/es_MX.json b/MediaBrowser.Server.Implementations/Localization/Server/es_MX.json index b8ffeb79c..b3b803fa9 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/es_MX.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/es_MX.json @@ -514,7 +514,7 @@ "ErrorConnectingToMediaBrowserRepository": "Ocurri\u00f3 un error al conectarse remotamente al repositorio de Media Browser,", "LabelComponentsUpdated": "Los siguientes componentes han sido instalados o actualizados:", "MessagePleaseRestartServerToFinishUpdating": "Por favor reinicie el servidor para completar la aplicaci\u00f3n de las actualizaciones.", - "LabelDownMixAudioScale": "Escala de fortalecimiento de audio para down mix:", + "LabelDownMixAudioScale": "Fortalecimiento de audio durante el downmix:", "LabelDownMixAudioScaleHelp": "Fortalezca el audio cuando se hace down mix. Coloque 1 para preservar el valor del volumen original.", "ButtonLinkKeys": "Ligar Claves:", "LabelOldSupporterKey": "Clave de aficionado vieja", @@ -564,6 +564,7 @@ "NotificationOptionTaskFailed": "Falla de tarea programada", "NotificationOptionInstallationFailed": "Falla de instalaci\u00f3n", "NotificationOptionNewLibraryContent": "Adici\u00f3n de nuevos contenidos", + "NotificationOptionNewLibraryContentMultiple": "New content added (multiple)", "SendNotificationHelp": "Por defecto, las notificaciones son enviadas a la bandeja de entrada del panel de control. Navegue el cat\u00e1logo de complementos para instalar opciones de notificaci\u00f3n adicionales.", "NotificationOptionServerRestartRequired": "Reinicio del servidor requerido", "LabelNotificationEnabled": "Habilitar esta notificaci\u00f3n", @@ -653,7 +654,7 @@ "LabelEmbedAlbumArtDidl": "Incrustar arte del \u00e1lbum en DIDL", "LabelEmbedAlbumArtDidlHelp": "Algunos dispositivos prefieren este m\u00e9todo para obtener arte del \u00e1lbum. Otros podr\u00edan fallar al reproducir con esta opci\u00f3n habilitada.", "LabelAlbumArtPN": "PN para arte del \u00e1lbum:", - "LabelAlbumArtHelp": "PN usado para arte del \u00e1lbum, dento del atributo dlna:profileID en upnp:albumArtURI. Algunos clientes requeren valores espec\u00edficos, sin importar el tama\u00f1o de la imagen.", + "LabelAlbumArtHelp": "PN usado para arte del \u00e1lbum, dento del atributo dlna:profileID en upnp:albumArtURI. Algunos clientes requeren valores espec\u00edficos, independientemente del tama\u00f1o de la imagen.", "LabelAlbumArtMaxWidth": "Ancho m\u00e1ximo para arte del \u00e1lbum:", "LabelAlbumArtMaxWidthHelp": "M\u00e1xima resoluci\u00f3n para arte del album expuesta via upnp:albumArtURI.", "LabelAlbumArtMaxHeight": "Altura m\u00e1xima para arte del \u00e1lbum:", @@ -696,15 +697,19 @@ "OptionEstimateContentLength": "Estimar la duraci\u00f3n del contenido cuando se transcodifica", "OptionReportByteRangeSeekingWhenTranscoding": "Reportar que el servidor soporta busqueda de bytes al transcodificar", "OptionReportByteRangeSeekingWhenTranscodingHelp": "Esto es requerido para algunos dispositivos que no pueden hacer b\u00fasquedas por tiempo muy bien.", - "HeaderSubtitleDownloadingHelp": "When Media Browser scans your video files it can search for missing subtitles, and download them using a subtitle provider such as OpenSubtitles.org.", - "HeaderDownloadSubtitlesFor": "Download subtitles for:", - "LabelRequireTextSubtitles": "Download even if the video already contains graphical subtitles", - "LabelRequireTextSubtitlesHelp": "Keeping text versions of subtitles will result in more efficient delivery to mobile clients.", - "TabSubtitles": "Subtitles", - "LabelOpenSubtitlesUsername": "Open Subtitles username:", - "LabelOpenSubtitlesPassword": "Open Subtitles password:", - "LabelAudioLanguagePreferenceHelp": "If empty, the default audio track will be selected, regardless of language.", - "LabelDownloadLanguages": "Download languages:", - "ButtonRegister": "Register", - "HeaderSubtitleDownloadingMoreHelp": "Subtitles are considered missing when the audio track is in a foreign language, and there are no subtitles available in the preferred language." + "HeaderSubtitleDownloadingHelp": "Cuando Media Browser examina sus archivos de video puede buscar los subt\u00edtulos faltantes, y descargarlos usando un proveedor de subt\u00edtulos como OpenSubtitles.org.", + "HeaderDownloadSubtitlesFor": "Descargar subt\u00edtulos para:", + "LabelSkipIfGraphicalSubsPresent": "Omitir si el video ya contiene subt\u00edtulos gr\u00e1ficos", + "LabelSkipIfGraphicalSubsPresentHelp": "Mantener versiones de texto de los subt\u00edtulos resultar\u00e1 en una entrega m\u00e1s eficiente para clientes m\u00f3viles.", + "TabSubtitles": "Subt\u00edtulos", + "LabelOpenSubtitlesUsername": "Nombre de usuario de Open Subtitles:", + "LabelOpenSubtitlesPassword": "Contrase\u00f1a de Open Subtitles:", + "LabelAudioLanguagePreferenceHelp": "Si se deja vac\u00edo, la pista de audio por defecto ser\u00e1 seleccionada, independientemente del lenguaje.", + "LabelDownloadLanguages": "Descargar lenguajes:", + "ButtonRegister": "Registrar", + "LabelSkipIfAudioTrackPresent": "Omitir si la pista de audio por defecto coincide con el lenguaje de descarga", + "LabelSkipIfAudioTrackPresentHelp": "Desactive esto para asegurar que todos los videos tengan subt\u00edtulos, independientemente del lenguaje del audio.", + "HeaderSendMessage": "Send Message", + "ButtonSend": "Send", + "LabelMessageText": "Message text:" } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/Server/fr.json b/MediaBrowser.Server.Implementations/Localization/Server/fr.json index 65c682d3d..ce3447a88 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/fr.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/fr.json @@ -76,7 +76,7 @@ "LabelMaxParentalRating": "Note maximale d'\u00e9valuation de contr\u00f4le parental:", "MaxParentalRatingHelp": "Le contenu avec une note d'\u00e9valuation de contr\u00f4le parental plus \u00e9lev\u00e9e ne sera pas visible par cet utilisateur.", "LibraryAccessHelp": "Selectionnez le r\u00e9pertoire de m\u00e9dia \u00e0 partager avec cet utilisateur. Les administrateurs pourront modifier tous les r\u00e9pertoires en utilisant le gestionnaire de m\u00e9tadonn\u00e9es.", - "ChannelAccessHelp": "Select the channels to share with this user. Administrators will be able to edit all channels using the metadata manager.", + "ChannelAccessHelp": "S\u00e9lectionner les cha\u00eenes \u00e0 partager avec cet utilisateur. Les administrateurs pourront modifier toutes les cha\u00eenes par le gestionnaire de m\u00e9tadonn\u00e9es.", "ButtonDeleteImage": "Supprimer Image", "LabelSelectUsers": "S\u00e9lectionner utilisateurs:", "ButtonUpload": "Envoyer", @@ -415,10 +415,10 @@ "LabelEnableDlnaDebugLoggingHelp": "Ceci va g\u00e9n\u00e9rer de gros fichiers de journal d'\u00e9v\u00e9nements et ne devrait \u00eatre utiliser seulement pour des besoins de diagnostique de probl\u00e8mes...", "LabelEnableDlnaClientDiscoveryInterval": "Intervalle de d\u00e9couverte des clients (secondes)", "LabelEnableDlnaClientDiscoveryIntervalHelp": "D\u00e9terminez la dur\u00e9e en secondes de l\u2019intervalle entre les recherches SSDP effectu\u00e9es par Media Browser.", - "HeaderCustomDlnaProfiles": "Profiles personnalis\u00e9s", + "HeaderCustomDlnaProfiles": "Profils personnalis\u00e9s", "HeaderSystemDlnaProfiles": "Profils syst\u00e8mes", - "CustomDlnaProfilesHelp": "Cr\u00e9er un profile personnalis\u00e9 pour cibler un appareil ou remplacer un profile syst\u00e8me.", - "SystemDlnaProfilesHelp": "Les profils syst\u00e8mes sont en lecture seule. Pour remplacer un profile syst\u00e8me, cr\u00e9ez un profil personnalis\u00e9 ciblant le m\u00eame appareil.", + "CustomDlnaProfilesHelp": "Cr\u00e9er un profil personnalis\u00e9 pour cibler un appareil ou remplacer un profile syst\u00e8me.", + "SystemDlnaProfilesHelp": "Les profils syst\u00e8mes sont en lecture seule. Pour remplacer un profil syst\u00e8me, cr\u00e9ez un profil personnalis\u00e9 ciblant le m\u00eame appareil.", "TitleDashboard": "Tableau de bord", "TabHome": "Principal", "TabInfo": "Info", @@ -514,13 +514,13 @@ "ErrorConnectingToMediaBrowserRepository": "Une erreur est survenue avec la connexion au r\u00e9f\u00e9rentiel de donn\u00e9es de Media Browser.", "LabelComponentsUpdated": "Les composants suivants ont \u00e9t\u00e9 install\u00e9s ou mis \u00e0 jour.", "MessagePleaseRestartServerToFinishUpdating": "SVP red\u00e9marrer le serveur pour appliquer les mises \u00e0 jour.", - "LabelDownMixAudioScale": "Down mix audio boost scale:", - "LabelDownMixAudioScaleHelp": "Boost audio when downmixing. Set to 1 to preserve original volume value.", + "LabelDownMixAudioScale": "Boost audio lors de downmix:", + "LabelDownMixAudioScaleHelp": "Boost audio lors de downmix. Mettre \u00e0 1 pour pr\u00e9server la valeur originale du volume.", "ButtonLinkKeys": "Lier les cl\u00e9s", "LabelOldSupporterKey": "Ancienne cl\u00e9 de supporteur", "LabelNewSupporterKey": "Nouvelle cl\u00e9 de supporteur", "HeaderMultipleKeyLinking": "Lien de cl\u00e9s multiples", - "MultipleKeyLinkingHelp": "If you have more than one supporter key, use this form to link the old key's registrations with your new one.", + "MultipleKeyLinkingHelp": "Si vous avez plus qu'une cl\u00e9 de supporteur, utilisez ce formulaire pour lier l'ancienne cl\u00e9 d'enregistrement avec la nouvelle.", "LabelCurrentEmailAddress": "Adresse courriel actuelle", "LabelCurrentEmailAddressHelp": "L'adresse courriel actuelle \u00e0 laquelle votre nouvelle cl\u00e9 a \u00e9t\u00e9 envoy\u00e9e.", "HeaderForgotKey": "Oubli\u00e9 cl\u00e9", @@ -528,19 +528,19 @@ "LabelSupporterEmailAddress": "L'adresse courriel avec laquelle la cl\u00e9 a \u00e9t\u00e9 achet\u00e9e.", "ButtonRetrieveKey": "obtenir la cl\u00e9", "LabelSupporterKey": "Cl\u00e9 de supporteur (coller du courriel)", - "LabelSupporterKeyHelp": "Enter your supporter key to start enjoying additional benefits the community has developed for Media Browser.", + "LabelSupporterKeyHelp": "Entrez votre cl\u00e9 du supporteur pour commencer \u00e0 profiter des b\u00e9n\u00e9fices additionnels que la communaut\u00e9 a d\u00e9velopp\u00e9 pour Media Browser.", "MessageInvalidKey": "Cl\u00e9 MB3 manquante ou invalide", - "ErrorMessageInvalidKey": "In order for any premium content to be registered, you must also be an MB3 Supporter. Please donate and support the continued development of the core product. Thank you.", + "ErrorMessageInvalidKey": "Pour que le contenu premium soit enregistr\u00e9, vous devez aussi \u00eatre supporteur MB3. S'il vous plait effectuez des dons et soutenez la continuation du d\u00e9veloppement de Media Browser.", "HeaderDisplaySettings": "Param\u00e8tres d'affichage", "TabPlayTo": "Lire sur", "LabelEnableDlnaServer": "Activer le serveur DLNA", - "LabelEnableDlnaServerHelp": "Allows UPnP devices on your network to browse and play Media Browser content.", - "LabelEnableBlastAliveMessages": "Blast alive messages", - "LabelEnableBlastAliveMessagesHelp": "Enable this if the server is not detected reliably by other UPnP devices on your network.", - "LabelBlastMessageInterval": "Alive message interval (seconds)", - "LabelBlastMessageIntervalHelp": "Determines the duration in seconds between server alive messages.", + "LabelEnableDlnaServerHelp": "Authorise les appareils UPnP sur le r\u00e9seau \u00e0 naviguer et lire le contenu Media Browser.", + "LabelEnableBlastAliveMessages": "Diffuser des message de pr\u00e9sence", + "LabelEnableBlastAliveMessagesHelp": "Activer cette option si le serveur n'est pas d\u00e9tect\u00e9 correctement ou par intermittence par d'autre appareil UPnP sur le r\u00e9seau. ", + "LabelBlastMessageInterval": "Intervalles des messages de pr\u00e9sence (secondes):", + "LabelBlastMessageIntervalHelp": "D\u00e9termine la dur\u00e9e en secondes entre les message de pr\u00e9sences.", "LabelDefaultUser": "Utilisateur par d\u00e9faut:", - "LabelDefaultUserHelp": "Determines which user library should be displayed on connected devices. This can be overridden for each device using profiles.", + "LabelDefaultUserHelp": "D\u00e9termine quelle biblioth\u00e8que d'utilisateur doit \u00eatre afficher sur les appareils connect\u00e9s. Ces param\u00e8tres peuvent \u00eatre remplac\u00e9s pour chaque appareil par les configurations de profils.", "TitleDlna": "DLNA", "HeaderServerSettings": "Param\u00e8tres du serveur", "LabelWeatherDisplayLocation": "Emplacement de l'affichage de la m\u00e9t\u00e9o:", @@ -564,6 +564,7 @@ "NotificationOptionTaskFailed": "\u00c9chec de t\u00e2che programm\u00e9e", "NotificationOptionInstallationFailed": "\u00c9chec d'installation", "NotificationOptionNewLibraryContent": "Nouveau contenu ajout\u00e9", + "NotificationOptionNewLibraryContentMultiple": "Nouveau contenu ajout\u00e9 (multiple)", "SendNotificationHelp": "Par d\u00e9faut, les notifications sont d\u00e9livr\u00e9es dans la bo\u00eete de r\u00e9ception du tableau de bord. Consultez le catalogue de plugins pour installer des options de notifications suppl\u00e9mentaires.", "NotificationOptionServerRestartRequired": "Un red\u00e9marrage du serveur est requis", "LabelNotificationEnabled": "Activer cette notification", @@ -576,7 +577,7 @@ "CategoryApplication": "Application", "CategoryPlugin": "Plugin", "LabelMessageTitle": "Titre du message:", - "LabelAvailableTokens": "Available tokens:", + "LabelAvailableTokens": "Jetons disponibles:", "AdditionalNotificationServices": "Visitez le catalogue de plugins pour installer des service de notifications suppl\u00e9mentaires.", "OptionAllUsers": "Tous les utilisateurs", "OptionAdminUsers": "Administrateurs", @@ -603,9 +604,9 @@ "ButtonFullscreen": "Plein \u00e9cran", "ButtonScenes": "Sc\u00e8nes", "ButtonSubtitles": "Sous-titres", - "ButtonAudioTracks": "Audio tracks", - "ButtonPreviousTrack": "Previous track", - "ButtonNextTrack": "Next track", + "ButtonAudioTracks": "Piste audio", + "ButtonPreviousTrack": "Piste pr\u00e9c\u00e9dante", + "ButtonNextTrack": "Piste suivante", "ButtonStop": "Arr\u00eat", "ButtonPause": "Pause", "LabelGroupMoviesIntoCollections": "Grouper les films en collections", @@ -621,51 +622,51 @@ "HeaderMyLibrary": "Ma biblioth\u00e8que", "LabelProfileCodecsHelp": "S\u00e9par\u00e9s par des virgules. Peut \u00eatre laiss\u00e9 vide pour appliquer tous les codecs.", "LabelProfileContainersHelp": "S\u00e9par\u00e9s par des virgules. Peut \u00eatre laiss\u00e9 vide pour appliquer tous les conteneurs.", - "HeaderResponseProfile": "Profile de r\u00e9ponse", + "HeaderResponseProfile": "Profil de r\u00e9ponse", "LabelType": "Type:", "LabelProfileContainer": "Conteneur:", "LabelProfileVideoCodecs": "Codecs vid\u00e9os:", "LabelProfileAudioCodecs": "Codecs audios:", "LabelProfileCodecs": "Codecs:", - "HeaderDirectPlayProfile": "Profile de lecture directe (Direct Play):", - "HeaderTranscodingProfile": "Profile de transcodage:", - "HeaderCodecProfile": "Profile de codecs", - "HeaderCodecProfileHelp": "Les profiles de codecs sp\u00e9cifient les limites de lecture de codecs sp\u00e9cifiques d'un appareil. Si la limite s'applique, le m\u00e9dia sera transcod\u00e9, m\u00eame si le codec est configur\u00e9 pour des lectures directes.", - "HeaderContainerProfile": "Profile de conteneur", - "HeaderContainerProfileHelp": "Container profiles indicate the limitations of a device when playing specific formats. If a limitation applies then the media will be transcoded, even if the format is configured for direct play.", + "HeaderDirectPlayProfile": "Profil de lecture directe (Direct Play):", + "HeaderTranscodingProfile": "Profil de transcodage:", + "HeaderCodecProfile": "Profil de codecs", + "HeaderCodecProfileHelp": "Les profils de codecs sp\u00e9cifient les limites de lecture de codecs sp\u00e9cifiques d'un appareil. Si la limite s'applique, le m\u00e9dia sera transcod\u00e9, m\u00eame si le codec est configur\u00e9 pour des lectures directes.", + "HeaderContainerProfile": "Profil de conteneur", + "HeaderContainerProfileHelp": "Les profils de conteneur indique les limites d'un appareil lors de lectures de formats sp\u00e9cifiques. Si la limite s'applique au m\u00e9dia, ce dernier sera transcod\u00e9, m\u00eame si le format est configur\u00e9 pour faire de la lecture directe.", "OptionProfileVideo": "Vid\u00e9o", "OptionProfileAudio": "Audio", "OptionProfileVideoAudio": "Vid\u00e9o Audio", "OptionProfilePhoto": "Photo", "LabelUserLibrary": "Biblioth\u00e8que de l'utilisateur:", - "LabelUserLibraryHelp": "Select which user library to display to the device. Leave empty to inherit the default setting.", - "OptionPlainStorageFolders": "Display all folders as plain storage folders", - "OptionPlainStorageFoldersHelp": "If enabled, all folders are represented in DIDL as \"object.container.storageFolder\" instead of a more specific type, such as \"object.container.person.musicArtist\".", - "OptionPlainVideoItems": "Display all videos as plain video items", - "OptionPlainVideoItemsHelp": "If enabled, all videos are represented in DIDL as \"object.item.videoItem\" instead of a more specific type, such as \"object.item.videoItem.movie\".", + "LabelUserLibraryHelp": "S\u00e9lectionner quelle biblioth\u00e8que d'utilisateur \u00e0 afficher sur l'appareil. Laisser vide pour h\u00e9riter des param\u00e8tres par d\u00e9faut.", + "OptionPlainStorageFolders": "Afficher tous les r\u00e9pertoires en tant que simple r\u00e9pertoires de stockage.", + "OptionPlainStorageFoldersHelp": "Si activ\u00e9, tous les r\u00e9pertoires seront affich\u00e9s en DIDL en tant que \"object.container.storageFolder\" au lieu de formats plus sp\u00e9cifiques comme, par exemple \"object.container.person.musicArtist\".", + "OptionPlainVideoItems": "Afficher les vid\u00e9os en tant que simple items vid\u00e9os.", + "OptionPlainVideoItemsHelp": "Si activ\u00e9, tous les vid\u00e9os seront affich\u00e9s en DIDL en tant que \"object.item.videoItem\" au lieu de formats plus sp\u00e9cifiques comme, par exemple \"object.item.videoItem.movie\".", "LabelSupportedMediaTypes": "Types de m\u00e9dias support\u00e9s:", "TabIdentification": "Indentification", "TabDirectPlay": "Lecture directe", "TabContainers": "Conteneur", "TabCodecs": "Codecs", "TabResponses": "R\u00e9ponses", - "HeaderProfileInformation": "Information de profile", - "LabelEmbedAlbumArtDidl": "Embed album art in Didl", - "LabelEmbedAlbumArtDidlHelp": "Some devices prefer this method for obtaining album art. Others may fail to play with this option enabled.", - "LabelAlbumArtPN": "Album art PN:", - "LabelAlbumArtHelp": "PN used for album art, within the dlna:profileID attribute on upnp:albumArtURI. Some clients require a specific value, regardless of the size of the image.", - "LabelAlbumArtMaxWidth": "Album art max width:", - "LabelAlbumArtMaxWidthHelp": "Max resolution of album art exposed via upnp:albumArtURI.", - "LabelAlbumArtMaxHeight": "Album art max height:", - "LabelAlbumArtMaxHeightHelp": "Max resolution of album art exposed via upnp:albumArtURI.", - "LabelIconMaxWidth": "Icon max width:", - "LabelIconMaxWidthHelp": "Max resolution of icons exposed via upnp:icon.", - "LabelIconMaxHeight": "Icon max height:", - "LabelIconMaxHeightHelp": "Max resolution of icons exposed via upnp:icon.", - "LabelIdentificationFieldHelp": "A case-insensitive substring or regex expression.", - "HeaderProfileServerSettingsHelp": "These values control how Media Browser will present itself to the device.", - "LabelMaxBitrate": "Max bitrate:", - "LabelMaxBitrateHelp": "Specify a max bitrate in bandwidth constrained environments, or if the device imposes it's own limit.", + "HeaderProfileInformation": "Information de profil", + "LabelEmbedAlbumArtDidl": "Int\u00e9grer les images d'album dans Didl", + "LabelEmbedAlbumArtDidlHelp": "Certains appareils pr\u00e9f\u00e8rent cette m\u00e9thode pour obtenir les images d'album. D'autre, par contre, pourraient ne pas pouvoir les lire avec cette options activ\u00e9e.", + "LabelAlbumArtPN": "PN d'images d'album:", + "LabelAlbumArtHelp": "PN utilis\u00e9 pour les images d'album, dans l\u2019attribut dlna:profileID de upnp:albumArtURi. Certains client n\u00e9cessite une valeur sp\u00e9cifique, peu importe la grosseur de l'image.", + "LabelAlbumArtMaxWidth": "Largeur maximum des images d'album:", + "LabelAlbumArtMaxWidthHelp": "R\u00e9solution maximum des images d'album expos\u00e9e par upnp:albumArtURI.", + "LabelAlbumArtMaxHeight": "Hauteur maximum des images d'album:", + "LabelAlbumArtMaxHeightHelp": "R\u00e9solution maximum des images d'album expos\u00e9e par upnp:albumArtURI.", + "LabelIconMaxWidth": "Largeur maximum des ic\u00f4nes:", + "LabelIconMaxWidthHelp": "R\u00e9solution maximum des ic\u00f4nes expos\u00e9e par upnp:icon.", + "LabelIconMaxHeight": "hauteur maximum des ic\u00f4nes:", + "LabelIconMaxHeightHelp": "R\u00e9solution maximum des ic\u00f4nes expos\u00e9e par upnp:icon.", + "LabelIdentificationFieldHelp": "Une sous-cha\u00eene ou expression regex insensible \u00e0 la diff\u00e9rence minuscules-majuscules.", + "HeaderProfileServerSettingsHelp": "Ces valeurs contr\u00f4lent comment Media Browser sera pr\u00e9sent\u00e9 \u00e0 l'appareil.", + "LabelMaxBitrate": "D\u00e9bit maximum:", + "LabelMaxBitrateHelp": "Sp\u00e9cifiez un d\u00e9bit maximum dans les environnements avec bande passante limit\u00e9e ou si l'appareil impose sa propre limite.", "OptionIgnoreTranscodeByteRangeRequests": "Ignore transcode byte range requests", "OptionIgnoreTranscodeByteRangeRequestsHelp": "If enabled, these requests will be honored but will ignore the byte range header.", "LabelFriendlyName": "Surnom d'affichage", @@ -678,33 +679,37 @@ "LabelSerialNumber": "Num\u00e9ro de s\u00e9rie", "LabelDeviceDescription": "Description de l'appareil", "HeaderIdentificationCriteriaHelp": "Entrer au moins un crit\u00e8re d'identification.", - "HeaderDirectPlayProfileHelp": "Add direct play profiles to indicate which formats the device can handle natively.", - "HeaderTranscodingProfileHelp": "Add transcoding profiles to indicate which formats should be used when transcoding is required.", - "HeaderResponseProfileHelp": "Response profiles provide a way to customize information sent to the device when playing certain kinds of media.", - "LabelXDlnaCap": "X-Dlna cap:", - "LabelXDlnaCapHelp": "Determines the content of the X_DLNACAP element in the urn:schemas-dlna-org:device-1-0 namespace.", - "LabelXDlnaDoc": "X-Dlna doc:", - "LabelXDlnaDocHelp": "Determines the content of the X_DLNADOC element in the urn:schemas-dlna-org:device-1-0 namespace.", + "HeaderDirectPlayProfileHelp": "Ajoutez des profils de lecture directe pour sp\u00e9cifier quels formats l'appareil peut lire nativement.", + "HeaderTranscodingProfileHelp": "Ajoutez des profils de transcodage pour sp\u00e9cifier quels formats doit \u00eatre transcod\u00e9.", + "HeaderResponseProfileHelp": "Les profils de r\u00e9ponse permettent de personnaliser l'information envoy\u00e9e \u00e0 l'appareil lors de lecture de certains formats de m\u00e9dia.", + "LabelXDlnaCap": "Cap X-Dlna:", + "LabelXDlnaCapHelp": "D\u00e9termine le contenu des \u00e9l\u00e9ments X_DLNACAP dans l'espace de nom urn:schemas-dlna-org:device-1-0.", + "LabelXDlnaDoc": "Doc X-Dlna:", + "LabelXDlnaDocHelp": "D\u00e9termine le contenu des \u00e9l\u00e9ments X_DLNADOC dans l'espace de nom urn:schemas-dlna-org:device-1-0.", "LabelSonyAggregationFlags": "Sony aggregation flags:", - "LabelSonyAggregationFlagsHelp": "Determines the content of the aggregationFlags element in the urn:schemas-sonycom:av namespace.", + "LabelSonyAggregationFlagsHelp": "D\u00e9termine le contenu des \u00e9l\u00e9ments aggregationFlags dans l'espace de nom urn:schemas-sonycom:av .", "LabelTranscodingContainer": "Conteneur:", "LabelTranscodingVideoCodec": "Codec vid\u00e9o:", - "LabelTranscodingVideoProfile": "Profile vid\u00e9o:", + "LabelTranscodingVideoProfile": "Profil vid\u00e9o:", "LabelTranscodingAudioCodec": "Codec audio:", "OptionEnableM2tsMode": "Activer le mode M2ts", - "OptionEnableM2tsModeHelp": "Enable m2ts mode when encoding to mpegts.", - "OptionEstimateContentLength": "Estimate content length when transcoding", + "OptionEnableM2tsModeHelp": "Activ\u00e9 le mode m2ts lors d'encodage en mpegts.", + "OptionEstimateContentLength": "Estimer la dur\u00e9e du contenu lors d'encodage", "OptionReportByteRangeSeekingWhenTranscoding": "Report that the server supports byte seeking when transcoding", "OptionReportByteRangeSeekingWhenTranscodingHelp": "This is required for some devices that don't time seek very well.", - "HeaderSubtitleDownloadingHelp": "When Media Browser scans your video files it can search for missing subtitles, and download them using a subtitle provider such as OpenSubtitles.org.", - "HeaderDownloadSubtitlesFor": "Download subtitles for:", - "LabelRequireTextSubtitles": "Download even if the video already contains graphical subtitles", - "LabelRequireTextSubtitlesHelp": "Keeping text versions of subtitles will result in more efficient delivery to mobile clients.", - "TabSubtitles": "Subtitles", - "LabelOpenSubtitlesUsername": "Open Subtitles username:", - "LabelOpenSubtitlesPassword": "Open Subtitles password:", - "LabelAudioLanguagePreferenceHelp": "If empty, the default audio track will be selected, regardless of language.", - "LabelDownloadLanguages": "Download languages:", - "ButtonRegister": "Register", - "HeaderSubtitleDownloadingMoreHelp": "Subtitles are considered missing when the audio track is in a foreign language, and there are no subtitles available in the preferred language." + "HeaderSubtitleDownloadingHelp": "Lorsque Media Browser balaye vos fichiers vid\u00e9os, le serveur peut rechercher des sous-titres manquants et les t\u00e9l\u00e9charger en utilisant un fournisseur de sous-titre comme OpenSubtitles.org.", + "HeaderDownloadSubtitlesFor": "T\u00e9l\u00e9charger les sous-titres pour:", + "LabelSkipIfGraphicalSubsPresent": "Sauter le vid\u00e9o contient d\u00e9j\u00e0 des sous-titres graphiques", + "LabelSkipIfGraphicalSubsPresentHelp": "Garder des versions textes des sous-titres va \u00eatre plus efficace avec les appareils mobiles.", + "TabSubtitles": "Sous-titres:", + "LabelOpenSubtitlesUsername": "Nom d'utilisateur de Open Subtitles:", + "LabelOpenSubtitlesPassword": "Mot de passe de Open Subtitles:", + "LabelAudioLanguagePreferenceHelp": "Si laiss\u00e9 vide, la piste audio par d\u00e9faut sera s\u00e9lectionn\u00e9e, peu importe la langue.", + "LabelDownloadLanguages": "Langes de t\u00e9l\u00e9chargement:", + "ButtonRegister": "S'enregistrer", + "LabelSkipIfAudioTrackPresent": "Sauter si la piste audio correspond \u00e0 la langue de t\u00e9l\u00e9chargement", + "LabelSkipIfAudioTrackPresentHelp": "D\u00e9cocher cette option va assurer que tous les vid\u00e9os ont des sous-titres, peu importe la langue audio.", + "HeaderSendMessage": "Envoyer message", + "ButtonSend": "Envoyer", + "LabelMessageText": "Texte du message:" } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/Server/he.json b/MediaBrowser.Server.Implementations/Localization/Server/he.json index 08e9694ac..bf0398382 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/he.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/he.json @@ -564,6 +564,7 @@ "NotificationOptionTaskFailed": "\u05de\u05e9\u05d9\u05de\u05d4 \u05de\u05ea\u05d5\u05d6\u05de\u05e0\u05ea \u05e0\u05db\u05e9\u05dc\u05d4", "NotificationOptionInstallationFailed": "\u05d4\u05ea\u05e7\u05e0\u05d4 \u05e0\u05db\u05e9\u05dc\u05d4", "NotificationOptionNewLibraryContent": "\u05ea\u05d5\u05db\u05df \u05d7\u05d3\u05e9 \u05e0\u05d5\u05e1\u05e3", + "NotificationOptionNewLibraryContentMultiple": "New content added (multiple)", "SendNotificationHelp": "\u05d1\u05e8\u05d9\u05e8\u05ea \u05d4\u05de\u05d7\u05d3\u05dc \u05d4\u05d9\u05d0 \u05e9\u05d4\u05ea\u05e8\u05d0\u05d5\u05ea \u05de\u05d2\u05d9\u05e2\u05d5\u05ea \u05dc\u05ea\u05d9\u05d1\u05ea \u05d4\u05d3\u05d5\u05d0\u05e8 \u05d4\u05e0\u05db\u05e0\u05e1 \u05e9\u05dc \u05dc\u05d5\u05d7 \u05d4\u05d1\u05e7\u05e8\u05d4. \u05e2\u05d9\u05d9\u05df \u05d1\u05e7\u05d8\u05dc\u05d5\u05d2 \u05d4\u05ea\u05d5\u05e1\u05e4\u05d9\u05dd \u05db\u05d3\u05d9 \u05dc\u05d4\u05ea\u05e7\u05d9\u05df \u05d0\u05e4\u05e9\u05e8\u05d5\u05d9\u05d5\u05ea \u05e0\u05d5\u05e1\u05e4\u05d5\u05ea \u05dc\u05e7\u05d1\u05dc\u05ea \u05d4\u05ea\u05e8\u05d0\u05d5\u05ea", "NotificationOptionServerRestartRequired": "\u05e0\u05d3\u05e8\u05e9\u05ea \u05d4\u05e4\u05e2\u05dc\u05d4 \u05de\u05d7\u05d3\u05e9 \u05e9\u05dc \u05d4\u05e9\u05e8\u05ea", "LabelNotificationEnabled": "\u05d0\u05e4\u05e9\u05e8 \u05d4\u05ea\u05e8\u05d0\u05d4 \u05d6\u05d5", @@ -698,13 +699,17 @@ "OptionReportByteRangeSeekingWhenTranscodingHelp": "This is required for some devices that don't time seek very well.", "HeaderSubtitleDownloadingHelp": "When Media Browser scans your video files it can search for missing subtitles, and download them using a subtitle provider such as OpenSubtitles.org.", "HeaderDownloadSubtitlesFor": "Download subtitles for:", - "LabelRequireTextSubtitles": "Download even if the video already contains graphical subtitles", - "LabelRequireTextSubtitlesHelp": "Keeping text versions of subtitles will result in more efficient delivery to mobile clients.", + "LabelSkipIfGraphicalSubsPresent": "Skip if the video already contains graphical subtitles", + "LabelSkipIfGraphicalSubsPresentHelp": "Keeping text versions of subtitles will result in more efficient delivery to mobile clients.", "TabSubtitles": "Subtitles", "LabelOpenSubtitlesUsername": "Open Subtitles username:", "LabelOpenSubtitlesPassword": "Open Subtitles password:", "LabelAudioLanguagePreferenceHelp": "If empty, the default audio track will be selected, regardless of language.", "LabelDownloadLanguages": "Download languages:", "ButtonRegister": "Register", - "HeaderSubtitleDownloadingMoreHelp": "Subtitles are considered missing when the audio track is in a foreign language, and there are no subtitles available in the preferred language." + "LabelSkipIfAudioTrackPresent": "Skip if the default audio track matches the download language", + "LabelSkipIfAudioTrackPresentHelp": "Uncheck this to ensure all videos have subtitles, regardless of audio language.", + "HeaderSendMessage": "Send Message", + "ButtonSend": "Send", + "LabelMessageText": "Message text:" } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/Server/it.json b/MediaBrowser.Server.Implementations/Localization/Server/it.json index 3fe04913a..e9ca91b55 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/it.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/it.json @@ -564,6 +564,7 @@ "NotificationOptionTaskFailed": "Fallimento operazione pianificata", "NotificationOptionInstallationFailed": "errore di installazione", "NotificationOptionNewLibraryContent": "Nuovo contenuto aggiunto", + "NotificationOptionNewLibraryContentMultiple": "New content added (multiple)", "SendNotificationHelp": "Per impostazione predefinita, le notifiche vengono consegnate al cruscotto della Posta in arrivo . Sfoglia il catalogo plugin da installare opzioni di notifica aggiuntive.", "NotificationOptionServerRestartRequired": "Riavvio del server necessaria", "LabelNotificationEnabled": "Abilita questa notifica", @@ -698,13 +699,17 @@ "OptionReportByteRangeSeekingWhenTranscodingHelp": "Questo \u00e8 necessario per alcuni dispositivi che il tempo non cercano molto bene.", "HeaderSubtitleDownloadingHelp": "When Media Browser scans your video files it can search for missing subtitles, and download them using a subtitle provider such as OpenSubtitles.org.", "HeaderDownloadSubtitlesFor": "Download subtitles for:", - "LabelRequireTextSubtitles": "Download even if the video already contains graphical subtitles", - "LabelRequireTextSubtitlesHelp": "Keeping text versions of subtitles will result in more efficient delivery to mobile clients.", + "LabelSkipIfGraphicalSubsPresent": "Skip if the video already contains graphical subtitles", + "LabelSkipIfGraphicalSubsPresentHelp": "Keeping text versions of subtitles will result in more efficient delivery to mobile clients.", "TabSubtitles": "Subtitles", "LabelOpenSubtitlesUsername": "Open Subtitles username:", "LabelOpenSubtitlesPassword": "Open Subtitles password:", "LabelAudioLanguagePreferenceHelp": "If empty, the default audio track will be selected, regardless of language.", "LabelDownloadLanguages": "Download languages:", "ButtonRegister": "Register", - "HeaderSubtitleDownloadingMoreHelp": "Subtitles are considered missing when the audio track is in a foreign language, and there are no subtitles available in the preferred language." + "LabelSkipIfAudioTrackPresent": "Skip if the default audio track matches the download language", + "LabelSkipIfAudioTrackPresentHelp": "Uncheck this to ensure all videos have subtitles, regardless of audio language.", + "HeaderSendMessage": "Send Message", + "ButtonSend": "Send", + "LabelMessageText": "Message text:" } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/Server/kk.json b/MediaBrowser.Server.Implementations/Localization/Server/kk.json index 0316ca504..948569cf7 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/kk.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/kk.json @@ -564,6 +564,7 @@ "NotificationOptionTaskFailed": "\u0416\u043e\u0441\u043f\u0430\u0440\u043b\u0430\u0493\u0430\u043d \u0442\u0430\u043f\u0441\u044b\u0440\u043c\u0430 \u0441\u04d9\u0442\u0441\u0456\u0437\u0434\u0456\u0433\u0456", "NotificationOptionInstallationFailed": "\u041e\u0440\u043d\u0430\u0442\u0443 \u0441\u04d9\u0442\u0441\u0456\u0437\u0434\u0456\u0433\u0456", "NotificationOptionNewLibraryContent": "\u0416\u0430\u04a3\u0430 \u043c\u0430\u0437\u043c\u04b1\u043d \u04af\u0441\u0442\u0435\u043b\u0433\u0435\u043d", + "NotificationOptionNewLibraryContentMultiple": "New content added (multiple)", "SendNotificationHelp": "\u0425\u0430\u0431\u0430\u0440\u043b\u0430\u043d\u0434\u044b\u0440\u043c\u0430\u043b\u0430\u0440 \u0431\u0430\u049b\u044b\u043b\u0430\u0443 \u0442\u0430\u049b\u0442\u0430\u0441\u044b\u043d\u0434\u0430\u0493\u044b \u04d9\u0434\u0435\u043f\u043a\u0456 \u043a\u0456\u0440\u0456\u0441 \u0436\u04d9\u0448\u0456\u0433\u0456\u043d\u0435 \u0436\u0435\u0442\u043a\u0456\u0437\u0456\u043b\u0435\u0434\u0456. \u049a\u043e\u0441\u044b\u043c\u0448\u0430 \u0445\u0430\u0431\u0430\u0440\u043b\u0430\u043d\u0434\u044b\u0440\u0443 \u049b\u04b1\u0440\u0430\u043b\u0434\u0430\u0440\u044b\u043d \u043e\u0440\u043d\u0430\u0442\u0443 \u04af\u0448\u0456\u043d \u043f\u043b\u0430\u0433\u0438\u043d\u0434\u0435\u0440 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0456\u043d \u0448\u0430\u0440\u043b\u0430\u04a3\u044b\u0437.", "NotificationOptionServerRestartRequired": "\u0421\u0435\u0440\u0432\u0435\u0440\u0434\u0456 \u049b\u0430\u0439\u0442\u0430 \u0456\u0441\u043a\u0435 \u049b\u043e\u0441\u0443 \u049b\u0430\u0436\u0435\u0442", "LabelNotificationEnabled": "\u0411\u04b1\u043b \u0445\u0430\u0431\u0430\u0440\u043b\u0430\u043d\u0434\u044b\u0440\u043c\u0430\u043d\u044b \u049b\u043e\u0441\u0443", @@ -698,13 +699,17 @@ "OptionReportByteRangeSeekingWhenTranscodingHelp": "This is required for some devices that don't time seek very well.", "HeaderSubtitleDownloadingHelp": "When Media Browser scans your video files it can search for missing subtitles, and download them using a subtitle provider such as OpenSubtitles.org.", "HeaderDownloadSubtitlesFor": "Download subtitles for:", - "LabelRequireTextSubtitles": "Download even if the video already contains graphical subtitles", - "LabelRequireTextSubtitlesHelp": "Keeping text versions of subtitles will result in more efficient delivery to mobile clients.", + "LabelSkipIfGraphicalSubsPresent": "Skip if the video already contains graphical subtitles", + "LabelSkipIfGraphicalSubsPresentHelp": "Keeping text versions of subtitles will result in more efficient delivery to mobile clients.", "TabSubtitles": "Subtitles", "LabelOpenSubtitlesUsername": "Open Subtitles username:", "LabelOpenSubtitlesPassword": "Open Subtitles password:", "LabelAudioLanguagePreferenceHelp": "If empty, the default audio track will be selected, regardless of language.", "LabelDownloadLanguages": "Download languages:", "ButtonRegister": "Register", - "HeaderSubtitleDownloadingMoreHelp": "Subtitles are considered missing when the audio track is in a foreign language, and there are no subtitles available in the preferred language." + "LabelSkipIfAudioTrackPresent": "Skip if the default audio track matches the download language", + "LabelSkipIfAudioTrackPresentHelp": "Uncheck this to ensure all videos have subtitles, regardless of audio language.", + "HeaderSendMessage": "Send Message", + "ButtonSend": "Send", + "LabelMessageText": "Message text:" } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/Server/ms.json b/MediaBrowser.Server.Implementations/Localization/Server/ms.json index d22b26a3c..1ea974568 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/ms.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/ms.json @@ -514,7 +514,7 @@ "ErrorConnectingToMediaBrowserRepository": "There was an error connecting to the remote Media Browser repository.", "LabelComponentsUpdated": "The following components have been installed or updated:", "MessagePleaseRestartServerToFinishUpdating": "Please restart the server to finish applying updates.", - "LabelDownMixAudioScale": "Down mix audio boost scale:", + "LabelDownMixAudioScale": "Audio boost when downmixing:", "LabelDownMixAudioScaleHelp": "Boost audio when downmixing. Set to 1 to preserve original volume value.", "ButtonLinkKeys": "Link Keys", "LabelOldSupporterKey": "Old supporter key", @@ -564,6 +564,7 @@ "NotificationOptionTaskFailed": "Scheduled task failure", "NotificationOptionInstallationFailed": "Installation failure", "NotificationOptionNewLibraryContent": "New content added", + "NotificationOptionNewLibraryContentMultiple": "New content added (multiple)", "SendNotificationHelp": "By default, notifications are delivered to the dashboard inbox. Browse the plugin catalog to install additional notification options.", "NotificationOptionServerRestartRequired": "Server restart required", "LabelNotificationEnabled": "Enable this notification", @@ -698,13 +699,17 @@ "OptionReportByteRangeSeekingWhenTranscodingHelp": "This is required for some devices that don't time seek very well.", "HeaderSubtitleDownloadingHelp": "When Media Browser scans your video files it can search for missing subtitles, and download them using a subtitle provider such as OpenSubtitles.org.", "HeaderDownloadSubtitlesFor": "Download subtitles for:", - "LabelRequireTextSubtitles": "Download even if the video already contains graphical subtitles", - "LabelRequireTextSubtitlesHelp": "Keeping text versions of subtitles will result in more efficient delivery to mobile clients.", + "LabelSkipIfGraphicalSubsPresent": "Skip if the video already contains graphical subtitles", + "LabelSkipIfGraphicalSubsPresentHelp": "Keeping text versions of subtitles will result in more efficient delivery to mobile clients.", "TabSubtitles": "Subtitles", "LabelOpenSubtitlesUsername": "Open Subtitles username:", "LabelOpenSubtitlesPassword": "Open Subtitles password:", "LabelAudioLanguagePreferenceHelp": "If empty, the default audio track will be selected, regardless of language.", "LabelDownloadLanguages": "Download languages:", "ButtonRegister": "Register", - "HeaderSubtitleDownloadingMoreHelp": "Subtitles are considered missing when the audio track is in a foreign language, and there are no subtitles available in the preferred language." + "LabelSkipIfAudioTrackPresent": "Skip if the default audio track matches the download language", + "LabelSkipIfAudioTrackPresentHelp": "Uncheck this to ensure all videos have subtitles, regardless of audio language.", + "HeaderSendMessage": "Send Message", + "ButtonSend": "Send", + "LabelMessageText": "Message text:" } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/Server/nb.json b/MediaBrowser.Server.Implementations/Localization/Server/nb.json index 510532dc6..f1e208a95 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/nb.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/nb.json @@ -514,7 +514,7 @@ "ErrorConnectingToMediaBrowserRepository": "There was an error connecting to the remote Media Browser repository.", "LabelComponentsUpdated": "The following components have been installed or updated:", "MessagePleaseRestartServerToFinishUpdating": "Please restart the server to finish applying updates.", - "LabelDownMixAudioScale": "Down mix audio boost scale:", + "LabelDownMixAudioScale": "Audio boost when downmixing:", "LabelDownMixAudioScaleHelp": "Boost audio when downmixing. Set to 1 to preserve original volume value.", "ButtonLinkKeys": "Link Keys", "LabelOldSupporterKey": "Old supporter key", @@ -564,6 +564,7 @@ "NotificationOptionTaskFailed": "Scheduled task failure", "NotificationOptionInstallationFailed": "Installation failure", "NotificationOptionNewLibraryContent": "New content added", + "NotificationOptionNewLibraryContentMultiple": "New content added (multiple)", "SendNotificationHelp": "By default, notifications are delivered to the dashboard inbox. Browse the plugin catalog to install additional notification options.", "NotificationOptionServerRestartRequired": "Server restart required", "LabelNotificationEnabled": "Enable this notification", @@ -698,13 +699,17 @@ "OptionReportByteRangeSeekingWhenTranscodingHelp": "This is required for some devices that don't time seek very well.", "HeaderSubtitleDownloadingHelp": "When Media Browser scans your video files it can search for missing subtitles, and download them using a subtitle provider such as OpenSubtitles.org.", "HeaderDownloadSubtitlesFor": "Download subtitles for:", - "LabelRequireTextSubtitles": "Download even if the video already contains graphical subtitles", - "LabelRequireTextSubtitlesHelp": "Keeping text versions of subtitles will result in more efficient delivery to mobile clients.", + "LabelSkipIfGraphicalSubsPresent": "Skip if the video already contains graphical subtitles", + "LabelSkipIfGraphicalSubsPresentHelp": "Keeping text versions of subtitles will result in more efficient delivery to mobile clients.", "TabSubtitles": "Subtitles", "LabelOpenSubtitlesUsername": "Open Subtitles username:", "LabelOpenSubtitlesPassword": "Open Subtitles password:", "LabelAudioLanguagePreferenceHelp": "If empty, the default audio track will be selected, regardless of language.", "LabelDownloadLanguages": "Download languages:", "ButtonRegister": "Register", - "HeaderSubtitleDownloadingMoreHelp": "Subtitles are considered missing when the audio track is in a foreign language, and there are no subtitles available in the preferred language." + "LabelSkipIfAudioTrackPresent": "Skip if the default audio track matches the download language", + "LabelSkipIfAudioTrackPresentHelp": "Uncheck this to ensure all videos have subtitles, regardless of audio language.", + "HeaderSendMessage": "Send Message", + "ButtonSend": "Send", + "LabelMessageText": "Message text:" } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/Server/nl.json b/MediaBrowser.Server.Implementations/Localization/Server/nl.json index 83a880bc1..a08d54633 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/nl.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/nl.json @@ -564,6 +564,7 @@ "NotificationOptionTaskFailed": "Mislukken van de geplande taak", "NotificationOptionInstallationFailed": "Mislukken van de installatie", "NotificationOptionNewLibraryContent": "Nieuwe content toegevoegd", + "NotificationOptionNewLibraryContentMultiple": "New content added (multiple)", "SendNotificationHelp": "Meldingen worden geplaatst in de inbox op het dashboard. Blader door de Plug-ins catalogus om aanvullende opties voor meldingen te installeren.", "NotificationOptionServerRestartRequired": "Server herstart nodig", "LabelNotificationEnabled": "Deze melding inschakelen", @@ -692,19 +693,23 @@ "LabelTranscodingVideoProfile": "Video profile:", "LabelTranscodingAudioCodec": "Audio codec:", "OptionEnableM2tsMode": "M2ts-modus inschakelen", - "OptionEnableM2tsModeHelp": "Enable m2ts-modus bij het encoderen naar mpegts.", + "OptionEnableM2tsModeHelp": "m2ts-modus bij het encoderen naar mpegts inschakelen", "OptionEstimateContentLength": "Lengte schatten van de inhoud bij het transcoderen", "OptionReportByteRangeSeekingWhenTranscoding": "Rapporteer dat de server byte zoeken tijdens transcoderen ondersteunt", "OptionReportByteRangeSeekingWhenTranscodingHelp": "Dit is vereist voor bepaalde apparaten die zo goed op tijd zoeken.", - "HeaderSubtitleDownloadingHelp": "When Media Browser scans your video files it can search for missing subtitles, and download them using a subtitle provider such as OpenSubtitles.org.", - "HeaderDownloadSubtitlesFor": "Download subtitles for:", - "LabelRequireTextSubtitles": "Download even if the video already contains graphical subtitles", - "LabelRequireTextSubtitlesHelp": "Keeping text versions of subtitles will result in more efficient delivery to mobile clients.", - "TabSubtitles": "Subtitles", - "LabelOpenSubtitlesUsername": "Open Subtitles username:", - "LabelOpenSubtitlesPassword": "Open Subtitles password:", - "LabelAudioLanguagePreferenceHelp": "If empty, the default audio track will be selected, regardless of language.", - "LabelDownloadLanguages": "Download languages:", - "ButtonRegister": "Register", - "HeaderSubtitleDownloadingMoreHelp": "Subtitles are considered missing when the audio track is in a foreign language, and there are no subtitles available in the preferred language." + "HeaderSubtitleDownloadingHelp": "Bij het scannen van je films kan Media Browser naar ontbrekende ondertiteling zoeken en deze downloaden bij ondertiteling providers zoals OpenSubtitles.org.", + "HeaderDownloadSubtitlesFor": "Download ondertiteling voor:", + "LabelSkipIfGraphicalSubsPresent": "Overslaan als de video al grafische ondertitels bevat", + "LabelSkipIfGraphicalSubsPresentHelp": "Tekstversies houden van ondertitels zal resulteren in meer effici\u00ebnte levering aan mobiele clients.", + "TabSubtitles": "Ondertiteling", + "LabelOpenSubtitlesUsername": "Gebruikersnaam Open Subtitles:", + "LabelOpenSubtitlesPassword": "Wachtwoord Open Subtitles:", + "LabelAudioLanguagePreferenceHelp": "Indien niet ingevuld zal het standaard audio spoor geselecteerd worden, ongeacht de taal.", + "LabelDownloadLanguages": "Download talen:", + "ButtonRegister": "Aanmelden", + "LabelSkipIfAudioTrackPresent": "Overslaan als de standaard audio track overeenkomt met de taal van de download", + "LabelSkipIfAudioTrackPresentHelp": "Uitvinken om ervoor te zorgen dat alle video's ondertitels krijgen, ongeacht de gesproken taal.", + "HeaderSendMessage": "Send Message", + "ButtonSend": "Send", + "LabelMessageText": "Message text:" } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/Server/pt_BR.json b/MediaBrowser.Server.Implementations/Localization/Server/pt_BR.json index e39ca972e..16e8ba74e 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/pt_BR.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/pt_BR.json @@ -514,7 +514,7 @@ "ErrorConnectingToMediaBrowserRepository": "Ocorreu um erro ao conectar com o reposit\u00f3rio remoto do Media Browser", "LabelComponentsUpdated": "Os seguintes componentes foram instalados ou atualizados:", "MessagePleaseRestartServerToFinishUpdating": "Por favor, reinicie o servidor para terminar de aplicar as atualiza\u00e7\u00f5es.", - "LabelDownMixAudioScale": "Escala do aumento de \u00e1udio ao executar downmix.", + "LabelDownMixAudioScale": "Aumento do \u00e1udio ao executar downmix:", "LabelDownMixAudioScaleHelp": "Aumentar o \u00e1udio quando executar downmix. Defina como 1 para preservar o volume original.", "ButtonLinkKeys": "Unir as chaves.", "LabelOldSupporterKey": "Chave antiga de colaborador", @@ -564,6 +564,7 @@ "NotificationOptionTaskFailed": "Falha na tarefa agendada", "NotificationOptionInstallationFailed": "Falha na instala\u00e7\u00e3o", "NotificationOptionNewLibraryContent": "Adicionado novo conte\u00fado", + "NotificationOptionNewLibraryContentMultiple": "New content added (multiple)", "SendNotificationHelp": "Por padr\u00e3o, notifica\u00e7\u00f5es s\u00e3o entregues \u00e0 caixa de entrada do painel. Navegue pelo cat\u00e1logo de plugins para instalar op\u00e7\u00f5es adicionais de notifica\u00e7\u00f5es.", "NotificationOptionServerRestartRequired": "Necessidade de reiniciar servidor", "LabelNotificationEnabled": "Ativar esta notifica\u00e7\u00e3o", @@ -696,15 +697,19 @@ "OptionEstimateContentLength": "Estimar o tamanho do conte\u00fado quando transcodificar", "OptionReportByteRangeSeekingWhenTranscoding": "Reportar que o servidor suporta busca de byte quando transcodificar", "OptionReportByteRangeSeekingWhenTranscodingHelp": "Isto \u00e9 necess\u00e1rio para alguns dispositivos que n\u00e3o buscam o tempo muito bem.", - "HeaderSubtitleDownloadingHelp": "When Media Browser scans your video files it can search for missing subtitles, and download them using a subtitle provider such as OpenSubtitles.org.", - "HeaderDownloadSubtitlesFor": "Download subtitles for:", - "LabelRequireTextSubtitles": "Download even if the video already contains graphical subtitles", - "LabelRequireTextSubtitlesHelp": "Keeping text versions of subtitles will result in more efficient delivery to mobile clients.", - "TabSubtitles": "Subtitles", - "LabelOpenSubtitlesUsername": "Open Subtitles username:", - "LabelOpenSubtitlesPassword": "Open Subtitles password:", - "LabelAudioLanguagePreferenceHelp": "If empty, the default audio track will be selected, regardless of language.", - "LabelDownloadLanguages": "Download languages:", - "ButtonRegister": "Register", - "HeaderSubtitleDownloadingMoreHelp": "Subtitles are considered missing when the audio track is in a foreign language, and there are no subtitles available in the preferred language." + "HeaderSubtitleDownloadingHelp": "Quando o Media Browser verificar seus arquivos de v\u00eddeo, ele pode buscar legendas que n\u00e3o existam e transferi-las usando um provedor de legendas como, por exemplo, o OpenSubtitles.org.", + "HeaderDownloadSubtitlesFor": "Transferir legendas para:", + "LabelSkipIfGraphicalSubsPresent": "Pular se o v\u00eddeo j\u00e1 possuir legendas gr\u00e1ficas", + "LabelSkipIfGraphicalSubsPresentHelp": "Manter vers\u00f5es das legendas em texto resultar\u00e1 em uma entrega mais eficiente para os clientes m\u00f3veis.", + "TabSubtitles": "Legendas", + "LabelOpenSubtitlesUsername": "Nome do usu\u00e1rio do Open Subtitles:", + "LabelOpenSubtitlesPassword": "Senha do Open Subtitles:", + "LabelAudioLanguagePreferenceHelp": "Se estiver em branco, a faixa de \u00e1udio padr\u00e3o ser\u00e1 selecionada, independente do idioma.", + "LabelDownloadLanguages": "Idiomas para transfer\u00eancia:", + "ButtonRegister": "Registrar", + "LabelSkipIfAudioTrackPresent": "Pular se a faixa de \u00e1udio padr\u00e3o coincidir com o idioma de transfer\u00eancia", + "LabelSkipIfAudioTrackPresentHelp": "Desmarque esta op\u00e7\u00e3o para garantir que todos os v\u00eddeos t\u00eam legendas, independente do idioma do \u00e1udio.", + "HeaderSendMessage": "Send Message", + "ButtonSend": "Send", + "LabelMessageText": "Message text:" } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/Server/pt_PT.json b/MediaBrowser.Server.Implementations/Localization/Server/pt_PT.json index 35410c159..5d9f6aa75 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/pt_PT.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/pt_PT.json @@ -78,7 +78,7 @@ "LibraryAccessHelp": "Escolha as pastas de media a partilha com este utilizador. Os Administradores poder\u00e3o editar todas as pastas, usando o Gestor de Metadados.", "ChannelAccessHelp": "Select the channels to share with this user. Administrators will be able to edit all channels using the metadata manager.", "ButtonDeleteImage": "Apagar imagem", - "LabelSelectUsers": "Select users:", + "LabelSelectUsers": "Selecionar utilizadores:", "ButtonUpload": "Carregar", "HeaderUploadNewImage": "Carregar Nova Imagem", "LabelDropImageHere": "Largar imagem aqui", @@ -514,7 +514,7 @@ "ErrorConnectingToMediaBrowserRepository": "Ocorreu um erro ao conectar ao reposit\u00f3rio remoto do Media Browser.", "LabelComponentsUpdated": "Os componentes seguintes foram instalados ou atualizados:", "MessagePleaseRestartServerToFinishUpdating": "Por favor reinicie o servidor para terminar a aplica\u00e7\u00e3o das atualiza\u00e7\u00f5es.", - "LabelDownMixAudioScale": "Escala do aumento de \u00e1udio ao fazer downmix.", + "LabelDownMixAudioScale": "Escala do aumento de \u00e1udio ao fazer downmix:", "LabelDownMixAudioScaleHelp": "Aumentar o \u00e1udio ao fazer downmix. Defina como 1 para preservar o volume original.", "ButtonLinkKeys": "Unir Chaves", "LabelOldSupporterKey": "Chave de apoiante antiga", @@ -564,6 +564,7 @@ "NotificationOptionTaskFailed": "Scheduled task failure", "NotificationOptionInstallationFailed": "Installation failure", "NotificationOptionNewLibraryContent": "New content added", + "NotificationOptionNewLibraryContentMultiple": "New content added (multiple)", "SendNotificationHelp": "By default, notifications are delivered to the dashboard inbox. Browse the plugin catalog to install additional notification options.", "NotificationOptionServerRestartRequired": "Server restart required", "LabelNotificationEnabled": "Ativar esta notifica\u00e7\u00e3o", @@ -571,43 +572,43 @@ "LabelSendNotificationToUsers": "Send the notification to:", "UsersNotNotifiedAboutSelfActivity": "Users will not be notified about their own activities.", "LabelUseNotificationServices": "Use the following services:", - "CategoryUser": "User", - "CategorySystem": "System", - "CategoryApplication": "Application", + "CategoryUser": "Utilizador", + "CategorySystem": "Sistema", + "CategoryApplication": "Aplica\u00e7\u00e3o", "CategoryPlugin": "Plugin", - "LabelMessageTitle": "Message title:", + "LabelMessageTitle": "Titulo da mensagem:", "LabelAvailableTokens": "Available tokens:", "AdditionalNotificationServices": "Browse the plugin catalog to install additional notification services.", - "OptionAllUsers": "All users", - "OptionAdminUsers": "Administrators", - "OptionCustomUsers": "Custom", - "ButtonArrowUp": "Up", - "ButtonArrowDown": "Down", - "ButtonArrowLeft": "Left", - "ButtonArrowRight": "Right", - "ButtonBack": "Back", + "OptionAllUsers": "Todos os utilizadores", + "OptionAdminUsers": "Administradores", + "OptionCustomUsers": "Personalizado", + "ButtonArrowUp": "Cima", + "ButtonArrowDown": "Baixo", + "ButtonArrowLeft": "Esquerda", + "ButtonArrowRight": "Direita", + "ButtonBack": "Voltar", "ButtonInfo": "Info", "ButtonPageUp": "Page Up", "ButtonPageDown": "Page Down", "PageAbbreviation": "PG", - "ButtonHome": "Home", + "ButtonHome": "In\u00edcio", "ButtonSettings": "Settings", "ButtonTakeScreenshot": "Capture Screenshot", "ButtonLetterUp": "Letter Up", "ButtonLetterDown": "Letter Down", "PageButtonAbbreviation": "PG", "LetterButtonAbbreviation": "A", - "TabNowPlaying": "Now Playing", - "TabNavigation": "Navigation", + "TabNowPlaying": "A reproduzir agora", + "TabNavigation": "Navega\u00e7\u00e3o", "TabControls": "Controls", "ButtonFullscreen": "Toggle fullscreen", - "ButtonScenes": "Scenes", - "ButtonSubtitles": "Subtitles", - "ButtonAudioTracks": "Audio tracks", - "ButtonPreviousTrack": "Previous track", - "ButtonNextTrack": "Next track", - "ButtonStop": "Stop", - "ButtonPause": "Pause", + "ButtonScenes": "Cenas", + "ButtonSubtitles": "Legendas", + "ButtonAudioTracks": "Faixas de \u00e1udio", + "ButtonPreviousTrack": "Faixa anterior", + "ButtonNextTrack": "Pr\u00f3xima faixa", + "ButtonStop": "Parar", + "ButtonPause": "Pausar", "LabelGroupMoviesIntoCollections": "Group movies into collections", "LabelGroupMoviesIntoCollectionsHelp": "When displaying movie lists, movies belonging to a collection will be displayed as one grouped item.", "NotificationOptionPluginError": "Plugin failure", @@ -622,10 +623,10 @@ "LabelProfileCodecsHelp": "Separated by comma. This can be left empty to apply to all codecs.", "LabelProfileContainersHelp": "Separated by comma. This can be left empty to apply to all containers.", "HeaderResponseProfile": "Response Profile", - "LabelType": "Type:", - "LabelProfileContainer": "Container:", - "LabelProfileVideoCodecs": "Video codecs:", - "LabelProfileAudioCodecs": "Audio codecs:", + "LabelType": "Tipo:", + "LabelProfileContainer": "Contentor:", + "LabelProfileVideoCodecs": "Codecs do v\u00eddeo:", + "LabelProfileAudioCodecs": "Codecs do \u00e1udio:", "LabelProfileCodecs": "Codecs:", "HeaderDirectPlayProfile": "Direct Play Profile", "HeaderTranscodingProfile": "Transcoding Profile", @@ -698,13 +699,17 @@ "OptionReportByteRangeSeekingWhenTranscodingHelp": "This is required for some devices that don't time seek very well.", "HeaderSubtitleDownloadingHelp": "When Media Browser scans your video files it can search for missing subtitles, and download them using a subtitle provider such as OpenSubtitles.org.", "HeaderDownloadSubtitlesFor": "Download subtitles for:", - "LabelRequireTextSubtitles": "Download even if the video already contains graphical subtitles", - "LabelRequireTextSubtitlesHelp": "Keeping text versions of subtitles will result in more efficient delivery to mobile clients.", + "LabelSkipIfGraphicalSubsPresent": "Skip if the video already contains graphical subtitles", + "LabelSkipIfGraphicalSubsPresentHelp": "Keeping text versions of subtitles will result in more efficient delivery to mobile clients.", "TabSubtitles": "Subtitles", "LabelOpenSubtitlesUsername": "Open Subtitles username:", "LabelOpenSubtitlesPassword": "Open Subtitles password:", "LabelAudioLanguagePreferenceHelp": "If empty, the default audio track will be selected, regardless of language.", "LabelDownloadLanguages": "Download languages:", "ButtonRegister": "Register", - "HeaderSubtitleDownloadingMoreHelp": "Subtitles are considered missing when the audio track is in a foreign language, and there are no subtitles available in the preferred language." + "LabelSkipIfAudioTrackPresent": "Skip if the default audio track matches the download language", + "LabelSkipIfAudioTrackPresentHelp": "Uncheck this to ensure all videos have subtitles, regardless of audio language.", + "HeaderSendMessage": "Send Message", + "ButtonSend": "Send", + "LabelMessageText": "Message text:" } \ 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 17cd40336..71deb596c 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/ru.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/ru.json @@ -564,6 +564,7 @@ "NotificationOptionTaskFailed": "\u0421\u0431\u043e\u0439 \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u043d\u043e\u0433\u043e \u0437\u0430\u0434\u0430\u043d\u0438\u044f", "NotificationOptionInstallationFailed": "\u0421\u0431\u043e\u0439 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438", "NotificationOptionNewLibraryContent": "\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043e \u043d\u043e\u0432\u043e\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435", + "NotificationOptionNewLibraryContentMultiple": "New content added (multiple)", "SendNotificationHelp": "\u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u044f \u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0432 \u044f\u0449\u0438\u043a \u0432\u0445\u043e\u0434\u044f\u0449\u0438\u0445 \u043f\u0430\u043d\u0435\u043b\u0438 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430. \u041f\u0435\u0440\u0435\u0439\u0434\u0438\u0442\u0435 \u0432 \u043a\u0430\u0442\u0430\u043b\u043e\u0433 \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432, \u0447\u0442\u043e\u0431\u044b \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430 \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u044f.", "NotificationOptionServerRestartRequired": "\u0422\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a \u0441\u0435\u0440\u0432\u0435\u0440\u0430", "LabelNotificationEnabled": "\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u043e\u0435 \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u0435", @@ -698,13 +699,17 @@ "OptionReportByteRangeSeekingWhenTranscodingHelp": "This is required for some devices that don't time seek very well.", "HeaderSubtitleDownloadingHelp": "When Media Browser scans your video files it can search for missing subtitles, and download them using a subtitle provider such as OpenSubtitles.org.", "HeaderDownloadSubtitlesFor": "Download subtitles for:", - "LabelRequireTextSubtitles": "Download even if the video already contains graphical subtitles", - "LabelRequireTextSubtitlesHelp": "Keeping text versions of subtitles will result in more efficient delivery to mobile clients.", + "LabelSkipIfGraphicalSubsPresent": "Skip if the video already contains graphical subtitles", + "LabelSkipIfGraphicalSubsPresentHelp": "Keeping text versions of subtitles will result in more efficient delivery to mobile clients.", "TabSubtitles": "Subtitles", "LabelOpenSubtitlesUsername": "Open Subtitles username:", "LabelOpenSubtitlesPassword": "Open Subtitles password:", "LabelAudioLanguagePreferenceHelp": "If empty, the default audio track will be selected, regardless of language.", "LabelDownloadLanguages": "Download languages:", "ButtonRegister": "Register", - "HeaderSubtitleDownloadingMoreHelp": "Subtitles are considered missing when the audio track is in a foreign language, and there are no subtitles available in the preferred language." + "LabelSkipIfAudioTrackPresent": "Skip if the default audio track matches the download language", + "LabelSkipIfAudioTrackPresentHelp": "Uncheck this to ensure all videos have subtitles, regardless of audio language.", + "HeaderSendMessage": "Send Message", + "ButtonSend": "Send", + "LabelMessageText": "Message text:" } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/Server/server.json b/MediaBrowser.Server.Implementations/Localization/Server/server.json index bcd04f4ae..1c58f3e32 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/server.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/server.json @@ -161,6 +161,10 @@ "OptionIso": "Iso", "Option3D": "3D", "LabelFeatures": "Features:", + "LabelService": "Service:", + "LabelStatus": "Status:", + "LabelVersion": "Version:", + "LabelLastResult": "Last result:", "OptionHasSubtitles": "Subtitles", "OptionHasTrailer": "Trailer", "OptionHasThemeSong": "Theme Song", @@ -270,8 +274,8 @@ "ButtonAutoScroll": "Auto-scroll", "LabelImageSavingConvention": "Image saving convention:", "LabelImageSavingConventionHelp": "Media Browser recognizes images from most major media applications. Choosing your downloading convention is useful if you also use other products.", - "OptionImageSavingCompatible": "Compatible - MB3/Plex/Xbmc", - "OptionImageSavingStandard": "Standard - MB3/MB2", + "OptionImageSavingCompatible": "Compatible - Media Browser/Plex/Xbmc", + "OptionImageSavingStandard": "Standard - MB2", "ButtonSignIn": "Sign In", "TitleSignIn": "Sign In", "HeaderPleaseSignIn": "Please sign in", @@ -533,8 +537,8 @@ "ButtonRetrieveKey": "Retrieve Key", "LabelSupporterKey": "Supporter Key (paste from email)", "LabelSupporterKeyHelp": "Enter your supporter key to start enjoying additional benefits the community has developed for Media Browser.", - "MessageInvalidKey": "MB3 Key Missing or Invalid", - "ErrorMessageInvalidKey": "In order for any premium content to be registered, you must also be an MB3 Supporter. Please donate and support the continued development of the core product. Thank you.", + "MessageInvalidKey": "Supporter key is missing or invalid.", + "ErrorMessageInvalidKey": "In order for any premium content to be registered, you must also be a Media Browser Supporter. Please donate and support the continued development of the core product. Thank you.", "HeaderDisplaySettings": "Display Settings", "TabPlayTo": "Play To", "LabelEnableDlnaServer": "Enable Dlna server", @@ -592,6 +596,7 @@ "ButtonArrowRight": "Right", "ButtonBack": "Back", "ButtonInfo": "Info", + "ButtonOsd": "On screen display", "ButtonPageUp": "Page Up", "ButtonPageDown": "Page Down", "PageAbbreviation": "PG", @@ -721,5 +726,21 @@ "HeaderSendMessage": "Send Message", "ButtonSend": "Send", "LabelMessageText": "Message text:", - "LabelMessageTitle": "Message title:" + "LabelMessageTitle": "Message title:", + "MessageNoAvailablePlugins": "No available plugins.", + "LabelDisplayPluginsFor": "Display plugins for:", + "PluginTabMediaBrowserClassic": "MB Classic", + "PluginTabMediaBrowserTheater": "MB Theater", + "TabOtherPlugins": "Others", + "LabelEpisodeName": "Episode name", + "LabelSeriesName": "Series name", + "ValueSeriesNamePeriod": "Series.name", + "ValueSeriesNameUnderscore": "Series_name", + "ValueEpisodeNamePeriod": "Episode.name", + "ValueEpisodeNameUnderscore": "Episode_name", + "LabelSeasonNumber": "Season number", + "LabelEpisodeNumber": "Episode number", + "LabelEndingEpisodeNumber": "Ending episode number", + "HeaderTypeText": "Type Text", + "LabelTypeText": "Text" } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/Server/sv.json b/MediaBrowser.Server.Implementations/Localization/Server/sv.json index e4b0842dc..2a90f55cf 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/sv.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/sv.json @@ -564,6 +564,7 @@ "NotificationOptionTaskFailed": "Schemalagd uppgift misslyckades", "NotificationOptionInstallationFailed": "Installationen misslyckades", "NotificationOptionNewLibraryContent": "Nytt inneh\u00e5ll har tillkommit", + "NotificationOptionNewLibraryContentMultiple": "Nytillkommet inneh\u00e5ll finns (flera objekt)", "SendNotificationHelp": "Meddelanden visas som standard i kontrollpanelens inkorg. S\u00f6k efter fler meddelandetill\u00e4gg i pluginkatalogen.", "NotificationOptionServerRestartRequired": "Servern m\u00e5ste startas om", "LabelNotificationEnabled": "Aktivera denna meddelandetyp", @@ -630,9 +631,9 @@ "HeaderDirectPlayProfile": "Spela Direkt Profil", "HeaderTranscodingProfile": "Transcoding Profile", "HeaderCodecProfile": "Codec Profil", - "HeaderCodecProfileHelp": "Codec profiles indicate the limitations of a device when playing specific codecs. If a limitation applies then the media will be transcoded, even if the codec is configured for direct play.", + "HeaderCodecProfileHelp": "Avkodarprofiler best\u00e4mmer begr\u00e4nsningarna hos en enhet n\u00e4r den spelar upp olika kodningstyper. Om en begr\u00e4nsning \u00e4r aktuell kommer inneh\u00e5llet att kodas om, \u00e4ven om kodningstypen sig \u00e4r inst\u00e4lld f\u00f6r direkt avspelning.", "HeaderContainerProfile": "Beh\u00e5llar profil", - "HeaderContainerProfileHelp": "Container profiles indicate the limitations of a device when playing specific formats. If a limitation applies then the media will be transcoded, even if the format is configured for direct play.", + "HeaderContainerProfileHelp": "Beh\u00e5llareprofiler best\u00e4mmer begr\u00e4nsningarna hos en enhet n\u00e4r den spelar upp olika filformat. Om en begr\u00e4nsning \u00e4r aktuell kommer inneh\u00e5llet att kodas om, \u00e4ven om formatet i sig \u00e4r inst\u00e4llt f\u00f6r direkt avspelning.", "OptionProfileVideo": "Video", "OptionProfileAudio": "Ljud", "OptionProfileVideoAudio": "Video Ljud", @@ -640,9 +641,9 @@ "LabelUserLibrary": "Anv\u00e4ndar bibliotek:", "LabelUserLibraryHelp": "V\u00e4lj vilken anv\u00e4ndares bibliotek som skall visas p\u00e5 enheten. L\u00e4mna detta tomt f\u00f6r att standard biblioteket skall anv\u00e4ndas.", "OptionPlainStorageFolders": "Visa alla mappar som enkla lagrings mappar", - "OptionPlainStorageFoldersHelp": "If enabled, all folders are represented in DIDL as \"object.container.storageFolder\" instead of a more specific type, such as \"object.container.person.musicArtist\".", - "OptionPlainVideoItems": "Display all videos as plain video items", - "OptionPlainVideoItemsHelp": "If enabled, all videos are represented in DIDL as \"object.item.videoItem\" instead of a more specific type, such as \"object.item.videoItem.movie\".", + "OptionPlainStorageFoldersHelp": "Om aktiverad representeras alla mappar i DIDL som \"object.container.storageFolder\" i st\u00e4llet f\u00f6r en mera specifik typ, t ex \"object.container.person.musicArtist\".", + "OptionPlainVideoItems": "Visa alla videor som objekt utan specifikt format", + "OptionPlainVideoItemsHelp": "Om aktiverad representeras alla videor i DIDL som \"object.item.videoItem\" i st\u00e4llet f\u00f6r en mera specifik typ, t ex \"object.item.videoItem.movie\".", "LabelSupportedMediaTypes": "Media Format som St\u00f6ds:", "TabIdentification": "Identifiering", "TabDirectPlay": "Spela Direkt", @@ -650,24 +651,24 @@ "TabCodecs": "Codecs", "TabResponses": "Svar", "HeaderProfileInformation": "Profil Information", - "LabelEmbedAlbumArtDidl": "Embed album art in Didl", - "LabelEmbedAlbumArtDidlHelp": "Some devices prefer this method for obtaining album art. Others may fail to play with this option enabled.", - "LabelAlbumArtPN": "Album art PN:", - "LabelAlbumArtHelp": "PN used for album art, within the dlna:profileID attribute on upnp:albumArtURI. Some clients require a specific value, regardless of the size of the image.", - "LabelAlbumArtMaxWidth": "Album art max width:", - "LabelAlbumArtMaxWidthHelp": "Max resolution of album art exposed via upnp:albumArtURI.", + "LabelEmbedAlbumArtDidl": "B\u00e4dda in omslagsbilder i Didl", + "LabelEmbedAlbumArtDidlHelp": "Vissa enheter f\u00f6redrar den h\u00e4r metoden att ta fram omslagsbilder. Andra kanske avbryter avspelningen om detta val \u00e4r aktiverat.", + "LabelAlbumArtPN": "PN f\u00f6r omslagsbilder:", + "LabelAlbumArtHelp": "Det PN som anv\u00e4nds f\u00f6r omslagsbilder, inom attributet dlna:profileID hos upnp:albumArtURI. Vissa klienter kr\u00e4ver ett specifikt v\u00e4rde, oavsett bildens storlek.", + "LabelAlbumArtMaxWidth": "Maximal bredd f\u00f6r omslagsbilder:", + "LabelAlbumArtMaxWidthHelp": "H\u00f6gsta uppl\u00f6sning hos omslagsbilder presenterade via upnp:albumArtURI.", "LabelAlbumArtMaxHeight": "Skivomslagens max h\u00f6jd:", - "LabelAlbumArtMaxHeightHelp": "Max resolution of album art exposed via upnp:albumArtURI.", + "LabelAlbumArtMaxHeightHelp": "H\u00f6gsta uppl\u00f6sning hos omslagsbilder presenterade via upnp:albumArtURI.", "LabelIconMaxWidth": "Ikoners max bredd:", "LabelIconMaxWidthHelp": "Max uppl\u00f6sning p\u00e5 ikoner som visas via upnp:ikon.", "LabelIconMaxHeight": "Ikon max h\u00f6jd:", - "LabelIconMaxHeightHelp": "Max resolution of icons exposed via upnp:icon.", - "LabelIdentificationFieldHelp": "A case-insensitive substring or regex expression.", - "HeaderProfileServerSettingsHelp": "These values control how Media Browser will present itself to the device.", + "LabelIconMaxHeightHelp": "H\u00f6gsta uppl\u00f6sning hos ikoner presenterade via upnp:icon.", + "LabelIdentificationFieldHelp": "En skiftl\u00e4gesok\u00e4nslig delstr\u00e4ng eller regex-uttryck.", + "HeaderProfileServerSettingsHelp": "Dessa v\u00e4rden styr hur Media Browser presenterar sig f\u00f6r enheten.", "LabelMaxBitrate": "Max bitrate:", - "LabelMaxBitrateHelp": "Specify a max bitrate in bandwidth constrained environments, or if the device imposes it's own limit.", - "OptionIgnoreTranscodeByteRangeRequests": "Ignore transcode byte range requests", - "OptionIgnoreTranscodeByteRangeRequestsHelp": "If enabled, these requests will be honored but will ignore the byte range header.", + "LabelMaxBitrateHelp": "Ange en h\u00f6gsta bithastighet i bandbreddsbegr\u00e4nsade milj\u00f6er, eller i fall d\u00e4r enheten har sina egna begr\u00e4nsningar.", + "OptionIgnoreTranscodeByteRangeRequests": "Ignorera beg\u00e4ran om \"byte range\" vid omkodning", + "OptionIgnoreTranscodeByteRangeRequestsHelp": "Om aktiverad kommer beg\u00e4ran att uppfyllas, men \"byte range\"-rubriken ignoreras.", "LabelFriendlyName": "L\u00e4ttl\u00e4st namn", "LabelManufacturer": "Tillverkare", "LabelManufacturerUrl": "Tillverkarens webaddress", @@ -678,33 +679,37 @@ "LabelSerialNumber": "Serie nummer", "LabelDeviceDescription": "Enhets beskrivning", "HeaderIdentificationCriteriaHelp": "Var god skriv in minst ett identifierings kriterium", - "HeaderDirectPlayProfileHelp": "Add direct play profiles to indicate which formats the device can handle natively.", - "HeaderTranscodingProfileHelp": "Add transcoding profiles to indicate which formats should be used when transcoding is required.", - "HeaderResponseProfileHelp": "Response profiles provide a way to customize information sent to the device when playing certain kinds of media.", + "HeaderDirectPlayProfileHelp": "Ange direktuppspelningsprofiler f\u00f6r att indikera vilka format enheten kan spela upp utan omkodning.", + "HeaderTranscodingProfileHelp": "Ange omkodningsprofiler f\u00f6r att indikera vilka format som ska anv\u00e4ndas d\u00e5 omkodning kr\u00e4vs.", + "HeaderResponseProfileHelp": "Svarsprofiler \u00e4r ett s\u00e4tt att anpassa den information som s\u00e4nds till enheten d\u00e5 olika typer av media spelas upp.", "LabelXDlnaCap": "X-Dlna cap:", - "LabelXDlnaCapHelp": "Determines the content of the X_DLNACAP element in the urn:schemas-dlna-org:device-1-0 namespace.", + "LabelXDlnaCapHelp": "Anger inneh\u00e5llet i elementet X_DLNACAP i namnutrymmet urn:schemas-dlna-org:device-1-0.", "LabelXDlnaDoc": "X-Dlna doc:", - "LabelXDlnaDocHelp": "Determines the content of the X_DLNADOC element in the urn:schemas-dlna-org:device-1-0 namespace.", + "LabelXDlnaDocHelp": "Anger inneh\u00e5llet i elementet X_DLNADOC i namnutrymmet urn:schemas-dlna-org:device-1-0.", "LabelSonyAggregationFlags": "Sony sammanst\u00e4llnings flaggor:", - "LabelSonyAggregationFlagsHelp": "Determines the content of the aggregationFlags element in the urn:schemas-sonycom:av namespace.", + "LabelSonyAggregationFlagsHelp": "Anger inneh\u00e5llet i elementet aggregationFlags i namnutrymmet urn:schemas-sonycom:av.", "LabelTranscodingContainer": "Beh\u00e5llare:", "LabelTranscodingVideoCodec": "Video codec:", "LabelTranscodingVideoProfile": "Video profil:", "LabelTranscodingAudioCodec": "Audio codec:", "OptionEnableM2tsMode": "Till\u00e5t M2ts l\u00e4ge", - "OptionEnableM2tsModeHelp": "Enable m2ts mode when encoding to mpegts.", - "OptionEstimateContentLength": "Upskattad inneh\u00e5lls l\u00e4ngd vid om-konvertering", - "OptionReportByteRangeSeekingWhenTranscoding": "Report that the server supports byte seeking when transcoding", + "OptionEnableM2tsModeHelp": "Aktivera m2ts-l\u00e4ge n\u00e4r omkodning sker till mpegts.", + "OptionEstimateContentLength": "Upskattad inneh\u00e5lls l\u00e4ngd vid omkonvertering", + "OptionReportByteRangeSeekingWhenTranscoding": "Meddela att servern st\u00f6djer bytebaserad s\u00f6kning vid omkodning", "OptionReportByteRangeSeekingWhenTranscodingHelp": "Detta kr\u00e4vs f\u00f6r vissa enheter som inte hanterar tids-s\u00f6kning bra.", - "HeaderSubtitleDownloadingHelp": "When Media Browser scans your video files it can search for missing subtitles, and download them using a subtitle provider such as OpenSubtitles.org.", - "HeaderDownloadSubtitlesFor": "Download subtitles for:", - "LabelRequireTextSubtitles": "Download even if the video already contains graphical subtitles", - "LabelRequireTextSubtitlesHelp": "Keeping text versions of subtitles will result in more efficient delivery to mobile clients.", - "TabSubtitles": "Subtitles", - "LabelOpenSubtitlesUsername": "Open Subtitles username:", - "LabelOpenSubtitlesPassword": "Open Subtitles password:", - "LabelAudioLanguagePreferenceHelp": "If empty, the default audio track will be selected, regardless of language.", - "LabelDownloadLanguages": "Download languages:", - "ButtonRegister": "Register", - "HeaderSubtitleDownloadingMoreHelp": "Subtitles are considered missing when the audio track is in a foreign language, and there are no subtitles available in the preferred language." + "HeaderSubtitleDownloadingHelp": "N\u00e4r Media Browser s\u00f6ker igenom dina videofiler kan den identifiera saknade undertexter och ladda ner dem fr\u00e5n en onlinetj\u00e4nst, t ex OpenSubtitles.org.", + "HeaderDownloadSubtitlesFor": "Ladda ner undertexter f\u00f6r:", + "LabelSkipIfGraphicalSubsPresent": "Hoppa \u00f6ver om videon redan inneh\u00e5ller grafiska undertexter", + "LabelSkipIfGraphicalSubsPresentHelp": "Om du sparar textversioner av undertexterna f\u00e5r du ett b\u00e4ttre resultat vid anv\u00e4ndning av mobila enheter.", + "TabSubtitles": "Undertexter", + "LabelOpenSubtitlesUsername": "Inloggnings-ID hos Open Subtitles:", + "LabelOpenSubtitlesPassword": "L\u00f6senord hos Open Subtitles:", + "LabelAudioLanguagePreferenceHelp": "Om ej angivet kommer det f\u00f6rvalda ljudsp\u00e5ret att v\u00e4ljas, oavsett spr\u00e5k.", + "LabelDownloadLanguages": "Spr\u00e5k att ladda ner:", + "ButtonRegister": "Registrera", + "LabelSkipIfAudioTrackPresent": "Hoppa \u00f6ver om det f\u00f6rvalda ljudsp\u00e5rets spr\u00e5k \u00e4r samma som det nerladdade", + "LabelSkipIfAudioTrackPresentHelp": "Bocka ur denna f\u00f6r att ge undertexter \u00e5t alla videor oavsett ljudsp\u00e5rets spr\u00e5k.", + "HeaderSendMessage": "Skicka meddelande", + "ButtonSend": "Skicka", + "LabelMessageText": "Meddelandetext" } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/Server/zh_TW.json b/MediaBrowser.Server.Implementations/Localization/Server/zh_TW.json index 789e6f260..431bb9b24 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/zh_TW.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/zh_TW.json @@ -514,7 +514,7 @@ "ErrorConnectingToMediaBrowserRepository": "There was an error connecting to the remote Media Browser repository.", "LabelComponentsUpdated": "The following components have been installed or updated:", "MessagePleaseRestartServerToFinishUpdating": "Please restart the server to finish applying updates.", - "LabelDownMixAudioScale": "Down mix audio boost scale:", + "LabelDownMixAudioScale": "Audio boost when downmixing:", "LabelDownMixAudioScaleHelp": "Boost audio when downmixing. Set to 1 to preserve original volume value.", "ButtonLinkKeys": "Link Keys", "LabelOldSupporterKey": "Old supporter key", @@ -564,6 +564,7 @@ "NotificationOptionTaskFailed": "Scheduled task failure", "NotificationOptionInstallationFailed": "Installation failure", "NotificationOptionNewLibraryContent": "New content added", + "NotificationOptionNewLibraryContentMultiple": "New content added (multiple)", "SendNotificationHelp": "By default, notifications are delivered to the dashboard inbox. Browse the plugin catalog to install additional notification options.", "NotificationOptionServerRestartRequired": "Server restart required", "LabelNotificationEnabled": "Enable this notification", @@ -698,13 +699,17 @@ "OptionReportByteRangeSeekingWhenTranscodingHelp": "This is required for some devices that don't time seek very well.", "HeaderSubtitleDownloadingHelp": "When Media Browser scans your video files it can search for missing subtitles, and download them using a subtitle provider such as OpenSubtitles.org.", "HeaderDownloadSubtitlesFor": "Download subtitles for:", - "LabelRequireTextSubtitles": "Download even if the video already contains graphical subtitles", - "LabelRequireTextSubtitlesHelp": "Keeping text versions of subtitles will result in more efficient delivery to mobile clients.", + "LabelSkipIfGraphicalSubsPresent": "Skip if the video already contains graphical subtitles", + "LabelSkipIfGraphicalSubsPresentHelp": "Keeping text versions of subtitles will result in more efficient delivery to mobile clients.", "TabSubtitles": "Subtitles", "LabelOpenSubtitlesUsername": "Open Subtitles username:", "LabelOpenSubtitlesPassword": "Open Subtitles password:", "LabelAudioLanguagePreferenceHelp": "If empty, the default audio track will be selected, regardless of language.", "LabelDownloadLanguages": "Download languages:", "ButtonRegister": "Register", - "HeaderSubtitleDownloadingMoreHelp": "Subtitles are considered missing when the audio track is in a foreign language, and there are no subtitles available in the preferred language." + "LabelSkipIfAudioTrackPresent": "Skip if the default audio track matches the download language", + "LabelSkipIfAudioTrackPresentHelp": "Uncheck this to ensure all videos have subtitles, regardless of audio language.", + "HeaderSendMessage": "Send Message", + "ButtonSend": "Send", + "LabelMessageText": "Message text:" } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Persistence/SqliteDisplayPreferencesRepository.cs b/MediaBrowser.Server.Implementations/Persistence/SqliteDisplayPreferencesRepository.cs index 0b4d78de3..7ae87684a 100644 --- a/MediaBrowser.Server.Implementations/Persistence/SqliteDisplayPreferencesRepository.cs +++ b/MediaBrowser.Server.Implementations/Persistence/SqliteDisplayPreferencesRepository.cs @@ -1,4 +1,5 @@ using MediaBrowser.Common.Configuration; +using MediaBrowser.Common.Extensions; using MediaBrowser.Controller.Persistence; using MediaBrowser.Model.Entities; using MediaBrowser.Model.Logging; @@ -193,7 +194,7 @@ namespace MediaBrowser.Server.Implementations.Persistence var cmd = _connection.CreateCommand(); cmd.CommandText = "select data from userdisplaypreferences where id = @id and userId=@userId and client=@client"; - cmd.Parameters.Add(cmd, "@id", DbType.Guid).Value = new Guid(displayPreferencesId); + cmd.Parameters.Add(cmd, "@id", DbType.Guid).Value = displayPreferencesId.GetMD5(); cmd.Parameters.Add(cmd, "@userId", DbType.Guid).Value = userId; cmd.Parameters.Add(cmd, "@client", DbType.String).Value = client; -- cgit v1.2.3