diff options
| author | Luke <luke.pulverenti@gmail.com> | 2015-07-10 22:30:36 -0400 |
|---|---|---|
| committer | Luke <luke.pulverenti@gmail.com> | 2015-07-10 22:30:36 -0400 |
| commit | 63f9abd4d65b7b7fd43f7ec7faf510075285ed69 (patch) | |
| tree | 9cba4db7741db461cd7995d39d30d70483f7ae6d | |
| parent | ffe60d453d2610db290bff0a3319dbe7c0ceba04 (diff) | |
| parent | fe7fd7cd266be0fe8c0cc2be095cc0b267931ea9 (diff) | |
Merge pull request #1127 from MediaBrowser/dev
3.0.5641.5
265 files changed, 4525 insertions, 2229 deletions
diff --git a/MediaBrowser.Api/BaseApiService.cs b/MediaBrowser.Api/BaseApiService.cs index d4b5be584..7a14ace77 100644 --- a/MediaBrowser.Api/BaseApiService.cs +++ b/MediaBrowser.Api/BaseApiService.cs @@ -1,5 +1,4 @@ -using System.Threading.Tasks; -using MediaBrowser.Controller.Dto; +using MediaBrowser.Controller.Dto; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities.Audio; using MediaBrowser.Controller.Library; @@ -12,6 +11,7 @@ using ServiceStack.Web; using System; using System.Collections.Generic; using System.Linq; +using System.Threading.Tasks; namespace MediaBrowser.Api { @@ -344,11 +344,7 @@ namespace MediaBrowser.Api return name; } - return libraryManager.RootFolder - .GetRecursiveChildren() - .SelectMany(i => i.People) - .Select(i => i.Name) - .DistinctNames() + return libraryManager.GetPeopleNames(new InternalPeopleQuery()) .FirstOrDefault(i => { i = _dashReplaceChars.Aggregate(i, (current, c) => current.Replace(c, SlugChar)); @@ -364,7 +360,8 @@ namespace MediaBrowser.Api var first = pathInfo.GetArgumentValue<string>(0); // backwards compatibility - if (string.Equals(first, "mediabrowser", StringComparison.OrdinalIgnoreCase)) + if (string.Equals(first, "mediabrowser", StringComparison.OrdinalIgnoreCase) || + string.Equals(first, "emby", StringComparison.OrdinalIgnoreCase)) { index++; } diff --git a/MediaBrowser.Api/ItemUpdateService.cs b/MediaBrowser.Api/ItemUpdateService.cs index 8f7edabbb..b8ae9392a 100644 --- a/MediaBrowser.Api/ItemUpdateService.cs +++ b/MediaBrowser.Api/ItemUpdateService.cs @@ -218,6 +218,11 @@ namespace MediaBrowser.Api await item.UpdateToRepository(ItemUpdateType.MetadataEdit, CancellationToken.None).ConfigureAwait(false); + if (request.People != null) + { + await _libraryManager.UpdatePeople(item, request.People.Select(x => new PersonInfo { Name = x.Name, Role = x.Role, Type = x.Type }).ToList()); + } + if (isLockedChanged && item.IsFolder) { var folder = (Folder)item; @@ -303,11 +308,6 @@ namespace MediaBrowser.Api item.Studios = request.Studios.Select(x => x.Name).ToList(); } - if (request.People != null) - { - item.People = request.People.Select(x => new PersonInfo { Name = x.Name, Role = x.Role, Type = x.Type }).ToList(); - } - if (request.DateCreated.HasValue) { item.DateCreated = NormalizeDateTime(request.DateCreated.Value); diff --git a/MediaBrowser.Api/MediaBrowser.Api.csproj b/MediaBrowser.Api/MediaBrowser.Api.csproj index 0dfd812c3..e79163d80 100644 --- a/MediaBrowser.Api/MediaBrowser.Api.csproj +++ b/MediaBrowser.Api/MediaBrowser.Api.csproj @@ -106,6 +106,7 @@ <Compile Include="Reports\Stat\ReportStatGroup.cs" /> <Compile Include="Reports\Stat\ReportStatItem.cs" /> <Compile Include="Reports\Stat\ReportStatResult.cs" /> + <Compile Include="Social\SharingService.cs" /> <Compile Include="StartupWizardService.cs" /> <Compile Include="Subtitles\SubtitleService.cs" /> <Compile Include="Movies\CollectionService.cs" /> diff --git a/MediaBrowser.Api/Movies/MoviesService.cs b/MediaBrowser.Api/Movies/MoviesService.cs index 513bde871..97e9aa9c8 100644 --- a/MediaBrowser.Api/Movies/MoviesService.cs +++ b/MediaBrowser.Api/Movies/MoviesService.cs @@ -165,7 +165,7 @@ namespace MediaBrowser.Api.Movies return ToOptimizedResult(result); } - private async Task<ItemsResult> GetSimilarItemsResult(BaseGetSimilarItemsFromItem request, Func<BaseItem, bool> includeInSearch, Func<BaseItem, BaseItem, int> getSimilarityScore) + private async Task<ItemsResult> GetSimilarItemsResult(BaseGetSimilarItemsFromItem request, Func<BaseItem, bool> includeInSearch, Func<BaseItem, List<PersonInfo>, List<PersonInfo>, BaseItem, int> getSimilarityScore) { var user = !string.IsNullOrWhiteSpace(request.UserId) ? _userManager.GetUserById(request.UserId) : null; @@ -214,7 +214,7 @@ namespace MediaBrowser.Api.Movies } } - var items = SimilarItemsHelper.GetSimilaritems(item, list, getSimilarityScore).ToList(); + var items = SimilarItemsHelper.GetSimilaritems(item, _libraryManager, list, getSimilarityScore).ToList(); IEnumerable<BaseItem> returnItems = items; @@ -339,7 +339,7 @@ namespace MediaBrowser.Api.Movies foreach (var director in directors) { var items = allMovies - .Where(i => i.People.Any(p => string.Equals(p.Type, PersonType.Director, StringComparison.OrdinalIgnoreCase) && string.Equals(p.Name, director, StringComparison.OrdinalIgnoreCase))) + .Where(i => _libraryManager.GetPeople(i).Any(p => string.Equals(p.Type, PersonType.Director, StringComparison.OrdinalIgnoreCase) && string.Equals(p.Name, director, StringComparison.OrdinalIgnoreCase))) .Take(itemLimit) .ToList(); @@ -358,12 +358,15 @@ namespace MediaBrowser.Api.Movies private IEnumerable<RecommendationDto> GetWithActor(User user, List<BaseItem> allMovies, IEnumerable<string> names, int itemLimit, DtoOptions dtoOptions, RecommendationType type) { - var userId = user.Id; - foreach (var name in names) { + var itemsWithActor = _libraryManager.GetItemIds(new InternalItemsQuery + { + Person = name + }); + var items = allMovies - .Where(i => i.People.Any(p => string.Equals(p.Name, name, StringComparison.OrdinalIgnoreCase))) + .Where(i => itemsWithActor.Contains(i.Id)) .Take(itemLimit) .ToList(); @@ -382,12 +385,10 @@ namespace MediaBrowser.Api.Movies private IEnumerable<RecommendationDto> GetSimilarTo(User user, List<BaseItem> allMovies, IEnumerable<BaseItem> baselineItems, int itemLimit, DtoOptions dtoOptions, RecommendationType type) { - var userId = user.Id; - foreach (var item in baselineItems) { var similar = SimilarItemsHelper - .GetSimilaritems(item, allMovies, SimilarItemsHelper.GetSimiliarityScore) + .GetSimilaritems(item, _libraryManager, allMovies, SimilarItemsHelper.GetSimiliarityScore) .Take(itemLimit) .ToList(); @@ -406,18 +407,37 @@ namespace MediaBrowser.Api.Movies private IEnumerable<string> GetActors(IEnumerable<BaseItem> items) { - // Get the two leading actors for all movies - return items - .SelectMany(i => i.People.Where(p => !string.Equals(PersonType.Director, p.Type, StringComparison.OrdinalIgnoreCase)).Take(2)) + var people = _libraryManager.GetPeople(new InternalPeopleQuery + { + ExcludePersonTypes = new List<string> + { + PersonType.Director + }, + MaxListOrder = 3 + }); + + var itemIds = items.Select(i => i.Id).ToList(); + + return people + .Where(i => itemIds.Contains(i.ItemId)) .Select(i => i.Name) .DistinctNames(); } private IEnumerable<string> GetDirectors(IEnumerable<BaseItem> items) { - return items - .Select(i => i.People.FirstOrDefault(p => string.Equals(PersonType.Director, p.Type, StringComparison.OrdinalIgnoreCase))) - .Where(i => i != null) + var people = _libraryManager.GetPeople(new InternalPeopleQuery + { + PersonTypes = new List<string> + { + PersonType.Director + } + }); + + var itemIds = items.Select(i => i.Id).ToList(); + + return people + .Where(i => itemIds.Contains(i.ItemId)) .Select(i => i.Name) .DistinctNames(); } diff --git a/MediaBrowser.Api/Music/AlbumsService.cs b/MediaBrowser.Api/Music/AlbumsService.cs index 37f79bf20..ea87c3ad3 100644 --- a/MediaBrowser.Api/Music/AlbumsService.cs +++ b/MediaBrowser.Api/Music/AlbumsService.cs @@ -6,6 +6,7 @@ using MediaBrowser.Controller.Net; using MediaBrowser.Controller.Persistence; using ServiceStack; using System; +using System.Collections.Generic; using System.Linq; namespace MediaBrowser.Api.Music @@ -68,11 +69,13 @@ namespace MediaBrowser.Api.Music /// Gets the album similarity score. /// </summary> /// <param name="item1">The item1.</param> + /// <param name="item1People">The item1 people.</param> + /// <param name="allPeople">All people.</param> /// <param name="item2">The item2.</param> /// <returns>System.Int32.</returns> - private int GetAlbumSimilarityScore(BaseItem item1, BaseItem item2) + private int GetAlbumSimilarityScore(BaseItem item1, List<PersonInfo> item1People, List<PersonInfo> allPeople, BaseItem item2) { - var points = SimilarItemsHelper.GetSimiliarityScore(item1, item2); + var points = SimilarItemsHelper.GetSimiliarityScore(item1, item1People, allPeople, item2); var album1 = (MusicAlbum)item1; var album2 = (MusicAlbum)item2; diff --git a/MediaBrowser.Api/Playback/BaseStreamingService.cs b/MediaBrowser.Api/Playback/BaseStreamingService.cs index 41d785a34..dc5858e86 100644 --- a/MediaBrowser.Api/Playback/BaseStreamingService.cs +++ b/MediaBrowser.Api/Playback/BaseStreamingService.cs @@ -632,7 +632,7 @@ namespace MediaBrowser.Api.Playback { var maxHeightParam = request.MaxHeight.Value.ToString(UsCulture); - filters.Add(string.Format("scale=trunc(oh*a*2)/2:min(ih\\,{0})", maxHeightParam)); + filters.Add(string.Format("scale=trunc(oh*a/2)*2:min(ih\\,{0})", maxHeightParam)); } if (string.Equals(outputVideoCodec, "h264_qsv", StringComparison.OrdinalIgnoreCase)) diff --git a/MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs b/MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs index ab57e561f..0a432a580 100644 --- a/MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs +++ b/MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs @@ -313,16 +313,17 @@ namespace MediaBrowser.Api.Playback.Hls { var segmentPath = GetSegmentPath(state, playlist, i); - double length; - if (SegmentLengths.TryGetValue(Path.GetFileName(segmentPath), out length)) - { - Logger.Debug("Found segment length of {0} for index {1}", length, i); - startSeconds += length; - } - else - { - startSeconds += state.SegmentLength; - } + //double length; + //if (SegmentLengths.TryGetValue(Path.GetFileName(segmentPath), out length)) + //{ + // Logger.Debug("Found segment length of {0} for index {1}", length, i); + // startSeconds += length; + //} + //else + //{ + // startSeconds += state.SegmentLength; + //} + startSeconds += state.SegmentLength; } var position = TimeSpan.FromSeconds(startSeconds).Ticks; @@ -441,7 +442,7 @@ namespace MediaBrowser.Api.Playback.Hls CancellationToken cancellationToken) { // If all transcoding has completed, just return immediately - if (transcodingJob != null && transcodingJob.HasExited) + if (transcodingJob != null && transcodingJob.HasExited && File.Exists(segmentPath)) { return GetSegmentResult(segmentPath, segmentIndex, segmentLength, transcodingJob); } @@ -463,7 +464,11 @@ namespace MediaBrowser.Api.Playback.Hls // If it appears in the playlist, it's done if (text.IndexOf(segmentFilename, StringComparison.OrdinalIgnoreCase) != -1) { - return GetSegmentResult(segmentPath, segmentIndex, segmentLength, transcodingJob); + if (File.Exists(segmentPath)) + { + return GetSegmentResult(segmentPath, segmentIndex, segmentLength, transcodingJob); + } + break; } } } @@ -564,11 +569,11 @@ namespace MediaBrowser.Api.Playback.Hls builder.AppendLine("#EXTM3U"); + var isLiveStream = (state.RunTimeTicks ?? 0) == 0; + var queryStringIndex = Request.RawUrl.IndexOf('?'); var queryString = queryStringIndex == -1 ? string.Empty : Request.RawUrl.Substring(queryStringIndex); - var isLiveStream = (state.RunTimeTicks ?? 0) == 0; - // Main stream var playlistUrl = isLiveStream ? "live.m3u8" : "main.m3u8"; playlistUrl += queryString; @@ -798,7 +803,7 @@ namespace MediaBrowser.Api.Playback.Hls var audioTranscodeParams = new List<string>(); audioTranscodeParams.Add("-acodec " + codec); - + if (state.OutputAudioBitrate.HasValue) { audioTranscodeParams.Add("-ab " + state.OutputAudioBitrate.Value.ToString(UsCulture)); diff --git a/MediaBrowser.Api/Reports/ReportsService.cs b/MediaBrowser.Api/Reports/ReportsService.cs index 4438876f7..ebf5183c5 100644 --- a/MediaBrowser.Api/Reports/ReportsService.cs +++ b/MediaBrowser.Api/Reports/ReportsService.cs @@ -779,7 +779,7 @@ namespace MediaBrowser.Api.Reports .Select(p => p == null ? "-1" : p.Name) .ToList(); - if (!(names.Any(v => i.People.Select(p => p.Name).Contains(v, StringComparer.OrdinalIgnoreCase)))) + if (!(names.Any(v => _libraryManager.GetPeople(i).Select(p => p.Name).Contains(v, StringComparer.OrdinalIgnoreCase)))) { return false; } @@ -792,7 +792,7 @@ namespace MediaBrowser.Api.Reports if (personTypes.Length == 0) { - if (!(i.People.Any(p => string.Equals(p.Name, request.Person, StringComparison.OrdinalIgnoreCase)))) + if (!(_libraryManager.GetPeople(i).Any(p => string.Equals(p.Name, request.Person, StringComparison.OrdinalIgnoreCase)))) { return false; } @@ -802,8 +802,7 @@ namespace MediaBrowser.Api.Reports var types = personTypes; var ok = new[] { i }.Any(item => - item.People != null && - item.People.Any(p => + _libraryManager.GetPeople(i).Any(p => p.Name.Equals(request.Person, StringComparison.OrdinalIgnoreCase) && (types.Contains(p.Type, StringComparer.OrdinalIgnoreCase) || types.Contains(p.Role, StringComparer.OrdinalIgnoreCase)))); if (!ok) diff --git a/MediaBrowser.Api/Reports/Stat/ReportStatBuilder.cs b/MediaBrowser.Api/Reports/Stat/ReportStatBuilder.cs index e297a2a57..541bb92d9 100644 --- a/MediaBrowser.Api/Reports/Stat/ReportStatBuilder.cs +++ b/MediaBrowser.Api/Reports/Stat/ReportStatBuilder.cs @@ -107,7 +107,7 @@ namespace MediaBrowser.Api.Reports foreach (var item in t) { this.GetGroups(result, ReportHelper.GetServerLocalizedString("Option" + item), topItem, - items.SelectMany(x => x.People) + items.SelectMany(x => _libraryManager.GetPeople(x)) .Where(n => n.Type == item) .GroupBy(x => x.Name) .OrderByDescending(x => x.Count()) diff --git a/MediaBrowser.Api/SimilarItemsHelper.cs b/MediaBrowser.Api/SimilarItemsHelper.cs index 91e749778..d114446ee 100644 --- a/MediaBrowser.Api/SimilarItemsHelper.cs +++ b/MediaBrowser.Api/SimilarItemsHelper.cs @@ -68,7 +68,7 @@ namespace MediaBrowser.Api /// <param name="includeInSearch">The include in search.</param> /// <param name="getSimilarityScore">The get similarity score.</param> /// <returns>ItemsResult.</returns> - internal static ItemsResult GetSimilarItemsResult(DtoOptions dtoOptions, IUserManager userManager, IItemRepository itemRepository, ILibraryManager libraryManager, IUserDataManager userDataRepository, IDtoService dtoService, ILogger logger, BaseGetSimilarItemsFromItem request, Func<BaseItem, bool> includeInSearch, Func<BaseItem, BaseItem, int> getSimilarityScore) + internal static ItemsResult GetSimilarItemsResult(DtoOptions dtoOptions, IUserManager userManager, IItemRepository itemRepository, ILibraryManager libraryManager, IUserDataManager userDataRepository, IDtoService dtoService, ILogger logger, BaseGetSimilarItemsFromItem request, Func<BaseItem, bool> includeInSearch, Func<BaseItem, List<PersonInfo>, List<PersonInfo>, BaseItem, int> getSimilarityScore) { var user = !string.IsNullOrWhiteSpace(request.UserId) ? userManager.GetUserById(request.UserId) : null; @@ -82,7 +82,7 @@ namespace MediaBrowser.Api ? libraryManager.RootFolder.GetRecursiveChildren(filter) : user.RootFolder.GetRecursiveChildren(user, filter); - var items = GetSimilaritems(item, inputItems, getSimilarityScore) + var items = GetSimilaritems(item, libraryManager, inputItems, getSimilarityScore) .ToList(); IEnumerable<BaseItem> returnItems = items; @@ -106,15 +106,21 @@ namespace MediaBrowser.Api /// Gets the similaritems. /// </summary> /// <param name="item">The item.</param> + /// <param name="libraryManager">The library manager.</param> /// <param name="inputItems">The input items.</param> /// <param name="getSimilarityScore">The get similarity score.</param> /// <returns>IEnumerable{BaseItem}.</returns> - internal static IEnumerable<BaseItem> GetSimilaritems(BaseItem item, IEnumerable<BaseItem> inputItems, Func<BaseItem, BaseItem, int> getSimilarityScore) + internal static IEnumerable<BaseItem> GetSimilaritems(BaseItem item, ILibraryManager libraryManager, IEnumerable<BaseItem> inputItems, Func<BaseItem, List<PersonInfo>, List<PersonInfo>, BaseItem, int> getSimilarityScore) { var itemId = item.Id; inputItems = inputItems.Where(i => i.Id != itemId); + var itemPeople = libraryManager.GetPeople(item); + var allPeople = libraryManager.GetPeople(new InternalPeopleQuery + { + AppearsInItemId = item.Id + }); - return inputItems.Select(i => new Tuple<BaseItem, int>(i, getSimilarityScore(item, i))) + return inputItems.Select(i => new Tuple<BaseItem, int>(i, getSimilarityScore(item, itemPeople, allPeople, i))) .Where(i => i.Item2 > 2) .OrderByDescending(i => i.Item2) .Select(i => i.Item1); @@ -146,9 +152,11 @@ namespace MediaBrowser.Api /// Gets the similiarity score. /// </summary> /// <param name="item1">The item1.</param> + /// <param name="item1People">The item1 people.</param> + /// <param name="allPeople">All people.</param> /// <param name="item2">The item2.</param> /// <returns>System.Int32.</returns> - internal static int GetSimiliarityScore(BaseItem item1, BaseItem item2) + internal static int GetSimiliarityScore(BaseItem item1, List<PersonInfo> item1People, List<PersonInfo> allPeople, BaseItem item2) { var points = 0; @@ -169,11 +177,13 @@ namespace MediaBrowser.Api // Find common studios points += item1.Studios.Where(i => item2.Studios.Contains(i, StringComparer.OrdinalIgnoreCase)).Sum(i => 3); - var item2PeopleNames = item2.People.Select(i => i.Name) + var item2PeopleNames = allPeople.Where(i => i.ItemId == item2.Id) + .Select(i => i.Name) + .Where(i => !string.IsNullOrWhiteSpace(i)) .DistinctNames() .ToDictionary(i => i, StringComparer.OrdinalIgnoreCase); - points += item1.People.Where(i => item2PeopleNames.ContainsKey(i.Name)).Sum(i => + points += item1People.Where(i => item2PeopleNames.ContainsKey(i.Name)).Sum(i => { if (string.Equals(i.Type, PersonType.Director, StringComparison.OrdinalIgnoreCase) || string.Equals(i.Role, PersonType.Director, StringComparison.OrdinalIgnoreCase)) { diff --git a/MediaBrowser.Api/Social/SharingService.cs b/MediaBrowser.Api/Social/SharingService.cs new file mode 100644 index 000000000..608008455 --- /dev/null +++ b/MediaBrowser.Api/Social/SharingService.cs @@ -0,0 +1,164 @@ +using MediaBrowser.Common.Extensions; +using MediaBrowser.Controller.Dlna; +using MediaBrowser.Controller.Dto; +using MediaBrowser.Controller.Library; +using MediaBrowser.Controller.Net; +using MediaBrowser.Controller.Social; +using MediaBrowser.Model.Entities; +using MediaBrowser.Model.Social; +using ServiceStack; +using System; +using System.IO; +using System.Threading.Tasks; + +namespace MediaBrowser.Api.Social +{ + [Route("/Social/Shares/{Id}", "GET", Summary = "Gets a share")] + [Authenticated] + public class GetSocialShareInfo : IReturn<SocialShareInfo> + { + [ApiMember(Name = "Id", Description = "The id of the item", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "GET")] + public string Id { get; set; } + } + + [Route("/Social/Shares/Public/{Id}", "GET", Summary = "Gets a share")] + public class GetPublicSocialShareInfo : IReturn<SocialShareInfo> + { + [ApiMember(Name = "Id", Description = "The id of the item", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "GET")] + public string Id { get; set; } + } + + [Route("/Social/Shares/Public/{Id}/Image", "GET", Summary = "Gets a share")] + public class GetShareImage + { + [ApiMember(Name = "Id", Description = "The id of the item", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "GET")] + public string Id { get; set; } + } + + [Route("/Social/Shares", "POST", Summary = "Creates a share")] + [Authenticated] + public class CreateShare : IReturn<SocialShareInfo> + { + [ApiMember(Name = "ItemId", Description = "The id of the item", IsRequired = true, DataType = "string", ParameterType = "query", Verb = "POST")] + public string ItemId { get; set; } + + [ApiMember(Name = "UserId", Description = "The user id", IsRequired = true, DataType = "string", ParameterType = "query", Verb = "POST")] + public string UserId { get; set; } + } + + [Route("/Social/Shares/{Id}", "DELETE", Summary = "Deletes a share")] + [Authenticated] + public class DeleteShare : IReturnVoid + { + [ApiMember(Name = "Id", Description = "The id of the item", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "DELETE")] + public string Id { get; set; } + } + + [Route("/Social/Shares/Public/{Id}/Item", "GET", Summary = "Gets a share")] + public class GetSharedLibraryItem + { + [ApiMember(Name = "Id", Description = "The id of the item", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "GET")] + public string Id { get; set; } + } + + public class SharingService : BaseApiService + { + private readonly ISharingManager _sharingManager; + private readonly ILibraryManager _libraryManager; + private readonly IDlnaManager _dlnaManager; + private readonly IDtoService _dtoService; + + public SharingService(ISharingManager sharingManager, IDlnaManager dlnaManager, ILibraryManager libraryManager, IDtoService dtoService) + { + _sharingManager = sharingManager; + _dlnaManager = dlnaManager; + _libraryManager = libraryManager; + _dtoService = dtoService; + } + + public object Get(GetSocialShareInfo request) + { + var info = _sharingManager.GetShareInfo(request.Id); + + return ToOptimizedResult(info); + } + + public object Get(GetSharedLibraryItem request) + { + var info = _sharingManager.GetShareInfo(request.Id); + + if (info.ExpirationDate <= DateTime.UtcNow) + { + throw new ResourceNotFoundException(); + } + + var item = _libraryManager.GetItemById(info.ItemId); + + var dto = _dtoService.GetBaseItemDto(item, new DtoOptions()); + + return ToOptimizedResult(dto); + } + + public object Get(GetPublicSocialShareInfo request) + { + var info = _sharingManager.GetShareInfo(request.Id); + + if (info.ExpirationDate <= DateTime.UtcNow) + { + throw new ResourceNotFoundException(); + } + + return ToOptimizedResult(info); + } + + public async Task<object> Post(CreateShare request) + { + var info = await _sharingManager.CreateShare(request.ItemId, request.UserId).ConfigureAwait(false); + + return ToOptimizedResult(info); + } + + public void Delete(DeleteShare request) + { + var task = _sharingManager.DeleteShare(request.Id); + Task.WaitAll(task); + } + + public object Get(GetShareImage request) + { + var share = _sharingManager.GetShareInfo(request.Id); + + if (share == null) + { + throw new ResourceNotFoundException(); + } + if (share.ExpirationDate <= DateTime.UtcNow) + { + throw new ResourceNotFoundException(); + } + + var item = _libraryManager.GetItemById(share.ItemId); + + var image = item.GetImageInfo(ImageType.Primary, 0); + + if (image != null) + { + return ToStaticFileResult(image.Path); + } + + // Grab a dlna icon if nothing else is available + using (var response = _dlnaManager.GetIcon("logo240.jpg")) + { + using (var ms = new MemoryStream()) + { + response.Stream.CopyTo(ms); + + ms.Position = 0; + var bytes = ms.ToArray(); + return ResultFactory.GetResult(bytes, "image/" + response.Format.ToString().ToLower()); + } + } + + } + } +} diff --git a/MediaBrowser.Api/UserLibrary/ItemsService.cs b/MediaBrowser.Api/UserLibrary/ItemsService.cs index bc2e4699c..7120f3604 100644 --- a/MediaBrowser.Api/UserLibrary/ItemsService.cs +++ b/MediaBrowser.Api/UserLibrary/ItemsService.cs @@ -990,7 +990,7 @@ namespace MediaBrowser.Api.UserLibrary .Select(p => p == null ? "-1" : p.Name) .ToList(); - if (!(names.Any(v => i.People.Select(p => p.Name).Contains(v, StringComparer.OrdinalIgnoreCase)))) + if (!(names.Any(v => libraryManager.GetPeople(i).Select(p => p.Name).Contains(v, StringComparer.OrdinalIgnoreCase)))) { return false; } @@ -1003,7 +1003,7 @@ namespace MediaBrowser.Api.UserLibrary if (personTypes.Length == 0) { - if (!(i.People.Any(p => string.Equals(p.Name, request.Person, StringComparison.OrdinalIgnoreCase)))) + if (!(libraryManager.GetPeople(i).Any(p => string.Equals(p.Name, request.Person, StringComparison.OrdinalIgnoreCase)))) { return false; } @@ -1013,8 +1013,7 @@ namespace MediaBrowser.Api.UserLibrary var types = personTypes; var ok = new[] { i }.Any(item => - item.People != null && - item.People.Any(p => + libraryManager.GetPeople(item).Any(p => p.Name.Equals(request.Person, StringComparison.OrdinalIgnoreCase) && (types.Contains(p.Type, StringComparer.OrdinalIgnoreCase) || types.Contains(p.Role, StringComparer.OrdinalIgnoreCase)))); if (!ok) diff --git a/MediaBrowser.Api/UserLibrary/PersonsService.cs b/MediaBrowser.Api/UserLibrary/PersonsService.cs index b7fb4f542..bd9898dcd 100644 --- a/MediaBrowser.Api/UserLibrary/PersonsService.cs +++ b/MediaBrowser.Api/UserLibrary/PersonsService.cs @@ -5,7 +5,6 @@ using MediaBrowser.Controller.Net; using MediaBrowser.Controller.Persistence; using MediaBrowser.Model.Dto; using ServiceStack; -using System; using System.Collections.Generic; using System.Linq; @@ -151,18 +150,16 @@ namespace MediaBrowser.Api.UserLibrary /// <param name="itemsList">The items list.</param> /// <param name="personTypes">The person types.</param> /// <returns>IEnumerable{PersonInfo}.</returns> - private IEnumerable<PersonInfo> GetAllPeople(IEnumerable<BaseItem> itemsList, string[] personTypes) + private IEnumerable<PersonInfo> GetAllPeople(IEnumerable<BaseItem> itemsList, IEnumerable<string> personTypes) { - var people = itemsList.SelectMany(i => i.People.OrderBy(p => p.SortOrder ?? int.MaxValue).ThenBy(p => p.Type)); + var allIds = itemsList.Select(i => i.Id).ToList(); - if (personTypes.Length > 0) + var allPeople = LibraryManager.GetPeople(new InternalPeopleQuery { - people = people.Where(p => - personTypes.Contains(p.Type ?? string.Empty, StringComparer.OrdinalIgnoreCase) || - personTypes.Contains(p.Role ?? string.Empty, StringComparer.OrdinalIgnoreCase)); - } + PersonTypes = personTypes.ToList() + }); - return people; + return allPeople.Where(i => allIds.Contains(i.ItemId)).OrderBy(p => p.SortOrder ?? int.MaxValue).ThenBy(p => p.Type); } } } diff --git a/MediaBrowser.Common.Implementations/Logging/NlogManager.cs b/MediaBrowser.Common.Implementations/Logging/NlogManager.cs index 77d9f80f9..698792802 100644 --- a/MediaBrowser.Common.Implementations/Logging/NlogManager.cs +++ b/MediaBrowser.Common.Implementations/Logging/NlogManager.cs @@ -85,6 +85,13 @@ namespace MediaBrowser.Common.Implementations.Logging { rule.EnableLoggingForLevel(level); } + foreach (var lev in rule.Levels.ToArray()) + { + if (lev < level) + { + rule.DisableLoggingForLevel(lev); + } + } } } diff --git a/MediaBrowser.Controller/Entities/Audio/MusicArtist.cs b/MediaBrowser.Controller/Entities/Audio/MusicArtist.cs index 4185590ab..f6d1d32a4 100644 --- a/MediaBrowser.Controller/Entities/Audio/MusicArtist.cs +++ b/MediaBrowser.Controller/Entities/Audio/MusicArtist.cs @@ -216,5 +216,14 @@ namespace MediaBrowser.Controller.Entities.Audio return hasArtist != null && hasArtist.HasAnyArtist(Name); }; } + + [IgnoreDataMember] + public override bool SupportsPeople + { + get + { + return false; + } + } } } diff --git a/MediaBrowser.Controller/Entities/Audio/MusicGenre.cs b/MediaBrowser.Controller/Entities/Audio/MusicGenre.cs index 971c09236..5f24dbf67 100644 --- a/MediaBrowser.Controller/Entities/Audio/MusicGenre.cs +++ b/MediaBrowser.Controller/Entities/Audio/MusicGenre.cs @@ -71,5 +71,14 @@ namespace MediaBrowser.Controller.Entities.Audio { return i => (i is IHasMusicGenres) && i.Genres.Contains(Name, StringComparer.OrdinalIgnoreCase); } + + [IgnoreDataMember] + public override bool SupportsPeople + { + get + { + return false; + } + } } } diff --git a/MediaBrowser.Controller/Entities/BaseItem.cs b/MediaBrowser.Controller/Entities/BaseItem.cs index 014b3ae6a..41329608e 100644 --- a/MediaBrowser.Controller/Entities/BaseItem.cs +++ b/MediaBrowser.Controller/Entities/BaseItem.cs @@ -35,7 +35,6 @@ namespace MediaBrowser.Controller.Entities { Genres = new List<string>(); Studios = new List<string>(); - People = new List<PersonInfo>(); ProviderIds = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase); LockedFields = new List<MetadataFields>(); ImageInfos = new List<ItemImageInfo>(); @@ -413,15 +412,6 @@ namespace MediaBrowser.Controller.Entities } } - public bool ContainsPerson(string name) - { - if (string.IsNullOrWhiteSpace(name)) - { - throw new ArgumentNullException("name"); - } - return People.Any(i => string.Equals(i.Name, name, StringComparison.OrdinalIgnoreCase)); - } - public string GetInternalMetadataPath() { var basePath = ConfigurationManager.ApplicationPaths.InternalMetadataPath; @@ -474,6 +464,8 @@ namespace MediaBrowser.Controller.Entities return sortable; } + public Guid ParentId { get; set; } + /// <summary> /// Gets or sets the parent. /// </summary> @@ -481,6 +473,12 @@ namespace MediaBrowser.Controller.Entities [IgnoreDataMember] public Folder Parent { get; set; } + public void SetParent(Folder parent) + { + Parent = parent; + ParentId = parent == null ? Guid.Empty : parent.Id; + } + [IgnoreDataMember] public IEnumerable<Folder> Parents { @@ -785,6 +783,12 @@ namespace MediaBrowser.Controller.Entities get { return IsFolder || Parent != null; } } + [IgnoreDataMember] + public virtual bool SupportsPeople + { + get { return true; } + } + /// <summary> /// Refreshes owned items such as trailers, theme videos, special features, etc. /// Returns true or false indicating if changes were found. @@ -1248,83 +1252,6 @@ namespace MediaBrowser.Controller.Entities /// <exception cref="System.ArgumentNullException"></exception> public void AddPerson(PersonInfo person) { - if (person == null) - { - throw new ArgumentNullException("person"); - } - - if (string.IsNullOrWhiteSpace(person.Name)) - { - throw new ArgumentNullException(); - } - - // Normalize - if (string.Equals(person.Role, PersonType.GuestStar, StringComparison.OrdinalIgnoreCase)) - { - person.Type = PersonType.GuestStar; - } - else if (string.Equals(person.Role, PersonType.Director, StringComparison.OrdinalIgnoreCase)) - { - person.Type = PersonType.Director; - } - else if (string.Equals(person.Role, PersonType.Producer, StringComparison.OrdinalIgnoreCase)) - { - person.Type = PersonType.Producer; - } - else if (string.Equals(person.Role, PersonType.Writer, StringComparison.OrdinalIgnoreCase)) - { - person.Type = PersonType.Writer; - } - - // If the type is GuestStar and there's already an Actor entry, then update it to avoid dupes - if (string.Equals(person.Type, PersonType.GuestStar, StringComparison.OrdinalIgnoreCase)) - { - var existing = People.FirstOrDefault(p => p.Name.Equals(person.Name, StringComparison.OrdinalIgnoreCase) && p.Type.Equals(PersonType.Actor, StringComparison.OrdinalIgnoreCase)); - - if (existing != null) - { - existing.Type = PersonType.GuestStar; - existing.SortOrder = person.SortOrder ?? existing.SortOrder; - return; - } - } - - if (string.Equals(person.Type, PersonType.Actor, StringComparison.OrdinalIgnoreCase)) - { - // If the actor already exists without a role and we have one, fill it in - var existing = People.FirstOrDefault(p => p.Name.Equals(person.Name, StringComparison.OrdinalIgnoreCase) && (p.Type.Equals(PersonType.Actor, StringComparison.OrdinalIgnoreCase) || p.Type.Equals(PersonType.GuestStar, StringComparison.OrdinalIgnoreCase))); - if (existing == null) - { - // Wasn't there - add it - People.Add(person); - } - else - { - // Was there, if no role and we have one - fill it in - if (string.IsNullOrWhiteSpace(existing.Role) && !string.IsNullOrWhiteSpace(person.Role)) - { - existing.Role = person.Role; - } - - existing.SortOrder = person.SortOrder ?? existing.SortOrder; - } - } - else - { - var existing = People.FirstOrDefault(p => - string.Equals(p.Name, person.Name, StringComparison.OrdinalIgnoreCase) && - string.Equals(p.Type, person.Type, StringComparison.OrdinalIgnoreCase)); - - // Check for dupes based on the combination of Name and Type - if (existing == null) - { - People.Add(person); - } - else - { - existing.SortOrder = person.SortOrder ?? existing.SortOrder; - } - } } /// <summary> diff --git a/MediaBrowser.Controller/Entities/BasePluginFolder.cs b/MediaBrowser.Controller/Entities/BasePluginFolder.cs index 1cc547790..5a1ad6b15 100644 --- a/MediaBrowser.Controller/Entities/BasePluginFolder.cs +++ b/MediaBrowser.Controller/Entities/BasePluginFolder.cs @@ -1,4 +1,6 @@ +using System.Runtime.Serialization; + namespace MediaBrowser.Controller.Entities { /// <summary> @@ -21,5 +23,14 @@ namespace MediaBrowser.Controller.Entities { return true; } + + [IgnoreDataMember] + public override bool SupportsPeople + { + get + { + return false; + } + } } } diff --git a/MediaBrowser.Controller/Entities/CollectionFolder.cs b/MediaBrowser.Controller/Entities/CollectionFolder.cs index bcf68263a..3a610be64 100644 --- a/MediaBrowser.Controller/Entities/CollectionFolder.cs +++ b/MediaBrowser.Controller/Entities/CollectionFolder.cs @@ -194,5 +194,14 @@ namespace MediaBrowser.Controller.Entities .Where(i => i.Path != null && PhysicalLocations.Contains(i.Path, StringComparer.OrdinalIgnoreCase)) .SelectMany(c => c.Children); } + + [IgnoreDataMember] + public override bool SupportsPeople + { + get + { + return false; + } + } } } diff --git a/MediaBrowser.Controller/Entities/Folder.cs b/MediaBrowser.Controller/Entities/Folder.cs index 821e6b5ca..22efb09e1 100644 --- a/MediaBrowser.Controller/Entities/Folder.cs +++ b/MediaBrowser.Controller/Entities/Folder.cs @@ -134,7 +134,7 @@ namespace MediaBrowser.Controller.Entities /// <exception cref="System.InvalidOperationException">Unable to add + item.Name</exception> public async Task AddChild(BaseItem item, CancellationToken cancellationToken) { - item.Parent = this; + item.SetParent(this); if (item.Id == Guid.Empty) { @@ -230,7 +230,7 @@ namespace MediaBrowser.Controller.Entities { RemoveChildrenInternal(new[] { item }); - item.Parent = null; + item.SetParent(null); return ItemRepository.SaveChildren(Id, ActualChildren.Select(i => i.Id).ToList(), cancellationToken); } @@ -783,11 +783,11 @@ namespace MediaBrowser.Controller.Entities return LibraryManager.GetOrAddByReferenceItem(item); } - item.Parent = this; + item.SetParent(this); } else { - child.Parent = this; + child.SetParent(this); LibraryManager.RegisterItem(child); item = child; } diff --git a/MediaBrowser.Controller/Entities/GameGenre.cs b/MediaBrowser.Controller/Entities/GameGenre.cs index c91acbe3f..bf448da0d 100644 --- a/MediaBrowser.Controller/Entities/GameGenre.cs +++ b/MediaBrowser.Controller/Entities/GameGenre.cs @@ -62,5 +62,14 @@ namespace MediaBrowser.Controller.Entities { return i => (i is Game) && i.Genres.Contains(Name, StringComparer.OrdinalIgnoreCase); } + + [IgnoreDataMember] + public override bool SupportsPeople + { + get + { + return false; + } + } } } diff --git a/MediaBrowser.Controller/Entities/GameSystem.cs b/MediaBrowser.Controller/Entities/GameSystem.cs index cf6916763..35f7e3350 100644 --- a/MediaBrowser.Controller/Entities/GameSystem.cs +++ b/MediaBrowser.Controller/Entities/GameSystem.cs @@ -58,5 +58,14 @@ namespace MediaBrowser.Controller.Entities return id; } + + [IgnoreDataMember] + public override bool SupportsPeople + { + get + { + return false; + } + } } } diff --git a/MediaBrowser.Controller/Entities/Genre.cs b/MediaBrowser.Controller/Entities/Genre.cs index cb68e5dae..233e1e0fd 100644 --- a/MediaBrowser.Controller/Entities/Genre.cs +++ b/MediaBrowser.Controller/Entities/Genre.cs @@ -66,5 +66,14 @@ namespace MediaBrowser.Controller.Entities { return i => !(i is Game) && !(i is IHasMusicGenres) && i.Genres.Contains(Name, StringComparer.OrdinalIgnoreCase); } + + [IgnoreDataMember] + public override bool SupportsPeople + { + get + { + return false; + } + } } } diff --git a/MediaBrowser.Controller/Entities/IHasMetadata.cs b/MediaBrowser.Controller/Entities/IHasMetadata.cs index 3643c58b3..158bcb6d1 100644 --- a/MediaBrowser.Controller/Entities/IHasMetadata.cs +++ b/MediaBrowser.Controller/Entities/IHasMetadata.cs @@ -59,5 +59,11 @@ namespace MediaBrowser.Controller.Entities /// Afters the metadata refresh. /// </summary> void AfterMetadataRefresh(); + + /// <summary> + /// Gets a value indicating whether [supports people]. + /// </summary> + /// <value><c>true</c> if [supports people]; otherwise, <c>false</c>.</value> + bool SupportsPeople { get; } } } diff --git a/MediaBrowser.Controller/Entities/IItemByName.cs b/MediaBrowser.Controller/Entities/IItemByName.cs index 14b69b8fd..e6667290c 100644 --- a/MediaBrowser.Controller/Entities/IItemByName.cs +++ b/MediaBrowser.Controller/Entities/IItemByName.cs @@ -6,7 +6,7 @@ namespace MediaBrowser.Controller.Entities /// <summary> /// Marker interface /// </summary> - public interface IItemByName + public interface IItemByName : IHasMetadata { /// <summary> /// Gets the tagged items. diff --git a/MediaBrowser.Controller/Entities/InternalPeopleQuery.cs b/MediaBrowser.Controller/Entities/InternalPeopleQuery.cs new file mode 100644 index 000000000..05d23d986 --- /dev/null +++ b/MediaBrowser.Controller/Entities/InternalPeopleQuery.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; + +namespace MediaBrowser.Controller.Entities +{ + public class InternalPeopleQuery + { + public Guid ItemId { get; set; } + public List<string> PersonTypes { get; set; } + public List<string> ExcludePersonTypes { get; set; } + public int? MaxListOrder { get; set; } + public Guid AppearsInItemId { get; set; } + public string NameContains { get; set; } + + public InternalPeopleQuery() + { + PersonTypes = new List<string>(); + ExcludePersonTypes = new List<string>(); + } + } +} diff --git a/MediaBrowser.Controller/Entities/PeopleHelper.cs b/MediaBrowser.Controller/Entities/PeopleHelper.cs new file mode 100644 index 000000000..3468ca2d5 --- /dev/null +++ b/MediaBrowser.Controller/Entities/PeopleHelper.cs @@ -0,0 +1,100 @@ +using MediaBrowser.Model.Entities; +using System; +using System.Collections.Generic; +using System.Linq; + +namespace MediaBrowser.Controller.Entities +{ + public static class PeopleHelper + { + public static void AddPerson(List<PersonInfo> people, PersonInfo person) + { + if (person == null) + { + throw new ArgumentNullException("person"); + } + + if (string.IsNullOrWhiteSpace(person.Name)) + { + throw new ArgumentNullException(); + } + + // Normalize + if (string.Equals(person.Role, PersonType.GuestStar, StringComparison.OrdinalIgnoreCase)) + { + person.Type = PersonType.GuestStar; + } + else if (string.Equals(person.Role, PersonType.Director, StringComparison.OrdinalIgnoreCase)) + { + person.Type = PersonType.Director; + } + else if (string.Equals(person.Role, PersonType.Producer, StringComparison.OrdinalIgnoreCase)) + { + person.Type = PersonType.Producer; + } + else if (string.Equals(person.Role, PersonType.Writer, StringComparison.OrdinalIgnoreCase)) + { + person.Type = PersonType.Writer; + } + + // If the type is GuestStar and there's already an Actor entry, then update it to avoid dupes + if (string.Equals(person.Type, PersonType.GuestStar, StringComparison.OrdinalIgnoreCase)) + { + var existing = people.FirstOrDefault(p => p.Name.Equals(person.Name, StringComparison.OrdinalIgnoreCase) && p.Type.Equals(PersonType.Actor, StringComparison.OrdinalIgnoreCase)); + + if (existing != null) + { + existing.Type = PersonType.GuestStar; + existing.SortOrder = person.SortOrder ?? existing.SortOrder; + return; + } + } + + if (string.Equals(person.Type, PersonType.Actor, StringComparison.OrdinalIgnoreCase)) + { + // If the actor already exists without a role and we have one, fill it in + var existing = people.FirstOrDefault(p => p.Name.Equals(person.Name, StringComparison.OrdinalIgnoreCase) && (p.Type.Equals(PersonType.Actor, StringComparison.OrdinalIgnoreCase) || p.Type.Equals(PersonType.GuestStar, StringComparison.OrdinalIgnoreCase))); + if (existing == null) + { + // Wasn't there - add it + people.Add(person); + } + else + { + // Was there, if no role and we have one - fill it in + if (string.IsNullOrWhiteSpace(existing.Role) && !string.IsNullOrWhiteSpace(person.Role)) + { + existing.Role = person.Role; + } + + existing.SortOrder = person.SortOrder ?? existing.SortOrder; + } + } + else + { + var existing = people.FirstOrDefault(p => + string.Equals(p.Name, person.Name, StringComparison.OrdinalIgnoreCase) && + string.Equals(p.Type, person.Type, StringComparison.OrdinalIgnoreCase)); + + // Check for dupes based on the combination of Name and Type + if (existing == null) + { + people.Add(person); + } + else + { + existing.SortOrder = person.SortOrder ?? existing.SortOrder; + } + } + } + + public static bool ContainsPerson(List<PersonInfo> people, string name) + { + if (string.IsNullOrWhiteSpace(name)) + { + throw new ArgumentNullException("name"); + } + return people.Any(i => string.Equals(i.Name, name, StringComparison.OrdinalIgnoreCase)); + } + } +} diff --git a/MediaBrowser.Controller/Entities/Person.cs b/MediaBrowser.Controller/Entities/Person.cs index ef24d4347..0a62655ee 100644 --- a/MediaBrowser.Controller/Entities/Person.cs +++ b/MediaBrowser.Controller/Entities/Person.cs @@ -70,13 +70,27 @@ namespace MediaBrowser.Controller.Entities public IEnumerable<BaseItem> GetTaggedItems(IEnumerable<BaseItem> inputItems) { - return inputItems.Where(GetItemFilter()); + var itemsWithPerson = LibraryManager.GetItemIds(new InternalItemsQuery + { + Person = Name + }); + + return inputItems.Where(i => itemsWithPerson.Contains(i.Id)); } public Func<BaseItem, bool> GetItemFilter() { - return i => i.People.Any(p => string.Equals(p.Name, Name, StringComparison.OrdinalIgnoreCase)); + return i => LibraryManager.GetPeople(i).Any(p => string.Equals(p.Name, Name, StringComparison.OrdinalIgnoreCase)); + } + + [IgnoreDataMember] + public override bool SupportsPeople + { + get + { + return false; + } } } @@ -85,6 +99,8 @@ namespace MediaBrowser.Controller.Entities /// </summary> public class PersonInfo { + public Guid ItemId { get; set; } + /// <summary> /// Gets or sets the name. /// </summary> diff --git a/MediaBrowser.Controller/Entities/Studio.cs b/MediaBrowser.Controller/Entities/Studio.cs index b8d359369..822f305ed 100644 --- a/MediaBrowser.Controller/Entities/Studio.cs +++ b/MediaBrowser.Controller/Entities/Studio.cs @@ -72,5 +72,14 @@ namespace MediaBrowser.Controller.Entities { return i => i.Studios.Contains(Name, StringComparer.OrdinalIgnoreCase); } + + [IgnoreDataMember] + public override bool SupportsPeople + { + get + { + return false; + } + } } } diff --git a/MediaBrowser.Controller/Entities/User.cs b/MediaBrowser.Controller/Entities/User.cs index 5b70ee5f4..71e3d1ce0 100644 --- a/MediaBrowser.Controller/Entities/User.cs +++ b/MediaBrowser.Controller/Entities/User.cs @@ -295,5 +295,14 @@ namespace MediaBrowser.Controller.Entities return config.GroupedFolders.Select(i => new Guid(i)).Contains(id); } + + [IgnoreDataMember] + public override bool SupportsPeople + { + get + { + return false; + } + } } } diff --git a/MediaBrowser.Controller/Entities/UserView.cs b/MediaBrowser.Controller/Entities/UserView.cs index 9be30273a..dad6de01a 100644 --- a/MediaBrowser.Controller/Entities/UserView.cs +++ b/MediaBrowser.Controller/Entities/UserView.cs @@ -1,4 +1,5 @@ -using MediaBrowser.Controller.Playlists; +using System.Runtime.Serialization; +using MediaBrowser.Controller.Playlists; using MediaBrowser.Controller.TV; using MediaBrowser.Model.Entities; using MediaBrowser.Model.Querying; @@ -93,5 +94,14 @@ namespace MediaBrowser.Controller.Entities return standaloneTypes.Contains(collectionFolder.CollectionType ?? string.Empty); } + + [IgnoreDataMember] + public override bool SupportsPeople + { + get + { + return false; + } + } } } diff --git a/MediaBrowser.Controller/Entities/UserViewBuilder.cs b/MediaBrowser.Controller/Entities/UserViewBuilder.cs index 3e4dff033..62c71d169 100644 --- a/MediaBrowser.Controller/Entities/UserViewBuilder.cs +++ b/MediaBrowser.Controller/Entities/UserViewBuilder.cs @@ -1699,8 +1699,7 @@ namespace MediaBrowser.Controller.Entities .Select(i => i == null ? "-1" : i.Name) .ToList(); - if (!(names.Any( - v => item.People.Select(i => i.Name).Contains(v, StringComparer.OrdinalIgnoreCase)))) + if (!(names.Any(v => libraryManager.GetPeople(item).Select(i => i.Name).Contains(v, StringComparer.OrdinalIgnoreCase)))) { return false; } @@ -1713,7 +1712,7 @@ namespace MediaBrowser.Controller.Entities if (personTypes.Length == 0) { - if (!(item.People.Any(p => string.Equals(p.Name, query.Person, StringComparison.OrdinalIgnoreCase)))) + if (!(libraryManager.GetPeople(item).Any(p => string.Equals(p.Name, query.Person, StringComparison.OrdinalIgnoreCase)))) { return false; } @@ -1723,8 +1722,7 @@ namespace MediaBrowser.Controller.Entities var types = personTypes; var ok = new[] { item }.Any(i => - i.People != null && - i.People.Any(p => + libraryManager.GetPeople(i).Any(p => string.Equals(p.Name, query.Person, StringComparison.OrdinalIgnoreCase) && (types.Contains(p.Type ?? string.Empty, StringComparer.OrdinalIgnoreCase) || types.Contains(p.Role ?? string.Empty, StringComparer.OrdinalIgnoreCase)))); if (!ok) diff --git a/MediaBrowser.Controller/Entities/Year.cs b/MediaBrowser.Controller/Entities/Year.cs index a1a152387..163dcd667 100644 --- a/MediaBrowser.Controller/Entities/Year.cs +++ b/MediaBrowser.Controller/Entities/Year.cs @@ -88,5 +88,14 @@ namespace MediaBrowser.Controller.Entities var val = GetYearValue(); return i => i.ProductionYear.HasValue && val.HasValue && i.ProductionYear.Value == val.Value; } + + [IgnoreDataMember] + public override bool SupportsPeople + { + get + { + return false; + } + } } } diff --git a/MediaBrowser.Controller/Library/ILibraryManager.cs b/MediaBrowser.Controller/Library/ILibraryManager.cs index aa8799fa6..f0bfaaf66 100644 --- a/MediaBrowser.Controller/Library/ILibraryManager.cs +++ b/MediaBrowser.Controller/Library/ILibraryManager.cs @@ -412,5 +412,54 @@ namespace MediaBrowser.Controller.Library /// <param name="item">The item.</param> /// <returns>IEnumerable<Folder>.</returns> IEnumerable<Folder> GetCollectionFolders(BaseItem item); + + /// <summary> + /// Gets the people. + /// </summary> + /// <param name="item">The item.</param> + /// <returns>List<PersonInfo>.</returns> + List<PersonInfo> GetPeople(BaseItem item); + + /// <summary> + /// Gets the people. + /// </summary> + /// <param name="query">The query.</param> + /// <returns>List<PersonInfo>.</returns> + List<PersonInfo> GetPeople(InternalPeopleQuery query); + + /// <summary> + /// Gets the people items. + /// </summary> + /// <param name="query">The query.</param> + /// <returns>List<Person>.</returns> + List<Person> GetPeopleItems(InternalPeopleQuery query); + + /// <summary> + /// Gets all people names. + /// </summary> + /// <returns>List<System.String>.</returns> + List<PersonInfo> GetAllPeople(); + + /// <summary> + /// Updates the people. + /// </summary> + /// <param name="item">The item.</param> + /// <param name="people">The people.</param> + /// <returns>Task.</returns> + Task UpdatePeople(BaseItem item, List<PersonInfo> people); + + /// <summary> + /// Gets the item ids. + /// </summary> + /// <param name="query">The query.</param> + /// <returns>List<Guid>.</returns> + List<Guid> GetItemIds(InternalItemsQuery query); + + /// <summary> + /// Gets the people names. + /// </summary> + /// <param name="query">The query.</param> + /// <returns>List<System.String>.</returns> + List<string> GetPeopleNames(InternalPeopleQuery query); } }
\ No newline at end of file diff --git a/MediaBrowser.Controller/LiveTv/LiveTvAudioRecording.cs b/MediaBrowser.Controller/LiveTv/LiveTvAudioRecording.cs index 3da12cd80..2179c5ecd 100644 --- a/MediaBrowser.Controller/LiveTv/LiveTvAudioRecording.cs +++ b/MediaBrowser.Controller/LiveTv/LiveTvAudioRecording.cs @@ -118,6 +118,11 @@ namespace MediaBrowser.Controller.LiveTv return System.IO.Path.Combine(basePath, "livetv", Id.ToString("N")); } + public override bool CanDelete() + { + return true; + } + public override bool IsAuthorizedToDelete(User user) { return user.Policy.EnableLiveTvManagement; diff --git a/MediaBrowser.Controller/LiveTv/LiveTvVideoRecording.cs b/MediaBrowser.Controller/LiveTv/LiveTvVideoRecording.cs index 179c33d09..aaaff6bdb 100644 --- a/MediaBrowser.Controller/LiveTv/LiveTvVideoRecording.cs +++ b/MediaBrowser.Controller/LiveTv/LiveTvVideoRecording.cs @@ -116,6 +116,11 @@ namespace MediaBrowser.Controller.LiveTv return System.IO.Path.Combine(basePath, "livetv", Id.ToString("N")); } + public override bool CanDelete() + { + return true; + } + public override bool IsAuthorizedToDelete(User user) { return user.Policy.EnableLiveTvManagement; diff --git a/MediaBrowser.Controller/MediaBrowser.Controller.csproj b/MediaBrowser.Controller/MediaBrowser.Controller.csproj index bf86c049f..fcde6d8c0 100644 --- a/MediaBrowser.Controller/MediaBrowser.Controller.csproj +++ b/MediaBrowser.Controller/MediaBrowser.Controller.csproj @@ -166,6 +166,7 @@ <Compile Include="Entities\ImageSourceInfo.cs" /> <Compile Include="Entities\IMetadataContainer.cs" /> <Compile Include="Entities\InternalItemsQuery.cs" /> + <Compile Include="Entities\InternalPeopleQuery.cs" /> <Compile Include="Entities\ISupportsBoxSetGrouping.cs" /> <Compile Include="Entities\ISupportsPlaceHolders.cs" /> <Compile Include="Entities\ItemImageInfo.cs" /> @@ -173,6 +174,7 @@ <Compile Include="Entities\LinkedChild.cs" /> <Compile Include="Entities\MusicVideo.cs" /> <Compile Include="Entities\IHasAwards.cs" /> + <Compile Include="Entities\PeopleHelper.cs" /> <Compile Include="Entities\Photo.cs" /> <Compile Include="Entities\PhotoAlbum.cs" /> <Compile Include="Entities\Share.cs" /> @@ -328,6 +330,7 @@ <Compile Include="Security\IAuthenticationRepository.cs" /> <Compile Include="Security\IEncryptionManager.cs" /> <Compile Include="Session\AuthenticationRequest.cs" /> + <Compile Include="Social\ISharingManager.cs" /> <Compile Include="Subtitles\ISubtitleManager.cs" /> <Compile Include="Subtitles\ISubtitleProvider.cs" /> <Compile Include="Providers\ItemIdentifier.cs" /> diff --git a/MediaBrowser.Controller/Persistence/IItemRepository.cs b/MediaBrowser.Controller/Persistence/IItemRepository.cs index 7c02a0ea1..a4b9bf120 100644 --- a/MediaBrowser.Controller/Persistence/IItemRepository.cs +++ b/MediaBrowser.Controller/Persistence/IItemRepository.cs @@ -147,6 +147,28 @@ namespace MediaBrowser.Controller.Persistence /// <param name="query">The query.</param> /// <returns>List<Guid>.</returns> List<Guid> GetItemIdsList(InternalItemsQuery query); + + /// <summary> + /// Gets the people. + /// </summary> + /// <param name="query">The query.</param> + /// <returns>List<PersonInfo>.</returns> + List<PersonInfo> GetPeople(InternalPeopleQuery query); + + /// <summary> + /// Updates the people. + /// </summary> + /// <param name="itemId">The item identifier.</param> + /// <param name="people">The people.</param> + /// <returns>Task.</returns> + Task UpdatePeople(Guid itemId, List<PersonInfo> people); + + /// <summary> + /// Gets the people names. + /// </summary> + /// <param name="query">The query.</param> + /// <returns>List<System.String>.</returns> + List<string> GetPeopleNames(InternalPeopleQuery query); } } diff --git a/MediaBrowser.Controller/Providers/BaseItemXmlParser.cs b/MediaBrowser.Controller/Providers/BaseItemXmlParser.cs index a8a3e88ab..c1a4fa765 100644 --- a/MediaBrowser.Controller/Providers/BaseItemXmlParser.cs +++ b/MediaBrowser.Controller/Providers/BaseItemXmlParser.cs @@ -40,7 +40,7 @@ namespace MediaBrowser.Controller.Providers /// <param name="metadataFile">The metadata file.</param> /// <param name="cancellationToken">The cancellation token.</param> /// <exception cref="System.ArgumentNullException"></exception> - public void Fetch(T item, string metadataFile, CancellationToken cancellationToken) + public void Fetch(MetadataResult<T> item, string metadataFile, CancellationToken cancellationToken) { if (item == null) { @@ -72,7 +72,7 @@ namespace MediaBrowser.Controller.Providers /// <param name="settings">The settings.</param> /// <param name="encoding">The encoding.</param> /// <param name="cancellationToken">The cancellation token.</param> - private void Fetch(T item, string metadataFile, XmlReaderSettings settings, Encoding encoding, CancellationToken cancellationToken) + private void Fetch(MetadataResult<T> item, string metadataFile, XmlReaderSettings settings, Encoding encoding, CancellationToken cancellationToken) { using (var streamReader = new StreamReader(metadataFile, encoding)) { @@ -101,9 +101,11 @@ namespace MediaBrowser.Controller.Providers /// Fetches metadata from one Xml Element /// </summary> /// <param name="reader">The reader.</param> - /// <param name="item">The item.</param> - protected virtual void FetchDataFromXmlNode(XmlReader reader, T item) + /// <param name="itemResult">The item result.</param> + protected virtual void FetchDataFromXmlNode(XmlReader reader, MetadataResult<T> itemResult) { + var item = itemResult.Item; + switch (reader.Name) { // DateCreated @@ -490,7 +492,7 @@ namespace MediaBrowser.Controller.Providers { continue; } - item.AddPerson(p); + PeopleHelper.AddPerson(itemResult.People, p); } break; } @@ -502,7 +504,7 @@ namespace MediaBrowser.Controller.Providers { continue; } - item.AddPerson(p); + PeopleHelper.AddPerson(itemResult.People, p); } break; } @@ -516,7 +518,7 @@ namespace MediaBrowser.Controller.Providers { // This is one of the mis-named "Actors" full nodes created by MB2 // Create a reader and pass it to the persons node processor - FetchDataFromPersonsNode(new XmlTextReader(new StringReader("<Persons>" + actors + "</Persons>")), item); + FetchDataFromPersonsNode(new XmlTextReader(new StringReader("<Persons>" + actors + "</Persons>")), itemResult); } else { @@ -527,7 +529,7 @@ namespace MediaBrowser.Controller.Providers { continue; } - item.AddPerson(p); + PeopleHelper.AddPerson(itemResult.People, p); } } break; @@ -541,7 +543,7 @@ namespace MediaBrowser.Controller.Providers { continue; } - item.AddPerson(p); + PeopleHelper.AddPerson(itemResult.People, p); } break; } @@ -833,7 +835,7 @@ namespace MediaBrowser.Controller.Providers { using (var subtree = reader.ReadSubtree()) { - FetchDataFromPersonsNode(subtree, item); + FetchDataFromPersonsNode(subtree, itemResult); } break; } @@ -1133,7 +1135,7 @@ namespace MediaBrowser.Controller.Providers /// </summary> /// <param name="reader">The reader.</param> /// <param name="item">The item.</param> - private void FetchDataFromPersonsNode(XmlReader reader, T item) + private void FetchDataFromPersonsNode(XmlReader reader, MetadataResult<T> item) { reader.MoveToContent(); @@ -1154,7 +1156,7 @@ namespace MediaBrowser.Controller.Providers { continue; } - item.AddPerson(person); + PeopleHelper.AddPerson(item.People, person); } } break; diff --git a/MediaBrowser.Controller/Providers/LocalMetadataResult.cs b/MediaBrowser.Controller/Providers/LocalMetadataResult.cs index 8be3ee7aa..76b7a3136 100644 --- a/MediaBrowser.Controller/Providers/LocalMetadataResult.cs +++ b/MediaBrowser.Controller/Providers/LocalMetadataResult.cs @@ -1,23 +1,17 @@ -using System.Collections.Generic; using MediaBrowser.Controller.Entities; -using MediaBrowser.Model.Entities; +using System.Collections.Generic; namespace MediaBrowser.Controller.Providers { - public class LocalMetadataResult<T> + public class LocalMetadataResult<T> : MetadataResult<T> where T : IHasMetadata { - public bool HasMetadata { get; set; } - public T Item { get; set; } - public List<LocalImageInfo> Images { get; set; } - public List<ChapterInfo> Chapters { get; set; } public List<UserItemData> UserDataLIst { get; set; } public LocalMetadataResult() { Images = new List<LocalImageInfo>(); - Chapters = new List<ChapterInfo>(); UserDataLIst = new List<UserItemData>(); } } diff --git a/MediaBrowser.Controller/Providers/MetadataResult.cs b/MediaBrowser.Controller/Providers/MetadataResult.cs index 756458cfa..a18dd83e8 100644 --- a/MediaBrowser.Controller/Providers/MetadataResult.cs +++ b/MediaBrowser.Controller/Providers/MetadataResult.cs @@ -1,8 +1,18 @@ +using MediaBrowser.Controller.Entities; +using System.Collections.Generic; + namespace MediaBrowser.Controller.Providers { public class MetadataResult<T> { + public List<PersonInfo> People { get; set; } + public bool HasMetadata { get; set; } public T Item { get; set; } + + public MetadataResult() + { + People = new List<PersonInfo>(); + } } }
\ No newline at end of file diff --git a/MediaBrowser.Controller/Social/ISharingManager.cs b/MediaBrowser.Controller/Social/ISharingManager.cs new file mode 100644 index 000000000..ded37771a --- /dev/null +++ b/MediaBrowser.Controller/Social/ISharingManager.cs @@ -0,0 +1,28 @@ +using MediaBrowser.Model.Social; +using System.Threading.Tasks; + +namespace MediaBrowser.Controller.Social +{ + public interface ISharingManager + { + /// <summary> + /// Creates the share. + /// </summary> + /// <param name="itemId">The item identifier.</param> + /// <param name="userId">The user identifier.</param> + /// <returns>Task<SocialShareInfo>.</returns> + Task<SocialShareInfo> CreateShare(string itemId, string userId); + /// <summary> + /// Gets the share information. + /// </summary> + /// <param name="id">The identifier.</param> + /// <returns>SocialShareInfo.</returns> + SocialShareInfo GetShareInfo(string id); + /// <summary> + /// Deletes the share. + /// </summary> + /// <param name="id">The identifier.</param> + /// <returns>Task.</returns> + Task DeleteShare(string id); + } +} diff --git a/MediaBrowser.Controller/Sync/IServerSyncProvider.cs b/MediaBrowser.Controller/Sync/IServerSyncProvider.cs index 2635a4cbf..860c736ea 100644 --- a/MediaBrowser.Controller/Sync/IServerSyncProvider.cs +++ b/MediaBrowser.Controller/Sync/IServerSyncProvider.cs @@ -49,4 +49,18 @@ namespace MediaBrowser.Controller.Sync /// <returns>Task<QueryResult<FileMetadata>>.</returns> Task<QueryResult<FileMetadata>> GetFiles(FileQuery query, SyncTarget target, CancellationToken cancellationToken); } + + public interface ISupportsDirectCopy + { + /// <summary> + /// Sends the file. + /// </summary> + /// <param name="path">The path.</param> + /// <param name="pathParts">The path parts.</param> + /// <param name="target">The target.</param> + /// <param name="progress">The progress.</param> + /// <param name="cancellationToken">The cancellation token.</param> + /// <returns>Task<SyncedFileInfo>.</returns> + Task<SyncedFileInfo> SendFile(string path, string[] pathParts, SyncTarget target, IProgress<double> progress, CancellationToken cancellationToken); + } } diff --git a/MediaBrowser.Dlna/ContentDirectory/ControlHandler.cs b/MediaBrowser.Dlna/ContentDirectory/ControlHandler.cs index 246c23462..72040c8ae 100644 --- a/MediaBrowser.Dlna/ContentDirectory/ControlHandler.cs +++ b/MediaBrowser.Dlna/ContentDirectory/ControlHandler.cs @@ -58,7 +58,7 @@ namespace MediaBrowser.Dlna.ContentDirectory _profile = profile; _config = config; - _didlBuilder = new DidlBuilder(profile, user, imageProcessor, serverAddress, accessToken, userDataManager, localization, mediaSourceManager, Logger); + _didlBuilder = new DidlBuilder(profile, user, imageProcessor, serverAddress, accessToken, userDataManager, localization, mediaSourceManager, Logger, libraryManager); } protected override IEnumerable<KeyValuePair<string, string>> GetResult(string methodName, Headers methodParams) @@ -410,18 +410,11 @@ namespace MediaBrowser.Dlna.ContentDirectory { if (stubType.Value == StubType.People) { - var items = item.People.Select(i => + var items = _libraryManager.GetPeopleItems(new InternalPeopleQuery { - try - { - return _libraryManager.GetPerson(i.Name); - } - catch - { - return null; - } + ItemId = item.Id - }).Where(i => i != null).ToArray(); + }).ToArray(); var result = new QueryResult<ServerItem> { @@ -443,7 +436,7 @@ namespace MediaBrowser.Dlna.ContentDirectory var person = item as Person; if (person != null) { - return await GetItemsFromPerson(person, user, startIndex, limit).ConfigureAwait(false); + return GetItemsFromPerson(person, user, startIndex, limit); } return ApplyPaging(new QueryResult<ServerItem>(), startIndex, limit); @@ -486,38 +479,19 @@ namespace MediaBrowser.Dlna.ContentDirectory }; } - private async Task<QueryResult<ServerItem>> GetItemsFromPerson(Person person, User user, int? startIndex, int? limit) + private QueryResult<ServerItem> GetItemsFromPerson(Person person, User user, int? startIndex, int? limit) { - var items = user.RootFolder.GetRecursiveChildren(user, i => i is Movie || i is Series && i.ContainsPerson(person.Name)) - .ToList(); - - var trailerResult = await _channelManager.GetAllMediaInternal(new AllChannelMediaQuery + var itemsWithPerson = _libraryManager.GetItems(new InternalItemsQuery { - ContentTypes = new[] { ChannelMediaContentType.MovieExtra }, - ExtraTypes = new[] { ExtraType.Trailer }, - UserId = user.Id.ToString("N") + Person = person.Name - }, CancellationToken.None).ConfigureAwait(false); + }).Items; - var currentIds = items.Select(i => i.GetProviderId(MetadataProviders.Imdb)) + var items = itemsWithPerson + .Where(i => i is Movie || i is Series || i is IChannelItem) + .Where(i => i.IsVisibleStandalone(user)) .ToList(); - var trailersToAdd = trailerResult.Items - .Where(i => i.ContainsPerson(person.Name)) - .Where(i => - { - // Try to filter out dupes using imdb id - var imdb = i.GetProviderId(MetadataProviders.Imdb); - if (!string.IsNullOrWhiteSpace(imdb) && - currentIds.Contains(imdb, StringComparer.OrdinalIgnoreCase)) - { - return false; - } - return true; - }); - - items.AddRange(trailersToAdd); - items = _libraryManager.Sort(items, user, new[] { ItemSortBy.SortName }, SortOrder.Ascending) .Skip(startIndex ?? 0) .Take(limit ?? int.MaxValue) @@ -569,7 +543,11 @@ namespace MediaBrowser.Dlna.ContentDirectory private bool EnablePeopleDisplay(BaseItem item) { - if (item.People.Count > 0) + if (_libraryManager.GetPeopleNames(new InternalPeopleQuery + { + ItemId = item.Id + + }).Count > 0) { return item is Movie; } diff --git a/MediaBrowser.Dlna/Didl/DidlBuilder.cs b/MediaBrowser.Dlna/Didl/DidlBuilder.cs index 08f770735..50a6f3ba6 100644 --- a/MediaBrowser.Dlna/Didl/DidlBuilder.cs +++ b/MediaBrowser.Dlna/Didl/DidlBuilder.cs @@ -40,8 +40,9 @@ namespace MediaBrowser.Dlna.Didl private readonly ILocalizationManager _localization; private readonly IMediaSourceManager _mediaSourceManager; private readonly ILogger _logger; + private readonly ILibraryManager _libraryManager; - public DidlBuilder(DeviceProfile profile, User user, IImageProcessor imageProcessor, string serverAddress, string accessToken, IUserDataManager userDataManager, ILocalizationManager localization, IMediaSourceManager mediaSourceManager, ILogger logger) + public DidlBuilder(DeviceProfile profile, User user, IImageProcessor imageProcessor, string serverAddress, string accessToken, IUserDataManager userDataManager, ILocalizationManager localization, IMediaSourceManager mediaSourceManager, ILogger logger, ILibraryManager libraryManager) { _profile = profile; _imageProcessor = imageProcessor; @@ -50,6 +51,7 @@ namespace MediaBrowser.Dlna.Didl _localization = localization; _mediaSourceManager = mediaSourceManager; _logger = logger; + _libraryManager = libraryManager; _accessToken = accessToken; _user = user; } @@ -654,7 +656,9 @@ namespace MediaBrowser.Dlna.Didl { var types = new[] { PersonType.Director, PersonType.Writer, PersonType.Producer, PersonType.Composer, "Creator" }; - foreach (var actor in item.People) + var people = _libraryManager.GetPeople(item); + + foreach (var actor in people) { var type = types.FirstOrDefault(i => string.Equals(i, actor.Type, StringComparison.OrdinalIgnoreCase) || string.Equals(i, actor.Role, StringComparison.OrdinalIgnoreCase)) ?? PersonType.Actor; diff --git a/MediaBrowser.Dlna/DlnaManager.cs b/MediaBrowser.Dlna/DlnaManager.cs index 2d2525919..9ce62034b 100644 --- a/MediaBrowser.Dlna/DlnaManager.cs +++ b/MediaBrowser.Dlna/DlnaManager.cs @@ -525,6 +525,7 @@ namespace MediaBrowser.Dlna new Xbox360Profile(), new XboxOneProfile(), new SonyPs3Profile(), + new SonyPs4Profile(), new SonyBravia2010Profile(), new SonyBravia2011Profile(), new SonyBravia2012Profile(), diff --git a/MediaBrowser.Dlna/MediaBrowser.Dlna.csproj b/MediaBrowser.Dlna/MediaBrowser.Dlna.csproj index 204872e7b..06aaff734 100644 --- a/MediaBrowser.Dlna/MediaBrowser.Dlna.csproj +++ b/MediaBrowser.Dlna/MediaBrowser.Dlna.csproj @@ -82,6 +82,7 @@ <Compile Include="Profiles\DirectTvProfile.cs" /> <Compile Include="Profiles\DishHopperJoeyProfile.cs" /> <Compile Include="Profiles\PopcornHourProfile.cs" /> + <Compile Include="Profiles\SonyPs4Profile.cs" /> <Compile Include="Profiles\VlcProfile.cs" /> <Compile Include="Ssdp\DeviceDiscoveryInfo.cs" /> <Compile Include="Ssdp\Extensions.cs" /> @@ -210,6 +211,9 @@ <EmbeddedResource Include="Profiles\Xml\BubbleUPnp.xml" /> <EmbeddedResource Include="Profiles\Xml\Vlc.xml" /> </ItemGroup> + <ItemGroup> + <EmbeddedResource Include="Profiles\Xml\Sony PlayStation 4.xml" /> + </ItemGroup> <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> <!-- To modify your build process, add your task inside one of the targets below and uncomment it. Other similar extension points exist, see Microsoft.Common.targets. diff --git a/MediaBrowser.Dlna/PlayTo/PlayToController.cs b/MediaBrowser.Dlna/PlayTo/PlayToController.cs index 88b48ed53..f6cf2f02d 100644 --- a/MediaBrowser.Dlna/PlayTo/PlayToController.cs +++ b/MediaBrowser.Dlna/PlayTo/PlayToController.cs @@ -478,7 +478,7 @@ namespace MediaBrowser.Dlna.PlayTo playlistItem.StreamUrl = playlistItem.StreamInfo.ToDlnaUrl(_serverAddress, _accessToken); - var itemXml = new DidlBuilder(profile, user, _imageProcessor, _serverAddress, _accessToken, _userDataManager, _localization, _mediaSourceManager, _logger) + var itemXml = new DidlBuilder(profile, user, _imageProcessor, _serverAddress, _accessToken, _userDataManager, _localization, _mediaSourceManager, _logger, _libraryManager) .GetItemDidl(item, null, _session.DeviceId, new Filter(), playlistItem.StreamInfo); playlistItem.Didl = itemXml; diff --git a/MediaBrowser.Dlna/Profiles/SonyBravia2010Profile.cs b/MediaBrowser.Dlna/Profiles/SonyBravia2010Profile.cs index b3d5f7835..a7f74b369 100644 --- a/MediaBrowser.Dlna/Profiles/SonyBravia2010Profile.cs +++ b/MediaBrowser.Dlna/Profiles/SonyBravia2010Profile.cs @@ -54,7 +54,7 @@ namespace MediaBrowser.Dlna.Profiles { Container = "ts", VideoCodec = "h264", - AudioCodec = "aac", + AudioCodec = "ac3", Type = DlnaProfileType.Video, EnableMpegtsM2TsMode = true }, @@ -333,6 +333,22 @@ namespace MediaBrowser.Dlna.Profiles Value = "he-aac" } } + }, + + new CodecProfile + { + Type = CodecType.VideoAudio, + Codec = "mp3,mp2", + + Conditions = new [] + { + new ProfileCondition + { + Condition = ProfileConditionType.LessThanEqual, + Property = ProfileConditionValue.AudioChannels, + Value = "2" + } + } } }; } diff --git a/MediaBrowser.Dlna/Profiles/SonyBravia2011Profile.cs b/MediaBrowser.Dlna/Profiles/SonyBravia2011Profile.cs index d5fa96a14..fa258dd60 100644 --- a/MediaBrowser.Dlna/Profiles/SonyBravia2011Profile.cs +++ b/MediaBrowser.Dlna/Profiles/SonyBravia2011Profile.cs @@ -51,7 +51,7 @@ namespace MediaBrowser.Dlna.Profiles { Container = "ts", VideoCodec = "h264", - AudioCodec = "aac", + AudioCodec = "ac3", Type = DlnaProfileType.Video, EnableMpegtsM2TsMode = true }, @@ -75,21 +75,21 @@ namespace MediaBrowser.Dlna.Profiles { Container = "ts", VideoCodec = "mpeg2video", - AudioCodec = "mp3,mp2", + AudioCodec = "mp3", Type = DlnaProfileType.Video }, new DirectPlayProfile { Container = "mp4", VideoCodec = "h264,mpeg4", - AudioCodec = "ac3,aac,mp3,mp2", + AudioCodec = "ac3,aac,mp3", Type = DlnaProfileType.Video }, new DirectPlayProfile { Container = "mpeg", VideoCodec = "mpeg2video,mpeg1video", - AudioCodec = "mp3,mp2", + AudioCodec = "mp3", Type = DlnaProfileType.Video }, new DirectPlayProfile @@ -350,6 +350,22 @@ namespace MediaBrowser.Dlna.Profiles Value = "he-aac" } } + }, + + new CodecProfile + { + Type = CodecType.VideoAudio, + Codec = "mp3,mp2", + + Conditions = new [] + { + new ProfileCondition + { + Condition = ProfileConditionType.LessThanEqual, + Property = ProfileConditionValue.AudioChannels, + Value = "2" + } + } } }; } diff --git a/MediaBrowser.Dlna/Profiles/SonyBravia2012Profile.cs b/MediaBrowser.Dlna/Profiles/SonyBravia2012Profile.cs index 9f5740562..a35cfc0df 100644 --- a/MediaBrowser.Dlna/Profiles/SonyBravia2012Profile.cs +++ b/MediaBrowser.Dlna/Profiles/SonyBravia2012Profile.cs @@ -51,7 +51,7 @@ namespace MediaBrowser.Dlna.Profiles { Container = "ts", VideoCodec = "h264", - AudioCodec = "aac", + AudioCodec = "ac3", Type = DlnaProfileType.Video, EnableMpegtsM2TsMode = true }, @@ -268,6 +268,22 @@ namespace MediaBrowser.Dlna.Profiles Value = "6" } } + }, + + new CodecProfile + { + Type = CodecType.VideoAudio, + Codec = "mp3,mp2", + + Conditions = new [] + { + new ProfileCondition + { + Condition = ProfileConditionType.LessThanEqual, + Property = ProfileConditionValue.AudioChannels, + Value = "2" + } + } } }; } diff --git a/MediaBrowser.Dlna/Profiles/SonyBravia2013Profile.cs b/MediaBrowser.Dlna/Profiles/SonyBravia2013Profile.cs index 9ab286952..16ff5dac5 100644 --- a/MediaBrowser.Dlna/Profiles/SonyBravia2013Profile.cs +++ b/MediaBrowser.Dlna/Profiles/SonyBravia2013Profile.cs @@ -50,7 +50,7 @@ namespace MediaBrowser.Dlna.Profiles { Container = "ts", VideoCodec = "h264", - AudioCodec = "aac", + AudioCodec = "ac3", Type = DlnaProfileType.Video, EnableMpegtsM2TsMode = true }, @@ -286,6 +286,22 @@ namespace MediaBrowser.Dlna.Profiles Value = "30" } } + }, + + new CodecProfile + { + Type = CodecType.VideoAudio, + Codec = "mp3,mp2", + + Conditions = new [] + { + new ProfileCondition + { + Condition = ProfileConditionType.LessThanEqual, + Property = ProfileConditionValue.AudioChannels, + Value = "2" + } + } } }; } diff --git a/MediaBrowser.Dlna/Profiles/SonyPs4Profile.cs b/MediaBrowser.Dlna/Profiles/SonyPs4Profile.cs new file mode 100644 index 000000000..dd974d252 --- /dev/null +++ b/MediaBrowser.Dlna/Profiles/SonyPs4Profile.cs @@ -0,0 +1,260 @@ +using MediaBrowser.Model.Dlna; +using System.Xml.Serialization; + +namespace MediaBrowser.Dlna.Profiles +{ + [XmlRoot("Profile")] + public class SonyPs4Profile : DefaultProfile + { + public SonyPs4Profile() + { + Name = "Sony PlayStation 4"; + + Identification = new DeviceIdentification + { + FriendlyName = "PLAYSTATION 4", + + Headers = new[] + { + new HttpHeaderInfo + { + Name = "User-Agent", + Value = @"PLAYSTATION 4", + Match = HeaderMatchType.Substring + }, + + new HttpHeaderInfo + { + Name = "X-AV-Client-Info", + Value = @"PLAYSTATION 4", + Match = HeaderMatchType.Substring + } + } + }; + + AlbumArtPn = "JPEG_TN"; + + SonyAggregationFlags = "10"; + XDlnaDoc = "DMS-1.50"; + EnableSingleAlbumArtLimit = true; + + DirectPlayProfiles = new[] + { + new DirectPlayProfile + { + Container = "avi", + Type = DlnaProfileType.Video, + VideoCodec = "mpeg4", + AudioCodec = "mp2,mp3" + }, + new DirectPlayProfile + { + Container = "ts", + Type = DlnaProfileType.Video, + VideoCodec = "mpeg1video,mpeg2video,h264", + AudioCodec = "ac3,mp2,mp3,aac" + }, + new DirectPlayProfile + { + Container = "mpeg", + Type = DlnaProfileType.Video, + VideoCodec = "mpeg1video,mpeg2video", + AudioCodec = "mp2" + }, + new DirectPlayProfile + { + Container = "mp4,mkv", + Type = DlnaProfileType.Video, + VideoCodec = "h264,mpeg4", + AudioCodec = "aac,ac3" + }, + new DirectPlayProfile + { + Container = "aac,mp3,wav", + Type = DlnaProfileType.Audio + }, + new DirectPlayProfile + { + Container = "jpeg,png,gif,bmp,tiff", + Type = DlnaProfileType.Photo + } + }; + + TranscodingProfiles = new[] + { + new TranscodingProfile + { + Container = "mp3", + AudioCodec = "mp3", + Type = DlnaProfileType.Audio + }, + new TranscodingProfile + { + Container = "ts", + VideoCodec = "h264", + AudioCodec = "mp3", + Type = DlnaProfileType.Video + }, + new TranscodingProfile + { + Container = "jpeg", + Type = DlnaProfileType.Photo + } + }; + + ContainerProfiles = new[] + { + new ContainerProfile + { + Type = DlnaProfileType.Photo, + + Conditions = new [] + { + new ProfileCondition + { + Condition = ProfileConditionType.LessThanEqual, + Property = ProfileConditionValue.Width, + Value = "1920" + }, + new ProfileCondition + { + Condition = ProfileConditionType.LessThanEqual, + Property = ProfileConditionValue.Height, + Value = "1080" + } + } + } + }; + + CodecProfiles = new[] + { + new CodecProfile + { + Type = CodecType.Video, + Codec = "h264", + + Conditions = new [] + { + new ProfileCondition + { + Condition = ProfileConditionType.LessThanEqual, + Property = ProfileConditionValue.Width, + Value = "1920" + }, + new ProfileCondition + { + Condition = ProfileConditionType.LessThanEqual, + Property = ProfileConditionValue.Height, + Value = "1080" + }, + new ProfileCondition + { + Condition = ProfileConditionType.LessThanEqual, + Property = ProfileConditionValue.VideoFramerate, + Value = "30", + IsRequired = false + }, + new ProfileCondition + { + Condition = ProfileConditionType.LessThanEqual, + Property = ProfileConditionValue.VideoBitrate, + Value = "15360000", + IsRequired = false + }, + new ProfileCondition + { + Condition = ProfileConditionType.LessThanEqual, + Property = ProfileConditionValue.VideoLevel, + Value = "41", + IsRequired = false + } + } + }, + + new CodecProfile + { + Type = CodecType.VideoAudio, + Codec = "ac3", + + Conditions = new [] + { + new ProfileCondition + { + Condition = ProfileConditionType.LessThanEqual, + Property = ProfileConditionValue.AudioChannels, + Value = "6", + IsRequired = false + }, + + new ProfileCondition + { + Condition = ProfileConditionType.LessThanEqual, + Property = ProfileConditionValue.AudioBitrate, + Value = "640000", + IsRequired = false + } + } + }, + + new CodecProfile + { + Type = CodecType.VideoAudio, + Codec = "wmapro", + + Conditions = new [] + { + new ProfileCondition + { + Condition = ProfileConditionType.LessThanEqual, + Property = ProfileConditionValue.AudioChannels, + Value = "2" + } + } + }, + + new CodecProfile + { + Type = CodecType.VideoAudio, + Codec = "aac", + + Conditions = new [] + { + new ProfileCondition + { + Condition = ProfileConditionType.NotEquals, + Property = ProfileConditionValue.AudioProfile, + Value = "he-aac", + IsRequired = false + } + } + } + }; + + ResponseProfiles = new[] + { + new ResponseProfile + { + Container = "mp4,mov", + AudioCodec="aac", + MimeType = "video/mp4", + Type = DlnaProfileType.Video + }, + + new ResponseProfile + { + Container = "avi", + MimeType = "video/divx", + OrgPn="AVI", + Type = DlnaProfileType.Video + }, + + new ResponseProfile + { + Container = "wav", + MimeType = "audio/wav", + Type = DlnaProfileType.Audio + } + }; + } + } +} diff --git a/MediaBrowser.Dlna/Profiles/Xml/Sony Bravia (2010).xml b/MediaBrowser.Dlna/Profiles/Xml/Sony Bravia (2010).xml index a3469128f..65252f749 100644 --- a/MediaBrowser.Dlna/Profiles/Xml/Sony Bravia (2010).xml +++ b/MediaBrowser.Dlna/Profiles/Xml/Sony Bravia (2010).xml @@ -47,7 +47,7 @@ </DirectPlayProfiles> <TranscodingProfiles> <TranscodingProfile container="mp3" type="Audio" audioCodec="mp3" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" context="Streaming" /> - <TranscodingProfile container="ts" type="Video" videoCodec="h264" audioCodec="aac" estimateContentLength="false" enableMpegtsM2TsMode="true" transcodeSeekInfo="Auto" context="Streaming" /> + <TranscodingProfile container="ts" type="Video" videoCodec="h264" audioCodec="ac3" estimateContentLength="false" enableMpegtsM2TsMode="true" transcodeSeekInfo="Auto" context="Streaming" /> <TranscodingProfile container="jpeg" type="Photo" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" context="Streaming" /> </TranscodingProfiles> <ContainerProfiles> @@ -94,6 +94,11 @@ <ProfileCondition condition="NotEquals" property="AudioProfile" value="he-aac" isRequired="true" /> </Conditions> </CodecProfile> + <CodecProfile type="VideoAudio" codec="mp3,mp2"> + <Conditions> + <ProfileCondition condition="LessThanEqual" property="AudioChannels" value="2" isRequired="true" /> + </Conditions> + </CodecProfile> </CodecProfiles> <ResponseProfiles> <ResponseProfile container="ts" audioCodec="ac3,aac,mp3" videoCodec="h264" type="Video" orgPn="AVC_TS_HD_24_AC3_T,AVC_TS_HD_50_AC3_T,AVC_TS_HD_60_AC3_T,AVC_TS_HD_EU_T" mimeType="video/vnd.dlna.mpeg-tts"> diff --git a/MediaBrowser.Dlna/Profiles/Xml/Sony Bravia (2011).xml b/MediaBrowser.Dlna/Profiles/Xml/Sony Bravia (2011).xml index 3c7adc71e..5f7f0a2ee 100644 --- a/MediaBrowser.Dlna/Profiles/Xml/Sony Bravia (2011).xml +++ b/MediaBrowser.Dlna/Profiles/Xml/Sony Bravia (2011).xml @@ -41,16 +41,16 @@ </XmlRootAttributes> <DirectPlayProfiles> <DirectPlayProfile container="ts" audioCodec="ac3,aac,mp3" videoCodec="h264" type="Video" /> - <DirectPlayProfile container="ts" audioCodec="mp3,mp2" videoCodec="mpeg2video" type="Video" /> - <DirectPlayProfile container="mp4" audioCodec="ac3,aac,mp3,mp2" videoCodec="h264,mpeg4" type="Video" /> - <DirectPlayProfile container="mpeg" audioCodec="mp3,mp2" videoCodec="mpeg2video,mpeg1video" type="Video" /> + <DirectPlayProfile container="ts" audioCodec="mp3" videoCodec="mpeg2video" type="Video" /> + <DirectPlayProfile container="mp4" audioCodec="ac3,aac,mp3" videoCodec="h264,mpeg4" type="Video" /> + <DirectPlayProfile container="mpeg" audioCodec="mp3" videoCodec="mpeg2video,mpeg1video" type="Video" /> <DirectPlayProfile container="asf" audioCodec="wmav2,wmapro,wmavoice" videoCodec="wmv2,wmv3,vc1" type="Video" /> <DirectPlayProfile container="mp3" audioCodec="mp3" type="Audio" /> <DirectPlayProfile container="asf" audioCodec="wmav2,wmapro,wmavoice" type="Audio" /> </DirectPlayProfiles> <TranscodingProfiles> <TranscodingProfile container="mp3" type="Audio" audioCodec="mp3" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" context="Streaming" /> - <TranscodingProfile container="ts" type="Video" videoCodec="h264" audioCodec="aac" estimateContentLength="false" enableMpegtsM2TsMode="true" transcodeSeekInfo="Auto" context="Streaming" /> + <TranscodingProfile container="ts" type="Video" videoCodec="h264" audioCodec="ac3" estimateContentLength="false" enableMpegtsM2TsMode="true" transcodeSeekInfo="Auto" context="Streaming" /> <TranscodingProfile container="jpeg" type="Photo" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" context="Streaming" /> </TranscodingProfiles> <ContainerProfiles> @@ -97,6 +97,11 @@ <ProfileCondition condition="NotEquals" property="AudioProfile" value="he-aac" isRequired="true" /> </Conditions> </CodecProfile> + <CodecProfile type="VideoAudio" codec="mp3,mp2"> + <Conditions> + <ProfileCondition condition="LessThanEqual" property="AudioChannels" value="2" isRequired="true" /> + </Conditions> + </CodecProfile> </CodecProfiles> <ResponseProfiles> <ResponseProfile container="ts" audioCodec="ac3,aac,mp3" videoCodec="h264" type="Video" orgPn="AVC_TS_HD_24_AC3_T,AVC_TS_HD_50_AC3_T,AVC_TS_HD_60_AC3_T,AVC_TS_HD_EU_T" mimeType="video/vnd.dlna.mpeg-tts"> diff --git a/MediaBrowser.Dlna/Profiles/Xml/Sony Bravia (2012).xml b/MediaBrowser.Dlna/Profiles/Xml/Sony Bravia (2012).xml index 07d684d89..0951d5e0e 100644 --- a/MediaBrowser.Dlna/Profiles/Xml/Sony Bravia (2012).xml +++ b/MediaBrowser.Dlna/Profiles/Xml/Sony Bravia (2012).xml @@ -52,7 +52,7 @@ </DirectPlayProfiles> <TranscodingProfiles> <TranscodingProfile container="mp3" type="Audio" audioCodec="mp3" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" context="Streaming" /> - <TranscodingProfile container="ts" type="Video" videoCodec="h264" audioCodec="aac" estimateContentLength="false" enableMpegtsM2TsMode="true" transcodeSeekInfo="Auto" context="Streaming" /> + <TranscodingProfile container="ts" type="Video" videoCodec="h264" audioCodec="ac3" estimateContentLength="false" enableMpegtsM2TsMode="true" transcodeSeekInfo="Auto" context="Streaming" /> <TranscodingProfile container="jpeg" type="Photo" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" context="Streaming" /> </TranscodingProfiles> <ContainerProfiles> @@ -76,6 +76,11 @@ <ProfileCondition condition="LessThanEqual" property="AudioChannels" value="6" isRequired="true" /> </Conditions> </CodecProfile> + <CodecProfile type="VideoAudio" codec="mp3,mp2"> + <Conditions> + <ProfileCondition condition="LessThanEqual" property="AudioChannels" value="2" isRequired="true" /> + </Conditions> + </CodecProfile> </CodecProfiles> <ResponseProfiles> <ResponseProfile container="ts" audioCodec="ac3,aac,mp3" videoCodec="h264" type="Video" orgPn="AVC_TS_HD_24_AC3_T,AVC_TS_HD_50_AC3_T,AVC_TS_HD_60_AC3_T,AVC_TS_HD_EU_T" mimeType="video/vnd.dlna.mpeg-tts"> diff --git a/MediaBrowser.Dlna/Profiles/Xml/Sony Bravia (2013).xml b/MediaBrowser.Dlna/Profiles/Xml/Sony Bravia (2013).xml index 81050d8fb..d3a7dbab9 100644 --- a/MediaBrowser.Dlna/Profiles/Xml/Sony Bravia (2013).xml +++ b/MediaBrowser.Dlna/Profiles/Xml/Sony Bravia (2013).xml @@ -57,7 +57,7 @@ </DirectPlayProfiles> <TranscodingProfiles> <TranscodingProfile container="mp3" type="Audio" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" context="Streaming" /> - <TranscodingProfile container="ts" type="Video" videoCodec="h264" audioCodec="aac" estimateContentLength="false" enableMpegtsM2TsMode="true" transcodeSeekInfo="Auto" context="Streaming" /> + <TranscodingProfile container="ts" type="Video" videoCodec="h264" audioCodec="ac3" estimateContentLength="false" enableMpegtsM2TsMode="true" transcodeSeekInfo="Auto" context="Streaming" /> <TranscodingProfile container="jpeg" type="Photo" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" context="Streaming" /> </TranscodingProfiles> <ContainerProfiles> @@ -76,6 +76,11 @@ <ProfileCondition condition="LessThanEqual" property="VideoFramerate" value="30" isRequired="true" /> </Conditions> </CodecProfile> + <CodecProfile type="VideoAudio" codec="mp3,mp2"> + <Conditions> + <ProfileCondition condition="LessThanEqual" property="AudioChannels" value="2" isRequired="true" /> + </Conditions> + </CodecProfile> </CodecProfiles> <ResponseProfiles> <ResponseProfile container="ts" audioCodec="ac3,aac,mp3" videoCodec="h264" type="Video" orgPn="AVC_TS_HD_24_AC3_T,AVC_TS_HD_50_AC3_T,AVC_TS_HD_60_AC3_T,AVC_TS_HD_EU_T" mimeType="video/vnd.dlna.mpeg-tts"> diff --git a/MediaBrowser.Dlna/Profiles/Xml/Sony PlayStation 4.xml b/MediaBrowser.Dlna/Profiles/Xml/Sony PlayStation 4.xml new file mode 100644 index 000000000..3b372aec5 --- /dev/null +++ b/MediaBrowser.Dlna/Profiles/Xml/Sony PlayStation 4.xml @@ -0,0 +1,100 @@ +<?xml version="1.0"?> +<Profile xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> + <Name>Sony PlayStation 4</Name> + <Identification> + <FriendlyName>PLAYSTATION 4</FriendlyName> + <Headers> + <HttpHeaderInfo name="User-Agent" value="PLAYSTATION 4" match="Substring" /> + <HttpHeaderInfo name="X-AV-Client-Info" value="PLAYSTATION 4" match="Substring" /> + </Headers> + </Identification> + <FriendlyName>Emby</FriendlyName> + <Manufacturer>Emby</Manufacturer> + <ManufacturerUrl>http://emby.media/</ManufacturerUrl> + <ModelName>Emby</ModelName> + <ModelDescription>Emby</ModelDescription> + <ModelNumber>Emby</ModelNumber> + <ModelUrl>http://emby.media/</ModelUrl> + <EnableAlbumArtInDidl>false</EnableAlbumArtInDidl> + <EnableSingleAlbumArtLimit>true</EnableSingleAlbumArtLimit> + <SupportedMediaTypes>Audio,Photo,Video</SupportedMediaTypes> + <AlbumArtPn>JPEG_TN</AlbumArtPn> + <MaxAlbumArtWidth>480</MaxAlbumArtWidth> + <MaxAlbumArtHeight>480</MaxAlbumArtHeight> + <MaxIconWidth>48</MaxIconWidth> + <MaxIconHeight>48</MaxIconHeight> + <MaxStreamingBitrate>10000000</MaxStreamingBitrate> + <MaxStaticBitrate>10000000</MaxStaticBitrate> + <MusicStreamingTranscodingBitrate>128000</MusicStreamingTranscodingBitrate> + <MusicSyncBitrate>128000</MusicSyncBitrate> + <XDlnaDoc>DMS-1.50</XDlnaDoc> + <SonyAggregationFlags>10</SonyAggregationFlags> + <ProtocolInfo>http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_AC3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_AC3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_HD_50_AC3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/mpeg:DLNA.ORG_PN=MP3;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=44100;channels=1:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=44100;channels=2:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=48000;channels=1:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=48000;channels=2:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMA_BASE;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMA_FULL;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_SM;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_MED;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_LRG;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_TN;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG1;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_PAL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_NTSC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_EU;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_EU_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_EU_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_NA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_NA_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_NA_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_KO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_KO_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_KO_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-msvideo:DLNA.ORG_PN=AVI;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-matroska:DLNA.ORG_PN=MATROSKA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_AC3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_HD_720p_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_HD_1080i_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_HP_HD_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_LPCM;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_ASP_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_SP_L6_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_NDSD;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_LPCM_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_BASE;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_FULL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVHIGH_FULL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_PRO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVHIGH_PRO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L1_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L2_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L3_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000</ProtocolInfo> + <TimelineOffsetSeconds>0</TimelineOffsetSeconds> + <RequiresPlainVideoItems>false</RequiresPlainVideoItems> + <RequiresPlainFolders>false</RequiresPlainFolders> + <EnableMSMediaReceiverRegistrar>false</EnableMSMediaReceiverRegistrar> + <IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests> + <EnableDlnaProtocol>true</EnableDlnaProtocol> + <XmlRootAttributes /> + <DirectPlayProfiles> + <DirectPlayProfile container="avi" audioCodec="mp2,mp3" videoCodec="mpeg4" type="Video" /> + <DirectPlayProfile container="ts" audioCodec="ac3,mp2,mp3,aac" videoCodec="mpeg1video,mpeg2video,h264" type="Video" /> + <DirectPlayProfile container="mpeg" audioCodec="mp2" videoCodec="mpeg1video,mpeg2video" type="Video" /> + <DirectPlayProfile container="mp4,mkv" audioCodec="aac,ac3" videoCodec="h264,mpeg4" type="Video" /> + <DirectPlayProfile container="aac,mp3,wav" type="Audio" /> + <DirectPlayProfile container="jpeg,png,gif,bmp,tiff" type="Photo" /> + </DirectPlayProfiles> + <TranscodingProfiles> + <TranscodingProfile container="mp3" type="Audio" audioCodec="mp3" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" context="Streaming" /> + <TranscodingProfile container="ts" type="Video" videoCodec="h264" audioCodec="mp3" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" context="Streaming" /> + <TranscodingProfile container="jpeg" type="Photo" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" context="Streaming" /> + </TranscodingProfiles> + <ContainerProfiles> + <ContainerProfile type="Photo"> + <Conditions> + <ProfileCondition condition="LessThanEqual" property="Width" value="1920" isRequired="true" /> + <ProfileCondition condition="LessThanEqual" property="Height" value="1080" isRequired="true" /> + </Conditions> + </ContainerProfile> + </ContainerProfiles> + <CodecProfiles> + <CodecProfile type="Video" codec="h264"> + <Conditions> + <ProfileCondition condition="LessThanEqual" property="Width" value="1920" isRequired="true" /> + <ProfileCondition condition="LessThanEqual" property="Height" value="1080" isRequired="true" /> + <ProfileCondition condition="LessThanEqual" property="VideoFramerate" value="30" isRequired="false" /> + <ProfileCondition condition="LessThanEqual" property="VideoBitrate" value="15360000" isRequired="false" /> + <ProfileCondition condition="LessThanEqual" property="VideoLevel" value="41" isRequired="false" /> + </Conditions> + </CodecProfile> + <CodecProfile type="VideoAudio" codec="ac3"> + <Conditions> + <ProfileCondition condition="LessThanEqual" property="AudioChannels" value="6" isRequired="false" /> + <ProfileCondition condition="LessThanEqual" property="AudioBitrate" value="640000" isRequired="false" /> + </Conditions> + </CodecProfile> + <CodecProfile type="VideoAudio" codec="wmapro"> + <Conditions> + <ProfileCondition condition="LessThanEqual" property="AudioChannels" value="2" isRequired="true" /> + </Conditions> + </CodecProfile> + <CodecProfile type="VideoAudio" codec="aac"> + <Conditions> + <ProfileCondition condition="NotEquals" property="AudioProfile" value="he-aac" isRequired="false" /> + </Conditions> + </CodecProfile> + </CodecProfiles> + <ResponseProfiles> + <ResponseProfile container="mp4,mov" audioCodec="aac" type="Video" mimeType="video/mp4"> + <Conditions /> + </ResponseProfile> + <ResponseProfile container="avi" type="Video" orgPn="AVI" mimeType="video/divx"> + <Conditions /> + </ResponseProfile> + <ResponseProfile container="wav" type="Audio" mimeType="audio/wav"> + <Conditions /> + </ResponseProfile> + </ResponseProfiles> + <SubtitleProfiles /> +</Profile>
\ No newline at end of file diff --git a/MediaBrowser.LocalMetadata/Parsers/BoxSetXmlParser.cs b/MediaBrowser.LocalMetadata/Parsers/BoxSetXmlParser.cs index f89e29d54..772af0673 100644 --- a/MediaBrowser.LocalMetadata/Parsers/BoxSetXmlParser.cs +++ b/MediaBrowser.LocalMetadata/Parsers/BoxSetXmlParser.cs @@ -14,7 +14,7 @@ namespace MediaBrowser.LocalMetadata.Parsers { } - protected override void FetchDataFromXmlNode(XmlReader reader, BoxSet item) + protected override void FetchDataFromXmlNode(XmlReader reader, MetadataResult<BoxSet> item) { switch (reader.Name) { @@ -32,7 +32,7 @@ namespace MediaBrowser.LocalMetadata.Parsers } } - private void FetchFromCollectionItemsNode(XmlReader reader, BoxSet item) + private void FetchFromCollectionItemsNode(XmlReader reader, MetadataResult<BoxSet> item) { reader.MoveToContent(); @@ -66,7 +66,7 @@ namespace MediaBrowser.LocalMetadata.Parsers } } - item.LinkedChildren = list; + item.Item.LinkedChildren = list; } } } diff --git a/MediaBrowser.LocalMetadata/Parsers/EpisodeXmlParser.cs b/MediaBrowser.LocalMetadata/Parsers/EpisodeXmlParser.cs index 8430f3b3c..08454c8e7 100644 --- a/MediaBrowser.LocalMetadata/Parsers/EpisodeXmlParser.cs +++ b/MediaBrowser.LocalMetadata/Parsers/EpisodeXmlParser.cs @@ -1,13 +1,13 @@ -using System; +using MediaBrowser.Controller.Entities.TV; +using MediaBrowser.Controller.Providers; +using MediaBrowser.Model.Entities; +using MediaBrowser.Model.Logging; +using System; using System.Collections.Generic; using System.Globalization; using System.IO; using System.Threading; using System.Xml; -using MediaBrowser.Controller.Entities.TV; -using MediaBrowser.Controller.Providers; -using MediaBrowser.Model.Entities; -using MediaBrowser.Model.Logging; namespace MediaBrowser.LocalMetadata.Parsers { @@ -17,7 +17,6 @@ namespace MediaBrowser.LocalMetadata.Parsers public class EpisodeXmlParser : BaseItemXmlParser<Episode> { private List<LocalImageInfo> _imagesFound; - private List<ChapterInfo> _chaptersFound; public EpisodeXmlParser(ILogger logger) : base(logger) @@ -26,14 +25,12 @@ namespace MediaBrowser.LocalMetadata.Parsers private string _xmlPath; - public void Fetch(Episode item, + public void Fetch(MetadataResult<Episode> item, List<LocalImageInfo> images, - List<ChapterInfo> chapters, string metadataFile, CancellationToken cancellationToken) { _imagesFound = images; - _chaptersFound = chapters; _xmlPath = metadataFile; Fetch(item, metadataFile, cancellationToken); @@ -45,16 +42,13 @@ namespace MediaBrowser.LocalMetadata.Parsers /// Fetches the data from XML node. /// </summary> /// <param name="reader">The reader.</param> - /// <param name="item">The item.</param> - protected override void FetchDataFromXmlNode(XmlReader reader, Episode item) + /// <param name="result">The result.</param> + protected override void FetchDataFromXmlNode(XmlReader reader, MetadataResult<Episode> result) { + var item = result.Item; + switch (reader.Name) { - case "Chapters": - - _chaptersFound.AddRange(FetchChaptersFromXmlNode(item, reader.ReadSubtree())); - break; - case "Episode": //MB generated metadata is within an "Episode" node @@ -67,7 +61,7 @@ namespace MediaBrowser.LocalMetadata.Parsers { if (subTree.NodeType == XmlNodeType.Element) { - FetchDataFromXmlNode(subTree, item); + FetchDataFromXmlNode(subTree, result); } } @@ -263,7 +257,7 @@ namespace MediaBrowser.LocalMetadata.Parsers default: - base.FetchDataFromXmlNode(reader, item); + base.FetchDataFromXmlNode(reader, result); break; } } diff --git a/MediaBrowser.LocalMetadata/Parsers/GameSystemXmlParser.cs b/MediaBrowser.LocalMetadata/Parsers/GameSystemXmlParser.cs index d449108c4..8ae0eafec 100644 --- a/MediaBrowser.LocalMetadata/Parsers/GameSystemXmlParser.cs +++ b/MediaBrowser.LocalMetadata/Parsers/GameSystemXmlParser.cs @@ -16,7 +16,7 @@ namespace MediaBrowser.LocalMetadata.Parsers } private readonly Task _cachedTask = Task.FromResult(true); - public Task FetchAsync(GameSystem item, string metadataFile, CancellationToken cancellationToken) + public Task FetchAsync(MetadataResult<GameSystem> item, string metadataFile, CancellationToken cancellationToken) { Fetch(item, metadataFile, cancellationToken); @@ -29,9 +29,11 @@ namespace MediaBrowser.LocalMetadata.Parsers /// Fetches the data from XML node. /// </summary> /// <param name="reader">The reader.</param> - /// <param name="item">The item.</param> - protected override void FetchDataFromXmlNode(XmlReader reader, GameSystem item) + /// <param name="result">The result.</param> + protected override void FetchDataFromXmlNode(XmlReader reader, MetadataResult<GameSystem> result) { + var item = result.Item; + switch (reader.Name) { case "GameSystem": @@ -56,7 +58,7 @@ namespace MediaBrowser.LocalMetadata.Parsers default: - base.FetchDataFromXmlNode(reader, item); + base.FetchDataFromXmlNode(reader, result); break; } } diff --git a/MediaBrowser.LocalMetadata/Parsers/GameXmlParser.cs b/MediaBrowser.LocalMetadata/Parsers/GameXmlParser.cs index 2caced8a9..b5a68c61f 100644 --- a/MediaBrowser.LocalMetadata/Parsers/GameXmlParser.cs +++ b/MediaBrowser.LocalMetadata/Parsers/GameXmlParser.cs @@ -22,7 +22,7 @@ namespace MediaBrowser.LocalMetadata.Parsers } private readonly Task _cachedTask = Task.FromResult(true); - public Task FetchAsync(Game item, string metadataFile, CancellationToken cancellationToken) + public Task FetchAsync(MetadataResult<Game> item, string metadataFile, CancellationToken cancellationToken) { Fetch(item, metadataFile, cancellationToken); @@ -35,9 +35,11 @@ namespace MediaBrowser.LocalMetadata.Parsers /// Fetches the data from XML node. /// </summary> /// <param name="reader">The reader.</param> - /// <param name="item">The item.</param> - protected override void FetchDataFromXmlNode(XmlReader reader, Game item) + /// <param name="result">The result.</param> + protected override void FetchDataFromXmlNode(XmlReader reader, MetadataResult<Game> result) { + var item = result.Item; + switch (reader.Name) { case "GameSystem": @@ -97,7 +99,7 @@ namespace MediaBrowser.LocalMetadata.Parsers default: - base.FetchDataFromXmlNode(reader, item); + base.FetchDataFromXmlNode(reader, result); break; } } diff --git a/MediaBrowser.LocalMetadata/Parsers/MovieXmlParser.cs b/MediaBrowser.LocalMetadata/Parsers/MovieXmlParser.cs index 388a0d20d..0b434231f 100644 --- a/MediaBrowser.LocalMetadata/Parsers/MovieXmlParser.cs +++ b/MediaBrowser.LocalMetadata/Parsers/MovieXmlParser.cs @@ -1,43 +1,31 @@ -using System.Collections.Generic; -using System.Threading; -using System.Xml; -using MediaBrowser.Controller.Entities; +using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities.Movies; using MediaBrowser.Controller.Providers; -using MediaBrowser.Model.Entities; using MediaBrowser.Model.Logging; +using System.Xml; namespace MediaBrowser.LocalMetadata.Parsers { /// <summary> /// Class EpisodeXmlParser /// </summary> - public class MovieXmlParser : BaseItemXmlParser<Video> + public class BaseVideoXmlParser<T> : BaseItemXmlParser<T> + where T : Video { - private List<ChapterInfo> _chaptersFound; - - public MovieXmlParser(ILogger logger) + public BaseVideoXmlParser(ILogger logger) : base(logger) { } - public void Fetch(Video item, - List<ChapterInfo> chapters, - string metadataFile, - CancellationToken cancellationToken) - { - _chaptersFound = chapters; - - Fetch(item, metadataFile, cancellationToken); - } - /// <summary> /// Fetches the data from XML node. /// </summary> /// <param name="reader">The reader.</param> - /// <param name="item">The item.</param> - protected override void FetchDataFromXmlNode(XmlReader reader, Video item) + /// <param name="result">The result.</param> + protected override void FetchDataFromXmlNode(XmlReader reader, MetadataResult<T> result) { + var item = result.Item; + switch (reader.Name) { case "TmdbCollectionName": @@ -53,15 +41,25 @@ namespace MediaBrowser.LocalMetadata.Parsers break; } - case "Chapters": - - _chaptersFound.AddRange(FetchChaptersFromXmlNode(item, reader.ReadSubtree())); - break; - default: - base.FetchDataFromXmlNode(reader, item); + base.FetchDataFromXmlNode(reader, result); break; } } } + + public class MovieXmlParser : BaseVideoXmlParser<Movie> + { + public MovieXmlParser(ILogger logger) : base(logger) + { + } + } + + public class VideoXmlParser : BaseVideoXmlParser<Video> + { + public VideoXmlParser(ILogger logger) + : base(logger) + { + } + } } diff --git a/MediaBrowser.LocalMetadata/Parsers/MusicVideoXmlParser.cs b/MediaBrowser.LocalMetadata/Parsers/MusicVideoXmlParser.cs index f695487c5..d93746aa0 100644 --- a/MediaBrowser.LocalMetadata/Parsers/MusicVideoXmlParser.cs +++ b/MediaBrowser.LocalMetadata/Parsers/MusicVideoXmlParser.cs @@ -6,7 +6,7 @@ using System.Xml; namespace MediaBrowser.LocalMetadata.Parsers { - public class MusicVideoXmlParser : BaseItemXmlParser<MusicVideo> + public class MusicVideoXmlParser : BaseVideoXmlParser<MusicVideo> { /// <summary> /// Initializes a new instance of the <see cref="BaseItemXmlParser{T}" /> class. @@ -21,9 +21,11 @@ namespace MediaBrowser.LocalMetadata.Parsers /// Fetches the data from XML node. /// </summary> /// <param name="reader">The reader.</param> - /// <param name="item">The item.</param> - protected override void FetchDataFromXmlNode(XmlReader reader, MusicVideo item) + /// <param name="result">The result.</param> + protected override void FetchDataFromXmlNode(XmlReader reader, MetadataResult<MusicVideo> result) { + var item = result.Item; + switch (reader.Name) { case "Artist": @@ -44,7 +46,7 @@ namespace MediaBrowser.LocalMetadata.Parsers break; default: - base.FetchDataFromXmlNode(reader, item); + base.FetchDataFromXmlNode(reader, result); break; } } diff --git a/MediaBrowser.LocalMetadata/Parsers/PlaylistXmlParser.cs b/MediaBrowser.LocalMetadata/Parsers/PlaylistXmlParser.cs index 02457ee73..d4552fe12 100644 --- a/MediaBrowser.LocalMetadata/Parsers/PlaylistXmlParser.cs +++ b/MediaBrowser.LocalMetadata/Parsers/PlaylistXmlParser.cs @@ -16,8 +16,10 @@ namespace MediaBrowser.LocalMetadata.Parsers { } - protected override void FetchDataFromXmlNode(XmlReader reader, Playlist item) + protected override void FetchDataFromXmlNode(XmlReader reader, MetadataResult<Playlist> result) { + var item = result.Item; + switch (reader.Name) { case "OwnerUserId": @@ -59,7 +61,7 @@ namespace MediaBrowser.LocalMetadata.Parsers break; default: - base.FetchDataFromXmlNode(reader, item); + base.FetchDataFromXmlNode(reader, result); break; } } diff --git a/MediaBrowser.LocalMetadata/Parsers/SeasonXmlParser.cs b/MediaBrowser.LocalMetadata/Parsers/SeasonXmlParser.cs index 62a7d37cf..7fd60d3f7 100644 --- a/MediaBrowser.LocalMetadata/Parsers/SeasonXmlParser.cs +++ b/MediaBrowser.LocalMetadata/Parsers/SeasonXmlParser.cs @@ -16,9 +16,11 @@ namespace MediaBrowser.LocalMetadata.Parsers /// Fetches the data from XML node. /// </summary> /// <param name="reader">The reader.</param> - /// <param name="item">The item.</param> - protected override void FetchDataFromXmlNode(XmlReader reader, Season item) + /// <param name="result">The result.</param> + protected override void FetchDataFromXmlNode(XmlReader reader, MetadataResult<Season> result) { + var item = result.Item; + switch (reader.Name) { case "SeasonNumber": @@ -38,7 +40,7 @@ namespace MediaBrowser.LocalMetadata.Parsers } default: - base.FetchDataFromXmlNode(reader, item); + base.FetchDataFromXmlNode(reader, result); break; } } diff --git a/MediaBrowser.LocalMetadata/Parsers/SeriesXmlParser.cs b/MediaBrowser.LocalMetadata/Parsers/SeriesXmlParser.cs index a3d45034e..8133bd9fe 100644 --- a/MediaBrowser.LocalMetadata/Parsers/SeriesXmlParser.cs +++ b/MediaBrowser.LocalMetadata/Parsers/SeriesXmlParser.cs @@ -26,9 +26,11 @@ namespace MediaBrowser.LocalMetadata.Parsers /// Fetches the data from XML node. /// </summary> /// <param name="reader">The reader.</param> - /// <param name="item">The item.</param> - protected override void FetchDataFromXmlNode(XmlReader reader, Series item) + /// <param name="result">The result.</param> + protected override void FetchDataFromXmlNode(XmlReader reader, MetadataResult<Series> result) { + var item = result.Item; + switch (reader.Name) { case "Series": @@ -42,7 +44,7 @@ namespace MediaBrowser.LocalMetadata.Parsers { if (subTree.NodeType == XmlNodeType.Element) { - FetchDataFromXmlNode(subTree, item); + FetchDataFromXmlNode(subTree, result); } } @@ -110,7 +112,7 @@ namespace MediaBrowser.LocalMetadata.Parsers } default: - base.FetchDataFromXmlNode(reader, item); + base.FetchDataFromXmlNode(reader, result); break; } } diff --git a/MediaBrowser.LocalMetadata/Providers/BoxSetXmlProvider.cs b/MediaBrowser.LocalMetadata/Providers/BoxSetXmlProvider.cs index 6e40c3594..98a5d5e91 100644 --- a/MediaBrowser.LocalMetadata/Providers/BoxSetXmlProvider.cs +++ b/MediaBrowser.LocalMetadata/Providers/BoxSetXmlProvider.cs @@ -23,7 +23,7 @@ namespace MediaBrowser.LocalMetadata.Providers protected override void Fetch(LocalMetadataResult<BoxSet> result, string path, CancellationToken cancellationToken) { - new BoxSetXmlParser(_logger).Fetch(result.Item, path, cancellationToken); + new BoxSetXmlParser(_logger).Fetch(result, path, cancellationToken); } protected override FileSystemInfo GetXmlFile(ItemInfo info, IDirectoryService directoryService) diff --git a/MediaBrowser.LocalMetadata/Providers/EpisodeXmlProvider.cs b/MediaBrowser.LocalMetadata/Providers/EpisodeXmlProvider.cs index d80009330..c1fc1ba5e 100644 --- a/MediaBrowser.LocalMetadata/Providers/EpisodeXmlProvider.cs +++ b/MediaBrowser.LocalMetadata/Providers/EpisodeXmlProvider.cs @@ -25,10 +25,9 @@ namespace MediaBrowser.LocalMetadata.Providers var images = new List<LocalImageInfo>(); var chapters = new List<ChapterInfo>(); - new EpisodeXmlParser(_logger).Fetch(result.Item, images, chapters, path, cancellationToken); + new EpisodeXmlParser(_logger).Fetch(result, images, path, cancellationToken); result.Images = images; - result.Chapters = chapters; } protected override FileSystemInfo GetXmlFile(ItemInfo info, IDirectoryService directoryService) diff --git a/MediaBrowser.LocalMetadata/Providers/FolderXmlProvider.cs b/MediaBrowser.LocalMetadata/Providers/FolderXmlProvider.cs index 0a2b33744..d18e92f16 100644 --- a/MediaBrowser.LocalMetadata/Providers/FolderXmlProvider.cs +++ b/MediaBrowser.LocalMetadata/Providers/FolderXmlProvider.cs @@ -22,7 +22,7 @@ namespace MediaBrowser.LocalMetadata.Providers protected override void Fetch(LocalMetadataResult<Folder> result, string path, CancellationToken cancellationToken) { - new BaseItemXmlParser<Folder>(_logger).Fetch(result.Item, path, cancellationToken); + new BaseItemXmlParser<Folder>(_logger).Fetch(result, path, cancellationToken); } protected override FileSystemInfo GetXmlFile(ItemInfo info, IDirectoryService directoryService) diff --git a/MediaBrowser.LocalMetadata/Providers/GameSystemXmlProvider.cs b/MediaBrowser.LocalMetadata/Providers/GameSystemXmlProvider.cs index dd486da1d..9d86edbf9 100644 --- a/MediaBrowser.LocalMetadata/Providers/GameSystemXmlProvider.cs +++ b/MediaBrowser.LocalMetadata/Providers/GameSystemXmlProvider.cs @@ -20,7 +20,7 @@ namespace MediaBrowser.LocalMetadata.Providers protected override void Fetch(LocalMetadataResult<GameSystem> result, string path, CancellationToken cancellationToken) { - new GameSystemXmlParser(_logger).Fetch(result.Item, path, cancellationToken); + new GameSystemXmlParser(_logger).Fetch(result, path, cancellationToken); } protected override FileSystemInfo GetXmlFile(ItemInfo info, IDirectoryService directoryService) diff --git a/MediaBrowser.LocalMetadata/Providers/GameXmlProvider.cs b/MediaBrowser.LocalMetadata/Providers/GameXmlProvider.cs index 0a25ce9b6..97a3da147 100644 --- a/MediaBrowser.LocalMetadata/Providers/GameXmlProvider.cs +++ b/MediaBrowser.LocalMetadata/Providers/GameXmlProvider.cs @@ -20,7 +20,7 @@ namespace MediaBrowser.LocalMetadata.Providers protected override void Fetch(LocalMetadataResult<Game> result, string path, CancellationToken cancellationToken) { - new GameXmlParser(_logger).Fetch(result.Item, path, cancellationToken); + new GameXmlParser(_logger).Fetch(result, path, cancellationToken); } protected override FileSystemInfo GetXmlFile(ItemInfo info, IDirectoryService directoryService) diff --git a/MediaBrowser.LocalMetadata/Providers/MovieXmlProvider.cs b/MediaBrowser.LocalMetadata/Providers/MovieXmlProvider.cs index fb3a01bf2..09f13b2ea 100644 --- a/MediaBrowser.LocalMetadata/Providers/MovieXmlProvider.cs +++ b/MediaBrowser.LocalMetadata/Providers/MovieXmlProvider.cs @@ -2,9 +2,7 @@ using MediaBrowser.Controller.Entities.Movies; using MediaBrowser.Controller.Providers; using MediaBrowser.LocalMetadata.Parsers; -using MediaBrowser.Model.Entities; using MediaBrowser.Model.Logging; -using System.Collections.Generic; using System.IO; using System.Threading; @@ -22,11 +20,7 @@ namespace MediaBrowser.LocalMetadata.Providers protected override void Fetch(LocalMetadataResult<Movie> result, string path, CancellationToken cancellationToken) { - var chapters = new List<ChapterInfo>(); - - new MovieXmlParser(_logger).Fetch(result.Item, chapters, path, cancellationToken); - - result.Chapters = chapters; + new MovieXmlParser(_logger).Fetch(result, path, cancellationToken); } protected override FileSystemInfo GetXmlFile(ItemInfo info, IDirectoryService directoryService) diff --git a/MediaBrowser.LocalMetadata/Providers/MusicVideoXmlProvider.cs b/MediaBrowser.LocalMetadata/Providers/MusicVideoXmlProvider.cs index 6289dcb56..b3476c03b 100644 --- a/MediaBrowser.LocalMetadata/Providers/MusicVideoXmlProvider.cs +++ b/MediaBrowser.LocalMetadata/Providers/MusicVideoXmlProvider.cs @@ -20,7 +20,7 @@ namespace MediaBrowser.LocalMetadata.Providers protected override void Fetch(LocalMetadataResult<MusicVideo> result, string path, CancellationToken cancellationToken) { - new MusicVideoXmlParser(_logger).Fetch(result.Item, path, cancellationToken); + new MusicVideoXmlParser(_logger).Fetch(result, path, cancellationToken); } protected override FileSystemInfo GetXmlFile(ItemInfo info, IDirectoryService directoryService) diff --git a/MediaBrowser.LocalMetadata/Providers/PersonXmlProvider.cs b/MediaBrowser.LocalMetadata/Providers/PersonXmlProvider.cs index 9f27d6c7d..a97d86406 100644 --- a/MediaBrowser.LocalMetadata/Providers/PersonXmlProvider.cs +++ b/MediaBrowser.LocalMetadata/Providers/PersonXmlProvider.cs @@ -19,7 +19,7 @@ namespace MediaBrowser.LocalMetadata.Providers protected override void Fetch(LocalMetadataResult<Person> result, string path, CancellationToken cancellationToken) { - new BaseItemXmlParser<Person>(_logger).Fetch(result.Item, path, cancellationToken); + new BaseItemXmlParser<Person>(_logger).Fetch(result, path, cancellationToken); } protected override FileSystemInfo GetXmlFile(ItemInfo info, IDirectoryService directoryService) diff --git a/MediaBrowser.LocalMetadata/Providers/PlaylistXmlProvider.cs b/MediaBrowser.LocalMetadata/Providers/PlaylistXmlProvider.cs index 2279ae052..f4c2a6afb 100644 --- a/MediaBrowser.LocalMetadata/Providers/PlaylistXmlProvider.cs +++ b/MediaBrowser.LocalMetadata/Providers/PlaylistXmlProvider.cs @@ -20,7 +20,7 @@ namespace MediaBrowser.LocalMetadata.Providers protected override void Fetch(LocalMetadataResult<Playlist> result, string path, CancellationToken cancellationToken) { - new PlaylistXmlParser(_logger).Fetch(result.Item, path, cancellationToken); + new PlaylistXmlParser(_logger).Fetch(result, path, cancellationToken); } protected override FileSystemInfo GetXmlFile(ItemInfo info, IDirectoryService directoryService) diff --git a/MediaBrowser.LocalMetadata/Providers/SeasonXmlProvider.cs b/MediaBrowser.LocalMetadata/Providers/SeasonXmlProvider.cs index 2320982c3..ab68e1e86 100644 --- a/MediaBrowser.LocalMetadata/Providers/SeasonXmlProvider.cs +++ b/MediaBrowser.LocalMetadata/Providers/SeasonXmlProvider.cs @@ -23,7 +23,7 @@ namespace MediaBrowser.LocalMetadata.Providers protected override void Fetch(LocalMetadataResult<Season> result, string path, CancellationToken cancellationToken) { - new SeasonXmlParser(_logger).Fetch(result.Item, path, cancellationToken); + new SeasonXmlParser(_logger).Fetch(result, path, cancellationToken); } protected override FileSystemInfo GetXmlFile(ItemInfo info, IDirectoryService directoryService) diff --git a/MediaBrowser.LocalMetadata/Providers/SeriesXmlProvider.cs b/MediaBrowser.LocalMetadata/Providers/SeriesXmlProvider.cs index 311c10287..f27612f2f 100644 --- a/MediaBrowser.LocalMetadata/Providers/SeriesXmlProvider.cs +++ b/MediaBrowser.LocalMetadata/Providers/SeriesXmlProvider.cs @@ -23,7 +23,7 @@ namespace MediaBrowser.LocalMetadata.Providers protected override void Fetch(LocalMetadataResult<Series> result, string path, CancellationToken cancellationToken) { - new SeriesXmlParser(_logger).Fetch(result.Item, path, cancellationToken); + new SeriesXmlParser(_logger).Fetch(result, path, cancellationToken); } protected override FileSystemInfo GetXmlFile(ItemInfo info, IDirectoryService directoryService) diff --git a/MediaBrowser.LocalMetadata/Providers/VideoXmlProvider.cs b/MediaBrowser.LocalMetadata/Providers/VideoXmlProvider.cs index 25aa61baf..9ba64164e 100644 --- a/MediaBrowser.LocalMetadata/Providers/VideoXmlProvider.cs +++ b/MediaBrowser.LocalMetadata/Providers/VideoXmlProvider.cs @@ -1,12 +1,10 @@ -using System.Collections.Generic; -using System.IO; -using System.Threading; -using MediaBrowser.Common.IO; +using MediaBrowser.Common.IO; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Providers; using MediaBrowser.LocalMetadata.Parsers; -using MediaBrowser.Model.Entities; using MediaBrowser.Model.Logging; +using System.IO; +using System.Threading; namespace MediaBrowser.LocalMetadata.Providers { @@ -22,11 +20,7 @@ namespace MediaBrowser.LocalMetadata.Providers protected override void Fetch(LocalMetadataResult<Video> result, string path, CancellationToken cancellationToken) { - var chapters = new List<ChapterInfo>(); - - new MovieXmlParser(_logger).Fetch(result.Item, chapters, path, cancellationToken); - - result.Chapters = chapters; + new VideoXmlParser(_logger).Fetch(result, path, cancellationToken); } protected override FileSystemInfo GetXmlFile(ItemInfo info, IDirectoryService directoryService) diff --git a/MediaBrowser.LocalMetadata/Savers/BoxSetXmlSaver.cs b/MediaBrowser.LocalMetadata/Savers/BoxSetXmlSaver.cs index f04175654..e6ae84169 100644 --- a/MediaBrowser.LocalMetadata/Savers/BoxSetXmlSaver.cs +++ b/MediaBrowser.LocalMetadata/Savers/BoxSetXmlSaver.cs @@ -20,10 +20,12 @@ namespace MediaBrowser.LocalMetadata.Savers } private readonly IServerConfigurationManager _config; + private readonly ILibraryManager _libraryManager; - public BoxSetXmlSaver(IServerConfigurationManager config) + public BoxSetXmlSaver(IServerConfigurationManager config, ILibraryManager libraryManager) { _config = config; + _libraryManager = libraryManager; } /// <summary> @@ -54,7 +56,7 @@ namespace MediaBrowser.LocalMetadata.Savers builder.Append("<Item>"); - XmlSaverHelpers.AddCommonNodes((BoxSet)item, builder); + XmlSaverHelpers.AddCommonNodes((BoxSet)item, _libraryManager, builder); builder.Append("</Item>"); diff --git a/MediaBrowser.LocalMetadata/Savers/EpisodeXmlSaver.cs b/MediaBrowser.LocalMetadata/Savers/EpisodeXmlSaver.cs index 673d8bc41..7a2a97c0c 100644 --- a/MediaBrowser.LocalMetadata/Savers/EpisodeXmlSaver.cs +++ b/MediaBrowser.LocalMetadata/Savers/EpisodeXmlSaver.cs @@ -18,11 +18,13 @@ namespace MediaBrowser.LocalMetadata.Savers private readonly CultureInfo _usCulture = new CultureInfo("en-US"); private readonly IServerConfigurationManager _config; + private readonly ILibraryManager _libraryManager; - public EpisodeXmlSaver(IItemRepository itemRepository, IServerConfigurationManager config) + public EpisodeXmlSaver(IItemRepository itemRepository, IServerConfigurationManager config, ILibraryManager libraryManager) { _itemRepository = itemRepository; _config = config; + _libraryManager = libraryManager; } /// <summary> @@ -116,7 +118,7 @@ namespace MediaBrowser.LocalMetadata.Savers builder.Append("<FirstAired>" + SecurityElement.Escape(episode.PremiereDate.Value.ToLocalTime().ToString("yyyy-MM-dd")) + "</FirstAired>"); } - XmlSaverHelpers.AddCommonNodes(episode, builder); + XmlSaverHelpers.AddCommonNodes(episode, _libraryManager, builder); XmlSaverHelpers.AddMediaInfo(episode, builder, _itemRepository); builder.Append("</Item>"); diff --git a/MediaBrowser.LocalMetadata/Savers/FolderXmlSaver.cs b/MediaBrowser.LocalMetadata/Savers/FolderXmlSaver.cs index 67fa12b55..ac56f0864 100644 --- a/MediaBrowser.LocalMetadata/Savers/FolderXmlSaver.cs +++ b/MediaBrowser.LocalMetadata/Savers/FolderXmlSaver.cs @@ -23,10 +23,12 @@ namespace MediaBrowser.LocalMetadata.Savers } private readonly IServerConfigurationManager _config; + private readonly ILibraryManager _libraryManager; - public FolderXmlSaver(IServerConfigurationManager config) + public FolderXmlSaver(IServerConfigurationManager config, ILibraryManager libraryManager) { _config = config; + _libraryManager = libraryManager; } /// <summary> @@ -68,7 +70,7 @@ namespace MediaBrowser.LocalMetadata.Savers builder.Append("<Item>"); - XmlSaverHelpers.AddCommonNodes((Folder)item, builder); + XmlSaverHelpers.AddCommonNodes((Folder)item, _libraryManager, builder); builder.Append("</Item>"); diff --git a/MediaBrowser.LocalMetadata/Savers/GameSystemXmlSaver.cs b/MediaBrowser.LocalMetadata/Savers/GameSystemXmlSaver.cs index ebb401f54..770f1d7f9 100644 --- a/MediaBrowser.LocalMetadata/Savers/GameSystemXmlSaver.cs +++ b/MediaBrowser.LocalMetadata/Savers/GameSystemXmlSaver.cs @@ -20,10 +20,12 @@ namespace MediaBrowser.LocalMetadata.Savers } private readonly IServerConfigurationManager _config; + private readonly ILibraryManager _libraryManager; - public GameSystemXmlSaver(IServerConfigurationManager config) + public GameSystemXmlSaver(IServerConfigurationManager config, ILibraryManager libraryManager) { _config = config; + _libraryManager = libraryManager; } /// <summary> @@ -61,7 +63,7 @@ namespace MediaBrowser.LocalMetadata.Savers builder.Append("<GameSystem>" + SecurityElement.Escape(gameSystem.GameSystemName) + "</GameSystem>"); } - XmlSaverHelpers.AddCommonNodes(gameSystem, builder); + XmlSaverHelpers.AddCommonNodes(gameSystem, _libraryManager, builder); builder.Append("</Item>"); diff --git a/MediaBrowser.LocalMetadata/Savers/GameXmlSaver.cs b/MediaBrowser.LocalMetadata/Savers/GameXmlSaver.cs index 108c6a9e2..26c4ff395 100644 --- a/MediaBrowser.LocalMetadata/Savers/GameXmlSaver.cs +++ b/MediaBrowser.LocalMetadata/Savers/GameXmlSaver.cs @@ -25,12 +25,14 @@ namespace MediaBrowser.LocalMetadata.Savers } private readonly IServerConfigurationManager _config; + private readonly ILibraryManager _libraryManager; - public GameXmlSaver(IServerConfigurationManager config) + public GameXmlSaver(IServerConfigurationManager config, ILibraryManager libraryManager) { _config = config; + _libraryManager = libraryManager; } - + /// <summary> /// Determines whether [is enabled for] [the specified item]. /// </summary> @@ -87,7 +89,7 @@ namespace MediaBrowser.LocalMetadata.Savers builder.Append("<NesBoxRom>" + SecurityElement.Escape(val) + "</NesBoxRom>"); } - XmlSaverHelpers.AddCommonNodes(game, builder); + XmlSaverHelpers.AddCommonNodes(game, _libraryManager, builder); builder.Append("</Item>"); diff --git a/MediaBrowser.LocalMetadata/Savers/MovieXmlSaver.cs b/MediaBrowser.LocalMetadata/Savers/MovieXmlSaver.cs index eb1a0b78c..dc5b45259 100644 --- a/MediaBrowser.LocalMetadata/Savers/MovieXmlSaver.cs +++ b/MediaBrowser.LocalMetadata/Savers/MovieXmlSaver.cs @@ -74,7 +74,7 @@ namespace MediaBrowser.LocalMetadata.Savers builder.Append("<Title>"); - XmlSaverHelpers.AddCommonNodes(video, builder); + XmlSaverHelpers.AddCommonNodes(video, _libraryManager, builder); var musicVideo = item as MusicVideo; diff --git a/MediaBrowser.LocalMetadata/Savers/PersonXmlSaver.cs b/MediaBrowser.LocalMetadata/Savers/PersonXmlSaver.cs index 9c6fb39bd..9d943bfa4 100644 --- a/MediaBrowser.LocalMetadata/Savers/PersonXmlSaver.cs +++ b/MediaBrowser.LocalMetadata/Savers/PersonXmlSaver.cs @@ -23,10 +23,12 @@ namespace MediaBrowser.LocalMetadata.Savers } private readonly IServerConfigurationManager _config; + private readonly ILibraryManager _libraryManager; - public PersonXmlSaver(IServerConfigurationManager config) + public PersonXmlSaver(IServerConfigurationManager config, ILibraryManager libraryManager) { _config = config; + _libraryManager = libraryManager; } /// <summary> @@ -59,7 +61,7 @@ namespace MediaBrowser.LocalMetadata.Savers builder.Append("<Item>"); - XmlSaverHelpers.AddCommonNodes(person, builder); + XmlSaverHelpers.AddCommonNodes(person, _libraryManager, builder); if (!string.IsNullOrEmpty(person.PlaceOfBirth)) { diff --git a/MediaBrowser.LocalMetadata/Savers/PlaylistXmlSaver.cs b/MediaBrowser.LocalMetadata/Savers/PlaylistXmlSaver.cs index 76ef4d4bf..7dfe59b4b 100644 --- a/MediaBrowser.LocalMetadata/Savers/PlaylistXmlSaver.cs +++ b/MediaBrowser.LocalMetadata/Savers/PlaylistXmlSaver.cs @@ -21,10 +21,12 @@ namespace MediaBrowser.LocalMetadata.Savers } private readonly IServerConfigurationManager _config; + private readonly ILibraryManager _libraryManager; - public PlaylistXmlSaver(IServerConfigurationManager config) + public PlaylistXmlSaver(IServerConfigurationManager config, ILibraryManager libraryManager) { _config = config; + _libraryManager = libraryManager; } /// <summary> @@ -61,8 +63,8 @@ namespace MediaBrowser.LocalMetadata.Savers { builder.Append("<PlaylistMediaType>" + SecurityElement.Escape(playlist.PlaylistMediaType) + "</PlaylistMediaType>"); } - - XmlSaverHelpers.AddCommonNodes(playlist, builder); + + XmlSaverHelpers.AddCommonNodes(playlist, _libraryManager, builder); builder.Append("</Item>"); diff --git a/MediaBrowser.LocalMetadata/Savers/SeriesXmlSaver.cs b/MediaBrowser.LocalMetadata/Savers/SeriesXmlSaver.cs index c94770bdb..45aff5e2c 100644 --- a/MediaBrowser.LocalMetadata/Savers/SeriesXmlSaver.cs +++ b/MediaBrowser.LocalMetadata/Savers/SeriesXmlSaver.cs @@ -15,12 +15,14 @@ namespace MediaBrowser.LocalMetadata.Savers public class SeriesXmlSaver : IMetadataFileSaver { private readonly IServerConfigurationManager _config; + private readonly ILibraryManager _libraryManager; - public SeriesXmlSaver(IServerConfigurationManager config) + public SeriesXmlSaver(IServerConfigurationManager config, ILibraryManager libraryManager) { _config = config; + _libraryManager = libraryManager; } - + public string Name { get @@ -105,7 +107,7 @@ namespace MediaBrowser.LocalMetadata.Savers builder.Append("<AnimeSeriesIndex>" + SecurityElement.Escape(series.AnimeSeriesIndex.Value.ToString(UsCulture)) + "</AnimeSeriesIndex>"); } - XmlSaverHelpers.AddCommonNodes(series, builder); + XmlSaverHelpers.AddCommonNodes(series, _libraryManager, builder); builder.Append("</Series>"); diff --git a/MediaBrowser.LocalMetadata/Savers/XmlSaverHelpers.cs b/MediaBrowser.LocalMetadata/Savers/XmlSaverHelpers.cs index 1b98e75be..091d59469 100644 --- a/MediaBrowser.LocalMetadata/Savers/XmlSaverHelpers.cs +++ b/MediaBrowser.LocalMetadata/Savers/XmlSaverHelpers.cs @@ -2,6 +2,7 @@ using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities.Movies; using MediaBrowser.Controller.Entities.TV; +using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Persistence; using MediaBrowser.Controller.Playlists; using MediaBrowser.Model.Entities; @@ -230,7 +231,7 @@ namespace MediaBrowser.LocalMetadata.Savers /// </summary> /// <param name="item">The item.</param> /// <param name="builder">The builder.</param> - public static void AddCommonNodes(BaseItem item, StringBuilder builder) + public static void AddCommonNodes(BaseItem item, ILibraryManager libraryManager, StringBuilder builder) { if (!string.IsNullOrEmpty(item.OfficialRating)) { @@ -627,11 +628,13 @@ namespace MediaBrowser.LocalMetadata.Savers } } - if (item.People.Count > 0) + var people = libraryManager.GetPeople(item); + + if (people.Count > 0) { builder.Append("<Persons>"); - foreach (var person in item.People) + foreach (var person in people) { builder.Append("<Person>"); builder.Append("<Name>" + SecurityElement.Escape(person.Name) + "</Name>"); diff --git a/MediaBrowser.MediaEncoding/Encoder/BaseEncoder.cs b/MediaBrowser.MediaEncoding/Encoder/BaseEncoder.cs index 16b4e418e..97c5aecd0 100644 --- a/MediaBrowser.MediaEncoding/Encoder/BaseEncoder.cs +++ b/MediaBrowser.MediaEncoding/Encoder/BaseEncoder.cs @@ -834,7 +834,7 @@ namespace MediaBrowser.MediaEncoding.Encoder { var heightParam = request.Height.Value.ToString(UsCulture); - filters.Add(string.Format("scale=trunc(oh*a*2)/2:{0}", heightParam)); + filters.Add(string.Format("scale=trunc(oh*a/2)*2:{0}", heightParam)); } // If a max width was requested @@ -850,7 +850,7 @@ namespace MediaBrowser.MediaEncoding.Encoder { var maxHeightParam = request.MaxHeight.Value.ToString(UsCulture); - filters.Add(string.Format("scale=trunc(oh*a*2)/2:min(ih\\,{0})", maxHeightParam)); + filters.Add(string.Format("scale=trunc(oh*a/2)*2:min(ih\\,{0})", maxHeightParam)); } var output = string.Empty; diff --git a/MediaBrowser.Model.Portable/MediaBrowser.Model.Portable.csproj b/MediaBrowser.Model.Portable/MediaBrowser.Model.Portable.csproj index 3238e79b7..a1b7ce396 100644 --- a/MediaBrowser.Model.Portable/MediaBrowser.Model.Portable.csproj +++ b/MediaBrowser.Model.Portable/MediaBrowser.Model.Portable.csproj @@ -1076,6 +1076,9 @@ <Compile Include="..\MediaBrowser.Model\Session\UserDataChangeInfo.cs"> <Link>Session\UserDataChangeInfo.cs</Link> </Compile> + <Compile Include="..\MediaBrowser.Model\Social\SocialShareInfo.cs"> + <Link>Social\SocialShareInfo.cs</Link> + </Compile> <Compile Include="..\MediaBrowser.Model\Sync\CompleteSyncJobInfo.cs"> <Link>Sync\CompleteSyncJobInfo.cs</Link> </Compile> diff --git a/MediaBrowser.Model.net35/MediaBrowser.Model.net35.csproj b/MediaBrowser.Model.net35/MediaBrowser.Model.net35.csproj index be7277607..d4a373733 100644 --- a/MediaBrowser.Model.net35/MediaBrowser.Model.net35.csproj +++ b/MediaBrowser.Model.net35/MediaBrowser.Model.net35.csproj @@ -1032,6 +1032,9 @@ <Compile Include="..\MediaBrowser.Model\Session\UserDataChangeInfo.cs"> <Link>Session\UserDataChangeInfo.cs</Link> </Compile> + <Compile Include="..\mediabrowser.model\social\SocialShareInfo.cs"> + <Link>Social\SocialShareInfo.cs</Link> + </Compile> <Compile Include="..\MediaBrowser.Model\Sync\CompleteSyncJobInfo.cs"> <Link>Sync\CompleteSyncJobInfo.cs</Link> </Compile> diff --git a/MediaBrowser.Model/Configuration/ServerConfiguration.cs b/MediaBrowser.Model/Configuration/ServerConfiguration.cs index e7490b3fa..19403a55e 100644 --- a/MediaBrowser.Model/Configuration/ServerConfiguration.cs +++ b/MediaBrowser.Model/Configuration/ServerConfiguration.cs @@ -25,7 +25,7 @@ namespace MediaBrowser.Model.Configuration /// </summary> /// <value>The public HTTPS port.</value> public int PublicHttpsPort { get; set; } - + /// <summary> /// Gets or sets the HTTP server port number. /// </summary> @@ -49,7 +49,7 @@ namespace MediaBrowser.Model.Configuration /// </summary> /// <value><c>true</c> if [enable user specific user views]; otherwise, <c>false</c>.</value> public bool EnableUserSpecificUserViews { get; set; } - + /// <summary> /// Gets or sets the value pointing to the file system where the ssl certiifcate is located.. /// </summary> @@ -103,7 +103,7 @@ namespace MediaBrowser.Model.Configuration /// </summary> /// <value><c>true</c> if [enable library metadata sub folder]; otherwise, <c>false</c>.</value> public bool EnableLibraryMetadataSubFolder { get; set; } - + /// <summary> /// Gets or sets the preferred metadata language. /// </summary> @@ -211,6 +211,8 @@ namespace MediaBrowser.Model.Configuration public AutoOnOff EnableLibraryMonitor { get; set; } + public int SharingExpirationDays { get; set; } + /// <summary> /// Initializes a new instance of the <see cref="ServerConfiguration" /> class. /// </summary> @@ -231,6 +233,7 @@ namespace MediaBrowser.Model.Configuration EnableUPnP = true; + SharingExpirationDays = 30; MinResumePct = 5; MaxResumePct = 90; diff --git a/MediaBrowser.Model/Dlna/StreamBuilder.cs b/MediaBrowser.Model/Dlna/StreamBuilder.cs index 3c1c7ea6d..340af3ac1 100644 --- a/MediaBrowser.Model/Dlna/StreamBuilder.cs +++ b/MediaBrowser.Model/Dlna/StreamBuilder.cs @@ -148,6 +148,7 @@ namespace MediaBrowser.Model.Dlna { if (!conditionProcessor.IsAudioConditionSatisfied(c, audioChannels, audioBitrate)) { + LogConditionFailure(options.Profile, "AudioCodecProfile", c, item); all = false; break; } @@ -274,14 +275,21 @@ namespace MediaBrowser.Model.Dlna { playMethods.Add(PlayMethod.DirectStream); } - + // The profile describes what the device supports // If device requirements are satisfied then allow both direct stream and direct play - if (item.SupportsDirectPlay && IsAudioEligibleForDirectPlay(item, GetBitrateForDirectPlayCheck(item, options))) + if (item.SupportsDirectPlay && + IsAudioEligibleForDirectPlay(item, GetBitrateForDirectPlayCheck(item, options))) { playMethods.Add(PlayMethod.DirectPlay); } } + else + { + _logger.Debug("Profile: {0}, No direct play profiles found for Path: {1}", + options.Profile.Name ?? "Unknown Profile", + item.Path ?? "Unknown path"); + } return playMethods; } @@ -745,10 +753,9 @@ namespace MediaBrowser.Model.Dlna } } + // Look for supported embedded subs that we can just mux into the output foreach (SubtitleProfile profile in subtitleProfiles) { - bool requiresConversion = !StringHelper.EqualsIgnoreCase(subtitleStream.Codec, profile.Format); - if (!profile.SupportsLanguage(subtitleStream.Language)) { continue; @@ -756,11 +763,6 @@ namespace MediaBrowser.Model.Dlna if (profile.Method == SubtitleDeliveryMethod.Embed && subtitleStream.IsTextSubtitleStream == MediaStream.IsTextFormat(profile.Format)) { - if (!requiresConversion) - { - return profile; - } - return profile; } } @@ -774,8 +776,13 @@ namespace MediaBrowser.Model.Dlna private bool IsAudioEligibleForDirectPlay(MediaSourceInfo item, int? maxBitrate) { - // Honor the max bitrate setting - return !maxBitrate.HasValue || (item.Bitrate.HasValue && item.Bitrate.Value <= maxBitrate.Value); + if (!maxBitrate.HasValue || (item.Bitrate.HasValue && item.Bitrate.Value <= maxBitrate.Value)) + { + return true; + } + + _logger.Debug("Audio Bitrate exceeds DirectPlay limit"); + return false; } private void ValidateInput(VideoOptions options) diff --git a/MediaBrowser.Model/Entities/MediaStream.cs b/MediaBrowser.Model/Entities/MediaStream.cs index f842a9e3a..0aaa8035c 100644 --- a/MediaBrowser.Model/Entities/MediaStream.cs +++ b/MediaBrowser.Model/Entities/MediaStream.cs @@ -1,5 +1,4 @@ -using System.Collections.Generic; -using MediaBrowser.Model.Dlna; +using MediaBrowser.Model.Dlna; using MediaBrowser.Model.Extensions; using System.Diagnostics; diff --git a/MediaBrowser.Model/MediaBrowser.Model.csproj b/MediaBrowser.Model/MediaBrowser.Model.csproj index 3daacdd73..b36fa2362 100644 --- a/MediaBrowser.Model/MediaBrowser.Model.csproj +++ b/MediaBrowser.Model/MediaBrowser.Model.csproj @@ -379,6 +379,7 @@ <Compile Include="Session\TranscodingInfo.cs" /> <Compile Include="Session\UserDataChangeInfo.cs" /> <Compile Include="Devices\ContentUploadHistory.cs" /> + <Compile Include="Social\SocialShareInfo.cs" /> <Compile Include="Sync\CompleteSyncJobInfo.cs" /> <Compile Include="Sync\DeviceFileInfo.cs" /> <Compile Include="Sync\ItemFIleInfo.cs" /> diff --git a/MediaBrowser.Model/Social/SocialShareInfo.cs b/MediaBrowser.Model/Social/SocialShareInfo.cs new file mode 100644 index 000000000..1b1c225c4 --- /dev/null +++ b/MediaBrowser.Model/Social/SocialShareInfo.cs @@ -0,0 +1,16 @@ +using System; + +namespace MediaBrowser.Model.Social +{ + public class SocialShareInfo + { + public string Id { get; set; } + public string Url { get; set; } + public string ItemId { get; set; } + public string UserId { get; set; } + public DateTime ExpirationDate { get; set; } + public string Name { get; set; } + public string ImageUrl { get; set; } + public string Overview { get; set; } + } +} diff --git a/MediaBrowser.Providers/Books/BookMetadataService.cs b/MediaBrowser.Providers/Books/BookMetadataService.cs index 53e2af3a5..311082d96 100644 --- a/MediaBrowser.Providers/Books/BookMetadataService.cs +++ b/MediaBrowser.Providers/Books/BookMetadataService.cs @@ -12,25 +12,17 @@ namespace MediaBrowser.Providers.Books { public class BookMetadataService : MetadataService<Book, BookInfo> { - public BookMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager) : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager) + public BookMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager, ILibraryManager libraryManager) : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager, libraryManager) { } - /// <summary> - /// Merges the specified source. - /// </summary> - /// <param name="source">The source.</param> - /// <param name="target">The target.</param> - /// <param name="lockedFields">The locked fields.</param> - /// <param name="replaceData">if set to <c>true</c> [replace data].</param> - /// <param name="mergeMetadataSettings">if set to <c>true</c> [merge metadata settings].</param> - protected override void MergeData(Book source, Book target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) + protected override void MergeData(MetadataResult<Book> source, MetadataResult<Book> target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) { ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); - if (replaceData || string.IsNullOrEmpty(target.SeriesName)) + if (replaceData || string.IsNullOrEmpty(target.Item.SeriesName)) { - target.SeriesName = source.SeriesName; + target.Item.SeriesName = source.Item.SeriesName; } } } diff --git a/MediaBrowser.Providers/BoxSets/BoxSetMetadataService.cs b/MediaBrowser.Providers/BoxSets/BoxSetMetadataService.cs index 69b78b5f1..8b405302e 100644 --- a/MediaBrowser.Providers/BoxSets/BoxSetMetadataService.cs +++ b/MediaBrowser.Providers/BoxSets/BoxSetMetadataService.cs @@ -15,33 +15,10 @@ namespace MediaBrowser.Providers.BoxSets { public class BoxSetMetadataService : MetadataService<BoxSet, BoxSetInfo> { - public BoxSetMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager) : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager) + public BoxSetMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager, ILibraryManager libraryManager) : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager, libraryManager) { } - /// <summary> - /// Merges the specified source. - /// </summary> - /// <param name="source">The source.</param> - /// <param name="target">The target.</param> - /// <param name="lockedFields">The locked fields.</param> - /// <param name="replaceData">if set to <c>true</c> [replace data].</param> - /// <param name="mergeMetadataSettings">if set to <c>true</c> [merge metadata settings].</param> - protected override void MergeData(BoxSet source, BoxSet target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) - { - ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); - - if (mergeMetadataSettings) - { - var list = source.LinkedChildren.Where(i => i.Type != LinkedChildType.Manual).ToList(); - - list.AddRange(target.LinkedChildren.Where(i => i.Type == LinkedChildType.Manual)); - - target.LinkedChildren = list; - target.Shares = source.Shares; - } - } - protected override async Task<ItemUpdateType> BeforeSave(BoxSet item, bool isFullRefresh, ItemUpdateType currentUpdateType) { var updateType = await base.BeforeSave(item, isFullRefresh, currentUpdateType).ConfigureAwait(false); @@ -59,5 +36,23 @@ namespace MediaBrowser.Providers.BoxSets return updateType; } + + protected override void MergeData(MetadataResult<BoxSet> source, MetadataResult<BoxSet> target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) + { + ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); + + var sourceItem = source.Item; + var targetItem = target.Item; + + if (mergeMetadataSettings) + { + var list = sourceItem.LinkedChildren.Where(i => i.Type != LinkedChildType.Manual).ToList(); + + list.AddRange(targetItem.LinkedChildren.Where(i => i.Type == LinkedChildType.Manual)); + + targetItem.LinkedChildren = list; + targetItem.Shares = sourceItem.Shares; + } + } } } diff --git a/MediaBrowser.Providers/Channels/AudioChannelItemMetadataService.cs b/MediaBrowser.Providers/Channels/AudioChannelItemMetadataService.cs index 70a72fba5..9d80559f1 100644 --- a/MediaBrowser.Providers/Channels/AudioChannelItemMetadataService.cs +++ b/MediaBrowser.Providers/Channels/AudioChannelItemMetadataService.cs @@ -12,19 +12,11 @@ namespace MediaBrowser.Providers.Channels { public class AudioChannelItemMetadataService : MetadataService<ChannelAudioItem, ItemLookupInfo> { - public AudioChannelItemMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager) : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager) + public AudioChannelItemMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager, ILibraryManager libraryManager) : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager, libraryManager) { } - /// <summary> - /// Merges the specified source. - /// </summary> - /// <param name="source">The source.</param> - /// <param name="target">The target.</param> - /// <param name="lockedFields">The locked fields.</param> - /// <param name="replaceData">if set to <c>true</c> [replace data].</param> - /// <param name="mergeMetadataSettings">if set to <c>true</c> [merge metadata settings].</param> - protected override void MergeData(ChannelAudioItem source, ChannelAudioItem target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) + protected override void MergeData(MetadataResult<ChannelAudioItem> source, MetadataResult<ChannelAudioItem> target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) { ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); } diff --git a/MediaBrowser.Providers/Channels/ChannelMetadataService.cs b/MediaBrowser.Providers/Channels/ChannelMetadataService.cs index 957fc2d93..faa35b379 100644 --- a/MediaBrowser.Providers/Channels/ChannelMetadataService.cs +++ b/MediaBrowser.Providers/Channels/ChannelMetadataService.cs @@ -12,19 +12,11 @@ namespace MediaBrowser.Providers.Channels { public class ChannelMetadataService : MetadataService<Channel, ItemLookupInfo> { - public ChannelMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager) : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager) + public ChannelMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager, ILibraryManager libraryManager) : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager, libraryManager) { } - /// <summary> - /// Merges the specified source. - /// </summary> - /// <param name="source">The source.</param> - /// <param name="target">The target.</param> - /// <param name="lockedFields">The locked fields.</param> - /// <param name="replaceData">if set to <c>true</c> [replace data].</param> - /// <param name="mergeMetadataSettings">if set to <c>true</c> [merge metadata settings].</param> - protected override void MergeData(Channel source, Channel target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) + protected override void MergeData(MetadataResult<Channel> source, MetadataResult<Channel> target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) { ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); } diff --git a/MediaBrowser.Providers/Channels/VideoChannelItemMetadataService.cs b/MediaBrowser.Providers/Channels/VideoChannelItemMetadataService.cs index b815f3ccd..1e7b5aca8 100644 --- a/MediaBrowser.Providers/Channels/VideoChannelItemMetadataService.cs +++ b/MediaBrowser.Providers/Channels/VideoChannelItemMetadataService.cs @@ -12,19 +12,11 @@ namespace MediaBrowser.Providers.Channels { public class VideoChannelItemMetadataService : MetadataService<ChannelVideoItem, ChannelItemLookupInfo> { - public VideoChannelItemMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager) : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager) + public VideoChannelItemMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager, ILibraryManager libraryManager) : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager, libraryManager) { } - /// <summary> - /// Merges the specified source. - /// </summary> - /// <param name="source">The source.</param> - /// <param name="target">The target.</param> - /// <param name="lockedFields">The locked fields.</param> - /// <param name="replaceData">if set to <c>true</c> [replace data].</param> - /// <param name="mergeMetadataSettings">if set to <c>true</c> [merge metadata settings].</param> - protected override void MergeData(ChannelVideoItem source, ChannelVideoItem target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) + protected override void MergeData(MetadataResult<ChannelVideoItem> source, MetadataResult<ChannelVideoItem> target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) { ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); } diff --git a/MediaBrowser.Providers/Folders/FolderMetadataService.cs b/MediaBrowser.Providers/Folders/FolderMetadataService.cs index 3f4691aa0..d54093da6 100644 --- a/MediaBrowser.Providers/Folders/FolderMetadataService.cs +++ b/MediaBrowser.Providers/Folders/FolderMetadataService.cs @@ -12,23 +12,10 @@ namespace MediaBrowser.Providers.Folders { public class FolderMetadataService : MetadataService<Folder, ItemLookupInfo> { - public FolderMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager) : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager) + public FolderMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager, ILibraryManager libraryManager) : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager, libraryManager) { } - /// <summary> - /// Merges the specified source. - /// </summary> - /// <param name="source">The source.</param> - /// <param name="target">The target.</param> - /// <param name="lockedFields">The locked fields.</param> - /// <param name="replaceData">if set to <c>true</c> [replace data].</param> - /// <param name="mergeMetadataSettings">if set to <c>true</c> [merge metadata settings].</param> - protected override void MergeData(Folder source, Folder target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) - { - ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); - } - public override int Order { get @@ -37,5 +24,10 @@ namespace MediaBrowser.Providers.Folders return 10; } } + + protected override void MergeData(MetadataResult<Folder> source, MetadataResult<Folder> target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) + { + ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); + } } } diff --git a/MediaBrowser.Providers/Folders/UserViewMetadataService.cs b/MediaBrowser.Providers/Folders/UserViewMetadataService.cs index 97ac78a82..1dc09e01d 100644 --- a/MediaBrowser.Providers/Folders/UserViewMetadataService.cs +++ b/MediaBrowser.Providers/Folders/UserViewMetadataService.cs @@ -12,20 +12,11 @@ namespace MediaBrowser.Providers.Folders { public class UserViewMetadataService : MetadataService<UserView, ItemLookupInfo> { - public UserViewMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager) - : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager) + public UserViewMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager, ILibraryManager libraryManager) : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager, libraryManager) { } - /// <summary> - /// Merges the specified source. - /// </summary> - /// <param name="source">The source.</param> - /// <param name="target">The target.</param> - /// <param name="lockedFields">The locked fields.</param> - /// <param name="replaceData">if set to <c>true</c> [replace data].</param> - /// <param name="mergeMetadataSettings">if set to <c>true</c> [merge metadata settings].</param> - protected override void MergeData(UserView source, UserView target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) + protected override void MergeData(MetadataResult<UserView> source, MetadataResult<UserView> target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) { ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); } diff --git a/MediaBrowser.Providers/GameGenres/GameGenreMetadataService.cs b/MediaBrowser.Providers/GameGenres/GameGenreMetadataService.cs index 3e94de95a..957596a30 100644 --- a/MediaBrowser.Providers/GameGenres/GameGenreMetadataService.cs +++ b/MediaBrowser.Providers/GameGenres/GameGenreMetadataService.cs @@ -12,19 +12,11 @@ namespace MediaBrowser.Providers.GameGenres { public class GameGenreMetadataService : MetadataService<GameGenre, ItemLookupInfo> { - public GameGenreMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager) : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager) + public GameGenreMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager, ILibraryManager libraryManager) : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager, libraryManager) { } - /// <summary> - /// Merges the specified source. - /// </summary> - /// <param name="source">The source.</param> - /// <param name="target">The target.</param> - /// <param name="lockedFields">The locked fields.</param> - /// <param name="replaceData">if set to <c>true</c> [replace data].</param> - /// <param name="mergeMetadataSettings">if set to <c>true</c> [merge metadata settings].</param> - protected override void MergeData(GameGenre source, GameGenre target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) + protected override void MergeData(MetadataResult<GameGenre> source, MetadataResult<GameGenre> target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) { ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); } diff --git a/MediaBrowser.Providers/Games/GameMetadataService.cs b/MediaBrowser.Providers/Games/GameMetadataService.cs index 46715fcbd..b9403aaa6 100644 --- a/MediaBrowser.Providers/Games/GameMetadataService.cs +++ b/MediaBrowser.Providers/Games/GameMetadataService.cs @@ -12,30 +12,25 @@ namespace MediaBrowser.Providers.Games { public class GameMetadataService : MetadataService<Game, GameInfo> { - public GameMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager) : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager) + public GameMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager, ILibraryManager libraryManager) : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager, libraryManager) { } - /// <summary> - /// Merges the specified source. - /// </summary> - /// <param name="source">The source.</param> - /// <param name="target">The target.</param> - /// <param name="lockedFields">The locked fields.</param> - /// <param name="replaceData">if set to <c>true</c> [replace data].</param> - /// <param name="mergeMetadataSettings">if set to <c>true</c> [merge metadata settings].</param> - protected override void MergeData(Game source, Game target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) + protected override void MergeData(MetadataResult<Game> source, MetadataResult<Game> target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) { ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); - if (replaceData || string.IsNullOrEmpty(target.GameSystem)) + var sourceItem = source.Item; + var targetItem = target.Item; + + if (replaceData || string.IsNullOrEmpty(targetItem.GameSystem)) { - target.GameSystem = source.GameSystem; + targetItem.GameSystem = sourceItem.GameSystem; } - if (replaceData || !target.PlayersSupported.HasValue) + if (replaceData || !targetItem.PlayersSupported.HasValue) { - target.PlayersSupported = source.PlayersSupported; + targetItem.PlayersSupported = sourceItem.PlayersSupported; } } } diff --git a/MediaBrowser.Providers/Games/GameSystemMetadataService.cs b/MediaBrowser.Providers/Games/GameSystemMetadataService.cs index 963b2e49f..24786034d 100644 --- a/MediaBrowser.Providers/Games/GameSystemMetadataService.cs +++ b/MediaBrowser.Providers/Games/GameSystemMetadataService.cs @@ -14,25 +14,20 @@ namespace MediaBrowser.Providers.Games { public class GameSystemMetadataService : MetadataService<GameSystem, GameSystemInfo> { - public GameSystemMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager) : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager) + public GameSystemMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager, ILibraryManager libraryManager) : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager, libraryManager) { } - /// <summary> - /// Merges the specified source. - /// </summary> - /// <param name="source">The source.</param> - /// <param name="target">The target.</param> - /// <param name="lockedFields">The locked fields.</param> - /// <param name="replaceData">if set to <c>true</c> [replace data].</param> - /// <param name="mergeMetadataSettings">if set to <c>true</c> [merge metadata settings].</param> - protected override void MergeData(GameSystem source, GameSystem target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) + protected override void MergeData(MetadataResult<GameSystem> source, MetadataResult<GameSystem> target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) { ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); - if (replaceData || string.IsNullOrEmpty(target.GameSystemName)) + var sourceItem = source.Item; + var targetItem = target.Item; + + if (replaceData || string.IsNullOrEmpty(targetItem.GameSystemName)) { - target.GameSystemName = source.GameSystemName; + targetItem.GameSystemName = sourceItem.GameSystemName; } } } diff --git a/MediaBrowser.Providers/Genres/GenreMetadataService.cs b/MediaBrowser.Providers/Genres/GenreMetadataService.cs index abe025577..5cdd6d847 100644 --- a/MediaBrowser.Providers/Genres/GenreMetadataService.cs +++ b/MediaBrowser.Providers/Genres/GenreMetadataService.cs @@ -12,19 +12,11 @@ namespace MediaBrowser.Providers.Genres { public class GenreMetadataService : MetadataService<Genre, ItemLookupInfo> { - public GenreMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager) : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager) + public GenreMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager, ILibraryManager libraryManager) : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager, libraryManager) { } - /// <summary> - /// Merges the specified source. - /// </summary> - /// <param name="source">The source.</param> - /// <param name="target">The target.</param> - /// <param name="lockedFields">The locked fields.</param> - /// <param name="replaceData">if set to <c>true</c> [replace data].</param> - /// <param name="mergeMetadataSettings">if set to <c>true</c> [merge metadata settings].</param> - protected override void MergeData(Genre source, Genre target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) + protected override void MergeData(MetadataResult<Genre> source, MetadataResult<Genre> target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) { ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); } diff --git a/MediaBrowser.Providers/LiveTv/AudioRecordingService.cs b/MediaBrowser.Providers/LiveTv/AudioRecordingService.cs index 4fc5ba40d..b3d9d6a72 100644 --- a/MediaBrowser.Providers/LiveTv/AudioRecordingService.cs +++ b/MediaBrowser.Providers/LiveTv/AudioRecordingService.cs @@ -14,18 +14,11 @@ namespace MediaBrowser.Providers.LiveTv { public class AudioRecordingService : MetadataService<LiveTvAudioRecording, ItemLookupInfo> { - public AudioRecordingService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager) : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager) + public AudioRecordingService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager, ILibraryManager libraryManager) : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager, libraryManager) { } - /// <summary> - /// Merges the specified source. - /// </summary> - /// <param name="source">The source.</param> - /// <param name="target">The target.</param> - /// <param name="lockedFields">The locked fields.</param> - /// <param name="replaceData">if set to <c>true</c> [replace data].</param> - protected override void MergeData(LiveTvAudioRecording source, LiveTvAudioRecording target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) + protected override void MergeData(MetadataResult<LiveTvAudioRecording> source, MetadataResult<LiveTvAudioRecording> target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) { ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); } diff --git a/MediaBrowser.Providers/LiveTv/ChannelMetadataService.cs b/MediaBrowser.Providers/LiveTv/ChannelMetadataService.cs index 37bfe4107..231017cd9 100644 --- a/MediaBrowser.Providers/LiveTv/ChannelMetadataService.cs +++ b/MediaBrowser.Providers/LiveTv/ChannelMetadataService.cs @@ -14,14 +14,11 @@ namespace MediaBrowser.Providers.LiveTv { public class ChannelMetadataService : MetadataService<LiveTvChannel, ItemLookupInfo> { - public ChannelMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager) : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager) + public ChannelMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager, ILibraryManager libraryManager) : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager, libraryManager) { } - /// <summary> - /// Merges the specified source. - /// </summary> - protected override void MergeData(LiveTvChannel source, LiveTvChannel target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) + protected override void MergeData(MetadataResult<LiveTvChannel> source, MetadataResult<LiveTvChannel> target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) { ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); } diff --git a/MediaBrowser.Providers/LiveTv/ProgramMetadataService.cs b/MediaBrowser.Providers/LiveTv/ProgramMetadataService.cs index f17389615..8576993fd 100644 --- a/MediaBrowser.Providers/LiveTv/ProgramMetadataService.cs +++ b/MediaBrowser.Providers/LiveTv/ProgramMetadataService.cs @@ -12,23 +12,11 @@ namespace MediaBrowser.Providers.LiveTv { public class ProgramMetadataService : MetadataService<LiveTvProgram, LiveTvProgramLookupInfo> { - public ProgramMetadataService( - IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, - IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager) - : base( - serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager) + public ProgramMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager, ILibraryManager libraryManager) : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager, libraryManager) { } - /// <summary> - /// Merges the specified source. - /// </summary> - /// <param name="source">The source.</param> - /// <param name="target">The target.</param> - /// <param name="lockedFields">The locked fields.</param> - /// <param name="replaceData">if set to <c>true</c> [replace data].</param> - /// <param name="mergeMetadataSettings"></param> - protected override void MergeData(LiveTvProgram source, LiveTvProgram target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) + protected override void MergeData(MetadataResult<LiveTvProgram> source, MetadataResult<LiveTvProgram> target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) { ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); } diff --git a/MediaBrowser.Providers/LiveTv/VideoRecordingService.cs b/MediaBrowser.Providers/LiveTv/VideoRecordingService.cs index c47297d9c..4d8b27285 100644 --- a/MediaBrowser.Providers/LiveTv/VideoRecordingService.cs +++ b/MediaBrowser.Providers/LiveTv/VideoRecordingService.cs @@ -14,18 +14,11 @@ namespace MediaBrowser.Providers.LiveTv { public class VideoRecordingService : MetadataService<LiveTvVideoRecording, ItemLookupInfo> { - public VideoRecordingService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager) : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager) + public VideoRecordingService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager, ILibraryManager libraryManager) : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager, libraryManager) { } - /// <summary> - /// Merges the specified source. - /// </summary> - /// <param name="source">The source.</param> - /// <param name="target">The target.</param> - /// <param name="lockedFields">The locked fields.</param> - /// <param name="replaceData">if set to <c>true</c> [replace data].</param> - protected override void MergeData(LiveTvVideoRecording source, LiveTvVideoRecording target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) + protected override void MergeData(MetadataResult<LiveTvVideoRecording> source, MetadataResult<LiveTvVideoRecording> target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) { ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); } diff --git a/MediaBrowser.Providers/Manager/MetadataService.cs b/MediaBrowser.Providers/Manager/MetadataService.cs index bc0b1bcb2..de41a0f96 100644 --- a/MediaBrowser.Providers/Manager/MetadataService.cs +++ b/MediaBrowser.Providers/Manager/MetadataService.cs @@ -24,8 +24,9 @@ namespace MediaBrowser.Providers.Manager protected readonly IProviderRepository ProviderRepo; protected readonly IFileSystem FileSystem; protected readonly IUserDataManager UserDataManager; + protected readonly ILibraryManager LibraryManager; - protected MetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager) + protected MetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager, ILibraryManager libraryManager) { ServerConfigurationManager = serverConfigurationManager; Logger = logger; @@ -33,6 +34,7 @@ namespace MediaBrowser.Providers.Manager ProviderRepo = providerRepo; FileSystem = fileSystem; UserDataManager = userDataManager; + LibraryManager = libraryManager; } /// <summary> @@ -118,6 +120,11 @@ namespace MediaBrowser.Providers.Manager refreshResult.AddStatus(ProviderRefreshStatus.Failure, ex.Message); } + var metadataResult = new MetadataResult<TItemType> + { + Item = itemOfType + }; + // Next run metadata providers if (refreshOptions.MetadataRefreshMode != MetadataRefreshMode.None) { @@ -136,7 +143,7 @@ namespace MediaBrowser.Providers.Manager { var id = await CreateInitialLookupInfo(itemOfType, cancellationToken).ConfigureAwait(false); - var result = await RefreshWithProviders(itemOfType, id, refreshOptions, providers, itemImageProvider, cancellationToken).ConfigureAwait(false); + var result = await RefreshWithProviders(metadataResult, id, refreshOptions, providers, itemImageProvider, cancellationToken).ConfigureAwait(false); updateType = updateType | result.UpdateType; refreshResult.AddStatus(result.Status, result.ErrorMessage); @@ -174,7 +181,7 @@ namespace MediaBrowser.Providers.Manager } // Save to database - await SaveItem(itemOfType, updateType, cancellationToken); + await SaveItem(metadataResult, updateType, cancellationToken).ConfigureAwait(false); } if (updateType > ItemUpdateType.None || refreshResult.IsDirty) @@ -321,9 +328,14 @@ namespace MediaBrowser.Providers.Manager return providers; } - protected Task SaveItem(TItemType item, ItemUpdateType reason, CancellationToken cancellationToken) + protected async Task SaveItem(MetadataResult<TItemType> result, ItemUpdateType reason, CancellationToken cancellationToken) { - return item.UpdateToRepository(reason, cancellationToken); + await result.Item.UpdateToRepository(reason, cancellationToken).ConfigureAwait(false); + + if (result.Item.SupportsPeople) + { + await LibraryManager.UpdatePeople(result.Item as BaseItem, result.People); + } } public bool CanRefresh(IHasMetadata item) @@ -331,7 +343,7 @@ namespace MediaBrowser.Providers.Manager return item is TItemType; } - protected virtual async Task<RefreshResult> RefreshWithProviders(TItemType item, + protected virtual async Task<RefreshResult> RefreshWithProviders(MetadataResult<TItemType> metadata, TIdType id, MetadataRefreshOptions options, List<IMetadataProvider> providers, @@ -344,6 +356,8 @@ namespace MediaBrowser.Providers.Manager Providers = providers.Select(i => i.GetType().FullName.GetMD5()).ToList() }; + var item = metadata.Item; + var customProviders = providers.OfType<ICustomMetadataProvider<TItemType>>().ToList(); var logName = item.LocationType == LocationType.Remote ? item.Name ?? item.Path : item.Path ?? item.Name; @@ -352,11 +366,16 @@ namespace MediaBrowser.Providers.Manager await RunCustomProvider(provider, item, logName, options, refreshResult, cancellationToken).ConfigureAwait(false); } - var temp = CreateNew(); - temp.Path = item.Path; + var temp = new MetadataResult<TItemType> + { + Item = CreateNew() + }; + temp.Item.Path = item.Path; var successfulProviderCount = 0; var failedProviderCount = 0; + var userDataList = new List<UserItemData>(); + // If replacing all metadata, run internet providers first if (options.ReplaceAllMetadata) { @@ -371,7 +390,6 @@ namespace MediaBrowser.Providers.Manager } var hasLocalMetadata = false; - var userDataList = new List<UserItemData>(); foreach (var provider in providers.OfType<ILocalMetadataProvider<TItemType>>().ToList()) { @@ -393,7 +411,7 @@ namespace MediaBrowser.Providers.Manager userDataList = localItem.UserDataLIst; - MergeData(localItem.Item, temp, new List<MetadataFields>(), !options.ReplaceAllMetadata, true); + MergeData(localItem, temp, new List<MetadataFields>(), !options.ReplaceAllMetadata, true); refreshResult.UpdateType = refreshResult.UpdateType | ItemUpdateType.MetadataImport; // Only one local provider allowed per item @@ -452,10 +470,10 @@ namespace MediaBrowser.Providers.Manager if (!hasLocalMetadata) { // TODO: If the new metadata from above has some blank data, this can cause old data to get filled into those empty fields - MergeData(item, temp, new List<MetadataFields>(), false, true); + MergeData(metadata, temp, new List<MetadataFields>(), false, true); } - MergeData(temp, item, item.LockedFields, true, true); + MergeData(temp, metadata, item.LockedFields, true, true); } } @@ -526,7 +544,7 @@ namespace MediaBrowser.Providers.Manager return new TItemType(); } - private async Task<RefreshResult> ExecuteRemoteProviders(TItemType temp, string logName, TIdType id, IEnumerable<IRemoteMetadataProvider<TItemType, TIdType>> providers, CancellationToken cancellationToken) + private async Task<RefreshResult> ExecuteRemoteProviders(MetadataResult<TItemType> temp, string logName, TIdType id, IEnumerable<IRemoteMetadataProvider<TItemType, TIdType>> providers, CancellationToken cancellationToken) { var refreshResult = new RefreshResult(); @@ -537,7 +555,7 @@ namespace MediaBrowser.Providers.Manager if (id != null) { - MergeNewData(temp, id); + MergeNewData(temp.Item, id); } try @@ -548,7 +566,7 @@ namespace MediaBrowser.Providers.Manager { NormalizeRemoteResult(result.Item); - MergeData(result.Item, temp, new List<MetadataFields>(), false, false); + MergeData(result, temp, new List<MetadataFields>(), false, false); refreshResult.UpdateType = refreshResult.UpdateType | ItemUpdateType.MetadataDownload; @@ -624,8 +642,8 @@ namespace MediaBrowser.Providers.Manager } } - protected abstract void MergeData(TItemType source, - TItemType target, + protected abstract void MergeData(MetadataResult<TItemType> source, + MetadataResult<TItemType> target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings); diff --git a/MediaBrowser.Providers/Manager/ProviderManager.cs b/MediaBrowser.Providers/Manager/ProviderManager.cs index 01a89bf26..14009a94f 100644 --- a/MediaBrowser.Providers/Manager/ProviderManager.cs +++ b/MediaBrowser.Providers/Manager/ProviderManager.cs @@ -150,6 +150,11 @@ namespace MediaBrowser.Providers.Manager public Task SaveImage(IHasImages item, string source, string mimeType, ImageType type, int? imageIndex, string internalCacheKey, CancellationToken cancellationToken) { + if (string.IsNullOrWhiteSpace(source)) + { + throw new ArgumentNullException("source"); + } + var fileStream = _fileSystem.GetFileStream(source, FileMode.Open, FileAccess.Read, FileShare.ReadWrite, true); return new ImageSaver(ConfigurationManager, _libraryMonitor, _fileSystem, _logger).SaveImage(item, fileStream, mimeType, type, imageIndex, internalCacheKey, cancellationToken); @@ -480,12 +485,11 @@ namespace MediaBrowser.Providers.Manager // Give it a dummy path just so that it looks like a file system item var dummy = new T() { - Path = Path.Combine(_appPaths.InternalMetadataPath, "dummy"), - - // Dummy this up to fool the local trailer check - Parent = new Folder() + Path = Path.Combine(_appPaths.InternalMetadataPath, "dummy") }; + dummy.SetParent(new Folder()); + var options = GetMetadataOptions(dummy); var summary = new MetadataPluginSummary @@ -722,12 +726,11 @@ namespace MediaBrowser.Providers.Manager // Give it a dummy path just so that it looks like a file system item var dummy = new TItemType { - Path = Path.Combine(_appPaths.InternalMetadataPath, "dummy"), - - // Dummy this up to fool the local trailer check - Parent = new Folder() + Path = Path.Combine(_appPaths.InternalMetadataPath, "dummy") }; + dummy.SetParent(new Folder()); + var options = GetMetadataOptions(dummy); var providers = GetMetadataProvidersInternal<TItemType>(dummy, options, searchInfo.IncludeDisabledProviders) diff --git a/MediaBrowser.Providers/Manager/ProviderUtils.cs b/MediaBrowser.Providers/Manager/ProviderUtils.cs index 1c526b4db..a0a0493d5 100644 --- a/MediaBrowser.Providers/Manager/ProviderUtils.cs +++ b/MediaBrowser.Providers/Manager/ProviderUtils.cs @@ -1,5 +1,6 @@ using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities.Audio; +using MediaBrowser.Controller.Providers; using MediaBrowser.Model.Entities; using System; using System.Collections.Generic; @@ -8,12 +9,16 @@ namespace MediaBrowser.Providers.Manager { public static class ProviderUtils { - public static void MergeBaseItemData(BaseItem source, - BaseItem target, + public static void MergeBaseItemData<T>(MetadataResult<T> sourceResult, + MetadataResult<T> targetResult, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) + where T : BaseItem { + var source = sourceResult.Item; + var target = targetResult.Item; + if (source == null) { throw new ArgumentNullException("source"); @@ -100,9 +105,9 @@ namespace MediaBrowser.Providers.Manager if (!lockedFields.Contains(MetadataFields.Cast)) { - if (replaceData || target.People.Count == 0) + if (replaceData || targetResult.People.Count == 0) { - target.People = source.People; + targetResult.People = sourceResult.People; } } diff --git a/MediaBrowser.Providers/MediaInfo/FFProbeAudioInfo.cs b/MediaBrowser.Providers/MediaInfo/FFProbeAudioInfo.cs index 33f35450d..f2f1663e4 100644 --- a/MediaBrowser.Providers/MediaInfo/FFProbeAudioInfo.cs +++ b/MediaBrowser.Providers/MediaInfo/FFProbeAudioInfo.cs @@ -8,6 +8,7 @@ using MediaBrowser.Model.Dlna; using MediaBrowser.Model.Entities; using MediaBrowser.Model.MediaInfo; using MediaBrowser.Model.Serialization; +using System.Collections.Generic; using System.Globalization; using System.IO; using System.Linq; @@ -22,15 +23,17 @@ namespace MediaBrowser.Providers.MediaInfo private readonly IItemRepository _itemRepo; private readonly IApplicationPaths _appPaths; private readonly IJsonSerializer _json; + private readonly ILibraryManager _libraryManager; private readonly CultureInfo _usCulture = new CultureInfo("en-US"); - public FFProbeAudioInfo(IMediaEncoder mediaEncoder, IItemRepository itemRepo, IApplicationPaths appPaths, IJsonSerializer json) + public FFProbeAudioInfo(IMediaEncoder mediaEncoder, IItemRepository itemRepo, IApplicationPaths appPaths, IJsonSerializer json, ILibraryManager libraryManager) { _mediaEncoder = mediaEncoder; _itemRepo = itemRepo; _appPaths = appPaths; _json = json; + _libraryManager = libraryManager; } public async Task<ItemUpdateType> Probe<T>(T item, CancellationToken cancellationToken) @@ -96,7 +99,7 @@ namespace MediaBrowser.Providers.MediaInfo /// <param name="cancellationToken">The cancellation token.</param> /// <param name="mediaInfo">The media information.</param> /// <returns>Task.</returns> - protected Task Fetch(Audio audio, CancellationToken cancellationToken, Model.MediaInfo.MediaInfo mediaInfo) + protected async Task Fetch(Audio audio, CancellationToken cancellationToken, Model.MediaInfo.MediaInfo mediaInfo) { var mediaStreams = mediaInfo.MediaStreams; @@ -110,9 +113,9 @@ namespace MediaBrowser.Providers.MediaInfo var extension = (Path.GetExtension(audio.Path) ?? string.Empty).TrimStart('.'); audio.Container = extension; - FetchDataFromTags(audio, mediaInfo); + await FetchDataFromTags(audio, mediaInfo).ConfigureAwait(false); - return _itemRepo.SaveMediaStreams(audio.Id, mediaStreams, cancellationToken); + await _itemRepo.SaveMediaStreams(audio.Id, mediaStreams, cancellationToken).ConfigureAwait(false); } /// <summary> @@ -120,7 +123,7 @@ namespace MediaBrowser.Providers.MediaInfo /// </summary> /// <param name="audio">The audio.</param> /// <param name="data">The data.</param> - private void FetchDataFromTags(Audio audio, Model.MediaInfo.MediaInfo data) + private async Task FetchDataFromTags(Audio audio, Model.MediaInfo.MediaInfo data) { // Only set Name if title was found in the dictionary if (!string.IsNullOrEmpty(data.Title)) @@ -130,17 +133,19 @@ namespace MediaBrowser.Providers.MediaInfo if (!audio.LockedFields.Contains(MetadataFields.Cast)) { - audio.People.Clear(); + var people = new List<PersonInfo>(); foreach (var person in data.People) { - audio.AddPerson(new PersonInfo + PeopleHelper.AddPerson(people, new PersonInfo { Name = person.Name, Type = person.Type, Role = person.Role }); } + + await _libraryManager.UpdatePeople(audio, people).ConfigureAwait(false); } audio.Album = data.Album; diff --git a/MediaBrowser.Providers/MediaInfo/FFProbeProvider.cs b/MediaBrowser.Providers/MediaInfo/FFProbeProvider.cs index a6d3c0271..af7fc3df4 100644 --- a/MediaBrowser.Providers/MediaInfo/FFProbeProvider.cs +++ b/MediaBrowser.Providers/MediaInfo/FFProbeProvider.cs @@ -51,6 +51,7 @@ namespace MediaBrowser.Providers.MediaInfo private readonly IServerConfigurationManager _config; private readonly ISubtitleManager _subtitleManager; private readonly IChapterManager _chapterManager; + private readonly ILibraryManager _libraryManager; public string Name { @@ -92,7 +93,7 @@ namespace MediaBrowser.Providers.MediaInfo return FetchAudioInfo(item, cancellationToken); } - public FFProbeProvider(ILogger logger, IIsoManager isoManager, IMediaEncoder mediaEncoder, IItemRepository itemRepo, IBlurayExaminer blurayExaminer, ILocalizationManager localization, IApplicationPaths appPaths, IJsonSerializer json, IEncodingManager encodingManager, IFileSystem fileSystem, IServerConfigurationManager config, ISubtitleManager subtitleManager, IChapterManager chapterManager) + public FFProbeProvider(ILogger logger, IIsoManager isoManager, IMediaEncoder mediaEncoder, IItemRepository itemRepo, IBlurayExaminer blurayExaminer, ILocalizationManager localization, IApplicationPaths appPaths, IJsonSerializer json, IEncodingManager encodingManager, IFileSystem fileSystem, IServerConfigurationManager config, ISubtitleManager subtitleManager, IChapterManager chapterManager, ILibraryManager libraryManager) { _logger = logger; _isoManager = isoManager; @@ -107,6 +108,7 @@ namespace MediaBrowser.Providers.MediaInfo _config = config; _subtitleManager = subtitleManager; _chapterManager = chapterManager; + _libraryManager = libraryManager; } private readonly Task<ItemUpdateType> _cachedTask = Task.FromResult(ItemUpdateType.None); @@ -138,8 +140,8 @@ namespace MediaBrowser.Providers.MediaInfo FetchShortcutInfo(item); return Task.FromResult(ItemUpdateType.MetadataEdit); } - - var prober = new FFProbeVideoInfo(_logger, _isoManager, _mediaEncoder, _itemRepo, _blurayExaminer, _localization, _appPaths, _json, _encodingManager, _fileSystem, _config, _subtitleManager, _chapterManager); + + var prober = new FFProbeVideoInfo(_logger, _isoManager, _mediaEncoder, _itemRepo, _blurayExaminer, _localization, _appPaths, _json, _encodingManager, _fileSystem, _config, _subtitleManager, _chapterManager, _libraryManager); return prober.ProbeVideo(item, options, cancellationToken); } @@ -157,7 +159,7 @@ namespace MediaBrowser.Providers.MediaInfo return _cachedTask; } - var prober = new FFProbeAudioInfo(_mediaEncoder, _itemRepo, _appPaths, _json); + var prober = new FFProbeAudioInfo(_mediaEncoder, _itemRepo, _appPaths, _json, _libraryManager); return prober.Probe(item, cancellationToken); } diff --git a/MediaBrowser.Providers/MediaInfo/FFProbeVideoInfo.cs b/MediaBrowser.Providers/MediaInfo/FFProbeVideoInfo.cs index e1ee6ac5a..395d95cc5 100644 --- a/MediaBrowser.Providers/MediaInfo/FFProbeVideoInfo.cs +++ b/MediaBrowser.Providers/MediaInfo/FFProbeVideoInfo.cs @@ -46,10 +46,11 @@ namespace MediaBrowser.Providers.MediaInfo private readonly IServerConfigurationManager _config; private readonly ISubtitleManager _subtitleManager; private readonly IChapterManager _chapterManager; + private readonly ILibraryManager _libraryManager; private readonly CultureInfo _usCulture = new CultureInfo("en-US"); - public FFProbeVideoInfo(ILogger logger, IIsoManager isoManager, IMediaEncoder mediaEncoder, IItemRepository itemRepo, IBlurayExaminer blurayExaminer, ILocalizationManager localization, IApplicationPaths appPaths, IJsonSerializer json, IEncodingManager encodingManager, IFileSystem fileSystem, IServerConfigurationManager config, ISubtitleManager subtitleManager, IChapterManager chapterManager) + public FFProbeVideoInfo(ILogger logger, IIsoManager isoManager, IMediaEncoder mediaEncoder, IItemRepository itemRepo, IBlurayExaminer blurayExaminer, ILocalizationManager localization, IApplicationPaths appPaths, IJsonSerializer json, IEncodingManager encodingManager, IFileSystem fileSystem, IServerConfigurationManager config, ISubtitleManager subtitleManager, IChapterManager chapterManager, ILibraryManager libraryManager) { _logger = logger; _isoManager = isoManager; @@ -64,6 +65,7 @@ namespace MediaBrowser.Providers.MediaInfo _config = config; _subtitleManager = subtitleManager; _chapterManager = chapterManager; + _libraryManager = libraryManager; } public async Task<ItemUpdateType> ProbeVideo<T>(T item, @@ -219,6 +221,7 @@ namespace MediaBrowser.Providers.MediaInfo await AddExternalSubtitles(video, mediaStreams, options, cancellationToken).ConfigureAwait(false); FetchEmbeddedInfo(video, mediaInfo, options); + await FetchPeople(video, mediaInfo, options).ConfigureAwait(false); video.IsHD = mediaStreams.Any(i => i.Type == MediaStreamType.Video && i.Width.HasValue && i.Width.Value >= 1270); @@ -370,24 +373,6 @@ namespace MediaBrowser.Providers.MediaInfo } } - if (!video.LockedFields.Contains(MetadataFields.Cast)) - { - if (video.People.Count == 0 || isFullRefresh) - { - video.People.Clear(); - - foreach (var person in data.People) - { - video.AddPerson(new PersonInfo - { - Name = person.Name, - Type = person.Type, - Role = person.Role - }); - } - } - } - if (!video.LockedFields.Contains(MetadataFields.Genres)) { if (video.Genres.Count == 0 || isFullRefresh) @@ -458,6 +443,31 @@ namespace MediaBrowser.Providers.MediaInfo } } + private async Task FetchPeople(Video video, Model.MediaInfo.MediaInfo data, MetadataRefreshOptions options) + { + var isFullRefresh = options.MetadataRefreshMode == MetadataRefreshMode.FullRefresh; + + if (!video.LockedFields.Contains(MetadataFields.Cast)) + { + if (isFullRefresh || _libraryManager.GetPeople(video).Count == 0) + { + var people = new List<PersonInfo>(); + + foreach (var person in data.People) + { + PeopleHelper.AddPerson(people, new PersonInfo + { + Name = person.Name, + Type = person.Type, + Role = person.Role + }); + } + + await _libraryManager.UpdatePeople(video, people); + } + } + } + private SubtitleOptions GetOptions() { return _config.GetConfiguration<SubtitleOptions>("subtitles"); diff --git a/MediaBrowser.Providers/Movies/GenericMovieDbInfo.cs b/MediaBrowser.Providers/Movies/GenericMovieDbInfo.cs index c23ed3786..6854ff12b 100644 --- a/MediaBrowser.Providers/Movies/GenericMovieDbInfo.cs +++ b/MediaBrowser.Providers/Movies/GenericMovieDbInfo.cs @@ -34,8 +34,6 @@ namespace MediaBrowser.Providers.Movies public async Task<MetadataResult<T>> GetMetadata(ItemLookupInfo itemId, CancellationToken cancellationToken) { - var result = new MetadataResult<T>(); - var tmdbId = itemId.GetProviderId(MetadataProviders.Tmdb); var imdbId = itemId.GetProviderId(MetadataProviders.Imdb); @@ -56,12 +54,10 @@ namespace MediaBrowser.Providers.Movies { cancellationToken.ThrowIfCancellationRequested(); - result.Item = await FetchMovieData(tmdbId, imdbId, itemId.MetadataLanguage, itemId.MetadataCountryCode, cancellationToken).ConfigureAwait(false); - - result.HasMetadata = result.Item != null; + return await FetchMovieData(tmdbId, imdbId, itemId.MetadataLanguage, itemId.MetadataCountryCode, cancellationToken).ConfigureAwait(false); } - return result; + return new MetadataResult<T>(); } /// <summary> @@ -73,8 +69,13 @@ namespace MediaBrowser.Providers.Movies /// <param name="preferredCountryCode">The preferred country code.</param> /// <param name="cancellationToken">The cancellation token.</param> /// <returns>Task{`0}.</returns> - private async Task<T> FetchMovieData(string tmdbId, string imdbId, string language, string preferredCountryCode, CancellationToken cancellationToken) + private async Task<MetadataResult<T>> FetchMovieData(string tmdbId, string imdbId, string language, string preferredCountryCode, CancellationToken cancellationToken) { + var item = new MetadataResult<T> + { + Item = new T() + }; + string dataFilePath = null; MovieDbProvider.CompleteMovieData movieInfo = null; @@ -82,7 +83,7 @@ namespace MediaBrowser.Providers.Movies if (string.IsNullOrEmpty(tmdbId)) { movieInfo = await MovieDbProvider.Current.FetchMainResult(imdbId, false, language, cancellationToken).ConfigureAwait(false); - if (movieInfo == null) return null; + if (movieInfo == null) return item; tmdbId = movieInfo.id.ToString(_usCulture); @@ -96,9 +97,8 @@ namespace MediaBrowser.Providers.Movies dataFilePath = dataFilePath ?? MovieDbProvider.Current.GetDataFilePath(tmdbId, language); movieInfo = movieInfo ?? _jsonSerializer.DeserializeFromFile<MovieDbProvider.CompleteMovieData>(dataFilePath); - var item = new T(); - ProcessMainInfo(item, preferredCountryCode, movieInfo); + item.HasMetadata = true; return item; } @@ -106,11 +106,13 @@ namespace MediaBrowser.Providers.Movies /// <summary> /// Processes the main info. /// </summary> - /// <param name="movie">The movie.</param> + /// <param name="resultItem">The result item.</param> /// <param name="preferredCountryCode">The preferred country code.</param> /// <param name="movieData">The movie data.</param> - private void ProcessMainInfo(T movie, string preferredCountryCode, MovieDbProvider.CompleteMovieData movieData) + private void ProcessMainInfo(MetadataResult<T> resultItem, string preferredCountryCode, MovieDbProvider.CompleteMovieData movieData) { + var movie = resultItem.Item; + movie.Name = movieData.GetTitle() ?? movie.Name; var hasOriginalTitle = movie as IHasOriginalTitle; @@ -233,13 +235,19 @@ namespace MediaBrowser.Providers.Movies //actors come from cast if (movieData.casts != null && movieData.casts.cast != null) { - foreach (var actor in movieData.casts.cast.OrderBy(a => a.order)) movie.AddPerson(new PersonInfo { Name = actor.name.Trim(), Role = actor.character, Type = PersonType.Actor, SortOrder = actor.order }); + foreach (var actor in movieData.casts.cast.OrderBy(a => a.order)) + { + PeopleHelper.AddPerson(resultItem.People, new PersonInfo { Name = actor.name.Trim(), Role = actor.character, Type = PersonType.Actor, SortOrder = actor.order }); + } } //and the rest from crew if (movieData.casts != null && movieData.casts.crew != null) { - foreach (var person in movieData.casts.crew) movie.AddPerson(new PersonInfo { Name = person.name.Trim(), Role = person.job, Type = person.department }); + foreach (var person in movieData.casts.crew) + { + PeopleHelper.AddPerson(resultItem.People, new PersonInfo { Name = person.name.Trim(), Role = person.job, Type = person.department }); + } } if (movieData.keywords != null && movieData.keywords.keywords != null) diff --git a/MediaBrowser.Providers/Movies/MovieMetadataService.cs b/MediaBrowser.Providers/Movies/MovieMetadataService.cs index f886deb00..e96e89a78 100644 --- a/MediaBrowser.Providers/Movies/MovieMetadataService.cs +++ b/MediaBrowser.Providers/Movies/MovieMetadataService.cs @@ -12,28 +12,10 @@ namespace MediaBrowser.Providers.Movies { public class MovieMetadataService : MetadataService<Movie, MovieInfo> { - public MovieMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager) : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager) + public MovieMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager, ILibraryManager libraryManager) : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager, libraryManager) { } - /// <summary> - /// Merges the specified source. - /// </summary> - /// <param name="source">The source.</param> - /// <param name="target">The target.</param> - /// <param name="lockedFields">The locked fields.</param> - /// <param name="replaceData">if set to <c>true</c> [replace data].</param> - /// <param name="mergeMetadataSettings">if set to <c>true</c> [merge metadata settings].</param> - protected override void MergeData(Movie source, Movie target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) - { - ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); - - if (replaceData || string.IsNullOrEmpty(target.TmdbCollectionName)) - { - target.TmdbCollectionName = source.TmdbCollectionName; - } - } - protected override bool IsFullLocalMetadata(Movie item) { if (string.IsNullOrWhiteSpace(item.Overview)) @@ -46,5 +28,18 @@ namespace MediaBrowser.Providers.Movies } return base.IsFullLocalMetadata(item); } + + protected override void MergeData(MetadataResult<Movie> source, MetadataResult<Movie> target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) + { + ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); + + var sourceItem = source.Item; + var targetItem = target.Item; + + if (replaceData || string.IsNullOrEmpty(targetItem.TmdbCollectionName)) + { + targetItem.TmdbCollectionName = sourceItem.TmdbCollectionName; + } + } } } diff --git a/MediaBrowser.Providers/Music/AlbumMetadataService.cs b/MediaBrowser.Providers/Music/AlbumMetadataService.cs index 90248e418..859db37ba 100644 --- a/MediaBrowser.Providers/Music/AlbumMetadataService.cs +++ b/MediaBrowser.Providers/Music/AlbumMetadataService.cs @@ -15,28 +15,10 @@ namespace MediaBrowser.Providers.Music { public class AlbumMetadataService : MetadataService<MusicAlbum, AlbumInfo> { - public AlbumMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager) : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager) + public AlbumMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager, ILibraryManager libraryManager) : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager, libraryManager) { } - /// <summary> - /// Merges the specified source. - /// </summary> - /// <param name="source">The source.</param> - /// <param name="target">The target.</param> - /// <param name="lockedFields">The locked fields.</param> - /// <param name="replaceData">if set to <c>true</c> [replace data].</param> - /// <param name="mergeMetadataSettings">if set to <c>true</c> [merge metadata settings].</param> - protected override void MergeData(MusicAlbum source, MusicAlbum target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) - { - ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); - - if (replaceData || target.Artists.Count == 0) - { - target.Artists = source.Artists; - } - } - protected override async Task<ItemUpdateType> BeforeSave(MusicAlbum item, bool isFullRefresh, ItemUpdateType currentUpdateType) { var updateType = await base.BeforeSave(item, isFullRefresh, currentUpdateType).ConfigureAwait(false); @@ -171,5 +153,18 @@ namespace MediaBrowser.Providers.Music return updateType; } + + protected override void MergeData(MetadataResult<MusicAlbum> source, MetadataResult<MusicAlbum> target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) + { + ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); + + var sourceItem = source.Item; + var targetItem = target.Item; + + if (replaceData || targetItem.Artists.Count == 0) + { + targetItem.Artists = sourceItem.Artists; + } + } } } diff --git a/MediaBrowser.Providers/Music/ArtistMetadataService.cs b/MediaBrowser.Providers/Music/ArtistMetadataService.cs index 790529371..0032aac62 100644 --- a/MediaBrowser.Providers/Music/ArtistMetadataService.cs +++ b/MediaBrowser.Providers/Music/ArtistMetadataService.cs @@ -15,24 +15,8 @@ namespace MediaBrowser.Providers.Music { public class ArtistMetadataService : MetadataService<MusicArtist, ArtistInfo> { - private readonly ILibraryManager _libraryManager; - - public ArtistMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager, ILibraryManager libraryManager) : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager) + public ArtistMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager, ILibraryManager libraryManager) : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager, libraryManager) { - _libraryManager = libraryManager; - } - - /// <summary> - /// Merges the specified source. - /// </summary> - /// <param name="source">The source.</param> - /// <param name="target">The target.</param> - /// <param name="lockedFields">The locked fields.</param> - /// <param name="replaceData">if set to <c>true</c> [replace data].</param> - /// <param name="mergeMetadataSettings">if set to <c>true</c> [merge metadata settings].</param> - protected override void MergeData(MusicArtist source, MusicArtist target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) - { - ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); } protected override async Task<ItemUpdateType> BeforeSave(MusicArtist item, bool isFullRefresh, ItemUpdateType currentUpdateType) @@ -46,7 +30,7 @@ namespace MediaBrowser.Providers.Music var itemFilter = item.GetItemFilter(); var taggedItems = item.IsAccessedByName ? - _libraryManager.RootFolder.GetRecursiveChildren(i => !i.IsFolder && itemFilter(i)).ToList() : + LibraryManager.RootFolder.GetRecursiveChildren(i => !i.IsFolder && itemFilter(i)).ToList() : item.GetRecursiveChildren(i => i is IHasArtist && !i.IsFolder).ToList(); if (!item.LockedFields.Contains(MetadataFields.Genres)) @@ -67,5 +51,10 @@ namespace MediaBrowser.Providers.Music return updateType; } + + protected override void MergeData(MetadataResult<MusicArtist> source, MetadataResult<MusicArtist> target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) + { + ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); + } } } diff --git a/MediaBrowser.Providers/Music/AudioMetadataService.cs b/MediaBrowser.Providers/Music/AudioMetadataService.cs index 908913910..b4d50a173 100644 --- a/MediaBrowser.Providers/Music/AudioMetadataService.cs +++ b/MediaBrowser.Providers/Music/AudioMetadataService.cs @@ -12,30 +12,25 @@ namespace MediaBrowser.Providers.Music { public class AudioMetadataService : MetadataService<Audio, SongInfo> { - public AudioMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager) : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager) + public AudioMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager, ILibraryManager libraryManager) : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager, libraryManager) { } - /// <summary> - /// Merges the specified source. - /// </summary> - /// <param name="source">The source.</param> - /// <param name="target">The target.</param> - /// <param name="lockedFields">The locked fields.</param> - /// <param name="replaceData">if set to <c>true</c> [replace data].</param> - /// <param name="mergeMetadataSettings">if set to <c>true</c> [merge metadata settings].</param> - protected override void MergeData(Audio source, Audio target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) + protected override void MergeData(MetadataResult<Audio> source, MetadataResult<Audio> target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) { ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); - if (replaceData || target.Artists.Count == 0) + var sourceItem = source.Item; + var targetItem = target.Item; + + if (replaceData || targetItem.Artists.Count == 0) { - target.Artists = source.Artists; + targetItem.Artists = sourceItem.Artists; } - if (replaceData || string.IsNullOrEmpty(target.Album)) + if (replaceData || string.IsNullOrEmpty(targetItem.Album)) { - target.Album = source.Album; + targetItem.Album = sourceItem.Album; } } } diff --git a/MediaBrowser.Providers/Music/MusicVideoMetadataService.cs b/MediaBrowser.Providers/Music/MusicVideoMetadataService.cs index bbb456b2b..0456dbfba 100644 --- a/MediaBrowser.Providers/Music/MusicVideoMetadataService.cs +++ b/MediaBrowser.Providers/Music/MusicVideoMetadataService.cs @@ -13,30 +13,25 @@ namespace MediaBrowser.Providers.Music { class MusicVideoMetadataService : MetadataService<MusicVideo, MusicVideoInfo> { - public MusicVideoMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager) : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager) + public MusicVideoMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager, ILibraryManager libraryManager) : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager, libraryManager) { } - /// <summary> - /// Merges the specified source. - /// </summary> - /// <param name="source">The source.</param> - /// <param name="target">The target.</param> - /// <param name="lockedFields">The locked fields.</param> - /// <param name="replaceData">if set to <c>true</c> [replace data].</param> - /// <param name="mergeMetadataSettings">if set to <c>true</c> [merge metadata settings].</param> - protected override void MergeData(MusicVideo source, MusicVideo target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) + protected override void MergeData(MetadataResult<MusicVideo> source, MetadataResult<MusicVideo> target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) { ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); - if (replaceData || string.IsNullOrEmpty(target.Album)) + var sourceItem = source.Item; + var targetItem = target.Item; + + if (replaceData || string.IsNullOrEmpty(targetItem.Album)) { - target.Album = source.Album; + targetItem.Album = sourceItem.Album; } - if (replaceData || target.Artists.Count == 0) + if (replaceData || targetItem.Artists.Count == 0) { - target.Artists = source.Artists.ToList(); + targetItem.Artists = sourceItem.Artists.ToList(); } } } diff --git a/MediaBrowser.Providers/MusicGenres/MusicGenreMetadataService.cs b/MediaBrowser.Providers/MusicGenres/MusicGenreMetadataService.cs index b3c0427bf..107b76609 100644 --- a/MediaBrowser.Providers/MusicGenres/MusicGenreMetadataService.cs +++ b/MediaBrowser.Providers/MusicGenres/MusicGenreMetadataService.cs @@ -12,19 +12,11 @@ namespace MediaBrowser.Providers.MusicGenres { public class MusicGenreMetadataService : MetadataService<MusicGenre, ItemLookupInfo> { - public MusicGenreMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager) : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager) + public MusicGenreMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager, ILibraryManager libraryManager) : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager, libraryManager) { } - /// <summary> - /// Merges the specified source. - /// </summary> - /// <param name="source">The source.</param> - /// <param name="target">The target.</param> - /// <param name="lockedFields">The locked fields.</param> - /// <param name="replaceData">if set to <c>true</c> [replace data].</param> - /// <param name="mergeMetadataSettings">if set to <c>true</c> [merge metadata settings].</param> - protected override void MergeData(MusicGenre source, MusicGenre target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) + protected override void MergeData(MetadataResult<MusicGenre> source, MetadataResult<MusicGenre> target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) { ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); } diff --git a/MediaBrowser.Providers/Omdb/OmdbItemProvider.cs b/MediaBrowser.Providers/Omdb/OmdbItemProvider.cs index 596b864f7..dffabd83c 100644 --- a/MediaBrowser.Providers/Omdb/OmdbItemProvider.cs +++ b/MediaBrowser.Providers/Omdb/OmdbItemProvider.cs @@ -172,7 +172,7 @@ namespace MediaBrowser.Providers.Omdb result.Item.SetProviderId(MetadataProviders.Imdb, imdbId); result.HasMetadata = true; - await new OmdbProvider(_jsonSerializer, _httpClient).Fetch(result.Item, imdbId, cancellationToken).ConfigureAwait(false); + await new OmdbProvider(_jsonSerializer, _httpClient).Fetch(result.Item, imdbId, info.MetadataLanguage, cancellationToken).ConfigureAwait(false); } return result; @@ -211,7 +211,7 @@ namespace MediaBrowser.Providers.Omdb result.Item.SetProviderId(MetadataProviders.Imdb, imdbId); result.HasMetadata = true; - await new OmdbProvider(_jsonSerializer, _httpClient).Fetch(result.Item, imdbId, cancellationToken).ConfigureAwait(false); + await new OmdbProvider(_jsonSerializer, _httpClient).Fetch(result.Item, imdbId, info.MetadataLanguage, cancellationToken).ConfigureAwait(false); } return result; diff --git a/MediaBrowser.Providers/Omdb/OmdbProvider.cs b/MediaBrowser.Providers/Omdb/OmdbProvider.cs index e55321bb1..aee1abd72 100644 --- a/MediaBrowser.Providers/Omdb/OmdbProvider.cs +++ b/MediaBrowser.Providers/Omdb/OmdbProvider.cs @@ -28,7 +28,7 @@ namespace MediaBrowser.Providers.Omdb Current = this; } - public async Task Fetch(BaseItem item, string imdbId, CancellationToken cancellationToken) + public async Task Fetch(BaseItem item, string imdbId, string language, CancellationToken cancellationToken) { if (string.IsNullOrWhiteSpace(imdbId)) { @@ -51,7 +51,11 @@ namespace MediaBrowser.Providers.Omdb { var result = _jsonSerializer.DeserializeFromStream<RootObject>(stream); - item.Name = result.Title; + // Only take the name if the user's language is set to english, since Omdb has no localization + if (string.Equals(language, "en", StringComparison.OrdinalIgnoreCase)) + { + item.Name = result.Title; + } int year; diff --git a/MediaBrowser.Providers/People/PersonMetadataService.cs b/MediaBrowser.Providers/People/PersonMetadataService.cs index dff5a7e61..9961ff8dc 100644 --- a/MediaBrowser.Providers/People/PersonMetadataService.cs +++ b/MediaBrowser.Providers/People/PersonMetadataService.cs @@ -14,25 +14,20 @@ namespace MediaBrowser.Providers.People { public class PersonMetadataService : MetadataService<Person, PersonLookupInfo> { - public PersonMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager) : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager) + public PersonMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager, ILibraryManager libraryManager) : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager, libraryManager) { } - /// <summary> - /// Merges the specified source. - /// </summary> - /// <param name="source">The source.</param> - /// <param name="target">The target.</param> - /// <param name="lockedFields">The locked fields.</param> - /// <param name="replaceData">if set to <c>true</c> [replace data].</param> - /// <param name="mergeMetadataSettings">if set to <c>true</c> [merge metadata settings].</param> - protected override void MergeData(Person source, Person target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) + protected override void MergeData(MetadataResult<Person> source, MetadataResult<Person> target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) { ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); - if (replaceData || string.IsNullOrEmpty(target.PlaceOfBirth)) + var sourceItem = source.Item; + var targetItem = target.Item; + + if (replaceData || string.IsNullOrEmpty(targetItem.PlaceOfBirth)) { - target.PlaceOfBirth = source.PlaceOfBirth; + targetItem.PlaceOfBirth = sourceItem.PlaceOfBirth; } } } diff --git a/MediaBrowser.Providers/People/TvdbPersonImageProvider.cs b/MediaBrowser.Providers/People/TvdbPersonImageProvider.cs index 0258fd539..86e2cfaf7 100644 --- a/MediaBrowser.Providers/People/TvdbPersonImageProvider.cs +++ b/MediaBrowser.Providers/People/TvdbPersonImageProvider.cs @@ -21,13 +21,13 @@ namespace MediaBrowser.Providers.People public class TvdbPersonImageProvider : IRemoteImageProvider, IHasOrder { private readonly IServerConfigurationManager _config; - private readonly ILibraryManager _library; + private readonly ILibraryManager _libraryManager; private readonly IHttpClient _httpClient; - public TvdbPersonImageProvider(IServerConfigurationManager config, ILibraryManager library, IHttpClient httpClient) + public TvdbPersonImageProvider(IServerConfigurationManager config, ILibraryManager libraryManager, IHttpClient httpClient) { _config = config; - _library = library; + _libraryManager = libraryManager; _httpClient = httpClient; } @@ -59,9 +59,13 @@ namespace MediaBrowser.Providers.People // Avoid implicitly captured closure var itemName = item.Name; - var seriesWithPerson = _library.RootFolder - .GetRecursiveChildren(i => i is Series && !string.IsNullOrEmpty(i.GetProviderId(MetadataProviders.Tvdb)) && i.People.Any(p => string.Equals(p.Name, itemName, StringComparison.OrdinalIgnoreCase))) - .Cast<Series>() + var seriesWithPerson = _libraryManager.GetItems(new InternalItemsQuery + { + IncludeItemTypes = new[] { typeof(Series).Name }, + Person = itemName + + }).Items.Cast<Series>() + .Where(i => !string.IsNullOrEmpty(i.GetProviderId(MetadataProviders.Tvdb))) .ToList(); var infos = seriesWithPerson.Select(i => GetImageFromSeriesData(i, item.Name, cancellationToken)) diff --git a/MediaBrowser.Providers/Photos/PhotoAlbumMetadataService.cs b/MediaBrowser.Providers/Photos/PhotoAlbumMetadataService.cs index 822961d81..1c5d7f1b5 100644 --- a/MediaBrowser.Providers/Photos/PhotoAlbumMetadataService.cs +++ b/MediaBrowser.Providers/Photos/PhotoAlbumMetadataService.cs @@ -12,20 +12,11 @@ namespace MediaBrowser.Providers.Photos { class PhotoAlbumMetadataService : MetadataService<PhotoAlbum, ItemLookupInfo> { - public PhotoAlbumMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager) - : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager) + public PhotoAlbumMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager, ILibraryManager libraryManager) : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager, libraryManager) { } - /// <summary> - /// Merges the specified source. - /// </summary> - /// <param name="source">The source.</param> - /// <param name="target">The target.</param> - /// <param name="lockedFields">The locked fields.</param> - /// <param name="replaceData">if set to <c>true</c> [replace data].</param> - /// <param name="mergeMetadataSettings">if set to <c>true</c> [merge metadata settings].</param> - protected override void MergeData(PhotoAlbum source, PhotoAlbum target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) + protected override void MergeData(MetadataResult<PhotoAlbum> source, MetadataResult<PhotoAlbum> target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) { ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); } diff --git a/MediaBrowser.Providers/Photos/PhotoMetadataService.cs b/MediaBrowser.Providers/Photos/PhotoMetadataService.cs index 5e903bdc3..22a60ea08 100644 --- a/MediaBrowser.Providers/Photos/PhotoMetadataService.cs +++ b/MediaBrowser.Providers/Photos/PhotoMetadataService.cs @@ -12,19 +12,11 @@ namespace MediaBrowser.Providers.Photos { class PhotoMetadataService : MetadataService<Photo, ItemLookupInfo> { - public PhotoMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager) : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager) + public PhotoMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager, ILibraryManager libraryManager) : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager, libraryManager) { } - /// <summary> - /// Merges the specified source. - /// </summary> - /// <param name="source">The source.</param> - /// <param name="target">The target.</param> - /// <param name="lockedFields">The locked fields.</param> - /// <param name="replaceData">if set to <c>true</c> [replace data].</param> - /// <param name="mergeMetadataSettings">if set to <c>true</c> [merge metadata settings].</param> - protected override void MergeData(Photo source, Photo target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) + protected override void MergeData(MetadataResult<Photo> source, MetadataResult<Photo> target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) { ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); } diff --git a/MediaBrowser.Providers/Playlists/PlaylistMetadataService.cs b/MediaBrowser.Providers/Playlists/PlaylistMetadataService.cs index c53a89db7..af4393d18 100644 --- a/MediaBrowser.Providers/Playlists/PlaylistMetadataService.cs +++ b/MediaBrowser.Providers/Playlists/PlaylistMetadataService.cs @@ -12,31 +12,26 @@ namespace MediaBrowser.Providers.Playlists { class PlaylistMetadataService : MetadataService<Playlist, ItemLookupInfo> { - public PlaylistMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager) : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager) + public PlaylistMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager, ILibraryManager libraryManager) : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager, libraryManager) { } - /// <summary> - /// Merges the specified source. - /// </summary> - /// <param name="source">The source.</param> - /// <param name="target">The target.</param> - /// <param name="lockedFields">The locked fields.</param> - /// <param name="replaceData">if set to <c>true</c> [replace data].</param> - /// <param name="mergeMetadataSettings">if set to <c>true</c> [merge metadata settings].</param> - protected override void MergeData(Playlist source, Playlist target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) + protected override void MergeData(MetadataResult<Playlist> source, MetadataResult<Playlist> target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) { ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); - if (replaceData || string.IsNullOrEmpty(target.PlaylistMediaType)) + var sourceItem = source.Item; + var targetItem = target.Item; + + if (replaceData || string.IsNullOrEmpty(targetItem.PlaylistMediaType)) { - target.PlaylistMediaType = source.PlaylistMediaType; + targetItem.PlaylistMediaType = sourceItem.PlaylistMediaType; } if (mergeMetadataSettings) { - target.LinkedChildren = source.LinkedChildren; - target.Shares = source.Shares; + targetItem.LinkedChildren = sourceItem.LinkedChildren; + targetItem.Shares = sourceItem.Shares; } } } diff --git a/MediaBrowser.Providers/Studios/StudioMetadataService.cs b/MediaBrowser.Providers/Studios/StudioMetadataService.cs index dcd90ecf6..5b273d8ca 100644 --- a/MediaBrowser.Providers/Studios/StudioMetadataService.cs +++ b/MediaBrowser.Providers/Studios/StudioMetadataService.cs @@ -14,18 +14,11 @@ namespace MediaBrowser.Providers.Studios { public class StudioMetadataService : MetadataService<Studio, ItemLookupInfo> { - public StudioMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager) : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager) + public StudioMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager, ILibraryManager libraryManager) : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager, libraryManager) { } - /// <summary> - /// Merges the specified source. - /// </summary> - /// <param name="source">The source.</param> - /// <param name="target">The target.</param> - /// <param name="lockedFields">The locked fields.</param> - /// <param name="replaceData">if set to <c>true</c> [replace data].</param> - protected override void MergeData(Studio source, Studio target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) + protected override void MergeData(MetadataResult<Studio> source, MetadataResult<Studio> target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) { ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); } diff --git a/MediaBrowser.Providers/TV/DummySeasonProvider.cs b/MediaBrowser.Providers/TV/DummySeasonProvider.cs index fb5282551..426ff4318 100644 --- a/MediaBrowser.Providers/TV/DummySeasonProvider.cs +++ b/MediaBrowser.Providers/TV/DummySeasonProvider.cs @@ -111,10 +111,11 @@ namespace MediaBrowser.Providers.TV { Name = seasonName, IndexNumber = seasonNumber, - Parent = series, Id = (series.Id + (seasonNumber ?? -1).ToString(_usCulture) + seasonName).GetMBId(typeof(Season)) }; + season.SetParent(series); + await series.AddChild(season, cancellationToken).ConfigureAwait(false); await season.RefreshMetadata(new MetadataRefreshOptions(), cancellationToken).ConfigureAwait(false); diff --git a/MediaBrowser.Providers/TV/EpisodeMetadataService.cs b/MediaBrowser.Providers/TV/EpisodeMetadataService.cs index 616db8d86..339967eeb 100644 --- a/MediaBrowser.Providers/TV/EpisodeMetadataService.cs +++ b/MediaBrowser.Providers/TV/EpisodeMetadataService.cs @@ -12,55 +12,50 @@ namespace MediaBrowser.Providers.TV { public class EpisodeMetadataService : MetadataService<Episode, EpisodeInfo> { - public EpisodeMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager) : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager) + public EpisodeMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager, ILibraryManager libraryManager) : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager, libraryManager) { } - /// <summary> - /// Merges the specified source. - /// </summary> - /// <param name="source">The source.</param> - /// <param name="target">The target.</param> - /// <param name="lockedFields">The locked fields.</param> - /// <param name="replaceData">if set to <c>true</c> [replace data].</param> - /// <param name="mergeMetadataSettings">if set to <c>true</c> [merge metadata settings].</param> - protected override void MergeData(Episode source, Episode target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) + protected override void MergeData(MetadataResult<Episode> source, MetadataResult<Episode> target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) { ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); - if (replaceData || !target.AirsBeforeSeasonNumber.HasValue) + var sourceItem = source.Item; + var targetItem = target.Item; + + if (replaceData || !targetItem.AirsBeforeSeasonNumber.HasValue) { - target.AirsBeforeSeasonNumber = source.AirsBeforeSeasonNumber; + targetItem.AirsBeforeSeasonNumber = sourceItem.AirsBeforeSeasonNumber; } - if (replaceData || !target.AirsAfterSeasonNumber.HasValue) + if (replaceData || !targetItem.AirsAfterSeasonNumber.HasValue) { - target.AirsAfterSeasonNumber = source.AirsAfterSeasonNumber; + targetItem.AirsAfterSeasonNumber = sourceItem.AirsAfterSeasonNumber; } - if (replaceData || !target.AirsBeforeEpisodeNumber.HasValue) + if (replaceData || !targetItem.AirsBeforeEpisodeNumber.HasValue) { - target.AirsBeforeEpisodeNumber = source.AirsBeforeEpisodeNumber; + targetItem.AirsBeforeEpisodeNumber = sourceItem.AirsBeforeEpisodeNumber; } - if (replaceData || !target.DvdSeasonNumber.HasValue) + if (replaceData || !targetItem.DvdSeasonNumber.HasValue) { - target.DvdSeasonNumber = source.DvdSeasonNumber; + targetItem.DvdSeasonNumber = sourceItem.DvdSeasonNumber; } - if (replaceData || !target.DvdEpisodeNumber.HasValue) + if (replaceData || !targetItem.DvdEpisodeNumber.HasValue) { - target.DvdEpisodeNumber = source.DvdEpisodeNumber; + targetItem.DvdEpisodeNumber = sourceItem.DvdEpisodeNumber; } - if (replaceData || !target.AbsoluteEpisodeNumber.HasValue) + if (replaceData || !targetItem.AbsoluteEpisodeNumber.HasValue) { - target.AbsoluteEpisodeNumber = source.AbsoluteEpisodeNumber; + targetItem.AbsoluteEpisodeNumber = sourceItem.AbsoluteEpisodeNumber; } - if (replaceData || !target.IndexNumberEnd.HasValue) + if (replaceData || !targetItem.IndexNumberEnd.HasValue) { - target.IndexNumberEnd = source.IndexNumberEnd; + targetItem.IndexNumberEnd = sourceItem.IndexNumberEnd; } } } diff --git a/MediaBrowser.Providers/TV/MissingEpisodeProvider.cs b/MediaBrowser.Providers/TV/MissingEpisodeProvider.cs index d45128288..957345607 100644 --- a/MediaBrowser.Providers/TV/MissingEpisodeProvider.cs +++ b/MediaBrowser.Providers/TV/MissingEpisodeProvider.cs @@ -406,10 +406,11 @@ namespace MediaBrowser.Providers.TV Name = name, IndexNumber = episodeNumber, ParentIndexNumber = seasonNumber, - Parent = season, Id = (series.Id + seasonNumber.ToString(_usCulture) + name).GetMBId(typeof(Episode)) }; + episode.SetParent(season); + await season.AddChild(episode, cancellationToken).ConfigureAwait(false); await episode.RefreshMetadata(new MetadataRefreshOptions diff --git a/MediaBrowser.Providers/TV/SeasonMetadataService.cs b/MediaBrowser.Providers/TV/SeasonMetadataService.cs index 8955b224e..800960c09 100644 --- a/MediaBrowser.Providers/TV/SeasonMetadataService.cs +++ b/MediaBrowser.Providers/TV/SeasonMetadataService.cs @@ -14,23 +14,10 @@ namespace MediaBrowser.Providers.TV { public class SeasonMetadataService : MetadataService<Season, SeasonInfo> { - public SeasonMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager) : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager) + public SeasonMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager, ILibraryManager libraryManager) : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager, libraryManager) { } - /// <summary> - /// Merges the specified source. - /// </summary> - /// <param name="source">The source.</param> - /// <param name="target">The target.</param> - /// <param name="lockedFields">The locked fields.</param> - /// <param name="replaceData">if set to <c>true</c> [replace data].</param> - /// <param name="mergeMetadataSettings">if set to <c>true</c> [merge metadata settings].</param> - protected override void MergeData(Season source, Season target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) - { - ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); - } - protected override async Task<ItemUpdateType> BeforeSave(Season item, bool isFullRefresh, ItemUpdateType currentUpdateType) { var updateType = await base.BeforeSave(item, isFullRefresh, currentUpdateType).ConfigureAwait(false); @@ -46,5 +33,10 @@ namespace MediaBrowser.Providers.TV return updateType; } + + protected override void MergeData(MetadataResult<Season> source, MetadataResult<Season> target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) + { + ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); + } } } diff --git a/MediaBrowser.Providers/TV/SeriesMetadataService.cs b/MediaBrowser.Providers/TV/SeriesMetadataService.cs index eeff03703..0b2aaa5a0 100644 --- a/MediaBrowser.Providers/TV/SeriesMetadataService.cs +++ b/MediaBrowser.Providers/TV/SeriesMetadataService.cs @@ -7,6 +7,7 @@ using MediaBrowser.Controller.Providers; using MediaBrowser.Model.Entities; using MediaBrowser.Model.Logging; using MediaBrowser.Providers.Manager; +using System; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; @@ -16,76 +17,75 @@ namespace MediaBrowser.Providers.TV public class SeriesMetadataService : MetadataService<Series, SeriesInfo> { private readonly ILocalizationManager _localization; - private readonly ILibraryManager _libraryManager; - public SeriesMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager, ILocalizationManager localization, ILibraryManager libraryManager) - : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager) + public SeriesMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager, ILibraryManager libraryManager, ILocalizationManager localization) : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager, libraryManager) { _localization = localization; - _libraryManager = libraryManager; } - /// <summary> - /// Merges the specified source. - /// </summary> - /// <param name="source">The source.</param> - /// <param name="target">The target.</param> - /// <param name="lockedFields">The locked fields.</param> - /// <param name="replaceData">if set to <c>true</c> [replace data].</param> - /// <param name="mergeMetadataSettings">if set to <c>true</c> [merge metadata settings].</param> - protected override void MergeData(Series source, Series target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) + protected override async Task AfterMetadataRefresh(Series item, MetadataRefreshOptions refreshOptions, CancellationToken cancellationToken) { - ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); + await base.AfterMetadataRefresh(item, refreshOptions, cancellationToken).ConfigureAwait(false); - if (replaceData || target.SeasonCount == 0) + if (refreshOptions.IsPostRecursiveRefresh) { - target.SeasonCount = source.SeasonCount; + var provider = new DummySeasonProvider(ServerConfigurationManager, Logger, _localization, LibraryManager); + + try + { + await provider.Run(item, CancellationToken.None).ConfigureAwait(false); + } + catch (Exception ex) + { + Logger.ErrorException("Error in DummySeasonProvider", ex); + } } + } - if (replaceData || string.IsNullOrEmpty(target.AirTime)) + protected override bool IsFullLocalMetadata(Series item) + { + if (string.IsNullOrWhiteSpace(item.Overview)) { - target.AirTime = source.AirTime; + return false; } - - if (replaceData || !target.Status.HasValue) + if (!item.ProductionYear.HasValue) { - target.Status = source.Status; + return false; } + return base.IsFullLocalMetadata(item); + } + + protected override void MergeData(MetadataResult<Series> source, MetadataResult<Series> target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) + { + ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); + + var sourceItem = source.Item; + var targetItem = target.Item; - if (replaceData || target.AirDays == null || target.AirDays.Count == 0) + if (replaceData || targetItem.SeasonCount == 0) { - target.AirDays = source.AirDays; + targetItem.SeasonCount = sourceItem.SeasonCount; } - if (mergeMetadataSettings) + if (replaceData || string.IsNullOrEmpty(targetItem.AirTime)) { - target.DisplaySpecialsWithSeasons = source.DisplaySpecialsWithSeasons; + targetItem.AirTime = sourceItem.AirTime; } - } - protected override async Task AfterMetadataRefresh(Series item, MetadataRefreshOptions refreshOptions, CancellationToken cancellationToken) - { - await base.AfterMetadataRefresh(item, refreshOptions, cancellationToken).ConfigureAwait(false); - - if (refreshOptions.IsPostRecursiveRefresh) + if (replaceData || !targetItem.Status.HasValue) { - var provider = new DummySeasonProvider(ServerConfigurationManager, Logger, _localization, _libraryManager); - - await provider.Run(item, CancellationToken.None).ConfigureAwait(false); + targetItem.Status = sourceItem.Status; } - } - protected override bool IsFullLocalMetadata(Series item) - { - if (string.IsNullOrWhiteSpace(item.Overview)) + if (replaceData || targetItem.AirDays == null || targetItem.AirDays.Count == 0) { - return false; + targetItem.AirDays = sourceItem.AirDays; } - if (!item.ProductionYear.HasValue) + + if (mergeMetadataSettings) { - return false; + targetItem.DisplaySpecialsWithSeasons = sourceItem.DisplaySpecialsWithSeasons; } - return base.IsFullLocalMetadata(item); } } } diff --git a/MediaBrowser.Providers/TV/TvdbEpisodeProvider.cs b/MediaBrowser.Providers/TV/TvdbEpisodeProvider.cs index 68601b6b2..f36de88c9 100644 --- a/MediaBrowser.Providers/TV/TvdbEpisodeProvider.cs +++ b/MediaBrowser.Providers/TV/TvdbEpisodeProvider.cs @@ -56,10 +56,12 @@ namespace MediaBrowser.Providers.TV try { - var item = FetchEpisodeData(searchInfo, identity, seriesDataPath, searchInfo.SeriesProviderIds, cancellationToken); + var metadataResult = FetchEpisodeData(searchInfo, identity, seriesDataPath, searchInfo.SeriesProviderIds, cancellationToken); - if (item != null) + if (metadataResult.HasMetadata) { + var item = metadataResult.Item; + list.Add(new RemoteSearchResult { IndexNumber = item.IndexNumber, @@ -103,9 +105,7 @@ namespace MediaBrowser.Providers.TV try { - result.Item = FetchEpisodeData(searchInfo, identity, seriesDataPath, searchInfo.SeriesProviderIds, - cancellationToken); - result.HasMetadata = result.Item != null; + result = FetchEpisodeData(searchInfo, identity, seriesDataPath, searchInfo.SeriesProviderIds, cancellationToken); } catch (FileNotFoundException) { @@ -231,21 +231,23 @@ namespace MediaBrowser.Providers.TV /// <param name="seriesProviderIds">The series provider ids.</param> /// <param name="cancellationToken">The cancellation token.</param> /// <returns>Task{System.Boolean}.</returns> - private Episode FetchEpisodeData(EpisodeInfo id, EpisodeIdentity identity, string seriesDataPath, Dictionary<string, string> seriesProviderIds, CancellationToken cancellationToken) + private MetadataResult<Episode> FetchEpisodeData(EpisodeInfo id, EpisodeIdentity identity, string seriesDataPath, Dictionary<string, string> seriesProviderIds, CancellationToken cancellationToken) { var episodeNumber = identity.IndexNumber; var seasonOffset = TvdbSeriesProvider.GetSeriesOffset(seriesProviderIds) ?? 0; var seasonNumber = identity.SeasonIndex + seasonOffset; string file; - var success = false; var usingAbsoluteData = false; - var episode = new Episode + var result = new MetadataResult<Episode>() { - IndexNumber = id.IndexNumber, - ParentIndexNumber = id.ParentIndexNumber, - IndexNumberEnd = id.IndexNumberEnd + Item = new Episode + { + IndexNumber = id.IndexNumber, + ParentIndexNumber = id.ParentIndexNumber, + IndexNumberEnd = id.IndexNumberEnd + } }; try @@ -253,9 +255,9 @@ namespace MediaBrowser.Providers.TV if (seasonNumber != null) { file = Path.Combine(seriesDataPath, string.Format("episode-{0}-{1}.xml", seasonNumber.Value, episodeNumber)); - FetchMainEpisodeInfo(episode, file, cancellationToken); + FetchMainEpisodeInfo(result, file, cancellationToken); - success = true; + result.HasMetadata = true; } } catch (FileNotFoundException) @@ -267,11 +269,12 @@ namespace MediaBrowser.Providers.TV } } - if (!success) + if (!result.HasMetadata) { file = Path.Combine(seriesDataPath, string.Format("episode-abs-{0}.xml", episodeNumber)); - FetchMainEpisodeInfo(episode, file, cancellationToken); + FetchMainEpisodeInfo(result, file, cancellationToken); + result.HasMetadata = true; usingAbsoluteData = true; } @@ -291,7 +294,7 @@ namespace MediaBrowser.Providers.TV try { - FetchAdditionalPartInfo(episode, file, cancellationToken); + FetchAdditionalPartInfo(result, file, cancellationToken); } catch (FileNotFoundException) { @@ -305,20 +308,17 @@ namespace MediaBrowser.Providers.TV episodeNumber++; } - return episode; + return result; } private readonly CultureInfo _usCulture = new CultureInfo("en-US"); - private void FetchMainEpisodeInfo(Episode item, string xmlFile, CancellationToken cancellationToken) + private void FetchMainEpisodeInfo(MetadataResult<Episode> result, string xmlFile, CancellationToken cancellationToken) { + var item = result.Item; + using (var streamReader = new StreamReader(xmlFile, Encoding.UTF8)) { - if (!item.LockedFields.Contains(MetadataFields.Cast)) - { - item.People.Clear(); - } - // Use XmlReader for best performance using (var reader = XmlReader.Create(streamReader, new XmlReaderSettings { @@ -551,7 +551,7 @@ namespace MediaBrowser.Providers.TV { if (!item.LockedFields.Contains(MetadataFields.Cast)) { - AddPeople(item, val, PersonType.Director); + AddPeople(result, val, PersonType.Director); } } @@ -565,7 +565,7 @@ namespace MediaBrowser.Providers.TV { if (!item.LockedFields.Contains(MetadataFields.Cast)) { - AddGuestStars(item, val); + AddGuestStars(result, val); } } @@ -579,7 +579,7 @@ namespace MediaBrowser.Providers.TV { if (!item.LockedFields.Contains(MetadataFields.Cast)) { - AddPeople(item, val, PersonType.Writer); + AddPeople(result, val, PersonType.Writer); } } @@ -596,18 +596,19 @@ namespace MediaBrowser.Providers.TV } } - private void AddPeople(BaseItem item, string val, string personType) + private void AddPeople<T>(MetadataResult<T> result, string val, string personType) { // Sometimes tvdb actors have leading spaces foreach (var person in val.Split(new[] { '|', ',' }, StringSplitOptions.RemoveEmptyEntries) .Where(i => !string.IsNullOrWhiteSpace(i)) .Select(str => new PersonInfo { Type = personType, Name = str.Trim() })) { - item.AddPerson(person); + PeopleHelper.AddPerson(result.People, person); } } - private void AddGuestStars(BaseItem item, string val) + private void AddGuestStars<T>(MetadataResult<T> result, string val) + where T : BaseItem { // Sometimes tvdb actors have leading spaces //Regex Info: @@ -631,13 +632,15 @@ namespace MediaBrowser.Providers.TV { if (!string.IsNullOrWhiteSpace(person.Name)) { - item.AddPerson(person); + PeopleHelper.AddPerson(result.People, person); } } } - private void FetchAdditionalPartInfo(Episode item, string xmlFile, CancellationToken cancellationToken) + private void FetchAdditionalPartInfo(MetadataResult<Episode> result, string xmlFile, CancellationToken cancellationToken) { + var item = result.Item; + using (var streamReader = new StreamReader(xmlFile, Encoding.UTF8)) { // Use XmlReader for best performance @@ -693,7 +696,7 @@ namespace MediaBrowser.Providers.TV { if (!item.LockedFields.Contains(MetadataFields.Cast)) { - AddPeople(item, val, PersonType.Director); + AddPeople(result, val, PersonType.Director); } } @@ -707,7 +710,7 @@ namespace MediaBrowser.Providers.TV { if (!item.LockedFields.Contains(MetadataFields.Cast)) { - AddGuestStars(item, val); + AddGuestStars(result, val); } } @@ -721,7 +724,7 @@ namespace MediaBrowser.Providers.TV { if (!item.LockedFields.Contains(MetadataFields.Cast)) { - AddPeople(item, val, PersonType.Writer); + AddPeople(result, val, PersonType.Writer); } } diff --git a/MediaBrowser.Providers/TV/TvdbSeriesProvider.cs b/MediaBrowser.Providers/TV/TvdbSeriesProvider.cs index 8bdd914df..4c93bd57c 100644 --- a/MediaBrowser.Providers/TV/TvdbSeriesProvider.cs +++ b/MediaBrowser.Providers/TV/TvdbSeriesProvider.cs @@ -121,7 +121,7 @@ namespace MediaBrowser.Providers.TV result.Item = new Series(); result.HasMetadata = true; - FetchSeriesData(result.Item, seriesId, cancellationToken); + FetchSeriesData(result, seriesId, cancellationToken); await FindAnimeSeriesIndex(result.Item, itemId).ConfigureAwait(false); } @@ -159,12 +159,14 @@ namespace MediaBrowser.Providers.TV /// <summary> /// Fetches the series data. /// </summary> - /// <param name="series">The series.</param> + /// <param name="result">The result.</param> /// <param name="seriesId">The series id.</param> /// <param name="cancellationToken">The cancellation token.</param> /// <returns>Task{System.Boolean}.</returns> - private void FetchSeriesData(Series series, string seriesId, CancellationToken cancellationToken) + private void FetchSeriesData(MetadataResult<Series> result, string seriesId, CancellationToken cancellationToken) { + var series = result.Item; + series.SetProviderId(MetadataProviders.Tvdb, seriesId); var seriesDataPath = GetSeriesDataPath(_config.ApplicationPaths, seriesId); @@ -178,7 +180,7 @@ namespace MediaBrowser.Providers.TV cancellationToken.ThrowIfCancellationRequested(); - FetchActors(series, actorsXmlPath); + FetchActors(result, actorsXmlPath); } /// <summary> @@ -618,9 +620,9 @@ namespace MediaBrowser.Providers.TV /// <summary> /// Fetches the actors. /// </summary> - /// <param name="series">The series.</param> + /// <param name="result">The result.</param> /// <param name="actorsXmlPath">The actors XML path.</param> - private void FetchActors(Series series, string actorsXmlPath) + private void FetchActors(MetadataResult<Series> result, string actorsXmlPath) { var settings = new XmlReaderSettings { @@ -648,7 +650,7 @@ namespace MediaBrowser.Providers.TV { using (var subtree = reader.ReadSubtree()) { - FetchDataFromActorNode(series, subtree); + FetchDataFromActorNode(result, subtree); } break; } @@ -665,9 +667,9 @@ namespace MediaBrowser.Providers.TV /// <summary> /// Fetches the data from actor node. /// </summary> - /// <param name="series">The series.</param> + /// <param name="result">The result.</param> /// <param name="reader">The reader.</param> - private void FetchDataFromActorNode(Series series, XmlReader reader) + private void FetchDataFromActorNode(MetadataResult<Series> result, XmlReader reader) { reader.MoveToContent(); @@ -719,7 +721,7 @@ namespace MediaBrowser.Providers.TV if (!string.IsNullOrWhiteSpace(personInfo.Name)) { - series.AddPerson(personInfo); + PeopleHelper.AddPerson(result.People, personInfo); } } diff --git a/MediaBrowser.Providers/Users/UserMetadataService.cs b/MediaBrowser.Providers/Users/UserMetadataService.cs index 4062c5b9f..84f2b0380 100644 --- a/MediaBrowser.Providers/Users/UserMetadataService.cs +++ b/MediaBrowser.Providers/Users/UserMetadataService.cs @@ -14,19 +14,11 @@ namespace MediaBrowser.Providers.Users { public class UserMetadataService : MetadataService<User, ItemLookupInfo> { - public UserMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager) : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager) + public UserMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager, ILibraryManager libraryManager) : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager, libraryManager) { } - /// <summary> - /// Merges the specified source. - /// </summary> - /// <param name="source">The source.</param> - /// <param name="target">The target.</param> - /// <param name="lockedFields">The locked fields.</param> - /// <param name="replaceData">if set to <c>true</c> [replace data].</param> - /// <param name="mergeMetadataSettings">if set to <c>true</c> [merge metadata settings].</param> - protected override void MergeData(User source, User target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) + protected override void MergeData(MetadataResult<User> source, MetadataResult<User> target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) { ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); } diff --git a/MediaBrowser.Providers/Videos/VideoMetadataService.cs b/MediaBrowser.Providers/Videos/VideoMetadataService.cs index 4fed9cff4..68c36a84c 100644 --- a/MediaBrowser.Providers/Videos/VideoMetadataService.cs +++ b/MediaBrowser.Providers/Videos/VideoMetadataService.cs @@ -7,30 +7,15 @@ using MediaBrowser.Model.Entities; using MediaBrowser.Model.Logging; using MediaBrowser.Providers.Manager; using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; namespace MediaBrowser.Providers.Videos { public class VideoMetadataService : MetadataService<Video, ItemLookupInfo> { - public VideoMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager) : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager) + public VideoMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager, ILibraryManager libraryManager) : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager, libraryManager) { } - /// <summary> - /// Merges the specified source. - /// </summary> - /// <param name="source">The source.</param> - /// <param name="target">The target.</param> - /// <param name="lockedFields">The locked fields.</param> - /// <param name="replaceData">if set to <c>true</c> [replace data].</param> - /// <param name="mergeMetadataSettings">if set to <c>true</c> [merge metadata settings].</param> - protected override void MergeData(Video source, Video target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) - { - ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); - } - public override int Order { get @@ -39,5 +24,10 @@ namespace MediaBrowser.Providers.Videos return 10; } } + + protected override void MergeData(MetadataResult<Video> source, MetadataResult<Video> target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) + { + ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); + } } } diff --git a/MediaBrowser.Providers/Years/YearMetadataService.cs b/MediaBrowser.Providers/Years/YearMetadataService.cs index 057434db0..3e6db7629 100644 --- a/MediaBrowser.Providers/Years/YearMetadataService.cs +++ b/MediaBrowser.Providers/Years/YearMetadataService.cs @@ -14,19 +14,11 @@ namespace MediaBrowser.Providers.Years { public class YearMetadataService : MetadataService<Year, ItemLookupInfo> { - public YearMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager) : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager) + public YearMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager, ILibraryManager libraryManager) : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem, userDataManager, libraryManager) { } - /// <summary> - /// Merges the specified source. - /// </summary> - /// <param name="source">The source.</param> - /// <param name="target">The target.</param> - /// <param name="lockedFields">The locked fields.</param> - /// <param name="replaceData">if set to <c>true</c> [replace data].</param> - /// <param name="mergeMetadataSettings">if set to <c>true</c> [merge metadata settings].</param> - protected override void MergeData(Year source, Year target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) + protected override void MergeData(MetadataResult<Year> source, MetadataResult<Year> target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) { ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); } diff --git a/MediaBrowser.Server.Implementations/Channels/ChannelManager.cs b/MediaBrowser.Server.Implementations/Channels/ChannelManager.cs index 6a0e1208a..0cd4b0a5c 100644 --- a/MediaBrowser.Server.Implementations/Channels/ChannelManager.cs +++ b/MediaBrowser.Server.Implementations/Channels/ChannelManager.cs @@ -1237,7 +1237,6 @@ namespace MediaBrowser.Server.Implementations.Channels item.Overview = info.Overview; item.IndexNumber = info.IndexNumber; item.ParentIndexNumber = info.ParentIndexNumber; - item.People = info.People; item.PremiereDate = info.PremiereDate; item.ProductionYear = info.ProductionYear; item.ProviderIds = info.ProviderIds; @@ -1277,6 +1276,8 @@ namespace MediaBrowser.Server.Implementations.Channels { await _libraryManager.CreateItem(item, cancellationToken).ConfigureAwait(false); _libraryManager.RegisterItem(item); + + await _libraryManager.UpdatePeople(item, info.People ?? new List<PersonInfo>()).ConfigureAwait(false); } return item; diff --git a/MediaBrowser.Server.Implementations/Collections/CollectionManager.cs b/MediaBrowser.Server.Implementations/Collections/CollectionManager.cs index 796d5f651..04f82db6f 100644 --- a/MediaBrowser.Server.Implementations/Collections/CollectionManager.cs +++ b/MediaBrowser.Server.Implementations/Collections/CollectionManager.cs @@ -75,7 +75,6 @@ namespace MediaBrowser.Server.Implementations.Collections var collection = new BoxSet { Name = name, - Parent = parentFolder, Path = path, IsLocked = options.IsLocked, ProviderIds = options.ProviderIds, diff --git a/MediaBrowser.Server.Implementations/Dto/DtoService.cs b/MediaBrowser.Server.Implementations/Dto/DtoService.cs index 68d9a5e9b..bdc758d8e 100644 --- a/MediaBrowser.Server.Implementations/Dto/DtoService.cs +++ b/MediaBrowser.Server.Implementations/Dto/DtoService.cs @@ -132,13 +132,7 @@ namespace MediaBrowser.Server.Implementations.Dto { if (options.Fields.Contains(ItemFields.ItemCounts)) { - var itemFilter = byName.GetItemFilter(); - - var libraryItems = user != null ? - user.RootFolder.GetRecursiveChildren(user, itemFilter) : - _libraryManager.RootFolder.GetRecursiveChildren(itemFilter); - - SetItemByNameInfo(item, dto, libraryItems.ToList(), user); + SetItemByNameInfo(item, dto, GetTaggedItems(byName, user), user); } FillSyncInfo(dto, item, options, user, syncProgress); @@ -150,6 +144,33 @@ namespace MediaBrowser.Server.Implementations.Dto return dto; } + private List<BaseItem> GetTaggedItems(IItemByName byName, User user) + { + var person = byName as Person; + + if (person != null) + { + var items = _libraryManager.GetItems(new InternalItemsQuery + { + Person = byName.Name + + }).Items; + + if (user != null) + { + return items.Where(i => i.IsVisibleStandalone(user)).ToList(); + } + + return items.ToList(); + } + + var itemFilter = byName.GetItemFilter(); + + return user != null ? + user.RootFolder.GetRecursiveChildren(user, itemFilter).ToList() : + _libraryManager.RootFolder.GetRecursiveChildren(itemFilter).ToList(); + } + private SyncedItemProgress[] GetSyncedItemProgress(DtoOptions options) { if (!options.Fields.Contains(ItemFields.SyncInfo)) @@ -636,7 +657,7 @@ namespace MediaBrowser.Server.Implementations.Dto // Ordering by person type to ensure actors and artists are at the front. // This is taking advantage of the fact that they both begin with A // This should be improved in the future - var people = item.People.OrderBy(i => i.SortOrder ?? int.MaxValue) + var people = _libraryManager.GetPeople(item).OrderBy(i => i.SortOrder ?? int.MaxValue) .ThenBy(i => { if (i.IsType(PersonType.Actor)) @@ -684,7 +705,7 @@ namespace MediaBrowser.Server.Implementations.Dto } }).Where(i => i != null) - .DistinctBy(i => i.Name) + .DistinctBy(i => i.Name, StringComparer.OrdinalIgnoreCase) .ToDictionary(i => i.Name, StringComparer.OrdinalIgnoreCase); for (var i = 0; i < people.Count; i++) @@ -736,6 +757,7 @@ namespace MediaBrowser.Server.Implementations.Dto } }) .Where(i => i != null) + .DistinctBy(i => i.Name, StringComparer.OrdinalIgnoreCase) .ToDictionary(i => i.Name, StringComparer.OrdinalIgnoreCase); for (var i = 0; i < studios.Count; i++) diff --git a/MediaBrowser.Server.Implementations/HttpServer/HttpListenerHost.cs b/MediaBrowser.Server.Implementations/HttpServer/HttpListenerHost.cs index 556fda1cd..3795f4b15 100644 --- a/MediaBrowser.Server.Implementations/HttpServer/HttpListenerHost.cs +++ b/MediaBrowser.Server.Implementations/HttpServer/HttpListenerHost.cs @@ -104,7 +104,7 @@ namespace MediaBrowser.Server.Implementations.HttpServer container.Adapter = _containerAdapter; Plugins.Add(new SwaggerFeature()); - Plugins.Add(new CorsFeature(allowedHeaders: "Content-Type, Authorization, Range, X-MediaBrowser-Token")); + Plugins.Add(new CorsFeature(allowedHeaders: "Content-Type, Authorization, Range, X-MediaBrowser-Token, X-Emby-Authorization")); //Plugins.Add(new AuthFeature(() => new AuthUserSession(), new IAuthProvider[] { // new SessionAuthProvider(_containerAdapter.Resolve<ISessionContext>()), diff --git a/MediaBrowser.Server.Implementations/HttpServer/LoggerUtils.cs b/MediaBrowser.Server.Implementations/HttpServer/LoggerUtils.cs index 955c4ed2d..5558c24d7 100644 --- a/MediaBrowser.Server.Implementations/HttpServer/LoggerUtils.cs +++ b/MediaBrowser.Server.Implementations/HttpServer/LoggerUtils.cs @@ -1,6 +1,6 @@ using MediaBrowser.Model.Logging; using System; -using System.Net; +using System.Globalization; using System.Text; namespace MediaBrowser.Server.Implementations.HttpServer @@ -23,7 +23,7 @@ namespace MediaBrowser.Server.Implementations.HttpServer //log.AppendLine("Headers: " + string.Join(",", response.Headers.AllKeys.Select(k => k + "=" + response.Headers[k]))); - var responseTime = string.Format(". Response time: {0} ms.", duration.TotalMilliseconds); + var responseTime = string.Format(". Response time: {0} ms.", duration.TotalMilliseconds.ToString(CultureInfo.InvariantCulture)); var msg = "HTTP Response " + statusCode + " to " + endPoint + responseTime; diff --git a/MediaBrowser.Server.Implementations/HttpServer/ResponseFilter.cs b/MediaBrowser.Server.Implementations/HttpServer/ResponseFilter.cs index f9184f6d1..0da34efc6 100644 --- a/MediaBrowser.Server.Implementations/HttpServer/ResponseFilter.cs +++ b/MediaBrowser.Server.Implementations/HttpServer/ResponseFilter.cs @@ -33,7 +33,7 @@ namespace MediaBrowser.Server.Implementations.HttpServer if (_denyIframeEmbedding()) { - res.AddHeader("X-Frame-Options", "DENY"); + res.AddHeader("X-Frame-Options", "SAMEORIGIN"); } var exception = dto as Exception; diff --git a/MediaBrowser.Server.Implementations/HttpServer/Security/AuthorizationContext.cs b/MediaBrowser.Server.Implementations/HttpServer/Security/AuthorizationContext.cs index 9461143a8..80892b96c 100644 --- a/MediaBrowser.Server.Implementations/HttpServer/Security/AuthorizationContext.cs +++ b/MediaBrowser.Server.Implementations/HttpServer/Security/AuthorizationContext.cs @@ -170,7 +170,12 @@ namespace MediaBrowser.Server.Implementations.HttpServer.Security /// <returns>Dictionary{System.StringSystem.String}.</returns> private Dictionary<string, string> GetAuthorizationDictionary(IServiceRequest httpReq) { - var auth = httpReq.Headers["Authorization"]; + var auth = httpReq.Headers["X-Emby-Authorization"]; + + if (string.IsNullOrWhiteSpace(auth)) + { + auth = httpReq.Headers["Authorization"]; + } return GetAuthorization(auth); } diff --git a/MediaBrowser.Server.Implementations/Intros/DefaultIntroProvider.cs b/MediaBrowser.Server.Implementations/Intros/DefaultIntroProvider.cs index 2af6e5588..db9841f9d 100644 --- a/MediaBrowser.Server.Implementations/Intros/DefaultIntroProvider.cs +++ b/MediaBrowser.Server.Implementations/Intros/DefaultIntroProvider.cs @@ -71,6 +71,12 @@ namespace MediaBrowser.Server.Implementations.Intros var candidates = new List<ItemWithTrailer>(); + var itemPeople = _libraryManager.GetPeople(item); + var allPeople = _libraryManager.GetPeople(new InternalPeopleQuery + { + AppearsInItemId = item.Id + }); + if (config.EnableIntrosFromMoviesInLibrary) { var itemsWithTrailers = user.RootFolder @@ -94,7 +100,10 @@ namespace MediaBrowser.Server.Implementations.Intros Type = ItemWithTrailerType.ItemWithTrailer, User = user, WatchingItem = item, - Random = random + WatchingItemPeople = itemPeople, + AllPeople = allPeople, + Random = random, + LibraryManager = _libraryManager })); } @@ -134,7 +143,10 @@ namespace MediaBrowser.Server.Implementations.Intros Type = ItemWithTrailerType.ChannelTrailer, User = user, WatchingItem = item, - Random = random + WatchingItemPeople = itemPeople, + AllPeople = allPeople, + Random = random, + LibraryManager = _libraryManager })); } @@ -239,7 +251,7 @@ namespace MediaBrowser.Server.Implementations.Intros return true; } - internal static int GetSimiliarityScore(BaseItem item1, BaseItem item2, Random random) + internal static int GetSimiliarityScore(BaseItem item1, List<PersonInfo> item1People, List<PersonInfo> allPeople, BaseItem item2, Random random, ILibraryManager libraryManager) { var points = 0; @@ -260,11 +272,13 @@ namespace MediaBrowser.Server.Implementations.Intros // Find common studios points += item1.Studios.Where(i => item2.Studios.Contains(i, StringComparer.OrdinalIgnoreCase)).Sum(i => 5); - var item2PeopleNames = item2.People.Select(i => i.Name) - .Distinct(StringComparer.OrdinalIgnoreCase) + var item2PeopleNames = allPeople.Where(i => i.ItemId == item2.Id) + .Select(i => i.Name) + .Where(i => !string.IsNullOrWhiteSpace(i)) + .DistinctNames() .ToDictionary(i => i, StringComparer.OrdinalIgnoreCase); - points += item1.People.Where(i => item2PeopleNames.ContainsKey(i.Name)).Sum(i => + points += item1People.Where(i => item2PeopleNames.ContainsKey(i.Name)).Sum(i => { if (string.Equals(i.Type, PersonType.Director, StringComparison.OrdinalIgnoreCase) || string.Equals(i.Role, PersonType.Director, StringComparison.OrdinalIgnoreCase)) { @@ -339,7 +353,10 @@ namespace MediaBrowser.Server.Implementations.Intros internal ItemWithTrailerType Type; internal User User; internal BaseItem WatchingItem; + internal List<PersonInfo> WatchingItemPeople; + internal List<PersonInfo> AllPeople; internal Random Random; + internal ILibraryManager LibraryManager; private bool? _isPlayed; public bool IsPlayed @@ -361,7 +378,7 @@ namespace MediaBrowser.Server.Implementations.Intros { if (!_score.HasValue) { - _score = GetSimiliarityScore(WatchingItem, Item, Random); + _score = GetSimiliarityScore(WatchingItem, WatchingItemPeople, AllPeople, Item, Random, LibraryManager); } return _score.Value; } diff --git a/MediaBrowser.Server.Implementations/Library/LibraryManager.cs b/MediaBrowser.Server.Implementations/Library/LibraryManager.cs index ed5dde4c5..c3793b3a3 100644 --- a/MediaBrowser.Server.Implementations/Library/LibraryManager.cs +++ b/MediaBrowser.Server.Implementations/Library/LibraryManager.cs @@ -32,6 +32,7 @@ using System.IO; using System.Linq; using System.Threading; using System.Threading.Tasks; +using MoreLinq; using SortOrder = MediaBrowser.Model.Entities.SortOrder; namespace MediaBrowser.Server.Implementations.Library @@ -1107,6 +1108,8 @@ namespace MediaBrowser.Server.Implementations.Library progress.Report(innerPercent); }); + _logger.Debug("Running post-scan task {0}", task.GetType().Name); + try { await task.Run(innerProgress, cancellationToken).ConfigureAwait(false); @@ -1222,6 +1225,11 @@ namespace MediaBrowser.Server.Implementations.Library }; } + public List<Guid> GetItemIds(InternalItemsQuery query) + { + return ItemRepository.GetItemIdsList(query); + } + /// <summary> /// Gets the intros. /// </summary> @@ -2055,5 +2063,58 @@ namespace MediaBrowser.Server.Implementations.Library item.ExtraType = ExtraType.Clip; } } + + public List<PersonInfo> GetPeople(InternalPeopleQuery query) + { + return ItemRepository.GetPeople(query); + } + + public List<PersonInfo> GetPeople(BaseItem item) + { + return item.People ?? GetPeople(new InternalPeopleQuery + { + ItemId = item.Id + }); + } + + public List<Person> GetPeopleItems(InternalPeopleQuery query) + { + return ItemRepository.GetPeopleNames(query).Select(i => + { + try + { + return GetPerson(i); + } + catch (Exception ex) + { + _logger.ErrorException("Error getting person", ex); + return null; + } + + }).Where(i => i != null).ToList(); + } + + public List<string> GetPeopleNames(InternalPeopleQuery query) + { + return ItemRepository.GetPeopleNames(query); + } + + public List<PersonInfo> GetAllPeople() + { + return GetPeople(new InternalPeopleQuery()) + .DistinctBy(i => i.Name, StringComparer.OrdinalIgnoreCase) + .ToList(); + } + + public async Task UpdatePeople(BaseItem item, List<PersonInfo> people) + { + await ItemRepository.UpdatePeople(item.Id, people).ConfigureAwait(false); + + if (item.People != null) + { + item.People = null; + await item.UpdateToRepository(ItemUpdateType.MetadataEdit, CancellationToken.None).ConfigureAwait(false); + } + } } } diff --git a/MediaBrowser.Server.Implementations/Library/ResolverHelper.cs b/MediaBrowser.Server.Implementations/Library/ResolverHelper.cs index b6a93408a..dac658095 100644 --- a/MediaBrowser.Server.Implementations/Library/ResolverHelper.cs +++ b/MediaBrowser.Server.Implementations/Library/ResolverHelper.cs @@ -34,7 +34,7 @@ namespace MediaBrowser.Server.Implementations.Library // If the resolver didn't specify this if (parent != null) { - item.Parent = parent; + item.SetParent(parent); } item.Id = libraryManager.GetNewItemId(item.Path, item.GetType()); @@ -68,7 +68,7 @@ namespace MediaBrowser.Server.Implementations.Library // If the resolver didn't specify this if (args.Parent != null) { - item.Parent = args.Parent; + item.SetParent(args.Parent); } item.Id = libraryManager.GetNewItemId(item.Path, item.GetType()); diff --git a/MediaBrowser.Server.Implementations/Library/SearchEngine.cs b/MediaBrowser.Server.Implementations/Library/SearchEngine.cs index 72bbefae4..05dde5b3e 100644 --- a/MediaBrowser.Server.Implementations/Library/SearchEngine.cs +++ b/MediaBrowser.Server.Implementations/Library/SearchEngine.cs @@ -256,10 +256,15 @@ namespace MediaBrowser.Server.Implementations.Library if (query.IncludePeople) { + var itemIds = items.Select(i => i.Id).ToList(); + // Find persons - var persons = items.SelectMany(i => i.People) + var persons = _libraryManager.GetPeople(new InternalPeopleQuery + { + NameContains = searchTerm + }) + .Where(i => itemIds.Contains(i.ItemId)) .Select(i => i.Name) - .Where(i => !string.IsNullOrWhiteSpace(i)) .Distinct(StringComparer.OrdinalIgnoreCase) .ToList(); diff --git a/MediaBrowser.Server.Implementations/Library/Validators/PeopleValidator.cs b/MediaBrowser.Server.Implementations/Library/Validators/PeopleValidator.cs index 059ad2481..ef9dee8b5 100644 --- a/MediaBrowser.Server.Implementations/Library/Validators/PeopleValidator.cs +++ b/MediaBrowser.Server.Implementations/Library/Validators/PeopleValidator.cs @@ -72,39 +72,6 @@ namespace MediaBrowser.Server.Implementations.Library.Validators return options.DownloadOtherPeopleMetadata; } - private IEnumerable<PersonInfo> GetPeopleToValidate(BaseItem item, PeopleMetadataOptions options) - { - return item.People.Where(i => - { - if (i.IsType(PersonType.Actor)) - { - return options.DownloadActorMetadata; - } - if (i.IsType(PersonType.Director)) - { - return options.DownloadDirectorMetadata; - } - if (i.IsType(PersonType.Composer)) - { - return options.DownloadComposerMetadata; - } - if (i.IsType(PersonType.Writer)) - { - return options.DownloadWriterMetadata; - } - if (i.IsType(PersonType.Producer)) - { - return options.DownloadProducerMetadata; - } - if (i.IsType(PersonType.GuestStar)) - { - return options.DownloadGuestStarMetadata; - } - - return options.DownloadOtherPeopleMetadata; - }); - } - /// <summary> /// Validates the people. /// </summary> @@ -119,10 +86,7 @@ namespace MediaBrowser.Server.Implementations.Library.Validators var peopleOptions = _config.Configuration.PeopleMetadataOptions; - var people = _libraryManager.RootFolder.GetRecursiveChildren() - .SelectMany(i => i.People) - .Where(i => !string.IsNullOrWhiteSpace(i.Name)) - .ToList(); + var people = _libraryManager.GetAllPeople(); var dict = new Dictionary<string, bool>(StringComparer.OrdinalIgnoreCase); diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/ar.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/ar.json index 45177dc63..e808931d6 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/ar.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/ar.json @@ -38,7 +38,9 @@ "HeaderSupportTheTeam": "Support the Emby Team", "TextEnjoyBonusFeatures": "Enjoy Bonus Features", "TitleLiveTV": "Live TV", + "ButtonCancelSyncJob": "Cancel sync job", "TitleSync": "Sync", + "HeaderSelectDate": "Select Date", "ButtonDonate": "Donate", "LabelRecurringDonationCanBeCancelledHelp": "Recurring donations can be cancelled at any time from within your PayPal account.", "HeaderMyMedia": "My Media", @@ -104,6 +106,7 @@ "TitlePlugins": "Plugins", "ButtonTakeTheTourToSeeWhatsNew": "Take the tour to see what's new", "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the web interface.", + "ButtonPlayTrailer": "Play trailer", "HeaderLibraryAccess": "Library Access", "HeaderChannelAccess": "Channel Access", "HeaderDeviceAccess": "Device Access", @@ -144,7 +147,6 @@ "ButtonPlay": "Play", "ButtonEdit": "Edit", "ButtonQueue": "Queue", - "ButtonPlayTrailer": "Play trailer", "ButtonPlaylist": "Playlist", "ButtonPreviousTrack": "Previous Track", "LabelEnabled": "Enabled", @@ -263,6 +265,7 @@ "LabelPlayMethodTranscoding": "Transcoding", "LabelPlayMethodDirectStream": "Direct Streaming", "LabelPlayMethodDirectPlay": "Direct Playing", + "LabelEpisodeNumber": "Episode number:", "LabelAudioCodec": "Audio: {0}", "LabelVideoCodec": "Video: {0}", "LabelLocalAccessUrl": "Local access: {0}", @@ -308,6 +311,7 @@ "HeaderArtist": "Artist", "LabelAddedOnDate": "Added {0}", "ButtonStart": "Start", + "LabelSeasonNumber": "Season number:", "HeaderChannels": "Channels", "HeaderMediaFolders": "Media Folders", "HeaderBlockItemsWithNoRating": "Block content with no rating information:", @@ -336,6 +340,7 @@ "ButtonNextPage": "Next Page", "ButtonPreviousPage": "Previous Page", "ButtonMoveLeft": "Move left", + "OptionReleaseDate": "Release date", "ButtonMoveRight": "Move right", "ButtonBrowseOnlineImages": "Browse online images", "HeaderDeleteItem": "Delete Item", @@ -478,11 +483,8 @@ "PersonTypePerson": "Person", "LabelTitleDisplayOrder": "Title display order:", "OptionSortName": "Sort name", - "OptionReleaseDate": "Release date", - "LabelSeasonNumber": "Season number:", "LabelDiscNumber": "Disc number", "LabelParentNumber": "Parent number", - "LabelEpisodeNumber": "Episode number:", "LabelTrackNumber": "Track number:", "LabelNumber": "Number:", "LabelReleaseDate": "Release date:", @@ -785,6 +787,7 @@ "HeaderMedia": "Media", "ButtonInbox": "Inbox", "HeaderAdvanced": "Advanced", + "HeaderGroupVersions": "Group Versions", "HeaderSaySomethingLike": "Say Something Like...", "ButtonTryAgain": "Try Again", "HeaderYouSaid": "You Said...", @@ -794,5 +797,13 @@ "ButtonManageServer": "Manage Server", "ButtonPreferences": "Preferences", "ButtonViewArtist": "View artist", - "ButtonViewAlbum": "View album" + "ButtonViewAlbum": "View album", + "ErrorMessagePasswordNotMatchConfirm": "The password and password confirmation must match.", + "ErrorMessageUsernameInUse": "The username is already in use. Please choose a new name and try again.", + "ErrorMessageEmailInUse": "The email address is already in use. Please enter a new email address and try again, or use the forgot password feature.", + "MessageThankYouForConnectSignUp": "Thank you for signing up for Emby Connect. An email will be sent to your address with instructions on how to confirm your new account. Please confirm the account and then return here to sign in.", + "HeaderShare": "Share", + "ButtonShareHelp": "Share a web page containing media information with social media. Media files are never shared publicly.", + "ButtonShare": "Share", + "HeaderConfirm": "Confirm" }
\ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/be-BY.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/be-BY.json index e573f4b4a..f0a9ac9de 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/be-BY.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/be-BY.json @@ -38,7 +38,9 @@ "HeaderSupportTheTeam": "Support the Emby Team", "TextEnjoyBonusFeatures": "Enjoy Bonus Features", "TitleLiveTV": "Live TV", + "ButtonCancelSyncJob": "Cancel sync job", "TitleSync": "Sync", + "HeaderSelectDate": "Select Date", "ButtonDonate": "Donate", "LabelRecurringDonationCanBeCancelledHelp": "Recurring donations can be cancelled at any time from within your PayPal account.", "HeaderMyMedia": "My Media", @@ -104,6 +106,7 @@ "TitlePlugins": "Plugins", "ButtonTakeTheTourToSeeWhatsNew": "Take the tour to see what's new", "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the web interface.", + "ButtonPlayTrailer": "Play trailer", "HeaderLibraryAccess": "Library Access", "HeaderChannelAccess": "Channel Access", "HeaderDeviceAccess": "Device Access", @@ -144,7 +147,6 @@ "ButtonPlay": "Play", "ButtonEdit": "Edit", "ButtonQueue": "Queue", - "ButtonPlayTrailer": "Play trailer", "ButtonPlaylist": "Playlist", "ButtonPreviousTrack": "Previous Track", "LabelEnabled": "Enabled", @@ -263,6 +265,7 @@ "LabelPlayMethodTranscoding": "Transcoding", "LabelPlayMethodDirectStream": "Direct Streaming", "LabelPlayMethodDirectPlay": "Direct Playing", + "LabelEpisodeNumber": "Episode number:", "LabelAudioCodec": "Audio: {0}", "LabelVideoCodec": "Video: {0}", "LabelLocalAccessUrl": "Local access: {0}", @@ -308,6 +311,7 @@ "HeaderArtist": "Artist", "LabelAddedOnDate": "Added {0}", "ButtonStart": "Start", + "LabelSeasonNumber": "Season number:", "HeaderChannels": "Channels", "HeaderMediaFolders": "Media Folders", "HeaderBlockItemsWithNoRating": "Block content with no rating information:", @@ -336,6 +340,7 @@ "ButtonNextPage": "Next Page", "ButtonPreviousPage": "Previous Page", "ButtonMoveLeft": "Move left", + "OptionReleaseDate": "Release date", "ButtonMoveRight": "Move right", "ButtonBrowseOnlineImages": "Browse online images", "HeaderDeleteItem": "Delete Item", @@ -478,11 +483,8 @@ "PersonTypePerson": "Person", "LabelTitleDisplayOrder": "Title display order:", "OptionSortName": "Sort name", - "OptionReleaseDate": "\u0414\u0430\u0442\u0430 \u0432\u044b\u0445\u043e\u0434\u0430", - "LabelSeasonNumber": "Season number:", "LabelDiscNumber": "Disc number", "LabelParentNumber": "Parent number", - "LabelEpisodeNumber": "Episode number:", "LabelTrackNumber": "Track number:", "LabelNumber": "Number:", "LabelReleaseDate": "Release date:", @@ -785,6 +787,7 @@ "HeaderMedia": "Media", "ButtonInbox": "Inbox", "HeaderAdvanced": "Advanced", + "HeaderGroupVersions": "Group Versions", "HeaderSaySomethingLike": "Say Something Like...", "ButtonTryAgain": "Try Again", "HeaderYouSaid": "You Said...", @@ -794,5 +797,13 @@ "ButtonManageServer": "Manage Server", "ButtonPreferences": "Preferences", "ButtonViewArtist": "View artist", - "ButtonViewAlbum": "View album" + "ButtonViewAlbum": "View album", + "ErrorMessagePasswordNotMatchConfirm": "The password and password confirmation must match.", + "ErrorMessageUsernameInUse": "The username is already in use. Please choose a new name and try again.", + "ErrorMessageEmailInUse": "The email address is already in use. Please enter a new email address and try again, or use the forgot password feature.", + "MessageThankYouForConnectSignUp": "Thank you for signing up for Emby Connect. An email will be sent to your address with instructions on how to confirm your new account. Please confirm the account and then return here to sign in.", + "HeaderShare": "Share", + "ButtonShareHelp": "Share a web page containing media information with social media. Media files are never shared publicly.", + "ButtonShare": "Share", + "HeaderConfirm": "Confirm" }
\ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/bg-BG.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/bg-BG.json index 52cf1d61f..ef7e31385 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/bg-BG.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/bg-BG.json @@ -38,7 +38,9 @@ "HeaderSupportTheTeam": "\u041f\u043e\u0434\u043a\u0440\u0435\u043f\u0435\u0442\u0435 Emby \u041e\u0442\u0431\u043e\u0440\u044a\u0442", "TextEnjoyBonusFeatures": "Enjoy Bonus Features", "TitleLiveTV": "\u0422V \u043d\u0430 \u0436\u0438\u0432\u043e", + "ButtonCancelSyncJob": "Cancel sync job", "TitleSync": "Sync", + "HeaderSelectDate": "Select Date", "ButtonDonate": "Donate", "LabelRecurringDonationCanBeCancelledHelp": "Recurring donations can be cancelled at any time from within your PayPal account.", "HeaderMyMedia": "My Media", @@ -104,6 +106,7 @@ "TitlePlugins": "Plugins", "ButtonTakeTheTourToSeeWhatsNew": "Take the tour to see what's new", "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the web interface.", + "ButtonPlayTrailer": "Play trailer", "HeaderLibraryAccess": "Library Access", "HeaderChannelAccess": "Channel Access", "HeaderDeviceAccess": "\u0414\u043e\u0441\u0442\u044a\u043f \u043d\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\u0442\u0430", @@ -144,7 +147,6 @@ "ButtonPlay": "\u041f\u0443\u0441\u043d\u0438", "ButtonEdit": "\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u0430\u0439", "ButtonQueue": "Queue", - "ButtonPlayTrailer": "\u041f\u0443\u0441\u043d\u0438 \u0442\u0440\u0435\u0439\u043b\u044a\u0440\u0430", "ButtonPlaylist": "Playlist", "ButtonPreviousTrack": "\u041f\u0440\u0435\u0434\u0438\u0448\u043d\u0430 \u043f\u044a\u0442\u0435\u043a\u0430", "LabelEnabled": "Enabled", @@ -263,6 +265,7 @@ "LabelPlayMethodTranscoding": "Transcoding", "LabelPlayMethodDirectStream": "Direct Streaming", "LabelPlayMethodDirectPlay": "Direct Playing", + "LabelEpisodeNumber": "Episode number:", "LabelAudioCodec": "Audio: {0}", "LabelVideoCodec": "Video: {0}", "LabelLocalAccessUrl": "Local access: {0}", @@ -308,6 +311,7 @@ "HeaderArtist": "Artist", "LabelAddedOnDate": "Added {0}", "ButtonStart": "Start", + "LabelSeasonNumber": "Season number:", "HeaderChannels": "\u041a\u0430\u043d\u0430\u043b\u0438", "HeaderMediaFolders": "\u041c\u0435\u0434\u0438\u0439\u043d\u0438 \u041f\u0430\u043f\u043a\u0438", "HeaderBlockItemsWithNoRating": "Block content with no rating information:", @@ -336,6 +340,7 @@ "ButtonNextPage": "Next Page", "ButtonPreviousPage": "Previous Page", "ButtonMoveLeft": "Move left", + "OptionReleaseDate": "Release date", "ButtonMoveRight": "Move right", "ButtonBrowseOnlineImages": "Browse online images", "HeaderDeleteItem": "Delete Item", @@ -478,11 +483,8 @@ "PersonTypePerson": "Person", "LabelTitleDisplayOrder": "Title display order:", "OptionSortName": "Sort name", - "OptionReleaseDate": "\u0414\u0430\u0442\u0430 \u043d\u0430 \u0438\u0437\u0434\u0430\u0432\u0430\u043d\u0435", - "LabelSeasonNumber": "Season number:", "LabelDiscNumber": "Disc number", "LabelParentNumber": "Parent number", - "LabelEpisodeNumber": "Episode number:", "LabelTrackNumber": "Track number:", "LabelNumber": "Number:", "LabelReleaseDate": "Release date:", @@ -785,6 +787,7 @@ "HeaderMedia": "Media", "ButtonInbox": "Inbox", "HeaderAdvanced": "Advanced", + "HeaderGroupVersions": "Group Versions", "HeaderSaySomethingLike": "Say Something Like...", "ButtonTryAgain": "Try Again", "HeaderYouSaid": "You Said...", @@ -794,5 +797,13 @@ "ButtonManageServer": "Manage Server", "ButtonPreferences": "Preferences", "ButtonViewArtist": "View artist", - "ButtonViewAlbum": "View album" + "ButtonViewAlbum": "View album", + "ErrorMessagePasswordNotMatchConfirm": "The password and password confirmation must match.", + "ErrorMessageUsernameInUse": "The username is already in use. Please choose a new name and try again.", + "ErrorMessageEmailInUse": "The email address is already in use. Please enter a new email address and try again, or use the forgot password feature.", + "MessageThankYouForConnectSignUp": "Thank you for signing up for Emby Connect. An email will be sent to your address with instructions on how to confirm your new account. Please confirm the account and then return here to sign in.", + "HeaderShare": "Share", + "ButtonShareHelp": "Share a web page containing media information with social media. Media files are never shared publicly.", + "ButtonShare": "Share", + "HeaderConfirm": "Confirm" }
\ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/ca.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/ca.json index 014225cbd..ceabbe4d2 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/ca.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/ca.json @@ -38,7 +38,9 @@ "HeaderSupportTheTeam": "Support the Emby Team", "TextEnjoyBonusFeatures": "Enjoy Bonus Features", "TitleLiveTV": "Live TV", + "ButtonCancelSyncJob": "Cancel sync job", "TitleSync": "Sync", + "HeaderSelectDate": "Select Date", "ButtonDonate": "Donate", "LabelRecurringDonationCanBeCancelledHelp": "Recurring donations can be cancelled at any time from within your PayPal account.", "HeaderMyMedia": "My Media", @@ -104,6 +106,7 @@ "TitlePlugins": "Plugins", "ButtonTakeTheTourToSeeWhatsNew": "Take the tour to see what's new", "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the web interface.", + "ButtonPlayTrailer": "Play trailer", "HeaderLibraryAccess": "Library Access", "HeaderChannelAccess": "Channel Access", "HeaderDeviceAccess": "Device Access", @@ -144,7 +147,6 @@ "ButtonPlay": "Play", "ButtonEdit": "Edit", "ButtonQueue": "Queue", - "ButtonPlayTrailer": "Play trailer", "ButtonPlaylist": "Playlist", "ButtonPreviousTrack": "Previous Track", "LabelEnabled": "Enabled", @@ -263,6 +265,7 @@ "LabelPlayMethodTranscoding": "Transcoding", "LabelPlayMethodDirectStream": "Direct Streaming", "LabelPlayMethodDirectPlay": "Direct Playing", + "LabelEpisodeNumber": "Episode number:", "LabelAudioCodec": "Audio: {0}", "LabelVideoCodec": "Video: {0}", "LabelLocalAccessUrl": "Local access: {0}", @@ -308,6 +311,7 @@ "HeaderArtist": "Artist", "LabelAddedOnDate": "Added {0}", "ButtonStart": "Start", + "LabelSeasonNumber": "Season number:", "HeaderChannels": "Channels", "HeaderMediaFolders": "Media Folders", "HeaderBlockItemsWithNoRating": "Block content with no rating information:", @@ -336,6 +340,7 @@ "ButtonNextPage": "Next Page", "ButtonPreviousPage": "Previous Page", "ButtonMoveLeft": "Move left", + "OptionReleaseDate": "Release date", "ButtonMoveRight": "Move right", "ButtonBrowseOnlineImages": "Browse online images", "HeaderDeleteItem": "Delete Item", @@ -478,11 +483,8 @@ "PersonTypePerson": "Person", "LabelTitleDisplayOrder": "Title display order:", "OptionSortName": "Sort name", - "OptionReleaseDate": "Release date", - "LabelSeasonNumber": "Season number:", "LabelDiscNumber": "Disc number", "LabelParentNumber": "Parent number", - "LabelEpisodeNumber": "Episode number:", "LabelTrackNumber": "Track number:", "LabelNumber": "Number:", "LabelReleaseDate": "Release date:", @@ -785,6 +787,7 @@ "HeaderMedia": "Media", "ButtonInbox": "Inbox", "HeaderAdvanced": "Advanced", + "HeaderGroupVersions": "Group Versions", "HeaderSaySomethingLike": "Say Something Like...", "ButtonTryAgain": "Try Again", "HeaderYouSaid": "You Said...", @@ -794,5 +797,13 @@ "ButtonManageServer": "Manage Server", "ButtonPreferences": "Preferences", "ButtonViewArtist": "View artist", - "ButtonViewAlbum": "View album" + "ButtonViewAlbum": "View album", + "ErrorMessagePasswordNotMatchConfirm": "The password and password confirmation must match.", + "ErrorMessageUsernameInUse": "The username is already in use. Please choose a new name and try again.", + "ErrorMessageEmailInUse": "The email address is already in use. Please enter a new email address and try again, or use the forgot password feature.", + "MessageThankYouForConnectSignUp": "Thank you for signing up for Emby Connect. An email will be sent to your address with instructions on how to confirm your new account. Please confirm the account and then return here to sign in.", + "HeaderShare": "Share", + "ButtonShareHelp": "Share a web page containing media information with social media. Media files are never shared publicly.", + "ButtonShare": "Share", + "HeaderConfirm": "Confirm" }
\ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/cs.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/cs.json index b5e9e4b81..03c6168fe 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/cs.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/cs.json @@ -38,7 +38,9 @@ "HeaderSupportTheTeam": "Support the Emby Team", "TextEnjoyBonusFeatures": "Enjoy Bonus Features", "TitleLiveTV": "\u017div\u00e1 TV", + "ButtonCancelSyncJob": "Cancel sync job", "TitleSync": "Sync", + "HeaderSelectDate": "Select Date", "ButtonDonate": "Donate", "LabelRecurringDonationCanBeCancelledHelp": "Recurring donations can be cancelled at any time from within your PayPal account.", "HeaderMyMedia": "My Media", @@ -104,6 +106,7 @@ "TitlePlugins": "Plugins", "ButtonTakeTheTourToSeeWhatsNew": "Take the tour to see what's new", "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the web interface.", + "ButtonPlayTrailer": "Play trailer", "HeaderLibraryAccess": "Library Access", "HeaderChannelAccess": "Channel Access", "HeaderDeviceAccess": "Device Access", @@ -144,7 +147,6 @@ "ButtonPlay": "P\u0159ehr\u00e1t", "ButtonEdit": "Upravit", "ButtonQueue": "Queue", - "ButtonPlayTrailer": "P\u0159ehr\u00e1t uk\u00e1zku\/trailer", "ButtonPlaylist": "Playlist", "ButtonPreviousTrack": "P\u0159edchod\u00ed stopa", "LabelEnabled": "Enabled", @@ -263,6 +265,7 @@ "LabelPlayMethodTranscoding": "Transcoding", "LabelPlayMethodDirectStream": "Direct Streaming", "LabelPlayMethodDirectPlay": "Direct Playing", + "LabelEpisodeNumber": "Episode number:", "LabelAudioCodec": "Audio: {0}", "LabelVideoCodec": "Video: {0}", "LabelLocalAccessUrl": "Local access: {0}", @@ -308,6 +311,7 @@ "HeaderArtist": "Um\u011blec", "LabelAddedOnDate": "Added {0}", "ButtonStart": "Start", + "LabelSeasonNumber": "Season number:", "HeaderChannels": "Kan\u00e1ly", "HeaderMediaFolders": "Slo\u017eky m\u00e9di\u00ed", "HeaderBlockItemsWithNoRating": "Block content with no rating information:", @@ -336,6 +340,7 @@ "ButtonNextPage": "Next Page", "ButtonPreviousPage": "Previous Page", "ButtonMoveLeft": "Move left", + "OptionReleaseDate": "Release date", "ButtonMoveRight": "Move right", "ButtonBrowseOnlineImages": "Browse online images", "HeaderDeleteItem": "Delete Item", @@ -478,11 +483,8 @@ "PersonTypePerson": "Person", "LabelTitleDisplayOrder": "Title display order:", "OptionSortName": "Sort name", - "OptionReleaseDate": "Datum premi\u00e9ry.", - "LabelSeasonNumber": "Season number:", "LabelDiscNumber": "Disc number", "LabelParentNumber": "Parent number", - "LabelEpisodeNumber": "Episode number:", "LabelTrackNumber": "Track number:", "LabelNumber": "Number:", "LabelReleaseDate": "Release date:", @@ -785,6 +787,7 @@ "HeaderMedia": "Media", "ButtonInbox": "Inbox", "HeaderAdvanced": "Advanced", + "HeaderGroupVersions": "Group Versions", "HeaderSaySomethingLike": "Say Something Like...", "ButtonTryAgain": "Try Again", "HeaderYouSaid": "You Said...", @@ -794,5 +797,13 @@ "ButtonManageServer": "Manage Server", "ButtonPreferences": "Preferences", "ButtonViewArtist": "View artist", - "ButtonViewAlbum": "View album" + "ButtonViewAlbum": "View album", + "ErrorMessagePasswordNotMatchConfirm": "The password and password confirmation must match.", + "ErrorMessageUsernameInUse": "The username is already in use. Please choose a new name and try again.", + "ErrorMessageEmailInUse": "The email address is already in use. Please enter a new email address and try again, or use the forgot password feature.", + "MessageThankYouForConnectSignUp": "Thank you for signing up for Emby Connect. An email will be sent to your address with instructions on how to confirm your new account. Please confirm the account and then return here to sign in.", + "HeaderShare": "Share", + "ButtonShareHelp": "Share a web page containing media information with social media. Media files are never shared publicly.", + "ButtonShare": "Share", + "HeaderConfirm": "Confirm" }
\ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/da.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/da.json index 3ced1032e..b10c84217 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/da.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/da.json @@ -38,7 +38,9 @@ "HeaderSupportTheTeam": "St\u00f8t Emby-holdet", "TextEnjoyBonusFeatures": "F\u00e5 bonus funktioner", "TitleLiveTV": "Live TV", + "ButtonCancelSyncJob": "Cancel sync job", "TitleSync": "Sync", + "HeaderSelectDate": "V\u00e6lg dato", "ButtonDonate": "Don\u00e9r", "LabelRecurringDonationCanBeCancelledHelp": "Tilbagevendende donationer kan afmeldes n\u00e5r som helst fra din PayPal konto.", "HeaderMyMedia": "Mine medier", @@ -104,6 +106,7 @@ "TitlePlugins": "Tilf\u00f8jelser", "ButtonTakeTheTourToSeeWhatsNew": "Tag en rundvisning for at se hvad der er nyt", "MessageNoSyncJobsFound": "Intet sync job blev fundet. Opret sync jobs ved at benytte Sync knapper som findes gennem web-interfacet.", + "ButtonPlayTrailer": "Play trailer", "HeaderLibraryAccess": "Adgang til biblioteker", "HeaderChannelAccess": "Adgang til kanaler", "HeaderDeviceAccess": "Enhedsadgang", @@ -144,7 +147,6 @@ "ButtonPlay": "Afspil", "ButtonEdit": "Rediger", "ButtonQueue": "K\u00f8", - "ButtonPlayTrailer": "Afspil trailer", "ButtonPlaylist": "Afspilningsliste", "ButtonPreviousTrack": "Forrige spor", "LabelEnabled": "Sl\u00e5et til", @@ -263,6 +265,7 @@ "LabelPlayMethodTranscoding": "Transkoding", "LabelPlayMethodDirectStream": "Direkte streaming", "LabelPlayMethodDirectPlay": "Direkte afspilning", + "LabelEpisodeNumber": "Episode number:", "LabelAudioCodec": "Lyd: {0}", "LabelVideoCodec": "Video: {0}", "LabelLocalAccessUrl": "Lokal adgang: {0}", @@ -308,6 +311,7 @@ "HeaderArtist": "Artist", "LabelAddedOnDate": "Tilf\u00f8jet {0}", "ButtonStart": "Start", + "LabelSeasonNumber": "Season number:", "HeaderChannels": "Kanaler", "HeaderMediaFolders": "Mediemapper", "HeaderBlockItemsWithNoRating": "Bloker indhold uden bed\u00f8mmelser:", @@ -336,6 +340,7 @@ "ButtonNextPage": "N\u00e6ste side", "ButtonPreviousPage": "Forrige side", "ButtonMoveLeft": "Flyt til venstre", + "OptionReleaseDate": "Release date", "ButtonMoveRight": "Flyt til h\u00f8jre", "ButtonBrowseOnlineImages": "Gennemse online billeder", "HeaderDeleteItem": "Slet element", @@ -478,11 +483,8 @@ "PersonTypePerson": "Person", "LabelTitleDisplayOrder": "Titelvisningsorden:", "OptionSortName": "Sorteringsnavn", - "OptionReleaseDate": "Udgivelsesdato", - "LabelSeasonNumber": "S\u00e6sonnummer", "LabelDiscNumber": "Disk nummer", "LabelParentNumber": "Parent nummer", - "LabelEpisodeNumber": "Episodenummer", "LabelTrackNumber": "Spor nummer:", "LabelNumber": "Nummer:", "LabelReleaseDate": "Udgivelsesdato:", @@ -785,6 +787,7 @@ "HeaderMedia": "Medier", "ButtonInbox": "Indbakke", "HeaderAdvanced": "Avanceret", + "HeaderGroupVersions": "Group Versions", "HeaderSaySomethingLike": "Say Something Like...", "ButtonTryAgain": "Try Again", "HeaderYouSaid": "You Said...", @@ -794,5 +797,13 @@ "ButtonManageServer": "Manage Server", "ButtonPreferences": "Preferences", "ButtonViewArtist": "View artist", - "ButtonViewAlbum": "View album" + "ButtonViewAlbum": "View album", + "ErrorMessagePasswordNotMatchConfirm": "The password and password confirmation must match.", + "ErrorMessageUsernameInUse": "The username is already in use. Please choose a new name and try again.", + "ErrorMessageEmailInUse": "The email address is already in use. Please enter a new email address and try again, or use the forgot password feature.", + "MessageThankYouForConnectSignUp": "Thank you for signing up for Emby Connect. An email will be sent to your address with instructions on how to confirm your new account. Please confirm the account and then return here to sign in.", + "HeaderShare": "Share", + "ButtonShareHelp": "Share a web page containing media information with social media. Media files are never shared publicly.", + "ButtonShare": "Share", + "HeaderConfirm": "Confirm" }
\ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/de.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/de.json index c3dc76843..b79623ed0 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/de.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/de.json @@ -38,7 +38,9 @@ "HeaderSupportTheTeam": "Unterst\u00fctzen Sie das Emby Team", "TextEnjoyBonusFeatures": "Erleben Sie Bonus Funktionen", "TitleLiveTV": "Live-TV", + "ButtonCancelSyncJob": "Synchronisationsjob abbrechen", "TitleSync": "Synchronisation", + "HeaderSelectDate": "Datum w\u00e4hlen", "ButtonDonate": "Spenden", "LabelRecurringDonationCanBeCancelledHelp": "Fortlaufende Spenden k\u00f6nnen jederzeit \u00fcber deinen PayPal Account gek\u00fcndigt werden.", "HeaderMyMedia": "Meine Medien", @@ -104,6 +106,7 @@ "TitlePlugins": "Plugins", "ButtonTakeTheTourToSeeWhatsNew": "Gehen Sie auf Erkundung und erfahren Sie was neu ist", "MessageNoSyncJobsFound": "Keine Synchronisierungs-Aufgaben gefunden. Um Synchronisierungs-Aufgaben zu erstellen verwenden Sie die dazugeh\u00f6rige Funktion im Web-Interface.", + "ButtonPlayTrailer": "Trailer abspielen", "HeaderLibraryAccess": "Bibliothekszugriff", "HeaderChannelAccess": "Channelzugriff", "HeaderDeviceAccess": "Ger\u00e4te Zugang", @@ -144,7 +147,6 @@ "ButtonPlay": "Abspielen", "ButtonEdit": "Bearbeiten", "ButtonQueue": "Warteschlange", - "ButtonPlayTrailer": "Trailer abspielen", "ButtonPlaylist": "Wiedergabeliste", "ButtonPreviousTrack": "Vorheriges St\u00fcck", "LabelEnabled": "Aktivieren", @@ -263,6 +265,7 @@ "LabelPlayMethodTranscoding": "Transkodieren", "LabelPlayMethodDirectStream": "Direktes Streaming", "LabelPlayMethodDirectPlay": "Direktes Abspielen", + "LabelEpisodeNumber": "Episodennummer:", "LabelAudioCodec": "Audio: {0}", "LabelVideoCodec": "Video: {0}", "LabelLocalAccessUrl": "Lokale Adresse: {0}", @@ -308,6 +311,7 @@ "HeaderArtist": "Interpret", "LabelAddedOnDate": "Hinzugef\u00fcgt {0}", "ButtonStart": "Start", + "LabelSeasonNumber": "Staffelnummer:", "HeaderChannels": "Kan\u00e4le", "HeaderMediaFolders": "Medienverzeichnisse", "HeaderBlockItemsWithNoRating": "Blockiere Inhalte ohne Altersfreigabe:", @@ -336,6 +340,7 @@ "ButtonNextPage": "N\u00e4chste Seite", "ButtonPreviousPage": "Vorherige Seite", "ButtonMoveLeft": "Nach links", + "OptionReleaseDate": "Ver\u00f6ffentlichungsdatum", "ButtonMoveRight": "Nach rechts", "ButtonBrowseOnlineImages": "Durchsuche Onlinebilder", "HeaderDeleteItem": "L\u00f6sche Element", @@ -478,11 +483,8 @@ "PersonTypePerson": "Person", "LabelTitleDisplayOrder": "Reihenfolge Titeldarstellung:", "OptionSortName": "Sortiername", - "OptionReleaseDate": "Ver\u00f6ffentlichungsdatum", - "LabelSeasonNumber": "Staffelnummer:", "LabelDiscNumber": "Disc Nummer", "LabelParentNumber": "Ursprungsnummer", - "LabelEpisodeNumber": "Episodennummer:", "LabelTrackNumber": "St\u00fcck Nummer:", "LabelNumber": "Nummer:", "LabelReleaseDate": "Ver\u00f6ffentlichungsdatum:", @@ -713,7 +715,7 @@ "MessageInvitationSentToNewUser": "Eine Email wurde an {0} mit einer Einladung zur Anmeldung an Emby gesendet.", "HeaderConnectionFailure": "Verbindungsfehler", "MessageUnableToConnectToServer": "Wir k\u00f6nnen gerade keine Verbindung zum gew\u00e4hlten Server herstellen. Bitte stellen Sie sicher das dieser l\u00e4uft und versuchen Sie es erneut.", - "ButtonSelectServer": "Select Server", + "ButtonSelectServer": "W\u00e4hle Server", "MessagePluginConfigurationRequiresLocalAccess": "Melde dich bitte direkt an deinem lokalen Server an, um dieses Plugin konfigurieren zu k\u00f6nnen.", "MessageLoggedOutParentalControl": "Der Zugriff ist derzeit eingeschr\u00e4nkt. Bitte versuche es sp\u00e4ter erneut.", "DefaultErrorMessage": "Es gab einen Fehler beim verarbeiten der Anfrage. Bitte versuche es sp\u00e4ter erneut.", @@ -741,7 +743,7 @@ "LabelQuality": "Qualit\u00e4t:", "HeaderSettings": "Einstellungen", "OptionAutomaticallySyncNewContent": "Synchronisiere neue Inhalte automatisch", - "OptionAutomaticallySyncNewContentHelp": "New content added to will be automatically synced to the device.", + "OptionAutomaticallySyncNewContentHelp": "Neu hinzugef\u00fcgte Inhalte werden automatisch zum Ger\u00e4t synchronisiert.", "OptionSyncUnwatchedVideosOnly": "Synchronisiere nur ungesehene Videos.", "OptionSyncUnwatchedVideosOnlyHelp": "Nur ungesehene Video werden synchronisiert. Videos werden entfernt sobald diese auf dem Ger\u00e4t angeschaut wurden.", "LabelItemLimit": "Maximale Anzahl:", @@ -776,7 +778,7 @@ "ButtonUnlockWithSupporter": "Anmelden mit Emby Unterst\u00fctzer Mitgliedschaft", "MessagePleaseSignInLocalNetwork": "Bevor Sie fortsetzen sollten Sie sicher sein, dass Sie mit Ihrem Heimnetzwerk verbunden sind.", "ButtonUnlockWithPurchase": "Freischalten durch Kauf", - "ButtonUnlockPrice": "Unlock {0}", + "ButtonUnlockPrice": "Freischalten {0}", "MessageLiveTvGuideRequiresUnlock": "Ihr TV-Guide ist begrenzt auf {0} Kan\u00e4le. Klicken Sie auf die Freischalten Schaltfl\u00e4che um weitere Informationen zu erhalten.", "OptionEnableFullscreen": "Aktivieren Vollbild", "ButtonServer": "Server", @@ -785,14 +787,23 @@ "HeaderMedia": "Medien", "ButtonInbox": "Posteingang", "HeaderAdvanced": "Erweitert", - "HeaderSaySomethingLike": "Say Something Like...", - "ButtonTryAgain": "Try Again", - "HeaderYouSaid": "You Said...", - "MessageWeDidntRecognizeCommand": "We're sorry, we didn't recognize that command.", - "MessageIfYouBlockedVoice": "If you denied voice access to the app you'll need to reconfigure before trying again.", - "MessageNoItemsFound": "No items found.", - "ButtonManageServer": "Manage Server", - "ButtonPreferences": "Preferences", - "ButtonViewArtist": "View artist", - "ButtonViewAlbum": "View album" + "HeaderGroupVersions": "Gruppen Versionen", + "HeaderSaySomethingLike": "Sagen Sie etwas wie...", + "ButtonTryAgain": "Erneut versuchen", + "HeaderYouSaid": "Sie sagten....", + "MessageWeDidntRecognizeCommand": "Entschuldigung, dieses Kommando konnten wir nicht erkennen.", + "MessageIfYouBlockedVoice": "Wenn Sie die Sprachsteuerung f\u00fcr die App nicht erlaubt haben so m\u00fcssen Sie dies zuvor \u00e4ndern bevor Sie es erneut probieren.", + "MessageNoItemsFound": "Keine Eintr\u00e4ge gefunden.", + "ButtonManageServer": "Konfiguriere Server", + "ButtonPreferences": "Einstellungen", + "ButtonViewArtist": "Zeige Darsteller", + "ButtonViewAlbum": "Zeige Album", + "ErrorMessagePasswordNotMatchConfirm": "Das Passwort und die Passwort-Best\u00e4tigung m\u00fcssen \u00fcbereinstimmen.", + "ErrorMessageUsernameInUse": "Der Benutzername wird bereits verwenden. Bitte w\u00e4hlen Sie einen neuen Namen und versuchen Sie es erneut.", + "ErrorMessageEmailInUse": "Die Emailadresse wird bereits verwendet. Bitte verwenden Sie eine neue Emailadresse und versuchen Sie es erneut oder benutzen Sie die \"Passwort vergessen\" Funktion.", + "MessageThankYouForConnectSignUp": "Vielen Dank f\u00fcr Ihre Anmeldung bei Emby Connect. Eine Emails mit weiteren Schritten zur Anmeldung Ihres neuen Kontos wird Ihnen in K\u00fcrze zugestellt. Bitte best\u00e4tigen Sie Ihr Konto und kehren Sie dann hier her zur\u00fcck um sich anzumelden.", + "HeaderShare": "Teilen", + "ButtonShareHelp": "Teilen Sie eine Website mit Medieninformationen in einem sozialen Netzwerk. Medien werden niemals \u00f6ffentlich geteilt.", + "ButtonShare": "Teilen", + "HeaderConfirm": "Best\u00e4tigen" }
\ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/el.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/el.json index a3c94fc9f..1381344f7 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/el.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/el.json @@ -38,7 +38,9 @@ "HeaderSupportTheTeam": "Support the Emby Team", "TextEnjoyBonusFeatures": "Enjoy Bonus Features", "TitleLiveTV": "Live TV", + "ButtonCancelSyncJob": "Cancel sync job", "TitleSync": "Sync", + "HeaderSelectDate": "Select Date", "ButtonDonate": "Donate", "LabelRecurringDonationCanBeCancelledHelp": "Recurring donations can be cancelled at any time from within your PayPal account.", "HeaderMyMedia": "My Media", @@ -104,6 +106,7 @@ "TitlePlugins": "\u03a0\u03c1\u03cc\u03c3\u03b8\u03b5\u03c4\u03b1", "ButtonTakeTheTourToSeeWhatsNew": "Take the tour to see what's new", "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the web interface.", + "ButtonPlayTrailer": "Play trailer", "HeaderLibraryAccess": "Library Access", "HeaderChannelAccess": "Channel Access", "HeaderDeviceAccess": "\u03a0\u03c1\u03cc\u03c3\u03b2\u03b1\u03c3\u03b7 \u03a3\u03c5\u03c3\u03ba\u03b5\u03c5\u03ae\u03c2", @@ -144,7 +147,6 @@ "ButtonPlay": "Play", "ButtonEdit": "Edit", "ButtonQueue": "Queue", - "ButtonPlayTrailer": "\u0391\u03bd\u03b1\u03c0\u03b1\u03c1\u03b1\u03b3\u03c9\u03b3\u03ae trailer", "ButtonPlaylist": "Playlist", "ButtonPreviousTrack": "\u03a0\u03c1\u03bf\u03b7\u03b3\u03bf\u03cd\u03bc\u03b5\u03bd\u03bf \u039a\u03bf\u03bc\u03bc\u03ac\u03c4\u03b9", "LabelEnabled": "Enabled", @@ -263,6 +265,7 @@ "LabelPlayMethodTranscoding": "Transcoding", "LabelPlayMethodDirectStream": "Direct Streaming", "LabelPlayMethodDirectPlay": "Direct Playing", + "LabelEpisodeNumber": "Episode number:", "LabelAudioCodec": "Audio: {0}", "LabelVideoCodec": "Video: {0}", "LabelLocalAccessUrl": "Local access: {0}", @@ -308,6 +311,7 @@ "HeaderArtist": "Artist", "LabelAddedOnDate": "Added {0}", "ButtonStart": "Start", + "LabelSeasonNumber": "Season number:", "HeaderChannels": "\u039a\u03b1\u03bd\u03ac\u03bb\u03b9\u03b1", "HeaderMediaFolders": "\u03a6\u03ac\u03ba\u03b5\u03bb\u03bf\u03b9 \u03a0\u03bf\u03bb\u03c5\u03bc\u03ad\u03c3\u03c9\u03bd", "HeaderBlockItemsWithNoRating": "Block content with no rating information:", @@ -336,6 +340,7 @@ "ButtonNextPage": "Next Page", "ButtonPreviousPage": "Previous Page", "ButtonMoveLeft": "Move left", + "OptionReleaseDate": "Release date", "ButtonMoveRight": "Move right", "ButtonBrowseOnlineImages": "Browse online images", "HeaderDeleteItem": "Delete Item", @@ -478,11 +483,8 @@ "PersonTypePerson": "Person", "LabelTitleDisplayOrder": "Title display order:", "OptionSortName": "Sort name", - "OptionReleaseDate": "\u03a0\u03c1\u03ce\u03c4\u03b7 \u03a0\u03c1\u03bf\u03b2\u03bf\u03bb\u03ae", - "LabelSeasonNumber": "Season number:", "LabelDiscNumber": "Disc number", "LabelParentNumber": "Parent number", - "LabelEpisodeNumber": "Episode number:", "LabelTrackNumber": "Track number:", "LabelNumber": "Number:", "LabelReleaseDate": "Release date:", @@ -785,6 +787,7 @@ "HeaderMedia": "Media", "ButtonInbox": "Inbox", "HeaderAdvanced": "Advanced", + "HeaderGroupVersions": "Group Versions", "HeaderSaySomethingLike": "Say Something Like...", "ButtonTryAgain": "Try Again", "HeaderYouSaid": "You Said...", @@ -794,5 +797,13 @@ "ButtonManageServer": "Manage Server", "ButtonPreferences": "Preferences", "ButtonViewArtist": "View artist", - "ButtonViewAlbum": "View album" + "ButtonViewAlbum": "View album", + "ErrorMessagePasswordNotMatchConfirm": "The password and password confirmation must match.", + "ErrorMessageUsernameInUse": "The username is already in use. Please choose a new name and try again.", + "ErrorMessageEmailInUse": "The email address is already in use. Please enter a new email address and try again, or use the forgot password feature.", + "MessageThankYouForConnectSignUp": "Thank you for signing up for Emby Connect. An email will be sent to your address with instructions on how to confirm your new account. Please confirm the account and then return here to sign in.", + "HeaderShare": "Share", + "ButtonShareHelp": "Share a web page containing media information with social media. Media files are never shared publicly.", + "ButtonShare": "Share", + "HeaderConfirm": "Confirm" }
\ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/en-GB.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/en-GB.json index 72dacb8ff..9dbdfe995 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/en-GB.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/en-GB.json @@ -38,7 +38,9 @@ "HeaderSupportTheTeam": "Support the Emby Team", "TextEnjoyBonusFeatures": "Enjoy Bonus Features", "TitleLiveTV": "Live TV", + "ButtonCancelSyncJob": "Cancel sync job", "TitleSync": "Sync", + "HeaderSelectDate": "Select Date", "ButtonDonate": "Donate", "LabelRecurringDonationCanBeCancelledHelp": "Recurring donations can be cancelled at any time from within your PayPal account.", "HeaderMyMedia": "My Media", @@ -104,6 +106,7 @@ "TitlePlugins": "Plugins", "ButtonTakeTheTourToSeeWhatsNew": "Take the tour to see what's new", "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the web interface.", + "ButtonPlayTrailer": "Play trailer", "HeaderLibraryAccess": "Library Access", "HeaderChannelAccess": "Channel Access", "HeaderDeviceAccess": "Device Access", @@ -144,7 +147,6 @@ "ButtonPlay": "Play", "ButtonEdit": "Edit", "ButtonQueue": "Queue", - "ButtonPlayTrailer": "Play trailer", "ButtonPlaylist": "Playlist", "ButtonPreviousTrack": "Previous Track", "LabelEnabled": "Enabled", @@ -263,6 +265,7 @@ "LabelPlayMethodTranscoding": "Transcoding", "LabelPlayMethodDirectStream": "Direct Streaming", "LabelPlayMethodDirectPlay": "Direct Playing", + "LabelEpisodeNumber": "Episode number:", "LabelAudioCodec": "Audio: {0}", "LabelVideoCodec": "Video: {0}", "LabelLocalAccessUrl": "Local access: {0}", @@ -308,6 +311,7 @@ "HeaderArtist": "Artist", "LabelAddedOnDate": "Added {0}", "ButtonStart": "Start", + "LabelSeasonNumber": "Season number:", "HeaderChannels": "Channels", "HeaderMediaFolders": "Media Folders", "HeaderBlockItemsWithNoRating": "Block content with no rating information:", @@ -336,6 +340,7 @@ "ButtonNextPage": "Next Page", "ButtonPreviousPage": "Previous Page", "ButtonMoveLeft": "Move left", + "OptionReleaseDate": "Release date", "ButtonMoveRight": "Move right", "ButtonBrowseOnlineImages": "Browse online images", "HeaderDeleteItem": "Delete Item", @@ -478,11 +483,8 @@ "PersonTypePerson": "Person", "LabelTitleDisplayOrder": "Title display order:", "OptionSortName": "Sort name", - "OptionReleaseDate": "Release date", - "LabelSeasonNumber": "Season number:", "LabelDiscNumber": "Disc number", "LabelParentNumber": "Parent number", - "LabelEpisodeNumber": "Episode number:", "LabelTrackNumber": "Track number:", "LabelNumber": "Number:", "LabelReleaseDate": "Release date:", @@ -785,6 +787,7 @@ "HeaderMedia": "Media", "ButtonInbox": "Inbox", "HeaderAdvanced": "Advanced", + "HeaderGroupVersions": "Group Versions", "HeaderSaySomethingLike": "Say Something Like...", "ButtonTryAgain": "Try Again", "HeaderYouSaid": "You Said...", @@ -794,5 +797,13 @@ "ButtonManageServer": "Manage Server", "ButtonPreferences": "Preferences", "ButtonViewArtist": "View artist", - "ButtonViewAlbum": "View album" + "ButtonViewAlbum": "View album", + "ErrorMessagePasswordNotMatchConfirm": "The password and password confirmation must match.", + "ErrorMessageUsernameInUse": "The username is already in use. Please choose a new name and try again.", + "ErrorMessageEmailInUse": "The email address is already in use. Please enter a new email address and try again, or use the forgot password feature.", + "MessageThankYouForConnectSignUp": "Thank you for signing up for Emby Connect. An email will be sent to your address with instructions on how to confirm your new account. Please confirm the account and then return here to sign in.", + "HeaderShare": "Share", + "ButtonShareHelp": "Share a web page containing media information with social media. Media files are never shared publicly.", + "ButtonShare": "Share", + "HeaderConfirm": "Confirm" }
\ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/en-US.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/en-US.json index da006511f..f0a9ac9de 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/en-US.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/en-US.json @@ -38,7 +38,9 @@ "HeaderSupportTheTeam": "Support the Emby Team", "TextEnjoyBonusFeatures": "Enjoy Bonus Features", "TitleLiveTV": "Live TV", + "ButtonCancelSyncJob": "Cancel sync job", "TitleSync": "Sync", + "HeaderSelectDate": "Select Date", "ButtonDonate": "Donate", "LabelRecurringDonationCanBeCancelledHelp": "Recurring donations can be cancelled at any time from within your PayPal account.", "HeaderMyMedia": "My Media", @@ -104,6 +106,7 @@ "TitlePlugins": "Plugins", "ButtonTakeTheTourToSeeWhatsNew": "Take the tour to see what's new", "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the web interface.", + "ButtonPlayTrailer": "Play trailer", "HeaderLibraryAccess": "Library Access", "HeaderChannelAccess": "Channel Access", "HeaderDeviceAccess": "Device Access", @@ -144,7 +147,6 @@ "ButtonPlay": "Play", "ButtonEdit": "Edit", "ButtonQueue": "Queue", - "ButtonPlayTrailer": "Play trailer", "ButtonPlaylist": "Playlist", "ButtonPreviousTrack": "Previous Track", "LabelEnabled": "Enabled", @@ -263,6 +265,7 @@ "LabelPlayMethodTranscoding": "Transcoding", "LabelPlayMethodDirectStream": "Direct Streaming", "LabelPlayMethodDirectPlay": "Direct Playing", + "LabelEpisodeNumber": "Episode number:", "LabelAudioCodec": "Audio: {0}", "LabelVideoCodec": "Video: {0}", "LabelLocalAccessUrl": "Local access: {0}", @@ -308,6 +311,7 @@ "HeaderArtist": "Artist", "LabelAddedOnDate": "Added {0}", "ButtonStart": "Start", + "LabelSeasonNumber": "Season number:", "HeaderChannels": "Channels", "HeaderMediaFolders": "Media Folders", "HeaderBlockItemsWithNoRating": "Block content with no rating information:", @@ -336,6 +340,7 @@ "ButtonNextPage": "Next Page", "ButtonPreviousPage": "Previous Page", "ButtonMoveLeft": "Move left", + "OptionReleaseDate": "Release date", "ButtonMoveRight": "Move right", "ButtonBrowseOnlineImages": "Browse online images", "HeaderDeleteItem": "Delete Item", @@ -478,11 +483,8 @@ "PersonTypePerson": "Person", "LabelTitleDisplayOrder": "Title display order:", "OptionSortName": "Sort name", - "OptionReleaseDate": "Release date", - "LabelSeasonNumber": "Season number:", "LabelDiscNumber": "Disc number", "LabelParentNumber": "Parent number", - "LabelEpisodeNumber": "Episode number:", "LabelTrackNumber": "Track number:", "LabelNumber": "Number:", "LabelReleaseDate": "Release date:", @@ -785,6 +787,7 @@ "HeaderMedia": "Media", "ButtonInbox": "Inbox", "HeaderAdvanced": "Advanced", + "HeaderGroupVersions": "Group Versions", "HeaderSaySomethingLike": "Say Something Like...", "ButtonTryAgain": "Try Again", "HeaderYouSaid": "You Said...", @@ -794,5 +797,13 @@ "ButtonManageServer": "Manage Server", "ButtonPreferences": "Preferences", "ButtonViewArtist": "View artist", - "ButtonViewAlbum": "View album" + "ButtonViewAlbum": "View album", + "ErrorMessagePasswordNotMatchConfirm": "The password and password confirmation must match.", + "ErrorMessageUsernameInUse": "The username is already in use. Please choose a new name and try again.", + "ErrorMessageEmailInUse": "The email address is already in use. Please enter a new email address and try again, or use the forgot password feature.", + "MessageThankYouForConnectSignUp": "Thank you for signing up for Emby Connect. An email will be sent to your address with instructions on how to confirm your new account. Please confirm the account and then return here to sign in.", + "HeaderShare": "Share", + "ButtonShareHelp": "Share a web page containing media information with social media. Media files are never shared publicly.", + "ButtonShare": "Share", + "HeaderConfirm": "Confirm" }
\ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/es-AR.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/es-AR.json index 38cfb9f9f..cfab42cd1 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/es-AR.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/es-AR.json @@ -38,7 +38,9 @@ "HeaderSupportTheTeam": "Support the Emby Team", "TextEnjoyBonusFeatures": "Disfrute los extras", "TitleLiveTV": "Live TV", + "ButtonCancelSyncJob": "Cancel sync job", "TitleSync": "Sync", + "HeaderSelectDate": "Select Date", "ButtonDonate": "Donate", "LabelRecurringDonationCanBeCancelledHelp": "Recurring donations can be cancelled at any time from within your PayPal account.", "HeaderMyMedia": "My Media", @@ -104,6 +106,7 @@ "TitlePlugins": "Plugins", "ButtonTakeTheTourToSeeWhatsNew": "Take the tour to see what's new", "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the web interface.", + "ButtonPlayTrailer": "Play trailer", "HeaderLibraryAccess": "Library Access", "HeaderChannelAccess": "Channel Access", "HeaderDeviceAccess": "Device Access", @@ -144,7 +147,6 @@ "ButtonPlay": "Play", "ButtonEdit": "Edit", "ButtonQueue": "Queue", - "ButtonPlayTrailer": "Ver trailer", "ButtonPlaylist": "Playlist", "ButtonPreviousTrack": "Tema Anterior", "LabelEnabled": "Enabled", @@ -263,6 +265,7 @@ "LabelPlayMethodTranscoding": "Transcoding", "LabelPlayMethodDirectStream": "Direct Streaming", "LabelPlayMethodDirectPlay": "Direct Playing", + "LabelEpisodeNumber": "Episode number:", "LabelAudioCodec": "Audio: {0}", "LabelVideoCodec": "Video: {0}", "LabelLocalAccessUrl": "Local access: {0}", @@ -308,6 +311,7 @@ "HeaderArtist": "Artist", "LabelAddedOnDate": "Added {0}", "ButtonStart": "Start", + "LabelSeasonNumber": "Season number:", "HeaderChannels": "Channels", "HeaderMediaFolders": "Media Folders", "HeaderBlockItemsWithNoRating": "Block content with no rating information:", @@ -336,6 +340,7 @@ "ButtonNextPage": "P\u00e1gina siguiente", "ButtonPreviousPage": "P\u00e1gina anterior", "ButtonMoveLeft": "Move left", + "OptionReleaseDate": "Release date", "ButtonMoveRight": "Move right", "ButtonBrowseOnlineImages": "Browse online images", "HeaderDeleteItem": "Delete Item", @@ -478,11 +483,8 @@ "PersonTypePerson": "Person", "LabelTitleDisplayOrder": "Title display order:", "OptionSortName": "Sort name", - "OptionReleaseDate": "Fecha de estreno", - "LabelSeasonNumber": "Season number:", "LabelDiscNumber": "Disc number", "LabelParentNumber": "Parent number", - "LabelEpisodeNumber": "Episode number:", "LabelTrackNumber": "Track number:", "LabelNumber": "Number:", "LabelReleaseDate": "Release date:", @@ -785,6 +787,7 @@ "HeaderMedia": "Media", "ButtonInbox": "Inbox", "HeaderAdvanced": "Advanced", + "HeaderGroupVersions": "Group Versions", "HeaderSaySomethingLike": "Say Something Like...", "ButtonTryAgain": "Try Again", "HeaderYouSaid": "You Said...", @@ -794,5 +797,13 @@ "ButtonManageServer": "Manage Server", "ButtonPreferences": "Preferences", "ButtonViewArtist": "View artist", - "ButtonViewAlbum": "View album" + "ButtonViewAlbum": "View album", + "ErrorMessagePasswordNotMatchConfirm": "The password and password confirmation must match.", + "ErrorMessageUsernameInUse": "The username is already in use. Please choose a new name and try again.", + "ErrorMessageEmailInUse": "The email address is already in use. Please enter a new email address and try again, or use the forgot password feature.", + "MessageThankYouForConnectSignUp": "Thank you for signing up for Emby Connect. An email will be sent to your address with instructions on how to confirm your new account. Please confirm the account and then return here to sign in.", + "HeaderShare": "Share", + "ButtonShareHelp": "Share a web page containing media information with social media. Media files are never shared publicly.", + "ButtonShare": "Share", + "HeaderConfirm": "Confirm" }
\ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/es-MX.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/es-MX.json index 14f77609f..d4ce5c824 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/es-MX.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/es-MX.json @@ -38,7 +38,9 @@ "HeaderSupportTheTeam": "Apoye al equipo de Emby", "TextEnjoyBonusFeatures": "Disfruta de Caracter\u00edsticas Premium", "TitleLiveTV": "TV en Vivo", + "ButtonCancelSyncJob": "Cancelar trabajo de Sinc.", "TitleSync": "Sinc", + "HeaderSelectDate": "Seleccionar fecha", "ButtonDonate": "Donar", "LabelRecurringDonationCanBeCancelledHelp": "Las donaciones recurrentes pueden ser canceladas en cualquier momento desde su cuenta PayPal.", "HeaderMyMedia": "Mis Medios", @@ -104,6 +106,7 @@ "TitlePlugins": "Complementos", "ButtonTakeTheTourToSeeWhatsNew": "Inice el tour para ver que hay de nuevo", "MessageNoSyncJobsFound": "No se han encontrado trabajos de sincronizaci\u00f3n. Cree trabajos de sincronizaci\u00f3n empleando los botones de Sinc que se encuentran en la intergface web.", + "ButtonPlayTrailer": "Reproducir Avance", "HeaderLibraryAccess": "Acceso a la Biblioteca", "HeaderChannelAccess": "Acceso a los Canales", "HeaderDeviceAccess": "Acceso a Dispositivos", @@ -144,7 +147,6 @@ "ButtonPlay": "Reproducir", "ButtonEdit": "Editar", "ButtonQueue": "A cola", - "ButtonPlayTrailer": "Reproducir tr\u00e1iler", "ButtonPlaylist": "Lista de Reprod.", "ButtonPreviousTrack": "Pista Anterior", "LabelEnabled": "Habilitado", @@ -263,6 +265,7 @@ "LabelPlayMethodTranscoding": "Trasncodificado", "LabelPlayMethodDirectStream": "Transmisi\u00f3n Directa", "LabelPlayMethodDirectPlay": "Reproducci\u00f3n Directa", + "LabelEpisodeNumber": "N\u00famero de episodio:", "LabelAudioCodec": "Audio: {0}", "LabelVideoCodec": "Video: {0}", "LabelLocalAccessUrl": "Direcci\u00f3n local: {0}", @@ -308,6 +311,7 @@ "HeaderArtist": "Artista", "LabelAddedOnDate": "Agregado {0}", "ButtonStart": "Iniciar", + "LabelSeasonNumber": "N\u00famero de temporada:", "HeaderChannels": "Canales", "HeaderMediaFolders": "Carpetas de Medios", "HeaderBlockItemsWithNoRating": "Bloquear contenido sin informaci\u00f3n de clasificaci\u00f3n:", @@ -336,6 +340,7 @@ "ButtonNextPage": "P\u00e1gina Siguiente", "ButtonPreviousPage": "P\u00e1gina Anterior", "ButtonMoveLeft": "Mover a la izquierda", + "OptionReleaseDate": "Fecha de estreno", "ButtonMoveRight": "Mover a la derecha", "ButtonBrowseOnlineImages": "Buscar im\u00e1genes en l\u00ednea", "HeaderDeleteItem": "Eliminar \u00cdtem", @@ -478,11 +483,8 @@ "PersonTypePerson": "Persona", "LabelTitleDisplayOrder": "Ordenamiento de despliegue de t\u00edtulos:", "OptionSortName": "Nombre para ordenar", - "OptionReleaseDate": "Fecha de estreno", - "LabelSeasonNumber": "N\u00famero de temporada:", "LabelDiscNumber": "N\u00famero de disco", "LabelParentNumber": "N\u00famero antecesor", - "LabelEpisodeNumber": "N\u00famero de episodio:", "LabelTrackNumber": "N\u00famero de Pista:", "LabelNumber": "N\u00famero:", "LabelReleaseDate": "Fecha de estreno:", @@ -785,6 +787,7 @@ "HeaderMedia": "Medios", "ButtonInbox": "Inbox", "HeaderAdvanced": "Avanzado", + "HeaderGroupVersions": "Agrupar Versiones", "HeaderSaySomethingLike": "Decir Algo Como...", "ButtonTryAgain": "Intentar de Nuevo", "HeaderYouSaid": "Ha Dicho...", @@ -794,5 +797,13 @@ "ButtonManageServer": "Administrar Servidor", "ButtonPreferences": "Preferencias", "ButtonViewArtist": "Ver artista", - "ButtonViewAlbum": "Ver album" + "ButtonViewAlbum": "Ver album", + "ErrorMessagePasswordNotMatchConfirm": "La Contrase\u00f1a y la confirmaci\u00f3n de la contrase\u00f1a deben coincidir.", + "ErrorMessageUsernameInUse": "El Nombre de Usuario ya esta en uso. Por favor seleccione un nuevo nombre e intente de nuevo.", + "ErrorMessageEmailInUse": "La direcci\u00f3n de correo electr\u00f3nico ya esta en uso. Por favor ingrese un correo electr\u00f3nico nuevo e intente de nuevo, o si olvido la contrase\u00f1a use la opci\u00f3n \"Olvide mi contrase\u00f1a\".", + "MessageThankYouForConnectSignUp": "Gracias por registrarse a Emby Connect. Un correo electr\u00f3nico sera enviado a su direcci\u00f3n con instrucciones de como confirmar su nueva cuenta. Por favor confirme la cuente y regrese aqu\u00ed para iniciar sesi\u00f3n.", + "HeaderShare": "Compartir", + "ButtonShareHelp": "Compartir paginas web que contengan informaci\u00f3n sobre los medios con redes sociales. Los archivos de los medios nunca son compartidos p\u00fablicamente.", + "ButtonShare": "Compartir", + "HeaderConfirm": "Confirmar" }
\ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/es-VE.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/es-VE.json index 2823b0333..f0a9ac9de 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/es-VE.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/es-VE.json @@ -38,7 +38,9 @@ "HeaderSupportTheTeam": "Support the Emby Team", "TextEnjoyBonusFeatures": "Enjoy Bonus Features", "TitleLiveTV": "Live TV", + "ButtonCancelSyncJob": "Cancel sync job", "TitleSync": "Sync", + "HeaderSelectDate": "Select Date", "ButtonDonate": "Donate", "LabelRecurringDonationCanBeCancelledHelp": "Recurring donations can be cancelled at any time from within your PayPal account.", "HeaderMyMedia": "My Media", @@ -104,6 +106,7 @@ "TitlePlugins": "Plugins", "ButtonTakeTheTourToSeeWhatsNew": "Take the tour to see what's new", "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the web interface.", + "ButtonPlayTrailer": "Play trailer", "HeaderLibraryAccess": "Library Access", "HeaderChannelAccess": "Channel Access", "HeaderDeviceAccess": "Device Access", @@ -144,7 +147,6 @@ "ButtonPlay": "Play", "ButtonEdit": "Edit", "ButtonQueue": "Queue", - "ButtonPlayTrailer": "Play trailer", "ButtonPlaylist": "Playlist", "ButtonPreviousTrack": "Previous Track", "LabelEnabled": "Enabled", @@ -263,6 +265,7 @@ "LabelPlayMethodTranscoding": "Transcoding", "LabelPlayMethodDirectStream": "Direct Streaming", "LabelPlayMethodDirectPlay": "Direct Playing", + "LabelEpisodeNumber": "Episode number:", "LabelAudioCodec": "Audio: {0}", "LabelVideoCodec": "Video: {0}", "LabelLocalAccessUrl": "Local access: {0}", @@ -308,6 +311,7 @@ "HeaderArtist": "Artist", "LabelAddedOnDate": "Added {0}", "ButtonStart": "Start", + "LabelSeasonNumber": "Season number:", "HeaderChannels": "Channels", "HeaderMediaFolders": "Media Folders", "HeaderBlockItemsWithNoRating": "Block content with no rating information:", @@ -336,6 +340,7 @@ "ButtonNextPage": "Next Page", "ButtonPreviousPage": "Previous Page", "ButtonMoveLeft": "Move left", + "OptionReleaseDate": "Release date", "ButtonMoveRight": "Move right", "ButtonBrowseOnlineImages": "Browse online images", "HeaderDeleteItem": "Delete Item", @@ -478,11 +483,8 @@ "PersonTypePerson": "Person", "LabelTitleDisplayOrder": "Title display order:", "OptionSortName": "Sort name", - "OptionReleaseDate": "Fecha de estreno", - "LabelSeasonNumber": "Season number:", "LabelDiscNumber": "Disc number", "LabelParentNumber": "Parent number", - "LabelEpisodeNumber": "Episode number:", "LabelTrackNumber": "Track number:", "LabelNumber": "Number:", "LabelReleaseDate": "Release date:", @@ -785,6 +787,7 @@ "HeaderMedia": "Media", "ButtonInbox": "Inbox", "HeaderAdvanced": "Advanced", + "HeaderGroupVersions": "Group Versions", "HeaderSaySomethingLike": "Say Something Like...", "ButtonTryAgain": "Try Again", "HeaderYouSaid": "You Said...", @@ -794,5 +797,13 @@ "ButtonManageServer": "Manage Server", "ButtonPreferences": "Preferences", "ButtonViewArtist": "View artist", - "ButtonViewAlbum": "View album" + "ButtonViewAlbum": "View album", + "ErrorMessagePasswordNotMatchConfirm": "The password and password confirmation must match.", + "ErrorMessageUsernameInUse": "The username is already in use. Please choose a new name and try again.", + "ErrorMessageEmailInUse": "The email address is already in use. Please enter a new email address and try again, or use the forgot password feature.", + "MessageThankYouForConnectSignUp": "Thank you for signing up for Emby Connect. An email will be sent to your address with instructions on how to confirm your new account. Please confirm the account and then return here to sign in.", + "HeaderShare": "Share", + "ButtonShareHelp": "Share a web page containing media information with social media. Media files are never shared publicly.", + "ButtonShare": "Share", + "HeaderConfirm": "Confirm" }
\ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/es.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/es.json index ba4ed8754..d6402c7c8 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/es.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/es.json @@ -38,7 +38,9 @@ "HeaderSupportTheTeam": "Apoye al equipo de Emby", "TextEnjoyBonusFeatures": "Disfrute los extras", "TitleLiveTV": "Tv en vivo", + "ButtonCancelSyncJob": "Cancel sync job", "TitleSync": "Sync", + "HeaderSelectDate": "Select Date", "ButtonDonate": "Donate", "LabelRecurringDonationCanBeCancelledHelp": "Donaciones recurrentes se pueden cancelar en cualquier momento desde su cuenta de PayPal.", "HeaderMyMedia": "My Media", @@ -104,6 +106,7 @@ "TitlePlugins": "Complementos", "ButtonTakeTheTourToSeeWhatsNew": "Take the tour to see what's new", "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the web interface.", + "ButtonPlayTrailer": "Play trailer", "HeaderLibraryAccess": "Library Access", "HeaderChannelAccess": "Channel Access", "HeaderDeviceAccess": "Acceso de Equipo", @@ -144,7 +147,6 @@ "ButtonPlay": "Reproducir", "ButtonEdit": "Editar", "ButtonQueue": "En cola", - "ButtonPlayTrailer": "Iniciar cortos", "ButtonPlaylist": "Lista de reproducci\u00f3n", "ButtonPreviousTrack": "Pista anterior", "LabelEnabled": "Activado", @@ -263,6 +265,7 @@ "LabelPlayMethodTranscoding": "Transcodificaci\u00f3n", "LabelPlayMethodDirectStream": "Streaming directo", "LabelPlayMethodDirectPlay": "Reproducci\u00f3n directa", + "LabelEpisodeNumber": "Episode number:", "LabelAudioCodec": "Audio: {0}", "LabelVideoCodec": "Video: {0}", "LabelLocalAccessUrl": "Local access: {0}", @@ -308,6 +311,7 @@ "HeaderArtist": "Artista", "LabelAddedOnDate": "A\u00f1adido {0}", "ButtonStart": "Inicio", + "LabelSeasonNumber": "Season number:", "HeaderChannels": "Canales", "HeaderMediaFolders": "Carpetas de medios", "HeaderBlockItemsWithNoRating": "Block content with no rating information:", @@ -336,6 +340,7 @@ "ButtonNextPage": "P\u00e1gina siguiente", "ButtonPreviousPage": "P\u00e1gina anterior", "ButtonMoveLeft": "Mover izquierda", + "OptionReleaseDate": "Release date", "ButtonMoveRight": "Mover derecha", "ButtonBrowseOnlineImages": "Navegar im\u00e1genes online", "HeaderDeleteItem": "Borrar elemento", @@ -478,11 +483,8 @@ "PersonTypePerson": "Person", "LabelTitleDisplayOrder": "Title display order:", "OptionSortName": "Sort name", - "OptionReleaseDate": "Fecha de estreno", - "LabelSeasonNumber": "Temporada n\u00famero:", "LabelDiscNumber": "Disc number", "LabelParentNumber": "Parent number", - "LabelEpisodeNumber": "N\u00famero de cap\u00edtulo:", "LabelTrackNumber": "Track number:", "LabelNumber": "Number:", "LabelReleaseDate": "Release date:", @@ -785,6 +787,7 @@ "HeaderMedia": "Media", "ButtonInbox": "Inbox", "HeaderAdvanced": "Advanced", + "HeaderGroupVersions": "Group Versions", "HeaderSaySomethingLike": "Say Something Like...", "ButtonTryAgain": "Try Again", "HeaderYouSaid": "You Said...", @@ -794,5 +797,13 @@ "ButtonManageServer": "Manage Server", "ButtonPreferences": "Preferences", "ButtonViewArtist": "View artist", - "ButtonViewAlbum": "View album" + "ButtonViewAlbum": "View album", + "ErrorMessagePasswordNotMatchConfirm": "The password and password confirmation must match.", + "ErrorMessageUsernameInUse": "The username is already in use. Please choose a new name and try again.", + "ErrorMessageEmailInUse": "The email address is already in use. Please enter a new email address and try again, or use the forgot password feature.", + "MessageThankYouForConnectSignUp": "Thank you for signing up for Emby Connect. An email will be sent to your address with instructions on how to confirm your new account. Please confirm the account and then return here to sign in.", + "HeaderShare": "Share", + "ButtonShareHelp": "Share a web page containing media information with social media. Media files are never shared publicly.", + "ButtonShare": "Share", + "HeaderConfirm": "Confirm" }
\ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/fi.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/fi.json index cfa446f10..4b858141b 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/fi.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/fi.json @@ -38,7 +38,9 @@ "HeaderSupportTheTeam": "Support the Emby Team", "TextEnjoyBonusFeatures": "Enjoy Bonus Features", "TitleLiveTV": "Live TV", + "ButtonCancelSyncJob": "Cancel sync job", "TitleSync": "Sync", + "HeaderSelectDate": "Select Date", "ButtonDonate": "Donate", "LabelRecurringDonationCanBeCancelledHelp": "Recurring donations can be cancelled at any time from within your PayPal account.", "HeaderMyMedia": "My Media", @@ -104,6 +106,7 @@ "TitlePlugins": "Plugins", "ButtonTakeTheTourToSeeWhatsNew": "Take the tour to see what's new", "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the web interface.", + "ButtonPlayTrailer": "Play trailer", "HeaderLibraryAccess": "Library Access", "HeaderChannelAccess": "Channel Access", "HeaderDeviceAccess": "Device Access", @@ -144,7 +147,6 @@ "ButtonPlay": "Play", "ButtonEdit": "Edit", "ButtonQueue": "Queue", - "ButtonPlayTrailer": "Play trailer", "ButtonPlaylist": "Playlist", "ButtonPreviousTrack": "Previous Track", "LabelEnabled": "Enabled", @@ -263,6 +265,7 @@ "LabelPlayMethodTranscoding": "Transcoding", "LabelPlayMethodDirectStream": "Direct Streaming", "LabelPlayMethodDirectPlay": "Direct Playing", + "LabelEpisodeNumber": "Episode number:", "LabelAudioCodec": "Audio: {0}", "LabelVideoCodec": "Video: {0}", "LabelLocalAccessUrl": "Local access: {0}", @@ -308,6 +311,7 @@ "HeaderArtist": "Artist", "LabelAddedOnDate": "Added {0}", "ButtonStart": "Start", + "LabelSeasonNumber": "Season number:", "HeaderChannels": "Channels", "HeaderMediaFolders": "Media Folders", "HeaderBlockItemsWithNoRating": "Block content with no rating information:", @@ -336,6 +340,7 @@ "ButtonNextPage": "Next Page", "ButtonPreviousPage": "Previous Page", "ButtonMoveLeft": "Move left", + "OptionReleaseDate": "Release date", "ButtonMoveRight": "Move right", "ButtonBrowseOnlineImages": "Browse online images", "HeaderDeleteItem": "Delete Item", @@ -478,11 +483,8 @@ "PersonTypePerson": "Person", "LabelTitleDisplayOrder": "Title display order:", "OptionSortName": "Sort name", - "OptionReleaseDate": "Release date", - "LabelSeasonNumber": "Season number:", "LabelDiscNumber": "Disc number", "LabelParentNumber": "Parent number", - "LabelEpisodeNumber": "Episode number:", "LabelTrackNumber": "Track number:", "LabelNumber": "Number:", "LabelReleaseDate": "Release date:", @@ -785,6 +787,7 @@ "HeaderMedia": "Media", "ButtonInbox": "Inbox", "HeaderAdvanced": "Advanced", + "HeaderGroupVersions": "Group Versions", "HeaderSaySomethingLike": "Say Something Like...", "ButtonTryAgain": "Try Again", "HeaderYouSaid": "You Said...", @@ -794,5 +797,13 @@ "ButtonManageServer": "Manage Server", "ButtonPreferences": "Preferences", "ButtonViewArtist": "View artist", - "ButtonViewAlbum": "View album" + "ButtonViewAlbum": "View album", + "ErrorMessagePasswordNotMatchConfirm": "The password and password confirmation must match.", + "ErrorMessageUsernameInUse": "The username is already in use. Please choose a new name and try again.", + "ErrorMessageEmailInUse": "The email address is already in use. Please enter a new email address and try again, or use the forgot password feature.", + "MessageThankYouForConnectSignUp": "Thank you for signing up for Emby Connect. An email will be sent to your address with instructions on how to confirm your new account. Please confirm the account and then return here to sign in.", + "HeaderShare": "Share", + "ButtonShareHelp": "Share a web page containing media information with social media. Media files are never shared publicly.", + "ButtonShare": "Share", + "HeaderConfirm": "Confirm" }
\ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/fr.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/fr.json index 8d8fe4272..4a12ae55c 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/fr.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/fr.json @@ -38,7 +38,9 @@ "HeaderSupportTheTeam": "Aidez l'\u00e9quipe Emby", "TextEnjoyBonusFeatures": "Profitez bien des fonctionnalit\u00e9s bonus", "TitleLiveTV": "TV en direct", + "ButtonCancelSyncJob": "Annuler la t\u00e2che de synchro", "TitleSync": "Sync.", + "HeaderSelectDate": "S\u00e9lectionnez la date", "ButtonDonate": "Faire un don", "LabelRecurringDonationCanBeCancelledHelp": "Des donations r\u00e9currentes peuvent \u00eatre annul\u00e9es \u00e0 tout moment depuis votre compte PayPal.", "HeaderMyMedia": "Mes medias", @@ -104,6 +106,7 @@ "TitlePlugins": "Plugins", "ButtonTakeTheTourToSeeWhatsNew": "Suivez le guide pour d\u00e9couvrir les nouveaut\u00e9s", "MessageNoSyncJobsFound": "Aucune t\u00e2che de synchronisation trouv\u00e9e. Vous pouvez cr\u00e9er des t\u00e2ches de synchronisation gr\u00e2ce aux boutons 'Synchroniser' partout dans l'interface web.", + "ButtonPlayTrailer": "Lire la bande-annonce", "HeaderLibraryAccess": "Acc\u00e8s \u00e0 la librairie", "HeaderChannelAccess": "Acc\u00e8s Cha\u00eene", "HeaderDeviceAccess": "Acc\u00e8s \u00e0 l'appareil", @@ -144,7 +147,6 @@ "ButtonPlay": "Lire", "ButtonEdit": "Modifier", "ButtonQueue": "En file d'attente", - "ButtonPlayTrailer": "Lire la bande-annonce", "ButtonPlaylist": "Liste de lecture", "ButtonPreviousTrack": "Piste pr\u00e9c\u00e9dente", "LabelEnabled": "Activ\u00e9", @@ -263,6 +265,7 @@ "LabelPlayMethodTranscoding": "Transcodage", "LabelPlayMethodDirectStream": "Direct Stream", "LabelPlayMethodDirectPlay": "Direct Play", + "LabelEpisodeNumber": "Episode number:", "LabelAudioCodec": "Audio : {0}", "LabelVideoCodec": "Vid\u00e9o : {0}", "LabelLocalAccessUrl": "Acc\u00e8s local : {0}", @@ -308,6 +311,7 @@ "HeaderArtist": "Artiste", "LabelAddedOnDate": "Ajout\u00e9 {0}", "ButtonStart": "Commencer", + "LabelSeasonNumber": "Season number:", "HeaderChannels": "Cha\u00eenes", "HeaderMediaFolders": "R\u00e9pertoires de m\u00e9dias", "HeaderBlockItemsWithNoRating": "Bloquer le contenu ne comportant aucune information de classement :", @@ -336,6 +340,7 @@ "ButtonNextPage": "Page suivante", "ButtonPreviousPage": "Page pr\u00e9c\u00e9dente", "ButtonMoveLeft": "D\u00e9placer \u00e0 gauche", + "OptionReleaseDate": "Date de diffusion", "ButtonMoveRight": "D\u00e9placer \u00e0 droite", "ButtonBrowseOnlineImages": "Parcourir les images en ligne", "HeaderDeleteItem": "Supprimer l'\u00e9l\u00e9ment", @@ -478,11 +483,8 @@ "PersonTypePerson": "Personne", "LabelTitleDisplayOrder": "Ordre d'affichage des titres:", "OptionSortName": "Clef de tri", - "OptionReleaseDate": "Date de sortie ", - "LabelSeasonNumber": "Num\u00e9ro de la saison:", "LabelDiscNumber": "Num\u00e9ro de disque", "LabelParentNumber": "Num\u00e9ro parent", - "LabelEpisodeNumber": "Num\u00e9ro de l'\u00e9pisode:", "LabelTrackNumber": "Num\u00e9ro de piste:", "LabelNumber": "Num\u00e9ro:", "LabelReleaseDate": "Date de sortie", @@ -785,6 +787,7 @@ "HeaderMedia": "M\u00e9dia", "ButtonInbox": "Bo\u00eete de r\u00e9ception", "HeaderAdvanced": "Avanc\u00e9", + "HeaderGroupVersions": "Versions des groupes", "HeaderSaySomethingLike": "Dites quelque chose...", "ButtonTryAgain": "Veuillez r\u00e9essayer", "HeaderYouSaid": "Vous avez dit...", @@ -794,5 +797,13 @@ "ButtonManageServer": "G\u00e9rer le serveur", "ButtonPreferences": "Pr\u00e9f\u00e9rences", "ButtonViewArtist": "Voir l'artiste", - "ButtonViewAlbum": "Voir l'album" + "ButtonViewAlbum": "Voir l'album", + "ErrorMessagePasswordNotMatchConfirm": "Le mot de passe et sa confirmation doivent correspondre.", + "ErrorMessageUsernameInUse": "Ce nom d'utilisateur est d\u00e9j\u00e0 utilis\u00e9. Veuillez en choisir un autre et r\u00e9essayer.", + "ErrorMessageEmailInUse": "Cette adresse email est d\u00e9j\u00e0 utilis\u00e9e. Veuillez en saisir une autre et r\u00e9essayer, ou bien utiliser la fonction du mot de passe oubli\u00e9.", + "MessageThankYouForConnectSignUp": "Merci de vous inscrire sur Emby Connect. Un email va vous \u00eatre envoy\u00e9, avec les instructions pour confirmer votre nouveau compte. Merci de confirmer ce compte puis de revenir \u00e0 cet endroit pour vous connecter.", + "HeaderShare": "Partager", + "ButtonShareHelp": "Partager un page web contenant les informations sur les m\u00e9dias \u00e0 travers les m\u00e9dias sociaux. Les fichiers de m\u00e9dias ne sont jamais partag\u00e9s publiquement.", + "ButtonShare": "Partager", + "HeaderConfirm": "Confirmer" }
\ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/gsw.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/gsw.json index bd2f6d12a..47a1ae711 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/gsw.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/gsw.json @@ -38,7 +38,9 @@ "HeaderSupportTheTeam": "Support the Emby Team", "TextEnjoyBonusFeatures": "Erleb di ganze Bonis", "TitleLiveTV": "Live TV", + "ButtonCancelSyncJob": "Cancel sync job", "TitleSync": "Sync", + "HeaderSelectDate": "Select Date", "ButtonDonate": "Donate", "LabelRecurringDonationCanBeCancelledHelp": "Gmachti Spende ch\u00f6nt jederziit abbroche werde mithilf vo dim PayPal Account.", "HeaderMyMedia": "My Media", @@ -104,6 +106,7 @@ "TitlePlugins": "Plugins", "ButtonTakeTheTourToSeeWhatsNew": "Take the tour to see what's new", "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the web interface.", + "ButtonPlayTrailer": "Play trailer", "HeaderLibraryAccess": "Library Access", "HeaderChannelAccess": "Channel Access", "HeaderDeviceAccess": "Gr\u00e4t Zuegriff", @@ -144,7 +147,6 @@ "ButtonPlay": "Play", "ButtonEdit": "Edit", "ButtonQueue": "Queue", - "ButtonPlayTrailer": "Spell de Trailer", "ButtonPlaylist": "Playlist", "ButtonPreviousTrack": "Vorherigi Track", "LabelEnabled": "Enabled", @@ -263,6 +265,7 @@ "LabelPlayMethodTranscoding": "Transcoding", "LabelPlayMethodDirectStream": "Direct Streaming", "LabelPlayMethodDirectPlay": "Direct Playing", + "LabelEpisodeNumber": "Episode number:", "LabelAudioCodec": "Audio: {0}", "LabelVideoCodec": "Video: {0}", "LabelLocalAccessUrl": "Local access: {0}", @@ -308,6 +311,7 @@ "HeaderArtist": "Artist", "LabelAddedOnDate": "Added {0}", "ButtonStart": "Start", + "LabelSeasonNumber": "Season number:", "HeaderChannels": "Channels", "HeaderMediaFolders": "Media Folders", "HeaderBlockItemsWithNoRating": "Block content with no rating information:", @@ -336,6 +340,7 @@ "ButtonNextPage": "Next Page", "ButtonPreviousPage": "Previous Page", "ButtonMoveLeft": "Move left", + "OptionReleaseDate": "Release date", "ButtonMoveRight": "Move right", "ButtonBrowseOnlineImages": "Browse online images", "HeaderDeleteItem": "Delete Item", @@ -478,11 +483,8 @@ "PersonTypePerson": "Person", "LabelTitleDisplayOrder": "Title display order:", "OptionSortName": "Sort name", - "OptionReleaseDate": "Ver\u00f6ffentlichigs Datum", - "LabelSeasonNumber": "Season number:", "LabelDiscNumber": "Disc number", "LabelParentNumber": "Parent number", - "LabelEpisodeNumber": "Episode number:", "LabelTrackNumber": "Track number:", "LabelNumber": "Number:", "LabelReleaseDate": "Release date:", @@ -785,6 +787,7 @@ "HeaderMedia": "Media", "ButtonInbox": "Inbox", "HeaderAdvanced": "Advanced", + "HeaderGroupVersions": "Group Versions", "HeaderSaySomethingLike": "Say Something Like...", "ButtonTryAgain": "Try Again", "HeaderYouSaid": "You Said...", @@ -794,5 +797,13 @@ "ButtonManageServer": "Manage Server", "ButtonPreferences": "Preferences", "ButtonViewArtist": "View artist", - "ButtonViewAlbum": "View album" + "ButtonViewAlbum": "View album", + "ErrorMessagePasswordNotMatchConfirm": "The password and password confirmation must match.", + "ErrorMessageUsernameInUse": "The username is already in use. Please choose a new name and try again.", + "ErrorMessageEmailInUse": "The email address is already in use. Please enter a new email address and try again, or use the forgot password feature.", + "MessageThankYouForConnectSignUp": "Thank you for signing up for Emby Connect. An email will be sent to your address with instructions on how to confirm your new account. Please confirm the account and then return here to sign in.", + "HeaderShare": "Share", + "ButtonShareHelp": "Share a web page containing media information with social media. Media files are never shared publicly.", + "ButtonShare": "Share", + "HeaderConfirm": "Confirm" }
\ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/he.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/he.json index 15bd43561..8e1e90e56 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/he.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/he.json @@ -38,7 +38,9 @@ "HeaderSupportTheTeam": "Support the Emby Team", "TextEnjoyBonusFeatures": "Enjoy Bonus Features", "TitleLiveTV": "\u05d8\u05dc\u05d5\u05d5\u05d9\u05d6\u05d9\u05d4 \u05d7\u05d9\u05d9\u05d4", + "ButtonCancelSyncJob": "Cancel sync job", "TitleSync": "Sync", + "HeaderSelectDate": "Select Date", "ButtonDonate": "Donate", "LabelRecurringDonationCanBeCancelledHelp": "Recurring donations can be cancelled at any time from within your PayPal account.", "HeaderMyMedia": "My Media", @@ -104,6 +106,7 @@ "TitlePlugins": "Plugins", "ButtonTakeTheTourToSeeWhatsNew": "Take the tour to see what's new", "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the web interface.", + "ButtonPlayTrailer": "Play trailer", "HeaderLibraryAccess": "Library Access", "HeaderChannelAccess": "Channel Access", "HeaderDeviceAccess": "Device Access", @@ -144,7 +147,6 @@ "ButtonPlay": "\u05e0\u05d2\u05df", "ButtonEdit": "\u05e2\u05e8\u05d5\u05da", "ButtonQueue": "Queue", - "ButtonPlayTrailer": "Play trailer", "ButtonPlaylist": "Playlist", "ButtonPreviousTrack": "Previous Track", "LabelEnabled": "Enabled", @@ -263,6 +265,7 @@ "LabelPlayMethodTranscoding": "Transcoding", "LabelPlayMethodDirectStream": "Direct Streaming", "LabelPlayMethodDirectPlay": "Direct Playing", + "LabelEpisodeNumber": "Episode number:", "LabelAudioCodec": "Audio: {0}", "LabelVideoCodec": "Video: {0}", "LabelLocalAccessUrl": "Local access: {0}", @@ -308,6 +311,7 @@ "HeaderArtist": "Artist", "LabelAddedOnDate": "Added {0}", "ButtonStart": "Start", + "LabelSeasonNumber": "Season number:", "HeaderChannels": "\u05e2\u05e8\u05d5\u05e6\u05d9\u05dd", "HeaderMediaFolders": "\u05e1\u05e4\u05e8\u05d9\u05d5\u05ea \u05de\u05d3\u05d9\u05d4", "HeaderBlockItemsWithNoRating": "Block content with no rating information:", @@ -336,6 +340,7 @@ "ButtonNextPage": "Next Page", "ButtonPreviousPage": "Previous Page", "ButtonMoveLeft": "Move left", + "OptionReleaseDate": "Release date", "ButtonMoveRight": "Move right", "ButtonBrowseOnlineImages": "Browse online images", "HeaderDeleteItem": "Delete Item", @@ -478,11 +483,8 @@ "PersonTypePerson": "Person", "LabelTitleDisplayOrder": "Title display order:", "OptionSortName": "Sort name", - "OptionReleaseDate": "Release date", - "LabelSeasonNumber": "\u05de\u05e1\u05e4\u05e8 \u05e2\u05d5\u05e0\u05d4:", "LabelDiscNumber": "Disc number", "LabelParentNumber": "Parent number", - "LabelEpisodeNumber": "\u05de\u05e1\u05e4\u05e8 \u05e4\u05e8\u05e7:", "LabelTrackNumber": "Track number:", "LabelNumber": "Number:", "LabelReleaseDate": "Release date:", @@ -785,6 +787,7 @@ "HeaderMedia": "Media", "ButtonInbox": "Inbox", "HeaderAdvanced": "Advanced", + "HeaderGroupVersions": "Group Versions", "HeaderSaySomethingLike": "Say Something Like...", "ButtonTryAgain": "Try Again", "HeaderYouSaid": "You Said...", @@ -794,5 +797,13 @@ "ButtonManageServer": "Manage Server", "ButtonPreferences": "Preferences", "ButtonViewArtist": "View artist", - "ButtonViewAlbum": "View album" + "ButtonViewAlbum": "View album", + "ErrorMessagePasswordNotMatchConfirm": "The password and password confirmation must match.", + "ErrorMessageUsernameInUse": "The username is already in use. Please choose a new name and try again.", + "ErrorMessageEmailInUse": "The email address is already in use. Please enter a new email address and try again, or use the forgot password feature.", + "MessageThankYouForConnectSignUp": "Thank you for signing up for Emby Connect. An email will be sent to your address with instructions on how to confirm your new account. Please confirm the account and then return here to sign in.", + "HeaderShare": "Share", + "ButtonShareHelp": "Share a web page containing media information with social media. Media files are never shared publicly.", + "ButtonShare": "Share", + "HeaderConfirm": "Confirm" }
\ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/hr.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/hr.json index 87e5db216..69704fb2d 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/hr.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/hr.json @@ -38,7 +38,9 @@ "HeaderSupportTheTeam": "Support the Emby Team", "TextEnjoyBonusFeatures": "Enjoy Bonus Features", "TitleLiveTV": "TV", + "ButtonCancelSyncJob": "Cancel sync job", "TitleSync": "Sync", + "HeaderSelectDate": "Select Date", "ButtonDonate": "Donate", "LabelRecurringDonationCanBeCancelledHelp": "Recurring donations can be cancelled at any time from within your PayPal account.", "HeaderMyMedia": "My Media", @@ -104,6 +106,7 @@ "TitlePlugins": "Plugins", "ButtonTakeTheTourToSeeWhatsNew": "Take the tour to see what's new", "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the web interface.", + "ButtonPlayTrailer": "Play trailer", "HeaderLibraryAccess": "Library Access", "HeaderChannelAccess": "Channel Access", "HeaderDeviceAccess": "Device Access", @@ -144,7 +147,6 @@ "ButtonPlay": "Pokreni", "ButtonEdit": "Izmjeni", "ButtonQueue": "Queue", - "ButtonPlayTrailer": "Play trailer", "ButtonPlaylist": "Playlist", "ButtonPreviousTrack": "Prethodna traka", "LabelEnabled": "Enabled", @@ -263,6 +265,7 @@ "LabelPlayMethodTranscoding": "Transcoding", "LabelPlayMethodDirectStream": "Direct Streaming", "LabelPlayMethodDirectPlay": "Direct Playing", + "LabelEpisodeNumber": "Episode number:", "LabelAudioCodec": "Audio: {0}", "LabelVideoCodec": "Video: {0}", "LabelLocalAccessUrl": "Local access: {0}", @@ -308,6 +311,7 @@ "HeaderArtist": "Artist", "LabelAddedOnDate": "Added {0}", "ButtonStart": "Start", + "LabelSeasonNumber": "Season number:", "HeaderChannels": "Channels", "HeaderMediaFolders": "Medijska mapa", "HeaderBlockItemsWithNoRating": "Block content with no rating information:", @@ -336,6 +340,7 @@ "ButtonNextPage": "Next Page", "ButtonPreviousPage": "Previous Page", "ButtonMoveLeft": "Move left", + "OptionReleaseDate": "Release date", "ButtonMoveRight": "Move right", "ButtonBrowseOnlineImages": "Browse online images", "HeaderDeleteItem": "Delete Item", @@ -478,11 +483,8 @@ "PersonTypePerson": "Person", "LabelTitleDisplayOrder": "Title display order:", "OptionSortName": "Sort name", - "OptionReleaseDate": "Release date", - "LabelSeasonNumber": "Broj sezone:", "LabelDiscNumber": "Disc number", "LabelParentNumber": "Parent number", - "LabelEpisodeNumber": "Broj epizode:", "LabelTrackNumber": "Track number:", "LabelNumber": "Number:", "LabelReleaseDate": "Release date:", @@ -785,6 +787,7 @@ "HeaderMedia": "Media", "ButtonInbox": "Inbox", "HeaderAdvanced": "Advanced", + "HeaderGroupVersions": "Group Versions", "HeaderSaySomethingLike": "Say Something Like...", "ButtonTryAgain": "Try Again", "HeaderYouSaid": "You Said...", @@ -794,5 +797,13 @@ "ButtonManageServer": "Manage Server", "ButtonPreferences": "Preferences", "ButtonViewArtist": "View artist", - "ButtonViewAlbum": "View album" + "ButtonViewAlbum": "View album", + "ErrorMessagePasswordNotMatchConfirm": "The password and password confirmation must match.", + "ErrorMessageUsernameInUse": "The username is already in use. Please choose a new name and try again.", + "ErrorMessageEmailInUse": "The email address is already in use. Please enter a new email address and try again, or use the forgot password feature.", + "MessageThankYouForConnectSignUp": "Thank you for signing up for Emby Connect. An email will be sent to your address with instructions on how to confirm your new account. Please confirm the account and then return here to sign in.", + "HeaderShare": "Share", + "ButtonShareHelp": "Share a web page containing media information with social media. Media files are never shared publicly.", + "ButtonShare": "Share", + "HeaderConfirm": "Confirm" }
\ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/hu.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/hu.json index bb9c895fc..97fce04bc 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/hu.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/hu.json @@ -38,7 +38,9 @@ "HeaderSupportTheTeam": "Support the Emby Team", "TextEnjoyBonusFeatures": "Enjoy Bonus Features", "TitleLiveTV": "Live TV", + "ButtonCancelSyncJob": "Cancel sync job", "TitleSync": "Sync", + "HeaderSelectDate": "Select Date", "ButtonDonate": "Donate", "LabelRecurringDonationCanBeCancelledHelp": "Recurring donations can be cancelled at any time from within your PayPal account.", "HeaderMyMedia": "My Media", @@ -104,6 +106,7 @@ "TitlePlugins": "Plugins", "ButtonTakeTheTourToSeeWhatsNew": "Take the tour to see what's new", "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the web interface.", + "ButtonPlayTrailer": "Play trailer", "HeaderLibraryAccess": "Library Access", "HeaderChannelAccess": "Channel Access", "HeaderDeviceAccess": "Device Access", @@ -144,7 +147,6 @@ "ButtonPlay": "Play", "ButtonEdit": "Edit", "ButtonQueue": "Queue", - "ButtonPlayTrailer": "Play trailer", "ButtonPlaylist": "Playlist", "ButtonPreviousTrack": "Previous Track", "LabelEnabled": "Enabled", @@ -263,6 +265,7 @@ "LabelPlayMethodTranscoding": "Transcoding", "LabelPlayMethodDirectStream": "Direct Streaming", "LabelPlayMethodDirectPlay": "Direct Playing", + "LabelEpisodeNumber": "Episode number:", "LabelAudioCodec": "Audio: {0}", "LabelVideoCodec": "Video: {0}", "LabelLocalAccessUrl": "Local access: {0}", @@ -308,6 +311,7 @@ "HeaderArtist": "Artist", "LabelAddedOnDate": "Added {0}", "ButtonStart": "Start", + "LabelSeasonNumber": "Season number:", "HeaderChannels": "Channels", "HeaderMediaFolders": "Media Folders", "HeaderBlockItemsWithNoRating": "Block content with no rating information:", @@ -336,6 +340,7 @@ "ButtonNextPage": "Next Page", "ButtonPreviousPage": "Previous Page", "ButtonMoveLeft": "Move left", + "OptionReleaseDate": "Release date", "ButtonMoveRight": "Move right", "ButtonBrowseOnlineImages": "Browse online images", "HeaderDeleteItem": "Delete Item", @@ -478,11 +483,8 @@ "PersonTypePerson": "Person", "LabelTitleDisplayOrder": "Title display order:", "OptionSortName": "Sort name", - "OptionReleaseDate": "Release date", - "LabelSeasonNumber": "Season number:", "LabelDiscNumber": "Disc number", "LabelParentNumber": "Parent number", - "LabelEpisodeNumber": "Episode number:", "LabelTrackNumber": "Track number:", "LabelNumber": "Number:", "LabelReleaseDate": "Release date:", @@ -785,6 +787,7 @@ "HeaderMedia": "Media", "ButtonInbox": "Inbox", "HeaderAdvanced": "Advanced", + "HeaderGroupVersions": "Group Versions", "HeaderSaySomethingLike": "Say Something Like...", "ButtonTryAgain": "Try Again", "HeaderYouSaid": "You Said...", @@ -794,5 +797,13 @@ "ButtonManageServer": "Manage Server", "ButtonPreferences": "Preferences", "ButtonViewArtist": "View artist", - "ButtonViewAlbum": "View album" + "ButtonViewAlbum": "View album", + "ErrorMessagePasswordNotMatchConfirm": "The password and password confirmation must match.", + "ErrorMessageUsernameInUse": "The username is already in use. Please choose a new name and try again.", + "ErrorMessageEmailInUse": "The email address is already in use. Please enter a new email address and try again, or use the forgot password feature.", + "MessageThankYouForConnectSignUp": "Thank you for signing up for Emby Connect. An email will be sent to your address with instructions on how to confirm your new account. Please confirm the account and then return here to sign in.", + "HeaderShare": "Share", + "ButtonShareHelp": "Share a web page containing media information with social media. Media files are never shared publicly.", + "ButtonShare": "Share", + "HeaderConfirm": "Confirm" }
\ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/it.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/it.json index dc625b7b5..ff4bdb0a0 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/it.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/it.json @@ -38,7 +38,9 @@ "HeaderSupportTheTeam": "Supporta il Team di Emby", "TextEnjoyBonusFeatures": "Goditi le caratteristiche aggiuntive", "TitleLiveTV": "Tv in diretta", + "ButtonCancelSyncJob": "Cancel sync job", "TitleSync": "Sincronizza", + "HeaderSelectDate": "Seleziona la data", "ButtonDonate": "Donazione", "LabelRecurringDonationCanBeCancelledHelp": "Donazioni ricorrenti possono essere cancellati in qualsiasi momento dal tuo conto PayPal.", "HeaderMyMedia": "I mei media", @@ -104,6 +106,7 @@ "TitlePlugins": "Plugin", "ButtonTakeTheTourToSeeWhatsNew": "Fai un tour per vedere cosa \u00e8 cambiato", "MessageNoSyncJobsFound": "Nessuna sincronizzazione pianificata. Creane una utilizzando i pulsanti sull'interfaccia web", + "ButtonPlayTrailer": "Visualizza Trailer", "HeaderLibraryAccess": "Accesso libreria", "HeaderChannelAccess": "Accesso canali", "HeaderDeviceAccess": "Accesso al dispositivo", @@ -144,7 +147,6 @@ "ButtonPlay": "Riproduci", "ButtonEdit": "Modifica", "ButtonQueue": "In coda", - "ButtonPlayTrailer": "Riproduci trailer", "ButtonPlaylist": "Playlist", "ButtonPreviousTrack": "Traccia Precedente", "LabelEnabled": "Abilitato", @@ -263,6 +265,7 @@ "LabelPlayMethodTranscoding": "Trascodifica", "LabelPlayMethodDirectStream": "Streaming Diretto", "LabelPlayMethodDirectPlay": "Riproduzione Diretta", + "LabelEpisodeNumber": "Episode number:", "LabelAudioCodec": "Audio: {0}", "LabelVideoCodec": "Video: {0}", "LabelLocalAccessUrl": "Accesso locale {0}", @@ -308,6 +311,7 @@ "HeaderArtist": "Artista", "LabelAddedOnDate": "Aggiunto {0}", "ButtonStart": "Avvio", + "LabelSeasonNumber": "Season number:", "HeaderChannels": "Canali", "HeaderMediaFolders": "Cartelle dei media", "HeaderBlockItemsWithNoRating": "Bloccare i contenuti senza informazioni valutazione:", @@ -336,6 +340,7 @@ "ButtonNextPage": "Prossima pagina", "ButtonPreviousPage": "Pagina precedente", "ButtonMoveLeft": "Muovi a sinistra", + "OptionReleaseDate": "data di rilascio", "ButtonMoveRight": "Muovi a destra", "ButtonBrowseOnlineImages": "Sfoglia le immagini Online", "HeaderDeleteItem": "Elimina elemento", @@ -478,11 +483,8 @@ "PersonTypePerson": "Persona", "LabelTitleDisplayOrder": "Titolo mostrato in ordine:", "OptionSortName": "Nome ordinato", - "OptionReleaseDate": "Data di rilascio", - "LabelSeasonNumber": "Numero Stagione:", "LabelDiscNumber": "Disco numero", "LabelParentNumber": "Numero superiore", - "LabelEpisodeNumber": "Numero Episodio :", "LabelTrackNumber": "Traccia numero:", "LabelNumber": "Numero:", "LabelReleaseDate": "Data di rilascio:", @@ -713,7 +715,7 @@ "MessageInvitationSentToNewUser": "Un'email \u00e8 stata inviata a {0} invitandolo a registrarsi a Emby", "HeaderConnectionFailure": "Errore di connessione", "MessageUnableToConnectToServer": "Non siamo in grado di connettersi al server selezionato al momento. Per favore assicurati che sia in esecuzione e riprova.", - "ButtonSelectServer": "Selezionare il server", + "ButtonSelectServer": "Select Server", "MessagePluginConfigurationRequiresLocalAccess": "Per configurare questo plugin si prega di accedere al proprio server locale direttamente.", "MessageLoggedOutParentalControl": "L'accesso \u00e8 attualmente limitato. Si prega di riprovare pi\u00f9 tardi.", "DefaultErrorMessage": "Si \u00e8 verificato un errore durante l'elaborazione della richiesta. Si prega di riprovare pi\u00f9 tardi.", @@ -741,7 +743,7 @@ "LabelQuality": "Qualit\u00e0:", "HeaderSettings": "Configurazione", "OptionAutomaticallySyncNewContent": "Sincronizza automaticamente nuovi contenuti", - "OptionAutomaticallySyncNewContentHelp": "Nuovi contenuti aggiunti a questa categoria viene sincronizzata automaticamente al dispositivo.", + "OptionAutomaticallySyncNewContentHelp": "New content added to will be automatically synced to the device.", "OptionSyncUnwatchedVideosOnly": "Sincronizza solo i video non visti", "OptionSyncUnwatchedVideosOnlyHelp": "Solo i video non visti saranno sincronizzati, e video saranno rimossi dal dispositivo in cui sono guardato.", "LabelItemLimit": "limite elementi:", @@ -785,6 +787,7 @@ "HeaderMedia": "Media", "ButtonInbox": "Inbox", "HeaderAdvanced": "Avanzato", + "HeaderGroupVersions": "Group Versions", "HeaderSaySomethingLike": "Say Something Like...", "ButtonTryAgain": "Try Again", "HeaderYouSaid": "You Said...", @@ -794,5 +797,13 @@ "ButtonManageServer": "Manage Server", "ButtonPreferences": "Preferences", "ButtonViewArtist": "View artist", - "ButtonViewAlbum": "View album" + "ButtonViewAlbum": "View album", + "ErrorMessagePasswordNotMatchConfirm": "The password and password confirmation must match.", + "ErrorMessageUsernameInUse": "The username is already in use. Please choose a new name and try again.", + "ErrorMessageEmailInUse": "The email address is already in use. Please enter a new email address and try again, or use the forgot password feature.", + "MessageThankYouForConnectSignUp": "Thank you for signing up for Emby Connect. An email will be sent to your address with instructions on how to confirm your new account. Please confirm the account and then return here to sign in.", + "HeaderShare": "Share", + "ButtonShareHelp": "Share a web page containing media information with social media. Media files are never shared publicly.", + "ButtonShare": "Share", + "HeaderConfirm": "Confirm" }
\ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/javascript.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/javascript.json index 48d3296e5..b82bd29a7 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/javascript.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/javascript.json @@ -38,7 +38,9 @@ "HeaderSupportTheTeam": "Support the Emby Team", "TextEnjoyBonusFeatures": "Enjoy Bonus Features", "TitleLiveTV": "Live TV", + "ButtonCancelSyncJob": "Cancel sync job", "TitleSync": "Sync", + "HeaderSelectDate": "Select Date", "ButtonDonate": "Donate", "LabelRecurringDonationCanBeCancelledHelp": "Recurring donations can be cancelled at any time from within your PayPal account.", "HeaderMyMedia": "My Media", @@ -795,6 +797,7 @@ "HeaderMedia": "Media", "ButtonInbox": "Inbox", "HeaderAdvanced": "Advanced", + "HeaderGroupVersions": "Group Versions", "HeaderSaySomethingLike": "Say Something Like...", "ButtonTryAgain": "Try Again", "HeaderYouSaid": "You Said...", @@ -808,5 +811,9 @@ "ErrorMessagePasswordNotMatchConfirm": "The password and password confirmation must match.", "ErrorMessageUsernameInUse": "The username is already in use. Please choose a new name and try again.", "ErrorMessageEmailInUse": "The email address is already in use. Please enter a new email address and try again, or use the forgot password feature.", - "MessageThankYouForConnectSignUp": "Thank you for signing up for Emby Connect. An email will be sent to your address with instructions on how to confirm your new account. Please confirm the account and then return here to sign in." + "MessageThankYouForConnectSignUp": "Thank you for signing up for Emby Connect. An email will be sent to your address with instructions on how to confirm your new account. Please confirm the account and then return here to sign in.", + "HeaderShare": "Share", + "ButtonShareHelp": "Share a web page containing media information with social media. Media files are never shared publicly.", + "ButtonShare": "Share", + "HeaderConfirm": "Confirm" } diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/kk.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/kk.json index c24b1ce43..b3b36ebf3 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/kk.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/kk.json @@ -38,7 +38,9 @@ "HeaderSupportTheTeam": "Emby \u0442\u043e\u0431\u044b\u043d \u049b\u043e\u043b\u0434\u0430\u04a3\u044b\u0437", "TextEnjoyBonusFeatures": "\u0421\u044b\u0439\u0430\u049b\u044b \u0435\u0440\u0435\u043a\u0448\u0435\u043b\u0456\u043a\u0442\u0435\u0440\u0434\u0456 \u0442\u0430\u043c\u0430\u0448\u0430\u043b\u0430\u043d\u044b\u04a3\u044b\u0437", "TitleLiveTV": "\u042d\u0444\u0438\u0440\u043b\u0456\u043a \u0422\u0414", + "ButtonCancelSyncJob": "\u04ae\u043d\u0434\u0435\u0441\u0442\u0456\u0440\u0443\u0434\u0456 \u0431\u043e\u043b\u0434\u044b\u0440\u043c\u0430\u0443", "TitleSync": "\u04ae\u043d\u0434\u0435\u0441\u0442\u0456\u0440\u0443", + "HeaderSelectDate": "\u041a\u04af\u043d\u0434\u0456 \u0442\u0430\u04a3\u0434\u0430\u0443", "ButtonDonate": "\u049a\u0430\u0439\u044b\u0440\u043c\u0430\u043b\u0430\u0443", "LabelRecurringDonationCanBeCancelledHelp": "\u049a\u0430\u0439\u0442\u0430\u043b\u0430\u043c\u0430 \u049b\u0430\u0439\u044b\u0440\u043c\u0430\u043b\u0434\u044b\u049b\u0442\u0430\u0440 PayPal \u0435\u0441\u0435\u043f \u0448\u043e\u0442\u044b \u0430\u0440\u049b\u044b\u043b\u044b \u04d9\u0440 \u0443\u0430\u049b\u044b\u0442\u0442\u0430 \u0434\u0430 \u0431\u043e\u043b\u0434\u044b\u0440\u044b\u043b\u043c\u0430\u0443\u044b \u043c\u04af\u043c\u043a\u0456\u043d.", "HeaderMyMedia": "\u041c\u0435\u043d\u0456\u04a3 \u0442\u0430\u0441\u044b\u0493\u044b\u0448\u0434\u0435\u0440\u0435\u043a\u0442\u0435\u0440\u0456\u043c", @@ -104,6 +106,7 @@ "TitlePlugins": "\u041f\u043b\u0430\u0433\u0438\u043d\u0434\u0435\u0440", "ButtonTakeTheTourToSeeWhatsNew": "\u0411\u043e\u043b\u0493\u0430\u043d \u0436\u0430\u04a3\u0430\u043b\u044b\u049b\u0442\u0430\u0440\u043c\u0435\u043d \u0442\u0430\u043d\u044b\u0441\u0443", "MessageNoSyncJobsFound": "\u04ae\u043d\u0434\u0435\u0441\u0442\u0456\u0440\u0443 \u0436\u04b1\u043c\u044b\u0441\u044b \u0442\u0430\u0431\u044b\u043b\u043c\u0430\u0434\u044b. \u0412\u0435\u0431-\u0442\u0456\u043b\u0434\u0435\u0441\u0443\u0434\u0435 \u0442\u0430\u0431\u044b\u043b\u0430\u0442\u044b\u043d \u04ae\u043d\u0434\u0435\u0441\u0442\u0456\u0440\u0443 \u0442\u04af\u0439\u043c\u0435\u0448\u0456\u043a\u0442\u0435\u0440\u0456\u043d \u043f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u044b\u043f \u04af\u043d\u0434\u0435\u0441\u0442\u0456\u0440\u0443 \u0436\u04b1\u043c\u044b\u0441\u0442\u0430\u0440\u044b\u043d \u0436\u0430\u0441\u0430\u04a3\u044b\u0437.", + "ButtonPlayTrailer": "\u0422\u0440\u0435\u0439\u043b\u0435\u0440\u0434\u0456 \u043e\u0439\u043d\u0430\u0442\u0443", "HeaderLibraryAccess": "\u0422\u0430\u0441\u044b\u0493\u044b\u0448\u0445\u0430\u043d\u0430\u0493\u0430 \u049b\u0430\u0442\u044b\u043d\u0430\u0443", "HeaderChannelAccess": "\u0410\u0440\u043d\u0430\u0493\u0430 \u049b\u0430\u0442\u044b\u043d\u0430\u0443", "HeaderDeviceAccess": "\u049a\u04b1\u0440\u044b\u043b\u0493\u044b\u0493\u0430 \u049b\u0430\u0442\u044b\u043d\u0430\u0443", @@ -144,7 +147,6 @@ "ButtonPlay": "\u041e\u0439\u043d\u0430\u0442\u0443", "ButtonEdit": "\u04e8\u04a3\u0434\u0435\u0443", "ButtonQueue": "\u041a\u0435\u0437\u0435\u043a\u043a\u0435", - "ButtonPlayTrailer": "\u0422\u0440\u0435\u0439\u043b\u0435\u0440\u0434\u0456 \u043e\u0439\u043d\u0430\u0442\u0443", "ButtonPlaylist": "\u041e\u0439\u043d\u0430\u0442\u0443 \u0442\u0456\u0437\u0456\u043c\u0456", "ButtonPreviousTrack": "\u0410\u043b\u0434\u044b\u04a3\u0493\u044b \u0436\u043e\u043b\u0448\u044b\u049b\u049b\u0430", "LabelEnabled": "\u049a\u043e\u0441\u044b\u043b\u0493\u0430\u043d", @@ -263,6 +265,7 @@ "LabelPlayMethodTranscoding": "\u049a\u0430\u0439\u0442\u0430 \u043a\u043e\u0434\u0442\u0430\u0443\u0434\u0430", "LabelPlayMethodDirectStream": "\u0422\u0456\u043a\u0435\u043b\u0435\u0439 \u0430\u0493\u044b\u043d\u043c\u0435\u043d \u0442\u0430\u0441\u044b\u043c\u0430\u043b\u0434\u0430\u0443\u0434\u0430", "LabelPlayMethodDirectPlay": "\u0422\u0456\u043a\u0435\u043b\u0435\u0439 \u043e\u0439\u043d\u0430\u0442\u0443\u0434\u0430", + "LabelEpisodeNumber": "\u042d\u043f\u0438\u0437\u043e\u0434 \u043d\u04e9\u043c\u0456\u0440\u0456:", "LabelAudioCodec": "\u0414\u044b\u0431\u044b\u0441: {0}", "LabelVideoCodec": "\u0411\u0435\u0439\u043d\u0435: {0}", "LabelLocalAccessUrl": "\u0416\u0435\u0440\u0433\u0456\u043b\u0456\u043a\u0442\u0456 \u049b\u0430\u0442\u044b\u043d\u0430\u0443: {0}", @@ -308,6 +311,7 @@ "HeaderArtist": "\u041e\u0440\u044b\u043d\u0434\u0430\u0443\u0448\u044b", "LabelAddedOnDate": "\u04ae\u0441\u0442\u0435\u043b\u0433\u0435\u043d\u0456 {0}", "ButtonStart": "\u0411\u0430\u0441\u0442\u0430\u0443", + "LabelSeasonNumber": "\u041c\u0430\u0443\u0441\u044b\u043c \u043d\u04e9\u043c\u0456\u0440\u0456:", "HeaderChannels": "\u0410\u0440\u043d\u0430\u043b\u0430\u0440", "HeaderMediaFolders": "\u0422\u0430\u0441\u044b\u0493\u044b\u0448 \u049b\u0430\u043b\u0442\u0430\u043b\u0430\u0440\u044b", "HeaderBlockItemsWithNoRating": "\u0416\u0430\u0441\u0442\u044b\u049b \u0441\u0430\u043d\u0430\u0442\u044b \u0436\u043e\u049b \u043c\u0430\u0437\u04b1\u043d\u0434\u044b \u049b\u04b1\u0440\u0441\u0430\u0443\u043b\u0430\u0443:", @@ -336,6 +340,7 @@ "ButtonNextPage": "\u041a\u0435\u043b\u0435\u0441\u0456 \u0431\u0435\u0442\u043a\u0435", "ButtonPreviousPage": "\u0410\u043b\u0434\u044b\u043d\u0493\u044b \u0431\u0435\u0442\u043a\u0435", "ButtonMoveLeft": "\u0421\u043e\u043b\u0493\u0430 \u0436\u044b\u043b\u0436\u044b\u0442\u0443", + "OptionReleaseDate": "\u0428\u044b\u0493\u0430\u0440\u0443 \u043a\u04af\u043d\u0456", "ButtonMoveRight": "\u041e\u04a3\u0493\u0430 \u0436\u044b\u043b\u0436\u044b\u0442\u0443", "ButtonBrowseOnlineImages": "\u0416\u0435\u043b\u0456\u0434\u0435\u0433\u0456 \u0441\u0443\u0440\u0435\u0442\u0442\u0435\u0440\u0434\u0456 \u0448\u043e\u043b\u0443", "HeaderDeleteItem": "\u0422\u0430\u0440\u043c\u0430\u049b\u0442\u044b \u0436\u043e\u044e", @@ -478,11 +483,8 @@ "PersonTypePerson": "\u0422\u04b1\u043b\u0493\u0430", "LabelTitleDisplayOrder": "\u0422\u0443\u044b\u043d\u0434\u044b \u0431\u0435\u0439\u043d\u0435\u043b\u0435\u0443 \u0440\u0435\u0442\u0456:", "OptionSortName": "\u0421\u04b1\u0440\u044b\u043f\u0442\u0430\u043b\u0430\u0442\u044b\u043d \u0430\u0442\u044b", - "OptionReleaseDate": "\u0428\u044b\u0493\u0430\u0440\u0443 \u043a\u04af\u043d\u0456", - "LabelSeasonNumber": "\u041c\u0430\u0443\u0441\u044b\u043c \u043d\u04e9\u043c\u0456\u0440\u0456:", "LabelDiscNumber": "\u0414\u0438\u0441\u043a\u0456 \u043d\u04e9\u043c\u0456\u0440\u0456", "LabelParentNumber": "\u0422\u0435\u043a\u0442\u0456\u043a \u043d\u04e9\u043c\u0456\u0440:", - "LabelEpisodeNumber": "\u0411\u04e9\u043b\u0456\u043c \u043d\u04e9\u043c\u0456\u0440\u0456:", "LabelTrackNumber": "\u0416\u043e\u043b\u0448\u044b\u049b \u043d\u04e9\u043c\u0456\u0440\u0456:", "LabelNumber": "\u041d\u04e9\u043c\u0456\u0440\u0456:", "LabelReleaseDate": "\u0428\u044b\u0493\u0430\u0440\u0443 \u043a\u04af\u043d\u0456:", @@ -776,7 +778,7 @@ "ButtonUnlockWithSupporter": "Emby \u0436\u0430\u049b\u0442\u0430\u0443\u0448\u044b \u043c\u04af\u0448\u0435\u043b\u0456\u0433\u0456\u043c\u0435\u043d \u043a\u0456\u0440\u0443", "MessagePleaseSignInLocalNetwork": "\u041e\u0440\u044b\u043d\u0434\u0430\u043c\u0430\u0441 \u0431\u04b1\u0440\u044b\u043d, \u0436\u0435\u0440\u0433\u0456\u043b\u0456\u043a\u0442\u0456 \u0436\u0435\u043b\u0456\u0433\u0435 Wifi \u043d\u0435\u043c\u0435\u0441\u0435 LAN \u0431\u0430\u0439\u043b\u0430\u043d\u044b\u0441\u044b\u043d \u043f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u044b\u043f \u049b\u043e\u0441\u044b\u043b\u0493\u0430\u043d\u044b\u04a3\u044b\u0437\u0434\u044b \u049b\u0430\u043c\u0442\u0430\u043c\u0430\u0441\u044b\u0437 \u0435\u0442\u0456\u04a3\u0456\u0437.", "ButtonUnlockWithPurchase": "\u0421\u0430\u0442\u044b\u043f \u0430\u043b\u0443\u043c\u0435\u043d \u049b\u04b1\u0440\u0441\u0430\u0443\u0434\u0430\u043d \u0431\u043e\u0441\u0430\u0442\u0443", - "ButtonUnlockPrice": "Unlock {0}", + "ButtonUnlockPrice": "{0} \u049b\u04b1\u043b\u044b\u043f\u0442\u0430\u043c\u0430\u0443", "MessageLiveTvGuideRequiresUnlock": "\u042d\u0444\u0438\u0440\u043b\u0456\u043a \u0422\u0414 \u0430\u043d\u044b\u049b\u0442\u0430\u0493\u044b\u0448\u044b \u049b\u0430\u0437\u0456\u0440\u0433\u0456 \u0443\u0430\u049b\u044b\u0442\u0442\u0430 {0} \u0430\u0440\u043d\u0430\u043b\u0430\u0440 \u0448\u0435\u043a\u0442\u0435\u043b\u0435\u0434\u0456. \u0422\u043e\u043b\u044b\u049b \u0442\u04d9\u0436\u0440\u0438\u0431\u0435\u0441\u0456\u043d \u04af\u0439\u0440\u0435\u043d\u0443 \u04af\u0448\u0456\u043d \u049a\u04b1\u0440\u0441\u0430\u0443\u044b\u043d \u0431\u043e\u0441\u0430\u0442\u0443 \u0442\u04af\u0439\u043c\u0435\u0448\u0456\u0433\u0456\u043d \u0431\u0430\u0441\u044b\u04a3\u044b\u0437.", "OptionEnableFullscreen": "\u0422\u043e\u043b\u044b\u049b \u044d\u043a\u0440\u0430\u043d\u0434\u044b \u049b\u043e\u0441\u0443", "ButtonServer": "\u0421\u0435\u0440\u0432\u0435\u0440", @@ -785,14 +787,23 @@ "HeaderMedia": "\u0422\u0430\u0441\u044b\u0493\u044b\u0448\u0434\u0435\u0440\u0435\u043a\u0442\u0435\u0440", "ButtonInbox": "\u041a\u0456\u0440\u0435\u0441\u0456\u043d", "HeaderAdvanced": "\u041a\u0435\u04a3\u0435\u0439\u0442\u0456\u043b\u0433\u0435\u043d", - "HeaderSaySomethingLike": "Say Something Like...", - "ButtonTryAgain": "Try Again", - "HeaderYouSaid": "You Said...", - "MessageWeDidntRecognizeCommand": "We're sorry, we didn't recognize that command.", - "MessageIfYouBlockedVoice": "If you denied voice access to the app you'll need to reconfigure before trying again.", - "MessageNoItemsFound": "No items found.", - "ButtonManageServer": "Manage Server", - "ButtonPreferences": "Preferences", - "ButtonViewArtist": "View artist", - "ButtonViewAlbum": "View album" + "HeaderGroupVersions": "\u041d\u04b1\u0441\u049b\u0430\u043b\u0430\u0440\u0434\u044b \u0442\u043e\u043f\u0442\u0430\u0441\u0442\u044b\u0440\u0443", + "HeaderSaySomethingLike": "\u041e\u0441\u044b\u043d\u0434\u0430\u0439 \u0441\u0438\u044f\u049b\u0442\u044b\u043d\u044b \u0430\u0439\u0442\u044b\u04a3\u044b\u0437...", + "ButtonTryAgain": "\u04d8\u0440\u0435\u043a\u0435\u0442\u0442\u0456 \u049b\u0430\u0439\u0442\u0430\u043b\u0430\u0443", + "HeaderYouSaid": "\u0421\u0456\u0437 \u0430\u0439\u0442\u049b\u0430\u043d\u044b\u04a3\u044b\u0437...", + "MessageWeDidntRecognizeCommand": "\u041e\u0441\u044b\u043d\u0434\u0430\u0439 \u043f\u04d9\u0440\u043c\u0435\u043d\u0434\u0456 \u0442\u0430\u043d\u044b\u043f \u0430\u0439\u044b\u0440\u043c\u0430\u0434\u044b\u049b.", + "MessageIfYouBlockedVoice": "\u0415\u0433\u0435\u0440 \u049b\u043e\u043b\u0434\u0430\u043d\u0431\u0430\u0493\u0430 \u0434\u0430\u0443\u044b\u0441\u0442\u044b\u049b \u049b\u0430\u0442\u044b\u043d\u0430\u0443\u0434\u0430\u043d \u0431\u0430\u0441 \u0442\u0430\u0440\u0442\u0441\u0430\u04a3\u044b\u0437, \u049b\u0430\u0439\u0442\u0430 \u04d9\u0440\u0435\u043a\u0435\u0442\u0442\u0435\u043d\u0443\u0456\u04a3\u0456\u0437\u0434\u0435\u043d \u0430\u043b\u0434\u044b\u043d\u0430\u043d \u049b\u0430\u0439\u0442\u0430 \u0442\u0435\u04a3\u0448\u0435\u0443\u0456\u04a3\u0456\u0437 \u049b\u0430\u0436\u0435\u0442 \u0431\u043e\u043b\u0430\u0434\u044b.", + "MessageNoItemsFound": "\u0415\u0448\u049b\u0430\u043d\u0434\u0430\u0439 \u0442\u0430\u0440\u043c\u0430\u049b\u0442\u0430\u0440 \u0442\u0430\u0431\u044b\u043b\u043c\u0430\u0434\u044b.", + "ButtonManageServer": "\u0421\u0435\u0440\u0432\u0435\u0440\u0434\u0456 \u0431\u0430\u0441\u049b\u0430\u0440\u0443", + "ButtonPreferences": "\u0422\u0435\u04a3\u0448\u0435\u043b\u0456\u043c\u0434\u0435\u0440", + "ButtonViewArtist": "\u041e\u0440\u044b\u043d\u0434\u0430\u0443\u0448\u044b\u043d\u044b \u049b\u0430\u0440\u0430\u0443", + "ButtonViewAlbum": "\u0410\u043b\u044c\u0431\u043e\u043c\u0434\u044b \u049b\u0430\u0440\u0430\u0443", + "ErrorMessagePasswordNotMatchConfirm": "\u049a\u04b1\u043f\u0438\u044f \u0441\u04e9\u0437 \u0431\u0435\u043d \u049a\u04b1\u043f\u0438\u044f \u0441\u04e9\u0437 \u0440\u0430\u0441\u0442\u0430\u0443 \u04e9\u0440\u0456\u0441\u0442\u0435\u0440\u0456 \u0441\u04d9\u0439\u043a\u0435\u0441 \u0431\u043e\u043b\u0443\u044b \u049b\u0430\u0436\u0435\u0442.", + "ErrorMessageUsernameInUse": "\u041f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0448\u044b \u0430\u0442\u044b \u04d9\u043b\u0434\u0435\u049b\u0430\u0448\u0430\u043d \u043f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u044b\u043b\u0443\u0434\u0430. \u0416\u0430\u04a3\u0430 \u0430\u0442\u044b\u043d \u0442\u0430\u04a3\u0434\u0430\u04a3\u044b\u0437 \u0434\u0430 \u04d9\u0440\u0435\u043a\u0435\u0442\u0442\u0456 \u049b\u0430\u0439\u0442\u0430\u043b\u0430\u04a3\u044b\u0437.", + "ErrorMessageEmailInUse": "\u042d-\u043f\u043e\u0448\u0442\u0430 \u043c\u0435\u043a\u0435\u043d\u0436\u0430\u0439\u044b \u04d9\u043b\u0434\u0435\u049b\u0430\u0448\u0430\u043d \u043f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u044b\u043b\u0443\u0434\u0430. \u0416\u0430\u04a3\u0430 \u042d-\u043f\u043e\u0448\u0442\u0430 \u043c\u0435\u043a\u0435\u043d\u0436\u0430\u0439\u044b\u043d \u0442\u0430\u04a3\u0434\u0430\u04a3\u044b\u0437 \u0434\u0430 \u04d9\u0440\u0435\u043a\u0435\u0442\u0442\u0456 \u049b\u0430\u0439\u0442\u0430\u043b\u0430\u04a3\u044b\u0437, \u043d\u0435\u043c\u0435\u0441\u0435 \u049a\u04b1\u043f\u0438\u044f \u0441\u04e9\u0437\u0434\u0456 \u0435\u0441\u043a\u0435 \u0441\u0430\u043b\u0443 \u043c\u04af\u043c\u043a\u0456\u043d\u0434\u0456\u0433\u0456\u043d \u043f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u044b\u04a3\u044b\u0437.", + "MessageThankYouForConnectSignUp": "Emby Connect \u04af\u0448\u0456\u043d \u0442\u0456\u0440\u043a\u0435\u043b\u0433\u0435\u043d\u0433\u0435 \u0430\u043b\u0493\u044b\u0441. \u041c\u0435\u043a\u0435\u043d\u0436\u0430\u0439\u044b\u04a3\u044b\u0437\u0493\u0430 \u0436\u0456\u0431\u0435\u0440\u0456\u043b\u0435\u0442\u0456\u043d \u042d-\u043f\u043e\u0448\u0442\u0430 \u0445\u0430\u0431\u0430\u0440\u044b\u043d\u0434\u0430 \u0436\u0430\u04a3\u0430 \u0442\u0456\u0440\u043a\u0435\u043b\u0433\u0456\u04a3\u0456\u0437\u0434\u0456 \u049b\u0430\u043b\u0430\u0439 \u0440\u0430\u0441\u0442\u0430\u0443 \u0442\u0443\u0440\u0430\u043b\u044b \u043d\u04b1\u0441\u049b\u0430\u0443\u043b\u0430\u0440 \u0431\u043e\u043b\u0430\u0434\u044b. \u041a\u0456\u0440\u0443 \u04af\u0448\u0456\u043d \u0442\u0456\u0440\u043a\u0435\u043b\u0433\u0456\u043d\u0456 \u0440\u0430\u0441\u0442\u0430\u04a3\u044b\u0437 \u0436\u04d9\u043d\u0435 \u043a\u0435\u0439\u0456\u043d \u043e\u0441\u044b\u043d\u0434\u0430 \u049b\u0430\u0439\u0442\u0430 \u043e\u0440\u0430\u043b\u044b\u04a3\u044b\u0437.", + "HeaderShare": "\u041e\u0440\u0442\u0430\u049b\u0442\u0430\u0441\u0443", + "ButtonShareHelp": "\u04d8\u043b\u0435\u0443\u043c\u0435\u0442\u0442\u0456\u043a \u0436\u0435\u043b\u0456\u043b\u0435\u0440\u0456\u043c\u0435\u043d \u0442\u0430\u0441\u044b\u0493\u044b\u0448 \u0442\u0443\u0440\u0430\u043b\u044b \u0430\u049b\u043f\u0430\u0440\u0430\u0442\u0442\u044b \u049b\u0430\u043c\u0442\u0438\u0442\u044b\u043d \u0432\u0435\u0431-\u0431\u0435\u0442\u0456\u043c\u0435\u043d \u043e\u0440\u0442\u0430\u049b\u0442\u0430\u0441\u0443. \u0422\u0430\u0441\u044b\u0493\u044b\u0448 \u0444\u0430\u0439\u043b\u0434\u0430\u0440\u044b \u0435\u0448\u049b\u0430\u0448\u0430\u043d \u043e\u0440\u0442\u0430\u049b \u0436\u0430\u0440\u0438\u044f\u043b\u0430\u043d\u0431\u0430\u0439\u0434\u044b.", + "ButtonShare": "\u041e\u0440\u0442\u0430\u049b\u0442\u0430\u0441\u0443", + "HeaderConfirm": "\u0420\u0430\u0441\u0442\u0430\u0443" }
\ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/ms.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/ms.json index cfef85ba4..4ca416c2c 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/ms.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/ms.json @@ -38,7 +38,9 @@ "HeaderSupportTheTeam": "Support the Emby Team", "TextEnjoyBonusFeatures": "Enjoy Bonus Features", "TitleLiveTV": "Live TV", + "ButtonCancelSyncJob": "Cancel sync job", "TitleSync": "Sync", + "HeaderSelectDate": "Select Date", "ButtonDonate": "Donate", "LabelRecurringDonationCanBeCancelledHelp": "Recurring donations can be cancelled at any time from within your PayPal account.", "HeaderMyMedia": "My Media", @@ -104,6 +106,7 @@ "TitlePlugins": "Plugins", "ButtonTakeTheTourToSeeWhatsNew": "Take the tour to see what's new", "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the web interface.", + "ButtonPlayTrailer": "Play trailer", "HeaderLibraryAccess": "Library Access", "HeaderChannelAccess": "Channel Access", "HeaderDeviceAccess": "Device Access", @@ -144,7 +147,6 @@ "ButtonPlay": "Play", "ButtonEdit": "Edit", "ButtonQueue": "Queue", - "ButtonPlayTrailer": "Play trailer", "ButtonPlaylist": "Playlist", "ButtonPreviousTrack": "Previous Track", "LabelEnabled": "Enabled", @@ -263,6 +265,7 @@ "LabelPlayMethodTranscoding": "Transcoding", "LabelPlayMethodDirectStream": "Direct Streaming", "LabelPlayMethodDirectPlay": "Direct Playing", + "LabelEpisodeNumber": "Episode number:", "LabelAudioCodec": "Audio: {0}", "LabelVideoCodec": "Video: {0}", "LabelLocalAccessUrl": "Local access: {0}", @@ -308,6 +311,7 @@ "HeaderArtist": "Artist", "LabelAddedOnDate": "Added {0}", "ButtonStart": "Start", + "LabelSeasonNumber": "Season number:", "HeaderChannels": "Channels", "HeaderMediaFolders": "Media Folders", "HeaderBlockItemsWithNoRating": "Block content with no rating information:", @@ -336,6 +340,7 @@ "ButtonNextPage": "Next Page", "ButtonPreviousPage": "Previous Page", "ButtonMoveLeft": "Move left", + "OptionReleaseDate": "Release date", "ButtonMoveRight": "Move right", "ButtonBrowseOnlineImages": "Browse online images", "HeaderDeleteItem": "Delete Item", @@ -478,11 +483,8 @@ "PersonTypePerson": "Person", "LabelTitleDisplayOrder": "Title display order:", "OptionSortName": "Sort name", - "OptionReleaseDate": "Release date", - "LabelSeasonNumber": "Season number:", "LabelDiscNumber": "Disc number", "LabelParentNumber": "Parent number", - "LabelEpisodeNumber": "Episode number:", "LabelTrackNumber": "Track number:", "LabelNumber": "Number:", "LabelReleaseDate": "Release date:", @@ -785,6 +787,7 @@ "HeaderMedia": "Media", "ButtonInbox": "Inbox", "HeaderAdvanced": "Advanced", + "HeaderGroupVersions": "Group Versions", "HeaderSaySomethingLike": "Say Something Like...", "ButtonTryAgain": "Try Again", "HeaderYouSaid": "You Said...", @@ -794,5 +797,13 @@ "ButtonManageServer": "Manage Server", "ButtonPreferences": "Preferences", "ButtonViewArtist": "View artist", - "ButtonViewAlbum": "View album" + "ButtonViewAlbum": "View album", + "ErrorMessagePasswordNotMatchConfirm": "The password and password confirmation must match.", + "ErrorMessageUsernameInUse": "The username is already in use. Please choose a new name and try again.", + "ErrorMessageEmailInUse": "The email address is already in use. Please enter a new email address and try again, or use the forgot password feature.", + "MessageThankYouForConnectSignUp": "Thank you for signing up for Emby Connect. An email will be sent to your address with instructions on how to confirm your new account. Please confirm the account and then return here to sign in.", + "HeaderShare": "Share", + "ButtonShareHelp": "Share a web page containing media information with social media. Media files are never shared publicly.", + "ButtonShare": "Share", + "HeaderConfirm": "Confirm" }
\ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/nb.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/nb.json index d1cf0192d..6d60c6250 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/nb.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/nb.json @@ -38,7 +38,9 @@ "HeaderSupportTheTeam": "St\u00f8tt Emby teamet!", "TextEnjoyBonusFeatures": "Nyt bonusfunksjonene", "TitleLiveTV": "Live TV", + "ButtonCancelSyncJob": "Cancel sync job", "TitleSync": "Synk", + "HeaderSelectDate": "Velg dato", "ButtonDonate": "Don\u00e9r", "LabelRecurringDonationCanBeCancelledHelp": "Gjentakende donasjoner kan avbrytes n\u00e5r som helst fra din PayPal-konto.", "HeaderMyMedia": "Mine media", @@ -104,6 +106,7 @@ "TitlePlugins": "Programtillegg", "ButtonTakeTheTourToSeeWhatsNew": "Ta en titt p\u00e5 hva som er nytt", "MessageNoSyncJobsFound": "Ingen synkroniseringsjobber funnet. Opprett en synkroniseringsjobb ved hjelp av Synkroniseringsknappene i biblioteket", + "ButtonPlayTrailer": "Spill trailer", "HeaderLibraryAccess": "Bibliotek tilgang", "HeaderChannelAccess": "Kanal tilgang", "HeaderDeviceAccess": "Enhetstilgang", @@ -144,7 +147,6 @@ "ButtonPlay": "Spill", "ButtonEdit": "Rediger", "ButtonQueue": "K\u00f8", - "ButtonPlayTrailer": "Spill trailer", "ButtonPlaylist": "Spilleliste", "ButtonPreviousTrack": "Forrige Spor", "LabelEnabled": "Aktivert", @@ -263,6 +265,7 @@ "LabelPlayMethodTranscoding": "Transcoding", "LabelPlayMethodDirectStream": "Direkte Streaming", "LabelPlayMethodDirectPlay": "Direkte Avspilling", + "LabelEpisodeNumber": "Episode number:", "LabelAudioCodec": "Lyd: {0}", "LabelVideoCodec": "Video: {0}", "LabelLocalAccessUrl": "Lokal tilgang: {0}", @@ -308,6 +311,7 @@ "HeaderArtist": "Artist", "LabelAddedOnDate": "Lagt til {0}", "ButtonStart": "Start", + "LabelSeasonNumber": "Season number:", "HeaderChannels": "Kanaler", "HeaderMediaFolders": "Mediemapper", "HeaderBlockItemsWithNoRating": "Blokker innhold uten rating:", @@ -336,6 +340,7 @@ "ButtonNextPage": "Neste Side", "ButtonPreviousPage": "Forrige Side", "ButtonMoveLeft": "Flytt til venstre", + "OptionReleaseDate": "Utgivelsesdato", "ButtonMoveRight": "Flytt til h\u00f8yre", "ButtonBrowseOnlineImages": "Bla igjennom bilder online", "HeaderDeleteItem": "Slett element", @@ -478,11 +483,8 @@ "PersonTypePerson": "Person", "LabelTitleDisplayOrder": "Tittel visnings rekkef\u00f8lge:", "OptionSortName": "Sorterings navn", - "OptionReleaseDate": "Lanseringsdato", - "LabelSeasonNumber": "Sesong nummer:", "LabelDiscNumber": "Disk nummer", "LabelParentNumber": "Forelder-ID", - "LabelEpisodeNumber": "Episode nummer:", "LabelTrackNumber": "Spor nummer:", "LabelNumber": "Nummer:", "LabelReleaseDate": "Utgivelsesdato:", @@ -741,7 +743,7 @@ "LabelQuality": "Kvalitet:", "HeaderSettings": "Innstillinger", "OptionAutomaticallySyncNewContent": "Automatisk synkroniser nytt innhold", - "OptionAutomaticallySyncNewContentHelp": "Nytt innhold lagt til i denne kategorien vil bli automatisk synkronisert til enheten.", + "OptionAutomaticallySyncNewContentHelp": "New content added to will be automatically synced to the device.", "OptionSyncUnwatchedVideosOnly": "Synkroniser kun usette videoer", "OptionSyncUnwatchedVideosOnlyHelp": "Kun usette videoer blir synkronisert, og videoer blir fjernet fra enheten s\u00e5 snart de er sett.", "LabelItemLimit": "Begrenset antall:", @@ -785,6 +787,7 @@ "HeaderMedia": "Media", "ButtonInbox": "Inbox", "HeaderAdvanced": "Avansert", + "HeaderGroupVersions": "Group Versions", "HeaderSaySomethingLike": "Say Something Like...", "ButtonTryAgain": "Try Again", "HeaderYouSaid": "You Said...", @@ -794,5 +797,13 @@ "ButtonManageServer": "Manage Server", "ButtonPreferences": "Preferences", "ButtonViewArtist": "View artist", - "ButtonViewAlbum": "View album" + "ButtonViewAlbum": "View album", + "ErrorMessagePasswordNotMatchConfirm": "The password and password confirmation must match.", + "ErrorMessageUsernameInUse": "The username is already in use. Please choose a new name and try again.", + "ErrorMessageEmailInUse": "The email address is already in use. Please enter a new email address and try again, or use the forgot password feature.", + "MessageThankYouForConnectSignUp": "Thank you for signing up for Emby Connect. An email will be sent to your address with instructions on how to confirm your new account. Please confirm the account and then return here to sign in.", + "HeaderShare": "Share", + "ButtonShareHelp": "Share a web page containing media information with social media. Media files are never shared publicly.", + "ButtonShare": "Share", + "HeaderConfirm": "Confirm" }
\ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/nl.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/nl.json index 45db6b0c4..f910316fd 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/nl.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/nl.json @@ -6,7 +6,7 @@ "Administrator": "Beheerder", "Password": "Wachtwoord", "DeleteImage": "Verwijder afbeelding", - "MessageThankYouForSupporting": "Dank u voor uw steun aan Emby", + "MessageThankYouForSupporting": "Bedankt voor uw steun aan Emby", "MessagePleaseSupportProject": "Steun Emby a.u.b.", "DeleteImageConfirmation": "Weet u zeker dat u deze afbeelding wilt verwijderen?", "FileReadCancelled": "Bestand lezen is geannuleerd.", @@ -36,9 +36,11 @@ "MessageKeyUpdated": "Dank u. Uw supporter sleutel is bijgewerkt.", "MessageKeyRemoved": "Dank u. Uw supporter sleutel is verwijderd.", "HeaderSupportTheTeam": "Ondersteun het Emby Team", - "TextEnjoyBonusFeatures": "Geniet van Bonus Features", + "TextEnjoyBonusFeatures": "Profiteer van extra mogelijkheden", "TitleLiveTV": "Live TV", + "ButtonCancelSyncJob": "Annuleer synchronisatie opdracht", "TitleSync": "Synchroniseer", + "HeaderSelectDate": "Selecteer Datum", "ButtonDonate": "Doneren", "LabelRecurringDonationCanBeCancelledHelp": "Terugkerende donaties kunnen op elk moment stop gezet worden in uw PayPal account.", "HeaderMyMedia": "Mijn media", @@ -47,7 +49,7 @@ "MessageErrorLoadingSupporterInfo": "Er is een fout opgetreden bij het laden van uw supporter informatie. Probeer het later opnieuw.", "MessageLinkYourSupporterKey": "Koppel uw supporters sleutel met maximaal {0} Emby Connect leden om te genieten van gratis toegang tot de volgende apps:", "HeaderConfirmRemoveUser": "Gebruiker verwijderen", - "MessageSwipeDownOnRemoteControl": "Welkom bij afstandbediening. Selecteer het apparat wat je wilt bedienen door op het icoon rechtsboven te klikken. Swipe ergens op dit scherm naar beneden om terug te gaan.", + "MessageSwipeDownOnRemoteControl": "Welkom bij afstandbediening. Selecteer het apparaat dat u wilt bedienen door op het icoon rechtsboven te klikken. Swipe ergens op dit scherm naar beneden om terug te gaan.", "MessageConfirmRemoveConnectSupporter": "Bent u zeker dat u de extra supporter voordelen van deze gebruiker wilt verwijderen?", "ValueTimeLimitSingleHour": "Tijdslimiet: 1 uur", "ValueTimeLimitMultiHour": "Tijdslimiet: {0} uren", @@ -74,7 +76,7 @@ "LabelFailed": "(mislukt)", "ButtonHelp": "Hulp", "ButtonSave": "Opslaan", - "ButtonDownload": "Download", + "ButtonDownload": "Downloaden", "SyncJobStatusQueued": "In wachtrij", "SyncJobStatusConverting": "Converteren", "SyncJobStatusFailed": "Mislukt", @@ -92,11 +94,11 @@ "HeaderDevices": "Apparaten", "ButtonScheduledTasks": "Geplande taken", "MessageItemsAdded": "Items toegevoegd", - "ButtonAddToCollection": "Voeg toe aan collectie", + "ButtonAddToCollection": "Toevoegen aan Collectie", "HeaderSelectCertificatePath": "Selecteer Certificaat Pad", "ConfirmMessageScheduledTaskButton": "Deze operatie loopt normaal gesproken automatisch als een geplande taak. Het kan hier ook handmatig worden uitgevoerd. Om de geplande taak te configureren, zie:", "HeaderSupporterBenefit": "Een supporter lidmaatschap biedt voordelen zoals toegang tot synchronisatie, premium plug-ins, internet kanalen en meer. {0}Meer weten{1}.", - "LabelSyncNoTargetsHelp": "Het lijkt erop dat je momenteel geen apps hebt die synchroniseren ondersteunen.", + "LabelSyncNoTargetsHelp": "Het lijkt erop dat u momenteel geen apps heeft die synchroniseren ondersteunen.", "HeaderWelcomeToProjectServerDashboard": "Welkom bij het Emby Server Dashboard", "HeaderWelcomeToProjectWebClient": "Welkom bij Emby", "ButtonTakeTheTour": "Volg de tour", @@ -104,6 +106,7 @@ "TitlePlugins": "Plugins", "ButtonTakeTheTourToSeeWhatsNew": "Volg de tour om te zien wat nieuw is", "MessageNoSyncJobsFound": "Geen sync opdrachten gevonden. Maak sync opdrachten via de Synchronisatie knoppen in de web interface.", + "ButtonPlayTrailer": "Trailer afspelen", "HeaderLibraryAccess": "Bibliotheek toegang", "HeaderChannelAccess": "Kanaal toegang", "HeaderDeviceAccess": "Apparaat Toegang", @@ -125,7 +128,7 @@ "HeaderPlaybackError": "Afspeel Fout", "MessagePlaybackErrorNotAllowed": "U bent niet bevoegd om deze content af te spelen. Neem contact op met uw systeembeheerder voor meer informatie.", "MessagePlaybackErrorNoCompatibleStream": "Geen compatibele streams beschikbaar. Probeer het later opnieuw of neem contact op met de serverbeheerder.", - "MessagePlaybackErrorRateLimitExceeded": "Je afspeel rate limiet is overschreden. Neem contact op met de beheerder van de server voor details.", + "MessagePlaybackErrorRateLimitExceeded": "Uw afspeel rate limiet is overschreden. Neem contact op met de beheerder van de server voor details.", "MessagePlaybackErrorPlaceHolder": "De gekozen content is niet af te spelen vanaf dit apparaat.", "HeaderSelectAudio": "Selecteer Audio", "HeaderSelectSubtitles": "Selecteer Ondertitels", @@ -144,7 +147,6 @@ "ButtonPlay": "Afspelen", "ButtonEdit": "Bewerken", "ButtonQueue": "Wachtrij", - "ButtonPlayTrailer": "Trailer afspelen", "ButtonPlaylist": "Afspeellijst", "ButtonPreviousTrack": "Vorig Nummer", "LabelEnabled": "Ingeschakeld", @@ -155,7 +157,7 @@ "ButtonMarkTheseRead": "Markeer deze gelezen", "ButtonClose": "Sluiten", "LabelAllPlaysSentToPlayer": "Alles zal worden verzonden naar de geselecteerde speler.", - "MessageInvalidUser": "Foutiefe gebruikersnaam of wachtwoord. Probeer opnieuw.", + "MessageInvalidUser": "Foutieve gebruikersnaam of wachtwoord. Probeer opnieuw.", "HeaderLoginFailure": "Aanmeld fout", "HeaderAllRecordings": "Alle Opnames", "RecommendationBecauseYouLike": "Omdat u {0} leuk vond.", @@ -200,7 +202,7 @@ "HeaderSplitMedia": "Splits Media Apart", "MessageConfirmSplitMedia": "Weet u zeker dat u de media bronnen wilt splitsen in afzonderlijke items?", "HeaderError": "Fout", - "MessageChromecastConnectionError": "Je Chromcast ontvanger kan niet met je Emby server verbinden. Controleer je verbindingen en probeer het opnieuw.", + "MessageChromecastConnectionError": "Uw Chromecast ontvanger kan niet met uw Emby Server verbinden. Controleer de verbindingen en probeer het opnieuw.", "MessagePleaseSelectOneItem": "Selecteer ten minste een item.", "MessagePleaseSelectTwoItems": "Selecteer ten minste twee items.", "MessageTheFollowingItemsWillBeGrouped": "De volgende titels worden gegroepeerd in \u00e9\u00e9n item:", @@ -263,6 +265,7 @@ "LabelPlayMethodTranscoding": "Transcoderen", "LabelPlayMethodDirectStream": "Direct Streamen", "LabelPlayMethodDirectPlay": "Direct Afspelen", + "LabelEpisodeNumber": "Afleveringsnummer:", "LabelAudioCodec": "Audio: {0}", "LabelVideoCodec": "Video: {0}", "LabelLocalAccessUrl": "Lokale toegang: {0}", @@ -294,7 +297,7 @@ "HeaderAudioTracks": "Audio sporen", "HeaderLibraries": "Bibliotheken", "HeaderSubtitles": "Ondertitels", - "HeaderVideoQuality": "Video Kwalitet", + "HeaderVideoQuality": "Video Kwaliteit", "MessageErrorPlayingVideo": "Er ging iets mis bij het afspelen van de video.", "MessageEnsureOpenTuner": "Wees er a.u.b. zeker van dat er een open tuner beschikbaar is.", "ButtonHome": "Start", @@ -308,6 +311,7 @@ "HeaderArtist": "Artiest", "LabelAddedOnDate": "Toegevoegd {0}", "ButtonStart": "Start", + "LabelSeasonNumber": "Seizoennummer:", "HeaderChannels": "Kanalen", "HeaderMediaFolders": "Media Mappen", "HeaderBlockItemsWithNoRating": "Blokkeer inhoud zonder classificatiegegevens:", @@ -322,7 +326,7 @@ "OptionBlockLiveTvChannels": "Live TV Kanalen", "OptionBlockChannelContent": "Internet kanaal Inhoud", "ButtonRevoke": "Herroepen", - "MessageConfirmRevokeApiKey": "Weet je zeker dat je deze api key in wilt trekken? De verbinding met Emby Server zal direct afgebroken worden.", + "MessageConfirmRevokeApiKey": "Weet u zeker dat u deze api key in wilt trekken? De verbinding met Emby Server zal direct verbroken worden.", "HeaderConfirmRevokeApiKey": "Intrekken Api Sleutel", "ValueContainer": "Container: {0}", "ValueAudioCodec": "Audio Codec: {0}", @@ -336,6 +340,7 @@ "ButtonNextPage": "Volgende pagina", "ButtonPreviousPage": "Vorige Pagina", "ButtonMoveLeft": "Verplaats naar links", + "OptionReleaseDate": "Uitgave datum", "ButtonMoveRight": "Verplaats naar rechts", "ButtonBrowseOnlineImages": "Blader door online afbeeldingen", "HeaderDeleteItem": "Item verwijderen", @@ -478,11 +483,8 @@ "PersonTypePerson": "Persoon", "LabelTitleDisplayOrder": "Titel weergave volgorde:", "OptionSortName": "Sorteerbaar", - "OptionReleaseDate": "Uitgave datum", - "LabelSeasonNumber": "Seizoen nummer:", "LabelDiscNumber": "Disc nummer", "LabelParentNumber": "Bovenliggend nummer", - "LabelEpisodeNumber": "Aflevering nummer:", "LabelTrackNumber": "Tracknummer:", "LabelNumber": "Nummer:", "LabelReleaseDate": "Uitgave datum:", @@ -537,9 +539,9 @@ "MessageInstallPluginFromApp": "Deze plugin moet ge\u00efnstalleerd worden vanuit de app waarin u het wilt gebruiken.", "ValuePriceUSD": "Prijs {0} (USD)", "MessageFeatureIncludedWithSupporter": "U bent geregistreerd voor deze functie, en zal deze kunnen blijven gebruiken met uw actieve supporter lidmaatschap.", - "MessageChangeRecurringPlanConfirm": "Na het voltooien van deze transactie zal je de eerdere terugkerende donatie in je PayPal account moeten annuleren. Bedankt voor de ondersteuning aan Emby.", + "MessageChangeRecurringPlanConfirm": "Na het voltooien van deze transactie zult u de eerdere terugkerende donatie in uw PayPal account moeten annuleren. Bedankt voor de ondersteuning aan Emby.", "MessageSupporterMembershipExpiredOn": "Uw supporter lidmaatschap is verlopen op {0}", - "MessageYouHaveALifetimeMembership": "Je hebt een levenslang supporter lidmaatschap. Je kan eenmalige- en terugkerende donaties doen met onderstaande opties. Bedankt voor de ondersteuning aan Emby.", + "MessageYouHaveALifetimeMembership": "U hebt een levenslang supporter lidmaatschap. U kunt eenmalige en terugkerende donaties doen met onderstaande opties. Bedankt voor de ondersteuning aan Emby.", "MessageYouHaveAnActiveRecurringMembership": "U hebt een actief {0} lidmaatschap. U kunt met de opties hieronder uw lidmaatschap upgraden.", "ButtonDelete": "Verwijderen", "HeaderEmbyAccountAdded": "Emby Account Toegevoegd", @@ -650,7 +652,7 @@ "MediaInfoLevel": "Niveau", "MediaInfoAspectRatio": "Beeld verhouding", "MediaInfoResolution": "Resolutie", - "MediaInfoAnamorphic": "Anamorfe", + "MediaInfoAnamorphic": "Anamorf", "MediaInfoInterlaced": "Interlaced", "MediaInfoFramerate": "Framerate", "MediaInfoStreamTypeAudio": "Geluid", @@ -677,13 +679,13 @@ "WebClientTourMetadataManager": "Klik wijzigen om de metadata manager te openen", "WebClientTourPlaylists": "Maak eenvoudig een afspeellijst en mixlijst, en speel deze op elk apparaat", "WebClientTourCollections": "Maak film Collecties door boxsets samen te voegen", - "WebClientTourUserPreferences1": "Met gebruikersvoorkeuren kan je de manier waarop je bibliotheek getoond wordt in alle Emby apps aanpassen", - "WebClientTourUserPreferences2": "Stel eenmalig je voorkeuren voor je audio- en ondertitelingstaal voor elke Emby app", + "WebClientTourUserPreferences1": "Met gebruikersvoorkeuren kunt u de manier waarop uw bibliotheek getoond wordt in alle Emby apps aanpassen", + "WebClientTourUserPreferences2": "Stel eenmalig uw voorkeuren in voor uw audio- en ondertitelingstaal voor elke Emby app", "WebClientTourUserPreferences3": "Ontwerp de startpagina van de web client volgens uw wensen", "WebClientTourUserPreferences4": "Configureer achtergronden, theme songs en externe spelers", "WebClientTourMobile1": "De web client werk perfect op smartphones en tablets...", - "WebClientTourMobile2": "en bedien eenvoudig je andere apparaten en Emby apps", - "WebClientTourMySync": "Synchroniseer je persoonlijke media naar je apparaten om het offline te bekijken.", + "WebClientTourMobile2": "en bedien eenvoudig uw andere apparaten en Emby apps", + "WebClientTourMySync": "Synchroniseer uw persoonlijke media naar uw apparaten om het offline te bekijken.", "MessageEnjoyYourStay": "Geniet van uw verblijf", "DashboardTourDashboard": "Het server-dashboard steld u in staat uw server en uw gebruikers te monitoren . U zult altijd weten wie wat doet en waar ze zijn.", "DashboardTourHelp": "De in-app hulp bevat handige knoppen om wiki pagina's te openen die gaan over de informatie op het scherm.", @@ -694,8 +696,8 @@ "DashboardTourPlugins": "Installeer plugins zoals Internet videokanalen, live tv, metadata, scanners en meer.", "DashboardTourNotifications": "Meldingen van de server gebeurtenissen automatisch verzenden naar uw mobiele apparaat, e-mail en meer.", "DashboardTourScheduledTasks": "Beheer eenvoudig langlopende transacties met geplande taken. Beslis zelf wanneer ze worden uitgevoerd en hoe vaak.", - "DashboardTourMobile": "Het Emby Server dashboard werkt goed op smartphones en tablets. Beheer je server in de palm van je hand, altijd en overal.", - "DashboardTourSync": "Synchroniseer je persoonlijke media naar je apparaten om het offline te bekijken.", + "DashboardTourMobile": "Het Emby Server dashboard werkt goed op smartphones en tablets. Beheer uw server vanuit uw handpalm, altijd en overal.", + "DashboardTourSync": "Synchroniseer uw persoonlijke media naar uw apparaten om het offline te bekijken.", "MessageRefreshQueued": "Vernieuwen wachtrij", "TabDevices": "Apparaten", "TabExtras": "Extra's", @@ -723,16 +725,16 @@ "MessageContactAdminToResetPassword": "Neem contact op met de server beheerder om uw wachtwoord te resetten.", "MessageForgotPasswordInNetworkRequired": "Probeer de wachtwoord herstel procedure opnieuw vanuit uw thuisnetwerk.", "MessageForgotPasswordFileCreated": "Het volgende bestand met instructies hoe nu verder te gaan is gemaakt:", - "MessageForgotPasswordFileExpiration": "De hertsel pincode verloopt {0}.", + "MessageForgotPasswordFileExpiration": "De herstel pincode verloopt {0}.", "MessageInvalidForgotPasswordPin": "Er is een ongeldige of verlopen pincode ingegeven. Probeer opnieuw.", "MessagePasswordResetForUsers": "Wachtwoorden zijn verwijderd van de volgende gebruikers:", "HeaderInviteGuest": "Nodig gast uit", "ButtonLinkMyEmbyAccount": "Koppel mijn account nu", - "MessageConnectAccountRequiredToInviteGuest": "Om gasten uit te kunnen nodigen moet je je Emby account aan deze server koppelen.", + "MessageConnectAccountRequiredToInviteGuest": "Om gasten uit te kunnen nodigen moet u uw Emby account aan deze server koppelen.", "ButtonSync": "Synchronisatie", "SyncMedia": "Synchroniseer media", "HeaderCancelSyncJob": "Annuleer synchronisatie", - "CancelSyncJobConfirmation": "Als je de synchroniseertaak annuleert wordt de gesynchroniseerde media bij de volgende synchroniseertaak van het apparaat verwijderd. Weet je zeker dat je door wilt gaan?", + "CancelSyncJobConfirmation": "Als u de synchroniseertaak annuleert wordt de gesynchroniseerde media bij de volgende synchroniseertaak van het apparaat verwijderd. Weet u zeker dat u door wilt gaan?", "TabSync": "Synchronisatie", "MessagePleaseSelectDeviceToSyncTo": "Selecteer een apparaat om mee te synchroniseren.", "MessageSyncJobCreated": "Synchronisatie taak gemaakt.", @@ -741,7 +743,7 @@ "LabelQuality": "Kwaliteit", "HeaderSettings": "Instellingen", "OptionAutomaticallySyncNewContent": "Nieuwe inhoud automatisch synchroniseren", - "OptionAutomaticallySyncNewContentHelp": "New content added to will be automatically synced to the device.", + "OptionAutomaticallySyncNewContentHelp": "Nieuwe inhoud zal automatisch met het apparaat gesynchroniseerd worden.", "OptionSyncUnwatchedVideosOnly": "Synchroniseer alleen onbekeken video's", "OptionSyncUnwatchedVideosOnlyHelp": "Alleen onbekeken video's zullen worden gesynchroniseerd en van het apparaat worden verwijderd als ze bekeken zijn.", "LabelItemLimit": "Item limiet:", @@ -771,13 +773,13 @@ "MessageUnlockAppWithPurchase": "Geef alle mogelijkheden van deze app vrij met een enkele kleine aankoop.", "MessageUnlockAppWithPurchaseOrSupporter": "Geef alle mogelijkheden van deze app vrij met een enkele kleine aankoop of door met een actief Emby Supporter Lidmaatschap aan te melden.", "MessageUnlockAppWithSupporter": "Geef alle mogelijkheden van deze app vrij door met een actief Emby Supporter Lidmaatschap aan te melden.", - "MessageToValidateSupporter": "Als je een actief Emby Supporter Lidmaatschap hebt, meld de app dan aan op je eigen wifi netwerk.", + "MessageToValidateSupporter": "Als u een actief Emby Supporter Lidmaatschap hebt, meld de app dan aan op uw eigen wifi netwerk.", "MessagePaymentServicesUnavailable": "Betaal services zijn momenteel niet beschikbaar, Probeer het later svp. nog eens.", - "ButtonUnlockWithSupporter": "Meld aan met je Emby Supporter Lidmaatschap", - "MessagePleaseSignInLocalNetwork": "Controleer of je verbonden bent met je lokale netwerk voordat je verder gaat.", + "ButtonUnlockWithSupporter": "Meld aan met uw Emby Supporter Lidmaatschap", + "MessagePleaseSignInLocalNetwork": "Controleer of u verbonden bent met uw lokale netwerk voordat u verder gaat.", "ButtonUnlockWithPurchase": "Geef vrij met een aankoop", "ButtonUnlockPrice": "Unlock {0}", - "MessageLiveTvGuideRequiresUnlock": "De Live TV Gids is momenteel gelimiteerd tot {0} kanalen. Klik op de Geef vrij knop om te zien hoe je deze limiet op kan heffen.", + "MessageLiveTvGuideRequiresUnlock": "De Live TV Gids is momenteel gelimiteerd tot {0} kanalen. Klik op de Geef vrij knop om te zien hoe u deze limiet op kunt heffen.", "OptionEnableFullscreen": "Schakel volledig scherm in", "ButtonServer": "Server", "HeaderAdmin": "Beheerder", @@ -785,14 +787,23 @@ "HeaderMedia": "Media", "ButtonInbox": "inbox", "HeaderAdvanced": "Geavanceerd", - "HeaderSaySomethingLike": "Say Something Like...", + "HeaderGroupVersions": "Versies Groeperen", + "HeaderSaySomethingLike": "Zeg iets zoals...", "ButtonTryAgain": "Opnieuw Proberen", - "HeaderYouSaid": "You Said...", - "MessageWeDidntRecognizeCommand": "We're sorry, we didn't recognize that command.", - "MessageIfYouBlockedVoice": "If you denied voice access to the app you'll need to reconfigure before trying again.", - "MessageNoItemsFound": "No items found.", - "ButtonManageServer": "Manage Server", + "HeaderYouSaid": "U zei...", + "MessageWeDidntRecognizeCommand": "Sorry, dat commande herkennen we niet.", + "MessageIfYouBlockedVoice": "Als u spraak toegang uitgeschakeld hebt moet u dit opnieuw configureren voordat u verder gaat.", + "MessageNoItemsFound": "Geen items gevonden.", + "ButtonManageServer": "Beheer server", "ButtonPreferences": "Voorkeuren", "ButtonViewArtist": "Bekijk artiest", - "ButtonViewAlbum": "Bekijk album" + "ButtonViewAlbum": "Bekijk album", + "ErrorMessagePasswordNotMatchConfirm": "Het wachtwoord en de wachtwoordbevestiging moeten overeenkomen.", + "ErrorMessageUsernameInUse": "Deze gebruikersnaam is al in gebruik. Kies een andere en probeer het opnieuw.", + "ErrorMessageEmailInUse": "Dit emailadres is al in gebruik. Kies een ander en probeer het opnieuw, of gebruik de vergeten wachtwoord functie.", + "MessageThankYouForConnectSignUp": "Bedankt voor het aanmelden bij Emby Connect. Een email met instructies hoe je account bevestigd moet worden wordt verstuurd. Bevestig het account en keer terug om aan te melden.", + "HeaderShare": "Delen", + "ButtonShareHelp": "Deel een webpagina met media-informatie met sociale media. Media-bestanden worden nooit publiekelijk gedeeld.", + "ButtonShare": "Delen", + "HeaderConfirm": "bevestigen" }
\ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/pl.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/pl.json index 6befd9d29..b00323084 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/pl.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/pl.json @@ -38,7 +38,9 @@ "HeaderSupportTheTeam": "Support the Emby Team", "TextEnjoyBonusFeatures": "Enjoy Bonus Features", "TitleLiveTV": "Live TV", + "ButtonCancelSyncJob": "Cancel sync job", "TitleSync": "Sync", + "HeaderSelectDate": "Select Date", "ButtonDonate": "Donate", "LabelRecurringDonationCanBeCancelledHelp": "Recurring donations can be cancelled at any time from within your PayPal account.", "HeaderMyMedia": "My Media", @@ -104,6 +106,7 @@ "TitlePlugins": "Plugins", "ButtonTakeTheTourToSeeWhatsNew": "Take the tour to see what's new", "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the web interface.", + "ButtonPlayTrailer": "Play trailer", "HeaderLibraryAccess": "Library Access", "HeaderChannelAccess": "Channel Access", "HeaderDeviceAccess": "Device Access", @@ -144,7 +147,6 @@ "ButtonPlay": "Play", "ButtonEdit": "Edit", "ButtonQueue": "Queue", - "ButtonPlayTrailer": "Play trailer", "ButtonPlaylist": "Playlist", "ButtonPreviousTrack": "Previous Track", "LabelEnabled": "Enabled", @@ -263,6 +265,7 @@ "LabelPlayMethodTranscoding": "Transcoding", "LabelPlayMethodDirectStream": "Direct Streaming", "LabelPlayMethodDirectPlay": "Direct Playing", + "LabelEpisodeNumber": "Episode number:", "LabelAudioCodec": "Audio: {0}", "LabelVideoCodec": "Video: {0}", "LabelLocalAccessUrl": "Local access: {0}", @@ -308,6 +311,7 @@ "HeaderArtist": "Artist", "LabelAddedOnDate": "Added {0}", "ButtonStart": "Start", + "LabelSeasonNumber": "Season number:", "HeaderChannels": "Channels", "HeaderMediaFolders": "Media Folders", "HeaderBlockItemsWithNoRating": "Block content with no rating information:", @@ -336,6 +340,7 @@ "ButtonNextPage": "Next Page", "ButtonPreviousPage": "Previous Page", "ButtonMoveLeft": "Move left", + "OptionReleaseDate": "Release date", "ButtonMoveRight": "Move right", "ButtonBrowseOnlineImages": "Browse online images", "HeaderDeleteItem": "Delete Item", @@ -478,11 +483,8 @@ "PersonTypePerson": "Person", "LabelTitleDisplayOrder": "Title display order:", "OptionSortName": "Sort name", - "OptionReleaseDate": "Data wydania", - "LabelSeasonNumber": "Season number:", "LabelDiscNumber": "Disc number", "LabelParentNumber": "Parent number", - "LabelEpisodeNumber": "Episode number:", "LabelTrackNumber": "Track number:", "LabelNumber": "Number:", "LabelReleaseDate": "Release date:", @@ -785,6 +787,7 @@ "HeaderMedia": "Media", "ButtonInbox": "Inbox", "HeaderAdvanced": "Advanced", + "HeaderGroupVersions": "Group Versions", "HeaderSaySomethingLike": "Say Something Like...", "ButtonTryAgain": "Try Again", "HeaderYouSaid": "You Said...", @@ -794,5 +797,13 @@ "ButtonManageServer": "Manage Server", "ButtonPreferences": "Preferences", "ButtonViewArtist": "View artist", - "ButtonViewAlbum": "View album" + "ButtonViewAlbum": "View album", + "ErrorMessagePasswordNotMatchConfirm": "The password and password confirmation must match.", + "ErrorMessageUsernameInUse": "The username is already in use. Please choose a new name and try again.", + "ErrorMessageEmailInUse": "The email address is already in use. Please enter a new email address and try again, or use the forgot password feature.", + "MessageThankYouForConnectSignUp": "Thank you for signing up for Emby Connect. An email will be sent to your address with instructions on how to confirm your new account. Please confirm the account and then return here to sign in.", + "HeaderShare": "Share", + "ButtonShareHelp": "Share a web page containing media information with social media. Media files are never shared publicly.", + "ButtonShare": "Share", + "HeaderConfirm": "Confirm" }
\ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/pt-BR.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/pt-BR.json index 12b59701d..5eb463fe4 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/pt-BR.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/pt-BR.json @@ -38,7 +38,9 @@ "HeaderSupportTheTeam": "Colabore com o Time do Emby", "TextEnjoyBonusFeatures": "Aproveite Funcionalidades Extras", "TitleLiveTV": "TV ao Vivo", + "ButtonCancelSyncJob": "Cancelar tarefa de sincroniza\u00e7\u00e3o", "TitleSync": "Sinc", + "HeaderSelectDate": "Selecionar Data", "ButtonDonate": "Doar", "LabelRecurringDonationCanBeCancelledHelp": "Doa\u00e7\u00f5es recorrentes podem ser canceladas a qualquer momento dentro da conta do PayPal.", "HeaderMyMedia": "Minha M\u00eddia", @@ -104,6 +106,7 @@ "TitlePlugins": "Plugins", "ButtonTakeTheTourToSeeWhatsNew": "Fa\u00e7a o tour para ver as novidades", "MessageNoSyncJobsFound": "Nenhuma tarefa de sincroniza\u00e7\u00e3o encontrada. Crie uma tarefa de sincroniza\u00e7\u00e3o usando os bot\u00f5es Sincroniza\u00e7\u00e3o encontrados na interface web.", + "ButtonPlayTrailer": "Reproduzir trailer", "HeaderLibraryAccess": "Acesso \u00e0 Biblioteca", "HeaderChannelAccess": "Acesso ao Canal", "HeaderDeviceAccess": "Acesso ao Dispositivo", @@ -144,7 +147,6 @@ "ButtonPlay": "Reproduzir", "ButtonEdit": "Editar", "ButtonQueue": "Adicionar \u00e0 fila", - "ButtonPlayTrailer": "Reproduzir trailer", "ButtonPlaylist": "Lista de reprodu\u00e7\u00e3o", "ButtonPreviousTrack": "Faixa Anterior", "LabelEnabled": "Ativada", @@ -263,6 +265,7 @@ "LabelPlayMethodTranscoding": "Transcodifica\u00e7\u00e3o", "LabelPlayMethodDirectStream": "Streaming Direto", "LabelPlayMethodDirectPlay": "Reprodu\u00e7\u00e3o Direta", + "LabelEpisodeNumber": "N\u00famero do epis\u00f3dio:", "LabelAudioCodec": "\u00c1udio: {0}", "LabelVideoCodec": "V\u00eddeo: {0}", "LabelLocalAccessUrl": "Acesso local: {0}", @@ -308,6 +311,7 @@ "HeaderArtist": "Artista", "LabelAddedOnDate": "Adicionado {0}", "ButtonStart": "Iniciar", + "LabelSeasonNumber": "N\u00famero da temporada:", "HeaderChannels": "Canais", "HeaderMediaFolders": "Pastas de M\u00eddia", "HeaderBlockItemsWithNoRating": "Bloquear conte\u00fado sem informa\u00e7\u00e3o de classifica\u00e7\u00e3o:", @@ -336,6 +340,7 @@ "ButtonNextPage": "Pr\u00f3xima P\u00e1gina", "ButtonPreviousPage": "P\u00e1gina Anterior", "ButtonMoveLeft": "Mover \u00e0 esquerda", + "OptionReleaseDate": "Data de lan\u00e7amento", "ButtonMoveRight": "Mover \u00e0 direita", "ButtonBrowseOnlineImages": "Procurar imagens online", "HeaderDeleteItem": "Excluir item", @@ -478,11 +483,8 @@ "PersonTypePerson": "Pessoa", "LabelTitleDisplayOrder": "Ordem de exibi\u00e7\u00e3o do t\u00edtulo: ", "OptionSortName": "Nome para ordena\u00e7\u00e3o", - "OptionReleaseDate": "Data de lan\u00e7amento", - "LabelSeasonNumber": "N\u00famero da temporada:", "LabelDiscNumber": "N\u00famero do disco", "LabelParentNumber": "N\u00famero do superior", - "LabelEpisodeNumber": "N\u00famero do epis\u00f3dio:", "LabelTrackNumber": "N\u00famero da faixa:", "LabelNumber": "N\u00famero:", "LabelReleaseDate": "Data do lan\u00e7amento:", @@ -785,6 +787,7 @@ "HeaderMedia": "M\u00eddia", "ButtonInbox": "Caixa de Entrada", "HeaderAdvanced": "Avan\u00e7ado", + "HeaderGroupVersions": "Agrupar Vers\u00f5es", "HeaderSaySomethingLike": "Diga Alguma Coisa Como...", "ButtonTryAgain": "Tente Novamente", "HeaderYouSaid": "Voc\u00ea Disse...", @@ -794,5 +797,13 @@ "ButtonManageServer": "Gerenciar Servidor", "ButtonPreferences": "Prefer\u00eancias", "ButtonViewArtist": "Ver artista", - "ButtonViewAlbum": "Ver \u00e1lbum" + "ButtonViewAlbum": "Ver \u00e1lbum", + "ErrorMessagePasswordNotMatchConfirm": "A senha e a confirma\u00e7\u00e3o de senha devem ser iguais.", + "ErrorMessageUsernameInUse": "O nome do usu\u00e1rio j\u00e1 est\u00e1 em uso. Por favor, escolha um novo nome e tente novamente.", + "ErrorMessageEmailInUse": "O endere\u00e7o de email j\u00e1 est\u00e1 em uso. Por favor, digite um novo endere\u00e7o de email e tente novamente ou use o recurso de senha esquecida.", + "MessageThankYouForConnectSignUp": "Obrigado por inscrever-se no Emby Connect. Um email ser\u00e1 enviado para seu endere\u00e7o com as instru\u00e7\u00f5es para confirmar sua nova conta. Por favor, confirme a conta e ent\u00e3o volte aqui para entrar.", + "HeaderShare": "Compartilhar", + "ButtonShareHelp": "Compartilhe uma p\u00e1gina web contendo informa\u00e7\u00f5es de m\u00eddia com uma m\u00eddia social. Os arquivos de m\u00eddia nunca ser\u00e3o compartilhados publicamente.", + "ButtonShare": "Compartilhar", + "HeaderConfirm": "Confirmar" }
\ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/pt-PT.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/pt-PT.json index 7bd49d2d5..6248bb099 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/pt-PT.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/pt-PT.json @@ -6,7 +6,7 @@ "Administrator": "Administrador", "Password": "Senha", "DeleteImage": "Apagar Imagem", - "MessageThankYouForSupporting": "Thank you for supporting Emby.", + "MessageThankYouForSupporting": "Obrigado por suportar o Emby.", "MessagePleaseSupportProject": "Please support Emby.", "DeleteImageConfirmation": "Tem a certeza que deseja apagar a imagem?", "FileReadCancelled": "A leitura do ficheiro foi cancelada.", @@ -35,10 +35,12 @@ "HeaderConfirmation": "Confirmation", "MessageKeyUpdated": "Thank you. Your supporter key has been updated.", "MessageKeyRemoved": "Thank you. Your supporter key has been removed.", - "HeaderSupportTheTeam": "Support the Emby Team", - "TextEnjoyBonusFeatures": "Desfrute dos Extras", + "HeaderSupportTheTeam": "Suporte a Equipa do Emby", + "TextEnjoyBonusFeatures": "Aproveite os Extras", "TitleLiveTV": "TV ao Vivo", + "ButtonCancelSyncJob": "Cancel sync job", "TitleSync": "Sincronizar", + "HeaderSelectDate": "Selecionar Data", "ButtonDonate": "Donate", "LabelRecurringDonationCanBeCancelledHelp": "Doa\u00e7\u00f5es recorrentes podem ser canceladas a qualquer momento dentro da sua conta do PayPal.", "HeaderMyMedia": "My Media", @@ -52,16 +54,16 @@ "ValueTimeLimitSingleHour": "Time limit: 1 hour", "ValueTimeLimitMultiHour": "Time limit: {0} hours", "HeaderUsers": "Utilizadores", - "PluginCategoryGeneral": "General", + "PluginCategoryGeneral": "Geral", "PluginCategoryContentProvider": "Content Providers", "PluginCategoryScreenSaver": "Screen Savers", - "PluginCategoryTheme": "Themes", + "PluginCategoryTheme": "Temas", "PluginCategorySync": "Sincroniza\u00e7\u00e3o", "PluginCategorySocialIntegration": "Social Networks", "PluginCategoryNotifications": "Notifications", - "PluginCategoryMetadata": "Metadata", - "PluginCategoryLiveTV": "Live TV", - "PluginCategoryChannel": "Channels", + "PluginCategoryMetadata": "Metadados", + "PluginCategoryLiveTV": "TV ao Vivo", + "PluginCategoryChannel": "Canais", "HeaderSearch": "Search", "ValueDateCreated": "Date created: {0}", "LabelArtist": "Artist", @@ -72,7 +74,7 @@ "LabelStopping": "Stopping", "LabelCancelled": "(cancelled)", "LabelFailed": "(falhou)", - "ButtonHelp": "Help", + "ButtonHelp": "Ajuda", "ButtonSave": "Guardar", "ButtonDownload": "Download", "SyncJobStatusQueued": "Em lista de espera", @@ -89,8 +91,8 @@ "NewCollectionNameExample": "Exemplo: Cole\u00e7\u00e3o Guerra das Estrelas", "OptionSearchForInternetMetadata": "Procurar na internet por imagens e metadados", "LabelSelectCollection": "Selecione a cole\u00e7\u00e3o:", - "HeaderDevices": "Devices", - "ButtonScheduledTasks": "Scheduled tasks", + "HeaderDevices": "Dispositivos", + "ButtonScheduledTasks": "Tarefas agendadas", "MessageItemsAdded": "Items added", "ButtonAddToCollection": "Add to collection", "HeaderSelectCertificatePath": "Select Certificate Path", @@ -100,10 +102,11 @@ "HeaderWelcomeToProjectServerDashboard": "Welcome to the Emby Server Dashboard", "HeaderWelcomeToProjectWebClient": "Welcome to Emby", "ButtonTakeTheTour": "Fa\u00e7a o tour", - "HeaderWelcomeBack": "Welcome back!", + "HeaderWelcomeBack": "Bem-vindo!", "TitlePlugins": "Extens\u00f5es", "ButtonTakeTheTourToSeeWhatsNew": "Fa\u00e7a o tour para ver as novidades", "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the web interface.", + "ButtonPlayTrailer": "Play trailer", "HeaderLibraryAccess": "Library Access", "HeaderChannelAccess": "Channel Access", "HeaderDeviceAccess": "Device Access", @@ -144,7 +147,6 @@ "ButtonPlay": "Reproduzir", "ButtonEdit": "Editar", "ButtonQueue": "Queue", - "ButtonPlayTrailer": "Reproduzir trailer", "ButtonPlaylist": "Playlist", "ButtonPreviousTrack": "Faixa Anterior", "LabelEnabled": "Enabled", @@ -158,10 +160,10 @@ "MessageInvalidUser": "Invalid username or password. Please try again.", "HeaderLoginFailure": "Login Failure", "HeaderAllRecordings": "Todas as Grava\u00e7\u00f5es", - "RecommendationBecauseYouLike": "Because you like {0}", - "RecommendationBecauseYouWatched": "Because you watched {0}", - "RecommendationDirectedBy": "Directed by {0}", - "RecommendationStarring": "Starring {0}", + "RecommendationBecauseYouLike": "Porque gosta de {0}", + "RecommendationBecauseYouWatched": "Porque viu {0}", + "RecommendationDirectedBy": "Realizado por {0}", + "RecommendationStarring": "{0} como protagonista", "HeaderConfirmRecordingCancellation": "Confirm Recording Cancellation", "MessageConfirmRecordingCancellation": "Are you sure you wish to cancel this recording?", "MessageRecordingCancelled": "Recording cancelled.", @@ -209,7 +211,7 @@ "HeaderMyViews": "My Views", "HeaderLibraryFolders": "Pastas multim\u00e9dia", "HeaderLatestMedia": "Latest Media", - "ButtonMoreItems": "More...", + "ButtonMoreItems": "Mais...", "ButtonMore": "More", "HeaderFavoriteMovies": "Favorite Movies", "HeaderFavoriteShows": "Favorite Shows", @@ -263,6 +265,7 @@ "LabelPlayMethodTranscoding": "Transcoding", "LabelPlayMethodDirectStream": "Direct Streaming", "LabelPlayMethodDirectPlay": "Direct Playing", + "LabelEpisodeNumber": "Episode number:", "LabelAudioCodec": "Audio: {0}", "LabelVideoCodec": "Video: {0}", "LabelLocalAccessUrl": "Local access: {0}", @@ -308,6 +311,7 @@ "HeaderArtist": "Artist", "LabelAddedOnDate": "Added {0}", "ButtonStart": "Start", + "LabelSeasonNumber": "Season number:", "HeaderChannels": "Canais", "HeaderMediaFolders": "Pastas Multim\u00e9dia", "HeaderBlockItemsWithNoRating": "Block content with no rating information:", @@ -336,6 +340,7 @@ "ButtonNextPage": "Next Page", "ButtonPreviousPage": "Previous Page", "ButtonMoveLeft": "Move left", + "OptionReleaseDate": "Release date", "ButtonMoveRight": "Move right", "ButtonBrowseOnlineImages": "Browse online images", "HeaderDeleteItem": "Delete Item", @@ -352,7 +357,7 @@ "ButtonUninstall": "Uninstall", "HeaderFields": "Fields", "HeaderFieldsHelp": "Slide a field to 'off' to lock it and prevent it's data from being changed.", - "HeaderLiveTV": "Live TV", + "HeaderLiveTV": "TV ao Vivo", "MissingLocalTrailer": "Missing local trailer.", "MissingPrimaryImage": "Missing primary image.", "MissingBackdropImage": "Missing backdrop image.", @@ -394,16 +399,16 @@ "LabelPackageInstallFailed": "{0} installation failed.", "LabelPackageInstallCancelled": "{0} installation cancelled.", "TabServer": "Servidor", - "TabUsers": "Users", + "TabUsers": "Utilizadores", "TabLibrary": "Biblioteca", "TabMetadata": "Metadados", "TabDLNA": "DLNA", - "TabLiveTV": "Live TV", - "TabAutoOrganize": "Auto-Organize", - "TabPlugins": "Plugins", + "TabLiveTV": "TV ao Vivo", + "TabAutoOrganize": "Organiza\u00e7\u00e3o Autom\u00e1tica", + "TabPlugins": "Extens\u00f5es", "TabAdvanced": "Avan\u00e7ado", "TabHelp": "Help", - "TabScheduledTasks": "Scheduled Tasks", + "TabScheduledTasks": "Tarefas Agendadas", "ButtonFullscreen": "Ecr\u00e3 cheio", "ButtonAudioTracks": "Faixas de \u00e1udio", "ButtonSubtitles": "Legendas", @@ -428,9 +433,9 @@ "ButtonRemoveFromPlaylist": "Remove from playlist", "HeaderSpecials": "Specials", "HeaderTrailers": "Trailers", - "HeaderAudio": "Audio", + "HeaderAudio": "\u00c1udio", "HeaderResolution": "Resolution", - "HeaderVideo": "Video", + "HeaderVideo": "V\u00eddeo", "HeaderRuntime": "Runtime", "HeaderCommunityRating": "Community rating", "HeaderPasswordReset": "Password Reset", @@ -478,11 +483,8 @@ "PersonTypePerson": "Person", "LabelTitleDisplayOrder": "Title display order:", "OptionSortName": "Sort name", - "OptionReleaseDate": "Data de lan\u00e7amento", - "LabelSeasonNumber": "N\u00famero da temporada:", "LabelDiscNumber": "Disc number", "LabelParentNumber": "Parent number", - "LabelEpisodeNumber": "N\u00famero do epis\u00f3dio:", "LabelTrackNumber": "Track number:", "LabelNumber": "Number:", "LabelReleaseDate": "Release date:", @@ -507,14 +509,14 @@ "LabelContentTypeValue": "Content type: {0}", "LabelPathSubstitutionHelp": "Optional: Path substitution can map server paths to network shares that clients can access for direct playback.", "FolderTypeUnset": "Unset (mixed content)", - "FolderTypeMovies": "Movies", - "FolderTypeMusic": "Music", - "FolderTypeAdultVideos": "Adult videos", - "FolderTypePhotos": "Photos", - "FolderTypeMusicVideos": "Music videos", - "FolderTypeHomeVideos": "Home videos", - "FolderTypeGames": "Games", - "FolderTypeBooks": "Books", + "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", "TabMovies": "Filmes", "TabSeries": "S\u00e9ries", @@ -697,7 +699,7 @@ "DashboardTourMobile": "The Emby Server dashboard works great on smartphones and tablets. Manage your server from the palm of your hand anytime, anywhere.", "DashboardTourSync": "Sync your personal media to your devices for offline viewing.", "MessageRefreshQueued": "Refresh queued", - "TabDevices": "Devices", + "TabDevices": "Dispositivos", "TabExtras": "Extras", "DeviceLastUsedByUserName": "Last used by {0}", "HeaderDeleteDevice": "Delete Device", @@ -785,6 +787,7 @@ "HeaderMedia": "Media", "ButtonInbox": "Inbox", "HeaderAdvanced": "Avan\u00e7ado", + "HeaderGroupVersions": "Group Versions", "HeaderSaySomethingLike": "Say Something Like...", "ButtonTryAgain": "Try Again", "HeaderYouSaid": "You Said...", @@ -794,5 +797,13 @@ "ButtonManageServer": "Manage Server", "ButtonPreferences": "Preferences", "ButtonViewArtist": "View artist", - "ButtonViewAlbum": "View album" + "ButtonViewAlbum": "View album", + "ErrorMessagePasswordNotMatchConfirm": "The password and password confirmation must match.", + "ErrorMessageUsernameInUse": "The username is already in use. Please choose a new name and try again.", + "ErrorMessageEmailInUse": "The email address is already in use. Please enter a new email address and try again, or use the forgot password feature.", + "MessageThankYouForConnectSignUp": "Thank you for signing up for Emby Connect. An email will be sent to your address with instructions on how to confirm your new account. Please confirm the account and then return here to sign in.", + "HeaderShare": "Share", + "ButtonShareHelp": "Share a web page containing media information with social media. Media files are never shared publicly.", + "ButtonShare": "Share", + "HeaderConfirm": "Confirm" }
\ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/ro.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/ro.json index ea9bc12c7..ee4c6610e 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/ro.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/ro.json @@ -38,7 +38,9 @@ "HeaderSupportTheTeam": "Support the Emby Team", "TextEnjoyBonusFeatures": "Bucura\u021bi-v\u0103 de caracteristicile Bonus", "TitleLiveTV": "Live TV", + "ButtonCancelSyncJob": "Cancel sync job", "TitleSync": "Sync", + "HeaderSelectDate": "Select Date", "ButtonDonate": "Donate", "LabelRecurringDonationCanBeCancelledHelp": "Dona\u021biile recurente pot fi anulate \u00een orice moment din contul dvs. PayPal.", "HeaderMyMedia": "My Media", @@ -104,6 +106,7 @@ "TitlePlugins": "Plugin-uri", "ButtonTakeTheTourToSeeWhatsNew": "Take the tour to see what's new", "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the web interface.", + "ButtonPlayTrailer": "Play trailer", "HeaderLibraryAccess": "Library Access", "HeaderChannelAccess": "Channel Access", "HeaderDeviceAccess": "Accesul Dispozitivelor", @@ -144,7 +147,6 @@ "ButtonPlay": "Play", "ButtonEdit": "Edit", "ButtonQueue": "Queue", - "ButtonPlayTrailer": "Ruleaza trailer", "ButtonPlaylist": "Playlist", "ButtonPreviousTrack": "Pista anterioara", "LabelEnabled": "Enabled", @@ -263,6 +265,7 @@ "LabelPlayMethodTranscoding": "Transcoding", "LabelPlayMethodDirectStream": "Direct Streaming", "LabelPlayMethodDirectPlay": "Direct Playing", + "LabelEpisodeNumber": "Episode number:", "LabelAudioCodec": "Audio: {0}", "LabelVideoCodec": "Video: {0}", "LabelLocalAccessUrl": "Local access: {0}", @@ -308,6 +311,7 @@ "HeaderArtist": "Artist", "LabelAddedOnDate": "Added {0}", "ButtonStart": "Start", + "LabelSeasonNumber": "Season number:", "HeaderChannels": "Channels", "HeaderMediaFolders": "Media Folders", "HeaderBlockItemsWithNoRating": "Block content with no rating information:", @@ -336,6 +340,7 @@ "ButtonNextPage": "Next Page", "ButtonPreviousPage": "Previous Page", "ButtonMoveLeft": "Move left", + "OptionReleaseDate": "Release date", "ButtonMoveRight": "Move right", "ButtonBrowseOnlineImages": "Browse online images", "HeaderDeleteItem": "Delete Item", @@ -478,11 +483,8 @@ "PersonTypePerson": "Person", "LabelTitleDisplayOrder": "Title display order:", "OptionSortName": "Sort name", - "OptionReleaseDate": "Data lansare", - "LabelSeasonNumber": "Season number:", "LabelDiscNumber": "Disc number", "LabelParentNumber": "Parent number", - "LabelEpisodeNumber": "Episode number:", "LabelTrackNumber": "Track number:", "LabelNumber": "Number:", "LabelReleaseDate": "Release date:", @@ -785,6 +787,7 @@ "HeaderMedia": "Media", "ButtonInbox": "Inbox", "HeaderAdvanced": "Advanced", + "HeaderGroupVersions": "Group Versions", "HeaderSaySomethingLike": "Say Something Like...", "ButtonTryAgain": "Try Again", "HeaderYouSaid": "You Said...", @@ -794,5 +797,13 @@ "ButtonManageServer": "Manage Server", "ButtonPreferences": "Preferences", "ButtonViewArtist": "View artist", - "ButtonViewAlbum": "View album" + "ButtonViewAlbum": "View album", + "ErrorMessagePasswordNotMatchConfirm": "The password and password confirmation must match.", + "ErrorMessageUsernameInUse": "The username is already in use. Please choose a new name and try again.", + "ErrorMessageEmailInUse": "The email address is already in use. Please enter a new email address and try again, or use the forgot password feature.", + "MessageThankYouForConnectSignUp": "Thank you for signing up for Emby Connect. An email will be sent to your address with instructions on how to confirm your new account. Please confirm the account and then return here to sign in.", + "HeaderShare": "Share", + "ButtonShareHelp": "Share a web page containing media information with social media. Media files are never shared publicly.", + "ButtonShare": "Share", + "HeaderConfirm": "Confirm" }
\ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/ru.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/ru.json index 89d021ed4..7b4d0f7ae 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/ru.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/ru.json @@ -36,16 +36,18 @@ "MessageKeyUpdated": "\u041a\u043b\u044e\u0447 \u0441\u043f\u043e\u043d\u0441\u043e\u0440\u0430 \u0431\u044b\u043b \u043e\u0431\u043d\u043e\u0432\u043b\u0451\u043d.", "MessageKeyRemoved": "\u041a\u043b\u044e\u0447 \u0441\u043f\u043e\u043d\u0441\u043e\u0440\u0430 \u0431\u044b\u043b \u0443\u0434\u0430\u043b\u0451\u043d.", "HeaderSupportTheTeam": "\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0442\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u0443 Emby", - "TextEnjoyBonusFeatures": "\u0412\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435\u0441\u044c \u0431\u043e\u043d\u0443\u0441\u043d\u044b\u043c\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c\u0438", + "TextEnjoyBonusFeatures": "\u041f\u043e\u043b\u0443\u0447\u0438\u0442\u0435 \u0431\u043e\u043d\u0443\u0441\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438", "TitleLiveTV": "\u0422\u0412-\u044d\u0444\u0438\u0440", + "ButtonCancelSyncJob": "\u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044e", "TitleSync": "\u0421\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044f", + "HeaderSelectDate": "\u0412\u044b\u0431\u043e\u0440 \u0434\u0430\u0442\u044b", "ButtonDonate": "\u041f\u043e\u0436\u0435\u0440\u0442\u0432\u043e\u0432\u0430\u0442\u044c", "LabelRecurringDonationCanBeCancelledHelp": "\u0420\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u044b\u0435 \u043f\u043e\u0436\u0435\u0440\u0442\u0432\u043e\u0432\u0430\u043d\u0438\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0432 \u043b\u044e\u0431\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u0447\u0435\u0440\u0435\u0437 \u0432\u0430\u0448\u0443 \u0443\u0447\u0451\u0442\u043d\u0443\u044e \u0437\u0430\u043f\u0438\u0441\u044c PayPal.", "HeaderMyMedia": "\u041c\u043e\u0438 \u043c\u0435\u0434\u0438\u0430\u0434\u0430\u043d\u043d\u044b\u0435", "TitleNotifications": "\u0423\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u044f", "ErrorLaunchingChromecast": "\u041f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0430 \u043e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 Chromecast. \u0423\u0431\u0435\u0434\u0438\u0442\u0435\u0441\u044c, \u0447\u0442\u043e \u0432\u0430\u0448\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043e \u043a \u0431\u0435\u0441\u043f\u0440\u043e\u0432\u043e\u0434\u043d\u043e\u0439 \u0441\u0435\u0442\u0438.", "MessageErrorLoadingSupporterInfo": "\u041f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0430 \u043e\u0448\u0438\u0431\u043a\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u0441\u043f\u043e\u043d\u0441\u043e\u0440\u0435. \u041f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u0435 \u043f\u043e\u043f\u044b\u0442\u043a\u0443 \u043f\u043e\u0437\u0436\u0435.", - "MessageLinkYourSupporterKey": "\u0421\u0432\u044f\u0436\u0438\u0442\u0435 \u0432\u0430\u0448 \u043a\u043b\u044e\u0447 \u0441\u043f\u043e\u043d\u0441\u043e\u0440\u0430 \u0441\u043e \u0432\u043f\u043b\u043e\u0442\u044c \u0434\u043e {0} \u0447\u043b\u0435\u043d\u043e\u0432 Emby Connect, \u0447\u0442\u043e\u0431\u044b \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u044b\u043c \u0434\u043e\u0441\u0442\u0443\u043f\u043e\u043c \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u043c:", + "MessageLinkYourSupporterKey": "\u0421\u0432\u044f\u0436\u0438\u0442\u0435 \u0432\u0430\u0448 \u043a\u043b\u044e\u0447 \u0441\u043f\u043e\u043d\u0441\u043e\u0440\u0430 \u0441\u043e \u0432\u043f\u043b\u043e\u0442\u044c \u0434\u043e {0} \u0447\u043b\u0435\u043d\u043e\u0432 Emby Connect, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u044b\u0439 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u043c:", "HeaderConfirmRemoveUser": "\u0418\u0437\u044a\u044f\u0442\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f", "MessageSwipeDownOnRemoteControl": "\u041d\u0430\u0447\u0430\u043b\u043e \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0443\u0434\u0430\u043b\u0451\u043d\u043d\u044b\u043c \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c. \u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c\u043e\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e, \u043d\u0430\u0436\u0430\u0432 \u043d\u0430 \u0437\u043d\u0430\u0447\u043e\u043a \u043a\u0430\u0441\u0442\u0430 \u0432 \u043f\u0440\u0430\u0432\u043e\u043c \u0432\u0435\u0440\u0445\u043d\u0435\u043c \u0443\u0433\u043b\u0443. \u041f\u0440\u043e\u0432\u0435\u0434\u0438\u0442\u0435 \u0432\u043d\u0438\u0437 \u0432 \u043b\u044e\u0431\u043e\u043c \u043c\u0435\u0441\u0442\u0435 \u043d\u0430 \u0434\u0430\u043d\u043d\u043e\u043c \u044d\u043a\u0440\u0430\u043d\u0435, \u0447\u0442\u043e\u0431\u044b \u0432\u0435\u0440\u043d\u0443\u0442\u044c\u0441\u044f \u0442\u0443\u0434\u0430, \u043e\u0442\u043a\u0443\u0434\u0430 \u0432\u044b \u043f\u0440\u0438\u0448\u043b\u0438.", "MessageConfirmRemoveConnectSupporter": "\u0412\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0438\u0437\u044a\u044f\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430 \u0441\u043f\u043e\u043d\u0441\u043e\u0440\u0430 \u043e\u0442 \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f?", @@ -104,6 +106,7 @@ "TitlePlugins": "\u041f\u043b\u0430\u0433\u0438\u043d\u044b", "ButtonTakeTheTourToSeeWhatsNew": "\u041e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 \u043d\u043e\u0432\u0430\u0446\u0438\u044f\u043c\u0438", "MessageNoSyncJobsFound": "\u0417\u0430\u0434\u0430\u043d\u0438\u0439 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e. \u0421\u043e\u0437\u0434\u0430\u0439\u0442\u0435 \u0437\u0430\u0434\u0430\u043d\u0438\u0435 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043d\u043e\u043f\u043e\u043a \u0421\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u043d\u0430\u0445\u043e\u0434\u044f\u0449\u0438\u0445\u0441\u044f \u043f\u043e \u0432\u0441\u0435\u043c\u0443 \u0432\u0435\u0431-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0443.", + "ButtonPlayTrailer": "\u0412\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0441\u0442\u0438 \u0442\u0440\u0435\u0439\u043b\u0435\u0440", "HeaderLibraryAccess": "\u0414\u043e\u0441\u0442\u0443\u043f \u043a \u043c\u0435\u0434\u0438\u0430\u0442\u0435\u043a\u0435", "HeaderChannelAccess": "\u0414\u043e\u0441\u0442\u0443\u043f \u043a\u043e \u043a\u0430\u043d\u0430\u043b\u0430\u043c", "HeaderDeviceAccess": "\u0414\u043e\u0441\u0442\u0443\u043f \u0441 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430", @@ -141,10 +144,9 @@ "ButtonStop": "\u041e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c", "ButtonNextTrack": "\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u0434\u043e\u0440\u043e\u0436\u043a\u0430...", "ButtonPause": "\u041f\u0440\u0438\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c", - "ButtonPlay": "\u0412\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0441\u0442\u0438", + "ButtonPlay": "\u0412\u043e\u0441\u043f\u0440.", "ButtonEdit": "\u041f\u0440\u0430\u0432\u0438\u0442\u044c", "ButtonQueue": "\u0412 \u043e\u0447\u0435\u0440\u0435\u0434\u044c...", - "ButtonPlayTrailer": "\u0412\u043e\u0441\u043f\u0440. \u0442\u0440\u0435\u0439\u043b\u0435\u0440", "ButtonPlaylist": "\u0421\u043f\u0438\u0441\u043e\u043a \u0432\u043e\u0441\u043f\u0440-\u0438\u044f...", "ButtonPreviousTrack": "\u041f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0430\u044f \u0434\u043e\u0440\u043e\u0436\u043a\u0430...", "LabelEnabled": "\u0412\u043a\u043b\u044e\u0447\u0435\u043d\u043e", @@ -263,6 +265,7 @@ "LabelPlayMethodTranscoding": "\u041f\u0435\u0440\u0435\u043a\u043e\u0434\u0438\u0440\u0443\u0435\u0442\u0441\u044f", "LabelPlayMethodDirectStream": "\u0422\u0440\u0430\u043d\u0441\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e", "LabelPlayMethodDirectPlay": "\u0412\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e", + "LabelEpisodeNumber": "\u041d\u043e\u043c\u0435\u0440 \u044d\u043f\u0438\u0437\u043e\u0434\u0430", "LabelAudioCodec": "\u0410\u0443\u0434\u0438\u043e: {0}", "LabelVideoCodec": "\u0412\u0438\u0434\u0435\u043e: {0}", "LabelLocalAccessUrl": "\u041b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0434\u043e\u0441\u0442\u0443\u043f: {0}", @@ -308,6 +311,7 @@ "HeaderArtist": "\u0418\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c", "LabelAddedOnDate": "\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043e {0}", "ButtonStart": "\u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c", + "LabelSeasonNumber": "\u041d\u043e\u043c\u0435\u0440 \u0441\u0435\u0437\u043e\u043d\u0430:", "HeaderChannels": "\u041a\u0430\u043d\u0430\u043b\u044b", "HeaderMediaFolders": "\u041c\u0435\u0434\u0438\u0430\u043f\u0430\u043f\u043a\u0438", "HeaderBlockItemsWithNoRating": "\u0411\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u044f \u0431\u0435\u0437 \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u043d\u043e\u0439 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438:", @@ -336,6 +340,7 @@ "ButtonNextPage": "\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430...", "ButtonPreviousPage": "\u041f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0430\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430...", "ButtonMoveLeft": "\u0414\u0432\u0438\u0433\u0430\u0442\u044c \u0432\u043b\u0435\u0432\u043e", + "OptionReleaseDate": "\u0414\u0430\u0442\u0430 \u0432\u044b\u043f\u0443\u0441\u043a\u0430", "ButtonMoveRight": "\u0414\u0432\u0438\u0433\u0430\u0442\u044c \u0432\u043f\u0440\u0430\u0432\u043e", "ButtonBrowseOnlineImages": "\u0421\u043c. \u0440\u0438\u0441\u0443\u043d\u043a\u0438 \u0432 \u0441\u0435\u0442\u0438", "HeaderDeleteItem": "\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430", @@ -451,7 +456,7 @@ "OptionCollections": "\u041a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438", "OptionSeries": "\u0422\u0412-\u0441\u0435\u0440\u0438\u0430\u043b\u044b", "OptionSeasons": "\u0422\u0412-\u0441\u0435\u0437\u043e\u043d\u044b", - "OptionEpisodes": "\u042d\u043f\u0438\u0437\u043e\u0434\u044b", + "OptionEpisodes": "\u0422\u0412-\u044d\u043f\u0438\u0437\u043e\u0434\u044b", "OptionGames": "\u0418\u0433\u0440\u044b", "OptionGameSystems": "\u0418\u0433\u0440\u043e\u0432\u044b\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b", "OptionMusicArtists": "\u041c\u0443\u0437\u044b\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u0438\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u0438", @@ -472,17 +477,14 @@ "LabelImageFetchers": "\u041e\u0442\u0431\u043e\u0440\u0449\u0438\u043a\u0438 \u0440\u0438\u0441\u0443\u043d\u043a\u043e\u0432:", "LabelImageFetchersHelp": "\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u0435 \u0438 \u0440\u0430\u043d\u0436\u0438\u0440\u0443\u0439\u0442\u0435 \u043f\u0440\u0435\u0434\u043f\u043e\u0447\u0438\u0442\u0430\u0435\u043c\u044b\u0435 \u043e\u0442\u0431\u043e\u0440\u0449\u0438\u043a\u0438 \u0440\u0438\u0441\u0443\u043d\u043a\u043e\u0432 \u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442\u0430.", "ButtonQueueAllFromHere": "\u0412 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0432\u0441\u0435 \u043e\u0442\u0441\u044e\u0434\u0430", - "ButtonPlayAllFromHere": "\u0412\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0441\u0442\u0438 \u0432\u0441\u0435 \u043e\u0442\u0441\u044e\u0434\u0430", + "ButtonPlayAllFromHere": "\u0412\u043e\u0441\u043f\u0440. \u0432\u0441\u0435 \u043e\u0442\u0441\u044e\u0434\u0430", "LabelDynamicExternalId": "{0} Id:", "HeaderIdentify": "\u0420\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430", "PersonTypePerson": "\u041f\u0435\u0440\u0441\u043e\u043d\u0430", "LabelTitleDisplayOrder": "\u041f\u043e\u0440\u044f\u0434\u043e\u043a \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0439:", "OptionSortName": "\u0421\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c\u043e\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435", - "OptionReleaseDate": "\u0414\u0430\u0442\u0430 \u0432\u044b\u043f\u0443\u0441\u043a\u0430", - "LabelSeasonNumber": "\u041d\u043e\u043c\u0435\u0440 \u0441\u0435\u0437\u043e\u043d\u0430:", "LabelDiscNumber": "\u041d\u043e\u043c\u0435\u0440 \u0434\u0438\u0441\u043a\u0430", "LabelParentNumber": "\u0420\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u043d\u043e\u043c\u0435\u0440", - "LabelEpisodeNumber": "\u041d\u043e\u043c\u0435\u0440 \u044d\u043f\u0438\u0437\u043e\u0434\u0430:", "LabelTrackNumber": "\u041d\u043e\u043c\u0435\u0440 \u0434\u043e\u0440\u043e\u0436\u043a\u0438:", "LabelNumber": "\u041d\u043e\u043c\u0435\u0440:", "LabelReleaseDate": "\u0414\u0430\u0442\u0430 \u0432\u044b\u043f\u0443\u0441\u043a\u0430:", @@ -678,7 +680,7 @@ "WebClientTourPlaylists": "\u0411\u0435\u0437 \u0443\u0441\u0438\u043b\u0438\u0439 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u043f\u0438\u0441\u043a\u0438 \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0438 \u0430\u0432\u0442\u043e\u043c\u0438\u043a\u0441\u044b, \u0438 \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435 \u0438\u0445 \u043d\u0430 \u043b\u044e\u0431\u043e\u043c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0435", "WebClientTourCollections": "\u0421\u043e\u0437\u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0444\u0438\u043b\u044c\u043c\u043e\u0432\u044b\u0435 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438, \u0447\u0442\u043e\u0431\u044b \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043c\u043f\u043b\u0435\u043a\u0442\u044b \u0432\u043c\u0435\u0441\u0442\u0435", "WebClientTourUserPreferences1": "\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0441\u043f\u043e\u0441\u043e\u0431, \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043c\u0435\u0434\u0438\u0430\u0442\u0435\u043a\u0430 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0430 \u0432\u043e \u0432\u0441\u0435\u0445 \u0432\u0430\u0448\u0438\u0445 Emby-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u0445.", - "WebClientTourUserPreferences2": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u0442\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0430\u0443\u0434\u0438\u043e \u0438 \u0441\u0443\u0431\u0442\u0438\u0442\u0440\u043e\u0432 \u0441\u0432\u043e\u0435\u0433\u043e \u044f\u0437\u044b\u043a\u0430 \u0435\u0434\u0438\u043d\u043e\u0436\u0434\u044b, \u0434\u043b\u044f \u0432\u0441\u044f\u043a\u043e\u0433\u043e Emby-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f", + "WebClientTourUserPreferences2": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u0442\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0430\u0443\u0434\u0438\u043e \u0438 \u0441\u0443\u0431\u0442\u0438\u0442\u0440\u043e\u0432 \u0441\u0432\u043e\u0435\u0433\u043e \u044f\u0437\u044b\u043a\u0430, \u0435\u0434\u0438\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e Emby-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f", "WebClientTourUserPreferences3": "\u041e\u0444\u043e\u0440\u044c\u043c\u0442\u0435 \u0433\u043b\u0430\u0432\u043d\u0443\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u0432\u0435\u0431-\u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u043f\u043e \u0441\u0432\u043e\u0438\u043c \u043f\u0440\u0435\u0434\u043f\u043e\u0447\u0442\u0435\u043d\u0438\u044f\u043c", "WebClientTourUserPreferences4": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u0442\u0435 \u0437\u0430\u0434\u043d\u0438\u043a\u0438, \u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043c\u0435\u043b\u043e\u0434\u0438\u0438 \u0438 \u0432\u043d\u0435\u0448\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0433\u0440\u044b\u0432\u0430\u0442\u0435\u043b\u0438", "WebClientTourMobile1": "\u0412\u0435\u0431-\u043a\u043b\u0438\u0435\u043d\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043e\u0442\u043b\u0438\u0447\u043d\u043e \u043d\u0430 \u0441\u043c\u0430\u0440\u0442\u0444\u043e\u043d\u0430\u0445 \u0438 \u043f\u043b\u0430\u043d\u0448\u0435\u0442\u0430\u0445...", @@ -776,8 +778,8 @@ "ButtonUnlockWithSupporter": "\u0412\u043e\u0439\u0442\u0438 \u0441 \u0447\u043b\u0435\u043d\u0441\u0442\u0432\u043e\u043c \u0441\u043f\u043e\u043d\u0441\u043e\u0440\u0430 Emby", "MessagePleaseSignInLocalNetwork": "\u041f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u0442\u044c, \u0443\u0431\u0435\u0434\u0438\u0442\u0435\u0441\u044c, \u0447\u0442\u043e \u0432\u044b \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u044b \u043a \u0432\u0430\u0448\u0435\u0439 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0435\u0442\u0438 \u0447\u0435\u0440\u0435\u0437 Wifi- \u0438\u043b\u0438 LAN-\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435.", "ButtonUnlockWithPurchase": "\u0420\u0430\u0437\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043e\u043c \u043e\u043f\u043b\u0430\u0442\u044b", - "ButtonUnlockPrice": "Unlock {0}", - "MessageLiveTvGuideRequiresUnlock": "\u0413\u0438\u0434 \u044d\u0444\u0438\u0440\u043d\u043e\u0433\u043e \u0422\u0412 \u0432 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f {0} \u043a\u0430\u043d\u0430\u043b\u0430\u043c\u0438. \u041d\u0430\u0436\u043c\u0438\u0442\u0435 \u043a\u043d\u043e\u043f\u043a\u0443 \u0440\u0430\u0437\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0447\u0442\u043e\u0431\u044b \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u043e\u043b\u043d\u044b\u043c\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044f\u043c\u0438.", + "ButtonUnlockPrice": "\u0420\u0430\u0437\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c {0}", + "MessageLiveTvGuideRequiresUnlock": "\u0413\u0438\u0434 \u044d\u0444\u0438\u0440\u043d\u043e\u0433\u043e \u0422\u0412 \u0432 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d \u0434\u043e {0} \u043a\u0430\u043d\u0430\u043b\u043e\u0432. \u041d\u0430\u0436\u043c\u0438\u0442\u0435 \u043a\u043d\u043e\u043f\u043a\u0443 \u0440\u0430\u0437\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043f\u043e\u043b\u043d\u044b\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438.", "OptionEnableFullscreen": "\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043f\u043e\u043b\u043d\u044b\u0439 \u044d\u043a\u0440\u0430\u043d", "ButtonServer": "\u0421\u0435\u0440\u0432\u0435\u0440...", "HeaderAdmin": "\u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435", @@ -785,14 +787,23 @@ "HeaderMedia": "\u041c\u0435\u0434\u0438\u0430\u0434\u0430\u043d\u043d\u044b\u0435", "ButtonInbox": "\u0412\u0445\u043e\u0434\u044f\u0449\u0438\u0435...", "HeaderAdvanced": "\u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u043d\u043e\u0435", - "HeaderSaySomethingLike": "Say Something Like...", - "ButtonTryAgain": "Try Again", - "HeaderYouSaid": "You Said...", - "MessageWeDidntRecognizeCommand": "We're sorry, we didn't recognize that command.", - "MessageIfYouBlockedVoice": "If you denied voice access to the app you'll need to reconfigure before trying again.", - "MessageNoItemsFound": "No items found.", - "ButtonManageServer": "Manage Server", - "ButtonPreferences": "Preferences", - "ButtonViewArtist": "View artist", - "ButtonViewAlbum": "View album" + "HeaderGroupVersions": "\u0421\u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0435\u0440\u0441\u0438\u0438", + "HeaderSaySomethingLike": "\u0421\u043a\u0430\u0436\u0438\u0442\u0435 \u0447\u0442\u043e-\u0442\u043e \u0432\u0440\u043e\u0434\u0435...", + "ButtonTryAgain": "\u041f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0441\u043d\u043e\u0432\u0430", + "HeaderYouSaid": "\u0412\u044b \u0441\u043a\u0430\u0437\u0430\u043b\u0438...", + "MessageWeDidntRecognizeCommand": "\u0414\u0430\u043d\u043d\u0430\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u043d\u0435 \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u043d\u0430.", + "MessageIfYouBlockedVoice": "\u0415\u0441\u043b\u0438 \u043e\u0442\u043a\u0430\u0437\u0430\u043d\u043e \u0432 \u0433\u043e\u043b\u043e\u0441\u043e\u0432\u043e\u043c \u0434\u043e\u0441\u0442\u0443\u043f\u0435 \u043a \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044e, \u043f\u0435\u0440\u0435\u0434 \u043d\u043e\u0432\u043e\u0439 \u043f\u043e\u043f\u044b\u0442\u043a\u043e\u0439 \u0432\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0430 \u043f\u0435\u0440\u0435\u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430.", + "MessageNoItemsFound": "\u041d\u0438\u043a\u0430\u043a\u0438\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e.", + "ButtonManageServer": "\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c...", + "ButtonPreferences": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438", + "ButtonViewArtist": "\u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044f", + "ButtonViewAlbum": "\u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0430\u043b\u044c\u0431\u043e\u043c", + "ErrorMessagePasswordNotMatchConfirm": "\u041f\u043e\u043b\u044f \u041f\u0430\u0440\u043e\u043b\u044c \u0438 \u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435 \u043f\u0430\u0440\u043e\u043b\u044f \u0434\u043e\u043b\u0436\u043d\u044b \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0442\u044c.", + "ErrorMessageUsernameInUse": "\u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0443\u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f. \u041f\u043e\u0434\u0431\u0435\u0440\u0438\u0442\u0435 \u043d\u043e\u0432\u043e\u0435 \u0438 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u0441\u043d\u043e\u0432\u0430.", + "ErrorMessageEmailInUse": "\u0410\u0434\u0440\u0435\u0441 \u042d-\u043f\u043e\u0447\u0442\u044b \u0443\u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f. \u041f\u043e\u0434\u0431\u0435\u0440\u0438\u0442\u0435 \u043d\u043e\u0432\u044b\u0439 \u0430\u0434\u0440\u0435\u0441 \u042d-\u043f\u043e\u0447\u0442\u044b \u0438 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u0441\u043d\u043e\u0432\u0430, \u0438\u043b\u0438 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435\u0441\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 \u041d\u0430\u043f\u043e\u043c\u043d\u0438\u0442\u044c \u043f\u0430\u0440\u043e\u043b\u044c.", + "MessageThankYouForConnectSignUp": "\u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u0438\u043c \u0437\u0430 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044e \u0432 Emby Connect. \u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u042d-\u043f\u043e\u0447\u0442\u044b \u0441 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f\u043c\u0438 \u043a\u0430\u043a \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u044c \u0432\u0430\u0448\u0443 \u043d\u043e\u0432\u0443\u044e \u0443\u0447\u0451\u0442\u043d\u0443\u044e \u0437\u0430\u043f\u0438\u0441\u044c \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043e \u043d\u0430 \u0432\u0430\u0448 \u0430\u0434\u0440\u0435\u0441. \u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435 \u0443\u0447\u0451\u0442\u043d\u0443\u044e \u0437\u0430\u043f\u0438\u0441\u044c, \u0430 \u043f\u043e\u0442\u043e\u043c \u0432\u0435\u0440\u043d\u0438\u0442\u0435\u0441\u044c \u0441\u044e\u0434\u0430, \u0447\u0442\u043e\u0431\u044b \u0432\u043e\u0439\u0442\u0438.", + "HeaderShare": "\u041e\u0431\u0449\u0438\u0439 \u0434\u043e\u0441\u0442\u0443\u043f", + "ButtonShareHelp": "\u041f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043e\u0431\u0449\u0438\u0439 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0432\u0435\u0431-\u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435 \u0441\u043e \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u044f\u043c\u0438 \u043e \u043c\u0435\u0434\u0438\u0430\u0434\u0430\u043d\u043d\u044b\u0445, \u0434\u043b\u044f \u0441\u043e\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u0435\u0442\u0435\u0439. \u041c\u0435\u0434\u0438\u0430\u0444\u0430\u0439\u043b\u044b \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u0432 \u043e\u0431\u0449\u0435\u043c \u0434\u043e\u0441\u0442\u0443\u043f\u0435.", + "ButtonShare": "\u041f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f", + "HeaderConfirm": "\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435" }
\ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/sl-SI.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/sl-SI.json index 1e9b880f1..3b3b2d185 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/sl-SI.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/sl-SI.json @@ -38,7 +38,9 @@ "HeaderSupportTheTeam": "Support the Emby Team", "TextEnjoyBonusFeatures": "Enjoy Bonus Features", "TitleLiveTV": "Live TV", + "ButtonCancelSyncJob": "Cancel sync job", "TitleSync": "Sync", + "HeaderSelectDate": "Select Date", "ButtonDonate": "Donate", "LabelRecurringDonationCanBeCancelledHelp": "Recurring donations can be cancelled at any time from within your PayPal account.", "HeaderMyMedia": "My Media", @@ -104,6 +106,7 @@ "TitlePlugins": "Plugins", "ButtonTakeTheTourToSeeWhatsNew": "Take the tour to see what's new", "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the web interface.", + "ButtonPlayTrailer": "Play trailer", "HeaderLibraryAccess": "Library Access", "HeaderChannelAccess": "Channel Access", "HeaderDeviceAccess": "Device Access", @@ -144,7 +147,6 @@ "ButtonPlay": "Play", "ButtonEdit": "Edit", "ButtonQueue": "Queue", - "ButtonPlayTrailer": "Predvajaj napovednik", "ButtonPlaylist": "Playlist", "ButtonPreviousTrack": "Previous Track", "LabelEnabled": "Enabled", @@ -263,6 +265,7 @@ "LabelPlayMethodTranscoding": "Transcoding", "LabelPlayMethodDirectStream": "Direct Streaming", "LabelPlayMethodDirectPlay": "Direct Playing", + "LabelEpisodeNumber": "Episode number:", "LabelAudioCodec": "Audio: {0}", "LabelVideoCodec": "Video: {0}", "LabelLocalAccessUrl": "Local access: {0}", @@ -308,6 +311,7 @@ "HeaderArtist": "Artist", "LabelAddedOnDate": "Added {0}", "ButtonStart": "Start", + "LabelSeasonNumber": "Season number:", "HeaderChannels": "Channels", "HeaderMediaFolders": "Media Folders", "HeaderBlockItemsWithNoRating": "Block content with no rating information:", @@ -336,6 +340,7 @@ "ButtonNextPage": "Next Page", "ButtonPreviousPage": "Previous Page", "ButtonMoveLeft": "Move left", + "OptionReleaseDate": "Release date", "ButtonMoveRight": "Move right", "ButtonBrowseOnlineImages": "Browse online images", "HeaderDeleteItem": "Delete Item", @@ -478,11 +483,8 @@ "PersonTypePerson": "Person", "LabelTitleDisplayOrder": "Title display order:", "OptionSortName": "Sort name", - "OptionReleaseDate": "Datum izdaje", - "LabelSeasonNumber": "Season number:", "LabelDiscNumber": "Disc number", "LabelParentNumber": "Parent number", - "LabelEpisodeNumber": "Episode number:", "LabelTrackNumber": "Track number:", "LabelNumber": "Number:", "LabelReleaseDate": "Release date:", @@ -741,7 +743,7 @@ "LabelQuality": "Kvaliteta:", "HeaderSettings": "Nastavitve", "OptionAutomaticallySyncNewContent": "Samodejno sinhroniziraj nove vsebine", - "OptionAutomaticallySyncNewContentHelp": "Nova vsebina, dodana v to kategorijo, bo samodejno sinhronizirana v napravo", + "OptionAutomaticallySyncNewContentHelp": "New content added to will be automatically synced to the device.", "OptionSyncUnwatchedVideosOnly": "Sync unwatched videos only", "OptionSyncUnwatchedVideosOnlyHelp": "Only unwatched videos will be synced, and videos will be removed from the device as they are watched.", "LabelItemLimit": "Item limit:", @@ -785,6 +787,7 @@ "HeaderMedia": "Media", "ButtonInbox": "Inbox", "HeaderAdvanced": "Advanced", + "HeaderGroupVersions": "Group Versions", "HeaderSaySomethingLike": "Say Something Like...", "ButtonTryAgain": "Try Again", "HeaderYouSaid": "You Said...", @@ -794,5 +797,13 @@ "ButtonManageServer": "Manage Server", "ButtonPreferences": "Preferences", "ButtonViewArtist": "View artist", - "ButtonViewAlbum": "View album" + "ButtonViewAlbum": "View album", + "ErrorMessagePasswordNotMatchConfirm": "The password and password confirmation must match.", + "ErrorMessageUsernameInUse": "The username is already in use. Please choose a new name and try again.", + "ErrorMessageEmailInUse": "The email address is already in use. Please enter a new email address and try again, or use the forgot password feature.", + "MessageThankYouForConnectSignUp": "Thank you for signing up for Emby Connect. An email will be sent to your address with instructions on how to confirm your new account. Please confirm the account and then return here to sign in.", + "HeaderShare": "Share", + "ButtonShareHelp": "Share a web page containing media information with social media. Media files are never shared publicly.", + "ButtonShare": "Share", + "HeaderConfirm": "Confirm" }
\ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/sv.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/sv.json index a0b866b3d..a5a6cd4c0 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/sv.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/sv.json @@ -38,7 +38,9 @@ "HeaderSupportTheTeam": "Support the Emby Team", "TextEnjoyBonusFeatures": "Enjoy Bonus Features", "TitleLiveTV": "Live-TV", + "ButtonCancelSyncJob": "Cancel sync job", "TitleSync": "Sync", + "HeaderSelectDate": "Select Date", "ButtonDonate": "Donera", "LabelRecurringDonationCanBeCancelledHelp": "St\u00e5ende donationer kan avbrytas n\u00e4r som helst via ditt PayPal-konto.", "HeaderMyMedia": "My Media", @@ -104,6 +106,7 @@ "TitlePlugins": "Plugins", "ButtonTakeTheTourToSeeWhatsNew": "Take the tour to see what's new", "MessageNoSyncJobsFound": "Inga synkjobb hittades. Skapa synkjobb med hj\u00e4lp av Synk-knapparna som finns i hela gr\u00e4nssnittet.", + "ButtonPlayTrailer": "Visa trailer", "HeaderLibraryAccess": "Library Access", "HeaderChannelAccess": "Channel Access", "HeaderDeviceAccess": "Enhets\u00e5tkomst", @@ -144,7 +147,6 @@ "ButtonPlay": "Spela upp", "ButtonEdit": "\u00c4ndra", "ButtonQueue": "K\u00f6", - "ButtonPlayTrailer": "Visa trailer", "ButtonPlaylist": "Spellista", "ButtonPreviousTrack": "F\u00f6reg\u00e5ende sp\u00e5r", "LabelEnabled": "Aktiverad", @@ -263,6 +265,7 @@ "LabelPlayMethodTranscoding": "Omkodning", "LabelPlayMethodDirectStream": "Direkt str\u00f6mning", "LabelPlayMethodDirectPlay": "Direktuppspelning", + "LabelEpisodeNumber": "Episode number:", "LabelAudioCodec": "Ljud: {0}", "LabelVideoCodec": "Video: {0}", "LabelLocalAccessUrl": "Local access: {0}", @@ -308,6 +311,7 @@ "HeaderArtist": "Artist", "LabelAddedOnDate": "{0} tillagd", "ButtonStart": "Start", + "LabelSeasonNumber": "Season number:", "HeaderChannels": "Kanaler", "HeaderMediaFolders": "Mediamappar", "HeaderBlockItemsWithNoRating": "Block content with no rating information:", @@ -336,6 +340,7 @@ "ButtonNextPage": "N\u00e4sta sida", "ButtonPreviousPage": "F\u00f6reg\u00e5ende sida", "ButtonMoveLeft": "V\u00e4nster", + "OptionReleaseDate": "Premi\u00e4rdatum", "ButtonMoveRight": "H\u00f6ger", "ButtonBrowseOnlineImages": "Bl\u00e4ddra bland bilder online", "HeaderDeleteItem": "Radera objekt", @@ -478,11 +483,8 @@ "PersonTypePerson": "Person", "LabelTitleDisplayOrder": "Visningsordning f\u00f6r titlar", "OptionSortName": "Sorteringstitel", - "OptionReleaseDate": "Premi\u00e4rdatum:", - "LabelSeasonNumber": "Season number:", "LabelDiscNumber": "Skiva nr", "LabelParentNumber": "F\u00f6r\u00e4lder nr", - "LabelEpisodeNumber": "Episode number:", "LabelTrackNumber": "Sp\u00e5r nr", "LabelNumber": "Nr:", "LabelReleaseDate": "Premi\u00e4rdatum:", @@ -741,7 +743,7 @@ "LabelQuality": "Quality:", "HeaderSettings": "Settings", "OptionAutomaticallySyncNewContent": "Synkronisera automatiskt nytt inneh\u00e5ll", - "OptionAutomaticallySyncNewContentHelp": "Nytt inneh\u00e5ll som l\u00e4ggs till i denna kategori kommer automatiskt synkroniseras till enheten.", + "OptionAutomaticallySyncNewContentHelp": "New content added to will be automatically synced to the device.", "OptionSyncUnwatchedVideosOnly": "Synkronisera endast osedda videos", "OptionSyncUnwatchedVideosOnlyHelp": "Endast osedda videos kommer att synkroniseras, och videos kommer att tas bort fr\u00e5n enheten n\u00e4r de har tittats p\u00e5.", "LabelItemLimit": "Item limit:", @@ -785,6 +787,7 @@ "HeaderMedia": "Media", "ButtonInbox": "Inbox", "HeaderAdvanced": "Avancerat", + "HeaderGroupVersions": "Group Versions", "HeaderSaySomethingLike": "Say Something Like...", "ButtonTryAgain": "Try Again", "HeaderYouSaid": "You Said...", @@ -794,5 +797,13 @@ "ButtonManageServer": "Manage Server", "ButtonPreferences": "Preferences", "ButtonViewArtist": "View artist", - "ButtonViewAlbum": "View album" + "ButtonViewAlbum": "View album", + "ErrorMessagePasswordNotMatchConfirm": "The password and password confirmation must match.", + "ErrorMessageUsernameInUse": "The username is already in use. Please choose a new name and try again.", + "ErrorMessageEmailInUse": "The email address is already in use. Please enter a new email address and try again, or use the forgot password feature.", + "MessageThankYouForConnectSignUp": "Thank you for signing up for Emby Connect. An email will be sent to your address with instructions on how to confirm your new account. Please confirm the account and then return here to sign in.", + "HeaderShare": "Share", + "ButtonShareHelp": "Share a web page containing media information with social media. Media files are never shared publicly.", + "ButtonShare": "Share", + "HeaderConfirm": "Confirm" }
\ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/tr.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/tr.json index 2a5e7dab8..59fb12008 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/tr.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/tr.json @@ -38,7 +38,9 @@ "HeaderSupportTheTeam": "Support the Emby Team", "TextEnjoyBonusFeatures": "Enjoy Bonus Features", "TitleLiveTV": "Canl\u0131 TV", + "ButtonCancelSyncJob": "Cancel sync job", "TitleSync": "Sync", + "HeaderSelectDate": "Select Date", "ButtonDonate": "Donate", "LabelRecurringDonationCanBeCancelledHelp": "Recurring donations can be cancelled at any time from within your PayPal account.", "HeaderMyMedia": "My Media", @@ -104,6 +106,7 @@ "TitlePlugins": "Plugins", "ButtonTakeTheTourToSeeWhatsNew": "Take the tour to see what's new", "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the web interface.", + "ButtonPlayTrailer": "Play trailer", "HeaderLibraryAccess": "Library Access", "HeaderChannelAccess": "Channel Access", "HeaderDeviceAccess": "Device Access", @@ -144,7 +147,6 @@ "ButtonPlay": "\u00c7al", "ButtonEdit": "D\u00fczenle", "ButtonQueue": "Queue", - "ButtonPlayTrailer": "Play trailer", "ButtonPlaylist": "Playlist", "ButtonPreviousTrack": "\u00d6nceki Par\u00e7a", "LabelEnabled": "Enabled", @@ -263,6 +265,7 @@ "LabelPlayMethodTranscoding": "Transcoding", "LabelPlayMethodDirectStream": "Direct Streaming", "LabelPlayMethodDirectPlay": "Direct Playing", + "LabelEpisodeNumber": "Episode number:", "LabelAudioCodec": "Audio: {0}", "LabelVideoCodec": "Video: {0}", "LabelLocalAccessUrl": "Local access: {0}", @@ -308,6 +311,7 @@ "HeaderArtist": "Artist", "LabelAddedOnDate": "Added {0}", "ButtonStart": "Start", + "LabelSeasonNumber": "Season number:", "HeaderChannels": "Kanallar", "HeaderMediaFolders": "Media Klas\u00f6rleri", "HeaderBlockItemsWithNoRating": "Block content with no rating information:", @@ -336,6 +340,7 @@ "ButtonNextPage": "Next Page", "ButtonPreviousPage": "Previous Page", "ButtonMoveLeft": "Move left", + "OptionReleaseDate": "Release date", "ButtonMoveRight": "Move right", "ButtonBrowseOnlineImages": "Browse online images", "HeaderDeleteItem": "Delete Item", @@ -478,11 +483,8 @@ "PersonTypePerson": "Person", "LabelTitleDisplayOrder": "Title display order:", "OptionSortName": "Sort name", - "OptionReleaseDate": "Release date", - "LabelSeasonNumber": "Season number:", "LabelDiscNumber": "Disc number", "LabelParentNumber": "Parent number", - "LabelEpisodeNumber": "Episode number:", "LabelTrackNumber": "Track number:", "LabelNumber": "Number:", "LabelReleaseDate": "Release date:", @@ -785,6 +787,7 @@ "HeaderMedia": "Media", "ButtonInbox": "Inbox", "HeaderAdvanced": "Advanced", + "HeaderGroupVersions": "Group Versions", "HeaderSaySomethingLike": "Say Something Like...", "ButtonTryAgain": "Try Again", "HeaderYouSaid": "You Said...", @@ -794,5 +797,13 @@ "ButtonManageServer": "Manage Server", "ButtonPreferences": "Preferences", "ButtonViewArtist": "View artist", - "ButtonViewAlbum": "View album" + "ButtonViewAlbum": "View album", + "ErrorMessagePasswordNotMatchConfirm": "The password and password confirmation must match.", + "ErrorMessageUsernameInUse": "The username is already in use. Please choose a new name and try again.", + "ErrorMessageEmailInUse": "The email address is already in use. Please enter a new email address and try again, or use the forgot password feature.", + "MessageThankYouForConnectSignUp": "Thank you for signing up for Emby Connect. An email will be sent to your address with instructions on how to confirm your new account. Please confirm the account and then return here to sign in.", + "HeaderShare": "Share", + "ButtonShareHelp": "Share a web page containing media information with social media. Media files are never shared publicly.", + "ButtonShare": "Share", + "HeaderConfirm": "Confirm" }
\ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/uk.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/uk.json index 2f30a9df9..2b5c4b11b 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/uk.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/uk.json @@ -38,7 +38,9 @@ "HeaderSupportTheTeam": "Support the Emby Team", "TextEnjoyBonusFeatures": "Enjoy Bonus Features", "TitleLiveTV": "Live TV", + "ButtonCancelSyncJob": "Cancel sync job", "TitleSync": "Sync", + "HeaderSelectDate": "Select Date", "ButtonDonate": "Donate", "LabelRecurringDonationCanBeCancelledHelp": "Recurring donations can be cancelled at any time from within your PayPal account.", "HeaderMyMedia": "My Media", @@ -104,6 +106,7 @@ "TitlePlugins": "Plugins", "ButtonTakeTheTourToSeeWhatsNew": "Take the tour to see what's new", "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the web interface.", + "ButtonPlayTrailer": "Play trailer", "HeaderLibraryAccess": "Library Access", "HeaderChannelAccess": "Channel Access", "HeaderDeviceAccess": "Device Access", @@ -144,7 +147,6 @@ "ButtonPlay": "Play", "ButtonEdit": "Edit", "ButtonQueue": "Queue", - "ButtonPlayTrailer": "\u0412\u0456\u0434\u0442\u0432\u043e\u0440\u0438\u0442\u0438 \u0442\u0440\u0435\u0439\u043b\u0435\u0440", "ButtonPlaylist": "Playlist", "ButtonPreviousTrack": "\u041f\u043e\u043f\u0435\u0440\u0435\u0434\u043d\u0456\u0439 \u0437\u0430\u043f\u0438\u0441", "LabelEnabled": "Enabled", @@ -263,6 +265,7 @@ "LabelPlayMethodTranscoding": "Transcoding", "LabelPlayMethodDirectStream": "Direct Streaming", "LabelPlayMethodDirectPlay": "Direct Playing", + "LabelEpisodeNumber": "Episode number:", "LabelAudioCodec": "Audio: {0}", "LabelVideoCodec": "Video: {0}", "LabelLocalAccessUrl": "Local access: {0}", @@ -308,6 +311,7 @@ "HeaderArtist": "Artist", "LabelAddedOnDate": "Added {0}", "ButtonStart": "Start", + "LabelSeasonNumber": "Season number:", "HeaderChannels": "Channels", "HeaderMediaFolders": "Media Folders", "HeaderBlockItemsWithNoRating": "Block content with no rating information:", @@ -336,6 +340,7 @@ "ButtonNextPage": "Next Page", "ButtonPreviousPage": "Previous Page", "ButtonMoveLeft": "Move left", + "OptionReleaseDate": "Release date", "ButtonMoveRight": "Move right", "ButtonBrowseOnlineImages": "Browse online images", "HeaderDeleteItem": "Delete Item", @@ -478,11 +483,8 @@ "PersonTypePerson": "Person", "LabelTitleDisplayOrder": "Title display order:", "OptionSortName": "Sort name", - "OptionReleaseDate": "\u0414\u0430\u0442\u0430 \u0432\u0438\u043f\u0443\u0441\u043a\u0443", - "LabelSeasonNumber": "Season number:", "LabelDiscNumber": "Disc number", "LabelParentNumber": "Parent number", - "LabelEpisodeNumber": "Episode number:", "LabelTrackNumber": "Track number:", "LabelNumber": "Number:", "LabelReleaseDate": "Release date:", @@ -713,7 +715,7 @@ "MessageInvitationSentToNewUser": "An email has been sent to {0} inviting them to sign up with Emby.", "HeaderConnectionFailure": "Connection Failure", "MessageUnableToConnectToServer": "We're unable to connect to the selected server right now. Please ensure it is running and try again.", - "ButtonSelectServer": "\u041e\u0431\u0435\u0440\u0456\u0442\u044c \u0441\u0435\u0440\u0432\u0435\u0440", + "ButtonSelectServer": "Select Server", "MessagePluginConfigurationRequiresLocalAccess": "To configure this plugin please sign in to your local server directly.", "MessageLoggedOutParentalControl": "Access is currently restricted. Please try again later.", "DefaultErrorMessage": "There was an error processing the request. Please try again later.", @@ -785,6 +787,7 @@ "HeaderMedia": "Media", "ButtonInbox": "Inbox", "HeaderAdvanced": "Advanced", + "HeaderGroupVersions": "Group Versions", "HeaderSaySomethingLike": "Say Something Like...", "ButtonTryAgain": "Try Again", "HeaderYouSaid": "You Said...", @@ -794,5 +797,13 @@ "ButtonManageServer": "Manage Server", "ButtonPreferences": "Preferences", "ButtonViewArtist": "View artist", - "ButtonViewAlbum": "View album" + "ButtonViewAlbum": "View album", + "ErrorMessagePasswordNotMatchConfirm": "The password and password confirmation must match.", + "ErrorMessageUsernameInUse": "The username is already in use. Please choose a new name and try again.", + "ErrorMessageEmailInUse": "The email address is already in use. Please enter a new email address and try again, or use the forgot password feature.", + "MessageThankYouForConnectSignUp": "Thank you for signing up for Emby Connect. An email will be sent to your address with instructions on how to confirm your new account. Please confirm the account and then return here to sign in.", + "HeaderShare": "Share", + "ButtonShareHelp": "Share a web page containing media information with social media. Media files are never shared publicly.", + "ButtonShare": "Share", + "HeaderConfirm": "Confirm" }
\ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/vi.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/vi.json index c4f3bb11d..0a3a9bdea 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/vi.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/vi.json @@ -38,7 +38,9 @@ "HeaderSupportTheTeam": "Support the Emby Team", "TextEnjoyBonusFeatures": "Enjoy Bonus Features", "TitleLiveTV": "Live TV", + "ButtonCancelSyncJob": "Cancel sync job", "TitleSync": "Sync", + "HeaderSelectDate": "Select Date", "ButtonDonate": "Donate", "LabelRecurringDonationCanBeCancelledHelp": "Recurring donations can be cancelled at any time from within your PayPal account.", "HeaderMyMedia": "My Media", @@ -104,6 +106,7 @@ "TitlePlugins": "Plugins", "ButtonTakeTheTourToSeeWhatsNew": "Take the tour to see what's new", "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the web interface.", + "ButtonPlayTrailer": "Play trailer", "HeaderLibraryAccess": "Library Access", "HeaderChannelAccess": "Channel Access", "HeaderDeviceAccess": "Device Access", @@ -144,7 +147,6 @@ "ButtonPlay": "Play", "ButtonEdit": "Edit", "ButtonQueue": "Queue", - "ButtonPlayTrailer": "Play trailer", "ButtonPlaylist": "Playlist", "ButtonPreviousTrack": "Previous Track", "LabelEnabled": "Enabled", @@ -263,6 +265,7 @@ "LabelPlayMethodTranscoding": "Transcoding", "LabelPlayMethodDirectStream": "Direct Streaming", "LabelPlayMethodDirectPlay": "Direct Playing", + "LabelEpisodeNumber": "Episode number:", "LabelAudioCodec": "Audio: {0}", "LabelVideoCodec": "Video: {0}", "LabelLocalAccessUrl": "Local access: {0}", @@ -308,6 +311,7 @@ "HeaderArtist": "Artist", "LabelAddedOnDate": "Added {0}", "ButtonStart": "Start", + "LabelSeasonNumber": "Season number:", "HeaderChannels": "Channels", "HeaderMediaFolders": "Media Folders", "HeaderBlockItemsWithNoRating": "Block content with no rating information:", @@ -336,6 +340,7 @@ "ButtonNextPage": "Next Page", "ButtonPreviousPage": "Previous Page", "ButtonMoveLeft": "Move left", + "OptionReleaseDate": "Release date", "ButtonMoveRight": "Move right", "ButtonBrowseOnlineImages": "Browse online images", "HeaderDeleteItem": "Delete Item", @@ -478,11 +483,8 @@ "PersonTypePerson": "Person", "LabelTitleDisplayOrder": "Title display order:", "OptionSortName": "Sort name", - "OptionReleaseDate": "Release date", - "LabelSeasonNumber": "Season number:", "LabelDiscNumber": "Disc number", "LabelParentNumber": "Parent number", - "LabelEpisodeNumber": "Episode number:", "LabelTrackNumber": "Track number:", "LabelNumber": "Number:", "LabelReleaseDate": "Release date:", @@ -785,6 +787,7 @@ "HeaderMedia": "Media", "ButtonInbox": "Inbox", "HeaderAdvanced": "Advanced", + "HeaderGroupVersions": "Group Versions", "HeaderSaySomethingLike": "Say Something Like...", "ButtonTryAgain": "Try Again", "HeaderYouSaid": "You Said...", @@ -794,5 +797,13 @@ "ButtonManageServer": "Manage Server", "ButtonPreferences": "Preferences", "ButtonViewArtist": "View artist", - "ButtonViewAlbum": "View album" + "ButtonViewAlbum": "View album", + "ErrorMessagePasswordNotMatchConfirm": "The password and password confirmation must match.", + "ErrorMessageUsernameInUse": "The username is already in use. Please choose a new name and try again.", + "ErrorMessageEmailInUse": "The email address is already in use. Please enter a new email address and try again, or use the forgot password feature.", + "MessageThankYouForConnectSignUp": "Thank you for signing up for Emby Connect. An email will be sent to your address with instructions on how to confirm your new account. Please confirm the account and then return here to sign in.", + "HeaderShare": "Share", + "ButtonShareHelp": "Share a web page containing media information with social media. Media files are never shared publicly.", + "ButtonShare": "Share", + "HeaderConfirm": "Confirm" }
\ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/zh-CN.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/zh-CN.json index cbed3eaa9..fd7795dcb 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/zh-CN.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/zh-CN.json @@ -38,7 +38,9 @@ "HeaderSupportTheTeam": "Support the Emby Team", "TextEnjoyBonusFeatures": "\u4eab\u53d7\u5956\u52b1\u529f\u80fd", "TitleLiveTV": "\u7535\u89c6\u76f4\u64ad", + "ButtonCancelSyncJob": "Cancel sync job", "TitleSync": "\u540c\u6b65", + "HeaderSelectDate": "Select Date", "ButtonDonate": "\u6350\u8d60", "LabelRecurringDonationCanBeCancelledHelp": "\u5728\u60a8\u7684PayPal\u8d26\u6237\u5185\u4efb\u4f55\u65f6\u5019\u90fd\u53ef\u4ee5\u53d6\u6d88\u7ecf\u5e38\u6027\u6350\u8d60\u3002", "HeaderMyMedia": "My Media", @@ -104,6 +106,7 @@ "TitlePlugins": "Plugins", "ButtonTakeTheTourToSeeWhatsNew": "\u8fdb\u884c\u53c2\u89c2\uff0c\u770b\u770b\u6709\u4ec0\u4e48\u65b0\u4e1c\u897f", "MessageNoSyncJobsFound": "\u6ca1\u6709\u53d1\u73b0\u540c\u6b65\u4f5c\u4e1a\u3002\u4f7f\u7528Web\u754c\u9762\u4e2d\u7684\u540c\u6b65\u6309\u94ae\u6765\u521b\u5efa\u540c\u6b65\u4f5c\u4e1a\u3002", + "ButtonPlayTrailer": "Play trailer", "HeaderLibraryAccess": "Library Access", "HeaderChannelAccess": "Channel Access", "HeaderDeviceAccess": "\u8bbe\u5907\u8bbf\u95ee", @@ -144,7 +147,6 @@ "ButtonPlay": "\u64ad\u653e", "ButtonEdit": "\u7f16\u8f91", "ButtonQueue": "\u52a0\u5165\u961f\u5217", - "ButtonPlayTrailer": "\u64ad\u653e\u9884\u544a\u7247", "ButtonPlaylist": "\u64ad\u653e\u5217\u8868", "ButtonPreviousTrack": "\u4e0a\u4e00\u97f3\u8f68", "LabelEnabled": "\u5df2\u542f\u7528", @@ -263,6 +265,7 @@ "LabelPlayMethodTranscoding": "\u8f6c\u7801", "LabelPlayMethodDirectStream": "\u76f4\u63a5\u7528\u5a92\u4f53\u6d41", "LabelPlayMethodDirectPlay": "\u76f4\u63a5\u64ad\u653e", + "LabelEpisodeNumber": "Episode number:", "LabelAudioCodec": "\u97f3\u9891\uff1a {0}", "LabelVideoCodec": "\u89c6\u9891\uff1a{0}", "LabelLocalAccessUrl": "\u672c\u5730\u8bbf\u95ee\uff1a {0}", @@ -308,6 +311,7 @@ "HeaderArtist": "\u827a\u672f\u5bb6", "LabelAddedOnDate": "\u6dfb\u52a0 {0}", "ButtonStart": "\u5f00\u59cb", + "LabelSeasonNumber": "Season number:", "HeaderChannels": "\u9891\u9053", "HeaderMediaFolders": "\u5a92\u4f53\u6587\u4ef6\u5939", "HeaderBlockItemsWithNoRating": "Block content with no rating information:", @@ -336,6 +340,7 @@ "ButtonNextPage": "\u4e0b\u4e00\u9875", "ButtonPreviousPage": "\u524d\u4e00\u9875", "ButtonMoveLeft": "\u5de6\u79fb", + "OptionReleaseDate": "Release date", "ButtonMoveRight": "\u53f3\u79fb", "ButtonBrowseOnlineImages": "\u6d4f\u89c8\u5728\u7ebf\u56fe\u7247", "HeaderDeleteItem": "\u5220\u9664\u9879\u76ee", @@ -478,11 +483,8 @@ "PersonTypePerson": "\u4eba\u7269", "LabelTitleDisplayOrder": "\u6807\u9898\u663e\u793a\u7684\u987a\u5e8f\uff1a", "OptionSortName": "\u6392\u5e8f\u540d\u79f0", - "OptionReleaseDate": "\u53d1\u5e03\u65e5\u671f", - "LabelSeasonNumber": "\u591a\u5c11\u5b63\uff1a", "LabelDiscNumber": "\u5149\u76d8\u53f7", "LabelParentNumber": "\u6bcd\u5e26\u53f7", - "LabelEpisodeNumber": "\u591a\u5c11\u96c6\uff1a", "LabelTrackNumber": "\u97f3\u8f68\u53f7\u7801\uff1a", "LabelNumber": "\u7f16\u53f7\uff1a", "LabelReleaseDate": "\u53d1\u884c\u65e5\u671f\uff1a", @@ -785,6 +787,7 @@ "HeaderMedia": "Media", "ButtonInbox": "Inbox", "HeaderAdvanced": "\u9ad8\u7ea7", + "HeaderGroupVersions": "Group Versions", "HeaderSaySomethingLike": "Say Something Like...", "ButtonTryAgain": "Try Again", "HeaderYouSaid": "You Said...", @@ -794,5 +797,13 @@ "ButtonManageServer": "Manage Server", "ButtonPreferences": "Preferences", "ButtonViewArtist": "View artist", - "ButtonViewAlbum": "View album" + "ButtonViewAlbum": "View album", + "ErrorMessagePasswordNotMatchConfirm": "The password and password confirmation must match.", + "ErrorMessageUsernameInUse": "The username is already in use. Please choose a new name and try again.", + "ErrorMessageEmailInUse": "The email address is already in use. Please enter a new email address and try again, or use the forgot password feature.", + "MessageThankYouForConnectSignUp": "Thank you for signing up for Emby Connect. An email will be sent to your address with instructions on how to confirm your new account. Please confirm the account and then return here to sign in.", + "HeaderShare": "Share", + "ButtonShareHelp": "Share a web page containing media information with social media. Media files are never shared publicly.", + "ButtonShare": "Share", + "HeaderConfirm": "Confirm" }
\ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/zh-TW.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/zh-TW.json index 4fcfcfffb..b0ebf81d5 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/zh-TW.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/zh-TW.json @@ -38,7 +38,9 @@ "HeaderSupportTheTeam": "Support the Emby Team", "TextEnjoyBonusFeatures": "Enjoy Bonus Features", "TitleLiveTV": "\u96fb\u8996\u529f\u80fd", + "ButtonCancelSyncJob": "Cancel sync job", "TitleSync": "Sync", + "HeaderSelectDate": "Select Date", "ButtonDonate": "Donate", "LabelRecurringDonationCanBeCancelledHelp": "Recurring donations can be cancelled at any time from within your PayPal account.", "HeaderMyMedia": "My Media", @@ -104,6 +106,7 @@ "TitlePlugins": "Plugins", "ButtonTakeTheTourToSeeWhatsNew": "Take the tour to see what's new", "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the web interface.", + "ButtonPlayTrailer": "Play trailer", "HeaderLibraryAccess": "Library Access", "HeaderChannelAccess": "Channel Access", "HeaderDeviceAccess": "Device Access", @@ -144,7 +147,6 @@ "ButtonPlay": "\u64ad\u653e", "ButtonEdit": "\u7de8\u8f2f", "ButtonQueue": "Queue", - "ButtonPlayTrailer": "Play trailer", "ButtonPlaylist": "Playlist", "ButtonPreviousTrack": "Previous Track", "LabelEnabled": "Enabled", @@ -263,6 +265,7 @@ "LabelPlayMethodTranscoding": "Transcoding", "LabelPlayMethodDirectStream": "Direct Streaming", "LabelPlayMethodDirectPlay": "Direct Playing", + "LabelEpisodeNumber": "Episode number:", "LabelAudioCodec": "Audio: {0}", "LabelVideoCodec": "Video: {0}", "LabelLocalAccessUrl": "Local access: {0}", @@ -308,6 +311,7 @@ "HeaderArtist": "Artist", "LabelAddedOnDate": "Added {0}", "ButtonStart": "Start", + "LabelSeasonNumber": "Season number:", "HeaderChannels": "\u983b\u5ea6", "HeaderMediaFolders": "\u5a92\u9ad4\u6587\u4ef6\u593e", "HeaderBlockItemsWithNoRating": "Block content with no rating information:", @@ -336,6 +340,7 @@ "ButtonNextPage": "Next Page", "ButtonPreviousPage": "Previous Page", "ButtonMoveLeft": "Move left", + "OptionReleaseDate": "Release date", "ButtonMoveRight": "Move right", "ButtonBrowseOnlineImages": "Browse online images", "HeaderDeleteItem": "Delete Item", @@ -478,11 +483,8 @@ "PersonTypePerson": "Person", "LabelTitleDisplayOrder": "Title display order:", "OptionSortName": "Sort name", - "OptionReleaseDate": "Release date", - "LabelSeasonNumber": "Season number:", "LabelDiscNumber": "Disc number", "LabelParentNumber": "Parent number", - "LabelEpisodeNumber": "Episode number:", "LabelTrackNumber": "Track number:", "LabelNumber": "Number:", "LabelReleaseDate": "Release date:", @@ -785,6 +787,7 @@ "HeaderMedia": "Media", "ButtonInbox": "Inbox", "HeaderAdvanced": "Advanced", + "HeaderGroupVersions": "Group Versions", "HeaderSaySomethingLike": "Say Something Like...", "ButtonTryAgain": "Try Again", "HeaderYouSaid": "You Said...", @@ -794,5 +797,13 @@ "ButtonManageServer": "Manage Server", "ButtonPreferences": "Preferences", "ButtonViewArtist": "View artist", - "ButtonViewAlbum": "View album" + "ButtonViewAlbum": "View album", + "ErrorMessagePasswordNotMatchConfirm": "The password and password confirmation must match.", + "ErrorMessageUsernameInUse": "The username is already in use. Please choose a new name and try again.", + "ErrorMessageEmailInUse": "The email address is already in use. Please enter a new email address and try again, or use the forgot password feature.", + "MessageThankYouForConnectSignUp": "Thank you for signing up for Emby Connect. An email will be sent to your address with instructions on how to confirm your new account. Please confirm the account and then return here to sign in.", + "HeaderShare": "Share", + "ButtonShareHelp": "Share a web page containing media information with social media. Media files are never shared publicly.", + "ButtonShare": "Share", + "HeaderConfirm": "Confirm" }
\ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/Server/ar.json b/MediaBrowser.Server.Implementations/Localization/Server/ar.json index eb6e85571..76a65c489 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/ar.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/ar.json @@ -13,6 +13,7 @@ "LabelShowLogWindow": "\u0639\u0631\u0636 \u0646\u0627\u0641\u0630\u0629 \u0627\u0644\u0633\u062c\u0644", "LabelPrevious": "\u0627\u0644\u0633\u0627\u0628\u0642", "LabelFinish": "\u0627\u0646\u062a\u0647\u0627\u0621", + "FolderTypeMixed": "Mixed content", "LabelNext": "\u0627\u0644\u062a\u0627\u0644\u0649", "LabelYoureDone": "\u062a\u0645 \u0627\u0644\u0627\u0646\u062a\u0647\u0627\u0621!", "WelcomeToProject": "Welcome to Emby!", @@ -90,7 +91,6 @@ "LabelEnableEnhancedMovies": "Enable enhanced movie displays", "LabelEnableEnhancedMoviesHelp": "When enabled, movies will be displayed as folders to include trailers, extras, cast & crew, and other related content.", "HeaderSyncJobInfo": "Sync Job", - "FolderTypeMixed": "Mixed content", "FolderTypeMovies": "Movies", "FolderTypeMusic": "Music", "FolderTypeAdultVideos": "Adult videos", @@ -287,7 +287,9 @@ "OptionFileMetadataYearMismatch": "File\/Metadata Years Mismatched", "TabGeneral": "General", "TitleSupport": "Support", + "LabelSeasonNumber": "Season number", "TabLog": "Log", + "LabelEpisodeNumber": "Episode number", "TabAbout": "About", "TabSupporterKey": "Supporter Key", "TabBecomeSupporter": "Become a Supporter", @@ -313,6 +315,9 @@ "OptionAllowRemoteControlOthers": "Allow remote control of other users", "OptionAllowRemoteSharedDevices": "Allow remote control of shared devices", "OptionAllowRemoteSharedDevicesHelp": "Dlna devices are considered shared until a user begins controlling it.", + "OptionAllowLinkSharing": "Allow social media sharing", + "OptionAllowLinkSharingHelp": "Only web pages containing media information are shared. Media files are never shared publicly. Shares are time-limited and will expire based on your server sharing settings.", + "HeaderSharing": "Sharing", "HeaderRemoteControl": "Remote Control", "OptionMissingTmdbId": "Missing Tmdb Id", "OptionIsHD": "HD", @@ -581,8 +586,6 @@ "LabelSkipped": "Skipped", "HeaderEpisodeOrganization": "Episode Organization", "LabelSeries": "Series:", - "LabelSeasonNumber": "Season number:", - "LabelEpisodeNumber": "Episode number:", "LabelEndingEpisodeNumber": "Ending episode number:", "LabelEndingEpisodeNumberHelp": "Only required for multi-episode files", "HeaderSupportTheTeam": "Support the Emby Team", @@ -870,6 +873,7 @@ "HeaderTypeText": "Enter Text", "LabelTypeText": "Text", "HeaderSearchForSubtitles": "Search for Subtitles", + "ButtonMore": "More", "MessageNoSubtitleSearchResultsFound": "No search results founds.", "TabDisplay": "Display", "TabLanguages": "Languages", @@ -900,7 +904,7 @@ "HeaderLiveTv": "Live TV", "HeaderReports": "Reports", "HeaderMetadataManager": "Metadata Manager", - "HeaderPreferences": "Preferences", + "HeaderSettings": "Settings", "MessageLoadingChannels": "Loading channel content...", "MessageLoadingContent": "Loading content...", "ButtonMarkRead": "Mark Read", @@ -1098,7 +1102,6 @@ "OptionReportArtists": "Artists", "OptionReportAlbums": "Albums", "OptionReportAdultVideos": "Adult videos", - "ButtonMore": "More", "HeaderActivity": "Activity", "ScheduledTaskStartedWithName": "{0} started", "ScheduledTaskCancelledWithName": "{0} was cancelled", @@ -1392,7 +1395,7 @@ "HeaderUpcomingMovies": "Upcoming Movies", "HeaderUpcomingSports": "Upcoming Sports", "HeaderUpcomingPrograms": "Upcoming Programs", - "ButtonMoreItems": "More...", + "ButtonMoreItems": "More", "LabelShowLibraryTileNames": "Show library tile names", "LabelShowLibraryTileNamesHelp": "Determines if labels will be displayed underneath library tiles on the home page", "OptionEnableTranscodingThrottle": "Enable throttling", @@ -1411,7 +1414,6 @@ "OptionEnableFullSpeedConversion": "Enable full speed conversion", "OptionEnableFullSpeedConversionHelp": "By default, sync conversion is performed at a low speed to minimize resource consumption.", "HeaderPlaylists": "Playlists", - "HeaderSelectDate": "Select Date", "HeaderViewStyles": "View Styles", "LabelSelectViewStyles": "Enable enhanced presentations for:", "LabelSelectViewStylesHelp": "If enabled, views will be built with metadata to offer categories such as Suggestions, Latest, Genres, and more. If disabled, they'll be displayed with simple folders.", @@ -1439,5 +1441,14 @@ "ButtonUnlockGuide": "Unlock Guide", "LabelEnableFullScreen": "Enable fullscreen mode", "LabelEnableChromecastAc3Passthrough": "Enable Chromecast AC3 Passthrough", - "LabelSyncPath": "Synced content path:" + "LabelSyncPath": "Synced content path:", + "LabelEmail": "Email:", + "LabelUsername": "Username:", + "HeaderSignUp": "Sign Up", + "LabelPasswordConfirm": "Password (confirm):", + "ButtonAddServer": "Add Server", + "TabHomeScreen": "Home Screen", + "HeaderDisplay": "Display", + "HeaderNavigation": "Navigation", + "LegendTheseSettingsShared": "These settings are shared on all devices" }
\ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/Server/bg-BG.json b/MediaBrowser.Server.Implementations/Localization/Server/bg-BG.json index 34add02ce..fc0b3eddb 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/bg-BG.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/bg-BG.json @@ -13,6 +13,7 @@ "LabelShowLogWindow": "\u041f\u043e\u043a\u0430\u0436\u0438 \u043b\u043e\u0433\u043e\u0432\u0438\u044f \u043f\u0440\u043e\u0437\u043e\u0440\u0435\u0446", "LabelPrevious": "\u041f\u0440\u0435\u0434\u0438\u0448\u0435\u043d", "LabelFinish": "\u041a\u0440\u0430\u0439", + "FolderTypeMixed": "Mixed content", "LabelNext": "\u0421\u043b\u0435\u0434\u0432\u0430\u0449", "LabelYoureDone": "\u0413\u043e\u0442\u043e\u0432\u0438 \u0441\u0442\u0435!", "WelcomeToProject": "\u0414\u043e\u0431\u0440\u0435 \u0434\u043e\u0448\u043b\u0438 \u0432 Emby!", @@ -85,12 +86,11 @@ "ButtonDonateWithPayPal": "\u041d\u0430\u043f\u0440\u0430\u0432\u0438 \u0434\u0430\u0440\u0435\u043d\u0438\u0435 \u0441 PayPal", "OptionDetectArchiveFilesAsMedia": "\u0420\u0430\u0437\u043f\u043e\u0437\u043d\u0430\u0432\u0430\u043d\u0435 \u043d\u0430 \u0430\u0440\u0445\u0438\u0432\u0438 \u043a\u0430\u0442\u043e \u043c\u0435\u0434\u0438\u0439\u043d\u0438 \u0444\u0430\u0439\u043b\u043e\u0432\u0435", "OptionDetectArchiveFilesAsMediaHelp": "\u0410\u043a\u043e \u0435 \u0430\u043a\u0442\u0438\u0432\u0438\u0440\u0430\u043d\u043e, \u0444\u0430\u0439\u043b\u043e\u0432\u0435 \u0441 \u0440\u0430\u0437\u0448\u0438\u0440\u0435\u043d\u0438\u044f .rar \u0438 .zip \u0449\u0435 \u0431\u044a\u0434\u0430\u0442 \u0440\u0430\u0437\u043f\u043e\u0437\u043d\u0430\u0432\u0430\u043d\u0438 \u043a\u0430\u0442\u043e \u043c\u0435\u0434\u0438\u0439\u043d\u0438 \u0444\u0430\u0439\u043b\u043e\u0432\u0435.", - "LabelEnterConnectUserName": "\u041f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u0441\u043a\u043e \u0438\u043c\u0435 \u0438\u043b\u0438 email:", - "LabelEnterConnectUserNameHelp": "\u0422\u043e\u0432\u0430 \u0441\u0430 \u0432\u0430\u0448\u0438\u0442\u0435 Emby \u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u0441\u043a\u043e \u0438\u043c\u0435 \u0438 \u043f\u0430\u0440\u043e\u043b\u0430.", + "LabelEnterConnectUserName": "Username or email:", + "LabelEnterConnectUserNameHelp": "This is your Emby online account username or password.", "LabelEnableEnhancedMovies": "Enable enhanced movie displays", "LabelEnableEnhancedMoviesHelp": "When enabled, movies will be displayed as folders to include trailers, extras, cast & crew, and other related content.", "HeaderSyncJobInfo": "\u0421\u0438\u043d\u0445\u0440. \u0417\u0430\u0434\u0430\u0447\u0430", - "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", @@ -287,7 +287,9 @@ "OptionFileMetadataYearMismatch": "\u0420\u0430\u0437\u043b\u0438\u0447\u0438\u0435 \u043d\u0430 \u0433\u043e\u0434\u0438\u043d\u0430 \u0432\u044a\u0432 \u0424\u0430\u0439\u043b\/\u041c\u0435\u0442\u0430 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f", "TabGeneral": "\u0413\u043b\u0430\u0432\u043d\u043e", "TitleSupport": "\u041f\u043e\u0434\u0434\u0440\u044a\u0436\u043a\u0430", + "LabelSeasonNumber": "Season number", "TabLog": "\u041b\u043e\u0433", + "LabelEpisodeNumber": "Episode number", "TabAbout": "\u041e\u0442\u043d\u043e\u0441\u043d\u043e", "TabSupporterKey": "\u041f\u043e\u0434\u0434\u0440\u044a\u0436\u043d\u0438\u043a\u043e\u0432 \u043a\u043b\u044e\u0447", "TabBecomeSupporter": "\u0421\u0442\u0430\u043d\u0438 \u043f\u043e\u0434\u0434\u0440\u044a\u0436\u043d\u0438\u043a", @@ -313,6 +315,9 @@ "OptionAllowRemoteControlOthers": "\u0420\u0430\u0437\u0440\u0435\u0448\u0438 \u043e\u0442\u0434\u0430\u043b\u0435\u0447\u0435\u043d \u043a\u043e\u043d\u0442\u0440\u043e\u043b \u043d\u0430 \u0434\u0440\u0443\u0433\u0438 \u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u0438", "OptionAllowRemoteSharedDevices": "\u0420\u0430\u0437\u0440\u0435\u0448\u0438 \u043e\u0442\u0434\u0430\u043b\u0435\u0447\u0435\u043d \u043a\u043e\u043d\u0442\u0440\u043e\u043b \u043d\u0430 \u0441\u043f\u043e\u0434\u0435\u043b\u0435\u043d\u0438 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430", "OptionAllowRemoteSharedDevicesHelp": "DLNA \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0441\u0435 \u0441\u0447\u0438\u0442\u0430\u0442 \u0437\u0430 \u0441\u043f\u043e\u0434\u0435\u043b\u0435\u043d\u0438 \u0434\u043e\u043a\u0430\u0442\u043e \u043d\u044f\u043a\u043e\u0439 \u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b \u043d\u0435 \u0437\u0430\u043f\u043e\u0447\u043d\u0435 \u0434\u0430 \u0433\u0438 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0438\u0440\u0430.", + "OptionAllowLinkSharing": "Allow social media sharing", + "OptionAllowLinkSharingHelp": "Only web pages containing media information are shared. Media files are never shared publicly. Shares are time-limited and will expire based on your server sharing settings.", + "HeaderSharing": "Sharing", "HeaderRemoteControl": "\u041e\u0442\u0434\u0430\u043b\u0435\u0447\u0435\u043d \u041a\u043e\u043d\u0442\u0440\u043e\u043b", "OptionMissingTmdbId": "\u041b\u0438\u043f\u0441\u0432\u0430\u0449\u043e Tmdb ID", "OptionIsHD": "HD", @@ -581,8 +586,6 @@ "LabelSkipped": "Skipped", "HeaderEpisodeOrganization": "Episode Organization", "LabelSeries": "Series:", - "LabelSeasonNumber": "Season number:", - "LabelEpisodeNumber": "Episode number:", "LabelEndingEpisodeNumber": "Ending episode number:", "LabelEndingEpisodeNumberHelp": "Only required for multi-episode files", "HeaderSupportTheTeam": "\u041f\u043e\u0434\u043a\u0440\u0435\u043f\u0435\u0442\u0435 Emby \u041e\u0442\u0431\u043e\u0440\u044a\u0442", @@ -870,6 +873,7 @@ "HeaderTypeText": "Enter Text", "LabelTypeText": "Text", "HeaderSearchForSubtitles": "Search for Subtitles", + "ButtonMore": "More", "MessageNoSubtitleSearchResultsFound": "No search results founds.", "TabDisplay": "Display", "TabLanguages": "Languages", @@ -900,7 +904,7 @@ "HeaderLiveTv": "Live TV", "HeaderReports": "Reports", "HeaderMetadataManager": "Metadata Manager", - "HeaderPreferences": "Preferences", + "HeaderSettings": "Settings", "MessageLoadingChannels": "Loading channel content...", "MessageLoadingContent": "Loading content...", "ButtonMarkRead": "Mark Read", @@ -1098,7 +1102,6 @@ "OptionReportArtists": "Artists", "OptionReportAlbums": "Albums", "OptionReportAdultVideos": "Adult videos", - "ButtonMore": "More", "HeaderActivity": "Activity", "ScheduledTaskStartedWithName": "{0} started", "ScheduledTaskCancelledWithName": "{0} was cancelled", @@ -1392,7 +1395,7 @@ "HeaderUpcomingMovies": "Upcoming Movies", "HeaderUpcomingSports": "Upcoming Sports", "HeaderUpcomingPrograms": "Upcoming Programs", - "ButtonMoreItems": "More...", + "ButtonMoreItems": "More", "LabelShowLibraryTileNames": "Show library tile names", "LabelShowLibraryTileNamesHelp": "Determines if labels will be displayed underneath library tiles on the home page", "OptionEnableTranscodingThrottle": "Enable throttling", @@ -1411,7 +1414,6 @@ "OptionEnableFullSpeedConversion": "Enable full speed conversion", "OptionEnableFullSpeedConversionHelp": "By default, sync conversion is performed at a low speed to minimize resource consumption.", "HeaderPlaylists": "Playlists", - "HeaderSelectDate": "Select Date", "HeaderViewStyles": "View Styles", "LabelSelectViewStyles": "Enable enhanced presentations for:", "LabelSelectViewStylesHelp": "If enabled, views will be built with metadata to offer categories such as Suggestions, Latest, Genres, and more. If disabled, they'll be displayed with simple folders.", @@ -1439,5 +1441,14 @@ "ButtonUnlockGuide": "Unlock Guide", "LabelEnableFullScreen": "Enable fullscreen mode", "LabelEnableChromecastAc3Passthrough": "Enable Chromecast AC3 Passthrough", - "LabelSyncPath": "Synced content path:" + "LabelSyncPath": "Synced content path:", + "LabelEmail": "Email:", + "LabelUsername": "Username:", + "HeaderSignUp": "Sign Up", + "LabelPasswordConfirm": "Password (confirm):", + "ButtonAddServer": "Add Server", + "TabHomeScreen": "Home Screen", + "HeaderDisplay": "Display", + "HeaderNavigation": "Navigation", + "LegendTheseSettingsShared": "These settings are shared on all devices" }
\ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/Server/ca.json b/MediaBrowser.Server.Implementations/Localization/Server/ca.json index f5c5a1a50..3a2757227 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/ca.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/ca.json @@ -13,6 +13,7 @@ "LabelShowLogWindow": "Veure la finestra del registre", "LabelPrevious": "Anterior", "LabelFinish": "Finalitzar", + "FolderTypeMixed": "Mixed content", "LabelNext": "Seg\u00fcent", "LabelYoureDone": "Ja est\u00e0!", "WelcomeToProject": "Welcome to Emby!", @@ -90,7 +91,6 @@ "LabelEnableEnhancedMovies": "Enable enhanced movie displays", "LabelEnableEnhancedMoviesHelp": "When enabled, movies will be displayed as folders to include trailers, extras, cast & crew, and other related content.", "HeaderSyncJobInfo": "Sync Job", - "FolderTypeMixed": "Mixed content", "FolderTypeMovies": "Movies", "FolderTypeMusic": "Music", "FolderTypeAdultVideos": "Adult videos", @@ -287,7 +287,9 @@ "OptionFileMetadataYearMismatch": "File\/Metadata Years Mismatched", "TabGeneral": "General", "TitleSupport": "Support", + "LabelSeasonNumber": "Season number", "TabLog": "Log", + "LabelEpisodeNumber": "Episode number", "TabAbout": "About", "TabSupporterKey": "Supporter Key", "TabBecomeSupporter": "Become a Supporter", @@ -313,6 +315,9 @@ "OptionAllowRemoteControlOthers": "Allow remote control of other users", "OptionAllowRemoteSharedDevices": "Allow remote control of shared devices", "OptionAllowRemoteSharedDevicesHelp": "Dlna devices are considered shared until a user begins controlling it.", + "OptionAllowLinkSharing": "Allow social media sharing", + "OptionAllowLinkSharingHelp": "Only web pages containing media information are shared. Media files are never shared publicly. Shares are time-limited and will expire based on your server sharing settings.", + "HeaderSharing": "Sharing", "HeaderRemoteControl": "Remote Control", "OptionMissingTmdbId": "Missing Tmdb Id", "OptionIsHD": "HD", @@ -581,8 +586,6 @@ "LabelSkipped": "Skipped", "HeaderEpisodeOrganization": "Episode Organization", "LabelSeries": "Series:", - "LabelSeasonNumber": "Season number:", - "LabelEpisodeNumber": "Episode number:", "LabelEndingEpisodeNumber": "Ending episode number:", "LabelEndingEpisodeNumberHelp": "Only required for multi-episode files", "HeaderSupportTheTeam": "Support the Emby Team", @@ -870,6 +873,7 @@ "HeaderTypeText": "Enter Text", "LabelTypeText": "Text", "HeaderSearchForSubtitles": "Search for Subtitles", + "ButtonMore": "More", "MessageNoSubtitleSearchResultsFound": "No search results founds.", "TabDisplay": "Display", "TabLanguages": "Languages", @@ -900,7 +904,7 @@ "HeaderLiveTv": "Live TV", "HeaderReports": "Reports", "HeaderMetadataManager": "Metadata Manager", - "HeaderPreferences": "Preferences", + "HeaderSettings": "Settings", "MessageLoadingChannels": "Loading channel content...", "MessageLoadingContent": "Loading content...", "ButtonMarkRead": "Mark Read", @@ -1098,7 +1102,6 @@ "OptionReportArtists": "Artists", "OptionReportAlbums": "Albums", "OptionReportAdultVideos": "Adult videos", - "ButtonMore": "More", "HeaderActivity": "Activity", "ScheduledTaskStartedWithName": "{0} started", "ScheduledTaskCancelledWithName": "{0} was cancelled", @@ -1392,7 +1395,7 @@ "HeaderUpcomingMovies": "Upcoming Movies", "HeaderUpcomingSports": "Upcoming Sports", "HeaderUpcomingPrograms": "Upcoming Programs", - "ButtonMoreItems": "More...", + "ButtonMoreItems": "More", "LabelShowLibraryTileNames": "Show library tile names", "LabelShowLibraryTileNamesHelp": "Determines if labels will be displayed underneath library tiles on the home page", "OptionEnableTranscodingThrottle": "Enable throttling", @@ -1411,7 +1414,6 @@ "OptionEnableFullSpeedConversion": "Enable full speed conversion", "OptionEnableFullSpeedConversionHelp": "By default, sync conversion is performed at a low speed to minimize resource consumption.", "HeaderPlaylists": "Playlists", - "HeaderSelectDate": "Select Date", "HeaderViewStyles": "View Styles", "LabelSelectViewStyles": "Enable enhanced presentations for:", "LabelSelectViewStylesHelp": "If enabled, views will be built with metadata to offer categories such as Suggestions, Latest, Genres, and more. If disabled, they'll be displayed with simple folders.", @@ -1439,5 +1441,14 @@ "ButtonUnlockGuide": "Unlock Guide", "LabelEnableFullScreen": "Enable fullscreen mode", "LabelEnableChromecastAc3Passthrough": "Enable Chromecast AC3 Passthrough", - "LabelSyncPath": "Synced content path:" + "LabelSyncPath": "Synced content path:", + "LabelEmail": "Email:", + "LabelUsername": "Username:", + "HeaderSignUp": "Sign Up", + "LabelPasswordConfirm": "Password (confirm):", + "ButtonAddServer": "Add Server", + "TabHomeScreen": "Home Screen", + "HeaderDisplay": "Display", + "HeaderNavigation": "Navigation", + "LegendTheseSettingsShared": "These settings are shared on all devices" }
\ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/Server/cs.json b/MediaBrowser.Server.Implementations/Localization/Server/cs.json index 056e576bf..f04072f38 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/cs.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/cs.json @@ -13,6 +13,7 @@ "LabelShowLogWindow": "Zobrazit okno z\u00e1znam\u016f", "LabelPrevious": "P\u0159edchoz\u00ed", "LabelFinish": "Dokon\u010dit", + "FolderTypeMixed": "Mixed content", "LabelNext": "Dal\u0161\u00ed", "LabelYoureDone": "Hotovo!", "WelcomeToProject": "V\u00edtejte v Emby!", @@ -90,7 +91,6 @@ "LabelEnableEnhancedMovies": "Enable enhanced movie displays", "LabelEnableEnhancedMoviesHelp": "When enabled, movies will be displayed as folders to include trailers, extras, cast & crew, and other related content.", "HeaderSyncJobInfo": "Sync Job", - "FolderTypeMixed": "Mixed content", "FolderTypeMovies": "Movies", "FolderTypeMusic": "Music", "FolderTypeAdultVideos": "Adult videos", @@ -287,7 +287,9 @@ "OptionFileMetadataYearMismatch": "Neodpov\u00edd\u00e1 rok v metadatech a v souboru.", "TabGeneral": "Obecn\u00e9", "TitleSupport": "Podpora", + "LabelSeasonNumber": "Season number", "TabLog": "Z\u00e1znam", + "LabelEpisodeNumber": "Episode number", "TabAbout": "O programu", "TabSupporterKey": "Kl\u00ed\u010d sponzora", "TabBecomeSupporter": "Sta\u0148te se sponzorem", @@ -313,6 +315,9 @@ "OptionAllowRemoteControlOthers": "Allow remote control of other users", "OptionAllowRemoteSharedDevices": "Allow remote control of shared devices", "OptionAllowRemoteSharedDevicesHelp": "Dlna devices are considered shared until a user begins controlling it.", + "OptionAllowLinkSharing": "Allow social media sharing", + "OptionAllowLinkSharingHelp": "Only web pages containing media information are shared. Media files are never shared publicly. Shares are time-limited and will expire based on your server sharing settings.", + "HeaderSharing": "Sharing", "HeaderRemoteControl": "Remote Control", "OptionMissingTmdbId": "Chyb\u011bj\u00edc\u00ed Tmdb Id", "OptionIsHD": "HD", @@ -581,8 +586,6 @@ "LabelSkipped": "P\u0159esko\u010deno", "HeaderEpisodeOrganization": "Organizace epizod", "LabelSeries": "Series:", - "LabelSeasonNumber": "Season number:", - "LabelEpisodeNumber": "Episode number:", "LabelEndingEpisodeNumber": "Ending episode number:", "LabelEndingEpisodeNumberHelp": "Vy\u017eadovan\u00e9 jenom pro s\u00fabory s v\u00edce epizodami", "HeaderSupportTheTeam": "Support the Emby Team", @@ -870,6 +873,7 @@ "HeaderTypeText": "Vlo\u017ete text", "LabelTypeText": "Text", "HeaderSearchForSubtitles": "Vyhledat titulky", + "ButtonMore": "More", "MessageNoSubtitleSearchResultsFound": "No search results founds.", "TabDisplay": "Display", "TabLanguages": "Jazyky", @@ -900,7 +904,7 @@ "HeaderLiveTv": "Live TV", "HeaderReports": "Hl\u00e1\u0161en\u00ed", "HeaderMetadataManager": "Spr\u00e1vce metadat", - "HeaderPreferences": "Preferences", + "HeaderSettings": "Settings", "MessageLoadingChannels": "Loading channel content...", "MessageLoadingContent": "Loading content...", "ButtonMarkRead": "Ozna\u010dit jako p\u0159e\u010dten\u00e9", @@ -1098,7 +1102,6 @@ "OptionReportArtists": "Artists", "OptionReportAlbums": "Albums", "OptionReportAdultVideos": "Adult videos", - "ButtonMore": "More", "HeaderActivity": "Activity", "ScheduledTaskStartedWithName": "{0} started", "ScheduledTaskCancelledWithName": "{0} was cancelled", @@ -1392,7 +1395,7 @@ "HeaderUpcomingMovies": "Upcoming Movies", "HeaderUpcomingSports": "Upcoming Sports", "HeaderUpcomingPrograms": "Upcoming Programs", - "ButtonMoreItems": "More...", + "ButtonMoreItems": "More", "LabelShowLibraryTileNames": "Show library tile names", "LabelShowLibraryTileNamesHelp": "Determines if labels will be displayed underneath library tiles on the home page", "OptionEnableTranscodingThrottle": "Enable throttling", @@ -1411,7 +1414,6 @@ "OptionEnableFullSpeedConversion": "Enable full speed conversion", "OptionEnableFullSpeedConversionHelp": "By default, sync conversion is performed at a low speed to minimize resource consumption.", "HeaderPlaylists": "Playlists", - "HeaderSelectDate": "Select Date", "HeaderViewStyles": "View Styles", "LabelSelectViewStyles": "Enable enhanced presentations for:", "LabelSelectViewStylesHelp": "If enabled, views will be built with metadata to offer categories such as Suggestions, Latest, Genres, and more. If disabled, they'll be displayed with simple folders.", @@ -1439,5 +1441,14 @@ "ButtonUnlockGuide": "Unlock Guide", "LabelEnableFullScreen": "Enable fullscreen mode", "LabelEnableChromecastAc3Passthrough": "Enable Chromecast AC3 Passthrough", - "LabelSyncPath": "Synced content path:" + "LabelSyncPath": "Synced content path:", + "LabelEmail": "Email:", + "LabelUsername": "Username:", + "HeaderSignUp": "Sign Up", + "LabelPasswordConfirm": "Password (confirm):", + "ButtonAddServer": "Add Server", + "TabHomeScreen": "Home Screen", + "HeaderDisplay": "Display", + "HeaderNavigation": "Navigation", + "LegendTheseSettingsShared": "These settings are shared on all devices" }
\ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/Server/da.json b/MediaBrowser.Server.Implementations/Localization/Server/da.json index f76878746..5cd14b57e 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/da.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/da.json @@ -13,6 +13,7 @@ "LabelShowLogWindow": "Vis Log", "LabelPrevious": "Forrige", "LabelFinish": "Slut", + "FolderTypeMixed": "Mixed content", "LabelNext": "N\u00e6ste", "LabelYoureDone": "Du er f\u00e6rdig!", "WelcomeToProject": "Velkommen til Emby!", @@ -85,12 +86,11 @@ "ButtonDonateWithPayPal": "Doner via PayPal", "OptionDetectArchiveFilesAsMedia": "Opfat arkiver som medier", "OptionDetectArchiveFilesAsMediaHelp": "Aktiver dette for at f\u00e5 filer med .zip og .rar endelser genkendt dom medier.", - "LabelEnterConnectUserName": "Username or email:", - "LabelEnterConnectUserNameHelp": "This is your Emby online account username or password.", + "LabelEnterConnectUserName": "Brugernavn eller email:", + "LabelEnterConnectUserNameHelp": "Dette er dit Emby online brugernavn eller kodeord.", "LabelEnableEnhancedMovies": "Aktiver udvidede filmvisninger", "LabelEnableEnhancedMoviesHelp": "Aktiver dette for at f\u00e5 vist film som mapper med trailere, medvirkende og andet relateret inhold.", "HeaderSyncJobInfo": "Sync Job", - "FolderTypeMixed": "Blandet indhold", "FolderTypeMovies": "FIlm", "FolderTypeMusic": "Musik", "FolderTypeAdultVideos": "Voksenfilm", @@ -287,7 +287,9 @@ "OptionFileMetadataYearMismatch": "Uoverensstemmelse i \u00e5rstal mellem fil og metadata", "TabGeneral": "Generelt", "TitleSupport": "Support", + "LabelSeasonNumber": "Season number", "TabLog": "Log", + "LabelEpisodeNumber": "Episode number", "TabAbout": "Om", "TabSupporterKey": "Supporter n\u00f8gle", "TabBecomeSupporter": "Bliv Supporter", @@ -313,6 +315,9 @@ "OptionAllowRemoteControlOthers": "Tillad fjernstyring af andre brugere", "OptionAllowRemoteSharedDevices": "Tillad fjernstyring af delte enheder", "OptionAllowRemoteSharedDevicesHelp": "DLNA-enheder er delte indtil en bruger begynder at bruge den.", + "OptionAllowLinkSharing": "Allow social media sharing", + "OptionAllowLinkSharingHelp": "Only web pages containing media information are shared. Media files are never shared publicly. Shares are time-limited and will expire based on your server sharing settings.", + "HeaderSharing": "Sharing", "HeaderRemoteControl": "Fjernstyring", "OptionMissingTmdbId": "Manglende Tmdb Id", "OptionIsHD": "HD", @@ -581,8 +586,6 @@ "LabelSkipped": "Oversprunget", "HeaderEpisodeOrganization": "Organisation af episoder", "LabelSeries": "Serier", - "LabelSeasonNumber": "S\u00e6sonnummer", - "LabelEpisodeNumber": "Episodenummer", "LabelEndingEpisodeNumber": "Nummer p\u00e5 sidste episode", "LabelEndingEpisodeNumberHelp": "Kun n\u00f8dvendig for filer med flere episoder.", "HeaderSupportTheTeam": "St\u00f8t Emby-holdet", @@ -870,6 +873,7 @@ "HeaderTypeText": "Indtast tekst", "LabelTypeText": "Tekst", "HeaderSearchForSubtitles": "S\u00f8g efter undertekster", + "ButtonMore": "More", "MessageNoSubtitleSearchResultsFound": "Ingenting fundet.", "TabDisplay": "Visning", "TabLanguages": "Sprog", @@ -900,7 +904,7 @@ "HeaderLiveTv": "Live TV", "HeaderReports": "Rapporter", "HeaderMetadataManager": "Metadata Manager", - "HeaderPreferences": "Indstillinger", + "HeaderSettings": "Indstillinger", "MessageLoadingChannels": "Henter kanalindhold...", "MessageLoadingContent": "Henter indhold...", "ButtonMarkRead": "Marker som l\u00e6st", @@ -1098,7 +1102,6 @@ "OptionReportArtists": "Artister", "OptionReportAlbums": "Albums", "OptionReportAdultVideos": "Voksenfilm", - "ButtonMore": "Mere", "HeaderActivity": "Aktivitet", "ScheduledTaskStartedWithName": "{0} startet", "ScheduledTaskCancelledWithName": "{0} blev afbrudt", @@ -1392,7 +1395,7 @@ "HeaderUpcomingMovies": "Kommende film", "HeaderUpcomingSports": "Kommende sportsudsendelser", "HeaderUpcomingPrograms": "Kommende programmer", - "ButtonMoreItems": "Mere...", + "ButtonMoreItems": "More", "LabelShowLibraryTileNames": "Vis navne p\u00e5 fliser i biblioteket", "LabelShowLibraryTileNamesHelp": "Afg\u00f8r om der vises navn under hver flise p\u00e5 hjemmesiden", "OptionEnableTranscodingThrottle": "Aktiver neddrosling", @@ -1411,7 +1414,6 @@ "OptionEnableFullSpeedConversion": "Aktiver konvertering med fuld hastighed", "OptionEnableFullSpeedConversionHelp": "Som standard udf\u00f8res synkronseringskonverteringer ved lav hastighed for at minimere ressourceforbrug.", "HeaderPlaylists": "Afspilningslister", - "HeaderSelectDate": "V\u00e6lg dato", "HeaderViewStyles": "Visningsstiler", "LabelSelectViewStyles": "Aktiver udvidet pr\u00e6sentation for:", "LabelSelectViewStylesHelp": "Aktiver dette for at f\u00e5 visninger med kategorier som forslag, seneste, genrer, m.m. Hvis det ikke er aktiveret, bliver der vist almindelige mapper.", @@ -1439,5 +1441,14 @@ "ButtonUnlockGuide": "Opl\u00e5s guide", "LabelEnableFullScreen": "Enable fullscreen mode", "LabelEnableChromecastAc3Passthrough": "Enable Chromecast AC3 Passthrough", - "LabelSyncPath": "Synced content path:" + "LabelSyncPath": "Synced content path:", + "LabelEmail": "Email:", + "LabelUsername": "Username:", + "HeaderSignUp": "Sign Up", + "LabelPasswordConfirm": "Password (confirm):", + "ButtonAddServer": "Add Server", + "TabHomeScreen": "Home Screen", + "HeaderDisplay": "Display", + "HeaderNavigation": "Navigation", + "LegendTheseSettingsShared": "These settings are shared on all devices" }
\ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/Server/de.json b/MediaBrowser.Server.Implementations/Localization/Server/de.json index 3afcbb4b8..592b80fd8 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/de.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/de.json @@ -13,6 +13,7 @@ "LabelShowLogWindow": "Zeige Log Fenster", "LabelPrevious": "Vorheriges", "LabelFinish": "Fertig", + "FolderTypeMixed": "Mixed content", "LabelNext": "N\u00e4chstes", "LabelYoureDone": "Du bist fertig!", "WelcomeToProject": "Willkommen bei Emby!", @@ -85,12 +86,11 @@ "ButtonDonateWithPayPal": "Spende mit PayPal", "OptionDetectArchiveFilesAsMedia": "Behandle Archive wie Medien", "OptionDetectArchiveFilesAsMediaHelp": "Wenn aktiviert werden .rar und .zip Datei-Erweiterungen wie Medien behandelt.", - "LabelEnterConnectUserName": "Username or email:", - "LabelEnterConnectUserNameHelp": "This is your Emby online account username or password.", + "LabelEnterConnectUserName": "Benutzername oder Email:", + "LabelEnterConnectUserNameHelp": "Dies ist Ihr Emby online Zugangs Benutzername oder Passwort.", "LabelEnableEnhancedMovies": "Aktiviere erweiterte Filmdarstellung.", "LabelEnableEnhancedMoviesHelp": "Wenn aktiviert, werden Filme als Verzeichnisse dargestellt, welche Trailer, Extras, Besetzung & Crew sowie weitere Inhalte enth\u00e4lt.", "HeaderSyncJobInfo": "Synchronisations-Aufgabe", - "FolderTypeMixed": "Gemischte Inhalte", "FolderTypeMovies": "Filme", "FolderTypeMusic": "Musik", "FolderTypeAdultVideos": "Videos f\u00fcr Erwachsene", @@ -287,7 +287,9 @@ "OptionFileMetadataYearMismatch": "Datei \/ Metadaten Jahre stimmen nicht \u00fcberein", "TabGeneral": "Allgemein", "TitleSupport": "Support", + "LabelSeasonNumber": "Staffelnummer", "TabLog": "Log", + "LabelEpisodeNumber": "Episodennummer", "TabAbout": "\u00dcber", "TabSupporterKey": "Unterst\u00fctzerschl\u00fcssel", "TabBecomeSupporter": "Werde ein Unterst\u00fctzer", @@ -313,6 +315,9 @@ "OptionAllowRemoteControlOthers": "Erlaube Fernsteuerung anderer Benutzer", "OptionAllowRemoteSharedDevices": "Erlaube Fernsteuerung geteilter Ger\u00e4te", "OptionAllowRemoteSharedDevicesHelp": "DLNA-Ger\u00e4te werden gemeinsam genutzt, bis ein Benutzer die Steuerung \u00fcbernimmt.", + "OptionAllowLinkSharing": "Erlaube das Teilen in sozialen Netzwerken", + "OptionAllowLinkSharingHelp": "Es werden nur Web-Seiten mit Medieninformationen geteilt. Medien werden niemals \u00f6ffentlich geteilt. Die geteilten Inhalte sind nur begrenzt zug\u00e4nglich und werden basieren auf den Servereinstellungen ung\u00fcltig.", + "HeaderSharing": "Teilen", "HeaderRemoteControl": "Fernsteuerung", "OptionMissingTmdbId": "Fehlende Tmdb Id", "OptionIsHD": "HD", @@ -581,8 +586,6 @@ "LabelSkipped": "\u00dcbersprungen", "HeaderEpisodeOrganization": "Episodensortierung", "LabelSeries": "Serien:", - "LabelSeasonNumber": "Staffelnummer:", - "LabelEpisodeNumber": "Episodennummer:", "LabelEndingEpisodeNumber": "Nummer der letzten Episode:", "LabelEndingEpisodeNumberHelp": "Nur erforderlich f\u00fcr Mehrfachepisoden", "HeaderSupportTheTeam": "Unterst\u00fctzen Sie das Emby Team", @@ -870,6 +873,7 @@ "HeaderTypeText": "Texteingabe", "LabelTypeText": "Text", "HeaderSearchForSubtitles": "Suche nach Untertiteln", + "ButtonMore": "More", "MessageNoSubtitleSearchResultsFound": "Keine Suchergebnisse gefunden", "TabDisplay": "Anzeige", "TabLanguages": "Sprachen", @@ -900,7 +904,7 @@ "HeaderLiveTv": "Live-TV", "HeaderReports": "Berichte", "HeaderMetadataManager": "Metadaten-Manager", - "HeaderPreferences": "Einstellungen", + "HeaderSettings": "Einstellungen", "MessageLoadingChannels": "Lade Kanalinhalt...", "MessageLoadingContent": "Lade Inhalt...", "ButtonMarkRead": "Als gelesen markieren", @@ -1098,7 +1102,6 @@ "OptionReportArtists": "Interpreten", "OptionReportAlbums": "Alben", "OptionReportAdultVideos": "Videos f\u00fcr Erwachsene", - "ButtonMore": "Mehr", "HeaderActivity": "Aktivit\u00e4ten", "ScheduledTaskStartedWithName": "{0} gestartet", "ScheduledTaskCancelledWithName": "{0} wurde abgebrochen", @@ -1392,7 +1395,7 @@ "HeaderUpcomingMovies": "Bevorstehende Filme", "HeaderUpcomingSports": "Folgende Sportveranstaltungen", "HeaderUpcomingPrograms": "Bevorstehende Programme", - "ButtonMoreItems": "Mehr...", + "ButtonMoreItems": "Mehr", "LabelShowLibraryTileNames": "Zeige Bibliothek Kachelnamen.", "LabelShowLibraryTileNamesHelp": "Legen Sie fest, ob Beschriftungen unter den Kacheln der Startseite angezeigt werden sollen.", "OptionEnableTranscodingThrottle": "aktiviere Drosselung", @@ -1411,7 +1414,6 @@ "OptionEnableFullSpeedConversion": "Aktiviere Hochleistung-Konvertierung.", "OptionEnableFullSpeedConversionHelp": "Standardm\u00e4\u00dfig werden Synchronisations-Konvertierungen bei geringer Geschwindigkeit durchgef\u00fchrt um Ressourcen zu sparen.", "HeaderPlaylists": "Wiedergabeliste", - "HeaderSelectDate": "Datum w\u00e4hlen", "HeaderViewStyles": "Zeige Stiele", "LabelSelectViewStyles": "Aktiviere erweiterte Ansichten f\u00fcr:", "LabelSelectViewStylesHelp": "Wenn aktiviert werden Darstellungen von Kategorien mit Medieninformationen wie Empfehlungen, k\u00fcrzlich hinzugef\u00fcgt, Genres und weitere, angereichert. Wenn deaktiviert werden diese nur als simple Verzeichnisse dargestellt.", @@ -1437,7 +1439,16 @@ "ButtonReset": "Reset", "OptionEnableExternalVideoPlayers": "Aktiviere externe Videoplayer", "ButtonUnlockGuide": "Guide freischalten", - "LabelEnableFullScreen": "Enable fullscreen mode", - "LabelEnableChromecastAc3Passthrough": "Enable Chromecast AC3 Passthrough", - "LabelSyncPath": "Synced content path:" + "LabelEnableFullScreen": "Aktiviere Vollbild", + "LabelEnableChromecastAc3Passthrough": "Aktiviere direkte Chromcast AC3 Weiterleitung", + "LabelSyncPath": "Pfad der synchronisierten Medien:", + "LabelEmail": "Email:", + "LabelUsername": "Benutzername:", + "HeaderSignUp": "Anmelden", + "LabelPasswordConfirm": "Passwort (Best\u00e4tigung):", + "ButtonAddServer": "Server hinzuf\u00fcgen", + "TabHomeScreen": "Startseite", + "HeaderDisplay": "Anzeigen", + "HeaderNavigation": "Navigation", + "LegendTheseSettingsShared": "Diese Einstellungen werden mit allen Ger\u00e4ten geteilt" }
\ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/Server/el.json b/MediaBrowser.Server.Implementations/Localization/Server/el.json index 01489624d..351664681 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/el.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/el.json @@ -13,6 +13,7 @@ "LabelShowLogWindow": "\u0391\u03c1\u03c7\u03b5\u03af\u03bf \u039a\u03b1\u03c4\u03b1\u03b3\u03c1\u03b1\u03c6\u03ae\u03c2", "LabelPrevious": "\u03c0\u03c1\u03bf\u03b7\u03b3\u03bf\u03cd\u03bc\u03b5\u03bd\u03bf\u03c2", "LabelFinish": "\u03a4\u03ad\u03bb\u03bf\u03c2", + "FolderTypeMixed": "Mixed content", "LabelNext": "\u0395\u03c0\u03cc\u03bc\u03b5\u03bd\u03bf", "LabelYoureDone": "\u0395\u03af\u03c3\u03c4\u03b5 \u0388\u03c4\u03bf\u03b9\u03bc\u03bf\u03b9!", "WelcomeToProject": "\u039a\u03b1\u03bb\u03c9\u03c2 \u03ae\u03c1\u03b8\u03b1\u03c4\u03b5 \u03c3\u03c4\u03bf Emby!", @@ -85,12 +86,11 @@ "ButtonDonateWithPayPal": "\u0394\u03c9\u03c1\u03b5\u03ac \u03bc\u03ad\u03c3\u03c9 Paypal", "OptionDetectArchiveFilesAsMedia": "\u0391\u03bd\u03b1\u03b3\u03bd\u03ce\u03c1\u03b9\u03c3\u03b5 \u03a3\u03c5\u03bc\u03c0\u03b9\u03b5\u03c3\u03bc\u03ad\u03bd\u03b1 \u03b1\u03c1\u03c7\u03b5\u03af\u03b1 \u03c9\u03c2 \u03c0\u03bf\u03bb\u03c5\u03bc\u03ad\u03c3\u03b1.", "OptionDetectArchiveFilesAsMediaHelp": "\u0391\u03c1\u03c7\u03b5\u03af\u03b1 \u03bc\u03b5 .rar \u03ba\u03b1\u03b9 .zip \u03ba\u03b1\u03c4\u03b1\u03bb\u03ae\u03be\u03b5\u03b9\u03c2 \u03b8\u03b1 \u03b1\u03bd\u03b1\u03b3\u03bd\u03c9\u03c1\u03af\u03b6\u03bf\u03bd\u03c4\u03b1\u03b9 \u03c9\u03c2 \u03b1\u03c1\u03c7\u03b5\u03af\u03b1 \u03c0\u03bf\u03bb\u03c5\u03bc\u03ad\u03c3\u03c9\u03bd.", - "LabelEnterConnectUserName": "\u038c\u03bd\u03bf\u03bc\u03b1 \u03a7\u03c1\u03ae\u03c3\u03c4\u03b7 \u03ae email:", + "LabelEnterConnectUserName": "Username or email:", "LabelEnterConnectUserNameHelp": "This is your Emby online account username or password.", "LabelEnableEnhancedMovies": "Enable enhanced movie displays", "LabelEnableEnhancedMoviesHelp": "When enabled, movies will be displayed as folders to include trailers, extras, cast & crew, and other related content.", "HeaderSyncJobInfo": "\u0395\u03c1\u03b3\u03b1\u03c3\u03af\u03b1 \u03a3\u03c5\u03b3\u03c7\u03c1\u03bf\u03bd\u03b9\u03c3\u03bc\u03bf\u03cd", - "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", @@ -287,7 +287,9 @@ "OptionFileMetadataYearMismatch": "File\/Metadata Years Mismatched", "TabGeneral": "General", "TitleSupport": "Support", + "LabelSeasonNumber": "Season number", "TabLog": "\u0391\u03c1\u03c7\u03b5\u03af\u03bf \u039a\u03b1\u03c4\u03b1\u03b3\u03c1\u03b1\u03c6\u03ae\u03c2", + "LabelEpisodeNumber": "Episode number", "TabAbout": "\u03a0\u03b5\u03c1\u03af..", "TabSupporterKey": "\u03a3\u03b5\u03b9\u03c1\u03b9\u03b1\u03ba\u03cc\u03c2 \u03a5\u03c0\u03bf\u03c3\u03c4\u03ae\u03c1\u03b9\u03be\u03b7\u03c2", "TabBecomeSupporter": "\u0393\u03af\u03bd\u03b5 \u03a5\u03c0\u03bf\u03c3\u03c4\u03b7\u03c1\u03b9\u03ba\u03c4\u03ae\u03c2", @@ -313,6 +315,9 @@ "OptionAllowRemoteControlOthers": "Allow remote control of other users", "OptionAllowRemoteSharedDevices": "Allow remote control of shared devices", "OptionAllowRemoteSharedDevicesHelp": "Dlna devices are considered shared until a user begins controlling it.", + "OptionAllowLinkSharing": "Allow social media sharing", + "OptionAllowLinkSharingHelp": "Only web pages containing media information are shared. Media files are never shared publicly. Shares are time-limited and will expire based on your server sharing settings.", + "HeaderSharing": "Sharing", "HeaderRemoteControl": "\u03a4\u03b7\u03bb\u03b5\u03c7\u03b5\u03b9\u03c1\u03b9\u03c3\u03c4\u03ae\u03c1\u03b9\u03bf", "OptionMissingTmdbId": "Missing Tmdb Id", "OptionIsHD": "HD", @@ -581,8 +586,6 @@ "LabelSkipped": "Skipped", "HeaderEpisodeOrganization": "Episode Organization", "LabelSeries": "Series:", - "LabelSeasonNumber": "Season number:", - "LabelEpisodeNumber": "Episode number:", "LabelEndingEpisodeNumber": "Ending episode number:", "LabelEndingEpisodeNumberHelp": "Only required for multi-episode files", "HeaderSupportTheTeam": "Support the Emby Team", @@ -870,6 +873,7 @@ "HeaderTypeText": "Enter Text", "LabelTypeText": "Text", "HeaderSearchForSubtitles": "Search for Subtitles", + "ButtonMore": "More", "MessageNoSubtitleSearchResultsFound": "No search results founds.", "TabDisplay": "Display", "TabLanguages": "Languages", @@ -900,7 +904,7 @@ "HeaderLiveTv": "Live TV", "HeaderReports": "Reports", "HeaderMetadataManager": "Metadata Manager", - "HeaderPreferences": "Preferences", + "HeaderSettings": "Settings", "MessageLoadingChannels": "Loading channel content...", "MessageLoadingContent": "Loading content...", "ButtonMarkRead": "Mark Read", @@ -1098,7 +1102,6 @@ "OptionReportArtists": "Artists", "OptionReportAlbums": "Albums", "OptionReportAdultVideos": "Adult videos", - "ButtonMore": "More", "HeaderActivity": "Activity", "ScheduledTaskStartedWithName": "{0} started", "ScheduledTaskCancelledWithName": "{0} was cancelled", @@ -1392,7 +1395,7 @@ "HeaderUpcomingMovies": "Upcoming Movies", "HeaderUpcomingSports": "Upcoming Sports", "HeaderUpcomingPrograms": "Upcoming Programs", - "ButtonMoreItems": "More...", + "ButtonMoreItems": "More", "LabelShowLibraryTileNames": "Show library tile names", "LabelShowLibraryTileNamesHelp": "Determines if labels will be displayed underneath library tiles on the home page", "OptionEnableTranscodingThrottle": "Enable throttling", @@ -1411,7 +1414,6 @@ "OptionEnableFullSpeedConversion": "Enable full speed conversion", "OptionEnableFullSpeedConversionHelp": "By default, sync conversion is performed at a low speed to minimize resource consumption.", "HeaderPlaylists": "Playlists", - "HeaderSelectDate": "Select Date", "HeaderViewStyles": "View Styles", "LabelSelectViewStyles": "Enable enhanced presentations for:", "LabelSelectViewStylesHelp": "If enabled, views will be built with metadata to offer categories such as Suggestions, Latest, Genres, and more. If disabled, they'll be displayed with simple folders.", @@ -1439,5 +1441,14 @@ "ButtonUnlockGuide": "Unlock Guide", "LabelEnableFullScreen": "Enable fullscreen mode", "LabelEnableChromecastAc3Passthrough": "Enable Chromecast AC3 Passthrough", - "LabelSyncPath": "Synced content path:" + "LabelSyncPath": "Synced content path:", + "LabelEmail": "Email:", + "LabelUsername": "Username:", + "HeaderSignUp": "Sign Up", + "LabelPasswordConfirm": "Password (confirm):", + "ButtonAddServer": "Add Server", + "TabHomeScreen": "Home Screen", + "HeaderDisplay": "Display", + "HeaderNavigation": "Navigation", + "LegendTheseSettingsShared": "These settings are shared on all devices" }
\ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/Server/en-GB.json b/MediaBrowser.Server.Implementations/Localization/Server/en-GB.json index 5cbd4139c..1c8cea090 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/en-GB.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/en-GB.json @@ -13,6 +13,7 @@ "LabelShowLogWindow": "Show Log Window", "LabelPrevious": "Previous", "LabelFinish": "Finish", + "FolderTypeMixed": "Mixed content", "LabelNext": "Next", "LabelYoureDone": "You're Done!", "WelcomeToProject": "Welcome to Emby!", @@ -90,7 +91,6 @@ "LabelEnableEnhancedMovies": "Enable enhanced movie displays", "LabelEnableEnhancedMoviesHelp": "When enabled, movies will be displayed as folders to include trailers, extras, cast & crew, and other related content.", "HeaderSyncJobInfo": "Sync Job", - "FolderTypeMixed": "Mixed content", "FolderTypeMovies": "Movies", "FolderTypeMusic": "Music", "FolderTypeAdultVideos": "Adult videos", @@ -287,7 +287,9 @@ "OptionFileMetadataYearMismatch": "File\/Metadata Years Mismatched", "TabGeneral": "General", "TitleSupport": "Support", + "LabelSeasonNumber": "Season number", "TabLog": "Log", + "LabelEpisodeNumber": "Episode number", "TabAbout": "About", "TabSupporterKey": "Supporter Key", "TabBecomeSupporter": "Become a Supporter", @@ -313,6 +315,9 @@ "OptionAllowRemoteControlOthers": "Allow remote control of other users", "OptionAllowRemoteSharedDevices": "Allow remote control of shared devices", "OptionAllowRemoteSharedDevicesHelp": "Dlna devices are considered shared until a user begins controlling it.", + "OptionAllowLinkSharing": "Allow social media sharing", + "OptionAllowLinkSharingHelp": "Only web pages containing media information are shared. Media files are never shared publicly. Shares are time-limited and will expire based on your server sharing settings.", + "HeaderSharing": "Sharing", "HeaderRemoteControl": "Remote Control", "OptionMissingTmdbId": "Missing Tmdb Id", "OptionIsHD": "HD", @@ -581,8 +586,6 @@ "LabelSkipped": "Skipped", "HeaderEpisodeOrganization": "Episode Organisation", "LabelSeries": "Series:", - "LabelSeasonNumber": "Season number:", - "LabelEpisodeNumber": "Episode number:", "LabelEndingEpisodeNumber": "Ending episode number:", "LabelEndingEpisodeNumberHelp": "Only required for multi-episode files", "HeaderSupportTheTeam": "Support the Emby Team", @@ -870,6 +873,7 @@ "HeaderTypeText": "Enter Text", "LabelTypeText": "Text", "HeaderSearchForSubtitles": "Search for Subtitles", + "ButtonMore": "More", "MessageNoSubtitleSearchResultsFound": "No search results founds.", "TabDisplay": "Display", "TabLanguages": "Languages", @@ -900,7 +904,7 @@ "HeaderLiveTv": "Live TV", "HeaderReports": "Reports", "HeaderMetadataManager": "Metadata Manager", - "HeaderPreferences": "Preferences", + "HeaderSettings": "Settings", "MessageLoadingChannels": "Loading channel content...", "MessageLoadingContent": "Loading content...", "ButtonMarkRead": "Mark Read", @@ -1098,7 +1102,6 @@ "OptionReportArtists": "Artists", "OptionReportAlbums": "Albums", "OptionReportAdultVideos": "Adult videos", - "ButtonMore": "More", "HeaderActivity": "Activity", "ScheduledTaskStartedWithName": "{0} started", "ScheduledTaskCancelledWithName": "{0} was cancelled", @@ -1392,7 +1395,7 @@ "HeaderUpcomingMovies": "Upcoming Movies", "HeaderUpcomingSports": "Upcoming Sports", "HeaderUpcomingPrograms": "Upcoming Programs", - "ButtonMoreItems": "More...", + "ButtonMoreItems": "More", "LabelShowLibraryTileNames": "Show library tile names", "LabelShowLibraryTileNamesHelp": "Determines if labels will be displayed underneath library tiles on the home page", "OptionEnableTranscodingThrottle": "Enable throttling", @@ -1411,7 +1414,6 @@ "OptionEnableFullSpeedConversion": "Enable full speed conversion", "OptionEnableFullSpeedConversionHelp": "By default, sync conversion is performed at a low speed to minimize resource consumption.", "HeaderPlaylists": "Playlists", - "HeaderSelectDate": "Select Date", "HeaderViewStyles": "View Styles", "LabelSelectViewStyles": "Enable enhanced presentations for:", "LabelSelectViewStylesHelp": "If enabled, views will be built with metadata to offer categories such as Suggestions, Latest, Genres, and more. If disabled, they'll be displayed with simple folders.", @@ -1439,5 +1441,14 @@ "ButtonUnlockGuide": "Unlock Guide", "LabelEnableFullScreen": "Enable fullscreen mode", "LabelEnableChromecastAc3Passthrough": "Enable Chromecast AC3 Passthrough", - "LabelSyncPath": "Synced content path:" + "LabelSyncPath": "Synced content path:", + "LabelEmail": "Email:", + "LabelUsername": "Username:", + "HeaderSignUp": "Sign Up", + "LabelPasswordConfirm": "Password (confirm):", + "ButtonAddServer": "Add Server", + "TabHomeScreen": "Home Screen", + "HeaderDisplay": "Display", + "HeaderNavigation": "Navigation", + "LegendTheseSettingsShared": "These settings are shared on all devices" }
\ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/Server/en-US.json b/MediaBrowser.Server.Implementations/Localization/Server/en-US.json index 1c9f65feb..6ad65ba6c 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/en-US.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/en-US.json @@ -13,6 +13,7 @@ "LabelShowLogWindow": "Show Log Window", "LabelPrevious": "Previous", "LabelFinish": "Finish", + "FolderTypeMixed": "Mixed content", "LabelNext": "Next", "LabelYoureDone": "You're Done!", "WelcomeToProject": "Welcome to Emby!", @@ -90,7 +91,6 @@ "LabelEnableEnhancedMovies": "Enable enhanced movie displays", "LabelEnableEnhancedMoviesHelp": "When enabled, movies will be displayed as folders to include trailers, extras, cast & crew, and other related content.", "HeaderSyncJobInfo": "Sync Job", - "FolderTypeMixed": "Mixed content", "FolderTypeMovies": "Movies", "FolderTypeMusic": "Music", "FolderTypeAdultVideos": "Adult videos", @@ -287,7 +287,9 @@ "OptionFileMetadataYearMismatch": "File\/Metadata Years Mismatched", "TabGeneral": "General", "TitleSupport": "Support", + "LabelSeasonNumber": "Season number", "TabLog": "Log", + "LabelEpisodeNumber": "Episode number", "TabAbout": "About", "TabSupporterKey": "Supporter Key", "TabBecomeSupporter": "Become a Supporter", @@ -313,6 +315,9 @@ "OptionAllowRemoteControlOthers": "Allow remote control of other users", "OptionAllowRemoteSharedDevices": "Allow remote control of shared devices", "OptionAllowRemoteSharedDevicesHelp": "Dlna devices are considered shared until a user begins controlling it.", + "OptionAllowLinkSharing": "Allow social media sharing", + "OptionAllowLinkSharingHelp": "Only web pages containing media information are shared. Media files are never shared publicly. Shares are time-limited and will expire based on your server sharing settings.", + "HeaderSharing": "Sharing", "HeaderRemoteControl": "Remote Control", "OptionMissingTmdbId": "Missing Tmdb Id", "OptionIsHD": "HD", @@ -581,8 +586,6 @@ "LabelSkipped": "Skipped", "HeaderEpisodeOrganization": "Episode Organization", "LabelSeries": "Series:", - "LabelSeasonNumber": "Season number:", - "LabelEpisodeNumber": "Episode number:", "LabelEndingEpisodeNumber": "Ending episode number:", "LabelEndingEpisodeNumberHelp": "Only required for multi-episode files", "HeaderSupportTheTeam": "Support the Emby Team", @@ -870,6 +873,7 @@ "HeaderTypeText": "Enter Text", "LabelTypeText": "Text", "HeaderSearchForSubtitles": "Search for Subtitles", + "ButtonMore": "More", "MessageNoSubtitleSearchResultsFound": "No search results founds.", "TabDisplay": "Display", "TabLanguages": "Languages", @@ -900,7 +904,7 @@ "HeaderLiveTv": "Live TV", "HeaderReports": "Reports", "HeaderMetadataManager": "Metadata Manager", - "HeaderPreferences": "Preferences", + "HeaderSettings": "Settings", "MessageLoadingChannels": "Loading channel content...", "MessageLoadingContent": "Loading content...", "ButtonMarkRead": "Mark Read", @@ -1098,7 +1102,6 @@ "OptionReportArtists": "Artists", "OptionReportAlbums": "Albums", "OptionReportAdultVideos": "Adult videos", - "ButtonMore": "More", "HeaderActivity": "Activity", "ScheduledTaskStartedWithName": "{0} started", "ScheduledTaskCancelledWithName": "{0} was cancelled", @@ -1392,7 +1395,7 @@ "HeaderUpcomingMovies": "Upcoming Movies", "HeaderUpcomingSports": "Upcoming Sports", "HeaderUpcomingPrograms": "Upcoming Programs", - "ButtonMoreItems": "More...", + "ButtonMoreItems": "More", "LabelShowLibraryTileNames": "Show library tile names", "LabelShowLibraryTileNamesHelp": "Determines if labels will be displayed underneath library tiles on the home page", "OptionEnableTranscodingThrottle": "Enable throttling", @@ -1411,7 +1414,6 @@ "OptionEnableFullSpeedConversion": "Enable full speed conversion", "OptionEnableFullSpeedConversionHelp": "By default, sync conversion is performed at a low speed to minimize resource consumption.", "HeaderPlaylists": "Playlists", - "HeaderSelectDate": "Select Date", "HeaderViewStyles": "View Styles", "LabelSelectViewStyles": "Enable enhanced presentations for:", "LabelSelectViewStylesHelp": "If enabled, views will be built with metadata to offer categories such as Suggestions, Latest, Genres, and more. If disabled, they'll be displayed with simple folders.", @@ -1439,5 +1441,14 @@ "ButtonUnlockGuide": "Unlock Guide", "LabelEnableFullScreen": "Enable fullscreen mode", "LabelEnableChromecastAc3Passthrough": "Enable Chromecast AC3 Passthrough", - "LabelSyncPath": "Synced content path:" + "LabelSyncPath": "Synced content path:", + "LabelEmail": "Email:", + "LabelUsername": "Username:", + "HeaderSignUp": "Sign Up", + "LabelPasswordConfirm": "Password (confirm):", + "ButtonAddServer": "Add Server", + "TabHomeScreen": "Home Screen", + "HeaderDisplay": "Display", + "HeaderNavigation": "Navigation", + "LegendTheseSettingsShared": "These settings are shared on all devices" }
\ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/Server/es-AR.json b/MediaBrowser.Server.Implementations/Localization/Server/es-AR.json index f1460057e..ee8ec5693 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/es-AR.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/es-AR.json @@ -13,6 +13,7 @@ "LabelShowLogWindow": "Show Log Window", "LabelPrevious": "Previous", "LabelFinish": "Finish", + "FolderTypeMixed": "Mixed content", "LabelNext": "Next", "LabelYoureDone": "Ha terminado!", "WelcomeToProject": "Bienvenidos a Emby!", @@ -90,7 +91,6 @@ "LabelEnableEnhancedMovies": "Enable enhanced movie displays", "LabelEnableEnhancedMoviesHelp": "When enabled, movies will be displayed as folders to include trailers, extras, cast & crew, and other related content.", "HeaderSyncJobInfo": "Sync Job", - "FolderTypeMixed": "Mixed content", "FolderTypeMovies": "Movies", "FolderTypeMusic": "Music", "FolderTypeAdultVideos": "Adult videos", @@ -287,7 +287,9 @@ "OptionFileMetadataYearMismatch": "File\/Metadata Years Mismatched", "TabGeneral": "General", "TitleSupport": "Support", + "LabelSeasonNumber": "Season number", "TabLog": "Log", + "LabelEpisodeNumber": "Episode number", "TabAbout": "About", "TabSupporterKey": "Supporter Key", "TabBecomeSupporter": "Become a Supporter", @@ -313,6 +315,9 @@ "OptionAllowRemoteControlOthers": "Allow remote control of other users", "OptionAllowRemoteSharedDevices": "Allow remote control of shared devices", "OptionAllowRemoteSharedDevicesHelp": "Dlna devices are considered shared until a user begins controlling it.", + "OptionAllowLinkSharing": "Allow social media sharing", + "OptionAllowLinkSharingHelp": "Only web pages containing media information are shared. Media files are never shared publicly. Shares are time-limited and will expire based on your server sharing settings.", + "HeaderSharing": "Sharing", "HeaderRemoteControl": "Remote Control", "OptionMissingTmdbId": "Missing Tmdb Id", "OptionIsHD": "HD", @@ -581,8 +586,6 @@ "LabelSkipped": "Skipped", "HeaderEpisodeOrganization": "Episode Organization", "LabelSeries": "Series:", - "LabelSeasonNumber": "Season number:", - "LabelEpisodeNumber": "Episode number:", "LabelEndingEpisodeNumber": "Ending episode number:", "LabelEndingEpisodeNumberHelp": "Only required for multi-episode files", "HeaderSupportTheTeam": "Support the Emby Team", @@ -870,6 +873,7 @@ "HeaderTypeText": "Enter Text", "LabelTypeText": "Text", "HeaderSearchForSubtitles": "Search for Subtitles", + "ButtonMore": "More", "MessageNoSubtitleSearchResultsFound": "No search results founds.", "TabDisplay": "Display", "TabLanguages": "Languages", @@ -900,7 +904,7 @@ "HeaderLiveTv": "Live TV", "HeaderReports": "Reports", "HeaderMetadataManager": "Metadata Manager", - "HeaderPreferences": "Preferences", + "HeaderSettings": "Settings", "MessageLoadingChannels": "Loading channel content...", "MessageLoadingContent": "Loading content...", "ButtonMarkRead": "Mark Read", @@ -1098,7 +1102,6 @@ "OptionReportArtists": "Artists", "OptionReportAlbums": "Albums", "OptionReportAdultVideos": "Adult videos", - "ButtonMore": "More", "HeaderActivity": "Activity", "ScheduledTaskStartedWithName": "{0} started", "ScheduledTaskCancelledWithName": "{0} was cancelled", @@ -1392,7 +1395,7 @@ "HeaderUpcomingMovies": "Upcoming Movies", "HeaderUpcomingSports": "Upcoming Sports", "HeaderUpcomingPrograms": "Upcoming Programs", - "ButtonMoreItems": "More...", + "ButtonMoreItems": "More", "LabelShowLibraryTileNames": "Show library tile names", "LabelShowLibraryTileNamesHelp": "Determines if labels will be displayed underneath library tiles on the home page", "OptionEnableTranscodingThrottle": "Enable throttling", @@ -1411,7 +1414,6 @@ "OptionEnableFullSpeedConversion": "Enable full speed conversion", "OptionEnableFullSpeedConversionHelp": "By default, sync conversion is performed at a low speed to minimize resource consumption.", "HeaderPlaylists": "Playlists", - "HeaderSelectDate": "Select Date", "HeaderViewStyles": "View Styles", "LabelSelectViewStyles": "Enable enhanced presentations for:", "LabelSelectViewStylesHelp": "If enabled, views will be built with metadata to offer categories such as Suggestions, Latest, Genres, and more. If disabled, they'll be displayed with simple folders.", @@ -1439,5 +1441,14 @@ "ButtonUnlockGuide": "Unlock Guide", "LabelEnableFullScreen": "Enable fullscreen mode", "LabelEnableChromecastAc3Passthrough": "Enable Chromecast AC3 Passthrough", - "LabelSyncPath": "Synced content path:" + "LabelSyncPath": "Synced content path:", + "LabelEmail": "Email:", + "LabelUsername": "Username:", + "HeaderSignUp": "Sign Up", + "LabelPasswordConfirm": "Password (confirm):", + "ButtonAddServer": "Add Server", + "TabHomeScreen": "Home Screen", + "HeaderDisplay": "Display", + "HeaderNavigation": "Navigation", + "LegendTheseSettingsShared": "These settings are shared on all devices" }
\ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/Server/es-MX.json b/MediaBrowser.Server.Implementations/Localization/Server/es-MX.json index 374743120..74e127e6a 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/es-MX.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/es-MX.json @@ -13,6 +13,7 @@ "LabelShowLogWindow": "Mostrar Ventana de Bit\u00e1cora", "LabelPrevious": "Anterior", "LabelFinish": "Terminar", + "FolderTypeMixed": "Mixed content", "LabelNext": "Siguiente", "LabelYoureDone": "Ha Terminado!", "WelcomeToProject": "Bienvenido a Emby!", @@ -90,7 +91,6 @@ "LabelEnableEnhancedMovies": "Habilitar visualizaci\u00f3n mejorada de pel\u00edculas", "LabelEnableEnhancedMoviesHelp": "Cuando se activa, la pel\u00edculas ser\u00e1n mostradas como carpetas para incluir tr\u00e1ilers, extras, elenco y equipo, y otros contenidos relacionados.", "HeaderSyncJobInfo": "Trabajo de Sinc", - "FolderTypeMixed": "Contenido mezclado", "FolderTypeMovies": "Pel\u00edculas", "FolderTypeMusic": "M\u00fasica", "FolderTypeAdultVideos": "Videos para adultos", @@ -287,7 +287,9 @@ "OptionFileMetadataYearMismatch": "No coincide el A\u00f1o del Archivo con los Metadatos", "TabGeneral": "General", "TitleSupport": "Soporte", + "LabelSeasonNumber": "Season number", "TabLog": "Bit\u00e1cora", + "LabelEpisodeNumber": "Episode number", "TabAbout": "Acerca de", "TabSupporterKey": "Clave de Aficionado", "TabBecomeSupporter": "Convertirse en Aficionado", @@ -313,6 +315,9 @@ "OptionAllowRemoteControlOthers": "Permitir control remoto de otros usuarios", "OptionAllowRemoteSharedDevices": "Permitir control remoto de dispositivos compartidos", "OptionAllowRemoteSharedDevicesHelp": "Los dispositivos dnla son considerados como compartidos hasta que alg\u00fan usuario comienza a controlarlo.", + "OptionAllowLinkSharing": "Permitir compartir medios en redes sociales.", + "OptionAllowLinkSharingHelp": "Solo son compartidas paginas web que contengan informaci\u00f3n sobre los medios. Los archivos de medios nunca son compartidos p\u00fablicamente. Son compartidos por un tiempo limitado y expiraran basados en las configuraciones para compartir de su servidor.", + "HeaderSharing": "Compartido", "HeaderRemoteControl": "Control Remoto", "OptionMissingTmdbId": "Falta Id de Tmdb", "OptionIsHD": "HD", @@ -581,8 +586,6 @@ "LabelSkipped": "Omitido", "HeaderEpisodeOrganization": "Organizaci\u00f3n de Episodios", "LabelSeries": "Series:", - "LabelSeasonNumber": "N\u00famero de temporada:", - "LabelEpisodeNumber": "N\u00famero de episodio:", "LabelEndingEpisodeNumber": "N\u00famero episodio final:", "LabelEndingEpisodeNumberHelp": "S\u00f3lo requerido para archivos multi-episodio", "HeaderSupportTheTeam": "Apoye al equipo de Emby", @@ -870,6 +873,7 @@ "HeaderTypeText": "Introduzca Texto", "LabelTypeText": "Texto", "HeaderSearchForSubtitles": "Buscar Subtitulos", + "ButtonMore": "M\u00e1s", "MessageNoSubtitleSearchResultsFound": "No se encontraron resultados en la b\u00fasqueda.", "TabDisplay": "Pantalla", "TabLanguages": "Idiomas", @@ -900,7 +904,7 @@ "HeaderLiveTv": "TV en Vivo", "HeaderReports": "Reportes", "HeaderMetadataManager": "Administrador de Metadatos", - "HeaderPreferences": "Preferencias", + "HeaderSettings": "Configuraci\u00f3n", "MessageLoadingChannels": "Cargando contenidos del canal...", "MessageLoadingContent": "Cargando contenido...", "ButtonMarkRead": "Marcar como Le\u00eddo", @@ -1098,7 +1102,6 @@ "OptionReportArtists": "Artistas", "OptionReportAlbums": "\u00c1lbumes", "OptionReportAdultVideos": "Videos para Adultos", - "ButtonMore": "M\u00e1s", "HeaderActivity": "Actividad", "ScheduledTaskStartedWithName": "{0} Iniciado", "ScheduledTaskCancelledWithName": "{0} fue cancelado", @@ -1392,7 +1395,7 @@ "HeaderUpcomingMovies": "Pel\u00edculas por Estrenar", "HeaderUpcomingSports": "Deportes por Estrenar", "HeaderUpcomingPrograms": "Programas por Estrenar", - "ButtonMoreItems": "M\u00e1s...", + "ButtonMoreItems": "Mas", "LabelShowLibraryTileNames": "Mostrar nombres de t\u00edtulo de las bibliotecas", "LabelShowLibraryTileNamesHelp": "Determina si se desplegar\u00e1n etiquetas debajo de los t\u00edtulos de las bibliotecas con la p\u00e1gina principal", "OptionEnableTranscodingThrottle": "Habilitar contenci\u00f3n", @@ -1411,7 +1414,6 @@ "OptionEnableFullSpeedConversion": "Habilitar conversi\u00f3n a m\u00e1xima velocidad", "OptionEnableFullSpeedConversionHelp": "Por defecto, la conversi\u00f3n es realizada a baja velocidad para minimizar el consumo de recursos.", "HeaderPlaylists": "Listas", - "HeaderSelectDate": "Seleccionar fecha", "HeaderViewStyles": "Ver Estilos", "LabelSelectViewStyles": "Abilitar presentaciones mejoradas para:", "LabelSelectViewStylesHelp": "Si se activa, las diferentes vistas usar\u00e1n metada para mostrar categor\u00edas como Sugerencias, \u00daltimos, G\u00e9neros, y m\u00e1s. Si est\u00e1 desactivado, se mostrar\u00e1n como carpetas comunes.", @@ -1439,5 +1441,14 @@ "ButtonUnlockGuide": "Desbloquear Gu\u00eda", "LabelEnableFullScreen": "Habilitar modo de pantalla completa", "LabelEnableChromecastAc3Passthrough": "Habilitar transferencia directa de AC3 en Chromecast", - "LabelSyncPath": "Ruta para contenido sincronizado:" + "LabelSyncPath": "Ruta para contenido sincronizado:", + "LabelEmail": "Email:", + "LabelUsername": "Nombre Usuario:", + "HeaderSignUp": "Registrarse", + "LabelPasswordConfirm": "Contrase\u00f1a (confirmar):", + "ButtonAddServer": "Agregar Servidor", + "TabHomeScreen": "Pantalla de Inicio", + "HeaderDisplay": "Pantalla", + "HeaderNavigation": "Navegaci\u00f3n", + "LegendTheseSettingsShared": "Estas configuraciones son compartidas en todos los dispositivos" }
\ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/Server/es.json b/MediaBrowser.Server.Implementations/Localization/Server/es.json index 3f5bf6e7b..019e84b5d 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/es.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/es.json @@ -13,6 +13,7 @@ "LabelShowLogWindow": "Mostrar la ventana del log", "LabelPrevious": "Anterior", "LabelFinish": "Terminar", + "FolderTypeMixed": "Mixed content", "LabelNext": "Siguiente", "LabelYoureDone": "Ha Terminado!", "WelcomeToProject": "Bienvenidos a Emby!", @@ -90,7 +91,6 @@ "LabelEnableEnhancedMovies": "Habilite presentaciones de peliculas mejoradas", "LabelEnableEnhancedMoviesHelp": "Cuando est\u00e9 habilitado, las peliculas seran mostradas como folderes para incluir trailers, extras, elenco y equipo, y otros contenidos relacionados.", "HeaderSyncJobInfo": "Trabajo de Sync", - "FolderTypeMixed": "Contenido mezclado", "FolderTypeMovies": "Peliculas", "FolderTypeMusic": "Musica", "FolderTypeAdultVideos": "Videos para adultos", @@ -287,7 +287,9 @@ "OptionFileMetadataYearMismatch": "Archivo\/Metadata a\u00f1os no coinciden", "TabGeneral": "General", "TitleSupport": "Soporte", + "LabelSeasonNumber": "Season number", "TabLog": "Log", + "LabelEpisodeNumber": "Episode number", "TabAbout": "Acerca de", "TabSupporterKey": "Clave de Seguidor", "TabBecomeSupporter": "Hazte Seguidor", @@ -313,6 +315,9 @@ "OptionAllowRemoteControlOthers": "Habilitar el control remote de otros usuarios", "OptionAllowRemoteSharedDevices": "Habilitar el control remote de otros equipos compartidos", "OptionAllowRemoteSharedDevicesHelp": "Los equipos DLNA son considerados compartidos hasta que un usuario empiece a controlarlo.", + "OptionAllowLinkSharing": "Allow social media sharing", + "OptionAllowLinkSharingHelp": "Only web pages containing media information are shared. Media files are never shared publicly. Shares are time-limited and will expire based on your server sharing settings.", + "HeaderSharing": "Sharing", "HeaderRemoteControl": "Control Remoto", "OptionMissingTmdbId": "Falta Tmdb Id", "OptionIsHD": "HD", @@ -581,8 +586,6 @@ "LabelSkipped": "Omitido", "HeaderEpisodeOrganization": "Organizaci\u00f3n de episodios", "LabelSeries": "Series:", - "LabelSeasonNumber": "Temporada n\u00famero:", - "LabelEpisodeNumber": "N\u00famero de cap\u00edtulo:", "LabelEndingEpisodeNumber": "N\u00famero episodio final:", "LabelEndingEpisodeNumberHelp": "S\u00f3lo requerido para archivos multi-episodio", "HeaderSupportTheTeam": "Apoye al equipo de Emby", @@ -870,6 +873,7 @@ "HeaderTypeText": "Entrar texto", "LabelTypeText": "Texto", "HeaderSearchForSubtitles": "B\u00fasqueda de Subt\u00edtulos", + "ButtonMore": "More", "MessageNoSubtitleSearchResultsFound": "No se han encontrado resultados en la b\u00fasqueda.", "TabDisplay": "Pantalla", "TabLanguages": "Idiomas", @@ -900,7 +904,7 @@ "HeaderLiveTv": "TV en vivo", "HeaderReports": "Informes", "HeaderMetadataManager": "Metadata Manager", - "HeaderPreferences": "Preferencias", + "HeaderSettings": "Settings", "MessageLoadingChannels": "Cargando contenidos del canal...", "MessageLoadingContent": "Loading content...", "ButtonMarkRead": "Marcar como le\u00eddo", @@ -1098,7 +1102,6 @@ "OptionReportArtists": "Artists", "OptionReportAlbums": "Albums", "OptionReportAdultVideos": "Adult videos", - "ButtonMore": "More", "HeaderActivity": "Activity", "ScheduledTaskStartedWithName": "{0} started", "ScheduledTaskCancelledWithName": "{0} was cancelled", @@ -1392,7 +1395,7 @@ "HeaderUpcomingMovies": "Upcoming Movies", "HeaderUpcomingSports": "Upcoming Sports", "HeaderUpcomingPrograms": "Upcoming Programs", - "ButtonMoreItems": "More...", + "ButtonMoreItems": "More", "LabelShowLibraryTileNames": "Show library tile names", "LabelShowLibraryTileNamesHelp": "Determines if labels will be displayed underneath library tiles on the home page", "OptionEnableTranscodingThrottle": "Enable throttling", @@ -1411,7 +1414,6 @@ "OptionEnableFullSpeedConversion": "Enable full speed conversion", "OptionEnableFullSpeedConversionHelp": "By default, sync conversion is performed at a low speed to minimize resource consumption.", "HeaderPlaylists": "Playlists", - "HeaderSelectDate": "Select Date", "HeaderViewStyles": "View Styles", "LabelSelectViewStyles": "Enable enhanced presentations for:", "LabelSelectViewStylesHelp": "If enabled, views will be built with metadata to offer categories such as Suggestions, Latest, Genres, and more. If disabled, they'll be displayed with simple folders.", @@ -1439,5 +1441,14 @@ "ButtonUnlockGuide": "Unlock Guide", "LabelEnableFullScreen": "Enable fullscreen mode", "LabelEnableChromecastAc3Passthrough": "Enable Chromecast AC3 Passthrough", - "LabelSyncPath": "Synced content path:" + "LabelSyncPath": "Synced content path:", + "LabelEmail": "Email:", + "LabelUsername": "Username:", + "HeaderSignUp": "Sign Up", + "LabelPasswordConfirm": "Password (confirm):", + "ButtonAddServer": "Add Server", + "TabHomeScreen": "Home Screen", + "HeaderDisplay": "Display", + "HeaderNavigation": "Navigation", + "LegendTheseSettingsShared": "These settings are shared on all devices" }
\ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/Server/fi.json b/MediaBrowser.Server.Implementations/Localization/Server/fi.json index 3c0c4e7b8..f4d1a31d3 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/fi.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/fi.json @@ -13,6 +13,7 @@ "LabelShowLogWindow": "N\u00e4yt\u00e4 Loki Ikkuna", "LabelPrevious": "Edellinen", "LabelFinish": "Valmis", + "FolderTypeMixed": "Mixed content", "LabelNext": "Seuraava", "LabelYoureDone": "Olet valmis!", "WelcomeToProject": "Welcome to Emby!", @@ -90,7 +91,6 @@ "LabelEnableEnhancedMovies": "Enable enhanced movie displays", "LabelEnableEnhancedMoviesHelp": "When enabled, movies will be displayed as folders to include trailers, extras, cast & crew, and other related content.", "HeaderSyncJobInfo": "Sync Job", - "FolderTypeMixed": "Mixed content", "FolderTypeMovies": "Movies", "FolderTypeMusic": "Music", "FolderTypeAdultVideos": "Adult videos", @@ -287,7 +287,9 @@ "OptionFileMetadataYearMismatch": "File\/Metadata Years Mismatched", "TabGeneral": "General", "TitleSupport": "Support", + "LabelSeasonNumber": "Season number", "TabLog": "Log", + "LabelEpisodeNumber": "Episode number", "TabAbout": "About", "TabSupporterKey": "Supporter Key", "TabBecomeSupporter": "Become a Supporter", @@ -313,6 +315,9 @@ "OptionAllowRemoteControlOthers": "Allow remote control of other users", "OptionAllowRemoteSharedDevices": "Allow remote control of shared devices", "OptionAllowRemoteSharedDevicesHelp": "Dlna devices are considered shared until a user begins controlling it.", + "OptionAllowLinkSharing": "Allow social media sharing", + "OptionAllowLinkSharingHelp": "Only web pages containing media information are shared. Media files are never shared publicly. Shares are time-limited and will expire based on your server sharing settings.", + "HeaderSharing": "Sharing", "HeaderRemoteControl": "Remote Control", "OptionMissingTmdbId": "Missing Tmdb Id", "OptionIsHD": "HD", @@ -581,8 +586,6 @@ "LabelSkipped": "Skipped", "HeaderEpisodeOrganization": "Episode Organization", "LabelSeries": "Series:", - "LabelSeasonNumber": "Season number:", - "LabelEpisodeNumber": "Episode number:", "LabelEndingEpisodeNumber": "Ending episode number:", "LabelEndingEpisodeNumberHelp": "Only required for multi-episode files", "HeaderSupportTheTeam": "Support the Emby Team", @@ -870,6 +873,7 @@ "HeaderTypeText": "Enter Text", "LabelTypeText": "Text", "HeaderSearchForSubtitles": "Search for Subtitles", + "ButtonMore": "More", "MessageNoSubtitleSearchResultsFound": "No search results founds.", "TabDisplay": "Display", "TabLanguages": "Languages", @@ -900,7 +904,7 @@ "HeaderLiveTv": "Live TV", "HeaderReports": "Reports", "HeaderMetadataManager": "Metadata Manager", - "HeaderPreferences": "Preferences", + "HeaderSettings": "Settings", "MessageLoadingChannels": "Loading channel content...", "MessageLoadingContent": "Loading content...", "ButtonMarkRead": "Mark Read", @@ -1098,7 +1102,6 @@ "OptionReportArtists": "Artists", "OptionReportAlbums": "Albums", "OptionReportAdultVideos": "Adult videos", - "ButtonMore": "More", "HeaderActivity": "Activity", "ScheduledTaskStartedWithName": "{0} started", "ScheduledTaskCancelledWithName": "{0} was cancelled", @@ -1392,7 +1395,7 @@ "HeaderUpcomingMovies": "Upcoming Movies", "HeaderUpcomingSports": "Upcoming Sports", "HeaderUpcomingPrograms": "Upcoming Programs", - "ButtonMoreItems": "More...", + "ButtonMoreItems": "More", "LabelShowLibraryTileNames": "Show library tile names", "LabelShowLibraryTileNamesHelp": "Determines if labels will be displayed underneath library tiles on the home page", "OptionEnableTranscodingThrottle": "Enable throttling", @@ -1411,7 +1414,6 @@ "OptionEnableFullSpeedConversion": "Enable full speed conversion", "OptionEnableFullSpeedConversionHelp": "By default, sync conversion is performed at a low speed to minimize resource consumption.", "HeaderPlaylists": "Playlists", - "HeaderSelectDate": "Select Date", "HeaderViewStyles": "View Styles", "LabelSelectViewStyles": "Enable enhanced presentations for:", "LabelSelectViewStylesHelp": "If enabled, views will be built with metadata to offer categories such as Suggestions, Latest, Genres, and more. If disabled, they'll be displayed with simple folders.", @@ -1439,5 +1441,14 @@ "ButtonUnlockGuide": "Unlock Guide", "LabelEnableFullScreen": "Enable fullscreen mode", "LabelEnableChromecastAc3Passthrough": "Enable Chromecast AC3 Passthrough", - "LabelSyncPath": "Synced content path:" + "LabelSyncPath": "Synced content path:", + "LabelEmail": "Email:", + "LabelUsername": "Username:", + "HeaderSignUp": "Sign Up", + "LabelPasswordConfirm": "Password (confirm):", + "ButtonAddServer": "Add Server", + "TabHomeScreen": "Home Screen", + "HeaderDisplay": "Display", + "HeaderNavigation": "Navigation", + "LegendTheseSettingsShared": "These settings are shared on all devices" }
\ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/Server/fr.json b/MediaBrowser.Server.Implementations/Localization/Server/fr.json index 202d88b29..54fda4a37 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/fr.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/fr.json @@ -13,6 +13,7 @@ "LabelShowLogWindow": "Afficher la fen\u00eatre du journal d'\u00e9v\u00e8nements", "LabelPrevious": "Pr\u00e9c\u00e9dent", "LabelFinish": "Terminer", + "FolderTypeMixed": "Mixed content", "LabelNext": "Suivant", "LabelYoureDone": "Vous avez Termin\u00e9!", "WelcomeToProject": "Bienvenue dans Emby !", @@ -90,7 +91,6 @@ "LabelEnableEnhancedMovies": "Activer le mode d'affichage \u00e9tendu des films", "LabelEnableEnhancedMoviesHelp": "Lorsque ce mode est activ\u00e9, les films seront affich\u00e9s comme des dossiers et incluront les bandes-annonces, les extras, l'\u00e9quipe de tournage et les autre contenus li\u00e9s.", "HeaderSyncJobInfo": "T\u00e2che de synchronisation", - "FolderTypeMixed": "Contenus m\u00e9lang\u00e9s", "FolderTypeMovies": "Films", "FolderTypeMusic": "Musique", "FolderTypeAdultVideos": "Vid\u00e9os Adultes", @@ -287,7 +287,9 @@ "OptionFileMetadataYearMismatch": "Conflit entre nom du fichier et les m\u00e9tadonn\u00e9es sur l'ann\u00e9e", "TabGeneral": "G\u00e9n\u00e9ral", "TitleSupport": "Assistance", + "LabelSeasonNumber": "Season number", "TabLog": "Journal d'\u00e9v\u00e9nements", + "LabelEpisodeNumber": "Episode number", "TabAbout": "\u00c0 propos", "TabSupporterKey": "Cl\u00e9 de membre supporteur", "TabBecomeSupporter": "Devenir un suporteur", @@ -313,6 +315,9 @@ "OptionAllowRemoteControlOthers": "Autoriser le contr\u00f4le \u00e0 distance des autres utilisateurs", "OptionAllowRemoteSharedDevices": "Autoriser le contr\u00f4le \u00e0 distance des appareils partag\u00e9s", "OptionAllowRemoteSharedDevicesHelp": "Les p\u00e9riph\u00e9riques Dlna sont consid\u00e9r\u00e9s comme partag\u00e9s tant qu'un utilisateur ne commence pas \u00e0 le contr\u00f4ler.", + "OptionAllowLinkSharing": "Autoriser le partage sur les r\u00e9seaux sociaux", + "OptionAllowLinkSharingHelp": "Seul les pages web contenant des informations sur les m\u00e9dias sont partag\u00e9s. Les fichiers de m\u00e9dias ne sont jamais publi\u00e9s publiquement. Les partages ont un temps limit\u00e9s et expirent en fonctions de vos param\u00e8tres de paratage du serveur.", + "HeaderSharing": "Partage", "HeaderRemoteControl": "Contr\u00f4le \u00e0 distance", "OptionMissingTmdbId": "ID TMDb manquant", "OptionIsHD": "HD", @@ -581,8 +586,6 @@ "LabelSkipped": "Saut\u00e9", "HeaderEpisodeOrganization": "Organisation des \u00e9pisodes", "LabelSeries": "S\u00e9ries :", - "LabelSeasonNumber": "Num\u00e9ro de la saison:", - "LabelEpisodeNumber": "Num\u00e9ro de l'\u00e9pisode:", "LabelEndingEpisodeNumber": "Num\u00e9ro d'\u00e9pisode final:", "LabelEndingEpisodeNumberHelp": "Uniquement requis pour les fichiers multi-\u00e9pisodes", "HeaderSupportTheTeam": "Aidez l'\u00e9quipe Emby", @@ -870,6 +873,7 @@ "HeaderTypeText": "Entrer texte", "LabelTypeText": "Texte", "HeaderSearchForSubtitles": "Rechercher des sous-titres", + "ButtonMore": "More", "MessageNoSubtitleSearchResultsFound": "Aucun r\u00e9sultat trouv\u00e9.", "TabDisplay": "Affichage", "TabLanguages": "Langues", @@ -900,7 +904,7 @@ "HeaderLiveTv": "TV en direct", "HeaderReports": "Rapports", "HeaderMetadataManager": "Gestionnaire de m\u00e9tadonn\u00e9es", - "HeaderPreferences": "Pr\u00e9f\u00e9rences", + "HeaderSettings": "Param\u00e8tres", "MessageLoadingChannels": "Chargement du contenu de la cha\u00eene...", "MessageLoadingContent": "Chargement du contenu...", "ButtonMarkRead": "Marquer comme lu", @@ -1098,7 +1102,6 @@ "OptionReportArtists": "Artistes", "OptionReportAlbums": "Albums", "OptionReportAdultVideos": "Vid\u00e9os adultes", - "ButtonMore": "Voir la suite", "HeaderActivity": "Activit\u00e9", "ScheduledTaskStartedWithName": "{0} a commenc\u00e9", "ScheduledTaskCancelledWithName": "{0} a \u00e9t\u00e9 annul\u00e9", @@ -1392,7 +1395,7 @@ "HeaderUpcomingMovies": "Films \u00e0 venir", "HeaderUpcomingSports": "Ev\u00e9nements sportifs \u00e0 venir", "HeaderUpcomingPrograms": "Programmes \u00e0 venir", - "ButtonMoreItems": "Plus...", + "ButtonMoreItems": "Plus", "LabelShowLibraryTileNames": "Voir les noms des affiches de la biblioth\u00e8que", "LabelShowLibraryTileNamesHelp": "D\u00e9termine si les noms doivent \u00eatre affich\u00e9s en dessous des affiches de la biblioth\u00e8que sur la page d'accueil", "OptionEnableTranscodingThrottle": "Activer le throttling", @@ -1411,7 +1414,6 @@ "OptionEnableFullSpeedConversion": "Autoriser le transcodage rapide", "OptionEnableFullSpeedConversionHelp": "Par d\u00e9faut, le transcodage est r\u00e9alis\u00e9 de mani\u00e8re lente pour minimiser la consommation de ressources.", "HeaderPlaylists": "Listes de lecture", - "HeaderSelectDate": "S\u00e9lectionnez la date", "HeaderViewStyles": "Styles d'affichage", "LabelSelectViewStyles": "Activer les pr\u00e9sentations am\u00e9lior\u00e9es pour :", "LabelSelectViewStylesHelp": "Si vous activez cette option, l'affichage utilisera les m\u00e9tadonn\u00e9es pour ajouter des cat\u00e9gories telles que Suggestions, Derni\u00e8res, Genres, ... Si vous d\u00e9sactivez cette option, l'affichage sera simplement bas\u00e9 sur les dossiers.", @@ -1439,5 +1441,14 @@ "ButtonUnlockGuide": "D\u00e9verrouiller le Guide", "LabelEnableFullScreen": "Activer le mode plein \u00e9cran", "LabelEnableChromecastAc3Passthrough": "Activer le mode Chromecast AC3 Passthrough", - "LabelSyncPath": "Chemin du contenu synchronis\u00e9:" + "LabelSyncPath": "Chemin du contenu synchronis\u00e9:", + "LabelEmail": "Email :", + "LabelUsername": "Nom d'utilisateur :", + "HeaderSignUp": "S'inscrire", + "LabelPasswordConfirm": "Mot de passe (confirmation) :", + "ButtonAddServer": "Ajouter un serveur", + "TabHomeScreen": "Ecran d'accueil", + "HeaderDisplay": "Afficher", + "HeaderNavigation": "Navigation", + "LegendTheseSettingsShared": "Ces param\u00e8tres sont partag\u00e9s sur tous les p\u00e9riph\u00e9riques." }
\ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/Server/gsw.json b/MediaBrowser.Server.Implementations/Localization/Server/gsw.json index 8b6a188c7..f97cb7771 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/gsw.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/gsw.json @@ -13,6 +13,7 @@ "LabelShowLogWindow": "Zeig Log-Feischter", "LabelPrevious": "Vorher", "LabelFinish": "Beende", + "FolderTypeMixed": "Mixed content", "LabelNext": "N\u00f6chst", "LabelYoureDone": "Du besch fertig!", "WelcomeToProject": "Willkomme bi Emby!", @@ -85,12 +86,11 @@ "ButtonDonateWithPayPal": "Spende mit PayPal", "OptionDetectArchiveFilesAsMedia": "Erkenn Archiv als Mediedateie", "OptionDetectArchiveFilesAsMediaHelp": "Falls aktiviert, werded *.rar und *.zip Date als Medie erkennt.", - "LabelEnterConnectUserName": "Username oder E-Mail:", - "LabelEnterConnectUserNameHelp": "Das esch diin Emby Online Account Username oder Passwort.", + "LabelEnterConnectUserName": "Username or email:", + "LabelEnterConnectUserNameHelp": "This is your Emby online account username or password.", "LabelEnableEnhancedMovies": "Aktivier erwiiterti Filmasichte", "LabelEnableEnhancedMoviesHelp": "Falls aktiviert, werded Film als ganzi Ordner inkl Trailer, Extras wie Casting & Crew und anderi wichtigi Date azeigt.", "HeaderSyncJobInfo": "Sync Job", - "FolderTypeMixed": "Verschiedeni Sache", "FolderTypeMovies": "Film", "FolderTypeMusic": "Musig", "FolderTypeAdultVideos": "Erwachseni Film", @@ -287,7 +287,9 @@ "OptionFileMetadataYearMismatch": "File\/Metadata Years Mismatched", "TabGeneral": "General", "TitleSupport": "Support", + "LabelSeasonNumber": "Season number", "TabLog": "Log", + "LabelEpisodeNumber": "Episode number", "TabAbout": "About", "TabSupporterKey": "Supporter Key", "TabBecomeSupporter": "Become a Supporter", @@ -313,6 +315,9 @@ "OptionAllowRemoteControlOthers": "Allow remote control of other users", "OptionAllowRemoteSharedDevices": "Allow remote control of shared devices", "OptionAllowRemoteSharedDevicesHelp": "Dlna devices are considered shared until a user begins controlling it.", + "OptionAllowLinkSharing": "Allow social media sharing", + "OptionAllowLinkSharingHelp": "Only web pages containing media information are shared. Media files are never shared publicly. Shares are time-limited and will expire based on your server sharing settings.", + "HeaderSharing": "Sharing", "HeaderRemoteControl": "Remote Control", "OptionMissingTmdbId": "Missing Tmdb Id", "OptionIsHD": "HD", @@ -581,8 +586,6 @@ "LabelSkipped": "Skipped", "HeaderEpisodeOrganization": "Episode Organization", "LabelSeries": "Series:", - "LabelSeasonNumber": "Season number:", - "LabelEpisodeNumber": "Episode number:", "LabelEndingEpisodeNumber": "Ending episode number:", "LabelEndingEpisodeNumberHelp": "Only required for multi-episode files", "HeaderSupportTheTeam": "Support the Emby Team", @@ -870,6 +873,7 @@ "HeaderTypeText": "Enter Text", "LabelTypeText": "Text", "HeaderSearchForSubtitles": "Search for Subtitles", + "ButtonMore": "More", "MessageNoSubtitleSearchResultsFound": "No search results founds.", "TabDisplay": "Display", "TabLanguages": "Languages", @@ -900,7 +904,7 @@ "HeaderLiveTv": "Live TV", "HeaderReports": "Reports", "HeaderMetadataManager": "Metadata Manager", - "HeaderPreferences": "Preferences", + "HeaderSettings": "Settings", "MessageLoadingChannels": "Loading channel content...", "MessageLoadingContent": "Loading content...", "ButtonMarkRead": "Mark Read", @@ -1098,7 +1102,6 @@ "OptionReportArtists": "Artists", "OptionReportAlbums": "Albums", "OptionReportAdultVideos": "Adult videos", - "ButtonMore": "More", "HeaderActivity": "Activity", "ScheduledTaskStartedWithName": "{0} started", "ScheduledTaskCancelledWithName": "{0} was cancelled", @@ -1392,7 +1395,7 @@ "HeaderUpcomingMovies": "Upcoming Movies", "HeaderUpcomingSports": "Upcoming Sports", "HeaderUpcomingPrograms": "Upcoming Programs", - "ButtonMoreItems": "More...", + "ButtonMoreItems": "More", "LabelShowLibraryTileNames": "Show library tile names", "LabelShowLibraryTileNamesHelp": "Determines if labels will be displayed underneath library tiles on the home page", "OptionEnableTranscodingThrottle": "Enable throttling", @@ -1411,7 +1414,6 @@ "OptionEnableFullSpeedConversion": "Enable full speed conversion", "OptionEnableFullSpeedConversionHelp": "By default, sync conversion is performed at a low speed to minimize resource consumption.", "HeaderPlaylists": "Playlists", - "HeaderSelectDate": "Select Date", "HeaderViewStyles": "View Styles", "LabelSelectViewStyles": "Enable enhanced presentations for:", "LabelSelectViewStylesHelp": "If enabled, views will be built with metadata to offer categories such as Suggestions, Latest, Genres, and more. If disabled, they'll be displayed with simple folders.", @@ -1439,5 +1441,14 @@ "ButtonUnlockGuide": "Unlock Guide", "LabelEnableFullScreen": "Enable fullscreen mode", "LabelEnableChromecastAc3Passthrough": "Enable Chromecast AC3 Passthrough", - "LabelSyncPath": "Synced content path:" + "LabelSyncPath": "Synced content path:", + "LabelEmail": "Email:", + "LabelUsername": "Username:", + "HeaderSignUp": "Sign Up", + "LabelPasswordConfirm": "Password (confirm):", + "ButtonAddServer": "Add Server", + "TabHomeScreen": "Home Screen", + "HeaderDisplay": "Display", + "HeaderNavigation": "Navigation", + "LegendTheseSettingsShared": "These settings are shared on all devices" }
\ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/Server/he.json b/MediaBrowser.Server.Implementations/Localization/Server/he.json index 86e612b02..9d1107c08 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/he.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/he.json @@ -13,6 +13,7 @@ "LabelShowLogWindow": "\u05d4\u05e8\u05d0\u05d4 \u05d7\u05dc\u05d5\u05df \u05dc\u05d5\u05d2", "LabelPrevious": "\u05d4\u05e7\u05d5\u05d3\u05dd", "LabelFinish": "\u05e1\u05d9\u05d9\u05dd", + "FolderTypeMixed": "Mixed content", "LabelNext": "\u05d4\u05d1\u05d0", "LabelYoureDone": "\u05e1\u05d9\u05d9\u05de\u05ea!", "WelcomeToProject": "Welcome to Emby!", @@ -90,7 +91,6 @@ "LabelEnableEnhancedMovies": "Enable enhanced movie displays", "LabelEnableEnhancedMoviesHelp": "When enabled, movies will be displayed as folders to include trailers, extras, cast & crew, and other related content.", "HeaderSyncJobInfo": "Sync Job", - "FolderTypeMixed": "Mixed content", "FolderTypeMovies": "Movies", "FolderTypeMusic": "Music", "FolderTypeAdultVideos": "Adult videos", @@ -287,7 +287,9 @@ "OptionFileMetadataYearMismatch": "\u05d4\u05e9\u05e0\u05d4 \u05dc\u05d0 \u05de\u05ea\u05d0\u05d9\u05de\u05d4 \u05d1\u05d9\u05df \u05d4\u05de\u05d9\u05d3\u05e2 \u05dc\u05e7\u05d5\u05d1\u05e5", "TabGeneral": "\u05db\u05dc\u05dc\u05d9", "TitleSupport": "\u05ea\u05de\u05d9\u05db\u05d4", + "LabelSeasonNumber": "Season number", "TabLog": "\u05dc\u05d5\u05d2", + "LabelEpisodeNumber": "Episode number", "TabAbout": "\u05d0\u05d5\u05d3\u05d5\u05ea", "TabSupporterKey": "\u05de\u05e4\u05ea\u05d7 \u05ea\u05d5\u05de\u05da", "TabBecomeSupporter": "\u05d4\u05e4\u05d5\u05da \u05dc\u05ea\u05d5\u05de\u05da", @@ -313,6 +315,9 @@ "OptionAllowRemoteControlOthers": "Allow remote control of other users", "OptionAllowRemoteSharedDevices": "Allow remote control of shared devices", "OptionAllowRemoteSharedDevicesHelp": "Dlna devices are considered shared until a user begins controlling it.", + "OptionAllowLinkSharing": "Allow social media sharing", + "OptionAllowLinkSharingHelp": "Only web pages containing media information are shared. Media files are never shared publicly. Shares are time-limited and will expire based on your server sharing settings.", + "HeaderSharing": "Sharing", "HeaderRemoteControl": "Remote Control", "OptionMissingTmdbId": "\u05d7\u05d6\u05e8 \u05de\u05d6\u05d4\u05d4 Tmdb", "OptionIsHD": "HD", @@ -581,8 +586,6 @@ "LabelSkipped": "\u05d3\u05d5\u05dc\u05d2", "HeaderEpisodeOrganization": "\u05d0\u05d9\u05e8\u05d2\u05d5\u05df \u05e4\u05e8\u05e7\u05d9\u05dd", "LabelSeries": "Series:", - "LabelSeasonNumber": "\u05de\u05e1\u05e4\u05e8 \u05e2\u05d5\u05e0\u05d4:", - "LabelEpisodeNumber": "\u05de\u05e1\u05e4\u05e8 \u05e4\u05e8\u05e7:", "LabelEndingEpisodeNumber": "\u05de\u05e1\u05e4\u05e8 \u05e1\u05d9\u05d5\u05dd \u05e4\u05e8\u05e7:", "LabelEndingEpisodeNumberHelp": "\u05d4\u05db\u05e8\u05d7\u05d9 \u05e8\u05e7 \u05e2\u05d1\u05d5\u05e8 \u05e7\u05d1\u05e6\u05d9\u05dd \u05e9\u05dc \u05e4\u05e8\u05e7\u05d9\u05dd \u05de\u05d7\u05d5\u05d1\u05e8\u05d9\u05dd", "HeaderSupportTheTeam": "Support the Emby Team", @@ -870,6 +873,7 @@ "HeaderTypeText": "Enter Text", "LabelTypeText": "Text", "HeaderSearchForSubtitles": "Search for Subtitles", + "ButtonMore": "More", "MessageNoSubtitleSearchResultsFound": "No search results founds.", "TabDisplay": "Display", "TabLanguages": "Languages", @@ -900,7 +904,7 @@ "HeaderLiveTv": "Live TV", "HeaderReports": "Reports", "HeaderMetadataManager": "Metadata Manager", - "HeaderPreferences": "Preferences", + "HeaderSettings": "Settings", "MessageLoadingChannels": "Loading channel content...", "MessageLoadingContent": "Loading content...", "ButtonMarkRead": "Mark Read", @@ -1098,7 +1102,6 @@ "OptionReportArtists": "Artists", "OptionReportAlbums": "Albums", "OptionReportAdultVideos": "Adult videos", - "ButtonMore": "More", "HeaderActivity": "Activity", "ScheduledTaskStartedWithName": "{0} started", "ScheduledTaskCancelledWithName": "{0} was cancelled", @@ -1392,7 +1395,7 @@ "HeaderUpcomingMovies": "Upcoming Movies", "HeaderUpcomingSports": "Upcoming Sports", "HeaderUpcomingPrograms": "Upcoming Programs", - "ButtonMoreItems": "More...", + "ButtonMoreItems": "More", "LabelShowLibraryTileNames": "Show library tile names", "LabelShowLibraryTileNamesHelp": "Determines if labels will be displayed underneath library tiles on the home page", "OptionEnableTranscodingThrottle": "Enable throttling", @@ -1411,7 +1414,6 @@ "OptionEnableFullSpeedConversion": "Enable full speed conversion", "OptionEnableFullSpeedConversionHelp": "By default, sync conversion is performed at a low speed to minimize resource consumption.", "HeaderPlaylists": "Playlists", - "HeaderSelectDate": "Select Date", "HeaderViewStyles": "View Styles", "LabelSelectViewStyles": "Enable enhanced presentations for:", "LabelSelectViewStylesHelp": "If enabled, views will be built with metadata to offer categories such as Suggestions, Latest, Genres, and more. If disabled, they'll be displayed with simple folders.", @@ -1439,5 +1441,14 @@ "ButtonUnlockGuide": "Unlock Guide", "LabelEnableFullScreen": "Enable fullscreen mode", "LabelEnableChromecastAc3Passthrough": "Enable Chromecast AC3 Passthrough", - "LabelSyncPath": "Synced content path:" + "LabelSyncPath": "Synced content path:", + "LabelEmail": "Email:", + "LabelUsername": "Username:", + "HeaderSignUp": "Sign Up", + "LabelPasswordConfirm": "Password (confirm):", + "ButtonAddServer": "Add Server", + "TabHomeScreen": "Home Screen", + "HeaderDisplay": "Display", + "HeaderNavigation": "Navigation", + "LegendTheseSettingsShared": "These settings are shared on all devices" }
\ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/Server/hr.json b/MediaBrowser.Server.Implementations/Localization/Server/hr.json index e08c82216..3fb9d6977 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/hr.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/hr.json @@ -13,6 +13,7 @@ "LabelShowLogWindow": "Prika\u017ei Log Zapis", "LabelPrevious": "Prethodni", "LabelFinish": "Kraj", + "FolderTypeMixed": "Mixed content", "LabelNext": "Sljede\u0107i", "LabelYoureDone": "Zavr\u0161eno!", "WelcomeToProject": "Welcome to Emby!", @@ -90,7 +91,6 @@ "LabelEnableEnhancedMovies": "Enable enhanced movie displays", "LabelEnableEnhancedMoviesHelp": "When enabled, movies will be displayed as folders to include trailers, extras, cast & crew, and other related content.", "HeaderSyncJobInfo": "Sync Job", - "FolderTypeMixed": "Mixed content", "FolderTypeMovies": "Movies", "FolderTypeMusic": "Music", "FolderTypeAdultVideos": "Adult videos", @@ -287,7 +287,9 @@ "OptionFileMetadataYearMismatch": "Nepravilna godina, Datoteke\/Metadata", "TabGeneral": "Op\u0107e", "TitleSupport": "Podr\u0161ka", + "LabelSeasonNumber": "Season number", "TabLog": "Log", + "LabelEpisodeNumber": "Episode number", "TabAbout": "O ovome...", "TabSupporterKey": "Klju\u010d pobornika", "TabBecomeSupporter": "Postani pobornik", @@ -313,6 +315,9 @@ "OptionAllowRemoteControlOthers": "Allow remote control of other users", "OptionAllowRemoteSharedDevices": "Allow remote control of shared devices", "OptionAllowRemoteSharedDevicesHelp": "Dlna devices are considered shared until a user begins controlling it.", + "OptionAllowLinkSharing": "Allow social media sharing", + "OptionAllowLinkSharingHelp": "Only web pages containing media information are shared. Media files are never shared publicly. Shares are time-limited and will expire based on your server sharing settings.", + "HeaderSharing": "Sharing", "HeaderRemoteControl": "Remote Control", "OptionMissingTmdbId": "Nedostaje Tmdb Id", "OptionIsHD": "HD", @@ -581,8 +586,6 @@ "LabelSkipped": "Presko\u010deno", "HeaderEpisodeOrganization": "Organizacija epizoda", "LabelSeries": "Series:", - "LabelSeasonNumber": "Broj sezone:", - "LabelEpisodeNumber": "Broj epizode:", "LabelEndingEpisodeNumber": "Broj kraja epizode:", "LabelEndingEpisodeNumberHelp": "Potrebno samo za datoteke sa vi\u0161e epizoda", "HeaderSupportTheTeam": "Support the Emby Team", @@ -870,6 +873,7 @@ "HeaderTypeText": "Enter Text", "LabelTypeText": "Text", "HeaderSearchForSubtitles": "Search for Subtitles", + "ButtonMore": "More", "MessageNoSubtitleSearchResultsFound": "No search results founds.", "TabDisplay": "Display", "TabLanguages": "Languages", @@ -900,7 +904,7 @@ "HeaderLiveTv": "Live TV", "HeaderReports": "Reports", "HeaderMetadataManager": "Metadata Manager", - "HeaderPreferences": "Preferences", + "HeaderSettings": "Settings", "MessageLoadingChannels": "Loading channel content...", "MessageLoadingContent": "Loading content...", "ButtonMarkRead": "Mark Read", @@ -1098,7 +1102,6 @@ "OptionReportArtists": "Artists", "OptionReportAlbums": "Albums", "OptionReportAdultVideos": "Adult videos", - "ButtonMore": "More", "HeaderActivity": "Activity", "ScheduledTaskStartedWithName": "{0} started", "ScheduledTaskCancelledWithName": "{0} was cancelled", @@ -1392,7 +1395,7 @@ "HeaderUpcomingMovies": "Upcoming Movies", "HeaderUpcomingSports": "Upcoming Sports", "HeaderUpcomingPrograms": "Upcoming Programs", - "ButtonMoreItems": "More...", + "ButtonMoreItems": "More", "LabelShowLibraryTileNames": "Show library tile names", "LabelShowLibraryTileNamesHelp": "Determines if labels will be displayed underneath library tiles on the home page", "OptionEnableTranscodingThrottle": "Enable throttling", @@ -1411,7 +1414,6 @@ "OptionEnableFullSpeedConversion": "Enable full speed conversion", "OptionEnableFullSpeedConversionHelp": "By default, sync conversion is performed at a low speed to minimize resource consumption.", "HeaderPlaylists": "Playlists", - "HeaderSelectDate": "Select Date", "HeaderViewStyles": "View Styles", "LabelSelectViewStyles": "Enable enhanced presentations for:", "LabelSelectViewStylesHelp": "If enabled, views will be built with metadata to offer categories such as Suggestions, Latest, Genres, and more. If disabled, they'll be displayed with simple folders.", @@ -1439,5 +1441,14 @@ "ButtonUnlockGuide": "Unlock Guide", "LabelEnableFullScreen": "Enable fullscreen mode", "LabelEnableChromecastAc3Passthrough": "Enable Chromecast AC3 Passthrough", - "LabelSyncPath": "Synced content path:" + "LabelSyncPath": "Synced content path:", + "LabelEmail": "Email:", + "LabelUsername": "Username:", + "HeaderSignUp": "Sign Up", + "LabelPasswordConfirm": "Password (confirm):", + "ButtonAddServer": "Add Server", + "TabHomeScreen": "Home Screen", + "HeaderDisplay": "Display", + "HeaderNavigation": "Navigation", + "LegendTheseSettingsShared": "These settings are shared on all devices" }
\ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/Server/it.json b/MediaBrowser.Server.Implementations/Localization/Server/it.json index 955c8e6c5..1396807c1 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/it.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/it.json @@ -13,6 +13,7 @@ "LabelShowLogWindow": "Mostra finestra dei log", "LabelPrevious": "Precedente", "LabelFinish": "Finito", + "FolderTypeMixed": "Mixed content", "LabelNext": "Prossimo", "LabelYoureDone": "Hai Finito!", "WelcomeToProject": "Benvenuto in Emby", @@ -85,12 +86,11 @@ "ButtonDonateWithPayPal": "Effettua una donazione con PayPal", "OptionDetectArchiveFilesAsMedia": "Considera gli archivi come file multimediali", "OptionDetectArchiveFilesAsMediaHelp": "se attivato, i file con estensione .rar e .zip saranno considerati come file multimediali.", - "LabelEnterConnectUserName": "Nome Utente o email:", - "LabelEnterConnectUserNameHelp": "Questa \u00e8 la username o la password del tuo account online Emby", + "LabelEnterConnectUserName": "Username or email:", + "LabelEnterConnectUserNameHelp": "This is your Emby online account username or password.", "LabelEnableEnhancedMovies": "Abilita le visuali film migliorate", "LabelEnableEnhancedMoviesHelp": "Quando abilitato, i film verranno mostrati come cartelle che includono i trailer, gli extra, il cast & crew, e altri contenuti correlati.", "HeaderSyncJobInfo": "Attiv. di Sinc.", - "FolderTypeMixed": "contenuto misto", "FolderTypeMovies": "Film", "FolderTypeMusic": "Musica", "FolderTypeAdultVideos": "Video per adulti", @@ -287,7 +287,9 @@ "OptionFileMetadataYearMismatch": "File\/Metadata anni errati", "TabGeneral": "Generale", "TitleSupport": "Supporto", + "LabelSeasonNumber": "Season number", "TabLog": "Eventi", + "LabelEpisodeNumber": "Episode number", "TabAbout": "Info", "TabSupporterKey": "Chiave del Supporter", "TabBecomeSupporter": "Diventa un Supporter", @@ -313,6 +315,9 @@ "OptionAllowRemoteControlOthers": "Consenti controllo remoto di altri utenti", "OptionAllowRemoteSharedDevices": "Consenti controllo remoto di dispositivi condivisi", "OptionAllowRemoteSharedDevicesHelp": "Dispositivi DLNA sono considerati condivisi fino a quando un utente non inizia a controllarli.", + "OptionAllowLinkSharing": "Allow social media sharing", + "OptionAllowLinkSharingHelp": "Only web pages containing media information are shared. Media files are never shared publicly. Shares are time-limited and will expire based on your server sharing settings.", + "HeaderSharing": "Sharing", "HeaderRemoteControl": "telecomando", "OptionMissingTmdbId": "Tmdb Id mancante", "OptionIsHD": "HD", @@ -581,8 +586,6 @@ "LabelSkipped": "Saltato", "HeaderEpisodeOrganization": "Organizzazione Episodi", "LabelSeries": "Serie:", - "LabelSeasonNumber": "Numero Stagione:", - "LabelEpisodeNumber": "Numero Episodio :", "LabelEndingEpisodeNumber": "Numero ultimo episodio:", "LabelEndingEpisodeNumberHelp": "Richiesto solo se ci sono pi\u00f9 file per espisodio", "HeaderSupportTheTeam": "Supporta il Team di Emby", @@ -870,6 +873,7 @@ "HeaderTypeText": "Inserisci il testo", "LabelTypeText": "Testo", "HeaderSearchForSubtitles": "Ricerca per sottotitoli", + "ButtonMore": "More", "MessageNoSubtitleSearchResultsFound": "Nessun elemento trovato", "TabDisplay": "Schermo", "TabLanguages": "Lingue", @@ -900,7 +904,7 @@ "HeaderLiveTv": "Diretta TV", "HeaderReports": "Rapporti", "HeaderMetadataManager": "Manager Metadati", - "HeaderPreferences": "Preferenze", + "HeaderSettings": "Configurazione", "MessageLoadingChannels": "Sto caricando il contenuto del canale", "MessageLoadingContent": "Caricamento contenuto....", "ButtonMarkRead": "Segna come letto", @@ -1098,7 +1102,6 @@ "OptionReportArtists": "Cantanti", "OptionReportAlbums": "Album", "OptionReportAdultVideos": "Video x adulti", - "ButtonMore": "Dettagli", "HeaderActivity": "Attivit\u00e0", "ScheduledTaskStartedWithName": "{0} Avviati", "ScheduledTaskCancelledWithName": "{0} cancellati", @@ -1392,7 +1395,7 @@ "HeaderUpcomingMovies": "Film in arrivo", "HeaderUpcomingSports": "Sport in arrivo", "HeaderUpcomingPrograms": "Programmi in arrivo", - "ButtonMoreItems": "Pi\u00f9...", + "ButtonMoreItems": "More", "LabelShowLibraryTileNames": "Mostra i nomi di file di libreria", "LabelShowLibraryTileNamesHelp": "Determina se le etichette vengono visualizzate sotto le locandine della libreria sulla home page", "OptionEnableTranscodingThrottle": "Abilita il throttling", @@ -1411,7 +1414,6 @@ "OptionEnableFullSpeedConversion": "Abilita conversione a velocit\u00e0 piena", "OptionEnableFullSpeedConversionHelp": "Per default, la sincronizzazione viene eseguita a bassa velocit\u00e0 per minimizzare il consumo di risorse", "HeaderPlaylists": "Playlist", - "HeaderSelectDate": "Seleziona la data", "HeaderViewStyles": "Stili Viste", "LabelSelectViewStyles": "Enable enhanced presentations for:", "LabelSelectViewStylesHelp": "Se abilitato, le viste verranno create con i metadati per offrire categorie come Suggeriti, Recenti, Generi e altro. Se disabilitato, verranno mostrate come semplici cartelle.", @@ -1439,5 +1441,14 @@ "ButtonUnlockGuide": "Unlock Guide", "LabelEnableFullScreen": "Enable fullscreen mode", "LabelEnableChromecastAc3Passthrough": "Enable Chromecast AC3 Passthrough", - "LabelSyncPath": "Synced content path:" + "LabelSyncPath": "Synced content path:", + "LabelEmail": "Email:", + "LabelUsername": "Username:", + "HeaderSignUp": "Sign Up", + "LabelPasswordConfirm": "Password (confirm):", + "ButtonAddServer": "Add Server", + "TabHomeScreen": "Home Screen", + "HeaderDisplay": "Display", + "HeaderNavigation": "Navigation", + "LegendTheseSettingsShared": "These settings are shared on all devices" }
\ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/Server/kk.json b/MediaBrowser.Server.Implementations/Localization/Server/kk.json index 5964ef2aa..415c30704 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/kk.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/kk.json @@ -13,6 +13,7 @@ "LabelShowLogWindow": "\u0416\u04b1\u0440\u043d\u0430\u043b \u0442\u0435\u0440\u0435\u0437\u0435\u0441\u0456\u043d \u043a\u04e9\u0440\u0441\u0435\u0442\u0443", "LabelPrevious": "\u0410\u043b\u0434\u044b\u04a3\u0493\u044b", "LabelFinish": "\u0410\u044f\u049b\u0442\u0430\u0443", + "FolderTypeMixed": "\u0410\u0440\u0430\u043b\u0430\u0441 \u043c\u0430\u0437\u043c\u04b1\u043d", "LabelNext": "\u041a\u0435\u043b\u0435\u0441\u0456", "LabelYoureDone": "\u0411\u04d9\u0440\u0456 \u0434\u0430\u0439\u044b\u043d!", "WelcomeToProject": "Emby \u04af\u0448\u0456\u043d \u049b\u043e\u0448 \u043a\u0435\u043b\u0434\u0456\u04a3\u0456\u0437!", @@ -85,12 +86,11 @@ "ButtonDonateWithPayPal": "PayPal \u0430\u0440\u049b\u044b\u043b\u044b \u049b\u0430\u0439\u044b\u0440\u043c\u0430\u043b\u0430\u0443", "OptionDetectArchiveFilesAsMedia": "\u041c\u04b1\u0440\u0430\u0493\u0430\u0442\u0442\u0430\u043b\u0493\u0430\u043d \u0444\u0430\u0439\u043b\u0434\u0430\u0440\u0434\u044b \u0442\u0430\u0441\u044b\u0493\u044b\u0448\u0434\u0435\u0440\u0435\u043a\u0442\u0435\u0440 \u0440\u0435\u0442\u0456\u043d\u0434\u0435 \u0442\u0430\u0431\u0443", "OptionDetectArchiveFilesAsMediaHelp": "\u049a\u043e\u0441\u044b\u043b\u0493\u0430\u043d\u0434\u0430, .rar \u0436\u04d9\u043d\u0435 .zip \u043a\u0435\u04a3\u0435\u0439\u0442\u0456\u043c\u0434\u0435\u0440\u0456 \u0431\u0430\u0440 \u0444\u0430\u0439\u043b\u0434\u0430\u0440 \u0442\u0430\u0441\u044b\u0493\u044b\u0448 \u0444\u0430\u0439\u043b\u0434\u0430\u0440\u044b \u0440\u0435\u0442\u0456\u043d\u0434\u0435 \u0442\u0430\u0431\u044b\u043b\u0430\u0434\u044b.", - "LabelEnterConnectUserName": "Username or email:", - "LabelEnterConnectUserNameHelp": "This is your Emby online account username or password.", + "LabelEnterConnectUserName": "\u041f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0448\u044b \u0430\u0442\u044b \u043d\u0435\u043c\u0435\u0441\u0435 \u042d-\u043f\u043e\u0448\u0442\u0430:", + "LabelEnterConnectUserNameHelp": "\u0411\u04b1\u043b \u0441\u0456\u0437\u0434\u0456\u04a3 Emby \u0436\u0435\u043b\u0456\u043b\u0456\u043a \u0442\u0456\u0440\u043a\u0435\u043b\u0433\u0456\u04a3\u0456\u0437\u0434\u0456\u04a3 \u043f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0448\u044b \u0430\u0442\u044b \u043d\u0435 \u049b\u04b1\u043f\u0438\u044f \u0441\u04e9\u0437 \u0431\u043e\u043b\u044b\u043f \u0442\u0430\u0431\u044b\u043b\u0430\u0434\u044b.", "LabelEnableEnhancedMovies": "\u0424\u0438\u043b\u044c\u043c\u0434\u0435\u0440\u0434\u0456\u04a3 \u0436\u0430\u049b\u0441\u0430\u0440\u0442\u044b\u043b\u0493\u0430\u043d \u0431\u0435\u0439\u043d\u0435\u043b\u0456\u043c\u0434\u0435\u0440\u0456\u043d \u049b\u043e\u0441\u0443", "LabelEnableEnhancedMoviesHelp": "\u049a\u043e\u0441\u044b\u043b\u0493\u0430\u043d\u0434\u0430, \u0442\u0440\u0435\u0439\u043b\u0435\u0440\u043b\u0435\u0440\u0434\u0456, \u049b\u043e\u0441\u044b\u043c\u0448\u0430\u043b\u0430\u0440\u0434\u044b, \u0442\u04af\u0441\u0456\u0440\u0443\u0433\u0435 \u049b\u0430\u0442\u044b\u0441\u049b\u0430\u043d\u0434\u0430\u0440\u0434\u044b \u0436\u04d9\u043d\u0435 \u0431\u0430\u0441\u049b\u0430 \u049b\u0430\u0442\u044b\u0441\u0442\u044b \u043c\u0430\u0437\u043c\u04b1\u043d\u0434\u044b \u049b\u0430\u043c\u0442\u0443 \u04af\u0448\u0456\u043d, \u0444\u0438\u043b\u044c\u043c\u0434\u0435\u0440 \u049b\u0430\u043b\u0442\u0430 \u0440\u0435\u0442\u0456\u043d\u0434\u0435 \u0431\u0435\u0439\u043d\u0435\u043b\u0435\u043d\u0435\u0434\u0456", "HeaderSyncJobInfo": "\u04ae\u043d\u0434\u0435\u0441\u0442\u0456\u0440\u0443 \u0436\u04b1\u043c\u044b\u0441\u044b", - "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", @@ -287,7 +287,9 @@ "OptionFileMetadataYearMismatch": "\u0424\u0430\u0439\u043b\/\u043c\u0435\u0442\u0430\u0434\u0435\u0440\u0435\u043a \u0436\u044b\u043b\u044b \u0441\u04d9\u0439\u043a\u0435\u0441 \u0435\u043c\u0435\u0441", "TabGeneral": "\u0416\u0430\u043b\u043f\u044b", "TitleSupport": "\u0416\u0430\u049b\u0442\u0430\u0443", + "LabelSeasonNumber": "\u041c\u0430\u0443\u0441\u044b\u043c \u043d\u04e9\u043c\u0456\u0440\u0456", "TabLog": "\u0416\u04b1\u0440\u043d\u0430\u043b", + "LabelEpisodeNumber": "\u042d\u043f\u0438\u0437\u043e\u0434 \u043d\u04e9\u043c\u0456\u0440\u0456", "TabAbout": "\u0422\u0443\u0440\u0430\u043b\u044b", "TabSupporterKey": "\u0416\u0430\u049b\u0442\u0430\u0443\u0448\u044b \u043a\u0456\u043b\u0442\u0456", "TabBecomeSupporter": "\u0416\u0430\u049b\u0442\u0430\u0443\u0448\u044b \u0431\u043e\u043b\u0443", @@ -313,6 +315,9 @@ "OptionAllowRemoteControlOthers": "\u0411\u0430\u0441\u049b\u0430 \u043f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0448\u044b\u043b\u0430\u0440\u0434\u044b \u049b\u0430\u0448\u044b\u049b\u0442\u0430\u043d \u0431\u0430\u0441\u049b\u0430\u0440\u0443 \u04af\u0448\u0456\u043d \u0440\u04b1\u049b\u0441\u0430\u0442 \u0435\u0442\u0443", "OptionAllowRemoteSharedDevices": "\u041e\u0440\u0442\u0430\u049b \u049b\u04b1\u0440\u044b\u043b\u0493\u044b\u043b\u0430\u0440\u0434\u044b \u049b\u0430\u0448\u044b\u049b\u0442\u0430\u043d \u0431\u0430\u0441\u049b\u0430\u0440\u0443 \u04af\u0448\u0456\u043d \u0440\u04b1\u049b\u0441\u0430\u0442 \u0435\u0442\u0443", "OptionAllowRemoteSharedDevicesHelp": "DLNA-\u049b\u04b1\u0440\u044b\u043b\u0493\u044b\u043b\u0430\u0440\u044b \u043f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0448\u044b \u0431\u0430\u0441\u049b\u0430\u0440\u0493\u0430\u043d\u0448\u0430 \u0434\u0435\u0439\u0456\u043d \u043e\u0440\u0442\u0430\u049b \u0440\u0435\u0442\u0456\u043d\u0434\u0435 \u0435\u0441\u0435\u043f\u0442\u0435\u043b\u0456\u043d\u0435\u0434\u0456.", + "OptionAllowLinkSharing": "\u04d8\u043b\u0435\u0443\u043c\u0435\u0442\u0442\u0456\u043a \u0436\u0435\u043b\u0456\u043b\u0435\u0440\u0456\u043c\u0435\u043d \u043e\u0440\u0442\u0430\u049b \u043f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0493\u0430 \u0440\u04b1\u049b\u0441\u0430\u0442 \u0435\u0442\u0443", + "OptionAllowLinkSharingHelp": "\u0422\u0435\u043a \u049b\u0430\u043d\u0430 \u0442\u0430\u0441\u044b\u0493\u044b\u0448 \u0442\u0443\u0440\u0430\u043b\u044b \u0430\u049b\u043f\u0430\u0440\u0430\u0442\u0442\u044b \u049b\u0430\u043c\u0442\u0438\u0442\u044b\u043d \u0432\u0435\u0431-\u0431\u0435\u0442\u0442\u0435\u0440\u0456 \u043e\u0440\u0442\u0430\u049b \u043f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u044b\u043b\u0430\u0434\u044b. \u0422\u0430\u0441\u044b\u0493\u044b\u0448 \u0444\u0430\u0439\u043b\u0434\u0430\u0440\u044b \u0435\u0448\u049b\u0430\u0448\u0430\u043d \u043e\u0440\u0442\u0430\u049b \u0436\u0430\u0440\u0438\u044f\u043b\u0430\u043d\u0431\u0430\u0439\u0434\u044b. \u041e\u0440\u0442\u0430\u049b\u0442\u0430\u0441\u0443 \u0443\u0430\u049b\u044b\u0442\u043f\u0435\u043d \u0448\u0435\u043a\u0442\u0435\u043b\u0435\u0434\u0456 \u0436\u04d9\u043d\u0435 \u043c\u0435\u0440\u0437\u0456\u043c\u0456 \u0441\u0435\u0440\u0432\u0435\u0440\u0456\u04a3\u0456\u0437\u0434\u0456\u04a3 \u043e\u0440\u0442\u0430\u049b\u0442\u0430\u0441\u0443 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043b\u0435\u0440\u0456\u043d\u0456\u04a3 \u043d\u0435\u0433\u0456\u0437\u0456\u043d\u0434\u0435 \u0430\u044f\u049b\u0442\u0430\u043b\u0430\u0434\u044b.", + "HeaderSharing": "\u041e\u0440\u0442\u0430\u049b \u043f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443", "HeaderRemoteControl": "\u049a\u0430\u0448\u044b\u049b\u0442\u0430\u043d \u0431\u0430\u0441\u049b\u0430\u0440\u0443", "OptionMissingTmdbId": "TMDb Id \u0436\u043e\u049b", "OptionIsHD": "HD", @@ -581,8 +586,6 @@ "LabelSkipped": "\u04e8\u0442\u043a\u0456\u0437\u0456\u043b\u0433\u0435\u043d", "HeaderEpisodeOrganization": "\u0411\u04e9\u043b\u0456\u043c\u0434\u0456 \u04b1\u0439\u044b\u043c\u0434\u0430\u0441\u0442\u044b\u0440\u0443", "LabelSeries": "\u0422\u0435\u043b\u0435\u0445\u0438\u043a\u0430\u044f:", - "LabelSeasonNumber": "\u041c\u0430\u0443\u0441\u044b\u043c \u043d\u04e9\u043c\u0456\u0440\u0456:", - "LabelEpisodeNumber": "\u0411\u04e9\u043b\u0456\u043c \u043d\u04e9\u043c\u0456\u0440\u0456:", "LabelEndingEpisodeNumber": "\u0410\u044f\u049b\u0442\u0430\u0443\u0448\u044b \u0431\u04e9\u043b\u0456\u043c\u0434\u0456\u04a3 \u043d\u04e9\u043c\u0456\u0440\u0456:", "LabelEndingEpisodeNumberHelp": "\u0411\u04b1\u043b \u0442\u0435\u043a \u049b\u0430\u043d\u0430 \u0431\u0456\u0440\u043d\u0435\u0448\u0435 \u0431\u04e9\u043b\u0456\u043c\u0456 \u0431\u0430\u0440 \u0444\u0430\u0439\u043b\u0434\u0430\u0440 \u04af\u0448\u0456\u043d", "HeaderSupportTheTeam": "Emby \u0442\u043e\u0431\u044b\u043d \u049b\u043e\u043b\u0434\u0430\u04a3\u044b\u0437", @@ -870,6 +873,7 @@ "HeaderTypeText": "\u041c\u04d9\u0442\u0456\u043d\u0434\u0456 \u0435\u043d\u0433\u0456\u0437\u0443", "LabelTypeText": "\u041c\u04d9\u0442\u0456\u043d", "HeaderSearchForSubtitles": "\u0421\u0443\u0431\u0442\u0438\u0442\u0440\u043b\u0435\u0440\u0434\u0456 \u0456\u0437\u0434\u0435\u0443", + "ButtonMore": "\u041a\u04e9\u0431\u0456\u0440\u0435\u043a", "MessageNoSubtitleSearchResultsFound": "\u0406\u0437\u0434\u0435\u0433\u0435\u043d\u0434\u0435 \u0435\u0448\u049b\u0430\u043d\u0434\u0430\u0439 \u043d\u04d9\u0442\u0438\u0436\u0435\u043b\u0435\u0440 \u0442\u0430\u0431\u044b\u043b\u043c\u0430\u0434\u044b.", "TabDisplay": "\u0411\u0435\u0439\u043d\u0435\u043b\u0435\u0443", "TabLanguages": "\u0422\u0456\u043b\u0434\u0435\u0440", @@ -900,7 +904,7 @@ "HeaderLiveTv": "\u042d\u0444\u0438\u0440\u043b\u0456\u043a \u0422\u0414", "HeaderReports": "\u0411\u0430\u044f\u043d\u0430\u0442\u0442\u0430\u0440", "HeaderMetadataManager": "\u041c\u0435\u0442\u0430\u0434\u0435\u0440\u0435\u043a \u0440\u0435\u0442\u0442\u0435\u0443\u0448\u0456", - "HeaderPreferences": "\u0422\u0435\u04a3\u0448\u0435\u043b\u0456\u043c\u0434\u0435\u0440", + "HeaderSettings": "\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043b\u0435\u0440", "MessageLoadingChannels": "\u0410\u0440\u043d\u0430\u043d\u044b\u04a3 \u043c\u0430\u0437\u043c\u04b1\u043d\u044b\u043d \u0436\u04af\u043a\u0442\u0435\u0443\u0434\u0435...", "MessageLoadingContent": "\u041c\u0430\u0437\u043c\u04b1\u043d \u0436\u04af\u043a\u0442\u0435\u043b\u0443\u0434\u0435...", "ButtonMarkRead": "\u041e\u049b\u044b\u043b\u0493\u0430\u043d \u0434\u0435\u043f \u0431\u0435\u043b\u0433\u0456\u043b\u0435\u0443", @@ -1098,7 +1102,6 @@ "OptionReportArtists": "\u041e\u0440\u044b\u043d\u0434\u0430\u0443\u0448\u044b\u043b\u0430\u0440", "OptionReportAlbums": "\u0410\u043b\u044c\u0431\u043e\u043c\u0434\u0430\u0440", "OptionReportAdultVideos": "\u0415\u0440\u0435\u0441\u0435\u043a \u0431\u0435\u0439\u043d\u0435\u043b\u0435\u0440\u0456", - "ButtonMore": "\u041a\u04e9\u0431\u0456\u0440\u0435\u043a", "HeaderActivity": "\u04d8\u0440\u0435\u043a\u0435\u0442\u0442\u0435\u0440", "ScheduledTaskStartedWithName": "{0} \u0456\u0441\u043a\u0435 \u049b\u043e\u0441\u044b\u043b\u0434\u044b", "ScheduledTaskCancelledWithName": "{0} \u0431\u043e\u043b\u0434\u044b\u0440\u044b\u043b\u043c\u0430\u0434\u044b", @@ -1392,7 +1395,7 @@ "HeaderUpcomingMovies": "\u041a\u04af\u0442\u0456\u043b\u0433\u0435\u043d \u0444\u0438\u043b\u044c\u043c\u0434\u0435\u0440", "HeaderUpcomingSports": "\u041a\u04af\u0442\u0456\u043b\u0433\u0435\u043d \u0441\u043f\u043e\u0440\u0442", "HeaderUpcomingPrograms": "\u041a\u04af\u0442\u0456\u043b\u0433\u0435\u043d \u0431\u0435\u0440\u043b\u0456\u043c\u0434\u0435\u0440", - "ButtonMoreItems": "\u041a\u04e9\u0431\u0456\u0440\u0435\u043a...", + "ButtonMoreItems": "\u041a\u04e9\u0431\u0456\u0440\u0435\u043a", "LabelShowLibraryTileNames": "\u0422\u0430\u0441\u044b\u0493\u044b\u0448\u0445\u0430\u043d\u0430 \u0442\u0430\u049b\u0442\u0430\u0439\u0448\u0430\u043b\u0430\u0440\u044b\u043d\u044b\u04a3 \u0430\u0442\u0430\u0443\u043b\u0430\u0440\u044b\u043d \u043a\u04e9\u0440\u0441\u0435\u0442\u0443", "LabelShowLibraryTileNamesHelp": "\u0411\u0430\u0441\u0442\u044b \u0431\u0435\u0442\u0442\u0435 \u0442\u0430\u0441\u044b\u0493\u044b\u0448\u0445\u0430\u043d\u0430 \u0442\u0430\u049b\u0442\u0430\u0439\u0448\u0430\u043b\u0430\u0440\u044b \u0430\u0441\u0442\u044b\u043d\u0434\u0430 \u0436\u0430\u0437\u0443\u043b\u0430\u0440 \u043a\u04e9\u0440\u0441\u0435\u0442\u0456\u043b\u0435 \u043c\u0435 \u0435\u043a\u0435\u043d\u0456 \u0430\u043d\u044b\u049b\u0442\u0430\u043b\u0430\u0434\u044b.", "OptionEnableTranscodingThrottle": "\u0420\u0435\u0442\u0442\u0435\u0443\u0434\u0456 \u049b\u043e\u0441\u0443", @@ -1411,7 +1414,6 @@ "OptionEnableFullSpeedConversion": "\u0422\u04af\u0440\u043b\u0435\u043d\u0434\u0456\u0440\u0443\u0434\u0456\u04a3 \u0442\u043e\u043b\u044b\u049b \u0436\u044b\u043b\u0434\u0430\u043c\u043b\u044b\u0493\u044b\u043d \u049b\u043e\u0441\u0443", "OptionEnableFullSpeedConversionHelp": "\u0420\u0435\u0441\u0443\u0440\u0441\u0442\u0430\u0440 \u0442\u04b1\u0442\u044b\u043d\u0443\u0434\u044b \u0431\u0430\u0440\u044b\u043d\u0448\u0430 \u0430\u0437\u0430\u0439\u0442\u0443 \u04af\u0448\u0456\u043d \u04af\u043d\u0434\u0435\u0441\u0442\u0456\u0440\u0443\u043b\u0456\u043a \u0442\u04af\u0440\u043b\u0435\u043d\u0434\u0456\u0440\u0443 \u04d9\u0434\u0435\u043f\u043a\u0456\u0434\u0435 \u0442\u04e9\u043c\u0435\u043d \u0436\u044b\u043b\u0434\u0430\u043c\u0434\u044b\u049b\u043f\u0435\u043d \u043e\u0440\u044b\u043d\u0434\u0430\u043b\u0430\u0434\u044b.", "HeaderPlaylists": "\u041e\u0439\u043d\u0430\u0442\u0443 \u0442\u0456\u0437\u0456\u043c\u0434\u0435\u0440", - "HeaderSelectDate": "\u041a\u04af\u043d\u0434\u0456 \u0442\u0430\u04a3\u0434\u0430\u0443", "HeaderViewStyles": "\u0410\u0441\u043f\u0435\u043a\u0442 \u043c\u04d9\u043d\u0435\u0440\u043b\u0435\u0440\u0456", "LabelSelectViewStyles": "\u041c\u044b\u043d\u0430\u0443 \u04af\u0448\u0456\u043d \u0436\u0430\u049b\u0441\u0430\u0440\u0442\u044b\u043b\u0493\u0430\u043d \u0431\u0435\u0439\u043d\u0435\u043b\u0456\u043c\u0434\u0435\u0440\u0456\u043d \u049b\u043e\u0441\u0443:", "LabelSelectViewStylesHelp": "\u049a\u043e\u0441\u044b\u043b\u0493\u0430\u043d\u0434\u0430, \u043c\u04b1\u043d\u0434\u0430\u0439 \u04b0\u0441\u044b\u043d\u044b\u0441\u0442\u0430\u0440, \u0415\u04a3 \u043a\u0435\u0439\u0456\u043d\u0433\u0456, \u0416\u0430\u043d\u0440\u043b\u0430\u0440\u0434\u044b \u0436\u04d9\u043d\u0435 \u0431\u0430\u0441\u049b\u0430 \u0434\u0430 \u0441\u0430\u043d\u0430\u0442\u0442\u0430\u0440\u044b\u043d \u04b1\u0441\u044b\u043d\u0443 \u04af\u0448\u0456\u043d \u0430\u0441\u043f\u0435\u043a\u0442\u0442\u0435\u0440 \u043c\u0435\u0442\u0430\u0434\u0435\u0440\u0435\u043a\u0442\u0435\u0440 \u0430\u0440\u049b\u044b\u043b\u044b \u049b\u04b1\u0440\u044b\u043b\u0430\u0434\u044b. \u0410\u0436\u044b\u0440\u0430\u0442\u044b\u043b\u0441\u0430, \u043e\u043b\u0430\u0440 \u049b\u0430\u0440\u0430\u043f\u0430\u0439\u044b\u043c \u049b\u0430\u043b\u0442\u0430\u043b\u0430\u0440 \u0430\u0440\u049b\u044b\u043b\u044b \u043a\u04e9\u0440\u0441\u0435\u0442\u0456\u043b\u0435\u0434\u0456.", @@ -1431,13 +1433,22 @@ "HeaderConnectToServer": "\u0421\u0435\u0440\u0432\u0435\u0440\u0433\u0435 \u049b\u043e\u0441\u044b\u043b\u0443", "OptionReportList": "\u0422\u0456\u0437\u0456\u043c\u0434\u0435\u0440", "OptionReportStatistics": "\u0421\u0430\u043d\u0430\u049b\u0442\u0430\u0440", - "OptionReportGrouping": "\u0422\u043e\u043f\u0442\u0430\u0443", + "OptionReportGrouping": "\u0422\u043e\u043f\u0442\u0430\u0441\u0442\u044b\u0440\u0443", "HeaderExport": "\u042d\u043a\u0441\u043f\u043e\u0440\u0442\u0442\u0430\u0443", "HeaderColumns": "\u0411\u0430\u0493\u0430\u043d\u0434\u0430\u0440", "ButtonReset": "\u042b\u0441\u044b\u0440\u0443", "OptionEnableExternalVideoPlayers": "\u0421\u044b\u0440\u0442\u049b\u044b \u043e\u0439\u043d\u0430\u0442\u049b\u044b\u0448\u0442\u0430\u0440\u0434\u044b \u049b\u043e\u0441\u0443", "ButtonUnlockGuide": "\u0410\u043d\u044b\u049b\u0442\u0430\u0493\u044b\u0448\u0442\u044b \u049b\u04b1\u0440\u0441\u0430\u0443\u0434\u0430\u043d \u0431\u043e\u0441\u0430\u0442\u0443", - "LabelEnableFullScreen": "Enable fullscreen mode", - "LabelEnableChromecastAc3Passthrough": "Enable Chromecast AC3 Passthrough", - "LabelSyncPath": "Synced content path:" + "LabelEnableFullScreen": "\u0422\u043e\u043b\u044b\u049b \u044d\u043a\u0440\u0430\u043d \u0440\u0435\u0436\u0456\u043c\u0456\u043d \u049b\u043e\u0441\u0443", + "LabelEnableChromecastAc3Passthrough": "Chromecast \u04e9\u0442\u043a\u0456\u043d\u0448\u0456 AC3 \u049b\u043e\u0441\u0443", + "LabelSyncPath": "\u04ae\u043d\u0434\u0435\u0441\u0442\u0456\u0440\u0456\u043b\u0433\u0435\u043d \u043c\u0430\u0437\u043c\u04b1\u043d\u0434\u044b\u04a3 \u0436\u043e\u043b\u044b:", + "LabelEmail": "\u042d-\u043f\u043e\u0448\u0442\u0430:", + "LabelUsername": "\u041f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0448\u044b \u0430\u0442\u044b:", + "HeaderSignUp": "\u0422\u0456\u0440\u043a\u0435\u043b\u0443", + "LabelPasswordConfirm": "\u049a\u04b1\u043f\u0438\u044f \u0441\u04e9\u0437 (\u0440\u0430\u0441\u0442\u0430\u0443)", + "ButtonAddServer": "\u0421\u0435\u0440\u0432\u0435\u0440\u0434\u0456 \u04af\u0441\u0442\u0435\u0443", + "TabHomeScreen": "\u0411\u0430\u0441\u0442\u044b \u044d\u043a\u0440\u0430\u043d", + "HeaderDisplay": "\u0411\u0435\u0439\u043d\u0435\u043b\u0435\u0443", + "HeaderNavigation": "\u0428\u0430\u0440\u043b\u0430\u0443", + "LegendTheseSettingsShared": "\u041e\u0441\u044b \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043b\u0435\u0440 \u0431\u0430\u0440\u043b\u044b\u049b \u049b\u04b1\u0440\u044b\u043b\u0493\u044b\u043b\u0430\u0440\u0434\u0430 \u043e\u0440\u0442\u0430\u049b \u043f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u044b\u043b\u0430\u0434\u044b." }
\ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/Server/ko.json b/MediaBrowser.Server.Implementations/Localization/Server/ko.json index 9bdcdc00a..b335850a4 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/ko.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/ko.json @@ -13,6 +13,7 @@ "LabelShowLogWindow": "Show Log Window", "LabelPrevious": "Previous", "LabelFinish": "Finish", + "FolderTypeMixed": "Mixed content", "LabelNext": "Next", "LabelYoureDone": "You're Done!", "WelcomeToProject": "Welcome to Emby!", @@ -90,7 +91,6 @@ "LabelEnableEnhancedMovies": "Enable enhanced movie displays", "LabelEnableEnhancedMoviesHelp": "When enabled, movies will be displayed as folders to include trailers, extras, cast & crew, and other related content.", "HeaderSyncJobInfo": "Sync Job", - "FolderTypeMixed": "Mixed content", "FolderTypeMovies": "Movies", "FolderTypeMusic": "Music", "FolderTypeAdultVideos": "Adult videos", @@ -287,7 +287,9 @@ "OptionFileMetadataYearMismatch": "File\/Metadata Years Mismatched", "TabGeneral": "General", "TitleSupport": "Support", + "LabelSeasonNumber": "Season number", "TabLog": "Log", + "LabelEpisodeNumber": "Episode number", "TabAbout": "About", "TabSupporterKey": "Supporter Key", "TabBecomeSupporter": "Become a Supporter", @@ -313,6 +315,9 @@ "OptionAllowRemoteControlOthers": "Allow remote control of other users", "OptionAllowRemoteSharedDevices": "Allow remote control of shared devices", "OptionAllowRemoteSharedDevicesHelp": "Dlna devices are considered shared until a user begins controlling it.", + "OptionAllowLinkSharing": "Allow social media sharing", + "OptionAllowLinkSharingHelp": "Only web pages containing media information are shared. Media files are never shared publicly. Shares are time-limited and will expire based on your server sharing settings.", + "HeaderSharing": "Sharing", "HeaderRemoteControl": "Remote Control", "OptionMissingTmdbId": "Missing Tmdb Id", "OptionIsHD": "HD", @@ -581,8 +586,6 @@ "LabelSkipped": "Skipped", "HeaderEpisodeOrganization": "Episode Organization", "LabelSeries": "Series:", - "LabelSeasonNumber": "Season number:", - "LabelEpisodeNumber": "Episode number:", "LabelEndingEpisodeNumber": "Ending episode number:", "LabelEndingEpisodeNumberHelp": "Only required for multi-episode files", "HeaderSupportTheTeam": "Support the Emby Team", @@ -870,6 +873,7 @@ "HeaderTypeText": "Enter Text", "LabelTypeText": "Text", "HeaderSearchForSubtitles": "Search for Subtitles", + "ButtonMore": "More", "MessageNoSubtitleSearchResultsFound": "No search results founds.", "TabDisplay": "Display", "TabLanguages": "Languages", @@ -900,7 +904,7 @@ "HeaderLiveTv": "Live TV", "HeaderReports": "Reports", "HeaderMetadataManager": "Metadata Manager", - "HeaderPreferences": "Preferences", + "HeaderSettings": "Settings", "MessageLoadingChannels": "Loading channel content...", "MessageLoadingContent": "Loading content...", "ButtonMarkRead": "Mark Read", @@ -1098,7 +1102,6 @@ "OptionReportArtists": "Artists", "OptionReportAlbums": "Albums", "OptionReportAdultVideos": "Adult videos", - "ButtonMore": "More", "HeaderActivity": "Activity", "ScheduledTaskStartedWithName": "{0} started", "ScheduledTaskCancelledWithName": "{0} was cancelled", @@ -1392,7 +1395,7 @@ "HeaderUpcomingMovies": "Upcoming Movies", "HeaderUpcomingSports": "Upcoming Sports", "HeaderUpcomingPrograms": "Upcoming Programs", - "ButtonMoreItems": "More...", + "ButtonMoreItems": "More", "LabelShowLibraryTileNames": "Show library tile names", "LabelShowLibraryTileNamesHelp": "Determines if labels will be displayed underneath library tiles on the home page", "OptionEnableTranscodingThrottle": "Enable throttling", @@ -1411,7 +1414,6 @@ "OptionEnableFullSpeedConversion": "Enable full speed conversion", "OptionEnableFullSpeedConversionHelp": "By default, sync conversion is performed at a low speed to minimize resource consumption.", "HeaderPlaylists": "Playlists", - "HeaderSelectDate": "Select Date", "HeaderViewStyles": "View Styles", "LabelSelectViewStyles": "Enable enhanced presentations for:", "LabelSelectViewStylesHelp": "If enabled, views will be built with metadata to offer categories such as Suggestions, Latest, Genres, and more. If disabled, they'll be displayed with simple folders.", @@ -1439,5 +1441,14 @@ "ButtonUnlockGuide": "Unlock Guide", "LabelEnableFullScreen": "Enable fullscreen mode", "LabelEnableChromecastAc3Passthrough": "Enable Chromecast AC3 Passthrough", - "LabelSyncPath": "Synced content path:" + "LabelSyncPath": "Synced content path:", + "LabelEmail": "Email:", + "LabelUsername": "Username:", + "HeaderSignUp": "Sign Up", + "LabelPasswordConfirm": "Password (confirm):", + "ButtonAddServer": "Add Server", + "TabHomeScreen": "Home Screen", + "HeaderDisplay": "Display", + "HeaderNavigation": "Navigation", + "LegendTheseSettingsShared": "These settings are shared on all devices" }
\ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/Server/ms.json b/MediaBrowser.Server.Implementations/Localization/Server/ms.json index 562edb32f..0d9ef6063 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/ms.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/ms.json @@ -13,6 +13,7 @@ "LabelShowLogWindow": "Show Log Window", "LabelPrevious": "Sebelumnya", "LabelFinish": "Habis", + "FolderTypeMixed": "Mixed content", "LabelNext": "Seterusnya", "LabelYoureDone": "Kamu Selesai!", "WelcomeToProject": "Welcome to Emby!", @@ -90,7 +91,6 @@ "LabelEnableEnhancedMovies": "Enable enhanced movie displays", "LabelEnableEnhancedMoviesHelp": "When enabled, movies will be displayed as folders to include trailers, extras, cast & crew, and other related content.", "HeaderSyncJobInfo": "Sync Job", - "FolderTypeMixed": "Mixed content", "FolderTypeMovies": "Movies", "FolderTypeMusic": "Music", "FolderTypeAdultVideos": "Adult videos", @@ -287,7 +287,9 @@ "OptionFileMetadataYearMismatch": "File\/Metadata Years Mismatched", "TabGeneral": "General", "TitleSupport": "Support", + "LabelSeasonNumber": "Season number", "TabLog": "Log", + "LabelEpisodeNumber": "Episode number", "TabAbout": "About", "TabSupporterKey": "Supporter Key", "TabBecomeSupporter": "Become a Supporter", @@ -313,6 +315,9 @@ "OptionAllowRemoteControlOthers": "Allow remote control of other users", "OptionAllowRemoteSharedDevices": "Allow remote control of shared devices", "OptionAllowRemoteSharedDevicesHelp": "Dlna devices are considered shared until a user begins controlling it.", + "OptionAllowLinkSharing": "Allow social media sharing", + "OptionAllowLinkSharingHelp": "Only web pages containing media information are shared. Media files are never shared publicly. Shares are time-limited and will expire based on your server sharing settings.", + "HeaderSharing": "Sharing", "HeaderRemoteControl": "Remote Control", "OptionMissingTmdbId": "Missing Tmdb Id", "OptionIsHD": "HD", @@ -581,8 +586,6 @@ "LabelSkipped": "Skipped", "HeaderEpisodeOrganization": "Episode Organization", "LabelSeries": "Series:", - "LabelSeasonNumber": "Season number:", - "LabelEpisodeNumber": "Episode number:", "LabelEndingEpisodeNumber": "Ending episode number:", "LabelEndingEpisodeNumberHelp": "Only required for multi-episode files", "HeaderSupportTheTeam": "Support the Emby Team", @@ -870,6 +873,7 @@ "HeaderTypeText": "Enter Text", "LabelTypeText": "Text", "HeaderSearchForSubtitles": "Search for Subtitles", + "ButtonMore": "More", "MessageNoSubtitleSearchResultsFound": "No search results founds.", "TabDisplay": "Display", "TabLanguages": "Languages", @@ -900,7 +904,7 @@ "HeaderLiveTv": "Live TV", "HeaderReports": "Reports", "HeaderMetadataManager": "Metadata Manager", - "HeaderPreferences": "Preferences", + "HeaderSettings": "Settings", "MessageLoadingChannels": "Loading channel content...", "MessageLoadingContent": "Loading content...", "ButtonMarkRead": "Mark Read", @@ -1098,7 +1102,6 @@ "OptionReportArtists": "Artists", "OptionReportAlbums": "Albums", "OptionReportAdultVideos": "Adult videos", - "ButtonMore": "More", "HeaderActivity": "Activity", "ScheduledTaskStartedWithName": "{0} started", "ScheduledTaskCancelledWithName": "{0} was cancelled", @@ -1392,7 +1395,7 @@ "HeaderUpcomingMovies": "Upcoming Movies", "HeaderUpcomingSports": "Upcoming Sports", "HeaderUpcomingPrograms": "Upcoming Programs", - "ButtonMoreItems": "More...", + "ButtonMoreItems": "More", "LabelShowLibraryTileNames": "Show library tile names", "LabelShowLibraryTileNamesHelp": "Determines if labels will be displayed underneath library tiles on the home page", "OptionEnableTranscodingThrottle": "Enable throttling", @@ -1411,7 +1414,6 @@ "OptionEnableFullSpeedConversion": "Enable full speed conversion", "OptionEnableFullSpeedConversionHelp": "By default, sync conversion is performed at a low speed to minimize resource consumption.", "HeaderPlaylists": "Playlists", - "HeaderSelectDate": "Select Date", "HeaderViewStyles": "View Styles", "LabelSelectViewStyles": "Enable enhanced presentations for:", "LabelSelectViewStylesHelp": "If enabled, views will be built with metadata to offer categories such as Suggestions, Latest, Genres, and more. If disabled, they'll be displayed with simple folders.", @@ -1439,5 +1441,14 @@ "ButtonUnlockGuide": "Unlock Guide", "LabelEnableFullScreen": "Enable fullscreen mode", "LabelEnableChromecastAc3Passthrough": "Enable Chromecast AC3 Passthrough", - "LabelSyncPath": "Synced content path:" + "LabelSyncPath": "Synced content path:", + "LabelEmail": "Email:", + "LabelUsername": "Username:", + "HeaderSignUp": "Sign Up", + "LabelPasswordConfirm": "Password (confirm):", + "ButtonAddServer": "Add Server", + "TabHomeScreen": "Home Screen", + "HeaderDisplay": "Display", + "HeaderNavigation": "Navigation", + "LegendTheseSettingsShared": "These settings are shared on all devices" }
\ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/Server/nb.json b/MediaBrowser.Server.Implementations/Localization/Server/nb.json index 4ae8ed117..9460bf637 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/nb.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/nb.json @@ -13,6 +13,7 @@ "LabelShowLogWindow": "Se logg-vinduet", "LabelPrevious": "Forrige", "LabelFinish": "Ferdig", + "FolderTypeMixed": "Mixed content", "LabelNext": "Neste", "LabelYoureDone": "Ferdig!", "WelcomeToProject": "Velkommen til Emby", @@ -50,7 +51,7 @@ "LinkedToEmbyConnect": "Knyttet til Emby Connect.", "HeaderSupporterBenefits": "Supporter fordeler", "HeaderAddUser": "Ny bruker", - "LabelAddConnectSupporterHelp": "To add a user who isn't listed, you'll need to first link their account to Emby Connect from their user profile page.", + "LabelAddConnectSupporterHelp": "For \u00e5 legge til en bruker som ikke er oppf\u00f8rt, m\u00e5 du f\u00f8rst koble sin konto til Emby Connect fra deres brukerprofilside.", "LabelPinCode": "Pin kode:", "OptionHideWatchedContentFromLatestMedia": "Skjul sett innhold fra siste media.", "HeaderSync": "Synk.", @@ -71,9 +72,9 @@ "HeaderAvailableServices": "Tilgjengelige tjenester", "MessageNoServicesInstalled": "Ingen programtillegg er installert.", "HeaderToAccessPleaseEnterEasyPinCode": "Oppgi din enkle PIN-kode for \u00e5 f\u00e5 tilgang", - "KidsModeAdultInstruction": "Click the lock icon in the bottom right to configure or leave kids mode. Your pin code will be required.", + "KidsModeAdultInstruction": "Klikk p\u00e5 l\u00e5s-ikonet nede til h\u00f8yre for \u00e5 konfigurere eller forlate barnamodus. PIN-koden vil v\u00e6re n\u00f8dvendig.", "ButtonConfigurePinCode": "Konfigurer PIN-kode", - "HeaderAdultsReadHere": "Adults Read Here!", + "HeaderAdultsReadHere": "Voksne les her!", "RegisterWithPayPal": "Registrer med PayPal", "HeaderSyncRequiresSupporterMembership": "Synkronisering krever st\u00f8ttemedlemskap", "HeaderEnjoyDayTrial": "Hygg deg med en 14-dagers gratis pr\u00f8veperiode", @@ -85,12 +86,11 @@ "ButtonDonateWithPayPal": "Don\u00e9r med PayPal", "OptionDetectArchiveFilesAsMedia": "Behandle arkivfiler som media", "OptionDetectArchiveFilesAsMediaHelp": "Hvis aktivert blir .rar- og .zipfiler behandlet som mediafiler.", - "LabelEnterConnectUserName": "Brukernavn eller epost:", - "LabelEnterConnectUserNameHelp": "Dette er ditt Emby Online-konto brukernavn og passord.", - "LabelEnableEnhancedMovies": "Enable enhanced movie displays", - "LabelEnableEnhancedMoviesHelp": "When enabled, movies will be displayed as folders to include trailers, extras, cast & crew, and other related content.", + "LabelEnterConnectUserName": "Brukernavn eller epostadresse:", + "LabelEnterConnectUserNameHelp": "Dette er Emby Online-konto brukernavn eller passordet ditt.", + "LabelEnableEnhancedMovies": "Aktiver forbedrede filmvisning", + "LabelEnableEnhancedMoviesHelp": "N\u00e5r den er aktivert, vil filmene bli vist som mapper for \u00e5 inkludere trailere, statister, cast og crew, og annet relatert innhold.", "HeaderSyncJobInfo": "Synk.jobb", - "FolderTypeMixed": "Forskjellig innhold", "FolderTypeMovies": "Filmer", "FolderTypeMusic": "Musikk", "FolderTypeAdultVideos": "Voksen-videoer", @@ -287,16 +287,18 @@ "OptionFileMetadataYearMismatch": "Fil\/Metadata \u00e5r mismatch", "TabGeneral": "Genrelt", "TitleSupport": "Support", + "LabelSeasonNumber": "Season number", "TabLog": "Logg", + "LabelEpisodeNumber": "Episode number", "TabAbout": "Om", "TabSupporterKey": "Supporter-n\u00f8kkel", "TabBecomeSupporter": "Bli en supporter", - "ProjectHasCommunity": "Emby has a thriving community of users and contributors.", - "CheckoutKnowledgeBase": "Check out our knowledge base to help you get the most out of Emby.", + "ProjectHasCommunity": "Emby har et voksende fellesskap av brukere og bidragsytere.", + "CheckoutKnowledgeBase": "Sjekk ut v\u00e5r kunnskapsbase for \u00e5 hjelpe deg til \u00e5 f\u00e5 mest mulig ut av Emby.", "SearchKnowledgeBase": "S\u00f8k kunnskapsbasen", "VisitTheCommunity": "Bes\u00f8k oss", "VisitProjectWebsite": "Bes\u00f8k Emby Media", - "VisitProjectWebsiteLong": "Visit the Emby Web site to catch the latest news and keep up with the developer blog.", + "VisitProjectWebsiteLong": "Bes\u00f8k Emby.media for \u00e5 f\u00e5 de siste nyhetene og holde tritt med utviklerbloggen.", "OptionHideUser": "Skjul brukere fra logginn-skjermen", "OptionHideUserFromLoginHelp": "Praktisk for private eller skjulte administratorer. Brukeren vil m\u00e5tte logge inn manuelt ved \u00e5 skrive inn brukernavn og passord.", "OptionDisableUser": "Deaktiver denne brukeren", @@ -313,6 +315,9 @@ "OptionAllowRemoteControlOthers": "Tillat fjernstyring av andre brukere", "OptionAllowRemoteSharedDevices": "Tillate fjernstyring av delte enheter", "OptionAllowRemoteSharedDevicesHelp": "DLNA-enheter betraktes som delte inntil en bruker begynner \u00e5 styre dem.", + "OptionAllowLinkSharing": "Tillat deling p\u00e5 sosiale media", + "OptionAllowLinkSharingHelp": "Only web pages containing media information are shared. Media files are never shared publicly. Shares are time-limited and will expire based on your server sharing settings.", + "HeaderSharing": "Sharing", "HeaderRemoteControl": "Fjernstyring", "OptionMissingTmdbId": "Mangler Tmdb ID", "OptionIsHD": "HD", @@ -407,7 +412,7 @@ "OptionRecordOnAllChannels": "Ta opptak p\u00e5 alle kanaler", "OptionRecordAnytime": "Ta opptak n\u00e5r som helst", "OptionRecordOnlyNewEpisodes": "Ta opptak kun av nye episoder", - "HeaderRepeatingOptions": "Repeating Options", + "HeaderRepeatingOptions": "Gjenta alternativer", "HeaderDays": "Dager", "HeaderActiveRecordings": "Aktive opptak", "HeaderLatestRecordings": "Siste opptak", @@ -545,7 +550,7 @@ "LabelCustomCss": "Tilpass CSS:", "LabelCustomCssHelp": "Bruk din egen CSS p\u00e5 web-grensesnittet.", "LabelLocalHttpServerPortNumber": "Lokal HTTP port:", - "LabelLocalHttpServerPortNumberHelp": "The tcp port number that Emby's http server should bind to.", + "LabelLocalHttpServerPortNumberHelp": "TCP-portnummeret som Emby sin http server skal koble seg til.", "LabelPublicHttpPort": "Offentlig HTTP port:", "LabelPublicHttpPortHelp": "Den offentlige porten som kobles til den lokale porten.", "LabelPublicHttpsPort": "Offentlig HTTPS port:", @@ -553,12 +558,12 @@ "LabelEnableHttps": "Oppgi HTTPS som ekstern adresse", "LabelEnableHttpsHelp": "Hvis denne er aktivert vil serveren oppgi en HTTPS URL som sin eksterne adresse. Dette kan \u00f8delegge for klienter som enda ikke st\u00f8tter HTTPS", "LabelHttpsPort": "Lokal HTTPS port:", - "LabelHttpsPortHelp": "The tcp port number that Emby's https server should bind to.", + "LabelHttpsPortHelp": "TCP-portnummeret som Emby sin https server skal koble seg til.", "LabelWebSocketPortNumber": "Web socket portnummer:", "LabelEnableAutomaticPortMap": "Aktiver automatisk portmapping", "LabelEnableAutomaticPortMapHelp": "Fors\u00f8k automatisk mapping av den offentlige port til den lokale port via UPnP. Dette fungerer ikke med alle rutere.", "LabelExternalDDNS": "Ekstern WAN-adresse:", - "LabelExternalDDNSHelp": "If you have a dynamic DNS enter it here. Emby apps will use it when connecting remotely. Leave empty for automatic detection.", + "LabelExternalDDNSHelp": "Hvis du har en dynamisk DNS skriver du det her. Emby apps vil bruke den n\u00e5r du kobler til eksternt. La st\u00e5 tom for automatisk gjenkjenning.", "TabResume": "Forsette", "TabWeather": "V\u00e6r", "TitleAppSettings": "App-innstillinger", @@ -581,8 +586,6 @@ "LabelSkipped": "Hoppet over", "HeaderEpisodeOrganization": "Organisering av episoder", "LabelSeries": "Serie:", - "LabelSeasonNumber": "Sesong nummer:", - "LabelEpisodeNumber": "Episode nummer:", "LabelEndingEpisodeNumber": "Ending av episode nummer:", "LabelEndingEpisodeNumberHelp": "Kun n\u00f8dvendig for multi-episode filer", "HeaderSupportTheTeam": "St\u00f8tt Emby teamet!", @@ -870,6 +873,7 @@ "HeaderTypeText": "Skriv Tekst", "LabelTypeText": "Tekst", "HeaderSearchForSubtitles": "S\u00f8k etter undertekster", + "ButtonMore": "Mer", "MessageNoSubtitleSearchResultsFound": "Ingen s\u00f8k funnet.", "TabDisplay": "Skjerm", "TabLanguages": "Spr\u00e5k", @@ -900,7 +904,7 @@ "HeaderLiveTv": "Live TV", "HeaderReports": "Rapporter", "HeaderMetadataManager": "Metadata Behandler", - "HeaderPreferences": "Preferanser", + "HeaderSettings": "Innstillinger", "MessageLoadingChannels": "Laster kanal innhold...", "MessageLoadingContent": "Laster innhold...", "ButtonMarkRead": "Marker Som Lest", @@ -1098,7 +1102,6 @@ "OptionReportArtists": "Artisert", "OptionReportAlbums": "Albumer", "OptionReportAdultVideos": "Voksen videoer", - "ButtonMore": "Mer", "HeaderActivity": "Aktivitet", "ScheduledTaskStartedWithName": "{0} startet", "ScheduledTaskCancelledWithName": "{0} ble avbrutt", @@ -1392,7 +1395,7 @@ "HeaderUpcomingMovies": "Kommende filmer", "HeaderUpcomingSports": "Kommende sport", "HeaderUpcomingPrograms": "Kommende programmer", - "ButtonMoreItems": "Mer...", + "ButtonMoreItems": "More", "LabelShowLibraryTileNames": "Show library tile names", "LabelShowLibraryTileNamesHelp": "Determines if labels will be displayed underneath library tiles on the home page", "OptionEnableTranscodingThrottle": "Aktiver struping", @@ -1411,7 +1414,6 @@ "OptionEnableFullSpeedConversion": "Aktiver full hastighetskonvertering", "OptionEnableFullSpeedConversionHelp": "Som standard er synk-konvertering utf\u00f8res ved en lav hastighet for \u00e5 minimere ressursforbruk.", "HeaderPlaylists": "Spillelister", - "HeaderSelectDate": "Velg dato", "HeaderViewStyles": "Se stiler", "LabelSelectViewStyles": "Enable enhanced presentations for:", "LabelSelectViewStylesHelp": "If enabled, views will be built with metadata to offer categories such as Suggestions, Latest, Genres, and more. If disabled, they'll be displayed with simple folders.", @@ -1439,5 +1441,14 @@ "ButtonUnlockGuide": "Unlock Guide", "LabelEnableFullScreen": "Enable fullscreen mode", "LabelEnableChromecastAc3Passthrough": "Enable Chromecast AC3 Passthrough", - "LabelSyncPath": "Synced content path:" + "LabelSyncPath": "Synced content path:", + "LabelEmail": "Email:", + "LabelUsername": "Username:", + "HeaderSignUp": "Sign Up", + "LabelPasswordConfirm": "Password (confirm):", + "ButtonAddServer": "Add Server", + "TabHomeScreen": "Home Screen", + "HeaderDisplay": "Display", + "HeaderNavigation": "Navigation", + "LegendTheseSettingsShared": "These settings are shared on all devices" }
\ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/Server/nl.json b/MediaBrowser.Server.Implementations/Localization/Server/nl.json index 28882475e..19ac8bca3 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/nl.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/nl.json @@ -13,6 +13,7 @@ "LabelShowLogWindow": "Toon log venster", "LabelPrevious": "Vorige", "LabelFinish": "Voltooien", + "FolderTypeMixed": "Mixed content", "LabelNext": "Volgende", "LabelYoureDone": "Gereed!", "WelcomeToProject": "Welkom bij Emby!", @@ -50,7 +51,7 @@ "LinkedToEmbyConnect": "Gekoppeld aan Emby Connect", "HeaderSupporterBenefits": "Voordelen voor Supporters", "HeaderAddUser": "Gebruiker Toevoegen", - "LabelAddConnectSupporterHelp": "Om een \u200b\u200bgebruiker toe te voegen die niet in de lijst voorkomt, moet je eerst hun account koppelen aan Emby Connect uit hun gebruikersprofiel pagina.", + "LabelAddConnectSupporterHelp": "Om een \u200b\u200bgebruiker toe te voegen die niet in de lijst voorkomt, moet u eerst hun account koppelen aan Emby Connect vanuit hun gebruikersprofiel pagina.", "LabelPinCode": "Pincode:", "OptionHideWatchedContentFromLatestMedia": "Verberg bekeken inhoud van recent toegevoegd", "HeaderSync": "Sync", @@ -71,7 +72,7 @@ "HeaderAvailableServices": "Beschikbare diensten", "MessageNoServicesInstalled": "Er zijn momenteel geen diensten ge\u00efnstalleerd.", "HeaderToAccessPleaseEnterEasyPinCode": "Voor toegang toets uw pincode", - "KidsModeAdultInstruction": "Klik op het slotje in de rechterbenedenhoek om te configureren of blijf in de kindermodus. Uw pincode nodig zal zijn", + "KidsModeAdultInstruction": "Klik op het slotje in de rechterbenedenhoek om te configureren of blijf in de kindermodus. Uw pincode is vereist.", "ButtonConfigurePinCode": "Configureer pincode", "HeaderAdultsReadHere": "Volwassenen Lees hier!", "RegisterWithPayPal": "Registreer met PayPal", @@ -86,11 +87,10 @@ "OptionDetectArchiveFilesAsMedia": "Herken archief bestanden als media", "OptionDetectArchiveFilesAsMediaHelp": "Indien ingeschakeld zullen bestanden met .rar en .zip extensies herkend worden als media bestanden.", "LabelEnterConnectUserName": "Gebruikersnaam of email:", - "LabelEnterConnectUserNameHelp": "This is your Emby online account username or password.", + "LabelEnterConnectUserNameHelp": "Dit is uw Emby Online account naam of wachtwoord.", "LabelEnableEnhancedMovies": "Verbeterde film displays inschakelen", "LabelEnableEnhancedMoviesHelp": "Wanneer ingeschakeld, zullen films worden weergegeven als mappen inclusief trailers, extra's, cast & crew en andere gerelateerde inhoud.", "HeaderSyncJobInfo": "Sync Opdrachten", - "FolderTypeMixed": "Gemengde inhoud", "FolderTypeMovies": "Films", "FolderTypeMusic": "Muziek", "FolderTypeAdultVideos": "Adult video's", @@ -287,13 +287,15 @@ "OptionFileMetadataYearMismatch": "Jaartal in Bestands\/metadata komt niet overeen", "TabGeneral": "Algemeen", "TitleSupport": "Ondersteuning", + "LabelSeasonNumber": "Seizoensnummer", "TabLog": "Logboek", + "LabelEpisodeNumber": "Afleveringsnummer", "TabAbout": "Over", "TabSupporterKey": "Supporter Sleutel", "TabBecomeSupporter": "Word Supporter", - "ProjectHasCommunity": "Emby heeft een bloeiende gemeenschap van gebruikers en medewerkers", + "ProjectHasCommunity": "Emby heeft een bloeiende gemeenschap van gebruikers en medewerkers.", "CheckoutKnowledgeBase": "Bekijk onze knowledge base om u te helpen het meeste uit Emby halen.", - "SearchKnowledgeBase": "Zoeken in de Kennisbank", + "SearchKnowledgeBase": "Zoek in de Kennisbank", "VisitTheCommunity": "Bezoek de Gemeenschap", "VisitProjectWebsite": "Bezoek de Emby Website", "VisitProjectWebsiteLong": "Bezoek de Emby Web-website voor het laatste nieuws en blijf op de hoogte via het ontwikkelaars blog.", @@ -309,10 +311,13 @@ "OptionAllowMediaPlayback": "Media afspelen toestaan", "OptionAllowBrowsingLiveTv": "Live TV toegang toestaan", "OptionAllowDeleteLibraryContent": "Media verwijderen toestaan", - "OptionAllowManageLiveTv": "Sta Live TV opname beheer toe", + "OptionAllowManageLiveTv": "Live TV opname beheer toestaan", "OptionAllowRemoteControlOthers": "Op afstand besturen van andere gebruikers toestaan", "OptionAllowRemoteSharedDevices": "Op afstand besturen van gedeelde apparaten toestaan", "OptionAllowRemoteSharedDevicesHelp": "Dlna apparaten worden als gedeeld apparaat gezien totdat een gebruiker deze gaat gebruiken.", + "OptionAllowLinkSharing": "Sta social media delen toe", + "OptionAllowLinkSharingHelp": "Alleen webpagina's met media-informatie worden gedeeld. Media-bestanden worden nooit publiekelijk gedeeld. Aandelen zijn beperkt in de tijd en zal verlopen op basis van uw instellingen voor delen server.", + "HeaderSharing": "Delen", "HeaderRemoteControl": "Gebruik op afstand", "OptionMissingTmdbId": "TMDB Id ontbreekt", "OptionIsHD": "HD", @@ -320,17 +325,17 @@ "OptionMetascore": "Metascore", "ButtonSelect": "Selecteer", "ButtonGroupVersions": "Groepeer Versies", - "ButtonAddToCollection": "Voeg toe aan Collectie", + "ButtonAddToCollection": "Toevoegen aan Collectie", "PismoMessage": "Pismo File Mount (met een geschonken licentie).", "TangibleSoftwareMessage": "Gebruik makend van concrete oplossingen als Java \/ C converters door een geschonken licentie.", "HeaderCredits": "Credits", - "PleaseSupportOtherProduces": "Steun A.U.B. ook de andere gratis producten die wij gebruiken:", + "PleaseSupportOtherProduces": "Steun a.u.b. ook andere gratis producten die wij gebruiken:", "VersionNumber": "Versie {0}", "TabPaths": "Paden", "TabServer": "Server", "TabTranscoding": "Transcoderen", "TitleAdvanced": "Geavanceerd", - "LabelAutomaticUpdateLevel": "Automatische update niveau", + "LabelAutomaticUpdateLevel": "Niveau automatische update", "OptionRelease": "Offici\u00eble Release", "OptionBeta": "Beta", "OptionDev": "Dev (Instabiel)", @@ -347,8 +352,8 @@ "LabelImagesByNamePathHelp": "Geef een locatie op voor gedownloade afbeeldingen van acteurs, genre en studio.", "LabelMetadataPath": "Metadata pad:", "LabelMetadataPathHelp": "Geef een aangepaste locatie op voor gedownloade afbeeldingen en metadata, indien niet opgeslagen in mediamappen.", - "LabelTranscodingTempPath": "Tijdelijk Transcodeer pad:", - "LabelTranscodingTempPathHelp": "Deze map bevat werkbestanden die worden gebruikt door de transcoder. Geef een eigen locatie op of laat leeg om de standaardlocatie te gebruiken.", + "LabelTranscodingTempPath": "Tijdelijk transcodeer pad:", + "LabelTranscodingTempPathHelp": "Deze map bevat werkbestanden die worden gebruikt door de transcoder. Geef een eigen locatie op of laat het leeg om de standaardlocatie te gebruiken.", "TabBasics": "Basis", "TabTV": "TV", "TabGames": "Games", @@ -376,7 +381,7 @@ "OptionImageSavingStandard": "Standaard - MB2", "ButtonSignIn": "Aanmelden", "TitleSignIn": "Aanmelden", - "HeaderPleaseSignIn": "Wachtwoord in geven", + "HeaderPleaseSignIn": "Aanmelden", "LabelUser": "Gebruiker:", "LabelPassword": "Wachtwoord:", "ButtonManualLogin": "Handmatige Aanmelding", @@ -511,16 +516,16 @@ "OptionHighSpeedTranscoding": "Hogere snelheid", "OptionHighQualityTranscoding": "Hogere kwaliteit", "OptionMaxQualityTranscoding": "Max kwaliteit", - "OptionEnableDebugTranscodingLogging": "Transcodeer Foutopsporings logboek inschakelen", - "OptionEnableDebugTranscodingLoggingHelp": "Dit zal zeer grote logboekbestanden maken en wordt alleen aanbevolen wanneer het nodig is voor het oplossen van problemen.", + "OptionEnableDebugTranscodingLogging": "Transcodeer foutopsporings logboek inschakelen", + "OptionEnableDebugTranscodingLoggingHelp": "Dit zal zeer grote logboekbestanden genereren en wordt alleen aanbevolen wanneer het nodig is voor het oplossen van problemen.", "EditCollectionItemsHelp": "Toevoegen of verwijderen van alle films, series, albums, boeken of games die u wilt groeperen in deze collectie.", "HeaderAddTitles": "Titels toevoegen", - "LabelEnableDlnaPlayTo": "DLNA Afspelen met inschakelen", + "LabelEnableDlnaPlayTo": "DLNA Afspelen Met inschakelen", "LabelEnableDlnaPlayToHelp": "Emby kan apparaten detecteren binnen uw netwerk en biedt de mogelijkheid om ze op afstand te controleren", "LabelEnableDlnaDebugLogging": "DLNA foutopsporings logboek inschakelen", "LabelEnableDlnaDebugLoggingHelp": "Dit zal grote logboekbestanden maken en mag alleen worden gebruikt als dat nodig is voor het oplossen van problemen.", "LabelEnableDlnaClientDiscoveryInterval": "Interval voor het zoeken naar clients (seconden)", - "LabelEnableDlnaClientDiscoveryIntervalHelp": "Bepalend voor de duur in seconden tussen SSDP zoekopdrachten uitgevoerd door Emby.", + "LabelEnableDlnaClientDiscoveryIntervalHelp": "Bepaalt de duur in seconden tussen SSDP zoekopdrachten uitgevoerd door Emby.", "HeaderCustomDlnaProfiles": "Aangepaste profielen", "HeaderSystemDlnaProfiles": "Systeem Profielen", "CustomDlnaProfilesHelp": "Maak een aangepast profiel om een \u200b\u200bnieuw apparaat aan te maken of overschrijf een systeemprofiel.", @@ -556,17 +561,17 @@ "LabelHttpsPortHelp": "Het tcp poort nummer waar Emby's http server aan moet verbinden.", "LabelWebSocketPortNumber": "Web socket poortnummer:", "LabelEnableAutomaticPortMap": "Schakel automatisch poort vertalen in", - "LabelEnableAutomaticPortMapHelp": "Probeer om de publieke poort automatisch te vertalen naar de lokale poort via UPnP. Dit werk niet op alle routers.", + "LabelEnableAutomaticPortMapHelp": "Probeer om de publieke poort automatisch te vertalen naar de lokale poort via UPnP. Dit werkt niet op alle routers.", "LabelExternalDDNS": "Extern WAN Adres:", "LabelExternalDDNSHelp": "Als u een dynamische DNS heeft moet dit hier worden ingevoerd. Emby apps zullen het gebruiken als externe verbinding. Laat leeg voor automatische detectie", "TabResume": "Hervatten", "TabWeather": "Weer", "TitleAppSettings": "App Instellingen", - "LabelMinResumePercentage": "Percentage (Min):", - "LabelMaxResumePercentage": "Percentage (Max):", - "LabelMinResumeDuration": "Minimale duur (In seconden):", + "LabelMinResumePercentage": "Percentage (min.):", + "LabelMaxResumePercentage": "Percentage (max.):", + "LabelMinResumeDuration": "Minimale duur (seconden):", "LabelMinResumePercentageHelp": "Titels worden ingesteld als onafgespeeld indien gestopt voor deze tijd", - "LabelMaxResumePercentageHelp": "Titels worden ingesteld als volledig afgespeeld als gestopt na deze tijd", + "LabelMaxResumePercentageHelp": "Titels worden ingesteld als volledig afgespeeld indien gestopt na deze tijd", "LabelMinResumeDurationHelp": "Titels korter dan dit zullen niet hervatbaar zijn", "TitleAutoOrganize": "Automatisch Organiseren", "TabActivityLog": "Activiteiten Logboek", @@ -581,13 +586,11 @@ "LabelSkipped": "Overgeslagen", "HeaderEpisodeOrganization": "Afleveringen Organisatie", "LabelSeries": "Series:", - "LabelSeasonNumber": "Seizoen nummer:", - "LabelEpisodeNumber": "Aflevering nummer:", "LabelEndingEpisodeNumber": "Laatste aflevering nummer:", "LabelEndingEpisodeNumberHelp": "Alleen vereist voor bestanden met meerdere afleveringen", "HeaderSupportTheTeam": "Ondersteun het Emby Team", "LabelSupportAmount": "Bedrag (USD)", - "HeaderSupportTheTeamHelp": "Door te doneren draagt u mee aan de verdere ontwikkeling van dit project. Een deel van alle donaties zal worden bijgedragen aan de andere gratis tools waarvan we afhankelijk zijn.", + "HeaderSupportTheTeamHelp": "Door te doneren draagt u bij aan de verdere ontwikkeling van dit project. Een deel van alle donaties zal worden bijgedragen aan de andere gratis tools waarvan we afhankelijk zijn.", "ButtonEnterSupporterKey": "Voer supporter sleutel in", "DonationNextStep": "Eenmaal voltooid gaat u terug en voert u de supporter sleutel in die u per e-mail zult ontvangen.", "AutoOrganizeHelp": "Automatisch organiseren monitort de download mappen op nieuwe bestanden en verplaatst ze naar uw mediamappen.", @@ -651,9 +654,9 @@ "ErrorMessageInvalidKey": "Om premium inhoud te registreren moet u ook Emby Supporter zijn. Doneer alstublieft en ondersteun daarmee de voortdurende ontwikkeling van het kernproduct. Bedankt.", "HeaderDisplaySettings": "Weergave-instellingen", "TabPlayTo": "Afspelen met", - "LabelEnableDlnaServer": "DLNA Server inschakelen", + "LabelEnableDlnaServer": "DLNA server inschakelen", "LabelEnableDlnaServerHelp": "Sta UPnP apparaten op uw netwerk toe om door Emby inhoud te bladeren en af te spelen.", - "LabelEnableBlastAliveMessages": "Zend alive berichten", + "LabelEnableBlastAliveMessages": "Alive berichten zenden", "LabelEnableBlastAliveMessagesHelp": "Zet dit aan als de server niet betrouwbaar door andere UPnP-apparaten op uw netwerk wordt gedetecteerd.", "LabelBlastMessageInterval": "Alive bericht interval (seconden)", "LabelBlastMessageIntervalHelp": "Bepaalt de duur in seconden tussen server Alive berichten.", @@ -671,7 +674,7 @@ "HeaderRequireManualLoginHelp": "Indien uitgeschakeld toont de client een aanmeldscherm met een visuele selectie van gebruikers.", "OptionOtherApps": "Overige apps", "OptionMobileApps": "Mobiele apps", - "HeaderNotificationList": "Klik op een melding om de opties voor het versturen ervan te configureren .", + "HeaderNotificationList": "Klik op een melding om de opties voor het versturen ervan te configureren.", "NotificationOptionApplicationUpdateAvailable": "Programma-update beschikbaar", "NotificationOptionApplicationUpdateInstalled": "Programma-update ge\u00efnstalleerd", "NotificationOptionPluginUpdateInstalled": "Plug-in-update ge\u00efnstalleerd", @@ -737,7 +740,7 @@ "ButtonNext": "Volgende", "ButtonPrevious": "Vorige", "LabelGroupMoviesIntoCollections": "Groepeer films in collecties", - "LabelGroupMoviesIntoCollectionsHelp": "Bij de weergave van film lijsten, zullen films die behoren tot een collectie worden weergegeven als een gegroepeerd object.", + "LabelGroupMoviesIntoCollectionsHelp": "Bij de weergave van film lijsten, zullen films die tot een collectie behoren worden weergegeven als een gegroepeerd object.", "NotificationOptionPluginError": "Plug-in fout", "ButtonVolumeUp": "Volume omhoog", "ButtonVolumeDown": "Volume omlaag", @@ -834,7 +837,7 @@ "OptionEstimateContentLength": "Lengte schatten van de inhoud bij het transcoderen", "OptionReportByteRangeSeekingWhenTranscoding": "Rapporteer dat de server byte zoeken tijdens transcoderen ondersteunt", "OptionReportByteRangeSeekingWhenTranscodingHelp": "Dit is vereist voor bepaalde apparaten die zo goed op tijd zoeken.", - "HeaderSubtitleDownloadingHelp": "Wanneer Emby uw videobestanden scant kan het zoeken naar missende ondertitels, en download ze met behulp van een ondertitel provider zoals OpenSubtitlesorg", + "HeaderSubtitleDownloadingHelp": "Tijdens het scannen van uw videobestanden kan Emby zoeken naar missende ondertitels en deze downloaden met behulp van een ondertitel provider zoals OpenSubtitles.org.", "HeaderDownloadSubtitlesFor": "Download ondertiteling voor:", "MessageNoChapterProviders": "Installeer een hoofdstuk provider Plug-in zoals ChapterDb om extra hoofdstuk opties in te schakelen.", "LabelSkipIfGraphicalSubsPresent": "Overslaan als de video al grafische ondertitels bevat", @@ -844,13 +847,13 @@ "HeaderDownloadChaptersFor": "Download hoofdstuk namen voor:", "LabelOpenSubtitlesUsername": "Gebruikersnaam Open Subtitles:", "LabelOpenSubtitlesPassword": "Wachtwoord Open Subtitles:", - "HeaderChapterDownloadingHelp": "Wanneer Emby uw videobestanden scant kan het vriendelijke hoofdstuk namen downloaden van het internet met behulp van hoofdstuk plugins zoals ChapterDb", + "HeaderChapterDownloadingHelp": "Wanneer Emby uw videobestanden scant kan het vriendelijke hoofdstuk namen downloaden van het internet met behulp van hoofdstuk plugins zoals ChapterDb.", "LabelPlayDefaultAudioTrack": "Speel standaard audio spoor ongeacht taal", "LabelSubtitlePlaybackMode": "Ondertitelingsmode:", "LabelDownloadLanguages": "Download talen:", "ButtonRegister": "Aanmelden", "LabelSkipIfAudioTrackPresent": "Overslaan als het standaard audio spoor overeenkomt met de taal van de download", - "LabelSkipIfAudioTrackPresentHelp": "Uitvinken om ervoor te zorgen dat alle video's ondertitels krijgen, ongeacht de gesproken taal.", + "LabelSkipIfAudioTrackPresentHelp": "Vink dit uit om ervoor te zorgen dat alle video's ondertitels krijgen, ongeacht de audiotaal.", "HeaderSendMessage": "Stuur bericht", "ButtonSend": "Stuur", "LabelMessageText": "Bericht tekst:", @@ -870,6 +873,7 @@ "HeaderTypeText": "Voer tekst in", "LabelTypeText": "Tekst", "HeaderSearchForSubtitles": "Zoeken naar Ondertitels", + "ButtonMore": "Meer", "MessageNoSubtitleSearchResultsFound": "Geen zoekresultaten gevonden.", "TabDisplay": "Weergave", "TabLanguages": "Talen", @@ -900,7 +904,7 @@ "HeaderLiveTv": "Live TV", "HeaderReports": "Rapporten", "HeaderMetadataManager": "Metadata Manager", - "HeaderPreferences": "Voorkeuren", + "HeaderSettings": "Instellingen", "MessageLoadingChannels": "Laden kanaal inhoud ...", "MessageLoadingContent": "Inhoud wordt geladen ...", "ButtonMarkRead": "Markeren als gelezen", @@ -908,7 +912,7 @@ "OptionCommunityMostWatchedSort": "Meest bekeken", "TabNextUp": "Volgend", "PlaceholderUsername": "Gebruikersnaam", - "HeaderBecomeProjectSupporter": "Wordt Emby Supporter", + "HeaderBecomeProjectSupporter": "Word Emby Supporter", "MessageNoMovieSuggestionsAvailable": "Er zijn momenteel geen film suggesties beschikbaar. Begin met het bekijken en waardeer uw films, kom daarna terug om uw aanbevelingen te bekijken.", "MessageNoCollectionsAvailable": "Collecties maken het u mogelijk om Films, Series, Albums, Boeken en Games te groeperen. Klik op de + knop om Collecties aan te maken.", "MessageNoPlaylistsAvailable": "Met afspeellijsten kunt u een lijst maken waarvan de items achter elkaar afgespeeld worden. Om een item toe te voegen klikt u met rechts of tik en houd het vast om het te selecteren, klik vervolgens op Toevoegen aan afspeellijst.", @@ -975,9 +979,9 @@ "LabelProtocolInfo": "Protocol info:", "LabelProtocolInfoHelp": "De waarde die wordt gebruikt bij het reageren op GetProtocolInfo verzoeken van het apparaat.", "TabNfo": "Nfo", - "HeaderKodiMetadataHelp": "Emby omvat native ondersteuning voor Nfo metadata bestanden. Om Nfo metadata in- of uit te schakelen, gebruikt u het tabblad Geavanceerd om opties te configureren voor uw mediatypen.", - "LabelKodiMetadataUser": "Synchroniseer gekeken informatie toe aan NFO's voor (gebruiker):", - "LabelKodiMetadataUserHelp": "Schakel dit in om gemonitorde gegevens in sync te houden tussen Emby Server en Nfo bestanden.", + "HeaderKodiMetadataHelp": "Emby omvat ondersteunt Nfo metadata bestanden. Om Nfo metadata in- of uit te schakelen, gebruikt u het tabblad Geavanceerd om opties voor uw mediatypen in te stellen.", + "LabelKodiMetadataUser": "Synchroniseer kijk informatie naar nfo's voor:", + "LabelKodiMetadataUserHelp": "Schakel dit in om gemonitorde gegevens tussen Emby Server en Nfo bestanden te synchroniseren", "LabelKodiMetadataDateFormat": "Uitgave datum formaat:", "LabelKodiMetadataDateFormatHelp": "Alle datums in NFO's zullen gelezen en geschreven worden met dit formaat.", "LabelKodiMetadataSaveImagePaths": "Bewaar afbeeldingspaden in NFO-bestanden", @@ -988,9 +992,9 @@ "LabelGroupChannelsIntoViews": "Toon de volgende kanalen binnen mijn overzichten:", "LabelGroupChannelsIntoViewsHelp": "Indien ingeschakeld, zullen deze kanalen direct naast andere overzichten worden weergegeven. Indien uitgeschakeld, zullen ze worden weergegeven in een aparte kanalen overzicht.", "LabelDisplayCollectionsView": "Toon collecties in mijn overzichten om film verzamelingen weer te geven", - "LabelDisplayCollectionsViewHelp": "Hiermee wordt een aparte weergave gemaakt waarin collecties worden weergegeven die u hebt aangemaakt of toegang toe hebt. Klik rechts op een film of druk en houd vast en kies 'Voeg toe aan Collectie'. ", + "LabelDisplayCollectionsViewHelp": "Hiermee wordt een aparte weergave gemaakt waarin collecties worden weergegeven die u hebt aangemaakt of toegang toe hebt. Klik rechts op een film of druk en houd vast en kies 'Toevoegen aan Collectie'. ", "LabelKodiMetadataEnableExtraThumbs": "Kopieer extrafanart naar extrathumbs", - "LabelKodiMetadataEnableExtraThumbsHelp": "Als er afbeeldingen gedownload worden kunnen deze direct in extrafanart en extrathumbs opgeslagen worden voor maximale Kodi skin compatibiliteit.", + "LabelKodiMetadataEnableExtraThumbsHelp": "Gedownloade afbeeldingen kunnen direct in extrafanart en extrathumbs opgeslagen worden voor maximale Kodi skin compatibiliteit.", "TabServices": "Meta Diensten", "TabLogs": "Logboeken", "HeaderServerLogFiles": "Server logboek bestanden:", @@ -1098,7 +1102,6 @@ "OptionReportArtists": "Artiesten", "OptionReportAlbums": "Albums", "OptionReportAdultVideos": "Adult video's", - "ButtonMore": "Meer", "HeaderActivity": "Activiteit", "ScheduledTaskStartedWithName": "{0} is gestart", "ScheduledTaskCancelledWithName": "{0} is geannuleerd", @@ -1148,7 +1151,7 @@ "LabelEasyPinCode": "Eenvoudige pincode:", "EasyPasswordHelp": "Uw gemakkelijk pincode wordt gebruikt voor offline toegang met ondersteunde Emby apps, en kan ook worden gebruikt voor eenvoudige in-netwerk aanmelden.", "LabelInNetworkSignInWithEasyPassword": "Schakel eenvoudige lokale aanmelding in met mijn easy pin code", - "LabelInNetworkSignInWithEasyPasswordHelp": "Indien ingeschakeld, zult u in staat zijn om uw gemakkelijke pincode gebruiken om u aan te melden bij Emby apps van binnen uw thuisnetwerk. Uw reguliere wachtwoord is nodig buiten uw thuisnetwerk. Als U de pincode leeg laat, heeft U geen wachtwoord nodig in uw thuisnetwerk.", + "LabelInNetworkSignInWithEasyPasswordHelp": "Indien ingeschakeld, zult u in staat zijn om uw gemakkelijke pincode gebruiken om u aan te melden bij Emby apps van binnen uw thuisnetwerk. Uw reguliere wachtwoord is nodig buiten uw thuisnetwerk. Als u de pincode leeg laat, heeft u geen wachtwoord nodig in uw thuisnetwerk.", "HeaderPassword": "Wachtwoord", "HeaderLocalAccess": "Lokale toegang", "HeaderViewOrder": "Weergave volgorde", @@ -1221,8 +1224,8 @@ "OptionMakeOneTimeDonation": "Doe een aparte donatie", "OptionOneTimeDescription": "Dit is een extra donatie voor het team om te laten zien dat u hen steunt. Het geeft geen extra voordelen en geeft u geen supporter sleutel.", "OptionLifeTimeSupporterMembership": "Levenslang supporter lidmaatschap", - "OptionYearlySupporterMembership": "Jaarlijkse supporter lidmaatschap", - "OptionMonthlySupporterMembership": "maandelijks supporter lidmaatschap", + "OptionYearlySupporterMembership": "Jaarlijks supporter lidmaatschap", + "OptionMonthlySupporterMembership": "Maandelijks supporter lidmaatschap", "OptionNoTrailer": "Geen trailer", "OptionNoThemeSong": "Geen thema muziek", "OptionNoThemeVideo": "Geen thema film", @@ -1263,7 +1266,7 @@ "LabelExternalPlayersHelp": "Toon knoppen om inhoud in externe spelers of te spelen. Dit is alleen mogelijk op apparaten die 'url schemes' ondersteunen, meest Android en iOS. Met externe spelers is er over het algemeen geen ondersteuning voor afstandsbediening of hervatten.", "LabelNativeExternalPlayersHelp": "Toon knoppen om media in externe spelers te kunnen spelen.", "LabelEnableItemPreviews": "Schakel item preview in", - "LabelEnableItemPreviewsHelp": "Bij inschakelen zal op sommige schermen een preview getoond worden als er op een item geklikt wordt.", + "LabelEnableItemPreviewsHelp": "Bij inschakelen zal op sommige schermen een preview getoond worden als op een item geklikt wordt.", "HeaderSubtitleProfile": "Ondertitelingsprofiel", "HeaderSubtitleProfiles": "Ondertitelingsprofielen", "HeaderSubtitleProfilesHelp": "Ondertitelingsprofielen beschrijven de ondertitelings formaten ondersteund door het apparaat.", @@ -1304,7 +1307,7 @@ "LabelDateAddedBehavior": "Datum toegevoegd gedrag voor nieuwe content:", "OptionDateAddedImportTime": "Gebruik scan datum", "OptionDateAddedFileTime": "Gebruik aanmaak datum bestand", - "LabelDateAddedBehaviorHelp": "Als er metadata gegevens zijn hebben deze voorrang op deze opties.", + "LabelDateAddedBehaviorHelp": "Als metadata gegevens aanwezig zijn hebben deze voorrang op deze opties.", "LabelNumberTrailerToPlay": "Aantal af te spelen trailers:", "TitleDevices": "Apparaten", "TabCameraUpload": "Camera upload", @@ -1318,10 +1321,10 @@ "LabelCustomDeviceDisplayName": "Weergave naam:", "LabelCustomDeviceDisplayNameHelp": "Geef een eigen weergave naam op of laat deze leeg om de naam te gebruiken die het apparaat opgeeft.", "HeaderInviteUser": "Nodig gebruiker uit", - "LabelConnectGuestUserNameHelp": "Dit is de gebruikersnaam die je vriend gebruikt om zich aan te melden bij de Emby website, of hun e-mailadres", - "HeaderInviteUserHelp": "Het delen van je media met vrienden is eenvoudiger dan ooit met Emby Connect.", + "LabelConnectGuestUserNameHelp": "Dit is de gebruikersnaam die uw vriend gebruikt om zich aan te melden bij de Emby website, of hun e-mailadres", + "HeaderInviteUserHelp": "Delen van uw media met vrienden is eenvoudiger dan ooit met Emby Connect.", "ButtonSendInvitation": "Stuur uitnodiging", - "HeaderSignInWithConnect": "Meld je aan met Emby Connect", + "HeaderSignInWithConnect": "Aanmelden met Emby Connect", "HeaderGuests": "Gasten", "HeaderLocalUsers": "Lokale gebruikers", "HeaderPendingInvitations": "Uitstaande uitnodigingen", @@ -1347,7 +1350,7 @@ "ButtonSignUp": "Aanmelden", "ButtonForgotPassword": "Wachtwoord vergeten", "OptionDisableUserPreferences": "Voorkom toegang tot gebruikers voorkeuren", - "OptionDisableUserPreferencesHelp": "Indien ingeschakeld kunnen alleen beheerders profiel afbeeldingen, wachtwoorden en taalinstellingen wijzigen.", + "OptionDisableUserPreferencesHelp": "Indien ingeschakeld kunnen alleen beheerders profielafbeeldingen, wachtwoorden en taalinstellingen wijzigen.", "HeaderSelectServer": "Selecteer server", "MessageNoServersAvailableToConnect": "Er zijn geen servers beschikbaar om mee te verbinden. Als u uitgenodigd bent om een server te delen accepteer dit hieronder of door op de link in het emailbericht te klikken.", "TitleNewUser": "Nieuwe gebruiker", @@ -1392,33 +1395,32 @@ "HeaderUpcomingMovies": "Aankomende Films", "HeaderUpcomingSports": "Sport binnenkort", "HeaderUpcomingPrograms": "Aankomende Programma's", - "ButtonMoreItems": "Meer...", + "ButtonMoreItems": "Meer", "LabelShowLibraryTileNames": "Toon bibliotheek tegel namen", "LabelShowLibraryTileNamesHelp": "Bepaalt of labels onder de bibliotheek tegels zullen worden weergegeven op de startpagina", "OptionEnableTranscodingThrottle": "Throtteling inschakelen", "OptionEnableTranscodingThrottleHelp": "Throtteling zal automatisch de snelheid van het transcoderen aanpassen om de cpu belasting laag te houden tijdens het afspelen.", "LabelUploadSpeedLimit": "Upload limiet (Mbps):", - "OptionAllowSyncTranscoding": "Sta synchronisatie toe die transcodering vereist", + "OptionAllowSyncTranscoding": "Synchronisatie die transcodering vereist toestaan", "HeaderPlayback": "Media afspelen", - "OptionAllowAudioPlaybackTranscoding": "Sta het afspelen van audio wat transcoding vereist toe", - "OptionAllowVideoPlaybackTranscoding": "Sta het afspelen van video wat transcoding vereist toe", + "OptionAllowAudioPlaybackTranscoding": "Afspelen van audio via transcoding toestaan", + "OptionAllowVideoPlaybackTranscoding": "Afspelen van video via transcoding toestaan", "OptionAllowMediaPlaybackTranscodingHelp": "Gebruikers zullen een bericht ontvangen als afspelen niet is toegestaan op basis van het beleid", "TabStreaming": "Streaming", "LabelRemoteClientBitrateLimit": "Client bitrate limiet (Mbps):", "LabelRemoteClientBitrateLimitHelp": "Een optionele streaming bitrate limiet voor alle clients. Dit wordt gebruikt om te voorkomen dat clients een hogere bitrate aanvragen dan de internet connectie kan leveren.", "LabelConversionCpuCoreLimit": "CPU core limiet:", - "LabelConversionCpuCoreLimitHelp": "Limiteer het aantal CPU cores wat gebruikt mag worden bij een omzetteing om te synchroniseren.", - "OptionEnableFullSpeedConversion": "Schakel hoge converteren op hoge snelheid in", - "OptionEnableFullSpeedConversionHelp": "Standaard wordt het converteren voor synchronisatie opdrachten op lage snelheid uitgevoerd zodat er zo min mogelijke impact is op de server.", + "LabelConversionCpuCoreLimitHelp": "Limiteer het aantal CPU cores dat gebruikt mag worden bij een omzetting om te synchroniseren.", + "OptionEnableFullSpeedConversion": "Inschakelen conversie op hoge snelheid", + "OptionEnableFullSpeedConversionHelp": "Standaard wordt het converteren voor synchronisatie opdrachten op lage snelheid uitgevoerd zodat er zo min mogelijk impact is op de server.", "HeaderPlaylists": "Afspeellijsten", - "HeaderSelectDate": "Selecteer Datum", "HeaderViewStyles": "Bekijk stijlen", "LabelSelectViewStyles": "Schakel verbeterde presentatie in voor:", "LabelSelectViewStylesHelp": "Bij inschakelen zullen overzichten met met categorie\u00ebn zoals suggesties, recente, genres en meer getoond worden. Bij uitschakelen worden simpele mappen getoond.", "TabPhotos": "Foto's", "TabVideos": "Video's", "HeaderWelcomeToEmby": "Welkom bij Emby", - "EmbyIntroMessage": "Met Emby kan je eenvoudig films, muziek en foto's naar je telefoon, tablet en andere apparaten streamen.", + "EmbyIntroMessage": "Met Emby kunt u eenvoudig films, muziek en foto's naar uw telefoon, tablet en andere apparatuur streamen.", "ButtonSkip": "Overslaan", "TextConnectToServerManually": "Verbind handmatig met de server", "ButtonSignInWithConnect": "Aanmelden met Emby Connect", @@ -1431,13 +1433,22 @@ "HeaderConnectToServer": "Verbind met server", "OptionReportList": "Lijst weergave", "OptionReportStatistics": "Statistieken", - "OptionReportGrouping": "Groupering", + "OptionReportGrouping": "Groepering", "HeaderExport": "Export", "HeaderColumns": "Kolommen", "ButtonReset": "Rest", "OptionEnableExternalVideoPlayers": "Inschakelen van externe video-spelers", "ButtonUnlockGuide": "Gids vrijgeven", - "LabelEnableFullScreen": "Enable fullscreen mode", - "LabelEnableChromecastAc3Passthrough": "Enable Chromecast AC3 Passthrough", - "LabelSyncPath": "Synced content path:" + "LabelEnableFullScreen": "Schakel Full Screen in", + "LabelEnableChromecastAc3Passthrough": "Schakel Chromecast AC3 Passthrough in", + "LabelSyncPath": "Gesynchroniseerde inhoud pad:", + "LabelEmail": "Email adres:", + "LabelUsername": "Gebruikersnaam:", + "HeaderSignUp": "Meld aan", + "LabelPasswordConfirm": "Wachtworod (Bevestig)", + "ButtonAddServer": "Voeg server toe", + "TabHomeScreen": "Start scherm", + "HeaderDisplay": "Weergave", + "HeaderNavigation": "Navigatie", + "LegendTheseSettingsShared": "Deze instellingen worden gedeeld op alle apparaten" }
\ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/Server/pl.json b/MediaBrowser.Server.Implementations/Localization/Server/pl.json index 30e82ca27..3285c627b 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/pl.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/pl.json @@ -13,6 +13,7 @@ "LabelShowLogWindow": "Show Log Window", "LabelPrevious": "Wstecz", "LabelFinish": "Koniec", + "FolderTypeMixed": "Mixed content", "LabelNext": "Dalej", "LabelYoureDone": "Sko\u0144czy\u0142e\u015b!", "WelcomeToProject": "Welcome to Emby!", @@ -90,7 +91,6 @@ "LabelEnableEnhancedMovies": "Enable enhanced movie displays", "LabelEnableEnhancedMoviesHelp": "When enabled, movies will be displayed as folders to include trailers, extras, cast & crew, and other related content.", "HeaderSyncJobInfo": "Sync Job", - "FolderTypeMixed": "Mixed content", "FolderTypeMovies": "Movies", "FolderTypeMusic": "Music", "FolderTypeAdultVideos": "Adult videos", @@ -287,7 +287,9 @@ "OptionFileMetadataYearMismatch": "File\/Metadata Years Mismatched", "TabGeneral": "Og\u00f3lne", "TitleSupport": "Wesprzyj", + "LabelSeasonNumber": "Season number", "TabLog": "Log", + "LabelEpisodeNumber": "Episode number", "TabAbout": "A propos", "TabSupporterKey": "Supporter Key", "TabBecomeSupporter": "Become a Supporter", @@ -313,6 +315,9 @@ "OptionAllowRemoteControlOthers": "Allow remote control of other users", "OptionAllowRemoteSharedDevices": "Allow remote control of shared devices", "OptionAllowRemoteSharedDevicesHelp": "Dlna devices are considered shared until a user begins controlling it.", + "OptionAllowLinkSharing": "Allow social media sharing", + "OptionAllowLinkSharingHelp": "Only web pages containing media information are shared. Media files are never shared publicly. Shares are time-limited and will expire based on your server sharing settings.", + "HeaderSharing": "Sharing", "HeaderRemoteControl": "Remote Control", "OptionMissingTmdbId": "Missing Tmdb Id", "OptionIsHD": "HD", @@ -581,8 +586,6 @@ "LabelSkipped": "Skipped", "HeaderEpisodeOrganization": "Episode Organization", "LabelSeries": "Series:", - "LabelSeasonNumber": "Season number:", - "LabelEpisodeNumber": "Episode number:", "LabelEndingEpisodeNumber": "Ending episode number:", "LabelEndingEpisodeNumberHelp": "Only required for multi-episode files", "HeaderSupportTheTeam": "Support the Emby Team", @@ -870,6 +873,7 @@ "HeaderTypeText": "Enter Text", "LabelTypeText": "Text", "HeaderSearchForSubtitles": "Search for Subtitles", + "ButtonMore": "More", "MessageNoSubtitleSearchResultsFound": "No search results founds.", "TabDisplay": "Display", "TabLanguages": "Languages", @@ -900,7 +904,7 @@ "HeaderLiveTv": "Live TV", "HeaderReports": "Reports", "HeaderMetadataManager": "Metadata Manager", - "HeaderPreferences": "Preferences", + "HeaderSettings": "Settings", "MessageLoadingChannels": "Loading channel content...", "MessageLoadingContent": "Loading content...", "ButtonMarkRead": "Mark Read", @@ -1098,7 +1102,6 @@ "OptionReportArtists": "Artists", "OptionReportAlbums": "Albums", "OptionReportAdultVideos": "Adult videos", - "ButtonMore": "More", "HeaderActivity": "Activity", "ScheduledTaskStartedWithName": "{0} started", "ScheduledTaskCancelledWithName": "{0} was cancelled", @@ -1392,7 +1395,7 @@ "HeaderUpcomingMovies": "Upcoming Movies", "HeaderUpcomingSports": "Upcoming Sports", "HeaderUpcomingPrograms": "Upcoming Programs", - "ButtonMoreItems": "More...", + "ButtonMoreItems": "More", "LabelShowLibraryTileNames": "Show library tile names", "LabelShowLibraryTileNamesHelp": "Determines if labels will be displayed underneath library tiles on the home page", "OptionEnableTranscodingThrottle": "Enable throttling", @@ -1411,7 +1414,6 @@ "OptionEnableFullSpeedConversion": "Enable full speed conversion", "OptionEnableFullSpeedConversionHelp": "By default, sync conversion is performed at a low speed to minimize resource consumption.", "HeaderPlaylists": "Playlists", - "HeaderSelectDate": "Select Date", "HeaderViewStyles": "View Styles", "LabelSelectViewStyles": "Enable enhanced presentations for:", "LabelSelectViewStylesHelp": "If enabled, views will be built with metadata to offer categories such as Suggestions, Latest, Genres, and more. If disabled, they'll be displayed with simple folders.", @@ -1439,5 +1441,14 @@ "ButtonUnlockGuide": "Unlock Guide", "LabelEnableFullScreen": "Enable fullscreen mode", "LabelEnableChromecastAc3Passthrough": "Enable Chromecast AC3 Passthrough", - "LabelSyncPath": "Synced content path:" + "LabelSyncPath": "Synced content path:", + "LabelEmail": "Email:", + "LabelUsername": "Username:", + "HeaderSignUp": "Sign Up", + "LabelPasswordConfirm": "Password (confirm):", + "ButtonAddServer": "Add Server", + "TabHomeScreen": "Home Screen", + "HeaderDisplay": "Display", + "HeaderNavigation": "Navigation", + "LegendTheseSettingsShared": "These settings are shared on all devices" }
\ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/Server/pt-BR.json b/MediaBrowser.Server.Implementations/Localization/Server/pt-BR.json index 390c4b88f..d6644e363 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/pt-BR.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/pt-BR.json @@ -13,6 +13,7 @@ "LabelShowLogWindow": "Exibir Janela de Log", "LabelPrevious": "Anterior", "LabelFinish": "Finalizar", + "FolderTypeMixed": "Mixed content", "LabelNext": "Pr\u00f3ximo", "LabelYoureDone": "Pronto!", "WelcomeToProject": "Bem vindo ao Emby!", @@ -90,7 +91,6 @@ "LabelEnableEnhancedMovies": "Ativar exibi\u00e7\u00f5es de filme avan\u00e7adas", "LabelEnableEnhancedMoviesHelp": "Quando ativado, os filmes ser\u00e3o exibidos como pastas para incluir trailers, extras, elenco & equipe e outros conte\u00fados relacionados.", "HeaderSyncJobInfo": "Tarefa de Sincroniza\u00e7\u00e3o", - "FolderTypeMixed": "Conte\u00fado misto", "FolderTypeMovies": "Filmes", "FolderTypeMusic": "M\u00fasica", "FolderTypeAdultVideos": "V\u00eddeos adultos", @@ -287,7 +287,9 @@ "OptionFileMetadataYearMismatch": "Anos do Arquivo e Metadados n\u00e3o conferem", "TabGeneral": "Geral", "TitleSupport": "Suporte", + "LabelSeasonNumber": "N\u00famero da temporada", "TabLog": "Log", + "LabelEpisodeNumber": "N\u00famero do epis\u00f3dio", "TabAbout": "Sobre", "TabSupporterKey": "Chave de Colaborador", "TabBecomeSupporter": "Torne-se um Colaborador", @@ -313,6 +315,9 @@ "OptionAllowRemoteControlOthers": "Permitir controle remoto de outros usu\u00e1rios", "OptionAllowRemoteSharedDevices": "Permitir controle remoto de dispositivos compartilhados", "OptionAllowRemoteSharedDevicesHelp": "Dispositivos dlna s\u00e3o considerados compartilhados at\u00e9 que um usu\u00e1rio comece a control\u00e1-lo.", + "OptionAllowLinkSharing": "Permitir compartilhamento com m\u00eddia social", + "OptionAllowLinkSharingHelp": "Apenas p\u00e1ginas web que contenham informa\u00e7\u00f5es de m\u00eddia ser\u00e3o compartilhadas. Arquivos de m\u00eddia nunca ser\u00e3o compartilhados publicamente. Os compartilhamentos ter\u00e3o um limite de tempo e expirar\u00e3o com base nas defini\u00e7\u00f5es de compartilhamento do seu servidor.", + "HeaderSharing": "Compartilhar", "HeaderRemoteControl": "Controle Remoto", "OptionMissingTmdbId": "Faltando Id Tmdb", "OptionIsHD": "HD", @@ -581,8 +586,6 @@ "LabelSkipped": "Ignorada", "HeaderEpisodeOrganization": "Organiza\u00e7\u00e3o do Epis\u00f3dio", "LabelSeries": "S\u00e9rie:", - "LabelSeasonNumber": "N\u00famero da temporada:", - "LabelEpisodeNumber": "N\u00famero do epis\u00f3dio:", "LabelEndingEpisodeNumber": "N\u00famero do epis\u00f3dio final:", "LabelEndingEpisodeNumberHelp": "Necess\u00e1rio s\u00f3 para arquivos multi-epis\u00f3dios", "HeaderSupportTheTeam": "Colabore com o Time do Emby", @@ -870,6 +873,7 @@ "HeaderTypeText": "Digitar texto", "LabelTypeText": "Texto", "HeaderSearchForSubtitles": "Buscar Legendas", + "ButtonMore": "Mais", "MessageNoSubtitleSearchResultsFound": "N\u00e3o foi encontrado nenhum resultado.", "TabDisplay": "Exibi\u00e7\u00e3o", "TabLanguages": "Idiomas", @@ -900,7 +904,7 @@ "HeaderLiveTv": "TV ao Vivo", "HeaderReports": "Relat\u00f3rios", "HeaderMetadataManager": "Gerenciador de Metadados", - "HeaderPreferences": "Prefer\u00eancias", + "HeaderSettings": "Ajustes", "MessageLoadingChannels": "Carregando conte\u00fado do canal...", "MessageLoadingContent": "Carregando conte\u00fado...", "ButtonMarkRead": "Marcar com lido", @@ -1098,7 +1102,6 @@ "OptionReportArtists": "Artistas", "OptionReportAlbums": "\u00c1lbuns", "OptionReportAdultVideos": "V\u00eddeos adultos", - "ButtonMore": "Mais", "HeaderActivity": "Atividade", "ScheduledTaskStartedWithName": "{0} iniciado", "ScheduledTaskCancelledWithName": "{0} foi cancelado", @@ -1392,7 +1395,7 @@ "HeaderUpcomingMovies": "Filmes Por Estrear", "HeaderUpcomingSports": "Esportes Por Estrear", "HeaderUpcomingPrograms": "Programas Por Estrear", - "ButtonMoreItems": "Mais...", + "ButtonMoreItems": "Mais", "LabelShowLibraryTileNames": "Mostrar os nomes dos mosaicos da biblioteca", "LabelShowLibraryTileNamesHelp": "Determina se os t\u00edtulos ser\u00e3o exibidos embaixo dos mosaicos da biblioteca na p\u00e1gina in\u00edcio", "OptionEnableTranscodingThrottle": "Ativar controlador de fluxo", @@ -1411,7 +1414,6 @@ "OptionEnableFullSpeedConversion": "Ativar convers\u00e3o de alta velocidade", "OptionEnableFullSpeedConversionHelp": "Por padr\u00e3o, a convers\u00e3o na sincroniza\u00e7\u00e3o \u00e9 executada em uma velocidade baixa para minimizar o consumo de recursos.", "HeaderPlaylists": "Listas de reprodu\u00e7\u00e3o", - "HeaderSelectDate": "Selecionar Data", "HeaderViewStyles": "Visualizar Estilos", "LabelSelectViewStyles": "Ativar apresenta\u00e7\u00f5es aprimoradas para:", "LabelSelectViewStylesHelp": "Se ativada, as visualiza\u00e7\u00f5es ser\u00e3o feitas com metadados para oferecer categorias como Sugest\u00f5es, Recentes, G\u00eaneros e mais. Se desativada, elas ser\u00e3o exibidas como pastas simples.", @@ -1439,5 +1441,14 @@ "ButtonUnlockGuide": "Desbloquear Guia", "LabelEnableFullScreen": "Ativar modo tela cheia", "LabelEnableChromecastAc3Passthrough": "Ativar a assagem direta de AC3 para o Chromecast", - "LabelSyncPath": "Caminho do conte\u00fado sincronizado:" + "LabelSyncPath": "Caminho do conte\u00fado sincronizado:", + "LabelEmail": "Email:", + "LabelUsername": "Nome do Usu\u00e1rio:", + "HeaderSignUp": "Inscrever-se", + "LabelPasswordConfirm": "Senha (confirmar):", + "ButtonAddServer": "Adicionar Servidor", + "TabHomeScreen": "Tela In\u00edcio", + "HeaderDisplay": "Exibi\u00e7\u00e3o", + "HeaderNavigation": "Navega\u00e7\u00e3o", + "LegendTheseSettingsShared": "Estas defini\u00e7\u00f5es ser\u00e3o compartilhadas em todos os dispositivos" }
\ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/Server/pt-PT.json b/MediaBrowser.Server.Implementations/Localization/Server/pt-PT.json index 60ec5a96d..e55fe5caa 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/pt-PT.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/pt-PT.json @@ -13,6 +13,7 @@ "LabelShowLogWindow": "Mostrar Janela de Log", "LabelPrevious": "Anterior", "LabelFinish": "Terminar", + "FolderTypeMixed": "Mixed content", "LabelNext": "Seguinte", "LabelYoureDone": "Concluiu!", "WelcomeToProject": "Bem-vindo ao Emby!", @@ -31,7 +32,7 @@ "LabelEnableVideoImageExtraction": "Activar extrac\u00e7\u00e3o de imagens dos v\u00eddeos.", "VideoImageExtractionHelp": "Para os v\u00eddeos ainda sem imagens e que n\u00e3o se encontram imagens na internet. Esta funcionalidade vai acrescentar mais algum tempo na leitura inicial da biblioteca, mas resultar\u00e1 numa apresenta\u00e7\u00e3o melhorada,", "LabelEnableChapterImageExtractionForMovies": "Extrair imagens dos cap\u00edtulos dos Filmes", - "LabelChapterImageExtractionForMoviesHelp": "Extracting chapter images will allow clients to display graphical scene selection menus. The process can be slow, cpu-intensive and may require several gigabytes of space. It runs as a nightly scheduled task, although this is configurable in the scheduled tasks area. It is not recommended to run this task during peak usage hours.", + "LabelChapterImageExtractionForMoviesHelp": "Extrair imagens de cap\u00edtulos permitir\u00e1 aos clientes exibir menus gr\u00e1ficos de sele\u00e7\u00e3o de cenas. O processo pode ser lento, ocasionar uso intensivo do cpu e pode exigir bastante espa\u00e7o em disco. Ser\u00e1 executada como uma tarefa noturna, embora seja configur\u00e1vel na \u00e1rea de tarefas agendadas. N\u00e3o \u00e9 recomendado executar esta tarefa durante as horas de maior uso.", "LabelEnableAutomaticPortMapping": "Activar mapeamento autom\u00e1tico de portas", "LabelEnableAutomaticPortMappingHelp": "UPnP permite configurar automaticamente o router, para um acesso remoto mais facilitado. Pode n\u00e3o suportar todos os modelos de routers.", "HeaderTermsOfService": "Termos de Servi\u00e7o do Emby", @@ -56,17 +57,17 @@ "HeaderSync": "Sincroniza\u00e7\u00e3o", "ButtonOk": "Ok", "ButtonCancel": "Cancelar", - "ButtonExit": "Exit", + "ButtonExit": "Sair", "ButtonNew": "Novo", "HeaderTV": "TV", - "HeaderAudio": "Audio", - "HeaderVideo": "Video", - "HeaderPaths": "Paths", + "HeaderAudio": "\u00c1udio", + "HeaderVideo": "V\u00eddeo", + "HeaderPaths": "Localiza\u00e7\u00f5es", "CategorySync": "Sincroniza\u00e7\u00e3o", - "TabPlaylist": "Playlist", + "TabPlaylist": "Lista de Reprodu\u00e7\u00e3o", "HeaderEasyPinCode": "Easy Pin Code", - "HeaderGrownupsOnly": "Grown-ups Only!", - "DividerOr": "-- or --", + "HeaderGrownupsOnly": "Adultos Apenas!", + "DividerOr": "-- ou --", "HeaderInstalledServices": "Installed Services", "HeaderAvailableServices": "Available Services", "MessageNoServicesInstalled": "No services are currently installed.", @@ -74,12 +75,12 @@ "KidsModeAdultInstruction": "Click the lock icon in the bottom right to configure or leave kids mode. Your pin code will be required.", "ButtonConfigurePinCode": "Configure pin code", "HeaderAdultsReadHere": "Adults Read Here!", - "RegisterWithPayPal": "Register with PayPal", + "RegisterWithPayPal": "Registar com PayPal", "HeaderSyncRequiresSupporterMembership": "A sincroniza\u00e7\u00e3o necessita de uma conta de Apoiante", "HeaderEnjoyDayTrial": "Enjoy a 14 Day Free Trial", "LabelSyncTempPath": "Caminho de arquivo tempor\u00e1rio:", "LabelSyncTempPathHelp": "Especifique uma pasta de trabalho para a sincroniza\u00e7\u00e3o personalizada. Multim\u00e9dia convertida, criada durante o processo de sincroniza\u00e7\u00e3o, ser\u00e1 aqui armazenada.", - "LabelCustomCertificatePath": "Custom certificate path:", + "LabelCustomCertificatePath": "Localiza\u00e7\u00e3o do certificado personalizado:", "LabelCustomCertificatePathHelp": "Supply your own ssl certificate .pfx file. If omitted, the server will create a self-signed certificate.", "TitleNotifications": "Notifications", "ButtonDonateWithPayPal": "Donate with PayPal", @@ -90,19 +91,18 @@ "LabelEnableEnhancedMovies": "Enable enhanced movie displays", "LabelEnableEnhancedMoviesHelp": "When enabled, movies will be displayed as folders to include trailers, extras, cast & crew, and other related content.", "HeaderSyncJobInfo": "Tarefa de Sincroniza\u00e7\u00e3o", - "FolderTypeMixed": "Mixed content", - "FolderTypeMovies": "Movies", - "FolderTypeMusic": "Music", - "FolderTypeAdultVideos": "Adult videos", - "FolderTypePhotos": "Photos", - "FolderTypeMusicVideos": "Music videos", - "FolderTypeHomeVideos": "Home videos", - "FolderTypeGames": "Games", - "FolderTypeBooks": "Books", + "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", - "LabelContentType": "Content type:", - "TitleScheduledTasks": "Scheduled Tasks", + "LabelContentType": "Tipo de conte\u00fado:", + "TitleScheduledTasks": "Tarefas Agendadas", "HeaderSetupLibrary": "Configurar biblioteca", "ButtonAddMediaFolder": "Adicionar pasta de media", "LabelFolderType": "Tipo de pasta", @@ -127,7 +127,7 @@ "TabNotifications": "Notifica\u00e7\u00f5es", "TabCollectionTitles": "T\u00edtulos", "HeaderDeviceAccess": "Device Access", - "OptionEnableAccessFromAllDevices": "Enable access from all devices", + "OptionEnableAccessFromAllDevices": "Ativar acesso de todos os dispositivos", "OptionEnableAccessToAllChannels": "Enable access to all channels", "OptionEnableAccessToAllLibraries": "Enable access to all libraries", "DeviceAccessHelp": "This only applies to devices that can be uniquely identified and will not prevent browser access. Filtering user device access will prevent them from using new devices until they've been approved here.", @@ -287,7 +287,9 @@ "OptionFileMetadataYearMismatch": "Anos do Ficheiro\/Metadados n\u00e3o coincidem", "TabGeneral": "Geral", "TitleSupport": "Suporte", + "LabelSeasonNumber": "Season number", "TabLog": "Log", + "LabelEpisodeNumber": "Episode number", "TabAbout": "Acerca", "TabSupporterKey": "Chave de Apoiante", "TabBecomeSupporter": "Torne-se um Apoiante", @@ -295,7 +297,7 @@ "CheckoutKnowledgeBase": "Check out our knowledge base to help you get the most out of Emby.", "SearchKnowledgeBase": "Procurar na Base de Conhecimento", "VisitTheCommunity": "Visite a Comunidade", - "VisitProjectWebsite": "Visit the Emby Web Site", + "VisitProjectWebsite": "Visite a p\u00e1gina web do Emby", "VisitProjectWebsiteLong": "Visit the Emby Web site to catch the latest news and keep up with the developer blog.", "OptionHideUser": "Ocultar este utilizador dos formul\u00e1rios de in\u00edcio de sess\u00e3o", "OptionHideUserFromLoginHelp": "Useful for private or hidden administrator accounts. The user will need to sign in manually by entering their username and password.", @@ -303,7 +305,7 @@ "OptionDisableUserHelp": "Se desativado, o servidor n\u00e3o permite nenhuma conex\u00e3o deste utilizador. Conex\u00f5es existentes ser\u00e3o terminadas.", "HeaderAdvancedControl": "Controlo Avan\u00e7ado", "LabelName": "Nome:", - "ButtonHelp": "Help", + "ButtonHelp": "Ajuda", "OptionAllowUserToManageServer": "Permitir a este utilizador gerir o servidor", "HeaderFeatureAccess": "Acesso a Caracter\u00edsticas", "OptionAllowMediaPlayback": "Allow media playback", @@ -313,6 +315,9 @@ "OptionAllowRemoteControlOthers": "Permitir controlo remoto de outros utilizadores", "OptionAllowRemoteSharedDevices": "Allow remote control of shared devices", "OptionAllowRemoteSharedDevicesHelp": "Dlna devices are considered shared until a user begins controlling it.", + "OptionAllowLinkSharing": "Allow social media sharing", + "OptionAllowLinkSharingHelp": "Only web pages containing media information are shared. Media files are never shared publicly. Shares are time-limited and will expire based on your server sharing settings.", + "HeaderSharing": "Sharing", "HeaderRemoteControl": "Remote Control", "OptionMissingTmdbId": "Id Tmdb em falta", "OptionIsHD": "HD", @@ -372,7 +377,7 @@ "ButtonAutoScroll": "Scroll autom\u00e1tico", "LabelImageSavingConvention": "Conven\u00e7\u00e3o para guardar imagens:", "LabelImageSavingConventionHelp": "Emby recognizes images from most major media applications. Choosing your downloading convention is useful if you also use other products.", - "OptionImageSavingCompatible": "Compatible - Emby\/Kodi\/Plex", + "OptionImageSavingCompatible": "Compat\u00edvel - Emby\/Kodi\/Plex", "OptionImageSavingStandard": "Padr\u00e3o - MB2", "ButtonSignIn": "Iniciar Sess\u00e3o", "TitleSignIn": "Iniciar Sess\u00e3o", @@ -542,7 +547,7 @@ "HeaderNewCollection": "Nova Cole\u00e7\u00e3o", "ButtonSubmit": "Submit", "ButtonCreate": "Criar", - "LabelCustomCss": "Custom css:", + "LabelCustomCss": "CSS personalizado:", "LabelCustomCssHelp": "Apply your own custom css to the web interface.", "LabelLocalHttpServerPortNumber": "Local http port number:", "LabelLocalHttpServerPortNumberHelp": "The tcp port number that Emby's http server should bind to.", @@ -557,7 +562,7 @@ "LabelWebSocketPortNumber": "N\u00famero da porta da Web socket:", "LabelEnableAutomaticPortMap": "Enable automatic port mapping", "LabelEnableAutomaticPortMapHelp": "Attempt to automatically map the public port to the local port via UPnP. This may not work with some router models.", - "LabelExternalDDNS": "External WAN Address:", + "LabelExternalDDNS": "Endere\u00e7o WAN Externo:", "LabelExternalDDNSHelp": "If you have a dynamic DNS enter it here. Emby apps will use it when connecting remotely. Leave empty for automatic detection.", "TabResume": "Retomar", "TabWeather": "Tempo", @@ -581,16 +586,14 @@ "LabelSkipped": "Ignorado", "HeaderEpisodeOrganization": "Organiza\u00e7\u00e3o dos Epis\u00f3dios", "LabelSeries": "Series:", - "LabelSeasonNumber": "N\u00famero da temporada:", - "LabelEpisodeNumber": "N\u00famero do epis\u00f3dio:", "LabelEndingEpisodeNumber": "N\u00famero do epis\u00f3dio final:", "LabelEndingEpisodeNumberHelp": "Necess\u00e1rio s\u00f3 para arquivos multi-epis\u00f3dios", - "HeaderSupportTheTeam": "Support the Emby Team", + "HeaderSupportTheTeam": "Suporte a Equipa do Emby", "LabelSupportAmount": "Quantia (USD)", "HeaderSupportTheTeamHelp": "Ajude a garantir o desenvolvimento continuado deste projeto, doando. Uma parte de todas as doa\u00e7\u00f5es ser\u00e1 para contribuir para outras ferramentas gratuitas em que dependemos.", "ButtonEnterSupporterKey": "Insira a chave de apoiante", "DonationNextStep": "Assim que termine, por favor volte e insira a sua chave de apoiante, a qual ir\u00e1 receber por email.", - "AutoOrganizeHelp": "O auto-organizar monitoriza as suas pastas de transfer\u00eancias em busca de novos ficheiros e move-os para as suas pastas multim\u00e9dia.", + "AutoOrganizeHelp": "A organiza\u00e7\u00e3o autom\u00e1tica monitoriza as suas pastas de transfer\u00eancias em busca de novos ficheiros e move-os para as suas pastas multim\u00e9dia.", "AutoOrganizeTvHelp": "A organiza\u00e7\u00e3o de ficheiros de TV s\u00f3 ir\u00e1 adicionar ficheiros \u00e0s s\u00e9ries existentes. Ela n\u00e3o ir\u00e1 criar novas pastas de s\u00e9ries.", "OptionEnableEpisodeOrganization": "Ativar a organiza\u00e7\u00e3o de novos epis\u00f3dios", "LabelWatchFolder": "Observar pasta:", @@ -608,7 +611,7 @@ "HeaderPattern": "Padr\u00e3o", "HeaderResult": "Resultado", "LabelDeleteEmptyFolders": "Remover pastas vazias depois de organizar", - "LabelDeleteEmptyFoldersHelp": "Ative isto para manter a pasta de downloads limpa.", + "LabelDeleteEmptyFoldersHelp": "Ative esta op\u00e7\u00e3o para manter a pasta de transfer\u00eancias limpa.", "LabelDeleteLeftOverFiles": "Apagar os ficheiros deixados com as seguintes extens\u00f5es:", "LabelDeleteLeftOverFilesHelp": "Separar com ;. Por exemplo: .nfo;.txt", "OptionOverwriteExistingEpisodes": "Sobrepor epis\u00f3dios existentes", @@ -870,6 +873,7 @@ "HeaderTypeText": "Inserir texto", "LabelTypeText": "Texto", "HeaderSearchForSubtitles": "Search for Subtitles", + "ButtonMore": "More", "MessageNoSubtitleSearchResultsFound": "No search results founds.", "TabDisplay": "Display", "TabLanguages": "Languages", @@ -897,10 +901,10 @@ "OptionLatestChannelMedia": "Latest channel items", "HeaderLatestChannelItems": "Latest Channel Items", "OptionNone": "None", - "HeaderLiveTv": "Live TV", + "HeaderLiveTv": "TV ao Vivo", "HeaderReports": "Reports", "HeaderMetadataManager": "Metadata Manager", - "HeaderPreferences": "Preferences", + "HeaderSettings": "Settings", "MessageLoadingChannels": "Loading channel content...", "MessageLoadingContent": "Loading content...", "ButtonMarkRead": "Mark Read", @@ -935,7 +939,7 @@ "ViewTypeMusicArtists": "Artists", "ViewTypeBoxSets": "Collections", "ViewTypeChannels": "Channels", - "ViewTypeLiveTV": "Live TV", + "ViewTypeLiveTV": "TV ao Vivo", "ViewTypeLiveTvNowPlaying": "Now Airing", "ViewTypeLatestGames": "Latest Games", "ViewTypeRecentlyPlayedGames": "Reproduzido Recentemente", @@ -1014,7 +1018,7 @@ "HeaderApiKeysHelp": "External applications are required to have an Api key in order to communicate with Emby Server. Keys are issued by logging in with an Emby account, or by manually granting the application a key.", "HeaderApiKey": "Api Key", "HeaderApp": "App", - "HeaderDevice": "Device", + "HeaderDevice": "Dispositivo", "HeaderUser": "User", "HeaderDateIssued": "Date Issued", "LabelChapterName": "Chapter {0}", @@ -1036,17 +1040,17 @@ "LabelPageSize": "Item limit:", "LabelPath": "Path:", "LabelView": "Visualizar:", - "TabUsers": "Users", + "TabUsers": "Utilizadores", "LabelSortName": "Sort name:", "LabelDateAdded": "Date added:", "HeaderFeatures": "Features", "HeaderAdvanced": "Avan\u00e7ado", "ButtonSync": "Sincronizar", - "TabScheduledTasks": "Scheduled Tasks", + "TabScheduledTasks": "Tarefas Agendadas", "HeaderChapters": "Cap\u00edtulos", "HeaderResumeSettings": "Resume Settings", "TabSync": "Sincroniza\u00e7\u00e3o", - "TitleUsers": "Users", + "TitleUsers": "Utilizadores", "LabelProtocol": "Protocol:", "OptionProtocolHttp": "Http", "OptionProtocolHls": "Http Live Streaming", @@ -1098,19 +1102,18 @@ "OptionReportArtists": "Artists", "OptionReportAlbums": "Albums", "OptionReportAdultVideos": "Adult videos", - "ButtonMore": "More", "HeaderActivity": "Activity", "ScheduledTaskStartedWithName": "{0} started", "ScheduledTaskCancelledWithName": "{0} was cancelled", "ScheduledTaskCompletedWithName": "{0} completed", "ScheduledTaskFailed": "Scheduled task completed", - "PluginInstalledWithName": "{0} was installed", - "PluginUpdatedWithName": "{0} was updated", - "PluginUninstalledWithName": "{0} was uninstalled", + "PluginInstalledWithName": "{0} foi instalado", + "PluginUpdatedWithName": "{0} foi atualizado", + "PluginUninstalledWithName": "{0} foi desinstalado", "ScheduledTaskFailedWithName": "{0} failed", "ItemAddedWithName": "{0} foi adicionado \u00e0 biblioteca", "ItemRemovedWithName": "{0} foi removido da biblioteca", - "DeviceOnlineWithName": "{0} is connected", + "DeviceOnlineWithName": "{0} est\u00e1 conectado", "UserOnlineFromDevice": "{0} is online from {1}", "DeviceOfflineWithName": "{0} has disconnected", "UserOfflineFromDevice": "{0} has disconnected from {1}", @@ -1245,7 +1248,7 @@ "MessageSupporterPluginRequiresMembership": "This plugin will require an active supporter membership after the 14 day free trial.", "MessagePremiumPluginRequiresMembership": "This plugin will require an active supporter membership in order to purchase after the 14 day free trial.", "HeaderReviews": "Reviews", - "HeaderDeveloperInfo": "Info do Programador", + "HeaderDeveloperInfo": "Informa\u00e7\u00e3o do Programador", "HeaderRevisionHistory": "Revision History", "ButtonViewWebsite": "View website", "HeaderXmlSettings": "Xml Settings", @@ -1306,9 +1309,9 @@ "OptionDateAddedFileTime": "Use file creation date", "LabelDateAddedBehaviorHelp": "If a metadata value is present it will always be used before either of these options.", "LabelNumberTrailerToPlay": "Number of trailers to play:", - "TitleDevices": "Devices", + "TitleDevices": "Dispositivos", "TabCameraUpload": "Camera Upload", - "TabDevices": "Devices", + "TabDevices": "Dispositivos", "HeaderCameraUploadHelp": "Automatically upload photos and videos taken from your mobile devices into Emby.", "MessageNoDevicesSupportCameraUpload": "You currently don't have any devices that support camera upload.", "LabelCameraUploadPath": "Camera upload path:", @@ -1392,7 +1395,7 @@ "HeaderUpcomingMovies": "Upcoming Movies", "HeaderUpcomingSports": "Upcoming Sports", "HeaderUpcomingPrograms": "Upcoming Programs", - "ButtonMoreItems": "More...", + "ButtonMoreItems": "More", "LabelShowLibraryTileNames": "Show library tile names", "LabelShowLibraryTileNamesHelp": "Determines if labels will be displayed underneath library tiles on the home page", "OptionEnableTranscodingThrottle": "Enable throttling", @@ -1411,7 +1414,6 @@ "OptionEnableFullSpeedConversion": "Enable full speed conversion", "OptionEnableFullSpeedConversionHelp": "By default, sync conversion is performed at a low speed to minimize resource consumption.", "HeaderPlaylists": "Playlists", - "HeaderSelectDate": "Select Date", "HeaderViewStyles": "View Styles", "LabelSelectViewStyles": "Enable enhanced presentations for:", "LabelSelectViewStylesHelp": "If enabled, views will be built with metadata to offer categories such as Suggestions, Latest, Genres, and more. If disabled, they'll be displayed with simple folders.", @@ -1439,5 +1441,14 @@ "ButtonUnlockGuide": "Unlock Guide", "LabelEnableFullScreen": "Enable fullscreen mode", "LabelEnableChromecastAc3Passthrough": "Enable Chromecast AC3 Passthrough", - "LabelSyncPath": "Caminho do conte\u00fado sincronizado:" + "LabelSyncPath": "Caminho do conte\u00fado sincronizado:", + "LabelEmail": "Email:", + "LabelUsername": "Username:", + "HeaderSignUp": "Sign Up", + "LabelPasswordConfirm": "Password (confirm):", + "ButtonAddServer": "Add Server", + "TabHomeScreen": "Home Screen", + "HeaderDisplay": "Display", + "HeaderNavigation": "Navigation", + "LegendTheseSettingsShared": "These settings are shared on all devices" }
\ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/Server/ro.json b/MediaBrowser.Server.Implementations/Localization/Server/ro.json index 6f4cc36ed..b1ae764ff 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/ro.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/ro.json @@ -13,6 +13,7 @@ "LabelShowLogWindow": "Arata Fereastra de Log", "LabelPrevious": "Anteriorul", "LabelFinish": "Termina", + "FolderTypeMixed": "Mixed content", "LabelNext": "Urmatorul", "LabelYoureDone": "Esti Gata!", "WelcomeToProject": "Bine a\u021bi venit la Emby!", @@ -85,12 +86,11 @@ "ButtonDonateWithPayPal": "Doneaza cu PayPal", "OptionDetectArchiveFilesAsMedia": "Detecteza fisierele arhiva ca media", "OptionDetectArchiveFilesAsMediaHelp": "Dac\u0103 este activat\u0103, fi\u0219ierele cu extensiile .rar \u0219i .zip vor fi detectate ca fi\u0219iere media.", - "LabelEnterConnectUserName": "Nume utilizator sau email:", - "LabelEnterConnectUserNameHelp": "Acestea sunt numele si parola contului Dvs. online Emby.", + "LabelEnterConnectUserName": "Username or email:", + "LabelEnterConnectUserNameHelp": "This is your Emby online account username or password.", "LabelEnableEnhancedMovies": "Activati afisarea imbunatatita a filmelor", "LabelEnableEnhancedMoviesHelp": "C\u00e2nd este activat, filmele vor fi afi\u0219ate ca dosare pentru a include trailere, figuranti, distributie si echipa, si alte tipuri de con\u021binut.", "HeaderSyncJobInfo": "Activitate de sincronizare", - "FolderTypeMixed": "Continut mixt", "FolderTypeMovies": "Filme", "FolderTypeMusic": "Muzica", "FolderTypeAdultVideos": "Filme Porno", @@ -287,7 +287,9 @@ "OptionFileMetadataYearMismatch": "Anii Fisierelor\/Metadatelor gresite", "TabGeneral": "General", "TitleSupport": "Suport", + "LabelSeasonNumber": "Season number", "TabLog": "Log", + "LabelEpisodeNumber": "Episode number", "TabAbout": "Despre", "TabSupporterKey": "Cheie Suporter", "TabBecomeSupporter": "Devino Suporter", @@ -313,6 +315,9 @@ "OptionAllowRemoteControlOthers": "Allow remote control of other users", "OptionAllowRemoteSharedDevices": "Allow remote control of shared devices", "OptionAllowRemoteSharedDevicesHelp": "Dlna devices are considered shared until a user begins controlling it.", + "OptionAllowLinkSharing": "Allow social media sharing", + "OptionAllowLinkSharingHelp": "Only web pages containing media information are shared. Media files are never shared publicly. Shares are time-limited and will expire based on your server sharing settings.", + "HeaderSharing": "Sharing", "HeaderRemoteControl": "Remote Control", "OptionMissingTmdbId": "Missing Tmdb Id", "OptionIsHD": "HD", @@ -581,8 +586,6 @@ "LabelSkipped": "Skipped", "HeaderEpisodeOrganization": "Episode Organization", "LabelSeries": "Series:", - "LabelSeasonNumber": "Season number:", - "LabelEpisodeNumber": "Episode number:", "LabelEndingEpisodeNumber": "Ending episode number:", "LabelEndingEpisodeNumberHelp": "Only required for multi-episode files", "HeaderSupportTheTeam": "Support the Emby Team", @@ -870,6 +873,7 @@ "HeaderTypeText": "Enter Text", "LabelTypeText": "Text", "HeaderSearchForSubtitles": "Search for Subtitles", + "ButtonMore": "More", "MessageNoSubtitleSearchResultsFound": "No search results founds.", "TabDisplay": "Display", "TabLanguages": "Languages", @@ -900,7 +904,7 @@ "HeaderLiveTv": "Live TV", "HeaderReports": "Reports", "HeaderMetadataManager": "Metadata Manager", - "HeaderPreferences": "Preferences", + "HeaderSettings": "Settings", "MessageLoadingChannels": "Loading channel content...", "MessageLoadingContent": "Loading content...", "ButtonMarkRead": "Mark Read", @@ -1098,7 +1102,6 @@ "OptionReportArtists": "Artists", "OptionReportAlbums": "Albums", "OptionReportAdultVideos": "Adult videos", - "ButtonMore": "More", "HeaderActivity": "Activity", "ScheduledTaskStartedWithName": "{0} started", "ScheduledTaskCancelledWithName": "{0} was cancelled", @@ -1392,7 +1395,7 @@ "HeaderUpcomingMovies": "Upcoming Movies", "HeaderUpcomingSports": "Upcoming Sports", "HeaderUpcomingPrograms": "Upcoming Programs", - "ButtonMoreItems": "More...", + "ButtonMoreItems": "More", "LabelShowLibraryTileNames": "Show library tile names", "LabelShowLibraryTileNamesHelp": "Determines if labels will be displayed underneath library tiles on the home page", "OptionEnableTranscodingThrottle": "Enable throttling", @@ -1411,7 +1414,6 @@ "OptionEnableFullSpeedConversion": "Enable full speed conversion", "OptionEnableFullSpeedConversionHelp": "By default, sync conversion is performed at a low speed to minimize resource consumption.", "HeaderPlaylists": "Playlists", - "HeaderSelectDate": "Select Date", "HeaderViewStyles": "View Styles", "LabelSelectViewStyles": "Enable enhanced presentations for:", "LabelSelectViewStylesHelp": "If enabled, views will be built with metadata to offer categories such as Suggestions, Latest, Genres, and more. If disabled, they'll be displayed with simple folders.", @@ -1439,5 +1441,14 @@ "ButtonUnlockGuide": "Unlock Guide", "LabelEnableFullScreen": "Enable fullscreen mode", "LabelEnableChromecastAc3Passthrough": "Enable Chromecast AC3 Passthrough", - "LabelSyncPath": "Synced content path:" + "LabelSyncPath": "Synced content path:", + "LabelEmail": "Email:", + "LabelUsername": "Username:", + "HeaderSignUp": "Sign Up", + "LabelPasswordConfirm": "Password (confirm):", + "ButtonAddServer": "Add Server", + "TabHomeScreen": "Home Screen", + "HeaderDisplay": "Display", + "HeaderNavigation": "Navigation", + "LegendTheseSettingsShared": "These settings are shared on all devices" }
\ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/Server/ru.json b/MediaBrowser.Server.Implementations/Localization/Server/ru.json index 9f9b6c2bd..93ac4392b 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/ru.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/ru.json @@ -13,6 +13,7 @@ "LabelShowLogWindow": "\u041e\u0442\u043a\u0440\u044b\u0442\u044c \u043e\u043a\u043d\u043e \u0416\u0443\u0440\u043d\u0430\u043b\u0430", "LabelPrevious": "\u041f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435", "LabelFinish": "\u0413\u043e\u0442\u043e\u0432\u043e", + "FolderTypeMixed": "\u0420\u0430\u0437\u043d\u043e\u0442\u0438\u043f\u043d\u043e\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435", "LabelNext": "\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435", "LabelYoureDone": "\u0412\u044b \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u043b\u0438!", "WelcomeToProject": "\u041d\u0430\u0447\u0430\u043b\u043e \u0440\u0430\u0431\u043e\u0442\u044b \u0432 Emby", @@ -85,12 +86,11 @@ "ButtonDonateWithPayPal": "\u041f\u043e\u0436\u0435\u0440\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0447\u0435\u0440\u0435\u0437 PayPal", "OptionDetectArchiveFilesAsMedia": "\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c \u0430\u0440\u0445\u0438\u0432\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b \u043a\u0430\u043a \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0435 \u043c\u0435\u0434\u0438\u0430\u0434\u0430\u043d\u043d\u044b\u0435", "OptionDetectArchiveFilesAsMediaHelp": "\u041f\u0440\u0438 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438, \u0444\u0430\u0439\u043b\u044b \u0441 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\u043c\u0438 .RAR \u0438 .ZIP \u0431\u0443\u0434\u0443\u0442 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u044b \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043c\u0435\u0434\u0438\u0430\u0444\u0430\u0439\u043b\u043e\u0432.", - "LabelEnterConnectUserName": "Username or email:", - "LabelEnterConnectUserNameHelp": "This is your Emby online account username or password.", + "LabelEnterConnectUserName": "\u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438\u043b\u0438 \u042d-\u043f\u043e\u0447\u0442\u0430:", + "LabelEnterConnectUserNameHelp": "\u042d\u0442\u043e \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u0430\u0448\u0438\u043c \u0438\u043c\u0435\u043d\u0435\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438\u043b\u0438 \u043f\u0430\u0440\u043e\u043b\u0435\u043c \u0441\u0435\u0442\u0435\u0432\u043e\u0439 \u0443\u0447\u0451\u0442\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438 Emby.", "LabelEnableEnhancedMovies": "\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u043d\u043e\u0435 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0444\u0438\u043b\u044c\u043c\u043e\u0432", "LabelEnableEnhancedMoviesHelp": "\u041f\u0440\u0438 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438, \u0444\u0438\u043b\u044c\u043c\u044b \u0431\u0443\u0434\u0443\u0442 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c\u0441\u044f \u043a\u0430\u043a \u043f\u0430\u043f\u043a\u0438, \u0447\u0442\u043e\u0431\u044b \u0432\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u0442\u0440\u0435\u0439\u043b\u0435\u0440\u044b, \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u044b, \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u043e\u0432 \u0441\u044a\u0451\u043c\u043e\u043a \u0438 \u0434\u0440\u0443\u0433\u043e\u0435 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u043e\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435.", "HeaderSyncJobInfo": "\u0417\u0430\u0434\u0430\u043d\u0438\u0435 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438", - "FolderTypeMixed": "\u0420\u0430\u0437\u043d\u043e\u0442\u0438\u043f\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": "\u0412\u0437\u0440\u043e\u0441\u043b\u044b\u0435 \u0432\u0438\u0434\u0435\u043e", @@ -287,7 +287,9 @@ "OptionFileMetadataYearMismatch": "\u0420\u0430\u0437\u043d\u044b\u0435 \u0433\u043e\u0434\u044b \u0432\u043e \u0444\u0430\u0439\u043b\u0435\/\u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445", "TabGeneral": "\u041e\u0431\u0449\u0438\u0435", "TitleSupport": "\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430", + "LabelSeasonNumber": "\u041d\u043e\u043c\u0435\u0440 \u0441\u0435\u0437\u043e\u043d\u0430", "TabLog": "\u0416\u0443\u0440\u043d\u0430\u043b", + "LabelEpisodeNumber": "\u041d\u043e\u043c\u0435\u0440 \u044d\u043f\u0438\u0437\u043e\u0434\u0430", "TabAbout": "\u041e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435", "TabSupporterKey": "\u041a\u043b\u044e\u0447 \u0441\u043f\u043e\u043d\u0441\u043e\u0440\u0430", "TabBecomeSupporter": "\u0421\u0442\u0430\u0442\u044c \u0441\u043f\u043e\u043d\u0441\u043e\u0440\u043e\u043c", @@ -313,6 +315,9 @@ "OptionAllowRemoteControlOthers": "\u0420\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044c \u0443\u0434\u0430\u043b\u0451\u043d\u043d\u043e\u0435 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c\u0438", "OptionAllowRemoteSharedDevices": "\u0420\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044c \u0443\u0434\u0430\u043b\u0451\u043d\u043d\u043e\u0435 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e\u0431\u0449\u0438\u043c\u0438 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\u043c\u0438", "OptionAllowRemoteSharedDevicesHelp": "DLNA-\u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0441\u0447\u0438\u0442\u0430\u044e\u0442\u0441\u044f \u043e\u0431\u0449\u0438\u043c\u0438, \u043f\u043e\u043a\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043d\u0435 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0438\u043c\u0438.", + "OptionAllowLinkSharing": "\u0420\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u043d\u043e\u0433\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u0434\u043b\u044f \u0441\u043e\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u0435\u0442\u0435\u0439", + "OptionAllowLinkSharingHelp": "\u0422\u043e\u043b\u044c\u043a\u043e \u0432\u0435\u0431-\u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0435 \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043e \u043c\u0435\u0434\u0438\u0430\u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432 \u043e\u0431\u0449\u0435\u043c \u0434\u043e\u0441\u0442\u0443\u043f\u0435. \u041c\u0435\u0434\u0438\u0430\u0444\u0430\u0439\u043b\u044b \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u0432 \u043e\u0431\u0449\u0435\u043c \u0434\u043e\u0441\u0442\u0443\u043f\u0435. \u041e\u0431\u0449\u0438\u0439 \u0434\u043e\u0441\u0442\u0443\u043f \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u0438 \u0438\u0441\u0442\u0435\u0447\u0451\u0442 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u043e\u0431\u0449\u0435\u0433\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u0432\u0430\u0448\u0435\u0433\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u0430.", + "HeaderSharing": "\u041f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e\u0431\u0449\u0435\u0433\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u0430", "HeaderRemoteControl": "\u0423\u0434\u0430\u043b\u0451\u043d\u043d\u043e\u0435 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435", "OptionMissingTmdbId": "\u041d\u0435\u0442 TMDb Id", "OptionIsHD": "HD", @@ -356,7 +361,7 @@ "TabOthers": "\u0414\u0440\u0443\u0433\u0438\u0435", "HeaderExtractChapterImagesFor": "\u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0440\u0438\u0441\u0443\u043d\u043a\u043e\u0432 \u0441\u0446\u0435\u043d \u0434\u043b\u044f:", "OptionMovies": "\u0424\u0438\u043b\u044c\u043c\u044b", - "OptionEpisodes": "\u042d\u043f\u0438\u0437\u043e\u0434\u044b", + "OptionEpisodes": "\u0422\u0412-\u044d\u043f\u0438\u0437\u043e\u0434\u044b", "OptionOtherVideos": "\u0414\u0440\u0443\u0433\u0438\u0435 \u0432\u0438\u0434\u0435\u043e", "TitleMetadata": "\u041c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435", "LabelAutomaticUpdates": "\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f", @@ -412,7 +417,7 @@ "HeaderActiveRecordings": "\u0410\u043a\u0442\u0438\u0432\u043d\u044b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438", "HeaderLatestRecordings": "\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u0437\u0430\u043f\u0438\u0441\u0438", "HeaderAllRecordings": "\u0412\u0441\u0435 \u0437\u0430\u043f\u0438\u0441\u0438", - "ButtonPlay": "\u0412\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0441\u0442\u0438", + "ButtonPlay": "\u0412\u043e\u0441\u043f\u0440.", "ButtonEdit": "\u041f\u0440\u0430\u0432\u0438\u0442\u044c", "ButtonRecord": "\u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c", "ButtonDelete": "\u0423\u0434\u0430\u043b\u0438\u0442\u044c", @@ -581,8 +586,6 @@ "LabelSkipped": "\u041e\u0442\u043b\u043e\u0436\u0435\u043d\u043e", "HeaderEpisodeOrganization": "\u0420\u0435\u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u044f \u044d\u043f\u0438\u0437\u043e\u0434\u0430", "LabelSeries": "\u0421\u0435\u0440\u0438\u0430\u043b:", - "LabelSeasonNumber": "\u041d\u043e\u043c\u0435\u0440 \u0441\u0435\u0437\u043e\u043d\u0430:", - "LabelEpisodeNumber": "\u041d\u043e\u043c\u0435\u0440 \u044d\u043f\u0438\u0437\u043e\u0434\u0430:", "LabelEndingEpisodeNumber": "\u041d\u043e\u043c\u0435\u0440 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u044d\u043f\u0438\u0437\u043e\u0434\u0430:", "LabelEndingEpisodeNumberHelp": "\u0422\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0444\u0430\u0439\u043b\u043e\u0432, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0445 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u044d\u043f\u0438\u0437\u043e\u0434\u043e\u0432", "HeaderSupportTheTeam": "\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0442\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u0443 Emby", @@ -646,7 +649,7 @@ "LabelSupporterEmailAddress": "\u0410\u0434\u0440\u0435\u0441 \u042d-\u043f\u043e\u0447\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u044b\u043b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d \u0434\u043b\u044f \u043f\u0440\u0438\u043e\u0431\u0440\u0435\u0442\u0435\u043d\u0438\u044f \u043a\u043b\u044e\u0447\u0430.", "ButtonRetrieveKey": "\u0412\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043a\u043b\u044e\u0447", "LabelSupporterKey": "\u041a\u043b\u044e\u0447 \u0441\u043f\u043e\u043d\u0441\u043e\u0440\u0430 (\u0432\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0438\u0437 \u043f\u0438\u0441\u044c\u043c\u0430 \u043f\u043e \u042d-\u043f\u043e\u0447\u0442\u0435)", - "LabelSupporterKeyHelp": "\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u043a\u043b\u044e\u0447 \u0441\u043f\u043e\u043d\u0441\u043e\u0440\u0430, \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0447\u0430\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c\u0438 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u044b\u043b\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u044b \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u043e\u043c \u0434\u043b\u044f Emby.", + "LabelSupporterKeyHelp": "\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u043a\u043b\u044e\u0447 \u0441\u043f\u043e\u043d\u0441\u043e\u0440\u0430, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u043e\u043c \u0434\u043b\u044f Emby.", "MessageInvalidKey": "\u041a\u043b\u044e\u0447 \u0441\u043f\u043e\u043d\u0441\u043e\u0440\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0438\u043b\u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0435\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c.", "ErrorMessageInvalidKey": "\u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043b\u044e\u0431\u043e\u0435 \u043f\u0440\u0435\u043c\u0438\u0443\u043c \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435, \u0432\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0442\u0430\u043a\u0436\u0435 \u0441\u043f\u043e\u043d\u0441\u043e\u0440\u043e\u043c Emby. \u0421\u0434\u0435\u043b\u0430\u0439\u0442\u0435 \u043f\u043e\u0436\u0435\u0440\u0442\u0432\u043e\u0432\u0430\u043d\u0438\u0435 \u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0442\u0435 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0443\u044e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u043e\u0441\u043d\u043e\u0432\u043e\u043f\u043e\u043b\u0430\u0433\u0430\u044e\u0449\u0435\u0433\u043e \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0430.", "HeaderDisplaySettings": "\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f", @@ -870,6 +873,7 @@ "HeaderTypeText": "\u0412\u0432\u043e\u0434 \u0442\u0435\u043a\u0441\u0442\u0430", "LabelTypeText": "\u0422\u0435\u043a\u0441\u0442", "HeaderSearchForSubtitles": "\u041f\u043e\u0438\u0441\u043a \u0441\u0443\u0431\u0442\u0438\u0442\u0440\u043e\u0432", + "ButtonMore": "\u0415\u0449\u0451", "MessageNoSubtitleSearchResultsFound": "\u041d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u043f\u0440\u0438 \u043f\u043e\u0438\u0441\u043a\u0435.", "TabDisplay": "\u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435", "TabLanguages": "\u042f\u0437\u044b\u043a\u0438", @@ -884,7 +888,7 @@ "OptionYes": "\u0414\u0430", "OptionNo": "\u041d\u0435\u0442", "HeaderOptions": "\u0412\u0430\u0440\u0438\u0430\u043d\u0442\u044b", - "HeaderIdentificationResult": "\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0440\u0430\u0441\u043f\u043e\u0437\u0430\u043d\u0438\u044f", + "HeaderIdentificationResult": "\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u043d\u0438\u044f", "LabelHomePageSection1": "\u0413\u043b\u0430\u0432\u043d\u0430\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 - \u0440\u0430\u0437\u0434\u0435\u043b 1:", "LabelHomePageSection2": "\u0413\u043b\u0430\u0432\u043d\u0430\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 - \u0440\u0430\u0437\u0434\u0435\u043b 2:", "LabelHomePageSection3": "\u0413\u043b\u0430\u0432\u043d\u0430\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 - \u0440\u0430\u0437\u0434\u0435\u043b 3:", @@ -900,7 +904,7 @@ "HeaderLiveTv": "\u0422\u0412-\u044d\u0444\u0438\u0440", "HeaderReports": "\u041e\u0442\u0447\u0451\u0442\u044b", "HeaderMetadataManager": "\u0414\u0438\u0441\u043f\u0435\u0442\u0447\u0435\u0440 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445", - "HeaderPreferences": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438", + "HeaderSettings": "\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b", "MessageLoadingChannels": "\u0417\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442\u0441\u044f \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 \u043a\u0430\u043d\u0430\u043b\u0430...", "MessageLoadingContent": "\u0417\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442\u0441\u044f \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435...", "ButtonMarkRead": "\u041e\u0442\u043c\u0435\u0442\u0438\u0442\u044c \u043a\u0430\u043a \u043f\u0440\u043e\u0447\u0442\u0451\u043d\u043d\u043e\u0435", @@ -910,7 +914,7 @@ "PlaceholderUsername": "\u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f", "HeaderBecomeProjectSupporter": "\u0421\u0442\u0430\u043d\u044c\u0442\u0435 \u0441\u043f\u043e\u043d\u0441\u043e\u0440\u043e\u043c Emby", "MessageNoMovieSuggestionsAvailable": "\u0412 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u043d\u0435 \u0438\u043c\u0435\u0435\u0442\u0441\u044f \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u043c\u044b\u0445 \u0444\u0438\u043b\u044c\u043c\u043e\u0432. \u041d\u0430\u0447\u043d\u0438\u0442\u0435 \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0438 \u043e\u0446\u0435\u043d\u0438\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0438 \u0444\u0438\u043b\u044c\u043c\u044b, \u0438 \u0442\u043e\u0433\u0434\u0430 \u0432\u0435\u0440\u043d\u0438\u0442\u0435\u0441\u044c \u043d\u0430\u0437\u0430\u0434, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0430\u0446\u0438\u0438.", - "MessageNoCollectionsAvailable": "\u041a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0438\u043d\u0434\u0438\u0432\u0438\u0434\u0443\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c\u0438 \u0441\u043e\u0431\u0440\u0430\u043d\u0438\u044f\u043c\u0438 \u0444\u0438\u043b\u044c\u043c\u043e\u0432, \u0441\u0435\u0440\u0438\u0430\u043b\u043e\u0432, \u0430\u043b\u044c\u0431\u043e\u043c\u043e\u0432, \u043a\u043d\u0438\u0433 \u0438 \u0438\u0433\u0440. \u041d\u0430\u0436\u043c\u0438\u0442\u0435 \u043a\u043d\u043e\u043f\u043a\u0443 \"+\", \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u0442\u044c \u043a \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044e \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0439.", + "MessageNoCollectionsAvailable": "\u041a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043e\u0431\u043e\u0441\u043e\u0431\u043b\u0435\u043d\u043d\u044b\u0435 \u0441\u043e\u0431\u0440\u0430\u043d\u0438\u044f \u0444\u0438\u043b\u044c\u043c\u043e\u0432, \u0441\u0435\u0440\u0438\u0430\u043b\u043e\u0432, \u0430\u043b\u044c\u0431\u043e\u043c\u043e\u0432, \u043a\u043d\u0438\u0433 \u0438 \u0438\u0433\u0440. \u041d\u0430\u0436\u043c\u0438\u0442\u0435 \u043a\u043d\u043e\u043f\u043a\u0443 \"+\", \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u0442\u044c \u043a \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044e \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0439.", "MessageNoPlaylistsAvailable": "\u0421\u043f\u0438\u0441\u043a\u0438 \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0441\u043f\u0438\u0441\u043a\u043e\u0432 \u0438\u0437 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u044f, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0441\u0442\u0438 \u0440\u0430\u0437\u043e\u043c. \u0427\u0442\u043e\u0431\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0432\u043e \u0441\u043f\u0438\u0441\u043a\u0438, \u0449\u0435\u043b\u043a\u043d\u0438\u0442\u0435 \u043f\u0440\u0430\u0432\u043e\u0439 \u043a\u043d\u043e\u043f\u043a\u043e\u0439 \u043c\u044b\u0448\u0438 \u0438\u043b\u0438 \u043a\u043e\u0441\u043d\u0438\u0442\u0435\u0441\u044c \u0438 \u0443\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0439\u0442\u0435, \u0437\u0430\u0442\u0435\u043c \u0432\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u00ab\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432\u043e \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f\u00bb.", "MessageNoPlaylistItemsAvailable": "\u0414\u0430\u043d\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0432 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u043f\u0443\u0441\u0442.", "ButtonDismiss": "\u041f\u0440\u0435\u043a\u0440\u0430\u0442\u0438\u0442\u044c", @@ -1098,7 +1102,6 @@ "OptionReportArtists": "\u0418\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u0438", "OptionReportAlbums": "\u0410\u043b\u044c\u0431\u043e\u043c\u044b", "OptionReportAdultVideos": "\u0412\u0437\u0440\u043e\u0441\u043b\u044b\u0435 \u0432\u0438\u0434\u0435\u043e", - "ButtonMore": "\u0415\u0449\u0451...", "HeaderActivity": "\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f", "ScheduledTaskStartedWithName": "{0} - \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u0430", "ScheduledTaskCancelledWithName": "{0} - \u0431\u044b\u043b\u0430 \u043e\u0442\u043c\u0435\u043d\u0435\u043d\u0430", @@ -1360,7 +1363,7 @@ "HeaderShareMediaFolders": "\u041e\u0431\u0449\u0438\u0439 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u043c\u0435\u0434\u0438\u0430\u043f\u0430\u043f\u043a\u0430\u043c", "MessageGuestSharingPermissionsHelp": "\u041c\u043d\u043e\u0433\u0438\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0434\u043b\u044f \u0433\u043e\u0441\u0442\u0435\u0439, \u043d\u043e \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u044b \u043f\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438.", "HeaderInvitations": "\u041f\u0440\u0438\u0433\u043b\u0430\u0448\u0435\u043d\u0438\u044f", - "LabelForgotPasswordUsernameHelp": "\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0438\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f, \u0435\u0441\u043b\u0438 \u0432\u044b \u043f\u043e\u043c\u043d\u0438\u0442\u0435.", + "LabelForgotPasswordUsernameHelp": "\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0438\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f, \u0435\u0441\u043b\u0438 \u043f\u043e\u043c\u043d\u0438\u0442\u0435 \u0435\u0433\u043e.", "HeaderForgotPassword": "\u0417\u0430\u0431\u044b\u043b\u0438 \u043f\u0430\u0440\u043e\u043b\u044c?", "TitleForgotPassword": "\u0417\u0430\u0431\u044b\u043b\u0438 \u043f\u0430\u0440\u043e\u043b\u044c?", "TitlePasswordReset": "\u0421\u0431\u0440\u043e\u0441 \u043f\u0430\u0440\u043e\u043b\u044f", @@ -1411,7 +1414,6 @@ "OptionEnableFullSpeedConversion": "\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043f\u043e\u043b\u043d\u043e\u0441\u043a\u043e\u0440\u043e\u0441\u0442\u043d\u043e\u0435 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435", "OptionEnableFullSpeedConversionHelp": "\u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e, \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0435 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u043d\u0438\u0437\u043a\u043e\u0439 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438, \u0447\u0442\u043e\u0431\u044b \u043c\u0438\u043d\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432.", "HeaderPlaylists": "\u0421\u043f\u0438\u0441\u043a\u0438 \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f", - "HeaderSelectDate": "\u0412\u044b\u0431\u043e\u0440 \u0434\u0430\u0442\u044b", "HeaderViewStyles": "\u0421\u0442\u0438\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043c\u0435\u0434\u0438\u0430\u043f\u0430\u043f\u043e\u043a", "LabelSelectViewStyles": "\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u043d\u044b\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0434\u043b\u044f:", "LabelSelectViewStylesHelp": "\u041f\u0440\u0438 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438, \u043c\u0435\u0434\u0438\u0430\u043f\u0430\u043f\u043a\u0438 \u0431\u0443\u0434\u0443\u0442 \u0441\u0442\u0438\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u044b \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u043c\u0438, \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u043c\u0438 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u041f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u043c\u043e\u0435, \u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435, \u0416\u0430\u043d\u0440\u044b \u0438 \u0442.\u0434. \u041f\u0440\u0438 \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438, \u043e\u043d\u0438 \u0431\u0443\u0434\u0443\u0442 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u044b \u043f\u0440\u043e\u0441\u0442\u044b\u043c\u0438 \u043f\u0430\u043f\u043a\u0430\u043c\u0438.", @@ -1437,7 +1439,16 @@ "ButtonReset": "\u0421\u0431\u0440\u043e\u0441\u0438\u0442\u044c", "OptionEnableExternalVideoPlayers": "\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0432\u043d\u0435\u0448\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0433\u0440\u044b\u0432\u0430\u0442\u0435\u043b\u0438 \u0432\u0438\u0434\u0435\u043e", "ButtonUnlockGuide": "\u0420\u0430\u0437\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0433\u0438\u0434", - "LabelEnableFullScreen": "Enable fullscreen mode", - "LabelEnableChromecastAc3Passthrough": "Enable Chromecast AC3 Passthrough", - "LabelSyncPath": "Synced content path:" + "LabelEnableFullScreen": "\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0440\u0435\u0436\u0438\u043c \u043f\u043e\u043b\u043d\u043e\u0433\u043e \u044d\u043a\u0440\u0430\u043d\u0430", + "LabelEnableChromecastAc3Passthrough": "\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043f\u0440\u043e\u0445\u043e\u0434\u043d\u043e\u0439 AC3 \u043d\u0430 Chromecast", + "LabelSyncPath": "\u041f\u0443\u0442\u044c \u043a \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c\u0443 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u044e:", + "LabelEmail": "\u042d-\u043f\u043e\u0447\u0442\u0430:", + "LabelUsername": "\u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f:", + "HeaderSignUp": "\u0420\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0430\u0446\u0438\u044f", + "LabelPasswordConfirm": "\u041f\u0430\u0440\u043e\u043b\u044c (\u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435):", + "ButtonAddServer": "\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u0435\u0440\u0432\u0435\u0440", + "TabHomeScreen": "\u0413\u043b\u0430\u0432\u043d\u044b\u0439 \u044d\u043a\u0440\u0430\u043d", + "HeaderDisplay": "\u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435", + "HeaderNavigation": "\u041d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u044f", + "LegendTheseSettingsShared": "\u0414\u0430\u043d\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u043d\u043e \u043d\u0430 \u0432\u0441\u0435\u0445 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\u0445" }
\ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/Server/server.json b/MediaBrowser.Server.Implementations/Localization/Server/server.json index 300b82525..55e754085 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/server.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/server.json @@ -313,6 +313,9 @@ "OptionAllowRemoteControlOthers": "Allow remote control of other users", "OptionAllowRemoteSharedDevices": "Allow remote control of shared devices", "OptionAllowRemoteSharedDevicesHelp": "Dlna devices are considered shared until a user begins controlling it.", + "OptionAllowLinkSharing": "Allow social media sharing", + "OptionAllowLinkSharingHelp": "Only web pages containing media information are shared. Media files are never shared publicly. Shares are time-limited and will expire based on your server sharing settings.", + "HeaderSharing": "Sharing", "HeaderRemoteControl": "Remote Control", "OptionMissingTmdbId": "Missing Tmdb Id", "OptionIsHD": "HD", @@ -909,7 +912,7 @@ "HeaderLiveTv": "Live TV", "HeaderReports": "Reports", "HeaderMetadataManager": "Metadata Manager", - "HeaderPreferences": "Preferences", + "HeaderSettings": "Settings", "MessageLoadingChannels": "Loading channel content...", "MessageLoadingContent": "Loading content...", "ButtonMarkRead": "Mark Read", @@ -1408,7 +1411,7 @@ "HeaderUpcomingMovies": "Upcoming Movies", "HeaderUpcomingSports": "Upcoming Sports", "HeaderUpcomingPrograms": "Upcoming Programs", - "ButtonMoreItems": "More...", + "ButtonMoreItems": "More", "LabelShowLibraryTileNames": "Show library tile names", "LabelShowLibraryTileNamesHelp": "Determines if labels will be displayed underneath library tiles on the home page", "OptionEnableTranscodingThrottle": "Enable throttling", @@ -1427,7 +1430,6 @@ "OptionEnableFullSpeedConversion": "Enable full speed conversion", "OptionEnableFullSpeedConversionHelp": "By default, sync conversion is performed at a low speed to minimize resource consumption.", "HeaderPlaylists": "Playlists", - "HeaderSelectDate": "Select Date", "HeaderViewStyles": "View Styles", "LabelSelectViewStyles": "Enable enhanced presentations for:", "LabelSelectViewStylesHelp": "If enabled, views will be built with metadata to offer categories such as Suggestions, Latest, Genres, and more. If disabled, they'll be displayed with simple folders.", @@ -1459,5 +1461,10 @@ "LabelEmail": "Email:", "LabelUsername": "Username:", "HeaderSignUp": "Sign Up", - "LabelPasswordConfirm": "Password (confirm):" + "LabelPasswordConfirm": "Password (confirm):", + "ButtonAddServer": "Add Server", + "TabHomeScreen": "Home Screen", + "HeaderDisplay": "Display", + "HeaderNavigation": "Navigation", + "LegendTheseSettingsShared": "These settings are shared on all devices" } diff --git a/MediaBrowser.Server.Implementations/Localization/Server/sl-SI.json b/MediaBrowser.Server.Implementations/Localization/Server/sl-SI.json index 1c9f65feb..d37510905 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/sl-SI.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/sl-SI.json @@ -13,6 +13,7 @@ "LabelShowLogWindow": "Show Log Window", "LabelPrevious": "Previous", "LabelFinish": "Finish", + "FolderTypeMixed": "Mixed content", "LabelNext": "Next", "LabelYoureDone": "You're Done!", "WelcomeToProject": "Welcome to Emby!", @@ -90,7 +91,6 @@ "LabelEnableEnhancedMovies": "Enable enhanced movie displays", "LabelEnableEnhancedMoviesHelp": "When enabled, movies will be displayed as folders to include trailers, extras, cast & crew, and other related content.", "HeaderSyncJobInfo": "Sync Job", - "FolderTypeMixed": "Mixed content", "FolderTypeMovies": "Movies", "FolderTypeMusic": "Music", "FolderTypeAdultVideos": "Adult videos", @@ -287,7 +287,9 @@ "OptionFileMetadataYearMismatch": "File\/Metadata Years Mismatched", "TabGeneral": "General", "TitleSupport": "Support", + "LabelSeasonNumber": "Season number", "TabLog": "Log", + "LabelEpisodeNumber": "Episode number", "TabAbout": "About", "TabSupporterKey": "Supporter Key", "TabBecomeSupporter": "Become a Supporter", @@ -313,6 +315,9 @@ "OptionAllowRemoteControlOthers": "Allow remote control of other users", "OptionAllowRemoteSharedDevices": "Allow remote control of shared devices", "OptionAllowRemoteSharedDevicesHelp": "Dlna devices are considered shared until a user begins controlling it.", + "OptionAllowLinkSharing": "Allow social media sharing", + "OptionAllowLinkSharingHelp": "Only web pages containing media information are shared. Media files are never shared publicly. Shares are time-limited and will expire based on your server sharing settings.", + "HeaderSharing": "Sharing", "HeaderRemoteControl": "Remote Control", "OptionMissingTmdbId": "Missing Tmdb Id", "OptionIsHD": "HD", @@ -581,8 +586,6 @@ "LabelSkipped": "Skipped", "HeaderEpisodeOrganization": "Episode Organization", "LabelSeries": "Series:", - "LabelSeasonNumber": "Season number:", - "LabelEpisodeNumber": "Episode number:", "LabelEndingEpisodeNumber": "Ending episode number:", "LabelEndingEpisodeNumberHelp": "Only required for multi-episode files", "HeaderSupportTheTeam": "Support the Emby Team", @@ -870,6 +873,7 @@ "HeaderTypeText": "Enter Text", "LabelTypeText": "Text", "HeaderSearchForSubtitles": "Search for Subtitles", + "ButtonMore": "More", "MessageNoSubtitleSearchResultsFound": "No search results founds.", "TabDisplay": "Display", "TabLanguages": "Languages", @@ -900,7 +904,7 @@ "HeaderLiveTv": "Live TV", "HeaderReports": "Reports", "HeaderMetadataManager": "Metadata Manager", - "HeaderPreferences": "Preferences", + "HeaderSettings": "Nastavitve", "MessageLoadingChannels": "Loading channel content...", "MessageLoadingContent": "Loading content...", "ButtonMarkRead": "Mark Read", @@ -1098,7 +1102,6 @@ "OptionReportArtists": "Artists", "OptionReportAlbums": "Albums", "OptionReportAdultVideos": "Adult videos", - "ButtonMore": "More", "HeaderActivity": "Activity", "ScheduledTaskStartedWithName": "{0} started", "ScheduledTaskCancelledWithName": "{0} was cancelled", @@ -1392,7 +1395,7 @@ "HeaderUpcomingMovies": "Upcoming Movies", "HeaderUpcomingSports": "Upcoming Sports", "HeaderUpcomingPrograms": "Upcoming Programs", - "ButtonMoreItems": "More...", + "ButtonMoreItems": "More", "LabelShowLibraryTileNames": "Show library tile names", "LabelShowLibraryTileNamesHelp": "Determines if labels will be displayed underneath library tiles on the home page", "OptionEnableTranscodingThrottle": "Enable throttling", @@ -1411,7 +1414,6 @@ "OptionEnableFullSpeedConversion": "Enable full speed conversion", "OptionEnableFullSpeedConversionHelp": "By default, sync conversion is performed at a low speed to minimize resource consumption.", "HeaderPlaylists": "Playlists", - "HeaderSelectDate": "Select Date", "HeaderViewStyles": "View Styles", "LabelSelectViewStyles": "Enable enhanced presentations for:", "LabelSelectViewStylesHelp": "If enabled, views will be built with metadata to offer categories such as Suggestions, Latest, Genres, and more. If disabled, they'll be displayed with simple folders.", @@ -1439,5 +1441,14 @@ "ButtonUnlockGuide": "Unlock Guide", "LabelEnableFullScreen": "Enable fullscreen mode", "LabelEnableChromecastAc3Passthrough": "Enable Chromecast AC3 Passthrough", - "LabelSyncPath": "Synced content path:" + "LabelSyncPath": "Synced content path:", + "LabelEmail": "Email:", + "LabelUsername": "Username:", + "HeaderSignUp": "Sign Up", + "LabelPasswordConfirm": "Password (confirm):", + "ButtonAddServer": "Add Server", + "TabHomeScreen": "Home Screen", + "HeaderDisplay": "Display", + "HeaderNavigation": "Navigation", + "LegendTheseSettingsShared": "These settings are shared on all devices" }
\ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/Server/sv.json b/MediaBrowser.Server.Implementations/Localization/Server/sv.json index cea348732..cadf66340 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/sv.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/sv.json @@ -13,6 +13,7 @@ "LabelShowLogWindow": "Visa loggf\u00f6nstret", "LabelPrevious": "F\u00f6reg\u00e5ende", "LabelFinish": "Klart", + "FolderTypeMixed": "Mixed content", "LabelNext": "N\u00e4sta", "LabelYoureDone": "Klart!", "WelcomeToProject": "Welcome to Emby!", @@ -85,12 +86,11 @@ "ButtonDonateWithPayPal": "Donate with PayPal", "OptionDetectArchiveFilesAsMedia": "Identifiera arkivfiler som media", "OptionDetectArchiveFilesAsMediaHelp": "Om aktiverad, kommer filer med .rar och .zip f\u00f6rl\u00e4ngningar att uppt\u00e4ckas som mediefiler.", - "LabelEnterConnectUserName": "Anv\u00e4ndarnamn eller email:", + "LabelEnterConnectUserName": "Username or email:", "LabelEnterConnectUserNameHelp": "This is your Emby online account username or password.", "LabelEnableEnhancedMovies": "Enable enhanced movie displays", "LabelEnableEnhancedMoviesHelp": "When enabled, movies will be displayed as folders to include trailers, extras, cast & crew, and other related content.", "HeaderSyncJobInfo": "Synk jobb", - "FolderTypeMixed": "Blandat inneh\u00e5ll", "FolderTypeMovies": "Filmer", "FolderTypeMusic": "Musik", "FolderTypeAdultVideos": "Inneh\u00e5ll f\u00f6r vuxna", @@ -287,7 +287,9 @@ "OptionFileMetadataYearMismatch": "Fildatum\/metadatadatum \u00f6verensst\u00e4mmer ej", "TabGeneral": "Allm\u00e4nt", "TitleSupport": "Support", + "LabelSeasonNumber": "Season number", "TabLog": "H\u00e4ndelselogg", + "LabelEpisodeNumber": "Episode number", "TabAbout": "Om", "TabSupporterKey": "Donationskod", "TabBecomeSupporter": "Bidra med en donation", @@ -313,6 +315,9 @@ "OptionAllowRemoteControlOthers": "Till\u00e5t fj\u00e4rrstyrning av andra anv\u00e4ndare", "OptionAllowRemoteSharedDevices": "Till\u00e5t fj\u00e4rrstyrning av delade enheter", "OptionAllowRemoteSharedDevicesHelp": "DLNA-enheter betraktas som delade tills en anv\u00e4ndare b\u00f6rjar kontrollera den.", + "OptionAllowLinkSharing": "Allow social media sharing", + "OptionAllowLinkSharingHelp": "Only web pages containing media information are shared. Media files are never shared publicly. Shares are time-limited and will expire based on your server sharing settings.", + "HeaderSharing": "Sharing", "HeaderRemoteControl": "Fj\u00e4rrkontroll", "OptionMissingTmdbId": "TMDB-ID saknas", "OptionIsHD": "HD", @@ -581,8 +586,6 @@ "LabelSkipped": "Hoppades \u00f6ver", "HeaderEpisodeOrganization": "Katalogisering av avsnitt", "LabelSeries": "Serie:", - "LabelSeasonNumber": "Season number:", - "LabelEpisodeNumber": "Episode number:", "LabelEndingEpisodeNumber": "Ending episode number:", "LabelEndingEpisodeNumberHelp": "Kr\u00e4vs endast f\u00f6r filer som inneh\u00e5ller flera avsnitt", "HeaderSupportTheTeam": "Support the Emby Team", @@ -870,6 +873,7 @@ "HeaderTypeText": "Ange text", "LabelTypeText": "Text", "HeaderSearchForSubtitles": "S\u00f6k efter undertexter", + "ButtonMore": "More", "MessageNoSubtitleSearchResultsFound": "S\u00f6kningen gav inga resultat.", "TabDisplay": "Visning", "TabLanguages": "Spr\u00e5k", @@ -900,7 +904,7 @@ "HeaderLiveTv": "Live-TV", "HeaderReports": "Rapporter", "HeaderMetadataManager": "Metadatahanteraren", - "HeaderPreferences": "Inst\u00e4llningar", + "HeaderSettings": "Settings", "MessageLoadingChannels": "H\u00e4mtar kanalinneh\u00e5ll...", "MessageLoadingContent": "H\u00e4mtar inneh\u00e5ll...", "ButtonMarkRead": "Markera som l\u00e4st", @@ -1098,7 +1102,6 @@ "OptionReportArtists": "Artister", "OptionReportAlbums": "Album", "OptionReportAdultVideos": "Vuxen videos", - "ButtonMore": "Mer", "HeaderActivity": "Aktivitet", "ScheduledTaskStartedWithName": "{0} startad", "ScheduledTaskCancelledWithName": "{0} avbr\u00f6ts", @@ -1392,7 +1395,7 @@ "HeaderUpcomingMovies": "Upcoming Movies", "HeaderUpcomingSports": "Upcoming Sports", "HeaderUpcomingPrograms": "Upcoming Programs", - "ButtonMoreItems": "Mer...", + "ButtonMoreItems": "More", "LabelShowLibraryTileNames": "Show library tile names", "LabelShowLibraryTileNamesHelp": "Determines if labels will be displayed underneath library tiles on the home page", "OptionEnableTranscodingThrottle": "Enable throttling", @@ -1411,7 +1414,6 @@ "OptionEnableFullSpeedConversion": "Enable full speed conversion", "OptionEnableFullSpeedConversionHelp": "By default, sync conversion is performed at a low speed to minimize resource consumption.", "HeaderPlaylists": "Playlists", - "HeaderSelectDate": "Select Date", "HeaderViewStyles": "View Styles", "LabelSelectViewStyles": "Enable enhanced presentations for:", "LabelSelectViewStylesHelp": "If enabled, views will be built with metadata to offer categories such as Suggestions, Latest, Genres, and more. If disabled, they'll be displayed with simple folders.", @@ -1439,5 +1441,14 @@ "ButtonUnlockGuide": "Unlock Guide", "LabelEnableFullScreen": "Enable fullscreen mode", "LabelEnableChromecastAc3Passthrough": "Enable Chromecast AC3 Passthrough", - "LabelSyncPath": "Synced content path:" + "LabelSyncPath": "Synced content path:", + "LabelEmail": "Email:", + "LabelUsername": "Username:", + "HeaderSignUp": "Sign Up", + "LabelPasswordConfirm": "Password (confirm):", + "ButtonAddServer": "Add Server", + "TabHomeScreen": "Home Screen", + "HeaderDisplay": "Display", + "HeaderNavigation": "Navigation", + "LegendTheseSettingsShared": "These settings are shared on all devices" }
\ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/Server/tr.json b/MediaBrowser.Server.Implementations/Localization/Server/tr.json index 8c8ff372c..89ecbf6ca 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/tr.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/tr.json @@ -13,6 +13,7 @@ "LabelShowLogWindow": "Log Ekran\u0131n\u0131 G\u00f6r\u00fcnt\u00fcle", "LabelPrevious": "\u00d6nceki", "LabelFinish": "Bitir", + "FolderTypeMixed": "Mixed content", "LabelNext": "Sonraki", "LabelYoureDone": "Haz\u0131rs\u0131n!", "WelcomeToProject": "Welcome to Emby!", @@ -90,7 +91,6 @@ "LabelEnableEnhancedMovies": "Enable enhanced movie displays", "LabelEnableEnhancedMoviesHelp": "When enabled, movies will be displayed as folders to include trailers, extras, cast & crew, and other related content.", "HeaderSyncJobInfo": "Sync Job", - "FolderTypeMixed": "Mixed content", "FolderTypeMovies": "Movies", "FolderTypeMusic": "Music", "FolderTypeAdultVideos": "Adult videos", @@ -287,7 +287,9 @@ "OptionFileMetadataYearMismatch": "File\/Metadata Years Mismatched", "TabGeneral": "Genel", "TitleSupport": "Destek", + "LabelSeasonNumber": "Season number", "TabLog": "Kay\u0131t", + "LabelEpisodeNumber": "Episode number", "TabAbout": "Hakk\u0131nda", "TabSupporterKey": "Destek\u00e7i kodu", "TabBecomeSupporter": "Destek\u00e7i ol", @@ -313,6 +315,9 @@ "OptionAllowRemoteControlOthers": "Allow remote control of other users", "OptionAllowRemoteSharedDevices": "Allow remote control of shared devices", "OptionAllowRemoteSharedDevicesHelp": "Dlna devices are considered shared until a user begins controlling it.", + "OptionAllowLinkSharing": "Allow social media sharing", + "OptionAllowLinkSharingHelp": "Only web pages containing media information are shared. Media files are never shared publicly. Shares are time-limited and will expire based on your server sharing settings.", + "HeaderSharing": "Sharing", "HeaderRemoteControl": "Remote Control", "OptionMissingTmdbId": "Missing Tmdb Id", "OptionIsHD": "HD", @@ -581,8 +586,6 @@ "LabelSkipped": "Skipped", "HeaderEpisodeOrganization": "Episode Organization", "LabelSeries": "Series:", - "LabelSeasonNumber": "Season number:", - "LabelEpisodeNumber": "Episode number:", "LabelEndingEpisodeNumber": "Ending episode number:", "LabelEndingEpisodeNumberHelp": "Only required for multi-episode files", "HeaderSupportTheTeam": "Support the Emby Team", @@ -870,6 +873,7 @@ "HeaderTypeText": "Enter Text", "LabelTypeText": "Text", "HeaderSearchForSubtitles": "Search for Subtitles", + "ButtonMore": "More", "MessageNoSubtitleSearchResultsFound": "No search results founds.", "TabDisplay": "Display", "TabLanguages": "Languages", @@ -900,7 +904,7 @@ "HeaderLiveTv": "Live TV", "HeaderReports": "Reports", "HeaderMetadataManager": "Metadata Manager", - "HeaderPreferences": "Preferences", + "HeaderSettings": "Settings", "MessageLoadingChannels": "Loading channel content...", "MessageLoadingContent": "Loading content...", "ButtonMarkRead": "Mark Read", @@ -1098,7 +1102,6 @@ "OptionReportArtists": "Artists", "OptionReportAlbums": "Albums", "OptionReportAdultVideos": "Adult videos", - "ButtonMore": "More", "HeaderActivity": "Activity", "ScheduledTaskStartedWithName": "{0} started", "ScheduledTaskCancelledWithName": "{0} was cancelled", @@ -1392,7 +1395,7 @@ "HeaderUpcomingMovies": "Upcoming Movies", "HeaderUpcomingSports": "Upcoming Sports", "HeaderUpcomingPrograms": "Upcoming Programs", - "ButtonMoreItems": "More...", + "ButtonMoreItems": "More", "LabelShowLibraryTileNames": "Show library tile names", "LabelShowLibraryTileNamesHelp": "Determines if labels will be displayed underneath library tiles on the home page", "OptionEnableTranscodingThrottle": "Enable throttling", @@ -1411,7 +1414,6 @@ "OptionEnableFullSpeedConversion": "Enable full speed conversion", "OptionEnableFullSpeedConversionHelp": "By default, sync conversion is performed at a low speed to minimize resource consumption.", "HeaderPlaylists": "Playlists", - "HeaderSelectDate": "Select Date", "HeaderViewStyles": "View Styles", "LabelSelectViewStyles": "Enable enhanced presentations for:", "LabelSelectViewStylesHelp": "If enabled, views will be built with metadata to offer categories such as Suggestions, Latest, Genres, and more. If disabled, they'll be displayed with simple folders.", @@ -1439,5 +1441,14 @@ "ButtonUnlockGuide": "Unlock Guide", "LabelEnableFullScreen": "Enable fullscreen mode", "LabelEnableChromecastAc3Passthrough": "Enable Chromecast AC3 Passthrough", - "LabelSyncPath": "Synced content path:" + "LabelSyncPath": "Synced content path:", + "LabelEmail": "Email:", + "LabelUsername": "Username:", + "HeaderSignUp": "Sign Up", + "LabelPasswordConfirm": "Password (confirm):", + "ButtonAddServer": "Add Server", + "TabHomeScreen": "Home Screen", + "HeaderDisplay": "Display", + "HeaderNavigation": "Navigation", + "LegendTheseSettingsShared": "These settings are shared on all devices" }
\ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/Server/uk.json b/MediaBrowser.Server.Implementations/Localization/Server/uk.json index e601f076d..5308d88c5 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/uk.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/uk.json @@ -13,6 +13,7 @@ "LabelShowLogWindow": "Show Log Window", "LabelPrevious": "\u041d\u0430\u0437\u0430\u0434", "LabelFinish": "Finish", + "FolderTypeMixed": "Mixed content", "LabelNext": "\u0412\u043f\u0435\u0440\u0435\u0434", "LabelYoureDone": "You're Done!", "WelcomeToProject": "Welcome to Emby!", @@ -85,12 +86,11 @@ "ButtonDonateWithPayPal": "Donate with PayPal", "OptionDetectArchiveFilesAsMedia": "Detect archive files as media", "OptionDetectArchiveFilesAsMediaHelp": "If enabled, files with .rar and .zip extensions will be detected as media files.", - "LabelEnterConnectUserName": "\u0406\u043c\u2019\u044f \u043a\u043e\u0440\u0438\u0441\u0442\u0443\u0432\u0430\u0447\u0430 \u0430\u0431\u043e email:", + "LabelEnterConnectUserName": "Username or email:", "LabelEnterConnectUserNameHelp": "This is your Emby online account username or password.", "LabelEnableEnhancedMovies": "Enable enhanced movie displays", "LabelEnableEnhancedMoviesHelp": "When enabled, movies will be displayed as folders to include trailers, extras, cast & crew, and other related content.", "HeaderSyncJobInfo": "Sync Job", - "FolderTypeMixed": "Mixed content", "FolderTypeMovies": "\u0424\u0456\u043b\u044c\u043c\u0438", "FolderTypeMusic": "\u041c\u0443\u0437\u0438\u043a\u0430", "FolderTypeAdultVideos": "Adult videos", @@ -287,7 +287,9 @@ "OptionFileMetadataYearMismatch": "File\/Metadata Years Mismatched", "TabGeneral": "General", "TitleSupport": "Support", + "LabelSeasonNumber": "Season number", "TabLog": "Log", + "LabelEpisodeNumber": "Episode number", "TabAbout": "About", "TabSupporterKey": "Supporter Key", "TabBecomeSupporter": "Become a Supporter", @@ -313,6 +315,9 @@ "OptionAllowRemoteControlOthers": "Allow remote control of other users", "OptionAllowRemoteSharedDevices": "Allow remote control of shared devices", "OptionAllowRemoteSharedDevicesHelp": "Dlna devices are considered shared until a user begins controlling it.", + "OptionAllowLinkSharing": "Allow social media sharing", + "OptionAllowLinkSharingHelp": "Only web pages containing media information are shared. Media files are never shared publicly. Shares are time-limited and will expire based on your server sharing settings.", + "HeaderSharing": "Sharing", "HeaderRemoteControl": "Remote Control", "OptionMissingTmdbId": "Missing Tmdb Id", "OptionIsHD": "HD", @@ -581,8 +586,6 @@ "LabelSkipped": "Skipped", "HeaderEpisodeOrganization": "Episode Organization", "LabelSeries": "Series:", - "LabelSeasonNumber": "Season number:", - "LabelEpisodeNumber": "Episode number:", "LabelEndingEpisodeNumber": "Ending episode number:", "LabelEndingEpisodeNumberHelp": "Only required for multi-episode files", "HeaderSupportTheTeam": "Support the Emby Team", @@ -870,6 +873,7 @@ "HeaderTypeText": "Enter Text", "LabelTypeText": "Text", "HeaderSearchForSubtitles": "Search for Subtitles", + "ButtonMore": "More", "MessageNoSubtitleSearchResultsFound": "No search results founds.", "TabDisplay": "Display", "TabLanguages": "Languages", @@ -900,7 +904,7 @@ "HeaderLiveTv": "Live TV", "HeaderReports": "Reports", "HeaderMetadataManager": "Metadata Manager", - "HeaderPreferences": "Preferences", + "HeaderSettings": "\u041d\u0430\u043b\u0430\u0448\u0442\u0443\u0432\u0430\u043d\u043d\u044f", "MessageLoadingChannels": "Loading channel content...", "MessageLoadingContent": "\u0417\u0430\u0432\u0430\u043d\u0442\u0430\u0436\u0435\u043d\u043d\u044f \u0437\u043c\u0456\u0441\u0442\u0443...", "ButtonMarkRead": "Mark Read", @@ -1098,7 +1102,6 @@ "OptionReportArtists": "Artists", "OptionReportAlbums": "Albums", "OptionReportAdultVideos": "Adult videos", - "ButtonMore": "More", "HeaderActivity": "Activity", "ScheduledTaskStartedWithName": "{0} started", "ScheduledTaskCancelledWithName": "{0} was cancelled", @@ -1392,7 +1395,7 @@ "HeaderUpcomingMovies": "Upcoming Movies", "HeaderUpcomingSports": "Upcoming Sports", "HeaderUpcomingPrograms": "Upcoming Programs", - "ButtonMoreItems": "More...", + "ButtonMoreItems": "More", "LabelShowLibraryTileNames": "Show library tile names", "LabelShowLibraryTileNamesHelp": "Determines if labels will be displayed underneath library tiles on the home page", "OptionEnableTranscodingThrottle": "Enable throttling", @@ -1411,7 +1414,6 @@ "OptionEnableFullSpeedConversion": "Enable full speed conversion", "OptionEnableFullSpeedConversionHelp": "By default, sync conversion is performed at a low speed to minimize resource consumption.", "HeaderPlaylists": "Playlists", - "HeaderSelectDate": "Select Date", "HeaderViewStyles": "View Styles", "LabelSelectViewStyles": "Enable enhanced presentations for:", "LabelSelectViewStylesHelp": "If enabled, views will be built with metadata to offer categories such as Suggestions, Latest, Genres, and more. If disabled, they'll be displayed with simple folders.", @@ -1439,5 +1441,14 @@ "ButtonUnlockGuide": "Unlock Guide", "LabelEnableFullScreen": "Enable fullscreen mode", "LabelEnableChromecastAc3Passthrough": "Enable Chromecast AC3 Passthrough", - "LabelSyncPath": "Synced content path:" + "LabelSyncPath": "Synced content path:", + "LabelEmail": "Email:", + "LabelUsername": "Username:", + "HeaderSignUp": "Sign Up", + "LabelPasswordConfirm": "Password (confirm):", + "ButtonAddServer": "Add Server", + "TabHomeScreen": "Home Screen", + "HeaderDisplay": "Display", + "HeaderNavigation": "Navigation", + "LegendTheseSettingsShared": "These settings are shared on all devices" }
\ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/Server/vi.json b/MediaBrowser.Server.Implementations/Localization/Server/vi.json index 3595370aa..5f38e8fc8 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/vi.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/vi.json @@ -13,6 +13,7 @@ "LabelShowLogWindow": "Show Log Window", "LabelPrevious": "Tr\u01b0\u1edbc", "LabelFinish": "K\u1ebft th\u00fac", + "FolderTypeMixed": "Mixed content", "LabelNext": "Ti\u1ebfp theo", "LabelYoureDone": "B\u1ea1n \u0111\u00e3 ho\u00e0n th\u00e0nh!", "WelcomeToProject": "Welcome to Emby!", @@ -90,7 +91,6 @@ "LabelEnableEnhancedMovies": "Enable enhanced movie displays", "LabelEnableEnhancedMoviesHelp": "When enabled, movies will be displayed as folders to include trailers, extras, cast & crew, and other related content.", "HeaderSyncJobInfo": "Sync Job", - "FolderTypeMixed": "Mixed content", "FolderTypeMovies": "Movies", "FolderTypeMusic": "Music", "FolderTypeAdultVideos": "Adult videos", @@ -287,7 +287,9 @@ "OptionFileMetadataYearMismatch": "File\/Metadata Years Mismatched", "TabGeneral": "General", "TitleSupport": "H\u1ed7 tr\u1ee3", + "LabelSeasonNumber": "Season number", "TabLog": "Log", + "LabelEpisodeNumber": "Episode number", "TabAbout": "About", "TabSupporterKey": "Supporter Key", "TabBecomeSupporter": "Become a Supporter", @@ -313,6 +315,9 @@ "OptionAllowRemoteControlOthers": "Allow remote control of other users", "OptionAllowRemoteSharedDevices": "Allow remote control of shared devices", "OptionAllowRemoteSharedDevicesHelp": "Dlna devices are considered shared until a user begins controlling it.", + "OptionAllowLinkSharing": "Allow social media sharing", + "OptionAllowLinkSharingHelp": "Only web pages containing media information are shared. Media files are never shared publicly. Shares are time-limited and will expire based on your server sharing settings.", + "HeaderSharing": "Sharing", "HeaderRemoteControl": "Remote Control", "OptionMissingTmdbId": "Thi\u1ebfu Tmdb ID", "OptionIsHD": "\u0110\u1ed9 n\u00e9t cao", @@ -581,8 +586,6 @@ "LabelSkipped": "B\u1ecf qua", "HeaderEpisodeOrganization": "Episode Organization", "LabelSeries": "Series:", - "LabelSeasonNumber": "Season number:", - "LabelEpisodeNumber": "Episode number:", "LabelEndingEpisodeNumber": "Ending episode number:", "LabelEndingEpisodeNumberHelp": "Only required for multi-episode files", "HeaderSupportTheTeam": "Support the Emby Team", @@ -870,6 +873,7 @@ "HeaderTypeText": "Enter Text", "LabelTypeText": "Text", "HeaderSearchForSubtitles": "Search for Subtitles", + "ButtonMore": "More", "MessageNoSubtitleSearchResultsFound": "No search results founds.", "TabDisplay": "Display", "TabLanguages": "Languages", @@ -900,7 +904,7 @@ "HeaderLiveTv": "Live TV", "HeaderReports": "Reports", "HeaderMetadataManager": "Metadata Manager", - "HeaderPreferences": "Preferences", + "HeaderSettings": "Settings", "MessageLoadingChannels": "Loading channel content...", "MessageLoadingContent": "Loading content...", "ButtonMarkRead": "Mark Read", @@ -1098,7 +1102,6 @@ "OptionReportArtists": "Artists", "OptionReportAlbums": "Albums", "OptionReportAdultVideos": "Adult videos", - "ButtonMore": "More", "HeaderActivity": "Activity", "ScheduledTaskStartedWithName": "{0} started", "ScheduledTaskCancelledWithName": "{0} was cancelled", @@ -1392,7 +1395,7 @@ "HeaderUpcomingMovies": "Upcoming Movies", "HeaderUpcomingSports": "Upcoming Sports", "HeaderUpcomingPrograms": "Upcoming Programs", - "ButtonMoreItems": "More...", + "ButtonMoreItems": "More", "LabelShowLibraryTileNames": "Show library tile names", "LabelShowLibraryTileNamesHelp": "Determines if labels will be displayed underneath library tiles on the home page", "OptionEnableTranscodingThrottle": "Enable throttling", @@ -1411,7 +1414,6 @@ "OptionEnableFullSpeedConversion": "Enable full speed conversion", "OptionEnableFullSpeedConversionHelp": "By default, sync conversion is performed at a low speed to minimize resource consumption.", "HeaderPlaylists": "Playlists", - "HeaderSelectDate": "Select Date", "HeaderViewStyles": "View Styles", "LabelSelectViewStyles": "Enable enhanced presentations for:", "LabelSelectViewStylesHelp": "If enabled, views will be built with metadata to offer categories such as Suggestions, Latest, Genres, and more. If disabled, they'll be displayed with simple folders.", @@ -1439,5 +1441,14 @@ "ButtonUnlockGuide": "Unlock Guide", "LabelEnableFullScreen": "Enable fullscreen mode", "LabelEnableChromecastAc3Passthrough": "Enable Chromecast AC3 Passthrough", - "LabelSyncPath": "Synced content path:" + "LabelSyncPath": "Synced content path:", + "LabelEmail": "Email:", + "LabelUsername": "Username:", + "HeaderSignUp": "Sign Up", + "LabelPasswordConfirm": "Password (confirm):", + "ButtonAddServer": "Add Server", + "TabHomeScreen": "Home Screen", + "HeaderDisplay": "Display", + "HeaderNavigation": "Navigation", + "LegendTheseSettingsShared": "These settings are shared on all devices" }
\ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/Server/zh-CN.json b/MediaBrowser.Server.Implementations/Localization/Server/zh-CN.json index 846c7ab17..20f4fa16b 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/zh-CN.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/zh-CN.json @@ -13,6 +13,7 @@ "LabelShowLogWindow": "\u663e\u793a\u65e5\u5fd7\u7a97\u53e3", "LabelPrevious": "\u4e0a\u4e00\u4e2a", "LabelFinish": "\u5b8c\u6210", + "FolderTypeMixed": "Mixed content", "LabelNext": "\u4e0b\u4e00\u4e2a", "LabelYoureDone": "\u5b8c\u6210\uff01", "WelcomeToProject": "Welcome to Emby!", @@ -85,12 +86,11 @@ "ButtonDonateWithPayPal": "\u901a\u8fc7PayPal\u6350\u8d60", "OptionDetectArchiveFilesAsMedia": "\u628a\u538b\u7f29\u6587\u4ef6\u4f5c\u4e3a\u5a92\u4f53\u6587\u4ef6\u68c0\u6d4b", "OptionDetectArchiveFilesAsMediaHelp": "\u5982\u679c\u542f\u7528\uff0c\u4e0e.RAR\u548c.zip\u6269\u5c55\u540d\u7684\u6587\u4ef6\u5c06\u88ab\u68c0\u6d4b\u4e3a\u5a92\u4f53\u6587\u4ef6\u3002", - "LabelEnterConnectUserName": "\u7528\u6237\u540d\u6216\u7535\u5b50\u90ae\u4ef6\uff1a", + "LabelEnterConnectUserName": "Username or email:", "LabelEnterConnectUserNameHelp": "This is your Emby online account username or password.", "LabelEnableEnhancedMovies": "Enable enhanced movie displays", "LabelEnableEnhancedMoviesHelp": "When enabled, movies will be displayed as folders to include trailers, extras, cast & crew, and other related content.", "HeaderSyncJobInfo": "\u540c\u6b65\u4f5c\u4e1a", - "FolderTypeMixed": "\u6df7\u5408\u5185\u5bb9", "FolderTypeMovies": "\u7535\u5f71", "FolderTypeMusic": "\u97f3\u4e50", "FolderTypeAdultVideos": "\u6210\u4eba\u89c6\u9891", @@ -287,7 +287,9 @@ "OptionFileMetadataYearMismatch": "\u6587\u4ef6\/\u5a92\u4f53\u8d44\u6599\u5e74\u4efd\u4e0d\u5339\u914d", "TabGeneral": "\u4e00\u822c", "TitleSupport": "\u652f\u6301", + "LabelSeasonNumber": "Season number", "TabLog": "\u65e5\u5fd7\u6587\u6863", + "LabelEpisodeNumber": "Episode number", "TabAbout": "\u5173\u4e8e", "TabSupporterKey": "\u652f\u6301\u8005\u5e8f\u53f7", "TabBecomeSupporter": "\u6210\u4e3a\u652f\u6301\u8005", @@ -313,6 +315,9 @@ "OptionAllowRemoteControlOthers": "Allow remote control of other users", "OptionAllowRemoteSharedDevices": "Allow remote control of shared devices", "OptionAllowRemoteSharedDevicesHelp": "Dlna devices are considered shared until a user begins controlling it.", + "OptionAllowLinkSharing": "Allow social media sharing", + "OptionAllowLinkSharingHelp": "Only web pages containing media information are shared. Media files are never shared publicly. Shares are time-limited and will expire based on your server sharing settings.", + "HeaderSharing": "Sharing", "HeaderRemoteControl": "Remote Control", "OptionMissingTmdbId": "\u7f3a\u5c11Tmdb \u7f16\u53f7", "OptionIsHD": "HD\u9ad8\u6e05", @@ -581,8 +586,6 @@ "LabelSkipped": "\u8df3\u8fc7", "HeaderEpisodeOrganization": "\u5267\u96c6\u6574\u7406", "LabelSeries": "\u7535\u89c6\u5267\uff1a", - "LabelSeasonNumber": "\u591a\u5c11\u5b63\uff1a", - "LabelEpisodeNumber": "\u591a\u5c11\u96c6\uff1a", "LabelEndingEpisodeNumber": "\u6700\u540e\u4e00\u96c6\u6570\u5b57\uff1a", "LabelEndingEpisodeNumberHelp": "\u53ea\u9700\u8981\u591a\u96c6\u6587\u4ef6", "HeaderSupportTheTeam": "Support the Emby Team", @@ -870,6 +873,7 @@ "HeaderTypeText": "\u8f93\u5165\u6587\u672c", "LabelTypeText": "\u6587\u672c", "HeaderSearchForSubtitles": "\u641c\u7d22\u5b57\u5e55", + "ButtonMore": "More", "MessageNoSubtitleSearchResultsFound": "\u641c\u7d22\u65e0\u7ed3\u679c", "TabDisplay": "\u663e\u793a", "TabLanguages": "\u8bed\u8a00", @@ -900,7 +904,7 @@ "HeaderLiveTv": "\u7535\u89c6\u76f4\u64ad", "HeaderReports": "\u62a5\u544a", "HeaderMetadataManager": "\u5a92\u4f53\u8d44\u6599\u7ba1\u7406", - "HeaderPreferences": "\u504f\u597d", + "HeaderSettings": "Settings", "MessageLoadingChannels": "\u9891\u9053\u5185\u5bb9\u52a0\u8f7d\u4e2d......", "MessageLoadingContent": "\u6b63\u5728\u8f7d\u5165\u5185\u5bb9....", "ButtonMarkRead": "\u6807\u8bb0\u5df2\u8bfb", @@ -1098,7 +1102,6 @@ "OptionReportArtists": "\u827a\u672f\u5bb6", "OptionReportAlbums": "\u4e13\u8f91", "OptionReportAdultVideos": "\u6210\u4eba\u89c6\u9891", - "ButtonMore": "\u66f4\u591a", "HeaderActivity": "\u6d3b\u52a8", "ScheduledTaskStartedWithName": "{0} \u5f00\u59cb", "ScheduledTaskCancelledWithName": "{0} \u88ab\u53d6\u6d88", @@ -1392,7 +1395,7 @@ "HeaderUpcomingMovies": "Upcoming Movies", "HeaderUpcomingSports": "Upcoming Sports", "HeaderUpcomingPrograms": "Upcoming Programs", - "ButtonMoreItems": "\u66f4\u591a...", + "ButtonMoreItems": "More", "LabelShowLibraryTileNames": "Show library tile names", "LabelShowLibraryTileNamesHelp": "Determines if labels will be displayed underneath library tiles on the home page", "OptionEnableTranscodingThrottle": "Enable throttling", @@ -1411,7 +1414,6 @@ "OptionEnableFullSpeedConversion": "Enable full speed conversion", "OptionEnableFullSpeedConversionHelp": "By default, sync conversion is performed at a low speed to minimize resource consumption.", "HeaderPlaylists": "Playlists", - "HeaderSelectDate": "Select Date", "HeaderViewStyles": "View Styles", "LabelSelectViewStyles": "Enable enhanced presentations for:", "LabelSelectViewStylesHelp": "If enabled, views will be built with metadata to offer categories such as Suggestions, Latest, Genres, and more. If disabled, they'll be displayed with simple folders.", @@ -1439,5 +1441,14 @@ "ButtonUnlockGuide": "Unlock Guide", "LabelEnableFullScreen": "Enable fullscreen mode", "LabelEnableChromecastAc3Passthrough": "Enable Chromecast AC3 Passthrough", - "LabelSyncPath": "Synced content path:" + "LabelSyncPath": "Synced content path:", + "LabelEmail": "Email:", + "LabelUsername": "Username:", + "HeaderSignUp": "Sign Up", + "LabelPasswordConfirm": "Password (confirm):", + "ButtonAddServer": "Add Server", + "TabHomeScreen": "Home Screen", + "HeaderDisplay": "Display", + "HeaderNavigation": "Navigation", + "LegendTheseSettingsShared": "These settings are shared on all devices" }
\ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/Server/zh-TW.json b/MediaBrowser.Server.Implementations/Localization/Server/zh-TW.json index f21bfcd9e..93b99610a 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/zh-TW.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/zh-TW.json @@ -13,6 +13,7 @@ "LabelShowLogWindow": "\u986f\u793a\u65e5\u8a8c", "LabelPrevious": "\u4e0a\u4e00\u500b", "LabelFinish": "\u5b8c\u7d50", + "FolderTypeMixed": "Mixed content", "LabelNext": "\u4e0b\u4e00\u500b", "LabelYoureDone": "\u5b8c\u6210!", "WelcomeToProject": "Welcome to Emby!", @@ -90,7 +91,6 @@ "LabelEnableEnhancedMovies": "Enable enhanced movie displays", "LabelEnableEnhancedMoviesHelp": "When enabled, movies will be displayed as folders to include trailers, extras, cast & crew, and other related content.", "HeaderSyncJobInfo": "Sync Job", - "FolderTypeMixed": "Mixed content", "FolderTypeMovies": "Movies", "FolderTypeMusic": "Music", "FolderTypeAdultVideos": "Adult videos", @@ -287,7 +287,9 @@ "OptionFileMetadataYearMismatch": "\u6a94\u6848\/\u5a92\u9ad4\u8cc7\u6599\u5e74\u4efd\u4e0d\u5339\u914d", "TabGeneral": "\u4e00\u822c", "TitleSupport": "\u652f\u63f4", + "LabelSeasonNumber": "Season number", "TabLog": "\u65e5\u8a8c", + "LabelEpisodeNumber": "Episode number", "TabAbout": "\u95dc\u65bc", "TabSupporterKey": "\u652f\u6301\u8005\u5e8f\u865f", "TabBecomeSupporter": "\u6210\u70ba\u652f\u6301\u8005", @@ -313,6 +315,9 @@ "OptionAllowRemoteControlOthers": "Allow remote control of other users", "OptionAllowRemoteSharedDevices": "Allow remote control of shared devices", "OptionAllowRemoteSharedDevicesHelp": "Dlna devices are considered shared until a user begins controlling it.", + "OptionAllowLinkSharing": "Allow social media sharing", + "OptionAllowLinkSharingHelp": "Only web pages containing media information are shared. Media files are never shared publicly. Shares are time-limited and will expire based on your server sharing settings.", + "HeaderSharing": "Sharing", "HeaderRemoteControl": "Remote Control", "OptionMissingTmdbId": "\u7f3a\u5c11TMDB\u7de8\u865f", "OptionIsHD": "\u9ad8\u6e05", @@ -581,8 +586,6 @@ "LabelSkipped": "Skipped", "HeaderEpisodeOrganization": "Episode Organization", "LabelSeries": "Series:", - "LabelSeasonNumber": "Season number:", - "LabelEpisodeNumber": "Episode number:", "LabelEndingEpisodeNumber": "Ending episode number:", "LabelEndingEpisodeNumberHelp": "Only required for multi-episode files", "HeaderSupportTheTeam": "Support the Emby Team", @@ -870,6 +873,7 @@ "HeaderTypeText": "Enter Text", "LabelTypeText": "Text", "HeaderSearchForSubtitles": "Search for Subtitles", + "ButtonMore": "More", "MessageNoSubtitleSearchResultsFound": "No search results founds.", "TabDisplay": "Display", "TabLanguages": "Languages", @@ -900,7 +904,7 @@ "HeaderLiveTv": "Live TV", "HeaderReports": "Reports", "HeaderMetadataManager": "Metadata Manager", - "HeaderPreferences": "Preferences", + "HeaderSettings": "Settings", "MessageLoadingChannels": "Loading channel content...", "MessageLoadingContent": "Loading content...", "ButtonMarkRead": "Mark Read", @@ -1098,7 +1102,6 @@ "OptionReportArtists": "Artists", "OptionReportAlbums": "Albums", "OptionReportAdultVideos": "Adult videos", - "ButtonMore": "More", "HeaderActivity": "Activity", "ScheduledTaskStartedWithName": "{0} started", "ScheduledTaskCancelledWithName": "{0} was cancelled", @@ -1392,7 +1395,7 @@ "HeaderUpcomingMovies": "Upcoming Movies", "HeaderUpcomingSports": "Upcoming Sports", "HeaderUpcomingPrograms": "Upcoming Programs", - "ButtonMoreItems": "More...", + "ButtonMoreItems": "More", "LabelShowLibraryTileNames": "Show library tile names", "LabelShowLibraryTileNamesHelp": "Determines if labels will be displayed underneath library tiles on the home page", "OptionEnableTranscodingThrottle": "Enable throttling", @@ -1411,7 +1414,6 @@ "OptionEnableFullSpeedConversion": "Enable full speed conversion", "OptionEnableFullSpeedConversionHelp": "By default, sync conversion is performed at a low speed to minimize resource consumption.", "HeaderPlaylists": "Playlists", - "HeaderSelectDate": "Select Date", "HeaderViewStyles": "View Styles", "LabelSelectViewStyles": "Enable enhanced presentations for:", "LabelSelectViewStylesHelp": "If enabled, views will be built with metadata to offer categories such as Suggestions, Latest, Genres, and more. If disabled, they'll be displayed with simple folders.", @@ -1439,5 +1441,14 @@ "ButtonUnlockGuide": "Unlock Guide", "LabelEnableFullScreen": "Enable fullscreen mode", "LabelEnableChromecastAc3Passthrough": "Enable Chromecast AC3 Passthrough", - "LabelSyncPath": "Synced content path:" + "LabelSyncPath": "Synced content path:", + "LabelEmail": "Email:", + "LabelUsername": "Username:", + "HeaderSignUp": "Sign Up", + "LabelPasswordConfirm": "Password (confirm):", + "ButtonAddServer": "Add Server", + "TabHomeScreen": "Home Screen", + "HeaderDisplay": "Display", + "HeaderNavigation": "Navigation", + "LegendTheseSettingsShared": "These settings are shared on all devices" }
\ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj b/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj index b461fb78b..33b2493f5 100644 --- a/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj +++ b/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj @@ -227,6 +227,8 @@ <Compile Include="Logging\PatternsLogger.cs" /> <Compile Include="MediaEncoder\EncodingManager.cs" /> <Compile Include="Persistence\BaseSqliteRepository.cs" /> + <Compile Include="Social\SharingManager.cs" /> + <Compile Include="Social\SharingRepository.cs" /> <Compile Include="Sorting\StartDateComparer.cs" /> <Compile Include="Sync\SyncHelper.cs" /> <Compile Include="Sync\SyncJobOptions.cs" /> diff --git a/MediaBrowser.Server.Implementations/Persistence/SqliteItemRepository.cs b/MediaBrowser.Server.Implementations/Persistence/SqliteItemRepository.cs index 2f01af79b..852fbd76c 100644 --- a/MediaBrowser.Server.Implementations/Persistence/SqliteItemRepository.cs +++ b/MediaBrowser.Server.Implementations/Persistence/SqliteItemRepository.cs @@ -1,5 +1,6 @@ using MediaBrowser.Common.Configuration; using MediaBrowser.Controller.Entities; +using MediaBrowser.Controller.Entities.TV; using MediaBrowser.Controller.LiveTv; using MediaBrowser.Controller.Persistence; using MediaBrowser.Model.Entities; @@ -12,6 +13,7 @@ using System.Data; using System.Globalization; using System.IO; using System.Linq; +using System.Runtime.Serialization; using System.Threading; using System.Threading.Tasks; @@ -65,6 +67,8 @@ namespace MediaBrowser.Server.Implementations.Persistence private IDbCommand _saveChildrenCommand; private IDbCommand _deleteItemCommand; + private IDbCommand _deletePeopleCommand; + private IDbCommand _savePersonCommand; /// <summary> /// Initializes a new instance of the <see cref="SqliteItemRepository"/> class. /// </summary> @@ -121,6 +125,8 @@ namespace MediaBrowser.Server.Implementations.Persistence "create table if not exists ChildrenIds (ParentId GUID, ItemId GUID, PRIMARY KEY (ParentId, ItemId))", "create index if not exists idx_ChildrenIds on ChildrenIds(ParentId,ItemId)", + "create table if not exists People (ItemId GUID, Name TEXT NOT NULL, Role TEXT, PersonType TEXT, SortOrder int, ListOrder int)", + //pragmas "pragma temp_store = memory", @@ -129,8 +135,8 @@ namespace MediaBrowser.Server.Implementations.Persistence _connection.RunQueries(queries, _logger); - _connection.AddColumn(_logger, "TypedBaseItems", "Path", "Text"); - _connection.AddColumn(_logger, "TypedBaseItems", "StartDate", "DATETIME"); + _connection.AddColumn(_logger, "TypedBaseItems", "Path", "Text"); + _connection.AddColumn(_logger, "TypedBaseItems", "StartDate", "DATETIME"); _connection.AddColumn(_logger, "TypedBaseItems", "EndDate", "DATETIME"); _connection.AddColumn(_logger, "TypedBaseItems", "ChannelId", "Text"); _connection.AddColumn(_logger, "TypedBaseItems", "IsMovie", "BIT"); @@ -143,6 +149,13 @@ namespace MediaBrowser.Server.Implementations.Persistence _connection.AddColumn(_logger, "TypedBaseItems", "Name", "Text"); _connection.AddColumn(_logger, "TypedBaseItems", "OfficialRating", "Text"); + _connection.AddColumn(_logger, "TypedBaseItems", "MediaType", "Text"); + _connection.AddColumn(_logger, "TypedBaseItems", "Overview", "Text"); + _connection.AddColumn(_logger, "TypedBaseItems", "ParentIndexNumber", "INT"); + _connection.AddColumn(_logger, "TypedBaseItems", "PremiereDate", "DATETIME"); + _connection.AddColumn(_logger, "TypedBaseItems", "ProductionYear", "INT"); + _connection.AddColumn(_logger, "TypedBaseItems", "ParentId", "GUID"); + PrepareStatements(); _mediaStreamsRepository.Initialize(); @@ -176,10 +189,16 @@ namespace MediaBrowser.Server.Implementations.Persistence "IndexNumber", "IsLocked", "Name", - "OfficialRating" + "OfficialRating", + "MediaType", + "Overview", + "ParentIndexNumber", + "PremiereDate", + "ProductionYear", + "ParentId" }; _saveItemCommand = _connection.CreateCommand(); - _saveItemCommand.CommandText = "replace into TypedBaseItems (" + string.Join(",", saveColumns.ToArray()) + ") values (@1, @2, @3, @4, @5, @6, @7, @8, @9, @10, @11, @12, @13, @14, @15, @16)"; + _saveItemCommand.CommandText = "replace into TypedBaseItems (" + string.Join(",", saveColumns.ToArray()) + ") values (@1, @2, @3, @4, @5, @6, @7, @8, @9, @10, @11, @12, @13, @14, @15, @16, @17, @18, @19, @20, @21, @22)"; for (var i = 1; i <= saveColumns.Count; i++) { _saveItemCommand.Parameters.Add(_saveItemCommand, "@" + i.ToString(CultureInfo.InvariantCulture)); @@ -197,6 +216,19 @@ namespace MediaBrowser.Server.Implementations.Persistence _saveChildrenCommand.CommandText = "replace into ChildrenIds (ParentId, ItemId) values (@ParentId, @ItemId)"; _saveChildrenCommand.Parameters.Add(_saveChildrenCommand, "@ParentId"); _saveChildrenCommand.Parameters.Add(_saveChildrenCommand, "@ItemId"); + + _deletePeopleCommand = _connection.CreateCommand(); + _deletePeopleCommand.CommandText = "delete from People where ItemId=@Id"; + _deletePeopleCommand.Parameters.Add(_deletePeopleCommand, "@Id"); + + _savePersonCommand = _connection.CreateCommand(); + _savePersonCommand.CommandText = "insert into People (ItemId, Name, Role, PersonType, SortOrder, ListOrder) values (@ItemId, @Name, @Role, @PersonType, @SortOrder, @ListOrder)"; + _savePersonCommand.Parameters.Add(_savePersonCommand, "@ItemId"); + _savePersonCommand.Parameters.Add(_savePersonCommand, "@Name"); + _savePersonCommand.Parameters.Add(_savePersonCommand, "@Role"); + _savePersonCommand.Parameters.Add(_savePersonCommand, "@PersonType"); + _savePersonCommand.Parameters.Add(_savePersonCommand, "@SortOrder"); + _savePersonCommand.Parameters.Add(_savePersonCommand, "@ListOrder"); } /// <summary> @@ -256,9 +288,9 @@ namespace MediaBrowser.Server.Implementations.Persistence _saveItemCommand.GetParameter(index++).Value = item.GetType().FullName; _saveItemCommand.GetParameter(index++).Value = _jsonSerializer.SerializeToBytes(item); - _saveItemCommand.GetParameter(index++).Value = item.Path; + _saveItemCommand.GetParameter(index++).Value = item.Path; - var hasStartDate = item as IHasStartDate; + var hasStartDate = item as IHasStartDate; if (hasStartDate != null) { _saveItemCommand.GetParameter(index++).Value = hasStartDate.StartDate; @@ -293,7 +325,22 @@ namespace MediaBrowser.Server.Implementations.Persistence _saveItemCommand.GetParameter(index++).Value = item.Name; _saveItemCommand.GetParameter(index++).Value = item.OfficialRating; - + + _saveItemCommand.GetParameter(index++).Value = item.MediaType; + _saveItemCommand.GetParameter(index++).Value = item.Overview; + _saveItemCommand.GetParameter(index++).Value = item.ParentIndexNumber; + _saveItemCommand.GetParameter(index++).Value = item.PremiereDate; + _saveItemCommand.GetParameter(index++).Value = item.ProductionYear; + + if (item.ParentId == Guid.Empty) + { + _saveItemCommand.GetParameter(index++).Value = null; + } + else + { + _saveItemCommand.GetParameter(index++).Value = item.ParentId; + } + _saveItemCommand.Transaction = transaction; _saveItemCommand.ExecuteNonQuery(); @@ -379,7 +426,15 @@ namespace MediaBrowser.Server.Implementations.Persistence using (var stream = reader.GetMemoryStream(1)) { - return _jsonSerializer.DeserializeFromStream(stream, type) as BaseItem; + try + { + return _jsonSerializer.DeserializeFromStream(stream, type) as BaseItem; + } + catch (SerializationException ex) + { + _logger.ErrorException("Error deserializing item", ex); + return null; + } } } @@ -662,7 +717,11 @@ namespace MediaBrowser.Server.Implementations.Persistence { while (reader.Read()) { - list.Add(GetItem(reader)); + var item = GetItem(reader); + if (item != null) + { + list.Add(item); + } } if (reader.NextResult() && reader.Read()) @@ -692,9 +751,7 @@ namespace MediaBrowser.Server.Implementations.Persistence { cmd.CommandText = "select guid from TypedBaseItems"; - var whereClauses = GetWhereClauses(query, cmd, false); - - whereClauses = GetWhereClauses(query, cmd, true); + var whereClauses = GetWhereClauses(query, cmd, true); var whereText = whereClauses.Count == 0 ? string.Empty : @@ -867,6 +924,12 @@ namespace MediaBrowser.Server.Implementations.Persistence } } + if (!string.IsNullOrWhiteSpace(query.Person)) + { + whereClauses.Add("Guid in (select ItemId from People where Name=@PersonName)"); + cmd.Parameters.Add(cmd, "@PersonName", DbType.String).Value = query.Person; + } + if (addPaging) { if (query.StartIndex.HasValue && query.StartIndex.Value > 0) @@ -891,6 +954,7 @@ namespace MediaBrowser.Server.Implementations.Persistence {typeof(LiveTvChannel).Name, new []{typeof(LiveTvChannel).FullName}}, {typeof(LiveTvVideoRecording).Name, new []{typeof(LiveTvVideoRecording).FullName}}, {typeof(LiveTvAudioRecording).Name, new []{typeof(LiveTvAudioRecording).FullName}}, + {typeof(Series).Name, new []{typeof(Series).FullName}}, {"Recording", new []{typeof(LiveTvAudioRecording).FullName, typeof(LiveTvVideoRecording).FullName}} }; @@ -952,6 +1016,11 @@ namespace MediaBrowser.Server.Implementations.Persistence _deleteChildrenCommand.Transaction = transaction; _deleteChildrenCommand.ExecuteNonQuery(); + // Delete people + _deletePeopleCommand.GetParameter(0).Value = id; + _deletePeopleCommand.Transaction = transaction; + _deletePeopleCommand.ExecuteNonQuery(); + // Delete the item _deleteItemCommand.GetParameter(0).Value = id; _deleteItemCommand.Transaction = transaction; @@ -1074,5 +1143,234 @@ namespace MediaBrowser.Server.Implementations.Persistence CheckDisposed(); return _mediaStreamsRepository.SaveMediaStreams(id, streams, cancellationToken); } + + public List<string> GetPeopleNames(InternalPeopleQuery query) + { + if (query == null) + { + throw new ArgumentNullException("query"); + } + + CheckDisposed(); + + using (var cmd = _connection.CreateCommand()) + { + cmd.CommandText = "select Distinct Name from People"; + + var whereClauses = GetPeopleWhereClauses(query, cmd); + + if (whereClauses.Count > 0) + { + cmd.CommandText += " where " + string.Join(" AND ", whereClauses.ToArray()); + } + + cmd.CommandText += " order by ListOrder"; + + var list = new List<string>(); + + using (var reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess | CommandBehavior.SingleResult)) + { + while (reader.Read()) + { + list.Add(reader.GetString(0)); + } + } + + return list; + } + } + + public List<PersonInfo> GetPeople(InternalPeopleQuery query) + { + if (query == null) + { + throw new ArgumentNullException("query"); + } + + CheckDisposed(); + + using (var cmd = _connection.CreateCommand()) + { + cmd.CommandText = "select ItemId, Name, Role, PersonType, SortOrder from People"; + + var whereClauses = GetPeopleWhereClauses(query, cmd); + + if (whereClauses.Count > 0) + { + cmd.CommandText += " where " + string.Join(" AND ", whereClauses.ToArray()); + } + + cmd.CommandText += " order by ListOrder"; + + var list = new List<PersonInfo>(); + + using (var reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess | CommandBehavior.SingleResult)) + { + while (reader.Read()) + { + list.Add(GetPerson(reader)); + } + } + + return list; + } + } + + private List<string> GetPeopleWhereClauses(InternalPeopleQuery query, IDbCommand cmd) + { + var whereClauses = new List<string>(); + + if (query.ItemId != Guid.Empty) + { + whereClauses.Add("ItemId=@ItemId"); + cmd.Parameters.Add(cmd, "@ItemId", DbType.Guid).Value = query.ItemId; + } + if (query.AppearsInItemId != Guid.Empty) + { + whereClauses.Add("Name in (Select Name from People where ItemId=@AppearsInItemId)"); + cmd.Parameters.Add(cmd, "@AppearsInItemId", DbType.Guid).Value = query.AppearsInItemId; + } + if (query.PersonTypes.Count == 1) + { + whereClauses.Add("PersonType=@PersonType"); + cmd.Parameters.Add(cmd, "@PersonType", DbType.String).Value = query.PersonTypes[0]; + } + if (query.PersonTypes.Count > 1) + { + var val = string.Join(",", query.PersonTypes.Select(i => "'" + i + "'").ToArray()); + + whereClauses.Add("PersonType in (" + val + ")"); + } + if (query.ExcludePersonTypes.Count == 1) + { + whereClauses.Add("PersonType<>@PersonType"); + cmd.Parameters.Add(cmd, "@PersonType", DbType.String).Value = query.ExcludePersonTypes[0]; + } + if (query.ExcludePersonTypes.Count > 1) + { + var val = string.Join(",", query.ExcludePersonTypes.Select(i => "'" + i + "'").ToArray()); + + whereClauses.Add("PersonType not in (" + val + ")"); + } + if (query.MaxListOrder.HasValue) + { + whereClauses.Add("ListOrder<=@MaxListOrder"); + cmd.Parameters.Add(cmd, "@MaxListOrder", DbType.Int32).Value = query.MaxListOrder.Value; + } + if (!string.IsNullOrWhiteSpace(query.NameContains)) + { + whereClauses.Add("Name like @NameContains"); + cmd.Parameters.Add(cmd, "@NameContains", DbType.String).Value = "%"+query.NameContains+"%"; + } + + return whereClauses; + } + + public async Task UpdatePeople(Guid itemId, List<PersonInfo> people) + { + if (itemId == Guid.Empty) + { + throw new ArgumentNullException("itemId"); + } + + if (people == null) + { + throw new ArgumentNullException("people"); + } + + CheckDisposed(); + + var cancellationToken = CancellationToken.None; + + await _writeLock.WaitAsync(cancellationToken).ConfigureAwait(false); + + IDbTransaction transaction = null; + + try + { + transaction = _connection.BeginTransaction(); + + // First delete + _deletePeopleCommand.GetParameter(0).Value = itemId; + _deletePeopleCommand.Transaction = transaction; + + _deletePeopleCommand.ExecuteNonQuery(); + + var listIndex = 0; + + foreach (var person in people) + { + cancellationToken.ThrowIfCancellationRequested(); + + _savePersonCommand.GetParameter(0).Value = itemId; + _savePersonCommand.GetParameter(1).Value = person.Name; + _savePersonCommand.GetParameter(2).Value = person.Role; + _savePersonCommand.GetParameter(3).Value = person.Type; + _savePersonCommand.GetParameter(4).Value = person.SortOrder; + _savePersonCommand.GetParameter(5).Value = listIndex; + + _savePersonCommand.Transaction = transaction; + + _savePersonCommand.ExecuteNonQuery(); + listIndex++; + } + + transaction.Commit(); + } + catch (OperationCanceledException) + { + if (transaction != null) + { + transaction.Rollback(); + } + + throw; + } + catch (Exception e) + { + _logger.ErrorException("Failed to save people:", e); + + if (transaction != null) + { + transaction.Rollback(); + } + + throw; + } + finally + { + if (transaction != null) + { + transaction.Dispose(); + } + + _writeLock.Release(); + } + } + + private PersonInfo GetPerson(IDataReader reader) + { + var item = new PersonInfo(); + + item.ItemId = reader.GetGuid(0); + item.Name = reader.GetString(1); + + if (!reader.IsDBNull(2)) + { + item.Role = reader.GetString(2); + } + + if (!reader.IsDBNull(3)) + { + item.Type = reader.GetString(3); + } + + if (!reader.IsDBNull(4)) + { + item.SortOrder = reader.GetInt32(4); + } + + return item; + } } }
\ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Photos/BaseDynamicImageProvider.cs b/MediaBrowser.Server.Implementations/Photos/BaseDynamicImageProvider.cs index 79ebc67d9..ef12544ba 100644 --- a/MediaBrowser.Server.Implementations/Photos/BaseDynamicImageProvider.cs +++ b/MediaBrowser.Server.Implementations/Photos/BaseDynamicImageProvider.cs @@ -205,7 +205,7 @@ namespace MediaBrowser.Server.Implementations.Photos if (item is UserView) { - return HasChanged(item, ImageType.Primary) || HasChanged(item, ImageType.Thumb); + return HasChanged(item, ImageType.Primary); } var items = GetItemsWithImages(item).Result; diff --git a/MediaBrowser.Server.Implementations/Playlists/PlaylistManager.cs b/MediaBrowser.Server.Implementations/Playlists/PlaylistManager.cs index a5cc0e0de..311cb9b51 100644 --- a/MediaBrowser.Server.Implementations/Playlists/PlaylistManager.cs +++ b/MediaBrowser.Server.Implementations/Playlists/PlaylistManager.cs @@ -113,7 +113,6 @@ namespace MediaBrowser.Server.Implementations.Playlists var playlist = new Playlist { Name = name, - Parent = parentFolder, Path = path }; diff --git a/MediaBrowser.Server.Implementations/Session/HttpSessionController.cs b/MediaBrowser.Server.Implementations/Session/HttpSessionController.cs index 9a7fb33df..b841f0216 100644 --- a/MediaBrowser.Server.Implementations/Session/HttpSessionController.cs +++ b/MediaBrowser.Server.Implementations/Session/HttpSessionController.cs @@ -24,9 +24,6 @@ namespace MediaBrowser.Server.Implementations.Session private readonly string _postUrl; - private Timer _pingTimer; - private DateTime _lastPingTime; - public HttpSessionController(IHttpClient httpClient, IJsonSerializer json, SessionInfo session, @@ -37,10 +34,6 @@ namespace MediaBrowser.Server.Implementations.Session Session = session; _postUrl = postUrl; _sessionManager = sessionManager; - - _pingTimer = new Timer(PingTimerCallback, null, Timeout.Infinite, Timeout.Infinite); - - ResetPingTimer(); } public void OnActivity() @@ -59,7 +52,7 @@ namespace MediaBrowser.Server.Implementations.Session { get { - return (DateTime.UtcNow - Session.LastActivityDate).TotalMinutes <= 20; + return (DateTime.UtcNow - Session.LastActivityDate).TotalMinutes <= 10; } } @@ -68,54 +61,6 @@ namespace MediaBrowser.Server.Implementations.Session get { return true; } } - private async void PingTimerCallback(object state) - { - try - { - await SendMessage("Ping", CancellationToken.None).ConfigureAwait(false); - - _lastPingTime = DateTime.UtcNow; - } - catch - { - var lastActivityDate = new[] { _lastPingTime, Session.LastActivityDate } - .Max(); - - var timeSinceLastPing = DateTime.UtcNow - lastActivityDate; - - // We don't want to stop the session due to one single request failure - // At the same time, we don't want the timeout to be too long because it will - // be sitting in active sessions available for remote control, when it's not - if (timeSinceLastPing >= TimeSpan.FromMinutes(5)) - { - ReportSessionEnded(); - } - } - } - - private void ReportSessionEnded() - { - try - { - _sessionManager.ReportSessionEnded(Session.Id); - } - catch (Exception ex) - { - } - } - - private void ResetPingTimer() - { - if (_pingTimer != null) - { - _lastPingTime = DateTime.UtcNow; - - var period = TimeSpan.FromSeconds(60); - - _pingTimer.Change(period, period); - } - } - private Task SendMessage(string name, CancellationToken cancellationToken) { return SendMessage(name, new Dictionary<string, string>(), cancellationToken); @@ -133,8 +78,6 @@ namespace MediaBrowser.Server.Implementations.Session CancellationToken = cancellationToken }).ConfigureAwait(false); - - ResetPingTimer(); } public Task SendSessionEndedNotification(SessionInfoDto sessionInfo, CancellationToken cancellationToken) @@ -237,16 +180,6 @@ namespace MediaBrowser.Server.Implementations.Session public void Dispose() { - DisposePingTimer(); - } - - private void DisposePingTimer() - { - if (_pingTimer != null) - { - _pingTimer.Dispose(); - _pingTimer = null; - } } } } diff --git a/MediaBrowser.Server.Implementations/Session/SessionManager.cs b/MediaBrowser.Server.Implementations/Session/SessionManager.cs index f657d5403..560d203db 100644 --- a/MediaBrowser.Server.Implementations/Session/SessionManager.cs +++ b/MediaBrowser.Server.Implementations/Session/SessionManager.cs @@ -967,7 +967,13 @@ namespace MediaBrowser.Server.Implementations.Session private IEnumerable<BaseItem> TranslateItemForPlayback(string id, User user) { - var item = _libraryManager.GetItemById(new Guid(id)); + var item = _libraryManager.GetItemById(id); + + if (item == null) + { + _logger.Error("A non-existant item Id {0} was passed into TranslateItemForPlayback", id); + return new List<BaseItem>(); + } var byName = item as IItemByName; @@ -1011,6 +1017,12 @@ namespace MediaBrowser.Server.Implementations.Session { var item = _libraryManager.GetItemById(id); + if (item == null) + { + _logger.Error("A non-existant item Id {0} was passed into TranslateItemForInstantMix", id); + return new List<BaseItem>(); + } + return _musicManager.GetInstantMixFromItem(item, user); } diff --git a/MediaBrowser.Server.Implementations/Social/SharingManager.cs b/MediaBrowser.Server.Implementations/Social/SharingManager.cs new file mode 100644 index 000000000..326b2893c --- /dev/null +++ b/MediaBrowser.Server.Implementations/Social/SharingManager.cs @@ -0,0 +1,103 @@ +using MediaBrowser.Common.Extensions; +using MediaBrowser.Controller; +using MediaBrowser.Controller.Configuration; +using MediaBrowser.Controller.Entities; +using MediaBrowser.Controller.Library; +using MediaBrowser.Controller.Social; +using MediaBrowser.Model.Social; +using System; +using System.Threading.Tasks; + +namespace MediaBrowser.Server.Implementations.Social +{ + public class SharingManager : ISharingManager + { + private readonly SharingRepository _repository; + private readonly IServerConfigurationManager _config; + private readonly ILibraryManager _libraryManager; + private readonly IServerApplicationHost _appHost; + + public SharingManager(SharingRepository repository, IServerConfigurationManager config, ILibraryManager libraryManager, IServerApplicationHost appHost) + { + _repository = repository; + _config = config; + _libraryManager = libraryManager; + _appHost = appHost; + } + + public async Task<SocialShareInfo> CreateShare(string itemId, string userId) + { + if (string.IsNullOrWhiteSpace(itemId)) + { + throw new ArgumentNullException("itemId"); + } + if (string.IsNullOrWhiteSpace(userId)) + { + throw new ArgumentNullException("userId"); + } + + var item = _libraryManager.GetItemById(itemId); + + if (item == null) + { + throw new ResourceNotFoundException(); + } + + var externalUrl = _appHost.GetSystemInfo().WanAddress; + + if (string.IsNullOrWhiteSpace(externalUrl)) + { + throw new InvalidOperationException("No external server address is currently available."); + } + + var info = new SocialShareInfo + { + Id = Guid.NewGuid().ToString("N"), + ExpirationDate = DateTime.UtcNow.AddDays(_config.Configuration.SharingExpirationDays), + ItemId = itemId, + UserId = userId + }; + + AddShareInfo(info); + + await _repository.CreateShare(info).ConfigureAwait(false); + + return info; + } + + private string GetTitle(BaseItem item) + { + return item.Name; + } + + public SocialShareInfo GetShareInfo(string id) + { + var info = _repository.GetShareInfo(id); + + AddShareInfo(info); + + return info; + } + + private void AddShareInfo(SocialShareInfo info) + { + var externalUrl = _appHost.GetSystemInfo().WanAddress; + + info.ImageUrl = externalUrl + "/Social/Shares/Public/" + info.Id + "/Image"; + info.Url = externalUrl + "/web/shared.html?id=" + info.Id; + + var item = _libraryManager.GetItemById(info.ItemId); + + if (item != null) + { + info.Overview = item.Overview; + info.Name = GetTitle(item); + } + } + + public Task DeleteShare(string id) + { + return _repository.DeleteShare(id); + } + } +} diff --git a/MediaBrowser.Server.Implementations/Social/SharingRepository.cs b/MediaBrowser.Server.Implementations/Social/SharingRepository.cs new file mode 100644 index 000000000..d6d7f021a --- /dev/null +++ b/MediaBrowser.Server.Implementations/Social/SharingRepository.cs @@ -0,0 +1,184 @@ +using MediaBrowser.Common.Configuration; +using MediaBrowser.Model.Logging; +using MediaBrowser.Model.Social; +using MediaBrowser.Server.Implementations.Persistence; +using System; +using System.Data; +using System.IO; +using System.Threading; +using System.Threading.Tasks; + +namespace MediaBrowser.Server.Implementations.Social +{ + public class SharingRepository : BaseSqliteRepository + { + private IDbConnection _connection; + private IDbCommand _saveShareCommand; + private readonly IApplicationPaths _appPaths; + + public SharingRepository(ILogManager logManager, IApplicationPaths appPaths) + : base(logManager) + { + _appPaths = appPaths; + } + + /// <summary> + /// Opens the connection to the database + /// </summary> + /// <returns>Task.</returns> + public async Task Initialize() + { + var dbFile = Path.Combine(_appPaths.DataPath, "shares.db"); + + _connection = await SqliteExtensions.ConnectToDb(dbFile, Logger).ConfigureAwait(false); + + string[] queries = { + + "create table if not exists Shares (Id GUID, ItemId TEXT, UserId TEXT, ExpirationDate DateTime, PRIMARY KEY (Id))", + "create index if not exists idx_Shares on Shares(Id)", + + //pragmas + "pragma temp_store = memory", + + "pragma shrink_memory" + }; + + _connection.RunQueries(queries, Logger); + + PrepareStatements(); + } + + /// <summary> + /// Prepares the statements. + /// </summary> + private void PrepareStatements() + { + _saveShareCommand = _connection.CreateCommand(); + _saveShareCommand.CommandText = "replace into Shares (Id, ItemId, UserId, ExpirationDate) values (@Id, @ItemId, @UserId, @ExpirationDate)"; + + _saveShareCommand.Parameters.Add(_saveShareCommand, "@Id"); + _saveShareCommand.Parameters.Add(_saveShareCommand, "@ItemId"); + _saveShareCommand.Parameters.Add(_saveShareCommand, "@UserId"); + _saveShareCommand.Parameters.Add(_saveShareCommand, "@ExpirationDate"); + } + + public async Task CreateShare(SocialShareInfo info) + { + if (info == null) + { + throw new ArgumentNullException("info"); + } + if (string.IsNullOrWhiteSpace(info.Id)) + { + throw new ArgumentNullException("info.Id"); + } + + var cancellationToken = CancellationToken.None; + + cancellationToken.ThrowIfCancellationRequested(); + + await WriteLock.WaitAsync(cancellationToken).ConfigureAwait(false); + + IDbTransaction transaction = null; + + try + { + transaction = _connection.BeginTransaction(); + + _saveShareCommand.GetParameter(0).Value = new Guid(info.Id); + _saveShareCommand.GetParameter(1).Value = info.ItemId; + _saveShareCommand.GetParameter(2).Value = info.UserId; + _saveShareCommand.GetParameter(3).Value = info.ExpirationDate; + + _saveShareCommand.Transaction = transaction; + + _saveShareCommand.ExecuteNonQuery(); + + transaction.Commit(); + } + catch (OperationCanceledException) + { + if (transaction != null) + { + transaction.Rollback(); + } + + throw; + } + catch (Exception e) + { + Logger.ErrorException("Failed to save share:", e); + + if (transaction != null) + { + transaction.Rollback(); + } + + throw; + } + finally + { + if (transaction != null) + { + transaction.Dispose(); + } + + WriteLock.Release(); + } + } + + public SocialShareInfo GetShareInfo(string id) + { + if (string.IsNullOrWhiteSpace(id)) + { + throw new ArgumentNullException("id"); + } + + var cmd = _connection.CreateCommand(); + cmd.CommandText = "select Id, ItemId, UserId, ExpirationDate from Shares where id = @id"; + + cmd.Parameters.Add(cmd, "@id", DbType.Guid).Value = new Guid(id); + + using (var reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess | CommandBehavior.SingleResult | CommandBehavior.SingleRow)) + { + if (reader.Read()) + { + return GetSocialShareInfo(reader); + } + } + + return null; + } + + private SocialShareInfo GetSocialShareInfo(IDataReader reader) + { + var info = new SocialShareInfo(); + + info.Id = reader.GetGuid(0).ToString("N"); + info.ItemId = reader.GetString(1); + info.UserId = reader.GetString(2); + info.ExpirationDate = reader.GetDateTime(3).ToUniversalTime(); + + return info; + } + + public async Task DeleteShare(string id) + { + + } + + protected override void CloseConnection() + { + if (_connection != null) + { + if (_connection.IsOpen()) + { + _connection.Close(); + } + + _connection.Dispose(); + _connection = null; + } + } + } +} diff --git a/MediaBrowser.Server.Implementations/Sync/MediaSync.cs b/MediaBrowser.Server.Implementations/Sync/MediaSync.cs index 96e996ff1..86ef58e42 100644 --- a/MediaBrowser.Server.Implementations/Sync/MediaSync.cs +++ b/MediaBrowser.Server.Implementations/Sync/MediaSync.cs @@ -341,6 +341,12 @@ namespace MediaBrowser.Server.Implementations.Sync private async Task<SyncedFileInfo> SendFile(IServerSyncProvider provider, string inputPath, string[] pathParts, SyncTarget target, SyncOptions options, IProgress<double> progress, CancellationToken cancellationToken) { _logger.Debug("Sending {0} to {1}. Remote path: {2}", inputPath, provider.Name, string.Join("/", pathParts)); + var supportsDirectCopy = provider as ISupportsDirectCopy; + if (supportsDirectCopy != null) + { + return await supportsDirectCopy.SendFile(inputPath, pathParts, target, progress, cancellationToken).ConfigureAwait(false); + } + using (var fileStream = _fileSystem.GetFileStream(inputPath, FileMode.Open, FileAccess.Read, FileShare.Read, true)) { Stream stream = fileStream; diff --git a/MediaBrowser.Server.Implementations/UserViews/DynamicImageProvider.cs b/MediaBrowser.Server.Implementations/UserViews/DynamicImageProvider.cs index b07caa1bd..918d07f97 100644 --- a/MediaBrowser.Server.Implementations/UserViews/DynamicImageProvider.cs +++ b/MediaBrowser.Server.Implementations/UserViews/DynamicImageProvider.cs @@ -41,8 +41,7 @@ namespace MediaBrowser.Server.Implementations.UserViews return new List<ImageType> { - ImageType.Primary, - ImageType.Thumb + ImageType.Primary }; } diff --git a/MediaBrowser.Server.Startup.Common/ApplicationHost.cs b/MediaBrowser.Server.Startup.Common/ApplicationHost.cs index bed3aac63..fab6682d7 100644 --- a/MediaBrowser.Server.Startup.Common/ApplicationHost.cs +++ b/MediaBrowser.Server.Startup.Common/ApplicationHost.cs @@ -38,6 +38,7 @@ using MediaBrowser.Controller.Providers; using MediaBrowser.Controller.Resolvers; using MediaBrowser.Controller.Security; using MediaBrowser.Controller.Session; +using MediaBrowser.Controller.Social; using MediaBrowser.Controller.Sorting; using MediaBrowser.Controller.Subtitles; using MediaBrowser.Controller.Sync; @@ -84,6 +85,7 @@ using MediaBrowser.Server.Implementations.Playlists; using MediaBrowser.Server.Implementations.Security; using MediaBrowser.Server.Implementations.ServerManager; using MediaBrowser.Server.Implementations.Session; +using MediaBrowser.Server.Implementations.Social; using MediaBrowser.Server.Implementations.Sync; using MediaBrowser.Server.Implementations.Themes; using MediaBrowser.Server.Implementations.TV; @@ -522,6 +524,10 @@ namespace MediaBrowser.Server.Startup.Common MediaEncoder, ChapterManager); RegisterSingleInstance(EncodingManager); + var sharingRepo = new SharingRepository(LogManager, ApplicationPaths); + await sharingRepo.Initialize().ConfigureAwait(false); + RegisterSingleInstance<ISharingManager>(new SharingManager(sharingRepo, ServerConfigurationManager, LibraryManager, this)); + RegisterSingleInstance<ISsdpHandler>(new SsdpHandler(LogManager.GetLogger("SsdpHandler"), ServerConfigurationManager, this)); var activityLogRepo = await GetActivityLogRepository().ConfigureAwait(false); diff --git a/MediaBrowser.Server.Startup.Common/EntryPoints/KeepServerAwake.cs b/MediaBrowser.Server.Startup.Common/EntryPoints/KeepServerAwake.cs index 1651dfae2..ba335868d 100644 --- a/MediaBrowser.Server.Startup.Common/EntryPoints/KeepServerAwake.cs +++ b/MediaBrowser.Server.Startup.Common/EntryPoints/KeepServerAwake.cs @@ -27,7 +27,7 @@ namespace MediaBrowser.Server.Startup.Common.EntryPoints _timer = new Timer(obj => { var now = DateTime.UtcNow; - if (_sessionManager.Sessions.Any(i => (now - i.LastActivityDate).TotalMinutes < 5)) + if (_sessionManager.Sessions.Any(i => (now - i.LastActivityDate).TotalMinutes < 15)) { KeepAlive(); } diff --git a/MediaBrowser.ServerApplication/EntryPoints/ResourceEntryPoint.cs b/MediaBrowser.ServerApplication/EntryPoints/ResourceEntryPoint.cs deleted file mode 100644 index e7a33d864..000000000 --- a/MediaBrowser.ServerApplication/EntryPoints/ResourceEntryPoint.cs +++ /dev/null @@ -1,38 +0,0 @@ -using MediaBrowser.Controller.Plugins; -using System; -using System.Threading; - -namespace MediaBrowser.ServerApplication.EntryPoints -{ - public class ResourceEntryPoint : IServerEntryPoint - { - private Timer _timer; - - public void Run() - { - _timer = new Timer(TimerCallback, null, TimeSpan.FromMinutes(1), TimeSpan.FromMinutes(30)); - } - - private void TimerCallback(object state) - { - try - { - // Bad practice, i know. But we keep a lot in memory, unfortunately. - GC.Collect(2, GCCollectionMode.Forced, true); - GC.Collect(2, GCCollectionMode.Forced, true); - } - catch - { - } - } - - public void Dispose() - { - if (_timer != null) - { - _timer.Dispose(); - _timer = null; - } - } - } -} diff --git a/MediaBrowser.ServerApplication/MediaBrowser.ServerApplication.csproj b/MediaBrowser.ServerApplication/MediaBrowser.ServerApplication.csproj index 9b20ac717..c0830c8c9 100644 --- a/MediaBrowser.ServerApplication/MediaBrowser.ServerApplication.csproj +++ b/MediaBrowser.ServerApplication/MediaBrowser.ServerApplication.csproj @@ -99,7 +99,6 @@ <Compile Include="BackgroundServiceInstaller.cs"> <SubType>Component</SubType> </Compile> - <Compile Include="EntryPoints\ResourceEntryPoint.cs" /> <Compile Include="Native\NativeFileSystem.cs" /> <Compile Include="MainForm.cs"> <SubType>Form</SubType> diff --git a/MediaBrowser.ServerApplication/Properties/AssemblyInfo.cs b/MediaBrowser.ServerApplication/Properties/AssemblyInfo.cs index 080c12596..cd31fb953 100644 --- a/MediaBrowser.ServerApplication/Properties/AssemblyInfo.cs +++ b/MediaBrowser.ServerApplication/Properties/AssemblyInfo.cs @@ -5,11 +5,11 @@ using System.Runtime.InteropServices; // General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information // associated with an assembly. -[assembly: AssemblyTitle("Media Browser Server")] +[assembly: AssemblyTitle("Emby Server")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("Media Browser Server")] +[assembly: AssemblyProduct("Emby Server")] [assembly: AssemblyCopyright("Copyright © 2013")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] diff --git a/MediaBrowser.WebDashboard/Api/DashboardService.cs b/MediaBrowser.WebDashboard/Api/DashboardService.cs index 72744f249..ce8ad58dd 100644 --- a/MediaBrowser.WebDashboard/Api/DashboardService.cs +++ b/MediaBrowser.WebDashboard/Api/DashboardService.cs @@ -272,6 +272,12 @@ namespace MediaBrowser.WebDashboard.Api return Path.GetExtension(path).EndsWith("html", StringComparison.OrdinalIgnoreCase); } + private void CopyFile(string src, string dst) + { + Directory.CreateDirectory(Path.GetDirectoryName(dst)); + File.Copy(src, dst, true); + } + public async Task<object> Get(GetDashboardPackage request) { var path = Path.Combine(_serverConfigurationManager.ApplicationPaths.ProgramDataPath, @@ -299,20 +305,30 @@ namespace MediaBrowser.WebDashboard.Api if (string.Equals(mode, "cordova", StringComparison.OrdinalIgnoreCase)) { // Overwrite certain files with cordova specific versions - var cordovaVersion = Path.Combine(path, "thirdparty", "cordova", "registrationservices.js"); + var cordovaVersion = Path.Combine(path, "cordova", "registrationservices.js"); File.Copy(cordovaVersion, Path.Combine(path, "scripts", "registrationservices.js"), true); File.Delete(cordovaVersion); // Delete things that are unneeded in an attempt to keep the output as trim as possible Directory.Delete(Path.Combine(path, "css", "images", "tour"), true); - Directory.Delete(Path.Combine(path, "thirdparty", "apiclient", "alt"), true); + Directory.Delete(Path.Combine(path, "apiclient", "alt"), true); File.Delete(Path.Combine(path, "thirdparty", "jquerymobile-1.4.5", "jquery.mobile-1.4.5.min.map")); + + Directory.Delete(Path.Combine(path, "bower_components"), true); + Directory.Delete(Path.Combine(path, "thirdparty", "viblast"), true); + + // But we do need this + CopyFile(Path.Combine(creator.DashboardUIPath, "bower_components", "webcomponentsjs", "webcomponents-lite.min.js"), Path.Combine(path, "bower_components", "webcomponentsjs", "webcomponents-lite.min.js")); + CopyFile(Path.Combine(creator.DashboardUIPath, "bower_components", "velocity", "velocity.min.js"), Path.Combine(path, "bower_components", "velocity", "velocity.min.js")); + CopyDirectory(Path.Combine(creator.DashboardUIPath, "bower_components", "swipebox", "src", "css"), Path.Combine(path, "bower_components", "swipebox", "src", "css")); + CopyDirectory(Path.Combine(creator.DashboardUIPath, "bower_components", "swipebox", "src", "js"), Path.Combine(path, "bower_components", "swipebox", "src", "js")); + CopyDirectory(Path.Combine(creator.DashboardUIPath, "bower_components", "swipebox", "src", "img"), Path.Combine(path, "bower_components", "swipebox", "src", "img")); } MinifyCssDirectory(Path.Combine(path, "css")); MinifyJsDirectory(Path.Combine(path, "scripts")); - MinifyJsDirectory(Path.Combine(path, "thirdparty", "apiclient")); + MinifyJsDirectory(Path.Combine(path, "apiclient")); MinifyJsDirectory(Path.Combine(path, "voice")); await DumpHtml(creator.DashboardUIPath, path, mode, culture, appVersion); diff --git a/MediaBrowser.WebDashboard/Api/PackageCreator.cs b/MediaBrowser.WebDashboard/Api/PackageCreator.cs index dd1eba9a5..c50f98c33 100644 --- a/MediaBrowser.WebDashboard/Api/PackageCreator.cs +++ b/MediaBrowser.WebDashboard/Api/PackageCreator.cs @@ -61,7 +61,10 @@ namespace MediaBrowser.WebDashboard.Api // jQuery ajax doesn't seem to handle if-modified-since correctly if (IsFormat(path, "html")) { - resourceStream = await ModifyHtml(resourceStream, mode, localizationCulture, enableMinification).ConfigureAwait(false); + if (IsCoreHtml(path)) + { + resourceStream = await ModifyHtml(resourceStream, mode, localizationCulture, enableMinification).ConfigureAwait(false); + } } else if (IsFormat(path, "js")) { @@ -121,6 +124,15 @@ namespace MediaBrowser.WebDashboard.Api var fullPath = Path.Combine(rootPath, virtualPath.Replace('/', Path.DirectorySeparatorChar)); + try + { + fullPath = Path.GetFullPath(fullPath); + } + catch (Exception ex) + { + _logger.ErrorException("Error in Path.GetFullPath", ex); + } + // Don't allow file system access outside of the source folder if (!_fileSystem.ContainsSubPath(rootPath, fullPath)) { @@ -210,6 +222,22 @@ namespace MediaBrowser.WebDashboard.Api } } + private bool IsCoreHtml(string path) + { + if (path.IndexOf("vulcanize", StringComparison.OrdinalIgnoreCase) != -1) + { + return false; + } + + path = GetDashboardResourcePath(path); + var parent = Path.GetDirectoryName(path); + + var basePath = DashboardUIPath; + + return string.Equals(basePath, parent, StringComparison.OrdinalIgnoreCase) || + string.Equals(Path.Combine(basePath, "voice"), parent, StringComparison.OrdinalIgnoreCase); + } + /// <summary> /// Modifies the HTML by adding common meta tags, css and js. /// </summary> @@ -241,7 +269,9 @@ namespace MediaBrowser.WebDashboard.Api html = _localization.LocalizeDocument(html, localizationCulture, GetLocalizationToken); - html = html.Replace("<html>", "<html lang=\"" + lang + "\">"); + html = html.Replace("<html>", "<html lang=\"" + lang + "\">") + .Replace("<body>", "<body><paper-drawer-panel class=\"mainDrawerPanel mainDrawerPanelPreInit\" forceNarrow><div class=\"mainDrawer\" drawer></div><div main><div class=\"pageContainer\">") + .Replace("</body>", "</div></div></paper-drawer-panel></body>"); } if (enableMinification) @@ -274,10 +304,17 @@ namespace MediaBrowser.WebDashboard.Api var version = GetType().Assembly.GetName().Version; - var imports = "<link rel=\"import\" href=\"thirdparty/polymer/polymer.html\">"; - imports = ""; + var imports = new string[] + { + "vulcanize-out.html" + }; + var importsHtml = string.Join("", imports.Select(i => "<link rel=\"import\" href=\"" + i + "\">").ToArray()); + + // It would be better to make polymer completely dynamic and loaded on demand, but seeing issues with that + // In chrome it is causing the body to be hidden while loading, which leads to width-check methods to return 0 for everything + //imports = ""; - html = html.Replace("<head>", "<head>" + GetMetaTags(mode) + GetCommonCss(mode, version) + GetCommonJavascript(mode, version) + imports); + html = html.Replace("<head>", "<head>" + GetMetaTags(mode) + GetCommonCss(mode, version) + GetCommonJavascript(mode, version) + importsHtml); var bytes = Encoding.UTF8.GetBytes(html); @@ -333,13 +370,13 @@ namespace MediaBrowser.WebDashboard.Api if (string.Equals(mode, "cordova", StringComparison.OrdinalIgnoreCase)) { - sb.Append("<meta http-equiv=\"Content-Security-Policy\" content=\"default-src *; style-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-inline' 'unsafe-eval'\">"); + //sb.Append("<meta http-equiv=\"Content-Security-Policy\" content=\"default-src *; style-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-inline' 'unsafe-eval'\">"); } sb.Append("<meta http-equiv=\"X-UA-Compatibility\" content=\"IE=Edge\">"); sb.Append("<meta name=\"format-detection\" content=\"telephone=no\">"); sb.Append("<meta name=\"msapplication-tap-highlight\" content=\"no\">"); - sb.Append("<meta name=\"viewport\" content=\"user-scalable=no, initial-scale=1, maximum-scale=1, minimum-scale=1, width=device-width, target-densitydpi=device-dpi\">"); + sb.Append("<meta name=\"viewport\" content=\"user-scalable=no, initial-scale=1, maximum-scale=1, minimum-scale=1, width=device-width\">"); sb.Append("<meta name=\"apple-mobile-web-app-capable\" content=\"yes\">"); sb.Append("<meta name=\"mobile-web-app-capable\" content=\"yes\">"); sb.Append("<meta name=\"application-name\" content=\"Emby\">"); @@ -347,6 +384,14 @@ namespace MediaBrowser.WebDashboard.Api sb.Append("<meta name=\"robots\" content=\"noindex, nofollow, noarchive\" />"); + // Open graph tags + sb.Append("<meta property=\"og:title\" content=\"Emby\" />"); + sb.Append("<meta property=\"og:site_name\" content=\"Emby\"/>"); + sb.Append("<meta property=\"og:url\" content=\"http://emby.media\" />"); + sb.Append("<meta property=\"og:description\" content=\"Energize your media.\" />"); + sb.Append("<meta property=\"og:type\" content=\"article\" />"); + sb.Append("<meta property=\"fb:app_id\" content=\"1618309211750238\" />"); + // http://developer.apple.com/library/ios/#DOCUMENTATION/AppleApplications/Reference/SafariWebContent/ConfiguringWebApplications/ConfiguringWebApplications.html sb.Append("<link rel=\"apple-touch-icon\" href=\"css/images/touchicon.png\" />"); sb.Append("<link rel=\"apple-touch-icon\" sizes=\"72x72\" href=\"css/images/touchicon72.png\" />"); @@ -354,7 +399,7 @@ namespace MediaBrowser.WebDashboard.Api sb.Append("<link rel=\"apple-touch-startup-image\" href=\"css/images/iossplash.png\" />"); sb.Append("<link rel=\"shortcut icon\" href=\"css/images/favicon.ico\" />"); sb.Append("<meta name=\"msapplication-TileImage\" content=\"css/images/touchicon144.png\">"); - sb.Append("<meta name=\"msapplication-TileColor\" content=\"#23456B\">"); + sb.Append("<meta name=\"msapplication-TileColor\" content=\"#333333\">"); return sb.ToString(); } @@ -371,9 +416,7 @@ namespace MediaBrowser.WebDashboard.Api var files = new[] { - "thirdparty/jquerymobile-1.4.5/jquery.mobile-1.4.5.min.css", "thirdparty/fontawesome/css/font-awesome.min.css" + versionString, - "thirdparty/materialicons/style.css" + versionString, "css/all.css" + versionString }; @@ -396,7 +439,6 @@ namespace MediaBrowser.WebDashboard.Api var files = new List<string> { - //"thirdparty/webcomponentsjs/webcomponents-lite.min.js", "scripts/all.js" + versionString }; @@ -421,9 +463,10 @@ namespace MediaBrowser.WebDashboard.Api var memoryStream = new MemoryStream(); var newLineBytes = Encoding.UTF8.GetBytes(Environment.NewLine); - // jQuery + jQuery mobile + await AppendResource(memoryStream, "bower_components/webcomponentsjs/webcomponents-lite.min.js", newLineBytes).ConfigureAwait(false); + await AppendResource(memoryStream, "thirdparty/jquery-2.1.1.min.js", newLineBytes).ConfigureAwait(false); - await AppendResource(memoryStream, "thirdparty/jquerymobile-1.4.5/jquery.mobile-1.4.5.min.js", newLineBytes).ConfigureAwait(false); + await AppendResource(memoryStream, "thirdparty/jquerymobile-1.4.5/jquery.mobile.custom.min.js", newLineBytes).ConfigureAwait(false); await AppendResource(memoryStream, "thirdparty/browser.js", newLineBytes).ConfigureAwait(false); @@ -458,19 +501,19 @@ namespace MediaBrowser.WebDashboard.Api var apiClientFiles = new[] { - "thirdparty/apiclient/logger.js", - "thirdparty/apiclient/md5.js", - "thirdparty/apiclient/sha1.js", - "thirdparty/apiclient/store.js", - "thirdparty/apiclient/device.js", - "thirdparty/apiclient/credentials.js", - "thirdparty/apiclient/ajax.js", - "thirdparty/apiclient/events.js", - "thirdparty/apiclient/deferred.js", - "thirdparty/apiclient/apiclient.js" + "apiclient/logger.js", + "apiclient/md5.js", + "apiclient/sha1.js", + "apiclient/store.js", + "apiclient/device.js", + "apiclient/credentials.js", + "apiclient/ajax.js", + "apiclient/events.js", + "apiclient/deferred.js", + "apiclient/apiclient.js" }.ToList(); - apiClientFiles.Add("thirdparty/apiclient/connectionmanager.js"); + apiClientFiles.Add("apiclient/connectionmanager.js"); foreach (var file in apiClientFiles) { @@ -615,34 +658,37 @@ namespace MediaBrowser.WebDashboard.Api /// <returns>Task{Stream}.</returns> private async Task<Stream> GetAllCss(bool enableMinification) { + var memoryStream = new MemoryStream(); + var newLineBytes = Encoding.UTF8.GetBytes(Environment.NewLine); + + await AppendResource(memoryStream, "thirdparty/jquerymobile-1.4.5/jquery.mobile.custom.theme.min.css", newLineBytes).ConfigureAwait(false); + await AppendResource(memoryStream, "thirdparty/jquerymobile-1.4.5/jquery.mobile.custom.structure.min.css", newLineBytes).ConfigureAwait(false); + var files = new[] { - "site.css", - "chromecast.css", - "mediaplayer.css", - "mediaplayer-video.css", - "librarymenu.css", - "librarybrowser.css", - "detailtable.css", - "card.css", - "tileitem.css", - "metadataeditor.css", - "notifications.css", - "search.css", - "pluginupdates.css", - "remotecontrol.css", - "userimage.css", - "livetv.css", - "nowplaying.css", - "icons.css", - "materialize.css" + "css/site.css", + "css/chromecast.css", + "css/nowplayingbar.css", + "css/mediaplayer.css", + "css/mediaplayer-video.css", + "css/librarymenu.css", + "css/librarybrowser.css", + "css/card.css", + "css/notifications.css", + "css/search.css", + "css/pluginupdates.css", + "css/remotecontrol.css", + "css/userimage.css", + "css/nowplaying.css", + "css/materialize.css", + "thirdparty/paper-button-style.css" }; var builder = new StringBuilder(); foreach (var file in files) { - var path = GetDashboardResourcePath("css/" + file); + var path = GetDashboardResourcePath(file); using (var fs = _fileSystem.GetFileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite, true)) { @@ -678,7 +724,8 @@ namespace MediaBrowser.WebDashboard.Api } } - var memoryStream = new MemoryStream(Encoding.UTF8.GetBytes(css)); + var bytes = Encoding.UTF8.GetBytes(css); + memoryStream.Write(bytes, 0, bytes.Length); memoryStream.Position = 0; return memoryStream; diff --git a/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj b/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj index b987f2069..c8c9c4d3c 100644 --- a/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj +++ b/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj @@ -87,6 +87,52 @@ </ProjectReference>
</ItemGroup>
<ItemGroup>
+ <Content Include="dashboard-ui\bower_components\swipebox\src\css\swipebox.min.css">
+ <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+ </Content>
+ <Content Include="dashboard-ui\bower_components\swipebox\src\img\icons.png">
+ <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+ </Content>
+ <Content Include="dashboard-ui\bower_components\swipebox\src\img\icons.svg">
+ <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+ </Content>
+ <Content Include="dashboard-ui\bower_components\swipebox\src\js\jquery.swipebox.min.js">
+ <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+ </Content>
+ <Content Include="dashboard-ui\bower_components\velocity\velocity.min.js">
+ <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+ </Content>
+ <Content Include="dashboard-ui\bower_components\webcomponentsjs\CustomElements.js" />
+ <Content Include="dashboard-ui\bower_components\webcomponentsjs\CustomElements.min.js">
+ <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+ </Content>
+ <Content Include="dashboard-ui\bower_components\webcomponentsjs\HTMLImports.js" />
+ <Content Include="dashboard-ui\bower_components\webcomponentsjs\HTMLImports.min.js" />
+ <Content Include="dashboard-ui\bower_components\webcomponentsjs\MutationObserver.js" />
+ <Content Include="dashboard-ui\bower_components\webcomponentsjs\MutationObserver.min.js">
+ <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+ </Content>
+ <Content Include="dashboard-ui\bower_components\webcomponentsjs\ShadowDOM.js" />
+ <Content Include="dashboard-ui\bower_components\webcomponentsjs\ShadowDOM.min.js">
+ <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+ </Content>
+ <Content Include="dashboard-ui\bower_components\webcomponentsjs\webcomponents-lite.js" />
+ <Content Include="dashboard-ui\bower_components\webcomponentsjs\webcomponents-lite.min.js">
+ <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+ </Content>
+ <Content Include="dashboard-ui\bower_components\webcomponentsjs\webcomponents.js" />
+ <Content Include="dashboard-ui\bower_components\webcomponentsjs\webcomponents.min.js">
+ <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+ </Content>
+ <Content Include="dashboard-ui\cordova\android\logging.js">
+ <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+ </Content>
+ <Content Include="dashboard-ui\cordova\searchmenu.js">
+ <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+ </Content>
+ <Content Include="dashboard-ui\cordova\sharingwidget.js">
+ <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+ </Content>
<Content Include="dashboard-ui\css\images\clients\androidtv-tile.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
@@ -102,6 +148,9 @@ <Content Include="dashboard-ui\css\images\splash.jpg">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
+ <Content Include="dashboard-ui\css\images\splash720.jpg">
+ <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+ </Content>
<Content Include="dashboard-ui\css\images\touchicon144.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
@@ -114,6 +163,66 @@ <Content Include="dashboard-ui\css\images\tour\web\tourmysync.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
+ <Content Include="dashboard-ui\css\nowplayingbar.css">
+ <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+ </Content>
+ <Content Include="dashboard-ui\livetvchannels.html">
+ <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+ </Content>
+ <Content Include="dashboard-ui\livetvguide.html">
+ <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+ </Content>
+ <Content Include="dashboard-ui\livetvrecordings.html">
+ <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+ </Content>
+ <Content Include="dashboard-ui\livetvseriestimers.html">
+ <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+ </Content>
+ <Content Include="dashboard-ui\livetvtimers.html">
+ <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+ </Content>
+ <Content Include="dashboard-ui\mypreferenceshome.html">
+ <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+ </Content>
+ <Content Include="dashboard-ui\scripts\actionsheet.js">
+ <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+ </Content>
+ <Content Include="dashboard-ui\scripts\homenextup.js">
+ <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+ </Content>
+ <Content Include="dashboard-ui\scripts\homeupcoming.js">
+ <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+ </Content>
+ <Content Include="dashboard-ui\scripts\mypreferenceshome.js">
+ <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+ </Content>
+ <Content Include="dashboard-ui\scripts\searchmenu.js">
+ <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+ </Content>
+ <Content Include="dashboard-ui\scripts\secondaryitems.js">
+ <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+ </Content>
+ <Content Include="dashboard-ui\scripts\shared.js">
+ <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+ </Content>
+ <Content Include="dashboard-ui\scripts\sharingmanager.js">
+ <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+ </Content>
+ <Content Include="dashboard-ui\scripts\sharingwidget.js">
+ <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+ </Content>
+ <Content Include="dashboard-ui\secondaryitems.html">
+ <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+ </Content>
+ <Content Include="dashboard-ui\shared.html">
+ <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+ </Content>
+ <Content Include="dashboard-ui\themes\android.css">
+ <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+ </Content>
+ <Content Include="dashboard-ui\themes\ios.css">
+ <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+ </Content>
<Content Include="dashboard-ui\css\materialize.css">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
@@ -123,70 +232,90 @@ <Content Include="dashboard-ui\scripts\sections.js">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
- <Content Include="dashboard-ui\thirdparty\apiclient\localassetmanager.js">
+ <Content Include="dashboard-ui\apiclient\localassetmanager.js">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
- <Content Include="dashboard-ui\thirdparty\apiclient\wakeonlan.js">
+ <Content Include="dashboard-ui\apiclient\wakeonlan.js">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
- <Content Include="dashboard-ui\thirdparty\cordova\android\appstorage.js">
+ <Content Include="dashboard-ui\cordova\android\appstorage.js">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
- <Content Include="dashboard-ui\thirdparty\cordova\android\localassetmanager.js">
+ <Content Include="dashboard-ui\cordova\android\localassetmanager.js">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
- <Content Include="dashboard-ui\thirdparty\cordova\android\mediasession.js">
+ <Content Include="dashboard-ui\cordova\android\mediasession.js">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
- <Content Include="dashboard-ui\thirdparty\cordova\android\nativedirectorychooser.js">
+ <Content Include="dashboard-ui\cordova\android\nativedirectorychooser.js">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
- <Content Include="dashboard-ui\thirdparty\cordova\android\vlcplayer.js">
+ <Content Include="dashboard-ui\cordova\android\vlcplayer.js">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
- <Content Include="dashboard-ui\thirdparty\cordova\back.js">
+ <Content Include="dashboard-ui\cordova\back.js">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
- <Content Include="dashboard-ui\thirdparty\cordova\ios\orientation.js">
+ <Content Include="dashboard-ui\cordova\ios\actionsheet.js">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
- <Content Include="dashboard-ui\thirdparty\cordova\volume.js">
+ <Content Include="dashboard-ui\cordova\ios\orientation.js">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
- <Content Include="dashboard-ui\thirdparty\cordova\wakeonlan.js">
+ <Content Include="dashboard-ui\cordova\volume.js">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
- <Content Include="dashboard-ui\thirdparty\polymer\LICENSE.txt">
+ <Content Include="dashboard-ui\cordova\wakeonlan.js">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
- <Content Include="dashboard-ui\thirdparty\polymer\polymer-micro.html">
+ <Content Include="dashboard-ui\thirdparty\emby-icons.html">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
- <Content Include="dashboard-ui\thirdparty\polymer\polymer-mini.html">
+ <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.5\jquery.mobile.custom.icons.css">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
- <Content Include="dashboard-ui\thirdparty\polymer\polymer.html">
+ <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.5\jquery.mobile.custom.js">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
- <Content Include="dashboard-ui\thirdparty\velocity.min.js">
+ <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.5\jquery.mobile.custom.min.js">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
- <Content Include="dashboard-ui\thirdparty\webcomponentsjs\CustomElements.min.js">
+ <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.5\jquery.mobile.custom.structure.css">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
- <Content Include="dashboard-ui\thirdparty\webcomponentsjs\HTMLImports.min.js">
+ <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.5\jquery.mobile.custom.structure.min.css">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
- <Content Include="dashboard-ui\thirdparty\webcomponentsjs\MutationObserver.min.js">
+ <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.5\jquery.mobile.custom.theme.css">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
- <Content Include="dashboard-ui\thirdparty\webcomponentsjs\ShadowDOM.min.js">
+ <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.5\jquery.mobile.custom.theme.min.css">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
- <Content Include="dashboard-ui\thirdparty\webcomponentsjs\webcomponents-lite.min.js">
+ <Content Include="dashboard-ui\thirdparty\paper-button-style.css">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
- <Content Include="dashboard-ui\thirdparty\webcomponentsjs\webcomponents.min.js">
+ <Content Include="dashboard-ui\thirdparty\social-share-kit-1.0.4\.gitignore" />
+ <Content Include="dashboard-ui\thirdparty\social-share-kit-1.0.4\dist\css\social-share-kit.css">
+ <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+ </Content>
+ <Content Include="dashboard-ui\thirdparty\social-share-kit-1.0.4\dist\fonts\social-share-kit.svg">
+ <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+ </Content>
+ <Content Include="dashboard-ui\thirdparty\social-share-kit-1.0.4\dist\js\social-share-kit.js" />
+ <Content Include="dashboard-ui\thirdparty\social-share-kit-1.0.4\dist\js\social-share-kit.min.js">
+ <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+ </Content>
+ <Content Include="dashboard-ui\thirdparty\viblast\viblast.crypto.js">
+ <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+ </Content>
+ <Content Include="dashboard-ui\thirdparty\viblast\viblast.js">
+ <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+ </Content>
+ <Content Include="dashboard-ui\thirdparty\viblast\viblast.msp.js">
+ <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+ </Content>
+ <Content Include="dashboard-ui\thirdparty\viblast\worker.html">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="dashboard-ui\voice\voice.css">
@@ -294,75 +423,75 @@ <Content Include="dashboard-ui\syncsettings.html">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
- <Content Include="dashboard-ui\thirdparty\apiclient\ajax.js">
+ <Content Include="dashboard-ui\apiclient\ajax.js">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
- <Content Include="dashboard-ui\thirdparty\apiclient\alt\ajax.js">
+ <Content Include="dashboard-ui\apiclient\alt\ajax.js">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
- <Content Include="dashboard-ui\thirdparty\apiclient\alt\bean.js">
+ <Content Include="dashboard-ui\apiclient\alt\bean.js">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
- <Content Include="dashboard-ui\thirdparty\apiclient\alt\events.js">
+ <Content Include="dashboard-ui\apiclient\alt\events.js">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
- <Content Include="dashboard-ui\thirdparty\apiclient\connectservice.js">
+ <Content Include="dashboard-ui\apiclient\connectservice.js">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
- <Content Include="dashboard-ui\thirdparty\cordova\android\androidcredentials.js">
+ <Content Include="dashboard-ui\cordova\android\androidcredentials.js">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
- <Content Include="dashboard-ui\thirdparty\cordova\android\filesystem.js">
+ <Content Include="dashboard-ui\cordova\android\filesystem.js">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
- <Content Include="dashboard-ui\thirdparty\cordova\android\iap.js">
+ <Content Include="dashboard-ui\cordova\android\iap.js">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
- <Content Include="dashboard-ui\thirdparty\cordova\android\immersive.js" />
- <Content Include="dashboard-ui\thirdparty\cordova\chromecast.js">
+ <Content Include="dashboard-ui\cordova\android\immersive.js" />
+ <Content Include="dashboard-ui\cordova\chromecast.js">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
- <Content Include="dashboard-ui\thirdparty\cordova\connectsdk.js">
+ <Content Include="dashboard-ui\cordova\connectsdk.js">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
- <Content Include="dashboard-ui\thirdparty\cordova\externalplayer.js">
+ <Content Include="dashboard-ui\cordova\externalplayer.js">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
- <Content Include="dashboard-ui\thirdparty\cordova\filesystem.js">
+ <Content Include="dashboard-ui\cordova\filesystem.js">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
- <Content Include="dashboard-ui\thirdparty\cordova\generaldevice.js" />
- <Content Include="dashboard-ui\thirdparty\cordova\iap.js">
+ <Content Include="dashboard-ui\cordova\generaldevice.js" />
+ <Content Include="dashboard-ui\cordova\iap.js">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
- <Content Include="dashboard-ui\thirdparty\cordova\imagestore.js">
+ <Content Include="dashboard-ui\cordova\imagestore.js">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
- <Content Include="dashboard-ui\thirdparty\cordova\registrationservices.js">
+ <Content Include="dashboard-ui\cordova\registrationservices.js">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
- <Content Include="dashboard-ui\thirdparty\cordova\remotecontrols.js">
+ <Content Include="dashboard-ui\cordova\remotecontrols.js">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
- <Content Include="dashboard-ui\thirdparty\cordova\serverdiscovery.js">
+ <Content Include="dashboard-ui\cordova\serverdiscovery.js">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
- <Content Include="dashboard-ui\thirdparty\apiclient\deferred.js">
+ <Content Include="dashboard-ui\apiclient\deferred.js">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
- <Content Include="dashboard-ui\thirdparty\apiclient\alt\deferred.js">
+ <Content Include="dashboard-ui\apiclient\alt\deferred.js">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
- <Content Include="dashboard-ui\thirdparty\apiclient\device.js">
+ <Content Include="dashboard-ui\apiclient\device.js">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
- <Content Include="dashboard-ui\thirdparty\apiclient\events.js">
+ <Content Include="dashboard-ui\apiclient\events.js">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
- <Content Include="dashboard-ui\thirdparty\apiclient\logger.js">
+ <Content Include="dashboard-ui\apiclient\logger.js">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
- <Content Include="dashboard-ui\thirdparty\apiclient\apiclient.js">
+ <Content Include="dashboard-ui\apiclient\apiclient.js">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="dashboard-ui\channelitems.html">
@@ -386,9 +515,6 @@ <Content Include="dashboard-ui\css\chromecast.css">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
- <Content Include="dashboard-ui\css\icons.css">
- <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
- </Content>
<Content Include="dashboard-ui\css\images\clients\amazon.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
@@ -407,51 +533,6 @@ <Content Include="dashboard-ui\css\images\favicon.ico">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
- <Content Include="dashboard-ui\css\images\icons\ellipsis-v.png">
- <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
- </Content>
- <Content Include="dashboard-ui\css\images\icons\remote.png">
- <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
- </Content>
- <Content Include="dashboard-ui\css\images\icons\audiocd.png">
- <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
- </Content>
- <Content Include="dashboard-ui\css\images\icons\expand.png">
- <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
- </Content>
- <Content Include="dashboard-ui\css\images\icons\filter.png">
- <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
- </Content>
- <Content Include="dashboard-ui\css\images\icons\mute.png">
- <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
- </Content>
- <Content Include="dashboard-ui\css\images\icons\nexttrack.png">
- <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
- </Content>
- <Content Include="dashboard-ui\css\images\icons\pause.png">
- <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
- </Content>
- <Content Include="dashboard-ui\css\images\icons\play.png">
- <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
- </Content>
- <Content Include="dashboard-ui\css\images\icons\previoustrack.png">
- <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
- </Content>
- <Content Include="dashboard-ui\css\images\icons\sort.png">
- <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
- </Content>
- <Content Include="dashboard-ui\css\images\icons\stop.png">
- <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
- </Content>
- <Content Include="dashboard-ui\css\images\icons\subtitles.png">
- <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
- </Content>
- <Content Include="dashboard-ui\css\images\icons\volumedown.png">
- <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
- </Content>
- <Content Include="dashboard-ui\css\images\icons\volumeup.png">
- <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
- </Content>
<Content Include="dashboard-ui\css\images\items\detail\tv.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
@@ -593,15 +674,9 @@ <Content Include="dashboard-ui\autoorganizelog.html">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
- <Content Include="dashboard-ui\favorites.html">
- <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
- </Content>
<Content Include="dashboard-ui\files\dummy.mp4">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
- <Content Include="dashboard-ui\homelatest.html">
- <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
- </Content>
<Content Include="dashboard-ui\librarypathmapping.html">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
@@ -614,9 +689,6 @@ <Content Include="dashboard-ui\mypreferenceslanguages.html">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
- <Content Include="dashboard-ui\mypreferenceswebclient.html">
- <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
- </Content>
<Content Include="dashboard-ui\notificationlist.html">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
@@ -656,9 +728,6 @@ <Content Include="dashboard-ui\livetvstatus.html">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
- <Content Include="dashboard-ui\livetvtimers.html">
- <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
- </Content>
<Content Include="dashboard-ui\metadatasubtitles.html">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
@@ -716,18 +785,6 @@ <Content Include="dashboard-ui\css\images\fresh.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
- <Content Include="dashboard-ui\css\images\items\searchhintsv2\film.png">
- <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
- </Content>
- <Content Include="dashboard-ui\css\images\items\searchhintsv2\game.png">
- <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
- </Content>
- <Content Include="dashboard-ui\css\images\items\searchhintsv2\music.png">
- <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
- </Content>
- <Content Include="dashboard-ui\css\images\items\searchhintsv2\person.png">
- <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
- </Content>
<Content Include="dashboard-ui\css\images\items\searchhintsv2\tv.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
@@ -740,27 +797,12 @@ <Content Include="dashboard-ui\css\images\items\detail\person.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
- <Content Include="dashboard-ui\css\images\items\list\audio.png">
- <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
- </Content>
- <Content Include="dashboard-ui\css\images\items\list\audiocollection.png">
- <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
- </Content>
<Content Include="dashboard-ui\css\images\items\list\chapter.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
- <Content Include="dashboard-ui\css\images\items\list\game.png">
- <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
- </Content>
- <Content Include="dashboard-ui\css\images\items\list\gamecollection.png">
- <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
- </Content>
<Content Include="dashboard-ui\css\images\items\list\person.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
- <Content Include="dashboard-ui\css\images\items\list\video.png">
- <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
- </Content>
<Content Include="dashboard-ui\css\images\supporter\nonsupporterbadge.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
@@ -812,15 +854,6 @@ <Content Include="dashboard-ui\gamesystems.html">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
- <Content Include="dashboard-ui\livetvchannels.html">
- <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
- </Content>
- <Content Include="dashboard-ui\livetvguide.html">
- <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
- </Content>
- <Content Include="dashboard-ui\livetvrecordings.html">
- <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
- </Content>
<Content Include="dashboard-ui\notificationsetting.html">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
@@ -902,9 +935,6 @@ <Content Include="dashboard-ui\scripts\favorites.js">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
- <Content Include="dashboard-ui\scripts\homelatest.js">
- <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
- </Content>
<Content Include="dashboard-ui\scripts\librarylist.js">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
@@ -923,9 +953,6 @@ <Content Include="dashboard-ui\scripts\mypreferenceslanguages.js">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
- <Content Include="dashboard-ui\scripts\mypreferenceswebclient.js">
- <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
- </Content>
<Content Include="dashboard-ui\scripts\notificationlist.js">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
@@ -1046,25 +1073,22 @@ <Content Include="dashboard-ui\scripts\wizardsettings.js">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
- <Content Include="dashboard-ui\livetvseriestimers.html">
- <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
- </Content>
<Content Include="dashboard-ui\serversecurity.html">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
- <Content Include="dashboard-ui\thirdparty\apiclient\connectionmanager.js">
+ <Content Include="dashboard-ui\apiclient\connectionmanager.js">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
- <Content Include="dashboard-ui\thirdparty\apiclient\credentials.js">
+ <Content Include="dashboard-ui\apiclient\credentials.js">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
- <Content Include="dashboard-ui\thirdparty\apiclient\serverdiscovery.js">
+ <Content Include="dashboard-ui\apiclient\serverdiscovery.js">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
- <Content Include="dashboard-ui\thirdparty\apiclient\sha1.js">
+ <Content Include="dashboard-ui\apiclient\sha1.js">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
- <Content Include="dashboard-ui\thirdparty\apiclient\store.js">
+ <Content Include="dashboard-ui\apiclient\store.js">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="dashboard-ui\thirdparty\browser.js">
@@ -1703,13 +1727,10 @@ <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.5\jquery.mobile-1.4.5.min.css">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
- <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.5\jquery.mobile-1.4.5.min.js">
- <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
- </Content>
<Content Include="dashboard-ui\livetvsuggested.html">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
- <Content Include="dashboard-ui\thirdparty\apiclient\md5.js">
+ <Content Include="dashboard-ui\apiclient\md5.js">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="dashboard-ui\thirdparty\jstree3.0.8\jstree.min.js">
@@ -1730,36 +1751,9 @@ <Content Include="dashboard-ui\thirdparty\jstree3.0.8\themes\default\throbber.gif">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
- <Content Include="dashboard-ui\thirdparty\masonry.pkgd.min.js">
- <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
- </Content>
- <Content Include="dashboard-ui\thirdparty\materialicons\codepoints.txt">
- <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
- </Content>
- <Content Include="dashboard-ui\thirdparty\materialicons\style.css">
- <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
- </Content>
<Content Include="dashboard-ui\thirdparty\require.js">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
- <Content Include="dashboard-ui\thirdparty\requirecss.js">
- <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
- </Content>
- <Content Include="dashboard-ui\thirdparty\swipebox-master\css\swipebox.min.css">
- <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
- </Content>
- <Content Include="dashboard-ui\thirdparty\swipebox-master\img\icons.png">
- <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
- </Content>
- <Content Include="dashboard-ui\thirdparty\swipebox-master\img\icons.svg">
- <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
- </Content>
- <Content Include="dashboard-ui\thirdparty\swipebox-master\img\loader.gif">
- <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
- </Content>
- <Content Include="dashboard-ui\thirdparty\swipebox-master\js\jquery.swipebox.min.js">
- <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
- </Content>
<Content Include="dashboard-ui\tvupcoming.html">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
@@ -1775,6 +1769,12 @@ <Content Include="dashboard-ui\userpassword.html">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
+ <Content Include="dashboard-ui\vulcanize-in.html">
+ <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+ </Content>
+ <Content Include="dashboard-ui\vulcanize-out.html">
+ <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+ </Content>
<Content Include="dashboard-ui\wizardagreement.html">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
@@ -2338,69 +2338,121 @@ </Content>
</ItemGroup>
<ItemGroup>
- <None Include="dashboard-ui\css\fonts\Montserrat.woff">
+ <None Include="dashboard-ui\bower_components\webcomponentsjs\.bower.json" />
+ <None Include="dashboard-ui\bower_components\webcomponentsjs\bower.json" />
+ <None Include="dashboard-ui\bower_components\webcomponentsjs\build.log" />
+ <None Include="dashboard-ui\bower_components\webcomponentsjs\package.json" />
+ <None Include="dashboard-ui\bower_components\webcomponentsjs\README.md" />
+ <None Include="dashboard-ui\css\fonts\roboto\RobotoBold.woff">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
- <None Include="dashboard-ui\css\fonts\RobotoBold.woff">
+ <None Include="dashboard-ui\css\fonts\roboto\RobotoLight.woff">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
- <None Include="dashboard-ui\css\fonts\RobotoLight.woff">
+ <None Include="dashboard-ui\css\fonts\roboto\RobotoMedium.woff">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
- <None Include="dashboard-ui\css\fonts\RobotoMedium.woff">
+ <None Include="dashboard-ui\css\fonts\roboto\RobotoRegular.woff">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
- <None Include="dashboard-ui\css\fonts\RobotoRegular.woff">
+ <None Include="dashboard-ui\css\fonts\roboto\RobotoThin.woff">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
- <None Include="dashboard-ui\css\fonts\RobotoThin.woff">
+ <None Include="dashboard-ui\css\fonts\roboto\-L14Jk06m6pUHB-5mXQQnRJtnKITppOI_IvcXXDNrsc.woff2">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
- <None Include="dashboard-ui\thirdparty\fontawesome\css\font-awesome.css.map">
+ <None Include="dashboard-ui\css\fonts\roboto\0eC6fl06luXEYWpBSJvXCBJtnKITppOI_IvcXXDNrsc.woff2">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
- <None Include="dashboard-ui\thirdparty\fontawesome\fonts\fontawesome-webfont.eot">
+ <None Include="dashboard-ui\css\fonts\roboto\2tsd397wLxj96qwHyNIkxPesZW2xOQ-xsNqO47m55DA.woff2">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
- <None Include="dashboard-ui\thirdparty\fontawesome\fonts\fontawesome-webfont.ttf">
+ <None Include="dashboard-ui\css\fonts\roboto\97uahxiqZRoncBaCEI3aWxJtnKITppOI_IvcXXDNrsc.woff2">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
- <None Include="dashboard-ui\thirdparty\fontawesome\fonts\fontawesome-webfont.woff">
+ <None Include="dashboard-ui\css\fonts\roboto\aZMswpodYeVhtRvuABJWvBTbgVql8nDJpwnrE27mub0.woff2">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
- <None Include="dashboard-ui\thirdparty\fontawesome\fonts\fontawesome-webfont.woff2">
+ <None Include="dashboard-ui\css\fonts\roboto\CWB0XYA8bzo0kSThX0UTuA.woff2">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
- <None Include="dashboard-ui\thirdparty\fontawesome\fonts\FontAwesome.otf">
+ <None Include="dashboard-ui\css\fonts\roboto\d-6IYplOFocCacKzxwXSOFtXRa8TVwTICgirnJhmVJw.woff2">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
- <None Include="dashboard-ui\thirdparty\jquerymobile-1.4.5\jquery.mobile-1.4.5.min.map">
+ <None Include="dashboard-ui\css\fonts\roboto\e7MeVAyvogMqFwwl61PKhBTbgVql8nDJpwnrE27mub0.woff2">
+ <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+ </None>
+ <None Include="dashboard-ui\css\fonts\roboto\Fcx7Wwv8OzT71A3E1XOAjvesZW2xOQ-xsNqO47m55DA.woff2">
+ <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+ </None>
+ <None Include="dashboard-ui\css\fonts\roboto\Fl4y0QdOxyyTHEGMXX8kcRJtnKITppOI_IvcXXDNrsc.woff2">
+ <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+ </None>
+ <None Include="dashboard-ui\css\fonts\roboto\frNV30OaYdlFRtH2VnZZdhTbgVql8nDJpwnrE27mub0.woff2">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
- <None Include="dashboard-ui\thirdparty\materialicons\MaterialIcons-Regular.eot">
+ <None Include="dashboard-ui\css\fonts\roboto\gwVJDERN2Amz39wrSoZ7FxTbgVql8nDJpwnrE27mub0.woff2">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
- <None Include="dashboard-ui\thirdparty\materialicons\MaterialIcons-Regular.ttf">
+ <None Include="dashboard-ui\css\fonts\Montserrat.woff">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
- <None Include="dashboard-ui\thirdparty\materialicons\MaterialIcons-Regular.woff">
+ <None Include="dashboard-ui\css\fonts\roboto\Hgo13k-tfSpn0qi1SFdUfVtXRa8TVwTICgirnJhmVJw.woff2">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
- <None Include="dashboard-ui\thirdparty\materialicons\MaterialIcons-Regular.woff2">
+ <None Include="dashboard-ui\css\fonts\roboto\I3S1wsgSg9YCurV6PUkTORJtnKITppOI_IvcXXDNrsc.woff2">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
- <None Include="dashboard-ui\thirdparty\polymer\bower.json">
+ <None Include="dashboard-ui\css\fonts\roboto\NYDWBdD4gIq26G5XYbHsFBJtnKITppOI_IvcXXDNrsc.woff2">
+ <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+ </None>
+ <None Include="dashboard-ui\css\fonts\roboto\oOeFwZNlrTefzLYmlVV1UBJtnKITppOI_IvcXXDNrsc.woff2">
+ <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+ </None>
+ <None Include="dashboard-ui\css\fonts\roboto\Pru33qjShpZSmG3z6VYwnRJtnKITppOI_IvcXXDNrsc.woff2">
+ <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+ </None>
+ <None Include="dashboard-ui\css\fonts\roboto\RxZJdnzeo3R5zSexge8UUVtXRa8TVwTICgirnJhmVJw.woff2">
+ <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+ </None>
+ <None Include="dashboard-ui\css\fonts\roboto\ty9dfvLAziwdqQ2dHoyjphTbgVql8nDJpwnrE27mub0.woff2">
+ <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+ </None>
+ <None Include="dashboard-ui\css\fonts\roboto\VvXUGKZXbHtX_S_VCTLpGhTbgVql8nDJpwnrE27mub0.woff2">
+ <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+ </None>
+ <None Include="dashboard-ui\thirdparty\fontawesome\css\font-awesome.css.map">
+ <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+ </None>
+ <None Include="dashboard-ui\thirdparty\fontawesome\fonts\fontawesome-webfont.eot">
+ <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+ </None>
+ <None Include="dashboard-ui\thirdparty\fontawesome\fonts\fontawesome-webfont.ttf">
+ <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+ </None>
+ <None Include="dashboard-ui\thirdparty\fontawesome\fonts\fontawesome-webfont.woff">
+ <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+ </None>
+ <None Include="dashboard-ui\thirdparty\fontawesome\fonts\fontawesome-webfont.woff2">
+ <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+ </None>
+ <None Include="dashboard-ui\thirdparty\fontawesome\fonts\FontAwesome.otf">
+ <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+ </None>
+ <None Include="dashboard-ui\thirdparty\jquerymobile-1.4.5\jquery.mobile-1.4.5.min.map">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
- <None Include="dashboard-ui\thirdparty\webcomponentsjs\bower.json">
+ <None Include="dashboard-ui\thirdparty\social-share-kit-1.0.4\dist\fonts\social-share-kit.eot">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
- <None Include="dashboard-ui\thirdparty\webcomponentsjs\package.json">
+ <None Include="dashboard-ui\thirdparty\social-share-kit-1.0.4\dist\fonts\social-share-kit.ttf">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
- <None Include="dashboard-ui\thirdparty\webcomponentsjs\README.md">
+ <None Include="dashboard-ui\thirdparty\social-share-kit-1.0.4\dist\fonts\social-share-kit.woff">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
+ <None Include="dashboard-ui\thirdparty\social-share-kit-1.0.4\LICENSE" />
+ <None Include="dashboard-ui\thirdparty\social-share-kit-1.0.4\README.md" />
<None Include="packages.config" />
</ItemGroup>
<ItemGroup />
diff --git a/MediaBrowser.XbmcMetadata/EntryPoint.cs b/MediaBrowser.XbmcMetadata/EntryPoint.cs index d07633268..c3bc6e30f 100644 --- a/MediaBrowser.XbmcMetadata/EntryPoint.cs +++ b/MediaBrowser.XbmcMetadata/EntryPoint.cs @@ -8,7 +8,6 @@ using MediaBrowser.Model.Logging; using MediaBrowser.XbmcMetadata.Configuration; using MediaBrowser.XbmcMetadata.Savers; using System; -using System.Linq; namespace MediaBrowser.XbmcMetadata { @@ -50,7 +49,11 @@ namespace MediaBrowser.XbmcMetadata return; } - var items = _libraryManager.RootFolder.GetRecursiveChildren(person.GetItemFilter()); + var items = _libraryManager.GetItems(new InternalItemsQuery + { + Person = person.Name + + }).Items; foreach (var item in items) { diff --git a/MediaBrowser.XbmcMetadata/Parsers/BaseNfoParser.cs b/MediaBrowser.XbmcMetadata/Parsers/BaseNfoParser.cs index 868c667f6..ad514492d 100644 --- a/MediaBrowser.XbmcMetadata/Parsers/BaseNfoParser.cs +++ b/MediaBrowser.XbmcMetadata/Parsers/BaseNfoParser.cs @@ -1,4 +1,5 @@ using MediaBrowser.Common.Configuration; +using MediaBrowser.Controller.Providers; using MediaBrowser.Model.Extensions; using MediaBrowser.Controller.Entities; using MediaBrowser.Model.Entities; @@ -42,12 +43,11 @@ namespace MediaBrowser.XbmcMetadata.Parsers /// Fetches metadata for an item from one xml file /// </summary> /// <param name="item">The item.</param> - /// <param name="userDataList">The user data list.</param> /// <param name="metadataFile">The metadata file.</param> /// <param name="cancellationToken">The cancellation token.</param> /// <exception cref="System.ArgumentNullException"> /// </exception> - public void Fetch(T item, List<UserItemData> userDataList, string metadataFile, CancellationToken cancellationToken) + public void Fetch(LocalMetadataResult<T> item, string metadataFile, CancellationToken cancellationToken) { if (item == null) { @@ -67,7 +67,7 @@ namespace MediaBrowser.XbmcMetadata.Parsers ValidationType = ValidationType.None }; - Fetch(item, userDataList, metadataFile, settings, cancellationToken); + Fetch(item, metadataFile, settings, cancellationToken); } protected virtual bool SupportsUrlAfterClosingXmlTag @@ -79,11 +79,10 @@ namespace MediaBrowser.XbmcMetadata.Parsers /// Fetches the specified item. /// </summary> /// <param name="item">The item.</param> - /// <param name="userDataList">The user data list.</param> /// <param name="metadataFile">The metadata file.</param> /// <param name="settings">The settings.</param> /// <param name="cancellationToken">The cancellation token.</param> - private void Fetch(T item, List<UserItemData> userDataList, string metadataFile, XmlReaderSettings settings, CancellationToken cancellationToken) + private void Fetch(LocalMetadataResult<T> item, string metadataFile, XmlReaderSettings settings, CancellationToken cancellationToken) { if (!SupportsUrlAfterClosingXmlTag) { @@ -101,7 +100,7 @@ namespace MediaBrowser.XbmcMetadata.Parsers if (reader.NodeType == XmlNodeType.Element) { - FetchDataFromXmlNode(reader, item, userDataList); + FetchDataFromXmlNode(reader, item); } } } @@ -122,7 +121,7 @@ namespace MediaBrowser.XbmcMetadata.Parsers { var endingXml = xml.Substring(index); - ParseProviderLinks(item, endingXml); + ParseProviderLinks(item.Item, endingXml); // If the file is just an imdb url, don't go any further if (index == 0) @@ -136,7 +135,7 @@ namespace MediaBrowser.XbmcMetadata.Parsers { // If the file is just an Imdb url, handle that - ParseProviderLinks(item, xml); + ParseProviderLinks(item.Item, xml); return; } @@ -160,7 +159,7 @@ namespace MediaBrowser.XbmcMetadata.Parsers if (reader.NodeType == XmlNodeType.Element) { - FetchDataFromXmlNode(reader, item, userDataList); + FetchDataFromXmlNode(reader, item); } } } @@ -183,8 +182,10 @@ namespace MediaBrowser.XbmcMetadata.Parsers // http://www.themoviedb.org/movie/36557 } - protected virtual void FetchDataFromXmlNode(XmlReader reader, T item, List<UserItemData> userDataList) + protected virtual void FetchDataFromXmlNode(XmlReader reader, LocalMetadataResult<T> itemResult) { + var item = itemResult.Item; + var userDataUserId = _config.GetNfoConfiguration().UserId; switch (reader.Name) @@ -573,7 +574,7 @@ namespace MediaBrowser.XbmcMetadata.Parsers { continue; } - item.AddPerson(p); + PeopleHelper.AddPerson(itemResult.People, p); } break; } @@ -592,7 +593,7 @@ namespace MediaBrowser.XbmcMetadata.Parsers { continue; } - item.AddPerson(p); + PeopleHelper.AddPerson(itemResult.People, p); } } break; @@ -606,7 +607,7 @@ namespace MediaBrowser.XbmcMetadata.Parsers { continue; } - item.AddPerson(p); + PeopleHelper.AddPerson(itemResult.People, p); } break; } @@ -617,7 +618,7 @@ namespace MediaBrowser.XbmcMetadata.Parsers { var person = GetPersonFromXmlNode(subtree); - item.AddPerson(person); + PeopleHelper.AddPerson(itemResult.People, person); } break; } @@ -931,7 +932,7 @@ namespace MediaBrowser.XbmcMetadata.Parsers { if (!string.IsNullOrWhiteSpace(userDataUserId)) { - var userData = GetOrAdd(userDataList, userDataUserId); + var userData = GetOrAdd(itemResult.UserDataLIst, userDataUserId); userData.Played = parsedValue; } @@ -951,7 +952,7 @@ namespace MediaBrowser.XbmcMetadata.Parsers { if (!string.IsNullOrWhiteSpace(userDataUserId)) { - var userData = GetOrAdd(userDataList, userDataUserId); + var userData = GetOrAdd(itemResult.UserDataLIst, userDataUserId); userData.PlayCount = parsedValue; @@ -976,7 +977,7 @@ namespace MediaBrowser.XbmcMetadata.Parsers { if (!string.IsNullOrWhiteSpace(userDataUserId)) { - var userData = GetOrAdd(userDataList, userDataUserId); + var userData = GetOrAdd(itemResult.UserDataLIst, userDataUserId); userData.LastPlayedDate = parsedValue; } @@ -991,7 +992,7 @@ namespace MediaBrowser.XbmcMetadata.Parsers { if (!string.IsNullOrWhiteSpace(userDataUserId)) { - var userData = GetOrAdd(userDataList, userDataUserId); + var userData = GetOrAdd(itemResult.UserDataLIst, userDataUserId); FetchFromResumeNode(subtree, item, userData); } @@ -1010,7 +1011,7 @@ namespace MediaBrowser.XbmcMetadata.Parsers { if (!string.IsNullOrWhiteSpace(userDataUserId)) { - var userData = GetOrAdd(userDataList, userDataUserId); + var userData = GetOrAdd(itemResult.UserDataLIst, userDataUserId); userData.IsFavorite = parsedValue; } @@ -1030,7 +1031,7 @@ namespace MediaBrowser.XbmcMetadata.Parsers { if (!string.IsNullOrWhiteSpace(userDataUserId)) { - var userData = GetOrAdd(userDataList, userDataUserId); + var userData = GetOrAdd(itemResult.UserDataLIst, userDataUserId); userData.Rating = parsedValue; } diff --git a/MediaBrowser.XbmcMetadata/Parsers/EpisodeNfoParser.cs b/MediaBrowser.XbmcMetadata/Parsers/EpisodeNfoParser.cs index 42a60276b..355f19de7 100644 --- a/MediaBrowser.XbmcMetadata/Parsers/EpisodeNfoParser.cs +++ b/MediaBrowser.XbmcMetadata/Parsers/EpisodeNfoParser.cs @@ -2,7 +2,6 @@ using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities.TV; using MediaBrowser.Controller.Providers; -using MediaBrowser.Model.Entities; using MediaBrowser.Model.Logging; using System; using System.Collections.Generic; @@ -14,26 +13,16 @@ namespace MediaBrowser.XbmcMetadata.Parsers { public class EpisodeNfoParser : BaseNfoParser<Episode> { - private List<LocalImageInfo> _imagesFound; - private List<ChapterInfo> _chaptersFound; - private string _xmlPath; - public EpisodeNfoParser(ILogger logger, IConfigurationManager config) : base(logger, config) { } - public void Fetch(Episode item, - List<UserItemData> userDataList, + public void Fetch(LocalMetadataResult<Episode> item, List<LocalImageInfo> images, - List<ChapterInfo> chapters, string metadataFile, CancellationToken cancellationToken) { - _imagesFound = images; - _chaptersFound = chapters; - _xmlPath = metadataFile; - - Fetch(item, userDataList, metadataFile, cancellationToken); + Fetch(item, metadataFile, cancellationToken); } private static readonly CultureInfo UsCulture = new CultureInfo("en-US"); @@ -42,17 +31,13 @@ namespace MediaBrowser.XbmcMetadata.Parsers /// Fetches the data from XML node. /// </summary> /// <param name="reader">The reader.</param> - /// <param name="item">The item.</param> - /// <param name="userDataList">The user data list.</param> - protected override void FetchDataFromXmlNode(XmlReader reader, Episode item, List<UserItemData> userDataList) + /// <param name="itemResult">The item result.</param> + protected override void FetchDataFromXmlNode(XmlReader reader, LocalMetadataResult<Episode> itemResult) { + var item = itemResult.Item; + switch (reader.Name) { - //case "Chapters": - - // _chaptersFound.AddRange(FetchChaptersFromXmlNode(item, reader.ReadSubtree())); - // break; - case "season": { var number = reader.ReadElementContentAsString(); @@ -206,7 +191,7 @@ namespace MediaBrowser.XbmcMetadata.Parsers default: - base.FetchDataFromXmlNode(reader, item, userDataList); + base.FetchDataFromXmlNode(reader, itemResult); break; } } diff --git a/MediaBrowser.XbmcMetadata/Parsers/MovieNfoParser.cs b/MediaBrowser.XbmcMetadata/Parsers/MovieNfoParser.cs index 2a275320f..ab4619875 100644 --- a/MediaBrowser.XbmcMetadata/Parsers/MovieNfoParser.cs +++ b/MediaBrowser.XbmcMetadata/Parsers/MovieNfoParser.cs @@ -1,33 +1,20 @@ using MediaBrowser.Common.Configuration; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities.Movies; +using MediaBrowser.Controller.Providers; using MediaBrowser.Model.Entities; using MediaBrowser.Model.Logging; using System.Collections.Generic; -using System.Threading; using System.Xml; namespace MediaBrowser.XbmcMetadata.Parsers { class MovieNfoParser : BaseNfoParser<Video> { - private List<ChapterInfo> _chaptersFound; - public MovieNfoParser(ILogger logger, IConfigurationManager config) : base(logger, config) { } - public void Fetch(Video item, - List<UserItemData> userDataList, - List<ChapterInfo> chapters, - string metadataFile, - CancellationToken cancellationToken) - { - _chaptersFound = chapters; - - Fetch(item, userDataList, metadataFile, cancellationToken); - } - protected override bool SupportsUrlAfterClosingXmlTag { get @@ -40,10 +27,11 @@ namespace MediaBrowser.XbmcMetadata.Parsers /// Fetches the data from XML node. /// </summary> /// <param name="reader">The reader.</param> - /// <param name="item">The item.</param> - /// <param name="userDataList">The user data list.</param> - protected override void FetchDataFromXmlNode(XmlReader reader, Video item, List<UserItemData> userDataList) + /// <param name="itemResult">The item result.</param> + protected override void FetchDataFromXmlNode(XmlReader reader, LocalMetadataResult<Video> itemResult) { + var item = itemResult.Item; + switch (reader.Name) { case "id": @@ -93,13 +81,8 @@ namespace MediaBrowser.XbmcMetadata.Parsers break; } - //case "chapter": - - // _chaptersFound.AddRange(FetchChaptersFromXmlNode(item, reader.ReadSubtree())); - // break; - default: - base.FetchDataFromXmlNode(reader, item, userDataList); + base.FetchDataFromXmlNode(reader, itemResult); break; } } diff --git a/MediaBrowser.XbmcMetadata/Parsers/SeasonNfoParser.cs b/MediaBrowser.XbmcMetadata/Parsers/SeasonNfoParser.cs index 1ea0053b3..c80684c41 100644 --- a/MediaBrowser.XbmcMetadata/Parsers/SeasonNfoParser.cs +++ b/MediaBrowser.XbmcMetadata/Parsers/SeasonNfoParser.cs @@ -1,8 +1,7 @@ using MediaBrowser.Common.Configuration; -using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities.TV; +using MediaBrowser.Controller.Providers; using MediaBrowser.Model.Logging; -using System.Collections.Generic; using System.Globalization; using System.Xml; @@ -18,10 +17,11 @@ namespace MediaBrowser.XbmcMetadata.Parsers /// Fetches the data from XML node. /// </summary> /// <param name="reader">The reader.</param> - /// <param name="item">The item.</param> - /// <param name="userDataList">The user data list.</param> - protected override void FetchDataFromXmlNode(XmlReader reader, Season item, List<UserItemData> userDataList) + /// <param name="itemResult">The item result.</param> + protected override void FetchDataFromXmlNode(XmlReader reader, LocalMetadataResult<Season> itemResult) { + var item = itemResult.Item; + switch (reader.Name) { case "seasonnumber": @@ -41,7 +41,7 @@ namespace MediaBrowser.XbmcMetadata.Parsers } default: - base.FetchDataFromXmlNode(reader, item, userDataList); + base.FetchDataFromXmlNode(reader, itemResult); break; } } diff --git a/MediaBrowser.XbmcMetadata/Parsers/SeriesNfoParser.cs b/MediaBrowser.XbmcMetadata/Parsers/SeriesNfoParser.cs index 2e8b07695..5025f4d18 100644 --- a/MediaBrowser.XbmcMetadata/Parsers/SeriesNfoParser.cs +++ b/MediaBrowser.XbmcMetadata/Parsers/SeriesNfoParser.cs @@ -2,6 +2,7 @@ using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities.TV; using MediaBrowser.Controller.Library; +using MediaBrowser.Controller.Providers; using MediaBrowser.Model.Entities; using MediaBrowser.Model.Logging; using System; @@ -20,10 +21,11 @@ namespace MediaBrowser.XbmcMetadata.Parsers /// Fetches the data from XML node. /// </summary> /// <param name="reader">The reader.</param> - /// <param name="item">The item.</param> - /// <param name="userDataList">The user data list.</param> - protected override void FetchDataFromXmlNode(XmlReader reader, Series item, List<UserItemData> userDataList) + /// <param name="itemResult">The item result.</param> + protected override void FetchDataFromXmlNode(XmlReader reader, LocalMetadataResult<Series> itemResult) { + var item = itemResult.Item; + switch (reader.Name) { case "id": @@ -88,7 +90,7 @@ namespace MediaBrowser.XbmcMetadata.Parsers } default: - base.FetchDataFromXmlNode(reader, item, userDataList); + base.FetchDataFromXmlNode(reader, itemResult); break; } } diff --git a/MediaBrowser.XbmcMetadata/Providers/AlbumNfoProvider.cs b/MediaBrowser.XbmcMetadata/Providers/AlbumNfoProvider.cs index 9567de2b8..ac76db771 100644 --- a/MediaBrowser.XbmcMetadata/Providers/AlbumNfoProvider.cs +++ b/MediaBrowser.XbmcMetadata/Providers/AlbumNfoProvider.cs @@ -23,7 +23,7 @@ namespace MediaBrowser.XbmcMetadata.Providers protected override void Fetch(LocalMetadataResult<MusicAlbum> result, string path, CancellationToken cancellationToken) { - new BaseNfoParser<MusicAlbum>(_logger, _config).Fetch(result.Item, result.UserDataLIst, path, cancellationToken); + new BaseNfoParser<MusicAlbum>(_logger, _config).Fetch(result, path, cancellationToken); } protected override FileSystemInfo GetXmlFile(ItemInfo info, IDirectoryService directoryService) diff --git a/MediaBrowser.XbmcMetadata/Providers/ArtistNfoProvider.cs b/MediaBrowser.XbmcMetadata/Providers/ArtistNfoProvider.cs index 1f9c78b56..8a958c3a6 100644 --- a/MediaBrowser.XbmcMetadata/Providers/ArtistNfoProvider.cs +++ b/MediaBrowser.XbmcMetadata/Providers/ArtistNfoProvider.cs @@ -23,7 +23,7 @@ namespace MediaBrowser.XbmcMetadata.Providers protected override void Fetch(LocalMetadataResult<MusicArtist> result, string path, CancellationToken cancellationToken) { - new BaseNfoParser<MusicArtist>(_logger, _config).Fetch(result.Item, result.UserDataLIst, path, cancellationToken); + new BaseNfoParser<MusicArtist>(_logger, _config).Fetch(result, path, cancellationToken); } protected override FileSystemInfo GetXmlFile(ItemInfo info, IDirectoryService directoryService) diff --git a/MediaBrowser.XbmcMetadata/Providers/BaseVideoNfoProvider.cs b/MediaBrowser.XbmcMetadata/Providers/BaseVideoNfoProvider.cs index 4dff051c7..79315cbf3 100644 --- a/MediaBrowser.XbmcMetadata/Providers/BaseVideoNfoProvider.cs +++ b/MediaBrowser.XbmcMetadata/Providers/BaseVideoNfoProvider.cs @@ -2,11 +2,9 @@ using MediaBrowser.Common.IO; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Providers; -using MediaBrowser.Model.Entities; using MediaBrowser.Model.Logging; using MediaBrowser.XbmcMetadata.Parsers; using MediaBrowser.XbmcMetadata.Savers; -using System.Collections.Generic; using System.IO; using System.Linq; using System.Threading; @@ -28,11 +26,15 @@ namespace MediaBrowser.XbmcMetadata.Providers protected override void Fetch(LocalMetadataResult<T> result, string path, CancellationToken cancellationToken) { - var chapters = new List<ChapterInfo>(); + var tmpItem = new LocalMetadataResult<Video> + { + Item = result.Item + }; + new MovieNfoParser(_logger, _config).Fetch(tmpItem, path, cancellationToken); - new MovieNfoParser(_logger, _config).Fetch(result.Item, result.UserDataLIst, chapters, path, cancellationToken); - - result.Chapters = chapters; + result.Item = (T)tmpItem.Item; + result.People = tmpItem.People; + result.UserDataLIst = tmpItem.UserDataLIst; } protected override FileSystemInfo GetXmlFile(ItemInfo info, IDirectoryService directoryService) diff --git a/MediaBrowser.XbmcMetadata/Providers/EpisodeNfoProvider.cs b/MediaBrowser.XbmcMetadata/Providers/EpisodeNfoProvider.cs index 2d4bb4ddc..2b5cfe9a3 100644 --- a/MediaBrowser.XbmcMetadata/Providers/EpisodeNfoProvider.cs +++ b/MediaBrowser.XbmcMetadata/Providers/EpisodeNfoProvider.cs @@ -26,12 +26,10 @@ namespace MediaBrowser.XbmcMetadata.Providers protected override void Fetch(LocalMetadataResult<Episode> result, string path, CancellationToken cancellationToken) { var images = new List<LocalImageInfo>(); - var chapters = new List<ChapterInfo>(); - new EpisodeNfoParser(_logger, _config).Fetch(result.Item, result.UserDataLIst, images, chapters, path, cancellationToken); + new EpisodeNfoParser(_logger, _config).Fetch(result, images, path, cancellationToken); result.Images = images; - result.Chapters = chapters; } protected override FileSystemInfo GetXmlFile(ItemInfo info, IDirectoryService directoryService) diff --git a/MediaBrowser.XbmcMetadata/Providers/SeasonNfoProvider.cs b/MediaBrowser.XbmcMetadata/Providers/SeasonNfoProvider.cs index 1be67c310..85c2d4305 100644 --- a/MediaBrowser.XbmcMetadata/Providers/SeasonNfoProvider.cs +++ b/MediaBrowser.XbmcMetadata/Providers/SeasonNfoProvider.cs @@ -23,7 +23,7 @@ namespace MediaBrowser.XbmcMetadata.Providers protected override void Fetch(LocalMetadataResult<Season> result, string path, CancellationToken cancellationToken) { - new SeasonNfoParser(_logger, _config).Fetch(result.Item, result.UserDataLIst, path, cancellationToken); + new SeasonNfoParser(_logger, _config).Fetch(result, path, cancellationToken); } protected override FileSystemInfo GetXmlFile(ItemInfo info, IDirectoryService directoryService) diff --git a/MediaBrowser.XbmcMetadata/Providers/SeriesNfoProvider.cs b/MediaBrowser.XbmcMetadata/Providers/SeriesNfoProvider.cs index b415571e3..e2ac866ef 100644 --- a/MediaBrowser.XbmcMetadata/Providers/SeriesNfoProvider.cs +++ b/MediaBrowser.XbmcMetadata/Providers/SeriesNfoProvider.cs @@ -23,7 +23,7 @@ namespace MediaBrowser.XbmcMetadata.Providers protected override void Fetch(LocalMetadataResult<Series> result, string path, CancellationToken cancellationToken) { - new SeriesNfoParser(_logger, _config).Fetch(result.Item, result.UserDataLIst, path, cancellationToken); + new SeriesNfoParser(_logger, _config).Fetch(result, path, cancellationToken); } protected override FileSystemInfo GetXmlFile(ItemInfo info, IDirectoryService directoryService) diff --git a/MediaBrowser.XbmcMetadata/Savers/BaseNfoSaver.cs b/MediaBrowser.XbmcMetadata/Savers/BaseNfoSaver.cs index 9cde958c4..b6f497a76 100644 --- a/MediaBrowser.XbmcMetadata/Savers/BaseNfoSaver.cs +++ b/MediaBrowser.XbmcMetadata/Savers/BaseNfoSaver.cs @@ -472,7 +472,9 @@ namespace MediaBrowser.XbmcMetadata.Savers } } - var directors = item.People + var people = libraryManager.GetPeople(item); + + var directors = people .Where(i => IsPersonType(i, PersonType.Director)) .Select(i => i.Name) .ToList(); @@ -482,7 +484,7 @@ namespace MediaBrowser.XbmcMetadata.Savers writer.WriteElementString("director", person); } - var writers = item.People + var writers = people .Where(i => IsPersonType(i, PersonType.Writer)) .Select(i => i.Name) .Distinct(StringComparer.OrdinalIgnoreCase) @@ -820,7 +822,7 @@ namespace MediaBrowser.XbmcMetadata.Savers AddUserData(item, writer, userManager, userDataRepo, options); - AddActors(item, writer, libraryManager, fileSystem, config); + AddActors(people, writer, libraryManager, fileSystem, config); var folder = item as BoxSet; if (folder != null) @@ -948,9 +950,9 @@ namespace MediaBrowser.XbmcMetadata.Savers writer.WriteEndElement(); } - private static void AddActors(BaseItem item, XmlWriter writer, ILibraryManager libraryManager, IFileSystem fileSystem, IServerConfigurationManager config) + private static void AddActors(List<PersonInfo> people, XmlWriter writer, ILibraryManager libraryManager, IFileSystem fileSystem, IServerConfigurationManager config) { - var actors = item.People + var actors = people .Where(i => !IsPersonType(i, PersonType.Director) && !IsPersonType(i, PersonType.Writer)) .ToList(); diff --git a/Nuget/MediaBrowser.Common.Internal.nuspec b/Nuget/MediaBrowser.Common.Internal.nuspec index 3f6d35a26..fffb68e36 100644 --- a/Nuget/MediaBrowser.Common.Internal.nuspec +++ b/Nuget/MediaBrowser.Common.Internal.nuspec @@ -2,7 +2,7 @@ <package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd"> <metadata> <id>MediaBrowser.Common.Internal</id> - <version>3.0.626</version> + <version>3.0.629</version> <title>MediaBrowser.Common.Internal</title> <authors>Luke</authors> <owners>ebr,Luke,scottisafool</owners> @@ -12,7 +12,7 @@ <description>Contains common components shared by Emby Theater and Emby Server. Not intended for plugin developer consumption.</description> <copyright>Copyright © Emby 2013</copyright> <dependencies> - <dependency id="MediaBrowser.Common" version="3.0.626" /> + <dependency id="MediaBrowser.Common" version="3.0.629" /> <dependency id="NLog" version="3.2.1" /> <dependency id="SimpleInjector" version="2.8.0" /> </dependencies> diff --git a/Nuget/MediaBrowser.Common.nuspec b/Nuget/MediaBrowser.Common.nuspec index 72519250c..856e63199 100644 --- a/Nuget/MediaBrowser.Common.nuspec +++ b/Nuget/MediaBrowser.Common.nuspec @@ -2,7 +2,7 @@ <package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd"> <metadata> <id>MediaBrowser.Common</id> - <version>3.0.626</version> + <version>3.0.629</version> <title>MediaBrowser.Common</title> <authors>Emby Team</authors> <owners>ebr,Luke,scottisafool</owners> diff --git a/Nuget/MediaBrowser.Model.Signed.nuspec b/Nuget/MediaBrowser.Model.Signed.nuspec index b35f08524..30175007d 100644 --- a/Nuget/MediaBrowser.Model.Signed.nuspec +++ b/Nuget/MediaBrowser.Model.Signed.nuspec @@ -2,7 +2,7 @@ <package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd"> <metadata> <id>MediaBrowser.Model.Signed</id> - <version>3.0.626</version> + <version>3.0.629</version> <title>MediaBrowser.Model - Signed Edition</title> <authors>Emby Team</authors> <owners>ebr,Luke,scottisafool</owners> diff --git a/Nuget/MediaBrowser.Server.Core.nuspec b/Nuget/MediaBrowser.Server.Core.nuspec index 71710db12..c688c6f2c 100644 --- a/Nuget/MediaBrowser.Server.Core.nuspec +++ b/Nuget/MediaBrowser.Server.Core.nuspec @@ -2,7 +2,7 @@ <package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd"> <metadata> <id>MediaBrowser.Server.Core</id> - <version>3.0.626</version> + <version>3.0.629</version> <title>Media Browser.Server.Core</title> <authors>Emby Team</authors> <owners>ebr,Luke,scottisafool</owners> @@ -12,7 +12,7 @@ <description>Contains core components required to build plugins for Emby Server.</description> <copyright>Copyright © Emby 2013</copyright> <dependencies> - <dependency id="MediaBrowser.Common" version="3.0.626" /> + <dependency id="MediaBrowser.Common" version="3.0.629" /> <dependency id="Interfaces.IO" version="1.0.0.5" /> </dependencies> </metadata> diff --git a/SharedVersion.cs b/SharedVersion.cs index ed38cbd78..db9f1d850 100644 --- a/SharedVersion.cs +++ b/SharedVersion.cs @@ -1,4 +1,4 @@ using System.Reflection; //[assembly: AssemblyVersion("3.0.*")] -[assembly: AssemblyVersion("3.0.5641.5")] +[assembly: AssemblyVersion("3.0.5666.5")] |
