diff options
251 files changed, 5374 insertions, 12791 deletions
diff --git a/Emby.Dlna/ContentDirectory/ContentDirectoryBrowser.cs b/Emby.Dlna/ContentDirectory/ContentDirectoryBrowser.cs index 2b421794a..61501635f 100644 --- a/Emby.Dlna/ContentDirectory/ContentDirectoryBrowser.cs +++ b/Emby.Dlna/ContentDirectory/ContentDirectoryBrowser.cs @@ -33,7 +33,7 @@ namespace Emby.Dlna.ContentDirectory { CancellationToken = cancellationToken, UserAgent = "Emby", - RequestContentType = "text/xml; charset=\"utf-8\"", + RequestContentType = "text/xml", LogErrorResponseBody = true, Url = request.ContentDirectoryUrl, BufferContent = false @@ -43,37 +43,38 @@ namespace Emby.Dlna.ContentDirectory options.RequestContent = GetRequestBody(request); - var response = await _httpClient.SendAsync(options, "POST"); - - using (var reader = new StreamReader(response.Content)) + using (var response = await _httpClient.SendAsync(options, "POST")) { - var doc = XDocument.Parse(reader.ReadToEnd(), LoadOptions.PreserveWhitespace); + using (var reader = new StreamReader(response.Content)) + { + var doc = XDocument.Parse(reader.ReadToEnd(), LoadOptions.PreserveWhitespace); - var queryResult = new QueryResult<ChannelItemInfo>(); + var queryResult = new QueryResult<ChannelItemInfo>(); - if (doc.Document == null) - return queryResult; + if (doc.Document == null) + return queryResult; - var responseElement = doc.Document.Descendants(UNamespace + "BrowseResponse").ToList(); + var responseElement = doc.Document.Descendants(UNamespace + "BrowseResponse").ToList(); - var countElement = responseElement.Select(i => i.Element("TotalMatches")).FirstOrDefault(i => i != null); - var countValue = countElement == null ? null : countElement.Value; + var countElement = responseElement.Select(i => i.Element("TotalMatches")).FirstOrDefault(i => i != null); + var countValue = countElement == null ? null : countElement.Value; - int count; - if (!string.IsNullOrWhiteSpace(countValue) && int.TryParse(countValue, NumberStyles.Integer, CultureInfo.InvariantCulture, out count)) - { - queryResult.TotalRecordCount = count; + int count; + if (!string.IsNullOrWhiteSpace(countValue) && int.TryParse(countValue, NumberStyles.Integer, CultureInfo.InvariantCulture, out count)) + { + queryResult.TotalRecordCount = count; - var resultElement = responseElement.Select(i => i.Element("Result")).FirstOrDefault(i => i != null); - var resultString = (string)resultElement; + var resultElement = responseElement.Select(i => i.Element("Result")).FirstOrDefault(i => i != null); + var resultString = (string)resultElement; - if (resultElement != null) - { - var xElement = XElement.Parse(resultString); + if (resultElement != null) + { + var xElement = XElement.Parse(resultString); + } } - } - return queryResult; + return queryResult; + } } } diff --git a/Emby.Dlna/Didl/DidlBuilder.cs b/Emby.Dlna/Didl/DidlBuilder.cs index 5e200428a..5b18a2b7c 100644 --- a/Emby.Dlna/Didl/DidlBuilder.cs +++ b/Emby.Dlna/Didl/DidlBuilder.cs @@ -393,75 +393,75 @@ namespace Emby.Dlna.Didl { if (itemStubType.HasValue && itemStubType.Value == StubType.Latest) { - return _localization.GetLocalizedString("ViewTypeMusicLatest"); + return _localization.GetLocalizedString("Latest"); } if (itemStubType.HasValue && itemStubType.Value == StubType.Playlists) { - return _localization.GetLocalizedString("ViewTypeMusicPlaylists"); + return _localization.GetLocalizedString("Playlists"); } if (itemStubType.HasValue && itemStubType.Value == StubType.AlbumArtists) { - return _localization.GetLocalizedString("ViewTypeMusicAlbumArtists"); + return _localization.GetLocalizedString("HeaderAlbumArtists"); } if (itemStubType.HasValue && itemStubType.Value == StubType.Albums) { - return _localization.GetLocalizedString("ViewTypeMusicAlbums"); + return _localization.GetLocalizedString("Albums"); } if (itemStubType.HasValue && itemStubType.Value == StubType.Artists) { - return _localization.GetLocalizedString("ViewTypeMusicArtists"); + return _localization.GetLocalizedString("Artists"); } if (itemStubType.HasValue && itemStubType.Value == StubType.Songs) { - return _localization.GetLocalizedString("ViewTypeMusicSongs"); + return _localization.GetLocalizedString("Songs"); } if (itemStubType.HasValue && itemStubType.Value == StubType.Genres) { - return _localization.GetLocalizedString("ViewTypeTvGenres"); + return _localization.GetLocalizedString("Genres"); } if (itemStubType.HasValue && itemStubType.Value == StubType.FavoriteAlbums) { - return _localization.GetLocalizedString("ViewTypeMusicFavoriteAlbums"); + return _localization.GetLocalizedString("HeaderFavoriteAlbums"); } if (itemStubType.HasValue && itemStubType.Value == StubType.FavoriteArtists) { - return _localization.GetLocalizedString("ViewTypeMusicFavoriteArtists"); + return _localization.GetLocalizedString("HeaderFavoriteArtists"); } if (itemStubType.HasValue && itemStubType.Value == StubType.FavoriteSongs) { - return _localization.GetLocalizedString("ViewTypeMusicFavoriteSongs"); + return _localization.GetLocalizedString("HeaderFavoriteSongs"); } if (itemStubType.HasValue && itemStubType.Value == StubType.ContinueWatching) { - return _localization.GetLocalizedString("ViewTypeMovieResume"); + return _localization.GetLocalizedString("HeaderContinueWatching"); } if (itemStubType.HasValue && itemStubType.Value == StubType.Movies) { - return _localization.GetLocalizedString("ViewTypeMovieMovies"); + return _localization.GetLocalizedString("Movies"); } if (itemStubType.HasValue && itemStubType.Value == StubType.Collections) { - return _localization.GetLocalizedString("ViewTypeMovieCollections"); + return _localization.GetLocalizedString("Collections"); } if (itemStubType.HasValue && itemStubType.Value == StubType.Favorites) { - return _localization.GetLocalizedString("ViewTypeMovieFavorites"); + return _localization.GetLocalizedString("Favorites"); } if (itemStubType.HasValue && itemStubType.Value == StubType.NextUp) { - return _localization.GetLocalizedString("ViewTypeTvNextUp"); + return _localization.GetLocalizedString("HeaderNextUp"); } if (itemStubType.HasValue && itemStubType.Value == StubType.FavoriteSeries) { - return _localization.GetLocalizedString("ViewTypeTvFavoriteSeries"); + return _localization.GetLocalizedString("HeaderFavoriteShows"); } if (itemStubType.HasValue && itemStubType.Value == StubType.FavoriteEpisodes) { - return _localization.GetLocalizedString("ViewTypeTvFavoriteEpisodes"); + return _localization.GetLocalizedString("HeaderFavoriteEpisodes"); } if (itemStubType.HasValue && itemStubType.Value == StubType.Series) { - return _localization.GetLocalizedString("ViewTypeTvShowSeries"); + return _localization.GetLocalizedString("Shows"); } var episode = item as Episode; @@ -1071,8 +1071,10 @@ namespace Emby.Dlna.Didl writer.WriteStartElement(string.Empty, "res", NS_DIDL); - var width = albumartUrlInfo.Width; - var height = albumartUrlInfo.Height; + // Images must have a reported size or many clients (Bubble upnp), will only use the first thumbnail + // rather than using a larger one when available + var width = albumartUrlInfo.Width ?? maxWidth; + var height = albumartUrlInfo.Height ?? maxHeight; var contentFeatures = new ContentFeatureBuilder(_profile) .BuildImageHeader(format, width, height, imageInfo.IsDirectStream, org_Pn); @@ -1083,10 +1085,7 @@ namespace Emby.Dlna.Didl contentFeatures )); - if (width.HasValue && height.HasValue) - { - writer.WriteAttributeString("resolution", string.Format("{0}x{1}", width.Value, height.Value)); - } + writer.WriteAttributeString("resolution", string.Format("{0}x{1}", width, height)); writer.WriteString(albumartUrlInfo.Url); @@ -1138,8 +1137,21 @@ namespace Emby.Dlna.Didl } - int? width = null; - int? height = null; + int? width = imageInfo.Width; + int? height = imageInfo.Height; + + if (width == 0 || height == 0) + { + //_imageProcessor.GetImageSize(item, imageInfo); + width = null; + height = null; + } + + else if (width == -1 || height == -1) + { + width = null; + height = null; + } //try //{ diff --git a/Emby.Dlna/Eventing/EventManager.cs b/Emby.Dlna/Eventing/EventManager.cs index 0516585ae..67eac640e 100644 --- a/Emby.Dlna/Eventing/EventManager.cs +++ b/Emby.Dlna/Eventing/EventManager.cs @@ -26,9 +26,11 @@ namespace Emby.Dlna.Eventing _logger = logger; } - public EventSubscriptionResponse RenewEventSubscription(string subscriptionId, string requestedTimeoutString) + public EventSubscriptionResponse RenewEventSubscription(string subscriptionId, string notificationType, string requestedTimeoutString, string callbackUrl) { - var subscription = GetSubscription(subscriptionId, true); + var subscription = GetSubscription(subscriptionId, false); + + int timeoutSeconds; // Remove logging for now because some devices are sending this very frequently // TODO re-enable with dlna debug logging setting @@ -37,10 +39,18 @@ namespace Emby.Dlna.Eventing // timeout, // subscription.CallbackUrl); - subscription.TimeoutSeconds = ParseTimeout(requestedTimeoutString) ?? 300; - subscription.SubscriptionTime = DateTime.UtcNow; + if (subscription != null) + { + subscription.TimeoutSeconds = ParseTimeout(requestedTimeoutString) ?? 300; + timeoutSeconds = subscription.TimeoutSeconds; + subscription.SubscriptionTime = DateTime.UtcNow; + } + else + { + timeoutSeconds = 300; + } - return GetEventSubscriptionResponse(subscriptionId, requestedTimeoutString, subscription.TimeoutSeconds); + return GetEventSubscriptionResponse(subscriptionId, requestedTimeoutString, timeoutSeconds); } public EventSubscriptionResponse CreateEventSubscription(string notificationType, string requestedTimeoutString, string callbackUrl) @@ -172,7 +182,10 @@ namespace Emby.Dlna.Eventing try { - await _httpClient.SendAsync(options, "NOTIFY").ConfigureAwait(false); + using (await _httpClient.SendAsync(options, "NOTIFY").ConfigureAwait(false)) + { + + } } catch (OperationCanceledException) { diff --git a/Emby.Dlna/PlayTo/SsdpHttpClient.cs b/Emby.Dlna/PlayTo/SsdpHttpClient.cs index 1aa671b8f..78b688d92 100644 --- a/Emby.Dlna/PlayTo/SsdpHttpClient.cs +++ b/Emby.Dlna/PlayTo/SsdpHttpClient.cs @@ -31,14 +31,15 @@ namespace Emby.Dlna.PlayTo bool logRequest = true, string header = null) { - var response = await PostSoapDataAsync(NormalizeServiceUrl(baseUrl, service.ControlUrl), "\"" + service.ServiceType + "#" + command + "\"", postData, header, logRequest) - .ConfigureAwait(false); - - using (var stream = response.Content) + using (var response = await PostSoapDataAsync(NormalizeServiceUrl(baseUrl, service.ControlUrl), "\"" + service.ServiceType + "#" + command + "\"", postData, header, logRequest) + .ConfigureAwait(false)) { - using (var reader = new StreamReader(stream, Encoding.UTF8)) + using (var stream = response.Content) { - return XDocument.Parse(reader.ReadToEnd(), LoadOptions.PreserveWhitespace); + using (var reader = new StreamReader(stream, Encoding.UTF8)) + { + return XDocument.Parse(reader.ReadToEnd(), LoadOptions.PreserveWhitespace); + } } } } @@ -71,7 +72,10 @@ namespace Emby.Dlna.PlayTo Url = url, UserAgent = USERAGENT, LogErrorResponseBody = true, - BufferContent = false + BufferContent = false, + + // The periodic requests may keep some devices awake + LogRequestAsDebug = true }; options.RequestHeaders["HOST"] = ip + ":" + port.ToString(_usCulture); @@ -79,7 +83,10 @@ namespace Emby.Dlna.PlayTo options.RequestHeaders["NT"] = "upnp:event"; options.RequestHeaders["TIMEOUT"] = "Second-" + timeOut.ToString(_usCulture); - await _httpClient.SendAsync(options, "SUBSCRIBE").ConfigureAwait(false); + using (await _httpClient.SendAsync(options, "SUBSCRIBE").ConfigureAwait(false)) + { + + } } public async Task<XDocument> GetDataAsync(string url) @@ -89,16 +96,22 @@ namespace Emby.Dlna.PlayTo Url = url, UserAgent = USERAGENT, LogErrorResponseBody = true, - BufferContent = false + BufferContent = false, + + // The periodic requests may keep some devices awake + LogRequestAsDebug = true }; options.RequestHeaders["FriendlyName.DLNA.ORG"] = FriendlyName; - using (var stream = await _httpClient.Get(options).ConfigureAwait(false)) + using (var response = await _httpClient.SendAsync(options, "GET").ConfigureAwait(false)) { - using (var reader = new StreamReader(stream, Encoding.UTF8)) + using (var stream = response.Content) { - return XDocument.Parse(reader.ReadToEnd(), LoadOptions.PreserveWhitespace); + using (var reader = new StreamReader(stream, Encoding.UTF8)) + { + return XDocument.Parse(reader.ReadToEnd(), LoadOptions.PreserveWhitespace); + } } } } @@ -118,7 +131,10 @@ namespace Emby.Dlna.PlayTo UserAgent = USERAGENT, LogRequest = logRequest || _config.GetDlnaConfiguration().EnableDebugLog, LogErrorResponseBody = true, - BufferContent = false + BufferContent = false, + + // The periodic requests may keep some devices awake + LogRequestAsDebug = true }; options.RequestHeaders["SOAPAction"] = soapAction; @@ -130,7 +146,8 @@ namespace Emby.Dlna.PlayTo options.RequestHeaders["contentFeatures.dlna.org"] = header; } - options.RequestContentType = "text/xml; charset=\"utf-8\""; + options.RequestContentType = "text/xml"; + options.AppendCharsetToMimeType = true; options.RequestContent = postData; return _httpClient.Post(options); diff --git a/Emby.Dlna/Service/BaseService.cs b/Emby.Dlna/Service/BaseService.cs index ddc37da09..bc7f01d97 100644 --- a/Emby.Dlna/Service/BaseService.cs +++ b/Emby.Dlna/Service/BaseService.cs @@ -24,9 +24,9 @@ namespace Emby.Dlna.Service return EventManager.CancelEventSubscription(subscriptionId); } - public EventSubscriptionResponse RenewEventSubscription(string subscriptionId, string timeoutString) + public EventSubscriptionResponse RenewEventSubscription(string subscriptionId, string notificationType, string timeoutString, string callbackUrl) { - return EventManager.RenewEventSubscription(subscriptionId, timeoutString); + return EventManager.RenewEventSubscription(subscriptionId, notificationType, timeoutString, callbackUrl); } public EventSubscriptionResponse CreateEventSubscription(string notificationType, string timeoutString, string callbackUrl) diff --git a/Emby.Drawing.ImageMagick/ImageMagickEncoder.cs b/Emby.Drawing.ImageMagick/ImageMagickEncoder.cs index 04f916eb1..38e2879ea 100644 --- a/Emby.Drawing.ImageMagick/ImageMagickEncoder.cs +++ b/Emby.Drawing.ImageMagick/ImageMagickEncoder.cs @@ -149,7 +149,7 @@ namespace Emby.Drawing.ImageMagick var originalImageSize = new ImageSize(originalImage.CurrentImage.Width, originalImage.CurrentImage.Height); - if (!options.CropWhiteSpace && options.HasDefaultOptions(inputPath, originalImageSize)) + if (!options.CropWhiteSpace && options.HasDefaultOptions(inputPath, originalImageSize) && !autoOrient) { // Just spit out the original file if all the options are default return inputPath; diff --git a/Emby.Drawing/ImageProcessor.cs b/Emby.Drawing/ImageProcessor.cs index 831454972..e28d22cf7 100644 --- a/Emby.Drawing/ImageProcessor.cs +++ b/Emby.Drawing/ImageProcessor.cs @@ -442,19 +442,44 @@ namespace Emby.Drawing return GetCachePath(ResizedImageCachePath, filename, "." + format.ToString().ToLower()); } - public ImageSize GetImageSize(ItemImageInfo info, bool allowSlowMethods) + public ImageSize GetImageSize(BaseItem item, ItemImageInfo info) { - return GetImageSize(info.Path, allowSlowMethods); + return GetImageSize(item, info, false, true); } - public ImageSize GetImageSize(ItemImageInfo info) + public ImageSize GetImageSize(BaseItem item, ItemImageInfo info, bool allowSlowMethods, bool updateItem) { - return GetImageSize(info.Path, false); + var width = info.Width; + var height = info.Height; + + if (height > 0 && width > 0) + { + return new ImageSize + { + Width = width, + Height = height + }; + } + + var path = info.Path; + _logger.Info("Getting image size for item {0} {1}", item.GetType().Name, path); + + var size = GetImageSize(path, allowSlowMethods); + + info.Height = Convert.ToInt32(size.Height); + info.Width = Convert.ToInt32(size.Width); + + if (updateItem) + { + _libraryManager().UpdateImages(item); + } + + return size; } public ImageSize GetImageSize(string path) { - return GetImageSize(path, false); + return GetImageSize(path, true); } /// <summary> diff --git a/Emby.Photos/PhotoProvider.cs b/Emby.Photos/PhotoProvider.cs index fe77cff69..11a7db47d 100644 --- a/Emby.Photos/PhotoProvider.cs +++ b/Emby.Photos/PhotoProvider.cs @@ -17,7 +17,7 @@ using TagLib.IFD.Tags; namespace Emby.Photos { - public class PhotoProvider : ICustomMetadataProvider<Photo>, IHasItemChangeMonitor, IForcedProvider + public class PhotoProvider : ICustomMetadataProvider<Photo>, IForcedProvider { private readonly ILogger _logger; private readonly IFileSystem _fileSystem; @@ -31,14 +31,14 @@ namespace Emby.Photos } // These are causing taglib to hang - private string[] _excludeExtensions = new string[] { ".dng" }; + private string[] _includextensions = new string[] { ".jpg", ".jpeg", ".png", ".tiff" }; public Task<ItemUpdateType> FetchAsync(Photo item, MetadataRefreshOptions options, CancellationToken cancellationToken) { item.SetImagePath(ImageType.Primary, item.Path); // Examples: https://github.com/mono/taglib-sharp/blob/a5f6949a53d09ce63ee7495580d6802921a21f14/tests/fixtures/TagLib.Tests.Images/NullOrientationTest.cs - if (!_excludeExtensions.Contains(Path.GetExtension(item.Path) ?? string.Empty, StringComparer.OrdinalIgnoreCase)) + if (_includextensions.Contains(Path.GetExtension(item.Path) ?? string.Empty, StringComparer.OrdinalIgnoreCase)) { try { @@ -163,10 +163,14 @@ namespace Emby.Photos if (!item.Width.HasValue || !item.Height.HasValue) { - var size = _imageProcessor.GetImageSize(item.Path); + var img = item.GetImageInfo(ImageType.Primary, 0); + var size = _imageProcessor.GetImageSize(item, img, false, false); - item.Width = Convert.ToInt32(size.Width); - item.Height = Convert.ToInt32(size.Height); + if (size.Width > 0 && size.Height > 0) + { + item.Width = Convert.ToInt32(size.Width); + item.Height = Convert.ToInt32(size.Height); + } } const ItemUpdateType result = ItemUpdateType.ImageUpdate | ItemUpdateType.MetadataImport; @@ -177,19 +181,5 @@ namespace Emby.Photos { get { return "Embedded Information"; } } - - public bool HasChanged(IHasMetadata item, IDirectoryService directoryService) - { - if (item.EnableRefreshOnDateModifiedChange && !string.IsNullOrWhiteSpace(item.Path) && item.LocationType == LocationType.FileSystem) - { - var file = directoryService.GetFile(item.Path); - if (file != null && file.LastWriteTimeUtc != item.DateModified) - { - return true; - } - } - - return false; - } } } diff --git a/Emby.Server.Implementations/Activity/ActivityRepository.cs b/Emby.Server.Implementations/Activity/ActivityRepository.cs index 1ae8e5e66..6293cc69f 100644 --- a/Emby.Server.Implementations/Activity/ActivityRepository.cs +++ b/Emby.Server.Implementations/Activity/ActivityRepository.cs @@ -49,7 +49,7 @@ namespace Emby.Server.Implementations.Activity RunDefaultInitialization(connection); string[] queries = { - "create table if not exists ActivityLogEntries (Id GUID PRIMARY KEY, Name TEXT, Overview TEXT, ShortOverview TEXT, Type TEXT, ItemId TEXT, UserId TEXT, DateCreated DATETIME, LogSeverity TEXT)", + "create table if not exists ActivityLogEntries (Id GUID PRIMARY KEY NOT NULL, Name TEXT NOT NULL, Overview TEXT, ShortOverview TEXT, Type TEXT NOT NULL, ItemId TEXT, UserId TEXT, DateCreated DATETIME NOT NULL, LogSeverity TEXT NOT NULL)", "create index if not exists idx_ActivityLogEntries on ActivityLogEntries(Id)" }; diff --git a/Emby.Server.Implementations/ApplicationHost.cs b/Emby.Server.Implementations/ApplicationHost.cs index 57c509923..c1ab9ec22 100644 --- a/Emby.Server.Implementations/ApplicationHost.cs +++ b/Emby.Server.Implementations/ApplicationHost.cs @@ -775,7 +775,14 @@ namespace Emby.Server.Implementations } // Put the app config in the log for troubleshooting purposes - Logger.LogMultiline("Application configuration:", LogSeverity.Info, new StringBuilder(JsonSerializer.SerializeToString(ConfigurationManager.CommonConfiguration))); + var configJson = new StringBuilder(JsonSerializer.SerializeToString(ConfigurationManager.CommonConfiguration)); + + if (!string.IsNullOrWhiteSpace(ServerConfigurationManager.Configuration.CertificatePassword)) + { + configJson = configJson.Replace(ServerConfigurationManager.Configuration.CertificatePassword, "####"); + } + + Logger.LogMultiline("Application configuration:", LogSeverity.Info, configJson); if (Plugins != null) { @@ -792,6 +799,11 @@ namespace Emby.Server.Implementations protected abstract IConnectManager CreateConnectManager(); protected abstract ISyncManager CreateSyncManager(); + + protected virtual IHttpClient CreateHttpClient() + { + return new HttpClientManager.HttpClientManager(ApplicationPaths, LogManager.GetLogger("HttpClient"), FileSystemManager, MemoryStreamFactory, GetDefaultUserAgent); + } /// <summary> /// Registers resources that classes will depend on @@ -814,7 +826,7 @@ namespace Emby.Server.Implementations RegisterSingleInstance(FileSystemManager); - HttpClient = new HttpClientManager.HttpClientManager(ApplicationPaths, LogManager.GetLogger("HttpClient"), FileSystemManager, MemoryStreamFactory, GetDefaultUserAgent); + HttpClient = CreateHttpClient(); RegisterSingleInstance(HttpClient); RegisterSingleInstance(NetworkManager); @@ -938,7 +950,9 @@ namespace Emby.Server.Implementations ConnectManager = CreateConnectManager(); RegisterSingleInstance(ConnectManager); - DeviceManager = new DeviceManager(new DeviceRepository(ApplicationPaths, JsonSerializer, LogManager.GetLogger("DeviceManager"), FileSystemManager), UserManager, FileSystemManager, LibraryMonitor, ServerConfigurationManager, LogManager.GetLogger("DeviceManager"), NetworkManager); + var deviceRepo = new SqliteDeviceRepository(LogManager.GetLogger("DeviceManager"), ServerConfigurationManager, FileSystemManager, JsonSerializer); + deviceRepo.Initialize(); + DeviceManager = new DeviceManager(deviceRepo, UserManager, FileSystemManager, LibraryMonitor, ServerConfigurationManager, LogManager.GetLogger("DeviceManager"), NetworkManager); RegisterSingleInstance(DeviceManager); var newsService = new Emby.Server.Implementations.News.NewsService(ApplicationPaths, JsonSerializer); @@ -1116,7 +1130,7 @@ namespace Emby.Server.Implementations IsoManager.AddParts(list); } - private string GetDefaultUserAgent() + protected string GetDefaultUserAgent() { var name = FormatAttribute(Name); diff --git a/Emby.Server.Implementations/Channels/ChannelManager.cs b/Emby.Server.Implementations/Channels/ChannelManager.cs index d3950929d..c42f22804 100644 --- a/Emby.Server.Implementations/Channels/ChannelManager.cs +++ b/Emby.Server.Implementations/Channels/ChannelManager.cs @@ -373,7 +373,7 @@ namespace Emby.Server.Implementations.Channels private async Task<Channel> GetChannel(IChannel channelInfo, CancellationToken cancellationToken) { - var parentFolder = await GetInternalChannelFolder(cancellationToken).ConfigureAwait(false); + var parentFolder = GetInternalChannelFolder(cancellationToken); var parentFolderId = parentFolder.Id; var id = GetInternalChannelId(channelInfo.Name); @@ -434,7 +434,7 @@ namespace Emby.Server.Implementations.Channels } else if (forceUpdate) { - await item.UpdateToRepository(ItemUpdateType.None, cancellationToken).ConfigureAwait(false); + item.UpdateToRepository(ItemUpdateType.None, cancellationToken); } await item.RefreshMetadata(new MetadataRefreshOptions(_fileSystem), cancellationToken); @@ -655,14 +655,12 @@ namespace Emby.Server.Implementations.Channels // Avoid implicitly captured closure var token = cancellationToken; - var itemTasks = items.Select(i => + var internalItems = items.Select(i => { var channelProvider = i.Item1; var internalChannelId = GetInternalChannelId(channelProvider.Name); return GetChannelItemEntity(i.Item2, channelProvider, internalChannelId, token); - }); - - var internalItems = await Task.WhenAll(itemTasks).ConfigureAwait(false); + }).ToArray(); internalItems = ApplyFilters(internalItems, query.Filters, user).ToArray(); RefreshIfNeeded(internalItems); @@ -802,14 +800,12 @@ namespace Emby.Server.Implementations.Channels // Avoid implicitly captured closure var token = cancellationToken; - var itemTasks = items.Select(i => + var internalItems = items.Select(i => { var channelProvider = i.Item1; var internalChannelId = GetInternalChannelId(channelProvider.Name); return GetChannelItemEntity(i.Item2, channelProvider, internalChannelId, token); - }); - - var internalItems = await Task.WhenAll(itemTasks).ConfigureAwait(false); + }).ToArray(); return new QueryResult<BaseItem> { @@ -955,9 +951,7 @@ namespace Emby.Server.Implementations.Channels var providerTotalRecordCount = providerLimit.HasValue ? itemsResult.TotalRecordCount : null; - var tasks = itemsResult.Items.Select(i => GetChannelItemEntity(i, channelProvider, channel.Id, cancellationToken)); - - var internalItems = await Task.WhenAll(tasks).ConfigureAwait(false); + var internalItems = itemsResult.Items.Select(i => GetChannelItemEntity(i, channelProvider, channel.Id, cancellationToken)).ToArray(); if (user != null) { @@ -1234,7 +1228,7 @@ namespace Emby.Server.Implementations.Channels return item; } - private async Task<BaseItem> GetChannelItemEntity(ChannelItemInfo info, IChannel channelProvider, Guid internalChannelId, CancellationToken cancellationToken) + private BaseItem GetChannelItemEntity(ChannelItemInfo info, IChannel channelProvider, Guid internalChannelId, CancellationToken cancellationToken) { BaseItem item; bool isNew; @@ -1399,7 +1393,7 @@ namespace Emby.Server.Implementations.Channels } else if (forceUpdate) { - await item.UpdateToRepository(ItemUpdateType.None, cancellationToken).ConfigureAwait(false); + item.UpdateToRepository(ItemUpdateType.None, cancellationToken); } SaveMediaSources(item, info.MediaSources); @@ -1542,20 +1536,20 @@ namespace Emby.Server.Implementations.Channels return items; } - public async Task<BaseItemDto> GetChannelFolder(string userId, CancellationToken cancellationToken) + public BaseItemDto GetChannelFolder(string userId, CancellationToken cancellationToken) { var user = string.IsNullOrEmpty(userId) ? null : _userManager.GetUserById(userId); - var folder = await GetInternalChannelFolder(cancellationToken).ConfigureAwait(false); + var folder = GetInternalChannelFolder(cancellationToken); return _dtoService.GetBaseItemDto(folder, new DtoOptions(), user); } - public async Task<Folder> GetInternalChannelFolder(CancellationToken cancellationToken) + public Folder GetInternalChannelFolder(CancellationToken cancellationToken) { - var name = _localization.GetLocalizedString("ViewTypeChannels"); + var name = _localization.GetLocalizedString("Channels"); - return await _libraryManager.GetNamedView(name, "channels", "zz_" + name, cancellationToken).ConfigureAwait(false); + return _libraryManager.GetNamedView(name, "channels", "zz_" + name, cancellationToken); } } diff --git a/Emby.Server.Implementations/Collections/CollectionManager.cs b/Emby.Server.Implementations/Collections/CollectionManager.cs index 2e884e729..c8e947fd7 100644 --- a/Emby.Server.Implementations/Collections/CollectionManager.cs +++ b/Emby.Server.Implementations/Collections/CollectionManager.cs @@ -203,7 +203,7 @@ namespace Emby.Server.Implementations.Collections collection.UpdateRatingToContent(); - await collection.UpdateToRepository(ItemUpdateType.MetadataEdit, CancellationToken.None).ConfigureAwait(false); + collection.UpdateToRepository(ItemUpdateType.MetadataEdit, CancellationToken.None); _providerManager.QueueRefresh(collection.Id, refreshOptions, RefreshPriority.High); @@ -262,7 +262,7 @@ namespace Emby.Server.Implementations.Collections collection.UpdateRatingToContent(); - await collection.UpdateToRepository(ItemUpdateType.MetadataEdit, CancellationToken.None).ConfigureAwait(false); + collection.UpdateToRepository(ItemUpdateType.MetadataEdit, CancellationToken.None); _providerManager.QueueRefresh(collection.Id, new MetadataRefreshOptions(_fileSystem), RefreshPriority.High); EventHelper.FireEventIfNotNull(ItemsRemovedFromCollection, this, new CollectionModifiedEventArgs diff --git a/Emby.Server.Implementations/Data/SqliteDisplayPreferencesRepository.cs b/Emby.Server.Implementations/Data/SqliteDisplayPreferencesRepository.cs index 1901ce848..e6afcd410 100644 --- a/Emby.Server.Implementations/Data/SqliteDisplayPreferencesRepository.cs +++ b/Emby.Server.Implementations/Data/SqliteDisplayPreferencesRepository.cs @@ -75,7 +75,7 @@ namespace Emby.Server.Implementations.Data string[] queries = { - "create table if not exists userdisplaypreferences (id GUID, userId GUID, client text, data BLOB)", + "create table if not exists userdisplaypreferences (id GUID NOT NULL, userId GUID NOT NULL, client text NOT NULL, data BLOB NOT NULL)", "create unique index if not exists userdisplaypreferencesindex on userdisplaypreferences (id, userId, client)" }; diff --git a/Emby.Server.Implementations/Data/SqliteItemRepository.cs b/Emby.Server.Implementations/Data/SqliteItemRepository.cs index bc4ab8315..01416a307 100644 --- a/Emby.Server.Implementations/Data/SqliteItemRepository.cs +++ b/Emby.Server.Implementations/Data/SqliteItemRepository.cs @@ -146,11 +146,11 @@ namespace Emby.Server.Implementations.Data "create table if not exists TypedBaseItems (guid GUID primary key NOT NULL, type TEXT NOT NULL, data BLOB NULL, ParentId GUID NULL, Path TEXT NULL)", - "create table if not exists AncestorIds (ItemId GUID, AncestorId GUID, AncestorIdText TEXT, PRIMARY KEY (ItemId, AncestorId))", + "create table if not exists AncestorIds (ItemId GUID NOT NULL, AncestorId GUID NOT NULL, AncestorIdText TEXT NOT NULL, PRIMARY KEY (ItemId, AncestorId))", "create index if not exists idx_AncestorIds1 on AncestorIds(AncestorId)", "create index if not exists idx_AncestorIds5 on AncestorIds(AncestorIdText,ItemId)", - "create table if not exists ItemValues (ItemId GUID, Type INT, Value TEXT, CleanValue TEXT)", + "create table if not exists ItemValues (ItemId GUID NOT NULL, Type INT NOT NULL, Value TEXT NOT NULL, CleanValue TEXT NOT NULL)", "create table if not exists People (ItemId GUID, Name TEXT NOT NULL, Role TEXT, PersonType TEXT, SortOrder int, ListOrder int)", @@ -158,7 +158,7 @@ namespace Emby.Server.Implementations.Data "create index if not exists idxPeopleItemId1 on People(ItemId,ListOrder)", "create index if not exists idxPeopleName on People(Name)", - "create table if not exists "+ChaptersTableName+" (ItemId GUID, ChapterIndex INT, StartPositionTicks BIGINT, Name TEXT, ImagePath TEXT, PRIMARY KEY (ItemId, ChapterIndex))", + "create table if not exists "+ChaptersTableName+" (ItemId GUID, ChapterIndex INT NOT NULL, StartPositionTicks BIGINT NOT NULL, Name TEXT, ImagePath TEXT, PRIMARY KEY (ItemId, ChapterIndex))", createMediaStreamsTableCommand, @@ -616,6 +616,33 @@ namespace Emby.Server.Implementations.Data SaveItems(new List<BaseItem> { item }, cancellationToken); } + public void SaveImages(BaseItem item) + { + if (item == null) + { + throw new ArgumentNullException("item"); + } + + CheckDisposed(); + + using (WriteLock.Write()) + { + using (var connection = CreateConnection()) + { + connection.RunInTransaction(db => + { + using (var saveImagesStatement = PrepareStatement(db, "Update TypedBaseItems set Images=@Images where guid=@Id")) + { + saveImagesStatement.TryBind("@Id", item.Id.ToGuidBlob()); + saveImagesStatement.TryBind("@Images", SerializeImages(item)); + + saveImagesStatement.MoveNext(); + } + }, TransactionMode); + } + } + } + /// <summary> /// Saves the items. /// </summary> @@ -1170,7 +1197,11 @@ namespace Emby.Server.Implementations.Data delimeter + image.DateModified.Ticks.ToString(CultureInfo.InvariantCulture) + delimeter + - image.Type; + image.Type + + delimeter + + image.Width.ToString(CultureInfo.InvariantCulture) + + delimeter + + image.Height.ToString(CultureInfo.InvariantCulture); } public ItemImageInfo ItemImageInfoFromValueString(string value) @@ -1198,6 +1229,20 @@ namespace Emby.Server.Implementations.Data image.Type = type; } + if (parts.Length >= 5) + { + int width; + int height; + if (int.TryParse(parts[3], NumberStyles.Integer, CultureInfo.InvariantCulture, out width)) + { + if (int.TryParse(parts[4], NumberStyles.Integer, CultureInfo.InvariantCulture, out height)) + { + image.Width = width; + image.Height = height; + } + } + } + return image; } @@ -3038,8 +3083,8 @@ namespace Emby.Server.Implementations.Data { if (orderBy.Count == 0) { - orderBy.Add(new Tuple<string, SortOrder>(ItemSortBy.Random, SortOrder.Ascending)); orderBy.Add(new Tuple<string, SortOrder>("SimilarityScore", SortOrder.Descending)); + orderBy.Add(new Tuple<string, SortOrder>(ItemSortBy.Random, SortOrder.Ascending)); //orderBy.Add(new Tuple<string, SortOrder>(ItemSortBy.Random, SortOrder.Ascending)); } } diff --git a/Emby.Server.Implementations/Data/SqliteUserDataRepository.cs b/Emby.Server.Implementations/Data/SqliteUserDataRepository.cs index ef1d7ba44..ad5c60ede 100644 --- a/Emby.Server.Implementations/Data/SqliteUserDataRepository.cs +++ b/Emby.Server.Implementations/Data/SqliteUserDataRepository.cs @@ -52,7 +52,7 @@ namespace Emby.Server.Implementations.Data { string[] queries = { - "create table if not exists userdata (key nvarchar, userId GUID, rating float null, played bit, playCount int, isFavorite bit, playbackPositionTicks bigint, lastPlayedDate datetime null)", + "create table if not exists userdata (key nvarchar not null, userId GUID not null, rating float null, played bit not null, playCount int not null, isFavorite bit not null, playbackPositionTicks bigint not null, lastPlayedDate datetime null)", "create table if not exists DataSettings (IsUserDataImported bit)", diff --git a/Emby.Server.Implementations/Data/SqliteUserRepository.cs b/Emby.Server.Implementations/Data/SqliteUserRepository.cs index b65996e40..e89de11c6 100644 --- a/Emby.Server.Implementations/Data/SqliteUserRepository.cs +++ b/Emby.Server.Implementations/Data/SqliteUserRepository.cs @@ -53,9 +53,8 @@ namespace Emby.Server.Implementations.Data string[] queries = { - "create table if not exists users (guid GUID primary key, data BLOB)", + "create table if not exists users (guid GUID primary key NOT NULL, data BLOB NOT NULL)", "create index if not exists idx_users on users(guid)", - "create table if not exists schema_version (table_name primary key, version)", "pragma shrink_memory" }; diff --git a/Emby.Server.Implementations/Devices/CameraUploadsFolder.cs b/Emby.Server.Implementations/Devices/CameraUploadsFolder.cs index 55063872c..5c205dd19 100644 --- a/Emby.Server.Implementations/Devices/CameraUploadsFolder.cs +++ b/Emby.Server.Implementations/Devices/CameraUploadsFolder.cs @@ -28,7 +28,7 @@ namespace Emby.Server.Implementations.Devices [IgnoreDataMember] public override string CollectionType { - get { return MediaBrowser.Model.Entities.CollectionType.Photos; } + get { return MediaBrowser.Model.Entities.CollectionType.HomeVideos; } } [IgnoreDataMember] diff --git a/Emby.Server.Implementations/Devices/DeviceManager.cs b/Emby.Server.Implementations/Devices/DeviceManager.cs index 027a55516..ee4c4bb26 100644 --- a/Emby.Server.Implementations/Devices/DeviceManager.cs +++ b/Emby.Server.Implementations/Devices/DeviceManager.cs @@ -50,7 +50,7 @@ namespace Emby.Server.Implementations.Devices _network = network; } - public async Task<DeviceInfo> RegisterDevice(string reportedId, string name, string appName, string appVersion, string usedByUserId) + public DeviceInfo RegisterDevice(string reportedId, string name, string appName, string appVersion, string usedByUserId) { if (string.IsNullOrWhiteSpace(reportedId)) { @@ -76,14 +76,16 @@ namespace Emby.Server.Implementations.Devices device.DateLastModified = DateTime.UtcNow; - await _repo.SaveDevice(device).ConfigureAwait(false); + device.Name = string.IsNullOrWhiteSpace(device.CustomName) ? device.ReportedName : device.CustomName; + + _repo.SaveDevice(device); return device; } - public Task SaveCapabilities(string reportedId, ClientCapabilities capabilities) + public void SaveCapabilities(string reportedId, ClientCapabilities capabilities) { - return _repo.SaveCapabilities(reportedId, capabilities); + _repo.SaveCapabilities(reportedId, capabilities); } public ClientCapabilities GetCapabilities(string reportedId) @@ -98,13 +100,13 @@ namespace Emby.Server.Implementations.Devices public QueryResult<DeviceInfo> GetDevices(DeviceQuery query) { - IEnumerable<DeviceInfo> devices = _repo.GetDevices().OrderByDescending(i => i.DateLastModified); + IEnumerable<DeviceInfo> devices = _repo.GetDevices(); if (query.SupportsSync.HasValue) { var val = query.SupportsSync.Value; - devices = devices.Where(i => GetCapabilities(i.Id).SupportsSync == val); + devices = devices.Where(i => i.Capabilities.SupportsSync == val); } if (query.SupportsPersistentIdentifier.HasValue) @@ -113,8 +115,7 @@ namespace Emby.Server.Implementations.Devices devices = devices.Where(i => { - var caps = GetCapabilities(i.Id); - var deviceVal = caps.SupportsPersistentIdentifier; + var deviceVal = i.Capabilities.SupportsPersistentIdentifier; return deviceVal == val; }); } @@ -132,9 +133,9 @@ namespace Emby.Server.Implementations.Devices }; } - public Task DeleteDevice(string id) + public void DeleteDevice(string id) { - return _repo.DeleteDevice(id); + _repo.DeleteDevice(id); } public ContentUploadHistory GetCameraUploadHistory(string deviceId) @@ -213,14 +214,16 @@ namespace Emby.Server.Implementations.Devices get { return Path.Combine(_config.CommonApplicationPaths.DataPath, "camerauploads"); } } - public async Task UpdateDeviceInfo(string id, DeviceOptions options) + public void UpdateDeviceInfo(string id, DeviceOptions options) { var device = GetDevice(id); device.CustomName = options.CustomName; device.CameraUploadPath = options.CameraUploadPath; - await _repo.SaveDevice(device).ConfigureAwait(false); + device.Name = string.IsNullOrWhiteSpace(device.CustomName) ? device.ReportedName : device.CustomName; + + _repo.SaveDevice(device); EventHelper.FireEventIfNotNull(DeviceOptionsUpdated, this, new GenericEventArgs<DeviceInfo>(device), _logger); } diff --git a/Emby.Server.Implementations/Devices/DeviceRepository.cs b/Emby.Server.Implementations/Devices/DeviceRepository.cs deleted file mode 100644 index b286a3bb0..000000000 --- a/Emby.Server.Implementations/Devices/DeviceRepository.cs +++ /dev/null @@ -1,212 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Threading.Tasks; -using MediaBrowser.Common.Configuration; -using MediaBrowser.Common.Extensions; -using MediaBrowser.Controller.Devices; -using MediaBrowser.Model.Devices; -using MediaBrowser.Model.IO; -using MediaBrowser.Model.Logging; -using MediaBrowser.Model.Serialization; -using MediaBrowser.Model.Session; -using MediaBrowser.Model.Extensions; - -namespace Emby.Server.Implementations.Devices -{ - public class DeviceRepository : IDeviceRepository - { - private readonly object _syncLock = new object(); - - private readonly IApplicationPaths _appPaths; - private readonly IJsonSerializer _json; - private readonly ILogger _logger; - private readonly IFileSystem _fileSystem; - - private Dictionary<string, DeviceInfo> _devices; - - public DeviceRepository(IApplicationPaths appPaths, IJsonSerializer json, ILogger logger, IFileSystem fileSystem) - { - _appPaths = appPaths; - _json = json; - _logger = logger; - _fileSystem = fileSystem; - } - - private string GetDevicesPath() - { - return Path.Combine(_appPaths.DataPath, "devices"); - } - - private string GetDevicePath(string id) - { - return Path.Combine(GetDevicesPath(), id.GetMD5().ToString("N")); - } - - public Task SaveDevice(DeviceInfo device) - { - var path = Path.Combine(GetDevicePath(device.Id), "device.json"); - _fileSystem.CreateDirectory(_fileSystem.GetDirectoryName(path)); - - lock (_syncLock) - { - _json.SerializeToFile(device, path); - _devices[device.Id] = device; - } - return Task.FromResult(true); - } - - public Task SaveCapabilities(string reportedId, ClientCapabilities capabilities) - { - var device = GetDevice(reportedId); - - if (device == null) - { - throw new ArgumentException("No device has been registed with id " + reportedId); - } - - device.Capabilities = capabilities; - SaveDevice(device); - - return Task.FromResult(true); - } - - public ClientCapabilities GetCapabilities(string reportedId) - { - var device = GetDevice(reportedId); - - return device == null ? null : device.Capabilities; - } - - public DeviceInfo GetDevice(string id) - { - if (string.IsNullOrWhiteSpace(id)) - { - throw new ArgumentNullException("id"); - } - - return GetDevices() - .FirstOrDefault(i => string.Equals(i.Id, id, StringComparison.OrdinalIgnoreCase)); - } - - public IEnumerable<DeviceInfo> GetDevices() - { - lock (_syncLock) - { - if (_devices == null) - { - _devices = new Dictionary<string, DeviceInfo>(StringComparer.OrdinalIgnoreCase); - - var devices = LoadDevices().ToList(); - foreach (var device in devices) - { - _devices[device.Id] = device; - } - } - return _devices.Values.ToList(); - } - } - - private IEnumerable<DeviceInfo> LoadDevices() - { - var path = GetDevicesPath(); - - try - { - return _fileSystem - .GetFilePaths(path, true) - .Where(i => string.Equals(Path.GetFileName(i), "device.json", StringComparison.OrdinalIgnoreCase)) - .ToList() - .Select(i => - { - try - { - return _json.DeserializeFromFile<DeviceInfo>(i); - } - catch (Exception ex) - { - _logger.ErrorException("Error reading {0}", ex, i); - return null; - } - }) - .Where(i => i != null); - } - catch (IOException) - { - return new List<DeviceInfo>(); - } - } - - public Task DeleteDevice(string id) - { - var path = GetDevicePath(id); - - lock (_syncLock) - { - try - { - _fileSystem.DeleteDirectory(path, true); - } - catch (IOException) - { - } - - _devices = null; - } - - return Task.FromResult(true); - } - - public ContentUploadHistory GetCameraUploadHistory(string deviceId) - { - var path = Path.Combine(GetDevicePath(deviceId), "camerauploads.json"); - - lock (_syncLock) - { - try - { - return _json.DeserializeFromFile<ContentUploadHistory>(path); - } - catch (IOException) - { - return new ContentUploadHistory - { - DeviceId = deviceId - }; - } - } - } - - public void AddCameraUpload(string deviceId, LocalFileInfo file) - { - var path = Path.Combine(GetDevicePath(deviceId), "camerauploads.json"); - _fileSystem.CreateDirectory(_fileSystem.GetDirectoryName(path)); - - lock (_syncLock) - { - ContentUploadHistory history; - - try - { - history = _json.DeserializeFromFile<ContentUploadHistory>(path); - } - catch (IOException) - { - history = new ContentUploadHistory - { - DeviceId = deviceId - }; - } - - history.DeviceId = deviceId; - - var list = history.FilesUploaded.ToList(); - list.Add(file); - history.FilesUploaded = list.ToArray(list.Count); - - _json.SerializeToFile(history, path); - } - } - } -} diff --git a/Emby.Server.Implementations/Devices/SqliteDeviceRepository.cs b/Emby.Server.Implementations/Devices/SqliteDeviceRepository.cs new file mode 100644 index 000000000..d7817b17a --- /dev/null +++ b/Emby.Server.Implementations/Devices/SqliteDeviceRepository.cs @@ -0,0 +1,451 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Linq; +using Emby.Server.Implementations.Data; +using MediaBrowser.Controller; +using MediaBrowser.Model.Logging; +using SQLitePCL.pretty; +using MediaBrowser.Model.Extensions; +using MediaBrowser.Model.IO; +using MediaBrowser.Common.Extensions; +using MediaBrowser.Controller.Devices; +using MediaBrowser.Model.Devices; +using MediaBrowser.Model.Serialization; +using MediaBrowser.Model.Session; +using MediaBrowser.Controller.Configuration; + +namespace Emby.Server.Implementations.Devices +{ + public class SqliteDeviceRepository : BaseSqliteRepository, IDeviceRepository + { + private readonly CultureInfo _usCulture = new CultureInfo("en-US"); + protected IFileSystem FileSystem { get; private set; } + private readonly object _syncLock = new object(); + private readonly IJsonSerializer _json; + private IServerApplicationPaths _appPaths; + + public SqliteDeviceRepository(ILogger logger, IServerConfigurationManager config, IFileSystem fileSystem, IJsonSerializer json) + : base(logger) + { + var appPaths = config.ApplicationPaths; + + DbFilePath = Path.Combine(appPaths.DataPath, "devices.db"); + FileSystem = fileSystem; + _json = json; + _appPaths = appPaths; + } + + public void Initialize() + { + try + { + InitializeInternal(); + } + catch (Exception ex) + { + Logger.ErrorException("Error loading database file. Will reset and retry.", ex); + + FileSystem.DeleteFile(DbFilePath); + + InitializeInternal(); + } + } + + private void InitializeInternal() + { + using (var connection = CreateConnection()) + { + RunDefaultInitialization(connection); + + string[] queries = { + "create table if not exists Devices (Id TEXT PRIMARY KEY, Name TEXT NOT NULL, ReportedName TEXT NOT NULL, CustomName TEXT, CameraUploadPath TEXT, LastUserName TEXT, AppName TEXT NOT NULL, AppVersion TEXT NOT NULL, LastUserId TEXT, DateLastModified DATETIME NOT NULL, Capabilities TEXT NOT NULL)", + "create index if not exists idx_id on Devices(Id)" + }; + + connection.RunQueries(queries); + + MigrateDevices(); + } + } + + private void MigrateDevices() + { + List<string> files; + try + { + files = FileSystem + .GetFilePaths(GetDevicesPath(), true) + .Where(i => string.Equals(Path.GetFileName(i), "device.json", StringComparison.OrdinalIgnoreCase)) + .ToList(); + } + catch (IOException) + { + return; + } + + foreach (var file in files) + { + try + { + var device = _json.DeserializeFromFile<DeviceInfo>(file); + + device.Name = string.IsNullOrWhiteSpace(device.CustomName) ? device.ReportedName : device.CustomName; + + SaveDevice(device); + } + catch (Exception ex) + { + Logger.ErrorException("Error reading {0}", ex, file); + } + finally + { + try + { + FileSystem.DeleteFile(file); + } + catch (IOException) + { + try + { + FileSystem.MoveFile(file, Path.ChangeExtension(file, ".old")); + } + catch (IOException) + { + } + } + } + } + } + + private const string BaseSelectText = "select Id, Name, ReportedName, CustomName, CameraUploadPath, LastUserName, AppName, AppVersion, LastUserId, DateLastModified, Capabilities from Devices"; + + public void SaveCapabilities(string deviceId, ClientCapabilities capabilities) + { + using (WriteLock.Write()) + { + using (var connection = CreateConnection()) + { + connection.RunInTransaction(db => + { + using (var statement = db.PrepareStatement("update devices set Capabilities=@Capabilities where Id=@Id")) + { + statement.TryBind("@Id", deviceId); + + if (capabilities == null) + { + statement.TryBindNull("@Capabilities"); + } + else + { + statement.TryBind("@Capabilities", _json.SerializeToString(capabilities)); + } + + statement.MoveNext(); + } + }, TransactionMode); + } + } + } + + public void SaveDevice(DeviceInfo entry) + { + if (entry == null) + { + throw new ArgumentNullException("entry"); + } + + using (WriteLock.Write()) + { + using (var connection = CreateConnection()) + { + connection.RunInTransaction(db => + { + using (var statement = db.PrepareStatement("replace into Devices (Id, Name, ReportedName, CustomName, CameraUploadPath, LastUserName, AppName, AppVersion, LastUserId, DateLastModified, Capabilities) values (@Id, @Name, @ReportedName, @CustomName, @CameraUploadPath, @LastUserName, @AppName, @AppVersion, @LastUserId, @DateLastModified, @Capabilities)")) + { + statement.TryBind("@Id", entry.Id); + statement.TryBind("@Name", entry.Name); + statement.TryBind("@ReportedName", entry.ReportedName); + statement.TryBind("@CustomName", entry.CustomName); + statement.TryBind("@CameraUploadPath", entry.CameraUploadPath); + statement.TryBind("@LastUserName", entry.LastUserName); + statement.TryBind("@AppName", entry.AppName); + statement.TryBind("@AppVersion", entry.AppVersion); + statement.TryBind("@DateLastModified", entry.DateLastModified); + + if (entry.Capabilities == null) + { + statement.TryBindNull("@Capabilities"); + } + else + { + statement.TryBind("@Capabilities", _json.SerializeToString(entry.Capabilities)); + } + + statement.MoveNext(); + } + }, TransactionMode); + } + } + } + + public DeviceInfo GetDevice(string id) + { + using (WriteLock.Read()) + { + using (var connection = CreateConnection(true)) + { + var statementTexts = new List<string>(); + statementTexts.Add(BaseSelectText + " where Id=@Id"); + + return connection.RunInTransaction(db => + { + var statements = PrepareAllSafe(db, statementTexts).ToList(); + + using (var statement = statements[0]) + { + statement.TryBind("@Id", id); + + foreach (var row in statement.ExecuteQuery()) + { + return GetEntry(row); + } + } + + return null; + + }, ReadTransactionMode); + } + } + } + + public List<DeviceInfo> GetDevices() + { + using (WriteLock.Read()) + { + using (var connection = CreateConnection(true)) + { + var statementTexts = new List<string>(); + statementTexts.Add(BaseSelectText + " order by DateLastModified desc"); + + return connection.RunInTransaction(db => + { + var list = new List<DeviceInfo>(); + + var statements = PrepareAllSafe(db, statementTexts).ToList(); + + using (var statement = statements[0]) + { + foreach (var row in statement.ExecuteQuery()) + { + list.Add(GetEntry(row)); + } + } + + return list; + + }, ReadTransactionMode); + } + } + } + + public ClientCapabilities GetCapabilities(string id) + { + using (WriteLock.Read()) + { + using (var connection = CreateConnection(true)) + { + var statementTexts = new List<string>(); + statementTexts.Add("Select Capabilities from Devices where Id=@Id"); + + return connection.RunInTransaction(db => + { + var statements = PrepareAllSafe(db, statementTexts).ToList(); + + using (var statement = statements[0]) + { + statement.TryBind("@Id", id); + + foreach (var row in statement.ExecuteQuery()) + { + if (row[0].SQLiteType != SQLiteType.Null) + { + return _json.DeserializeFromString<ClientCapabilities>(row.GetString(0)); + } + } + } + + return null; + + }, ReadTransactionMode); + } + } + } + + private DeviceInfo GetEntry(IReadOnlyList<IResultSetValue> reader) + { + var index = 0; + + var info = new DeviceInfo + { + Id = reader.GetString(index) + }; + + index++; + if (reader[index].SQLiteType != SQLiteType.Null) + { + info.Name = reader.GetString(index); + } + + index++; + if (reader[index].SQLiteType != SQLiteType.Null) + { + info.ReportedName = reader.GetString(index); + } + + index++; + if (reader[index].SQLiteType != SQLiteType.Null) + { + info.CustomName = reader.GetString(index); + } + + index++; + if (reader[index].SQLiteType != SQLiteType.Null) + { + info.CameraUploadPath = reader.GetString(index); + } + + index++; + if (reader[index].SQLiteType != SQLiteType.Null) + { + info.LastUserName = reader.GetString(index); + } + + index++; + if (reader[index].SQLiteType != SQLiteType.Null) + { + info.AppName = reader.GetString(index); + } + + index++; + if (reader[index].SQLiteType != SQLiteType.Null) + { + info.AppVersion = reader.GetString(index); + } + + index++; + if (reader[index].SQLiteType != SQLiteType.Null) + { + info.LastUserId = reader.GetString(index); + } + + index++; + if (reader[index].SQLiteType != SQLiteType.Null) + { + info.DateLastModified = reader[index].ReadDateTime(); + } + + index++; + if (reader[index].SQLiteType != SQLiteType.Null) + { + info.Capabilities = _json.DeserializeFromString<ClientCapabilities>(reader.GetString(index)); + } + + return info; + } + + private string GetDevicesPath() + { + return Path.Combine(_appPaths.DataPath, "devices"); + } + + private string GetDevicePath(string id) + { + return Path.Combine(GetDevicesPath(), id.GetMD5().ToString("N")); + } + + public ContentUploadHistory GetCameraUploadHistory(string deviceId) + { + var path = Path.Combine(GetDevicePath(deviceId), "camerauploads.json"); + + lock (_syncLock) + { + try + { + return _json.DeserializeFromFile<ContentUploadHistory>(path); + } + catch (IOException) + { + return new ContentUploadHistory + { + DeviceId = deviceId + }; + } + } + } + + public void AddCameraUpload(string deviceId, LocalFileInfo file) + { + var path = Path.Combine(GetDevicePath(deviceId), "camerauploads.json"); + FileSystem.CreateDirectory(FileSystem.GetDirectoryName(path)); + + lock (_syncLock) + { + ContentUploadHistory history; + + try + { + history = _json.DeserializeFromFile<ContentUploadHistory>(path); + } + catch (IOException) + { + history = new ContentUploadHistory + { + DeviceId = deviceId + }; + } + + history.DeviceId = deviceId; + + var list = history.FilesUploaded.ToList(); + list.Add(file); + history.FilesUploaded = list.ToArray(list.Count); + + _json.SerializeToFile(history, path); + } + } + + public void DeleteDevice(string id) + { + using (WriteLock.Write()) + { + using (var connection = CreateConnection()) + { + connection.RunInTransaction(db => + { + using (var statement = db.PrepareStatement("delete from devices where Id=@Id")) + { + statement.TryBind("@Id", id); + + statement.MoveNext(); + } + }, TransactionMode); + } + } + + var path = GetDevicePath(id); + + lock (_syncLock) + { + try + { + FileSystem.DeleteDirectory(path, true); + } + catch (IOException) + { + } + } + } + } +} diff --git a/Emby.Server.Implementations/Dto/DtoService.cs b/Emby.Server.Implementations/Dto/DtoService.cs index 9f08c6462..0a316fcf1 100644 --- a/Emby.Server.Implementations/Dto/DtoService.cs +++ b/Emby.Server.Implementations/Dto/DtoService.cs @@ -116,9 +116,11 @@ namespace Emby.Server.Implementations.Dto var channelTuples = new List<Tuple<BaseItemDto, LiveTvChannel>>(); var index = 0; + var allCollectionFolders = _libraryManager.GetUserRootFolder().Children.OfType<Folder>().ToList(); + foreach (var item in items) { - var dto = GetBaseItemDtoInternal(item, options, user, owner); + var dto = GetBaseItemDtoInternal(item, options, allCollectionFolders, user, owner); var tvChannel = item as LiveTvChannel; if (tvChannel != null) @@ -173,7 +175,8 @@ namespace Emby.Server.Implementations.Dto { var syncDictionary = GetSyncedItemProgress(options); - var dto = GetBaseItemDtoInternal(item, options, user, owner); + var allCollectionFolders = _libraryManager.GetUserRootFolder().Children.OfType<Folder>().ToList(); + var dto = GetBaseItemDtoInternal(item, options, allCollectionFolders, user, owner); var tvChannel = item as LiveTvChannel; if (tvChannel != null) { @@ -303,7 +306,7 @@ namespace Emby.Server.Implementations.Dto } } - private BaseItemDto GetBaseItemDtoInternal(BaseItem item, DtoOptions options, User user = null, BaseItem owner = null) + private BaseItemDto GetBaseItemDtoInternal(BaseItem item, DtoOptions options, List<Folder> allCollectionFolders, User user = null, BaseItem owner = null) { var fields = options.Fields; @@ -472,7 +475,8 @@ namespace Emby.Server.Implementations.Dto public BaseItemDto GetItemByNameDto(BaseItem item, DtoOptions options, List<BaseItem> taggedItems, Dictionary<string, SyncedItemProgress> syncProgress, User user = null) { - var dto = GetBaseItemDtoInternal(item, options, user); + var allCollectionFolders = _libraryManager.GetUserRootFolder().Children.OfType<Folder>().ToList(); + var dto = GetBaseItemDtoInternal(item, options, allCollectionFolders, user); if (taggedItems != null && options.Fields.Contains(ItemFields.ItemCounts)) { @@ -1604,12 +1608,12 @@ namespace Emby.Server.Implementations.Dto /// <param name="dto">The dto.</param> /// <param name="item">The item.</param> /// <returns>Task.</returns> - public void AttachPrimaryImageAspectRatio(IItemDto dto, IHasMetadata item) + public void AttachPrimaryImageAspectRatio(IItemDto dto, BaseItem item) { dto.PrimaryImageAspectRatio = GetPrimaryImageAspectRatio(item); } - public double? GetPrimaryImageAspectRatio(IHasMetadata item) + public double? GetPrimaryImageAspectRatio(BaseItem item) { var imageInfo = item.GetImageInfo(ImageType.Primary, 0); @@ -1642,16 +1646,18 @@ namespace Emby.Server.Implementations.Dto return null; } - return null; - _logger.Info("Getting image size for item type {0}", item.GetType().Name); - try { - size = _imageProcessor.GetImageSize(imageInfo); + size = _imageProcessor.GetImageSize(item, imageInfo); + + if (size.Width <= 0 || size.Height <= 0) + { + return null; + } } - catch + catch (Exception ex) { - //_logger.ErrorException("Failed to determine primary image aspect ratio for {0}", ex, path); + //_logger.ErrorException("Failed to determine primary image aspect ratio for {0}", ex, imageInfo.Path); return null; } } diff --git a/Emby.Server.Implementations/Emby.Server.Implementations.csproj b/Emby.Server.Implementations/Emby.Server.Implementations.csproj index 518fa0d38..1ecbabf2f 100644 --- a/Emby.Server.Implementations/Emby.Server.Implementations.csproj +++ b/Emby.Server.Implementations/Emby.Server.Implementations.csproj @@ -67,7 +67,7 @@ <Compile Include="Devices\CameraUploadsFolder.cs" /> <Compile Include="Devices\DeviceId.cs" /> <Compile Include="Devices\DeviceManager.cs" /> - <Compile Include="Devices\DeviceRepository.cs" /> + <Compile Include="Devices\SqliteDeviceRepository.cs" /> <Compile Include="Diagnostics\CommonProcess.cs" /> <Compile Include="Diagnostics\ProcessFactory.cs" /> <Compile Include="Dto\DtoService.cs" /> @@ -435,7 +435,6 @@ <Compile Include="Data\BaseSqliteRepository.cs" /> <Compile Include="Data\CleanDatabaseScheduledTask.cs" /> <Compile Include="Data\SqliteExtensions.cs" /> - <Compile Include="Photos\PhotoAlbumImageProvider.cs" /> <Compile Include="Playlists\ManualPlaylistsFolder.cs" /> <Compile Include="Playlists\PlaylistImageProvider.cs" /> <Compile Include="Playlists\PlaylistManager.cs" /> @@ -573,6 +572,7 @@ <Compile Include="Updates\InstallationManager.cs" /> <Compile Include="UserViews\CollectionFolderImageProvider.cs" /> <Compile Include="UserViews\DynamicImageProvider.cs" /> + <Compile Include="UserViews\FolderImageProvider.cs" /> <Compile Include="Xml\XmlReaderSettingsFactory.cs" /> </ItemGroup> <ItemGroup> @@ -675,46 +675,40 @@ <Reference Include="System.Xml" /> </ItemGroup> <ItemGroup> + <EmbeddedResource Include="Localization\countries.json" /> <EmbeddedResource Include="Localization\Core\ar.json" /> <EmbeddedResource Include="Localization\Core\bg-BG.json" /> <EmbeddedResource Include="Localization\Core\ca.json" /> <EmbeddedResource Include="Localization\Core\cs.json" /> <EmbeddedResource Include="Localization\Core\da.json" /> <EmbeddedResource Include="Localization\Core\de.json" /> - <EmbeddedResource Include="Localization\Core\el.json" /> <EmbeddedResource Include="Localization\Core\en-GB.json" /> - <EmbeddedResource Include="Localization\Core\en-US.json" /> <EmbeddedResource Include="Localization\Core\es-AR.json" /> <EmbeddedResource Include="Localization\Core\es-MX.json" /> <EmbeddedResource Include="Localization\Core\es.json" /> - <EmbeddedResource Include="Localization\Core\fi.json" /> <EmbeddedResource Include="Localization\Core\fr-CA.json" /> <EmbeddedResource Include="Localization\Core\fr.json" /> - <EmbeddedResource Include="Localization\Core\gsw.json" /> <EmbeddedResource Include="Localization\Core\he.json" /> <EmbeddedResource Include="Localization\Core\hr.json" /> <EmbeddedResource Include="Localization\Core\hu.json" /> - <EmbeddedResource Include="Localization\Core\id.json" /> <EmbeddedResource Include="Localization\Core\it.json" /> <EmbeddedResource Include="Localization\Core\kk.json" /> <EmbeddedResource Include="Localization\Core\ko.json" /> + <EmbeddedResource Include="Localization\Core\lt-LT.json" /> <EmbeddedResource Include="Localization\Core\ms.json" /> <EmbeddedResource Include="Localization\Core\nb.json" /> <EmbeddedResource Include="Localization\Core\nl.json" /> <EmbeddedResource Include="Localization\Core\pl.json" /> <EmbeddedResource Include="Localization\Core\pt-BR.json" /> <EmbeddedResource Include="Localization\Core\pt-PT.json" /> - <EmbeddedResource Include="Localization\Core\ro.json" /> <EmbeddedResource Include="Localization\Core\ru.json" /> + <EmbeddedResource Include="Localization\Core\sk.json" /> <EmbeddedResource Include="Localization\Core\sl-SI.json" /> <EmbeddedResource Include="Localization\Core\sv.json" /> <EmbeddedResource Include="Localization\Core\tr.json" /> - <EmbeddedResource Include="Localization\Core\uk.json" /> - <EmbeddedResource Include="Localization\Core\vi.json" /> <EmbeddedResource Include="Localization\Core\zh-CN.json" /> <EmbeddedResource Include="Localization\Core\zh-HK.json" /> - <EmbeddedResource Include="Localization\Core\zh-TW.json" /> - <EmbeddedResource Include="Localization\countries.json" /> + <EmbeddedResource Include="Localization\Core\en-US.json" /> <None Include="packages.config" /> <None Include="TextEncoding\NLangDetect\Profiles\afr" /> <None Include="TextEncoding\NLangDetect\Profiles\ara" /> diff --git a/Emby.Server.Implementations/FFMpeg/FFMpegLoader.cs b/Emby.Server.Implementations/FFMpeg/FFMpegLoader.cs index e266ea21b..9f4cd05fa 100644 --- a/Emby.Server.Implementations/FFMpeg/FFMpegLoader.cs +++ b/Emby.Server.Implementations/FFMpeg/FFMpegLoader.cs @@ -49,18 +49,20 @@ namespace Emby.Server.Implementations.FFMpeg var downloadInfo = _ffmpegInstallInfo; - var version = downloadInfo.Version; - - if (string.Equals(version, "path", StringComparison.OrdinalIgnoreCase)) + var prebuiltffmpeg = Path.Combine(_appPaths.ProgramSystemPath, downloadInfo.FFMpegFilename); + var prebuiltffprobe = Path.Combine(_appPaths.ProgramSystemPath, downloadInfo.FFProbeFilename); + if (_fileSystem.FileExists(prebuiltffmpeg) && _fileSystem.FileExists(prebuiltffprobe)) { return new FFMpegInfo { - ProbePath = downloadInfo.FFProbeFilename, - EncoderPath = downloadInfo.FFMpegFilename, - Version = version + ProbePath = prebuiltffprobe, + EncoderPath = prebuiltffmpeg, + Version = "external" }; } + var version = downloadInfo.Version; + if (string.Equals(version, "0", StringComparison.OrdinalIgnoreCase)) { return new FFMpegInfo(); diff --git a/Emby.Server.Implementations/HttpClientManager/HttpClientInfo.cs b/Emby.Server.Implementations/HttpClientManager/HttpClientInfo.cs index 6d17bf94d..21cec9d2b 100644 --- a/Emby.Server.Implementations/HttpClientManager/HttpClientInfo.cs +++ b/Emby.Server.Implementations/HttpClientManager/HttpClientInfo.cs @@ -1,4 +1,5 @@ using System; +using System.Net.Http; namespace Emby.Server.Implementations.HttpClientManager { @@ -12,5 +13,6 @@ namespace Emby.Server.Implementations.HttpClientManager /// </summary> /// <value>The last timeout.</value> public DateTime LastTimeout { get; set; } + public HttpClient HttpClient { get; set; } } } diff --git a/Emby.Server.Implementations/HttpClientManager/HttpClientManager.cs b/Emby.Server.Implementations/HttpClientManager/HttpClientManager.cs index fe545ecff..ef95b47c3 100644 --- a/Emby.Server.Implementations/HttpClientManager/HttpClientManager.cs +++ b/Emby.Server.Implementations/HttpClientManager/HttpClientManager.cs @@ -279,40 +279,10 @@ namespace Emby.Server.Implementations.HttpClientManager public async Task<Stream> Get(HttpRequestOptions options) { var response = await GetResponse(options).ConfigureAwait(false); - return response.Content; } /// <summary> - /// Performs a GET request and returns the resulting stream - /// </summary> - /// <param name="url">The URL.</param> - /// <param name="resourcePool">The resource pool.</param> - /// <param name="cancellationToken">The cancellation token.</param> - /// <returns>Task{Stream}.</returns> - public Task<Stream> Get(string url, SemaphoreSlim resourcePool, CancellationToken cancellationToken) - { - return Get(new HttpRequestOptions - { - Url = url, - ResourcePool = resourcePool, - CancellationToken = cancellationToken, - BufferContent = resourcePool != null - }); - } - - /// <summary> - /// Gets the specified URL. - /// </summary> - /// <param name="url">The URL.</param> - /// <param name="cancellationToken">The cancellation token.</param> - /// <returns>Task{Stream}.</returns> - public Task<Stream> Get(string url, CancellationToken cancellationToken) - { - return Get(url, null, cancellationToken); - } - - /// <summary> /// send as an asynchronous operation. /// </summary> /// <param name="options">The options.</param> @@ -350,8 +320,6 @@ namespace Emby.Server.Implementations.HttpClientManager private async Task<HttpResponseInfo> GetCachedResponse(string responseCachePath, TimeSpan cacheLength, string url) { - _logger.Info("Checking for cache file {0}", responseCachePath); - try { if (_fileSystem.GetLastWriteTimeUtc(responseCachePath).Add(cacheLength) > DateTime.UtcNow) @@ -429,10 +397,19 @@ namespace Emby.Server.Implementations.HttpClientManager { try { - var bytes = options.RequestContentBytes ?? - Encoding.UTF8.GetBytes(options.RequestContent ?? string.Empty); + // TODO: We can always put this in the options object if needed + var requestEncoding = Encoding.UTF8; + + var bytes = options.RequestContentBytes ?? requestEncoding.GetBytes(options.RequestContent ?? string.Empty); - httpWebRequest.ContentType = options.RequestContentType ?? "application/x-www-form-urlencoded"; + var contentType = options.RequestContentType ?? "application/x-www-form-urlencoded"; + + if (options.AppendCharsetToMimeType) + { + contentType = contentType.TrimEnd(';') + "; charset=\"utf-8\""; + } + + httpWebRequest.ContentType = contentType; httpWebRequest.ContentLength = bytes.Length; (await httpWebRequest.GetRequestStreamAsync().ConfigureAwait(false)).Write(bytes, 0, bytes.Length); @@ -460,7 +437,14 @@ namespace Emby.Server.Implementations.HttpClientManager if (options.LogRequest) { - _logger.Info("HttpClientManager {0}: {1}", httpMethod.ToUpper(), options.Url); + if (options.LogRequestAsDebug) + { + _logger.Debug("HttpClientManager {0}: {1}", httpMethod.ToUpper(), options.Url); + } + else + { + _logger.Info("HttpClientManager {0}: {1}", httpMethod.ToUpper(), options.Url); + } } try @@ -590,26 +574,6 @@ namespace Emby.Server.Implementations.HttpClientManager } /// <summary> - /// Performs a POST request - /// </summary> - /// <param name="url">The URL.</param> - /// <param name="postData">Params to add to the POST data.</param> - /// <param name="resourcePool">The resource pool.</param> - /// <param name="cancellationToken">The cancellation token.</param> - /// <returns>stream on success, null on failure</returns> - public Task<Stream> Post(string url, Dictionary<string, string> postData, SemaphoreSlim resourcePool, CancellationToken cancellationToken) - { - return Post(new HttpRequestOptions - { - Url = url, - ResourcePool = resourcePool, - CancellationToken = cancellationToken, - BufferContent = resourcePool != null - - }, postData); - } - - /// <summary> /// Downloads the contents of a given url into a temporary location /// </summary> /// <param name="options">The options.</param> @@ -647,7 +611,14 @@ namespace Emby.Server.Implementations.HttpClientManager if (options.LogRequest) { - _logger.Info("HttpClientManager.GetTempFileResponse url: {0}", options.Url); + if (options.LogRequestAsDebug) + { + _logger.Debug("HttpClientManager.GetTempFileResponse url: {0}", options.Url); + } + else + { + _logger.Info("HttpClientManager.GetTempFileResponse url: {0}", options.Url); + } } var client = GetHttpClient(GetHostFromUrl(options.Url), options.EnableHttpCompression); @@ -891,18 +862,6 @@ namespace Emby.Server.Implementations.HttpClientManager } } - /// <summary> - /// Posts the specified URL. - /// </summary> - /// <param name="url">The URL.</param> - /// <param name="postData">The post data.</param> - /// <param name="cancellationToken">The cancellation token.</param> - /// <returns>Task{Stream}.</returns> - public Task<Stream> Post(string url, Dictionary<string, string> postData, CancellationToken cancellationToken) - { - return Post(url, postData, null, cancellationToken); - } - private Task<WebResponse> GetResponseAsync(WebRequest request, TimeSpan timeout) { var taskCompletion = new TaskCompletionSource<WebResponse>(); diff --git a/Emby.Server.Implementations/HttpServer/HttpListenerHost.cs b/Emby.Server.Implementations/HttpServer/HttpListenerHost.cs index 737d4ceea..937eb8029 100644 --- a/Emby.Server.Implementations/HttpServer/HttpListenerHost.cs +++ b/Emby.Server.Implementations/HttpServer/HttpListenerHost.cs @@ -411,8 +411,6 @@ namespace Emby.Server.Implementations.HttpServer host = host ?? string.Empty; - _logger.Debug("Validating host {0}", host); - if (_networkManager.IsInPrivateAddressSpace(host)) { hosts.Add("localhost"); @@ -725,12 +723,13 @@ namespace Emby.Server.Implementations.HttpServer Summary = route.Summary }); - //routes.Add(new RouteAttribute(DoubleNormalizeEmbyRoutePath(route.Path), route.Verbs) - //{ - // Notes = route.Notes, - // Priority = route.Priority, - // Summary = route.Summary - //}); + // needed because apps add /emby, and some users also add /emby, thereby double prefixing + routes.Add(new RouteAttribute(DoubleNormalizeEmbyRoutePath(route.Path), route.Verbs) + { + Notes = route.Notes, + Priority = route.Priority, + Summary = route.Summary + }); } return routes.ToArray(routes.Count); diff --git a/Emby.Server.Implementations/HttpServer/Security/AuthorizationContext.cs b/Emby.Server.Implementations/HttpServer/Security/AuthorizationContext.cs index c9d5ed007..a41c51d1a 100644 --- a/Emby.Server.Implementations/HttpServer/Security/AuthorizationContext.cs +++ b/Emby.Server.Implementations/HttpServer/Security/AuthorizationContext.cs @@ -5,6 +5,7 @@ using System; using System.Collections.Generic; using MediaBrowser.Model.Services; using System.Linq; +using System.Threading; namespace Emby.Server.Implementations.HttpServer.Security { @@ -95,23 +96,44 @@ namespace Emby.Server.Implementations.HttpServer.Security { info.UserId = tokenInfo.UserId; + var updateToken = false; + // TODO: Remove these checks for IsNullOrWhiteSpace if (string.IsNullOrWhiteSpace(info.Client)) { info.Client = tokenInfo.AppName; } + + if (string.IsNullOrWhiteSpace(info.DeviceId)) + { + info.DeviceId = tokenInfo.DeviceId; + } + + if (string.IsNullOrWhiteSpace(info.Device)) { info.Device = tokenInfo.DeviceName; } - if (string.IsNullOrWhiteSpace(info.DeviceId)) + else if (!string.Equals(info.Device, tokenInfo.DeviceName, StringComparison.OrdinalIgnoreCase)) { - info.DeviceId = tokenInfo.DeviceId; + updateToken = true; + tokenInfo.DeviceName = info.Device; } + if (string.IsNullOrWhiteSpace(info.Version)) { info.Version = tokenInfo.AppVersion; } + else if (!string.Equals(info.Version, tokenInfo.AppVersion, StringComparison.OrdinalIgnoreCase)) + { + updateToken = true; + tokenInfo.AppVersion = info.Version; + } + + if (updateToken) + { + _authRepo.Update(tokenInfo, CancellationToken.None); + } } else { diff --git a/Emby.Server.Implementations/HttpServer/Security/SessionContext.cs b/Emby.Server.Implementations/HttpServer/Security/SessionContext.cs index dd5d64bf6..9826a0d56 100644 --- a/Emby.Server.Implementations/HttpServer/Security/SessionContext.cs +++ b/Emby.Server.Implementations/HttpServer/Security/SessionContext.cs @@ -25,15 +25,6 @@ namespace Emby.Server.Implementations.HttpServer.Security { var authorization = _authContext.GetAuthorizationInfo(requestContext); - //if (!string.IsNullOrWhiteSpace(authorization.Token)) - //{ - // var auth = GetTokenInfo(requestContext); - // if (auth != null) - // { - // return _sessionManager.GetSessionByAuthenticationToken(auth, authorization.DeviceId, requestContext.RemoteIp, authorization.Version); - // } - //} - var user = string.IsNullOrWhiteSpace(authorization.UserId) ? null : _userManager.GetUserById(authorization.UserId); return _sessionManager.LogSessionActivity(authorization.Client, authorization.Version, authorization.DeviceId, authorization.Device, requestContext.RemoteIp, user); } diff --git a/Emby.Server.Implementations/IO/FileRefresher.cs b/Emby.Server.Implementations/IO/FileRefresher.cs index 315bee103..85b8bddd2 100644 --- a/Emby.Server.Implementations/IO/FileRefresher.cs +++ b/Emby.Server.Implementations/IO/FileRefresher.cs @@ -154,20 +154,13 @@ namespace Emby.Server.Implementations.IO .DistinctBy(i => i.Id) .ToList(); - //foreach (var p in paths) - //{ - // Logger.Info(p + " reports change."); - //} - - // If the root folder changed, run the library task so the user can see it - if (itemsToRefresh.Any(i => i is AggregateFolder)) - { - LibraryManager.ValidateMediaLibrary(new SimpleProgress<double>(), CancellationToken.None); - return; - } - foreach (var item in itemsToRefresh) { + if (item is AggregateFolder) + { + continue; + } + Logger.Info(item.Name + " (" + item.Path + ") will be refreshed."); try diff --git a/Emby.Server.Implementations/IO/ManagedFileSystem.cs b/Emby.Server.Implementations/IO/ManagedFileSystem.cs index 0d85a977c..125d9e980 100644 --- a/Emby.Server.Implementations/IO/ManagedFileSystem.cs +++ b/Emby.Server.Implementations/IO/ManagedFileSystem.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Diagnostics; using System.IO; using System.Linq; using System.Text; @@ -24,12 +25,14 @@ namespace Emby.Server.Implementations.IO private string _tempPath; private SharpCifsFileSystem _sharpCifsFileSystem; + private IEnvironmentInfo _environmentInfo; public ManagedFileSystem(ILogger logger, IEnvironmentInfo environmentInfo, string tempPath) { Logger = logger; _supportsAsyncFileStreams = true; _tempPath = tempPath; + _environmentInfo = environmentInfo; // On Linux, this needs to be true or symbolic links are ignored EnableFileSystemRequestConcat = environmentInfo.OperatingSystem != MediaBrowser.Model.System.OperatingSystem.Windows && @@ -1051,7 +1054,25 @@ namespace Emby.Server.Implementations.IO public virtual void SetExecutable(string path) { + if (_environmentInfo.OperatingSystem == MediaBrowser.Model.System.OperatingSystem.OSX) + { + RunProcess("chmod", "+x \"" + path + "\"", GetDirectoryName(path)); + } + } + private void RunProcess(string path, string args, string workingDirectory) + { + using (var process = Process.Start(new ProcessStartInfo + { + Arguments = args, + FileName = path, + CreateNoWindow = true, + WorkingDirectory = workingDirectory, + WindowStyle = ProcessWindowStyle.Normal + })) + { + process.WaitForExit(); + } } } } diff --git a/Emby.Server.Implementations/Images/BaseDynamicImageProvider.cs b/Emby.Server.Implementations/Images/BaseDynamicImageProvider.cs index 3f9ea79c6..5cd7e4262 100644 --- a/Emby.Server.Implementations/Images/BaseDynamicImageProvider.cs +++ b/Emby.Server.Implementations/Images/BaseDynamicImageProvider.cs @@ -42,23 +42,14 @@ namespace Emby.Server.Implementations.Images return true; } - public virtual IEnumerable<ImageType> GetSupportedImages(IHasMetadata item) + public virtual ImageType[] GetSupportedImages(IHasMetadata item) { - return new List<ImageType> + return new ImageType[] { - ImageType.Primary, - ImageType.Thumb + ImageType.Primary }; } - private IEnumerable<ImageType> GetEnabledImages(IHasMetadata item) - { - //var options = ProviderManager.GetMetadataOptions(item); - - return GetSupportedImages(item); - //return GetSupportedImages(item).Where(i => IsEnabled(options, i, item)).ToList(); - } - public async Task<ItemUpdateType> FetchAsync(T item, MetadataRefreshOptions options, CancellationToken cancellationToken) { if (!Supports(item)) @@ -67,7 +58,7 @@ namespace Emby.Server.Implementations.Images } var updateType = ItemUpdateType.None; - var supportedImages = GetEnabledImages(item).ToList(); + var supportedImages = GetSupportedImages(item); if (supportedImages.Contains(ImageType.Primary)) { @@ -253,7 +244,7 @@ namespace Emby.Server.Implementations.Images return false; } - var supportedImages = GetEnabledImages(item).ToList(); + var supportedImages = GetSupportedImages(item); if (supportedImages.Contains(ImageType.Primary) && HasChanged(item, ImageType.Primary)) { @@ -283,8 +274,7 @@ namespace Emby.Server.Implementations.Images return false; } - var age = DateTime.UtcNow - image.DateModified; - if (age.TotalDays <= MaxImageAgeDays) + if (!HasChangedByDate(item, image)) { return false; } @@ -293,6 +283,16 @@ namespace Emby.Server.Implementations.Images return true; } + protected virtual bool HasChangedByDate(IHasMetadata item, ItemImageInfo image) + { + var age = DateTime.UtcNow - image.DateModified; + if (age.TotalDays <= MaxImageAgeDays) + { + return false; + } + return true; + } + protected List<BaseItem> GetFinalItems(IEnumerable<BaseItem> items) { return GetFinalItems(items, 4); diff --git a/Emby.Server.Implementations/Library/LibraryManager.cs b/Emby.Server.Implementations/Library/LibraryManager.cs index 85b91ac25..cac1cb3b4 100644 --- a/Emby.Server.Implementations/Library/LibraryManager.cs +++ b/Emby.Server.Implementations/Library/LibraryManager.cs @@ -738,8 +738,7 @@ namespace Emby.Server.Implementations.Library if (folder.ParentId != rootFolder.Id) { folder.ParentId = rootFolder.Id; - var task = folder.UpdateToRepository(ItemUpdateType.MetadataImport, CancellationToken.None); - Task.WaitAll(task); + folder.UpdateToRepository(ItemUpdateType.MetadataImport, CancellationToken.None); } rootFolder.AddVirtualChild(folder); @@ -1827,6 +1826,13 @@ namespace Emby.Server.Implementations.Library } } + public void UpdateImages(BaseItem item) + { + ItemRepository.SaveImages(item); + + RegisterItem(item); + } + /// <summary> /// Updates the item. /// </summary> @@ -1834,12 +1840,12 @@ namespace Emby.Server.Implementations.Library /// <param name="updateReason">The update reason.</param> /// <param name="cancellationToken">The cancellation token.</param> /// <returns>Task.</returns> - public async Task UpdateItem(BaseItem item, ItemUpdateType updateReason, CancellationToken cancellationToken) + public void UpdateItem(BaseItem item, ItemUpdateType updateReason, CancellationToken cancellationToken) { var locationType = item.LocationType; if (locationType != LocationType.Remote && locationType != LocationType.Virtual) { - await _providerManagerFactory().SaveMetadata(item, updateReason).ConfigureAwait(false); + _providerManagerFactory().SaveMetadata(item, updateReason); } item.DateLastSaved = DateTime.UtcNow; @@ -2053,7 +2059,7 @@ namespace Emby.Server.Implementations.Library return GetNamedView(user, name, null, viewType, sortName, cancellationToken); } - public async Task<UserView> GetNamedView(string name, + public UserView GetNamedView(string name, string viewType, string sortName, CancellationToken cancellationToken) @@ -2100,7 +2106,7 @@ namespace Emby.Server.Implementations.Library if (refresh) { - await item.UpdateToRepository(ItemUpdateType.MetadataImport, CancellationToken.None).ConfigureAwait(false); + item.UpdateToRepository(ItemUpdateType.MetadataImport, CancellationToken.None); _providerManagerFactory().QueueRefresh(item.Id, new MetadataRefreshOptions(_fileSystem) { // Not sure why this is necessary but need to figure it out @@ -2241,7 +2247,7 @@ namespace Emby.Server.Implementations.Library return item; } - public async Task<UserView> GetNamedView(string name, + public UserView GetNamedView(string name, string parentId, string viewType, string sortName, @@ -2294,7 +2300,7 @@ namespace Emby.Server.Implementations.Library if (!string.Equals(viewType, item.ViewType, StringComparison.OrdinalIgnoreCase)) { item.ViewType = viewType; - await item.UpdateToRepository(ItemUpdateType.MetadataEdit, cancellationToken).ConfigureAwait(false); + item.UpdateToRepository(ItemUpdateType.MetadataEdit, cancellationToken); } var refresh = isNew || DateTime.UtcNow - item.DateLastRefreshed >= _viewRefreshInterval; @@ -2822,7 +2828,7 @@ namespace Emby.Server.Implementations.Library await _providerManagerFactory().SaveImage(item, url, image.Type, imageIndex, CancellationToken.None).ConfigureAwait(false); - await item.UpdateToRepository(ItemUpdateType.ImageUpdate, CancellationToken.None).ConfigureAwait(false); + item.UpdateToRepository(ItemUpdateType.ImageUpdate, CancellationToken.None); return item.GetImageInfo(image.Type, imageIndex); } @@ -2838,7 +2844,7 @@ namespace Emby.Server.Implementations.Library // Remove this image to prevent it from retrying over and over item.RemoveImage(image); - await item.UpdateToRepository(ItemUpdateType.ImageUpdate, CancellationToken.None).ConfigureAwait(false); + item.UpdateToRepository(ItemUpdateType.ImageUpdate, CancellationToken.None); throw new InvalidOperationException(); } diff --git a/Emby.Server.Implementations/Library/LocalTrailerPostScanTask.cs b/Emby.Server.Implementations/Library/LocalTrailerPostScanTask.cs index 757e67eb4..4830da8fc 100644 --- a/Emby.Server.Implementations/Library/LocalTrailerPostScanTask.cs +++ b/Emby.Server.Implementations/Library/LocalTrailerPostScanTask.cs @@ -54,7 +54,7 @@ namespace Emby.Server.Implementations.Library { cancellationToken.ThrowIfCancellationRequested(); - await AssignTrailers(item, trailers).ConfigureAwait(false); + AssignTrailers(item, trailers); numComplete++; double percent = numComplete; @@ -65,7 +65,7 @@ namespace Emby.Server.Implementations.Library progress.Report(100); } - private async Task AssignTrailers(IHasTrailers item, IEnumerable<BaseItem> channelTrailers) + private void AssignTrailers(IHasTrailers item, IEnumerable<BaseItem> channelTrailers) { if (item is Game) { @@ -98,8 +98,7 @@ namespace Emby.Server.Implementations.Library item.RemoteTrailerIds = trailerIds; var baseItem = (BaseItem)item; - await baseItem.UpdateToRepository(ItemUpdateType.MetadataImport, CancellationToken.None) - .ConfigureAwait(false); + baseItem.UpdateToRepository(ItemUpdateType.MetadataImport, CancellationToken.None); } } } diff --git a/Emby.Server.Implementations/Library/MediaSourceManager.cs b/Emby.Server.Implementations/Library/MediaSourceManager.cs index d60a04353..688da5764 100644 --- a/Emby.Server.Implementations/Library/MediaSourceManager.cs +++ b/Emby.Server.Implementations/Library/MediaSourceManager.cs @@ -96,23 +96,17 @@ namespace Emby.Server.Implementations.Library return GetMediaStreamsForItem(list); } - private List<MediaStream> GetMediaStreamsForItem(IEnumerable<MediaStream> streams) + private List<MediaStream> GetMediaStreamsForItem(List<MediaStream> streams) { - var list = streams.ToList(); - - var subtitleStreams = list - .Where(i => i.Type == MediaStreamType.Subtitle) - .ToList(); - - if (subtitleStreams.Count > 0) + foreach (var stream in streams) { - foreach (var subStream in subtitleStreams) + if (stream.Type == MediaStreamType.Subtitle) { - subStream.SupportsExternalStream = StreamSupportsExternalStream(subStream); + stream.SupportsExternalStream = StreamSupportsExternalStream(stream); } } - return list; + return streams; } public async Task<IEnumerable<MediaSourceInfo>> GetPlayackMediaSources(string id, string userId, bool enablePathSubstitution, string[] supportedLiveMediaTypes, CancellationToken cancellationToken) diff --git a/Emby.Server.Implementations/Library/Resolvers/Books/BookResolver.cs b/Emby.Server.Implementations/Library/Resolvers/Books/BookResolver.cs index 4852c3c6a..7aa4c299f 100644 --- a/Emby.Server.Implementations/Library/Resolvers/Books/BookResolver.cs +++ b/Emby.Server.Implementations/Library/Resolvers/Books/BookResolver.cs @@ -12,7 +12,7 @@ namespace Emby.Server.Implementations.Library.Resolvers.Books /// </summary> public class BookResolver : MediaBrowser.Controller.Resolvers.ItemResolver<Book> { - private readonly string[] _validExtensions = {".pdf", ".epub", ".mobi", ".cbr", ".cbz"}; + private readonly string[] _validExtensions = { ".pdf", ".epub", ".mobi", ".cbr", ".cbz", ".azw3" }; /// <summary> /// @@ -26,7 +26,7 @@ namespace Emby.Server.Implementations.Library.Resolvers.Books // Only process items that are in a collection folder containing books if (!string.Equals(collectionType, CollectionType.Books, StringComparison.OrdinalIgnoreCase)) return null; - + if (args.IsDirectory) { return GetBook(args); @@ -69,9 +69,9 @@ namespace Emby.Server.Implementations.Library.Resolvers.Books return null; return new Book - { - Path = bookFiles[0].FullName - }; + { + Path = bookFiles[0].FullName + }; } } } diff --git a/Emby.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs b/Emby.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs index cd1264754..94cafa3e2 100644 --- a/Emby.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs +++ b/Emby.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs @@ -11,7 +11,7 @@ using System; using System.Collections.Generic; using System.IO; using System.Linq; - +using MediaBrowser.Controller.Drawing; using MediaBrowser.Controller.IO; using MediaBrowser.Model.IO; using MediaBrowser.Model.Logging; @@ -69,13 +69,13 @@ namespace Emby.Server.Implementations.Library.Resolvers.Movies if (string.Equals(collectionType, CollectionType.MusicVideos, StringComparison.OrdinalIgnoreCase)) { - return ResolveVideos<MusicVideo>(parent, files, directoryService, true, collectionType); + return ResolveVideos<MusicVideo>(parent, files, directoryService, true, collectionType, false); } if (string.Equals(collectionType, CollectionType.HomeVideos, StringComparison.OrdinalIgnoreCase) || string.Equals(collectionType, CollectionType.Photos, StringComparison.OrdinalIgnoreCase)) { - return ResolveVideos<Video>(parent, files, directoryService, false, collectionType); + return ResolveVideos<Video>(parent, files, directoryService, false, collectionType, false); } if (string.IsNullOrWhiteSpace(collectionType)) @@ -83,7 +83,7 @@ namespace Emby.Server.Implementations.Library.Resolvers.Movies // Owned items should just use the plain video type if (parent == null) { - return ResolveVideos<Video>(parent, files, directoryService, false, collectionType); + return ResolveVideos<Video>(parent, files, directoryService, false, collectionType, false); } if (parent is Series || parent.GetParents().OfType<Series>().Any()) @@ -91,18 +91,18 @@ namespace Emby.Server.Implementations.Library.Resolvers.Movies return null; } - return ResolveVideos<Movie>(parent, files, directoryService, false, collectionType); + return ResolveVideos<Movie>(parent, files, directoryService, false, collectionType, true); } if (string.Equals(collectionType, CollectionType.Movies, StringComparison.OrdinalIgnoreCase)) { - return ResolveVideos<Movie>(parent, files, directoryService, true, collectionType); + return ResolveVideos<Movie>(parent, files, directoryService, true, collectionType, true); } return null; } - private MultiItemResolverResult ResolveVideos<T>(Folder parent, IEnumerable<FileSystemMetadata> fileSystemEntries, IDirectoryService directoryService, bool suppportMultiEditions, string collectionType) + private MultiItemResolverResult ResolveVideos<T>(Folder parent, IEnumerable<FileSystemMetadata> fileSystemEntries, IDirectoryService directoryService, bool suppportMultiEditions, string collectionType, bool parseName) where T : Video, new() { var files = new List<FileSystemMetadata>(); @@ -147,7 +147,7 @@ namespace Emby.Server.Implementations.Library.Resolvers.Movies Items = videos }; - var isInMixedFolder = resolverResult.Count > 1; + var isInMixedFolder = resolverResult.Count > 1 || (parent != null && parent.IsTopParent); foreach (var video in resolverResult) { @@ -158,7 +158,9 @@ namespace Emby.Server.Implementations.Library.Resolvers.Movies Path = video.Files[0].Path, IsInMixedFolder = isInMixedFolder, ProductionYear = video.Year, - Name = video.Name, + Name = parseName ? + video.Name : + Path.GetFileName(video.Files[0].Path), AdditionalParts = video.Files.Skip(1).Select(i => i.Path).ToArray(), LocalAlternateVersions = video.AlternateVersions.Select(i => i.Path).ToArray() }; @@ -214,12 +216,12 @@ namespace Emby.Server.Implementations.Library.Resolvers.Movies if (string.Equals(collectionType, CollectionType.MusicVideos, StringComparison.OrdinalIgnoreCase)) { - return FindMovie<MusicVideo>(args.Path, args.Parent, files, args.DirectoryService, collectionType, true); + return FindMovie<MusicVideo>(args, args.Path, args.Parent, files, args.DirectoryService, collectionType, false); } if (string.Equals(collectionType, CollectionType.HomeVideos, StringComparison.OrdinalIgnoreCase)) { - return FindMovie<Video>(args.Path, args.Parent, files, args.DirectoryService, collectionType, false); + return FindMovie<Video>(args, args.Path, args.Parent, files, args.DirectoryService, collectionType, false); } if (string.IsNullOrEmpty(collectionType)) @@ -237,13 +239,13 @@ namespace Emby.Server.Implementations.Library.Resolvers.Movies } { - return FindMovie<Movie>(args.Path, args.Parent, files, args.DirectoryService, collectionType, true); + return FindMovie<Movie>(args, args.Path, args.Parent, files, args.DirectoryService, collectionType, true); } } if (string.Equals(collectionType, CollectionType.Movies, StringComparison.OrdinalIgnoreCase)) { - return FindMovie<Movie>(args.Path, args.Parent, files, args.DirectoryService, collectionType, true); + return FindMovie<Movie>(args, args.Path, args.Parent, files, args.DirectoryService, collectionType, true); } return null; @@ -359,11 +361,15 @@ namespace Emby.Server.Implementations.Library.Resolvers.Movies /// </summary> /// <typeparam name="T"></typeparam> /// <returns>Movie.</returns> - private T FindMovie<T>(string path, Folder parent, List<FileSystemMetadata> fileSystemEntries, IDirectoryService directoryService, string collectionType, bool allowFilesAsFolders) + private T FindMovie<T>(ItemResolveArgs args, string path, Folder parent, List<FileSystemMetadata> fileSystemEntries, IDirectoryService directoryService, string collectionType, bool parseName) where T : Video, new() { var multiDiscFolders = new List<FileSystemMetadata>(); + var libraryOptions = args.GetLibraryOptions(); + var supportPhotos = string.Equals(collectionType, CollectionType.HomeVideos, StringComparison.OrdinalIgnoreCase) && libraryOptions.EnablePhotos; + var photos = new List<FileSystemMetadata>(); + // Search for a folder rip foreach (var child in fileSystemEntries) { @@ -404,30 +410,37 @@ namespace Emby.Server.Implementations.Library.Resolvers.Movies Set3DFormat(movie); return movie; } + else if (supportPhotos && !child.IsHidden && PhotoResolver.IsImageFile(child.FullName, _imageProcessor)) + { + photos.Add(child); + } } - if (allowFilesAsFolders) - { - // TODO: Allow GetMultiDiscMovie in here - var supportsMultiVersion = !string.Equals(collectionType, CollectionType.HomeVideos) && - !string.Equals(collectionType, CollectionType.Photos) && - !string.Equals(collectionType, CollectionType.MusicVideos); + // TODO: Allow GetMultiDiscMovie in here + var supportsMultiVersion = !string.Equals(collectionType, CollectionType.HomeVideos) && + !string.Equals(collectionType, CollectionType.Photos) && + !string.Equals(collectionType, CollectionType.MusicVideos); + + var result = ResolveVideos<T>(parent, fileSystemEntries, directoryService, supportsMultiVersion, collectionType, parseName) ?? + new MultiItemResolverResult(); - var result = ResolveVideos<T>(parent, fileSystemEntries, directoryService, supportsMultiVersion, collectionType) ?? - new MultiItemResolverResult(); + if (result.Items.Count == 1) + { + var videoPath = result.Items[0].Path; + var hasPhotos = photos.Any(i => !PhotoResolver.IsOwnedByResolvedMedia(LibraryManager, libraryOptions, videoPath, i.Name)); - if (result.Items.Count == 1) + if (!hasPhotos) { var movie = (T)result.Items[0]; movie.IsInMixedFolder = false; movie.Name = Path.GetFileName(movie.ContainingFolderPath); return movie; } + } - if (result.Items.Count == 0 && multiDiscFolders.Count > 0) - { - return GetMultiDiscMovie<T>(multiDiscFolders, directoryService); - } + if (result.Items.Count == 0 && multiDiscFolders.Count > 0) + { + return GetMultiDiscMovie<T>(multiDiscFolders, directoryService); } return null; @@ -542,8 +555,11 @@ namespace Emby.Server.Implementations.Library.Resolvers.Movies return !validCollectionTypes.Contains(collectionType, StringComparer.OrdinalIgnoreCase); } - public MovieResolver(ILibraryManager libraryManager, IFileSystem fileSystem) : base(libraryManager, fileSystem) + private IImageProcessor _imageProcessor; + + public MovieResolver(ILibraryManager libraryManager, IFileSystem fileSystem, IImageProcessor imageProcessor) : base(libraryManager, fileSystem) { + _imageProcessor = imageProcessor; } } } diff --git a/Emby.Server.Implementations/Library/Resolvers/PhotoAlbumResolver.cs b/Emby.Server.Implementations/Library/Resolvers/PhotoAlbumResolver.cs index 3d7ede879..311abf14e 100644 --- a/Emby.Server.Implementations/Library/Resolvers/PhotoAlbumResolver.cs +++ b/Emby.Server.Implementations/Library/Resolvers/PhotoAlbumResolver.cs @@ -12,9 +12,12 @@ namespace Emby.Server.Implementations.Library.Resolvers public class PhotoAlbumResolver : FolderResolver<PhotoAlbum> { private readonly IImageProcessor _imageProcessor; - public PhotoAlbumResolver(IImageProcessor imageProcessor) + private ILibraryManager _libraryManager; + + public PhotoAlbumResolver(IImageProcessor imageProcessor, ILibraryManager libraryManager) { _imageProcessor = imageProcessor; + _libraryManager = libraryManager; } /// <summary> @@ -25,14 +28,21 @@ namespace Emby.Server.Implementations.Library.Resolvers protected override PhotoAlbum Resolve(ItemResolveArgs args) { // Must be an image file within a photo collection - if (args.IsDirectory && string.Equals(args.GetCollectionType(), CollectionType.Photos, StringComparison.OrdinalIgnoreCase)) + if (args.IsDirectory) { - if (HasPhotos(args)) + // Must be an image file within a photo collection + var collectionType = args.GetCollectionType(); + + if (string.Equals(collectionType, CollectionType.Photos, StringComparison.OrdinalIgnoreCase) || + (string.Equals(collectionType, CollectionType.HomeVideos, StringComparison.OrdinalIgnoreCase) && args.GetLibraryOptions().EnablePhotos)) { - return new PhotoAlbum + if (HasPhotos(args)) { - Path = args.Path - }; + return new PhotoAlbum + { + Path = args.Path + }; + } } } @@ -41,7 +51,32 @@ namespace Emby.Server.Implementations.Library.Resolvers private bool HasPhotos(ItemResolveArgs args) { - return args.FileSystemChildren.Any(i => (!i.IsDirectory) && PhotoResolver.IsImageFile(i.FullName, _imageProcessor)); + var files = args.FileSystemChildren; + + foreach (var file in files) + { + if (!file.IsDirectory && PhotoResolver.IsImageFile(file.FullName, _imageProcessor)) + { + var libraryOptions = args.GetLibraryOptions(); + var filename = file.Name; + var ownedByMedia = false; + + foreach (var siblingFile in files) + { + if (PhotoResolver.IsOwnedByMedia(_libraryManager, libraryOptions, siblingFile.FullName, filename)) + { + ownedByMedia = true; + break; + } + } + + if (!ownedByMedia) + { + return true; + } + } + } + return false; } public override ResolverPriority Priority diff --git a/Emby.Server.Implementations/Library/Resolvers/PhotoResolver.cs b/Emby.Server.Implementations/Library/Resolvers/PhotoResolver.cs index 04312f277..48f5802a9 100644 --- a/Emby.Server.Implementations/Library/Resolvers/PhotoResolver.cs +++ b/Emby.Server.Implementations/Library/Resolvers/PhotoResolver.cs @@ -35,7 +35,6 @@ namespace Emby.Server.Implementations.Library.Resolvers // Must be an image file within a photo collection var collectionType = args.GetCollectionType(); - if (string.Equals(collectionType, CollectionType.Photos, StringComparison.OrdinalIgnoreCase) || (string.Equals(collectionType, CollectionType.HomeVideos, StringComparison.OrdinalIgnoreCase) && args.GetLibraryOptions().EnablePhotos)) { @@ -44,9 +43,15 @@ namespace Emby.Server.Implementations.Library.Resolvers var filename = Path.GetFileNameWithoutExtension(args.Path); // Make sure the image doesn't belong to a video file - if (_fileSystem.GetFilePaths(_fileSystem.GetDirectoryName(args.Path)).Any(i => IsOwnedByMedia(args.GetLibraryOptions(), i, filename))) + var files = args.DirectoryService.GetFiles(_fileSystem.GetDirectoryName(args.Path)); + var libraryOptions = args.GetLibraryOptions(); + + foreach (var file in files) { - return null; + if (IsOwnedByMedia(_libraryManager, libraryOptions, file.FullName, filename)) + { + return null; + } } return new Photo @@ -60,14 +65,21 @@ namespace Emby.Server.Implementations.Library.Resolvers return null; } - private bool IsOwnedByMedia(LibraryOptions libraryOptions, string file, string imageFilename) + internal static bool IsOwnedByMedia(ILibraryManager libraryManager, LibraryOptions libraryOptions, string file, string imageFilename) { - if (_libraryManager.IsVideoFile(file, libraryOptions)) + if (libraryManager.IsVideoFile(file, libraryOptions)) { - if (imageFilename.StartsWith(Path.GetFileNameWithoutExtension(file), StringComparison.OrdinalIgnoreCase)) - { - return true; - } + return IsOwnedByResolvedMedia(libraryManager, libraryOptions, file, imageFilename); + } + + return false; + } + + internal static bool IsOwnedByResolvedMedia(ILibraryManager libraryManager, LibraryOptions libraryOptions, string file, string imageFilename) + { + if (imageFilename.StartsWith(Path.GetFileNameWithoutExtension(file), StringComparison.OrdinalIgnoreCase)) + { + return true; } return false; @@ -81,7 +93,8 @@ namespace Emby.Server.Implementations.Library.Resolvers "fanart", "backdrop", "poster", - "cover" + "cover", + "logo" }; internal static bool IsImageFile(string path, IImageProcessor imageProcessor) diff --git a/Emby.Server.Implementations/Library/Resolvers/TV/SeasonResolver.cs b/Emby.Server.Implementations/Library/Resolvers/TV/SeasonResolver.cs index a859d8ec8..a0ff29482 100644 --- a/Emby.Server.Implementations/Library/Resolvers/TV/SeasonResolver.cs +++ b/Emby.Server.Implementations/Library/Resolvers/TV/SeasonResolver.cs @@ -55,10 +55,10 @@ namespace Emby.Server.Implementations.Library.Resolvers.TV if (season.IndexNumber.HasValue) { var seasonNumber = season.IndexNumber.Value; - + season.Name = seasonNumber == 0 ? args.LibraryOptions.SeasonZeroDisplayName : - string.Format(_localization.GetLocalizedString("NameSeasonNumber"), seasonNumber.ToString(UsCulture)); + string.Format(_localization.GetLocalizedString("NameSeasonNumber"), seasonNumber.ToString(UsCulture), args.GetLibraryOptions().PreferredMetadataLanguage); } return season; diff --git a/Emby.Server.Implementations/Library/UserViewManager.cs b/Emby.Server.Implementations/Library/UserViewManager.cs index 8c9377291..e97bf11c3 100644 --- a/Emby.Server.Implementations/Library/UserViewManager.cs +++ b/Emby.Server.Implementations/Library/UserViewManager.cs @@ -95,14 +95,18 @@ namespace Emby.Server.Implementations.Library if (parents.Count > 0) { - list.Add(GetUserView(parents, viewType, string.Empty, user, query.PresetViews, cancellationToken)); + var localizationKey = string.Equals(viewType, CollectionType.TvShows, StringComparison.OrdinalIgnoreCase) ? + "TvShows" : + "Movies"; + + list.Add(GetUserView(parents, viewType, localizationKey, string.Empty, user, query.PresetViews, cancellationToken)); } } if (_config.Configuration.EnableFolderView) { - var name = _localizationManager.GetLocalizedString("ViewType" + CollectionType.Folders); - list.Add(await _libraryManager.GetNamedView(name, CollectionType.Folders, string.Empty, cancellationToken).ConfigureAwait(false)); + var name = _localizationManager.GetLocalizedString("Folders"); + list.Add(_libraryManager.GetNamedView(name, CollectionType.Folders, string.Empty, cancellationToken)); } if (query.IncludeExternalContent) @@ -117,7 +121,7 @@ namespace Emby.Server.Implementations.Library if (_config.Configuration.EnableChannelView && channels.Length > 0) { - list.Add(await _channelManager.GetInternalChannelFolder(cancellationToken).ConfigureAwait(false)); + list.Add(_channelManager.GetInternalChannelFolder(cancellationToken)); } else { @@ -126,7 +130,7 @@ namespace Emby.Server.Implementations.Library if (_liveTvManager.GetEnabledUsers().Select(i => i.Id.ToString("N")).Contains(query.UserId)) { - list.Add(await _liveTvManager.GetInternalLiveTvFolder(CancellationToken.None).ConfigureAwait(false)); + list.Add(_liveTvManager.GetInternalLiveTvFolder(CancellationToken.None)); } } @@ -158,21 +162,21 @@ namespace Emby.Server.Implementations.Library .ToArray(); } - public Task<UserView> GetUserSubView(string name, string parentId, string type, string sortName, CancellationToken cancellationToken) + public UserView GetUserSubViewWithName(string name, string parentId, string type, string sortName, CancellationToken cancellationToken) { var uniqueId = parentId + "subview" + type; return _libraryManager.GetNamedView(name, parentId, type, sortName, uniqueId, cancellationToken); } - public Task<UserView> GetUserSubView(string parentId, string type, string sortName, CancellationToken cancellationToken) + public UserView GetUserSubView(string parentId, string type, string localizationKey, string sortName, CancellationToken cancellationToken) { - var name = _localizationManager.GetLocalizedString("ViewType" + type); + var name = _localizationManager.GetLocalizedString(localizationKey); - return GetUserSubView(name, parentId, type, sortName, cancellationToken); + return GetUserSubViewWithName(name, parentId, type, sortName, cancellationToken); } - private Folder GetUserView(List<ICollectionFolder> parents, string viewType, string sortName, User user, string[] presetViews, CancellationToken cancellationToken) + private Folder GetUserView(List<ICollectionFolder> parents, string viewType, string localizationKey, string sortName, User user, string[] presetViews, CancellationToken cancellationToken) { if (parents.Count == 1 && parents.All(i => string.Equals(i.CollectionType, viewType, StringComparison.OrdinalIgnoreCase))) { @@ -184,7 +188,7 @@ namespace Emby.Server.Implementations.Library return GetUserView((Folder)parents[0], viewType, string.Empty, cancellationToken); } - var name = _localizationManager.GetLocalizedString("ViewType" + viewType); + var name = _localizationManager.GetLocalizedString(localizationKey); return _libraryManager.GetNamedView(user, name, viewType, sortName, cancellationToken); } diff --git a/Emby.Server.Implementations/LiveTv/EmbyTV/EmbyTV.cs b/Emby.Server.Implementations/LiveTv/EmbyTV/EmbyTV.cs index 4a2836d59..be5e57539 100644 --- a/Emby.Server.Implementations/LiveTv/EmbyTV/EmbyTV.cs +++ b/Emby.Server.Implementations/LiveTv/EmbyTV/EmbyTV.cs @@ -1222,7 +1222,7 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV _logger.Info("Closing live stream {0}", id); - await stream.Close().ConfigureAwait(false); + stream.Close(); _logger.Info("Live stream {0} closed successfully", id); } } @@ -1286,9 +1286,9 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV Id = timer.Id }; - if (_activeRecordings.TryAdd(timer.Id, activeRecordingInfo)) + if (!_activeRecordings.ContainsKey(timer.Id)) { - await RecordStream(timer, recordingEndDate, activeRecordingInfo, activeRecordingInfo.CancellationTokenSource.Token).ConfigureAwait(false); + await RecordStream(timer, recordingEndDate, activeRecordingInfo).ConfigureAwait(false); } else { @@ -1397,8 +1397,7 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV return Path.Combine(recordPath, recordingFileName); } - private async Task RecordStream(TimerInfo timer, DateTime recordingEndDate, - ActiveRecordingInfo activeRecordingInfo, CancellationToken cancellationToken) + private async Task RecordStream(TimerInfo timer, DateTime recordingEndDate, ActiveRecordingInfo activeRecordingInfo) { if (timer == null) { @@ -1420,19 +1419,18 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV if (programInfo != null) { CopyProgramInfoToTimerInfo(programInfo, timer); - //activeRecordingInfo.Program = programInfo; } string seriesPath = null; var recordPath = GetRecordingPath(timer, out seriesPath); var recordingStatus = RecordingStatus.New; + var recorder = await GetRecorder().ConfigureAwait(false); + string liveStreamId = null; try { - var recorder = await GetRecorder().ConfigureAwait(false); - var allMediaSources = await GetChannelStreamMediaSources(timer.ChannelId, CancellationToken.None).ConfigureAwait(false); _logger.Info("Opening recording stream from tuner provider"); @@ -1442,14 +1440,10 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV var mediaStreamInfo = liveStreamInfo.Item2; liveStreamId = mediaStreamInfo.Id; - // HDHR doesn't seem to release the tuner right away after first probing with ffmpeg - //await Task.Delay(3000, cancellationToken).ConfigureAwait(false); - recordPath = recorder.GetOutputPath(mediaStreamInfo, recordPath); recordPath = EnsureFileUnique(recordPath, timer.Id); _libraryMonitor.ReportFileSystemChangeBeginning(recordPath); - activeRecordingInfo.Path = recordPath; var duration = recordingEndDate - DateTime.UtcNow; @@ -1459,15 +1453,22 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV Action onStarted = async () => { + activeRecordingInfo.Path = recordPath; + + _activeRecordings.TryAdd(timer.Id, activeRecordingInfo); + timer.Status = RecordingStatus.InProgress; _timerProvider.AddOrUpdate(timer, false); await SaveRecordingMetadata(timer, recordPath, seriesPath).ConfigureAwait(false); + + CreateRecordingFolders(); + TriggerRefresh(recordPath); EnforceKeepUpTo(timer, seriesPath); }; - await recorder.Record(liveStreamInfo.Item1 as IDirectStreamProvider, mediaStreamInfo, recordPath, duration, onStarted, cancellationToken).ConfigureAwait(false); + await recorder.Record(liveStreamInfo.Item1 as IDirectStreamProvider, mediaStreamInfo, recordPath, duration, onStarted, activeRecordingInfo.CancellationTokenSource.Token).ConfigureAwait(false); recordingStatus = RecordingStatus.Completed; _logger.Info("Recording completed: {0}", recordPath); @@ -1507,6 +1508,7 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV _logger.Info("Retrying recording in {0} seconds.", retryIntervalSeconds); timer.Status = RecordingStatus.New; + timer.PrePaddingSeconds = 0; timer.StartDate = DateTime.UtcNow.AddSeconds(retryIntervalSeconds); timer.RetryCount++; _timerProvider.AddOrUpdate(timer); @@ -1526,13 +1528,13 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV private void TriggerRefresh(string path) { - _logger.Debug("Triggering refresh on {0}", path); + _logger.Info("Triggering refresh on {0}", path); var item = GetAffectedBaseItem(_fileSystem.GetDirectoryName(path)); if (item != null) { - _logger.Debug("Refreshing recording parent {0}", item.Path); + _logger.Info("Refreshing recording parent {0}", item.Path); _providerManager.QueueRefresh(item.Id, new MetadataRefreshOptions(_fileSystem) { diff --git a/Emby.Server.Implementations/LiveTv/EmbyTV/EncodedRecorder.cs b/Emby.Server.Implementations/LiveTv/EmbyTV/EncodedRecorder.cs index 149f69e5b..d6f5e0d9f 100644 --- a/Emby.Server.Implementations/LiveTv/EmbyTV/EncodedRecorder.cs +++ b/Emby.Server.Implementations/LiveTv/EmbyTV/EncodedRecorder.cs @@ -272,11 +272,6 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV private bool EncodeVideo(MediaSourceInfo mediaSource) { - if (string.Equals(_liveTvOptions.RecordedVideoCodec, "copy", StringComparison.OrdinalIgnoreCase)) - { - return false; - } - var mediaStreams = mediaSource.MediaStreams ?? new List<MediaStream>(); return !mediaStreams.Any(i => i.Type == MediaStreamType.Video && string.Equals(i.Codec, "h264", StringComparison.OrdinalIgnoreCase) && !i.IsInterlaced); } diff --git a/Emby.Server.Implementations/LiveTv/Listings/SchedulesDirect.cs b/Emby.Server.Implementations/LiveTv/Listings/SchedulesDirect.cs index b7cfdea1b..b3c7ecc9f 100644 --- a/Emby.Server.Implementations/LiveTv/Listings/SchedulesDirect.cs +++ b/Emby.Server.Implementations/LiveTv/Listings/SchedulesDirect.cs @@ -541,27 +541,30 @@ namespace Emby.Server.Implementations.LiveTv.Listings try { - using (Stream responce = await Get(options, false, info).ConfigureAwait(false)) + using (var httpResponse = await Get(options, false, info).ConfigureAwait(false)) { - var root = _jsonSerializer.DeserializeFromStream<List<ScheduleDirect.Headends>>(responce); - - if (root != null) + using (Stream responce = httpResponse.Content) { - foreach (ScheduleDirect.Headends headend in root) + var root = _jsonSerializer.DeserializeFromStream<List<ScheduleDirect.Headends>>(responce); + + if (root != null) { - foreach (ScheduleDirect.Lineup lineup in headend.lineups) + foreach (ScheduleDirect.Headends headend in root) { - lineups.Add(new NameIdPair + foreach (ScheduleDirect.Lineup lineup in headend.lineups) { - Name = string.IsNullOrWhiteSpace(lineup.name) ? lineup.lineup : lineup.name, - Id = lineup.uri.Substring(18) - }); + lineups.Add(new NameIdPair + { + Name = string.IsNullOrWhiteSpace(lineup.name) ? lineup.lineup : lineup.name, + Id = lineup.uri.Substring(18) + }); + } } } - } - else - { - _logger.Info("No lineups available"); + else + { + _logger.Info("No lineups available"); + } } } } @@ -647,6 +650,9 @@ namespace Emby.Server.Implementations.LiveTv.Listings bool enableRetry, ListingsProviderInfo providerInfo) { + // Schedules direct requires that the client support compression and will return a 400 response without it + options.EnableHttpCompression = true; + try { return await _httpClient.Post(options).ConfigureAwait(false); @@ -671,13 +677,16 @@ namespace Emby.Server.Implementations.LiveTv.Listings return await Post(options, false, providerInfo).ConfigureAwait(false); } - private async Task<Stream> Get(HttpRequestOptions options, + private async Task<HttpResponseInfo> Get(HttpRequestOptions options, bool enableRetry, ListingsProviderInfo providerInfo) { + // Schedules direct requires that the client support compression and will return a 400 response without it + options.EnableHttpCompression = true; + try { - return await _httpClient.Get(options).ConfigureAwait(false); + return await _httpClient.SendAsync(options, "GET").ConfigureAwait(false); } catch (HttpException ex) { @@ -797,11 +806,14 @@ namespace Emby.Server.Implementations.LiveTv.Listings try { - using (var response = await Get(options, false, null).ConfigureAwait(false)) + using (var httpResponse = await Get(options, false, null).ConfigureAwait(false)) { - var root = _jsonSerializer.DeserializeFromStream<ScheduleDirect.Lineups>(response); + using (var response = httpResponse.Content) + { + var root = _jsonSerializer.DeserializeFromStream<ScheduleDirect.Lineups>(response); - return root.lineups.Any(i => string.Equals(info.ListingsId, i.lineup, StringComparison.OrdinalIgnoreCase)); + return root.lineups.Any(i => string.Equals(info.ListingsId, i.lineup, StringComparison.OrdinalIgnoreCase)); + } } } catch (HttpException ex) @@ -879,53 +891,56 @@ namespace Emby.Server.Implementations.LiveTv.Listings var list = new List<ChannelInfo>(); - using (var response = await Get(httpOptions, true, info).ConfigureAwait(false)) + using (var httpResponse = await Get(httpOptions, true, info).ConfigureAwait(false)) { - var root = _jsonSerializer.DeserializeFromStream<ScheduleDirect.Channel>(response); - _logger.Info("Found " + root.map.Count + " channels on the lineup on ScheduleDirect"); - _logger.Info("Mapping Stations to Channel"); - - var allStations = root.stations ?? new List<ScheduleDirect.Station>(); - - foreach (ScheduleDirect.Map map in root.map) + using (var response = httpResponse.Content) { - var channelNumber = GetChannelNumber(map); - - var station = allStations.FirstOrDefault(item => string.Equals(item.stationID, map.stationID, StringComparison.OrdinalIgnoreCase)); - if (station == null) - { - station = new ScheduleDirect.Station - { - stationID = map.stationID - }; - } + var root = _jsonSerializer.DeserializeFromStream<ScheduleDirect.Channel>(response); + _logger.Info("Found " + root.map.Count + " channels on the lineup on ScheduleDirect"); + _logger.Info("Mapping Stations to Channel"); - var name = channelNumber; + var allStations = root.stations ?? new List<ScheduleDirect.Station>(); - var channelInfo = new ChannelInfo + foreach (ScheduleDirect.Map map in root.map) { - Number = channelNumber, - Name = name - }; + var channelNumber = GetChannelNumber(map); - if (station != null) - { - if (!string.IsNullOrWhiteSpace(station.name)) + var station = allStations.FirstOrDefault(item => string.Equals(item.stationID, map.stationID, StringComparison.OrdinalIgnoreCase)); + if (station == null) { - channelInfo.Name = station.name; + station = new ScheduleDirect.Station + { + stationID = map.stationID + }; } - channelInfo.Id = station.stationID; - channelInfo.CallSign = station.callsign; + var name = channelNumber; + + var channelInfo = new ChannelInfo + { + Number = channelNumber, + Name = name + }; - if (station.logo != null) + if (station != null) { - channelInfo.ImageUrl = station.logo.URL; - channelInfo.HasImage = true; + if (!string.IsNullOrWhiteSpace(station.name)) + { + channelInfo.Name = station.name; + } + + channelInfo.Id = station.stationID; + channelInfo.CallSign = station.callsign; + + if (station.logo != null) + { + channelInfo.ImageUrl = station.logo.URL; + channelInfo.HasImage = true; + } } - } - list.Add(channelInfo); + list.Add(channelInfo); + } } } diff --git a/Emby.Server.Implementations/LiveTv/Listings/XmlTvListingsProvider.cs b/Emby.Server.Implementations/LiveTv/Listings/XmlTvListingsProvider.cs index 8ea98879a..95ec1dee0 100644 --- a/Emby.Server.Implementations/LiveTv/Listings/XmlTvListingsProvider.cs +++ b/Emby.Server.Implementations/LiveTv/Listings/XmlTvListingsProvider.cs @@ -110,7 +110,15 @@ namespace Emby.Server.Implementations.LiveTv.Listings var tempFolder = Path.Combine(_config.ApplicationPaths.TempDirectory, Guid.NewGuid().ToString()); _fileSystem.CreateDirectory(tempFolder); - _zipClient.ExtractAllFromGz(stream, tempFolder, true); + try + { + _zipClient.ExtractAllFromGz(stream, tempFolder, true); + } + catch + { + // If the extraction fails just return the original file, it could be a gz + return file; + } return _fileSystem.GetFiles(tempFolder, true) .Where(i => string.Equals(i.Extension, ".xml", StringComparison.OrdinalIgnoreCase)) diff --git a/Emby.Server.Implementations/LiveTv/LiveTvDtoService.cs b/Emby.Server.Implementations/LiveTv/LiveTvDtoService.cs index e6479feaa..15bbca136 100644 --- a/Emby.Server.Implementations/LiveTv/LiveTvDtoService.cs +++ b/Emby.Server.Implementations/LiveTv/LiveTvDtoService.cs @@ -89,6 +89,11 @@ namespace Emby.Server.Implementations.LiveTv if (channel != null) { dto.ChannelName = channel.Name; + + if (channel.HasImage(ImageType.Primary)) + { + dto.ChannelPrimaryImageTag = GetImageTag(channel); + } } return dto; diff --git a/Emby.Server.Implementations/LiveTv/LiveTvManager.cs b/Emby.Server.Implementations/LiveTv/LiveTvManager.cs index 857afa378..718620ab5 100644 --- a/Emby.Server.Implementations/LiveTv/LiveTvManager.cs +++ b/Emby.Server.Implementations/LiveTv/LiveTvManager.cs @@ -173,11 +173,11 @@ namespace Emby.Server.Implementations.LiveTv } } - public async Task<QueryResult<BaseItem>> GetInternalChannels(LiveTvChannelQuery query, DtoOptions dtoOptions, CancellationToken cancellationToken) + public QueryResult<BaseItem> GetInternalChannels(LiveTvChannelQuery query, DtoOptions dtoOptions, CancellationToken cancellationToken) { var user = string.IsNullOrEmpty(query.UserId) ? null : _userManager.GetUserById(query.UserId); - var topFolder = await GetInternalLiveTvFolder(cancellationToken).ConfigureAwait(false); + var topFolder = GetInternalLiveTvFolder(cancellationToken); var internalQuery = new InternalItemsQuery(user) { @@ -527,18 +527,18 @@ namespace Emby.Server.Implementations.LiveTv item.ChannelType = channelInfo.ChannelType; item.ServiceName = serviceName; + + if (!string.Equals(channelInfo.Number, item.Number, StringComparison.Ordinal)) + { + forceUpdate = true; + } item.Number = channelInfo.Number; - //if (!string.Equals(item.ProviderImageUrl, channelInfo.ImageUrl, StringComparison.OrdinalIgnoreCase)) - //{ - // isNew = true; - // replaceImages.Add(ImageType.Primary); - //} - //if (!string.Equals(item.ProviderImagePath, channelInfo.ImagePath, StringComparison.OrdinalIgnoreCase)) - //{ - // isNew = true; - // replaceImages.Add(ImageType.Primary); - //} + if (!string.Equals(channelInfo.Name, item.Name, StringComparison.Ordinal)) + { + forceUpdate = true; + } + item.Name = channelInfo.Name; if (!item.HasImage(ImageType.Primary)) { @@ -554,18 +554,13 @@ namespace Emby.Server.Implementations.LiveTv } } - if (string.IsNullOrEmpty(item.Name)) - { - item.Name = channelInfo.Name; - } - if (isNew) { _libraryManager.CreateItem(item, cancellationToken); } else if (forceUpdate) { - await _libraryManager.UpdateItem(item, ItemUpdateType.MetadataImport, cancellationToken).ConfigureAwait(false); + _libraryManager.UpdateItem(item, ItemUpdateType.MetadataImport, cancellationToken); } await item.RefreshMetadata(new MetadataRefreshOptions(_fileSystem) @@ -760,7 +755,7 @@ namespace Emby.Server.Implementations.LiveTv return new Tuple<LiveTvProgram, bool, bool>(item, isNew, isUpdated); } - private async Task<Guid> CreateRecordingRecord(RecordingInfo info, string serviceName, Guid parentFolderId, CancellationToken cancellationToken) + private Guid CreateRecordingRecord(RecordingInfo info, string serviceName, Guid parentFolderId, CancellationToken cancellationToken) { var isNew = false; @@ -892,7 +887,7 @@ namespace Emby.Server.Implementations.LiveTv else if (dataChanged || info.DateLastUpdated > recording.DateLastSaved || statusChanged) { metadataRefreshMode = MetadataRefreshMode.FullRefresh; - await _libraryManager.UpdateItem(item, ItemUpdateType.MetadataImport, cancellationToken).ConfigureAwait(false); + _libraryManager.UpdateItem(item, ItemUpdateType.MetadataImport, cancellationToken); } if (info.Status != RecordingStatus.InProgress) @@ -928,7 +923,7 @@ namespace Emby.Server.Implementations.LiveTv { var user = string.IsNullOrEmpty(query.UserId) ? null : _userManager.GetUserById(query.UserId); - var topFolder = await GetInternalLiveTvFolder(cancellationToken).ConfigureAwait(false); + var topFolder = GetInternalLiveTvFolder(cancellationToken); if (query.OrderBy.Length == 0) { @@ -1007,11 +1002,11 @@ namespace Emby.Server.Implementations.LiveTv return result; } - public async Task<QueryResult<BaseItem>> GetRecommendedProgramsInternal(RecommendedProgramQuery query, DtoOptions options, CancellationToken cancellationToken) + public QueryResult<BaseItem> GetRecommendedProgramsInternal(RecommendedProgramQuery query, DtoOptions options, CancellationToken cancellationToken) { var user = _userManager.GetUserById(query.UserId); - var topFolder = await GetInternalLiveTvFolder(cancellationToken).ConfigureAwait(false); + var topFolder = GetInternalLiveTvFolder(cancellationToken); var internalQuery = new InternalItemsQuery(user) { @@ -1072,11 +1067,11 @@ namespace Emby.Server.Implementations.LiveTv return result; } - public async Task<QueryResult<BaseItemDto>> GetRecommendedPrograms(RecommendedProgramQuery query, DtoOptions options, CancellationToken cancellationToken) + public QueryResult<BaseItemDto> GetRecommendedPrograms(RecommendedProgramQuery query, DtoOptions options, CancellationToken cancellationToken) { RemoveFields(options); - var internalResult = await GetRecommendedProgramsInternal(query, options, cancellationToken).ConfigureAwait(false); + var internalResult = GetRecommendedProgramsInternal(query, options, cancellationToken); var user = _userManager.GetUserById(query.UserId); @@ -1302,7 +1297,7 @@ namespace Emby.Server.Implementations.LiveTv var list = new List<LiveTvChannel>(); var numComplete = 0; - var parentFolder = await GetInternalLiveTvFolder(cancellationToken).ConfigureAwait(false); + var parentFolder = GetInternalLiveTvFolder(cancellationToken); var parentFolderId = parentFolder.Id; foreach (var channelInfo in allChannelsList) @@ -1425,7 +1420,7 @@ namespace Emby.Server.Implementations.LiveTv // TODO: Do this in bulk foreach (var program in updatedPrograms) { - await _libraryManager.UpdateItem(program, ItemUpdateType.MetadataImport, cancellationToken).ConfigureAwait(false); + _libraryManager.UpdateItem(program, ItemUpdateType.MetadataImport, cancellationToken); } currentChannel.IsMovie = isMovie; @@ -1434,7 +1429,7 @@ namespace Emby.Server.Implementations.LiveTv currentChannel.IsKids = isKids; currentChannel.IsSeries = iSSeries; - await currentChannel.UpdateToRepository(ItemUpdateType.MetadataImport, cancellationToken).ConfigureAwait(false); + currentChannel.UpdateToRepository(ItemUpdateType.MetadataImport, cancellationToken); } catch (OperationCanceledException) { @@ -1549,9 +1544,8 @@ namespace Emby.Server.Implementations.LiveTv var results = await Task.WhenAll(tasks).ConfigureAwait(false); - var recordingTasks = results.SelectMany(i => i.ToList()).Select(i => CreateRecordingRecord(i.Item1, i.Item2.Name, internalLiveTvFolderId, cancellationToken)); - - var idList = await Task.WhenAll(recordingTasks).ConfigureAwait(false); + var idList = results.SelectMany(i => i.ToList()).Select(i => CreateRecordingRecord(i.Item1, i.Item2.Name, internalLiveTvFolderId, cancellationToken)) + .ToArray(); await CleanDatabaseInternal(idList, new[] { typeof(LiveTvVideoRecording).Name, typeof(LiveTvAudioRecording).Name }, new SimpleProgress<double>(), cancellationToken).ConfigureAwait(false); @@ -1726,7 +1720,7 @@ namespace Emby.Server.Implementations.LiveTv return new QueryResult<BaseItem>(); } - var folder = await GetInternalLiveTvFolder(cancellationToken).ConfigureAwait(false); + var folder = GetInternalLiveTvFolder(cancellationToken); // TODO: Figure out how to merge emby recordings + service recordings if (_services.Length == 1) @@ -2143,18 +2137,6 @@ namespace Emby.Server.Implementations.LiveTv }; } - public Task OnRecordingFileDeleted(BaseItem recording) - { - var service = GetService(recording); - - if (service is EmbyTV.EmbyTV) - { - return service.DeleteRecordingAsync(GetItemExternalId(recording), CancellationToken.None); - } - - return Task.FromResult(true); - } - public async Task DeleteRecording(string recordingId) { var recording = await GetInternalRecording(recordingId, CancellationToken.None).ConfigureAwait(false); @@ -2171,13 +2153,17 @@ namespace Emby.Server.Implementations.LiveTv { var service = GetService(recording.ServiceName); - try - { - await service.DeleteRecordingAsync(GetItemExternalId(recording), CancellationToken.None).ConfigureAwait(false); - } - catch (ResourceNotFoundException) + if (service != null) { + // handle the service being uninstalled and the item hanging around in the database + try + { + await service.DeleteRecordingAsync(GetItemExternalId(recording), CancellationToken.None).ConfigureAwait(false); + } + catch (ResourceNotFoundException) + { + } } _lastRecordingRefreshTime = DateTime.MinValue; @@ -2387,7 +2373,7 @@ namespace Emby.Server.Implementations.LiveTv MinEndDate = now, Limit = channelIds.Length, OrderBy = new[] { new Tuple<string, SortOrder>(ItemSortBy.StartDate, SortOrder.Ascending) }, - TopParentIds = new[] { GetInternalLiveTvFolder(CancellationToken.None).Result.Id.ToString("N") }, + TopParentIds = new[] { GetInternalLiveTvFolder(CancellationToken.None).Id.ToString("N") }, DtoOptions = options }) : new List<BaseItem>(); @@ -2910,11 +2896,11 @@ namespace Emby.Server.Implementations.LiveTv return service.ResetTuner(parts[1], cancellationToken); } - public async Task<BaseItemDto> GetLiveTvFolder(string userId, CancellationToken cancellationToken) + public BaseItemDto GetLiveTvFolder(string userId, CancellationToken cancellationToken) { var user = string.IsNullOrEmpty(userId) ? null : _userManager.GetUserById(userId); - var folder = await GetInternalLiveTvFolder(cancellationToken).ConfigureAwait(false); + var folder = GetInternalLiveTvFolder(cancellationToken); return _dtoService.GetBaseItemDto(folder, new DtoOptions(), user); } @@ -2930,10 +2916,10 @@ namespace Emby.Server.Implementations.LiveTv options.Fields = fields.ToArray(fields.Count); } - public async Task<Folder> GetInternalLiveTvFolder(CancellationToken cancellationToken) + public Folder GetInternalLiveTvFolder(CancellationToken cancellationToken) { - var name = _localization.GetLocalizedString("ViewTypeLiveTV"); - return await _libraryManager.GetNamedView(name, CollectionType.LiveTv, name, cancellationToken).ConfigureAwait(false); + var name = _localization.GetLocalizedString("HeaderLiveTV"); + return _libraryManager.GetNamedView(name, CollectionType.LiveTv, name, cancellationToken); } public async Task<TunerHostInfo> SaveTunerHost(TunerHostInfo info, bool dataSourceChanged = true) diff --git a/Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunHost.cs b/Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunHost.cs index bb11dac5f..59346cdec 100644 --- a/Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunHost.cs +++ b/Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunHost.cs @@ -86,16 +86,19 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun CancellationToken = cancellationToken, BufferContent = false }; - using (var stream = await _httpClient.Get(options).ConfigureAwait(false)) + using (var response = await _httpClient.SendAsync(options, "GET").ConfigureAwait(false)) { - var lineup = JsonSerializer.DeserializeFromStream<List<Channels>>(stream) ?? new List<Channels>(); - - if (info.ImportFavoritesOnly) + using (var stream = response.Content) { - lineup = lineup.Where(i => i.Favorite).ToList(); - } + var lineup = JsonSerializer.DeserializeFromStream<List<Channels>>(stream) ?? new List<Channels>(); + + if (info.ImportFavoritesOnly) + { + lineup = lineup.Where(i => i.Favorite).ToList(); + } - return lineup.Where(i => !i.DRM).ToList(); + return lineup.Where(i => !i.DRM).ToList(); + } } } @@ -143,26 +146,29 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun try { - using (var stream = await _httpClient.Get(new HttpRequestOptions() + using (var response = await _httpClient.SendAsync(new HttpRequestOptions() { Url = string.Format("{0}/discover.json", GetApiUrl(info, false)), CancellationToken = cancellationToken, TimeoutMs = Convert.ToInt32(TimeSpan.FromSeconds(5).TotalMilliseconds), BufferContent = false - }).ConfigureAwait(false)) + }, "GET").ConfigureAwait(false)) { - var response = JsonSerializer.DeserializeFromStream<DiscoverResponse>(stream); - - if (!string.IsNullOrWhiteSpace(info.Id)) + using (var stream = response.Content) { - lock (_modelCache) + var discoverResponse = JsonSerializer.DeserializeFromStream<DiscoverResponse>(stream); + + if (!string.IsNullOrWhiteSpace(info.Id)) { - _modelCache[info.Id] = response; + lock (_modelCache) + { + _modelCache[info.Id] = discoverResponse; + } } - } - return response; + return discoverResponse; + } } } catch (HttpException ex) @@ -197,7 +203,7 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun var uri = new Uri(GetApiUrl(info, false)); - using (var manager = new HdHomerunManager(_socketFactory)) + using (var manager = new HdHomerunManager(_socketFactory, Logger)) { // Legacy HdHomeruns are IPv4 only var ipInfo = _networkManager.ParseIpAddress(uri.Host); @@ -299,6 +305,8 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun int? videoBitrate = null; int? audioBitrate = null; + var isHd = channelInfo.IsHD ?? true; + if (string.Equals(profile, "mobile", StringComparison.OrdinalIgnoreCase)) { width = 1280; @@ -350,7 +358,7 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun else { // This is for android tv's 1200 condition. Remove once not needed anymore so that we can avoid possible side effects of dummying up this data - if ((channelInfo.IsHD ?? true)) + if (isHd) { width = 1920; height = 1080; @@ -367,9 +375,9 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun if (!videoBitrate.HasValue) { - videoBitrate = (channelInfo.IsHD ?? true) ? 15000000 : 2000000; + videoBitrate = isHd ? 15000000 : 2000000; } - audioBitrate = (channelInfo.IsHD ?? true) ? 448000 : 192000; + audioBitrate = isHd ? 448000 : 192000; } // normalize diff --git a/Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunHttpStream.cs b/Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunHttpStream.cs index 604aa74f0..7e0e5fc5c 100644 --- a/Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunHttpStream.cs +++ b/Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunHttpStream.cs @@ -22,9 +22,6 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun private readonly IHttpClient _httpClient; private readonly IServerApplicationHost _appHost; - private readonly CancellationTokenSource _liveStreamCancellationTokenSource = new CancellationTokenSource(); - private readonly TaskCompletionSource<bool> _liveStreamTaskCompletionSource = new TaskCompletionSource<bool>(); - public HdHomerunHttpStream(MediaSourceInfo mediaSource, string originalStreamId, IFileSystem fileSystem, IHttpClient httpClient, ILogger logger, IServerApplicationPaths appPaths, IServerApplicationHost appHost, IEnvironmentInfo environment) : base(mediaSource, environment, fileSystem, logger, appPaths) { @@ -33,19 +30,34 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun OriginalStreamId = originalStreamId; } - protected override Task OpenInternal(CancellationToken openCancellationToken) + public override async Task Open(CancellationToken openCancellationToken) { - _liveStreamCancellationTokenSource.Token.ThrowIfCancellationRequested(); + LiveStreamCancellationTokenSource.Token.ThrowIfCancellationRequested(); var mediaSource = OriginalMediaSource; var url = mediaSource.Path; + FileSystem.CreateDirectory(FileSystem.GetDirectoryName(TempFilePath)); + Logger.Info("Opening HDHR Live stream from {0}", url); - var taskCompletionSource = new TaskCompletionSource<bool>(); + var response = await _httpClient.SendAsync(new HttpRequestOptions + { + Url = url, + CancellationToken = CancellationToken.None, + BufferContent = false, + + // Increase a little bit + TimeoutMs = 30000, + + EnableHttpCompression = false + + }, "GET").ConfigureAwait(false); + + Logger.Info("Opened HDHR stream from {0}", url); - StartStreaming(url, taskCompletionSource, _liveStreamCancellationTokenSource.Token); + StartStreaming(response, LiveStreamCancellationTokenSource.Token); //OpenedMediaSource.Protocol = MediaProtocol.File; //OpenedMediaSource.Path = tempFile; @@ -59,77 +71,42 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun //OpenedMediaSource.SupportsDirectPlay = false; //OpenedMediaSource.SupportsDirectStream = true; //OpenedMediaSource.SupportsTranscoding = true; - - return taskCompletionSource.Task; - - //await Task.Delay(5000).ConfigureAwait(false); } - public override Task Close() + public override void Close() { Logger.Info("Closing HDHR live stream"); - _liveStreamCancellationTokenSource.Cancel(); - - return _liveStreamTaskCompletionSource.Task; + LiveStreamCancellationTokenSource.Cancel(); } - private Task StartStreaming(string url, TaskCompletionSource<bool> openTaskCompletionSource, CancellationToken cancellationToken) + private Task StartStreaming(HttpResponseInfo response, CancellationToken cancellationToken) { return Task.Run(async () => { - var isFirstAttempt = true; - - while (!cancellationToken.IsCancellationRequested) + try { - try + using (response) { - using (var response = await _httpClient.SendAsync(new HttpRequestOptions - { - Url = url, - CancellationToken = cancellationToken, - BufferContent = false, - - // Increase a little bit - TimeoutMs = 30000, - - EnableHttpCompression = false - - }, "GET").ConfigureAwait(false)) + using (var stream = response.Content) { - Logger.Info("Opened HDHR stream from {0}", url); + Logger.Info("Beginning HdHomerunHttpStream stream to file"); - if (!cancellationToken.IsCancellationRequested) + FileSystem.CreateDirectory(FileSystem.GetDirectoryName(TempFilePath)); + using (var fileStream = FileSystem.GetFileStream(TempFilePath, FileOpenMode.Create, FileAccessMode.Write, FileShareMode.Read, FileOpenOptions.None)) { - Logger.Info("Beginning multicastStream.CopyUntilCancelled"); - - FileSystem.CreateDirectory(FileSystem.GetDirectoryName(TempFilePath)); - using (var fileStream = FileSystem.GetFileStream(TempFilePath, FileOpenMode.Create, FileAccessMode.Write, FileShareMode.Read, FileOpenOptions.None)) - { - StreamHelper.CopyTo(response.Content, fileStream, 81920, () => Resolve(openTaskCompletionSource), cancellationToken); - } + StreamHelper.CopyTo(stream, fileStream, 81920, null, cancellationToken); } } } - catch (OperationCanceledException) - { - break; - } - catch (Exception ex) - { - if (isFirstAttempt) - { - Logger.ErrorException("Error opening live stream:", ex); - openTaskCompletionSource.TrySetException(ex); - break; - } - - Logger.ErrorException("Error copying live stream, will reopen", ex); - } - - isFirstAttempt = false; + } + catch (OperationCanceledException) + { + } + catch (Exception ex) + { + Logger.ErrorException("Error copying live stream.", ex); } - _liveStreamTaskCompletionSource.TrySetResult(true); await DeleteTempFile(TempFilePath).ConfigureAwait(false); }); } diff --git a/Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunManager.cs b/Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunManager.cs index c737c4cba..5156f1744 100644 --- a/Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunManager.cs +++ b/Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunManager.cs @@ -6,6 +6,7 @@ using System.Text.RegularExpressions; using System.Threading; using System.Threading.Tasks; using MediaBrowser.Model.Net; +using MediaBrowser.Model.Logging; namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun { @@ -89,9 +90,12 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun private readonly ISocketFactory _socketFactory; private IpAddressInfo _remoteIp; - public HdHomerunManager(ISocketFactory socketFactory) + private ILogger _logger; + + public HdHomerunManager(ISocketFactory socketFactory, ILogger logger) { _socketFactory = socketFactory; + _logger = logger; } public void Dispose() @@ -140,6 +144,8 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun _lockkey = (uint)rand.Next(); } + var lockKeyValue = _lockkey.Value; + var ipEndPoint = new IpEndPointInfo(_remoteIp, HdHomeRunPort); for (int i = 0; i < numTuners; ++i) @@ -148,7 +154,7 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun continue; _activeTuner = i; - var lockKeyString = String.Format("{0:d}", _lockkey.Value); + var lockKeyString = String.Format("{0:d}", lockKeyValue); var lockkeyMsg = CreateSetMessage(i, "lockkey", lockKeyString, null); await tcpClient.SendToAsync(lockkeyMsg, 0, lockkeyMsg.Length, ipEndPoint, cancellationToken).ConfigureAwait(false); var response = await tcpClient.ReceiveAsync(receiveBuffer, 0, receiveBuffer.Length, cancellationToken).ConfigureAwait(false); @@ -160,27 +166,27 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun var commandList = commands.GetCommands(); foreach(Tuple<string,string> command in commandList) { - var channelMsg = CreateSetMessage(i, command.Item1, command.Item2, _lockkey.Value); + var channelMsg = CreateSetMessage(i, command.Item1, command.Item2, lockKeyValue); await tcpClient.SendToAsync(channelMsg, 0, channelMsg.Length, ipEndPoint, cancellationToken).ConfigureAwait(false); response = await tcpClient.ReceiveAsync(receiveBuffer, 0, receiveBuffer.Length, cancellationToken).ConfigureAwait(false); // parse response to make sure it worked if (!ParseReturnMessage(response.Buffer, response.ReceivedBytes, out returnVal)) { - await ReleaseLockkey(tcpClient).ConfigureAwait(false); + await ReleaseLockkey(tcpClient, lockKeyValue).ConfigureAwait(false); continue; } } var targetValue = String.Format("rtp://{0}:{1}", localIp, localPort); - var targetMsg = CreateSetMessage(i, "target", targetValue, _lockkey.Value); + var targetMsg = CreateSetMessage(i, "target", targetValue, lockKeyValue); await tcpClient.SendToAsync(targetMsg, 0, targetMsg.Length, ipEndPoint, cancellationToken).ConfigureAwait(false); response = await tcpClient.ReceiveAsync(receiveBuffer, 0, receiveBuffer.Length, cancellationToken).ConfigureAwait(false); // parse response to make sure it worked if (!ParseReturnMessage(response.Buffer, response.ReceivedBytes, out returnVal)) { - await ReleaseLockkey(tcpClient).ConfigureAwait(false); + await ReleaseLockkey(tcpClient, lockKeyValue).ConfigureAwait(false); continue; } @@ -201,7 +207,7 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun foreach (Tuple<string, string> command in commandList) { - var channelMsg = CreateSetMessage(_activeTuner, command.Item1, command.Item2, _lockkey.Value); + var channelMsg = CreateSetMessage(_activeTuner, command.Item1, command.Item2, _lockkey); await tcpClient.SendToAsync(channelMsg, 0, channelMsg.Length, new IpEndPointInfo(_remoteIp, HdHomeRunPort), cancellationToken).ConfigureAwait(false); var response = await tcpClient.ReceiveAsync(receiveBuffer, 0, receiveBuffer.Length, cancellationToken).ConfigureAwait(false); // parse response to make sure it worked @@ -216,24 +222,28 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun public async Task StopStreaming() { - if (!_lockkey.HasValue) + var lockKey = _lockkey; + + if (!lockKey.HasValue) return; using (var socket = _socketFactory.CreateTcpSocket(_remoteIp, HdHomeRunPort)) { - await ReleaseLockkey(socket).ConfigureAwait(false); + await ReleaseLockkey(socket, lockKey.Value).ConfigureAwait(false); } } - private async Task ReleaseLockkey(ISocket tcpClient) + private async Task ReleaseLockkey(ISocket tcpClient, uint lockKeyValue) { - var releaseTarget = CreateSetMessage(_activeTuner, "target", "none", _lockkey); + _logger.Info("HdHomerunManager.ReleaseLockkey {0}", lockKeyValue); + + var releaseTarget = CreateSetMessage(_activeTuner, "target", "none", lockKeyValue); await tcpClient.SendToAsync(releaseTarget, 0, releaseTarget.Length, new IpEndPointInfo(_remoteIp, HdHomeRunPort), CancellationToken.None).ConfigureAwait(false); var receiveBuffer = new byte[8192]; await tcpClient.ReceiveAsync(receiveBuffer, 0, receiveBuffer.Length, CancellationToken.None).ConfigureAwait(false); - var releaseKeyMsg = CreateSetMessage(_activeTuner, "lockkey", "none", _lockkey); + var releaseKeyMsg = CreateSetMessage(_activeTuner, "lockkey", "none", lockKeyValue); _lockkey = null; await tcpClient.SendToAsync(releaseKeyMsg, 0, releaseKeyMsg.Length, new IpEndPointInfo(_remoteIp, HdHomeRunPort), CancellationToken.None).ConfigureAwait(false); await tcpClient.ReceiveAsync(receiveBuffer, 0, receiveBuffer.Length, CancellationToken.None).ConfigureAwait(false); diff --git a/Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunUdpStream.cs b/Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunUdpStream.cs index ff8fd1bc4..06326d26c 100644 --- a/Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunUdpStream.cs +++ b/Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunUdpStream.cs @@ -1,23 +1,16 @@ using System; -using System.Collections.Generic; using System.IO; -using System.Linq; -using System.Text; using System.Threading; using System.Threading.Tasks; -using Emby.Server.Implementations.IO; using MediaBrowser.Common.Net; using MediaBrowser.Controller; using MediaBrowser.Controller.Library; -using MediaBrowser.Controller.LiveTv; using MediaBrowser.Model.Dto; using MediaBrowser.Model.IO; using MediaBrowser.Model.Logging; using MediaBrowser.Model.MediaInfo; using MediaBrowser.Model.Net; using MediaBrowser.Model.System; -using System.Globalization; -using MediaBrowser.Controller.IO; namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun { @@ -26,8 +19,6 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun private readonly IServerApplicationHost _appHost; private readonly ISocketFactory _socketFactory; - private readonly CancellationTokenSource _liveStreamCancellationTokenSource = new CancellationTokenSource(); - private readonly TaskCompletionSource<bool> _liveStreamTaskCompletionSource = new TaskCompletionSource<bool>(); private readonly IHdHomerunChannelCommands _channelCommands; private readonly int _numTuners; private readonly INetworkManager _networkManager; @@ -43,20 +34,62 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun _numTuners = numTuners; } - protected override Task OpenInternal(CancellationToken openCancellationToken) + public override async Task Open(CancellationToken openCancellationToken) { - _liveStreamCancellationTokenSource.Token.ThrowIfCancellationRequested(); + LiveStreamCancellationTokenSource.Token.ThrowIfCancellationRequested(); var mediaSource = OriginalMediaSource; var uri = new Uri(mediaSource.Path); var localPort = _networkManager.GetRandomUnusedUdpPort(); + FileSystem.CreateDirectory(FileSystem.GetDirectoryName(TempFilePath)); + Logger.Info("Opening HDHR UDP Live stream from {0}", uri.Host); + var remoteAddress = _networkManager.ParseIpAddress(uri.Host); + IpAddressInfo localAddress = null; + using (var tcpSocket = _socketFactory.CreateSocket(remoteAddress.AddressFamily, SocketType.Stream, ProtocolType.Tcp, false)) + { + try + { + tcpSocket.Connect(new IpEndPointInfo(remoteAddress, HdHomerunManager.HdHomeRunPort)); + localAddress = tcpSocket.LocalEndPoint.IpAddress; + tcpSocket.Close(); + } + catch (Exception) + { + Logger.Error("Unable to determine local ip address for Legacy HDHomerun stream."); + return; + } + } + + var udpClient = _socketFactory.CreateUdpSocket(localPort); + var hdHomerunManager = new HdHomerunManager(_socketFactory, Logger); + + try + { + // send url to start streaming + await hdHomerunManager.StartStreaming(remoteAddress, localAddress, localPort, _channelCommands, _numTuners, openCancellationToken).ConfigureAwait(false); + } + catch (Exception ex) + { + using (udpClient) + { + using (hdHomerunManager) + { + if (!(ex is OperationCanceledException)) + { + Logger.ErrorException("Error opening live stream:", ex); + } + throw; + } + } + } + var taskCompletionSource = new TaskCompletionSource<bool>(); - StartStreaming(uri.Host, localPort, taskCompletionSource, _liveStreamCancellationTokenSource.Token); + StartStreaming(udpClient, hdHomerunManager, remoteAddress, localAddress, localPort, taskCompletionSource, LiveStreamCancellationTokenSource.Token); //OpenedMediaSource.Protocol = MediaProtocol.File; //OpenedMediaSource.Path = tempFile; @@ -68,86 +101,47 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun //OpenedMediaSource.SupportsDirectStream = true; //OpenedMediaSource.SupportsTranscoding = true; - return taskCompletionSource.Task; - //await Task.Delay(5000).ConfigureAwait(false); + await taskCompletionSource.Task.ConfigureAwait(false); } - public override Task Close() + public override void Close() { Logger.Info("Closing HDHR UDP live stream"); - _liveStreamCancellationTokenSource.Cancel(); - - return _liveStreamTaskCompletionSource.Task; + LiveStreamCancellationTokenSource.Cancel(); } - private Task StartStreaming(string remoteIp, int localPort, TaskCompletionSource<bool> openTaskCompletionSource, CancellationToken cancellationToken) + private Task StartStreaming(ISocket udpClient, HdHomerunManager hdHomerunManager, IpAddressInfo remoteAddress, IpAddressInfo localAddress, int localPort, TaskCompletionSource<bool> openTaskCompletionSource, CancellationToken cancellationToken) { return Task.Run(async () => { - var isFirstAttempt = true; - using (var udpClient = _socketFactory.CreateUdpSocket(localPort)) + using (udpClient) { - using (var hdHomerunManager = new HdHomerunManager(_socketFactory)) + using (hdHomerunManager) { - var remoteAddress = _networkManager.ParseIpAddress(remoteIp); - IpAddressInfo localAddress = null; - using (var tcpSocket = _socketFactory.CreateSocket(remoteAddress.AddressFamily, SocketType.Stream, ProtocolType.Tcp, false)) + try + { + await CopyTo(udpClient, TempFilePath, openTaskCompletionSource, cancellationToken).ConfigureAwait(false); + } + catch (OperationCanceledException ex) { - try - { - tcpSocket.Connect(new IpEndPointInfo(remoteAddress, HdHomerunManager.HdHomeRunPort)); - localAddress = tcpSocket.LocalEndPoint.IpAddress; - tcpSocket.Close(); - } - catch (Exception) - { - Logger.Error("Unable to determine local ip address for Legacy HDHomerun stream."); - return; - } + Logger.Info("HDHR UDP stream cancelled or timed out from {0}", remoteAddress); + openTaskCompletionSource.TrySetException(ex); + } + catch (Exception ex) + { + Logger.ErrorException("Error opening live stream:", ex); + openTaskCompletionSource.TrySetException(ex); } - while (!cancellationToken.IsCancellationRequested) + try { - try - { - // send url to start streaming - await hdHomerunManager.StartStreaming(remoteAddress, localAddress, localPort, _channelCommands, _numTuners, cancellationToken).ConfigureAwait(false); - - Logger.Info("Opened HDHR UDP stream from {0}", remoteAddress); - - if (!cancellationToken.IsCancellationRequested) - { - FileSystem.CreateDirectory(FileSystem.GetDirectoryName(TempFilePath)); - using (var fileStream = FileSystem.GetFileStream(TempFilePath, FileOpenMode.Create, FileAccessMode.Write, FileShareMode.Read, FileOpenOptions.None)) - { - CopyTo(udpClient, fileStream, openTaskCompletionSource, cancellationToken); - } - } - } - catch (OperationCanceledException ex) - { - Logger.Info("HDHR UDP stream cancelled or timed out from {0}", remoteAddress); - openTaskCompletionSource.TrySetException(ex); - break; - } - catch (Exception ex) - { - if (isFirstAttempt) - { - Logger.ErrorException("Error opening live stream:", ex); - openTaskCompletionSource.TrySetException(ex); - break; - } - - Logger.ErrorException("Error copying live stream, will reopen", ex); - } - - isFirstAttempt = false; + await hdHomerunManager.StopStreaming().ConfigureAwait(false); } + catch + { - await hdHomerunManager.StopStreaming().ConfigureAwait(false); - _liveStreamTaskCompletionSource.TrySetResult(true); + } } } @@ -158,36 +152,45 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun private void Resolve(TaskCompletionSource<bool> openTaskCompletionSource) { Task.Run(() => - { - openTaskCompletionSource.TrySetResult(true); - }); + { + openTaskCompletionSource.TrySetResult(true); + }); } private static int RtpHeaderBytes = 12; - private void CopyTo(ISocket udpClient, Stream target, TaskCompletionSource<bool> openTaskCompletionSource, CancellationToken cancellationToken) + private async Task CopyTo(ISocket udpClient, string file, TaskCompletionSource<bool> openTaskCompletionSource, CancellationToken cancellationToken) { - var source = _socketFactory.CreateNetworkStream(udpClient, false); var bufferSize = 81920; byte[] buffer = new byte[bufferSize]; int read; var resolved = false; - while ((read = source.Read(buffer, 0, buffer.Length)) != 0) + using (var source = _socketFactory.CreateNetworkStream(udpClient, false)) { - cancellationToken.ThrowIfCancellationRequested(); + using (var fileStream = FileSystem.GetFileStream(file, FileOpenMode.Create, FileAccessMode.Write, FileShareMode.Read, FileOpenOptions.None)) + { + var currentCancellationToken = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken, new CancellationTokenSource(TimeSpan.FromSeconds(30)).Token).Token; - read -= RtpHeaderBytes; + while ((read = await source.ReadAsync(buffer, 0, buffer.Length, currentCancellationToken).ConfigureAwait(false)) != 0) + { + cancellationToken.ThrowIfCancellationRequested(); - if (read > 0) - { - target.Write(buffer, RtpHeaderBytes, read); - } + currentCancellationToken = cancellationToken; - if (!resolved) - { - resolved = true; - Resolve(openTaskCompletionSource); + read -= RtpHeaderBytes; + + if (read > 0) + { + fileStream.Write(buffer, RtpHeaderBytes, read); + } + + if (!resolved) + { + resolved = true; + Resolve(openTaskCompletionSource); + } + } } } } diff --git a/Emby.Server.Implementations/LiveTv/TunerHosts/LiveStream.cs b/Emby.Server.Implementations/LiveTv/TunerHosts/LiveStream.cs index 4641a1c91..12695cd8e 100644 --- a/Emby.Server.Implementations/LiveTv/TunerHosts/LiveStream.cs +++ b/Emby.Server.Implementations/LiveTv/TunerHosts/LiveStream.cs @@ -32,6 +32,7 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts protected readonly string TempFilePath; protected readonly ILogger Logger; + protected readonly CancellationTokenSource LiveStreamCancellationTokenSource = new CancellationTokenSource(); public LiveStream(MediaSourceInfo mediaSource, IEnvironmentInfo environment, IFileSystem fileSystem, ILogger logger, IServerApplicationPaths appPaths) { @@ -46,19 +47,13 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts TempFilePath = Path.Combine(appPaths.TranscodingTempPath, UniqueId + ".ts"); } - public Task Open(CancellationToken cancellationToken) - { - return OpenInternal(cancellationToken); - } - - protected virtual Task OpenInternal(CancellationToken cancellationToken) + public virtual Task Open(CancellationToken openCancellationToken) { return Task.FromResult(true); } - public virtual Task Close() + public virtual void Close() { - return Task.FromResult(true); } protected Stream GetInputStream(string path, bool allowAsyncFileRead) @@ -75,11 +70,24 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts protected async Task DeleteTempFile(string path, int retryCount = 0) { + if (retryCount == 0) + { + Logger.Info("Deleting temp file {0}", path); + } + try { FileSystem.DeleteFile(path); return; } + catch (DirectoryNotFoundException) + { + return; + } + catch (FileNotFoundException) + { + return; + } catch { @@ -96,6 +104,8 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts public async Task CopyToAsync(Stream stream, CancellationToken cancellationToken) { + cancellationToken = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken, LiveStreamCancellationTokenSource.Token).Token; + var allowAsync = false;//Environment.OperatingSystem != MediaBrowser.Model.System.OperatingSystem.Windows; // use non-async filestream along with read due to https://github.com/dotnet/corefx/issues/6039 @@ -110,16 +120,27 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts private static async Task CopyTo(Stream source, Stream destination, int bufferSize, Action onStarted, CancellationToken cancellationToken) { byte[] buffer = new byte[bufferSize]; - while (true) + + var eofCount = 0; + var emptyReadLimit = 1000; + + while (eofCount < emptyReadLimit) { cancellationToken.ThrowIfCancellationRequested(); - var read = source.Read(buffer, 0, buffer.Length); + var bytesRead = source.Read(buffer, 0, buffer.Length); - if (read > 0) + if (bytesRead == 0) { + eofCount++; + await Task.Delay(10, cancellationToken).ConfigureAwait(false); + } + else + { + eofCount = 0; + //await destination.WriteAsync(buffer, 0, read).ConfigureAwait(false); - destination.Write(buffer, 0, read); + destination.Write(buffer, 0, bytesRead); if (onStarted != null) { @@ -127,10 +148,6 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts onStarted = null; } } - else - { - await Task.Delay(10).ConfigureAwait(false); - } } } @@ -140,6 +157,10 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts { stream.Seek(offset, SeekOrigin.End); } + catch (IOException) + { + + } catch (ArgumentException) { diff --git a/Emby.Server.Implementations/LiveTv/TunerHosts/M3UTunerHost.cs b/Emby.Server.Implementations/LiveTv/TunerHosts/M3UTunerHost.cs index 8d1854f4b..9fc6687d1 100644 --- a/Emby.Server.Implementations/LiveTv/TunerHosts/M3UTunerHost.cs +++ b/Emby.Server.Implementations/LiveTv/TunerHosts/M3UTunerHost.cs @@ -93,13 +93,6 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts protected override async Task<List<MediaSourceInfo>> GetChannelStreamMediaSources(TunerHostInfo info, string channelId, CancellationToken cancellationToken) { - var channelIdPrefix = GetFullChannelIdPrefix(info); - - if (!channelId.StartsWith(channelIdPrefix, StringComparison.OrdinalIgnoreCase)) - { - return null; - } - var channels = await GetChannels(info, true, cancellationToken).ConfigureAwait(false); var channel = channels.FirstOrDefault(c => string.Equals(c.Id, channelId, StringComparison.OrdinalIgnoreCase)); if (channel != null) @@ -165,7 +158,6 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts RequiresOpening = true, RequiresClosing = true, RequiresLooping = info.EnableStreamLooping, - EnableMpDecimate = info.EnableMpDecimate, ReadAtNativeFramerate = false, diff --git a/Emby.Server.Implementations/Localization/Core/ar.json b/Emby.Server.Implementations/Localization/Core/ar.json index 28977c4f9..0c2ab1f6d 100644 --- a/Emby.Server.Implementations/Localization/Core/ar.json +++ b/Emby.Server.Implementations/Localization/Core/ar.json @@ -1,178 +1,96 @@ { - "DbUpgradeMessage": "Please wait while your Emby Server database is upgraded. {0}% complete.", - "AppDeviceValues": "App: {0}, Device: {1}", - "UserDownloadingItemWithValues": "{0} is downloading {1}", - "FolderTypeMixed": "Mixed content", - "FolderTypeMovies": "Movies", - "FolderTypeMusic": "Music", - "FolderTypeAdultVideos": "Adult videos", - "FolderTypePhotos": "Photos", - "FolderTypeMusicVideos": "Music videos", - "FolderTypeHomeVideos": "Home videos", - "FolderTypeGames": "Games", - "FolderTypeBooks": "Books", - "FolderTypeTvShows": "TV", - "FolderTypeInherit": "Inherit", - "HeaderCastCrew": "Cast & Crew", - "HeaderPeople": "People", - "ValueSpecialEpisodeName": "Special - {0}", - "LabelChapterName": "Chapter {0}", - "NameSeasonNumber": "Season {0}", + "Latest": "\u0627\u0644\u0623\u062d\u062f\u062b", + "ValueSpecialEpisodeName": "\u062e\u0627\u0635 - {0}", + "Inherit": "\u062a\u0648\u0631\u064a\u062b", + "Books": "\u0627\u0644\u0643\u062a\u0628", + "Music": "\u0627\u0644\u0645\u0648\u0633\u064a\u0642\u0649", + "Games": "\u0627\u0644\u0623\u0644\u0639\u0627\u0628", + "Photos": "\u0627\u0644\u0635\u0648\u0631", + "MixedContent": "\u0645\u062d\u062a\u0648\u0649 \u0645\u062e\u0644\u0648\u0637", + "MusicVideos": "\u0627\u0644\u0641\u064a\u062f\u064a\u0648\u0647\u0627\u062a \u0627\u0644\u0645\u0648\u0633\u064a\u0642\u064a\u0629", + "HomeVideos": "\u0627\u0644\u0641\u064a\u062f\u064a\u0648\u0647\u0627\u062a \u0627\u0644\u0645\u0646\u0632\u0644\u064a\u0629", + "Playlists": "\u0642\u0648\u0627\u0626\u0645 \u0627\u0644\u062a\u0634\u063a\u064a\u0644", + "HeaderRecordingGroups": "\u0645\u062c\u0645\u0648\u0639\u0627\u062a \u0627\u0644\u062a\u0633\u062c\u064a\u0644", + "HeaderContinueWatching": "\u0627\u0633\u062a\u0626\u0646\u0627\u0641 \u0627\u0644\u0645\u0634\u0627\u0647\u062f\u0629", + "HeaderFavoriteArtists": "\u0627\u0644\u0641\u0646\u0627\u0646\u0648\u0646 \u0627\u0644\u0645\u0641\u0636\u0644\u0648\u0646", + "HeaderFavoriteSongs": "\u0627\u0644\u0623\u063a\u0627\u0646\u064a \u0627\u0644\u0645\u0641\u0636\u0644\u0629", + "HeaderAlbumArtists": "\u0641\u0646\u0627\u0646\u0648 \u0627\u0644\u0623\u0644\u0628\u0648\u0645\u0627\u062a", + "HeaderFavoriteAlbums": "\u0627\u0644\u0623\u0644\u0628\u0648\u0645\u0627\u062a \u0627\u0644\u0645\u0641\u0636\u0644\u0629", + "HeaderFavoriteEpisodes": "\u0627\u0644\u062d\u0644\u0642\u0627\u062a \u0627\u0644\u0645\u0641\u0636\u0644\u0629", + "HeaderFavoriteShows": "\u0627\u0644\u0645\u0633\u0644\u0633\u0644\u0627\u062a \u0627\u0644\u0645\u0641\u0636\u0644\u0629", + "HeaderNextUp": "\u0627\u0644\u062a\u0634\u063a\u064a\u0644 \u0627\u0644\u062a\u0627\u0644\u064a", + "Favorites": "\u0627\u0644\u0645\u0641\u0636\u0644\u0627\u062a", + "Collections": "\u0627\u0644\u0645\u062c\u0627\u0645\u064a\u0639", + "Channels": "\u0627\u0644\u0642\u0646\u0648\u0627\u062a", + "Movies": "\u0627\u0644\u0623\u0641\u0644\u0627\u0645", + "Albums": "\u0627\u0644\u0623\u0644\u0628\u0648\u0645\u0627\u062a", + "Artists": "\u0627\u0644\u0641\u0646\u0627\u0646\u0648\u0646", + "Folders": "\u0627\u0644\u0645\u062c\u0644\u062f\u0627\u062a", + "Songs": "\u0627\u0644\u0623\u063a\u0627\u0646\u064a", + "TvShows": "TV Shows", + "Shows": "Shows", + "Genres": "\u0623\u0646\u0648\u0627\u0639 \u0627\u0644\u0623\u0641\u0644\u0627\u0645", + "NameSeasonNumber": "\u0627\u0644\u0645\u0648\u0633\u0645 {0}", + "AppDeviceValues": "\u0627\u0644\u062a\u0637\u0628\u064a\u0642: {0}. \u0627\u0644\u062c\u0647\u0627\u0632: {1}.", + "UserDownloadingItemWithValues": "{0} \u064a\u0642\u0648\u0645 \u0628\u0625\u0646\u0632\u0627\u0644 {1}", + "HeaderLiveTV": "\u0627\u0644\u062a\u0644\u0641\u0627\u0632 \u0627\u0644\u0645\u0628\u0627\u0634\u0631", + "ChapterNameValue": "\u0627\u0644\u0628\u0627\u0628 {0}", + "ScheduledTaskFailedWithName": "\u0627\u0644\u0639\u0645\u0644\u064a\u0629 {0} \u0641\u0634\u0644\u062a", + "LabelRunningTimeValue": "\u0648\u0642\u062a \u0627\u0644\u062a\u0634\u063a\u064a\u0644: {0}", + "ScheduledTaskStartedWithName": "\u062a\u0645 \u0628\u062f\u0621 {0}", + "VersionNumber": "\u0627\u0644\u0625\u0635\u062f\u0627\u0631 \u0631\u0642\u0645 {0}", + "PluginInstalledWithName": "\u062a\u0645 \u062a\u062b\u0628\u064a\u062a {0}", + "StartupEmbyServerIsLoading": "\u062e\u0627\u062f\u0645 \u0623\u0645\u0628\u064a \u0642\u064a\u062f \u0627\u0644\u062a\u062d\u0645\u064a\u0644. \u0627\u0644\u0631\u062c\u0627\u0621 \u0627\u0644\u0645\u062d\u0627\u0648\u064a\u0629 \u0628\u0639\u062f \u062d\u064a\u0646", + "PluginUpdatedWithName": "\u062a\u0645 \u062a\u062d\u062f\u064a\u062b {0}", + "PluginUninstalledWithName": "\u062a\u0645\u062a \u0625\u0632\u0627\u0644\u0629 {0}", + "ItemAddedWithName": "\u062a\u0645 \u0625\u0636\u0627\u0641\u0629 {0} \u0644\u0644\u0645\u0643\u062a\u0628\u0629", + "ItemRemovedWithName": "\u062a\u0645 \u0625\u0632\u0627\u0644\u0629 {0} \u0645\u0646 \u0627\u0644\u0645\u0643\u062a\u0628\u0629", + "LabelIpAddressValue": "\u0639\u0646\u0648\u0627\u0646 \u0627\u0644\u0622\u064a \u0628\u064a: {0}", + "DeviceOnlineWithName": "{0} \u0645\u062a\u0635\u0644", + "UserOnlineFromDevice": "{0} \u0645\u062a\u0635\u0644\u0629 \u0639\u0628\u0631 {1}", + "ProviderValue": "\u0627\u0644\u0645\u0632\u0648\u062f: {0}", + "SubtitlesDownloadedForItem": "\u062a\u0645 \u0625\u0646\u0632\u0627\u0644 \u0627\u0644\u062a\u0631\u062c\u0645\u0627\u062a \u0644\u0640 {0}", + "UserCreatedWithName": "\u062a\u0645 \u0625\u0646\u0634\u0627\u0621 \u0627\u0644\u0645\u0633\u062a\u062e\u062f\u0645 {0}", + "UserPasswordChangedWithName": "\u062a\u0645 \u062a\u063a\u064a\u064a\u0631 \u0643\u0644\u0645\u0629 \u0627\u0644\u0633\u0631 \u0644\u0644\u0645\u0633\u062a\u062e\u062f\u0645 {0}", + "UserDeletedWithName": "\u062a\u0645 \u062d\u0630\u0641 \u0627\u0644\u0645\u0633\u062a\u062e\u062f\u0645 {0}", + "UserConfigurationUpdatedWithName": "\u0625\u0639\u062f\u0627\u062f\u0627\u062a \u0627\u0644\u0645\u0633\u062a\u062e\u062f\u0645 \u062a\u0645 \u062a\u062d\u062f\u064a\u062b\u0647\u0627 \u0644\u0640 {0}", + "MessageServerConfigurationUpdated": "\u062a\u0645 \u062a\u062d\u062f\u064a\u062b \u0625\u0639\u062f\u0627\u062f\u0627\u062a \u0627\u0644\u062e\u0627\u062f\u0645", + "MessageNamedServerConfigurationUpdatedWithValue": "\u062a\u0645 \u062a\u062d\u062f\u064a\u062b \u0625\u0639\u062f\u0627\u062f\u0627\u062a \u0627\u0644\u062e\u0627\u062f\u0645 \u0641\u064a \u0642\u0633\u0645 {0}", + "MessageApplicationUpdated": "\u0644\u0642\u062f \u062a\u0645 \u062a\u062d\u062f\u064a\u062b \u062e\u0627\u062f\u0645 \u0623\u0645\u0628\u064a", + "FailedLoginAttemptWithUserName": "\u0639\u0645\u0644\u064a\u0629 \u062a\u0633\u062c\u064a\u0644 \u0627\u0644\u062f\u062e\u0648\u0644 \u0641\u0634\u0644\u062a \u0645\u0646 {0}", + "AuthenticationSucceededWithUserName": "\u062a\u0645 \u0627\u0644\u062a\u0623\u0643\u062f \u0645\u0646 {0} \u0628\u0646\u062c\u0627\u062d", + "UserOfflineFromDevice": "\u062a\u0645 \u0642\u0637\u0639 \u0627\u062a\u0635\u0627\u0644 {0} \u0645\u0646 {1}", + "DeviceOfflineWithName": "\u062a\u0645 \u0642\u0637\u0639 \u0627\u0644\u0627\u062a\u0635\u0627\u0644 \u0628\u0640{0}", + "UserStartedPlayingItemWithValues": "\u0642\u0627\u0645 {0} \u0628\u0628\u062f\u0621 \u062a\u0634\u063a\u064a\u0644 {1}", + "UserStoppedPlayingItemWithValues": "\u0642\u0627\u0645 {0} \u0628\u0625\u064a\u0642\u0627\u0641 \u062a\u0634\u063a\u064a\u0644 {1}", + "NotificationOptionPluginError": "\u0641\u0634\u0644 \u0641\u064a \u0627\u0644\u0645\u0644\u062d\u0642", + "NotificationOptionApplicationUpdateAvailable": "\u064a\u0648\u062c\u062f \u062a\u062d\u062f\u064a\u062b \u0644\u0644\u062a\u0637\u0628\u064a\u0642", + "NotificationOptionApplicationUpdateInstalled": "\u062a\u0645 \u062a\u062d\u062f\u064a\u062b \u0627\u0644\u062a\u0637\u0628\u064a\u0642", + "NotificationOptionPluginUpdateInstalled": "\u062a\u0645 \u062a\u062d\u062f\u064a\u062b \u0627\u0644\u0645\u0644\u062d\u0642", + "NotificationOptionPluginInstalled": "\u062a\u0645 \u062a\u062b\u0628\u064a\u062a \u0627\u0644\u0645\u0644\u062d\u0642", + "NotificationOptionPluginUninstalled": "\u062a\u0645\u062a \u0625\u0632\u0627\u0644\u0629 \u0627\u0644\u0645\u0644\u062d\u0642", + "NotificationOptionVideoPlayback": "\u0628\u062f\u0623 \u062a\u0634\u063a\u064a\u0644 \u0627\u0644\u0641\u064a\u062f\u064a\u0648", + "NotificationOptionAudioPlayback": "\u0628\u062f\u0623 \u062a\u0634\u063a\u064a\u0644 \u0627\u0644\u0645\u0642\u0637\u0639 \u0627\u0644\u0635\u0648\u062a\u064a", + "NotificationOptionGamePlayback": "\u062a\u0645 \u062a\u0634\u063a\u064a\u0644 \u0627\u0644\u0644\u0639\u0628\u0629", + "NotificationOptionVideoPlaybackStopped": "\u062a\u0645 \u0625\u064a\u0642\u0627\u0641 \u062a\u0634\u063a\u064a\u0644 \u0627\u0644\u0641\u064a\u062f\u064a\u0648", + "NotificationOptionAudioPlaybackStopped": "\u062a\u0645 \u0625\u064a\u0642\u0627\u0641 \u062a\u0634\u063a\u064a\u0644 \u0627\u0644\u0645\u0642\u0637\u0639 \u0627\u0644\u0635\u0648\u062a\u064a", + "NotificationOptionGamePlaybackStopped": "\u062a\u0645 \u0625\u064a\u0642\u0627\u0641 \u062a\u0634\u063a\u064a\u0644 \u0627\u0644\u0644\u0639\u0628\u0629", + "NotificationOptionTaskFailed": "\u0641\u0634\u0644 \u0641\u064a \u0627\u0644\u0645\u0647\u0645\u0629 \u0627\u0644\u0645\u062c\u062f\u0648\u0644\u0629", + "NotificationOptionInstallationFailed": "\u0639\u0645\u0644\u064a\u0629 \u0627\u0644\u062a\u0646\u0635\u064a\u0628 \u0641\u0634\u0644\u062a", + "NotificationOptionNewLibraryContent": "\u062a\u0645 \u0625\u0636\u0627\u0641\u0629 \u0645\u062d\u062a\u0648\u0649 \u062c\u062f\u064a\u062f", + "NotificationOptionCameraImageUploaded": "\u062a\u0645 \u0631\u0642\u0639 \u0635\u0648\u0631\u0629 \u0627\u0644\u0643\u0627\u0645\u064a\u0631\u0627", + "NotificationOptionUserLockedOut": "\u062a\u0645 \u0625\u0642\u0641\u0627\u0644 \u062d\u0633\u0627\u0628 \u0627\u0644\u0645\u0633\u062a\u062e\u062f\u0645", + "NotificationOptionServerRestartRequired": "\u064a\u062c\u0628 \u0625\u0639\u0627\u062f\u0629 \u062a\u0634\u063a\u064a\u0644 \u0627\u0644\u062e\u0627\u062f\u0645", + "UserLockedOutWithName": "\u0627\u0644\u0645\u0633\u062a\u062e\u062f\u0645 {0} \u062a\u0645 \u0645\u0646\u0639\u0647 \u0645\u0646 \u0627\u0644\u062f\u062e\u0648\u0644", + "SubtitleDownloadFailureForItem": "\u0639\u0645\u0644\u064a\u0629 \u0625\u0646\u0632\u0627\u0644 \u0627\u0644\u062a\u0631\u062c\u0645\u0629 \u0641\u0634\u0644\u062a \u0644\u0640{0}", + "Sync": "\u0645\u0632\u0627\u0645\u0646\u0629", + "User": "\u0627\u0644\u0645\u0633\u062a\u062e\u062f\u0645", + "System": "\u0627\u0644\u0646\u0638\u0627\u0645", + "Application": "\u0627\u0644\u062a\u0637\u0628\u064a\u0642", + "Plugin": "\u0627\u0644\u0645\u0644\u062d\u0642", "LabelExit": "\u062e\u0631\u0648\u062c", "LabelVisitCommunity": "\u0632\u064a\u0627\u0631\u0629 \u0627\u0644\u0645\u062c\u062a\u0645\u0639", - "LabelGithub": "\u062c\u064a\u062a \u0647\u0628", - "LabelApiDocumentation": "\u0645\u0639\u0644\u0648\u0645\u0627\u062a \u0645\u062f\u062e\u0644 \u0628\u0631\u0645\u062c\u0629 \u0627\u0644\u062a\u0637\u0628\u064a\u0642", - "LabelDeveloperResources": "\u0645\u0643\u062a\u0628\u0629 \u0627\u0644\u0645\u0628\u0631\u0645\u062c", "LabelBrowseLibrary": "\u062a\u0635\u0641\u062d \u0627\u0644\u0645\u0643\u062a\u0628\u0629", - "LabelConfigureServer": "\u0625\u0639\u062f\u0627\u062f \u0625\u0645\u0628\u064a", - "LabelRestartServer": "\u0627\u0639\u0627\u062f\u0629 \u062a\u0634\u063a\u064a\u0644 \u0627\u0644\u062e\u0627\u062f\u0645", - "CategorySync": "Sync", - "CategoryUser": "User", - "CategorySystem": "System", - "CategoryApplication": "Application", - "CategoryPlugin": "Plugin", - "NotificationOptionPluginError": "Plugin failure", - "NotificationOptionApplicationUpdateAvailable": "Application update available", - "NotificationOptionApplicationUpdateInstalled": "Application update installed", - "NotificationOptionPluginUpdateInstalled": "Plugin update installed", - "NotificationOptionPluginInstalled": "Plugin installed", - "NotificationOptionPluginUninstalled": "Plugin uninstalled", - "NotificationOptionVideoPlayback": "Video playback started", - "NotificationOptionAudioPlayback": "Audio playback started", - "NotificationOptionGamePlayback": "Game playback started", - "NotificationOptionVideoPlaybackStopped": "Video playback stopped", - "NotificationOptionAudioPlaybackStopped": "Audio playback stopped", - "NotificationOptionGamePlaybackStopped": "Game playback stopped", - "NotificationOptionTaskFailed": "Scheduled task failure", - "NotificationOptionInstallationFailed": "Installation failure", - "NotificationOptionNewLibraryContent": "New content added", - "NotificationOptionNewLibraryContentMultiple": "New content added (multiple)", - "NotificationOptionCameraImageUploaded": "Camera image uploaded", - "NotificationOptionUserLockedOut": "User locked out", - "NotificationOptionServerRestartRequired": "Server restart required", - "ViewTypePlaylists": "Playlists", - "ViewTypeMovies": "Movies", - "ViewTypeTvShows": "TV", - "ViewTypeGames": "Games", - "ViewTypeMusic": "Music", - "ViewTypeMusicGenres": "Genres", - "ViewTypeMusicArtists": "Artists", - "ViewTypeBoxSets": "Collections", - "ViewTypeChannels": "Channels", - "ViewTypeLiveTV": "Live TV", - "ViewTypeLiveTvNowPlaying": "Now Airing", - "ViewTypeLatestGames": "Latest Games", - "ViewTypeRecentlyPlayedGames": "Recently Played", - "ViewTypeGameFavorites": "Favorites", - "ViewTypeGameSystems": "Game Systems", - "ViewTypeGameGenres": "Genres", - "ViewTypeTvResume": "Resume", - "ViewTypeTvNextUp": "Next Up", - "ViewTypeTvLatest": "Latest", - "ViewTypeTvShowSeries": "Series", - "ViewTypeTvGenres": "Genres", - "ViewTypeTvFavoriteSeries": "Favorite Series", - "ViewTypeTvFavoriteEpisodes": "Favorite Episodes", - "ViewTypeMovieResume": "Resume", - "ViewTypeMovieLatest": "Latest", - "ViewTypeMovieMovies": "Movies", - "ViewTypeMovieCollections": "Collections", - "ViewTypeMovieFavorites": "Favorites", - "ViewTypeMovieGenres": "Genres", - "ViewTypeMusicLatest": "Latest", - "ViewTypeMusicPlaylists": "Playlists", - "ViewTypeMusicAlbums": "Albums", - "ViewTypeMusicAlbumArtists": "Album Artists", - "HeaderOtherDisplaySettings": "Display Settings", - "ViewTypeMusicSongs": "Songs", - "ViewTypeMusicFavorites": "Favorites", - "ViewTypeMusicFavoriteAlbums": "Favorite Albums", - "ViewTypeMusicFavoriteArtists": "Favorite Artists", - "ViewTypeMusicFavoriteSongs": "Favorite Songs", - "ViewTypeFolders": "Folders", - "ViewTypeLiveTvRecordingGroups": "Recordings", - "ViewTypeLiveTvChannels": "Channels", - "ScheduledTaskFailedWithName": "{0} failed", - "LabelRunningTimeValue": "Running time: {0}", - "ScheduledTaskStartedWithName": "{0} started", - "VersionNumber": "Version {0}", - "PluginInstalledWithName": "{0} was installed", - "PluginUpdatedWithName": "{0} was updated", - "PluginUninstalledWithName": "{0} was uninstalled", - "ItemAddedWithName": "{0} was added to the library", - "ItemRemovedWithName": "{0} was removed from the library", - "LabelIpAddressValue": "Ip address: {0}", - "DeviceOnlineWithName": "{0} is connected", - "UserOnlineFromDevice": "{0} is online from {1}", - "ProviderValue": "Provider: {0}", - "SubtitlesDownloadedForItem": "Subtitles downloaded for {0}", - "UserConfigurationUpdatedWithName": "User configuration has been updated for {0}", - "UserCreatedWithName": "User {0} has been created", - "UserPasswordChangedWithName": "Password has been changed for user {0}", - "UserDeletedWithName": "User {0} has been deleted", - "MessageServerConfigurationUpdated": "Server configuration has been updated", - "MessageNamedServerConfigurationUpdatedWithValue": "Server configuration section {0} has been updated", - "MessageApplicationUpdated": "Emby Server has been updated", - "FailedLoginAttemptWithUserName": "Failed login attempt from {0}", - "AuthenticationSucceededWithUserName": "{0} successfully authenticated", - "DeviceOfflineWithName": "{0} has disconnected", - "UserLockedOutWithName": "User {0} has been locked out", - "UserOfflineFromDevice": "{0} has disconnected from {1}", - "UserStartedPlayingItemWithValues": "{0} has started playing {1}", - "UserStoppedPlayingItemWithValues": "{0} has stopped playing {1}", - "SubtitleDownloadFailureForItem": "Subtitles failed to download for {0}", - "HeaderUnidentified": "Unidentified", - "HeaderImagePrimary": "Primary", - "HeaderImageBackdrop": "Backdrop", - "HeaderImageLogo": "Logo", - "HeaderUserPrimaryImage": "User Image", - "HeaderOverview": "Overview", - "HeaderShortOverview": "Short Overview", - "HeaderType": "Type", - "HeaderSeverity": "Severity", - "HeaderUser": "User", - "HeaderName": "Name", - "HeaderDate": "Date", - "HeaderPremiereDate": "Premiere Date", - "HeaderDateAdded": "Date Added", - "HeaderReleaseDate": "Release date", - "HeaderRuntime": "Runtime", - "HeaderPlayCount": "Play Count", - "HeaderSeason": "Season", - "HeaderSeasonNumber": "Season number", - "HeaderSeries": "Series:", - "HeaderNetwork": "Network", - "HeaderYear": "Year:", - "HeaderYears": "Years:", - "HeaderParentalRating": "Parental Rating", - "HeaderCommunityRating": "Community rating", - "HeaderTrailers": "Trailers", - "HeaderSpecials": "Specials", - "HeaderGameSystems": "Game Systems", - "HeaderPlayers": "Players:", - "HeaderAlbumArtists": "Album Artists", - "HeaderAlbums": "Albums", - "HeaderDisc": "Disc", - "HeaderTrack": "Track", - "HeaderAudio": "Audio", - "HeaderVideo": "Video", - "HeaderEmbeddedImage": "Embedded image", - "HeaderResolution": "Resolution", - "HeaderSubtitles": "Subtitles", - "HeaderGenres": "Genres", - "HeaderCountries": "Countries", - "HeaderStatus": "Status", - "HeaderTracks": "Tracks", - "HeaderMusicArtist": "Music artist", - "HeaderLocked": "Locked", - "HeaderStudios": "Studios", - "HeaderActor": "Actors", - "HeaderComposer": "Composers", - "HeaderDirector": "Directors", - "HeaderGuestStar": "Guest star", - "HeaderProducer": "Producers", - "HeaderWriter": "Writers", - "HeaderParentalRatings": "Parental Ratings", - "HeaderCommunityRatings": "Community ratings", - "StartupEmbyServerIsLoading": "Emby Server is loading. Please try again shortly." + "LabelConfigureServer": "\u0636\u0628\u0637 \u0625\u0639\u062f\u0627\u062f\u0627\u062a \u0623\u0645\u0628\u064a", + "LabelRestartServer": "\u0625\u0639\u0627\u062f\u0629 \u062a\u0634\u063a\u064a\u0644 \u0627\u0644\u062e\u0627\u062f\u0645" }
\ No newline at end of file diff --git a/Emby.Server.Implementations/Localization/Core/bg-BG.json b/Emby.Server.Implementations/Localization/Core/bg-BG.json index 22b99408d..40899caab 100644 --- a/Emby.Server.Implementations/Localization/Core/bg-BG.json +++ b/Emby.Server.Implementations/Localization/Core/bg-BG.json @@ -1,104 +1,48 @@ { - "DbUpgradeMessage": "Please wait while your Emby Server database is upgraded. {0}% complete.", + "Latest": "\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438", + "ValueSpecialEpisodeName": "\u0421\u043f\u0435\u0446\u0438\u0430\u043b\u043d\u0438 - {0}", + "Inherit": "Inherit", + "Books": "\u041a\u043d\u0438\u0433\u0438", + "Music": "\u041c\u0443\u0437\u0438\u043a\u0430", + "Games": "\u0418\u0433\u0440\u0438", + "Photos": "\u0421\u043d\u0438\u043c\u043a\u0438", + "MixedContent": "Mixed content", + "MusicVideos": "\u041c\u0443\u0437\u0438\u043a\u0430\u043b\u043d\u0438 \u043a\u043b\u0438\u043f\u043e\u0432\u0435", + "HomeVideos": "\u0414\u043e\u043c\u0430\u0448\u043d\u0438 \u043a\u043b\u0438\u043f\u043e\u0432\u0435", + "Playlists": "\u0421\u043f\u0438\u0441\u044a\u0446\u0438", + "HeaderRecordingGroups": "Recording Groups", + "HeaderContinueWatching": "\u041f\u0440\u043e\u0434\u044a\u043b\u0436\u0430\u0432\u0430\u043d\u0435 \u043d\u0430 \u0433\u043b\u0435\u0434\u0430\u043d\u0435\u0442\u043e", + "HeaderFavoriteArtists": "\u041b\u044e\u0431\u0438\u043c\u0438 \u0438\u0437\u043f\u044a\u043b\u043d\u0438\u0442\u0435\u043b\u0438", + "HeaderFavoriteSongs": "\u041b\u044e\u0431\u0438\u043c\u0438 \u043f\u0435\u0441\u043d\u0438", + "HeaderAlbumArtists": "\u0418\u0437\u043f\u044a\u043b\u043d\u0438\u0442\u0435\u043b\u0438 \u043d\u0430 \u0430\u043b\u0431\u0443\u043c\u0438", + "HeaderFavoriteAlbums": "\u041b\u044e\u0431\u0438\u043c\u0438 \u0430\u043b\u0431\u0443\u043c\u0438", + "HeaderFavoriteEpisodes": "\u041b\u044e\u0431\u0438\u043c\u0438 \u0435\u043f\u0438\u0437\u043e\u0434\u0438", + "HeaderFavoriteShows": "Favorite Shows", + "HeaderNextUp": "Next Up", + "Favorites": "\u041b\u044e\u0431\u0438\u043c\u0438", + "Collections": "\u041a\u043e\u043b\u0435\u043a\u0446\u0438\u0438", + "Channels": "\u041a\u0430\u043d\u0430\u043b\u0438", + "Movies": "\u0424\u0438\u043b\u043c\u0438", + "Albums": "\u0410\u043b\u0431\u0443\u043c\u0438", + "Artists": "\u0418\u0437\u043f\u044a\u043b\u043d\u0438\u0442\u0435\u043b\u0438", + "Folders": "\u041f\u0430\u043f\u043a\u0438", + "Songs": "\u041f\u0435\u0441\u043d\u0438", + "TvShows": "TV Shows", + "Shows": "\u0421\u0435\u0440\u0438\u0430\u043b\u0438", + "Genres": "\u0416\u0430\u043d\u0440\u043e\u0432\u0435", + "NameSeasonNumber": "\u0421\u0435\u0437\u043e\u043d {0}", "AppDeviceValues": "App: {0}, Device: {1}", "UserDownloadingItemWithValues": "{0} is downloading {1}", - "FolderTypeMixed": "\u0421\u043c\u0435\u0441\u0435\u043d\u043e \u0441\u044a\u0434\u044a\u0440\u0436\u0430\u043d\u0438\u0435", - "FolderTypeMovies": "\u0424\u0438\u043b\u043c\u0438", - "FolderTypeMusic": "\u041c\u0443\u0437\u0438\u043a\u0430", - "FolderTypeAdultVideos": "\u041a\u043b\u0438\u043f\u043e\u0432\u0435 \u0437\u0430 \u0432\u044a\u0437\u0440\u0430\u0441\u0442\u043d\u0438", - "FolderTypePhotos": "\u0421\u043d\u0438\u043c\u043a\u0438", - "FolderTypeMusicVideos": "\u041c\u0443\u0437\u0438\u043a\u0430\u043b\u043d\u0438 \u043a\u043b\u0438\u043f\u043e\u0432\u0435", - "FolderTypeHomeVideos": "\u0414\u043e\u043c\u0430\u0448\u043d\u0438 \u043a\u043b\u0438\u043f\u043e\u0432\u0435", - "FolderTypeGames": "\u0418\u0433\u0440\u0438", - "FolderTypeBooks": "\u041a\u043d\u0438\u0433\u0438", - "FolderTypeTvShows": "TV", - "FolderTypeInherit": "\u041d\u0430\u0441\u043b\u0435\u0434\u0438", - "HeaderCastCrew": "\u0415\u043a\u0438\u043f", - "HeaderPeople": "People", - "ValueSpecialEpisodeName": "Special - {0}", - "LabelChapterName": "Chapter {0}", - "NameSeasonNumber": "Season {0}", - "LabelExit": "\u0418\u0437\u0445\u043e\u0434", - "LabelVisitCommunity": "\u041f\u043e\u0441\u0435\u0442\u0438 \u043e\u0431\u0449\u0435\u0441\u0442\u0432\u043e\u0442\u043e", - "LabelGithub": "Github", - "LabelApiDocumentation": "API \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f", - "LabelDeveloperResources": "\u0420\u0435\u0441\u0443\u0440\u0441\u0438 \u0437\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u0446\u0438", - "LabelBrowseLibrary": "\u0420\u0430\u0437\u0433\u043b\u0435\u0434\u0430\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430\u0442\u0430", - "LabelConfigureServer": "\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u0430\u0439 Emby", - "LabelRestartServer": "\u0420\u0435\u0441\u0442\u0430\u0440\u0442\u0438\u0440\u0430\u0439 \u0441\u044a\u0440\u0432\u044a\u0440\u0430", - "CategorySync": "\u0421\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437.", - "CategoryUser": "User", - "CategorySystem": "System", - "CategoryApplication": "Application", - "CategoryPlugin": "Plugin", - "NotificationOptionPluginError": "Plugin failure", - "NotificationOptionApplicationUpdateAvailable": "Application update available", - "NotificationOptionApplicationUpdateInstalled": "Application update installed", - "NotificationOptionPluginUpdateInstalled": "Plugin update installed", - "NotificationOptionPluginInstalled": "Plugin installed", - "NotificationOptionPluginUninstalled": "Plugin uninstalled", - "NotificationOptionVideoPlayback": "Video playback started", - "NotificationOptionAudioPlayback": "Audio playback started", - "NotificationOptionGamePlayback": "Game playback started", - "NotificationOptionVideoPlaybackStopped": "Video playback stopped", - "NotificationOptionAudioPlaybackStopped": "Audio playback stopped", - "NotificationOptionGamePlaybackStopped": "Game playback stopped", - "NotificationOptionTaskFailed": "Scheduled task failure", - "NotificationOptionInstallationFailed": "Installation failure", - "NotificationOptionNewLibraryContent": "New content added", - "NotificationOptionNewLibraryContentMultiple": "New content added (multiple)", - "NotificationOptionCameraImageUploaded": "Camera image uploaded", - "NotificationOptionUserLockedOut": "User locked out", - "NotificationOptionServerRestartRequired": "Server restart required", - "ViewTypePlaylists": "Playlists", - "ViewTypeMovies": "Movies", - "ViewTypeTvShows": "TV", - "ViewTypeGames": "Games", - "ViewTypeMusic": "Music", - "ViewTypeMusicGenres": "Genres", - "ViewTypeMusicArtists": "Artists", - "ViewTypeBoxSets": "Collections", - "ViewTypeChannels": "Channels", - "ViewTypeLiveTV": "Live TV", - "ViewTypeLiveTvNowPlaying": "Now Airing", - "ViewTypeLatestGames": "Latest Games", - "ViewTypeRecentlyPlayedGames": "Recently Played", - "ViewTypeGameFavorites": "Favorites", - "ViewTypeGameSystems": "Game Systems", - "ViewTypeGameGenres": "Genres", - "ViewTypeTvResume": "Resume", - "ViewTypeTvNextUp": "Next Up", - "ViewTypeTvLatest": "Latest", - "ViewTypeTvShowSeries": "Series", - "ViewTypeTvGenres": "Genres", - "ViewTypeTvFavoriteSeries": "Favorite Series", - "ViewTypeTvFavoriteEpisodes": "Favorite Episodes", - "ViewTypeMovieResume": "Resume", - "ViewTypeMovieLatest": "Latest", - "ViewTypeMovieMovies": "Movies", - "ViewTypeMovieCollections": "Collections", - "ViewTypeMovieFavorites": "Favorites", - "ViewTypeMovieGenres": "Genres", - "ViewTypeMusicLatest": "Latest", - "ViewTypeMusicPlaylists": "Playlists", - "ViewTypeMusicAlbums": "Albums", - "ViewTypeMusicAlbumArtists": "Album Artists", - "HeaderOtherDisplaySettings": "Display Settings", - "ViewTypeMusicSongs": "Songs", - "ViewTypeMusicFavorites": "Favorites", - "ViewTypeMusicFavoriteAlbums": "Favorite Albums", - "ViewTypeMusicFavoriteArtists": "Favorite Artists", - "ViewTypeMusicFavoriteSongs": "Favorite Songs", - "ViewTypeFolders": "Folders", - "ViewTypeLiveTvRecordingGroups": "Recordings", - "ViewTypeLiveTvChannels": "Channels", + "HeaderLiveTV": "Live TV", + "ChapterNameValue": "Chapter {0}", "ScheduledTaskFailedWithName": "{0} failed", "LabelRunningTimeValue": "Running time: {0}", - "ScheduledTaskStartedWithName": "{0} started", - "VersionNumber": "\u0412\u0435\u0440\u0441\u0438\u044f {0}", + "ScheduledTaskStartedWithName": "{0} \u0437\u0430\u043f\u043e\u0447\u043d\u0430", + "VersionNumber": "Version {0}", "PluginInstalledWithName": "{0} was installed", + "StartupEmbyServerIsLoading": "Emby Server is loading. Please try again shortly.", "PluginUpdatedWithName": "{0} was updated", - "PluginUninstalledWithName": "{0} was uninstalled", + "PluginUninstalledWithName": "{0} \u0435 \u0434\u0435\u0438\u043d\u0441\u0442\u0430\u043b\u0438\u0440\u0430\u043d\u043e", "ItemAddedWithName": "{0} was added to the library", "ItemRemovedWithName": "{0} was removed from the library", "LabelIpAddressValue": "Ip address: {0}", @@ -106,73 +50,47 @@ "UserOnlineFromDevice": "{0} is online from {1}", "ProviderValue": "Provider: {0}", "SubtitlesDownloadedForItem": "Subtitles downloaded for {0}", - "UserConfigurationUpdatedWithName": "User configuration has been updated for {0}", "UserCreatedWithName": "User {0} has been created", "UserPasswordChangedWithName": "Password has been changed for user {0}", "UserDeletedWithName": "User {0} has been deleted", + "UserConfigurationUpdatedWithName": "User configuration has been updated for {0}", "MessageServerConfigurationUpdated": "Server configuration has been updated", "MessageNamedServerConfigurationUpdatedWithValue": "Server configuration section {0} has been updated", - "MessageApplicationUpdated": "Emby \u0441\u044a\u0440\u0432\u044a\u0440\u044a\u0442 \u0431\u0435 \u043e\u0431\u043d\u043e\u0432\u0435\u043d.", + "MessageApplicationUpdated": "Emby Server has been updated", "FailedLoginAttemptWithUserName": "Failed login attempt from {0}", "AuthenticationSucceededWithUserName": "{0} successfully authenticated", - "DeviceOfflineWithName": "{0} has disconnected", - "UserLockedOutWithName": "User {0} has been locked out", "UserOfflineFromDevice": "{0} has disconnected from {1}", + "DeviceOfflineWithName": "{0} has disconnected", "UserStartedPlayingItemWithValues": "{0} has started playing {1}", "UserStoppedPlayingItemWithValues": "{0} has stopped playing {1}", + "NotificationOptionPluginError": "Plugin failure", + "NotificationOptionApplicationUpdateAvailable": "Application update available", + "NotificationOptionApplicationUpdateInstalled": "Application update installed", + "NotificationOptionPluginUpdateInstalled": "\u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435\u0442\u043e \u043d\u0430 \u043f\u0440\u0438\u0441\u0442\u0430\u0432\u043a\u0430\u0442\u0430 \u0435 \u0438\u043d\u0441\u0442\u0430\u043b\u0438\u0440\u0430\u043d\u043e", + "NotificationOptionPluginInstalled": "\u041f\u0440\u0438\u0441\u0442\u0430\u0432\u043a\u0430\u0442\u0430 \u0435 \u0438\u043d\u0441\u0442\u0430\u043b\u0438\u0440\u0430\u043d\u0430", + "NotificationOptionPluginUninstalled": "\u041f\u0440\u0438\u0441\u0442\u0430\u0432\u043a\u0430\u0442\u0430 \u0435 \u0434\u0435\u0438\u043d\u0441\u0442\u0430\u043b\u0438\u0440\u0430\u043d\u0430", + "NotificationOptionVideoPlayback": "Video playback started", + "NotificationOptionAudioPlayback": "Audio playback started", + "NotificationOptionGamePlayback": "Game playback started", + "NotificationOptionVideoPlaybackStopped": "Video playback stopped", + "NotificationOptionAudioPlaybackStopped": "Audio playback stopped", + "NotificationOptionGamePlaybackStopped": "Game playback stopped", + "NotificationOptionTaskFailed": "Scheduled task failure", + "NotificationOptionInstallationFailed": "Installation failure", + "NotificationOptionNewLibraryContent": "New content added", + "NotificationOptionCameraImageUploaded": "Camera image uploaded", + "NotificationOptionUserLockedOut": "User locked out", + "NotificationOptionServerRestartRequired": "\u041d\u0443\u0436\u043d\u043e \u0435 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e \u043f\u0443\u0441\u043a\u0430\u043d\u0435 \u043d\u0430 \u0441\u044a\u0440\u0432\u044a\u0440\u0430", + "UserLockedOutWithName": "User {0} has been locked out", "SubtitleDownloadFailureForItem": "Subtitles failed to download for {0}", - "HeaderUnidentified": "Unidentified", - "HeaderImagePrimary": "Primary", - "HeaderImageBackdrop": "Backdrop", - "HeaderImageLogo": "Logo", - "HeaderUserPrimaryImage": "User Image", - "HeaderOverview": "Overview", - "HeaderShortOverview": "Short Overview", - "HeaderType": "Type", - "HeaderSeverity": "Severity", - "HeaderUser": "User", - "HeaderName": "Name", - "HeaderDate": "Date", - "HeaderPremiereDate": "Premiere Date", - "HeaderDateAdded": "Date Added", - "HeaderReleaseDate": "Release date", - "HeaderRuntime": "Runtime", - "HeaderPlayCount": "Play Count", - "HeaderSeason": "Season", - "HeaderSeasonNumber": "Season number", - "HeaderSeries": "Series:", - "HeaderNetwork": "Network", - "HeaderYear": "Year:", - "HeaderYears": "Years:", - "HeaderParentalRating": "Parental Rating", - "HeaderCommunityRating": "Community rating", - "HeaderTrailers": "Trailers", - "HeaderSpecials": "Specials", - "HeaderGameSystems": "Game Systems", - "HeaderPlayers": "Players:", - "HeaderAlbumArtists": "Album Artists", - "HeaderAlbums": "Albums", - "HeaderDisc": "Disc", - "HeaderTrack": "Track", - "HeaderAudio": "\u0410\u0443\u0434\u0438\u043e", - "HeaderVideo": "\u0412\u0438\u0434\u0435\u043e", - "HeaderEmbeddedImage": "Embedded image", - "HeaderResolution": "Resolution", - "HeaderSubtitles": "Subtitles", - "HeaderGenres": "Genres", - "HeaderCountries": "Countries", - "HeaderStatus": "\u0421\u044a\u0441\u0442\u043e\u044f\u043d\u0438\u0435:", - "HeaderTracks": "Tracks", - "HeaderMusicArtist": "Music artist", - "HeaderLocked": "Locked", - "HeaderStudios": "Studios", - "HeaderActor": "Actors", - "HeaderComposer": "Composers", - "HeaderDirector": "Directors", - "HeaderGuestStar": "Guest star", - "HeaderProducer": "Producers", - "HeaderWriter": "Writers", - "HeaderParentalRatings": "Parental Ratings", - "HeaderCommunityRatings": "Community ratings", - "StartupEmbyServerIsLoading": "Emby Server is loading. Please try again shortly." + "Sync": "\u0421\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u0430\u043d\u0435", + "User": "\u041f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b", + "System": "\u0421\u0438\u0441\u0442\u0435\u043c\u0430", + "Application": "Application", + "Plugin": "Plugin", + "LabelExit": "Exit", + "LabelVisitCommunity": "\u041f\u043e\u0441\u0435\u0442\u0435\u0442\u0435 \u043e\u0431\u0449\u043d\u043e\u0441\u0442\u0442\u0430", + "LabelBrowseLibrary": "\u0420\u0430\u0437\u0433\u043b\u0435\u0436\u0434\u0430\u043d\u0435 \u043d\u0430 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430\u0442\u0430", + "LabelConfigureServer": "\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u0430\u043d\u0435 \u043d\u0430 \u0415\u043c\u0431\u0438", + "LabelRestartServer": "\u041f\u043e\u0432\u0442\u043e\u0440\u043d\u043e \u043f\u0443\u0441\u043a\u0430\u043d\u0435 \u043d\u0430 \u0441\u044a\u0440\u0432\u044a\u0440\u0430" }
\ No newline at end of file diff --git a/Emby.Server.Implementations/Localization/Core/ca.json b/Emby.Server.Implementations/Localization/Core/ca.json index 7ca8e1553..cc2c00234 100644 --- a/Emby.Server.Implementations/Localization/Core/ca.json +++ b/Emby.Server.Implementations/Localization/Core/ca.json @@ -1,178 +1,96 @@ { - "DbUpgradeMessage": "Si et plau espera mentre la teva base de dades del Servidor Emby \u00e9s actualitzada. {0}% completat.", - "AppDeviceValues": "App: {0}, Dispositiu: {1}", - "UserDownloadingItemWithValues": "{0} est\u00e0 descarregant {1}", - "FolderTypeMixed": "Contingut barrejat", - "FolderTypeMovies": "Pel\u00b7l\u00edcules", - "FolderTypeMusic": "M\u00fasica", - "FolderTypeAdultVideos": "V\u00eddeos per adults", - "FolderTypePhotos": "Fotos", - "FolderTypeMusicVideos": "V\u00eddeos musicals", - "FolderTypeHomeVideos": "V\u00eddeos dom\u00e8stics", - "FolderTypeGames": "Jocs", - "FolderTypeBooks": "Llibres", - "FolderTypeTvShows": "TV", - "FolderTypeInherit": "Heretat", - "HeaderCastCrew": "Repartiment i Equip", - "HeaderPeople": "People", - "ValueSpecialEpisodeName": "Special - {0}", - "LabelChapterName": "Cap\u00edtol {0}", - "NameSeasonNumber": "Temporada {0}", - "LabelExit": "Sortir", - "LabelVisitCommunity": "Visita la Comunitat", - "LabelGithub": "Github", - "LabelApiDocumentation": "Documentaci\u00f3 de l'API", - "LabelDeveloperResources": "Recursos per a Desenvolupadors", - "LabelBrowseLibrary": "Examina la Biblioteca", - "LabelConfigureServer": "Configura Emby", - "LabelRestartServer": "Reiniciar Servidor", - "CategorySync": "Sync", - "CategoryUser": "Usuari", - "CategorySystem": "Sistema", - "CategoryApplication": "Aplicaci\u00f3", - "CategoryPlugin": "Complement", - "NotificationOptionPluginError": "Plugin failure", - "NotificationOptionApplicationUpdateAvailable": "Actualitzaci\u00f3 d'aplicaci\u00f3 disponible", - "NotificationOptionApplicationUpdateInstalled": "Actualitzaci\u00f3 d'aplicaci\u00f3 instal\u00b7lada", - "NotificationOptionPluginUpdateInstalled": "Actualitzaci\u00f3 de complement instal\u00b7lada", - "NotificationOptionPluginInstalled": "Complement instal\u00b7lat", - "NotificationOptionPluginUninstalled": "Complement desinstal\u00b7lat", - "NotificationOptionVideoPlayback": "Reproducci\u00f3 de v\u00eddeo iniciada", - "NotificationOptionAudioPlayback": "Reproducci\u00f3 d'\u00e0udio iniciada", - "NotificationOptionGamePlayback": "Game playback started", - "NotificationOptionVideoPlaybackStopped": "Reproducci\u00f3 de v\u00eddeo aturada", - "NotificationOptionAudioPlaybackStopped": "Reproducci\u00f3 d'\u00e0udio aturada", - "NotificationOptionGamePlaybackStopped": "Game playback stopped", - "NotificationOptionTaskFailed": "Tasca programada fallida", - "NotificationOptionInstallationFailed": "Instal\u00b7laci\u00f3 fallida", - "NotificationOptionNewLibraryContent": "Nou contingut afegit", - "NotificationOptionNewLibraryContentMultiple": "Nous continguts afegits", - "NotificationOptionCameraImageUploaded": "Camera image uploaded", - "NotificationOptionUserLockedOut": "Usuari blocat", - "NotificationOptionServerRestartRequired": "Cal reiniciar el servidor", - "ViewTypePlaylists": "Llistes de reproducci\u00f3", - "ViewTypeMovies": "Pel\u00b7l\u00edcules", - "ViewTypeTvShows": "TV", - "ViewTypeGames": "Jocs", - "ViewTypeMusic": "M\u00fasica", - "ViewTypeMusicGenres": "G\u00e8neres", - "ViewTypeMusicArtists": "Artistes", - "ViewTypeBoxSets": "Col\u00b7leccions", - "ViewTypeChannels": "Canals", - "ViewTypeLiveTV": "TV en Directe", - "ViewTypeLiveTvNowPlaying": "Now Airing", - "ViewTypeLatestGames": "Darrers Jocs", - "ViewTypeRecentlyPlayedGames": "Reprodu\u00eft Recentment", - "ViewTypeGameFavorites": "Preferits", - "ViewTypeGameSystems": "Sistemes de Jocs", - "ViewTypeGameGenres": "G\u00e8neres", - "ViewTypeTvResume": "Resume", - "ViewTypeTvNextUp": "A Continuaci\u00f3", - "ViewTypeTvLatest": "Darrers", - "ViewTypeTvShowSeries": "S\u00e8ries:", - "ViewTypeTvGenres": "G\u00e8neres", - "ViewTypeTvFavoriteSeries": "S\u00e8ries Preferides", - "ViewTypeTvFavoriteEpisodes": "Episodis Preferits", - "ViewTypeMovieResume": "Resume", - "ViewTypeMovieLatest": "Darrers", - "ViewTypeMovieMovies": "Pel\u00b7l\u00edcules", - "ViewTypeMovieCollections": "Col\u00b7leccions", - "ViewTypeMovieFavorites": "Preferides", - "ViewTypeMovieGenres": "G\u00e8neres", - "ViewTypeMusicLatest": "Novetats", - "ViewTypeMusicPlaylists": "Llistes de reproducci\u00f3", - "ViewTypeMusicAlbums": "\u00c0lbums", - "ViewTypeMusicAlbumArtists": "Album Artists", - "HeaderOtherDisplaySettings": "Prefer\u00e8ncies de Visualitzaci\u00f3", - "ViewTypeMusicSongs": "Can\u00e7ons", - "ViewTypeMusicFavorites": "Preferides", - "ViewTypeMusicFavoriteAlbums": "\u00c0lbums Preferits", - "ViewTypeMusicFavoriteArtists": "Artistes Preferits", - "ViewTypeMusicFavoriteSongs": "Can\u00e7ons Preferides", - "ViewTypeFolders": "Directoris", - "ViewTypeLiveTvRecordingGroups": "Enregistraments", - "ViewTypeLiveTvChannels": "Canals", + "Latest": "Darreres", + "ValueSpecialEpisodeName": "Especial - {0}", + "Inherit": "Inherit", + "Books": "Books", + "Music": "Music", + "Games": "Games", + "Photos": "Photos", + "MixedContent": "Mixed content", + "MusicVideos": "Music videos", + "HomeVideos": "Home videos", + "Playlists": "Playlists", + "HeaderRecordingGroups": "Recording Groups", + "HeaderContinueWatching": "Continua Veient", + "HeaderFavoriteArtists": "Favorite Artists", + "HeaderFavoriteSongs": "Favorite Songs", + "HeaderAlbumArtists": "Album Artists", + "HeaderFavoriteAlbums": "Favorite Albums", + "HeaderFavoriteEpisodes": "Favorite Episodes", + "HeaderFavoriteShows": "Programes Preferits", + "HeaderNextUp": "A continuaci\u00f3", + "Favorites": "Favorites", + "Collections": "Collections", + "Channels": "Channels", + "Movies": "Movies", + "Albums": "Albums", + "Artists": "Artists", + "Folders": "Folders", + "Songs": "Songs", + "TvShows": "TV Shows", + "Shows": "Shows", + "Genres": "G\u00e8neres", + "NameSeasonNumber": "Season {0}", + "AppDeviceValues": "App: {0}, Device: {1}", + "UserDownloadingItemWithValues": "{0} is downloading {1}", + "HeaderLiveTV": "Live TV", + "ChapterNameValue": "Chapter {0}", "ScheduledTaskFailedWithName": "{0} failed", "LabelRunningTimeValue": "Running time: {0}", "ScheduledTaskStartedWithName": "{0} started", - "VersionNumber": "Versi\u00f3 {0}", + "VersionNumber": "Version {0}", "PluginInstalledWithName": "{0} was installed", + "StartupEmbyServerIsLoading": "Emby Server is loading. Please try again shortly.", "PluginUpdatedWithName": "{0} was updated", "PluginUninstalledWithName": "{0} was uninstalled", - "ItemAddedWithName": "{0} afegit a la biblioteca", - "ItemRemovedWithName": "{0} eliminat de la biblioteca", + "ItemAddedWithName": "{0} was added to the library", + "ItemRemovedWithName": "{0} was removed from the library", "LabelIpAddressValue": "Ip address: {0}", "DeviceOnlineWithName": "{0} is connected", "UserOnlineFromDevice": "{0} is online from {1}", - "ProviderValue": "Prove\u00efdor: {0}", + "ProviderValue": "Provider: {0}", "SubtitlesDownloadedForItem": "Subtitles downloaded for {0}", - "UserConfigurationUpdatedWithName": "User configuration has been updated for {0}", "UserCreatedWithName": "User {0} has been created", "UserPasswordChangedWithName": "Password has been changed for user {0}", - "UserDeletedWithName": "L'usuari {0} ha estat eliminat", + "UserDeletedWithName": "User {0} has been deleted", + "UserConfigurationUpdatedWithName": "User configuration has been updated for {0}", "MessageServerConfigurationUpdated": "Server configuration has been updated", "MessageNamedServerConfigurationUpdatedWithValue": "Server configuration section {0} has been updated", "MessageApplicationUpdated": "Emby Server has been updated", "FailedLoginAttemptWithUserName": "Failed login attempt from {0}", - "AuthenticationSucceededWithUserName": "{0} autenticat correctament", - "DeviceOfflineWithName": "{0} has disconnected", - "UserLockedOutWithName": "L'usuari {0} ha estat blocat", + "AuthenticationSucceededWithUserName": "{0} successfully authenticated", "UserOfflineFromDevice": "{0} has disconnected from {1}", - "UserStartedPlayingItemWithValues": "{0} ha comen\u00e7at a reproduir {1}", - "UserStoppedPlayingItemWithValues": "{0} ha parat de reproduir {1}", + "DeviceOfflineWithName": "{0} has disconnected", + "UserStartedPlayingItemWithValues": "{0} has started playing {1}", + "UserStoppedPlayingItemWithValues": "{0} has stopped playing {1}", + "NotificationOptionPluginError": "Plugin failure", + "NotificationOptionApplicationUpdateAvailable": "Application update available", + "NotificationOptionApplicationUpdateInstalled": "Application update installed", + "NotificationOptionPluginUpdateInstalled": "Plugin update installed", + "NotificationOptionPluginInstalled": "Plugin installed", + "NotificationOptionPluginUninstalled": "Plugin uninstalled", + "NotificationOptionVideoPlayback": "Video playback started", + "NotificationOptionAudioPlayback": "Audio playback started", + "NotificationOptionGamePlayback": "Game playback started", + "NotificationOptionVideoPlaybackStopped": "Video playback stopped", + "NotificationOptionAudioPlaybackStopped": "Audio playback stopped", + "NotificationOptionGamePlaybackStopped": "Game playback stopped", + "NotificationOptionTaskFailed": "Scheduled task failure", + "NotificationOptionInstallationFailed": "Installation failure", + "NotificationOptionNewLibraryContent": "New content added", + "NotificationOptionCameraImageUploaded": "Camera image uploaded", + "NotificationOptionUserLockedOut": "User locked out", + "NotificationOptionServerRestartRequired": "Server restart required", + "UserLockedOutWithName": "User {0} has been locked out", "SubtitleDownloadFailureForItem": "Subtitles failed to download for {0}", - "HeaderUnidentified": "Unidentified", - "HeaderImagePrimary": "Primary", - "HeaderImageBackdrop": "Backdrop", - "HeaderImageLogo": "Logo", - "HeaderUserPrimaryImage": "User Image", - "HeaderOverview": "Overview", - "HeaderShortOverview": "Short Overview", - "HeaderType": "Type", - "HeaderSeverity": "Severity", - "HeaderUser": "Usuari", - "HeaderName": "Nom", - "HeaderDate": "Data", - "HeaderPremiereDate": "Premiere Date", - "HeaderDateAdded": "Data afegida", - "HeaderReleaseDate": "Data de publicaci\u00f3", - "HeaderRuntime": "Runtime", - "HeaderPlayCount": "Play Count", - "HeaderSeason": "Temporada", - "HeaderSeasonNumber": "Season number", - "HeaderSeries": "S\u00e8ries:", - "HeaderNetwork": "Network", - "HeaderYear": "Any:", - "HeaderYears": "Anys:", - "HeaderParentalRating": "Valoraci\u00f3 Parental", - "HeaderCommunityRating": "Community rating", - "HeaderTrailers": "Tr\u00e0ilers", - "HeaderSpecials": "Specials", - "HeaderGameSystems": "Sistemes de Jocs", - "HeaderPlayers": "Jugadors:", - "HeaderAlbumArtists": "Album Artists", - "HeaderAlbums": "Albums", - "HeaderDisc": "Disc", - "HeaderTrack": "Track", - "HeaderAudio": "\u00c0udio", - "HeaderVideo": "V\u00eddeo", - "HeaderEmbeddedImage": "Embedded image", - "HeaderResolution": "Resolution", - "HeaderSubtitles": "Subt\u00edtols", - "HeaderGenres": "Genres", - "HeaderCountries": "Countries", - "HeaderStatus": "Estat", - "HeaderTracks": "Tracks", - "HeaderMusicArtist": "M\u00fasic", - "HeaderLocked": "Blocat", - "HeaderStudios": "Estudis", - "HeaderActor": "Actors", - "HeaderComposer": "Compositors", - "HeaderDirector": "Directors", - "HeaderGuestStar": "Artista convidat", - "HeaderProducer": "Productors", - "HeaderWriter": "Escriptors", - "HeaderParentalRatings": "Parental Ratings", - "HeaderCommunityRatings": "Qualificacions de la comunitat", - "StartupEmbyServerIsLoading": "El servidor d'Emby s'està carregant. Si et plau, tornau-ho a provar de nou en breu." + "Sync": "Sync", + "User": "User", + "System": "System", + "Application": "Application", + "Plugin": "Plugin", + "LabelExit": "Exit", + "LabelVisitCommunity": "Visit Community", + "LabelBrowseLibrary": "Browse Library", + "LabelConfigureServer": "Configure Emby", + "LabelRestartServer": "Restart Server" }
\ No newline at end of file diff --git a/Emby.Server.Implementations/Localization/Core/cs.json b/Emby.Server.Implementations/Localization/Core/cs.json index e3055f5ba..abbfde380 100644 --- a/Emby.Server.Implementations/Localization/Core/cs.json +++ b/Emby.Server.Implementations/Localization/Core/cs.json @@ -1,102 +1,46 @@ { - "DbUpgradeMessage": "Po\u010dkejte pros\u00edm, datab\u00e1ze Emby Serveru je aktualizov\u00e1na na novou verzi. Hotovo {0}%.", - "AppDeviceValues": "Aplikace: {0}, Za\u0159\u00edzen\u00ed: {1}", - "UserDownloadingItemWithValues": "{0} pr\u00e1v\u011b stahuje {1}", - "FolderTypeMixed": "Sm\u00ed\u0161en\u00fd obsah", - "FolderTypeMovies": "Filmy", - "FolderTypeMusic": "Hudba", - "FolderTypeAdultVideos": "Filmy pro dosp\u011bl\u00e9", - "FolderTypePhotos": "Fotky", - "FolderTypeMusicVideos": "Hudebn\u00ed klipy", - "FolderTypeHomeVideos": "Dom\u00e1c\u00ed video", - "FolderTypeGames": "Hry", - "FolderTypeBooks": "Knihy", - "FolderTypeTvShows": "TV", - "FolderTypeInherit": "Zd\u011bdit", - "HeaderCastCrew": "Herci a obsazen\u00ed", - "HeaderPeople": "Lid\u00e9", + "Latest": "Nejnov\u011bj\u0161\u00ed", "ValueSpecialEpisodeName": "Speci\u00e1l - {0}", - "LabelChapterName": "Kapitola {0}", + "Inherit": "Zd\u011bdit", + "Books": "Knihy", + "Music": "Hudba", + "Games": "Hry", + "Photos": "Fotky", + "MixedContent": "Sm\u00ed\u0161en\u00fd obsah", + "MusicVideos": "Hudebn\u00ed klipy", + "HomeVideos": "Dom\u00e1ci videa", + "Playlists": "Seznamy skladeb", + "HeaderRecordingGroups": "Skupiny nahr\u00e1vek", + "HeaderContinueWatching": "Pokra\u010dovat ve sledov\u00e1n\u00ed", + "HeaderFavoriteArtists": "Obl\u00edben\u00ed um\u011blci", + "HeaderFavoriteSongs": "Obl\u00edben\u00e9 p\u00edsn\u011b", + "HeaderAlbumArtists": "Um\u011blci alba", + "HeaderFavoriteAlbums": "Obl\u00edben\u00e1 alba", + "HeaderFavoriteEpisodes": "Obl\u00edben\u00e9 epizody", + "HeaderFavoriteShows": "Obl\u00edben\u00e9 seri\u00e1ly", + "HeaderNextUp": "Nadch\u00e1zej\u00edc\u00ed", + "Favorites": "Obl\u00edben\u00e9", + "Collections": "Kolekce", + "Channels": "Kan\u00e1ly", + "Movies": "Filmy", + "Albums": "Alba", + "Artists": "Um\u011blci", + "Folders": "Slo\u017eky", + "Songs": "Skladby", + "TvShows": "TV Shows", + "Shows": "Seri\u00e1ly", + "Genres": "\u017d\u00e1nry", "NameSeasonNumber": "Sez\u00f3na {0}", - "LabelExit": "Zav\u0159\u00edt", - "LabelVisitCommunity": "Nav\u0161t\u00edvit komunitu", - "LabelGithub": "Github", - "LabelApiDocumentation": "Dokumentace API", - "LabelDeveloperResources": "Zdroje v\u00fdvoj\u00e1\u0159\u016f", - "LabelBrowseLibrary": "Proch\u00e1zet knihovnu", - "LabelConfigureServer": "Konfigurovat Emby", - "LabelRestartServer": "Restartovat server", - "CategorySync": "Synchronizace", - "CategoryUser": "U\u017eivatel:", - "CategorySystem": "Syst\u00e9m", - "CategoryApplication": "Aplikace", - "CategoryPlugin": "Z\u00e1suvn\u00fd modul", - "NotificationOptionPluginError": "Chyba z\u00e1suvn\u00e9ho modulu", - "NotificationOptionApplicationUpdateAvailable": "Dostupnost aktualizace aplikace", - "NotificationOptionApplicationUpdateInstalled": "Instalace aktualizace aplikace", - "NotificationOptionPluginUpdateInstalled": "Aktualizace z\u00e1suvn\u00e9ho modulu instalov\u00e1na", - "NotificationOptionPluginInstalled": "Z\u00e1suvn\u00fd modul instalov\u00e1n", - "NotificationOptionPluginUninstalled": "Z\u00e1suvn\u00fd modul odstran\u011bn", - "NotificationOptionVideoPlayback": "P\u0159ehr\u00e1v\u00e1n\u00ed videa zah\u00e1jeno", - "NotificationOptionAudioPlayback": "P\u0159ehr\u00e1v\u00e1n\u00ed audia zah\u00e1jeno", - "NotificationOptionGamePlayback": "Spu\u0161t\u011bn\u00ed hry zah\u00e1jeno", - "NotificationOptionVideoPlaybackStopped": "P\u0159ehr\u00e1v\u00e1n\u00ed videa ukon\u010deno", - "NotificationOptionAudioPlaybackStopped": "P\u0159ehr\u00e1v\u00e1n\u00ed audia ukon\u010deno", - "NotificationOptionGamePlaybackStopped": "Hra ukon\u010dena", - "NotificationOptionTaskFailed": "Chyba napl\u00e1novan\u00e9 \u00falohy", - "NotificationOptionInstallationFailed": "Chyba instalace", - "NotificationOptionNewLibraryContent": "P\u0159id\u00e1n nov\u00fd obsah", - "NotificationOptionNewLibraryContentMultiple": "P\u0159id\u00e1n nov\u00fd obsah (v\u00edcen\u00e1sobn\u00fd)", - "NotificationOptionCameraImageUploaded": "Kamerov\u00fd z\u00e1znam nahr\u00e1n", - "NotificationOptionUserLockedOut": "U\u017eivatel uzam\u010den", - "NotificationOptionServerRestartRequired": "Je vy\u017eadov\u00e1n restart serveru", - "ViewTypePlaylists": "Playlisty", - "ViewTypeMovies": "Filmy", - "ViewTypeTvShows": "Televize", - "ViewTypeGames": "Hry", - "ViewTypeMusic": "Hudba", - "ViewTypeMusicGenres": "\u017d\u00e1nry", - "ViewTypeMusicArtists": "\u00dam\u011blci", - "ViewTypeBoxSets": "Kolekce", - "ViewTypeChannels": "Kan\u00e1ly", - "ViewTypeLiveTV": "Live TV", - "ViewTypeLiveTvNowPlaying": "Vys\u00edl\u00e1no nyn\u00ed", - "ViewTypeLatestGames": "Nejnov\u011bj\u0161\u00ed hry", - "ViewTypeRecentlyPlayedGames": "Ned\u00e1vno p\u0159ehr\u00e1no", - "ViewTypeGameFavorites": "Obl\u00edben\u00e9", - "ViewTypeGameSystems": "Syst\u00e9my hry", - "ViewTypeGameGenres": "\u017d\u00e1nry", - "ViewTypeTvResume": "Obnovit", - "ViewTypeTvNextUp": "O\u010dek\u00e1van\u00e9", - "ViewTypeTvLatest": "Nejnov\u011bj\u0161\u00ed", - "ViewTypeTvShowSeries": "Seri\u00e1l", - "ViewTypeTvGenres": "\u017d\u00e1nry", - "ViewTypeTvFavoriteSeries": "Obl\u00edben\u00e9 seri\u00e1ly", - "ViewTypeTvFavoriteEpisodes": "Obl\u00edben\u00e9 epizody", - "ViewTypeMovieResume": "Obnovit", - "ViewTypeMovieLatest": "Nejnov\u011bj\u0161\u00ed", - "ViewTypeMovieMovies": "Filmy", - "ViewTypeMovieCollections": "Kolekce", - "ViewTypeMovieFavorites": "Obl\u00edben\u00e9", - "ViewTypeMovieGenres": "\u017d\u00e1nry", - "ViewTypeMusicLatest": "Nejnov\u011bj\u0161\u00ed", - "ViewTypeMusicPlaylists": "Playlisty", - "ViewTypeMusicAlbums": "Alba", - "ViewTypeMusicAlbumArtists": "Alba \u00fam\u011blc\u016f", - "HeaderOtherDisplaySettings": "Nastaven\u00ed zobrazen\u00ed", - "ViewTypeMusicSongs": "Songy", - "ViewTypeMusicFavorites": "Obl\u00edben\u00e9", - "ViewTypeMusicFavoriteAlbums": "Obl\u00edben\u00e1 alba", - "ViewTypeMusicFavoriteArtists": "Obl\u00edben\u00ed \u00fam\u011blci", - "ViewTypeMusicFavoriteSongs": "Obl\u00edben\u00e9 songy", - "ViewTypeFolders": "Slo\u017eky", - "ViewTypeLiveTvRecordingGroups": "Nahr\u00e1vky", - "ViewTypeLiveTvChannels": "Kan\u00e1ly", + "AppDeviceValues": "Aplikace: {0}, Za\u0159\u00edzen\u00ed: {1}", + "UserDownloadingItemWithValues": "{0} stahuje {1}", + "HeaderLiveTV": "\u017div\u00e1 TV", + "ChapterNameValue": "Kapitola {0}", "ScheduledTaskFailedWithName": "{0} selhalo", "LabelRunningTimeValue": "D\u00e9lka m\u00e9dia: {0}", "ScheduledTaskStartedWithName": "{0} zah\u00e1jeno", "VersionNumber": "Verze {0}", "PluginInstalledWithName": "{0} byl nainstalov\u00e1n", + "StartupEmbyServerIsLoading": "Emby Server je spou\u0161t\u011bn. Zkuste to pros\u00edm v brzk\u00e9 dob\u011b znovu.", "PluginUpdatedWithName": "{0} byl aktualizov\u00e1n", "PluginUninstalledWithName": "{0} byl odinstalov\u00e1n", "ItemAddedWithName": "{0} byl p\u0159id\u00e1n do knihovny", @@ -106,73 +50,47 @@ "UserOnlineFromDevice": "{0} se p\u0159ipojil z {1}", "ProviderValue": "Poskytl: {0}", "SubtitlesDownloadedForItem": "Sta\u017eeny titulky pro {0}", - "UserConfigurationUpdatedWithName": "Konfigurace u\u017eivatele byla aktualizov\u00e1na pro {0}", "UserCreatedWithName": "U\u017eivatel {0} byl vytvo\u0159en", - "UserPasswordChangedWithName": "Pro u\u017eivatele {0} byla provedena zm\u011bna hesla", + "UserPasswordChangedWithName": "Provedena zm\u011bna hesla pro u\u017eivatele {0}", "UserDeletedWithName": "U\u017eivatel {0} byl smaz\u00e1n", - "MessageServerConfigurationUpdated": "Konfigurace serveru byla aktualizov\u00e1na", + "UserConfigurationUpdatedWithName": "Konfigurace u\u017eivatele byla aktualizov\u00e1na pro {0}", + "MessageServerConfigurationUpdated": "Konfigurace serveru aktualizov\u00e1na", "MessageNamedServerConfigurationUpdatedWithValue": "Konfigurace sekce {0} na serveru byla aktualizov\u00e1na", "MessageApplicationUpdated": "Emby Server byl aktualizov\u00e1n", "FailedLoginAttemptWithUserName": "Ne\u00fasp\u011b\u0161n\u00fd pokus o p\u0159ihl\u00e1\u0161en\u00ed z {0}", "AuthenticationSucceededWithUserName": "{0} \u00fasp\u011b\u0161n\u011b ov\u011b\u0159en", - "DeviceOfflineWithName": "{0} se odpojil", - "UserLockedOutWithName": "U\u017eivatel {0} byl odem\u010den", "UserOfflineFromDevice": "{0} se odpojil od {1}", + "DeviceOfflineWithName": "{0} se odpojil", "UserStartedPlayingItemWithValues": "{0} spustil p\u0159ehr\u00e1v\u00e1n\u00ed {1}", "UserStoppedPlayingItemWithValues": "{0} zastavil p\u0159ehr\u00e1v\u00e1n\u00ed {1}", + "NotificationOptionPluginError": "Chyba z\u00e1suvn\u00e9ho modulu", + "NotificationOptionApplicationUpdateAvailable": "Dostupn\u00e1 aktualizace aplikace", + "NotificationOptionApplicationUpdateInstalled": "Aktualizace aplikace instalov\u00e1na", + "NotificationOptionPluginUpdateInstalled": "Aktualizace z\u00e1suvn\u00e9ho modulu instalov\u00e1na", + "NotificationOptionPluginInstalled": "Z\u00e1suvn\u00fd modul instalov\u00e1n", + "NotificationOptionPluginUninstalled": "Z\u00e1suvn\u00fd modul odstran\u011bn", + "NotificationOptionVideoPlayback": "P\u0159ehr\u00e1v\u00e1n\u00ed videa zah\u00e1jeno", + "NotificationOptionAudioPlayback": "P\u0159ehr\u00e1v\u00e1n\u00ed audia zah\u00e1jeno", + "NotificationOptionGamePlayback": "Spu\u0161t\u011bn\u00ed hry zah\u00e1jeno", + "NotificationOptionVideoPlaybackStopped": "P\u0159ehr\u00e1v\u00e1n\u00ed videa ukon\u010deno", + "NotificationOptionAudioPlaybackStopped": "P\u0159ehr\u00e1v\u00e1n\u00ed audia ukon\u010deno", + "NotificationOptionGamePlaybackStopped": "Hra ukon\u010dena", + "NotificationOptionTaskFailed": "Chyba napl\u00e1novan\u00e9 \u00falohy", + "NotificationOptionInstallationFailed": "Chyba instalace", + "NotificationOptionNewLibraryContent": "P\u0159id\u00e1n nov\u00fd obsah", + "NotificationOptionCameraImageUploaded": "Kamerov\u00fd z\u00e1znam nahr\u00e1n", + "NotificationOptionUserLockedOut": "U\u017eivatel uzam\u010den", + "NotificationOptionServerRestartRequired": "Je vy\u017eadov\u00e1n restart serveru", + "UserLockedOutWithName": "U\u017eivatel {0} byl odem\u010den", "SubtitleDownloadFailureForItem": "Stahov\u00e1n\u00ed titulk\u016f selhalo pro {0}", - "HeaderUnidentified": "Neidentifikov\u00e1n", - "HeaderImagePrimary": "Prim\u00e1rn\u00ed", - "HeaderImageBackdrop": "Pozad\u00ed", - "HeaderImageLogo": "Logo", - "HeaderUserPrimaryImage": "Avatar u\u017eivatele", - "HeaderOverview": "P\u0159ehled", - "HeaderShortOverview": "Stru\u010dn\u00fd p\u0159ehled", - "HeaderType": "Typ", - "HeaderSeverity": "Z\u00e1va\u017enost", - "HeaderUser": "U\u017eivatel", - "HeaderName": "N\u00e1zev", - "HeaderDate": "Datum", - "HeaderPremiereDate": "Premi\u00e9ra", - "HeaderDateAdded": "P\u0159id\u00e1no", - "HeaderReleaseDate": "Datum vyd\u00e1n\u00ed", - "HeaderRuntime": "D\u00e9lka", - "HeaderPlayCount": "P\u0159ehr\u00e1no (po\u010det)", - "HeaderSeason": "Sez\u00f3na", - "HeaderSeasonNumber": "\u010c\u00edslo sez\u00f3ny", - "HeaderSeries": "Seri\u00e1l:", - "HeaderNetwork": "S\u00ed\u0165", - "HeaderYear": "Rok:", - "HeaderYears": "V letech:", - "HeaderParentalRating": "Rodi\u010dovsk\u00e9 hodnocen\u00ed", - "HeaderCommunityRating": "Hodnocen\u00ed komunity", - "HeaderTrailers": "Trailery", - "HeaderSpecials": "Speci\u00e1ly", - "HeaderGameSystems": "Syst\u00e9m hry", - "HeaderPlayers": "Hr\u00e1\u010di:", - "HeaderAlbumArtists": "\u00dam\u011blci alba", - "HeaderAlbums": "Alba", - "HeaderDisc": "Disk", - "HeaderTrack": "Stopa", - "HeaderAudio": "Zvuk", - "HeaderVideo": "Video", - "HeaderEmbeddedImage": "Vlo\u017een\u00fd obr\u00e1zek", - "HeaderResolution": "Rozli\u0161en\u00ed", - "HeaderSubtitles": "Titulky", - "HeaderGenres": "\u017d\u00e1nry", - "HeaderCountries": "Zem\u011b", - "HeaderStatus": "Stav", - "HeaderTracks": "Stopy", - "HeaderMusicArtist": "Hudebn\u00ed \u00fam\u011blec", - "HeaderLocked": "Uzam\u010deno", - "HeaderStudios": "Studia", - "HeaderActor": "Herci", - "HeaderComposer": "Skladatel\u00e9", - "HeaderDirector": "Re\u017eis\u00e9\u0159i", - "HeaderGuestStar": "Hostuj\u00edc\u00ed hv\u011bzda", - "HeaderProducer": "Producenti", - "HeaderWriter": "Spisovatel\u00e9", - "HeaderParentalRatings": "Rodi\u010dovsk\u00e1 hodnocen\u00ed", - "HeaderCommunityRatings": "Hodnocen\u00ed komunity", - "StartupEmbyServerIsLoading": "Emby Server je na\u010d\u00edt\u00e1n. Zkuste to pros\u00edm znovu v brzk\u00e9 dob\u011b." + "Sync": "Synchronizace", + "User": "U\u017eivatel", + "System": "Syst\u00e9m", + "Application": "Aplikace", + "Plugin": "Z\u00e1suvn\u00fd modul", + "LabelExit": "Uko\u010dit", + "LabelVisitCommunity": "Nav\u0161t\u00edvit komunitu", + "LabelBrowseLibrary": "Proch\u00e1zet knihovnu", + "LabelConfigureServer": "Konfigurovat Emby", + "LabelRestartServer": "Restartovat Server" }
\ No newline at end of file diff --git a/Emby.Server.Implementations/Localization/Core/da.json b/Emby.Server.Implementations/Localization/Core/da.json index d2a628a80..ed9652c33 100644 --- a/Emby.Server.Implementations/Localization/Core/da.json +++ b/Emby.Server.Implementations/Localization/Core/da.json @@ -1,102 +1,46 @@ { - "DbUpgradeMessage": "Please wait while your Emby Server database is upgraded. {0}% complete.", - "AppDeviceValues": "App: {0}, Enhed: {1}", - "UserDownloadingItemWithValues": "{0} henter {1}", - "FolderTypeMixed": "Blandet indhold", - "FolderTypeMovies": "FIlm", - "FolderTypeMusic": "Musik", - "FolderTypeAdultVideos": "Voksenfilm", - "FolderTypePhotos": "Fotos", - "FolderTypeMusicVideos": "Musikvideoer", - "FolderTypeHomeVideos": "Hjemmevideoer", - "FolderTypeGames": "Spil", - "FolderTypeBooks": "B\u00f8ger", - "FolderTypeTvShows": "TV", - "FolderTypeInherit": "Nedarv", - "HeaderCastCrew": "Medvirkende", - "HeaderPeople": "Mennesker", + "Latest": "Seneste", "ValueSpecialEpisodeName": "Special - {0}", - "LabelChapterName": "Kapitel {0}", + "Inherit": "Arv", + "Books": "B\u00f8ger", + "Music": "Musik", + "Games": "Spil", + "Photos": "Fotos", + "MixedContent": "Blandet indhold", + "MusicVideos": "Musikvideoer", + "HomeVideos": "Hjemmevideoer", + "Playlists": "Spillelister", + "HeaderRecordingGroups": "Optagegrupper", + "HeaderContinueWatching": "Forts\u00e6t Afspilning", + "HeaderFavoriteArtists": "Favoritkunstnere", + "HeaderFavoriteSongs": "Favoritsange", + "HeaderAlbumArtists": "Albumkunstnere", + "HeaderFavoriteAlbums": "Favoritalbum", + "HeaderFavoriteEpisodes": "Favoritepisoder", + "HeaderFavoriteShows": "Favorit serier", + "HeaderNextUp": "N\u00e6ste", + "Favorites": "Favoritter", + "Collections": "Samlinger", + "Channels": "Kanaler", + "Movies": "Film", + "Albums": "Album", + "Artists": "Kunstner", + "Folders": "Mapper", + "Songs": "Sange", + "TvShows": "TV Shows", + "Shows": "Shows", + "Genres": "Genre", "NameSeasonNumber": "S\u00e6son {0}", - "LabelExit": "Afslut", - "LabelVisitCommunity": "Bes\u00f8g F\u00e6lleskab", - "LabelGithub": "Github", - "LabelApiDocumentation": "Api dokumentation", - "LabelDeveloperResources": "Udviklerressourcer", - "LabelBrowseLibrary": "Gennemse bibliotek", - "LabelConfigureServer": "Konfigurer Emby", - "LabelRestartServer": "Genstart Server", - "CategorySync": "Sync", - "CategoryUser": "Bruger", - "CategorySystem": "System", - "CategoryApplication": "Program", - "CategoryPlugin": "Plugin", - "NotificationOptionPluginError": "Plugin fejl", - "NotificationOptionApplicationUpdateAvailable": "Programopdatering tilg\u00e6ngelig", - "NotificationOptionApplicationUpdateInstalled": "Programopdatering installeret", - "NotificationOptionPluginUpdateInstalled": "Opdatering til plugin installeret", - "NotificationOptionPluginInstalled": "Plugin installeret", - "NotificationOptionPluginUninstalled": "Plugin afinstalleret", - "NotificationOptionVideoPlayback": "Videoafspilning startet", - "NotificationOptionAudioPlayback": "Lydafspilning startet", - "NotificationOptionGamePlayback": "Spilafspilning startet", - "NotificationOptionVideoPlaybackStopped": "Videoafspilning stoppet", - "NotificationOptionAudioPlaybackStopped": "Lydafspilning stoppet", - "NotificationOptionGamePlaybackStopped": "Spilafspilning stoppet", - "NotificationOptionTaskFailed": "Fejl i planlagt opgave", - "NotificationOptionInstallationFailed": "Fejl ved installation", - "NotificationOptionNewLibraryContent": "Nyt indhold tilf\u00f8jet", - "NotificationOptionNewLibraryContentMultiple": "Nyt indhold tilf\u00f8jet (flere)", - "NotificationOptionCameraImageUploaded": "Kamerabillede tilf\u00f8jet", - "NotificationOptionUserLockedOut": "Bruger l\u00e5st", - "NotificationOptionServerRestartRequired": "Genstart af serveren p\u00e5kr\u00e6vet", - "ViewTypePlaylists": "Afspilningslister", - "ViewTypeMovies": "Film", - "ViewTypeTvShows": "TV", - "ViewTypeGames": "Spil", - "ViewTypeMusic": "Musik", - "ViewTypeMusicGenres": "Genrer", - "ViewTypeMusicArtists": "Artister", - "ViewTypeBoxSets": "Samlinger", - "ViewTypeChannels": "Kanaler", - "ViewTypeLiveTV": "Live TV", - "ViewTypeLiveTvNowPlaying": "Vises nu", - "ViewTypeLatestGames": "Seneste spil", - "ViewTypeRecentlyPlayedGames": "Afspillet for nylig", - "ViewTypeGameFavorites": "Favoritter", - "ViewTypeGameSystems": "Spilsystemer", - "ViewTypeGameGenres": "Genrer", - "ViewTypeTvResume": "Forts\u00e6t", - "ViewTypeTvNextUp": "N\u00e6ste", - "ViewTypeTvLatest": "Seneste", - "ViewTypeTvShowSeries": "Serier", - "ViewTypeTvGenres": "Genrer", - "ViewTypeTvFavoriteSeries": "Favoritserier", - "ViewTypeTvFavoriteEpisodes": "Favoritepisoder", - "ViewTypeMovieResume": "Forts\u00e6t", - "ViewTypeMovieLatest": "Seneste", - "ViewTypeMovieMovies": "Film", - "ViewTypeMovieCollections": "Samlinger", - "ViewTypeMovieFavorites": "Favoritter", - "ViewTypeMovieGenres": "Genrer", - "ViewTypeMusicLatest": "Seneste", - "ViewTypeMusicPlaylists": "Afspilningslister", - "ViewTypeMusicAlbums": "Albums", - "ViewTypeMusicAlbumArtists": "Albumartister", - "HeaderOtherDisplaySettings": "Indstillinger for visning", - "ViewTypeMusicSongs": "Sange", - "ViewTypeMusicFavorites": "Favoritter", - "ViewTypeMusicFavoriteAlbums": "Favoritalbums", - "ViewTypeMusicFavoriteArtists": "Favoritartister", - "ViewTypeMusicFavoriteSongs": "Favoritsange", - "ViewTypeFolders": "Mapper", - "ViewTypeLiveTvRecordingGroups": "Optagelser", - "ViewTypeLiveTvChannels": "Kanaler", - "ScheduledTaskFailedWithName": "{0} fejlede", - "LabelRunningTimeValue": "K\u00f8rselstid: {0}", - "ScheduledTaskStartedWithName": "{0} startet", + "AppDeviceValues": "App: {0}, Enhed: {1}", + "UserDownloadingItemWithValues": "{0} downloader {1}", + "HeaderLiveTV": "Live TV", + "ChapterNameValue": "Kapitel {0}", + "ScheduledTaskFailedWithName": "{0} fejlet", + "LabelRunningTimeValue": "Spilletid: {0}", + "ScheduledTaskStartedWithName": "{0} p\u00e5begyndt", "VersionNumber": "Version {0}", "PluginInstalledWithName": "{0} blev installeret", + "StartupEmbyServerIsLoading": "Emby Server indl\u00e6ser. Pr\u00f8v venligst igen om kort tid.", "PluginUpdatedWithName": "{0} blev opdateret", "PluginUninstalledWithName": "{0} blev afinstalleret", "ItemAddedWithName": "{0} blev tilf\u00f8jet til biblioteket", @@ -105,74 +49,48 @@ "DeviceOnlineWithName": "{0} er forbundet", "UserOnlineFromDevice": "{0} er online fra {1}", "ProviderValue": "Udbyder: {0}", - "SubtitlesDownloadedForItem": "Undertekster hentet til {0}", - "UserConfigurationUpdatedWithName": "Brugerkonfigurationen for {0} er blevet opdateret", - "UserCreatedWithName": "Bruger {0} er skabt", - "UserPasswordChangedWithName": "Adgangskoden for {0} er blevet \u00e6ndret", - "UserDeletedWithName": "Bruger {0} er slettet", - "MessageServerConfigurationUpdated": "Serverkonfigurationen er opdateret", - "MessageNamedServerConfigurationUpdatedWithValue": "Serverkonfiguration sektion {0} er opdateret", - "MessageApplicationUpdated": "Emby er blevet opdateret", - "FailedLoginAttemptWithUserName": "Fejlslagent loginfors\u00f8g fra {0}", - "AuthenticationSucceededWithUserName": "{0} autentificeret", + "SubtitlesDownloadedForItem": "Undertekster downloadet for {0}", + "UserCreatedWithName": "Bruger {0} er blevet oprettet", + "UserPasswordChangedWithName": "Adgangskode er \u00e6ndret for bruger {0}", + "UserDeletedWithName": "Brugeren {0} er blevet slettet", + "UserConfigurationUpdatedWithName": "Brugerkonfiguration er blevet opdateret for {0}", + "MessageServerConfigurationUpdated": "Serverkonfiguration er blevet opdateret", + "MessageNamedServerConfigurationUpdatedWithValue": "Server konfigurationssektion {0} er blevet opdateret", + "MessageApplicationUpdated": "Emby Server er blevet opdateret", + "FailedLoginAttemptWithUserName": "Fejlet loginfors\u00f8g fra {0}", + "AuthenticationSucceededWithUserName": "{0} bekr\u00e6ftet med succes", + "UserOfflineFromDevice": "{0} har afbrudt fra {1}", "DeviceOfflineWithName": "{0} har afbrudt forbindelsen", - "UserLockedOutWithName": "Bruger {0} er blevet l\u00e5st", - "UserOfflineFromDevice": "{0} har afbrudt forbindelsen fra {1}", - "UserStartedPlayingItemWithValues": "{0} afspiller {1}", - "UserStoppedPlayingItemWithValues": "{0} har stoppet afpilningen af {1}", - "SubtitleDownloadFailureForItem": "Hentning af undertekster til {0} fejlede", - "HeaderUnidentified": "Unidentified", - "HeaderImagePrimary": "Primary", - "HeaderImageBackdrop": "Backdrop", - "HeaderImageLogo": "Logo", - "HeaderUserPrimaryImage": "User Image", - "HeaderOverview": "Overview", - "HeaderShortOverview": "Short Overview", - "HeaderType": "Type", - "HeaderSeverity": "Severity", - "HeaderUser": "Bruger", - "HeaderName": "Navn", - "HeaderDate": "Dato", - "HeaderPremiereDate": "Premiere Date", - "HeaderDateAdded": "Date Added", - "HeaderReleaseDate": "Udgivelsesdato", - "HeaderRuntime": "Varighed", - "HeaderPlayCount": "Play Count", - "HeaderSeason": "S\u00e6son", - "HeaderSeasonNumber": "S\u00e6sonnummer", - "HeaderSeries": "Series:", - "HeaderNetwork": "Netv\u00e6rk", - "HeaderYear": "Year:", - "HeaderYears": "Years:", - "HeaderParentalRating": "Parental Rating", - "HeaderCommunityRating": "F\u00e6llesskabsvurdering", - "HeaderTrailers": "Trailere", - "HeaderSpecials": "S\u00e6rudsendelser", - "HeaderGameSystems": "Game Systems", - "HeaderPlayers": "Players:", - "HeaderAlbumArtists": "Album Artists", - "HeaderAlbums": "Albums", - "HeaderDisc": "Disk", - "HeaderTrack": "Spor", - "HeaderAudio": "Lyd", - "HeaderVideo": "Video", - "HeaderEmbeddedImage": "Indlejret billede", - "HeaderResolution": "Opl\u00f8sning", - "HeaderSubtitles": "Undertekster", - "HeaderGenres": "Genrer", - "HeaderCountries": "Lande", - "HeaderStatus": "Status", - "HeaderTracks": "Spor", - "HeaderMusicArtist": "Music artist", - "HeaderLocked": "Locked", - "HeaderStudios": "Studier", - "HeaderActor": "Actors", - "HeaderComposer": "Composers", - "HeaderDirector": "Directors", - "HeaderGuestStar": "Guest star", - "HeaderProducer": "Producers", - "HeaderWriter": "Writers", - "HeaderParentalRatings": "Aldersgr\u00e6nser", - "HeaderCommunityRatings": "Community ratings", - "StartupEmbyServerIsLoading": "Emby Server is loading. Please try again shortly." + "UserStartedPlayingItemWithValues": "{0} har p\u00e5begyndt afspilning af {1}", + "UserStoppedPlayingItemWithValues": "{0} har afsluttet afspilning af {1}", + "NotificationOptionPluginError": "Pluginfejl", + "NotificationOptionApplicationUpdateAvailable": "Opdatering til applikation tilg\u00e6ngelig", + "NotificationOptionApplicationUpdateInstalled": "Opdatering til applikation installeret", + "NotificationOptionPluginUpdateInstalled": "Opdatering til plugin installeret", + "NotificationOptionPluginInstalled": "Plugin installeret", + "NotificationOptionPluginUninstalled": "Plugin afinstalleret", + "NotificationOptionVideoPlayback": "Videoafspilning p\u00e5begyndt", + "NotificationOptionAudioPlayback": "Audioafspilning p\u00e5begyndt", + "NotificationOptionGamePlayback": "Afspilning af Spil p\u00e5begyndt", + "NotificationOptionVideoPlaybackStopped": "Videoafspilning stoppet", + "NotificationOptionAudioPlaybackStopped": "Audioafspilning stoppet", + "NotificationOptionGamePlaybackStopped": "Afspilning af Spil stoppet", + "NotificationOptionTaskFailed": "Planlagt opgave fejlet", + "NotificationOptionInstallationFailed": "Installationsfejl", + "NotificationOptionNewLibraryContent": "Nyt indhold tilf\u00f8jet", + "NotificationOptionCameraImageUploaded": "Kamerabillede uploadet", + "NotificationOptionUserLockedOut": "Bruger l\u00e5st ude", + "NotificationOptionServerRestartRequired": "Genstart af server p\u00e5kr\u00e6vet", + "UserLockedOutWithName": "Brugeren {0} er blevet l\u00e5st ude", + "SubtitleDownloadFailureForItem": "Fejlet i download af undertekster for {0}", + "Sync": "Synk", + "User": "Bruger", + "System": "System", + "Application": "Applikation", + "Plugin": "Plugin", + "LabelExit": "Afslut", + "LabelVisitCommunity": "Bes\u00f8g F\u00e6llesskab", + "LabelBrowseLibrary": "Gennemse Bibliotek", + "LabelConfigureServer": "Konfigurer Emby", + "LabelRestartServer": "Genstart Server" }
\ No newline at end of file diff --git a/Emby.Server.Implementations/Localization/Core/de.json b/Emby.Server.Implementations/Localization/Core/de.json index 30e3d9215..183b4aaf8 100644 --- a/Emby.Server.Implementations/Localization/Core/de.json +++ b/Emby.Server.Implementations/Localization/Core/de.json @@ -1,102 +1,46 @@ { - "DbUpgradeMessage": "Bitte warten Sie w\u00e4hrend die Emby Datenbank aktualisiert wird. {0}% verarbeitet.", - "AppDeviceValues": "App: {0}, Ger\u00e4t: {1}", - "UserDownloadingItemWithValues": "{0} l\u00e4dt {1} herunter", - "FolderTypeMixed": "Gemischte Inhalte", - "FolderTypeMovies": "Filme", - "FolderTypeMusic": "Musik", - "FolderTypeAdultVideos": "Videos f\u00fcr Erwachsene", - "FolderTypePhotos": "Fotos", - "FolderTypeMusicVideos": "Musikvideos", - "FolderTypeHomeVideos": "Heimvideos", - "FolderTypeGames": "Spiele", - "FolderTypeBooks": "B\u00fccher", - "FolderTypeTvShows": "TV", - "FolderTypeInherit": "\u00dcbernehmen", - "HeaderCastCrew": "Besetzung & Crew", - "HeaderPeople": "Personen", + "Latest": "Neueste", "ValueSpecialEpisodeName": "Special - {0}", - "LabelChapterName": "Kapitel {0}", + "Inherit": "\u00dcbernehmen", + "Books": "B\u00fccher", + "Music": "Musik", + "Games": "Spiele", + "Photos": "Fotos", + "MixedContent": "Gemischte Inhalte", + "MusicVideos": "Musik-Videos", + "HomeVideos": "Heimvideos", + "Playlists": "Wiedergabelisten", + "HeaderRecordingGroups": "Aufnahme-Gruppen", + "HeaderContinueWatching": "Weiterschauen", + "HeaderFavoriteArtists": "Interpreten Favoriten", + "HeaderFavoriteSongs": "Lieder Favoriten", + "HeaderAlbumArtists": "Album-K\u00fcnstler", + "HeaderFavoriteAlbums": "Lieblingsalben", + "HeaderFavoriteEpisodes": "Lieblingsepisoden", + "HeaderFavoriteShows": "Lieblingsserien", + "HeaderNextUp": "Als N\u00e4chstes", + "Favorites": "Favoriten", + "Collections": "Sammlungen", + "Channels": "Kan\u00e4le", + "Movies": "Filme", + "Albums": "Alben", + "Artists": "Interpreten", + "Folders": "Verzeichnisse", + "Songs": "Songs", + "TvShows": "TV Shows", + "Shows": "Serien", + "Genres": "Genres", "NameSeasonNumber": "Staffel {0}", - "LabelExit": "Beenden", - "LabelVisitCommunity": "Besuche die Community", - "LabelGithub": "Github", - "LabelApiDocumentation": "Api Dokumentation", - "LabelDeveloperResources": "Entwickler Ressourcen", - "LabelBrowseLibrary": "Bibliothek durchsuchen", - "LabelConfigureServer": "Konfiguriere Emby", - "LabelRestartServer": "Server neustarten", - "CategorySync": "Sync", - "CategoryUser": "Benutzer", - "CategorySystem": "System", - "CategoryApplication": "Anwendung", - "CategoryPlugin": "Plugin", - "NotificationOptionPluginError": "Plugin Fehler", - "NotificationOptionApplicationUpdateAvailable": "Anwendungsaktualisierung verf\u00fcgbar", - "NotificationOptionApplicationUpdateInstalled": "Anwendungsaktualisierung installiert", - "NotificationOptionPluginUpdateInstalled": "Pluginaktualisierung installiert", - "NotificationOptionPluginInstalled": "Plugin installiert", - "NotificationOptionPluginUninstalled": "Plugin deinstalliert", - "NotificationOptionVideoPlayback": "Videowiedergabe gestartet", - "NotificationOptionAudioPlayback": "Audiowiedergabe gestartet", - "NotificationOptionGamePlayback": "Spielwiedergabe gestartet", - "NotificationOptionVideoPlaybackStopped": "Videowiedergabe gestoppt", - "NotificationOptionAudioPlaybackStopped": "Audiowiedergabe gestoppt", - "NotificationOptionGamePlaybackStopped": "Spielwiedergabe gestoppt", - "NotificationOptionTaskFailed": "Fehler bei geplanter Aufgabe", - "NotificationOptionInstallationFailed": "Installationsfehler", - "NotificationOptionNewLibraryContent": "Neuer Inhalt hinzugef\u00fcgt", - "NotificationOptionNewLibraryContentMultiple": "Neuen Inhalte hinzugef\u00fcgt (mehrere)", - "NotificationOptionCameraImageUploaded": "Kamera Bild hochgeladen", - "NotificationOptionUserLockedOut": "Benutzer ausgeschlossen", - "NotificationOptionServerRestartRequired": "Serverneustart notwendig", - "ViewTypePlaylists": "Wiedergabelisten", - "ViewTypeMovies": "Filme", - "ViewTypeTvShows": "TV", - "ViewTypeGames": "Spiele", - "ViewTypeMusic": "Musik", - "ViewTypeMusicGenres": "Genres", - "ViewTypeMusicArtists": "K\u00fcnstler", - "ViewTypeBoxSets": "Sammlungen", - "ViewTypeChannels": "Kan\u00e4le", - "ViewTypeLiveTV": "Live-TV", - "ViewTypeLiveTvNowPlaying": "Gerade ausgestrahlt", - "ViewTypeLatestGames": "Neueste Spiele", - "ViewTypeRecentlyPlayedGames": "K\u00fcrzlich abgespielt", - "ViewTypeGameFavorites": "Favoriten", - "ViewTypeGameSystems": "Spielesysteme", - "ViewTypeGameGenres": "Genres", - "ViewTypeTvResume": "Fortsetzen", - "ViewTypeTvNextUp": "Als n\u00e4chstes", - "ViewTypeTvLatest": "Neueste", - "ViewTypeTvShowSeries": "Serien", - "ViewTypeTvGenres": "Genres", - "ViewTypeTvFavoriteSeries": "Serien Favoriten", - "ViewTypeTvFavoriteEpisodes": "Episoden Favoriten", - "ViewTypeMovieResume": "Fortsetzen", - "ViewTypeMovieLatest": "Neueste", - "ViewTypeMovieMovies": "Filme", - "ViewTypeMovieCollections": "Sammlungen", - "ViewTypeMovieFavorites": "Favoriten", - "ViewTypeMovieGenres": "Genres", - "ViewTypeMusicLatest": "Neueste", - "ViewTypeMusicPlaylists": "Wiedergabelisten", - "ViewTypeMusicAlbums": "Alben", - "ViewTypeMusicAlbumArtists": "Album-K\u00fcnstler", - "HeaderOtherDisplaySettings": "Anzeige Einstellungen", - "ViewTypeMusicSongs": "Lieder", - "ViewTypeMusicFavorites": "Favoriten", - "ViewTypeMusicFavoriteAlbums": "Album Favoriten", - "ViewTypeMusicFavoriteArtists": "Interpreten Favoriten", - "ViewTypeMusicFavoriteSongs": "Lieder Favoriten", - "ViewTypeFolders": "Verzeichnisse", - "ViewTypeLiveTvRecordingGroups": "Aufnahmen", - "ViewTypeLiveTvChannels": "Kan\u00e4le", + "AppDeviceValues": "App: {0}, Ger\u00e4t: {1}", + "UserDownloadingItemWithValues": "{0} l\u00e4dt {1} herunter", + "HeaderLiveTV": "Live TV", + "ChapterNameValue": "Kapitel {0}", "ScheduledTaskFailedWithName": "{0} fehlgeschlagen", "LabelRunningTimeValue": "Laufzeit: {0}", "ScheduledTaskStartedWithName": "{0} gestartet", "VersionNumber": "Version {0}", "PluginInstalledWithName": "{0} wurde installiert", + "StartupEmbyServerIsLoading": "Emby Server startet, bitte versuche es gleich noch einmal.", "PluginUpdatedWithName": "{0} wurde aktualisiert", "PluginUninstalledWithName": "{0} wurde deinstalliert", "ItemAddedWithName": "{0} wurde der Bibliothek hinzugef\u00fcgt", @@ -106,73 +50,47 @@ "UserOnlineFromDevice": "{0} ist online von {1}", "ProviderValue": "Anbieter: {0}", "SubtitlesDownloadedForItem": "Untertitel heruntergeladen f\u00fcr {0}", - "UserConfigurationUpdatedWithName": "Benutzereinstellungen wurden aktualisiert f\u00fcr {0}", "UserCreatedWithName": "Benutzer {0} wurde erstellt", "UserPasswordChangedWithName": "Das Passwort f\u00fcr Benutzer {0} wurde ge\u00e4ndert", "UserDeletedWithName": "Benutzer {0} wurde gel\u00f6scht", + "UserConfigurationUpdatedWithName": "Benutzereinstellungen wurden aktualisiert f\u00fcr {0}", "MessageServerConfigurationUpdated": "Server Einstellungen wurden aktualisiert", "MessageNamedServerConfigurationUpdatedWithValue": "Der Server Einstellungsbereich {0} wurde aktualisiert", "MessageApplicationUpdated": "Emby Server wurde auf den neusten Stand gebracht.", "FailedLoginAttemptWithUserName": "Fehlgeschlagener Anmeldeversuch von {0}", "AuthenticationSucceededWithUserName": "{0} erfolgreich authentifiziert", - "DeviceOfflineWithName": "{0} wurde getrennt", - "UserLockedOutWithName": "Benutzer {0} wurde ausgeschlossen", "UserOfflineFromDevice": "{0} wurde getrennt von {1}", + "DeviceOfflineWithName": "{0} wurde getrennt", "UserStartedPlayingItemWithValues": "{0} hat die Wiedergabe von {1} gestartet", "UserStoppedPlayingItemWithValues": "{0} hat die Wiedergabe von {1} beendet", + "NotificationOptionPluginError": "Plugin Fehler", + "NotificationOptionApplicationUpdateAvailable": "Anwendungsaktualisierung verf\u00fcgbar", + "NotificationOptionApplicationUpdateInstalled": "Anwendungsaktualisierung installiert", + "NotificationOptionPluginUpdateInstalled": "Pluginaktualisierung installiert", + "NotificationOptionPluginInstalled": "Plugin installiert", + "NotificationOptionPluginUninstalled": "Plugin deinstalliert", + "NotificationOptionVideoPlayback": "Videowiedergabe gestartet", + "NotificationOptionAudioPlayback": "Audiowiedergabe gestartet", + "NotificationOptionGamePlayback": "Spielwiedergabe gestartet", + "NotificationOptionVideoPlaybackStopped": "Videowiedergabe gestoppt", + "NotificationOptionAudioPlaybackStopped": "Audiowiedergabe gestoppt", + "NotificationOptionGamePlaybackStopped": "Spielwiedergabe gestoppt", + "NotificationOptionTaskFailed": "Geplante Aufgaben fehlgeschlagen", + "NotificationOptionInstallationFailed": "Installationsfehler", + "NotificationOptionNewLibraryContent": "Neuer Inhalt hinzugef\u00fcgt", + "NotificationOptionCameraImageUploaded": "Kamera Bild hochgeladen", + "NotificationOptionUserLockedOut": "Benutzer ausgeschlossen", + "NotificationOptionServerRestartRequired": "Serverneustart notwendig", + "UserLockedOutWithName": "Benutzer {0} wurde ausgeschlossen", "SubtitleDownloadFailureForItem": "Download der Untertitel fehlgeschlagen f\u00fcr {0}", - "HeaderUnidentified": "Nicht identifiziert", - "HeaderImagePrimary": "Bevorzugt", - "HeaderImageBackdrop": "Hintergrund", - "HeaderImageLogo": "Logo", - "HeaderUserPrimaryImage": "Benutzerbild", - "HeaderOverview": "\u00dcbersicht", - "HeaderShortOverview": "Kurz\u00fcbersicht", - "HeaderType": "Typ", - "HeaderSeverity": "Schwere", - "HeaderUser": "Benutzer", - "HeaderName": "Name", - "HeaderDate": "Datum", - "HeaderPremiereDate": "Premiere Datum", - "HeaderDateAdded": "Datum hinzugef\u00fcgt", - "HeaderReleaseDate": "Ver\u00f6ffentlichungsdatum", - "HeaderRuntime": "Laufzeit", - "HeaderPlayCount": "Anzahl Wiedergaben", - "HeaderSeason": "Staffel", - "HeaderSeasonNumber": "Staffel Nummer", - "HeaderSeries": "Serien:", - "HeaderNetwork": "Netzwerk", - "HeaderYear": "Jahr:", - "HeaderYears": "Jahre:", - "HeaderParentalRating": "Altersfreigabe", - "HeaderCommunityRating": "Community Bewertung", - "HeaderTrailers": "Trailer", - "HeaderSpecials": "Extras", - "HeaderGameSystems": "Spiele Systeme", - "HeaderPlayers": "Spieler:", - "HeaderAlbumArtists": "Album K\u00fcnstler", - "HeaderAlbums": "Alben", - "HeaderDisc": "Disc", - "HeaderTrack": "St\u00fcck", - "HeaderAudio": "Audio", - "HeaderVideo": "Video", - "HeaderEmbeddedImage": "Integriertes Bild", - "HeaderResolution": "Aufl\u00f6sung", - "HeaderSubtitles": "Untertitel", - "HeaderGenres": "Genres", - "HeaderCountries": "L\u00e4nder", - "HeaderStatus": "Status", - "HeaderTracks": "Lieder", - "HeaderMusicArtist": "Musik K\u00fcnstler", - "HeaderLocked": "Blockiert", - "HeaderStudios": "Studios", - "HeaderActor": "Schauspieler", - "HeaderComposer": "Komponierer", - "HeaderDirector": "Regie", - "HeaderGuestStar": "Gaststar", - "HeaderProducer": "Produzenten", - "HeaderWriter": "Autoren", - "HeaderParentalRatings": "Altersbeschr\u00e4nkung", - "HeaderCommunityRatings": "Community Bewertungen", - "StartupEmbyServerIsLoading": "Emby Server startet, bitte versuchen Sie es gleich noch einmal." + "Sync": "Synchronisation", + "User": "Benutzer", + "System": "System", + "Application": "Anwendung", + "Plugin": "Plugin", + "LabelExit": "Beenden", + "LabelVisitCommunity": "Besuche die Community", + "LabelBrowseLibrary": "Bibliothek durchsuchen", + "LabelConfigureServer": "Konfiguriere Emby", + "LabelRestartServer": "Server neustarten" }
\ No newline at end of file diff --git a/Emby.Server.Implementations/Localization/Core/el.json b/Emby.Server.Implementations/Localization/Core/el.json deleted file mode 100644 index 9e2d321cc..000000000 --- a/Emby.Server.Implementations/Localization/Core/el.json +++ /dev/null @@ -1,178 +0,0 @@ -{ - "DbUpgradeMessage": "Please wait while your Emby Server database is upgraded. {0}% complete.", - "AppDeviceValues": "App: {0}, Device: {1}", - "UserDownloadingItemWithValues": "{0} is downloading {1}", - "FolderTypeMixed": "\u0391\u03bd\u03ac\u03bc\u03b5\u03b9\u03ba\u03c4\u03bf \u03a0\u03b5\u03c1\u03b9\u03b5\u03c7\u03cc\u03bc\u03b5\u03bd\u03bf", - "FolderTypeMovies": "\u03a4\u03b1\u03b9\u03bd\u03af\u03b5\u03c2", - "FolderTypeMusic": "\u039c\u03bf\u03c5\u03c3\u03b9\u03ba\u03ae", - "FolderTypeAdultVideos": "\u03a4\u03b1\u03b9\u03bd\u03af\u03b5\u03c2 \u0395\u03bd\u03b7\u03bb\u03af\u03ba\u03c9\u03bd", - "FolderTypePhotos": "\u03a6\u03c9\u03c4\u03bf\u03b3\u03c1\u03b1\u03c6\u03af\u03b5\u03c2", - "FolderTypeMusicVideos": "\u039c\u03bf\u03c5\u03c3\u03b9\u03ba\u03ac \u0392\u03af\u03bd\u03c4\u03b5\u03bf", - "FolderTypeHomeVideos": "\u03a0\u03c1\u03bf\u03c3\u03c9\u03c0\u03b9\u03ba\u03ac \u0392\u03af\u03bd\u03c4\u03b5\u03bf", - "FolderTypeGames": "\u03a0\u03b1\u03b9\u03c7\u03bd\u03af\u03b4\u03b9\u03b1", - "FolderTypeBooks": "\u0392\u03b9\u03b2\u03bb\u03af\u03b1", - "FolderTypeTvShows": "\u03a4\u03b7\u03bb\u03b5\u03cc\u03c1\u03b1\u03c3\u03b7", - "FolderTypeInherit": "Inherit", - "HeaderCastCrew": "\u0397\u03b8\u03bf\u03c0\u03bf\u03b9\u03bf\u03af \u03ba\u03b1\u03b9 \u03c3\u03c5\u03bd\u03b5\u03c1\u03b3\u03b5\u03af\u03bf", - "HeaderPeople": "People", - "ValueSpecialEpisodeName": "Special - {0}", - "LabelChapterName": "Chapter {0}", - "NameSeasonNumber": "Season {0}", - "LabelExit": "\u0388\u03be\u03bf\u03b4\u03bf\u03c2", - "LabelVisitCommunity": "\u039a\u03bf\u03b9\u03bd\u03cc\u03c4\u03b7\u03c4\u03b1", - "LabelGithub": "Github", - "LabelApiDocumentation": "Api Documentation", - "LabelDeveloperResources": "\u03a0\u03b7\u03b3\u03ad\u03c2 \u03a0\u03c1\u03bf\u03b3\u03c1\u03b1\u03bc\u03bc\u03b1\u03c4\u03b9\u03c3\u03c4\u03ae", - "LabelBrowseLibrary": "\u03a0\u03b5\u03c1\u03b9\u03b7\u03b3\u03b7\u03b8\u03b5\u03af\u03c4\u03b5 \u03c3\u03c4\u03b7 \u03b2\u03b9\u03b2\u03bb\u03b9\u03bf\u03b8\u03ae\u03ba\u03b7", - "LabelConfigureServer": "\u03a1\u03c5\u03b8\u03bc\u03af\u03c3\u03b5\u03b9\u03c2 Emby", - "LabelRestartServer": "\u0395\u03c0\u03b1\u03bd\u03b5\u03ba\u03ba\u03af\u03bd\u03b7\u03c3\u03b7 \u03b4\u03b9\u03b1\u03ba\u03bf\u03bc\u03b9\u03c3\u03c4\u03ae", - "CategorySync": "\u03a3\u03c5\u03c7\u03c1\u03bf\u03bd\u03b9\u03c3\u03bc\u03cc\u03c2", - "CategoryUser": "User", - "CategorySystem": "System", - "CategoryApplication": "Application", - "CategoryPlugin": "Plugin", - "NotificationOptionPluginError": "Plugin failure", - "NotificationOptionApplicationUpdateAvailable": "Application update available", - "NotificationOptionApplicationUpdateInstalled": "Application update installed", - "NotificationOptionPluginUpdateInstalled": "Plugin update installed", - "NotificationOptionPluginInstalled": "Plugin installed", - "NotificationOptionPluginUninstalled": "Plugin uninstalled", - "NotificationOptionVideoPlayback": "Video playback started", - "NotificationOptionAudioPlayback": "Audio playback started", - "NotificationOptionGamePlayback": "Game playback started", - "NotificationOptionVideoPlaybackStopped": "Video playback stopped", - "NotificationOptionAudioPlaybackStopped": "Audio playback stopped", - "NotificationOptionGamePlaybackStopped": "Game playback stopped", - "NotificationOptionTaskFailed": "Scheduled task failure", - "NotificationOptionInstallationFailed": "Installation failure", - "NotificationOptionNewLibraryContent": "New content added", - "NotificationOptionNewLibraryContentMultiple": "New content added (multiple)", - "NotificationOptionCameraImageUploaded": "Camera image uploaded", - "NotificationOptionUserLockedOut": "User locked out", - "NotificationOptionServerRestartRequired": "Server restart required", - "ViewTypePlaylists": "Playlists", - "ViewTypeMovies": "Movies", - "ViewTypeTvShows": "TV", - "ViewTypeGames": "Games", - "ViewTypeMusic": "Music", - "ViewTypeMusicGenres": "Genres", - "ViewTypeMusicArtists": "Artists", - "ViewTypeBoxSets": "Collections", - "ViewTypeChannels": "Channels", - "ViewTypeLiveTV": "Live TV", - "ViewTypeLiveTvNowPlaying": "Now Airing", - "ViewTypeLatestGames": "Latest Games", - "ViewTypeRecentlyPlayedGames": "Recently Played", - "ViewTypeGameFavorites": "Favorites", - "ViewTypeGameSystems": "Game Systems", - "ViewTypeGameGenres": "Genres", - "ViewTypeTvResume": "Resume", - "ViewTypeTvNextUp": "Next Up", - "ViewTypeTvLatest": "Latest", - "ViewTypeTvShowSeries": "Series", - "ViewTypeTvGenres": "Genres", - "ViewTypeTvFavoriteSeries": "Favorite Series", - "ViewTypeTvFavoriteEpisodes": "Favorite Episodes", - "ViewTypeMovieResume": "Resume", - "ViewTypeMovieLatest": "Latest", - "ViewTypeMovieMovies": "Movies", - "ViewTypeMovieCollections": "Collections", - "ViewTypeMovieFavorites": "Favorites", - "ViewTypeMovieGenres": "Genres", - "ViewTypeMusicLatest": "Latest", - "ViewTypeMusicPlaylists": "Playlists", - "ViewTypeMusicAlbums": "Albums", - "ViewTypeMusicAlbumArtists": "Album Artists", - "HeaderOtherDisplaySettings": "Display Settings", - "ViewTypeMusicSongs": "Songs", - "ViewTypeMusicFavorites": "Favorites", - "ViewTypeMusicFavoriteAlbums": "Favorite Albums", - "ViewTypeMusicFavoriteArtists": "Favorite Artists", - "ViewTypeMusicFavoriteSongs": "Favorite Songs", - "ViewTypeFolders": "Folders", - "ViewTypeLiveTvRecordingGroups": "Recordings", - "ViewTypeLiveTvChannels": "Channels", - "ScheduledTaskFailedWithName": "{0} failed", - "LabelRunningTimeValue": "Running time: {0}", - "ScheduledTaskStartedWithName": "{0} started", - "VersionNumber": "\u0388\u03ba\u03b4\u03bf\u03c3\u03b7 {0}", - "PluginInstalledWithName": "{0} was installed", - "PluginUpdatedWithName": "{0} was updated", - "PluginUninstalledWithName": "{0} was uninstalled", - "ItemAddedWithName": "{0} was added to the library", - "ItemRemovedWithName": "{0} was removed from the library", - "LabelIpAddressValue": "Ip address: {0}", - "DeviceOnlineWithName": "{0} is connected", - "UserOnlineFromDevice": "{0} is online from {1}", - "ProviderValue": "Provider: {0}", - "SubtitlesDownloadedForItem": "Subtitles downloaded for {0}", - "UserConfigurationUpdatedWithName": "User configuration has been updated for {0}", - "UserCreatedWithName": "User {0} has been created", - "UserPasswordChangedWithName": "Password has been changed for user {0}", - "UserDeletedWithName": "User {0} has been deleted", - "MessageServerConfigurationUpdated": "Server configuration has been updated", - "MessageNamedServerConfigurationUpdatedWithValue": "Server configuration section {0} has been updated", - "MessageApplicationUpdated": "Emby Server has been updated", - "FailedLoginAttemptWithUserName": "Failed login attempt from {0}", - "AuthenticationSucceededWithUserName": "{0} successfully authenticated", - "DeviceOfflineWithName": "{0} has disconnected", - "UserLockedOutWithName": "User {0} has been locked out", - "UserOfflineFromDevice": "{0} has disconnected from {1}", - "UserStartedPlayingItemWithValues": "{0} has started playing {1}", - "UserStoppedPlayingItemWithValues": "{0} has stopped playing {1}", - "SubtitleDownloadFailureForItem": "Subtitles failed to download for {0}", - "HeaderUnidentified": "Unidentified", - "HeaderImagePrimary": "Primary", - "HeaderImageBackdrop": "Backdrop", - "HeaderImageLogo": "Logo", - "HeaderUserPrimaryImage": "User Image", - "HeaderOverview": "Overview", - "HeaderShortOverview": "Short Overview", - "HeaderType": "Type", - "HeaderSeverity": "Severity", - "HeaderUser": "User", - "HeaderName": "Name", - "HeaderDate": "Date", - "HeaderPremiereDate": "Premiere Date", - "HeaderDateAdded": "Date Added", - "HeaderReleaseDate": "Release date", - "HeaderRuntime": "Runtime", - "HeaderPlayCount": "Play Count", - "HeaderSeason": "Season", - "HeaderSeasonNumber": "Season number", - "HeaderSeries": "Series:", - "HeaderNetwork": "Network", - "HeaderYear": "Year:", - "HeaderYears": "Years:", - "HeaderParentalRating": "Parental Rating", - "HeaderCommunityRating": "Community rating", - "HeaderTrailers": "Trailers", - "HeaderSpecials": "Specials", - "HeaderGameSystems": "Game Systems", - "HeaderPlayers": "Players:", - "HeaderAlbumArtists": "Album Artists", - "HeaderAlbums": "Albums", - "HeaderDisc": "Disc", - "HeaderTrack": "Track", - "HeaderAudio": "\u0389\u03c7\u03bf\u03c2", - "HeaderVideo": "\u0392\u03af\u03bd\u03c4\u03b5\u03bf", - "HeaderEmbeddedImage": "Embedded image", - "HeaderResolution": "Resolution", - "HeaderSubtitles": "Subtitles", - "HeaderGenres": "Genres", - "HeaderCountries": "Countries", - "HeaderStatus": "Status", - "HeaderTracks": "Tracks", - "HeaderMusicArtist": "Music artist", - "HeaderLocked": "Locked", - "HeaderStudios": "Studios", - "HeaderActor": "Actors", - "HeaderComposer": "Composers", - "HeaderDirector": "Directors", - "HeaderGuestStar": "Guest star", - "HeaderProducer": "Producers", - "HeaderWriter": "Writers", - "HeaderParentalRatings": "Parental Ratings", - "HeaderCommunityRatings": "Community ratings", - "StartupEmbyServerIsLoading": "Emby Server is loading. Please try again shortly." -}
\ No newline at end of file diff --git a/Emby.Server.Implementations/Localization/Core/en-GB.json b/Emby.Server.Implementations/Localization/Core/en-GB.json index 493c6c4e9..8dc9abf01 100644 --- a/Emby.Server.Implementations/Localization/Core/en-GB.json +++ b/Emby.Server.Implementations/Localization/Core/en-GB.json @@ -1,178 +1,96 @@ { - "DbUpgradeMessage": "Please wait while your Emby Server database is upgraded. {0}% complete.", + "Latest": "Latest", + "ValueSpecialEpisodeName": "Special - {0}", + "Inherit": "Inherit", + "Books": "Books", + "Music": "Music", + "Games": "Games", + "Photos": "Photos", + "MixedContent": "Mixed content", + "MusicVideos": "Music videos", + "HomeVideos": "Home videos", + "Playlists": "Playlists", + "HeaderRecordingGroups": "Recording Groups", + "HeaderContinueWatching": "Continue Watching", + "HeaderFavoriteArtists": "Favourite Artists", + "HeaderFavoriteSongs": "Favourite Songs", + "HeaderAlbumArtists": "Album Artists", + "HeaderFavoriteAlbums": "Favourite Albums", + "HeaderFavoriteEpisodes": "Favourite Episodes", + "HeaderFavoriteShows": "Favourite Shows", + "HeaderNextUp": "Next Up", + "Favorites": "Favourites", + "Collections": "Collections", + "Channels": "Channels", + "Movies": "Movies", + "Albums": "Albums", + "Artists": "Artists", + "Folders": "Folders", + "Songs": "Songs", + "TvShows": "TV Shows", + "Shows": "Shows", + "Genres": "Genres", + "NameSeasonNumber": "Season {0}", "AppDeviceValues": "App: {0}, Device: {1}", "UserDownloadingItemWithValues": "{0} is downloading {1}", - "FolderTypeMixed": "Mixed content", - "FolderTypeMovies": "Movies", - "FolderTypeMusic": "Music", - "FolderTypeAdultVideos": "Adult videos", - "FolderTypePhotos": "Photos", - "FolderTypeMusicVideos": "Music videos", - "FolderTypeHomeVideos": "Home videos", - "FolderTypeGames": "Games", - "FolderTypeBooks": "Books", - "FolderTypeTvShows": "TV", - "FolderTypeInherit": "Inherit", - "HeaderCastCrew": "Cast & Crew", - "HeaderPeople": "People", - "ValueSpecialEpisodeName": "Special - {0}", - "LabelChapterName": "Chapter {0}", - "NameSeasonNumber": "Series {0}", - "LabelExit": "Exit", - "LabelVisitCommunity": "Visit Community", - "LabelGithub": "Github", - "LabelApiDocumentation": "Api Documentation", - "LabelDeveloperResources": "Developer Resources", - "LabelBrowseLibrary": "Browse Library", - "LabelConfigureServer": "Configure Emby", - "LabelRestartServer": "Restart Server", - "CategorySync": "Sync", - "CategoryUser": "User", - "CategorySystem": "System", - "CategoryApplication": "Application", - "CategoryPlugin": "Plugin", - "NotificationOptionPluginError": "Plugin failure", - "NotificationOptionApplicationUpdateAvailable": "Application update available", - "NotificationOptionApplicationUpdateInstalled": "Application update installed", - "NotificationOptionPluginUpdateInstalled": "Plugin update installed", - "NotificationOptionPluginInstalled": "Plugin installed", - "NotificationOptionPluginUninstalled": "Plugin uninstalled", - "NotificationOptionVideoPlayback": "Video playback started", - "NotificationOptionAudioPlayback": "Audio playback started", - "NotificationOptionGamePlayback": "Game playback started", - "NotificationOptionVideoPlaybackStopped": "Video playback stopped", - "NotificationOptionAudioPlaybackStopped": "Audio playback stopped", - "NotificationOptionGamePlaybackStopped": "Game playback stopped", - "NotificationOptionTaskFailed": "Scheduled task failure", - "NotificationOptionInstallationFailed": "Installation failure", - "NotificationOptionNewLibraryContent": "New content added", - "NotificationOptionNewLibraryContentMultiple": "New (multiple) content added", - "NotificationOptionCameraImageUploaded": "Camera image uploaded", - "NotificationOptionUserLockedOut": "User locked out", - "NotificationOptionServerRestartRequired": "Server restart required", - "ViewTypePlaylists": "Playlists", - "ViewTypeMovies": "Movies", - "ViewTypeTvShows": "TV", - "ViewTypeGames": "Games", - "ViewTypeMusic": "Music", - "ViewTypeMusicGenres": "Genres", - "ViewTypeMusicArtists": "Artists", - "ViewTypeBoxSets": "Collections", - "ViewTypeChannels": "Channels", - "ViewTypeLiveTV": "Live TV", - "ViewTypeLiveTvNowPlaying": "Now Showing", - "ViewTypeLatestGames": "Latest Games", - "ViewTypeRecentlyPlayedGames": "Recently Played", - "ViewTypeGameFavorites": "Favourites", - "ViewTypeGameSystems": "Game Systems", - "ViewTypeGameGenres": "Genres", - "ViewTypeTvResume": "Resume", - "ViewTypeTvNextUp": "Next Up", - "ViewTypeTvLatest": "Latest", - "ViewTypeTvShowSeries": "Series", - "ViewTypeTvGenres": "Genres", - "ViewTypeTvFavoriteSeries": "Favourite Series", - "ViewTypeTvFavoriteEpisodes": "Favourite Episodes", - "ViewTypeMovieResume": "Resume", - "ViewTypeMovieLatest": "Latest", - "ViewTypeMovieMovies": "Movies", - "ViewTypeMovieCollections": "Collections", - "ViewTypeMovieFavorites": "Favourites", - "ViewTypeMovieGenres": "Genres", - "ViewTypeMusicLatest": "Latest", - "ViewTypeMusicPlaylists": "Playlists", - "ViewTypeMusicAlbums": "Albums", - "ViewTypeMusicAlbumArtists": "Album Artists", - "HeaderOtherDisplaySettings": "Display Settings", - "ViewTypeMusicSongs": "Songs", - "ViewTypeMusicFavorites": "Favourites", - "ViewTypeMusicFavoriteAlbums": "Favourite Albums", - "ViewTypeMusicFavoriteArtists": "Favourite Artists", - "ViewTypeMusicFavoriteSongs": "Favourite Songs", - "ViewTypeFolders": "Folders", - "ViewTypeLiveTvRecordingGroups": "Recordings", - "ViewTypeLiveTvChannels": "Channels", + "HeaderLiveTV": "Live TV", + "ChapterNameValue": "Chapter {0}", "ScheduledTaskFailedWithName": "{0} failed", "LabelRunningTimeValue": "Running time: {0}", "ScheduledTaskStartedWithName": "{0} started", "VersionNumber": "Version {0}", "PluginInstalledWithName": "{0} was installed", + "StartupEmbyServerIsLoading": "Emby Server is loading. Please try again shortly.", "PluginUpdatedWithName": "{0} was updated", "PluginUninstalledWithName": "{0} was uninstalled", "ItemAddedWithName": "{0} was added to the library", "ItemRemovedWithName": "{0} was removed from the library", - "LabelIpAddressValue": "Ip address: {0}", + "LabelIpAddressValue": "IP address: {0}", "DeviceOnlineWithName": "{0} is connected", "UserOnlineFromDevice": "{0} is online from {1}", "ProviderValue": "Provider: {0}", "SubtitlesDownloadedForItem": "Subtitles downloaded for {0}", - "UserConfigurationUpdatedWithName": "User configuration has been updated for {0}", "UserCreatedWithName": "User {0} has been created", "UserPasswordChangedWithName": "Password has been changed for user {0}", "UserDeletedWithName": "User {0} has been deleted", + "UserConfigurationUpdatedWithName": "User configuration has been updated for {0}", "MessageServerConfigurationUpdated": "Server configuration has been updated", "MessageNamedServerConfigurationUpdatedWithValue": "Server configuration section {0} has been updated", "MessageApplicationUpdated": "Emby Server has been updated", "FailedLoginAttemptWithUserName": "Failed login attempt from {0}", "AuthenticationSucceededWithUserName": "{0} successfully authenticated", - "DeviceOfflineWithName": "{0} has disconnected", - "UserLockedOutWithName": "User {0} has been locked out", "UserOfflineFromDevice": "{0} has disconnected from {1}", + "DeviceOfflineWithName": "{0} has disconnected", "UserStartedPlayingItemWithValues": "{0} has started playing {1}", "UserStoppedPlayingItemWithValues": "{0} has stopped playing {1}", + "NotificationOptionPluginError": "Plugin failure", + "NotificationOptionApplicationUpdateAvailable": "Application update available", + "NotificationOptionApplicationUpdateInstalled": "Application update installed", + "NotificationOptionPluginUpdateInstalled": "Plugin update installed", + "NotificationOptionPluginInstalled": "Plugin installed", + "NotificationOptionPluginUninstalled": "Plugin uninstalled", + "NotificationOptionVideoPlayback": "Video playback started", + "NotificationOptionAudioPlayback": "Audio playback started", + "NotificationOptionGamePlayback": "Game playback started", + "NotificationOptionVideoPlaybackStopped": "Video playback stopped", + "NotificationOptionAudioPlaybackStopped": "Audio playback stopped", + "NotificationOptionGamePlaybackStopped": "Game playback stopped", + "NotificationOptionTaskFailed": "Scheduled task failure", + "NotificationOptionInstallationFailed": "Installation failure", + "NotificationOptionNewLibraryContent": "New content added", + "NotificationOptionCameraImageUploaded": "Camera image uploaded", + "NotificationOptionUserLockedOut": "User locked out", + "NotificationOptionServerRestartRequired": "Server restart required", + "UserLockedOutWithName": "User {0} has been locked out", "SubtitleDownloadFailureForItem": "Subtitles failed to download for {0}", - "HeaderUnidentified": "Unidentified", - "HeaderImagePrimary": "Primary", - "HeaderImageBackdrop": "Backdrop", - "HeaderImageLogo": "Logo", - "HeaderUserPrimaryImage": "User Image", - "HeaderOverview": "Overview", - "HeaderShortOverview": "Short Overview", - "HeaderType": "Type", - "HeaderSeverity": "Severity", - "HeaderUser": "User", - "HeaderName": "Name", - "HeaderDate": "Date", - "HeaderPremiereDate": "Premiere Date", - "HeaderDateAdded": "Date Added", - "HeaderReleaseDate": "Release date", - "HeaderRuntime": "Runtime", - "HeaderPlayCount": "Play Count", - "HeaderSeason": "Season", - "HeaderSeasonNumber": "Season number", - "HeaderSeries": "Series:", - "HeaderNetwork": "Network", - "HeaderYear": "Year:", - "HeaderYears": "Years:", - "HeaderParentalRating": "Parental Rating", - "HeaderCommunityRating": "Community rating", - "HeaderTrailers": "Trailers", - "HeaderSpecials": "Specials", - "HeaderGameSystems": "Game Systems", - "HeaderPlayers": "Players:", - "HeaderAlbumArtists": "Album Artists", - "HeaderAlbums": "Albums", - "HeaderDisc": "Disc", - "HeaderTrack": "Track", - "HeaderAudio": "Audio", - "HeaderVideo": "Video", - "HeaderEmbeddedImage": "Embedded image", - "HeaderResolution": "Resolution", - "HeaderSubtitles": "Subtitles", - "HeaderGenres": "Genres", - "HeaderCountries": "Countries", - "HeaderStatus": "Status", - "HeaderTracks": "Tracks", - "HeaderMusicArtist": "Music artist", - "HeaderLocked": "Locked", - "HeaderStudios": "Studios", - "HeaderActor": "Actors", - "HeaderComposer": "Composers", - "HeaderDirector": "Directors", - "HeaderGuestStar": "Guest star", - "HeaderProducer": "Producers", - "HeaderWriter": "Writers", - "HeaderParentalRatings": "Parental Ratings", - "HeaderCommunityRatings": "Community ratings", - "StartupEmbyServerIsLoading": "Emby Server is loading. Please try again shortly." + "Sync": "Sync", + "User": "User", + "System": "System", + "Application": "Application", + "Plugin": "Plugin", + "LabelExit": "Exit", + "LabelVisitCommunity": "Visit Community", + "LabelBrowseLibrary": "Browse Library", + "LabelConfigureServer": "Configure Emby", + "LabelRestartServer": "Restart Server" }
\ No newline at end of file diff --git a/Emby.Server.Implementations/Localization/Core/en-US.json b/Emby.Server.Implementations/Localization/Core/en-US.json index c7f865233..51bbf341f 100644 --- a/Emby.Server.Implementations/Localization/Core/en-US.json +++ b/Emby.Server.Implementations/Localization/Core/en-US.json @@ -1,98 +1,46 @@ { - "AppDeviceValues": "App: {0}, Device: {1}", - "UserDownloadingItemWithValues": "{0} is downloading {1}", - "FolderTypeMixed": "Mixed content", - "FolderTypeMovies": "Movies", - "FolderTypeMusic": "Music", - "FolderTypeAdultVideos": "Adult videos", - "FolderTypePhotos": "Photos", - "FolderTypeMusicVideos": "Music videos", - "FolderTypeHomeVideos": "Home videos", - "FolderTypeGames": "Games", - "FolderTypeBooks": "Books", - "FolderTypeTvShows": "TV", - "FolderTypeInherit": "Inherit", + "Latest": "Latest", "ValueSpecialEpisodeName": "Special - {0}", - "LabelChapterName": "Chapter {0}", - "NameSeasonUnknown": "Season Unknown", + "Inherit": "Inherit", + "Books": "Books", + "Music": "Music", + "Games": "Games", + "Photos": "Photos", + "MixedContent": "Mixed content", + "MusicVideos": "Music videos", + "HomeVideos": "Home videos", + "Playlists": "Playlists", + "HeaderRecordingGroups": "Recording Groups", + "HeaderContinueWatching": "Continue Watching", + "HeaderFavoriteArtists": "Favorite Artists", + "HeaderFavoriteSongs": "Favorite Songs", + "HeaderAlbumArtists": "Album Artists", + "HeaderFavoriteAlbums": "Favorite Albums", + "HeaderFavoriteEpisodes": "Favorite Episodes", + "HeaderFavoriteShows": "Favorite Shows", + "HeaderNextUp": "Next Up", + "Favorites": "Favorites", + "Collections": "Collections", + "Channels": "Channels", + "Movies": "Movies", + "Albums": "Albums", + "Artists": "Artists", + "Folders": "Folders", + "Songs": "Songs", + "TvShows": "TV Shows", + "Shows": "Shows", + "Genres": "Genres", "NameSeasonNumber": "Season {0}", - "LabelExit": "Exit", - "LabelVisitCommunity": "Visit Community", - "LabelApiDocumentation": "Api Documentation", - "LabelDeveloperResources": "Developer Resources", - "LabelBrowseLibrary": "Browse Library", - "LabelConfigureServer": "Configure Emby", - "LabelRestartServer": "Restart Server", - "CategorySync": "Sync", - "CategoryUser": "User", - "CategorySystem": "System", - "CategoryApplication": "Application", - "CategoryPlugin": "Plugin", - "NotificationOptionPluginError": "Plugin failure", - "NotificationOptionApplicationUpdateAvailable": "Application update available", - "NotificationOptionApplicationUpdateInstalled": "Application update installed", - "NotificationOptionPluginUpdateInstalled": "Plugin update installed", - "NotificationOptionPluginInstalled": "Plugin installed", - "NotificationOptionPluginUninstalled": "Plugin uninstalled", - "NotificationOptionVideoPlayback": "Video playback started", - "NotificationOptionAudioPlayback": "Audio playback started", - "NotificationOptionGamePlayback": "Game playback started", - "NotificationOptionVideoPlaybackStopped": "Video playback stopped", - "NotificationOptionAudioPlaybackStopped": "Audio playback stopped", - "NotificationOptionGamePlaybackStopped": "Game playback stopped", - "NotificationOptionTaskFailed": "Scheduled task failure", - "NotificationOptionInstallationFailed": "Installation failure", - "NotificationOptionNewLibraryContent": "New content added", - "NotificationOptionCameraImageUploaded": "Camera image uploaded", - "NotificationOptionUserLockedOut": "User locked out", - "NotificationOptionServerRestartRequired": "Server restart required", - "ViewTypePlaylists": "Playlists", - "ViewTypeMovies": "Movies", - "ViewTypeTvShows": "TV", - "ViewTypeGames": "Games", - "ViewTypeMusic": "Music", - "ViewTypeMusicGenres": "Genres", - "ViewTypeMusicArtists": "Artists", - "ViewTypeBoxSets": "Collections", - "ViewTypeChannels": "Channels", - "ViewTypeLiveTV": "Live TV", - "ViewTypeLiveTvNowPlaying": "Now Airing", - "ViewTypeLatestGames": "Latest Games", - "ViewTypeRecentlyPlayedGames": "Recently Played", - "ViewTypeGameFavorites": "Favorites", - "ViewTypeGameSystems": "Game Systems", - "ViewTypeGameGenres": "Genres", - "ViewTypeTvResume": "Resume", - "ViewTypeTvNextUp": "Next Up", - "ViewTypeTvLatest": "Latest", - "ViewTypeTvShowSeries": "Shows", - "ViewTypeTvGenres": "Genres", - "ViewTypeTvFavoriteSeries": "Favorite Series", - "ViewTypeTvFavoriteEpisodes": "Favorite Episodes", - "ViewTypeMovieResume": "Resume", - "ViewTypeMovieLatest": "Latest", - "ViewTypeMovieMovies": "Movies", - "ViewTypeMovieCollections": "Collections", - "ViewTypeMovieFavorites": "Favorites", - "ViewTypeMovieGenres": "Genres", - "ViewTypeMusicLatest": "Latest", - "ViewTypeMusicPlaylists": "Playlists", - "ViewTypeMusicAlbums": "Albums", - "ViewTypeMusicAlbumArtists": "Album Artists", - "HeaderOtherDisplaySettings": "Display Settings", - "ViewTypeMusicSongs": "Songs", - "ViewTypeMusicFavorites": "Favorites", - "ViewTypeMusicFavoriteAlbums": "Favorite Albums", - "ViewTypeMusicFavoriteArtists": "Favorite Artists", - "ViewTypeMusicFavoriteSongs": "Favorite Songs", - "ViewTypeFolders": "Folders", - "ViewTypeLiveTvRecordingGroups": "Recordings", - "ViewTypeLiveTvChannels": "Channels", + "AppDeviceValues": "App: {0}, Device: {1}", + "UserDownloadingItemWithValues": "{0} is downloading {1}", + "HeaderLiveTV": "Live TV", + "ChapterNameValue": "Chapter {0}", "ScheduledTaskFailedWithName": "{0} failed", "LabelRunningTimeValue": "Running time: {0}", "ScheduledTaskStartedWithName": "{0} started", "VersionNumber": "Version {0}", "PluginInstalledWithName": "{0} was installed", + "StartupEmbyServerIsLoading": "Emby Server is loading. Please try again shortly.", "PluginUpdatedWithName": "{0} was updated", "PluginUninstalledWithName": "{0} was uninstalled", "ItemAddedWithName": "{0} was added to the library", @@ -102,63 +50,47 @@ "UserOnlineFromDevice": "{0} is online from {1}", "ProviderValue": "Provider: {0}", "SubtitlesDownloadedForItem": "Subtitles downloaded for {0}", - "UserConfigurationUpdatedWithName": "User configuration has been updated for {0}", "UserCreatedWithName": "User {0} has been created", "UserPasswordChangedWithName": "Password has been changed for user {0}", "UserDeletedWithName": "User {0} has been deleted", + "UserConfigurationUpdatedWithName": "User configuration has been updated for {0}", "MessageServerConfigurationUpdated": "Server configuration has been updated", "MessageNamedServerConfigurationUpdatedWithValue": "Server configuration section {0} has been updated", "MessageApplicationUpdated": "Emby Server has been updated", "FailedLoginAttemptWithUserName": "Failed login attempt from {0}", "AuthenticationSucceededWithUserName": "{0} successfully authenticated", - "DeviceOfflineWithName": "{0} has disconnected", - "UserLockedOutWithName": "User {0} has been locked out", "UserOfflineFromDevice": "{0} has disconnected from {1}", + "DeviceOfflineWithName": "{0} has disconnected", "UserStartedPlayingItemWithValues": "{0} has started playing {1}", "UserStoppedPlayingItemWithValues": "{0} has stopped playing {1}", + "NotificationOptionPluginError": "Plugin failure", + "NotificationOptionApplicationUpdateAvailable": "Application update available", + "NotificationOptionApplicationUpdateInstalled": "Application update installed", + "NotificationOptionPluginUpdateInstalled": "Plugin update installed", + "NotificationOptionPluginInstalled": "Plugin installed", + "NotificationOptionPluginUninstalled": "Plugin uninstalled", + "NotificationOptionVideoPlayback": "Video playback started", + "NotificationOptionAudioPlayback": "Audio playback started", + "NotificationOptionGamePlayback": "Game playback started", + "NotificationOptionVideoPlaybackStopped": "Video playback stopped", + "NotificationOptionAudioPlaybackStopped": "Audio playback stopped", + "NotificationOptionGamePlaybackStopped": "Game playback stopped", + "NotificationOptionTaskFailed": "Scheduled task failure", + "NotificationOptionInstallationFailed": "Installation failure", + "NotificationOptionNewLibraryContent": "New content added", + "NotificationOptionCameraImageUploaded": "Camera image uploaded", + "NotificationOptionUserLockedOut": "User locked out", + "NotificationOptionServerRestartRequired": "Server restart required", + "UserLockedOutWithName": "User {0} has been locked out", "SubtitleDownloadFailureForItem": "Subtitles failed to download for {0}", - "HeaderUnidentified": "Unidentified", - "HeaderImagePrimary": "Primary", - "HeaderImageBackdrop": "Backdrop", - "HeaderImageLogo": "Logo", - "HeaderUserPrimaryImage": "User Image", - "HeaderOverview": "Overview", - "HeaderShortOverview": "Short Overview", - "HeaderType": "Type", - "HeaderSeverity": "Severity", - "HeaderUser": "User", - "HeaderName": "Name", - "HeaderDate": "Date", - "HeaderPremiereDate": "Premiere Date", - "HeaderDateAdded": "Date Added", - "HeaderReleaseDate": "Release date", - "HeaderRuntime": "Runtime", - "HeaderPlayCount": "Play Count", - "HeaderSeason": "Season", - "HeaderSeasonNumber": "Season number", - "HeaderSeries": "Series:", - "HeaderNetwork": "Network", - "HeaderYear": "Year:", - "HeaderYears": "Years:", - "HeaderParentalRating": "Parental Rating", - "HeaderCommunityRating": "Community rating", - "HeaderTrailers": "Trailers", - "HeaderSpecials": "Specials", - "HeaderGameSystems": "Game Systems", - "HeaderPlayers": "Players:", - "HeaderAlbumArtists": "Album Artists", - "HeaderAlbums": "Albums", - "HeaderDisc": "Disc", - "HeaderTrack": "Track", - "HeaderAudio": "Audio", - "HeaderVideo": "Video", - "HeaderEmbeddedImage": "Embedded image", - "HeaderResolution": "Resolution", - "HeaderSubtitles": "Subtitles", - "HeaderGenres": "Genres", - "HeaderCountries": "Countries", - "HeaderStatus": "Status", - "HeaderTracks": "Tracks", - "HeaderMusicArtist": "Music artist", - "StartupEmbyServerIsLoading": "Emby Server is loading. Please try again shortly." + "Sync": "Sync", + "User": "User", + "System": "System", + "Application": "Application", + "Plugin": "Plugin", + "LabelExit": "Exit", + "LabelVisitCommunity": "Visit Community", + "LabelBrowseLibrary": "Browse Library", + "LabelConfigureServer": "Configure Emby", + "LabelRestartServer": "Restart Server" }
\ No newline at end of file diff --git a/Emby.Server.Implementations/Localization/Core/es-AR.json b/Emby.Server.Implementations/Localization/Core/es-AR.json index 0555aa9d9..e4a49abf6 100644 --- a/Emby.Server.Implementations/Localization/Core/es-AR.json +++ b/Emby.Server.Implementations/Localization/Core/es-AR.json @@ -1,102 +1,46 @@ { - "DbUpgradeMessage": "Please wait while your Emby Server database is upgraded. {0}% complete.", - "AppDeviceValues": "App: {0}, Device: {1}", - "UserDownloadingItemWithValues": "{0} is downloading {1}", - "FolderTypeMixed": "Mixed content", - "FolderTypeMovies": "Movies", - "FolderTypeMusic": "Music", - "FolderTypeAdultVideos": "Adult videos", - "FolderTypePhotos": "Photos", - "FolderTypeMusicVideos": "Music videos", - "FolderTypeHomeVideos": "Home videos", - "FolderTypeGames": "Games", - "FolderTypeBooks": "Books", - "FolderTypeTvShows": "TV", - "FolderTypeInherit": "Inherit", - "HeaderCastCrew": "Cast & Crew", - "HeaderPeople": "People", + "Latest": "Latest", "ValueSpecialEpisodeName": "Special - {0}", - "LabelChapterName": "Chapter {0}", + "Inherit": "Inherit", + "Books": "Books", + "Music": "Music", + "Games": "Games", + "Photos": "Photos", + "MixedContent": "Mixed content", + "MusicVideos": "Music videos", + "HomeVideos": "Home videos", + "Playlists": "Playlists", + "HeaderRecordingGroups": "Recording Groups", + "HeaderContinueWatching": "Continue Watching", + "HeaderFavoriteArtists": "Favorite Artists", + "HeaderFavoriteSongs": "Favorite Songs", + "HeaderAlbumArtists": "Album Artists", + "HeaderFavoriteAlbums": "Favorite Albums", + "HeaderFavoriteEpisodes": "Favorite Episodes", + "HeaderFavoriteShows": "Favorite Shows", + "HeaderNextUp": "Next Up", + "Favorites": "Favorites", + "Collections": "Collections", + "Channels": "Channels", + "Movies": "Movies", + "Albums": "Albums", + "Artists": "Artists", + "Folders": "Folders", + "Songs": "Songs", + "TvShows": "TV Shows", + "Shows": "Series", + "Genres": "Genres", "NameSeasonNumber": "Season {0}", - "LabelExit": "Salir", - "LabelVisitCommunity": "Visit Community", - "LabelGithub": "Github", - "LabelApiDocumentation": "Documentaci\u00f3n API", - "LabelDeveloperResources": "Developer Resources", - "LabelBrowseLibrary": "Browse Library", - "LabelConfigureServer": "Configurar Emby", - "LabelRestartServer": "Reiniciar el servidor", - "CategorySync": "Sync", - "CategoryUser": "User", - "CategorySystem": "System", - "CategoryApplication": "Application", - "CategoryPlugin": "Plugin", - "NotificationOptionPluginError": "Plugin failure", - "NotificationOptionApplicationUpdateAvailable": "Application update available", - "NotificationOptionApplicationUpdateInstalled": "Application update installed", - "NotificationOptionPluginUpdateInstalled": "Plugin update installed", - "NotificationOptionPluginInstalled": "Plugin installed", - "NotificationOptionPluginUninstalled": "Plugin uninstalled", - "NotificationOptionVideoPlayback": "Video playback started", - "NotificationOptionAudioPlayback": "Audio playback started", - "NotificationOptionGamePlayback": "Game playback started", - "NotificationOptionVideoPlaybackStopped": "Video playback stopped", - "NotificationOptionAudioPlaybackStopped": "Audio playback stopped", - "NotificationOptionGamePlaybackStopped": "Game playback stopped", - "NotificationOptionTaskFailed": "Scheduled task failure", - "NotificationOptionInstallationFailed": "Installation failure", - "NotificationOptionNewLibraryContent": "New content added", - "NotificationOptionNewLibraryContentMultiple": "New content added (multiple)", - "NotificationOptionCameraImageUploaded": "Camera image uploaded", - "NotificationOptionUserLockedOut": "User locked out", - "NotificationOptionServerRestartRequired": "Server restart required", - "ViewTypePlaylists": "Playlists", - "ViewTypeMovies": "Movies", - "ViewTypeTvShows": "TV", - "ViewTypeGames": "Games", - "ViewTypeMusic": "Music", - "ViewTypeMusicGenres": "Genres", - "ViewTypeMusicArtists": "Artists", - "ViewTypeBoxSets": "Collections", - "ViewTypeChannels": "Channels", - "ViewTypeLiveTV": "Live TV", - "ViewTypeLiveTvNowPlaying": "Now Airing", - "ViewTypeLatestGames": "Latest Games", - "ViewTypeRecentlyPlayedGames": "Recently Played", - "ViewTypeGameFavorites": "Favorites", - "ViewTypeGameSystems": "Game Systems", - "ViewTypeGameGenres": "Genres", - "ViewTypeTvResume": "Resume", - "ViewTypeTvNextUp": "Next Up", - "ViewTypeTvLatest": "Latest", - "ViewTypeTvShowSeries": "Series", - "ViewTypeTvGenres": "Genres", - "ViewTypeTvFavoriteSeries": "Favorite Series", - "ViewTypeTvFavoriteEpisodes": "Favorite Episodes", - "ViewTypeMovieResume": "Resume", - "ViewTypeMovieLatest": "Latest", - "ViewTypeMovieMovies": "Movies", - "ViewTypeMovieCollections": "Collections", - "ViewTypeMovieFavorites": "Favorites", - "ViewTypeMovieGenres": "Genres", - "ViewTypeMusicLatest": "Latest", - "ViewTypeMusicPlaylists": "Playlists", - "ViewTypeMusicAlbums": "Albums", - "ViewTypeMusicAlbumArtists": "Album Artists", - "HeaderOtherDisplaySettings": "Display Settings", - "ViewTypeMusicSongs": "Songs", - "ViewTypeMusicFavorites": "Favorites", - "ViewTypeMusicFavoriteAlbums": "Favorite Albums", - "ViewTypeMusicFavoriteArtists": "Favorite Artists", - "ViewTypeMusicFavoriteSongs": "Favorite Songs", - "ViewTypeFolders": "Folders", - "ViewTypeLiveTvRecordingGroups": "Recordings", - "ViewTypeLiveTvChannels": "Channels", + "AppDeviceValues": "App: {0}, Device: {1}", + "UserDownloadingItemWithValues": "{0} is downloading {1}", + "HeaderLiveTV": "Live TV", + "ChapterNameValue": "Chapter {0}", "ScheduledTaskFailedWithName": "{0} failed", "LabelRunningTimeValue": "Running time: {0}", "ScheduledTaskStartedWithName": "{0} started", "VersionNumber": "Version {0}", "PluginInstalledWithName": "{0} was installed", + "StartupEmbyServerIsLoading": "Emby Server is loading. Please try again shortly.", "PluginUpdatedWithName": "{0} was updated", "PluginUninstalledWithName": "{0} was uninstalled", "ItemAddedWithName": "{0} was added to the library", @@ -106,73 +50,47 @@ "UserOnlineFromDevice": "{0} is online from {1}", "ProviderValue": "Provider: {0}", "SubtitlesDownloadedForItem": "Subtitles downloaded for {0}", - "UserConfigurationUpdatedWithName": "User configuration has been updated for {0}", "UserCreatedWithName": "User {0} has been created", "UserPasswordChangedWithName": "Password has been changed for user {0}", "UserDeletedWithName": "User {0} has been deleted", + "UserConfigurationUpdatedWithName": "User configuration has been updated for {0}", "MessageServerConfigurationUpdated": "Server configuration has been updated", "MessageNamedServerConfigurationUpdatedWithValue": "Server configuration section {0} has been updated", "MessageApplicationUpdated": "Emby Server has been updated", "FailedLoginAttemptWithUserName": "Failed login attempt from {0}", "AuthenticationSucceededWithUserName": "{0} successfully authenticated", - "DeviceOfflineWithName": "{0} has disconnected", - "UserLockedOutWithName": "User {0} has been locked out", "UserOfflineFromDevice": "{0} has disconnected from {1}", + "DeviceOfflineWithName": "{0} has disconnected", "UserStartedPlayingItemWithValues": "{0} has started playing {1}", "UserStoppedPlayingItemWithValues": "{0} has stopped playing {1}", + "NotificationOptionPluginError": "Plugin failure", + "NotificationOptionApplicationUpdateAvailable": "Application update available", + "NotificationOptionApplicationUpdateInstalled": "Application update installed", + "NotificationOptionPluginUpdateInstalled": "Plugin update installed", + "NotificationOptionPluginInstalled": "Plugin installed", + "NotificationOptionPluginUninstalled": "Plugin uninstalled", + "NotificationOptionVideoPlayback": "Video playback started", + "NotificationOptionAudioPlayback": "Audio playback started", + "NotificationOptionGamePlayback": "Game playback started", + "NotificationOptionVideoPlaybackStopped": "Video playback stopped", + "NotificationOptionAudioPlaybackStopped": "Audio playback stopped", + "NotificationOptionGamePlaybackStopped": "Game playback stopped", + "NotificationOptionTaskFailed": "Scheduled task failure", + "NotificationOptionInstallationFailed": "Installation failure", + "NotificationOptionNewLibraryContent": "New content added", + "NotificationOptionCameraImageUploaded": "Camera image uploaded", + "NotificationOptionUserLockedOut": "User locked out", + "NotificationOptionServerRestartRequired": "Server restart required", + "UserLockedOutWithName": "User {0} has been locked out", "SubtitleDownloadFailureForItem": "Subtitles failed to download for {0}", - "HeaderUnidentified": "Unidentified", - "HeaderImagePrimary": "Primary", - "HeaderImageBackdrop": "Backdrop", - "HeaderImageLogo": "Logo", - "HeaderUserPrimaryImage": "User Image", - "HeaderOverview": "Overview", - "HeaderShortOverview": "Short Overview", - "HeaderType": "Type", - "HeaderSeverity": "Severity", - "HeaderUser": "User", - "HeaderName": "Name", - "HeaderDate": "Date", - "HeaderPremiereDate": "Premiere Date", - "HeaderDateAdded": "Date Added", - "HeaderReleaseDate": "Release date", - "HeaderRuntime": "Runtime", - "HeaderPlayCount": "Play Count", - "HeaderSeason": "Season", - "HeaderSeasonNumber": "Season number", - "HeaderSeries": "Series:", - "HeaderNetwork": "Network", - "HeaderYear": "Year:", - "HeaderYears": "Years:", - "HeaderParentalRating": "Parental Rating", - "HeaderCommunityRating": "Community rating", - "HeaderTrailers": "Trailers", - "HeaderSpecials": "Specials", - "HeaderGameSystems": "Game Systems", - "HeaderPlayers": "Players:", - "HeaderAlbumArtists": "Album Artists", - "HeaderAlbums": "Albums", - "HeaderDisc": "Disc", - "HeaderTrack": "Track", - "HeaderAudio": "Audio", - "HeaderVideo": "Video", - "HeaderEmbeddedImage": "Embedded image", - "HeaderResolution": "Resolution", - "HeaderSubtitles": "Subtitles", - "HeaderGenres": "Genres", - "HeaderCountries": "Countries", - "HeaderStatus": "Status", - "HeaderTracks": "Tracks", - "HeaderMusicArtist": "Music artist", - "HeaderLocked": "Locked", - "HeaderStudios": "Studios", - "HeaderActor": "Actors", - "HeaderComposer": "Composers", - "HeaderDirector": "Directors", - "HeaderGuestStar": "Guest star", - "HeaderProducer": "Producers", - "HeaderWriter": "Writers", - "HeaderParentalRatings": "Parental Ratings", - "HeaderCommunityRatings": "Community ratings", - "StartupEmbyServerIsLoading": "Emby Server is loading. Please try again shortly." + "Sync": "Sync", + "User": "User", + "System": "System", + "Application": "Application", + "Plugin": "Plugin", + "LabelExit": "Exit", + "LabelVisitCommunity": "Visit Community", + "LabelBrowseLibrary": "Browse Library", + "LabelConfigureServer": "Configure Emby", + "LabelRestartServer": "Restart Server" }
\ No newline at end of file diff --git a/Emby.Server.Implementations/Localization/Core/es-MX.json b/Emby.Server.Implementations/Localization/Core/es-MX.json index 630c7a037..45cc2c69b 100644 --- a/Emby.Server.Implementations/Localization/Core/es-MX.json +++ b/Emby.Server.Implementations/Localization/Core/es-MX.json @@ -1,102 +1,46 @@ { - "DbUpgradeMessage": "Por favor espere mientras la base de datos de su Servidor Emby es actualizada. {0}% completo.", + "Latest": "Recientes", + "ValueSpecialEpisodeName": "Especial - {0}", + "Inherit": "Heredar", + "Books": "Libros", + "Music": "M\u00fasica", + "Games": "Juegos", + "Photos": "Fotos", + "MixedContent": "Contenido mezclado", + "MusicVideos": "Videos musicales", + "HomeVideos": "Videos caseros", + "Playlists": "Listas de reproducci\u00f3n", + "HeaderRecordingGroups": "Grupos de Grabaciones", + "HeaderContinueWatching": "Continuar Viendo", + "HeaderFavoriteArtists": "Artistas Favoritos", + "HeaderFavoriteSongs": "Canciones Favoritas", + "HeaderAlbumArtists": "Artistas del \u00c1lbum", + "HeaderFavoriteAlbums": "\u00c1lbumes Favoritos", + "HeaderFavoriteEpisodes": "Episodios Preferidos", + "HeaderFavoriteShows": "Programas Preferidos", + "HeaderNextUp": "A Continuaci\u00f3n", + "Favorites": "Favoritos", + "Collections": "Colecciones", + "Channels": "Canales", + "Movies": "Pel\u00edculas", + "Albums": "\u00c1lbumes", + "Artists": "Artistas", + "Folders": "Carpetas", + "Songs": "Canciones", + "TvShows": "TV Shows", + "Shows": "Programas", + "Genres": "G\u00e9neros", + "NameSeasonNumber": "Temporada {0}", "AppDeviceValues": "App: {0}, Dispositivo: {1}", "UserDownloadingItemWithValues": "{0} esta descargando {1}", - "FolderTypeMixed": "Contenido mezclado", - "FolderTypeMovies": "Pel\u00edculas", - "FolderTypeMusic": "M\u00fasica", - "FolderTypeAdultVideos": "Videos para adultos", - "FolderTypePhotos": "Fotos", - "FolderTypeMusicVideos": "Videos musicales", - "FolderTypeHomeVideos": "Videos caseros", - "FolderTypeGames": "Juegos", - "FolderTypeBooks": "Libros", - "FolderTypeTvShows": "TV", - "FolderTypeInherit": "Heredar", - "HeaderCastCrew": "Reparto y Personal", - "HeaderPeople": "Personas", - "ValueSpecialEpisodeName": "Especial: {0}", - "LabelChapterName": "Cap\u00edtulo {0}", - "NameSeasonNumber": "Temporada {0}", - "LabelExit": "Salir", - "LabelVisitCommunity": "Visitar la Comunidad", - "LabelGithub": "Github", - "LabelApiDocumentation": "Documentaci\u00f3n del API", - "LabelDeveloperResources": "Recursos para Desarrolladores", - "LabelBrowseLibrary": "Explorar Biblioteca", - "LabelConfigureServer": "Configurar Emby", - "LabelRestartServer": "Reiniciar el Servidor", - "CategorySync": "Sinc.", - "CategoryUser": "Usuario", - "CategorySystem": "Sistema", - "CategoryApplication": "Aplicaci\u00f3n", - "CategoryPlugin": "Complemento", - "NotificationOptionPluginError": "Falla de complemento", - "NotificationOptionApplicationUpdateAvailable": "Actualizaci\u00f3n de aplicaci\u00f3n disponible", - "NotificationOptionApplicationUpdateInstalled": "Actualizaci\u00f3n de aplicaci\u00f3n instalada", - "NotificationOptionPluginUpdateInstalled": "Actualizaci\u00f3n de complemento instalada", - "NotificationOptionPluginInstalled": "Complemento instalado", - "NotificationOptionPluginUninstalled": "Complemento desinstalado", - "NotificationOptionVideoPlayback": "Reproducci\u00f3n de video iniciada", - "NotificationOptionAudioPlayback": "Reproducci\u00f3n de audio iniciada", - "NotificationOptionGamePlayback": "Ejecuci\u00f3n de juego iniciada", - "NotificationOptionVideoPlaybackStopped": "Reproducci\u00f3n de video detenida", - "NotificationOptionAudioPlaybackStopped": "Reproducci\u00f3n de audio detenida", - "NotificationOptionGamePlaybackStopped": "Ejecuci\u00f3n de juego detenida", - "NotificationOptionTaskFailed": "Falla de tarea programada", - "NotificationOptionInstallationFailed": "Falla de instalaci\u00f3n", - "NotificationOptionNewLibraryContent": "Nuevo contenido agregado", - "NotificationOptionNewLibraryContentMultiple": "Nuevo contenido agregado (varios)", - "NotificationOptionCameraImageUploaded": "Imagen de la c\u00e1mara subida", - "NotificationOptionUserLockedOut": "Usuario bloqueado", - "NotificationOptionServerRestartRequired": "Reinicio del servidor requerido", - "ViewTypePlaylists": "Listas de Reproducci\u00f3n", - "ViewTypeMovies": "Pel\u00edculas", - "ViewTypeTvShows": "TV", - "ViewTypeGames": "Juegos", - "ViewTypeMusic": "M\u00fasica", - "ViewTypeMusicGenres": "G\u00e9neros", - "ViewTypeMusicArtists": "Artistas", - "ViewTypeBoxSets": "Colecciones", - "ViewTypeChannels": "Canales", - "ViewTypeLiveTV": "TV en Vivo", - "ViewTypeLiveTvNowPlaying": "Transmiti\u00e9ndose", - "ViewTypeLatestGames": "Juegos Recientes", - "ViewTypeRecentlyPlayedGames": "Reproducido Reci\u00e9ntemente", - "ViewTypeGameFavorites": "Favoritos", - "ViewTypeGameSystems": "Sistemas de Juego", - "ViewTypeGameGenres": "G\u00e9neros", - "ViewTypeTvResume": "Continuar", - "ViewTypeTvNextUp": "A Continuaci\u00f3n", - "ViewTypeTvLatest": "Recientes", - "ViewTypeTvShowSeries": "Series", - "ViewTypeTvGenres": "G\u00e9neros", - "ViewTypeTvFavoriteSeries": "Series Favoritas", - "ViewTypeTvFavoriteEpisodes": "Episodios Favoritos", - "ViewTypeMovieResume": "Continuar", - "ViewTypeMovieLatest": "Recientes", - "ViewTypeMovieMovies": "Pel\u00edculas", - "ViewTypeMovieCollections": "Colecciones", - "ViewTypeMovieFavorites": "Favoritos", - "ViewTypeMovieGenres": "G\u00e9neros", - "ViewTypeMusicLatest": "Recientes", - "ViewTypeMusicPlaylists": "Listas", - "ViewTypeMusicAlbums": "\u00c1lbumes", - "ViewTypeMusicAlbumArtists": "Artistas del \u00c1lbum", - "HeaderOtherDisplaySettings": "Configuraci\u00f3n de Pantalla", - "ViewTypeMusicSongs": "Canciones", - "ViewTypeMusicFavorites": "Favoritos", - "ViewTypeMusicFavoriteAlbums": "\u00c1lbumes Favoritos", - "ViewTypeMusicFavoriteArtists": "Artistas Favoritos", - "ViewTypeMusicFavoriteSongs": "Canciones Favoritas", - "ViewTypeFolders": "Carpetas", - "ViewTypeLiveTvRecordingGroups": "Grabaciones", - "ViewTypeLiveTvChannels": "Canales", + "HeaderLiveTV": "TV en Vivo", + "ChapterNameValue": "Cap\u00edtulo {0}", "ScheduledTaskFailedWithName": "{0} fall\u00f3", "LabelRunningTimeValue": "Duraci\u00f3n: {0}", "ScheduledTaskStartedWithName": "{0} Iniciado", "VersionNumber": "Versi\u00f3n {0}", "PluginInstalledWithName": "{0} fue instalado", + "StartupEmbyServerIsLoading": "El servidor Emby esta cargando. Por favor intente de nuevo dentro de poco.", "PluginUpdatedWithName": "{0} fue actualizado", "PluginUninstalledWithName": "{0} fue desinstalado", "ItemAddedWithName": "{0} fue agregado a la biblioteca", @@ -106,73 +50,47 @@ "UserOnlineFromDevice": "{0} est\u00e1 en l\u00ednea desde {1}", "ProviderValue": "Proveedor: {0}", "SubtitlesDownloadedForItem": "Subt\u00edtulos descargados para {0}", - "UserConfigurationUpdatedWithName": "Se ha actualizado la configuraci\u00f3n del usuario {0}", "UserCreatedWithName": "Se ha creado el usuario {0}", "UserPasswordChangedWithName": "Se ha cambiado la contrase\u00f1a para el usuario {0}", - "UserDeletedWithName": "Se ha eliminado al usuario {0}", + "UserDeletedWithName": "Se ha eliminado el usuario {0}", + "UserConfigurationUpdatedWithName": "Se ha actualizado la configuraci\u00f3n del usuario {0}", "MessageServerConfigurationUpdated": "Se ha actualizado la configuraci\u00f3n del servidor", "MessageNamedServerConfigurationUpdatedWithValue": "Se ha actualizado la secci\u00f3n {0} de la configuraci\u00f3n del servidor", "MessageApplicationUpdated": "El servidor Emby ha sido actualizado", "FailedLoginAttemptWithUserName": "Intento fallido de inicio de sesi\u00f3n de {0}", "AuthenticationSucceededWithUserName": "{0} autenticado con \u00e9xito", - "DeviceOfflineWithName": "{0} se ha desconectado", - "UserLockedOutWithName": "El usuario {0} ha sido bloqueado", "UserOfflineFromDevice": "{0} se ha desconectado desde {1}", + "DeviceOfflineWithName": "{0} se ha desconectado", "UserStartedPlayingItemWithValues": "{0} ha iniciado la reproducci\u00f3n de {1}", "UserStoppedPlayingItemWithValues": "{0} ha detenido la reproducci\u00f3n de {1}", + "NotificationOptionPluginError": "Falla de complemento", + "NotificationOptionApplicationUpdateAvailable": "Actualizaci\u00f3n de aplicaci\u00f3n disponible", + "NotificationOptionApplicationUpdateInstalled": "Actualizaci\u00f3n de aplicaci\u00f3n instalada", + "NotificationOptionPluginUpdateInstalled": "Actualizaci\u00f3n de complemento instalada", + "NotificationOptionPluginInstalled": "Complemento instalado", + "NotificationOptionPluginUninstalled": "Complemento desinstalado", + "NotificationOptionVideoPlayback": "Reproducci\u00f3n de video iniciada", + "NotificationOptionAudioPlayback": "Reproducci\u00f3n de audio iniciada", + "NotificationOptionGamePlayback": "Ejecuci\u00f3n de juego iniciada", + "NotificationOptionVideoPlaybackStopped": "Reproducci\u00f3n de video detenida", + "NotificationOptionAudioPlaybackStopped": "Reproducci\u00f3n de audio detenida", + "NotificationOptionGamePlaybackStopped": "Ejecuci\u00f3n de juego detenida", + "NotificationOptionTaskFailed": "Falla de tarea programada", + "NotificationOptionInstallationFailed": "Falla de instalaci\u00f3n", + "NotificationOptionNewLibraryContent": "Nuevo contenido agregado", + "NotificationOptionCameraImageUploaded": "Imagen de la c\u00e1mara subida", + "NotificationOptionUserLockedOut": "Usuario bloqueado", + "NotificationOptionServerRestartRequired": "Se necesita reiniciar el Servidor", + "UserLockedOutWithName": "El usuario {0} ha sido bloqueado", "SubtitleDownloadFailureForItem": "Fall\u00f3 la descarga de subt\u00edtulos para {0}", - "HeaderUnidentified": "No Identificado", - "HeaderImagePrimary": "Principal", - "HeaderImageBackdrop": "Imagen de Fondo", - "HeaderImageLogo": "Logo", - "HeaderUserPrimaryImage": "Imagen de Usuario", - "HeaderOverview": "Resumen", - "HeaderShortOverview": "Sinopsis corta:", - "HeaderType": "Tipo", - "HeaderSeverity": "Severidad", - "HeaderUser": "Usuario", - "HeaderName": "Nombre", - "HeaderDate": "Fecha", - "HeaderPremiereDate": "Fecha de Estreno", - "HeaderDateAdded": "Fecha de Adici\u00f3n", - "HeaderReleaseDate": "Fecha de estreno", - "HeaderRuntime": "Duraci\u00f3n", - "HeaderPlayCount": "Contador", - "HeaderSeason": "Temporada", - "HeaderSeasonNumber": "N\u00famero de temporada", - "HeaderSeries": "Series:", - "HeaderNetwork": "Cadena", - "HeaderYear": "A\u00f1o:", - "HeaderYears": "A\u00f1os:", - "HeaderParentalRating": "Clasificaci\u00f3n Parental", - "HeaderCommunityRating": "Calificaci\u00f3n de la comunidad", - "HeaderTrailers": "Tr\u00e1ilers", - "HeaderSpecials": "Especiales", - "HeaderGameSystems": "Sistemas de Juego", - "HeaderPlayers": "Reproductores:", - "HeaderAlbumArtists": "Artistas del \u00c1lbum", - "HeaderAlbums": "\u00c1lbumes", - "HeaderDisc": "Disco", - "HeaderTrack": "Pista", - "HeaderAudio": "Audio", - "HeaderVideo": "Video", - "HeaderEmbeddedImage": "Im\u00e1gen embebida", - "HeaderResolution": "Resoluci\u00f3n", - "HeaderSubtitles": "Subt\u00edtulos", - "HeaderGenres": "G\u00e9neros", - "HeaderCountries": "Pa\u00edses", - "HeaderStatus": "Estado", - "HeaderTracks": "Pistas", - "HeaderMusicArtist": "Int\u00e9rprete", - "HeaderLocked": "Bloqueado", - "HeaderStudios": "Estudios", - "HeaderActor": "Actores", - "HeaderComposer": "Compositores", - "HeaderDirector": "Directores", - "HeaderGuestStar": "Estrella invitada", - "HeaderProducer": "Productores", - "HeaderWriter": "Guionistas", - "HeaderParentalRatings": "Clasificaci\u00f3n Parental", - "HeaderCommunityRatings": "Clasificaciones de la comunidad", - "StartupEmbyServerIsLoading": "El servidor Emby esta cargando. Por favor intente de nuevo dentro de poco." + "Sync": "Sinc.", + "User": "Usuario", + "System": "Sistema", + "Application": "Aplicaci\u00f3n", + "Plugin": "Complemento", + "LabelExit": "Salir", + "LabelVisitCommunity": "Visitar la Comunidad", + "LabelBrowseLibrary": "Explorar Biblioteca", + "LabelConfigureServer": "Configurar Emby", + "LabelRestartServer": "Reiniciar el Servidor" }
\ No newline at end of file diff --git a/Emby.Server.Implementations/Localization/Core/es.json b/Emby.Server.Implementations/Localization/Core/es.json index d1a56240d..68975d632 100644 --- a/Emby.Server.Implementations/Localization/Core/es.json +++ b/Emby.Server.Implementations/Localization/Core/es.json @@ -1,178 +1,96 @@ { - "DbUpgradeMessage": "Por favor espere mientras la base de datos de su servidor Emby se actualiza. {0}% completado.", - "AppDeviceValues": "Aplicaci\u00f3n: {0}, Dispositivo: {1}", - "UserDownloadingItemWithValues": "{0} est\u00e1 descargando {1}", - "FolderTypeMixed": "Contenido mezclado", - "FolderTypeMovies": "Peliculas", - "FolderTypeMusic": "Musica", - "FolderTypeAdultVideos": "Videos para adultos", - "FolderTypePhotos": "Fotos", - "FolderTypeMusicVideos": "Videos Musicales", - "FolderTypeHomeVideos": "Videos caseros", - "FolderTypeGames": "Juegos", - "FolderTypeBooks": "Libros", - "FolderTypeTvShows": "TV", - "FolderTypeInherit": "Heredado", - "HeaderCastCrew": "Reparto y equipo t\u00e9cnico", - "HeaderPeople": "Gente", + "Latest": "\u00daltimos", "ValueSpecialEpisodeName": "Especial - {0}", - "LabelChapterName": "Cap\u00edtulo {0}", + "Inherit": "Heredar", + "Books": "Libros", + "Music": "M\u00fasica", + "Games": "Juegos", + "Photos": "Fotos", + "MixedContent": "Contenido mixto", + "MusicVideos": "Videos musicales", + "HomeVideos": "V\u00eddeos de inicio", + "Playlists": "Listas reproducci\u00f3n", + "HeaderRecordingGroups": "Grupos de grabaci\u00f3n", + "HeaderContinueWatching": "Continuar viendo", + "HeaderFavoriteArtists": "Artistas favoritos", + "HeaderFavoriteSongs": "Canciones favoritas", + "HeaderAlbumArtists": "Artistas del \u00c1lbum", + "HeaderFavoriteAlbums": "\u00c1lbumes favoritos", + "HeaderFavoriteEpisodes": "Episodios favoritos", + "HeaderFavoriteShows": "Programas favoritos", + "HeaderNextUp": "Siguiendo", + "Favorites": "Favoritos", + "Collections": "Colecciones", + "Channels": "Canales", + "Movies": "Peliculas", + "Albums": "\u00c1lbumes", + "Artists": "Artistas", + "Folders": "Carpetas", + "Songs": "Canciones", + "TvShows": "TV Shows", + "Shows": "Series", + "Genres": "G\u00e9neros", "NameSeasonNumber": "Temporada {0}", - "LabelExit": "Salir", - "LabelVisitCommunity": "Visitar la comunidad", - "LabelGithub": "Github", - "LabelApiDocumentation": "Documentaci\u00f3n API", - "LabelDeveloperResources": "Recursos del Desarrollador", - "LabelBrowseLibrary": "Navegar biblioteca", - "LabelConfigureServer": "Configurar Emby", - "LabelRestartServer": "Reiniciar el servidor", - "CategorySync": "Sincronizar", - "CategoryUser": "Usuario", - "CategorySystem": "Sistema", - "CategoryApplication": "Aplicaci\u00f3n", - "CategoryPlugin": "Plugin", - "NotificationOptionPluginError": "Error en plugin", - "NotificationOptionApplicationUpdateAvailable": "Disponible actualizaci\u00f3n de la aplicaci\u00f3n", - "NotificationOptionApplicationUpdateInstalled": "Se ha instalado la actualizaci\u00f3n de la aplicaci\u00f3n", - "NotificationOptionPluginUpdateInstalled": "Se ha instalado la actualizaci\u00f3n del plugin", - "NotificationOptionPluginInstalled": "Plugin instalado", - "NotificationOptionPluginUninstalled": "Plugin desinstalado", - "NotificationOptionVideoPlayback": "Reproduccion de video a iniciado", - "NotificationOptionAudioPlayback": "Reproduccion de audio a iniciado", - "NotificationOptionGamePlayback": "Reproduccion de video juego a iniciado", - "NotificationOptionVideoPlaybackStopped": "Reproducci\u00f3n de video detenida", - "NotificationOptionAudioPlaybackStopped": "Reproducci\u00f3n de audio detenida", - "NotificationOptionGamePlaybackStopped": "Reproducci\u00f3n de juego detenida", - "NotificationOptionTaskFailed": "La tarea programada ha fallado", - "NotificationOptionInstallationFailed": "Fallo en la instalaci\u00f3n", - "NotificationOptionNewLibraryContent": "Nuevo contenido a\u00f1adido", - "NotificationOptionNewLibraryContentMultiple": "Nuevo contenido a\u00f1adido (multiple)", - "NotificationOptionCameraImageUploaded": "Imagen de camara se a carcado", - "NotificationOptionUserLockedOut": "Usuario bloqueado", - "NotificationOptionServerRestartRequired": "Se requiere el reinicio del servidor", - "ViewTypePlaylists": "Listas de reproducci\u00f3n", - "ViewTypeMovies": "Pel\u00edculas", - "ViewTypeTvShows": "TV", - "ViewTypeGames": "Juegos", - "ViewTypeMusic": "M\u00fasica", - "ViewTypeMusicGenres": "G\u00e9neros", - "ViewTypeMusicArtists": "Artistas", - "ViewTypeBoxSets": "Colecciones", - "ViewTypeChannels": "Canales", - "ViewTypeLiveTV": "Tv en vivo", - "ViewTypeLiveTvNowPlaying": "Transmiti\u00e9ndose ahora", - "ViewTypeLatestGames": "\u00daltimos juegos", - "ViewTypeRecentlyPlayedGames": "Reproducido recientemente", - "ViewTypeGameFavorites": "Favoritos", - "ViewTypeGameSystems": "Sistemas de juego", - "ViewTypeGameGenres": "G\u00e9neros", - "ViewTypeTvResume": "Reanudar", - "ViewTypeTvNextUp": "Pr\u00f3ximamente", - "ViewTypeTvLatest": "\u00daltimas", - "ViewTypeTvShowSeries": "Series", - "ViewTypeTvGenres": "G\u00e9neros", - "ViewTypeTvFavoriteSeries": "Series favoritas", - "ViewTypeTvFavoriteEpisodes": "Episodios favoritos", - "ViewTypeMovieResume": "Reanudar", - "ViewTypeMovieLatest": "\u00daltimas", - "ViewTypeMovieMovies": "Pel\u00edculas", - "ViewTypeMovieCollections": "Colecciones", - "ViewTypeMovieFavorites": "Favoritos", - "ViewTypeMovieGenres": "G\u00e9neros", - "ViewTypeMusicLatest": "\u00daltimas", - "ViewTypeMusicPlaylists": "Lista", - "ViewTypeMusicAlbums": "\u00c1lbumes", - "ViewTypeMusicAlbumArtists": "\u00c1lbumes de artistas", - "HeaderOtherDisplaySettings": "Configuraci\u00f3n de pantalla", - "ViewTypeMusicSongs": "Canciones", - "ViewTypeMusicFavorites": "Favoritos", - "ViewTypeMusicFavoriteAlbums": "\u00c1lbumes favoritos", - "ViewTypeMusicFavoriteArtists": "Artistas favoritos", - "ViewTypeMusicFavoriteSongs": "Canciones favoritas", - "ViewTypeFolders": "Carpetas", - "ViewTypeLiveTvRecordingGroups": "Grabaciones", - "ViewTypeLiveTvChannels": "Canales", + "AppDeviceValues": "Aplicaci\u00f3n: {0}, Dispositivo: {1}", + "UserDownloadingItemWithValues": "{0} est\u00e1 descargando {1}", + "HeaderLiveTV": "TV en vivo", + "ChapterNameValue": "Cap\u00edtulo {0}", "ScheduledTaskFailedWithName": "{0} fall\u00f3", - "LabelRunningTimeValue": "Tiempo de ejecuci\u00f3n: {0}", - "ScheduledTaskStartedWithName": "{0} iniciado", + "LabelRunningTimeValue": "Tiempo de funcionamiento: {0}", + "ScheduledTaskStartedWithName": "{0} iniciada", "VersionNumber": "Versi\u00f3n {0}", - "PluginInstalledWithName": "{0} ha sido instalado", - "PluginUpdatedWithName": "{0} ha sido actualizado", - "PluginUninstalledWithName": "{0} ha sido desinstalado", - "ItemAddedWithName": "{0} ha sido a\u00f1adido a la biblioteca", - "ItemRemovedWithName": "{0} se ha eliminado de la biblioteca", + "PluginInstalledWithName": "{0} se ha instalado", + "StartupEmbyServerIsLoading": "Emby Server se est\u00e1 cargando. Vuelve a intentarlo en breve.", + "PluginUpdatedWithName": "{0} se actualiz\u00f3", + "PluginUninstalledWithName": "{0} se ha desinstalado", + "ItemAddedWithName": "{0} se ha a\u00f1adido a la biblioteca", + "ItemRemovedWithName": "{0} se elimina de la biblioteca", "LabelIpAddressValue": "Direcci\u00f3n IP: {0}", "DeviceOnlineWithName": "{0} est\u00e1 conectado", - "UserOnlineFromDevice": "{0} est\u00e1 conectado desde {1}", + "UserOnlineFromDevice": "{0} est\u00e1 en l\u00ednea desde {1}", "ProviderValue": "Proveedor: {0}", - "SubtitlesDownloadedForItem": "Subt\u00edtulos descargados para {0}", - "UserConfigurationUpdatedWithName": "Se ha actualizado la configuraci\u00f3n de usuario para {0}", - "UserCreatedWithName": "Se ha creado el usuario {0}", - "UserPasswordChangedWithName": "Contrase\u00f1a cambiada al usuario {0}", - "UserDeletedWithName": "El usuario {0} ha sido eliminado", + "SubtitlesDownloadedForItem": "Descargar subt\u00edtulos para {0}", + "UserCreatedWithName": "El usuario {0} ha sido creado", + "UserPasswordChangedWithName": "Se ha cambiado la contrase\u00f1a para el usuario {0}", + "UserDeletedWithName": "El usuario {0} ha sido borrado", + "UserConfigurationUpdatedWithName": "Configuraci\u00f3n de usuario se ha actualizado para {0}", "MessageServerConfigurationUpdated": "Se ha actualizado la configuraci\u00f3n del servidor", - "MessageNamedServerConfigurationUpdatedWithValue": "Se ha actualizado la secci\u00f3n {0} de la configuraci\u00f3n del servidor", + "MessageNamedServerConfigurationUpdatedWithValue": "La secci\u00f3n de configuraci\u00f3n del servidor {0} ha sido actualizado", "MessageApplicationUpdated": "Se ha actualizado el servidor Emby", - "FailedLoginAttemptWithUserName": "Intento de inicio de sesi\u00f3n fallido desde {0}", - "AuthenticationSucceededWithUserName": "{0} se ha autenticado satisfactoriamente", + "FailedLoginAttemptWithUserName": "Error al intentar iniciar sesi\u00f3n a partir de {0}", + "AuthenticationSucceededWithUserName": "{0} autenticado correctamente", + "UserOfflineFromDevice": "{0} se ha desconectado de {1}", "DeviceOfflineWithName": "{0} se ha desconectado", + "UserStartedPlayingItemWithValues": "{0} ha comenzado jugando {1}", + "UserStoppedPlayingItemWithValues": "{0} ha dejado de reproducir {1}", + "NotificationOptionPluginError": "Error en plugin", + "NotificationOptionApplicationUpdateAvailable": "Actualizaci\u00f3n de la aplicaci\u00f3n disponible", + "NotificationOptionApplicationUpdateInstalled": "Actualizaci\u00f3n de la aplicaci\u00f3n instalada", + "NotificationOptionPluginUpdateInstalled": "Actualizaci\u00f3n del complemento instalada", + "NotificationOptionPluginInstalled": "Plugin instalado", + "NotificationOptionPluginUninstalled": "Plugin desinstalado", + "NotificationOptionVideoPlayback": "Se inici\u00f3 la reproducci\u00f3n de v\u00eddeo", + "NotificationOptionAudioPlayback": "Se inici\u00f3 la reproducci\u00f3n de audio", + "NotificationOptionGamePlayback": "Se inici\u00f3 la reproducci\u00f3n del juego", + "NotificationOptionVideoPlaybackStopped": "Reproducci\u00f3n de v\u00eddeo detenida", + "NotificationOptionAudioPlaybackStopped": "Se detuvo la reproducci\u00f3n de audio", + "NotificationOptionGamePlaybackStopped": "Se detuvo la reproducci\u00f3n del juego", + "NotificationOptionTaskFailed": "Error de tarea programada", + "NotificationOptionInstallationFailed": "Error de instalaci\u00f3n", + "NotificationOptionNewLibraryContent": "Nuevo contenido a\u00f1adido", + "NotificationOptionCameraImageUploaded": "Imagen de la c\u00e1mara cargada", + "NotificationOptionUserLockedOut": "Usuario bloqueado", + "NotificationOptionServerRestartRequired": "Requiere reinicio del servidor", "UserLockedOutWithName": "El usuario {0} ha sido bloqueado", - "UserOfflineFromDevice": "{0} se ha desconectado de {1}", - "UserStartedPlayingItemWithValues": "{0} ha empezado a reproducir {1}", - "UserStoppedPlayingItemWithValues": "{0} ha parado de reproducir {1}", - "SubtitleDownloadFailureForItem": "Fallo en la descarga de subt\u00edtulos para {0}", - "HeaderUnidentified": "Unidentified", - "HeaderImagePrimary": "Primary", - "HeaderImageBackdrop": "Backdrop", - "HeaderImageLogo": "Logo", - "HeaderUserPrimaryImage": "User Image", - "HeaderOverview": "Overview", - "HeaderShortOverview": "Short Overview", - "HeaderType": "Type", - "HeaderSeverity": "Severity", - "HeaderUser": "Usuario", - "HeaderName": "Nombre", - "HeaderDate": "Fecha", - "HeaderPremiereDate": "Premiere Date", - "HeaderDateAdded": "Date Added", - "HeaderReleaseDate": "Release date", - "HeaderRuntime": "Runtime", - "HeaderPlayCount": "Play Count", - "HeaderSeason": "Season", - "HeaderSeasonNumber": "Season number", - "HeaderSeries": "Series:", - "HeaderNetwork": "Network", - "HeaderYear": "Year:", - "HeaderYears": "Years:", - "HeaderParentalRating": "Parental Rating", - "HeaderCommunityRating": "Community rating", - "HeaderTrailers": "Trailers", - "HeaderSpecials": "Specials", - "HeaderGameSystems": "Game Systems", - "HeaderPlayers": "Players:", - "HeaderAlbumArtists": "Album Artists", - "HeaderAlbums": "Albums", - "HeaderDisc": "Disc", - "HeaderTrack": "Track", - "HeaderAudio": "Audio", - "HeaderVideo": "Video", - "HeaderEmbeddedImage": "Embedded image", - "HeaderResolution": "Resolution", - "HeaderSubtitles": "Subt\u00edtulos", - "HeaderGenres": "G\u00e9neros", - "HeaderCountries": "Paises", - "HeaderStatus": "Estado", - "HeaderTracks": "Tracks", - "HeaderMusicArtist": "Music artist", - "HeaderLocked": "Locked", - "HeaderStudios": "Estudios", - "HeaderActor": "Actors", - "HeaderComposer": "Composers", - "HeaderDirector": "Directors", - "HeaderGuestStar": "Guest star", - "HeaderProducer": "Producers", - "HeaderWriter": "Writers", - "HeaderParentalRatings": "Clasificaci\u00f3n parental", - "HeaderCommunityRatings": "Community ratings", - "StartupEmbyServerIsLoading": "Emby Server is loading. Please try again shortly." + "SubtitleDownloadFailureForItem": "Error al descargar subt\u00edtulos para {0}", + "Sync": "Sincronizar", + "User": "Usuario", + "System": "Sistema", + "Application": "Aplicaci\u00f3n", + "Plugin": "Plugin", + "LabelExit": "Salida", + "LabelVisitCommunity": "Visita la Comunidad", + "LabelBrowseLibrary": "Navegar la biblioteca", + "LabelConfigureServer": "Configurar Emby", + "LabelRestartServer": "Configurar Emby" }
\ No newline at end of file diff --git a/Emby.Server.Implementations/Localization/Core/fi.json b/Emby.Server.Implementations/Localization/Core/fi.json deleted file mode 100644 index 20efa1406..000000000 --- a/Emby.Server.Implementations/Localization/Core/fi.json +++ /dev/null @@ -1,178 +0,0 @@ -{ - "DbUpgradeMessage": "Please wait while your Emby Server database is upgraded. {0}% complete.", - "AppDeviceValues": "App: {0}, Device: {1}", - "UserDownloadingItemWithValues": "{0} is downloading {1}", - "FolderTypeMixed": "Mixed content", - "FolderTypeMovies": "Movies", - "FolderTypeMusic": "Music", - "FolderTypeAdultVideos": "Adult videos", - "FolderTypePhotos": "Photos", - "FolderTypeMusicVideos": "Music videos", - "FolderTypeHomeVideos": "Home videos", - "FolderTypeGames": "Games", - "FolderTypeBooks": "Books", - "FolderTypeTvShows": "TV", - "FolderTypeInherit": "Inherit", - "HeaderCastCrew": "Cast & Crew", - "HeaderPeople": "People", - "ValueSpecialEpisodeName": "Special - {0}", - "LabelChapterName": "Chapter {0}", - "NameSeasonNumber": "Season {0}", - "LabelExit": "Poistu", - "LabelVisitCommunity": "K\u00e4y Yhteis\u00f6ss\u00e4", - "LabelGithub": "Github", - "LabelApiDocumentation": "Api Documentation", - "LabelDeveloperResources": "Developer Resources", - "LabelBrowseLibrary": "Selaa Kirjastoa", - "LabelConfigureServer": "Configure Emby", - "LabelRestartServer": "K\u00e4ynnist\u00e4 Palvelin uudelleen", - "CategorySync": "Sync", - "CategoryUser": "User", - "CategorySystem": "System", - "CategoryApplication": "Application", - "CategoryPlugin": "Plugin", - "NotificationOptionPluginError": "Plugin failure", - "NotificationOptionApplicationUpdateAvailable": "Application update available", - "NotificationOptionApplicationUpdateInstalled": "Application update installed", - "NotificationOptionPluginUpdateInstalled": "Plugin update installed", - "NotificationOptionPluginInstalled": "Plugin installed", - "NotificationOptionPluginUninstalled": "Plugin uninstalled", - "NotificationOptionVideoPlayback": "Video playback started", - "NotificationOptionAudioPlayback": "Audio playback started", - "NotificationOptionGamePlayback": "Game playback started", - "NotificationOptionVideoPlaybackStopped": "Video playback stopped", - "NotificationOptionAudioPlaybackStopped": "Audio playback stopped", - "NotificationOptionGamePlaybackStopped": "Game playback stopped", - "NotificationOptionTaskFailed": "Scheduled task failure", - "NotificationOptionInstallationFailed": "Installation failure", - "NotificationOptionNewLibraryContent": "New content added", - "NotificationOptionNewLibraryContentMultiple": "New content added (multiple)", - "NotificationOptionCameraImageUploaded": "Camera image uploaded", - "NotificationOptionUserLockedOut": "User locked out", - "NotificationOptionServerRestartRequired": "Server restart required", - "ViewTypePlaylists": "Playlists", - "ViewTypeMovies": "Movies", - "ViewTypeTvShows": "TV", - "ViewTypeGames": "Games", - "ViewTypeMusic": "Music", - "ViewTypeMusicGenres": "Genres", - "ViewTypeMusicArtists": "Artists", - "ViewTypeBoxSets": "Collections", - "ViewTypeChannels": "Channels", - "ViewTypeLiveTV": "Live TV", - "ViewTypeLiveTvNowPlaying": "Now Airing", - "ViewTypeLatestGames": "Latest Games", - "ViewTypeRecentlyPlayedGames": "Recently Played", - "ViewTypeGameFavorites": "Favorites", - "ViewTypeGameSystems": "Game Systems", - "ViewTypeGameGenres": "Genres", - "ViewTypeTvResume": "Resume", - "ViewTypeTvNextUp": "Next Up", - "ViewTypeTvLatest": "Latest", - "ViewTypeTvShowSeries": "Series", - "ViewTypeTvGenres": "Genres", - "ViewTypeTvFavoriteSeries": "Favorite Series", - "ViewTypeTvFavoriteEpisodes": "Favorite Episodes", - "ViewTypeMovieResume": "Resume", - "ViewTypeMovieLatest": "Latest", - "ViewTypeMovieMovies": "Movies", - "ViewTypeMovieCollections": "Collections", - "ViewTypeMovieFavorites": "Favorites", - "ViewTypeMovieGenres": "Genres", - "ViewTypeMusicLatest": "Latest", - "ViewTypeMusicPlaylists": "Playlists", - "ViewTypeMusicAlbums": "Albums", - "ViewTypeMusicAlbumArtists": "Album Artists", - "HeaderOtherDisplaySettings": "Display Settings", - "ViewTypeMusicSongs": "Songs", - "ViewTypeMusicFavorites": "Favorites", - "ViewTypeMusicFavoriteAlbums": "Favorite Albums", - "ViewTypeMusicFavoriteArtists": "Favorite Artists", - "ViewTypeMusicFavoriteSongs": "Favorite Songs", - "ViewTypeFolders": "Folders", - "ViewTypeLiveTvRecordingGroups": "Recordings", - "ViewTypeLiveTvChannels": "Channels", - "ScheduledTaskFailedWithName": "{0} failed", - "LabelRunningTimeValue": "Running time: {0}", - "ScheduledTaskStartedWithName": "{0} started", - "VersionNumber": "Version {0}", - "PluginInstalledWithName": "{0} was installed", - "PluginUpdatedWithName": "{0} was updated", - "PluginUninstalledWithName": "{0} was uninstalled", - "ItemAddedWithName": "{0} was added to the library", - "ItemRemovedWithName": "{0} was removed from the library", - "LabelIpAddressValue": "Ip address: {0}", - "DeviceOnlineWithName": "{0} is connected", - "UserOnlineFromDevice": "{0} is online from {1}", - "ProviderValue": "Provider: {0}", - "SubtitlesDownloadedForItem": "Subtitles downloaded for {0}", - "UserConfigurationUpdatedWithName": "User configuration has been updated for {0}", - "UserCreatedWithName": "User {0} has been created", - "UserPasswordChangedWithName": "Password has been changed for user {0}", - "UserDeletedWithName": "User {0} has been deleted", - "MessageServerConfigurationUpdated": "Server configuration has been updated", - "MessageNamedServerConfigurationUpdatedWithValue": "Server configuration section {0} has been updated", - "MessageApplicationUpdated": "Emby Server has been updated", - "FailedLoginAttemptWithUserName": "Failed login attempt from {0}", - "AuthenticationSucceededWithUserName": "{0} successfully authenticated", - "DeviceOfflineWithName": "{0} has disconnected", - "UserLockedOutWithName": "User {0} has been locked out", - "UserOfflineFromDevice": "{0} has disconnected from {1}", - "UserStartedPlayingItemWithValues": "{0} has started playing {1}", - "UserStoppedPlayingItemWithValues": "{0} has stopped playing {1}", - "SubtitleDownloadFailureForItem": "Subtitles failed to download for {0}", - "HeaderUnidentified": "Unidentified", - "HeaderImagePrimary": "Primary", - "HeaderImageBackdrop": "Backdrop", - "HeaderImageLogo": "Logo", - "HeaderUserPrimaryImage": "User Image", - "HeaderOverview": "Overview", - "HeaderShortOverview": "Short Overview", - "HeaderType": "Type", - "HeaderSeverity": "Severity", - "HeaderUser": "User", - "HeaderName": "Name", - "HeaderDate": "Date", - "HeaderPremiereDate": "Premiere Date", - "HeaderDateAdded": "Date Added", - "HeaderReleaseDate": "Release date", - "HeaderRuntime": "Runtime", - "HeaderPlayCount": "Play Count", - "HeaderSeason": "Season", - "HeaderSeasonNumber": "Season number", - "HeaderSeries": "Series:", - "HeaderNetwork": "Network", - "HeaderYear": "Year:", - "HeaderYears": "Years:", - "HeaderParentalRating": "Parental Rating", - "HeaderCommunityRating": "Community rating", - "HeaderTrailers": "Trailers", - "HeaderSpecials": "Specials", - "HeaderGameSystems": "Game Systems", - "HeaderPlayers": "Players:", - "HeaderAlbumArtists": "Album Artists", - "HeaderAlbums": "Albums", - "HeaderDisc": "Disc", - "HeaderTrack": "Track", - "HeaderAudio": "Audio", - "HeaderVideo": "Video", - "HeaderEmbeddedImage": "Embedded image", - "HeaderResolution": "Resolution", - "HeaderSubtitles": "Subtitles", - "HeaderGenres": "Genres", - "HeaderCountries": "Countries", - "HeaderStatus": "Status", - "HeaderTracks": "Tracks", - "HeaderMusicArtist": "Music artist", - "HeaderLocked": "Locked", - "HeaderStudios": "Studios", - "HeaderActor": "Actors", - "HeaderComposer": "Composers", - "HeaderDirector": "Directors", - "HeaderGuestStar": "Guest star", - "HeaderProducer": "Producers", - "HeaderWriter": "Writers", - "HeaderParentalRatings": "Parental Ratings", - "HeaderCommunityRatings": "Community ratings", - "StartupEmbyServerIsLoading": "Emby Server is loading. Please try again shortly." -}
\ No newline at end of file diff --git a/Emby.Server.Implementations/Localization/Core/fr-CA.json b/Emby.Server.Implementations/Localization/Core/fr-CA.json index 789817c84..795bc98cc 100644 --- a/Emby.Server.Implementations/Localization/Core/fr-CA.json +++ b/Emby.Server.Implementations/Localization/Core/fr-CA.json @@ -1,102 +1,46 @@ { - "DbUpgradeMessage": "Veuillez patienter pendant que la base de donn\u00e9e de votre Serveur Emby se met \u00e0 jour. Termin\u00e9e \u00e0 {0}%.", + "Latest": "Latest", + "ValueSpecialEpisodeName": "Sp\u00e9cial - {0}", + "Inherit": "Inherit", + "Books": "Books", + "Music": "Music", + "Games": "Games", + "Photos": "Photos", + "MixedContent": "Mixed content", + "MusicVideos": "Music videos", + "HomeVideos": "Home videos", + "Playlists": "Playlists", + "HeaderRecordingGroups": "Recording Groups", + "HeaderContinueWatching": "Continuer \u00e0 regarder", + "HeaderFavoriteArtists": "Favorite Artists", + "HeaderFavoriteSongs": "Favorite Songs", + "HeaderAlbumArtists": "Album Artists", + "HeaderFavoriteAlbums": "Favorite Albums", + "HeaderFavoriteEpisodes": "Favorite Episodes", + "HeaderFavoriteShows": "Favorite Shows", + "HeaderNextUp": "\u00c0 Suivre", + "Favorites": "Favorites", + "Collections": "Collections", + "Channels": "Channels", + "Movies": "Movies", + "Albums": "Albums", + "Artists": "Artists", + "Folders": "Folders", + "Songs": "Songs", + "TvShows": "TV Shows", + "Shows": "Series", + "Genres": "Genres", + "NameSeasonNumber": "Season {0}", "AppDeviceValues": "App: {0}, Device: {1}", "UserDownloadingItemWithValues": "{0} is downloading {1}", - "FolderTypeMixed": "Mixed content", - "FolderTypeMovies": "Movies", - "FolderTypeMusic": "Music", - "FolderTypeAdultVideos": "Adult videos", - "FolderTypePhotos": "Photos", - "FolderTypeMusicVideos": "Music videos", - "FolderTypeHomeVideos": "Home videos", - "FolderTypeGames": "Games", - "FolderTypeBooks": "Books", - "FolderTypeTvShows": "TV", - "FolderTypeInherit": "Inherit", - "HeaderCastCrew": "Cast & Crew", - "HeaderPeople": "People", - "ValueSpecialEpisodeName": "Special - {0}", - "LabelChapterName": "Chapter {0}", - "NameSeasonNumber": "Season {0}", - "LabelExit": "Quitter", - "LabelVisitCommunity": "Visiter la Communaut\u00e9", - "LabelGithub": "Github", - "LabelApiDocumentation": "Documentation de l'API", - "LabelDeveloperResources": "Ressources pour d\u00e9veloppeurs", - "LabelBrowseLibrary": "Parcourir la biblioth\u00e8que", - "LabelConfigureServer": "Configurer Emby", - "LabelRestartServer": "Red\u00e9marrer le Serveur", - "CategorySync": "Sync", - "CategoryUser": "User", - "CategorySystem": "System", - "CategoryApplication": "Application", - "CategoryPlugin": "Plugin", - "NotificationOptionPluginError": "Plugin failure", - "NotificationOptionApplicationUpdateAvailable": "Application update available", - "NotificationOptionApplicationUpdateInstalled": "Application update installed", - "NotificationOptionPluginUpdateInstalled": "Plugin update installed", - "NotificationOptionPluginInstalled": "Plugin installed", - "NotificationOptionPluginUninstalled": "Plugin uninstalled", - "NotificationOptionVideoPlayback": "Video playback started", - "NotificationOptionAudioPlayback": "Audio playback started", - "NotificationOptionGamePlayback": "Game playback started", - "NotificationOptionVideoPlaybackStopped": "Video playback stopped", - "NotificationOptionAudioPlaybackStopped": "Audio playback stopped", - "NotificationOptionGamePlaybackStopped": "Game playback stopped", - "NotificationOptionTaskFailed": "Scheduled task failure", - "NotificationOptionInstallationFailed": "Installation failure", - "NotificationOptionNewLibraryContent": "New content added", - "NotificationOptionNewLibraryContentMultiple": "New content added (multiple)", - "NotificationOptionCameraImageUploaded": "Camera image uploaded", - "NotificationOptionUserLockedOut": "User locked out", - "NotificationOptionServerRestartRequired": "Server restart required", - "ViewTypePlaylists": "Playlists", - "ViewTypeMovies": "Movies", - "ViewTypeTvShows": "TV", - "ViewTypeGames": "Games", - "ViewTypeMusic": "Music", - "ViewTypeMusicGenres": "Genres", - "ViewTypeMusicArtists": "Artists", - "ViewTypeBoxSets": "Collections", - "ViewTypeChannels": "Channels", - "ViewTypeLiveTV": "Live TV", - "ViewTypeLiveTvNowPlaying": "Now Airing", - "ViewTypeLatestGames": "Latest Games", - "ViewTypeRecentlyPlayedGames": "Recently Played", - "ViewTypeGameFavorites": "Favorites", - "ViewTypeGameSystems": "Game Systems", - "ViewTypeGameGenres": "Genres", - "ViewTypeTvResume": "Resume", - "ViewTypeTvNextUp": "Next Up", - "ViewTypeTvLatest": "Latest", - "ViewTypeTvShowSeries": "Series", - "ViewTypeTvGenres": "Genres", - "ViewTypeTvFavoriteSeries": "Favorite Series", - "ViewTypeTvFavoriteEpisodes": "Favorite Episodes", - "ViewTypeMovieResume": "Resume", - "ViewTypeMovieLatest": "Latest", - "ViewTypeMovieMovies": "Movies", - "ViewTypeMovieCollections": "Collections", - "ViewTypeMovieFavorites": "Favorites", - "ViewTypeMovieGenres": "Genres", - "ViewTypeMusicLatest": "Latest", - "ViewTypeMusicPlaylists": "Playlists", - "ViewTypeMusicAlbums": "Albums", - "ViewTypeMusicAlbumArtists": "Album Artists", - "HeaderOtherDisplaySettings": "Display Settings", - "ViewTypeMusicSongs": "Songs", - "ViewTypeMusicFavorites": "Favorites", - "ViewTypeMusicFavoriteAlbums": "Favorite Albums", - "ViewTypeMusicFavoriteArtists": "Favorite Artists", - "ViewTypeMusicFavoriteSongs": "Favorite Songs", - "ViewTypeFolders": "Folders", - "ViewTypeLiveTvRecordingGroups": "Recordings", - "ViewTypeLiveTvChannels": "Channels", + "HeaderLiveTV": "Live TV", + "ChapterNameValue": "Chapter {0}", "ScheduledTaskFailedWithName": "{0} failed", "LabelRunningTimeValue": "Running time: {0}", "ScheduledTaskStartedWithName": "{0} started", "VersionNumber": "Version {0}", "PluginInstalledWithName": "{0} was installed", + "StartupEmbyServerIsLoading": "Emby Server is loading. Please try again shortly.", "PluginUpdatedWithName": "{0} was updated", "PluginUninstalledWithName": "{0} was uninstalled", "ItemAddedWithName": "{0} was added to the library", @@ -106,73 +50,47 @@ "UserOnlineFromDevice": "{0} is online from {1}", "ProviderValue": "Provider: {0}", "SubtitlesDownloadedForItem": "Subtitles downloaded for {0}", - "UserConfigurationUpdatedWithName": "User configuration has been updated for {0}", "UserCreatedWithName": "User {0} has been created", "UserPasswordChangedWithName": "Password has been changed for user {0}", "UserDeletedWithName": "User {0} has been deleted", + "UserConfigurationUpdatedWithName": "User configuration has been updated for {0}", "MessageServerConfigurationUpdated": "Server configuration has been updated", "MessageNamedServerConfigurationUpdatedWithValue": "Server configuration section {0} has been updated", "MessageApplicationUpdated": "Emby Server has been updated", "FailedLoginAttemptWithUserName": "Failed login attempt from {0}", "AuthenticationSucceededWithUserName": "{0} successfully authenticated", - "DeviceOfflineWithName": "{0} has disconnected", - "UserLockedOutWithName": "User {0} has been locked out", "UserOfflineFromDevice": "{0} has disconnected from {1}", + "DeviceOfflineWithName": "{0} has disconnected", "UserStartedPlayingItemWithValues": "{0} has started playing {1}", "UserStoppedPlayingItemWithValues": "{0} has stopped playing {1}", + "NotificationOptionPluginError": "Plugin failure", + "NotificationOptionApplicationUpdateAvailable": "Application update available", + "NotificationOptionApplicationUpdateInstalled": "Application update installed", + "NotificationOptionPluginUpdateInstalled": "Plugin update installed", + "NotificationOptionPluginInstalled": "Plugin installed", + "NotificationOptionPluginUninstalled": "Plugin uninstalled", + "NotificationOptionVideoPlayback": "Video playback started", + "NotificationOptionAudioPlayback": "Audio playback started", + "NotificationOptionGamePlayback": "Game playback started", + "NotificationOptionVideoPlaybackStopped": "Video playback stopped", + "NotificationOptionAudioPlaybackStopped": "Audio playback stopped", + "NotificationOptionGamePlaybackStopped": "Game playback stopped", + "NotificationOptionTaskFailed": "Scheduled task failure", + "NotificationOptionInstallationFailed": "Installation failure", + "NotificationOptionNewLibraryContent": "New content added", + "NotificationOptionCameraImageUploaded": "Camera image uploaded", + "NotificationOptionUserLockedOut": "User locked out", + "NotificationOptionServerRestartRequired": "Server restart required", + "UserLockedOutWithName": "User {0} has been locked out", "SubtitleDownloadFailureForItem": "Subtitles failed to download for {0}", - "HeaderUnidentified": "Unidentified", - "HeaderImagePrimary": "Primary", - "HeaderImageBackdrop": "Backdrop", - "HeaderImageLogo": "Logo", - "HeaderUserPrimaryImage": "User Image", - "HeaderOverview": "Overview", - "HeaderShortOverview": "Short Overview", - "HeaderType": "Type", - "HeaderSeverity": "Severity", - "HeaderUser": "User", - "HeaderName": "Name", - "HeaderDate": "Date", - "HeaderPremiereDate": "Premiere Date", - "HeaderDateAdded": "Date Added", - "HeaderReleaseDate": "Release date", - "HeaderRuntime": "Runtime", - "HeaderPlayCount": "Play Count", - "HeaderSeason": "Season", - "HeaderSeasonNumber": "Season number", - "HeaderSeries": "Series:", - "HeaderNetwork": "Network", - "HeaderYear": "Year:", - "HeaderYears": "Years:", - "HeaderParentalRating": "Parental Rating", - "HeaderCommunityRating": "Community rating", - "HeaderTrailers": "Trailers", - "HeaderSpecials": "Specials", - "HeaderGameSystems": "Game Systems", - "HeaderPlayers": "Players:", - "HeaderAlbumArtists": "Album Artists", - "HeaderAlbums": "Albums", - "HeaderDisc": "Disc", - "HeaderTrack": "Track", - "HeaderAudio": "Audio", - "HeaderVideo": "Video", - "HeaderEmbeddedImage": "Embedded image", - "HeaderResolution": "Resolution", - "HeaderSubtitles": "Subtitles", - "HeaderGenres": "Genres", - "HeaderCountries": "Countries", - "HeaderStatus": "Status", - "HeaderTracks": "Tracks", - "HeaderMusicArtist": "Music artist", - "HeaderLocked": "Locked", - "HeaderStudios": "Studios", - "HeaderActor": "Actors", - "HeaderComposer": "Composers", - "HeaderDirector": "Directors", - "HeaderGuestStar": "Guest star", - "HeaderProducer": "Producers", - "HeaderWriter": "Writers", - "HeaderParentalRatings": "Parental Ratings", - "HeaderCommunityRatings": "Community ratings", - "StartupEmbyServerIsLoading": "Emby Server is loading. Please try again shortly." + "Sync": "Sync", + "User": "User", + "System": "System", + "Application": "Application", + "Plugin": "Plugin", + "LabelExit": "Exit", + "LabelVisitCommunity": "Visit Community", + "LabelBrowseLibrary": "Browse Library", + "LabelConfigureServer": "Configure Emby", + "LabelRestartServer": "Restart Server" }
\ No newline at end of file diff --git a/Emby.Server.Implementations/Localization/Core/fr.json b/Emby.Server.Implementations/Localization/Core/fr.json index 25c722989..5ea01fcdb 100644 --- a/Emby.Server.Implementations/Localization/Core/fr.json +++ b/Emby.Server.Implementations/Localization/Core/fr.json @@ -1,178 +1,96 @@ { - "DbUpgradeMessage": "Veuillez patienter pendant que la base de donn\u00e9e de votre Emby Serveur se met \u00e0 jour. Termin\u00e9e \u00e0 {0}%.", - "AppDeviceValues": "Application : {0}, Appareil: {1}", - "UserDownloadingItemWithValues": "{0} est en train de t\u00e9l\u00e9charger {1}", - "FolderTypeMixed": "Contenus m\u00e9lang\u00e9s", - "FolderTypeMovies": "Films", - "FolderTypeMusic": "Musique", - "FolderTypeAdultVideos": "Vid\u00e9os Adultes", - "FolderTypePhotos": "Photos", - "FolderTypeMusicVideos": "Vid\u00e9os Musical", - "FolderTypeHomeVideos": "Vid\u00e9os personnelles", - "FolderTypeGames": "Jeux", - "FolderTypeBooks": "Livres", - "FolderTypeTvShows": "TV", - "FolderTypeInherit": "H\u00e9rite", - "HeaderCastCrew": "\u00c9quipe de tournage", - "HeaderPeople": "Personnes", + "Latest": "R\u00e9cent", "ValueSpecialEpisodeName": "Sp\u00e9cial - {0}", - "LabelChapterName": "Chapitre {0}", + "Inherit": "H\u00e9riter", + "Books": "Livres", + "Music": "Musique", + "Games": "Jeux", + "Photos": "Photos", + "MixedContent": "Contenu mixte", + "MusicVideos": "Vid\u00e9os musicales", + "HomeVideos": "Vid\u00e9os personnelles", + "Playlists": "Listes de lecture", + "HeaderRecordingGroups": "Groupes d'enregistrements", + "HeaderContinueWatching": "Continuer \u00e0 regarder", + "HeaderFavoriteArtists": "Artistes favoris", + "HeaderFavoriteSongs": "Chansons favorites", + "HeaderAlbumArtists": "Artistes de l'album", + "HeaderFavoriteAlbums": "Albums favoris", + "HeaderFavoriteEpisodes": "\u00c9pisodes favoris", + "HeaderFavoriteShows": "S\u00e9ries favorites", + "HeaderNextUp": "En Cours", + "Favorites": "Favoris", + "Collections": "Collections", + "Channels": "Cha\u00eenes", + "Movies": "Films", + "Albums": "Albums", + "Artists": "Artistes", + "Folders": "Dossiers", + "Songs": "Chansons", + "TvShows": "TV Shows", + "Shows": "\u00c9missions", + "Genres": "Genres", "NameSeasonNumber": "Saison {0}", - "LabelExit": "Quitter", - "LabelVisitCommunity": "Visiter la Communaut\u00e9", - "LabelGithub": "Github", - "LabelApiDocumentation": "Documentation de l'API", - "LabelDeveloperResources": "Ressources pour d\u00e9veloppeurs", - "LabelBrowseLibrary": "Parcourir la biblioth\u00e8que", - "LabelConfigureServer": "Configurer Emby", - "LabelRestartServer": "Red\u00e9marrer le Serveur", - "CategorySync": "Sync", - "CategoryUser": "Utilisateur", - "CategorySystem": "Syst\u00e8me", - "CategoryApplication": "Application", - "CategoryPlugin": "Plugin", - "NotificationOptionPluginError": "Erreur de plugin", - "NotificationOptionApplicationUpdateAvailable": "Mise \u00e0 jour d'application disponible", - "NotificationOptionApplicationUpdateInstalled": "Mise \u00e0 jour d'application install\u00e9e", - "NotificationOptionPluginUpdateInstalled": "Mise \u00e0 jour de plugin install\u00e9e", - "NotificationOptionPluginInstalled": "Plugin install\u00e9", - "NotificationOptionPluginUninstalled": "Plugin d\u00e9sinstall\u00e9", - "NotificationOptionVideoPlayback": "Lecture vid\u00e9o d\u00e9marr\u00e9e", - "NotificationOptionAudioPlayback": "Lecture audio d\u00e9marr\u00e9e", - "NotificationOptionGamePlayback": "Lecture de jeu d\u00e9marr\u00e9e", - "NotificationOptionVideoPlaybackStopped": "Lecture vid\u00e9o arr\u00eat\u00e9e", - "NotificationOptionAudioPlaybackStopped": "Lecture audio arr\u00eat\u00e9e", - "NotificationOptionGamePlaybackStopped": "Lecture de jeu arr\u00eat\u00e9e", - "NotificationOptionTaskFailed": "\u00c9chec de t\u00e2che planifi\u00e9e", - "NotificationOptionInstallationFailed": "\u00c9chec d'installation", - "NotificationOptionNewLibraryContent": "Nouveau contenu ajout\u00e9", - "NotificationOptionNewLibraryContentMultiple": "Nouveau contenu ajout\u00e9 (multiple)", - "NotificationOptionCameraImageUploaded": "L'image de l'appareil photo a \u00e9t\u00e9 upload\u00e9e", - "NotificationOptionUserLockedOut": "Utilisateur verrouill\u00e9", - "NotificationOptionServerRestartRequired": "Un red\u00e9marrage du serveur est requis", - "ViewTypePlaylists": "Listes de lecture", - "ViewTypeMovies": "Films", - "ViewTypeTvShows": "TV", - "ViewTypeGames": "Jeux", - "ViewTypeMusic": "Musique", - "ViewTypeMusicGenres": "Genres", - "ViewTypeMusicArtists": "Artistes", - "ViewTypeBoxSets": "Collections", - "ViewTypeChannels": "Cha\u00eenes", - "ViewTypeLiveTV": "TV en direct", - "ViewTypeLiveTvNowPlaying": "En cours de diffusion", - "ViewTypeLatestGames": "Derniers jeux", - "ViewTypeRecentlyPlayedGames": "R\u00e9cemment jou\u00e9", - "ViewTypeGameFavorites": "Favoris", - "ViewTypeGameSystems": "Syst\u00e8me de jeu", - "ViewTypeGameGenres": "Genres", - "ViewTypeTvResume": "Reprise", - "ViewTypeTvNextUp": "A venir", - "ViewTypeTvLatest": "Derniers", - "ViewTypeTvShowSeries": "S\u00e9ries", - "ViewTypeTvGenres": "Genres", - "ViewTypeTvFavoriteSeries": "S\u00e9ries favorites", - "ViewTypeTvFavoriteEpisodes": "Episodes favoris", - "ViewTypeMovieResume": "Reprise", - "ViewTypeMovieLatest": "Dernier", - "ViewTypeMovieMovies": "Films", - "ViewTypeMovieCollections": "Collections", - "ViewTypeMovieFavorites": "Favoris", - "ViewTypeMovieGenres": "Genres", - "ViewTypeMusicLatest": "Dernier", - "ViewTypeMusicPlaylists": "Listes de lectures", - "ViewTypeMusicAlbums": "Albums", - "ViewTypeMusicAlbumArtists": "Artiste de l'album", - "HeaderOtherDisplaySettings": "Param\u00e8tres d'affichage", - "ViewTypeMusicSongs": "Chansons", - "ViewTypeMusicFavorites": "Favoris", - "ViewTypeMusicFavoriteAlbums": "Albums favoris", - "ViewTypeMusicFavoriteArtists": "Artistes favoris", - "ViewTypeMusicFavoriteSongs": "Chansons favorites", - "ViewTypeFolders": "R\u00e9pertoires", - "ViewTypeLiveTvRecordingGroups": "Enregistrements", - "ViewTypeLiveTvChannels": "Cha\u00eenes", + "AppDeviceValues": "Application\u00a0: {0}, Appareil\u00a0: {1}", + "UserDownloadingItemWithValues": "{0} est en train de t\u00e9l\u00e9charger {1}", + "HeaderLiveTV": "TV en direct", + "ChapterNameValue": "Chapitre {0}", "ScheduledTaskFailedWithName": "{0} a \u00e9chou\u00e9", - "LabelRunningTimeValue": "Dur\u00e9e: {0}", + "LabelRunningTimeValue": "Dur\u00e9e\u00a0: {0}", "ScheduledTaskStartedWithName": "{0} a commenc\u00e9", "VersionNumber": "Version {0}", "PluginInstalledWithName": "{0} a \u00e9t\u00e9 install\u00e9", + "StartupEmbyServerIsLoading": "Le serveur Emby est en cours de chargement. Veuillez r\u00e9essayer dans quelques instants.", "PluginUpdatedWithName": "{0} a \u00e9t\u00e9 mis \u00e0 jour", "PluginUninstalledWithName": "{0} a \u00e9t\u00e9 d\u00e9sinstall\u00e9", - "ItemAddedWithName": "{0} a \u00e9t\u00e9 ajout\u00e9 \u00e0 la biblioth\u00e8que", - "ItemRemovedWithName": "{0} a \u00e9t\u00e9 supprim\u00e9 de la biblioth\u00e8que", - "LabelIpAddressValue": "Adresse IP: {0}", + "ItemAddedWithName": "{0} a \u00e9t\u00e9 ajout\u00e9 \u00e0 la m\u00e9diath\u00e8que", + "ItemRemovedWithName": "{0} a \u00e9t\u00e9 supprim\u00e9 de la m\u00e9diath\u00e8que", + "LabelIpAddressValue": "Adresse IP\u00a0: {0}", "DeviceOnlineWithName": "{0} est connect\u00e9", "UserOnlineFromDevice": "{0} s'est connect\u00e9 depuis {1}", - "ProviderValue": "Fournisseur : {0}", + "ProviderValue": "Fournisseur\u00a0: {0}", "SubtitlesDownloadedForItem": "Les sous-titres de {0} ont \u00e9t\u00e9 t\u00e9l\u00e9charg\u00e9s", + "UserCreatedWithName": "L'utilisateur {0} a \u00e9t\u00e9 cr\u00e9\u00e9", + "UserPasswordChangedWithName": "Le mot de passe pour l'utilisateur {0} a \u00e9t\u00e9 modifi\u00e9", + "UserDeletedWithName": "L'utilisateur {0} a \u00e9t\u00e9 supprim\u00e9", "UserConfigurationUpdatedWithName": "La configuration utilisateur de {0} a \u00e9t\u00e9 mise \u00e0 jour", - "UserCreatedWithName": "L'utilisateur {0} a \u00e9t\u00e9 cr\u00e9\u00e9.", - "UserPasswordChangedWithName": "Le mot de passe pour l'utilisateur {0} a \u00e9t\u00e9 modifi\u00e9.", - "UserDeletedWithName": "L'utilisateur {0} a \u00e9t\u00e9 supprim\u00e9.", "MessageServerConfigurationUpdated": "La configuration du serveur a \u00e9t\u00e9 mise \u00e0 jour.", - "MessageNamedServerConfigurationUpdatedWithValue": "La configuration de la section {0} du serveur a \u00e9t\u00e9 mise \u00e0 jour.", + "MessageNamedServerConfigurationUpdatedWithValue": "La configuration de la section {0} du serveur a \u00e9t\u00e9 mise \u00e0 jour", "MessageApplicationUpdated": "Le serveur Emby a \u00e9t\u00e9 mis \u00e0 jour", - "FailedLoginAttemptWithUserName": "Echec d'une tentative de connexion de {0}", + "FailedLoginAttemptWithUserName": "\u00c9chec d'une tentative de connexion de {0}", "AuthenticationSucceededWithUserName": "{0} s'est authentifi\u00e9 avec succ\u00e8s", - "DeviceOfflineWithName": "{0} s'est d\u00e9connect\u00e9", - "UserLockedOutWithName": "L'utilisateur {0} a \u00e9t\u00e9 verrouill\u00e9", "UserOfflineFromDevice": "{0} s'est d\u00e9connect\u00e9 depuis {1}", + "DeviceOfflineWithName": "{0} s'est d\u00e9connect\u00e9", "UserStartedPlayingItemWithValues": "{0} vient de commencer la lecture de {1}", "UserStoppedPlayingItemWithValues": "{0} vient d'arr\u00eater la lecture de {1}", + "NotificationOptionPluginError": "Erreur d'extension", + "NotificationOptionApplicationUpdateAvailable": "Mise \u00e0 jour de l'application disponible", + "NotificationOptionApplicationUpdateInstalled": "Mise \u00e0 jour de l'application install\u00e9e", + "NotificationOptionPluginUpdateInstalled": "Mise \u00e0 jour d'extension install\u00e9e", + "NotificationOptionPluginInstalled": "Extension install\u00e9e", + "NotificationOptionPluginUninstalled": "Extension d\u00e9sinstall\u00e9e", + "NotificationOptionVideoPlayback": "Lecture vid\u00e9o d\u00e9marr\u00e9e", + "NotificationOptionAudioPlayback": "Lecture audio d\u00e9marr\u00e9e", + "NotificationOptionGamePlayback": "Lecture de jeu d\u00e9marr\u00e9e", + "NotificationOptionVideoPlaybackStopped": "Lecture vid\u00e9o arr\u00eat\u00e9e", + "NotificationOptionAudioPlaybackStopped": "Lecture audio arr\u00eat\u00e9e", + "NotificationOptionGamePlaybackStopped": "Lecture de jeu arr\u00eat\u00e9e", + "NotificationOptionTaskFailed": "\u00c9chec de t\u00e2che planifi\u00e9e", + "NotificationOptionInstallationFailed": "\u00c9chec d'installation", + "NotificationOptionNewLibraryContent": "Nouveau contenu ajout\u00e9", + "NotificationOptionCameraImageUploaded": "L'image de l'appareil photo a \u00e9t\u00e9 transf\u00e9r\u00e9e", + "NotificationOptionUserLockedOut": "Utilisateur verrouill\u00e9", + "NotificationOptionServerRestartRequired": "Un red\u00e9marrage du serveur est requis", + "UserLockedOutWithName": "L'utilisateur {0} a \u00e9t\u00e9 verrouill\u00e9", "SubtitleDownloadFailureForItem": "Le t\u00e9l\u00e9chargement des sous-titres pour {0} a \u00e9chou\u00e9.", - "HeaderUnidentified": "Non identifi\u00e9", - "HeaderImagePrimary": "Primaire", - "HeaderImageBackdrop": "Contexte", - "HeaderImageLogo": "Logo", - "HeaderUserPrimaryImage": "Avatar de l'utilisateur", - "HeaderOverview": "Aper\u00e7u", - "HeaderShortOverview": "Synopsys", - "HeaderType": "Type", - "HeaderSeverity": "S\u00e9v\u00e9rit\u00e9", - "HeaderUser": "Utilisateur", - "HeaderName": "Nom", - "HeaderDate": "Date", - "HeaderPremiereDate": "Date de la Premi\u00e8re", - "HeaderDateAdded": "Date d'ajout", - "HeaderReleaseDate": "Date de sortie ", - "HeaderRuntime": "Dur\u00e9e", - "HeaderPlayCount": "Nombre de lectures", - "HeaderSeason": "Saison", - "HeaderSeasonNumber": "Num\u00e9ro de saison", - "HeaderSeries": "S\u00e9ries :", - "HeaderNetwork": "R\u00e9seau", - "HeaderYear": "Ann\u00e9e :", - "HeaderYears": "Ann\u00e9es :", - "HeaderParentalRating": "Classification parentale", - "HeaderCommunityRating": "Note de la communaut\u00e9", - "HeaderTrailers": "Bandes-annonces", - "HeaderSpecials": "Episodes sp\u00e9ciaux", - "HeaderGameSystems": "Plateformes de jeu", - "HeaderPlayers": "Lecteurs :", - "HeaderAlbumArtists": "Artistes sur l'album", - "HeaderAlbums": "Albums", - "HeaderDisc": "Disque", - "HeaderTrack": "Piste", - "HeaderAudio": "Audio", - "HeaderVideo": "Vid\u00e9o", - "HeaderEmbeddedImage": "Image int\u00e9gr\u00e9e", - "HeaderResolution": "R\u00e9solution", - "HeaderSubtitles": "Sous-titres", - "HeaderGenres": "Genres", - "HeaderCountries": "Pays", - "HeaderStatus": "\u00c9tat", - "HeaderTracks": "Pistes", - "HeaderMusicArtist": "Artiste de l'album", - "HeaderLocked": "Verrouill\u00e9", - "HeaderStudios": "Studios", - "HeaderActor": "Acteurs", - "HeaderComposer": "Compositeurs", - "HeaderDirector": "R\u00e9alisateurs", - "HeaderGuestStar": "R\u00f4le principal", - "HeaderProducer": "Producteurs", - "HeaderWriter": "Auteur(e)s", - "HeaderParentalRatings": "Note parentale", - "HeaderCommunityRatings": "Classification de la communaut\u00e9", - "StartupEmbyServerIsLoading": "Le serveur Emby est en cours de chargement. Veuillez r\u00e9essayer dans quelques instant." + "Sync": "Synchroniser", + "User": "Utilisateur", + "System": "Syst\u00e8me", + "Application": "Application", + "Plugin": "Extension", + "LabelExit": "Quitter", + "LabelVisitCommunity": "Visiter la communaut\u00e9", + "LabelBrowseLibrary": "Parcourir la m\u00e9diath\u00e8que", + "LabelConfigureServer": "Configurer Emby", + "LabelRestartServer": "Red\u00e9marrer le serveur" }
\ No newline at end of file diff --git a/Emby.Server.Implementations/Localization/Core/gsw.json b/Emby.Server.Implementations/Localization/Core/gsw.json deleted file mode 100644 index 88af82b7e..000000000 --- a/Emby.Server.Implementations/Localization/Core/gsw.json +++ /dev/null @@ -1,178 +0,0 @@ -{ - "DbUpgradeMessage": "Please wait while your Emby Server database is upgraded. {0}% complete.", - "AppDeviceValues": "App: {0}, Device: {1}", - "UserDownloadingItemWithValues": "{0} is downloading {1}", - "FolderTypeMixed": "Verschiedeni Sache", - "FolderTypeMovies": "Film", - "FolderTypeMusic": "Musig", - "FolderTypeAdultVideos": "Erwachseni Film", - "FolderTypePhotos": "F\u00f6teli", - "FolderTypeMusicVideos": "Musigvideos", - "FolderTypeHomeVideos": "Heimvideos", - "FolderTypeGames": "Games", - "FolderTypeBooks": "B\u00fcecher", - "FolderTypeTvShows": "TV", - "FolderTypeInherit": "erbf\u00e4hig", - "HeaderCastCrew": "Cast & Crew", - "HeaderPeople": "People", - "ValueSpecialEpisodeName": "Special - {0}", - "LabelChapterName": "Chapter {0}", - "NameSeasonNumber": "Season {0}", - "LabelExit": "Verlasse", - "LabelVisitCommunity": "Bsuech d'Community", - "LabelGithub": "Github", - "LabelApiDocumentation": "API Dokumentatione", - "LabelDeveloperResources": "Entwickler Ressurce", - "LabelBrowseLibrary": "Dursuech d'Bibliothek", - "LabelConfigureServer": "Konfigurier Emby", - "LabelRestartServer": "Server neustarte", - "CategorySync": "Synchronisierig", - "CategoryUser": "User", - "CategorySystem": "System", - "CategoryApplication": "Application", - "CategoryPlugin": "Plugin", - "NotificationOptionPluginError": "Plugin failure", - "NotificationOptionApplicationUpdateAvailable": "Application update available", - "NotificationOptionApplicationUpdateInstalled": "Application update installed", - "NotificationOptionPluginUpdateInstalled": "Plugin update installed", - "NotificationOptionPluginInstalled": "Plugin installed", - "NotificationOptionPluginUninstalled": "Plugin uninstalled", - "NotificationOptionVideoPlayback": "Video playback started", - "NotificationOptionAudioPlayback": "Audio playback started", - "NotificationOptionGamePlayback": "Game playback started", - "NotificationOptionVideoPlaybackStopped": "Video playback stopped", - "NotificationOptionAudioPlaybackStopped": "Audio playback stopped", - "NotificationOptionGamePlaybackStopped": "Game playback stopped", - "NotificationOptionTaskFailed": "Scheduled task failure", - "NotificationOptionInstallationFailed": "Installation failure", - "NotificationOptionNewLibraryContent": "New content added", - "NotificationOptionNewLibraryContentMultiple": "New content added (multiple)", - "NotificationOptionCameraImageUploaded": "Camera image uploaded", - "NotificationOptionUserLockedOut": "User locked out", - "NotificationOptionServerRestartRequired": "Server restart required", - "ViewTypePlaylists": "Playlists", - "ViewTypeMovies": "Movies", - "ViewTypeTvShows": "TV", - "ViewTypeGames": "Games", - "ViewTypeMusic": "Music", - "ViewTypeMusicGenres": "Genres", - "ViewTypeMusicArtists": "Artists", - "ViewTypeBoxSets": "Collections", - "ViewTypeChannels": "Channels", - "ViewTypeLiveTV": "Live TV", - "ViewTypeLiveTvNowPlaying": "Now Airing", - "ViewTypeLatestGames": "Latest Games", - "ViewTypeRecentlyPlayedGames": "Recently Played", - "ViewTypeGameFavorites": "Favorites", - "ViewTypeGameSystems": "Game Systems", - "ViewTypeGameGenres": "Genres", - "ViewTypeTvResume": "Resume", - "ViewTypeTvNextUp": "Next Up", - "ViewTypeTvLatest": "Latest", - "ViewTypeTvShowSeries": "Series", - "ViewTypeTvGenres": "Genres", - "ViewTypeTvFavoriteSeries": "Favorite Series", - "ViewTypeTvFavoriteEpisodes": "Favorite Episodes", - "ViewTypeMovieResume": "Resume", - "ViewTypeMovieLatest": "Latest", - "ViewTypeMovieMovies": "Movies", - "ViewTypeMovieCollections": "Collections", - "ViewTypeMovieFavorites": "Favorites", - "ViewTypeMovieGenres": "Genres", - "ViewTypeMusicLatest": "Latest", - "ViewTypeMusicPlaylists": "Playlists", - "ViewTypeMusicAlbums": "Albums", - "ViewTypeMusicAlbumArtists": "Album Artists", - "HeaderOtherDisplaySettings": "Display Settings", - "ViewTypeMusicSongs": "Songs", - "ViewTypeMusicFavorites": "Favorites", - "ViewTypeMusicFavoriteAlbums": "Favorite Albums", - "ViewTypeMusicFavoriteArtists": "Favorite Artists", - "ViewTypeMusicFavoriteSongs": "Favorite Songs", - "ViewTypeFolders": "Folders", - "ViewTypeLiveTvRecordingGroups": "Recordings", - "ViewTypeLiveTvChannels": "Channels", - "ScheduledTaskFailedWithName": "{0} failed", - "LabelRunningTimeValue": "Running time: {0}", - "ScheduledTaskStartedWithName": "{0} started", - "VersionNumber": "Version {0}", - "PluginInstalledWithName": "{0} was installed", - "PluginUpdatedWithName": "{0} was updated", - "PluginUninstalledWithName": "{0} was uninstalled", - "ItemAddedWithName": "{0} was added to the library", - "ItemRemovedWithName": "{0} was removed from the library", - "LabelIpAddressValue": "Ip address: {0}", - "DeviceOnlineWithName": "{0} is connected", - "UserOnlineFromDevice": "{0} is online from {1}", - "ProviderValue": "Provider: {0}", - "SubtitlesDownloadedForItem": "Subtitles downloaded for {0}", - "UserConfigurationUpdatedWithName": "User configuration has been updated for {0}", - "UserCreatedWithName": "User {0} has been created", - "UserPasswordChangedWithName": "Password has been changed for user {0}", - "UserDeletedWithName": "User {0} has been deleted", - "MessageServerConfigurationUpdated": "Server configuration has been updated", - "MessageNamedServerConfigurationUpdatedWithValue": "Server configuration section {0} has been updated", - "MessageApplicationUpdated": "Emby Server has been updated", - "FailedLoginAttemptWithUserName": "Failed login attempt from {0}", - "AuthenticationSucceededWithUserName": "{0} successfully authenticated", - "DeviceOfflineWithName": "{0} has disconnected", - "UserLockedOutWithName": "User {0} has been locked out", - "UserOfflineFromDevice": "{0} has disconnected from {1}", - "UserStartedPlayingItemWithValues": "{0} has started playing {1}", - "UserStoppedPlayingItemWithValues": "{0} has stopped playing {1}", - "SubtitleDownloadFailureForItem": "Subtitles failed to download for {0}", - "HeaderUnidentified": "Unidentified", - "HeaderImagePrimary": "Primary", - "HeaderImageBackdrop": "Backdrop", - "HeaderImageLogo": "Logo", - "HeaderUserPrimaryImage": "User Image", - "HeaderOverview": "Overview", - "HeaderShortOverview": "Short Overview", - "HeaderType": "Type", - "HeaderSeverity": "Severity", - "HeaderUser": "User", - "HeaderName": "Name", - "HeaderDate": "Date", - "HeaderPremiereDate": "Premiere Date", - "HeaderDateAdded": "Date Added", - "HeaderReleaseDate": "Release date", - "HeaderRuntime": "Runtime", - "HeaderPlayCount": "Play Count", - "HeaderSeason": "Season", - "HeaderSeasonNumber": "Season number", - "HeaderSeries": "Series:", - "HeaderNetwork": "Network", - "HeaderYear": "Year:", - "HeaderYears": "Years:", - "HeaderParentalRating": "Parental Rating", - "HeaderCommunityRating": "Community rating", - "HeaderTrailers": "Trailers", - "HeaderSpecials": "Specials", - "HeaderGameSystems": "Game Systems", - "HeaderPlayers": "Players:", - "HeaderAlbumArtists": "Album Artists", - "HeaderAlbums": "Albums", - "HeaderDisc": "Disc", - "HeaderTrack": "Track", - "HeaderAudio": "Audio", - "HeaderVideo": "Video", - "HeaderEmbeddedImage": "Embedded image", - "HeaderResolution": "Resolution", - "HeaderSubtitles": "Subtitles", - "HeaderGenres": "Genres", - "HeaderCountries": "Countries", - "HeaderStatus": "Status", - "HeaderTracks": "Tracks", - "HeaderMusicArtist": "Music artist", - "HeaderLocked": "Locked", - "HeaderStudios": "Studios", - "HeaderActor": "Actors", - "HeaderComposer": "Composers", - "HeaderDirector": "Directors", - "HeaderGuestStar": "Guest star", - "HeaderProducer": "Producers", - "HeaderWriter": "Writers", - "HeaderParentalRatings": "Parental Ratings", - "HeaderCommunityRatings": "Community ratings", - "StartupEmbyServerIsLoading": "Emby Server is loading. Please try again shortly." -}
\ No newline at end of file diff --git a/Emby.Server.Implementations/Localization/Core/he.json b/Emby.Server.Implementations/Localization/Core/he.json index 137b45544..f287dc422 100644 --- a/Emby.Server.Implementations/Localization/Core/he.json +++ b/Emby.Server.Implementations/Localization/Core/he.json @@ -1,102 +1,46 @@ { - "DbUpgradeMessage": "Please wait while your Emby Server database is upgraded. {0}% complete.", + "Latest": "Latest", + "ValueSpecialEpisodeName": "\u05de\u05d9\u05d5\u05d7\u05d3- {0}", + "Inherit": "Inherit", + "Books": "Books", + "Music": "Music", + "Games": "Games", + "Photos": "Photos", + "MixedContent": "Mixed content", + "MusicVideos": "Music videos", + "HomeVideos": "Home videos", + "Playlists": "Playlists", + "HeaderRecordingGroups": "Recording Groups", + "HeaderContinueWatching": "Continue Watching", + "HeaderFavoriteArtists": "Favorite Artists", + "HeaderFavoriteSongs": "Favorite Songs", + "HeaderAlbumArtists": "Album Artists", + "HeaderFavoriteAlbums": "Favorite Albums", + "HeaderFavoriteEpisodes": "Favorite Episodes", + "HeaderFavoriteShows": "Favorite Shows", + "HeaderNextUp": "Next Up", + "Favorites": "Favorites", + "Collections": "Collections", + "Channels": "Channels", + "Movies": "\u05e1\u05e8\u05d8\u05d9\u05dd", + "Albums": "Albums", + "Artists": "Artists", + "Folders": "Folders", + "Songs": "Songs", + "TvShows": "TV Shows", + "Shows": "Shows", + "Genres": "\u05d6'\u05d0\u05e0\u05e8\u05d9\u05dd", + "NameSeasonNumber": "Season {0}", "AppDeviceValues": "App: {0}, Device: {1}", "UserDownloadingItemWithValues": "{0} is downloading {1}", - "FolderTypeMixed": "\u05ea\u05d5\u05db\u05df \u05de\u05e2\u05d5\u05e8\u05d1", - "FolderTypeMovies": "\u05e1\u05e8\u05d8\u05d9\u05dd", - "FolderTypeMusic": "Music", - "FolderTypeAdultVideos": "Adult videos", - "FolderTypePhotos": "Photos", - "FolderTypeMusicVideos": "Music videos", - "FolderTypeHomeVideos": "Home videos", - "FolderTypeGames": "Games", - "FolderTypeBooks": "Books", - "FolderTypeTvShows": "\u05d8\u05dc\u05d5\u05d9\u05d6\u05d9\u05d4", - "FolderTypeInherit": "Inherit", - "HeaderCastCrew": "\u05e9\u05d7\u05e7\u05e0\u05d9\u05dd \u05d5\u05e6\u05d5\u05d5\u05ea", - "HeaderPeople": "People", - "ValueSpecialEpisodeName": "Special - {0}", - "LabelChapterName": "Chapter {0}", - "NameSeasonNumber": "Season {0}", - "LabelExit": "\u05d9\u05e6\u05d9\u05d0\u05d4", - "LabelVisitCommunity": "\u05d1\u05e7\u05e8 \u05d1\u05e7\u05d4\u05d9\u05dc\u05d4", - "LabelGithub": "Github", - "LabelApiDocumentation": "\u05ea\u05d9\u05e2\u05d5\u05d3 API", - "LabelDeveloperResources": "Developer Resources", - "LabelBrowseLibrary": "\u05d3\u05e4\u05d3\u05e3 \u05d1\u05e1\u05e4\u05e8\u05d9\u05d4", - "LabelConfigureServer": "\u05e7\u05d1\u05e2 \u05ea\u05e6\u05d5\u05e8\u05ea Emby", - "LabelRestartServer": "\u05d0\u05ea\u05d7\u05dc \u05d0\u05ea \u05d4\u05e9\u05e8\u05ea", - "CategorySync": "\u05e1\u05e0\u05db\u05e8\u05df", - "CategoryUser": "\u05de\u05e9\u05ea\u05de\u05e9", - "CategorySystem": "\u05de\u05e2\u05e8\u05db\u05ea", - "CategoryApplication": "Application", - "CategoryPlugin": "Plugin", - "NotificationOptionPluginError": "\u05ea\u05e7\u05dc\u05d4 \u05d1\u05ea\u05d5\u05e1\u05e3", - "NotificationOptionApplicationUpdateAvailable": "\u05e2\u05d3\u05db\u05d5\u05df \u05ea\u05d5\u05db\u05de\u05d4 \u05e7\u05d9\u05d9\u05dd", - "NotificationOptionApplicationUpdateInstalled": "\u05e2\u05d3\u05db\u05d5\u05df \u05ea\u05d5\u05db\u05e0\u05d4 \u05d4\u05d5\u05ea\u05e7\u05df", - "NotificationOptionPluginUpdateInstalled": "\u05e2\u05d3\u05db\u05d5\u05df \u05ea\u05d5\u05e1\u05e3 \u05d4\u05d5\u05ea\u05e7\u05df", - "NotificationOptionPluginInstalled": "\u05ea\u05d5\u05e1\u05e3 \u05d4\u05d5\u05ea\u05e7\u05df", - "NotificationOptionPluginUninstalled": "\u05ea\u05d5\u05e1\u05e3 \u05d4\u05d5\u05e1\u05e8", - "NotificationOptionVideoPlayback": "\u05e0\u05d2\u05d9\u05e0\u05ea \u05d5\u05d9\u05d3\u05d0\u05d5 \u05d4\u05d7\u05dc\u05d4", - "NotificationOptionAudioPlayback": "\u05e0\u05d2\u05d9\u05e0\u05ea \u05e6\u05dc\u05d9\u05dc \u05d4\u05d7\u05dc\u05d4", - "NotificationOptionGamePlayback": "Game playback started", - "NotificationOptionVideoPlaybackStopped": "\u05e0\u05d2\u05d9\u05e0\u05ea \u05d5\u05d9\u05d3\u05d0\u05d5 \u05d4\u05d5\u05e4\u05e1\u05e7\u05d4", - "NotificationOptionAudioPlaybackStopped": "\u05e0\u05d2\u05d9\u05e0\u05ea \u05e6\u05dc\u05d9\u05dc \u05d4\u05d5\u05e4\u05e1\u05e7\u05d4", - "NotificationOptionGamePlaybackStopped": "Game playback stopped", - "NotificationOptionTaskFailed": "\u05de\u05e9\u05d9\u05de\u05d4 \u05de\u05ea\u05d5\u05d6\u05de\u05e0\u05ea \u05e0\u05db\u05e9\u05dc\u05d4", - "NotificationOptionInstallationFailed": "\u05d4\u05ea\u05e7\u05e0\u05d4 \u05e0\u05db\u05e9\u05dc\u05d4", - "NotificationOptionNewLibraryContent": "\u05ea\u05d5\u05db\u05df \u05d7\u05d3\u05e9 \u05e0\u05d5\u05e1\u05e3", - "NotificationOptionNewLibraryContentMultiple": "\u05d4\u05ea\u05d5\u05d5\u05e1\u05e4\u05d5 \u05ea\u05db\u05e0\u05d9\u05dd \u05d7\u05d3\u05e9\u05d9\u05dd", - "NotificationOptionCameraImageUploaded": "Camera image uploaded", - "NotificationOptionUserLockedOut": "User locked out", - "NotificationOptionServerRestartRequired": "\u05e0\u05d3\u05e8\u05e9\u05ea \u05d4\u05e4\u05e2\u05dc\u05d4 \u05de\u05d7\u05d3\u05e9 \u05e9\u05dc \u05d4\u05e9\u05e8\u05ea", - "ViewTypePlaylists": "Playlists", - "ViewTypeMovies": "\u05e1\u05e8\u05d8\u05d9\u05dd", - "ViewTypeTvShows": "\u05d8\u05dc\u05d5\u05d9\u05d6\u05d9\u05d4", - "ViewTypeGames": "Games", - "ViewTypeMusic": "Music", - "ViewTypeMusicGenres": "Genres", - "ViewTypeMusicArtists": "Artists", - "ViewTypeBoxSets": "Collections", - "ViewTypeChannels": "Channels", - "ViewTypeLiveTV": "Live TV", - "ViewTypeLiveTvNowPlaying": "Now Airing", - "ViewTypeLatestGames": "Latest Games", - "ViewTypeRecentlyPlayedGames": "Recently Played", - "ViewTypeGameFavorites": "Favorites", - "ViewTypeGameSystems": "Game Systems", - "ViewTypeGameGenres": "Genres", - "ViewTypeTvResume": "Resume", - "ViewTypeTvNextUp": "Next Up", - "ViewTypeTvLatest": "Latest", - "ViewTypeTvShowSeries": "Series", - "ViewTypeTvGenres": "Genres", - "ViewTypeTvFavoriteSeries": "Favorite Series", - "ViewTypeTvFavoriteEpisodes": "Favorite Episodes", - "ViewTypeMovieResume": "Resume", - "ViewTypeMovieLatest": "Latest", - "ViewTypeMovieMovies": "\u05e1\u05e8\u05d8\u05d9\u05dd", - "ViewTypeMovieCollections": "Collections", - "ViewTypeMovieFavorites": "Favorites", - "ViewTypeMovieGenres": "Genres", - "ViewTypeMusicLatest": "Latest", - "ViewTypeMusicPlaylists": "Playlists", - "ViewTypeMusicAlbums": "Albums", - "ViewTypeMusicAlbumArtists": "Album Artists", - "HeaderOtherDisplaySettings": "Display Settings", - "ViewTypeMusicSongs": "Songs", - "ViewTypeMusicFavorites": "Favorites", - "ViewTypeMusicFavoriteAlbums": "Favorite Albums", - "ViewTypeMusicFavoriteArtists": "Favorite Artists", - "ViewTypeMusicFavoriteSongs": "Favorite Songs", - "ViewTypeFolders": "Folders", - "ViewTypeLiveTvRecordingGroups": "Recordings", - "ViewTypeLiveTvChannels": "Channels", + "HeaderLiveTV": "Live TV", + "ChapterNameValue": "Chapter {0}", "ScheduledTaskFailedWithName": "{0} failed", "LabelRunningTimeValue": "Running time: {0}", "ScheduledTaskStartedWithName": "{0} started", - "VersionNumber": "\u05d2\u05d9\u05e8\u05e1\u05d0 {0}", + "VersionNumber": "Version {0}", "PluginInstalledWithName": "{0} was installed", + "StartupEmbyServerIsLoading": "Emby Server is loading. Please try again shortly.", "PluginUpdatedWithName": "{0} was updated", "PluginUninstalledWithName": "{0} was uninstalled", "ItemAddedWithName": "{0} was added to the library", @@ -106,73 +50,47 @@ "UserOnlineFromDevice": "{0} is online from {1}", "ProviderValue": "Provider: {0}", "SubtitlesDownloadedForItem": "Subtitles downloaded for {0}", - "UserConfigurationUpdatedWithName": "User configuration has been updated for {0}", "UserCreatedWithName": "User {0} has been created", "UserPasswordChangedWithName": "Password has been changed for user {0}", "UserDeletedWithName": "User {0} has been deleted", + "UserConfigurationUpdatedWithName": "User configuration has been updated for {0}", "MessageServerConfigurationUpdated": "Server configuration has been updated", "MessageNamedServerConfigurationUpdatedWithValue": "Server configuration section {0} has been updated", "MessageApplicationUpdated": "Emby Server has been updated", "FailedLoginAttemptWithUserName": "Failed login attempt from {0}", "AuthenticationSucceededWithUserName": "{0} successfully authenticated", - "DeviceOfflineWithName": "{0} has disconnected", - "UserLockedOutWithName": "User {0} has been locked out", "UserOfflineFromDevice": "{0} has disconnected from {1}", + "DeviceOfflineWithName": "{0} has disconnected", "UserStartedPlayingItemWithValues": "{0} has started playing {1}", "UserStoppedPlayingItemWithValues": "{0} has stopped playing {1}", + "NotificationOptionPluginError": "Plugin failure", + "NotificationOptionApplicationUpdateAvailable": "Application update available", + "NotificationOptionApplicationUpdateInstalled": "Application update installed", + "NotificationOptionPluginUpdateInstalled": "Plugin update installed", + "NotificationOptionPluginInstalled": "Plugin installed", + "NotificationOptionPluginUninstalled": "Plugin uninstalled", + "NotificationOptionVideoPlayback": "Video playback started", + "NotificationOptionAudioPlayback": "Audio playback started", + "NotificationOptionGamePlayback": "Game playback started", + "NotificationOptionVideoPlaybackStopped": "Video playback stopped", + "NotificationOptionAudioPlaybackStopped": "Audio playback stopped", + "NotificationOptionGamePlaybackStopped": "Game playback stopped", + "NotificationOptionTaskFailed": "Scheduled task failure", + "NotificationOptionInstallationFailed": "Installation failure", + "NotificationOptionNewLibraryContent": "New content added", + "NotificationOptionCameraImageUploaded": "Camera image uploaded", + "NotificationOptionUserLockedOut": "User locked out", + "NotificationOptionServerRestartRequired": "Server restart required", + "UserLockedOutWithName": "User {0} has been locked out", "SubtitleDownloadFailureForItem": "Subtitles failed to download for {0}", - "HeaderUnidentified": "Unidentified", - "HeaderImagePrimary": "Primary", - "HeaderImageBackdrop": "Backdrop", - "HeaderImageLogo": "Logo", - "HeaderUserPrimaryImage": "User Image", - "HeaderOverview": "Overview", - "HeaderShortOverview": "Short Overview", - "HeaderType": "Type", - "HeaderSeverity": "Severity", - "HeaderUser": "User", - "HeaderName": "\u05e9\u05dd", - "HeaderDate": "\u05ea\u05d0\u05e8\u05d9\u05da", - "HeaderPremiereDate": "Premiere Date", - "HeaderDateAdded": "\u05ea\u05d0\u05e8\u05d9\u05da \u05d4\u05d5\u05e1\u05e4\u05d4", - "HeaderReleaseDate": "Release date", - "HeaderRuntime": "Runtime", - "HeaderPlayCount": "Play Count", - "HeaderSeason": "Season", - "HeaderSeasonNumber": "Season number", - "HeaderSeries": "\u05e1\u05d3\u05e8\u05d4", - "HeaderNetwork": "Network", - "HeaderYear": "\u05e9\u05e0\u05d4", - "HeaderYears": "\u05e9\u05e0\u05d9\u05dd", - "HeaderParentalRating": "Parental Rating", - "HeaderCommunityRating": "Community rating", - "HeaderTrailers": "Trailers", - "HeaderSpecials": "Specials", - "HeaderGameSystems": "Game Systems", - "HeaderPlayers": "Players:", - "HeaderAlbumArtists": "Album Artists", - "HeaderAlbums": "Albums", - "HeaderDisc": "Disc", - "HeaderTrack": "Track", - "HeaderAudio": "Audio", - "HeaderVideo": "Video", - "HeaderEmbeddedImage": "Embedded image", - "HeaderResolution": "Resolution", - "HeaderSubtitles": "Subtitles", - "HeaderGenres": "Genres", - "HeaderCountries": "Countries", - "HeaderStatus": "\u05de\u05e6\u05d1", - "HeaderTracks": "Tracks", - "HeaderMusicArtist": "Music artist", - "HeaderLocked": "Locked", - "HeaderStudios": "Studios", - "HeaderActor": "\u05e9\u05d7\u05e7\u05e0\u05d9\u05dd", - "HeaderComposer": "\u05de\u05dc\u05d7\u05d9\u05e0\u05d9\u05dd", - "HeaderDirector": "\u05d1\u05de\u05d0\u05d9\u05dd", - "HeaderGuestStar": "\u05d0\u05de\u05df \u05d0\u05d5\u05e8\u05d7", - "HeaderProducer": "\u05de\u05e4\u05d9\u05e7\u05d9\u05dd", - "HeaderWriter": "\u05db\u05d5\u05ea\u05d1\u05d9\u05dd", - "HeaderParentalRatings": "Parental Ratings", - "HeaderCommunityRatings": "Community ratings", - "StartupEmbyServerIsLoading": "Emby Server is loading. Please try again shortly." + "Sync": "\u05e1\u05e0\u05db\u05e8\u05df", + "User": "User", + "System": "System", + "Application": "Application", + "Plugin": "Plugin", + "LabelExit": "Exit", + "LabelVisitCommunity": "Visit Community", + "LabelBrowseLibrary": "Browse Library", + "LabelConfigureServer": "Configure Emby", + "LabelRestartServer": "Restart Server" }
\ No newline at end of file diff --git a/Emby.Server.Implementations/Localization/Core/hr.json b/Emby.Server.Implementations/Localization/Core/hr.json index 7a94dc32b..143e3ab82 100644 --- a/Emby.Server.Implementations/Localization/Core/hr.json +++ b/Emby.Server.Implementations/Localization/Core/hr.json @@ -1,36 +1,68 @@ { - "DbUpgradeMessage": "Please wait while your Emby Server database is upgraded. {0}% complete.", - "AppDeviceValues": "App: {0}, Device: {1}", - "UserDownloadingItemWithValues": "{0} is downloading {1}", - "FolderTypeMixed": "Mixed content", - "FolderTypeMovies": "Movies", - "FolderTypeMusic": "Music", - "FolderTypeAdultVideos": "Adult videos", - "FolderTypePhotos": "Photos", - "FolderTypeMusicVideos": "Music videos", - "FolderTypeHomeVideos": "Home videos", - "FolderTypeGames": "Games", - "FolderTypeBooks": "Books", - "FolderTypeTvShows": "TV", - "FolderTypeInherit": "Inherit", - "HeaderCastCrew": "Glumci i ekipa", - "HeaderPeople": "People", - "ValueSpecialEpisodeName": "Special - {0}", - "LabelChapterName": "Chapter {0}", - "NameSeasonNumber": "Season {0}", - "LabelExit": "Izlaz", - "LabelVisitCommunity": "Posjeti zajednicu", - "LabelGithub": "Github", - "LabelApiDocumentation": "Api Documentation", - "LabelDeveloperResources": "Developer Resources", - "LabelBrowseLibrary": "Pregledaj biblioteku", - "LabelConfigureServer": "Configure Emby", - "LabelRestartServer": "Restartiraj Server", - "CategorySync": "Sync", - "CategoryUser": "Korisnik", - "CategorySystem": "Sistem", - "CategoryApplication": "Aplikacija", - "CategoryPlugin": "Dodatak", + "Latest": "Najnovije", + "ValueSpecialEpisodeName": "Specijal - {0}", + "Inherit": "Naslijedi", + "Books": "Knjige", + "Music": "Glazba", + "Games": "Igre", + "Photos": "Slike", + "MixedContent": "Mije\u0161ani sadr\u017eaj", + "MusicVideos": "Glazbeni spotovi", + "HomeVideos": "Ku\u0107ni videi", + "Playlists": "Popisi", + "HeaderRecordingGroups": "Grupa snimka", + "HeaderContinueWatching": "Continue Watching", + "HeaderFavoriteArtists": "Omiljeni izvo\u0111a\u010di", + "HeaderFavoriteSongs": "Omiljene pjesme", + "HeaderAlbumArtists": "Izvo\u0111a\u010di albuma", + "HeaderFavoriteAlbums": "Omiljeni albumi", + "HeaderFavoriteEpisodes": "Omiljene epizode", + "HeaderFavoriteShows": "Omiljene emisije", + "HeaderNextUp": "Sljede\u0107e je", + "Favorites": "Omiljeni", + "Collections": "Kolekcije", + "Channels": "Kanali", + "Movies": "Filmovi", + "Albums": "Albumi", + "Artists": "Izvo\u0111a\u010di", + "Folders": "Mape", + "Songs": "Pjesme", + "TvShows": "TV Shows", + "Shows": "Shows", + "Genres": "\u017danrovi", + "NameSeasonNumber": "Sezona {0}", + "AppDeviceValues": "Aplikacija: {0}, Ure\u0111aj: {1}", + "UserDownloadingItemWithValues": "{0} se preuzima {1}", + "HeaderLiveTV": "TV u\u017eivo", + "ChapterNameValue": "Poglavlje {0}", + "ScheduledTaskFailedWithName": "{0} neuspjelo", + "LabelRunningTimeValue": "Vrijeme rada: {0}", + "ScheduledTaskStartedWithName": "{0} pokrenuto", + "VersionNumber": "Verzija {0}", + "PluginInstalledWithName": "{0} je instalirano", + "StartupEmbyServerIsLoading": "Emby Server se u\u010ditava. Poku\u0161ajte ponovo kasnije.", + "PluginUpdatedWithName": "{0} je a\u017eurirano", + "PluginUninstalledWithName": "{0} je deinstalirano", + "ItemAddedWithName": "{0} je dodano u biblioteku", + "ItemRemovedWithName": "{0} je uklonjen iz biblioteke", + "LabelIpAddressValue": "Ip adresa: {0}", + "DeviceOnlineWithName": "{0} je spojeno", + "UserOnlineFromDevice": "{0} je online od {1}", + "ProviderValue": "Pru\u017eitelj: {0}", + "SubtitlesDownloadedForItem": "Titlovi prijevoda preuzeti za {0}", + "UserCreatedWithName": "Korisnik {0} je stvoren", + "UserPasswordChangedWithName": "Lozinka je promijenjena za korisnika {0}", + "UserDeletedWithName": "Korisnik {0} je obrisan", + "UserConfigurationUpdatedWithName": "Postavke korisnika su a\u017eurirane za {0}", + "MessageServerConfigurationUpdated": "Postavke servera su a\u017eurirane", + "MessageNamedServerConfigurationUpdatedWithValue": "Odjeljak postavka servera {0} je a\u017euriran", + "MessageApplicationUpdated": "Emby Server je a\u017euriran", + "FailedLoginAttemptWithUserName": "Neuspjeli poku\u0161aj prijave za {0}", + "AuthenticationSucceededWithUserName": "{0} uspje\u0161no ovjerena", + "UserOfflineFromDevice": "{0} se odspojilo od {1}", + "DeviceOfflineWithName": "{0} se odspojilo", + "UserStartedPlayingItemWithValues": "{0} je pokrenuo {1}", + "UserStoppedPlayingItemWithValues": "{0} je zaustavio {1}", "NotificationOptionPluginError": "Dodatak otkazao", "NotificationOptionApplicationUpdateAvailable": "Dostupno a\u017euriranje aplikacije", "NotificationOptionApplicationUpdateInstalled": "Instalirano a\u017euriranje aplikacije", @@ -40,139 +72,25 @@ "NotificationOptionVideoPlayback": "Reprodukcija videa zapo\u010deta", "NotificationOptionAudioPlayback": "Reprodukcija glazbe zapo\u010deta", "NotificationOptionGamePlayback": "Igrica pokrenuta", - "NotificationOptionVideoPlaybackStopped": "Video playback stopped", - "NotificationOptionAudioPlaybackStopped": "Audio playback stopped", - "NotificationOptionGamePlaybackStopped": "Game playback stopped", + "NotificationOptionVideoPlaybackStopped": "Reprodukcija videozapisa je zaustavljena", + "NotificationOptionAudioPlaybackStopped": "Reprodukcija audiozapisa je zaustavljena", + "NotificationOptionGamePlaybackStopped": "Reprodukcija igre je zaustavljena", "NotificationOptionTaskFailed": "Zakazan zadatak nije izvr\u0161en", "NotificationOptionInstallationFailed": "Instalacija nije izvr\u0161ena", - "NotificationOptionNewLibraryContent": "Novi sadr\u017eaj dodan", - "NotificationOptionNewLibraryContentMultiple": "New content added (multiple)", - "NotificationOptionCameraImageUploaded": "Camera image uploaded", - "NotificationOptionUserLockedOut": "User locked out", + "NotificationOptionNewLibraryContent": "Novi sadr\u017eaj je dodan", + "NotificationOptionCameraImageUploaded": "Slike kamere preuzete", + "NotificationOptionUserLockedOut": "Korisnik zaklju\u010dan", "NotificationOptionServerRestartRequired": "Potrebno ponovo pokretanje servera", - "ViewTypePlaylists": "Playlists", - "ViewTypeMovies": "Movies", - "ViewTypeTvShows": "TV", - "ViewTypeGames": "Games", - "ViewTypeMusic": "Music", - "ViewTypeMusicGenres": "Genres", - "ViewTypeMusicArtists": "Artists", - "ViewTypeBoxSets": "Collections", - "ViewTypeChannels": "Channels", - "ViewTypeLiveTV": "Live TV", - "ViewTypeLiveTvNowPlaying": "Now Airing", - "ViewTypeLatestGames": "Latest Games", - "ViewTypeRecentlyPlayedGames": "Recently Played", - "ViewTypeGameFavorites": "Favorites", - "ViewTypeGameSystems": "Game Systems", - "ViewTypeGameGenres": "Genres", - "ViewTypeTvResume": "Resume", - "ViewTypeTvNextUp": "Next Up", - "ViewTypeTvLatest": "Latest", - "ViewTypeTvShowSeries": "Series", - "ViewTypeTvGenres": "Genres", - "ViewTypeTvFavoriteSeries": "Favorite Series", - "ViewTypeTvFavoriteEpisodes": "Favorite Episodes", - "ViewTypeMovieResume": "Resume", - "ViewTypeMovieLatest": "Latest", - "ViewTypeMovieMovies": "Movies", - "ViewTypeMovieCollections": "Collections", - "ViewTypeMovieFavorites": "Favorites", - "ViewTypeMovieGenres": "Genres", - "ViewTypeMusicLatest": "Latest", - "ViewTypeMusicPlaylists": "Playlists", - "ViewTypeMusicAlbums": "Albums", - "ViewTypeMusicAlbumArtists": "Album Artists", - "HeaderOtherDisplaySettings": "Display Settings", - "ViewTypeMusicSongs": "Songs", - "ViewTypeMusicFavorites": "Favorites", - "ViewTypeMusicFavoriteAlbums": "Favorite Albums", - "ViewTypeMusicFavoriteArtists": "Favorite Artists", - "ViewTypeMusicFavoriteSongs": "Favorite Songs", - "ViewTypeFolders": "Folders", - "ViewTypeLiveTvRecordingGroups": "Recordings", - "ViewTypeLiveTvChannels": "Channels", - "ScheduledTaskFailedWithName": "{0} failed", - "LabelRunningTimeValue": "Running time: {0}", - "ScheduledTaskStartedWithName": "{0} started", - "VersionNumber": "Verzija {0}", - "PluginInstalledWithName": "{0} was installed", - "PluginUpdatedWithName": "{0} was updated", - "PluginUninstalledWithName": "{0} was uninstalled", - "ItemAddedWithName": "{0} was added to the library", - "ItemRemovedWithName": "{0} was removed from the library", - "LabelIpAddressValue": "Ip address: {0}", - "DeviceOnlineWithName": "{0} is connected", - "UserOnlineFromDevice": "{0} is online from {1}", - "ProviderValue": "Provider: {0}", - "SubtitlesDownloadedForItem": "Subtitles downloaded for {0}", - "UserConfigurationUpdatedWithName": "User configuration has been updated for {0}", - "UserCreatedWithName": "User {0} has been created", - "UserPasswordChangedWithName": "Password has been changed for user {0}", - "UserDeletedWithName": "User {0} has been deleted", - "MessageServerConfigurationUpdated": "Server configuration has been updated", - "MessageNamedServerConfigurationUpdatedWithValue": "Server configuration section {0} has been updated", - "MessageApplicationUpdated": "Emby Server has been updated", - "FailedLoginAttemptWithUserName": "Failed login attempt from {0}", - "AuthenticationSucceededWithUserName": "{0} successfully authenticated", - "DeviceOfflineWithName": "{0} has disconnected", - "UserLockedOutWithName": "User {0} has been locked out", - "UserOfflineFromDevice": "{0} has disconnected from {1}", - "UserStartedPlayingItemWithValues": "{0} has started playing {1}", - "UserStoppedPlayingItemWithValues": "{0} has stopped playing {1}", - "SubtitleDownloadFailureForItem": "Subtitles failed to download for {0}", - "HeaderUnidentified": "Unidentified", - "HeaderImagePrimary": "Primary", - "HeaderImageBackdrop": "Backdrop", - "HeaderImageLogo": "Logo", - "HeaderUserPrimaryImage": "User Image", - "HeaderOverview": "Overview", - "HeaderShortOverview": "Short Overview", - "HeaderType": "Type", - "HeaderSeverity": "Severity", - "HeaderUser": "User", - "HeaderName": "Ime", - "HeaderDate": "Datum", - "HeaderPremiereDate": "Premiere Date", - "HeaderDateAdded": "Date Added", - "HeaderReleaseDate": "Release date", - "HeaderRuntime": "Runtime", - "HeaderPlayCount": "Play Count", - "HeaderSeason": "Season", - "HeaderSeasonNumber": "Season number", - "HeaderSeries": "Series:", - "HeaderNetwork": "Network", - "HeaderYear": "Year:", - "HeaderYears": "Years:", - "HeaderParentalRating": "Parental Rating", - "HeaderCommunityRating": "Community rating", - "HeaderTrailers": "Trailers", - "HeaderSpecials": "Specials", - "HeaderGameSystems": "Game Systems", - "HeaderPlayers": "Players:", - "HeaderAlbumArtists": "Album Artists", - "HeaderAlbums": "Albums", - "HeaderDisc": "Disc", - "HeaderTrack": "Track", - "HeaderAudio": "Audio", - "HeaderVideo": "Video", - "HeaderEmbeddedImage": "Embedded image", - "HeaderResolution": "Resolution", - "HeaderSubtitles": "Subtitles", - "HeaderGenres": "Genres", - "HeaderCountries": "Countries", - "HeaderStatus": "Status", - "HeaderTracks": "Tracks", - "HeaderMusicArtist": "Music artist", - "HeaderLocked": "Locked", - "HeaderStudios": "Studios", - "HeaderActor": "Actors", - "HeaderComposer": "Composers", - "HeaderDirector": "Directors", - "HeaderGuestStar": "Guest star", - "HeaderProducer": "Producers", - "HeaderWriter": "Writers", - "HeaderParentalRatings": "Parental Ratings", - "HeaderCommunityRatings": "Community ratings", - "StartupEmbyServerIsLoading": "Emby Server is loading. Please try again shortly." + "UserLockedOutWithName": "Korisnik {0} je zaklju\u010dan", + "SubtitleDownloadFailureForItem": "Titlovi prijevoda nisu preuzeti za {0}", + "Sync": "Sink.", + "User": "Korisnik", + "System": "Sistem", + "Application": "Aplikacija", + "Plugin": "Dodatak", + "LabelExit": "Izlaz", + "LabelVisitCommunity": "Posjeti zajednicu", + "LabelBrowseLibrary": "Pregledaj biblioteku", + "LabelConfigureServer": "Podesi Emby", + "LabelRestartServer": "Restartiraj Server" }
\ No newline at end of file diff --git a/Emby.Server.Implementations/Localization/Core/hu.json b/Emby.Server.Implementations/Localization/Core/hu.json index 2b9d28d8c..80160966f 100644 --- a/Emby.Server.Implementations/Localization/Core/hu.json +++ b/Emby.Server.Implementations/Localization/Core/hu.json @@ -1,178 +1,96 @@ { - "DbUpgradeMessage": "K\u00e9rlek v\u00e1rj, m\u00edg az Emby Szerver adatb\u00e1zis friss\u00fcl. {0}% k\u00e9sz.", - "AppDeviceValues": "App: {0}, Device: {1}", - "UserDownloadingItemWithValues": "{0} is downloading {1}", - "FolderTypeMixed": "Vegyes tartalom", - "FolderTypeMovies": "Filmek", - "FolderTypeMusic": "Zen\u00e9k", - "FolderTypeAdultVideos": "Feln\u0151tt vide\u00f3k", - "FolderTypePhotos": "F\u00e9nyk\u00e9pek", - "FolderTypeMusicVideos": "Zenei vide\u00f3k", - "FolderTypeHomeVideos": "H\u00e1zi vide\u00f3k", - "FolderTypeGames": "J\u00e1t\u00e9kok", - "FolderTypeBooks": "K\u00f6nyvek", - "FolderTypeTvShows": "TV", - "FolderTypeInherit": "Inherit", - "HeaderCastCrew": "Szerepl\u0151k & R\u00e9sztvev\u0151k", - "HeaderPeople": "Emberek", - "ValueSpecialEpisodeName": "K\u00fcl\u00f6nleges - {0}", - "LabelChapterName": "Fejezet {0}", - "NameSeasonNumber": "\u00c9vad {0}", - "LabelExit": "Kil\u00e9p\u00e9s", - "LabelVisitCommunity": "K\u00f6z\u00f6ss\u00e9g", - "LabelGithub": "Github", - "LabelApiDocumentation": "Api dokument\u00e1ci\u00f3", - "LabelDeveloperResources": "Fejleszt\u0151i eszk\u00f6z\u00f6k", - "LabelBrowseLibrary": "M\u00e9diat\u00e1r tall\u00f3z\u00e1sa", - "LabelConfigureServer": "Emby konfigur\u00e1l\u00e1sa", - "LabelRestartServer": "Szerver \u00fajraindit\u00e1sa", - "CategorySync": "Sync", - "CategoryUser": "Felhaszn\u00e1l\u00f3", - "CategorySystem": "Rendszer", - "CategoryApplication": "Alkalmaz\u00e1s", - "CategoryPlugin": "B\u0151v\u00edtm\u00e9ny", + "Latest": "Leg\u00fajabb", + "ValueSpecialEpisodeName": "Special - {0}", + "Inherit": "Inherit", + "Books": "Books", + "Music": "Music", + "Games": "Games", + "Photos": "Photos", + "MixedContent": "Mixed content", + "MusicVideos": "Music videos", + "HomeVideos": "Home videos", + "Playlists": "Playlists", + "HeaderRecordingGroups": "Recording Groups", + "HeaderContinueWatching": "Vet\u00edt\u00e9s(ek) folytat\u00e1sa", + "HeaderFavoriteArtists": "Favorite Artists", + "HeaderFavoriteSongs": "Favorite Songs", + "HeaderAlbumArtists": "Album Artists", + "HeaderFavoriteAlbums": "Favorite Albums", + "HeaderFavoriteEpisodes": "Kedvenc Epiz\u00f3dok", + "HeaderFavoriteShows": "Kedvenc M\u0171sorok", + "HeaderNextUp": "K\u00f6vetkezik", + "Favorites": "Favorites", + "Collections": "Gy\u0171jtem\u00e9nyek", + "Channels": "Csatorn\u00e1k", + "Movies": "Movies", + "Albums": "Albums", + "Artists": "Artists", + "Folders": "Folders", + "Songs": "Songs", + "TvShows": "TV Shows", + "Shows": "Shows", + "Genres": "M\u0171fajok", + "NameSeasonNumber": "Season {0}", + "AppDeviceValues": "Program: {0}, Eszk\u00f6z: {1}", + "UserDownloadingItemWithValues": "{0} let\u00f6lti {1}", + "HeaderLiveTV": "Live TV", + "ChapterNameValue": "Jelenet {0}", + "ScheduledTaskFailedWithName": "{0} failed", + "LabelRunningTimeValue": "Running time: {0}", + "ScheduledTaskStartedWithName": "{0} started", + "VersionNumber": "Version {0}", + "PluginInstalledWithName": "{0} telep\u00edtve", + "StartupEmbyServerIsLoading": "Emby Szerver bet\u00f6lt\u0151dik. K\u00e9rj\u00fck, pr\u00f3b\u00e1ld meg \u00fajra k\u00e9s\u0151bb.", + "PluginUpdatedWithName": "{0} was updated", + "PluginUninstalledWithName": "{0} elt\u00e1vol\u00edtva", + "ItemAddedWithName": "{0} was added to the library", + "ItemRemovedWithName": "{0} was removed from the library", + "LabelIpAddressValue": "Ip address: {0}", + "DeviceOnlineWithName": "{0} is connected", + "UserOnlineFromDevice": "{0} is online from {1}", + "ProviderValue": "Provider: {0}", + "SubtitlesDownloadedForItem": "Subtitles downloaded for {0}", + "UserCreatedWithName": "User {0} has been created", + "UserPasswordChangedWithName": "Password has been changed for user {0}", + "UserDeletedWithName": "User {0} has been deleted", + "UserConfigurationUpdatedWithName": "User configuration has been updated for {0}", + "MessageServerConfigurationUpdated": "Szerver konfigur\u00e1ci\u00f3 friss\u00fclt", + "MessageNamedServerConfigurationUpdatedWithValue": "Szerver konfigur\u00e1ci\u00f3s r\u00e9sz {0} friss\u00edtve", + "MessageApplicationUpdated": "Emby Szerver friss\u00edtve", + "FailedLoginAttemptWithUserName": "Failed login attempt from {0}", + "AuthenticationSucceededWithUserName": "{0} successfully authenticated", + "UserOfflineFromDevice": "{0} kijelentkezett innen {1}", + "DeviceOfflineWithName": "{0} kijelentkezett", + "UserStartedPlayingItemWithValues": "{0} has started playing {1}", + "UserStoppedPlayingItemWithValues": "{0} has stopped playing {1}", "NotificationOptionPluginError": "B\u0151v\u00edtm\u00e9ny hiba", "NotificationOptionApplicationUpdateAvailable": "Friss\u00edt\u00e9s el\u00e9rhet\u0151", "NotificationOptionApplicationUpdateInstalled": "Program friss\u00edt\u00e9s telep\u00edtve", "NotificationOptionPluginUpdateInstalled": "B\u0151v\u00edtm\u00e9ny friss\u00edt\u00e9s telep\u00edtve", "NotificationOptionPluginInstalled": "B\u0151v\u00edtm\u00e9ny telep\u00edtve", "NotificationOptionPluginUninstalled": "B\u0151v\u00edtm\u00e9ny elt\u00e1vol\u00edtva", - "NotificationOptionVideoPlayback": "Vide\u00f3 elind\u00edtva", - "NotificationOptionAudioPlayback": "Zene elind\u00edtva", - "NotificationOptionGamePlayback": "J\u00e1t\u00e9k elind\u00edtva", - "NotificationOptionVideoPlaybackStopped": "Vide\u00f3 meg\u00e1ll\u00edtva", - "NotificationOptionAudioPlaybackStopped": "Zene meg\u00e1ll\u00edtva", - "NotificationOptionGamePlaybackStopped": "J\u00e1t\u00e9k meg\u00e1ll\u00edtva", + "NotificationOptionVideoPlayback": "Vide\u00f3 lej\u00e1tsz\u00e1s elkezdve", + "NotificationOptionAudioPlayback": "Audi\u00f3 lej\u00e1tsz\u00e1s elkezdve", + "NotificationOptionGamePlayback": "Game playback started", + "NotificationOptionVideoPlaybackStopped": "Vide\u00f3 lej\u00e1tsz\u00e1s befejezve", + "NotificationOptionAudioPlaybackStopped": "Audi\u00f3 lej\u00e1tsz\u00e1s befejezve", + "NotificationOptionGamePlaybackStopped": "Game playback stopped", "NotificationOptionTaskFailed": "Scheduled task failure", "NotificationOptionInstallationFailed": "Telep\u00edt\u00e9si hiba", "NotificationOptionNewLibraryContent": "\u00daj tartalom hozz\u00e1adva", - "NotificationOptionNewLibraryContentMultiple": "\u00daj tartalom hozz\u00e1adva (t\u00f6bbsz\u00f6r\u00f6s)", "NotificationOptionCameraImageUploaded": "Kamera k\u00e9p felt\u00f6ltve", "NotificationOptionUserLockedOut": "Felhaszn\u00e1l\u00f3 tiltva", - "NotificationOptionServerRestartRequired": "\u00dajraind\u00edt\u00e1s sz\u00fcks\u00e9ges", - "ViewTypePlaylists": "Lej\u00e1tsz\u00e1si list\u00e1k", - "ViewTypeMovies": "Filmek", - "ViewTypeTvShows": "TV", - "ViewTypeGames": "J\u00e1t\u00e9kok", - "ViewTypeMusic": "Zene", - "ViewTypeMusicGenres": "M\u0171fajok", - "ViewTypeMusicArtists": "M\u0171v\u00e9szek", - "ViewTypeBoxSets": "Gy\u0171jtem\u00e9nyek", - "ViewTypeChannels": "Csatorn\u00e1k", - "ViewTypeLiveTV": "\u00c9l\u0151 TV", - "ViewTypeLiveTvNowPlaying": "Most J\u00e1tszott", - "ViewTypeLatestGames": "Leg\u00fajabb J\u00e1t\u00e9kok", - "ViewTypeRecentlyPlayedGames": "Legut\u00f3bb J\u00e1tszott", - "ViewTypeGameFavorites": "Kedvencek", - "ViewTypeGameSystems": "J\u00e1t\u00e9k Rendszer", - "ViewTypeGameGenres": "M\u0171fajok", - "ViewTypeTvResume": "Folytat\u00e1s", - "ViewTypeTvNextUp": "K\u00f6vetkez\u0151", - "ViewTypeTvLatest": "Leg\u00fajabb", - "ViewTypeTvShowSeries": "Sorozat", - "ViewTypeTvGenres": "M\u0171fajok", - "ViewTypeTvFavoriteSeries": "Kedvenc Sorozat", - "ViewTypeTvFavoriteEpisodes": "Kedvenc R\u00e9szek", - "ViewTypeMovieResume": "Folytat\u00e1s", - "ViewTypeMovieLatest": "Leg\u00fajabb", - "ViewTypeMovieMovies": "Filmek", - "ViewTypeMovieCollections": "Gy\u0171jtem\u00e9nyek", - "ViewTypeMovieFavorites": "Kedvencek", - "ViewTypeMovieGenres": "M\u0171fajok", - "ViewTypeMusicLatest": "Leg\u00fajabb", - "ViewTypeMusicPlaylists": "Lej\u00e1tsz\u00e1si list\u00e1k", - "ViewTypeMusicAlbums": "Albumok", - "ViewTypeMusicAlbumArtists": "Album El\u0151ad\u00f3k", - "HeaderOtherDisplaySettings": "Megjelen\u00edt\u00e9si Be\u00e1ll\u00edt\u00e1sok", - "ViewTypeMusicSongs": "Dalok", - "ViewTypeMusicFavorites": "Kedvencek", - "ViewTypeMusicFavoriteAlbums": "Kedvenc Albumok", - "ViewTypeMusicFavoriteArtists": "Kedvenc M\u0171v\u00e9szek", - "ViewTypeMusicFavoriteSongs": "Kedvenc Dalok", - "ViewTypeFolders": "K\u00f6nyvt\u00e1rak", - "ViewTypeLiveTvRecordingGroups": "Felv\u00e9telek", - "ViewTypeLiveTvChannels": "Csatorn\u00e1k", - "ScheduledTaskFailedWithName": "{0} hiba", - "LabelRunningTimeValue": "Fut\u00e1si id\u0151: {0}", - "ScheduledTaskStartedWithName": "{0} elkezdve", - "VersionNumber": "Verzi\u00f3 {0}", - "PluginInstalledWithName": "{0} telep\u00edtve", - "PluginUpdatedWithName": "{0} friss\u00edtve", - "PluginUninstalledWithName": "{0} elt\u00e1vol\u00edtva", - "ItemAddedWithName": "{0} k\u00f6nyvt\u00e1rhoz adva", - "ItemRemovedWithName": "{0} t\u00f6r\u00f6lve a k\u00f6nyvt\u00e1rb\u00f3l", - "LabelIpAddressValue": "Ip c\u00edm: {0}", - "DeviceOnlineWithName": "{0} kapcsol\u00f3dva", - "UserOnlineFromDevice": "{0} akt\u00edv err\u0151l {1}", - "ProviderValue": "Provider: {0}", - "SubtitlesDownloadedForItem": "Felirat let\u00f6lt\u00e9se ehhez {0}", - "UserConfigurationUpdatedWithName": "A k\u00f6vetkez\u0151 felhaszn\u00e1l\u00f3 be\u00e1ll\u00edt\u00e1sai friss\u00edtve {0}", - "UserCreatedWithName": "Felhaszn\u00e1l\u00f3 {0} l\u00e9trehozva", - "UserPasswordChangedWithName": "Jelsz\u00f3 m\u00f3dos\u00edtva ennek a felhaszn\u00e1l\u00f3nak {0}", - "UserDeletedWithName": "Felhaszn\u00e1l\u00f3 {0} t\u00f6r\u00f6lve", - "MessageServerConfigurationUpdated": "Szerver be\u00e1ll\u00edt\u00e1sok friss\u00edtve", - "MessageNamedServerConfigurationUpdatedWithValue": "Server configuration section {0} has been updated", - "MessageApplicationUpdated": "Emby Server friss\u00edtve", - "FailedLoginAttemptWithUserName": "Failed login attempt from {0}", - "AuthenticationSucceededWithUserName": "{0} successfully authenticated", - "DeviceOfflineWithName": "{0} sz\u00e9tkapcsolt", - "UserLockedOutWithName": "A k\u00f6vetkez\u0151 felhaszn\u00e1l\u00f3 tiltva {0}", - "UserOfflineFromDevice": "{0} kil\u00e9pett innen {1}", - "UserStartedPlayingItemWithValues": "{0} megkezdte j\u00e1tszani a(z) {1}", - "UserStoppedPlayingItemWithValues": "{0} befejezte a(z) {1}", - "SubtitleDownloadFailureForItem": "Nem siker\u00fcl a felirat let\u00f6lt\u00e9s ehhez {0}", - "HeaderUnidentified": "Azonos\u00edtatlan", - "HeaderImagePrimary": "Els\u0151dleges", - "HeaderImageBackdrop": "H\u00e1tt\u00e9r", - "HeaderImageLogo": "Logo", - "HeaderUserPrimaryImage": "Felhaszn\u00e1l\u00f3 K\u00e9p", - "HeaderOverview": "\u00c1ttekint\u00e9s", - "HeaderShortOverview": "R\u00f6vid \u00c1ttekint\u00e9s", - "HeaderType": "T\u00edpus", - "HeaderSeverity": "Severity", - "HeaderUser": "Felhaszn\u00e1l\u00f3", - "HeaderName": "N\u00e9v", - "HeaderDate": "D\u00e1tum", - "HeaderPremiereDate": "Megjelen\u00e9s D\u00e1tuma", - "HeaderDateAdded": "Hozz\u00e1adva", - "HeaderReleaseDate": "Megjelen\u00e9s d\u00e1tuma", - "HeaderRuntime": "J\u00e1t\u00e9kid\u0151", - "HeaderPlayCount": "Play Count", - "HeaderSeason": "\u00c9vad", - "HeaderSeasonNumber": "\u00c9vad sz\u00e1ma", - "HeaderSeries": "Sorozatok:", - "HeaderNetwork": "H\u00e1l\u00f3zat", - "HeaderYear": "\u00c9v:", - "HeaderYears": "\u00c9v:", - "HeaderParentalRating": "Korhat\u00e1r besorol\u00e1s", - "HeaderCommunityRating": "K\u00f6z\u00f6ss\u00e9gi \u00e9rt\u00e9kel\u00e9s", - "HeaderTrailers": "El\u0151zetesek", - "HeaderSpecials": "Speci\u00e1lis", - "HeaderGameSystems": "J\u00e1t\u00e9k Rendszer", - "HeaderPlayers": "Players:", - "HeaderAlbumArtists": "Album Artists", - "HeaderAlbums": "Albumok", - "HeaderDisc": "Lemez", - "HeaderTrack": "S\u00e1v", - "HeaderAudio": "Audi\u00f3", - "HeaderVideo": "Vide\u00f3", - "HeaderEmbeddedImage": "Be\u00e1gyazott k\u00e9p", - "HeaderResolution": "Felbont\u00e1s", - "HeaderSubtitles": "Feliratok", - "HeaderGenres": "M\u0171fajok", - "HeaderCountries": "Orsz\u00e1gok", - "HeaderStatus": "\u00c1llapot", - "HeaderTracks": "S\u00e1vok", - "HeaderMusicArtist": "Music artist", - "HeaderLocked": "Z\u00e1rt", - "HeaderStudios": "St\u00fadi\u00f3k", - "HeaderActor": "Sz\u00edn\u00e9szek", - "HeaderComposer": "Zeneszerz\u0151k", - "HeaderDirector": "Rendez\u0151k", - "HeaderGuestStar": "Vend\u00e9g szt\u00e1r", - "HeaderProducer": "Producerek", - "HeaderWriter": "\u00cdr\u00f3k", - "HeaderParentalRatings": "Korhat\u00e1r besorol\u00e1s", - "HeaderCommunityRatings": "K\u00f6z\u00f6ss\u00e9gi \u00e9rt\u00e9kel\u00e9sek", - "StartupEmbyServerIsLoading": "Emby Server is loading. Please try again shortly." + "NotificationOptionServerRestartRequired": "Szerver \u00fajraind\u00edt\u00e1s sz\u00fcks\u00e9ges", + "UserLockedOutWithName": "User {0} has been locked out", + "SubtitleDownloadFailureForItem": "Subtitles failed to download for {0}", + "Sync": "Szinkroniz\u00e1l", + "User": "User", + "System": "System", + "Application": "Application", + "Plugin": "Plugin", + "LabelExit": "Kil\u00e9p\u00e9s", + "LabelVisitCommunity": "K\u00f6z\u00f6ss\u00e9g", + "LabelBrowseLibrary": "M\u00e9diat\u00e1r tall\u00f3z\u00e1sa", + "LabelConfigureServer": "Emby konfigur\u00e1l\u00e1sa", + "LabelRestartServer": "Szerver \u00fajraindit\u00e1sa" }
\ No newline at end of file diff --git a/Emby.Server.Implementations/Localization/Core/id.json b/Emby.Server.Implementations/Localization/Core/id.json deleted file mode 100644 index 8d64b63c4..000000000 --- a/Emby.Server.Implementations/Localization/Core/id.json +++ /dev/null @@ -1,178 +0,0 @@ -{ - "DbUpgradeMessage": "Silahkan menunggu sementara database Emby Server anda diupgrade. {0}% selesai.", - "AppDeviceValues": "App: {0}, Device: {1}", - "UserDownloadingItemWithValues": "{0} is downloading {1}", - "FolderTypeMixed": "Mixed content", - "FolderTypeMovies": "Movies", - "FolderTypeMusic": "Music", - "FolderTypeAdultVideos": "Adult videos", - "FolderTypePhotos": "Photos", - "FolderTypeMusicVideos": "Music videos", - "FolderTypeHomeVideos": "Home videos", - "FolderTypeGames": "Games", - "FolderTypeBooks": "Books", - "FolderTypeTvShows": "TV", - "FolderTypeInherit": "Mewarisi", - "HeaderCastCrew": "Cast & Crew", - "HeaderPeople": "People", - "ValueSpecialEpisodeName": "Special - {0}", - "LabelChapterName": "Chapter {0}", - "NameSeasonNumber": "Season {0}", - "LabelExit": "Keluar", - "LabelVisitCommunity": "Kunjungi Komunitas", - "LabelGithub": "Github", - "LabelApiDocumentation": "Dokumentasi Api", - "LabelDeveloperResources": "Sumber daya Pengembang", - "LabelBrowseLibrary": "Telusuri Pustaka", - "LabelConfigureServer": "Konfigurasi Emby", - "LabelRestartServer": "Hidupkan ulang Server", - "CategorySync": "Singkron", - "CategoryUser": "User", - "CategorySystem": "System", - "CategoryApplication": "Application", - "CategoryPlugin": "Plugin", - "NotificationOptionPluginError": "Plugin failure", - "NotificationOptionApplicationUpdateAvailable": "Application update available", - "NotificationOptionApplicationUpdateInstalled": "Application update installed", - "NotificationOptionPluginUpdateInstalled": "Plugin update installed", - "NotificationOptionPluginInstalled": "Plugin installed", - "NotificationOptionPluginUninstalled": "Plugin uninstalled", - "NotificationOptionVideoPlayback": "Video playback started", - "NotificationOptionAudioPlayback": "Audio playback started", - "NotificationOptionGamePlayback": "Game playback started", - "NotificationOptionVideoPlaybackStopped": "Video playback stopped", - "NotificationOptionAudioPlaybackStopped": "Audio playback stopped", - "NotificationOptionGamePlaybackStopped": "Game playback stopped", - "NotificationOptionTaskFailed": "Scheduled task failure", - "NotificationOptionInstallationFailed": "Installation failure", - "NotificationOptionNewLibraryContent": "New content added", - "NotificationOptionNewLibraryContentMultiple": "New content added (multiple)", - "NotificationOptionCameraImageUploaded": "Camera image uploaded", - "NotificationOptionUserLockedOut": "User locked out", - "NotificationOptionServerRestartRequired": "Server restart required", - "ViewTypePlaylists": "Playlists", - "ViewTypeMovies": "Movies", - "ViewTypeTvShows": "TV", - "ViewTypeGames": "Games", - "ViewTypeMusic": "Music", - "ViewTypeMusicGenres": "Genres", - "ViewTypeMusicArtists": "Artists", - "ViewTypeBoxSets": "Collections", - "ViewTypeChannels": "Channels", - "ViewTypeLiveTV": "Live TV", - "ViewTypeLiveTvNowPlaying": "Now Airing", - "ViewTypeLatestGames": "Latest Games", - "ViewTypeRecentlyPlayedGames": "Recently Played", - "ViewTypeGameFavorites": "Favorites", - "ViewTypeGameSystems": "Game Systems", - "ViewTypeGameGenres": "Genres", - "ViewTypeTvResume": "Resume", - "ViewTypeTvNextUp": "Next Up", - "ViewTypeTvLatest": "Latest", - "ViewTypeTvShowSeries": "Series", - "ViewTypeTvGenres": "Genres", - "ViewTypeTvFavoriteSeries": "Favorite Series", - "ViewTypeTvFavoriteEpisodes": "Favorite Episodes", - "ViewTypeMovieResume": "Resume", - "ViewTypeMovieLatest": "Latest", - "ViewTypeMovieMovies": "Movies", - "ViewTypeMovieCollections": "Collections", - "ViewTypeMovieFavorites": "Favorites", - "ViewTypeMovieGenres": "Genres", - "ViewTypeMusicLatest": "Latest", - "ViewTypeMusicPlaylists": "Playlists", - "ViewTypeMusicAlbums": "Albums", - "ViewTypeMusicAlbumArtists": "Album Artists", - "HeaderOtherDisplaySettings": "Display Settings", - "ViewTypeMusicSongs": "Songs", - "ViewTypeMusicFavorites": "Favorites", - "ViewTypeMusicFavoriteAlbums": "Favorite Albums", - "ViewTypeMusicFavoriteArtists": "Favorite Artists", - "ViewTypeMusicFavoriteSongs": "Favorite Songs", - "ViewTypeFolders": "Folders", - "ViewTypeLiveTvRecordingGroups": "Recordings", - "ViewTypeLiveTvChannels": "Channels", - "ScheduledTaskFailedWithName": "{0} failed", - "LabelRunningTimeValue": "Running time: {0}", - "ScheduledTaskStartedWithName": "{0} started", - "VersionNumber": "Version {0}", - "PluginInstalledWithName": "{0} was installed", - "PluginUpdatedWithName": "{0} was updated", - "PluginUninstalledWithName": "{0} was uninstalled", - "ItemAddedWithName": "{0} was added to the library", - "ItemRemovedWithName": "{0} was removed from the library", - "LabelIpAddressValue": "Ip address: {0}", - "DeviceOnlineWithName": "{0} is connected", - "UserOnlineFromDevice": "{0} is online from {1}", - "ProviderValue": "Provider: {0}", - "SubtitlesDownloadedForItem": "Subtitles downloaded for {0}", - "UserConfigurationUpdatedWithName": "User configuration has been updated for {0}", - "UserCreatedWithName": "User {0} has been created", - "UserPasswordChangedWithName": "Password has been changed for user {0}", - "UserDeletedWithName": "User {0} has been deleted", - "MessageServerConfigurationUpdated": "Server configuration has been updated", - "MessageNamedServerConfigurationUpdatedWithValue": "Server configuration section {0} has been updated", - "MessageApplicationUpdated": "Emby Server has been updated", - "FailedLoginAttemptWithUserName": "Failed login attempt from {0}", - "AuthenticationSucceededWithUserName": "{0} successfully authenticated", - "DeviceOfflineWithName": "{0} has disconnected", - "UserLockedOutWithName": "User {0} has been locked out", - "UserOfflineFromDevice": "{0} has disconnected from {1}", - "UserStartedPlayingItemWithValues": "{0} has started playing {1}", - "UserStoppedPlayingItemWithValues": "{0} has stopped playing {1}", - "SubtitleDownloadFailureForItem": "Subtitles failed to download for {0}", - "HeaderUnidentified": "Unidentified", - "HeaderImagePrimary": "Primary", - "HeaderImageBackdrop": "Backdrop", - "HeaderImageLogo": "Logo", - "HeaderUserPrimaryImage": "User Image", - "HeaderOverview": "Overview", - "HeaderShortOverview": "Short Overview", - "HeaderType": "Type", - "HeaderSeverity": "Severity", - "HeaderUser": "User", - "HeaderName": "Name", - "HeaderDate": "Date", - "HeaderPremiereDate": "Premiere Date", - "HeaderDateAdded": "Date Added", - "HeaderReleaseDate": "Release date", - "HeaderRuntime": "Runtime", - "HeaderPlayCount": "Play Count", - "HeaderSeason": "Season", - "HeaderSeasonNumber": "Season number", - "HeaderSeries": "Series:", - "HeaderNetwork": "Network", - "HeaderYear": "Year:", - "HeaderYears": "Years:", - "HeaderParentalRating": "Parental Rating", - "HeaderCommunityRating": "Community rating", - "HeaderTrailers": "Trailers", - "HeaderSpecials": "Specials", - "HeaderGameSystems": "Game Systems", - "HeaderPlayers": "Players:", - "HeaderAlbumArtists": "Album Artists", - "HeaderAlbums": "Albums", - "HeaderDisc": "Disc", - "HeaderTrack": "Track", - "HeaderAudio": "Audio", - "HeaderVideo": "Video", - "HeaderEmbeddedImage": "Embedded image", - "HeaderResolution": "Resolution", - "HeaderSubtitles": "Subtitles", - "HeaderGenres": "Genres", - "HeaderCountries": "Countries", - "HeaderStatus": "Status", - "HeaderTracks": "Tracks", - "HeaderMusicArtist": "Music artist", - "HeaderLocked": "Locked", - "HeaderStudios": "Studios", - "HeaderActor": "Actors", - "HeaderComposer": "Composers", - "HeaderDirector": "Directors", - "HeaderGuestStar": "Guest star", - "HeaderProducer": "Producers", - "HeaderWriter": "Writers", - "HeaderParentalRatings": "Parental Ratings", - "HeaderCommunityRatings": "Community ratings", - "StartupEmbyServerIsLoading": "Emby Server is loading. Please try again shortly." -}
\ No newline at end of file diff --git a/Emby.Server.Implementations/Localization/Core/it.json b/Emby.Server.Implementations/Localization/Core/it.json index d2d697c3e..4ff0d98d8 100644 --- a/Emby.Server.Implementations/Localization/Core/it.json +++ b/Emby.Server.Implementations/Localization/Core/it.json @@ -1,178 +1,96 @@ { - "DbUpgradeMessage": "Please wait while your Emby Server database is upgraded. {0}% complete.", + "Latest": "Pi\u00f9 recenti", + "ValueSpecialEpisodeName": "Speciale - {0}", + "Inherit": "Eredita", + "Books": "Libri", + "Music": "Musica", + "Games": "Giochi", + "Photos": "Foto", + "MixedContent": "Contenuto misto", + "MusicVideos": "Video musicali", + "HomeVideos": "Video personali", + "Playlists": "Playlist", + "HeaderRecordingGroups": "Gruppi di Registrazione", + "HeaderContinueWatching": "Continua a guardare", + "HeaderFavoriteArtists": "Artisti preferiti", + "HeaderFavoriteSongs": "Brani Preferiti", + "HeaderAlbumArtists": "Artisti Album", + "HeaderFavoriteAlbums": "Album preferiti", + "HeaderFavoriteEpisodes": "Episodi Preferiti", + "HeaderFavoriteShows": "Show preferiti", + "HeaderNextUp": "Prossimo", + "Favorites": "Preferiti", + "Collections": "Collezioni", + "Channels": "Canali", + "Movies": "Film", + "Albums": "Album", + "Artists": "Artisti", + "Folders": "Cartelle", + "Songs": "Canzoni", + "TvShows": "TV Shows", + "Shows": "Programmi", + "Genres": "Generi", + "NameSeasonNumber": "Stagione {0}", "AppDeviceValues": "App: {0}, Dispositivo: {1}", "UserDownloadingItemWithValues": "{0} sta scaricando {1}", - "FolderTypeMixed": "contenuto misto", - "FolderTypeMovies": "Film", - "FolderTypeMusic": "Musica", - "FolderTypeAdultVideos": "Video per adulti", - "FolderTypePhotos": "Foto", - "FolderTypeMusicVideos": "Video musicali", - "FolderTypeHomeVideos": "Video personali", - "FolderTypeGames": "Giochi", - "FolderTypeBooks": "Libri", - "FolderTypeTvShows": "Tv", - "FolderTypeInherit": "ereditare", - "HeaderCastCrew": "Cast & Crew", - "HeaderPeople": "Persone", - "ValueSpecialEpisodeName": "Speciali - {0}", - "LabelChapterName": "Capitolo {0}", - "NameSeasonNumber": "Stagione {0}", - "LabelExit": "Esci", - "LabelVisitCommunity": "Visita la Community", - "LabelGithub": "Github", - "LabelApiDocumentation": "Documentazione Api", - "LabelDeveloperResources": "Risorse programmatori", - "LabelBrowseLibrary": "Esplora la libreria", - "LabelConfigureServer": "Configura Emby", - "LabelRestartServer": "Riavvia Server", - "CategorySync": "Sincronizza", - "CategoryUser": "Utente", - "CategorySystem": "Sistema", - "CategoryApplication": "Applicazione", - "CategoryPlugin": "Plugin", - "NotificationOptionPluginError": "Plugin fallito", + "HeaderLiveTV": "Diretta TV", + "ChapterNameValue": "Capitolo {0}", + "ScheduledTaskFailedWithName": "{0} fallito", + "LabelRunningTimeValue": "Durata: {0}", + "ScheduledTaskStartedWithName": "{0} avviati", + "VersionNumber": "Versione {0}", + "PluginInstalledWithName": "{0} \u00e8 stato Installato", + "StartupEmbyServerIsLoading": "Emby server si sta avviando. Per favore riprova pi\u00f9 tardi.", + "PluginUpdatedWithName": "{0} \u00e8 stato aggiornato", + "PluginUninstalledWithName": "{0} \u00e8 stato disinstallato", + "ItemAddedWithName": "{0} \u00e8 stato aggiunto alla libreria", + "ItemRemovedWithName": "{0} \u00e8 stato rimosso dalla libreria", + "LabelIpAddressValue": "Indirizzo IP: {0}", + "DeviceOnlineWithName": "{0} \u00e8 connesso", + "UserOnlineFromDevice": "{0} \u00e8 online da {1}", + "ProviderValue": "Provider: {0}", + "SubtitlesDownloadedForItem": "Sottotitoli scaricati per {0}", + "UserCreatedWithName": "L'utente {0} \u00e8 stato creato", + "UserPasswordChangedWithName": "La password \u00e8 stata cambiata per l'utente {0}", + "UserDeletedWithName": "L'utente {0} \u00e8 stato rimosso", + "UserConfigurationUpdatedWithName": "La configurazione utente \u00e8 stata aggiornata per {0}", + "MessageServerConfigurationUpdated": "La configurazione del server \u00e8 stata aggiornata", + "MessageNamedServerConfigurationUpdatedWithValue": "La sezione {0} della configurazione server \u00e8 stata aggiornata", + "MessageApplicationUpdated": "Il Server Emby \u00e8 stato aggiornato", + "FailedLoginAttemptWithUserName": "Tentativo di accesso fallito da {0}", + "AuthenticationSucceededWithUserName": "{0} autenticato con successo", + "UserOfflineFromDevice": "{0} \u00e8 stato disconnesso da {1}", + "DeviceOfflineWithName": "{0} \u00e8 stato disconnesso", + "UserStartedPlayingItemWithValues": "{0} ha avviato la riproduzione di {1}", + "UserStoppedPlayingItemWithValues": "{0} ha interrotto la riproduzione di {1}", + "NotificationOptionPluginError": "Errore del Plug-in", "NotificationOptionApplicationUpdateAvailable": "Aggiornamento dell'applicazione disponibile", "NotificationOptionApplicationUpdateInstalled": "Aggiornamento dell'applicazione installato", - "NotificationOptionPluginUpdateInstalled": "Aggiornamento del plugin installato", - "NotificationOptionPluginInstalled": "Plugin installato", - "NotificationOptionPluginUninstalled": "Plugin disinstallato", + "NotificationOptionPluginUpdateInstalled": "Aggiornamento del plug-in installato", + "NotificationOptionPluginInstalled": "Plug-in installato", + "NotificationOptionPluginUninstalled": "Plug-in disinstallato", "NotificationOptionVideoPlayback": "La riproduzione video \u00e8 iniziata", - "NotificationOptionAudioPlayback": "Riproduzione audio iniziata", - "NotificationOptionGamePlayback": "Gioco avviato", - "NotificationOptionVideoPlaybackStopped": "Riproduzione video interrotta", - "NotificationOptionAudioPlaybackStopped": "Audio Fermato", - "NotificationOptionGamePlaybackStopped": "Gioco Fermato", + "NotificationOptionAudioPlayback": "La riproduzione audio \u00e8 iniziata", + "NotificationOptionGamePlayback": "Il gioco \u00e8 stato avviato", + "NotificationOptionVideoPlaybackStopped": "La riproduzione video \u00e8 stata interrotta", + "NotificationOptionAudioPlaybackStopped": "La riproduzione audio \u00e8 stata interrotta", + "NotificationOptionGamePlaybackStopped": "Il gioco \u00e8 stato fermato", "NotificationOptionTaskFailed": "Operazione pianificata fallita", "NotificationOptionInstallationFailed": "Installazione fallita", "NotificationOptionNewLibraryContent": "Nuovo contenuto aggiunto", - "NotificationOptionNewLibraryContentMultiple": "Nuovi contenuti aggiunti (multipli)", "NotificationOptionCameraImageUploaded": "Immagine fotocamera caricata", "NotificationOptionUserLockedOut": "Utente bloccato", "NotificationOptionServerRestartRequired": "Riavvio del server necessario", - "ViewTypePlaylists": "Playlist", - "ViewTypeMovies": "Film", - "ViewTypeTvShows": "Serie Tv", - "ViewTypeGames": "Giochi", - "ViewTypeMusic": "Musica", - "ViewTypeMusicGenres": "Generi", - "ViewTypeMusicArtists": "Artisti", - "ViewTypeBoxSets": "Collezioni", - "ViewTypeChannels": "Canali", - "ViewTypeLiveTV": "TV in diretta", - "ViewTypeLiveTvNowPlaying": "Ora in onda", - "ViewTypeLatestGames": "Ultimi Giorchi", - "ViewTypeRecentlyPlayedGames": "Guardato di recente", - "ViewTypeGameFavorites": "Preferiti", - "ViewTypeGameSystems": "Configurazione gioco", - "ViewTypeGameGenres": "Generi", - "ViewTypeTvResume": "Riprendi", - "ViewTypeTvNextUp": "Prossimi", - "ViewTypeTvLatest": "Ultimi", - "ViewTypeTvShowSeries": "Serie", - "ViewTypeTvGenres": "Generi", - "ViewTypeTvFavoriteSeries": "Serie Preferite", - "ViewTypeTvFavoriteEpisodes": "Episodi Preferiti", - "ViewTypeMovieResume": "Riprendi", - "ViewTypeMovieLatest": "Ultimi", - "ViewTypeMovieMovies": "Film", - "ViewTypeMovieCollections": "Collezioni", - "ViewTypeMovieFavorites": "Preferiti", - "ViewTypeMovieGenres": "Generi", - "ViewTypeMusicLatest": "Ultimi", - "ViewTypeMusicPlaylists": "Playlist", - "ViewTypeMusicAlbums": "Album", - "ViewTypeMusicAlbumArtists": "Album Artisti", - "HeaderOtherDisplaySettings": "Impostazioni Video", - "ViewTypeMusicSongs": "Canzoni", - "ViewTypeMusicFavorites": "Preferiti", - "ViewTypeMusicFavoriteAlbums": "Album preferiti", - "ViewTypeMusicFavoriteArtists": "Artisti preferiti", - "ViewTypeMusicFavoriteSongs": "Canzoni Preferite", - "ViewTypeFolders": "Cartelle", - "ViewTypeLiveTvRecordingGroups": "Registrazioni", - "ViewTypeLiveTvChannels": "canali", - "ScheduledTaskFailedWithName": "{0} Falliti", - "LabelRunningTimeValue": "Durata: {0}", - "ScheduledTaskStartedWithName": "{0} Avviati", - "VersionNumber": "Versione {0}", - "PluginInstalledWithName": "{0} sono stati Installati", - "PluginUpdatedWithName": "{0} sono stati aggiornati", - "PluginUninstalledWithName": "{0} non sono stati installati", - "ItemAddedWithName": "{0} aggiunti alla libreria", - "ItemRemovedWithName": "{0} rimossi dalla libreria", - "LabelIpAddressValue": "Indirizzo IP: {0}", - "DeviceOnlineWithName": "{0} \u00e8 connesso", - "UserOnlineFromDevice": "{0} \u00e8 online da {1}", - "ProviderValue": "Provider: {0}", - "SubtitlesDownloadedForItem": "Sottotitoli scaricati per {0}", - "UserConfigurationUpdatedWithName": "Configurazione utente \u00e8 stata aggiornata per {0}", - "UserCreatedWithName": "Utente {0} \u00e8 stato creato", - "UserPasswordChangedWithName": "Password utente cambiata per {0}", - "UserDeletedWithName": "Utente {0} \u00e8 stato cancellato", - "MessageServerConfigurationUpdated": "Configurazione server aggioprnata", - "MessageNamedServerConfigurationUpdatedWithValue": "La sezione {0} \u00e8 stata aggiornata", - "MessageApplicationUpdated": "Il Server Emby \u00e8 stato aggiornato", - "FailedLoginAttemptWithUserName": "Login fallito da {0}", - "AuthenticationSucceededWithUserName": "{0} Autenticati con successo", - "DeviceOfflineWithName": "{0} \u00e8 stato disconesso", "UserLockedOutWithName": "L'utente {0} \u00e8 stato bloccato", - "UserOfflineFromDevice": "{0} \u00e8 stato disconesso da {1}", - "UserStartedPlayingItemWithValues": "{0} \u00e8 partito da {1}", - "UserStoppedPlayingItemWithValues": "{0} stoppato {1}", - "SubtitleDownloadFailureForItem": "Sottotitoli non scaricati per {0}", - "HeaderUnidentified": "Non identificata", - "HeaderImagePrimary": "Primaria", - "HeaderImageBackdrop": "Sfondo", - "HeaderImageLogo": "Logo", - "HeaderUserPrimaryImage": "Immagine utente", - "HeaderOverview": "Panoramica", - "HeaderShortOverview": "breve panoramica", - "HeaderType": "Tipo", - "HeaderSeverity": "gravit\u00e0", - "HeaderUser": "Utente", - "HeaderName": "Nome", - "HeaderDate": "Data", - "HeaderPremiereDate": "Data della prima", - "HeaderDateAdded": "Aggiunto il", - "HeaderReleaseDate": "Data Rilascio", - "HeaderRuntime": "Durata", - "HeaderPlayCount": "Visto N\u00b0", - "HeaderSeason": "Stagione", - "HeaderSeasonNumber": "Stagione Numero", - "HeaderSeries": "Serie:", - "HeaderNetwork": "Rete", - "HeaderYear": "Anno:", - "HeaderYears": "Anni", - "HeaderParentalRating": "Valutazione parentale", - "HeaderCommunityRating": "Voto Comunit\u00e0", - "HeaderTrailers": "Trailers", - "HeaderSpecials": "Speciali", - "HeaderGameSystems": "Sistemi di gioco", - "HeaderPlayers": "Giocatori", - "HeaderAlbumArtists": "Album Artisti", - "HeaderAlbums": "Album", - "HeaderDisc": "Disco", - "HeaderTrack": "Traccia", - "HeaderAudio": "Audio", - "HeaderVideo": "Video", - "HeaderEmbeddedImage": "Immagine incorporata", - "HeaderResolution": "Risoluzione", - "HeaderSubtitles": "Sottotitoli", - "HeaderGenres": "Generi", - "HeaderCountries": "Paesi", - "HeaderStatus": "Stato", - "HeaderTracks": "Traccia", - "HeaderMusicArtist": "Musica artisti", - "HeaderLocked": "Bloccato", - "HeaderStudios": "Studios", - "HeaderActor": "Attori", - "HeaderComposer": "Compositori", - "HeaderDirector": "Registi", - "HeaderGuestStar": "Personaggi famosi", - "HeaderProducer": "Produttori", - "HeaderWriter": "Sceneggiatori", - "HeaderParentalRatings": "Valutazioni genitori", - "HeaderCommunityRatings": "Valutazione Comunity", - "StartupEmbyServerIsLoading": "Emby server si sta avviando. Riprova tra un po" + "SubtitleDownloadFailureForItem": "Impossibile scaricare i sottotitoli per {0}", + "Sync": "Sincronizza", + "User": "Utente", + "System": "Sistema", + "Application": "Applicazione", + "Plugin": "Plug-in", + "LabelExit": "Esci", + "LabelVisitCommunity": "Visita il forum di discussione", + "LabelBrowseLibrary": "Esplora la libreria", + "LabelConfigureServer": "Configura Emby", + "LabelRestartServer": "Riavvia Server" }
\ No newline at end of file diff --git a/Emby.Server.Implementations/Localization/Core/kk.json b/Emby.Server.Implementations/Localization/Core/kk.json index 93252c30b..c24ee3d13 100644 --- a/Emby.Server.Implementations/Localization/Core/kk.json +++ b/Emby.Server.Implementations/Localization/Core/kk.json @@ -1,178 +1,96 @@ { - "DbUpgradeMessage": "Emby Server \u0434\u0435\u0440\u0435\u043a\u049b\u043e\u0440\u044b\u04a3\u044b\u0437\u0434\u044b\u04a3 \u0436\u0430\u04a3\u0493\u044b\u0440\u0442\u044b\u043b\u0443\u044b\u043d \u043a\u04af\u0442\u0435 \u0442\u04b1\u0440\u044b\u04a3\u044b\u0437. {0} % \u0430\u044f\u049b\u0442\u0430\u043b\u0434\u044b.", + "Latest": "\u0415\u04a3 \u043a\u0435\u0439\u0456\u043d\u0433\u0456", + "ValueSpecialEpisodeName": "\u0410\u0440\u043d\u0430\u0439\u044b - {0}", + "Inherit": "\u041c\u04b1\u0440\u0430\u0493\u0430 \u0438\u0435\u043b\u0435\u043d\u0443", + "Books": "\u041a\u0456\u0442\u0430\u043f\u0442\u0430\u0440", + "Music": "\u041c\u0443\u0437\u044b\u043a\u0430", + "Games": "\u041e\u0439\u044b\u043d\u0434\u0430\u0440", + "Photos": "\u0424\u043e\u0442\u043e\u0441\u0443\u0440\u0435\u0442\u0442\u0435\u0440", + "MixedContent": "\u0410\u0440\u0430\u043b\u0430\u0441 \u043c\u0430\u0437\u043c\u04b1\u043d", + "MusicVideos": "\u041c\u0443\u0437\u044b\u043a\u0430\u043b\u044b\u049b \u0431\u0435\u0439\u043d\u0435\u043b\u0435\u0440", + "HomeVideos": "\u04ae\u0439\u043b\u0456\u043a \u0431\u0435\u0439\u043d\u0435\u043b\u0435\u0440", + "Playlists": "\u041e\u0439\u043d\u0430\u0442\u0443 \u0442\u0456\u0437\u0456\u043c\u0434\u0435\u0440\u0456", + "HeaderRecordingGroups": "\u0416\u0430\u0437\u0431\u0430 \u0442\u043e\u043f\u0442\u0430\u0440\u044b", + "HeaderContinueWatching": "\u049a\u0430\u0440\u0430\u0443\u0434\u044b \u0436\u0430\u043b\u0493\u0430\u0441\u0442\u044b\u0440\u0443", + "HeaderFavoriteArtists": "\u0422\u0430\u04a3\u0434\u0430\u0443\u043b\u044b \u043e\u0440\u044b\u043d\u0434\u0430\u0443\u0448\u044b\u043b\u0430\u0440", + "HeaderFavoriteSongs": "\u0422\u0430\u04a3\u0434\u0430\u0443\u043b\u044b \u04d9\u0443\u0435\u043d\u0434\u0435\u0440", + "HeaderAlbumArtists": "\u0410\u043b\u044c\u0431\u043e\u043c \u043e\u0440\u044b\u043d\u0434\u0430\u0443\u0448\u044b\u043b\u0430\u0440\u044b", + "HeaderFavoriteAlbums": "\u0422\u0430\u04a3\u0434\u0430\u0443\u043b\u044b \u0430\u043b\u044c\u0431\u043e\u043c\u0434\u0430\u0440", + "HeaderFavoriteEpisodes": "\u0422\u0430\u04a3\u0434\u0430\u0443\u043b\u044b \u0431\u04e9\u043b\u0456\u043c\u0434\u0435\u0440", + "HeaderFavoriteShows": "\u0422\u0430\u04a3\u0434\u0430\u0443\u043b\u044b \u043a\u04e9\u0440\u0441\u0435\u0442\u0456\u043c\u0434\u0435\u0440", + "HeaderNextUp": "\u041a\u0435\u0437\u0435\u043a\u0442\u0456", + "Favorites": "\u0422\u0430\u04a3\u0434\u0430\u0443\u043b\u044b\u043b\u0430\u0440", + "Collections": "\u0416\u0438\u044b\u043d\u0442\u044b\u049b\u0442\u0430\u0440", + "Channels": "\u0410\u0440\u043d\u0430\u043b\u0430\u0440", + "Movies": "\u0424\u0438\u043b\u044c\u043c\u0434\u0435\u0440", + "Albums": "\u0410\u043b\u044c\u0431\u043e\u043c\u0434\u0430\u0440", + "Artists": "\u041e\u0440\u044b\u043d\u0434\u0430\u0443\u0448\u044b\u043b\u0430\u0440", + "Folders": "\u049a\u0430\u043b\u0442\u0430\u043b\u0430\u0440", + "Songs": "\u04d8\u0443\u0435\u043d\u0434\u0435\u0440", + "TvShows": "\u0422\u0414-\u043a\u04e9\u0440\u0441\u0435\u0442\u0456\u043c\u0434\u0435\u0440", + "Shows": "\u041a\u04e9\u0440\u0441\u0435\u0442\u0456\u043c\u0434\u0435\u0440", + "Genres": "\u0416\u0430\u043d\u0440\u043b\u0430\u0440", + "NameSeasonNumber": "{0}-\u043c\u0430\u0443\u0441\u044b\u043c", "AppDeviceValues": "\u049a\u043e\u043b\u0434\u0430\u043d\u0431\u0430: {0}, \u049a\u04b1\u0440\u044b\u043b\u0493\u044b: {1}", "UserDownloadingItemWithValues": "{0} \u043c\u044b\u043d\u0430\u043d\u044b \u0436\u04af\u043a\u0442\u0435\u043f \u0430\u043b\u0443\u0434\u0430: {1}", - "FolderTypeMixed": "\u0410\u0440\u0430\u043b\u0430\u0441 \u043c\u0430\u0437\u043c\u04b1\u043d", - "FolderTypeMovies": "\u041a\u0438\u043d\u043e", - "FolderTypeMusic": "\u041c\u0443\u0437\u044b\u043a\u0430", - "FolderTypeAdultVideos": "\u0415\u0440\u0435\u0441\u0435\u043a\u0442\u0456\u043a \u0431\u0435\u0439\u043d\u0435\u043b\u0435\u0440", - "FolderTypePhotos": "\u0424\u043e\u0442\u043e\u0441\u0443\u0440\u0435\u0442\u0442\u0435\u0440", - "FolderTypeMusicVideos": "\u041c\u0443\u0437\u044b\u043a\u0430\u043b\u044b\u049b \u0431\u0435\u0439\u043d\u0435\u043b\u0435\u0440", - "FolderTypeHomeVideos": "\u04ae\u0439 \u0431\u0435\u0439\u043d\u0435\u043b\u0435\u0440\u0456", - "FolderTypeGames": "\u041e\u0439\u044b\u043d\u0434\u0430\u0440", - "FolderTypeBooks": "\u041a\u0456\u0442\u0430\u043f\u0442\u0430\u0440", - "FolderTypeTvShows": "\u0422\u0414", - "FolderTypeInherit": "\u041c\u04b1\u0440\u0430\u0493\u0430 \u0438\u0435\u043b\u0435\u043d\u0443", - "HeaderCastCrew": "\u0421\u043e\u043c\u0434\u0430\u0443\u0448\u044b\u043b\u0430\u0440 \u043c\u0435\u043d \u0442\u04af\u0441\u0456\u0440\u0443\u0448\u0456\u043b\u0435\u0440", - "HeaderPeople": "\u0410\u0434\u0430\u043c\u0434\u0430\u0440", - "ValueSpecialEpisodeName": "\u0410\u0440\u043d\u0430\u0439\u044b - {0}", - "LabelChapterName": "{0}-\u0441\u0430\u0445\u043d\u0430", - "NameSeasonNumber": "{0}-\u0441\u0435\u0437\u043e\u043d", - "LabelExit": "\u0428\u044b\u0493\u0443", - "LabelVisitCommunity": "\u049a\u0430\u0443\u044b\u043c\u0434\u0430\u0441\u0442\u044b\u049b\u049b\u0430 \u0431\u0430\u0440\u0443", - "LabelGithub": "GitHub \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439\u0456", - "LabelApiDocumentation": "API \u049b\u04b1\u0436\u0430\u0442\u0442\u0430\u043c\u0430\u0441\u044b", - "LabelDeveloperResources": "\u0416\u0430\u0441\u0430\u049b\u0442\u0430\u0443\u0448\u044b \u043a\u04e9\u0437\u0434\u0435\u0440\u0456", - "LabelBrowseLibrary": "\u0422\u0430\u0441\u044b\u0493\u044b\u0448\u0445\u0430\u043d\u0430\u043d\u044b \u0448\u043e\u043b\u0443", - "LabelConfigureServer": "Emby \u0442\u0435\u04a3\u0448\u0435\u0443", - "LabelRestartServer": "\u0421\u0435\u0440\u0432\u0435\u0440\u0434\u0456 \u049b\u0430\u0439\u0442\u0430 \u0456\u0441\u043a\u0435 \u049b\u043e\u0441\u0443", - "CategorySync": "\u04ae\u043d\u0434\u0435\u0441\u0442\u0456\u0440\u0443", - "CategoryUser": "\u041f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0448\u044b", - "CategorySystem": "\u0416\u04af\u0439\u0435", - "CategoryApplication": "\u049a\u043e\u043b\u0434\u0430\u043d\u0431\u0430", - "CategoryPlugin": "\u041f\u043b\u0430\u0433\u0438\u043d", - "NotificationOptionPluginError": "\u041f\u043b\u0430\u0433\u0438\u043d \u0441\u04d9\u0442\u0441\u0456\u0437\u0434\u0456\u0433\u0456", - "NotificationOptionApplicationUpdateAvailable": "\u049a\u043e\u043b\u0434\u0430\u043d\u0431\u0430 \u0436\u0430\u04a3\u0430\u0440\u0442\u0443\u044b \u049b\u043e\u043b \u0436\u0435\u0442\u0456\u043c\u0434\u0456", - "NotificationOptionApplicationUpdateInstalled": "\u049a\u043e\u043b\u0434\u0430\u043d\u0431\u0430 \u0436\u0430\u04a3\u0430\u0440\u0442\u0443\u044b \u043e\u0440\u043d\u0430\u0442\u044b\u043b\u0434\u044b", - "NotificationOptionPluginUpdateInstalled": "\u041f\u043b\u0430\u0433\u0438\u043d \u0436\u0430\u04a3\u0430\u0440\u0442\u0443\u044b \u043e\u0440\u043d\u0430\u0442\u044b\u043b\u0434\u044b", - "NotificationOptionPluginInstalled": "\u041f\u043b\u0430\u0433\u0438\u043d \u043e\u0440\u043d\u0430\u0442\u044b\u043b\u0434\u044b", - "NotificationOptionPluginUninstalled": "\u041f\u043b\u0430\u0433\u0438\u043d \u043e\u0440\u043d\u0430\u0442\u0443\u044b \u0431\u043e\u043b\u0434\u044b\u0440\u044b\u043b\u043c\u0430\u0434\u044b", - "NotificationOptionVideoPlayback": "\u0411\u0435\u0439\u043d\u0435 \u043e\u0439\u043d\u0430\u0442\u0443\u044b \u0431\u0430\u0441\u0442\u0430\u043b\u0434\u044b", - "NotificationOptionAudioPlayback": "\u0414\u044b\u0431\u044b\u0441 \u043e\u0439\u043d\u0430\u0442\u0443\u044b \u0431\u0430\u0441\u0442\u0430\u043b\u0434\u044b", - "NotificationOptionGamePlayback": "\u041e\u0439\u044b\u043d \u043e\u0439\u043d\u0430\u0442\u0443\u044b \u0431\u0430\u0441\u0442\u0430\u043b\u0434\u044b", - "NotificationOptionVideoPlaybackStopped": "\u0411\u0435\u0439\u043d\u0435 \u043e\u0439\u043d\u0430\u0442\u0443\u044b \u0442\u043e\u049b\u0442\u0430\u0442\u044b\u043b\u0434\u044b", - "NotificationOptionAudioPlaybackStopped": "\u0414\u044b\u0431\u044b\u0441 \u043e\u0439\u043d\u0430\u0442\u0443\u044b \u0442\u043e\u049b\u0442\u0430\u0442\u044b\u043b\u0434\u044b", - "NotificationOptionGamePlaybackStopped": "\u041e\u0439\u044b\u043d \u043e\u0439\u043d\u0430\u0442\u0443\u044b \u0442\u043e\u049b\u0442\u0430\u0442\u044b\u043b\u0434\u044b", - "NotificationOptionTaskFailed": "\u0416\u043e\u0441\u043f\u0430\u0440\u043b\u0430\u0493\u0430\u043d \u0442\u0430\u043f\u0441\u044b\u0440\u043c\u0430 \u0441\u04d9\u0442\u0441\u0456\u0437\u0434\u0456\u0433\u0456", - "NotificationOptionInstallationFailed": "\u041e\u0440\u043d\u0430\u0442\u0443 \u0441\u04d9\u0442\u0441\u0456\u0437\u0434\u0456\u0433\u0456", - "NotificationOptionNewLibraryContent": "\u0416\u0430\u04a3\u0430 \u043c\u0430\u0437\u043c\u04b1\u043d \u04af\u0441\u0442\u0435\u043b\u0433\u0435\u043d", - "NotificationOptionNewLibraryContentMultiple": "\u0416\u0430\u04a3\u0430 \u043c\u0430\u0437\u043c\u04b1\u043d \u049b\u043e\u0441\u044b\u043b\u0434\u044b (\u043a\u04e9\u043f\u0442\u0435\u0433\u0435\u043d)", - "NotificationOptionCameraImageUploaded": "\u041a\u0430\u043c\u0435\u0440\u0430\u0434\u0430\u043d \u0444\u043e\u0442\u043e\u0441\u0443\u0440\u0435\u0442 \u043a\u0435\u0440\u0456 \u049b\u043e\u0442\u0430\u0440\u044b\u043b\u0493\u0430\u043d", - "NotificationOptionUserLockedOut": "\u041f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0448\u044b \u049b\u04b1\u0440\u0441\u0430\u0443\u043b\u044b", - "NotificationOptionServerRestartRequired": "\u0421\u0435\u0440\u0432\u0435\u0440\u0434\u0456 \u049b\u0430\u0439\u0442\u0430 \u0456\u0441\u043a\u0435 \u049b\u043e\u0441\u0443 \u049b\u0430\u0436\u0435\u0442", - "ViewTypePlaylists": "\u041e\u0439\u043d\u0430\u0442\u0443 \u0442\u0456\u0437\u0456\u043c\u0434\u0435\u0440\u0456", - "ViewTypeMovies": "\u041a\u0438\u043d\u043e", - "ViewTypeTvShows": "\u0422\u0414", - "ViewTypeGames": "\u041e\u0439\u044b\u043d\u0434\u0430\u0440", - "ViewTypeMusic": "\u041c\u0443\u0437\u044b\u043a\u0430", - "ViewTypeMusicGenres": "\u0416\u0430\u043d\u0440\u043b\u0430\u0440", - "ViewTypeMusicArtists": "\u041e\u0440\u044b\u043d\u0434\u0430\u0443\u0448\u044b\u043b\u0430\u0440", - "ViewTypeBoxSets": "\u0416\u0438\u044b\u043d\u0442\u044b\u049b\u0442\u0430\u0440", - "ViewTypeChannels": "\u0410\u0440\u043d\u0430\u043b\u0430\u0440", - "ViewTypeLiveTV": "\u042d\u0444\u0438\u0440\u043b\u0456\u043a \u0422\u0414", - "ViewTypeLiveTvNowPlaying": "\u042d\u0444\u0438\u0440\u0434\u0435", - "ViewTypeLatestGames": "\u0415\u04a3 \u043a\u0435\u0439\u0456\u043d\u0433\u0456 \u043e\u0439\u044b\u043d\u0434\u0430\u0440", - "ViewTypeRecentlyPlayedGames": "\u0416\u0430\u049b\u044b\u043d\u0434\u0430 \u043e\u0439\u043d\u0430\u0442\u044b\u043b\u0493\u0430\u043d\u0434\u0430\u0440", - "ViewTypeGameFavorites": "\u0422\u0430\u04a3\u0434\u0430\u0443\u043b\u044b\u043b\u0430\u0440", - "ViewTypeGameSystems": "\u041e\u0439\u044b\u043d \u0436\u04af\u0439\u0435\u043b\u0435\u0440\u0456", - "ViewTypeGameGenres": "\u0416\u0430\u043d\u0440\u043b\u0430\u0440", - "ViewTypeTvResume": "\u0416\u0430\u043b\u0493\u0430\u0441\u0442\u044b\u0440\u043c\u0430\u043b\u044b", - "ViewTypeTvNextUp": "\u041a\u0435\u0437\u0435\u043a\u0442\u0456", - "ViewTypeTvLatest": "\u0415\u04a3 \u043a\u0435\u0439\u0456\u043d\u0433\u0456", - "ViewTypeTvShowSeries": "\u0422\u0435\u043b\u0435\u0445\u0438\u043a\u0430\u044f\u043b\u0430\u0440", - "ViewTypeTvGenres": "\u0416\u0430\u043d\u0440\u043b\u0430\u0440", - "ViewTypeTvFavoriteSeries": "\u0422\u0430\u04a3\u0434\u0430\u0443\u043b\u044b \u0442\u0435\u043b\u0435\u0445\u0438\u043a\u0430\u044f\u043b\u0430\u0440", - "ViewTypeTvFavoriteEpisodes": "\u0422\u0430\u04a3\u0434\u0430\u0443\u043b\u044b \u0431\u04e9\u043b\u0456\u043c\u0434\u0435\u0440", - "ViewTypeMovieResume": "\u0416\u0430\u043b\u0493\u0430\u0441\u0442\u044b\u0440\u043c\u0430\u043b\u044b", - "ViewTypeMovieLatest": "\u0415\u04a3 \u043a\u0435\u0439\u0456\u043d\u0433\u0456", - "ViewTypeMovieMovies": "\u0424\u0438\u043b\u044c\u043c\u0434\u0435\u0440", - "ViewTypeMovieCollections": "\u0416\u0438\u044b\u043d\u0442\u044b\u049b\u0442\u0430\u0440", - "ViewTypeMovieFavorites": "\u0422\u0430\u04a3\u0434\u0430\u0443\u043b\u044b\u043b\u0430\u0440", - "ViewTypeMovieGenres": "\u0416\u0430\u043d\u0440\u043b\u0430\u0440", - "ViewTypeMusicLatest": "\u0415\u04a3 \u043a\u0435\u0439\u0456\u043d\u0433\u0456", - "ViewTypeMusicPlaylists": "\u041e\u0439\u043d\u0430\u0442\u0443 \u0442\u0456\u0437\u0456\u043c\u0434\u0435\u0440\u0456", - "ViewTypeMusicAlbums": "\u0410\u043b\u044c\u0431\u043e\u043c\u0434\u0430\u0440", - "ViewTypeMusicAlbumArtists": "\u0410\u043b\u044c\u0431\u043e\u043c \u043e\u0440\u044b\u043d\u0434\u0430\u0443\u0448\u044b\u043b\u0430\u0440\u044b", - "HeaderOtherDisplaySettings": "\u0411\u0435\u0439\u043d\u0435\u043b\u0435\u0443 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043b\u0435\u0440\u0456", - "ViewTypeMusicSongs": "\u04d8\u0443\u0435\u043d\u0434\u0435\u0440", - "ViewTypeMusicFavorites": "\u0422\u0430\u04a3\u0434\u0430\u0443\u043b\u044b\u043b\u0430\u0440", - "ViewTypeMusicFavoriteAlbums": "\u0422\u0430\u04a3\u0434\u0430\u0443\u043b\u044b \u0430\u043b\u044c\u0431\u043e\u043c\u0434\u0430\u0440", - "ViewTypeMusicFavoriteArtists": "\u0422\u0430\u04a3\u0434\u0430\u0443\u043b\u044b \u043e\u0440\u044b\u043d\u0434\u0430\u0443\u0448\u044b\u043b\u0430\u0440", - "ViewTypeMusicFavoriteSongs": "\u0422\u0430\u04a3\u0434\u0430\u0443\u043b\u044b \u04d9\u0443\u0435\u043d\u0434\u0435\u0440", - "ViewTypeFolders": "\u049a\u0430\u043b\u0442\u0430\u043b\u0430\u0440", - "ViewTypeLiveTvRecordingGroups": "\u0416\u0430\u0437\u0431\u0430\u043b\u0430\u0440", - "ViewTypeLiveTvChannels": "\u0410\u0440\u043d\u0430\u043b\u0430\u0440", + "HeaderLiveTV": "\u042d\u0444\u0438\u0440", + "ChapterNameValue": "{0}-\u0441\u0430\u0445\u043d\u0430", "ScheduledTaskFailedWithName": "{0} \u0441\u04d9\u0442\u0441\u0456\u0437", "LabelRunningTimeValue": "\u0406\u0441\u043a\u0435 \u049b\u043e\u0441\u044b\u043b\u0443 \u0443\u0430\u049b\u044b\u0442\u044b: {0}", "ScheduledTaskStartedWithName": "{0} \u0456\u0441\u043a\u0435 \u049b\u043e\u0441\u044b\u043b\u0434\u044b", "VersionNumber": "\u041d\u04b1\u0441\u049b\u0430\u0441\u044b: {0}", "PluginInstalledWithName": "{0} \u043e\u0440\u043d\u0430\u0442\u044b\u043b\u0434\u044b", + "StartupEmbyServerIsLoading": "Emby Server \u0436\u04af\u043a\u0442\u0435\u043b\u0443\u0434\u0435. \u04d8\u0440\u0435\u043a\u0435\u0442\u0442\u0456 \u043a\u04e9\u043f \u04b1\u0437\u0430\u043c\u0430\u0439 \u049b\u0430\u0439\u0442\u0430\u043b\u0430\u04a3\u044b\u0437.", "PluginUpdatedWithName": "{0} \u0436\u0430\u04a3\u0430\u0440\u0442\u044b\u043b\u0434\u044b", "PluginUninstalledWithName": "{0} \u0436\u043e\u0439\u044b\u043b\u0434\u044b", - "ItemAddedWithName": "{0} (\u0442\u0430\u0441\u044b\u0493\u044b\u0448\u0445\u0430\u043d\u0430\u0493\u0430 \u04af\u0441\u0442\u0435\u043b\u0456\u043d\u0434\u0456)", - "ItemRemovedWithName": "{0} (\u0442\u0430\u0441\u044b\u0493\u044b\u0448\u0445\u0430\u043d\u0430\u0434\u0430\u043d \u0430\u043b\u0430\u0441\u0442\u0430\u043b\u0434\u044b)", - "LabelIpAddressValue": "IP \u043c\u0435\u043a\u0435\u043d\u0436\u0430\u0439\u044b: {0}", + "ItemAddedWithName": "{0} \u0442\u0430\u0441\u044b\u0493\u044b\u0448\u0445\u0430\u043d\u0430\u0493\u0430 \u04af\u0441\u0442\u0435\u043b\u0456\u043d\u0434\u0456", + "ItemRemovedWithName": "{0} \u0442\u0430\u0441\u044b\u0493\u044b\u0448\u0445\u0430\u043d\u0430\u0434\u0430\u043d \u0430\u043b\u0430\u0441\u0442\u0430\u043b\u0434\u044b", + "LabelIpAddressValue": "IP-\u043c\u0435\u043a\u0435\u043d\u0436\u0430\u0439\u044b: {0}", "DeviceOnlineWithName": "{0} \u049b\u043e\u0441\u044b\u043b\u0493\u0430\u043d", "UserOnlineFromDevice": "{0} - {1} \u0430\u0440\u049b\u044b\u043b\u044b \u049b\u043e\u0441\u044b\u043b\u0493\u0430\u043d", "ProviderValue": "\u0416\u0435\u0442\u043a\u0456\u0437\u0443\u0448\u0456: {0}", - "SubtitlesDownloadedForItem": "\u0421\u0443\u0431\u0442\u0438\u0442\u0440\u043b\u0435\u0440 {0} \u04af\u0448\u0456\u043d \u0436\u04af\u043a\u0442\u0435\u043b\u0456\u043f \u0430\u043b\u044b\u043d\u0434\u044b", - "UserConfigurationUpdatedWithName": "\u041f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0448\u044b {0} \u04af\u0448\u0456\u043d \u0442\u0435\u04a3\u0448\u0435\u043b\u0456\u043c \u0436\u0430\u04a3\u0430\u0440\u0442\u044b\u043b\u0434\u044b", + "SubtitlesDownloadedForItem": "{0} \u04af\u0448\u0456\u043d \u0441\u0443\u0431\u0442\u0438\u0442\u0440\u043b\u0435\u0440 \u0436\u04af\u043a\u0442\u0435\u043b\u0456\u043f \u0430\u043b\u044b\u043d\u0434\u044b", "UserCreatedWithName": "\u041f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0448\u044b {0} \u0436\u0430\u0441\u0430\u043b\u0493\u0430\u043d", "UserPasswordChangedWithName": "\u041f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0448\u044b {0} \u04af\u0448\u0456\u043d \u049b\u04b1\u043f\u0438\u044f \u0441\u04e9\u0437 \u04e9\u0437\u0433\u0435\u0440\u0442\u0456\u043b\u0434\u0456", "UserDeletedWithName": "\u041f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0448\u044b {0} \u0436\u043e\u0439\u044b\u043b\u0493\u0430\u043d", + "UserConfigurationUpdatedWithName": "\u041f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0448\u044b {0} \u04af\u0448\u0456\u043d \u0442\u0435\u04a3\u0448\u0435\u043b\u0456\u043c \u0436\u0430\u04a3\u0430\u0440\u0442\u044b\u043b\u0434\u044b", "MessageServerConfigurationUpdated": "\u0421\u0435\u0440\u0432\u0435\u0440 \u0442\u0435\u04a3\u0448\u0435\u043b\u0456\u043c\u0456 \u0436\u0430\u04a3\u0430\u0440\u0442\u044b\u043b\u0434\u044b", "MessageNamedServerConfigurationUpdatedWithValue": "\u0421\u0435\u0440\u0432\u0435\u0440 \u0442\u0435\u04a3\u0448\u0435\u043b\u0456\u043c\u0456 ({0} \u0431\u04e9\u043b\u0456\u043c\u0456) \u0436\u0430\u04a3\u0430\u0440\u0442\u044b\u043b\u0434\u044b", "MessageApplicationUpdated": "Emby Server \u0436\u0430\u04a3\u0430\u0440\u0442\u044b\u043b\u0434\u044b.", - "FailedLoginAttemptWithUserName": "{0} \u043a\u0456\u0440\u0443 \u04d9\u0440\u0435\u043a\u0435\u0442\u0456 \u0441\u04d9\u0442\u0441\u0456\u0437", + "FailedLoginAttemptWithUserName": "{0} \u0442\u0430\u0440\u0430\u043f\u044b\u043d\u0430\u043d \u043a\u0456\u0440\u0443 \u04d9\u0440\u0435\u043a\u0435\u0442\u0456 \u0441\u04d9\u0442\u0441\u0456\u0437", "AuthenticationSucceededWithUserName": "{0} \u0442\u04af\u043f\u043d\u04b1\u0441\u049b\u0430\u043b\u044b\u0493\u044b\u043d \u0440\u0430\u0441\u0442\u0430\u043b\u0443\u044b \u0441\u04d9\u0442\u0442\u0456", + "UserOfflineFromDevice": "{0} - {1} \u0442\u0430\u0440\u0430\u043f\u044b\u043d\u0430\u043d \u0430\u0436\u044b\u0440\u0430\u0442\u044b\u043b\u0493\u0430\u043d", "DeviceOfflineWithName": "{0} \u0430\u0436\u044b\u0440\u0430\u0442\u044b\u043b\u0493\u0430\u043d", - "UserLockedOutWithName": "\u041f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0448\u044b {0} \u049b\u04b1\u0440\u0441\u0430\u0443\u043b\u044b", - "UserOfflineFromDevice": "{0} - {1} \u0430\u0440\u049b\u044b\u043b\u044b \u0430\u0436\u044b\u0440\u0430\u0442\u044b\u043b\u0493\u0430\u043d", "UserStartedPlayingItemWithValues": "{0} - {1} \u043e\u0439\u043d\u0430\u0442\u0443\u044b\u043d \u0431\u0430\u0441\u0442\u0430\u0434\u044b", "UserStoppedPlayingItemWithValues": "{0} - {1} \u043e\u0439\u043d\u0430\u0442\u0443\u044b\u043d \u0442\u043e\u049b\u0442\u0430\u0442\u0442\u044b", + "NotificationOptionPluginError": "\u041f\u043b\u0430\u0433\u0438\u043d \u0441\u04d9\u0442\u0441\u0456\u0437\u0434\u0456\u0433\u0456", + "NotificationOptionApplicationUpdateAvailable": "\u049a\u043e\u043b\u0434\u0430\u043d\u0431\u0430 \u0436\u0430\u04a3\u0430\u0440\u0442\u0443\u044b \u049b\u043e\u043b\u0436\u0435\u0442\u0456\u043c\u0434\u0456", + "NotificationOptionApplicationUpdateInstalled": "\u049a\u043e\u043b\u0434\u0430\u043d\u0431\u0430 \u0436\u0430\u04a3\u0430\u0440\u0442\u0443\u044b \u043e\u0440\u043d\u0430\u0442\u044b\u043b\u0434\u044b", + "NotificationOptionPluginUpdateInstalled": "\u041f\u043b\u0430\u0433\u0438\u043d \u0436\u0430\u04a3\u0430\u0440\u0442\u0443\u044b \u043e\u0440\u043d\u0430\u0442\u044b\u043b\u0434\u044b", + "NotificationOptionPluginInstalled": "\u041f\u043b\u0430\u0433\u0438\u043d \u043e\u0440\u043d\u0430\u0442\u044b\u043b\u0434\u044b", + "NotificationOptionPluginUninstalled": "\u041f\u043b\u0430\u0433\u0438\u043d \u043e\u0440\u043d\u0430\u0442\u0443\u044b \u0431\u043e\u043b\u0434\u044b\u0440\u044b\u043b\u043c\u0430\u0434\u044b", + "NotificationOptionVideoPlayback": "\u0411\u0435\u0439\u043d\u0435 \u043e\u0439\u043d\u0430\u0442\u0443\u044b \u0431\u0430\u0441\u0442\u0430\u043b\u0434\u044b", + "NotificationOptionAudioPlayback": "\u0414\u044b\u0431\u044b\u0441 \u043e\u0439\u043d\u0430\u0442\u0443\u044b \u0431\u0430\u0441\u0442\u0430\u043b\u0434\u044b", + "NotificationOptionGamePlayback": "\u041e\u0439\u044b\u043d \u043e\u0439\u043d\u0430\u0442\u0443\u044b \u0431\u0430\u0441\u0442\u0430\u043b\u0434\u044b", + "NotificationOptionVideoPlaybackStopped": "\u0411\u0435\u0439\u043d\u0435 \u043e\u0439\u043d\u0430\u0442\u0443\u044b \u0442\u043e\u049b\u0442\u0430\u0442\u044b\u043b\u0434\u044b", + "NotificationOptionAudioPlaybackStopped": "\u0414\u044b\u0431\u044b\u0441 \u043e\u0439\u043d\u0430\u0442\u0443\u044b \u0442\u043e\u049b\u0442\u0430\u0442\u044b\u043b\u0434\u044b", + "NotificationOptionGamePlaybackStopped": "\u041e\u0439\u044b\u043d \u043e\u0439\u043d\u0430\u0442\u0443\u044b \u0442\u043e\u049b\u0442\u0430\u0442\u044b\u043b\u0434\u044b", + "NotificationOptionTaskFailed": "\u0416\u043e\u0441\u043f\u0430\u0440\u043b\u0430\u0493\u0430\u043d \u0442\u0430\u043f\u0441\u044b\u0440\u043c\u0430 \u0441\u04d9\u0442\u0441\u0456\u0437\u0434\u0456\u0433\u0456", + "NotificationOptionInstallationFailed": "\u041e\u0440\u043d\u0430\u0442\u0443 \u0441\u04d9\u0442\u0441\u0456\u0437\u0434\u0456\u0433\u0456", + "NotificationOptionNewLibraryContent": "\u0416\u0430\u04a3\u0430 \u043c\u0430\u0437\u043c\u04b1\u043d \u04af\u0441\u0442\u0435\u043b\u0433\u0435\u043d", + "NotificationOptionCameraImageUploaded": "\u041a\u0430\u043c\u0435\u0440\u0430\u0434\u0430\u043d \u0444\u043e\u0442\u043e\u0441\u0443\u0440\u0435\u0442 \u043a\u0435\u0440\u0456 \u049b\u043e\u0442\u0430\u0440\u044b\u043b\u0493\u0430\u043d", + "NotificationOptionUserLockedOut": "\u041f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0448\u044b \u049b\u04b1\u0440\u0441\u0430\u0443\u043b\u044b", + "NotificationOptionServerRestartRequired": "\u0421\u0435\u0440\u0432\u0435\u0440\u0434\u0456 \u049b\u0430\u0439\u0442\u0430 \u0456\u0441\u043a\u0435 \u049b\u043e\u0441\u0443 \u049b\u0430\u0436\u0435\u0442", + "UserLockedOutWithName": "\u041f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0448\u044b {0} \u049b\u04b1\u0440\u0441\u0430\u0443\u043b\u044b", "SubtitleDownloadFailureForItem": "\u0421\u0443\u0431\u0442\u0438\u0442\u0440\u043b\u0435\u0440 {0} \u04af\u0448\u0456\u043d \u0436\u04af\u043a\u0442\u0435\u043b\u0456\u043f \u0430\u043b\u044b\u043d\u0443\u044b \u0441\u04d9\u0442\u0441\u0456\u0437", - "HeaderUnidentified": "\u0410\u043d\u044b\u049b\u0442\u0430\u043b\u043c\u0430\u0493\u0430\u043d", - "HeaderImagePrimary": "\u041d\u0435\u0433\u0456\u0437\u0433\u0456", - "HeaderImageBackdrop": "\u0410\u0440\u0442\u049b\u044b \u0441\u0443\u0440\u0435\u0442", - "HeaderImageLogo": "\u041b\u043e\u0433\u043e\u0442\u0438\u043f", - "HeaderUserPrimaryImage": "\u041f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0448\u044b \u0441\u0443\u0440\u0435\u0442\u0456", - "HeaderOverview": "\u0416\u0430\u043b\u043f\u044b \u0448\u043e\u043b\u0443", - "HeaderShortOverview": "\u049a\u044b\u0441\u049b\u0430\u0448\u0430 \u0448\u043e\u043b\u0443", - "HeaderType": "\u0422\u04af\u0440\u0456", - "HeaderSeverity": "\u049a\u0438\u044b\u043d\u0434\u044b\u0493\u044b", - "HeaderUser": "\u041f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0448\u044b", - "HeaderName": "\u0410\u0442\u044b", - "HeaderDate": "\u041a\u04af\u043d\u0456", - "HeaderPremiereDate": "\u0422\u04b1\u0441\u0430\u0443\u043a\u0435\u0441\u0435\u0440 \u043a\u04af\u043d\u0456", - "HeaderDateAdded": "\u04ae\u0441\u0442\u0435\u043b\u0433\u0435\u043d \u043a\u04af\u043d\u0456", - "HeaderReleaseDate": "\u0428\u044b\u0493\u0430\u0440\u0443 \u043a\u04af\u043d\u0456", - "HeaderRuntime": "\u04b0\u0437\u0430\u049b\u0442\u044b\u0493\u044b", - "HeaderPlayCount": "\u041e\u0439\u043d\u0430\u0442\u0443 \u0435\u0441\u0435\u0431\u0456", - "HeaderSeason": "\u041c\u0430\u0443\u0441\u044b\u043c", - "HeaderSeasonNumber": "\u041c\u0430\u0443\u0441\u044b\u043c \u043d\u04e9\u043c\u0456\u0440\u0456", - "HeaderSeries": "\u0422\u0435\u043b\u0435\u0445\u0438\u043a\u0430\u044f\u043b\u0430\u0440", - "HeaderNetwork": "\u0422\u0435\u043b\u0435\u0436\u0435\u043b\u0456", - "HeaderYear": "\u0416\u044b\u043b:", - "HeaderYears": "\u0416\u044b\u043b\u0434\u0430\u0440:", - "HeaderParentalRating": "\u0416\u0430\u0441\u0442\u0430\u0441 \u0441\u0430\u043d\u0430\u0442\u044b", - "HeaderCommunityRating": "\u049a\u0430\u0443\u044b\u043c \u0431\u0430\u0493\u0430\u043b\u0430\u0443\u044b", - "HeaderTrailers": "\u0422\u0440\u0435\u0439\u043b\u0435\u0440\u043b\u0435\u0440", - "HeaderSpecials": "\u0410\u0440\u043d\u0430\u0439\u044b \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0434\u0430\u0440", - "HeaderGameSystems": "\u041e\u0439\u044b\u043d \u0436\u04af\u0439\u0435\u043b\u0435\u0440\u0456", - "HeaderPlayers": "\u041e\u0439\u044b\u043d\u0448\u044b\u043b\u0430\u0440:", - "HeaderAlbumArtists": "\u0410\u043b\u044c\u0431\u043e\u043c \u043e\u0440\u044b\u043d\u0434\u0430\u0443\u0448\u044b\u043b\u0430\u0440\u044b", - "HeaderAlbums": "\u0410\u043b\u044c\u0431\u043e\u043c\u0434\u0430\u0440", - "HeaderDisc": "\u0414\u0438\u0441\u043a\u0456", - "HeaderTrack": "\u0416\u043e\u043b\u0448\u044b\u049b", - "HeaderAudio": "\u0414\u044b\u0431\u044b\u0441", - "HeaderVideo": "\u0411\u0435\u0439\u043d\u0435", - "HeaderEmbeddedImage": "\u0415\u043d\u0434\u0456\u0440\u0456\u043b\u0433\u0435\u043d \u0441\u0443\u0440\u0435\u0442", - "HeaderResolution": "\u0410\u0436\u044b\u0440\u0430\u0442\u044b\u043c\u0434\u044b\u043b\u044b\u0493\u044b", - "HeaderSubtitles": "\u0421\u0443\u0431\u0442\u0438\u0442\u0440\u043b\u0435\u0440", - "HeaderGenres": "\u0416\u0430\u043d\u0440\u043b\u0430\u0440", - "HeaderCountries": "\u0415\u043b\u0434\u0435\u0440", - "HeaderStatus": "\u041a\u04af\u0439", - "HeaderTracks": "\u0416\u043e\u043b\u0448\u044b\u049b\u0442\u0430\u0440", - "HeaderMusicArtist": "\u041c\u0443\u0437\u044b\u043a\u0430 \u043e\u0440\u044b\u043d\u0434\u0430\u0443\u0448\u044b", - "HeaderLocked": "\u049a\u04b1\u043b\u044b\u043f\u0442\u0430\u043b\u0493\u0430\u043d", - "HeaderStudios": "\u0421\u0442\u0443\u0434\u0438\u044f\u043b\u0430\u0440", - "HeaderActor": "\u0410\u043a\u0442\u0435\u0440\u043b\u0435\u0440", - "HeaderComposer": "\u041a\u043e\u043c\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u043b\u0430\u0440", - "HeaderDirector": "\u0420\u0435\u0436\u0438\u0441\u0441\u0435\u0440\u043b\u0435\u0440", - "HeaderGuestStar": "\u0428\u0430\u049b\u044b\u0440\u044b\u043b\u0493\u0430\u043d \u0430\u043a\u0442\u0435\u0440", - "HeaderProducer": "\u041f\u0440\u043e\u0434\u044e\u0441\u0435\u0440\u043b\u0435\u0440", - "HeaderWriter": "\u0421\u0446\u0435\u043d\u0430\u0440\u0438\u0439\u0448\u0456\u043b\u0435\u0440", - "HeaderParentalRatings": "\u0416\u0430\u0441\u0442\u0430\u0441 \u0441\u0430\u043d\u0430\u0442\u0442\u0430\u0440", - "HeaderCommunityRatings": "\u049a\u0430\u0443\u044b\u043c \u0431\u0430\u0493\u0430\u043b\u0430\u0443\u043b\u0430\u0440\u044b", - "StartupEmbyServerIsLoading": "Emby Server \u0436\u04af\u043a\u0442\u0435\u043b\u0443\u0434\u0435. \u04d8\u0440\u0435\u043a\u0435\u0442\u0442\u0456 \u043a\u04e9\u043f \u04b1\u0437\u0430\u043c\u0430\u0439 \u049b\u0430\u0439\u0442\u0430\u043b\u0430\u04a3\u044b\u0437." + "Sync": "\u04ae\u043d\u0434\u0435\u0441\u0442\u0456\u0440\u0443", + "User": "\u041f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0448\u044b", + "System": "\u0416\u04af\u0439\u0435", + "Application": "\u049a\u043e\u043b\u0434\u0430\u043d\u0431\u0430", + "Plugin": "\u041f\u043b\u0430\u0433\u0438\u043d", + "LabelExit": "\u0428\u044b\u0493\u0443", + "LabelVisitCommunity": "\u049a\u0430\u0443\u044b\u043c\u0434\u0430\u0441\u0442\u044b\u049b\u049b\u0430 \u0431\u0430\u0440\u0443", + "LabelBrowseLibrary": "\u0422\u0430\u0441\u044b\u0493\u044b\u0448\u0445\u0430\u043d\u0430\u043d\u044b \u0448\u043e\u043b\u0443", + "LabelConfigureServer": "Emby \u0442\u0435\u04a3\u0448\u0435\u0443", + "LabelRestartServer": "\u0421\u0435\u0440\u0432\u0435\u0440\u0434\u0456 \u049b\u0430\u0439\u0442\u0430 \u0456\u0441\u043a\u0435 \u049b\u043e\u0441\u0443" }
\ No newline at end of file diff --git a/Emby.Server.Implementations/Localization/Core/ko.json b/Emby.Server.Implementations/Localization/Core/ko.json index 834ccc17b..6c5ed0260 100644 --- a/Emby.Server.Implementations/Localization/Core/ko.json +++ b/Emby.Server.Implementations/Localization/Core/ko.json @@ -1,178 +1,96 @@ { - "DbUpgradeMessage": "Please wait while your Emby Server database is upgraded. {0}% complete.", - "AppDeviceValues": "\uc571: {0}, \uc7a5\uce58: {1}", - "UserDownloadingItemWithValues": "{0} is downloading {1}", - "FolderTypeMixed": "\ud63c\ud569 \ucf58\ud150\ud2b8", - "FolderTypeMovies": "\uc601\ud654", - "FolderTypeMusic": "\uc74c\uc545", - "FolderTypeAdultVideos": "\uc131\uc778 \ube44\ub514\uc624", - "FolderTypePhotos": "\uc0ac\uc9c4", - "FolderTypeMusicVideos": "\ubba4\uc9c1 \ube44\ub514\uc624", - "FolderTypeHomeVideos": "\ud648 \ube44\ub514\uc624", - "FolderTypeGames": "\uac8c\uc784", - "FolderTypeBooks": "\ucc45", - "FolderTypeTvShows": "TV", - "FolderTypeInherit": "Inherit", - "HeaderCastCrew": "\ubc30\uc5ed \ubc0f \uc81c\uc791\uc9c4", - "HeaderPeople": "People", + "Latest": "Latest", "ValueSpecialEpisodeName": "Special - {0}", - "LabelChapterName": "\ucc55\ud130 {0}", - "NameSeasonNumber": "\uc2dc\uc98c {0}", - "LabelExit": "\uc885\ub8cc", - "LabelVisitCommunity": "\ucee4\ubba4\ub2c8\ud2f0 \ubc29\ubb38", - "LabelGithub": "Github", - "LabelApiDocumentation": "Api \ubb38\uc11c", - "LabelDeveloperResources": "\uac1c\ubc1c\uc790 \ub9ac\uc18c\uc2a4", - "LabelBrowseLibrary": "\ub77c\uc774\ube0c\ub7ec\ub9ac \ud0d0\uc0c9", - "LabelConfigureServer": "Emby \uc124\uc815", - "LabelRestartServer": "\uc11c\ubc84 \uc7ac\uc2dc\ub3d9", - "CategorySync": "\ub3d9\uae30\ud654", - "CategoryUser": "\uc0ac\uc6a9\uc790", - "CategorySystem": "\uc2dc\uc2a4\ud15c", - "CategoryApplication": "\uc560\ud50c\ub9ac\ucf00\uc774\uc158", - "CategoryPlugin": "\ud50c\ub7ec\uadf8\uc778", - "NotificationOptionPluginError": "\ud50c\ub7ec\uadf8\uc778 \uc2e4\ud328", - "NotificationOptionApplicationUpdateAvailable": "\uc560\ud50c\ub9ac\ucf00\uc774\uc158 \uc5c5\ub370\uc774\ud2b8 \uc0ac\uc6a9 \uac00\ub2a5", - "NotificationOptionApplicationUpdateInstalled": "\uc560\ud50c\ub9ac\ucf00\uc774\uc158 \uc5c5\ub370\uc774\ud2b8 \uc124\uce58\ub428", - "NotificationOptionPluginUpdateInstalled": "\ud50c\ub7ec\uadf8\uc778 \uc5c5\ub370\uc774\ud2b8 \uc124\uce58\ub428", - "NotificationOptionPluginInstalled": "\ud50c\ub7ec\uadf8\uc778 \uc124\uce58\ub428", - "NotificationOptionPluginUninstalled": "\ud50c\ub7ec\uadf8\uc778 \uc124\uce58 \uc81c\uac70\ub428", - "NotificationOptionVideoPlayback": "\ube44\ub514\uc624 \uc7ac\uc0dd \uc2dc\uc791\ub428", - "NotificationOptionAudioPlayback": "\uc624\ub514\uc624 \uc7ac\uc0dd \uc2dc\uc791\ub428", - "NotificationOptionGamePlayback": "\uac8c\uc784 \ud50c\ub808\uc774 \uc9c0\uc791\ub428", - "NotificationOptionVideoPlaybackStopped": "\ube44\ub514\uc624 \uc7ac\uc0dd \uc911\uc9c0\ub428", - "NotificationOptionAudioPlaybackStopped": "\uc624\ub514\uc624 \uc7ac\uc0dd \uc911\uc9c0\ub428", - "NotificationOptionGamePlaybackStopped": "\uac8c\uc784 \ud50c\ub808\uc774 \uc911\uc9c0\ub428", - "NotificationOptionTaskFailed": "\uc608\uc57d \uc791\uc5c5 \uc2e4\ud328", - "NotificationOptionInstallationFailed": "\uc124\uce58 \uc2e4\ud328", - "NotificationOptionNewLibraryContent": "\uc0c8 \ucf58\ud150\ud2b8 \ucd94\uac00\ub428", - "NotificationOptionNewLibraryContentMultiple": "\uc0c8 \ucf58\ub374\ud2b8 \ucd94\uac00\ub428 (\ubcf5\uc218)", - "NotificationOptionCameraImageUploaded": "\uce74\uba54\ub77c \uc774\ubbf8\uc9c0 \uc5c5\ub85c\ub4dc\ub428", - "NotificationOptionUserLockedOut": "User locked out", - "NotificationOptionServerRestartRequired": "\uc11c\ubc84\ub97c \ub2e4\uc2dc \uc2dc\uc791\ud558\uc5ec\uc57c \ud569\ub2c8\ub2e4", - "ViewTypePlaylists": "\uc7ac\uc0dd\ubaa9\ub85d", - "ViewTypeMovies": "\uc601\ud654", - "ViewTypeTvShows": "TV", - "ViewTypeGames": "\uac8c\uc784", - "ViewTypeMusic": "\uc74c\uc545", - "ViewTypeMusicGenres": "\uc7a5\ub974", - "ViewTypeMusicArtists": "\uc544\ud2f0\uc2a4\ud2b8", - "ViewTypeBoxSets": "\uceec\ub809\uc158", - "ViewTypeChannels": "\ucc44\ub110", - "ViewTypeLiveTV": "TV \ubc29\uc1a1", - "ViewTypeLiveTvNowPlaying": "\uc9c0\uae08 \ubc29\uc1a1 \uc911", - "ViewTypeLatestGames": "\ucd5c\uadfc \uac8c\uc784", - "ViewTypeRecentlyPlayedGames": "\ucd5c\uadfc \ud50c\ub808\uc774", - "ViewTypeGameFavorites": "\uc990\uaca8\ucc3e\uae30", - "ViewTypeGameSystems": "\uac8c\uc784 \uc2dc\uc2a4\ud15c", - "ViewTypeGameGenres": "\uc7a5\ub974", - "ViewTypeTvResume": "Resume", - "ViewTypeTvNextUp": "Next Up", - "ViewTypeTvLatest": "Latest", - "ViewTypeTvShowSeries": "\uc2dc\ub9ac\uc988", - "ViewTypeTvGenres": "\uc7a5\ub974", - "ViewTypeTvFavoriteSeries": "\uc88b\uc544\ud558\ub294 \uc2dc\ub9ac\uc988", - "ViewTypeTvFavoriteEpisodes": "\uc88b\uc544\ud558\ub294 \uc5d0\ud53c\uc18c\ub4dc", - "ViewTypeMovieResume": "Resume", - "ViewTypeMovieLatest": "Latest", - "ViewTypeMovieMovies": "\uc601\ud654", - "ViewTypeMovieCollections": "\uceec\ub809\uc158", - "ViewTypeMovieFavorites": "\uc990\uaca8\ucc3e\uae30", - "ViewTypeMovieGenres": "\uc7a5\ub974", - "ViewTypeMusicLatest": "Latest", - "ViewTypeMusicPlaylists": "\uc7ac\uc0dd\ubaa9\ub85d", - "ViewTypeMusicAlbums": "\uc568\ubc94", - "ViewTypeMusicAlbumArtists": "\uc568\ubc94 \uc544\ud2f0\uc2a4\ud2b8", - "HeaderOtherDisplaySettings": "\ud654\uba74 \uc124\uc815", - "ViewTypeMusicSongs": "\ub178\ub798", - "ViewTypeMusicFavorites": "\uc990\uaca8\ucc3e\uae30", - "ViewTypeMusicFavoriteAlbums": "\uc88b\uc544\ud558\ub294 \uc568\ubc94", - "ViewTypeMusicFavoriteArtists": "\uc88b\uc544\ud558\ub294 \uc544\ud2f0\uc2a4\ud2b8", - "ViewTypeMusicFavoriteSongs": "\uc88b\uc544\ud558\ub294 \ub178\ub798", - "ViewTypeFolders": "\ud3f4\ub354", - "ViewTypeLiveTvRecordingGroups": "\ub179\ud654", - "ViewTypeLiveTvChannels": "\ucc44\ub110", - "ScheduledTaskFailedWithName": "{0} \uc2e4\ud328", - "LabelRunningTimeValue": "\uc0c1\uc601 \uc2dc\uac04: {0}", - "ScheduledTaskStartedWithName": "{0} \uc2dc\uc791\ub428", - "VersionNumber": "\ubc84\uc804 {0}", - "PluginInstalledWithName": "{0} \uc124\uce58\ub428", - "PluginUpdatedWithName": "{0} \uc5c5\ub370\uc774\ud2b8\ub428", - "PluginUninstalledWithName": "{0} \uc124\uce58 \uc81c\uac70\ub428", - "ItemAddedWithName": "\ub77c\uc774\ube0c\ub7ec\ub9ac\uc5d0 {0} \ucd94\uac00\ub428", - "ItemRemovedWithName": "\ub77c\uc774\ube0c\ub7ec\ub9ac\uc5d0\uc11c {0} \uc0ad\uc81c\ub428", - "LabelIpAddressValue": "IP \uc8fc\uc18c: {0}", - "DeviceOnlineWithName": "{0} \uc5f0\uacb0\ub428", + "Inherit": "Inherit", + "Books": "Books", + "Music": "Music", + "Games": "Games", + "Photos": "Photos", + "MixedContent": "Mixed content", + "MusicVideos": "Music videos", + "HomeVideos": "Home videos", + "Playlists": "Playlists", + "HeaderRecordingGroups": "Recording Groups", + "HeaderContinueWatching": "\uacc4\uc18d \uc2dc\uccad\ud558\uae30", + "HeaderFavoriteArtists": "Favorite Artists", + "HeaderFavoriteSongs": "Favorite Songs", + "HeaderAlbumArtists": "\uc568\ubc94 \uc544\ud2f0\uc2a4\ud2b8", + "HeaderFavoriteAlbums": "Favorite Albums", + "HeaderFavoriteEpisodes": "Favorite Episodes", + "HeaderFavoriteShows": "\uc990\uaca8\ucc3e\ub294 \uc1fc", + "HeaderNextUp": "Next Up", + "Favorites": "Favorites", + "Collections": "Collections", + "Channels": "Channels", + "Movies": "Movies", + "Albums": "Albums", + "Artists": "Artists", + "Folders": "Folders", + "Songs": "Songs", + "TvShows": "TV Shows", + "Shows": "Shows", + "Genres": "Genres", + "NameSeasonNumber": "Season {0}", + "AppDeviceValues": "App: {0}, Device: {1}", + "UserDownloadingItemWithValues": "{0} is downloading {1}", + "HeaderLiveTV": "Live TV", + "ChapterNameValue": "Chapter {0}", + "ScheduledTaskFailedWithName": "{0} failed", + "LabelRunningTimeValue": "Running time: {0}", + "ScheduledTaskStartedWithName": "{0} started", + "VersionNumber": "Version {0}", + "PluginInstalledWithName": "{0} was installed", + "StartupEmbyServerIsLoading": "Emby \uc11c\ubc84\ub97c \ubd88\ub7ec\uc624\uace0 \uc788\uc2b5\ub2c8\ub2e4. \uc7a0\uc2dc\ud6c4 \ub2e4\uc2dc\uc2dc\ub3c4 \ud574\uc8fc\uc138\uc694.", + "PluginUpdatedWithName": "{0} was updated", + "PluginUninstalledWithName": "{0} was uninstalled", + "ItemAddedWithName": "{0} was added to the library", + "ItemRemovedWithName": "{0} was removed from the library", + "LabelIpAddressValue": "Ip address: {0}", + "DeviceOnlineWithName": "{0} is connected", "UserOnlineFromDevice": "{0} is online from {1}", - "ProviderValue": "\uc81c\uacf5\uc790: {0}", - "SubtitlesDownloadedForItem": "{0} \uc790\ub9c9 \ub2e4\uc6b4\ub85c\ub4dc\ub428", - "UserConfigurationUpdatedWithName": "{0} \uc0ac\uc6a9\uc790 \uc124\uc815\uc774 \uc5c5\ub370\uc774\ud2b8\ub428", - "UserCreatedWithName": "\uc0ac\uc6a9\uc790 {0} \uc0dd\uc131\ub428", - "UserPasswordChangedWithName": "\uc0ac\uc6a9\uc790 {0} \ube44\ubc00\ubc88\ud638 \ubcc0\uacbd\ub428", - "UserDeletedWithName": "\uc0ac\uc6a9\uc790 {0} \uc0ad\uc81c\ub428", - "MessageServerConfigurationUpdated": "\uc11c\ubc84 \ud658\uacbd \uc124\uc815 \uc5c5\ub370\uc774\ub4dc\ub428", - "MessageNamedServerConfigurationUpdatedWithValue": "\uc11c\ubc84 \ud658\uacbd \uc124\uc815 {0} \uc139\uc158 \uc5c5\ub370\uc774\ud2b8 \ub428", - "MessageApplicationUpdated": "Emby \uc11c\ubc84 \uc5c5\ub370\uc774\ud2b8\ub428", + "ProviderValue": "Provider: {0}", + "SubtitlesDownloadedForItem": "Subtitles downloaded for {0}", + "UserCreatedWithName": "User {0} has been created", + "UserPasswordChangedWithName": "Password has been changed for user {0}", + "UserDeletedWithName": "User {0} has been deleted", + "UserConfigurationUpdatedWithName": "User configuration has been updated for {0}", + "MessageServerConfigurationUpdated": "Server configuration has been updated", + "MessageNamedServerConfigurationUpdatedWithValue": "Server configuration section {0} has been updated", + "MessageApplicationUpdated": "Emby Server has been updated", "FailedLoginAttemptWithUserName": "Failed login attempt from {0}", "AuthenticationSucceededWithUserName": "{0} successfully authenticated", - "DeviceOfflineWithName": "{0} \uc5f0\uacb0 \ud574\uc81c\ub428", - "UserLockedOutWithName": "User {0} has been locked out", - "UserOfflineFromDevice": "{1} \uc5d0\uc11c {0} \uc5f0\uacb0 \ud574\uc81c\ub428", + "UserOfflineFromDevice": "{0} has disconnected from {1}", + "DeviceOfflineWithName": "{0} has disconnected", "UserStartedPlayingItemWithValues": "{0} has started playing {1}", "UserStoppedPlayingItemWithValues": "{0} has stopped playing {1}", - "SubtitleDownloadFailureForItem": "{0} \uc790\ub9c9 \ub2e4\uc6b4\ub85c\ub4dc \uc2e4\ud328", - "HeaderUnidentified": "Unidentified", - "HeaderImagePrimary": "Primary", - "HeaderImageBackdrop": "\ubc30\uacbd", - "HeaderImageLogo": "\ub85c\uace0", - "HeaderUserPrimaryImage": "\uc0ac\uc6a9\uc790 \uc774\ubbf8\uc9c0", - "HeaderOverview": "\uc904\uac70\ub9ac", - "HeaderShortOverview": "\uac04\ub7b5 \uc904\uac70\ub9ac", - "HeaderType": "Type", - "HeaderSeverity": "\uc2ec\uac01\ub3c4", - "HeaderUser": "\uc0ac\uc6a9\uc790", - "HeaderName": "Name", - "HeaderDate": "\ub0a0\uc9dc", - "HeaderPremiereDate": "Premiere Date", - "HeaderDateAdded": "Date Added", - "HeaderReleaseDate": "\uac1c\ubd09\uc77c", - "HeaderRuntime": "\uc0c1\uc601 \uc2dc\uac04", - "HeaderPlayCount": "Play Count", - "HeaderSeason": "\uc2dc\uc98c", - "HeaderSeasonNumber": "\uc2dc\uc98c \ubc88\ud638", - "HeaderSeries": "Series:", - "HeaderNetwork": "\ub124\ud2b8\uc6cc\ud06c", - "HeaderYear": "Year:", - "HeaderYears": "Years:", - "HeaderParentalRating": "Parental Rating", - "HeaderCommunityRating": "\ucee4\ubba4\ub2c8\ud2f0 \ud3c9\uc810", - "HeaderTrailers": "\uc608\uace0\ud3b8", - "HeaderSpecials": "\uc2a4\ud398\uc15c", - "HeaderGameSystems": "Game Systems", - "HeaderPlayers": "Players:", - "HeaderAlbumArtists": "Album Artists", - "HeaderAlbums": "\uc568\ubc94", - "HeaderDisc": "\ub514\uc2a4\ud06c", - "HeaderTrack": "\ud2b8\ub799", - "HeaderAudio": "\uc624\ub514\uc624", - "HeaderVideo": "\ube44\ub514\uc624", - "HeaderEmbeddedImage": "\ub0b4\uc7a5 \uc774\ubbf8\uc9c0", - "HeaderResolution": "\ud574\uc0c1\ub3c4", - "HeaderSubtitles": "\uc790\ub9c9", - "HeaderGenres": "\uc7a5\ub974", - "HeaderCountries": "\uad6d\uac00", - "HeaderStatus": "\uc0c1\ud0dc", - "HeaderTracks": "\ud2b8\ub799", - "HeaderMusicArtist": "Music artist", - "HeaderLocked": "\uc7a0\uae40", - "HeaderStudios": "\uc2a4\ud29c\ub514\uc624", - "HeaderActor": "Actors", - "HeaderComposer": "Composers", - "HeaderDirector": "Directors", - "HeaderGuestStar": "Guest star", - "HeaderProducer": "Producers", - "HeaderWriter": "Writers", - "HeaderParentalRatings": "\uc790\ub140 \ubcf4\ud638 \ub4f1\uae09", - "HeaderCommunityRatings": "Community ratings", - "StartupEmbyServerIsLoading": "Emby Server is loading. Please try again shortly." + "NotificationOptionPluginError": "Plugin failure", + "NotificationOptionApplicationUpdateAvailable": "Application update available", + "NotificationOptionApplicationUpdateInstalled": "Application update installed", + "NotificationOptionPluginUpdateInstalled": "Plugin update installed", + "NotificationOptionPluginInstalled": "Plugin installed", + "NotificationOptionPluginUninstalled": "Plugin uninstalled", + "NotificationOptionVideoPlayback": "Video playback started", + "NotificationOptionAudioPlayback": "Audio playback started", + "NotificationOptionGamePlayback": "Game playback started", + "NotificationOptionVideoPlaybackStopped": "Video playback stopped", + "NotificationOptionAudioPlaybackStopped": "Audio playback stopped", + "NotificationOptionGamePlaybackStopped": "Game playback stopped", + "NotificationOptionTaskFailed": "Scheduled task failure", + "NotificationOptionInstallationFailed": "Installation failure", + "NotificationOptionNewLibraryContent": "New content added", + "NotificationOptionCameraImageUploaded": "Camera image uploaded", + "NotificationOptionUserLockedOut": "User locked out", + "NotificationOptionServerRestartRequired": "Server restart required", + "UserLockedOutWithName": "User {0} has been locked out", + "SubtitleDownloadFailureForItem": "Subtitles failed to download for {0}", + "Sync": "Sync", + "User": "User", + "System": "System", + "Application": "Application", + "Plugin": "Plugin", + "LabelExit": "Exit", + "LabelVisitCommunity": "Visit Community", + "LabelBrowseLibrary": "Browse Library", + "LabelConfigureServer": "Configure Emby", + "LabelRestartServer": "Restart Server" }
\ No newline at end of file diff --git a/Emby.Server.Implementations/Localization/Core/lt-LT.json b/Emby.Server.Implementations/Localization/Core/lt-LT.json new file mode 100644 index 000000000..21ed36d7c --- /dev/null +++ b/Emby.Server.Implementations/Localization/Core/lt-LT.json @@ -0,0 +1,96 @@ +{ + "Latest": "Latest", + "ValueSpecialEpisodeName": "Ypatinga - {0}", + "Inherit": "Inherit", + "Books": "Books", + "Music": "Music", + "Games": "Games", + "Photos": "Photos", + "MixedContent": "Mixed content", + "MusicVideos": "Music videos", + "HomeVideos": "Home videos", + "Playlists": "Playlists", + "HeaderRecordingGroups": "Recording Groups", + "HeaderContinueWatching": "\u017di\u016br\u0117ti toliau", + "HeaderFavoriteArtists": "Favorite Artists", + "HeaderFavoriteSongs": "Favorite Songs", + "HeaderAlbumArtists": "Album Artists", + "HeaderFavoriteAlbums": "Favorite Albums", + "HeaderFavoriteEpisodes": "Favorite Episodes", + "HeaderFavoriteShows": "Favorite Shows", + "HeaderNextUp": "Next Up", + "Favorites": "Favorites", + "Collections": "Collections", + "Channels": "Channels", + "Movies": "Filmai", + "Albums": "Albums", + "Artists": "Artists", + "Folders": "Folders", + "Songs": "Songs", + "TvShows": "TV Shows", + "Shows": "Shows", + "Genres": "\u017danrai", + "NameSeasonNumber": "Season {0}", + "AppDeviceValues": "App: {0}, Device: {1}", + "UserDownloadingItemWithValues": "{0} is downloading {1}", + "HeaderLiveTV": "Live TV", + "ChapterNameValue": "Chapter {0}", + "ScheduledTaskFailedWithName": "{0} failed", + "LabelRunningTimeValue": "Running time: {0}", + "ScheduledTaskStartedWithName": "{0} started", + "VersionNumber": "Version {0}", + "PluginInstalledWithName": "{0} was installed", + "StartupEmbyServerIsLoading": "Emby Server is loading. Please try again shortly.", + "PluginUpdatedWithName": "{0} was updated", + "PluginUninstalledWithName": "{0} was uninstalled", + "ItemAddedWithName": "{0} was added to the library", + "ItemRemovedWithName": "{0} was removed from the library", + "LabelIpAddressValue": "Ip address: {0}", + "DeviceOnlineWithName": "{0} is connected", + "UserOnlineFromDevice": "{0} is online from {1}", + "ProviderValue": "Provider: {0}", + "SubtitlesDownloadedForItem": "Subtitles downloaded for {0}", + "UserCreatedWithName": "User {0} has been created", + "UserPasswordChangedWithName": "Password has been changed for user {0}", + "UserDeletedWithName": "User {0} has been deleted", + "UserConfigurationUpdatedWithName": "User configuration has been updated for {0}", + "MessageServerConfigurationUpdated": "Server configuration has been updated", + "MessageNamedServerConfigurationUpdatedWithValue": "Server configuration section {0} has been updated", + "MessageApplicationUpdated": "Emby Server has been updated", + "FailedLoginAttemptWithUserName": "Failed login attempt from {0}", + "AuthenticationSucceededWithUserName": "{0} successfully authenticated", + "UserOfflineFromDevice": "{0} has disconnected from {1}", + "DeviceOfflineWithName": "{0} has disconnected", + "UserStartedPlayingItemWithValues": "{0} has started playing {1}", + "UserStoppedPlayingItemWithValues": "{0} has stopped playing {1}", + "NotificationOptionPluginError": "Plugin failure", + "NotificationOptionApplicationUpdateAvailable": "Application update available", + "NotificationOptionApplicationUpdateInstalled": "Application update installed", + "NotificationOptionPluginUpdateInstalled": "Plugin update installed", + "NotificationOptionPluginInstalled": "Plugin installed", + "NotificationOptionPluginUninstalled": "Plugin uninstalled", + "NotificationOptionVideoPlayback": "Video playback started", + "NotificationOptionAudioPlayback": "Audio playback started", + "NotificationOptionGamePlayback": "Game playback started", + "NotificationOptionVideoPlaybackStopped": "Video playback stopped", + "NotificationOptionAudioPlaybackStopped": "Audio playback stopped", + "NotificationOptionGamePlaybackStopped": "Game playback stopped", + "NotificationOptionTaskFailed": "Scheduled task failure", + "NotificationOptionInstallationFailed": "Installation failure", + "NotificationOptionNewLibraryContent": "New content added", + "NotificationOptionCameraImageUploaded": "Camera image uploaded", + "NotificationOptionUserLockedOut": "User locked out", + "NotificationOptionServerRestartRequired": "Server restart required", + "UserLockedOutWithName": "User {0} has been locked out", + "SubtitleDownloadFailureForItem": "Subtitles failed to download for {0}", + "Sync": "Sinchronizuoti", + "User": "User", + "System": "System", + "Application": "Application", + "Plugin": "Plugin", + "LabelExit": "Exit", + "LabelVisitCommunity": "Visit Community", + "LabelBrowseLibrary": "Browse Library", + "LabelConfigureServer": "Configure Emby", + "LabelRestartServer": "Restart Server" +}
\ No newline at end of file diff --git a/Emby.Server.Implementations/Localization/Core/ms.json b/Emby.Server.Implementations/Localization/Core/ms.json index fe5eef894..e4a49abf6 100644 --- a/Emby.Server.Implementations/Localization/Core/ms.json +++ b/Emby.Server.Implementations/Localization/Core/ms.json @@ -1,102 +1,46 @@ { - "DbUpgradeMessage": "Please wait while your Emby Server database is upgraded. {0}% complete.", - "AppDeviceValues": "App: {0}, Device: {1}", - "UserDownloadingItemWithValues": "{0} is downloading {1}", - "FolderTypeMixed": "Mixed content", - "FolderTypeMovies": "Movies", - "FolderTypeMusic": "Music", - "FolderTypeAdultVideos": "Adult videos", - "FolderTypePhotos": "Photos", - "FolderTypeMusicVideos": "Music videos", - "FolderTypeHomeVideos": "Home videos", - "FolderTypeGames": "Games", - "FolderTypeBooks": "Books", - "FolderTypeTvShows": "TV", - "FolderTypeInherit": "Inherit", - "HeaderCastCrew": "Cast & Crew", - "HeaderPeople": "People", + "Latest": "Latest", "ValueSpecialEpisodeName": "Special - {0}", - "LabelChapterName": "Chapter {0}", + "Inherit": "Inherit", + "Books": "Books", + "Music": "Music", + "Games": "Games", + "Photos": "Photos", + "MixedContent": "Mixed content", + "MusicVideos": "Music videos", + "HomeVideos": "Home videos", + "Playlists": "Playlists", + "HeaderRecordingGroups": "Recording Groups", + "HeaderContinueWatching": "Continue Watching", + "HeaderFavoriteArtists": "Favorite Artists", + "HeaderFavoriteSongs": "Favorite Songs", + "HeaderAlbumArtists": "Album Artists", + "HeaderFavoriteAlbums": "Favorite Albums", + "HeaderFavoriteEpisodes": "Favorite Episodes", + "HeaderFavoriteShows": "Favorite Shows", + "HeaderNextUp": "Next Up", + "Favorites": "Favorites", + "Collections": "Collections", + "Channels": "Channels", + "Movies": "Movies", + "Albums": "Albums", + "Artists": "Artists", + "Folders": "Folders", + "Songs": "Songs", + "TvShows": "TV Shows", + "Shows": "Series", + "Genres": "Genres", "NameSeasonNumber": "Season {0}", - "LabelExit": "Tutup", - "LabelVisitCommunity": "Melawat Masyarakat", - "LabelGithub": "Github", - "LabelApiDocumentation": "Api Documentation", - "LabelDeveloperResources": "Developer Resources", - "LabelBrowseLibrary": "Imbas Pengumpulan", - "LabelConfigureServer": "Configure Emby", - "LabelRestartServer": "Restart Server", - "CategorySync": "Sync", - "CategoryUser": "User", - "CategorySystem": "System", - "CategoryApplication": "Application", - "CategoryPlugin": "Plugin", - "NotificationOptionPluginError": "Plugin failure", - "NotificationOptionApplicationUpdateAvailable": "Application update available", - "NotificationOptionApplicationUpdateInstalled": "Application update installed", - "NotificationOptionPluginUpdateInstalled": "Plugin update installed", - "NotificationOptionPluginInstalled": "Plugin installed", - "NotificationOptionPluginUninstalled": "Plugin uninstalled", - "NotificationOptionVideoPlayback": "Video playback started", - "NotificationOptionAudioPlayback": "Audio playback started", - "NotificationOptionGamePlayback": "Game playback started", - "NotificationOptionVideoPlaybackStopped": "Video playback stopped", - "NotificationOptionAudioPlaybackStopped": "Audio playback stopped", - "NotificationOptionGamePlaybackStopped": "Game playback stopped", - "NotificationOptionTaskFailed": "Scheduled task failure", - "NotificationOptionInstallationFailed": "Installation failure", - "NotificationOptionNewLibraryContent": "New content added", - "NotificationOptionNewLibraryContentMultiple": "New content added (multiple)", - "NotificationOptionCameraImageUploaded": "Camera image uploaded", - "NotificationOptionUserLockedOut": "User locked out", - "NotificationOptionServerRestartRequired": "Server restart required", - "ViewTypePlaylists": "Playlists", - "ViewTypeMovies": "Movies", - "ViewTypeTvShows": "TV", - "ViewTypeGames": "Games", - "ViewTypeMusic": "Music", - "ViewTypeMusicGenres": "Genres", - "ViewTypeMusicArtists": "Artists", - "ViewTypeBoxSets": "Collections", - "ViewTypeChannels": "Channels", - "ViewTypeLiveTV": "Live TV", - "ViewTypeLiveTvNowPlaying": "Now Airing", - "ViewTypeLatestGames": "Latest Games", - "ViewTypeRecentlyPlayedGames": "Recently Played", - "ViewTypeGameFavorites": "Favorites", - "ViewTypeGameSystems": "Game Systems", - "ViewTypeGameGenres": "Genres", - "ViewTypeTvResume": "Resume", - "ViewTypeTvNextUp": "Next Up", - "ViewTypeTvLatest": "Latest", - "ViewTypeTvShowSeries": "Series", - "ViewTypeTvGenres": "Genres", - "ViewTypeTvFavoriteSeries": "Favorite Series", - "ViewTypeTvFavoriteEpisodes": "Favorite Episodes", - "ViewTypeMovieResume": "Resume", - "ViewTypeMovieLatest": "Latest", - "ViewTypeMovieMovies": "Movies", - "ViewTypeMovieCollections": "Collections", - "ViewTypeMovieFavorites": "Favorites", - "ViewTypeMovieGenres": "Genres", - "ViewTypeMusicLatest": "Latest", - "ViewTypeMusicPlaylists": "Playlists", - "ViewTypeMusicAlbums": "Albums", - "ViewTypeMusicAlbumArtists": "Album Artists", - "HeaderOtherDisplaySettings": "Display Settings", - "ViewTypeMusicSongs": "Songs", - "ViewTypeMusicFavorites": "Favorites", - "ViewTypeMusicFavoriteAlbums": "Favorite Albums", - "ViewTypeMusicFavoriteArtists": "Favorite Artists", - "ViewTypeMusicFavoriteSongs": "Favorite Songs", - "ViewTypeFolders": "Folders", - "ViewTypeLiveTvRecordingGroups": "Recordings", - "ViewTypeLiveTvChannels": "Channels", + "AppDeviceValues": "App: {0}, Device: {1}", + "UserDownloadingItemWithValues": "{0} is downloading {1}", + "HeaderLiveTV": "Live TV", + "ChapterNameValue": "Chapter {0}", "ScheduledTaskFailedWithName": "{0} failed", "LabelRunningTimeValue": "Running time: {0}", "ScheduledTaskStartedWithName": "{0} started", "VersionNumber": "Version {0}", "PluginInstalledWithName": "{0} was installed", + "StartupEmbyServerIsLoading": "Emby Server is loading. Please try again shortly.", "PluginUpdatedWithName": "{0} was updated", "PluginUninstalledWithName": "{0} was uninstalled", "ItemAddedWithName": "{0} was added to the library", @@ -106,73 +50,47 @@ "UserOnlineFromDevice": "{0} is online from {1}", "ProviderValue": "Provider: {0}", "SubtitlesDownloadedForItem": "Subtitles downloaded for {0}", - "UserConfigurationUpdatedWithName": "User configuration has been updated for {0}", "UserCreatedWithName": "User {0} has been created", "UserPasswordChangedWithName": "Password has been changed for user {0}", "UserDeletedWithName": "User {0} has been deleted", + "UserConfigurationUpdatedWithName": "User configuration has been updated for {0}", "MessageServerConfigurationUpdated": "Server configuration has been updated", "MessageNamedServerConfigurationUpdatedWithValue": "Server configuration section {0} has been updated", "MessageApplicationUpdated": "Emby Server has been updated", "FailedLoginAttemptWithUserName": "Failed login attempt from {0}", "AuthenticationSucceededWithUserName": "{0} successfully authenticated", - "DeviceOfflineWithName": "{0} has disconnected", - "UserLockedOutWithName": "User {0} has been locked out", "UserOfflineFromDevice": "{0} has disconnected from {1}", + "DeviceOfflineWithName": "{0} has disconnected", "UserStartedPlayingItemWithValues": "{0} has started playing {1}", "UserStoppedPlayingItemWithValues": "{0} has stopped playing {1}", + "NotificationOptionPluginError": "Plugin failure", + "NotificationOptionApplicationUpdateAvailable": "Application update available", + "NotificationOptionApplicationUpdateInstalled": "Application update installed", + "NotificationOptionPluginUpdateInstalled": "Plugin update installed", + "NotificationOptionPluginInstalled": "Plugin installed", + "NotificationOptionPluginUninstalled": "Plugin uninstalled", + "NotificationOptionVideoPlayback": "Video playback started", + "NotificationOptionAudioPlayback": "Audio playback started", + "NotificationOptionGamePlayback": "Game playback started", + "NotificationOptionVideoPlaybackStopped": "Video playback stopped", + "NotificationOptionAudioPlaybackStopped": "Audio playback stopped", + "NotificationOptionGamePlaybackStopped": "Game playback stopped", + "NotificationOptionTaskFailed": "Scheduled task failure", + "NotificationOptionInstallationFailed": "Installation failure", + "NotificationOptionNewLibraryContent": "New content added", + "NotificationOptionCameraImageUploaded": "Camera image uploaded", + "NotificationOptionUserLockedOut": "User locked out", + "NotificationOptionServerRestartRequired": "Server restart required", + "UserLockedOutWithName": "User {0} has been locked out", "SubtitleDownloadFailureForItem": "Subtitles failed to download for {0}", - "HeaderUnidentified": "Unidentified", - "HeaderImagePrimary": "Primary", - "HeaderImageBackdrop": "Backdrop", - "HeaderImageLogo": "Logo", - "HeaderUserPrimaryImage": "User Image", - "HeaderOverview": "Overview", - "HeaderShortOverview": "Short Overview", - "HeaderType": "Type", - "HeaderSeverity": "Severity", - "HeaderUser": "User", - "HeaderName": "Name", - "HeaderDate": "Date", - "HeaderPremiereDate": "Premiere Date", - "HeaderDateAdded": "Date Added", - "HeaderReleaseDate": "Release date", - "HeaderRuntime": "Runtime", - "HeaderPlayCount": "Play Count", - "HeaderSeason": "Season", - "HeaderSeasonNumber": "Season number", - "HeaderSeries": "Series:", - "HeaderNetwork": "Network", - "HeaderYear": "Year:", - "HeaderYears": "Years:", - "HeaderParentalRating": "Parental Rating", - "HeaderCommunityRating": "Community rating", - "HeaderTrailers": "Trailers", - "HeaderSpecials": "Specials", - "HeaderGameSystems": "Game Systems", - "HeaderPlayers": "Players:", - "HeaderAlbumArtists": "Album Artists", - "HeaderAlbums": "Albums", - "HeaderDisc": "Disc", - "HeaderTrack": "Track", - "HeaderAudio": "Audio", - "HeaderVideo": "Video", - "HeaderEmbeddedImage": "Embedded image", - "HeaderResolution": "Resolution", - "HeaderSubtitles": "Subtitles", - "HeaderGenres": "Genres", - "HeaderCountries": "Countries", - "HeaderStatus": "Status", - "HeaderTracks": "Tracks", - "HeaderMusicArtist": "Music artist", - "HeaderLocked": "Locked", - "HeaderStudios": "Studios", - "HeaderActor": "Actors", - "HeaderComposer": "Composers", - "HeaderDirector": "Directors", - "HeaderGuestStar": "Guest star", - "HeaderProducer": "Producers", - "HeaderWriter": "Writers", - "HeaderParentalRatings": "Parental Ratings", - "HeaderCommunityRatings": "Community ratings", - "StartupEmbyServerIsLoading": "Emby Server is loading. Please try again shortly." + "Sync": "Sync", + "User": "User", + "System": "System", + "Application": "Application", + "Plugin": "Plugin", + "LabelExit": "Exit", + "LabelVisitCommunity": "Visit Community", + "LabelBrowseLibrary": "Browse Library", + "LabelConfigureServer": "Configure Emby", + "LabelRestartServer": "Restart Server" }
\ No newline at end of file diff --git a/Emby.Server.Implementations/Localization/Core/nb.json b/Emby.Server.Implementations/Localization/Core/nb.json index 315d49b5f..d0482315d 100644 --- a/Emby.Server.Implementations/Localization/Core/nb.json +++ b/Emby.Server.Implementations/Localization/Core/nb.json @@ -1,178 +1,96 @@ { - "DbUpgradeMessage": "Please wait while your Emby Server database is upgraded. {0}% complete.", - "AppDeviceValues": "App: {0} , Device: {1}", - "UserDownloadingItemWithValues": "{0} laster ned {1}", - "FolderTypeMixed": "Forskjellig innhold", - "FolderTypeMovies": "Filmer", - "FolderTypeMusic": "Musikk", - "FolderTypeAdultVideos": "Voksen-videoer", - "FolderTypePhotos": "Foto", - "FolderTypeMusicVideos": "Musikk-videoer", - "FolderTypeHomeVideos": "Hjemme-videoer", - "FolderTypeGames": "Spill", - "FolderTypeBooks": "B\u00f8ker", - "FolderTypeTvShows": "TV", - "FolderTypeInherit": "Arve", - "HeaderCastCrew": "Mannskap", - "HeaderPeople": "Personer", - "ValueSpecialEpisodeName": "Spesiell - {0}", - "LabelChapterName": "Kapittel {0}", + "Latest": "Siste", + "ValueSpecialEpisodeName": "Spesial - {0}", + "Inherit": "Arve", + "Books": "B\u00f8ker", + "Music": "Musikk", + "Games": "Spill", + "Photos": "BIlder", + "MixedContent": "Blandet innhold", + "MusicVideos": "Musikkvideoer", + "HomeVideos": "Hjemmelaget filmer", + "Playlists": "Spilleliste", + "HeaderRecordingGroups": "Opptak Grupper", + "HeaderContinueWatching": "Forsett og see p\u00e5", + "HeaderFavoriteArtists": "Favorittartister", + "HeaderFavoriteSongs": "Favorittsanger", + "HeaderAlbumArtists": "Albumartist", + "HeaderFavoriteAlbums": "Favoritt albumer", + "HeaderFavoriteEpisodes": "Favoritt episode", + "HeaderFavoriteShows": "Favorittserier", + "HeaderNextUp": "Neste", + "Favorites": "Favoritter", + "Collections": "Samlinger", + "Channels": "Kanaler", + "Movies": "Filmer", + "Albums": "Album", + "Artists": "Artister", + "Folders": "Mapper", + "Songs": "Sanger", + "TvShows": "TV Shows", + "Shows": "Programmer", + "Genres": "Sjanger", "NameSeasonNumber": "Sesong {0}", - "LabelExit": "Avslutt", - "LabelVisitCommunity": "Bes\u00f8k oss", - "LabelGithub": "Github", - "LabelApiDocumentation": "API-dokumentasjon", - "LabelDeveloperResources": "Ressurser for Utviklere", - "LabelBrowseLibrary": "Browse biblioteket", - "LabelConfigureServer": "Konfigurer Emby", - "LabelRestartServer": "Restart serveren", - "CategorySync": "Synk", - "CategoryUser": "Bruker", - "CategorySystem": "System", - "CategoryApplication": "Applikasjon", - "CategoryPlugin": "Programtillegg", - "NotificationOptionPluginError": "Programtillegg feilet", - "NotificationOptionApplicationUpdateAvailable": "Oppdatering tilgjengelig", - "NotificationOptionApplicationUpdateInstalled": "Oppdatering installert", - "NotificationOptionPluginUpdateInstalled": "Oppdatert programtillegg installert", - "NotificationOptionPluginInstalled": "Programtillegg installert", - "NotificationOptionPluginUninstalled": "Programtillegg er fjernet", - "NotificationOptionVideoPlayback": "Videoavspilling startet", - "NotificationOptionAudioPlayback": "Lydavspilling startet", - "NotificationOptionGamePlayback": "Spill startet", - "NotificationOptionVideoPlaybackStopped": "Videoavspilling stoppet", - "NotificationOptionAudioPlaybackStopped": "Lydavspilling stoppet", - "NotificationOptionGamePlaybackStopped": "Spill stoppet", - "NotificationOptionTaskFailed": "Planlagt oppgave feilet", - "NotificationOptionInstallationFailed": "Installasjon feilet", - "NotificationOptionNewLibraryContent": "Nytt innhold er lagt til", - "NotificationOptionNewLibraryContentMultiple": "Nytt innhold lagt til (flere)", - "NotificationOptionCameraImageUploaded": "Bilde fra kamera lastet opp", - "NotificationOptionUserLockedOut": "Bruker er utestengt", - "NotificationOptionServerRestartRequired": "Server m\u00e5 startes p\u00e5 nytt", - "ViewTypePlaylists": "Spillelister", - "ViewTypeMovies": "Filmer", - "ViewTypeTvShows": "TV", - "ViewTypeGames": "Spill", - "ViewTypeMusic": "Musikk", - "ViewTypeMusicGenres": "Sjangere", - "ViewTypeMusicArtists": "Artist", - "ViewTypeBoxSets": "Samlinger", - "ViewTypeChannels": "Kanaler", - "ViewTypeLiveTV": "Live TV", - "ViewTypeLiveTvNowPlaying": "Sendes n\u00e5", - "ViewTypeLatestGames": "Siste spill", - "ViewTypeRecentlyPlayedGames": "Nylig spilt", - "ViewTypeGameFavorites": "Favoritter", - "ViewTypeGameSystems": "Spillsystemer", - "ViewTypeGameGenres": "Sjangere", - "ViewTypeTvResume": "Fortsette", - "ViewTypeTvNextUp": "Neste", - "ViewTypeTvLatest": "Siste", - "ViewTypeTvShowSeries": "Serier", - "ViewTypeTvGenres": "Sjangere", - "ViewTypeTvFavoriteSeries": "Favoritt serier", - "ViewTypeTvFavoriteEpisodes": "Favoritt episoder", - "ViewTypeMovieResume": "Fortsette", - "ViewTypeMovieLatest": "Siste", - "ViewTypeMovieMovies": "Filmer", - "ViewTypeMovieCollections": "Samlinger", - "ViewTypeMovieFavorites": "Favoritter", - "ViewTypeMovieGenres": "Sjangere", - "ViewTypeMusicLatest": "Siste", - "ViewTypeMusicPlaylists": "Spillelister", - "ViewTypeMusicAlbums": "Albumer", - "ViewTypeMusicAlbumArtists": "Album artister", - "HeaderOtherDisplaySettings": "Visnings Innstillinger", - "ViewTypeMusicSongs": "Sanger", - "ViewTypeMusicFavorites": "Favoritter", - "ViewTypeMusicFavoriteAlbums": "Favorittalbumer", - "ViewTypeMusicFavoriteArtists": "Favorittartister", - "ViewTypeMusicFavoriteSongs": "Favorittsanger", - "ViewTypeFolders": "Mapper", - "ViewTypeLiveTvRecordingGroups": "Opptak", - "ViewTypeLiveTvChannels": "Kanaler", - "ScheduledTaskFailedWithName": "{0} feilet", - "LabelRunningTimeValue": "Spille tide: {0}", - "ScheduledTaskStartedWithName": "{0} startet", + "AppDeviceValues": "App:{0}, Enhet {1}", + "UserDownloadingItemWithValues": "{0} laster ned {1}", + "HeaderLiveTV": "Direkte TV", + "ChapterNameValue": "Kapittel {0}", + "ScheduledTaskFailedWithName": "{0} Mislykkes", + "LabelRunningTimeValue": "L\u00f8petid {0}", + "ScheduledTaskStartedWithName": "{0} Startet", "VersionNumber": "Versjon {0}", "PluginInstalledWithName": "{0} ble installert", + "StartupEmbyServerIsLoading": "Emby server laster. Pr\u00f8v igjen snart.", "PluginUpdatedWithName": "{0} ble oppdatert", "PluginUninstalledWithName": "{0} ble avinstallert", - "ItemAddedWithName": "{0} ble lagt til biblioteket", + "ItemAddedWithName": "{0} ble lagt til i biblioteket", "ItemRemovedWithName": "{0} ble fjernet fra biblioteket", - "LabelIpAddressValue": "Ip adresse: {0}", + "LabelIpAddressValue": "IP adresse: {0}", "DeviceOnlineWithName": "{0} er tilkoblet", - "UserOnlineFromDevice": "{0} er online fra {1}", - "ProviderValue": "Tilbyder: {0}", + "UserOnlineFromDevice": "{0} er tilkoblet fra {1}", + "ProviderValue": "Leverand\u00f8rer: {0}", "SubtitlesDownloadedForItem": "Undertekster lastet ned for {0}", - "UserConfigurationUpdatedWithName": "Bruker konfigurasjon har blitt oppdatert for {0}", - "UserCreatedWithName": "Bruker {0} har blitt opprettet", - "UserPasswordChangedWithName": "Passord har blitt endret for bruker {0}", + "UserCreatedWithName": "Bruker {0} er opprettet", + "UserPasswordChangedWithName": "Passordet for {0} er oppdatert", "UserDeletedWithName": "Bruker {0} har blitt slettet", - "MessageServerConfigurationUpdated": "Server konfigurasjon har blitt oppdatert", + "UserConfigurationUpdatedWithName": "Brukerkonfigurasjon har blitt oppdatert for {0}", + "MessageServerConfigurationUpdated": "Server konfigurasjon er oppdatert", "MessageNamedServerConfigurationUpdatedWithValue": "Server konfigurasjon seksjon {0} har blitt oppdatert", "MessageApplicationUpdated": "Emby server har blitt oppdatert", - "FailedLoginAttemptWithUserName": "P\u00e5loggingsfors\u00f8k feilet fra {0}", - "AuthenticationSucceededWithUserName": "{0} autentisert med suksess", - "DeviceOfflineWithName": "{0} har koblet fra", - "UserLockedOutWithName": "User {0} has been locked out", + "FailedLoginAttemptWithUserName": "Mislykket p\u00e5loggingsfors\u00f8k fra {0}", + "AuthenticationSucceededWithUserName": "{0} vellykkede autentisert", "UserOfflineFromDevice": "{0} har koblet fra {1}", - "UserStartedPlayingItemWithValues": "{0} har startet avspilling av {1}", - "UserStoppedPlayingItemWithValues": "{0} har stoppet avspilling av {1}", - "SubtitleDownloadFailureForItem": "nedlasting av undertekster feilet for {0}", - "HeaderUnidentified": "Unidentified", - "HeaderImagePrimary": "Primary", - "HeaderImageBackdrop": "Backdrop", - "HeaderImageLogo": "Logo", - "HeaderUserPrimaryImage": "User Image", - "HeaderOverview": "Overview", - "HeaderShortOverview": "Short Overview", - "HeaderType": "Type", - "HeaderSeverity": "Severity", - "HeaderUser": "Bruker", - "HeaderName": "Navn", - "HeaderDate": "Dato", - "HeaderPremiereDate": "Premiere Date", - "HeaderDateAdded": "Date Added", - "HeaderReleaseDate": "Utgivelsesdato", - "HeaderRuntime": "Spilletid", - "HeaderPlayCount": "Play Count", - "HeaderSeason": "Sesong", - "HeaderSeasonNumber": "Sesong nummer", - "HeaderSeries": "Series:", - "HeaderNetwork": "Nettverk", - "HeaderYear": "Year:", - "HeaderYears": "Years:", - "HeaderParentalRating": "Parental Rating", - "HeaderCommunityRating": "Fellesskap anmeldelse", - "HeaderTrailers": "Trailere", - "HeaderSpecials": "Specials", - "HeaderGameSystems": "Game Systems", - "HeaderPlayers": "Players:", - "HeaderAlbumArtists": "Album Artists", - "HeaderAlbums": "Albumer", - "HeaderDisc": "Disk", - "HeaderTrack": "Spor", - "HeaderAudio": "Lyd", - "HeaderVideo": "Video", - "HeaderEmbeddedImage": "innebygd bilde", - "HeaderResolution": "Oppl\u00f8sning", - "HeaderSubtitles": "Undertekster", - "HeaderGenres": "Sjanger", - "HeaderCountries": "Land", - "HeaderStatus": "Status", - "HeaderTracks": "Spor", - "HeaderMusicArtist": "Music artist", - "HeaderLocked": "Locked", - "HeaderStudios": "Studioer", - "HeaderActor": "Actors", - "HeaderComposer": "Composers", - "HeaderDirector": "Directors", - "HeaderGuestStar": "Guest star", - "HeaderProducer": "Producers", - "HeaderWriter": "Writers", - "HeaderParentalRatings": "Foreldresensur", - "HeaderCommunityRatings": "Community ratings", - "StartupEmbyServerIsLoading": "Emby Server is loading. Please try again shortly." + "DeviceOfflineWithName": "{0} har koblet fra", + "UserStartedPlayingItemWithValues": "{0} har startet avspilling {1}", + "UserStoppedPlayingItemWithValues": "{0} har stoppet avspilling {1}", + "NotificationOptionPluginError": "Plugin feil", + "NotificationOptionApplicationUpdateAvailable": "Applikasjon oppdatering tilgjengelig", + "NotificationOptionApplicationUpdateInstalled": "Applikasjon oppdatering installert.", + "NotificationOptionPluginUpdateInstalled": "Plugin oppdatering installert", + "NotificationOptionPluginInstalled": "Plugin installert", + "NotificationOptionPluginUninstalled": "Plugin avinstallert", + "NotificationOptionVideoPlayback": "Video tilbakespilling startet", + "NotificationOptionAudioPlayback": "Lyd tilbakespilling startet", + "NotificationOptionGamePlayback": "Spill avspillingen startet", + "NotificationOptionVideoPlaybackStopped": "Video avspilling stoppet", + "NotificationOptionAudioPlaybackStopped": "Lyd avspilling stoppet", + "NotificationOptionGamePlaybackStopped": "Filmer", + "NotificationOptionTaskFailed": "Feil under utf\u00f8ring av planlagt oppgaver", + "NotificationOptionInstallationFailed": "Installasjon feil", + "NotificationOptionNewLibraryContent": "Ny innhold er lagt til", + "NotificationOptionCameraImageUploaded": "Kamera bilde lastet opp", + "NotificationOptionUserLockedOut": "Bruker er utestengt", + "NotificationOptionServerRestartRequired": "Server omstart er n\u00f8dvendig", + "UserLockedOutWithName": "Bruker {0} er blitt utestengt", + "SubtitleDownloadFailureForItem": "En feil oppst\u00e5 under nedlasting av undertekster for {0}", + "Sync": "Synk", + "User": "Bruker", + "System": "System", + "Application": "Applikasjon", + "Plugin": "Plugin", + "LabelExit": "Avslutt", + "LabelVisitCommunity": "Bes\u00f8k Samfunnet", + "LabelBrowseLibrary": "Bla i biblioteket", + "LabelConfigureServer": "Konfigurere Emby", + "LabelRestartServer": "Start om serveren" }
\ No newline at end of file diff --git a/Emby.Server.Implementations/Localization/Core/nl.json b/Emby.Server.Implementations/Localization/Core/nl.json index 2818fbf6a..daba9bed5 100644 --- a/Emby.Server.Implementations/Localization/Core/nl.json +++ b/Emby.Server.Implementations/Localization/Core/nl.json @@ -1,102 +1,46 @@ { - "DbUpgradeMessage": "Een ogenblik geduld terwijl uw Emby Server-database wordt bijgewerkt. {0}% voltooid.", - "AppDeviceValues": "App: {0}, Apparaat: {1}", - "UserDownloadingItemWithValues": "{0} download {1}", - "FolderTypeMixed": "Gemengde inhoud", - "FolderTypeMovies": "Films", - "FolderTypeMusic": "Muziek", - "FolderTypeAdultVideos": "Adult video's", - "FolderTypePhotos": "Foto's", - "FolderTypeMusicVideos": "Muziek video's", - "FolderTypeHomeVideos": "Thuis video's", - "FolderTypeGames": "Games", - "FolderTypeBooks": "Boeken", - "FolderTypeTvShows": "TV", - "FolderTypeInherit": "overerven", - "HeaderCastCrew": "Cast & Crew", - "HeaderPeople": "Personen", + "Latest": "Nieuwste", "ValueSpecialEpisodeName": "Speciaal - {0}", - "LabelChapterName": "Hoofdstuk {0}", + "Inherit": "Overerven", + "Books": "Boeken", + "Music": "Muziek", + "Games": "Spellen", + "Photos": "Foto's", + "MixedContent": "Gemengde inhoud", + "MusicVideos": "Muziek video's", + "HomeVideos": "Thuis video's", + "Playlists": "Afspeellijsten", + "HeaderRecordingGroups": "Opname groepen", + "HeaderContinueWatching": "Kijken hervatten", + "HeaderFavoriteArtists": "Favoriete artiesten", + "HeaderFavoriteSongs": "Favoriete titels", + "HeaderAlbumArtists": "Album artiesten", + "HeaderFavoriteAlbums": "Favoriete albums", + "HeaderFavoriteEpisodes": "Favoriete Afleveringen", + "HeaderFavoriteShows": "Favoriete Shows", + "HeaderNextUp": "Volgende", + "Favorites": "Favorieten", + "Collections": "Collecties", + "Channels": "Kanalen", + "Movies": "Films", + "Albums": "Albums", + "Artists": "Artiesten", + "Folders": "Mappen", + "Songs": "Titels", + "TvShows": "TV Shows", + "Shows": "Series", + "Genres": "Genres", "NameSeasonNumber": "Seizoen {0}", - "LabelExit": "Afsluiten", - "LabelVisitCommunity": "Bezoek Gemeenschap", - "LabelGithub": "Github", - "LabelApiDocumentation": "Api documentatie", - "LabelDeveloperResources": "Ontwikkelaars bronnen", - "LabelBrowseLibrary": "Bekijk bibliotheek", - "LabelConfigureServer": "Emby Configureren", - "LabelRestartServer": "Server herstarten", - "CategorySync": "Sync", - "CategoryUser": "Gebruiker", - "CategorySystem": "Systeem", - "CategoryApplication": "Toepassing", - "CategoryPlugin": "Plug-in", - "NotificationOptionPluginError": "Plug-in fout", - "NotificationOptionApplicationUpdateAvailable": "Programma-update beschikbaar", - "NotificationOptionApplicationUpdateInstalled": "Programma-update ge\u00efnstalleerd", - "NotificationOptionPluginUpdateInstalled": "Plug-in-update ge\u00efnstalleerd", - "NotificationOptionPluginInstalled": "Plug-in ge\u00efnstalleerd", - "NotificationOptionPluginUninstalled": "Plug-in verwijderd", - "NotificationOptionVideoPlayback": "Video afspelen gestart", - "NotificationOptionAudioPlayback": "Geluid afspelen gestart", - "NotificationOptionGamePlayback": "Game gestart", - "NotificationOptionVideoPlaybackStopped": "Video afspelen gestopt", - "NotificationOptionAudioPlaybackStopped": "Geluid afspelen gestopt", - "NotificationOptionGamePlaybackStopped": "Afspelen spel gestopt", - "NotificationOptionTaskFailed": "Mislukken van de geplande taak", - "NotificationOptionInstallationFailed": "Mislukken van de installatie", - "NotificationOptionNewLibraryContent": "Nieuwe content toegevoegd", - "NotificationOptionNewLibraryContentMultiple": "Nieuwe content toegevoegd (meerdere)", - "NotificationOptionCameraImageUploaded": "Camera afbeelding ge\u00fcpload", - "NotificationOptionUserLockedOut": "Gebruikersaccount vergrendeld", - "NotificationOptionServerRestartRequired": "Server herstart nodig", - "ViewTypePlaylists": "Afspeellijsten", - "ViewTypeMovies": "Films", - "ViewTypeTvShows": "TV", - "ViewTypeGames": "Games", - "ViewTypeMusic": "Muziek", - "ViewTypeMusicGenres": "Genres", - "ViewTypeMusicArtists": "Artiesten", - "ViewTypeBoxSets": "Collecties", - "ViewTypeChannels": "Kanalen", - "ViewTypeLiveTV": "Live TV", - "ViewTypeLiveTvNowPlaying": "Nu uitgezonden", - "ViewTypeLatestGames": "Nieuwste games", - "ViewTypeRecentlyPlayedGames": "Recent gespeelt", - "ViewTypeGameFavorites": "Favorieten", - "ViewTypeGameSystems": "Game systemen", - "ViewTypeGameGenres": "Genres", - "ViewTypeTvResume": "Hervatten", - "ViewTypeTvNextUp": "Volgende", - "ViewTypeTvLatest": "Nieuwste", - "ViewTypeTvShowSeries": "Series", - "ViewTypeTvGenres": "Genres", - "ViewTypeTvFavoriteSeries": "Favoriete Series", - "ViewTypeTvFavoriteEpisodes": "Favoriete Afleveringen", - "ViewTypeMovieResume": "Hervatten", - "ViewTypeMovieLatest": "Nieuwste", - "ViewTypeMovieMovies": "Films", - "ViewTypeMovieCollections": "Collecties", - "ViewTypeMovieFavorites": "Favorieten", - "ViewTypeMovieGenres": "Genres", - "ViewTypeMusicLatest": "Nieuwste", - "ViewTypeMusicPlaylists": "Afspeellijsten", - "ViewTypeMusicAlbums": "Albums", - "ViewTypeMusicAlbumArtists": "Album artiesten", - "HeaderOtherDisplaySettings": "Beeld instellingen", - "ViewTypeMusicSongs": "Nummers", - "ViewTypeMusicFavorites": "Favorieten", - "ViewTypeMusicFavoriteAlbums": "Favoriete albums", - "ViewTypeMusicFavoriteArtists": "Favoriete artiesten", - "ViewTypeMusicFavoriteSongs": "Favoriete nummers", - "ViewTypeFolders": "Mappen", - "ViewTypeLiveTvRecordingGroups": "Opnamen", - "ViewTypeLiveTvChannels": "Kanalen", + "AppDeviceValues": "App: {0}, Apparaat: {1}", + "UserDownloadingItemWithValues": "{0} download {1}", + "HeaderLiveTV": "Live TV", + "ChapterNameValue": "Hoofdstuk {0}", "ScheduledTaskFailedWithName": "{0} is mislukt", "LabelRunningTimeValue": "Looptijd: {0}", "ScheduledTaskStartedWithName": "{0} is gestart", "VersionNumber": "Versie {0}", "PluginInstalledWithName": "{0} is ge\u00efnstalleerd", + "StartupEmbyServerIsLoading": "Emby Server is aan het laden, probeer het later opnieuw.", "PluginUpdatedWithName": "{0} is bijgewerkt", "PluginUninstalledWithName": "{0} is gede\u00efnstalleerd", "ItemAddedWithName": "{0} is toegevoegd aan de bibliotheek", @@ -106,73 +50,47 @@ "UserOnlineFromDevice": "{0} heeft verbinding met {1}", "ProviderValue": "Aanbieder: {0}", "SubtitlesDownloadedForItem": "Ondertiteling voor {0} is gedownload", - "UserConfigurationUpdatedWithName": "Gebruikersinstellingen voor {0} zijn bijgewerkt", "UserCreatedWithName": "Gebruiker {0} is aangemaakt", "UserPasswordChangedWithName": "Wachtwoord voor {0} is gewijzigd", "UserDeletedWithName": "Gebruiker {0} is verwijderd", + "UserConfigurationUpdatedWithName": "Gebruikersinstellingen voor {0} zijn bijgewerkt", "MessageServerConfigurationUpdated": "Server configuratie is bijgewerkt", "MessageNamedServerConfigurationUpdatedWithValue": "Sectie {0} van de server configuratie is bijgewerkt", "MessageApplicationUpdated": "Emby Server is bijgewerkt", "FailedLoginAttemptWithUserName": "Mislukte aanmeld poging van {0}", "AuthenticationSucceededWithUserName": "{0} is succesvol geverifieerd", - "DeviceOfflineWithName": "{0} is losgekoppeld", - "UserLockedOutWithName": "Gebruikersaccount {0} is vergrendeld", "UserOfflineFromDevice": "Verbinding van {0} met {1} is verbroken", + "DeviceOfflineWithName": "{0} is losgekoppeld", "UserStartedPlayingItemWithValues": "{0} heeft afspelen van {1} gestart", "UserStoppedPlayingItemWithValues": "{0} heeft afspelen van {1} gestopt", + "NotificationOptionPluginError": "Plug-in fout", + "NotificationOptionApplicationUpdateAvailable": "Programma-update beschikbaar", + "NotificationOptionApplicationUpdateInstalled": "Programma-update ge\u00efnstalleerd", + "NotificationOptionPluginUpdateInstalled": "Plug-in-update ge\u00efnstalleerd", + "NotificationOptionPluginInstalled": "Plug-in ge\u00efnstalleerd", + "NotificationOptionPluginUninstalled": "Plug-in verwijderd", + "NotificationOptionVideoPlayback": "Video gestart", + "NotificationOptionAudioPlayback": "Geluid gestart", + "NotificationOptionGamePlayback": "Spel gestart", + "NotificationOptionVideoPlaybackStopped": "Video gestopt", + "NotificationOptionAudioPlaybackStopped": "Geluid gestopt", + "NotificationOptionGamePlaybackStopped": "Spel gestopt", + "NotificationOptionTaskFailed": "Geplande taak mislukt", + "NotificationOptionInstallationFailed": "Installatie mislukt", + "NotificationOptionNewLibraryContent": "Nieuwe content toegevoegd", + "NotificationOptionCameraImageUploaded": "Camera afbeelding ge\u00fcpload", + "NotificationOptionUserLockedOut": "Gebruikersaccount vergrendeld", + "NotificationOptionServerRestartRequired": "Server herstart nodig", + "UserLockedOutWithName": "Gebruikersaccount {0} is vergrendeld", "SubtitleDownloadFailureForItem": "Downloaden van ondertiteling voor {0} is mislukt", - "HeaderUnidentified": "One\u00efdentificaard", - "HeaderImagePrimary": "Primair", - "HeaderImageBackdrop": "Achtergrond", - "HeaderImageLogo": "Logo", - "HeaderUserPrimaryImage": "Afbeelding gebruiker", - "HeaderOverview": "Overzicht", - "HeaderShortOverview": "Kort overzicht", - "HeaderType": "Type", - "HeaderSeverity": "Ernst", - "HeaderUser": "Gebruiker", - "HeaderName": "Naam", - "HeaderDate": "Datum", - "HeaderPremiereDate": "Premi\u00e8re Datum", - "HeaderDateAdded": "Datum toegevoegd", - "HeaderReleaseDate": "Uitgave datum", - "HeaderRuntime": "Speelduur", - "HeaderPlayCount": "Afspeel telling", - "HeaderSeason": "Seizoen", - "HeaderSeasonNumber": "Seizoen nummer", - "HeaderSeries": "Series:", - "HeaderNetwork": "Zender", - "HeaderYear": "Jaar:", - "HeaderYears": "Jaren:", - "HeaderParentalRating": "Kijkwijzer classificatie", - "HeaderCommunityRating": "Gemeenschap cijfer", - "HeaderTrailers": "Trailers", - "HeaderSpecials": "Specials", - "HeaderGameSystems": "Game systemen", - "HeaderPlayers": "Spelers:", - "HeaderAlbumArtists": "Album artiesten", - "HeaderAlbums": "Albums", - "HeaderDisc": "Schijf", - "HeaderTrack": "Track", - "HeaderAudio": "Geluid", - "HeaderVideo": "Video", - "HeaderEmbeddedImage": "Ingesloten afbeelding", - "HeaderResolution": "Resolutie", - "HeaderSubtitles": "Ondertiteling", - "HeaderGenres": "Genres", - "HeaderCountries": "Landen", - "HeaderStatus": "Status", - "HeaderTracks": "Tracks", - "HeaderMusicArtist": "Muziek artiest", - "HeaderLocked": "Vergrendeld", - "HeaderStudios": "Studio's", - "HeaderActor": "Acteurs", - "HeaderComposer": "Componisten", - "HeaderDirector": "Regiseurs", - "HeaderGuestStar": "Gast ster", - "HeaderProducer": "Producenten", - "HeaderWriter": "Schrijvers", - "HeaderParentalRatings": "Ouderlijke toezicht", - "HeaderCommunityRatings": "Gemeenschapswaardering", - "StartupEmbyServerIsLoading": "Emby Server is aan het laden, probeer het later opnieuw." + "Sync": "Synchronisatie", + "User": "Gebruiker", + "System": "Systeem", + "Application": "Toepassing", + "Plugin": "Plug-in", + "LabelExit": "Afsluiten", + "LabelVisitCommunity": "Bezoek Gemeenschap", + "LabelBrowseLibrary": "Bekijk bibliotheek", + "LabelConfigureServer": "Emby Configureren", + "LabelRestartServer": "Server herstarten" }
\ No newline at end of file diff --git a/Emby.Server.Implementations/Localization/Core/pl.json b/Emby.Server.Implementations/Localization/Core/pl.json index cdaa87c4d..24ac0d973 100644 --- a/Emby.Server.Implementations/Localization/Core/pl.json +++ b/Emby.Server.Implementations/Localization/Core/pl.json @@ -1,178 +1,96 @@ { - "DbUpgradeMessage": "Prosz\u0119 czeka\u0107 na koniec aktualizacji biblioteki. Post\u0119p: {0}%", + "Latest": "Ostatnio dodane do", + "ValueSpecialEpisodeName": "Specjalne - {0}", + "Inherit": "Dziedzicz", + "Books": "Ksi\u0105\u017cki", + "Music": "Muzyka", + "Games": "Gry", + "Photos": "Zdj\u0119cia", + "MixedContent": "Zawarto\u015b\u0107 mieszana", + "MusicVideos": "Teledyski", + "HomeVideos": "Nagrania prywatne", + "Playlists": "Listy odtwarzania", + "HeaderRecordingGroups": "Grupy nagra\u0144", + "HeaderContinueWatching": "Kontynuuj ogl\u0105danie", + "HeaderFavoriteArtists": "Wykonawcy ulubieni", + "HeaderFavoriteSongs": "Utwory ulubione", + "HeaderAlbumArtists": "Wykonawcy album\u00f3w", + "HeaderFavoriteAlbums": "Albumy ulubione", + "HeaderFavoriteEpisodes": "Odcinki ulubione", + "HeaderFavoriteShows": "Seriale ulubione", + "HeaderNextUp": "Do obejrzenia", + "Favorites": "Ulubione", + "Collections": "Kolekcje", + "Channels": "Kana\u0142y", + "Movies": "Filmy", + "Albums": "Albumy", + "Artists": "Wykonawcy", + "Folders": "Foldery", + "Songs": "Utwory", + "TvShows": "TV Shows", + "Shows": "Seriale", + "Genres": "Gatunki", + "NameSeasonNumber": "Sezon {0}", "AppDeviceValues": "Aplikacja: {0}, Urz\u0105dzenie: {1}", "UserDownloadingItemWithValues": "{0} pobiera {1}", - "FolderTypeMixed": "Zawarto\u015b\u0107 mieszana", - "FolderTypeMovies": "Filmy", - "FolderTypeMusic": "Muzyka", - "FolderTypeAdultVideos": "Filmy dla doros\u0142ych", - "FolderTypePhotos": "Zdj\u0119cia", - "FolderTypeMusicVideos": "Teledyski", - "FolderTypeHomeVideos": "Filmy domowe", - "FolderTypeGames": "Gry", - "FolderTypeBooks": "Ksi\u0105\u017cki", - "FolderTypeTvShows": "TV", - "FolderTypeInherit": "Dziedzicz", - "HeaderCastCrew": "Obsada & Eikpa", - "HeaderPeople": "Ludzie", - "ValueSpecialEpisodeName": "Specjalny - {0}", - "LabelChapterName": "Rozdzia\u0142 {0}", - "NameSeasonNumber": "Sezon {0}", - "LabelExit": "Wyj\u015bcie", - "LabelVisitCommunity": "Odwied\u017a spo\u0142eczno\u015b\u0107", - "LabelGithub": "Github", - "LabelApiDocumentation": "Dokumantacja API", - "LabelDeveloperResources": "Materia\u0142y dla deweloper\u00f3w", - "LabelBrowseLibrary": "Przegl\u0105daj bibliotek\u0119", - "LabelConfigureServer": "Konfiguracja Emby", - "LabelRestartServer": "Restart serwera", - "CategorySync": "Sync", - "CategoryUser": "U\u017cytkownik", - "CategorySystem": "System", - "CategoryApplication": "Aplikacja", - "CategoryPlugin": "Wtyczka", - "NotificationOptionPluginError": "Niepowodzenie wtyczki", + "HeaderLiveTV": "Telewizja", + "ChapterNameValue": "Rozdzia\u0142 {0}", + "ScheduledTaskFailedWithName": "Nieudane {0}", + "LabelRunningTimeValue": "Czas trwania: {0}", + "ScheduledTaskStartedWithName": "Rozpocz\u0119to {0}", + "VersionNumber": "Wersja {0}", + "PluginInstalledWithName": "{0} zosta\u0142o zainstalowane", + "StartupEmbyServerIsLoading": "Twa wczytywanie serwera Emby. Spr\u00f3buj ponownie za chwil\u0119.", + "PluginUpdatedWithName": "{0} zaktualizowane", + "PluginUninstalledWithName": "{0} odinstalowane", + "ItemAddedWithName": "{0} zosta\u0142o dodane do biblioteki", + "ItemRemovedWithName": "{0} zosta\u0142o usuni\u0119te z biblioteki", + "LabelIpAddressValue": "Adres IP: {0}", + "DeviceOnlineWithName": "{0} po\u0142\u0105czy\u0142 si\u0119", + "UserOnlineFromDevice": "{0} po\u0142\u0105czy\u0142 si\u0119 z {1}", + "ProviderValue": "Dostawca: {0}", + "SubtitlesDownloadedForItem": "Pobrano napisy dla {0}", + "UserCreatedWithName": "U\u017cytkownik {0} zosta\u0142 utworzony", + "UserPasswordChangedWithName": "Has\u0142o u\u017cytkownika {0} zosta\u0142o zmienione", + "UserDeletedWithName": "U\u017cytkownik {0} zosta\u0142 usuni\u0119ty", + "UserConfigurationUpdatedWithName": "Konfiguracja u\u017cytkownika {0} zosta\u0142a zaktualizowana", + "MessageServerConfigurationUpdated": "Konfiguracja serwera zosta\u0142a zaktualizowana", + "MessageNamedServerConfigurationUpdatedWithValue": "Sekcja {0} konfiguracji serwera zosta\u0142a zaktualizowana", + "MessageApplicationUpdated": "Serwer Emby zosta\u0142 zaktualizowany", + "FailedLoginAttemptWithUserName": "Pr\u00f3ba logowania przez {0} zako\u0144czona niepowodzeniem", + "AuthenticationSucceededWithUserName": "{0} zosta\u0142 pomy\u015blnie uwierzytelniony", + "UserOfflineFromDevice": "{0} z {1} zosta\u0142 roz\u0142\u0105czony", + "DeviceOfflineWithName": "{0} zosta\u0142 roz\u0142\u0105czony", + "UserStartedPlayingItemWithValues": "{0} rozpocz\u0105\u0142 odtwarzanie {1}", + "UserStoppedPlayingItemWithValues": "{0} zatrzyma\u0142 odtwarzanie {1}", + "NotificationOptionPluginError": "Awaria wtyczki", "NotificationOptionApplicationUpdateAvailable": "Dost\u0119pna aktualizacja aplikacji", "NotificationOptionApplicationUpdateInstalled": "Zainstalowano aktualizacj\u0119 aplikacji", "NotificationOptionPluginUpdateInstalled": "Zainstalowano aktualizacj\u0119 wtyczki", "NotificationOptionPluginInstalled": "Zainstalowano wtyczk\u0119", "NotificationOptionPluginUninstalled": "Odinstalowano wtyczk\u0119", "NotificationOptionVideoPlayback": "Rozpocz\u0119to odtwarzanie wideo", - "NotificationOptionAudioPlayback": "Rozpocz\u0119to odtwarzanie audio", + "NotificationOptionAudioPlayback": "Rozpocz\u0119to odtwarzanie muzyki", "NotificationOptionGamePlayback": "Odtwarzanie gry rozpocz\u0119te", "NotificationOptionVideoPlaybackStopped": "Odtwarzanie wideo zatrzymane", - "NotificationOptionAudioPlaybackStopped": "Odtwarzane audio zatrzymane", + "NotificationOptionAudioPlaybackStopped": "Odtwarzane d\u017awi\u0119ku zatrzymane", "NotificationOptionGamePlaybackStopped": "Odtwarzanie gry zatrzymane", - "NotificationOptionTaskFailed": "Niepowodzenie zaplanowanego zadania", + "NotificationOptionTaskFailed": "Awaria zaplanowanego zadania", "NotificationOptionInstallationFailed": "Niepowodzenie instalacji", - "NotificationOptionNewLibraryContent": "Nowa zawarto\u015b\u0107 dodana", - "NotificationOptionNewLibraryContentMultiple": "Nowa zawarto\u015b\u0107 dodana (wiele)", - "NotificationOptionCameraImageUploaded": "Obraz z Kamery dodany", + "NotificationOptionNewLibraryContent": "Dodano now\u0105 zawarto\u015b\u0107", + "NotificationOptionCameraImageUploaded": "Przekazano obraz z urz\u0105dzenia mobilnego", "NotificationOptionUserLockedOut": "U\u017cytkownik zablokowany", - "NotificationOptionServerRestartRequired": "Restart serwera wymagany", - "ViewTypePlaylists": "Playlisty", - "ViewTypeMovies": "Filmy", - "ViewTypeTvShows": "TV", - "ViewTypeGames": "Gry", - "ViewTypeMusic": "Muzyka", - "ViewTypeMusicGenres": "Gatunki", - "ViewTypeMusicArtists": "Arty\u015bci", - "ViewTypeBoxSets": "Kolekcje", - "ViewTypeChannels": "Kana\u0142y", - "ViewTypeLiveTV": "TV Na \u017bywo", - "ViewTypeLiveTvNowPlaying": "Teraz Transmitowane", - "ViewTypeLatestGames": "Ostatnie Gry", - "ViewTypeRecentlyPlayedGames": "Ostatnio Odtwarzane", - "ViewTypeGameFavorites": "Ulubione", - "ViewTypeGameSystems": "Systemy Gier Wideo", - "ViewTypeGameGenres": "Gatunki", - "ViewTypeTvResume": "Wzn\u00f3w", - "ViewTypeTvNextUp": "Nast\u0119pny", - "ViewTypeTvLatest": "Najnowsze", - "ViewTypeTvShowSeries": "Seriale", - "ViewTypeTvGenres": "Gatunki", - "ViewTypeTvFavoriteSeries": "Ulubione Seriale", - "ViewTypeTvFavoriteEpisodes": "Ulubione Odcinki", - "ViewTypeMovieResume": "Wzn\u00f3w", - "ViewTypeMovieLatest": "Najnowsze", - "ViewTypeMovieMovies": "Filmy", - "ViewTypeMovieCollections": "Kolekcje", - "ViewTypeMovieFavorites": "Ulubione", - "ViewTypeMovieGenres": "Gatunki", - "ViewTypeMusicLatest": "Najnowsze", - "ViewTypeMusicPlaylists": "Playlisty", - "ViewTypeMusicAlbums": "Albumy", - "ViewTypeMusicAlbumArtists": "Arty\u015bci albumu", - "HeaderOtherDisplaySettings": "Ustawienia Wy\u015bwietlania", - "ViewTypeMusicSongs": "Utwory", - "ViewTypeMusicFavorites": "Ulubione", - "ViewTypeMusicFavoriteAlbums": "Ulubione Albumy", - "ViewTypeMusicFavoriteArtists": "Ulubieni Arty\u015bci", - "ViewTypeMusicFavoriteSongs": "Ulubione Utwory", - "ViewTypeFolders": "Foldery", - "ViewTypeLiveTvRecordingGroups": "Nagrania", - "ViewTypeLiveTvChannels": "Kana\u0142y", - "ScheduledTaskFailedWithName": "{0} niepowodze\u0144", - "LabelRunningTimeValue": "Czas trwania: {0}", - "ScheduledTaskStartedWithName": "{0} rozpocz\u0119te", - "VersionNumber": "Wersja {0}", - "PluginInstalledWithName": "{0} zainstalowanych", - "PluginUpdatedWithName": "{0} zaktualizowanych", - "PluginUninstalledWithName": "{0} odinstalowanych", - "ItemAddedWithName": "{0} dodanych do biblioteki", - "ItemRemovedWithName": "{0} usuni\u0119tych z biblioteki", - "LabelIpAddressValue": "Adres IP: {0}", - "DeviceOnlineWithName": "{0} po\u0142\u0105czonych", - "UserOnlineFromDevice": "{0} jest online od {1}", - "ProviderValue": "Dostawca: {0}", - "SubtitlesDownloadedForItem": "Napisy pobrane dla {0}", - "UserConfigurationUpdatedWithName": "Konfiguracja u\u017cytkownika zosta\u0142a zaktualizowana dla {0}", - "UserCreatedWithName": "U\u017cytkownik {0} zosta\u0142 utworzony", - "UserPasswordChangedWithName": "Has\u0142o zosta\u0142o zmienione dla u\u017cytkownika {0}", - "UserDeletedWithName": "u\u017cytkownik {0} zosta\u0142 usuni\u0119ty", - "MessageServerConfigurationUpdated": "Konfiguracja serwera zosta\u0142a zaktualizowana", - "MessageNamedServerConfigurationUpdatedWithValue": "Sekcja {0} konfiguracji serwera zosta\u0142a zaktualizowana", - "MessageApplicationUpdated": "Serwer Emby zosta\u0142 zaktualizowany", - "FailedLoginAttemptWithUserName": "Nieudana pr\u00f3ba logowania z {0}", - "AuthenticationSucceededWithUserName": "{0} zaktualizowanych z powodzeniem", - "DeviceOfflineWithName": "{0} zosta\u0142o od\u0142aczonych", + "NotificationOptionServerRestartRequired": "Wymagane ponowne uruchomienie serwera", "UserLockedOutWithName": "U\u017cytkownik {0} zosta\u0142 zablokowany", - "UserOfflineFromDevice": "{0} zosta\u0142o od\u0142\u0105czonych od {1}", - "UserStartedPlayingItemWithValues": "{0} rozpocz\u0105\u0142 odtwarzanie {1}", - "UserStoppedPlayingItemWithValues": "{0} zatrzyma\u0142 odtwarzanie {1}", - "SubtitleDownloadFailureForItem": "Napisy niepobrane dla {0}", - "HeaderUnidentified": "Niezidentyfikowane", - "HeaderImagePrimary": "Priorytetowy", - "HeaderImageBackdrop": "Obraz t\u0142a", - "HeaderImageLogo": "Logo", - "HeaderUserPrimaryImage": "Avatar u\u017cytkownika", - "HeaderOverview": "Opis", - "HeaderShortOverview": "Kr\u00f3tki Opis", - "HeaderType": "Typ", - "HeaderSeverity": "Rygor", - "HeaderUser": "U\u017cytkownik", - "HeaderName": "Nazwa", - "HeaderDate": "Data", - "HeaderPremiereDate": "Data premiery", - "HeaderDateAdded": "Data dodania", - "HeaderReleaseDate": "Data wydania", - "HeaderRuntime": "D\u0142ugo\u015b\u0107 filmu", - "HeaderPlayCount": "Play Count", - "HeaderSeason": "Sezon", - "HeaderSeasonNumber": "Numer sezonu", - "HeaderSeries": "Seriale:", - "HeaderNetwork": "Sie\u0107", - "HeaderYear": "Rok:", - "HeaderYears": "Lata:", - "HeaderParentalRating": "Parental Rating", - "HeaderCommunityRating": "Ocena spo\u0142eczno\u015bci", - "HeaderTrailers": "Zwiastuny", - "HeaderSpecials": "Specjalne", - "HeaderGameSystems": "Systemy gier", - "HeaderPlayers": "Players:", - "HeaderAlbumArtists": "Album Artists", - "HeaderAlbums": "Albumy", - "HeaderDisc": "P\u0142yta", - "HeaderTrack": "\u015acie\u017cka", - "HeaderAudio": "Audio", - "HeaderVideo": "Wideo", - "HeaderEmbeddedImage": "Osadzony obraz", - "HeaderResolution": "Rozdzielczo\u015b\u0107", - "HeaderSubtitles": "Napisy", - "HeaderGenres": "Gatunki", - "HeaderCountries": "Kraje", - "HeaderStatus": "Status", - "HeaderTracks": "Utwory", - "HeaderMusicArtist": "Wykonawcy muzyczni", - "HeaderLocked": "Zablokowane", - "HeaderStudios": "Studia", - "HeaderActor": "Aktorzy", - "HeaderComposer": "Kopozytorzy", - "HeaderDirector": "Re\u017cyszerzy", - "HeaderGuestStar": "Go\u015b\u0107 specjalny", - "HeaderProducer": "Producenci", - "HeaderWriter": "Scenarzy\u015bci", - "HeaderParentalRatings": "Ocena rodzicielska", - "HeaderCommunityRatings": "Ocena spo\u0142eczno\u015bci", - "StartupEmbyServerIsLoading": "Serwer Emby si\u0119 \u0142aduje. Prosz\u0119 spr\u00f3bowa\u0107 za chwil\u0119." + "SubtitleDownloadFailureForItem": "Pobieranie napis\u00f3w dla {0} zako\u0144czone niepowodzeniem", + "Sync": "Synchronizacja", + "User": "U\u017cytkownik", + "System": "System", + "Application": "Aplikacja", + "Plugin": "Wtyczka", + "LabelExit": "Wyj\u015bcie", + "LabelVisitCommunity": "Odwied\u017a spo\u0142eczno\u015b\u0107", + "LabelBrowseLibrary": "Przegl\u0105daj bibliotek\u0119", + "LabelConfigureServer": "Konfiguracja Emby", + "LabelRestartServer": "Uruchom serwer ponownie" }
\ No newline at end of file diff --git a/Emby.Server.Implementations/Localization/Core/pt-BR.json b/Emby.Server.Implementations/Localization/Core/pt-BR.json index 67f204b2e..196a6b78b 100644 --- a/Emby.Server.Implementations/Localization/Core/pt-BR.json +++ b/Emby.Server.Implementations/Localization/Core/pt-BR.json @@ -1,178 +1,96 @@ { - "DbUpgradeMessage": "Por favor, aguarde enquanto a base de dados do Servidor Emby \u00e9 atualizada. {0}% completo.", - "AppDeviceValues": "App: {0}, Dispositivo: {1}", - "UserDownloadingItemWithValues": "{0} est\u00e1 fazendo download de {1}", - "FolderTypeMixed": "Conte\u00fado misto", - "FolderTypeMovies": "Filmes", - "FolderTypeMusic": "M\u00fasica", - "FolderTypeAdultVideos": "V\u00eddeos adultos", - "FolderTypePhotos": "Fotos", - "FolderTypeMusicVideos": "V\u00eddeos musicais", - "FolderTypeHomeVideos": "V\u00eddeos caseiros", - "FolderTypeGames": "Jogos", - "FolderTypeBooks": "Livros", - "FolderTypeTvShows": "TV", - "FolderTypeInherit": "Herdar", - "HeaderCastCrew": "Elenco & Equipe", - "HeaderPeople": "Pessoas", - "ValueSpecialEpisodeName": "Especial - {0}", - "LabelChapterName": "Cap\u00edtulo {0}", + "Latest": "Recente", + "ValueSpecialEpisodeName": "Especial - {0}", + "Inherit": "Herdar", + "Books": "Livros", + "Music": "M\u00fasica", + "Games": "Jogos", + "Photos": "Fotos", + "MixedContent": "Conte\u00fado misto", + "MusicVideos": "V\u00eddeos musicais", + "HomeVideos": "V\u00eddeos caseiros", + "Playlists": "Listas de Reprodu\u00e7\u00e3o", + "HeaderRecordingGroups": "Grupos de Grava\u00e7\u00e3o", + "HeaderContinueWatching": "Continuar Assistindo", + "HeaderFavoriteArtists": "Artistas Favoritos", + "HeaderFavoriteSongs": "M\u00fasicas Favoritas", + "HeaderAlbumArtists": "Artistas do \u00c1lbum", + "HeaderFavoriteAlbums": "\u00c1lbuns Favoritos", + "HeaderFavoriteEpisodes": "Epis\u00f3dios Favoritos", + "HeaderFavoriteShows": "S\u00e9ries Favoritas", + "HeaderNextUp": "Pr\u00f3ximos", + "Favorites": "Favoritos", + "Collections": "Colet\u00e2neas", + "Channels": "Canais", + "Movies": "Filmes", + "Albums": "\u00c1lbuns", + "Artists": "Artistas", + "Folders": "Pastas", + "Songs": "M\u00fasicas", + "TvShows": "TV Shows", + "Shows": "S\u00e9ries", + "Genres": "G\u00eaneros", "NameSeasonNumber": "Temporada {0}", - "LabelExit": "Sair", - "LabelVisitCommunity": "Visitar a Comunidade", - "LabelGithub": "Github", - "LabelApiDocumentation": "Documenta\u00e7\u00e3o da Api", - "LabelDeveloperResources": "Recursos do Desenvolvedor", - "LabelBrowseLibrary": "Explorar Biblioteca", - "LabelConfigureServer": "Configurar o Emby", - "LabelRestartServer": "Reiniciar Servidor", - "CategorySync": "Sincroniza\u00e7\u00e3o", - "CategoryUser": "Usu\u00e1rio", - "CategorySystem": "Sistema", - "CategoryApplication": "Aplica\u00e7\u00e3o", - "CategoryPlugin": "Plugin", - "NotificationOptionPluginError": "Falha no plugin", - "NotificationOptionApplicationUpdateAvailable": "Atualiza\u00e7\u00e3o da aplica\u00e7\u00e3o disponivel", - "NotificationOptionApplicationUpdateInstalled": "Atualiza\u00e7\u00e3o da aplica\u00e7\u00e3o instalada", - "NotificationOptionPluginUpdateInstalled": "Atualiza\u00e7\u00e3o do plugin instalada", - "NotificationOptionPluginInstalled": "Plugin instalado", - "NotificationOptionPluginUninstalled": "Plugin desinstalado", - "NotificationOptionVideoPlayback": "Reprodu\u00e7\u00e3o de v\u00eddeo iniciada", - "NotificationOptionAudioPlayback": "Reprodu\u00e7\u00e3o de \u00e1udio iniciada", - "NotificationOptionGamePlayback": "Reprodu\u00e7\u00e3o de jogo iniciada", - "NotificationOptionVideoPlaybackStopped": "Reprodu\u00e7\u00e3o de v\u00eddeo parada", - "NotificationOptionAudioPlaybackStopped": "Reprodu\u00e7\u00e3o de \u00e1udio parada", - "NotificationOptionGamePlaybackStopped": "Reprodu\u00e7\u00e3o de jogo parada", - "NotificationOptionTaskFailed": "Falha na tarefa agendada", - "NotificationOptionInstallationFailed": "Falha na instala\u00e7\u00e3o", - "NotificationOptionNewLibraryContent": "Novo conte\u00fado adicionado", - "NotificationOptionNewLibraryContentMultiple": "Novo conte\u00fado adicionado (m\u00faltiplo)", - "NotificationOptionCameraImageUploaded": "Imagem da c\u00e2mera carregada", - "NotificationOptionUserLockedOut": "Usu\u00e1rio bloqueado", - "NotificationOptionServerRestartRequired": "Necessidade de reiniciar servidor", - "ViewTypePlaylists": "Listas de Reprodu\u00e7\u00e3o", - "ViewTypeMovies": "Filmes", - "ViewTypeTvShows": "TV", - "ViewTypeGames": "Jogos", - "ViewTypeMusic": "M\u00fasicas", - "ViewTypeMusicGenres": "G\u00eaneros", - "ViewTypeMusicArtists": "Artistas", - "ViewTypeBoxSets": "Cole\u00e7\u00f5es", - "ViewTypeChannels": "Canais", - "ViewTypeLiveTV": "TV ao Vivo", - "ViewTypeLiveTvNowPlaying": "Exibindo Agora", - "ViewTypeLatestGames": "Jogos Recentes", - "ViewTypeRecentlyPlayedGames": "Reproduzido Recentemente", - "ViewTypeGameFavorites": "Favoritos", - "ViewTypeGameSystems": "Sistemas de Jogo", - "ViewTypeGameGenres": "G\u00eaneros", - "ViewTypeTvResume": "Retomar", - "ViewTypeTvNextUp": "Pr\u00f3ximos", - "ViewTypeTvLatest": "Recentes", - "ViewTypeTvShowSeries": "S\u00e9ries", - "ViewTypeTvGenres": "G\u00eaneros", - "ViewTypeTvFavoriteSeries": "S\u00e9ries Favoritas", - "ViewTypeTvFavoriteEpisodes": "Epis\u00f3dios Favoritos", - "ViewTypeMovieResume": "Retomar", - "ViewTypeMovieLatest": "Recentes", - "ViewTypeMovieMovies": "Filmes", - "ViewTypeMovieCollections": "Cole\u00e7\u00f5es", - "ViewTypeMovieFavorites": "Favoritos", - "ViewTypeMovieGenres": "G\u00eaneros", - "ViewTypeMusicLatest": "Recentes", - "ViewTypeMusicPlaylists": "Listas de Reprodu\u00e7\u00e3o", - "ViewTypeMusicAlbums": "\u00c1lbuns", - "ViewTypeMusicAlbumArtists": "Artistas do \u00c1lbum", - "HeaderOtherDisplaySettings": "Ajustes de Exibi\u00e7\u00e3o", - "ViewTypeMusicSongs": "M\u00fasicas", - "ViewTypeMusicFavorites": "Favoritos", - "ViewTypeMusicFavoriteAlbums": "\u00c1lbuns Favoritos", - "ViewTypeMusicFavoriteArtists": "Artistas Favoritos", - "ViewTypeMusicFavoriteSongs": "M\u00fasicas Favoritas", - "ViewTypeFolders": "Pastas", - "ViewTypeLiveTvRecordingGroups": "Grava\u00e7\u00f5es", - "ViewTypeLiveTvChannels": "Canais", + "AppDeviceValues": "App: {0}, Dispositivo: {1}", + "UserDownloadingItemWithValues": "{0} est\u00e1 baixando {1}", + "HeaderLiveTV": "TV ao Vivo", + "ChapterNameValue": "Cap\u00edtulo {0}", "ScheduledTaskFailedWithName": "{0} falhou", - "LabelRunningTimeValue": "Dura\u00e7\u00e3o: {0}", - "ScheduledTaskStartedWithName": "{0} iniciado", + "LabelRunningTimeValue": "Tempo de execu\u00e7\u00e3o: {0}", + "ScheduledTaskStartedWithName": "{0} iniciada", "VersionNumber": "Vers\u00e3o {0}", "PluginInstalledWithName": "{0} foi instalado", + "StartupEmbyServerIsLoading": "O Servidor Emby est\u00e1 carregando. Por favor tente novamente em breve.", "PluginUpdatedWithName": "{0} foi atualizado", "PluginUninstalledWithName": "{0} foi desinstalado", "ItemAddedWithName": "{0} foi adicionado \u00e0 biblioteca", "ItemRemovedWithName": "{0} foi removido da biblioteca", - "LabelIpAddressValue": "Endere\u00e7o Ip: {0}", + "LabelIpAddressValue": "Endere\u00e7o ip: {0}", "DeviceOnlineWithName": "{0} est\u00e1 conectado", "UserOnlineFromDevice": "{0} est\u00e1 ativo em {1}", "ProviderValue": "Provedor: {0}", "SubtitlesDownloadedForItem": "Legendas baixadas para {0}", - "UserConfigurationUpdatedWithName": "A configura\u00e7\u00e3o do usu\u00e1rio {0} foi atualizada", "UserCreatedWithName": "O usu\u00e1rio {0} foi criado", - "UserPasswordChangedWithName": "A senha do usu\u00e1rio {0} foi alterada", + "UserPasswordChangedWithName": "A senha foi alterada para o usu\u00e1rio {0}", "UserDeletedWithName": "O usu\u00e1rio {0} foi exclu\u00eddo", + "UserConfigurationUpdatedWithName": "A configura\u00e7\u00e3o do usu\u00e1rio foi atualizada para {0}", "MessageServerConfigurationUpdated": "A configura\u00e7\u00e3o do servidor foi atualizada", "MessageNamedServerConfigurationUpdatedWithValue": "A se\u00e7\u00e3o {0} da configura\u00e7\u00e3o do servidor foi atualizada", - "MessageApplicationUpdated": "O Servidor Emby foi atualizado", + "MessageApplicationUpdated": "O servidor Emby foi atualizado", "FailedLoginAttemptWithUserName": "Falha na tentativa de login de {0}", - "AuthenticationSucceededWithUserName": "{0} autenticou-se com sucesso", - "DeviceOfflineWithName": "{0} foi desconectado", - "UserLockedOutWithName": "Usu\u00e1rio {0} foi bloqueado", - "UserOfflineFromDevice": "{0} foi desconectado de {1}", - "UserStartedPlayingItemWithValues": "{0} come\u00e7ou a reproduzir {1}", + "AuthenticationSucceededWithUserName": "{0} autenticado com sucesso", + "UserOfflineFromDevice": "{0} se desconectou de {1}", + "DeviceOfflineWithName": "{0} se desconectou", + "UserStartedPlayingItemWithValues": "{0} iniciou a reprodu\u00e7\u00e3o de {1}", "UserStoppedPlayingItemWithValues": "{0} parou de reproduzir {1}", - "SubtitleDownloadFailureForItem": "Falha ao baixar legendas para {0}", - "HeaderUnidentified": "N\u00e3o-identificado", - "HeaderImagePrimary": "Principal", - "HeaderImageBackdrop": "Imagem de Fundo", - "HeaderImageLogo": "Logo", - "HeaderUserPrimaryImage": "Imagem do Usu\u00e1rio", - "HeaderOverview": "Sinopse", - "HeaderShortOverview": "Sinopse curta", - "HeaderType": "Tipo", - "HeaderSeverity": "Severidade", - "HeaderUser": "Usu\u00e1rio", - "HeaderName": "Nome", - "HeaderDate": "Data", - "HeaderPremiereDate": "Data da Estr\u00e9ia", - "HeaderDateAdded": "Data da Adi\u00e7\u00e3o", - "HeaderReleaseDate": "Data de lan\u00e7amento", - "HeaderRuntime": "Dura\u00e7\u00e3o", - "HeaderPlayCount": "N\u00famero de Reprodu\u00e7\u00f5es", - "HeaderSeason": "Temporada", - "HeaderSeasonNumber": "N\u00famero da temporada", - "HeaderSeries": "S\u00e9rie:", - "HeaderNetwork": "Rede de TV", - "HeaderYear": "Ano:", - "HeaderYears": "Anos:", - "HeaderParentalRating": "Classifica\u00e7\u00e3o Parental", - "HeaderCommunityRating": "Avalia\u00e7\u00e3o da Comunidade", - "HeaderTrailers": "Trailers", - "HeaderSpecials": "Especiais", - "HeaderGameSystems": "Sistemas de Jogo", - "HeaderPlayers": "Jogadores:", - "HeaderAlbumArtists": "Artistas do \u00c1lbum", - "HeaderAlbums": "\u00c1lbuns", - "HeaderDisc": "Disco", - "HeaderTrack": "Faixa", - "HeaderAudio": "\u00c1udio", - "HeaderVideo": "V\u00eddeo", - "HeaderEmbeddedImage": "Imagem incorporada", - "HeaderResolution": "Resolu\u00e7\u00e3o", - "HeaderSubtitles": "Legendas", - "HeaderGenres": "G\u00eaneros", - "HeaderCountries": "Pa\u00edses", - "HeaderStatus": "Status", - "HeaderTracks": "Faixas", - "HeaderMusicArtist": "Artista da m\u00fasica", - "HeaderLocked": "Travado", - "HeaderStudios": "Est\u00fadios", - "HeaderActor": "Atores", - "HeaderComposer": "Compositores", - "HeaderDirector": "Diretores", - "HeaderGuestStar": "Ator convidado", - "HeaderProducer": "Produtores", - "HeaderWriter": "Escritores", - "HeaderParentalRatings": "Classifica\u00e7\u00f5es Parentais", - "HeaderCommunityRatings": "Avalia\u00e7\u00f5es da comunidade", - "StartupEmbyServerIsLoading": "O Servidor Emby est\u00e1 carregando. Por favor, tente novamente em breve." + "NotificationOptionPluginError": "Falha de plugin", + "NotificationOptionApplicationUpdateAvailable": "Atualiza\u00e7\u00e3o de aplicativo dispon\u00edvel", + "NotificationOptionApplicationUpdateInstalled": "Atualiza\u00e7\u00e3o de aplicativo instalada", + "NotificationOptionPluginUpdateInstalled": "Atualiza\u00e7\u00e3o de plugin instalada", + "NotificationOptionPluginInstalled": "Plugin instalado", + "NotificationOptionPluginUninstalled": "Plugin desinstalado", + "NotificationOptionVideoPlayback": "Reprodu\u00e7\u00e3o de v\u00eddeo iniciada", + "NotificationOptionAudioPlayback": "Reprodu\u00e7\u00e3o de \u00e1udio iniciada", + "NotificationOptionGamePlayback": "Reprodu\u00e7\u00e3o de jogo iniciada", + "NotificationOptionVideoPlaybackStopped": "Reprodu\u00e7\u00e3o de v\u00eddeo parada", + "NotificationOptionAudioPlaybackStopped": "Reprodu\u00e7\u00e3o de \u00e1udio parada", + "NotificationOptionGamePlaybackStopped": "Reprodu\u00e7\u00e3o de jogo parada", + "NotificationOptionTaskFailed": "Falha na tarefa agendada", + "NotificationOptionInstallationFailed": "Falha na instala\u00e7\u00e3o", + "NotificationOptionNewLibraryContent": "Novo conte\u00fado adicionado", + "NotificationOptionCameraImageUploaded": "Imagem de c\u00e2mera enviada", + "NotificationOptionUserLockedOut": "Usu\u00e1rio bloqueado", + "NotificationOptionServerRestartRequired": "Necess\u00e1rio reiniciar servidor", + "UserLockedOutWithName": "Usu\u00e1rio {0} foi bloqueado", + "SubtitleDownloadFailureForItem": "Download de legendas falhou para {0}", + "Sync": "Sincronizar", + "User": "Usu\u00e1rio", + "System": "Sistema", + "Application": "Aplicativo", + "Plugin": "Plugin", + "LabelExit": "Sair", + "LabelVisitCommunity": "Visite a Comunidade", + "LabelBrowseLibrary": "Explorar Biblioteca", + "LabelConfigureServer": "Configurar Emby", + "LabelRestartServer": "Reiniciar Servidor" }
\ No newline at end of file diff --git a/Emby.Server.Implementations/Localization/Core/pt-PT.json b/Emby.Server.Implementations/Localization/Core/pt-PT.json index f12939b10..7a6b8f419 100644 --- a/Emby.Server.Implementations/Localization/Core/pt-PT.json +++ b/Emby.Server.Implementations/Localization/Core/pt-PT.json @@ -1,178 +1,96 @@ { - "DbUpgradeMessage": "Please wait while your Emby Server database is upgraded. {0}% complete.", + "Latest": "Latest", + "ValueSpecialEpisodeName": "Especial - {0}", + "Inherit": "Inherit", + "Books": "Books", + "Music": "Music", + "Games": "Games", + "Photos": "Photos", + "MixedContent": "Mixed content", + "MusicVideos": "Music videos", + "HomeVideos": "Home videos", + "Playlists": "Playlists", + "HeaderRecordingGroups": "Recording Groups", + "HeaderContinueWatching": "Continuar a ver", + "HeaderFavoriteArtists": "Favorite Artists", + "HeaderFavoriteSongs": "Favorite Songs", + "HeaderAlbumArtists": "Album Artists", + "HeaderFavoriteAlbums": "Favorite Albums", + "HeaderFavoriteEpisodes": "Favorite Episodes", + "HeaderFavoriteShows": "S\u00e9ries Favoritas", + "HeaderNextUp": "Next Up", + "Favorites": "Favorites", + "Collections": "Collections", + "Channels": "Channels", + "Movies": "Movies", + "Albums": "Albums", + "Artists": "Artists", + "Folders": "Folders", + "Songs": "Songs", + "TvShows": "TV Shows", + "Shows": "Shows", + "Genres": "Genres", + "NameSeasonNumber": "Season {0}", "AppDeviceValues": "App: {0}, Device: {1}", "UserDownloadingItemWithValues": "{0} is downloading {1}", - "FolderTypeMixed": "Mixed content", - "FolderTypeMovies": "Filmes", - "FolderTypeMusic": "M\u00fasica", - "FolderTypeAdultVideos": "V\u00eddeos adultos", - "FolderTypePhotos": "Fotos", - "FolderTypeMusicVideos": "V\u00eddeos musicais", - "FolderTypeHomeVideos": "V\u00eddeos caseiros", - "FolderTypeGames": "Jogos", - "FolderTypeBooks": "Livros", - "FolderTypeTvShows": "TV", - "FolderTypeInherit": "Inherit", - "HeaderCastCrew": "Elenco e Equipa", - "HeaderPeople": "People", - "ValueSpecialEpisodeName": "Special - {0}", - "LabelChapterName": "Chapter {0}", - "NameSeasonNumber": "Season {0}", - "LabelExit": "Sair", - "LabelVisitCommunity": "Visitar a Comunidade", - "LabelGithub": "Github", - "LabelApiDocumentation": "Documenta\u00e7\u00e3o da API", - "LabelDeveloperResources": "Recursos do Programador", - "LabelBrowseLibrary": "Navegar pela Biblioteca", - "LabelConfigureServer": "Configurar o Emby", - "LabelRestartServer": "Reiniciar Servidor", - "CategorySync": "Sincroniza\u00e7\u00e3o", - "CategoryUser": "Utilizador", - "CategorySystem": "Sistema", - "CategoryApplication": "Aplica\u00e7\u00e3o", - "CategoryPlugin": "Extens\u00e3o", - "NotificationOptionPluginError": "Falha na extens\u00e3o", - "NotificationOptionApplicationUpdateAvailable": "Dispon\u00edvel atualiza\u00e7\u00e3o da aplica\u00e7\u00e3o", - "NotificationOptionApplicationUpdateInstalled": "Instalada atualiza\u00e7\u00e3o da aplica\u00e7\u00e3o", - "NotificationOptionPluginUpdateInstalled": "Instalada atualiza\u00e7\u00e3o da extens\u00e3o", - "NotificationOptionPluginInstalled": "Extens\u00e3o instalada", - "NotificationOptionPluginUninstalled": "Extens\u00e3o desinstalada", - "NotificationOptionVideoPlayback": "Reprodu\u00e7\u00e3o de v\u00eddeo iniciada", - "NotificationOptionAudioPlayback": "Reprodu\u00e7\u00e3o de \u00e1udio iniciada", - "NotificationOptionGamePlayback": "Reprodu\u00e7\u00e3o de jogo iniciada", - "NotificationOptionVideoPlaybackStopped": "Reprodu\u00e7\u00e3o de v\u00eddeo parada", - "NotificationOptionAudioPlaybackStopped": "Reprodu\u00e7\u00e3o de \u00e1udio parada", - "NotificationOptionGamePlaybackStopped": "Reprodu\u00e7\u00e3o de jogo parada", - "NotificationOptionTaskFailed": "Falha na tarefa agendada", - "NotificationOptionInstallationFailed": "Falha na instala\u00e7\u00e3o", - "NotificationOptionNewLibraryContent": "Adicionado novo conte\u00fado", - "NotificationOptionNewLibraryContentMultiple": "Novo conte\u00fado adicionado (m\u00faltiplo)", - "NotificationOptionCameraImageUploaded": "Imagem da c\u00e2mara carregada", - "NotificationOptionUserLockedOut": "User locked out", - "NotificationOptionServerRestartRequired": "\u00c9 necess\u00e1rio reiniciar o servidor", - "ViewTypePlaylists": "Playlists", - "ViewTypeMovies": "Movies", - "ViewTypeTvShows": "TV", - "ViewTypeGames": "Games", - "ViewTypeMusic": "Music", - "ViewTypeMusicGenres": "Genres", - "ViewTypeMusicArtists": "Artists", - "ViewTypeBoxSets": "Collections", - "ViewTypeChannels": "Channels", - "ViewTypeLiveTV": "TV ao Vivo", - "ViewTypeLiveTvNowPlaying": "Now Airing", - "ViewTypeLatestGames": "Latest Games", - "ViewTypeRecentlyPlayedGames": "Reproduzido Recentemente", - "ViewTypeGameFavorites": "Favorites", - "ViewTypeGameSystems": "Game Systems", - "ViewTypeGameGenres": "Genres", - "ViewTypeTvResume": "Resume", - "ViewTypeTvNextUp": "Next Up", - "ViewTypeTvLatest": "\u00daltimas", - "ViewTypeTvShowSeries": "Series", - "ViewTypeTvGenres": "Genres", - "ViewTypeTvFavoriteSeries": "Favorite Series", - "ViewTypeTvFavoriteEpisodes": "Favorite Episodes", - "ViewTypeMovieResume": "Resume", - "ViewTypeMovieLatest": "\u00daltimas", - "ViewTypeMovieMovies": "Movies", - "ViewTypeMovieCollections": "Collections", - "ViewTypeMovieFavorites": "Favorites", - "ViewTypeMovieGenres": "Genres", - "ViewTypeMusicLatest": "\u00daltimas", - "ViewTypeMusicPlaylists": "Playlists", - "ViewTypeMusicAlbums": "Albums", - "ViewTypeMusicAlbumArtists": "Album Artists", - "HeaderOtherDisplaySettings": "Display Settings", - "ViewTypeMusicSongs": "Songs", - "ViewTypeMusicFavorites": "Favorites", - "ViewTypeMusicFavoriteAlbums": "Favorite Albums", - "ViewTypeMusicFavoriteArtists": "Favorite Artists", - "ViewTypeMusicFavoriteSongs": "Favorite Songs", - "ViewTypeFolders": "Folders", - "ViewTypeLiveTvRecordingGroups": "Recordings", - "ViewTypeLiveTvChannels": "Channels", + "HeaderLiveTV": "Live TV", + "ChapterNameValue": "Chapter {0}", "ScheduledTaskFailedWithName": "{0} failed", "LabelRunningTimeValue": "Running time: {0}", "ScheduledTaskStartedWithName": "{0} started", - "VersionNumber": "Vers\u00e3o {0}", - "PluginInstalledWithName": "{0} foi instalado", - "PluginUpdatedWithName": "{0} foi atualizado", - "PluginUninstalledWithName": "{0} foi desinstalado", - "ItemAddedWithName": "{0} foi adicionado \u00e0 biblioteca", - "ItemRemovedWithName": "{0} foi removido da biblioteca", + "VersionNumber": "Version {0}", + "PluginInstalledWithName": "{0} was installed", + "StartupEmbyServerIsLoading": "Emby Server is loading. Please try again shortly.", + "PluginUpdatedWithName": "{0} was updated", + "PluginUninstalledWithName": "{0} was uninstalled", + "ItemAddedWithName": "{0} was added to the library", + "ItemRemovedWithName": "{0} was removed from the library", "LabelIpAddressValue": "Ip address: {0}", - "DeviceOnlineWithName": "{0} est\u00e1 conectado", + "DeviceOnlineWithName": "{0} is connected", "UserOnlineFromDevice": "{0} is online from {1}", "ProviderValue": "Provider: {0}", "SubtitlesDownloadedForItem": "Subtitles downloaded for {0}", - "UserConfigurationUpdatedWithName": "User configuration has been updated for {0}", "UserCreatedWithName": "User {0} has been created", "UserPasswordChangedWithName": "Password has been changed for user {0}", "UserDeletedWithName": "User {0} has been deleted", + "UserConfigurationUpdatedWithName": "User configuration has been updated for {0}", "MessageServerConfigurationUpdated": "Server configuration has been updated", "MessageNamedServerConfigurationUpdatedWithValue": "Server configuration section {0} has been updated", "MessageApplicationUpdated": "Emby Server has been updated", "FailedLoginAttemptWithUserName": "Failed login attempt from {0}", "AuthenticationSucceededWithUserName": "{0} successfully authenticated", - "DeviceOfflineWithName": "{0} has disconnected", - "UserLockedOutWithName": "User {0} has been locked out", "UserOfflineFromDevice": "{0} has disconnected from {1}", + "DeviceOfflineWithName": "{0} has disconnected", "UserStartedPlayingItemWithValues": "{0} has started playing {1}", "UserStoppedPlayingItemWithValues": "{0} has stopped playing {1}", + "NotificationOptionPluginError": "Plugin failure", + "NotificationOptionApplicationUpdateAvailable": "Application update available", + "NotificationOptionApplicationUpdateInstalled": "Application update installed", + "NotificationOptionPluginUpdateInstalled": "Plugin update installed", + "NotificationOptionPluginInstalled": "Plugin installed", + "NotificationOptionPluginUninstalled": "Plugin uninstalled", + "NotificationOptionVideoPlayback": "Video playback started", + "NotificationOptionAudioPlayback": "Audio playback started", + "NotificationOptionGamePlayback": "Game playback started", + "NotificationOptionVideoPlaybackStopped": "Video playback stopped", + "NotificationOptionAudioPlaybackStopped": "Audio playback stopped", + "NotificationOptionGamePlaybackStopped": "Game playback stopped", + "NotificationOptionTaskFailed": "Scheduled task failure", + "NotificationOptionInstallationFailed": "Installation failure", + "NotificationOptionNewLibraryContent": "New content added", + "NotificationOptionCameraImageUploaded": "Camera image uploaded", + "NotificationOptionUserLockedOut": "User locked out", + "NotificationOptionServerRestartRequired": "Server restart required", + "UserLockedOutWithName": "User {0} has been locked out", "SubtitleDownloadFailureForItem": "Subtitles failed to download for {0}", - "HeaderUnidentified": "Unidentified", - "HeaderImagePrimary": "Primary", - "HeaderImageBackdrop": "Backdrop", - "HeaderImageLogo": "Logo", - "HeaderUserPrimaryImage": "User Image", - "HeaderOverview": "Overview", - "HeaderShortOverview": "Short Overview", - "HeaderType": "Type", - "HeaderSeverity": "Severity", - "HeaderUser": "User", - "HeaderName": "Nome", - "HeaderDate": "Data", - "HeaderPremiereDate": "Premiere Date", - "HeaderDateAdded": "Date Added", - "HeaderReleaseDate": "Release date", - "HeaderRuntime": "Runtime", - "HeaderPlayCount": "Play Count", - "HeaderSeason": "Season", - "HeaderSeasonNumber": "Season number", - "HeaderSeries": "Series:", - "HeaderNetwork": "Network", - "HeaderYear": "Year:", - "HeaderYears": "Years:", - "HeaderParentalRating": "Parental Rating", - "HeaderCommunityRating": "Community rating", - "HeaderTrailers": "Trailers", - "HeaderSpecials": "Specials", - "HeaderGameSystems": "Game Systems", - "HeaderPlayers": "Players:", - "HeaderAlbumArtists": "Album Artists", - "HeaderAlbums": "Albums", - "HeaderDisc": "Disc", - "HeaderTrack": "Track", - "HeaderAudio": "\u00c1udio", - "HeaderVideo": "V\u00eddeo", - "HeaderEmbeddedImage": "Embedded image", - "HeaderResolution": "Resolution", - "HeaderSubtitles": "Subtitles", - "HeaderGenres": "Genres", - "HeaderCountries": "Countries", - "HeaderStatus": "Estado", - "HeaderTracks": "Tracks", - "HeaderMusicArtist": "Music artist", - "HeaderLocked": "Locked", - "HeaderStudios": "Studios", - "HeaderActor": "Actors", - "HeaderComposer": "Composers", - "HeaderDirector": "Directors", - "HeaderGuestStar": "Guest star", - "HeaderProducer": "Producers", - "HeaderWriter": "Writers", - "HeaderParentalRatings": "Parental Ratings", - "HeaderCommunityRatings": "Community ratings", - "StartupEmbyServerIsLoading": "Emby Server is loading. Please try again shortly." + "Sync": "Sync", + "User": "User", + "System": "System", + "Application": "Aplica\u00e7\u00e3o", + "Plugin": "Plugin", + "LabelExit": "Exit", + "LabelVisitCommunity": "Visit Community", + "LabelBrowseLibrary": "Browse Library", + "LabelConfigureServer": "Configure Emby", + "LabelRestartServer": "Restart Server" }
\ No newline at end of file diff --git a/Emby.Server.Implementations/Localization/Core/ro.json b/Emby.Server.Implementations/Localization/Core/ro.json deleted file mode 100644 index c58df27d5..000000000 --- a/Emby.Server.Implementations/Localization/Core/ro.json +++ /dev/null @@ -1,178 +0,0 @@ -{ - "DbUpgradeMessage": "Please wait while your Emby Server database is upgraded. {0}% complete.", - "AppDeviceValues": "App: {0}, Device: {1}", - "UserDownloadingItemWithValues": "{0} is downloading {1}", - "FolderTypeMixed": "Continut mixt", - "FolderTypeMovies": "Filme", - "FolderTypeMusic": "Muzica", - "FolderTypeAdultVideos": "Filme Porno", - "FolderTypePhotos": "Fotografii", - "FolderTypeMusicVideos": "Videoclipuri", - "FolderTypeHomeVideos": "Video Personale", - "FolderTypeGames": "Jocuri", - "FolderTypeBooks": "Carti", - "FolderTypeTvShows": "Seriale TV", - "FolderTypeInherit": "Relationat", - "HeaderCastCrew": "Cast & Crew", - "HeaderPeople": "People", - "ValueSpecialEpisodeName": "Special - {0}", - "LabelChapterName": "Chapter {0}", - "NameSeasonNumber": "Season {0}", - "LabelExit": "Iesire", - "LabelVisitCommunity": "Viziteaza comunitatea", - "LabelGithub": "Github", - "LabelApiDocumentation": "Documentatie Api", - "LabelDeveloperResources": "Resurse Dezvoltator", - "LabelBrowseLibrary": "Rasfoieste Librarie", - "LabelConfigureServer": "Configureaza Emby", - "LabelRestartServer": "Restarteaza Server", - "CategorySync": "Sincronizeaza", - "CategoryUser": "User", - "CategorySystem": "System", - "CategoryApplication": "Application", - "CategoryPlugin": "Plugin", - "NotificationOptionPluginError": "Plugin failure", - "NotificationOptionApplicationUpdateAvailable": "Application update available", - "NotificationOptionApplicationUpdateInstalled": "Application update installed", - "NotificationOptionPluginUpdateInstalled": "Plugin update installed", - "NotificationOptionPluginInstalled": "Plugin installed", - "NotificationOptionPluginUninstalled": "Plugin uninstalled", - "NotificationOptionVideoPlayback": "Video playback started", - "NotificationOptionAudioPlayback": "Audio playback started", - "NotificationOptionGamePlayback": "Game playback started", - "NotificationOptionVideoPlaybackStopped": "Video playback stopped", - "NotificationOptionAudioPlaybackStopped": "Audio playback stopped", - "NotificationOptionGamePlaybackStopped": "Game playback stopped", - "NotificationOptionTaskFailed": "Scheduled task failure", - "NotificationOptionInstallationFailed": "Installation failure", - "NotificationOptionNewLibraryContent": "New content added", - "NotificationOptionNewLibraryContentMultiple": "New content added (multiple)", - "NotificationOptionCameraImageUploaded": "Camera image uploaded", - "NotificationOptionUserLockedOut": "User locked out", - "NotificationOptionServerRestartRequired": "Server restart required", - "ViewTypePlaylists": "Playlists", - "ViewTypeMovies": "Movies", - "ViewTypeTvShows": "TV", - "ViewTypeGames": "Games", - "ViewTypeMusic": "Music", - "ViewTypeMusicGenres": "Genres", - "ViewTypeMusicArtists": "Artists", - "ViewTypeBoxSets": "Collections", - "ViewTypeChannels": "Channels", - "ViewTypeLiveTV": "Live TV", - "ViewTypeLiveTvNowPlaying": "Now Airing", - "ViewTypeLatestGames": "Latest Games", - "ViewTypeRecentlyPlayedGames": "Recently Played", - "ViewTypeGameFavorites": "Favorites", - "ViewTypeGameSystems": "Game Systems", - "ViewTypeGameGenres": "Genres", - "ViewTypeTvResume": "Resume", - "ViewTypeTvNextUp": "Next Up", - "ViewTypeTvLatest": "Latest", - "ViewTypeTvShowSeries": "Series", - "ViewTypeTvGenres": "Genres", - "ViewTypeTvFavoriteSeries": "Favorite Series", - "ViewTypeTvFavoriteEpisodes": "Favorite Episodes", - "ViewTypeMovieResume": "Resume", - "ViewTypeMovieLatest": "Latest", - "ViewTypeMovieMovies": "Movies", - "ViewTypeMovieCollections": "Collections", - "ViewTypeMovieFavorites": "Favorites", - "ViewTypeMovieGenres": "Genres", - "ViewTypeMusicLatest": "Latest", - "ViewTypeMusicPlaylists": "Playlists", - "ViewTypeMusicAlbums": "Albums", - "ViewTypeMusicAlbumArtists": "Album Artists", - "HeaderOtherDisplaySettings": "Display Settings", - "ViewTypeMusicSongs": "Songs", - "ViewTypeMusicFavorites": "Favorites", - "ViewTypeMusicFavoriteAlbums": "Favorite Albums", - "ViewTypeMusicFavoriteArtists": "Favorite Artists", - "ViewTypeMusicFavoriteSongs": "Favorite Songs", - "ViewTypeFolders": "Folders", - "ViewTypeLiveTvRecordingGroups": "Recordings", - "ViewTypeLiveTvChannels": "Channels", - "ScheduledTaskFailedWithName": "{0} failed", - "LabelRunningTimeValue": "Running time: {0}", - "ScheduledTaskStartedWithName": "{0} started", - "VersionNumber": "Version {0}", - "PluginInstalledWithName": "{0} was installed", - "PluginUpdatedWithName": "{0} was updated", - "PluginUninstalledWithName": "{0} was uninstalled", - "ItemAddedWithName": "{0} was added to the library", - "ItemRemovedWithName": "{0} was removed from the library", - "LabelIpAddressValue": "Ip address: {0}", - "DeviceOnlineWithName": "{0} is connected", - "UserOnlineFromDevice": "{0} is online from {1}", - "ProviderValue": "Provider: {0}", - "SubtitlesDownloadedForItem": "Subtitles downloaded for {0}", - "UserConfigurationUpdatedWithName": "User configuration has been updated for {0}", - "UserCreatedWithName": "User {0} has been created", - "UserPasswordChangedWithName": "Password has been changed for user {0}", - "UserDeletedWithName": "User {0} has been deleted", - "MessageServerConfigurationUpdated": "Server configuration has been updated", - "MessageNamedServerConfigurationUpdatedWithValue": "Server configuration section {0} has been updated", - "MessageApplicationUpdated": "Emby Server has been updated", - "FailedLoginAttemptWithUserName": "Failed login attempt from {0}", - "AuthenticationSucceededWithUserName": "{0} successfully authenticated", - "DeviceOfflineWithName": "{0} has disconnected", - "UserLockedOutWithName": "User {0} has been locked out", - "UserOfflineFromDevice": "{0} has disconnected from {1}", - "UserStartedPlayingItemWithValues": "{0} has started playing {1}", - "UserStoppedPlayingItemWithValues": "{0} has stopped playing {1}", - "SubtitleDownloadFailureForItem": "Subtitles failed to download for {0}", - "HeaderUnidentified": "Unidentified", - "HeaderImagePrimary": "Primary", - "HeaderImageBackdrop": "Backdrop", - "HeaderImageLogo": "Logo", - "HeaderUserPrimaryImage": "User Image", - "HeaderOverview": "Overview", - "HeaderShortOverview": "Short Overview", - "HeaderType": "Type", - "HeaderSeverity": "Severity", - "HeaderUser": "User", - "HeaderName": "Name", - "HeaderDate": "Date", - "HeaderPremiereDate": "Premiere Date", - "HeaderDateAdded": "Date Added", - "HeaderReleaseDate": "Release date", - "HeaderRuntime": "Runtime", - "HeaderPlayCount": "Play Count", - "HeaderSeason": "Season", - "HeaderSeasonNumber": "Season number", - "HeaderSeries": "Series:", - "HeaderNetwork": "Network", - "HeaderYear": "Year:", - "HeaderYears": "Years:", - "HeaderParentalRating": "Parental Rating", - "HeaderCommunityRating": "Community rating", - "HeaderTrailers": "Trailers", - "HeaderSpecials": "Specials", - "HeaderGameSystems": "Game Systems", - "HeaderPlayers": "Players:", - "HeaderAlbumArtists": "Album Artists", - "HeaderAlbums": "Albums", - "HeaderDisc": "Disc", - "HeaderTrack": "Track", - "HeaderAudio": "Muzica", - "HeaderVideo": "Filme", - "HeaderEmbeddedImage": "Embedded image", - "HeaderResolution": "Resolution", - "HeaderSubtitles": "Subtitles", - "HeaderGenres": "Genres", - "HeaderCountries": "Countries", - "HeaderStatus": "Status", - "HeaderTracks": "Tracks", - "HeaderMusicArtist": "Music artist", - "HeaderLocked": "Locked", - "HeaderStudios": "Studios", - "HeaderActor": "Actors", - "HeaderComposer": "Composers", - "HeaderDirector": "Directors", - "HeaderGuestStar": "Guest star", - "HeaderProducer": "Producers", - "HeaderWriter": "Writers", - "HeaderParentalRatings": "Parental Ratings", - "HeaderCommunityRatings": "Community ratings", - "StartupEmbyServerIsLoading": "Emby Server is loading. Please try again shortly." -}
\ No newline at end of file diff --git a/Emby.Server.Implementations/Localization/Core/ru.json b/Emby.Server.Implementations/Localization/Core/ru.json index 62fe3b496..d27b1ca93 100644 --- a/Emby.Server.Implementations/Localization/Core/ru.json +++ b/Emby.Server.Implementations/Localization/Core/ru.json @@ -1,178 +1,96 @@ { - "DbUpgradeMessage": "\u041f\u043e\u0434\u043e\u0436\u0434\u0438\u0442\u0435, \u043f\u043e\u043a\u0430 \u0431\u0430\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 \u0432\u0430\u0448\u0435\u043c Emby Server \u043c\u043e\u0434\u0435\u0440\u043d\u0438\u0437\u0438\u0440\u0443\u0435\u0442\u0441\u044f. {0} % \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u043e.", - "AppDeviceValues": "\u041f\u0440\u0438\u043b.: {0}, \u0423\u0441\u0442\u0440.: {1}", - "UserDownloadingItemWithValues": "{0} \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442 {1}", - "FolderTypeMixed": "\u0421\u043c\u0435\u0448\u0430\u043d\u043d\u043e\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435", - "FolderTypeMovies": "\u041a\u0438\u043d\u043e", - "FolderTypeMusic": "\u041c\u0443\u0437\u044b\u043a\u0430", - "FolderTypeAdultVideos": "\u0414\u043b\u044f \u0432\u0437\u0440\u043e\u0441\u043b\u044b\u0445", - "FolderTypePhotos": "\u0424\u043e\u0442\u043e", - "FolderTypeMusicVideos": "\u041c\u0443\u0437. \u0432\u0438\u0434\u0435\u043e", - "FolderTypeHomeVideos": "\u0414\u043e\u043c. \u0432\u0438\u0434\u0435\u043e", - "FolderTypeGames": "\u0418\u0433\u0440\u044b", - "FolderTypeBooks": "\u041b\u0438\u0442\u0435\u0440\u0430\u0442\u0443\u0440\u0430", - "FolderTypeTvShows": "\u0422\u0412", - "FolderTypeInherit": "\u041d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u043c\u044b\u0439", - "HeaderCastCrew": "\u0421\u043d\u0438\u043c\u0430\u043b\u0438\u0441\u044c \u0438 \u0441\u043d\u0438\u043c\u0430\u043b\u0438", - "HeaderPeople": "\u041b\u044e\u0434\u0438", + "Latest": "\u041d\u043e\u0432\u0435\u0439\u0448\u0435\u0435", "ValueSpecialEpisodeName": "\u0421\u043f\u0435\u0446\u044d\u043f\u0438\u0437\u043e\u0434 - {0}", - "LabelChapterName": "\u0421\u0446\u0435\u043d\u0430 {0}", + "Inherit": "\u041d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u043c\u043e\u0435", + "Books": "\u041b\u0438\u0442\u0435\u0440\u0430\u0442\u0443\u0440\u0430", + "Music": "\u041c\u0443\u0437\u044b\u043a\u0430", + "Games": "\u0418\u0433\u0440\u044b", + "Photos": "\u0424\u043e\u0442\u043e", + "MixedContent": "\u0421\u043c\u0435\u0448\u0430\u043d\u043d\u043e\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435", + "MusicVideos": "\u041c\u0443\u0437. \u0432\u0438\u0434\u0435\u043e", + "HomeVideos": "\u0414\u043e\u043c. \u0432\u0438\u0434\u0435\u043e", + "Playlists": "\u041f\u043b\u0435\u0439-\u043b\u0438\u0441\u0442\u044b", + "HeaderRecordingGroups": "\u0413\u0440\u0443\u043f\u043f\u044b \u0437\u0430\u043f\u0438\u0441\u0435\u0439", + "HeaderContinueWatching": "\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430", + "HeaderFavoriteArtists": "\u0418\u0437\u0431\u0440\u0430\u043d\u043d\u044b\u0435 \u0438\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u0438", + "HeaderFavoriteSongs": "\u0418\u0437\u0431\u0440\u0430\u043d\u043d\u044b\u0435 \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0438", + "HeaderAlbumArtists": "\u0418\u0441\u043f-\u043b\u0438 \u0430\u043b\u044c\u0431\u043e\u043c\u0430", + "HeaderFavoriteAlbums": "\u0418\u0437\u0431\u0440\u0430\u043d\u043d\u044b\u0435 \u0430\u043b\u044c\u0431\u043e\u043c\u044b", + "HeaderFavoriteEpisodes": "\u0418\u0437\u0431\u0440\u0430\u043d\u043d\u044b\u0435 \u044d\u043f\u0438\u0437\u043e\u0434\u044b", + "HeaderFavoriteShows": "\u0418\u0437\u0431\u0440\u0430\u043d\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438", + "HeaderNextUp": "\u041e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u0435", + "Favorites": "\u0418\u0437\u0431\u0440\u0430\u043d\u043d\u043e\u0435", + "Collections": "\u041a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438", + "Channels": "\u041a\u0430\u043d\u0430\u043b\u044b", + "Movies": "\u041a\u0438\u043d\u043e", + "Albums": "\u0410\u043b\u044c\u0431\u043e\u043c\u044b", + "Artists": "\u0418\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u0438", + "Folders": "\u041f\u0430\u043f\u043a\u0438", + "Songs": "\u041a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0438", + "TvShows": "\u0422\u0412", + "Shows": "\u041f\u0435\u0440\u0435\u0434\u0430\u0447\u0438", + "Genres": "\u0416\u0430\u043d\u0440\u044b", "NameSeasonNumber": "\u0421\u0435\u0437\u043e\u043d {0}", - "LabelExit": "\u0412\u044b\u0445\u043e\u0434", - "LabelVisitCommunity": "\u041f\u043e\u0441\u0435\u0449\u0435\u043d\u0438\u0435 \u0421\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0430", - "LabelGithub": "GitHub", - "LabelApiDocumentation": "\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043f\u043e API", - "LabelDeveloperResources": "\u0420\u0435\u0441\u0443\u0440\u0441\u044b \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432", - "LabelBrowseLibrary": "\u041d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u044f \u043f\u043e \u043c\u0435\u0434\u0438\u0430\u0442\u0435\u043a\u0435", - "LabelConfigureServer": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 Emby", - "LabelRestartServer": "\u041f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a \u0441\u0435\u0440\u0432\u0435\u0440\u0430", - "CategorySync": "\u0421\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044f", - "CategoryUser": "\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c", - "CategorySystem": "\u0421\u0438\u0441\u0442\u0435\u043c\u0430", - "CategoryApplication": "\u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435", - "CategoryPlugin": "\u041f\u043b\u0430\u0433\u0438\u043d", - "NotificationOptionPluginError": "\u0421\u0431\u043e\u0439 \u043f\u043b\u0430\u0433\u0438\u043d\u0430", - "NotificationOptionApplicationUpdateAvailable": "\u0418\u043c\u0435\u0435\u0442\u0441\u044f \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f", - "NotificationOptionApplicationUpdateInstalled": "\u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043e", - "NotificationOptionPluginUpdateInstalled": "\u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u043b\u0430\u0433\u0438\u043d\u0430 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043e", - "NotificationOptionPluginInstalled": "\u041f\u043b\u0430\u0433\u0438\u043d \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d", - "NotificationOptionPluginUninstalled": "\u041f\u043b\u0430\u0433\u0438\u043d \u0443\u0434\u0430\u043b\u0451\u043d", - "NotificationOptionVideoPlayback": "\u0412\u043e\u0441\u043f\u0440-\u0438\u0435 \u0432\u0438\u0434\u0435\u043e \u0437\u0430\u043f-\u043d\u043e", - "NotificationOptionAudioPlayback": "\u0412\u043e\u0441\u043f\u0440-\u0438\u0435 \u0430\u0443\u0434\u0438\u043e \u0437\u0430\u043f-\u043d\u043e", - "NotificationOptionGamePlayback": "\u0412\u043e\u0441\u043f\u0440-\u0438\u0435 \u0438\u0433\u0440\u044b \u0437\u0430\u043f-\u043d\u043e", - "NotificationOptionVideoPlaybackStopped": "\u0412\u043e\u0441\u043f-\u0438\u0435 \u0432\u0438\u0434\u0435\u043e \u043e\u0441\u0442-\u043d\u043e", - "NotificationOptionAudioPlaybackStopped": "\u0412\u043e\u0441\u043f-\u0438\u0435 \u0430\u0443\u0434\u0438\u043e \u043e\u0441\u0442-\u043d\u043e", - "NotificationOptionGamePlaybackStopped": "\u0412\u043e\u0441\u043f-\u0438\u0435 \u0438\u0433\u0440\u044b \u043e\u0441\u0442-\u043d\u043e", - "NotificationOptionTaskFailed": "\u0421\u0431\u043e\u0439 \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u043d\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438", - "NotificationOptionInstallationFailed": "\u0421\u0431\u043e\u0439 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438", - "NotificationOptionNewLibraryContent": "\u041d\u043e\u0432\u043e\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043e", - "NotificationOptionNewLibraryContentMultiple": "\u041d\u043e\u0432\u043e\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043e (\u043c\u043d\u043e\u0433\u043e\u043a\u0440\u0430\u0442\u043d\u043e)", - "NotificationOptionCameraImageUploaded": "\u041f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0430 \u0432\u044b\u043a\u043b\u0430\u0434\u043a\u0430 \u043e\u0442\u0441\u043d\u044f\u0442\u043e\u0433\u043e \u0441 \u043a\u0430\u043c\u0435\u0440\u044b", - "NotificationOptionUserLockedOut": "\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d", - "NotificationOptionServerRestartRequired": "\u0422\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a \u0441\u0435\u0440\u0432\u0435\u0440\u0430", - "ViewTypePlaylists": "\u041f\u043b\u0435\u0439-\u043b\u0438\u0441\u0442\u044b", - "ViewTypeMovies": "\u041a\u0438\u043d\u043e", - "ViewTypeTvShows": "\u0422\u0412", - "ViewTypeGames": "\u0418\u0433\u0440\u044b", - "ViewTypeMusic": "\u041c\u0443\u0437\u044b\u043a\u0430", - "ViewTypeMusicGenres": "\u0416\u0430\u043d\u0440\u044b", - "ViewTypeMusicArtists": "\u0418\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u0438", - "ViewTypeBoxSets": "\u041a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438", - "ViewTypeChannels": "\u041a\u0430\u043d\u0430\u043b\u044b", - "ViewTypeLiveTV": "\u042d\u0444\u0438\u0440", - "ViewTypeLiveTvNowPlaying": "\u0412 \u044d\u0444\u0438\u0440\u0435", - "ViewTypeLatestGames": "\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u0438\u0433\u0440\u044b", - "ViewTypeRecentlyPlayedGames": "C\u044b\u0433\u0440\u0430\u043d\u043d\u044b\u0435 \u043d\u0435\u0434\u0430\u0432\u043d\u043e", - "ViewTypeGameFavorites": "\u0418\u0437\u0431\u0440\u0430\u043d\u043d\u043e\u0435", - "ViewTypeGameSystems": "\u0418\u0433\u0440\u043e\u0432\u044b\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b", - "ViewTypeGameGenres": "\u0416\u0430\u043d\u0440\u044b", - "ViewTypeTvResume": "\u0412\u043e\u0437\u043e\u0431\u043d\u043e\u0432\u0438\u043c\u043e\u0435", - "ViewTypeTvNextUp": "\u041e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u0435", - "ViewTypeTvLatest": "\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435", - "ViewTypeTvShowSeries": "\u0421\u0435\u0440\u0438\u0430\u043b\u044b", - "ViewTypeTvGenres": "\u0416\u0430\u043d\u0440\u044b", - "ViewTypeTvFavoriteSeries": "\u0418\u0437\u0431\u0440\u0430\u043d\u043d\u044b\u0435 \u0441\u0435\u0440\u0438\u0430\u043b\u044b", - "ViewTypeTvFavoriteEpisodes": "\u0418\u0437\u0431\u0440\u0430\u043d\u043d\u044b\u0435 \u044d\u043f\u0438\u0437\u043e\u0434\u044b", - "ViewTypeMovieResume": "\u0412\u043e\u0437\u043e\u0431\u043d\u043e\u0432\u0438\u043c\u043e\u0435", - "ViewTypeMovieLatest": "\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435", - "ViewTypeMovieMovies": "\u0424\u0438\u043b\u044c\u043c\u044b", - "ViewTypeMovieCollections": "\u041a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438", - "ViewTypeMovieFavorites": "\u0418\u0437\u0431\u0440\u0430\u043d\u043d\u043e\u0435", - "ViewTypeMovieGenres": "\u0416\u0430\u043d\u0440\u044b", - "ViewTypeMusicLatest": "\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435", - "ViewTypeMusicPlaylists": "\u041f\u043b\u0435\u0439-\u043b\u0438\u0441\u0442\u044b", - "ViewTypeMusicAlbums": "\u0410\u043b\u044c\u0431\u043e\u043c\u044b", - "ViewTypeMusicAlbumArtists": "\u0418\u0441\u043f-\u043b\u0438 \u0430\u043b\u044c\u0431\u043e\u043c\u0430", - "HeaderOtherDisplaySettings": "\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f", - "ViewTypeMusicSongs": "\u041a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0438", - "ViewTypeMusicFavorites": "\u0418\u0437\u0431\u0440\u0430\u043d\u043d\u043e\u0435", - "ViewTypeMusicFavoriteAlbums": "\u0418\u0437\u0431\u0440\u0430\u043d\u043d\u044b\u0435 \u0430\u043b\u044c\u0431\u043e\u043c\u044b", - "ViewTypeMusicFavoriteArtists": "\u0418\u0437\u0431\u0440\u0430\u043d\u043d\u044b\u0435 \u0438\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u0438", - "ViewTypeMusicFavoriteSongs": "\u0418\u0437\u0431\u0440\u0430\u043d\u043d\u044b\u0435 \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0438", - "ViewTypeFolders": "\u041f\u0430\u043f\u043a\u0438", - "ViewTypeLiveTvRecordingGroups": "\u0417\u0430\u043f\u0438\u0441\u0438", - "ViewTypeLiveTvChannels": "\u041a\u0430\u043d\u0430\u043b\u044b", + "AppDeviceValues": "\u041f\u0440\u0438\u043b.: {0}, \u0423\u0441\u0442\u0440.: {1}", + "UserDownloadingItemWithValues": "{0} \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442 {1}", + "HeaderLiveTV": "\u042d\u0444\u0438\u0440", + "ChapterNameValue": "\u0421\u0446\u0435\u043d\u0430 {0}", "ScheduledTaskFailedWithName": "{0} - \u043d\u0435\u0443\u0434\u0430\u0447\u043d\u0430", "LabelRunningTimeValue": "\u0412\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f: {0}", "ScheduledTaskStartedWithName": "{0} - \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u0430", "VersionNumber": "\u0412\u0435\u0440\u0441\u0438\u044f {0}", "PluginInstalledWithName": "{0} - \u0431\u044b\u043b\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043e", + "StartupEmbyServerIsLoading": "Emby Server \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442\u0441\u044f. \u041f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u0435 \u043f\u043e\u043f\u044b\u0442\u043a\u0443 \u0432 \u0431\u043b\u0438\u0436\u0430\u0439\u0448\u0435\u0435 \u0432\u0440\u0435\u043c\u044f.", "PluginUpdatedWithName": "{0} - \u0431\u044b\u043b\u043e \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u043e", "PluginUninstalledWithName": "{0} - \u0431\u044b\u043b\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u043e", - "ItemAddedWithName": "{0} (\u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043e \u0432 \u043c\u0435\u0434\u0438\u0430\u0442\u0435\u043a\u0443)", - "ItemRemovedWithName": "{0} (\u0438\u0437\u044a\u044f\u0442\u043e \u0438\u0437 \u043c\u0435\u0434\u0438\u0430\u0442\u0435\u043a\u0438)", + "ItemAddedWithName": "{0} - \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043e \u0432 \u043c\u0435\u0434\u0438\u0430\u0442\u0435\u043a\u0443", + "ItemRemovedWithName": "{0} - \u0438\u0437\u044a\u044f\u0442\u043e \u0438\u0437 \u043c\u0435\u0434\u0438\u0430\u0442\u0435\u043a\u0438", "LabelIpAddressValue": "IP-\u0430\u0434\u0440\u0435\u0441: {0}", "DeviceOnlineWithName": "{0} - \u043f\u043e\u0434\u043a\u043b. \u0443\u0441\u0442-\u043d\u043e", "UserOnlineFromDevice": "{0} - \u043f\u043e\u0434\u043a\u043b. \u0441 {1} \u0443\u0441\u0442-\u043d\u043e", "ProviderValue": "\u041f\u043e\u0441\u0442\u0430\u0432\u0449\u0438\u043a: {0}", - "SubtitlesDownloadedForItem": "\u0421\u0443\u0431\u0442\u0438\u0442\u0440\u044b \u0434\u043b\u044f {0} \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u043b\u0438\u0441\u044c", - "UserConfigurationUpdatedWithName": "\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u043f\u043e\u043b\u044c\u0437-\u043b\u044f {0} \u0431\u044b\u043b\u0430 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0430", + "SubtitlesDownloadedForItem": "\u0421\u0443\u0431\u0442\u0438\u0442\u0440\u044b \u043a {0} \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u044b", "UserCreatedWithName": "\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c {0} \u0431\u044b\u043b \u0441\u043e\u0437\u0434\u0430\u043d", "UserPasswordChangedWithName": "\u041f\u0430\u0440\u043e\u043b\u044c \u043f\u043e\u043b\u044c\u0437-\u043b\u044f {0} \u0431\u044b\u043b \u0438\u0437\u043c\u0435\u043d\u0451\u043d", "UserDeletedWithName": "\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c {0} \u0431\u044b\u043b \u0443\u0434\u0430\u043b\u0451\u043d", - "MessageServerConfigurationUpdated": "\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0431\u044b\u043b\u0430 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0430", - "MessageNamedServerConfigurationUpdatedWithValue": "\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 (\u0440\u0430\u0437\u0434\u0435\u043b {0}) \u0431\u044b\u043b\u0430 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0430", + "UserConfigurationUpdatedWithName": "\u041a\u043e\u043d\u0444\u0438\u0433-\u0438\u044f \u043f\u043e\u043b\u044c\u0437-\u043b\u044f {0} \u0431\u044b\u043b\u0430 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0430", + "MessageServerConfigurationUpdated": "\u041a\u043e\u043d\u0444\u0438\u0433-\u0438\u044f \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0431\u044b\u043b\u0430 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0430", + "MessageNamedServerConfigurationUpdatedWithValue": "\u041a\u043e\u043d\u0444\u0438\u0433-\u0438\u044f \u0441\u0435\u0440\u0432\u0435\u0440\u0430 (\u0440\u0430\u0437\u0434\u0435\u043b {0}) \u0431\u044b\u043b\u0430 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0430", "MessageApplicationUpdated": "Emby Server \u0431\u044b\u043b \u043e\u0431\u043d\u043e\u0432\u043b\u0451\u043d", "FailedLoginAttemptWithUserName": "{0} - \u043f\u043e\u043f\u044b\u0442\u043a\u0430 \u0432\u0445\u043e\u0434\u0430 \u043d\u0435\u0443\u0434\u0430\u0447\u043d\u0430", "AuthenticationSucceededWithUserName": "{0} - \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u0443\u0441\u043f\u0435\u0448\u043d\u0430", - "DeviceOfflineWithName": "{0} - \u043f\u043e\u0434\u043a\u043b. \u0440\u0430\u0437\u044a-\u043d\u043e", - "UserLockedOutWithName": "\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c {0} \u0431\u044b\u043b \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d", "UserOfflineFromDevice": "{0} - \u043f\u043e\u0434\u043a\u043b. \u0441 {1} \u0440\u0430\u0437\u044a-\u043d\u043e", + "DeviceOfflineWithName": "{0} - \u043f\u043e\u0434\u043a\u043b. \u0440\u0430\u0437\u044a-\u043d\u043e", "UserStartedPlayingItemWithValues": "{0} - \u0432\u043e\u0441\u043f\u0440. \u00ab{1}\u00bb \u0437\u0430\u043f-\u043d\u043e", "UserStoppedPlayingItemWithValues": "{0} - \u0432\u043e\u0441\u043f\u0440. \u00ab{1}\u00bb \u043e\u0441\u0442-\u043d\u043e", + "NotificationOptionPluginError": "\u0421\u0431\u043e\u0439 \u043f\u043b\u0430\u0433\u0438\u043d\u0430", + "NotificationOptionApplicationUpdateAvailable": "\u0418\u043c\u0435\u0435\u0442\u0441\u044f \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f", + "NotificationOptionApplicationUpdateInstalled": "\u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043e", + "NotificationOptionPluginUpdateInstalled": "\u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u043b\u0430\u0433\u0438\u043d\u0430 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043e", + "NotificationOptionPluginInstalled": "\u041f\u043b\u0430\u0433\u0438\u043d \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d", + "NotificationOptionPluginUninstalled": "\u041f\u043b\u0430\u0433\u0438\u043d \u0443\u0434\u0430\u043b\u0451\u043d", + "NotificationOptionVideoPlayback": "\u0412\u043e\u0441\u043f\u0440-\u0438\u0435 \u0432\u0438\u0434\u0435\u043e \u0437\u0430\u043f-\u043d\u043e", + "NotificationOptionAudioPlayback": "\u0412\u043e\u0441\u043f\u0440-\u0438\u0435 \u0430\u0443\u0434\u0438\u043e \u0437\u0430\u043f-\u043d\u043e", + "NotificationOptionGamePlayback": "\u0412\u043e\u0441\u043f\u0440-\u0438\u0435 \u0438\u0433\u0440\u044b \u0437\u0430\u043f-\u043d\u043e", + "NotificationOptionVideoPlaybackStopped": "\u0412\u043e\u0441\u043f-\u0438\u0435 \u0432\u0438\u0434\u0435\u043e \u043e\u0441\u0442-\u043d\u043e", + "NotificationOptionAudioPlaybackStopped": "\u0412\u043e\u0441\u043f-\u0438\u0435 \u0430\u0443\u0434\u0438\u043e \u043e\u0441\u0442-\u043d\u043e", + "NotificationOptionGamePlaybackStopped": "\u0412\u043e\u0441\u043f-\u0438\u0435 \u0438\u0433\u0440\u044b \u043e\u0441\u0442-\u043d\u043e", + "NotificationOptionTaskFailed": "\u0421\u0431\u043e\u0439 \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u043d\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438", + "NotificationOptionInstallationFailed": "\u0421\u0431\u043e\u0439 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438", + "NotificationOptionNewLibraryContent": "\u041d\u043e\u0432\u043e\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043e", + "NotificationOptionCameraImageUploaded": "\u041f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0430 \u0432\u044b\u043a\u043b\u0430\u0434\u043a\u0430 \u043e\u0442\u0441\u043d\u044f\u0442\u043e\u0433\u043e \u0441 \u043a\u0430\u043c\u0435\u0440\u044b", + "NotificationOptionUserLockedOut": "\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d", + "NotificationOptionServerRestartRequired": "\u0422\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a \u0441\u0435\u0440\u0432\u0435\u0440\u0430", + "UserLockedOutWithName": "\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c {0} \u0431\u044b\u043b \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d", "SubtitleDownloadFailureForItem": "\u0421\u0443\u0431\u0442\u0438\u0442\u0440\u044b \u043a {0} \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c", - "HeaderUnidentified": "\u041d\u0435 \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u043d\u043e", - "HeaderImagePrimary": "\u0413\u043e\u043b\u043e\u0432\u043d\u043e\u0439", - "HeaderImageBackdrop": "\u0417\u0430\u0434\u043d\u0438\u043a", - "HeaderImageLogo": "\u041b\u043e\u0433\u043e\u0442\u0438\u043f", - "HeaderUserPrimaryImage": "\u0420\u0438\u0441\u0443\u043d\u043e\u043a \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f", - "HeaderOverview": "\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435", - "HeaderShortOverview": "\u041a\u0440\u0430\u0442\u043a\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435", - "HeaderType": "\u0422\u0438\u043f", - "HeaderSeverity": "\u0412\u0430\u0436\u043d\u043e\u0441\u0442\u044c", - "HeaderUser": "\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c", - "HeaderName": "\u0418\u043c\u044f (\u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435)", - "HeaderDate": "\u0414\u0430\u0442\u0430", - "HeaderPremiereDate": "\u0414\u0430\u0442\u0430 \u043f\u0440\u0435\u043c\u044c\u0435\u0440\u044b", - "HeaderDateAdded": "\u0414\u0430\u0442\u0430 \u0434\u043e\u0431.", - "HeaderReleaseDate": "\u0414\u0430\u0442\u0430 \u0432\u044b\u043f.", - "HeaderRuntime": "\u0414\u043b\u0438\u0442.", - "HeaderPlayCount": "\u041a\u043e\u043b-\u0432\u043e \u0432\u043e\u0441\u043f\u0440.", - "HeaderSeason": "\u0421\u0435\u0437\u043e\u043d", - "HeaderSeasonNumber": "\u2116 \u0441\u0435\u0437\u043e\u043d\u0430", - "HeaderSeries": "\u0421\u0435\u0440\u0438\u0430\u043b:", - "HeaderNetwork": "\u0422\u0435\u043b\u0435\u0441\u0435\u0442\u044c", - "HeaderYear": "\u0413\u043e\u0434:", - "HeaderYears": "\u0413\u043e\u0434\u044b:", - "HeaderParentalRating": "\u0412\u043e\u0437\u0440. \u043a\u0430\u0442.", - "HeaderCommunityRating": "\u041e\u0431\u0449. \u043e\u0446\u0435\u043d\u043a\u0430", - "HeaderTrailers": "\u0422\u0440\u0435\u0439\u043b.", - "HeaderSpecials": "\u0421\u043f\u0435\u0446.", - "HeaderGameSystems": "\u0418\u0433\u0440. \u0441\u0438\u0441\u0442\u0435\u043c\u044b", - "HeaderPlayers": "\u0418\u0433\u0440\u043e\u043a\u0438:", - "HeaderAlbumArtists": "\u0418\u0441\u043f-\u043b\u0438 \u0430\u043b\u044c\u0431\u043e\u043c\u0430", - "HeaderAlbums": "\u0410\u043b\u044c\u0431\u043e\u043c\u044b", - "HeaderDisc": "\u0414\u0438\u0441\u043a", - "HeaderTrack": "\u0414\u043e\u0440-\u043a\u0430", - "HeaderAudio": "\u0410\u0443\u0434\u0438\u043e", - "HeaderVideo": "\u0412\u0438\u0434\u0435\u043e", - "HeaderEmbeddedImage": "\u0412\u043d\u0435\u0434\u0440\u0451\u043d\u043d\u044b\u0439 \u0440\u0438\u0441\u0443\u043d\u043e\u043a", - "HeaderResolution": "\u0420\u0430\u0437\u0440.", - "HeaderSubtitles": "\u0421\u0443\u0431\u0442.", - "HeaderGenres": "\u0416\u0430\u043d\u0440\u044b", - "HeaderCountries": "\u0421\u0442\u0440\u0430\u043d\u044b", - "HeaderStatus": "\u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435", - "HeaderTracks": "\u0414\u043e\u0440-\u043a\u0438", - "HeaderMusicArtist": "\u041c\u0443\u0437. \u0438\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c", - "HeaderLocked": "\u0417\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u043e", - "HeaderStudios": "\u0421\u0442\u0443\u0434\u0438\u0438", - "HeaderActor": "\u0410\u043a\u0442\u0451\u0440\u044b", - "HeaderComposer": "\u041a\u043e\u043c\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u044b", - "HeaderDirector": "\u0420\u0435\u0436\u0438\u0441\u0441\u0451\u0440\u044b", - "HeaderGuestStar": "\u041f\u0440\u0438\u0433\u043b. \u0430\u043a\u0442\u0451\u0440", - "HeaderProducer": "\u041f\u0440\u043e\u0434\u044e\u0441\u0435\u0440\u044b", - "HeaderWriter": "\u0421\u0446\u0435\u043d\u0430\u0440\u0438\u0441\u0442\u044b", - "HeaderParentalRatings": "\u0412\u043e\u0437\u0440\u0430\u0441\u0442\u043d\u0430\u044f \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f", - "HeaderCommunityRatings": "\u041e\u0431\u0449. \u043e\u0446\u0435\u043d\u043a\u0438", - "StartupEmbyServerIsLoading": "Emby Server \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442\u0441\u044f. \u041f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u0435 \u043f\u043e\u043f\u044b\u0442\u043a\u0443 \u0432 \u0431\u043b\u0438\u0436\u0430\u0439\u0448\u0435\u0435 \u0432\u0440\u0435\u043c\u044f." + "Sync": "\u0421\u0438\u043d\u0445\u0440\u043e", + "User": "\u041f\u043e\u043b\u044c\u0437-\u043b\u044c", + "System": "\u0421\u0438\u0441\u0442\u0435\u043c\u0430", + "Application": "\u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435", + "Plugin": "\u041f\u043b\u0430\u0433\u0438\u043d", + "LabelExit": "\u0412\u044b\u0445\u043e\u0434", + "LabelVisitCommunity": "\u041f\u043e\u0441\u0435\u0449\u0435\u043d\u0438\u0435 \u0421\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0430", + "LabelBrowseLibrary": "\u041d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u044f \u043f\u043e \u043c\u0435\u0434\u0438\u0430\u0442\u0435\u043a\u0435", + "LabelConfigureServer": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 Emby", + "LabelRestartServer": "\u041f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a \u0441\u0435\u0440\u0432\u0435\u0440\u0430" }
\ No newline at end of file diff --git a/Emby.Server.Implementations/Localization/Core/sk.json b/Emby.Server.Implementations/Localization/Core/sk.json new file mode 100644 index 000000000..98f60e5e1 --- /dev/null +++ b/Emby.Server.Implementations/Localization/Core/sk.json @@ -0,0 +1,96 @@ +{ + "Latest": "Latest", + "ValueSpecialEpisodeName": "Special - {0}", + "Inherit": "Inherit", + "Books": "Books", + "Music": "Music", + "Games": "Games", + "Photos": "Photos", + "MixedContent": "Mixed content", + "MusicVideos": "Music videos", + "HomeVideos": "Home videos", + "Playlists": "Playlists", + "HeaderRecordingGroups": "Recording Groups", + "HeaderContinueWatching": "Continue Watching", + "HeaderFavoriteArtists": "Favorite Artists", + "HeaderFavoriteSongs": "Ob\u013e\u00faben\u00e9 pesni\u010dky", + "HeaderAlbumArtists": "Album Artists", + "HeaderFavoriteAlbums": "Favorite Albums", + "HeaderFavoriteEpisodes": "Favorite Episodes", + "HeaderFavoriteShows": "Ob\u013e\u00faben\u00e9 seri\u00e1ly", + "HeaderNextUp": "Next Up", + "Favorites": "Ob\u013e\u00faben\u00e9", + "Collections": "Collections", + "Channels": "Channels", + "Movies": "Movies", + "Albums": "Albums", + "Artists": "Artists", + "Folders": "Folders", + "Songs": "Songs", + "TvShows": "TV Shows", + "Shows": "Series", + "Genres": "Genres", + "NameSeasonNumber": "Season {0}", + "AppDeviceValues": "App: {0}, Device: {1}", + "UserDownloadingItemWithValues": "{0} is downloading {1}", + "HeaderLiveTV": "Live TV", + "ChapterNameValue": "Chapter {0}", + "ScheduledTaskFailedWithName": "{0} failed", + "LabelRunningTimeValue": "Running time: {0}", + "ScheduledTaskStartedWithName": "{0} started", + "VersionNumber": "Version {0}", + "PluginInstalledWithName": "{0} was installed", + "StartupEmbyServerIsLoading": "Emby Server is loading. Please try again shortly.", + "PluginUpdatedWithName": "{0} was updated", + "PluginUninstalledWithName": "{0} was uninstalled", + "ItemAddedWithName": "{0} was added to the library", + "ItemRemovedWithName": "{0} was removed from the library", + "LabelIpAddressValue": "Ip address: {0}", + "DeviceOnlineWithName": "{0} is connected", + "UserOnlineFromDevice": "{0} is online from {1}", + "ProviderValue": "Provider: {0}", + "SubtitlesDownloadedForItem": "Subtitles downloaded for {0}", + "UserCreatedWithName": "User {0} has been created", + "UserPasswordChangedWithName": "Password has been changed for user {0}", + "UserDeletedWithName": "User {0} has been deleted", + "UserConfigurationUpdatedWithName": "User configuration has been updated for {0}", + "MessageServerConfigurationUpdated": "Server configuration has been updated", + "MessageNamedServerConfigurationUpdatedWithValue": "Server configuration section {0} has been updated", + "MessageApplicationUpdated": "Emby Server has been updated", + "FailedLoginAttemptWithUserName": "Failed login attempt from {0}", + "AuthenticationSucceededWithUserName": "{0} successfully authenticated", + "UserOfflineFromDevice": "{0} has disconnected from {1}", + "DeviceOfflineWithName": "{0} has disconnected", + "UserStartedPlayingItemWithValues": "{0} has started playing {1}", + "UserStoppedPlayingItemWithValues": "{0} has stopped playing {1}", + "NotificationOptionPluginError": "Plugin failure", + "NotificationOptionApplicationUpdateAvailable": "Application update available", + "NotificationOptionApplicationUpdateInstalled": "Application update installed", + "NotificationOptionPluginUpdateInstalled": "Plugin update installed", + "NotificationOptionPluginInstalled": "Plugin installed", + "NotificationOptionPluginUninstalled": "Plugin uninstalled", + "NotificationOptionVideoPlayback": "Video playback started", + "NotificationOptionAudioPlayback": "Audio playback started", + "NotificationOptionGamePlayback": "Game playback started", + "NotificationOptionVideoPlaybackStopped": "Video playback stopped", + "NotificationOptionAudioPlaybackStopped": "Audio playback stopped", + "NotificationOptionGamePlaybackStopped": "Game playback stopped", + "NotificationOptionTaskFailed": "Scheduled task failure", + "NotificationOptionInstallationFailed": "Installation failure", + "NotificationOptionNewLibraryContent": "New content added", + "NotificationOptionCameraImageUploaded": "Camera image uploaded", + "NotificationOptionUserLockedOut": "User locked out", + "NotificationOptionServerRestartRequired": "Server restart required", + "UserLockedOutWithName": "User {0} has been locked out", + "SubtitleDownloadFailureForItem": "Subtitles failed to download for {0}", + "Sync": "Sync", + "User": "User", + "System": "System", + "Application": "Application", + "Plugin": "Plugin", + "LabelExit": "Exit", + "LabelVisitCommunity": "Visit Community", + "LabelBrowseLibrary": "Browse Library", + "LabelConfigureServer": "Configure Emby", + "LabelRestartServer": "Restart Server" +}
\ No newline at end of file diff --git a/Emby.Server.Implementations/Localization/Core/sl-SI.json b/Emby.Server.Implementations/Localization/Core/sl-SI.json index 0631e3fa8..cb8e080e4 100644 --- a/Emby.Server.Implementations/Localization/Core/sl-SI.json +++ b/Emby.Server.Implementations/Localization/Core/sl-SI.json @@ -1,102 +1,46 @@ { - "DbUpgradeMessage": "Prosimo pocakajte podatkovna baza Emby Streznika se posodablja. {0}% koncano.", - "AppDeviceValues": "App: {0}, Device: {1}", - "UserDownloadingItemWithValues": "{0} is downloading {1}", - "FolderTypeMixed": "Mixed content", - "FolderTypeMovies": "Movies", - "FolderTypeMusic": "Music", - "FolderTypeAdultVideos": "Adult videos", - "FolderTypePhotos": "Photos", - "FolderTypeMusicVideos": "Music videos", - "FolderTypeHomeVideos": "Home videos", - "FolderTypeGames": "Games", - "FolderTypeBooks": "Books", - "FolderTypeTvShows": "TV", - "FolderTypeInherit": "Inherit", - "HeaderCastCrew": "Cast & Crew", - "HeaderPeople": "People", + "Latest": "Latest", "ValueSpecialEpisodeName": "Special - {0}", - "LabelChapterName": "Chapter {0}", + "Inherit": "Inherit", + "Books": "Books", + "Music": "Music", + "Games": "Games", + "Photos": "Photos", + "MixedContent": "Mixed content", + "MusicVideos": "Music videos", + "HomeVideos": "Home videos", + "Playlists": "Playlists", + "HeaderRecordingGroups": "Recording Groups", + "HeaderContinueWatching": "Continue Watching", + "HeaderFavoriteArtists": "Favorite Artists", + "HeaderFavoriteSongs": "Favorite Songs", + "HeaderAlbumArtists": "Album Artists", + "HeaderFavoriteAlbums": "Favorite Albums", + "HeaderFavoriteEpisodes": "Favorite Episodes", + "HeaderFavoriteShows": "Favorite Shows", + "HeaderNextUp": "Next Up", + "Favorites": "Favorites", + "Collections": "Collections", + "Channels": "Channels", + "Movies": "Movies", + "Albums": "Albums", + "Artists": "Artists", + "Folders": "Folders", + "Songs": "Songs", + "TvShows": "TV Shows", + "Shows": "Serije", + "Genres": "Genres", "NameSeasonNumber": "Season {0}", - "LabelExit": "Izhod", - "LabelVisitCommunity": "Obiscite Skupnost", - "LabelGithub": "Github", - "LabelApiDocumentation": "Api Dokumentacija", - "LabelDeveloperResources": "Vsebine za razvijalce", - "LabelBrowseLibrary": "Brskanje po knjiznici", - "LabelConfigureServer": "Emby Nastavitve", - "LabelRestartServer": "Ponovni Zagon Streznika", - "CategorySync": "Sync", - "CategoryUser": "Uporabnik", - "CategorySystem": "Sistem", - "CategoryApplication": "Aplikacija", - "CategoryPlugin": "Vticnik", - "NotificationOptionPluginError": "Napaka v vticniku", - "NotificationOptionApplicationUpdateAvailable": "Na voljo je posodobitev", - "NotificationOptionApplicationUpdateInstalled": "Posodobitev je bila namescena", - "NotificationOptionPluginUpdateInstalled": "Plugin update installed", - "NotificationOptionPluginInstalled": "Vticnik namescen", - "NotificationOptionPluginUninstalled": "Vticnik odstranjen", - "NotificationOptionVideoPlayback": "Video playback started", - "NotificationOptionAudioPlayback": "Audio playback started", - "NotificationOptionGamePlayback": "Game playback started", - "NotificationOptionVideoPlaybackStopped": "Predvajanje videa koncano", - "NotificationOptionAudioPlaybackStopped": "Predvajanje audia koncano", - "NotificationOptionGamePlaybackStopped": "Game playback stopped", - "NotificationOptionTaskFailed": "Scheduled task failure", - "NotificationOptionInstallationFailed": "Napaka v namestitvi", - "NotificationOptionNewLibraryContent": "Dodana nova vsebina", - "NotificationOptionNewLibraryContentMultiple": "Dodane nove vsebine", - "NotificationOptionCameraImageUploaded": "Camera image uploaded", - "NotificationOptionUserLockedOut": "User locked out", - "NotificationOptionServerRestartRequired": "Zahtevan je ponovni zagon", - "ViewTypePlaylists": "Playliste", - "ViewTypeMovies": "Filmi", - "ViewTypeTvShows": "TV", - "ViewTypeGames": "Igre", - "ViewTypeMusic": "Glasba", - "ViewTypeMusicGenres": "Zvrsti", - "ViewTypeMusicArtists": "Izvajalci", - "ViewTypeBoxSets": "Zbirke", - "ViewTypeChannels": "Kanali", - "ViewTypeLiveTV": "TV v Zivo", - "ViewTypeLiveTvNowPlaying": "Now Airing", - "ViewTypeLatestGames": "Zadnje Igre", - "ViewTypeRecentlyPlayedGames": "Recently Played", - "ViewTypeGameFavorites": "Priljubljeno", - "ViewTypeGameSystems": "Game Systems", - "ViewTypeGameGenres": "Zvrsti", - "ViewTypeTvResume": "Nadaljuj", - "ViewTypeTvNextUp": "Next Up", - "ViewTypeTvLatest": "Latest", - "ViewTypeTvShowSeries": "Serije", - "ViewTypeTvGenres": "Zvrsti", - "ViewTypeTvFavoriteSeries": "Priljubljene Serije", - "ViewTypeTvFavoriteEpisodes": "Priljubljene Epizode", - "ViewTypeMovieResume": "Nadaljuj", - "ViewTypeMovieLatest": "Latest", - "ViewTypeMovieMovies": "Filmi", - "ViewTypeMovieCollections": "Zbirke", - "ViewTypeMovieFavorites": "Priljubljeno", - "ViewTypeMovieGenres": "Genres", - "ViewTypeMusicLatest": "Latest", - "ViewTypeMusicPlaylists": "Playlists", - "ViewTypeMusicAlbums": "Albumi", - "ViewTypeMusicAlbumArtists": "Album Artists", - "HeaderOtherDisplaySettings": "Display Settings", - "ViewTypeMusicSongs": "Songs", - "ViewTypeMusicFavorites": "Favorites", - "ViewTypeMusicFavoriteAlbums": "Priljubljeni Albumi", - "ViewTypeMusicFavoriteArtists": "Priljubljeni Izvajalci", - "ViewTypeMusicFavoriteSongs": "Priljubljene skladbe", - "ViewTypeFolders": "Folders", - "ViewTypeLiveTvRecordingGroups": "Recordings", - "ViewTypeLiveTvChannels": "Channels", + "AppDeviceValues": "App: {0}, Device: {1}", + "UserDownloadingItemWithValues": "{0} is downloading {1}", + "HeaderLiveTV": "Live TV", + "ChapterNameValue": "Chapter {0}", "ScheduledTaskFailedWithName": "{0} failed", "LabelRunningTimeValue": "Running time: {0}", "ScheduledTaskStartedWithName": "{0} started", - "VersionNumber": "Verzija {0}", + "VersionNumber": "Version {0}", "PluginInstalledWithName": "{0} was installed", + "StartupEmbyServerIsLoading": "Emby Server is loading. Please try again shortly.", "PluginUpdatedWithName": "{0} was updated", "PluginUninstalledWithName": "{0} was uninstalled", "ItemAddedWithName": "{0} was added to the library", @@ -106,73 +50,47 @@ "UserOnlineFromDevice": "{0} is online from {1}", "ProviderValue": "Provider: {0}", "SubtitlesDownloadedForItem": "Subtitles downloaded for {0}", - "UserConfigurationUpdatedWithName": "User configuration has been updated for {0}", "UserCreatedWithName": "User {0} has been created", "UserPasswordChangedWithName": "Password has been changed for user {0}", "UserDeletedWithName": "User {0} has been deleted", + "UserConfigurationUpdatedWithName": "User configuration has been updated for {0}", "MessageServerConfigurationUpdated": "Server configuration has been updated", "MessageNamedServerConfigurationUpdatedWithValue": "Server configuration section {0} has been updated", "MessageApplicationUpdated": "Emby Server has been updated", "FailedLoginAttemptWithUserName": "Failed login attempt from {0}", "AuthenticationSucceededWithUserName": "{0} successfully authenticated", - "DeviceOfflineWithName": "{0} has disconnected", - "UserLockedOutWithName": "User {0} has been locked out", "UserOfflineFromDevice": "{0} has disconnected from {1}", + "DeviceOfflineWithName": "{0} has disconnected", "UserStartedPlayingItemWithValues": "{0} has started playing {1}", "UserStoppedPlayingItemWithValues": "{0} has stopped playing {1}", + "NotificationOptionPluginError": "Plugin failure", + "NotificationOptionApplicationUpdateAvailable": "Application update available", + "NotificationOptionApplicationUpdateInstalled": "Application update installed", + "NotificationOptionPluginUpdateInstalled": "Plugin update installed", + "NotificationOptionPluginInstalled": "Plugin installed", + "NotificationOptionPluginUninstalled": "Plugin uninstalled", + "NotificationOptionVideoPlayback": "Video playback started", + "NotificationOptionAudioPlayback": "Audio playback started", + "NotificationOptionGamePlayback": "Game playback started", + "NotificationOptionVideoPlaybackStopped": "Video playback stopped", + "NotificationOptionAudioPlaybackStopped": "Audio playback stopped", + "NotificationOptionGamePlaybackStopped": "Game playback stopped", + "NotificationOptionTaskFailed": "Scheduled task failure", + "NotificationOptionInstallationFailed": "Installation failure", + "NotificationOptionNewLibraryContent": "New content added", + "NotificationOptionCameraImageUploaded": "Camera image uploaded", + "NotificationOptionUserLockedOut": "User locked out", + "NotificationOptionServerRestartRequired": "Server restart required", + "UserLockedOutWithName": "User {0} has been locked out", "SubtitleDownloadFailureForItem": "Subtitles failed to download for {0}", - "HeaderUnidentified": "Unidentified", - "HeaderImagePrimary": "Primary", - "HeaderImageBackdrop": "Backdrop", - "HeaderImageLogo": "Logo", - "HeaderUserPrimaryImage": "User Image", - "HeaderOverview": "Overview", - "HeaderShortOverview": "Short Overview", - "HeaderType": "Type", - "HeaderSeverity": "Severity", - "HeaderUser": "Uporabnik", - "HeaderName": "Name", - "HeaderDate": "Datum", - "HeaderPremiereDate": "Premiere Date", - "HeaderDateAdded": "Date Added", - "HeaderReleaseDate": "Release date", - "HeaderRuntime": "Runtime", - "HeaderPlayCount": "Play Count", - "HeaderSeason": "Season", - "HeaderSeasonNumber": "Season number", - "HeaderSeries": "Series:", - "HeaderNetwork": "Network", - "HeaderYear": "Year:", - "HeaderYears": "Years:", - "HeaderParentalRating": "Parental Rating", - "HeaderCommunityRating": "Community rating", - "HeaderTrailers": "Trailers", - "HeaderSpecials": "Specials", - "HeaderGameSystems": "Game Systems", - "HeaderPlayers": "Players:", - "HeaderAlbumArtists": "Album Artists", - "HeaderAlbums": "Albums", - "HeaderDisc": "Disc", - "HeaderTrack": "Track", - "HeaderAudio": "Audio", - "HeaderVideo": "Video", - "HeaderEmbeddedImage": "Embedded image", - "HeaderResolution": "Resolution", - "HeaderSubtitles": "Subtitles", - "HeaderGenres": "Genres", - "HeaderCountries": "Countries", - "HeaderStatus": "Status", - "HeaderTracks": "Tracks", - "HeaderMusicArtist": "Music artist", - "HeaderLocked": "Locked", - "HeaderStudios": "Studios", - "HeaderActor": "Actors", - "HeaderComposer": "Composers", - "HeaderDirector": "Directors", - "HeaderGuestStar": "Guest star", - "HeaderProducer": "Producers", - "HeaderWriter": "Writers", - "HeaderParentalRatings": "Parental Ratings", - "HeaderCommunityRatings": "Community ratings", - "StartupEmbyServerIsLoading": "Emby Server is loading. Please try again shortly." + "Sync": "Sync", + "User": "User", + "System": "System", + "Application": "Application", + "Plugin": "Plugin", + "LabelExit": "Exit", + "LabelVisitCommunity": "Visit Community", + "LabelBrowseLibrary": "Browse Library", + "LabelConfigureServer": "Configure Emby", + "LabelRestartServer": "Restart Server" }
\ No newline at end of file diff --git a/Emby.Server.Implementations/Localization/Core/sv.json b/Emby.Server.Implementations/Localization/Core/sv.json index 4a6565aff..a03881183 100644 --- a/Emby.Server.Implementations/Localization/Core/sv.json +++ b/Emby.Server.Implementations/Localization/Core/sv.json @@ -1,178 +1,96 @@ { - "DbUpgradeMessage": "V\u00e4nligen v\u00e4nta medan databasen p\u00e5 din Emby Server uppgraderas. {0}% klar", - "AppDeviceValues": "App: {0}, enhet: {1}", - "UserDownloadingItemWithValues": "{0} laddar ned {1}", - "FolderTypeMixed": "Blandat inneh\u00e5ll", - "FolderTypeMovies": "Filmer", - "FolderTypeMusic": "Musik", - "FolderTypeAdultVideos": "Inneh\u00e5ll f\u00f6r vuxna", - "FolderTypePhotos": "Foton", - "FolderTypeMusicVideos": "Musikvideor", - "FolderTypeHomeVideos": "Hemvideor", - "FolderTypeGames": "Spel", - "FolderTypeBooks": "B\u00f6cker", - "FolderTypeTvShows": "TV", - "FolderTypeInherit": "\u00c4rv", - "HeaderCastCrew": "Rollista & bes\u00e4ttning", - "HeaderPeople": "Personer", + "Latest": "Senaste", "ValueSpecialEpisodeName": "Specialavsnitt - {0}", - "LabelChapterName": "Kapitel {0}", + "Inherit": "\u00c4rv", + "Books": "B\u00f6cker", + "Music": "Musik", + "Games": "Spel", + "Photos": "Bilder", + "MixedContent": "Blandat inneh\u00e5ll", + "MusicVideos": "Musikvideos", + "HomeVideos": "Hemvideor", + "Playlists": "Spellistor", + "HeaderRecordingGroups": "Inspelningsgrupper", + "HeaderContinueWatching": "Forts\u00e4tt kolla p\u00e5", + "HeaderFavoriteArtists": "Favoritartister", + "HeaderFavoriteSongs": "Favoritl\u00e5tar", + "HeaderAlbumArtists": "Albumartister", + "HeaderFavoriteAlbums": "Favoritalbum", + "HeaderFavoriteEpisodes": "Favoritavsnitt", + "HeaderFavoriteShows": "Favoritserier", + "HeaderNextUp": "N\u00e4sta p\u00e5 tur", + "Favorites": "Favoriter", + "Collections": "Samlingar", + "Channels": "Kanaler", + "Movies": "Filmer", + "Albums": "Album", + "Artists": "Artister", + "Folders": "Mappar", + "Songs": "L\u00e5tar", + "TvShows": "TV Shows", + "Shows": "Serier", + "Genres": "Genrer", "NameSeasonNumber": "S\u00e4song {0}", - "LabelExit": "Avsluta", - "LabelVisitCommunity": "Bes\u00f6k v\u00e5rt diskussionsforum", - "LabelGithub": "Github", - "LabelApiDocumentation": "Api-dokumentation", - "LabelDeveloperResources": "Resurser f\u00f6r utvecklare", - "LabelBrowseLibrary": "Bl\u00e4ddra i biblioteket", - "LabelConfigureServer": "Konfigurera Emby", - "LabelRestartServer": "Starta om servern", - "CategorySync": "Synkronisera", - "CategoryUser": "Anv\u00e4ndare", - "CategorySystem": "System", - "CategoryApplication": "App", - "CategoryPlugin": "Till\u00e4gg", - "NotificationOptionPluginError": "Fel uppstod med till\u00e4gget", - "NotificationOptionApplicationUpdateAvailable": "Ny programversion tillg\u00e4nglig", - "NotificationOptionApplicationUpdateInstalled": "Programuppdatering installerad", - "NotificationOptionPluginUpdateInstalled": "Till\u00e4gg har uppdaterats", - "NotificationOptionPluginInstalled": "Till\u00e4gg har installerats", - "NotificationOptionPluginUninstalled": "Till\u00e4gg har avinstallerats", - "NotificationOptionVideoPlayback": "Videouppspelning har p\u00e5b\u00f6rjats", - "NotificationOptionAudioPlayback": "Ljuduppspelning har p\u00e5b\u00f6rjats", - "NotificationOptionGamePlayback": "Spel har startats", - "NotificationOptionVideoPlaybackStopped": "Videouppspelning stoppad", - "NotificationOptionAudioPlaybackStopped": "Ljuduppspelning stoppad", - "NotificationOptionGamePlaybackStopped": "Spel stoppat", - "NotificationOptionTaskFailed": "Schemalagd aktivitet har misslyckats", - "NotificationOptionInstallationFailed": "Fel vid installation", - "NotificationOptionNewLibraryContent": "Nytt inneh\u00e5ll har tillkommit", - "NotificationOptionNewLibraryContentMultiple": "Nytillkommet inneh\u00e5ll finns (flera objekt)", - "NotificationOptionCameraImageUploaded": "Kaberabild uppladdad", - "NotificationOptionUserLockedOut": "Anv\u00e4ndare har l\u00e5sts ute", - "NotificationOptionServerRestartRequired": "Servern m\u00e5ste startas om", - "ViewTypePlaylists": "Spellistor", - "ViewTypeMovies": "Filmer", - "ViewTypeTvShows": "TV", - "ViewTypeGames": "Spel", - "ViewTypeMusic": "Musik", - "ViewTypeMusicGenres": "Genrer", - "ViewTypeMusicArtists": "Artister", - "ViewTypeBoxSets": "Samlingar", - "ViewTypeChannels": "Kanaler", - "ViewTypeLiveTV": "Live-TV", - "ViewTypeLiveTvNowPlaying": "Visas nu", - "ViewTypeLatestGames": "Senaste spelen", - "ViewTypeRecentlyPlayedGames": "Nyligen spelade", - "ViewTypeGameFavorites": "Favoriter", - "ViewTypeGameSystems": "Spelsystem", - "ViewTypeGameGenres": "Genrer", - "ViewTypeTvResume": "\u00c5teruppta", - "ViewTypeTvNextUp": "N\u00e4stkommande", - "ViewTypeTvLatest": "Nytillkommet", - "ViewTypeTvShowSeries": "Serier", - "ViewTypeTvGenres": "Genrer", - "ViewTypeTvFavoriteSeries": "Favoritserier", - "ViewTypeTvFavoriteEpisodes": "Favoritavsnitt", - "ViewTypeMovieResume": "\u00c5teruppta", - "ViewTypeMovieLatest": "Nytillkommet", - "ViewTypeMovieMovies": "Filmer", - "ViewTypeMovieCollections": "Samlingar", - "ViewTypeMovieFavorites": "Favoriter", - "ViewTypeMovieGenres": "Genrer", - "ViewTypeMusicLatest": "Nytillkommet", - "ViewTypeMusicPlaylists": "Spellistor", - "ViewTypeMusicAlbums": "Album", - "ViewTypeMusicAlbumArtists": "Albumartister", - "HeaderOtherDisplaySettings": "Visningsalternativ", - "ViewTypeMusicSongs": "L\u00e5tar", - "ViewTypeMusicFavorites": "Favoriter", - "ViewTypeMusicFavoriteAlbums": "Favoritalbum", - "ViewTypeMusicFavoriteArtists": "Favoritartister", - "ViewTypeMusicFavoriteSongs": "Favoritl\u00e5tar", - "ViewTypeFolders": "Mappar", - "ViewTypeLiveTvRecordingGroups": "Inspelningar", - "ViewTypeLiveTvChannels": "Kanaler", + "AppDeviceValues": "App: {0}, Enhet: {1}", + "UserDownloadingItemWithValues": "{0} laddar ner {1}", + "HeaderLiveTV": "Live-TV", + "ChapterNameValue": "Kapitel {0}", "ScheduledTaskFailedWithName": "{0} misslyckades", "LabelRunningTimeValue": "Speltid: {0}", "ScheduledTaskStartedWithName": "{0} startad", "VersionNumber": "Version {0}", "PluginInstalledWithName": "{0} installerades", + "StartupEmbyServerIsLoading": "Emby server arbetar. Pr\u00f6va igen inom kort.", "PluginUpdatedWithName": "{0} uppdaterades", "PluginUninstalledWithName": "{0} avinstallerades", "ItemAddedWithName": "{0} lades till i biblioteket", - "ItemRemovedWithName": "{0} togs bort ur biblioteket", + "ItemRemovedWithName": "{0} togs bort fr\u00e5n biblioteket", "LabelIpAddressValue": "IP-adress: {0}", "DeviceOnlineWithName": "{0} \u00e4r ansluten", "UserOnlineFromDevice": "{0} \u00e4r uppkopplad fr\u00e5n {1}", "ProviderValue": "K\u00e4lla: {0}", - "SubtitlesDownloadedForItem": "Undertexter har laddats ner f\u00f6r {0}", - "UserConfigurationUpdatedWithName": "Anv\u00e4ndarinst\u00e4llningarna f\u00f6r {0} har uppdaterats", + "SubtitlesDownloadedForItem": "Undertexter har laddats ner till {0}", "UserCreatedWithName": "Anv\u00e4ndaren {0} har skapats", "UserPasswordChangedWithName": "L\u00f6senordet f\u00f6r {0} har \u00e4ndrats", "UserDeletedWithName": "Anv\u00e4ndaren {0} har tagits bort", + "UserConfigurationUpdatedWithName": "Anv\u00e4ndarinst\u00e4llningarna f\u00f6r {0} har uppdaterats", "MessageServerConfigurationUpdated": "Server konfigurationen har uppdaterats", - "MessageNamedServerConfigurationUpdatedWithValue": "Serverinst\u00e4llningarnas del {0} ar uppdaterats", + "MessageNamedServerConfigurationUpdatedWithValue": "Serverinst\u00e4llningarna {0} har uppdaterats", "MessageApplicationUpdated": "Emby Server har uppdaterats", "FailedLoginAttemptWithUserName": "Misslyckat inloggningsf\u00f6rs\u00f6k fr\u00e5n {0}", "AuthenticationSucceededWithUserName": "{0} har autentiserats", - "DeviceOfflineWithName": "{0} har avbrutit anslutningen", - "UserLockedOutWithName": "Anv\u00e4ndare {0} har l\u00e5sts ute", "UserOfflineFromDevice": "{0} har avbrutit anslutningen fr\u00e5n {1}", - "UserStartedPlayingItemWithValues": "{0} har p\u00e5b\u00f6rjat uppspelning av {1}", - "UserStoppedPlayingItemWithValues": "{0} har avslutat uppspelning av {1}", + "DeviceOfflineWithName": "{0} har tappat anslutningen", + "UserStartedPlayingItemWithValues": "{0} har b\u00f6rjat spela upp {1}", + "UserStoppedPlayingItemWithValues": "{0} har avslutat uppspelningen av {1}", + "NotificationOptionPluginError": "Fel uppstod med till\u00e4gget", + "NotificationOptionApplicationUpdateAvailable": "Ny programversion tillg\u00e4nglig", + "NotificationOptionApplicationUpdateInstalled": "Programuppdatering installerad", + "NotificationOptionPluginUpdateInstalled": "Till\u00e4gg har uppdaterats", + "NotificationOptionPluginInstalled": "Till\u00e4gg har installerats", + "NotificationOptionPluginUninstalled": "Till\u00e4gg har avinstallerats", + "NotificationOptionVideoPlayback": "Videouppspelning har p\u00e5b\u00f6rjats", + "NotificationOptionAudioPlayback": "Ljuduppspelning har p\u00e5b\u00f6rjats", + "NotificationOptionGamePlayback": "Spel har startats", + "NotificationOptionVideoPlaybackStopped": "Videouppspelning stoppad", + "NotificationOptionAudioPlaybackStopped": "Ljuduppspelning stoppad", + "NotificationOptionGamePlaybackStopped": "Spel stoppat", + "NotificationOptionTaskFailed": "Schemalagd aktivitet har misslyckats", + "NotificationOptionInstallationFailed": "Fel vid installation", + "NotificationOptionNewLibraryContent": "Nytt inneh\u00e5ll har lagts till", + "NotificationOptionCameraImageUploaded": "Kamerabild har laddats upp", + "NotificationOptionUserLockedOut": "Anv\u00e4ndare har l\u00e5sts ut", + "NotificationOptionServerRestartRequired": "Servern m\u00e5ste startas om", + "UserLockedOutWithName": "Anv\u00e4ndare {0} har l\u00e5sts ute", "SubtitleDownloadFailureForItem": "Nerladdning av undertexter f\u00f6r {0} misslyckades", - "HeaderUnidentified": "Oidentifierad", - "HeaderImagePrimary": "Huvudbild", - "HeaderImageBackdrop": "Bakgrundsbild", - "HeaderImageLogo": "Logotyp", - "HeaderUserPrimaryImage": "Anv\u00e4ndarbild", - "HeaderOverview": "\u00d6versikt", - "HeaderShortOverview": "Kort \u00f6versikt", - "HeaderType": "Typ", - "HeaderSeverity": "Severity", - "HeaderUser": "Anv\u00e4ndare", - "HeaderName": "Namn", - "HeaderDate": "Datum", - "HeaderPremiereDate": "Premi\u00e4rdatum", - "HeaderDateAdded": "Date Added", - "HeaderReleaseDate": "Premi\u00e4rdatum:", - "HeaderRuntime": "Speltid", - "HeaderPlayCount": "Antal spelningar", - "HeaderSeason": "S\u00e4song", - "HeaderSeasonNumber": "S\u00e4songsnummer:", - "HeaderSeries": "Serie:", - "HeaderNetwork": "TV-bolag", - "HeaderYear": "\u00c5r:", - "HeaderYears": "\u00c5r:", - "HeaderParentalRating": "Parental Rating", - "HeaderCommunityRating": "Anv\u00e4ndaromd\u00f6me", - "HeaderTrailers": "Trailers", - "HeaderSpecials": "Specialavsnitt", - "HeaderGameSystems": "Game Systems", - "HeaderPlayers": "Spelare:", - "HeaderAlbumArtists": "Albumartister", - "HeaderAlbums": "Album", - "HeaderDisc": "Skiva", - "HeaderTrack": "Sp\u00e5r", - "HeaderAudio": "Ljud", - "HeaderVideo": "Video", - "HeaderEmbeddedImage": "Infogad bild", - "HeaderResolution": "Uppl\u00f6sning", - "HeaderSubtitles": "Undertexter", - "HeaderGenres": "Genrer", - "HeaderCountries": "L\u00e4nder", - "HeaderStatus": "Status", - "HeaderTracks": "Sp\u00e5r", - "HeaderMusicArtist": "Musikartist", - "HeaderLocked": "L\u00e5st", - "HeaderStudios": "Studior", - "HeaderActor": "Sk\u00e5despelare", - "HeaderComposer": "Komposit\u00f6rer", - "HeaderDirector": "Regiss\u00f6r", - "HeaderGuestStar": "G\u00e4startist", - "HeaderProducer": "Producenter", - "HeaderWriter": "F\u00f6rfattare", - "HeaderParentalRatings": "Parental Ratings", - "HeaderCommunityRatings": "Community ratings", - "StartupEmbyServerIsLoading": "Emby Server startar. V\u00e4nligen f\u00f6rs\u00f6k igen om en kort stund." + "Sync": "Synk", + "User": "Anv\u00e4ndare", + "System": "System", + "Application": "App", + "Plugin": "Till\u00e4gg", + "LabelExit": "Avsluta", + "LabelVisitCommunity": "Bes\u00f6k v\u00e5rt diskussionsforum", + "LabelBrowseLibrary": "Bl\u00e4ddra i biblioteket", + "LabelConfigureServer": "Konfigurera Emby", + "LabelRestartServer": "Starta om servern" }
\ No newline at end of file diff --git a/Emby.Server.Implementations/Localization/Core/tr.json b/Emby.Server.Implementations/Localization/Core/tr.json index a691e9d02..a0a515170 100644 --- a/Emby.Server.Implementations/Localization/Core/tr.json +++ b/Emby.Server.Implementations/Localization/Core/tr.json @@ -1,102 +1,46 @@ { - "DbUpgradeMessage": "Please wait while your Emby Server database is upgraded. {0}% complete.", - "AppDeviceValues": "App: {0}, Device: {1}", - "UserDownloadingItemWithValues": "{0} is downloading {1}", - "FolderTypeMixed": "Mixed content", - "FolderTypeMovies": "Movies", - "FolderTypeMusic": "Music", - "FolderTypeAdultVideos": "Adult videos", - "FolderTypePhotos": "Photos", - "FolderTypeMusicVideos": "Music videos", - "FolderTypeHomeVideos": "Home videos", - "FolderTypeGames": "Games", - "FolderTypeBooks": "Books", - "FolderTypeTvShows": "TV", - "FolderTypeInherit": "Inherit", - "HeaderCastCrew": "Cast & Crew", - "HeaderPeople": "People", + "Latest": "Latest", "ValueSpecialEpisodeName": "Special - {0}", - "LabelChapterName": "Chapter {0}", + "Inherit": "Inherit", + "Books": "Books", + "Music": "Music", + "Games": "Games", + "Photos": "Photos", + "MixedContent": "Mixed content", + "MusicVideos": "Music videos", + "HomeVideos": "Home videos", + "Playlists": "Playlists", + "HeaderRecordingGroups": "Recording Groups", + "HeaderContinueWatching": "Continue Watching", + "HeaderFavoriteArtists": "Favorite Artists", + "HeaderFavoriteSongs": "Favorite Songs", + "HeaderAlbumArtists": "Album Artists", + "HeaderFavoriteAlbums": "Favorite Albums", + "HeaderFavoriteEpisodes": "Favorite Episodes", + "HeaderFavoriteShows": "Favori Showlar", + "HeaderNextUp": "Next Up", + "Favorites": "Favorites", + "Collections": "Collections", + "Channels": "Channels", + "Movies": "Movies", + "Albums": "Albums", + "Artists": "Artists", + "Folders": "Folders", + "Songs": "Songs", + "TvShows": "TV Shows", + "Shows": "Shows", + "Genres": "Genres", "NameSeasonNumber": "Season {0}", - "LabelExit": "Cikis", - "LabelVisitCommunity": "Bizi Ziyaret Edin", - "LabelGithub": "Github", - "LabelApiDocumentation": "Api Documentation", - "LabelDeveloperResources": "Developer Resources", - "LabelBrowseLibrary": "K\u00fct\u00fcphane", - "LabelConfigureServer": "Configure Emby", - "LabelRestartServer": "Server Yeniden Baslat", - "CategorySync": "Sync", - "CategoryUser": "User", - "CategorySystem": "System", - "CategoryApplication": "Uygulamalar", - "CategoryPlugin": "Eklenti", - "NotificationOptionPluginError": "Eklenti Ba\u015far\u0131s\u0131z", - "NotificationOptionApplicationUpdateAvailable": "Application update available", - "NotificationOptionApplicationUpdateInstalled": "Application update installed", - "NotificationOptionPluginUpdateInstalled": "Plugin update installed", - "NotificationOptionPluginInstalled": "Plugin installed", - "NotificationOptionPluginUninstalled": "Plugin uninstalled", - "NotificationOptionVideoPlayback": "Video playback started", - "NotificationOptionAudioPlayback": "Audio playback started", - "NotificationOptionGamePlayback": "Game playback started", - "NotificationOptionVideoPlaybackStopped": "Video playback stopped", - "NotificationOptionAudioPlaybackStopped": "Audio playback stopped", - "NotificationOptionGamePlaybackStopped": "Game playback stopped", - "NotificationOptionTaskFailed": "Scheduled task failure", - "NotificationOptionInstallationFailed": "Installation failure", - "NotificationOptionNewLibraryContent": "New content added", - "NotificationOptionNewLibraryContentMultiple": "New content added (multiple)", - "NotificationOptionCameraImageUploaded": "Camera image uploaded", - "NotificationOptionUserLockedOut": "User locked out", - "NotificationOptionServerRestartRequired": "Sunucu yeniden ba\u015flat\u0131lmal\u0131", - "ViewTypePlaylists": "Playlists", - "ViewTypeMovies": "Movies", - "ViewTypeTvShows": "TV", - "ViewTypeGames": "Games", - "ViewTypeMusic": "Music", - "ViewTypeMusicGenres": "Genres", - "ViewTypeMusicArtists": "Artists", - "ViewTypeBoxSets": "Collections", - "ViewTypeChannels": "Channels", - "ViewTypeLiveTV": "Live TV", - "ViewTypeLiveTvNowPlaying": "Now Airing", - "ViewTypeLatestGames": "Latest Games", - "ViewTypeRecentlyPlayedGames": "Recently Played", - "ViewTypeGameFavorites": "Favorites", - "ViewTypeGameSystems": "Game Systems", - "ViewTypeGameGenres": "Genres", - "ViewTypeTvResume": "Resume", - "ViewTypeTvNextUp": "Next Up", - "ViewTypeTvLatest": "Latest", - "ViewTypeTvShowSeries": "Series", - "ViewTypeTvGenres": "Genres", - "ViewTypeTvFavoriteSeries": "Favorite Series", - "ViewTypeTvFavoriteEpisodes": "Favorite Episodes", - "ViewTypeMovieResume": "Resume", - "ViewTypeMovieLatest": "Latest", - "ViewTypeMovieMovies": "Movies", - "ViewTypeMovieCollections": "Collections", - "ViewTypeMovieFavorites": "Favorites", - "ViewTypeMovieGenres": "Genres", - "ViewTypeMusicLatest": "Latest", - "ViewTypeMusicPlaylists": "Playlists", - "ViewTypeMusicAlbums": "Albums", - "ViewTypeMusicAlbumArtists": "Album Artists", - "HeaderOtherDisplaySettings": "Display Settings", - "ViewTypeMusicSongs": "Songs", - "ViewTypeMusicFavorites": "Favorites", - "ViewTypeMusicFavoriteAlbums": "Favorite Albums", - "ViewTypeMusicFavoriteArtists": "Favorite Artists", - "ViewTypeMusicFavoriteSongs": "Favorite Songs", - "ViewTypeFolders": "Folders", - "ViewTypeLiveTvRecordingGroups": "Recordings", - "ViewTypeLiveTvChannels": "Channels", + "AppDeviceValues": "App: {0}, Device: {1}", + "UserDownloadingItemWithValues": "{0} is downloading {1}", + "HeaderLiveTV": "Live TV", + "ChapterNameValue": "Chapter {0}", "ScheduledTaskFailedWithName": "{0} failed", "LabelRunningTimeValue": "Running time: {0}", "ScheduledTaskStartedWithName": "{0} started", - "VersionNumber": "Versiyon {0}", + "VersionNumber": "Version {0}", "PluginInstalledWithName": "{0} was installed", + "StartupEmbyServerIsLoading": "Emby Server is loading. Please try again shortly.", "PluginUpdatedWithName": "{0} was updated", "PluginUninstalledWithName": "{0} was uninstalled", "ItemAddedWithName": "{0} was added to the library", @@ -106,73 +50,47 @@ "UserOnlineFromDevice": "{0} is online from {1}", "ProviderValue": "Provider: {0}", "SubtitlesDownloadedForItem": "Subtitles downloaded for {0}", - "UserConfigurationUpdatedWithName": "User configuration has been updated for {0}", "UserCreatedWithName": "User {0} has been created", "UserPasswordChangedWithName": "Password has been changed for user {0}", "UserDeletedWithName": "User {0} has been deleted", + "UserConfigurationUpdatedWithName": "User configuration has been updated for {0}", "MessageServerConfigurationUpdated": "Server configuration has been updated", "MessageNamedServerConfigurationUpdatedWithValue": "Server configuration section {0} has been updated", "MessageApplicationUpdated": "Emby Server has been updated", "FailedLoginAttemptWithUserName": "Failed login attempt from {0}", "AuthenticationSucceededWithUserName": "{0} successfully authenticated", - "DeviceOfflineWithName": "{0} has disconnected", - "UserLockedOutWithName": "User {0} has been locked out", "UserOfflineFromDevice": "{0} has disconnected from {1}", + "DeviceOfflineWithName": "{0} has disconnected", "UserStartedPlayingItemWithValues": "{0} has started playing {1}", "UserStoppedPlayingItemWithValues": "{0} has stopped playing {1}", + "NotificationOptionPluginError": "Plugin failure", + "NotificationOptionApplicationUpdateAvailable": "Application update available", + "NotificationOptionApplicationUpdateInstalled": "Application update installed", + "NotificationOptionPluginUpdateInstalled": "Plugin update installed", + "NotificationOptionPluginInstalled": "Plugin installed", + "NotificationOptionPluginUninstalled": "Plugin uninstalled", + "NotificationOptionVideoPlayback": "Video playback started", + "NotificationOptionAudioPlayback": "Audio playback started", + "NotificationOptionGamePlayback": "Game playback started", + "NotificationOptionVideoPlaybackStopped": "Video playback stopped", + "NotificationOptionAudioPlaybackStopped": "Audio playback stopped", + "NotificationOptionGamePlaybackStopped": "Game playback stopped", + "NotificationOptionTaskFailed": "Scheduled task failure", + "NotificationOptionInstallationFailed": "Installation failure", + "NotificationOptionNewLibraryContent": "New content added", + "NotificationOptionCameraImageUploaded": "Camera image uploaded", + "NotificationOptionUserLockedOut": "User locked out", + "NotificationOptionServerRestartRequired": "Server restart required", + "UserLockedOutWithName": "User {0} has been locked out", "SubtitleDownloadFailureForItem": "Subtitles failed to download for {0}", - "HeaderUnidentified": "Unidentified", - "HeaderImagePrimary": "Primary", - "HeaderImageBackdrop": "Backdrop", - "HeaderImageLogo": "Logo", - "HeaderUserPrimaryImage": "User Image", - "HeaderOverview": "Overview", - "HeaderShortOverview": "Short Overview", - "HeaderType": "Type", - "HeaderSeverity": "Severity", - "HeaderUser": "User", - "HeaderName": "Name", - "HeaderDate": "Date", - "HeaderPremiereDate": "Premiere Date", - "HeaderDateAdded": "Date Added", - "HeaderReleaseDate": "Release date", - "HeaderRuntime": "Runtime", - "HeaderPlayCount": "Play Count", - "HeaderSeason": "Season", - "HeaderSeasonNumber": "Season number", - "HeaderSeries": "Series:", - "HeaderNetwork": "Network", - "HeaderYear": "Year:", - "HeaderYears": "Years:", - "HeaderParentalRating": "Parental Rating", - "HeaderCommunityRating": "Community rating", - "HeaderTrailers": "Trailers", - "HeaderSpecials": "Specials", - "HeaderGameSystems": "Game Systems", - "HeaderPlayers": "Players:", - "HeaderAlbumArtists": "Album Artists", - "HeaderAlbums": "Albums", - "HeaderDisc": "Disc", - "HeaderTrack": "Track", - "HeaderAudio": "Audio", - "HeaderVideo": "Video", - "HeaderEmbeddedImage": "Embedded image", - "HeaderResolution": "Resolution", - "HeaderSubtitles": "Subtitles", - "HeaderGenres": "Genres", - "HeaderCountries": "Countries", - "HeaderStatus": "Durum", - "HeaderTracks": "Tracks", - "HeaderMusicArtist": "Music artist", - "HeaderLocked": "Locked", - "HeaderStudios": "Studios", - "HeaderActor": "Actors", - "HeaderComposer": "Composers", - "HeaderDirector": "Directors", - "HeaderGuestStar": "Guest star", - "HeaderProducer": "Producers", - "HeaderWriter": "Writers", - "HeaderParentalRatings": "Parental Ratings", - "HeaderCommunityRatings": "Community ratings", - "StartupEmbyServerIsLoading": "Emby Server is loading. Please try again shortly." + "Sync": "Sync", + "User": "User", + "System": "System", + "Application": "Application", + "Plugin": "Plugin", + "LabelExit": "Exit", + "LabelVisitCommunity": "Visit Community", + "LabelBrowseLibrary": "Browse Library", + "LabelConfigureServer": "Configure Emby", + "LabelRestartServer": "Restart Server" }
\ No newline at end of file diff --git a/Emby.Server.Implementations/Localization/Core/uk.json b/Emby.Server.Implementations/Localization/Core/uk.json deleted file mode 100644 index 0dc6afe8a..000000000 --- a/Emby.Server.Implementations/Localization/Core/uk.json +++ /dev/null @@ -1,178 +0,0 @@ -{ - "DbUpgradeMessage": "Please wait while your Emby Server database is upgraded. {0}% complete.", - "AppDeviceValues": "App: {0}, Device: {1}", - "UserDownloadingItemWithValues": "{0} is downloading {1}", - "FolderTypeMixed": "Mixed content", - "FolderTypeMovies": "\u0424\u0456\u043b\u044c\u043c\u0438", - "FolderTypeMusic": "\u041c\u0443\u0437\u0438\u043a\u0430", - "FolderTypeAdultVideos": "Adult videos", - "FolderTypePhotos": "\u0421\u0432\u0456\u0442\u043b\u0438\u043d\u0438", - "FolderTypeMusicVideos": "Music videos", - "FolderTypeHomeVideos": "Home videos", - "FolderTypeGames": "\u0406\u0433\u0440\u0438", - "FolderTypeBooks": "\u041a\u043d\u0438\u0433\u0438", - "FolderTypeTvShows": "\u0422\u0411", - "FolderTypeInherit": "Inherit", - "HeaderCastCrew": "Cast & Crew", - "HeaderPeople": "People", - "ValueSpecialEpisodeName": "Special - {0}", - "LabelChapterName": "Chapter {0}", - "NameSeasonNumber": "Season {0}", - "LabelExit": "\u0412\u0438\u0439\u0442\u0438", - "LabelVisitCommunity": "Visit Community", - "LabelGithub": "Github", - "LabelApiDocumentation": "Api Documentation", - "LabelDeveloperResources": "Developer Resources", - "LabelBrowseLibrary": "Browse Library", - "LabelConfigureServer": "Configure Emby", - "LabelRestartServer": "\u041f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0438 \u0441\u0435\u0440\u0432\u0435\u0440", - "CategorySync": "Sync", - "CategoryUser": "User", - "CategorySystem": "System", - "CategoryApplication": "Application", - "CategoryPlugin": "Plugin", - "NotificationOptionPluginError": "Plugin failure", - "NotificationOptionApplicationUpdateAvailable": "Application update available", - "NotificationOptionApplicationUpdateInstalled": "Application update installed", - "NotificationOptionPluginUpdateInstalled": "Plugin update installed", - "NotificationOptionPluginInstalled": "Plugin installed", - "NotificationOptionPluginUninstalled": "Plugin uninstalled", - "NotificationOptionVideoPlayback": "Video playback started", - "NotificationOptionAudioPlayback": "Audio playback started", - "NotificationOptionGamePlayback": "Game playback started", - "NotificationOptionVideoPlaybackStopped": "Video playback stopped", - "NotificationOptionAudioPlaybackStopped": "Audio playback stopped", - "NotificationOptionGamePlaybackStopped": "Game playback stopped", - "NotificationOptionTaskFailed": "Scheduled task failure", - "NotificationOptionInstallationFailed": "Installation failure", - "NotificationOptionNewLibraryContent": "New content added", - "NotificationOptionNewLibraryContentMultiple": "New content added (multiple)", - "NotificationOptionCameraImageUploaded": "Camera image uploaded", - "NotificationOptionUserLockedOut": "User locked out", - "NotificationOptionServerRestartRequired": "Server restart required", - "ViewTypePlaylists": "Playlists", - "ViewTypeMovies": "\u0424\u0456\u043b\u044c\u043c\u0438", - "ViewTypeTvShows": "TV", - "ViewTypeGames": "Games", - "ViewTypeMusic": "Music", - "ViewTypeMusicGenres": "Genres", - "ViewTypeMusicArtists": "Artists", - "ViewTypeBoxSets": "\u041a\u043e\u043b\u0435\u043a\u0446\u0456\u0457", - "ViewTypeChannels": "Channels", - "ViewTypeLiveTV": "Live TV", - "ViewTypeLiveTvNowPlaying": "Now Airing", - "ViewTypeLatestGames": "\u041e\u0441\u0442\u0430\u043d\u043d\u0456 \u0456\u0433\u0440\u0438", - "ViewTypeRecentlyPlayedGames": "Recently Played", - "ViewTypeGameFavorites": "Favorites", - "ViewTypeGameSystems": "Game Systems", - "ViewTypeGameGenres": "Genres", - "ViewTypeTvResume": "Resume", - "ViewTypeTvNextUp": "Next Up", - "ViewTypeTvLatest": "Latest", - "ViewTypeTvShowSeries": "Series", - "ViewTypeTvGenres": "Genres", - "ViewTypeTvFavoriteSeries": "Favorite Series", - "ViewTypeTvFavoriteEpisodes": "Favorite Episodes", - "ViewTypeMovieResume": "Resume", - "ViewTypeMovieLatest": "Latest", - "ViewTypeMovieMovies": "\u0424\u0456\u043b\u044c\u043c\u0438", - "ViewTypeMovieCollections": "\u041a\u043e\u043b\u0435\u043a\u0446\u0456\u0457", - "ViewTypeMovieFavorites": "Favorites", - "ViewTypeMovieGenres": "Genres", - "ViewTypeMusicLatest": "\u041e\u0441\u0442\u0430\u043d\u043d\u0456", - "ViewTypeMusicPlaylists": "Playlists", - "ViewTypeMusicAlbums": "Albums", - "ViewTypeMusicAlbumArtists": "Album Artists", - "HeaderOtherDisplaySettings": "Display Settings", - "ViewTypeMusicSongs": "Songs", - "ViewTypeMusicFavorites": "Favorites", - "ViewTypeMusicFavoriteAlbums": "Favorite Albums", - "ViewTypeMusicFavoriteArtists": "Favorite Artists", - "ViewTypeMusicFavoriteSongs": "Favorite Songs", - "ViewTypeFolders": "Folders", - "ViewTypeLiveTvRecordingGroups": "Recordings", - "ViewTypeLiveTvChannels": "Channels", - "ScheduledTaskFailedWithName": "{0} failed", - "LabelRunningTimeValue": "Running time: {0}", - "ScheduledTaskStartedWithName": "{0} started", - "VersionNumber": "Version {0}", - "PluginInstalledWithName": "{0} was installed", - "PluginUpdatedWithName": "{0} was updated", - "PluginUninstalledWithName": "{0} was uninstalled", - "ItemAddedWithName": "{0} was added to the library", - "ItemRemovedWithName": "{0} was removed from the library", - "LabelIpAddressValue": "Ip address: {0}", - "DeviceOnlineWithName": "{0} is connected", - "UserOnlineFromDevice": "{0} is online from {1}", - "ProviderValue": "Provider: {0}", - "SubtitlesDownloadedForItem": "Subtitles downloaded for {0}", - "UserConfigurationUpdatedWithName": "User configuration has been updated for {0}", - "UserCreatedWithName": "User {0} has been created", - "UserPasswordChangedWithName": "Password has been changed for user {0}", - "UserDeletedWithName": "User {0} has been deleted", - "MessageServerConfigurationUpdated": "Server configuration has been updated", - "MessageNamedServerConfigurationUpdatedWithValue": "Server configuration section {0} has been updated", - "MessageApplicationUpdated": "Emby Server has been updated", - "FailedLoginAttemptWithUserName": "Failed login attempt from {0}", - "AuthenticationSucceededWithUserName": "{0} successfully authenticated", - "DeviceOfflineWithName": "{0} has disconnected", - "UserLockedOutWithName": "User {0} has been locked out", - "UserOfflineFromDevice": "{0} has disconnected from {1}", - "UserStartedPlayingItemWithValues": "{0} has started playing {1}", - "UserStoppedPlayingItemWithValues": "{0} has stopped playing {1}", - "SubtitleDownloadFailureForItem": "Subtitles failed to download for {0}", - "HeaderUnidentified": "Unidentified", - "HeaderImagePrimary": "Primary", - "HeaderImageBackdrop": "Backdrop", - "HeaderImageLogo": "Logo", - "HeaderUserPrimaryImage": "User Image", - "HeaderOverview": "Overview", - "HeaderShortOverview": "Short Overview", - "HeaderType": "Type", - "HeaderSeverity": "Severity", - "HeaderUser": "User", - "HeaderName": "Name", - "HeaderDate": "Date", - "HeaderPremiereDate": "Premiere Date", - "HeaderDateAdded": "Date Added", - "HeaderReleaseDate": "Release date", - "HeaderRuntime": "Runtime", - "HeaderPlayCount": "Play Count", - "HeaderSeason": "\u0421\u0435\u0437\u043e\u043d", - "HeaderSeasonNumber": "Season number", - "HeaderSeries": "Series:", - "HeaderNetwork": "Network", - "HeaderYear": "Year:", - "HeaderYears": "Years:", - "HeaderParentalRating": "Parental Rating", - "HeaderCommunityRating": "Community rating", - "HeaderTrailers": "\u0422\u0440\u0435\u0439\u043b\u0435\u0440\u0438", - "HeaderSpecials": "Specials", - "HeaderGameSystems": "Game Systems", - "HeaderPlayers": "Players:", - "HeaderAlbumArtists": "Album Artists", - "HeaderAlbums": "\u0410\u043b\u044c\u0431\u043e\u043c\u0438", - "HeaderDisc": "\u0414\u0438\u0441\u043a", - "HeaderTrack": "\u0414\u043e\u0440\u0456\u0436\u043a\u0430", - "HeaderAudio": "\u0410\u0443\u0434\u0456\u043e", - "HeaderVideo": "\u0412\u0456\u0434\u0435\u043e", - "HeaderEmbeddedImage": "Embedded image", - "HeaderResolution": "Resolution", - "HeaderSubtitles": "Subtitles", - "HeaderGenres": "Genres", - "HeaderCountries": "Countries", - "HeaderStatus": "Status", - "HeaderTracks": "\u0414\u043e\u0440\u0456\u0436\u043a\u0438", - "HeaderMusicArtist": "Music artist", - "HeaderLocked": "Locked", - "HeaderStudios": "\u0421\u0442\u0443\u0434\u0456\u0457", - "HeaderActor": "Actors", - "HeaderComposer": "Composers", - "HeaderDirector": "Directors", - "HeaderGuestStar": "Guest star", - "HeaderProducer": "Producers", - "HeaderWriter": "Writers", - "HeaderParentalRatings": "Parental Ratings", - "HeaderCommunityRatings": "Community ratings", - "StartupEmbyServerIsLoading": "Emby Server is loading. Please try again shortly." -}
\ No newline at end of file diff --git a/Emby.Server.Implementations/Localization/Core/vi.json b/Emby.Server.Implementations/Localization/Core/vi.json deleted file mode 100644 index 6ea1d1d3f..000000000 --- a/Emby.Server.Implementations/Localization/Core/vi.json +++ /dev/null @@ -1,178 +0,0 @@ -{ - "DbUpgradeMessage": "Please wait while your Emby Server database is upgraded. {0}% complete.", - "AppDeviceValues": "App: {0}, Device: {1}", - "UserDownloadingItemWithValues": "{0} is downloading {1}", - "FolderTypeMixed": "Mixed content", - "FolderTypeMovies": "Movies", - "FolderTypeMusic": "Music", - "FolderTypeAdultVideos": "Adult videos", - "FolderTypePhotos": "Photos", - "FolderTypeMusicVideos": "Music videos", - "FolderTypeHomeVideos": "Home videos", - "FolderTypeGames": "Games", - "FolderTypeBooks": "Books", - "FolderTypeTvShows": "TV", - "FolderTypeInherit": "Inherit", - "HeaderCastCrew": "Cast & Crew", - "HeaderPeople": "People", - "ValueSpecialEpisodeName": "Special - {0}", - "LabelChapterName": "Chapter {0}", - "NameSeasonNumber": "Season {0}", - "LabelExit": "Tho\u00e1t", - "LabelVisitCommunity": "Gh\u00e9 th\u0103m trang C\u1ed9ng \u0111\u1ed3ng", - "LabelGithub": "Github", - "LabelApiDocumentation": "Api Documentation", - "LabelDeveloperResources": "Developer Resources", - "LabelBrowseLibrary": "Duy\u1ec7t th\u01b0 vi\u1ec7n", - "LabelConfigureServer": "Configure Emby", - "LabelRestartServer": "Kh\u1edfi \u0111\u1ed9ng l\u1ea1i m\u00e1y ch\u1ee7", - "CategorySync": "Sync", - "CategoryUser": "User", - "CategorySystem": "System", - "CategoryApplication": "Application", - "CategoryPlugin": "Plugin", - "NotificationOptionPluginError": "Plugin failure", - "NotificationOptionApplicationUpdateAvailable": "Application update available", - "NotificationOptionApplicationUpdateInstalled": "Application update installed", - "NotificationOptionPluginUpdateInstalled": "Plugin update installed", - "NotificationOptionPluginInstalled": "Plugin installed", - "NotificationOptionPluginUninstalled": "Plugin uninstalled", - "NotificationOptionVideoPlayback": "Video playback started", - "NotificationOptionAudioPlayback": "Audio playback started", - "NotificationOptionGamePlayback": "Game playback started", - "NotificationOptionVideoPlaybackStopped": "Video playback stopped", - "NotificationOptionAudioPlaybackStopped": "Audio playback stopped", - "NotificationOptionGamePlaybackStopped": "Game playback stopped", - "NotificationOptionTaskFailed": "Scheduled task failure", - "NotificationOptionInstallationFailed": "Installation failure", - "NotificationOptionNewLibraryContent": "New content added", - "NotificationOptionNewLibraryContentMultiple": "New content added (multiple)", - "NotificationOptionCameraImageUploaded": "Camera image uploaded", - "NotificationOptionUserLockedOut": "User locked out", - "NotificationOptionServerRestartRequired": "Server restart required", - "ViewTypePlaylists": "Playlists", - "ViewTypeMovies": "Movies", - "ViewTypeTvShows": "TV", - "ViewTypeGames": "Games", - "ViewTypeMusic": "Music", - "ViewTypeMusicGenres": "Genres", - "ViewTypeMusicArtists": "Artists", - "ViewTypeBoxSets": "Collections", - "ViewTypeChannels": "Channels", - "ViewTypeLiveTV": "Live TV", - "ViewTypeLiveTvNowPlaying": "Now Airing", - "ViewTypeLatestGames": "Latest Games", - "ViewTypeRecentlyPlayedGames": "Recently Played", - "ViewTypeGameFavorites": "Favorites", - "ViewTypeGameSystems": "Game Systems", - "ViewTypeGameGenres": "Genres", - "ViewTypeTvResume": "Resume", - "ViewTypeTvNextUp": "Next Up", - "ViewTypeTvLatest": "Latest", - "ViewTypeTvShowSeries": "Series", - "ViewTypeTvGenres": "Genres", - "ViewTypeTvFavoriteSeries": "Favorite Series", - "ViewTypeTvFavoriteEpisodes": "Favorite Episodes", - "ViewTypeMovieResume": "Resume", - "ViewTypeMovieLatest": "Latest", - "ViewTypeMovieMovies": "Movies", - "ViewTypeMovieCollections": "Collections", - "ViewTypeMovieFavorites": "Favorites", - "ViewTypeMovieGenres": "Genres", - "ViewTypeMusicLatest": "Latest", - "ViewTypeMusicPlaylists": "Playlists", - "ViewTypeMusicAlbums": "Albums", - "ViewTypeMusicAlbumArtists": "Album Artists", - "HeaderOtherDisplaySettings": "Display Settings", - "ViewTypeMusicSongs": "Songs", - "ViewTypeMusicFavorites": "Favorites", - "ViewTypeMusicFavoriteAlbums": "Favorite Albums", - "ViewTypeMusicFavoriteArtists": "Favorite Artists", - "ViewTypeMusicFavoriteSongs": "Favorite Songs", - "ViewTypeFolders": "Folders", - "ViewTypeLiveTvRecordingGroups": "Recordings", - "ViewTypeLiveTvChannels": "Channels", - "ScheduledTaskFailedWithName": "{0} failed", - "LabelRunningTimeValue": "Running time: {0}", - "ScheduledTaskStartedWithName": "{0} started", - "VersionNumber": "Version {0}", - "PluginInstalledWithName": "{0} was installed", - "PluginUpdatedWithName": "{0} was updated", - "PluginUninstalledWithName": "{0} was uninstalled", - "ItemAddedWithName": "{0} was added to the library", - "ItemRemovedWithName": "{0} was removed from the library", - "LabelIpAddressValue": "Ip address: {0}", - "DeviceOnlineWithName": "{0} is connected", - "UserOnlineFromDevice": "{0} is online from {1}", - "ProviderValue": "Provider: {0}", - "SubtitlesDownloadedForItem": "Subtitles downloaded for {0}", - "UserConfigurationUpdatedWithName": "User configuration has been updated for {0}", - "UserCreatedWithName": "User {0} has been created", - "UserPasswordChangedWithName": "Password has been changed for user {0}", - "UserDeletedWithName": "User {0} has been deleted", - "MessageServerConfigurationUpdated": "Server configuration has been updated", - "MessageNamedServerConfigurationUpdatedWithValue": "Server configuration section {0} has been updated", - "MessageApplicationUpdated": "Emby Server has been updated", - "FailedLoginAttemptWithUserName": "Failed login attempt from {0}", - "AuthenticationSucceededWithUserName": "{0} successfully authenticated", - "DeviceOfflineWithName": "{0} has disconnected", - "UserLockedOutWithName": "User {0} has been locked out", - "UserOfflineFromDevice": "{0} has disconnected from {1}", - "UserStartedPlayingItemWithValues": "{0} has started playing {1}", - "UserStoppedPlayingItemWithValues": "{0} has stopped playing {1}", - "SubtitleDownloadFailureForItem": "Subtitles failed to download for {0}", - "HeaderUnidentified": "Unidentified", - "HeaderImagePrimary": "Primary", - "HeaderImageBackdrop": "Backdrop", - "HeaderImageLogo": "Logo", - "HeaderUserPrimaryImage": "User Image", - "HeaderOverview": "Overview", - "HeaderShortOverview": "Short Overview", - "HeaderType": "Type", - "HeaderSeverity": "Severity", - "HeaderUser": "User", - "HeaderName": "T\u00ean", - "HeaderDate": "Ng\u00e0y", - "HeaderPremiereDate": "Premiere Date", - "HeaderDateAdded": "Date Added", - "HeaderReleaseDate": "Release date", - "HeaderRuntime": "Runtime", - "HeaderPlayCount": "Play Count", - "HeaderSeason": "Season", - "HeaderSeasonNumber": "Season number", - "HeaderSeries": "Series:", - "HeaderNetwork": "Network", - "HeaderYear": "Year:", - "HeaderYears": "Years:", - "HeaderParentalRating": "Parental Rating", - "HeaderCommunityRating": "Community rating", - "HeaderTrailers": "Trailers", - "HeaderSpecials": "Specials", - "HeaderGameSystems": "Game Systems", - "HeaderPlayers": "Players:", - "HeaderAlbumArtists": "Album Artists", - "HeaderAlbums": "Albums", - "HeaderDisc": "Disc", - "HeaderTrack": "Track", - "HeaderAudio": "Audio", - "HeaderVideo": "Video", - "HeaderEmbeddedImage": "Embedded image", - "HeaderResolution": "Resolution", - "HeaderSubtitles": "Subtitles", - "HeaderGenres": "Genres", - "HeaderCountries": "Countries", - "HeaderStatus": "Tr\u1ea1ng th\u00e1i", - "HeaderTracks": "Tracks", - "HeaderMusicArtist": "Music artist", - "HeaderLocked": "Locked", - "HeaderStudios": "Studios", - "HeaderActor": "Actors", - "HeaderComposer": "Composers", - "HeaderDirector": "Directors", - "HeaderGuestStar": "Guest star", - "HeaderProducer": "Producers", - "HeaderWriter": "Writers", - "HeaderParentalRatings": "Parental Ratings", - "HeaderCommunityRatings": "Community ratings", - "StartupEmbyServerIsLoading": "Emby Server is loading. Please try again shortly." -}
\ No newline at end of file diff --git a/Emby.Server.Implementations/Localization/Core/zh-CN.json b/Emby.Server.Implementations/Localization/Core/zh-CN.json index 580832a9e..42126ca1b 100644 --- a/Emby.Server.Implementations/Localization/Core/zh-CN.json +++ b/Emby.Server.Implementations/Localization/Core/zh-CN.json @@ -1,178 +1,96 @@ { - "DbUpgradeMessage": "Please wait while your Emby Server database is upgraded. {0}% complete.", - "AppDeviceValues": "App\uff1a {0}\uff0c\u8bbe\u5907\uff1a {1}", - "UserDownloadingItemWithValues": "{0} is downloading {1}", - "FolderTypeMixed": "\u6df7\u5408\u5185\u5bb9", - "FolderTypeMovies": "\u7535\u5f71", - "FolderTypeMusic": "\u97f3\u4e50", - "FolderTypeAdultVideos": "\u6210\u4eba\u89c6\u9891", - "FolderTypePhotos": "\u56fe\u7247", - "FolderTypeMusicVideos": "\u97f3\u4e50\u89c6\u9891", - "FolderTypeHomeVideos": "\u5bb6\u5ead\u89c6\u9891", - "FolderTypeGames": "\u6e38\u620f", - "FolderTypeBooks": "\u4e66\u7c4d", - "FolderTypeTvShows": "\u7535\u89c6", - "FolderTypeInherit": "\u7ee7\u627f", - "HeaderCastCrew": "\u6f14\u804c\u4eba\u5458", - "HeaderPeople": "\u4eba\u7269", - "ValueSpecialEpisodeName": "\u7279\u522b - {0}", - "LabelChapterName": "\u7ae0\u8282 {0}", + "Latest": "\u6700\u65b0", + "ValueSpecialEpisodeName": "\u7279\u5178 - {0}", + "Inherit": "\u7ee7\u627f", + "Books": "\u4e66\u7c4d", + "Music": "\u97f3\u4e50", + "Games": "\u6e38\u620f", + "Photos": "\u7167\u7247", + "MixedContent": "\u6df7\u5408\u5185\u5bb9", + "MusicVideos": "\u97f3\u4e50\u89c6\u9891", + "HomeVideos": "\u5bb6\u5ead\u89c6\u9891", + "Playlists": "\u64ad\u653e\u5217\u8868", + "HeaderRecordingGroups": "\u5f55\u5236\u7ec4", + "HeaderContinueWatching": "\u7ee7\u7eed\u89c2\u770b", + "HeaderFavoriteArtists": "\u6700\u7231\u4f5c\u5bb6", + "HeaderFavoriteSongs": "\u6700\u7231\u7684\u6b4c\u66f2", + "HeaderAlbumArtists": "\u4e13\u8f91\u4f5c\u5bb6", + "HeaderFavoriteAlbums": "\u6700\u7231\u7684\u4e13\u8f91", + "HeaderFavoriteEpisodes": "\u6700\u7231\u7684\u96c6", + "HeaderFavoriteShows": "\u6700\u7231\u7684\u8282\u76ee", + "HeaderNextUp": "\u63a5\u4e0b\u6765", + "Favorites": "\u6700\u7231", + "Collections": "\u5408\u96c6", + "Channels": "\u9891\u9053", + "Movies": "\u7535\u5f71", + "Albums": "\u4e13\u8f91", + "Artists": "\u827a\u672f\u5bb6", + "Folders": "\u6587\u4ef6\u5939", + "Songs": "\u6b4c\u66f2", + "TvShows": "TV Shows", + "Shows": "\u8282\u76ee", + "Genres": "\u98ce\u683c", "NameSeasonNumber": "\u5b63 {0}", - "LabelExit": "\u9000\u51fa", - "LabelVisitCommunity": "\u8bbf\u95ee\u793e\u533a", - "LabelGithub": "Github", - "LabelApiDocumentation": "API\u6587\u6863", - "LabelDeveloperResources": "\u5f00\u53d1\u8005\u8d44\u6e90", - "LabelBrowseLibrary": "\u6d4f\u89c8\u5a92\u4f53\u5e93", - "LabelConfigureServer": "\u914d\u7f6eEmby", - "LabelRestartServer": "\u91cd\u542f\u670d\u52a1\u5668", - "CategorySync": "\u540c\u6b65", - "CategoryUser": "\u7528\u6237", - "CategorySystem": "\u7cfb\u7edf", - "CategoryApplication": "\u5e94\u7528\u7a0b\u5e8f", - "CategoryPlugin": "\u63d2\u4ef6", - "NotificationOptionPluginError": "\u63d2\u4ef6\u5931\u8d25", - "NotificationOptionApplicationUpdateAvailable": "\u6709\u53ef\u7528\u7684\u5e94\u7528\u7a0b\u5e8f\u66f4\u65b0", - "NotificationOptionApplicationUpdateInstalled": "\u5e94\u7528\u7a0b\u5e8f\u66f4\u65b0\u5df2\u5b89\u88c5", - "NotificationOptionPluginUpdateInstalled": "\u63d2\u4ef6\u66f4\u65b0\u5df2\u5b89\u88c5", - "NotificationOptionPluginInstalled": "\u63d2\u4ef6\u5df2\u5b89\u88c5", - "NotificationOptionPluginUninstalled": "\u63d2\u4ef6\u5df2\u5378\u8f7d", - "NotificationOptionVideoPlayback": "\u89c6\u9891\u5f00\u59cb\u64ad\u653e", - "NotificationOptionAudioPlayback": "\u97f3\u9891\u5f00\u59cb\u64ad\u653e", - "NotificationOptionGamePlayback": "\u6e38\u620f\u5f00\u59cb", - "NotificationOptionVideoPlaybackStopped": "\u89c6\u9891\u64ad\u653e\u505c\u6b62", - "NotificationOptionAudioPlaybackStopped": "\u97f3\u9891\u64ad\u653e\u505c\u6b62", - "NotificationOptionGamePlaybackStopped": "\u6e38\u620f\u505c\u6b62", - "NotificationOptionTaskFailed": "\u8ba1\u5212\u4efb\u52a1\u5931\u8d25", - "NotificationOptionInstallationFailed": "\u5b89\u88c5\u5931\u8d25", - "NotificationOptionNewLibraryContent": "\u6dfb\u52a0\u65b0\u5185\u5bb9", - "NotificationOptionNewLibraryContentMultiple": "\u65b0\u7684\u5185\u5bb9\u52a0\u5165\uff08\u591a\u4e2a\uff09", - "NotificationOptionCameraImageUploaded": "Camera image uploaded", - "NotificationOptionUserLockedOut": "User locked out", - "NotificationOptionServerRestartRequired": "\u9700\u8981\u91cd\u65b0\u542f\u52a8\u670d\u52a1\u5668", - "ViewTypePlaylists": "Playlists", - "ViewTypeMovies": "\u7535\u5f71", - "ViewTypeTvShows": "\u7535\u89c6", - "ViewTypeGames": "\u6e38\u620f", - "ViewTypeMusic": "\u97f3\u4e50", - "ViewTypeMusicGenres": "\u98ce\u683c", - "ViewTypeMusicArtists": "\u827a\u672f\u5bb6", - "ViewTypeBoxSets": "\u5408\u96c6", - "ViewTypeChannels": "\u9891\u9053", - "ViewTypeLiveTV": "\u7535\u89c6\u76f4\u64ad", - "ViewTypeLiveTvNowPlaying": "\u73b0\u5728\u64ad\u653e", - "ViewTypeLatestGames": "\u6700\u65b0\u6e38\u620f", - "ViewTypeRecentlyPlayedGames": "\u6700\u8fd1\u64ad\u653e", - "ViewTypeGameFavorites": "\u6211\u7684\u6700\u7231", - "ViewTypeGameSystems": "\u6e38\u620f\u7cfb\u7edf", - "ViewTypeGameGenres": "\u98ce\u683c", - "ViewTypeTvResume": "\u6062\u590d\u64ad\u653e", - "ViewTypeTvNextUp": "\u4e0b\u4e00\u4e2a", - "ViewTypeTvLatest": "\u6700\u65b0", - "ViewTypeTvShowSeries": "\u7535\u89c6\u5267", - "ViewTypeTvGenres": "\u98ce\u683c", - "ViewTypeTvFavoriteSeries": "\u6700\u559c\u6b22\u7684\u7535\u89c6\u5267", - "ViewTypeTvFavoriteEpisodes": "\u6700\u559c\u6b22\u7684\u5267\u96c6", - "ViewTypeMovieResume": "\u6062\u590d\u64ad\u653e", - "ViewTypeMovieLatest": "\u6700\u65b0", - "ViewTypeMovieMovies": "\u7535\u5f71", - "ViewTypeMovieCollections": "\u5408\u96c6", - "ViewTypeMovieFavorites": "\u6536\u85cf\u5939", - "ViewTypeMovieGenres": "\u98ce\u683c", - "ViewTypeMusicLatest": "\u6700\u65b0", - "ViewTypeMusicPlaylists": "Playlists", - "ViewTypeMusicAlbums": "\u4e13\u8f91", - "ViewTypeMusicAlbumArtists": "\u4e13\u8f91\u827a\u672f\u5bb6", - "HeaderOtherDisplaySettings": "\u663e\u793a\u8bbe\u7f6e", - "ViewTypeMusicSongs": "\u6b4c\u66f2", - "ViewTypeMusicFavorites": "\u6211\u7684\u6700\u7231", - "ViewTypeMusicFavoriteAlbums": "\u6700\u7231\u7684\u4e13\u8f91", - "ViewTypeMusicFavoriteArtists": "\u6700\u7231\u7684\u827a\u672f\u5bb6", - "ViewTypeMusicFavoriteSongs": "\u6700\u7231\u7684\u6b4c\u66f2", - "ViewTypeFolders": "\u6587\u4ef6\u5939", - "ViewTypeLiveTvRecordingGroups": "\u5f55\u5236", - "ViewTypeLiveTvChannels": "\u9891\u9053", - "ScheduledTaskFailedWithName": "{0} \u5931\u8d25", - "LabelRunningTimeValue": "\u8fd0\u884c\u65f6\u95f4\uff1a {0}", - "ScheduledTaskStartedWithName": "{0} \u5f00\u59cb", + "AppDeviceValues": "\u5e94\u7528: {0}, \u8bbe\u5907: {1}", + "UserDownloadingItemWithValues": "{0} \u6b63\u5728\u4e0b\u8f7d {1}", + "HeaderLiveTV": "\u7535\u89c6\u76f4\u64ad", + "ChapterNameValue": "\u7ae0\u8282 {0}", + "ScheduledTaskFailedWithName": "{0} \u5df2\u5931\u8d25", + "LabelRunningTimeValue": "\u8fd0\u884c\u65f6\u95f4\uff1a{0}", + "ScheduledTaskStartedWithName": "{0} \u5df2\u5f00\u59cb", "VersionNumber": "\u7248\u672c {0}", "PluginInstalledWithName": "{0} \u5df2\u5b89\u88c5", + "StartupEmbyServerIsLoading": "Emby \u670d\u52a1\u5668\u52a0\u8f7d\u4e2d\u3002\u8bf7\u7a0d\u540e\u518d\u8bd5\u3002", "PluginUpdatedWithName": "{0} \u5df2\u66f4\u65b0", "PluginUninstalledWithName": "{0} \u5df2\u5378\u8f7d", "ItemAddedWithName": "{0} \u5df2\u6dfb\u52a0\u5230\u5a92\u4f53\u5e93", "ItemRemovedWithName": "{0} \u5df2\u4ece\u5a92\u4f53\u5e93\u4e2d\u79fb\u9664", - "LabelIpAddressValue": "Ip \u5730\u5740\uff1a {0}", + "LabelIpAddressValue": "Ip \u5730\u5740\uff1a{0}", "DeviceOnlineWithName": "{0} \u5df2\u8fde\u63a5", "UserOnlineFromDevice": "{0} \u5728\u7ebf\uff0c\u6765\u81ea {1}", - "ProviderValue": "\u63d0\u4f9b\u8005\uff1a {0}", + "ProviderValue": "\u63d0\u4f9b\u5546\uff1a{0}", "SubtitlesDownloadedForItem": "\u5df2\u4e3a {0} \u4e0b\u8f7d\u4e86\u5b57\u5e55", - "UserConfigurationUpdatedWithName": "\u7528\u6237\u914d\u7f6e\u5df2\u66f4\u65b0\u4e3a {0}", - "UserCreatedWithName": "\u7528\u6237 {0} \u5df2\u88ab\u521b\u5efa", + "UserCreatedWithName": "\u7528\u6237 {0} \u5df2\u521b\u5efa", "UserPasswordChangedWithName": "\u5df2\u4e3a\u7528\u6237 {0} \u66f4\u6539\u5bc6\u7801", - "UserDeletedWithName": "\u7528\u6237 {0} \u5df2\u88ab\u5220\u9664", + "UserDeletedWithName": "\u7528\u6237 {0} \u5df2\u5220\u9664", + "UserConfigurationUpdatedWithName": "{0} \u7684\u7528\u6237\u914d\u7f6e\u5df2\u66f4\u65b0", "MessageServerConfigurationUpdated": "\u670d\u52a1\u5668\u914d\u7f6e\u5df2\u66f4\u65b0", "MessageNamedServerConfigurationUpdatedWithValue": "\u670d\u52a1\u5668\u914d\u7f6e {0} \u90e8\u5206\u5df2\u66f4\u65b0", - "MessageApplicationUpdated": "Emby Server has been updated", - "FailedLoginAttemptWithUserName": "\u5931\u8d25\u7684\u767b\u5f55\u5c1d\u8bd5\uff0c\u6765\u81ea {0}", - "AuthenticationSucceededWithUserName": "{0} \u6210\u529f\u88ab\u6388\u6743", - "DeviceOfflineWithName": "{0} \u5df2\u65ad\u5f00\u8fde\u63a5", - "UserLockedOutWithName": "User {0} has been locked out", - "UserOfflineFromDevice": "{0} \u5df2\u4ece {1} \u65ad\u5f00\u8fde\u63a5", - "UserStartedPlayingItemWithValues": "{0} \u5f00\u59cb\u64ad\u653e {1}", - "UserStoppedPlayingItemWithValues": "{0} \u505c\u6b62\u64ad\u653e {1}", + "MessageApplicationUpdated": "Emby \u670d\u52a1\u5668\u5df2\u66f4\u65b0", + "FailedLoginAttemptWithUserName": "\u6765\u81ea {0} \u7684\u5931\u8d25\u767b\u5165", + "AuthenticationSucceededWithUserName": "{0} \u6210\u529f\u9a8c\u8bc1", + "UserOfflineFromDevice": "{0} \u5df2\u4ece {1} \u65ad\u5f00", + "DeviceOfflineWithName": "{0} \u5df2\u65ad\u5f00", + "UserStartedPlayingItemWithValues": "{0} \u5df2\u5f00\u59cb\u64ad\u653e {1}", + "UserStoppedPlayingItemWithValues": "{0} \u5df2\u505c\u6b62\u64ad\u653e {1}", + "NotificationOptionPluginError": "\u63d2\u4ef6\u5931\u8d25", + "NotificationOptionApplicationUpdateAvailable": "\u6709\u53ef\u7528\u7684\u5e94\u7528\u7a0b\u5e8f\u66f4\u65b0", + "NotificationOptionApplicationUpdateInstalled": "\u5e94\u7528\u7a0b\u5e8f\u66f4\u65b0\u5df2\u5b89\u88c5", + "NotificationOptionPluginUpdateInstalled": "\u63d2\u4ef6\u66f4\u65b0\u5df2\u5b89\u88c5", + "NotificationOptionPluginInstalled": "\u63d2\u4ef6\u5df2\u5b89\u88c5", + "NotificationOptionPluginUninstalled": "\u63d2\u4ef6\u5df2\u5378\u8f7d", + "NotificationOptionVideoPlayback": "\u89c6\u9891\u5f00\u59cb\u64ad\u653e", + "NotificationOptionAudioPlayback": "\u97f3\u9891\u5f00\u59cb\u64ad\u653e", + "NotificationOptionGamePlayback": "\u6e38\u620f\u5f00\u59cb", + "NotificationOptionVideoPlaybackStopped": "\u89c6\u9891\u64ad\u653e\u5df2\u505c\u6b62", + "NotificationOptionAudioPlaybackStopped": "\u97f3\u9891\u64ad\u653e\u5df2\u505c\u6b62", + "NotificationOptionGamePlaybackStopped": "\u6e38\u620f\u505c\u6b62", + "NotificationOptionTaskFailed": "\u8ba1\u5212\u4efb\u52a1\u5931\u8d25", + "NotificationOptionInstallationFailed": "\u5b89\u88c5\u5931\u8d25", + "NotificationOptionNewLibraryContent": "\u5df2\u6dfb\u52a0\u65b0\u5185\u5bb9", + "NotificationOptionCameraImageUploaded": "\u76f8\u673a\u56fe\u7247\u5df2\u4e0a\u4f20", + "NotificationOptionUserLockedOut": "\u7528\u6237\u5df2\u9501\u5b9a", + "NotificationOptionServerRestartRequired": "\u670d\u52a1\u5668\u9700\u8981\u91cd\u542f", + "UserLockedOutWithName": "\u7528\u6237 {0} \u5df2\u88ab\u9501\u5b9a", "SubtitleDownloadFailureForItem": "\u4e3a {0} \u4e0b\u8f7d\u5b57\u5e55\u5931\u8d25", - "HeaderUnidentified": "Unidentified", - "HeaderImagePrimary": "Primary", - "HeaderImageBackdrop": "Backdrop", - "HeaderImageLogo": "Logo", - "HeaderUserPrimaryImage": "User Image", - "HeaderOverview": "Overview", - "HeaderShortOverview": "Short Overview", - "HeaderType": "Type", - "HeaderSeverity": "Severity", - "HeaderUser": "\u7528\u6237", - "HeaderName": "\u540d\u5b57", - "HeaderDate": "\u65e5\u671f", - "HeaderPremiereDate": "Premiere Date", - "HeaderDateAdded": "Date Added", - "HeaderReleaseDate": "\u53d1\u884c\u65e5\u671f", - "HeaderRuntime": "\u64ad\u653e\u65f6\u95f4", - "HeaderPlayCount": "Play Count", - "HeaderSeason": "\u5b63", - "HeaderSeasonNumber": "\u591a\u5c11\u5b63", - "HeaderSeries": "Series:", - "HeaderNetwork": "\u7f51\u7edc", - "HeaderYear": "Year:", - "HeaderYears": "Years:", - "HeaderParentalRating": "Parental Rating", - "HeaderCommunityRating": "\u516c\u4f17\u8bc4\u5206", - "HeaderTrailers": "\u9884\u544a\u7247", - "HeaderSpecials": "\u7279\u96c6", - "HeaderGameSystems": "Game Systems", - "HeaderPlayers": "Players:", - "HeaderAlbumArtists": "Album Artists", - "HeaderAlbums": "\u4e13\u8f91", - "HeaderDisc": "\u5149\u76d8", - "HeaderTrack": "\u97f3\u8f68", - "HeaderAudio": "\u97f3\u9891", - "HeaderVideo": "\u89c6\u9891", - "HeaderEmbeddedImage": "\u5d4c\u5165\u5f0f\u56fe\u50cf", - "HeaderResolution": "\u5206\u8fa8\u7387", - "HeaderSubtitles": "\u5b57\u5e55", - "HeaderGenres": "\u98ce\u683c", - "HeaderCountries": "\u56fd\u5bb6", - "HeaderStatus": "\u72b6\u6001", - "HeaderTracks": "\u97f3\u8f68", - "HeaderMusicArtist": "Music artist", - "HeaderLocked": "Locked", - "HeaderStudios": "\u5de5\u4f5c\u5ba4", - "HeaderActor": "Actors", - "HeaderComposer": "Composers", - "HeaderDirector": "Directors", - "HeaderGuestStar": "Guest star", - "HeaderProducer": "Producers", - "HeaderWriter": "Writers", - "HeaderParentalRatings": "\u5bb6\u957f\u5206\u7ea7", - "HeaderCommunityRatings": "Community ratings", - "StartupEmbyServerIsLoading": "Emby Server is loading. Please try again shortly." + "Sync": "\u540c\u6b65", + "User": "\u7528\u6237", + "System": "\u7cfb\u7edf", + "Application": "\u5e94\u7528\u7a0b\u5e8f", + "Plugin": "\u63d2\u4ef6", + "LabelExit": "\u9000\u51fa", + "LabelVisitCommunity": "\u8bbf\u95ee\u793e\u533a", + "LabelBrowseLibrary": "\u6d4f\u89c8\u5a92\u4f53\u5e93", + "LabelConfigureServer": "\u914d\u7f6e Emby", + "LabelRestartServer": "\u91cd\u542f\u670d\u52a1\u5668" }
\ No newline at end of file diff --git a/Emby.Server.Implementations/Localization/Core/zh-HK.json b/Emby.Server.Implementations/Localization/Core/zh-HK.json index a70e7a003..37afc47e6 100644 --- a/Emby.Server.Implementations/Localization/Core/zh-HK.json +++ b/Emby.Server.Implementations/Localization/Core/zh-HK.json @@ -1,102 +1,46 @@ { - "DbUpgradeMessage": "Please wait while your Emby Server database is upgraded. {0}% complete.", + "Latest": "Latest", + "ValueSpecialEpisodeName": "Special - {0}", + "Inherit": "Inherit", + "Books": "Books", + "Music": "Music", + "Games": "Games", + "Photos": "Photos", + "MixedContent": "Mixed content", + "MusicVideos": "Music videos", + "HomeVideos": "Home videos", + "Playlists": "Playlists", + "HeaderRecordingGroups": "Recording Groups", + "HeaderContinueWatching": "Continue Watching", + "HeaderFavoriteArtists": "Favorite Artists", + "HeaderFavoriteSongs": "Favorite Songs", + "HeaderAlbumArtists": "Album Artists", + "HeaderFavoriteAlbums": "Favorite Albums", + "HeaderFavoriteEpisodes": "Favorite Episodes", + "HeaderFavoriteShows": "Favorite Shows", + "HeaderNextUp": "Next Up", + "Favorites": "Favorites", + "Collections": "Collections", + "Channels": "Channels", + "Movies": "Movies", + "Albums": "Albums", + "Artists": "Artists", + "Folders": "Folders", + "Songs": "Songs", + "TvShows": "TV Shows", + "Shows": "Shows", + "Genres": "Genres", + "NameSeasonNumber": "Season {0}", "AppDeviceValues": "App: {0}, Device: {1}", "UserDownloadingItemWithValues": "{0} is downloading {1}", - "FolderTypeMixed": "\u6df7\u5408\u5167\u5bb9", - "FolderTypeMovies": "\u96fb\u5f71", - "FolderTypeMusic": "\u97f3\u6a02", - "FolderTypeAdultVideos": "\u6210\u4eba\u5f71\u7247", - "FolderTypePhotos": "\u76f8\u7247", - "FolderTypeMusicVideos": "MV", - "FolderTypeHomeVideos": "\u500b\u4eba\u5f71\u7247", - "FolderTypeGames": "\u904a\u6232", - "FolderTypeBooks": "\u66f8\u85c9", - "FolderTypeTvShows": "\u96fb\u8996\u7bc0\u76ee", - "FolderTypeInherit": "\u7e7c\u627f", - "HeaderCastCrew": "\u6f14\u54e1\u9663\u5bb9", - "HeaderPeople": "\u4eba\u7269", - "ValueSpecialEpisodeName": "Special - {0}", - "LabelChapterName": "Chapter {0}", - "NameSeasonNumber": "\u5287\u96c6\u5b63\u5ea6 {0}", - "LabelExit": "\u96e2\u958b", - "LabelVisitCommunity": "\u8a2a\u554f\u8a0e\u8ad6\u5340", - "LabelGithub": "Github", - "LabelApiDocumentation": "Api \u6587\u4ef6", - "LabelDeveloperResources": "\u958b\u767c\u8005\u8cc7\u6e90", - "LabelBrowseLibrary": "\u700f\u89bd\u8cc7\u6599\u5eab", - "LabelConfigureServer": "\u8a2d\u7f6e Emby", - "LabelRestartServer": "\u91cd\u65b0\u555f\u52d5\u4f3a\u670d\u5668", - "CategorySync": "\u540c\u6b65", - "CategoryUser": "User", - "CategorySystem": "System", - "CategoryApplication": "Application", - "CategoryPlugin": "Plugin", - "NotificationOptionPluginError": "Plugin failure", - "NotificationOptionApplicationUpdateAvailable": "Application update available", - "NotificationOptionApplicationUpdateInstalled": "Application update installed", - "NotificationOptionPluginUpdateInstalled": "Plugin update installed", - "NotificationOptionPluginInstalled": "Plugin installed", - "NotificationOptionPluginUninstalled": "Plugin uninstalled", - "NotificationOptionVideoPlayback": "Video playback started", - "NotificationOptionAudioPlayback": "Audio playback started", - "NotificationOptionGamePlayback": "Game playback started", - "NotificationOptionVideoPlaybackStopped": "Video playback stopped", - "NotificationOptionAudioPlaybackStopped": "Audio playback stopped", - "NotificationOptionGamePlaybackStopped": "Game playback stopped", - "NotificationOptionTaskFailed": "Scheduled task failure", - "NotificationOptionInstallationFailed": "Installation failure", - "NotificationOptionNewLibraryContent": "New content added", - "NotificationOptionNewLibraryContentMultiple": "New content added (multiple)", - "NotificationOptionCameraImageUploaded": "Camera image uploaded", - "NotificationOptionUserLockedOut": "User locked out", - "NotificationOptionServerRestartRequired": "\u9700\u8981\u91cd\u65b0\u555f\u52d5", - "ViewTypePlaylists": "Playlists", - "ViewTypeMovies": "Movies", - "ViewTypeTvShows": "TV", - "ViewTypeGames": "\u904a\u6232", - "ViewTypeMusic": "Music", - "ViewTypeMusicGenres": "Genres", - "ViewTypeMusicArtists": "Artists", - "ViewTypeBoxSets": "\u85cf\u54c1", - "ViewTypeChannels": "Channels", - "ViewTypeLiveTV": "Live TV", - "ViewTypeLiveTvNowPlaying": "Now Airing", - "ViewTypeLatestGames": "\u6700\u8fd1\u904a\u6232", - "ViewTypeRecentlyPlayedGames": "\u6700\u8fd1\u64ad\u653e", - "ViewTypeGameFavorites": "Favorites", - "ViewTypeGameSystems": "\u904a\u6232\u7cfb\u7d71", - "ViewTypeGameGenres": "Genres", - "ViewTypeTvResume": "Resume", - "ViewTypeTvNextUp": "Next Up", - "ViewTypeTvLatest": "Latest", - "ViewTypeTvShowSeries": "\u96fb\u8996\u5287", - "ViewTypeTvGenres": "Genres", - "ViewTypeTvFavoriteSeries": "\u6211\u7684\u6700\u611b\u96fb\u8996\u5287", - "ViewTypeTvFavoriteEpisodes": "\u6211\u7684\u6700\u611b\u5287\u96c6", - "ViewTypeMovieResume": "Resume", - "ViewTypeMovieLatest": "Latest", - "ViewTypeMovieMovies": "Movies", - "ViewTypeMovieCollections": "\u85cf\u54c1", - "ViewTypeMovieFavorites": "Favorites", - "ViewTypeMovieGenres": "Genres", - "ViewTypeMusicLatest": "Latest", - "ViewTypeMusicPlaylists": "Playlists", - "ViewTypeMusicAlbums": "Albums", - "ViewTypeMusicAlbumArtists": "Album Artists", - "HeaderOtherDisplaySettings": "Display Settings", - "ViewTypeMusicSongs": "\u6b4c\u66f2", - "ViewTypeMusicFavorites": "Favorites", - "ViewTypeMusicFavoriteAlbums": "Favorite Albums", - "ViewTypeMusicFavoriteArtists": "Favorite Artists", - "ViewTypeMusicFavoriteSongs": "\u6211\u7684\u6700\u611b\u6b4c\u66f2", - "ViewTypeFolders": "Folders", - "ViewTypeLiveTvRecordingGroups": "Recordings", - "ViewTypeLiveTvChannels": "Channels", + "HeaderLiveTV": "Live TV", + "ChapterNameValue": "Chapter {0}", "ScheduledTaskFailedWithName": "{0} failed", "LabelRunningTimeValue": "Running time: {0}", "ScheduledTaskStartedWithName": "{0} started", - "VersionNumber": "\u7248\u672c {0}", + "VersionNumber": "\u7248\u672c{0}", "PluginInstalledWithName": "{0} was installed", + "StartupEmbyServerIsLoading": "Emby Server is loading. Please try again shortly.", "PluginUpdatedWithName": "{0} was updated", "PluginUninstalledWithName": "{0} was uninstalled", "ItemAddedWithName": "{0} was added to the library", @@ -105,74 +49,48 @@ "DeviceOnlineWithName": "{0} is connected", "UserOnlineFromDevice": "{0} is online from {1}", "ProviderValue": "Provider: {0}", - "SubtitlesDownloadedForItem": "\u5df2\u7d93\u70ba {0} \u4e0b\u8f09\u4e86\u5b57\u5e55", - "UserConfigurationUpdatedWithName": "User configuration has been updated for {0}", + "SubtitlesDownloadedForItem": "Subtitles downloaded for {0}", "UserCreatedWithName": "User {0} has been created", "UserPasswordChangedWithName": "Password has been changed for user {0}", "UserDeletedWithName": "User {0} has been deleted", + "UserConfigurationUpdatedWithName": "User configuration has been updated for {0}", "MessageServerConfigurationUpdated": "Server configuration has been updated", "MessageNamedServerConfigurationUpdatedWithValue": "Server configuration section {0} has been updated", "MessageApplicationUpdated": "Emby Server has been updated", "FailedLoginAttemptWithUserName": "Failed login attempt from {0}", "AuthenticationSucceededWithUserName": "{0} successfully authenticated", - "DeviceOfflineWithName": "{0} has disconnected", - "UserLockedOutWithName": "User {0} has been locked out", "UserOfflineFromDevice": "{0} has disconnected from {1}", + "DeviceOfflineWithName": "{0} has disconnected", "UserStartedPlayingItemWithValues": "{0} has started playing {1}", "UserStoppedPlayingItemWithValues": "{0} has stopped playing {1}", - "SubtitleDownloadFailureForItem": "\u70ba {0} \u4e0b\u8f09\u5b57\u5e55\u5931\u6557", - "HeaderUnidentified": "Unidentified", - "HeaderImagePrimary": "Primary", - "HeaderImageBackdrop": "Backdrop", - "HeaderImageLogo": "Logo", - "HeaderUserPrimaryImage": "User Image", - "HeaderOverview": "Overview", - "HeaderShortOverview": "Short Overview", - "HeaderType": "Type", - "HeaderSeverity": "Severity", - "HeaderUser": "User", - "HeaderName": "\u540d\u7a31", - "HeaderDate": "\u65e5\u671f", - "HeaderPremiereDate": "Premiere Date", - "HeaderDateAdded": "Date Added", - "HeaderReleaseDate": "Release date", - "HeaderRuntime": "Runtime", - "HeaderPlayCount": "Play Count", - "HeaderSeason": "\u5287\u96c6\u5b63\u5ea6", - "HeaderSeasonNumber": "\u5287\u96c6\u5b63\u5ea6\u6578\u76ee", - "HeaderSeries": "\u96fb\u8996\u5287\uff1a", - "HeaderNetwork": "Network", - "HeaderYear": "Year:", - "HeaderYears": "Years:", - "HeaderParentalRating": "Parental Rating", - "HeaderCommunityRating": "Community rating", - "HeaderTrailers": "Trailers", - "HeaderSpecials": "Specials", - "HeaderGameSystems": "\u904a\u6232\u7cfb\u7d71", - "HeaderPlayers": "Players:", - "HeaderAlbumArtists": "Album Artists", - "HeaderAlbums": "Albums", - "HeaderDisc": "Disc", - "HeaderTrack": "Track", - "HeaderAudio": "\u97f3\u8a0a", - "HeaderVideo": "\u5f71\u7247", - "HeaderEmbeddedImage": "Embedded image", - "HeaderResolution": "Resolution", - "HeaderSubtitles": "\u5b57\u5e55", - "HeaderGenres": "Genres", - "HeaderCountries": "Countries", - "HeaderStatus": "\u72c0\u614b", - "HeaderTracks": "Tracks", - "HeaderMusicArtist": "\u6b4c\u624b", - "HeaderLocked": "Locked", - "HeaderStudios": "Studios", - "HeaderActor": "Actors", - "HeaderComposer": "Composers", - "HeaderDirector": "Directors", - "HeaderGuestStar": "\u7279\u7d04\u660e\u661f", - "HeaderProducer": "Producers", - "HeaderWriter": "Writers", - "HeaderParentalRatings": "Parental Ratings", - "HeaderCommunityRatings": "Community ratings", - "StartupEmbyServerIsLoading": "Emby Server is loading. Please try again shortly." + "NotificationOptionPluginError": "Plugin failure", + "NotificationOptionApplicationUpdateAvailable": "Application update available", + "NotificationOptionApplicationUpdateInstalled": "Application update installed", + "NotificationOptionPluginUpdateInstalled": "Plugin update installed", + "NotificationOptionPluginInstalled": "Plugin installed", + "NotificationOptionPluginUninstalled": "Plugin uninstalled", + "NotificationOptionVideoPlayback": "Video playback started", + "NotificationOptionAudioPlayback": "Audio playback started", + "NotificationOptionGamePlayback": "Game playback started", + "NotificationOptionVideoPlaybackStopped": "Video playback stopped", + "NotificationOptionAudioPlaybackStopped": "Audio playback stopped", + "NotificationOptionGamePlaybackStopped": "Game playback stopped", + "NotificationOptionTaskFailed": "Scheduled task failure", + "NotificationOptionInstallationFailed": "Installation failure", + "NotificationOptionNewLibraryContent": "New content added", + "NotificationOptionCameraImageUploaded": "Camera image uploaded", + "NotificationOptionUserLockedOut": "User locked out", + "NotificationOptionServerRestartRequired": "Server restart required", + "UserLockedOutWithName": "User {0} has been locked out", + "SubtitleDownloadFailureForItem": "Subtitles failed to download for {0}", + "Sync": "Sync", + "User": "User", + "System": "System", + "Application": "Application", + "Plugin": "Plugin", + "LabelExit": "Exit", + "LabelVisitCommunity": "\u8a2a\u554f\u8a0e\u8ad6\u5340", + "LabelBrowseLibrary": "Browse Library", + "LabelConfigureServer": "Configure Emby", + "LabelRestartServer": "Restart Server" }
\ No newline at end of file diff --git a/Emby.Server.Implementations/Localization/Core/zh-TW.json b/Emby.Server.Implementations/Localization/Core/zh-TW.json deleted file mode 100644 index b711aab1f..000000000 --- a/Emby.Server.Implementations/Localization/Core/zh-TW.json +++ /dev/null @@ -1,178 +0,0 @@ -{ - "DbUpgradeMessage": "\u8acb\u7a0d\u5019\uff0cEmby\u4f3a\u670d\u5668\u8cc7\u6599\u5eab\u6b63\u5728\u66f4\u65b0...\uff08\u5df2\u5b8c\u6210{0}%\uff09", - "AppDeviceValues": "App: {0}, Device: {1}", - "UserDownloadingItemWithValues": "{0} is downloading {1}", - "FolderTypeMixed": "Mixed content", - "FolderTypeMovies": "Movies", - "FolderTypeMusic": "Music", - "FolderTypeAdultVideos": "Adult videos", - "FolderTypePhotos": "Photos", - "FolderTypeMusicVideos": "Music videos", - "FolderTypeHomeVideos": "Home videos", - "FolderTypeGames": "Games", - "FolderTypeBooks": "Books", - "FolderTypeTvShows": "TV", - "FolderTypeInherit": "Inherit", - "HeaderCastCrew": "\u62cd\u651d\u4eba\u54e1\u53ca\u6f14\u54e1", - "HeaderPeople": "People", - "ValueSpecialEpisodeName": "Special - {0}", - "LabelChapterName": "Chapter {0}", - "NameSeasonNumber": "Season {0}", - "LabelExit": "\u96e2\u958b", - "LabelVisitCommunity": "\u8a2a\u554f\u793e\u7fa4", - "LabelGithub": "GitHub", - "LabelApiDocumentation": "API\u8aaa\u660e\u6587\u4ef6", - "LabelDeveloperResources": "\u958b\u767c\u4eba\u54e1\u5c08\u5340", - "LabelBrowseLibrary": "\u700f\u89bd\u5a92\u9ad4\u6ac3", - "LabelConfigureServer": "Emby\u8a2d\u5b9a", - "LabelRestartServer": "\u91cd\u65b0\u555f\u52d5\u4f3a\u670d\u5668", - "CategorySync": "Sync", - "CategoryUser": "User", - "CategorySystem": "System", - "CategoryApplication": "Application", - "CategoryPlugin": "Plugin", - "NotificationOptionPluginError": "Plugin failure", - "NotificationOptionApplicationUpdateAvailable": "Application update available", - "NotificationOptionApplicationUpdateInstalled": "Application update installed", - "NotificationOptionPluginUpdateInstalled": "Plugin update installed", - "NotificationOptionPluginInstalled": "Plugin installed", - "NotificationOptionPluginUninstalled": "Plugin uninstalled", - "NotificationOptionVideoPlayback": "Video playback started", - "NotificationOptionAudioPlayback": "Audio playback started", - "NotificationOptionGamePlayback": "Game playback started", - "NotificationOptionVideoPlaybackStopped": "Video playback stopped", - "NotificationOptionAudioPlaybackStopped": "Audio playback stopped", - "NotificationOptionGamePlaybackStopped": "Game playback stopped", - "NotificationOptionTaskFailed": "Scheduled task failure", - "NotificationOptionInstallationFailed": "Installation failure", - "NotificationOptionNewLibraryContent": "New content added", - "NotificationOptionNewLibraryContentMultiple": "New content added (multiple)", - "NotificationOptionCameraImageUploaded": "Camera image uploaded", - "NotificationOptionUserLockedOut": "User locked out", - "NotificationOptionServerRestartRequired": "Server restart required", - "ViewTypePlaylists": "Playlists", - "ViewTypeMovies": "Movies", - "ViewTypeTvShows": "TV", - "ViewTypeGames": "Games", - "ViewTypeMusic": "Music", - "ViewTypeMusicGenres": "Genres", - "ViewTypeMusicArtists": "Artists", - "ViewTypeBoxSets": "Collections", - "ViewTypeChannels": "Channels", - "ViewTypeLiveTV": "\u96fb\u8996", - "ViewTypeLiveTvNowPlaying": "Now Airing", - "ViewTypeLatestGames": "Latest Games", - "ViewTypeRecentlyPlayedGames": "Recently Played", - "ViewTypeGameFavorites": "Favorites", - "ViewTypeGameSystems": "Game Systems", - "ViewTypeGameGenres": "Genres", - "ViewTypeTvResume": "Resume", - "ViewTypeTvNextUp": "Next Up", - "ViewTypeTvLatest": "Latest", - "ViewTypeTvShowSeries": "Series", - "ViewTypeTvGenres": "Genres", - "ViewTypeTvFavoriteSeries": "Favorite Series", - "ViewTypeTvFavoriteEpisodes": "Favorite Episodes", - "ViewTypeMovieResume": "Resume", - "ViewTypeMovieLatest": "Latest", - "ViewTypeMovieMovies": "Movies", - "ViewTypeMovieCollections": "Collections", - "ViewTypeMovieFavorites": "Favorites", - "ViewTypeMovieGenres": "Genres", - "ViewTypeMusicLatest": "Latest", - "ViewTypeMusicPlaylists": "Playlists", - "ViewTypeMusicAlbums": "Albums", - "ViewTypeMusicAlbumArtists": "Album Artists", - "HeaderOtherDisplaySettings": "Display Settings", - "ViewTypeMusicSongs": "Songs", - "ViewTypeMusicFavorites": "Favorites", - "ViewTypeMusicFavoriteAlbums": "Favorite Albums", - "ViewTypeMusicFavoriteArtists": "Favorite Artists", - "ViewTypeMusicFavoriteSongs": "Favorite Songs", - "ViewTypeFolders": "Folders", - "ViewTypeLiveTvRecordingGroups": "Recordings", - "ViewTypeLiveTvChannels": "Channels", - "ScheduledTaskFailedWithName": "{0} failed", - "LabelRunningTimeValue": "Running time: {0}", - "ScheduledTaskStartedWithName": "{0} started", - "VersionNumber": "\u7248\u672c{0}", - "PluginInstalledWithName": "{0} was installed", - "PluginUpdatedWithName": "{0} was updated", - "PluginUninstalledWithName": "{0} was uninstalled", - "ItemAddedWithName": "{0} was added to the library", - "ItemRemovedWithName": "{0} was removed from the library", - "LabelIpAddressValue": "Ip address: {0}", - "DeviceOnlineWithName": "{0} is connected", - "UserOnlineFromDevice": "{0} is online from {1}", - "ProviderValue": "Provider: {0}", - "SubtitlesDownloadedForItem": "Subtitles downloaded for {0}", - "UserConfigurationUpdatedWithName": "User configuration has been updated for {0}", - "UserCreatedWithName": "User {0} has been created", - "UserPasswordChangedWithName": "Password has been changed for user {0}", - "UserDeletedWithName": "User {0} has been deleted", - "MessageServerConfigurationUpdated": "Server configuration has been updated", - "MessageNamedServerConfigurationUpdatedWithValue": "Server configuration section {0} has been updated", - "MessageApplicationUpdated": "Emby Server has been updated", - "FailedLoginAttemptWithUserName": "Failed login attempt from {0}", - "AuthenticationSucceededWithUserName": "{0} successfully authenticated", - "DeviceOfflineWithName": "{0} has disconnected", - "UserLockedOutWithName": "User {0} has been locked out", - "UserOfflineFromDevice": "{0} has disconnected from {1}", - "UserStartedPlayingItemWithValues": "{0} has started playing {1}", - "UserStoppedPlayingItemWithValues": "{0} has stopped playing {1}", - "SubtitleDownloadFailureForItem": "Subtitles failed to download for {0}", - "HeaderUnidentified": "Unidentified", - "HeaderImagePrimary": "Primary", - "HeaderImageBackdrop": "Backdrop", - "HeaderImageLogo": "Logo", - "HeaderUserPrimaryImage": "User Image", - "HeaderOverview": "Overview", - "HeaderShortOverview": "Short Overview", - "HeaderType": "Type", - "HeaderSeverity": "Severity", - "HeaderUser": "User", - "HeaderName": "Name", - "HeaderDate": "Date", - "HeaderPremiereDate": "Premiere Date", - "HeaderDateAdded": "Date Added", - "HeaderReleaseDate": "Release date", - "HeaderRuntime": "Runtime", - "HeaderPlayCount": "Play Count", - "HeaderSeason": "Season", - "HeaderSeasonNumber": "Season number", - "HeaderSeries": "Series:", - "HeaderNetwork": "Network", - "HeaderYear": "Year:", - "HeaderYears": "Years:", - "HeaderParentalRating": "Parental Rating", - "HeaderCommunityRating": "Community rating", - "HeaderTrailers": "Trailers", - "HeaderSpecials": "Specials", - "HeaderGameSystems": "Game Systems", - "HeaderPlayers": "Players:", - "HeaderAlbumArtists": "Album Artists", - "HeaderAlbums": "Albums", - "HeaderDisc": "Disc", - "HeaderTrack": "Track", - "HeaderAudio": "Audio", - "HeaderVideo": "Video", - "HeaderEmbeddedImage": "Embedded image", - "HeaderResolution": "Resolution", - "HeaderSubtitles": "Subtitles", - "HeaderGenres": "Genres", - "HeaderCountries": "Countries", - "HeaderStatus": "\u72c0\u614b", - "HeaderTracks": "Tracks", - "HeaderMusicArtist": "Music artist", - "HeaderLocked": "Locked", - "HeaderStudios": "Studios", - "HeaderActor": "Actors", - "HeaderComposer": "Composers", - "HeaderDirector": "Directors", - "HeaderGuestStar": "Guest star", - "HeaderProducer": "Producers", - "HeaderWriter": "Writers", - "HeaderParentalRatings": "Parental Ratings", - "HeaderCommunityRatings": "Community ratings", - "StartupEmbyServerIsLoading": "Emby Server is loading. Please try again shortly." -}
\ No newline at end of file diff --git a/Emby.Server.Implementations/Localization/LocalizationManager.cs b/Emby.Server.Implementations/Localization/LocalizationManager.cs index 278a39cd1..650f388a1 100644 --- a/Emby.Server.Implementations/Localization/LocalizationManager.cs +++ b/Emby.Server.Implementations/Localization/LocalizationManager.cs @@ -315,6 +315,15 @@ namespace Emby.Server.Implementations.Localization public string GetLocalizedString(string phrase, string culture) { + if (string.IsNullOrWhiteSpace(culture)) + { + culture = _configurationManager.Configuration.UICulture; + } + if (string.IsNullOrWhiteSpace(culture)) + { + culture = DefaultCulture; + } + var dictionary = GetLocalizationDictionary(culture); string value; @@ -327,19 +336,31 @@ namespace Emby.Server.Implementations.Localization return phrase; } + const string DefaultCulture = "en-US"; + private readonly ConcurrentDictionary<string, Dictionary<string, string>> _dictionaries = new ConcurrentDictionary<string, Dictionary<string, string>>(StringComparer.OrdinalIgnoreCase); public Dictionary<string, string> GetLocalizationDictionary(string culture) { + if (string.IsNullOrWhiteSpace(culture)) + { + throw new ArgumentNullException("culture"); + } + const string prefix = "Core"; var key = prefix + culture; - return _dictionaries.GetOrAdd(key, k => GetDictionary(prefix, culture, "en-US.json")); + return _dictionaries.GetOrAdd(key, k => GetDictionary(prefix, culture, DefaultCulture + ".json")); } private Dictionary<string, string> GetDictionary(string prefix, string culture, string baseFilename) { + if (string.IsNullOrWhiteSpace(culture)) + { + throw new ArgumentNullException("culture"); + } + var dictionary = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase); var namespaceName = GetType().Namespace + "." + prefix; @@ -387,36 +408,47 @@ namespace Emby.Server.Implementations.Localization return new LocalizatonOption[] { new LocalizatonOption{ Name="Arabic", Value="ar"}, + new LocalizatonOption{ Name="Belarusian (Belarus)", Value="be-BY"}, new LocalizatonOption{ Name="Bulgarian (Bulgaria)", Value="bg-BG"}, new LocalizatonOption{ Name="Catalan", Value="ca"}, new LocalizatonOption{ Name="Chinese Simplified", Value="zh-CN"}, new LocalizatonOption{ Name="Chinese Traditional", Value="zh-TW"}, + new LocalizatonOption{ Name="Chinese Traditional (Hong Kong)", Value="zh-HK"}, new LocalizatonOption{ Name="Croatian", Value="hr"}, new LocalizatonOption{ Name="Czech", Value="cs"}, new LocalizatonOption{ Name="Danish", Value="da"}, new LocalizatonOption{ Name="Dutch", Value="nl"}, new LocalizatonOption{ Name="English (United Kingdom)", Value="en-GB"}, - new LocalizatonOption{ Name="English (United States)", Value="en-us"}, + new LocalizatonOption{ Name="English (United States)", Value="en-US"}, new LocalizatonOption{ Name="Finnish", Value="fi"}, new LocalizatonOption{ Name="French", Value="fr"}, new LocalizatonOption{ Name="French (Canada)", Value="fr-CA"}, new LocalizatonOption{ Name="German", Value="de"}, new LocalizatonOption{ Name="Greek", Value="el"}, new LocalizatonOption{ Name="Hebrew", Value="he"}, + new LocalizatonOption{ Name="Hindi (India)", Value="hi-IN"}, new LocalizatonOption{ Name="Hungarian", Value="hu"}, new LocalizatonOption{ Name="Indonesian", Value="id"}, new LocalizatonOption{ Name="Italian", Value="it"}, + new LocalizatonOption{ Name="Japanese", Value="ja"}, new LocalizatonOption{ Name="Kazakh", Value="kk"}, + new LocalizatonOption{ Name="Korean", Value="ko"}, + new LocalizatonOption{ Name="Lithuanian", Value="lt-LT"}, + new LocalizatonOption{ Name="Malay", Value="ms"}, new LocalizatonOption{ Name="Norwegian Bokmål", Value="nb"}, new LocalizatonOption{ Name="Persian", Value="fa"}, new LocalizatonOption{ Name="Polish", Value="pl"}, new LocalizatonOption{ Name="Portuguese (Brazil)", Value="pt-BR"}, new LocalizatonOption{ Name="Portuguese (Portugal)", Value="pt-PT"}, + new LocalizatonOption{ Name="Romanian", Value="ro"}, new LocalizatonOption{ Name="Russian", Value="ru"}, + new LocalizatonOption{ Name="Slovak", Value="sk"}, new LocalizatonOption{ Name="Slovenian (Slovenia)", Value="sl-SI"}, - new LocalizatonOption{ Name="Spanish", Value="es-ES"}, + new LocalizatonOption{ Name="Spanish", Value="es"}, + new LocalizatonOption{ Name="Spanish (Latin America)", Value="es-419"}, new LocalizatonOption{ Name="Spanish (Mexico)", Value="es-MX"}, new LocalizatonOption{ Name="Swedish", Value="sv"}, + new LocalizatonOption{ Name="Swiss German", Value="gsw"}, new LocalizatonOption{ Name="Turkish", Value="tr"}, new LocalizatonOption{ Name="Ukrainian", Value="uk"}, new LocalizatonOption{ Name="Vietnamese", Value="vi"} diff --git a/Emby.Server.Implementations/Networking/NetworkManager.cs b/Emby.Server.Implementations/Networking/NetworkManager.cs index b47c058df..66b2cba39 100644 --- a/Emby.Server.Implementations/Networking/NetworkManager.cs +++ b/Emby.Server.Implementations/Networking/NetworkManager.cs @@ -29,7 +29,7 @@ namespace Emby.Server.Implementations.Networking public List<IpAddressInfo> GetLocalIpAddresses() { - const int cacheMinutes = 5; + const int cacheMinutes = 10; lock (_localIpAddressSyncLock) { @@ -81,8 +81,18 @@ namespace Emby.Server.Implementations.Networking return true; } - // Handle ipv4 mapped to ipv6 - endpoint = endpoint.Replace("::ffff:", string.Empty); + // ipv6 + if (endpoint.Split('.').Length > 4) + { + // Handle ipv4 mapped to ipv6 + var originalEndpoint = endpoint; + endpoint = endpoint.Replace("::ffff:", string.Empty); + + if (string.Equals(endpoint, originalEndpoint, StringComparison.OrdinalIgnoreCase)) + { + return false; + } + } // Private address space: // http://en.wikipedia.org/wiki/Private_network @@ -92,13 +102,74 @@ namespace Emby.Server.Implementations.Networking return Is172AddressPrivate(endpoint); } - return + return endpoint.StartsWith("localhost", StringComparison.OrdinalIgnoreCase) || + endpoint.StartsWith("127.0.0.1", StringComparison.OrdinalIgnoreCase) || + IsInPrivateAddressSpaceAndLocalSubnet(endpoint); + } + + public bool IsInPrivateAddressSpaceAndLocalSubnet(string endpoint) + { + var endpointFirstPart = endpoint.Split('.')[0]; - endpoint.StartsWith("localhost", StringComparison.OrdinalIgnoreCase) || + string subnet_Match = ""; + if ( endpoint.StartsWith("127.", StringComparison.OrdinalIgnoreCase) || endpoint.StartsWith("10.", StringComparison.OrdinalIgnoreCase) || endpoint.StartsWith("192.168", StringComparison.OrdinalIgnoreCase) || - endpoint.StartsWith("169.", StringComparison.OrdinalIgnoreCase); + endpoint.StartsWith("169.", StringComparison.OrdinalIgnoreCase) + ) + { + foreach (NetworkInterface adapter in NetworkInterface.GetAllNetworkInterfaces()) + foreach (UnicastIPAddressInformation unicastIPAddressInformation in adapter.GetIPProperties().UnicastAddresses) + if (unicastIPAddressInformation.Address.AddressFamily == AddressFamily.InterNetwork && endpointFirstPart == unicastIPAddressInformation.Address.ToString().Split('.')[0]) + { + int subnet_Test = 0; + foreach (string part in unicastIPAddressInformation.IPv4Mask.ToString().Split('.')) + { + if (part.Equals("0")) break; + subnet_Test++; + } + + subnet_Match = String.Join(".", unicastIPAddressInformation.Address.ToString().Split('.').Take(subnet_Test).ToArray()); + } + } + + return endpoint.StartsWith(subnet_Match + ".", StringComparison.OrdinalIgnoreCase); + } + + private Dictionary<string, string> _subnetLookup = new Dictionary<string, string>(StringComparer.Ordinal); + private string GetSubnet(string endpointFirstPart) + { + string subnet_Match = ""; + + lock (_subnetLookup) + { + if (_subnetLookup.TryGetValue(endpointFirstPart, out subnet_Match)) + { + return subnet_Match; + } + + foreach (NetworkInterface adapter in NetworkInterface.GetAllNetworkInterfaces()) + foreach (UnicastIPAddressInformation unicastIPAddressInformation in adapter.GetIPProperties().UnicastAddresses) + if (unicastIPAddressInformation.Address.AddressFamily == AddressFamily.InterNetwork && endpointFirstPart == unicastIPAddressInformation.Address.ToString().Split('.')[0]) + { + int subnet_Test = 0; + foreach (string part in unicastIPAddressInformation.IPv4Mask.ToString().Split('.')) + { + if (part.Equals("0")) break; + subnet_Test++; + } + + subnet_Match = String.Join(".", unicastIPAddressInformation.Address.ToString().Split('.').Take(subnet_Test).ToArray()); + } + + if (!string.IsNullOrWhiteSpace(subnet_Match)) + { + _subnetLookup[endpointFirstPart] = subnet_Match; + } + } + + return subnet_Match; } private bool Is172AddressPrivate(string endpoint) @@ -198,12 +269,6 @@ namespace Emby.Server.Implementations.Networking return Dns.GetHostAddressesAsync(hostName); } - private readonly List<NetworkInterfaceType> _validNetworkInterfaceTypes = new List<NetworkInterfaceType> - { - NetworkInterfaceType.Ethernet, - NetworkInterfaceType.Wireless80211 - }; - private List<IPAddress> GetIPsDefault() { NetworkInterface[] interfaces; @@ -227,7 +292,8 @@ namespace Emby.Server.Implementations.Networking try { - Logger.Debug("Querying interface: {0}. Type: {1}. Status: {2}", network.Name, network.NetworkInterfaceType, network.OperationalStatus); + // suppress logging because it might be causing nas device wake up + //Logger.Debug("Querying interface: {0}. Type: {1}. Status: {2}", network.Name, network.NetworkInterfaceType, network.OperationalStatus); var ipProperties = network.GetIPProperties(); diff --git a/Emby.Server.Implementations/News/NewsEntryPoint.cs b/Emby.Server.Implementations/News/NewsEntryPoint.cs index 03c79c2c1..74366233c 100644 --- a/Emby.Server.Implementations/News/NewsEntryPoint.cs +++ b/Emby.Server.Implementations/News/NewsEntryPoint.cs @@ -88,15 +88,18 @@ namespace Emby.Server.Implementations.News BufferContent = false }; - using (var stream = await _httpClient.Get(requestOptions).ConfigureAwait(false)) + using (var response = await _httpClient.SendAsync(requestOptions, "GET").ConfigureAwait(false)) { - using (var reader = XmlReader.Create(stream)) + using (var stream = response.Content) { - var news = ParseRssItems(reader).ToList(); + using (var reader = XmlReader.Create(stream)) + { + var news = ParseRssItems(reader).ToList(); - _json.SerializeToFile(news, path); + _json.SerializeToFile(news, path); - await CreateNotifications(news, lastUpdate, CancellationToken.None).ConfigureAwait(false); + await CreateNotifications(news, lastUpdate, CancellationToken.None).ConfigureAwait(false); + } } } } diff --git a/Emby.Server.Implementations/Notifications/CoreNotificationTypes.cs b/Emby.Server.Implementations/Notifications/CoreNotificationTypes.cs index 849e02d81..b00b5d43b 100644 --- a/Emby.Server.Implementations/Notifications/CoreNotificationTypes.cs +++ b/Emby.Server.Implementations/Notifications/CoreNotificationTypes.cs @@ -160,7 +160,7 @@ namespace Emby.Server.Implementations.Notifications Update(type); } - var systemName = _localization.GetLocalizedString("CategorySystem"); + var systemName = _localization.GetLocalizedString("System"); return knownTypes.OrderByDescending(i => string.Equals(i.Category, systemName, StringComparison.OrdinalIgnoreCase)) .ThenBy(i => i.Category) @@ -175,23 +175,23 @@ namespace Emby.Server.Implementations.Notifications if (note.Type.IndexOf("Playback", StringComparison.OrdinalIgnoreCase) != -1) { - note.Category = _localization.GetLocalizedString("CategoryUser"); + note.Category = _localization.GetLocalizedString("User"); } else if (note.Type.IndexOf("Plugin", StringComparison.OrdinalIgnoreCase) != -1) { - note.Category = _localization.GetLocalizedString("CategoryPlugin"); + note.Category = _localization.GetLocalizedString("Plugin"); } else if (note.Type.IndexOf("CameraImageUploaded", StringComparison.OrdinalIgnoreCase) != -1) { - note.Category = _localization.GetLocalizedString("CategorySync"); + note.Category = _localization.GetLocalizedString("Sync"); } else if (note.Type.IndexOf("UserLockedOut", StringComparison.OrdinalIgnoreCase) != -1) { - note.Category = _localization.GetLocalizedString("CategoryUser"); + note.Category = _localization.GetLocalizedString("User"); } else { - note.Category = _localization.GetLocalizedString("CategorySystem"); + note.Category = _localization.GetLocalizedString("System"); } } } diff --git a/Emby.Server.Implementations/Notifications/NotificationManager.cs b/Emby.Server.Implementations/Notifications/NotificationManager.cs index f49d5a1d1..e11f2790e 100644 --- a/Emby.Server.Implementations/Notifications/NotificationManager.cs +++ b/Emby.Server.Implementations/Notifications/NotificationManager.cs @@ -38,6 +38,11 @@ namespace Emby.Server.Implementations.Notifications public Task SendNotification(NotificationRequest request, CancellationToken cancellationToken) { + return SendNotification(request, null, cancellationToken); + } + + public Task SendNotification(NotificationRequest request, BaseItem relatedItem, CancellationToken cancellationToken) + { var notificationType = request.NotificationType; var options = string.IsNullOrWhiteSpace(notificationType) ? @@ -45,7 +50,9 @@ namespace Emby.Server.Implementations.Notifications GetConfiguration().GetOptions(notificationType); var users = GetUserIds(request, options) - .Select(i => _userManager.GetUserById(i)); + .Select(i => _userManager.GetUserById(i)) + .Where(i => relatedItem == null || relatedItem.IsVisibleStandalone(i)) + .ToArray(); var title = GetTitle(request, options); var description = GetDescription(request, options); @@ -69,7 +76,6 @@ namespace Emby.Server.Implementations.Notifications var tasks = users.Select(i => SendNotification(request, service, title, description, i, cancellationToken)); return Task.WhenAll(tasks); - } private IEnumerable<string> GetUserIds(NotificationRequest request, NotificationOption options) diff --git a/Emby.Server.Implementations/Notifications/Notifications.cs b/Emby.Server.Implementations/Notifications/Notifications.cs index 09c1f07e0..b7e1d6559 100644 --- a/Emby.Server.Implementations/Notifications/Notifications.cs +++ b/Emby.Server.Implementations/Notifications/Notifications.cs @@ -97,7 +97,7 @@ namespace Emby.Server.Implementations.Notifications notification.Variables["UserName"] = e.Argument.Name; - await SendNotification(notification).ConfigureAwait(false); + await SendNotification(notification, null).ConfigureAwait(false); } async void _deviceManager_CameraImageUploaded(object sender, GenericEventArgs<CameraImageUploadInfo> e) @@ -111,7 +111,7 @@ namespace Emby.Server.Implementations.Notifications notification.Variables["DeviceName"] = e.Argument.Device.Name; - await SendNotification(notification).ConfigureAwait(false); + await SendNotification(notification, null).ConfigureAwait(false); } async void _appHost_ApplicationUpdated(object sender, GenericEventArgs<PackageVersionInfo> e) @@ -127,7 +127,7 @@ namespace Emby.Server.Implementations.Notifications notification.Variables["Version"] = e.Argument.versionStr; notification.Variables["ReleaseNotes"] = e.Argument.description; - await SendNotification(notification).ConfigureAwait(false); + await SendNotification(notification, null).ConfigureAwait(false); } async void _installationManager_PluginUpdated(object sender, GenericEventArgs<Tuple<IPlugin, PackageVersionInfo>> e) @@ -146,7 +146,7 @@ namespace Emby.Server.Implementations.Notifications notification.Variables["Version"] = installationInfo.Version.ToString(); notification.Variables["ReleaseNotes"] = e.Argument.Item2.description; - await SendNotification(notification).ConfigureAwait(false); + await SendNotification(notification, null).ConfigureAwait(false); } async void _installationManager_PluginInstalled(object sender, GenericEventArgs<PackageVersionInfo> e) @@ -164,7 +164,7 @@ namespace Emby.Server.Implementations.Notifications notification.Variables["Name"] = installationInfo.name; notification.Variables["Version"] = installationInfo.versionStr; - await SendNotification(notification).ConfigureAwait(false); + await SendNotification(notification, null).ConfigureAwait(false); } async void _appHost_HasUpdateAvailableChanged(object sender, EventArgs e) @@ -183,7 +183,7 @@ namespace Emby.Server.Implementations.Notifications NotificationType = type }; - await SendNotification(notification).ConfigureAwait(false); + await SendNotification(notification, null).ConfigureAwait(false); } async void _appHost_HasPendingRestartChanged(object sender, EventArgs e) @@ -200,7 +200,7 @@ namespace Emby.Server.Implementations.Notifications NotificationType = type }; - await SendNotification(notification).ConfigureAwait(false); + await SendNotification(notification, null).ConfigureAwait(false); } private NotificationOptions GetOptions() @@ -285,7 +285,7 @@ namespace Emby.Server.Implementations.Notifications notification.Variables["AppName"] = e.ClientName; notification.Variables["DeviceName"] = e.DeviceName; - await SendNotification(notification).ConfigureAwait(false); + await SendNotification(notification, null).ConfigureAwait(false); } private string GetPlaybackNotificationType(string mediaType) @@ -390,7 +390,7 @@ namespace Emby.Server.Implementations.Notifications notification.Variables["Name"] = GetItemName(item); - await SendNotification(notification).ConfigureAwait(false); + await SendNotification(notification, item).ConfigureAwait(false); } } @@ -457,7 +457,7 @@ namespace Emby.Server.Implementations.Notifications Description = "Check back here for more notifications." }; - await SendNotification(notification).ConfigureAwait(false); + await SendNotification(notification, null).ConfigureAwait(false); } async void _taskManager_TaskCompleted(object sender, TaskCompletionEventArgs e) @@ -478,7 +478,7 @@ namespace Emby.Server.Implementations.Notifications notification.Variables["Name"] = result.Name; notification.Variables["ErrorMessage"] = result.ErrorMessage; - await SendNotification(notification).ConfigureAwait(false); + await SendNotification(notification, null).ConfigureAwait(false); } } @@ -496,7 +496,7 @@ namespace Emby.Server.Implementations.Notifications notification.Variables["Name"] = plugin.Name; notification.Variables["Version"] = plugin.Version.ToString(); - await SendNotification(notification).ConfigureAwait(false); + await SendNotification(notification, null).ConfigureAwait(false); } async void _installationManager_PackageInstallationFailed(object sender, InstallationFailedEventArgs e) @@ -515,14 +515,14 @@ namespace Emby.Server.Implementations.Notifications notification.Variables["Name"] = installationInfo.Name; notification.Variables["Version"] = installationInfo.Version; - await SendNotification(notification).ConfigureAwait(false); + await SendNotification(notification, null).ConfigureAwait(false); } - private async Task SendNotification(NotificationRequest notification) + private async Task SendNotification(NotificationRequest notification, BaseItem relatedItem) { try { - await _notificationManager.SendNotification(notification, CancellationToken.None).ConfigureAwait(false); + await _notificationManager.SendNotification(notification, relatedItem, CancellationToken.None).ConfigureAwait(false); } catch (Exception ex) { diff --git a/Emby.Server.Implementations/Photos/PhotoAlbumImageProvider.cs b/Emby.Server.Implementations/Photos/PhotoAlbumImageProvider.cs deleted file mode 100644 index f7c65f63d..000000000 --- a/Emby.Server.Implementations/Photos/PhotoAlbumImageProvider.cs +++ /dev/null @@ -1,34 +0,0 @@ -using MediaBrowser.Common.Configuration; -using MediaBrowser.Controller.Drawing; -using MediaBrowser.Controller.Entities; -using MediaBrowser.Controller.Providers; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; -using Emby.Server.Implementations.Images; -using MediaBrowser.Model.IO; -using MediaBrowser.Model.Entities; - -namespace Emby.Server.Implementations.Photos -{ - public class PhotoAlbumImageProvider : BaseDynamicImageProvider<PhotoAlbum> - { - public PhotoAlbumImageProvider(IFileSystem fileSystem, IProviderManager providerManager, IApplicationPaths applicationPaths, IImageProcessor imageProcessor) - : base(fileSystem, providerManager, applicationPaths, imageProcessor) - { - } - - protected override List<BaseItem> GetItemsWithImages(IHasMetadata item) - { - var photoAlbum = (PhotoAlbum)item; - var items = GetFinalItems(photoAlbum.Children); - - return items; - } - - protected override string CreateImage(IHasMetadata item, List<BaseItem> itemsWithImages, string outputPathWithoutExtension, ImageType imageType, int imageIndex) - { - return CreateSingleImage(itemsWithImages, outputPathWithoutExtension, ImageType.Primary); - } - } -} diff --git a/Emby.Server.Implementations/Playlists/PlaylistManager.cs b/Emby.Server.Implementations/Playlists/PlaylistManager.cs index 87832e7dd..f268e9c0c 100644 --- a/Emby.Server.Implementations/Playlists/PlaylistManager.cs +++ b/Emby.Server.Implementations/Playlists/PlaylistManager.cs @@ -209,7 +209,7 @@ namespace Emby.Server.Implementations.Playlists newList.AddRange(list); playlist.LinkedChildren = newList.ToArray(newList.Count); - await playlist.UpdateToRepository(ItemUpdateType.MetadataEdit, CancellationToken.None).ConfigureAwait(false); + playlist.UpdateToRepository(ItemUpdateType.MetadataEdit, CancellationToken.None); _providerManager.QueueRefresh(playlist.Id, new MetadataRefreshOptions(_fileSystem) { @@ -237,7 +237,7 @@ namespace Emby.Server.Implementations.Playlists .Select(i => i.Item1) .ToArray(); - await playlist.UpdateToRepository(ItemUpdateType.MetadataEdit, CancellationToken.None).ConfigureAwait(false); + playlist.UpdateToRepository(ItemUpdateType.MetadataEdit, CancellationToken.None); _providerManager.QueueRefresh(playlist.Id, new MetadataRefreshOptions(_fileSystem) { @@ -281,7 +281,7 @@ namespace Emby.Server.Implementations.Playlists playlist.LinkedChildren = newList.ToArray(newList.Count); - await playlist.UpdateToRepository(ItemUpdateType.MetadataEdit, CancellationToken.None).ConfigureAwait(false); + playlist.UpdateToRepository(ItemUpdateType.MetadataEdit, CancellationToken.None); } public Folder GetPlaylistsFolder(string userId) diff --git a/Emby.Server.Implementations/ScheduledTasks/TaskManager.cs b/Emby.Server.Implementations/ScheduledTasks/TaskManager.cs index 5f9bf3731..c0fcb459d 100644 --- a/Emby.Server.Implementations/ScheduledTasks/TaskManager.cs +++ b/Emby.Server.Implementations/ScheduledTasks/TaskManager.cs @@ -11,6 +11,7 @@ using MediaBrowser.Model.Logging; using MediaBrowser.Model.Serialization; using MediaBrowser.Model.System; using MediaBrowser.Model.Tasks; +using System.IO; namespace Emby.Server.Implementations.ScheduledTasks { @@ -86,6 +87,57 @@ namespace Emby.Server.Implementations.ScheduledTasks } } + public void RunTaskOnNextStartup(string key) + { + var path = Path.Combine(ApplicationPaths.CachePath, "startuptasks.txt"); + + List<string> lines; + + try + { + lines = _fileSystem.ReadAllLines(path).ToList() ; + } + catch + { + lines = new List<string>(); + } + + if (!lines.Contains(key, StringComparer.OrdinalIgnoreCase)) + { + lines.Add(key); + _fileSystem.CreateDirectory(_fileSystem.GetDirectoryName(path)); + _fileSystem.WriteAllLines(path, lines); + } + } + + private void RunStartupTasks() + { + var path = Path.Combine(ApplicationPaths.CachePath, "startuptasks.txt"); + + List<string> lines; + + try + { + lines = _fileSystem.ReadAllLines(path).Where(i => !string.IsNullOrWhiteSpace(i)).Distinct(StringComparer.OrdinalIgnoreCase).ToList(); + + foreach (var key in lines) + { + var task = ScheduledTasks.FirstOrDefault(i => string.Equals(i.ScheduledTask.Key, key, StringComparison.OrdinalIgnoreCase)); + + if (task != null) + { + QueueScheduledTask(task, new TaskExecutionOptions()); + } + } + + _fileSystem.DeleteFile(path); + } + catch + { + return; + } + } + /// <summary> /// Cancels if running and queue. /// </summary> @@ -235,6 +287,8 @@ namespace Emby.Server.Implementations.ScheduledTasks ScheduledTasks = myTasks.ToArray(); BindToSystemEvent(); + + RunStartupTasks(); } /// <summary> diff --git a/Emby.Server.Implementations/Security/AuthenticationRepository.cs b/Emby.Server.Implementations/Security/AuthenticationRepository.cs index f5b847ccf..b1877d776 100644 --- a/Emby.Server.Implementations/Security/AuthenticationRepository.cs +++ b/Emby.Server.Implementations/Security/AuthenticationRepository.cs @@ -34,7 +34,7 @@ namespace Emby.Server.Implementations.Security string[] queries = { - "create table if not exists AccessTokens (Id GUID PRIMARY KEY, AccessToken TEXT NOT NULL, DeviceId TEXT, AppName TEXT, AppVersion TEXT, DeviceName TEXT, UserId TEXT, IsActive BIT, DateCreated DATETIME NOT NULL, DateRevoked DATETIME)", + "create table if not exists AccessTokens (Id GUID PRIMARY KEY NOT NULL, AccessToken TEXT NOT NULL, DeviceId TEXT NOT NULL, AppName TEXT NOT NULL, AppVersion TEXT NOT NULL, DeviceName TEXT NOT NULL, UserId TEXT, IsActive BIT NOT NULL, DateCreated DATETIME NOT NULL, DateRevoked DATETIME)", "create index if not exists idx_AccessTokens on AccessTokens(Id)" }; diff --git a/Emby.Server.Implementations/Security/PluginSecurityManager.cs b/Emby.Server.Implementations/Security/PluginSecurityManager.cs index d42fae3ad..615ffa1f4 100644 --- a/Emby.Server.Implementations/Security/PluginSecurityManager.cs +++ b/Emby.Server.Implementations/Security/PluginSecurityManager.cs @@ -293,10 +293,13 @@ namespace Emby.Server.Implementations.Security options.SetPostData(data); - using (var json = (await _httpClient.Post(options).ConfigureAwait(false)).Content) + using (var response = (await _httpClient.Post(options).ConfigureAwait(false))) { - reg = _jsonSerializer.DeserializeFromStream<RegRecord>(json); - success = true; + using (var json = response.Content) + { + reg = _jsonSerializer.DeserializeFromStream<RegRecord>(json); + success = true; + } } if (reg.registered) diff --git a/Emby.Server.Implementations/Session/HttpSessionController.cs b/Emby.Server.Implementations/Session/HttpSessionController.cs index bd53da1bd..940c821e2 100644 --- a/Emby.Server.Implementations/Session/HttpSessionController.cs +++ b/Emby.Server.Implementations/Session/HttpSessionController.cs @@ -66,19 +66,22 @@ namespace Emby.Server.Implementations.Session return SendMessage(name, new Dictionary<string, string>(), cancellationToken); } - private Task SendMessage(string name, + private async Task SendMessage(string name, Dictionary<string, string> args, CancellationToken cancellationToken) { var url = PostUrl + "/" + name + ToQueryString(args); - return _httpClient.Post(new HttpRequestOptions + using ((await _httpClient.Post(new HttpRequestOptions { Url = url, CancellationToken = cancellationToken, BufferContent = false - }); + }).ConfigureAwait(false))) + { + + } } public Task SendSessionEndedNotification(SessionInfoDto sessionInfo, CancellationToken cancellationToken) diff --git a/Emby.Server.Implementations/Session/SessionManager.cs b/Emby.Server.Implementations/Session/SessionManager.cs index 97506cdef..2c1535165 100644 --- a/Emby.Server.Implementations/Session/SessionManager.cs +++ b/Emby.Server.Implementations/Session/SessionManager.cs @@ -437,7 +437,7 @@ namespace Emby.Server.Implementations.Session if (!string.IsNullOrEmpty(deviceId)) { var userIdString = userId.HasValue ? userId.Value.ToString("N") : null; - device = await _deviceManager.RegisterDevice(deviceId, deviceName, appName, appVersion, userIdString).ConfigureAwait(false); + device = _deviceManager.RegisterDevice(deviceId, deviceName, appName, appVersion, userIdString); } } @@ -446,7 +446,7 @@ namespace Emby.Server.Implementations.Session if (device == null) { var userIdString = userId.HasValue ? userId.Value.ToString("N") : null; - device = await _deviceManager.RegisterDevice(deviceId, deviceName, appName, appVersion, userIdString).ConfigureAwait(false); + device = _deviceManager.RegisterDevice(deviceId, deviceName, appName, appVersion, userIdString); } if (device != null) @@ -1567,7 +1567,7 @@ namespace Emby.Server.Implementations.Session ReportCapabilities(session, capabilities, true); } - private async void ReportCapabilities(SessionInfo session, + private void ReportCapabilities(SessionInfo session, ClientCapabilities capabilities, bool saveCapabilities) { @@ -1593,7 +1593,7 @@ namespace Emby.Server.Implementations.Session { try { - await SaveCapabilities(session.DeviceId, capabilities).ConfigureAwait(false); + SaveCapabilities(session.DeviceId, capabilities); } catch (Exception ex) { @@ -1607,9 +1607,9 @@ namespace Emby.Server.Implementations.Session return _deviceManager.GetCapabilities(deviceId); } - private Task SaveCapabilities(string deviceId, ClientCapabilities capabilities) + private void SaveCapabilities(string deviceId, ClientCapabilities capabilities) { - return _deviceManager.SaveCapabilities(deviceId, capabilities); + _deviceManager.SaveCapabilities(deviceId, capabilities); } public SessionInfoDto GetSessionInfoDto(SessionInfo session) diff --git a/Emby.Server.Implementations/Social/SharingRepository.cs b/Emby.Server.Implementations/Social/SharingRepository.cs index f0b8cbd30..3c9e1024f 100644 --- a/Emby.Server.Implementations/Social/SharingRepository.cs +++ b/Emby.Server.Implementations/Social/SharingRepository.cs @@ -50,7 +50,7 @@ namespace Emby.Server.Implementations.Social string[] queries = { - "create table if not exists Shares (Id GUID, ItemId TEXT, UserId TEXT, ExpirationDate DateTime, PRIMARY KEY (Id))", + "create table if not exists Shares (Id GUID NOT NULL, ItemId TEXT NOT NULL, UserId TEXT NOT NULL, ExpirationDate DateTime NOT NULL, PRIMARY KEY (Id))", "create index if not exists idx_Shares on Shares(Id)", "pragma shrink_memory" diff --git a/Emby.Server.Implementations/TV/TVSeriesManager.cs b/Emby.Server.Implementations/TV/TVSeriesManager.cs index ec2d8c4fc..d92245a67 100644 --- a/Emby.Server.Implementations/TV/TVSeriesManager.cs +++ b/Emby.Server.Implementations/TV/TVSeriesManager.cs @@ -36,8 +36,6 @@ namespace Emby.Server.Implementations.TV throw new ArgumentException("User not found"); } - var parentIdGuid = string.IsNullOrWhiteSpace(request.ParentId) ? (Guid?)null : new Guid(request.ParentId); - string presentationUniqueKey = null; int? limit = null; if (!string.IsNullOrWhiteSpace(request.SeriesId)) @@ -56,10 +54,26 @@ namespace Emby.Server.Implementations.TV return GetResult(GetNextUpEpisodes(request, user, new[] { presentationUniqueKey }, dtoOptions), request); } - var parents = user.RootFolder.GetChildren(user, true) - .Where(i => i is Folder) - .Where(i => !user.Configuration.LatestItemsExcludes.Contains(i.Id.ToString("N"))) - .ToList(); + var parentIdGuid = string.IsNullOrWhiteSpace(request.ParentId) ? (Guid?)null : new Guid(request.ParentId); + + List<BaseItem> parents; + + if (parentIdGuid.HasValue) + { + var parent = _libraryManager.GetItemById(parentIdGuid.Value); + parents = new List<BaseItem>(); + if (parent != null) + { + parents.Add(parent); + } + } + else + { + parents = user.RootFolder.GetChildren(user, true) + .Where(i => i is Folder) + .Where(i => !user.Configuration.LatestItemsExcludes.Contains(i.Id.ToString("N"))) + .ToList(); + } return GetNextUp(request, parents, dtoOptions); } @@ -88,7 +102,7 @@ namespace Emby.Server.Implementations.TV if (!string.IsNullOrWhiteSpace(presentationUniqueKey)) { - return GetResult(GetNextUpEpisodes(request, user, new [] { presentationUniqueKey }, dtoOptions), request); + return GetResult(GetNextUpEpisodes(request, user, new[] { presentationUniqueKey }, dtoOptions), request); } if (limit.HasValue) diff --git a/Emby.Server.Implementations/Updates/InstallationManager.cs b/Emby.Server.Implementations/Updates/InstallationManager.cs index 180463040..51acfee88 100644 --- a/Emby.Server.Implementations/Updates/InstallationManager.cs +++ b/Emby.Server.Implementations/Updates/InstallationManager.cs @@ -175,13 +175,24 @@ namespace Emby.Server.Implementations.Updates { "systemid", _applicationHost.SystemId } }; - using (var json = await _httpClient.Post("https://www.mb3admin.com/admin/service/package/retrieveall?includeAllRuntimes=true", data, cancellationToken).ConfigureAwait(false)) + var options = new HttpRequestOptions { - cancellationToken.ThrowIfCancellationRequested(); + Url = "https://www.mb3admin.com/admin/service/package/retrieveall?includeAllRuntimes=true", + CancellationToken = cancellationToken + }; + + options.SetPostData(data); + + using (var response = await _httpClient.SendAsync(options, "POST").ConfigureAwait(false)) + { + using (var json = response.Content) + { + cancellationToken.ThrowIfCancellationRequested(); - var packages = _jsonSerializer.DeserializeFromStream<PackageInfo[]>(json); + var packages = _jsonSerializer.DeserializeFromStream<PackageInfo[]>(json); - return FilterPackages(packages, packageType, applicationVersion); + return FilterPackages(packages, packageType, applicationVersion); + } } } else @@ -442,11 +453,6 @@ namespace Emby.Server.Implementations.Updates /// <returns>Task{IEnumerable{PackageVersionInfo}}.</returns> public async Task<IEnumerable<PackageVersionInfo>> GetAvailablePluginUpdates(Version applicationVersion, bool withAutoUpdateEnabled, CancellationToken cancellationToken) { - if (!_config.CommonConfiguration.EnableAutoUpdate) - { - return new PackageVersionInfo[] { }; - } - var catalog = await GetAvailablePackagesWithoutRegistrationInfo(cancellationToken).ConfigureAwait(false); var systemUpdateLevel = GetSystemUpdateLevel(); diff --git a/Emby.Server.Implementations/UserViews/CollectionFolderImageProvider.cs b/Emby.Server.Implementations/UserViews/CollectionFolderImageProvider.cs index fa1d5b74e..f051e856a 100644 --- a/Emby.Server.Implementations/UserViews/CollectionFolderImageProvider.cs +++ b/Emby.Server.Implementations/UserViews/CollectionFolderImageProvider.cs @@ -28,14 +28,6 @@ namespace Emby.Server.Implementations.UserViews { } - public override IEnumerable<ImageType> GetSupportedImages(IHasMetadata item) - { - return new List<ImageType> - { - ImageType.Primary - }; - } - protected override List<BaseItem> GetItemsWithImages(IHasMetadata item) { var view = (CollectionFolder)item; @@ -126,14 +118,6 @@ namespace Emby.Server.Implementations.UserViews _libraryManager = libraryManager; } - public override IEnumerable<ImageType> GetSupportedImages(IHasMetadata item) - { - return new List<ImageType> - { - ImageType.Primary - }; - } - protected override List<BaseItem> GetItemsWithImages(IHasMetadata item) { var view = (ManualCollectionsFolder)item; diff --git a/Emby.Server.Implementations/UserViews/DynamicImageProvider.cs b/Emby.Server.Implementations/UserViews/DynamicImageProvider.cs index 885dfec58..23b8c9b9e 100644 --- a/Emby.Server.Implementations/UserViews/DynamicImageProvider.cs +++ b/Emby.Server.Implementations/UserViews/DynamicImageProvider.cs @@ -31,23 +31,6 @@ namespace Emby.Server.Implementations.UserViews _libraryManager = libraryManager; } - public override IEnumerable<ImageType> GetSupportedImages(IHasMetadata item) - { - var view = (UserView)item; - if (IsUsingCollectionStrip(view)) - { - return new List<ImageType> - { - ImageType.Primary - }; - } - - return new List<ImageType> - { - ImageType.Primary - }; - } - protected override List<BaseItem> GetItemsWithImages(IHasMetadata item) { var view = (UserView)item; diff --git a/Emby.Server.Implementations/UserViews/FolderImageProvider.cs b/Emby.Server.Implementations/UserViews/FolderImageProvider.cs new file mode 100644 index 000000000..80a74e877 --- /dev/null +++ b/Emby.Server.Implementations/UserViews/FolderImageProvider.cs @@ -0,0 +1,100 @@ +using MediaBrowser.Common.Configuration; +using MediaBrowser.Controller.Drawing; +using MediaBrowser.Controller.Entities; +using MediaBrowser.Controller.Providers; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Emby.Server.Implementations.Images; +using MediaBrowser.Model.IO; +using MediaBrowser.Model.Entities; +using MediaBrowser.Controller.Entities.Audio; +using MediaBrowser.Model.Dto; +using MediaBrowser.Model.Querying; +using MediaBrowser.Controller.Library; +using MediaBrowser.Controller.Dto; + +namespace Emby.Server.Implementations.Photos +{ + public abstract class BaseFolderImageProvider<T> : BaseDynamicImageProvider<T> + where T : Folder, new () + { + protected ILibraryManager _libraryManager; + + public BaseFolderImageProvider(IFileSystem fileSystem, IProviderManager providerManager, IApplicationPaths applicationPaths, IImageProcessor imageProcessor, ILibraryManager libraryManager) + : base(fileSystem, providerManager, applicationPaths, imageProcessor) + { + _libraryManager = libraryManager; + } + + protected override List<BaseItem> GetItemsWithImages(IHasMetadata item) + { + return _libraryManager.GetItemList(new InternalItemsQuery + { + Parent = item as BaseItem, + GroupByPresentationUniqueKey = false, + DtoOptions = new DtoOptions(true), + ImageTypes = new ImageType[] { ImageType.Primary } + }); + } + + protected override string CreateImage(IHasMetadata item, List<BaseItem> itemsWithImages, string outputPathWithoutExtension, ImageType imageType, int imageIndex) + { + return CreateSingleImage(itemsWithImages, outputPathWithoutExtension, ImageType.Primary); + } + + protected override bool Supports(IHasMetadata item) + { + if (item is PhotoAlbum || item is MusicAlbum) + { + return true; + } + + if (item.GetType() == typeof(Folder)) + { + var folder = item as Folder; + if (folder.IsTopParent) + { + return false; + } + return true; + } + + return false; + } + + protected override bool HasChangedByDate(IHasMetadata item, ItemImageInfo image) + { + if (item is MusicAlbum) + { + return false; + } + + return base.HasChangedByDate(item, image); + } + } + + public class FolderImageProvider : BaseFolderImageProvider<Folder> + { + public FolderImageProvider(IFileSystem fileSystem, IProviderManager providerManager, IApplicationPaths applicationPaths, IImageProcessor imageProcessor, ILibraryManager libraryManager) + : base(fileSystem, providerManager, applicationPaths, imageProcessor, libraryManager) + { + } + } + + public class MusicAlbumImageProvider : BaseFolderImageProvider<MusicAlbum> + { + public MusicAlbumImageProvider(IFileSystem fileSystem, IProviderManager providerManager, IApplicationPaths applicationPaths, IImageProcessor imageProcessor, ILibraryManager libraryManager) + : base(fileSystem, providerManager, applicationPaths, imageProcessor, libraryManager) + { + } + } + + public class PhotoAlbumImageProvider : BaseFolderImageProvider<PhotoAlbum> + { + public PhotoAlbumImageProvider(IFileSystem fileSystem, IProviderManager providerManager, IApplicationPaths applicationPaths, IImageProcessor imageProcessor, ILibraryManager libraryManager) + : base(fileSystem, providerManager, applicationPaths, imageProcessor, libraryManager) + { + } + } +} diff --git a/MediaBrowser.Api/ChannelService.cs b/MediaBrowser.Api/ChannelService.cs index d64bf7ec7..2e8eb9e07 100644 --- a/MediaBrowser.Api/ChannelService.cs +++ b/MediaBrowser.Api/ChannelService.cs @@ -101,7 +101,7 @@ namespace MediaBrowser.Api [ApiMember(Name = "Fields", Description = "Optional. Specify additional fields of information to return in the output. This allows multiple, comma delimeted. Options: Budget, Chapters, DateCreated, Genres, HomePageUrl, IndexOptions, MediaStreams, Overview, ParentId, Path, People, ProviderIds, PrimaryImageAspectRatio, Revenue, SortName, Studios, Taglines", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET", AllowMultiple = true)] public string Fields { get; set; } - + /// <summary> /// Gets the filters. /// </summary> @@ -160,7 +160,7 @@ namespace MediaBrowser.Api [ApiMember(Name = "ChannelIds", Description = "Optional. Specify one or more channel id's, comma delimeted.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET", AllowMultiple = true)] public string ChannelIds { get; set; } - + /// <summary> /// Gets the filters. /// </summary> @@ -177,7 +177,7 @@ namespace MediaBrowser.Api return val.Split(',').Select(v => (ItemFilter)Enum.Parse(typeof(ItemFilter), v, true)); } } - + [Route("/Channels/Folder", "GET", Summary = "Gets the users channel folder, along with configured images")] public class GetChannelFolder : IReturn<BaseItemDto> { @@ -209,9 +209,9 @@ namespace MediaBrowser.Api return ToOptimizedResult(result); } - public async Task<object> Get(GetChannelFolder request) + public object Get(GetChannelFolder request) { - return ToOptimizedResult(await _channelManager.GetChannelFolder(request.UserId, CancellationToken.None).ConfigureAwait(false)); + return ToOptimizedResult(_channelManager.GetChannelFolder(request.UserId, CancellationToken.None)); } public async Task<object> Get(GetChannels request) diff --git a/MediaBrowser.Api/Devices/DeviceService.cs b/MediaBrowser.Api/Devices/DeviceService.cs index 012f0ddb2..c375e272a 100644 --- a/MediaBrowser.Api/Devices/DeviceService.cs +++ b/MediaBrowser.Api/Devices/DeviceService.cs @@ -85,13 +85,11 @@ namespace MediaBrowser.Api.Devices public void Post(PostDeviceOptions request) { - var task = _deviceManager.UpdateDeviceInfo(request.Id, new DeviceOptions + _deviceManager.UpdateDeviceInfo(request.Id, new DeviceOptions { CustomName = request.CustomName, CameraUploadPath = request.CameraUploadPath }); - - Task.WaitAll(task); } public object Get(GetDeviceInfo request) @@ -116,9 +114,7 @@ namespace MediaBrowser.Api.Devices public void Delete(DeleteDevice request) { - var task = _deviceManager.DeleteDevice(request.Id); - - Task.WaitAll(task); + _deviceManager.DeleteDevice(request.Id); } public void Post(PostCameraUpload request) diff --git a/MediaBrowser.Api/Dlna/DlnaServerService.cs b/MediaBrowser.Api/Dlna/DlnaServerService.cs index cbef6e5b3..6a0cea4df 100644 --- a/MediaBrowser.Api/Dlna/DlnaServerService.cs +++ b/MediaBrowser.Api/Dlna/DlnaServerService.cs @@ -246,7 +246,7 @@ namespace MediaBrowser.Api.Dlna if (string.IsNullOrEmpty(notificationType)) { - return GetSubscriptionResponse(eventManager.RenewEventSubscription(subscriptionId, timeoutString)); + return GetSubscriptionResponse(eventManager.RenewEventSubscription(subscriptionId, notificationType, timeoutString, callback)); } return GetSubscriptionResponse(eventManager.CreateEventSubscription(notificationType, timeoutString, callback)); diff --git a/MediaBrowser.Api/Images/ImageService.cs b/MediaBrowser.Api/Images/ImageService.cs index f8481517d..2b8ac1a66 100644 --- a/MediaBrowser.Api/Images/ImageService.cs +++ b/MediaBrowser.Api/Images/ImageService.cs @@ -315,7 +315,7 @@ namespace MediaBrowser.Api.Images return list; } - private ImageInfo GetImageInfo(IHasMetadata item, ItemImageInfo info, int? imageIndex) + private ImageInfo GetImageInfo(BaseItem item, ItemImageInfo info, int? imageIndex) { try { @@ -330,11 +330,17 @@ namespace MediaBrowser.Api.Images var fileInfo = _fileSystem.GetFileInfo(info.Path); length = fileInfo.Length; - var size = _imageProcessor.GetImageSize(info, true); + var size = _imageProcessor.GetImageSize(item, info, true, true); width = Convert.ToInt32(size.Width); height = Convert.ToInt32(size.Height); + if (width <= 0 || height <= 0) + { + width = null; + height = null; + } + } } catch @@ -471,9 +477,7 @@ namespace MediaBrowser.Api.Images var item = _userManager.GetUserById(userId); - var task = item.DeleteImage(request.Type, request.Index ?? 0); - - Task.WaitAll(task); + item.DeleteImage(request.Type, request.Index ?? 0); } /// <summary> @@ -484,9 +488,7 @@ namespace MediaBrowser.Api.Images { var item = _libraryManager.GetItemById(request.Id); - var task = item.DeleteImage(request.Type, request.Index ?? 0); - - Task.WaitAll(task); + item.DeleteImage(request.Type, request.Index ?? 0); } /// <summary> @@ -497,9 +499,7 @@ namespace MediaBrowser.Api.Images { var item = _libraryManager.GetItemById(request.Id); - var task = UpdateItemIndex(item, request.Type, request.Index, request.NewIndex); - - Task.WaitAll(task); + UpdateItemIndex(item, request.Type, request.Index, request.NewIndex); } /// <summary> @@ -510,9 +510,9 @@ namespace MediaBrowser.Api.Images /// <param name="currentIndex">Index of the current.</param> /// <param name="newIndex">The new index.</param> /// <returns>Task.</returns> - private Task UpdateItemIndex(IHasMetadata item, ImageType type, int currentIndex, int newIndex) + private void UpdateItemIndex(IHasMetadata item, ImageType type, int currentIndex, int newIndex) { - return item.SwapImages(type, currentIndex, newIndex); + item.SwapImages(type, currentIndex, newIndex); } /// <summary> @@ -558,7 +558,7 @@ namespace MediaBrowser.Api.Images var supportedImageEnhancers = request.EnableImageEnhancers ? _imageProcessor.GetSupportedEnhancers(item, request.Type) : new List<IImageEnhancer>(); - var cropwhitespace = request.Type == ImageType.Logo || + var cropwhitespace = request.Type == ImageType.Logo || request.Type == ImageType.Art || (request.Type == ImageType.Primary && item is LiveTvChannel); @@ -733,7 +733,7 @@ namespace MediaBrowser.Api.Images await _providerManager.SaveImage(entity, memoryStream, mimeType, imageType, null, CancellationToken.None).ConfigureAwait(false); - await entity.UpdateToRepository(ItemUpdateType.ImageUpdate, CancellationToken.None).ConfigureAwait(false); + entity.UpdateToRepository(ItemUpdateType.ImageUpdate, CancellationToken.None); } } } diff --git a/MediaBrowser.Api/Images/RemoteImageService.cs b/MediaBrowser.Api/Images/RemoteImageService.cs index 3512a526b..4782d76df 100644 --- a/MediaBrowser.Api/Images/RemoteImageService.cs +++ b/MediaBrowser.Api/Images/RemoteImageService.cs @@ -84,7 +84,7 @@ namespace MediaBrowser.Api.Images } [Route("/Items/{Id}/RemoteImages/Download", "POST", Summary = "Downloads a remote image for an item")] - [Authenticated(Roles="Admin")] + [Authenticated(Roles = "Admin")] public class DownloadRemoteImage : BaseDownloadRemoteImage { /// <summary> @@ -207,7 +207,7 @@ namespace MediaBrowser.Api.Images { await _providerManager.SaveImage(item, request.ImageUrl, request.Type, null, CancellationToken.None).ConfigureAwait(false); - await item.UpdateToRepository(ItemUpdateType.ImageUpdate, CancellationToken.None).ConfigureAwait(false); + item.UpdateToRepository(ItemUpdateType.ImageUpdate, CancellationToken.None); } /// <summary> @@ -232,9 +232,9 @@ namespace MediaBrowser.Api.Images contentPath = _fileSystem.ReadAllText(pointerCachePath); if (_fileSystem.FileExists(contentPath)) - { - return await ResultFactory.GetStaticFileResult(Request, contentPath).ConfigureAwait(false); - } + { + return await ResultFactory.GetStaticFileResult(Request, contentPath).ConfigureAwait(false); + } } catch (FileNotFoundException) { @@ -262,28 +262,29 @@ namespace MediaBrowser.Api.Images /// <returns>Task.</returns> private async Task DownloadImage(string url, Guid urlHash, string pointerCachePath) { - var result = await _httpClient.GetResponse(new HttpRequestOptions + using (var result = await _httpClient.GetResponse(new HttpRequestOptions { Url = url, BufferContent = false - }).ConfigureAwait(false); - - var ext = result.ContentType.Split('/').Last(); + }).ConfigureAwait(false)) + { + var ext = result.ContentType.Split('/').Last(); - var fullCachePath = GetFullCachePath(urlHash + "." + ext); + var fullCachePath = GetFullCachePath(urlHash + "." + ext); - _fileSystem.CreateDirectory(_fileSystem.GetDirectoryName(fullCachePath)); - using (var stream = result.Content) - { - using (var filestream = _fileSystem.GetFileStream(fullCachePath, FileOpenMode.Create, FileAccessMode.Write, FileShareMode.Read, true)) + _fileSystem.CreateDirectory(_fileSystem.GetDirectoryName(fullCachePath)); + using (var stream = result.Content) { - await stream.CopyToAsync(filestream).ConfigureAwait(false); + using (var filestream = _fileSystem.GetFileStream(fullCachePath, FileOpenMode.Create, FileAccessMode.Write, FileShareMode.Read, true)) + { + await stream.CopyToAsync(filestream).ConfigureAwait(false); + } } - } - _fileSystem.CreateDirectory(_fileSystem.GetDirectoryName(pointerCachePath)); - _fileSystem.WriteAllText(pointerCachePath, fullCachePath); + _fileSystem.CreateDirectory(_fileSystem.GetDirectoryName(pointerCachePath)); + _fileSystem.WriteAllText(pointerCachePath, fullCachePath); + } } /// <summary> diff --git a/MediaBrowser.Api/ItemUpdateService.cs b/MediaBrowser.Api/ItemUpdateService.cs index 53a67ff71..a55741d7d 100644 --- a/MediaBrowser.Api/ItemUpdateService.cs +++ b/MediaBrowser.Api/ItemUpdateService.cs @@ -124,24 +124,24 @@ namespace MediaBrowser.Api { list.Add(new NameValuePair { - Name = "FolderTypeInherit", + Name = "Inherit", Value = "" }); } list.Add(new NameValuePair { - Name = "FolderTypeMovies", + Name = "Movies", Value = "movies" }); list.Add(new NameValuePair { - Name = "FolderTypeMusic", + Name = "Music", Value = "music" }); list.Add(new NameValuePair { - Name = "FolderTypeTvShows", + Name = "Shows", Value = "tvshows" }); @@ -149,29 +149,29 @@ namespace MediaBrowser.Api { list.Add(new NameValuePair { - Name = "FolderTypeBooks", + Name = "Books", Value = "books" }); list.Add(new NameValuePair { - Name = "FolderTypeGames", + Name = "Games", Value = "games" }); } list.Add(new NameValuePair { - Name = "FolderTypeHomeVideos", + Name = "HomeVideos", Value = "homevideos" }); list.Add(new NameValuePair { - Name = "FolderTypeMusicVideos", + Name = "MusicVideos", Value = "musicvideos" }); list.Add(new NameValuePair { - Name = "FolderTypePhotos", + Name = "Photos", Value = "photos" }); @@ -179,7 +179,7 @@ namespace MediaBrowser.Api { list.Add(new NameValuePair { - Name = "FolderTypeMixed", + Name = "MixedContent", Value = "" }); } @@ -194,13 +194,6 @@ namespace MediaBrowser.Api public void Post(UpdateItem request) { - var task = UpdateItem(request); - - Task.WaitAll(task); - } - - private async Task UpdateItem(UpdateItem request) - { var item = _libraryManager.GetItemById(request.ItemId); var newLockData = request.LockData ?? false; @@ -216,7 +209,7 @@ namespace MediaBrowser.Api item.OnMetadataChanged(); - await item.UpdateToRepository(ItemUpdateType.MetadataEdit, CancellationToken.None).ConfigureAwait(false); + item.UpdateToRepository(ItemUpdateType.MetadataEdit, CancellationToken.None); if (isLockedChanged && item.IsFolder) { @@ -225,7 +218,7 @@ namespace MediaBrowser.Api foreach (var child in folder.GetRecursiveChildren()) { child.IsLocked = newLockData; - await child.UpdateToRepository(ItemUpdateType.MetadataEdit, CancellationToken.None).ConfigureAwait(false); + child.UpdateToRepository(ItemUpdateType.MetadataEdit, CancellationToken.None); } } } diff --git a/MediaBrowser.Api/LiveTv/LiveTvService.cs b/MediaBrowser.Api/LiveTv/LiveTvService.cs index 36bcee913..703c96e0c 100644 --- a/MediaBrowser.Api/LiveTv/LiveTvService.cs +++ b/MediaBrowser.Api/LiveTv/LiveTvService.cs @@ -734,7 +734,7 @@ namespace MediaBrowser.Api.LiveTv outputHeaders["Content-Type"] = Model.Net.MimeTypes.GetMimeType(path); - return new ProgressiveFileCopier(_fileSystem, path, outputHeaders, Logger, _environment, CancellationToken.None) + return new ProgressiveFileCopier(_fileSystem, path, outputHeaders, Logger, _environment) { AllowEndOfFile = false }; @@ -753,7 +753,7 @@ namespace MediaBrowser.Api.LiveTv outputHeaders["Content-Type"] = Model.Net.MimeTypes.GetMimeType("file." + request.Container); - return new ProgressiveFileCopier(directStreamProvider, outputHeaders, Logger, _environment, CancellationToken.None) + return new ProgressiveFileCopier(directStreamProvider, outputHeaders, Logger, _environment) { AllowEndOfFile = false }; @@ -892,11 +892,11 @@ namespace MediaBrowser.Api.LiveTv return ToOptimizedSerializedResultUsingCache(info); } - public async Task<object> Get(GetChannels request) + public object Get(GetChannels request) { var options = GetDtoOptions(_authContext, request); - var channelResult = await _liveTvManager.GetInternalChannels(new LiveTvChannelQuery + var channelResult = _liveTvManager.GetInternalChannels(new LiveTvChannelQuery { ChannelType = request.Type, UserId = request.UserId, @@ -915,7 +915,7 @@ namespace MediaBrowser.Api.LiveTv SortOrder = request.SortOrder ?? SortOrder.Ascending, AddCurrentProgram = request.AddCurrentProgram - }, options, CancellationToken.None).ConfigureAwait(false); + }, options, CancellationToken.None); var user = string.IsNullOrEmpty(request.UserId) ? null : _userManager.GetUserById(request.UserId); @@ -947,9 +947,9 @@ namespace MediaBrowser.Api.LiveTv public object Get(GetChannel request) { - var user = string.IsNullOrWhiteSpace(request.UserId) ? null : _userManager.GetUserById(request.UserId); + var user = _userManager.GetUserById(request.UserId); - var item = _libraryManager.GetItemById(request.Id); + var item = string.IsNullOrEmpty(request.Id) ? user.RootFolder : _libraryManager.GetItemById(request.Id); var dtoOptions = GetDtoOptions(_authContext, request); @@ -958,9 +958,9 @@ namespace MediaBrowser.Api.LiveTv return ToOptimizedSerializedResultUsingCache(result); } - public async Task<object> Get(GetLiveTvFolder request) + public object Get(GetLiveTvFolder request) { - return ToOptimizedResult(await _liveTvManager.GetLiveTvFolder(request.UserId, CancellationToken.None).ConfigureAwait(false)); + return ToOptimizedResult(_liveTvManager.GetLiveTvFolder(request.UserId, CancellationToken.None)); } public async Task<object> Get(GetPrograms request) @@ -1020,7 +1020,7 @@ namespace MediaBrowser.Api.LiveTv return ToOptimizedResult(result); } - public async Task<object> Get(GetRecommendedPrograms request) + public object Get(GetRecommendedPrograms request) { var query = new RecommendedProgramQuery { @@ -1036,7 +1036,7 @@ namespace MediaBrowser.Api.LiveTv EnableTotalRecordCount = request.EnableTotalRecordCount }; - var result = await _liveTvManager.GetRecommendedPrograms(query, GetDtoOptions(_authContext, request), CancellationToken.None).ConfigureAwait(false); + var result = _liveTvManager.GetRecommendedPrograms(query, GetDtoOptions(_authContext, request), CancellationToken.None); return ToOptimizedResult(result); } @@ -1098,12 +1098,13 @@ namespace MediaBrowser.Api.LiveTv public async Task<object> Get(GetRecording request) { - var user = string.IsNullOrEmpty(request.UserId) ? null : _userManager.GetUserById(request.UserId); + var user = _userManager.GetUserById(request.UserId); - var options = new DtoOptions(); - options.DeviceId = _authContext.GetAuthorizationInfo(Request).DeviceId; + var item = string.IsNullOrEmpty(request.Id) ? user.RootFolder : _libraryManager.GetItemById(request.Id); - var result = await _liveTvManager.GetRecording(request.Id, options, CancellationToken.None, user).ConfigureAwait(false); + var dtoOptions = GetDtoOptions(_authContext, request); + + var result = _dtoService.GetBaseItemDto(item, dtoOptions, user); return ToOptimizedSerializedResultUsingCache(result); } diff --git a/MediaBrowser.Api/LiveTv/ProgressiveFileCopier.cs b/MediaBrowser.Api/LiveTv/ProgressiveFileCopier.cs index 9ce109fc4..74293ccd9 100644 --- a/MediaBrowser.Api/LiveTv/ProgressiveFileCopier.cs +++ b/MediaBrowser.Api/LiveTv/ProgressiveFileCopier.cs @@ -16,7 +16,6 @@ namespace MediaBrowser.Api.LiveTv private readonly IFileSystem _fileSystem; private readonly ILogger _logger; private readonly string _path; - private readonly CancellationToken _cancellationToken; private readonly Dictionary<string, string> _outputHeaders; const int StreamCopyToBufferSize = 81920; @@ -28,22 +27,20 @@ namespace MediaBrowser.Api.LiveTv private readonly IDirectStreamProvider _directStreamProvider; private readonly IEnvironmentInfo _environment; - public ProgressiveFileCopier(IFileSystem fileSystem, string path, Dictionary<string, string> outputHeaders, ILogger logger, IEnvironmentInfo environment, CancellationToken cancellationToken) + public ProgressiveFileCopier(IFileSystem fileSystem, string path, Dictionary<string, string> outputHeaders, ILogger logger, IEnvironmentInfo environment) { _fileSystem = fileSystem; _path = path; _outputHeaders = outputHeaders; _logger = logger; - _cancellationToken = cancellationToken; _environment = environment; } - public ProgressiveFileCopier(IDirectStreamProvider directStreamProvider, Dictionary<string, string> outputHeaders, ILogger logger, IEnvironmentInfo environment, CancellationToken cancellationToken) + public ProgressiveFileCopier(IDirectStreamProvider directStreamProvider, Dictionary<string, string> outputHeaders, ILogger logger, IEnvironmentInfo environment) { _directStreamProvider = directStreamProvider; _outputHeaders = outputHeaders; _logger = logger; - _cancellationToken = cancellationToken; _environment = environment; } @@ -69,8 +66,6 @@ namespace MediaBrowser.Api.LiveTv public async Task WriteToAsync(Stream outputStream, CancellationToken cancellationToken) { - cancellationToken = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken, _cancellationToken).Token; - if (_directStreamProvider != null) { await _directStreamProvider.CopyToAsync(outputStream, cancellationToken).ConfigureAwait(false); @@ -89,7 +84,9 @@ namespace MediaBrowser.Api.LiveTv inputStream.Position = StartPosition; } - while (eofCount < 20 || !AllowEndOfFile) + var emptyReadLimit = AllowEndOfFile ? 20 : 100; + + while (eofCount < emptyReadLimit) { int bytesRead; if (allowAsyncFileRead) diff --git a/MediaBrowser.Api/MediaBrowser.Api.csproj b/MediaBrowser.Api/MediaBrowser.Api.csproj index ddb187f3d..650306ea6 100644 --- a/MediaBrowser.Api/MediaBrowser.Api.csproj +++ b/MediaBrowser.Api/MediaBrowser.Api.csproj @@ -40,7 +40,6 @@ <Compile Include="..\SharedVersion.cs"> <Link>Properties\SharedVersion.cs</Link> </Compile> - <Compile Include="BasePeriodicWebSocketListener.cs" /> <Compile Include="BrandingService.cs" /> <Compile Include="ChannelService.cs" /> <Compile Include="Devices\DeviceService.cs" /> diff --git a/MediaBrowser.Api/ScheduledTasks/ScheduledTasksWebSocketListener.cs b/MediaBrowser.Api/ScheduledTasks/ScheduledTasksWebSocketListener.cs index ee74ec450..69ce6a385 100644 --- a/MediaBrowser.Api/ScheduledTasks/ScheduledTasksWebSocketListener.cs +++ b/MediaBrowser.Api/ScheduledTasks/ScheduledTasksWebSocketListener.cs @@ -4,6 +4,7 @@ using MediaBrowser.Model.Tasks; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; +using MediaBrowser.Controller.Net; using MediaBrowser.Model.Threading; namespace MediaBrowser.Api.ScheduledTasks diff --git a/MediaBrowser.Api/Session/SessionsService.cs b/MediaBrowser.Api/Session/SessionsService.cs index 8f54b591e..e961f9d51 100644 --- a/MediaBrowser.Api/Session/SessionsService.cs +++ b/MediaBrowser.Api/Session/SessionsService.cs @@ -10,6 +10,7 @@ using System.Linq; using System.Threading; using System.Threading.Tasks; using MediaBrowser.Model.Services; +using MediaBrowser.Controller; namespace MediaBrowser.Api.Session { @@ -293,15 +294,9 @@ namespace MediaBrowser.Api.Session private readonly IAuthenticationRepository _authRepo; private readonly IDeviceManager _deviceManager; private readonly ISessionContext _sessionContext; + private IServerApplicationHost _appHost; - /// <summary> - /// Initializes a new instance of the <see cref="SessionsService" /> class. - /// </summary> - /// <param name="sessionManager">The session manager.</param> - /// <param name="userManager">The user manager.</param> - /// <param name="authContext">The authentication context.</param> - /// <param name="authRepo">The authentication repo.</param> - public SessionsService(ISessionManager sessionManager, IUserManager userManager, IAuthorizationContext authContext, IAuthenticationRepository authRepo, IDeviceManager deviceManager, ISessionContext sessionContext) + public SessionsService(ISessionManager sessionManager, IServerApplicationHost appHost, IUserManager userManager, IAuthorizationContext authContext, IAuthenticationRepository authRepo, IDeviceManager deviceManager, ISessionContext sessionContext) { _sessionManager = sessionManager; _userManager = userManager; @@ -309,6 +304,7 @@ namespace MediaBrowser.Api.Session _authRepo = authRepo; _deviceManager = deviceManager; _sessionContext = sessionContext; + _appHost = appHost; } public void Delete(RevokeKey request) @@ -324,7 +320,10 @@ namespace MediaBrowser.Api.Session AppName = request.App, IsActive = true, AccessToken = Guid.NewGuid().ToString("N"), - DateCreated = DateTime.UtcNow + DateCreated = DateTime.UtcNow, + DeviceId = _appHost.SystemId, + DeviceName = _appHost.FriendlyName, + AppVersion = _appHost.ApplicationVersion.ToString() }, CancellationToken.None); } diff --git a/MediaBrowser.Api/StartupWizardService.cs b/MediaBrowser.Api/StartupWizardService.cs index 22f1f3b62..52a5e444f 100644 --- a/MediaBrowser.Api/StartupWizardService.cs +++ b/MediaBrowser.Api/StartupWizardService.cs @@ -95,6 +95,7 @@ namespace MediaBrowser.Api config.EnableSimpleArtistDetection = true; config.EnableNormalizedItemByNameIds = true; config.DisableLiveTvChannelUserDataName = true; + config.EnableNewOmdbSupport = true; } public void Post(UpdateStartupConfiguration request) diff --git a/MediaBrowser.Api/System/ActivityLogWebSocketListener.cs b/MediaBrowser.Api/System/ActivityLogWebSocketListener.cs index c641695dd..793f74571 100644 --- a/MediaBrowser.Api/System/ActivityLogWebSocketListener.cs +++ b/MediaBrowser.Api/System/ActivityLogWebSocketListener.cs @@ -3,6 +3,7 @@ using MediaBrowser.Model.Events; using MediaBrowser.Model.Logging; using System.Collections.Generic; using System.Threading.Tasks; +using MediaBrowser.Controller.Net; using MediaBrowser.Model.Threading; namespace MediaBrowser.Api.System diff --git a/MediaBrowser.Api/UserLibrary/ItemsService.cs b/MediaBrowser.Api/UserLibrary/ItemsService.cs index 5fe386f1a..1e531ba66 100644 --- a/MediaBrowser.Api/UserLibrary/ItemsService.cs +++ b/MediaBrowser.Api/UserLibrary/ItemsService.cs @@ -117,7 +117,9 @@ namespace MediaBrowser.Api.UserLibrary IsVirtualItem = false, CollapseBoxSetItems = false, EnableTotalRecordCount = request.EnableTotalRecordCount, - AncestorIds = ancestorIds.ToArray() + AncestorIds = ancestorIds.ToArray(), + IncludeItemTypes = request.GetIncludeItemTypes(), + ExcludeItemTypes = request.GetExcludeItemTypes() }); var returnItems = _dtoService.GetBaseItemDtos(itemsResult.Items, options, user); diff --git a/MediaBrowser.Api/VideosService.cs b/MediaBrowser.Api/VideosService.cs index 3bd0497f7..3f840dbfa 100644 --- a/MediaBrowser.Api/VideosService.cs +++ b/MediaBrowser.Api/VideosService.cs @@ -110,35 +110,21 @@ namespace MediaBrowser.Api public void Delete(DeleteAlternateSources request) { - var task = DeleteAsync(request); - - Task.WaitAll(task); - } - - public async Task DeleteAsync(DeleteAlternateSources request) - { var video = (Video)_libraryManager.GetItemById(request.Id); foreach (var link in video.GetLinkedAlternateVersions()) { link.PrimaryVersionId = null; - await link.UpdateToRepository(ItemUpdateType.MetadataEdit, CancellationToken.None).ConfigureAwait(false); + link.UpdateToRepository(ItemUpdateType.MetadataEdit, CancellationToken.None); } video.LinkedAlternateVersions = Video.EmptyLinkedChildArray; - await video.UpdateToRepository(ItemUpdateType.MetadataEdit, CancellationToken.None).ConfigureAwait(false); + video.UpdateToRepository(ItemUpdateType.MetadataEdit, CancellationToken.None); } public void Post(MergeVersions request) { - var task = PostAsync(request); - - Task.WaitAll(task); - } - - public async Task PostAsync(MergeVersions request) - { var items = request.Ids.Split(',') .Select(i => _libraryManager.GetItemById(i)) .OfType<Video>() @@ -162,19 +148,19 @@ namespace MediaBrowser.Api if (primaryVersion == null) { primaryVersion = items.OrderBy(i => - { - if (i.Video3DFormat.HasValue) { - return 1; - } - - if (i.VideoType != Model.Entities.VideoType.VideoFile) - { - return 1; - } - - return 0; - }) + if (i.Video3DFormat.HasValue) + { + return 1; + } + + if (i.VideoType != Model.Entities.VideoType.VideoFile) + { + return 1; + } + + return 0; + }) .ThenByDescending(i => { var stream = i.GetDefaultVideoStream(); @@ -190,7 +176,7 @@ namespace MediaBrowser.Api { item.PrimaryVersionId = primaryVersion.Id.ToString("N"); - await item.UpdateToRepository(ItemUpdateType.MetadataEdit, CancellationToken.None).ConfigureAwait(false); + item.UpdateToRepository(ItemUpdateType.MetadataEdit, CancellationToken.None); list.Add(new LinkedChild { @@ -201,7 +187,7 @@ namespace MediaBrowser.Api primaryVersion.LinkedAlternateVersions = list.ToArray(); - await primaryVersion.UpdateToRepository(ItemUpdateType.MetadataEdit, CancellationToken.None).ConfigureAwait(false); + primaryVersion.UpdateToRepository(ItemUpdateType.MetadataEdit, CancellationToken.None); } } } diff --git a/MediaBrowser.Common/Net/HttpRequestOptions.cs b/MediaBrowser.Common/Net/HttpRequestOptions.cs index 4a894e662..51859ecdb 100644 --- a/MediaBrowser.Common/Net/HttpRequestOptions.cs +++ b/MediaBrowser.Common/Net/HttpRequestOptions.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Linq; using System.Net; using System.Threading; +using System.Text; namespace MediaBrowser.Common.Net { @@ -90,6 +91,7 @@ namespace MediaBrowser.Common.Net public bool BufferContent { get; set; } public bool LogRequest { get; set; } + public bool LogRequestAsDebug { get; set; } public bool LogErrors { get; set; } public bool LogErrorResponseBody { get; set; } @@ -102,6 +104,8 @@ namespace MediaBrowser.Common.Net public bool PreferIpv4 { get; set; } public bool EnableDefaultUserAgent { get; set; } + public bool AppendCharsetToMimeType { get; set; } + private string GetHeaderValue(string name) { string value; diff --git a/MediaBrowser.Common/Net/IHttpClient.cs b/MediaBrowser.Common/Net/IHttpClient.cs index 15257715f..cf5511965 100644 --- a/MediaBrowser.Common/Net/IHttpClient.cs +++ b/MediaBrowser.Common/Net/IHttpClient.cs @@ -19,24 +19,6 @@ namespace MediaBrowser.Common.Net Task<HttpResponseInfo> GetResponse(HttpRequestOptions options); /// <summary> - /// Performs a GET request and returns the resulting stream - /// </summary> - /// <param name="url">The URL.</param> - /// <param name="resourcePool">The resource pool.</param> - /// <param name="cancellationToken">The cancellation token.</param> - /// <returns>Task{Stream}.</returns> - /// <exception cref="MediaBrowser.Model.Net.HttpException"></exception> - Task<Stream> Get(string url, SemaphoreSlim resourcePool, CancellationToken cancellationToken); - - /// <summary> - /// Gets the specified URL. - /// </summary> - /// <param name="url">The URL.</param> - /// <param name="cancellationToken">The cancellation token.</param> - /// <returns>Task{Stream}.</returns> - Task<Stream> Get(string url, CancellationToken cancellationToken); - - /// <summary> /// Gets the specified options. /// </summary> /// <param name="options">The options.</param> @@ -52,35 +34,6 @@ namespace MediaBrowser.Common.Net Task<HttpResponseInfo> SendAsync(HttpRequestOptions options, string httpMethod); /// <summary> - /// Performs a POST request - /// </summary> - /// <param name="url">The URL.</param> - /// <param name="postData">Params to add to the POST data.</param> - /// <param name="resourcePool">The resource pool.</param> - /// <param name="cancellationToken">The cancellation token.</param> - /// <returns>stream on success, null on failure</returns> - /// <exception cref="System.ArgumentNullException">postData</exception> - /// <exception cref="MediaBrowser.Model.Net.HttpException"></exception> - Task<Stream> Post(string url, Dictionary<string, string> postData, SemaphoreSlim resourcePool, CancellationToken cancellationToken); - - /// <summary> - /// Posts the specified URL. - /// </summary> - /// <param name="url">The URL.</param> - /// <param name="postData">The post data.</param> - /// <param name="cancellationToken">The cancellation token.</param> - /// <returns>Task{Stream}.</returns> - Task<Stream> Post(string url, Dictionary<string, string> postData, CancellationToken cancellationToken); - - /// <summary> - /// Posts the specified options with post data - /// </summary> - /// <param name="options">The options</param> - /// <param name="postData">The post data</param> - /// <returns>Task{Stream}</returns> - Task<Stream> Post(HttpRequestOptions options, Dictionary<string, string> postData); - - /// <summary> /// Posts the specified options. /// </summary> /// <param name="options">The options.</param> diff --git a/MediaBrowser.Common/Updates/GithubUpdater.cs b/MediaBrowser.Common/Updates/GithubUpdater.cs index 2106ac6d5..30abdc5da 100644 --- a/MediaBrowser.Common/Updates/GithubUpdater.cs +++ b/MediaBrowser.Common/Updates/GithubUpdater.cs @@ -40,11 +40,14 @@ namespace MediaBrowser.Common.Updates options.CacheLength = cacheLength; } - using (var stream = await _httpClient.Get(options).ConfigureAwait(false)) + using (var response = await _httpClient.SendAsync(options, "GET").ConfigureAwait(false)) { - var obj = _jsonSerializer.DeserializeFromStream<RootObject[]>(stream); + using (var stream = response.Content) + { + var obj = _jsonSerializer.DeserializeFromStream<RootObject[]>(stream); - return CheckForUpdateResult(obj, minVersion, updateLevel, assetFilename, packageName, targetFilename); + return CheckForUpdateResult(obj, minVersion, updateLevel, assetFilename, packageName, targetFilename); + } } } @@ -110,17 +113,20 @@ namespace MediaBrowser.Common.Updates BufferContent = false }; - using (var stream = await _httpClient.Get(options).ConfigureAwait(false)) + using (var response = await _httpClient.SendAsync(options, "GET").ConfigureAwait(false)) { - var obj = _jsonSerializer.DeserializeFromStream<RootObject[]>(stream); + using (var stream = response.Content) + { + var obj = _jsonSerializer.DeserializeFromStream<RootObject[]>(stream); - obj = obj.Where(i => (i.assets ?? new List<Asset>()).Any(a => IsAsset(a, assetFilename, i.tag_name))).ToArray(); + obj = obj.Where(i => (i.assets ?? new List<Asset>()).Any(a => IsAsset(a, assetFilename, i.tag_name))).ToArray(); - list.AddRange(obj.Where(i => MatchesUpdateLevel(i, PackageVersionClass.Release)).OrderByDescending(GetVersion).Take(1)); - list.AddRange(obj.Where(i => MatchesUpdateLevel(i, PackageVersionClass.Beta)).OrderByDescending(GetVersion).Take(1)); - list.AddRange(obj.Where(i => MatchesUpdateLevel(i, PackageVersionClass.Dev)).OrderByDescending(GetVersion).Take(1)); + list.AddRange(obj.Where(i => MatchesUpdateLevel(i, PackageVersionClass.Release)).OrderByDescending(GetVersion).Take(1)); + list.AddRange(obj.Where(i => MatchesUpdateLevel(i, PackageVersionClass.Beta)).OrderByDescending(GetVersion).Take(1)); + list.AddRange(obj.Where(i => MatchesUpdateLevel(i, PackageVersionClass.Dev)).OrderByDescending(GetVersion).Take(1)); - return list; + return list; + } } } diff --git a/MediaBrowser.Controller/Channels/Channel.cs b/MediaBrowser.Controller/Channels/Channel.cs index f74c01994..54faa1443 100644 --- a/MediaBrowser.Controller/Channels/Channel.cs +++ b/MediaBrowser.Controller/Channels/Channel.cs @@ -32,14 +32,6 @@ namespace MediaBrowser.Controller.Channels return base.IsVisible(user); } - public override double? GetDefaultPrimaryImageAspectRatio() - { - double value = 16; - value /= 9; - - return value; - } - [IgnoreDataMember] public override bool SupportsInheritedParentImages { diff --git a/MediaBrowser.Controller/Channels/IChannelManager.cs b/MediaBrowser.Controller/Channels/IChannelManager.cs index 46e55a21c..37fc892b3 100644 --- a/MediaBrowser.Controller/Channels/IChannelManager.cs +++ b/MediaBrowser.Controller/Channels/IChannelManager.cs @@ -117,14 +117,13 @@ namespace MediaBrowser.Controller.Channels /// </summary> /// <param name="cancellationToken">The cancellation token.</param> /// <returns>BaseItemDto.</returns> - Task<Folder> GetInternalChannelFolder(CancellationToken cancellationToken); + Folder GetInternalChannelFolder(CancellationToken cancellationToken); /// <summary> /// Gets the channel folder. /// </summary> /// <param name="userId">The user identifier.</param> /// <param name="cancellationToken">The cancellation token.</param> - /// <returns>BaseItemDto.</returns> - Task<BaseItemDto> GetChannelFolder(string userId, CancellationToken cancellationToken); + BaseItemDto GetChannelFolder(string userId, CancellationToken cancellationToken); } } diff --git a/MediaBrowser.Controller/Devices/IDeviceManager.cs b/MediaBrowser.Controller/Devices/IDeviceManager.cs index 2846bcfc6..676db09aa 100644 --- a/MediaBrowser.Controller/Devices/IDeviceManager.cs +++ b/MediaBrowser.Controller/Devices/IDeviceManager.cs @@ -28,7 +28,7 @@ namespace MediaBrowser.Controller.Devices /// <param name="appVersion">The application version.</param> /// <param name="usedByUserId">The used by user identifier.</param> /// <returns>Task.</returns> - Task<DeviceInfo> RegisterDevice(string reportedId, string name, string appName, string appVersion, string usedByUserId); + DeviceInfo RegisterDevice(string reportedId, string name, string appName, string appVersion, string usedByUserId); /// <summary> /// Saves the capabilities. @@ -36,7 +36,7 @@ namespace MediaBrowser.Controller.Devices /// <param name="reportedId">The reported identifier.</param> /// <param name="capabilities">The capabilities.</param> /// <returns>Task.</returns> - Task SaveCapabilities(string reportedId, ClientCapabilities capabilities); + void SaveCapabilities(string reportedId, ClientCapabilities capabilities); /// <summary> /// Gets the capabilities. @@ -58,7 +58,7 @@ namespace MediaBrowser.Controller.Devices /// <param name="id">The identifier.</param> /// <param name="options">The options.</param> /// <returns>Task.</returns> - Task UpdateDeviceInfo(string id, DeviceOptions options); + void UpdateDeviceInfo(string id, DeviceOptions options); /// <summary> /// Gets the devices. @@ -67,12 +67,7 @@ namespace MediaBrowser.Controller.Devices /// <returns>IEnumerable<DeviceInfo>.</returns> QueryResult<DeviceInfo> GetDevices(DeviceQuery query); - /// <summary> - /// Deletes the device. - /// </summary> - /// <param name="id">The identifier.</param> - /// <returns>Task.</returns> - Task DeleteDevice(string id); + void DeleteDevice(string id); /// <summary> /// Gets the upload history. diff --git a/MediaBrowser.Controller/Devices/IDeviceRepository.cs b/MediaBrowser.Controller/Devices/IDeviceRepository.cs index 736504da3..b9ebbb6c7 100644 --- a/MediaBrowser.Controller/Devices/IDeviceRepository.cs +++ b/MediaBrowser.Controller/Devices/IDeviceRepository.cs @@ -1,7 +1,6 @@ using MediaBrowser.Model.Devices; using MediaBrowser.Model.Session; using System.Collections.Generic; -using System.Threading.Tasks; namespace MediaBrowser.Controller.Devices { @@ -12,7 +11,7 @@ namespace MediaBrowser.Controller.Devices /// </summary> /// <param name="device">The device.</param> /// <returns>Task.</returns> - Task SaveDevice(DeviceInfo device); + void SaveDevice(DeviceInfo device); /// <summary> /// Saves the capabilities. @@ -20,7 +19,7 @@ namespace MediaBrowser.Controller.Devices /// <param name="id">The identifier.</param> /// <param name="capabilities">The capabilities.</param> /// <returns>Task.</returns> - Task SaveCapabilities(string id, ClientCapabilities capabilities); + void SaveCapabilities(string id, ClientCapabilities capabilities); /// <summary> /// Gets the capabilities. @@ -36,18 +35,14 @@ namespace MediaBrowser.Controller.Devices /// <returns>DeviceInfo.</returns> DeviceInfo GetDevice(string id); - /// <summary> - /// Gets the devices. - /// </summary> - /// <returns>IEnumerable<DeviceInfo>.</returns> - IEnumerable<DeviceInfo> GetDevices(); + List<DeviceInfo> GetDevices(); /// <summary> /// Deletes the device. /// </summary> /// <param name="id">The identifier.</param> /// <returns>Task.</returns> - Task DeleteDevice(string id); + void DeleteDevice(string id); /// <summary> /// Gets the upload history. diff --git a/MediaBrowser.Controller/Dlna/IEventManager.cs b/MediaBrowser.Controller/Dlna/IEventManager.cs index 8c91bd889..3af357a17 100644 --- a/MediaBrowser.Controller/Dlna/IEventManager.cs +++ b/MediaBrowser.Controller/Dlna/IEventManager.cs @@ -12,7 +12,7 @@ namespace MediaBrowser.Controller.Dlna /// <summary> /// Renews the event subscription. /// </summary> - EventSubscriptionResponse RenewEventSubscription(string subscriptionId, string requestedTimeoutString); + EventSubscriptionResponse RenewEventSubscription(string subscriptionId, string notificationType, string requestedTimeoutString, string callbackUrl); /// <summary> /// Creates the event subscription. diff --git a/MediaBrowser.Controller/Drawing/IImageProcessor.cs b/MediaBrowser.Controller/Drawing/IImageProcessor.cs index 542fa5e08..0bc92ac7e 100644 --- a/MediaBrowser.Controller/Drawing/IImageProcessor.cs +++ b/MediaBrowser.Controller/Drawing/IImageProcessor.cs @@ -26,21 +26,16 @@ namespace MediaBrowser.Controller.Drawing /// <value>The image enhancers.</value> IImageEnhancer[] ImageEnhancers { get; } + ImageSize GetImageSize(string path); + /// <summary> /// Gets the size of the image. /// </summary> /// <param name="info">The information.</param> /// <returns>ImageSize.</returns> - ImageSize GetImageSize(ItemImageInfo info); + ImageSize GetImageSize(BaseItem item, ItemImageInfo info); - ImageSize GetImageSize(ItemImageInfo info, bool allowSlowMethods); - - /// <summary> - /// Gets the size of the image. - /// </summary> - /// <param name="path">The path.</param> - /// <returns>ImageSize.</returns> - ImageSize GetImageSize(string path); + ImageSize GetImageSize(BaseItem item, ItemImageInfo info, bool allowSlowMethods, bool updateItem); /// <summary> /// Adds the parts. diff --git a/MediaBrowser.Controller/Dto/IDtoService.cs b/MediaBrowser.Controller/Dto/IDtoService.cs index c0217330d..5ba6e036e 100644 --- a/MediaBrowser.Controller/Dto/IDtoService.cs +++ b/MediaBrowser.Controller/Dto/IDtoService.cs @@ -23,14 +23,14 @@ namespace MediaBrowser.Controller.Dto /// </summary> /// <param name="dto">The dto.</param> /// <param name="item">The item.</param> - void AttachPrimaryImageAspectRatio(IItemDto dto, IHasMetadata item); + void AttachPrimaryImageAspectRatio(IItemDto dto, BaseItem item); /// <summary> /// Gets the primary image aspect ratio. /// </summary> /// <param name="item">The item.</param> /// <returns>System.Nullable<System.Double>.</returns> - double? GetPrimaryImageAspectRatio(IHasMetadata item); + double? GetPrimaryImageAspectRatio(BaseItem item); /// <summary> /// Gets the base item dto. diff --git a/MediaBrowser.Controller/Entities/Audio/Audio.cs b/MediaBrowser.Controller/Entities/Audio/Audio.cs index 02a9f15a9..16fd75d2e 100644 --- a/MediaBrowser.Controller/Entities/Audio/Audio.cs +++ b/MediaBrowser.Controller/Entities/Audio/Audio.cs @@ -61,6 +61,12 @@ namespace MediaBrowser.Controller.Entities.Audio } [IgnoreDataMember] + public override bool SupportsPeople + { + get { return false; } + } + + [IgnoreDataMember] public override bool SupportsAddingToPlaylist { get { return true; } diff --git a/MediaBrowser.Controller/Entities/Audio/AudioPodcast.cs b/MediaBrowser.Controller/Entities/Audio/AudioPodcast.cs index d2b4569ba..1b717b900 100644 --- a/MediaBrowser.Controller/Entities/Audio/AudioPodcast.cs +++ b/MediaBrowser.Controller/Entities/Audio/AudioPodcast.cs @@ -1,8 +1,9 @@ -using MediaBrowser.Model.Serialization; +using MediaBrowser.Controller.Providers; +using MediaBrowser.Model.Serialization; namespace MediaBrowser.Controller.Entities.Audio { - public class AudioPodcast : Audio + public class AudioPodcast : Audio, IHasLookupInfo<SongInfo> { [IgnoreDataMember] public override bool SupportsPositionTicksResume @@ -13,6 +14,15 @@ namespace MediaBrowser.Controller.Entities.Audio } } + [IgnoreDataMember] + public override bool SupportsPlayedStatus + { + get + { + return true; + } + } + public override double? GetDefaultPrimaryImageAspectRatio() { return 1; diff --git a/MediaBrowser.Controller/Entities/AudioBook.cs b/MediaBrowser.Controller/Entities/AudioBook.cs index 1bdcfb881..374bb21f7 100644 --- a/MediaBrowser.Controller/Entities/AudioBook.cs +++ b/MediaBrowser.Controller/Entities/AudioBook.cs @@ -1,11 +1,12 @@ using System; +using MediaBrowser.Controller.Providers; using MediaBrowser.Model.Configuration; using MediaBrowser.Model.Serialization; using MediaBrowser.Model.Entities; namespace MediaBrowser.Controller.Entities { - public class AudioBook : Audio.Audio, IHasSeries + public class AudioBook : Audio.Audio, IHasSeries, IHasLookupInfo<SongInfo> { [IgnoreDataMember] public override bool SupportsPositionTicksResume @@ -50,12 +51,6 @@ namespace MediaBrowser.Controller.Entities return null; } - [IgnoreDataMember] - public override bool EnableRefreshOnDateModifiedChange - { - get { return true; } - } - public Guid? FindSeriesId() { return SeriesId; diff --git a/MediaBrowser.Controller/Entities/BaseItem.cs b/MediaBrowser.Controller/Entities/BaseItem.cs index 502ba6c60..89d48ff90 100644 --- a/MediaBrowser.Controller/Entities/BaseItem.cs +++ b/MediaBrowser.Controller/Entities/BaseItem.cs @@ -477,14 +477,36 @@ namespace MediaBrowser.Controller.Entities locationType != LocationType.Virtual; } - public virtual bool IsAuthorizedToDelete(User user) + public virtual bool IsAuthorizedToDelete(User user, List<Folder> allCollectionFolders) { - return user.Policy.EnableContentDeletion; + if (user.Policy.EnableContentDeletion) + { + return true; + } + + var allowed = user.Policy.EnableContentDeletionFromFolders; + var collectionFolders = LibraryManager.GetCollectionFolders(this, allCollectionFolders); + + foreach (var folder in collectionFolders) + { + if (allowed.Contains(folder.Id.ToString("N"), StringComparer.OrdinalIgnoreCase)) + { + return true; + } + } + + return false; + } + + public bool CanDelete(User user, List<Folder> allCollectionFolders) + { + return CanDelete() && IsAuthorizedToDelete(user, allCollectionFolders); } public bool CanDelete(User user) { - return CanDelete() && IsAuthorizedToDelete(user); + var allCollectionFolders = LibraryManager.GetUserRootFolder().Children.OfType<Folder>().ToList(); + return CanDelete(user, allCollectionFolders); } public virtual bool CanDownload() @@ -1142,7 +1164,7 @@ namespace MediaBrowser.Controller.Entities [IgnoreDataMember] public virtual bool SupportsPeople { - get { return true; } + get { return false; } } [IgnoreDataMember] @@ -1281,8 +1303,8 @@ namespace MediaBrowser.Controller.Entities { var subOptions = new MetadataRefreshOptions(options); - if (!i.ExtraType.HasValue || - i.ExtraType.Value != Model.Entities.ExtraType.ThemeSong || + if (!i.ExtraType.HasValue || + i.ExtraType.Value != Model.Entities.ExtraType.ThemeSong || i.OwnerId != ownerId || i.ParentId != Guid.Empty) { @@ -1356,14 +1378,20 @@ namespace MediaBrowser.Controller.Entities internal virtual bool IsValidFromResolver(BaseItem newItem) { - var current = this; + return true; + } - if (current.IsInMixedFolder != newItem.IsInMixedFolder) + internal virtual ItemUpdateType UpdateFromResolvedItem(BaseItem newItem) + { + var updateType = ItemUpdateType.None; + + if (IsInMixedFolder != newItem.IsInMixedFolder) { - return false; + IsInMixedFolder = newItem.IsInMixedFolder; + updateType |= ItemUpdateType.MetadataImport; } - return true; + return updateType; } public void AfterMetadataRefresh() @@ -1924,6 +1952,8 @@ namespace MediaBrowser.Controller.Entities { existingImage.Path = image.Path; existingImage.DateModified = image.DateModified; + existingImage.Width = image.Width; + existingImage.Height = image.Height; } else @@ -1966,14 +1996,14 @@ namespace MediaBrowser.Controller.Entities /// <param name="type">The type.</param> /// <param name="index">The index.</param> /// <returns>Task.</returns> - public Task DeleteImage(ImageType type, int index) + public void DeleteImage(ImageType type, int index) { var info = GetImageInfo(type, index); if (info == null) { // Nothing to do - return Task.FromResult(true); + return; } // Remove it from the item @@ -1984,7 +2014,7 @@ namespace MediaBrowser.Controller.Entities FileSystem.DeleteFile(info.Path); } - return UpdateToRepository(ItemUpdateType.ImageUpdate, CancellationToken.None); + UpdateToRepository(ItemUpdateType.ImageUpdate, CancellationToken.None); } public void RemoveImage(ItemImageInfo image) @@ -1997,9 +2027,9 @@ namespace MediaBrowser.Controller.Entities ImageInfos = ImageInfos.Except(deletedImages).ToArray(); } - public virtual Task UpdateToRepository(ItemUpdateType updateReason, CancellationToken cancellationToken) + public virtual void UpdateToRepository(ItemUpdateType updateReason, CancellationToken cancellationToken) { - return LibraryManager.UpdateItem(this, updateReason, cancellationToken); + LibraryManager.UpdateItem(this, updateReason, cancellationToken); } /// <summary> @@ -2209,7 +2239,7 @@ namespace MediaBrowser.Controller.Entities return type == ImageType.Backdrop || type == ImageType.Screenshot || type == ImageType.Chapter; } - public Task SwapImages(ImageType type, int index1, int index2) + public void SwapImages(ImageType type, int index1, int index2) { if (!AllowsMultipleImages(type)) { @@ -2222,13 +2252,13 @@ namespace MediaBrowser.Controller.Entities if (info1 == null || info2 == null) { // Nothing to do - return Task.FromResult(true); + return; } if (!info1.IsLocalFile || !info2.IsLocalFile) { // TODO: Not supported yet - return Task.FromResult(true); + return; } var path1 = info1.Path; @@ -2240,7 +2270,12 @@ namespace MediaBrowser.Controller.Entities info1.DateModified = FileSystem.GetLastWriteTimeUtc(info1.Path); info2.DateModified = FileSystem.GetLastWriteTimeUtc(info2.Path); - return UpdateToRepository(ItemUpdateType.ImageUpdate, CancellationToken.None); + info1.Width = 0; + info1.Height = 0; + info2.Width = 0; + info2.Height = 0; + + UpdateToRepository(ItemUpdateType.ImageUpdate, CancellationToken.None); } public virtual bool IsPlayed(User user) @@ -2526,15 +2561,6 @@ namespace MediaBrowser.Controller.Entities return LibraryManager.DeleteItem(this, options); } - public virtual Task OnFileDeleted() - { - // Remove from database - return Delete(new DeleteOptions - { - DeleteFileLocation = false - }); - } - public virtual List<ExternalUrl> GetRelatedUrls() { return new List<ExternalUrl>(); diff --git a/MediaBrowser.Controller/Entities/Book.cs b/MediaBrowser.Controller/Entities/Book.cs index 9b1a52f83..45e3915ce 100644 --- a/MediaBrowser.Controller/Entities/Book.cs +++ b/MediaBrowser.Controller/Entities/Book.cs @@ -38,12 +38,6 @@ namespace MediaBrowser.Controller.Entities return SeriesPresentationUniqueKey; } - [IgnoreDataMember] - public override bool EnableRefreshOnDateModifiedChange - { - get { return true; } - } - public Guid? FindSeriesId() { return SeriesId; diff --git a/MediaBrowser.Controller/Entities/Folder.cs b/MediaBrowser.Controller/Entities/Folder.cs index 6d88f7015..ce7145a79 100644 --- a/MediaBrowser.Controller/Entities/Folder.cs +++ b/MediaBrowser.Controller/Entities/Folder.cs @@ -328,11 +328,6 @@ namespace MediaBrowser.Controller.Entities return dictionary; } - private bool IsValidFromResolver(BaseItem current, BaseItem newItem) - { - return current.IsValidFromResolver(newItem); - } - protected override void TriggerOnRefreshStart() { } @@ -421,10 +416,15 @@ namespace MediaBrowser.Controller.Entities { BaseItem currentChild; - if (currentChildren.TryGetValue(child.Id, out currentChild) && IsValidFromResolver(currentChild, child)) + if (currentChildren.TryGetValue(child.Id, out currentChild) && currentChild.IsValidFromResolver(child)) { validChildren.Add(currentChild); + if (currentChild.UpdateFromResolvedItem(child) > ItemUpdateType.None) + { + currentChild.UpdateToRepository(ItemUpdateType.MetadataImport, cancellationToken); + } + continue; } @@ -542,7 +542,6 @@ namespace MediaBrowser.Controller.Entities if (validChildrenNeedGeneration) { validChildren = Children.ToList(); - validChildrenNeedGeneration = false; } await RefreshMetadataRecursive(validChildren, refreshOptions, recursive, innerProgress, cancellationToken); diff --git a/MediaBrowser.Controller/Entities/Game.cs b/MediaBrowser.Controller/Entities/Game.cs index a99058925..bead0ef95 100644 --- a/MediaBrowser.Controller/Entities/Game.cs +++ b/MediaBrowser.Controller/Entities/Game.cs @@ -29,15 +29,15 @@ namespace MediaBrowser.Controller.Entities } [IgnoreDataMember] - public override bool EnableRefreshOnDateModifiedChange + public override bool SupportsThemeMedia { get { return true; } } [IgnoreDataMember] - public override bool SupportsThemeMedia + public override bool SupportsPeople { - get { return true; } + get { return false; } } /// <summary> diff --git a/MediaBrowser.Controller/Entities/IHasMetadata.cs b/MediaBrowser.Controller/Entities/IHasMetadata.cs index 4146686b2..b7d31b4d6 100644 --- a/MediaBrowser.Controller/Entities/IHasMetadata.cs +++ b/MediaBrowser.Controller/Entities/IHasMetadata.cs @@ -151,11 +151,7 @@ namespace MediaBrowser.Controller.Entities /// <summary> /// Swaps the images. /// </summary> - /// <param name="type">The type.</param> - /// <param name="index1">The index1.</param> - /// <param name="index2">The index2.</param> - /// <returns>Task.</returns> - Task SwapImages(ImageType type, int index1, int index2); + void SwapImages(ImageType type, int index1, int index2); /// <summary> /// Gets or sets the primary image path. @@ -249,10 +245,7 @@ namespace MediaBrowser.Controller.Entities /// <summary> /// Updates to repository. /// </summary> - /// <param name="updateReason">The update reason.</param> - /// <param name="cancellationToken">The cancellation token.</param> - /// <returns>Task.</returns> - Task UpdateToRepository(ItemUpdateType updateReason, CancellationToken cancellationToken); + void UpdateToRepository(ItemUpdateType updateReason, CancellationToken cancellationToken); /// <summary> /// Sets the image. diff --git a/MediaBrowser.Controller/Entities/ItemImageInfo.cs b/MediaBrowser.Controller/Entities/ItemImageInfo.cs index 6b2d2392d..bd0011c4b 100644 --- a/MediaBrowser.Controller/Entities/ItemImageInfo.cs +++ b/MediaBrowser.Controller/Entities/ItemImageInfo.cs @@ -24,6 +24,9 @@ namespace MediaBrowser.Controller.Entities /// <value>The date modified.</value> public DateTime DateModified { get; set; } + public int Width { get; set; } + public int Height { get; set; } + [IgnoreDataMember] public bool IsLocalFile { diff --git a/MediaBrowser.Controller/Entities/Movies/BoxSet.cs b/MediaBrowser.Controller/Entities/Movies/BoxSet.cs index bd8d9024d..268860ff0 100644 --- a/MediaBrowser.Controller/Entities/Movies/BoxSet.cs +++ b/MediaBrowser.Controller/Entities/Movies/BoxSet.cs @@ -45,6 +45,12 @@ namespace MediaBrowser.Controller.Entities.Movies } } + [IgnoreDataMember] + public override bool SupportsPeople + { + get { return true; } + } + public Guid[] LocalTrailerIds { get; set; } public Guid[] RemoteTrailerIds { get; set; } @@ -126,7 +132,7 @@ namespace MediaBrowser.Controller.Entities.Movies } } - public override bool IsAuthorizedToDelete(User user) + public override bool IsAuthorizedToDelete(User user, List<Folder> allCollectionFolders) { return true; } diff --git a/MediaBrowser.Controller/Entities/PhotoAlbum.cs b/MediaBrowser.Controller/Entities/PhotoAlbum.cs index 52d743e36..af9d8c801 100644 --- a/MediaBrowser.Controller/Entities/PhotoAlbum.cs +++ b/MediaBrowser.Controller/Entities/PhotoAlbum.cs @@ -30,10 +30,5 @@ namespace MediaBrowser.Controller.Entities return false; } } - - public override double? GetDefaultPrimaryImageAspectRatio() - { - return 1; - } } } diff --git a/MediaBrowser.Controller/Entities/TV/Episode.cs b/MediaBrowser.Controller/Entities/TV/Episode.cs index c30e0ef8e..3f52dfc93 100644 --- a/MediaBrowser.Controller/Entities/TV/Episode.cs +++ b/MediaBrowser.Controller/Entities/TV/Episode.cs @@ -79,6 +79,12 @@ namespace MediaBrowser.Controller.Entities.TV }
[IgnoreDataMember]
+ public override bool SupportsPeople
+ {
+ get { return true; }
+ }
+
+ [IgnoreDataMember]
public int? AiredSeasonNumber
{
get
diff --git a/MediaBrowser.Controller/Entities/TV/Season.cs b/MediaBrowser.Controller/Entities/TV/Season.cs index bf6dc5678..00bb75fa7 100644 --- a/MediaBrowser.Controller/Entities/TV/Season.cs +++ b/MediaBrowser.Controller/Entities/TV/Season.cs @@ -41,6 +41,12 @@ namespace MediaBrowser.Controller.Entities.TV } [IgnoreDataMember] + public override bool SupportsPeople + { + get { return true; } + } + + [IgnoreDataMember] public override bool SupportsInheritedParentImages { get { return true; } diff --git a/MediaBrowser.Controller/Entities/TV/Series.cs b/MediaBrowser.Controller/Entities/TV/Series.cs index 5931c32e1..1d09783d1 100644 --- a/MediaBrowser.Controller/Entities/TV/Series.cs +++ b/MediaBrowser.Controller/Entities/TV/Series.cs @@ -64,6 +64,12 @@ namespace MediaBrowser.Controller.Entities.TV } } + [IgnoreDataMember] + public override bool SupportsPeople + { + get { return true; } + } + public Guid[] LocalTrailerIds { get; set; } public Guid[] RemoteTrailerIds { get; set; } diff --git a/MediaBrowser.Controller/Entities/User.cs b/MediaBrowser.Controller/Entities/User.cs index 36bbf6886..821327b7f 100644 --- a/MediaBrowser.Controller/Entities/User.cs +++ b/MediaBrowser.Controller/Entities/User.cs @@ -235,10 +235,9 @@ namespace MediaBrowser.Controller.Entities }, CancellationToken.None); } - public override Task UpdateToRepository(ItemUpdateType updateReason, CancellationToken cancellationToken) + public override void UpdateToRepository(ItemUpdateType updateReason, CancellationToken cancellationToken) { UserManager.UpdateUser(this); - return Task.FromResult(true); } /// <summary> diff --git a/MediaBrowser.Controller/Entities/UserViewBuilder.cs b/MediaBrowser.Controller/Entities/UserViewBuilder.cs index 43adc4af6..97b96127a 100644 --- a/MediaBrowser.Controller/Entities/UserViewBuilder.cs +++ b/MediaBrowser.Controller/Entities/UserViewBuilder.cs @@ -78,26 +78,26 @@ namespace MediaBrowser.Controller.Entities case SpecialFolder.LiveTvChannels: { - var result = await _liveTvManager.GetInternalChannels(new LiveTvChannelQuery + var result = _liveTvManager.GetInternalChannels(new LiveTvChannelQuery { UserId = query.User.Id.ToString("N"), Limit = query.Limit, StartIndex = query.StartIndex - }, new DtoOptions(), CancellationToken.None).ConfigureAwait(false); + }, new DtoOptions(), CancellationToken.None); return GetResult(result); } case SpecialFolder.LiveTvNowPlaying: { - var result = await _liveTvManager.GetRecommendedProgramsInternal(new RecommendedProgramQuery + var result = _liveTvManager.GetRecommendedProgramsInternal(new RecommendedProgramQuery { UserId = query.User.Id.ToString("N"), Limit = query.Limit, IsAiring = true - }, new Dto.DtoOptions(), CancellationToken.None).ConfigureAwait(false); + }, new Dto.DtoOptions(), CancellationToken.None); return GetResult(result); } @@ -142,22 +142,22 @@ namespace MediaBrowser.Controller.Entities return GetResult(user.RootFolder.GetChildren(user, true), queryParent, query); case CollectionType.Playlists: - return GetPlaylistsView(queryParent, user, query); + return GetPlaylistsView(queryParent, user, query); case CollectionType.BoxSets: return GetBoxsetView(queryParent, user, query); case CollectionType.TvShows: - return await GetTvView(queryParent, user, query).ConfigureAwait(false); + return GetTvView(queryParent, user, query); case CollectionType.Movies: - return await GetMovieFolders(queryParent, user, query).ConfigureAwait(false); + return GetMovieFolders(queryParent, user, query); case SpecialFolder.TvShowSeries: return GetTvSeries(queryParent, user, query); case SpecialFolder.TvGenres: - return await GetTvGenres(queryParent, user, query).ConfigureAwait(false); + return GetTvGenres(queryParent, user, query); case SpecialFolder.TvGenre: return GetTvGenreItems(queryParent, displayParent, user, query); @@ -178,10 +178,10 @@ namespace MediaBrowser.Controller.Entities return GetMovieLatest(queryParent, user, query); case SpecialFolder.MovieGenres: - return await GetMovieGenres(queryParent, user, query).ConfigureAwait(false); + return GetMovieGenres(queryParent, user, query); case SpecialFolder.MovieGenre: - return GetMovieGenreItems(queryParent, displayParent, user, query); + return GetMovieGenreItems(queryParent, displayParent, user, query); case SpecialFolder.MovieResume: return GetMovieResume(queryParent, user, query); @@ -199,7 +199,7 @@ namespace MediaBrowser.Controller.Entities return GetFavoriteSeries(queryParent, user, query); case CollectionType.Music: - return await GetMusicFolders(queryParent, user, query).ConfigureAwait(false); + return GetMusicFolders(queryParent, user, query); case SpecialFolder.MusicGenres: return GetMusicGenres(queryParent, user, query); @@ -223,7 +223,7 @@ namespace MediaBrowser.Controller.Entities return GetMusicSongs(queryParent, user, query); case SpecialFolder.MusicFavorites: - return await GetMusicFavorites(queryParent, user, query).ConfigureAwait(false); + return GetMusicFavorites(queryParent, user, query); case SpecialFolder.MusicFavoriteAlbums: return GetFavoriteAlbums(queryParent, user, query); @@ -245,7 +245,7 @@ namespace MediaBrowser.Controller.Entities } } - private async Task<QueryResult<BaseItem>> GetMusicFolders(Folder parent, User user, InternalItemsQuery query) + private QueryResult<BaseItem> GetMusicFolders(Folder parent, User user, InternalItemsQuery query) { if (query.Recursive) { @@ -262,25 +262,25 @@ namespace MediaBrowser.Controller.Entities var list = new List<BaseItem>(); - list.Add(await GetUserView(SpecialFolder.MusicLatest, "0", parent).ConfigureAwait(false)); - list.Add(await GetUserView(SpecialFolder.MusicPlaylists, "1", parent).ConfigureAwait(false)); - list.Add(await GetUserView(SpecialFolder.MusicAlbums, "2", parent).ConfigureAwait(false)); - list.Add(await GetUserView(SpecialFolder.MusicAlbumArtists, "3", parent).ConfigureAwait(false)); - list.Add(await GetUserView(SpecialFolder.MusicArtists, "4", parent).ConfigureAwait(false)); - list.Add(await GetUserView(SpecialFolder.MusicSongs, "5", parent).ConfigureAwait(false)); - list.Add(await GetUserView(SpecialFolder.MusicGenres, "6", parent).ConfigureAwait(false)); - list.Add(await GetUserView(SpecialFolder.MusicFavorites, "7", parent).ConfigureAwait(false)); + list.Add(GetUserView(SpecialFolder.MusicLatest, "Latest", "0", parent)); + list.Add(GetUserView(SpecialFolder.MusicPlaylists, "Playlists", "1", parent)); + list.Add(GetUserView(SpecialFolder.MusicAlbums, "Albums", "2", parent)); + list.Add(GetUserView(SpecialFolder.MusicAlbumArtists, "HeaderAlbumArtists", "3", parent)); + list.Add(GetUserView(SpecialFolder.MusicArtists, "Artists", "4", parent)); + list.Add(GetUserView(SpecialFolder.MusicSongs, "Songs", "5", parent)); + list.Add(GetUserView(SpecialFolder.MusicGenres, "Genres", "6", parent)); + list.Add(GetUserView(SpecialFolder.MusicFavorites, "Favorites", "7", parent)); return GetResult(list, parent, query); } - private async Task<QueryResult<BaseItem>> GetMusicFavorites(Folder parent, User user, InternalItemsQuery query) + private QueryResult<BaseItem> GetMusicFavorites(Folder parent, User user, InternalItemsQuery query) { var list = new List<BaseItem>(); - list.Add(await GetUserView(SpecialFolder.MusicFavoriteAlbums, "0", parent).ConfigureAwait(false)); - list.Add(await GetUserView(SpecialFolder.MusicFavoriteArtists, "1", parent).ConfigureAwait(false)); - list.Add(await GetUserView(SpecialFolder.MusicFavoriteSongs, "2", parent).ConfigureAwait(false)); + list.Add(GetUserView(SpecialFolder.MusicFavoriteAlbums, "HeaderFavoriteAlbums", "0", parent)); + list.Add(GetUserView(SpecialFolder.MusicFavoriteArtists, "HeaderFavoriteArtists", "1", parent)); + list.Add(GetUserView(SpecialFolder.MusicFavoriteSongs, "HeaderFavoriteSongs", "2", parent)); return GetResult(list, parent, query); } @@ -426,7 +426,7 @@ namespace MediaBrowser.Controller.Entities return 50; } - private async Task<QueryResult<BaseItem>> GetMovieFolders(Folder parent, User user, InternalItemsQuery query) + private QueryResult<BaseItem> GetMovieFolders(Folder parent, User user, InternalItemsQuery query) { if (query.Recursive) { @@ -443,12 +443,12 @@ namespace MediaBrowser.Controller.Entities var list = new List<BaseItem>(); - list.Add(await GetUserView(SpecialFolder.MovieResume, "0", parent).ConfigureAwait(false)); - list.Add(await GetUserView(SpecialFolder.MovieLatest, "1", parent).ConfigureAwait(false)); - list.Add(await GetUserView(SpecialFolder.MovieMovies, "2", parent).ConfigureAwait(false)); - list.Add(await GetUserView(SpecialFolder.MovieCollections, "3", parent).ConfigureAwait(false)); - list.Add(await GetUserView(SpecialFolder.MovieFavorites, "4", parent).ConfigureAwait(false)); - list.Add(await GetUserView(SpecialFolder.MovieGenres, "5", parent).ConfigureAwait(false)); + list.Add(GetUserView(SpecialFolder.MovieResume, "HeaderContinueWatching", "0", parent)); + list.Add(GetUserView(SpecialFolder.MovieLatest, "Latest", "1", parent)); + list.Add(GetUserView(SpecialFolder.MovieMovies, "Movies", "2", parent)); + list.Add(GetUserView(SpecialFolder.MovieCollections, "Collections", "3", parent)); + list.Add(GetUserView(SpecialFolder.MovieFavorites, "Favorites", "4", parent)); + list.Add(GetUserView(SpecialFolder.MovieGenres, "Genres", "5", parent)); return GetResult(list, parent, query); } @@ -538,9 +538,9 @@ namespace MediaBrowser.Controller.Entities }; } - private async Task<QueryResult<BaseItem>> GetMovieGenres(Folder parent, User user, InternalItemsQuery query) + private QueryResult<BaseItem> GetMovieGenres(Folder parent, User user, InternalItemsQuery query) { - var tasks = parent.QueryRecursive(new InternalItemsQuery(user) + var genres = parent.QueryRecursive(new InternalItemsQuery(user) { IncludeItemTypes = new[] { typeof(Movie).Name }, Recursive = true, @@ -564,9 +564,7 @@ namespace MediaBrowser.Controller.Entities }) .Where(i => i != null) - .Select(i => GetUserView(i.Name, SpecialFolder.MovieGenre, i.SortName, parent)); - - var genres = await Task.WhenAll(tasks).ConfigureAwait(false); + .Select(i => GetUserViewWithName(i.Name, SpecialFolder.MovieGenre, i.SortName, parent)); return GetResult(genres, parent, query); } @@ -598,7 +596,7 @@ namespace MediaBrowser.Controller.Entities return _libraryManager.GetItemsResult(query); } - private async Task<QueryResult<BaseItem>> GetTvView(Folder parent, User user, InternalItemsQuery query) + private QueryResult<BaseItem> GetTvView(Folder parent, User user, InternalItemsQuery query) { if (query.Recursive) { @@ -615,13 +613,13 @@ namespace MediaBrowser.Controller.Entities var list = new List<BaseItem>(); - list.Add(await GetUserView(SpecialFolder.TvResume, "0", parent).ConfigureAwait(false)); - list.Add(await GetUserView(SpecialFolder.TvNextUp, "1", parent).ConfigureAwait(false)); - list.Add(await GetUserView(SpecialFolder.TvLatest, "2", parent).ConfigureAwait(false)); - list.Add(await GetUserView(SpecialFolder.TvShowSeries, "3", parent).ConfigureAwait(false)); - list.Add(await GetUserView(SpecialFolder.TvFavoriteSeries, "4", parent).ConfigureAwait(false)); - list.Add(await GetUserView(SpecialFolder.TvFavoriteEpisodes, "5", parent).ConfigureAwait(false)); - list.Add(await GetUserView(SpecialFolder.TvGenres, "6", parent).ConfigureAwait(false)); + list.Add(GetUserView(SpecialFolder.TvResume, "HeaderContinueWatching", "0", parent)); + list.Add(GetUserView(SpecialFolder.TvNextUp, "HeaderNextUp", "1", parent)); + list.Add(GetUserView(SpecialFolder.TvLatest, "Latest", "2", parent)); + list.Add(GetUserView(SpecialFolder.TvShowSeries, "Shows", "3", parent)); + list.Add(GetUserView(SpecialFolder.TvFavoriteSeries, "HeaderFavoriteShows", "4", parent)); + list.Add(GetUserView(SpecialFolder.TvFavoriteEpisodes, "HeaderFavoriteEpisodes", "5", parent)); + list.Add(GetUserView(SpecialFolder.TvGenres, "Genres", "6", parent)); return GetResult(list, parent, query); } @@ -679,9 +677,9 @@ namespace MediaBrowser.Controller.Entities return _libraryManager.GetItemsResult(query); } - private async Task<QueryResult<BaseItem>> GetTvGenres(Folder parent, User user, InternalItemsQuery query) + private QueryResult<BaseItem> GetTvGenres(Folder parent, User user, InternalItemsQuery query) { - var tasks = parent.QueryRecursive(new InternalItemsQuery(user) + var genres = parent.QueryRecursive(new InternalItemsQuery(user) { IncludeItemTypes = new[] { typeof(Series).Name }, Recursive = true, @@ -705,9 +703,7 @@ namespace MediaBrowser.Controller.Entities }) .Where(i => i != null) - .Select(i => GetUserView(i.Name, SpecialFolder.TvGenre, i.SortName, parent)); - - var genres = await Task.WhenAll(tasks).ConfigureAwait(false); + .Select(i => GetUserViewWithName(i.Name, SpecialFolder.TvGenre, i.SortName, parent)); return GetResult(genres, parent, query); } @@ -1740,20 +1736,20 @@ namespace MediaBrowser.Controller.Entities var list = new List<BaseItem>(); //list.Add(await GetUserSubView(SpecialFolder.LiveTvNowPlaying, user, "0", parent).ConfigureAwait(false)); - list.Add(await GetUserView(SpecialFolder.LiveTvChannels, string.Empty, user.RootFolder).ConfigureAwait(false)); - list.Add(await GetUserView(SpecialFolder.LiveTvRecordingGroups, string.Empty, user.RootFolder).ConfigureAwait(false)); + list.Add(GetUserView(SpecialFolder.LiveTvChannels, "Channels", string.Empty, user.RootFolder)); + list.Add(GetUserView(SpecialFolder.LiveTvRecordingGroups, "HeaderRecordingGroups", string.Empty, user.RootFolder)); return GetResult(list, queryParent, query); } - private Task<UserView> GetUserView(string name, string type, string sortName, BaseItem parent) + private UserView GetUserViewWithName(string name, string type, string sortName, BaseItem parent) { return _userViewManager.GetUserSubView(name, parent.Id.ToString("N"), type, sortName, CancellationToken.None); } - private Task<UserView> GetUserView(string type, string sortName, BaseItem parent) + private UserView GetUserView(string type, string localizationKey, string sortName, BaseItem parent) { - return _userViewManager.GetUserSubView(parent.Id.ToString("N"), type, sortName, CancellationToken.None); + return _userViewManager.GetUserSubView(parent.Id.ToString("N"), type, localizationKey, sortName, CancellationToken.None); } public static IEnumerable<BaseItem> FilterForAdjacency(List<BaseItem> list, string adjacentToId) diff --git a/MediaBrowser.Controller/Entities/Video.cs b/MediaBrowser.Controller/Entities/Video.cs index 8693d867c..52f1dd051 100644 --- a/MediaBrowser.Controller/Entities/Video.cs +++ b/MediaBrowser.Controller/Entities/Video.cs @@ -45,6 +45,12 @@ namespace MediaBrowser.Controller.Entities } [IgnoreDataMember] + public override bool SupportsPeople + { + get { return true; } + } + + [IgnoreDataMember] public override bool SupportsInheritedParentImages { get @@ -78,14 +84,6 @@ namespace MediaBrowser.Controller.Entities } } - public override double? GetDefaultPrimaryImageAspectRatio() - { - double value = 16; - value /= 9; - - return value; - } - public override string CreatePresentationUniqueKey() { if (!string.IsNullOrWhiteSpace(PrimaryVersionId)) @@ -406,30 +404,31 @@ namespace MediaBrowser.Controller.Entities } } - internal override bool IsValidFromResolver(BaseItem newItem) + internal override ItemUpdateType UpdateFromResolvedItem(BaseItem newItem) { - var current = this; + var updateType = base.UpdateFromResolvedItem(newItem); - var newAsVideo = newItem as Video; - - if (newAsVideo != null) + var newVideo = newItem as Video; + if (newVideo != null) { - if (!current.AdditionalParts.SequenceEqual(newAsVideo.AdditionalParts, StringComparer.OrdinalIgnoreCase)) + if (!AdditionalParts.SequenceEqual(newVideo.AdditionalParts, StringComparer.Ordinal)) { - return false; + AdditionalParts = newVideo.AdditionalParts; + updateType |= ItemUpdateType.MetadataImport; } - if (!current.LocalAlternateVersions.SequenceEqual(newAsVideo.LocalAlternateVersions, StringComparer.OrdinalIgnoreCase)) + if (!LocalAlternateVersions.SequenceEqual(newVideo.LocalAlternateVersions, StringComparer.Ordinal)) { - return false; + LocalAlternateVersions = newVideo.LocalAlternateVersions; + updateType |= ItemUpdateType.MetadataImport; } - - if (newAsVideo.VideoType != VideoType) + if (VideoType != newVideo.VideoType) { - return false; + VideoType = newVideo.VideoType; + updateType |= ItemUpdateType.MetadataImport; } } - return base.IsValidFromResolver(newItem); + return updateType; } public static string[] QueryPlayableStreamFiles(string rootPath, VideoType videoType) @@ -521,9 +520,9 @@ namespace MediaBrowser.Controller.Entities } } - public override async Task UpdateToRepository(ItemUpdateType updateReason, CancellationToken cancellationToken) + public override void UpdateToRepository(ItemUpdateType updateReason, CancellationToken cancellationToken) { - await base.UpdateToRepository(updateReason, cancellationToken).ConfigureAwait(false); + base.UpdateToRepository(updateReason, cancellationToken); var localAlternates = GetLocalAlternateVersionIds() .Select(i => LibraryManager.GetItemById(i)) @@ -540,7 +539,7 @@ namespace MediaBrowser.Controller.Entities item.Genres = Genres; item.ProviderIds = ProviderIds; - await item.UpdateToRepository(ItemUpdateType.MetadataDownload, cancellationToken).ConfigureAwait(false); + item.UpdateToRepository(ItemUpdateType.MetadataDownload, cancellationToken); } } diff --git a/MediaBrowser.Controller/Library/ILibraryManager.cs b/MediaBrowser.Controller/Library/ILibraryManager.cs index 3001e3366..37e0d5661 100644 --- a/MediaBrowser.Controller/Library/ILibraryManager.cs +++ b/MediaBrowser.Controller/Library/ILibraryManager.cs @@ -128,6 +128,8 @@ namespace MediaBrowser.Controller.Library /// </summary> void QueueLibraryScan(); + void UpdateImages(BaseItem item); + /// <summary> /// Gets the default view. /// </summary> @@ -207,11 +209,7 @@ namespace MediaBrowser.Controller.Library /// <summary> /// Updates the item. /// </summary> - /// <param name="item">The item.</param> - /// <param name="updateReason">The update reason.</param> - /// <param name="cancellationToken">The cancellation token.</param> - /// <returns>Task.</returns> - Task UpdateItem(BaseItem item, ItemUpdateType updateReason, CancellationToken cancellationToken); + void UpdateItem(BaseItem item, ItemUpdateType updateReason, CancellationToken cancellationToken); /// <summary> /// Retrieves the item. @@ -330,8 +328,7 @@ namespace MediaBrowser.Controller.Library /// <param name="viewType">Type of the view.</param> /// <param name="sortName">Name of the sort.</param> /// <param name="cancellationToken">The cancellation token.</param> - /// <returns>Task<UserView>.</returns> - Task<UserView> GetNamedView(string name, + UserView GetNamedView(string name, string viewType, string sortName, CancellationToken cancellationToken); @@ -345,8 +342,7 @@ namespace MediaBrowser.Controller.Library /// <param name="sortName">Name of the sort.</param> /// <param name="uniqueId">The unique identifier.</param> /// <param name="cancellationToken">The cancellation token.</param> - /// <returns>Task<UserView>.</returns> - Task<UserView> GetNamedView(string name, + UserView GetNamedView(string name, string parentId, string viewType, string sortName, diff --git a/MediaBrowser.Controller/Library/IUserViewManager.cs b/MediaBrowser.Controller/Library/IUserViewManager.cs index 76182c641..baecdd748 100644 --- a/MediaBrowser.Controller/Library/IUserViewManager.cs +++ b/MediaBrowser.Controller/Library/IUserViewManager.cs @@ -13,9 +13,9 @@ namespace MediaBrowser.Controller.Library { Task<Folder[]> GetUserViews(UserViewQuery query, CancellationToken cancellationToken); - Task<UserView> GetUserSubView(string name, string parentId, string type, string sortName, CancellationToken cancellationToken); + UserView GetUserSubViewWithName(string name, string parentId, string type, string sortName, CancellationToken cancellationToken); - Task<UserView> GetUserSubView(string category, string type, string sortName, CancellationToken cancellationToken); + UserView GetUserSubView(string category, string type, string localizationKey, string sortName, CancellationToken cancellationToken); List<Tuple<BaseItem, List<BaseItem>>> GetLatestItems(LatestItemsQuery request, DtoOptions options); } diff --git a/MediaBrowser.Controller/LiveTv/ILiveTvManager.cs b/MediaBrowser.Controller/LiveTv/ILiveTvManager.cs index be85e115c..4934cc1ca 100644 --- a/MediaBrowser.Controller/LiveTv/ILiveTvManager.cs +++ b/MediaBrowser.Controller/LiveTv/ILiveTvManager.cs @@ -76,16 +76,6 @@ namespace MediaBrowser.Controller.LiveTv void AddParts(IEnumerable<ILiveTvService> services, IEnumerable<ITunerHost> tunerHosts, IEnumerable<IListingsProvider> listingProviders); /// <summary> - /// Gets the recording. - /// </summary> - /// <param name="id">The identifier.</param> - /// <param name="options">The options.</param> - /// <param name="cancellationToken">The cancellation token.</param> - /// <param name="user">The user.</param> - /// <returns>Task{RecordingInfoDto}.</returns> - Task<BaseItemDto> GetRecording(string id, DtoOptions options, CancellationToken cancellationToken, User user = null); - - /// <summary> /// Gets the timer. /// </summary> /// <param name="id">The identifier.</param> @@ -236,14 +226,12 @@ namespace MediaBrowser.Controller.LiveTv /// <param name="query">The query.</param> /// <param name="options">The options.</param> /// <param name="cancellationToken">The cancellation token.</param> - /// <returns>Task{QueryResult{ProgramInfoDto}}.</returns> - Task<QueryResult<BaseItemDto>> GetRecommendedPrograms(RecommendedProgramQuery query, DtoOptions options, CancellationToken cancellationToken); + QueryResult<BaseItemDto> GetRecommendedPrograms(RecommendedProgramQuery query, DtoOptions options, CancellationToken cancellationToken); /// <summary> /// Gets the recommended programs internal. /// </summary> - /// <returns>Task<QueryResult<LiveTvProgram>>.</returns> - Task<QueryResult<BaseItem>> GetRecommendedProgramsInternal(RecommendedProgramQuery query, DtoOptions options, CancellationToken cancellationToken); + QueryResult<BaseItem> GetRecommendedProgramsInternal(RecommendedProgramQuery query, DtoOptions options, CancellationToken cancellationToken); /// <summary> /// Gets the live tv information. @@ -264,8 +252,7 @@ namespace MediaBrowser.Controller.LiveTv /// Gets the live tv folder. /// </summary> /// <param name="cancellationToken">The cancellation token.</param> - /// <returns>BaseItemDto.</returns> - Task<Folder> GetInternalLiveTvFolder(CancellationToken cancellationToken); + Folder GetInternalLiveTvFolder(CancellationToken cancellationToken); /// <summary> /// Gets the live tv folder. @@ -273,7 +260,7 @@ namespace MediaBrowser.Controller.LiveTv /// <param name="userId">The user identifier.</param> /// <param name="cancellationToken">The cancellation token.</param> /// <returns>BaseItemDto.</returns> - Task<BaseItemDto> GetLiveTvFolder(string userId, CancellationToken cancellationToken); + BaseItemDto GetLiveTvFolder(string userId, CancellationToken cancellationToken); /// <summary> /// Gets the enabled users. @@ -284,7 +271,7 @@ namespace MediaBrowser.Controller.LiveTv /// <summary> /// Gets the internal channels. /// </summary> - Task<QueryResult<BaseItem>> GetInternalChannels(LiveTvChannelQuery query, DtoOptions dtoOptions, CancellationToken cancellationToken); + QueryResult<BaseItem> GetInternalChannels(LiveTvChannelQuery query, DtoOptions dtoOptions, CancellationToken cancellationToken); /// <summary> /// Gets the internal recordings. @@ -362,13 +349,6 @@ namespace MediaBrowser.Controller.LiveTv /// <param name="user">The user.</param> void AddChannelInfo(List<Tuple<BaseItemDto, LiveTvChannel>> items, DtoOptions options, User user); - /// <summary> - /// Called when [recording file deleted]. - /// </summary> - /// <param name="recording">The recording.</param> - /// <returns>Task.</returns> - Task OnRecordingFileDeleted(BaseItem recording); - Task<List<ChannelInfo>> GetChannelsForListingsProvider(string id, CancellationToken cancellationToken); Task<List<ChannelInfo>> GetChannelsFromListingsProviderData(string id, CancellationToken cancellationToken); diff --git a/MediaBrowser.Controller/LiveTv/ITunerHost.cs b/MediaBrowser.Controller/LiveTv/ITunerHost.cs index 2019259c5..523eec24a 100644 --- a/MediaBrowser.Controller/LiveTv/ITunerHost.cs +++ b/MediaBrowser.Controller/LiveTv/ITunerHost.cs @@ -59,8 +59,8 @@ namespace MediaBrowser.Controller.LiveTv public interface ILiveStream { - Task Open(CancellationToken cancellationToken); - Task Close(); + Task Open(CancellationToken openCancellationToken); + void Close(); int ConsumerCount { get; } string OriginalStreamId { get; set; } bool EnableStreamSharing { get; set; } diff --git a/MediaBrowser.Controller/LiveTv/LiveTvAudioRecording.cs b/MediaBrowser.Controller/LiveTv/LiveTvAudioRecording.cs index 8fa96076b..bd84541f8 100644 --- a/MediaBrowser.Controller/LiveTv/LiveTvAudioRecording.cs +++ b/MediaBrowser.Controller/LiveTv/LiveTvAudioRecording.cs @@ -132,7 +132,7 @@ namespace MediaBrowser.Controller.LiveTv return true; } - public override bool IsAuthorizedToDelete(User user) + public override bool IsAuthorizedToDelete(User user, List<Folder> allCollectionFolders) { return user.Policy.EnableLiveTvManagement; } @@ -161,10 +161,5 @@ namespace MediaBrowser.Controller.LiveTv { return LiveTvManager.DeleteRecording(this); } - - public override Task OnFileDeleted() - { - return LiveTvManager.OnRecordingFileDeleted(this); - } } } diff --git a/MediaBrowser.Controller/LiveTv/LiveTvChannel.cs b/MediaBrowser.Controller/LiveTv/LiveTvChannel.cs index 4a93d0399..16010b7f5 100644 --- a/MediaBrowser.Controller/LiveTv/LiveTvChannel.cs +++ b/MediaBrowser.Controller/LiveTv/LiveTvChannel.cs @@ -136,7 +136,8 @@ namespace MediaBrowser.Controller.LiveTv Name = Name, Path = Path, RunTimeTicks = RunTimeTicks, - Type = MediaSourceType.Placeholder + Type = MediaSourceType.Placeholder, + IsInfiniteStream = RunTimeTicks == null }; list.Add(info); diff --git a/MediaBrowser.Controller/LiveTv/LiveTvProgram.cs b/MediaBrowser.Controller/LiveTv/LiveTvProgram.cs index 1c1637330..9dff18690 100644 --- a/MediaBrowser.Controller/LiveTv/LiveTvProgram.cs +++ b/MediaBrowser.Controller/LiveTv/LiveTvProgram.cs @@ -50,21 +50,40 @@ namespace MediaBrowser.Controller.LiveTv public static double? GetDefaultPrimaryImageAspectRatio(IHasProgramAttributes item) { var serviceName = item.ServiceName; - if (!item.IsMovie - && !string.Equals(serviceName, EmbyServiceName, StringComparison.OrdinalIgnoreCase) - && !string.Equals(serviceName, "Next Pvr", StringComparison.OrdinalIgnoreCase)) + + if (item.IsMovie) { - double value = 16; - value /= 9; + if (string.Equals(serviceName, EmbyServiceName, StringComparison.OrdinalIgnoreCase) || string.Equals(serviceName, "Next Pvr", StringComparison.OrdinalIgnoreCase)) + { + double value = 2; + value /= 3; + + return value; + } + else + { + double value = 16; + value /= 9; - return value; + return value; + } } else { - double value = 2; - value /= 3; + if (string.Equals(serviceName, EmbyServiceName, StringComparison.OrdinalIgnoreCase) || string.Equals(serviceName, "Next Pvr", StringComparison.OrdinalIgnoreCase)) + { + double value = 2; + value /= 3; - return value; + return value; + } + else + { + double value = 16; + value /= 9; + + return value; + } } } diff --git a/MediaBrowser.Controller/LiveTv/LiveTvVideoRecording.cs b/MediaBrowser.Controller/LiveTv/LiveTvVideoRecording.cs index c5fe7b1b3..37c1faac6 100644 --- a/MediaBrowser.Controller/LiveTv/LiveTvVideoRecording.cs +++ b/MediaBrowser.Controller/LiveTv/LiveTvVideoRecording.cs @@ -131,7 +131,7 @@ namespace MediaBrowser.Controller.LiveTv return true; } - public override bool IsAuthorizedToDelete(User user) + public override bool IsAuthorizedToDelete(User user, List<Folder> allCollectionFolders) { return user.Policy.EnableLiveTvManagement; } @@ -160,10 +160,5 @@ namespace MediaBrowser.Controller.LiveTv { return LiveTvManager.DeleteRecording(this); } - - public override Task OnFileDeleted() - { - return LiveTvManager.OnRecordingFileDeleted(this); - } } } diff --git a/MediaBrowser.Controller/MediaBrowser.Controller.csproj b/MediaBrowser.Controller/MediaBrowser.Controller.csproj index b33993859..dafca0598 100644 --- a/MediaBrowser.Controller/MediaBrowser.Controller.csproj +++ b/MediaBrowser.Controller/MediaBrowser.Controller.csproj @@ -176,6 +176,7 @@ <Compile Include="MediaEncoding\MediaStreamSelector.cs" /> <Compile Include="Net\AuthenticatedAttribute.cs" /> <Compile Include="Net\AuthorizationInfo.cs" /> + <Compile Include="Net\BasePeriodicWebSocketListener.cs" /> <Compile Include="Net\IAuthorizationContext.cs" /> <Compile Include="Net\IAuthService.cs" /> <Compile Include="Net\IHasResultFactory.cs" /> @@ -219,7 +220,6 @@ <Compile Include="Providers\IExternalId.cs" /> <Compile Include="Providers\IExtrasProvider.cs" /> <Compile Include="Providers\IForcedProvider.cs" /> - <Compile Include="Providers\IHasChangeMonitor.cs" /> <Compile Include="Entities\IHasMetadata.cs" /> <Compile Include="Providers\IHasItemChangeMonitor.cs" /> <Compile Include="Providers\IHasLookupInfo.cs" /> diff --git a/MediaBrowser.Controller/MediaEncoding/EncodingHelper.cs b/MediaBrowser.Controller/MediaEncoding/EncodingHelper.cs index 8b612f809..bddafe9a6 100644 --- a/MediaBrowser.Controller/MediaEncoding/EncodingHelper.cs +++ b/MediaBrowser.Controller/MediaEncoding/EncodingHelper.cs @@ -794,11 +794,6 @@ namespace MediaBrowser.Controller.MediaEncoding return false; } - if (state.EnableMpDecimate) - { - return false; - } - if (videoStream.IsInterlaced) { if (state.DeInterlace(videoStream.Codec, false)) @@ -1515,11 +1510,6 @@ namespace MediaBrowser.Controller.MediaEncoding } } - if (state.EnableMpDecimate) - { - filters.Add("mpdecimate,setpts=N/FRAME_RATE/TB"); - } - if (filters.Count > 0) { output += string.Format(" -vf \"{0}\"", string.Join(",", filters.ToArray())); @@ -1638,7 +1628,7 @@ namespace MediaBrowser.Controller.MediaEncoding if (state.InputProtocol == MediaProtocol.Rtsp) { - inputModifier += " -rtsp_transport tcp"; + inputModifier += " -rtsp_transport tcp -rtsp_transport udp -rtsp_flags prefer_tcp"; } if (!string.IsNullOrEmpty(state.InputAudioSync)) @@ -1960,6 +1950,12 @@ namespace MediaBrowser.Controller.MediaEncoding return "-c:v h264_mmal"; } break; + case "mpeg2video": + if (_mediaEncoder.SupportsDecoder("mpeg2_mmal") && encodingOptions.HardwareDecodingCodecs.Contains("mpeg2video", StringComparer.OrdinalIgnoreCase)) + { + return "-c:v mpeg2_mmal"; + } + break; } } } diff --git a/MediaBrowser.Controller/MediaEncoding/EncodingJobInfo.cs b/MediaBrowser.Controller/MediaEncoding/EncodingJobInfo.cs index 506fce3ca..ad131064c 100644 --- a/MediaBrowser.Controller/MediaEncoding/EncodingJobInfo.cs +++ b/MediaBrowser.Controller/MediaEncoding/EncodingJobInfo.cs @@ -127,11 +127,6 @@ namespace MediaBrowser.Controller.MediaEncoding } } - public bool EnableMpDecimate - { - get { return MediaSource.EnableMpDecimate; } - } - public string AlbumCoverPath { get; set; } public string InputAudioSync { get; set; } diff --git a/MediaBrowser.Api/BasePeriodicWebSocketListener.cs b/MediaBrowser.Controller/Net/BasePeriodicWebSocketListener.cs index c7a9d97ba..6be94e7e6 100644 --- a/MediaBrowser.Api/BasePeriodicWebSocketListener.cs +++ b/MediaBrowser.Controller/Net/BasePeriodicWebSocketListener.cs @@ -4,12 +4,11 @@ using System.Globalization; using System.Linq; using System.Threading; using System.Threading.Tasks; -using MediaBrowser.Controller.Net; using MediaBrowser.Model.Logging; using MediaBrowser.Model.Net; using MediaBrowser.Model.Threading; -namespace MediaBrowser.Api +namespace MediaBrowser.Controller.Net { /// <summary> /// Starts sending data over a web socket periodically when a message is received, and then stops when a corresponding stop message is received @@ -93,7 +92,7 @@ namespace MediaBrowser.Api { get { - return true; + return false; } } diff --git a/MediaBrowser.Controller/Notifications/INotificationManager.cs b/MediaBrowser.Controller/Notifications/INotificationManager.cs index f9d264314..68cfd6ff1 100644 --- a/MediaBrowser.Controller/Notifications/INotificationManager.cs +++ b/MediaBrowser.Controller/Notifications/INotificationManager.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; +using MediaBrowser.Controller.Entities; namespace MediaBrowser.Controller.Notifications { @@ -15,6 +16,8 @@ namespace MediaBrowser.Controller.Notifications /// <returns>Task.</returns> Task SendNotification(NotificationRequest request, CancellationToken cancellationToken); + Task SendNotification(NotificationRequest request, BaseItem relatedItem, CancellationToken cancellationToken); + /// <summary> /// Adds the parts. /// </summary> diff --git a/MediaBrowser.Controller/Persistence/IItemRepository.cs b/MediaBrowser.Controller/Persistence/IItemRepository.cs index 3d05d2fca..4cb3e2bb6 100644 --- a/MediaBrowser.Controller/Persistence/IItemRepository.cs +++ b/MediaBrowser.Controller/Persistence/IItemRepository.cs @@ -48,6 +48,8 @@ namespace MediaBrowser.Controller.Persistence /// <param name="cancellationToken">The cancellation token.</param> void SaveItems(List<BaseItem> items, CancellationToken cancellationToken); + void SaveImages(BaseItem item); + /// <summary> /// Retrieves the item. /// </summary> diff --git a/MediaBrowser.Controller/Playlists/Playlist.cs b/MediaBrowser.Controller/Playlists/Playlist.cs index ee96a8c3b..071f8a096 100644 --- a/MediaBrowser.Controller/Playlists/Playlist.cs +++ b/MediaBrowser.Controller/Playlists/Playlist.cs @@ -73,7 +73,7 @@ namespace MediaBrowser.Controller.Playlists return 1; } - public override bool IsAuthorizedToDelete(User user) + public override bool IsAuthorizedToDelete(User user, List<Folder> allCollectionFolders) { return true; } diff --git a/MediaBrowser.Controller/Providers/IHasChangeMonitor.cs b/MediaBrowser.Controller/Providers/IHasChangeMonitor.cs deleted file mode 100644 index aa0b0e3c9..000000000 --- a/MediaBrowser.Controller/Providers/IHasChangeMonitor.cs +++ /dev/null @@ -1,17 +0,0 @@ -using MediaBrowser.Controller.Entities; -using System; - -namespace MediaBrowser.Controller.Providers -{ - public interface IHasChangeMonitor - { - /// <summary> - /// Determines whether the specified item has changed. - /// </summary> - /// <param name="item">The item.</param> - /// <param name="directoryService">The directory service.</param> - /// <param name="date">The date.</param> - /// <returns><c>true</c> if the specified item has changed; otherwise, <c>false</c>.</returns> - bool HasChanged(IHasMetadata item, IDirectoryService directoryService, DateTime date); - } -} diff --git a/MediaBrowser.Controller/Providers/IMetadataService.cs b/MediaBrowser.Controller/Providers/IMetadataService.cs index 2d4873f7e..7b7bf166b 100644 --- a/MediaBrowser.Controller/Providers/IMetadataService.cs +++ b/MediaBrowser.Controller/Providers/IMetadataService.cs @@ -1,4 +1,5 @@ -using MediaBrowser.Controller.Entities; +using System; +using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Library; using System.Threading; using System.Threading.Tasks; @@ -13,6 +14,7 @@ namespace MediaBrowser.Controller.Providers /// <param name="item">The item.</param> /// <returns><c>true</c> if this instance can refresh the specified item; otherwise, <c>false</c>.</returns> bool CanRefresh(IHasMetadata item); + bool CanRefreshPrimary(Type type); /// <summary> /// Refreshes the metadata. diff --git a/MediaBrowser.Controller/Providers/IProviderManager.cs b/MediaBrowser.Controller/Providers/IProviderManager.cs index 77e6a7e40..c2cbda11d 100644 --- a/MediaBrowser.Controller/Providers/IProviderManager.cs +++ b/MediaBrowser.Controller/Providers/IProviderManager.cs @@ -119,16 +119,12 @@ namespace MediaBrowser.Controller.Providers /// <param name="item">The item.</param> /// <param name="updateType">Type of the update.</param> /// <returns>Task.</returns> - Task SaveMetadata(IHasMetadata item, ItemUpdateType updateType); + void SaveMetadata(IHasMetadata item, ItemUpdateType updateType); /// <summary> /// Saves the metadata. /// </summary> - /// <param name="item">The item.</param> - /// <param name="updateType">Type of the update.</param> - /// <param name="savers">The savers.</param> - /// <returns>Task.</returns> - Task SaveMetadata(IHasMetadata item, ItemUpdateType updateType, IEnumerable<string> savers); + void SaveMetadata(IHasMetadata item, ItemUpdateType updateType, IEnumerable<string> savers); /// <summary> /// Gets the metadata options. diff --git a/MediaBrowser.Controller/Providers/MetadataResult.cs b/MediaBrowser.Controller/Providers/MetadataResult.cs index 5ed55ea16..f35d41ca4 100644 --- a/MediaBrowser.Controller/Providers/MetadataResult.cs +++ b/MediaBrowser.Controller/Providers/MetadataResult.cs @@ -20,6 +20,7 @@ namespace MediaBrowser.Controller.Providers public bool HasMetadata { get; set; } public T Item { get; set; } public string ResultLanguage { get; set; } + public string Provider { get; set; } public bool QueriedById { get; set; } public void AddPerson(PersonInfo p) { diff --git a/MediaBrowser.Controller/Sync/ISyncManager.cs b/MediaBrowser.Controller/Sync/ISyncManager.cs index 910d697ec..0bf4b914f 100644 --- a/MediaBrowser.Controller/Sync/ISyncManager.cs +++ b/MediaBrowser.Controller/Sync/ISyncManager.cs @@ -91,8 +91,6 @@ namespace MediaBrowser.Controller.Sync /// </summary> List<SyncTarget> GetSyncTargets(string userId); - List<SyncTarget> GetSyncTargets(string userId, bool? supportsRemoteSync); - /// <summary> /// Supportses the synchronize. /// </summary> diff --git a/MediaBrowser.Controller/Sync/ISyncProvider.cs b/MediaBrowser.Controller/Sync/ISyncProvider.cs index 2f60e124e..baee1a52f 100644 --- a/MediaBrowser.Controller/Sync/ISyncProvider.cs +++ b/MediaBrowser.Controller/Sync/ISyncProvider.cs @@ -11,8 +11,6 @@ namespace MediaBrowser.Controller.Sync /// <value>The name.</value> string Name { get; } - bool SupportsRemoteSync { get; } - /// <summary> /// Gets the synchronize targets. /// </summary> diff --git a/MediaBrowser.Model/Configuration/ServerConfiguration.cs b/MediaBrowser.Model/Configuration/ServerConfiguration.cs index f7fffbf79..65b054b0c 100644 --- a/MediaBrowser.Model/Configuration/ServerConfiguration.cs +++ b/MediaBrowser.Model/Configuration/ServerConfiguration.cs @@ -183,6 +183,7 @@ namespace MediaBrowser.Model.Configuration public bool EnableExternalContentInSuggestions { get; set; } public bool RequireHttps { get; set; } public bool IsBehindProxy { get; set; } + public bool EnableNewOmdbSupport { get; set; } public int ImageExtractionTimeoutMs { get; set; } @@ -343,8 +344,8 @@ namespace MediaBrowser.Model.Configuration Type = ImageType.Logo } }, - - DisabledImageFetchers = new [] {"FanArt"} + DisabledMetadataFetchers = new []{ "The Open Movie Database" }, + DisabledImageFetchers = new []{ "The Open Movie Database", "FanArt" } }, new MetadataOptions(1, 1280) @@ -389,7 +390,9 @@ namespace MediaBrowser.Model.Configuration Limit = 1, Type = ImageType.Logo } - } + }, + DisabledMetadataFetchers = new []{ "TheMovieDb" }, + DisabledImageFetchers = new []{ "TheMovieDb" } }, new MetadataOptions(1, 1280) diff --git a/MediaBrowser.Model/Devices/DeviceInfo.cs b/MediaBrowser.Model/Devices/DeviceInfo.cs index d8358977e..d2ee3fdcc 100644 --- a/MediaBrowser.Model/Devices/DeviceInfo.cs +++ b/MediaBrowser.Model/Devices/DeviceInfo.cs @@ -21,17 +21,7 @@ namespace MediaBrowser.Model.Devices /// <value>The camera upload path.</value> public string CameraUploadPath { get; set; } - /// <summary> - /// Gets the name. - /// </summary> - /// <value>The name.</value> - public string Name - { - get - { - return string.IsNullOrEmpty(CustomName) ? ReportedName : CustomName; - } - } + public string Name { get; set; } /// <summary> /// Gets or sets the identifier. diff --git a/MediaBrowser.Model/Dlna/StreamBuilder.cs b/MediaBrowser.Model/Dlna/StreamBuilder.cs index 95a80c34c..a11c88697 100644 --- a/MediaBrowser.Model/Dlna/StreamBuilder.cs +++ b/MediaBrowser.Model/Dlna/StreamBuilder.cs @@ -686,7 +686,7 @@ namespace MediaBrowser.Model.Dlna if (subtitleStream != null) { - SubtitleProfile subtitleProfile = GetSubtitleProfile(subtitleStream, options.Profile.SubtitleProfiles, directPlay.Value, _transcoderSupport, null, null); + SubtitleProfile subtitleProfile = GetSubtitleProfile(item, subtitleStream, options.Profile.SubtitleProfiles, directPlay.Value, _transcoderSupport, null, null); playlistItem.SubtitleDeliveryMethod = subtitleProfile.Method; playlistItem.SubtitleFormat = subtitleProfile.Format; @@ -728,7 +728,7 @@ namespace MediaBrowser.Model.Dlna if (subtitleStream != null) { - SubtitleProfile subtitleProfile = GetSubtitleProfile(subtitleStream, options.Profile.SubtitleProfiles, PlayMethod.Transcode, _transcoderSupport, transcodingProfile.Protocol, transcodingProfile.Container); + SubtitleProfile subtitleProfile = GetSubtitleProfile(item, subtitleStream, options.Profile.SubtitleProfiles, PlayMethod.Transcode, _transcoderSupport, transcodingProfile.Protocol, transcodingProfile.Container); playlistItem.SubtitleDeliveryMethod = subtitleProfile.Method; playlistItem.SubtitleFormat = subtitleProfile.Format; @@ -1054,15 +1054,6 @@ namespace MediaBrowser.Model.Dlna string videoCodec = videoStream == null ? null : videoStream.Codec; - if (string.IsNullOrEmpty(videoCodec)) - { - _logger.Info("Profile: {0}, DirectPlay=false. Reason=Unknown video codec. Path: {1}", - profile.Name ?? "Unknown Profile", - mediaSource.Path ?? "Unknown path"); - - return new Tuple<PlayMethod?, List<TranscodeReason>>(null, new List<TranscodeReason> { TranscodeReason.UnknownVideoStreamInfo }); - } - conditions = new List<ProfileCondition>(); foreach (CodecProfile i in profile.CodecProfiles) { @@ -1189,7 +1180,7 @@ namespace MediaBrowser.Model.Dlna { if (subtitleStream != null) { - SubtitleProfile subtitleProfile = GetSubtitleProfile(subtitleStream, options.Profile.SubtitleProfiles, playMethod, _transcoderSupport, null, null); + SubtitleProfile subtitleProfile = GetSubtitleProfile(item, subtitleStream, options.Profile.SubtitleProfiles, playMethod, _transcoderSupport, null, null); if (subtitleProfile.Method != SubtitleDeliveryMethod.External && subtitleProfile.Method != SubtitleDeliveryMethod.Embed) { @@ -1208,7 +1199,7 @@ namespace MediaBrowser.Model.Dlna return new Tuple<bool, TranscodeReason?>(result, TranscodeReason.ContainerBitrateExceedsLimit); } - public static SubtitleProfile GetSubtitleProfile(MediaStream subtitleStream, SubtitleProfile[] subtitleProfiles, PlayMethod playMethod, ITranscoderSupport transcoderSupport, string transcodingSubProtocol, string transcodingContainer) + public static SubtitleProfile GetSubtitleProfile(MediaSourceInfo mediaSource, MediaStream subtitleStream, SubtitleProfile[] subtitleProfiles, PlayMethod playMethod, ITranscoderSupport transcoderSupport, string transcodingSubProtocol, string transcodingContainer) { if (!subtitleStream.IsExternal && (playMethod != PlayMethod.Transcode || !string.Equals(transcodingSubProtocol, "hls", StringComparison.OrdinalIgnoreCase))) { @@ -1262,8 +1253,8 @@ namespace MediaBrowser.Model.Dlna } // Look for an external or hls profile that matches the stream type (text/graphical) and doesn't require conversion - return GetExternalSubtitleProfile(subtitleStream, subtitleProfiles, playMethod, transcoderSupport, false) ?? - GetExternalSubtitleProfile(subtitleStream, subtitleProfiles, playMethod, transcoderSupport, true) ?? + return GetExternalSubtitleProfile(mediaSource, subtitleStream, subtitleProfiles, playMethod, transcoderSupport, false) ?? + GetExternalSubtitleProfile(mediaSource, subtitleStream, subtitleProfiles, playMethod, transcoderSupport, true) ?? new SubtitleProfile { Method = SubtitleDeliveryMethod.Encode, @@ -1299,7 +1290,7 @@ namespace MediaBrowser.Model.Dlna return false; } - private static SubtitleProfile GetExternalSubtitleProfile(MediaStream subtitleStream, SubtitleProfile[] subtitleProfiles, PlayMethod playMethod, ITranscoderSupport transcoderSupport, bool allowConversion) + private static SubtitleProfile GetExternalSubtitleProfile(MediaSourceInfo mediaSource, MediaStream subtitleStream, SubtitleProfile[] subtitleProfiles, PlayMethod playMethod, ITranscoderSupport transcoderSupport, bool allowConversion) { foreach (SubtitleProfile profile in subtitleProfiles) { @@ -1338,6 +1329,12 @@ namespace MediaBrowser.Model.Dlna continue; } + // TODO: Build this into subtitleStream.SupportsExternalStream + if (mediaSource.IsInfiniteStream) + { + continue; + } + if (subtitleStream.IsTextSubtitleStream && subtitleStream.SupportsExternalStream && subtitleStream.SupportsSubtitleConversionTo(profile.Format)) { return profile; diff --git a/MediaBrowser.Model/Dlna/StreamInfo.cs b/MediaBrowser.Model/Dlna/StreamInfo.cs index 5a059e91d..93a46aaf4 100644 --- a/MediaBrowser.Model/Dlna/StreamInfo.cs +++ b/MediaBrowser.Model/Dlna/StreamInfo.cs @@ -466,7 +466,7 @@ namespace MediaBrowser.Model.Dlna private SubtitleStreamInfo GetSubtitleStreamInfo(MediaStream stream, string baseUrl, string accessToken, long startPositionTicks, SubtitleProfile[] subtitleProfiles, ITranscoderSupport transcoderSupport) { - SubtitleProfile subtitleProfile = StreamBuilder.GetSubtitleProfile(stream, subtitleProfiles, PlayMethod, transcoderSupport, SubProtocol, Container); + SubtitleProfile subtitleProfile = StreamBuilder.GetSubtitleProfile(MediaSource, stream, subtitleProfiles, PlayMethod, transcoderSupport, SubProtocol, Container); SubtitleStreamInfo info = new SubtitleStreamInfo { IsForced = stream.IsForced, @@ -480,7 +480,7 @@ namespace MediaBrowser.Model.Dlna if (info.DeliveryMethod == SubtitleDeliveryMethod.External) { - if (MediaSource.Protocol == MediaProtocol.File || !StringHelper.EqualsIgnoreCase(stream.Codec, subtitleProfile.Format)) + if (MediaSource.Protocol == MediaProtocol.File || !StringHelper.EqualsIgnoreCase(stream.Codec, subtitleProfile.Format) || !stream.IsExternal) { info.Url = string.Format("{0}/Videos/{1}/{2}/Subtitles/{3}/{4}/Stream.{5}", baseUrl, diff --git a/MediaBrowser.Model/Dto/MediaSourceInfo.cs b/MediaBrowser.Model/Dto/MediaSourceInfo.cs index 27920bdf3..d6301b331 100644 --- a/MediaBrowser.Model/Dto/MediaSourceInfo.cs +++ b/MediaBrowser.Model/Dto/MediaSourceInfo.cs @@ -40,7 +40,6 @@ namespace MediaBrowser.Model.Dto public string OpenToken { get; set; } public bool RequiresClosing { get; set; } public bool SupportsProbing { get; set; } - public bool EnableMpDecimate { get; set; } public string LiveStreamId { get; set; } public int? BufferMs { get; set; } diff --git a/MediaBrowser.Model/LiveTv/BaseTimerInfoDto.cs b/MediaBrowser.Model/LiveTv/BaseTimerInfoDto.cs index 7c9fe0790..e4d32ca4a 100644 --- a/MediaBrowser.Model/LiveTv/BaseTimerInfoDto.cs +++ b/MediaBrowser.Model/LiveTv/BaseTimerInfoDto.cs @@ -41,6 +41,8 @@ namespace MediaBrowser.Model.LiveTv /// </summary> public string ChannelName { get; set; } + public string ChannelPrimaryImageTag { get; set; } + /// <summary> /// Gets or sets the program identifier. /// </summary> diff --git a/MediaBrowser.Model/LiveTv/LiveTvOptions.cs b/MediaBrowser.Model/LiveTv/LiveTvOptions.cs index a70a1066d..f177233f9 100644 --- a/MediaBrowser.Model/LiveTv/LiveTvOptions.cs +++ b/MediaBrowser.Model/LiveTv/LiveTvOptions.cs @@ -13,7 +13,6 @@ namespace MediaBrowser.Model.LiveTv public string RecordingEncodingFormat { get; set; } public bool EnableRecordingSubfolders { get; set; } public bool EnableOriginalAudioWithEncodedRecordings { get; set; } - public string RecordedVideoCodec { get; set; } public TunerHostInfo[] TunerHosts { get; set; } public ListingsProviderInfo[] ListingProviders { get; set; } @@ -46,7 +45,6 @@ namespace MediaBrowser.Model.LiveTv public bool ImportFavoritesOnly { get; set; } public bool AllowHWTranscoding { get; set; } public bool EnableStreamLooping { get; set; } - public bool EnableMpDecimate { get; set; } public bool EnableNewHdhrChannelIds { get; set; } public string Source { get; set; } diff --git a/MediaBrowser.Model/Tasks/ITaskManager.cs b/MediaBrowser.Model/Tasks/ITaskManager.cs index fa3da97b3..1674fc107 100644 --- a/MediaBrowser.Model/Tasks/ITaskManager.cs +++ b/MediaBrowser.Model/Tasks/ITaskManager.cs @@ -74,5 +74,7 @@ namespace MediaBrowser.Model.Tasks event EventHandler<GenericEventArgs<IScheduledTaskWorker>> TaskExecuting; event EventHandler<TaskCompletionEventArgs> TaskCompleted; + + void RunTaskOnNextStartup(string key); } }
\ No newline at end of file diff --git a/MediaBrowser.Model/Users/UserPolicy.cs b/MediaBrowser.Model/Users/UserPolicy.cs index 84ee5d637..de2e9cc04 100644 --- a/MediaBrowser.Model/Users/UserPolicy.cs +++ b/MediaBrowser.Model/Users/UserPolicy.cs @@ -44,6 +44,7 @@ namespace MediaBrowser.Model.Users public bool EnablePlaybackRemuxing { get; set; } public bool EnableContentDeletion { get; set; } + public string[] EnableContentDeletionFromFolders { get; set; } public bool EnableContentDownloading { get; set; } /// <summary> @@ -73,6 +74,7 @@ namespace MediaBrowser.Model.Users public UserPolicy() { EnableContentDeletion = true; + EnableContentDeletionFromFolders = new string[] { }; EnableSyncTranscoding = true; diff --git a/MediaBrowser.Providers/Books/GoogleBooksProvider.cs b/MediaBrowser.Providers/Books/GoogleBooksProvider.cs new file mode 100644 index 000000000..7330b8c43 --- /dev/null +++ b/MediaBrowser.Providers/Books/GoogleBooksProvider.cs @@ -0,0 +1,45 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using MediaBrowser.Common.Net; +using MediaBrowser.Controller.Entities; +using MediaBrowser.Controller.Entities.TV; +using MediaBrowser.Controller.Providers; +using MediaBrowser.Model.Providers; + +namespace MediaBrowser.Providers.Books +{ + public class GoogleBooksProvider : IRemoteMetadataProvider<AudioBook, SongInfo> + { + public string Name => "Google Books"; + private readonly IHttpClient _httpClient; + + public GoogleBooksProvider(IHttpClient httpClient) + { + _httpClient = httpClient; + } + + public Task<HttpResponseInfo> GetImageResponse(string url, CancellationToken cancellationToken) + { + return _httpClient.GetResponse(new HttpRequestOptions + { + CancellationToken = cancellationToken, + Url = url, + BufferContent = false + }); + } + + public async Task<MetadataResult<AudioBook>> GetMetadata(SongInfo info, CancellationToken cancellationToken) + { + return new MetadataResult<AudioBook>(); + } + + public async Task<IEnumerable<RemoteSearchResult>> GetSearchResults(SongInfo searchInfo, CancellationToken cancellationToken) + { + return new List<RemoteSearchResult>(); + } + } +} diff --git a/MediaBrowser.Providers/BoxSets/MovieDbBoxSetProvider.cs b/MediaBrowser.Providers/BoxSets/MovieDbBoxSetProvider.cs index e271772cc..17b0646ed 100644 --- a/MediaBrowser.Providers/BoxSets/MovieDbBoxSetProvider.cs +++ b/MediaBrowser.Providers/BoxSets/MovieDbBoxSetProvider.cs @@ -179,7 +179,7 @@ namespace MediaBrowser.Providers.BoxSets RootObject mainResult = null; - using (var json = await MovieDbProvider.Current.GetMovieDbResponse(new HttpRequestOptions + using (var response = await MovieDbProvider.Current.GetMovieDbResponse(new HttpRequestOptions { Url = url, CancellationToken = cancellationToken, @@ -187,7 +187,10 @@ namespace MediaBrowser.Providers.BoxSets }).ConfigureAwait(false)) { - mainResult = _json.DeserializeFromStream<RootObject>(json); + using (var json = response.Content) + { + mainResult = _json.DeserializeFromStream<RootObject>(json); + } } cancellationToken.ThrowIfCancellationRequested(); @@ -204,7 +207,7 @@ namespace MediaBrowser.Providers.BoxSets url += "&include_image_language=" + MovieDbProvider.GetImageLanguagesParam(language); } - using (var json = await MovieDbProvider.Current.GetMovieDbResponse(new HttpRequestOptions + using (var response = await MovieDbProvider.Current.GetMovieDbResponse(new HttpRequestOptions { Url = url, CancellationToken = cancellationToken, @@ -212,7 +215,10 @@ namespace MediaBrowser.Providers.BoxSets }).ConfigureAwait(false)) { - mainResult = _json.DeserializeFromStream<RootObject>(json); + using (var json = response.Content) + { + mainResult = _json.DeserializeFromStream<RootObject>(json); + } } } } diff --git a/MediaBrowser.Providers/Manager/ItemImageProvider.cs b/MediaBrowser.Providers/Manager/ItemImageProvider.cs index 00fd54271..4419b48cb 100644 --- a/MediaBrowser.Providers/Manager/ItemImageProvider.cs +++ b/MediaBrowser.Providers/Manager/ItemImageProvider.cs @@ -517,21 +517,11 @@ namespace MediaBrowser.Providers.Manager return true; } - if (libraryOptions.DownloadImagesInAdvance) - { - return false; - } - if (item.LocationType == LocationType.Remote || item.LocationType == LocationType.Virtual) { return true; } - if (!item.IsSaveLocalMetadataEnabled()) - { - return true; - } - if (item is IItemByName && !(item is MusicArtist)) { var hasDualAccess = item as IHasDualAccess; @@ -541,13 +531,17 @@ namespace MediaBrowser.Providers.Manager } } - switch (type) + if (libraryOptions.DownloadImagesInAdvance) { - case ImageType.Primary: - return true; - default: - return true; + return false; } + + //if (!item.IsSaveLocalMetadataEnabled()) + //{ + // return true; + //} + + return true; } private void SaveImageStub(IHasMetadata item, ImageType imageType, IEnumerable<string> urls) diff --git a/MediaBrowser.Providers/Manager/MetadataService.cs b/MediaBrowser.Providers/Manager/MetadataService.cs index b93f78341..af03e21b2 100644 --- a/MediaBrowser.Providers/Manager/MetadataService.cs +++ b/MediaBrowser.Providers/Manager/MetadataService.cs @@ -13,6 +13,7 @@ using System.Threading.Tasks; using MediaBrowser.Model.IO; using MediaBrowser.Model.Configuration; using MediaBrowser.Model.Providers; +using MediaBrowser.Providers.MediaInfo; namespace MediaBrowser.Providers.Manager { @@ -47,17 +48,45 @@ namespace MediaBrowser.Providers.Manager var libraryOptions = LibraryManager.GetLibraryOptions((BaseItem)item); - if (refreshOptions.MetadataRefreshMode != MetadataRefreshMode.None) + if (!requiresRefresh && libraryOptions.AutomaticRefreshIntervalDays > 0 && (DateTime.UtcNow - item.DateLastRefreshed).TotalDays >= libraryOptions.AutomaticRefreshIntervalDays) { - // TODO: If this returns true, should we instead just change metadata refresh mode to Full? - requiresRefresh = item.RequiresRefresh(); + requiresRefresh = true; } - if (!requiresRefresh && - libraryOptions.AutomaticRefreshIntervalDays > 0 && - (DateTime.UtcNow - item.DateLastRefreshed).TotalDays >= libraryOptions.AutomaticRefreshIntervalDays) + DateTime? newDateModified = null; + if (item.LocationType == LocationType.FileSystem) { - requiresRefresh = true; + var file = refreshOptions.DirectoryService.GetFile(item.Path); + if (file != null) + { + newDateModified = file.LastWriteTimeUtc; + if (item.EnableRefreshOnDateModifiedChange) + { + if (newDateModified != item.DateModified) + { + Logger.Debug("Date modified for {0}. Old date {1} new date {2} Id {3}", item.Path, item.DateModified, newDateModified, item.Id); + requiresRefresh = true; + } + } + + if (!requiresRefresh && item.SupportsLocalMetadata) + { + var video = item as Video; + + if (video != null && !video.IsPlaceHolder) + { + requiresRefresh = !video.SubtitleFiles + .SequenceEqual(SubtitleResolver.GetSubtitleFiles(video, refreshOptions.DirectoryService, FileSystem, false) + .OrderBy(i => i), StringComparer.OrdinalIgnoreCase); + } + } + } + } + + if (!requiresRefresh && refreshOptions.MetadataRefreshMode != MetadataRefreshMode.None) + { + // TODO: If this returns true, should we instead just change metadata refresh mode to Full? + requiresRefresh = item.RequiresRefresh(); } var itemImageProvider = new ItemImageProvider(Logger, ProviderManager, ServerConfigurationManager, FileSystem); @@ -145,20 +174,9 @@ namespace MediaBrowser.Providers.Manager var beforeSaveResult = BeforeSave(itemOfType, isFirstRefresh || refreshOptions.ReplaceAllMetadata || refreshOptions.MetadataRefreshMode == MetadataRefreshMode.FullRefresh || requiresRefresh, updateType); updateType = updateType | beforeSaveResult; - if (item.LocationType == LocationType.FileSystem) + if (newDateModified.HasValue) { - var file = refreshOptions.DirectoryService.GetFile(item.Path); - if (file != null) - { - var fileLastWriteTime = file.LastWriteTimeUtc; - if (item.EnableRefreshOnDateModifiedChange && fileLastWriteTime != item.DateModified) - { - Logger.Debug("Date modified for {0}. Old date {1} new date {2} Id {3}", item.Path, item.DateModified, fileLastWriteTime, item.Id); - requiresRefresh = true; - } - - item.DateModified = fileLastWriteTime; - } + item.DateModified = newDateModified.Value; } // Save if changes were made, or it's never been saved before @@ -204,7 +222,7 @@ namespace MediaBrowser.Providers.Manager LibraryManager.UpdatePeople(baseItem, result.People); await SavePeopleMetadata(result.People, libraryOptions, cancellationToken).ConfigureAwait(false); } - await result.Item.UpdateToRepository(reason, cancellationToken).ConfigureAwait(false); + result.Item.UpdateToRepository(reason, cancellationToken); } private async Task SavePeopleMetadata(List<PersonInfo> people, LibraryOptions libraryOptions, CancellationToken cancellationToken) @@ -238,7 +256,7 @@ namespace MediaBrowser.Providers.Manager if (saveEntity) { - await personEntity.UpdateToRepository(updateType, cancellationToken).ConfigureAwait(false); + personEntity.UpdateToRepository(updateType, cancellationToken); } } } @@ -453,6 +471,11 @@ namespace MediaBrowser.Providers.Manager return item is TItemType; } + public bool CanRefreshPrimary(Type type) + { + return type == typeof(TItemType); + } + protected virtual async Task<RefreshResult> RefreshWithProviders(MetadataResult<TItemType> metadata, TIdType id, MetadataRefreshOptions options, @@ -655,6 +678,8 @@ namespace MediaBrowser.Providers.Manager if (result.HasMetadata) { + result.Provider = provider.Name; + results.Add(result); refreshResult.UpdateType = refreshResult.UpdateType | ItemUpdateType.MetadataDownload; diff --git a/MediaBrowser.Providers/Manager/ProviderManager.cs b/MediaBrowser.Providers/Manager/ProviderManager.cs index c36d4cf63..9dd5052da 100644 --- a/MediaBrowser.Providers/Manager/ProviderManager.cs +++ b/MediaBrowser.Providers/Manager/ProviderManager.cs @@ -118,7 +118,29 @@ namespace MediaBrowser.Providers.Manager public Task<ItemUpdateType> RefreshSingleItem(IHasMetadata item, MetadataRefreshOptions options, CancellationToken cancellationToken) { - var service = _metadataServices.FirstOrDefault(i => i.CanRefresh(item)); + IMetadataService service = null; + var type = item.GetType(); + + foreach (var current in _metadataServices) + { + if (current.CanRefreshPrimary(type)) + { + service = current; + break; + } + } + + if (service == null) + { + foreach (var current in _metadataServices) + { + if (current.CanRefresh(item)) + { + service = current; + break; + } + } + } if (service != null) { @@ -131,16 +153,16 @@ namespace MediaBrowser.Providers.Manager public async Task SaveImage(IHasMetadata item, string url, ImageType type, int? imageIndex, CancellationToken cancellationToken) { - var response = await _httpClient.GetResponse(new HttpRequestOptions + using (var response = await _httpClient.GetResponse(new HttpRequestOptions { CancellationToken = cancellationToken, Url = url, BufferContent = false - }).ConfigureAwait(false); - - await SaveImage(item, response.Content, response.ContentType, type, imageIndex, cancellationToken) - .ConfigureAwait(false); + }).ConfigureAwait(false)) + { + await SaveImage(item, response.Content, response.ContentType, type, imageIndex, cancellationToken).ConfigureAwait(false); + } } public Task SaveImage(IHasMetadata item, Stream source, string mimeType, ImageType type, int? imageIndex, CancellationToken cancellationToken) @@ -452,6 +474,8 @@ namespace MediaBrowser.Providers.Manager GetPluginSummary<MusicAlbum>(), GetPluginSummary<MusicArtist>(), GetPluginSummary<Audio>(), + GetPluginSummary<AudioBook>(), + GetPluginSummary<AudioPodcast>(), GetPluginSummary<Genre>(), GetPluginSummary<Studio>(), GetPluginSummary<GameGenre>(), @@ -560,30 +584,20 @@ namespace MediaBrowser.Providers.Manager new MetadataOptions(); } - private Task _completedTask = Task.FromResult(true); /// <summary> /// Saves the metadata. /// </summary> - /// <param name="item">The item.</param> - /// <param name="updateType">Type of the update.</param> - /// <returns>Task.</returns> - public Task SaveMetadata(IHasMetadata item, ItemUpdateType updateType) + public void SaveMetadata(IHasMetadata item, ItemUpdateType updateType) { SaveMetadata(item, updateType, _savers); - return _completedTask; } /// <summary> /// Saves the metadata. /// </summary> - /// <param name="item">The item.</param> - /// <param name="updateType">Type of the update.</param> - /// <param name="savers">The savers.</param> - /// <returns>Task.</returns> - public Task SaveMetadata(IHasMetadata item, ItemUpdateType updateType, IEnumerable<string> savers) + public void SaveMetadata(IHasMetadata item, ItemUpdateType updateType, IEnumerable<string> savers) { SaveMetadata(item, updateType, _savers.Where(i => savers.Contains(i.Name, StringComparer.OrdinalIgnoreCase))); - return _completedTask; } /// <summary> diff --git a/MediaBrowser.Providers/Manager/ProviderUtils.cs b/MediaBrowser.Providers/Manager/ProviderUtils.cs index 41612321b..b727e1354 100644 --- a/MediaBrowser.Providers/Manager/ProviderUtils.cs +++ b/MediaBrowser.Providers/Manager/ProviderUtils.cs @@ -51,7 +51,7 @@ namespace MediaBrowser.Providers.Manager } } - if (replaceData || !target.CommunityRating.HasValue) + if (replaceData || !target.CommunityRating.HasValue || (source.CommunityRating.HasValue && string.Equals(sourceResult.Provider, "The Open Movie Database", StringComparison.OrdinalIgnoreCase))) { target.CommunityRating = source.CommunityRating; } diff --git a/MediaBrowser.Providers/MediaBrowser.Providers.csproj b/MediaBrowser.Providers/MediaBrowser.Providers.csproj index 65791ed10..ae4499350 100644 --- a/MediaBrowser.Providers/MediaBrowser.Providers.csproj +++ b/MediaBrowser.Providers/MediaBrowser.Providers.csproj @@ -41,6 +41,7 @@ <Compile Include="Books\AudioBookMetadataService.cs" /> <Compile Include="Books\AudioPodcastMetadataService.cs" /> <Compile Include="Books\BookMetadataService.cs" /> + <Compile Include="Books\GoogleBooksProvider.cs" /> <Compile Include="BoxSets\BoxSetMetadataService.cs" /> <Compile Include="BoxSets\MovieDbBoxSetImageProvider.cs" /> <Compile Include="BoxSets\MovieDbBoxSetProvider.cs" /> @@ -84,7 +85,6 @@ <Compile Include="Movies\MovieDbImageProvider.cs" /> <Compile Include="Movies\FanartMovieImageProvider.cs" /> <Compile Include="MusicGenres\MusicGenreMetadataService.cs" /> - <Compile Include="Music\AlbumImageFromSongProvider.cs" /> <Compile Include="Music\AlbumMetadataService.cs" /> <Compile Include="Music\ArtistMetadataService.cs" /> <Compile Include="Music\AudioDbAlbumImageProvider.cs" /> diff --git a/MediaBrowser.Providers/MediaInfo/AudioImageProvider.cs b/MediaBrowser.Providers/MediaInfo/AudioImageProvider.cs index a4f2053a9..3499d5d3f 100644 --- a/MediaBrowser.Providers/MediaInfo/AudioImageProvider.cs +++ b/MediaBrowser.Providers/MediaInfo/AudioImageProvider.cs @@ -19,7 +19,7 @@ namespace MediaBrowser.Providers.MediaInfo /// <summary> /// Uses ffmpeg to create video images /// </summary> - public class AudioImageProvider : IDynamicImageProvider, IHasItemChangeMonitor + public class AudioImageProvider : IDynamicImageProvider { private readonly IMediaEncoder _mediaEncoder; private readonly IServerConfigurationManager _config; @@ -134,19 +134,5 @@ namespace MediaBrowser.Providers.MediaInfo return item.LocationType == LocationType.FileSystem && audio != null; } - - public bool HasChanged(IHasMetadata item, IDirectoryService directoryService) - { - if (item.EnableRefreshOnDateModifiedChange && !string.IsNullOrWhiteSpace(item.Path) && item.LocationType == LocationType.FileSystem) - { - var file = directoryService.GetFile(item.Path); - if (file != null && file.LastWriteTimeUtc != item.DateModified) - { - return true; - } - } - - return false; - } } } diff --git a/MediaBrowser.Providers/MediaInfo/FFProbeAudioInfo.cs b/MediaBrowser.Providers/MediaInfo/FFProbeAudioInfo.cs index aa6e5ad31..cb0075b33 100644 --- a/MediaBrowser.Providers/MediaInfo/FFProbeAudioInfo.cs +++ b/MediaBrowser.Providers/MediaInfo/FFProbeAudioInfo.cs @@ -123,7 +123,7 @@ namespace MediaBrowser.Providers.MediaInfo audio.Name = data.Name; } - if (!audio.LockedFields.Contains(MetadataFields.Cast)) + if (audio.SupportsPeople && !audio.LockedFields.Contains(MetadataFields.Cast)) { var people = new List<PersonInfo>(); diff --git a/MediaBrowser.Providers/MediaInfo/FFProbeProvider.cs b/MediaBrowser.Providers/MediaInfo/FFProbeProvider.cs index a9aa71bfa..bce421901 100644 --- a/MediaBrowser.Providers/MediaInfo/FFProbeProvider.cs +++ b/MediaBrowser.Providers/MediaInfo/FFProbeProvider.cs @@ -34,7 +34,6 @@ namespace MediaBrowser.Providers.MediaInfo ICustomMetadataProvider<Audio>, ICustomMetadataProvider<AudioPodcast>, ICustomMetadataProvider<AudioBook>, - IHasItemChangeMonitor, IHasOrder, IForcedProvider, IPreRefreshProvider @@ -180,32 +179,6 @@ namespace MediaBrowser.Providers.MediaInfo return prober.Probe(item, cancellationToken); } - public bool HasChanged(IHasMetadata item, IDirectoryService directoryService) - { - if (item.EnableRefreshOnDateModifiedChange && !string.IsNullOrWhiteSpace(item.Path) && item.LocationType == LocationType.FileSystem) - { - var file = directoryService.GetFile(item.Path); - if (file != null && file.LastWriteTimeUtc != item.DateModified) - { - return true; - } - } - - if (item.SupportsLocalMetadata) - { - var video = item as Video; - - if (video != null && !video.IsPlaceHolder) - { - return !video.SubtitleFiles - .SequenceEqual(SubtitleResolver.GetSubtitleFiles(video, directoryService, _fileSystem, false) - .OrderBy(i => i), StringComparer.OrdinalIgnoreCase); - } - } - - return false; - } - public int Order { get diff --git a/MediaBrowser.Providers/MediaInfo/FFProbeVideoInfo.cs b/MediaBrowser.Providers/MediaInfo/FFProbeVideoInfo.cs index 64a485bc2..a6a363ffd 100644 --- a/MediaBrowser.Providers/MediaInfo/FFProbeVideoInfo.cs +++ b/MediaBrowser.Providers/MediaInfo/FFProbeVideoInfo.cs @@ -248,7 +248,7 @@ namespace MediaBrowser.Providers.MediaInfo if (string.IsNullOrWhiteSpace(chapter.Name) || TimeSpan.TryParse(chapter.Name, out time)) { - chapter.Name = string.Format(_localization.GetLocalizedString("LabelChapterName"), index.ToString(CultureInfo.InvariantCulture)); + chapter.Name = string.Format(_localization.GetLocalizedString("ChapterNameValue"), index.ToString(CultureInfo.InvariantCulture)); } index++; } diff --git a/MediaBrowser.Providers/MediaInfo/VideoImageProvider.cs b/MediaBrowser.Providers/MediaInfo/VideoImageProvider.cs index 9b0d29cf0..9fde9c70f 100644 --- a/MediaBrowser.Providers/MediaInfo/VideoImageProvider.cs +++ b/MediaBrowser.Providers/MediaInfo/VideoImageProvider.cs @@ -16,7 +16,7 @@ using System.Threading.Tasks; namespace MediaBrowser.Providers.MediaInfo { - public class VideoImageProvider : IDynamicImageProvider, IHasItemChangeMonitor, IHasOrder + public class VideoImageProvider : IDynamicImageProvider, IHasOrder { private readonly IMediaEncoder _mediaEncoder; private readonly ILogger _logger; @@ -149,19 +149,5 @@ namespace MediaBrowser.Providers.MediaInfo return 100; } } - - public bool HasChanged(IHasMetadata item, IDirectoryService directoryService) - { - if (item.EnableRefreshOnDateModifiedChange && !string.IsNullOrWhiteSpace(item.Path) && item.LocationType == LocationType.FileSystem) - { - var file = directoryService.GetFile(item.Path); - if (file != null && file.LastWriteTimeUtc != item.DateModified) - { - return true; - } - } - - return false; - } } } diff --git a/MediaBrowser.Providers/Movies/FanartMovieImageProvider.cs b/MediaBrowser.Providers/Movies/FanartMovieImageProvider.cs index 0214788ab..545c3baba 100644 --- a/MediaBrowser.Providers/Movies/FanartMovieImageProvider.cs +++ b/MediaBrowser.Providers/Movies/FanartMovieImageProvider.cs @@ -274,17 +274,20 @@ namespace MediaBrowser.Providers.Movies try { - using (var response = await _httpClient.Get(new HttpRequestOptions + using (var httpResponse = await _httpClient.SendAsync(new HttpRequestOptions { Url = url, CancellationToken = cancellationToken, BufferContent = true - }).ConfigureAwait(false)) + }, "GET").ConfigureAwait(false)) { - using (var fileStream = _fileSystem.GetFileStream(path, FileOpenMode.Create, FileAccessMode.Write, FileShareMode.Read, true)) + using (var response = httpResponse.Content) { - await response.CopyToAsync(fileStream).ConfigureAwait(false); + using (var fileStream = _fileSystem.GetFileStream(path, FileOpenMode.Create, FileAccessMode.Write, FileShareMode.Read, true)) + { + await response.CopyToAsync(fileStream).ConfigureAwait(false); + } } } } diff --git a/MediaBrowser.Providers/Movies/MovieDbProvider.cs b/MediaBrowser.Providers/Movies/MovieDbProvider.cs index fe798d4f0..06adbffd7 100644 --- a/MediaBrowser.Providers/Movies/MovieDbProvider.cs +++ b/MediaBrowser.Providers/Movies/MovieDbProvider.cs @@ -146,7 +146,7 @@ namespace MediaBrowser.Providers.Movies return _tmdbSettings; } - using (var json = await GetMovieDbResponse(new HttpRequestOptions + using (var response = await GetMovieDbResponse(new HttpRequestOptions { Url = string.Format(TmdbConfigUrl, ApiKey), CancellationToken = cancellationToken, @@ -154,9 +154,12 @@ namespace MediaBrowser.Providers.Movies }).ConfigureAwait(false)) { - _tmdbSettings = _jsonSerializer.DeserializeFromStream<TmdbSettingsResult>(json); + using (var json = response.Content) + { + _tmdbSettings = _jsonSerializer.DeserializeFromStream<TmdbSettingsResult>(json); - return _tmdbSettings; + return _tmdbSettings; + } } } @@ -339,7 +342,7 @@ namespace MediaBrowser.Providers.Movies try { - using (var json = await GetMovieDbResponse(new HttpRequestOptions + using (var response = await GetMovieDbResponse(new HttpRequestOptions { Url = url, CancellationToken = cancellationToken, @@ -349,7 +352,10 @@ namespace MediaBrowser.Providers.Movies }).ConfigureAwait(false)) { - mainResult = _jsonSerializer.DeserializeFromStream<CompleteMovieData>(json); + using (var json = response.Content) + { + mainResult = _jsonSerializer.DeserializeFromStream<CompleteMovieData>(json); + } } } catch (HttpException ex) @@ -381,7 +387,7 @@ namespace MediaBrowser.Providers.Movies url += "&include_image_language=" + GetImageLanguagesParam(language); } - using (var json = await GetMovieDbResponse(new HttpRequestOptions + using (var response = await GetMovieDbResponse(new HttpRequestOptions { Url = url, CancellationToken = cancellationToken, @@ -391,9 +397,12 @@ namespace MediaBrowser.Providers.Movies }).ConfigureAwait(false)) { - var englishResult = _jsonSerializer.DeserializeFromStream<CompleteMovieData>(json); + using (var json = response.Content) + { + var englishResult = _jsonSerializer.DeserializeFromStream<CompleteMovieData>(json); - mainResult.overview = englishResult.overview; + mainResult.overview = englishResult.overview; + } } } @@ -407,7 +416,7 @@ namespace MediaBrowser.Providers.Movies /// <summary> /// Gets the movie db response. /// </summary> - internal async Task<Stream> GetMovieDbResponse(HttpRequestOptions options) + internal async Task<HttpResponseInfo> GetMovieDbResponse(HttpRequestOptions options) { var delayTicks = (requestIntervalMs * 10000) - (DateTime.UtcNow.Ticks - _lastRequestTicks); var delayMs = Math.Min(delayTicks / 10000, requestIntervalMs); @@ -423,7 +432,7 @@ namespace MediaBrowser.Providers.Movies options.BufferContent = true; options.UserAgent = "Emby/" + _appHost.ApplicationVersion; - return await _httpClient.Get(options).ConfigureAwait(false); + return await _httpClient.SendAsync(options, "GET").ConfigureAwait(false); } /// <summary> @@ -629,8 +638,7 @@ namespace MediaBrowser.Providers.Movies { get { - // After Omdb - return 1; + return 0; } } diff --git a/MediaBrowser.Providers/Movies/MovieDbSearch.cs b/MediaBrowser.Providers/Movies/MovieDbSearch.cs index 1c6157c03..673af5534 100644 --- a/MediaBrowser.Providers/Movies/MovieDbSearch.cs +++ b/MediaBrowser.Providers/Movies/MovieDbSearch.cs @@ -100,6 +100,12 @@ namespace MediaBrowser.Providers.Movies name = name.Replace("!", " "); name = name.Replace("?", " "); + var parenthIndex = name.IndexOf('('); + if (parenthIndex != -1) + { + name = name.Substring(0, parenthIndex); + } + name = name.Trim(); // Search again if the new name is different @@ -148,7 +154,7 @@ namespace MediaBrowser.Providers.Movies var url3 = string.Format(Search3, WebUtility.UrlEncode(name), ApiKey, language, type); - using (var json = await MovieDbProvider.Current.GetMovieDbResponse(new HttpRequestOptions + using (var response = await MovieDbProvider.Current.GetMovieDbResponse(new HttpRequestOptions { Url = url3, CancellationToken = cancellationToken, @@ -156,38 +162,41 @@ namespace MediaBrowser.Providers.Movies }).ConfigureAwait(false)) { - var searchResults = _json.DeserializeFromStream<TmdbMovieSearchResults>(json); + using (var json = response.Content) + { + var searchResults = _json.DeserializeFromStream<TmdbMovieSearchResults>(json); - var results = searchResults.results ?? new List<TmdbMovieSearchResult>(); + var results = searchResults.results ?? new List<TmdbMovieSearchResult>(); - return results - .Select(i => - { - var remoteResult = new RemoteSearchResult + return results + .Select(i => { - SearchProviderName = MovieDbProvider.Current.Name, - Name = i.title ?? i.name ?? i.original_title, - ImageUrl = string.IsNullOrWhiteSpace(i.poster_path) ? null : baseImageUrl + i.poster_path - }; + var remoteResult = new RemoteSearchResult + { + SearchProviderName = MovieDbProvider.Current.Name, + Name = i.title ?? i.name ?? i.original_title, + ImageUrl = string.IsNullOrWhiteSpace(i.poster_path) ? null : baseImageUrl + i.poster_path + }; - if (!string.IsNullOrWhiteSpace(i.release_date)) - { - DateTime r; + if (!string.IsNullOrWhiteSpace(i.release_date)) + { + DateTime r; // These dates are always in this exact format if (DateTime.TryParseExact(i.release_date, "yyyy-MM-dd", EnUs, DateTimeStyles.None, out r)) - { - remoteResult.PremiereDate = r.ToUniversalTime(); - remoteResult.ProductionYear = remoteResult.PremiereDate.Value.Year; + { + remoteResult.PremiereDate = r.ToUniversalTime(); + remoteResult.ProductionYear = remoteResult.PremiereDate.Value.Year; + } } - } - remoteResult.SetProviderId(MetadataProviders.Tmdb, i.id.ToString(EnUs)); + remoteResult.SetProviderId(MetadataProviders.Tmdb, i.id.ToString(EnUs)); - return remoteResult; + return remoteResult; - }) - .ToList(); + }) + .ToList(); + } } } @@ -200,7 +209,7 @@ namespace MediaBrowser.Providers.Movies var url3 = string.Format(Search3, WebUtility.UrlEncode(name), ApiKey, language, "tv"); - using (var json = await MovieDbProvider.Current.GetMovieDbResponse(new HttpRequestOptions + using (var response = await MovieDbProvider.Current.GetMovieDbResponse(new HttpRequestOptions { Url = url3, CancellationToken = cancellationToken, @@ -208,38 +217,41 @@ namespace MediaBrowser.Providers.Movies }).ConfigureAwait(false)) { - var searchResults = _json.DeserializeFromStream<TmdbTvSearchResults>(json); + using (var json = response.Content) + { + var searchResults = _json.DeserializeFromStream<TmdbTvSearchResults>(json); - var results = searchResults.results ?? new List<TvResult>(); + var results = searchResults.results ?? new List<TvResult>(); - return results - .Select(i => - { - var remoteResult = new RemoteSearchResult + return results + .Select(i => { - SearchProviderName = MovieDbProvider.Current.Name, - Name = i.name ?? i.original_name, - ImageUrl = string.IsNullOrWhiteSpace(i.poster_path) ? null : baseImageUrl + i.poster_path - }; + var remoteResult = new RemoteSearchResult + { + SearchProviderName = MovieDbProvider.Current.Name, + Name = i.name ?? i.original_name, + ImageUrl = string.IsNullOrWhiteSpace(i.poster_path) ? null : baseImageUrl + i.poster_path + }; - if (!string.IsNullOrWhiteSpace(i.first_air_date)) - { - DateTime r; + if (!string.IsNullOrWhiteSpace(i.first_air_date)) + { + DateTime r; // These dates are always in this exact format if (DateTime.TryParseExact(i.first_air_date, "yyyy-MM-dd", EnUs, DateTimeStyles.None, out r)) - { - remoteResult.PremiereDate = r.ToUniversalTime(); - remoteResult.ProductionYear = remoteResult.PremiereDate.Value.Year; + { + remoteResult.PremiereDate = r.ToUniversalTime(); + remoteResult.ProductionYear = remoteResult.PremiereDate.Value.Year; + } } - } - remoteResult.SetProviderId(MetadataProviders.Tmdb, i.id.ToString(EnUs)); + remoteResult.SetProviderId(MetadataProviders.Tmdb, i.id.ToString(EnUs)); - return remoteResult; + return remoteResult; - }) - .ToList(); + }) + .ToList(); + } } } diff --git a/MediaBrowser.Providers/Movies/MovieDbTrailerProvider.cs b/MediaBrowser.Providers/Movies/MovieDbTrailerProvider.cs index 36297914d..6d1259d20 100644 --- a/MediaBrowser.Providers/Movies/MovieDbTrailerProvider.cs +++ b/MediaBrowser.Providers/Movies/MovieDbTrailerProvider.cs @@ -36,8 +36,7 @@ namespace MediaBrowser.Providers.Movies { get { - // After Omdb - return 1; + return 0; } } diff --git a/MediaBrowser.Providers/Music/AlbumImageFromSongProvider.cs b/MediaBrowser.Providers/Music/AlbumImageFromSongProvider.cs deleted file mode 100644 index 57e20b852..000000000 --- a/MediaBrowser.Providers/Music/AlbumImageFromSongProvider.cs +++ /dev/null @@ -1,46 +0,0 @@ -using MediaBrowser.Controller.Entities; -using MediaBrowser.Controller.Entities.Audio; -using MediaBrowser.Controller.Providers; -using MediaBrowser.Model.Entities; -using System.Collections.Generic; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; - -namespace MediaBrowser.Providers.Music -{ - public class AlbumImageFromSongProvider : IDynamicImageProvider - { - public IEnumerable<ImageType> GetSupportedImages(IHasMetadata item) - { - return new List<ImageType> { ImageType.Primary }; - } - - public Task<DynamicImageResponse> GetImage(IHasMetadata item, ImageType type, CancellationToken cancellationToken) - { - var album = (MusicAlbum)item; - - var image = album.GetRecursiveChildren(i => !i.IsFolder) - .Select(i => i.GetImageInfo(type, 0)) - .FirstOrDefault(i => i != null && i.IsLocalFile); - - var imagePath = image == null ? null : image.Path; - - return Task.FromResult(new DynamicImageResponse - { - Path = imagePath, - HasImage = !string.IsNullOrEmpty(imagePath) - }); - } - - public string Name - { - get { return "Image Extractor"; } - } - - public bool Supports(IHasMetadata item) - { - return item is MusicAlbum; - } - } -} diff --git a/MediaBrowser.Providers/Music/AudioDbAlbumProvider.cs b/MediaBrowser.Providers/Music/AudioDbAlbumProvider.cs index 80f122402..1082685a8 100644 --- a/MediaBrowser.Providers/Music/AudioDbAlbumProvider.cs +++ b/MediaBrowser.Providers/Music/AudioDbAlbumProvider.cs @@ -161,16 +161,19 @@ namespace MediaBrowser.Providers.Music _fileSystem.CreateDirectory(_fileSystem.GetDirectoryName(path)); - using (var response = await _httpClient.Get(new HttpRequestOptions + using (var httpResponse = await _httpClient.SendAsync(new HttpRequestOptions { Url = url, CancellationToken = cancellationToken - }).ConfigureAwait(false)) + }, "GET").ConfigureAwait(false)) { - using (var xmlFileStream = _fileSystem.GetFileStream(path, FileOpenMode.Create, FileAccessMode.Write, FileShareMode.Read, true)) + using (var response = httpResponse.Content) { - await response.CopyToAsync(xmlFileStream).ConfigureAwait(false); + using (var xmlFileStream = _fileSystem.GetFileStream(path, FileOpenMode.Create, FileAccessMode.Write, FileShareMode.Read, true)) + { + await response.CopyToAsync(xmlFileStream).ConfigureAwait(false); + } } } } diff --git a/MediaBrowser.Providers/Music/AudioDbArtistProvider.cs b/MediaBrowser.Providers/Music/AudioDbArtistProvider.cs index d8a7dbc04..66d688959 100644 --- a/MediaBrowser.Providers/Music/AudioDbArtistProvider.cs +++ b/MediaBrowser.Providers/Music/AudioDbArtistProvider.cs @@ -147,19 +147,22 @@ namespace MediaBrowser.Providers.Music var path = GetArtistInfoPath(_config.ApplicationPaths, musicBrainzId); - using (var response = await _httpClient.Get(new HttpRequestOptions + using (var httpResponse = await _httpClient.SendAsync(new HttpRequestOptions { Url = url, CancellationToken = cancellationToken, BufferContent = true - }).ConfigureAwait(false)) + }, "GET").ConfigureAwait(false)) { - _fileSystem.CreateDirectory(_fileSystem.GetDirectoryName(path)); - - using (var xmlFileStream = _fileSystem.GetFileStream(path, FileOpenMode.Create, FileAccessMode.Write, FileShareMode.Read, true)) + using (var response = httpResponse.Content) { - await response.CopyToAsync(xmlFileStream).ConfigureAwait(false); + _fileSystem.CreateDirectory(_fileSystem.GetDirectoryName(path)); + + using (var xmlFileStream = _fileSystem.GetFileStream(path, FileOpenMode.Create, FileAccessMode.Write, FileShareMode.Read, true)) + { + await response.CopyToAsync(xmlFileStream).ConfigureAwait(false); + } } } } diff --git a/MediaBrowser.Providers/Music/FanArtArtistProvider.cs b/MediaBrowser.Providers/Music/FanArtArtistProvider.cs index 6094fd26e..c06ee9d73 100644 --- a/MediaBrowser.Providers/Music/FanArtArtistProvider.cs +++ b/MediaBrowser.Providers/Music/FanArtArtistProvider.cs @@ -251,17 +251,20 @@ namespace MediaBrowser.Providers.Music try { - using (var response = await _httpClient.Get(new HttpRequestOptions + using (var httpResponse = await _httpClient.SendAsync(new HttpRequestOptions { Url = url, CancellationToken = cancellationToken, BufferContent = true - }).ConfigureAwait(false)) + }, "GET").ConfigureAwait(false)) { - using (var saveFileStream = _fileSystem.GetFileStream(jsonPath, FileOpenMode.Create, FileAccessMode.Write, FileShareMode.Read, true)) + using (var response = httpResponse.Content) { - await response.CopyToAsync(saveFileStream).ConfigureAwait(false); + using (var saveFileStream = _fileSystem.GetFileStream(jsonPath, FileOpenMode.Create, FileAccessMode.Write, FileShareMode.Read, true)) + { + await response.CopyToAsync(saveFileStream).ConfigureAwait(false); + } } } } diff --git a/MediaBrowser.Providers/Music/MusicBrainzAlbumProvider.cs b/MediaBrowser.Providers/Music/MusicBrainzAlbumProvider.cs index a35fd696a..b54d14935 100644 --- a/MediaBrowser.Providers/Music/MusicBrainzAlbumProvider.cs +++ b/MediaBrowser.Providers/Music/MusicBrainzAlbumProvider.cs @@ -83,9 +83,12 @@ namespace MediaBrowser.Providers.Music if (!string.IsNullOrWhiteSpace(url)) { - using (var stream = await GetMusicBrainzResponse(url, isNameSearch, forceMusicBrainzProper, cancellationToken).ConfigureAwait(false)) + using (var response = await GetMusicBrainzResponse(url, isNameSearch, forceMusicBrainzProper, cancellationToken).ConfigureAwait(false)) { - return GetResultsFromResponse(stream); + using (var stream = response.Content) + { + return GetResultsFromResponse(stream); + } } } @@ -226,19 +229,22 @@ namespace MediaBrowser.Providers.Music WebUtility.UrlEncode(albumName), artistId); - using (var stream = await GetMusicBrainzResponse(url, true, cancellationToken).ConfigureAwait(false)) + using (var response = await GetMusicBrainzResponse(url, true, cancellationToken).ConfigureAwait(false)) { - using (var oReader = new StreamReader(stream, Encoding.UTF8)) + using (var stream = response.Content) { - var settings = _xmlSettings.Create(false); + using (var oReader = new StreamReader(stream, Encoding.UTF8)) + { + var settings = _xmlSettings.Create(false); - settings.CheckCharacters = false; - settings.IgnoreProcessingInstructions = true; - settings.IgnoreComments = true; + settings.CheckCharacters = false; + settings.IgnoreProcessingInstructions = true; + settings.IgnoreComments = true; - using (var reader = XmlReader.Create(oReader, settings)) - { - return ReleaseResult.Parse(reader).FirstOrDefault(); + using (var reader = XmlReader.Create(oReader, settings)) + { + return ReleaseResult.Parse(reader).FirstOrDefault(); + } } } } @@ -250,19 +256,22 @@ namespace MediaBrowser.Providers.Music WebUtility.UrlEncode(albumName), WebUtility.UrlEncode(artistName)); - using (var stream = await GetMusicBrainzResponse(url, true, cancellationToken).ConfigureAwait(false)) + using (var response = await GetMusicBrainzResponse(url, true, cancellationToken).ConfigureAwait(false)) { - using (var oReader = new StreamReader(stream, Encoding.UTF8)) + using (var stream = response.Content) { - var settings = _xmlSettings.Create(false); + using (var oReader = new StreamReader(stream, Encoding.UTF8)) + { + var settings = _xmlSettings.Create(false); - settings.CheckCharacters = false; - settings.IgnoreProcessingInstructions = true; - settings.IgnoreComments = true; + settings.CheckCharacters = false; + settings.IgnoreProcessingInstructions = true; + settings.IgnoreComments = true; - using (var reader = XmlReader.Create(oReader, settings)) - { - return ReleaseResult.Parse(reader).FirstOrDefault(); + using (var reader = XmlReader.Create(oReader, settings)) + { + return ReleaseResult.Parse(reader).FirstOrDefault(); + } } } } @@ -431,23 +440,26 @@ namespace MediaBrowser.Providers.Music { var url = string.Format("/ws/2/release?release-group={0}", releaseGroupId); - using (var stream = await GetMusicBrainzResponse(url, true, true, cancellationToken).ConfigureAwait(false)) + using (var response = await GetMusicBrainzResponse(url, true, true, cancellationToken).ConfigureAwait(false)) { - using (var oReader = new StreamReader(stream, Encoding.UTF8)) + using (var stream = response.Content) { - var settings = _xmlSettings.Create(false); - - settings.CheckCharacters = false; - settings.IgnoreProcessingInstructions = true; - settings.IgnoreComments = true; - - using (var reader = XmlReader.Create(oReader, settings)) + using (var oReader = new StreamReader(stream, Encoding.UTF8)) { - var result = ReleaseResult.Parse(reader).FirstOrDefault(); + var settings = _xmlSettings.Create(false); + + settings.CheckCharacters = false; + settings.IgnoreProcessingInstructions = true; + settings.IgnoreComments = true; - if (result != null) + using (var reader = XmlReader.Create(oReader, settings)) { - return result.ReleaseId; + var result = ReleaseResult.Parse(reader).FirstOrDefault(); + + if (result != null) + { + return result.ReleaseId; + } } } } @@ -466,53 +478,56 @@ namespace MediaBrowser.Providers.Music { var url = string.Format("/ws/2/release-group/?query=reid:{0}", releaseEntryId); - using (var stream = await GetMusicBrainzResponse(url, false, cancellationToken).ConfigureAwait(false)) + using (var response = await GetMusicBrainzResponse(url, false, cancellationToken).ConfigureAwait(false)) { - using (var oReader = new StreamReader(stream, Encoding.UTF8)) + using (var stream = response.Content) { - var settings = _xmlSettings.Create(false); - - settings.CheckCharacters = false; - settings.IgnoreProcessingInstructions = true; - settings.IgnoreComments = true; - - using (var reader = XmlReader.Create(oReader, settings)) + using (var oReader = new StreamReader(stream, Encoding.UTF8)) { - reader.MoveToContent(); - reader.Read(); + var settings = _xmlSettings.Create(false); - // Loop through each element - while (!reader.EOF && reader.ReadState == ReadState.Interactive) + settings.CheckCharacters = false; + settings.IgnoreProcessingInstructions = true; + settings.IgnoreComments = true; + + using (var reader = XmlReader.Create(oReader, settings)) { - if (reader.NodeType == XmlNodeType.Element) + reader.MoveToContent(); + reader.Read(); + + // Loop through each element + while (!reader.EOF && reader.ReadState == ReadState.Interactive) { - switch (reader.Name) + if (reader.NodeType == XmlNodeType.Element) { - case "release-group-list": - { - if (reader.IsEmptyElement) + switch (reader.Name) + { + case "release-group-list": { - reader.Read(); - continue; + if (reader.IsEmptyElement) + { + reader.Read(); + continue; + } + using (var subReader = reader.ReadSubtree()) + { + return GetFirstReleaseGroupId(subReader); + } } - using (var subReader = reader.ReadSubtree()) + default: { - return GetFirstReleaseGroupId(subReader); + reader.Skip(); + break; } - } - default: - { - reader.Skip(); - break; - } + } + } + else + { + reader.Read(); } } - else - { - reader.Read(); - } + return null; } - return null; } } } @@ -598,11 +613,14 @@ namespace MediaBrowser.Providers.Music UserAgent = _appHost.Name + "/" + _appHost.ApplicationVersion }; - using (var stream = await _httpClient.Get(options).ConfigureAwait(false)) + using (var response = await _httpClient.SendAsync(options, "GET").ConfigureAwait(false)) { - var results = _json.DeserializeFromStream<List<MbzUrl>>(stream); + using (var stream = response.Content) + { + var results = _json.DeserializeFromStream<List<MbzUrl>>(stream); - list = results; + list = results; + } } _lastMbzUrlQueryTicks = DateTime.UtcNow.Ticks; } @@ -626,7 +644,7 @@ namespace MediaBrowser.Providers.Music return list; } - internal Task<Stream> GetMusicBrainzResponse(string url, bool isSearch, CancellationToken cancellationToken) + internal Task<HttpResponseInfo> GetMusicBrainzResponse(string url, bool isSearch, CancellationToken cancellationToken) { return GetMusicBrainzResponse(url, isSearch, false, cancellationToken); } @@ -634,7 +652,7 @@ namespace MediaBrowser.Providers.Music /// <summary> /// Gets the music brainz response. /// </summary> - internal async Task<Stream> GetMusicBrainzResponse(string url, bool isSearch, bool forceMusicBrainzProper, CancellationToken cancellationToken) + internal async Task<HttpResponseInfo> GetMusicBrainzResponse(string url, bool isSearch, bool forceMusicBrainzProper, CancellationToken cancellationToken) { var urlInfo = await GetMbzUrl(forceMusicBrainzProper).ConfigureAwait(false); var throttleMs = urlInfo.throttleMs; @@ -656,7 +674,7 @@ namespace MediaBrowser.Providers.Music BufferContent = throttleMs > 0 }; - return await _httpClient.Get(options).ConfigureAwait(false); + return await _httpClient.SendAsync(options, "GET").ConfigureAwait(false); } public int Order diff --git a/MediaBrowser.Providers/Music/MusicBrainzArtistProvider.cs b/MediaBrowser.Providers/Music/MusicBrainzArtistProvider.cs index 06f60c8a3..f514791a7 100644 --- a/MediaBrowser.Providers/Music/MusicBrainzArtistProvider.cs +++ b/MediaBrowser.Providers/Music/MusicBrainzArtistProvider.cs @@ -35,10 +35,12 @@ namespace MediaBrowser.Providers.Music { var url = string.Format("/ws/2/artist/?query=arid:{0}", musicBrainzId); - using (var stream = await MusicBrainzAlbumProvider.Current.GetMusicBrainzResponse(url, false, cancellationToken) - .ConfigureAwait(false)) + using (var response = await MusicBrainzAlbumProvider.Current.GetMusicBrainzResponse(url, false, cancellationToken).ConfigureAwait(false)) { - return GetResultsFromResponse(stream); + using (var stream = response.Content) + { + return GetResultsFromResponse(stream); + } } } else @@ -48,13 +50,16 @@ namespace MediaBrowser.Providers.Music var url = String.Format("/ws/2/artist/?query=artist:\"{0}\"", UrlEncode(nameToSearch)); - using (var stream = await MusicBrainzAlbumProvider.Current.GetMusicBrainzResponse(url, true, cancellationToken).ConfigureAwait(false)) + using (var response = await MusicBrainzAlbumProvider.Current.GetMusicBrainzResponse(url, true, cancellationToken).ConfigureAwait(false)) { - var results = GetResultsFromResponse(stream); - - if (results.Count > 0) + using (var stream = response.Content) { - return results; + var results = GetResultsFromResponse(stream); + + if (results.Count > 0) + { + return results; + } } } @@ -63,9 +68,12 @@ namespace MediaBrowser.Providers.Music // Try again using the search with accent characters url url = String.Format("/ws/2/artist/?query=artistaccent:\"{0}\"", UrlEncode(nameToSearch)); - using (var stream = await MusicBrainzAlbumProvider.Current.GetMusicBrainzResponse(url, true, cancellationToken).ConfigureAwait(false)) + using (var response = await MusicBrainzAlbumProvider.Current.GetMusicBrainzResponse(url, true, cancellationToken).ConfigureAwait(false)) { - return GetResultsFromResponse(stream); + using (var stream = response.Content) + { + return GetResultsFromResponse(stream); + } } } } diff --git a/MediaBrowser.Providers/Omdb/OmdbItemProvider.cs b/MediaBrowser.Providers/Omdb/OmdbItemProvider.cs index e769c8cab..c1b98dfbf 100644 --- a/MediaBrowser.Providers/Omdb/OmdbItemProvider.cs +++ b/MediaBrowser.Providers/Omdb/OmdbItemProvider.cs @@ -22,7 +22,7 @@ using System.Threading.Tasks; namespace MediaBrowser.Providers.Omdb { public class OmdbItemProvider : IRemoteMetadataProvider<Series, SeriesInfo>, - IRemoteMetadataProvider<Movie, MovieInfo>, IRemoteMetadataProvider<Trailer, TrailerInfo> + IRemoteMetadataProvider<Movie, MovieInfo>, IRemoteMetadataProvider<Trailer, TrailerInfo>, IHasOrder { private readonly IJsonSerializer _jsonSerializer; private readonly IHttpClient _httpClient; @@ -41,6 +41,15 @@ namespace MediaBrowser.Providers.Omdb _configurationManager = configurationManager; } + public int Order + { + get + { + // After primary option + return 1; + } + } + public Task<IEnumerable<RemoteSearchResult>> GetSearchResults(SeriesInfo searchInfo, CancellationToken cancellationToken) { return GetSearchResults(searchInfo, "series", cancellationToken); @@ -117,65 +126,68 @@ namespace MediaBrowser.Providers.Omdb var url = OmdbProvider.GetOmdbUrl(urlQuery, cancellationToken); - using (var stream = await OmdbProvider.GetOmdbResponse(_httpClient, url, cancellationToken).ConfigureAwait(false)) + using (var response = await OmdbProvider.GetOmdbResponse(_httpClient, url, cancellationToken).ConfigureAwait(false)) { - var resultList = new List<SearchResult>(); - - if (isSearch) - { - var searchResultList = _jsonSerializer.DeserializeFromStream<SearchResultList>(stream); - if (searchResultList != null && searchResultList.Search != null) - { - resultList.AddRange(searchResultList.Search); - } - } - else - { - var result = _jsonSerializer.DeserializeFromStream<SearchResult>(stream); - if (string.Equals(result.Response, "true", StringComparison.OrdinalIgnoreCase)) - { - resultList.Add(result); - } - } - - return resultList.Select(result => + using (var stream = response.Content) { - var item = new RemoteSearchResult - { - IndexNumber = searchInfo.IndexNumber, - Name = result.Title, - ParentIndexNumber = searchInfo.ParentIndexNumber, - SearchProviderName = Name - }; + var resultList = new List<SearchResult>(); - if (episodeSearchInfo != null && episodeSearchInfo.IndexNumberEnd.HasValue) + if (isSearch) { - item.IndexNumberEnd = episodeSearchInfo.IndexNumberEnd.Value; + var searchResultList = _jsonSerializer.DeserializeFromStream<SearchResultList>(stream); + if (searchResultList != null && searchResultList.Search != null) + { + resultList.AddRange(searchResultList.Search); + } } - - item.SetProviderId(MetadataProviders.Imdb, result.imdbID); - - int parsedYear; - if (result.Year.Length > 0 - && int.TryParse(result.Year.Substring(0, Math.Min(result.Year.Length, 4)), NumberStyles.Any, CultureInfo.InvariantCulture, out parsedYear)) + else { - item.ProductionYear = parsedYear; + var result = _jsonSerializer.DeserializeFromStream<SearchResult>(stream); + if (string.Equals(result.Response, "true", StringComparison.OrdinalIgnoreCase)) + { + resultList.Add(result); + } } - DateTime released; - if (!string.IsNullOrEmpty(result.Released) - && DateTime.TryParse(result.Released, CultureInfo.InvariantCulture, DateTimeStyles.AllowWhiteSpaces, out released)) + return resultList.Select(result => { - item.PremiereDate = released; - } - - if (!string.IsNullOrWhiteSpace(result.Poster) && !string.Equals(result.Poster, "N/A", StringComparison.OrdinalIgnoreCase)) - { - item.ImageUrl = result.Poster; - } - - return item; - }); + var item = new RemoteSearchResult + { + IndexNumber = searchInfo.IndexNumber, + Name = result.Title, + ParentIndexNumber = searchInfo.ParentIndexNumber, + SearchProviderName = Name + }; + + if (episodeSearchInfo != null && episodeSearchInfo.IndexNumberEnd.HasValue) + { + item.IndexNumberEnd = episodeSearchInfo.IndexNumberEnd.Value; + } + + item.SetProviderId(MetadataProviders.Imdb, result.imdbID); + + int parsedYear; + if (result.Year.Length > 0 + && int.TryParse(result.Year.Substring(0, Math.Min(result.Year.Length, 4)), NumberStyles.Any, CultureInfo.InvariantCulture, out parsedYear)) + { + item.ProductionYear = parsedYear; + } + + DateTime released; + if (!string.IsNullOrEmpty(result.Released) + && DateTime.TryParse(result.Released, CultureInfo.InvariantCulture, DateTimeStyles.AllowWhiteSpaces, out released)) + { + item.PremiereDate = released; + } + + if (!string.IsNullOrWhiteSpace(result.Poster) && !string.Equals(result.Poster, "N/A", StringComparison.OrdinalIgnoreCase)) + { + item.ImageUrl = result.Poster; + } + + return item; + }); + } } } diff --git a/MediaBrowser.Providers/Omdb/OmdbProvider.cs b/MediaBrowser.Providers/Omdb/OmdbProvider.cs index e2043faaf..2cac44944 100644 --- a/MediaBrowser.Providers/Omdb/OmdbProvider.cs +++ b/MediaBrowser.Providers/Omdb/OmdbProvider.cs @@ -46,7 +46,7 @@ namespace MediaBrowser.Providers.Omdb var result = await GetRootObject(imdbId, cancellationToken).ConfigureAwait(false); // Only take the name and rating if the user's language is set to english, since Omdb has no localization - if (string.Equals(language, "en", StringComparison.OrdinalIgnoreCase)) + if (string.Equals(language, "en", StringComparison.OrdinalIgnoreCase) || _configurationManager.Configuration.EnableNewOmdbSupport) { item.Name = result.Title; @@ -153,7 +153,7 @@ namespace MediaBrowser.Providers.Omdb } // Only take the name and rating if the user's language is set to english, since Omdb has no localization - if (string.Equals(language, "en", StringComparison.OrdinalIgnoreCase)) + if (string.Equals(language, "en", StringComparison.OrdinalIgnoreCase) || _configurationManager.Configuration.EnableNewOmdbSupport) { item.Name = result.Title; @@ -301,11 +301,14 @@ namespace MediaBrowser.Providers.Omdb var url = GetOmdbUrl(string.Format("i={0}&plot=short&tomatoes=true&r=json", imdbParam), cancellationToken); - using (var stream = await GetOmdbResponse(_httpClient, url, cancellationToken).ConfigureAwait(false)) + using (var response = await GetOmdbResponse(_httpClient, url, cancellationToken).ConfigureAwait(false)) { - var rootObject = _jsonSerializer.DeserializeFromStream<RootObject>(stream); - _fileSystem.CreateDirectory(_fileSystem.GetDirectoryName(path)); - _jsonSerializer.SerializeToFile(rootObject, path); + using (var stream = response.Content) + { + var rootObject = _jsonSerializer.DeserializeFromStream<RootObject>(stream); + _fileSystem.CreateDirectory(_fileSystem.GetDirectoryName(path)); + _jsonSerializer.SerializeToFile(rootObject, path); + } } return path; @@ -335,25 +338,28 @@ namespace MediaBrowser.Providers.Omdb var url = GetOmdbUrl(string.Format("i={0}&season={1}&detail=full", imdbParam, seasonId), cancellationToken); - using (var stream = await GetOmdbResponse(_httpClient, url, cancellationToken).ConfigureAwait(false)) + using (var response = await GetOmdbResponse(_httpClient, url, cancellationToken).ConfigureAwait(false)) { - var rootObject = _jsonSerializer.DeserializeFromStream<SeasonRootObject>(stream); - _fileSystem.CreateDirectory(_fileSystem.GetDirectoryName(path)); - _jsonSerializer.SerializeToFile(rootObject, path); + using (var stream = response.Content) + { + var rootObject = _jsonSerializer.DeserializeFromStream<SeasonRootObject>(stream); + _fileSystem.CreateDirectory(_fileSystem.GetDirectoryName(path)); + _jsonSerializer.SerializeToFile(rootObject, path); + } } return path; } - public static Task<Stream> GetOmdbResponse(IHttpClient httpClient, string url, CancellationToken cancellationToken) + public static Task<HttpResponseInfo> GetOmdbResponse(IHttpClient httpClient, string url, CancellationToken cancellationToken) { - return httpClient.Get(new HttpRequestOptions + return httpClient.SendAsync(new HttpRequestOptions { Url = url, CancellationToken = cancellationToken, BufferContent = true, EnableDefaultUserAgent = true - }); + }, "GET"); } internal string GetDataFilePath(string imdbId) @@ -389,7 +395,7 @@ namespace MediaBrowser.Providers.Omdb { T item = itemResult.Item; - var isConfiguredForEnglish = IsConfiguredForEnglish(item); + var isConfiguredForEnglish = IsConfiguredForEnglish(item) || _configurationManager.Configuration.EnableNewOmdbSupport; // Grab series genres because imdb data is better than tvdb. Leave movies alone // But only do it if english is the preferred language because this data will not be localized diff --git a/MediaBrowser.Providers/People/MovieDbPersonProvider.cs b/MediaBrowser.Providers/People/MovieDbPersonProvider.cs index 9aeaa8d1f..c921df61c 100644 --- a/MediaBrowser.Providers/People/MovieDbPersonProvider.cs +++ b/MediaBrowser.Providers/People/MovieDbPersonProvider.cs @@ -91,7 +91,7 @@ namespace MediaBrowser.Providers.People var url = string.Format(@"https://api.themoviedb.org/3/search/person?api_key={1}&query={0}", WebUtility.UrlEncode(searchInfo.Name), MovieDbProvider.ApiKey); - using (var json = await MovieDbProvider.Current.GetMovieDbResponse(new HttpRequestOptions + using (var response = await MovieDbProvider.Current.GetMovieDbResponse(new HttpRequestOptions { Url = url, CancellationToken = cancellationToken, @@ -99,10 +99,13 @@ namespace MediaBrowser.Providers.People }).ConfigureAwait(false)) { - var result = _jsonSerializer.DeserializeFromStream<PersonSearchResults>(json) ?? - new PersonSearchResults(); + using (var json = response.Content) + { + var result = _jsonSerializer.DeserializeFromStream<PersonSearchResults>(json) ?? + new PersonSearchResults(); - return result.Results.Select(i => GetSearchResult(i, tmdbImageUrl)); + return result.Results.Select(i => GetSearchResult(i, tmdbImageUrl)); + } } } @@ -223,7 +226,7 @@ namespace MediaBrowser.Providers.People var url = string.Format(@"https://api.themoviedb.org/3/person/{1}?api_key={0}&append_to_response=credits,images,external_ids", MovieDbProvider.ApiKey, id); - using (var json = await MovieDbProvider.Current.GetMovieDbResponse(new HttpRequestOptions + using (var response = await MovieDbProvider.Current.GetMovieDbResponse(new HttpRequestOptions { Url = url, CancellationToken = cancellationToken, @@ -231,11 +234,14 @@ namespace MediaBrowser.Providers.People }).ConfigureAwait(false)) { - _fileSystem.CreateDirectory(_fileSystem.GetDirectoryName(dataFilePath)); - - using (var fs = _fileSystem.GetFileStream(dataFilePath, FileOpenMode.Create, FileAccessMode.Write, FileShareMode.Read, true)) + using (var json = response.Content) { - await json.CopyToAsync(fs).ConfigureAwait(false); + _fileSystem.CreateDirectory(_fileSystem.GetDirectoryName(dataFilePath)); + + using (var fs = _fileSystem.GetFileStream(dataFilePath, FileOpenMode.Create, FileAccessMode.Write, FileShareMode.Read, true)) + { + await json.CopyToAsync(fs).ConfigureAwait(false); + } } } } diff --git a/MediaBrowser.Providers/TV/DummySeasonProvider.cs b/MediaBrowser.Providers/TV/DummySeasonProvider.cs index de51126ee..771570cbc 100644 --- a/MediaBrowser.Providers/TV/DummySeasonProvider.cs +++ b/MediaBrowser.Providers/TV/DummySeasonProvider.cs @@ -78,7 +78,7 @@ namespace MediaBrowser.Providers.TV else if (existingSeason.IsVirtualItem) { existingSeason.IsVirtualItem = false; - await existingSeason.UpdateToRepository(ItemUpdateType.MetadataEdit, cancellationToken).ConfigureAwait(false); + existingSeason.UpdateToRepository(ItemUpdateType.MetadataEdit, cancellationToken); } } @@ -97,7 +97,7 @@ namespace MediaBrowser.Providers.TV else if (existingSeason.IsVirtualItem) { existingSeason.IsVirtualItem = false; - await existingSeason.UpdateToRepository(ItemUpdateType.MetadataEdit, cancellationToken).ConfigureAwait(false); + existingSeason.UpdateToRepository(ItemUpdateType.MetadataEdit, cancellationToken); } } diff --git a/MediaBrowser.Providers/TV/FanArt/FanartSeriesProvider.cs b/MediaBrowser.Providers/TV/FanArt/FanartSeriesProvider.cs index 583e5900d..33bf1a7c2 100644 --- a/MediaBrowser.Providers/TV/FanArt/FanartSeriesProvider.cs +++ b/MediaBrowser.Providers/TV/FanArt/FanartSeriesProvider.cs @@ -316,17 +316,20 @@ namespace MediaBrowser.Providers.TV try { - using (var response = await _httpClient.Get(new HttpRequestOptions + using (var httpResponse = await _httpClient.SendAsync(new HttpRequestOptions { Url = url, CancellationToken = cancellationToken, BufferContent = true - }).ConfigureAwait(false)) + }, "GET").ConfigureAwait(false)) { - using (var fileStream = _fileSystem.GetFileStream(path, FileOpenMode.Create, FileAccessMode.Write, FileShareMode.Read, true)) + using (var response = httpResponse.Content) { - await response.CopyToAsync(fileStream).ConfigureAwait(false); + using (var fileStream = _fileSystem.GetFileStream(path, FileOpenMode.Create, FileAccessMode.Write, FileShareMode.Read, true)) + { + await response.CopyToAsync(fileStream).ConfigureAwait(false); + } } } } diff --git a/MediaBrowser.Providers/TV/MissingEpisodeProvider.cs b/MediaBrowser.Providers/TV/MissingEpisodeProvider.cs index 44e3cff6a..b68e6e4a9 100644 --- a/MediaBrowser.Providers/TV/MissingEpisodeProvider.cs +++ b/MediaBrowser.Providers/TV/MissingEpisodeProvider.cs @@ -350,8 +350,6 @@ namespace MediaBrowser.Providers.TV foreach (var episodeToRemove in episodesToRemove.Select(e => e.Episode)) { - _logger.Info("Removing missing/unaired episode {0} {1}x{2}", episodeToRemove.Series.Name, episodeToRemove.ParentIndexNumber, episodeToRemove.IndexNumber); - await episodeToRemove.Delete(new DeleteOptions { DeleteFileLocation = true @@ -418,8 +416,6 @@ namespace MediaBrowser.Providers.TV foreach (var seasonToRemove in seasonsToRemove) { - _logger.Info("Removing virtual season {0} {1}", seasonToRemove.Series.Name, seasonToRemove.IndexNumber); - await seasonToRemove.Delete(new DeleteOptions { DeleteFileLocation = true diff --git a/MediaBrowser.Providers/TV/TheMovieDb/MovieDbProviderBase.cs b/MediaBrowser.Providers/TV/TheMovieDb/MovieDbProviderBase.cs index 5ca2d5518..b19936480 100644 --- a/MediaBrowser.Providers/TV/TheMovieDb/MovieDbProviderBase.cs +++ b/MediaBrowser.Providers/TV/TheMovieDb/MovieDbProviderBase.cs @@ -125,7 +125,7 @@ namespace MediaBrowser.Providers.TV cancellationToken.ThrowIfCancellationRequested(); - using (var json = await MovieDbProvider.Current.GetMovieDbResponse(new HttpRequestOptions + using (var response = await MovieDbProvider.Current.GetMovieDbResponse(new HttpRequestOptions { Url = url, CancellationToken = cancellationToken, @@ -133,7 +133,10 @@ namespace MediaBrowser.Providers.TV }).ConfigureAwait(false)) { - return _jsonSerializer.DeserializeFromStream<RootObject>(json); + using (var json = response.Content) + { + return _jsonSerializer.DeserializeFromStream<RootObject>(json); + } } } diff --git a/MediaBrowser.Providers/TV/TheMovieDb/MovieDbSeasonProvider.cs b/MediaBrowser.Providers/TV/TheMovieDb/MovieDbSeasonProvider.cs index 528ba3d0c..0c4c2d9ab 100644 --- a/MediaBrowser.Providers/TV/TheMovieDb/MovieDbSeasonProvider.cs +++ b/MediaBrowser.Providers/TV/TheMovieDb/MovieDbSeasonProvider.cs @@ -60,7 +60,12 @@ namespace MediaBrowser.Providers.TV result.HasMetadata = true; result.Item = new Season(); - result.Item.Name = seasonInfo.name; + + // Don't use moviedb season names for now until if/when we have field-level configuration + //result.Item.Name = seasonInfo.name; + + result.Item.Name = info.Name; + result.Item.IndexNumber = seasonNumber; result.Item.Overview = seasonInfo.overview; @@ -209,7 +214,7 @@ namespace MediaBrowser.Providers.TV cancellationToken.ThrowIfCancellationRequested(); - using (var json = await MovieDbProvider.Current.GetMovieDbResponse(new HttpRequestOptions + using (var response = await MovieDbProvider.Current.GetMovieDbResponse(new HttpRequestOptions { Url = url, CancellationToken = cancellationToken, @@ -217,7 +222,10 @@ namespace MediaBrowser.Providers.TV }).ConfigureAwait(false)) { - return _jsonSerializer.DeserializeFromStream<RootObject>(json); + using (var json = response.Content) + { + return _jsonSerializer.DeserializeFromStream<RootObject>(json); + } } } diff --git a/MediaBrowser.Providers/TV/TheMovieDb/MovieDbSeriesProvider.cs b/MediaBrowser.Providers/TV/TheMovieDb/MovieDbSeriesProvider.cs index 72745a9c3..08099179c 100644 --- a/MediaBrowser.Providers/TV/TheMovieDb/MovieDbSeriesProvider.cs +++ b/MediaBrowser.Providers/TV/TheMovieDb/MovieDbSeriesProvider.cs @@ -352,7 +352,7 @@ namespace MediaBrowser.Providers.TV RootObject mainResult; - using (var json = await MovieDbProvider.Current.GetMovieDbResponse(new HttpRequestOptions + using (var response = await MovieDbProvider.Current.GetMovieDbResponse(new HttpRequestOptions { Url = url, CancellationToken = cancellationToken, @@ -360,11 +360,14 @@ namespace MediaBrowser.Providers.TV }).ConfigureAwait(false)) { - mainResult = _jsonSerializer.DeserializeFromStream<RootObject>(json); - - if (!string.IsNullOrEmpty(language)) + using (var json = response.Content) { - mainResult.ResultLanguage = language; + mainResult = _jsonSerializer.DeserializeFromStream<RootObject>(json); + + if (!string.IsNullOrEmpty(language)) + { + mainResult.ResultLanguage = language; + } } } @@ -386,7 +389,7 @@ namespace MediaBrowser.Providers.TV url += "&include_image_language=" + MovieDbProvider.GetImageLanguagesParam(language); } - using (var json = await MovieDbProvider.Current.GetMovieDbResponse(new HttpRequestOptions + using (var response = await MovieDbProvider.Current.GetMovieDbResponse(new HttpRequestOptions { Url = url, CancellationToken = cancellationToken, @@ -394,10 +397,13 @@ namespace MediaBrowser.Providers.TV }).ConfigureAwait(false)) { - var englishResult = _jsonSerializer.DeserializeFromStream<RootObject>(json); + using (var json = response.Content) + { + var englishResult = _jsonSerializer.DeserializeFromStream<RootObject>(json); - mainResult.overview = englishResult.overview; - mainResult.ResultLanguage = "en"; + mainResult.overview = englishResult.overview; + mainResult.ResultLanguage = "en"; + } } } @@ -449,7 +455,7 @@ namespace MediaBrowser.Providers.TV MovieDbProvider.ApiKey, externalSource); - using (var json = await MovieDbProvider.Current.GetMovieDbResponse(new HttpRequestOptions + using (var response = await MovieDbProvider.Current.GetMovieDbResponse(new HttpRequestOptions { Url = url, CancellationToken = cancellationToken, @@ -457,27 +463,30 @@ namespace MediaBrowser.Providers.TV }).ConfigureAwait(false)) { - var result = _jsonSerializer.DeserializeFromStream<MovieDbSearch.ExternalIdLookupResult>(json); - - if (result != null && result.tv_results != null) + using (var json = response.Content) { - var tv = result.tv_results.FirstOrDefault(); + var result = _jsonSerializer.DeserializeFromStream<MovieDbSearch.ExternalIdLookupResult>(json); - if (tv != null) + if (result != null && result.tv_results != null) { - var tmdbSettings = await MovieDbProvider.Current.GetTmdbSettings(cancellationToken).ConfigureAwait(false); - var tmdbImageUrl = tmdbSettings.images.secure_base_url + "original"; + var tv = result.tv_results.FirstOrDefault(); - var remoteResult = new RemoteSearchResult + if (tv != null) { - Name = tv.name, - SearchProviderName = Name, - ImageUrl = string.IsNullOrWhiteSpace(tv.poster_path) ? null : tmdbImageUrl + tv.poster_path - }; + var tmdbSettings = await MovieDbProvider.Current.GetTmdbSettings(cancellationToken).ConfigureAwait(false); + var tmdbImageUrl = tmdbSettings.images.secure_base_url + "original"; - remoteResult.SetProviderId(MetadataProviders.Tmdb, tv.id.ToString(_usCulture)); + var remoteResult = new RemoteSearchResult + { + Name = tv.name, + SearchProviderName = Name, + ImageUrl = string.IsNullOrWhiteSpace(tv.poster_path) ? null : tmdbImageUrl + tv.poster_path + }; - return remoteResult; + remoteResult.SetProviderId(MetadataProviders.Tmdb, tv.id.ToString(_usCulture)); + + return remoteResult; + } } } } diff --git a/MediaBrowser.Providers/TV/TheTVDB/TvdbPrescanTask.cs b/MediaBrowser.Providers/TV/TheTVDB/TvdbPrescanTask.cs index 30d2691e3..ebcd61a6e 100644 --- a/MediaBrowser.Providers/TV/TheTVDB/TvdbPrescanTask.cs +++ b/MediaBrowser.Providers/TV/TheTVDB/TvdbPrescanTask.cs @@ -142,16 +142,20 @@ namespace MediaBrowser.Providers.TV if (string.IsNullOrEmpty(lastUpdateTime)) { // First get tvdb server time - using (var stream = await _httpClient.Get(new HttpRequestOptions + using (var response = await _httpClient.SendAsync(new HttpRequestOptions { Url = ServerTimeUrl, CancellationToken = cancellationToken, EnableHttpCompression = true, BufferContent = false - }).ConfigureAwait(false)) + }, "GET").ConfigureAwait(false)) { - newUpdateTime = GetUpdateTime(stream); + // First get tvdb server time + using (var stream = response.Content) + { + newUpdateTime = GetUpdateTime(stream); + } } existingDirectories.AddRange(missingSeries); @@ -238,23 +242,26 @@ namespace MediaBrowser.Providers.TV private async Task<Tuple<IEnumerable<string>, string>> GetSeriesIdsToUpdate(IEnumerable<string> existingSeriesIds, string lastUpdateTime, CancellationToken cancellationToken) { // First get last time - using (var stream = await _httpClient.Get(new HttpRequestOptions + using (var response = await _httpClient.SendAsync(new HttpRequestOptions { Url = string.Format(UpdatesUrl, lastUpdateTime), CancellationToken = cancellationToken, EnableHttpCompression = true, BufferContent = false - }).ConfigureAwait(false)) + }, "GET").ConfigureAwait(false)) { - var data = GetUpdatedSeriesIdList(stream); + using (var stream = response.Content) + { + var data = GetUpdatedSeriesIdList(stream); - var existingDictionary = existingSeriesIds.ToDictionary(i => i, StringComparer.OrdinalIgnoreCase); + var existingDictionary = existingSeriesIds.ToDictionary(i => i, StringComparer.OrdinalIgnoreCase); - var seriesList = data.Item1 - .Where(i => !string.IsNullOrWhiteSpace(i) && existingDictionary.ContainsKey(i)); + var seriesList = data.Item1 + .Where(i => !string.IsNullOrWhiteSpace(i) && existingDictionary.ContainsKey(i)); - return new Tuple<IEnumerable<string>, string>(seriesList, data.Item2); + return new Tuple<IEnumerable<string>, string>(seriesList, data.Item2); + } } } diff --git a/MediaBrowser.Providers/TV/TheTVDB/TvdbSeriesProvider.cs b/MediaBrowser.Providers/TV/TheTVDB/TvdbSeriesProvider.cs index af18f5f0b..846ab9558 100644 --- a/MediaBrowser.Providers/TV/TheTVDB/TvdbSeriesProvider.cs +++ b/MediaBrowser.Providers/TV/TheTVDB/TvdbSeriesProvider.cs @@ -216,24 +216,27 @@ namespace MediaBrowser.Providers.TV var url = string.Format(SeriesGetZip, TVUtils.TvdbApiKey, seriesId, NormalizeLanguage(preferredMetadataLanguage)); - using (var zipStream = await _httpClient.Get(new HttpRequestOptions + using (var response = await _httpClient.SendAsync(new HttpRequestOptions { Url = url, CancellationToken = cancellationToken, BufferContent = false - }).ConfigureAwait(false)) + }, "GET").ConfigureAwait(false)) { - // Delete existing files - DeleteXmlFiles(seriesDataPath); - - // Copy to memory stream because we need a seekable stream - using (var ms = _memoryStreamProvider.CreateNew()) + using (var zipStream = response.Content) { - await zipStream.CopyToAsync(ms).ConfigureAwait(false); + // Delete existing files + DeleteXmlFiles(seriesDataPath); + + // Copy to memory stream because we need a seekable stream + using (var ms = _memoryStreamProvider.CreateNew()) + { + await zipStream.CopyToAsync(ms).ConfigureAwait(false); - ms.Position = 0; - _zipClient.ExtractAllFromZip(ms, seriesDataPath, true); + ms.Position = 0; + _zipClient.ExtractAllFromZip(ms, seriesDataPath, true); + } } } @@ -260,15 +263,18 @@ namespace MediaBrowser.Providers.TV { var url = string.Format(GetSeriesByImdbId, id, NormalizeLanguage(language)); - using (var result = await _httpClient.Get(new HttpRequestOptions + using (var response = await _httpClient.SendAsync(new HttpRequestOptions { Url = url, CancellationToken = cancellationToken, BufferContent = false - }).ConfigureAwait(false)) + }, "GET").ConfigureAwait(false)) { - return FindSeriesId(result); + using (var result = response.Content) + { + return FindSeriesId(result); + } } } @@ -514,64 +520,67 @@ namespace MediaBrowser.Providers.TV var comparableName = GetComparableName(name); - using (var stream = await _httpClient.Get(new HttpRequestOptions + using (var response = await _httpClient.SendAsync(new HttpRequestOptions { Url = url, CancellationToken = cancellationToken, BufferContent = false - }).ConfigureAwait(false)) + }, "GET").ConfigureAwait(false)) { - var settings = _xmlSettings.Create(false); + using (var stream = response.Content) + { + var settings = _xmlSettings.Create(false); - settings.CheckCharacters = false; - settings.IgnoreProcessingInstructions = true; - settings.IgnoreComments = true; + settings.CheckCharacters = false; + settings.IgnoreProcessingInstructions = true; + settings.IgnoreComments = true; - using (var streamReader = new StreamReader(stream, Encoding.UTF8)) - { - // Use XmlReader for best performance - using (var reader = XmlReader.Create(streamReader, settings)) + using (var streamReader = new StreamReader(stream, Encoding.UTF8)) { - reader.MoveToContent(); - reader.Read(); - - // Loop through each element - while (!reader.EOF && reader.ReadState == ReadState.Interactive) + // Use XmlReader for best performance + using (var reader = XmlReader.Create(streamReader, settings)) { - cancellationToken.ThrowIfCancellationRequested(); + reader.MoveToContent(); + reader.Read(); - if (reader.NodeType == XmlNodeType.Element) + // Loop through each element + while (!reader.EOF && reader.ReadState == ReadState.Interactive) { - switch (reader.Name) + cancellationToken.ThrowIfCancellationRequested(); + + if (reader.NodeType == XmlNodeType.Element) { - case "Series": - { - if (reader.IsEmptyElement) - { - reader.Read(); - continue; - } - using (var subtree = reader.ReadSubtree()) + switch (reader.Name) + { + case "Series": { - var searchResult = GetSeriesSearchResultFromSubTree(subtree, comparableName); - if (searchResult != null) + if (reader.IsEmptyElement) { - searchResult.SearchProviderName = Name; - searchResults.Add(searchResult); + reader.Read(); + continue; } + using (var subtree = reader.ReadSubtree()) + { + var searchResult = GetSeriesSearchResultFromSubTree(subtree, comparableName); + if (searchResult != null) + { + searchResult.SearchProviderName = Name; + searchResults.Add(searchResult); + } + } + break; } - break; - } - default: - reader.Skip(); - break; + default: + reader.Skip(); + break; + } + } + else + { + reader.Read(); } - } - else - { - reader.Read(); } } } @@ -1631,8 +1640,7 @@ namespace MediaBrowser.Providers.TV { get { - // After Omdb - return 1; + return 0; } } diff --git a/MediaBrowser.Server.Mac.sln b/MediaBrowser.Server.Mac.sln deleted file mode 100644 index 051ea660b..000000000 --- a/MediaBrowser.Server.Mac.sln +++ /dev/null @@ -1,550 +0,0 @@ -
-Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio 14
-VisualStudioVersion = 14.0.25420.1
-MinimumVisualStudioVersion = 10.0.40219.1
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Emby.Server.Mac", "MediaBrowser.Server.Mac\Emby.Server.Mac.csproj", "{C97B98FA-00D4-4880-88B8-C76017A418AB}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MediaBrowser.Api", "MediaBrowser.Api\MediaBrowser.Api.csproj", "{4FD51AC5-2C16-4308-A993-C3A84F3B4582}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MediaBrowser.Common", "MediaBrowser.Common\MediaBrowser.Common.csproj", "{9142EEFA-7570-41E1-BFCC-468BB571AF2F}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MediaBrowser.Controller", "MediaBrowser.Controller\MediaBrowser.Controller.csproj", "{17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MediaBrowser.LocalMetadata", "MediaBrowser.LocalMetadata\MediaBrowser.LocalMetadata.csproj", "{7EF9F3E0-697D-42F3-A08F-19DEB5F84392}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MediaBrowser.Model", "MediaBrowser.Model\MediaBrowser.Model.csproj", "{7EEEB4BB-F3E8-48FC-B4C5-70F0FFF8329B}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MediaBrowser.Providers", "MediaBrowser.Providers\MediaBrowser.Providers.csproj", "{442B5058-DCAF-4263-BB6A-F21E31120A1B}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MediaBrowser.WebDashboard", "MediaBrowser.WebDashboard\MediaBrowser.WebDashboard.csproj", "{5624B7B5-B5A7-41D8-9F10-CC5611109619}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MediaBrowser.XbmcMetadata", "MediaBrowser.XbmcMetadata\MediaBrowser.XbmcMetadata.csproj", "{23499896-B135-4527-8574-C26E926EA99E}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenSubtitlesHandler", "OpenSubtitlesHandler\OpenSubtitlesHandler.csproj", "{4A4402D4-E910-443B-B8FC-2C18286A2CA0}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Emby.Drawing", "Emby.Drawing\Emby.Drawing.csproj", "{08FFF49B-F175-4807-A2B5-73B0EBD9F716}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BDInfo", "BDInfo\BDInfo.csproj", "{88AE38DF-19D7-406F-A6A9-09527719A21E}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DvdLib", "DvdLib\DvdLib.csproj", "{713F42B5-878E-499D-A878-E4C652B1D5E8}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Emby.Dlna", "Emby.Dlna\Emby.Dlna.csproj", "{805844AB-E92F-45E6-9D99-4F6D48D129A5}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Emby.Photos", "Emby.Photos\Emby.Photos.csproj", "{89AB4548-770D-41FD-A891-8DAFF44F452C}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Emby.Server.Implementations", "Emby.Server.Implementations\Emby.Server.Implementations.csproj", "{E383961B-9356-4D5D-8233-9A1079D03055}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RSSDP", "RSSDP\RSSDP.csproj", "{21002819-C39A-4D3E-BE83-2A276A77FB1F}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Emby.Drawing.Skia", "Emby.Drawing.Skia\Emby.Drawing.Skia.csproj", "{2312DA6D-FF86-4597-9777-BCEEC32D96DD}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SocketHttpListener", "SocketHttpListener\SocketHttpListener.csproj", "{1D74413B-E7CF-455B-B021-F52BDF881542}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Mono.Nat", "Mono.Nat\Mono.Nat.csproj", "{CB7F2326-6497-4A3D-BA03-48513B17A7BE}"
-EndProject
-Global
- GlobalSection(SolutionConfigurationPlatforms) = preSolution
- AppStore|Any CPU = AppStore|Any CPU
- AppStore|x86 = AppStore|x86
- Debug|Any CPU = Debug|Any CPU
- Debug|x86 = Debug|x86
- Release Mono|Any CPU = Release Mono|Any CPU
- Release Mono|x86 = Release Mono|x86
- Release|Any CPU = Release|Any CPU
- Release|x86 = Release|x86
- Signed|Any CPU = Signed|Any CPU
- Signed|x86 = Signed|x86
- Debug|Mixed Platforms = Debug|Mixed Platforms
- Debug|Win32 = Debug|Win32
- Debug|x64 = Debug|x64
- Release Mono|Mixed Platforms = Release Mono|Mixed Platforms
- Release Mono|Win32 = Release Mono|Win32
- Release Mono|x64 = Release Mono|x64
- Release|Mixed Platforms = Release|Mixed Platforms
- Release|Win32 = Release|Win32
- Release|x64 = Release|x64
- Signed|Mixed Platforms = Signed|Mixed Platforms
- Signed|Win32 = Signed|Win32
- Signed|x64 = Signed|x64
- EndGlobalSection
- GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {C97B98FA-00D4-4880-88B8-C76017A418AB}.AppStore|Any CPU.ActiveCfg = AppStore|Any CPU
- {C97B98FA-00D4-4880-88B8-C76017A418AB}.AppStore|Any CPU.Build.0 = AppStore|Any CPU
- {C97B98FA-00D4-4880-88B8-C76017A418AB}.AppStore|x86.ActiveCfg = AppStore|Any CPU
- {C97B98FA-00D4-4880-88B8-C76017A418AB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {C97B98FA-00D4-4880-88B8-C76017A418AB}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {C97B98FA-00D4-4880-88B8-C76017A418AB}.Debug|x86.ActiveCfg = Debug|Any CPU
- {C97B98FA-00D4-4880-88B8-C76017A418AB}.Debug|x86.Build.0 = Debug|Any CPU
- {C97B98FA-00D4-4880-88B8-C76017A418AB}.Release Mono|Any CPU.ActiveCfg = Debug|Any CPU
- {C97B98FA-00D4-4880-88B8-C76017A418AB}.Release Mono|Any CPU.Build.0 = Debug|Any CPU
- {C97B98FA-00D4-4880-88B8-C76017A418AB}.Release Mono|x86.ActiveCfg = Debug|Any CPU
- {C97B98FA-00D4-4880-88B8-C76017A418AB}.Release Mono|x86.Build.0 = Debug|Any CPU
- {C97B98FA-00D4-4880-88B8-C76017A418AB}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {C97B98FA-00D4-4880-88B8-C76017A418AB}.Release|Any CPU.Build.0 = Release|Any CPU
- {C97B98FA-00D4-4880-88B8-C76017A418AB}.Release|x86.ActiveCfg = Release|Any CPU
- {C97B98FA-00D4-4880-88B8-C76017A418AB}.Release|x86.Build.0 = Release|Any CPU
- {C97B98FA-00D4-4880-88B8-C76017A418AB}.Signed|Any CPU.ActiveCfg = Release|Any CPU
- {C97B98FA-00D4-4880-88B8-C76017A418AB}.Signed|x86.ActiveCfg = Release|Any CPU
- {4FD51AC5-2C16-4308-A993-C3A84F3B4582}.AppStore|Any CPU.ActiveCfg = Release|Any CPU
- {4FD51AC5-2C16-4308-A993-C3A84F3B4582}.AppStore|Any CPU.Build.0 = Release|Any CPU
- {4FD51AC5-2C16-4308-A993-C3A84F3B4582}.AppStore|x86.ActiveCfg = Release Mono|Any CPU
- {4FD51AC5-2C16-4308-A993-C3A84F3B4582}.AppStore|x86.Build.0 = Release Mono|Any CPU
- {4FD51AC5-2C16-4308-A993-C3A84F3B4582}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {4FD51AC5-2C16-4308-A993-C3A84F3B4582}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {4FD51AC5-2C16-4308-A993-C3A84F3B4582}.Debug|x86.ActiveCfg = Debug|Any CPU
- {4FD51AC5-2C16-4308-A993-C3A84F3B4582}.Debug|x86.Build.0 = Debug|Any CPU
- {4FD51AC5-2C16-4308-A993-C3A84F3B4582}.Release Mono|Any CPU.ActiveCfg = Release Mono|Any CPU
- {4FD51AC5-2C16-4308-A993-C3A84F3B4582}.Release Mono|Any CPU.Build.0 = Release Mono|Any CPU
- {4FD51AC5-2C16-4308-A993-C3A84F3B4582}.Release Mono|x86.ActiveCfg = Release Mono|Any CPU
- {4FD51AC5-2C16-4308-A993-C3A84F3B4582}.Release Mono|x86.Build.0 = Release Mono|Any CPU
- {4FD51AC5-2C16-4308-A993-C3A84F3B4582}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {4FD51AC5-2C16-4308-A993-C3A84F3B4582}.Release|Any CPU.Build.0 = Release|Any CPU
- {4FD51AC5-2C16-4308-A993-C3A84F3B4582}.Release|x86.ActiveCfg = Release|Any CPU
- {4FD51AC5-2C16-4308-A993-C3A84F3B4582}.Release|x86.Build.0 = Release|Any CPU
- {4FD51AC5-2C16-4308-A993-C3A84F3B4582}.Signed|Any CPU.ActiveCfg = Release Mono|Any CPU
- {4FD51AC5-2C16-4308-A993-C3A84F3B4582}.Signed|Any CPU.Build.0 = Release Mono|Any CPU
- {4FD51AC5-2C16-4308-A993-C3A84F3B4582}.Signed|x86.ActiveCfg = Release Mono|Any CPU
- {4FD51AC5-2C16-4308-A993-C3A84F3B4582}.Signed|x86.Build.0 = Release Mono|Any CPU
- {9142EEFA-7570-41E1-BFCC-468BB571AF2F}.AppStore|Any CPU.ActiveCfg = Release|Any CPU
- {9142EEFA-7570-41E1-BFCC-468BB571AF2F}.AppStore|Any CPU.Build.0 = Release|Any CPU
- {9142EEFA-7570-41E1-BFCC-468BB571AF2F}.AppStore|x86.ActiveCfg = Release Mono|Any CPU
- {9142EEFA-7570-41E1-BFCC-468BB571AF2F}.AppStore|x86.Build.0 = Release Mono|Any CPU
- {9142EEFA-7570-41E1-BFCC-468BB571AF2F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {9142EEFA-7570-41E1-BFCC-468BB571AF2F}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {9142EEFA-7570-41E1-BFCC-468BB571AF2F}.Debug|x86.ActiveCfg = Debug|Any CPU
- {9142EEFA-7570-41E1-BFCC-468BB571AF2F}.Debug|x86.Build.0 = Debug|Any CPU
- {9142EEFA-7570-41E1-BFCC-468BB571AF2F}.Release Mono|Any CPU.ActiveCfg = Release Mono|Any CPU
- {9142EEFA-7570-41E1-BFCC-468BB571AF2F}.Release Mono|Any CPU.Build.0 = Release Mono|Any CPU
- {9142EEFA-7570-41E1-BFCC-468BB571AF2F}.Release Mono|x86.ActiveCfg = Release Mono|Any CPU
- {9142EEFA-7570-41E1-BFCC-468BB571AF2F}.Release Mono|x86.Build.0 = Release Mono|Any CPU
- {9142EEFA-7570-41E1-BFCC-468BB571AF2F}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {9142EEFA-7570-41E1-BFCC-468BB571AF2F}.Release|Any CPU.Build.0 = Release|Any CPU
- {9142EEFA-7570-41E1-BFCC-468BB571AF2F}.Release|x86.ActiveCfg = Release|Any CPU
- {9142EEFA-7570-41E1-BFCC-468BB571AF2F}.Release|x86.Build.0 = Release|Any CPU
- {9142EEFA-7570-41E1-BFCC-468BB571AF2F}.Signed|Any CPU.ActiveCfg = Release Mono|Any CPU
- {9142EEFA-7570-41E1-BFCC-468BB571AF2F}.Signed|Any CPU.Build.0 = Release Mono|Any CPU
- {9142EEFA-7570-41E1-BFCC-468BB571AF2F}.Signed|x86.ActiveCfg = Release Mono|Any CPU
- {9142EEFA-7570-41E1-BFCC-468BB571AF2F}.Signed|x86.Build.0 = Release Mono|Any CPU
- {17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.AppStore|Any CPU.ActiveCfg = Release|Any CPU
- {17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.AppStore|Any CPU.Build.0 = Release|Any CPU
- {17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.AppStore|x86.ActiveCfg = Release Mono|Any CPU
- {17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.AppStore|x86.Build.0 = Release Mono|Any CPU
- {17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Debug|x86.ActiveCfg = Debug|Any CPU
- {17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Debug|x86.Build.0 = Debug|Any CPU
- {17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Release Mono|Any CPU.ActiveCfg = Release Mono|Any CPU
- {17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Release Mono|Any CPU.Build.0 = Release Mono|Any CPU
- {17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Release Mono|x86.ActiveCfg = Release Mono|Any CPU
- {17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Release Mono|x86.Build.0 = Release Mono|Any CPU
- {17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Release|Any CPU.Build.0 = Release|Any CPU
- {17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Release|x86.ActiveCfg = Release|Any CPU
- {17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Release|x86.Build.0 = Release|Any CPU
- {17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Signed|Any CPU.ActiveCfg = Release Mono|Any CPU
- {17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Signed|Any CPU.Build.0 = Release Mono|Any CPU
- {17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Signed|x86.ActiveCfg = Release Mono|Any CPU
- {17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Signed|x86.Build.0 = Release Mono|Any CPU
- {7EF9F3E0-697D-42F3-A08F-19DEB5F84392}.AppStore|Any CPU.ActiveCfg = Release|Any CPU
- {7EF9F3E0-697D-42F3-A08F-19DEB5F84392}.AppStore|Any CPU.Build.0 = Release|Any CPU
- {7EF9F3E0-697D-42F3-A08F-19DEB5F84392}.AppStore|x86.ActiveCfg = Debug|Any CPU
- {7EF9F3E0-697D-42F3-A08F-19DEB5F84392}.AppStore|x86.Build.0 = Debug|Any CPU
- {7EF9F3E0-697D-42F3-A08F-19DEB5F84392}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {7EF9F3E0-697D-42F3-A08F-19DEB5F84392}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {7EF9F3E0-697D-42F3-A08F-19DEB5F84392}.Debug|x86.ActiveCfg = Debug|Any CPU
- {7EF9F3E0-697D-42F3-A08F-19DEB5F84392}.Debug|x86.Build.0 = Debug|Any CPU
- {7EF9F3E0-697D-42F3-A08F-19DEB5F84392}.Release Mono|Any CPU.ActiveCfg = Debug|Any CPU
- {7EF9F3E0-697D-42F3-A08F-19DEB5F84392}.Release Mono|Any CPU.Build.0 = Debug|Any CPU
- {7EF9F3E0-697D-42F3-A08F-19DEB5F84392}.Release Mono|x86.ActiveCfg = Debug|Any CPU
- {7EF9F3E0-697D-42F3-A08F-19DEB5F84392}.Release Mono|x86.Build.0 = Debug|Any CPU
- {7EF9F3E0-697D-42F3-A08F-19DEB5F84392}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {7EF9F3E0-697D-42F3-A08F-19DEB5F84392}.Release|Any CPU.Build.0 = Release|Any CPU
- {7EF9F3E0-697D-42F3-A08F-19DEB5F84392}.Release|x86.ActiveCfg = Release|Any CPU
- {7EF9F3E0-697D-42F3-A08F-19DEB5F84392}.Release|x86.Build.0 = Release|Any CPU
- {7EF9F3E0-697D-42F3-A08F-19DEB5F84392}.Signed|Any CPU.ActiveCfg = Debug|Any CPU
- {7EF9F3E0-697D-42F3-A08F-19DEB5F84392}.Signed|Any CPU.Build.0 = Debug|Any CPU
- {7EF9F3E0-697D-42F3-A08F-19DEB5F84392}.Signed|x86.ActiveCfg = Debug|Any CPU
- {7EF9F3E0-697D-42F3-A08F-19DEB5F84392}.Signed|x86.Build.0 = Debug|Any CPU
- {7EEEB4BB-F3E8-48FC-B4C5-70F0FFF8329B}.AppStore|Any CPU.ActiveCfg = Release|Any CPU
- {7EEEB4BB-F3E8-48FC-B4C5-70F0FFF8329B}.AppStore|Any CPU.Build.0 = Release|Any CPU
- {7EEEB4BB-F3E8-48FC-B4C5-70F0FFF8329B}.AppStore|x86.ActiveCfg = Debug|Any CPU
- {7EEEB4BB-F3E8-48FC-B4C5-70F0FFF8329B}.AppStore|x86.Build.0 = Debug|Any CPU
- {7EEEB4BB-F3E8-48FC-B4C5-70F0FFF8329B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {7EEEB4BB-F3E8-48FC-B4C5-70F0FFF8329B}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {7EEEB4BB-F3E8-48FC-B4C5-70F0FFF8329B}.Debug|x86.ActiveCfg = Debug|Any CPU
- {7EEEB4BB-F3E8-48FC-B4C5-70F0FFF8329B}.Debug|x86.Build.0 = Debug|Any CPU
- {7EEEB4BB-F3E8-48FC-B4C5-70F0FFF8329B}.Release Mono|Any CPU.ActiveCfg = Release|Any CPU
- {7EEEB4BB-F3E8-48FC-B4C5-70F0FFF8329B}.Release Mono|Any CPU.Build.0 = Release|Any CPU
- {7EEEB4BB-F3E8-48FC-B4C5-70F0FFF8329B}.Release Mono|x86.ActiveCfg = Release|Any CPU
- {7EEEB4BB-F3E8-48FC-B4C5-70F0FFF8329B}.Release Mono|x86.Build.0 = Release|Any CPU
- {7EEEB4BB-F3E8-48FC-B4C5-70F0FFF8329B}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {7EEEB4BB-F3E8-48FC-B4C5-70F0FFF8329B}.Release|Any CPU.Build.0 = Release|Any CPU
- {7EEEB4BB-F3E8-48FC-B4C5-70F0FFF8329B}.Release|x86.ActiveCfg = Release|Any CPU
- {7EEEB4BB-F3E8-48FC-B4C5-70F0FFF8329B}.Release|x86.Build.0 = Release|Any CPU
- {7EEEB4BB-F3E8-48FC-B4C5-70F0FFF8329B}.Signed|Any CPU.ActiveCfg = Debug|Any CPU
- {7EEEB4BB-F3E8-48FC-B4C5-70F0FFF8329B}.Signed|Any CPU.Build.0 = Debug|Any CPU
- {7EEEB4BB-F3E8-48FC-B4C5-70F0FFF8329B}.Signed|x86.ActiveCfg = Debug|Any CPU
- {7EEEB4BB-F3E8-48FC-B4C5-70F0FFF8329B}.Signed|x86.Build.0 = Debug|Any CPU
- {442B5058-DCAF-4263-BB6A-F21E31120A1B}.AppStore|Any CPU.ActiveCfg = Release|Any CPU
- {442B5058-DCAF-4263-BB6A-F21E31120A1B}.AppStore|Any CPU.Build.0 = Release|Any CPU
- {442B5058-DCAF-4263-BB6A-F21E31120A1B}.AppStore|x86.ActiveCfg = Release Mono|Any CPU
- {442B5058-DCAF-4263-BB6A-F21E31120A1B}.AppStore|x86.Build.0 = Release Mono|Any CPU
- {442B5058-DCAF-4263-BB6A-F21E31120A1B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {442B5058-DCAF-4263-BB6A-F21E31120A1B}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {442B5058-DCAF-4263-BB6A-F21E31120A1B}.Debug|x86.ActiveCfg = Debug|Any CPU
- {442B5058-DCAF-4263-BB6A-F21E31120A1B}.Debug|x86.Build.0 = Debug|Any CPU
- {442B5058-DCAF-4263-BB6A-F21E31120A1B}.Release Mono|Any CPU.ActiveCfg = Release Mono|Any CPU
- {442B5058-DCAF-4263-BB6A-F21E31120A1B}.Release Mono|Any CPU.Build.0 = Release Mono|Any CPU
- {442B5058-DCAF-4263-BB6A-F21E31120A1B}.Release Mono|x86.ActiveCfg = Release Mono|Any CPU
- {442B5058-DCAF-4263-BB6A-F21E31120A1B}.Release Mono|x86.Build.0 = Release Mono|Any CPU
- {442B5058-DCAF-4263-BB6A-F21E31120A1B}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {442B5058-DCAF-4263-BB6A-F21E31120A1B}.Release|Any CPU.Build.0 = Release|Any CPU
- {442B5058-DCAF-4263-BB6A-F21E31120A1B}.Release|x86.ActiveCfg = Release|Any CPU
- {442B5058-DCAF-4263-BB6A-F21E31120A1B}.Release|x86.Build.0 = Release|Any CPU
- {442B5058-DCAF-4263-BB6A-F21E31120A1B}.Signed|Any CPU.ActiveCfg = Release Mono|Any CPU
- {442B5058-DCAF-4263-BB6A-F21E31120A1B}.Signed|Any CPU.Build.0 = Release Mono|Any CPU
- {442B5058-DCAF-4263-BB6A-F21E31120A1B}.Signed|x86.ActiveCfg = Release Mono|Any CPU
- {442B5058-DCAF-4263-BB6A-F21E31120A1B}.Signed|x86.Build.0 = Release Mono|Any CPU
- {5624B7B5-B5A7-41D8-9F10-CC5611109619}.AppStore|Any CPU.ActiveCfg = Release|Any CPU
- {5624B7B5-B5A7-41D8-9F10-CC5611109619}.AppStore|Any CPU.Build.0 = Release|Any CPU
- {5624B7B5-B5A7-41D8-9F10-CC5611109619}.AppStore|x86.ActiveCfg = Release Mono|Any CPU
- {5624B7B5-B5A7-41D8-9F10-CC5611109619}.AppStore|x86.Build.0 = Release Mono|Any CPU
- {5624B7B5-B5A7-41D8-9F10-CC5611109619}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {5624B7B5-B5A7-41D8-9F10-CC5611109619}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {5624B7B5-B5A7-41D8-9F10-CC5611109619}.Debug|x86.ActiveCfg = Debug|Any CPU
- {5624B7B5-B5A7-41D8-9F10-CC5611109619}.Debug|x86.Build.0 = Debug|Any CPU
- {5624B7B5-B5A7-41D8-9F10-CC5611109619}.Release Mono|Any CPU.ActiveCfg = Release Mono|Any CPU
- {5624B7B5-B5A7-41D8-9F10-CC5611109619}.Release Mono|Any CPU.Build.0 = Release Mono|Any CPU
- {5624B7B5-B5A7-41D8-9F10-CC5611109619}.Release Mono|x86.ActiveCfg = Release Mono|Any CPU
- {5624B7B5-B5A7-41D8-9F10-CC5611109619}.Release Mono|x86.Build.0 = Release Mono|Any CPU
- {5624B7B5-B5A7-41D8-9F10-CC5611109619}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {5624B7B5-B5A7-41D8-9F10-CC5611109619}.Release|Any CPU.Build.0 = Release|Any CPU
- {5624B7B5-B5A7-41D8-9F10-CC5611109619}.Release|x86.ActiveCfg = Release|Any CPU
- {5624B7B5-B5A7-41D8-9F10-CC5611109619}.Release|x86.Build.0 = Release|Any CPU
- {5624B7B5-B5A7-41D8-9F10-CC5611109619}.Signed|Any CPU.ActiveCfg = Release Mono|Any CPU
- {5624B7B5-B5A7-41D8-9F10-CC5611109619}.Signed|Any CPU.Build.0 = Release Mono|Any CPU
- {5624B7B5-B5A7-41D8-9F10-CC5611109619}.Signed|x86.ActiveCfg = Release Mono|Any CPU
- {5624B7B5-B5A7-41D8-9F10-CC5611109619}.Signed|x86.Build.0 = Release Mono|Any CPU
- {23499896-B135-4527-8574-C26E926EA99E}.AppStore|Any CPU.ActiveCfg = Release|Any CPU
- {23499896-B135-4527-8574-C26E926EA99E}.AppStore|Any CPU.Build.0 = Release|Any CPU
- {23499896-B135-4527-8574-C26E926EA99E}.AppStore|x86.ActiveCfg = Debug|Any CPU
- {23499896-B135-4527-8574-C26E926EA99E}.AppStore|x86.Build.0 = Debug|Any CPU
- {23499896-B135-4527-8574-C26E926EA99E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {23499896-B135-4527-8574-C26E926EA99E}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {23499896-B135-4527-8574-C26E926EA99E}.Debug|x86.ActiveCfg = Debug|Any CPU
- {23499896-B135-4527-8574-C26E926EA99E}.Debug|x86.Build.0 = Debug|Any CPU
- {23499896-B135-4527-8574-C26E926EA99E}.Release Mono|Any CPU.ActiveCfg = Debug|Any CPU
- {23499896-B135-4527-8574-C26E926EA99E}.Release Mono|Any CPU.Build.0 = Debug|Any CPU
- {23499896-B135-4527-8574-C26E926EA99E}.Release Mono|x86.ActiveCfg = Debug|Any CPU
- {23499896-B135-4527-8574-C26E926EA99E}.Release Mono|x86.Build.0 = Debug|Any CPU
- {23499896-B135-4527-8574-C26E926EA99E}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {23499896-B135-4527-8574-C26E926EA99E}.Release|Any CPU.Build.0 = Release|Any CPU
- {23499896-B135-4527-8574-C26E926EA99E}.Release|x86.ActiveCfg = Release|Any CPU
- {23499896-B135-4527-8574-C26E926EA99E}.Release|x86.Build.0 = Release|Any CPU
- {23499896-B135-4527-8574-C26E926EA99E}.Signed|Any CPU.ActiveCfg = Debug|Any CPU
- {23499896-B135-4527-8574-C26E926EA99E}.Signed|Any CPU.Build.0 = Debug|Any CPU
- {23499896-B135-4527-8574-C26E926EA99E}.Signed|x86.ActiveCfg = Debug|Any CPU
- {23499896-B135-4527-8574-C26E926EA99E}.Signed|x86.Build.0 = Debug|Any CPU
- {4A4402D4-E910-443B-B8FC-2C18286A2CA0}.AppStore|Any CPU.ActiveCfg = Release|Any CPU
- {4A4402D4-E910-443B-B8FC-2C18286A2CA0}.AppStore|Any CPU.Build.0 = Release|Any CPU
- {4A4402D4-E910-443B-B8FC-2C18286A2CA0}.AppStore|x86.ActiveCfg = Release Mono|Any CPU
- {4A4402D4-E910-443B-B8FC-2C18286A2CA0}.AppStore|x86.Build.0 = Release Mono|Any CPU
- {4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Debug|x86.ActiveCfg = Debug|Any CPU
- {4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Debug|x86.Build.0 = Debug|Any CPU
- {4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Release Mono|Any CPU.ActiveCfg = Release Mono|Any CPU
- {4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Release Mono|Any CPU.Build.0 = Release Mono|Any CPU
- {4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Release Mono|x86.ActiveCfg = Release Mono|Any CPU
- {4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Release Mono|x86.Build.0 = Release Mono|Any CPU
- {4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Release|Any CPU.Build.0 = Release|Any CPU
- {4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Release|x86.ActiveCfg = Release|Any CPU
- {4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Release|x86.Build.0 = Release|Any CPU
- {4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Signed|Any CPU.ActiveCfg = Release Mono|Any CPU
- {4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Signed|Any CPU.Build.0 = Release Mono|Any CPU
- {4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Signed|x86.ActiveCfg = Release Mono|Any CPU
- {4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Signed|x86.Build.0 = Release Mono|Any CPU
- {08FFF49B-F175-4807-A2B5-73B0EBD9F716}.AppStore|Any CPU.ActiveCfg = Release|Any CPU
- {08FFF49B-F175-4807-A2B5-73B0EBD9F716}.AppStore|Any CPU.Build.0 = Release|Any CPU
- {08FFF49B-F175-4807-A2B5-73B0EBD9F716}.AppStore|x86.ActiveCfg = Debug|Any CPU
- {08FFF49B-F175-4807-A2B5-73B0EBD9F716}.AppStore|x86.Build.0 = Debug|Any CPU
- {08FFF49B-F175-4807-A2B5-73B0EBD9F716}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {08FFF49B-F175-4807-A2B5-73B0EBD9F716}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {08FFF49B-F175-4807-A2B5-73B0EBD9F716}.Debug|x86.ActiveCfg = Debug|Any CPU
- {08FFF49B-F175-4807-A2B5-73B0EBD9F716}.Debug|x86.Build.0 = Debug|Any CPU
- {08FFF49B-F175-4807-A2B5-73B0EBD9F716}.Release Mono|Any CPU.ActiveCfg = Debug|Any CPU
- {08FFF49B-F175-4807-A2B5-73B0EBD9F716}.Release Mono|Any CPU.Build.0 = Debug|Any CPU
- {08FFF49B-F175-4807-A2B5-73B0EBD9F716}.Release Mono|x86.ActiveCfg = Debug|Any CPU
- {08FFF49B-F175-4807-A2B5-73B0EBD9F716}.Release Mono|x86.Build.0 = Debug|Any CPU
- {08FFF49B-F175-4807-A2B5-73B0EBD9F716}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {08FFF49B-F175-4807-A2B5-73B0EBD9F716}.Release|Any CPU.Build.0 = Release|Any CPU
- {08FFF49B-F175-4807-A2B5-73B0EBD9F716}.Release|x86.ActiveCfg = Release|Any CPU
- {08FFF49B-F175-4807-A2B5-73B0EBD9F716}.Release|x86.Build.0 = Release|Any CPU
- {08FFF49B-F175-4807-A2B5-73B0EBD9F716}.Signed|Any CPU.ActiveCfg = Debug|Any CPU
- {08FFF49B-F175-4807-A2B5-73B0EBD9F716}.Signed|Any CPU.Build.0 = Debug|Any CPU
- {08FFF49B-F175-4807-A2B5-73B0EBD9F716}.Signed|x86.ActiveCfg = Debug|Any CPU
- {08FFF49B-F175-4807-A2B5-73B0EBD9F716}.Signed|x86.Build.0 = Debug|Any CPU
- {88AE38DF-19D7-406F-A6A9-09527719A21E}.AppStore|Any CPU.ActiveCfg = Release|Any CPU
- {88AE38DF-19D7-406F-A6A9-09527719A21E}.AppStore|Any CPU.Build.0 = Release|Any CPU
- {88AE38DF-19D7-406F-A6A9-09527719A21E}.AppStore|x86.ActiveCfg = Release|Any CPU
- {88AE38DF-19D7-406F-A6A9-09527719A21E}.AppStore|x86.Build.0 = Release|Any CPU
- {88AE38DF-19D7-406F-A6A9-09527719A21E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {88AE38DF-19D7-406F-A6A9-09527719A21E}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {88AE38DF-19D7-406F-A6A9-09527719A21E}.Debug|x86.ActiveCfg = Debug|Any CPU
- {88AE38DF-19D7-406F-A6A9-09527719A21E}.Debug|x86.Build.0 = Debug|Any CPU
- {88AE38DF-19D7-406F-A6A9-09527719A21E}.Release Mono|Any CPU.ActiveCfg = Release|Any CPU
- {88AE38DF-19D7-406F-A6A9-09527719A21E}.Release Mono|Any CPU.Build.0 = Release|Any CPU
- {88AE38DF-19D7-406F-A6A9-09527719A21E}.Release Mono|x86.ActiveCfg = Release|Any CPU
- {88AE38DF-19D7-406F-A6A9-09527719A21E}.Release Mono|x86.Build.0 = Release|Any CPU
- {88AE38DF-19D7-406F-A6A9-09527719A21E}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {88AE38DF-19D7-406F-A6A9-09527719A21E}.Release|Any CPU.Build.0 = Release|Any CPU
- {88AE38DF-19D7-406F-A6A9-09527719A21E}.Release|x86.ActiveCfg = Release|Any CPU
- {88AE38DF-19D7-406F-A6A9-09527719A21E}.Release|x86.Build.0 = Release|Any CPU
- {88AE38DF-19D7-406F-A6A9-09527719A21E}.Signed|Any CPU.ActiveCfg = Release|Any CPU
- {88AE38DF-19D7-406F-A6A9-09527719A21E}.Signed|Any CPU.Build.0 = Release|Any CPU
- {88AE38DF-19D7-406F-A6A9-09527719A21E}.Signed|x86.ActiveCfg = Release|Any CPU
- {88AE38DF-19D7-406F-A6A9-09527719A21E}.Signed|x86.Build.0 = Release|Any CPU
- {713F42B5-878E-499D-A878-E4C652B1D5E8}.AppStore|Any CPU.ActiveCfg = Release|Any CPU
- {713F42B5-878E-499D-A878-E4C652B1D5E8}.AppStore|Any CPU.Build.0 = Release|Any CPU
- {713F42B5-878E-499D-A878-E4C652B1D5E8}.AppStore|x86.ActiveCfg = Release|Any CPU
- {713F42B5-878E-499D-A878-E4C652B1D5E8}.AppStore|x86.Build.0 = Release|Any CPU
- {713F42B5-878E-499D-A878-E4C652B1D5E8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {713F42B5-878E-499D-A878-E4C652B1D5E8}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {713F42B5-878E-499D-A878-E4C652B1D5E8}.Debug|x86.ActiveCfg = Debug|Any CPU
- {713F42B5-878E-499D-A878-E4C652B1D5E8}.Debug|x86.Build.0 = Debug|Any CPU
- {713F42B5-878E-499D-A878-E4C652B1D5E8}.Release Mono|Any CPU.ActiveCfg = Release|Any CPU
- {713F42B5-878E-499D-A878-E4C652B1D5E8}.Release Mono|Any CPU.Build.0 = Release|Any CPU
- {713F42B5-878E-499D-A878-E4C652B1D5E8}.Release Mono|x86.ActiveCfg = Release|Any CPU
- {713F42B5-878E-499D-A878-E4C652B1D5E8}.Release Mono|x86.Build.0 = Release|Any CPU
- {713F42B5-878E-499D-A878-E4C652B1D5E8}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {713F42B5-878E-499D-A878-E4C652B1D5E8}.Release|Any CPU.Build.0 = Release|Any CPU
- {713F42B5-878E-499D-A878-E4C652B1D5E8}.Release|x86.ActiveCfg = Release|Any CPU
- {713F42B5-878E-499D-A878-E4C652B1D5E8}.Release|x86.Build.0 = Release|Any CPU
- {713F42B5-878E-499D-A878-E4C652B1D5E8}.Signed|Any CPU.ActiveCfg = Release|Any CPU
- {713F42B5-878E-499D-A878-E4C652B1D5E8}.Signed|Any CPU.Build.0 = Release|Any CPU
- {713F42B5-878E-499D-A878-E4C652B1D5E8}.Signed|x86.ActiveCfg = Release|Any CPU
- {713F42B5-878E-499D-A878-E4C652B1D5E8}.Signed|x86.Build.0 = Release|Any CPU
- {805844AB-E92F-45E6-9D99-4F6D48D129A5}.AppStore|Any CPU.ActiveCfg = Release|Any CPU
- {805844AB-E92F-45E6-9D99-4F6D48D129A5}.AppStore|Any CPU.Build.0 = Release|Any CPU
- {805844AB-E92F-45E6-9D99-4F6D48D129A5}.AppStore|x86.ActiveCfg = Release|Any CPU
- {805844AB-E92F-45E6-9D99-4F6D48D129A5}.AppStore|x86.Build.0 = Release|Any CPU
- {805844AB-E92F-45E6-9D99-4F6D48D129A5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {805844AB-E92F-45E6-9D99-4F6D48D129A5}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {805844AB-E92F-45E6-9D99-4F6D48D129A5}.Debug|x86.ActiveCfg = Debug|Any CPU
- {805844AB-E92F-45E6-9D99-4F6D48D129A5}.Debug|x86.Build.0 = Debug|Any CPU
- {805844AB-E92F-45E6-9D99-4F6D48D129A5}.Release Mono|Any CPU.ActiveCfg = Release|Any CPU
- {805844AB-E92F-45E6-9D99-4F6D48D129A5}.Release Mono|Any CPU.Build.0 = Release|Any CPU
- {805844AB-E92F-45E6-9D99-4F6D48D129A5}.Release Mono|x86.ActiveCfg = Release|Any CPU
- {805844AB-E92F-45E6-9D99-4F6D48D129A5}.Release Mono|x86.Build.0 = Release|Any CPU
- {805844AB-E92F-45E6-9D99-4F6D48D129A5}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {805844AB-E92F-45E6-9D99-4F6D48D129A5}.Release|Any CPU.Build.0 = Release|Any CPU
- {805844AB-E92F-45E6-9D99-4F6D48D129A5}.Release|x86.ActiveCfg = Release|Any CPU
- {805844AB-E92F-45E6-9D99-4F6D48D129A5}.Release|x86.Build.0 = Release|Any CPU
- {805844AB-E92F-45E6-9D99-4F6D48D129A5}.Signed|Any CPU.ActiveCfg = Release|Any CPU
- {805844AB-E92F-45E6-9D99-4F6D48D129A5}.Signed|Any CPU.Build.0 = Release|Any CPU
- {805844AB-E92F-45E6-9D99-4F6D48D129A5}.Signed|x86.ActiveCfg = Release|Any CPU
- {805844AB-E92F-45E6-9D99-4F6D48D129A5}.Signed|x86.Build.0 = Release|Any CPU
- {89AB4548-770D-41FD-A891-8DAFF44F452C}.AppStore|Any CPU.ActiveCfg = Release|Any CPU
- {89AB4548-770D-41FD-A891-8DAFF44F452C}.AppStore|Any CPU.Build.0 = Release|Any CPU
- {89AB4548-770D-41FD-A891-8DAFF44F452C}.AppStore|x86.ActiveCfg = Release|Any CPU
- {89AB4548-770D-41FD-A891-8DAFF44F452C}.AppStore|x86.Build.0 = Release|Any CPU
- {89AB4548-770D-41FD-A891-8DAFF44F452C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {89AB4548-770D-41FD-A891-8DAFF44F452C}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {89AB4548-770D-41FD-A891-8DAFF44F452C}.Debug|x86.ActiveCfg = Debug|Any CPU
- {89AB4548-770D-41FD-A891-8DAFF44F452C}.Debug|x86.Build.0 = Debug|Any CPU
- {89AB4548-770D-41FD-A891-8DAFF44F452C}.Release Mono|Any CPU.ActiveCfg = Release|Any CPU
- {89AB4548-770D-41FD-A891-8DAFF44F452C}.Release Mono|Any CPU.Build.0 = Release|Any CPU
- {89AB4548-770D-41FD-A891-8DAFF44F452C}.Release Mono|x86.ActiveCfg = Release|Any CPU
- {89AB4548-770D-41FD-A891-8DAFF44F452C}.Release Mono|x86.Build.0 = Release|Any CPU
- {89AB4548-770D-41FD-A891-8DAFF44F452C}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {89AB4548-770D-41FD-A891-8DAFF44F452C}.Release|Any CPU.Build.0 = Release|Any CPU
- {89AB4548-770D-41FD-A891-8DAFF44F452C}.Release|x86.ActiveCfg = Release|Any CPU
- {89AB4548-770D-41FD-A891-8DAFF44F452C}.Release|x86.Build.0 = Release|Any CPU
- {89AB4548-770D-41FD-A891-8DAFF44F452C}.Signed|Any CPU.ActiveCfg = Release|Any CPU
- {89AB4548-770D-41FD-A891-8DAFF44F452C}.Signed|Any CPU.Build.0 = Release|Any CPU
- {89AB4548-770D-41FD-A891-8DAFF44F452C}.Signed|x86.ActiveCfg = Release|Any CPU
- {89AB4548-770D-41FD-A891-8DAFF44F452C}.Signed|x86.Build.0 = Release|Any CPU
- {E383961B-9356-4D5D-8233-9A1079D03055}.AppStore|Any CPU.ActiveCfg = Release|Any CPU
- {E383961B-9356-4D5D-8233-9A1079D03055}.AppStore|Any CPU.Build.0 = Release|Any CPU
- {E383961B-9356-4D5D-8233-9A1079D03055}.AppStore|x86.ActiveCfg = Release|Any CPU
- {E383961B-9356-4D5D-8233-9A1079D03055}.AppStore|x86.Build.0 = Release|Any CPU
- {E383961B-9356-4D5D-8233-9A1079D03055}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {E383961B-9356-4D5D-8233-9A1079D03055}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {E383961B-9356-4D5D-8233-9A1079D03055}.Debug|x86.ActiveCfg = Debug|Any CPU
- {E383961B-9356-4D5D-8233-9A1079D03055}.Debug|x86.Build.0 = Debug|Any CPU
- {E383961B-9356-4D5D-8233-9A1079D03055}.Release Mono|Any CPU.ActiveCfg = Release|Any CPU
- {E383961B-9356-4D5D-8233-9A1079D03055}.Release Mono|Any CPU.Build.0 = Release|Any CPU
- {E383961B-9356-4D5D-8233-9A1079D03055}.Release Mono|x86.ActiveCfg = Release|Any CPU
- {E383961B-9356-4D5D-8233-9A1079D03055}.Release Mono|x86.Build.0 = Release|Any CPU
- {E383961B-9356-4D5D-8233-9A1079D03055}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {E383961B-9356-4D5D-8233-9A1079D03055}.Release|Any CPU.Build.0 = Release|Any CPU
- {E383961B-9356-4D5D-8233-9A1079D03055}.Release|x86.ActiveCfg = Release|Any CPU
- {E383961B-9356-4D5D-8233-9A1079D03055}.Release|x86.Build.0 = Release|Any CPU
- {E383961B-9356-4D5D-8233-9A1079D03055}.Signed|Any CPU.ActiveCfg = Release|Any CPU
- {E383961B-9356-4D5D-8233-9A1079D03055}.Signed|Any CPU.Build.0 = Release|Any CPU
- {E383961B-9356-4D5D-8233-9A1079D03055}.Signed|x86.ActiveCfg = Release|Any CPU
- {E383961B-9356-4D5D-8233-9A1079D03055}.Signed|x86.Build.0 = Release|Any CPU
- {21002819-C39A-4D3E-BE83-2A276A77FB1F}.AppStore|Any CPU.ActiveCfg = Release|Any CPU
- {21002819-C39A-4D3E-BE83-2A276A77FB1F}.AppStore|Any CPU.Build.0 = Release|Any CPU
- {21002819-C39A-4D3E-BE83-2A276A77FB1F}.AppStore|x86.ActiveCfg = Release|Any CPU
- {21002819-C39A-4D3E-BE83-2A276A77FB1F}.AppStore|x86.Build.0 = Release|Any CPU
- {21002819-C39A-4D3E-BE83-2A276A77FB1F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {21002819-C39A-4D3E-BE83-2A276A77FB1F}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {21002819-C39A-4D3E-BE83-2A276A77FB1F}.Debug|x86.ActiveCfg = Debug|Any CPU
- {21002819-C39A-4D3E-BE83-2A276A77FB1F}.Debug|x86.Build.0 = Debug|Any CPU
- {21002819-C39A-4D3E-BE83-2A276A77FB1F}.Release Mono|Any CPU.ActiveCfg = Release|Any CPU
- {21002819-C39A-4D3E-BE83-2A276A77FB1F}.Release Mono|Any CPU.Build.0 = Release|Any CPU
- {21002819-C39A-4D3E-BE83-2A276A77FB1F}.Release Mono|x86.ActiveCfg = Release|Any CPU
- {21002819-C39A-4D3E-BE83-2A276A77FB1F}.Release Mono|x86.Build.0 = Release|Any CPU
- {21002819-C39A-4D3E-BE83-2A276A77FB1F}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {21002819-C39A-4D3E-BE83-2A276A77FB1F}.Release|Any CPU.Build.0 = Release|Any CPU
- {21002819-C39A-4D3E-BE83-2A276A77FB1F}.Release|x86.ActiveCfg = Release|Any CPU
- {21002819-C39A-4D3E-BE83-2A276A77FB1F}.Release|x86.Build.0 = Release|Any CPU
- {21002819-C39A-4D3E-BE83-2A276A77FB1F}.Signed|Any CPU.ActiveCfg = Release|Any CPU
- {21002819-C39A-4D3E-BE83-2A276A77FB1F}.Signed|Any CPU.Build.0 = Release|Any CPU
- {21002819-C39A-4D3E-BE83-2A276A77FB1F}.Signed|x86.ActiveCfg = Release|Any CPU
- {21002819-C39A-4D3E-BE83-2A276A77FB1F}.Signed|x86.Build.0 = Release|Any CPU
- {2312DA6D-FF86-4597-9777-BCEEC32D96DD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {2312DA6D-FF86-4597-9777-BCEEC32D96DD}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {2312DA6D-FF86-4597-9777-BCEEC32D96DD}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
- {2312DA6D-FF86-4597-9777-BCEEC32D96DD}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
- {2312DA6D-FF86-4597-9777-BCEEC32D96DD}.Debug|Win32.ActiveCfg = Debug|Any CPU
- {2312DA6D-FF86-4597-9777-BCEEC32D96DD}.Debug|Win32.Build.0 = Debug|Any CPU
- {2312DA6D-FF86-4597-9777-BCEEC32D96DD}.Debug|x64.ActiveCfg = Debug|Any CPU
- {2312DA6D-FF86-4597-9777-BCEEC32D96DD}.Debug|x64.Build.0 = Debug|Any CPU
- {2312DA6D-FF86-4597-9777-BCEEC32D96DD}.Debug|x86.ActiveCfg = Debug|Any CPU
- {2312DA6D-FF86-4597-9777-BCEEC32D96DD}.Debug|x86.Build.0 = Debug|Any CPU
- {2312DA6D-FF86-4597-9777-BCEEC32D96DD}.Release Mono|Any CPU.ActiveCfg = Release|Any CPU
- {2312DA6D-FF86-4597-9777-BCEEC32D96DD}.Release Mono|Any CPU.Build.0 = Release|Any CPU
- {2312DA6D-FF86-4597-9777-BCEEC32D96DD}.Release Mono|Mixed Platforms.ActiveCfg = Release|Any CPU
- {2312DA6D-FF86-4597-9777-BCEEC32D96DD}.Release Mono|Mixed Platforms.Build.0 = Release|Any CPU
- {2312DA6D-FF86-4597-9777-BCEEC32D96DD}.Release Mono|Win32.ActiveCfg = Release|Any CPU
- {2312DA6D-FF86-4597-9777-BCEEC32D96DD}.Release Mono|Win32.Build.0 = Release|Any CPU
- {2312DA6D-FF86-4597-9777-BCEEC32D96DD}.Release Mono|x64.ActiveCfg = Release|Any CPU
- {2312DA6D-FF86-4597-9777-BCEEC32D96DD}.Release Mono|x64.Build.0 = Release|Any CPU
- {2312DA6D-FF86-4597-9777-BCEEC32D96DD}.Release Mono|x86.ActiveCfg = Release|Any CPU
- {2312DA6D-FF86-4597-9777-BCEEC32D96DD}.Release Mono|x86.Build.0 = Release|Any CPU
- {2312DA6D-FF86-4597-9777-BCEEC32D96DD}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {2312DA6D-FF86-4597-9777-BCEEC32D96DD}.Release|Any CPU.Build.0 = Release|Any CPU
- {2312DA6D-FF86-4597-9777-BCEEC32D96DD}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
- {2312DA6D-FF86-4597-9777-BCEEC32D96DD}.Release|Mixed Platforms.Build.0 = Release|Any CPU
- {2312DA6D-FF86-4597-9777-BCEEC32D96DD}.Release|Win32.ActiveCfg = Release|Any CPU
- {2312DA6D-FF86-4597-9777-BCEEC32D96DD}.Release|Win32.Build.0 = Release|Any CPU
- {2312DA6D-FF86-4597-9777-BCEEC32D96DD}.Release|x64.ActiveCfg = Release|Any CPU
- {2312DA6D-FF86-4597-9777-BCEEC32D96DD}.Release|x64.Build.0 = Release|Any CPU
- {2312DA6D-FF86-4597-9777-BCEEC32D96DD}.Release|x86.ActiveCfg = Release|Any CPU
- {2312DA6D-FF86-4597-9777-BCEEC32D96DD}.Release|x86.Build.0 = Release|Any CPU
- {2312DA6D-FF86-4597-9777-BCEEC32D96DD}.Signed|Any CPU.ActiveCfg = Release|Any CPU
- {2312DA6D-FF86-4597-9777-BCEEC32D96DD}.Signed|Any CPU.Build.0 = Release|Any CPU
- {2312DA6D-FF86-4597-9777-BCEEC32D96DD}.Signed|Mixed Platforms.ActiveCfg = Release|Any CPU
- {2312DA6D-FF86-4597-9777-BCEEC32D96DD}.Signed|Mixed Platforms.Build.0 = Release|Any CPU
- {2312DA6D-FF86-4597-9777-BCEEC32D96DD}.Signed|Win32.ActiveCfg = Release|Any CPU
- {2312DA6D-FF86-4597-9777-BCEEC32D96DD}.Signed|Win32.Build.0 = Release|Any CPU
- {2312DA6D-FF86-4597-9777-BCEEC32D96DD}.Signed|x64.ActiveCfg = Release|Any CPU
- {2312DA6D-FF86-4597-9777-BCEEC32D96DD}.Signed|x64.Build.0 = Release|Any CPU
- {2312DA6D-FF86-4597-9777-BCEEC32D96DD}.Signed|x86.ActiveCfg = Release|Any CPU
- {2312DA6D-FF86-4597-9777-BCEEC32D96DD}.Signed|x86.Build.0 = Release|Any CPU
- {1D74413B-E7CF-455B-B021-F52BDF881542}.AppStore|Any CPU.ActiveCfg = Debug|Any CPU
- {1D74413B-E7CF-455B-B021-F52BDF881542}.AppStore|Any CPU.Build.0 = Debug|Any CPU
- {1D74413B-E7CF-455B-B021-F52BDF881542}.AppStore|x86.ActiveCfg = Debug|Any CPU
- {1D74413B-E7CF-455B-B021-F52BDF881542}.AppStore|x86.Build.0 = Debug|Any CPU
- {1D74413B-E7CF-455B-B021-F52BDF881542}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {1D74413B-E7CF-455B-B021-F52BDF881542}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {1D74413B-E7CF-455B-B021-F52BDF881542}.Debug|x86.ActiveCfg = Debug|Any CPU
- {1D74413B-E7CF-455B-B021-F52BDF881542}.Debug|x86.Build.0 = Debug|Any CPU
- {1D74413B-E7CF-455B-B021-F52BDF881542}.Release Mono|Any CPU.ActiveCfg = Debug|Any CPU
- {1D74413B-E7CF-455B-B021-F52BDF881542}.Release Mono|Any CPU.Build.0 = Debug|Any CPU
- {1D74413B-E7CF-455B-B021-F52BDF881542}.Release Mono|x86.ActiveCfg = Debug|Any CPU
- {1D74413B-E7CF-455B-B021-F52BDF881542}.Release Mono|x86.Build.0 = Debug|Any CPU
- {1D74413B-E7CF-455B-B021-F52BDF881542}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {1D74413B-E7CF-455B-B021-F52BDF881542}.Release|Any CPU.Build.0 = Release|Any CPU
- {1D74413B-E7CF-455B-B021-F52BDF881542}.Release|x86.ActiveCfg = Release|Any CPU
- {1D74413B-E7CF-455B-B021-F52BDF881542}.Release|x86.Build.0 = Release|Any CPU
- {1D74413B-E7CF-455B-B021-F52BDF881542}.Signed|Any CPU.ActiveCfg = Debug|Any CPU
- {1D74413B-E7CF-455B-B021-F52BDF881542}.Signed|Any CPU.Build.0 = Debug|Any CPU
- {1D74413B-E7CF-455B-B021-F52BDF881542}.Signed|x86.ActiveCfg = Debug|Any CPU
- {1D74413B-E7CF-455B-B021-F52BDF881542}.Signed|x86.Build.0 = Debug|Any CPU
- {1D74413B-E7CF-455B-B021-F52BDF881542}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
- {1D74413B-E7CF-455B-B021-F52BDF881542}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
- {1D74413B-E7CF-455B-B021-F52BDF881542}.Debug|Win32.ActiveCfg = Debug|Any CPU
- {1D74413B-E7CF-455B-B021-F52BDF881542}.Debug|Win32.Build.0 = Debug|Any CPU
- {1D74413B-E7CF-455B-B021-F52BDF881542}.Debug|x64.ActiveCfg = Debug|Any CPU
- {1D74413B-E7CF-455B-B021-F52BDF881542}.Debug|x64.Build.0 = Debug|Any CPU
- {1D74413B-E7CF-455B-B021-F52BDF881542}.Release Mono|Mixed Platforms.ActiveCfg = Debug|Any CPU
- {1D74413B-E7CF-455B-B021-F52BDF881542}.Release Mono|Mixed Platforms.Build.0 = Debug|Any CPU
- {1D74413B-E7CF-455B-B021-F52BDF881542}.Release Mono|Win32.ActiveCfg = Debug|Any CPU
- {1D74413B-E7CF-455B-B021-F52BDF881542}.Release Mono|Win32.Build.0 = Debug|Any CPU
- {1D74413B-E7CF-455B-B021-F52BDF881542}.Release Mono|x64.ActiveCfg = Debug|Any CPU
- {1D74413B-E7CF-455B-B021-F52BDF881542}.Release Mono|x64.Build.0 = Debug|Any CPU
- {1D74413B-E7CF-455B-B021-F52BDF881542}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
- {1D74413B-E7CF-455B-B021-F52BDF881542}.Release|Mixed Platforms.Build.0 = Release|Any CPU
- {1D74413B-E7CF-455B-B021-F52BDF881542}.Release|Win32.ActiveCfg = Release|Any CPU
- {1D74413B-E7CF-455B-B021-F52BDF881542}.Release|Win32.Build.0 = Release|Any CPU
- {1D74413B-E7CF-455B-B021-F52BDF881542}.Release|x64.ActiveCfg = Release|Any CPU
- {1D74413B-E7CF-455B-B021-F52BDF881542}.Release|x64.Build.0 = Release|Any CPU
- {1D74413B-E7CF-455B-B021-F52BDF881542}.Signed|Mixed Platforms.ActiveCfg = Debug|Any CPU
- {1D74413B-E7CF-455B-B021-F52BDF881542}.Signed|Mixed Platforms.Build.0 = Debug|Any CPU
- {1D74413B-E7CF-455B-B021-F52BDF881542}.Signed|Win32.ActiveCfg = Debug|Any CPU
- {1D74413B-E7CF-455B-B021-F52BDF881542}.Signed|Win32.Build.0 = Debug|Any CPU
- {1D74413B-E7CF-455B-B021-F52BDF881542}.Signed|x64.ActiveCfg = Debug|Any CPU
- {1D74413B-E7CF-455B-B021-F52BDF881542}.Signed|x64.Build.0 = Debug|Any CPU
- {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.AppStore|Any CPU.ActiveCfg = Debug|Any CPU
- {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.AppStore|Any CPU.Build.0 = Debug|Any CPU
- {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.AppStore|x86.ActiveCfg = Debug|Any CPU
- {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.AppStore|x86.Build.0 = Debug|Any CPU
- {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.Debug|x86.ActiveCfg = Debug|Any CPU
- {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.Debug|x86.Build.0 = Debug|Any CPU
- {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.Release Mono|Any CPU.ActiveCfg = Debug|Any CPU
- {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.Release Mono|Any CPU.Build.0 = Debug|Any CPU
- {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.Release Mono|x86.ActiveCfg = Debug|Any CPU
- {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.Release Mono|x86.Build.0 = Debug|Any CPU
- {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.Release|Any CPU.Build.0 = Release|Any CPU
- {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.Release|x86.ActiveCfg = Release|Any CPU
- {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.Release|x86.Build.0 = Release|Any CPU
- {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.Signed|Any CPU.ActiveCfg = Debug|Any CPU
- {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.Signed|Any CPU.Build.0 = Debug|Any CPU
- {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.Signed|x86.ActiveCfg = Debug|Any CPU
- {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.Signed|x86.Build.0 = Debug|Any CPU
- {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
- {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
- {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.Debug|Win32.ActiveCfg = Debug|Any CPU
- {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.Debug|Win32.Build.0 = Debug|Any CPU
- {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.Debug|x64.ActiveCfg = Debug|Any CPU
- {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.Debug|x64.Build.0 = Debug|Any CPU
- {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.Release Mono|Mixed Platforms.ActiveCfg = Debug|Any CPU
- {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.Release Mono|Mixed Platforms.Build.0 = Debug|Any CPU
- {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.Release Mono|Win32.ActiveCfg = Debug|Any CPU
- {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.Release Mono|Win32.Build.0 = Debug|Any CPU
- {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.Release Mono|x64.ActiveCfg = Debug|Any CPU
- {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.Release Mono|x64.Build.0 = Debug|Any CPU
- {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
- {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.Release|Mixed Platforms.Build.0 = Release|Any CPU
- {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.Release|Win32.ActiveCfg = Release|Any CPU
- {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.Release|Win32.Build.0 = Release|Any CPU
- {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.Release|x64.ActiveCfg = Release|Any CPU
- {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.Release|x64.Build.0 = Release|Any CPU
- {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.Signed|Mixed Platforms.ActiveCfg = Debug|Any CPU
- {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.Signed|Mixed Platforms.Build.0 = Debug|Any CPU
- {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.Signed|Win32.ActiveCfg = Debug|Any CPU
- {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.Signed|Win32.Build.0 = Debug|Any CPU
- {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.Signed|x64.ActiveCfg = Debug|Any CPU
- {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.Signed|x64.Build.0 = Debug|Any CPU
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
- GlobalSection(MonoDevelopProperties) = preSolution
- Policies = $0
- $0.DotNetNamingPolicy = $1
- $1.DirectoryNamespaceAssociation = None
- $1.ResourceNamePolicy = FileFormatDefault
- $0.VersionControlPolicy = $2
- $2.inheritsSet = Mono
- version =
- EndGlobalSection
-EndGlobal
diff --git a/MediaBrowser.Server.Mac.userprefs b/MediaBrowser.Server.Mac.userprefs deleted file mode 100644 index cd108e550..000000000 --- a/MediaBrowser.Server.Mac.userprefs +++ /dev/null @@ -1,13 +0,0 @@ -<Properties> - <MonoDevelop.Ide.Workspace ActiveConfiguration="Release" /> - <MonoDevelop.Ide.Workbench /> - <MonoDevelop.Ide.DebuggingService.Breakpoints> - <BreakpointStore> - <Breakpoint file="/Users/luke/MediaBrowser/MediaBrowser.Common.Implementations/BaseApplicationPaths.cs" line="233" column="1" /> - </BreakpointStore> - </MonoDevelop.Ide.DebuggingService.Breakpoints> - <MonoDevelop.Ide.DebuggingService.PinnedWatches /> - <StartupItems> - <String>MediaBrowser.Server.Mac/Emby.Server.Mac.csproj</String> - </StartupItems> -</Properties>
\ No newline at end of file diff --git a/MediaBrowser.Server.Mac/AppController.cs b/MediaBrowser.Server.Mac/AppController.cs deleted file mode 100644 index 9e32b53f1..000000000 --- a/MediaBrowser.Server.Mac/AppController.cs +++ /dev/null @@ -1,19 +0,0 @@ -using MediaBrowser.Controller; -using MediaBrowser.Controller.Configuration; -using MediaBrowser.Model.Logging; -using System; -using MonoMac.Foundation; -using MonoMac.AppKit; - -namespace MediaBrowser.Server.Mac -{ - [Register("AppController")] - public partial class AppController : NSObject - { - public override void AwakeFromNib() - { - //new MenuBarIcon ().ShowIcon (); - } - } -} - diff --git a/MediaBrowser.Server.Mac/AppController.designer.cs b/MediaBrowser.Server.Mac/AppController.designer.cs deleted file mode 100644 index 0842bbc1a..000000000 --- a/MediaBrowser.Server.Mac/AppController.designer.cs +++ /dev/null @@ -1,27 +0,0 @@ -// WARNING -// -// This file has been generated automatically by MonoDevelop to store outlets and -// actions made in the Xcode designer. If it is removed, they will be lost. -// Manual changes to this file may not be handled correctly. -// -using MonoMac.Foundation; - -namespace MediaBrowser.Server.Mac -{ - partial class AppController - { - [Outlet] - MonoMac.AppKit.NSMenu statusMenu { get; set; } - - [Action ("HelloWorld:")] - partial void HelloWorld (MonoMac.Foundation.NSObject sender); - - void ReleaseDesignerOutlets () - { - if (statusMenu != null) { - statusMenu.Dispose (); - statusMenu = null; - } - } - } -} diff --git a/MediaBrowser.Server.Mac/AppDelegate.cs b/MediaBrowser.Server.Mac/AppDelegate.cs deleted file mode 100644 index 6cf183aa5..000000000 --- a/MediaBrowser.Server.Mac/AppDelegate.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System; -using System.Drawing; -using MonoMac.Foundation; -using MonoMac.AppKit; -using MonoMac.ObjCRuntime; - -namespace MediaBrowser.Server.Mac -{ - public partial class AppDelegate : NSApplicationDelegate - { - public AppDelegate () - { - - } - - public override void FinishedLaunching (NSObject notification) - { - new MenuBarIcon (MainClass.AppHost.LogManager.GetLogger("Tray")) - .ShowIcon (); - } - } -} - diff --git a/MediaBrowser.Server.Mac/AppDelegate.designer.cs b/MediaBrowser.Server.Mac/AppDelegate.designer.cs deleted file mode 100644 index f5a5ff7aa..000000000 --- a/MediaBrowser.Server.Mac/AppDelegate.designer.cs +++ /dev/null @@ -1,10 +0,0 @@ - -namespace MediaBrowser.Server.Mac -{ - // Should subclass MonoMac.AppKit.NSResponder - [MonoMac.Foundation.Register ("AppDelegate")] - public partial class AppDelegate - { - } -} - diff --git a/MediaBrowser.Server.Mac/Emby.Server.Mac.csproj b/MediaBrowser.Server.Mac/Emby.Server.Mac.csproj deleted file mode 100644 index d1078731f..000000000 --- a/MediaBrowser.Server.Mac/Emby.Server.Mac.csproj +++ /dev/null @@ -1,2697 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <PropertyGroup>
- <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
- <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
- <ProjectTypeGuids>{42C0BBD9-55CE-4FC1-8D90-A7348ABAFB23};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
- <ProjectGuid>{C97B98FA-00D4-4880-88B8-C76017A418AB}</ProjectGuid>
- <OutputType>Exe</OutputType>
- <RootNamespace>MediaBrowser.Server.Mac</RootNamespace>
- <MonoMacResourcePrefix>Resources</MonoMacResourcePrefix>
- <AssemblyName>Emby.Server.Mac</AssemblyName>
- <ApplicationIcon>..\MediaBrowser.WebDashboard\dashboard-ui\css\images\favicon.ico</ApplicationIcon>
- <ReleaseVersion>
- </ReleaseVersion>
- <StartupObject>MediaBrowser.Server.Mac.MainClass</StartupObject>
- <Description>A personal media server</Description>
- <TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>
- </PropertyGroup>
- <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
- <DebugSymbols>true</DebugSymbols>
- <DebugType>full</DebugType>
- <Optimize>false</Optimize>
- <OutputPath>bin\Debug</OutputPath>
- <DefineConstants>DEBUG;</DefineConstants>
- <ErrorReport>prompt</ErrorReport>
- <WarningLevel>4</WarningLevel>
- <ConsolePause>false</ConsolePause>
- <UseSGen>false</UseSGen>
- <IncludeMonoRuntime>true</IncludeMonoRuntime>
- <EnablePackageSigning>false</EnablePackageSigning>
- <CodeSigningKey>Mac Developer</CodeSigningKey>
- <EnableCodeSigning>false</EnableCodeSigning>
- <CreatePackage>true</CreatePackage>
- <PackageSigningKey>Developer ID Installer</PackageSigningKey>
- <UseRefCounting>false</UseRefCounting>
- <Profiling>false</Profiling>
- <HttpClientHandler>HttpClientHandler</HttpClientHandler>
- <TlsProvider>Default</TlsProvider>
- <LinkMode>None</LinkMode>
- <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
- </PropertyGroup>
- <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
- <Optimize>true</Optimize>
- <OutputPath>bin\Release</OutputPath>
- <ErrorReport>prompt</ErrorReport>
- <WarningLevel>4</WarningLevel>
- <ConsolePause>false</ConsolePause>
- <UseSGen>true</UseSGen>
- <IncludeMonoRuntime>true</IncludeMonoRuntime>
- <EnablePackageSigning>false</EnablePackageSigning>
- <CodeSigningKey>Developer ID Application</CodeSigningKey>
- <EnableCodeSigning>false</EnableCodeSigning>
- <CreatePackage>true</CreatePackage>
- <PackageSigningKey>Developer ID Installer</PackageSigningKey>
- <UseRefCounting>false</UseRefCounting>
- <Profiling>false</Profiling>
- <HttpClientHandler>HttpClientHandler</HttpClientHandler>
- <TlsProvider>Default</TlsProvider>
- <LinkMode>None</LinkMode>
- <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
- <I18n>cjk,mideast,other,rare,west</I18n>
- </PropertyGroup>
- <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'AppStore|AnyCPU' ">
- <DebugType>full</DebugType>
- <Optimize>true</Optimize>
- <OutputPath>bin\AppStore</OutputPath>
- <ErrorReport>prompt</ErrorReport>
- <WarningLevel>4</WarningLevel>
- <ConsolePause>false</ConsolePause>
- <UseSGen>false</UseSGen>
- <IncludeMonoRuntime>true</IncludeMonoRuntime>
- <PackageSigningKey>3rd Party Mac Developer Installer</PackageSigningKey>
- <CreatePackage>true</CreatePackage>
- <CodeSigningKey>3rd Party Mac Developer Application</CodeSigningKey>
- <EnableCodeSigning>false</EnableCodeSigning>
- <EnablePackageSigning>false</EnablePackageSigning>
- <UseRefCounting>false</UseRefCounting>
- <Profiling>false</Profiling>
- <HttpClientHandler>HttpClientHandler</HttpClientHandler>
- <TlsProvider>Default</TlsProvider>
- <LinkMode>None</LinkMode>
- <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
- </PropertyGroup>
- <ItemGroup>
- <Reference Include="System" />
- <Reference Include="System.Xml" />
- <Reference Include="System.Core" />
- <Reference Include="System.Xml.Linq" />
- <Reference Include="System.Drawing" />
- <Reference Include="XamMac" />
- <Reference Include="Mono.Posix, Version=4.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756, processorArchitecture=MSIL">
- <SpecificVersion>False</SpecificVersion>
- <HintPath>..\packages\Mono.Posix.4.0.0.0\lib\net40\Mono.Posix.dll</HintPath>
- </Reference>
- <Reference Include="ServiceStack.Text, Version=4.5.8.0, Culture=neutral, processorArchitecture=MSIL">
- <HintPath>..\packages\ServiceStack.Text.4.5.8\lib\net45\ServiceStack.Text.dll</HintPath>
- <Private>True</Private>
- </Reference>
- <Reference Include="SharpCompress, Version=0.18.2.0, Culture=neutral, processorArchitecture=MSIL">
- <HintPath>..\packages\SharpCompress.0.18.2\lib\net45\SharpCompress.dll</HintPath>
- <Private>True</Private>
- </Reference>
- <Reference Include="SimpleInjector, Version=4.0.8.0, Culture=neutral, PublicKeyToken=984cb50dea722e99, processorArchitecture=MSIL">
- <HintPath>..\packages\SimpleInjector.4.0.8\lib\net45\SimpleInjector.dll</HintPath>
- <Private>True</Private>
- </Reference>
- <Reference Include="System.Data" />
- <Reference Include="TagLib.Portable">
- <HintPath>..\ThirdParty\taglib\TagLib.Portable.dll</HintPath>
- </Reference>
- <Reference Include="SkiaSharp">
- <HintPath>..\packages\SkiaSharp.1.58.1\lib\net45\SkiaSharp.dll</HintPath>
- </Reference>
- <Reference Include="SQLitePCLRaw.core">
- <HintPath>..\packages\SQLitePCLRaw.core.1.1.8\lib\net45\SQLitePCLRaw.core.dll</HintPath>
- </Reference>
- <Reference Include="SQLitePCLRaw.provider.sqlite3">
- <HintPath>..\packages\SQLitePCLRaw.provider.sqlite3.net45.1.1.8\lib\net45\SQLitePCLRaw.provider.sqlite3.dll</HintPath>
- </Reference>
- <Reference Include="Emby.Server.Connect">
- <HintPath>..\ThirdParty\emby\Emby.Server.Connect.dll</HintPath>
- </Reference>
- <Reference Include="Emby.Server.Sync">
- <HintPath>..\ThirdParty\emby\Emby.Server.Sync.dll</HintPath>
- </Reference>
- <Reference Include="Emby.Server.CinemaMode">
- <HintPath>..\ThirdParty\emby\Emby.Server.CinemaMode.dll</HintPath>
- </Reference>
- <Reference Include="Emby.Server.MediaEncoding">
- <HintPath>..\ThirdParty\emby\Emby.Server.MediaEncoding.dll</HintPath>
- </Reference>
- </ItemGroup>
- <ItemGroup>
- <Folder Include="Resources\" />
- <Folder Include="Native\" />
- </ItemGroup>
- <ItemGroup>
- <Compile Include="AppDelegate.cs" />
- <Compile Include="AppDelegate.designer.cs">
- <DependentUpon>AppDelegate.cs</DependentUpon>
- </Compile>
- <Compile Include="AppController.cs" />
- <Compile Include="AppController.designer.cs">
- <DependentUpon>AppController.cs</DependentUpon>
- </Compile>
- <Compile Include="..\SharedVersion.cs">
- <Link>SharedVersion.cs</Link>
- </Compile>
- <Compile Include="Main.cs" />
- <Compile Include="MenuBarIcon.cs" />
- <Compile Include="MacAppHost.cs" />
- <Compile Include="Native\MonoFileSystem.cs" />
- <Compile Include="Native\PowerManagement.cs" />
- </ItemGroup>
- <ItemGroup>
- <InterfaceDefinition Include="MainMenu.xib" />
- </ItemGroup>
- <ItemGroup>
- <None Include="Info.plist" />
- <None Include="packages.config" />
- </ItemGroup>
- <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
- <ItemGroup>
- <ProjectReference Include="..\MediaBrowser.Model\MediaBrowser.Model.csproj">
- <Project>{7EEEB4BB-F3E8-48FC-B4C5-70F0FFF8329B}</Project>
- <Name>MediaBrowser.Model</Name>
- </ProjectReference>
- <ProjectReference Include="..\MediaBrowser.Controller\MediaBrowser.Controller.csproj">
- <Project>{17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}</Project>
- <Name>MediaBrowser.Controller</Name>
- </ProjectReference>
- <ProjectReference Include="..\MediaBrowser.Common\MediaBrowser.Common.csproj">
- <Project>{9142EEFA-7570-41E1-BFCC-468BB571AF2F}</Project>
- <Name>MediaBrowser.Common</Name>
- </ProjectReference>
- <ProjectReference Include="..\MediaBrowser.Server.Implementations\MediaBrowser.Server.Implementations.csproj">
- <Project>{2E781478-814D-4A48-9D80-BFF206441A65}</Project>
- <Name>MediaBrowser.Server.Implementations</Name>
- </ProjectReference>
- <ProjectReference Include="..\MediaBrowser.LocalMetadata\MediaBrowser.LocalMetadata.csproj">
- <Project>{7EF9F3E0-697D-42F3-A08F-19DEB5F84392}</Project>
- <Name>MediaBrowser.LocalMetadata</Name>
- </ProjectReference>
- <ProjectReference Include="..\MediaBrowser.Providers\MediaBrowser.Providers.csproj">
- <Project>{442B5058-DCAF-4263-BB6A-F21E31120A1B}</Project>
- <Name>MediaBrowser.Providers</Name>
- </ProjectReference>
- <ProjectReference Include="..\MediaBrowser.WebDashboard\MediaBrowser.WebDashboard.csproj">
- <Project>{5624B7B5-B5A7-41D8-9F10-CC5611109619}</Project>
- <Name>MediaBrowser.WebDashboard</Name>
- </ProjectReference>
- <ProjectReference Include="..\MediaBrowser.XbmcMetadata\MediaBrowser.XbmcMetadata.csproj">
- <Project>{23499896-B135-4527-8574-C26E926EA99E}</Project>
- <Name>MediaBrowser.XbmcMetadata</Name>
- </ProjectReference>
- <ProjectReference Include="..\OpenSubtitlesHandler\OpenSubtitlesHandler.csproj">
- <Project>{4A4402D4-E910-443B-B8FC-2C18286A2CA0}</Project>
- <Name>OpenSubtitlesHandler</Name>
- </ProjectReference>
- <ProjectReference Include="..\MediaBrowser.Api\MediaBrowser.Api.csproj">
- <Project>{4FD51AC5-2C16-4308-A993-C3A84F3B4582}</Project>
- <Name>MediaBrowser.Api</Name>
- </ProjectReference>
- <ProjectReference Include="..\Emby.Server.Implementations\Emby.Server.Implementations.csproj">
- <Project>{E383961B-9356-4D5D-8233-9A1079D03055}</Project>
- <Name>Emby.Server.Implementations</Name>
- </ProjectReference>
- <ProjectReference Include="..\Emby.Photos\Emby.Photos.csproj">
- <Project>{89AB4548-770D-41FD-A891-8DAFF44F452C}</Project>
- <Name>Emby.Photos</Name>
- </ProjectReference>
- <ProjectReference Include="..\Emby.Drawing.Skia\Emby.Drawing.Skia.csproj">
- <Project>{2312da6d-ff86-4597-9777-bceec32d96dd}</Project>
- <Name>Emby.Drawing.Skia</Name>
- </ProjectReference>
- <ProjectReference Include="..\Emby.Drawing\Emby.Drawing.csproj">
- <Project>{08FFF49B-F175-4807-A2B5-73B0EBD9F716}</Project>
- <Name>Emby.Drawing</Name>
- </ProjectReference>
- <ProjectReference Include="..\Emby.Dlna\Emby.Dlna.csproj">
- <Project>{805844AB-E92F-45E6-9D99-4F6D48D129A5}</Project>
- <Name>Emby.Dlna</Name>
- </ProjectReference>
- <ProjectReference Include="..\DvdLib\DvdLib.csproj">
- <Project>{713F42B5-878E-499D-A878-E4C652B1D5E8}</Project>
- <Name>DvdLib</Name>
- </ProjectReference>
- <ProjectReference Include="..\BDInfo\BDInfo.csproj">
- <Project>{88AE38DF-19D7-406F-A6A9-09527719A21E}</Project>
- <Name>BDInfo</Name>
- </ProjectReference>
- <ProjectReference Include="..\RSSDP\RSSDP.csproj">
- <Project>{21002819-C39A-4D3E-BE83-2A276A77FB1F}</Project>
- <Name>RSSDP</Name>
- </ProjectReference>
- <ProjectReference Include="..\Emby.Common.Implementations\Emby.Common.Implementations.csproj">
- <Project>{1E37A338-9F57-4B70-BD6D-BB9C591E319B}</Project>
- <Name>Emby.Common.Implementations</Name>
- </ProjectReference>
- <ProjectReference Include="..\SocketHttpListener\SocketHttpListener.csproj">
- <Project>{1D74413B-E7CF-455B-B021-F52BDF881542}</Project>
- <Name>SocketHttpListener</Name>
- </ProjectReference>
- <ProjectReference Include="..\Mono.Nat\Mono.Nat.csproj">
- <Project>{CB7F2326-6497-4A3D-BA03-48513B17A7BE}</Project>
- <Name>Mono.Nat</Name>
- </ProjectReference>
- </ItemGroup>
- <ItemGroup>
- <Content Include="statusicon.png" />
- </ItemGroup>
- <ItemGroup>
- <BundleResource Include="Resources\appicon.icns" />
- <BundleResource Include="Resources\MediaBrowser.Server.Mac\Images.xcassets\AppIcon.appiconset\Contents.json" />
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\addplugin.html">
- <Link>Resources\dashboard-ui\addplugin.html</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\appservices.html">
- <Link>Resources\dashboard-ui\appservices.html</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\camerauploadsettings.html">
- <Link>Resources\dashboard-ui\camerauploadsettings.html</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\channelitems.html">
- <Link>Resources\dashboard-ui\channelitems.html</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\channels.html">
- <Link>Resources\dashboard-ui\channels.html</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\cinemamodeconfiguration.html">
- <Link>Resources\dashboard-ui\cinemamodeconfiguration.html</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\connectlogin.html">
- <Link>Resources\dashboard-ui\connectlogin.html</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\dashboard.html">
- <Link>Resources\dashboard-ui\dashboard.html</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\dashboardgeneral.html">
- <Link>Resources\dashboard-ui\dashboardgeneral.html</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\dashboardhosting.html">
- <Link>Resources\dashboard-ui\dashboardhosting.html</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\device.html">
- <Link>Resources\dashboard-ui\device.html</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\devices.html">
- <Link>Resources\dashboard-ui\devices.html</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\devicesupload.html">
- <Link>Resources\dashboard-ui\devicesupload.html</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\dlnaprofile.html">
- <Link>Resources\dashboard-ui\dlnaprofile.html</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\dlnaprofiles.html">
- <Link>Resources\dashboard-ui\dlnaprofiles.html</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\dlnasettings.html">
- <Link>Resources\dashboard-ui\dlnasettings.html</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\edititemmetadata.html">
- <Link>Resources\dashboard-ui\edititemmetadata.html</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\encodingsettings.html">
- <Link>Resources\dashboard-ui\encodingsettings.html</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\favicon.ico">
- <Link>Resources\dashboard-ui\favicon.ico</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\forgotpassword.html">
- <Link>Resources\dashboard-ui\forgotpassword.html</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\forgotpasswordpin.html">
- <Link>Resources\dashboard-ui\forgotpasswordpin.html</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\home.html">
- <Link>Resources\dashboard-ui\home.html</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\index.html">
- <Link>Resources\dashboard-ui\index.html</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\itemdetails.html">
- <Link>Resources\dashboard-ui\itemdetails.html</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\itemlist.html">
- <Link>Resources\dashboard-ui\itemlist.html</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\library.html">
- <Link>Resources\dashboard-ui\library.html</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\librarydisplay.html">
- <Link>Resources\dashboard-ui\librarydisplay.html</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\librarysettings.html">
- <Link>Resources\dashboard-ui\librarysettings.html</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\livetv.html">
- <Link>Resources\dashboard-ui\livetv.html</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\livetvguideprovider.html">
- <Link>Resources\dashboard-ui\livetvguideprovider.html</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\livetvitems.html">
- <Link>Resources\dashboard-ui\livetvitems.html</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\livetvsettings.html">
- <Link>Resources\dashboard-ui\livetvsettings.html</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\livetvstatus.html">
- <Link>Resources\dashboard-ui\livetvstatus.html</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\livetvtuner.html">
- <Link>Resources\dashboard-ui\livetvtuner.html</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\log.html">
- <Link>Resources\dashboard-ui\log.html</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\login.html">
- <Link>Resources\dashboard-ui\login.html</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\managedownloads.html">
- <Link>Resources\dashboard-ui\managedownloads.html</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\manifest.json">
- <Link>Resources\dashboard-ui\manifest.json</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\metadataimages.html">
- <Link>Resources\dashboard-ui\metadataimages.html</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\metadatanfo.html">
- <Link>Resources\dashboard-ui\metadatanfo.html</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\metadatasubtitles.html">
- <Link>Resources\dashboard-ui\metadatasubtitles.html</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\movies.html">
- <Link>Resources\dashboard-ui\movies.html</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\music.html">
- <Link>Resources\dashboard-ui\music.html</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\mypreferencesdisplay.html">
- <Link>Resources\dashboard-ui\mypreferencesdisplay.html</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\mypreferenceshome.html">
- <Link>Resources\dashboard-ui\mypreferenceshome.html</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\mypreferenceslanguages.html">
- <Link>Resources\dashboard-ui\mypreferenceslanguages.html</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\mypreferencesmenu.html">
- <Link>Resources\dashboard-ui\mypreferencesmenu.html</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\mypreferencessubtitles.html">
- <Link>Resources\dashboard-ui\mypreferencessubtitles.html</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\myprofile.html">
- <Link>Resources\dashboard-ui\myprofile.html</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\mysync.html">
- <Link>Resources\dashboard-ui\mysync.html</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\mysyncjob.html">
- <Link>Resources\dashboard-ui\mysyncjob.html</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\mysyncsettings.html">
- <Link>Resources\dashboard-ui\mysyncsettings.html</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\notificationlist.html">
- <Link>Resources\dashboard-ui\notificationlist.html</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\notificationsetting.html">
- <Link>Resources\dashboard-ui\notificationsetting.html</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\notificationsettings.html">
- <Link>Resources\dashboard-ui\notificationsettings.html</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\nowplaying.html">
- <Link>Resources\dashboard-ui\nowplaying.html</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\photos.html">
- <Link>Resources\dashboard-ui\photos.html</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\playbackconfiguration.html">
- <Link>Resources\dashboard-ui\playbackconfiguration.html</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\playlists.html">
- <Link>Resources\dashboard-ui\playlists.html</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\plugincatalog.html">
- <Link>Resources\dashboard-ui\plugincatalog.html</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\plugins.html">
- <Link>Resources\dashboard-ui\plugins.html</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\robots.txt">
- <Link>Resources\dashboard-ui\robots.txt</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\scheduledtask.html">
- <Link>Resources\dashboard-ui\scheduledtask.html</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\scheduledtasks.html">
- <Link>Resources\dashboard-ui\scheduledtasks.html</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\search.html">
- <Link>Resources\dashboard-ui\search.html</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\secondaryitems.html">
- <Link>Resources\dashboard-ui\secondaryitems.html</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\selectserver.html">
- <Link>Resources\dashboard-ui\selectserver.html</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\serversecurity.html">
- <Link>Resources\dashboard-ui\serversecurity.html</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\serviceworker.js">
- <Link>Resources\dashboard-ui\serviceworker.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\shared.html">
- <Link>Resources\dashboard-ui\shared.html</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\streamingsettings.html">
- <Link>Resources\dashboard-ui\streamingsettings.html</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\supporterkey.html">
- <Link>Resources\dashboard-ui\supporterkey.html</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\syncactivity.html">
- <Link>Resources\dashboard-ui\syncactivity.html</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\syncsettings.html">
- <Link>Resources\dashboard-ui\syncsettings.html</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\touchicon.png">
- <Link>Resources\dashboard-ui\touchicon.png</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\touchicon114.png">
- <Link>Resources\dashboard-ui\touchicon114.png</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\touchicon144.png">
- <Link>Resources\dashboard-ui\touchicon144.png</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\touchicon72.png">
- <Link>Resources\dashboard-ui\touchicon72.png</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\tv.html">
- <Link>Resources\dashboard-ui\tv.html</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\useredit.html">
- <Link>Resources\dashboard-ui\useredit.html</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\userlibraryaccess.html">
- <Link>Resources\dashboard-ui\userlibraryaccess.html</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\usernew.html">
- <Link>Resources\dashboard-ui\usernew.html</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\userparentalcontrol.html">
- <Link>Resources\dashboard-ui\userparentalcontrol.html</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\userpassword.html">
- <Link>Resources\dashboard-ui\userpassword.html</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\userprofiles.html">
- <Link>Resources\dashboard-ui\userprofiles.html</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\videoosd.html">
- <Link>Resources\dashboard-ui\videoosd.html</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\wizardagreement.html">
- <Link>Resources\dashboard-ui\wizardagreement.html</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\wizardcomponents.html">
- <Link>Resources\dashboard-ui\wizardcomponents.html</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\wizardfinish.html">
- <Link>Resources\dashboard-ui\wizardfinish.html</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\wizardlibrary.html">
- <Link>Resources\dashboard-ui\wizardlibrary.html</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\wizardsettings.html">
- <Link>Resources\dashboard-ui\wizardsettings.html</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\wizardstart.html">
- <Link>Resources\dashboard-ui\wizardstart.html</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\wizarduser.html">
- <Link>Resources\dashboard-ui\wizarduser.html</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\Sortable\Sortable.html">
- <Link>Resources\dashboard-ui\bower_components\Sortable\Sortable.html</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\Sortable\Sortable.min.js">
- <Link>Resources\dashboard-ui\bower_components\Sortable\Sortable.min.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\Sortable\index.html">
- <Link>Resources\dashboard-ui\bower_components\Sortable\index.html</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\Sortable\jquery.binding.js">
- <Link>Resources\dashboard-ui\bower_components\Sortable\jquery.binding.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\Sortable\knockout-sortable.js">
- <Link>Resources\dashboard-ui\bower_components\Sortable\knockout-sortable.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\Sortable\ng-sortable.js">
- <Link>Resources\dashboard-ui\bower_components\Sortable\ng-sortable.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\Sortable\react-sortable-mixin.js">
- <Link>Resources\dashboard-ui\bower_components\Sortable\react-sortable-mixin.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\Swiper\LICENSE">
- <Link>Resources\dashboard-ui\bower_components\Swiper\LICENSE</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\Swiper\gulpfile.js">
- <Link>Resources\dashboard-ui\bower_components\Swiper\gulpfile.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\Swiper\package.js">
- <Link>Resources\dashboard-ui\bower_components\Swiper\package.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\Swiper\dist\css\swiper.min.css">
- <Link>Resources\dashboard-ui\bower_components\Swiper\dist\css\swiper.min.css</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\Swiper\dist\js\swiper.min.js">
- <Link>Resources\dashboard-ui\bower_components\Swiper\dist\js\swiper.min.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\alameda\LICENSE">
- <Link>Resources\dashboard-ui\bower_components\alameda\LICENSE</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\alameda\alameda.js">
- <Link>Resources\dashboard-ui\bower_components\alameda\alameda.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\cryptojslib\components\core-min.js">
- <Link>Resources\dashboard-ui\bower_components\cryptojslib\components\core-min.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\cryptojslib\components\md5-min.js">
- <Link>Resources\dashboard-ui\bower_components\cryptojslib\components\md5-min.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\cryptojslib\components\sha1-min.js">
- <Link>Resources\dashboard-ui\bower_components\cryptojslib\components\sha1-min.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\document-register-element\basic.html">
- <Link>Resources\dashboard-ui\bower_components\document-register-element\basic.html</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\document-register-element\testrunner.js">
- <Link>Resources\dashboard-ui\bower_components\document-register-element\testrunner.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\document-register-element\build\document-register-element.js">
- <Link>Resources\dashboard-ui\bower_components\document-register-element\build\document-register-element.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-apiclient\apiclient.js">
- <Link>Resources\dashboard-ui\bower_components\emby-apiclient\apiclient.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-apiclient\apiclientex.js">
- <Link>Resources\dashboard-ui\bower_components\emby-apiclient\apiclientex.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-apiclient\appstorage-cache.js">
- <Link>Resources\dashboard-ui\bower_components\emby-apiclient\appstorage-cache.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-apiclient\appstorage-localstorage.js">
- <Link>Resources\dashboard-ui\bower_components\emby-apiclient\appstorage-localstorage.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-apiclient\appstorage-memory.js">
- <Link>Resources\dashboard-ui\bower_components\emby-apiclient\appstorage-memory.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-apiclient\cameraroll.js">
- <Link>Resources\dashboard-ui\bower_components\emby-apiclient\cameraroll.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-apiclient\connectionmanager.js">
- <Link>Resources\dashboard-ui\bower_components\emby-apiclient\connectionmanager.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-apiclient\credentials.js">
- <Link>Resources\dashboard-ui\bower_components\emby-apiclient\credentials.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-apiclient\events.js">
- <Link>Resources\dashboard-ui\bower_components\emby-apiclient\events.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-apiclient\fileupload.js">
- <Link>Resources\dashboard-ui\bower_components\emby-apiclient\fileupload.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-apiclient\localassetmanager.js">
- <Link>Resources\dashboard-ui\bower_components\emby-apiclient\localassetmanager.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-apiclient\serverdiscovery-chrome.js">
- <Link>Resources\dashboard-ui\bower_components\emby-apiclient\serverdiscovery-chrome.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-apiclient\serverdiscovery-winjs.js">
- <Link>Resources\dashboard-ui\bower_components\emby-apiclient\serverdiscovery-winjs.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-apiclient\serverdiscovery.js">
- <Link>Resources\dashboard-ui\bower_components\emby-apiclient\serverdiscovery.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-apiclient\wakeonlan.js">
- <Link>Resources\dashboard-ui\bower_components\emby-apiclient\wakeonlan.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-apiclient\sync\contentuploader.js">
- <Link>Resources\dashboard-ui\bower_components\emby-apiclient\sync\contentuploader.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-apiclient\sync\filerepository.js">
- <Link>Resources\dashboard-ui\bower_components\emby-apiclient\sync\filerepository.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-apiclient\sync\itemrepository.js">
- <Link>Resources\dashboard-ui\bower_components\emby-apiclient\sync\itemrepository.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-apiclient\sync\localsync.js">
- <Link>Resources\dashboard-ui\bower_components\emby-apiclient\sync\localsync.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-apiclient\sync\mediasync.js">
- <Link>Resources\dashboard-ui\bower_components\emby-apiclient\sync\mediasync.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-apiclient\sync\multiserversync.js">
- <Link>Resources\dashboard-ui\bower_components\emby-apiclient\sync\multiserversync.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-apiclient\sync\serversync.js">
- <Link>Resources\dashboard-ui\bower_components\emby-apiclient\sync\serversync.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-apiclient\sync\transfermanager.js">
- <Link>Resources\dashboard-ui\bower_components\emby-apiclient\sync\transfermanager.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-apiclient\sync\useractionrepository.js">
- <Link>Resources\dashboard-ui\bower_components\emby-apiclient\sync\useractionrepository.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\appsettings.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\appsettings.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\browser.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\browser.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\browserdeviceprofile.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\browserdeviceprofile.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\clearbutton.css">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\clearbutton.css</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\datetime.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\datetime.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\deletehelper.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\deletehelper.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\dom.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\dom.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\fetchhelper.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\fetchhelper.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\filedownloader.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\filedownloader.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\filesystem.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\filesystem.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\flexstyles.css">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\flexstyles.css</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\focusmanager.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\focusmanager.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\formdialog.css">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\formdialog.css</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\globalize.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\globalize.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\idb.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\idb.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\inputmanager.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\inputmanager.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\itemcontextmenu.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\itemcontextmenu.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\itemhelper.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\itemhelper.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\layoutmanager.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\layoutmanager.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\maintabsmanager.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\maintabsmanager.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\multidownload.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\multidownload.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\packagemanager.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\packagemanager.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\playmenu.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\playmenu.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\pluginmanager.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\pluginmanager.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\qualityoptions.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\qualityoptions.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\router.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\router.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\sanitizefilename.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\sanitizefilename.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\scrollhelper.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\scrollhelper.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\scrollstyles.css">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\scrollstyles.css</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\servernotifications.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\servernotifications.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\sessionplayer.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\sessionplayer.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\shell.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\shell.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\shortcuts.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\shortcuts.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\skinmanager.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\skinmanager.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\staticbackdrops.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\staticbackdrops.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\thememediaplayer.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\thememediaplayer.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\touchhelper.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\touchhelper.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\visibleinviewport.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\visibleinviewport.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\actionsheet\actionsheet.css">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\actionsheet\actionsheet.css</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\actionsheet\actionsheet.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\actionsheet\actionsheet.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\alert\alert.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\alert\alert.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\alert\nativealert.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\alert\nativealert.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\alphapicker\alphapicker.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\alphapicker\alphapicker.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\alphapicker\style.css">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\alphapicker\style.css</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\appfooter\appfooter.css">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\appfooter\appfooter.css</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\appfooter\appfooter.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\appfooter\appfooter.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\backdrop\backdrop.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\backdrop\backdrop.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\backdrop\style.css">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\backdrop\style.css</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\cardbuilder\card.css">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\cardbuilder\card.css</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\cardbuilder\cardbuilder.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\cardbuilder\cardbuilder.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\cardbuilder\chaptercardbuilder.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\cardbuilder\chaptercardbuilder.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\cardbuilder\peoplecardbuilder.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\cardbuilder\peoplecardbuilder.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\cardbuilder\roundcard.css">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\cardbuilder\roundcard.css</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\chromecast\chromecasthelpers.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\chromecast\chromecasthelpers.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\chromecast\chromecastplayer.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\chromecast\chromecastplayer.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\collectioneditor\collectioneditor.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\collectioneditor\collectioneditor.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\confirm\confirm.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\confirm\confirm.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\confirm\nativeconfirm.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\confirm\nativeconfirm.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\dialog\dialog.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\dialog\dialog.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\dialog\dialog.template.html">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\dialog\dialog.template.html</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\dialoghelper\dialoghelper.css">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\dialoghelper\dialoghelper.css</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\dialoghelper\dialoghelper.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\dialoghelper\dialoghelper.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\emby-button\emby-button.css">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\emby-button\emby-button.css</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\emby-button\emby-button.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\emby-button\emby-button.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\emby-button\paper-icon-button-light.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\emby-button\paper-icon-button-light.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\emby-checkbox\emby-checkbox.css">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\emby-checkbox\emby-checkbox.css</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\emby-checkbox\emby-checkbox.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\emby-checkbox\emby-checkbox.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\emby-collapse\emby-collapse.css">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\emby-collapse\emby-collapse.css</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\emby-collapse\emby-collapse.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\emby-collapse\emby-collapse.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\emby-connect\connecthelper.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\emby-connect\connecthelper.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\emby-input\emby-input.css">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\emby-input\emby-input.css</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\emby-input\emby-input.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\emby-input\emby-input.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\emby-itemrefreshindicator\emby-itemrefreshindicator.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\emby-itemrefreshindicator\emby-itemrefreshindicator.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\emby-itemscontainer\emby-itemscontainer.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\emby-itemscontainer\emby-itemscontainer.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\emby-progressring\emby-progressring.css">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\emby-progressring\emby-progressring.css</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\emby-progressring\emby-progressring.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\emby-progressring\emby-progressring.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\emby-progressring\emby-progressring.template.html">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\emby-progressring\emby-progressring.template.html</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\emby-radio\emby-radio.css">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\emby-radio\emby-radio.css</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\emby-radio\emby-radio.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\emby-radio\emby-radio.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\emby-scrollbuttons\emby-scrollbuttons.css">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\emby-scrollbuttons\emby-scrollbuttons.css</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\emby-scrollbuttons\emby-scrollbuttons.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\emby-scrollbuttons\emby-scrollbuttons.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\emby-scroller\emby-scroller.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\emby-scroller\emby-scroller.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\emby-select\emby-select.css">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\emby-select\emby-select.css</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\emby-select\emby-select.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\emby-select\emby-select.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\emby-slider\emby-slider.css">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\emby-slider\emby-slider.css</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\emby-slider\emby-slider.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\emby-slider\emby-slider.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\emby-tabs\emby-tabs.css">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\emby-tabs\emby-tabs.css</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\emby-tabs\emby-tabs.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\emby-tabs\emby-tabs.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\emby-textarea\emby-textarea.css">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\emby-textarea\emby-textarea.css</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\emby-textarea\emby-textarea.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\emby-textarea\emby-textarea.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\flvjs\flv.min.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\flvjs\flv.min.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\fonts\fonts.css">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\fonts\fonts.css</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\fonts\fonts.sized.css">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\fonts\fonts.sized.css</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\fonts\material-icons\2fcryfnatjcs6g4u3t-y5ewrjpiaoeww8aihgqwrjao.woff">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\fonts\material-icons\2fcryfnatjcs6g4u3t-y5ewrjpiaoeww8aihgqwrjao.woff</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\fonts\material-icons\2fcryfnatjcs6g4u3t-y5zjzjt5fdej140u2djyc3my.woff2">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\fonts\material-icons\2fcryfnatjcs6g4u3t-y5zjzjt5fdej140u2djyc3my.woff2</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\fonts\material-icons\style.css">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\fonts\material-icons\style.css</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\fullscreen\fullscreen-doubleclick.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\fullscreen\fullscreen-doubleclick.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\fullscreen\fullscreenmanager.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\fullscreen\fullscreenmanager.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\guide\guide-settings.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\guide\guide-settings.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\guide\guide-settings.template.html">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\guide\guide-settings.template.html</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\guide\guide.css">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\guide\guide.css</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\guide\guide.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\guide\guide.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\guide\programs.css">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\guide\programs.css</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\guide\tvguide.template.html">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\guide\tvguide.template.html</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\headroom\headroom.css">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\headroom\headroom.css</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\headroom\headroom.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\headroom\headroom.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\homescreensettings\homescreensettings.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\homescreensettings\homescreensettings.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\homescreensettings\homescreensettings.template.html">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\homescreensettings\homescreensettings.template.html</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\homescreensettings\homescreensettingsdialog.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\homescreensettings\homescreensettingsdialog.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\homescreensettings\homescreensettingsdialog.template.html">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\homescreensettings\homescreensettingsdialog.template.html</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\homesections\homesections.css">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\homesections\homesections.css</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\homesections\homesections.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\homesections\homesections.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\htmlaudioplayer\blank.mp3">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\htmlaudioplayer\blank.mp3</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\htmlaudioplayer\plugin.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\htmlaudioplayer\plugin.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\htmlvideoplayer\htmlmediahelper.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\htmlvideoplayer\htmlmediahelper.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\htmlvideoplayer\plugin.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\htmlvideoplayer\plugin.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\htmlvideoplayer\style.css">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\htmlvideoplayer\style.css</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\imagedownloader\imagedownloader.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\imagedownloader\imagedownloader.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\imagedownloader\imagedownloader.template.html">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\imagedownloader\imagedownloader.template.html</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\imageeditor\imageeditor.css">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\imageeditor\imageeditor.css</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\imageeditor\imageeditor.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\imageeditor\imageeditor.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\imageeditor\imageeditor.template.html">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\imageeditor\imageeditor.template.html</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\images\basicimagefetcher.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\images\basicimagefetcher.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\images\imagehelper.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\images\imagehelper.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\images\style.css">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\images\style.css</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\imageuploader\imageuploader.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\imageuploader\imageuploader.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\imageuploader\imageuploader.template.html">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\imageuploader\imageuploader.template.html</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\imageuploader\style.css">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\imageuploader\style.css</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\indicators\indicators.css">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\indicators\indicators.css</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\indicators\indicators.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\indicators\indicators.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\input\api.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\input\api.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\input\gamepadtokey.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\input\gamepadtokey.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\input\mouse.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\input\mouse.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\itemhovermenu\itemhovermenu.css">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\itemhovermenu\itemhovermenu.css</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\itemhovermenu\itemhovermenu.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\itemhovermenu\itemhovermenu.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\itemidentifier\itemidentifier.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\itemidentifier\itemidentifier.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\itemidentifier\itemidentifier.template.html">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\itemidentifier\itemidentifier.template.html</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\lazyloader\lazyedgehack.css">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\lazyloader\lazyedgehack.css</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\lazyloader\lazyloader-intersectionobserver.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\lazyloader\lazyloader-intersectionobserver.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\lazyloader\lazyloader-scroll.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\lazyloader\lazyloader-scroll.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\listview\listview.css">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\listview\listview.css</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\listview\listview.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\listview\listview.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\loading\loader2.gif">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\loading\loader2.gif</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\loading\loading-legacy.css">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\loading\loading-legacy.css</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\loading\loading-legacy.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\loading\loading-legacy.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\loading\loading-lite.css">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\loading\loading-lite.css</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\loading\loading-lite.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\loading\loading-lite.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\mediainfo\fresh.png">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\mediainfo\fresh.png</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\mediainfo\mediainfo.css">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\mediainfo\mediainfo.css</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\mediainfo\mediainfo.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\mediainfo\mediainfo.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\mediainfo\rotten.png">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\mediainfo\rotten.png</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\metadataeditor\metadataeditor.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\metadataeditor\metadataeditor.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\metadataeditor\metadataeditor.template.html">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\metadataeditor\metadataeditor.template.html</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\metadataeditor\personeditor.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\metadataeditor\personeditor.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\metadataeditor\personeditor.template.html">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\metadataeditor\personeditor.template.html</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\multiselect\multiselect.css">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\multiselect\multiselect.css</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\multiselect\multiselect.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\multiselect\multiselect.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\native-promise-only\test_adapter.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\native-promise-only\test_adapter.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\native-promise-only\lib\npo.src.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\native-promise-only\lib\npo.src.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\notifications\badge.png">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\notifications\badge.png</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\notifications\notificationicon.png">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\notifications\notificationicon.png</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\notifications\notifications.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\notifications\notifications.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\nowplayingbar\nowplayingbar.css">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\nowplayingbar\nowplayingbar.css</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\nowplayingbar\nowplayingbar.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\nowplayingbar\nowplayingbar.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\pagejs\page.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\pagejs\page.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\photoplayer\plugin.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\photoplayer\plugin.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\playback\autoplaydetect.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\playback\autoplaydetect.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\playback\brightnessosd.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\playback\brightnessosd.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\playback\experimentalwarnings.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\playback\experimentalwarnings.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\playback\iconosd.css">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\playback\iconosd.css</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\playback\mediasession.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\playback\mediasession.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\playback\nowplayinghelper.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\playback\nowplayinghelper.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\playback\playaccessvalidation.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\playback\playaccessvalidation.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\playback\playbackmanager.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\playback\playbackmanager.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\playback\playbackvalidation.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\playback\playbackvalidation.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\playback\playerselection.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\playback\playerselection.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\playback\playersettingsmenu.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\playback\playersettingsmenu.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\playback\playmethodhelper.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\playback\playmethodhelper.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\playback\playqueuemanager.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\playback\playqueuemanager.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\playback\remotecontrolautoplay.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\playback\remotecontrolautoplay.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\playback\volumeosd.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\playback\volumeosd.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\playbacksettings\playbacksettings.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\playbacksettings\playbacksettings.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\playbacksettings\playbacksettings.template.html">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\playbacksettings\playbacksettings.template.html</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\playerstats\playerstats.css">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\playerstats\playerstats.css</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\playerstats\playerstats.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\playerstats\playerstats.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\playlisteditor\playlisteditor.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\playlisteditor\playlisteditor.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\polyfills\array.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\polyfills\array.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\polyfills\bind.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\polyfills\bind.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\polyfills\objectassign.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\polyfills\objectassign.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\polyfills\raf.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\polyfills\raf.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\prompt\nativeprompt.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\prompt\nativeprompt.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\prompt\prompt.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\prompt\prompt.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\prompt\prompt.template.html">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\prompt\prompt.template.html</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\recordingcreator\empty.png">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\recordingcreator\empty.png</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\recordingcreator\recordingbutton.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\recordingcreator\recordingbutton.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\recordingcreator\recordingcreator.css">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\recordingcreator\recordingcreator.css</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\recordingcreator\recordingcreator.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\recordingcreator\recordingcreator.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\recordingcreator\recordingcreator.template.html">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\recordingcreator\recordingcreator.template.html</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\recordingcreator\recordingeditor.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\recordingcreator\recordingeditor.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\recordingcreator\recordingeditor.template.html">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\recordingcreator\recordingeditor.template.html</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\recordingcreator\recordingfields.css">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\recordingcreator\recordingfields.css</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\recordingcreator\recordingfields.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\recordingcreator\recordingfields.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\recordingcreator\recordingfields.template.html">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\recordingcreator\recordingfields.template.html</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\recordingcreator\recordinghelper.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\recordingcreator\recordinghelper.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\recordingcreator\seriesrecordingeditor.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\recordingcreator\seriesrecordingeditor.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\recordingcreator\seriesrecordingeditor.template.html">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\recordingcreator\seriesrecordingeditor.template.html</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\refreshdialog\refreshdialog.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\refreshdialog\refreshdialog.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\registrationservices\registrationservices.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\registrationservices\registrationservices.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\require\requirecss.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\require\requirecss.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\require\requirehtml.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\require\requirehtml.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\require\requiretext.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\require\requiretext.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\resourcelocks\nullresourcelock.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\resourcelocks\nullresourcelock.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\resourcelocks\resourcelockmanager.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\resourcelocks\resourcelockmanager.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\scroller\smoothscroller.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\scroller\smoothscroller.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\search\searchfields.css">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\search\searchfields.css</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\search\searchfields.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\search\searchfields.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\search\searchfields.template.html">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\search\searchfields.template.html</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\search\searchresults.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\search\searchresults.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\search\searchresults.template.html">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\search\searchresults.template.html</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\serviceworker\notifications.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\serviceworker\notifications.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\serviceworker\sync.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\serviceworker\sync.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\sharing\sharingmanager.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\sharing\sharingmanager.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\sharing\sharingmenu.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\sharing\sharingmenu.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\sharing\social-share-kit-1.0.10\LICENSE">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\sharing\social-share-kit-1.0.10\LICENSE</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\sharing\social-share-kit-1.0.10\dist\css\social-share-kit.css">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\sharing\social-share-kit-1.0.10\dist\css\social-share-kit.css</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\sharing\social-share-kit-1.0.10\dist\fonts\social-share-kit.eot">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\sharing\social-share-kit-1.0.10\dist\fonts\social-share-kit.eot</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\sharing\social-share-kit-1.0.10\dist\fonts\social-share-kit.svg">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\sharing\social-share-kit-1.0.10\dist\fonts\social-share-kit.svg</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\sharing\social-share-kit-1.0.10\dist\fonts\social-share-kit.ttf">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\sharing\social-share-kit-1.0.10\dist\fonts\social-share-kit.ttf</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\sharing\social-share-kit-1.0.10\dist\fonts\social-share-kit.woff">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\sharing\social-share-kit-1.0.10\dist\fonts\social-share-kit.woff</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\sharing\social-share-kit-1.0.10\dist\js\social-share-kit.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\sharing\social-share-kit-1.0.10\dist\js\social-share-kit.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\sharing\social-share-kit-1.0.10\dist\js\social-share-kit.min.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\sharing\social-share-kit-1.0.10\dist\js\social-share-kit.min.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\slideshow\slideshow.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\slideshow\slideshow.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\slideshow\style.css">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\slideshow\style.css</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\strings\ar.json">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\strings\ar.json</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\strings\bg-bg.json">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\strings\bg-bg.json</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\strings\ca.json">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\strings\ca.json</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\strings\cs.json">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\strings\cs.json</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\strings\da.json">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\strings\da.json</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\strings\de.json">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\strings\de.json</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\strings\el.json">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\strings\el.json</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\strings\en-gb.json">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\strings\en-gb.json</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\strings\en-us.json">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\strings\en-us.json</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\strings\es-ar.json">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\strings\es-ar.json</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\strings\es-mx.json">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\strings\es-mx.json</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\strings\es.json">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\strings\es.json</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\strings\fi.json">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\strings\fi.json</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\strings\fr-ca.json">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\strings\fr-ca.json</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\strings\fr.json">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\strings\fr.json</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\strings\gsw.json">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\strings\gsw.json</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\strings\he.json">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\strings\he.json</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\strings\hr.json">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\strings\hr.json</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\strings\hu.json">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\strings\hu.json</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\strings\id.json">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\strings\id.json</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\strings\it.json">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\strings\it.json</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\strings\kk.json">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\strings\kk.json</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\strings\ko.json">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\strings\ko.json</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\strings\lt-lt.json">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\strings\lt-lt.json</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\strings\ms.json">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\strings\ms.json</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\strings\nb.json">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\strings\nb.json</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\strings\nl.json">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\strings\nl.json</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\strings\pl.json">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\strings\pl.json</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\strings\pt-br.json">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\strings\pt-br.json</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\strings\pt-pt.json">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\strings\pt-pt.json</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\strings\ro.json">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\strings\ro.json</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\strings\ru.json">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\strings\ru.json</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\strings\sk.json">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\strings\sk.json</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\strings\sl-si.json">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\strings\sl-si.json</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\strings\sv.json">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\strings\sv.json</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\strings\tr.json">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\strings\tr.json</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\strings\uk.json">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\strings\uk.json</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\strings\vi.json">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\strings\vi.json</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\strings\zh-cn.json">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\strings\zh-cn.json</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\strings\zh-hk.json">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\strings\zh-hk.json</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\strings\zh-tw.json">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\strings\zh-tw.json</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\subtitleeditor\subtitleeditor.css">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\subtitleeditor\subtitleeditor.css</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\subtitleeditor\subtitleeditor.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\subtitleeditor\subtitleeditor.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\subtitleeditor\subtitleeditor.template.html">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\subtitleeditor\subtitleeditor.template.html</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\subtitlesettings\subtitleappearancehelper.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\subtitlesettings\subtitleappearancehelper.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\subtitlesettings\subtitlesettings.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\subtitlesettings\subtitlesettings.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\subtitlesettings\subtitlesettings.template.html">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\subtitlesettings\subtitlesettings.template.html</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\sync\emby-downloadbutton.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\sync\emby-downloadbutton.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\sync\sync.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\sync\sync.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\sync\syncjobeditor.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\sync\syncjobeditor.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\sync\syncjoblist.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\sync\syncjoblist.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\themes\appletv\logo.png">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\themes\appletv\logo.png</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\themes\appletv\theme.css">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\themes\appletv\theme.css</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\themes\dark\logo.png">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\themes\dark\logo.png</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\themes\dark\theme.css">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\themes\dark\theme.css</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\themes\dark-green\logo.png">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\themes\dark-green\logo.png</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\themes\dark-green\theme.css">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\themes\dark-green\theme.css</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\themes\dark-red\logo.png">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\themes\dark-red\logo.png</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\themes\dark-red\theme.css">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\themes\dark-red\theme.css</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\themes\halloween\bg.jpg">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\themes\halloween\bg.jpg</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\themes\halloween\logo.png">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\themes\halloween\logo.png</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\themes\halloween\theme.css">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\themes\halloween\theme.css</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\themes\light\logo.png">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\themes\light\logo.png</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\themes\light\theme.css">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\themes\light\theme.css</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\themes\light-blue\logo.png">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\themes\light-blue\logo.png</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\themes\light-blue\theme.css">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\themes\light-blue\theme.css</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\themes\light-green\logo.png">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\themes\light-green\logo.png</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\themes\light-green\theme.css">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\themes\light-green\theme.css</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\themes\light-pink\logo.png">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\themes\light-pink\logo.png</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\themes\light-pink\theme.css">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\themes\light-pink\theme.css</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\themes\light-purple\logo.png">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\themes\light-purple\logo.png</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\themes\light-purple\theme.css">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\themes\light-purple\theme.css</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\themes\light-red\logo.png">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\themes\light-red\logo.png</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\themes\light-red\theme.css">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\themes\light-red\theme.css</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\themes\wmc\logo.png">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\themes\wmc\logo.png</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\themes\wmc\theme.css">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\themes\wmc\theme.css</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\toast\toast.css">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\toast\toast.css</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\toast\toast.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\toast\toast.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\upnextdialog\upnextdialog.css">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\upnextdialog\upnextdialog.css</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\upnextdialog\upnextdialog.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\upnextdialog\upnextdialog.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\userdatabuttons\emby-playstatebutton.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\userdatabuttons\emby-playstatebutton.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\userdatabuttons\emby-ratingbutton.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\userdatabuttons\emby-ratingbutton.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\userdatabuttons\userdatabuttons.css">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\userdatabuttons\userdatabuttons.css</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\userdatabuttons\userdatabuttons.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\userdatabuttons\userdatabuttons.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\usersettings\usersettings.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\usersettings\usersettings.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\usersettings\usersettingsbuilder.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\usersettings\usersettingsbuilder.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\viewmanager\viewcontainer-lite.css">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\viewmanager\viewcontainer-lite.css</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\viewmanager\viewcontainer-lite.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\viewmanager\viewcontainer-lite.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\viewmanager\viewmanager.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\viewmanager\viewmanager.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\youtubeplayer\plugin.js">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\youtubeplayer\plugin.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\youtubeplayer\style.css">
- <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\youtubeplayer\style.css</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\fetch\LICENSE">
- <Link>Resources\dashboard-ui\bower_components\fetch\LICENSE</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\fetch\fetch.js">
- <Link>Resources\dashboard-ui\bower_components\fetch\fetch.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\hlsjs\LICENSE">
- <Link>Resources\dashboard-ui\bower_components\hlsjs\LICENSE</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\hlsjs\hls.js.sublime-project">
- <Link>Resources\dashboard-ui\bower_components\hlsjs\hls.js.sublime-project</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\hlsjs\dist\hls.min.js">
- <Link>Resources\dashboard-ui\bower_components\hlsjs\dist\hls.min.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\howlerjs\howler.min.js">
- <Link>Resources\dashboard-ui\bower_components\howlerjs\howler.min.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\jquery\dist\core.js">
- <Link>Resources\dashboard-ui\bower_components\jquery\dist\core.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\jquery\dist\jquery.js">
- <Link>Resources\dashboard-ui\bower_components\jquery\dist\jquery.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\jquery\dist\jquery.min.js">
- <Link>Resources\dashboard-ui\bower_components\jquery\dist\jquery.min.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\jquery\dist\jquery.slim.js">
- <Link>Resources\dashboard-ui\bower_components\jquery\dist\jquery.slim.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\jquery\dist\jquery.slim.min.js">
- <Link>Resources\dashboard-ui\bower_components\jquery\dist\jquery.slim.min.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\jstree\LICENSE-MIT">
- <Link>Resources\dashboard-ui\bower_components\jstree\LICENSE-MIT</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\jstree\dist\jstree.js">
- <Link>Resources\dashboard-ui\bower_components\jstree\dist\jstree.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\jstree\dist\jstree.min.js">
- <Link>Resources\dashboard-ui\bower_components\jstree\dist\jstree.min.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\jstree\dist\themes\default\32px.png">
- <Link>Resources\dashboard-ui\bower_components\jstree\dist\themes\default\32px.png</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\jstree\dist\themes\default\40px.png">
- <Link>Resources\dashboard-ui\bower_components\jstree\dist\themes\default\40px.png</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\jstree\dist\themes\default\style.css">
- <Link>Resources\dashboard-ui\bower_components\jstree\dist\themes\default\style.css</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\jstree\dist\themes\default\style.min.css">
- <Link>Resources\dashboard-ui\bower_components\jstree\dist\themes\default\style.min.css</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\jstree\dist\themes\default\throbber.gif">
- <Link>Resources\dashboard-ui\bower_components\jstree\dist\themes\default\throbber.gif</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\jstree\dist\themes\default-dark\32px.png">
- <Link>Resources\dashboard-ui\bower_components\jstree\dist\themes\default-dark\32px.png</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\jstree\dist\themes\default-dark\40px.png">
- <Link>Resources\dashboard-ui\bower_components\jstree\dist\themes\default-dark\40px.png</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\jstree\dist\themes\default-dark\style.css">
- <Link>Resources\dashboard-ui\bower_components\jstree\dist\themes\default-dark\style.css</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\jstree\dist\themes\default-dark\style.min.css">
- <Link>Resources\dashboard-ui\bower_components\jstree\dist\themes\default-dark\style.min.css</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\jstree\dist\themes\default-dark\throbber.gif">
- <Link>Resources\dashboard-ui\bower_components\jstree\dist\themes\default-dark\throbber.gif</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\libjass\LICENSE">
- <Link>Resources\dashboard-ui\bower_components\libjass\LICENSE</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\libjass\libjass.css">
- <Link>Resources\dashboard-ui\bower_components\libjass\libjass.css</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\libjass\libjass.min.js">
- <Link>Resources\dashboard-ui\bower_components\libjass\libjass.min.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\query-string\index.js">
- <Link>Resources\dashboard-ui\bower_components\query-string\index.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\query-string\license">
- <Link>Resources\dashboard-ui\bower_components\query-string\license</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\query-string\test.js">
- <Link>Resources\dashboard-ui\bower_components\query-string\test.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\requirejs\LICENSE">
- <Link>Resources\dashboard-ui\bower_components\requirejs\LICENSE</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\requirejs\require.js">
- <Link>Resources\dashboard-ui\bower_components\requirejs\require.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\resize-observer-polyfill\LICENSE">
- <Link>Resources\dashboard-ui\bower_components\resize-observer-polyfill\LICENSE</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\resize-observer-polyfill\resizeobserver.js">
- <Link>Resources\dashboard-ui\bower_components\resize-observer-polyfill\resizeobserver.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\vibrant\gulpfile.coffee">
- <Link>Resources\dashboard-ui\bower_components\vibrant\gulpfile.coffee</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\vibrant\index.html">
- <Link>Resources\dashboard-ui\bower_components\vibrant\index.html</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\vibrant\style.css">
- <Link>Resources\dashboard-ui\bower_components\vibrant\style.css</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\vibrant\website.coffee">
- <Link>Resources\dashboard-ui\bower_components\vibrant\website.coffee</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\vibrant\dist\vibrant.js">
- <Link>Resources\dashboard-ui\bower_components\vibrant\dist\vibrant.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\vibrant\dist\vibrant.min.js">
- <Link>Resources\dashboard-ui\bower_components\vibrant\dist\vibrant.min.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\webcomponentsjs\webcomponents-lite.min.js">
- <Link>Resources\dashboard-ui\bower_components\webcomponentsjs\webcomponents-lite.min.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\components\apphost.js">
- <Link>Resources\dashboard-ui\components\apphost.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\components\categorysyncbuttons.js">
- <Link>Resources\dashboard-ui\components\categorysyncbuttons.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\components\favoriteitems.js">
- <Link>Resources\dashboard-ui\components\favoriteitems.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\components\groupedcards.js">
- <Link>Resources\dashboard-ui\components\groupedcards.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\components\humanedate.js">
- <Link>Resources\dashboard-ui\components\humanedate.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\components\iap.js">
- <Link>Resources\dashboard-ui\components\iap.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\components\maintabsmanager.js">
- <Link>Resources\dashboard-ui\components\maintabsmanager.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\components\remotecontrol.js">
- <Link>Resources\dashboard-ui\components\remotecontrol.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\components\tunerpicker.js">
- <Link>Resources\dashboard-ui\components\tunerpicker.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\components\viewcontainer-lite.js">
- <Link>Resources\dashboard-ui\components\viewcontainer-lite.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\components\accessschedule\accessschedule.js">
- <Link>Resources\dashboard-ui\components\accessschedule\accessschedule.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\components\accessschedule\accessschedule.template.html">
- <Link>Resources\dashboard-ui\components\accessschedule\accessschedule.template.html</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\components\channelmapper\channelmapper.js">
- <Link>Resources\dashboard-ui\components\channelmapper\channelmapper.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\components\directorybrowser\directorybrowser.css">
- <Link>Resources\dashboard-ui\components\directorybrowser\directorybrowser.css</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\components\directorybrowser\directorybrowser.js">
- <Link>Resources\dashboard-ui\components\directorybrowser\directorybrowser.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\components\dockedtabs\dockedtabs.css">
- <Link>Resources\dashboard-ui\components\dockedtabs\dockedtabs.css</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\components\dockedtabs\dockedtabs.js">
- <Link>Resources\dashboard-ui\components\dockedtabs\dockedtabs.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\components\filterdialog\filterdialog.js">
- <Link>Resources\dashboard-ui\components\filterdialog\filterdialog.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\components\filterdialog\filterdialog.template.html">
- <Link>Resources\dashboard-ui\components\filterdialog\filterdialog.template.html</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\components\filterdialog\style.css">
- <Link>Resources\dashboard-ui\components\filterdialog\style.css</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\components\guestinviter\connectlink.js">
- <Link>Resources\dashboard-ui\components\guestinviter\connectlink.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\components\guestinviter\connectlink.template.html">
- <Link>Resources\dashboard-ui\components\guestinviter\connectlink.template.html</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\components\guestinviter\guestinviter.js">
- <Link>Resources\dashboard-ui\components\guestinviter\guestinviter.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\components\guestinviter\guestinviter.template.html">
- <Link>Resources\dashboard-ui\components\guestinviter\guestinviter.template.html</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\components\libraryoptionseditor\libraryoptionseditor.js">
- <Link>Resources\dashboard-ui\components\libraryoptionseditor\libraryoptionseditor.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\components\libraryoptionseditor\libraryoptionseditor.template.html">
- <Link>Resources\dashboard-ui\components\libraryoptionseditor\libraryoptionseditor.template.html</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\components\medialibrarycreator\medialibrarycreator.js">
- <Link>Resources\dashboard-ui\components\medialibrarycreator\medialibrarycreator.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\components\medialibrarycreator\medialibrarycreator.template.html">
- <Link>Resources\dashboard-ui\components\medialibrarycreator\medialibrarycreator.template.html</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\components\medialibraryeditor\medialibraryeditor.js">
- <Link>Resources\dashboard-ui\components\medialibraryeditor\medialibraryeditor.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\components\medialibraryeditor\medialibraryeditor.template.html">
- <Link>Resources\dashboard-ui\components\medialibraryeditor\medialibraryeditor.template.html</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\components\navdrawer\navdrawer.css">
- <Link>Resources\dashboard-ui\components\navdrawer\navdrawer.css</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\components\navdrawer\navdrawer.js">
- <Link>Resources\dashboard-ui\components\navdrawer\navdrawer.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\components\tvproviders\schedulesdirect.js">
- <Link>Resources\dashboard-ui\components\tvproviders\schedulesdirect.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\components\tvproviders\schedulesdirect.template.html">
- <Link>Resources\dashboard-ui\components\tvproviders\schedulesdirect.template.html</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\components\tvproviders\xmltv.js">
- <Link>Resources\dashboard-ui\components\tvproviders\xmltv.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\components\tvproviders\xmltv.template.html">
- <Link>Resources\dashboard-ui\components\tvproviders\xmltv.template.html</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\css\dashboard.css">
- <Link>Resources\dashboard-ui\css\dashboard.css</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\css\detailtable.css">
- <Link>Resources\dashboard-ui\css\detailtable.css</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\css\librarybrowser.css">
- <Link>Resources\dashboard-ui\css\librarybrowser.css</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\css\livetv.css">
- <Link>Resources\dashboard-ui\css\livetv.css</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\css\metadataeditor.css">
- <Link>Resources\dashboard-ui\css\metadataeditor.css</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\css\notifications.css">
- <Link>Resources\dashboard-ui\css\notifications.css</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\css\nowplaying.css">
- <Link>Resources\dashboard-ui\css\nowplaying.css</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\css\site.css">
- <Link>Resources\dashboard-ui\css\site.css</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\css\videoosd.css">
- <Link>Resources\dashboard-ui\css\videoosd.css</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\css\images\ani_equalizer_black.gif">
- <Link>Resources\dashboard-ui\css\images\ani_equalizer_black.gif</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\css\images\ani_equalizer_white.gif">
- <Link>Resources\dashboard-ui\css\images\ani_equalizer_white.gif</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\css\images\checkmarkgreen.png">
- <Link>Resources\dashboard-ui\css\images\checkmarkgreen.png</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\css\images\empty.png">
- <Link>Resources\dashboard-ui\css\images\empty.png</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\css\images\favicon.ico">
- <Link>Resources\dashboard-ui\css\images\favicon.ico</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\css\images\fresh.png">
- <Link>Resources\dashboard-ui\css\images\fresh.png</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\css\images\iossplash.png">
- <Link>Resources\dashboard-ui\css\images\iossplash.png</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\css\images\logindefault.png">
- <Link>Resources\dashboard-ui\css\images\logindefault.png</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\css\images\logo.png">
- <Link>Resources\dashboard-ui\css\images\logo.png</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\css\images\logoblack.png">
- <Link>Resources\dashboard-ui\css\images\logoblack.png</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\css\images\mblogoicon.png">
- <Link>Resources\dashboard-ui\css\images\mblogoicon.png</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\css\images\rightarrow.png">
- <Link>Resources\dashboard-ui\css\images\rightarrow.png</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\css\images\rotten.png">
- <Link>Resources\dashboard-ui\css\images\rotten.png</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\css\images\throbber.gif">
- <Link>Resources\dashboard-ui\css\images\throbber.gif</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\css\images\userflyoutdefault.png">
- <Link>Resources\dashboard-ui\css\images\userflyoutdefault.png</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\css\images\clients\amazon.png">
- <Link>Resources\dashboard-ui\css\images\clients\amazon.png</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\css\images\clients\android.png">
- <Link>Resources\dashboard-ui\css\images\clients\android.png</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\css\images\clients\androidtv-tile.png">
- <Link>Resources\dashboard-ui\css\images\clients\androidtv-tile.png</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\css\images\clients\chrome.png">
- <Link>Resources\dashboard-ui\css\images\clients\chrome.png</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\css\images\clients\chromecast.png">
- <Link>Resources\dashboard-ui\css\images\clients\chromecast.png</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\css\images\clients\dlna.png">
- <Link>Resources\dashboard-ui\css\images\clients\dlna.png</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\css\images\clients\html5.png">
- <Link>Resources\dashboard-ui\css\images\clients\html5.png</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\css\images\clients\ios.png">
- <Link>Resources\dashboard-ui\css\images\clients\ios.png</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\css\images\clients\kodi.png">
- <Link>Resources\dashboard-ui\css\images\clients\kodi.png</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\css\images\clients\mbc.png">
- <Link>Resources\dashboard-ui\css\images\clients\mbc.png</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\css\images\clients\playstore.png">
- <Link>Resources\dashboard-ui\css\images\clients\playstore.png</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\css\images\clients\roku.jpg">
- <Link>Resources\dashboard-ui\css\images\clients\roku.jpg</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\css\images\clients\windowsphone.png">
- <Link>Resources\dashboard-ui\css\images\clients\windowsphone.png</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\css\images\clients\windowsrt.png">
- <Link>Resources\dashboard-ui\css\images\clients\windowsrt.png</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\css\images\editor\missing.png">
- <Link>Resources\dashboard-ui\css\images\editor\missing.png</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\css\images\editor\missingbackdrop.png">
- <Link>Resources\dashboard-ui\css\images\editor\missingbackdrop.png</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\css\images\editor\missinglogo.png">
- <Link>Resources\dashboard-ui\css\images\editor\missinglogo.png</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\css\images\editor\missingprimaryimage.png">
- <Link>Resources\dashboard-ui\css\images\editor\missingprimaryimage.png</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\css\images\items\detail\audio.png">
- <Link>Resources\dashboard-ui\css\images\items\detail\audio.png</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\css\images\items\detail\game.png">
- <Link>Resources\dashboard-ui\css\images\items\detail\game.png</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\css\images\items\detail\person.png">
- <Link>Resources\dashboard-ui\css\images\items\detail\person.png</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\css\images\items\detail\tv.png">
- <Link>Resources\dashboard-ui\css\images\items\detail\tv.png</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\css\images\items\detail\video.png">
- <Link>Resources\dashboard-ui\css\images\items\detail\video.png</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\css\images\items\list\chapter.png">
- <Link>Resources\dashboard-ui\css\images\items\list\chapter.png</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\css\images\items\list\collection.png">
- <Link>Resources\dashboard-ui\css\images\items\list\collection.png</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\css\images\items\list\person.png">
- <Link>Resources\dashboard-ui\css\images\items\list\person.png</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\css\images\media\chapterflyout.png">
- <Link>Resources\dashboard-ui\css\images\media\chapterflyout.png</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\css\images\media\pause.png">
- <Link>Resources\dashboard-ui\css\images\media\pause.png</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\css\images\media\play.png">
- <Link>Resources\dashboard-ui\css\images\media\play.png</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\css\images\supporter\nonsupporterbadge.png">
- <Link>Resources\dashboard-ui\css\images\supporter\nonsupporterbadge.png</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\css\images\supporter\premiumflag.png">
- <Link>Resources\dashboard-ui\css\images\supporter\premiumflag.png</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\css\images\supporter\supporterbadge.png">
- <Link>Resources\dashboard-ui\css\images\supporter\supporterbadge.png</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\css\images\supporter\supporterflag.png">
- <Link>Resources\dashboard-ui\css\images\supporter\supporterflag.png</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\css\images\tour\enjoy.jpg">
- <Link>Resources\dashboard-ui\css\images\tour\enjoy.jpg</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\css\images\tour\admin\chapters.png">
- <Link>Resources\dashboard-ui\css\images\tour\admin\chapters.png</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\css\images\tour\admin\cinemamode.png">
- <Link>Resources\dashboard-ui\css\images\tour\admin\cinemamode.png</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\css\images\tour\admin\dashboard.png">
- <Link>Resources\dashboard-ui\css\images\tour\admin\dashboard.png</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\css\images\tour\admin\help.png">
- <Link>Resources\dashboard-ui\css\images\tour\admin\help.png</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\css\images\tour\admin\mobile.png">
- <Link>Resources\dashboard-ui\css\images\tour\admin\mobile.png</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\css\images\tour\admin\notifications.png">
- <Link>Resources\dashboard-ui\css\images\tour\admin\notifications.png</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\css\images\tour\admin\plugins.png">
- <Link>Resources\dashboard-ui\css\images\tour\admin\plugins.png</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\css\images\tour\admin\scheduledtasks.png">
- <Link>Resources\dashboard-ui\css\images\tour\admin\scheduledtasks.png</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\css\images\tour\admin\subtitles.png">
- <Link>Resources\dashboard-ui\css\images\tour\admin\subtitles.png</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\css\images\tour\admin\sync.png">
- <Link>Resources\dashboard-ui\css\images\tour\admin\sync.png</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\css\images\tour\admin\users.png">
- <Link>Resources\dashboard-ui\css\images\tour\admin\users.png</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\css\images\tour\web\tourcollections.jpg">
- <Link>Resources\dashboard-ui\css\images\tour\web\tourcollections.jpg</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\css\images\tour\web\tourcontent.jpg">
- <Link>Resources\dashboard-ui\css\images\tour\web\tourcontent.jpg</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\css\images\tour\web\toureditor.png">
- <Link>Resources\dashboard-ui\css\images\tour\web\toureditor.png</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\css\images\tour\web\tourmobile1.jpg">
- <Link>Resources\dashboard-ui\css\images\tour\web\tourmobile1.jpg</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\css\images\tour\web\tourmobile2.png">
- <Link>Resources\dashboard-ui\css\images\tour\web\tourmobile2.png</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\css\images\tour\web\tourmouseover.jpg">
- <Link>Resources\dashboard-ui\css\images\tour\web\tourmouseover.jpg</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\css\images\tour\web\tourmovies.jpg">
- <Link>Resources\dashboard-ui\css\images\tour\web\tourmovies.jpg</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\css\images\tour\web\tourmysync.png">
- <Link>Resources\dashboard-ui\css\images\tour\web\tourmysync.png</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\css\images\tour\web\tourplaylist.png">
- <Link>Resources\dashboard-ui\css\images\tour\web\tourplaylist.png</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\css\images\tour\web\tourtaphold.jpg">
- <Link>Resources\dashboard-ui\css\images\tour\web\tourtaphold.jpg</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\css\images\tour\web\tourusersettings1.png">
- <Link>Resources\dashboard-ui\css\images\tour\web\tourusersettings1.png</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\css\images\tour\web\tourusersettings2.png">
- <Link>Resources\dashboard-ui\css\images\tour\web\tourusersettings2.png</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\css\images\tour\web\tourusersettings3.png">
- <Link>Resources\dashboard-ui\css\images\tour\web\tourusersettings3.png</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\css\images\tour\web\tourusersettings4.png">
- <Link>Resources\dashboard-ui\css\images\tour\web\tourusersettings4.png</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\css\images\userdata\administrator.png">
- <Link>Resources\dashboard-ui\css\images\userdata\administrator.png</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\css\images\userdata\password.png">
- <Link>Resources\dashboard-ui\css\images\userdata\password.png</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\dashboard\aboutpage.js">
- <Link>Resources\dashboard-ui\dashboard\aboutpage.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\dashboard\cinemamodeconfiguration.js">
- <Link>Resources\dashboard-ui\dashboard\cinemamodeconfiguration.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\dashboard\dashboardgeneral.js">
- <Link>Resources\dashboard-ui\dashboard\dashboardgeneral.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\dashboard\dashboardhosting.js">
- <Link>Resources\dashboard-ui\dashboard\dashboardhosting.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\dashboard\devicesupload.js">
- <Link>Resources\dashboard-ui\dashboard\devicesupload.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\dashboard\librarydisplay.js">
- <Link>Resources\dashboard-ui\dashboard\librarydisplay.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\dashboard\librarysettings.js">
- <Link>Resources\dashboard-ui\dashboard\librarysettings.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\dashboard\livetvtuner.js">
- <Link>Resources\dashboard-ui\dashboard\livetvtuner.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\dashboard\logpage.js">
- <Link>Resources\dashboard-ui\dashboard\logpage.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\dashboard\wizardcomponents.js">
- <Link>Resources\dashboard-ui\dashboard\wizardcomponents.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\dashboard\wizardfinishpage.js">
- <Link>Resources\dashboard-ui\dashboard\wizardfinishpage.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\devices\ios\ios.css">
- <Link>Resources\dashboard-ui\devices\ios\ios.css</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\legacy\buttonenabled.js">
- <Link>Resources\dashboard-ui\legacy\buttonenabled.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\legacy\dashboard.js">
- <Link>Resources\dashboard-ui\legacy\dashboard.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\legacy\fnchecked.js">
- <Link>Resources\dashboard-ui\legacy\fnchecked.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\legacy\selectmenu.js">
- <Link>Resources\dashboard-ui\legacy\selectmenu.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\offline\offline.html">
- <Link>Resources\dashboard-ui\offline\offline.html</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\offline\offline.js">
- <Link>Resources\dashboard-ui\offline\offline.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\scripts\addpluginpage.js">
- <Link>Resources\dashboard-ui\scripts\addpluginpage.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\scripts\apploader.js">
- <Link>Resources\dashboard-ui\scripts\apploader.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\scripts\appservices.js">
- <Link>Resources\dashboard-ui\scripts\appservices.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\scripts\autobackdrops.js">
- <Link>Resources\dashboard-ui\scripts\autobackdrops.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\scripts\camerauploadsettings.js">
- <Link>Resources\dashboard-ui\scripts\camerauploadsettings.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\scripts\channelitems.js">
- <Link>Resources\dashboard-ui\scripts\channelitems.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\scripts\channels.js">
- <Link>Resources\dashboard-ui\scripts\channels.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\scripts\connectlogin.js">
- <Link>Resources\dashboard-ui\scripts\connectlogin.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\scripts\dashboardpage.js">
- <Link>Resources\dashboard-ui\scripts\dashboardpage.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\scripts\device.js">
- <Link>Resources\dashboard-ui\scripts\device.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\scripts\devices.js">
- <Link>Resources\dashboard-ui\scripts\devices.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\scripts\dlnaprofile.js">
- <Link>Resources\dashboard-ui\scripts\dlnaprofile.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\scripts\dlnaprofiles.js">
- <Link>Resources\dashboard-ui\scripts\dlnaprofiles.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\scripts\dlnasettings.js">
- <Link>Resources\dashboard-ui\scripts\dlnasettings.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\scripts\edititemmetadata.js">
- <Link>Resources\dashboard-ui\scripts\edititemmetadata.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\scripts\editorsidebar.js">
- <Link>Resources\dashboard-ui\scripts\editorsidebar.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\scripts\encodingsettings.js">
- <Link>Resources\dashboard-ui\scripts\encodingsettings.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\scripts\episodes.js">
- <Link>Resources\dashboard-ui\scripts\episodes.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\scripts\forgotpassword.js">
- <Link>Resources\dashboard-ui\scripts\forgotpassword.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\scripts\forgotpasswordpin.js">
- <Link>Resources\dashboard-ui\scripts\forgotpasswordpin.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\scripts\homefavorites.js">
- <Link>Resources\dashboard-ui\scripts\homefavorites.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\scripts\indexpage.js">
- <Link>Resources\dashboard-ui\scripts\indexpage.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\scripts\itembynamedetailpage.js">
- <Link>Resources\dashboard-ui\scripts\itembynamedetailpage.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\scripts\itemdetailpage.js">
- <Link>Resources\dashboard-ui\scripts\itemdetailpage.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\scripts\itemlistpage.js">
- <Link>Resources\dashboard-ui\scripts\itemlistpage.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\scripts\librarybrowser.js">
- <Link>Resources\dashboard-ui\scripts\librarybrowser.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\scripts\librarymenu.js">
- <Link>Resources\dashboard-ui\scripts\librarymenu.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\scripts\livetvchannel.js">
- <Link>Resources\dashboard-ui\scripts\livetvchannel.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\scripts\livetvchannels.js">
- <Link>Resources\dashboard-ui\scripts\livetvchannels.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\scripts\livetvcomponents.js">
- <Link>Resources\dashboard-ui\scripts\livetvcomponents.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\scripts\livetvguide.js">
- <Link>Resources\dashboard-ui\scripts\livetvguide.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\scripts\livetvguideprovider.js">
- <Link>Resources\dashboard-ui\scripts\livetvguideprovider.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\scripts\livetvitems.js">
- <Link>Resources\dashboard-ui\scripts\livetvitems.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\scripts\livetvrecordings.js">
- <Link>Resources\dashboard-ui\scripts\livetvrecordings.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\scripts\livetvschedule.js">
- <Link>Resources\dashboard-ui\scripts\livetvschedule.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\scripts\livetvseriestimers.js">
- <Link>Resources\dashboard-ui\scripts\livetvseriestimers.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\scripts\livetvsettings.js">
- <Link>Resources\dashboard-ui\scripts\livetvsettings.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\scripts\livetvstatus.js">
- <Link>Resources\dashboard-ui\scripts\livetvstatus.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\scripts\livetvsuggested.js">
- <Link>Resources\dashboard-ui\scripts\livetvsuggested.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\scripts\localsync.js">
- <Link>Resources\dashboard-ui\scripts\localsync.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\scripts\loginpage.js">
- <Link>Resources\dashboard-ui\scripts\loginpage.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\scripts\managedownloads.js">
- <Link>Resources\dashboard-ui\scripts\managedownloads.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\scripts\medialibrarypage.js">
- <Link>Resources\dashboard-ui\scripts\medialibrarypage.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\scripts\metadataimagespage.js">
- <Link>Resources\dashboard-ui\scripts\metadataimagespage.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\scripts\metadatanfo.js">
- <Link>Resources\dashboard-ui\scripts\metadatanfo.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\scripts\metadatasubtitles.js">
- <Link>Resources\dashboard-ui\scripts\metadatasubtitles.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\scripts\moviecollections.js">
- <Link>Resources\dashboard-ui\scripts\moviecollections.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\scripts\moviegenres.js">
- <Link>Resources\dashboard-ui\scripts\moviegenres.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\scripts\movies.js">
- <Link>Resources\dashboard-ui\scripts\movies.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\scripts\moviesrecommended.js">
- <Link>Resources\dashboard-ui\scripts\moviesrecommended.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\scripts\movietrailers.js">
- <Link>Resources\dashboard-ui\scripts\movietrailers.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\scripts\musicalbums.js">
- <Link>Resources\dashboard-ui\scripts\musicalbums.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\scripts\musicartists.js">
- <Link>Resources\dashboard-ui\scripts\musicartists.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\scripts\musicgenres.js">
- <Link>Resources\dashboard-ui\scripts\musicgenres.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\scripts\musicplaylists.js">
- <Link>Resources\dashboard-ui\scripts\musicplaylists.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\scripts\musicrecommended.js">
- <Link>Resources\dashboard-ui\scripts\musicrecommended.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\scripts\mypreferencescommon.js">
- <Link>Resources\dashboard-ui\scripts\mypreferencescommon.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\scripts\mypreferencesdisplay.js">
- <Link>Resources\dashboard-ui\scripts\mypreferencesdisplay.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\scripts\mypreferenceshome.js">
- <Link>Resources\dashboard-ui\scripts\mypreferenceshome.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\scripts\mypreferenceslanguages.js">
- <Link>Resources\dashboard-ui\scripts\mypreferenceslanguages.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\scripts\mypreferencessubtitles.js">
- <Link>Resources\dashboard-ui\scripts\mypreferencessubtitles.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\scripts\myprofile.js">
- <Link>Resources\dashboard-ui\scripts\myprofile.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\scripts\mysync.js">
- <Link>Resources\dashboard-ui\scripts\mysync.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\scripts\mysyncsettings.js">
- <Link>Resources\dashboard-ui\scripts\mysyncsettings.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\scripts\notificationlist.js">
- <Link>Resources\dashboard-ui\scripts\notificationlist.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\scripts\notifications.js">
- <Link>Resources\dashboard-ui\scripts\notifications.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\scripts\notificationsetting.js">
- <Link>Resources\dashboard-ui\scripts\notificationsetting.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\scripts\notificationsettings.js">
- <Link>Resources\dashboard-ui\scripts\notificationsettings.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\scripts\nowplayingpage.js">
- <Link>Resources\dashboard-ui\scripts\nowplayingpage.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\scripts\photos.js">
- <Link>Resources\dashboard-ui\scripts\photos.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\scripts\playbackconfiguration.js">
- <Link>Resources\dashboard-ui\scripts\playbackconfiguration.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\scripts\playlistedit.js">
- <Link>Resources\dashboard-ui\scripts\playlistedit.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\scripts\playlists.js">
- <Link>Resources\dashboard-ui\scripts\playlists.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\scripts\plugincatalogpage.js">
- <Link>Resources\dashboard-ui\scripts\plugincatalogpage.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\scripts\pluginspage.js">
- <Link>Resources\dashboard-ui\scripts\pluginspage.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\scripts\scheduledtaskpage.js">
- <Link>Resources\dashboard-ui\scripts\scheduledtaskpage.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\scripts\scheduledtaskspage.js">
- <Link>Resources\dashboard-ui\scripts\scheduledtaskspage.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\scripts\searchpage.js">
- <Link>Resources\dashboard-ui\scripts\searchpage.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\scripts\searchtab.js">
- <Link>Resources\dashboard-ui\scripts\searchtab.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\scripts\secondaryitems.js">
- <Link>Resources\dashboard-ui\scripts\secondaryitems.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\scripts\selectserver.js">
- <Link>Resources\dashboard-ui\scripts\selectserver.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\scripts\serversecurity.js">
- <Link>Resources\dashboard-ui\scripts\serversecurity.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\scripts\shared.js">
- <Link>Resources\dashboard-ui\scripts\shared.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\scripts\site.js">
- <Link>Resources\dashboard-ui\scripts\site.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\scripts\songs.js">
- <Link>Resources\dashboard-ui\scripts\songs.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\scripts\streamingsettings.js">
- <Link>Resources\dashboard-ui\scripts\streamingsettings.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\scripts\supporterkeypage.js">
- <Link>Resources\dashboard-ui\scripts\supporterkeypage.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\scripts\syncactivity.js">
- <Link>Resources\dashboard-ui\scripts\syncactivity.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\scripts\syncsettings.js">
- <Link>Resources\dashboard-ui\scripts\syncsettings.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\scripts\taskbutton.js">
- <Link>Resources\dashboard-ui\scripts\taskbutton.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\scripts\themeloader.js">
- <Link>Resources\dashboard-ui\scripts\themeloader.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\scripts\tvgenres.js">
- <Link>Resources\dashboard-ui\scripts\tvgenres.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\scripts\tvlatest.js">
- <Link>Resources\dashboard-ui\scripts\tvlatest.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\scripts\tvrecommended.js">
- <Link>Resources\dashboard-ui\scripts\tvrecommended.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\scripts\tvshows.js">
- <Link>Resources\dashboard-ui\scripts\tvshows.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\scripts\tvstudios.js">
- <Link>Resources\dashboard-ui\scripts\tvstudios.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\scripts\tvupcoming.js">
- <Link>Resources\dashboard-ui\scripts\tvupcoming.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\scripts\useredit.js">
- <Link>Resources\dashboard-ui\scripts\useredit.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\scripts\userlibraryaccess.js">
- <Link>Resources\dashboard-ui\scripts\userlibraryaccess.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\scripts\usernew.js">
- <Link>Resources\dashboard-ui\scripts\usernew.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\scripts\userparentalcontrol.js">
- <Link>Resources\dashboard-ui\scripts\userparentalcontrol.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\scripts\userpassword.js">
- <Link>Resources\dashboard-ui\scripts\userpassword.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\scripts\userpasswordpage.js">
- <Link>Resources\dashboard-ui\scripts\userpasswordpage.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\scripts\userprofilespage.js">
- <Link>Resources\dashboard-ui\scripts\userprofilespage.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\scripts\videoosd.js">
- <Link>Resources\dashboard-ui\scripts\videoosd.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\scripts\wizardagreement.js">
- <Link>Resources\dashboard-ui\scripts\wizardagreement.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\scripts\wizardcontroller.js">
- <Link>Resources\dashboard-ui\scripts\wizardcontroller.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\scripts\wizardsettings.js">
- <Link>Resources\dashboard-ui\scripts\wizardsettings.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\scripts\wizardstartpage.js">
- <Link>Resources\dashboard-ui\scripts\wizardstartpage.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\scripts\wizarduserpage.js">
- <Link>Resources\dashboard-ui\scripts\wizarduserpage.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\strings\ar.json">
- <Link>Resources\dashboard-ui\strings\ar.json</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\strings\be-by.json">
- <Link>Resources\dashboard-ui\strings\be-by.json</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\strings\bg-bg.json">
- <Link>Resources\dashboard-ui\strings\bg-bg.json</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\strings\ca.json">
- <Link>Resources\dashboard-ui\strings\ca.json</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\strings\cs.json">
- <Link>Resources\dashboard-ui\strings\cs.json</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\strings\da.json">
- <Link>Resources\dashboard-ui\strings\da.json</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\strings\de-de.json">
- <Link>Resources\dashboard-ui\strings\de-de.json</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\strings\de.json">
- <Link>Resources\dashboard-ui\strings\de.json</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\strings\el.json">
- <Link>Resources\dashboard-ui\strings\el.json</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\strings\en-gb.json">
- <Link>Resources\dashboard-ui\strings\en-gb.json</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\strings\en-us.json">
- <Link>Resources\dashboard-ui\strings\en-us.json</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\strings\es-ar.json">
- <Link>Resources\dashboard-ui\strings\es-ar.json</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\strings\es-es.json">
- <Link>Resources\dashboard-ui\strings\es-es.json</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\strings\es-mx.json">
- <Link>Resources\dashboard-ui\strings\es-mx.json</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\strings\es.json">
- <Link>Resources\dashboard-ui\strings\es.json</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\strings\fa.json">
- <Link>Resources\dashboard-ui\strings\fa.json</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\strings\fi.json">
- <Link>Resources\dashboard-ui\strings\fi.json</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\strings\fr-ca.json">
- <Link>Resources\dashboard-ui\strings\fr-ca.json</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\strings\fr.json">
- <Link>Resources\dashboard-ui\strings\fr.json</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\strings\gsw.json">
- <Link>Resources\dashboard-ui\strings\gsw.json</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\strings\he.json">
- <Link>Resources\dashboard-ui\strings\he.json</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\strings\hr.json">
- <Link>Resources\dashboard-ui\strings\hr.json</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\strings\hu.json">
- <Link>Resources\dashboard-ui\strings\hu.json</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\strings\id.json">
- <Link>Resources\dashboard-ui\strings\id.json</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\strings\it.json">
- <Link>Resources\dashboard-ui\strings\it.json</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\strings\kk.json">
- <Link>Resources\dashboard-ui\strings\kk.json</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\strings\ko.json">
- <Link>Resources\dashboard-ui\strings\ko.json</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\strings\lt-lt.json">
- <Link>Resources\dashboard-ui\strings\lt-lt.json</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\strings\ms.json">
- <Link>Resources\dashboard-ui\strings\ms.json</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\strings\nb.json">
- <Link>Resources\dashboard-ui\strings\nb.json</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\strings\nl.json">
- <Link>Resources\dashboard-ui\strings\nl.json</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\strings\pl.json">
- <Link>Resources\dashboard-ui\strings\pl.json</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\strings\pt-br.json">
- <Link>Resources\dashboard-ui\strings\pt-br.json</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\strings\pt-pt.json">
- <Link>Resources\dashboard-ui\strings\pt-pt.json</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\strings\ro.json">
- <Link>Resources\dashboard-ui\strings\ro.json</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\strings\ru.json">
- <Link>Resources\dashboard-ui\strings\ru.json</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\strings\sk.json">
- <Link>Resources\dashboard-ui\strings\sk.json</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\strings\sl-si.json">
- <Link>Resources\dashboard-ui\strings\sl-si.json</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\strings\sv.json">
- <Link>Resources\dashboard-ui\strings\sv.json</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\strings\tr.json">
- <Link>Resources\dashboard-ui\strings\tr.json</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\strings\uk.json">
- <Link>Resources\dashboard-ui\strings\uk.json</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\strings\vi.json">
- <Link>Resources\dashboard-ui\strings\vi.json</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\strings\zh-cn.json">
- <Link>Resources\dashboard-ui\strings\zh-cn.json</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\strings\zh-hk.json">
- <Link>Resources\dashboard-ui\strings\zh-hk.json</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\strings\zh-tw.json">
- <Link>Resources\dashboard-ui\strings\zh-tw.json</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\themes\halloween\theme.js">
- <Link>Resources\dashboard-ui\themes\halloween\theme.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\themes\holiday\style.css">
- <Link>Resources\dashboard-ui\themes\holiday\style.css</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\themes\holiday\theme.js">
- <Link>Resources\dashboard-ui\themes\holiday\theme.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\thirdparty\jquerymobile-1.4.5\jqm.panel.css">
- <Link>Resources\dashboard-ui\thirdparty\jquerymobile-1.4.5\jqm.panel.css</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\thirdparty\jquerymobile-1.4.5\jqm.panel.js">
- <Link>Resources\dashboard-ui\thirdparty\jquerymobile-1.4.5\jqm.panel.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\thirdparty\jquerymobile-1.4.5\jqm.popup.css">
- <Link>Resources\dashboard-ui\thirdparty\jquerymobile-1.4.5\jqm.popup.css</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\thirdparty\jquerymobile-1.4.5\jqm.popup.js">
- <Link>Resources\dashboard-ui\thirdparty\jquerymobile-1.4.5\jqm.popup.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\thirdparty\jquerymobile-1.4.5\jqm.widget.js">
- <Link>Resources\dashboard-ui\thirdparty\jquerymobile-1.4.5\jqm.widget.js</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\thirdparty\jstree\themes\default\32px.png">
- <Link>Resources\dashboard-ui\thirdparty\jstree\themes\default\32px.png</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\thirdparty\jstree\themes\default\40px.png">
- <Link>Resources\dashboard-ui\thirdparty\jstree\themes\default\40px.png</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\thirdparty\jstree\themes\default\style.css">
- <Link>Resources\dashboard-ui\thirdparty\jstree\themes\default\style.css</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\thirdparty\jstree\themes\default\style.min.css">
- <Link>Resources\dashboard-ui\thirdparty\jstree\themes\default\style.min.css</Link>
- </BundleResource>
- <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\thirdparty\jstree\themes\default\throbber.gif">
- <Link>Resources\dashboard-ui\thirdparty\jstree\themes\default\throbber.gif</Link>
- </BundleResource>
- </ItemGroup>
- <ItemGroup>
- <NativeReference Include="..\packages\SkiaSharp.1.58.1\runtimes\osx\native\libSkiaSharp.dylib">
- <Kind>Dynamic</Kind>
- <SmartLink>False</SmartLink>
- </NativeReference>
- <NativeReference Include="..\ThirdParty\SQLite3\osx\libsqlite3.dylib">
- <Kind>Dynamic</Kind>
- <SmartLink>False</SmartLink>
- </NativeReference>
- <NativeReference Include="..\ThirdParty\SQLite3\osx\libsqlite3.0.dylib">
- <Kind>Dynamic</Kind>
- <SmartLink>False</SmartLink>
- </NativeReference>
- </ItemGroup>
-</Project>
\ No newline at end of file diff --git a/MediaBrowser.Server.Mac/Info.plist b/MediaBrowser.Server.Mac/Info.plist deleted file mode 100644 index 73c2036b1..000000000 --- a/MediaBrowser.Server.Mac/Info.plist +++ /dev/null @@ -1,30 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> -<plist version="1.0"> -<dict> - <key>CFBundleIconFile</key> - <string>appicon</string> - <key>CFBundleIdentifier</key> - <string>com.emby.server</string> - <key>CFBundleName</key> - <string>Media Browser</string> - <key>CFBundleShortVersionString</key> - <string>3</string> - <key>CFBundleVersion</key> - <string>1</string> - <key>LSApplicationCategoryType</key> - <string>public.app-category.video</string> - <key>LSMinimumSystemVersion</key> - <string>10.6</string> - <key>LSMultipleInstancesProhibited</key> - <string>1</string> - <key>LSUIElement</key> - <string>1</string> - <key>NSPrincipalClass</key> - <string>NSApplication</string> - <key>NSMainNibFile</key> - <string>MainMenu</string> - <key>CFBundleDisplayName</key> - <string>Emby</string> -</dict> -</plist> diff --git a/MediaBrowser.Server.Mac/MacAppHost.cs b/MediaBrowser.Server.Mac/MacAppHost.cs deleted file mode 100644 index ddcc33778..000000000 --- a/MediaBrowser.Server.Mac/MacAppHost.cs +++ /dev/null @@ -1,97 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Reflection; -using Emby.Server.Implementations; -using Emby.Server.Implementations.FFMpeg; -using MediaBrowser.Model.IO; -using MediaBrowser.Model.Logging; -using MediaBrowser.Model.System; -using Emby.Server.Mac.Native; -using System.Diagnostics; -using MediaBrowser.Controller.Connect; -using Emby.Server.Connect; -using Emby.Server.Sync; -using MediaBrowser.Controller.Sync; -using Emby.Server.CinemaMode; - -namespace MediaBrowser.Server.Mac -{ - public class MacAppHost : ApplicationHost - { - public MacAppHost(ServerApplicationPaths applicationPaths, ILogManager logManager, StartupOptions options, IFileSystem fileSystem, IPowerManagement powerManagement, string releaseAssetFilename, IEnvironmentInfo environmentInfo, MediaBrowser.Controller.Drawing.IImageEncoder imageEncoder, ISystemEvents systemEvents, MediaBrowser.Common.Net.INetworkManager networkManager) : base(applicationPaths, logManager, options, fileSystem, powerManagement, releaseAssetFilename, environmentInfo, imageEncoder, systemEvents, networkManager) - { - } - - public override bool CanSelfRestart - { - get - { - return true; - } - } - - public override bool CanSelfUpdate - { - get - { - return false; - } - } - - protected override bool SupportsDualModeSockets - { - get - { - return true; - } - } - - protected override IConnectManager CreateConnectManager() - { - return new ConnectManager(); - } - - protected override ISyncManager CreateSyncManager() - { - return new SyncManager(); - } - - protected override void RestartInternal() - { - MainClass.Restart(); - } - - protected override List<Assembly> GetAssembliesWithPartsInternal() - { - var list = new List<Assembly>(); - - list.Add(GetType().Assembly); - list.Add(typeof(DefaultIntroProvider).Assembly); - list.Add(typeof(ConnectManager).Assembly); - list.Add(typeof(SyncManager).Assembly); - - - return list; - } - - protected override void ShutdownInternal() - { - MainClass.Shutdown(); - } - - protected override void AuthorizeServer() - { - throw new NotImplementedException(); - } - - protected override void ConfigureAutoRunInternal(bool autorun) - { - throw new NotImplementedException(); - } - - public override bool SupportsAutoRunAtStartup - { - get { return false; } - } - } -} diff --git a/MediaBrowser.Server.Mac/Main.cs b/MediaBrowser.Server.Mac/Main.cs deleted file mode 100644 index 0b34822eb..000000000 --- a/MediaBrowser.Server.Mac/Main.cs +++ /dev/null @@ -1,322 +0,0 @@ -using MediaBrowser.Model.Logging; -using System; -using System.Diagnostics; -using System.Globalization; -using System.IO; -using System.Linq; -using System.Net; -using System.Net.Security; -using System.Reflection; -using System.Text.RegularExpressions; -using System.Threading.Tasks; -using System.Drawing; -using System.Runtime.InteropServices; -using System.Security.Cryptography.X509Certificates; -using System.Threading; -using MonoMac.AppKit; -using MonoMac.Foundation; -using MonoMac.ObjCRuntime; -using Emby.Server.Implementations; -using Emby.Server.Implementations.Logging; -using Emby.Server.Mac.Native; -using Emby.Server.Implementations.IO; -using Mono.Unix.Native; -using MediaBrowser.Model.System; -using MediaBrowser.Model.IO; -using Emby.Drawing; -using Emby.Drawing.Skia; -using MediaBrowser.Controller.Drawing; -using MediaBrowser.Model.Drawing; -using Emby.Server.Implementations.EnvironmentInfo; -using Emby.Server.Implementations.Networking; - -namespace MediaBrowser.Server.Mac -{ - class MainClass - { - internal static MacAppHost AppHost; - - private static ILogger _logger; - private static IFileSystem _fileSystem; - - static void Main (string[] args) - { - SQLitePCL.raw.SetProvider(new SQLitePCL.SQLite3Provider_sqlite3()); - - var applicationPath = Assembly.GetEntryAssembly().Location; - - var options = new StartupOptions(Environment.GetCommandLineArgs()); - - // Allow this to be specified on the command line. - var customProgramDataPath = options.GetOption("-programdata"); - - var appFolderPath = Path.GetDirectoryName(applicationPath); - - var appPaths = CreateApplicationPaths(appFolderPath, customProgramDataPath); - - using (var logManager = new SimpleLogManager(appPaths.LogDirectoryPath, "server")) - { - logManager.ReloadLogger(LogSeverity.Info); - logManager.AddConsoleOutput(); - - var logger = _logger = logManager.GetLogger("Main"); - - ApplicationHost.LogEnvironmentInfo(logger, appPaths, true); - - AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; - - StartApplication(appPaths, logManager, options); - NSApplication.Init(); - NSApplication.Main(args); - } - } - - private static ServerApplicationPaths CreateApplicationPaths(string appFolderPath, string programDataPath) - { - if (string.IsNullOrEmpty(programDataPath)) - { - // TODO: Use CommonApplicationData? Will we always have write access? - programDataPath = Path.Combine(Environment.GetFolderPath (Environment.SpecialFolder.ApplicationData), "mediabrowser-server"); - - if (!Directory.Exists (programDataPath)) { - programDataPath = Path.Combine(Environment.GetFolderPath (Environment.SpecialFolder.ApplicationData), "emby-server"); - } - } - - // Within the mac bundle, go uo two levels then down into Resources folder - var resourcesPath = Path.Combine(Path.GetDirectoryName(appFolderPath), "Resources"); - - return new ServerApplicationPaths(programDataPath, appFolderPath, resourcesPath); - } - - /// <summary> - /// Runs the application. - /// </summary> - /// <param name="appPaths">The app paths.</param> - /// <param name="logManager">The log manager.</param> - /// <param name="options">The options.</param> - private static void StartApplication(ServerApplicationPaths appPaths, - ILogManager logManager, - StartupOptions options) - { - // Allow all https requests - ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(delegate { return true; }); - - var environmentInfo = GetEnvironmentInfo(); - - var fileSystem = new MonoFileSystem(logManager.GetLogger("FileSystem"), environmentInfo, appPaths.TempDirectory); - - _fileSystem = fileSystem; - - var imageEncoder = GetImageEncoder(appPaths, fileSystem, logManager); - - AppHost = new MacAppHost(appPaths, - logManager, - options, - fileSystem, - new PowerManagement(), - "Emby.Server.Mac.pkg", - environmentInfo, - imageEncoder, - new SystemEvents(logManager.GetLogger("SystemEvents")), - new NetworkManager(logManager.GetLogger("NetworkManager"))); - - if (options.ContainsOption("-v")) { - Console.WriteLine (AppHost.ApplicationVersion.ToString()); - return; - } - - Console.WriteLine ("appHost.Init"); - - Task.Run (() => StartServer(CancellationToken.None)); - } - - private static IImageEncoder GetImageEncoder(ServerApplicationPaths appPaths, IFileSystem fileSystem, ILogManager logManager) - { - try - { - return new SkiaEncoder(logManager.GetLogger("Skia"), appPaths, () => AppHost.HttpClient, fileSystem); - } - catch (Exception ex) - { - return new NullImageEncoder(); - } - } - - private static EnvironmentInfo GetEnvironmentInfo() - { - var info = new EnvironmentInfo() - { - OperatingSystem = MediaBrowser.Model.System.OperatingSystem.OSX - }; - - var uname = GetUnixName(); - - var sysName = uname.sysname ?? string.Empty; - - if (string.Equals(sysName, "Darwin", StringComparison.OrdinalIgnoreCase)) - { - //info.OperatingSystem = Startup.Common.OperatingSystem.Osx; - } - else if (string.Equals(sysName, "Linux", StringComparison.OrdinalIgnoreCase)) - { - //info.OperatingSystem = Startup.Common.OperatingSystem.Linux; - } - else if (string.Equals(sysName, "BSD", StringComparison.OrdinalIgnoreCase)) - { - //info.OperatingSystem = Startup.Common.OperatingSystem.Bsd; - //info.IsBsd = true; - } - - var archX86 = new Regex("(i|I)[3-6]86"); - - if (archX86.IsMatch(uname.machine)) - { - info.SystemArchitecture = Architecture.X86; - } - else if (string.Equals(uname.machine, "x86_64", StringComparison.OrdinalIgnoreCase)) - { - info.SystemArchitecture = Architecture.X64; - } - else if (uname.machine.StartsWith("arm", StringComparison.OrdinalIgnoreCase)) - { - info.SystemArchitecture = Architecture.Arm; - } - else if (System.Environment.Is64BitOperatingSystem) - { - info.SystemArchitecture = Architecture.X64; - } - else - { - info.SystemArchitecture = Architecture.X86; - } - - return info; - } - - private static Uname _unixName; - - private static Uname GetUnixName() - { - if (_unixName == null) - { - var uname = new Uname(); - try - { - Utsname utsname; - var callResult = Syscall.uname(out utsname); - if (callResult == 0) - { - uname.sysname = utsname.sysname ?? string.Empty; - uname.machine = utsname.machine ?? string.Empty; - } - - } - catch (Exception ex) - { - _logger.ErrorException("Error getting unix name", ex); - } - _unixName = uname; - } - return _unixName; - } - - public class Uname - { - public string sysname = string.Empty; - public string machine = string.Empty; - } - - private static async void StartServer(CancellationToken cancellationToken) - { - var initProgress = new Progress<double>(); - - await AppHost.Init (initProgress).ConfigureAwait (false); - - await AppHost.RunStartupTasks ().ConfigureAwait (false); - - if (MenuBarIcon.Instance != null) - { - MenuBarIcon.Instance.Localize (); - } - } - - public static void Shutdown() - { - ShutdownApp(); - } - - private static void ShutdownApp() - { - _logger.Info ("Calling ApplicationHost.Dispose"); - AppHost.Dispose (); - - _logger.Info("AppController.Terminate"); - MenuBarIcon.Instance.Terminate (); - } - - public static void Restart() - { - _logger.Info("Disposing app host"); - AppHost.Dispose(); - - _logger.Info("Starting new instance"); - - var args = Environment.GetCommandLineArgs() - .Skip(1) - .Select(NormalizeCommandLineArgument); - - var commandLineArgsString = string.Join(" ", args.ToArray()); - var module = Environment.GetCommandLineArgs().First(); - - _logger.Info ("Executable: {0}", module); - _logger.Info ("Arguments: {0}", commandLineArgsString); - - Process.Start(module, commandLineArgsString); - - _logger.Info("AppController.Terminate"); - MenuBarIcon.Instance.Terminate(); - } - - private static string NormalizeCommandLineArgument(string arg) - { - if (arg.IndexOf(" ", StringComparison.OrdinalIgnoreCase) == -1) - { - return arg; - } - - return "\"" + arg + "\""; - } - - /// <summary> - /// Handles the UnhandledException event of the CurrentDomain control. - /// </summary> - /// <param name="sender">The source of the event.</param> - /// <param name="e">The <see cref="UnhandledExceptionEventArgs"/> instance containing the event data.</param> - static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) - { - var exception = (Exception)e.ExceptionObject; - - var consoleLogger = new ConsoleLogger(); - - new UnhandledExceptionWriter(AppHost.ServerConfigurationManager.ApplicationPaths, _logger, AppHost.LogManager, _fileSystem, consoleLogger).Log(exception); - - if (!Debugger.IsAttached) - { - Environment.Exit(System.Runtime.InteropServices.Marshal.GetHRForException(exception)); - } - } - } - - class NoCheckCertificatePolicy : ICertificatePolicy - { - public bool CheckValidationResult (ServicePoint srvPoint, - System.Security.Cryptography.X509Certificates.X509Certificate certificate, - WebRequest request, - int certificateProblem) - { - return true; - } - } -} - diff --git a/MediaBrowser.Server.Mac/MainMenu.xib b/MediaBrowser.Server.Mac/MainMenu.xib deleted file mode 100755 index 86810928d..000000000 --- a/MediaBrowser.Server.Mac/MainMenu.xib +++ /dev/null @@ -1,230 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="8.00"> - <data> - <int key="IBDocument.SystemTarget">101000</int> - <string key="IBDocument.SystemVersion">13E28</string> - <string key="IBDocument.InterfaceBuilderVersion">6250</string> - <string key="IBDocument.AppKitVersion">1265.21</string> - <string key="IBDocument.HIToolboxVersion">698.00</string> - <object class="NSMutableDictionary" key="IBDocument.PluginVersions"> - <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin</string> - <string key="NS.object.0">6250</string> - </object> - <array key="IBDocument.IntegratedClassDependencies"> - <string>NSCustomObject</string> - <string>NSMenu</string> - <string>NSMenuItem</string> - </array> - <array key="IBDocument.PluginDependencies"> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - </array> - <object class="NSMutableDictionary" key="IBDocument.Metadata"> - <string key="NS.key.0">PluginDependencyRecalculationVersion</string> - <integer value="1" key="NS.object.0"/> - </object> - <array class="NSMutableArray" key="IBDocument.RootObjects" id="1048"> - <object class="NSCustomObject" id="1021"> - <string key="NSClassName">NSApplication</string> - </object> - <object class="NSCustomObject" id="1014"> - <string key="NSClassName">FirstResponder</string> - </object> - <object class="NSCustomObject" id="1050"> - <string key="NSClassName">NSApplication</string> - </object> - <object class="NSCustomObject" id="755631768"> - <string key="NSClassName">NSFontManager</string> - </object> - <object class="NSCustomObject" id="947627720"> - <string key="NSClassName">AppDelegate</string> - </object> - <object class="NSCustomObject" id="67438171"> - <string key="NSClassName">AppController</string> - </object> - <object class="NSMenu" id="761139089"> - <string key="NSTitle"/> - <array class="NSMutableArray" key="NSMenuItems"> - <object class="NSMenuItem" id="523607499"> - <reference key="NSMenu" ref="761139089"/> - <string key="NSTitle">Quit</string> - <string key="NSKeyEquiv"/> - <int key="NSMnemonicLoc">2147483647</int> - <object class="NSCustomResource" key="NSOnImage"> - <string key="NSClassName">NSImage</string> - <string key="NSResourceName">NSMenuCheckmark</string> - </object> - <object class="NSCustomResource" key="NSMixedImage"> - <string key="NSClassName">NSImage</string> - <string key="NSResourceName">NSMenuMixedState</string> - </object> - </object> - </array> - </object> - </array> - <object class="IBObjectContainer" key="IBDocument.Objects"> - <array key="connectionRecords"> - <object class="IBConnectionRecord"> - <object class="IBOutletConnection" key="connection"> - <string key="label">delegate</string> - <reference key="source" ref="1021"/> - <reference key="destination" ref="947627720"/> - </object> - <int key="connectionID">534</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBOutletConnection" key="connection"> - <string key="label">statusMenu</string> - <reference key="source" ref="67438171"/> - <reference key="destination" ref="761139089"/> - </object> - <int key="connectionID">540</int> - </object> - </array> - <object class="IBMutableOrderedSet" key="objectRecords"> - <array key="orderedObjects"> - <object class="IBObjectRecord"> - <int key="objectID">0</int> - <array key="object" id="0"/> - <reference key="children" ref="1048"/> - <nil key="parent"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">-2</int> - <reference key="object" ref="1021"/> - <reference key="parent" ref="0"/> - <string key="objectName">File's Owner</string> - </object> - <object class="IBObjectRecord"> - <int key="objectID">-1</int> - <reference key="object" ref="1014"/> - <reference key="parent" ref="0"/> - <string key="objectName">First Responder</string> - </object> - <object class="IBObjectRecord"> - <int key="objectID">-3</int> - <reference key="object" ref="1050"/> - <reference key="parent" ref="0"/> - <string key="objectName">Application</string> - </object> - <object class="IBObjectRecord"> - <int key="objectID">420</int> - <reference key="object" ref="755631768"/> - <reference key="parent" ref="0"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">533</int> - <reference key="object" ref="947627720"/> - <reference key="parent" ref="0"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">535</int> - <reference key="object" ref="67438171"/> - <reference key="parent" ref="0"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">536</int> - <reference key="object" ref="761139089"/> - <array class="NSMutableArray" key="children"> - <reference ref="523607499"/> - </array> - <reference key="parent" ref="0"/> - <string key="objectName">MediaBrowser.Server.Mac</string> - </object> - <object class="IBObjectRecord"> - <int key="objectID">538</int> - <reference key="object" ref="523607499"/> - <reference key="parent" ref="761139089"/> - </object> - </array> - </object> - <dictionary class="NSMutableDictionary" key="flattenedProperties"> - <string key="-1.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> - <string key="-2.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> - <string key="-3.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> - <string key="420.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> - <string key="533.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> - <string key="535.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> - <string key="536.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> - <string key="538.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> - </dictionary> - <dictionary class="NSMutableDictionary" key="unlocalizedProperties"/> - <nil key="activeLocalization"/> - <dictionary class="NSMutableDictionary" key="localizations"/> - <nil key="sourceID"/> - <int key="maxID">542</int> - </object> - <object class="IBClassDescriber" key="IBDocument.Classes"> - <array class="NSMutableArray" key="referencedPartialClassDescriptions"> - <object class="IBPartialClassDescription"> - <string key="className">AppController</string> - <string key="superclassName">NSObject</string> - <object class="NSMutableDictionary" key="actions"> - <string key="NS.key.0">HelloWorld:</string> - <string key="NS.object.0">id</string> - </object> - <object class="NSMutableDictionary" key="actionInfosByName"> - <string key="NS.key.0">HelloWorld:</string> - <object class="IBActionInfo" key="NS.object.0"> - <string key="name">HelloWorld:</string> - <string key="candidateClassName">id</string> - </object> - </object> - <object class="NSMutableDictionary" key="outlets"> - <string key="NS.key.0">statusMenu</string> - <string key="NS.object.0">NSMenu</string> - </object> - <object class="NSMutableDictionary" key="toOneOutletInfosByName"> - <string key="NS.key.0">statusMenu</string> - <object class="IBToOneOutletInfo" key="NS.object.0"> - <string key="name">statusMenu</string> - <string key="candidateClassName">NSMenu</string> - </object> - </object> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBProjectSource</string> - <string key="minorKey">../AppController.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">AppController</string> - <object class="NSMutableDictionary" key="actions"> - <string key="NS.key.0">HelloWorld:</string> - <string key="NS.object.0">id</string> - </object> - <object class="NSMutableDictionary" key="actionInfosByName"> - <string key="NS.key.0">HelloWorld:</string> - <object class="IBActionInfo" key="NS.object.0"> - <string key="name">HelloWorld:</string> - <string key="candidateClassName">id</string> - </object> - </object> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBProjectSource</string> - <string key="minorKey">../AppController.m</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">AppDelegate</string> - <string key="superclassName">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBProjectSource</string> - <string key="minorKey">../AppDelegate.h</string> - </object> - </object> - </array> - </object> - <int key="IBDocument.localizationMode">0</int> - <string key="IBDocument.TargetRuntimeIdentifier">IBCocoaFramework</string> - <bool key="IBDocument.previouslyAttemptedUpgradeToXcode5">NO</bool> - <object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDevelopmentDependencies"> - <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3</string> - <integer value="4600" key="NS.object.0"/> - </object> - <bool key="IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion">YES</bool> - <int key="IBDocument.defaultPropertyAccessControl">3</int> - <dictionary class="NSMutableDictionary" key="IBDocument.LastKnownImageSizes"> - <string key="NSMenuCheckmark">{11, 11}</string> - <string key="NSMenuMixedState">{10, 3}</string> - </dictionary> - </data> -</archive> diff --git a/MediaBrowser.Server.Mac/MenuBarIcon.cs b/MediaBrowser.Server.Mac/MenuBarIcon.cs deleted file mode 100644 index 1b335ce46..000000000 --- a/MediaBrowser.Server.Mac/MenuBarIcon.cs +++ /dev/null @@ -1,145 +0,0 @@ -using MediaBrowser.Controller; -using MediaBrowser.Controller.Configuration; -using MediaBrowser.Model.Logging; -using System; -using MonoMac.Foundation; -using MonoMac.AppKit; -using Emby.Server.Implementations.Browser; - -namespace MediaBrowser.Server.Mac -{ - public class MenuBarIcon - { - private NSMenuItem browseMenuItem; - private NSMenuItem configureMenuItem; - private NSMenuItem quitMenuItem; - private NSMenuItem communityMenuItem; - - public static MenuBarIcon Instance; - - public MenuBarIcon (ILogger logger) - { - Instance = this; - Logger = logger; - } - - public void ShowIcon() { - - NSApplication.SharedApplication.BeginInvokeOnMainThread (CreateMenus); - } - - private void CreateMenus() { - - CreateNsMenu (); - } - - public void Localize() - { - NSApplication.SharedApplication.BeginInvokeOnMainThread (() => { - - var configManager = MainClass.AppHost.ServerConfigurationManager; - - configManager.ConfigurationUpdated -= Instance_ConfigurationUpdated; - LocalizeText (); - configManager.ConfigurationUpdated += Instance_ConfigurationUpdated; - }); - } - - private NSStatusItem statusItem; - private void CreateNsMenu() { - - var menu = new NSMenu (); - - statusItem = NSStatusBar.SystemStatusBar.CreateStatusItem(30); - statusItem.Menu = menu; - statusItem.Image = NSImage.ImageNamed("statusicon"); - statusItem.HighlightMode = true; - - menu.RemoveAllItems (); - - browseMenuItem = new NSMenuItem ("Browse Media Library", "b", delegate { - Browse (NSApplication.SharedApplication); - }); - menu.AddItem (browseMenuItem); - - configureMenuItem = new NSMenuItem ("Configure Media Browser", "c", delegate { - Configure (NSApplication.SharedApplication); - }); - menu.AddItem (configureMenuItem); - - communityMenuItem = new NSMenuItem ("Visit Community", "v", delegate { - Community (NSApplication.SharedApplication); - }); - menu.AddItem (communityMenuItem); - - quitMenuItem = new NSMenuItem ("Quit", "q", delegate { - Quit (NSApplication.SharedApplication); - }); - menu.AddItem (quitMenuItem); - } - - private ILogger Logger{ get; set;} - - private void Quit(NSObject sender) - { - MainClass.AppHost.Shutdown(); - } - - private void Community(NSObject sender) - { - BrowserLauncher.OpenCommunity(MainClass.AppHost); - } - - private void Configure(NSObject sender) - { - BrowserLauncher.OpenDashboard(MainClass.AppHost); - } - - private void Browse(NSObject sender) - { - BrowserLauncher.OpenWebClient(MainClass.AppHost); - } - - public void Terminate() - { - NSApplication.SharedApplication.InvokeOnMainThread (() => NSApplication.SharedApplication.Terminate(NSApplication.SharedApplication)); - } - - private string _uiCulture; - /// <summary> - /// Handles the ConfigurationUpdated event of the Instance control. - /// </summary> - /// <param name="sender">The source of the event.</param> - /// <param name="e">The <see cref="EventArgs" /> instance containing the event data.</param> - void Instance_ConfigurationUpdated(object sender, EventArgs e) - { - var configManager = MainClass.AppHost.ServerConfigurationManager; - - if (!string.Equals(configManager.Configuration.UICulture, _uiCulture, - StringComparison.OrdinalIgnoreCase)) - { - LocalizeText(); - } - } - - private void LocalizeText() - { - var configManager = MainClass.AppHost.ServerConfigurationManager; - - _uiCulture = configManager.Configuration.UICulture; - - NSApplication.SharedApplication.BeginInvokeOnMainThread (LocalizeInternal); - } - - private void LocalizeInternal() { - - var localization = MainClass.AppHost.LocalizationManager; - - quitMenuItem.Title = localization.GetLocalizedString("LabelExit"); - communityMenuItem.Title = localization.GetLocalizedString("LabelVisitCommunity"); - browseMenuItem.Title = localization.GetLocalizedString("LabelBrowseLibrary"); - configureMenuItem.Title = localization.GetLocalizedString("LabelConfigureServer"); - } - } -} - diff --git a/MediaBrowser.Server.Mac/Native/MonoFileSystem.cs b/MediaBrowser.Server.Mac/Native/MonoFileSystem.cs deleted file mode 100644 index 1fd140fb9..000000000 --- a/MediaBrowser.Server.Mac/Native/MonoFileSystem.cs +++ /dev/null @@ -1,23 +0,0 @@ -using Emby.Server.Implementations.IO; -using MediaBrowser.Model.Logging; -using Mono.Unix.Native; -using MediaBrowser.Model.System; - -namespace Emby.Server.Mac.Native -{ - public class MonoFileSystem : ManagedFileSystem - { - public MonoFileSystem(ILogger logger, IEnvironmentInfo environmentInfo, string tempPath) - : base(logger, environmentInfo, tempPath) - { - } - - public override void SetExecutable(string path) - { - // Linux: File permission to 666, and user's execute bit - Logger.Info("Syscall.chmod {0} FilePermissions.DEFFILEMODE | FilePermissions.S_IRWXU | FilePermissions.S_IXGRP | FilePermissions.S_IXOTH", path); - - Syscall.chmod(path, FilePermissions.DEFFILEMODE | FilePermissions.S_IRWXU | FilePermissions.S_IXGRP | FilePermissions.S_IXOTH); - } - } -} diff --git a/MediaBrowser.Server.Mac/Native/PowerManagement.cs b/MediaBrowser.Server.Mac/Native/PowerManagement.cs deleted file mode 100644 index f3c97d658..000000000 --- a/MediaBrowser.Server.Mac/Native/PowerManagement.cs +++ /dev/null @@ -1,15 +0,0 @@ -using MediaBrowser.Model.System; - -namespace Emby.Server.Mac.Native -{ - public class PowerManagement : IPowerManagement - { - public void PreventSystemStandby() - { - } - - public void AllowSystemStandby() - { - } - } -} diff --git a/MediaBrowser.Server.Mac/Resources/MediaBrowser.Server.Mac/Images.xcassets/AppIcon.appiconset/Contents.json b/MediaBrowser.Server.Mac/Resources/MediaBrowser.Server.Mac/Images.xcassets/AppIcon.appiconset/Contents.json deleted file mode 100644 index 50ab7bd32..000000000 --- a/MediaBrowser.Server.Mac/Resources/MediaBrowser.Server.Mac/Images.xcassets/AppIcon.appiconset/Contents.json +++ /dev/null @@ -1,58 +0,0 @@ -{ - "images" : [ - { - "idiom" : "mac", - "scale" : "1x", - "size" : "16x16" - }, - { - "idiom" : "mac", - "scale" : "2x", - "size" : "16x16" - }, - { - "idiom" : "mac", - "scale" : "1x", - "size" : "32x32" - }, - { - "idiom" : "mac", - "scale" : "2x", - "size" : "32x32" - }, - { - "idiom" : "mac", - "scale" : "1x", - "size" : "128x128" - }, - { - "idiom" : "mac", - "scale" : "2x", - "size" : "128x128" - }, - { - "idiom" : "mac", - "scale" : "1x", - "size" : "256x256" - }, - { - "idiom" : "mac", - "scale" : "2x", - "size" : "256x256" - }, - { - "idiom" : "mac", - "scale" : "1x", - "size" : "512x512" - }, - { - "idiom" : "mac", - "scale" : "2x", - "size" : "512x512" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -}
\ No newline at end of file diff --git a/MediaBrowser.Server.Mac/Resources/appicon.icns b/MediaBrowser.Server.Mac/Resources/appicon.icns Binary files differdeleted file mode 100644 index 74fbdd5a3..000000000 --- a/MediaBrowser.Server.Mac/Resources/appicon.icns +++ /dev/null diff --git a/MediaBrowser.Server.Mac/packages.config b/MediaBrowser.Server.Mac/packages.config deleted file mode 100644 index f6a11cd3a..000000000 --- a/MediaBrowser.Server.Mac/packages.config +++ /dev/null @@ -1,5 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?>
-<packages>
- <package id="Mono.Posix" version="4.0.0.0" targetFramework="net45" />
- <package id="SkiaSharp" version="1.58.0" targetFramework="net462" />
-</packages>
\ No newline at end of file diff --git a/MediaBrowser.Server.Mac/readme.txt b/MediaBrowser.Server.Mac/readme.txt deleted file mode 100644 index e0833ebbb..000000000 --- a/MediaBrowser.Server.Mac/readme.txt +++ /dev/null @@ -1,13 +0,0 @@ -Instructions for deploying a new build: - -1. Download source code - -2. In resources folder, remove dashboard-ui, then re-add from the WebDashboard project, making sure to link the files, rather than copy. This will pick up any web client changes since the last deployment. - -3. Repeat the process for swagger-ui, if ServiceStack has been updated since the last release. If in doubt, just do it. - -4. Commit and push the changes to the Mac project - -5. Build the installer - -6. Proceed as normal and tag the builds in github
\ No newline at end of file diff --git a/MediaBrowser.Server.Mac/statusicon.png b/MediaBrowser.Server.Mac/statusicon.png Binary files differdeleted file mode 100644 index 8f1269505..000000000 --- a/MediaBrowser.Server.Mac/statusicon.png +++ /dev/null diff --git a/MediaBrowser.Server.Mono/MonoAppHost.cs b/MediaBrowser.Server.Mono/MonoAppHost.cs index c94334e89..609497eed 100644 --- a/MediaBrowser.Server.Mono/MonoAppHost.cs +++ b/MediaBrowser.Server.Mono/MonoAppHost.cs @@ -25,7 +25,7 @@ namespace MediaBrowser.Server.Mono get { // A restart script must be provided - return StartupOptions.ContainsOption("-restartpath") && StartupOptions.ContainsOption("-ffmpeg"); + return StartupOptions.ContainsOption("-restartpath"); } } diff --git a/MediaBrowser.WebDashboard/Api/PackageCreator.cs b/MediaBrowser.WebDashboard/Api/PackageCreator.cs index c855a8d9b..f55d95a2e 100644 --- a/MediaBrowser.WebDashboard/Api/PackageCreator.cs +++ b/MediaBrowser.WebDashboard/Api/PackageCreator.cs @@ -152,7 +152,7 @@ namespace MediaBrowser.WebDashboard.Api } } - html = html.Replace("<head>", "<head>" + GetMetaTags(mode) + GetCommonCss(mode, appVersion)); + html = html.Replace("<head>", "<head>" + GetMetaTags(mode)); // Disable embedded scripts from plugins. We'll run them later once resources have loaded if (html.IndexOf("<script", StringComparison.OrdinalIgnoreCase) != -1) @@ -230,26 +230,6 @@ namespace MediaBrowser.WebDashboard.Api } /// <summary> - /// Gets the common CSS. - /// </summary> - /// <param name="mode">The mode.</param> - /// <param name="version">The version.</param> - /// <returns>System.String.</returns> - private string GetCommonCss(string mode, string version) - { - var versionString = string.IsNullOrWhiteSpace(mode) ? "?v=" + version : string.Empty; - - var files = new[] - { - "css/site.css" + versionString - }; - - var tags = files.Select(s => string.Format("<link rel=\"stylesheet\" href=\"{0}\" async />", s)).ToArray(); - - return string.Join(string.Empty, tags); - } - - /// <summary> /// Gets the common javascript. /// </summary> /// <param name="mode">The mode.</param> @@ -265,7 +245,7 @@ namespace MediaBrowser.WebDashboard.Api builder.AppendFormat("window.appMode='{0}';", mode); } - if (string.IsNullOrWhiteSpace(mode)) + else { builder.AppendFormat("window.dashboardVersion='{0}';", version); } diff --git a/MediaBrowser.XbmcMetadata/EntryPoint.cs b/MediaBrowser.XbmcMetadata/EntryPoint.cs index 98460f767..9cc17481c 100644 --- a/MediaBrowser.XbmcMetadata/EntryPoint.cs +++ b/MediaBrowser.XbmcMetadata/EntryPoint.cs @@ -52,7 +52,7 @@ namespace MediaBrowser.XbmcMetadata var items = _libraryManager.GetItemList(new InternalItemsQuery { - PersonIds = new [] { person.Id.ToString("N") }, + PersonIds = new[] { person.Id.ToString("N") }, DtoOptions = new DtoOptions(true) }); @@ -84,7 +84,7 @@ namespace MediaBrowser.XbmcMetadata GC.SuppressFinalize(this); } - private async void SaveMetadataForItem(BaseItem item, ItemUpdateType updateReason) + private void SaveMetadataForItem(BaseItem item, ItemUpdateType updateReason) { var locationType = item.LocationType; if (locationType == LocationType.Remote || @@ -105,7 +105,7 @@ namespace MediaBrowser.XbmcMetadata try { - await _providerManager.SaveMetadata(item, updateReason, new[] { BaseNfoSaver.SaverName }).ConfigureAwait(false); + _providerManager.SaveMetadata(item, updateReason, new[] { BaseNfoSaver.SaverName }); } catch (Exception ex) { diff --git a/Mono.Nat/ISearcher.cs b/Mono.Nat/ISearcher.cs index 56e438105..51042bf27 100644 --- a/Mono.Nat/ISearcher.cs +++ b/Mono.Nat/ISearcher.cs @@ -33,6 +33,7 @@ using System.Collections.Generic; using System.Text; using System.Net.Sockets; using System.Net; +using System.Threading.Tasks; namespace Mono.Nat { diff --git a/Mono.Nat/Mono.Nat.csproj b/Mono.Nat/Mono.Nat.csproj index abf10f513..426824f0d 100644 --- a/Mono.Nat/Mono.Nat.csproj +++ b/Mono.Nat/Mono.Nat.csproj @@ -67,7 +67,6 @@ <Compile Include="Upnp\Messages\Responses\CreatePortMappingResponseMessage.cs" /> <Compile Include="Upnp\Messages\UpnpMessage.cs" /> <Compile Include="Upnp\Searchers\UpnpSearcher.cs" /> - <Compile Include="Upnp\Upnp.cs" /> <Compile Include="Upnp\UpnpNatDevice.cs" /> </ItemGroup> <ItemGroup> diff --git a/Mono.Nat/NatUtility.cs b/Mono.Nat/NatUtility.cs index b9efd9bbd..bf703e399 100644 --- a/Mono.Nat/NatUtility.cs +++ b/Mono.Nat/NatUtility.cs @@ -208,14 +208,14 @@ namespace Mono.Nat } } - public static void Handle(IPAddress localAddress, UpnpDeviceInfo deviceInfo, IPEndPoint endpoint, NatProtocol protocol) + public static async Task Handle(IPAddress localAddress, UpnpDeviceInfo deviceInfo, IPEndPoint endpoint, NatProtocol protocol) { switch (protocol) { case NatProtocol.Upnp: var searcher = new UpnpSearcher(Logger, HttpClient); searcher.DeviceFound += Searcher_DeviceFound; - searcher.Handle(localAddress, deviceInfo, endpoint); + await searcher.Handle(localAddress, deviceInfo, endpoint).ConfigureAwait(false); break; default: throw new ArgumentException("Unexpected protocol: " + protocol); diff --git a/Mono.Nat/Pmp/Searchers/PmpSearcher.cs b/Mono.Nat/Pmp/Searchers/PmpSearcher.cs index def50fb72..2836071d0 100644 --- a/Mono.Nat/Pmp/Searchers/PmpSearcher.cs +++ b/Mono.Nat/Pmp/Searchers/PmpSearcher.cs @@ -42,13 +42,13 @@ namespace Mono.Nat { internal class PmpSearcher : ISearcher { - static PmpSearcher instance = new PmpSearcher(); - - - public static PmpSearcher Instance - { - get { return instance; } - } + static PmpSearcher instance = new PmpSearcher(); + + + public static PmpSearcher Instance + { + get { return instance; } + } private int timeout; private DateTime nextSearch; @@ -143,21 +143,21 @@ namespace Mono.Nat } public async void Search() - { - foreach (UdpClient s in sockets) - { - try - { - await Search(s).ConfigureAwait(false); - } - catch - { - // Ignore any search errors - } - } - } - - async Task Search (UdpClient client) + { + foreach (UdpClient s in sockets) + { + try + { + await Search(s).ConfigureAwait(false); + } + catch + { + // Ignore any search errors + } + } + } + + async Task Search(UdpClient client) { // Sort out the time for the next search first. The spec says the // timeout should double after each attempt. Once it reaches 64 seconds @@ -175,10 +175,10 @@ namespace Mono.Nat // The nat-pmp search message. Must be sent to GatewayIP:53531 byte[] buffer = new byte[] { PmpConstants.Version, PmpConstants.OperationCode }; - foreach (IPEndPoint gatewayEndpoint in gatewayLists[client]) - { - await client.SendAsync(buffer, buffer.Length, gatewayEndpoint).ConfigureAwait(false); - } + foreach (IPEndPoint gatewayEndpoint in gatewayLists[client]) + { + await client.SendAsync(buffer, buffer.Length, gatewayEndpoint).ConfigureAwait(false); + } } bool IsSearchAddress(IPAddress address) diff --git a/Mono.Nat/Upnp/Messages/GetServicesMessage.cs b/Mono.Nat/Upnp/Messages/GetServicesMessage.cs index 9d29f98fd..3395b7596 100644 --- a/Mono.Nat/Upnp/Messages/GetServicesMessage.cs +++ b/Mono.Nat/Upnp/Messages/GetServicesMessage.cs @@ -64,6 +64,10 @@ namespace Mono.Nat.Upnp { var req = new HttpRequestOptions(); + // The periodic request logging may keep some devices awake + req.LogRequestAsDebug = true; + req.LogErrors = false; + req.Url = "http://" + this.hostAddress.ToString() + this.servicesDescriptionUrl; req.RequestHeaders.Add("ACCEPT-LANGUAGE", "en"); diff --git a/Mono.Nat/Upnp/Messages/UpnpMessage.cs b/Mono.Nat/Upnp/Messages/UpnpMessage.cs index 54cca4494..b0264fc4a 100644 --- a/Mono.Nat/Upnp/Messages/UpnpMessage.cs +++ b/Mono.Nat/Upnp/Messages/UpnpMessage.cs @@ -51,9 +51,15 @@ namespace Mono.Nat.Upnp NatUtility.Log("Initiating request to: {0}", ss); var req = new HttpRequestOptions(); + req.LogErrors = false; + + // The periodic request logging may keep some devices awake + req.LogRequestAsDebug = true; + req.Url = ss; req.EnableKeepAlive = false; - req.RequestContentType = "text/xml; charset=\"utf-8\""; + req.RequestContentType = "text/xml"; + req.AppendCharsetToMimeType = true; req.RequestHeaders.Add("SOAPACTION", "\"" + device.ServiceType + "#" + upnpMethod + "\""); string bodyString = "<s:Envelope " diff --git a/Mono.Nat/Upnp/Searchers/UpnpSearcher.cs b/Mono.Nat/Upnp/Searchers/UpnpSearcher.cs index 5e36410c5..d9b16dd81 100644 --- a/Mono.Nat/Upnp/Searchers/UpnpSearcher.cs +++ b/Mono.Nat/Upnp/Searchers/UpnpSearcher.cs @@ -39,6 +39,7 @@ using System.Net.NetworkInformation; using MediaBrowser.Common.Net; using MediaBrowser.Model.Logging; using MediaBrowser.Model.Dlna; +using System.Threading.Tasks; namespace Mono.Nat { @@ -61,7 +62,7 @@ namespace Mono.Nat { } - public void Handle(IPAddress localAddress, UpnpDeviceInfo deviceInfo, IPEndPoint endpoint) + public async Task Handle(IPAddress localAddress, UpnpDeviceInfo deviceInfo, IPEndPoint endpoint) { // No matter what, this method should never throw an exception. If something goes wrong // we should still be in a position to handle the next reply correctly. @@ -82,6 +83,8 @@ namespace Mono.Nat UpnpNatDevice d = new UpnpNatDevice(localAddress, deviceInfo, endpoint, string.Empty, _logger, _httpClient); NatUtility.Log("Fetching service list: {0}", d.HostEndPoint); + await d.GetServicesList().ConfigureAwait(false); + OnDeviceFound(new DeviceEventArgs(d)); } catch (Exception ex) diff --git a/Mono.Nat/Upnp/Upnp.cs b/Mono.Nat/Upnp/Upnp.cs deleted file mode 100644 index e9321f874..000000000 --- a/Mono.Nat/Upnp/Upnp.cs +++ /dev/null @@ -1,95 +0,0 @@ -// -// Authors: -// Alan McGovern alan.mcgovern@gmail.com -// Ben Motmans <ben.motmans@gmail.com> -// Nicholas Terry <nick.i.terry@gmail.com> -// -// Copyright (C) 2006 Alan McGovern -// Copyright (C) 2007 Ben Motmans -// Copyright (C) 2014 Nicholas Terry -// -// Permission is hereby granted, free of charge, to any person obtaining -// a copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to -// permit persons to whom the Software is furnished to do so, subject to -// the following conditions: -// -// The above copyright notice and this permission notice shall be -// included in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -// - -using System; -using System.Collections.Generic; -using System.Net; -using System.Text; -using System.Threading.Tasks; -using MediaBrowser.Common.Net; -using MediaBrowser.Model.Logging; - -namespace Mono.Nat.Upnp -{ - internal class Upnp - { - protected readonly ILogger Logger; - protected readonly IHttpClient HttpClient; - - public Upnp(ILogger logger, IHttpClient httpClient) - { - Logger = logger; - HttpClient = httpClient; - } - - public virtual Task<UpnpNatDevice> Handle(IPAddress localAddress, byte[] response, IPEndPoint endpoint) - { - // Convert it to a string for easy parsing - string dataString = null; - - - string urn; - dataString = Encoding.UTF8.GetString(response); - - if (NatUtility.Verbose) - NatUtility.Log("UPnP Response: {0}", dataString); - - /* For UPnP Port Mapping we need ot find either WANPPPConnection or WANIPConnection. - Any other device type is no good to us for this purpose. See the IGP overview paper - page 5 for an overview of device types and their hierarchy. - http://upnp.org/specs/gw/UPnP-gw-InternetGatewayDevice-v1-Device.pdf */ - - /* TODO: Currently we are assuming version 1 of the protocol. We should figure out which - version it is and apply the correct URN. */ - - /* Some routers don't correctly implement the version ID on the URN, so we only search for the type - prefix. */ - - string log = "UPnP Response: Router advertised a '{0}' service"; - StringComparison c = StringComparison.OrdinalIgnoreCase; - if (dataString.IndexOf("urn:schemas-upnp-org:service:WANIPConnection:", c) != -1) - { - urn = "urn:schemas-upnp-org:service:WANIPConnection:1"; - NatUtility.Log(log, "urn:schemas-upnp-org:service:WANIPConnection:1"); - } - else if (dataString.IndexOf("urn:schemas-upnp-org:service:WANPPPConnection:", c) != -1) - { - urn = "urn:schemas-upnp-org:service:WANPPPConnection:1"; - NatUtility.Log(log, "urn:schemas-upnp-org:service:WANPPPConnection:"); - } - else - throw new NotSupportedException("Received non-supported device type"); - - // We have an internet gateway device now - var device = new UpnpNatDevice(localAddress, dataString, urn, Logger, HttpClient); - return Task.FromResult(device); - } - } -} diff --git a/Mono.Nat/Upnp/UpnpNatDevice.cs b/Mono.Nat/Upnp/UpnpNatDevice.cs index ebb1426d1..fda990fa8 100644 --- a/Mono.Nat/Upnp/UpnpNatDevice.cs +++ b/Mono.Nat/Upnp/UpnpNatDevice.cs @@ -90,52 +90,101 @@ namespace Mono.Nat.Upnp } } - internal UpnpNatDevice(IPAddress localAddress, string deviceDetails, string serviceType, ILogger logger, IHttpClient httpClient) + public async Task GetServicesList() { - _logger = logger; - _httpClient = httpClient; - this.LastSeen = DateTime.Now; - this.localAddress = localAddress; + // Create a HTTPWebRequest to download the list of services the device offers + var message = new GetServicesMessage(this.serviceDescriptionUrl, this.hostEndPoint, _logger); - // Split the string at the "location" section so i can extract the ipaddress and service description url - string locationDetails = deviceDetails.Substring(deviceDetails.IndexOf("Location", StringComparison.OrdinalIgnoreCase) + 9).Split('\r')[0]; - this.serviceType = serviceType; - - // Make sure we have no excess whitespace - locationDetails = locationDetails.Trim(); - - // FIXME: Is this reliable enough. What if we get a hostname as opposed to a proper http address - // Are we going to get addresses with the "http://" attached? - if (locationDetails.StartsWith("http://", StringComparison.OrdinalIgnoreCase)) + using (var response = await _httpClient.SendAsync(message.Encode(), message.Method).ConfigureAwait(false)) { - NatUtility.Log("Found device at: {0}", locationDetails); - // This bit strings out the "http://" from the string - locationDetails = locationDetails.Substring(7); + OnServicesReceived(response); + } + } - // We then split off the end of the string to get something like: 192.168.0.3:241 in our string - string hostAddressAndPort = locationDetails.Remove(locationDetails.IndexOf('/')); + private void OnServicesReceived(HttpResponseInfo response) + { + int abortCount = 0; + int bytesRead = 0; + byte[] buffer = new byte[10240]; + StringBuilder servicesXml = new StringBuilder(); + XmlDocument xmldoc = new XmlDocument(); - // From this we parse out the IP address and Port - if (hostAddressAndPort.IndexOf(':') > 0) + using (var s = response.Content) + { + if (response.StatusCode != HttpStatusCode.OK) { - this.hostEndPoint = new IPEndPoint(IPAddress.Parse(hostAddressAndPort.Remove(hostAddressAndPort.IndexOf(':'))), - Convert.ToUInt16(hostAddressAndPort.Substring(hostAddressAndPort.IndexOf(':') + 1), System.Globalization.CultureInfo.InvariantCulture)); + NatUtility.Log("{0}: Couldn't get services list: {1}", HostEndPoint, response.StatusCode); + return; // FIXME: This the best thing to do?? } - else + + while (true) { - // there is no port specified, use default port (80) - this.hostEndPoint = new IPEndPoint(IPAddress.Parse(hostAddressAndPort), 80); + bytesRead = s.Read(buffer, 0, buffer.Length); + servicesXml.Append(Encoding.UTF8.GetString(buffer, 0, bytesRead)); + try + { + xmldoc.LoadXml(servicesXml.ToString()); + break; + } + catch (XmlException) + { + // If we can't receive the entire XML within 500ms, then drop the connection + // Unfortunately not all routers supply a valid ContentLength (mine doesn't) + // so this hack is needed to keep testing our recieved data until it gets successfully + // parsed by the xmldoc. Without this, the code will never pick up my router. + if (abortCount++ > 50) + { + return; + } + NatUtility.Log("{0}: Couldn't parse services list", HostEndPoint); + System.Threading.Thread.Sleep(10); + } } - NatUtility.Log("Parsed device as: {0}", this.hostEndPoint.ToString()); + NatUtility.Log("{0}: Parsed services list", HostEndPoint); + XmlNamespaceManager ns = new XmlNamespaceManager(xmldoc.NameTable); + ns.AddNamespace("ns", "urn:schemas-upnp-org:device-1-0"); + XmlNodeList nodes = xmldoc.SelectNodes("//*/ns:serviceList", ns); - // The service description URL is the remainder of the "locationDetails" string. The bit that was originally after the ip - // and port information - this.serviceDescriptionUrl = locationDetails.Substring(locationDetails.IndexOf('/')); - } - else - { - logger.Warn("Couldn't decode address: " + deviceDetails); + foreach (XmlNode node in nodes) + { + //Go through each service there + foreach (XmlNode service in node.ChildNodes) + { + //If the service is a WANIPConnection, then we have what we want + string type = service["serviceType"].InnerText; + NatUtility.Log("{0}: Found service: {1}", HostEndPoint, type); + StringComparison c = StringComparison.OrdinalIgnoreCase; + // TODO: Add support for version 2 of UPnP. + if (type.Equals("urn:schemas-upnp-org:service:WANPPPConnection:1", c) || + type.Equals("urn:schemas-upnp-org:service:WANIPConnection:1", c)) + { + this.controlUrl = service["controlURL"].InnerText; + NatUtility.Log("{0}: Found upnp service at: {1}", HostEndPoint, controlUrl); + try + { + Uri u = new Uri(controlUrl); + if (u.IsAbsoluteUri) + { + EndPoint old = hostEndPoint; + this.hostEndPoint = new IPEndPoint(IPAddress.Parse(u.Host), u.Port); + NatUtility.Log("{0}: Absolute URI detected. Host address is now: {1}", old, HostEndPoint); + this.controlUrl = controlUrl.Substring(u.GetLeftPart(UriPartial.Authority).Length); + NatUtility.Log("{0}: New control url: {1}", HostEndPoint, controlUrl); + } + } + catch + { + NatUtility.Log("{0}: Assuming control Uri is relative: {1}", HostEndPoint, controlUrl); + } + NatUtility.Log("{0}: Handshake Complete", HostEndPoint); + return; + } + } + } + + //If we get here, it means that we didn't get WANIPConnection service, which means no uPnP forwarding + //So we don't invoke the callback, so this device is never added to our lists } } @@ -171,10 +220,13 @@ namespace Mono.Nat.Upnp get { return serviceType; } } - public override Task CreatePortMap(Mapping mapping) + public override async Task CreatePortMap(Mapping mapping) { CreatePortMappingMessage message = new CreatePortMappingMessage(mapping, localAddress, this); - return _httpClient.SendAsync(message.Encode(), message.Method); + using (await _httpClient.SendAsync(message.Encode(), message.Method).ConfigureAwait(false)) + { + + } } public override bool Equals(object obj) diff --git a/SharedVersion.cs b/SharedVersion.cs index ff7ab5136..7e6965cbc 100644 --- a/SharedVersion.cs +++ b/SharedVersion.cs @@ -1,3 +1,3 @@ using System.Reflection; -[assembly: AssemblyVersion("3.2.33.0")] +[assembly: AssemblyVersion("3.2.33.20")] diff --git a/SocketHttpListener/Net/EndPointListener.cs b/SocketHttpListener/Net/EndPointListener.cs index 2b1479e42..48c0ae7cb 100644 --- a/SocketHttpListener/Net/EndPointListener.cs +++ b/SocketHttpListener/Net/EndPointListener.cs @@ -93,6 +93,15 @@ namespace SocketHttpListener.Net } } + try + { + sock.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); + } + catch (SocketException) + { + // This is not supported on all operating systems (qnap) + } + sock.Bind(endpoint); // This is the number TcpListener uses. diff --git a/SocketHttpListener/Net/HttpConnection.cs b/SocketHttpListener/Net/HttpConnection.cs index 4e8158964..05576ea1e 100644 --- a/SocketHttpListener/Net/HttpConnection.cs +++ b/SocketHttpListener/Net/HttpConnection.cs @@ -528,7 +528,13 @@ namespace SocketHttpListener.Net finally { if (s != null) - s.Close(); + { + try + { + s.Close(); + } + catch { } + } } Unbind(); RemoveConnection(); |
