diff --git a/MediaBrowser.Api/Devices/DeviceService.cs b/MediaBrowser.Api/Devices/DeviceService.cs index 0d86d6a5c0..135397308e 100644 --- a/MediaBrowser.Api/Devices/DeviceService.cs +++ b/MediaBrowser.Api/Devices/DeviceService.cs @@ -17,6 +17,9 @@ namespace MediaBrowser.Api.Devices { [ApiMember(Name = "SupportsContentUploading", Description = "SupportsContentUploading", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")] public bool? SupportsContentUploading { get; set; } + + [ApiMember(Name = "SupportsDeviceId", Description = "SupportsDeviceId", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")] + public bool? SupportsDeviceId { get; set; } } [Route("/Devices", "DELETE", Summary = "Deletes a device")] @@ -118,6 +121,13 @@ namespace MediaBrowser.Api.Devices devices = devices.Where(i => _deviceManager.GetCapabilities(i.Id).SupportsContentUploading == val); } + if (request.SupportsDeviceId.HasValue) + { + var val = request.SupportsDeviceId.Value; + + devices = devices.Where(i => _deviceManager.GetCapabilities(i.Id).SupportsDeviceId == val); + } + return ToOptimizedResult(devices.ToList()); } diff --git a/MediaBrowser.Api/Session/SessionsService.cs b/MediaBrowser.Api/Session/SessionsService.cs index 7721107942..551771338f 100644 --- a/MediaBrowser.Api/Session/SessionsService.cs +++ b/MediaBrowser.Api/Session/SessionsService.cs @@ -238,6 +238,9 @@ namespace MediaBrowser.Api.Session [ApiMember(Name = "SupportsContentUploading", Description = "Determines whether camera upload is supported.", IsRequired = false, DataType = "bool", ParameterType = "query", Verb = "POST")] public bool SupportsContentUploading { get; set; } + + [ApiMember(Name = "SupportsDeviceId", Description = "Determines whether the device supports a unique identifier.", IsRequired = false, DataType = "bool", ParameterType = "query", Verb = "POST")] + public bool SupportsDeviceId { get; set; } } [Route("/Sessions/Logout", "POST", Summary = "Reports that a session has ended")] @@ -516,7 +519,9 @@ namespace MediaBrowser.Api.Session MessageCallbackUrl = request.MessageCallbackUrl, - SupportsContentUploading = request.SupportsContentUploading + SupportsContentUploading = request.SupportsContentUploading, + + SupportsDeviceId = request.SupportsDeviceId }); } } diff --git a/MediaBrowser.Api/UserLibrary/ItemsService.cs b/MediaBrowser.Api/UserLibrary/ItemsService.cs index d15556f554..cf9b0b4387 100644 --- a/MediaBrowser.Api/UserLibrary/ItemsService.cs +++ b/MediaBrowser.Api/UserLibrary/ItemsService.cs @@ -877,7 +877,7 @@ namespace MediaBrowser.Api.UserLibrary var hasTrailers = i as IHasTrailers; if (hasTrailers != null) { - trailerCount = hasTrailers.LocalTrailerIds.Count; + trailerCount = hasTrailers.GetTrailerIds().Count; } var ok = val ? trailerCount > 0 : trailerCount == 0; diff --git a/MediaBrowser.Api/UserLibrary/UserLibraryService.cs b/MediaBrowser.Api/UserLibrary/UserLibraryService.cs index a64e0758ab..040cad436e 100644 --- a/MediaBrowser.Api/UserLibrary/UserLibraryService.cs +++ b/MediaBrowser.Api/UserLibrary/UserLibraryService.cs @@ -515,7 +515,7 @@ namespace MediaBrowser.Api.UserLibrary var hasTrailers = item as IHasTrailers; if (hasTrailers != null) { - trailerIds = hasTrailers.LocalTrailerIds; + trailerIds = hasTrailers.GetTrailerIds(); } var dtos = trailerIds diff --git a/MediaBrowser.Controller/Entities/Game.cs b/MediaBrowser.Controller/Entities/Game.cs index 062bdfa88a..e4d0323590 100644 --- a/MediaBrowser.Controller/Entities/Game.cs +++ b/MediaBrowser.Controller/Entities/Game.cs @@ -28,12 +28,14 @@ namespace MediaBrowser.Controller.Entities SoundtrackIds = new List(); RemoteTrailers = new List(); LocalTrailerIds = new List(); + RemoteTrailerIds = new List(); ThemeSongIds = new List(); ThemeVideoIds = new List(); Tags = new List(); } public List LocalTrailerIds { get; set; } + public List RemoteTrailerIds { get; set; } /// /// Gets or sets the tags. @@ -119,5 +121,16 @@ namespace MediaBrowser.Controller.Entities return id; } + + /// + /// Gets the trailer ids. + /// + /// List<Guid>. + public List GetTrailerIds() + { + var list = LocalTrailerIds.ToList(); + list.AddRange(RemoteTrailerIds); + return list; + } } } diff --git a/MediaBrowser.Controller/Entities/IHasTrailers.cs b/MediaBrowser.Controller/Entities/IHasTrailers.cs index 47779064b4..bc1c7d8758 100644 --- a/MediaBrowser.Controller/Entities/IHasTrailers.cs +++ b/MediaBrowser.Controller/Entities/IHasTrailers.cs @@ -4,7 +4,7 @@ using System.Collections.Generic; namespace MediaBrowser.Controller.Entities { - public interface IHasTrailers + public interface IHasTrailers : IHasProviderIds { /// /// Gets or sets the remote trailers. @@ -17,5 +17,12 @@ namespace MediaBrowser.Controller.Entities /// /// The local trailer ids. List LocalTrailerIds { get; set; } + List RemoteTrailerIds { get; set; } + + /// + /// Gets the trailer ids. + /// + /// List<Guid>. + List GetTrailerIds(); } } diff --git a/MediaBrowser.Controller/Entities/Movies/BoxSet.cs b/MediaBrowser.Controller/Entities/Movies/BoxSet.cs index 705cf90575..731226ede4 100644 --- a/MediaBrowser.Controller/Entities/Movies/BoxSet.cs +++ b/MediaBrowser.Controller/Entities/Movies/BoxSet.cs @@ -21,6 +21,7 @@ namespace MediaBrowser.Controller.Entities.Movies { RemoteTrailers = new List(); LocalTrailerIds = new List(); + RemoteTrailerIds = new List(); DisplayOrder = ItemSortBy.PremiereDate; Keywords = new List(); @@ -35,6 +36,7 @@ namespace MediaBrowser.Controller.Entities.Movies } public List LocalTrailerIds { get; set; } + public List RemoteTrailerIds { get; set; } /// /// Gets or sets the remote trailers. @@ -76,6 +78,17 @@ namespace MediaBrowser.Controller.Entities.Movies } } + /// + /// Gets the trailer ids. + /// + /// List<Guid>. + public List GetTrailerIds() + { + var list = LocalTrailerIds.ToList(); + list.AddRange(RemoteTrailerIds); + return list; + } + public override IEnumerable GetChildren(User user, bool includeLinkedChildren) { var children = base.GetChildren(user, includeLinkedChildren); diff --git a/MediaBrowser.Controller/Entities/Movies/Movie.cs b/MediaBrowser.Controller/Entities/Movies/Movie.cs index 8ae024f379..e749d89e4f 100644 --- a/MediaBrowser.Controller/Entities/Movies/Movie.cs +++ b/MediaBrowser.Controller/Entities/Movies/Movie.cs @@ -36,6 +36,7 @@ namespace MediaBrowser.Controller.Entities.Movies SoundtrackIds = new List(); RemoteTrailers = new List(); LocalTrailerIds = new List(); + RemoteTrailerIds = new List(); ThemeSongIds = new List(); ThemeVideoIds = new List(); BoxSetIdList = new List(); @@ -49,6 +50,7 @@ namespace MediaBrowser.Controller.Entities.Movies public float? Metascore { get; set; } public List LocalTrailerIds { get; set; } + public List RemoteTrailerIds { get; set; } public List Keywords { get; set; } public List RemoteTrailers { get; set; } @@ -89,6 +91,17 @@ namespace MediaBrowser.Controller.Entities.Movies /// The name of the TMDB collection. public string TmdbCollectionName { get; set; } + /// + /// Gets the trailer ids. + /// + /// List<Guid>. + public List GetTrailerIds() + { + var list = LocalTrailerIds.ToList(); + list.AddRange(RemoteTrailerIds); + return list; + } + /// /// Gets the user data key. /// diff --git a/MediaBrowser.Controller/Entities/TV/Series.cs b/MediaBrowser.Controller/Entities/TV/Series.cs index 3d1051b183..4c0d1fdfb6 100644 --- a/MediaBrowser.Controller/Entities/TV/Series.cs +++ b/MediaBrowser.Controller/Entities/TV/Series.cs @@ -36,6 +36,7 @@ namespace MediaBrowser.Controller.Entities.TV SoundtrackIds = new List(); RemoteTrailers = new List(); LocalTrailerIds = new List(); + RemoteTrailerIds = new List(); DisplaySpecialsWithSeasons = true; } @@ -57,7 +58,8 @@ namespace MediaBrowser.Controller.Entities.TV public bool DisplaySpecialsWithSeasons { get; set; } public List LocalTrailerIds { get; set; } - + public List RemoteTrailerIds { get; set; } + public List RemoteTrailers { get; set; } /// @@ -109,6 +111,17 @@ namespace MediaBrowser.Controller.Entities.TV return this.GetProviderId(MetadataProviders.Tvdb) ?? this.GetProviderId(MetadataProviders.Tvcom) ?? base.GetUserDataKey(); } + /// + /// Gets the trailer ids. + /// + /// List<Guid>. + public List GetTrailerIds() + { + var list = LocalTrailerIds.ToList(); + list.AddRange(RemoteTrailerIds); + return list; + } + // Studio, Genre and Rating will all be the same so makes no sense to index by these protected override IEnumerable GetIndexByOptions() { diff --git a/MediaBrowser.Controller/Entities/Trailer.cs b/MediaBrowser.Controller/Entities/Trailer.cs index 07173d26fd..bb165d7909 100644 --- a/MediaBrowser.Controller/Entities/Trailer.cs +++ b/MediaBrowser.Controller/Entities/Trailer.cs @@ -13,7 +13,7 @@ namespace MediaBrowser.Controller.Entities /// Class Trailer /// [Obsolete] - public class Trailer : Video, IHasCriticRating, IHasSoundtracks, IHasProductionLocations, IHasBudget, IHasTrailers, IHasKeywords, IHasTaglines, IHasMetascore, IHasLookupInfo + public class Trailer : Video, IHasCriticRating, IHasSoundtracks, IHasProductionLocations, IHasBudget, IHasKeywords, IHasTaglines, IHasMetascore, IHasLookupInfo { public List SoundtrackIds { get; set; } @@ -24,15 +24,12 @@ namespace MediaBrowser.Controller.Entities RemoteTrailers = new List(); Taglines = new List(); SoundtrackIds = new List(); - LocalTrailerIds = new List(); Keywords = new List(); ProductionLocations = new List(); } public float? Metascore { get; set; } - public List LocalTrailerIds { get; set; } - public List RemoteTrailers { get; set; } public List Keywords { get; set; } diff --git a/MediaBrowser.Controller/Entities/UserViewBuilder.cs b/MediaBrowser.Controller/Entities/UserViewBuilder.cs index aff4af468f..166d56c514 100644 --- a/MediaBrowser.Controller/Entities/UserViewBuilder.cs +++ b/MediaBrowser.Controller/Entities/UserViewBuilder.cs @@ -1428,7 +1428,7 @@ namespace MediaBrowser.Controller.Entities var hasTrailers = item as IHasTrailers; if (hasTrailers != null) { - trailerCount = hasTrailers.LocalTrailerIds.Count; + trailerCount = hasTrailers.GetTrailerIds().Count; } var ok = val ? trailerCount > 0 : trailerCount == 0; diff --git a/MediaBrowser.Controller/Sync/ISyncManager.cs b/MediaBrowser.Controller/Sync/ISyncManager.cs index 1e744a0872..1d5ab7d3e7 100644 --- a/MediaBrowser.Controller/Sync/ISyncManager.cs +++ b/MediaBrowser.Controller/Sync/ISyncManager.cs @@ -1,6 +1,4 @@ -using System.IO; -using MediaBrowser.Controller.Entities; -using MediaBrowser.Model.Devices; +using MediaBrowser.Controller.Entities; using MediaBrowser.Model.Querying; using MediaBrowser.Model.Sync; using System.Collections.Generic; diff --git a/MediaBrowser.Controller/Sync/ISyncRepository.cs b/MediaBrowser.Controller/Sync/ISyncRepository.cs index 9cce69bdc2..d0cf87182e 100644 --- a/MediaBrowser.Controller/Sync/ISyncRepository.cs +++ b/MediaBrowser.Controller/Sync/ISyncRepository.cs @@ -1,5 +1,6 @@ using MediaBrowser.Model.Querying; using MediaBrowser.Model.Sync; +using System.Collections.Generic; using System.Threading.Tasks; namespace MediaBrowser.Controller.Sync @@ -27,6 +28,13 @@ namespace MediaBrowser.Controller.Sync /// Task. Task Update(SyncJob job); + /// + /// Deletes the job. + /// + /// The identifier. + /// Task. + Task DeleteJob(string id); + /// /// Gets the jobs. /// @@ -54,5 +62,12 @@ namespace MediaBrowser.Controller.Sync /// The job item. /// Task. Task Update(SyncJobItem jobItem); + + /// + /// Gets the job items. + /// + /// The job identifier. + /// IEnumerable<SyncJobItem>. + IEnumerable GetJobItems(string jobId); } } diff --git a/MediaBrowser.Dlna/ContentDirectory/ControlHandler.cs b/MediaBrowser.Dlna/ContentDirectory/ControlHandler.cs index 7b2b1f3f50..1faf690c93 100644 --- a/MediaBrowser.Dlna/ContentDirectory/ControlHandler.cs +++ b/MediaBrowser.Dlna/ContentDirectory/ControlHandler.cs @@ -492,7 +492,24 @@ namespace MediaBrowser.Dlna.ContentDirectory }, CancellationToken.None).ConfigureAwait(false); - items.AddRange(trailerResult.Items.Where(i => i.ContainsPerson(person.Name))); + var currentIds = items.Select(i => i.GetProviderId(MetadataProviders.Imdb)) + .ToList(); + + var trailersToAdd = trailerResult.Items + .Where(i => i.ContainsPerson(person.Name)) + .Where(i => + { + // Try to filter out dupes using imdb id + var imdb = i.GetProviderId(MetadataProviders.Imdb); + if (!string.IsNullOrWhiteSpace(imdb) && + currentIds.Contains(imdb, StringComparer.OrdinalIgnoreCase)) + { + return false; + } + return true; + }); + + items.AddRange(trailersToAdd); items = _libraryManager.Sort(items, user, new[] { ItemSortBy.SortName }, SortOrder.Ascending) .Skip(startIndex ?? 0) @@ -527,7 +544,7 @@ namespace MediaBrowser.Dlna.ContentDirectory var movie = item as Movie; if (movie != null) { - if (movie.LocalTrailerIds.Count > 0 || + if (movie.GetTrailerIds().Count > 0 || movie.SpecialFeatureIds.Count > 0) { return StubType.Folder; @@ -559,7 +576,7 @@ namespace MediaBrowser.Dlna.ContentDirectory list.Add(item); - list.AddRange(item.LocalTrailerIds.Select(i => _libraryManager.GetItemById(i)).Where(i => i != null)); + list.AddRange(item.GetTrailerIds().Select(i => _libraryManager.GetItemById(i)).Where(i => i != null)); list.AddRange(item.SpecialFeatureIds.Select(i => _libraryManager.GetItemById(i)).Where(i => i != null)); var serverItems = list.Select(i => new ServerItem { Item = i, StubType = null }) diff --git a/MediaBrowser.Model.Portable/MediaBrowser.Model.Portable.csproj b/MediaBrowser.Model.Portable/MediaBrowser.Model.Portable.csproj index 6f0943cfa6..bcd6e08f11 100644 --- a/MediaBrowser.Model.Portable/MediaBrowser.Model.Portable.csproj +++ b/MediaBrowser.Model.Portable/MediaBrowser.Model.Portable.csproj @@ -1043,9 +1043,6 @@ Sync\SyncJobStatus.cs - - Sync\SyncLimitType.cs - Sync\SyncQuality.cs diff --git a/MediaBrowser.Model.net35/MediaBrowser.Model.net35.csproj b/MediaBrowser.Model.net35/MediaBrowser.Model.net35.csproj index 088fd023c9..55d18c1b34 100644 --- a/MediaBrowser.Model.net35/MediaBrowser.Model.net35.csproj +++ b/MediaBrowser.Model.net35/MediaBrowser.Model.net35.csproj @@ -1002,9 +1002,6 @@ Sync\SyncJobStatus.cs - - Sync\SyncLimitType.cs - Sync\SyncQuality.cs diff --git a/MediaBrowser.Model/ApiClient/IApiClient.cs b/MediaBrowser.Model/ApiClient/IApiClient.cs index b5b0b641a3..13907e5c60 100644 --- a/MediaBrowser.Model/ApiClient/IApiClient.cs +++ b/MediaBrowser.Model/ApiClient/IApiClient.cs @@ -14,6 +14,7 @@ using MediaBrowser.Model.Querying; using MediaBrowser.Model.Search; using MediaBrowser.Model.Serialization; using MediaBrowser.Model.Session; +using MediaBrowser.Model.Sync; using MediaBrowser.Model.System; using MediaBrowser.Model.Tasks; using MediaBrowser.Model.Users; @@ -1371,6 +1372,20 @@ namespace MediaBrowser.Model.ApiClient /// Task<DevicesOptions>. Task GetDevicesOptions(); + /// + /// Updates the item. + /// + /// The item. + /// Task. + Task UpdateItem(BaseItemDto item); + + /// + /// Requests the synchronize. + /// + /// The request. + /// Task<SyncJob>. + Task RequestSync(SyncJobRequest request); + /// /// Opens the web socket. /// diff --git a/MediaBrowser.Model/MediaBrowser.Model.csproj b/MediaBrowser.Model/MediaBrowser.Model.csproj index f7eb54292c..4825cb4ccb 100644 --- a/MediaBrowser.Model/MediaBrowser.Model.csproj +++ b/MediaBrowser.Model/MediaBrowser.Model.csproj @@ -368,7 +368,6 @@ - diff --git a/MediaBrowser.Model/Querying/ItemFields.cs b/MediaBrowser.Model/Querying/ItemFields.cs index d0e2c95119..a5a906f954 100644 --- a/MediaBrowser.Model/Querying/ItemFields.cs +++ b/MediaBrowser.Model/Querying/ItemFields.cs @@ -165,7 +165,7 @@ namespace MediaBrowser.Model.Querying /// The series studio /// SeriesStudio, - + /// /// The soundtrack ids /// diff --git a/MediaBrowser.Model/Session/ClientCapabilities.cs b/MediaBrowser.Model/Session/ClientCapabilities.cs index cbc1501d20..fc0d3a1fb6 100644 --- a/MediaBrowser.Model/Session/ClientCapabilities.cs +++ b/MediaBrowser.Model/Session/ClientCapabilities.cs @@ -13,11 +13,13 @@ namespace MediaBrowser.Model.Session public string MessageCallbackUrl { get; set; } public bool SupportsContentUploading { get; set; } + public bool SupportsDeviceId { get; set; } public ClientCapabilities() { PlayableMediaTypes = new List(); SupportedCommands = new List(); + SupportsDeviceId = true; } } } \ No newline at end of file diff --git a/MediaBrowser.Model/Sync/SyncJob.cs b/MediaBrowser.Model/Sync/SyncJob.cs index f69fccae50..db67f3cbb5 100644 --- a/MediaBrowser.Model/Sync/SyncJob.cs +++ b/MediaBrowser.Model/Sync/SyncJob.cs @@ -46,26 +46,26 @@ namespace MediaBrowser.Model.Sync /// true if [unwatched only]; otherwise, false. public bool UnwatchedOnly { get; set; } /// - /// Gets or sets the limit. + /// Gets or sets a value indicating whether [remove when watched]. /// - /// The limit. - public long? Limit { get; set; } + /// true if [remove when watched]; otherwise, false. + public bool RemoveWhenWatched { get; set; } /// - /// Gets or sets the type of the limit. + /// Gets or sets a value indicating whether [synchronize new content]. /// - /// The type of the limit. - public SyncLimitType? LimitType { get; set; } + /// true if [synchronize new content]; otherwise, false. + public bool SyncNewContent { get; set; } + /// + /// Gets or sets the item limit. + /// + /// The item limit. + public int? ItemLimit { get; set; } /// /// Gets or sets the requested item ids. /// /// The requested item ids. public List RequestedItemIds { get; set; } /// - /// Gets or sets a value indicating whether this instance is dynamic. - /// - /// true if this instance is dynamic; otherwise, false. - public bool IsDynamic { get; set; } - /// /// Gets or sets the date created. /// /// The date created. diff --git a/MediaBrowser.Model/Sync/SyncJobRequest.cs b/MediaBrowser.Model/Sync/SyncJobRequest.cs index 987f396e40..4e044d62a2 100644 --- a/MediaBrowser.Model/Sync/SyncJobRequest.cs +++ b/MediaBrowser.Model/Sync/SyncJobRequest.cs @@ -35,19 +35,25 @@ namespace MediaBrowser.Model.Sync /// true if [unwatched only]; otherwise, false. public bool UnwatchedOnly { get; set; } /// - /// Gets or sets the limit. + /// Gets or sets a value indicating whether [remove when watched]. /// - /// The limit. - public long? Limit { get; set; } + /// true if [remove when watched]; otherwise, false. + public bool RemoveWhenWatched { get; set; } + /// + /// Gets or sets a value indicating whether [synchronize new content]. + /// + /// true if [synchronize new content]; otherwise, false. + public bool SyncNewContent { get; set; } /// - /// Gets or sets the type of the limit. + /// Gets or sets the limit. /// - /// The type of the limit. - public SyncLimitType? LimitType { get; set; } + /// The limit. + public int? ItemLimit { get; set; } public SyncJobRequest() { ItemIds = new List(); + SyncNewContent = true; } } } diff --git a/MediaBrowser.Model/Sync/SyncJobStatus.cs b/MediaBrowser.Model/Sync/SyncJobStatus.cs index ebe375ad80..42af96509d 100644 --- a/MediaBrowser.Model/Sync/SyncJobStatus.cs +++ b/MediaBrowser.Model/Sync/SyncJobStatus.cs @@ -4,10 +4,9 @@ namespace MediaBrowser.Model.Sync public enum SyncJobStatus { Queued = 0, - Transcoding = 1, - TranscodingFailed = 2, - Transferring = 3, - Completed = 4, - Cancelled = 5 + Converting = 1, + Transferring = 2, + Completed = 3, + Cancelled = 4 } } diff --git a/MediaBrowser.Model/Sync/SyncLimitType.cs b/MediaBrowser.Model/Sync/SyncLimitType.cs deleted file mode 100644 index d20f9e33d1..0000000000 --- a/MediaBrowser.Model/Sync/SyncLimitType.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace MediaBrowser.Model.Sync -{ - public enum SyncLimitType - { - ItemCount = 0 - } -} \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Dto/DtoService.cs b/MediaBrowser.Server.Implementations/Dto/DtoService.cs index 6485eaf671..e1e8da5c55 100644 --- a/MediaBrowser.Server.Implementations/Dto/DtoService.cs +++ b/MediaBrowser.Server.Implementations/Dto/DtoService.cs @@ -833,7 +833,7 @@ namespace MediaBrowser.Server.Implementations.Dto var hasTrailers = item as IHasTrailers; if (hasTrailers != null) { - dto.LocalTrailerCount = hasTrailers.LocalTrailerIds.Count; + dto.LocalTrailerCount = hasTrailers.GetTrailerIds().Count; } var hasDisplayOrder = item as IHasDisplayOrder; diff --git a/MediaBrowser.Server.Implementations/Library/CoreResolutionIgnoreRule.cs b/MediaBrowser.Server.Implementations/Library/CoreResolutionIgnoreRule.cs index 3768b44929..7edd9541f2 100644 --- a/MediaBrowser.Server.Implementations/Library/CoreResolutionIgnoreRule.cs +++ b/MediaBrowser.Server.Implementations/Library/CoreResolutionIgnoreRule.cs @@ -3,6 +3,7 @@ using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Resolvers; using System; +using System.Collections.Generic; using System.IO; using System.Linq; @@ -16,6 +17,21 @@ namespace MediaBrowser.Server.Implementations.Library private readonly IFileSystem _fileSystem; private readonly ILibraryManager _libraryManager; + /// + /// Any folder named in this list will be ignored - can be added to at runtime for extensibility + /// + public static readonly List IgnoreFolders = new List + { + "metadata", + "ps3_update", + "ps3_vprm", + "extrafanart", + "extrathumbs", + ".actors", + ".wd_tv" + + }; + public CoreResolutionIgnoreRule(IFileSystem fileSystem, ILibraryManager libraryManager) { _fileSystem = fileSystem; @@ -64,7 +80,7 @@ namespace MediaBrowser.Server.Implementations.Library if (args.IsDirectory) { // Ignore any folders in our list - if (EntityResolutionHelper.IgnoreFolders.Contains(filename, StringComparer.OrdinalIgnoreCase)) + if (IgnoreFolders.Contains(filename, StringComparer.OrdinalIgnoreCase)) { return true; } @@ -88,15 +104,6 @@ namespace MediaBrowser.Server.Implementations.Library } else { - if (args.Parent != null) - { - // Don't resolve these into audio files - if (string.Equals(_fileSystem.GetFileNameWithoutExtension(filename), BaseItem.ThemeSongFilename) && _libraryManager.IsAudioFile(filename)) - { - return true; - } - } - // Ignore samples if (filename.IndexOf(".sample.", StringComparison.OrdinalIgnoreCase) != -1) { diff --git a/MediaBrowser.Server.Implementations/Library/EntityResolutionHelper.cs b/MediaBrowser.Server.Implementations/Library/EntityResolutionHelper.cs deleted file mode 100644 index 2a8c4f7f32..0000000000 --- a/MediaBrowser.Server.Implementations/Library/EntityResolutionHelper.cs +++ /dev/null @@ -1,30 +0,0 @@ -using MediaBrowser.Common.IO; -using MediaBrowser.Controller.Entities; -using MediaBrowser.Controller.Library; -using System; -using System.Collections.Generic; -using System.IO; - -namespace MediaBrowser.Server.Implementations.Library -{ - /// - /// Class EntityResolutionHelper - /// - public static class EntityResolutionHelper - { - /// - /// Any folder named in this list will be ignored - can be added to at runtime for extensibility - /// - public static readonly List IgnoreFolders = new List - { - "metadata", - "ps3_update", - "ps3_vprm", - "extrafanart", - "extrathumbs", - ".actors", - ".wd_tv" - - }; - } -} diff --git a/MediaBrowser.Server.Implementations/Library/LocalTrailerPostScanTask.cs b/MediaBrowser.Server.Implementations/Library/LocalTrailerPostScanTask.cs new file mode 100644 index 0000000000..9196bf7340 --- /dev/null +++ b/MediaBrowser.Server.Implementations/Library/LocalTrailerPostScanTask.cs @@ -0,0 +1,94 @@ +using System.Collections.Generic; +using MediaBrowser.Controller.Channels; +using MediaBrowser.Controller.Entities; +using MediaBrowser.Controller.Library; +using MediaBrowser.Model.Channels; +using MediaBrowser.Model.Entities; +using System; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; + +namespace MediaBrowser.Server.Implementations.Library +{ + public class LocalTrailerPostScanTask : ILibraryPostScanTask + { + private readonly ILibraryManager _libraryManager; + private readonly IChannelManager _channelManager; + + public LocalTrailerPostScanTask(ILibraryManager libraryManager, IChannelManager channelManager) + { + _libraryManager = libraryManager; + _channelManager = channelManager; + } + + public async Task Run(IProgress progress, CancellationToken cancellationToken) + { + var items = _libraryManager.RootFolder + .RecursiveChildren + .OfType() + .ToList(); + + var channelTrailerResult = await _channelManager.GetAllMediaInternal(new AllChannelMediaQuery + { + ExtraTypes = new[] { ExtraType.Trailer } + + }, CancellationToken.None); + var channelTrailers = channelTrailerResult.Items; + + var numComplete = 0; + + foreach (var item in items) + { + cancellationToken.ThrowIfCancellationRequested(); + + await AssignTrailers(item, channelTrailers).ConfigureAwait(false); + + numComplete++; + double percent = numComplete; + percent /= items.Count; + progress.Report(percent * 100); + } + + progress.Report(100); + } + + private async Task AssignTrailers(IHasTrailers item, BaseItem[] channelTrailers) + { + if (item is Game) + { + return; + } + + var imdbId = item.GetProviderId(MetadataProviders.Imdb); + var tmdbId = item.GetProviderId(MetadataProviders.Tmdb); + + var trailers = channelTrailers.Where(i => + { + if (!string.IsNullOrWhiteSpace(imdbId) && + string.Equals(imdbId, i.GetProviderId(MetadataProviders.Imdb), StringComparison.OrdinalIgnoreCase)) + { + return true; + } + if (!string.IsNullOrWhiteSpace(tmdbId) && + string.Equals(tmdbId, i.GetProviderId(MetadataProviders.Tmdb), StringComparison.OrdinalIgnoreCase)) + { + return true; + } + return false; + }); + + var trailerIds = trailers.Select(i => i.Id) + .ToList(); + + if (!trailerIds.SequenceEqual(item.RemoteTrailerIds)) + { + item.RemoteTrailerIds = trailerIds; + + var baseItem = (BaseItem)item; + await baseItem.UpdateToRepository(ItemUpdateType.MetadataImport, CancellationToken.None) + .ConfigureAwait(false); + } + } + } +} diff --git a/MediaBrowser.Server.Implementations/Library/Resolvers/Audio/AudioResolver.cs b/MediaBrowser.Server.Implementations/Library/Resolvers/Audio/AudioResolver.cs index 62eb1f47d4..b4cda39cd2 100644 --- a/MediaBrowser.Server.Implementations/Library/Resolvers/Audio/AudioResolver.cs +++ b/MediaBrowser.Server.Implementations/Library/Resolvers/Audio/AudioResolver.cs @@ -41,10 +41,19 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers.Audio { var collectionType = args.GetCollectionType(); + var isMixed = string.IsNullOrWhiteSpace(collectionType); + + // For conflicting extensions, give priority to videos + if (isMixed && _libraryManager.IsVideoFile(args.Path)) + { + return null; + } + var isStandalone = args.Parent == null; if (isStandalone || - string.Equals(collectionType, CollectionType.Music, StringComparison.OrdinalIgnoreCase)) + string.Equals(collectionType, CollectionType.Music, StringComparison.OrdinalIgnoreCase) || + isMixed) { return new Controller.Entities.Audio.Audio(); } diff --git a/MediaBrowser.Server.Implementations/Library/Resolvers/Audio/MusicAlbumResolver.cs b/MediaBrowser.Server.Implementations/Library/Resolvers/Audio/MusicAlbumResolver.cs index 5ba07cdaeb..7f844ca0ee 100644 --- a/MediaBrowser.Server.Implementations/Library/Resolvers/Audio/MusicAlbumResolver.cs +++ b/MediaBrowser.Server.Implementations/Library/Resolvers/Audio/MusicAlbumResolver.cs @@ -141,12 +141,6 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers.Audio if (libraryManager.IsAudioFile(fullName)) { - // Don't resolve these into audio files - if (string.Equals(fileSystem.GetFileNameWithoutExtension(fullName), BaseItem.ThemeSongFilename)) - { - continue; - } - return true; } } diff --git a/MediaBrowser.Server.Implementations/Library/Resolvers/TV/SeriesResolver.cs b/MediaBrowser.Server.Implementations/Library/Resolvers/TV/SeriesResolver.cs index 1efe4e8809..ce74915248 100644 --- a/MediaBrowser.Server.Implementations/Library/Resolvers/TV/SeriesResolver.cs +++ b/MediaBrowser.Server.Implementations/Library/Resolvers/TV/SeriesResolver.cs @@ -99,12 +99,11 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers.TV /// The file system children. /// The directory service. /// The file system. + /// The logger. + /// The library manager. /// true if [is series folder] [the specified path]; otherwise, false. public static bool IsSeriesFolder(string path, bool considerSeasonlessEntries, IEnumerable fileSystemChildren, IDirectoryService directoryService, IFileSystem fileSystem, ILogger logger, ILibraryManager libraryManager) { - // A folder with more than 3 non-season folders in will not becounted as a series - var nonSeriesFolders = 0; - foreach (var child in fileSystemChildren) { var attributes = child.Attributes; @@ -129,19 +128,6 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers.TV //logger.Debug("{0} is a series because of season folder {1}.", path, child.FullName); return true; } - - if (IsBadFolder(child.Name)) - { - logger.Debug("Invalid folder under series: {0}", child.FullName); - - nonSeriesFolders++; - } - - if (nonSeriesFolders >= 3) - { - logger.Debug("{0} not a series due to 3 or more invalid folders.", path); - return false; - } } else { @@ -179,24 +165,6 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers.TV return string.Equals(extension, ".disc", StringComparison.OrdinalIgnoreCase); } - private static bool IsBadFolder(string name) - { - if (string.Equals(name, BaseItem.ThemeSongsFolderName, StringComparison.OrdinalIgnoreCase)) - { - return false; - } - if (string.Equals(name, BaseItem.ThemeVideosFolderName, StringComparison.OrdinalIgnoreCase)) - { - return false; - } - if (string.Equals(name, BaseItem.TrailerFolderName, StringComparison.OrdinalIgnoreCase)) - { - return false; - } - - return !EntityResolutionHelper.IgnoreFolders.Contains(name, StringComparer.OrdinalIgnoreCase); - } - /// /// Determines whether [is season folder] [the specified path]. /// diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/ar.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/ar.json index ec08593ede..81c5ef633d 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/ar.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/ar.json @@ -626,5 +626,6 @@ "MessagePasswordResetForUsers": "Passwords have been reset for the following users:", "HeaderInviteGuest": "Invite Guest", "ButtonLinkMyMediaBrowserAccount": "Link my account now", - "MessageConnectAccountRequiredToInviteGuest": "In order to invite guests you need to first link your Media Browser account to this server." + "MessageConnectAccountRequiredToInviteGuest": "In order to invite guests you need to first link your Media Browser account to this server.", + "ButtonSync": "Sync" } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/ca.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/ca.json index 63d7b02c01..e84d0892ff 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/ca.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/ca.json @@ -626,5 +626,6 @@ "MessagePasswordResetForUsers": "Passwords have been reset for the following users:", "HeaderInviteGuest": "Invite Guest", "ButtonLinkMyMediaBrowserAccount": "Link my account now", - "MessageConnectAccountRequiredToInviteGuest": "In order to invite guests you need to first link your Media Browser account to this server." + "MessageConnectAccountRequiredToInviteGuest": "In order to invite guests you need to first link your Media Browser account to this server.", + "ButtonSync": "Sync" } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/cs.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/cs.json index c90af9fb18..008c3bf27e 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/cs.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/cs.json @@ -626,5 +626,6 @@ "MessagePasswordResetForUsers": "Passwords have been reset for the following users:", "HeaderInviteGuest": "Invite Guest", "ButtonLinkMyMediaBrowserAccount": "Link my account now", - "MessageConnectAccountRequiredToInviteGuest": "In order to invite guests you need to first link your Media Browser account to this server." + "MessageConnectAccountRequiredToInviteGuest": "In order to invite guests you need to first link your Media Browser account to this server.", + "ButtonSync": "Sync" } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/da.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/da.json index dca2f1daa4..5aca8c4067 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/da.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/da.json @@ -626,5 +626,6 @@ "MessagePasswordResetForUsers": "Passwords have been reset for the following users:", "HeaderInviteGuest": "Invite Guest", "ButtonLinkMyMediaBrowserAccount": "Link my account now", - "MessageConnectAccountRequiredToInviteGuest": "In order to invite guests you need to first link your Media Browser account to this server." + "MessageConnectAccountRequiredToInviteGuest": "In order to invite guests you need to first link your Media Browser account to this server.", + "ButtonSync": "Sync" } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/de.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/de.json index f3170f463c..257716dd57 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/de.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/de.json @@ -610,7 +610,7 @@ "MessageInvitationSentToUser": "Eine E-Mail mit der Einladung zum Sharing ist an {0} geschickt worden.", "MessageInvitationSentToNewUser": "Eine E-Mail mit der Einladung zur Anmeldung am Media Browser ist an {0} geschickt worden.", "HeaderConnectionFailure": "Verbindungsfehler", - "MessageUnableToConnectToServer": "We're unable to connect to the selected server right now. Please try again later.", + "MessageUnableToConnectToServer": "Wir sind momentan nicht in der Lage, zum ausgew\u00e4hlten Server zu verbinden. Bitte versuche es sp\u00e4ter noch einmal.", "ButtonSelectServer": "W\u00e4hle Server", "MessagePluginConfigurationRequiresLocalAccess": "Melde dich bitte direkt an deinem lokalen Server an, um dieses Plugin konfigurieren zu k\u00f6nnen.", "MessageLoggedOutParentalControl": "Der Zugriff ist derzeit eingeschr\u00e4nkt. Bitte versuche es sp\u00e4ter erneut.", @@ -626,5 +626,6 @@ "MessagePasswordResetForUsers": "Passw\u00f6rter wurden f\u00fcr die folgenden Benutzer zur\u00fcckgesetzt:", "HeaderInviteGuest": "Lade G\u00e4ste ein", "ButtonLinkMyMediaBrowserAccount": "Verkn\u00fcpfe jetzt meinen Account", - "MessageConnectAccountRequiredToInviteGuest": "Um G\u00e4ste einladen zu k\u00f6nnen, musst du zuerst deinen Media Browser Account auf diesem Server verkn\u00fcpfen." + "MessageConnectAccountRequiredToInviteGuest": "Um G\u00e4ste einladen zu k\u00f6nnen, musst du zuerst deinen Media Browser Account auf diesem Server verkn\u00fcpfen.", + "ButtonSync": "Synchronisieren" } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/el.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/el.json index e0f427287f..ca51e93bed 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/el.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/el.json @@ -626,5 +626,6 @@ "MessagePasswordResetForUsers": "Passwords have been reset for the following users:", "HeaderInviteGuest": "Invite Guest", "ButtonLinkMyMediaBrowserAccount": "Link my account now", - "MessageConnectAccountRequiredToInviteGuest": "In order to invite guests you need to first link your Media Browser account to this server." + "MessageConnectAccountRequiredToInviteGuest": "In order to invite guests you need to first link your Media Browser account to this server.", + "ButtonSync": "Sync" } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/en_GB.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/en_GB.json index 1412882be2..72bca02322 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/en_GB.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/en_GB.json @@ -626,5 +626,6 @@ "MessagePasswordResetForUsers": "Passwords have been reset for the following users:", "HeaderInviteGuest": "Invite Guest", "ButtonLinkMyMediaBrowserAccount": "Link my account now", - "MessageConnectAccountRequiredToInviteGuest": "In order to invite guests you need to first link your Media Browser account to this server." + "MessageConnectAccountRequiredToInviteGuest": "In order to invite guests you need to first link your Media Browser account to this server.", + "ButtonSync": "Sync" } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/en_US.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/en_US.json index d0479eb2af..709d260b23 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/en_US.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/en_US.json @@ -626,5 +626,6 @@ "MessagePasswordResetForUsers": "Passwords have been reset for the following users:", "HeaderInviteGuest": "Invite Guest", "ButtonLinkMyMediaBrowserAccount": "Link my account now", - "MessageConnectAccountRequiredToInviteGuest": "In order to invite guests you need to first link your Media Browser account to this server." + "MessageConnectAccountRequiredToInviteGuest": "In order to invite guests you need to first link your Media Browser account to this server.", + "ButtonSync": "Sync" } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/es.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/es.json index fa768f480d..2bd8ca507a 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/es.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/es.json @@ -626,5 +626,6 @@ "MessagePasswordResetForUsers": "Passwords have been reset for the following users:", "HeaderInviteGuest": "Invite Guest", "ButtonLinkMyMediaBrowserAccount": "Link my account now", - "MessageConnectAccountRequiredToInviteGuest": "In order to invite guests you need to first link your Media Browser account to this server." + "MessageConnectAccountRequiredToInviteGuest": "In order to invite guests you need to first link your Media Browser account to this server.", + "ButtonSync": "Sync" } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/es_MX.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/es_MX.json index 7855fff744..bf00b54544 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/es_MX.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/es_MX.json @@ -485,7 +485,7 @@ "ValueOneMusicVideo": "1 video musical", "ValueMusicVideoCount": "{0} videos musicales", "HeaderOffline": "Fuera de L\u00ednea", - "HeaderUnaired": "No transmitido", + "HeaderUnaired": "No Emitido", "HeaderMissing": "Falta", "ButtonWebsite": "Sitio web", "TooltipFavorite": "Favorito", @@ -610,7 +610,7 @@ "MessageInvitationSentToUser": "Se ha enviado un correo electr\u00f3nico a {0}, invit\u00e1ndolo a aceptar tu invitaci\u00f3n para compartir.", "MessageInvitationSentToNewUser": "Se ha enviado un correo electr\u00f3nico a {0} invit\u00e1ndolo a registrarse con Media Browser.", "HeaderConnectionFailure": "Falla de Conexi\u00f3n", - "MessageUnableToConnectToServer": "We're unable to connect to the selected server right now. Please try again later.", + "MessageUnableToConnectToServer": "No es posible conectarse al servidor seleccionado en este momento. Por favor int\u00e9ntelo nuevamente m\u00e1s tarde.", "ButtonSelectServer": "Seleccionar servidor", "MessagePluginConfigurationRequiresLocalAccess": "Para configurar este complemento por favor inicie sesi\u00f3n en su servidor local directamente.", "MessageLoggedOutParentalControl": "El acceso se encuentra restringido en este momento. Por favor int\u00e9ntelo de nuevo mas tarde.", @@ -626,5 +626,6 @@ "MessagePasswordResetForUsers": "Las contrase\u00f1as se han restablecido para los siguientes usuarios:", "HeaderInviteGuest": "Agregar un Invitado", "ButtonLinkMyMediaBrowserAccount": "Enlazar mi cuenta ahora", - "MessageConnectAccountRequiredToInviteGuest": "Para poder agregar invitados primero necesitas vincular tu cuenta de Media Browser a este servidor." + "MessageConnectAccountRequiredToInviteGuest": "Para poder agregar invitados primero necesitas vincular tu cuenta de Media Browser a este servidor.", + "ButtonSync": "Sinc" } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/fi.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/fi.json index a5ffa3cd63..a1fa3c2adc 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/fi.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/fi.json @@ -626,5 +626,6 @@ "MessagePasswordResetForUsers": "Passwords have been reset for the following users:", "HeaderInviteGuest": "Invite Guest", "ButtonLinkMyMediaBrowserAccount": "Link my account now", - "MessageConnectAccountRequiredToInviteGuest": "In order to invite guests you need to first link your Media Browser account to this server." + "MessageConnectAccountRequiredToInviteGuest": "In order to invite guests you need to first link your Media Browser account to this server.", + "ButtonSync": "Sync" } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/fr.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/fr.json index e2190a380f..144eb1207c 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/fr.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/fr.json @@ -610,7 +610,7 @@ "MessageInvitationSentToUser": "Un mail a \u00e9t\u00e9 envoy\u00e9 \u00e0 {0} pour les inviter \u00e0 accepter votre invitation de partage.", "MessageInvitationSentToNewUser": "Un mail a \u00e9t\u00e9 envoy\u00e9 \u00e0 {0} pour les inviter \u00e0 s'inscrire sur Media Browser.", "HeaderConnectionFailure": "Erreur de connexion", - "MessageUnableToConnectToServer": "We're unable to connect to the selected server right now. Please try again later.", + "MessageUnableToConnectToServer": "Nous sommes dans l'impossibilit\u00e9 de nous connect\u00e9 au serveur pour le moment. Veuillez r\u00e9essayer plus tard.", "ButtonSelectServer": "S\u00e9lectionner le serveur", "MessagePluginConfigurationRequiresLocalAccess": "Pour configurer ce plugin, S.v.p. connecter vous \u00e0 votre serveur local directement.", "MessageLoggedOutParentalControl": "L'acc\u00e8s est actuellement limit\u00e9. S.v.p. r\u00e9essayez plus tard", @@ -626,5 +626,6 @@ "MessagePasswordResetForUsers": "Les mot de passes ont \u00e9t\u00e9 r\u00e9initialis\u00e9s pour les utilisateurs suivants:", "HeaderInviteGuest": "Inviter une personne", "ButtonLinkMyMediaBrowserAccount": "Lier \u00e0 mon compte maintenant", - "MessageConnectAccountRequiredToInviteGuest": "Pour inviter des personnes vous devez d'abord lier votre compte Media Browser \u00e0 ce serveur." + "MessageConnectAccountRequiredToInviteGuest": "Pour inviter des personnes vous devez d'abord lier votre compte Media Browser \u00e0 ce serveur.", + "ButtonSync": "Sync" } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/he.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/he.json index 323eb950e3..77ea8846d5 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/he.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/he.json @@ -626,5 +626,6 @@ "MessagePasswordResetForUsers": "Passwords have been reset for the following users:", "HeaderInviteGuest": "Invite Guest", "ButtonLinkMyMediaBrowserAccount": "Link my account now", - "MessageConnectAccountRequiredToInviteGuest": "In order to invite guests you need to first link your Media Browser account to this server." + "MessageConnectAccountRequiredToInviteGuest": "In order to invite guests you need to first link your Media Browser account to this server.", + "ButtonSync": "Sync" } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/hr.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/hr.json index c5fb87ea99..188bc25e91 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/hr.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/hr.json @@ -626,5 +626,6 @@ "MessagePasswordResetForUsers": "Passwords have been reset for the following users:", "HeaderInviteGuest": "Invite Guest", "ButtonLinkMyMediaBrowserAccount": "Link my account now", - "MessageConnectAccountRequiredToInviteGuest": "In order to invite guests you need to first link your Media Browser account to this server." + "MessageConnectAccountRequiredToInviteGuest": "In order to invite guests you need to first link your Media Browser account to this server.", + "ButtonSync": "Sync" } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/it.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/it.json index 5cbb53d29d..b8e95864bc 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/it.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/it.json @@ -626,5 +626,6 @@ "MessagePasswordResetForUsers": "Le password sono state rimesse per i seguenti utenti:", "HeaderInviteGuest": "Invita Ospite", "ButtonLinkMyMediaBrowserAccount": "Collega il mio account", - "MessageConnectAccountRequiredToInviteGuest": "Per invitare gli ospiti \u00e8 necessario collegare prima il tuo account browser media a questo server." + "MessageConnectAccountRequiredToInviteGuest": "Per invitare gli ospiti \u00e8 necessario collegare prima il tuo account browser media a questo server.", + "ButtonSync": "Sinc." } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/javascript.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/javascript.json index d0975221e3..5f2c7b2bc8 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/javascript.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/javascript.json @@ -634,5 +634,9 @@ "MessagePasswordResetForUsers": "Passwords have been reset for the following users:", "HeaderInviteGuest": "Invite Guest", "ButtonLinkMyMediaBrowserAccount": "Link my account now", - "MessageConnectAccountRequiredToInviteGuest": "In order to invite guests you need to first link your Media Browser account to this server." + "MessageConnectAccountRequiredToInviteGuest": "In order to invite guests you need to first link your Media Browser account to this server.", + "ButtonSync": "Sync", + "SyncMedia": "Sync Media", + "HeaderCancelSyncJob": "Cancel Sync", + "CancelSyncJobConfirmation": "Are you sure you wish to cancel this sync job?" } diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/kk.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/kk.json index 371087bc4d..6ad1613514 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/kk.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/kk.json @@ -626,5 +626,6 @@ "MessagePasswordResetForUsers": "\u049a\u04b1\u043f\u0438\u044f \u0441\u04e9\u0437\u0434\u0435\u0440 \u043a\u0435\u043b\u0435\u0441\u0456 \u043f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0448\u044b\u043b\u0430\u0440 \u04af\u0448\u0456\u043d \u044b\u0441\u044b\u0440\u044b\u043b\u0434\u044b:", "HeaderInviteGuest": "\u049a\u043e\u043d\u0430\u049b\u0442\u044b \u0448\u0430\u049b\u044b\u0440\u0443", "ButtonLinkMyMediaBrowserAccount": "\u0422\u0456\u0440\u043a\u0435\u043b\u0433\u0456\u043c\u0434\u0456 \u0431\u0430\u0439\u043b\u0430\u043d\u044b\u0441\u0442\u044b\u0440\u0443", - "MessageConnectAccountRequiredToInviteGuest": "\u049a\u043e\u043d\u0430\u049b\u0442\u0430\u0440\u0434\u044b \u0448\u0430\u049b\u044b\u0440\u0443 \u04af\u0448\u0456\u043d \u0435\u04a3 \u0430\u043b\u0434\u044b\u043d\u0434\u0430 \u043e\u0441\u044b \u0441\u0435\u0440\u0432\u0435\u0440\u0433\u0435 Media Browser \u0442\u0456\u0440\u043a\u0435\u043b\u0433\u0456\u04a3\u0456\u0437\u0434\u0456 \u0431\u0430\u0439\u043b\u0430\u043d\u044b\u0441\u0442\u0440\u0443\u044b\u04a3\u044b\u0437 \u049b\u0430\u0436\u0435\u0442." + "MessageConnectAccountRequiredToInviteGuest": "\u049a\u043e\u043d\u0430\u049b\u0442\u0430\u0440\u0434\u044b \u0448\u0430\u049b\u044b\u0440\u0443 \u04af\u0448\u0456\u043d \u0435\u04a3 \u0430\u043b\u0434\u044b\u043d\u0434\u0430 \u043e\u0441\u044b \u0441\u0435\u0440\u0432\u0435\u0440\u0433\u0435 Media Browser \u0442\u0456\u0440\u043a\u0435\u043b\u0433\u0456\u04a3\u0456\u0437\u0434\u0456 \u0431\u0430\u0439\u043b\u0430\u043d\u044b\u0441\u0442\u0440\u0443\u044b\u04a3\u044b\u0437 \u049b\u0430\u0436\u0435\u0442.", + "ButtonSync": "\u0421\u0438\u043d\u0445\u0440\u043e" } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/ms.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/ms.json index 95d07be553..a82d2b4621 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/ms.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/ms.json @@ -626,5 +626,6 @@ "MessagePasswordResetForUsers": "Passwords have been reset for the following users:", "HeaderInviteGuest": "Invite Guest", "ButtonLinkMyMediaBrowserAccount": "Link my account now", - "MessageConnectAccountRequiredToInviteGuest": "In order to invite guests you need to first link your Media Browser account to this server." + "MessageConnectAccountRequiredToInviteGuest": "In order to invite guests you need to first link your Media Browser account to this server.", + "ButtonSync": "Sync" } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/nb.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/nb.json index 66c5fa8625..baae629e1c 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/nb.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/nb.json @@ -626,5 +626,6 @@ "MessagePasswordResetForUsers": "Passwords have been reset for the following users:", "HeaderInviteGuest": "Invite Guest", "ButtonLinkMyMediaBrowserAccount": "Link my account now", - "MessageConnectAccountRequiredToInviteGuest": "In order to invite guests you need to first link your Media Browser account to this server." + "MessageConnectAccountRequiredToInviteGuest": "In order to invite guests you need to first link your Media Browser account to this server.", + "ButtonSync": "Synk" } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/nl.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/nl.json index fc53e577e3..42917eacc6 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/nl.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/nl.json @@ -610,7 +610,7 @@ "MessageInvitationSentToUser": "Een email is verzonden naar {0} om je uitnodiging om media te delen te accepteren.", "MessageInvitationSentToNewUser": "Een email is verzonden naar {0} om je uitnodiging aan te melden bij Media Browser", "HeaderConnectionFailure": "Verbindingsfout", - "MessageUnableToConnectToServer": "We're unable to connect to the selected server right now. Please try again later.", + "MessageUnableToConnectToServer": "Het is momenteel niet mogelijk met de geselecteerde server te verbinden, porbeer het later opnieuw,", "ButtonSelectServer": "Selecteer server", "MessagePluginConfigurationRequiresLocalAccess": "Meld svp. op de lokale server aan om deze plugin te configureren.", "MessageLoggedOutParentalControl": "Toegang is momenteel bepertk, probeer later opnieuw.", @@ -626,5 +626,6 @@ "MessagePasswordResetForUsers": "Wachtwoorden zijn gereset voor de volgende gebruikers:", "HeaderInviteGuest": "Nodig gast uit", "ButtonLinkMyMediaBrowserAccount": "Koppel mijn account nu", - "MessageConnectAccountRequiredToInviteGuest": "Om gasten uit te kunnen nodigen moet je Media Browser account aan deze server gekoppeld worden." + "MessageConnectAccountRequiredToInviteGuest": "Om gasten uit te kunnen nodigen moet je Media Browser account aan deze server gekoppeld worden.", + "ButtonSync": "Synchronisatie" } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/pl.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/pl.json index 14acfd9213..5379e137a7 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/pl.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/pl.json @@ -626,5 +626,6 @@ "MessagePasswordResetForUsers": "Passwords have been reset for the following users:", "HeaderInviteGuest": "Invite Guest", "ButtonLinkMyMediaBrowserAccount": "Link my account now", - "MessageConnectAccountRequiredToInviteGuest": "In order to invite guests you need to first link your Media Browser account to this server." + "MessageConnectAccountRequiredToInviteGuest": "In order to invite guests you need to first link your Media Browser account to this server.", + "ButtonSync": "Sync" } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/pt_BR.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/pt_BR.json index bab01f5a26..30f664681e 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/pt_BR.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/pt_BR.json @@ -626,5 +626,6 @@ "MessagePasswordResetForUsers": "Foram redefinidas as senhas dos seguintes usu\u00e1rios:", "HeaderInviteGuest": "Convidar Usu\u00e1rio", "ButtonLinkMyMediaBrowserAccount": "Conectar minha conta agora", - "MessageConnectAccountRequiredToInviteGuest": "Para convidar usu\u00e1rios voc\u00ea necessita primeiro conectar sua conta Media Browser com este servidor." + "MessageConnectAccountRequiredToInviteGuest": "Para convidar usu\u00e1rios voc\u00ea necessita primeiro conectar sua conta Media Browser com este servidor.", + "ButtonSync": "Sincronizar" } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/pt_PT.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/pt_PT.json index f6433902ea..06c731d679 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/pt_PT.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/pt_PT.json @@ -626,5 +626,6 @@ "MessagePasswordResetForUsers": "Passwords have been reset for the following users:", "HeaderInviteGuest": "Invite Guest", "ButtonLinkMyMediaBrowserAccount": "Link my account now", - "MessageConnectAccountRequiredToInviteGuest": "In order to invite guests you need to first link your Media Browser account to this server." + "MessageConnectAccountRequiredToInviteGuest": "In order to invite guests you need to first link your Media Browser account to this server.", + "ButtonSync": "Sincronizar" } \ 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 02955316a2..50ed192e99 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/ru.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/ru.json @@ -626,5 +626,6 @@ "MessagePasswordResetForUsers": "\u041f\u0430\u0440\u043e\u043b\u0438 \u0431\u044b\u043b\u0438 \u0441\u0431\u0440\u043e\u0448\u0435\u043d\u044b \u0434\u043b\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439:", "HeaderInviteGuest": "\u041f\u0440\u0438\u0433\u043b\u0430\u0448\u0435\u043d\u0438\u0435 \u0433\u043e\u0441\u0442\u044f", "ButtonLinkMyMediaBrowserAccount": "\u0421\u0432\u044f\u0437\u0430\u0442\u044c \u043c\u043e\u044e \u0443\u0447\u0451\u0442\u043d\u0443\u044e \u0437\u0430\u043f\u0438\u0441\u044c", - "MessageConnectAccountRequiredToInviteGuest": "\u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0438\u0433\u043b\u0430\u0448\u0430\u0442\u044c \u0433\u043e\u0441\u0442\u0435\u0439, \u0432\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e, \u0432 \u043f\u0435\u0440\u0432\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u0441\u0432\u044f\u0437\u0430\u0442\u044c \u0441\u0432\u043e\u044e \u0443\u0447\u0451\u0442\u043d\u0443\u044e \u0437\u0430\u043f\u0438\u0441\u044c Media Browser \u0441 \u0434\u0430\u043d\u043d\u044b\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c." + "MessageConnectAccountRequiredToInviteGuest": "\u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0438\u0433\u043b\u0430\u0448\u0430\u0442\u044c \u0433\u043e\u0441\u0442\u0435\u0439, \u0432\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e, \u0432 \u043f\u0435\u0440\u0432\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u0441\u0432\u044f\u0437\u0430\u0442\u044c \u0441\u0432\u043e\u044e \u0443\u0447\u0451\u0442\u043d\u0443\u044e \u0437\u0430\u043f\u0438\u0441\u044c Media Browser \u0441 \u0434\u0430\u043d\u043d\u044b\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c.", + "ButtonSync": "\u0421\u0438\u043d\u0445\u0440-\u0442\u044c" } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/sv.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/sv.json index 95ce375f1a..c568c86642 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/sv.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/sv.json @@ -626,5 +626,6 @@ "MessagePasswordResetForUsers": "Passwords have been reset for the following users:", "HeaderInviteGuest": "Invite Guest", "ButtonLinkMyMediaBrowserAccount": "Link my account now", - "MessageConnectAccountRequiredToInviteGuest": "In order to invite guests you need to first link your Media Browser account to this server." + "MessageConnectAccountRequiredToInviteGuest": "In order to invite guests you need to first link your Media Browser account to this server.", + "ButtonSync": "Synk" } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/tr.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/tr.json index 7823981013..1488fd1512 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/tr.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/tr.json @@ -626,5 +626,6 @@ "MessagePasswordResetForUsers": "Passwords have been reset for the following users:", "HeaderInviteGuest": "Invite Guest", "ButtonLinkMyMediaBrowserAccount": "Link my account now", - "MessageConnectAccountRequiredToInviteGuest": "In order to invite guests you need to first link your Media Browser account to this server." + "MessageConnectAccountRequiredToInviteGuest": "In order to invite guests you need to first link your Media Browser account to this server.", + "ButtonSync": "Sync" } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/vi.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/vi.json index c2506300cd..2dbaa24c4d 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/vi.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/vi.json @@ -626,5 +626,6 @@ "MessagePasswordResetForUsers": "Passwords have been reset for the following users:", "HeaderInviteGuest": "Invite Guest", "ButtonLinkMyMediaBrowserAccount": "Link my account now", - "MessageConnectAccountRequiredToInviteGuest": "In order to invite guests you need to first link your Media Browser account to this server." + "MessageConnectAccountRequiredToInviteGuest": "In order to invite guests you need to first link your Media Browser account to this server.", + "ButtonSync": "Sync" } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/zh_CN.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/zh_CN.json index d83f9743dd..3d21494641 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/zh_CN.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/zh_CN.json @@ -626,5 +626,6 @@ "MessagePasswordResetForUsers": "Passwords have been reset for the following users:", "HeaderInviteGuest": "Invite Guest", "ButtonLinkMyMediaBrowserAccount": "Link my account now", - "MessageConnectAccountRequiredToInviteGuest": "In order to invite guests you need to first link your Media Browser account to this server." + "MessageConnectAccountRequiredToInviteGuest": "In order to invite guests you need to first link your Media Browser account to this server.", + "ButtonSync": "\u540c\u6b65" } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/zh_TW.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/zh_TW.json index 15f5bf4542..22672ff29c 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/zh_TW.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/zh_TW.json @@ -626,5 +626,6 @@ "MessagePasswordResetForUsers": "Passwords have been reset for the following users:", "HeaderInviteGuest": "Invite Guest", "ButtonLinkMyMediaBrowserAccount": "Link my account now", - "MessageConnectAccountRequiredToInviteGuest": "In order to invite guests you need to first link your Media Browser account to this server." + "MessageConnectAccountRequiredToInviteGuest": "In order to invite guests you need to first link your Media Browser account to this server.", + "ButtonSync": "Sync" } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/Server/ar.json b/MediaBrowser.Server.Implementations/Localization/Server/ar.json index 8d23f8c2ad..794755a502 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/ar.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/ar.json @@ -539,7 +539,7 @@ "HeaderRunningTasks": "Running Tasks", "HeaderActiveDevices": "Active Devices", "HeaderPendingInstallations": "Pending Installations", - "HeaerServerInformation": "Server Information", + "HeaderServerInformation": "Server Information", "ButtonRestartNow": "Restart Now", "ButtonRestart": "Restart", "ButtonShutdown": "Shutdown", @@ -1275,5 +1275,7 @@ "HeaderYears": "Years", "HeaderAddTag": "Add Tag", "LabelBlockItemsWithTags": "Block items with tags:", - "LabelTag": "Tag:" + "LabelTag": "Tag:", + "LabelEnableSingleImageInDidlLimit": "Limit to single embedded image", + "LabelEnableSingleImageInDidlLimitHelp": "Some devices will not render properly if multiple images are embedded within Didl." } \ 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 cfe8405d08..549d1d1734 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/ca.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/ca.json @@ -539,7 +539,7 @@ "HeaderRunningTasks": "Running Tasks", "HeaderActiveDevices": "Active Devices", "HeaderPendingInstallations": "Pending Installations", - "HeaerServerInformation": "Server Information", + "HeaderServerInformation": "Server Information", "ButtonRestartNow": "Restart Now", "ButtonRestart": "Restart", "ButtonShutdown": "Shutdown", @@ -1275,5 +1275,7 @@ "HeaderYears": "Years", "HeaderAddTag": "Add Tag", "LabelBlockItemsWithTags": "Block items with tags:", - "LabelTag": "Tag:" + "LabelTag": "Tag:", + "LabelEnableSingleImageInDidlLimit": "Limit to single embedded image", + "LabelEnableSingleImageInDidlLimitHelp": "Some devices will not render properly if multiple images are embedded within Didl." } \ 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 25d5190b74..d702540acd 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/cs.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/cs.json @@ -539,7 +539,7 @@ "HeaderRunningTasks": "B\u011b\u017e\u00edc\u00ed \u00falohy", "HeaderActiveDevices": "Akt\u00edvn\u00ed za\u0159\u00edzen\u00ed", "HeaderPendingInstallations": "\u010cekaj\u00edc\u00ed instalace", - "HeaerServerInformation": "Informace o serveru", + "HeaderServerInformation": "Server Information", "ButtonRestartNow": "Restartovat nyn\u00ed", "ButtonRestart": "Restart", "ButtonShutdown": "Vypnout", @@ -1275,5 +1275,7 @@ "HeaderYears": "Years", "HeaderAddTag": "Add Tag", "LabelBlockItemsWithTags": "Block items with tags:", - "LabelTag": "Tag:" + "LabelTag": "Tag:", + "LabelEnableSingleImageInDidlLimit": "Limit to single embedded image", + "LabelEnableSingleImageInDidlLimitHelp": "Some devices will not render properly if multiple images are embedded within Didl." } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/Server/da.json b/MediaBrowser.Server.Implementations/Localization/Server/da.json index 6cd18d44eb..d4895c47a6 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/da.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/da.json @@ -539,7 +539,7 @@ "HeaderRunningTasks": "Running Tasks", "HeaderActiveDevices": "Active Devices", "HeaderPendingInstallations": "Pending Installations", - "HeaerServerInformation": "Server Information", + "HeaderServerInformation": "Server Information", "ButtonRestartNow": "Restart Now", "ButtonRestart": "Restart", "ButtonShutdown": "Shutdown", @@ -1275,5 +1275,7 @@ "HeaderYears": "Years", "HeaderAddTag": "Add Tag", "LabelBlockItemsWithTags": "Block items with tags:", - "LabelTag": "Tag:" + "LabelTag": "Tag:", + "LabelEnableSingleImageInDidlLimit": "Limit to single embedded image", + "LabelEnableSingleImageInDidlLimitHelp": "Some devices will not render properly if multiple images are embedded within Didl." } \ 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 ecbc4e671c..8f10acd06f 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/de.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/de.json @@ -539,7 +539,7 @@ "HeaderRunningTasks": "Laufende Aufgaben", "HeaderActiveDevices": "Aktive Ger\u00e4te", "HeaderPendingInstallations": "Ausstehende Installationen", - "HeaerServerInformation": "Server Information", + "HeaderServerInformation": "Server Information", "ButtonRestartNow": "Jetzt neustarten", "ButtonRestart": "Neu starten", "ButtonShutdown": "Herunterfahren", @@ -1273,7 +1273,9 @@ "HeaderParentalRatings": "Altersbeschr\u00e4nkung", "HeaderVideoTypes": "Videotypen", "HeaderYears": "Jahre", - "HeaderAddTag": "Add Tag", - "LabelBlockItemsWithTags": "Block items with tags:", - "LabelTag": "Tag:" + "HeaderAddTag": "F\u00fcge Tag hinzu", + "LabelBlockItemsWithTags": "Blockiere Inhalte mit folgenden Tags:", + "LabelTag": "Tag:", + "LabelEnableSingleImageInDidlLimit": "Limit to single embedded image", + "LabelEnableSingleImageInDidlLimitHelp": "Some devices will not render properly if multiple images are embedded within Didl." } \ 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 f6789062a3..9b44ce488f 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/el.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/el.json @@ -539,7 +539,7 @@ "HeaderRunningTasks": "Running Tasks", "HeaderActiveDevices": "Active Devices", "HeaderPendingInstallations": "Pending Installations", - "HeaerServerInformation": "Server Information", + "HeaderServerInformation": "Server Information", "ButtonRestartNow": "Restart Now", "ButtonRestart": "Restart", "ButtonShutdown": "Shutdown", @@ -1275,5 +1275,7 @@ "HeaderYears": "Years", "HeaderAddTag": "Add Tag", "LabelBlockItemsWithTags": "Block items with tags:", - "LabelTag": "Tag:" + "LabelTag": "Tag:", + "LabelEnableSingleImageInDidlLimit": "Limit to single embedded image", + "LabelEnableSingleImageInDidlLimitHelp": "Some devices will not render properly if multiple images are embedded within Didl." } \ 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 e497fedc18..1c0a7fcb30 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/en_GB.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/en_GB.json @@ -539,7 +539,7 @@ "HeaderRunningTasks": "Running Tasks", "HeaderActiveDevices": "Active Devices", "HeaderPendingInstallations": "Pending Installations", - "HeaerServerInformation": "Server Information", + "HeaderServerInformation": "Server Information", "ButtonRestartNow": "Restart Now", "ButtonRestart": "Restart", "ButtonShutdown": "Shutdown", @@ -1275,5 +1275,7 @@ "HeaderYears": "Years", "HeaderAddTag": "Add Tag", "LabelBlockItemsWithTags": "Block items with tags:", - "LabelTag": "Tag:" + "LabelTag": "Tag:", + "LabelEnableSingleImageInDidlLimit": "Limit to single embedded image", + "LabelEnableSingleImageInDidlLimitHelp": "Some devices will not render properly if multiple images are embedded within Didl." } \ 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 d2ec403400..44547808b5 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/en_US.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/en_US.json @@ -539,7 +539,7 @@ "HeaderRunningTasks": "Running Tasks", "HeaderActiveDevices": "Active Devices", "HeaderPendingInstallations": "Pending Installations", - "HeaerServerInformation": "Server Information", + "HeaderServerInformation": "Server Information", "ButtonRestartNow": "Restart Now", "ButtonRestart": "Restart", "ButtonShutdown": "Shutdown", @@ -1275,5 +1275,7 @@ "HeaderYears": "Years", "HeaderAddTag": "Add Tag", "LabelBlockItemsWithTags": "Block items with tags:", - "LabelTag": "Tag:" + "LabelTag": "Tag:", + "LabelEnableSingleImageInDidlLimit": "Limit to single embedded image", + "LabelEnableSingleImageInDidlLimitHelp": "Some devices will not render properly if multiple images are embedded within Didl." } \ 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 e03198879d..ada5cfc225 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/es.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/es.json @@ -539,7 +539,7 @@ "HeaderRunningTasks": "Tareas en ejecuci\u00f3n", "HeaderActiveDevices": "Dispositivos activos", "HeaderPendingInstallations": "Instalaciones pendientes", - "HeaerServerInformation": "Informaci\u00f3n del servidor", + "HeaderServerInformation": "Server Information", "ButtonRestartNow": "Reiniciar ahora", "ButtonRestart": "Reiniciar", "ButtonShutdown": "Apagar", @@ -1275,5 +1275,7 @@ "HeaderYears": "Years", "HeaderAddTag": "Add Tag", "LabelBlockItemsWithTags": "Block items with tags:", - "LabelTag": "Tag:" + "LabelTag": "Tag:", + "LabelEnableSingleImageInDidlLimit": "Limit to single embedded image", + "LabelEnableSingleImageInDidlLimitHelp": "Some devices will not render properly if multiple images are embedded within Didl." } \ 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 0e26ffca12..7265ab4539 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/es_MX.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/es_MX.json @@ -539,7 +539,7 @@ "HeaderRunningTasks": "Tareas en Ejecuci\u00f3n", "HeaderActiveDevices": "Dispositivos Activos", "HeaderPendingInstallations": "Instalaciones Pendientes", - "HeaerServerInformation": "Informaci\u00f3n del Servidor", + "HeaderServerInformation": "Server Information", "ButtonRestartNow": "Reiniciar Ahora", "ButtonRestart": "Reiniciar", "ButtonShutdown": "Apagar", @@ -1216,7 +1216,7 @@ "HeaderCameraUploadHelp": "Suba a Media Broswer fotos y videos tomados desde sus dispositivos m\u00f3viles de forma autom\u00e1tica.", "MessageNoDevicesSupportCameraUpload": "Actualmente no cuenta con ning\u00fan dispositivo que soporte subir desde la c\u00e1mara.", "LabelCameraUploadPath": "Ruta para subir desde la c\u00e1mara:", - "LabelCameraUploadPathHelp": "Select a custom upload path, if desired. If unspecified a default folder will be used. If using a custom path it will also need to be added in the library setup area.", + "LabelCameraUploadPathHelp": "Seleccione una trayectoria personalizada de subida. Si no se especifica, una carpeta por omisi\u00f3n ser\u00e1 usada. Si usa una trayectoria personalizada, tambi\u00e9n ser\u00e1 necesario a\u00f1adirla en el \u00e1rea de configuraci\u00f3n de la biblioteca.", "LabelCreateCameraUploadSubfolder": "Crear una subcarpeta para cada dispositivo", "LabelCreateCameraUploadSubfolderHelp": "Se pueden especificar carpetas espec\u00edficas para un dispositivo haciendo clic en \u00e9l desde la p\u00e1gina de Dispositivos.", "LabelCustomDeviceDisplayName": "Nombre a Desplegar:", @@ -1273,7 +1273,9 @@ "HeaderParentalRatings": "Clasificaci\u00f3n Parental", "HeaderVideoTypes": "Tipos de Video", "HeaderYears": "A\u00f1os", - "HeaderAddTag": "Add Tag", - "LabelBlockItemsWithTags": "Block items with tags:", - "LabelTag": "Tag:" + "HeaderAddTag": "Agregar Etiqueta", + "LabelBlockItemsWithTags": "Bloquear \u00edtems con etiquetas:", + "LabelTag": "Etiqueta:", + "LabelEnableSingleImageInDidlLimit": "Limit to single embedded image", + "LabelEnableSingleImageInDidlLimitHelp": "Some devices will not render properly if multiple images are embedded within Didl." } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/Server/fi.json b/MediaBrowser.Server.Implementations/Localization/Server/fi.json index 5c25cf4936..84cfe43bc9 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/fi.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/fi.json @@ -539,7 +539,7 @@ "HeaderRunningTasks": "Running Tasks", "HeaderActiveDevices": "Active Devices", "HeaderPendingInstallations": "Pending Installations", - "HeaerServerInformation": "Server Information", + "HeaderServerInformation": "Server Information", "ButtonRestartNow": "Restart Now", "ButtonRestart": "Restart", "ButtonShutdown": "Shutdown", @@ -1275,5 +1275,7 @@ "HeaderYears": "Years", "HeaderAddTag": "Add Tag", "LabelBlockItemsWithTags": "Block items with tags:", - "LabelTag": "Tag:" + "LabelTag": "Tag:", + "LabelEnableSingleImageInDidlLimit": "Limit to single embedded image", + "LabelEnableSingleImageInDidlLimitHelp": "Some devices will not render properly if multiple images are embedded within Didl." } \ 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 d9517131ed..a2f4f864d3 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/fr.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/fr.json @@ -539,7 +539,7 @@ "HeaderRunningTasks": "T\u00e2ches en ex\u00e9cution", "HeaderActiveDevices": "P\u00e9riph\u00e9riques actifs", "HeaderPendingInstallations": "Installations en suspens", - "HeaerServerInformation": "Information du serveur", + "HeaderServerInformation": "Server Information", "ButtonRestartNow": "Red\u00e9marrer maintenant", "ButtonRestart": "Red\u00e9marrer", "ButtonShutdown": "\u00c9teindre", @@ -888,7 +888,7 @@ "LabelProtocolInfoHelp": "La valeur qui sera utilis\u00e9e pour r\u00e9pondre aux requ\u00eates GetProtocolInfo du p\u00e9riph\u00e9rique.", "TabKodiMetadata": "Kodi", "HeaderKodiMetadataHelp": "Media Browser supporte nativement les m\u00e9tadonn\u00e9es Nfo et les images de Kodi. Pour activer ou d\u00e9sactiver les m\u00e9tadonn\u00e9es Kodi, utiliser l'onglet Avanc\u00e9 pour configurer les options de vos types de m\u00e9dias.", - "LabelKodiMetadataUser": "Sync user watch data to nfo's for:", + "LabelKodiMetadataUser": "Les utilisateurs synchronis\u00e9s voient les donn\u00e9es nfo pour:", "LabelKodiMetadataUserHelp": "Activer pour garder les donn\u00e9es de visualisation synchronis\u00e9es entre Media Browser et Kodi.", "LabelKodiMetadataDateFormat": "Format de la date de sortie :", "LabelKodiMetadataDateFormatHelp": "Toutes les dates du nfo seront lues et \u00e9crites en utilisant ce format.", @@ -1216,7 +1216,7 @@ "HeaderCameraUploadHelp": "Uploader automatiquement les photos et les vid\u00e9os depuis vos p\u00e9riph\u00e9riques mobiles dans Media Browser.", "MessageNoDevicesSupportCameraUpload": "Vous n'avez actuellement aucun p\u00e9riph\u00e9riques support\u00e9 par l'upload de la cam\u00e9ra.", "LabelCameraUploadPath": "R\u00e9pertoire de l'upload de la camera:", - "LabelCameraUploadPathHelp": "Select a custom upload path, if desired. If unspecified a default folder will be used. If using a custom path it will also need to be added in the library setup area.", + "LabelCameraUploadPathHelp": "Si vous le souhaitez, vous pouvez choisir un r\u00e9pertoire d'upload personnalis\u00e9. Si vous ne mettez rien, le r\u00e9pertoire par d\u00e9faut sera utilis\u00e9. Si vous utilisez un r\u00e9pertoire personnalis\u00e9, vous devrez le rajouter \u00e0 la biblioth\u00e8que.", "LabelCreateCameraUploadSubfolder": "Cr\u00e9er un sous-dossier pour chaque p\u00e9riph\u00e9rique", "LabelCreateCameraUploadSubfolderHelp": "Des r\u00e9pertoires sp\u00e9cifiques peuvent \u00eatres affect\u00e9 \u00e0 des appareils en cliquant sur l'appareil dans la page des appareils.", "LabelCustomDeviceDisplayName": "Nom d'affichage:", @@ -1273,7 +1273,9 @@ "HeaderParentalRatings": "Note parentale", "HeaderVideoTypes": "Types de vid\u00e9o", "HeaderYears": "Ann\u00e9es", - "HeaderAddTag": "Add Tag", - "LabelBlockItemsWithTags": "Block items with tags:", - "LabelTag": "Tag:" + "HeaderAddTag": "Ajouter un tag", + "LabelBlockItemsWithTags": "Bloquer les \u00e9l\u00e9ments contenant les tags:", + "LabelTag": "Tag:", + "LabelEnableSingleImageInDidlLimit": "Limit to single embedded image", + "LabelEnableSingleImageInDidlLimitHelp": "Some devices will not render properly if multiple images are embedded within Didl." } \ 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 4f4691bd7a..64f51f5016 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/he.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/he.json @@ -539,7 +539,7 @@ "HeaderRunningTasks": "\u05de\u05e9\u05d9\u05de\u05d5\u05ea \u05e8\u05e6\u05d5\u05ea", "HeaderActiveDevices": "\u05de\u05db\u05e9\u05d9\u05e8\u05d9\u05dd \u05e4\u05e2\u05d9\u05dc\u05d9\u05dd", "HeaderPendingInstallations": "\u05d4\u05ea\u05e7\u05e0\u05d5\u05ea \u05d1\u05d4\u05de\u05ea\u05e0\u05d4", - "HeaerServerInformation": "\u05de\u05d9\u05d3\u05e2 \u05e2\u05dc \u05d4\u05e9\u05e8\u05ea", + "HeaderServerInformation": "Server Information", "ButtonRestartNow": "\u05d4\u05ea\u05d7\u05dc \u05de\u05d7\u05d3\u05e9 \u05db\u05e2\u05d8", "ButtonRestart": "\u05d4\u05ea\u05d7\u05e8 \u05de\u05d7\u05d3\u05e9", "ButtonShutdown": "\u05db\u05d1\u05d4", @@ -1275,5 +1275,7 @@ "HeaderYears": "Years", "HeaderAddTag": "Add Tag", "LabelBlockItemsWithTags": "Block items with tags:", - "LabelTag": "Tag:" + "LabelTag": "Tag:", + "LabelEnableSingleImageInDidlLimit": "Limit to single embedded image", + "LabelEnableSingleImageInDidlLimitHelp": "Some devices will not render properly if multiple images are embedded within Didl." } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/Server/hr.json b/MediaBrowser.Server.Implementations/Localization/Server/hr.json index 17c5764bab..6ca9666f71 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/hr.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/hr.json @@ -539,7 +539,7 @@ "HeaderRunningTasks": "Zadatci koji se izvode", "HeaderActiveDevices": "Aktivni ure\u0111aji", "HeaderPendingInstallations": "Instalacije u toku", - "HeaerServerInformation": "Informacije servera", + "HeaderServerInformation": "Server Information", "ButtonRestartNow": "Ponovo pokreni sad", "ButtonRestart": "Ponovo pokreni", "ButtonShutdown": "Ugasi", @@ -1275,5 +1275,7 @@ "HeaderYears": "Years", "HeaderAddTag": "Add Tag", "LabelBlockItemsWithTags": "Block items with tags:", - "LabelTag": "Tag:" + "LabelTag": "Tag:", + "LabelEnableSingleImageInDidlLimit": "Limit to single embedded image", + "LabelEnableSingleImageInDidlLimitHelp": "Some devices will not render properly if multiple images are embedded within Didl." } \ 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 9780d58560..cf8f7f081b 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/it.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/it.json @@ -539,7 +539,7 @@ "HeaderRunningTasks": "Operazione in corso", "HeaderActiveDevices": "Dispositivi Connessi", "HeaderPendingInstallations": "installazioni in coda", - "HeaerServerInformation": "Informazioni del server", + "HeaderServerInformation": "Server Information", "ButtonRestartNow": "Riavvia Adesso", "ButtonRestart": "Riavvia", "ButtonShutdown": "Arresta Server", @@ -1275,5 +1275,7 @@ "HeaderYears": "Anni", "HeaderAddTag": "Add Tag", "LabelBlockItemsWithTags": "Block items with tags:", - "LabelTag": "Tag:" + "LabelTag": "Tag:", + "LabelEnableSingleImageInDidlLimit": "Limit to single embedded image", + "LabelEnableSingleImageInDidlLimitHelp": "Some devices will not render properly if multiple images are embedded within Didl." } \ 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 37e00d0d83..df57212fa5 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/kk.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/kk.json @@ -539,7 +539,7 @@ "HeaderRunningTasks": "\u041e\u0440\u044b\u043d\u0434\u0430\u043b\u044b\u043f \u0436\u0430\u0442\u049b\u0430\u043d \u0442\u0430\u043f\u0441\u044b\u0440\u043c\u0430\u043b\u0430\u0440", "HeaderActiveDevices": "\u0411\u0435\u043b\u0441\u0435\u043d\u0434\u0456 \u049b\u04b1\u0440\u044b\u043b\u0493\u044b\u043b\u0430\u0440", "HeaderPendingInstallations": "\u0411\u04e9\u0433\u0435\u043b\u0456\u0441 \u043e\u0440\u043d\u0430\u0442\u044b\u043c\u0434\u0430\u0440", - "HeaerServerInformation": "\u0421\u0435\u0440\u0432\u0435\u0440 \u043c\u04d9\u043b\u0456\u043c\u0435\u0442\u0442\u0435\u0440\u0456", + "HeaderServerInformation": "Server Information", "ButtonRestartNow": "\u049a\u0430\u0437\u0456\u0440 \u049b\u0430\u0439\u0442\u0430 \u0456\u0441\u043a\u0435 \u049b\u043e\u0441\u0443", "ButtonRestart": "\u049a\u0430\u0439\u0442\u0430 \u0456\u0441\u043a\u0435 \u049b\u043e\u0441\u0443", "ButtonShutdown": "\u0416\u04b1\u043c\u044b\u0441\u0442\u044b \u0430\u044f\u049b\u0442\u0430\u0443", @@ -571,7 +571,7 @@ "TabPlayTo": "\u049a\u04b1\u0440\u044b\u043b\u0493\u044b\u0434\u0430 \u043e\u0439\u043d\u0430\u0442\u0443", "LabelEnableDlnaServer": "DLNA \u0441\u0435\u0440\u0432\u0435\u0440\u0456\u043d \u049b\u043e\u0441\u0443", "LabelEnableDlnaServerHelp": "\u0416\u0435\u043b\u0456\u0434\u0435\u0433\u0456 UPnP \u049b\u04b1\u0440\u044b\u043b\u0493\u044b\u043b\u0430\u0440\u0493\u0430 Media Browser \u043c\u0430\u0437\u043c\u04b1\u043d\u044b\u043d \u0448\u043e\u043b\u0443 \u043c\u0435\u043d \u043e\u0439\u043d\u0430\u0442\u0443 \u04af\u0448\u0456\u043d \u0440\u04b1\u049b\u0441\u0430\u0442 \u0435\u0442\u0443.", - "LabelEnableBlastAliveMessages": "\u0411\u0435\u043b\u0441\u0435\u043d\u0434\u0456\u043b\u0456\u043a\u0442\u0456 \u0442\u0435\u043a\u0441\u0435\u0440\u0443 \u0445\u0430\u0431\u0430\u0440\u043b\u0430\u0440\u044b\u043d \u043b\u0430\u043f \u0435\u0442\u0443", + "LabelEnableBlastAliveMessages": "\u0411\u0435\u043b\u0441\u0435\u043d\u0434\u0456\u043b\u0456\u043a\u0442\u0456 \u0442\u0435\u043a\u0441\u0435\u0440\u0443 \u0445\u0430\u0431\u0430\u0440\u043b\u0430\u0440\u044b\u043d \u0436\u0430\u0443\u0434\u044b\u0440\u0443", "LabelEnableBlastAliveMessagesHelp": "\u0415\u0433\u0435\u0440 \u0436\u0435\u043b\u0456\u0434\u0435\u0433\u0456 \u0431\u0430\u0441\u049b\u0430 UPnP \u049b\u04b1\u0440\u044b\u043b\u0493\u044b\u043b\u0430\u0440\u044b\u043c\u0435\u043d \u0441\u0435\u0440\u0432\u0435\u0440 \u043d\u044b\u049b \u0442\u0430\u0431\u044b\u043b\u043c\u0430\u0441\u0430 \u0431\u04b1\u043d\u044b \u049b\u043e\u0441\u044b\u04a3\u044b\u0437.", "LabelBlastMessageInterval": "\u0411\u0435\u043b\u0441\u0435\u043d\u0434\u0456\u043b\u0456\u043a\u0442\u0456 \u0442\u0435\u043a\u0441\u0435\u0440\u0443 \u0445\u0430\u0431\u0430\u0440\u043b\u0430\u0440 \u0430\u0440\u0430\u043b\u044b\u0493\u044b, \u0441", "LabelBlastMessageIntervalHelp": "\u0421\u0435\u0440\u0432\u0435\u0440 \u0431\u0435\u043b\u0441\u0435\u043d\u0434\u0456\u043b\u0456\u0433\u0456\u043d \u0442\u0435\u043a\u0441\u0435\u0440\u0443 \u0445\u0430\u0431\u0430\u0440\u043b\u0430\u0440\u0434\u044b\u04a3 \u0430\u0440\u0430 \u04b1\u0437\u0430\u049b\u0442\u044b\u0493\u044b\u043d \u0441\u0435\u043a\u0443\u043d\u0434\u0442\u0430\u0440 \u0430\u0440\u049b\u044b\u043b\u044b \u0430\u043d\u044b\u049b\u0442\u0430\u0439\u0434\u044b.", @@ -1273,7 +1273,9 @@ "HeaderParentalRatings": "\u0416\u0430\u0441\u0442\u0430\u0441 \u0441\u0430\u043d\u0430\u0442\u0442\u0430\u0440", "HeaderVideoTypes": "\u0411\u0435\u0439\u043d\u0435 \u0442\u04af\u0440\u043b\u0435\u0440\u0456", "HeaderYears": "\u0416\u044b\u043b\u0434\u0430\u0440", - "HeaderAddTag": "Add Tag", - "LabelBlockItemsWithTags": "Block items with tags:", - "LabelTag": "Tag:" + "HeaderAddTag": "\u0422\u0435\u0433\u0442\u0456 \u049b\u043e\u0441\u0443", + "LabelBlockItemsWithTags": "\u041c\u044b\u043d\u0430\u0434\u0430\u0439 \u0442\u0435\u0433\u0442\u0435\u0440\u0456 \u0431\u0430\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0442\u0435\u0440\u0434\u0456 \u049b\u04b1\u0440\u0441\u0430\u0443\u043b\u0430\u0443:", + "LabelTag": "\u0422\u0435\u0433:", + "LabelEnableSingleImageInDidlLimit": "Limit to single embedded image", + "LabelEnableSingleImageInDidlLimitHelp": "Some devices will not render properly if multiple images are embedded within Didl." } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/Server/ko.json b/MediaBrowser.Server.Implementations/Localization/Server/ko.json index f88135298a..9cfec64e77 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/ko.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/ko.json @@ -539,7 +539,7 @@ "HeaderRunningTasks": "Running Tasks", "HeaderActiveDevices": "Active Devices", "HeaderPendingInstallations": "Pending Installations", - "HeaerServerInformation": "Server Information", + "HeaderServerInformation": "Server Information", "ButtonRestartNow": "Restart Now", "ButtonRestart": "Restart", "ButtonShutdown": "Shutdown", @@ -1275,5 +1275,7 @@ "HeaderYears": "Years", "HeaderAddTag": "Add Tag", "LabelBlockItemsWithTags": "Block items with tags:", - "LabelTag": "Tag:" + "LabelTag": "Tag:", + "LabelEnableSingleImageInDidlLimit": "Limit to single embedded image", + "LabelEnableSingleImageInDidlLimitHelp": "Some devices will not render properly if multiple images are embedded within Didl." } \ 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 d0bade196e..7481f070ee 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/ms.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/ms.json @@ -539,7 +539,7 @@ "HeaderRunningTasks": "Running Tasks", "HeaderActiveDevices": "Active Devices", "HeaderPendingInstallations": "Pending Installations", - "HeaerServerInformation": "Server Information", + "HeaderServerInformation": "Server Information", "ButtonRestartNow": "Restart Now", "ButtonRestart": "Restart", "ButtonShutdown": "Shutdown", @@ -1275,5 +1275,7 @@ "HeaderYears": "Years", "HeaderAddTag": "Add Tag", "LabelBlockItemsWithTags": "Block items with tags:", - "LabelTag": "Tag:" + "LabelTag": "Tag:", + "LabelEnableSingleImageInDidlLimit": "Limit to single embedded image", + "LabelEnableSingleImageInDidlLimitHelp": "Some devices will not render properly if multiple images are embedded within Didl." } \ 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 b2acbc3fef..4c50c3fc20 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/nb.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/nb.json @@ -1,4 +1,16 @@ { + "TitleForgotPassword": "Glemt passord", + "TitlePasswordReset": "Resett passord", + "LabelPasswordRecoveryPinCode": "Pin code:", + "HeaderPasswordReset": "Resett passord", + "HeaderParentalRatings": "Parental Ratings", + "HeaderVideoTypes": "Video Types", + "HeaderYears": "Years", + "HeaderAddTag": "Add Tag", + "LabelBlockItemsWithTags": "Block items with tags:", + "LabelTag": "Tag:", + "LabelEnableSingleImageInDidlLimit": "Limit to single embedded image", + "LabelEnableSingleImageInDidlLimitHelp": "Some devices will not render properly if multiple images are embedded within Didl.", "LabelExit": "Avslutt", "LabelVisitCommunity": "Bes\u00f8k oss", "LabelGithub": "Github", @@ -539,7 +551,7 @@ "HeaderRunningTasks": "Kj\u00f8rende oppgaver", "HeaderActiveDevices": "Aktive enheter", "HeaderPendingInstallations": "ventede installasjoner", - "HeaerServerInformation": "Server informasjon", + "HeaderServerInformation": "Server Information", "ButtonRestartNow": "Restart N\u00e5", "ButtonRestart": "Restart", "ButtonShutdown": "Sl\u00e5 Av", @@ -1265,15 +1277,5 @@ "MessageGuestSharingPermissionsHelp": "De fleste funksjonene er i utgangspunktet utilgjengelig for gjester, men kan aktiveres ved behov.", "HeaderInvitations": "Invitasjoner", "LabelForgotPasswordUsernameHelp": "Enter your username, if you remember it.", - "HeaderForgotPassword": "Glemt passord", - "TitleForgotPassword": "Glemt passord", - "TitlePasswordReset": "Resett passord", - "LabelPasswordRecoveryPinCode": "Pin code:", - "HeaderPasswordReset": "Resett passord", - "HeaderParentalRatings": "Parental Ratings", - "HeaderVideoTypes": "Video Types", - "HeaderYears": "Years", - "HeaderAddTag": "Add Tag", - "LabelBlockItemsWithTags": "Block items with tags:", - "LabelTag": "Tag:" + "HeaderForgotPassword": "Glemt passord" } \ 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 1591b72846..ad571f1848 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/nl.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/nl.json @@ -539,7 +539,7 @@ "HeaderRunningTasks": "Actieve taken", "HeaderActiveDevices": "Actieve apparaten", "HeaderPendingInstallations": "In afwachting van installaties", - "HeaerServerInformation": "Server Informatie", + "HeaderServerInformation": "Server Information", "ButtonRestartNow": "Nu opnieuw opstarten", "ButtonRestart": "Herstart", "ButtonShutdown": "Afsluiten", @@ -1273,7 +1273,9 @@ "HeaderParentalRatings": "Ouderlijke toezicht", "HeaderVideoTypes": "Video types", "HeaderYears": "Jaren", - "HeaderAddTag": "Add Tag", - "LabelBlockItemsWithTags": "Block items with tags:", - "LabelTag": "Tag:" + "HeaderAddTag": "Voeg tag toe", + "LabelBlockItemsWithTags": "Blokkeer items met de tag:", + "LabelTag": "Tag:", + "LabelEnableSingleImageInDidlLimit": "Limit to single embedded image", + "LabelEnableSingleImageInDidlLimitHelp": "Some devices will not render properly if multiple images are embedded within Didl." } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/Server/pl.json b/MediaBrowser.Server.Implementations/Localization/Server/pl.json index 0968c1d6a3..3648847bfb 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/pl.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/pl.json @@ -539,7 +539,7 @@ "HeaderRunningTasks": "Running Tasks", "HeaderActiveDevices": "Active Devices", "HeaderPendingInstallations": "Pending Installations", - "HeaerServerInformation": "Server Information", + "HeaderServerInformation": "Server Information", "ButtonRestartNow": "Restart Now", "ButtonRestart": "Restart", "ButtonShutdown": "Shutdown", @@ -1275,5 +1275,7 @@ "HeaderYears": "Years", "HeaderAddTag": "Add Tag", "LabelBlockItemsWithTags": "Block items with tags:", - "LabelTag": "Tag:" + "LabelTag": "Tag:", + "LabelEnableSingleImageInDidlLimit": "Limit to single embedded image", + "LabelEnableSingleImageInDidlLimitHelp": "Some devices will not render properly if multiple images are embedded within Didl." } \ 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 ffcc542ecc..f04af13fb6 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/pt_BR.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/pt_BR.json @@ -539,7 +539,7 @@ "HeaderRunningTasks": "Tarefas em Execu\u00e7\u00e3o", "HeaderActiveDevices": "Dispositivos Ativos", "HeaderPendingInstallations": "Instala\u00e7\u00f5es Pendentes", - "HeaerServerInformation": "Informa\u00e7\u00f5es do Servidor", + "HeaderServerInformation": "Server Information", "ButtonRestartNow": "Reiniciar Agora", "ButtonRestart": "Reiniciar", "ButtonShutdown": "Desligar", @@ -1275,5 +1275,7 @@ "HeaderYears": "Anos", "HeaderAddTag": "Adicionar Tag", "LabelBlockItemsWithTags": "Bloquear itens com tags:", - "LabelTag": "Tag:" + "LabelTag": "Tag:", + "LabelEnableSingleImageInDidlLimit": "Limit to single embedded image", + "LabelEnableSingleImageInDidlLimitHelp": "Some devices will not render properly if multiple images are embedded within Didl." } \ 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 8953c2bf71..f104c79be8 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/pt_PT.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/pt_PT.json @@ -539,7 +539,7 @@ "HeaderRunningTasks": "Tarefas em Execu\u00e7\u00e3o", "HeaderActiveDevices": "Dispositivos Ativos", "HeaderPendingInstallations": "Instala\u00e7\u00f5es Pendentes", - "HeaerServerInformation": "Informa\u00e7\u00e3o do Servidor", + "HeaderServerInformation": "Server Information", "ButtonRestartNow": "Reiniciar Agora", "ButtonRestart": "Reiniciar", "ButtonShutdown": "Encerrar", @@ -1275,5 +1275,7 @@ "HeaderYears": "Years", "HeaderAddTag": "Add Tag", "LabelBlockItemsWithTags": "Block items with tags:", - "LabelTag": "Tag:" + "LabelTag": "Tag:", + "LabelEnableSingleImageInDidlLimit": "Limit to single embedded image", + "LabelEnableSingleImageInDidlLimitHelp": "Some devices will not render properly if multiple images are embedded within Didl." } \ 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 f61b61b34d..63b6c5f463 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/ru.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/ru.json @@ -1,6 +1,6 @@ { "LabelExit": "\u0412\u044b\u0445\u043e\u0434", - "LabelVisitCommunity": "\u041f\u043e\u0441\u0435\u0442\u0438\u0442\u044c \u0421\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u043e", + "LabelVisitCommunity": "\u041f\u043e\u0441\u0435\u0449\u0435\u043d\u0438\u0435 \u0421\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0430", "LabelGithub": "\u0420\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 Github", "LabelSwagger": "\u0418\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 Swagger", "LabelStandard": "\u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442", @@ -264,7 +264,7 @@ "LabelRunServerAtStartup": "\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0441\u0435\u0440\u0432\u0435\u0440 \u043f\u0440\u0438 \u0441\u0442\u0430\u0440\u0442\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b", "LabelRunServerAtStartupHelp": "\u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c\u0441\u044f \u0437\u043d\u0430\u0447\u043e\u043a \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u043c \u043b\u043e\u0442\u043a\u0435 \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0441\u0442\u0430\u0440\u0442\u0430 Windows. \u0414\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0441\u043b\u0443\u0436\u0431\u044b Windows, \u0441\u043d\u0438\u043c\u0438\u0442\u0435 \u0444\u043b\u0430\u0436\u043e\u043a \u0438 \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u0435 \u0441\u043b\u0443\u0436\u0431\u0443 \u0438\u0437 \u043a\u043e\u043d\u0441\u043e\u043b\u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f Windows. \u041f\u043e\u043c\u043d\u0438\u0442\u0435, \u0447\u0442\u043e \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u0430 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430 \u0438\u0445 \u0432\u043c\u0435\u0441\u0442\u0435, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0437\u0430\u043a\u0440\u044b\u0442\u044c \u0437\u043d\u0430\u0447\u043e\u043a \u0432 \u043b\u043e\u0442\u043a\u0435 \u0434\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0441\u043b\u0443\u0436\u0431\u044b.", "ButtonSelectDirectory": "\u0412\u044b\u0431\u0440\u0430\u0442\u044c \u043a\u0430\u0442\u0430\u043b\u043e\u0433", - "LabelCustomPaths": "\u0423\u043a\u0430\u0436\u0438\u0442\u0435 \u043d\u0435\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u043f\u0443\u0442\u0438 \u043f\u043e \u0436\u0435\u043b\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f\u043c. \u041e\u0441\u0442\u0430\u0432\u043b\u044f\u0439\u0442\u0435 \u043f\u043e\u043b\u044f \u043f\u0443\u0441\u0442\u044b\u043c\u0438, \u0447\u0442\u043e\u0431\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435.", + "LabelCustomPaths": "\u0423\u043a\u0430\u0436\u0438\u0442\u0435 \u043d\u0435\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u043f\u0443\u0442\u0438 \u043f\u043e \u0436\u0435\u043b\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f\u043c. \u041e\u0441\u0442\u0430\u0432\u043b\u044f\u0439\u0442\u0435 \u043f\u043e\u043b\u044f \u043d\u0435\u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u044b\u043c\u0438, \u0447\u0442\u043e\u0431\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435.", "LabelCachePath": "\u041f\u0443\u0442\u044c \u043a\u043e \u043a\u0435\u0448\u0443:", "LabelCachePathHelp": "\u0423\u043a\u0430\u0436\u0438\u0442\u0435 \u043d\u0435\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0435 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0444\u0430\u0439\u043b\u043e\u0432 \u0441\u0435\u0440\u0432\u0435\u0440\u043d\u043e\u0433\u043e \u043a\u044d\u0448\u0430, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0440\u0438\u0441\u0443\u043d\u043a\u043e\u0432.", "LabelImagesByNamePath": "\u041f\u0443\u0442\u044c \u043a \u0440\u0438\u0441\u0443\u043d\u043a\u0430\u043c \u0447\u0435\u0440\u0435\u0437 \u0438\u043c\u044f:", @@ -272,7 +272,7 @@ "LabelMetadataPath": "\u041f\u0443\u0442\u044c \u043a \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u043c:", "LabelMetadataPathHelp": "\u0423\u043a\u0430\u0436\u0438\u0442\u0435 \u043d\u0435\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0435 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c\u044b\u0445 \u0438\u043b\u043b\u044e\u0441\u0442\u0440\u0430\u0446\u0438\u0439 \u0438 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445, \u0435\u0441\u043b\u0438 \u043e\u043d\u0438 \u043d\u0435 \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0432 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445 \u043c\u0435\u0434\u0438\u0430\u043f\u0430\u043f\u043e\u043a.", "LabelTranscodingTempPath": "\u041f\u0443\u0442\u044c \u043a\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c \u0444\u0430\u0439\u043b\u0430\u043c \u043f\u0435\u0440\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0438:", - "LabelTranscodingTempPathHelp": "\u0412 \u0434\u0430\u043d\u043d\u043e\u0439 \u043f\u0430\u043f\u043a\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u0441\u044f \u0440\u0430\u0431\u043e\u0447\u0438\u0435 \u0444\u0430\u0439\u043b\u044b, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0435 \u043f\u0440\u0438 \u043f\u0435\u0440\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0435. \u0423\u043a\u0430\u0436\u0438\u0442\u0435 \u043d\u0435\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u043f\u0443\u0442\u044c, \u0438\u043b\u0438 \u043e\u0441\u0442\u0430\u0432\u044c\u0442\u0435 \u043f\u0443\u0441\u0442\u044b\u043c, \u0447\u0442\u043e\u0431\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u0432\u043d\u0443\u0442\u0440\u0438 \u043f\u0430\u043f\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441\u0435\u0440\u0432\u0435\u0440\u0430.", + "LabelTranscodingTempPathHelp": "\u0412 \u0434\u0430\u043d\u043d\u043e\u0439 \u043f\u0430\u043f\u043a\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u0441\u044f \u0440\u0430\u0431\u043e\u0447\u0438\u0435 \u0444\u0430\u0439\u043b\u044b, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0435 \u043f\u0440\u0438 \u043f\u0435\u0440\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0435. \u0423\u043a\u0430\u0436\u0438\u0442\u0435 \u043d\u0435\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u043f\u0443\u0442\u044c, \u0438\u043b\u0438 \u043e\u0441\u0442\u0430\u0432\u044c\u0442\u0435 \u043f\u043e\u043b\u0435 \u043d\u0435\u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u044b\u043c, \u0447\u0442\u043e\u0431\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u0432\u043d\u0443\u0442\u0440\u0438 \u043f\u0430\u043f\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441\u0435\u0440\u0432\u0435\u0440\u0430.", "TabBasics": "\u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435", "TabTV": "\u0422\u0412", "TabGames": "\u0418\u0433\u0440\u044b", @@ -458,7 +458,7 @@ "LinkGithub": "\u0420\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 Github", "LinkApiDocumentation": "\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043f\u043e API", "LabelFriendlyServerName": "\u041f\u043e\u043d\u044f\u0442\u043d\u043e\u0435 \u0438\u043c\u044f \u0441\u0435\u0440\u0432\u0435\u0440\u0430:", - "LabelFriendlyServerNameHelp": "\u0414\u0430\u043d\u043d\u043e\u0435 \u0438\u043c\u044f \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f, \u0447\u0442\u043e\u0431\u044b \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0439 \u0441\u0435\u0440\u0432\u0435\u0440. \u0415\u0441\u043b\u0438 \u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043f\u043e\u043b\u0435 \u043f\u0443\u0441\u0442\u044b\u043c, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0438\u043c\u044f \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0430.", + "LabelFriendlyServerNameHelp": "\u0414\u0430\u043d\u043d\u043e\u0435 \u0438\u043c\u044f \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0434\u043b\u044f \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0432\u0430\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u0430. \u0415\u0441\u043b\u0438 \u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043f\u043e\u043b\u0435 \u043d\u0435\u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u044b\u043c, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0438\u043c\u044f \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0430.", "LabelPreferredDisplayLanguage": "\u041f\u0440\u0435\u0434\u043f\u043e\u0447\u0438\u0442\u0430\u0435\u043c\u044b\u0439 \u044f\u0437\u044b\u043a \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f:", "LabelPreferredDisplayLanguageHelp": "\u041f\u0435\u0440\u0435\u0432\u043e\u0434 Media Browser \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u043c \u043d\u0430\u0445\u043e\u0434\u044f\u0449\u0438\u043c\u0441\u044f \u0432 \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u0438 \u0438 \u0432\u0441\u0451 \u0435\u0449\u0451 \u043d\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0451\u043d.", "LabelReadHowYouCanContribute": "\u0427\u0438\u0442\u0430\u0439\u0442\u0435 \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0432\u043d\u0435\u0441\u0442\u0438 \u0441\u0432\u043e\u0439 \u0432\u043a\u043b\u0430\u0434.", @@ -539,7 +539,7 @@ "HeaderRunningTasks": "\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0449\u0438\u0435\u0441\u044f \u0437\u0430\u0434\u0430\u043d\u0438\u044f", "HeaderActiveDevices": "\u0410\u043a\u0442\u0438\u0432\u043d\u044b\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430", "HeaderPendingInstallations": "\u041e\u0442\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438", - "HeaerServerInformation": "\u0421\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043e \u0441\u0435\u0440\u0432\u0435\u0440\u0435", + "HeaderServerInformation": "Server Information", "ButtonRestartNow": "\u041f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043d\u0435\u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e", "ButtonRestart": "\u041f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c", "ButtonShutdown": "\u0417\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443", @@ -571,7 +571,7 @@ "TabPlayTo": "\u0412\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0441\u0442\u0438 \u041d\u0430", "LabelEnableDlnaServer": "\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c DLNA-\u0441\u0435\u0440\u0432\u0435\u0440", "LabelEnableDlnaServerHelp": "UPnP-\u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\u043c \u0432 \u0441\u0435\u0442\u0438 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u0438 \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u044f Media Browser.", - "LabelEnableBlastAliveMessages": "\u0412\u0441\u043f\u043b\u0435\u0441\u043a \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438", + "LabelEnableBlastAliveMessages": "\u0411\u043e\u043c\u0431\u0430\u0440\u0434\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f\u043c\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438", "LabelEnableBlastAliveMessagesHelp": "\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u0435, \u0435\u0441\u043b\u0438 \u0441\u0435\u0440\u0432\u0435\u0440 \u043d\u0435 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430\u0434\u0451\u0436\u043d\u043e \u0434\u0440\u0443\u0433\u0438\u043c\u0438 UPnP \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\u043c\u0438 \u0432 \u0441\u0435\u0442\u0438.", "LabelBlastMessageInterval": "\u0418\u043d\u0442\u0435\u0440\u0432\u0430\u043b \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438, \u0441", "LabelBlastMessageIntervalHelp": "\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u0434\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0430\u0445 \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f\u043c\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 \u0441\u0435\u0440\u0432\u0435\u0440\u0430.", @@ -661,8 +661,8 @@ "HeaderLatestMedia": "\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u043c\u0435\u0434\u0438\u0430\u0434\u0430\u043d\u043d\u044b\u0435", "OptionSpecialFeatures": "\u0414\u043e\u043f. \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u044b", "HeaderCollections": "\u041a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438", - "LabelProfileCodecsHelp": "\u0420\u0430\u0437\u0434\u0435\u043b\u044f\u044e\u0442\u0441\u044f \u0437\u0430\u043f\u044f\u0442\u043e\u0439. \u041c\u043e\u0436\u043d\u043e \u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043f\u0443\u0441\u0442\u044b\u043c, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u043a\u043e\u0434\u0435\u043a\u043e\u0432.", - "LabelProfileContainersHelp": "\u0420\u0430\u0437\u0434\u0435\u043b\u044f\u044e\u0442\u0441\u044f \u0437\u0430\u043f\u044f\u0442\u043e\u0439. \u041c\u043e\u0436\u043d\u043e \u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043f\u0443\u0441\u0442\u044b\u043c, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432.", + "LabelProfileCodecsHelp": "\u0420\u0430\u0437\u0434\u0435\u043b\u044f\u044e\u0442\u0441\u044f \u0437\u0430\u043f\u044f\u0442\u043e\u0439. \u041f\u043e\u043b\u0435 \u043c\u043e\u0436\u043d\u043e \u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043d\u0435\u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u044b\u043c, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u043a\u043e\u0434\u0435\u043a\u043e\u0432.", + "LabelProfileContainersHelp": "\u0420\u0430\u0437\u0434\u0435\u043b\u044f\u044e\u0442\u0441\u044f \u0437\u0430\u043f\u044f\u0442\u043e\u0439. \u041f\u043e\u043b\u0435 \u043c\u043e\u0436\u043d\u043e \u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043d\u0435\u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u044b\u043c, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432.", "HeaderResponseProfile": "\u041f\u0440\u043e\u0444\u0438\u043b\u044c \u043e\u0442\u043a\u043b\u0438\u043a\u0430", "LabelType": "\u0422\u0438\u043f:", "LabelPersonRole": "\u0420\u043e\u043b\u044c:", @@ -682,7 +682,7 @@ "OptionProfileVideoAudio": "\u0412\u0438\u0434\u0435\u043e \u0410\u0443\u0434\u0438\u043e", "OptionProfilePhoto": "\u0424\u043e\u0442\u043e", "LabelUserLibrary": "\u041c\u0435\u0434\u0438\u0430\u0442\u0435\u043a\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f:", - "LabelUserLibraryHelp": "\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435, \u0447\u044c\u044e \u043c\u0435\u0434\u0438\u0430\u0442\u0435\u043a\u0443 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c \u043d\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0435. \u041e\u0441\u0442\u0430\u0432\u044c\u0442\u0435 \u043f\u0443\u0441\u0442\u044b\u043c \u0434\u043b\u044f \u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0433\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430.", + "LabelUserLibraryHelp": "\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435, \u0447\u044c\u044e \u043c\u0435\u0434\u0438\u0430\u0442\u0435\u043a\u0443 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c \u043d\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0435. \u041e\u0441\u0442\u0430\u0432\u044c\u0442\u0435 \u043f\u043e\u043b\u0435 \u043d\u0435\u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u044b\u043c, \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440.", "OptionPlainStorageFolders": "\u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c \u0432\u0441\u0435 \u043f\u0430\u043f\u043a\u0438, \u043a\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u044b\u0435 \u043f\u0430\u043f\u043a\u0438 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f", "OptionPlainStorageFoldersHelp": "\u041f\u0440\u0438 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438, \u0432\u0441\u0435 \u043f\u0430\u043f\u043a\u0438 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0432 DIDL \u043a\u0430\u043a \u00abobject.container.storageFolder\u00bb, \u0432\u043c\u0435\u0441\u0442\u043e \u0431\u043e\u043b\u0435\u0435 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u00abobject.container.person.musicArtist\u00bb.", "OptionPlainVideoItems": "\u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c \u0432\u0441\u0435 \u0438\u043c\u0435\u044e\u0449\u0438\u0435\u0441\u044f \u0432\u0438\u0434\u0435\u043e, \u043a\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u044b\u0435 \u0432\u0438\u0434\u0435\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b", @@ -834,7 +834,7 @@ "LabelEnableChannelContentDownloadingFor": "\u0412\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c\u043e\u0433\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u044f \u043a\u0430\u043d\u0430\u043b\u0430 \u0434\u043b\u044f:", "LabelEnableChannelContentDownloadingForHelp": "\u041d\u0430 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043a\u0430\u043d\u0430\u043b\u0430\u0445 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c\u043e\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435, \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u044f\u044e\u0449\u0435\u0435 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440. \u0412\u043a\u043b\u044e\u0447\u0430\u0439\u0442\u0435 \u043f\u0440\u0438 \u0441\u0440\u0435\u0434\u0430\u0445 \u0441 \u043d\u0438\u0437\u043a\u043e\u0439 \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u043d\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c\u044e, \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 \u043a\u0430\u043d\u0430\u043b\u0430 \u0432 \u043d\u0435\u0440\u0430\u0431\u043e\u0447\u0435\u0435 \u0432\u0440\u0435\u043c\u044f. \u0421\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u043a \u0447\u0430\u0441\u0442\u044c \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u043d\u043e\u0433\u043e \u0437\u0430\u0434\u0430\u043d\u0438\u044f \u00ab\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u043a\u0430\u043d\u0430\u043b\u043e\u0432\u00bb.", "LabelChannelDownloadPath": "\u041f\u0443\u0442\u044c \u0434\u043b\u044f \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u044f \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c\u044b\u0445 \u043a\u0430\u043d\u0430\u043b\u043e\u0432:", - "LabelChannelDownloadPathHelp": "\u0423\u043a\u0430\u0436\u0438\u0442\u0435 \u043d\u0435\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u043f\u0443\u0442\u044c \u0434\u043b\u044f \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c\u043e\u0433\u043e, \u043f\u043e \u0436\u0435\u043b\u0430\u043d\u0438\u044e. \u041e\u0441\u0442\u0430\u0432\u044c\u0442\u0435 \u043f\u0443\u0441\u0442\u044b\u043c, \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u0432\u043e \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u044e\u044e \u043f\u0430\u043f\u043a\u0443 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445.", + "LabelChannelDownloadPathHelp": "\u0423\u043a\u0430\u0436\u0438\u0442\u0435 \u043d\u0435\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u043f\u0443\u0442\u044c \u0434\u043b\u044f \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c\u043e\u0433\u043e, \u043f\u043e \u0436\u0435\u043b\u0430\u043d\u0438\u044e. \u041e\u0441\u0442\u0430\u0432\u044c\u0442\u0435 \u043f\u043e\u043b\u0435 \u043d\u0435\u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u044b\u043c, \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u0432\u043e \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u044e\u044e \u043f\u0430\u043f\u043a\u0443 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445.", "LabelChannelDownloadAge": "\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u044f \u0447\u0435\u0440\u0435\u0437, \u0434\u043d\u0438:", "LabelChannelDownloadAgeHelp": "\u0417\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c\u043e\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 \u0441\u0442\u0430\u0440\u0448\u0435 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0433\u043e \u0431\u0443\u0434\u0435\u0442 \u0443\u0434\u0430\u043b\u0435\u043d\u043e. \u041e\u043d\u043e \u043e\u0441\u0442\u0430\u043d\u0435\u0442\u0441\u044f \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u043c\u044b\u043c \u043f\u043e \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442-\u0442\u0440\u0430\u043d\u0441\u043b\u044f\u0446\u0438\u0438.", "ChannelSettingsFormHelp": "\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0435 \u043a\u0430\u043d\u0430\u043b\u044b (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440: Trailers \u0438\u043b\u0438 Vimeo) \u0438\u0437 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0430 \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432.", @@ -1119,7 +1119,7 @@ "HeaderTags": "\u0422\u0435\u0433\u0438", "HeaderMetadataSettings": "\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445", "LabelLockItemToPreventChanges": "\u0424\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442, \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u043f\u0440\u0435\u0442\u0438\u0442\u044c \u0431\u0443\u0434\u0443\u0449\u0438\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f", - "MessageLeaveEmptyToInherit": "\u041e\u0441\u0442\u0430\u0432\u044c\u0442\u0435 \u043f\u0443\u0441\u0442\u044b\u043c, \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043e\u0442 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430, \u0438\u043b\u0438 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e.", + "MessageLeaveEmptyToInherit": "\u041e\u0441\u0442\u0430\u0432\u044c\u0442\u0435 \u043f\u043e\u043b\u0435 \u043d\u0435\u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u044b\u043c, \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043e\u0442 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430, \u0438\u043b\u0438 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e.", "TabDonate": "\u041f\u043e\u0436\u0435\u0440\u0442\u0432\u043e\u0432\u0430\u043d\u0438\u044f", "HeaderDonationType": "\u0422\u0438\u043f \u043f\u043e\u0436\u0435\u0440\u0442\u0432\u043e\u0432\u0430\u043d\u0438\u044f:", "OptionMakeOneTimeDonation": "\u0421\u0434\u0435\u043b\u0430\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0435 \u043f\u043e\u0436\u0435\u0440\u0442\u0432\u043e\u0432\u0430\u043d\u0438\u0435", @@ -1220,7 +1220,7 @@ "LabelCreateCameraUploadSubfolder": "\u0421\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043f\u043e\u0434\u043f\u0430\u043f\u043a\u0443 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430", "LabelCreateCameraUploadSubfolderHelp": "\u0421\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043f\u0430\u043f\u043a\u0438 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u044b \u0434\u043b\u044f \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u043f\u0440\u0438 \u0449\u0435\u043b\u0447\u043a\u0435 \u043d\u0430 \u043d\u0451\u043c \u0441\u043e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \"\u0423\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\".", "LabelCustomDeviceDisplayName": "\u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u043c\u043e\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435:", - "LabelCustomDeviceDisplayNameHelp": "\u041f\u0440\u0438\u0432\u0435\u0434\u0438\u0442\u0435 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c\u043e\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0438\u043b\u0438 \u043e\u0441\u0442\u0430\u0432\u044c\u0442\u0435 \u043f\u0443\u0441\u0442\u044b\u043c, \u0447\u0442\u043e\u0431\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0441\u043e\u043e\u0431\u0449\u0451\u043d\u043d\u043e\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e\u043c.", + "LabelCustomDeviceDisplayNameHelp": "\u041f\u0440\u0438\u0432\u0435\u0434\u0438\u0442\u0435 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c\u043e\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0438\u043b\u0438 \u043e\u0441\u0442\u0430\u0432\u044c\u0442\u0435 \u043f\u043e\u043b\u0435 \u043d\u0435\u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u044b\u043c, \u0447\u0442\u043e\u0431\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435, \u0441\u043e\u043e\u0431\u0449\u0451\u043d\u043d\u043e\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e\u043c.", "HeaderInviteUser": "\u041f\u0440\u0438\u0433\u043b\u0430\u0448\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f", "LabelConnectGuestUserNameHelp": "\u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0432\u0430\u0448 \u0434\u0440\u0443\u0433 \u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0432\u0445\u043e\u0434\u0430 \u043d\u0430 \u0432\u0435\u0431-\u0441\u0430\u0439\u0442 Media Browser, \u0438\u043b\u0438 \u0430\u0434\u0440\u0435\u0441 \u044d-\u043f\u043e\u0447\u0442\u044b.", "HeaderInviteUserHelp": "Media Browser Connect \u0443\u043f\u0440\u043e\u0449\u0430\u0435\u0442 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0434\u0440\u0443\u0437\u044c\u044f\u043c \u043e\u0431\u0449\u0435\u0433\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0432\u0430\u0448\u0438\u043c \u043c\u0435\u0434\u0438\u0430\u0434\u0430\u043d\u043d\u044b\u043c.", @@ -1273,7 +1273,9 @@ "HeaderParentalRatings": "\u0412\u043e\u0437\u0440\u0430\u0441\u0442\u043d\u0430\u044f \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f", "HeaderVideoTypes": "\u0422\u0438\u043f\u044b \u0432\u0438\u0434\u0435\u043e", "HeaderYears": "\u0413\u043e\u0434\u044b", - "HeaderAddTag": "Add Tag", - "LabelBlockItemsWithTags": "Block items with tags:", - "LabelTag": "Tag:" + "HeaderAddTag": "\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0442\u0435\u0433\u0430", + "LabelBlockItemsWithTags": "\u0411\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0441 \u0442\u0435\u0433\u0430\u043c\u0438:", + "LabelTag": "\u0422\u0435\u0433:", + "LabelEnableSingleImageInDidlLimit": "Limit to single embedded image", + "LabelEnableSingleImageInDidlLimitHelp": "Some devices will not render properly if multiple images are embedded within Didl." } \ 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 96c059ba9f..7ba9b83fcc 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/sv.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/sv.json @@ -539,7 +539,7 @@ "HeaderRunningTasks": "P\u00e5g\u00e5ende aktiviteter", "HeaderActiveDevices": "Aktiva enheter", "HeaderPendingInstallations": "V\u00e4ntande installationer", - "HeaerServerInformation": "Serverinformation", + "HeaderServerInformation": "Server Information", "ButtonRestartNow": "Starta om nu", "ButtonRestart": "Starta om", "ButtonShutdown": "St\u00e4ng av", @@ -1275,5 +1275,7 @@ "HeaderYears": "Years", "HeaderAddTag": "Add Tag", "LabelBlockItemsWithTags": "Block items with tags:", - "LabelTag": "Tag:" + "LabelTag": "Tag:", + "LabelEnableSingleImageInDidlLimit": "Limit to single embedded image", + "LabelEnableSingleImageInDidlLimitHelp": "Some devices will not render properly if multiple images are embedded within Didl." } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/Server/tr.json b/MediaBrowser.Server.Implementations/Localization/Server/tr.json index edaeb8d9ca..68275c6787 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/tr.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/tr.json @@ -539,7 +539,7 @@ "HeaderRunningTasks": "Running Tasks", "HeaderActiveDevices": "Active Devices", "HeaderPendingInstallations": "Pending Installations", - "HeaerServerInformation": "Sunucu bilgisi", + "HeaderServerInformation": "Server Information", "ButtonRestartNow": "Restart Now", "ButtonRestart": "Restart", "ButtonShutdown": "Shutdown", @@ -1275,5 +1275,7 @@ "HeaderYears": "Years", "HeaderAddTag": "Add Tag", "LabelBlockItemsWithTags": "Block items with tags:", - "LabelTag": "Tag:" + "LabelTag": "Tag:", + "LabelEnableSingleImageInDidlLimit": "Limit to single embedded image", + "LabelEnableSingleImageInDidlLimitHelp": "Some devices will not render properly if multiple images are embedded within Didl." } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/Server/vi.json b/MediaBrowser.Server.Implementations/Localization/Server/vi.json index dc9b093646..0f43257e49 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/vi.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/vi.json @@ -539,7 +539,7 @@ "HeaderRunningTasks": "Running Tasks", "HeaderActiveDevices": "Active Devices", "HeaderPendingInstallations": "Pending Installations", - "HeaerServerInformation": "Server Information", + "HeaderServerInformation": "Server Information", "ButtonRestartNow": "Restart Now", "ButtonRestart": "Restart", "ButtonShutdown": "Shutdown", @@ -1275,5 +1275,7 @@ "HeaderYears": "Years", "HeaderAddTag": "Add Tag", "LabelBlockItemsWithTags": "Block items with tags:", - "LabelTag": "Tag:" + "LabelTag": "Tag:", + "LabelEnableSingleImageInDidlLimit": "Limit to single embedded image", + "LabelEnableSingleImageInDidlLimitHelp": "Some devices will not render properly if multiple images are embedded within Didl." } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/Server/zh_CN.json b/MediaBrowser.Server.Implementations/Localization/Server/zh_CN.json index 204bd93305..85e5da3465 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/zh_CN.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/zh_CN.json @@ -539,7 +539,7 @@ "HeaderRunningTasks": "\u8fd0\u884c\u7684\u4efb\u52a1", "HeaderActiveDevices": "\u6d3b\u52a8\u7684\u8bbe\u5907", "HeaderPendingInstallations": "\u7b49\u5f85\u5b89\u88c5", - "HeaerServerInformation": "\u670d\u52a1\u5668\u4fe1\u606f", + "HeaderServerInformation": "Server Information", "ButtonRestartNow": "\u73b0\u5728\u91cd\u542f", "ButtonRestart": "\u91cd\u542f", "ButtonShutdown": "\u5173\u673a", @@ -1275,5 +1275,7 @@ "HeaderYears": "Years", "HeaderAddTag": "Add Tag", "LabelBlockItemsWithTags": "Block items with tags:", - "LabelTag": "Tag:" + "LabelTag": "Tag:", + "LabelEnableSingleImageInDidlLimit": "Limit to single embedded image", + "LabelEnableSingleImageInDidlLimitHelp": "Some devices will not render properly if multiple images are embedded within Didl." } \ 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 97fd408eb2..c48ad70d01 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/zh_TW.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/zh_TW.json @@ -539,7 +539,7 @@ "HeaderRunningTasks": "Running Tasks", "HeaderActiveDevices": "Active Devices", "HeaderPendingInstallations": "Pending Installations", - "HeaerServerInformation": "Server Information", + "HeaderServerInformation": "Server Information", "ButtonRestartNow": "Restart Now", "ButtonRestart": "Restart", "ButtonShutdown": "Shutdown", @@ -1275,5 +1275,7 @@ "HeaderYears": "Years", "HeaderAddTag": "Add Tag", "LabelBlockItemsWithTags": "Block items with tags:", - "LabelTag": "Tag:" + "LabelTag": "Tag:", + "LabelEnableSingleImageInDidlLimit": "Limit to single embedded image", + "LabelEnableSingleImageInDidlLimitHelp": "Some devices will not render properly if multiple images are embedded within Didl." } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj b/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj index c57d02fab0..cf029df191 100644 --- a/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj +++ b/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj @@ -179,8 +179,8 @@ - + @@ -303,6 +303,7 @@ + diff --git a/MediaBrowser.Server.Implementations/Sync/MockSyncProvider.cs b/MediaBrowser.Server.Implementations/Sync/MockSyncProvider.cs index bc079ad809..7d29446b92 100644 --- a/MediaBrowser.Server.Implementations/Sync/MockSyncProvider.cs +++ b/MediaBrowser.Server.Implementations/Sync/MockSyncProvider.cs @@ -10,7 +10,7 @@ namespace MediaBrowser.Server.Implementations.Sync { public string Name { - get { return "Dummy Sync"; } + get { return "Test Sync"; } } public IEnumerable GetSyncTargets() @@ -19,8 +19,8 @@ namespace MediaBrowser.Server.Implementations.Sync { new SyncTarget { - Id = "mock".GetMD5().ToString("N"), - Name = "Mock Sync" + Id = GetType().Name.GetMD5().ToString("N"), + Name = Name } }; } diff --git a/MediaBrowser.Server.Implementations/Sync/SyncJobProcessor.cs b/MediaBrowser.Server.Implementations/Sync/SyncJobProcessor.cs new file mode 100644 index 0000000000..c7f02b3dd5 --- /dev/null +++ b/MediaBrowser.Server.Implementations/Sync/SyncJobProcessor.cs @@ -0,0 +1,89 @@ +using MediaBrowser.Controller.Entities; +using MediaBrowser.Controller.Library; +using MediaBrowser.Controller.Sync; +using MediaBrowser.Model.Sync; +using MoreLinq; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace MediaBrowser.Server.Implementations.Sync +{ + public class SyncJobProcessor + { + private readonly ILibraryManager _libraryManager; + private readonly ISyncRepository _syncRepo; + + public SyncJobProcessor(ILibraryManager libraryManager, ISyncRepository syncRepo) + { + _libraryManager = libraryManager; + _syncRepo = syncRepo; + } + + public void ProcessJobItem(SyncJob job, SyncJobItem jobItem, SyncTarget target) + { + + } + + public async Task EnsureJobItems(SyncJob job) + { + var items = GetItemsForSync(job.RequestedItemIds) + .ToList(); + + var jobItems = _syncRepo.GetJobItems(job.Id) + .ToList(); + + var created = 0; + + foreach (var item in items) + { + var itemId = item.Id.ToString("N"); + + var jobItem = jobItems.FirstOrDefault(i => string.Equals(i.ItemId, itemId, StringComparison.OrdinalIgnoreCase)); + + if (jobItem != null) + { + continue; + } + + jobItem = new SyncJobItem + { + Id = Guid.NewGuid().ToString("N"), + ItemId = itemId, + JobId = job.Id, + TargetId = job.TargetId + }; + + await _syncRepo.Create(jobItem).ConfigureAwait(false); + + created++; + } + + job.ItemCount = jobItems.Count + created; + await _syncRepo.Update(job).ConfigureAwait(false); + } + + public IEnumerable GetItemsForSync(IEnumerable itemIds) + { + return itemIds.SelectMany(GetItemsForSync).DistinctBy(i => i.Id); + } + + private IEnumerable GetItemsForSync(string id) + { + var item = _libraryManager.GetItemById(id); + + if (item == null) + { + return new List(); + } + + return GetItemsForSync(item); + } + + private IEnumerable GetItemsForSync(BaseItem item) + { + return new[] { item }; + } + } +} diff --git a/MediaBrowser.Server.Implementations/Sync/SyncManager.cs b/MediaBrowser.Server.Implementations/Sync/SyncManager.cs index 201eb8c7f3..0c7b5c2b9f 100644 --- a/MediaBrowser.Server.Implementations/Sync/SyncManager.cs +++ b/MediaBrowser.Server.Implementations/Sync/SyncManager.cs @@ -1,11 +1,10 @@ -using System.IO; -using MediaBrowser.Common.Extensions; +using MediaBrowser.Common.Extensions; using MediaBrowser.Controller.Drawing; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities.Audio; +using MediaBrowser.Controller.Entities.TV; using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Sync; -using MediaBrowser.Model.Devices; using MediaBrowser.Model.Entities; using MediaBrowser.Model.Logging; using MediaBrowser.Model.Querying; @@ -42,7 +41,14 @@ namespace MediaBrowser.Server.Implementations.Sync public async Task CreateJob(SyncJobRequest request) { - var items = GetItemsForSync(request.ItemIds).ToList(); + var items = new SyncJobProcessor(_libraryManager, _repo) + .GetItemsForSync(request.ItemIds) + .ToList(); + + if (items.Any(i => !SupportsSync(i))) + { + throw new ArgumentException("Item does not support sync."); + } if (items.Count == 1) { @@ -66,12 +72,14 @@ namespace MediaBrowser.Server.Implementations.Sync TargetId = target.Id, UserId = request.UserId, UnwatchedOnly = request.UnwatchedOnly, - Limit = request.Limit, - LimitType = request.LimitType, + ItemLimit = request.ItemLimit, RequestedItemIds = request.ItemIds, DateCreated = DateTime.UtcNow, DateLastModified = DateTime.UtcNow, - ItemCount = 1 + SyncNewContent = request.SyncNewContent, + RemoveWhenWatched = request.RemoveWhenWatched, + ItemCount = items.Count, + Quality = request.Quality }; await _repo.Create(job).ConfigureAwait(false); @@ -93,7 +101,8 @@ namespace MediaBrowser.Server.Implementations.Sync private void FillMetadata(SyncJob job) { - var item = GetItemsForSync(job.RequestedItemIds) + var item = new SyncJobProcessor(_libraryManager, _repo) + .GetItemsForSync(job.RequestedItemIds) .FirstOrDefault(); if (item != null) @@ -130,7 +139,11 @@ namespace MediaBrowser.Server.Implementations.Sync public Task CancelJob(string id) { - throw new NotImplementedException(); + var job = GetJob(id); + + job.Status = SyncJobStatus.Cancelled; + + return _repo.DeleteJob(id); } public SyncJob GetJob(string id) @@ -165,26 +178,26 @@ namespace MediaBrowser.Server.Implementations.Sync private string GetSyncProviderId(ISyncProvider provider) { - return (provider.GetType().Name + provider.Name).GetMD5().ToString("N"); + return (provider.GetType().Name).GetMD5().ToString("N"); } public bool SupportsSync(BaseItem item) { - if (item.LocationType == LocationType.Virtual) - { - return false; - } - if (string.Equals(item.MediaType, MediaType.Audio, StringComparison.OrdinalIgnoreCase) || string.Equals(item.MediaType, MediaType.Video, StringComparison.OrdinalIgnoreCase)) { + if (item.LocationType == LocationType.Virtual) + { + return false; + } + if (item.RunTimeTicks.HasValue) { var video = item as Video; if (video != null) { - if (video.VideoType != VideoType.VideoFile) + if (video.VideoType == VideoType.Iso) { return false; } @@ -201,34 +214,7 @@ namespace MediaBrowser.Server.Implementations.Sync return false; } - return false; - } - - private IEnumerable GetItemsForSync(IEnumerable itemIds) - { - return itemIds.SelectMany(GetItemsForSync).DistinctBy(i => i.Id); - } - - private IEnumerable GetItemsForSync(string id) - { - var item = _libraryManager.GetItemById(id); - - if (item == null) - { - throw new ArgumentException("Item with Id " + id + " not found."); - } - - if (!SupportsSync(item)) - { - throw new ArgumentException("Item with Id " + id + " does not support sync."); - } - - return GetItemsForSync(item); - } - - private IEnumerable GetItemsForSync(BaseItem item) - { - return new[] { item }; + return item.LocationType == LocationType.FileSystem || item is Season; } private string GetDefaultName(BaseItem item) diff --git a/MediaBrowser.Server.Implementations/Sync/SyncRepository.cs b/MediaBrowser.Server.Implementations/Sync/SyncRepository.cs index 65da74f9e5..3385290439 100644 --- a/MediaBrowser.Server.Implementations/Sync/SyncRepository.cs +++ b/MediaBrowser.Server.Implementations/Sync/SyncRepository.cs @@ -23,6 +23,7 @@ namespace MediaBrowser.Server.Implementations.Sync private readonly IServerApplicationPaths _appPaths; private readonly CultureInfo _usCulture = new CultureInfo("en-US"); + private IDbCommand _deleteJobCommand; private IDbCommand _saveJobCommand; private IDbCommand _saveJobItemCommand; @@ -34,13 +35,13 @@ namespace MediaBrowser.Server.Implementations.Sync public async Task Initialize() { - var dbFile = Path.Combine(_appPaths.DataPath, "sync.db"); + var dbFile = Path.Combine(_appPaths.DataPath, "sync2.db"); _connection = await SqliteExtensions.ConnectToDb(dbFile, _logger).ConfigureAwait(false); string[] queries = { - "create table if not exists SyncJobs (Id GUID PRIMARY KEY, TargetId TEXT NOT NULL, Name TEXT NOT NULL, Quality TEXT NOT NULL, Status TEXT NOT NULL, Progress FLOAT, UserId TEXT NOT NULL, ItemIds TEXT NOT NULL, UnwatchedOnly BIT, SyncLimit BigInt, LimitType TEXT, IsDynamic BIT, DateCreated DateTime, DateLastModified DateTime, ItemCount int)", + "create table if not exists SyncJobs (Id GUID PRIMARY KEY, TargetId TEXT NOT NULL, Name TEXT NOT NULL, Quality TEXT NOT NULL, Status TEXT NOT NULL, Progress FLOAT, UserId TEXT NOT NULL, ItemIds TEXT NOT NULL, UnwatchedOnly BIT, ItemLimit INT, RemoveWhenWatched BIT, SyncNewContent BIT, DateCreated DateTime, DateLastModified DateTime, ItemCount int)", "create index if not exists idx_SyncJobs on SyncJobs(Id)", "create table if not exists SyncJobItems (Id GUID PRIMARY KEY, ItemId TEXT, JobId TEXT, OutputPath TEXT, Status TEXT, TargetId TEXT)", @@ -59,8 +60,12 @@ namespace MediaBrowser.Server.Implementations.Sync private void PrepareStatements() { + _deleteJobCommand = _connection.CreateCommand(); + _deleteJobCommand.CommandText = "delete from SyncJobs where Id=@Id; delete from SyncJobItems where JobId=@Id"; + _deleteJobCommand.Parameters.Add(_deleteJobCommand, "@Id"); + _saveJobCommand = _connection.CreateCommand(); - _saveJobCommand.CommandText = "replace into SyncJobs (Id, TargetId, Name, Quality, Status, Progress, UserId, ItemIds, UnwatchedOnly, SyncLimit, LimitType, IsDynamic, DateCreated, DateLastModified, ItemCount) values (@Id, @TargetId, @Name, @Quality, @Status, @Progress, @UserId, @ItemIds, @UnwatchedOnly, @SyncLimit, @LimitType, @IsDynamic, @DateCreated, @DateLastModified, @ItemCount)"; + _saveJobCommand.CommandText = "replace into SyncJobs (Id, TargetId, Name, Quality, Status, Progress, UserId, ItemIds, UnwatchedOnly, ItemLimit, RemoveWhenWatched, SyncNewContent, DateCreated, DateLastModified, ItemCount) values (@Id, @TargetId, @Name, @Quality, @Status, @Progress, @UserId, @ItemIds, @UnwatchedOnly, @ItemLimit, @RemoveWhenWatched, @SyncNewContent, @DateCreated, @DateLastModified, @ItemCount)"; _saveJobCommand.Parameters.Add(_saveJobCommand, "@Id"); _saveJobCommand.Parameters.Add(_saveJobCommand, "@TargetId"); @@ -71,9 +76,9 @@ namespace MediaBrowser.Server.Implementations.Sync _saveJobCommand.Parameters.Add(_saveJobCommand, "@UserId"); _saveJobCommand.Parameters.Add(_saveJobCommand, "@ItemIds"); _saveJobCommand.Parameters.Add(_saveJobCommand, "@UnwatchedOnly"); - _saveJobCommand.Parameters.Add(_saveJobCommand, "@SyncLimit"); - _saveJobCommand.Parameters.Add(_saveJobCommand, "@LimitType"); - _saveJobCommand.Parameters.Add(_saveJobCommand, "@IsDynamic"); + _saveJobCommand.Parameters.Add(_saveJobCommand, "@ItemLimit"); + _saveJobCommand.Parameters.Add(_saveJobCommand, "@RemoveWhenWatched"); + _saveJobCommand.Parameters.Add(_saveJobCommand, "@SyncNewContent"); _saveJobCommand.Parameters.Add(_saveJobCommand, "@DateCreated"); _saveJobCommand.Parameters.Add(_saveJobCommand, "@DateLastModified"); _saveJobCommand.Parameters.Add(_saveJobCommand, "@ItemCount"); @@ -88,7 +93,7 @@ namespace MediaBrowser.Server.Implementations.Sync _saveJobItemCommand.Parameters.Add(_saveJobCommand, "@Status"); } - private const string BaseJobSelectText = "select Id, TargetId, Name, Quality, Status, Progress, UserId, ItemIds, UnwatchedOnly, SyncLimit, LimitType, IsDynamic, DateCreated, DateLastModified, ItemCount from SyncJobs"; + private const string BaseJobSelectText = "select Id, TargetId, Name, Quality, Status, Progress, UserId, ItemIds, UnwatchedOnly, ItemLimit, RemoveWhenWatched, SyncNewContent, DateCreated, DateLastModified, ItemCount from SyncJobs"; private const string BaseJobItemSelectText = "select Id, ItemId, JobId, OutputPath, Status, TargetId from SyncJobItems"; public SyncJob GetJob(string id) @@ -159,15 +164,12 @@ namespace MediaBrowser.Server.Implementations.Sync if (!reader.IsDBNull(9)) { - info.Limit = reader.GetInt64(9); + info.ItemLimit = reader.GetInt32(9); } - if (!reader.IsDBNull(10)) - { - info.LimitType = (SyncLimitType)Enum.Parse(typeof(SyncLimitType), reader.GetString(10), true); - } + info.RemoveWhenWatched = reader.GetBoolean(10); + info.SyncNewContent = reader.GetBoolean(11); - info.IsDynamic = reader.GetBoolean(11); info.DateCreated = reader.GetDateTime(12).ToUniversalTime(); info.DateLastModified = reader.GetDateTime(13).ToUniversalTime(); info.ItemCount = reader.GetInt32(14); @@ -206,9 +208,9 @@ namespace MediaBrowser.Server.Implementations.Sync _saveJobCommand.GetParameter(index++).Value = job.UserId; _saveJobCommand.GetParameter(index++).Value = string.Join(",", job.RequestedItemIds.ToArray()); _saveJobCommand.GetParameter(index++).Value = job.UnwatchedOnly; - _saveJobCommand.GetParameter(index++).Value = job.Limit; - _saveJobCommand.GetParameter(index++).Value = job.LimitType; - _saveJobCommand.GetParameter(index++).Value = job.IsDynamic; + _saveJobCommand.GetParameter(index++).Value = job.ItemLimit; + _saveJobCommand.GetParameter(index++).Value = job.RemoveWhenWatched; + _saveJobCommand.GetParameter(index++).Value = job.SyncNewContent; _saveJobCommand.GetParameter(index++).Value = job.DateCreated; _saveJobCommand.GetParameter(index++).Value = job.DateLastModified; _saveJobCommand.GetParameter(index++).Value = job.ItemCount; @@ -250,6 +252,62 @@ namespace MediaBrowser.Server.Implementations.Sync } } + public async Task DeleteJob(string id) + { + if (string.IsNullOrWhiteSpace(id)) + { + throw new ArgumentNullException("id"); + } + + await _writeLock.WaitAsync().ConfigureAwait(false); + + IDbTransaction transaction = null; + + try + { + transaction = _connection.BeginTransaction(); + + var index = 0; + + _deleteJobCommand.GetParameter(index++).Value = new Guid(id); + + _deleteJobCommand.Transaction = transaction; + + _deleteJobCommand.ExecuteNonQuery(); + + transaction.Commit(); + } + catch (OperationCanceledException) + { + if (transaction != null) + { + transaction.Rollback(); + } + + throw; + } + catch (Exception e) + { + _logger.ErrorException("Failed to save record:", e); + + if (transaction != null) + { + transaction.Rollback(); + } + + throw; + } + finally + { + if (transaction != null) + { + transaction.Dispose(); + } + + _writeLock.Release(); + } + } + public QueryResult GetJobs(SyncJobQuery query) { if (query == null) @@ -336,6 +394,31 @@ namespace MediaBrowser.Server.Implementations.Sync return null; } + public IEnumerable GetJobItems(string jobId) + { + if (string.IsNullOrEmpty(jobId)) + { + throw new ArgumentNullException("jobId"); + } + + var guid = new Guid(jobId); + + using (var cmd = _connection.CreateCommand()) + { + cmd.CommandText = BaseJobItemSelectText + " where JobId=@Id"; + + cmd.Parameters.Add(cmd, "@Id", DbType.Guid).Value = guid; + + using (var reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess | CommandBehavior.SingleResult)) + { + while (reader.Read()) + { + yield return GetSyncJobItem(reader); + } + } + } + } + public Task Create(SyncJobItem jobItem) { return Update(jobItem); diff --git a/MediaBrowser.Server.Startup.Common/ApplicationHost.cs b/MediaBrowser.Server.Startup.Common/ApplicationHost.cs index 8ae117ebdd..8b07e483e6 100644 --- a/MediaBrowser.Server.Startup.Common/ApplicationHost.cs +++ b/MediaBrowser.Server.Startup.Common/ApplicationHost.cs @@ -389,8 +389,8 @@ namespace MediaBrowser.Server.Startup.Common AuthenticationRepository = await GetAuthenticationRepository().ConfigureAwait(false); RegisterSingleInstance(AuthenticationRepository); - //SyncRepository = await GetSyncRepository().ConfigureAwait(false); - //RegisterSingleInstance(SyncRepository); + SyncRepository = await GetSyncRepository().ConfigureAwait(false); + RegisterSingleInstance(SyncRepository); UserManager = new UserManager(LogManager.GetLogger("UserManager"), ServerConfigurationManager, UserRepository, XmlSerializer, NetworkManager, () => ImageProcessor, () => DtoService, () => ConnectManager, this); RegisterSingleInstance(UserManager);