From 36b5800419f37672348c7a40d080e28628a043f4 Mon Sep 17 00:00:00 2001 From: softworkz Date: Tue, 20 Dec 2016 22:40:07 +0100 Subject: [PATCH 01/62] Enhanced sync events --- .../Sync/SyncManager.cs | 27 +++++++++---------- .../Sync/SyncNotificationEntryPoint.cs | 12 +++++++++ 2 files changed, 24 insertions(+), 15 deletions(-) diff --git a/Emby.Server.Implementations/Sync/SyncManager.cs b/Emby.Server.Implementations/Sync/SyncManager.cs index 13f60f5eea..061129e5f9 100644 --- a/Emby.Server.Implementations/Sync/SyncManager.cs +++ b/Emby.Server.Implementations/Sync/SyncManager.cs @@ -1042,10 +1042,7 @@ public async Task CancelJobItem(string id) throw new ArgumentException("Operation is not valid for this job item"); } - if (jobItem.Status != SyncJobItemStatus.Synced) - { - jobItem.Status = SyncJobItemStatus.Cancelled; - } + jobItem.Status = SyncJobItemStatus.Cancelled; jobItem.Progress = 0; jobItem.IsMarkedForRemoval = true; @@ -1071,18 +1068,18 @@ public async Task CancelJobItem(string id) _logger.ErrorException("Error deleting directory {0}", ex, path); } - //var jobItemsResult = GetJobItems(new SyncJobItemQuery - //{ - // AddMetadata = false, - // JobId = jobItem.JobId, - // Limit = 0, - // Statuses = new[] { SyncJobItemStatus.Converting, SyncJobItemStatus.Failed, SyncJobItemStatus.Queued, SyncJobItemStatus.ReadyToTransfer, SyncJobItemStatus.Synced, SyncJobItemStatus.Transferring } - //}); + var jobItemsResult = GetJobItems(new SyncJobItemQuery + { + AddMetadata = false, + JobId = jobItem.JobId, + Limit = 0, + Statuses = new[] { SyncJobItemStatus.Converting, SyncJobItemStatus.Queued, SyncJobItemStatus.ReadyToTransfer, SyncJobItemStatus.Synced, SyncJobItemStatus.Transferring } + }); - //if (jobItemsResult.TotalRecordCount == 0) - //{ - // await CancelJob(jobItem.JobId).ConfigureAwait(false); - //} + if (jobItemsResult.TotalRecordCount == 0) + { + await CancelJob(jobItem.JobId).ConfigureAwait(false); + } } public Task MarkJobItemForRemoval(string id) diff --git a/Emby.Server.Implementations/Sync/SyncNotificationEntryPoint.cs b/Emby.Server.Implementations/Sync/SyncNotificationEntryPoint.cs index 46cdb28a4d..06e0e66a91 100644 --- a/Emby.Server.Implementations/Sync/SyncNotificationEntryPoint.cs +++ b/Emby.Server.Implementations/Sync/SyncNotificationEntryPoint.cs @@ -38,6 +38,18 @@ private async void _syncManager_SyncJobItemUpdated(object sender, GenericEventAr } } + + if (item.Status == SyncJobItemStatus.Cancelled) + { + try + { + await _sessionManager.SendMessageToUserDeviceSessions(item.TargetId, "SyncJobItemCancelled", item, CancellationToken.None).ConfigureAwait(false); + } + catch + { + + } + } } public void Dispose() From e1199e36c9e4ecd304a1d8562def354cc010e9e2 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Wed, 21 Dec 2016 23:11:23 -0500 Subject: [PATCH 02/62] resolve tray icon not opening links on osx --- Emby.Server.Core/ApplicationHost.cs | 3 ++- .../emby/Emby.Common.Implementations.dll | Bin 132608 -> 132608 bytes ThirdParty/emby/Emby.Server.Core.dll | Bin 95232 -> 95232 bytes 3 files changed, 2 insertions(+), 1 deletion(-) diff --git a/Emby.Server.Core/ApplicationHost.cs b/Emby.Server.Core/ApplicationHost.cs index a0a7416e7b..8af2c9f91e 100644 --- a/Emby.Server.Core/ApplicationHost.cs +++ b/Emby.Server.Core/ApplicationHost.cs @@ -1583,7 +1583,8 @@ private static string GetHostnameFromExternalDns(string externalDns) public void LaunchUrl(string url) { - if (EnvironmentInfo.OperatingSystem != MediaBrowser.Model.System.OperatingSystem.Windows) + if (EnvironmentInfo.OperatingSystem != MediaBrowser.Model.System.OperatingSystem.Windows && + EnvironmentInfo.OperatingSystem != MediaBrowser.Model.System.OperatingSystem.OSX) { throw new NotImplementedException(); } diff --git a/ThirdParty/emby/Emby.Common.Implementations.dll b/ThirdParty/emby/Emby.Common.Implementations.dll index 21a7ccb6bee48fa080d41cda9aa6aa296e0f9807..57694e69a444514b2d6a0a6180ff2f0ccd10eb45 100644 GIT binary patch delta 105 zcmZqZ;b`dLn9#v|C@{LQduuo2cLND?iS3IRz~F%`h+<}7WH6W5wrKk-L&mbH0&Q#3 zzA$c{=Dw}yU(j~1%>3;N#~C}!Kn6@-{g+Wv;8M=)m>aeK9otR`@07ljX1o2$Uq&4c E0LwNhBme*a delta 105 zcmZqZ;b`dLn9#v&yCk%+duuo2cLNDyi7$B!VDP{eL@_fkGJwRk&oX2zn<^0JqBL{K zgijs|YZ;!pS2)htVFof_`s%-ok^-uV(Z3^(XZWnsn0imJXwIbVSN<~UZ~y>F C4JG;j diff --git a/ThirdParty/emby/Emby.Server.Core.dll b/ThirdParty/emby/Emby.Server.Core.dll index be52423fe8e084d73f08ac7b14372c45c10127f9..91fb3c6c8a59c2295ea87075ce0697f87309a374 100644 GIT binary patch delta 3267 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 From f388e47eda7852e39f6527073283a16deae419a1 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Wed, 21 Dec 2016 23:28:00 -0500 Subject: [PATCH 03/62] update browser launcher --- Emby.Server.Core/ApplicationHost.cs | 2 +- .../emby/Emby.Common.Implementations.dll | Bin 132608 -> 132608 bytes ThirdParty/emby/Emby.Server.Core.dll | Bin 95232 -> 95232 bytes 3 files changed, 1 insertion(+), 1 deletion(-) diff --git a/Emby.Server.Core/ApplicationHost.cs b/Emby.Server.Core/ApplicationHost.cs index 8af2c9f91e..3590ade401 100644 --- a/Emby.Server.Core/ApplicationHost.cs +++ b/Emby.Server.Core/ApplicationHost.cs @@ -1592,7 +1592,7 @@ public void LaunchUrl(string url) var process = ProcessFactory.Create(new ProcessOptions { FileName = url, - EnableRaisingEvents = true, + //EnableRaisingEvents = true, UseShellExecute = true, ErrorDialog = false }); diff --git a/ThirdParty/emby/Emby.Common.Implementations.dll b/ThirdParty/emby/Emby.Common.Implementations.dll index 57694e69a444514b2d6a0a6180ff2f0ccd10eb45..1b1718f909277a1842ccee4c10a17d0304c594ca 100644 GIT binary patch delta 101 zcmZqZ;b`dLn9#xWI;62{YZv1$12LZ^3}EoU7DO>KFfy1+_$=8z%aE~bs=!T-v&YWL z9`%_#hw`<1_pIvfBr CZzo;= delta 101 zcmZqZ;b`dLn9#v=D6p|>YZv1$1F`Lk7{K6xEr?=fU}P|t*tTf#I) diff --git a/ThirdParty/emby/Emby.Server.Core.dll b/ThirdParty/emby/Emby.Server.Core.dll index 91fb3c6c8a59c2295ea87075ce0697f87309a374..5306ffdc5f9813e8db8d04df780dae8afbf506cb 100644 GIT binary patch delta 11010 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 U(f`TPZ`}_?dgym_O9%7+0bX2L00000 From 8a00aaeebbfa4652f80f7b28462ed68a4220bda4 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Wed, 21 Dec 2016 23:47:59 -0500 Subject: [PATCH 04/62] update osx detection --- .../EnvironmentInfo/EnvironmentInfo.cs | 6 ++++++ MediaBrowser.Server.Mac/Main.cs | 5 ++++- .../emby/Emby.Common.Implementations.dll | Bin 132608 -> 133120 bytes ThirdParty/emby/Emby.Server.Core.dll | Bin 95232 -> 95232 bytes 4 files changed, 10 insertions(+), 1 deletion(-) diff --git a/Emby.Common.Implementations/EnvironmentInfo/EnvironmentInfo.cs b/Emby.Common.Implementations/EnvironmentInfo/EnvironmentInfo.cs index 6cc4626eaf..dcc9744136 100644 --- a/Emby.Common.Implementations/EnvironmentInfo/EnvironmentInfo.cs +++ b/Emby.Common.Implementations/EnvironmentInfo/EnvironmentInfo.cs @@ -10,11 +10,17 @@ namespace Emby.Common.Implementations.EnvironmentInfo public class EnvironmentInfo : IEnvironmentInfo { public MediaBrowser.Model.System.Architecture? CustomArchitecture { get; set; } + public MediaBrowser.Model.System.OperatingSystem? CustomOperatingSystem { get; set; } public MediaBrowser.Model.System.OperatingSystem OperatingSystem { get { + if (CustomOperatingSystem.HasValue) + { + return CustomOperatingSystem.Value; + } + #if NET46 switch (Environment.OSVersion.Platform) { diff --git a/MediaBrowser.Server.Mac/Main.cs b/MediaBrowser.Server.Mac/Main.cs index cda6f459a9..6d02c7a1a0 100644 --- a/MediaBrowser.Server.Mac/Main.cs +++ b/MediaBrowser.Server.Mac/Main.cs @@ -142,7 +142,10 @@ private static void GenerateCertificate(string certPath, string certHost) private static EnvironmentInfo GetEnvironmentInfo() { - var info = new EnvironmentInfo(); + var info = new EnvironmentInfo() + { + CustomOperatingSystem = MediaBrowser.Model.System.OperatingSystem.OSX + }; var uname = GetUnixName(); diff --git a/ThirdParty/emby/Emby.Common.Implementations.dll b/ThirdParty/emby/Emby.Common.Implementations.dll index 1b1718f909277a1842ccee4c10a17d0304c594ca..948a521490e25f6cb7eea047a1fcaf9d25e6441b 100644 GIT binary patch delta 46904 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 delta 46818 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 nt?8eCsU*AF+(}BTJm7P%g^0JmdcXT&*?@ diff --git a/ThirdParty/emby/Emby.Server.Core.dll b/ThirdParty/emby/Emby.Server.Core.dll index 5306ffdc5f9813e8db8d04df780dae8afbf506cb..6fe5898837ec69bc6cdd276c2bc53d399fbe5d47 100644 GIT binary patch delta 237 zcmZp8!P@YGbwUS|chtr%pQBpemob3BIeiet%)rQCE&&s>w?`J6bS#PK&$7uW$E?JD zLN!S#Ar$;rHhIf2t00(^yC||0h|R#T&KE>N?Dz#WLI_Fh2UM(p3!(1kvds?14^#_W zSbD0rGOogV!Q@-79v=B7x?RATF+v0Ai|JX}j8Xyzj}`Az7yaSetv|;wXYo|S?NhQD Gb2tD$13(D? delta 237 zcmZp8!P@YGbwUTz=a7wEK1a2DmN0<9Ieiet%)rQCE&&s>w?`J6bS#OsWz9;FSI^XfqP7b-Ge&3teK9>Nn^8)j`3=vcyOmB}vy^R*H&n$}ZJ(0On8N`8 DD&sdT From 2fbda495f2ae13b01d31f7a6d4f81ab8ce66fe40 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Thu, 22 Dec 2016 04:45:02 -0500 Subject: [PATCH 05/62] update string compare --- SocketHttpListener.Portable/Net/HttpConnection.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/SocketHttpListener.Portable/Net/HttpConnection.cs b/SocketHttpListener.Portable/Net/HttpConnection.cs index bc4286dc8c..3baffd258e 100644 --- a/SocketHttpListener.Portable/Net/HttpConnection.cs +++ b/SocketHttpListener.Portable/Net/HttpConnection.cs @@ -209,7 +209,7 @@ public Stream GetResponseStream(bool isExpect100Continue = false) // TODO: can we get this stream before reading the input? if (o_stream == null) { - context.Response.DetermineIfChunked(); + //context.Response.DetermineIfChunked(); if (context.Response.SendChunked || isExpect100Continue || context.Request.IsWebSocketRequest || true) { @@ -508,7 +508,7 @@ internal void Close(bool force_close) { force_close |= !context.Request.KeepAlive; if (!force_close) - force_close = (context.Response.Headers["connection"] == "close"); + force_close = (string.Equals(context.Response.Headers["connection"], "close", StringComparison.OrdinalIgnoreCase)); /* if (!force_close) { // bool conn_close = (status_code == 400 || status_code == 408 || status_code == 411 || From 1b008b13b28a13f7f4148c352daa86c357a20e33 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Thu, 22 Dec 2016 10:57:28 -0500 Subject: [PATCH 06/62] update components --- MediaBrowser.Server.Mono/MonoAppHost.cs | 22 +++++++++++++++++++ .../emby-webcomponents/.bower.json | 8 +++---- .../actionsheet/actionsheet.css | 4 ++++ .../emby-button/emby-button.css | 1 - .../mediainfo/mediainfo.css | 12 ++++++++++ .../viewmanager/viewcontainer-lite.js | 4 +++- .../dashboard-ui/scripts/itemdetailpage.js | 2 +- 7 files changed, 46 insertions(+), 7 deletions(-) diff --git a/MediaBrowser.Server.Mono/MonoAppHost.cs b/MediaBrowser.Server.Mono/MonoAppHost.cs index 8def1ca2bf..932e2d6cda 100644 --- a/MediaBrowser.Server.Mono/MonoAppHost.cs +++ b/MediaBrowser.Server.Mono/MonoAppHost.cs @@ -51,8 +51,11 @@ protected override FFMpegInstallInfo GetFfmpegInstallInfo() } else if (environment.OperatingSystem == Model.System.OperatingSystem.Linux) { + info.FFMpegFilename = "ffmpeg"; + info.FFProbeFilename = "ffprobe"; info.ArchiveType = "7z"; info.Version = "20160215"; + info.DownloadUrls = GetDownloadUrls(); } // No version available - user requirement @@ -61,6 +64,25 @@ protected override FFMpegInstallInfo GetFfmpegInstallInfo() return info; } + private string[] GetDownloadUrls() + { + switch (EnvironmentInfo.SystemArchitecture) + { + case Architecture.X64: + return new[] + { + "https://github.com/MediaBrowser/Emby.Resources/raw/master/ffmpeg/linux/ffmpeg-git-20160215-64bit-static.7z" + }; + case Architecture.X86: + return new[] + { + "https://github.com/MediaBrowser/Emby.Resources/raw/master/ffmpeg/linux/ffmpeg-git-20160215-32bit-static.7z" + }; + } + + return new string[] { }; + } + protected override void RestartInternal() { MainClass.Restart(StartupOptions); diff --git a/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-webcomponents/.bower.json b/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-webcomponents/.bower.json index 599292c9aa..5ff3657a04 100644 --- a/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-webcomponents/.bower.json +++ b/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-webcomponents/.bower.json @@ -14,12 +14,12 @@ }, "devDependencies": {}, "ignore": [], - "version": "1.4.395", - "_release": "1.4.395", + "version": "1.4.396", + "_release": "1.4.396", "_resolution": { "type": "version", - "tag": "1.4.395", - "commit": "d50378cacaf7e08eea2768f7b088dd0f5c62a91d" + "tag": "1.4.396", + "commit": "4e12304c8e306a0cb82191bb47b9db4d9ceeef9a" }, "_source": "https://github.com/MediaBrowser/emby-webcomponents.git", "_target": "^1.2.1", diff --git a/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-webcomponents/actionsheet/actionsheet.css b/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-webcomponents/actionsheet/actionsheet.css index 3c53368bcd..5d16f7945d 100644 --- a/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-webcomponents/actionsheet/actionsheet.css +++ b/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-webcomponents/actionsheet/actionsheet.css @@ -54,6 +54,10 @@ box-shadow: none; } + .actionSheetMenuItem:focus { + transform: none !important; + } + .actionSheetMenuItem-noflex { display: block; } diff --git a/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-webcomponents/emby-button/emby-button.css b/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-webcomponents/emby-button/emby-button.css index e86bf08dc0..1627a363d3 100644 --- a/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-webcomponents/emby-button/emby-button.css +++ b/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-webcomponents/emby-button/emby-button.css @@ -49,7 +49,6 @@ .emby-button-focusscale:focus { transform: scale(1.16); z-index: 1; - box-shadow: 0 2px 4px rgba(0,0,0,0.1); } .emby-button > i { diff --git a/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-webcomponents/mediainfo/mediainfo.css b/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-webcomponents/mediainfo/mediainfo.css index 1ab3f52130..9574068ca1 100644 --- a/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-webcomponents/mediainfo/mediainfo.css +++ b/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-webcomponents/mediainfo/mediainfo.css @@ -2,6 +2,18 @@ margin: 0 1em 0 0; } +.mediaInfoText { + background: rgba(31,31,31,.7); + padding: .2em .5em; + border-radius: .25em; + color: #ddd; + font-size: 84%; + background: rgba(170,170,190, .2); + display: flex; + align-items: center; + white-space: nowrap; +} + .mediaInfoIconItem { width: auto; height: auto; diff --git a/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-webcomponents/viewmanager/viewcontainer-lite.js b/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-webcomponents/viewmanager/viewcontainer-lite.js index a1c0b15508..570fae8be4 100644 --- a/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-webcomponents/viewmanager/viewcontainer-lite.js +++ b/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-webcomponents/viewmanager/viewcontainer-lite.js @@ -7,13 +7,15 @@ define(['browser', 'dom', 'css!./viewcontainer-lite'], function (browser, dom) { var pageContainerCount = 3; var selectedPageIndex = -1; + var forceDisableAnimation = navigator.userAgent.toLowerCase().indexOf('embytheaterpi') !== -1; + function enableAnimation() { // too slow if (browser.tv) { return false; } - if (navigator.userAgent.toLowerCase().indexOf('embytheaterpi') !== -1) { + if (forceDisableAnimation) { return false; } diff --git a/MediaBrowser.WebDashboard/dashboard-ui/scripts/itemdetailpage.js b/MediaBrowser.WebDashboard/dashboard-ui/scripts/itemdetailpage.js index 1888013d2f..a5ff241ccb 100644 --- a/MediaBrowser.WebDashboard/dashboard-ui/scripts/itemdetailpage.js +++ b/MediaBrowser.WebDashboard/dashboard-ui/scripts/itemdetailpage.js @@ -1367,7 +1367,7 @@ page.querySelector('#childrenTitle').innerHTML = globalize.translate('HeaderEpisodes'); } else if (item.Type == "Episode") { - page.querySelector('#childrenTitle').innerHTML = item.SeasonName; + page.querySelector('#childrenTitle').innerHTML = globalize.translate('MoreFromValue', item.SeasonName); } else if (item.Type == "Series") { page.querySelector('#childrenTitle').innerHTML = globalize.translate('HeaderSeasons'); From d4f5c233637d5abd0175748166d327d9afaff0a4 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Thu, 22 Dec 2016 10:57:45 -0500 Subject: [PATCH 07/62] add scheduled task error handling --- .../ScheduledTasks/ScheduledTaskWorker.cs | 20 +++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/Emby.Common.Implementations/ScheduledTasks/ScheduledTaskWorker.cs b/Emby.Common.Implementations/ScheduledTasks/ScheduledTaskWorker.cs index cbc7c7c2d8..de528a94f3 100644 --- a/Emby.Common.Implementations/ScheduledTasks/ScheduledTaskWorker.cs +++ b/Emby.Common.Implementations/ScheduledTasks/ScheduledTaskWorker.cs @@ -282,9 +282,12 @@ public TaskTriggerInfo[] Triggers throw new ArgumentNullException("value"); } - SaveTriggers(value); + // This null check is not great, but is needed to handle bad user input, or user mucking with the config file incorrectly + var triggerList = value.Where(i => i != null).ToArray(); - InternalTriggers = value.Select(i => new Tuple(i, GetTrigger(i))).ToArray(); + SaveTriggers(triggerList); + + InternalTriggers = triggerList.Select(i => new Tuple(i, GetTrigger(i))).ToArray(); } } @@ -535,7 +538,8 @@ private string GetConfigurationFilePath() /// IEnumerable{BaseTaskTrigger}. private Tuple[] LoadTriggers() { - var settings = LoadTriggerSettings(); + // This null check is not great, but is needed to handle bad user input, or user mucking with the config file incorrectly + var settings = LoadTriggerSettings().Where(i => i != null).ToArray(); return settings.Select(i => new Tuple(i, GetTrigger(i))).ToArray(); } @@ -544,8 +548,12 @@ private TaskTriggerInfo[] LoadTriggerSettings() { try { - return JsonSerializer.DeserializeFromFile>(GetConfigurationFilePath()) - .ToArray(); + var list = JsonSerializer.DeserializeFromFile>(GetConfigurationFilePath()); + + if (list != null) + { + return list.ToArray(); + } } catch (FileNotFoundException) { @@ -555,8 +563,8 @@ private TaskTriggerInfo[] LoadTriggerSettings() catch (DirectoryNotFoundException) { // File doesn't exist. No biggie. Return defaults. - return ScheduledTask.GetDefaultTriggers().ToArray(); } + return ScheduledTask.GetDefaultTriggers().ToArray(); } /// From 4201d6d4d4daaf5b1bc8f6767c842ae5e6d01aa5 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Thu, 22 Dec 2016 10:58:09 -0500 Subject: [PATCH 08/62] improve ScheduleDirect showId --- .../LiveTv/Listings/SchedulesDirect.cs | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/Emby.Server.Implementations/LiveTv/Listings/SchedulesDirect.cs b/Emby.Server.Implementations/LiveTv/Listings/SchedulesDirect.cs index 04fc78c958..e2446b16ff 100644 --- a/Emby.Server.Implementations/LiveTv/Listings/SchedulesDirect.cs +++ b/Emby.Server.Implementations/LiveTv/Listings/SchedulesDirect.cs @@ -422,7 +422,7 @@ private ProgramInfo GetProgram(string channel, ScheduleDirect.Program programInf } var showType = details.showType ?? string.Empty; - + var info = new ProgramInfo { ChannelId = channel, @@ -440,10 +440,23 @@ private ProgramInfo GetProgram(string channel, ScheduleDirect.Program programInf IsKids = string.Equals(details.audience, "children", StringComparison.OrdinalIgnoreCase), IsSports = showType.IndexOf("sports", StringComparison.OrdinalIgnoreCase) != -1, IsMovie = showType.IndexOf("movie", StringComparison.OrdinalIgnoreCase) != -1 || showType.IndexOf("film", StringComparison.OrdinalIgnoreCase) != -1, - ShowId = programInfo.programID, Etag = programInfo.md5 }; + var showId = programInfo.programID ?? string.Empty; + + // According to SchedulesDirect, these are generic, unidentified episodes + // SH005316560000 + var hasUniqueShowId = !showId.StartsWith("SH", StringComparison.OrdinalIgnoreCase) || + !showId.EndsWith("0000", StringComparison.OrdinalIgnoreCase); + + if (!hasUniqueShowId) + { + showId = newID; + } + + info.ShowId = showId; + if (programInfo.videoProperties != null) { info.IsHD = programInfo.videoProperties.Contains("hdtv", StringComparer.OrdinalIgnoreCase); From 01c616af3a6c2b1f7fa992543d70f5e7066bf5c5 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Thu, 22 Dec 2016 10:58:31 -0500 Subject: [PATCH 09/62] add null checks --- MediaBrowser.MediaEncoding/Encoder/MediaEncoder.cs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/MediaBrowser.MediaEncoding/Encoder/MediaEncoder.cs b/MediaBrowser.MediaEncoding/Encoder/MediaEncoder.cs index 23e63dad0f..116a6a7cf5 100644 --- a/MediaBrowser.MediaEncoding/Encoder/MediaEncoder.cs +++ b/MediaBrowser.MediaEncoding/Encoder/MediaEncoder.cs @@ -95,6 +95,11 @@ public MediaEncoder(ILogger logger, IJsonSerializer jsonSerializer, string ffMpe int defaultImageExtractionTimeoutMs, bool enableEncoderFontFile, IEnvironmentInfo environmentInfo) { + if (jsonSerializer == null) + { + throw new ArgumentNullException("jsonSerializer"); + } + _logger = logger; _jsonSerializer = jsonSerializer; ConfigurationManager = configurationManager; @@ -632,7 +637,7 @@ private async Task GetMediaInfoInternal(string inputPath, var result = _jsonSerializer.DeserializeFromStream(process.StandardOutput.BaseStream); - if (result.streams == null && result.format == null) + if (result == null || (result.streams == null && result.format == null)) { throw new Exception("ffprobe failed - streams and format are both null."); } From baf5e3587e1ea66e5ff8964aed5a58dd5899ca50 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Thu, 22 Dec 2016 10:58:50 -0500 Subject: [PATCH 10/62] increase missing episode threshold --- MediaBrowser.Providers/TV/MissingEpisodeProvider.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MediaBrowser.Providers/TV/MissingEpisodeProvider.cs b/MediaBrowser.Providers/TV/MissingEpisodeProvider.cs index 4992675da2..5385125577 100644 --- a/MediaBrowser.Providers/TV/MissingEpisodeProvider.cs +++ b/MediaBrowser.Providers/TV/MissingEpisodeProvider.cs @@ -238,7 +238,7 @@ group e by e.Item1 into g var targetSeries = DetermineAppropriateSeries(series, tuple.Item1); var seasonOffset = TvdbSeriesProvider.GetSeriesOffset(targetSeries.ProviderIds) ?? ((targetSeries.AnimeSeriesIndex ?? 1) - 1); - var unairedThresholdDays = 1; + var unairedThresholdDays = 2; now = now.AddDays(0 - unairedThresholdDays); if (airDate.Value < now) From 6f1be1e5a8f15cf64e2300aed54c744cd16d44f3 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Thu, 22 Dec 2016 10:59:08 -0500 Subject: [PATCH 11/62] limit guide date picker to actual guide days --- Emby.Server.Implementations/LiveTv/LiveTvManager.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Emby.Server.Implementations/LiveTv/LiveTvManager.cs b/Emby.Server.Implementations/LiveTv/LiveTvManager.cs index 525db4036d..62a0738c72 100644 --- a/Emby.Server.Implementations/LiveTv/LiveTvManager.cs +++ b/Emby.Server.Implementations/LiveTv/LiveTvManager.cs @@ -2647,7 +2647,7 @@ public async Task CloseLiveStream(string id) public GuideInfo GetGuideInfo() { var startDate = DateTime.UtcNow; - var endDate = startDate.AddDays(14); + var endDate = startDate.AddDays(GetGuideDays()); return new GuideInfo { From 40edd3a066d22cb150ebe31d0267bf9fc46fdb1c Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Thu, 22 Dec 2016 11:47:43 -0500 Subject: [PATCH 12/62] limit http compression --- .../HttpServer/HttpResultFactory.cs | 71 +++++++++---------- 1 file changed, 33 insertions(+), 38 deletions(-) diff --git a/Emby.Server.Implementations/HttpServer/HttpResultFactory.cs b/Emby.Server.Implementations/HttpServer/HttpResultFactory.cs index 995dc7b7b0..e78446bc84 100644 --- a/Emby.Server.Implementations/HttpServer/HttpResultFactory.cs +++ b/Emby.Server.Implementations/HttpServer/HttpResultFactory.cs @@ -203,20 +203,12 @@ public object ToOptimizedResult(IRequest request, T dto) // Do not use the memoryStreamFactory here, they don't place nice with compression using (var ms = new MemoryStream()) { - using (var compressionStream = GetCompressionStream(ms, compressionType)) - { - ContentTypes.Instance.SerializeToStream(request, dto, compressionStream); - compressionStream.Dispose(); - - var compressedBytes = ms.ToArray(); + ContentTypes.Instance.SerializeToStream(request, dto, ms); + ms.Position = 0; - var httpResult = new StreamWriter(compressedBytes, request.ResponseContentType, _logger); + var responseHeaders = new Dictionary(StringComparer.OrdinalIgnoreCase); - //httpResult.Headers["Content-Length"] = compressedBytes.Length.ToString(UsCulture); - httpResult.Headers["Content-Encoding"] = compressionType; - - return httpResult; - } + return GetCompressedResult(ms, compressionType, responseHeaders, false, request.ResponseContentType).Result; } } @@ -591,45 +583,53 @@ private async Task GetStaticResult(IRequest requestContext, StaticR }; } - string content; - using (var stream = await factoryFn().ConfigureAwait(false)) { - using (var reader = new StreamReader(stream)) + return await GetCompressedResult(stream, requestedCompressionType, responseHeaders, isHeadRequest, contentType).ConfigureAwait(false); + } + } + + private async Task GetCompressedResult(Stream stream, + string requestedCompressionType, + IDictionary responseHeaders, + bool isHeadRequest, + string contentType) + { + using (var reader = new MemoryStream()) + { + await stream.CopyToAsync(reader).ConfigureAwait(false); + + reader.Position = 0; + var content = reader.ToArray(); + + if (content.Length >= 1024) { - content = await reader.ReadToEndAsync().ConfigureAwait(false); + content = Compress(content, requestedCompressionType); + responseHeaders["Content-Encoding"] = requestedCompressionType; } - } - var contents = Compress(content, requestedCompressionType); + responseHeaders["Content-Length"] = content.Length.ToString(UsCulture); - responseHeaders["Content-Length"] = contents.Length.ToString(UsCulture); - responseHeaders["Content-Encoding"] = requestedCompressionType; + if (isHeadRequest) + { + return GetHttpResult(new byte[] { }, contentType, true); + } - if (isHeadRequest) - { - return GetHttpResult(new byte[] { }, contentType, true); + return GetHttpResult(content, contentType, true, responseHeaders); } - - return GetHttpResult(contents, contentType, true, responseHeaders); } - private byte[] Compress(string text, string compressionType) + private byte[] Compress(byte[] bytes, string compressionType) { if (compressionType == "deflate") - return Deflate(text); + return Deflate(bytes); if (compressionType == "gzip") - return GZip(text); + return GZip(bytes); throw new NotSupportedException(compressionType); } - private byte[] Deflate(string text) - { - return Deflate(Encoding.UTF8.GetBytes(text)); - } - private byte[] Deflate(byte[] bytes) { // In .NET FX incompat-ville, you can't access compressed bytes without closing DeflateStream @@ -644,11 +644,6 @@ private byte[] Deflate(byte[] bytes) } } - private byte[] GZip(string text) - { - return GZip(Encoding.UTF8.GetBytes(text)); - } - private byte[] GZip(byte[] buffer) { using (var ms = new MemoryStream()) From aeb1616ef73cbe44080cec359bdab1adc1b62c86 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Thu, 22 Dec 2016 11:47:53 -0500 Subject: [PATCH 13/62] update video params --- MediaBrowser.Api/Playback/Progressive/VideoService.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MediaBrowser.Api/Playback/Progressive/VideoService.cs b/MediaBrowser.Api/Playback/Progressive/VideoService.cs index e29aa7d5aa..7ae64b8348 100644 --- a/MediaBrowser.Api/Playback/Progressive/VideoService.cs +++ b/MediaBrowser.Api/Playback/Progressive/VideoService.cs @@ -153,7 +153,7 @@ private string GetVideoArguments(StreamState state, string videoCodec) if (!state.RunTimeTicks.HasValue) { - args += " -fflags +genpts -flags +global_header"; + args += " -flags -global_header -fflags +genpts"; } return args; From 6f392400db5e8c8028386ecfc71ae58082b29313 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Thu, 22 Dec 2016 11:48:06 -0500 Subject: [PATCH 14/62] placeholder --- SocketHttpListener.Portable/Net/ResponseStream.cs | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/SocketHttpListener.Portable/Net/ResponseStream.cs b/SocketHttpListener.Portable/Net/ResponseStream.cs index 6067a89ec6..a79a187912 100644 --- a/SocketHttpListener.Portable/Net/ResponseStream.cs +++ b/SocketHttpListener.Portable/Net/ResponseStream.cs @@ -136,6 +136,11 @@ public override void Write(byte[] buffer, int offset, int count) if (disposed) throw new ObjectDisposedException(GetType().ToString()); + if (count == 0) + { + //return; + } + byte[] bytes = null; MemoryStream ms = GetHeaders(response, _memoryStreamFactory, false); bool chunked = response.SendChunked; @@ -176,6 +181,11 @@ public override async Task WriteAsync(byte[] buffer, int offset, int count, Canc if (disposed) throw new ObjectDisposedException(GetType().ToString()); + if (count == 0) + { + //return; + } + byte[] bytes = null; MemoryStream ms = GetHeaders(response, _memoryStreamFactory, false); bool chunked = response.SendChunked; @@ -206,7 +216,7 @@ public override async Task WriteAsync(byte[] buffer, int offset, int count, Canc await stream.WriteAsync(buffer, offset, count, cancellationToken).ConfigureAwait(false); } - if (response.SendChunked) + if (chunked) stream.Write(crlf, 0, 2); } From 9afd6e508b2818115afc2b00a3eb18e760049f91 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Thu, 22 Dec 2016 11:48:24 -0500 Subject: [PATCH 15/62] update comparisons --- SocketHttpListener.Portable/Net/HttpListenerResponse.cs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/SocketHttpListener.Portable/Net/HttpListenerResponse.cs b/SocketHttpListener.Portable/Net/HttpListenerResponse.cs index c1182de343..9a5862cb94 100644 --- a/SocketHttpListener.Portable/Net/HttpListenerResponse.cs +++ b/SocketHttpListener.Portable/Net/HttpListenerResponse.cs @@ -386,7 +386,7 @@ internal void SendHeaders(bool closing, MemoryStream ms) if (content_type != null) { - if (content_encoding != null && content_type.IndexOf("charset=", StringComparison.Ordinal) == -1) + if (content_encoding != null && content_type.IndexOf("charset=", StringComparison.OrdinalIgnoreCase) == -1) { string enc_name = content_encoding.WebName; headers.SetInternal("Content-Type", content_type + "; charset=" + enc_name); @@ -429,9 +429,10 @@ internal void SendHeaders(bool closing, MemoryStream ms) * HttpStatusCode.InternalServerError 500 * HttpStatusCode.ServiceUnavailable 503 */ - bool conn_close = (status_code == 408 || status_code == 411 || + bool conn_close = status_code == 400 || status_code == 408 || status_code == 411 || status_code == 413 || status_code == 414 || - status_code == 503); + status_code == 500 || + status_code == 503; if (conn_close == false) conn_close = !context.Request.KeepAlive; From 7745e9cc656d16f02e0fd8af50843452ceaebb5d Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Thu, 22 Dec 2016 16:52:18 -0500 Subject: [PATCH 16/62] update startup wizard instructions --- .../bower_components/emby-webcomponents/.bower.json | 8 ++++---- .../bower_components/emby-webcomponents/browser.js | 4 ++++ .../emby-webcomponents/browserdeviceprofile.js | 2 +- .../dashboard-ui/bower_components/hlsjs/.bower.json | 8 ++++---- .../dashboard-ui/bower_components/hlsjs/API.md | 12 +----------- .../dashboard-ui/bower_components/hlsjs/README.md | 13 ++++++------- .../dashboard-ui/bower_components/hlsjs/bower.json | 2 +- .../bower_components/hlsjs/dist/hls.min.js | 13 +++++++------ .../bower_components/hlsjs/package.json | 6 +++--- .../dashboard-ui/dashboard/wizardcomponents.js | 2 ++ .../dashboard-ui/scripts/site.js | 5 +++-- .../dashboard-ui/strings/en-US.json | 1 + .../dashboard-ui/wizardcomponents.html | 3 ++- 13 files changed, 39 insertions(+), 40 deletions(-) diff --git a/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-webcomponents/.bower.json b/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-webcomponents/.bower.json index 5ff3657a04..5028013450 100644 --- a/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-webcomponents/.bower.json +++ b/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-webcomponents/.bower.json @@ -14,12 +14,12 @@ }, "devDependencies": {}, "ignore": [], - "version": "1.4.396", - "_release": "1.4.396", + "version": "1.4.397", + "_release": "1.4.397", "_resolution": { "type": "version", - "tag": "1.4.396", - "commit": "4e12304c8e306a0cb82191bb47b9db4d9ceeef9a" + "tag": "1.4.397", + "commit": "9adcc0001dbf032595448070447de469a8f24130" }, "_source": "https://github.com/MediaBrowser/emby-webcomponents.git", "_target": "^1.2.1", diff --git a/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-webcomponents/browser.js b/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-webcomponents/browser.js index f47733e451..cacaa3a57e 100644 --- a/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-webcomponents/browser.js +++ b/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-webcomponents/browser.js @@ -258,6 +258,10 @@ browser.web0s = userAgent.toLowerCase().indexOf('Web0S'.toLowerCase()) !== -1; browser.edgeUwp = browser.edge && userAgent.toLowerCase().indexOf('msapphost') !== -1; + if (browser.edgeUwp) { + browser.edge = true; + } + browser.tv = isTv(); browser.operaTv = browser.tv && userAgent.toLowerCase().indexOf('opr/') !== -1; diff --git a/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-webcomponents/browserdeviceprofile.js b/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-webcomponents/browserdeviceprofile.js index cab282ae92..609f9505d6 100644 --- a/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-webcomponents/browserdeviceprofile.js +++ b/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-webcomponents/browserdeviceprofile.js @@ -240,7 +240,7 @@ define(['browser'], function (browser) { return function (options) { options = options || {}; - var physicalAudioChannels = options.audioChannels || (browser.tv || browser.xboxOne || browser.ps4 || !browser.mobile ? 6 : 2); + var physicalAudioChannels = options.audioChannels || (browser.mobile ? 2 : 6); var bitrateSetting = getMaxBitrate(); diff --git a/MediaBrowser.WebDashboard/dashboard-ui/bower_components/hlsjs/.bower.json b/MediaBrowser.WebDashboard/dashboard-ui/bower_components/hlsjs/.bower.json index dc2fb68274..e99d7dc1da 100644 --- a/MediaBrowser.WebDashboard/dashboard-ui/bower_components/hlsjs/.bower.json +++ b/MediaBrowser.WebDashboard/dashboard-ui/bower_components/hlsjs/.bower.json @@ -1,6 +1,6 @@ { "name": "hls.js", - "version": "0.6.14", + "version": "0.6.15", "license": "Apache-2.0", "description": "Media Source Extension - HLS library, by/for Dailymotion", "homepage": "https://github.com/dailymotion/hls.js", @@ -16,11 +16,11 @@ "test", "tests" ], - "_release": "0.6.14", + "_release": "0.6.15", "_resolution": { "type": "version", - "tag": "v0.6.14", - "commit": "0e12670c875f4e3235b02ccc7455abb923333eb2" + "tag": "v0.6.15", + "commit": "f0da89e4f6256457ebf87c6d5f9fd007d0ccca69" }, "_source": "https://github.com/dailymotion/hls.js.git", "_target": "^0.6.11", diff --git a/MediaBrowser.WebDashboard/dashboard-ui/bower_components/hlsjs/API.md b/MediaBrowser.WebDashboard/dashboard-ui/bower_components/hlsjs/API.md index 9803226b93..1686ddfb86 100644 --- a/MediaBrowser.WebDashboard/dashboard-ui/bower_components/hlsjs/API.md +++ b/MediaBrowser.WebDashboard/dashboard-ui/bower_components/hlsjs/API.md @@ -402,16 +402,6 @@ Enable WebWorker (if available on browser) for TS demuxing/MP4 remuxing, to impr Enable to use JavaScript version AES decryption for fallback of WebCrypto API. - -#### `enableLazyURLResolve` - -(default: `false`) - -Enable lazy URL resolving in fragment/key object. -Instead of resolving relative fragment/key URL on playlist parsing, URL are resolved on `FRAG_LOADING` / `KEY_LOADING` -this improves manifest parsing performance. -the drawback is that `frag.url` is not set in frag object, instead it is replaced by `frag.baseurl and `frag.relurl` - #### `startLevel` (default: `undefined`) @@ -711,7 +701,7 @@ If `abrBandWidthUpFactor * bandwidth average < level.bitrate` then ABR can switc (default: `0`) Return the capping/min bandwidth value that could be used by automatic level selection algorithm. -Useful when browser or tab of the browser is not in the focus and bandwidth drops +Useful when browser or tab of the browser is not in the focus and bandwidth drops ## Video Binding/Unbinding API diff --git a/MediaBrowser.WebDashboard/dashboard-ui/bower_components/hlsjs/README.md b/MediaBrowser.WebDashboard/dashboard-ui/bower_components/hlsjs/README.md index bfaafa67c1..b95ee3dac9 100644 --- a/MediaBrowser.WebDashboard/dashboard-ui/bower_components/hlsjs/README.md +++ b/MediaBrowser.WebDashboard/dashboard-ui/bower_components/hlsjs/README.md @@ -54,11 +54,11 @@ HTMLVideoElement control and events could be used seamlessly. |[](http://www.adultswim.com/videos/streams)|[](https://www.akamai.com)|[](https://www.canalplus.fr)|[](http://www.dailymotion.com)| |---|---|---|---| -|[](http://www.flowplayer.org)|[](http://www.globo.com)|[](https://www.gl-systemhaus.de/)|[](http://nettrek.de/)| -|[](https://www.nytimes.com/)|[](https://www.peer5.com/)|[](http://qbrick.com/)|[](https://www.radiantmediaplayer.com/)| -|[](http://www.rts.ch/)|[](https://www.snapstream.com/)|[](https://www.streamamg.com/)|[](https://streamshark.io/)| -|[](http://my.tablotv.com/)|[](https://www.streamroot.io/)|[](https://www.ted.com/)|[](https://twitter.com/)| -|[](http://vwflow.com)| +|[](http://www.flowplayer.org)|[](http://www.foxsports.com.au)|[](http://www.globo.com)|[](https://www.gl-systemhaus.de/)| +|[](http://nettrek.de/)|[](https://www.nytimes.com/)|[](https://www.peer5.com/)|[](http://qbrick.com/)| +|[](https://www.radiantmediaplayer.com/)|[](http://www.rts.ch/)|[](https://www.snapstream.com/)|[](https://www.streamamg.com/)| +|[](https://streamshark.io/)|[](http://my.tablotv.com/)|[](https://www.streamroot.io/)|[](https://www.ted.com/)| +|[](https://twitter.com/)|[](http://vwflow.com)| ## Player Integration @@ -154,14 +154,13 @@ All HLS resources must be delivered with [CORS headers](https://developer.mozill - Timed Metadata for HTTP Live Streaming (in ID3 format, carried in MPEG-2 TS) - AES-128 decryption (AES-128 mode) - CEA-708 captions - - Alternate Audio Track Rendition (Master Playlist with alternative Audio) for VoD playlists + - Alternate Audio Track Rendition (Master Playlist with alternative Audio) for VoD and Live playlists ## Not Supported (Yet) - WebVTT container - MP3 Elementary Stream in Edge for Windows 10+ - MP3 container - - Alternate Audio Track Rendition for live playlists ### Supported M3U8 tags diff --git a/MediaBrowser.WebDashboard/dashboard-ui/bower_components/hlsjs/bower.json b/MediaBrowser.WebDashboard/dashboard-ui/bower_components/hlsjs/bower.json index ced71075d5..73438520f4 100644 --- a/MediaBrowser.WebDashboard/dashboard-ui/bower_components/hlsjs/bower.json +++ b/MediaBrowser.WebDashboard/dashboard-ui/bower_components/hlsjs/bower.json @@ -1,6 +1,6 @@ { "name": "hls.js", - "version": "0.6.14", + "version": "0.6.15", "license": "Apache-2.0", "description": "Media Source Extension - HLS library, by/for Dailymotion", "homepage": "https://github.com/dailymotion/hls.js", diff --git a/MediaBrowser.WebDashboard/dashboard-ui/bower_components/hlsjs/dist/hls.min.js b/MediaBrowser.WebDashboard/dashboard-ui/bower_components/hlsjs/dist/hls.min.js index a497a5bb04..a4378e38fe 100644 --- a/MediaBrowser.WebDashboard/dashboard-ui/bower_components/hlsjs/dist/hls.min.js +++ b/MediaBrowser.WebDashboard/dashboard-ui/bower_components/hlsjs/dist/hls.min.js @@ -1,6 +1,7 @@ -!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var t;t="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,t.Hls=e()}}(function(){var e;return function e(t,r,i){function a(s,o){if(!r[s]){if(!t[s]){var l="function"==typeof require&&require;if(!o&&l)return l(s,!0);if(n)return n(s,!0);var u=new Error("Cannot find module '"+s+"'");throw u.code="MODULE_NOT_FOUND",u}var d=r[s]={exports:{}};t[s][0].call(d.exports,function(e){var r=t[s][1][e];return a(r?r:e)},d,d.exports,e,t,r,i)}return r[s].exports}for(var n="function"==typeof require&&require,s=0;s0&&this._events[e].length>r&&(this._events[e].warned=!0,"function"==typeof console.trace)),this},i.prototype.on=i.prototype.addListener,i.prototype.once=function(e,t){function r(){this.removeListener(e,r),i||(i=!0,t.apply(this,arguments))}if(!a(t))throw TypeError("listener must be a function");var i=!1;return r.listener=t,this.on(e,r),this},i.prototype.removeListener=function(e,t){var r,i,n,o;if(!a(t))throw TypeError("listener must be a function");if(!this._events||!this._events[e])return this;if(r=this._events[e],n=r.length,i=-1,r===t||a(r.listener)&&r.listener===t)delete this._events[e],this._events.removeListener&&this.emit("removeListener",e,t);else if(s(r)){for(o=n;o-- >0;)if(r[o]===t||r[o].listener&&r[o].listener===t){i=o;break}if(i<0)return this;1===r.length?(r.length=0,delete this._events[e]):r.splice(i,1),this._events.removeListener&&this.emit("removeListener",e,t)}return this},i.prototype.removeAllListeners=function(e){var t,r;if(!this._events)return this;if(!this._events.removeListener)return 0===arguments.length?this._events={}:this._events[e]&&delete this._events[e],this;if(0===arguments.length){for(t in this._events)"removeListener"!==t&&this.removeAllListeners(t);return this.removeAllListeners("removeListener"),this._events={},this}if(r=this._events[e],a(r))this.removeListener(e,r);else if(r)for(;r.length;)this.removeListener(e,r[r.length-1]);return delete this._events[e],this},i.prototype.listeners=function(e){var t;return t=this._events&&this._events[e]?a(this._events[e])?[this._events[e]]:this._events[e].slice():[]},i.prototype.listenerCount=function(e){if(this._events){var t=this._events[e];if(a(t))return 1;if(t)return t.length}return 0},i.listenerCount=function(e,t){return e.listenerCount(t)}},{}],2:[function(t,r,i){!function(t){var a={buildAbsoluteURL:function(e,t){if(t=t.trim(),/^[a-z]+:/i.test(t))return t;var r=null,i=null,n=/^([^#]*)(.*)$/.exec(t);n&&(i=n[2],t=n[1]);var s=/^([^\?]*)(.*)$/.exec(t);s&&(r=s[2],t=s[1]);var o=/^([^#]*)(.*)$/.exec(e);o&&(e=o[1]);var l=/^([^\?]*)(.*)$/.exec(e);l&&(e=l[1]);var u=/^(([a-z]+:)?\/\/[a-z0-9\.\-_~]+(:[0-9]+)?)?(\/.*)$/i.exec(e);if(!u)throw new Error("Error trying to parse base URL.");var d=u[2]||"",f=u[1]||"",h=u[4],c=null;return c=/^\/\//.test(t)?d+"//"+a.buildAbsolutePath("",t.substring(2)):/^\//.test(t)?f+"/"+a.buildAbsolutePath("",t.substring(1)):a.buildAbsolutePath(f+h,t),r&&(c+=r),i&&(c+=i),c},buildAbsolutePath:function(e,t){for(var r,i,a=t,n="",s=e.replace(/[^\/]*$/,a.replace(/(\/|^)(?:\.?\/+)+/g,"$1")),o=0;i=s.indexOf("/../",o),i>-1;o=i+r)r=/^\/(?:\.\.\/)*/.exec(s.slice(i))[0].length,n=(n+s.substring(o,i)).replace(new RegExp("(?:\\/+[^\\/]*){0,"+(r-1)/3+"}$"),"/");return n+s.substr(o)}};"object"==typeof i&&"object"==typeof r?r.exports=a:"function"==typeof e&&e.amd?e([],function(){return a}):"object"==typeof i?i.URLToolkit=a:t.URLToolkit=a}(this)},{}],3:[function(e,t,r){var i=arguments[3],a=arguments[4],n=arguments[5],s=JSON.stringify;t.exports=function(e,t){function r(e){p[e]=!0;for(var t in a[e][1]){var i=a[e][1][t];p[i]||r(i)}}for(var o,l=Object.keys(n),u=0,d=l.length;u500*r.duration/o){var l=e.levels,d=Math.max(1,n.bw?n.bw/8:1e3*n.loaded/s),f=n.total?n.total:Math.max(n.loaded,Math.round(r.duration*l[r.level].bitrate/8)),h=t.currentTime,v=(f-n.loaded)/d,p=(c.default.bufferInfo(t,h,e.config.maxBufferHole).end-h)/o;if(p<2*r.duration/o&&v>p){var y=void 0,m=void 0;for(m=r.level-1;m>a&&(y=r.duration*l[m].bitrate/(6.4*d),!(y=i;u--){var d=l[u],f=d.details,h=f?f.totalduration/f.fragments.length:t,c=!!f&&f.live,v=void 0;v=u<=e?s*r:o*r;var p=l[u].bitrate,y=p*h/v;if(g.logger.trace("level/adjustedbw/bitrate/avgDuration/maxFetchDuration/fetchDuration: "+u+"/"+Math.round(v)+"/"+p+"/"+h+"/"+n+"/"+y),v>p&&(!y||c||yr)return a;return 0}},{key:"maxAutoLevel",get:function(){var e,t=this.hls.levels,r=this._autoLevelCapping;return e=r===-1&&t&&t.length?t.length-1:r}},{key:"nextABRAutoLevel",get:function(){var e=this.hls,t=this.maxAutoLevel,r=e.levels,i=e.config,a=this.minAutoLevel,n=e.media,s=this.lastLoadedFragLevel,o=this.fragCurrent?this.fragCurrent.duration:0,l=n?n.currentTime:0,u=n&&0!==n.playbackRate?Math.abs(n.playbackRate):1,d=this.bwEstimator?this.bwEstimator.getEstimate():i.abrEwmaDefaultEstimate,f=(c.default.bufferInfo(n,l,i.maxBufferHole).end-l)/u,h=this.findBestLevel(s,o,d,a,t,f,i.abrBandWidthFactor,i.abrBandWidthUpFactor,r);if(h>=0)return h;g.logger.trace("rebuffering expected to happen, lets try to find a quality level minimizing the rebuffering");var v=i.maxStarvationDelay,p=i.abrBandWidthFactor,y=i.abrBandWidthUpFactor;if(0===f){var m=this.bitrateTestDelay;m&&(v=i.maxLoadingDelay-m,g.logger.trace("bitrate test took "+Math.round(1e3*m)+"ms, set first fragment max fetchDuration to "+Math.round(1e3*v)+" ms"),p=y=1)}return h=this.findBestLevel(s,o,d,a,t,f+v,p,y,r),Math.max(h,0)}}]),t}(f.default);r.default=m},{26:26,27:27,28:28,30:30,45:45,9:9}],5:[function(e,t,r){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function n(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(r,"__esModule",{value:!0});var o=function(){function e(e,t){for(var r=0;r0&&e===-1?(k.logger.log("audio:override startPosition with lastCurrentTime @"+t.toFixed(3)),this.state=A.IDLE):(this.lastCurrentTime=this.startPosition?this.startPosition:e,this.state=A.STARTING),this.nextLoadPosition=this.startPosition=this.lastCurrentTime,this.tick()}else this.startPosition=e,this.state=A.STOPPED}},{key:"stopLoad",value:function(){var e=this.fragCurrent;e&&(e.loader&&e.loader.abort(),this.fragCurrent=null),this.fragPrevious=null,this.demuxer&&(this.demuxer.destroy(),this.demuxer=null),this.state=A.STOPPED}},{key:"tick",value:function(){this.ticks++,1===this.ticks&&(this.doTick(),this.ticks>1&&setTimeout(this.tick,1),this.ticks=0)}},{key:"doTick",value:function(){var e,t,r,i=this.hls,a=i.config;switch(this.state){case A.ERROR:case A.PAUSED:break;case A.STARTING:this.state=A.WAITING_TRACK,this.loadedmetadata=!1;break;case A.IDLE:if(!this.media&&(this.startFragRequested||!a.startFragPrefetch))break;e=this.loadedmetadata?this.media.currentTime:this.nextLoadPosition;var n=this.mediaBuffer?this.mediaBuffer:this.media,s=f.default.bufferInfo(n,e,a.maxBufferHole),o=s.len,l=s.end,d=this.fragPrevious,h=a.maxMaxBufferLength;if(oy-t&&(t=0),e=u.default.search(c,function(e){return e.start+e.duration-t<=l?1:e.start-t>l?-1:0})):e=c[v-1],e&&(m=e,p=e.start,d&&m.level===d.level&&m.sn===d.sn&&(m.snE&&Math.abs(this.fragLoadIdx-m.loadIdx)=R||T)&&(k.logger.log("audioStreamController: retryDate reached, switch back to IDLE state"),this.state=A.IDLE);break;case A.STOPPED:case A.FRAG_LOADING:case A.PARSING:case A.PARSED:case A.ENDED:}}},{key:"onMediaAttached",value:function(e){var t=this.media=this.mediaBuffer=e.media;this.onvseeking=this.onMediaSeeking.bind(this),this.onvended=this.onMediaEnded.bind(this),t.addEventListener("seeking",this.onvseeking),t.addEventListener("ended",this.onvended);var r=this.config;this.tracks&&r.autoStartLoad&&this.startLoad(r.startPosition)}},{key:"onMediaDetaching",value:function(){var e=this.media;e&&e.ended&&(k.logger.log("MSE detaching and video ended, reset startPosition"),this.startPosition=this.lastCurrentTime=0);var t=this.tracks;t&&t.forEach(function(e){e.details&&e.details.fragments.forEach(function(e){e.loadCounter=void 0})}),e&&(e.removeEventListener("seeking",this.onvseeking),e.removeEventListener("ended",this.onvended),this.onvseeking=this.onvseeked=this.onvended=null),this.media=this.mediaBuffer=null,this.loadedmetadata=!1,this.stopLoad()}},{key:"onMediaSeeking",value:function(){this.state===A.ENDED&&(this.state=A.IDLE),this.media&&(this.lastCurrentTime=this.media.currentTime),void 0!==this.fragLoadIdx&&(this.fragLoadIdx+=2*this.config.fragLoadingLoopThreshold),this.tick()}},{key:"onMediaEnded",value:function(){this.startPosition=this.lastCurrentTime=0}},{key:"onAudioTracksUpdated",value:function(e){k.logger.log("audio tracks updated"),this.tracks=e.audioTracks}},{key:"onAudioTrackSwitch",value:function(e){var t=!!e.url;this.trackId=e.id,this.state=A.IDLE,this.fragCurrent=null,this.state=A.PAUSED,t?this.timer||(this.timer=setInterval(this.ontick,100)):this.demuxer&&(this.demuxer.destroy(),this.demuxer=null),this.hls.trigger(g.default.BUFFER_FLUSHING,{startOffset:0,endOffset:Number.POSITIVE_INFINITY,type:"audio"}),this.tick()}},{key:"onAudioTrackLoaded",value:function(e){var t=e.details,r=e.id,i=this.tracks[r],a=t.totalduration;if(k.logger.log("track "+r+" loaded ["+t.startSN+","+t.endSN+"],duration:"+a),t.PTSKnown=!1,i.details=t,!this.startFragRequested){if(this.startPosition===-1){var n=t.startTimeOffset;isNaN(n)?this.startPosition=0:(k.logger.log("start time offset found in playlist, adjust startPosition to "+n),this.startPosition=n)}this.nextLoadPosition=this.startPosition}this.state===A.WAITING_TRACK&&(this.state=A.IDLE),this.tick()}},{key:"onKeyLoaded",value:function(){this.state===A.KEY_LOADING&&(this.state=A.IDLE,this.tick())}},{key:"onFragLoaded",value:function(e){var t=this.fragCurrent;if(this.state===A.FRAG_LOADING&&t&&"audio"===e.frag.type&&e.frag.level===t.level&&e.frag.sn===t.sn){this.state=A.PARSING,this.stats=e.stats;var r=this.tracks[this.trackId],i=r.details,a=i.totalduration,n=t.start,s=t.level,o=t.sn,l=this.config.defaultAudioCodec||r.audioCodec;this.pendingAppending=0,this.demuxer||(this.demuxer=new c.default(this.hls,"audio")),k.logger.log("Demuxing "+o+" of ["+i.startSN+" ,"+i.endSN+"],track "+s);var u=i.PTSKnown||!i.live;this.demuxer.push(e.payload,l,null,n,t.cc,s,o,a,t.decryptdata,u)}this.fragLoadError=0}},{key:"onFragParsingInitSegment",value:function(e){var t=this.fragCurrent;if(t&&"audio"===e.id&&e.sn===t.sn&&e.level===t.level&&this.state===A.PARSING){var r=e.tracks,i=void 0;if(i=r.audio){i.levelCodec="mp4a.40.2",i.id=e.id,this.hls.trigger(g.default.BUFFER_CODECS,r),k.logger.log("audio track:audio,container:"+i.container+",codecs[level/parsed]=["+i.levelCodec+"/"+i.codec+"]");var a=i.initSegment;a&&(this.pendingAppending++,this.hls.trigger(g.default.BUFFER_APPENDING,{type:"audio",data:a,parent:"audio",content:"initSegment"})),this.tick()}}}},{key:"onFragParsingData",value:function(e){var t=this,r=this.fragCurrent;if(r&&"audio"===e.id&&e.sn===r.sn&&e.level===r.level&&this.state===A.PARSING){var i=this.tracks[this.trackId],a=this.fragCurrent;k.logger.log("parsed "+e.type+",PTS:["+e.startPTS.toFixed(3)+","+e.endPTS.toFixed(3)+"],DTS:["+e.startDTS.toFixed(3)+"/"+e.endDTS.toFixed(3)+"],nb:"+e.nb),E.default.updateFragPTSDTS(i.details,a.sn,e.startPTS,e.endPTS),[e.data1,e.data2].forEach(function(r){r&&(t.pendingAppending++,t.hls.trigger(g.default.BUFFER_APPENDING,{type:e.type,data:r,parent:"audio",content:"data"}))}),this.tick()}}},{key:"onFragParsed",value:function(e){var t=this.fragCurrent;t&&"audio"===e.id&&e.sn===t.sn&&e.level===t.level&&this.state===A.PARSING&&(this.stats.tparsed=performance.now(),this.state=A.PARSED,this._checkAppendedParsed())}},{key:"onBufferCreated",value:function(e){var t=e.tracks.audio;t&&(this.mediaBuffer=t.buffer,this.loadedmetadata=!0)}},{key:"onBufferAppended",value:function(e){if("audio"===e.parent)switch(this.state){case A.PARSING:case A.PARSED:this.pendingAppending--,this._checkAppendedParsed()}}},{key:"_checkAppendedParsed",value:function(){if(this.state===A.PARSED&&0===this.pendingAppending){var e=this.fragCurrent,t=this.stats;if(e){this.fragPrevious=e,t.tbuffered=performance.now(),this.hls.trigger(g.default.FRAG_BUFFERED,{stats:t,frag:e,id:"audio"});var r=this.mediaBuffer?this.mediaBuffer:this.media;k.logger.log("audio buffered : "+R.default.toString(r.buffered)),this.state=A.IDLE}this.tick()}}},{key:"onError",value:function(e){var t=e.frag;if(!t||"audio"===t.type)switch(e.details){case _.ErrorDetails.FRAG_LOAD_ERROR:case _.ErrorDetails.FRAG_LOAD_TIMEOUT:if(!e.fatal){var r=this.fragLoadError;r?r++:r=1;var i=this.config;if(r<=i.fragLoadingMaxRetry){this.fragLoadError=r,t.loadCounter=0;var a=Math.min(Math.pow(2,r-1)*i.fragLoadingRetryDelay,i.fragLoadingMaxRetryTimeout);k.logger.warn("audioStreamController: frag loading failed, retry in "+a+" ms"),this.retryDate=performance.now()+a,this.state=A.FRAG_LOADING_WAITING_RETRY}else k.logger.error("audioStreamController: "+e.details+" reaches max retry, redispatch as fatal ..."),e.fatal=!0,this.hls.trigger(g.default.ERROR,e),this.state=A.ERROR}break;case _.ErrorDetails.FRAG_LOOP_LOADING_ERROR:case _.ErrorDetails.AUDIO_TRACK_LOAD_ERROR:case _.ErrorDetails.AUDIO_TRACK_LOAD_TIMEOUT:case _.ErrorDetails.KEY_LOAD_ERROR:case _.ErrorDetails.KEY_LOAD_TIMEOUT:this.state!==A.ERROR&&(this.state=e.fatal?A.ERROR:A.IDLE,k.logger.warn("audioStreamController: "+e.details+" while loading frag,switch to "+this.state+" state ..."))}}},{key:"onBufferFlushed",value:function(){this.fragLoadIdx+=2*this.config.fragLoadingLoopThreshold,this.state=A.IDLE,this.fragPrevious=null,this.tick()}}]),t}(y.default);r.default=T},{22:22,26:26,27:27,28:28,30:30,31:31,41:41,45:45,46:46}],6:[function(e,t,r){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function n(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(r,"__esModule",{value:!0});var o=function(){function e(e,t){for(var r=0;r=0&&e.1){var n=i.updating;try{i.abort()}catch(e){n=!0,h.logger.warn("can not abort audio buffer: "+e)}n?this.audioTimestampOffset=e.start:(h.logger.warn("change mpeg audio timestamp offset from "+i.timestampOffset+" to "+e.start),i.timestampOffset=e.start)}}}},{key:"onManifestParsed",value:function(e){var t=e.audio,r=e.video,i=0;e.altAudio&&(t||r)&&(i=(t?1:0)+(r?1:0),h.logger.log(i+" sourceBuffer(s) expected")),this.sourceBufferNb=i}},{key:"onMediaAttaching",value:function(e){var t=this.media=e.media;if(t){var r=this.mediaSource=new MediaSource;this.onmso=this.onMediaSourceOpen.bind(this),this.onmse=this.onMediaSourceEnded.bind(this),this.onmsc=this.onMediaSourceClose.bind(this),r.addEventListener("sourceopen",this.onmso),r.addEventListener("sourceended",this.onmse),r.addEventListener("sourceclose",this.onmsc),t.src=URL.createObjectURL(r)}}},{key:"onMediaDetaching",value:function(){h.logger.log("media source detaching");var e=this.mediaSource;if(e){if("open"===e.readyState)try{e.endOfStream()}catch(e){h.logger.warn("onMediaDetaching:"+e.message+" while calling endOfStream")}e.removeEventListener("sourceopen",this.onmso),e.removeEventListener("sourceended",this.onmse),e.removeEventListener("sourceclose",this.onmsc),this.media&&(URL.revokeObjectURL(this.media.src),this.media.removeAttribute("src"),this.media.load()),this.mediaSource=null,this.media=null,this.pendingTracks={},this.tracks={},this.sourceBuffer={},this.flushRange=[],this.segments=[],this.appended=0}this.onmso=this.onmse=this.onmsc=null,this.hls.trigger(u.default.MEDIA_DETACHED)}},{key:"onMediaSourceOpen",value:function(){h.logger.log("media source opened"),this.hls.trigger(u.default.MEDIA_ATTACHED,{media:this.media});var e=this.mediaSource;e&&e.removeEventListener("sourceopen",this.onmso),this.checkPendingTracks()}},{key:"checkPendingTracks",value:function(){var e=this.pendingTracks,t=Object.keys(e).length;t&&(this.sourceBufferNb<=t||0===this.sourceBufferNb)&&(this.createSourceBuffers(e),this.pendingTracks={},this.doAppending())}},{key:"onMediaSourceClose",value:function(){h.logger.log("media source closed")}},{key:"onMediaSourceEnded",value:function(){h.logger.log("media source ended")}},{key:"onSBUpdateEnd",value:function(){if(this.audioTimestampOffset){var e=this.sourceBuffer.audio;h.logger.warn("change mpeg audio timestamp offset from "+e.timestampOffset+" to "+this.audioTimestampOffset),e.timestampOffset=this.audioTimestampOffset,delete this.audioTimestampOffset}this._needsFlush&&this.doFlush(),this._needsEos&&this.checkEos(),this.appending=!1,this.hls.trigger(u.default.BUFFER_APPENDED,{parent:this.parent}),this._needsFlush||this.doAppending(),this.updateMediaElementDuration()}},{key:"onSBUpdateError",value:function(e){h.logger.error("sourceBuffer error:"+e),this.hls.trigger(u.default.ERROR,{type:c.ErrorTypes.MEDIA_ERROR,details:c.ErrorDetails.BUFFER_APPENDING_ERROR,fatal:!1})}},{key:"onBufferReset",value:function(){var e=this.sourceBuffer;for(var t in e){var r=e[t];try{this.mediaSource.removeSourceBuffer(r),r.removeEventListener("updateend",this.onsbue),r.removeEventListener("error",this.onsbe)}catch(e){}}this.sourceBuffer={},this.flushRange=[],this.segments=[],this.appended=0}},{key:"onBufferCodecs",value:function(e){if(0===Object.keys(this.sourceBuffer).length){for(var t in e)this.pendingTracks[t]=e[t];var r=this.mediaSource;r&&"open"===r.readyState&&this.checkPendingTracks()}}},{key:"createSourceBuffers", -value:function(e){var t=this.sourceBuffer,r=this.mediaSource;for(var i in e)if(!t[i]){var a=e[i],n=a.levelCodec||a.codec,s=a.container+";codecs="+n;h.logger.log("creating sourceBuffer("+s+")");try{var o=t[i]=r.addSourceBuffer(s);o.addEventListener("updateend",this.onsbue),o.addEventListener("error",this.onsbe),this.tracks[i]={codec:n,container:a.container},a.buffer=o}catch(e){h.logger.error("error while trying to add sourceBuffer:"+e.message),this.hls.trigger(u.default.ERROR,{type:c.ErrorTypes.MEDIA_ERROR,details:c.ErrorDetails.BUFFER_ADD_CODEC_ERROR,fatal:!1,err:e,mimeType:s})}}this.hls.trigger(u.default.BUFFER_CREATED,{tracks:e})}},{key:"onBufferAppending",value:function(e){this._needsFlush||(this.segments?this.segments.push(e):this.segments=[e],this.doAppending())}},{key:"onBufferAppendFail",value:function(e){h.logger.error("sourceBuffer error:"+e.event),this.hls.trigger(u.default.ERROR,{type:c.ErrorTypes.MEDIA_ERROR,details:c.ErrorDetails.BUFFER_APPENDING_ERROR,fatal:!1,frag:this.fragCurrent})}},{key:"onBufferEos",value:function(e){var t=this.sourceBuffer,r=e.type;for(var i in t)r&&i!==r||t[i].ended||(t[i].ended=!0,h.logger.log(i+" sourceBuffer now EOS"));this.checkEos()}},{key:"checkEos",value:function(){var e=this.sourceBuffer,t=this.mediaSource;if(!t||"open"!==t.readyState)return void(this._needsEos=!1);for(var r in e){var i=e[r];if(!i.ended)return;if(i.updating)return void(this._needsEos=!0)}h.logger.log("all media data available, signal endOfStream() to MediaSource and stop loading fragment");try{t.endOfStream()}catch(e){h.logger.warn("exception while calling mediaSource.endOfStream()")}this._needsEos=!1}},{key:"onBufferFlushing",value:function(e){this.flushRange.push({start:e.startOffset,end:e.endOffset,type:e.type}),this.flushBufferCounter=0,this.doFlush()}},{key:"onLevelUpdated",value:function(e){var t=e.details;0!==t.fragments.length&&(this._levelDuration=t.totalduration+t.fragments[0].start,this.updateMediaElementDuration())}},{key:"updateMediaElementDuration",value:function(){var e=this.media,t=this.mediaSource,r=this.sourceBuffer,i=this._levelDuration;if(null!==i&&e&&t&&r&&0!==e.readyState&&"open"===t.readyState){for(var a in r)if(r[a].updating)return;null===this._msDuration&&(this._msDuration=t.duration),i>this._msDuration&&i>e.duration&&(h.logger.log("Updating mediasource duration to "+i.toFixed(3)),this._msDuration=t.duration=i)}}},{key:"doFlush",value:function(){for(;this.flushRange.length;){var e=this.flushRange[0];if(!this.flushBuffer(e.start,e.end,e.type))return void(this._needsFlush=!0);this.flushRange.shift(),this.flushBufferCounter=0}if(0===this.flushRange.length){this._needsFlush=!1;var t=0,r=this.sourceBuffer;try{for(var i in r)t+=r[i].buffered.length}catch(e){h.logger.error("error while accessing sourceBuffer.buffered")}this.appended=t,this.hls.trigger(u.default.BUFFER_FLUSHED)}}},{key:"doAppending",value:function(){var e=this.hls,t=this.sourceBuffer,r=this.segments;if(Object.keys(t).length){if(this.media.error)return this.segments=[],void h.logger.error("trying to append although a media error occured, flush segment and abort");if(this.appending)return;if(r&&r.length){var i=r.shift();try{var a=i.type;t[a]?(t[a].ended=!1,this.parent=i.parent,t[a].appendBuffer(i.data),this.appendError=0,this.appended++,this.appending=!0):this.onSBUpdateEnd()}catch(t){h.logger.error("error while trying to append buffer:"+t.message),r.unshift(i);var n={type:c.ErrorTypes.MEDIA_ERROR};if(22===t.code)return this.segments=[],n.details=c.ErrorDetails.BUFFER_FULL_ERROR,void e.trigger(u.default.ERROR,n);if(this.appendError?this.appendError++:this.appendError=1,n.details=c.ErrorDetails.BUFFER_APPEND_ERROR,n.frag=this.fragCurrent,this.appendError>e.config.appendErrorMaxRetry)return h.logger.log("fail "+e.config.appendErrorMaxRetry+" times to append segment in sourceBuffer"),r=[],n.fatal=!0,void e.trigger(u.default.ERROR,n);n.fatal=!1,e.trigger(u.default.ERROR,n)}}}}},{key:"flushBuffer",value:function(e,t,r){var i,a,n,s,o,l,u=this.sourceBuffer;if(Object.keys(u).length){if(h.logger.log("flushBuffer,pos/start/end: "+this.media.currentTime+"/"+e+"/"+t),this.flushBufferCounter.5)return this.flushBufferCounter++,h.logger.log("flush "+d+" ["+o+","+l+"], of ["+n+","+s+"], pos:"+this.media.currentTime),i.remove(o,l),!1}catch(e){h.logger.warn("exception while accessing sourcebuffer, it might have been removed from MediaSource")}}}else h.logger.warn("abort flushing too many retries");h.logger.log("buffer flushed")}return!0}}]),t}(f.default);r.default=v},{26:26,27:27,28:28,45:45}],8:[function(e,t,r){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function n(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(r,"__esModule",{value:!0});var o=function(){function e(e,t){for(var r=0;rthis.autoLevelCapping&&this.hls.streamController.nextLevelSwitch(),this.autoLevelCapping=this.hls.autoLevelCapping)}}},{key:"getMaxLevel",value:function(e){var t=0,r=void 0,i=void 0,a=this.mediaWidth,n=this.mediaHeight,s=0,o=0;for(r=0;r<=e&&(i=this.levels[r],!this.isLevelRestricted(r))&&(t=r,s=i.width,o=i.height,!(a<=s||n<=o));r++);return t}},{key:"isLevelRestricted",value:function(e){return!(!this.restrictedLevels||this.restrictedLevels.indexOf(e)===-1)}},{key:"contentScaleFactor",get:function(){var e=1;try{e=window.devicePixelRatio}catch(e){}return e}},{key:"mediaWidth",get:function(){var e=void 0;return this.media&&(e=this.media.width||this.media.clientWidth||this.media.offsetWidth,e*=this.contentScaleFactor),e}},{key:"mediaHeight",get:function(){var e=void 0;return this.media&&(e=this.media.height||this.media.clientHeight||this.media.offsetHeight,e*=this.contentScaleFactor),e}}]),t}(f.default);r.default=h},{27:27,28:28}],9:[function(e,t,r){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(r,"__esModule",{value:!0});var n=function(){function e(e,t){for(var r=0;r=this.minWeight_}},{key:"getEstimate",value:function(){return this.canEstimate()?Math.min(this.fast_.getEstimate(),this.slow_.getEstimate()):this.defaultEstimate_}},{key:"destroy",value:function(){}}]),e}();r.default=l},{44:44}],10:[function(e,t,r){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function n(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(r,"__esModule",{value:!0});var o=function(){function e(e,t){for(var r=0;r0&&n>this.hls.config.fpsDroppedMonitoringThreshold*s){var l=this.hls.currentLevel;h.logger.warn("drop FPS ratio greater than max allowed value for currentLevel: "+l),l>0&&(this.hls.autoLevelCapping===-1||this.hls.autoLevelCapping>=l)&&(l-=1,this.hls.trigger(u.default.FPS_DROP_LEVEL_CAPPING,{level:l,droppedLevel:this.hls.currentLevel}),this.hls.autoLevelCapping=l,this.hls.streamController.nextLevelSwitch())}}this.lastTime=i,this.lastDroppedFrames=r,this.lastDecodedFrames=t}}},{key:"checkFPSInterval",value:function(){if(this.video)if(this.isVideoPlaybackQualityAvailable){var e=this.video.getVideoPlaybackQuality();this.checkFPS(this.video,e.totalVideoFrames,e.droppedVideoFrames)}else this.checkFPS(this.video,this.video.webkitDecodedFrameCount,this.video.webkitDroppedFrameCount)}}]),t}(f.default);r.default=c},{27:27,28:28,45:45}],11:[function(e,t,r){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function n(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(r,"__esModule",{value:!0});var o=function(){function e(e,t){for(var r=0;r0})}else o.trigger(u.default.ERROR,{type:c.ErrorTypes.MEDIA_ERROR,details:c.ErrorDetails.MANIFEST_INCOMPATIBLE_CODECS_ERROR,fatal:!0,url:o.url,reason:"no level with compatible codecs found in manifest"})}},{key:"setLevelInternal",value:function(e){var t=this._levels;if(e>=0&&ee&&(this._level===e&&void 0!==t[e].details||this.setLevelInternal(e))}},{key:"manualLevel",get:function(){return this._manualLevel},set:function(e){this._manualLevel=e,void 0===this._startLevel&&(this._startLevel=e),e!==-1&&(this.level=e)}},{key:"firstLevel",get:function(){return this._firstLevel},set:function(e){this._firstLevel=e}},{key:"startLevel",get:function(){if(void 0===this._startLevel){var e=this.hls.config.startLevel;return void 0!==e?e:this._firstLevel}return this._startLevel},set:function(e){e!==-1&&(e=Math.max(e,this.hls.abrController.minAutoLevel)),this._startLevel=e}},{key:"nextLoadLevel",get:function(){return this._manualLevel!==-1?this._manualLevel:this.hls.abrController.nextAutoLevel},set:function(e){this.level=e,this._manualLevel===-1&&(this.hls.abrController.nextAutoLevel=e)}}]),t}(f.default);r.default=p},{26:26,27:27,28:28,30:30,45:45}],12:[function(e,t,r){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function n(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(r,"__esModule",{value:!0});var o=function(){function e(e,t){for(var r=0;r0&&e===-1&&(k.logger.log("override startPosition with lastCurrentTime @"+t.toFixed(3)),e=t),this.state=A.IDLE,this.nextLoadPosition=this.startPosition=this.lastCurrentTime=e,this.tick()}else k.logger.warn("cannot start loading as manifest not parsed yet"),this.state=A.STOPPED}},{key:"stopLoad",value:function(){var e=this.fragCurrent;e&&(e.loader&&e.loader.abort(),this.fragCurrent=null),this.fragPrevious=null,this.demuxer&&(this.demuxer.destroy(),this.demuxer=null),this.state=A.STOPPED}},{key:"tick",value:function(){this.ticks++,1===this.ticks&&(this.doTick(),this.ticks>1&&setTimeout(this.tick,1),this.ticks=0)}},{key:"doTick",value:function(){switch(this.state){case A.ERROR:break;case A.BUFFER_FLUSHING:this.fragLoadError=0;break;case A.IDLE:if(!this._doTickIdle())return;break;case A.WAITING_LEVEL:var e=this.levels[this.level];e&&e.details&&(this.state=A.IDLE);break;case A.FRAG_LOADING_WAITING_RETRY:var t=performance.now(),r=this.retryDate;(!r||t>=r||this.media&&this.media.seeking)&&(k.logger.log("mediaController: retryDate reached, switch back to IDLE state"),this.state=A.IDLE);break;case A.ERROR:case A.PAUSED:case A.STOPPED:case A.FRAG_LOADING:case A.PARSING:case A.PARSED:case A.ENDED:}this._checkBuffer(),this._checkFragmentChanged()}},{key:"_doTickIdle",value:function(){var e=this.hls,t=e.config,r=this.media;if(void 0!==this.levelLastLoaded&&!r&&(this.startFragRequested||!t.startFragPrefetch))return!0;var i=void 0;i=this.loadedmetadata?r.currentTime:this.nextLoadPosition;var a=e.nextLoadLevel,n=this.levels[a],s=n.bitrate,o=void 0;o=s?Math.max(8*t.maxBufferSize/s,t.maxBufferLength):t.maxBufferLength,o=Math.min(o,t.maxMaxBufferLength);var l=f.default.bufferInfo(this.mediaBuffer?this.mediaBuffer:r,i,t.maxBufferHole),u=l.len;if(u>=o)return!0;k.logger.trace("buffer length of "+u.toFixed(3)+" is below max of "+o.toFixed(3)+". checking for more payload ..."),this.level=e.nextLoadLevel=a;var d=n.details;if("undefined"==typeof d||d.live&&this.levelLastLoaded!==a)return this.state=A.WAITING_LEVEL,!0;var h=this.fragPrevious;if(!d.live&&h&&h.sn===d.endSN&&(!r.seeking&&l.len||r.duration-l.end<=h.duration/2)){var c={};return this.altAudio&&(c.type="video"),this.hls.trigger(g.default.BUFFER_EOS,c),this.state=A.ENDED,!0}return this._fetchPayloadOrEos({pos:i,bufferInfo:l,levelDetails:d})}},{key:"_fetchPayloadOrEos",value:function(e){var t=e.pos,r=e.bufferInfo,i=e.levelDetails,a=this.fragPrevious,n=this.level,s=i.fragments,o=s.length;if(0===o)return!1;var l=s[0].start,u=s[o-1].start+s[o-1].duration,d=r.end,f=void 0;if(i.live){var h=this.config.initialLiveManifestSize;if(oh&&(u.currentTime=h)}if(t.PTSKnown&&r>a&&u&&u.readyState)return null;if(this.startFragRequested&&!t.PTSKnown){if(n){var c=n.sn+1;c>=t.startSN&&c<=t.endSN&&(d=s[c-t.startSN],k.logger.log("live playlist, switching playlist, load frag with next SN: "+d.sn))}d||(d=s[Math.min(o-1,Math.round(o/2))],k.logger.log("live playlist, switching playlist, unknown, load middle frag : "+d.sn))}return d}},{key:"_findFragment",value:function(e){var t=e.start,r=e.fragPrevious,i=e.fragLen,a=e.fragments,n=e.bufferEnd,s=e.end,o=e.levelDetails,l=this.hls.config,d=void 0,f=void 0,h=l.maxFragLookUpTolerance;if(ns-h&&(h=0),f=u.default.search(a,function(e){return e.start+e.duration-h<=n?1:e.start-h>n&&e.start?-1:0})):f=a[i-1],f&&(d=f,t=f.start,r&&d.level===r.level&&d.sn===r.sn))if(d.snl.maxBufferHole&&r.dropped&&v?(d=a[v-1],k.logger.warn("SN just loaded, with large PTS gap between audio and video, maybe frag is not starting with a keyframe ? load previous one to try to overcome this"),r.loadCounter--):(d=a[v+1],k.logger.log("SN just loaded, load next one: "+d.sn))}else d=null;return d}},{key:"_loadFragmentOrKey",value:function(e){var t=e.frag,r=e.level,i=e.levelDetails,a=e.pos,n=e.bufferEnd,s=this.hls,o=s.config;if(null==t.decryptdata.uri||null!=t.decryptdata.key){if(k.logger.log("Loading "+t.sn+" of ["+i.startSN+" ,"+i.endSN+"],level "+r+", currentTime:"+a.toFixed(3)+",bufferEnd:"+n.toFixed(3)),void 0!==this.fragLoadIdx?this.fragLoadIdx++:this.fragLoadIdx=0,t.loadCounter){t.loadCounter++;var l=o.fragLoadingLoopThreshold;if(t.loadCounter>l&&Math.abs(this.fragLoadIdx-t.loadIdx)=0;t--)if(r=i[t],e>=r.start&&e<=r.end)return r;return null}},{key:"followingBufferRange",value:function(e){return e?this.getBufferRange(e.end+.5):null}},{key:"_checkFragmentChanged",value:function(){var e,t,r=this.media;if(r&&r.readyState&&r.seeking===!1&&(t=r.currentTime,t>r.playbackRate*this.lastCurrentTime&&(this.lastCurrentTime=t),f.default.isBuffered(r,t)?e=this.getBufferRange(t):f.default.isBuffered(r,t+.1)&&(e=this.getBufferRange(t+.1)),e)){var i=e.frag;i!==this.fragPlaying&&(this.fragPlaying=i,this.hls.trigger(g.default.FRAG_CHANGED,{frag:i}))}}},{key:"immediateLevelSwitch",value:function(){if(k.logger.log("immediateLevelSwitch"),!this.immediateSwitch){this.immediateSwitch=!0;var e=this.media,t=void 0;e?(t=e.paused,e.pause()):t=!0,this.previouslyPaused=t}var r=this.fragCurrent;r&&r.loader&&r.loader.abort(),this.fragCurrent=null,this.fragLoadIdx+=2*this.config.fragLoadingLoopThreshold,this.state=A.BUFFER_FLUSHING,this.hls.trigger(g.default.BUFFER_FLUSHING,{startOffset:0,endOffset:Number.POSITIVE_INFINITY})}},{key:"immediateLevelSwitchEnd",value:function(){var e=this.media;e&&e.buffered.length&&(this.immediateSwitch=!1,f.default.isBuffered(e,e.currentTime)&&(e.currentTime-=1e-4),this.previouslyPaused||e.play())}},{key:"nextLevelSwitch",value:function(){var e=this.media;if(e&&e.readyState){var t=void 0,r=void 0,i=void 0;if(this.fragLoadIdx+=2*this.config.fragLoadingLoopThreshold,r=this.getBufferRange(e.currentTime),r&&r.start>1&&(this.state=A.BUFFER_FLUSHING,this.hls.trigger(g.default.BUFFER_FLUSHING,{startOffset:0,endOffset:r.start-1})),e.paused)t=0;else{var a=this.hls.nextLoadLevel,n=this.levels[a],s=this.fragLastKbps;t=s&&this.fragCurrent?this.fragCurrent.duration*n.bitrate/(1e3*s)+1:0}if(i=this.getBufferRange(e.currentTime+t),i&&(i=this.followingBufferRange(i))){var o=this.fragCurrent;o&&o.loader&&o.loader.abort(),this.fragCurrent=null,this.state=A.BUFFER_FLUSHING,this.hls.trigger(g.default.BUFFER_FLUSHING,{startOffset:i.start,endOffset:Number.POSITIVE_INFINITY})}}}},{key:"onMediaAttached",value:function(e){var t=this.media=this.mediaBuffer=e.media;this.onvseeking=this.onMediaSeeking.bind(this),this.onvseeked=this.onMediaSeeked.bind(this),this.onvended=this.onMediaEnded.bind(this),t.addEventListener("seeking",this.onvseeking),t.addEventListener("seeked",this.onvseeked),t.addEventListener("ended",this.onvended);var r=this.config;this.levels&&r.autoStartLoad&&this.hls.startLoad(r.startPosition)}},{key:"onMediaDetaching",value:function(){var e=this.media;e&&e.ended&&(k.logger.log("MSE detaching and video ended, reset startPosition"),this.startPosition=this.lastCurrentTime=0);var t=this.levels;t&&t.forEach(function(e){e.details&&e.details.fragments.forEach(function(e){e.loadCounter=void 0})}),e&&(e.removeEventListener("seeking",this.onvseeking),e.removeEventListener("seeked",this.onvseeked),e.removeEventListener("ended",this.onvended),this.onvseeking=this.onvseeked=this.onvended=null),this.media=this.mediaBuffer=null,this.loadedmetadata=!1,this.stopLoad()}},{key:"onMediaSeeking",value:function(){var e=this.media,t=e?e.currentTime:void 0,r=this.config;if(k.logger.log("media seeking to "+t.toFixed(3)),this.state===A.FRAG_LOADING){var i=f.default.bufferInfo(e,t,this.config.maxBufferHole),a=this.fragCurrent;if(0===i.len&&a){var n=r.maxFragLookUpTolerance,s=a.start-n,o=a.start+a.duration+n;to?(a.loader&&(k.logger.log("seeking outside of buffer while fragment load in progress, cancel fragment load"),a.loader.abort()),this.fragCurrent=null,this.fragPrevious=null,this.state=A.IDLE):k.logger.log("seeking outside of buffer but within currently loaded fragment range")}}else this.state===A.ENDED&&(this.state=A.IDLE);e&&(this.lastCurrentTime=t),this.state!==A.FRAG_LOADING&&void 0!==this.fragLoadIdx&&(this.fragLoadIdx+=2*r.fragLoadingLoopThreshold),this.loadedmetadata||(this.nextLoadPosition=this.startPosition=t),this.tick()}},{key:"onMediaSeeked",value:function(){k.logger.log("media seeked to "+this.media.currentTime.toFixed(3)),this.tick()}},{key:"onMediaEnded",value:function(){k.logger.log("media ended"),this.startPosition=this.lastCurrentTime=0}},{key:"onManifestLoading",value:function(){k.logger.log("trigger BUFFER_RESET"),this.hls.trigger(g.default.BUFFER_RESET),this.bufferRange=[],this.stalled=!1,this.startPosition=this.lastCurrentTime=0}},{key:"onManifestParsed",value:function(e){var t,r=!1,i=!1;e.levels.forEach(function(e){t=e.audioCodec,t&&(t.indexOf("mp4a.40.2")!==-1&&(r=!0),t.indexOf("mp4a.40.5")!==-1&&(i=!0))}),this.audioCodecSwitch=r&&i,this.audioCodecSwitch&&k.logger.log("both AAC/HE-AAC audio found in levels; declaring level codec as HE-AAC"),this.levels=e.levels,this.startLevelLoaded=!1,this.startFragRequested=!1;var a=this.config;a.autoStartLoad&&this.hls.startLoad(a.startPosition)}},{key:"onLevelLoaded",value:function(e){var t=e.details,r=e.level,i=this.levels[r],a=t.totalduration,n=0;if(k.logger.log("level "+r+" loaded ["+t.startSN+","+t.endSN+"],duration:"+a),this.levelLastLoaded=r,t.live){var s=i.details;s&&t.fragments.length>0?(E.default.mergeDetails(s,t),n=t.fragments[0].start,this.liveSyncPosition=this.computeLivePosition(n,s),t.PTSKnown?k.logger.log("live playlist sliding:"+n.toFixed(3)):k.logger.log("live playlist - outdated PTS, unknown sliding")):(t.PTSKnown=!1, -k.logger.log("live playlist - first load, unknown sliding"))}else t.PTSKnown=!1;if(i.details=t,this.hls.trigger(g.default.LEVEL_UPDATED,{details:t,level:r}),this.startFragRequested===!1){if(this.startPosition===-1||this.lastCurrentTime===-1){var o=t.startTimeOffset;isNaN(o)?t.live?(this.startPosition=this.computeLivePosition(n,t),k.logger.log("configure startPosition to "+this.startPosition)):this.startPosition=0:(o<0&&(k.logger.log("negative start time offset "+o+", count from end of last fragment"),o=n+a+o),k.logger.log("start time offset found in playlist, adjust startPosition to "+o),this.startPosition=o),this.lastCurrentTime=this.startPosition}this.nextLoadPosition=this.startPosition}this.state===A.WAITING_LEVEL&&(this.state=A.IDLE),this.tick()}},{key:"onKeyLoaded",value:function(){this.state===A.KEY_LOADING&&(this.state=A.IDLE,this.tick())}},{key:"onFragLoaded",value:function(e){var t=this.fragCurrent,r=e.frag;if(this.state===A.FRAG_LOADING&&t&&"main"===r.type&&r.level===t.level&&r.sn===t.sn){var i=e.stats,a=this.levels[t.level],n=a.details;if(k.logger.log("Loaded "+t.sn+" of ["+n.startSN+" ,"+n.endSN+"],level "+t.level),this.bitrateTest=!1,r.bitrateTest===!0&&this.hls.nextLoadLevel)this.state=A.IDLE,this.startFragRequested=!1,i.tparsed=i.tbuffered=performance.now(),this.hls.trigger(g.default.FRAG_BUFFERED,{stats:i,frag:t,id:"main"}),this.tick();else{this.state=A.PARSING,this.stats=i;var s=n.totalduration,o=isNaN(t.startDTS)?t.start:t.startDTS,l=t.level,u=t.sn,d=this.config.defaultAudioCodec||a.audioCodec;this.audioCodecSwap&&(k.logger.log("swapping playlist audio codec"),void 0===d&&(d=this.lastAudioCodec),d&&(d=d.indexOf("mp4a.40.5")!==-1?"mp4a.40.2":"mp4a.40.5")),this.pendingAppending=0,k.logger.log("Parsing "+u+" of ["+n.startSN+" ,"+n.endSN+"],level "+l+", cc "+t.cc);var f=this.demuxer;f||(f=this.demuxer=new c.default(this.hls,"main"));var h=n.PTSKnown||!n.live;f.push(e.payload,d,a.videoCodec,o,t.cc,l,u,s,t.decryptdata,h)}}this.fragLoadError=0}},{key:"onFragParsingInitSegment",value:function(e){var t=this.fragCurrent;if(t&&"main"===e.id&&e.sn===t.sn&&e.level===t.level&&this.state===A.PARSING){var r,i,a=e.tracks;if(a.audio&&this.altAudio&&delete a.audio,i=a.audio){var n=this.levels[this.level].audioCodec,s=navigator.userAgent.toLowerCase();n&&this.audioCodecSwap&&(k.logger.log("swapping playlist audio codec"),n=n.indexOf("mp4a.40.5")!==-1?"mp4a.40.2":"mp4a.40.5"),this.audioCodecSwitch&&1!==i.metadata.channelCount&&s.indexOf("firefox")===-1&&(n="mp4a.40.5"),s.indexOf("android")!==-1&&"audio/mpeg"!==i.container&&(n="mp4a.40.2",k.logger.log("Android: force audio codec to "+n)),i.levelCodec=n,i.id=e.id}if(i=a.video,i&&(i.levelCodec=this.levels[this.level].videoCodec,i.id=e.id),e.unique){var o={codec:"",levelCodec:""};for(r in e.tracks)i=a[r],o.container=i.container,o.codec&&(o.codec+=",",o.levelCodec+=","),i.codec&&(o.codec+=i.codec),i.levelCodec&&(o.levelCodec+=i.levelCodec);a={audiovideo:o}}this.hls.trigger(g.default.BUFFER_CODECS,a);for(r in a){i=a[r],k.logger.log("main track:"+r+",container:"+i.container+",codecs[level/parsed]=["+i.levelCodec+"/"+i.codec+"]");var l=i.initSegment;l&&(this.pendingAppending++,this.hls.trigger(g.default.BUFFER_APPENDING,{type:r,data:l,parent:"main",content:"initSegment"}))}this.tick()}}},{key:"onFragParsingData",value:function(e){var t=this,r=this.fragCurrent;if(r&&"main"===e.id&&e.sn===r.sn&&e.level===r.level&&("audio"!==e.type||!this.altAudio)&&this.state===A.PARSING){var i=this.levels[this.level],a=this.fragCurrent;k.logger.log("Parsed "+e.type+",PTS:["+e.startPTS.toFixed(3)+","+e.endPTS.toFixed(3)+"],DTS:["+e.startDTS.toFixed(3)+"/"+e.endDTS.toFixed(3)+"],nb:"+e.nb+",dropped:"+(e.dropped||0));var n=E.default.updateFragPTSDTS(i.details,a.sn,e.startPTS,e.endPTS,e.startDTS,e.endDTS),s=this.hls;s.trigger(g.default.LEVEL_PTS_UPDATED,{details:i.details,level:this.level,drift:n,type:e.type,start:e.startPTS,end:e.endPTS}),"video"===e.type&&(a.dropped=e.dropped),[e.data1,e.data2].forEach(function(r){r&&(t.pendingAppending++,s.trigger(g.default.BUFFER_APPENDING,{type:e.type,data:r,parent:"main",content:"data"}))}),this.bufferRange.push({type:e.type,start:e.startPTS,end:e.endPTS,frag:a}),this.tick()}}},{key:"onFragParsed",value:function(e){var t=this.fragCurrent;t&&"main"===e.id&&e.sn===t.sn&&e.level===t.level&&this.state===A.PARSING&&(this.stats.tparsed=performance.now(),this.state=A.PARSED,this._checkAppendedParsed())}},{key:"onAudioTrackSwitch",value:function(e){var t=!!e.url;if(t)this.videoBuffer&&this.mediaBuffer!==this.videoBuffer&&(k.logger.log("switching on alternate audio, use video.buffered to schedule main fragment loading"),this.mediaBuffer=this.videoBuffer);else if(this.mediaBuffer!==this.media){k.logger.log("switching on main audio, use media.buffered to schedule main fragment loading"),this.mediaBuffer=this.media;var r=this.fragCurrent;r.loader&&(k.logger.log("switching to main audio track, cancel main fragment load"),r.loader.abort()),this.fragCurrent=null,this.fragPrevious=null,this.demuxer&&(this.demuxer.destroy(),this.demuxer=null),this.state=A.IDLE}this.altAudio=t}},{key:"onBufferCreated",value:function(e){var t=e.tracks,r=void 0,i=void 0,a=!1;for(var n in t){var s=t[n];"main"===s.id?(i=n,r=s,"video"===n&&(this.videoBuffer=t[n].buffer)):a=!0}a&&r?(k.logger.log("alternate track found, use "+i+".buffered to schedule main fragment loading"),this.mediaBuffer=r.buffer):this.mediaBuffer=this.media}},{key:"onBufferAppended",value:function(e){if("main"===e.parent)switch(this.state){case A.PARSING:case A.PARSED:this.pendingAppending--,this._checkAppendedParsed()}}},{key:"_checkAppendedParsed",value:function(){if(this.state===A.PARSED&&0===this.pendingAppending){var e=this.fragCurrent,t=this.stats;if(e){this.fragPrevious=e,t.tbuffered=performance.now(),this.fragLastKbps=Math.round(8*t.total/(t.tbuffered-t.tfirst)),this.hls.trigger(g.default.FRAG_BUFFERED,{stats:t,frag:e,id:"main"});var r=this.mediaBuffer?this.mediaBuffer:this.media;k.logger.log("main buffered : "+R.default.toString(r.buffered)),this.state=A.IDLE}this.tick()}}},{key:"onError",value:function(e){var t=e.frag||this.fragCurrent;if(!t||"main"===t.type){var r=this.media,i=r&&f.default.isBuffered(r,r.currentTime)&&f.default.isBuffered(r,r.currentTime+.5);switch(e.details){case _.ErrorDetails.FRAG_LOAD_ERROR:case _.ErrorDetails.FRAG_LOAD_TIMEOUT:case _.ErrorDetails.KEY_LOAD_ERROR:case _.ErrorDetails.KEY_LOAD_TIMEOUT:if(!e.fatal){var a=this.fragLoadError;a?a++:a=1;var n=this.config;if(a<=n.fragLoadingMaxRetry||i||t.autoLevel&&t.level){this.fragLoadError=a,t.loadCounter=0;var s=Math.min(Math.pow(2,a-1)*n.fragLoadingRetryDelay,n.fragLoadingMaxRetryTimeout);k.logger.warn("mediaController: frag loading failed, retry in "+s+" ms"),this.retryDate=performance.now()+s,this.state=A.FRAG_LOADING_WAITING_RETRY}else k.logger.error("mediaController: "+e.details+" reaches max retry, redispatch as fatal ..."),e.fatal=!0,this.hls.trigger(g.default.ERROR,e),this.state=A.ERROR}break;case _.ErrorDetails.FRAG_LOOP_LOADING_ERROR:e.fatal||(i?(this._reduceMaxBufferLength(t.duration),this.state=A.IDLE):t.autoLevel&&0!==t.level||(e.fatal=!0,this.hls.trigger(g.default.ERROR,e),this.state=A.ERROR));break;case _.ErrorDetails.LEVEL_LOAD_ERROR:case _.ErrorDetails.LEVEL_LOAD_TIMEOUT:this.state!==A.ERROR&&(e.fatal?(this.state=A.ERROR,k.logger.warn("streamController: "+e.details+",switch to "+this.state+" state ...")):this.state===A.WAITING_LEVEL&&(this.state=A.IDLE));break;case _.ErrorDetails.BUFFER_FULL_ERROR:this.state!==A.PARSING&&this.state!==A.PARSED||(i?(this._reduceMaxBufferLength(t.duration),this.state=A.IDLE):(k.logger.warn("buffer full error also media.currentTime is not buffered, flush everything"),this.fragCurrent=null,this.state=A.PAUSED,this.hls.trigger(g.default.BUFFER_FLUSHING,{startOffset:0,endOffset:Number.POSITIVE_INFINITY})))}}}},{key:"_reduceMaxBufferLength",value:function(e){var t=this.config;t.maxMaxBufferLength>=e&&(t.maxMaxBufferLength/=2,k.logger.warn("reduce max buffer length to "+t.maxMaxBufferLength+"s and switch to IDLE state"),this.fragLoadIdx+=2*t.fragLoadingLoopThreshold)}},{key:"_checkBuffer",value:function(){var e=this.media;if(e&&e.readyState){var t=e.currentTime,r=e.buffered;if(this.loadedmetadata||!r.length||e.seeking)if(this.immediateSwitch)this.immediateLevelSwitchEnd();else{var i=f.default.bufferInfo(e,t,0),a=!(e.paused||e.ended||0===e.buffered.length),n=.5,s=t>e.playbackRate*this.lastCurrentTime,o=this.config;if(this.stalled&&s&&(this.stalled=!1,k.logger.log("playback not stuck anymore @"+t)),a&&i.len<=n&&(s?(n=0,this.seekHoleNudgeDuration=0):this.stalled?this.seekHoleNudgeDuration+=o.seekHoleNudgeDuration:(this.seekHoleNudgeDuration=0,k.logger.log("playback seems stuck @"+t),this.hls.trigger(g.default.ERROR,{type:_.ErrorTypes.MEDIA_ERROR,details:_.ErrorDetails.BUFFER_STALLED_ERROR,fatal:!1}),this.stalled=!0),i.len<=n)){var l=i.nextStart,u=l-t;if(l&&u0){k.logger.log("adjust currentTime from "+e.currentTime+" to next buffered @ "+l+" + nudge "+this.seekHoleNudgeDuration);var d=l+this.seekHoleNudgeDuration-e.currentTime;e.currentTime=l+this.seekHoleNudgeDuration,this.hls.trigger(g.default.ERROR,{type:_.ErrorTypes.MEDIA_ERROR,details:_.ErrorDetails.BUFFER_SEEK_OVER_HOLE,fatal:!1,hole:d})}}}else{this.loadedmetadata=!0;var h=this.startPosition,c=f.default.isBuffered(e,h);t===h&&c||(k.logger.log("target start position:"+h),c||(h=r.start(0),k.logger.log("target start position not buffered, seek to buffered.start(0) "+h)),k.logger.log("adjust currentTime from "+t+" to "+h),e.currentTime=h)}}}},{key:"onFragLoadEmergencyAborted",value:function(){this.state=A.IDLE,this.loadedmetadata||(this.startFragRequested=!1),this.tick()}},{key:"onBufferFlushed",value:function(){var e=this.mediaBuffer?this.mediaBuffer:this.media,t=this.bufferRange,r=[],i=void 0,a=void 0;for(a=0;a0;)e.removeCue(e.cues[0])}},{key:"getExistingTrack",value:function(e){var t=this.media;if(t)for(var r=0;r>>8^255&v^99,e[f]=v,t[v]=f;var g=d[f],p=d[g],y=d[p],m=257*d[v]^16843008*v;r[f]=m<<24|m>>>8,i[f]=m<<16|m>>>16,a[f]=m<<8|m>>>24,n[f]=m,m=16843009*y^65537*p^257*g^16843008*f,s[v]=m<<24|m>>>8,o[v]=m<<16|m>>>16,l[v]=m<<8|m>>>24,u[v]=m,f?(f=g^d[d[d[y^g]]],h^=d[d[h]]):f=h=1}}},{key:"expandKey",value:function(e){for(var t=this.uint8ArrayToUint32Array_(e),r=!0,i=0;i>8|e>>>24}},{key:"decrypt",value:function(e,t,r){for(var i,a,n=this.keySize+6,s=this.invKeySchedule,o=this.invSBox,l=this.invSubMix[0],u=this.invSubMix[1],d=this.invSubMix[2],f=this.invSubMix[3],h=this.uint8ArrayToUint32Array_(r),c=h[0],v=h[1],g=h[2],p=h[3],y=new Int32Array(e),m=new Int32Array(y.length),E=void 0,b=void 0,R=void 0,_=void 0,k=void 0,A=void 0,T=void 0,S=void 0,L=void 0,D=void 0,w=void 0,O=void 0;t>>24]^u[A>>16&255]^d[T>>8&255]^f[255&S]^s[i],b=l[A>>>24]^u[T>>16&255]^d[S>>8&255]^f[255&k]^s[i+1],R=l[T>>>24]^u[S>>16&255]^d[k>>8&255]^f[255&A]^s[i+2],_=l[S>>>24]^u[k>>16&255]^d[A>>8&255]^f[255&T]^s[i+3],k=E,A=b,T=R,S=_,i+=4;E=o[k>>>24]<<24^o[A>>16&255]<<16^o[T>>8&255]<<8^o[255&S]^s[i],b=o[A>>>24]<<24^o[T>>16&255]<<16^o[S>>8&255]<<8^o[255&k]^s[i+1],R=o[T>>>24]<<24^o[S>>16&255]<<16^o[k>>8&255]<<8^o[255&A]^s[i+2],_=o[S>>>24]<<24^o[k>>16&255]<<16^o[A>>8&255]<<8^o[255&T]^s[i+3],i+=3,m[t]=this.networkToHostOrderSwap(E^c),m[t+1]=this.networkToHostOrderSwap(_^v),m[t+2]=this.networkToHostOrderSwap(R^g),m[t+3]=this.networkToHostOrderSwap(b^p),c=L,v=D,g=w,p=O,t+=4}return m.buffer}},{key:"destroy",value:function(){this.key=void 0,this.keySize=void 0,this.ksRows=void 0,this.sBox=void 0,this.invSBox=void 0,this.subMix=void 0,this.invSubMix=void 0,this.keySchedule=void 0,this.invKeySchedule=void 0,this.rcon=void 0}}]),e}();r.default=n},{}],16:[function(e,t,r){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(r,"__esModule",{value:!0});var n=function(){function e(e,t){for(var r=0;r>>5,v-=m,v>0&&y+m+v<=b);)for(E=k+p*g,R={unit:e.subarray(y+m,y+m+v),pts:E,dts:E},h.samples.push(R),h.len+=v,y+=v+m,p++;y>>6)+1,o=(60&t[r+2])>>>2,o>h.length-1?void e.trigger(Event.ERROR,{type:s.ErrorTypes.MEDIA_ERROR,details:s.ErrorDetails.FRAG_PARSING_ERROR,fatal:!0,reason:"invalid ADTS sampling index:"+o}):(u=(1&t[r+2])<<2,u|=(192&t[r+3])>>>6,n.logger.log("manifest codec:"+i+",ADTS data:type:"+a+",sampleingIndex:"+o+"["+h[o]+"Hz],channelConfig:"+u),/firefox|OPR/i.test(f)?o>=6?(a=5,d=new Array(4),l=o-3):(a=2,d=new Array(2),l=o):f.indexOf("android")!==-1?(a=2,d=new Array(2),l=o):(a=5,d=new Array(4),i&&(i.indexOf("mp4a.40.29")!==-1||i.indexOf("mp4a.40.5")!==-1)||!i&&o>=6?l=o-3:((i&&i.indexOf("mp4a.40.2")!==-1&&o>=6&&1===u||!i&&1===u)&&(a=2,d=new Array(2)),l=o)),d[0]=a<<3,d[0]|=(14&o)>>1,d[1]|=(1&o)<<7,d[1]|=u<<3,5===a&&(d[1]|=(14&l)>>1,d[2]=(1&l)<<7,d[2]|=8,d[3]=0),{config:d,samplerate:h[o],channelCount:u,codec:"mp4a.40."+a})}}]),e}();r.default=o},{26:26,45:45}],20:[function(e,t,r){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(r,"__esModule",{value:!0});var n=function(){function e(e,t){for(var r=0;r3&&void 0!==arguments[3]?arguments[3]:null;a(this,e),this.hls=t,this.id=r,this.config=this.hls.config||n,this.typeSupported=i}return n(e,[{key:"destroy",value:function(){var e=this.demuxer;e&&e.destroy()}},{key:"push",value:function(e,t,r,i,a,n,s,u,f){var c=this.demuxer;if(!c){var g=this.hls,y=this.id,m=this.config,E=this.typeSupported;if(h.default.probe(e))c=this.typeSupported.mp2t===!0?new h.default(g,y,p.default,m,E):new h.default(g,y,v.default,m,E);else{if(!d.default.probe(e))return void g.trigger(o.default.ERROR,{type:l.ErrorTypes.MEDIA_ERROR,id:y,details:l.ErrorDetails.FRAG_PARSING_ERROR,fatal:!0,reason:"no demux matching with content found"});c=new d.default(g,y,v.default,m,E)}this.demuxer=c}c.push(e,t,r,i,a,n,s,u,f)}}]),e}();r.default=y},{18:18,25:25,26:26,28:28,38:38,39:39}],21:[function(e,t,r){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(r,"__esModule",{value:!0});var a=e(20),n=i(a),s=e(28),o=i(s),l=e(45),u=e(1),d=i(u),f=function(e){var t=new d.default;t.trigger=function(e){for(var r=arguments.length,i=Array(r>1?r-1:0),a=1;a1?r-1:0),a=1;a0&&null!=u&&null!=u.key&&"AES-128"===u.method){null==this.decrypter&&(this.decrypter=new v.default(this.hls));var f=this,h=performance.now();this.decrypter.decrypt(e,u.key.buffer,u.iv.buffer,function(e){f.hls.trigger(o.default.FRAG_DECRYPTED,{level:n,sn:s,stats:{tstart:h,tdecrypt:performance.now()}}),f.pushDecrypted(e,t,r,i,a,n,s,l,d)})}else this.pushDecrypted(e,t,r,i,a,n,s,l,d)}},{key:"onWorkerMessage",value:function(e){var t=e.data,r=this.hls;switch(t.event){case"init":URL.revokeObjectURL(this.w.objectURL);break;case o.default.FRAG_PARSING_DATA:t.data.data1=new Uint8Array(t.data1),t.data.data2=new Uint8Array(t.data2);default:r.trigger(t.event,t.data)}}}]),t}();r.default=p},{16:16,20:20,21:21,26:26,28:28,3:3,45:45}],23:[function(e,t,r){"use strict";function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(r,"__esModule",{value:!0});var a=function(){function e(e,t){for(var r=0;re?(this.word<<=e,this.bitsAvailable-=e):(e-=this.bitsAvailable,t=e>>3,e-=t>>3,this.bytesAvailable-=t,this.loadWord(),this.word<<=e,this.bitsAvailable-=e)}},{key:"readBits",value:function(e){var t=Math.min(this.bitsAvailable,e),r=this.word>>>32-t;return e>32&&n.logger.error("Cannot read more than 32 bits at a time"),this.bitsAvailable-=t,this.bitsAvailable>0?this.word<<=t:this.bytesAvailable>0&&this.loadWord(),t=e-t,t>0&&this.bitsAvailable?r<>>e))return this.word<<=e,this.bitsAvailable-=e,e;return this.loadWord(),e+this.skipLZ()}},{key:"skipUEG",value:function(){this.skipBits(1+this.skipLZ())}},{key:"skipEG",value:function(){this.skipBits(1+this.skipLZ())}},{key:"readUEG",value:function(){var e=this.skipLZ();return this.readBits(e+1)-1}},{key:"readEG",value:function(){var e=this.readUEG();return 1&e?1+e>>>1:-1*(e>>>1)}},{key:"readBoolean",value:function(){return 1===this.readBits(1)}},{key:"readUByte",value:function(){return this.readBits(8)}},{key:"readUShort",value:function(){return this.readBits(16)}},{key:"readUInt",value:function(){return this.readBits(32)}},{key:"skipScalingList",value:function(e){var t,r,i=8,a=8;for(t=0;t>4,g>1){if(p=d+5+e[d+4],p===d+188)continue}else p=d+4;switch(v){case T:if(f){if(w&&(y=M(w))&&(x(y,!1),E&&_.codec&&(S===-1||k.codec)))return void this.remux(n,s,e,i);w={data:[],size:0}}w&&(w.data.push(e.subarray(p,d+188)),w.size+=d+188-p);break;case S:if(f){if(O&&(y=M(O))&&(k.isAAC?F(y):N(y),E&&k.codec&&(T===-1||_.codec)))return void this.remux(n,s,e,i);O={data:[],size:0}}O&&(O.data.push(e.subarray(p,d+188)),O.size+=d+188-p);break;case L:f&&(C&&(y=M(C))&&U(y),C={data:[],size:0}),C&&(C.data.push(e.subarray(p,d+188)),C.size+=d+188-p);break;case 0:f&&(p+=e[p]+1),D=this._pmtId=P(e,p);break;case D:f&&(p+=e[p]+1);var G=I(e,p,this.typeSupported.mpeg===!0||this.typeSupported.mp3===!0);T=G.avc,T>0&&(_.id=T),S=G.audio,S>0&&(k.id=S,k.isAAC=G.isAAC),L=G.id3,L>0&&(A.id=L),b&&!R&&(h.logger.log("reparse from beginning"),b=!1,d=-188),R=this.pmtParsed=!0;break;case 17:case 8191:break;default:b=!0}}else this.observer.trigger(u.default.ERROR,{type:c.ErrorTypes.MEDIA_ERROR,id:this.id,details:c.ErrorDetails.FRAG_PARSING_ERROR,fatal:!1,reason:"TS packet did not start with 0x47"});w&&(y=M(w))?(x(y,!0),_.pesData=null):_.pesData=w,O&&(y=M(O))?(k.isAAC?F(y):N(y),k.pesData=null):(O&&O.size&&h.logger.log("last AAC PES packet truncated,might overlap between fragments"),k.pesData=O),C&&(y=M(C))?(U(y),A.pesData=null):A.pesData=C,this.remux(n,s,null,i)}},{key:"remux",value:function(e,t,r,i){for(var a=this._avcTrack,n=a.samples,s=0,o=0,l=0;l1;){var h=new Uint8Array(f[0].length+f[1].length);h.set(f[0]),h.set(f[1],f[0].length),f[0]=h,f.splice(1,1)}if(t=f[0],i=(t[0]<<16)+(t[1]<<8)+t[2],1===i){if(a=(t[4]<<8)+t[5],a&&a>e.size-6)return null;for(r=t[7],192&r&&(o=536870912*(14&t[9])+4194304*(255&t[10])+16384*(254&t[11])+128*(255&t[12])+(254&t[13])/2,o>4294967295&&(o-=8589934592),64&r?(l=536870912*(14&t[14])+4194304*(255&t[15])+16384*(254&t[16])+128*(255&t[17])+(254&t[18])/2,l>4294967295&&(l-=8589934592)):l=o),n=t[8],u=n+9,e.size-=u,s=new Uint8Array(e.size);f.length;){t=f.shift();var c=t.byteLength;if(u){if(u>c){u-=c;continue}t=t.subarray(u),c-=u,u=0}s.set(t,d),d+=c}return a&&(a-=n+3),{data:s,pts:o,dts:l,len:a}}return null}},{key:"pushAccesUnit",value:function(e,t){e.units.units.length&&e.frame&&(!this.config.forceKeyFrameOnDiscontinuity||e.key===!0||t.sps&&(t.samples.length||this.contiguous)?t.samples.push(e):t.dropped++),e.debug.length&&h.logger.log(e.pts+"/"+e.dts+":"+e.debug+","+e.units.length)}},{key:"_parseAVCPES",value:function(e,t){var r,i,a,n=this,s=this._avcTrack,o=this._parseAVCNALu(e.data),l=!1,u=this.avcSample;e.data=null,o.forEach(function(t){switch(t.type){case 1:i=!0,l&&u&&(u.debug+="NDR "),u.frame=!0;var o=t.data;if(o.length>1){var d=new f.default(o).readSliceType();2!==d&&4!==d&&7!==d&&9!==d||(u.key=!0)}break;case 5:i=!0,u||(u=n.avcSample=n._createAVCSample(!0,e.pts,e.dts,"")),l&&(u.debug+="IDR "),u.key=!0,u.frame=!0;break;case 6:i=!0,l&&u&&(u.debug+="SEI "),r=new f.default(n.discardEPB(t.data)),r.readUByte();for(var h=0,c=0,v=!1,g=0;!v&&r.bytesAvailable>1;){h=0;do g=r.readUByte(),h+=g;while(255===g);c=0;do g=r.readUByte(),c+=g;while(255===g);if(4===h&&0!==r.bytesAvailable){v=!0;var p=r.readUByte();if(181===p){var y=r.readUShort();if(49===y){var m=r.readUInt();if(1195456820===m){var E=r.readUByte();if(3===E){var b=r.readUByte(),R=r.readUByte(),_=31&b,k=[b,R];for(a=0;a<_;a++)k.push(r.readUByte()),k.push(r.readUByte()),k.push(r.readUByte());n._insertSampleInOrder(n._txtTrack.samples,{type:3,pts:e.pts,bytes:k})}}}}}else if(c0){if(t.pts>=e[r-1].pts)e.push(t);else for(var i=r-1;i>=0;i--)if(t.pts=0)i={data:e.subarray(h,s-u-1),type:n},f.push(i);else{var c=this._getLastNalUnit();if(c&&(d&&s<=4-d&&c.state&&(c.data=c.data.subarray(0,c.data.byteLength-d)),r=s-u-1,r>0)){var v=new Uint8Array(c.data.byteLength+r);v.set(c.data,0),v.set(e.subarray(0,r),c.data.byteLength),c.data=v}}s=0&&u>=0&&(i={data:e.subarray(h,o),type:n,state:u},f.push(i)),0===f.length){var g=this._getLastNalUnit();if(g){var p=new Uint8Array(g.data.byteLength+e.byteLength);p.set(g.data,0),p.set(e,g.data.byteLength),g.data=p}}return l.naluState=u,f}},{key:"discardEPB",value:function(e){for(var t,r,i=e.byteLength,a=[],n=1;n1&&(h.logger.log("AAC: align PTS for overlapping frames by "+Math.round((k-p)/90)),p=k)}for(;n+5>>5,r-=s,r>0&&n+s+r<=d);)for(l=p+a*i,f={unit:g.subarray(n+s,n+s+r),pts:l,dts:l},v.samples.push(f),v.len+=r,n+=r+s,a++;n0;)s+=t}},{key:"_onMpegFrame",value:function(e,t,r,i,a,n){var s=1152/r*1e3,o=n+a*s,l=this._audioTrack;l.config=[],l.channelCount=i,l.audiosamplerate=r,l.duration=this._duration,l.samples.push({unit:e,pts:o,dts:o}),l.len+=e.length}},{key:"_onMpegNoise",value:function(e){h.logger.warn("mpeg audio has noise: "+e.length+" bytes")}},{key:"_parseMpeg",value:function(e,t,r,i,a){var n=[32,64,96,128,160,192,224,256,288,320,352,384,416,448,32,48,56,64,80,96,112,128,160,192,224,256,320,384,32,40,48,56,64,80,96,112,128,160,192,224,256,320,32,48,56,64,80,96,112,128,144,160,176,192,224,256,8,16,24,32,40,48,56,64,80,96,112,128,144,160],s=[44100,48e3,32e3,22050,24e3,16e3,11025,12e3,8e3];if(t+2>r)return-1;if(255===e[t]||224===(224&e[t+1])){if(t+24>r)return-1;var o=e[t+1]>>3&3,l=e[t+1]>>1&3,u=e[t+2]>>4&15,d=e[t+2]>>2&3,f=!!(2&e[t+2]);if(1!==o&&0!==u&&15!==u&&3!==d){var h=3===o?3-l:3===l?3:4,c=1e3*n[14*h+u-1],v=3===o?0:2===o?1:2,g=s[3*v+d],p=f?1:0,y=e[t+3]>>6===3?1:2,m=3===l?(3===o?12:6)*c/g+p<<2:(3===o?144:72)*c/g+p|0;return t+m>r?-1:(this._onMpegFrame&&this._onMpegFrame(e.subarray(t,t+m),c,g,y,i,a),m)}}for(var E=t+2;E=564&&71===e[0]&&71===e[188]&&71===e[376]}}]),e}();r.default=v},{19:19,23:23,26:26,28:28,45:45}],26:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});r.ErrorTypes={NETWORK_ERROR:"networkError",MEDIA_ERROR:"mediaError",MUX_ERROR:"muxError",OTHER_ERROR:"otherError"},r.ErrorDetails={MANIFEST_LOAD_ERROR:"manifestLoadError",MANIFEST_LOAD_TIMEOUT:"manifestLoadTimeOut",MANIFEST_PARSING_ERROR:"manifestParsingError",MANIFEST_INCOMPATIBLE_CODECS_ERROR:"manifestIncompatibleCodecsError",LEVEL_LOAD_ERROR:"levelLoadError",LEVEL_LOAD_TIMEOUT:"levelLoadTimeOut",LEVEL_SWITCH_ERROR:"levelSwitchError",AUDIO_TRACK_LOAD_ERROR:"audioTrackLoadError",AUDIO_TRACK_LOAD_TIMEOUT:"audioTrackLoadTimeOut",FRAG_LOAD_ERROR:"fragLoadError",FRAG_LOOP_LOADING_ERROR:"fragLoopLoadingError",FRAG_LOAD_TIMEOUT:"fragLoadTimeOut",FRAG_DECRYPT_ERROR:"fragDecryptError",FRAG_PARSING_ERROR:"fragParsingError",REMUX_ALLOC_ERROR:"remuxAllocError",KEY_LOAD_ERROR:"keyLoadError",KEY_LOAD_TIMEOUT:"keyLoadTimeOut",BUFFER_ADD_CODEC_ERROR:"bufferAddCodecError",BUFFER_APPEND_ERROR:"bufferAppendError",BUFFER_APPENDING_ERROR:"bufferAppendingError",BUFFER_STALLED_ERROR:"bufferStalledError",BUFFER_FULL_ERROR:"bufferFullError",BUFFER_SEEK_OVER_HOLE:"bufferSeekOverHole",INTERNAL_EXCEPTION:"internalException"}},{}],27:[function(e,t,r){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(r,"__esModule",{value:!0});var n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},s=function(){function e(e,t){for(var r=0;r1?r-1:0),n=1;n=r.start(i)&&t<=r.end(i))return!0;return!1}},{key:"bufferInfo",value:function(e,t,r){if(e){var i,a=e.buffered,n=[];for(i=0;id&&(l[u-1].end=e[o].end):l.push(e[o])}else l.push(e[o])}for(o=0,i=0,a=n=t;o=f&&t=0&&ot.endSN)return 0;if(o=r-t.startSN,l=t.fragments,u=l[o],!isNaN(u.startPTS)){var f=Math.abs(u.startPTS-i);isNaN(u.deltaPTS)?u.deltaPTS=f:u.deltaPTS=Math.max(f,u.deltaPTS),i=Math.min(i,u.startPTS),a=Math.max(a,u.endPTS),n=Math.min(n,u.startDTS),s=Math.max(s,u.endDTS)}var h=i-u.start;for(u.start=u.startPTS=i,u.endPTS=a,u.startDTS=n,u.endDTS=s,u.duration=a-i,d=o;d>0;d--)e.updatePTS(l,d,d-1);for(d=o;dt?a.start=i.start+i.duration:a.start=i.start-a.duration:r>t?(i.duration=s-i.start,i.duration<0&&n.logger.warn("negative duration computed for frag "+i.sn+",level "+i.level+", there should be some duration drift between playlist and fragment!")):(a.duration=i.start-s,a.duration<0&&n.logger.warn("negative duration computed for frag "+a.sn+",level "+a.level+", there should be some duration drift between playlist and fragment!"))}}]),e}();r.default=s},{45:45}],32:[function(e,t,r){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(r,"__esModule",{value:!0});var n=function(){function e(e,t){for(var r=0;r0&&void 0!==arguments[0]?arguments[0]:{};a(this,e);var r=e.DefaultConfig;if((t.liveSyncDurationCount||t.liveMaxLatencyDurationCount)&&(t.liveSyncDuration||t.liveMaxLatencyDuration))throw new Error("Illegal hls.js config: don't mix up liveSyncDurationCount/liveMaxLatencyDurationCount and liveSyncDuration/liveMaxLatencyDuration");for(var i in r)i in t||(t[i]=r[i]);if(void 0!==t.liveMaxLatencyDurationCount&&t.liveMaxLatencyDurationCount<=t.liveSyncDurationCount)throw new Error('Illegal hls.js config: "liveMaxLatencyDurationCount" must be gt "liveSyncDurationCount"');if(void 0!==t.liveMaxLatencyDuration&&(t.liveMaxLatencyDuration<=t.liveSyncDuration||void 0===t.liveSyncDuration))throw new Error('Illegal hls.js config: "liveMaxLatencyDuration" must be gt "liveSyncDuration"');(0,C.enableLogs)(t.debug),this.config=t;var n=this.observer=new x.default;n.trigger=function(e){for(var t=arguments.length,r=Array(t>1?t-1:0),i=1;i1?t-1:0),i=1;i0&&void 0!==arguments[0]?arguments[0]:-1;C.logger.log("startLoad("+e+")"),this.levelController.startLoad(),this.streamController.startLoad(e),this.audioStreamController.startLoad(e)}},{key:"stopLoad",value:function(){C.logger.log("stopLoad"),this.levelController.stopLoad(),this.streamController.stopLoad(),this.audioStreamController.stopLoad()}},{key:"swapAudioCodec",value:function(){C.logger.log("swapAudioCodec"),this.streamController.swapAudioCodec()}},{key:"recoverMediaError",value:function(){C.logger.log("recoverMediaError");var e=this.media;this.detachMedia(),this.attachMedia(e)}},{key:"levels",get:function(){return this.levelController.levels}},{key:"currentLevel",get:function(){return this.streamController.currentLevel},set:function(e){C.logger.log("set currentLevel:"+e),this.loadLevel=e,this.streamController.immediateLevelSwitch()}},{key:"nextLevel",get:function(){return this.streamController.nextLevel},set:function(e){C.logger.log("set nextLevel:"+e),this.levelController.manualLevel=e,this.streamController.nextLevelSwitch()}},{key:"loadLevel",get:function(){return this.levelController.level},set:function(e){C.logger.log("set loadLevel:"+e),this.levelController.manualLevel=e}},{key:"nextLoadLevel",get:function(){return this.levelController.nextLoadLevel},set:function(e){this.levelController.nextLoadLevel=e}},{key:"firstLevel",get:function(){return Math.max(this.levelController.firstLevel,this.abrController.minAutoLevel)},set:function(e){C.logger.log("set firstLevel:"+e),this.levelController.firstLevel=e}},{key:"startLevel",get:function(){return this.levelController.startLevel},set:function(e){C.logger.log("set startLevel:"+e),this.levelController.startLevel=e}},{key:"autoLevelCapping",get:function(){return this.abrController.autoLevelCapping},set:function(e){C.logger.log("set autoLevelCapping:"+e),this.abrController.autoLevelCapping=e}},{key:"autoLevelEnabled",get:function(){return this.levelController.manualLevel===-1}},{key:"manualLevel",get:function(){return this.levelController.manualLevel}},{key:"audioTracks",get:function(){return this.audioTrackController.audioTracks}},{key:"audioTrack",get:function(){return this.audioTrackController.audioTrack},set:function(e){this.audioTrackController.audioTrack=e}},{key:"liveSyncPosition",get:function(){return this.streamController.liveSyncPosition}}]),e}();r.default=B},{1:1,10:10,11:11,12:12,13:13,26:26,28:28,34:34,35:35,36:36,4:4,43:43,45:45,47:47,5:5,6:6,7:7,8:8}],33:[function(e,t,r){"use strict";t.exports=e(32).default},{32:32}],34:[function(e,t,r){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function n(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(r,"__esModule",{value:!0});var o=function(){function e(e,t){for(var r=0;r>8*(15-r)&255;return t}},{key:"fragmentDecryptdataFromLevelkey",value:function(e,t){var r=e;return e&&e.method&&e.uri&&!e.iv&&(r=this.cloneObj(e),r.iv=this.createInitializationVector(t)),r}},{key:"avc1toavcoti",value:function(e){var t,r=e.split(".");return r.length>2?(t=r.shift()+".",t+=parseInt(r.shift()).toString(16),t+=("000"+parseInt(r.shift()).toString(16)).substr(-4)):t=e,t}},{key:"cloneObj",value:function(e){return JSON.parse(JSON.stringify(e))}},{key:"parseLevelPlaylist",value:function(e,t,r,i){var a,n,s,o=0,l=0,u={type:null,version:null,url:t,fragments:[],live:!0,startSN:0},d={method:null,key:null,iv:null,uri:null},f=0,h=null,c=null,v=null,g=null,m=null,E=null,R=[],_=this.hls.config,k=!!_&&_.enableLazyURLResolve;for(b.lastIndex=0;null!==(n=b.exec(e));){for(s=1;s0){var u="audioTrack"!==n,d=this.parseLevelPlaylist(i,a,(u?o:s)||0,u?"main":"audio");"manifest"===n&&l.trigger(f.default.MANIFEST_LOADED,{levels:[{url:a,details:d}],audioTracks:[],url:a,stats:t}),t.tparsed=performance.now(),d.targetduration?u?l.trigger(f.default.LEVEL_LOADED,{details:d,level:o||0,id:s||0,stats:t}):l.trigger(f.default.AUDIO_TRACK_LOADED,{details:d,id:s,stats:t}):l.trigger(f.default.ERROR,{type:v.ErrorTypes.NETWORK_ERROR,details:v.ErrorDetails.MANIFEST_PARSING_ERROR,fatal:!0,url:a,reason:"invalid targetduration"})}else{var h=this.parseMasterPlaylist(i,a);if(h.length){var c=this.parseMasterPlaylistMedia(i,a,"AUDIO");if(c.length){var g=!1;c.forEach(function(e){e.url||(g=!0)}),g===!1&&h[0].audioCodec&&!h[0].attrs.AUDIO&&(y.logger.log("audio codec signaled in quality level, but no embedded audio track signaled, create one"),c.unshift({type:"main",name:"main"}))}l.trigger(f.default.MANIFEST_LOADED,{levels:h,audioTracks:c,url:a,stats:t})}else l.trigger(f.default.ERROR,{type:v.ErrorTypes.NETWORK_ERROR,details:v.ErrorDetails.MANIFEST_PARSING_ERROR,fatal:!0,url:a,reason:"no level found in manifest"})}else l.trigger(f.default.ERROR,{type:v.ErrorTypes.NETWORK_ERROR,details:v.ErrorDetails.MANIFEST_PARSING_ERROR,fatal:!0,url:a,reason:"no EXTM3U delimiter"})}},{key:"loaderror",value:function(e,t){var r,i,a=t.loader;switch(t.type){case"manifest":r=v.ErrorDetails.MANIFEST_LOAD_ERROR,i=!0;break;case"level":r=v.ErrorDetails.LEVEL_LOAD_ERROR,i=!1;break;case"audioTrack":r=v.ErrorDetails.AUDIO_TRACK_LOAD_ERROR,i=!1}a&&(a.abort(),this.loaders[t.type]=void 0),this.hls.trigger(f.default.ERROR,{type:v.ErrorTypes.NETWORK_ERROR,details:r,fatal:i,url:a.url,loader:a,response:e,context:t})}},{key:"loadtimeout",value:function(e,t){var r,i,a=t.loader;switch(t.type){case"manifest":r=v.ErrorDetails.MANIFEST_LOAD_TIMEOUT,i=!0;break;case"level":r=v.ErrorDetails.LEVEL_LOAD_TIMEOUT,i=!1;break;case"audioTrack":r=v.ErrorDetails.AUDIO_TRACK_LOAD_TIMEOUT,i=!1}a&&(a.abort(),this.loaders[t.type]=void 0),this.hls.trigger(f.default.ERROR,{type:v.ErrorTypes.NETWORK_ERROR,details:r,fatal:i,url:a.url,loader:a,context:t})}}]),t}(c.default);r.default=R},{2:2,26:26,27:27,28:28,40:40,45:45}],37:[function(e,t,r){"use strict";function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(r,"__esModule",{value:!0});var a=function(){function e(e,t){for(var r=0;r>24&255,t[1]=i>>16&255,t[2]=i>>8&255,t[3]=255&i,t.set(e,4),a=0,i=8;a>24&255,t>>16&255,t>>8&255,255&t,r>>24,r>>16&255,r>>8&255,255&r,85,196,0,0]))}},{key:"mdia",value:function(t){return e.box(e.types.mdia,e.mdhd(t.timescale,t.duration),e.hdlr(t.type),e.minf(t))}},{key:"mfhd",value:function(t){return e.box(e.types.mfhd,new Uint8Array([0,0,0,0,t>>24,t>>16&255,t>>8&255,255&t]))}},{key:"minf",value:function(t){return"audio"===t.type?e.box(e.types.minf,e.box(e.types.smhd,e.SMHD),e.DINF,e.stbl(t)):e.box(e.types.minf,e.box(e.types.vmhd,e.VMHD),e.DINF,e.stbl(t))}},{key:"moof",value:function(t,r,i){return e.box(e.types.moof,e.mfhd(t),e.traf(i,r))}},{key:"moov",value:function(t){for(var r=t.length,i=[];r--;)i[r]=e.trak(t[r]);return e.box.apply(null,[e.types.moov,e.mvhd(t[0].timescale,t[0].duration)].concat(i).concat(e.mvex(t)))}},{key:"mvex",value:function(t){for(var r=t.length,i=[];r--;)i[r]=e.trex(t[r]);return e.box.apply(null,[e.types.mvex].concat(i))}},{key:"mvhd",value:function(t,r){r*=t;var i=new Uint8Array([0,0,0,0,0,0,0,1,0,0,0,2,t>>24&255,t>>16&255,t>>8&255,255&t,r>>24&255,r>>16&255,r>>8&255,255&r,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255]);return e.box(e.types.mvhd,i)}},{key:"sdtp",value:function(t){var r,i,a=t.samples||[],n=new Uint8Array(4+a.length);for(i=0;i>>8&255),n.push(255&a),n=n.concat(Array.prototype.slice.call(i));for(r=0;r>>8&255),s.push(255&a),s=s.concat(Array.prototype.slice.call(i));var o=e.box(e.types.avcC,new Uint8Array([1,n[3],n[4],n[5],255,224|t.sps.length].concat(n).concat([t.pps.length]).concat(s))),l=t.width,u=t.height;return e.box(e.types.avc1,new Uint8Array([0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,l>>8&255,255&l,u>>8&255,255&u,0,72,0,0,0,72,0,0,0,0,0,0,0,1,18,100,97,105,108,121,109,111,116,105,111,110,47,104,108,115,46,106,115,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24,17,17]),o,e.box(e.types.btrt,new Uint8Array([0,28,156,128,0,45,198,192,0,45,198,192])))}},{key:"esds",value:function(e){var t=e.config.length;return new Uint8Array([0,0,0,0,3,23+t,0,1,0,4,15+t,64,21,0,0,0,0,0,0,0,0,0,0,0,5].concat([t]).concat(e.config).concat([6,1,2]))}},{key:"mp4a",value:function(t){var r=t.audiosamplerate;return e.box(e.types.mp4a,new Uint8Array([0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,t.channelCount,0,16,0,0,0,0,r>>8&255,255&r,0,0]),e.box(e.types.esds,e.esds(t)))}},{key:"mp3",value:function(t){var r=t.audiosamplerate;return e.box(e.types[".mp3"],new Uint8Array([0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,t.channelCount,0,16,0,0,0,0,r>>8&255,255&r,0,0]))}},{key:"stsd",value:function(t){return"audio"===t.type?t.isAAC||"mp3"!==t.codec?e.box(e.types.stsd,e.STSD,e.mp4a(t)):e.box(e.types.stsd,e.STSD,e.mp3(t)):e.box(e.types.stsd,e.STSD,e.avc1(t))}},{key:"tkhd",value:function(t){var r=t.id,i=t.duration*t.timescale,a=t.width,n=t.height;return e.box(e.types.tkhd,new Uint8Array([0,0,0,7,0,0,0,0,0,0,0,0,r>>24&255,r>>16&255,r>>8&255,255&r,0,0,0,0,i>>24,i>>16&255,i>>8&255,255&i,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,0,0,0,a>>8&255,255&a,0,0,n>>8&255,255&n,0,0]))}},{key:"traf",value:function(t,r){var i=e.sdtp(t),a=t.id;return e.box(e.types.traf,e.box(e.types.tfhd,new Uint8Array([0,0,0,0,a>>24,a>>16&255,a>>8&255,255&a])),e.box(e.types.tfdt,new Uint8Array([0,0,0,0,r>>24,r>>16&255,r>>8&255,255&r])),e.trun(t,i.length+16+16+8+16+8+8),i)}},{key:"trak",value:function(t){return t.duration=t.duration||4294967295,e.box(e.types.trak,e.tkhd(t),e.mdia(t))}},{key:"trex",value:function(t){var r=t.id;return e.box(e.types.trex,new Uint8Array([0,0,0,0,r>>24,r>>16&255,r>>8&255,255&r,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,1]))}},{key:"trun",value:function(t,r){var i,a,n,s,o,l,u=t.samples||[],d=u.length,f=12+16*d,h=new Uint8Array(f);for(r+=8+f,h.set([0,0,15,1,d>>>24&255,d>>>16&255,d>>>8&255,255&d,r>>>24&255,r>>>16&255,r>>>8&255,255&r],0),i=0;i>>24&255,n>>>16&255,n>>>8&255,255&n,s>>>24&255,s>>>16&255,s>>>8&255,255&s,o.isLeading<<2|o.dependsOn,o.isDependedOn<<6|o.hasRedundancy<<4|o.paddingValue<<1|o.isNonSync,61440&o.degradPrio,15&o.degradPrio,l>>>24&255,l>>>16&255,l>>>8&255,255&l],12+16*i);return e.box(e.types.trun,h)}},{key:"initSegment",value:function(t){e.types||e.init();var r,i=e.moov(t);return r=new Uint8Array(e.FTYP.byteLength+i.byteLength),r.set(e.FTYP),r.set(i,e.FTYP.byteLength),r}}]),e}();r.default=n},{}],38:[function(e,t,r){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(r,"__esModule",{value:!0});var n=function(){function e(e,t){for(var r=0;rMath.pow(2,32)&&!function(){var t=function e(t,r){return r?e(r,t%r):t};e.timescale=e.audiosamplerate/t(e.audiosamplerate,e.isAAC?1024:1152)}(),d.logger.log("audio mp4 timescale :"+e.timescale),e.isAAC||(f.mpeg?(v="audio/mpeg",e.codec=""):f.mp3&&(e.codec="mp3")),g.audio={container:v,codec:e.codec,initSegment:!e.isAAC&&f.mpeg?new Uint8Array:h.default.initSegment([e]),metadata:{channelCount:e.channelCount}},y&&(i=a=s[0].pts-l*r)),t.sps&&t.pps&&o.length&&(t.timescale=this.MP4_TIMESCALE,g.video={container:"video/mp4",codec:t.codec,initSegment:h.default.initSegment([t]),metadata:{width:t.width,height:t.height}},y&&(i=Math.min(i,o[0].pts-l*r),a=Math.min(a,o[0].dts-l*r))),Object.keys(g).length?(n.trigger(u.default.FRAG_PARSING_INIT_SEGMENT,p),this.ISGenerated=!0,y&&(this._initPTS=i,this._initDTS=a)):n.trigger(u.default.ERROR,{type:c.ErrorTypes.MEDIA_ERROR,id:this.id,details:c.ErrorDetails.FRAG_PARSING_ERROR,fatal:!1,reason:"no audio/video samples found"})}},{key:"remuxVideo",value:function(e,t,r,i){var a,n,s,o,l,f,v,g,p=8,y=this.PES_TIMESCALE,m=this.PES2MP4SCALEFACTOR,E=e.samples,b=[],R=this._PTSNormalize,_=this._initDTS;E.sort(function(e,t){return e.dts-t.dts});var k=E.reduce(function(e,t){return Math.max(Math.min(e,t.pts-t.dts),-18e3)},0);if(k<0){d.logger.warn("PTS < DTS detected in video samples, shifting DTS by "+Math.round(k/90)+" ms to overcome this issue");for(var A=0;A1?d.logger.log("AVC:"+L+" ms hole between fragments detected,filling it"):L<-1&&d.logger.log("AVC:"+-L+" ms overlapping between fragments detected"),l=T,E[0].dts=l+_,o=Math.max(o-L,T),E[0].pts=o+_,d.logger.log("Video/PTS/DTS adjusted: "+Math.round(o/90)+"/"+Math.round(l/90)+",delta:"+L+" ms")),f=l,S=E[E.length-1],g=Math.max(R(S.dts-_,T),0),v=Math.max(R(S.pts-_,T),0),v=Math.max(v,g);var D=navigator.vendor,w=navigator.userAgent,O=D&&D.indexOf("Apple")>-1&&w&&!w.match("CriOS");O&&(a=Math.round((g-l)/(m*(E.length-1))));for(var C=0;C0?x-1:x].dts;if(B.stretchShortVideoTrack){var H=B.maxBufferHole,K=B.maxSeekHole,V=Math.floor(Math.min(H,K)*y),W=(i?o+i*y:this.nextAudioPts)-F.pts;W>V?(a=W-j,a<0&&(a=j),d.logger.log("It is approximately "+W/90+" ms to the next segment; using duration "+a/90+" ms for the last video frame.")):a=j}else a=j}a/=m,U=Math.round((F.pts-F.dts)/m)}b.push({size:N,duration:a,cts:U,flags:{isLeading:0,isDependedOn:0,hasRedundancy:0,degradPrio:0,dependsOn:F.key?2:1,isNonSync:F.key?0:1}})}this.nextAvcDts=g+a*m;var Y=e.dropped;if(e.len=0,e.nbNalu=0,e.dropped=0,b.length&&navigator.userAgent.toLowerCase().indexOf("chrome")>-1){var q=b[0].flags;q.dependsOn=2,q.isNonSync=0}e.samples=b,s=h.default.moof(e.sequenceNumber++,l/m,e),e.samples=[];var X={id:this.id,level:this.level,sn:this.sn,data1:s,data2:n,startPTS:o/y,endPTS:(v+m*a)/y,startDTS:l/y,endDTS:this.nextAvcDts/y,type:"video",nb:b.length,dropped:Y};return this.observer.trigger(u.default.FRAG_PARSING_DATA,X),X}},{key:"remuxAudio",value:function(e,t,r,i){var a,n,s,l,f,v,g,p,y,m,E,b,R,_,k,A,T=this.PES_TIMESCALE,S=e.timescale,L=T/S,D=e.timescale*(e.isAAC?1024:1152)/e.audiosamplerate,w=D*L,O=this._PTSNormalize,C=this._initDTS,P=!e.isAAC&&this.typeSupported.mpeg,I=P?0:8,M=[],x=[];if(e.samples.sort(function(e,t){return e.pts-t.pts}),x=e.samples,A=this.nextAudioPts,r|=x.length&&A&&(Math.abs(t-A/T)<.1||Math.abs(x[0].pts-A-this._initDTS)<20*w),r||(A=t*T),i&&e.isAAC)for(var F=0,N=A;F=w){var j=Math.round(B/w);d.logger.warn("Injecting "+j+" audio frame @ "+Math.round(N/90)/1e3+"s due to "+Math.round(B/90)+" ms gap.");for(var H=0;H.1*w,N+=w,0===F?U.pts=U.dts=C+A:U.pts=U.dts=x[F-1].pts+w,F+=1}for(;x.length;){if(n=x.shift(),l=n.unit,m=n.pts-C,E=n.dts-C,void 0!==y)b=O(m,y),R=O(E,y),s.duration=Math.round((R-y)/L);else{b=O(m,A),R=O(E,A);var K=Math.round(1e3*(b-A)/T),V=0;if(r&&e.isAAC&&K){if(K>0)V=Math.round((b-A)/w),d.logger.log(K+" ms hole between AAC samples detected,filling it"),V>0&&(_=o.default.getSilentFrame(e.channelCount),_||(_=l.subarray()),e.len+=V*_.length);else if(K<-12){ -d.logger.log(-K+" ms overlapping between AAC samples detected, drop frame"),e.len-=l.byteLength;continue}b=R=A}if(g=Math.max(0,b),p=Math.max(0,R),!(e.len>0))return;var W=P?e.len:e.len+8;try{f=new Uint8Array(W)}catch(e){return void this.observer.trigger(u.default.ERROR,{type:c.ErrorTypes.MUX_ERROR,level:this.level,id:this.id,details:c.ErrorDetails.REMUX_ALLOC_ERROR,fatal:!1,bytes:W,reason:"fail allocating audio mdat "+W})}P||(a=new DataView(f.buffer),a.setUint32(0,f.byteLength),f.set(h.default.types.mdat,4));for(var Y=0;Y=2&&(q=M[X-2].duration,s.duration=q),X){this.nextAudioPts=b+L*q,e.len=0,e.samples=M,v=P?new Uint8Array:h.default.moof(e.sequenceNumber++,p/L,e),e.samples=[];var z={id:this.id,level:this.level,sn:this.sn,data1:v,data2:f,startPTS:g/T,endPTS:this.nextAudioPts/T,startDTS:p/T,endDTS:(R+L*q)/T,type:"audio",nb:X};return this.observer.trigger(u.default.FRAG_PARSING_DATA,z),z}return null}},{key:"remuxEmptyAudio",value:function(e,t,r,i){var a=this.PES_TIMESCALE,n=e.timescale?e.timescale:e.audiosamplerate,s=a/n,l=this.nextAudioPts,u=(void 0!==l?l:i.startDTS*a)+this._initDTS,f=i.endDTS*a+this._initDTS,h=1024,c=s*h,v=Math.ceil((f-u)/c),g=o.default.getSilentFrame(e.channelCount);if(d.logger.warn("remux empty Audio"),!g)return void d.logger.trace("Unable to remuxEmptyAudio since we were unable to get a silent frame for given audio codec!");for(var p=[],y=0;y4294967296;)e+=r;return e}},{key:"passthrough",get:function(){return!1}}]),e}();r.default=v},{26:26,28:28,29:29,37:37,45:45}],39:[function(e,t,r){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(r,"__esModule",{value:!0});var n=function(){function e(e,t){for(var r=0;rNumber.MAX_SAFE_INTEGER?1/0:t}},{key:"hexadecimalInteger",value:function(e){if(this[e]){var t=(this[e]||"0x").slice(2);t=(1&t.length?"0":"")+t;for(var r=new Uint8Array(t.length/2),i=0;iNumber.MAX_SAFE_INTEGER?1/0:t}},{key:"decimalFloatingPoint",value:function(e){return parseFloat(this[e])}},{key:"enumeratedString",value:function(e){return this[e]}},{key:"decimalResolution",value:function(e){var t=n.exec(this[e]);if(null!==t)return{width:parseInt(t[1],10),height:parseInt(t[2],10)}}}],[{key:"parseAttrList",value:function(e){var t,r={};for(s.lastIndex=0;null!==(t=s.exec(e));){var i=t[2],a='"';0===i.indexOf(a)&&i.lastIndexOf(a)===i.length-1&&(i=i.slice(1,-1)),r[t[1]]=i}return r}}]),e}();r.default=o},{}],41:[function(e,t,r){"use strict";var i={search:function(e,t){for(var r=0,i=e.length-1,a=null,n=null;r<=i;){a=(r+i)/2|0,n=e[a];var s=t(n);if(s>0)r=a+1;else{if(!(s<0))return n;i=a-1}}return null}};t.exports=i},{}],42:[function(e,t,r){"use strict";function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(r,"__esModule",{value:!0});var a=function(){function e(e,t){for(var r=0;r=r}},g=function(e){for(var t=[],r=0;rl&&(v.log("ERROR","Too large cursor position "+this.pos),this.pos=l)}},{key:"moveCursor",value:function(e){var t=this.pos+e;if(e>1)for(var r=this.pos+1;r=144&&this.backSpace();var t=s(e);return this.pos>=l?void v.log("ERROR","Cannot insert "+e.toString(16)+" ("+t+") at position "+this.pos+". Skipping it!"):(this.chars[this.pos].setChar(t,this.currPenState),void this.moveCursor(1))}},{key:"clearFromPos",value:function(e){var t;for(t=e;t0&&(r=e?"["+t.join(" | ")+"]":t.join("\n")),r}},{key:"getTextAndFormat",value:function(){return this.rows}}]),e}(),b=function(){function e(t,r){i(this,e),this.chNr=t,this.outputFilter=r,this.mode=null,this.verbose=0,this.displayedMemory=new E,this.nonDisplayedMemory=new E,this.lastOutputScreen=new E,this.currRollUpRow=this.displayedMemory.rows[o-1],this.writeScreen=this.displayedMemory,this.mode=null,this.cueStartTime=null}return a(e,[{key:"reset",value:function(){this.mode=null,this.displayedMemory.reset(),this.nonDisplayedMemory.reset(),this.lastOutputScreen.reset(),this.currRollUpRow=this.displayedMemory.rows[o-1],this.writeScreen=this.displayedMemory,this.mode=null,this.cueStartTime=null,this.lastCueEndTime=null}},{key:"getHandler",value:function(){return this.outputFilter}},{key:"setHandler",value:function(e){this.outputFilter=e}},{key:"setPAC",value:function(e){this.writeScreen.setPAC(e,this.lastOutputScreen)}},{key:"setBkgData",value:function(e){this.writeScreen.setBkgData(e)}},{key:"setMode",value:function(e){e!==this.mode&&(this.mode=e,v.log("INFO","MODE="+e),"MODE_POP-ON"===this.mode?this.writeScreen=this.nonDisplayedMemory:(this.writeScreen=this.displayedMemory,this.writeScreen.reset(),this.lastOutputScreen.reset()),"MODE_ROLL-UP"!==this.mode&&(this.displayedMemory.nrRollUpRows=null,this.nonDisplayedMemory.nrRollUpRows=null),this.mode=e)}},{key:"insertChars",value:function(e){for(var t=0;t=46,t.italics)t.foreground="white";else{var r=Math.floor(e/2)-16,i=["white","green","blue","cyan","red","yellow","magenta"];t.foreground=i[r]}v.log("INFO","MIDROW: "+JSON.stringify(t)),this.writeScreen.setPen(t)}},{key:"outputDataUpdate",value:function(){var e=v.time;null!==e&&this.outputFilter&&(this.outputFilter.updateData&&this.outputFilter.updateData(e,this.displayedMemory),null!==this.cueStartTime||this.displayedMemory.isEmpty()?this.displayedMemory.equals(this.lastOutputScreen)||(this.outputFilter.newCue&&this.outputFilter.newCue(this.cueStartTime,e,this.lastOutputScreen),this.cueStartTime=this.displayedMemory.isEmpty()?null:e):this.cueStartTime=e,this.lastOutputScreen.copy(this.displayedMemory))}},{key:"cueSplitAtTime",value:function(e){this.outputFilter&&(this.displayedMemory.isEmpty()||(this.outputFilter.newCue&&this.outputFilter.newCue(this.cueStartTime,e,this.displayedMemory),this.cueStartTime=e))}}]),e}(),R=function(){function e(t,r,a){i(this,e),this.field=t||1,this.outputs=[r,a],this.channels=[new b(1,r),new b(2,a)],this.currChNr=-1,this.lastCmdA=null,this.lastCmdB=null,this.bufferedData=[],this.startTime=null,this.lastTime=null,this.dataCounters={padding:0,char:0,cmd:0,other:0}}return a(e,[{key:"getHandler",value:function(e){return this.channels[e].getHandler()}},{key:"setHandler",value:function(e,t){this.channels[e].setHandler(t)}},{key:"addData",value:function(e,t){var r,i,a,n=!1;this.lastTime=e,v.setTime(e);for(var s=0;s ("+g([i,a])+")"),r=this.parseCmd(i,a),r||(r=this.parseMidrow(i,a)),r||(r=this.parsePAC(i,a)),r||(r=this.parseBackgroundAttributes(i,a)),!r&&(n=this.parseChars(i,a)))if(this.currChNr&&this.currChNr>=0){var o=this.channels[this.currChNr-1];o.insertChars(n)}else v.log("WARNING","No channel found yet. TEXT-MODE?");r?this.dataCounters.cmd+=2:n?this.dataCounters.char+=2:(this.dataCounters.other+=2,v.log("WARNING","Couldn't parse cleaned data "+g([i,a])+" orig: "+g([t[s],t[s+1]])))}else this.dataCounters.padding+=2}},{key:"parseCmd",value:function(e,t){var r=null,i=(20===e||28===e)&&32<=t&&t<=47,a=(23===e||31===e)&&33<=t&&t<=35;if(!i&&!a)return!1;if(e===this.lastCmdA&&t===this.lastCmdB)return this.lastCmdA=null,this.lastCmdB=null,v.log("DEBUG","Repeated command ("+g([e,t])+") is dropped"),!0;r=20===e||23===e?1:2;var n=this.channels[r-1];return 20===e||28===e?32===t?n.ccRCL():33===t?n.ccBS():34===t?n.ccAOF():35===t?n.ccAON():36===t?n.ccDER():37===t?n.ccRU(2):38===t?n.ccRU(3):39===t?n.ccRU(4):40===t?n.ccFON():41===t?n.ccRDC():42===t?n.ccTR():43===t?n.ccRTD():44===t?n.ccEDM():45===t?n.ccCR():46===t?n.ccENM():47===t&&n.ccEOC():n.ccTO(t-32),this.lastCmdA=e,this.lastCmdB=t,this.currChNr=r,!0}},{key:"parseMidrow",value:function(e,t){var r=null;if((17===e||25===e)&&32<=t&&t<=47){if(r=17===e?1:2,r!==this.currChNr)return v.log("ERROR","Mismatch channel in midrow parsing"),!1;var i=this.channels[r-1];return i.ccMIDROW(t),v.log("DEBUG","MIDROW ("+g([e,t])+")"),!0}return!1}},{key:"parsePAC",value:function(e,t){var r=null,i=null,a=(17<=e&&e<=23||25<=e&&e<=31)&&64<=t&&t<=127,n=(16===e||24===e)&&64<=t&&t<=95;if(!a&&!n)return!1;if(e===this.lastCmdA&&t===this.lastCmdB)return this.lastCmdA=null,this.lastCmdB=null,!0;r=e<=23?1:2,i=64<=t&&t<=95?1===r?u[e]:f[e]:1===r?d[e]:h[e];var s=this.interpretPAC(i,t),o=this.channels[r-1];return o.setPAC(s),this.lastCmdA=e,this.lastCmdB=t,this.currChNr=r,!0}},{key:"interpretPAC",value:function(e,t){var r=t,i={color:null,italics:!1,indent:null,underline:!1,row:e};return r=t>95?t-96:t-64,i.underline=1===(1&r),r<=13?i.color=["white","green","blue","cyan","red","yellow","magenta","white"][Math.floor(r/2)]:r<=15?(i.italics=!0,i.color="white"):i.indent=4*Math.floor((r-16)/2),i}},{key:"parseChars",value:function(e,t){var r=null,i=null,a=null;if(e>=25?(r=2,a=e-8):(r=1,a=e),17<=a&&a<=19){var n=t;n=17===a?t+80:18===a?t+112:t+144,v.log("INFO","Special char '"+s(n)+"' in channel "+r),i=[n]}else 32<=e&&e<=127&&(i=0===t?[e]:[e,t]);if(i){var o=g(i);v.log("DEBUG","Char codes = "+o.join(",")),this.lastCmdA=null,this.lastCmdB=null}return i}},{key:"parseBackgroundAttributes",value:function(e,t){var r,i,a,n,s=(16===e||24===e)&&32<=t&&t<=47,o=(23===e||31===e)&&45<=t&&t<=47;return!(!s&&!o)&&(r={},16===e||24===e?(i=Math.floor((t-32)/2),r.background=c[i],t%2===1&&(r.background=r.background+"_semi")):45===t?r.background="transparent":(r.foreground="black",47===t&&(r.underline=!0)),a=e<24?1:2,n=this.channels[a-1],n.setBkgData(r),this.lastCmdA=null,this.lastCmdB=null,!0)}},{key:"reset",value:function(){for(var e=0;e=16?o--:o++,navigator.userAgent.match(/Firefox\//)?n.line=d+1:n.line=d>7?d-2:d+1,n.align="left",n.position=Math.max(0,Math.min(100,100*(o/32)+(navigator.userAgent.match(/Firefox\//)?50:0))),e.addCue(n)}}};t.exports=i},{}],44:[function(e,t,r){"use strict";function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(r,"__esModule",{value:!0});var a=function(){function e(e,t){for(var r=0;r "+t}function n(e){var t=self.console[e];return t?function(){for(var r=arguments.length,i=Array(r),n=0;n1?t-1:0),i=1;i=2&&(0===i.tfirst&&(i.tfirst=Math.max(performance.now(),i.trequest),this.requestTimeout=window.setTimeout(this.loadtimeout.bind(this),s.timeout-(i.tfirst-i.trequest))),4===r))){var o=t.status;if(o>=200&&o<300){i.tload=Math.max(i.tfirst,performance.now());var l=void 0,u=void 0;"arraybuffer"===a.responseType?(l=t.response,u=l.byteLength):(l=t.responseText,u=l.length),i.loaded=i.total=u;var d={url:t.responseURL,data:l};this.callbacks.onSuccess(d,i,a)}else i.retry>=s.maxRetry||o>=400&&o<499?(n.logger.error(o+" while loading "+a.url),this.callbacks.onError({code:o,text:t.statusText},a)):(n.logger.warn(o+" while loading "+a.url+", retrying in "+this.retryDelay+"..."),this.destroy(),this.retryTimeout=window.setTimeout(this.loadInternal.bind(this),this.retryDelay),this.retryDelay=Math.min(2*this.retryDelay,s.maxRetryDelay),i.retry++)}}},{key:"loadtimeout",value:function(){n.logger.warn("timeout while loading "+this.context.url),this.callbacks.onTimeout(this.stats,this.context)}},{key:"loadprogress",value:function(e){var t=this.stats;t.loaded=e.loaded,e.lengthComputable&&(t.total=e.total);var r=this.callbacks.onProgress;r&&r(t,this.context,null)}}]),e}();r.default=s},{45:45}]},{},[33])(33)}); +!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var t;t="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,t.Hls=e()}}(function(){var e;return function e(t,r,i){function a(s,o){if(!r[s]){if(!t[s]){var l="function"==typeof require&&require;if(!o&&l)return l(s,!0);if(n)return n(s,!0);var u=new Error("Cannot find module '"+s+"'");throw u.code="MODULE_NOT_FOUND",u}var d=r[s]={exports:{}};t[s][0].call(d.exports,function(e){var r=t[s][1][e];return a(r?r:e)},d,d.exports,e,t,r,i)}return r[s].exports}for(var n="function"==typeof require&&require,s=0;s0&&this._events[e].length>r&&(this._events[e].warned=!0,"function"==typeof console.trace)),this},i.prototype.on=i.prototype.addListener,i.prototype.once=function(e,t){function r(){this.removeListener(e,r),i||(i=!0,t.apply(this,arguments))}if(!a(t))throw TypeError("listener must be a function");var i=!1;return r.listener=t,this.on(e,r),this},i.prototype.removeListener=function(e,t){var r,i,n,o;if(!a(t))throw TypeError("listener must be a function");if(!this._events||!this._events[e])return this;if(r=this._events[e],n=r.length,i=-1,r===t||a(r.listener)&&r.listener===t)delete this._events[e],this._events.removeListener&&this.emit("removeListener",e,t);else if(s(r)){for(o=n;o-- >0;)if(r[o]===t||r[o].listener&&r[o].listener===t){i=o;break}if(i<0)return this;1===r.length?(r.length=0,delete this._events[e]):r.splice(i,1),this._events.removeListener&&this.emit("removeListener",e,t)}return this},i.prototype.removeAllListeners=function(e){var t,r;if(!this._events)return this;if(!this._events.removeListener)return 0===arguments.length?this._events={}:this._events[e]&&delete this._events[e],this;if(0===arguments.length){for(t in this._events)"removeListener"!==t&&this.removeAllListeners(t);return this.removeAllListeners("removeListener"),this._events={},this}if(r=this._events[e],a(r))this.removeListener(e,r);else if(r)for(;r.length;)this.removeListener(e,r[r.length-1]);return delete this._events[e],this},i.prototype.listeners=function(e){var t;return t=this._events&&this._events[e]?a(this._events[e])?[this._events[e]]:this._events[e].slice():[]},i.prototype.listenerCount=function(e){if(this._events){var t=this._events[e];if(a(t))return 1;if(t)return t.length}return 0},i.listenerCount=function(e,t){return e.listenerCount(t)}},{}],2:[function(t,r,i){!function(t){var a={buildAbsoluteURL:function(e,t){if(t=t.trim(),/^[a-z]+:/i.test(t))return t;var r=null,i=null,n=/^([^#]*)(.*)$/.exec(t);n&&(i=n[2],t=n[1]);var s=/^([^\?]*)(.*)$/.exec(t);s&&(r=s[2],t=s[1]);var o=/^([^#]*)(.*)$/.exec(e);o&&(e=o[1]);var l=/^([^\?]*)(.*)$/.exec(e);l&&(e=l[1]);var u=/^(([a-z]+:)?\/\/[a-z0-9\.\-_~]+(:[0-9]+)?)?(\/.*)$/i.exec(e);if(!u)throw new Error("Error trying to parse base URL.");var d=u[2]||"",f=u[1]||"",h=u[4],c=null;return c=/^\/\//.test(t)?d+"//"+a.buildAbsolutePath("",t.substring(2)):/^\//.test(t)?f+"/"+a.buildAbsolutePath("",t.substring(1)):a.buildAbsolutePath(f+h,t),r&&(c+=r),i&&(c+=i),c},buildAbsolutePath:function(e,t){for(var r,i,a=t,n="",s=e.replace(/[^\/]*$/,a.replace(/(\/|^)(?:\.?\/+)+/g,"$1")),o=0;i=s.indexOf("/../",o),i>-1;o=i+r)r=/^\/(?:\.\.\/)*/.exec(s.slice(i))[0].length,n=(n+s.substring(o,i)).replace(new RegExp("(?:\\/+[^\\/]*){0,"+(r-1)/3+"}$"),"/");return n+s.substr(o)}};"object"==typeof i&&"object"==typeof r?r.exports=a:"function"==typeof e&&e.amd?e([],function(){return a}):"object"==typeof i?i.URLToolkit=a:t.URLToolkit=a}(this)},{}],3:[function(e,t,r){var i=arguments[3],a=arguments[4],n=arguments[5],s=JSON.stringify;t.exports=function(e,t){function r(e){p[e]=!0;for(var t in a[e][1]){var i=a[e][1][t];p[i]||r(i)}}for(var o,l=Object.keys(n),u=0,d=l.length;u500*r.duration/o){var l=e.levels,d=Math.max(1,n.bw?n.bw/8:1e3*n.loaded/s),f=n.total?n.total:Math.max(n.loaded,Math.round(r.duration*l[r.level].bitrate/8)),h=t.currentTime,g=(f-n.loaded)/d,p=(c.default.bufferInfo(t,h,e.config.maxBufferHole).end-h)/o;if(p<2*r.duration/o&&g>p){var y=void 0,m=void 0;for(m=r.level-1;m>a&&(y=r.duration*l[m].bitrate/(6.4*d),!(y=i;u--){var d=l[u],f=d.details,h=f?f.totalduration/f.fragments.length:t,c=!!f&&f.live,g=void 0;g=u<=e?s*r:o*r;var p=l[u].bitrate,y=p*h/g;if(v.logger.trace("level/adjustedbw/bitrate/avgDuration/maxFetchDuration/fetchDuration: "+u+"/"+Math.round(g)+"/"+p+"/"+h+"/"+n+"/"+y),g>p&&(!y||c||yr)return a;return 0}},{key:"maxAutoLevel",get:function(){var e,t=this.hls.levels,r=this._autoLevelCapping;return e=r===-1&&t&&t.length?t.length-1:r}},{key:"nextABRAutoLevel",get:function(){var e=this.hls,t=this.maxAutoLevel,r=e.levels,i=e.config,a=this.minAutoLevel,n=e.media,s=this.lastLoadedFragLevel,o=this.fragCurrent?this.fragCurrent.duration:0,l=n?n.currentTime:0,u=n&&0!==n.playbackRate?Math.abs(n.playbackRate):1,d=this.bwEstimator?this.bwEstimator.getEstimate():i.abrEwmaDefaultEstimate,f=(c.default.bufferInfo(n,l,i.maxBufferHole).end-l)/u,h=this.findBestLevel(s,o,d,a,t,f,i.abrBandWidthFactor,i.abrBandWidthUpFactor,r);if(h>=0)return h;v.logger.trace("rebuffering expected to happen, lets try to find a quality level minimizing the rebuffering");var g=i.maxStarvationDelay,p=i.abrBandWidthFactor,y=i.abrBandWidthUpFactor;if(0===f){var m=this.bitrateTestDelay;m&&(g=i.maxLoadingDelay-m,v.logger.trace("bitrate test took "+Math.round(1e3*m)+"ms, set first fragment max fetchDuration to "+Math.round(1e3*g)+" ms"),p=y=1)}return h=this.findBestLevel(s,o,d,a,t,f+g,p,y,r),Math.max(h,0)}}]),t}(f.default);r.default=m},{26:26,27:27,28:28,30:30,45:45,9:9}],5:[function(e,t,r){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function n(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(r,"__esModule",{value:!0});var o="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},l=function(){function e(e,t){for(var r=0;r0&&e===-1?(T.logger.log("audio:override startPosition with lastCurrentTime @"+t.toFixed(3)),this.state=A.IDLE):(this.lastCurrentTime=this.startPosition?this.startPosition:e,this.state=A.STARTING),this.nextLoadPosition=this.startPosition=this.lastCurrentTime,this.tick()}else this.startPosition=e,this.state=A.STOPPED}},{key:"stopLoad",value:function(){var e=this.fragCurrent;e&&(e.loader&&e.loader.abort(),this.fragCurrent=null),this.fragPrevious=null,this.demuxer&&(this.demuxer.destroy(),this.demuxer=null),this.state=A.STOPPED}},{key:"tick",value:function(){this.ticks++,1===this.ticks&&(this.doTick(),this.ticks>1&&setTimeout(this.tick,1),this.ticks=0)}},{key:"doTick",value:function(){var e,t,r,i,a,n,s=this,l=this.hls,u=l.config,f=function(){switch(s.state){case A.ERROR:case A.PAUSED:break;case A.STARTING:s.state=A.WAITING_TRACK,s.loadedmetadata=!1;break;case A.IDLE:if(!s.media&&(s.startFragRequested||!u.startFragPrefetch))break;e=s.loadedmetadata?s.media.currentTime:s.nextLoadPosition;var o=s.mediaBuffer?s.mediaBuffer:s.media,f=h.default.bufferInfo(o,e,u.maxBufferHole),c=f.len,g=f.end,v=s.fragPrevious,y=u.maxMaxBufferLength,m=s.audioSwitch;if(c_))return{v:void 0};T.logger.log("alt audio track ahead of main track, seek to start of alt audio track"),s.media.currentTime=_+.05}if(g<_?S=E[0]:!function(){var e=void 0,t=u.maxFragLookUpTolerance;gR-t&&(t=0),e=d.default.search(E,function(e){return e.start+e.duration-t<=g?1:e.start-t>g?-1:0})):e=E[b-1],e&&(S=e,_=e.start,v&&S.level===v.level&&S.sn===v.sn&&(S.snL&&Math.abs(s.fragLoadIdx-S.loadIdx)=a||n)&&(T.logger.log("audioStreamController: retryDate reached, switch back to IDLE state"),s.state=A.IDLE);break;case A.WAITING_INIT_PTS:case A.STOPPED:case A.FRAG_LOADING:case A.PARSING:case A.PARSED:case A.ENDED:}}();if("object"===("undefined"==typeof f?"undefined":o(f)))return f.v}},{key:"onMediaAttached",value:function(e){var t=this.media=this.mediaBuffer=e.media;this.onvseeking=this.onMediaSeeking.bind(this),this.onvended=this.onMediaEnded.bind(this),t.addEventListener("seeking",this.onvseeking),t.addEventListener("ended",this.onvended);var r=this.config;this.tracks&&r.autoStartLoad&&this.startLoad(r.startPosition)}},{key:"onMediaDetaching",value:function(){var e=this.media;e&&e.ended&&(T.logger.log("MSE detaching and video ended, reset startPosition"),this.startPosition=this.lastCurrentTime=0);var t=this.tracks;t&&t.forEach(function(e){e.details&&e.details.fragments.forEach(function(e){e.loadCounter=void 0})}),e&&(e.removeEventListener("seeking",this.onvseeking),e.removeEventListener("ended",this.onvended),this.onvseeking=this.onvseeked=this.onvended=null),this.media=this.mediaBuffer=null,this.loadedmetadata=!1,this.stopLoad()}},{key:"onMediaSeeking",value:function(){this.state===A.ENDED&&(this.state=A.IDLE),this.media&&(this.lastCurrentTime=this.media.currentTime),void 0!==this.fragLoadIdx&&(this.fragLoadIdx+=2*this.config.fragLoadingLoopThreshold),this.tick()}},{key:"onMediaEnded",value:function(){this.startPosition=this.lastCurrentTime=0}},{key:"onAudioTracksUpdated",value:function(e){T.logger.log("audio tracks updated"),this.tracks=e.audioTracks}},{key:"onAudioTrackSwitching",value:function(e){var t=!!e.url;this.trackId=e.id,this.state=A.IDLE,this.fragCurrent=null,this.state=A.PAUSED,this.waitingFragment=null,t?this.timer||(this.timer=setInterval(this.ontick,100)):this.demuxer&&(this.demuxer.destroy(),this.demuxer=null),t&&(this.audioSwitch=!0,this.state=A.IDLE,this.fragLoadIdx+=2*this.config.fragLoadingLoopThreshold),this.tick()}},{key:"onAudioTrackLoaded",value:function(e){var t=e.details,r=e.id,i=this.tracks[r],a=t.totalduration,n=0;if(T.logger.log("track "+r+" loaded ["+t.startSN+","+t.endSN+"],duration:"+a),t.live){var s=i.details;s&&t.fragments.length>0?(b.default.mergeDetails(s,t),n=t.fragments[0].start,t.PTSKnown?T.logger.log("live audio playlist sliding:"+n.toFixed(3)):T.logger.log("live audio playlist - outdated PTS, unknown sliding")):(t.PTSKnown=!1,T.logger.log("live audio playlist - first load, unknown sliding"))}else t.PTSKnown=!1;if(i.details=t,!this.startFragRequested){if(this.startPosition===-1){var o=t.startTimeOffset;isNaN(o)?this.startPosition=0:(T.logger.log("start time offset found in playlist, adjust startPosition to "+o),this.startPosition=o)}this.nextLoadPosition=this.startPosition}this.state===A.WAITING_TRACK&&(this.state=A.IDLE),this.tick()}},{key:"onKeyLoaded",value:function(){this.state===A.KEY_LOADING&&(this.state=A.IDLE,this.tick())}},{key:"onFragLoaded",value:function(e){var t=this.fragCurrent;if(this.state===A.FRAG_LOADING&&t&&"audio"===e.frag.type&&e.frag.level===t.level&&e.frag.sn===t.sn){this.state=A.PARSING,this.stats=e.stats;var r=this.tracks[this.trackId],i=r.details,a=i.totalduration,n=t.start,s=t.level,o=t.sn,l=t.cc,u=this.config.defaultAudioCodec||r.audioCodec;this.appended=!1,this.demuxer||(this.demuxer=new g.default(this.hls,"audio"));var d=this.initPTS[l];if(void 0!==d){this.pendingBuffering=-1,T.logger.log("Demuxing "+o+" of ["+i.startSN+" ,"+i.endSN+"],track "+s);var f=!1;this.demuxer.push(e.payload,u,null,n,l,s,o,a,t.decryptdata,f,d)}else T.logger.log("unknown video PTS for continuity counter "+l+", waiting for video PTS before demuxing audio frag "+o+" of ["+i.startSN+" ,"+i.endSN+"],track "+s),this.waitingFragment=e,this.state=A.WAITING_INIT_PTS}this.fragLoadError=0}},{key:"onFragParsingInitSegment",value:function(e){var t=this.fragCurrent;if(t&&"audio"===e.id&&e.sn===t.sn&&e.level===t.level&&this.state===A.PARSING){var r=e.tracks,i=void 0;if(r.video&&delete r.video,i=r.audio){i.levelCodec="mp4a.40.2",i.id=e.id,this.hls.trigger(p.default.BUFFER_CODECS,r),T.logger.log("audio track:audio,container:"+i.container+",codecs[level/parsed]=["+i.levelCodec+"/"+i.codec+"]");var a=i.initSegment;if(a){var n={type:"audio",data:a,parent:"audio",content:"initSegment"};this.audioSwitch?this.pendingData=[n]:(this.appended=!0,this.hls.trigger(p.default.BUFFER_APPENDING,n))}this.tick()}}}},{key:"onFragParsingData",value:function(e){var t=this,r=this.fragCurrent;r&&"audio"===e.id&&"audio"===e.type&&e.sn===r.sn&&e.level===r.level&&this.state===A.PARSING&&!function(){var r=t.trackId,i=t.tracks[r],a=t.fragCurrent,n=t.hls;T.logger.log("parsed "+e.type+",PTS:["+e.startPTS.toFixed(3)+","+e.endPTS.toFixed(3)+"],DTS:["+e.startDTS.toFixed(3)+"/"+e.endDTS.toFixed(3)+"],nb:"+e.nb),b.default.updateFragPTSDTS(i.details,a.sn,e.startPTS,e.endPTS);var s=t.audioSwitch,o=t.media,l=!1;if(s&&o)if(o.readyState){var u=o.currentTime;T.logger.log("switching audio track : currentTime:"+u),u>=e.startPTS&&(T.logger.log("switching audio track : flushing all audio"),n.trigger(p.default.BUFFER_FLUSHING,{startOffset:0,endOffset:Number.POSITIVE_INFINITY,type:"audio"}),l=!0,t.audioSwitch=!1,n.trigger(p.default.AUDIO_TRACK_SWITCHED,{id:r}))}else t.audioSwitch=!1,n.trigger(p.default.AUDIO_TRACK_SWITCHED,{id:r});var d=t.pendingData;t.audioSwitch||([e.data1,e.data2].forEach(function(t){t&&d.push({type:e.type,data:t,parent:"audio",content:"data"})}),!l&&d.length&&(d.forEach(function(e){t.hls.trigger(p.default.BUFFER_APPENDING,e)}),t.pendingData=[],t.appended=!0)),t.tick()}()}},{key:"onFragParsed",value:function(e){var t=this.fragCurrent;t&&"audio"===e.id&&e.sn===t.sn&&e.level===t.level&&this.state===A.PARSING&&(this.stats.tparsed=performance.now(),this.state=A.PARSED,this._checkAppendedParsed())}},{key:"onBufferCreated",value:function(e){var t=e.tracks.audio;t&&(this.mediaBuffer=t.buffer,this.loadedmetadata=!0)}},{key:"onBufferAppended",value:function(e){if("audio"===e.parent){var t=this.state;t!==A.PARSING&&t!==A.PARSED||(this.pendingBuffering=e.pending,this._checkAppendedParsed())}}},{key:"_checkAppendedParsed",value:function(){if(this.state===A.PARSED&&(!this.appended||0===this.pendingBuffering)){var e=this.fragCurrent,t=this.stats,r=this.hls;if(e){this.fragPrevious=e,t.tbuffered=performance.now(),r.trigger(p.default.FRAG_BUFFERED,{stats:t,frag:e,id:"audio"});var i=this.mediaBuffer?this.mediaBuffer:this.media;T.logger.log("audio buffered : "+R.default.toString(i.buffered)),this.audioSwitch&&this.appended&&(this.audioSwitch=!1,r.trigger(p.default.AUDIO_TRACK_SWITCHED,{id:this.trackId})),this.state=A.IDLE}this.tick()}}},{key:"onError",value:function(e){var t=e.frag;if(!t||"audio"===t.type)switch(e.details){case k.ErrorDetails.FRAG_LOAD_ERROR:case k.ErrorDetails.FRAG_LOAD_TIMEOUT:if(!e.fatal){var r=this.fragLoadError;r?r++:r=1;var i=this.config;if(r<=i.fragLoadingMaxRetry){this.fragLoadError=r,t.loadCounter=0;var a=Math.min(Math.pow(2,r-1)*i.fragLoadingRetryDelay,i.fragLoadingMaxRetryTimeout);T.logger.warn("audioStreamController: frag loading failed, retry in "+a+" ms"),this.retryDate=performance.now()+a,this.state=A.FRAG_LOADING_WAITING_RETRY}else T.logger.error("audioStreamController: "+e.details+" reaches max retry, redispatch as fatal ..."),e.fatal=!0,this.hls.trigger(p.default.ERROR,e),this.state=A.ERROR}break;case k.ErrorDetails.FRAG_LOOP_LOADING_ERROR:case k.ErrorDetails.AUDIO_TRACK_LOAD_ERROR:case k.ErrorDetails.AUDIO_TRACK_LOAD_TIMEOUT:case k.ErrorDetails.KEY_LOAD_ERROR:case k.ErrorDetails.KEY_LOAD_TIMEOUT:this.state!==A.ERROR&&(this.state=e.fatal?A.ERROR:A.IDLE,T.logger.warn("audioStreamController: "+e.details+" while loading frag,switch to "+this.state+" state ..."))}}},{key:"onBufferFlushed",value:function(){var e=this,t=this.pendingData;t&&t.length?(T.logger.log("appending pending audio data on Buffer Flushed"),t.forEach(function(t){e.hls.trigger(p.default.BUFFER_APPENDING,t)}),this.appended=!0,this.pendingData=[],this.state=A.PARSED):(this.state=A.IDLE,this.fragPrevious=null,this.tick())}}]),t}(m.default);r.default=S},{22:22,26:26,27:27,28:28,30:30,31:31,41:41,45:45,46:46}],6:[function(e,t,r){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function n(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(r,"__esModule",{value:!0});var o=function(){function e(e,t){for(var r=0;r1&&setTimeout(this.tick,1),this.ticks=0)}},{key:"doTick",value:function(){this.updateTrack(this.trackId)}},{key:"onManifestLoading",value:function(){this.tracks=[],this.trackId=-1}},{key:"onManifestLoaded",value:function(e){var t=this,r=e.audioTracks||[],i=!1;this.tracks=r,this.hls.trigger(u.default.AUDIO_TRACKS_UPDATED,{audioTracks:r});var a=0;r.forEach(function(e){return e.default?(t.audioTrack=a,void(i=!0)):void a++}),i===!1&&r.length&&(h.logger.log("no default audio track defined, use first audio track as default"),this.audioTrack=0)}},{key:"onAudioTrackLoaded",value:function(e){e.id=0&&e=0&&e.1){var n=i.updating;try{i.abort()}catch(e){n=!0,h.logger.warn("can not abort audio buffer: "+e)}n?this.audioTimestampOffset=e.start:(h.logger.warn("change mpeg audio timestamp offset from "+i.timestampOffset+" to "+e.start), +i.timestampOffset=e.start)}}}},{key:"onManifestParsed",value:function(e){var t=e.audio,r=e.video,i=0;e.altAudio&&(t||r)&&(i=(t?1:0)+(r?1:0),h.logger.log(i+" sourceBuffer(s) expected")),this.sourceBufferNb=i}},{key:"onMediaAttaching",value:function(e){var t=this.media=e.media;if(t){var r=this.mediaSource=new MediaSource;this.onmso=this.onMediaSourceOpen.bind(this),this.onmse=this.onMediaSourceEnded.bind(this),this.onmsc=this.onMediaSourceClose.bind(this),r.addEventListener("sourceopen",this.onmso),r.addEventListener("sourceended",this.onmse),r.addEventListener("sourceclose",this.onmsc),t.src=URL.createObjectURL(r)}}},{key:"onMediaDetaching",value:function(){h.logger.log("media source detaching");var e=this.mediaSource;if(e){if("open"===e.readyState)try{e.endOfStream()}catch(e){h.logger.warn("onMediaDetaching:"+e.message+" while calling endOfStream")}e.removeEventListener("sourceopen",this.onmso),e.removeEventListener("sourceended",this.onmse),e.removeEventListener("sourceclose",this.onmsc),this.media&&(URL.revokeObjectURL(this.media.src),this.media.removeAttribute("src"),this.media.load()),this.mediaSource=null,this.media=null,this.pendingTracks={},this.tracks={},this.sourceBuffer={},this.flushRange=[],this.segments=[],this.appended=0}this.onmso=this.onmse=this.onmsc=null,this.hls.trigger(u.default.MEDIA_DETACHED)}},{key:"onMediaSourceOpen",value:function(){h.logger.log("media source opened"),this.hls.trigger(u.default.MEDIA_ATTACHED,{media:this.media});var e=this.mediaSource;e&&e.removeEventListener("sourceopen",this.onmso),this.checkPendingTracks()}},{key:"checkPendingTracks",value:function(){var e=this.pendingTracks,t=Object.keys(e).length;t&&(this.sourceBufferNb<=t||0===this.sourceBufferNb)&&(this.createSourceBuffers(e),this.pendingTracks={},this.doAppending())}},{key:"onMediaSourceClose",value:function(){h.logger.log("media source closed")}},{key:"onMediaSourceEnded",value:function(){h.logger.log("media source ended")}},{key:"onSBUpdateEnd",value:function(){if(this.audioTimestampOffset){var e=this.sourceBuffer.audio;h.logger.warn("change mpeg audio timestamp offset from "+e.timestampOffset+" to "+this.audioTimestampOffset),e.timestampOffset=this.audioTimestampOffset,delete this.audioTimestampOffset}this._needsFlush&&this.doFlush(),this._needsEos&&this.checkEos(),this.appending=!1;var t=this.parent,r=this.segments.reduce(function(e,r){return r.parent===t?e+1:e},0);this.hls.trigger(u.default.BUFFER_APPENDED,{parent:t,pending:r}),this._needsFlush||this.doAppending(),this.updateMediaElementDuration()}},{key:"onSBUpdateError",value:function(e){h.logger.error("sourceBuffer error:"+e),this.hls.trigger(u.default.ERROR,{type:c.ErrorTypes.MEDIA_ERROR,details:c.ErrorDetails.BUFFER_APPENDING_ERROR,fatal:!1})}},{key:"onBufferReset",value:function(){var e=this.sourceBuffer;for(var t in e){var r=e[t];try{this.mediaSource.removeSourceBuffer(r),r.removeEventListener("updateend",this.onsbue),r.removeEventListener("error",this.onsbe)}catch(e){}}this.sourceBuffer={},this.flushRange=[],this.segments=[],this.appended=0}},{key:"onBufferCodecs",value:function(e){if(0===Object.keys(this.sourceBuffer).length){for(var t in e)this.pendingTracks[t]=e[t];var r=this.mediaSource;r&&"open"===r.readyState&&this.checkPendingTracks()}}},{key:"createSourceBuffers",value:function(e){var t=this.sourceBuffer,r=this.mediaSource;for(var i in e)if(!t[i]){var a=e[i],n=a.levelCodec||a.codec,s=a.container+";codecs="+n;h.logger.log("creating sourceBuffer("+s+")");try{var o=t[i]=r.addSourceBuffer(s);o.addEventListener("updateend",this.onsbue),o.addEventListener("error",this.onsbe),this.tracks[i]={codec:n,container:a.container},a.buffer=o}catch(e){h.logger.error("error while trying to add sourceBuffer:"+e.message),this.hls.trigger(u.default.ERROR,{type:c.ErrorTypes.MEDIA_ERROR,details:c.ErrorDetails.BUFFER_ADD_CODEC_ERROR,fatal:!1,err:e,mimeType:s})}}this.hls.trigger(u.default.BUFFER_CREATED,{tracks:e})}},{key:"onBufferAppending",value:function(e){this._needsFlush||(this.segments?this.segments.push(e):this.segments=[e],this.doAppending())}},{key:"onBufferAppendFail",value:function(e){h.logger.error("sourceBuffer error:"+e.event),this.hls.trigger(u.default.ERROR,{type:c.ErrorTypes.MEDIA_ERROR,details:c.ErrorDetails.BUFFER_APPENDING_ERROR,fatal:!1,frag:this.fragCurrent})}},{key:"onBufferEos",value:function(e){var t=this.sourceBuffer,r=e.type;for(var i in t)r&&i!==r||t[i].ended||(t[i].ended=!0,h.logger.log(i+" sourceBuffer now EOS"));this.checkEos()}},{key:"checkEos",value:function(){var e=this.sourceBuffer,t=this.mediaSource;if(!t||"open"!==t.readyState)return void(this._needsEos=!1);for(var r in e){var i=e[r];if(!i.ended)return;if(i.updating)return void(this._needsEos=!0)}h.logger.log("all media data available, signal endOfStream() to MediaSource and stop loading fragment");try{t.endOfStream()}catch(e){h.logger.warn("exception while calling mediaSource.endOfStream()")}this._needsEos=!1}},{key:"onBufferFlushing",value:function(e){this.flushRange.push({start:e.startOffset,end:e.endOffset,type:e.type}),this.flushBufferCounter=0,this.doFlush()}},{key:"onLevelUpdated",value:function(e){var t=e.details;0!==t.fragments.length&&(this._levelDuration=t.totalduration+t.fragments[0].start,this.updateMediaElementDuration())}},{key:"updateMediaElementDuration",value:function(){var e=this.media,t=this.mediaSource,r=this.sourceBuffer,i=this._levelDuration;if(null!==i&&e&&t&&r&&0!==e.readyState&&"open"===t.readyState){for(var a in r)if(r[a].updating)return;null===this._msDuration&&(this._msDuration=t.duration),i>this._msDuration&&i>e.duration&&(h.logger.log("Updating mediasource duration to "+i.toFixed(3)),this._msDuration=t.duration=i)}}},{key:"doFlush",value:function(){for(;this.flushRange.length;){var e=this.flushRange[0];if(!this.flushBuffer(e.start,e.end,e.type))return void(this._needsFlush=!0);this.flushRange.shift(),this.flushBufferCounter=0}if(0===this.flushRange.length){this._needsFlush=!1;var t=0,r=this.sourceBuffer;try{for(var i in r)t+=r[i].buffered.length}catch(e){h.logger.error("error while accessing sourceBuffer.buffered")}this.appended=t,this.hls.trigger(u.default.BUFFER_FLUSHED)}}},{key:"doAppending",value:function(){var e=this.hls,t=this.sourceBuffer,r=this.segments;if(Object.keys(t).length){if(this.media.error)return this.segments=[],void h.logger.error("trying to append although a media error occured, flush segment and abort");if(this.appending)return;if(r&&r.length){var i=r.shift();try{var a=i.type,n=t[a];n?n.updating?r.unshift(i):(n.ended=!1,this.parent=i.parent,n.appendBuffer(i.data),this.appendError=0,this.appended++,this.appending=!0):this.onSBUpdateEnd()}catch(t){h.logger.error("error while trying to append buffer:"+t.message),r.unshift(i);var s={type:c.ErrorTypes.MEDIA_ERROR};if(22===t.code)return this.segments=[],s.details=c.ErrorDetails.BUFFER_FULL_ERROR,void e.trigger(u.default.ERROR,s);if(this.appendError?this.appendError++:this.appendError=1,s.details=c.ErrorDetails.BUFFER_APPEND_ERROR,s.frag=this.fragCurrent,this.appendError>e.config.appendErrorMaxRetry)return h.logger.log("fail "+e.config.appendErrorMaxRetry+" times to append segment in sourceBuffer"),r=[],s.fatal=!0,void e.trigger(u.default.ERROR,s);s.fatal=!1,e.trigger(u.default.ERROR,s)}}}}},{key:"flushBuffer",value:function(e,t,r){var i,a,n,s,o,l,u=this.sourceBuffer;if(Object.keys(u).length){if(h.logger.log("flushBuffer,pos/start/end: "+this.media.currentTime+"/"+e+"/"+t),this.flushBufferCounter.5)return this.flushBufferCounter++,h.logger.log("flush "+d+" ["+o+","+l+"], of ["+n+","+s+"], pos:"+this.media.currentTime),i.remove(o,l),!1}catch(e){h.logger.warn("exception while accessing sourcebuffer, it might have been removed from MediaSource")}}}else h.logger.warn("abort flushing too many retries");h.logger.log("buffer flushed")}return!0}}]),t}(f.default);r.default=g},{26:26,27:27,28:28,45:45}],8:[function(e,t,r){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function n(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(r,"__esModule",{value:!0});var o=function(){function e(e,t){for(var r=0;rthis.autoLevelCapping&&this.hls.streamController.nextLevelSwitch(),this.autoLevelCapping=this.hls.autoLevelCapping)}}},{key:"getMaxLevel",value:function(e){var t=0,r=void 0,i=void 0,a=this.mediaWidth,n=this.mediaHeight,s=0,o=0;for(r=0;r<=e&&(i=this.levels[r],!this.isLevelRestricted(r))&&(t=r,s=i.width,o=i.height,!(a<=s||n<=o));r++);return t}},{key:"isLevelRestricted",value:function(e){return!(!this.restrictedLevels||this.restrictedLevels.indexOf(e)===-1)}},{key:"contentScaleFactor",get:function(){var e=1;try{e=window.devicePixelRatio}catch(e){}return e}},{key:"mediaWidth",get:function(){var e=void 0;return this.media&&(e=this.media.width||this.media.clientWidth||this.media.offsetWidth,e*=this.contentScaleFactor),e}},{key:"mediaHeight",get:function(){var e=void 0;return this.media&&(e=this.media.height||this.media.clientHeight||this.media.offsetHeight,e*=this.contentScaleFactor),e}}]),t}(f.default);r.default=h},{27:27,28:28}],9:[function(e,t,r){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(r,"__esModule",{value:!0});var n=function(){function e(e,t){for(var r=0;r=this.minWeight_}},{key:"getEstimate",value:function(){return this.canEstimate()?Math.min(this.fast_.getEstimate(),this.slow_.getEstimate()):this.defaultEstimate_}},{key:"destroy",value:function(){}}]),e}();r.default=l},{44:44}],10:[function(e,t,r){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function n(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(r,"__esModule",{value:!0});var o=function(){function e(e,t){for(var r=0;r0&&n>this.hls.config.fpsDroppedMonitoringThreshold*s){var l=this.hls.currentLevel;h.logger.warn("drop FPS ratio greater than max allowed value for currentLevel: "+l),l>0&&(this.hls.autoLevelCapping===-1||this.hls.autoLevelCapping>=l)&&(l-=1,this.hls.trigger(u.default.FPS_DROP_LEVEL_CAPPING,{level:l,droppedLevel:this.hls.currentLevel}),this.hls.autoLevelCapping=l,this.hls.streamController.nextLevelSwitch())}}this.lastTime=i,this.lastDroppedFrames=r,this.lastDecodedFrames=t}}},{key:"checkFPSInterval",value:function(){if(this.video)if(this.isVideoPlaybackQualityAvailable){var e=this.video.getVideoPlaybackQuality();this.checkFPS(this.video,e.totalVideoFrames,e.droppedVideoFrames)}else this.checkFPS(this.video,this.video.webkitDecodedFrameCount,this.video.webkitDroppedFrameCount)}}]),t}(f.default);r.default=c},{27:27,28:28,45:45}],11:[function(e,t,r){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function n(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(r,"__esModule",{value:!0});var o=function(){function e(e,t){for(var r=0;r0})}else o.trigger(u.default.ERROR,{type:c.ErrorTypes.MEDIA_ERROR,details:c.ErrorDetails.MANIFEST_INCOMPATIBLE_CODECS_ERROR,fatal:!0,url:o.url,reason:"no level with compatible codecs found in manifest"})}},{key:"setLevelInternal",value:function(e){var t=this._levels;if(e>=0&&e1&&a.loadErrore&&(this._level===e&&void 0!==t[e].details||this.setLevelInternal(e))}},{key:"manualLevel",get:function(){return this._manualLevel},set:function(e){this._manualLevel=e,void 0===this._startLevel&&(this._startLevel=e),e!==-1&&(this.level=e)}},{key:"firstLevel",get:function(){return this._firstLevel},set:function(e){this._firstLevel=e}},{key:"startLevel",get:function(){if(void 0===this._startLevel){var e=this.hls.config.startLevel;return void 0!==e?e:this._firstLevel}return this._startLevel},set:function(e){e!==-1&&(e=Math.max(e,this.hls.abrController.minAutoLevel)),this._startLevel=e}},{key:"nextLoadLevel",get:function(){return this._manualLevel!==-1?this._manualLevel:this.hls.abrController.nextAutoLevel},set:function(e){this.level=e,this._manualLevel===-1&&(this.hls.abrController.nextAutoLevel=e)}}]),t}(f.default);r.default=p},{26:26,27:27,28:28,30:30,45:45}],12:[function(e,t,r){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function n(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(r,"__esModule",{value:!0});var o=function(){function e(e,t){for(var r=0;r0&&e===-1&&(k.logger.log("override startPosition with lastCurrentTime @"+t.toFixed(3)),e=t),this.state=T.IDLE,this.nextLoadPosition=this.startPosition=this.lastCurrentTime=e,this.tick()}else k.logger.warn("cannot start loading as manifest not parsed yet"),this.state=T.STOPPED}},{key:"stopLoad",value:function(){var e=this.fragCurrent;e&&(e.loader&&e.loader.abort(),this.fragCurrent=null),this.fragPrevious=null,this.demuxer&&(this.demuxer.destroy(),this.demuxer=null),this.state=T.STOPPED}},{key:"tick",value:function(){this.ticks++,1===this.ticks&&(this.doTick(),this.ticks>1&&setTimeout(this.tick,1),this.ticks=0)}},{key:"doTick",value:function(){switch(this.state){case T.ERROR:break;case T.BUFFER_FLUSHING:this.fragLoadError=0;break;case T.IDLE:if(!this._doTickIdle())return;break;case T.WAITING_LEVEL:var e=this.levels[this.level];e&&e.details&&(this.state=T.IDLE);break;case T.FRAG_LOADING_WAITING_RETRY:var t=performance.now(),r=this.retryDate;(!r||t>=r||this.media&&this.media.seeking)&&(k.logger.log("mediaController: retryDate reached, switch back to IDLE state"),this.state=T.IDLE);break;case T.ERROR:case T.STOPPED:case T.FRAG_LOADING:case T.PARSING:case T.PARSED:case T.ENDED:}this._checkBuffer(),this._checkFragmentChanged()}},{key:"_doTickIdle",value:function(){var e=this.hls,t=e.config,r=this.media;if(void 0!==this.levelLastLoaded&&!r&&(this.startFragRequested||!t.startFragPrefetch))return!0;var i=void 0;i=this.loadedmetadata?r.currentTime:this.nextLoadPosition;var a=e.nextLoadLevel,n=this.levels[a],s=n.bitrate,o=void 0;o=s?Math.max(8*t.maxBufferSize/s,t.maxBufferLength):t.maxBufferLength,o=Math.min(o,t.maxMaxBufferLength);var l=f.default.bufferInfo(this.mediaBuffer?this.mediaBuffer:r,i,t.maxBufferHole),u=l.len;if(u>=o)return!0;k.logger.trace("buffer length of "+u.toFixed(3)+" is below max of "+o.toFixed(3)+". checking for more payload ..."),this.level=e.nextLoadLevel=a;var d=n.details;if("undefined"==typeof d||d.live&&this.levelLastLoaded!==a)return this.state=T.WAITING_LEVEL,!0;var h=this.fragPrevious;if(!d.live&&h&&h.sn===d.endSN&&(!r.seeking&&l.len||r.duration-l.end<=h.duration/2)){var c={};return this.altAudio&&(c.type="video"),this.hls.trigger(v.default.BUFFER_EOS,c),this.state=T.ENDED,!0}return this._fetchPayloadOrEos({pos:i,bufferInfo:l,levelDetails:d})}},{key:"_fetchPayloadOrEos",value:function(e){var t=e.pos,r=e.bufferInfo,i=e.levelDetails,a=this.fragPrevious,n=this.level,s=i.fragments,o=s.length;if(0===o)return!1;var l=s[0].start,u=s[o-1].start+s[o-1].duration,d=r.end,f=void 0;if(i.live){var h=this.config.initialLiveManifestSize;if(oh&&(u.currentTime=h)}if(t.PTSKnown&&r>a&&u&&u.readyState)return null;if(this.startFragRequested&&!t.PTSKnown){if(n){var c=n.sn+1;c>=t.startSN&&c<=t.endSN&&(d=s[c-t.startSN],k.logger.log("live playlist, switching playlist, load frag with next SN: "+d.sn))}d||(d=s[Math.min(o-1,Math.round(o/2))],k.logger.log("live playlist, switching playlist, unknown, load middle frag : "+d.sn))}return d}},{key:"_findFragment",value:function(e){var t=e.start,r=e.fragPrevious,i=e.fragLen,a=e.fragments,n=e.bufferEnd,s=e.end,o=e.levelDetails,l=this.hls.config,d=void 0,f=void 0,h=l.maxFragLookUpTolerance;if(ns-h&&(h=0),f=u.default.search(a,function(e){return e.start+e.duration-h<=n?1:e.start-h>n&&e.start?-1:0})):f=a[i-1],f&&(d=f,t=f.start,r&&d.level===r.level&&d.sn===r.sn))if(d.snl.maxBufferHole&&r.dropped&&g?(d=a[g-1],k.logger.warn("SN just loaded, with large PTS gap between audio and video, maybe frag is not starting with a keyframe ? load previous one to try to overcome this"),r.loadCounter--):(d=a[g+1],k.logger.log("SN just loaded, load next one: "+d.sn))}else d=null;return d}},{key:"_loadFragmentOrKey",value:function(e){var t=e.frag,r=e.level,i=e.levelDetails,a=e.pos,n=e.bufferEnd,s=this.hls,o=s.config;if(null==t.decryptdata.uri||null!=t.decryptdata.key){if(k.logger.log("Loading "+t.sn+" of ["+i.startSN+" ,"+i.endSN+"],level "+r+", currentTime:"+a.toFixed(3)+",bufferEnd:"+n.toFixed(3)),void 0!==this.fragLoadIdx?this.fragLoadIdx++:this.fragLoadIdx=0,t.loadCounter){t.loadCounter++;var l=o.fragLoadingLoopThreshold;if(t.loadCounter>l&&Math.abs(this.fragLoadIdx-t.loadIdx)=0;t--)if(r=i[t],e>=r.start&&e<=r.end)return r;return null}},{key:"followingBufferRange",value:function(e){return e?this.getBufferRange(e.end+.5):null}},{key:"_checkFragmentChanged",value:function(){var e,t,r=this.media;if(r&&r.readyState&&r.seeking===!1&&(t=r.currentTime,t>r.playbackRate*this.lastCurrentTime&&(this.lastCurrentTime=t),f.default.isBuffered(r,t)?e=this.getBufferRange(t):f.default.isBuffered(r,t+.1)&&(e=this.getBufferRange(t+.1)),e)){var i=e.frag;i!==this.fragPlaying&&(this.fragPlaying=i,this.hls.trigger(v.default.FRAG_CHANGED,{frag:i}))}}},{key:"immediateLevelSwitch",value:function(){if(k.logger.log("immediateLevelSwitch"),!this.immediateSwitch){this.immediateSwitch=!0;var e=this.media,t=void 0;e?(t=e.paused,e.pause()):t=!0,this.previouslyPaused=t}var r=this.fragCurrent;r&&r.loader&&r.loader.abort(),this.fragCurrent=null,this.fragLoadIdx+=2*this.config.fragLoadingLoopThreshold,this.flushMainBuffer(0,Number.POSITIVE_INFINITY)}},{key:"immediateLevelSwitchEnd",value:function(){var e=this.media;e&&e.buffered.length&&(this.immediateSwitch=!1,f.default.isBuffered(e,e.currentTime)&&(e.currentTime-=1e-4),this.previouslyPaused||e.play())}},{key:"nextLevelSwitch",value:function(){var e=this.media;if(e&&e.readyState){var t=void 0,r=void 0,i=void 0;if(this.fragLoadIdx+=2*this.config.fragLoadingLoopThreshold,r=this.getBufferRange(e.currentTime),r&&r.start>1&&this.flushMainBuffer(0,r.start-1),e.paused)t=0;else{var a=this.hls.nextLoadLevel,n=this.levels[a],s=this.fragLastKbps;t=s&&this.fragCurrent?this.fragCurrent.duration*n.bitrate/(1e3*s)+1:0}if(i=this.getBufferRange(e.currentTime+t), +i&&(i=this.followingBufferRange(i))){var o=this.fragCurrent;o&&o.loader&&o.loader.abort(),this.fragCurrent=null,this.flushMainBuffer(i.start,Number.POSITIVE_INFINITY)}}}},{key:"flushMainBuffer",value:function(e,t){this.state=T.BUFFER_FLUSHING;var r={startOffset:e,endOffset:t};this.altAudio&&(r.type="video"),this.hls.trigger(v.default.BUFFER_FLUSHING,r)}},{key:"onMediaAttached",value:function(e){var t=this.media=this.mediaBuffer=e.media;this.onvseeking=this.onMediaSeeking.bind(this),this.onvseeked=this.onMediaSeeked.bind(this),this.onvended=this.onMediaEnded.bind(this),t.addEventListener("seeking",this.onvseeking),t.addEventListener("seeked",this.onvseeked),t.addEventListener("ended",this.onvended);var r=this.config;this.levels&&r.autoStartLoad&&this.hls.startLoad(r.startPosition)}},{key:"onMediaDetaching",value:function(){var e=this.media;e&&e.ended&&(k.logger.log("MSE detaching and video ended, reset startPosition"),this.startPosition=this.lastCurrentTime=0);var t=this.levels;t&&t.forEach(function(e){e.details&&e.details.fragments.forEach(function(e){e.loadCounter=void 0})}),e&&(e.removeEventListener("seeking",this.onvseeking),e.removeEventListener("seeked",this.onvseeked),e.removeEventListener("ended",this.onvended),this.onvseeking=this.onvseeked=this.onvended=null),this.media=this.mediaBuffer=null,this.loadedmetadata=!1,this.stopLoad()}},{key:"onMediaSeeking",value:function(){var e=this.media,t=e?e.currentTime:void 0,r=this.config;if(k.logger.log("media seeking to "+t.toFixed(3)),this.state===T.FRAG_LOADING){var i=f.default.bufferInfo(e,t,this.config.maxBufferHole),a=this.fragCurrent;if(0===i.len&&a){var n=r.maxFragLookUpTolerance,s=a.start-n,o=a.start+a.duration+n;to?(a.loader&&(k.logger.log("seeking outside of buffer while fragment load in progress, cancel fragment load"),a.loader.abort()),this.fragCurrent=null,this.fragPrevious=null,this.state=T.IDLE):k.logger.log("seeking outside of buffer but within currently loaded fragment range")}}else this.state===T.ENDED&&(this.state=T.IDLE);e&&(this.lastCurrentTime=t),this.state!==T.FRAG_LOADING&&void 0!==this.fragLoadIdx&&(this.fragLoadIdx+=2*r.fragLoadingLoopThreshold),this.loadedmetadata||(this.nextLoadPosition=this.startPosition=t),this.tick()}},{key:"onMediaSeeked",value:function(){k.logger.log("media seeked to "+this.media.currentTime.toFixed(3)),this.tick()}},{key:"onMediaEnded",value:function(){k.logger.log("media ended"),this.startPosition=this.lastCurrentTime=0}},{key:"onManifestLoading",value:function(){k.logger.log("trigger BUFFER_RESET"),this.hls.trigger(v.default.BUFFER_RESET),this.bufferRange=[],this.stalled=!1,this.startPosition=this.lastCurrentTime=0}},{key:"onManifestParsed",value:function(e){var t,r=!1,i=!1;e.levels.forEach(function(e){t=e.audioCodec,t&&(t.indexOf("mp4a.40.2")!==-1&&(r=!0),t.indexOf("mp4a.40.5")!==-1&&(i=!0))}),this.audioCodecSwitch=r&&i,this.audioCodecSwitch&&k.logger.log("both AAC/HE-AAC audio found in levels; declaring level codec as HE-AAC"),this.levels=e.levels,this.startLevelLoaded=!1,this.startFragRequested=!1;var a=this.config;a.autoStartLoad&&this.hls.startLoad(a.startPosition)}},{key:"onLevelLoaded",value:function(e){var t=e.details,r=e.level,i=this.levels[r],a=t.totalduration,n=0;if(k.logger.log("level "+r+" loaded ["+t.startSN+","+t.endSN+"],duration:"+a),this.levelLastLoaded=r,t.live){var s=i.details;s&&t.fragments.length>0?(E.default.mergeDetails(s,t),n=t.fragments[0].start,this.liveSyncPosition=this.computeLivePosition(n,s),t.PTSKnown?k.logger.log("live playlist sliding:"+n.toFixed(3)):k.logger.log("live playlist - outdated PTS, unknown sliding")):(t.PTSKnown=!1,k.logger.log("live playlist - first load, unknown sliding"))}else t.PTSKnown=!1;if(i.details=t,this.hls.trigger(v.default.LEVEL_UPDATED,{details:t,level:r}),this.startFragRequested===!1){if(this.startPosition===-1||this.lastCurrentTime===-1){var o=t.startTimeOffset;isNaN(o)?t.live?(this.startPosition=this.computeLivePosition(n,t),k.logger.log("configure startPosition to "+this.startPosition)):this.startPosition=0:(o<0&&(k.logger.log("negative start time offset "+o+", count from end of last fragment"),o=n+a+o),k.logger.log("start time offset found in playlist, adjust startPosition to "+o),this.startPosition=o),this.lastCurrentTime=this.startPosition}this.nextLoadPosition=this.startPosition}this.state===T.WAITING_LEVEL&&(this.state=T.IDLE),this.tick()}},{key:"onKeyLoaded",value:function(){this.state===T.KEY_LOADING&&(this.state=T.IDLE,this.tick())}},{key:"onFragLoaded",value:function(e){var t=this.fragCurrent,r=e.frag;if(this.state===T.FRAG_LOADING&&t&&"main"===r.type&&r.level===t.level&&r.sn===t.sn){var i=e.stats,a=this.levels[t.level],n=a.details;if(k.logger.log("Loaded "+t.sn+" of ["+n.startSN+" ,"+n.endSN+"],level "+t.level),this.bitrateTest=!1,r.bitrateTest===!0&&this.hls.nextLoadLevel)this.state=T.IDLE,this.startFragRequested=!1,i.tparsed=i.tbuffered=performance.now(),this.hls.trigger(v.default.FRAG_BUFFERED,{stats:i,frag:t,id:"main"}),this.tick();else{this.state=T.PARSING,this.stats=i;var s=n.totalduration,o=isNaN(t.startDTS)?t.start:t.startDTS,l=t.level,u=t.sn,d=this.config.defaultAudioCodec||a.audioCodec;this.audioCodecSwap&&(k.logger.log("swapping playlist audio codec"),void 0===d&&(d=this.lastAudioCodec),d&&(d=d.indexOf("mp4a.40.5")!==-1?"mp4a.40.2":"mp4a.40.5")),this.pendingBuffering=-1,this.appended=!1,k.logger.log("Parsing "+u+" of ["+n.startSN+" ,"+n.endSN+"],level "+l+", cc "+t.cc);var f=this.demuxer;f||(f=this.demuxer=new c.default(this.hls,"main"));var h=this.media,g=h&&h.seeking,p=!g&&(n.PTSKnown||!n.live);f.push(e.payload,d,a.videoCodec,o,t.cc,l,u,s,t.decryptdata,p,null)}}this.fragLoadError=0}},{key:"onFragParsingInitSegment",value:function(e){var t=this.fragCurrent;if(t&&"main"===e.id&&e.sn===t.sn&&e.level===t.level&&this.state===T.PARSING){var r,i,a=e.tracks;if(a.audio&&this.altAudio&&delete a.audio,i=a.audio){var n=this.levels[this.level].audioCodec,s=navigator.userAgent.toLowerCase();n&&this.audioCodecSwap&&(k.logger.log("swapping playlist audio codec"),n=n.indexOf("mp4a.40.5")!==-1?"mp4a.40.2":"mp4a.40.5"),this.audioCodecSwitch&&1!==i.metadata.channelCount&&s.indexOf("firefox")===-1&&(n="mp4a.40.5"),s.indexOf("android")!==-1&&"audio/mpeg"!==i.container&&(n="mp4a.40.2",k.logger.log("Android: force audio codec to "+n)),i.levelCodec=n,i.id=e.id}if(i=a.video,i&&(i.levelCodec=this.levels[this.level].videoCodec,i.id=e.id),e.unique){var o={codec:"",levelCodec:""};for(r in e.tracks)i=a[r],o.container=i.container,o.codec&&(o.codec+=",",o.levelCodec+=","),i.codec&&(o.codec+=i.codec),i.levelCodec&&(o.levelCodec+=i.levelCodec);a={audiovideo:o}}this.hls.trigger(v.default.BUFFER_CODECS,a);for(r in a){i=a[r],k.logger.log("main track:"+r+",container:"+i.container+",codecs[level/parsed]=["+i.levelCodec+"/"+i.codec+"]");var l=i.initSegment;l&&(this.appended=!0,this.hls.trigger(v.default.BUFFER_APPENDING,{type:r,data:l,parent:"main",content:"initSegment"}))}this.tick()}}},{key:"onFragParsingData",value:function(e){var t=this,r=this.fragCurrent;if(r&&"main"===e.id&&e.sn===r.sn&&e.level===r.level&&("audio"!==e.type||!this.altAudio)&&this.state===T.PARSING){var i=this.levels[this.level],a=this.fragCurrent;k.logger.log("Parsed "+e.type+",PTS:["+e.startPTS.toFixed(3)+","+e.endPTS.toFixed(3)+"],DTS:["+e.startDTS.toFixed(3)+"/"+e.endDTS.toFixed(3)+"],nb:"+e.nb+",dropped:"+(e.dropped||0));var n=E.default.updateFragPTSDTS(i.details,a.sn,e.startPTS,e.endPTS,e.startDTS,e.endDTS),s=this.hls;s.trigger(v.default.LEVEL_PTS_UPDATED,{details:i.details,level:this.level,drift:n,type:e.type,start:e.startPTS,end:e.endPTS}),"video"===e.type&&(a.dropped=e.dropped),[e.data1,e.data2].forEach(function(r){r&&(t.appended=!0,s.trigger(v.default.BUFFER_APPENDING,{type:e.type,data:r,parent:"main",content:"data"}))}),this.bufferRange.push({type:e.type,start:e.startPTS,end:e.endPTS,frag:a}),this.tick()}}},{key:"onFragParsed",value:function(e){var t=this.fragCurrent;t&&"main"===e.id&&e.sn===t.sn&&e.level===t.level&&this.state===T.PARSING&&(this.stats.tparsed=performance.now(),this.state=T.PARSED,this._checkAppendedParsed())}},{key:"onAudioTrackSwitching",value:function(e){var t=!!e.url,r=e.id;if(!t){if(this.mediaBuffer!==this.media){k.logger.log("switching on main audio, use media.buffered to schedule main fragment loading"),this.mediaBuffer=this.media;var i=this.fragCurrent;i.loader&&(k.logger.log("switching to main audio track, cancel main fragment load"),i.loader.abort()),this.fragCurrent=null,this.fragPrevious=null,this.demuxer&&(this.demuxer.destroy(),this.demuxer=null),this.state=T.IDLE}var a=this.hls;a.trigger(v.default.BUFFER_FLUSHING,{startOffset:0,endOffset:Number.POSITIVE_INFINITY,type:"audio"}),a.trigger(v.default.AUDIO_TRACK_SWITCHED,{id:r}),this.altAudio=!1}}},{key:"onAudioTrackSwitched",value:function(e){var t=e.id,r=!!this.hls.audioTracks[t].url;if(r){var i=this.videoBuffer;i&&this.mediaBuffer!==i&&(k.logger.log("switching on alternate audio, use video.buffered to schedule main fragment loading"),this.mediaBuffer=i)}this.altAudio=r,this.tick()}},{key:"onBufferCreated",value:function(e){var t=e.tracks,r=void 0,i=void 0,a=!1;for(var n in t){var s=t[n];"main"===s.id?(i=n,r=s,"video"===n&&(this.videoBuffer=t[n].buffer)):a=!0}a&&r?(k.logger.log("alternate track found, use "+i+".buffered to schedule main fragment loading"),this.mediaBuffer=r.buffer):this.mediaBuffer=this.media}},{key:"onBufferAppended",value:function(e){if("main"===e.parent){var t=this.state;t!==T.PARSING&&t!==T.PARSED||(this.pendingBuffering=e.pending,this._checkAppendedParsed())}}},{key:"_checkAppendedParsed",value:function(){if(this.state===T.PARSED&&(!this.appended||0===this.pendingBuffering)){var e=this.fragCurrent,t=this.stats;if(e){this.fragPrevious=e,t.tbuffered=performance.now(),this.fragLastKbps=Math.round(8*t.total/(t.tbuffered-t.tfirst)),this.hls.trigger(v.default.FRAG_BUFFERED,{stats:t,frag:e,id:"main"});var r=this.mediaBuffer?this.mediaBuffer:this.media;k.logger.log("main buffered : "+_.default.toString(r.buffered)),this.state=T.IDLE}this.tick()}}},{key:"onError",value:function(e){var t=e.frag||this.fragCurrent;if(!t||"main"===t.type){var r=this.media,i=r&&f.default.isBuffered(r,r.currentTime)&&f.default.isBuffered(r,r.currentTime+.5);switch(e.details){case R.ErrorDetails.FRAG_LOAD_ERROR:case R.ErrorDetails.FRAG_LOAD_TIMEOUT:case R.ErrorDetails.KEY_LOAD_ERROR:case R.ErrorDetails.KEY_LOAD_TIMEOUT:if(!e.fatal){var a=this.fragLoadError;a?a++:a=1;var n=this.config;if(a<=n.fragLoadingMaxRetry||i||t.autoLevel&&t.level){this.fragLoadError=a,t.loadCounter=0;var s=Math.min(Math.pow(2,a-1)*n.fragLoadingRetryDelay,n.fragLoadingMaxRetryTimeout);k.logger.warn("mediaController: frag loading failed, retry in "+s+" ms"),this.retryDate=performance.now()+s,this.state=T.FRAG_LOADING_WAITING_RETRY}else k.logger.error("mediaController: "+e.details+" reaches max retry, redispatch as fatal ..."),e.fatal=!0,this.hls.trigger(v.default.ERROR,e),this.state=T.ERROR}break;case R.ErrorDetails.FRAG_LOOP_LOADING_ERROR:e.fatal||(i?(this._reduceMaxBufferLength(t.duration),this.state=T.IDLE):t.autoLevel&&0!==t.level||(e.fatal=!0,this.hls.trigger(v.default.ERROR,e),this.state=T.ERROR));break;case R.ErrorDetails.LEVEL_LOAD_ERROR:case R.ErrorDetails.LEVEL_LOAD_TIMEOUT:this.state!==T.ERROR&&(e.fatal?(this.state=T.ERROR,k.logger.warn("streamController: "+e.details+",switch to "+this.state+" state ...")):this.state===T.WAITING_LEVEL&&(this.state=T.IDLE));break;case R.ErrorDetails.BUFFER_FULL_ERROR:this.state!==T.PARSING&&this.state!==T.PARSED||(i?(this._reduceMaxBufferLength(t.duration),this.state=T.IDLE):(k.logger.warn("buffer full error also media.currentTime is not buffered, flush everything"),this.fragCurrent=null,this.flushMainBuffer(0,Number.POSITIVE_INFINITY)))}}}},{key:"_reduceMaxBufferLength",value:function(e){var t=this.config;t.maxMaxBufferLength>=e&&(t.maxMaxBufferLength/=2,k.logger.warn("reduce max buffer length to "+t.maxMaxBufferLength+"s and switch to IDLE state"),this.fragLoadIdx+=2*t.fragLoadingLoopThreshold)}},{key:"_checkBuffer",value:function(){var e=this.media;if(e&&e.readyState){var t=e.currentTime,r=e.buffered;if(this.loadedmetadata||!r.length||e.seeking)if(this.immediateSwitch)this.immediateLevelSwitchEnd();else{var i=f.default.bufferInfo(e,t,0),a=!(e.paused||e.ended||0===e.buffered.length),n=.5,s=t>e.playbackRate*this.lastCurrentTime,o=this.config;if(this.stalled&&s&&(this.stalled=!1,k.logger.log("playback not stuck anymore @"+t)),a&&i.len<=n&&(s?(n=0,this.seekHoleNudgeDuration=0):this.stalled?this.seekHoleNudgeDuration+=o.seekHoleNudgeDuration:(this.seekHoleNudgeDuration=0,k.logger.log("playback seems stuck @"+t),this.hls.trigger(v.default.ERROR,{type:R.ErrorTypes.MEDIA_ERROR,details:R.ErrorDetails.BUFFER_STALLED_ERROR,fatal:!1}),this.stalled=!0),i.len<=n)){var l=i.nextStart,u=l-t;if(l&&u0){k.logger.log("adjust currentTime from "+e.currentTime+" to next buffered @ "+l+" + nudge "+this.seekHoleNudgeDuration);var d=l+this.seekHoleNudgeDuration-e.currentTime;e.currentTime=l+this.seekHoleNudgeDuration,this.hls.trigger(v.default.ERROR,{type:R.ErrorTypes.MEDIA_ERROR,details:R.ErrorDetails.BUFFER_SEEK_OVER_HOLE,fatal:!1,hole:d})}}}else{this.loadedmetadata=!0;var h=this.startPosition,c=f.default.isBuffered(e,h);t===h&&c||(k.logger.log("target start position:"+h),c||(h=r.start(0),k.logger.log("target start position not buffered, seek to buffered.start(0) "+h)),k.logger.log("adjust currentTime from "+t+" to "+h),e.currentTime=h)}}}},{key:"onFragLoadEmergencyAborted",value:function(){this.state=T.IDLE,this.loadedmetadata||(this.startFragRequested=!1),this.tick()}},{key:"onBufferFlushed",value:function(){var e=this.mediaBuffer?this.mediaBuffer:this.media,t=this.bufferRange,r=[],i=void 0,a=void 0;for(a=0;a0;)e.removeCue(e.cues[0])}},{key:"getExistingTrack",value:function(e){var t=this.media;if(t)for(var r=0;r>>8^255&g^99,e[f]=g,t[g]=f;var v=d[f],p=d[v],y=d[p],m=257*d[g]^16843008*g;r[f]=m<<24|m>>>8,i[f]=m<<16|m>>>16,a[f]=m<<8|m>>>24,n[f]=m,m=16843009*y^65537*p^257*v^16843008*f,s[g]=m<<24|m>>>8,o[g]=m<<16|m>>>16,l[g]=m<<8|m>>>24,u[g]=m,f?(f=v^d[d[d[y^v]]],h^=d[d[h]]):f=h=1}}},{key:"expandKey",value:function(e){for(var t=this.uint8ArrayToUint32Array_(e),r=!0,i=0;i>8|e>>>24}},{key:"decrypt",value:function(e,t,r){for(var i,a,n=this.keySize+6,s=this.invKeySchedule,o=this.invSBox,l=this.invSubMix[0],u=this.invSubMix[1],d=this.invSubMix[2],f=this.invSubMix[3],h=this.uint8ArrayToUint32Array_(r),c=h[0],g=h[1],v=h[2],p=h[3],y=new Int32Array(e),m=new Int32Array(y.length),E=void 0,b=void 0,_=void 0,R=void 0,k=void 0,T=void 0,A=void 0,S=void 0,L=void 0,D=void 0,w=void 0,O=void 0;t>>24]^u[T>>16&255]^d[A>>8&255]^f[255&S]^s[i],b=l[T>>>24]^u[A>>16&255]^d[S>>8&255]^f[255&k]^s[i+1],_=l[A>>>24]^u[S>>16&255]^d[k>>8&255]^f[255&T]^s[i+2],R=l[S>>>24]^u[k>>16&255]^d[T>>8&255]^f[255&A]^s[i+3],k=E,T=b,A=_,S=R,i+=4;E=o[k>>>24]<<24^o[T>>16&255]<<16^o[A>>8&255]<<8^o[255&S]^s[i],b=o[T>>>24]<<24^o[A>>16&255]<<16^o[S>>8&255]<<8^o[255&k]^s[i+1],_=o[A>>>24]<<24^o[S>>16&255]<<16^o[k>>8&255]<<8^o[255&T]^s[i+2],R=o[S>>>24]<<24^o[k>>16&255]<<16^o[T>>8&255]<<8^o[255&A]^s[i+3],i+=3,m[t]=this.networkToHostOrderSwap(E^c),m[t+1]=this.networkToHostOrderSwap(R^g),m[t+2]=this.networkToHostOrderSwap(_^v),m[t+3]=this.networkToHostOrderSwap(b^p),c=L,g=D,v=w,p=O,t+=4}return m.buffer}},{key:"destroy",value:function(){this.key=void 0,this.keySize=void 0,this.ksRows=void 0,this.sBox=void 0,this.invSBox=void 0,this.subMix=void 0,this.invSubMix=void 0,this.keySchedule=void 0,this.invKeySchedule=void 0,this.rcon=void 0}}]),e}();r.default=n},{}],16:[function(e,t,r){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(r,"__esModule",{value:!0});var n=function(){function e(e,t){for(var r=0;r>>5,v-=E,v>0&&m+E+v<=_);)for(b=T+y*p,R={unit:e.subarray(m+E,m+E+v),pts:b,dts:b},c.samples.push(R),c.len+=v,m+=v+E,y++;m<_-1&&(255!==e[m]||240!==(240&e[m+1]));m++);this.remuxer.remux(n,s,a,this._aacTrack,{samples:[]},{samples:[{pts:T,dts:T,unit:k.payload}]},{samples:[]},i,A,f,h)}},{key:"destroy",value:function(){}}],[{key:"probe",value:function(e){var t,r,i=new d.default(e);if(i.hasTimeStamp)for(t=i.length,r=e.length;t>>6)+1,o=(60&t[r+2])>>>2,o>h.length-1?void e.trigger(Event.ERROR,{type:s.ErrorTypes.MEDIA_ERROR,details:s.ErrorDetails.FRAG_PARSING_ERROR,fatal:!0,reason:"invalid ADTS sampling index:"+o}):(u=(1&t[r+2])<<2,u|=(192&t[r+3])>>>6,n.logger.log("manifest codec:"+i+",ADTS data:type:"+a+",sampleingIndex:"+o+"["+h[o]+"Hz],channelConfig:"+u),/firefox|OPR/i.test(f)?o>=6?(a=5,d=new Array(4),l=o-3):(a=2,d=new Array(2),l=o):f.indexOf("android")!==-1?(a=2,d=new Array(2),l=o):(a=5,d=new Array(4),i&&(i.indexOf("mp4a.40.29")!==-1||i.indexOf("mp4a.40.5")!==-1)||!i&&o>=6?l=o-3:((i&&i.indexOf("mp4a.40.2")!==-1&&o>=6&&1===u||!i&&1===u)&&(a=2,d=new Array(2)),l=o)),d[0]=a<<3,d[0]|=(14&o)>>1,d[1]|=(1&o)<<7,d[1]|=u<<3,5===a&&(d[1]|=(14&l)>>1,d[2]=(1&l)<<7,d[2]|=8,d[3]=0),{config:d,samplerate:h[o],channelCount:u,codec:"mp4a.40."+a})}}]),e}();r.default=o},{26:26,45:45}],20:[function(e,t,r){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(r,"__esModule",{value:!0});var n=function(){function e(e,t){for(var r=0;r3&&void 0!==arguments[3]?arguments[3]:null;a(this,e),this.hls=t,this.id=r,this.config=this.hls.config||n,this.typeSupported=i}return n(e,[{key:"destroy",value:function(){var e=this.demuxer;e&&e.destroy()}},{key:"push",value:function(e,t,r,i,a,n,s,u,f,c){var v=this.demuxer;if(!v||a!==this.cc&&!v.probe(e)){var y=this.hls,m=this.id,E=this.config,b=this.typeSupported;if(h.default.probe(e))v=this.typeSupported.mp2t===!0?new h.default(y,m,p.default,E,b):new h.default(y,m,g.default,E,b),v.probe=h.default.probe;else{if(!d.default.probe(e))return void y.trigger(o.default.ERROR,{type:l.ErrorTypes.MEDIA_ERROR,id:m,details:l.ErrorDetails.FRAG_PARSING_ERROR,fatal:!0,reason:"no demux matching with content found"});v=new d.default(y,m,g.default,E,b),v.probe=d.default.probe}this.demuxer=v}v.push(e,t,r,i,a,n,s,u,f,c),this.cc=a}}]),e}();r.default=y},{18:18,25:25,26:26,28:28,38:38,39:39}],21:[function(e,t,r){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(r,"__esModule",{value:!0});var a=e(20),n=i(a),s=e(28),o=i(s),l=e(45),u=e(1),d=i(u),f=function(e){var t=new d.default;t.trigger=function(e){for(var r=arguments.length,i=Array(r>1?r-1:0),a=1;a1?r-1:0),a=1;a0&&null!=u&&null!=u.key&&"AES-128"===u.method){null==this.decrypter&&(this.decrypter=new g.default(this.hls));var h=this,c=performance.now();this.decrypter.decrypt(e,u.key.buffer,u.iv.buffer,function(e){h.hls.trigger(o.default.FRAG_DECRYPTED,{level:n,sn:s,stats:{tstart:c,tdecrypt:performance.now()}}),h.pushDecrypted(e,t,r,i,a,n,s,l,d,f)})}else this.pushDecrypted(e,t,r,i,a,n,s,l,d,f)}},{key:"onWorkerMessage",value:function(e){var t=e.data,r=this.hls;switch(t.event){case"init":URL.revokeObjectURL(this.w.objectURL);break;case o.default.FRAG_PARSING_DATA:t.data.data1=new Uint8Array(t.data1),t.data.data2=new Uint8Array(t.data2);default:r.trigger(t.event,t.data)}}}]),t}();r.default=p},{16:16,20:20,21:21,26:26,28:28,3:3,45:45}],23:[function(e,t,r){"use strict";function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(r,"__esModule",{value:!0});var a=function(){function e(e,t){for(var r=0;re?(this.word<<=e,this.bitsAvailable-=e):(e-=this.bitsAvailable,t=e>>3,e-=t>>3,this.bytesAvailable-=t,this.loadWord(),this.word<<=e,this.bitsAvailable-=e)}},{key:"readBits",value:function(e){var t=Math.min(this.bitsAvailable,e),r=this.word>>>32-t;return e>32&&n.logger.error("Cannot read more than 32 bits at a time"),this.bitsAvailable-=t,this.bitsAvailable>0?this.word<<=t:this.bytesAvailable>0&&this.loadWord(),t=e-t,t>0&&this.bitsAvailable?r<>>e))return this.word<<=e,this.bitsAvailable-=e,e;return this.loadWord(),e+this.skipLZ()}},{key:"skipUEG",value:function(){this.skipBits(1+this.skipLZ())}},{key:"skipEG",value:function(){this.skipBits(1+this.skipLZ())}},{key:"readUEG",value:function(){var e=this.skipLZ();return this.readBits(e+1)-1}},{key:"readEG",value:function(){var e=this.readUEG();return 1&e?1+e>>>1:-1*(e>>>1)}},{key:"readBoolean",value:function(){return 1===this.readBits(1)}},{key:"readUByte",value:function(){return this.readBits(8)}},{key:"readUShort",value:function(){return this.readBits(16)}},{key:"readUInt",value:function(){return this.readBits(32)}},{key:"skipScalingList",value:function(e){var t,r,i=8,a=8;for(t=0;t>4,p>1){if(y=f+5+e[f+4],y===f+188)continue}else y=f+4;switch(v){case S:if(g){if(O&&(m=x(O))&&(N(m,!1),b&&k.codec&&(L===-1||T.codec)))return void this.remux(n,s,a,e,i);O={data:[],size:0}}O&&(O.data.push(e.subarray(y,f+188)),O.size+=f+188-y);break;case L:if(g){if(I&&(m=x(I))&&(T.isAAC?F(m):U(m),b&&T.codec&&(S===-1||k.codec)))return void this.remux(n,s,a,e,i);I={data:[],size:0}}I&&(I.data.push(e.subarray(y,f+188)),I.size+=f+188-y);break;case D:g&&(P&&(m=x(P))&&G(m),P={data:[],size:0}),P&&(P.data.push(e.subarray(y,f+188)),P.size+=f+188-y);break;case 0:g&&(y+=e[y]+1),w=this._pmtId=C(e,y);break;case w:g&&(y+=e[y]+1);var B=M(e,y,this.typeSupported.mpeg===!0||this.typeSupported.mp3===!0);S=B.avc,S>0&&(k.id=S),L=B.audio,L>0&&(T.id=L,T.isAAC=B.isAAC),D=B.id3,D>0&&(A.id=D),_&&!R&&(h.logger.log("reparse from beginning"),_=!1,f=-188),R=this.pmtParsed=!0;break;case 17:case 8191:break;default:_=!0}}else this.observer.trigger(u.default.ERROR,{type:c.ErrorTypes.MEDIA_ERROR,id:this.id,details:c.ErrorDetails.FRAG_PARSING_ERROR,fatal:!1,reason:"TS packet did not start with 0x47"});O&&(m=x(O))?(N(m,!0),k.pesData=null):k.pesData=O,I&&(m=x(I))?(T.isAAC?F(m):U(m),T.pesData=null):(I&&I.size&&h.logger.log("last AAC PES packet truncated,might overlap between fragments"),T.pesData=I),P&&(m=x(P))?(G(m),A.pesData=null):A.pesData=P,this.remux(n,s,a,null,i,d)}},{key:"remux",value:function(e,t,r,i,a,n){for(var s=this._avcTrack,o=s.samples,l=0,u=0,d=0;d1;){var c=new Uint8Array(f[0].length+f[1].length);c.set(f[0]),c.set(f[1],f[0].length),f[0]=c,f.splice(1,1)}if(t=f[0],i=(t[0]<<16)+(t[1]<<8)+t[2],1===i){if(a=(t[4]<<8)+t[5],a&&a>e.size-6)return null;r=t[7],192&r&&(o=536870912*(14&t[9])+4194304*(255&t[10])+16384*(254&t[11])+128*(255&t[12])+(254&t[13])/2,o>4294967295&&(o-=8589934592),64&r?(l=536870912*(14&t[14])+4194304*(255&t[15])+16384*(254&t[16])+128*(255&t[17])+(254&t[18])/2,l>4294967295&&(l-=8589934592),o-l>54e5&&(h.logger.warn(Math.round((o-l)/9e4)+"s delta between PTS and DTS, align them"),o=l)):l=o),n=t[8],u=n+9,e.size-=u,s=new Uint8Array(e.size);for(var g=0,v=f.length;gp){u-=p;continue}t=t.subarray(u),p-=u,u=0}s.set(t,d),d+=p}return a&&(a-=n+3),{data:s,pts:o,dts:l,len:a}}return null}},{key:"pushAccesUnit",value:function(e,t){e.units.units.length&&e.frame&&(!this.config.forceKeyFrameOnDiscontinuity||e.key===!0||t.sps&&(t.samples.length||this.contiguous)?t.samples.push(e):t.dropped++),e.debug.length&&h.logger.log(e.pts+"/"+e.dts+":"+e.debug+","+e.units.length)}},{key:"_parseAVCPES",value:function(e,t){var r,i,a,n=this,s=this._avcTrack,o=this._parseAVCNALu(e.data),l=!1,u=this.avcSample;e.data=null,o.forEach(function(t){switch(t.type){case 1:i=!0,l&&u&&(u.debug+="NDR "),u.frame=!0;var o=t.data;if(o.length>1){var d=new f.default(o).readSliceType();2!==d&&4!==d&&7!==d&&9!==d||(u.key=!0)}break;case 5:i=!0,u||(u=n.avcSample=n._createAVCSample(!0,e.pts,e.dts,"")),l&&(u.debug+="IDR "),u.key=!0,u.frame=!0;break;case 6:i=!0,l&&u&&(u.debug+="SEI "),r=new f.default(n.discardEPB(t.data)),r.readUByte();for(var h=0,c=0,g=!1,v=0;!g&&r.bytesAvailable>1;){h=0;do v=r.readUByte(),h+=v;while(255===v);c=0;do v=r.readUByte(),c+=v;while(255===v);if(4===h&&0!==r.bytesAvailable){g=!0;var p=r.readUByte();if(181===p){var y=r.readUShort();if(49===y){var m=r.readUInt();if(1195456820===m){var E=r.readUByte();if(3===E){var b=r.readUByte(),_=r.readUByte(),R=31&b,k=[b,_];for(a=0;a0){if(t.pts>=e[r-1].pts)e.push(t);else for(var i=r-1;i>=0;i--)if(t.pts=0)i={data:e.subarray(h,s-u-1),type:n},f.push(i);else{var c=this._getLastNalUnit();if(c&&(d&&s<=4-d&&c.state&&(c.data=c.data.subarray(0,c.data.byteLength-d)),r=s-u-1,r>0)){var g=new Uint8Array(c.data.byteLength+r);g.set(c.data,0),g.set(e.subarray(0,r),c.data.byteLength),c.data=g}}s=0&&u>=0&&(i={data:e.subarray(h,o),type:n,state:u},f.push(i)),0===f.length){var v=this._getLastNalUnit();if(v){var p=new Uint8Array(v.data.byteLength+e.byteLength);p.set(v.data,0),p.set(e,v.data.byteLength),v.data=p}}return l.naluState=u,f}},{key:"discardEPB",value:function(e){for(var t,r,i=e.byteLength,a=[],n=1;n1&&(h.logger.log("AAC: align PTS for overlapping frames by "+Math.round((k-p)/90)),p=k)}for(;n+5>>5,r-=s,r>0&&n+s+r<=d);)for(l=p+a*i,f={unit:v.subarray(n+s,n+s+r),pts:l,dts:l},g.samples.push(f),g.len+=r,n+=r+s,a++;n0;)s+=t}},{key:"_onMpegFrame",value:function(e,t,r,i,a,n){var s=1152/r*1e3,o=n+a*s,l=this._audioTrack;l.config=[],l.channelCount=i,l.audiosamplerate=r,l.duration=this._duration,l.samples.push({unit:e,pts:o,dts:o}),l.len+=e.length}},{key:"_onMpegNoise",value:function(e){h.logger.warn("mpeg audio has noise: "+e.length+" bytes")}},{key:"_parseMpeg",value:function(e,t,r,i,a){var n=[32,64,96,128,160,192,224,256,288,320,352,384,416,448,32,48,56,64,80,96,112,128,160,192,224,256,320,384,32,40,48,56,64,80,96,112,128,160,192,224,256,320,32,48,56,64,80,96,112,128,144,160,176,192,224,256,8,16,24,32,40,48,56,64,80,96,112,128,144,160],s=[44100,48e3,32e3,22050,24e3,16e3,11025,12e3,8e3];if(t+2>r)return-1;if(255===e[t]||224===(224&e[t+1])){if(t+24>r)return-1;var o=e[t+1]>>3&3,l=e[t+1]>>1&3,u=e[t+2]>>4&15,d=e[t+2]>>2&3,f=!!(2&e[t+2]);if(1!==o&&0!==u&&15!==u&&3!==d){var h=3===o?3-l:3===l?3:4,c=1e3*n[14*h+u-1],g=3===o?0:2===o?1:2,v=s[3*g+d],p=f?1:0,y=e[t+3]>>6===3?1:2,m=3===l?(3===o?12:6)*c/v+p<<2:(3===o?144:72)*c/v+p|0;return t+m>r?-1:(this._onMpegFrame&&this._onMpegFrame(e.subarray(t,t+m),c,v,y,i,a),m)}}for(var E=t+2;E=564&&71===e[0]&&71===e[188]&&71===e[376]}}]),e}();r.default=g},{19:19,23:23,26:26,28:28,45:45}],26:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});r.ErrorTypes={NETWORK_ERROR:"networkError",MEDIA_ERROR:"mediaError",MUX_ERROR:"muxError",OTHER_ERROR:"otherError"},r.ErrorDetails={MANIFEST_LOAD_ERROR:"manifestLoadError",MANIFEST_LOAD_TIMEOUT:"manifestLoadTimeOut",MANIFEST_PARSING_ERROR:"manifestParsingError",MANIFEST_INCOMPATIBLE_CODECS_ERROR:"manifestIncompatibleCodecsError",LEVEL_LOAD_ERROR:"levelLoadError",LEVEL_LOAD_TIMEOUT:"levelLoadTimeOut",LEVEL_SWITCH_ERROR:"levelSwitchError",AUDIO_TRACK_LOAD_ERROR:"audioTrackLoadError",AUDIO_TRACK_LOAD_TIMEOUT:"audioTrackLoadTimeOut",FRAG_LOAD_ERROR:"fragLoadError",FRAG_LOOP_LOADING_ERROR:"fragLoopLoadingError",FRAG_LOAD_TIMEOUT:"fragLoadTimeOut",FRAG_DECRYPT_ERROR:"fragDecryptError",FRAG_PARSING_ERROR:"fragParsingError",REMUX_ALLOC_ERROR:"remuxAllocError",KEY_LOAD_ERROR:"keyLoadError",KEY_LOAD_TIMEOUT:"keyLoadTimeOut",BUFFER_ADD_CODEC_ERROR:"bufferAddCodecError",BUFFER_APPEND_ERROR:"bufferAppendError",BUFFER_APPENDING_ERROR:"bufferAppendingError",BUFFER_STALLED_ERROR:"bufferStalledError",BUFFER_FULL_ERROR:"bufferFullError",BUFFER_SEEK_OVER_HOLE:"bufferSeekOverHole",INTERNAL_EXCEPTION:"internalException"}},{}],27:[function(e,t,r){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(r,"__esModule",{value:!0});var n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},s=function(){function e(e,t){for(var r=0;r1?r-1:0),n=1;n=r.start(i)&&t<=r.end(i))return!0;return!1}},{key:"bufferInfo",value:function(e,t,r){if(e){var i,a=e.buffered,n=[];for(i=0;id&&(l[u-1].end=e[o].end):l.push(e[o])}else l.push(e[o])}for(o=0,i=0,a=n=t;o=f&&t=0&&ot.endSN)return 0;if(o=r-t.startSN,l=t.fragments,u=l[o],!isNaN(u.startPTS)){var f=Math.abs(u.startPTS-i);isNaN(u.deltaPTS)?u.deltaPTS=f:u.deltaPTS=Math.max(f,u.deltaPTS),i=Math.min(i,u.startPTS),a=Math.max(a,u.endPTS),n=Math.min(n,u.startDTS),s=Math.max(s,u.endDTS)}var h=i-u.start;for(u.start=u.startPTS=i,u.endPTS=a,u.startDTS=n,u.endDTS=s,u.duration=a-i,d=o;d>0;d--)e.updatePTS(l,d,d-1);for(d=o;dt?a.start=i.start+i.duration:a.start=i.start-a.duration:r>t?(i.duration=s-i.start,i.duration<0&&n.logger.warn("negative duration computed for frag "+i.sn+",level "+i.level+", there should be some duration drift between playlist and fragment!")):(a.duration=i.start-s,a.duration<0&&n.logger.warn("negative duration computed for frag "+a.sn+",level "+a.level+", there should be some duration drift between playlist and fragment!"))}}]),e}();r.default=s},{45:45}],32:[function(e,t,r){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(r,"__esModule",{value:!0});var n=function(){function e(e,t){for(var r=0;r0&&void 0!==arguments[0]?arguments[0]:{};a(this,e);var r=e.DefaultConfig;if((t.liveSyncDurationCount||t.liveMaxLatencyDurationCount)&&(t.liveSyncDuration||t.liveMaxLatencyDuration))throw new Error("Illegal hls.js config: don't mix up liveSyncDurationCount/liveMaxLatencyDurationCount and liveSyncDuration/liveMaxLatencyDuration");for(var i in r)i in t||(t[i]=r[i]);if(void 0!==t.liveMaxLatencyDurationCount&&t.liveMaxLatencyDurationCount<=t.liveSyncDurationCount)throw new Error('Illegal hls.js config: "liveMaxLatencyDurationCount" must be gt "liveSyncDurationCount"'); +if(void 0!==t.liveMaxLatencyDuration&&(t.liveMaxLatencyDuration<=t.liveSyncDuration||void 0===t.liveSyncDuration))throw new Error('Illegal hls.js config: "liveMaxLatencyDuration" must be gt "liveSyncDuration"');(0,I.enableLogs)(t.debug),this.config=t;var n=this.observer=new x.default;n.trigger=function(e){for(var t=arguments.length,r=Array(t>1?t-1:0),i=1;i1?t-1:0),i=1;i0&&void 0!==arguments[0]?arguments[0]:-1;I.logger.log("startLoad("+e+")"),this.levelController.startLoad(),this.streamController.startLoad(e),this.audioStreamController.startLoad(e)}},{key:"stopLoad",value:function(){I.logger.log("stopLoad"),this.levelController.stopLoad(),this.streamController.stopLoad(),this.audioStreamController.stopLoad()}},{key:"swapAudioCodec",value:function(){I.logger.log("swapAudioCodec"),this.streamController.swapAudioCodec()}},{key:"recoverMediaError",value:function(){I.logger.log("recoverMediaError");var e=this.media;this.detachMedia(),this.attachMedia(e)}},{key:"levels",get:function(){return this.levelController.levels}},{key:"currentLevel",get:function(){return this.streamController.currentLevel},set:function(e){I.logger.log("set currentLevel:"+e),this.loadLevel=e,this.streamController.immediateLevelSwitch()}},{key:"nextLevel",get:function(){return this.streamController.nextLevel},set:function(e){I.logger.log("set nextLevel:"+e),this.levelController.manualLevel=e,this.streamController.nextLevelSwitch()}},{key:"loadLevel",get:function(){return this.levelController.level},set:function(e){I.logger.log("set loadLevel:"+e),this.levelController.manualLevel=e}},{key:"nextLoadLevel",get:function(){return this.levelController.nextLoadLevel},set:function(e){this.levelController.nextLoadLevel=e}},{key:"firstLevel",get:function(){return Math.max(this.levelController.firstLevel,this.abrController.minAutoLevel)},set:function(e){I.logger.log("set firstLevel:"+e),this.levelController.firstLevel=e}},{key:"startLevel",get:function(){return this.levelController.startLevel},set:function(e){I.logger.log("set startLevel:"+e),this.levelController.startLevel=e}},{key:"autoLevelCapping",get:function(){return this.abrController.autoLevelCapping},set:function(e){I.logger.log("set autoLevelCapping:"+e),this.abrController.autoLevelCapping=e}},{key:"autoLevelEnabled",get:function(){return this.levelController.manualLevel===-1}},{key:"manualLevel",get:function(){return this.levelController.manualLevel}},{key:"audioTracks",get:function(){return this.audioTrackController.audioTracks}},{key:"audioTrack",get:function(){return this.audioTrackController.audioTrack},set:function(e){this.audioTrackController.audioTrack=e}},{key:"liveSyncPosition",get:function(){return this.streamController.liveSyncPosition}}]),e}();r.default=B},{1:1,10:10,11:11,12:12,13:13,26:26,28:28,34:34,35:35,36:36,4:4,43:43,45:45,47:47,5:5,6:6,7:7,8:8}],33:[function(e,t,r){"use strict";t.exports=e(32).default},{32:32}],34:[function(e,t,r){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function n(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(r,"__esModule",{value:!0});var o=function(){function e(e,t){for(var r=0;r>8*(15-r)&255;return t}},{key:"fragmentDecryptdataFromLevelkey",value:function(e,t){var r=e;return e&&e.method&&e.uri&&!e.iv&&(r=Object.assign(new R,this.cloneObj(e)),r.iv=this.createInitializationVector(t)),r}},{key:"cloneObj",value:function(e){return JSON.parse(JSON.stringify(e))}},{key:"url",get:function(){return!this._url&&this.relurl&&(this._url=u.default.buildAbsoluteURL(this.baseurl,this.relurl)),this._url},set:function(e){this._url=e}},{key:"programDateTime",get:function(){return!this._programDateTime&&this.rawProgramDateTime&&(this._programDateTime=new Date(Date.parse(this.rawProgramDateTime))),this._programDateTime}},{key:"byteRange",get:function(){if(!this._byteRange&&(this._byteRange=[],this.rawByteRange)){var e=this.rawByteRange.split("@",2);1===e.length?this._byteRange[0]=this.prevFrag?this.prevFrag.byteRangeEndOffset:0:this._byteRange[0]=parseInt(e[1]),this._byteRange[1]=parseInt(e[0])+this._byteRange[0],this.prevFrag=null}return this._byteRange}},{key:"byteRangeStartOffset",get:function(){return this.byteRange[0]}},{key:"byteRangeEndOffset",get:function(){return this.byteRange[1]}},{key:"decryptdata",get:function(){return this._decryptdata||(this._decryptdata=this.fragmentDecryptdataFromLevelkey(this.levelkey,this.sn)),this._decryptdata}}]),e}(),T=function(e){function t(e){s(this,t);var r=a(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e,f.default.MANIFEST_LOADING,f.default.LEVEL_LOADING,f.default.AUDIO_TRACK_LOADING));return r.loaders={},r}return n(t,e),o(t,[{key:"destroy",value:function(){for(var e in this.loaders){var t=this.loaders[e];t&&t.destroy()}this.loaders={},c.default.prototype.destroy.call(this)}},{key:"onManifestLoading",value:function(e){this.load(e.url,{type:"manifest"})}},{key:"onLevelLoading",value:function(e){this.load(e.url,{type:"level",level:e.level,id:e.id})}},{key:"onAudioTrackLoading",value:function(e){this.load(e.url,{type:"audioTrack",id:e.id})}},{key:"load",value:function(e,t){var r=this.loaders[t.type];if(r){var i=r.context;if(i&&i.url===e)return void y.logger.trace("playlist request ongoing");y.logger.warn("abort previous loader for type:"+t.type),r.abort()}var a=this.hls.config,n=void 0,s=void 0,o=void 0,l=void 0;"manifest"===t.type?(n=a.manifestLoadingMaxRetry,s=a.manifestLoadingTimeOut,o=a.manifestLoadingRetryDelay,l=a.manifestLoadingMaxRetryTimeout):(n=a.levelLoadingMaxRetry,s=a.levelLoadingTimeOut,o=a.levelLoadingRetryDelay,l=a.levelLoadingMaxRetryTimeout,y.logger.log("loading playlist for "+t.type+" "+(t.level||t.id))),r=this.loaders[t.type]=t.loader="undefined"!=typeof a.pLoader?new a.pLoader(a):new a.loader(a),t.url=e,t.responseType="";var u=void 0,d=void 0;u={timeout:s,maxRetry:n,retryDelay:o,maxRetryDelay:l},d={onSuccess:this.loadsuccess.bind(this),onError:this.loaderror.bind(this),onTimeout:this.loadtimeout.bind(this)},r.load(t,u,d)}},{key:"resolve",value:function(e,t){return u.default.buildAbsoluteURL(t,e)}},{key:"parseMasterPlaylist",value:function(e,t){var r=[],i=void 0;for(m.lastIndex=0;null!=(i=m.exec(e));){var a={},n=a.attrs=new p.default(i[1]);a.url=this.resolve(i[2],t);var s=n.decimalResolution("RESOLUTION");s&&(a.width=s.width,a.height=s.height),a.bitrate=n.decimalInteger("AVERAGE-BANDWIDTH")||n.decimalInteger("BANDWIDTH"),a.name=n.NAME;var o=n.CODECS;if(o){o=o.split(/[ ,]+/);for(var l=0;l2?(t=r.shift()+".",t+=parseInt(r.shift()).toString(16),t+=("000"+parseInt(r.shift()).toString(16)).substr(-4)):t=e,t}},{key:"parseLevelPlaylist",value:function(e,t,r,i){var a,n,s=0,o=0,l={type:null,version:null,url:t,fragments:[],live:!0,startSN:0},u=new R,d=0,f=null,h=new k;for(h.tagList=[],b.lastIndex=0;null!==(a=b.exec(e));){var c=a[1];if(c){h.duration=parseFloat(c);var g=a[2];h.title=g?g:null,h.tagList.push(g?["INF",c,g]:["INF",c])}else if(a[3]){if(!isNaN(h.duration)){var v=s++;h.type=i,h.prevFrag=f,h.start=o,h.levelkey=u,h.sn=v,h.level=r,h.cc=d,h.baseurl=t,h.relurl=a[3],l.fragments.push(h),f=h,o+=h.duration,h=new k,h.tagList=[]}}else if(a[4])h.rawByteRange=a[4];else if(a[5])h.rawProgramDateTime=a[5],h.tagList.push(["PROGRAM-DATE-TIME",a[5]]);else{for(a=a[0].match(_),n=1;n0){var u="audioTrack"!==n,d=this.parseLevelPlaylist(i,a,(u?o:s)||0,u?"main":"audio");"manifest"===n&&l.trigger(f.default.MANIFEST_LOADED,{levels:[{url:a,details:d}],audioTracks:[],url:a,stats:t}),t.tparsed=performance.now(),d.targetduration?u?l.trigger(f.default.LEVEL_LOADED,{details:d,level:o||0,id:s||0,stats:t}):l.trigger(f.default.AUDIO_TRACK_LOADED,{details:d,id:s,stats:t}):l.trigger(f.default.ERROR,{type:g.ErrorTypes.NETWORK_ERROR,details:g.ErrorDetails.MANIFEST_PARSING_ERROR,fatal:!0,url:a,reason:"invalid targetduration"})}else{var h=this.parseMasterPlaylist(i,a);if(h.length){var c=this.parseMasterPlaylistMedia(i,a,"AUDIO");if(c.length){var v=!1;c.forEach(function(e){e.url||(v=!0)}),v===!1&&h[0].audioCodec&&!h[0].attrs.AUDIO&&(y.logger.log("audio codec signaled in quality level, but no embedded audio track signaled, create one"),c.unshift({type:"main",name:"main"}))}l.trigger(f.default.MANIFEST_LOADED,{levels:h,audioTracks:c,url:a,stats:t})}else l.trigger(f.default.ERROR,{type:g.ErrorTypes.NETWORK_ERROR,details:g.ErrorDetails.MANIFEST_PARSING_ERROR,fatal:!0,url:a,reason:"no level found in manifest"})}else l.trigger(f.default.ERROR,{type:g.ErrorTypes.NETWORK_ERROR,details:g.ErrorDetails.MANIFEST_PARSING_ERROR,fatal:!0,url:a,reason:"no EXTM3U delimiter"})}},{key:"loaderror",value:function(e,t){var r,i,a=t.loader;switch(t.type){case"manifest":r=g.ErrorDetails.MANIFEST_LOAD_ERROR,i=!0;break;case"level":r=g.ErrorDetails.LEVEL_LOAD_ERROR,i=!1;break;case"audioTrack":r=g.ErrorDetails.AUDIO_TRACK_LOAD_ERROR,i=!1}a&&(a.abort(),this.loaders[t.type]=void 0),this.hls.trigger(f.default.ERROR,{type:g.ErrorTypes.NETWORK_ERROR,details:r,fatal:i,url:a.url,loader:a,response:e,context:t})}},{key:"loadtimeout",value:function(e,t){var r,i,a=t.loader;switch(t.type){case"manifest":r=g.ErrorDetails.MANIFEST_LOAD_TIMEOUT,i=!0;break;case"level":r=g.ErrorDetails.LEVEL_LOAD_TIMEOUT,i=!1;break;case"audioTrack":r=g.ErrorDetails.AUDIO_TRACK_LOAD_TIMEOUT,i=!1}a&&(a.abort(),this.loaders[t.type]=void 0),this.hls.trigger(f.default.ERROR,{type:g.ErrorTypes.NETWORK_ERROR,details:r,fatal:i,url:a.url,loader:a,context:t})}}]),t}(c.default);r.default=T},{2:2,26:26,27:27,28:28,40:40,45:45}],37:[function(e,t,r){"use strict";function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(r,"__esModule",{value:!0});var a=function(){function e(e,t){for(var r=0;r>24&255,t[1]=i>>16&255,t[2]=i>>8&255,t[3]=255&i,t.set(e,4),a=0,i=8;a>24&255,t>>16&255,t>>8&255,255&t,r>>24,r>>16&255,r>>8&255,255&r,85,196,0,0]))}},{key:"mdia",value:function(t){return e.box(e.types.mdia,e.mdhd(t.timescale,t.duration),e.hdlr(t.type),e.minf(t))}},{key:"mfhd",value:function(t){return e.box(e.types.mfhd,new Uint8Array([0,0,0,0,t>>24,t>>16&255,t>>8&255,255&t]))}},{key:"minf",value:function(t){return"audio"===t.type?e.box(e.types.minf,e.box(e.types.smhd,e.SMHD),e.DINF,e.stbl(t)):e.box(e.types.minf,e.box(e.types.vmhd,e.VMHD),e.DINF,e.stbl(t))}},{key:"moof",value:function(t,r,i){return e.box(e.types.moof,e.mfhd(t),e.traf(i,r))}},{key:"moov",value:function(t){for(var r=t.length,i=[];r--;)i[r]=e.trak(t[r]);return e.box.apply(null,[e.types.moov,e.mvhd(t[0].timescale,t[0].duration)].concat(i).concat(e.mvex(t)))}},{key:"mvex",value:function(t){for(var r=t.length,i=[];r--;)i[r]=e.trex(t[r]);return e.box.apply(null,[e.types.mvex].concat(i))}},{key:"mvhd",value:function(t,r){r*=t;var i=new Uint8Array([0,0,0,0,0,0,0,1,0,0,0,2,t>>24&255,t>>16&255,t>>8&255,255&t,r>>24&255,r>>16&255,r>>8&255,255&r,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255]);return e.box(e.types.mvhd,i)}},{key:"sdtp",value:function(t){var r,i,a=t.samples||[],n=new Uint8Array(4+a.length);for(i=0;i>>8&255),n.push(255&a),n=n.concat(Array.prototype.slice.call(i));for(r=0;r>>8&255),s.push(255&a),s=s.concat(Array.prototype.slice.call(i));var o=e.box(e.types.avcC,new Uint8Array([1,n[3],n[4],n[5],255,224|t.sps.length].concat(n).concat([t.pps.length]).concat(s))),l=t.width,u=t.height;return e.box(e.types.avc1,new Uint8Array([0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,l>>8&255,255&l,u>>8&255,255&u,0,72,0,0,0,72,0,0,0,0,0,0,0,1,18,100,97,105,108,121,109,111,116,105,111,110,47,104,108,115,46,106,115,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24,17,17]),o,e.box(e.types.btrt,new Uint8Array([0,28,156,128,0,45,198,192,0,45,198,192])))}},{key:"esds",value:function(e){var t=e.config.length;return new Uint8Array([0,0,0,0,3,23+t,0,1,0,4,15+t,64,21,0,0,0,0,0,0,0,0,0,0,0,5].concat([t]).concat(e.config).concat([6,1,2]))}},{key:"mp4a",value:function(t){var r=t.audiosamplerate;return e.box(e.types.mp4a,new Uint8Array([0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,t.channelCount,0,16,0,0,0,0,r>>8&255,255&r,0,0]),e.box(e.types.esds,e.esds(t)))}},{key:"mp3",value:function(t){var r=t.audiosamplerate;return e.box(e.types[".mp3"],new Uint8Array([0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,t.channelCount,0,16,0,0,0,0,r>>8&255,255&r,0,0]))}},{key:"stsd",value:function(t){return"audio"===t.type?t.isAAC||"mp3"!==t.codec?e.box(e.types.stsd,e.STSD,e.mp4a(t)):e.box(e.types.stsd,e.STSD,e.mp3(t)):e.box(e.types.stsd,e.STSD,e.avc1(t))}},{key:"tkhd",value:function(t){var r=t.id,i=t.duration*t.timescale,a=t.width,n=t.height;return e.box(e.types.tkhd,new Uint8Array([0,0,0,7,0,0,0,0,0,0,0,0,r>>24&255,r>>16&255,r>>8&255,255&r,0,0,0,0,i>>24,i>>16&255,i>>8&255,255&i,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,0,0,0,a>>8&255,255&a,0,0,n>>8&255,255&n,0,0]))}},{key:"traf",value:function(t,r){var i=e.sdtp(t),a=t.id;return e.box(e.types.traf,e.box(e.types.tfhd,new Uint8Array([0,0,0,0,a>>24,a>>16&255,a>>8&255,255&a])),e.box(e.types.tfdt,new Uint8Array([0,0,0,0,r>>24,r>>16&255,r>>8&255,255&r])),e.trun(t,i.length+16+16+8+16+8+8),i)}},{key:"trak",value:function(t){return t.duration=t.duration||4294967295,e.box(e.types.trak,e.tkhd(t),e.mdia(t))}},{key:"trex",value:function(t){var r=t.id;return e.box(e.types.trex,new Uint8Array([0,0,0,0,r>>24,r>>16&255,r>>8&255,255&r,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,1]))}},{key:"trun",value:function(t,r){var i,a,n,s,o,l,u=t.samples||[],d=u.length,f=12+16*d,h=new Uint8Array(f);for(r+=8+f,h.set([0,0,15,1,d>>>24&255,d>>>16&255,d>>>8&255,255&d,r>>>24&255,r>>>16&255,r>>>8&255,255&r],0),i=0;i>>24&255,n>>>16&255,n>>>8&255,255&n,s>>>24&255,s>>>16&255,s>>>8&255,255&s,o.isLeading<<2|o.dependsOn,o.isDependedOn<<6|o.hasRedundancy<<4|o.paddingValue<<1|o.isNonSync,61440&o.degradPrio,15&o.degradPrio,l>>>24&255,l>>>16&255,l>>>8&255,255&l],12+16*i);return e.box(e.types.trun,h)}},{key:"initSegment",value:function(t){e.types||e.init();var r,i=e.moov(t);return r=new Uint8Array(e.FTYP.byteLength+i.byteLength),r.set(e.FTYP),r.set(i,e.FTYP.byteLength),r}}]),e}();r.default=n},{}],38:[function(e,t,r){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(r,"__esModule",{value:!0});var n=function(){function e(e,t){for(var r=0;rMath.pow(2,32)&&!function(){var t=function e(t,r){return r?e(r,t%r):t};e.timescale=e.audiosamplerate/t(e.audiosamplerate,e.isAAC?1024:1152)}(),d.logger.log("audio mp4 timescale :"+e.timescale),e.isAAC||(g.mpeg?(v="audio/mpeg",e.codec=""):g.mp3&&(e.codec="mp3")),p.audio={container:v,codec:e.codec,initSegment:!e.isAAC&&g.mpeg?new Uint8Array:h.default.initSegment([e]), +metadata:{channelCount:e.channelCount}},m&&(a=n=o[0].pts-f*r)),t.sps&&t.pps&&l.length&&(t.timescale=this.MP4_TIMESCALE,p.video={container:"video/mp4",codec:t.codec,initSegment:h.default.initSegment([t]),metadata:{width:t.width,height:t.height}},m&&(a=Math.min(a,l[0].pts-f*r),n=Math.min(n,l[0].dts-f*r),this.observer.trigger(u.default.INIT_PTS_FOUND,{id:this.id,initPTS:a,cc:i}))),Object.keys(p).length?(s.trigger(u.default.FRAG_PARSING_INIT_SEGMENT,y),this.ISGenerated=!0,m&&(this._initPTS=a,this._initDTS=n)):s.trigger(u.default.ERROR,{type:c.ErrorTypes.MEDIA_ERROR,id:this.id,details:c.ErrorDetails.FRAG_PARSING_ERROR,fatal:!1,reason:"no audio/video samples found"})}},{key:"remuxVideo",value:function(e,t,r,i){var a,n,s,o,l,f,g,v,p=8,y=this.PES_TIMESCALE,m=this.PES2MP4SCALEFACTOR,E=e.samples,b=[],_=E.length,R=this._PTSNormalize,k=this._initDTS;E.sort(function(e,t){return e.dts-t.dts});var T=E.reduce(function(e,t){return Math.max(Math.min(e,t.pts-t.dts),-18e3)},0);if(T<0){d.logger.warn("PTS < DTS detected in video samples, shifting DTS by "+Math.round(T/90)+" ms to overcome this issue");for(var A=0;A1?d.logger.log("AVC:"+D+" ms hole between fragments detected,filling it"):D<-1&&d.logger.log("AVC:"+-D+" ms overlapping between fragments detected"),l=S,E[0].dts=l+k,o=Math.max(o-D,S),E[0].pts=o+k,d.logger.log("Video/PTS/DTS adjusted: "+Math.round(o/90)+"/"+Math.round(l/90)+",delta:"+D+" ms")),f=l,L=E[E.length-1],v=Math.max(R(L.dts-k,S),0),g=Math.max(R(L.pts-k,S),0),g=Math.max(g,v);var w=navigator.vendor,O=navigator.userAgent,I=w&&w.indexOf("Apple")>-1&&O&&!O.match("CriOS");I&&(a=Math.round((v-l)/(m*(E.length-1))));for(var P=0;P<_;P++){var C=E[P];I?C.dts=l+P*m*a:(C.dts=Math.max(R(C.dts-k,S),l),C.dts=Math.round(C.dts/m)*m),C.pts=Math.max(R(C.pts-k,S),C.dts),C.pts=Math.round(C.pts/m)*m}var M=e.len+4*e.nbNalu+8;try{n=new Uint8Array(M)}catch(e){return void this.observer.trigger(u.default.ERROR,{type:c.ErrorTypes.MUX_ERROR,level:this.level,id:this.id,details:c.ErrorDetails.REMUX_ALLOC_ERROR,fatal:!1,bytes:M,reason:"fail allocating video mdat "+M})}var x=new DataView(n.buffer);x.setUint32(0,M),n.set(h.default.types.mdat,4);for(var N=0;N<_;N++){for(var F=E[N],U=F.units.units,G=0,B=void 0,j=0,H=U.length;j0?N-1:N].dts;if(Y.stretchShortVideoTrack){var X=Y.maxBufferHole,z=Y.maxSeekHole,$=Math.floor(Math.min(X,z)*y),J=(i?o+i*y:this.nextAudioPts)-F.pts;J>$?(a=J-q,a<0&&(a=q),d.logger.log("It is approximately "+J/90+" ms to the next segment; using duration "+a/90+" ms for the last video frame.")):a=q}else a=q}a/=m,B=Math.round((F.pts-F.dts)/m)}b.push({size:G,duration:a,cts:B,flags:{isLeading:0,isDependedOn:0,hasRedundancy:0,degradPrio:0,dependsOn:F.key?2:1,isNonSync:F.key?0:1}})}this.nextAvcDts=v+a*m;var Q=e.dropped;if(e.len=0,e.nbNalu=0,e.dropped=0,b.length&&navigator.userAgent.toLowerCase().indexOf("chrome")>-1){var Z=b[0].flags;Z.dependsOn=2,Z.isNonSync=0}e.samples=b,s=h.default.moof(e.sequenceNumber++,l/m,e),e.samples=[];var ee={id:this.id,level:this.level,sn:this.sn,data1:s,data2:n,startPTS:o/y,endPTS:(g+m*a)/y,startDTS:l/y,endDTS:this.nextAvcDts/y,type:"video",nb:b.length,dropped:Q};return this.observer.trigger(u.default.FRAG_PARSING_DATA,ee),ee}},{key:"remuxAudio",value:function(e,t,r,i){var a,n,s,l,f,g,v,p,y,m,E,b,_,R,k,T,A=this.PES_TIMESCALE,S=e.timescale,L=A/S,D=e.timescale*(e.isAAC?1024:1152)/e.audiosamplerate,w=D*L,O=this._PTSNormalize,I=this._initDTS,P=!e.isAAC&&this.typeSupported.mpeg,C=P?0:8,M=[],x=[];if(e.samples.sort(function(e,t){return e.pts-t.pts}),x=e.samples,T=this.nextAudioPts,r|=x.length&&T&&(Math.abs(t-T/A)<.1||Math.abs(x[0].pts-T-this._initDTS)<20*w),r||(T=t*A),i&&e.isAAC)for(var N=0,F=T;N=w){var j=Math.round(B/w);d.logger.warn("Injecting "+j+" audio frame @ "+Math.round(F/90)/1e3+"s due to "+Math.round(B/90)+" ms gap.");for(var H=0;H.1*w,F+=w,0===N?U.pts=U.dts=I+T:U.pts=U.dts=x[N-1].pts+w,N+=1}for(var K=0,W=x.length;K0)Y=Math.round((b-T)/w),d.logger.log(V+" ms hole between AAC samples detected,filling it"),Y>0&&(R=o.default.getSilentFrame(e.channelCount),R||(R=l.subarray()),e.len+=Y*R.length);else if(V<-12){d.logger.log(-V+" ms overlapping between AAC samples detected, drop frame"),e.len-=l.byteLength;continue}b=_=T}if(v=Math.max(0,b),p=Math.max(0,_),!(e.len>0))return;var q=P?e.len:e.len+8;try{f=new Uint8Array(q)}catch(e){return void this.observer.trigger(u.default.ERROR,{type:c.ErrorTypes.MUX_ERROR,level:this.level,id:this.id,details:c.ErrorDetails.REMUX_ALLOC_ERROR,fatal:!1,bytes:q,reason:"fail allocating audio mdat "+q})}P||(a=new DataView(f.buffer),a.setUint32(0,q),f.set(h.default.types.mdat,4));for(var X=0;X=2&&($=M[J-2].duration,s.duration=$),J){this.nextAudioPts=b+L*$,e.len=0,e.samples=M,g=P?new Uint8Array:h.default.moof(e.sequenceNumber++,p/L,e),e.samples=[];var Q={id:this.id,level:this.level,sn:this.sn,data1:g,data2:f,startPTS:v/A,endPTS:this.nextAudioPts/A,startDTS:p/A,endDTS:(_+L*$)/A,type:"audio",nb:J};return this.observer.trigger(u.default.FRAG_PARSING_DATA,Q),Q}return null}},{key:"remuxEmptyAudio",value:function(e,t,r,i){var a=this.PES_TIMESCALE,n=e.timescale?e.timescale:e.audiosamplerate,s=a/n,l=this.nextAudioPts,u=(void 0!==l?l:i.startDTS*a)+this._initDTS,f=i.endDTS*a+this._initDTS,h=1024,c=s*h,g=Math.ceil((f-u)/c),v=o.default.getSilentFrame(e.channelCount);if(d.logger.warn("remux empty Audio"),!v)return void d.logger.trace("Unable to remuxEmptyAudio since we were unable to get a silent frame for given audio codec!");for(var p=[],y=0;y4294967296;)e+=r;return e}},{key:"passthrough",get:function(){return!1}}]),e}();r.default=g},{26:26,28:28,29:29,37:37,45:45}],39:[function(e,t,r){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(r,"__esModule",{value:!0});var n=function(){function e(e,t){for(var r=0;rNumber.MAX_SAFE_INTEGER?1/0:t}},{key:"hexadecimalInteger",value:function(e){if(this[e]){var t=(this[e]||"0x").slice(2);t=(1&t.length?"0":"")+t;for(var r=new Uint8Array(t.length/2),i=0;iNumber.MAX_SAFE_INTEGER?1/0:t}},{key:"decimalFloatingPoint",value:function(e){return parseFloat(this[e])}},{key:"enumeratedString",value:function(e){return this[e]}},{key:"decimalResolution",value:function(e){var t=n.exec(this[e]);if(null!==t)return{width:parseInt(t[1],10),height:parseInt(t[2],10)}}}],[{key:"parseAttrList",value:function(e){var t,r={};for(s.lastIndex=0;null!==(t=s.exec(e));){var i=t[2],a='"';0===i.indexOf(a)&&i.lastIndexOf(a)===i.length-1&&(i=i.slice(1,-1)),r[t[1]]=i}return r}}]),e}();r.default=o},{}],41:[function(e,t,r){"use strict";var i={search:function(e,t){for(var r=0,i=e.length-1,a=null,n=null;r<=i;){a=(r+i)/2|0,n=e[a];var s=t(n);if(s>0)r=a+1;else{if(!(s<0))return n;i=a-1}}return null}};t.exports=i},{}],42:[function(e,t,r){"use strict";function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(r,"__esModule",{value:!0});var a=function(){function e(e,t){for(var r=0;r=r}},v=function(e){for(var t=[],r=0;rl&&(g.log("ERROR","Too large cursor position "+this.pos),this.pos=l)}},{key:"moveCursor",value:function(e){var t=this.pos+e;if(e>1)for(var r=this.pos+1;r=144&&this.backSpace();var t=s(e);return this.pos>=l?void g.log("ERROR","Cannot insert "+e.toString(16)+" ("+t+") at position "+this.pos+". Skipping it!"):(this.chars[this.pos].setChar(t,this.currPenState),void this.moveCursor(1))}},{key:"clearFromPos",value:function(e){var t;for(t=e;t0&&(r=e?"["+t.join(" | ")+"]":t.join("\n")),r}},{key:"getTextAndFormat",value:function(){return this.rows}}]),e}(),b=function(){function e(t,r){i(this,e),this.chNr=t,this.outputFilter=r,this.mode=null,this.verbose=0,this.displayedMemory=new E,this.nonDisplayedMemory=new E,this.lastOutputScreen=new E,this.currRollUpRow=this.displayedMemory.rows[o-1],this.writeScreen=this.displayedMemory,this.mode=null,this.cueStartTime=null}return a(e,[{key:"reset",value:function(){this.mode=null,this.displayedMemory.reset(),this.nonDisplayedMemory.reset(),this.lastOutputScreen.reset(),this.currRollUpRow=this.displayedMemory.rows[o-1],this.writeScreen=this.displayedMemory,this.mode=null,this.cueStartTime=null,this.lastCueEndTime=null}},{key:"getHandler",value:function(){return this.outputFilter}},{key:"setHandler",value:function(e){this.outputFilter=e}},{key:"setPAC",value:function(e){this.writeScreen.setPAC(e,this.lastOutputScreen)}},{key:"setBkgData",value:function(e){this.writeScreen.setBkgData(e)}},{key:"setMode",value:function(e){e!==this.mode&&(this.mode=e,g.log("INFO","MODE="+e),"MODE_POP-ON"===this.mode?this.writeScreen=this.nonDisplayedMemory:(this.writeScreen=this.displayedMemory,this.writeScreen.reset(),this.lastOutputScreen.reset()),"MODE_ROLL-UP"!==this.mode&&(this.displayedMemory.nrRollUpRows=null,this.nonDisplayedMemory.nrRollUpRows=null),this.mode=e)}},{key:"insertChars",value:function(e){for(var t=0;t=46,t.italics)t.foreground="white";else{var r=Math.floor(e/2)-16,i=["white","green","blue","cyan","red","yellow","magenta"];t.foreground=i[r]}g.log("INFO","MIDROW: "+JSON.stringify(t)),this.writeScreen.setPen(t)}},{key:"outputDataUpdate",value:function(){var e=g.time;null!==e&&this.outputFilter&&(this.outputFilter.updateData&&this.outputFilter.updateData(e,this.displayedMemory),null!==this.cueStartTime||this.displayedMemory.isEmpty()?this.displayedMemory.equals(this.lastOutputScreen)||(this.outputFilter.newCue&&this.outputFilter.newCue(this.cueStartTime,e,this.lastOutputScreen),this.cueStartTime=this.displayedMemory.isEmpty()?null:e):this.cueStartTime=e,this.lastOutputScreen.copy(this.displayedMemory))}},{key:"cueSplitAtTime",value:function(e){this.outputFilter&&(this.displayedMemory.isEmpty()||(this.outputFilter.newCue&&this.outputFilter.newCue(this.cueStartTime,e,this.displayedMemory),this.cueStartTime=e))}}]),e}(),_=function(){function e(t,r,a){i(this,e),this.field=t||1,this.outputs=[r,a],this.channels=[new b(1,r),new b(2,a)],this.currChNr=-1,this.lastCmdA=null,this.lastCmdB=null,this.bufferedData=[],this.startTime=null,this.lastTime=null,this.dataCounters={padding:0,char:0,cmd:0,other:0}}return a(e,[{key:"getHandler",value:function(e){return this.channels[e].getHandler()}},{key:"setHandler",value:function(e,t){this.channels[e].setHandler(t)}},{key:"addData",value:function(e,t){var r,i,a,n=!1;this.lastTime=e,g.setTime(e);for(var s=0;s ("+v([i,a])+")"),r=this.parseCmd(i,a),r||(r=this.parseMidrow(i,a)),r||(r=this.parsePAC(i,a)),r||(r=this.parseBackgroundAttributes(i,a)),!r&&(n=this.parseChars(i,a)))if(this.currChNr&&this.currChNr>=0){var o=this.channels[this.currChNr-1];o.insertChars(n)}else g.log("WARNING","No channel found yet. TEXT-MODE?");r?this.dataCounters.cmd+=2:n?this.dataCounters.char+=2:(this.dataCounters.other+=2,g.log("WARNING","Couldn't parse cleaned data "+v([i,a])+" orig: "+v([t[s],t[s+1]])))}else this.dataCounters.padding+=2}},{key:"parseCmd",value:function(e,t){var r=null,i=(20===e||28===e)&&32<=t&&t<=47,a=(23===e||31===e)&&33<=t&&t<=35;if(!i&&!a)return!1;if(e===this.lastCmdA&&t===this.lastCmdB)return this.lastCmdA=null,this.lastCmdB=null,g.log("DEBUG","Repeated command ("+v([e,t])+") is dropped"),!0;r=20===e||23===e?1:2;var n=this.channels[r-1];return 20===e||28===e?32===t?n.ccRCL():33===t?n.ccBS():34===t?n.ccAOF():35===t?n.ccAON():36===t?n.ccDER():37===t?n.ccRU(2):38===t?n.ccRU(3):39===t?n.ccRU(4):40===t?n.ccFON():41===t?n.ccRDC():42===t?n.ccTR():43===t?n.ccRTD():44===t?n.ccEDM():45===t?n.ccCR():46===t?n.ccENM():47===t&&n.ccEOC():n.ccTO(t-32),this.lastCmdA=e,this.lastCmdB=t,this.currChNr=r,!0}},{key:"parseMidrow",value:function(e,t){var r=null;if((17===e||25===e)&&32<=t&&t<=47){if(r=17===e?1:2,r!==this.currChNr)return g.log("ERROR","Mismatch channel in midrow parsing"),!1;var i=this.channels[r-1];return i.ccMIDROW(t),g.log("DEBUG","MIDROW ("+v([e,t])+")"),!0}return!1}},{key:"parsePAC",value:function(e,t){var r=null,i=null,a=(17<=e&&e<=23||25<=e&&e<=31)&&64<=t&&t<=127,n=(16===e||24===e)&&64<=t&&t<=95;if(!a&&!n)return!1;if(e===this.lastCmdA&&t===this.lastCmdB)return this.lastCmdA=null,this.lastCmdB=null,!0;r=e<=23?1:2,i=64<=t&&t<=95?1===r?u[e]:f[e]:1===r?d[e]:h[e];var s=this.interpretPAC(i,t),o=this.channels[r-1];return o.setPAC(s),this.lastCmdA=e,this.lastCmdB=t,this.currChNr=r,!0}},{key:"interpretPAC",value:function(e,t){var r=t,i={color:null,italics:!1,indent:null,underline:!1,row:e};return r=t>95?t-96:t-64,i.underline=1===(1&r),r<=13?i.color=["white","green","blue","cyan","red","yellow","magenta","white"][Math.floor(r/2)]:r<=15?(i.italics=!0,i.color="white"):i.indent=4*Math.floor((r-16)/2),i}},{key:"parseChars",value:function(e,t){var r=null,i=null,a=null;if(e>=25?(r=2,a=e-8):(r=1,a=e),17<=a&&a<=19){var n=t;n=17===a?t+80:18===a?t+112:t+144,g.log("INFO","Special char '"+s(n)+"' in channel "+r),i=[n]}else 32<=e&&e<=127&&(i=0===t?[e]:[e,t]);if(i){var o=v(i);g.log("DEBUG","Char codes = "+o.join(",")),this.lastCmdA=null,this.lastCmdB=null}return i}},{key:"parseBackgroundAttributes",value:function(e,t){var r,i,a,n,s=(16===e||24===e)&&32<=t&&t<=47,o=(23===e||31===e)&&45<=t&&t<=47;return!(!s&&!o)&&(r={},16===e||24===e?(i=Math.floor((t-32)/2),r.background=c[i],t%2===1&&(r.background=r.background+"_semi")):45===t?r.background="transparent":(r.foreground="black",47===t&&(r.underline=!0)),a=e<24?1:2,n=this.channels[a-1],n.setBkgData(r),this.lastCmdA=null,this.lastCmdB=null,!0)}},{key:"reset",value:function(){for(var e=0;e=16?o--:o++,navigator.userAgent.match(/Firefox\//)?n.line=d+1:n.line=d>7?d-2:d+1,n.align="left",n.position=Math.max(0,Math.min(100,100*(o/32)+(navigator.userAgent.match(/Firefox\//)?50:0))),e.addCue(n)}}};t.exports=i},{}],44:[function(e,t,r){"use strict";function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(r,"__esModule",{value:!0});var a=function(){function e(e,t){for(var r=0;r "+t}function n(e){var t=self.console[e];return t?function(){for(var r=arguments.length,i=Array(r),n=0;n1?t-1:0),i=1;i=2&&(0===i.tfirst&&(i.tfirst=Math.max(performance.now(),i.trequest),this.requestTimeout=window.setTimeout(this.loadtimeout.bind(this),s.timeout-(i.tfirst-i.trequest))),4===r))){var o=t.status;if(o>=200&&o<300){i.tload=Math.max(i.tfirst,performance.now());var l=void 0,u=void 0;"arraybuffer"===a.responseType?(l=t.response,u=l.byteLength):(l=t.responseText,u=l.length),i.loaded=i.total=u;var d={url:t.responseURL,data:l};this.callbacks.onSuccess(d,i,a)}else i.retry>=s.maxRetry||o>=400&&o<499?(n.logger.error(o+" while loading "+a.url),this.callbacks.onError({code:o,text:t.statusText},a)):(n.logger.warn(o+" while loading "+a.url+", retrying in "+this.retryDelay+"..."),this.destroy(),this.retryTimeout=window.setTimeout(this.loadInternal.bind(this),this.retryDelay),this.retryDelay=Math.min(2*this.retryDelay,s.maxRetryDelay),i.retry++)}}},{key:"loadtimeout",value:function(){n.logger.warn("timeout while loading "+this.context.url),this.callbacks.onTimeout(this.stats,this.context)}},{key:"loadprogress",value:function(e){var t=this.stats;t.loaded=e.loaded,e.lengthComputable&&(t.total=e.total);var r=this.callbacks.onProgress;r&&r(t,this.context,null)}}]),e}();r.default=s},{45:45}]},{},[33])(33)}); diff --git a/MediaBrowser.WebDashboard/dashboard-ui/bower_components/hlsjs/package.json b/MediaBrowser.WebDashboard/dashboard-ui/bower_components/hlsjs/package.json index 17d4cecf6c..c2238220cc 100644 --- a/MediaBrowser.WebDashboard/dashboard-ui/bower_components/hlsjs/package.json +++ b/MediaBrowser.WebDashboard/dashboard-ui/bower_components/hlsjs/package.json @@ -1,6 +1,6 @@ { "name": "hls.js", - "version": "0.6.14", + "version": "0.6.15", "license": "Apache-2.0", "description": "Media Source Extension - HLS library, by/for Dailymotion", "homepage": "https://github.com/dailymotion/hls.js", @@ -44,7 +44,7 @@ "browserify-derequire": "^0.9.4", "browserify-versionify": "^1.0.6", "bundle-collapser": "^1.2.1", - "chromedriver": "^2.24.1", + "chromedriver": "^2.26.1", "deep-strict-equal": "^0.2.0", "exorcist": "^0.4.0", "http-server": "^0.9.0", @@ -57,7 +57,7 @@ "rimraf": "^2.5.1", "uglify-js": "^2.7.5", "url-toolkit": "^1.0.4", - "selenium-webdriver": "^3.0.0", + "selenium-webdriver": "^2.52.0", "watchify": "^3.7.0", "webworkify": "^1.4.0" } diff --git a/MediaBrowser.WebDashboard/dashboard-ui/dashboard/wizardcomponents.js b/MediaBrowser.WebDashboard/dashboard-ui/dashboard/wizardcomponents.js index 47a2b08d72..fe69bdae58 100644 --- a/MediaBrowser.WebDashboard/dashboard-ui/dashboard/wizardcomponents.js +++ b/MediaBrowser.WebDashboard/dashboard-ui/dashboard/wizardcomponents.js @@ -15,8 +15,10 @@ if (operatingSystem == 'windows') { view.querySelector('.fldSelectEncoderPathType').classList.add('hide'); + view.querySelector('.markExec').classList.add('hide'); } else { view.querySelector('.fldSelectEncoderPathType').classList.remove('hide'); + view.querySelector('.markExec').classList.remove('hide'); } if (operatingSystem == 'windows' && systemInfo.SystemArchitecture != 'Arm') { diff --git a/MediaBrowser.WebDashboard/dashboard-ui/scripts/site.js b/MediaBrowser.WebDashboard/dashboard-ui/scripts/site.js index 93e6526d41..49a3d018d7 100644 --- a/MediaBrowser.WebDashboard/dashboard-ui/scripts/site.js +++ b/MediaBrowser.WebDashboard/dashboard-ui/scripts/site.js @@ -1665,7 +1665,7 @@ var AppInfo = {}; define("imageFetcher", [embyWebComponentsBowerPath + "/images/basicimagefetcher"], returnFirstDependency); } - var preferNativeAlerts = browser.tv || browser.xboxOne || browser.ps4; + var preferNativeAlerts = browser.tv; // use native alerts if preferred and supported (not supported in opera tv) if (preferNativeAlerts && window.alert) { define("alert", [embyWebComponentsBowerPath + "/alert/nativealert"], returnFirstDependency); @@ -1681,7 +1681,8 @@ var AppInfo = {}; define("confirm", [embyWebComponentsBowerPath + "/confirm/confirm"], returnFirstDependency); } - if (preferNativeAlerts && window.prompt) { + var preferNativePrompt = preferNativeAlerts || browser.xboxOne || browser.ps4; + if (preferNativePrompt && window.confirm) { define("prompt", [embyWebComponentsBowerPath + "/prompt/nativeprompt"], returnFirstDependency); } else { define("prompt", [embyWebComponentsBowerPath + "/prompt/prompt"], returnFirstDependency); diff --git a/MediaBrowser.WebDashboard/dashboard-ui/strings/en-US.json b/MediaBrowser.WebDashboard/dashboard-ui/strings/en-US.json index 5851a6c5c6..ebfc2e1b79 100644 --- a/MediaBrowser.WebDashboard/dashboard-ui/strings/en-US.json +++ b/MediaBrowser.WebDashboard/dashboard-ui/strings/en-US.json @@ -1894,6 +1894,7 @@ "DownloadFFmpeg": "Download FFmpeg", "FFmpegSuggestedDownload": "Suggested download: {0}", "UnzipFFmpegFile": "Unzip the downloaded file to a folder of your choice.", + "MarkFFmpegExec": "If you are running Linux or OSX, you will need to locate the ffmpeg and ffprobe files and mark them as executable. This is needed to grant Emby permission to execute them.", "OptionUseSystemInstalledVersion": "Use system installed version", "OptionUseMyCustomVersion": "Use a custom version", "FFmpegSavePathNotFound": "We're unable to locate FFmpeg using the path you've entered. FFprobe is also required and must exist in the same folder. These components are normally bundled together in the same download. Please check the path and try again.", diff --git a/MediaBrowser.WebDashboard/dashboard-ui/wizardcomponents.html b/MediaBrowser.WebDashboard/dashboard-ui/wizardcomponents.html index 8321ce8ecc..38a4dc95b0 100644 --- a/MediaBrowser.WebDashboard/dashboard-ui/wizardcomponents.html +++ b/MediaBrowser.WebDashboard/dashboard-ui/wizardcomponents.html @@ -23,8 +23,9 @@


2
-
${UnzipFFmpegFile}
+
${UnzipFFmpegFile}
+
${MarkFFmpegExec}

3
From 7464026183376f2e21985d13ba01f59f15f29a75 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Thu, 22 Dec 2016 18:53:57 -0500 Subject: [PATCH 17/62] update shortcut handling --- .../Library/Resolvers/Movies/MovieResolver.cs | 27 +++++-- .../Native/LnkShortcutHandler.cs | 69 +----------------- .../WindowsAppHost.cs | 24 ++++-- .../emby/Emby.Common.Implementations.dll | Bin 133120 -> 133120 bytes ThirdParty/emby/Emby.Server.Core.dll | Bin 95232 -> 95232 bytes 5 files changed, 38 insertions(+), 82 deletions(-) diff --git a/Emby.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs b/Emby.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs index 55a63b4e5d..b791311f9f 100644 --- a/Emby.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs +++ b/Emby.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs @@ -74,21 +74,21 @@ private MultiItemResolverResult ResolveMultipleInternal(Folder parent, if (string.Equals(collectionType, CollectionType.MusicVideos, StringComparison.OrdinalIgnoreCase)) { - return ResolveVideos(parent, files, directoryService, false); + return ResolveVideos(parent, files, directoryService, false, collectionType); } if (string.Equals(collectionType, CollectionType.HomeVideos, StringComparison.OrdinalIgnoreCase) || string.Equals(collectionType, CollectionType.Photos, StringComparison.OrdinalIgnoreCase)) { - return ResolveVideos
@@ -319,72 +320,6 @@ void GetIconLocation([Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszIco } - /// - /// Interface IPersist - /// - [ComImport, Guid("0000010c-0000-0000-c000-000000000046"), - InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] - public interface IPersist - { - /// - /// Gets the class ID. - /// - /// The p class ID. - [PreserveSig] - void GetClassID(out Guid pClassID); - } - - /// - /// Interface IPersistFile - /// - [ComImport, Guid("0000010b-0000-0000-C000-000000000046"), - InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] - public interface IPersistFile : IPersist - { - /// - /// Gets the class ID. - /// - /// The p class ID. - new void GetClassID(out Guid pClassID); - /// - /// Determines whether this instance is dirty. - /// - [PreserveSig] - int IsDirty(); - - /// - /// Loads the specified PSZ file name. - /// - /// Name of the PSZ file. - /// The dw mode. - [PreserveSig] - void Load([In, MarshalAs(UnmanagedType.LPWStr)] - string pszFileName, uint dwMode); - - /// - /// Saves the specified PSZ file name. - /// - /// Name of the PSZ file. - /// if set to true [remember]. - [PreserveSig] - void Save([In, MarshalAs(UnmanagedType.LPWStr)] string pszFileName, - [In, MarshalAs(UnmanagedType.Bool)] bool remember); - - /// - /// Saves the completed. - /// - /// Name of the PSZ file. - [PreserveSig] - void SaveCompleted([In, MarshalAs(UnmanagedType.LPWStr)] string pszFileName); - - /// - /// Gets the cur file. - /// - /// Name of the PPSZ file. - [PreserveSig] - void GetCurFile([In, MarshalAs(UnmanagedType.LPWStr)] string ppszFileName); - } - // CLSID_ShellLink from ShlGuid.h /// /// Class ShellLink diff --git a/MediaBrowser.ServerApplication/WindowsAppHost.cs b/MediaBrowser.ServerApplication/WindowsAppHost.cs index c2cdb9ab01..398d21f329 100644 --- a/MediaBrowser.ServerApplication/WindowsAppHost.cs +++ b/MediaBrowser.ServerApplication/WindowsAppHost.cs @@ -3,6 +3,7 @@ using System.Diagnostics; using System.IO; using System.Reflection; +using System.Runtime.InteropServices.ComTypes; using Emby.Server.Core; using Emby.Server.Implementations; using Emby.Server.Implementations.EntryPoints; @@ -93,21 +94,30 @@ protected override void AuthorizeServer() protected override void ConfigureAutoRunInternal(bool autorun) { - var shortcutPath = Path.Combine(System.Environment.GetFolderPath(System.Environment.SpecialFolder.StartMenu), "Emby", "Emby Server.lnk"); - var startupPath = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Startup); - if (autorun) + if (autorun && !MainStartup.IsRunningAsService) { //Copy our shortut into the startup folder for this user - var targetPath = Path.Combine(startupPath, Path.GetFileName(shortcutPath) ?? "Emby Server.lnk"); - FileSystemManager.CreateDirectory(Path.GetDirectoryName(targetPath)); - File.Copy(shortcutPath, targetPath, true); + var targetPath = Path.Combine(startupPath, "Emby Server.lnk"); + + IShellLinkW link = (IShellLinkW)new ShellLink(); + + var appPath = Process.GetCurrentProcess().MainModule.FileName; + + // setup shortcut information + link.SetDescription(Name); + link.SetPath(appPath); + link.SetWorkingDirectory(Path.GetDirectoryName(appPath)); + + // save it + IPersistFile file = (IPersistFile)link; + file.Save(targetPath, false); } else { //Remove our shortcut from the startup folder for this user - FileSystemManager.DeleteFile(Path.Combine(startupPath, Path.GetFileName(shortcutPath) ?? "Emby Server.lnk")); + FileSystemManager.DeleteFile(Path.Combine(startupPath, "Emby Server.lnk")); } } diff --git a/ThirdParty/emby/Emby.Common.Implementations.dll b/ThirdParty/emby/Emby.Common.Implementations.dll index 948a521490e25f6cb7eea047a1fcaf9d25e6441b..3f6cb17724c4f92ef59d51ce5334536a45d9237a 100644 GIT binary patch delta 58594 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
_})7-)r1U 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 delta 58306 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 L*ghqjF^2;H#)>(P delta 247 zcmZp8!P@YGbwUTTcU1JoZqK7S<`UnRF@V82eGtXWz{r3Qv$sbUn{+IJ#a!agvdJmO zEF{b&enK@$DIpa7ST=dfF^dp{q`N4xB#6zxu+A4mLTvg4HADzW><3h=fD57S=d#TX z#}8BsTv&Rlw=%B6d%@&euO1%xCc0g~nK42G2} From 19ae18a8cc98d34248d4212adc1c62e2ae009baf Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Thu, 22 Dec 2016 18:56:52 -0500 Subject: [PATCH 18/62] 3.1.261 --- SharedVersion.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SharedVersion.cs b/SharedVersion.cs index aa4bd7a342..c619609e61 100644 --- a/SharedVersion.cs +++ b/SharedVersion.cs @@ -1,4 +1,4 @@ using System.Reflection; //[assembly: AssemblyVersion("3.1.*")] -[assembly: AssemblyVersion("3.1.260")] +[assembly: AssemblyVersion("3.1.261")] From aff4bd1f8cff5b45c1353611ad34ed2b5a20c3b9 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Fri, 23 Dec 2016 03:50:32 -0500 Subject: [PATCH 19/62] update bitrate filter --- Emby.Server.Implementations/ScheduledTasks/ChapterImagesTask.cs | 2 +- MediaBrowser.Api/Playback/BaseStreamingService.cs | 2 +- MediaBrowser.MediaEncoding/Encoder/BaseEncoder.cs | 2 +- MediaBrowser.MediaEncoding/Encoder/MediaEncoder.cs | 2 ++ MediaBrowser.ServerApplication/WindowsAppHost.cs | 2 +- 5 files changed, 6 insertions(+), 4 deletions(-) diff --git a/Emby.Server.Implementations/ScheduledTasks/ChapterImagesTask.cs b/Emby.Server.Implementations/ScheduledTasks/ChapterImagesTask.cs index d758158479..5f37025e2a 100644 --- a/Emby.Server.Implementations/ScheduledTasks/ChapterImagesTask.cs +++ b/Emby.Server.Implementations/ScheduledTasks/ChapterImagesTask.cs @@ -62,7 +62,7 @@ public IEnumerable GetDefaultTriggers() new TaskTriggerInfo { Type = TaskTriggerInfo.TriggerDaily, - TimeOfDayTicks = TimeSpan.FromHours(1).Ticks, + TimeOfDayTicks = TimeSpan.FromHours(2).Ticks, MaxRuntimeMs = Convert.ToInt32(TimeSpan.FromHours(4).TotalMilliseconds) } }; diff --git a/MediaBrowser.Api/Playback/BaseStreamingService.cs b/MediaBrowser.Api/Playback/BaseStreamingService.cs index 6545d995c9..5e450567a7 100644 --- a/MediaBrowser.Api/Playback/BaseStreamingService.cs +++ b/MediaBrowser.Api/Playback/BaseStreamingService.cs @@ -1467,7 +1467,7 @@ protected string GetVideoBitrateParam(StreamState state, string videoCodec) } // h264 - return string.Format(" -b:v {0} -maxrate {0} -bufsize {1}", + return string.Format(" -maxrate {0} -bufsize {1}", bitrate.Value.ToString(UsCulture), (bitrate.Value * 2).ToString(UsCulture)); } diff --git a/MediaBrowser.MediaEncoding/Encoder/BaseEncoder.cs b/MediaBrowser.MediaEncoding/Encoder/BaseEncoder.cs index b8087fded2..d7789a5fd2 100644 --- a/MediaBrowser.MediaEncoding/Encoder/BaseEncoder.cs +++ b/MediaBrowser.MediaEncoding/Encoder/BaseEncoder.cs @@ -816,7 +816,7 @@ protected string GetVideoBitrateParam(EncodingJob state, string videoCodec) } // h264 - return string.Format(" -b:v {0} -maxrate {0} -bufsize {1}", + return string.Format(" -maxrate {0} -bufsize {1}", bitrate.Value.ToString(UsCulture), (bitrate.Value * 2).ToString(UsCulture)); } diff --git a/MediaBrowser.MediaEncoding/Encoder/MediaEncoder.cs b/MediaBrowser.MediaEncoding/Encoder/MediaEncoder.cs index 116a6a7cf5..89730a11fd 100644 --- a/MediaBrowser.MediaEncoding/Encoder/MediaEncoder.cs +++ b/MediaBrowser.MediaEncoding/Encoder/MediaEncoder.cs @@ -287,6 +287,8 @@ public async Task UpdateEncoderPath(string path, string pathType) return; } + _logger.Info("Attempting to update encoder path to {0}. pathType: {1}", path ?? string.Empty, pathType ?? string.Empty); + Tuple newPaths; if (string.Equals(pathType, "system", StringComparison.OrdinalIgnoreCase)) diff --git a/MediaBrowser.ServerApplication/WindowsAppHost.cs b/MediaBrowser.ServerApplication/WindowsAppHost.cs index 398d21f329..ec66923aaa 100644 --- a/MediaBrowser.ServerApplication/WindowsAppHost.cs +++ b/MediaBrowser.ServerApplication/WindowsAppHost.cs @@ -112,7 +112,7 @@ protected override void ConfigureAutoRunInternal(bool autorun) // save it IPersistFile file = (IPersistFile)link; - file.Save(targetPath, false); + file.Save(targetPath, true); } else { From 8f98d396c79880920a6958ff754660cfc342fd00 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Fri, 23 Dec 2016 03:54:30 -0500 Subject: [PATCH 20/62] remove dead code --- .../Channels/ChannelManager.cs | 83 +------------------ .../Channels/IChannelManager.cs | 10 +-- .../Entities/Audio/Audio.cs | 2 +- MediaBrowser.Controller/Entities/Video.cs | 2 +- 4 files changed, 6 insertions(+), 91 deletions(-) diff --git a/Emby.Server.Implementations/Channels/ChannelManager.cs b/Emby.Server.Implementations/Channels/ChannelManager.cs index 0df916ded3..f7dc930097 100644 --- a/Emby.Server.Implementations/Channels/ChannelManager.cs +++ b/Emby.Server.Implementations/Channels/ChannelManager.cs @@ -79,21 +79,6 @@ public void AddParts(IEnumerable channels) _channels = channels.ToArray(); } - public string ChannelDownloadPath - { - get - { - var options = _config.GetChannelsConfiguration(); - - if (!string.IsNullOrWhiteSpace(options.DownloadPath)) - { - return options.DownloadPath; - } - - return Path.Combine(_config.ApplicationPaths.ProgramDataPath, "channels"); - } - } - private IEnumerable GetAllChannels() { return _channels @@ -288,7 +273,7 @@ private void SaveMediaSources(BaseItem item, List mediaSources _jsonSerializer.SerializeToFile(mediaSources, path); } - public async Task> GetStaticMediaSources(BaseItem item, bool includeCachedVersions, CancellationToken cancellationToken) + public async Task> GetStaticMediaSources(BaseItem item, CancellationToken cancellationToken) { IEnumerable results = new List(); var video = item as Video; @@ -302,17 +287,9 @@ public async Task> GetStaticMediaSources(BaseItem i results = audio.ChannelMediaSources ?? GetSavedMediaSources(audio); } - var sources = SortMediaInfoResults(results) + return SortMediaInfoResults(results) .Select(i => GetMediaSource(item, i)) .ToList(); - - if (includeCachedVersions) - { - var cachedVersions = GetCachedChannelItemMediaSources(item); - sources.InsertRange(0, cachedVersions); - } - - return sources; } public async Task> GetDynamicMediaSources(BaseItem item, CancellationToken cancellationToken) @@ -334,14 +311,9 @@ public async Task> GetDynamicMediaSources(BaseItem results = new List(); } - var list = SortMediaInfoResults(results) + return SortMediaInfoResults(results) .Select(i => GetMediaSource(item, i)) .ToList(); - - var cachedVersions = GetCachedChannelItemMediaSources(item); - list.InsertRange(0, cachedVersions); - - return list; } private readonly ConcurrentDictionary>> _channelItemMediaInfo = @@ -369,55 +341,6 @@ private async Task> GetChannelItemMediaSourcesInte return list; } - private IEnumerable GetCachedChannelItemMediaSources(BaseItem item) - { - var filenamePrefix = item.Id.ToString("N"); - var parentPath = Path.Combine(ChannelDownloadPath, item.ChannelId); - - try - { - var files = _fileSystem.GetFiles(parentPath); - - if (string.Equals(item.MediaType, MediaType.Video, StringComparison.OrdinalIgnoreCase)) - { - files = files.Where(i => _libraryManager.IsVideoFile(i.FullName)); - } - else - { - files = files.Where(i => _libraryManager.IsAudioFile(i.FullName)); - } - - var file = files - .FirstOrDefault(i => i.Name.StartsWith(filenamePrefix, StringComparison.OrdinalIgnoreCase)); - - if (file != null) - { - var cachedItem = _libraryManager.ResolvePath(file); - - if (cachedItem != null) - { - var hasMediaSources = _libraryManager.GetItemById(cachedItem.Id) as IHasMediaSources; - - if (hasMediaSources != null) - { - var source = hasMediaSources.GetMediaSources(true).FirstOrDefault(); - - if (source != null) - { - return new[] { source }; - } - } - } - } - } - catch (IOException) - { - - } - - return new List(); - } - private MediaSourceInfo GetMediaSource(BaseItem item, ChannelMediaInfo info) { var source = info.ToMediaSource(); diff --git a/MediaBrowser.Controller/Channels/IChannelManager.cs b/MediaBrowser.Controller/Channels/IChannelManager.cs index 9177e2d813..7927446289 100644 --- a/MediaBrowser.Controller/Channels/IChannelManager.cs +++ b/MediaBrowser.Controller/Channels/IChannelManager.cs @@ -15,15 +15,8 @@ public interface IChannelManager /// Adds the parts. ///
/// The channels. - /// The factories. void AddParts(IEnumerable channels); - /// - /// Gets the channel download path. - /// - /// The channel download path. - string ChannelDownloadPath { get; } - /// /// Gets the channel features. /// @@ -115,10 +108,9 @@ public interface IChannelManager /// Gets the channel item media sources. ///
/// The item. - /// if set to true [include cached versions]. /// The cancellation token. /// Task{IEnumerable{MediaSourceInfo}}. - Task> GetStaticMediaSources(BaseItem item, bool includeCachedVersions, CancellationToken cancellationToken); + Task> GetStaticMediaSources(BaseItem item, CancellationToken cancellationToken); /// /// Gets the channel folder. diff --git a/MediaBrowser.Controller/Entities/Audio/Audio.cs b/MediaBrowser.Controller/Entities/Audio/Audio.cs index e4f638cb6f..3a6a7765b1 100644 --- a/MediaBrowser.Controller/Entities/Audio/Audio.cs +++ b/MediaBrowser.Controller/Entities/Audio/Audio.cs @@ -206,7 +206,7 @@ public virtual IEnumerable GetMediaSources(bool enablePathSubst { if (SourceType == SourceType.Channel) { - var sources = ChannelManager.GetStaticMediaSources(this, false, CancellationToken.None) + var sources = ChannelManager.GetStaticMediaSources(this, CancellationToken.None) .Result.ToList(); if (sources.Count > 0) diff --git a/MediaBrowser.Controller/Entities/Video.cs b/MediaBrowser.Controller/Entities/Video.cs index 7ba59df4f3..47df12e1b6 100644 --- a/MediaBrowser.Controller/Entities/Video.cs +++ b/MediaBrowser.Controller/Entities/Video.cs @@ -549,7 +549,7 @@ public virtual IEnumerable GetMediaSources(bool enablePathSubst { if (SourceType == SourceType.Channel) { - var sources = ChannelManager.GetStaticMediaSources(this, false, CancellationToken.None) + var sources = ChannelManager.GetStaticMediaSources(this, CancellationToken.None) .Result.ToList(); if (sources.Count > 0) From b0d13a53f1f50a6be9dd822f6705047916da1f11 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Fri, 23 Dec 2016 12:09:50 -0500 Subject: [PATCH 21/62] resolve error saving sync jobs --- .../Data/SqliteExtensions.cs | 12 +++ .../Sync/SyncRepository.cs | 91 ++++++++++++------- .../TV/Omdb/OmdbEpisodeProvider.cs | 12 ++- 3 files changed, 80 insertions(+), 35 deletions(-) diff --git a/Emby.Server.Implementations/Data/SqliteExtensions.cs b/Emby.Server.Implementations/Data/SqliteExtensions.cs index d6ad0ba8ab..783258a138 100644 --- a/Emby.Server.Implementations/Data/SqliteExtensions.cs +++ b/Emby.Server.Implementations/Data/SqliteExtensions.cs @@ -346,6 +346,18 @@ public static void TryBind(this IStatement statement, string name, Guid? value) } } + public static void TryBind(this IStatement statement, string name, double? value) + { + if (value.HasValue) + { + TryBind(statement, name, value.Value); + } + else + { + TryBindNull(statement, name); + } + } + public static void TryBind(this IStatement statement, string name, int? value) { if (value.HasValue) diff --git a/Emby.Server.Implementations/Sync/SyncRepository.cs b/Emby.Server.Implementations/Sync/SyncRepository.cs index 885f8e64a6..6d4fce3997 100644 --- a/Emby.Server.Implementations/Sync/SyncRepository.cs +++ b/Emby.Server.Implementations/Sync/SyncRepository.cs @@ -221,48 +221,77 @@ private async Task InsertOrUpdate(SyncJob job, bool insert) using (var connection = CreateConnection()) { string commandText; - var paramList = new List(); if (insert) { - commandText = "insert into SyncJobs (Id, TargetId, Name, Profile, Quality, Bitrate, Status, Progress, UserId, ItemIds, Category, ParentId, UnwatchedOnly, ItemLimit, SyncNewContent, DateCreated, DateLastModified, ItemCount) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"; + commandText = "insert into SyncJobs (Id, TargetId, Name, Profile, Quality, Bitrate, Status, Progress, UserId, ItemIds, Category, ParentId, UnwatchedOnly, ItemLimit, SyncNewContent, DateCreated, DateLastModified, ItemCount) values (@Id, @TargetId, @Name, @Profile, @Quality, @Bitrate, @Status, @Progress, @UserId, @ItemIds, @Category, @ParentId, @UnwatchedOnly, @ItemLimit, @SyncNewContent, @DateCreated, @DateLastModified, @ItemCount)"; } else { - commandText = "update SyncJobs set TargetId=?,Name=?,Profile=?,Quality=?,Bitrate=?,Status=?,Progress=?,UserId=?,ItemIds=?,Category=?,ParentId=?,UnwatchedOnly=?,ItemLimit=?,SyncNewContent=?,DateCreated=?,DateLastModified=?,ItemCount=? where Id=?"; + commandText = "update SyncJobs set TargetId=@TargetId,Name=@Name,Profile=@Profile,Quality=@Quality,Bitrate=@Bitrate,Status=@Status,Progress=@Progress,UserId=@UserId,ItemIds=@ItemIds,Category=@Category,ParentId=@ParentId,UnwatchedOnly=@UnwatchedOnly,ItemLimit=@ItemLimit,SyncNewContent=@SyncNewContent,DateCreated=@DateCreated,DateLastModified=@DateLastModified,ItemCount=@ItemCount where Id=@Id"; } - paramList.Add(job.TargetId); - paramList.Add(job.Name); - paramList.Add(job.Profile); - paramList.Add(job.Quality); - paramList.Add(job.Bitrate); - paramList.Add(job.Status.ToString()); - paramList.Add(job.Progress); - paramList.Add(job.UserId); + connection.RunInTransaction(conn => + { + using (var statement = PrepareStatementSafe(connection, commandText)) + { + statement.TryBind("@TargetId", job.TargetId); + statement.TryBind("@Name", job.Name); + statement.TryBind("@Profile", job.Profile); + statement.TryBind("@Quality", job.Quality); + statement.TryBind("@Bitrate", job.Bitrate); + statement.TryBind("@Status", job.Status.ToString()); + statement.TryBind("@Progress", job.Progress); + statement.TryBind("@UserId", job.UserId); + + if (job.RequestedItemIds.Count > 0) + { + statement.TryBind("@ItemIds", string.Join(",", job.RequestedItemIds.ToArray())); + } + else + { + statement.TryBindNull("@ItemIds"); + } - paramList.Add(string.Join(",", job.RequestedItemIds.ToArray())); - paramList.Add(job.Category); - paramList.Add(job.ParentId); - paramList.Add(job.UnwatchedOnly); - paramList.Add(job.ItemLimit); - paramList.Add(job.SyncNewContent); - paramList.Add(job.DateCreated.ToDateTimeParamValue()); - paramList.Add(job.DateLastModified.ToDateTimeParamValue()); - paramList.Add(job.ItemCount); + if (job.Category.HasValue) + { + statement.TryBind("@Category", job.Category.Value.ToString()); + } + else + { + statement.TryBindNull("@Category"); + } - if (insert) - { - paramList.Insert(0, job.Id.ToGuidParamValue()); - } - else - { - paramList.Add(job.Id.ToGuidParamValue()); - } + if (!string.IsNullOrWhiteSpace(job.ParentId)) + { + statement.TryBind("@ParentId", job.ParentId); + } + else + { + statement.TryBindNull("@ParentId"); + } - connection.RunInTransaction(conn => - { - conn.Execute(commandText, paramList.ToArray()); + statement.TryBind("@UnwatchedOnly", job.UnwatchedOnly); + + if (job.ItemLimit.HasValue) + { + statement.TryBind("@ItemLimit", job.ItemLimit); + } + else + { + statement.TryBindNull("@ItemLimit"); + } + + statement.TryBind("@SyncNewContent", job.SyncNewContent); + + statement.TryBind("@DateCreated", job.DateCreated.ToDateTimeParamValue()); + statement.TryBind("@DateLastModified", job.DateLastModified.ToDateTimeParamValue()); + + statement.TryBind("@ItemCount", job.ItemCount); + statement.TryBind("@Id", job.Id.ToGuidParamValue()); + + statement.MoveNext(); + } }, TransactionMode); } } diff --git a/MediaBrowser.Providers/TV/Omdb/OmdbEpisodeProvider.cs b/MediaBrowser.Providers/TV/Omdb/OmdbEpisodeProvider.cs index 21e327a8f2..56aa3967c5 100644 --- a/MediaBrowser.Providers/TV/Omdb/OmdbEpisodeProvider.cs +++ b/MediaBrowser.Providers/TV/Omdb/OmdbEpisodeProvider.cs @@ -55,11 +55,15 @@ public async Task> GetMetadata(EpisodeInfo info, Cancell return result; } - if (OmdbProvider.IsValidSeries(info.SeriesProviderIds) && info.IndexNumber.HasValue && info.ParentIndexNumber.HasValue) + string seriesImdbId; + if (info.SeriesProviderIds.TryGetValue(MetadataProviders.Imdb.ToString(), out seriesImdbId) && !string.IsNullOrEmpty(seriesImdbId)) { - var seriesImdbId = info.GetProviderId(MetadataProviders.Imdb); - - result.HasMetadata = await new OmdbProvider(_jsonSerializer, _httpClient, _fileSystem, _configurationManager).FetchEpisodeData(result, info.IndexNumber.Value, info.ParentIndexNumber.Value, seriesImdbId, info.MetadataLanguage, info.MetadataCountryCode, cancellationToken).ConfigureAwait(false); + if (info.IndexNumber.HasValue && + info.ParentIndexNumber.HasValue) + { + result.HasMetadata = await new OmdbProvider(_jsonSerializer, _httpClient, _fileSystem, _configurationManager) + .FetchEpisodeData(result, info.IndexNumber.Value, info.ParentIndexNumber.Value, seriesImdbId, info.MetadataLanguage, info.MetadataCountryCode, cancellationToken).ConfigureAwait(false); + } } return result; From c99981d769a44e6e921698025678e1fbb63e65f1 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Fri, 23 Dec 2016 12:57:47 -0500 Subject: [PATCH 22/62] update cloud sync profile --- .../Sync/CloudSyncProfile.cs | 16 +--------------- MediaBrowser.Model/Dlna/ConditionProcessor.cs | 13 +++++++------ MediaBrowser.Model/Dlna/StreamBuilder.cs | 7 ++----- 3 files changed, 10 insertions(+), 26 deletions(-) diff --git a/Emby.Server.Implementations/Sync/CloudSyncProfile.cs b/Emby.Server.Implementations/Sync/CloudSyncProfile.cs index 1a78c8ae66..c0675df817 100644 --- a/Emby.Server.Implementations/Sync/CloudSyncProfile.cs +++ b/Emby.Server.Implementations/Sync/CloudSyncProfile.cs @@ -68,7 +68,7 @@ public CloudSyncProfile(bool supportsAc3, bool supportsDca) }, new ProfileCondition { - Condition = ProfileConditionType.EqualsAny, + Condition = ProfileConditionType.Equals, Property = ProfileConditionValue.NumVideoStreams, Value = "1", IsRequired = false @@ -230,20 +230,6 @@ public CloudSyncProfile(bool supportsAc3, bool supportsDca) Codec = "aac,mp3", Conditions = new[] { - new ProfileCondition - { - Condition = ProfileConditionType.LessThanEqual, - Property = ProfileConditionValue.AudioChannels, - Value = "2", - IsRequired = true - }, - new ProfileCondition - { - Condition = ProfileConditionType.LessThanEqual, - Property = ProfileConditionValue.AudioBitrate, - Value = "320000", - IsRequired = true - }, new ProfileCondition { Condition = ProfileConditionType.Equals, diff --git a/MediaBrowser.Model/Dlna/ConditionProcessor.cs b/MediaBrowser.Model/Dlna/ConditionProcessor.cs index e9e76a993e..1c11e6a3ca 100644 --- a/MediaBrowser.Model/Dlna/ConditionProcessor.cs +++ b/MediaBrowser.Model/Dlna/ConditionProcessor.cs @@ -124,6 +124,7 @@ private bool IsConditionSatisfied(ProfileCondition condition, int? currentValue) switch (condition.Condition) { case ProfileConditionType.Equals: + case ProfileConditionType.EqualsAny: return currentValue.Value.Equals(expected); case ProfileConditionType.GreaterThanEqual: return currentValue.Value >= expected; @@ -132,7 +133,7 @@ private bool IsConditionSatisfied(ProfileCondition condition, int? currentValue) case ProfileConditionType.NotEquals: return !currentValue.Value.Equals(expected); default: - throw new InvalidOperationException("Unexpected ProfileConditionType"); + throw new InvalidOperationException("Unexpected ProfileConditionType: " + condition.Condition); } } @@ -160,7 +161,7 @@ private bool IsConditionSatisfied(ProfileCondition condition, string currentValu case ProfileConditionType.NotEquals: return !StringHelper.EqualsIgnoreCase(currentValue, expected); default: - throw new InvalidOperationException("Unexpected ProfileConditionType"); + throw new InvalidOperationException("Unexpected ProfileConditionType: " + condition.Condition); } } @@ -182,7 +183,7 @@ private bool IsConditionSatisfied(ProfileCondition condition, bool? currentValue case ProfileConditionType.NotEquals: return currentValue.Value != expected; default: - throw new InvalidOperationException("Unexpected ProfileConditionType"); + throw new InvalidOperationException("Unexpected ProfileConditionType: " + condition.Condition); } } @@ -211,7 +212,7 @@ private bool IsConditionSatisfied(ProfileCondition condition, float? currentValu case ProfileConditionType.NotEquals: return !currentValue.Value.Equals(expected); default: - throw new InvalidOperationException("Unexpected ProfileConditionType"); + throw new InvalidOperationException("Unexpected ProfileConditionType: " + condition.Condition); } } @@ -240,7 +241,7 @@ private bool IsConditionSatisfied(ProfileCondition condition, double? currentVal case ProfileConditionType.NotEquals: return !currentValue.Value.Equals(expected); default: - throw new InvalidOperationException("Unexpected ProfileConditionType"); + throw new InvalidOperationException("Unexpected ProfileConditionType: " + condition.Condition); } } @@ -264,7 +265,7 @@ private bool IsConditionSatisfied(ProfileCondition condition, TransportStreamTim case ProfileConditionType.NotEquals: return timestamp != expected; default: - throw new InvalidOperationException("Unexpected ProfileConditionType"); + throw new InvalidOperationException("Unexpected ProfileConditionType: " + condition.Condition); } } } diff --git a/MediaBrowser.Model/Dlna/StreamBuilder.cs b/MediaBrowser.Model/Dlna/StreamBuilder.cs index 6d68831ff7..cbbf434ff1 100644 --- a/MediaBrowser.Model/Dlna/StreamBuilder.cs +++ b/MediaBrowser.Model/Dlna/StreamBuilder.cs @@ -410,8 +410,6 @@ private StreamInfo BuildVideoItem(MediaSourceInfo item, VideoOptions options) audioStreamIndex = audioStream.Index; } - var allMediaStreams = item.MediaStreams; - MediaStream videoStream = item.VideoStream; // TODO: This doesn't accout for situation of device being able to handle media bitrate, but wifi connection not fast enough @@ -427,7 +425,7 @@ private StreamInfo BuildVideoItem(MediaSourceInfo item, VideoOptions options) if (isEligibleForDirectPlay || isEligibleForDirectStream) { // See if it can be direct played - PlayMethod? directPlay = GetVideoDirectPlayProfile(options, item, videoStream, audioStream, isEligibleForDirectPlay, isEligibleForDirectStream, allMediaStreams); + PlayMethod? directPlay = GetVideoDirectPlayProfile(options, item, videoStream, audioStream, isEligibleForDirectPlay, isEligibleForDirectStream); if (directPlay != null) { @@ -656,8 +654,7 @@ private int GetAudioBitrate(string subProtocol, int? maxTotalBitrate, int? targe MediaStream videoStream, MediaStream audioStream, bool isEligibleForDirectPlay, - bool isEligibleForDirectStream, - List allMediaStreams) + bool isEligibleForDirectStream) { DeviceProfile profile = options.Profile; From e973e3925f3c399f7e66c9d79d6389db7af457f6 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Fri, 23 Dec 2016 14:35:05 -0500 Subject: [PATCH 23/62] update naming project --- .../Emby.Server.Implementations.csproj | 4 ++-- Emby.Server.Implementations/packages.config | 2 +- .../Configuration/ServerConfiguration.cs | 10 ++++------ MediaBrowser.Providers/Omdb/OmdbProvider.cs | 6 +++--- .../MediaBrowser.Naming.1.0.3.nupkg | Bin 23792 -> 0 bytes .../MediaBrowser.Naming.1.0.4.nupkg | Bin 0 -> 23792 bytes .../MediaBrowser.Naming.dll | Bin 54784 -> 54784 bytes 7 files changed, 10 insertions(+), 12 deletions(-) delete mode 100644 packages/MediaBrowser.Naming.1.0.3/MediaBrowser.Naming.1.0.3.nupkg create mode 100644 packages/MediaBrowser.Naming.1.0.4/MediaBrowser.Naming.1.0.4.nupkg rename packages/{MediaBrowser.Naming.1.0.3 => MediaBrowser.Naming.1.0.4}/lib/portable-net45+win8/MediaBrowser.Naming.dll (74%) diff --git a/Emby.Server.Implementations/Emby.Server.Implementations.csproj b/Emby.Server.Implementations/Emby.Server.Implementations.csproj index d773fbbf73..ae21651918 100644 --- a/Emby.Server.Implementations/Emby.Server.Implementations.csproj +++ b/Emby.Server.Implementations/Emby.Server.Implementations.csproj @@ -312,8 +312,8 @@ ..\packages\Emby.XmlTv.1.0.3\lib\portable-net45+win8\Emby.XmlTv.dll True - - ..\packages\MediaBrowser.Naming.1.0.3\lib\portable-net45+win8\MediaBrowser.Naming.dll + + ..\packages\MediaBrowser.Naming.1.0.4\lib\portable-net45+win8\MediaBrowser.Naming.dll True diff --git a/Emby.Server.Implementations/packages.config b/Emby.Server.Implementations/packages.config index 09b0af8981..fcce67b330 100644 --- a/Emby.Server.Implementations/packages.config +++ b/Emby.Server.Implementations/packages.config @@ -1,7 +1,7 @@  - + diff --git a/MediaBrowser.Model/Configuration/ServerConfiguration.cs b/MediaBrowser.Model/Configuration/ServerConfiguration.cs index 493fe1bd24..22713b94fe 100644 --- a/MediaBrowser.Model/Configuration/ServerConfiguration.cs +++ b/MediaBrowser.Model/Configuration/ServerConfiguration.cs @@ -462,11 +462,9 @@ public ServerConfiguration() Type = ImageType.Art }, - // Don't download this by default - // Generally not used new ImageOption { - Limit = 0, + Limit = 1, Type = ImageType.Logo } }, @@ -556,7 +554,7 @@ public ServerConfiguration() Type = ImageType.Thumb } }, - DisabledMetadataFetchers = new []{ "The Open Movie Database", "TheMovieDb" } + DisabledMetadataFetchers = new []{ "TheMovieDb" } }, new MetadataOptions(0, 1280) @@ -577,8 +575,8 @@ public ServerConfiguration() Type = ImageType.Primary } }, - DisabledMetadataFetchers = new []{ "The Open Movie Database" }, - DisabledImageFetchers = new []{ "TheMovieDb" } + DisabledMetadataFetchers = new []{ "The Open Movie Database", "TheMovieDb" }, + DisabledImageFetchers = new []{ "The Open Movie Database", "TheMovieDb" } } }; } diff --git a/MediaBrowser.Providers/Omdb/OmdbProvider.cs b/MediaBrowser.Providers/Omdb/OmdbProvider.cs index 721e31b07e..c1668c4cc3 100644 --- a/MediaBrowser.Providers/Omdb/OmdbProvider.cs +++ b/MediaBrowser.Providers/Omdb/OmdbProvider.cs @@ -46,7 +46,7 @@ public async Task Fetch(MetadataResult itemResult, string imdbId, string l T item = itemResult.Item; - var result = await GetRootObject(imdbId, cancellationToken); + var result = await GetRootObject(imdbId, cancellationToken).ConfigureAwait(false); // Only take the name and rating if the user's language is set to english, since Omdb has no localization if (string.Equals(language, "en", StringComparison.OrdinalIgnoreCase)) @@ -221,7 +221,7 @@ public async Task FetchEpisodeData(MetadataResult itemResult, int ep internal async Task GetRootObject(string imdbId, CancellationToken cancellationToken) { - var path = await EnsureItemInfo(imdbId, cancellationToken); + var path = await EnsureItemInfo(imdbId, cancellationToken).ConfigureAwait(false); string resultString; @@ -240,7 +240,7 @@ internal async Task GetRootObject(string imdbId, CancellationToken c internal async Task GetSeasonRootObject(string imdbId, int seasonId, CancellationToken cancellationToken) { - var path = await EnsureSeasonInfo(imdbId, seasonId, cancellationToken); + var path = await EnsureSeasonInfo(imdbId, seasonId, cancellationToken).ConfigureAwait(false); string resultString; diff --git a/packages/MediaBrowser.Naming.1.0.3/MediaBrowser.Naming.1.0.3.nupkg b/packages/MediaBrowser.Naming.1.0.3/MediaBrowser.Naming.1.0.3.nupkg deleted file mode 100644 index 0ce793a47c7a98d08ade3aa0550725b0a5f77b51..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23792 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 diff --git a/packages/MediaBrowser.Naming.1.0.4/MediaBrowser.Naming.1.0.4.nupkg b/packages/MediaBrowser.Naming.1.0.4/MediaBrowser.Naming.1.0.4.nupkg new file mode 100644 index 0000000000000000000000000000000000000000..29ba47b6e63e7c79fd129aab2c46a0694f455fbd GIT binary patch literal 23792 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

w=kLY_jx5>dYo^FMSWH$wa35YWwm~W4$(33X zVqcQ>UL%}MHEE4yif7NhtSexG<+F7qhLbOb#>h!%Yml*$$?QEi4`eXNvgiTG(=J=7 z-}O(to8i2g2dlXvP*7oAO7PwxkQWcDlttKX*ue4wNP4_BzWUuvx8y~bto#u54neVD zR-V0uio3B4T0f92M+X6dtfqh&`n%G&?G8ldt$orX6y2O!j}L<3GcA1nc?*>dpwwR42AuD$iSHwQYUDbO5v5QG3^JeHFn@Fxt>Yu|1rn3ZR}Q0u-QsFb;_@sJ{<2Cpf? ze{<@!*50E1cr5&I?hVBvFDVn3o>H87V4x1x zkaNr^sp#&4w&Ii7SLf@k+tEdPrMuidpKT-jYl9GcE+vldb8p0v*X|1wZZPKT)eIj< zC&P_*Y5mj7QVQFASYAAjv%lSY=o1E5`+IdiYq|934FKv7*sm#}j zT@ik=HW(qz)O})>g5 zBdXby5MMMlGiZ@7vkNTVCtaFuYoi&Vuaw*8h_R~~80Kxu!sLBd5=+rJj@qR`7$^m8 z4RAX}x%z)YH#BWY|`w7P6;jFKyX-@_MKFh!tP6rK|l#pW4ayt&@|_ zCxoY%{GEN9RJq&S}{f*>F$$QkY~DlQ@}%KdvR9OMT5L%038z}cPOBfZ_hzo+%`@)Gg7c9s}t-HMBv z>*^SvvADuuXLq=rGZ6G^{@+Xdw`%S`QnCOA2cR6#4P*z0xdGIm_CA~@AUmjn=ucNq zBOE~PKsT_Zl@+Frz05m=X{3d;t*gb zuro;HEZ@&LPIH2B8Q@??Fvtz?H(2ahk)J{oe$|BmI9ymnQbF{$Q-ud0A1|1jgZrt# zi^~cJ!y%xvp8N{;o+bL_>gj!V5BvKdARM6Qp#g$(8vH^FbEo6A-zFlRWfOLtEdVs{&nQxf@q!X}^P`+suDxRE(+ zlQ8_WO*k%D7365=0fFN>jJy1c)_m$ab94UM_+JENI~NxS7WDSJOgba;?po9+%E&SKozV`&;A4J CPQ0!F literal 0 HcmV?d00001 diff --git a/packages/MediaBrowser.Naming.1.0.3/lib/portable-net45+win8/MediaBrowser.Naming.dll b/packages/MediaBrowser.Naming.1.0.4/lib/portable-net45+win8/MediaBrowser.Naming.dll similarity index 74% rename from packages/MediaBrowser.Naming.1.0.3/lib/portable-net45+win8/MediaBrowser.Naming.dll rename to packages/MediaBrowser.Naming.1.0.4/lib/portable-net45+win8/MediaBrowser.Naming.dll index 3cd872c2ab98a0547aceab26e87326569c86c6e7..e0678e1c6d14f82d71077ee6b787b1ae62f34583 100644 GIT binary patch delta 4882 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 Date: Sat, 24 Dec 2016 02:41:25 -0500 Subject: [PATCH 24/62] fix bdinfo path --- BDInfo/BDROM.cs | 24 ++- .../BdInfo/BdInfoExaminer.cs | 5 + .../MediaInfo/FFProbeVideoInfo.cs | 5 + .../dashboard-ui/scripts/mysync.js | 2 +- .../dashboard-ui/scripts/syncactivity.js | 2 +- .../dashboard-ui/scripts/syncjob.js | 149 +++++++++--------- 6 files changed, 110 insertions(+), 77 deletions(-) diff --git a/BDInfo/BDROM.cs b/BDInfo/BDROM.cs index 97dbfbf3bd..2faeb405e2 100644 --- a/BDInfo/BDROM.cs +++ b/BDInfo/BDROM.cs @@ -77,6 +77,11 @@ public delegate bool OnPlaylistFileScanError( public BDROM( string path, IFileSystem fileSystem, ITextEncoding textEncoding) { + if (string.IsNullOrWhiteSpace(path)) + { + throw new ArgumentNullException("path"); + } + _fileSystem = fileSystem; // // Locate BDMV directories. @@ -326,15 +331,28 @@ public void Scan() private FileSystemMetadata GetDirectoryBDMV( string path) { + if (string.IsNullOrWhiteSpace(path)) + { + throw new ArgumentNullException("path"); + } + FileSystemMetadata dir = _fileSystem.GetDirectoryInfo(path); while (dir != null) { - if (dir.Name == "BDMV") + if (string.Equals(dir.Name, "BDMV", StringComparison.OrdinalIgnoreCase)) { return dir; } - dir = _fileSystem.GetDirectoryInfo(Path.GetDirectoryName(dir.FullName)); + var parentFolder = Path.GetDirectoryName(dir.FullName); + if (string.IsNullOrEmpty(parentFolder)) + { + dir = null; + } + else + { + dir = _fileSystem.GetDirectoryInfo(parentFolder); + } } return GetDirectory("BDMV", _fileSystem.GetDirectoryInfo(path), 0); @@ -350,7 +368,7 @@ private FileSystemMetadata GetDirectory( FileSystemMetadata[] children = _fileSystem.GetDirectories(dir.FullName).ToArray(); foreach (FileSystemMetadata child in children) { - if (child.Name == name) + if (string.Equals(child.Name, name, StringComparison.OrdinalIgnoreCase)) { return child; } diff --git a/MediaBrowser.MediaEncoding/BdInfo/BdInfoExaminer.cs b/MediaBrowser.MediaEncoding/BdInfo/BdInfoExaminer.cs index bf7343f3d2..219b1f3c5d 100644 --- a/MediaBrowser.MediaEncoding/BdInfo/BdInfoExaminer.cs +++ b/MediaBrowser.MediaEncoding/BdInfo/BdInfoExaminer.cs @@ -30,6 +30,11 @@ public BdInfoExaminer(IFileSystem fileSystem, ITextEncoding textEncoding) /// BlurayDiscInfo. public BlurayDiscInfo GetDiscInfo(string path) { + if (string.IsNullOrWhiteSpace(path)) + { + throw new ArgumentNullException("path"); + } + var bdrom = new BDROM(path, _fileSystem, _textEncoding); bdrom.Scan(); diff --git a/MediaBrowser.Providers/MediaInfo/FFProbeVideoInfo.cs b/MediaBrowser.Providers/MediaInfo/FFProbeVideoInfo.cs index 0a070d3487..c1bae4b3cb 100644 --- a/MediaBrowser.Providers/MediaInfo/FFProbeVideoInfo.cs +++ b/MediaBrowser.Providers/MediaInfo/FFProbeVideoInfo.cs @@ -328,6 +328,11 @@ private bool IsEmpty(int? num) /// VideoStream. private BlurayDiscInfo GetBDInfo(string path) { + if (string.IsNullOrWhiteSpace(path)) + { + throw new ArgumentNullException("path"); + } + try { return _blurayExaminer.GetDiscInfo(path); diff --git a/MediaBrowser.WebDashboard/dashboard-ui/scripts/mysync.js b/MediaBrowser.WebDashboard/dashboard-ui/scripts/mysync.js index 8c3436dbab..b3cb9aef09 100644 --- a/MediaBrowser.WebDashboard/dashboard-ui/scripts/mysync.js +++ b/MediaBrowser.WebDashboard/dashboard-ui/scripts/mysync.js @@ -81,7 +81,7 @@ events.on(mySyncJobList, 'jobedit', function (e, jobId, serverId) { - Dashboard.navigate('mysyncjob.html?id=' + jobId); + Dashboard.navigate('mysyncjob.html?serverId=' + ApiClient.serverId() + '&id=' + jobId); }); view.addEventListener('viewbeforeshow', function () { diff --git a/MediaBrowser.WebDashboard/dashboard-ui/scripts/syncactivity.js b/MediaBrowser.WebDashboard/dashboard-ui/scripts/syncactivity.js index 4800c9a607..9e1728d354 100644 --- a/MediaBrowser.WebDashboard/dashboard-ui/scripts/syncactivity.js +++ b/MediaBrowser.WebDashboard/dashboard-ui/scripts/syncactivity.js @@ -52,7 +52,7 @@ events.on(mySyncJobList, 'jobedit', function (e, jobId, serverId) { - Dashboard.navigate('syncjob.html?id=' + jobId); + Dashboard.navigate('syncjob.html?serverId=' + ApiClient.serverId() + '&id=' + jobId); }); view.addEventListener('viewshow', function () { diff --git a/MediaBrowser.WebDashboard/dashboard-ui/scripts/syncjob.js b/MediaBrowser.WebDashboard/dashboard-ui/scripts/syncjob.js index d89c3a7842..1d0c3c3319 100644 --- a/MediaBrowser.WebDashboard/dashboard-ui/scripts/syncjob.js +++ b/MediaBrowser.WebDashboard/dashboard-ui/scripts/syncjob.js @@ -1,4 +1,4 @@ -define(['datetime', 'dom', 'imageLoader', 'listViewStyle', 'paper-icon-button-light', 'emby-button'], function (datetime, dom, imageLoader) { +define(['connectionManager', 'serverNotifications', 'events', 'datetime', 'dom', 'imageLoader', 'loading', 'globalize', 'apphost', 'listViewStyle', 'paper-icon-button-light', 'emby-button'], function (connectionManager, serverNotifications, events, datetime, dom, imageLoader, loading, globalize, appHost) { 'use strict'; function renderJob(page, job, dialogOptions) { @@ -6,14 +6,14 @@ var html = ''; html += '

'; - html += Globalize.translate('ValueDateCreated', datetime.parseISO8601Date(job.DateCreated, true).toLocaleString()); + html += globalize.translate('ValueDateCreated', datetime.parseISO8601Date(job.DateCreated, true).toLocaleString()); html += '
'; html += '
'; html += '
'; html += '
'; html += '
'; - html += ''; + html += ''; page.querySelector('.syncJobForm').innerHTML = html; @@ -38,7 +38,7 @@ }; } - function getJobItemHtml(jobItem, index) { + function getJobItemHtml(jobItem, apiClient, index) { var html = ''; @@ -50,7 +50,7 @@ if (jobItem.PrimaryImageItemId) { - imgUrl = ApiClient.getImageUrl(jobItem.PrimaryImageItemId, { + imgUrl = apiClient.getImageUrl(jobItem.PrimaryImageItemId, { type: "Primary", width: 80, tag: jobItem.PrimaryImageTag, @@ -76,10 +76,10 @@ } else { html += '
'; } - html += Globalize.translate('SyncJobItemStatus' + jobItem.Status); + html += globalize.translate('SyncJobItemStatus' + jobItem.Status); if (jobItem.Status == 'Synced' && jobItem.IsMarkedForRemoval) { html += '
'; - html += Globalize.translate('SyncJobItemStatusSyncedMarkForRemoval'); + html += globalize.translate('SyncJobItemStatusSyncedMarkForRemoval'); } html += '
'; @@ -89,29 +89,31 @@ html += ''; + var moreIcon = appHost.moreIcon === 'dots-horiz' ? '' : ''; + if (hasActions) { - html += ''; + html += ''; } else { - html += ''; + html += ''; } html += ''; return html; } - function renderJobItems(page, items) { + function renderJobItems(page, items, apiClient) { var html = ''; - html += '

' + Globalize.translate('HeaderItems') + '

'; + html += '

' + globalize.translate('HeaderItems') + '

'; html += '
'; var index = 0; html += items.map(function (i) { - return getJobItemHtml(i, index++); + return getJobItemHtml(i, apiClient, index++); }).join(''); @@ -135,7 +137,7 @@ return elem; } - function showJobItemMenu(elem) { + function showJobItemMenu(elem, jobId, apiClient) { var page = parentWithClass(elem, 'page'); var listItem = parentWithClass(elem, 'listItem'); @@ -147,31 +149,31 @@ if (status == 'Failed') { menuItems.push({ - name: Globalize.translate('ButtonQueueForRetry'), + name: globalize.translate('ButtonQueueForRetry'), id: 'retry' }); } else if (status == 'Cancelled') { menuItems.push({ - name: Globalize.translate('ButtonReenable'), + name: globalize.translate('ButtonReenable'), id: 'retry' }); } else if (status == 'Queued' || status == 'Transferring' || status == 'Converting' || status == 'ReadyToTransfer') { menuItems.push({ - name: Globalize.translate('ButtonCancelItem'), + name: globalize.translate('ButtonCancelItem'), id: 'cancel' }); } else if (status == 'Synced' && remove) { menuItems.push({ - name: Globalize.translate('ButtonUnmarkForRemoval'), + name: globalize.translate('ButtonUnmarkForRemoval'), id: 'unmarkforremoval' }); } else if (status == 'Synced') { menuItems.push({ - name: Globalize.translate('ButtonMarkForRemoval'), + name: globalize.translate('ButtonMarkForRemoval'), id: 'markforremoval' }); } @@ -186,16 +188,16 @@ switch (id) { case 'cancel': - cancelJobItem(page, jobItemId); + cancelJobItem(page, jobId, jobItemId, apiClient); break; case 'retry': - retryJobItem(page, jobItemId); + retryJobItem(page, jobId, jobItemId, apiClient); break; case 'markforremoval': - markForRemoval(page, jobItemId); + markForRemoval(page, jobId, jobItemId, apiClient); break; case 'unmarkforremoval': - unMarkForRemoval(page, jobItemId); + unMarkForRemoval(page, jobId, jobItemId, apiClient); break; default: break; @@ -206,60 +208,60 @@ }); } - function cancelJobItem(page, jobItemId) { + function cancelJobItem(page, jobId, jobItemId, apiClient) { // Need a timeout because jquery mobile will not show a popup while another is in the act of closing - Dashboard.showLoadingMsg(); + loading.show(); - ApiClient.ajax({ + apiClient.ajax({ type: "DELETE", - url: ApiClient.getUrl('Sync/JobItems/' + jobItemId) + url: apiClient.getUrl('Sync/JobItems/' + jobItemId) }).then(function () { - loadJob(page); + loadJob(page, jobId, apiClient); }); } - function markForRemoval(page, jobItemId) { + function markForRemoval(page, jobId, jobItemId, apiClient) { - ApiClient.ajax({ + apiClient.ajax({ type: "POST", - url: ApiClient.getUrl('Sync/JobItems/' + jobItemId + '/MarkForRemoval') + url: apiClient.getUrl('Sync/JobItems/' + jobItemId + '/MarkForRemoval') }).then(function () { - loadJob(page); + loadJob(page, jobId, apiClient); }); } - function unMarkForRemoval(page, jobItemId) { + function unMarkForRemoval(page, jobId, jobItemId, apiClient) { - ApiClient.ajax({ + apiClient.ajax({ type: "POST", - url: ApiClient.getUrl('Sync/JobItems/' + jobItemId + '/UnmarkForRemoval') + url: apiClient.getUrl('Sync/JobItems/' + jobItemId + '/UnmarkForRemoval') }).then(function () { - loadJob(page); + loadJob(page, jobId, apiClient); }); } - function retryJobItem(page, jobItemId) { + function retryJobItem(page, jobId, jobItemId, apiClient) { - ApiClient.ajax({ + apiClient.ajax({ type: "POST", - url: ApiClient.getUrl('Sync/JobItems/' + jobItemId + '/Enable') + url: apiClient.getUrl('Sync/JobItems/' + jobItemId + '/Enable') }).then(function () { - loadJob(page); + loadJob(page, jobId, apiClient); }); } @@ -314,14 +316,13 @@ } var _jobOptions; - function loadJob(page) { + function loadJob(page, id, apiClient) { - Dashboard.showLoadingMsg(); - var id = getParameterByName('id'); + loading.show(); - ApiClient.getJSON(ApiClient.getUrl('Sync/Jobs/' + id)).then(function (job) { + apiClient.getJSON(apiClient.getUrl('Sync/Jobs/' + id)).then(function (job) { - ApiClient.getJSON(ApiClient.getUrl('Sync/Options', { + apiClient.getJSON(apiClient.getUrl('Sync/Options', { UserId: job.UserId, ItemIds: (job.RequestedItemIds && job.RequestedItemIds.length ? job.RequestedItemIds.join('') : null), @@ -334,19 +335,19 @@ _jobOptions = options; renderJob(page, job, options); - Dashboard.hideLoadingMsg(); + loading.hide(); }); }); - ApiClient.getJSON(ApiClient.getUrl('Sync/JobItems', { + apiClient.getJSON(apiClient.getUrl('Sync/JobItems', { JobId: id, AddMetadata: true })).then(function (result) { - renderJobItems(page, result.Items); - Dashboard.hideLoadingMsg(); + renderJobItems(page, result.Items, apiClient); + loading.hide(); }); } @@ -354,31 +355,30 @@ //renderJob(page, job, _jobOptions); renderJobItems(page, jobItems); - Dashboard.hideLoadingMsg(); + loading.hide(); } - function saveJob(page) { + function saveJob(page, id, apiClient) { - Dashboard.showLoadingMsg(); - var id = getParameterByName('id'); + loading.show(); - ApiClient.getJSON(ApiClient.getUrl('Sync/Jobs/' + id)).then(function (job) { + apiClient.getJSON(apiClient.getUrl('Sync/Jobs/' + id)).then(function (job) { require(['syncDialog'], function (syncDialog) { syncDialog.setJobValues(job, page); - ApiClient.ajax({ + apiClient.ajax({ - url: ApiClient.getUrl('Sync/Jobs/' + id), + url: apiClient.getUrl('Sync/Jobs/' + id), type: 'POST', data: JSON.stringify(job), contentType: "application/json" }).then(function () { - Dashboard.hideLoadingMsg(); + loading.hide(); require(['toast'], function (toast) { - toast(Globalize.translate('SettingsSaved')); + toast(globalize.translate('SettingsSaved')); }); }); }); @@ -388,35 +388,40 @@ return function (view, params) { + function getApiClient() { + return connectionManager.getApiClient(params.serverId); + } + view.querySelector('.syncJobForm').addEventListener('submit', function (e) { - saveJob(view); + saveJob(view, params.id, getApiClient()); e.preventDefault(); return false; }); - function onWebSocketMessage(e, msg) { - - if (msg.MessageType == "SyncJob") { - loadJobInfo(view, msg.Data.Job, msg.Data.JobItems); - } + function onSyncJobMessage(e, msg) { + loadJobInfo(view, msg.Data.Job, msg.Data.JobItems); } function startListening(page) { var startParams = "0,1500"; - startParams += "," + getParameterByName('id'); + startParams += "," + params.id; + + var apiClient = getApiClient(); - if (ApiClient.isWebSocketOpen()) { - ApiClient.sendWebSocketMessage("SyncJobStart", startParams); + if (apiClient.isWebSocketOpen()) { + apiClient.sendWebSocketMessage("SyncJobStart", startParams); } } function stopListening() { - if (ApiClient.isWebSocketOpen()) { - ApiClient.sendWebSocketMessage("SyncJobStop", ""); + var apiClient = getApiClient(); + + if (apiClient.isWebSocketOpen()) { + apiClient.sendWebSocketMessage("SyncJobStop", ""); } } @@ -424,22 +429,22 @@ view.querySelector('.jobItems').addEventListener('click', function (e) { var btnJobItemMenu = dom.parentWithClass(e.target, 'btnJobItemMenu'); if (btnJobItemMenu) { - showJobItemMenu(btnJobItemMenu); + showJobItemMenu(btnJobItemMenu, params.id); } }); view.addEventListener('viewshow', function () { var page = this; - loadJob(page); + loadJob(page, params.id, getApiClient()); startListening(page); - Events.on(ApiClient, "websocketmessage", onWebSocketMessage); + events.on(serverNotifications, "SyncJob", onSyncJobMessage); }); view.addEventListener('viewbeforehide', function () { stopListening(); - Events.off(ApiClient, "websocketmessage", onWebSocketMessage); + events.off(serverNotifications, "SyncJob", onSyncJobMessage); }); }; From b2ad18d2acecf8253f18be38500889a89992bf91 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Sat, 24 Dec 2016 02:41:53 -0500 Subject: [PATCH 25/62] add content type error handling --- .../Data/SqliteItemRepository.cs | 10 +++++++++- Emby.Server.Implementations/Library/LibraryManager.cs | 6 +++++- MediaBrowser.Api/ItemUpdateService.cs | 1 + 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/Emby.Server.Implementations/Data/SqliteItemRepository.cs b/Emby.Server.Implementations/Data/SqliteItemRepository.cs index 8e6a277a47..8c16216b95 100644 --- a/Emby.Server.Implementations/Data/SqliteItemRepository.cs +++ b/Emby.Server.Implementations/Data/SqliteItemRepository.cs @@ -5267,11 +5267,19 @@ private void UpdateItemValues(Guid itemId, List> values, IDat { foreach (var pair in values) { + var itemValue = pair.Item2; + + // Don't save if invalid + if (string.IsNullOrWhiteSpace(itemValue)) + { + continue; + } + statement.Reset(); statement.TryBind("@ItemId", itemId.ToGuidParamValue()); statement.TryBind("@Type", pair.Item1); - statement.TryBind("@Value", pair.Item2); + statement.TryBind("@Value", itemValue); if (pair.Item2 == null) { diff --git a/Emby.Server.Implementations/Library/LibraryManager.cs b/Emby.Server.Implementations/Library/LibraryManager.cs index 5bf53fcb43..4c788a2abe 100644 --- a/Emby.Server.Implementations/Library/LibraryManager.cs +++ b/Emby.Server.Implementations/Library/LibraryManager.cs @@ -3084,7 +3084,11 @@ private void RemoveContentTypeOverrides(string path) foreach (var contentType in ConfigurationManager.Configuration.ContentTypes) { - if (string.Equals(path, contentType.Name, StringComparison.OrdinalIgnoreCase) + if (string.IsNullOrWhiteSpace(contentType.Name)) + { + removeList.Add(contentType); + } + else if (string.Equals(path, contentType.Name, StringComparison.OrdinalIgnoreCase) || _fileSystem.ContainsSubPath(path, contentType.Name)) { removeList.Add(contentType); diff --git a/MediaBrowser.Api/ItemUpdateService.cs b/MediaBrowser.Api/ItemUpdateService.cs index b0a0e79aee..5c99d98c25 100644 --- a/MediaBrowser.Api/ItemUpdateService.cs +++ b/MediaBrowser.Api/ItemUpdateService.cs @@ -99,6 +99,7 @@ public void Post(UpdateItemContentType request) var path = item.ContainingFolderPath; var types = _config.Configuration.ContentTypes + .Where(i => !string.IsNullOrWhiteSpace(i.Name)) .Where(i => !string.Equals(i.Name, path, StringComparison.OrdinalIgnoreCase)) .ToList(); From 7e9af428d90b93f7470004568cffe00fa2b2aeb5 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Sat, 24 Dec 2016 03:08:42 -0500 Subject: [PATCH 26/62] update translations --- .../dashboard-ui/strings/ar.json | 10 +- .../dashboard-ui/strings/be-BY.json | 10 +- .../dashboard-ui/strings/bg-BG.json | 10 +- .../dashboard-ui/strings/ca.json | 10 +- .../dashboard-ui/strings/cs.json | 10 +- .../dashboard-ui/strings/da.json | 10 +- .../dashboard-ui/strings/de-DE.json | 10 +- .../dashboard-ui/strings/de.json | 10 +- .../dashboard-ui/strings/el.json | 10 +- .../dashboard-ui/strings/en-GB.json | 10 +- .../dashboard-ui/strings/es-AR.json | 10 +- .../dashboard-ui/strings/es-ES.json | 10 +- .../dashboard-ui/strings/es-MX.json | 10 +- .../dashboard-ui/strings/es.json | 10 +- .../dashboard-ui/strings/fi.json | 10 +- .../dashboard-ui/strings/fr-CA.json | 10 +- .../dashboard-ui/strings/fr-FR.json | 10 +- .../dashboard-ui/strings/fr.json | 10 +- .../dashboard-ui/strings/gsw.json | 10 +- .../dashboard-ui/strings/he.json | 10 +- .../dashboard-ui/strings/hr.json | 10 +- .../dashboard-ui/strings/hu.json | 10 +- .../dashboard-ui/strings/id.json | 10 +- .../dashboard-ui/strings/it.json | 10 +- .../dashboard-ui/strings/kk.json | 14 +- .../dashboard-ui/strings/ko.json | 10 +- .../dashboard-ui/strings/lt-LT.json | 10 +- .../dashboard-ui/strings/ms.json | 10 +- .../dashboard-ui/strings/nb.json | 10 +- .../dashboard-ui/strings/nl.json | 10 +- .../dashboard-ui/strings/pl.json | 10 +- .../dashboard-ui/strings/pt-BR.json | 14 +- .../dashboard-ui/strings/pt-PT.json | 10 +- .../dashboard-ui/strings/ro.json | 10 +- .../dashboard-ui/strings/ru.json | 10 +- .../dashboard-ui/strings/sk.json | 10 +- .../dashboard-ui/strings/sl-SI.json | 10 +- .../dashboard-ui/strings/sv.json | 10 +- .../dashboard-ui/strings/tr.json | 10 +- .../dashboard-ui/strings/uk.json | 10 +- .../dashboard-ui/strings/vi.json | 10 +- .../dashboard-ui/strings/zh-CN.json | 146 +++++++++--------- .../dashboard-ui/strings/zh-HK.json | 10 +- .../dashboard-ui/strings/zh-TW.json | 10 +- 44 files changed, 292 insertions(+), 292 deletions(-) diff --git a/MediaBrowser.WebDashboard/dashboard-ui/strings/ar.json b/MediaBrowser.WebDashboard/dashboard-ui/strings/ar.json index 62479e5607..57b889577b 100644 --- a/MediaBrowser.WebDashboard/dashboard-ui/strings/ar.json +++ b/MediaBrowser.WebDashboard/dashboard-ui/strings/ar.json @@ -1,6 +1,4 @@ { - "OptionAutomaticallyGroupSeriesHelp": "\u0641\u064a \u062d\u0627\u0644 \u0627\u0644\u062a\u0641\u0639\u064a\u0644 \u0641\u0625\u0646 \u0627\u0644\u062d\u0644\u0642\u0627\u062a \u0627\u0644\u0645\u0648\u0632\u0639\u0629 \u0628\u064a\u0646 \u0639\u062f\u0629 \u0645\u062c\u0644\u062f\u0627\u062a \u0633\u062a\u062f\u0645\u062c \u062a\u0644\u0642\u0627\u0626\u064a\u0627\u064b \u0641\u064a \u0645\u062c\u0644\u062f \u0645\u0633\u0644\u0633\u0644 \u0648\u0627\u062d\u062f.", - "OptionAutomaticallyGroupSeries": "\u0625\u062f\u0645\u062c \u0627\u0644\u062d\u0644\u0642\u0627\u062a \u0627\u0644\u0645\u0648\u0632\u0639\u0629 \u0628\u064a\u0646 \u0639\u062f\u0629 \u0645\u062c\u0644\u062f\u0627\u062a \u0625\u0644\u0649 \u0645\u062c\u0644\u062f \u0648\u0627\u062d\u062f \u062a\u0644\u0642\u0627\u0626\u064a\u0627\u064b.", "LabelPrevious": "\u0627\u0644\u0633\u0627\u0628\u0642", "LabelFinish": "\u0627\u0646\u0647\u0627\u0621", "LabelNext": "\u0627\u0644\u062a\u0627\u0644\u064a", @@ -173,7 +171,6 @@ "OptionPlayCount": "\u0645\u0631\u0627\u062a \u0627\u0644\u062a\u0634\u063a\u064a\u0644", "OptionDatePlayed": "\u062a\u0627\u0631\u064a\u062e \u0627\u0644\u062a\u0634\u063a\u064a\u0644", "OptionDateAdded": "\u062a\u0627\u0631\u064a\u062e \u0627\u0644\u0625\u0636\u0627\u0641\u0629", - "DateAddedValue": "\u062a\u0627\u0631\u064a\u062e \u0627\u0644\u0625\u0636\u0627\u0641\u0629: {0}", "OptionAlbumArtist": "\u0623\u0644\u0628\u0648\u0645 \u0627\u0644\u0641\u0646\u0627\u0646", "OptionArtist": "\u0627\u0644\u0641\u0646\u0627\u0646", "OptionAlbum": "\u0627\u0644\u0623\u0644\u0628\u0648\u0645", @@ -1751,7 +1748,7 @@ "HeaderCancelSyncJob": "\u0625\u0644\u063a\u0627\u0621 \u0627\u0644\u0645\u0632\u0627\u0645\u0646\u0629", "CancelSyncJobConfirmation": "\u0625\u0646 \u0625\u0644\u063a\u0627\u0621 \u0645\u0647\u0645\u0629 \u0627\u0644\u0645\u0632\u0627\u0645\u0646\u0629 \u0633\u064a\u0632\u064a\u0644 \u0627\u0644\u0648\u0633\u0627\u0626\u0637 \u0627\u0644\u0645\u062a\u0632\u0627\u0645\u0646\u0629 \u0645\u0646 \u0627\u0644\u062c\u0647\u0627\u0632 \u0623\u062b\u0646\u0627\u0621 \u0639\u0645\u0644\u064a\u0629 \u0627\u0644\u0645\u0632\u0627\u0645\u0646\u0629 \u0627\u0644\u0642\u0627\u062f\u0645\u0629. \u0647\u0644 \u0623\u0646\u062a \u0645\u062a\u0623\u0643\u062f \u0623\u0646\u0643 \u062a\u0631\u063a\u0628 \u0628\u0627\u0644\u0645\u062a\u0627\u0628\u0639\u0629\u061f", "LabelQuality": "\u0627\u0644\u062c\u0648\u062f\u0629:", - "MessageBookPluginRequired": "\u0647\u0630\u0627 \u064a\u062a\u0637\u0644\u0628 \u062a\u062b\u0628\u064a\u062a \u0645\u0644\u062d\u0642 \u0631\u0641 \u0627\u0644\u0643\u062a\u0628\u060c Bookshelf.", + "BookLibraryHelp": "Audio and text books are supported", "MessageGamePluginRequired": "\u0647\u0630\u0627 \u064a\u062a\u0637\u0644\u0628 \u062a\u062b\u0628\u064a\u062a \u0645\u0644\u062d\u0642 \u0645\u062a\u0635\u0641\u062d \u0627\u0644\u0623\u0644\u0639\u0627\u0628 GameBrowser .", "MessageUnsetContentHelp": "\u0627\u0644\u0645\u062d\u062a\u0648\u0649 \u0633\u064a\u0639\u0631\u0636 \u0643\u0645\u062c\u062f\u0627\u062a \u0627\u0639\u062a\u064a\u0627\u062f\u064a\u0629. \u0644\u0623\u0641\u0636\u0644 \u0627\u0644\u0646\u062a\u0627\u0626\u062c \u0627\u0633\u062a\u062e\u062f\u0645 \u0645\u062f\u064a\u0631 \u0648\u0627\u0635\u0641\u0627\u062a \u0627\u0644\u0628\u064a\u0627\u0646\u0627\u062a \u0644\u0625\u0639\u062f\u0627\u062f \u0646\u0648\u0639 \u0645\u062d\u062a\u0648\u0649 \u0627\u0644\u0645\u062c\u0644\u062f\u0627\u062a \u0627\u0644\u0641\u0631\u0639\u064a\u0629.", "SyncJobItemStatusQueued": "\u0641\u064a \u0642\u0627\u0626\u0645\u0629 \u0627\u0644\u0627\u0646\u062a\u0638\u0627\u0631", @@ -1897,6 +1894,7 @@ "DownloadFFmpeg": "\u0642\u0645 \u0628\u0625\u0646\u0632\u0627\u0644 ffmpeg", "FFmpegSuggestedDownload": "\u0627\u0644\u0625\u0646\u0632\u0627\u0644\u0627\u062a \u0627\u0644\u0645\u0642\u062a\u0631\u062d\u0629: {0}", "UnzipFFmpegFile": "\u0641\u0643 \u0645\u0644\u0641\u0627\u062a zip \u0627\u0644\u0645\u0646\u0632\u0644\u0629 \u0625\u0644\u0649 \u0645\u062c\u0644\u062f \u0645\u0646 \u0627\u062e\u062a\u064a\u0627\u0631\u0643.", + "MarkFFmpegExec": "If you are running Linux or OSX, you will need to locate the ffmpeg and ffprobe files and mark them as executable. This is needed to grant Emby permission to execute them.", "OptionUseSystemInstalledVersion": "\u0627\u0633\u062a\u062e\u062f\u0645 \u0631\u0642\u0645 \u0625\u0635\u062f\u0627\u0631 \u0627\u0644\u0646\u0638\u0627\u0645 \u0627\u0644\u0645\u062b\u0628\u062a", "OptionUseMyCustomVersion": "\u0627\u0633\u062a\u062e\u062f\u0645 \u0625\u0635\u062f\u0627\u0631 \u0645\u062e\u0635\u0648\u0635", "FFmpegSavePathNotFound": "\u0644\u0645 \u0646\u0633\u062a\u0637\u0639 \u062a\u062d\u062f\u064a\u062f \u0645\u0648\u0642\u0639 ffmpeg \u0628\u0627\u0633\u062a\u062e\u062f\u0627\u0645 \u0627\u0644\u0645\u0633\u0627\u0631 \u0627\u0644\u0630\u064a \u0623\u062f\u062e\u0644\u062a\u0647. \u0633\u0648\u0641 \u0646\u062d\u062a\u0627\u062c \u062a\u0637\u0628\u064a\u0642 FFprobe \u0623\u064a\u0636\u0627\u064b \u0648\u064a\u062c\u0628 \u0623\u0646 \u064a\u062a\u0648\u0627\u062c\u062f \u0641\u064a \u0646\u0641\u0633 \u0627\u0644\u0645\u0643\u0627\u0646. \u0625\u0646 \u0647\u0630\u0647 \u0627\u0644\u0623\u062c\u0632\u0627\u0621 \u062a\u0643\u0648\u0646 \u0628\u0627\u0644\u0639\u0627\u062f\u0629 \u0645\u062d\u0632\u0648\u0645\u0629 \u0645\u0639\u0627\u064b \u0641\u064a \u0646\u0641\u0633 \u0645\u0644\u0641 \u0627\u0644\u0625\u0646\u0632\u0627\u0644. \u0627\u0644\u0631\u062c\u0627\u0621 \u0627\u0644\u062a\u0623\u0643\u062f \u0645\u0646 \u0627\u0644\u0645\u0633\u0627\u0631 \u0627\u0644\u0645\u062f\u062e\u0644 \u0648\u0627\u0644\u0645\u062d\u0627\u0648\u0644\u0629 \u0645\u0631\u0629 \u0623\u062e\u0631\u0649.", @@ -1945,5 +1943,7 @@ "LabelPostProcessorArguments": "\u0645\u0639\u0637\u064a\u0627\u062a \u0633\u0637\u0631 \u0627\u0644\u0623\u0648\u0627\u0645\u0631 \u0644\u062a\u0637\u0628\u064a\u0642 \u0645\u0627 \u0628\u0639\u062f \u0627\u0644\u0645\u0639\u0627\u0644\u062c\u0629", "LabelPostProcessorArgumentsHelp": "\u0627\u0633\u062a\u062e\u062f\u0645 \u0627\u0644\u0645\u0633\u0627\u0631: {path} \u0643\u0645\u0633\u0627\u0631 \u0644\u0645\u0644\u0641 \u0627\u0644\u062a\u0633\u062c\u064a\u0644.", "LabelPostProcessor": "\u062a\u0637\u0628\u064a\u0642 \u0645\u0627-\u0628\u0639\u062f-\u0627\u0644\u0645\u0639\u0627\u0644\u062c\u0629", - "ErrorAddingXmlTvFile": "\u0643\u0627\u0646 \u0647\u0646\u0627\u0643 \u062e\u0637\u0623 \u0641\u064a \u0645\u062d\u0627\u0648\u0644\u0629 \u0627\u0644\u0648\u0635\u0648\u0644 \u0625\u0644\u0649 \u0645\u0644\u0641 XmlTV . \u0627\u0644\u0631\u062c\u0627\u0621 \u0627\u0644\u062a\u0623\u0643\u062f \u0645\u0646 \u0648\u062c\u0648\u062f \u0627\u0644\u0645\u0644\u0641 \u062b\u0645 \u062d\u0627\u0648\u0644 \u0645\u0631\u0629 \u0623\u062e\u0631\u0649." + "ErrorAddingXmlTvFile": "\u0643\u0627\u0646 \u0647\u0646\u0627\u0643 \u062e\u0637\u0623 \u0641\u064a \u0645\u062d\u0627\u0648\u0644\u0629 \u0627\u0644\u0648\u0635\u0648\u0644 \u0625\u0644\u0649 \u0645\u0644\u0641 XmlTV . \u0627\u0644\u0631\u062c\u0627\u0621 \u0627\u0644\u062a\u0623\u0643\u062f \u0645\u0646 \u0648\u062c\u0648\u062f \u0627\u0644\u0645\u0644\u0641 \u062b\u0645 \u062d\u0627\u0648\u0644 \u0645\u0631\u0629 \u0623\u062e\u0631\u0649.", + "OptionAutomaticallyGroupSeries": "\u0625\u062f\u0645\u062c \u0627\u0644\u062d\u0644\u0642\u0627\u062a \u0627\u0644\u0645\u0648\u0632\u0639\u0629 \u0628\u064a\u0646 \u0639\u062f\u0629 \u0645\u062c\u0644\u062f\u0627\u062a \u0625\u0644\u0649 \u0645\u062c\u0644\u062f \u0648\u0627\u062d\u062f \u062a\u0644\u0642\u0627\u0626\u064a\u0627\u064b.", + "OptionAutomaticallyGroupSeriesHelp": "\u0641\u064a \u062d\u0627\u0644 \u0627\u0644\u062a\u0641\u0639\u064a\u0644 \u0641\u0625\u0646 \u0627\u0644\u062d\u0644\u0642\u0627\u062a \u0627\u0644\u0645\u0648\u0632\u0639\u0629 \u0628\u064a\u0646 \u0639\u062f\u0629 \u0645\u062c\u0644\u062f\u0627\u062a \u0633\u062a\u062f\u0645\u062c \u062a\u0644\u0642\u0627\u0626\u064a\u0627\u064b \u0641\u064a \u0645\u062c\u0644\u062f \u0645\u0633\u0644\u0633\u0644 \u0648\u0627\u062d\u062f." } \ No newline at end of file diff --git a/MediaBrowser.WebDashboard/dashboard-ui/strings/be-BY.json b/MediaBrowser.WebDashboard/dashboard-ui/strings/be-BY.json index fb33928387..d6ab759e01 100644 --- a/MediaBrowser.WebDashboard/dashboard-ui/strings/be-BY.json +++ b/MediaBrowser.WebDashboard/dashboard-ui/strings/be-BY.json @@ -1,6 +1,4 @@ { - "OptionAutomaticallyGroupSeriesHelp": "If enabled, series that are spread across multiple folders within this library will be automatically merged into a single series.", - "OptionAutomaticallyGroupSeries": "Automatically merge series that are spread across multiple folders", "LabelPrevious": "\u041f\u0430\u043f\u044f\u0440\u044d\u0434\u043d\u044f\u0435", "LabelFinish": "\u0413\u0430\u0442\u043e\u0432\u0430", "LabelNext": "\u041d\u0430\u0441\u0442\u0443\u043f\u043d\u0430\u0435", @@ -173,7 +171,6 @@ "OptionPlayCount": "Play Count", "OptionDatePlayed": "Date Played", "OptionDateAdded": "Date Added", - "DateAddedValue": "Date added: {0}", "OptionAlbumArtist": "Album Artist", "OptionArtist": "Artist", "OptionAlbum": "Album", @@ -1751,7 +1748,7 @@ "HeaderCancelSyncJob": "Cancel Sync", "CancelSyncJobConfirmation": "Cancelling the sync job will remove synced media from the device during the next sync process. Are you sure you wish to proceed?", "LabelQuality": "Quality:", - "MessageBookPluginRequired": "Requires installation of the Bookshelf plugin", + "BookLibraryHelp": "Audio and text books are supported", "MessageGamePluginRequired": "Requires installation of the GameBrowser plugin", "MessageUnsetContentHelp": "Content will be displayed as plain folders. For best results use the metadata manager to set the content types of sub-folders.", "SyncJobItemStatusQueued": "Queued", @@ -1897,6 +1894,7 @@ "DownloadFFmpeg": "Download FFmpeg", "FFmpegSuggestedDownload": "Suggested download: {0}", "UnzipFFmpegFile": "Unzip the downloaded file to a folder of your choice.", + "MarkFFmpegExec": "If you are running Linux or OSX, you will need to locate the ffmpeg and ffprobe files and mark them as executable. This is needed to grant Emby permission to execute them.", "OptionUseSystemInstalledVersion": "Use system installed version", "OptionUseMyCustomVersion": "Use a custom version", "FFmpegSavePathNotFound": "We're unable to locate FFmpeg using the path you've entered. FFprobe is also required and must exist in the same folder. These components are normally bundled together in the same download. Please check the path and try again.", @@ -1945,5 +1943,7 @@ "LabelPostProcessorArguments": "Post-processor command line arguments:", "LabelPostProcessorArgumentsHelp": "Use {path} as the path to the recording file.", "LabelPostProcessor": "Post-processing application:", - "ErrorAddingXmlTvFile": "There was an error accessing the XmlTV file. Please ensure the file exists and try again." + "ErrorAddingXmlTvFile": "There was an error accessing the XmlTV file. Please ensure the file exists and try again.", + "OptionAutomaticallyGroupSeries": "Automatically merge series that are spread across multiple folders", + "OptionAutomaticallyGroupSeriesHelp": "If enabled, series that are spread across multiple folders within this library will be automatically merged into a single series." } \ No newline at end of file diff --git a/MediaBrowser.WebDashboard/dashboard-ui/strings/bg-BG.json b/MediaBrowser.WebDashboard/dashboard-ui/strings/bg-BG.json index e8251c545b..5efb70faf0 100644 --- a/MediaBrowser.WebDashboard/dashboard-ui/strings/bg-BG.json +++ b/MediaBrowser.WebDashboard/dashboard-ui/strings/bg-BG.json @@ -1,6 +1,4 @@ { - "OptionAutomaticallyGroupSeriesHelp": "If enabled, series that are spread across multiple folders within this library will be automatically merged into a single series.", - "OptionAutomaticallyGroupSeries": "Automatically merge series that are spread across multiple folders", "LabelPrevious": "\u041f\u0440\u0435\u0434\u0438\u0448\u0435\u043d", "LabelFinish": "\u041a\u0440\u0430\u0439", "LabelNext": "\u0421\u043b\u0435\u0434\u0432\u0430\u0449", @@ -173,7 +171,6 @@ "OptionPlayCount": "\u0411\u0440\u043e\u0439 \u043f\u0443\u0441\u043a\u0430\u043d\u0438\u044f", "OptionDatePlayed": "\u0414\u0430\u0442\u0430 \u043d\u0430 \u043f\u0443\u0441\u043a\u0430\u043d\u0435", "OptionDateAdded": "\u0414\u0430\u0442\u0430 \u043d\u0430 \u0434\u043e\u0431\u0430\u0432\u044f\u043d\u0435", - "DateAddedValue": "Date added: {0}", "OptionAlbumArtist": "\u0410\u043b\u0431\u0443\u043c\u043e\u0432 \u0410\u0440\u0442\u0438\u0441\u0442", "OptionArtist": "\u0410\u0440\u0442\u0438\u0441\u0442", "OptionAlbum": "\u0410\u043b\u0431\u0443\u043c", @@ -1751,7 +1748,7 @@ "HeaderCancelSyncJob": "Cancel Sync", "CancelSyncJobConfirmation": "Cancelling the sync job will remove synced media from the device during the next sync process. Are you sure you wish to proceed?", "LabelQuality": "Quality:", - "MessageBookPluginRequired": "Requires installation of the Bookshelf plugin", + "BookLibraryHelp": "Audio and text books are supported", "MessageGamePluginRequired": "Requires installation of the GameBrowser plugin", "MessageUnsetContentHelp": "Content will be displayed as plain folders. For best results use the metadata manager to set the content types of sub-folders.", "SyncJobItemStatusQueued": "Queued", @@ -1897,6 +1894,7 @@ "DownloadFFmpeg": "Download FFmpeg", "FFmpegSuggestedDownload": "Suggested download: {0}", "UnzipFFmpegFile": "Unzip the downloaded file to a folder of your choice.", + "MarkFFmpegExec": "If you are running Linux or OSX, you will need to locate the ffmpeg and ffprobe files and mark them as executable. This is needed to grant Emby permission to execute them.", "OptionUseSystemInstalledVersion": "Use system installed version", "OptionUseMyCustomVersion": "Use a custom version", "FFmpegSavePathNotFound": "We're unable to locate FFmpeg using the path you've entered. FFprobe is also required and must exist in the same folder. These components are normally bundled together in the same download. Please check the path and try again.", @@ -1945,5 +1943,7 @@ "LabelPostProcessorArguments": "Post-processor command line arguments:", "LabelPostProcessorArgumentsHelp": "Use {path} as the path to the recording file.", "LabelPostProcessor": "Post-processing application:", - "ErrorAddingXmlTvFile": "There was an error accessing the XmlTV file. Please ensure the file exists and try again." + "ErrorAddingXmlTvFile": "There was an error accessing the XmlTV file. Please ensure the file exists and try again.", + "OptionAutomaticallyGroupSeries": "Automatically merge series that are spread across multiple folders", + "OptionAutomaticallyGroupSeriesHelp": "If enabled, series that are spread across multiple folders within this library will be automatically merged into a single series." } \ No newline at end of file diff --git a/MediaBrowser.WebDashboard/dashboard-ui/strings/ca.json b/MediaBrowser.WebDashboard/dashboard-ui/strings/ca.json index 46eb8a64d0..d4ece1a25b 100644 --- a/MediaBrowser.WebDashboard/dashboard-ui/strings/ca.json +++ b/MediaBrowser.WebDashboard/dashboard-ui/strings/ca.json @@ -1,6 +1,4 @@ { - "OptionAutomaticallyGroupSeriesHelp": "If enabled, series that are spread across multiple folders within this library will be automatically merged into a single series.", - "OptionAutomaticallyGroupSeries": "Automatically merge series that are spread across multiple folders", "LabelPrevious": "Anterior", "LabelFinish": "Finalitzar", "LabelNext": "Seg\u00fcent", @@ -173,7 +171,6 @@ "OptionPlayCount": "Nombre de Reproduccions", "OptionDatePlayed": "Data de Reproducci\u00f3", "OptionDateAdded": "Data afegida", - "DateAddedValue": "Date added: {0}", "OptionAlbumArtist": "Album Artist", "OptionArtist": "Artista", "OptionAlbum": "\u00c0lbum", @@ -1751,7 +1748,7 @@ "HeaderCancelSyncJob": "Cancel Sync", "CancelSyncJobConfirmation": "Cancelling the sync job will remove synced media from the device during the next sync process. Are you sure you wish to proceed?", "LabelQuality": "Qualitat", - "MessageBookPluginRequired": "Requires installation of the Bookshelf plugin", + "BookLibraryHelp": "Audio and text books are supported", "MessageGamePluginRequired": "Requires installation of the GameBrowser plugin", "MessageUnsetContentHelp": "Content will be displayed as plain folders. For best results use the metadata manager to set the content types of sub-folders.", "SyncJobItemStatusQueued": "En cua", @@ -1897,6 +1894,7 @@ "DownloadFFmpeg": "Download FFmpeg", "FFmpegSuggestedDownload": "Suggested download: {0}", "UnzipFFmpegFile": "Unzip the downloaded file to a folder of your choice.", + "MarkFFmpegExec": "If you are running Linux or OSX, you will need to locate the ffmpeg and ffprobe files and mark them as executable. This is needed to grant Emby permission to execute them.", "OptionUseSystemInstalledVersion": "Use system installed version", "OptionUseMyCustomVersion": "Use a custom version", "FFmpegSavePathNotFound": "We're unable to locate FFmpeg using the path you've entered. FFprobe is also required and must exist in the same folder. These components are normally bundled together in the same download. Please check the path and try again.", @@ -1945,5 +1943,7 @@ "LabelPostProcessorArguments": "Post-processor command line arguments:", "LabelPostProcessorArgumentsHelp": "Use {path} as the path to the recording file.", "LabelPostProcessor": "Post-processing application:", - "ErrorAddingXmlTvFile": "There was an error accessing the XmlTV file. Please ensure the file exists and try again." + "ErrorAddingXmlTvFile": "There was an error accessing the XmlTV file. Please ensure the file exists and try again.", + "OptionAutomaticallyGroupSeries": "Automatically merge series that are spread across multiple folders", + "OptionAutomaticallyGroupSeriesHelp": "If enabled, series that are spread across multiple folders within this library will be automatically merged into a single series." } \ No newline at end of file diff --git a/MediaBrowser.WebDashboard/dashboard-ui/strings/cs.json b/MediaBrowser.WebDashboard/dashboard-ui/strings/cs.json index e87220b576..4d235f3bae 100644 --- a/MediaBrowser.WebDashboard/dashboard-ui/strings/cs.json +++ b/MediaBrowser.WebDashboard/dashboard-ui/strings/cs.json @@ -1,6 +1,4 @@ { - "OptionAutomaticallyGroupSeriesHelp": "If enabled, series that are spread across multiple folders within this library will be automatically merged into a single series.", - "OptionAutomaticallyGroupSeries": "Automatically merge series that are spread across multiple folders", "LabelPrevious": "P\u0159edchoz\u00ed", "LabelFinish": "Dokon\u010dit", "LabelNext": "Dal\u0161\u00ed", @@ -173,7 +171,6 @@ "OptionPlayCount": "Po\u010det p\u0159ehr\u00e1n\u00ed", "OptionDatePlayed": "Datum p\u0159ehr\u00e1n\u00ed", "OptionDateAdded": "Datum p\u0159id\u00e1n\u00ed", - "DateAddedValue": "Date added: {0}", "OptionAlbumArtist": "Um\u011blec Alba", "OptionArtist": "Um\u011blec", "OptionAlbum": "Album", @@ -1751,7 +1748,7 @@ "HeaderCancelSyncJob": "Zru\u0161it synchronizaci", "CancelSyncJobConfirmation": "Zru\u0161en\u00edm synchroniza\u010dn\u00edch \u00faloh budou odstran\u011bna synchronizovan\u00e1 m\u00e9dia ze za\u0159\u00edzen\u00ed b\u011bhem p\u0159\u00ed\u0161t\u00edho synchroniza\u010dn\u00edho procesu. Jste si jisti, \u017ee chcete pokra\u010dovat?", "LabelQuality": "Kvalita:", - "MessageBookPluginRequired": "Vy\u017eaduje instalaci Bookshelf z\u00e1suvn\u00e9ho modulu", + "BookLibraryHelp": "Audio and text books are supported", "MessageGamePluginRequired": "Vy\u017eaduje instalaci z\u00e1suvn\u00e9ho modulu GameBrowser", "MessageUnsetContentHelp": "Obsah je zobrazen pomoc\u00ed prost\u00fdch slo\u017eek. Pro dosa\u017een\u00ed nejlep\u0161\u00edch v\u00fdsledk\u016f pomoc\u00ed spr\u00e1vce metadat nastavte typy obsahu pod-slo\u017eek.", "SyncJobItemStatusQueued": "P\u0159id\u00e1no do fronty", @@ -1897,6 +1894,7 @@ "DownloadFFmpeg": "St\u00e1hni FFmpeg", "FFmpegSuggestedDownload": "Doporu\u010den\u00e9 sta\u017een\u00ed: {0}", "UnzipFFmpegFile": "Rozbalte sta\u017een\u00fd soubor do slo\u017eky dle vlastn\u00edho v\u00fdb\u011bru.", + "MarkFFmpegExec": "If you are running Linux or OSX, you will need to locate the ffmpeg and ffprobe files and mark them as executable. This is needed to grant Emby permission to execute them.", "OptionUseSystemInstalledVersion": "Pou\u017eit\u00ed syst\u00e9movou verzi", "OptionUseMyCustomVersion": "Pou\u017e\u00edt vlastn\u00ed verzi", "FFmpegSavePathNotFound": "Nepoda\u0159ilo se n\u00e1m naj\u00edt FFmpeg pomoc\u00ed cesty, kterou jste zadali. FFprobe je tak\u00e9 zapot\u0159eb\u00ed a mus\u00ed existovat ve stejn\u00e9 slo\u017ece. Tyto aplikace jsou obvykle instalov\u00e1ny spole\u010dn\u011b ve stejn\u00e9 slo\u017ece. Zkontrolujte cestu a zkuste to znovu.", @@ -1945,5 +1943,7 @@ "LabelPostProcessorArguments": "Post-processor command line arguments:", "LabelPostProcessorArgumentsHelp": "Use {path} as the path to the recording file.", "LabelPostProcessor": "Post-processing application:", - "ErrorAddingXmlTvFile": "There was an error accessing the XmlTV file. Please ensure the file exists and try again." + "ErrorAddingXmlTvFile": "There was an error accessing the XmlTV file. Please ensure the file exists and try again.", + "OptionAutomaticallyGroupSeries": "Automatically merge series that are spread across multiple folders", + "OptionAutomaticallyGroupSeriesHelp": "If enabled, series that are spread across multiple folders within this library will be automatically merged into a single series." } \ No newline at end of file diff --git a/MediaBrowser.WebDashboard/dashboard-ui/strings/da.json b/MediaBrowser.WebDashboard/dashboard-ui/strings/da.json index fbf4fc6e5e..2150303478 100644 --- a/MediaBrowser.WebDashboard/dashboard-ui/strings/da.json +++ b/MediaBrowser.WebDashboard/dashboard-ui/strings/da.json @@ -1,6 +1,4 @@ { - "OptionAutomaticallyGroupSeriesHelp": "If enabled, series that are spread across multiple folders within this library will be automatically merged into a single series.", - "OptionAutomaticallyGroupSeries": "Automatically merge series that are spread across multiple folders", "LabelPrevious": "Forrige", "LabelFinish": "Slut", "LabelNext": "N\u00e6ste", @@ -173,7 +171,6 @@ "OptionPlayCount": "Gange afspillet", "OptionDatePlayed": "Dato for afspilning", "OptionDateAdded": "Dato for tilf\u00f8jelse", - "DateAddedValue": "Date added: {0}", "OptionAlbumArtist": "Album-artist", "OptionArtist": "Artist", "OptionAlbum": "Album", @@ -1751,7 +1748,7 @@ "HeaderCancelSyncJob": "Afbryd synkronisering", "CancelSyncJobConfirmation": "Afbrydelse af synkroniseringen vil fjerne medier fra enheden under n\u00e6ste synkroniseringsproces. Er du sikker p\u00e5 du \u00f8nsker at forts\u00e6tte?", "LabelQuality": "Kvalitet:", - "MessageBookPluginRequired": "Kr\u00e6ver installation af Bookshelf tilf\u00f8jelsen", + "BookLibraryHelp": "Audio and text books are supported", "MessageGamePluginRequired": "Kr\u00e6ver installation af GameBrowser tilf\u00f8jelsen", "MessageUnsetContentHelp": "Indhold vil blive vist som almindelige mapper. For det bedste resultat benyt metadata manageren til at v\u00e6lge indholdstypen i undermapper.", "SyncJobItemStatusQueued": "Sat i k\u00f8", @@ -1897,6 +1894,7 @@ "DownloadFFmpeg": "Download FFmpeg", "FFmpegSuggestedDownload": "Suggested download: {0}", "UnzipFFmpegFile": "Unzip the downloaded file to a folder of your choice.", + "MarkFFmpegExec": "If you are running Linux or OSX, you will need to locate the ffmpeg and ffprobe files and mark them as executable. This is needed to grant Emby permission to execute them.", "OptionUseSystemInstalledVersion": "Use system installed version", "OptionUseMyCustomVersion": "Use a custom version", "FFmpegSavePathNotFound": "We're unable to locate FFmpeg using the path you've entered. FFprobe is also required and must exist in the same folder. These components are normally bundled together in the same download. Please check the path and try again.", @@ -1945,5 +1943,7 @@ "LabelPostProcessorArguments": "Post-processor command line arguments:", "LabelPostProcessorArgumentsHelp": "Use {path} as the path to the recording file.", "LabelPostProcessor": "Post-processing application:", - "ErrorAddingXmlTvFile": "There was an error accessing the XmlTV file. Please ensure the file exists and try again." + "ErrorAddingXmlTvFile": "There was an error accessing the XmlTV file. Please ensure the file exists and try again.", + "OptionAutomaticallyGroupSeries": "Automatically merge series that are spread across multiple folders", + "OptionAutomaticallyGroupSeriesHelp": "If enabled, series that are spread across multiple folders within this library will be automatically merged into a single series." } \ No newline at end of file diff --git a/MediaBrowser.WebDashboard/dashboard-ui/strings/de-DE.json b/MediaBrowser.WebDashboard/dashboard-ui/strings/de-DE.json index e6a8ac7e7e..e8292afa20 100644 --- a/MediaBrowser.WebDashboard/dashboard-ui/strings/de-DE.json +++ b/MediaBrowser.WebDashboard/dashboard-ui/strings/de-DE.json @@ -1,6 +1,4 @@ { - "OptionAutomaticallyGroupSeriesHelp": "If enabled, series that are spread across multiple folders within this library will be automatically merged into a single series.", - "OptionAutomaticallyGroupSeries": "Automatically merge series that are spread across multiple folders", "LabelPrevious": "Previous", "LabelFinish": "Finish", "LabelNext": "Next", @@ -173,7 +171,6 @@ "OptionPlayCount": "Play Count", "OptionDatePlayed": "Date Played", "OptionDateAdded": "Date Added", - "DateAddedValue": "Date added: {0}", "OptionAlbumArtist": "Album Artist", "OptionArtist": "Artist", "OptionAlbum": "Album", @@ -1751,7 +1748,7 @@ "HeaderCancelSyncJob": "Cancel Sync", "CancelSyncJobConfirmation": "Cancelling the sync job will remove synced media from the device during the next sync process. Are you sure you wish to proceed?", "LabelQuality": "Quality:", - "MessageBookPluginRequired": "Requires installation of the Bookshelf plugin", + "BookLibraryHelp": "Audio and text books are supported", "MessageGamePluginRequired": "Requires installation of the GameBrowser plugin", "MessageUnsetContentHelp": "Content will be displayed as plain folders. For best results use the metadata manager to set the content types of sub-folders.", "SyncJobItemStatusQueued": "Queued", @@ -1897,6 +1894,7 @@ "DownloadFFmpeg": "Download FFmpeg", "FFmpegSuggestedDownload": "Suggested download: {0}", "UnzipFFmpegFile": "Unzip the downloaded file to a folder of your choice.", + "MarkFFmpegExec": "If you are running Linux or OSX, you will need to locate the ffmpeg and ffprobe files and mark them as executable. This is needed to grant Emby permission to execute them.", "OptionUseSystemInstalledVersion": "Use system installed version", "OptionUseMyCustomVersion": "Use a custom version", "FFmpegSavePathNotFound": "We're unable to locate FFmpeg using the path you've entered. FFprobe is also required and must exist in the same folder. These components are normally bundled together in the same download. Please check the path and try again.", @@ -1945,5 +1943,7 @@ "LabelPostProcessorArguments": "Post-processor command line arguments:", "LabelPostProcessorArgumentsHelp": "Use {path} as the path to the recording file.", "LabelPostProcessor": "Post-processing application:", - "ErrorAddingXmlTvFile": "There was an error accessing the XmlTV file. Please ensure the file exists and try again." + "ErrorAddingXmlTvFile": "There was an error accessing the XmlTV file. Please ensure the file exists and try again.", + "OptionAutomaticallyGroupSeries": "Automatically merge series that are spread across multiple folders", + "OptionAutomaticallyGroupSeriesHelp": "If enabled, series that are spread across multiple folders within this library will be automatically merged into a single series." } \ No newline at end of file diff --git a/MediaBrowser.WebDashboard/dashboard-ui/strings/de.json b/MediaBrowser.WebDashboard/dashboard-ui/strings/de.json index 4d6c59dfc7..5ca9ae4bcc 100644 --- a/MediaBrowser.WebDashboard/dashboard-ui/strings/de.json +++ b/MediaBrowser.WebDashboard/dashboard-ui/strings/de.json @@ -1,6 +1,4 @@ { - "OptionAutomaticallyGroupSeriesHelp": "Wenn aktiviert, werden Inhalte einer Serie in verschiedenen Ordnern innerhalb einer Bibliothek als eine Serie angezeigt.", - "OptionAutomaticallyGroupSeries": "Vermische Serieninhalte, die in verschiedenen Ordnern abgelegt sind.", "LabelPrevious": "Vorheriges", "LabelFinish": "Fertig", "LabelNext": "N\u00e4chstes", @@ -173,7 +171,6 @@ "OptionPlayCount": "Z\u00e4hler", "OptionDatePlayed": "Abgespielt am", "OptionDateAdded": "Hinzugef\u00fcgt am", - "DateAddedValue": "Hinzugef\u00fcgt am: {0}", "OptionAlbumArtist": "Album-Interpret", "OptionArtist": "Interpret", "OptionAlbum": "Album", @@ -1751,7 +1748,7 @@ "HeaderCancelSyncJob": "Synchronisierung abbrechen", "CancelSyncJobConfirmation": "Der Abbruch der Synchronisation wird bereits synchronisierte Medien bei der n\u00e4chsten Synchronisation vom Ger\u00e4t l\u00f6schen. M\u00f6chten Sie wirklich fortfahren?", "LabelQuality": "Qualit\u00e4t:", - "MessageBookPluginRequired": "Setzt die Installation des Bookshelf-Plugins voraus.", + "BookLibraryHelp": "H\u00f6rb\u00fccher und E-Books werden unterst\u00fctzt", "MessageGamePluginRequired": "Setzt die Installation des GameBrowser-Plugins voraus.", "MessageUnsetContentHelp": "Inhalte werden als Verzeichnisse dargestellt. F\u00fcr eine besser Anzeige nutzen Sie nach M\u00f6glichkeit den Meta-Data Manager und w\u00e4hlen Sie einen Medien-Typen f\u00fcr Unterverzeichnisse.", "SyncJobItemStatusQueued": "in Warteschlange", @@ -1897,6 +1894,7 @@ "DownloadFFmpeg": "Download FFmpeg", "FFmpegSuggestedDownload": "Empfohlener download: {0}", "UnzipFFmpegFile": "Entpacke den Download in ein Verzeichnis Deiner Wahl.", + "MarkFFmpegExec": "Wenn du Linux oder OSX benutzt, musst du zu ffmpeg und ffprobe navigieren und sie als ausf\u00fchrbar machen. Dieser Schritt wird ben\u00f6tigt, um Emby die Rechte zur Ausf\u00fchrung zu geben.", "OptionUseSystemInstalledVersion": "Systeminstallierte Version verwenden", "OptionUseMyCustomVersion": "Eigene Version verwenden", "FFmpegSavePathNotFound": "Wir konnten kein FFmpeg in dem von Dir erfassten Verzeichnis finden. FFprobe wird ebenso ben\u00f6tigt und muss sich im gleichen Verzeichnis befinden. Diese Komponenten sind normalerweise in einem Paket vorhanden um kommen zusammen mit einem Download. Bitte pr\u00fcfe das Verzeichnis und probiere es erneut.", @@ -1945,5 +1943,7 @@ "LabelPostProcessorArguments": "Nachbearbeitung Kommandozeilen-Argumente:", "LabelPostProcessorArgumentsHelp": "Verwende {path} als das Verzeichnis f\u00fcr Aufnahmen.", "LabelPostProcessor": "Nachbearbeitungs Anwendung:", - "ErrorAddingXmlTvFile": "Fehler beim Zugriff auf die XmlTV Datei. Stelle bitte sicher, dass die Datei existiert und versuche es nochmal." + "ErrorAddingXmlTvFile": "Fehler beim Zugriff auf die XmlTV Datei. Stelle bitte sicher, dass die Datei existiert und versuche es nochmal.", + "OptionAutomaticallyGroupSeries": "Vermische Serieninhalte, die in verschiedenen Ordnern abgelegt sind.", + "OptionAutomaticallyGroupSeriesHelp": "Wenn aktiviert, werden Inhalte einer Serie in verschiedenen Ordnern innerhalb einer Bibliothek als eine Serie angezeigt." } \ No newline at end of file diff --git a/MediaBrowser.WebDashboard/dashboard-ui/strings/el.json b/MediaBrowser.WebDashboard/dashboard-ui/strings/el.json index 93480f13f6..d181958d43 100644 --- a/MediaBrowser.WebDashboard/dashboard-ui/strings/el.json +++ b/MediaBrowser.WebDashboard/dashboard-ui/strings/el.json @@ -1,6 +1,4 @@ { - "OptionAutomaticallyGroupSeriesHelp": "If enabled, series that are spread across multiple folders within this library will be automatically merged into a single series.", - "OptionAutomaticallyGroupSeries": "Automatically merge series that are spread across multiple folders", "LabelPrevious": "\u03a0\u03c1\u03bf\u03b7\u03b3\u03bf\u03cd\u03bc\u03b5\u03bd\u03bf\u03c2", "LabelFinish": "\u03a4\u03ad\u03bb\u03bf\u03c2", "LabelNext": "\u0395\u03c0\u03cc\u03bc\u03b5\u03bd\u03bf", @@ -173,7 +171,6 @@ "OptionPlayCount": "\u03a6\u03bf\u03c1\u03ad\u03c2 \u0391\u03bd\u03b1\u03c0\u03b1\u03c1\u03b1\u03b3\u03c9\u03b3\u03ae\u03c2", "OptionDatePlayed": "\u0397\u03bc\u03b5\u03c1\u03bf\u03bc\u03b7\u03bd\u03af\u03b1 \u0391\u03bd\u03b1\u03c0\u03b1\u03c1\u03b1\u03b3\u03c9\u03b3\u03ae\u03c2", "OptionDateAdded": "\u0397\u03bc\u03b5\u03c1\u03bf\u03bc\u03b7\u03bd\u03af\u03b1 \u03c0\u03c1\u03bf\u03c3\u03b8\u03ae\u03ba\u03b7\u03c2", - "DateAddedValue": "Date added: {0}", "OptionAlbumArtist": "\u03ac\u03bb\u03bc\u03c0\u03bf\u03c5\u03bc \u039a\u03b1\u03bb\u03bb\u03b9\u03c4\u03ad\u03c7\u03bd\u03b5\u03c2", "OptionArtist": " \u039a\u03b1\u03bb\u03bb\u03b9\u03c4\u03ad\u03c7\u03bd\u03b5\u03c2", "OptionAlbum": "\u0386\u03bb\u03bc\u03c0\u03bf\u03c5\u03bc", @@ -1751,7 +1748,7 @@ "HeaderCancelSyncJob": "Cancel Sync", "CancelSyncJobConfirmation": "Cancelling the sync job will remove synced media from the device during the next sync process. Are you sure you wish to proceed?", "LabelQuality": "Quality:", - "MessageBookPluginRequired": "Requires installation of the Bookshelf plugin", + "BookLibraryHelp": "Audio and text books are supported", "MessageGamePluginRequired": "Requires installation of the GameBrowser plugin", "MessageUnsetContentHelp": "Content will be displayed as plain folders. For best results use the metadata manager to set the content types of sub-folders.", "SyncJobItemStatusQueued": "Queued", @@ -1897,6 +1894,7 @@ "DownloadFFmpeg": "Download FFmpeg", "FFmpegSuggestedDownload": "Suggested download: {0}", "UnzipFFmpegFile": "Unzip the downloaded file to a folder of your choice.", + "MarkFFmpegExec": "If you are running Linux or OSX, you will need to locate the ffmpeg and ffprobe files and mark them as executable. This is needed to grant Emby permission to execute them.", "OptionUseSystemInstalledVersion": "Use system installed version", "OptionUseMyCustomVersion": "Use a custom version", "FFmpegSavePathNotFound": "We're unable to locate FFmpeg using the path you've entered. FFprobe is also required and must exist in the same folder. These components are normally bundled together in the same download. Please check the path and try again.", @@ -1945,5 +1943,7 @@ "LabelPostProcessorArguments": "Post-processor command line arguments:", "LabelPostProcessorArgumentsHelp": "Use {path} as the path to the recording file.", "LabelPostProcessor": "Post-processing application:", - "ErrorAddingXmlTvFile": "There was an error accessing the XmlTV file. Please ensure the file exists and try again." + "ErrorAddingXmlTvFile": "There was an error accessing the XmlTV file. Please ensure the file exists and try again.", + "OptionAutomaticallyGroupSeries": "Automatically merge series that are spread across multiple folders", + "OptionAutomaticallyGroupSeriesHelp": "If enabled, series that are spread across multiple folders within this library will be automatically merged into a single series." } \ No newline at end of file diff --git a/MediaBrowser.WebDashboard/dashboard-ui/strings/en-GB.json b/MediaBrowser.WebDashboard/dashboard-ui/strings/en-GB.json index 3d1946baf0..d7bff3990b 100644 --- a/MediaBrowser.WebDashboard/dashboard-ui/strings/en-GB.json +++ b/MediaBrowser.WebDashboard/dashboard-ui/strings/en-GB.json @@ -1,6 +1,4 @@ { - "OptionAutomaticallyGroupSeriesHelp": "If enabled, series that are spread across multiple folders within this library will be automatically merged into a single series.", - "OptionAutomaticallyGroupSeries": "Automatically merge series that are spread across multiple folders", "LabelPrevious": "Previous", "LabelFinish": "Finish", "LabelNext": "Next", @@ -173,7 +171,6 @@ "OptionPlayCount": "Play Count", "OptionDatePlayed": "Date Played", "OptionDateAdded": "Date Added", - "DateAddedValue": "Date added: {0}", "OptionAlbumArtist": "Album Artist", "OptionArtist": "Artist", "OptionAlbum": "Album", @@ -1751,7 +1748,7 @@ "HeaderCancelSyncJob": "Cancel Sync", "CancelSyncJobConfirmation": "Cancelling the sync job will remove synced media from the device during the next sync process. Are you sure you wish to proceed?", "LabelQuality": "Quality:", - "MessageBookPluginRequired": "Requires installation of the Bookshelf plugin", + "BookLibraryHelp": "Audio and text books are supported", "MessageGamePluginRequired": "Requires installation of the GameBrowser plugin", "MessageUnsetContentHelp": "Content will be displayed as plain folders. For best results use the metadata manager to set the content types of sub-folders.", "SyncJobItemStatusQueued": "Queued", @@ -1897,6 +1894,7 @@ "DownloadFFmpeg": "Download FFmpeg", "FFmpegSuggestedDownload": "Suggested download: {0}", "UnzipFFmpegFile": "Unzip the downloaded file to a folder of your choice.", + "MarkFFmpegExec": "If you are running Linux or OSX, you will need to locate the ffmpeg and ffprobe files and mark them as executable. This is needed to grant Emby permission to execute them.", "OptionUseSystemInstalledVersion": "Use system installed version", "OptionUseMyCustomVersion": "Use a custom version", "FFmpegSavePathNotFound": "We're unable to locate FFmpeg using the path you've entered. FFprobe is also required and must exist in the same folder. These components are normally bundled together in the same download. Please check the path and try again.", @@ -1945,5 +1943,7 @@ "LabelPostProcessorArguments": "Post-processor command line arguments:", "LabelPostProcessorArgumentsHelp": "Use {path} as the path to the recording file.", "LabelPostProcessor": "Post-processing application:", - "ErrorAddingXmlTvFile": "There was an error accessing the XmlTV file. Please ensure the file exists and try again." + "ErrorAddingXmlTvFile": "There was an error accessing the XmlTV file. Please ensure the file exists and try again.", + "OptionAutomaticallyGroupSeries": "Automatically merge series that are spread across multiple folders", + "OptionAutomaticallyGroupSeriesHelp": "If enabled, series that are spread across multiple folders within this library will be automatically merged into a single series." } \ No newline at end of file diff --git a/MediaBrowser.WebDashboard/dashboard-ui/strings/es-AR.json b/MediaBrowser.WebDashboard/dashboard-ui/strings/es-AR.json index 555873a62e..b50d36d1f7 100644 --- a/MediaBrowser.WebDashboard/dashboard-ui/strings/es-AR.json +++ b/MediaBrowser.WebDashboard/dashboard-ui/strings/es-AR.json @@ -1,6 +1,4 @@ { - "OptionAutomaticallyGroupSeriesHelp": "If enabled, series that are spread across multiple folders within this library will be automatically merged into a single series.", - "OptionAutomaticallyGroupSeries": "Automatically merge series that are spread across multiple folders", "LabelPrevious": "Previous", "LabelFinish": "Finish", "LabelNext": "Next", @@ -173,7 +171,6 @@ "OptionPlayCount": "Play Count", "OptionDatePlayed": "Date Played", "OptionDateAdded": "Date Added", - "DateAddedValue": "Date added: {0}", "OptionAlbumArtist": "Album Artist", "OptionArtist": "Artist", "OptionAlbum": "Album", @@ -1751,7 +1748,7 @@ "HeaderCancelSyncJob": "Cancel Sync", "CancelSyncJobConfirmation": "Cancelling the sync job will remove synced media from the device during the next sync process. Are you sure you wish to proceed?", "LabelQuality": "Quality:", - "MessageBookPluginRequired": "Requires installation of the Bookshelf plugin", + "BookLibraryHelp": "Audio and text books are supported", "MessageGamePluginRequired": "Requires installation of the GameBrowser plugin", "MessageUnsetContentHelp": "Content will be displayed as plain folders. For best results use the metadata manager to set the content types of sub-folders.", "SyncJobItemStatusQueued": "Queued", @@ -1897,6 +1894,7 @@ "DownloadFFmpeg": "Download FFmpeg", "FFmpegSuggestedDownload": "Suggested download: {0}", "UnzipFFmpegFile": "Unzip the downloaded file to a folder of your choice.", + "MarkFFmpegExec": "If you are running Linux or OSX, you will need to locate the ffmpeg and ffprobe files and mark them as executable. This is needed to grant Emby permission to execute them.", "OptionUseSystemInstalledVersion": "Use system installed version", "OptionUseMyCustomVersion": "Use a custom version", "FFmpegSavePathNotFound": "We're unable to locate FFmpeg using the path you've entered. FFprobe is also required and must exist in the same folder. These components are normally bundled together in the same download. Please check the path and try again.", @@ -1945,5 +1943,7 @@ "LabelPostProcessorArguments": "Post-processor command line arguments:", "LabelPostProcessorArgumentsHelp": "Use {path} as the path to the recording file.", "LabelPostProcessor": "Post-processing application:", - "ErrorAddingXmlTvFile": "There was an error accessing the XmlTV file. Please ensure the file exists and try again." + "ErrorAddingXmlTvFile": "There was an error accessing the XmlTV file. Please ensure the file exists and try again.", + "OptionAutomaticallyGroupSeries": "Automatically merge series that are spread across multiple folders", + "OptionAutomaticallyGroupSeriesHelp": "If enabled, series that are spread across multiple folders within this library will be automatically merged into a single series." } \ No newline at end of file diff --git a/MediaBrowser.WebDashboard/dashboard-ui/strings/es-ES.json b/MediaBrowser.WebDashboard/dashboard-ui/strings/es-ES.json index 1d21fc2eaf..94eff9bfd0 100644 --- a/MediaBrowser.WebDashboard/dashboard-ui/strings/es-ES.json +++ b/MediaBrowser.WebDashboard/dashboard-ui/strings/es-ES.json @@ -1,6 +1,4 @@ { - "OptionAutomaticallyGroupSeriesHelp": "If enabled, series that are spread across multiple folders within this library will be automatically merged into a single series.", - "OptionAutomaticallyGroupSeries": "Automatically merge series that are spread across multiple folders", "LabelPrevious": "Anterior", "LabelFinish": "Terminar", "LabelNext": "Siguiente", @@ -173,7 +171,6 @@ "OptionPlayCount": "Play Count", "OptionDatePlayed": "Date Played", "OptionDateAdded": "Date Added", - "DateAddedValue": "Date added: {0}", "OptionAlbumArtist": "Album Artist", "OptionArtist": "Artist", "OptionAlbum": "Album", @@ -1751,7 +1748,7 @@ "HeaderCancelSyncJob": "Cancel Sync", "CancelSyncJobConfirmation": "Cancelling the sync job will remove synced media from the device during the next sync process. Are you sure you wish to proceed?", "LabelQuality": "Quality:", - "MessageBookPluginRequired": "Requires installation of the Bookshelf plugin", + "BookLibraryHelp": "Audio and text books are supported", "MessageGamePluginRequired": "Requires installation of the GameBrowser plugin", "MessageUnsetContentHelp": "Content will be displayed as plain folders. For best results use the metadata manager to set the content types of sub-folders.", "SyncJobItemStatusQueued": "Queued", @@ -1897,6 +1894,7 @@ "DownloadFFmpeg": "Download FFmpeg", "FFmpegSuggestedDownload": "Suggested download: {0}", "UnzipFFmpegFile": "Unzip the downloaded file to a folder of your choice.", + "MarkFFmpegExec": "If you are running Linux or OSX, you will need to locate the ffmpeg and ffprobe files and mark them as executable. This is needed to grant Emby permission to execute them.", "OptionUseSystemInstalledVersion": "Use system installed version", "OptionUseMyCustomVersion": "Use a custom version", "FFmpegSavePathNotFound": "We're unable to locate FFmpeg using the path you've entered. FFprobe is also required and must exist in the same folder. These components are normally bundled together in the same download. Please check the path and try again.", @@ -1945,5 +1943,7 @@ "LabelPostProcessorArguments": "Post-processor command line arguments:", "LabelPostProcessorArgumentsHelp": "Use {path} as the path to the recording file.", "LabelPostProcessor": "Post-processing application:", - "ErrorAddingXmlTvFile": "There was an error accessing the XmlTV file. Please ensure the file exists and try again." + "ErrorAddingXmlTvFile": "There was an error accessing the XmlTV file. Please ensure the file exists and try again.", + "OptionAutomaticallyGroupSeries": "Automatically merge series that are spread across multiple folders", + "OptionAutomaticallyGroupSeriesHelp": "If enabled, series that are spread across multiple folders within this library will be automatically merged into a single series." } \ No newline at end of file diff --git a/MediaBrowser.WebDashboard/dashboard-ui/strings/es-MX.json b/MediaBrowser.WebDashboard/dashboard-ui/strings/es-MX.json index 3ac41c0dfd..e9493e7029 100644 --- a/MediaBrowser.WebDashboard/dashboard-ui/strings/es-MX.json +++ b/MediaBrowser.WebDashboard/dashboard-ui/strings/es-MX.json @@ -1,6 +1,4 @@ { - "OptionAutomaticallyGroupSeriesHelp": "Si se habilita, las series que se reparten a trav\u00e9s de m\u00faltiples carpetas dentro de esta biblioteca ser\u00e1n fusionadas en una sola serie.", - "OptionAutomaticallyGroupSeries": "Fusionar autom\u00e1ticamente series esparcidas a trav\u00e9s de m\u00faltiples carpetas.", "LabelPrevious": "Anterior", "LabelFinish": "Terminar", "LabelNext": "Siguiente", @@ -173,7 +171,6 @@ "OptionPlayCount": "Contador", "OptionDatePlayed": "Fecha de Reproducci\u00f3n", "OptionDateAdded": "Fecha de Adici\u00f3n", - "DateAddedValue": "Fecha de adici\u00f3n: {0}", "OptionAlbumArtist": "Artista del \u00c1lbum", "OptionArtist": "Artista", "OptionAlbum": "\u00c1lbum", @@ -1751,7 +1748,7 @@ "HeaderCancelSyncJob": "Cancelar Sinc.", "CancelSyncJobConfirmation": "Cancelando el trabajo de sincronizaci\u00f3n eliminara los medios sincronizados del dispositivo durante el pr\u00f3ximo proceso de sincronizaci\u00f3n. \u00bfEsta seguro de que desea continuar?", "LabelQuality": "Calidad:", - "MessageBookPluginRequired": "Requiere instalaci\u00f3n del complemento Bookshelf", + "BookLibraryHelp": "Audio and text books are supported", "MessageGamePluginRequired": "Requiere instalaci\u00f3n del complemento de GameBrowser", "MessageUnsetContentHelp": "El contenido ser\u00e1 mostrado como carpetas simples. Para mejores resultados utilice el administrador de metadatos para establecer los tipos de contenido para las sub-carpetas.", "SyncJobItemStatusQueued": "En cola", @@ -1897,6 +1894,7 @@ "DownloadFFmpeg": "Descargar FFmpeg", "FFmpegSuggestedDownload": "Descarga sugerida: {0}", "UnzipFFmpegFile": "Descomprimir el archivo descargado a una carpeta de su elecci\u00f3n.", + "MarkFFmpegExec": "If you are running Linux or OSX, you will need to locate the ffmpeg and ffprobe files and mark them as executable. This is needed to grant Emby permission to execute them.", "OptionUseSystemInstalledVersion": "Usar una versi\u00f3n instalada en el sistema", "OptionUseMyCustomVersion": "Usar una versi\u00f3n personalizada", "FFmpegSavePathNotFound": "No fue posible localizar FFmpeg usando la ruta que introdujo. FFprobe tambi\u00e9n es requerido y debe de estar en la misma carpeta. Estos componentes normalmente est\u00e1n empaquetados en la misma descarga. Por favor verifique la ruta e intente de nuevo.", @@ -1945,5 +1943,7 @@ "LabelPostProcessorArguments": "Argumentos de linea de comando para el post-procesador:", "LabelPostProcessorArgumentsHelp": "Use {path} como la ruta a el archivo de grabado.", "LabelPostProcessor": "Aplicaci\u00f3n de Post Procesado:", - "ErrorAddingXmlTvFile": "Hubo un error accediendo al archivo XmlTV. Por favor aseg\u00farese de que el archivo existe e intente de nuevo." + "ErrorAddingXmlTvFile": "Hubo un error accediendo al archivo XmlTV. Por favor aseg\u00farese de que el archivo existe e intente de nuevo.", + "OptionAutomaticallyGroupSeries": "Fusionar autom\u00e1ticamente series esparcidas a trav\u00e9s de m\u00faltiples carpetas.", + "OptionAutomaticallyGroupSeriesHelp": "Si se habilita, las series que se reparten a trav\u00e9s de m\u00faltiples carpetas dentro de esta biblioteca ser\u00e1n fusionadas en una sola serie." } \ No newline at end of file diff --git a/MediaBrowser.WebDashboard/dashboard-ui/strings/es.json b/MediaBrowser.WebDashboard/dashboard-ui/strings/es.json index 760fb146dc..69c9b88309 100644 --- a/MediaBrowser.WebDashboard/dashboard-ui/strings/es.json +++ b/MediaBrowser.WebDashboard/dashboard-ui/strings/es.json @@ -1,6 +1,4 @@ { - "OptionAutomaticallyGroupSeriesHelp": "Si est\u00e1 activada, las series que se distribuyen entre varias carpetas dentro de esta biblioteca se fusionar\u00e1n autom\u00e1ticamente en una sola serie.", - "OptionAutomaticallyGroupSeries": "Combinar autom\u00e1ticamente series que se distribuyen en varias carpetas", "LabelPrevious": "Anterior", "LabelFinish": "Terminar", "LabelNext": "Siguiente", @@ -173,7 +171,6 @@ "OptionPlayCount": "N\u00famero de reproducc.", "OptionDatePlayed": "Fecha de reproducci\u00f3n", "OptionDateAdded": "A\u00f1adido el", - "DateAddedValue": "Fecha a\u00f1adido: {0}", "OptionAlbumArtist": "Album Artista", "OptionArtist": "Artista", "OptionAlbum": "\u00c1lbum", @@ -1751,7 +1748,7 @@ "HeaderCancelSyncJob": "Cancelar sincronizaci\u00f3n", "CancelSyncJobConfirmation": "Cancelar el trabajo de sincronizaci\u00f3n eliminar\u00e1 los medios sincronizados del dispositivo durante el siguiente proceso de sincronizaci\u00f3n. \u00bfEst\u00e1s seguro de que quieres continuar?", "LabelQuality": "Calidad:", - "MessageBookPluginRequired": "Necesita de la instalaci\u00f3n del plugin Bookshelf", + "BookLibraryHelp": "Audio and text books are supported", "MessageGamePluginRequired": "Necesita de la instalaci\u00f3n del plugin GameBrowser", "MessageUnsetContentHelp": "El contenido se mostrar\u00e1 como carpetas planas. Para tener mejores resultados utiliza el gestor de metadatos para establecer los tipos de contenidos de las sub-carpetas.", "SyncJobItemStatusQueued": "En cola", @@ -1897,6 +1894,7 @@ "DownloadFFmpeg": "Descargar FFmpeg", "FFmpegSuggestedDownload": "Descarga sugerida: {0}", "UnzipFFmpegFile": "Descomprima el archivo descargado en una carpeta de su elecci\u00f3n.", + "MarkFFmpegExec": "If you are running Linux or OSX, you will need to locate the ffmpeg and ffprobe files and mark them as executable. This is needed to grant Emby permission to execute them.", "OptionUseSystemInstalledVersion": "Usar la versi\u00f3n instalada del sistema", "OptionUseMyCustomVersion": "Utilizar una versi\u00f3n personalizada", "FFmpegSavePathNotFound": "No podemos localizar FFmpeg usando la ruta que has ingresado. FFprobe tambi\u00e9n es necesario y debe existir en la misma carpeta. Estos componentes normalmente se agrupan juntos en la misma descarga. Compruebe la ruta y vuelva a intentarlo.", @@ -1945,5 +1943,7 @@ "LabelPostProcessorArguments": "Argumentos de l\u00ednea de comandos posprocesador:", "LabelPostProcessorArgumentsHelp": "Utilice {path} como ruta del archivo de grabaci\u00f3n.", "LabelPostProcessor": "Aplicaci\u00f3n de post-procesamiento:", - "ErrorAddingXmlTvFile": "There was an error accessing the XmlTV file. Please ensure the file exists and try again." + "ErrorAddingXmlTvFile": "There was an error accessing the XmlTV file. Please ensure the file exists and try again.", + "OptionAutomaticallyGroupSeries": "Combinar autom\u00e1ticamente series que se distribuyen en varias carpetas", + "OptionAutomaticallyGroupSeriesHelp": "Si est\u00e1 activada, las series que se distribuyen entre varias carpetas dentro de esta biblioteca se fusionar\u00e1n autom\u00e1ticamente en una sola serie." } \ No newline at end of file diff --git a/MediaBrowser.WebDashboard/dashboard-ui/strings/fi.json b/MediaBrowser.WebDashboard/dashboard-ui/strings/fi.json index 67ca3c8a27..c3b6ce7d27 100644 --- a/MediaBrowser.WebDashboard/dashboard-ui/strings/fi.json +++ b/MediaBrowser.WebDashboard/dashboard-ui/strings/fi.json @@ -1,6 +1,4 @@ { - "OptionAutomaticallyGroupSeriesHelp": "If enabled, series that are spread across multiple folders within this library will be automatically merged into a single series.", - "OptionAutomaticallyGroupSeries": "Automatically merge series that are spread across multiple folders", "LabelPrevious": "Edellinen", "LabelFinish": "Valmis", "LabelNext": "Seuraava", @@ -173,7 +171,6 @@ "OptionPlayCount": "Play Count", "OptionDatePlayed": "Date Played", "OptionDateAdded": "Date Added", - "DateAddedValue": "Date added: {0}", "OptionAlbumArtist": "Album Artist", "OptionArtist": "Artist", "OptionAlbum": "Album", @@ -1751,7 +1748,7 @@ "HeaderCancelSyncJob": "Cancel Sync", "CancelSyncJobConfirmation": "Cancelling the sync job will remove synced media from the device during the next sync process. Are you sure you wish to proceed?", "LabelQuality": "Quality:", - "MessageBookPluginRequired": "Requires installation of the Bookshelf plugin", + "BookLibraryHelp": "Audio and text books are supported", "MessageGamePluginRequired": "Requires installation of the GameBrowser plugin", "MessageUnsetContentHelp": "Content will be displayed as plain folders. For best results use the metadata manager to set the content types of sub-folders.", "SyncJobItemStatusQueued": "Queued", @@ -1897,6 +1894,7 @@ "DownloadFFmpeg": "Download FFmpeg", "FFmpegSuggestedDownload": "Suggested download: {0}", "UnzipFFmpegFile": "Unzip the downloaded file to a folder of your choice.", + "MarkFFmpegExec": "If you are running Linux or OSX, you will need to locate the ffmpeg and ffprobe files and mark them as executable. This is needed to grant Emby permission to execute them.", "OptionUseSystemInstalledVersion": "Use system installed version", "OptionUseMyCustomVersion": "Use a custom version", "FFmpegSavePathNotFound": "We're unable to locate FFmpeg using the path you've entered. FFprobe is also required and must exist in the same folder. These components are normally bundled together in the same download. Please check the path and try again.", @@ -1945,5 +1943,7 @@ "LabelPostProcessorArguments": "Post-processor command line arguments:", "LabelPostProcessorArgumentsHelp": "Use {path} as the path to the recording file.", "LabelPostProcessor": "Post-processing application:", - "ErrorAddingXmlTvFile": "There was an error accessing the XmlTV file. Please ensure the file exists and try again." + "ErrorAddingXmlTvFile": "There was an error accessing the XmlTV file. Please ensure the file exists and try again.", + "OptionAutomaticallyGroupSeries": "Automatically merge series that are spread across multiple folders", + "OptionAutomaticallyGroupSeriesHelp": "If enabled, series that are spread across multiple folders within this library will be automatically merged into a single series." } \ No newline at end of file diff --git a/MediaBrowser.WebDashboard/dashboard-ui/strings/fr-CA.json b/MediaBrowser.WebDashboard/dashboard-ui/strings/fr-CA.json index ab04dbf0e1..8c53f7a03e 100644 --- a/MediaBrowser.WebDashboard/dashboard-ui/strings/fr-CA.json +++ b/MediaBrowser.WebDashboard/dashboard-ui/strings/fr-CA.json @@ -1,6 +1,4 @@ { - "OptionAutomaticallyGroupSeriesHelp": "If enabled, series that are spread across multiple folders within this library will be automatically merged into a single series.", - "OptionAutomaticallyGroupSeries": "Automatically merge series that are spread across multiple folders", "LabelPrevious": "Pr\u00e9c\u00e9dent", "LabelFinish": "Terminer", "LabelNext": "Suivant", @@ -173,7 +171,6 @@ "OptionPlayCount": "Play Count", "OptionDatePlayed": "Date Played", "OptionDateAdded": "Date Added", - "DateAddedValue": "Date added: {0}", "OptionAlbumArtist": "Album Artist", "OptionArtist": "Artist", "OptionAlbum": "Album", @@ -1751,7 +1748,7 @@ "HeaderCancelSyncJob": "Cancel Sync", "CancelSyncJobConfirmation": "Cancelling the sync job will remove synced media from the device during the next sync process. Are you sure you wish to proceed?", "LabelQuality": "Quality:", - "MessageBookPluginRequired": "Requires installation of the Bookshelf plugin", + "BookLibraryHelp": "Audio and text books are supported", "MessageGamePluginRequired": "Requires installation of the GameBrowser plugin", "MessageUnsetContentHelp": "Content will be displayed as plain folders. For best results use the metadata manager to set the content types of sub-folders.", "SyncJobItemStatusQueued": "Queued", @@ -1897,6 +1894,7 @@ "DownloadFFmpeg": "Download FFmpeg", "FFmpegSuggestedDownload": "Suggested download: {0}", "UnzipFFmpegFile": "Unzip the downloaded file to a folder of your choice.", + "MarkFFmpegExec": "If you are running Linux or OSX, you will need to locate the ffmpeg and ffprobe files and mark them as executable. This is needed to grant Emby permission to execute them.", "OptionUseSystemInstalledVersion": "Use system installed version", "OptionUseMyCustomVersion": "Use a custom version", "FFmpegSavePathNotFound": "We're unable to locate FFmpeg using the path you've entered. FFprobe is also required and must exist in the same folder. These components are normally bundled together in the same download. Please check the path and try again.", @@ -1945,5 +1943,7 @@ "LabelPostProcessorArguments": "Post-processor command line arguments:", "LabelPostProcessorArgumentsHelp": "Use {path} as the path to the recording file.", "LabelPostProcessor": "Post-processing application:", - "ErrorAddingXmlTvFile": "There was an error accessing the XmlTV file. Please ensure the file exists and try again." + "ErrorAddingXmlTvFile": "There was an error accessing the XmlTV file. Please ensure the file exists and try again.", + "OptionAutomaticallyGroupSeries": "Automatically merge series that are spread across multiple folders", + "OptionAutomaticallyGroupSeriesHelp": "If enabled, series that are spread across multiple folders within this library will be automatically merged into a single series." } \ No newline at end of file diff --git a/MediaBrowser.WebDashboard/dashboard-ui/strings/fr-FR.json b/MediaBrowser.WebDashboard/dashboard-ui/strings/fr-FR.json index c889ab67df..e881d6ce25 100644 --- a/MediaBrowser.WebDashboard/dashboard-ui/strings/fr-FR.json +++ b/MediaBrowser.WebDashboard/dashboard-ui/strings/fr-FR.json @@ -1,6 +1,4 @@ { - "OptionAutomaticallyGroupSeriesHelp": "If enabled, series that are spread across multiple folders within this library will be automatically merged into a single series.", - "OptionAutomaticallyGroupSeries": "Automatically merge series that are spread across multiple folders", "LabelPrevious": "Pr\u00e9c\u00e9dent", "LabelFinish": "Terminer", "LabelNext": "Suivant", @@ -173,7 +171,6 @@ "OptionPlayCount": "Play Count", "OptionDatePlayed": "Date Played", "OptionDateAdded": "Date Added", - "DateAddedValue": "Date added: {0}", "OptionAlbumArtist": "Album Artist", "OptionArtist": "Artist", "OptionAlbum": "Album", @@ -1751,7 +1748,7 @@ "HeaderCancelSyncJob": "Cancel Sync", "CancelSyncJobConfirmation": "Cancelling the sync job will remove synced media from the device during the next sync process. Are you sure you wish to proceed?", "LabelQuality": "Quality:", - "MessageBookPluginRequired": "Requires installation of the Bookshelf plugin", + "BookLibraryHelp": "Audio and text books are supported", "MessageGamePluginRequired": "Requires installation of the GameBrowser plugin", "MessageUnsetContentHelp": "Content will be displayed as plain folders. For best results use the metadata manager to set the content types of sub-folders.", "SyncJobItemStatusQueued": "Queued", @@ -1897,6 +1894,7 @@ "DownloadFFmpeg": "T\u00e9l\u00e9charger FFmpeg", "FFmpegSuggestedDownload": "T\u00e9l\u00e9chargement sugg\u00e9r\u00e9 : {0}", "UnzipFFmpegFile": "D\u00e9compressez le fichier t\u00e9l\u00e9charg\u00e9 dans le dossier de votre choix.", + "MarkFFmpegExec": "If you are running Linux or OSX, you will need to locate the ffmpeg and ffprobe files and mark them as executable. This is needed to grant Emby permission to execute them.", "OptionUseSystemInstalledVersion": "Utilisez la version du syst\u00e8me install\u00e9", "OptionUseMyCustomVersion": "Utilisez une version personnalis\u00e9e", "FFmpegSavePathNotFound": "We're unable to locate FFmpeg using the path you've entered. FFprobe is also required and must exist in the same folder. These components are normally bundled together in the same download. Please check the path and try again.", @@ -1945,5 +1943,7 @@ "LabelPostProcessorArguments": "Post-processor command line arguments:", "LabelPostProcessorArgumentsHelp": "Use {path} as the path to the recording file.", "LabelPostProcessor": "Post-processing application:", - "ErrorAddingXmlTvFile": "There was an error accessing the XmlTV file. Please ensure the file exists and try again." + "ErrorAddingXmlTvFile": "There was an error accessing the XmlTV file. Please ensure the file exists and try again.", + "OptionAutomaticallyGroupSeries": "Automatically merge series that are spread across multiple folders", + "OptionAutomaticallyGroupSeriesHelp": "If enabled, series that are spread across multiple folders within this library will be automatically merged into a single series." } \ No newline at end of file diff --git a/MediaBrowser.WebDashboard/dashboard-ui/strings/fr.json b/MediaBrowser.WebDashboard/dashboard-ui/strings/fr.json index 8b074250c1..01d14f198c 100644 --- a/MediaBrowser.WebDashboard/dashboard-ui/strings/fr.json +++ b/MediaBrowser.WebDashboard/dashboard-ui/strings/fr.json @@ -1,6 +1,4 @@ { - "OptionAutomaticallyGroupSeriesHelp": "Les s\u00e9ries qui sont r\u00e9parties en plusieurs dossiers dans la m\u00e9diath\u00e8que seront automatiquement fusionn\u00e9es en une seule s\u00e9rie.", - "OptionAutomaticallyGroupSeries": "Fusionner automatiquement les s\u00e9ries qui sont r\u00e9parties en plusieurs dossiers", "LabelPrevious": "Pr\u00e9c\u00e9dent", "LabelFinish": "Terminer", "LabelNext": "Suivant", @@ -173,7 +171,6 @@ "OptionPlayCount": "Nombre de lectures", "OptionDatePlayed": "Date de lecture", "OptionDateAdded": "Date d'ajout", - "DateAddedValue": "Date d'ajout\u00a0: {0}", "OptionAlbumArtist": "Artiste de l'album", "OptionArtist": "Artiste", "OptionAlbum": "Album", @@ -1751,7 +1748,7 @@ "HeaderCancelSyncJob": "Annuler la sync.", "CancelSyncJobConfirmation": "L'annulation d'une t\u00e2che de synchronisation provoquera la suppression des m\u00e9dias synchronis\u00e9s sur l'appareil lors la prochaine ex\u00e9cution de la synchronisation. \u00cates-vous s\u00fbr de vouloir continuer ?", "LabelQuality": "Qualit\u00e9:", - "MessageBookPluginRequired": "N\u00e9cessite l'installation de l'extension Bookshelf", + "BookLibraryHelp": "Audio and text books are supported", "MessageGamePluginRequired": "N\u00e9cessite l'installation de l'extension GameBrowser", "MessageUnsetContentHelp": "Le contenu sera affich\u00e9 sous forme de dossiers. Pour un r\u00e9sultat optimal, utilisez le gestionnaire de m\u00e9tadonn\u00e9es pour d\u00e9finir le type de contenu des sous-dossiers.", "SyncJobItemStatusQueued": "Mis en file d'attente", @@ -1897,6 +1894,7 @@ "DownloadFFmpeg": "T\u00e9l\u00e9charger FFmpeg", "FFmpegSuggestedDownload": "T\u00e9l\u00e9chargement sugg\u00e9r\u00e9\u00a0: {0}", "UnzipFFmpegFile": "D\u00e9compresser le fichier t\u00e9l\u00e9charg\u00e9 dans le dossier de votre choix.", + "MarkFFmpegExec": "If you are running Linux or OSX, you will need to locate the ffmpeg and ffprobe files and mark them as executable. This is needed to grant Emby permission to execute them.", "OptionUseSystemInstalledVersion": "Utiliser la version install\u00e9e sur le syst\u00e8me", "OptionUseMyCustomVersion": "Utiliser une version personnalis\u00e9e", "FFmpegSavePathNotFound": "Nous ne pouvons pas localiser FFmpeg en utilisant le chemin que vous avez saisi. FFprobe est \u00e9galement n\u00e9cessaire et doit exister dans le m\u00eame dossier. Ces composants sont g\u00e9n\u00e9ralement regroup\u00e9s dans le m\u00eame t\u00e9l\u00e9chargement. Veuillez v\u00e9rifier le chemin et essayer \u00e0 nouveau.", @@ -1945,5 +1943,7 @@ "LabelPostProcessorArguments": "Arguments en ligne de commande du post-processeur\u00a0:", "LabelPostProcessorArgumentsHelp": "Utiliser {path} comme chemin d'acc\u00e8s au fichier d'enregistrement.", "LabelPostProcessor": "Application post-processeur\u00a0:", - "ErrorAddingXmlTvFile": "Une erreur est survenue lors de l'acc\u00e8s au fichier XMLTV. Assurez-vous qu'il existe et r\u00e9essayez." + "ErrorAddingXmlTvFile": "Une erreur est survenue lors de l'acc\u00e8s au fichier XMLTV. Assurez-vous qu'il existe et r\u00e9essayez.", + "OptionAutomaticallyGroupSeries": "Fusionner automatiquement les s\u00e9ries qui sont r\u00e9parties en plusieurs dossiers", + "OptionAutomaticallyGroupSeriesHelp": "Les s\u00e9ries qui sont r\u00e9parties en plusieurs dossiers dans la m\u00e9diath\u00e8que seront automatiquement fusionn\u00e9es en une seule s\u00e9rie." } \ No newline at end of file diff --git a/MediaBrowser.WebDashboard/dashboard-ui/strings/gsw.json b/MediaBrowser.WebDashboard/dashboard-ui/strings/gsw.json index b4eb4872a5..ffacd016a5 100644 --- a/MediaBrowser.WebDashboard/dashboard-ui/strings/gsw.json +++ b/MediaBrowser.WebDashboard/dashboard-ui/strings/gsw.json @@ -1,6 +1,4 @@ { - "OptionAutomaticallyGroupSeriesHelp": "If enabled, series that are spread across multiple folders within this library will be automatically merged into a single series.", - "OptionAutomaticallyGroupSeries": "Automatically merge series that are spread across multiple folders", "LabelPrevious": "Vorher", "LabelFinish": "Beende", "LabelNext": "N\u00f6chst", @@ -173,7 +171,6 @@ "OptionPlayCount": "Z\u00e4hler", "OptionDatePlayed": "Abgspellt am", "OptionDateAdded": "Dezue gf\u00fcegt am", - "DateAddedValue": "Date added: {0}", "OptionAlbumArtist": "Album-Artist", "OptionArtist": "Artist", "OptionAlbum": "Album", @@ -1751,7 +1748,7 @@ "HeaderCancelSyncJob": "Cancel Sync", "CancelSyncJobConfirmation": "Cancelling the sync job will remove synced media from the device during the next sync process. Are you sure you wish to proceed?", "LabelQuality": "Quality:", - "MessageBookPluginRequired": "Requires installation of the Bookshelf plugin", + "BookLibraryHelp": "Audio and text books are supported", "MessageGamePluginRequired": "Requires installation of the GameBrowser plugin", "MessageUnsetContentHelp": "Content will be displayed as plain folders. For best results use the metadata manager to set the content types of sub-folders.", "SyncJobItemStatusQueued": "Queued", @@ -1897,6 +1894,7 @@ "DownloadFFmpeg": "Download FFmpeg", "FFmpegSuggestedDownload": "Suggested download: {0}", "UnzipFFmpegFile": "Unzip the downloaded file to a folder of your choice.", + "MarkFFmpegExec": "If you are running Linux or OSX, you will need to locate the ffmpeg and ffprobe files and mark them as executable. This is needed to grant Emby permission to execute them.", "OptionUseSystemInstalledVersion": "Use system installed version", "OptionUseMyCustomVersion": "Use a custom version", "FFmpegSavePathNotFound": "We're unable to locate FFmpeg using the path you've entered. FFprobe is also required and must exist in the same folder. These components are normally bundled together in the same download. Please check the path and try again.", @@ -1945,5 +1943,7 @@ "LabelPostProcessorArguments": "Post-processor command line arguments:", "LabelPostProcessorArgumentsHelp": "Use {path} as the path to the recording file.", "LabelPostProcessor": "Post-processing application:", - "ErrorAddingXmlTvFile": "There was an error accessing the XmlTV file. Please ensure the file exists and try again." + "ErrorAddingXmlTvFile": "There was an error accessing the XmlTV file. Please ensure the file exists and try again.", + "OptionAutomaticallyGroupSeries": "Automatically merge series that are spread across multiple folders", + "OptionAutomaticallyGroupSeriesHelp": "If enabled, series that are spread across multiple folders within this library will be automatically merged into a single series." } \ No newline at end of file diff --git a/MediaBrowser.WebDashboard/dashboard-ui/strings/he.json b/MediaBrowser.WebDashboard/dashboard-ui/strings/he.json index 76c37e7802..7767316977 100644 --- a/MediaBrowser.WebDashboard/dashboard-ui/strings/he.json +++ b/MediaBrowser.WebDashboard/dashboard-ui/strings/he.json @@ -1,6 +1,4 @@ { - "OptionAutomaticallyGroupSeriesHelp": "If enabled, series that are spread across multiple folders within this library will be automatically merged into a single series.", - "OptionAutomaticallyGroupSeries": "Automatically merge series that are spread across multiple folders", "LabelPrevious": "\u05d4\u05e7\u05d5\u05d3\u05dd", "LabelFinish": "\u05e1\u05d9\u05d9\u05dd", "LabelNext": "\u05d4\u05d1\u05d0", @@ -173,7 +171,6 @@ "OptionPlayCount": "\u05de\u05e1\u05e4\u05e8 \u05d4\u05e9\u05de\u05e2\u05d5\u05ea", "OptionDatePlayed": "\u05ea\u05d0\u05e8\u05d9\u05da \u05e0\u05d9\u05d2\u05d5\u05df", "OptionDateAdded": "\u05ea\u05d0\u05e8\u05d9\u05da \u05d4\u05d5\u05e1\u05e4\u05d4", - "DateAddedValue": "Date added: {0}", "OptionAlbumArtist": "\u05d0\u05de\u05df \u05d0\u05dc\u05d1\u05d5\u05dd", "OptionArtist": "\u05d0\u05de\u05df", "OptionAlbum": "\u05d0\u05dc\u05d1\u05d5\u05dd", @@ -1751,7 +1748,7 @@ "HeaderCancelSyncJob": "Cancel Sync", "CancelSyncJobConfirmation": "Cancelling the sync job will remove synced media from the device during the next sync process. Are you sure you wish to proceed?", "LabelQuality": "Quality:", - "MessageBookPluginRequired": "Requires installation of the Bookshelf plugin", + "BookLibraryHelp": "Audio and text books are supported", "MessageGamePluginRequired": "Requires installation of the GameBrowser plugin", "MessageUnsetContentHelp": "Content will be displayed as plain folders. For best results use the metadata manager to set the content types of sub-folders.", "SyncJobItemStatusQueued": "Queued", @@ -1897,6 +1894,7 @@ "DownloadFFmpeg": "Download FFmpeg", "FFmpegSuggestedDownload": "Suggested download: {0}", "UnzipFFmpegFile": "Unzip the downloaded file to a folder of your choice.", + "MarkFFmpegExec": "If you are running Linux or OSX, you will need to locate the ffmpeg and ffprobe files and mark them as executable. This is needed to grant Emby permission to execute them.", "OptionUseSystemInstalledVersion": "Use system installed version", "OptionUseMyCustomVersion": "Use a custom version", "FFmpegSavePathNotFound": "We're unable to locate FFmpeg using the path you've entered. FFprobe is also required and must exist in the same folder. These components are normally bundled together in the same download. Please check the path and try again.", @@ -1945,5 +1943,7 @@ "LabelPostProcessorArguments": "Post-processor command line arguments:", "LabelPostProcessorArgumentsHelp": "Use {path} as the path to the recording file.", "LabelPostProcessor": "Post-processing application:", - "ErrorAddingXmlTvFile": "There was an error accessing the XmlTV file. Please ensure the file exists and try again." + "ErrorAddingXmlTvFile": "There was an error accessing the XmlTV file. Please ensure the file exists and try again.", + "OptionAutomaticallyGroupSeries": "Automatically merge series that are spread across multiple folders", + "OptionAutomaticallyGroupSeriesHelp": "If enabled, series that are spread across multiple folders within this library will be automatically merged into a single series." } \ No newline at end of file diff --git a/MediaBrowser.WebDashboard/dashboard-ui/strings/hr.json b/MediaBrowser.WebDashboard/dashboard-ui/strings/hr.json index 40ffefa4ed..3fd6284098 100644 --- a/MediaBrowser.WebDashboard/dashboard-ui/strings/hr.json +++ b/MediaBrowser.WebDashboard/dashboard-ui/strings/hr.json @@ -1,6 +1,4 @@ { - "OptionAutomaticallyGroupSeriesHelp": "If enabled, series that are spread across multiple folders within this library will be automatically merged into a single series.", - "OptionAutomaticallyGroupSeries": "Automatically merge series that are spread across multiple folders", "LabelPrevious": "Prethodni", "LabelFinish": "Kraj", "LabelNext": "Sljede\u0107i", @@ -173,7 +171,6 @@ "OptionPlayCount": "Broju izvo\u0111enja", "OptionDatePlayed": "Datumu izvo\u0111enja", "OptionDateAdded": "Datumu dodavanja", - "DateAddedValue": "Date added: {0}", "OptionAlbumArtist": "Albumu izvo\u0111a\u010da", "OptionArtist": "Izvo\u0111a\u010du", "OptionAlbum": "Albumu", @@ -1751,7 +1748,7 @@ "HeaderCancelSyncJob": "Odustani od sink.", "CancelSyncJobConfirmation": "Poni\u0161tavanje sinkronizacije ukloniti \u0107e sinkronizirane medije iz ure\u0111aja tijekom sljede\u0107eg procesa sinkronizacije. Jeste li sigurni da \u017eelite nastaviti?", "LabelQuality": "Kvaliteta:", - "MessageBookPluginRequired": "Zahtijeva instalaciju Bookshelf dodatka", + "BookLibraryHelp": "Audio and text books are supported", "MessageGamePluginRequired": "Zahtijeva instalaciju GameBrowser dodatka", "MessageUnsetContentHelp": "Sadr\u017eaj \u0107e biti prikazan kao obi\u010dne mape. Za najbolje rezultate upotrijebite upravitelj meta-podataka za postavljanje vrste sadr\u017eaja pod-mapa.", "SyncJobItemStatusQueued": "Na \u010dekanju", @@ -1897,6 +1894,7 @@ "DownloadFFmpeg": "Preuzimanje FFmpeg", "FFmpegSuggestedDownload": "Preporu\u010deno preuzimanje: {0}", "UnzipFFmpegFile": "Raspakirajte preuzetu datoteku u mapu po va\u0161em izboru.", + "MarkFFmpegExec": "If you are running Linux or OSX, you will need to locate the ffmpeg and ffprobe files and mark them as executable. This is needed to grant Emby permission to execute them.", "OptionUseSystemInstalledVersion": "Koristite sistemsku instaliranu verziju", "OptionUseMyCustomVersion": "Koristite prilago\u0111enu verziju", "FFmpegSavePathNotFound": "Nismo mogli locirati FFmpeg kori\u0161tenjem putanje koju ste unijeli. FFprobe je tako\u0111er potreban i mora postojati u istoj mapi. Te komponente su obi\u010dno u paketu zajedno u istom preuzimanju. Provjerite putanju i poku\u0161ajte ponovno.", @@ -1945,5 +1943,7 @@ "LabelPostProcessorArguments": "Post-processor command line arguments:", "LabelPostProcessorArgumentsHelp": "Use {path} as the path to the recording file.", "LabelPostProcessor": "Post-processing application:", - "ErrorAddingXmlTvFile": "There was an error accessing the XmlTV file. Please ensure the file exists and try again." + "ErrorAddingXmlTvFile": "There was an error accessing the XmlTV file. Please ensure the file exists and try again.", + "OptionAutomaticallyGroupSeries": "Automatically merge series that are spread across multiple folders", + "OptionAutomaticallyGroupSeriesHelp": "If enabled, series that are spread across multiple folders within this library will be automatically merged into a single series." } \ No newline at end of file diff --git a/MediaBrowser.WebDashboard/dashboard-ui/strings/hu.json b/MediaBrowser.WebDashboard/dashboard-ui/strings/hu.json index cba8d68bf7..636984d799 100644 --- a/MediaBrowser.WebDashboard/dashboard-ui/strings/hu.json +++ b/MediaBrowser.WebDashboard/dashboard-ui/strings/hu.json @@ -1,6 +1,4 @@ { - "OptionAutomaticallyGroupSeriesHelp": "If enabled, series that are spread across multiple folders within this library will be automatically merged into a single series.", - "OptionAutomaticallyGroupSeries": "Automatically merge series that are spread across multiple folders", "LabelPrevious": "El\u0151z\u0151", "LabelFinish": "Befejez", "LabelNext": "K\u00f6vetkez\u0151", @@ -173,7 +171,6 @@ "OptionPlayCount": "Play Count", "OptionDatePlayed": "Date Played", "OptionDateAdded": "Hozz\u00e1adva", - "DateAddedValue": "Date added: {0}", "OptionAlbumArtist": "Album Artist", "OptionArtist": "Artist", "OptionAlbum": "Album", @@ -1751,7 +1748,7 @@ "HeaderCancelSyncJob": "Cancel Sync", "CancelSyncJobConfirmation": "Cancelling the sync job will remove synced media from the device during the next sync process. Are you sure you wish to proceed?", "LabelQuality": "Min\u0151s\u00e9g:", - "MessageBookPluginRequired": "Requires installation of the Bookshelf plugin", + "BookLibraryHelp": "Audio and text books are supported", "MessageGamePluginRequired": "Requires installation of the GameBrowser plugin", "MessageUnsetContentHelp": "Content will be displayed as plain folders. For best results use the metadata manager to set the content types of sub-folders.", "SyncJobItemStatusQueued": "Queued", @@ -1897,6 +1894,7 @@ "DownloadFFmpeg": "Download FFmpeg", "FFmpegSuggestedDownload": "Suggested download: {0}", "UnzipFFmpegFile": "Unzip the downloaded file to a folder of your choice.", + "MarkFFmpegExec": "If you are running Linux or OSX, you will need to locate the ffmpeg and ffprobe files and mark them as executable. This is needed to grant Emby permission to execute them.", "OptionUseSystemInstalledVersion": "Use system installed version", "OptionUseMyCustomVersion": "Use a custom version", "FFmpegSavePathNotFound": "We're unable to locate FFmpeg using the path you've entered. FFprobe is also required and must exist in the same folder. These components are normally bundled together in the same download. Please check the path and try again.", @@ -1945,5 +1943,7 @@ "LabelPostProcessorArguments": "Post-processor command line arguments:", "LabelPostProcessorArgumentsHelp": "Use {path} as the path to the recording file.", "LabelPostProcessor": "Post-processing application:", - "ErrorAddingXmlTvFile": "There was an error accessing the XmlTV file. Please ensure the file exists and try again." + "ErrorAddingXmlTvFile": "There was an error accessing the XmlTV file. Please ensure the file exists and try again.", + "OptionAutomaticallyGroupSeries": "Automatically merge series that are spread across multiple folders", + "OptionAutomaticallyGroupSeriesHelp": "If enabled, series that are spread across multiple folders within this library will be automatically merged into a single series." } \ No newline at end of file diff --git a/MediaBrowser.WebDashboard/dashboard-ui/strings/id.json b/MediaBrowser.WebDashboard/dashboard-ui/strings/id.json index cbf91a1b52..6306f9512f 100644 --- a/MediaBrowser.WebDashboard/dashboard-ui/strings/id.json +++ b/MediaBrowser.WebDashboard/dashboard-ui/strings/id.json @@ -1,6 +1,4 @@ { - "OptionAutomaticallyGroupSeriesHelp": "If enabled, series that are spread across multiple folders within this library will be automatically merged into a single series.", - "OptionAutomaticallyGroupSeries": "Automatically merge series that are spread across multiple folders", "LabelPrevious": "Sebelumnya", "LabelFinish": "Selesai", "LabelNext": "Berikutnya", @@ -173,7 +171,6 @@ "OptionPlayCount": "Play Count", "OptionDatePlayed": "Date Played", "OptionDateAdded": "Date Added", - "DateAddedValue": "Date added: {0}", "OptionAlbumArtist": "Album Artist", "OptionArtist": "Artist", "OptionAlbum": "Album", @@ -1751,7 +1748,7 @@ "HeaderCancelSyncJob": "Cancel Sync", "CancelSyncJobConfirmation": "Cancelling the sync job will remove synced media from the device during the next sync process. Are you sure you wish to proceed?", "LabelQuality": "Quality:", - "MessageBookPluginRequired": "Requires installation of the Bookshelf plugin", + "BookLibraryHelp": "Audio and text books are supported", "MessageGamePluginRequired": "Requires installation of the GameBrowser plugin", "MessageUnsetContentHelp": "Content will be displayed as plain folders. For best results use the metadata manager to set the content types of sub-folders.", "SyncJobItemStatusQueued": "Queued", @@ -1897,6 +1894,7 @@ "DownloadFFmpeg": "Download FFmpeg", "FFmpegSuggestedDownload": "Suggested download: {0}", "UnzipFFmpegFile": "Unzip the downloaded file to a folder of your choice.", + "MarkFFmpegExec": "If you are running Linux or OSX, you will need to locate the ffmpeg and ffprobe files and mark them as executable. This is needed to grant Emby permission to execute them.", "OptionUseSystemInstalledVersion": "Use system installed version", "OptionUseMyCustomVersion": "Use a custom version", "FFmpegSavePathNotFound": "We're unable to locate FFmpeg using the path you've entered. FFprobe is also required and must exist in the same folder. These components are normally bundled together in the same download. Please check the path and try again.", @@ -1945,5 +1943,7 @@ "LabelPostProcessorArguments": "Post-processor command line arguments:", "LabelPostProcessorArgumentsHelp": "Use {path} as the path to the recording file.", "LabelPostProcessor": "Post-processing application:", - "ErrorAddingXmlTvFile": "There was an error accessing the XmlTV file. Please ensure the file exists and try again." + "ErrorAddingXmlTvFile": "There was an error accessing the XmlTV file. Please ensure the file exists and try again.", + "OptionAutomaticallyGroupSeries": "Automatically merge series that are spread across multiple folders", + "OptionAutomaticallyGroupSeriesHelp": "If enabled, series that are spread across multiple folders within this library will be automatically merged into a single series." } \ No newline at end of file diff --git a/MediaBrowser.WebDashboard/dashboard-ui/strings/it.json b/MediaBrowser.WebDashboard/dashboard-ui/strings/it.json index 2c7aa361f1..6f30bbe083 100644 --- a/MediaBrowser.WebDashboard/dashboard-ui/strings/it.json +++ b/MediaBrowser.WebDashboard/dashboard-ui/strings/it.json @@ -1,6 +1,4 @@ { - "OptionAutomaticallyGroupSeriesHelp": "If enabled, series that are spread across multiple folders within this library will be automatically merged into a single series.", - "OptionAutomaticallyGroupSeries": "Automatically merge series that are spread across multiple folders", "LabelPrevious": "Precedente", "LabelFinish": "Finito", "LabelNext": "Prossimo", @@ -173,7 +171,6 @@ "OptionPlayCount": "Riproduzioni", "OptionDatePlayed": "Visto il", "OptionDateAdded": "Aggiunto il", - "DateAddedValue": "Date added: {0}", "OptionAlbumArtist": "Artista Album", "OptionArtist": "Artista", "OptionAlbum": "Album", @@ -1751,7 +1748,7 @@ "HeaderCancelSyncJob": "Cancella Sinc", "CancelSyncJobConfirmation": "La cancellazione dell'attivit\u00e0 di sincronizzazione causer\u00e0 la rimozione dal dispositivo dei media sincronizzati durante il prossimo processo di sincronizzazione. Sei sicuro di voler comunque procedere?", "LabelQuality": "Qualit\u00e0:", - "MessageBookPluginRequired": "Richiede l'installazione del plugin Bookshelf", + "BookLibraryHelp": "Audio and text books are supported", "MessageGamePluginRequired": "Richiede l'installazione del plugin GameBrowser", "MessageUnsetContentHelp": "Il contenuto verr\u00e0 visualizzato come pianura cartelle. Per ottenere i migliori risultati utilizzare il gestore di metadati per impostare i tipi di contenuto di sottocartelle.", "SyncJobItemStatusQueued": "In coda", @@ -1897,6 +1894,7 @@ "DownloadFFmpeg": "Download FFmpeg", "FFmpegSuggestedDownload": "Suggested download: {0}", "UnzipFFmpegFile": "Unzip the downloaded file to a folder of your choice.", + "MarkFFmpegExec": "If you are running Linux or OSX, you will need to locate the ffmpeg and ffprobe files and mark them as executable. This is needed to grant Emby permission to execute them.", "OptionUseSystemInstalledVersion": "Usa versione installata nel sistema", "OptionUseMyCustomVersion": "Use a custom version", "FFmpegSavePathNotFound": "We're unable to locate FFmpeg using the path you've entered. FFprobe is also required and must exist in the same folder. These components are normally bundled together in the same download. Please check the path and try again.", @@ -1945,5 +1943,7 @@ "LabelPostProcessorArguments": "Post-processor command line arguments:", "LabelPostProcessorArgumentsHelp": "Use {path} as the path to the recording file.", "LabelPostProcessor": "Post-processing application:", - "ErrorAddingXmlTvFile": "There was an error accessing the XmlTV file. Please ensure the file exists and try again." + "ErrorAddingXmlTvFile": "There was an error accessing the XmlTV file. Please ensure the file exists and try again.", + "OptionAutomaticallyGroupSeries": "Automatically merge series that are spread across multiple folders", + "OptionAutomaticallyGroupSeriesHelp": "If enabled, series that are spread across multiple folders within this library will be automatically merged into a single series." } \ No newline at end of file diff --git a/MediaBrowser.WebDashboard/dashboard-ui/strings/kk.json b/MediaBrowser.WebDashboard/dashboard-ui/strings/kk.json index cc927c6160..727c3d7350 100644 --- a/MediaBrowser.WebDashboard/dashboard-ui/strings/kk.json +++ b/MediaBrowser.WebDashboard/dashboard-ui/strings/kk.json @@ -1,6 +1,4 @@ { - "OptionAutomaticallyGroupSeriesHelp": "\u049a\u043e\u0441\u044b\u043b\u0493\u0430\u043d\u0434\u0430, \u043e\u0441\u044b \u0442\u0430\u0441\u044b\u0493\u044b\u0448\u0445\u0430\u043d\u0430 \u0456\u0448\u0456\u043d\u0434\u0435\u0433\u0456 \u0431\u0456\u0440\u043d\u0435\u0448\u0435 \u049b\u0430\u043b\u0442\u0430\u043b\u0430\u0440 \u0430\u0440\u0430\u0441\u044b\u043d\u0434\u0430 \u0442\u0430\u0440\u0430\u043b\u0493\u0430\u043d \u0442\u0435\u043b\u0435\u0445\u0438\u043a\u0430\u044f\u0441\u044b \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0442\u044b \u0442\u04af\u0440\u0434\u0435 \u0431\u0456\u0440 \u0442\u0435\u043b\u0435\u0445\u0438\u043a\u0430\u044f\u0493\u0430 \u0431\u0456\u0440\u0456\u043a\u0442\u0456\u0440\u0456\u043b\u0435\u0442\u0456\u043d \u0431\u043e\u043b\u0430\u0434\u044b.", - "OptionAutomaticallyGroupSeries": "\u0411\u0456\u0440\u043d\u0435\u0448\u0435 \u049b\u0430\u043b\u0442\u0430\u043b\u0430\u0440 \u0430\u0440\u0430\u0441\u044b\u043d\u0434\u0430 \u0442\u0430\u0440\u0430\u043b\u0493\u0430\u043d \u0442\u0435\u043b\u0435\u0445\u0438\u043a\u0430\u044f\u043d\u044b \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0442\u044b \u0442\u04af\u0440\u0434\u0435 \u0431\u0456\u0440 \u0442\u0435\u043b\u0435\u0445\u0438\u043a\u0430\u044f\u0493\u0430 \u0431\u0456\u0440\u0456\u043a\u0442\u0456\u0440\u0443", "LabelPrevious": "\u0410\u043b\u0434\u044b\u04a3\u0493\u044b", "LabelFinish": "\u0410\u044f\u049b\u0442\u0430\u0443", "LabelNext": "\u041a\u0435\u043b\u0435\u0441\u0456", @@ -173,7 +171,6 @@ "OptionPlayCount": "\u041e\u0439\u043d\u0430\u0442\u0443 \u0435\u0441\u0435\u0431\u0456", "OptionDatePlayed": "\u041e\u0439\u043d\u0430\u0442\u044b\u043b\u0493\u0430\u043d \u043a\u04af\u043d\u0456", "OptionDateAdded": "\u04ae\u0441\u0442\u0435\u043b\u0433\u0435\u043d \u043a\u04af\u043d\u0456", - "DateAddedValue": "\u04ae\u0441\u0442\u0435\u043b\u0433\u0435\u043d \u043a\u04af\u043d\u0456: {0}", "OptionAlbumArtist": "\u0410\u043b\u044c\u0431\u043e\u043c \u043e\u0440\u044b\u043d\u0434\u0430\u0443\u0448\u044b\u0441\u044b", "OptionArtist": "\u041e\u0440\u044b\u043d\u0434\u0430\u0443\u0448\u044b", "OptionAlbum": "\u0410\u043b\u044c\u0431\u043e\u043c", @@ -895,7 +892,7 @@ "UserOnlineFromDevice": "{0} - {1} \u0430\u0440\u049b\u044b\u043b\u044b \u049b\u043e\u0441\u044b\u043b\u0493\u0430\u043d", "UserOfflineFromDevice": "{0} - {1} \u0430\u0440\u049b\u044b\u043b\u044b \u0430\u0436\u044b\u0440\u0430\u0442\u044b\u043b\u0493\u0430\u043d", "LabelRunningTimeValue": "\u0406\u0441\u043a\u0435 \u049b\u043e\u0441\u044b\u043b\u0443 \u0443\u0430\u049b\u044b\u0442\u044b: {0}", - "LabelIpAddressValue": "IP \u043c\u0435\u043a\u0435\u043d\u0436\u0430\u0439\u044b: {0}", + "LabelIpAddressValue": "IP-\u043c\u0435\u043a\u0435\u043d\u0436\u0430\u0439\u044b: {0}", "UserLockedOutWithName": "\u041f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0448\u044b {0} \u049b\u04b1\u0440\u0441\u0430\u0443\u043b\u044b", "UserConfigurationUpdatedWithName": "\u041f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0448\u044b {0} \u04af\u0448\u0456\u043d \u0442\u0435\u04a3\u0448\u0435\u043b\u0456\u043c \u0436\u0430\u04a3\u0430\u0440\u0442\u044b\u043b\u0434\u044b", "UserCreatedWithName": "\u041f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0448\u044b {0} \u0436\u0430\u0441\u0430\u043b\u0493\u0430\u043d", @@ -970,7 +967,7 @@ "LabelExtractChaptersDuringLibraryScanHelp": "\u049a\u043e\u0441\u044b\u043b\u0493\u0430\u043d\u0434\u0430, \u0441\u0430\u0445\u043d\u0430 \u0441\u0443\u0440\u0435\u0442\u0442\u0435\u0440\u0456 \u0442\u0430\u0441\u044b\u0493\u044b\u0448\u0445\u0430\u043d\u0430\u043d\u044b \u0441\u043a\u0430\u043d\u0435\u0440\u043b\u0435\u0443 \u043c\u0435\u0437\u0433\u0456\u043b\u0456\u043d\u0434\u0435, \u0431\u0435\u0439\u043d\u0435\u043b\u0435\u0440 \u0448\u0435\u0442\u0435\u043d \u04d9\u043a\u0435\u043b\u0456\u043d\u0433\u0435\u043d\u0434\u0435, \u0431\u04e9\u043b\u0456\u043d\u0456\u043f \u0430\u043b\u044b\u043d\u0430\u0434\u044b. \u0410\u0436\u044b\u0440\u0430\u0442\u044b\u043b\u0493\u0430\u043d\u0434\u0430, \u0431\u04b1\u043b\u0430\u0440 \u0441\u0430\u0445\u043d\u0430 \u0441\u0443\u0440\u0435\u0442\u0442\u0435\u0440\u0456\u043d\u0435 \u0436\u043e\u0441\u043f\u0430\u0440\u043b\u0430\u0493\u0430\u043d \u0442\u0430\u043f\u0441\u044b\u0440\u043c\u0430\u0441\u044b \u043c\u0435\u0437\u0433\u0456\u043b\u0456\u043d\u0434\u0435, \u0442\u04b1\u0440\u0430\u049b\u0442\u044b \u0442\u0430\u0441\u044b\u0493\u044b\u0448\u0445\u0430\u043d\u0430\u043d\u044b \u0441\u043a\u0430\u043d\u0435\u0440\u043b\u0435\u0443\u0456\u043d \u0436\u044b\u043b\u0434\u0430\u043c\u044b\u0440\u0430\u049b \u0430\u044f\u049b\u0442\u0430\u043b\u0443\u044b \u04b1\u0448\u0456\u043d \u0440\u04b1\u049b\u0441\u0430\u0442 \u0435\u0442\u0456\u043f, \u0431\u04e9\u043b\u0456\u043d\u0456\u043f \u0430\u043b\u044b\u043d\u0430\u0434\u044b.", "LabelConnectGuestUserName": "\u041e\u043d\u044b\u04a3 Emby \u043f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0448\u044b \u0430\u0442\u044b \u043d\u0435\u043c\u0435\u0441\u0435 \u044d-\u043f\u043e\u0448\u0442\u0430 \u043c\u0435\u043a\u0435\u043d\u0436\u0430\u0439\u044b:", "LabelConnectUserName": "Emby \u043f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0448\u044b \u0430\u0442\u044b \u043d\u0435\u043c\u0435\u0441\u0435 \u044d-\u043f\u043e\u0448\u0442\u0430 \u043c\u0435\u043a\u0435\u043d\u0436\u0430\u0439\u044b:", - "LabelConnectUserNameHelp": "\u0421\u0435\u0440\u0432\u0435\u0440\u0434\u0456\u04a3 IP \u043c\u0435\u043a\u0435\u043d\u0436\u0430\u0439\u044b\u043d \u0431\u0456\u043b\u043c\u0435\u0439 \u0442\u04b1\u0440\u044b\u043f \u04d9\u0440\u049b\u0430\u0439\u0441\u044b Emby \u049b\u043e\u043b\u0434\u0430\u043d\u0431\u0430\u0441\u044b\u043d\u0430\u043d \u043e\u04a3\u0430\u0439\u0442\u044b\u043b\u0493\u0430\u043d \u043a\u0456\u0440\u0443-\u049b\u0430\u0442\u044b\u043d\u0430\u0443\u0434\u044b \u049b\u043e\u0441\u0443 \u04af\u0448\u0456\u043d \u043e\u0441\u044b \u0436\u0435\u0440\u0433\u0456\u043b\u0456\u043a\u0442\u0456 \u043f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0448\u044b\u043d\u044b \u0436\u0435\u043b\u0456\u043b\u0456\u043a Emby \u0442\u0456\u0440\u043a\u0435\u043b\u0433\u0456\u0441\u0456\u043d\u0435 \u0431\u0430\u0439\u043b\u0430\u043d\u044b\u0441\u0442\u044b\u0440\u044b\u04a3\u044b\u0437.", + "LabelConnectUserNameHelp": "\u0421\u0435\u0440\u0432\u0435\u0440\u0434\u0456\u04a3 IP-\u043c\u0435\u043a\u0435\u043d\u0436\u0430\u0439\u044b\u043d \u0431\u0456\u043b\u043c\u0435\u0439 \u0442\u04b1\u0440\u044b\u043f \u04d9\u0440\u049b\u0430\u0439\u0441\u044b Emby \u049b\u043e\u043b\u0434\u0430\u043d\u0431\u0430\u0441\u044b\u043d\u0430\u043d \u043e\u04a3\u0430\u0439\u0442\u044b\u043b\u0493\u0430\u043d \u043a\u0456\u0440\u0443-\u049b\u0430\u0442\u044b\u043d\u0430\u0443\u0434\u044b \u049b\u043e\u0441\u0443 \u04af\u0448\u0456\u043d \u043e\u0441\u044b \u0436\u0435\u0440\u0433\u0456\u043b\u0456\u043a\u0442\u0456 \u043f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0448\u044b\u043d\u044b \u0436\u0435\u043b\u0456\u043b\u0456\u043a Emby \u0442\u0456\u0440\u043a\u0435\u043b\u0433\u0456\u0441\u0456\u043d\u0435 \u0431\u0430\u0439\u043b\u0430\u043d\u044b\u0441\u0442\u044b\u0440\u044b\u04a3\u044b\u0437.", "ButtonLearnMoreAboutEmbyConnect": "Emby Connect \u0442\u0443\u0440\u0430\u043b\u044b \u043a\u04e9\u0431\u0456\u0440\u0435\u043a \u0431\u0456\u043b\u0443", "LabelExternalPlayers": "\u0421\u044b\u0440\u0442\u049b\u044b \u043e\u0439\u043d\u0430\u0442\u049b\u044b\u0448\u0442\u0430\u0440:", "LabelExternalPlayersHelp": "\u0421\u044b\u0440\u0442\u049b\u044b \u043e\u0439\u043d\u0430\u0442\u049b\u044b\u0448\u0442\u0430\u0440\u0434\u0430 \u043c\u0430\u0437\u043c\u04b1\u043d\u0434\u044b \u043e\u0439\u043d\u0430\u0442\u0443 \u04af\u0448\u0456\u043d \u0442\u04af\u0439\u043c\u0435\u0448\u0456\u043a\u0442\u0435\u0440\u0434\u0456 \u0431\u0435\u0439\u043d\u0435\u043b\u0435\u0443. \u0411\u04b1\u043b \u0442\u0435\u043a \u049b\u0430\u043d\u0430 URL \u0441\u0445\u0435\u043c\u0430\u043b\u0430\u0440\u044b\u043d \u049b\u043e\u043b\u0434\u0430\u0439\u0442\u044b\u043d, \u04d9\u0434\u0435\u0442\u0442\u0435, Android \u0436\u04d9\u043d\u0435 iOS, \u049b\u04b1\u0440\u044b\u043b\u0493\u044b\u043b\u0430\u0440\u0434\u0430 \u049b\u043e\u043b\u0436\u0435\u0442\u0456\u043c\u0434\u0456. \u0421\u044b\u0440\u0442\u049b\u044b \u043e\u0439\u043d\u0430\u0442\u049b\u044b\u0448\u0442\u0430\u0440, \u049b\u0430\u0493\u0438\u0434\u0430 \u0431\u043e\u0439\u044b\u043d\u0448\u0430, \u0430\u043b\u044b\u0441\u0442\u0430\u043d \u0431\u0430\u0441\u049b\u0430\u0440\u0443\u0434\u044b \u0436\u04d9\u043d\u0435 \u0436\u0430\u043b\u0493\u0430\u0441\u0442\u044b\u0440\u0443\u0434\u044b \u049b\u043e\u043b\u0434\u0430\u043c\u0430\u0439\u0434\u044b.", @@ -1751,7 +1748,7 @@ "HeaderCancelSyncJob": "\u04ae\u043d\u0434\u0435\u0441\u0442\u0456\u0440\u0443\u0434\u0456 \u0431\u043e\u043b\u0434\u044b\u0440\u043c\u0430\u0443", "CancelSyncJobConfirmation": "\u04ae\u043d\u0434\u0435\u0441\u0442\u0456\u0440\u0443 \u0436\u04b1\u043c\u044b\u0441\u044b\u043d \u0431\u043e\u043b\u0434\u044b\u0440\u043c\u0430\u0443\u044b \u043a\u0435\u043b\u0435\u0441\u0456 \u04af\u043d\u0434\u0435\u0441\u0442\u0456\u0440\u0443 \u043f\u0440\u043e\u0446\u0435\u0441\u0456 \u043a\u0435\u0437\u0456\u043d\u0434\u0435 \u049b\u04b1\u0440\u044b\u043b\u0493\u044b\u0434\u0430\u043d \u04af\u043d\u0434\u0435\u0441\u0442\u0456\u0440\u0456\u043b\u0433\u0435\u043d \u0442\u0430\u0441\u044b\u0493\u044b\u0448\u0434\u0435\u0440\u0435\u043a\u0442\u0435\u0440\u0434\u0456 \u0436\u043e\u044f\u0434\u044b. \u0428\u044b\u043d\u044b\u043c\u0435\u043d \u043a\u0456\u0440\u0456\u0441\u0443 \u049b\u0430\u0436\u0435\u0442 \u043f\u0435?", "LabelQuality": "\u0421\u0430\u043f\u0430\u0441\u044b:", - "MessageBookPluginRequired": "Bookshelf \u043f\u043b\u0430\u0433\u0438\u043d\u0456\u043d \u043e\u0440\u043d\u0430\u0442\u0443\u0434\u044b \u049b\u0430\u0436\u0435\u0442 \u0435\u0442\u0435\u0434\u0456", + "BookLibraryHelp": "\u0414\u044b\u0431\u044b\u0441\u0442\u044b\u049b \u0436\u04d9\u043d\u0435 \u043c\u04d9\u0442\u0456\u043d\u0434\u0456\u043a \u043a\u0456\u0442\u0430\u043f\u0442\u0430\u0440 \u049b\u043e\u043b\u0434\u0430\u0443\u0434\u0430", "MessageGamePluginRequired": "GameBrowser \u043f\u043b\u0430\u0433\u0438\u043d\u0456\u043d \u043e\u0440\u043d\u0430\u0442\u0443\u0434\u044b \u049b\u0430\u0436\u0435\u0442 \u0435\u0442\u0435\u0434\u0456", "MessageUnsetContentHelp": "\u041c\u0430\u0437\u043c\u04b1\u043d \u043a\u04d9\u0434\u0456\u043c\u0433\u0456 \u049b\u0430\u043b\u0442\u0430\u043b\u0430\u0440 \u0440\u0435\u0442\u0456\u043d\u0434\u0435 \u0431\u0435\u0439\u043d\u0435\u043b\u0435\u043d\u0435\u0434\u0456. \u0415\u04a3 \u0436\u0430\u049b\u0441\u044b \u043d\u04d9\u0442\u0438\u0436\u0435\u043b\u0435\u0440 \u0430\u043b\u0443 \u04af\u0448\u0456\u043d, \u0456\u0448\u043a\u0456 \u049b\u0430\u043b\u0442\u0430\u043b\u0430\u0440\u0434\u044b\u04a3 \u043c\u0430\u0437\u043c\u04af\u043d \u0442\u04af\u0440\u043b\u0435\u0440\u0456\u043d \u043e\u0440\u043d\u0430\u0442\u044b\u043f \u041c\u0435\u0442\u0430\u0434\u0435\u0440\u0435\u043a \u0440\u0435\u0442\u0442\u0435\u0443\u0448\u0456\u043d\u0456 \u043f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u044b\u04a3\u044b\u0437", "SyncJobItemStatusQueued": "\u041a\u0435\u0437\u0435\u043a\u0442\u0435", @@ -1897,6 +1894,7 @@ "DownloadFFmpeg": "FFmpeg \u0436\u04af\u043a\u0442\u0435\u043f \u0430\u043b\u0443", "FFmpegSuggestedDownload": "\u04b0\u0441\u044b\u043d\u044b\u043b\u0493\u0430\u043d \u0436\u04af\u043a\u0442\u0435\u0443: {0}", "UnzipFFmpegFile": "\u0416\u04af\u043a\u0442\u0435\u043f \u0430\u043b\u044b\u043d\u0493\u0430\u043d \u0444\u0430\u0439\u043b\u0434\u044b \u049b\u0430\u043b\u0430\u0493\u0430\u043d \u049b\u0430\u043b\u0442\u0430\u0493\u0430 \u043c\u04b1\u0440\u0430\u0493\u0430\u0442\u0442\u0430\u043d \u0448\u044b\u0493\u0430\u0440\u044b\u04a3\u044b\u0437.", + "MarkFFmpegExec": "\u0415\u0433\u0435\u0440 Linux \u043d\u0435\u043c\u0435\u0441\u0435 OSX \u0436\u04af\u0435\u043b\u0435\u0440\u0456\u043d\u0434\u0435 \u0436\u04b1\u043c\u044b\u0441 \u0456\u0441\u0442\u0435\u043f \u0436\u0430\u0442\u0441\u0430\u04a3\u044b\u0437, ffmpeg \u0436\u04d9\u043d\u0435 ffprobe \u0444\u0430\u0439\u043b\u0434\u0430\u0440\u0434\u044b \u0442\u0430\u0431\u0443\u044b\u04a3\u044b\u0437 \u0436\u04d9\u043d\u0435 \u043e\u043b\u0430\u0440\u0434\u044b \u043e\u0440\u044b\u043d\u0434\u0430\u043b\u0430\u0442\u044b\u043d \u0434\u0435\u043f \u0431\u0435\u043b\u0433\u0456\u043b\u0435\u0443\u0456\u04a3\u0456\u0437 \u049b\u0430\u0436\u0435\u0442 \u0431\u043e\u043b\u0430\u0434\u044b. \u0411\u04b1\u043b \u043e\u043b\u0430\u0440\u0434\u044b \u043e\u0440\u044b\u043d\u0434\u0430\u0443\u0493\u0430 Emby \u0440\u04b1\u049b\u0441\u0430\u0442\u044b\u043d \u0431\u0435\u0440\u0443 \u04af\u0448\u0456\u043d \u049b\u0430\u0436\u0435\u0442.", "OptionUseSystemInstalledVersion": "\u0416\u04af\u0439\u0435\u0434\u0435 \u043e\u0440\u043d\u0430\u0442\u044b\u043b\u0493\u0430\u043d \u043d\u04b1\u0441\u049b\u0430\u043d\u044b \u043f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443", "OptionUseMyCustomVersion": "\u0420\u0435\u0442\u0442\u0435\u043b\u0435\u0442\u0456\u043d \u043d\u04b1\u0441\u049b\u0430\u043d\u044b \u043f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443", "FFmpegSavePathNotFound": "\u0411\u0456\u0437\u0433\u0435 \u0441\u0456\u0437 \u0435\u043d\u0433\u0456\u0437\u0433\u0435\u043d FFmpeg \u0436\u043e\u043b\u044b\u043d \u043f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u044b\u043f \u0442\u0430\u0431\u0443 \u043c\u04af\u043c\u043a\u0456\u043d \u0431\u043e\u043b\u043c\u0430\u0434\u044b. \u0421\u043e\u043d\u0434\u0430\u0439-\u0430\u049b FFprobe \u0442\u0430\u043b\u0430\u043f \u0435\u0442\u0456\u043b\u0435\u0434\u0456 \u0436\u04d9\u043d\u0435 \u0441\u043e\u043b \u049b\u0430\u043b\u0442\u0430\u0434\u0430 \u0431\u043e\u043b\u0443\u044b \u0436\u04e9\u043d. \u0411\u04b1\u043b \u049b\u04b1\u0440\u0430\u043c\u0434\u0430\u0441\u0442\u0430\u0440 \u04d9\u0434\u0435\u0442\u0442\u0435 \u0441\u043e\u043b \u0436\u04af\u043a\u0442\u0435\u0443\u043c\u0435\u043d \u0431\u0456\u0440\u0433\u0435 \u0436\u0435\u0442\u043a\u0456\u0437\u0456\u043b\u0435\u0434\u0456. \u0416\u043e\u043b\u0434\u044b \u0442\u0435\u043a\u0441\u0435\u0440\u0456\u043f, \u049b\u0430\u0439\u0442\u0430\u043b\u0430\u043f \u043a\u04e9\u0440\u0456\u04a3\u0456\u0437.", @@ -1945,5 +1943,7 @@ "LabelPostProcessorArguments": "\u041f\u043e\u0441\u0442-\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 \u043f\u04d9\u0440\u043c\u0435\u043d \u0436\u043e\u043b\u044b\u043d\u044b\u04a3 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0442\u0435\u0440\u0456:", "LabelPostProcessorArgumentsHelp": "\u0416\u0430\u0437\u044b\u043b\u0430\u0442\u044b\u043d \u0444\u0430\u0439\u043b \u0436\u043e\u043b\u044b \u0435\u0441\u0435\u0431\u0456\u043d\u0434\u0435 {path} \u043f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u044b\u04a3\u044b\u0437.", "LabelPostProcessor": "\u041a\u0435\u0439\u0456\u043d\u0433\u0456 \u04e9\u04a3\u0434\u0435\u0443 \u049b\u043e\u043b\u0434\u0430\u043d\u0431\u0430\u0441\u044b:", - "ErrorAddingXmlTvFile": "XmlTV \u0444\u0430\u0439\u043b\u044b\u043d\u0430 \u049b\u0430\u0442\u044b\u043d\u0430\u0443 \u043a\u0435\u0437\u0456\u043d\u0434\u0435 \u049b\u0430\u0442\u0435 \u043e\u0440\u044b\u043d \u0430\u043b\u0434\u044b. \u0424\u0430\u0439\u043b \u0431\u0430\u0440 \u0431\u043e\u043b\u0443\u044b\u043d\u0430 \u043a\u04e9\u0437 \u0436\u0435\u0442\u043a\u0456\u0437\u0456\u04a3\u0456\u0437 \u0434\u0435 \u04d9\u0440\u0435\u043a\u0435\u0442\u0442\u0456 \u049b\u0430\u0439\u0442\u0430\u043b\u0430\u04a3\u044b\u0437." + "ErrorAddingXmlTvFile": "XmlTV \u0444\u0430\u0439\u043b\u044b\u043d\u0430 \u049b\u0430\u0442\u044b\u043d\u0430\u0443 \u043a\u0435\u0437\u0456\u043d\u0434\u0435 \u049b\u0430\u0442\u0435 \u043e\u0440\u044b\u043d \u0430\u043b\u0434\u044b. \u0424\u0430\u0439\u043b \u0431\u0430\u0440 \u0431\u043e\u043b\u0443\u044b\u043d\u0430 \u043a\u04e9\u0437 \u0436\u0435\u0442\u043a\u0456\u0437\u0456\u04a3\u0456\u0437 \u0434\u0435 \u04d9\u0440\u0435\u043a\u0435\u0442\u0442\u0456 \u049b\u0430\u0439\u0442\u0430\u043b\u0430\u04a3\u044b\u0437.", + "OptionAutomaticallyGroupSeries": "\u0411\u0456\u0440\u043d\u0435\u0448\u0435 \u049b\u0430\u043b\u0442\u0430\u043b\u0430\u0440 \u0430\u0440\u0430\u0441\u044b\u043d\u0434\u0430 \u0442\u0430\u0440\u0430\u043b\u0493\u0430\u043d \u0442\u0435\u043b\u0435\u0445\u0438\u043a\u0430\u044f\u043d\u044b \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0442\u044b \u0442\u04af\u0440\u0434\u0435 \u0431\u0456\u0440 \u0442\u0435\u043b\u0435\u0445\u0438\u043a\u0430\u044f\u0493\u0430 \u0431\u0456\u0440\u0456\u043a\u0442\u0456\u0440\u0443", + "OptionAutomaticallyGroupSeriesHelp": "\u049a\u043e\u0441\u044b\u043b\u0493\u0430\u043d\u0434\u0430, \u043e\u0441\u044b \u0442\u0430\u0441\u044b\u0493\u044b\u0448\u0445\u0430\u043d\u0430 \u0456\u0448\u0456\u043d\u0434\u0435\u0433\u0456 \u0431\u0456\u0440\u043d\u0435\u0448\u0435 \u049b\u0430\u043b\u0442\u0430\u043b\u0430\u0440 \u0430\u0440\u0430\u0441\u044b\u043d\u0434\u0430 \u0442\u0430\u0440\u0430\u043b\u0493\u0430\u043d \u0442\u0435\u043b\u0435\u0445\u0438\u043a\u0430\u044f\u0441\u044b \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0442\u044b \u0442\u04af\u0440\u0434\u0435 \u0431\u0456\u0440 \u0442\u0435\u043b\u0435\u0445\u0438\u043a\u0430\u044f\u0493\u0430 \u0431\u0456\u0440\u0456\u043a\u0442\u0456\u0440\u0456\u043b\u0435\u0442\u0456\u043d \u0431\u043e\u043b\u0430\u0434\u044b." } \ No newline at end of file diff --git a/MediaBrowser.WebDashboard/dashboard-ui/strings/ko.json b/MediaBrowser.WebDashboard/dashboard-ui/strings/ko.json index 2652795f14..63e6e9e298 100644 --- a/MediaBrowser.WebDashboard/dashboard-ui/strings/ko.json +++ b/MediaBrowser.WebDashboard/dashboard-ui/strings/ko.json @@ -1,6 +1,4 @@ { - "OptionAutomaticallyGroupSeriesHelp": "If enabled, series that are spread across multiple folders within this library will be automatically merged into a single series.", - "OptionAutomaticallyGroupSeries": "Automatically merge series that are spread across multiple folders", "LabelPrevious": "\uc774\uc804", "LabelFinish": "\ub05d\ub0b4\uae30", "LabelNext": "\ub2e4\uc74c", @@ -173,7 +171,6 @@ "OptionPlayCount": "\uc7ac\uc0dd \ud69f\uc218", "OptionDatePlayed": "Date Played", "OptionDateAdded": "\ucd94\uac00\ud55c \ub0a0\uc9dc", - "DateAddedValue": "Date added: {0}", "OptionAlbumArtist": "\uc568\ubc94 \uc544\ud2f0\uc2a4\ud2b8", "OptionArtist": "\uc544\ud2f0\uc2a4\ud2b8", "OptionAlbum": "\uc568\ubc94", @@ -1751,7 +1748,7 @@ "HeaderCancelSyncJob": "\ub3d9\uae30\ud654 \ucde8\uc18c", "CancelSyncJobConfirmation": "\ub3d9\uae30\ud654 \uc791\uc5c5\uc744 \ucde8\uc18c\ud558\uba74 \ub2e4\uc74c \ub3d9\uae30\ud654\ub97c \uc9c4\ud589\ud560 \ub54c \ub3d9\uae30\ud654 \ub41c \ubbf8\ub514\uc5b4\ub97c \uc7a5\uce58\uc5d0\uc11c \uc0ad\uc81c\ud569\ub2c8\ub2e4. \uc9c4\ud589\ud558\uaca0\uc2b5\ub2c8\uae4c?", "LabelQuality": "\ud488\uc9c8:", - "MessageBookPluginRequired": "Bookshelf \ud50c\ub7ec\uadf8\uc778 \uc124\uce58 \ud544\uc694", + "BookLibraryHelp": "Audio and text books are supported", "MessageGamePluginRequired": "GameBrowser \ud50c\ub7ec\uadf8\uc778 \uc124\uce58 \ud544\uc694", "MessageUnsetContentHelp": "\ucf58\ud150\ud2b8\uac00 \uc77c\ubc18 \ud3f4\ub354\ub85c \ud45c\uc2dc\ub429\ub2c8\ub2e4. \ucd5c\uc0c1\uc758 \uacb0\uacfc\ub97c \uc704\ud574 \uba54\ud0c0\ub370\uc774\ud130 \uad00\ub9ac\uc790\ub97c \uc0ac\uc6a9\ud558\uc5ec \ud558\uc704 \ud3f4\ub354\uc758 \ucf58\ud150\ud2b8 \uc885\ub958\ub97c \uc124\uc815\ud558\uc138\uc694.", "SyncJobItemStatusQueued": "Queued", @@ -1897,6 +1894,7 @@ "DownloadFFmpeg": "Download FFmpeg", "FFmpegSuggestedDownload": "Suggested download: {0}", "UnzipFFmpegFile": "Unzip the downloaded file to a folder of your choice.", + "MarkFFmpegExec": "If you are running Linux or OSX, you will need to locate the ffmpeg and ffprobe files and mark them as executable. This is needed to grant Emby permission to execute them.", "OptionUseSystemInstalledVersion": "Use system installed version", "OptionUseMyCustomVersion": "Use a custom version", "FFmpegSavePathNotFound": "We're unable to locate FFmpeg using the path you've entered. FFprobe is also required and must exist in the same folder. These components are normally bundled together in the same download. Please check the path and try again.", @@ -1945,5 +1943,7 @@ "LabelPostProcessorArguments": "Post-processor command line arguments:", "LabelPostProcessorArgumentsHelp": "Use {path} as the path to the recording file.", "LabelPostProcessor": "Post-processing application:", - "ErrorAddingXmlTvFile": "There was an error accessing the XmlTV file. Please ensure the file exists and try again." + "ErrorAddingXmlTvFile": "There was an error accessing the XmlTV file. Please ensure the file exists and try again.", + "OptionAutomaticallyGroupSeries": "Automatically merge series that are spread across multiple folders", + "OptionAutomaticallyGroupSeriesHelp": "If enabled, series that are spread across multiple folders within this library will be automatically merged into a single series." } \ No newline at end of file diff --git a/MediaBrowser.WebDashboard/dashboard-ui/strings/lt-LT.json b/MediaBrowser.WebDashboard/dashboard-ui/strings/lt-LT.json index 9200f459f6..ecb8881434 100644 --- a/MediaBrowser.WebDashboard/dashboard-ui/strings/lt-LT.json +++ b/MediaBrowser.WebDashboard/dashboard-ui/strings/lt-LT.json @@ -1,6 +1,4 @@ { - "OptionAutomaticallyGroupSeriesHelp": "If enabled, series that are spread across multiple folders within this library will be automatically merged into a single series.", - "OptionAutomaticallyGroupSeries": "Automatically merge series that are spread across multiple folders", "LabelPrevious": "Ankstesnis", "LabelFinish": "Baigti", "LabelNext": "Kitas", @@ -173,7 +171,6 @@ "OptionPlayCount": "Rodym\u0173 kiekis", "OptionDatePlayed": "Rodymo data", "OptionDateAdded": "Prid\u0117jimo data", - "DateAddedValue": "Date added: {0}", "OptionAlbumArtist": "Albumo atlik\u0117jas", "OptionArtist": "Atlik\u0117jas", "OptionAlbum": "Albumas", @@ -1751,7 +1748,7 @@ "HeaderCancelSyncJob": "Cancel Sync", "CancelSyncJobConfirmation": "Cancelling the sync job will remove synced media from the device during the next sync process. Are you sure you wish to proceed?", "LabelQuality": "Quality:", - "MessageBookPluginRequired": "Requires installation of the Bookshelf plugin", + "BookLibraryHelp": "Audio and text books are supported", "MessageGamePluginRequired": "Requires installation of the GameBrowser plugin", "MessageUnsetContentHelp": "Content will be displayed as plain folders. For best results use the metadata manager to set the content types of sub-folders.", "SyncJobItemStatusQueued": "Queued", @@ -1897,6 +1894,7 @@ "DownloadFFmpeg": "Download FFmpeg", "FFmpegSuggestedDownload": "Suggested download: {0}", "UnzipFFmpegFile": "Unzip the downloaded file to a folder of your choice.", + "MarkFFmpegExec": "If you are running Linux or OSX, you will need to locate the ffmpeg and ffprobe files and mark them as executable. This is needed to grant Emby permission to execute them.", "OptionUseSystemInstalledVersion": "Use system installed version", "OptionUseMyCustomVersion": "Use a custom version", "FFmpegSavePathNotFound": "We're unable to locate FFmpeg using the path you've entered. FFprobe is also required and must exist in the same folder. These components are normally bundled together in the same download. Please check the path and try again.", @@ -1945,5 +1943,7 @@ "LabelPostProcessorArguments": "Post-processor command line arguments:", "LabelPostProcessorArgumentsHelp": "Use {path} as the path to the recording file.", "LabelPostProcessor": "Post-processing application:", - "ErrorAddingXmlTvFile": "There was an error accessing the XmlTV file. Please ensure the file exists and try again." + "ErrorAddingXmlTvFile": "There was an error accessing the XmlTV file. Please ensure the file exists and try again.", + "OptionAutomaticallyGroupSeries": "Automatically merge series that are spread across multiple folders", + "OptionAutomaticallyGroupSeriesHelp": "If enabled, series that are spread across multiple folders within this library will be automatically merged into a single series." } \ No newline at end of file diff --git a/MediaBrowser.WebDashboard/dashboard-ui/strings/ms.json b/MediaBrowser.WebDashboard/dashboard-ui/strings/ms.json index 82663ef54b..d301a495ae 100644 --- a/MediaBrowser.WebDashboard/dashboard-ui/strings/ms.json +++ b/MediaBrowser.WebDashboard/dashboard-ui/strings/ms.json @@ -1,6 +1,4 @@ { - "OptionAutomaticallyGroupSeriesHelp": "If enabled, series that are spread across multiple folders within this library will be automatically merged into a single series.", - "OptionAutomaticallyGroupSeries": "Automatically merge series that are spread across multiple folders", "LabelPrevious": "Sebelumnya", "LabelFinish": "Habis", "LabelNext": "Seterusnya", @@ -173,7 +171,6 @@ "OptionPlayCount": "Play Count", "OptionDatePlayed": "Date Played", "OptionDateAdded": "Date Added", - "DateAddedValue": "Date added: {0}", "OptionAlbumArtist": "Album Artist", "OptionArtist": "Artist", "OptionAlbum": "Album", @@ -1751,7 +1748,7 @@ "HeaderCancelSyncJob": "Cancel Sync", "CancelSyncJobConfirmation": "Cancelling the sync job will remove synced media from the device during the next sync process. Are you sure you wish to proceed?", "LabelQuality": "Quality:", - "MessageBookPluginRequired": "Requires installation of the Bookshelf plugin", + "BookLibraryHelp": "Audio and text books are supported", "MessageGamePluginRequired": "Requires installation of the GameBrowser plugin", "MessageUnsetContentHelp": "Content will be displayed as plain folders. For best results use the metadata manager to set the content types of sub-folders.", "SyncJobItemStatusQueued": "Queued", @@ -1897,6 +1894,7 @@ "DownloadFFmpeg": "Download FFmpeg", "FFmpegSuggestedDownload": "Suggested download: {0}", "UnzipFFmpegFile": "Unzip the downloaded file to a folder of your choice.", + "MarkFFmpegExec": "If you are running Linux or OSX, you will need to locate the ffmpeg and ffprobe files and mark them as executable. This is needed to grant Emby permission to execute them.", "OptionUseSystemInstalledVersion": "Use system installed version", "OptionUseMyCustomVersion": "Use a custom version", "FFmpegSavePathNotFound": "We're unable to locate FFmpeg using the path you've entered. FFprobe is also required and must exist in the same folder. These components are normally bundled together in the same download. Please check the path and try again.", @@ -1945,5 +1943,7 @@ "LabelPostProcessorArguments": "Post-processor command line arguments:", "LabelPostProcessorArgumentsHelp": "Use {path} as the path to the recording file.", "LabelPostProcessor": "Post-processing application:", - "ErrorAddingXmlTvFile": "There was an error accessing the XmlTV file. Please ensure the file exists and try again." + "ErrorAddingXmlTvFile": "There was an error accessing the XmlTV file. Please ensure the file exists and try again.", + "OptionAutomaticallyGroupSeries": "Automatically merge series that are spread across multiple folders", + "OptionAutomaticallyGroupSeriesHelp": "If enabled, series that are spread across multiple folders within this library will be automatically merged into a single series." } \ No newline at end of file diff --git a/MediaBrowser.WebDashboard/dashboard-ui/strings/nb.json b/MediaBrowser.WebDashboard/dashboard-ui/strings/nb.json index c4ca416ff4..97e6b61b7e 100644 --- a/MediaBrowser.WebDashboard/dashboard-ui/strings/nb.json +++ b/MediaBrowser.WebDashboard/dashboard-ui/strings/nb.json @@ -1,6 +1,4 @@ { - "OptionAutomaticallyGroupSeriesHelp": "Hvis aktivert, vil serien som er spredt over flere mapper innenfor dette biblioteket sp\u00f8r automatisk sl\u00e5tt sammen til en enkelt serie.", - "OptionAutomaticallyGroupSeries": "Fusjoner automatisk serier som er spredt ut over flere mapper", "LabelPrevious": "Forrige", "LabelFinish": "Ferdig", "LabelNext": "Neste", @@ -173,7 +171,6 @@ "OptionPlayCount": "Antall avspillinger", "OptionDatePlayed": "Dato spilt", "OptionDateAdded": "Dato lagt til", - "DateAddedValue": "Dato tilf\u00f8rt: {0}", "OptionAlbumArtist": "Album Artist", "OptionArtist": "Artist", "OptionAlbum": "Album", @@ -1751,7 +1748,7 @@ "HeaderCancelSyncJob": "Avbryt synkronisering", "CancelSyncJobConfirmation": "Avbryte synkronisering jobben vil fjerne synkronisert media fra enheten ved neste synkronisering prosess. Er du sikker p\u00e5 at du vil fortsette?", "LabelQuality": "Kvalitet:", - "MessageBookPluginRequired": "Forutsetter at programtillegget bokhylle er installert", + "BookLibraryHelp": "Audio and text books are supported", "MessageGamePluginRequired": "Forutsetter at programtillegget GameBrowser er installert", "MessageUnsetContentHelp": "Innhold vises som enkle mapper. For beste resultat, bruk metadata for \u00e5 sette innholdstype for mapper.", "SyncJobItemStatusQueued": "I k\u00f8", @@ -1897,6 +1894,7 @@ "DownloadFFmpeg": "Last ned FFmpeg", "FFmpegSuggestedDownload": "Foresl\u00e5tte nedlasting: {0}", "UnzipFFmpegFile": "Pakku ut den nedlastede zip-filen til en mappe av ditt valg.", + "MarkFFmpegExec": "If you are running Linux or OSX, you will need to locate the ffmpeg and ffprobe files and mark them as executable. This is needed to grant Emby permission to execute them.", "OptionUseSystemInstalledVersion": "Bruk system installert versjonen", "OptionUseMyCustomVersion": "Bruk en egen definert versjon", "FFmpegSavePathNotFound": "Vi kan dessverre ikke finne FFmpeg bruke banen du har angitt. FFprobe er ogs\u00e5 n\u00f8dvendig og m\u00e5 ligge i samme mappe. Disse komponentene er vanligvis buntet sammen i samme nedlastning. Kontroller banen og pr\u00f8v igjen.", @@ -1945,5 +1943,7 @@ "LabelPostProcessorArguments": "Post-prosessering kommandolinjeargumenter:", "LabelPostProcessorArgumentsHelp": "Bruk {path} som banen til opptaksfilen.", "LabelPostProcessor": "Etterbehandling applikasjon:", - "ErrorAddingXmlTvFile": "Det oppstod en feil tilgang til XmlTV filen. S\u00f8rg for at filen finnes og pr\u00f8v igjen." + "ErrorAddingXmlTvFile": "Det oppstod en feil tilgang til XmlTV filen. S\u00f8rg for at filen finnes og pr\u00f8v igjen.", + "OptionAutomaticallyGroupSeries": "Fusjoner automatisk serier som er spredt ut over flere mapper", + "OptionAutomaticallyGroupSeriesHelp": "Hvis aktivert, vil serien som er spredt over flere mapper innenfor dette biblioteket sp\u00f8r automatisk sl\u00e5tt sammen til en enkelt serie." } \ No newline at end of file diff --git a/MediaBrowser.WebDashboard/dashboard-ui/strings/nl.json b/MediaBrowser.WebDashboard/dashboard-ui/strings/nl.json index 1c4a23bc1f..e040775a88 100644 --- a/MediaBrowser.WebDashboard/dashboard-ui/strings/nl.json +++ b/MediaBrowser.WebDashboard/dashboard-ui/strings/nl.json @@ -1,6 +1,4 @@ { - "OptionAutomaticallyGroupSeriesHelp": "If enabled, series that are spread across multiple folders within this library will be automatically merged into a single series.", - "OptionAutomaticallyGroupSeries": "Automatically merge series that are spread across multiple folders", "LabelPrevious": "Vorige", "LabelFinish": "Voltooien", "LabelNext": "Volgende", @@ -173,7 +171,6 @@ "OptionPlayCount": "Afspeel telling", "OptionDatePlayed": "Datum afgespeeld", "OptionDateAdded": "Datum toegevoegd", - "DateAddedValue": "Date added: {0}", "OptionAlbumArtist": "Albumartiest", "OptionArtist": "Artiest", "OptionAlbum": "Album", @@ -1751,7 +1748,7 @@ "HeaderCancelSyncJob": "Annuleer synchronisatie", "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?", "LabelQuality": "Kwaliteit", - "MessageBookPluginRequired": "Vereist installatie van de Bookshelf plugin", + "BookLibraryHelp": "Audio and text books are supported", "MessageGamePluginRequired": "Vereist installatie van de GameBrowser plugin", "MessageUnsetContentHelp": "Inhoud zal als gewone folders worden getoond. Gebruik voor het beste resultaat de Metadata Manager om de inhoud types voor subfolders in te stellen.", "SyncJobItemStatusQueued": "In wachtrij", @@ -1897,6 +1894,7 @@ "DownloadFFmpeg": "Download FFmpeg", "FFmpegSuggestedDownload": "Voorgestelde download: {0}", "UnzipFFmpegFile": "Pak het gedownloade bestand uit naar een map van uw keuze.", + "MarkFFmpegExec": "If you are running Linux or OSX, you will need to locate the ffmpeg and ffprobe files and mark them as executable. This is needed to grant Emby permission to execute them.", "OptionUseSystemInstalledVersion": "Gebruik door systeem ge\u00efnstalleerde versie", "OptionUseMyCustomVersion": "Gebruik een aangepaste versie", "FFmpegSavePathNotFound": "We zijn niet in staat om FFmpeg te lokaliseren met behulp van het pad dat u hebt ingevoerd. FFprobe is ook nodig en moet \u200b\u200bin dezelfde map staan. Deze componenten worden gewoonlijk gebundeld in dezelfde download. Controleer het pad en probeer het opnieuw.", @@ -1945,5 +1943,7 @@ "LabelPostProcessorArguments": "Nabewerkings command line argumenten:", "LabelPostProcessorArgumentsHelp": "Gebruik {path} als het pad naar het opnamebestand.", "LabelPostProcessor": "Nabewerkings toepassing:", - "ErrorAddingXmlTvFile": "There was an error accessing the XmlTV file. Please ensure the file exists and try again." + "ErrorAddingXmlTvFile": "There was an error accessing the XmlTV file. Please ensure the file exists and try again.", + "OptionAutomaticallyGroupSeries": "Automatically merge series that are spread across multiple folders", + "OptionAutomaticallyGroupSeriesHelp": "If enabled, series that are spread across multiple folders within this library will be automatically merged into a single series." } \ No newline at end of file diff --git a/MediaBrowser.WebDashboard/dashboard-ui/strings/pl.json b/MediaBrowser.WebDashboard/dashboard-ui/strings/pl.json index 4367a1d7cd..e07f5ed418 100644 --- a/MediaBrowser.WebDashboard/dashboard-ui/strings/pl.json +++ b/MediaBrowser.WebDashboard/dashboard-ui/strings/pl.json @@ -1,6 +1,4 @@ { - "OptionAutomaticallyGroupSeriesHelp": "If enabled, series that are spread across multiple folders within this library will be automatically merged into a single series.", - "OptionAutomaticallyGroupSeries": "Automatically merge series that are spread across multiple folders", "LabelPrevious": "Wstecz", "LabelFinish": "Koniec", "LabelNext": "Dalej", @@ -173,7 +171,6 @@ "OptionPlayCount": "Ilo\u015b\u0107 odtworze\u0144", "OptionDatePlayed": "Data odtworzenia", "OptionDateAdded": "Data dodania", - "DateAddedValue": "Date added: {0}", "OptionAlbumArtist": "Artysta albumu", "OptionArtist": "Artysta", "OptionAlbum": "Album", @@ -1751,7 +1748,7 @@ "HeaderCancelSyncJob": "Anuluj synchronizacj\u0119", "CancelSyncJobConfirmation": "Anulowanie synchronizacji spowoduje usuni\u0119cie medi\u00f3w z urz\u0105dzenia podczas kolejnej synchronizacji. Czy jeste\u015b pewien, \u017ce chcesz kontynuowa\u0107?", "LabelQuality": "Jako\u015b\u0107:", - "MessageBookPluginRequired": "Wymaga instalacji wtyczki Bookshelf", + "BookLibraryHelp": "Audio and text books are supported", "MessageGamePluginRequired": "Wymaga instalacji wtyczki GameBrowser", "MessageUnsetContentHelp": "Zawarto\u015b\u0107 zostanie wy\u015bwietlona jako p\u0142askie foldery, dla najlepszych wynik\u00f3w u\u017cyj menad\u017cera metadanych dla ustawienia typu zawarto\u015bci sub folder\u00f3w.", "SyncJobItemStatusQueued": "Zakolejkowano", @@ -1897,6 +1894,7 @@ "DownloadFFmpeg": "Pobierz FFmpeg", "FFmpegSuggestedDownload": "Sugerowane pobieranie: {0}", "UnzipFFmpegFile": "Rozpakuj pobrany plik do wybranego folderu.", + "MarkFFmpegExec": "If you are running Linux or OSX, you will need to locate the ffmpeg and ffprobe files and mark them as executable. This is needed to grant Emby permission to execute them.", "OptionUseSystemInstalledVersion": "U\u017cyj wersji systemowej", "OptionUseMyCustomVersion": "U\u017cyj wersji niestandardowej", "FFmpegSavePathNotFound": "Nie Jeste\u015bmy w stanie zlokalizowa\u0107 FFmpeg przy u\u017cyciu wprowadzonej \u015bcie\u017cki. FFprobe jest r\u00f3wnie\u017c wymagane i musi znajdowa\u0107 si\u0119 w tym samym folderze. Elementy te s\u0105 zwykle w tej samej paczce. Prosz\u0119 sprawdzi\u0107 \u015bcie\u017ck\u0119 i spr\u00f3buj ponownie.", @@ -1945,5 +1943,7 @@ "LabelPostProcessorArguments": "Post-processor command line arguments:", "LabelPostProcessorArgumentsHelp": "Use {path} as the path to the recording file.", "LabelPostProcessor": "Post-processing application:", - "ErrorAddingXmlTvFile": "There was an error accessing the XmlTV file. Please ensure the file exists and try again." + "ErrorAddingXmlTvFile": "There was an error accessing the XmlTV file. Please ensure the file exists and try again.", + "OptionAutomaticallyGroupSeries": "Automatically merge series that are spread across multiple folders", + "OptionAutomaticallyGroupSeriesHelp": "If enabled, series that are spread across multiple folders within this library will be automatically merged into a single series." } \ No newline at end of file diff --git a/MediaBrowser.WebDashboard/dashboard-ui/strings/pt-BR.json b/MediaBrowser.WebDashboard/dashboard-ui/strings/pt-BR.json index 15e0645957..279ae926b8 100644 --- a/MediaBrowser.WebDashboard/dashboard-ui/strings/pt-BR.json +++ b/MediaBrowser.WebDashboard/dashboard-ui/strings/pt-BR.json @@ -1,6 +1,4 @@ { - "OptionAutomaticallyGroupSeriesHelp": "If enabled, series that are spread across multiple folders within this library will be automatically merged into a single series.", - "OptionAutomaticallyGroupSeries": "Automatically merge series that are spread across multiple folders", "LabelPrevious": "Anterior", "LabelFinish": "Finalizar", "LabelNext": "Pr\u00f3ximo", @@ -26,7 +24,7 @@ "LabelAddConnectSupporterHelp": "Para adicionar um usu\u00e1rio que n\u00e3o esteja listado, voc\u00ea precisar\u00e1 associar sua conta ao Emby Connect na sua p\u00e1gina de perfil.", "LabelPinCode": "C\u00f3digo Pin:", "OptionHideWatchedContentFromLatestMedia": "Ocultar conte\u00fado j\u00e1 assistido das m\u00eddias recentes", - "DeleteMedia": "Delete media", + "DeleteMedia": "Excluir m\u00eddia", "HeaderSync": "Sincroniza\u00e7\u00e3o", "ButtonOk": "Ok", "ButtonCancel": "Cancelar", @@ -173,7 +171,6 @@ "OptionPlayCount": "N\u00ba de Reprodu\u00e7\u00f5es", "OptionDatePlayed": "Data da Reprodu\u00e7\u00e3o", "OptionDateAdded": "Data da Adi\u00e7\u00e3o", - "DateAddedValue": "Date added: {0}", "OptionAlbumArtist": "Artista do \u00c1lbum", "OptionArtist": "Artista", "OptionAlbum": "\u00c1lbum", @@ -1210,7 +1207,7 @@ "OptionPlayNextEpisodeAutomatically": "Reproduzir pr\u00f3ximo epis\u00f3dio automaticamente", "OptionDownloadImagesInAdvance": "Fazer download das imagens antecipadamente", "SettingsSaved": "Ajustes salvos.", - "OptionDownloadImagesInAdvanceHelp": "Por padr\u00e3o, a maioria das imagens s\u00e3o baixadas s\u00f3 quando um app Emby solicita. Ativar esta op\u00e7\u00e3o far\u00e1 download de todas as imagens atencipadamente, assim que novas m\u00eddias s\u00e3o importadas.", + "OptionDownloadImagesInAdvanceHelp": "Por padr\u00e3o, a maioria das imagens s\u00e3o baixadas s\u00f3 quando um app Emby solicita. Ativar esta op\u00e7\u00e3o far\u00e1 download de todas as imagens atencipadamente, assim que novas m\u00eddias s\u00e3o importadas. Isto pode ocasionar um tempo maior para rastrear a biblioteca.", "Users": "Usu\u00e1rios", "Delete": "Excluir", "Password": "Senha", @@ -1751,7 +1748,7 @@ "HeaderCancelSyncJob": "Cancelar Sincroniza\u00e7\u00e3o", "CancelSyncJobConfirmation": "Cancelar a tarefa de sincroniza\u00e7\u00e3o remover\u00e1 m\u00eddias sincronizadas do dispositivo durante o pr\u00f3ximo processo de sincroniza\u00e7\u00e3o. Deseja realmente proceder?", "LabelQuality": "Qualidade:", - "MessageBookPluginRequired": "Requer a instala\u00e7\u00e3o do plugin Bookshelf", + "BookLibraryHelp": "Livros de \u00e1udio e texto s\u00e3o suportados", "MessageGamePluginRequired": "Requer a instala\u00e7\u00e3o do plugin GameBrowser", "MessageUnsetContentHelp": "O conte\u00fado ser\u00e1 exibido em pastas simples. Para melhor resultado, use o gerenciador de metadados para definir os tipos de conte\u00fado das sub-pastas.", "SyncJobItemStatusQueued": "Enfileirado", @@ -1897,6 +1894,7 @@ "DownloadFFmpeg": "Baixar FFmpeg", "FFmpegSuggestedDownload": "Download sugerido: {0}", "UnzipFFmpegFile": "Descompacte o arquivo baixado para uma pasta de sua escolha", + "MarkFFmpegExec": "Se estiver executando Linux ou OSX, voc\u00ea precisar\u00e1 localizar os arquivos de ffmpeg e ffprobe e marc\u00e1-los como execut\u00e1veis. Isto \u00e9 necess\u00e1rio para dar permiss\u00e3o ao Emby para execut\u00e1-los.", "OptionUseSystemInstalledVersion": "Utilizar vers\u00e3o instalada no sistema", "OptionUseMyCustomVersion": "Utilizar uma vers\u00e3o personalizada:", "FFmpegSavePathNotFound": "N\u00e3o foi poss\u00edvel localizar FFmpeg utilizando o caminho que voc\u00ea digitou. O FFprobe tamb\u00e9m \u00e9 obrigat\u00f3rio e precisa existir na mesma pasta. Estes componentes normalmente est\u00e3o juntos no mesmo download. Por favor verifique o caminho e tente novamente.", @@ -1945,5 +1943,7 @@ "LabelPostProcessorArguments": "Argumentos de linha de comando do P\u00f3s-processador:", "LabelPostProcessorArgumentsHelp": "Usar {path} como a localiza\u00e7\u00e3o do arquivo de grava\u00e7\u00e3o.", "LabelPostProcessor": "Aplica\u00e7\u00e3o de P\u00f3s-processamento:", - "ErrorAddingXmlTvFile": "There was an error accessing the XmlTV file. Please ensure the file exists and try again." + "ErrorAddingXmlTvFile": "Ocorreu um erro ao acessar o arquivo XmlTV. Por favor, assegure-se que o arquivo exista e tente novamente.", + "OptionAutomaticallyGroupSeries": "Reunir automaticamente s\u00e9ries que estejam espalhadas por m\u00faltiplas pastas", + "OptionAutomaticallyGroupSeriesHelp": "Se ativado, s\u00e9ries que estiverem espalhadas por m\u00faltiplas pastas dentro desta biblioteca ser\u00e3o automaticamente reunidas em uma mesma s\u00e9rie." } \ No newline at end of file diff --git a/MediaBrowser.WebDashboard/dashboard-ui/strings/pt-PT.json b/MediaBrowser.WebDashboard/dashboard-ui/strings/pt-PT.json index 7c1d6124a2..09a4e5fa88 100644 --- a/MediaBrowser.WebDashboard/dashboard-ui/strings/pt-PT.json +++ b/MediaBrowser.WebDashboard/dashboard-ui/strings/pt-PT.json @@ -1,6 +1,4 @@ { - "OptionAutomaticallyGroupSeriesHelp": "If enabled, series that are spread across multiple folders within this library will be automatically merged into a single series.", - "OptionAutomaticallyGroupSeries": "Automatically merge series that are spread across multiple folders", "LabelPrevious": "Anterior", "LabelFinish": "Terminar", "LabelNext": "Seguinte", @@ -173,7 +171,6 @@ "OptionPlayCount": "N.\u00ba Visualiza\u00e7\u00f5es", "OptionDatePlayed": "Data de reprodu\u00e7\u00e3o", "OptionDateAdded": "Data de adi\u00e7\u00e3o", - "DateAddedValue": "Date added: {0}", "OptionAlbumArtist": "Artista do \u00c1lbum", "OptionArtist": "Artista", "OptionAlbum": "\u00c1lbum", @@ -1751,7 +1748,7 @@ "HeaderCancelSyncJob": "Cancel Sync", "CancelSyncJobConfirmation": "Cancelar a tarefa de sincroniza\u00e7\u00e3o remover\u00e1 ficheiros sincronizados do dispositivo durante o pr\u00f3ximo processo de sincroniza\u00e7\u00e3o. Deseja realmente proceder?", "LabelQuality": "Quality:", - "MessageBookPluginRequired": "Requires installation of the Bookshelf plugin", + "BookLibraryHelp": "Audio and text books are supported", "MessageGamePluginRequired": "Requires installation of the GameBrowser plugin", "MessageUnsetContentHelp": "Content will be displayed as plain folders. For best results use the metadata manager to set the content types of sub-folders.", "SyncJobItemStatusQueued": "Queued", @@ -1897,6 +1894,7 @@ "DownloadFFmpeg": "Download FFmpeg", "FFmpegSuggestedDownload": "Suggested download: {0}", "UnzipFFmpegFile": "Unzip the downloaded file to a folder of your choice.", + "MarkFFmpegExec": "If you are running Linux or OSX, you will need to locate the ffmpeg and ffprobe files and mark them as executable. This is needed to grant Emby permission to execute them.", "OptionUseSystemInstalledVersion": "Use system installed version", "OptionUseMyCustomVersion": "Use a custom version", "FFmpegSavePathNotFound": "We're unable to locate FFmpeg using the path you've entered. FFprobe is also required and must exist in the same folder. These components are normally bundled together in the same download. Please check the path and try again.", @@ -1945,5 +1943,7 @@ "LabelPostProcessorArguments": "Post-processor command line arguments:", "LabelPostProcessorArgumentsHelp": "Use {path} as the path to the recording file.", "LabelPostProcessor": "Post-processing application:", - "ErrorAddingXmlTvFile": "There was an error accessing the XmlTV file. Please ensure the file exists and try again." + "ErrorAddingXmlTvFile": "There was an error accessing the XmlTV file. Please ensure the file exists and try again.", + "OptionAutomaticallyGroupSeries": "Automatically merge series that are spread across multiple folders", + "OptionAutomaticallyGroupSeriesHelp": "If enabled, series that are spread across multiple folders within this library will be automatically merged into a single series." } \ No newline at end of file diff --git a/MediaBrowser.WebDashboard/dashboard-ui/strings/ro.json b/MediaBrowser.WebDashboard/dashboard-ui/strings/ro.json index 84660d0a69..c0f98360c3 100644 --- a/MediaBrowser.WebDashboard/dashboard-ui/strings/ro.json +++ b/MediaBrowser.WebDashboard/dashboard-ui/strings/ro.json @@ -1,6 +1,4 @@ { - "OptionAutomaticallyGroupSeriesHelp": "If enabled, series that are spread across multiple folders within this library will be automatically merged into a single series.", - "OptionAutomaticallyGroupSeries": "Automatically merge series that are spread across multiple folders", "LabelPrevious": "Anteriorul", "LabelFinish": "Termina", "LabelNext": "Urmatorul", @@ -173,7 +171,6 @@ "OptionPlayCount": "Contorizari rulari", "OptionDatePlayed": "Data Rulare", "OptionDateAdded": "Data Adaugare", - "DateAddedValue": "Date added: {0}", "OptionAlbumArtist": "Album Artist", "OptionArtist": "Artist", "OptionAlbum": "Album", @@ -1751,7 +1748,7 @@ "HeaderCancelSyncJob": "Cancel Sync", "CancelSyncJobConfirmation": "Cancelling the sync job will remove synced media from the device during the next sync process. Are you sure you wish to proceed?", "LabelQuality": "Quality:", - "MessageBookPluginRequired": "Requires installation of the Bookshelf plugin", + "BookLibraryHelp": "Audio and text books are supported", "MessageGamePluginRequired": "Requires installation of the GameBrowser plugin", "MessageUnsetContentHelp": "Content will be displayed as plain folders. For best results use the metadata manager to set the content types of sub-folders.", "SyncJobItemStatusQueued": "Queued", @@ -1897,6 +1894,7 @@ "DownloadFFmpeg": "Download FFmpeg", "FFmpegSuggestedDownload": "Suggested download: {0}", "UnzipFFmpegFile": "Unzip the downloaded file to a folder of your choice.", + "MarkFFmpegExec": "If you are running Linux or OSX, you will need to locate the ffmpeg and ffprobe files and mark them as executable. This is needed to grant Emby permission to execute them.", "OptionUseSystemInstalledVersion": "Use system installed version", "OptionUseMyCustomVersion": "Use a custom version", "FFmpegSavePathNotFound": "We're unable to locate FFmpeg using the path you've entered. FFprobe is also required and must exist in the same folder. These components are normally bundled together in the same download. Please check the path and try again.", @@ -1945,5 +1943,7 @@ "LabelPostProcessorArguments": "Post-processor command line arguments:", "LabelPostProcessorArgumentsHelp": "Use {path} as the path to the recording file.", "LabelPostProcessor": "Post-processing application:", - "ErrorAddingXmlTvFile": "There was an error accessing the XmlTV file. Please ensure the file exists and try again." + "ErrorAddingXmlTvFile": "There was an error accessing the XmlTV file. Please ensure the file exists and try again.", + "OptionAutomaticallyGroupSeries": "Automatically merge series that are spread across multiple folders", + "OptionAutomaticallyGroupSeriesHelp": "If enabled, series that are spread across multiple folders within this library will be automatically merged into a single series." } \ No newline at end of file diff --git a/MediaBrowser.WebDashboard/dashboard-ui/strings/ru.json b/MediaBrowser.WebDashboard/dashboard-ui/strings/ru.json index 5f281c52c4..4d9b966dea 100644 --- a/MediaBrowser.WebDashboard/dashboard-ui/strings/ru.json +++ b/MediaBrowser.WebDashboard/dashboard-ui/strings/ru.json @@ -1,6 +1,4 @@ { - "OptionAutomaticallyGroupSeriesHelp": "\u041f\u0440\u0438 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438, \u0441\u0435\u0440\u0438\u0430\u043b\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0440\u0430\u0437\u0431\u0440\u043e\u0441\u0430\u043d\u044b \u043f\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c \u043f\u0430\u043f\u043a\u0430\u043c \u0434\u0430\u043d\u043d\u043e\u0439 \u043c\u0435\u0434\u0438\u0430\u0442\u0435\u043a\u0438, \u0431\u0443\u0434\u0443\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u043b\u0438\u0442\u044b \u0432 \u0435\u0434\u0438\u043d\u044b\u0439 \u0441\u0435\u0440\u0438\u0430\u043b.", - "OptionAutomaticallyGroupSeries": "\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u043b\u0438\u0432\u0430\u0442\u044c \u0441\u0435\u0440\u0438\u0430\u043b\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0440\u0430\u0437\u0431\u0440\u043e\u0441\u0430\u043d\u044b \u043f\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c \u043f\u0430\u043f\u043a\u0430\u043c", "LabelPrevious": "\u041f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435", "LabelFinish": "\u0413\u043e\u0442\u043e\u0432\u043e", "LabelNext": "\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435", @@ -173,7 +171,6 @@ "OptionPlayCount": "\u041a\u043e\u043b. \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0439", "OptionDatePlayed": "\u0414\u0430\u0442\u0430 \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f", "OptionDateAdded": "\u0414\u0430\u0442\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f", - "DateAddedValue": "\u0414\u0430\u0442\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f: {0}", "OptionAlbumArtist": "\u0418\u0441\u043f. \u0430\u043b\u044c\u0431\u043e\u043c\u0430", "OptionArtist": "\u0418\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c", "OptionAlbum": "\u0410\u043b\u044c\u0431\u043e\u043c", @@ -1751,7 +1748,7 @@ "HeaderCancelSyncJob": "\u041e\u0442\u043c\u0435\u043d\u0430 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438", "CancelSyncJobConfirmation": "\u041e\u0442\u043c\u0435\u043d\u0430 \u0437\u0430\u0434\u0430\u043d\u0438\u044f \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0440\u0438\u0432\u0435\u0434\u0451\u0442 \u043a \u0438\u0437\u044a\u044f\u0442\u0438\u044e \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043c\u0435\u0434\u0438\u0430\u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0439 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438. \u0412\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u0442\u044c?", "LabelQuality": "\u041a\u0430\u0447\u0435\u0441\u0442\u0432\u043e:", - "MessageBookPluginRequired": "\u0422\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u043f\u043b\u0430\u0433\u0438\u043d\u0430 Bookshelf", + "BookLibraryHelp": "\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0430\u0443\u0434\u0438\u043e \u0438 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0435 \u043a\u043d\u0438\u0433\u0438", "MessageGamePluginRequired": "\u0422\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u043f\u043b\u0430\u0433\u0438\u043d\u0430 GameBrowser", "MessageUnsetContentHelp": "\u0421\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u044b\u0435 \u043f\u0430\u043f\u043a\u0438. \u0414\u043b\u044f \u043d\u0430\u0438\u043b\u0443\u0447\u0448\u0438\u0445 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u0434\u0438\u0441\u043f\u0435\u0442\u0447\u0435\u0440 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445, \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u0434\u0430\u0442\u044c \u0442\u0438\u043f \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u044f \u043f\u043e\u0434\u043f\u0430\u043f\u043e\u043a.", "SyncJobItemStatusQueued": "\u0412 \u043e\u0447\u0435\u0440\u0435\u0434\u0438", @@ -1897,6 +1894,7 @@ "DownloadFFmpeg": "\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c FFmpeg", "FFmpegSuggestedDownload": "\u041f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u043c\u0430\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430: {0}", "UnzipFFmpegFile": "\u0420\u0430\u0441\u043f\u0430\u043a\u0443\u0439\u0442\u0435 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u044b\u0439 \u0444\u0430\u0439\u043b \u0432 \u043f\u0430\u043f\u043a\u0443 \u043f\u043e \u0432\u0430\u0448\u0435\u043c\u0443 \u0432\u044b\u0431\u043e\u0440\u0443.", + "MarkFFmpegExec": "\u0415\u0441\u043b\u0438 \u0432\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442\u0435 \u0432 Linux \u0438\u043b\u0438 OSX, \u0432\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u0439\u0442\u0438 \u0444\u0430\u0439\u043b\u044b ffmpeg \u0438 ffprobe \u0438 \u043f\u043e\u043c\u0435\u0442\u0438\u0442\u044c \u0438\u0445 \u043a\u0430\u043a \u0438\u0441\u043f\u043e\u043b\u043d\u0438\u043c\u044b\u0435. \u042d\u0442\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c Emby \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043d\u0430 \u0438\u0445 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435.", "OptionUseSystemInstalledVersion": "\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u0443\u044e \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u0432\u0435\u0440\u0441\u0438\u044e", "OptionUseMyCustomVersion": "\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e", "FFmpegSavePathNotFound": "\u041c\u044b \u043d\u0435 \u0441\u043c\u043e\u0433\u043b\u0438 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u0442\u044c FFmpeg \u043f\u043e \u0432\u0432\u0435\u0434\u0451\u043d\u043d\u043e\u043c\u0443 \u0432\u0430\u043c\u0438 \u043f\u0443\u0442\u0438. FFprobe \u0442\u0430\u043a\u0436\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c \u0438 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0432 \u0442\u043e\u0439 \u0436\u0435 \u0441\u0430\u043c\u043e\u0439 \u043f\u0430\u043f\u043a\u0435. \u042d\u0442\u0438 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u043e\u0431\u044b\u0447\u043d\u043e \u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0432\u043c\u0435\u0441\u0442\u0435 \u0432 \u043e\u0434\u043d\u043e\u043c \u0437\u0430\u0433\u0440\u0443\u0437\u043e\u0447\u043d\u043e\u043c \u043f\u0430\u043a\u0435\u0442\u0435. \u041f\u0440\u043e\u0432\u0435\u0440\u044c\u0442\u0435 \u043f\u0443\u0442\u044c \u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u0435 \u043f\u043e\u043f\u044b\u0442\u043a\u0443.", @@ -1945,5 +1943,7 @@ "LabelPostProcessorArguments": "\u0410\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u043f\u043e\u0441\u0442\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430:", "LabelPostProcessorArgumentsHelp": "\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 {path} \u043a\u0430\u043a \u043f\u0443\u0442\u044c \u043a \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c\u043e\u043c\u0443 \u0444\u0430\u0439\u043b\u0443.", "LabelPostProcessor": "\u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043f\u043e\u0441\u0442\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438", - "ErrorAddingXmlTvFile": "\u041f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0430 \u043e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u0435 \u043a XmlTV-\u0444\u0430\u0439\u043b\u0443. \u0423\u0431\u0435\u0434\u0438\u0442\u0435\u0441\u044c, \u0447\u0442\u043e \u0444\u0430\u0439\u043b \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u0435 \u043f\u043e\u043f\u044b\u0442\u043a\u0443." + "ErrorAddingXmlTvFile": "\u041f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0430 \u043e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u0435 \u043a XmlTV-\u0444\u0430\u0439\u043b\u0443. \u0423\u0431\u0435\u0434\u0438\u0442\u0435\u0441\u044c, \u0447\u0442\u043e \u0444\u0430\u0439\u043b \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u0435 \u043f\u043e\u043f\u044b\u0442\u043a\u0443.", + "OptionAutomaticallyGroupSeries": "\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u043b\u0438\u0432\u0430\u0442\u044c \u0441\u0435\u0440\u0438\u0430\u043b\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0440\u0430\u0437\u0431\u0440\u043e\u0441\u0430\u043d\u044b \u043f\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c \u043f\u0430\u043f\u043a\u0430\u043c", + "OptionAutomaticallyGroupSeriesHelp": "\u041f\u0440\u0438 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438, \u0441\u0435\u0440\u0438\u0430\u043b\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0440\u0430\u0437\u0431\u0440\u043e\u0441\u0430\u043d\u044b \u043f\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c \u043f\u0430\u043f\u043a\u0430\u043c \u0434\u0430\u043d\u043d\u043e\u0439 \u043c\u0435\u0434\u0438\u0430\u0442\u0435\u043a\u0438, \u0431\u0443\u0434\u0443\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u043b\u0438\u0442\u044b \u0432 \u0435\u0434\u0438\u043d\u044b\u0439 \u0441\u0435\u0440\u0438\u0430\u043b." } \ No newline at end of file diff --git a/MediaBrowser.WebDashboard/dashboard-ui/strings/sk.json b/MediaBrowser.WebDashboard/dashboard-ui/strings/sk.json index 08915e00ca..8bcf2ce6c5 100644 --- a/MediaBrowser.WebDashboard/dashboard-ui/strings/sk.json +++ b/MediaBrowser.WebDashboard/dashboard-ui/strings/sk.json @@ -1,6 +1,4 @@ { - "OptionAutomaticallyGroupSeriesHelp": "If enabled, series that are spread across multiple folders within this library will be automatically merged into a single series.", - "OptionAutomaticallyGroupSeries": "Automatically merge series that are spread across multiple folders", "LabelPrevious": "Previous", "LabelFinish": "Finish", "LabelNext": "Next", @@ -173,7 +171,6 @@ "OptionPlayCount": "Play Count", "OptionDatePlayed": "Date Played", "OptionDateAdded": "Date Added", - "DateAddedValue": "Date added: {0}", "OptionAlbumArtist": "Album Artist", "OptionArtist": "Artist", "OptionAlbum": "Album", @@ -1751,7 +1748,7 @@ "HeaderCancelSyncJob": "Cancel Sync", "CancelSyncJobConfirmation": "Cancelling the sync job will remove synced media from the device during the next sync process. Are you sure you wish to proceed?", "LabelQuality": "Quality:", - "MessageBookPluginRequired": "Requires installation of the Bookshelf plugin", + "BookLibraryHelp": "Audio and text books are supported", "MessageGamePluginRequired": "Requires installation of the GameBrowser plugin", "MessageUnsetContentHelp": "Content will be displayed as plain folders. For best results use the metadata manager to set the content types of sub-folders.", "SyncJobItemStatusQueued": "Queued", @@ -1897,6 +1894,7 @@ "DownloadFFmpeg": "Download FFmpeg", "FFmpegSuggestedDownload": "Suggested download: {0}", "UnzipFFmpegFile": "Unzip the downloaded file to a folder of your choice.", + "MarkFFmpegExec": "If you are running Linux or OSX, you will need to locate the ffmpeg and ffprobe files and mark them as executable. This is needed to grant Emby permission to execute them.", "OptionUseSystemInstalledVersion": "Use system installed version", "OptionUseMyCustomVersion": "Use a custom version", "FFmpegSavePathNotFound": "We're unable to locate FFmpeg using the path you've entered. FFprobe is also required and must exist in the same folder. These components are normally bundled together in the same download. Please check the path and try again.", @@ -1945,5 +1943,7 @@ "LabelPostProcessorArguments": "Post-processor command line arguments:", "LabelPostProcessorArgumentsHelp": "Use {path} as the path to the recording file.", "LabelPostProcessor": "Post-processing application:", - "ErrorAddingXmlTvFile": "There was an error accessing the XmlTV file. Please ensure the file exists and try again." + "ErrorAddingXmlTvFile": "There was an error accessing the XmlTV file. Please ensure the file exists and try again.", + "OptionAutomaticallyGroupSeries": "Automatically merge series that are spread across multiple folders", + "OptionAutomaticallyGroupSeriesHelp": "If enabled, series that are spread across multiple folders within this library will be automatically merged into a single series." } \ No newline at end of file diff --git a/MediaBrowser.WebDashboard/dashboard-ui/strings/sl-SI.json b/MediaBrowser.WebDashboard/dashboard-ui/strings/sl-SI.json index 385c28b1d5..58d3547d83 100644 --- a/MediaBrowser.WebDashboard/dashboard-ui/strings/sl-SI.json +++ b/MediaBrowser.WebDashboard/dashboard-ui/strings/sl-SI.json @@ -1,6 +1,4 @@ { - "OptionAutomaticallyGroupSeriesHelp": "If enabled, series that are spread across multiple folders within this library will be automatically merged into a single series.", - "OptionAutomaticallyGroupSeries": "Automatically merge series that are spread across multiple folders", "LabelPrevious": "Nazaj", "LabelFinish": "Konec", "LabelNext": "Naprej", @@ -173,7 +171,6 @@ "OptionPlayCount": "Play Count", "OptionDatePlayed": "Date Played", "OptionDateAdded": "Date Added", - "DateAddedValue": "Date added: {0}", "OptionAlbumArtist": "Album Artist", "OptionArtist": "Artist", "OptionAlbum": "Album", @@ -1751,7 +1748,7 @@ "HeaderCancelSyncJob": "Cancel Sync", "CancelSyncJobConfirmation": "Cancelling the sync job will remove synced media from the device during the next sync process. Are you sure you wish to proceed?", "LabelQuality": "Kvaliteta:", - "MessageBookPluginRequired": "Requires installation of the Bookshelf plugin", + "BookLibraryHelp": "Audio and text books are supported", "MessageGamePluginRequired": "Requires installation of the GameBrowser plugin", "MessageUnsetContentHelp": "Content will be displayed as plain folders. For best results use the metadata manager to set the content types of sub-folders.", "SyncJobItemStatusQueued": "Queued", @@ -1897,6 +1894,7 @@ "DownloadFFmpeg": "Download FFmpeg", "FFmpegSuggestedDownload": "Suggested download: {0}", "UnzipFFmpegFile": "Unzip the downloaded file to a folder of your choice.", + "MarkFFmpegExec": "If you are running Linux or OSX, you will need to locate the ffmpeg and ffprobe files and mark them as executable. This is needed to grant Emby permission to execute them.", "OptionUseSystemInstalledVersion": "Use system installed version", "OptionUseMyCustomVersion": "Use a custom version", "FFmpegSavePathNotFound": "We're unable to locate FFmpeg using the path you've entered. FFprobe is also required and must exist in the same folder. These components are normally bundled together in the same download. Please check the path and try again.", @@ -1945,5 +1943,7 @@ "LabelPostProcessorArguments": "Post-processor command line arguments:", "LabelPostProcessorArgumentsHelp": "Use {path} as the path to the recording file.", "LabelPostProcessor": "Post-processing application:", - "ErrorAddingXmlTvFile": "There was an error accessing the XmlTV file. Please ensure the file exists and try again." + "ErrorAddingXmlTvFile": "There was an error accessing the XmlTV file. Please ensure the file exists and try again.", + "OptionAutomaticallyGroupSeries": "Automatically merge series that are spread across multiple folders", + "OptionAutomaticallyGroupSeriesHelp": "If enabled, series that are spread across multiple folders within this library will be automatically merged into a single series." } \ No newline at end of file diff --git a/MediaBrowser.WebDashboard/dashboard-ui/strings/sv.json b/MediaBrowser.WebDashboard/dashboard-ui/strings/sv.json index 5ac853065b..1627ef9e79 100644 --- a/MediaBrowser.WebDashboard/dashboard-ui/strings/sv.json +++ b/MediaBrowser.WebDashboard/dashboard-ui/strings/sv.json @@ -1,6 +1,4 @@ { - "OptionAutomaticallyGroupSeriesHelp": "If enabled, series that are spread across multiple folders within this library will be automatically merged into a single series.", - "OptionAutomaticallyGroupSeries": "Sl\u00e5 ihop serier automatiskt som ligger utspritt under flera kataloger", "LabelPrevious": "F\u00f6reg\u00e5ende", "LabelFinish": "Klart", "LabelNext": "N\u00e4sta", @@ -173,7 +171,6 @@ "OptionPlayCount": "Antal visningar", "OptionDatePlayed": "Senast visad", "OptionDateAdded": "Inlagd den", - "DateAddedValue": "Datum tillagt: {0}", "OptionAlbumArtist": "Albumartist", "OptionArtist": "Artist", "OptionAlbum": "Album", @@ -1751,7 +1748,7 @@ "HeaderCancelSyncJob": "Avbryt synkronisering", "CancelSyncJobConfirmation": "Om synkroniseringen avbryts kommer synkad media tas bort under n\u00e4sta synkprocess. \u00c4r du s\u00e4ker p\u00e5 att du vill forts\u00e4tta?", "LabelQuality": "Kvalitet", - "MessageBookPluginRequired": "Kr\u00e4ver installation av tj\u00e4nsten 'Bookshelf'", + "BookLibraryHelp": "Audio and text books are supported", "MessageGamePluginRequired": "Kr\u00e4ver installation av tj\u00e4nsten 'GameBrowser'", "MessageUnsetContentHelp": "Inneh\u00e5ll kommer visas som enkla mappar. F\u00f6r b\u00e4sta resultat, anv\u00e4nd en metadata-hanterare f\u00f6r att st\u00e4lla in typ av inneh\u00e5ll f\u00f6r undermapparna.", "SyncJobItemStatusQueued": "K\u00f6as", @@ -1897,6 +1894,7 @@ "DownloadFFmpeg": "Ladda ner FFmpeg", "FFmpegSuggestedDownload": "Rekommenderad nedladdning: {0}", "UnzipFFmpegFile": "Packa upp den nedladdade filen till en valfri katalog.", + "MarkFFmpegExec": "If you are running Linux or OSX, you will need to locate the ffmpeg and ffprobe files and mark them as executable. This is needed to grant Emby permission to execute them.", "OptionUseSystemInstalledVersion": "Anv\u00e4nd systemversionen", "OptionUseMyCustomVersion": "Anv\u00e4nd en anpassad version", "FFmpegSavePathNotFound": "We're unable to locate FFmpeg using the path you've entered. FFprobe is also required and must exist in the same folder. These components are normally bundled together in the same download. Please check the path and try again.", @@ -1945,5 +1943,7 @@ "LabelPostProcessorArguments": "Post-processor command line arguments:", "LabelPostProcessorArgumentsHelp": "Use {path} as the path to the recording file.", "LabelPostProcessor": "Post-processing application:", - "ErrorAddingXmlTvFile": "There was an error accessing the XmlTV file. Please ensure the file exists and try again." + "ErrorAddingXmlTvFile": "There was an error accessing the XmlTV file. Please ensure the file exists and try again.", + "OptionAutomaticallyGroupSeries": "Sl\u00e5 ihop serier automatiskt som ligger utspritt under flera kataloger", + "OptionAutomaticallyGroupSeriesHelp": "If enabled, series that are spread across multiple folders within this library will be automatically merged into a single series." } \ No newline at end of file diff --git a/MediaBrowser.WebDashboard/dashboard-ui/strings/tr.json b/MediaBrowser.WebDashboard/dashboard-ui/strings/tr.json index e4605b813b..a29b66c174 100644 --- a/MediaBrowser.WebDashboard/dashboard-ui/strings/tr.json +++ b/MediaBrowser.WebDashboard/dashboard-ui/strings/tr.json @@ -1,6 +1,4 @@ { - "OptionAutomaticallyGroupSeriesHelp": "If enabled, series that are spread across multiple folders within this library will be automatically merged into a single series.", - "OptionAutomaticallyGroupSeries": "Automatically merge series that are spread across multiple folders", "LabelPrevious": "\u00d6nceki", "LabelFinish": "Bitir", "LabelNext": "Sonraki", @@ -173,7 +171,6 @@ "OptionPlayCount": "Oynatma sayac\u0131", "OptionDatePlayed": "Oynatma Tarihi", "OptionDateAdded": "Eklenme Tarihi", - "DateAddedValue": "Date added: {0}", "OptionAlbumArtist": "Sanat\u00e7\u0131 Alb\u00fcm\u00fc", "OptionArtist": "Sanat\u00e7\u0131", "OptionAlbum": "Alb\u00fcm", @@ -1751,7 +1748,7 @@ "HeaderCancelSyncJob": "Cancel Sync", "CancelSyncJobConfirmation": "Cancelling the sync job will remove synced media from the device during the next sync process. Are you sure you wish to proceed?", "LabelQuality": "Quality:", - "MessageBookPluginRequired": "Requires installation of the Bookshelf plugin", + "BookLibraryHelp": "Audio and text books are supported", "MessageGamePluginRequired": "Requires installation of the GameBrowser plugin", "MessageUnsetContentHelp": "Content will be displayed as plain folders. For best results use the metadata manager to set the content types of sub-folders.", "SyncJobItemStatusQueued": "Queued", @@ -1897,6 +1894,7 @@ "DownloadFFmpeg": "Download FFmpeg", "FFmpegSuggestedDownload": "Suggested download: {0}", "UnzipFFmpegFile": "Unzip the downloaded file to a folder of your choice.", + "MarkFFmpegExec": "If you are running Linux or OSX, you will need to locate the ffmpeg and ffprobe files and mark them as executable. This is needed to grant Emby permission to execute them.", "OptionUseSystemInstalledVersion": "Use system installed version", "OptionUseMyCustomVersion": "Use a custom version", "FFmpegSavePathNotFound": "We're unable to locate FFmpeg using the path you've entered. FFprobe is also required and must exist in the same folder. These components are normally bundled together in the same download. Please check the path and try again.", @@ -1945,5 +1943,7 @@ "LabelPostProcessorArguments": "Post-processor command line arguments:", "LabelPostProcessorArgumentsHelp": "Use {path} as the path to the recording file.", "LabelPostProcessor": "Post-processing application:", - "ErrorAddingXmlTvFile": "There was an error accessing the XmlTV file. Please ensure the file exists and try again." + "ErrorAddingXmlTvFile": "There was an error accessing the XmlTV file. Please ensure the file exists and try again.", + "OptionAutomaticallyGroupSeries": "Automatically merge series that are spread across multiple folders", + "OptionAutomaticallyGroupSeriesHelp": "If enabled, series that are spread across multiple folders within this library will be automatically merged into a single series." } \ No newline at end of file diff --git a/MediaBrowser.WebDashboard/dashboard-ui/strings/uk.json b/MediaBrowser.WebDashboard/dashboard-ui/strings/uk.json index 4797e21f4e..b9a32728a7 100644 --- a/MediaBrowser.WebDashboard/dashboard-ui/strings/uk.json +++ b/MediaBrowser.WebDashboard/dashboard-ui/strings/uk.json @@ -1,6 +1,4 @@ { - "OptionAutomaticallyGroupSeriesHelp": "If enabled, series that are spread across multiple folders within this library will be automatically merged into a single series.", - "OptionAutomaticallyGroupSeries": "Automatically merge series that are spread across multiple folders", "LabelPrevious": "\u041d\u0430\u0437\u0430\u0434", "LabelFinish": "Finish", "LabelNext": "\u0412\u043f\u0435\u0440\u0435\u0434", @@ -173,7 +171,6 @@ "OptionPlayCount": "Play Count", "OptionDatePlayed": "Date Played", "OptionDateAdded": "Date Added", - "DateAddedValue": "Date added: {0}", "OptionAlbumArtist": "Album Artist", "OptionArtist": "\u0410\u043a\u0442\u043e\u0440", "OptionAlbum": "\u0410\u043b\u044c\u0431\u043e\u043c", @@ -1751,7 +1748,7 @@ "HeaderCancelSyncJob": "Cancel Sync", "CancelSyncJobConfirmation": "Cancelling the sync job will remove synced media from the device during the next sync process. Are you sure you wish to proceed?", "LabelQuality": "Quality:", - "MessageBookPluginRequired": "Requires installation of the Bookshelf plugin", + "BookLibraryHelp": "Audio and text books are supported", "MessageGamePluginRequired": "Requires installation of the GameBrowser plugin", "MessageUnsetContentHelp": "Content will be displayed as plain folders. For best results use the metadata manager to set the content types of sub-folders.", "SyncJobItemStatusQueued": "Queued", @@ -1897,6 +1894,7 @@ "DownloadFFmpeg": "Download FFmpeg", "FFmpegSuggestedDownload": "Suggested download: {0}", "UnzipFFmpegFile": "Unzip the downloaded file to a folder of your choice.", + "MarkFFmpegExec": "If you are running Linux or OSX, you will need to locate the ffmpeg and ffprobe files and mark them as executable. This is needed to grant Emby permission to execute them.", "OptionUseSystemInstalledVersion": "Use system installed version", "OptionUseMyCustomVersion": "Use a custom version", "FFmpegSavePathNotFound": "We're unable to locate FFmpeg using the path you've entered. FFprobe is also required and must exist in the same folder. These components are normally bundled together in the same download. Please check the path and try again.", @@ -1945,5 +1943,7 @@ "LabelPostProcessorArguments": "Post-processor command line arguments:", "LabelPostProcessorArgumentsHelp": "Use {path} as the path to the recording file.", "LabelPostProcessor": "Post-processing application:", - "ErrorAddingXmlTvFile": "There was an error accessing the XmlTV file. Please ensure the file exists and try again." + "ErrorAddingXmlTvFile": "There was an error accessing the XmlTV file. Please ensure the file exists and try again.", + "OptionAutomaticallyGroupSeries": "Automatically merge series that are spread across multiple folders", + "OptionAutomaticallyGroupSeriesHelp": "If enabled, series that are spread across multiple folders within this library will be automatically merged into a single series." } \ No newline at end of file diff --git a/MediaBrowser.WebDashboard/dashboard-ui/strings/vi.json b/MediaBrowser.WebDashboard/dashboard-ui/strings/vi.json index f16c5a11a8..7b9559bd62 100644 --- a/MediaBrowser.WebDashboard/dashboard-ui/strings/vi.json +++ b/MediaBrowser.WebDashboard/dashboard-ui/strings/vi.json @@ -1,6 +1,4 @@ { - "OptionAutomaticallyGroupSeriesHelp": "If enabled, series that are spread across multiple folders within this library will be automatically merged into a single series.", - "OptionAutomaticallyGroupSeries": "Automatically merge series that are spread across multiple folders", "LabelPrevious": "Tr\u01b0\u1edbc", "LabelFinish": "K\u1ebft th\u00fac", "LabelNext": "Ti\u1ebfp theo", @@ -173,7 +171,6 @@ "OptionPlayCount": "S\u1ed1 l\u1ea7n ph\u00e1t", "OptionDatePlayed": "Ng\u00e0y ph\u00e1t", "OptionDateAdded": "Ng\u00e0y th\u00eam", - "DateAddedValue": "Date added: {0}", "OptionAlbumArtist": "Album ngh\u1ec7 s\u1ef9", "OptionArtist": "Ngh\u1ec7 s\u1ef9", "OptionAlbum": "Album", @@ -1751,7 +1748,7 @@ "HeaderCancelSyncJob": "Cancel Sync", "CancelSyncJobConfirmation": "Cancelling the sync job will remove synced media from the device during the next sync process. Are you sure you wish to proceed?", "LabelQuality": "Quality:", - "MessageBookPluginRequired": "Requires installation of the Bookshelf plugin", + "BookLibraryHelp": "Audio and text books are supported", "MessageGamePluginRequired": "Requires installation of the GameBrowser plugin", "MessageUnsetContentHelp": "Content will be displayed as plain folders. For best results use the metadata manager to set the content types of sub-folders.", "SyncJobItemStatusQueued": "Queued", @@ -1897,6 +1894,7 @@ "DownloadFFmpeg": "Download FFmpeg", "FFmpegSuggestedDownload": "Suggested download: {0}", "UnzipFFmpegFile": "Unzip the downloaded file to a folder of your choice.", + "MarkFFmpegExec": "If you are running Linux or OSX, you will need to locate the ffmpeg and ffprobe files and mark them as executable. This is needed to grant Emby permission to execute them.", "OptionUseSystemInstalledVersion": "Use system installed version", "OptionUseMyCustomVersion": "Use a custom version", "FFmpegSavePathNotFound": "We're unable to locate FFmpeg using the path you've entered. FFprobe is also required and must exist in the same folder. These components are normally bundled together in the same download. Please check the path and try again.", @@ -1945,5 +1943,7 @@ "LabelPostProcessorArguments": "Post-processor command line arguments:", "LabelPostProcessorArgumentsHelp": "Use {path} as the path to the recording file.", "LabelPostProcessor": "Post-processing application:", - "ErrorAddingXmlTvFile": "There was an error accessing the XmlTV file. Please ensure the file exists and try again." + "ErrorAddingXmlTvFile": "There was an error accessing the XmlTV file. Please ensure the file exists and try again.", + "OptionAutomaticallyGroupSeries": "Automatically merge series that are spread across multiple folders", + "OptionAutomaticallyGroupSeriesHelp": "If enabled, series that are spread across multiple folders within this library will be automatically merged into a single series." } \ No newline at end of file diff --git a/MediaBrowser.WebDashboard/dashboard-ui/strings/zh-CN.json b/MediaBrowser.WebDashboard/dashboard-ui/strings/zh-CN.json index ea31964a72..54597b698c 100644 --- a/MediaBrowser.WebDashboard/dashboard-ui/strings/zh-CN.json +++ b/MediaBrowser.WebDashboard/dashboard-ui/strings/zh-CN.json @@ -1,6 +1,4 @@ { - "OptionAutomaticallyGroupSeriesHelp": "If enabled, series that are spread across multiple folders within this library will be automatically merged into a single series.", - "OptionAutomaticallyGroupSeries": "\u81ea\u52a8\u5408\u5e76\u5206\u5e03\u5728\u4e0d\u540c\u6587\u4ef6\u5939\u7684\u7cfb\u5217", "LabelPrevious": "\u4e0a\u4e00\u4e2a", "LabelFinish": "\u5b8c\u6210", "LabelNext": "\u4e0b\u4e00\u4e2a", @@ -168,12 +166,11 @@ "OptionUnplayed": "\u672a\u64ad\u653e", "OptionAscending": "\u5347\u5e8f", "OptionDescending": "\u964d\u5e8f", - "OptionRuntime": "\u64ad\u653e\u65f6\u95f4", + "OptionRuntime": "\u64ad\u653e\u65f6\u957f", "OptionReleaseDate": "\u53d1\u884c\u65e5\u671f", "OptionPlayCount": "\u64ad\u653e\u6b21\u6570", "OptionDatePlayed": "\u64ad\u653e\u65e5\u671f", "OptionDateAdded": "\u52a0\u5165\u65e5\u671f", - "DateAddedValue": "\u6dfb\u52a0\u65e5\u671f\uff1a{0}", "OptionAlbumArtist": "\u4e13\u8f91\u827a\u672f\u5bb6", "OptionArtist": "\u827a\u672f\u5bb6", "OptionAlbum": "\u4e13\u8f91", @@ -298,7 +295,7 @@ "LabelRunServerAtStartupHelp": "\u670d\u52a1\u5668\u6258\u76d8\u56fe\u6807\u5c06\u4f1a\u5728windows\u5f00\u673a\u65f6\u542f\u52a8\u3002\u8981\u542f\u52a8windows\u670d\u52a1\uff0c\u8bf7\u53d6\u6d88\u8fd9\u4e2a\u9009\u9879\uff0c\u5e76\u4eceWindows\u63a7\u5236\u9762\u677f\u4e2d\u8fd0\u884c\u670d\u52a1\u3002\u8bf7\u6ce8\u610f\uff1a\u4f60\u4e0d\u80fd\u8ba9\u6258\u76d8\u56fe\u6807\u548cwindows\u670d\u52a1\u540c\u65f6\u8fd0\u884c\uff0c\u542f\u52a8\u670d\u52a1\u4e4b\u524d\u4f60\u5fc5\u987b\u5148\u9000\u51fa\u6258\u76d8\u56fe\u6807\u3002", "ButtonSelectDirectory": "\u9009\u62e9\u76ee\u5f55", "LabelCachePath": "\u7f13\u5b58\u8def\u5f84\uff1a", - "LabelCachePathHelp": "Specify a custom location for server cache files, such as images. Leave blank to use the server default.", + "LabelCachePathHelp": "\u6307\u5b9a\u670d\u52a1\u5668\u7f13\u5b58\u6587\u4ef6\u7684\u81ea\u5b9a\u4e49\u8def\u5f84\uff0c\u6bd4\u5982\u56fe\u7247\u3002\u7559\u7a7a\u5c06\u4f7f\u7528\u670d\u52a1\u5668\u9ed8\u8ba4\u3002", "LabelRecordingPath": "\u9ed8\u8ba4\u5f55\u5236\u8def\u5f84\uff1a", "LabelMovieRecordingPath": "\u7535\u5f71\u5f55\u5236\u8def\u5f84 (\u53ef\u9009)\uff1a", "LabelSeriesRecordingPath": "\u7cfb\u5217\u5f55\u5236\u8def\u5f84 (\u53ef\u9009)\uff1a", @@ -658,7 +655,7 @@ "LabelMaxBitrateHelp": "\u6307\u5b9a\u5728\u5e26\u5bbd\u53d7\u9650\u7684\u73af\u5883\u6700\u5927\u6bd4\u7279\u7387\uff0c\u6216\u8005\u8bbe\u5907\u6309\u5b83\u81ea\u5df1\u7684\u6700\u5927\u9650\u5ea6\u8fd0\u4f5c\u3002", "LabelMaxStreamingBitrate": "\u6700\u5927\u5a92\u4f53\u6d41\u6bd4\u7279\u7387\uff1a", "LabelMaxStreamingBitrateHelp": "\u8f6c\u6362\u5a92\u4f53\u6d41\u65f6\uff0c\u8bf7\u6307\u5b9a\u4e00\u4e2a\u6700\u5927\u6bd4\u7279\u7387\u3002", - "LabelMaxChromecastBitrate": "Max Chromecast bitrate:", + "LabelMaxChromecastBitrate": "\u6700\u5927 Chromecast \u6bd4\u7279\u7387\uff1a", "LabelMusicStaticBitrate": "\u97f3\u4e50\u540c\u6b65\u6bd4\u7279\u7387\uff1a", "LabelMusicStaticBitrateHelp": "\u8bf7\u6307\u5b9a\u4e00\u4e2a\u540c\u6b65\u97f3\u4e50\u65f6\u7684\u6700\u5927\u6bd4\u7279\u7387\u3002", "LabelMusicStreamingTranscodingBitrate": "\u97f3\u4e50\u8f6c\u7801\u7684\u6bd4\u7279\u7387\uff1a", @@ -793,7 +790,7 @@ "LabelKodiMetadataEnablePathSubstitution": "\u542f\u7528\u8def\u5f84\u66ff\u6362", "LabelKodiMetadataEnablePathSubstitutionHelp": "\u5141\u8bb8\u56fe\u50cf\u7684\u8def\u5f84\u66ff\u6362\u4f7f\u7528\u670d\u52a1\u5668\u7684\u8def\u5f84\u66ff\u6362\u8bbe\u7f6e\u3002", "LabelKodiMetadataEnablePathSubstitutionHelp2": "\u67e5\u770b\u8def\u5f84\u66ff\u6362", - "OptionDisplayChannelsInline": "Display channels as media folders", + "OptionDisplayChannelsInline": "\u663e\u793a\u9891\u9053\u4e3a\u5a92\u4f53\u6587\u4ef6\u5939", "OptionDisplayChannelsInlineHelp": "If enabled, channels will be displayed directly alongside other media libraries. If disabled, they'll be displayed within a separate Channels folder.", "LabelDisplayCollectionsView": "\u663e\u793a\u5408\u96c6\u89c6\u56fe\u6765\u5448\u73b0\u7535\u5f71\u5408\u96c6", "LabelDisplayCollectionsViewHelp": "This will create a separate view to display movie collections. To create a collection, right-click or tap-hold any movie and select 'Add to Collection'. ", @@ -1140,7 +1137,7 @@ "HeaderDisplay": "\u663e\u793a", "HeaderNavigation": "\u5bfc\u822a", "OptionEnableAutomaticServerUpdates": "\u5f00\u542f\u81ea\u52a8\u670d\u52a1\u5668\u66f4\u65b0", - "OptionOtherTrailers": "Include trailers from older movies", + "OptionOtherTrailers": "\u5305\u62ec\u65e7\u7535\u5f71\u7684\u9884\u544a\u7247", "HeaderOverview": "Overview", "HeaderShortOverview": "Short Overview", "HeaderType": "Type", @@ -1166,14 +1163,14 @@ "HeaderImageBackdrop": "Backdrop", "HeaderImageLogo": "Logo", "HeaderUserPrimaryImage": "User Image", - "ButtonProfile": "Profile", + "ButtonProfile": "\u6863\u6848", "ButtonProfileHelp": "Set your profile image and password.", "HeaderHomeScreenSettings": "Home Screen settings", - "HeaderProfile": "Profile", - "HeaderLanguage": "Language", + "HeaderProfile": "\u6863\u6848", + "HeaderLanguage": "\u8bed\u8a00", "LabelTranscodingThreadCount": "\u8f6c\u7801\u7ebf\u7a0b\u6570\uff1a", "LabelTranscodingThreadCountHelp": "Select the maximum number of threads to use when transcoding. Reducing the thread count will lower cpu usage but may not convert fast enough for a smooth playback experience.", - "OptionMax": "Max", + "OptionMax": "\u6700\u5927", "LabelSyncPath": "Synced content path:", "OptionSyncOnlyOnWifi": "\u53ea\u5728 wifi \u4e0b\u540c\u6b65", "OptionSyncLosslessAudioOriginal": "Sync lossless audio at original quality", @@ -1182,25 +1179,25 @@ "LabelTunerType": "\u8c03\u8c10\u5668\u7c7b\u578b\uff1a", "HelpMoreTunersCanBeAdded": "Additional tuners can be added later within the Live TV section.", "AdditionalLiveTvProvidersCanBeInstalledLater": "Additional Live TV providers can be added later within the Live TV section.", - "HeaderSetupTVGuide": "Setup TV Guide", + "HeaderSetupTVGuide": "\u8bbe\u7f6e\u7535\u89c6\u6307\u5357", "LabelDataProvider": "\u6570\u636e\u63d0\u4f9b\u8005\uff1a", "OptionSendRecordingsToAutoOrganize": "Automatically organize recordings into existing series folders in other libraries", - "HeaderDefaultRecordingSettings": "Default Recording Settings", + "HeaderDefaultRecordingSettings": "\u9ed8\u8ba4\u5f55\u5236\u8bbe\u5b9a", "OptionEnableRecordingSubfolders": "Create sub-folders for categories such as Sports, Kids, etc.", "HeaderSubtitles": "\u5b57\u5e55", - "HeaderVideos": "Videos", - "LabelHardwareAccelerationType": "Hardware acceleration:", + "HeaderVideos": "\u89c6\u9891", + "LabelHardwareAccelerationType": "\u786c\u4ef6\u52a0\u901f\uff1a", "LabelHardwareAccelerationTypeHelp": "\u53ea\u80fd\u5728\u652f\u6301\u7684\u7cfb\u7edf\u4e0a\u4f7f\u7528\u3002", "ButtonServerDashboard": "Server Dashboard", - "HeaderAdmin": "Admin", + "HeaderAdmin": "\u7ba1\u7406", "ButtonSignOut": "\u9000\u51fa", "HeaderCameraUpload": "Camera Upload", "SelectCameraUploadServers": "Upload camera photos to the following servers:", - "ButtonClear": "Clear", - "LabelFolder": "Folder:", - "HeadersFolders": "Folders", - "LabelDisplayName": "Display name:", - "HeaderNewRecording": "New Recording", + "ButtonClear": "\u6e05\u9664", + "LabelFolder": "\u6587\u4ef6\u5939\uff1a", + "HeadersFolders": "\u6587\u4ef6\u5939", + "LabelDisplayName": "\u663e\u793a\u540d\u79f0\uff1a", + "HeaderNewRecording": "\u65b0\u5f55\u5236", "LabelCodecIntrosPath": "Codec intros path:", "LabelCodecIntrosPathHelp": "A folder containing video files. If an intro video file name matches the video codec, audio codec, audio profile, or a tag, then it will be played prior to the main feature.", "OptionConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format", @@ -1259,14 +1256,14 @@ "ValueTimeLimitSingleHour": "\u65f6\u95f4\u9650\u5236\uff1a1 \u5c0f\u65f6", "ValueTimeLimitMultiHour": "\u65f6\u95f4\u9650\u5236\uff1a{0} \u5c0f\u65f6", "PluginCategoryGeneral": "\u5e38\u89c4", - "PluginCategoryContentProvider": "Content Providers", - "PluginCategoryScreenSaver": "Screen Savers", - "PluginCategoryTheme": "Themes", - "PluginCategorySync": "Sync", - "PluginCategorySocialIntegration": "Social Networks", - "PluginCategoryNotifications": "Notifications", - "PluginCategoryMetadata": "Metadata", - "PluginCategoryLiveTV": "Live TV", + "PluginCategoryContentProvider": "\u5185\u5bb9\u63d0\u4f9b\u5546", + "PluginCategoryScreenSaver": "\u5c4f\u4fdd", + "PluginCategoryTheme": "\u4e3b\u9898", + "PluginCategorySync": "\u540c\u6b65", + "PluginCategorySocialIntegration": "\u793e\u4ea4\u7f51\u7edc", + "PluginCategoryNotifications": "\u901a\u77e5", + "PluginCategoryMetadata": "\u5a92\u4f53\u8d44\u6599", + "PluginCategoryLiveTV": "\u7535\u89c6\u76f4\u64ad", "PluginCategoryChannel": "\u9891\u9053", "HeaderSearch": "\u641c\u7d22", "ValueDateCreated": "\u521b\u5efa\u65e5\u671f\uff1a {0}", @@ -1283,10 +1280,10 @@ "SyncJobStatusFailed": "\u5df2\u5931\u8d25", "SyncJobStatusCancelled": "\u5df2\u53d6\u6d88", "SyncJobStatusCompleted": "\u5df2\u540c\u6b65", - "SyncJobStatusReadyToTransfer": "Ready to Transfer", + "SyncJobStatusReadyToTransfer": "\u4f20\u8f93\u5c31\u7eea", "SyncJobStatusTransferring": "\u4f20\u8f93\u4e2d", "SyncJobStatusCompletedWithError": "Synced with errors", - "SyncJobItemStatusReadyToTransfer": "Ready to Transfer", + "SyncJobItemStatusReadyToTransfer": "\u4f20\u8f93\u5c31\u7eea", "LabelCollection": "\u5408\u96c6", "HeaderDevices": "\u8bbe\u5907", "ButtonScheduledTasks": "\u8ba1\u5212\u4efb\u52a1", @@ -1315,12 +1312,12 @@ "LabelNumberReviews": "{0} \u8bc4\u8bba", "LabelFree": "\u514d\u8d39", "HeaderPlaybackError": "\u56de\u653e\u9519\u8bef", - "MessagePlaybackErrorNotAllowed": "You're currently not authorized to play this content. Please contact your system administrator for details.", + "MessagePlaybackErrorNotAllowed": "\u60a8\u76ee\u524d\u4e0d\u5141\u8bb8\u64ad\u653e\u6b64\u5185\u5bb9\u3002\u8bf7\u8054\u7cfb\u60a8\u7684\u7cfb\u7edf\u7ba1\u7406\u5458\u4e86\u89e3\u8be6\u60c5\u3002", "MessagePlaybackErrorNoCompatibleStream": "No compatible streams are currently available. Please try again later or contact your system administrator for details.", "MessagePlaybackErrorPlaceHolder": "\u8bf7\u63d2\u5165\u5149\u76d8\u4ee5\u64ad\u653e\u6b64\u89c6\u9891\u3002", "HeaderSelectAudio": "\u9009\u62e9\u97f3\u9891", "HeaderSelectSubtitles": "\u9009\u62e9\u5b57\u5e55", - "ButtonMarkForRemoval": "Remove from device", + "ButtonMarkForRemoval": "\u4ece\u8bbe\u5907\u79fb\u9664", "ButtonUnmarkForRemoval": "Cancel removal from device", "LabelDefaultStream": "(\u9ed8\u8ba4)", "LabelForcedStream": "(\u5f3a\u5236)", @@ -1346,8 +1343,8 @@ "HeaderConfirmSeriesCancellation": "\u786e\u8ba4\u7535\u89c6\u5267\u53d6\u6d88", "HeaderConfirmRecordingDeletion": "\u786e\u8ba4\u5220\u9664\u5f55\u5f71", "MessageRecordingSaved": "\u5f55\u5f71\u5df2\u4fdd\u5b58\u3002", - "OptionWeekend": "Weekends", - "OptionWeekday": "Weekdays", + "OptionWeekend": "\u5468\u672b", + "OptionWeekday": "\u5de5\u4f5c\u65e5", "MessageConfirmPathSubstitutionDeletion": "\u4f60\u786e\u5b9a\u5e0c\u671b\u5220\u9664\u6b64\u8def\u5f84\u66ff\u4ee3\uff1f", "LiveTvUpdateAvailable": "(\u66f4\u65b0\u53ef\u7528)", "LabelVersionUpToDate": "\u6700\u65b0\uff01", @@ -1364,7 +1361,7 @@ "HeaderSplitMedia": "\u62c6\u5206\u5a92\u4f53", "MessageConfirmSplitMedia": "\u60a8\u786e\u5b9a\u8981\u628a\u5a92\u4f53\u6e90\u62c6\u5206\u4e3a\u5355\u72ec\u7684\u9879\u76ee\uff1f", "HeaderError": "\u9519\u8bef", - "MessageChromecastConnectionError": "Your Chromecast receiver is unable to connect to your Emby Server. Please check their connections and try again.", + "MessageChromecastConnectionError": "\u60a8\u7684 Chromecast \u63a5\u6536\u5668\u672a\u80fd\u8fde\u63a5\u5230\u60a8\u7684 Emby \u670d\u52a1\u5668\u3002\u8bf7\u68c0\u67e5\u8fde\u63a5\u518d\u8bd5\u3002", "HeaderLibraryFolders": "\u5a92\u4f53\u6587\u4ef6\u5939", "HeaderFavoriteMovies": "\u6700\u7231\u7684\u7535\u5f71", "HeaderFavoriteShows": "\u6700\u7231\u7684\u8282\u76ee", @@ -1396,14 +1393,14 @@ "HeaderSelectWatchFolderHelp": "\u6d4f\u89c8\u6216\u8f93\u5165\u4e00\u4e2a\u8def\u5f84\u7528\u4e8e\u76d1\u63a7\u6587\u4ef6\u5939\uff0c\u6b64\u6587\u4ef6\u5939\u5fc5\u987b\u53ef\u5199\u3002", "OrganizePatternResult": "\u7ed3\u679c\uff1a {0}", "AutoOrganizeError": "Error Organizing File", - "FileOrganizeManually": "Organize File", + "FileOrganizeManually": "\u6574\u7406\u6587\u4ef6", "ErrorOrganizingFileWithErrorCode": "There was an error organizing the file. Error code: {0}.", "HeaderRestart": "\u91cd\u542f", "HeaderShutdown": "\u5173\u673a", "MessageConfirmRestart": "\u60a8\u786e\u5b9a\u8981\u91cd\u542f Emby \u670d\u52a1\u7aef\uff1f", "MessageConfirmShutdown": "\u60a8\u786e\u5b9a\u8981\u5173\u95ed Emby \u670d\u52a1\u7aef\uff1f", - "ValueItemCount": "{0} item", - "ValueItemCountPlural": "{0} items", + "ValueItemCount": "{0} \u9879", + "ValueItemCountPlural": "{0} \u9879", "NewVersionOfSomethingAvailable": "\u4e00\u4e2a\u65b0\u7684\u7248\u672c {0} \u53ef\u7528!", "VersionXIsAvailableForDownload": "\u7248\u672c {0} \u73b0\u5728\u5df2\u7ecf\u53ef\u4ee5\u4e0b\u8f7d\u3002", "LabelVersionNumber": "\u7248\u672c {0}", @@ -1421,7 +1418,7 @@ "HeaderLatestTvRecordings": "\u6700\u65b0\u5f55\u5236\u7684\u8282\u76ee", "LabelCurrentPath": "\u5f53\u524d\u8def\u5f84\uff1a", "HeaderSelectMediaPath": "\u9009\u62e9\u5a92\u4f53\u8def\u5f84", - "HeaderSelectPath": "Select Path", + "HeaderSelectPath": "\u9009\u62e9\u8def\u5f84", "ButtonNetwork": "\u7f51\u7edc", "MessageDirectoryPickerInstruction": "\u7f51\u7edc\u6309\u94ae\u65e0\u6cd5\u627e\u5230\u60a8\u7684\u8bbe\u5907\u7684\u60c5\u51b5\u4e0b\uff0c\u7f51\u7edc\u8def\u5f84\u53ef\u4ee5\u624b\u52a8\u8f93\u5165\u3002 \u4f8b\u5982\uff0c {0} \u6216\u8005 {1}\u3002", "MessageDirectoryPickerBSDInstruction": "For BSD, you may need to configure storage within your FreeNAS Jail in order to allow Emby to access it.", @@ -1475,9 +1472,9 @@ "MessagePleaseAcceptTermsOfServiceBeforeContinuing": "Please accept the terms of service before continuing.", "OptionOff": "Off", "OptionOn": "On", - "ButtonUninstall": "Uninstall", + "ButtonUninstall": "\u5378\u8f7d", "HeaderEnabledFields": "Enabled Fields", - "HeaderEnabledFieldsHelp": "Uncheck a field to lock it and prevent it's data from being changed.", + "HeaderEnabledFieldsHelp": "\u53cd\u9009\u680f\u4ee5\u9501\u5b9a\u5e76\u4e0d\u8ba9\u5176\u6570\u636e\u88ab\u66f4\u6539\u3002", "HeaderLiveTV": "\u7535\u89c6\u76f4\u64ad", "MissingPrimaryImage": "\u7f3a\u5c11\u5c01\u9762\u56fe\u3002", "MissingBackdropImage": "\u7f3a\u5c11\u80cc\u666f\u56fe\u3002", @@ -1516,7 +1513,7 @@ "HeaderSpecials": "\u7279\u96c6", "HeaderTrailers": "\u9884\u544a\u7247", "HeaderResolution": "\u5206\u8fa8\u7387", - "HeaderRuntime": "\u64ad\u653e\u65f6\u95f4", + "HeaderRuntime": "\u64ad\u653e\u65f6\u957f", "HeaderParentalRating": "\u5bb6\u957f\u5206\u7ea7", "HeaderReleaseDate": "\u53d1\u884c\u65e5\u671f", "HeaderSeries": "Series:", @@ -1587,15 +1584,15 @@ "ValueDiscNumber": "\u76d8 {0}", "HeaderUnknownDate": "\u672a\u77e5\u65e5\u671f", "HeaderUnknownYear": "\u672a\u77e5\u5e74\u4efd", - "ValueMinutes": "{0} min", + "ValueMinutes": "{0} \u5206\u949f", "HeaderSelectExternalPlayer": "\u9009\u62e9\u5916\u90e8\u64ad\u653e\u5668", "HeaderExternalPlayerPlayback": "\u5916\u90e8\u64ad\u653e\u5668\u64ad\u653e", "ButtonImDone": "I'm Done", "OptionWatched": "\u5df2\u89c2\u770b", "OptionUnwatched": "\u672a\u89c2\u770b", "ExternalPlayerPlaystateOptionsHelp": "\u6307\u5b9a\u60a8\u4e0b\u4e00\u6b21\u5e0c\u671b\u5982\u4f55\u6062\u590d\u64ad\u653e\u6b64\u89c6\u9891\u3002", - "LabelMarkAs": "Mark as:", - "OptionInProgress": "In-Progress", + "LabelMarkAs": "\u6807\u4e3a\uff1a", + "OptionInProgress": "\u8fdb\u884c\u4e2d", "LabelResumePoint": "Resume point:", "ValueOneMovie": "1 \u4e2a\u7535\u5f71", "ValueMovieCount": "{0} \u4e2a\u7535\u5f71", @@ -1662,24 +1659,24 @@ "MediaInfoDefault": "\u9ed8\u8ba4", "MediaInfoForced": "\u5f3a\u5236", "MediaInfoExternal": "\u5916\u90e8", - "MediaInfoTimestamp": "Timestamp", + "MediaInfoTimestamp": "\u65f6\u95f4\u6233", "MediaInfoPixelFormat": "\u50cf\u7d20\u683c\u5f0f", - "MediaInfoBitDepth": "Bit depth", - "MediaInfoSampleRate": "Sample rate", - "MediaInfoBitrate": "Bitrate", + "MediaInfoBitDepth": "\u4f4d\u6df1\u5ea6", + "MediaInfoSampleRate": "\u91c7\u6837\u7387", + "MediaInfoBitrate": "\u6bd4\u7279\u7387", "MediaInfoChannels": "\u58f0\u9053", - "MediaInfoLayout": "\u6392\u7248", + "MediaInfoLayout": "\u5e03\u5c40", "MediaInfoLanguage": "\u8bed\u8a00", - "MediaInfoCodec": "Codec", + "MediaInfoCodec": "\u7f16\u7801", "MediaInfoCodecTag": "Codec tag", - "MediaInfoProfile": "Profile", + "MediaInfoProfile": "\u6863\u6848", "MediaInfoLevel": "Level", - "MediaInfoAspectRatio": "Aspect ratio", + "MediaInfoAspectRatio": "\u957f\u5bbd\u6bd4", "MediaInfoResolution": "\u5206\u8fa8\u7387", "MediaInfoAnamorphic": "\u7578\u5f62", "MediaInfoInterlaced": "\u9694\u884c\u626b\u63cf", "MediaInfoFramerate": "\u5e27\u7387", - "MediaInfoStreamTypeAudio": "Audio", + "MediaInfoStreamTypeAudio": "\u97f3\u9891", "MediaInfoStreamTypeData": "\u6570\u636e", "MediaInfoStreamTypeVideo": "\u89c6\u9891", "MediaInfoStreamTypeSubtitle": "\u5b57\u5e55", @@ -1689,7 +1686,7 @@ "HeaderSelectCustomIntrosPath": "\u9009\u62e9\u81ea\u5b9a\u4e49\u4ecb\u7ecd\u8def\u5f84", "HeaderThankYou": "Thank You", "LabelFullReview": "Full review:", - "ReleaseYearValue": "Release year: {0}", + "ReleaseYearValue": "\u53d1\u5e03\u5e74\u4efd\uff1a{0}", "OriginalAirDateValue": "Original air date: {0}", "WebClientTourContent": "\u67e5\u770b\u60a8\u6700\u8fd1\u6dfb\u52a0\u7684\u5a92\u4f53\uff0c\u4e0b\u4e00\u96c6\u5267\u96c6\uff0c\u548c\u5176\u4ed6\u66f4\u591a\u4fe1\u606f\u3002\u7eff\u8272\u5706\u5708\u63d0\u793a\u60a8\u6709\u591a\u5c11\u9879\u76ee\u5c1a\u672a\u64ad\u653e\u3002", "WebClientTourMovies": "Play movies, trailers and more from any device with a web browser", @@ -1704,7 +1701,7 @@ "WebClientTourUserPreferences4": "\u914d\u7f6e\u80cc\u666f\u3001\u4e3b\u9898\u6b4c\u548c\u5916\u90e8\u64ad\u653e\u5668", "WebClientTourMobile1": "The web client works great on smartphones and tablets...", "WebClientTourMobile2": "and easily controls other devices and Emby apps", - "WebClientTourMySync": "Sync your personal media to your devices for offline viewing.", + "WebClientTourMySync": "\u540c\u6b65\u60a8\u4e2a\u4eba\u5a92\u4f53\u5230\u60a8\u7684\u8bbe\u5907\u4ee5\u79bb\u7ebf\u67e5\u770b\u3002", "MessageEnjoyYourStay": "Enjoy your stay", "DashboardTourDashboard": "The server dashboard allows you to monitor your server and your users. You'll always know who is doing what and where they are.", "DashboardTourHelp": "In-app help provides easy buttons to open wiki pages relating to the on-screen content.", @@ -1725,7 +1722,7 @@ "LabelEnableCameraUploadFor": "Enable camera upload for:", "HeaderSelectUploadPath": "\u9009\u62e9\u4e0a\u4f20\u8def\u5f84", "LabelEnableCameraUploadForHelp": "Uploads will occur automatically in the background when signed into Emby.", - "ErrorMessageStartHourGreaterThanEnd": "End time must be greater than the start time.", + "ErrorMessageStartHourGreaterThanEnd": "\u7ed3\u675f\u65f6\u95f4\u5fc5\u987b\u5728\u5f00\u59cb\u65f6\u95f4\u540e\u3002", "ButtonLibraryAccess": "\u5a92\u4f53\u5e93\u8bbf\u95ee", "ButtonParentalControl": "\u5bb6\u957f\u63a7\u5236", "HeaderInvitationSent": "\u5df2\u53d1\u9001\u9080\u8bf7", @@ -1736,7 +1733,7 @@ "ButtonSelectServer": "\u9009\u62e9\u670d\u52a1\u5668", "MessagePluginConfigurationRequiresLocalAccess": "To configure this plugin please sign in to your local server directly.", "MessageLoggedOutParentalControl": "\u8bbf\u95ee\u76ee\u524d\u53d7\u9650\u3002\u8bf7\u7a0d\u540e\u5c1d\u8bd5\u3002", - "DefaultErrorMessage": "There was an error processing the request. Please try again later.", + "DefaultErrorMessage": "\u5904\u7406\u8bf7\u6c42\u65f6\u53d1\u751f\u9519\u8bef\u3002\u8bf7\u7a0d\u540e\u5c1d\u8bd5\u3002", "ButtonAccept": "\u63a5\u53d7", "ButtonReject": "\u62d2\u7edd", "MessageContactAdminToResetPassword": "\u8bf7\u8054\u7cfb\u60a8\u7684\u7ba1\u7406\u5458\u4ee5\u91cd\u7f6e\u60a8\u7684\u5bc6\u7801\u3002", @@ -1751,7 +1748,7 @@ "HeaderCancelSyncJob": "\u53d6\u6d88\u540c\u6b65", "CancelSyncJobConfirmation": "Cancelling the sync job will remove synced media from the device during the next sync process. Are you sure you wish to proceed?", "LabelQuality": "\u8d28\u91cf\uff1a", - "MessageBookPluginRequired": "\u9700\u8981\u5b89\u88c5 Bookshelf \u63d2\u4ef6", + "BookLibraryHelp": "Audio and text books are supported", "MessageGamePluginRequired": "\u9700\u8981\u5b89\u88c5 GameBrowser \u63d2\u4ef6", "MessageUnsetContentHelp": "Content will be displayed as plain folders. For best results use the metadata manager to set the content types of sub-folders.", "SyncJobItemStatusQueued": "\u5df2\u5217\u961f", @@ -1762,7 +1759,7 @@ "SyncJobItemStatusRemovedFromDevice": "\u4ece\u8bbe\u5907\u5220\u9664", "SyncJobItemStatusCancelled": "\u5df2\u53d6\u6d88", "LabelProfile": "Profile:", - "LabelBitrateMbps": "Bitrate (Mbps):", + "LabelBitrateMbps": "\u6bd4\u7279\u7387 (Mbps)\uff1a", "EmbyIntroDownloadMessage": "To download and install the free Emby Server visit {0}.", "EmbyIntroDownloadMessageWithoutLink": "To download and install the free Emby Server visit the Emby website.", "ButtonNewServer": "\u65b0\u670d\u52a1\u5668", @@ -1791,7 +1788,7 @@ "ButtonShare": "\u5171\u4eab", "HeaderConfirm": "\u786e\u8ba4", "MessageConfirmDeleteTunerDevice": "\u60a8\u786e\u5b9a\u8981\u5220\u9664\u6b64\u8bbe\u5907\u5417\uff1f", - "MessageConfirmDeleteGuideProvider": "Are you sure you wish to delete this guide provider?", + "MessageConfirmDeleteGuideProvider": "\u60a8\u786e\u5b9a\u8981\u5220\u9664\u6b64\u6307\u5357\u63d0\u4f9b\u5546\uff1f", "HeaderDeleteProvider": "\u5220\u9664\u63d0\u4f9b\u5546", "ErrorAddingTunerDevice": "There was an error adding the tuner device. Please ensure it is accessible and try again.", "ErrorSavingTvProvider": "There was an error saving the TV provider. Please ensure it is accessible and try again.", @@ -1838,7 +1835,7 @@ "HeaderConfirmPluginInstallation": "\u786e\u8ba4\u63d2\u4ef6\u5b89\u88c5", "PleaseConfirmPluginInstallation": "Please click OK to confirm you've read the above and wish to proceed with the plugin installation.", "MessagePluginInstallDisclaimer": "Plugins built by Emby community members are a great way to enhance your Emby experience with additional features and benefits. Before installing, please be aware of the effects they may have on your Emby Server, such as longer library scans, additional background processing, and decreased system stability.", - "HeaderMobileSync": "Mobile Sync", + "HeaderMobileSync": "\u79fb\u52a8\u540c\u6b65", "HeaderCloudSync": "\u4e91\u540c\u6b65", "HeaderFreeApps": "\u514d\u8d39 Emby \u5e94\u7528", "CoverArt": "\u5c01\u9762\u56fe", @@ -1852,7 +1849,7 @@ "LabelFileOrUrl": "\u6587\u4ef6\u6216\u7f51\u5740\uff1a", "OptionEnableForAllTuners": "\u7ed9\u6240\u6709\u8c03\u8c10\u5668\u5f00\u542f", "HeaderTuners": "\u8c03\u8c10\u5668", - "LabelOptionalM3uUrl": "M3U url (optional):", + "LabelOptionalM3uUrl": "M3U \u7f51\u5740 (optional)\uff1a", "LabelOptionalM3uUrlHelp": "Some devices support an M3U channel listing.", "TabResumeSettings": "Resume Settings", "DrmChannelsNotImported": "Channels with DRM will not be imported.", @@ -1865,9 +1862,9 @@ "Yesterday": "\u6628\u5929", "DownloadImagesInAdvanceWarning": "\u9884\u5148\u4e0b\u8f7d\u6240\u6709\u56fe\u7247\u5c06\u4f1a\u66f4\u4e45\u5a92\u4f53\u5e93\u626b\u63cf\u65f6\u95f4\u3002", "MetadataSettingChangeHelp": "Changing metadata settings will affect new content that is added going forward. To refresh existing content, open the detail screen and click the refresh button, or perform bulk refreshes using the metadata manager.", - "OptionConvertRecordingPreserveAudio": "Preserve original audio when converting recordings (when possible)", + "OptionConvertRecordingPreserveAudio": "\u8f6c\u6362\u5f55\u5236\u65f6\u4fdd\u7559\u539f\u97f3\u9891 (\u5982\u679c\u53ef\u4ee5\u7684\u8bdd)", "OptionConvertRecordingPreserveAudioHelp": "This will provide better audio but may require transcoding during playback on some devices.", - "OptionConvertRecordingPreserveVideo": "Preserve original video when converting recordings", + "OptionConvertRecordingPreserveVideo": "\u8f6c\u6362\u5f55\u5236\u65f6\u4fdd\u7559\u539f\u89c6\u9891", "OptionConvertRecordingPreserveVideoHelp": "This may provide better video quality but will require transcoding during playback on some devices.", "AddItemToCollectionHelp": "Add items to collections by searching for them and using their right-click or tap menus to add them to a collection.", "HeaderHealthMonitor": "Health Monitor", @@ -1897,14 +1894,15 @@ "DownloadFFmpeg": "\u4e0b\u8f7d FFmpeg", "FFmpegSuggestedDownload": "\u5efa\u8bae\u4e0b\u8f7d\uff1a{0}", "UnzipFFmpegFile": "\u89e3\u538b\u4e0b\u8f7d\u7684\u6587\u4ef6\u5230\u60a8\u60f3\u8981\u7684\u6587\u4ef6\u5939\u91cc\u3002", + "MarkFFmpegExec": "If you are running Linux or OSX, you will need to locate the ffmpeg and ffprobe files and mark them as executable. This is needed to grant Emby permission to execute them.", "OptionUseSystemInstalledVersion": "\u4f7f\u7528\u7cfb\u7edf\u5b89\u88c5\u7684\u7248\u672c", "OptionUseMyCustomVersion": "\u4f7f\u7528\u81ea\u5b9a\u4e49\u7248\u672c", "FFmpegSavePathNotFound": "We're unable to locate FFmpeg using the path you've entered. FFprobe is also required and must exist in the same folder. These components are normally bundled together in the same download. Please check the path and try again.", - "XmlTvPremiere": "By default, Emby will import {0} hours of guide data. Importing unlimited data requires an active Emby Premiere subscription.", + "XmlTvPremiere": "\u9ed8\u8ba4\u4e0b\uff0cEmby \u5c06\u5bfc\u5165 {0} \u5c0f\u65f6\u7684\u6307\u5357\u6570\u636e\u3002\u5bfc\u5165\u65e0\u9650\u6570\u636e\u9700\u8981\u6709\u6548\u7684 Emby Premiere \u8ba2\u9605\u3002", "MoreFromValue": "\u66f4\u591a\u6765\u81ea {0}", "OptionSaveMetadataAsHiddenHelp": "Changing this will apply to new metadata saved going forward. Existing metadata files will be updated the next time they are saved by Emby Server.", "EnablePhotos": "\u5f00\u542f\u7167\u7247", - "EnablePhotosHelp": "Photos will be detected and displayed alongside other media files.", + "EnablePhotosHelp": "\u7167\u7247\u5c06\u88ab\u68c0\u6d4b\u5230\u5e76\u548c\u5176\u4ed6\u5a92\u4f53\u6587\u4ef6\u4e00\u8d77\u663e\u793a\u3002", "MakeAvailableOffline": "Make available offline", "ConfirmRemoveDownload": "\u5220\u9664\u4e0b\u8f7d\uff1f", "RemoveDownload": "\u5220\u9664\u4e0b\u8f7d", @@ -1913,7 +1911,7 @@ "MessageDownloadScheduled": "Download scheduled", "RememberMe": "\u8bb0\u4f4f\u6211", "HeaderOfflineSync": "\u79bb\u7ebf\u540c\u6b65", - "LabelMaxAudioFileBitrate": "Max audio file bitrate:", + "LabelMaxAudioFileBitrate": "\u6700\u5927\u97f3\u9891\u6587\u4ef6\u6bd4\u7279\u7387\uff1a", "LabelMaxAudioFileBitrateHelp": "Audio files with a higher bitrate will be converted by Emby Server. Select a higher value for better quality, or a lower value to conserve local storage space.", "LabelVaapiDevice": "VA API \u8bbe\u5907\uff1a", "LabelVaapiDeviceHelp": "\u6b64\u6e32\u67d3\u8282\u70b9\u7528\u6765\u786c\u4ef6\u52a0\u901f\u3002", @@ -1929,9 +1927,9 @@ "LabelH264Crf": "H264 \u7f16\u7801\u901f\u7387\u63a7\u5236", "H264CrfHelp": "The Constant Rate Factor (CRF) is the default quality setting for the x264 encoder. You can set the values between 0 and 51, where lower values would result in better quality (at the expense of higher file sizes). Sane values are between 18 and 28. The default for x264 is 23, so you can use this as a starting point.", "Sports": "\u4f53\u80b2", - "HeaderForKids": "For Kids", + "HeaderForKids": "\u7ed9\u513f\u7ae5", "HeaderRecordingGroups": "Recording Groups", - "LabelConvertRecordingsTo": "Convert recordings to:", + "LabelConvertRecordingsTo": "\u8f6c\u6362\u5f55\u5236\u5230\uff1a", "HeaderUpcomingOnTV": "Upcoming On TV", "LabelOptionalNetworkPath": "(Optional) Shared network folder:", "LabelOptionalNetworkPathHelp": "If this folder is shared on your network, supplying the network share path can allow Emby apps on other devices to access media files directly.", @@ -1945,5 +1943,7 @@ "LabelPostProcessorArguments": "Post-processor command line arguments:", "LabelPostProcessorArgumentsHelp": "Use {path} as the path to the recording file.", "LabelPostProcessor": "Post-processing application:", - "ErrorAddingXmlTvFile": "There was an error accessing the XmlTV file. Please ensure the file exists and try again." + "ErrorAddingXmlTvFile": "There was an error accessing the XmlTV file. Please ensure the file exists and try again.", + "OptionAutomaticallyGroupSeries": "\u81ea\u52a8\u5408\u5e76\u5206\u5e03\u5728\u4e0d\u540c\u6587\u4ef6\u5939\u7684\u7cfb\u5217", + "OptionAutomaticallyGroupSeriesHelp": "If enabled, series that are spread across multiple folders within this library will be automatically merged into a single series." } \ No newline at end of file diff --git a/MediaBrowser.WebDashboard/dashboard-ui/strings/zh-HK.json b/MediaBrowser.WebDashboard/dashboard-ui/strings/zh-HK.json index 64bbb6e706..3393253bea 100644 --- a/MediaBrowser.WebDashboard/dashboard-ui/strings/zh-HK.json +++ b/MediaBrowser.WebDashboard/dashboard-ui/strings/zh-HK.json @@ -1,6 +1,4 @@ { - "OptionAutomaticallyGroupSeriesHelp": "If enabled, series that are spread across multiple folders within this library will be automatically merged into a single series.", - "OptionAutomaticallyGroupSeries": "Automatically merge series that are spread across multiple folders", "LabelPrevious": "\u524d\u4e00\u500b", "LabelFinish": "\u5b8c\u6210", "LabelNext": "\u4e0b\u4e00\u500b", @@ -173,7 +171,6 @@ "OptionPlayCount": "\u64ad\u653e\u6b21\u6578", "OptionDatePlayed": "\u5df2\u64ad\u653e\u65e5\u671f", "OptionDateAdded": "\u5df2\u6dfb\u52a0\u65e5\u671f", - "DateAddedValue": "Date added: {0}", "OptionAlbumArtist": "\u5531\u7247\u6b4c\u624b", "OptionArtist": "\u6b4c\u624b", "OptionAlbum": "\u5531\u7247", @@ -1751,7 +1748,7 @@ "HeaderCancelSyncJob": "Cancel Sync", "CancelSyncJobConfirmation": "Cancelling the sync job will remove synced media from the device during the next sync process. Are you sure you wish to proceed?", "LabelQuality": "Quality:", - "MessageBookPluginRequired": "\u9700\u8981\u5b89\u88dd\u66f8\u67b6\u985e\u63d2\u4ef6", + "BookLibraryHelp": "Audio and text books are supported", "MessageGamePluginRequired": "Requires installation of the GameBrowser plugin", "MessageUnsetContentHelp": "Content will be displayed as plain folders. For best results use the metadata manager to set the content types of sub-folders.", "SyncJobItemStatusQueued": "Queued", @@ -1897,6 +1894,7 @@ "DownloadFFmpeg": "Download FFmpeg", "FFmpegSuggestedDownload": "Suggested download: {0}", "UnzipFFmpegFile": "Unzip the downloaded file to a folder of your choice.", + "MarkFFmpegExec": "If you are running Linux or OSX, you will need to locate the ffmpeg and ffprobe files and mark them as executable. This is needed to grant Emby permission to execute them.", "OptionUseSystemInstalledVersion": "Use system installed version", "OptionUseMyCustomVersion": "Use a custom version", "FFmpegSavePathNotFound": "We're unable to locate FFmpeg using the path you've entered. FFprobe is also required and must exist in the same folder. These components are normally bundled together in the same download. Please check the path and try again.", @@ -1945,5 +1943,7 @@ "LabelPostProcessorArguments": "Post-processor command line arguments:", "LabelPostProcessorArgumentsHelp": "Use {path} as the path to the recording file.", "LabelPostProcessor": "Post-processing application:", - "ErrorAddingXmlTvFile": "There was an error accessing the XmlTV file. Please ensure the file exists and try again." + "ErrorAddingXmlTvFile": "There was an error accessing the XmlTV file. Please ensure the file exists and try again.", + "OptionAutomaticallyGroupSeries": "Automatically merge series that are spread across multiple folders", + "OptionAutomaticallyGroupSeriesHelp": "If enabled, series that are spread across multiple folders within this library will be automatically merged into a single series." } \ No newline at end of file diff --git a/MediaBrowser.WebDashboard/dashboard-ui/strings/zh-TW.json b/MediaBrowser.WebDashboard/dashboard-ui/strings/zh-TW.json index 418c0e2e6f..01b4d88bd5 100644 --- a/MediaBrowser.WebDashboard/dashboard-ui/strings/zh-TW.json +++ b/MediaBrowser.WebDashboard/dashboard-ui/strings/zh-TW.json @@ -1,6 +1,4 @@ { - "OptionAutomaticallyGroupSeriesHelp": "If enabled, series that are spread across multiple folders within this library will be automatically merged into a single series.", - "OptionAutomaticallyGroupSeries": "Automatically merge series that are spread across multiple folders", "LabelPrevious": "\u4e0a\u4e00\u500b", "LabelFinish": "\u5b8c\u6210", "LabelNext": "\u4e0b\u4e00\u500b", @@ -173,7 +171,6 @@ "OptionPlayCount": "\u64ad\u653e\u6b21\u6578", "OptionDatePlayed": "\u64ad\u653e\u65e5\u671f", "OptionDateAdded": "\u6dfb\u52a0\u65e5\u671f", - "DateAddedValue": "Date added: {0}", "OptionAlbumArtist": "\u5c08\u8f2f\u6b4c\u624b", "OptionArtist": "\u6b4c\u624b", "OptionAlbum": "\u5c08\u8f2f", @@ -1751,7 +1748,7 @@ "HeaderCancelSyncJob": "Cancel Sync", "CancelSyncJobConfirmation": "Cancelling the sync job will remove synced media from the device during the next sync process. Are you sure you wish to proceed?", "LabelQuality": "Quality:", - "MessageBookPluginRequired": "Requires installation of the Bookshelf plugin", + "BookLibraryHelp": "Audio and text books are supported", "MessageGamePluginRequired": "Requires installation of the GameBrowser plugin", "MessageUnsetContentHelp": "Content will be displayed as plain folders. For best results use the metadata manager to set the content types of sub-folders.", "SyncJobItemStatusQueued": "Queued", @@ -1897,6 +1894,7 @@ "DownloadFFmpeg": "Download FFmpeg", "FFmpegSuggestedDownload": "Suggested download: {0}", "UnzipFFmpegFile": "Unzip the downloaded file to a folder of your choice.", + "MarkFFmpegExec": "If you are running Linux or OSX, you will need to locate the ffmpeg and ffprobe files and mark them as executable. This is needed to grant Emby permission to execute them.", "OptionUseSystemInstalledVersion": "Use system installed version", "OptionUseMyCustomVersion": "Use a custom version", "FFmpegSavePathNotFound": "We're unable to locate FFmpeg using the path you've entered. FFprobe is also required and must exist in the same folder. These components are normally bundled together in the same download. Please check the path and try again.", @@ -1945,5 +1943,7 @@ "LabelPostProcessorArguments": "Post-processor command line arguments:", "LabelPostProcessorArgumentsHelp": "Use {path} as the path to the recording file.", "LabelPostProcessor": "Post-processing application:", - "ErrorAddingXmlTvFile": "There was an error accessing the XmlTV file. Please ensure the file exists and try again." + "ErrorAddingXmlTvFile": "There was an error accessing the XmlTV file. Please ensure the file exists and try again.", + "OptionAutomaticallyGroupSeries": "Automatically merge series that are spread across multiple folders", + "OptionAutomaticallyGroupSeriesHelp": "If enabled, series that are spread across multiple folders within this library will be automatically merged into a single series." } \ No newline at end of file From 0f7733505fbe5079d85ff2e5dab8fb28bac359d6 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Sat, 24 Dec 2016 03:51:59 -0500 Subject: [PATCH 27/62] fix playlist items not being draggable in firefox/edge --- .../emby-webcomponents/listview/listview.css | 5 ++++- .../bower_components/emby-webcomponents/listview/listview.js | 4 +++- .../dashboard-ui/camerauploadsettings.html | 2 +- MediaBrowser.WebDashboard/dashboard-ui/mysyncsettings.html | 2 +- MediaBrowser.WebDashboard/dashboard-ui/scripts/site.js | 2 +- 5 files changed, 10 insertions(+), 5 deletions(-) diff --git a/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-webcomponents/listview/listview.css b/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-webcomponents/listview/listview.css index fd82473bc6..b958e08eb2 100644 --- a/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-webcomponents/listview/listview.css +++ b/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-webcomponents/listview/listview.css @@ -104,11 +104,14 @@ height: 1em !important; font-size: 143%; border-radius: 500px; - background-color: #52B54B; padding: .5em; color: #fff; } +.listItemIcon:not(.listItemIcon-transparent) { + background-color: #52B54B; +} + .listItemProgressBar { position: absolute; bottom: 0; diff --git a/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-webcomponents/listview/listview.js b/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-webcomponents/listview/listview.js index 3aecd30cdb..fd6ae9dbd7 100644 --- a/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-webcomponents/listview/listview.js +++ b/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-webcomponents/listview/listview.js @@ -224,7 +224,9 @@ define(['itemHelper', 'mediaInfo', 'indicators', 'connectionManager', 'layoutMan html += '<' + outerTagName + ' class="' + cssClass + '" data-index="' + i + '"' + playlistItemId + ' data-action="' + action + '" data-isfolder="' + item.IsFolder + '" data-id="' + item.Id + '" data-serverid="' + item.ServerId + '" data-type="' + item.Type + '"' + mediaTypeData + collectionTypeData + channelIdData + positionTicksData + collectionIdData + playlistIdData + '>'; if (!clickEntireItem && options.dragHandle) { - html += ''; + //html += ''; + // Firefox and Edge are not allowing the button to be draggable + html += ''; } if (options.image !== false) { diff --git a/MediaBrowser.WebDashboard/dashboard-ui/camerauploadsettings.html b/MediaBrowser.WebDashboard/dashboard-ui/camerauploadsettings.html index 23db249355..6931b78daf 100644 --- a/MediaBrowser.WebDashboard/dashboard-ui/camerauploadsettings.html +++ b/MediaBrowser.WebDashboard/dashboard-ui/camerauploadsettings.html @@ -1,4 +1,4 @@ -
+
diff --git a/MediaBrowser.WebDashboard/dashboard-ui/mysyncsettings.html b/MediaBrowser.WebDashboard/dashboard-ui/mysyncsettings.html index 1f1b793b2c..6833a332a0 100644 --- a/MediaBrowser.WebDashboard/dashboard-ui/mysyncsettings.html +++ b/MediaBrowser.WebDashboard/dashboard-ui/mysyncsettings.html @@ -1,4 +1,4 @@ -
+
diff --git a/MediaBrowser.WebDashboard/dashboard-ui/scripts/site.js b/MediaBrowser.WebDashboard/dashboard-ui/scripts/site.js index 49a3d018d7..faf6153537 100644 --- a/MediaBrowser.WebDashboard/dashboard-ui/scripts/site.js +++ b/MediaBrowser.WebDashboard/dashboard-ui/scripts/site.js @@ -1707,7 +1707,7 @@ var AppInfo = {}; function init() { if (Dashboard.isRunningInCordova() && browserInfo.android) { - define("nativedirectorychooser", ["cordova/android/nativedirectorychooser"]); + define("nativedirectorychooser", ["cordova/nativedirectorychooser"]); } if (Dashboard.isRunningInCordova() && browserInfo.android) { From f9d519e78b76dc731c40e97c4eb6d5ce687de511 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Sat, 24 Dec 2016 04:00:55 -0500 Subject: [PATCH 28/62] update syncjob editor --- MediaBrowser.WebDashboard/dashboard-ui/scripts/syncjob.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/MediaBrowser.WebDashboard/dashboard-ui/scripts/syncjob.js b/MediaBrowser.WebDashboard/dashboard-ui/scripts/syncjob.js index 1d0c3c3319..6936cf220f 100644 --- a/MediaBrowser.WebDashboard/dashboard-ui/scripts/syncjob.js +++ b/MediaBrowser.WebDashboard/dashboard-ui/scripts/syncjob.js @@ -351,10 +351,10 @@ }); } - function loadJobInfo(page, job, jobItems) { + function loadJobInfo(page, job, jobItems, apiClient) { //renderJob(page, job, _jobOptions); - renderJobItems(page, jobItems); + renderJobItems(page, jobItems, apiClient); loading.hide(); } @@ -399,8 +399,8 @@ return false; }); - function onSyncJobMessage(e, msg) { - loadJobInfo(view, msg.Data.Job, msg.Data.JobItems); + function onSyncJobMessage(e, apiClient, msg) { + loadJobInfo(view, msg.Job, msg.JobItems, apiClient); } function startListening(page) { From 9c6fcca46fbbd98198ede01f892b69a5d2942a66 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Sat, 24 Dec 2016 13:22:36 -0500 Subject: [PATCH 29/62] update dishhopper profile --- Emby.Dlna/Profiles/DishHopperJoeyProfile.cs | 15 +++++++++++++++ Emby.Dlna/Profiles/Xml/Dish Hopper-Joey.xml | 6 ++++++ 2 files changed, 21 insertions(+) diff --git a/Emby.Dlna/Profiles/DishHopperJoeyProfile.cs b/Emby.Dlna/Profiles/DishHopperJoeyProfile.cs index 9f31377101..d494a7bfca 100644 --- a/Emby.Dlna/Profiles/DishHopperJoeyProfile.cs +++ b/Emby.Dlna/Profiles/DishHopperJoeyProfile.cs @@ -201,6 +201,21 @@ public DishHopperJoeyProfile() IsRequired = true } } + }, + + new CodecProfile + { + Type = CodecType.VideoAudio, + Conditions = new [] + { + // The device does not have any audio switching capabilities + new ProfileCondition + { + Condition = ProfileConditionType.Equals, + Property = ProfileConditionValue.IsSecondaryAudio, + Value = "false" + } + } } }; diff --git a/Emby.Dlna/Profiles/Xml/Dish Hopper-Joey.xml b/Emby.Dlna/Profiles/Xml/Dish Hopper-Joey.xml index 3ad2a01295..3b790986a2 100644 --- a/Emby.Dlna/Profiles/Xml/Dish Hopper-Joey.xml +++ b/Emby.Dlna/Profiles/Xml/Dish Hopper-Joey.xml @@ -80,6 +80,12 @@ + + + + + + From 7ec77f86fb6359cc156791fdb081cafa0cd92c02 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Sat, 24 Dec 2016 14:15:27 -0500 Subject: [PATCH 30/62] unify sync components --- .../emby-apiclient/.bower.json | 8 +- .../emby-apiclient/nullassetmanager.js | 73 +++-- .../emby-apiclient/sync/filerepository.js | 8 + .../emby-apiclient/sync/itemrepository.js | 19 +- .../emby-apiclient/sync/mediasync.js | 249 +++++++++++------- .../emby-webcomponents/.bower.json | 8 +- .../emby-webcomponents/itemcontextmenu.js | 5 + .../emby-webcomponents/itemhelper.js | 10 + .../emby-webcomponents/strings/kk.json | 2 +- .../emby-webcomponents/strings/pt-BR.json | 4 +- .../emby-webcomponents/strings/ru.json | 2 +- .../emby-webcomponents/strings/zh-CN.json | 20 +- .../emby-webcomponents/sync/sync.js | 4 + .../emby-webcomponents/sync/syncjobeditor.js} | 237 ++++++++++------- .../emby-webcomponents/sync}/syncjoblist.js | 0 .../emby-webcomponents/sync/synctoggle.js | 6 +- .../userdatabuttons/userdatabuttons.js | 6 +- .../dashboard-ui/scripts/mysync.js | 7 +- .../dashboard-ui/scripts/site.js | 11 +- .../dashboard-ui/scripts/syncactivity.js | 7 +- .../dashboard-ui/syncjob.html | 14 - 21 files changed, 434 insertions(+), 266 deletions(-) rename MediaBrowser.WebDashboard/dashboard-ui/{scripts/syncjob.js => bower_components/emby-webcomponents/sync/syncjobeditor.js} (61%) rename MediaBrowser.WebDashboard/dashboard-ui/{components/syncjoblist => bower_components/emby-webcomponents/sync}/syncjoblist.js (100%) delete mode 100644 MediaBrowser.WebDashboard/dashboard-ui/syncjob.html diff --git a/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-apiclient/.bower.json b/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-apiclient/.bower.json index 01fedd3c13..3b3a51426b 100644 --- a/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-apiclient/.bower.json +++ b/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-apiclient/.bower.json @@ -16,12 +16,12 @@ }, "devDependencies": {}, "ignore": [], - "version": "1.1.105", - "_release": "1.1.105", + "version": "1.1.106", + "_release": "1.1.106", "_resolution": { "type": "version", - "tag": "1.1.105", - "commit": "d46515271d43d1b0f7dd19bb1834cfd457fb3326" + "tag": "1.1.106", + "commit": "2bed46ebe6ee1e213b5f89476ca8c285937ba343" }, "_source": "https://github.com/MediaBrowser/Emby.ApiClient.Javascript.git", "_target": "^1.1.51", diff --git a/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-apiclient/nullassetmanager.js b/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-apiclient/nullassetmanager.js index aef746e9b6..9420639f40 100644 --- a/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-apiclient/nullassetmanager.js +++ b/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-apiclient/nullassetmanager.js @@ -1,8 +1,12 @@ define([], function () { 'use strict'; - function getLocalMediaSource(serverId, itemId) { - return Promise.resolve(null); + function getLocalItem(serverId, itemId) { + return Promise.resolve(); + } + + function getLocalItemById(id) { + return Promise.resolve(); } function saveOfflineUser(user) { @@ -30,7 +34,6 @@ } function deleteUserActions(actions) { - //TODO: return Promise.resolve(); } @@ -38,11 +41,19 @@ return Promise.resolve([]); } - function removeLocalItem(localItem) { - return Promise.resolve(); + function getServerItems(serverId) { + return Promise.resolve([]); } - function getLocalItem(itemId, serverId) { + function getViews(serverId, userId) { + return Promise.resolve([]); + } + + function getViewItems(serverId, userId, parentId) { + return Promise.resolve([]); + } + + function removeLocalItem(localItem) { return Promise.resolve(); } @@ -51,45 +62,51 @@ } function createLocalItem(libraryItem, serverInfo, jobItem) { + return Promise.resolve(); + } - return Promise.resolve({}); + function getSubtitleSaveFileName(localItem, mediaPath, language, isForced, format) { + return null; } - function downloadFile(url, localPath) { + function getItemFileSize(path) { + return Promise.resolve(); + } + function downloadFile(url, localItem) { return Promise.resolve(); } - function downloadSubtitles(url, localItem, subtitleStreamh) { + function downloadSubtitles(url, fileName) { + return Promise.resolve(); + } - return Promise.resolve(''); + function getImageUrl(serverId, itemId, imageType, index) { + return null; } - function hasImage(serverId, itemId, imageTag) { - return Promise.resolve(false); + function hasImage(serverId, itemId, imageType, index) { + return Promise.resolve(); } - function downloadImage(url, serverId, itemId, imageTag) { - return Promise.resolve(false); + function downloadImage(localItem, url, serverId, itemId, imageType, index) { + return Promise.resolve(); } - function fileExists(path) { - return Promise.resolve(false); + function isDownloadFileInQueue(path) { + return Promise.resolve(); } function translateFilePath(path) { return Promise.resolve(path); } - function getLocalFilePath(path) { - return null; - } - - function getLocalItemById(id) { - return null; + function resyncTransfers() { + return Promise.resolve(); } return { + getLocalItem: getLocalItem, saveOfflineUser: saveOfflineUser, deleteOfflineUser: deleteOfflineUser, @@ -106,9 +123,15 @@ downloadSubtitles: downloadSubtitles, hasImage: hasImage, downloadImage: downloadImage, - fileExists: fileExists, + getImageUrl: getImageUrl, translateFilePath: translateFilePath, - getLocalFilePath: getLocalFilePath, - getLocalItemById: getLocalItemById + getSubtitleSaveFileName: getSubtitleSaveFileName, + getLocalItemById: getLocalItemById, + getServerItems: getServerItems, + getItemFileSize: getItemFileSize, + isDownloadFileInQueue: isDownloadFileInQueue, + getViews: getViews, + getViewItems: getViewItems, + resyncTransfers: resyncTransfers }; }); \ No newline at end of file diff --git a/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-apiclient/sync/filerepository.js b/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-apiclient/sync/filerepository.js index abe51c0c03..61f2adab70 100644 --- a/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-apiclient/sync/filerepository.js +++ b/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-apiclient/sync/filerepository.js @@ -15,6 +15,13 @@ } + function getPathFromArray(pathArray) { + + // TODO + return pathArray.join('/'); + + } + function deleteFile(path) { return Promise.resolve(); } @@ -34,6 +41,7 @@ return { getValidFileName: getValidFileName, getFullLocalPath: getFullLocalPath, + getPathFromArray: getPathFromArray, deleteFile: deleteFile, deleteDirectory: deleteDirectory, fileExists: fileExists, diff --git a/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-apiclient/sync/itemrepository.js b/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-apiclient/sync/itemrepository.js index f690f0882b..c9a97831fe 100644 --- a/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-apiclient/sync/itemrepository.js +++ b/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-apiclient/sync/itemrepository.js @@ -35,6 +35,18 @@ }); } + function getServerItemTypes(serverId, userId) { + return dbPromise.then(function (db) { + return db.transaction(dbName).objectStore(dbName).getAll(null, 10000).then(function (all) { + return all.filter(function (item) { + return item.ServerId === serverId && (item.UserIdsWithAccess == null || item.UserIdsWithAccess.contains(userId)); + }).map(function (item2) { + return (item2.Item.Type || '').toLowerCase(); + }).filter(filterDistinct); + }); + }); + } + function getServerIds(serverId) { return dbPromise.then(function (db) { return db.transaction(dbName).objectStore(dbName).getAll(null, 10000).then(function (all) { @@ -83,6 +95,10 @@ }); } + function filterDistinct(value, index, self) { + return self.indexOf(value) === index; + } + setup(); return { @@ -92,6 +108,7 @@ clear: clear, getAll: getAll, getServerItemIds: getServerItemIds, - getServerIds: getServerIds + getServerIds: getServerIds, + getServerItemTypes: getServerItemTypes }; }); \ No newline at end of file diff --git a/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-apiclient/sync/mediasync.js b/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-apiclient/sync/mediasync.js index efe3fba548..89e12ef74b 100644 --- a/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-apiclient/sync/mediasync.js +++ b/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-apiclient/sync/mediasync.js @@ -5,27 +5,30 @@ console.log('[mediasync] Begin processDownloadStatus'); - return localassetmanager.getServerItems(serverInfo.Id).then(function (items) { + return localassetmanager.resyncTransfers().then(function () { - console.log('[mediasync] Begin processDownloadStatus getServerItems completed'); + return localassetmanager.getServerItems(serverInfo.Id).then(function (items) { - var progressItems = items.filter(function (item) { - return item.SyncStatus === 'transferring' || item.SyncStatus === 'queued'; - }); + console.log('[mediasync] Begin processDownloadStatus getServerItems completed'); - var p = Promise.resolve(); - var cnt = 0; + var progressItems = items.filter(function (item) { + return item.SyncStatus === 'transferring' || item.SyncStatus === 'queued'; + }); - progressItems.forEach(function (item) { - p = p.then(function () { - return reportTransfer(apiClient, item); + var p = Promise.resolve(); + var cnt = 0; + + progressItems.forEach(function (item) { + p = p.then(function () { + return reportTransfer(apiClient, item); + }); + cnt++; }); - cnt++; - }); - return p.then(function () { - console.log('[mediasync] Exit processDownloadStatus. Items reported: ' + cnt.toString()); - return Promise.resolve(); + return p.then(function () { + console.log('[mediasync] Exit processDownloadStatus. Items reported: ' + cnt.toString()); + return Promise.resolve(); + }); }); }); } @@ -40,23 +43,23 @@ item.SyncStatus = 'synced'; return localassetmanager.addOrUpdateLocalItem(item); }, function (error) { - console.error("[mediasync] Mediasync error on reportSyncJobItemTransferred", error); + console.error('[mediasync] Mediasync error on reportSyncJobItemTransferred', error); item.SyncStatus = 'error'; return localassetmanager.addOrUpdateLocalItem(item); }); } else { - return localassetmanager.isDownloadInQueue(item.SyncJobItemId).then(function (result) { + return localassetmanager.isDownloadFileInQueue(item.LocalPath).then(function (result) { if (result) { // just wait for completion return Promise.resolve(); } - console.log("[mediasync] reportTransfer: Size is 0 and download no longer in queue. Deleting item."); + console.log('[mediasync] reportTransfer: Size is 0 and download no longer in queue. Deleting item.'); return localassetmanager.removeLocalItem(item).then(function () { console.log('[mediasync] reportTransfer: Item deleted.'); return Promise.resolve(); }, function (err2) { - console.log('[mediasync] reportTransfer: Failed to delete item.', error); + console.log('[mediasync] reportTransfer: Failed to delete item.', err2); return Promise.resolve(); }); }); @@ -123,8 +126,10 @@ return apiClient.syncData(request).then(function (result) { return afterSyncData(apiClient, serverInfo, syncUserItemAccess, result).then(function () { + console.log('[mediasync] Exit syncData'); return Promise.resolve(); - }, function () { + }, function (err) { + console.error('[mediasync] Error in syncData: ' + err.toString()); return Promise.resolve(); }); @@ -202,20 +207,21 @@ return localassetmanager.getLocalItem(serverInfo.Id, libraryItem.Id).then(function (existingItem) { - console.log('[mediasync] getNewItem.getLocalItem completed'); - if (existingItem) { if (existingItem.SyncStatus === 'queued' || existingItem.SyncStatus === 'transferring' || existingItem.SyncStatus === 'synced') { - console.log('[mediasync] getNewItem.getLocalItem found existing item'); + console.log('[mediasync] getNewItem: getLocalItem found existing item'); return Promise.resolve(); } } - console.log('[mediasync] getNewItem.getLocalItem no existing item found'); + libraryItem.CanDelete = false; + libraryItem.CanDownload = false; + libraryItem.People = []; + libraryItem.SpecialFeatureCount = null; return localassetmanager.createLocalItem(libraryItem, serverInfo, jobItem).then(function (localItem) { - console.log('[mediasync] getNewItem.createLocalItem completed'); + console.log('[mediasync] getNewItem: createLocalItem completed'); localItem.SyncStatus = 'queued'; @@ -233,9 +239,7 @@ function downloadMedia(apiClient, jobItem, localItem, options) { - console.log('[mediasync] Begin downloadMedia'); - - var url = apiClient.getUrl("Sync/JobItems/" + jobItem.SyncJobItemId + "/File", { + var url = apiClient.getUrl('Sync/JobItems/' + jobItem.SyncJobItemId + '/File', { api_key: apiClient.accessToken() }); @@ -256,88 +260,117 @@ console.log('[mediasync] Begin getImages'); - return getNextImage(0, apiClient, localItem); - } + var p = Promise.resolve(); + + var libraryItem = localItem.Item; - function getNextImage(index, apiClient, localItem) { - - console.log('[mediasync] Begin getNextImage'); - - //if (index >= 4) { - - // deferred.resolve(); - // return; - //} - - // Just for now while media syncing gets worked out - return Promise.resolve(); - - //var libraryItem = localItem.Item; - - //var serverId = libraryItem.ServerId; - //var itemId = null; - //var imageTag = null; - //var imageType = "Primary"; - - //switch (index) { - - // case 0: - // itemId = libraryItem.Id; - // imageType = "Primary"; - // imageTag = (libraryItem.ImageTags || {})["Primary"]; - // break; - // case 1: - // itemId = libraryItem.SeriesId; - // imageType = "Primary"; - // imageTag = libraryItem.SeriesPrimaryImageTag; - // break; - // case 2: - // itemId = libraryItem.SeriesId; - // imageType = "Thumb"; - // imageTag = libraryItem.SeriesPrimaryImageTag; - // break; - // case 3: - // itemId = libraryItem.AlbumId; - // imageType = "Primary"; - // imageTag = libraryItem.AlbumPrimaryImageTag; - // break; - // default: - // break; - //} - - //if (!itemId || !imageTag) { - // getNextImage(index + 1, apiClient, localItem, deferred); - // return; - //} - - //downloadImage(apiClient, serverId, itemId, imageTag, imageType).then(function () { - - // // For the sake of simplicity, limit to one image - // deferred.resolve(); - // return; - - // getNextImage(index + 1, apiClient, localItem, deferred); - - //}, getOnFail(deferred)); + var serverId = libraryItem.ServerId; + + // case 0 + var mainImageTag = (libraryItem.ImageTags || {})['Primary']; + + if (libraryItem.Id && mainImageTag) { + p = p.then(function () { + return downloadImage(localItem, apiClient, serverId, libraryItem.Id, mainImageTag, 'Primary'); + }); + } + + // case 0a + var logoImageTag = (libraryItem.ImageTags || {})['Logo']; + if (libraryItem.Id && logoImageTag) { + p = p.then(function () { + return downloadImage(localItem, apiClient, serverId, libraryItem.Id, logoImageTag, 'Logo'); + }); + } + + // case 0b + var artImageTag = (libraryItem.ImageTags || {})['Art']; + if (libraryItem.Id && artImageTag) { + p = p.then(function () { + return downloadImage(localItem, apiClient, serverId, libraryItem.Id, artImageTag, 'Art'); + }); + } + + // case 0c + var bannerImageTag = (libraryItem.ImageTags || {})['Banner']; + if (libraryItem.Id && bannerImageTag) { + p = p.then(function () { + return downloadImage(localItem, apiClient, serverId, libraryItem.Id, bannerImageTag, 'Banner'); + }); + } + + // case 0d + var thumbImageTag = (libraryItem.ImageTags || {})['Thumb']; + if (libraryItem.Id && thumbImageTag) { + p = p.then(function () { + return downloadImage(localItem, apiClient, serverId, libraryItem.Id, thumbImageTag, 'Thumb'); + }); + } + + // Backdrops + if (libraryItem.Id && libraryItem.BackdropImageTags) { + for (var i = 0; i < libraryItem.BackdropImageTags.length; i++) { + + var backdropImageTag = libraryItem.BackdropImageTags[i]; + + // use self-invoking function to simulate block-level variable scope + (function (index, tag) { + p = p.then(function () { + return downloadImage(localItem, apiClient, serverId, libraryItem.Id, tag, 'backdrop', index); + }); + })(i, backdropImageTag); + } + } + + // case 1/2: + if (libraryItem.SeriesId && libraryItem.SeriesPrimaryImageTag) { + p = p.then(function () { + return downloadImage(localItem, apiClient, serverId, libraryItem.SeriesId, libraryItem.SeriesPrimaryImageTag, 'Primary'); + }); + p = p.then(function () { + return downloadImage(localItem, apiClient, serverId, libraryItem.SeriesId, libraryItem.SeriesPrimaryImageTag, 'Thumb'); + }); + } + + // case 3: + if (libraryItem.AlbumId && libraryItem.AlbumPrimaryImageTag) { + p = p.then(function () { + return downloadImage(localItem, apiClient, serverId, libraryItem.AlbumId, libraryItem.AlbumPrimaryImageTag, 'Primary'); + }); + } + + return p.then(function () { + console.log('[mediasync] Finished getImages'); + return localassetmanager.addOrUpdateLocalItem(localItem); + }, function (err) { + console.log('[mediasync] Error getImages: ' + err.toString()); + }); } - function downloadImage(apiClient, serverId, itemId, imageTag, imageType) { + function downloadImage(localItem, apiClient, serverId, itemId, imageTag, imageType, index) { + - console.log('[mediasync] Begin downloadImage'); + index = index || 0; - return localassetmanager.hasImage(serverId, itemId, imageTag).then(function (hasImage) { + return localassetmanager.hasImage(serverId, itemId, imageType, index).then(function (hasImage) { if (hasImage) { + console.log('[mediasync] downloadImage - skip existing: ' + itemId + ' ' + imageType + '_' + index.toString()); return Promise.resolve(); } var imageUrl = apiClient.getImageUrl(itemId, { tag: imageTag, type: imageType, + format: 'png', api_key: apiClient.accessToken() }); - return localassetmanager.downloadImage(imageUrl, serverId, itemId, imageTag); + console.log('[mediasync] downloadImage ' + itemId + ' ' + imageType + '_' + index.toString()); + + return localassetmanager.downloadImage(localItem, imageUrl, serverId, itemId, imageType, index); + }, function (err) { + console.log('[mediasync] Error downloadImage: ' + err.toString()); }); } @@ -346,7 +379,7 @@ console.log('[mediasync] Begin getSubtitles'); if (!jobItem.Item.MediaSources.length) { - console.log("[mediasync] Cannot download subtitles because video has no media source info."); + console.log('[mediasync] Cannot download subtitles because video has no media source info.'); return Promise.resolve(); } @@ -381,19 +414,26 @@ if (!subtitleStream) { // We shouldn't get in here, but let's just be safe anyway - console.log("[mediasync] Cannot download subtitles because matching stream info wasn't found."); + console.log('[mediasync] Cannot download subtitles because matching stream info was not found.'); return Promise.resolve(); } - var url = apiClient.getUrl("Sync/JobItems/" + jobItem.SyncJobItemId + "/AdditionalFiles", { + var url = apiClient.getUrl('Sync/JobItems/' + jobItem.SyncJobItemId + '/AdditionalFiles', { Name: file.Name, api_key: apiClient.accessToken() }); - var fileName = localassetmanager.getSubtitleSaveFileName(jobItem.OriginalFileName, subtitleStream.Language, subtitleStream.IsForced, subtitleStream.Codec); - var localFilePath = localassetmanager.getLocalFilePath(localItem, fileName); + var fileName = localassetmanager.getSubtitleSaveFileName(localItem, jobItem.OriginalFileName, subtitleStream.Language, subtitleStream.IsForced, subtitleStream.Codec); + + return localassetmanager.downloadSubtitles(url, fileName).then(function (subtitlePath) { - return localassetmanager.downloadSubtitles(url, localFilePath).then(function (subtitlePath) { + if (localItem.AdditionalFiles) { + localItem.AdditionalFiles.forEach(function (item) { + if (item.Name === file.Name) { + item.Path = subtitlePath; + } + }); + } subtitleStream.Path = subtitlePath; return localassetmanager.addOrUpdateLocalItem(localItem); @@ -406,10 +446,14 @@ self.sync = function (apiClient, serverInfo, options) { - console.log("[mediasync]************************************* Start sync"); + console.log('[mediasync]************************************* Start sync'); return processDownloadStatus(apiClient, serverInfo, options).then(function () { + if (options.syncCheckProgressOnly === true) { + return Promise.resolve(); + } + return reportOfflineActions(apiClient, serverInfo).then(function () { //// Do the first data sync @@ -420,7 +464,8 @@ // Do the second data sync return syncData(apiClient, serverInfo, false).then(function () { - console.log("[mediasync]************************************* Exit sync"); + console.log('[mediasync]************************************* Exit sync'); + return Promise.resolve(); }); }); //}); diff --git a/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-webcomponents/.bower.json b/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-webcomponents/.bower.json index 5028013450..d3304bb8be 100644 --- a/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-webcomponents/.bower.json +++ b/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-webcomponents/.bower.json @@ -14,12 +14,12 @@ }, "devDependencies": {}, "ignore": [], - "version": "1.4.397", - "_release": "1.4.397", + "version": "1.4.399", + "_release": "1.4.399", "_resolution": { "type": "version", - "tag": "1.4.397", - "commit": "9adcc0001dbf032595448070447de469a8f24130" + "tag": "1.4.399", + "commit": "b926b582df014a7b2b54e93dca167db73d59bbcb" }, "_source": "https://github.com/MediaBrowser/emby-webcomponents.git", "_target": "^1.2.1", diff --git a/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-webcomponents/itemcontextmenu.js b/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-webcomponents/itemcontextmenu.js index 8cf237b047..6729fb88c7 100644 --- a/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-webcomponents/itemcontextmenu.js +++ b/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-webcomponents/itemcontextmenu.js @@ -16,6 +16,11 @@ define(['apphost', 'globalize', 'connectionManager', 'itemHelper', 'embyRouter', var commands = []; + if (itemHelper.isLocalItem(item)) { + + return commands; + } + if (itemHelper.supportsAddingToCollection(item)) { commands.push({ name: globalize.translate('sharedcomponents#AddToCollection'), diff --git a/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-webcomponents/itemhelper.js b/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-webcomponents/itemhelper.js index 50dd42f815..f03824e8dc 100644 --- a/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-webcomponents/itemhelper.js +++ b/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-webcomponents/itemhelper.js @@ -111,10 +111,20 @@ define(['apphost'], function (appHost) { return user.Policy.IsAdministrator; } + function isLocalItem(item) { + + if (item && item.Id && item.Id.indexOf('local') === 0) { + return true; + } + + return false; + } + return { getDisplayName: getDisplayName, supportsAddingToCollection: supportsAddingToCollection, supportsAddingToPlaylist: supportsAddingToPlaylist, + isLocalItem: isLocalItem, canIdentify: function (user, itemType) { diff --git a/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-webcomponents/strings/kk.json b/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-webcomponents/strings/kk.json index 9002382bf2..f6fd9e75af 100644 --- a/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-webcomponents/strings/kk.json +++ b/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-webcomponents/strings/kk.json @@ -353,6 +353,6 @@ "HeaderPlayMyMedia": "\u041c\u0435\u043d\u0456\u04a3 \u0442\u0430\u0441\u044b\u0493\u044b\u0448\u0434\u0435\u0440\u0435\u043a\u0442\u0435\u0440\u0456\u043c\u0434\u0456 \u043e\u0439\u043d\u0430\u0442\u0443", "HeaderDiscoverEmbyPremiere": "Emby Premiere \u0430\u0448\u044b\u04a3\u044b\u0437", "OneChannel": "\u0411\u0456\u0440 \u0430\u0440\u043d\u0430\u0434\u0430\u043d", - "ConfirmRemoveDownload": "Remove download?", + "ConfirmRemoveDownload": "\u0416\u04af\u043a\u0442\u0435\u0443\u0434\u0456 \u0430\u043b\u0430\u0441\u0442\u0430\u0439\u043c\u044b\u0437 \u0431\u0430?", "AddedOnValue": "\u04ae\u0441\u0442\u0435\u043b\u0433\u0435\u043d\u0456 {0}" } \ No newline at end of file diff --git a/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-webcomponents/strings/pt-BR.json b/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-webcomponents/strings/pt-BR.json index f820315c22..083d3f0566 100644 --- a/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-webcomponents/strings/pt-BR.json +++ b/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-webcomponents/strings/pt-BR.json @@ -353,6 +353,6 @@ "HeaderPlayMyMedia": "Reproduzir minha M\u00eddia", "HeaderDiscoverEmbyPremiere": "Descobrir o Emby Premiere", "OneChannel": "Um canal", - "ConfirmRemoveDownload": "Remove download?", - "AddedOnValue": "Adicionado em {0}" + "ConfirmRemoveDownload": "Remover download?", + "AddedOnValue": "Adicionado {0}" } \ No newline at end of file diff --git a/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-webcomponents/strings/ru.json b/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-webcomponents/strings/ru.json index 197181cb5e..856f8fc71a 100644 --- a/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-webcomponents/strings/ru.json +++ b/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-webcomponents/strings/ru.json @@ -353,6 +353,6 @@ "HeaderPlayMyMedia": "\u0412\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0441\u0442\u0438 \u043c\u043e\u0438 \u043c\u0435\u0434\u0438\u0430\u0434\u0430\u043d\u043d\u044b\u0435", "HeaderDiscoverEmbyPremiere": "\u041e\u0442\u043a\u0440\u043e\u0439\u0442\u0435 Emby Premiere", "OneChannel": "\u041e\u0434\u0438\u043d \u043a\u0430\u043d\u0430\u043b", - "ConfirmRemoveDownload": "Remove download?", + "ConfirmRemoveDownload": "\u0418\u0437\u044a\u044f\u0442\u044c \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0443?", "AddedOnValue": "\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043e {0}" } \ No newline at end of file diff --git a/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-webcomponents/strings/zh-CN.json b/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-webcomponents/strings/zh-CN.json index f52ed5aa85..02965bf8aa 100644 --- a/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-webcomponents/strings/zh-CN.json +++ b/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-webcomponents/strings/zh-CN.json @@ -68,8 +68,8 @@ "ConfirmDeleteItem": "Deleting this item will delete it from both the file system and your media library. Are you sure you wish to continue?", "Refresh": "\u5237\u65b0", "RefreshQueued": "\u5217\u961f\u5df2\u5237\u65b0\u3002", - "AddToCollection": "Add to collection", - "HeaderAddToCollection": "Add to Collection", + "AddToCollection": "\u52a0\u5165\u5408\u96c6", + "HeaderAddToCollection": "\u52a0\u5165\u5408\u96c6", "NewCollection": "\u65b0\u5408\u96c6", "LabelCollection": "Collection:", "Help": "\u5e2e\u52a9", @@ -114,7 +114,7 @@ "Open": "\u6253\u5f00", "Play": "\u64ad\u653e", "Queue": "\u52a0\u5165\u961f\u5217", - "Shuffle": "\u6401\u7f6e", + "Shuffle": "\u968f\u673a\u64ad\u653e", "Identify": "\u8bc6\u522b", "EditImages": "\u4fee\u6539\u56fe\u7247", "EditInfo": "\u7f16\u8f91\u4fe1\u606f", @@ -162,7 +162,7 @@ "LabelOverview": "\u5185\u5bb9\u6982\u8ff0\uff1a", "LabelShortOverview": "\u7b80\u4ecb\uff1a", "LabelReleaseDate": "\u53d1\u884c\u65e5\u671f\uff1a", - "LabelYear": "Year:", + "LabelYear": "\u5e74\u4efd\uff1a", "LabelPlaceOfBirth": "\u51fa\u751f\u5730\uff1a", "LabelAirDays": "\u64ad\u51fa\u65e5\u671f\uff1a", "LabelAirTime": "\u64ad\u51fa\u65f6\u95f4\uff1a", @@ -213,14 +213,14 @@ "Continuing": "\u7ee7\u7eed", "Ended": "\u7ed3\u675f", "HeaderEnabledFields": "\u5df2\u542f\u7528\u7684\u680f", - "HeaderEnabledFieldsHelp": "Uncheck a field to lock it and prevent it's data from being changed.", + "HeaderEnabledFieldsHelp": "\u53cd\u9009\u680f\u4ee5\u9501\u5b9a\u5e76\u4e0d\u8ba9\u5176\u6570\u636e\u88ab\u66f4\u6539\u3002", "Backdrops": "\u80cc\u666f", "Images": "\u56fe\u7247", "Keywords": "\u5173\u952e\u8bcd", - "Runtime": "\u64ad\u653e\u65f6\u95f4", + "Runtime": "\u64ad\u653e\u65f6\u957f", "ProductionLocations": "Production locations", "BirthLocation": "\u51fa\u751f\u5730", - "ParentalRating": "Parental Rating", + "ParentalRating": "\u5bb6\u957f\u5206\u7ea7", "Name": "\u540d\u79f0", "Overview": "\u6982\u8ff0", "LabelType": "\u7c7b\u578b\uff1a", @@ -256,7 +256,7 @@ "PleaseEnterNameOrId": "\u8bf7\u8f93\u5165\u4e00\u4e2a\u540d\u79f0\u6216\u4e00\u4e2a\u5916\u90e8ID\u3002", "MessageItemSaved": "\u9879\u76ee\u5df2\u4fdd\u5b58\u3002", "SearchResults": "\u641c\u7d22\u7ed3\u679c", - "SyncToOtherDevice": "Sync to other device", + "SyncToOtherDevice": "\u540c\u6b65\u5230\u5176\u4ed6\u8bbe\u5907", "MakeAvailableOffline": "Make available offline", "ServerNameIsRestarting": "Emby Server - {0} is restarting.", "ServerNameIsShuttingDown": "Emby Server - {0} is shutting down.", @@ -264,7 +264,7 @@ "ConfirmDeleteItems": "Deleting these items will delete them from both the file system and your media library. Are you sure you wish to continue?", "PleaseRestartServerName": "Please restart Emby Server - {0}.", "SyncJobCreated": "Sync job created.", - "LabelSyncTo": "Sync to:", + "LabelSyncTo": "\u540c\u6b65\u5230\uff1a", "LabelSyncJobName": "Sync job name:", "LabelQuality": "Quality:", "LabelSyncNoTargetsHelp": "It looks like you don't currently have any apps that support sync.", @@ -278,7 +278,7 @@ "AutomaticallySyncNewContentHelp": "New content added to this folder will be automatically synced to the device.", "LabelItemLimit": "Item limit:", "LabelItemLimitHelp": "Optional. Set a limit to the number of items that will be synced.", - "PleaseSelectDeviceToSyncTo": "Please select a device to sync to.", + "PleaseSelectDeviceToSyncTo": "\u8bf7\u9009\u62e9\u60a8\u60f3\u8981\u540c\u6b65\u5230\u7684\u8bbe\u5907\u3002", "Screenshots": "Screenshots", "MoveRight": "Move right", "MoveLeft": "Move left", diff --git a/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-webcomponents/sync/sync.js b/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-webcomponents/sync/sync.js index 0e58db602f..dcc11b68ad 100644 --- a/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-webcomponents/sync/sync.js +++ b/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-webcomponents/sync/sync.js @@ -455,6 +455,10 @@ }); return promise.then(function () { + if (layoutManager.tv) { + scrollHelper.centerFocus.off(dlg.querySelector('.formDialogContent'), false); + } + if (submitted) { return Promise.resolve(); } diff --git a/MediaBrowser.WebDashboard/dashboard-ui/scripts/syncjob.js b/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-webcomponents/sync/syncjobeditor.js similarity index 61% rename from MediaBrowser.WebDashboard/dashboard-ui/scripts/syncjob.js rename to MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-webcomponents/sync/syncjobeditor.js index 6936cf220f..d5c9832c14 100644 --- a/MediaBrowser.WebDashboard/dashboard-ui/scripts/syncjob.js +++ b/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-webcomponents/sync/syncjobeditor.js @@ -1,31 +1,17 @@ -define(['connectionManager', 'serverNotifications', 'events', 'datetime', 'dom', 'imageLoader', 'loading', 'globalize', 'apphost', 'listViewStyle', 'paper-icon-button-light', 'emby-button'], function (connectionManager, serverNotifications, events, datetime, dom, imageLoader, loading, globalize, appHost) { +define(['connectionManager', 'serverNotifications', 'events', 'datetime', 'dom', 'imageLoader', 'loading', 'globalize', 'apphost', 'layoutManager', 'scrollHelper', 'dialogHelper', 'shell', 'listViewStyle', 'paper-icon-button-light', 'emby-button', 'formDialogStyle'], function (connectionManager, serverNotifications, events, datetime, dom, imageLoader, loading, globalize, appHost, layoutManager, scrollHelper, dialogHelper, shell) { 'use strict'; - function renderJob(page, job, dialogOptions) { - - var html = ''; - - html += '
'; - html += globalize.translate('ValueDateCreated', datetime.parseISO8601Date(job.DateCreated, true).toLocaleString()); - html += '
'; - html += '
'; - html += '
'; - - html += '
'; - html += '
'; - html += ''; - - page.querySelector('.syncJobForm').innerHTML = html; + function renderJob(context, job, dialogOptions) { require(['syncDialog'], function (syncDialog) { syncDialog.renderForm({ - elem: page.querySelector('.formFields'), + elem: context.querySelector('.syncJobFormContent'), dialogOptions: dialogOptions, dialogOptionsFn: getTargetDialogOptionsFn(dialogOptions), showName: true, readOnlySyncTarget: true }).then(function () { - fillJobValues(page, job, dialogOptions); + fillJobValues(context, job, dialogOptions); }); }); } @@ -102,7 +88,7 @@ return html; } - function renderJobItems(page, items, apiClient) { + function renderJobItems(context, items, apiClient) { var html = ''; @@ -119,7 +105,7 @@ html += '
'; - var elem = page.querySelector('.jobItems'); + var elem = context.querySelector('.jobItems'); elem.innerHTML = html; imageLoader.lazyChildren(elem); } @@ -139,7 +125,7 @@ function showJobItemMenu(elem, jobId, apiClient) { - var page = parentWithClass(elem, 'page'); + var context = parentWithClass(elem, 'page'); var listItem = parentWithClass(elem, 'listItem'); var jobItemId = listItem.getAttribute('data-itemid'); var status = listItem.getAttribute('data-status'); @@ -188,16 +174,16 @@ switch (id) { case 'cancel': - cancelJobItem(page, jobId, jobItemId, apiClient); + cancelJobItem(context, jobId, jobItemId, apiClient); break; case 'retry': - retryJobItem(page, jobId, jobItemId, apiClient); + retryJobItem(context, jobId, jobItemId, apiClient); break; case 'markforremoval': - markForRemoval(page, jobId, jobItemId, apiClient); + markForRemoval(context, jobId, jobItemId, apiClient); break; case 'unmarkforremoval': - unMarkForRemoval(page, jobId, jobItemId, apiClient); + unMarkForRemoval(context, jobId, jobItemId, apiClient); break; default: break; @@ -208,7 +194,7 @@ }); } - function cancelJobItem(page, jobId, jobItemId, apiClient) { + function cancelJobItem(context, jobId, jobItemId, apiClient) { // Need a timeout because jquery mobile will not show a popup while another is in the act of closing @@ -221,12 +207,12 @@ }).then(function () { - loadJob(page, jobId, apiClient); + loadJob(context, jobId, apiClient); }); } - function markForRemoval(page, jobId, jobItemId, apiClient) { + function markForRemoval(context, jobId, jobItemId, apiClient) { apiClient.ajax({ @@ -235,11 +221,11 @@ }).then(function () { - loadJob(page, jobId, apiClient); + loadJob(context, jobId, apiClient); }); } - function unMarkForRemoval(page, jobId, jobItemId, apiClient) { + function unMarkForRemoval(context, jobId, jobItemId, apiClient) { apiClient.ajax({ @@ -248,11 +234,11 @@ }).then(function () { - loadJob(page, jobId, apiClient); + loadJob(context, jobId, apiClient); }); } - function retryJobItem(page, jobId, jobItemId, apiClient) { + function retryJobItem(context, jobId, jobItemId, apiClient) { apiClient.ajax({ @@ -261,43 +247,43 @@ }).then(function () { - loadJob(page, jobId, apiClient); + loadJob(context, jobId, apiClient); }); } - function fillJobValues(page, job, editOptions) { + function fillJobValues(context, job, editOptions) { - var txtSyncJobName = page.querySelector('#txtSyncJobName'); + var txtSyncJobName = context.querySelector('#txtSyncJobName'); if (txtSyncJobName) { txtSyncJobName.value = job.Name; } - var selectProfile = page.querySelector('#selectProfile'); + var selectProfile = context.querySelector('#selectProfile'); if (selectProfile) { selectProfile.value = job.Profile || ''; } - var selectQuality = page.querySelector('#selectQuality'); + var selectQuality = context.querySelector('#selectQuality'); if (selectQuality) { selectQuality.value = job.Quality || ''; } - var chkUnwatchedOnly = page.querySelector('#chkUnwatchedOnly'); + var chkUnwatchedOnly = context.querySelector('#chkUnwatchedOnly'); if (chkUnwatchedOnly) { chkUnwatchedOnly.checked = job.UnwatchedOnly; } - var chkSyncNewContent = page.querySelector('#chkSyncNewContent'); + var chkSyncNewContent = context.querySelector('#chkSyncNewContent'); if (chkSyncNewContent) { chkSyncNewContent.checked = job.SyncNewContent; } - var txtItemLimit = page.querySelector('#txtItemLimit'); + var txtItemLimit = context.querySelector('#txtItemLimit'); if (txtItemLimit) { txtItemLimit.value = job.ItemLimit; } - var txtBitrate = page.querySelector('#txtBitrate'); + var txtBitrate = context.querySelector('#txtBitrate'); if (job.Bitrate) { txtBitrate.value = job.Bitrate / 1000000; } else { @@ -309,14 +295,14 @@ })[0]; var targetName = target ? target.Name : ''; - var selectSyncTarget = page.querySelector('#selectSyncTarget'); + var selectSyncTarget = context.querySelector('#selectSyncTarget'); if (selectSyncTarget) { selectSyncTarget.value = targetName; } } var _jobOptions; - function loadJob(page, id, apiClient) { + function loadJob(context, id, apiClient) { loading.show(); @@ -334,7 +320,7 @@ })).then(function (options) { _jobOptions = options; - renderJob(page, job, options); + renderJob(context, job, options); loading.hide(); }); }); @@ -346,26 +332,26 @@ })).then(function (result) { - renderJobItems(page, result.Items, apiClient); + renderJobItems(context, result.Items, apiClient); loading.hide(); }); } - function loadJobInfo(page, job, jobItems, apiClient) { + function loadJobInfo(context, job, jobItems, apiClient) { //renderJob(page, job, _jobOptions); - renderJobItems(page, jobItems, apiClient); + renderJobItems(context, jobItems, apiClient); loading.hide(); } - function saveJob(page, id, apiClient) { + function saveJob(context, id, apiClient) { loading.show(); apiClient.getJSON(apiClient.getUrl('Sync/Jobs/' + id)).then(function (job) { require(['syncDialog'], function (syncDialog) { - syncDialog.setJobValues(job, page); + syncDialog.setJobValues(job, context); apiClient.ajax({ @@ -377,75 +363,150 @@ }).then(function () { loading.hide(); - require(['toast'], function (toast) { - toast(globalize.translate('SettingsSaved')); - }); + dialogHelper.close(context); }); }); }); } - return function (view, params) { + function onHelpLinkClick(e) { - function getApiClient() { - return connectionManager.getApiClient(params.serverId); + shell.openUrl(this.href); + + e.preventDefault(); + return false; + } + + function startListening(apiClient, jobId) { + + var startParams = "0,1500"; + + startParams += "," + jobId; + + if (apiClient.isWebSocketOpen()) { + apiClient.sendWebSocketMessage("SyncJobStart", startParams); } + } - view.querySelector('.syncJobForm').addEventListener('submit', function (e) { + function stopListening(apiClient) { - saveJob(view, params.id, getApiClient()); - e.preventDefault(); - return false; + if (apiClient.isWebSocketOpen()) { + apiClient.sendWebSocketMessage("SyncJobStop", ""); + } + + } + + function bindEvents(context, jobId, apiClient) { + context.querySelector('.jobItems').addEventListener('click', function (e) { + var btnJobItemMenu = dom.parentWithClass(e.target, 'btnJobItemMenu'); + if (btnJobItemMenu) { + showJobItemMenu(btnJobItemMenu, jobId, apiClient); + } }); + } - function onSyncJobMessage(e, apiClient, msg) { - loadJobInfo(view, msg.Job, msg.JobItems, apiClient); + function showEditor(options) { + + var apiClient = connectionManager.getApiClient(options.serverId); + var id = options.jobId; + + var dlgElementOptions = { + removeOnClose: true, + scrollY: false, + autoFocus: false + }; + + if (layoutManager.tv) { + dlgElementOptions.size = 'fullscreen'; + } else { + dlgElementOptions.size = 'medium'; } - function startListening(page) { + var dlg = dialogHelper.createDialog(dlgElementOptions); - var startParams = "0,1500"; + dlg.classList.add('formDialog'); - startParams += "," + params.id; + var html = ''; + html += '
'; + html += ''; + html += '

'; + html += globalize.translate('sharedcomponents#Sync'); + html += '

'; - var apiClient = getApiClient(); + html += ''; - if (apiClient.isWebSocketOpen()) { - apiClient.sendWebSocketMessage("SyncJobStart", startParams); - } - } + html += '
'; - function stopListening() { + html += '
'; + html += '
'; - var apiClient = getApiClient(); + html += ''; - if (apiClient.isWebSocketOpen()) { - apiClient.sendWebSocketMessage("SyncJobStop", ""); - } + html += '
'; - } + html += '
'; - view.querySelector('.jobItems').addEventListener('click', function (e) { - var btnJobItemMenu = dom.parentWithClass(e.target, 'btnJobItemMenu'); - if (btnJobItemMenu) { - showJobItemMenu(btnJobItemMenu, params.id); - } - }); + html += '
'; + html += ''; + html += '
'; + + html += ''; - view.addEventListener('viewshow', function () { - var page = this; - loadJob(page, params.id, getApiClient()); + html += '
'; + html += '
'; + + dlg.innerHTML = html; + + dlg.querySelector('.lnkHelp').addEventListener('click', onHelpLinkClick); + + var submitted = false; + + dlg.querySelector('form').addEventListener('submit', function (e) { + + saveJob(dlg, id, apiClient); + e.preventDefault(); + return false; + }); - startListening(page); - events.on(serverNotifications, "SyncJob", onSyncJobMessage); + dlg.querySelector('.btnCancel').addEventListener('click', function () { + dialogHelper.close(dlg); }); - view.addEventListener('viewbeforehide', function () { + if (layoutManager.tv) { + scrollHelper.centerFocus.on(dlg.querySelector('.formDialogContent'), false); + } + + function onSyncJobMessage(e, apiClient, msg) { + loadJobInfo(dlg, msg.Job, msg.JobItems, apiClient); + } + + loadJob(dlg, id, apiClient); + bindEvents(dlg, id, apiClient); + + var promise = dialogHelper.open(dlg); - stopListening(); + startListening(apiClient, id); + events.on(serverNotifications, "SyncJob", onSyncJobMessage); + + return promise.then(function () { + + stopListening(apiClient); events.off(serverNotifications, "SyncJob", onSyncJobMessage); + + if (layoutManager.tv) { + scrollHelper.centerFocus.off(dlg.querySelector('.formDialogContent'), false); + } + + if (submitted) { + return Promise.resolve(); + } + return Promise.reject(); }); + } + + return { + show: showEditor }; }); \ No newline at end of file diff --git a/MediaBrowser.WebDashboard/dashboard-ui/components/syncjoblist/syncjoblist.js b/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-webcomponents/sync/syncjoblist.js similarity index 100% rename from MediaBrowser.WebDashboard/dashboard-ui/components/syncjoblist/syncjoblist.js rename to MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-webcomponents/sync/syncjoblist.js diff --git a/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-webcomponents/sync/synctoggle.js b/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-webcomponents/sync/synctoggle.js index 3f209996bf..c9553fd540 100644 --- a/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-webcomponents/sync/synctoggle.js +++ b/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-webcomponents/sync/synctoggle.js @@ -69,8 +69,10 @@ syncToggle.prototype.refresh = function(item) { - this.options.item = item; - updateSyncStatus(this.options.container, item); + if (this.options) { + this.options.item = item; + updateSyncStatus(this.options.container, item); + } }; syncToggle.prototype.destroy = function () { diff --git a/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-webcomponents/userdatabuttons/userdatabuttons.js b/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-webcomponents/userdatabuttons/userdatabuttons.js index f1cd83b9c1..dd7d63a4ab 100644 --- a/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-webcomponents/userdatabuttons/userdatabuttons.js +++ b/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-webcomponents/userdatabuttons/userdatabuttons.js @@ -1,4 +1,4 @@ -define(['connectionManager', 'globalize', 'dom', 'paper-icon-button-light', 'material-icons', 'emby-button', 'css!./userdatabuttons'], function (connectionManager, globalize, dom) { +define(['connectionManager', 'globalize', 'dom', 'itemHelper', 'paper-icon-button-light', 'material-icons', 'emby-button', 'css!./userdatabuttons'], function (connectionManager, globalize, dom, itemHelper) { 'use strict'; var userDataMethods = { @@ -86,6 +86,10 @@ define(['connectionManager', 'globalize', 'dom', 'paper-icon-button-light', 'mat var itemId = item.Id; + if (itemHelper.isLocalItem(item)) { + return html; + } + var btnCssClass = "btnUserData"; if (cssClass) { diff --git a/MediaBrowser.WebDashboard/dashboard-ui/scripts/mysync.js b/MediaBrowser.WebDashboard/dashboard-ui/scripts/mysync.js index b3cb9aef09..0e0d009b9f 100644 --- a/MediaBrowser.WebDashboard/dashboard-ui/scripts/mysync.js +++ b/MediaBrowser.WebDashboard/dashboard-ui/scripts/mysync.js @@ -81,7 +81,12 @@ events.on(mySyncJobList, 'jobedit', function (e, jobId, serverId) { - Dashboard.navigate('mysyncjob.html?serverId=' + ApiClient.serverId() + '&id=' + jobId); + require(['syncJobEditor'], function (syncJobEditor) { + syncJobEditor.show({ + serverId: ApiClient.serverId(), + jobId: jobId + }); + }); }); view.addEventListener('viewbeforeshow', function () { diff --git a/MediaBrowser.WebDashboard/dashboard-ui/scripts/site.js b/MediaBrowser.WebDashboard/dashboard-ui/scripts/site.js index faf6153537..2943a7efd0 100644 --- a/MediaBrowser.WebDashboard/dashboard-ui/scripts/site.js +++ b/MediaBrowser.WebDashboard/dashboard-ui/scripts/site.js @@ -1234,7 +1234,6 @@ var AppInfo = {}; define("lazyLoader", [embyWebComponentsBowerPath + "/lazyloader/lazyloader-scroll"], returnFirstDependency); } define("imageLoader", [embyWebComponentsBowerPath + "/images/imagehelper"], returnFirstDependency); - define("syncJobList", ["components/syncjoblist/syncjoblist"], returnFirstDependency); define("appfooter", ["components/appfooter/appfooter"], returnFirstDependency); define("dockedtabs", ["components/dockedtabs/dockedtabs"], returnFirstDependency); define("directorybrowser", ["components/directorybrowser/directorybrowser"], returnFirstDependency); @@ -1290,6 +1289,8 @@ var AppInfo = {}; define("guide-settings-dialog", [embyWebComponentsBowerPath + "/guide/guide-settings"], returnFirstDependency); define("syncDialog", [embyWebComponentsBowerPath + "/sync/sync"], returnFirstDependency); define("syncToggle", [embyWebComponentsBowerPath + "/sync/synctoggle"], returnFirstDependency); + define("syncJobEditor", [embyWebComponentsBowerPath + "/sync/syncjobeditor"], returnFirstDependency); + define("syncJobList", [embyWebComponentsBowerPath + "/sync/syncjoblist"], returnFirstDependency); define("voiceDialog", [embyWebComponentsBowerPath + "/voice/voicedialog"], returnFirstDependency); define("voiceReceiver", [embyWebComponentsBowerPath + "/voice/voicereceiver"], returnFirstDependency); define("voiceProcessor", [embyWebComponentsBowerPath + "/voice/voiceprocessor"], returnFirstDependency); @@ -2490,14 +2491,6 @@ var AppInfo = {}; controller: 'scripts/syncactivity' }); - defineRoute({ - path: '/syncjob.html', - dependencies: [], - autoFocus: false, - transition: 'fade', - controller: 'scripts/syncjob' - }); - defineRoute({ path: '/syncsettings.html', dependencies: [], diff --git a/MediaBrowser.WebDashboard/dashboard-ui/scripts/syncactivity.js b/MediaBrowser.WebDashboard/dashboard-ui/scripts/syncactivity.js index 9e1728d354..a64633aa3c 100644 --- a/MediaBrowser.WebDashboard/dashboard-ui/scripts/syncactivity.js +++ b/MediaBrowser.WebDashboard/dashboard-ui/scripts/syncactivity.js @@ -52,7 +52,12 @@ events.on(mySyncJobList, 'jobedit', function (e, jobId, serverId) { - Dashboard.navigate('syncjob.html?serverId=' + ApiClient.serverId() + '&id=' + jobId); + require(['syncJobEditor'], function (syncJobEditor) { + syncJobEditor.show({ + serverId: ApiClient.serverId(), + jobId: jobId + }); + }); }); view.addEventListener('viewshow', function () { diff --git a/MediaBrowser.WebDashboard/dashboard-ui/syncjob.html b/MediaBrowser.WebDashboard/dashboard-ui/syncjob.html deleted file mode 100644 index 75ae6339ea..0000000000 --- a/MediaBrowser.WebDashboard/dashboard-ui/syncjob.html +++ /dev/null @@ -1,14 +0,0 @@ -
- -
-
- -
-
-
-
-
-
-
-
-
\ No newline at end of file From a2c30b71c4d96ce061e8df0695295b91642edc3d Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Mon, 26 Dec 2016 12:37:05 -0500 Subject: [PATCH 31/62] update sync dialogs --- .../MediaBrowser.WebDashboard.csproj | 9 -- .../emby-webcomponents/.bower.json | 8 +- .../emby-webcomponents/itemcontextmenu.js | 14 +-- .../metadataeditor/metadataeditor.js | 6 +- .../emby-webcomponents/strings/en-US.json | 28 +++++- .../emby-webcomponents/sync/syncjobeditor.js | 22 ++--- .../emby-webcomponents/sync/syncjoblist.js | 85 +++++++++++++++---- .../emby-webcomponents/sync/synctoggle.js | 9 +- .../dashboard-ui/css/librarybrowser.css | 2 +- .../dashboard-ui/mysync.html | 11 --- .../dashboard-ui/scripts/mysync.js | 40 +-------- .../dashboard-ui/scripts/syncactivity.js | 33 +------ .../dashboard-ui/syncactivity.html | 13 --- 13 files changed, 124 insertions(+), 156 deletions(-) diff --git a/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj b/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj index 8678925675..0a67cbdb06 100644 --- a/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj +++ b/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj @@ -162,9 +162,6 @@ PreserveNewest - - PreserveNewest - PreserveNewest @@ -507,9 +504,6 @@ PreserveNewest - - PreserveNewest - PreserveNewest @@ -534,9 +528,6 @@ PreserveNewest - - PreserveNewest - PreserveNewest diff --git a/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-webcomponents/.bower.json b/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-webcomponents/.bower.json index d3304bb8be..2aba635581 100644 --- a/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-webcomponents/.bower.json +++ b/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-webcomponents/.bower.json @@ -14,12 +14,12 @@ }, "devDependencies": {}, "ignore": [], - "version": "1.4.399", - "_release": "1.4.399", + "version": "1.4.400", + "_release": "1.4.400", "_resolution": { "type": "version", - "tag": "1.4.399", - "commit": "b926b582df014a7b2b54e93dca167db73d59bbcb" + "tag": "1.4.400", + "commit": "8b3fe5c5f8044cccac68ca4535c2c818d160899e" }, "_source": "https://github.com/MediaBrowser/emby-webcomponents.git", "_target": "^1.2.1", diff --git a/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-webcomponents/itemcontextmenu.js b/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-webcomponents/itemcontextmenu.js index 6729fb88c7..4a614a715a 100644 --- a/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-webcomponents/itemcontextmenu.js +++ b/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-webcomponents/itemcontextmenu.js @@ -71,6 +71,13 @@ define(['apphost', 'globalize', 'connectionManager', 'itemHelper', 'embyRouter', } } + if (item.CanDownload && appHost.supports('filedownload')) { + commands.push({ + name: globalize.translate('sharedcomponents#Download'), + id: 'download' + }); + } + if (itemHelper.canEdit(user, item)) { if (options.edit !== false && item.Type !== 'SeriesTimer') { @@ -106,13 +113,6 @@ define(['apphost', 'globalize', 'connectionManager', 'itemHelper', 'embyRouter', } } - if (item.CanDownload && appHost.supports('filedownload')) { - commands.push({ - name: globalize.translate('sharedcomponents#Download'), - id: 'download' - }); - } - if (options.identify !== false) { if (itemHelper.canIdentify(user, item.Type)) { commands.push({ diff --git a/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-webcomponents/metadataeditor/metadataeditor.js b/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-webcomponents/metadataeditor/metadataeditor.js index e7a7b1e39e..2dd6cbe1da 100644 --- a/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-webcomponents/metadataeditor/metadataeditor.js +++ b/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-webcomponents/metadataeditor/metadataeditor.js @@ -765,11 +765,11 @@ showElement('#fldParentIndexNumber'); if (item.Type === "Episode") { - context.querySelector('#txtParentIndexNumber').label(globalize.translate('LabelSeasonNumber')); + context.querySelector('#txtParentIndexNumber').label(globalize.translate('sharedcomponents#LabelSeasonNumber')); } else if (item.Type === "Audio") { - context.querySelector('#txtParentIndexNumber').label(globalize.translate('LabelDiscNumber')); + context.querySelector('#txtParentIndexNumber').label(globalize.translate('sharedcomponents#LabelDiscNumber')); } else { - context.querySelector('#txtParentIndexNumber').label(globalize.translate('LabelParentNumber')); + context.querySelector('#txtParentIndexNumber').label(globalize.translate('sharedcomponents#LabelParentNumber')); } } else { hideElement('#fldParentIndexNumber', context); diff --git a/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-webcomponents/strings/en-US.json b/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-webcomponents/strings/en-US.json index e4bb749a2e..124c0ccc27 100644 --- a/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-webcomponents/strings/en-US.json +++ b/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-webcomponents/strings/en-US.json @@ -49,6 +49,8 @@ "CloudSyncFeatureDescription": "Sync your media to the cloud for easy backup, archiving, and converting.", "CoverArtFeatureDescription": "Cover Art creates fun covers and other treatments to help you personalize your media images.", "CoverArt": "Cover Art", + "ButtonCancelSyncJob": "Cancel sync", + "CancelSyncJobConfirmation": "Cancelling the sync job will remove synced media from the device during the next sync process. Are you sure you wish to proceed?", "CinemaModeFeatureDescription": "Cinema Mode gives you the true cinema experience with trailers and custom intros before the feature.", "HeaderFreeApps": "Free Emby Apps", "FreeAppsFeatureDescription": "Enjoy free access to Emby apps for your devices.", @@ -206,8 +208,8 @@ "LabelEpisodeNumber": "Episode number:", "LabelTrackNumber": "Track number:", "LabelNumber": "Number:", - "LabelDiscNumber": "Disc number", - "LabelParentNumber": "Parent number", + "LabelDiscNumber": "Disc number:", + "LabelParentNumber": "Parent number:", "SortName": "Sort name", "ReleaseDate": "Release date", "Continuing": "Continuing", @@ -232,11 +234,14 @@ "GuestStar": "Guest star", "Producer": "Producer", "Writer": "Writer", + "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the app.", + "MessageNoDownloadsFound": "No offline downloads. Make your media available offline by clicking Make Available Offline throughout the app.", "InstallingPackage": "Installing {0}", "PackageInstallCompleted": "{0} installation completed.", "PackageInstallFailed": "{0} installation failed.", "PackageInstallCancelled": "{0} installation cancelled.", "SeriesYearToPresent": "{0} - Present", + "ValueOneItem": "1 item", "ValueOneSong": "1 song", "ValueSongCount": "{0} songs", "ValueOneMovie": "1 movie", @@ -269,6 +274,7 @@ "LabelQuality": "Quality:", "LabelSyncNoTargetsHelp": "It looks like you don't currently have any apps that support sync.", "DownloadScheduled": "Download scheduled", + "HeaderSyncRequiresSub": "Sync requires an active Emby Premiere subscription.", "LearnMore": "Learn more", "LabelProfile": "Profile:", "LabelBitrateMbps": "Bitrate (Mbps):", @@ -352,7 +358,23 @@ "MessageDidYouKnowCinemaMode2": "Cinema Mode gives you the true cinema experience with trailers and custom intros before the main feature.", "HeaderPlayMyMedia": "Play my Media", "HeaderDiscoverEmbyPremiere": "Discover Emby Premiere", + "Items": "Items", "OneChannel": "One channel", "ConfirmRemoveDownload": "Remove download?", - "AddedOnValue": "Added {0}" + "RemoveDownload": "Remove download", + "AddedOnValue": "Added {0}", + "RemovingFromDevice": "Removing from device", + "RemoveFromDevice": "Remove from device", + "KeepOnDevice": "Keep on device", + "CancelDownload": "Cancel download", + "SyncJobItemStatusReadyToTransfer": "Ready to Transfer", + "SyncJobItemStatusSyncedMarkForRemoval": "Removing from device", + "SyncJobItemStatusQueued": "Queued", + "SyncJobItemStatusConverting": "Converting", + "SyncJobItemStatusTransferring": "Transferring", + "SyncJobItemStatusSynced": "Downloaded", + "SyncJobItemStatusFailed": "Failed", + "SyncJobItemStatusRemovedFromDevice": "Removed from device", + "SyncJobItemStatusCancelled": "Cancelled", + "Retry": "Retry" } \ No newline at end of file diff --git a/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-webcomponents/sync/syncjobeditor.js b/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-webcomponents/sync/syncjobeditor.js index d5c9832c14..94dfe18d8d 100644 --- a/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-webcomponents/sync/syncjobeditor.js +++ b/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-webcomponents/sync/syncjobeditor.js @@ -62,10 +62,10 @@ } else { html += '
'; } - html += globalize.translate('SyncJobItemStatus' + jobItem.Status); + html += globalize.translate('sharedcomponents#SyncJobItemStatus' + jobItem.Status); if (jobItem.Status == 'Synced' && jobItem.IsMarkedForRemoval) { html += '
'; - html += globalize.translate('SyncJobItemStatusSyncedMarkForRemoval'); + html += globalize.translate('sharedcomponents#RemovingFromDevice'); } html += '
'; @@ -92,7 +92,7 @@ var html = ''; - html += '

' + globalize.translate('HeaderItems') + '

'; + html += '

' + globalize.translate('sharedcomponents#Items') + '

'; html += '
'; @@ -133,33 +133,27 @@ var menuItems = []; - if (status == 'Failed') { + if (status == 'Failed' || status == 'Cancelled') { menuItems.push({ - name: globalize.translate('ButtonQueueForRetry'), - id: 'retry' - }); - } - else if (status == 'Cancelled') { - menuItems.push({ - name: globalize.translate('ButtonReenable'), + name: globalize.translate('sharedcomponents#Retry'), id: 'retry' }); } else if (status == 'Queued' || status == 'Transferring' || status == 'Converting' || status == 'ReadyToTransfer') { menuItems.push({ - name: globalize.translate('ButtonCancelItem'), + name: globalize.translate('sharedcomponents#CancelDownload'), id: 'cancel' }); } else if (status == 'Synced' && remove) { menuItems.push({ - name: globalize.translate('ButtonUnmarkForRemoval'), + name: globalize.translate('sharedcomponents#KeepOnDevice'), id: 'unmarkforremoval' }); } else if (status == 'Synced') { menuItems.push({ - name: globalize.translate('ButtonMarkForRemoval'), + name: globalize.translate('sharedcomponents#RemoveFromDevice'), id: 'markforremoval' }); } diff --git a/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-webcomponents/sync/syncjoblist.js b/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-webcomponents/sync/syncjoblist.js index f5de8da7f1..31b0c503ea 100644 --- a/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-webcomponents/sync/syncjoblist.js +++ b/MediaBrowser.WebDashboard/dashboard-ui/bower_components/emby-webcomponents/sync/syncjoblist.js @@ -1,4 +1,4 @@ -define(['serverNotifications', 'events', 'loading', 'connectionManager', 'imageLoader', 'dom', 'globalize', 'listViewStyle'], function (serverNotifications, events, loading, connectionManager, imageLoader, dom, globalize) { +define(['serverNotifications', 'events', 'loading', 'connectionManager', 'imageLoader', 'dom', 'globalize', 'registrationServices', 'listViewStyle'], function (serverNotifications, events, loading, connectionManager, imageLoader, dom, globalize, registrationServices) { 'use strict'; function onSyncJobsUpdated(e, apiClient, data) { @@ -20,10 +20,15 @@ require(['confirm'], function (confirm) { var msg = listInstance.options.isLocalSync ? -globalize.translate('ConfirmRemoveDownload') : -globalize.translate('CancelSyncJobConfirmation'); +globalize.translate('sharedcomponents#ConfirmRemoveDownload') : +globalize.translate('sharedcomponents#CancelSyncJobConfirmation'); - confirm(msg).then(function () { + confirm({ + + text: msg, + primary: 'cancel' + + }).then(function () { loading.show(); var apiClient = getApiClient(listInstance); @@ -94,10 +99,10 @@ globalize.translate('CancelSyncJobConfirmation'); textLines.push(job.Name); - if (job.ItemCount == 1) { - textLines.push(globalize.translate('ValueItemCount', job.ItemCount)); + if (job.ItemCount === 1) { + textLines.push(globalize.translate('sharedcomponents#ValueOneItem')); } else { - textLines.push(globalize.translate('ValueItemCountPlural', job.ItemCount)); + textLines.push(globalize.translate('sharedcomponents#ItemCount', job.ItemCount)); } if (textLines >= 3) { @@ -165,10 +170,10 @@ globalize.translate('CancelSyncJobConfirmation'); html += '
'; - html += '
' + targetName + '
'; + html += '

' + targetName + '

'; html += '
'; - html += '
'; + html += '
'; hasOpenSection = true; } } @@ -180,13 +185,13 @@ globalize.translate('CancelSyncJobConfirmation'); html += '
'; } - var elem = listInstance.options.element; + var elem = listInstance.options.element.querySelector('.syncJobListContent'); if (!html) { if (isLocalSync) { - html = '
' + globalize.translate('MessageDownloadsFound') + '
'; + html = '
' + globalize.translate('sharedcomponents#MessageNoDownloadsFound') + '
'; } else { - html = '
' + globalize.translate('MessageNoSyncJobsFound') + '
'; + html = '
' + globalize.translate('sharedcomponents#MessageNoSyncJobsFound') + '
'; } } @@ -260,16 +265,16 @@ globalize.translate('CancelSyncJobConfirmation'); if (status == 'Cancelled') { menuItems.push({ - name: globalize.translate('ButtonDelete'), + name: globalize.translate('sharedcomponents#Delete'), id: 'delete' }); } else { var txt = listInstance.options.isLocalSync ? -globalize.translate('RemoveDownload') : -globalize.translate('ButtonCancelSyncJob'); +globalize.translate('sharedcomponents#RemoveDownload') : +globalize.translate('sharedcomponents#ButtonCancelSyncJob'); menuItems.push({ - name: globalize.translate(txt), + name: txt, id: 'cancel' }); } @@ -312,7 +317,14 @@ globalize.translate('ButtonCancelSyncJob'); if (listItem) { var jobId = listItem.getAttribute('data-id'); // edit job - events.trigger(listInstance, 'jobedit', [jobId, listInstance.options.serverId]); + require(['syncJobEditor'], function (syncJobEditor) { + syncJobEditor.show({ + serverId: listInstance.options.serverId, + jobId: jobId + }).then(function () { + fetchData(listInstance); + }); + }); } } @@ -327,8 +339,47 @@ globalize.translate('ButtonCancelSyncJob'); options.element.addEventListener('click', onClickHandler); this.onClickHandler = onClickHandler; + options.element.innerHTML = '
'; + fetchData(this); startListening(this); + + initSupporterInfo(options.element, getApiClient(this)); + } + + function showSupporterInfo(context) { + + var html = ' -
-

diff --git a/MediaBrowser.WebDashboard/dashboard-ui/scripts/mysync.js b/MediaBrowser.WebDashboard/dashboard-ui/scripts/mysync.js index 0e0d009b9f..4d154d3dbf 100644 --- a/MediaBrowser.WebDashboard/dashboard-ui/scripts/mysync.js +++ b/MediaBrowser.WebDashboard/dashboard-ui/scripts/mysync.js @@ -1,32 +1,6 @@ define(['apphost', 'globalize', 'syncJobList', 'events', 'localsync', 'emby-button', 'paper-icon-button-light'], function (appHost, globalize, syncJobList, events, localSync) { 'use strict'; - function initSupporterInfo(view, params) { - - view.querySelector('.btnSyncSupporter').addEventListener('click', function () { - - requirejs(["registrationServices"], function (registrationServices) { - registrationServices.validateFeature('sync'); - }); - }); - - view.querySelector('.supporterPromotion .mainText').innerHTML = globalize.translate('HeaderSyncRequiresSupporterMembership'); - - var apiClient = ApiClient; - apiClient.getPluginSecurityInfo().then(function (regInfo) { - - if (regInfo.IsMBSupporter) { - view.querySelector('.supporterPromotionContainer').classList.add('hide'); - } else { - view.querySelector('.supporterPromotionContainer').classList.remove('hide'); - } - - }, function () { - - view.querySelector('.supporterPromotionContainer').classList.remove('hide'); - }); - } - return function (view, params) { var interval; @@ -71,22 +45,12 @@ view.querySelector('.localSyncStatus').classList.add('hide'); } - initSupporterInfo(view, params); var mySyncJobList = new syncJobList({ isLocalSync: params.mode === 'offline', serverId: ApiClient.serverId(), userId: params.mode === 'offline' ? null : ApiClient.getCurrentUserId(), - element: view.querySelector('.syncActivity') - }); - - events.on(mySyncJobList, 'jobedit', function (e, jobId, serverId) { - - require(['syncJobEditor'], function (syncJobEditor) { - syncJobEditor.show({ - serverId: ApiClient.serverId(), - jobId: jobId - }); - }); + element: view.querySelector('.syncActivity'), + mode: params.mode }); view.addEventListener('viewbeforeshow', function () { diff --git a/MediaBrowser.WebDashboard/dashboard-ui/scripts/syncactivity.js b/MediaBrowser.WebDashboard/dashboard-ui/scripts/syncactivity.js index a64633aa3c..607a3bf83e 100644 --- a/MediaBrowser.WebDashboard/dashboard-ui/scripts/syncactivity.js +++ b/MediaBrowser.WebDashboard/dashboard-ui/scripts/syncactivity.js @@ -21,43 +21,14 @@ }]; } - function initSupporterInfo(view, params) { - - view.querySelector('.supporterPromotion .mainText').innerHTML = globalize.translate('HeaderSyncRequiresSupporterMembership'); - - var apiClient = ApiClient; - apiClient.getPluginSecurityInfo().then(function (regInfo) { - - if (regInfo.IsMBSupporter) { - view.querySelector('.supporterPromotionContainer').classList.add('hide'); - } else { - view.querySelector('.supporterPromotionContainer').classList.remove('hide'); - } - - }, function () { - - view.querySelector('.supporterPromotionContainer').classList.remove('hide'); - }); - } - return function (view, params) { - initSupporterInfo(view, params); var mySyncJobList = new syncJobList({ isLocalSync: params.mode === 'offline', serverId: ApiClient.serverId(), userId: params.mode === 'offline' ? null : ApiClient.getCurrentUserId(), - element: view.querySelector('.syncActivity') - }); - - events.on(mySyncJobList, 'jobedit', function (e, jobId, serverId) { - - require(['syncJobEditor'], function (syncJobEditor) { - syncJobEditor.show({ - serverId: ApiClient.serverId(), - jobId: jobId - }); - }); + element: view.querySelector('.syncActivity'), + mode: params.mode }); view.addEventListener('viewshow', function () { diff --git a/MediaBrowser.WebDashboard/dashboard-ui/syncactivity.html b/MediaBrowser.WebDashboard/dashboard-ui/syncactivity.html index 920f1d4b1b..84b8a960ea 100644 --- a/MediaBrowser.WebDashboard/dashboard-ui/syncactivity.html +++ b/MediaBrowser.WebDashboard/dashboard-ui/syncactivity.html @@ -17,19 +17,6 @@
-