From 357a3750de7cc1a95719fcdf96fb366d75269675 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Sun, 18 Dec 2016 01:28:48 -0500 Subject: [PATCH 01/55] 3.1.0 --- SharedVersion.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SharedVersion.cs b/SharedVersion.cs index 0561738e2..cde531792 100644 --- a/SharedVersion.cs +++ b/SharedVersion.cs @@ -1,4 +1,4 @@ using System.Reflection; //[assembly: AssemblyVersion("3.1.*")] -[assembly: AssemblyVersion("3.1.259")] +[assembly: AssemblyVersion("3.1.0")] From 617bbce0e116d76f412ab64f2e6fa585a48e6211 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Tue, 20 Dec 2016 15:06:36 -0500 Subject: [PATCH 02/55] 3.1.260 --- SharedVersion.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/SharedVersion.cs b/SharedVersion.cs index 16c597910..aa4bd7a34 100644 --- a/SharedVersion.cs +++ b/SharedVersion.cs @@ -1,4 +1,4 @@ using System.Reflection; -[assembly: AssemblyVersion("3.1.*")] -//[assembly: AssemblyVersion("3.1.259")] +//[assembly: AssemblyVersion("3.1.*")] +[assembly: AssemblyVersion("3.1.260")] From f54ed748376184b3d5f4100ad8c64cef732c226a Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Wed, 21 Dec 2016 15:24:20 -0500 Subject: [PATCH 03/55] fix merge conflict --- SharedVersion.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SharedVersion.cs b/SharedVersion.cs index cde531792..aa4bd7a34 100644 --- a/SharedVersion.cs +++ b/SharedVersion.cs @@ -1,4 +1,4 @@ using System.Reflection; //[assembly: AssemblyVersion("3.1.*")] -[assembly: AssemblyVersion("3.1.0")] +[assembly: AssemblyVersion("3.1.260")] From 9ca0c04ee726d4a4972e871865f2c272035d8660 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Wed, 21 Dec 2016 15:24:55 -0500 Subject: [PATCH 04/55] 3.1.1 --- SharedVersion.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SharedVersion.cs b/SharedVersion.cs index aa4bd7a34..d5d62302e 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.1")] From a8381586237a3294476c55b3af63cb7c162adfea Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Thu, 22 Dec 2016 18:56:52 -0500 Subject: [PATCH 05/55] 3.1.261 --- SharedVersion.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SharedVersion.cs b/SharedVersion.cs index aa4bd7a34..c619609e6 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 b8e285035c9b68128eb283c81877fde2984ed4b6 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Mon, 26 Dec 2016 12:48:22 -0500 Subject: [PATCH 06/55] 3.1.262 --- SharedVersion.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SharedVersion.cs b/SharedVersion.cs index c619609e6..2e699335f 100644 --- a/SharedVersion.cs +++ b/SharedVersion.cs @@ -1,4 +1,4 @@ using System.Reflection; //[assembly: AssemblyVersion("3.1.*")] -[assembly: AssemblyVersion("3.1.261")] +[assembly: AssemblyVersion("3.1.262")] From 422b80678dfa291795458a121eb9ec83e42e0d0b Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Tue, 27 Dec 2016 13:23:51 -0500 Subject: [PATCH 07/55] 3.1.263 --- SharedVersion.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SharedVersion.cs b/SharedVersion.cs index 2e699335f..9ebc5358f 100644 --- a/SharedVersion.cs +++ b/SharedVersion.cs @@ -1,4 +1,4 @@ using System.Reflection; //[assembly: AssemblyVersion("3.1.*")] -[assembly: AssemblyVersion("3.1.262")] +[assembly: AssemblyVersion("3.1.263")] From 9b20d28f5029a0da5b7e51d1eab5967b5610fb1e Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Wed, 28 Dec 2016 13:34:03 -0500 Subject: [PATCH 08/55] 3.1.264 --- SharedVersion.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SharedVersion.cs b/SharedVersion.cs index 9ebc5358f..9b359c2c4 100644 --- a/SharedVersion.cs +++ b/SharedVersion.cs @@ -1,4 +1,4 @@ using System.Reflection; //[assembly: AssemblyVersion("3.1.*")] -[assembly: AssemblyVersion("3.1.263")] +[assembly: AssemblyVersion("3.1.264")] From 64525f9f45b8c9e4b1bfe9275f427081aae604d5 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Wed, 28 Dec 2016 14:56:58 -0500 Subject: [PATCH 09/55] 3.1.265 --- SharedVersion.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SharedVersion.cs b/SharedVersion.cs index 9b359c2c4..c082f5664 100644 --- a/SharedVersion.cs +++ b/SharedVersion.cs @@ -1,4 +1,4 @@ using System.Reflection; //[assembly: AssemblyVersion("3.1.*")] -[assembly: AssemblyVersion("3.1.264")] +[assembly: AssemblyVersion("3.1.265")] From e47ccdce4247b93faa6d27849b255aac83324c42 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Wed, 28 Dec 2016 16:13:01 -0500 Subject: [PATCH 10/55] fix merge conflict --- SharedVersion.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SharedVersion.cs b/SharedVersion.cs index d5d62302e..c082f5664 100644 --- a/SharedVersion.cs +++ b/SharedVersion.cs @@ -1,4 +1,4 @@ using System.Reflection; //[assembly: AssemblyVersion("3.1.*")] -[assembly: AssemblyVersion("3.1.1")] +[assembly: AssemblyVersion("3.1.265")] From 60c71f0d571661d9cc33e1792ea3ff6788b71427 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Wed, 28 Dec 2016 16:13:43 -0500 Subject: [PATCH 11/55] 3.1.2 --- SharedVersion.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SharedVersion.cs b/SharedVersion.cs index c082f5664..81cccbf50 100644 --- a/SharedVersion.cs +++ b/SharedVersion.cs @@ -1,4 +1,4 @@ using System.Reflection; //[assembly: AssemblyVersion("3.1.*")] -[assembly: AssemblyVersion("3.1.265")] +[assembly: AssemblyVersion("3.1.2")] From 4f053a2b08e08c07332746cb0227751c7760f031 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Fri, 30 Dec 2016 00:57:36 -0500 Subject: [PATCH 12/55] 3.1.266 --- SharedVersion.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SharedVersion.cs b/SharedVersion.cs index c082f5664..ab415b169 100644 --- a/SharedVersion.cs +++ b/SharedVersion.cs @@ -1,4 +1,4 @@ using System.Reflection; //[assembly: AssemblyVersion("3.1.*")] -[assembly: AssemblyVersion("3.1.265")] +[assembly: AssemblyVersion("3.1.266")] From 5ff78b5130d0b2712494f4830a9d4f025b09ede3 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Thu, 5 Jan 2017 15:25:55 -0500 Subject: [PATCH 13/55] 3.1.267 --- SharedVersion.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SharedVersion.cs b/SharedVersion.cs index ab415b169..3a0ec44ca 100644 --- a/SharedVersion.cs +++ b/SharedVersion.cs @@ -1,4 +1,4 @@ using System.Reflection; //[assembly: AssemblyVersion("3.1.*")] -[assembly: AssemblyVersion("3.1.266")] +[assembly: AssemblyVersion("3.1.267")] From f1fb2128ac5a0cab67b3384d1eabecf54a8e71bd Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Thu, 5 Jan 2017 23:38:49 -0500 Subject: [PATCH 14/55] 3.1.268 --- SharedVersion.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SharedVersion.cs b/SharedVersion.cs index 3a0ec44ca..b05568e0c 100644 --- a/SharedVersion.cs +++ b/SharedVersion.cs @@ -1,4 +1,4 @@ using System.Reflection; //[assembly: AssemblyVersion("3.1.*")] -[assembly: AssemblyVersion("3.1.267")] +[assembly: AssemblyVersion("3.1.268")] From 16c08af1783baa7ee29833e7e4f50c3e2108f359 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Fri, 6 Jan 2017 15:10:08 -0500 Subject: [PATCH 15/55] 3.1.269 --- SharedVersion.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SharedVersion.cs b/SharedVersion.cs index b05568e0c..e94a9f516 100644 --- a/SharedVersion.cs +++ b/SharedVersion.cs @@ -1,4 +1,4 @@ using System.Reflection; //[assembly: AssemblyVersion("3.1.*")] -[assembly: AssemblyVersion("3.1.268")] +[assembly: AssemblyVersion("3.1.269")] From d9dda3b56e4269e074379dee134130feab76ad04 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Sun, 8 Jan 2017 00:53:49 -0500 Subject: [PATCH 16/55] 3.1.270 --- SharedVersion.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SharedVersion.cs b/SharedVersion.cs index e94a9f516..83321847e 100644 --- a/SharedVersion.cs +++ b/SharedVersion.cs @@ -1,4 +1,4 @@ using System.Reflection; //[assembly: AssemblyVersion("3.1.*")] -[assembly: AssemblyVersion("3.1.269")] +[assembly: AssemblyVersion("3.1.270")] From cce6484b6c52b37609d09fb5112ff04b166fab72 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Mon, 9 Jan 2017 15:28:39 -0500 Subject: [PATCH 17/55] 3.1.271 --- SharedVersion.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SharedVersion.cs b/SharedVersion.cs index 83321847e..0fb476d24 100644 --- a/SharedVersion.cs +++ b/SharedVersion.cs @@ -1,4 +1,4 @@ using System.Reflection; //[assembly: AssemblyVersion("3.1.*")] -[assembly: AssemblyVersion("3.1.270")] +[assembly: AssemblyVersion("3.1.271")] From f367cd19dcc1d4320a0dc9abcfb5eaf2c390872d Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Wed, 11 Jan 2017 12:59:33 -0500 Subject: [PATCH 18/55] 3.1.272 --- SharedVersion.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SharedVersion.cs b/SharedVersion.cs index 0fb476d24..441232c08 100644 --- a/SharedVersion.cs +++ b/SharedVersion.cs @@ -1,4 +1,4 @@ using System.Reflection; //[assembly: AssemblyVersion("3.1.*")] -[assembly: AssemblyVersion("3.1.271")] +[assembly: AssemblyVersion("3.1.272")] From 483d6044488ea5806e4c98636c56c123614183ed Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Fri, 13 Jan 2017 02:32:17 -0500 Subject: [PATCH 19/55] 3.1.273 --- SharedVersion.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SharedVersion.cs b/SharedVersion.cs index 441232c08..26424d3da 100644 --- a/SharedVersion.cs +++ b/SharedVersion.cs @@ -1,4 +1,4 @@ using System.Reflection; //[assembly: AssemblyVersion("3.1.*")] -[assembly: AssemblyVersion("3.1.272")] +[assembly: AssemblyVersion("3.1.273")] From abeb40500ca17475fe5f261c8f7c10a0ba7d207b Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Sat, 14 Jan 2017 15:06:31 -0500 Subject: [PATCH 20/55] 3.1.274 --- SharedVersion.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SharedVersion.cs b/SharedVersion.cs index 26424d3da..67be3fc31 100644 --- a/SharedVersion.cs +++ b/SharedVersion.cs @@ -1,4 +1,4 @@ using System.Reflection; //[assembly: AssemblyVersion("3.1.*")] -[assembly: AssemblyVersion("3.1.273")] +[assembly: AssemblyVersion("3.1.274")] From cdcf9b5a2d86fc077842329d6bd734b3fd5cfd48 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Mon, 16 Jan 2017 03:09:50 -0500 Subject: [PATCH 21/55] 3.1.275 --- SharedVersion.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SharedVersion.cs b/SharedVersion.cs index 67be3fc31..153a9362e 100644 --- a/SharedVersion.cs +++ b/SharedVersion.cs @@ -1,4 +1,4 @@ using System.Reflection; //[assembly: AssemblyVersion("3.1.*")] -[assembly: AssemblyVersion("3.1.274")] +[assembly: AssemblyVersion("3.1.275")] From 06a5d7ccb32a12b0fcbf1f44a1045eb55e47ba42 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Tue, 17 Jan 2017 16:11:39 -0500 Subject: [PATCH 22/55] 3.1.276 --- SharedVersion.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SharedVersion.cs b/SharedVersion.cs index 153a9362e..45a57d00f 100644 --- a/SharedVersion.cs +++ b/SharedVersion.cs @@ -1,4 +1,4 @@ using System.Reflection; //[assembly: AssemblyVersion("3.1.*")] -[assembly: AssemblyVersion("3.1.275")] +[assembly: AssemblyVersion("3.1.276")] From eb2f8c45104f92dc8946faf746fc107bcf27b8c0 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Wed, 18 Jan 2017 11:35:30 -0500 Subject: [PATCH 23/55] 3.1.277 --- SharedVersion.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SharedVersion.cs b/SharedVersion.cs index 45a57d00f..6239e506c 100644 --- a/SharedVersion.cs +++ b/SharedVersion.cs @@ -1,4 +1,4 @@ using System.Reflection; //[assembly: AssemblyVersion("3.1.*")] -[assembly: AssemblyVersion("3.1.276")] +[assembly: AssemblyVersion("3.1.277")] From 4f5151023aabb7f2f303daadb3cbd023cedb7302 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Thu, 19 Jan 2017 13:51:52 -0500 Subject: [PATCH 24/55] 3.1.278 --- SharedVersion.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SharedVersion.cs b/SharedVersion.cs index 6239e506c..e6cea5c68 100644 --- a/SharedVersion.cs +++ b/SharedVersion.cs @@ -1,4 +1,4 @@ using System.Reflection; //[assembly: AssemblyVersion("3.1.*")] -[assembly: AssemblyVersion("3.1.277")] +[assembly: AssemblyVersion("3.1.278")] From 5dc625663d6cd1c13a1c597926dfd0d2a2613e86 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Fri, 20 Jan 2017 13:49:03 -0500 Subject: [PATCH 25/55] 3.1.279 --- SharedVersion.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SharedVersion.cs b/SharedVersion.cs index e6cea5c68..1049f49e4 100644 --- a/SharedVersion.cs +++ b/SharedVersion.cs @@ -1,4 +1,4 @@ using System.Reflection; //[assembly: AssemblyVersion("3.1.*")] -[assembly: AssemblyVersion("3.1.278")] +[assembly: AssemblyVersion("3.1.279")] From 9c6397a295ece8ecfd5ef9b4da62d54d22ddae3f Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Sat, 21 Jan 2017 18:40:05 -0500 Subject: [PATCH 26/55] 3.1.280 --- SharedVersion.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SharedVersion.cs b/SharedVersion.cs index 1049f49e4..aa74b76e7 100644 --- a/SharedVersion.cs +++ b/SharedVersion.cs @@ -1,4 +1,4 @@ using System.Reflection; //[assembly: AssemblyVersion("3.1.*")] -[assembly: AssemblyVersion("3.1.279")] +[assembly: AssemblyVersion("3.1.280")] From 7abbdfb7680bb0d81c5a334df2284122cac48891 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Mon, 23 Jan 2017 14:07:21 -0500 Subject: [PATCH 27/55] 3.1.281 --- SharedVersion.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SharedVersion.cs b/SharedVersion.cs index aa74b76e7..4241c0e91 100644 --- a/SharedVersion.cs +++ b/SharedVersion.cs @@ -1,4 +1,4 @@ using System.Reflection; //[assembly: AssemblyVersion("3.1.*")] -[assembly: AssemblyVersion("3.1.280")] +[assembly: AssemblyVersion("3.1.281")] From 2c447985f436a29925f3a1ce849c639532958ecf Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Tue, 24 Jan 2017 01:14:48 -0500 Subject: [PATCH 28/55] 3.1.282 --- SharedVersion.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SharedVersion.cs b/SharedVersion.cs index 4241c0e91..413810b15 100644 --- a/SharedVersion.cs +++ b/SharedVersion.cs @@ -1,4 +1,4 @@ using System.Reflection; //[assembly: AssemblyVersion("3.1.*")] -[assembly: AssemblyVersion("3.1.281")] +[assembly: AssemblyVersion("3.1.282")] From 0173aad9c82cf4503a99d52bf5ca2f38c4d867a9 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Tue, 24 Jan 2017 16:22:44 -0500 Subject: [PATCH 29/55] 3.1.283 --- SharedVersion.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SharedVersion.cs b/SharedVersion.cs index 413810b15..3cbb799f8 100644 --- a/SharedVersion.cs +++ b/SharedVersion.cs @@ -1,4 +1,4 @@ using System.Reflection; //[assembly: AssemblyVersion("3.1.*")] -[assembly: AssemblyVersion("3.1.282")] +[assembly: AssemblyVersion("3.1.283")] From 9a3aa83ce3e7304690a712cd780b60d498338fa7 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Wed, 25 Jan 2017 03:42:38 -0500 Subject: [PATCH 30/55] 3.1.284 --- SharedVersion.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SharedVersion.cs b/SharedVersion.cs index 3cbb799f8..93fb19e10 100644 --- a/SharedVersion.cs +++ b/SharedVersion.cs @@ -1,4 +1,4 @@ using System.Reflection; //[assembly: AssemblyVersion("3.1.*")] -[assembly: AssemblyVersion("3.1.283")] +[assembly: AssemblyVersion("3.1.284")] From 15d4de2feefb004c56a72ea2ded6bdd4e8ad5303 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Wed, 25 Jan 2017 15:27:24 -0500 Subject: [PATCH 31/55] 3.1.285 --- SharedVersion.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SharedVersion.cs b/SharedVersion.cs index 93fb19e10..4b846e608 100644 --- a/SharedVersion.cs +++ b/SharedVersion.cs @@ -1,4 +1,4 @@ using System.Reflection; //[assembly: AssemblyVersion("3.1.*")] -[assembly: AssemblyVersion("3.1.284")] +[assembly: AssemblyVersion("3.1.285")] From 8cf5544dacdb0fb506bd186e2a02935758923b71 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Thu, 26 Jan 2017 13:52:11 -0500 Subject: [PATCH 32/55] 3.1.286 --- SharedVersion.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SharedVersion.cs b/SharedVersion.cs index 4b846e608..a84946b89 100644 --- a/SharedVersion.cs +++ b/SharedVersion.cs @@ -1,4 +1,4 @@ using System.Reflection; //[assembly: AssemblyVersion("3.1.*")] -[assembly: AssemblyVersion("3.1.285")] +[assembly: AssemblyVersion("3.1.286")] From 0d0e4ad695f3657d7ca3eef1ed54fe8608a490a1 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Thu, 26 Jan 2017 15:40:00 -0500 Subject: [PATCH 33/55] fix merge conflict --- SharedVersion.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SharedVersion.cs b/SharedVersion.cs index 81cccbf50..a84946b89 100644 --- a/SharedVersion.cs +++ b/SharedVersion.cs @@ -1,4 +1,4 @@ using System.Reflection; //[assembly: AssemblyVersion("3.1.*")] -[assembly: AssemblyVersion("3.1.2")] +[assembly: AssemblyVersion("3.1.286")] From 85fd32cc81cdf2d4d5752a0f8b85d2501c2028d7 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Thu, 26 Jan 2017 15:41:03 -0500 Subject: [PATCH 34/55] 3.1.3 --- SharedVersion.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SharedVersion.cs b/SharedVersion.cs index a84946b89..95e75e8d2 100644 --- a/SharedVersion.cs +++ b/SharedVersion.cs @@ -1,4 +1,4 @@ using System.Reflection; //[assembly: AssemblyVersion("3.1.*")] -[assembly: AssemblyVersion("3.1.286")] +[assembly: AssemblyVersion("3.1.3")] From c14d8b0bbc85f72191d71a12db25e731e09011b5 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Thu, 26 Jan 2017 22:58:53 -0500 Subject: [PATCH 35/55] remove specification of input decoders (for now) --- .../Playback/BaseStreamingService.cs | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/MediaBrowser.Api/Playback/BaseStreamingService.cs b/MediaBrowser.Api/Playback/BaseStreamingService.cs index 33f687ce7..120c00a14 100644 --- a/MediaBrowser.Api/Playback/BaseStreamingService.cs +++ b/MediaBrowser.Api/Playback/BaseStreamingService.cs @@ -2737,16 +2737,18 @@ namespace MediaBrowser.Api.Playback private string GetDecoderFromCodec(string codec) { - if (string.Equals(codec, "mp2", StringComparison.OrdinalIgnoreCase)) - { - return null; - } - if (string.Equals(codec, "aac_latm", StringComparison.OrdinalIgnoreCase)) - { - return null; - } + return null; - return codec; + //if (string.Equals(codec, "mp2", StringComparison.OrdinalIgnoreCase)) + //{ + // return null; + //} + //if (string.Equals(codec, "aac_latm", StringComparison.OrdinalIgnoreCase)) + //{ + // return null; + //} + + //return codec; } /// From fb892d8b927417a05ddb9e0fd7825e02af045e1b Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Thu, 26 Jan 2017 23:02:16 -0500 Subject: [PATCH 36/55] 3.1.4 --- SharedVersion.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SharedVersion.cs b/SharedVersion.cs index 95e75e8d2..331fd710f 100644 --- a/SharedVersion.cs +++ b/SharedVersion.cs @@ -1,4 +1,4 @@ using System.Reflection; //[assembly: AssemblyVersion("3.1.*")] -[assembly: AssemblyVersion("3.1.3")] +[assembly: AssemblyVersion("3.1.4")] From 90420a7c23712e982c9062bf7e14f65195c2a723 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Fri, 27 Jan 2017 15:36:19 -0500 Subject: [PATCH 37/55] resolve play to regression --- Emby.Dlna/PlayTo/PlayToManager.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Emby.Dlna/PlayTo/PlayToManager.cs b/Emby.Dlna/PlayTo/PlayToManager.cs index 962a982c1..32f542e73 100644 --- a/Emby.Dlna/PlayTo/PlayToManager.cs +++ b/Emby.Dlna/PlayTo/PlayToManager.cs @@ -146,7 +146,7 @@ namespace Emby.Dlna.PlayTo } string serverAddress; - if (info.LocalIpAddress == null) + if (info.LocalIpAddress == null || info.LocalIpAddress.Equals(IpAddressInfo.Any) || info.LocalIpAddress.Equals(IpAddressInfo.IPv6Loopback)) { serverAddress = await GetServerAddress(null).ConfigureAwait(false); } From b40250045ab478f3ca29951457084d118ce1a26d Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Fri, 27 Jan 2017 15:50:31 -0500 Subject: [PATCH 38/55] 3.1.5 --- SharedVersion.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SharedVersion.cs b/SharedVersion.cs index 331fd710f..e62c8563a 100644 --- a/SharedVersion.cs +++ b/SharedVersion.cs @@ -1,4 +1,4 @@ using System.Reflection; //[assembly: AssemblyVersion("3.1.*")] -[assembly: AssemblyVersion("3.1.4")] +[assembly: AssemblyVersion("3.1.5")] From c1b366e48c2aaa5b2c18dad01d58b19d07520fe7 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Fri, 27 Jan 2017 23:24:45 -0500 Subject: [PATCH 39/55] 3.1.287 --- SharedVersion.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SharedVersion.cs b/SharedVersion.cs index a84946b89..bd3e17c24 100644 --- a/SharedVersion.cs +++ b/SharedVersion.cs @@ -1,4 +1,4 @@ using System.Reflection; //[assembly: AssemblyVersion("3.1.*")] -[assembly: AssemblyVersion("3.1.286")] +[assembly: AssemblyVersion("3.1.287")] From bf7cbb331f7012534a00a838b781835fce7d6731 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Sun, 29 Jan 2017 19:35:40 -0500 Subject: [PATCH 40/55] 3.1.288 --- SharedVersion.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SharedVersion.cs b/SharedVersion.cs index bd3e17c24..d97fda8aa 100644 --- a/SharedVersion.cs +++ b/SharedVersion.cs @@ -1,4 +1,4 @@ using System.Reflection; //[assembly: AssemblyVersion("3.1.*")] -[assembly: AssemblyVersion("3.1.287")] +[assembly: AssemblyVersion("3.1.288")] From 91d82b582fafcc5acc6a294198e8b44932ae3114 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Mon, 30 Jan 2017 16:39:32 -0500 Subject: [PATCH 41/55] 3.1.289 --- SharedVersion.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SharedVersion.cs b/SharedVersion.cs index d97fda8aa..4df15358d 100644 --- a/SharedVersion.cs +++ b/SharedVersion.cs @@ -1,4 +1,4 @@ using System.Reflection; //[assembly: AssemblyVersion("3.1.*")] -[assembly: AssemblyVersion("3.1.288")] +[assembly: AssemblyVersion("3.1.289")] From 27e51567e3ea604a257cb889ecf9983d342cf190 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Tue, 31 Jan 2017 16:31:32 -0500 Subject: [PATCH 42/55] 3.1.290 --- SharedVersion.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SharedVersion.cs b/SharedVersion.cs index 4df15358d..3b84897da 100644 --- a/SharedVersion.cs +++ b/SharedVersion.cs @@ -1,4 +1,4 @@ using System.Reflection; //[assembly: AssemblyVersion("3.1.*")] -[assembly: AssemblyVersion("3.1.289")] +[assembly: AssemblyVersion("3.1.290")] From f4a8f92d4c53f9bbea43572ee332ae91ed72fd26 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Wed, 1 Feb 2017 15:57:38 -0500 Subject: [PATCH 43/55] 3.1.291 --- SharedVersion.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SharedVersion.cs b/SharedVersion.cs index 3b84897da..8454d76dc 100644 --- a/SharedVersion.cs +++ b/SharedVersion.cs @@ -1,4 +1,4 @@ using System.Reflection; //[assembly: AssemblyVersion("3.1.*")] -[assembly: AssemblyVersion("3.1.290")] +[assembly: AssemblyVersion("3.1.291")] From 45c13c0f8f5da40f9dfd6729a627d53e2146ca60 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Thu, 2 Feb 2017 11:07:52 -0500 Subject: [PATCH 44/55] fix merge conflict --- .../Playback/BaseStreamingService.cs | 1679 +---------------- 1 file changed, 26 insertions(+), 1653 deletions(-) diff --git a/MediaBrowser.Api/Playback/BaseStreamingService.cs b/MediaBrowser.Api/Playback/BaseStreamingService.cs index f5aa954ee..d1c3de427 100644 --- a/MediaBrowser.Api/Playback/BaseStreamingService.cs +++ b/MediaBrowser.Api/Playback/BaseStreamingService.cs @@ -22,6 +22,7 @@ using System.Threading.Tasks; using MediaBrowser.Common.Net; using MediaBrowser.Controller; using MediaBrowser.Controller.Net; +using MediaBrowser.MediaEncoding.Encoder; using MediaBrowser.Model.Diagnostics; namespace MediaBrowser.Api.Playback @@ -74,6 +75,8 @@ namespace MediaBrowser.Api.Playback public static IHttpClient HttpClient; protected IAuthorizationContext AuthorizationContext { get; private set; } + protected EncodingHelper EncodingHelper { get; set; } + /// /// Initializes a new instance of the class. /// @@ -92,6 +95,7 @@ namespace MediaBrowser.Api.Playback LibraryManager = libraryManager; IsoManager = isoManager; MediaEncoder = mediaEncoder; + EncodingHelper = new EncodingHelper(MediaEncoder, serverConfig, FileSystem, SubtitleEncoder); } /// @@ -152,984 +156,11 @@ namespace MediaBrowser.Api.Playback protected readonly CultureInfo UsCulture = new CultureInfo("en-US"); - /// - /// Gets the fast seek command line parameter. - /// - /// The request. - /// System.String. - /// The fast seek command line parameter. - protected string GetFastSeekCommandLineParameter(StreamRequest request) - { - var time = request.StartTimeTicks ?? 0; - - if (time > 0) - { - return string.Format("-ss {0}", MediaEncoder.GetTimeParameter(time)); - } - - return string.Empty; - } - - /// - /// Gets the map args. - /// - /// The state. - /// System.String. - protected virtual string GetMapArgs(StreamState state) - { - // If we don't have known media info - // If input is video, use -sn to drop subtitles - // Otherwise just return empty - if (state.VideoStream == null && state.AudioStream == null) - { - return state.IsInputVideo ? "-sn" : string.Empty; - } - - // We have media info, but we don't know the stream indexes - if (state.VideoStream != null && state.VideoStream.Index == -1) - { - return "-sn"; - } - - // We have media info, but we don't know the stream indexes - if (state.AudioStream != null && state.AudioStream.Index == -1) - { - return state.IsInputVideo ? "-sn" : string.Empty; - } - - var args = string.Empty; - - if (state.VideoStream != null) - { - args += string.Format("-map 0:{0}", state.VideoStream.Index); - } - else - { - // No known video stream - args += "-vn"; - } - - if (state.AudioStream != null) - { - args += string.Format(" -map 0:{0}", state.AudioStream.Index); - } - - else - { - args += " -map -0:a"; - } - - if (state.SubtitleStream == null || state.VideoRequest.SubtitleMethod == SubtitleDeliveryMethod.Hls) - { - args += " -map -0:s"; - } - else if (state.SubtitleDeliveryMethod == SubtitleDeliveryMethod.Embed) - { - args += string.Format(" -map 0:{0}", state.SubtitleStream.Index); - } - else if (state.SubtitleStream.IsExternal && !state.SubtitleStream.IsTextSubtitleStream) - { - args += " -map 1:0 -sn"; - } - - return args; - } - - /// - /// Determines which stream will be used for playback - /// - /// All stream. - /// Index of the desired. - /// The type. - /// if set to true [return first if no index]. - /// MediaStream. - private MediaStream GetMediaStream(IEnumerable allStream, int? desiredIndex, MediaStreamType type, bool returnFirstIfNoIndex = true) - { - var streams = allStream.Where(s => s.Type == type).OrderBy(i => i.Index).ToList(); - - if (desiredIndex.HasValue) - { - var stream = streams.FirstOrDefault(s => s.Index == desiredIndex.Value); - - if (stream != null) - { - return stream; - } - } - - if (type == MediaStreamType.Video) - { - streams = streams.Where(i => !string.Equals(i.Codec, "mjpeg", StringComparison.OrdinalIgnoreCase)).ToList(); - } - - if (returnFirstIfNoIndex && type == MediaStreamType.Audio) - { - return streams.FirstOrDefault(i => i.Channels.HasValue && i.Channels.Value > 0) ?? - streams.FirstOrDefault(); - } - - // Just return the first one - return returnFirstIfNoIndex ? streams.FirstOrDefault() : null; - } - - /// - /// Gets the number of threads. - /// - /// System.Int32. - protected int GetNumberOfThreads(StreamState state, bool isWebm) - { - var threads = ApiEntryPoint.Instance.GetEncodingOptions().EncodingThreadCount; - - if (isWebm) - { - // Recommended per docs - return Math.Max(Environment.ProcessorCount - 1, 2); - } - - // Automatic - if (threads == -1) - { - return 0; - } - - return threads; - } - - protected string GetH264Encoder(StreamState state) - { - var defaultEncoder = "libx264"; - - // Only use alternative encoders for video files. - // When using concat with folder rips, if the mfx session fails to initialize, ffmpeg will be stuck retrying and will not exit gracefully - // Since transcoding of folder rips is expiremental anyway, it's not worth adding additional variables such as this. - if (state.VideoType == VideoType.VideoFile) - { - var encodingOptions = ApiEntryPoint.Instance.GetEncodingOptions(); - var hwType = encodingOptions.HardwareAccelerationType; - - if (string.Equals(hwType, "qsv", StringComparison.OrdinalIgnoreCase) || - string.Equals(hwType, "h264_qsv", StringComparison.OrdinalIgnoreCase)) - { - return GetAvailableEncoder("h264_qsv", defaultEncoder); - } - - if (string.Equals(hwType, "nvenc", StringComparison.OrdinalIgnoreCase)) - { - return GetAvailableEncoder("h264_nvenc", defaultEncoder); - } - if (string.Equals(hwType, "h264_omx", StringComparison.OrdinalIgnoreCase)) - { - return GetAvailableEncoder("h264_omx", defaultEncoder); - } - if (string.Equals(hwType, "vaapi", StringComparison.OrdinalIgnoreCase) && !string.IsNullOrWhiteSpace(encodingOptions.VaapiDevice)) - { - if (IsVaapiSupported(state)) - { - return GetAvailableEncoder("h264_vaapi", defaultEncoder); - } - } - } - - return defaultEncoder; - } - - private bool IsVaapiSupported(StreamState state) - { - var videoStream = state.VideoStream; - - if (videoStream != null) - { - // vaapi will throw an error with this input - // [vaapi @ 0x7faed8000960] No VAAPI support for codec mpeg4 profile -99. - if (string.Equals(videoStream.Codec, "mpeg4", StringComparison.OrdinalIgnoreCase)) - { - if (videoStream.Level == -99 || videoStream.Level == 15) - { - return false; - } - } - } - return true; - } - - private string GetAvailableEncoder(string preferredEncoder, string defaultEncoder) - { - if (MediaEncoder.SupportsEncoder(preferredEncoder)) - { - return preferredEncoder; - } - return defaultEncoder; - } - protected virtual string GetDefaultH264Preset() { return "superfast"; } - /// - /// Gets the video bitrate to specify on the command line - /// - /// The state. - /// The video codec. - /// System.String. - protected string GetVideoQualityParam(StreamState state, string videoEncoder) - { - var param = string.Empty; - - var isVc1 = state.VideoStream != null && - string.Equals(state.VideoStream.Codec, "vc1", StringComparison.OrdinalIgnoreCase); - - var encodingOptions = ApiEntryPoint.Instance.GetEncodingOptions(); - - if (string.Equals(videoEncoder, "libx264", StringComparison.OrdinalIgnoreCase)) - { - if (!string.IsNullOrWhiteSpace(encodingOptions.H264Preset)) - { - param += "-preset " + encodingOptions.H264Preset; - } - else - { - param += "-preset " + GetDefaultH264Preset(); - } - - if (encodingOptions.H264Crf >= 0 && encodingOptions.H264Crf <= 51) - { - param += " -crf " + encodingOptions.H264Crf.ToString(CultureInfo.InvariantCulture); - } - else - { - param += " -crf 23"; - } - } - - else if (string.Equals(videoEncoder, "libx265", StringComparison.OrdinalIgnoreCase)) - { - param += "-preset fast"; - - param += " -crf 28"; - } - - // h264 (h264_qsv) - else if (string.Equals(videoEncoder, "h264_qsv", StringComparison.OrdinalIgnoreCase)) - { - param += "-preset 7 -look_ahead 0"; - - } - - // h264 (h264_nvenc) - else if (string.Equals(videoEncoder, "h264_nvenc", StringComparison.OrdinalIgnoreCase)) - { - param += "-preset default"; - } - - // webm - else if (string.Equals(videoEncoder, "libvpx", StringComparison.OrdinalIgnoreCase)) - { - // Values 0-3, 0 being highest quality but slower - var profileScore = 0; - - string crf; - var qmin = "0"; - var qmax = "50"; - - crf = "10"; - - if (isVc1) - { - profileScore++; - } - - // Max of 2 - profileScore = Math.Min(profileScore, 2); - - // http://www.webmproject.org/docs/encoder-parameters/ - param += string.Format("-speed 16 -quality good -profile:v {0} -slices 8 -crf {1} -qmin {2} -qmax {3}", - profileScore.ToString(UsCulture), - crf, - qmin, - qmax); - } - - else if (string.Equals(videoEncoder, "mpeg4", StringComparison.OrdinalIgnoreCase)) - { - param += "-mbd rd -flags +mv4+aic -trellis 2 -cmp 2 -subcmp 2 -bf 2"; - } - - // asf/wmv - else if (string.Equals(videoEncoder, "wmv2", StringComparison.OrdinalIgnoreCase)) - { - param += "-qmin 2"; - } - - else if (string.Equals(videoEncoder, "msmpeg4", StringComparison.OrdinalIgnoreCase)) - { - param += "-mbd 2"; - } - - param += GetVideoBitrateParam(state, videoEncoder); - - var framerate = GetFramerateParam(state); - if (framerate.HasValue) - { - param += string.Format(" -r {0}", framerate.Value.ToString(UsCulture)); - } - - if (!string.IsNullOrEmpty(state.OutputVideoSync)) - { - param += " -vsync " + state.OutputVideoSync; - } - - if (!string.IsNullOrEmpty(state.VideoRequest.Profile)) - { - if (!string.Equals(videoEncoder, "h264_omx", StringComparison.OrdinalIgnoreCase) && - !string.Equals(videoEncoder, "h264_vaapi", StringComparison.OrdinalIgnoreCase)) - { - // not supported by h264_omx - param += " -profile:v " + state.VideoRequest.Profile; - } - } - - if (!string.IsNullOrEmpty(state.VideoRequest.Level)) - { - var level = NormalizeTranscodingLevel(state.OutputVideoCodec, state.VideoRequest.Level); - - // h264_qsv and h264_nvenc expect levels to be expressed as a decimal. libx264 supports decimal and non-decimal format - // also needed for libx264 due to https://trac.ffmpeg.org/ticket/3307 - if (string.Equals(videoEncoder, "h264_qsv", StringComparison.OrdinalIgnoreCase) || - string.Equals(videoEncoder, "h264_nvenc", StringComparison.OrdinalIgnoreCase) || - string.Equals(videoEncoder, "libx264", StringComparison.OrdinalIgnoreCase)) - { - switch (level) - { - case "30": - param += " -level 3.0"; - break; - case "31": - param += " -level 3.1"; - break; - case "32": - param += " -level 3.2"; - break; - case "40": - param += " -level 4.0"; - break; - case "41": - param += " -level 4.1"; - break; - case "42": - param += " -level 4.2"; - break; - case "50": - param += " -level 5.0"; - break; - case "51": - param += " -level 5.1"; - break; - case "52": - param += " -level 5.2"; - break; - default: - param += " -level " + level; - break; - } - } - else if (!string.Equals(videoEncoder, "h264_omx", StringComparison.OrdinalIgnoreCase)) - { - param += " -level " + level; - } - } - - if (string.Equals(videoEncoder, "libx264", StringComparison.OrdinalIgnoreCase)) - { - param += " -x264opts:0 subme=0:rc_lookahead=10:me_range=4:me=dia:no_chroma_me:8x8dct=0:partitions=none"; - } - - if (!string.Equals(videoEncoder, "h264_omx", StringComparison.OrdinalIgnoreCase) && - !string.Equals(videoEncoder, "h264_qsv", StringComparison.OrdinalIgnoreCase) && - !string.Equals(videoEncoder, "h264_vaapi", StringComparison.OrdinalIgnoreCase)) - { - param = "-pix_fmt yuv420p " + param; - } - - return param; - } - - private string NormalizeTranscodingLevel(string videoCodec, string level) - { - double requestLevel; - - // Clients may direct play higher than level 41, but there's no reason to transcode higher - if (double.TryParse(level, NumberStyles.Any, UsCulture, out requestLevel)) - { - if (string.Equals(videoCodec, "h264", StringComparison.OrdinalIgnoreCase)) - { - if (requestLevel > 41) - { - return "41"; - } - } - } - - return level; - } - - protected string GetAudioFilterParam(StreamState state, bool isHls) - { - var volParam = string.Empty; - var audioSampleRate = string.Empty; - - var channels = state.OutputAudioChannels; - - // Boost volume to 200% when downsampling from 6ch to 2ch - if (channels.HasValue && channels.Value <= 2) - { - if (state.AudioStream != null && state.AudioStream.Channels.HasValue && state.AudioStream.Channels.Value > 5 && !ApiEntryPoint.Instance.GetEncodingOptions().DownMixAudioBoost.Equals(1)) - { - volParam = ",volume=" + ApiEntryPoint.Instance.GetEncodingOptions().DownMixAudioBoost.ToString(UsCulture); - } - } - - if (state.OutputAudioSampleRate.HasValue) - { - audioSampleRate = state.OutputAudioSampleRate.Value + ":"; - } - - var adelay = isHls ? "adelay=1," : string.Empty; - - var pts = string.Empty; - - if (state.SubtitleStream != null && state.SubtitleStream.IsTextSubtitleStream && state.VideoRequest.SubtitleMethod == SubtitleDeliveryMethod.Encode && !state.VideoRequest.CopyTimestamps) - { - var seconds = TimeSpan.FromTicks(state.Request.StartTimeTicks ?? 0).TotalSeconds; - - pts = string.Format(",asetpts=PTS-{0}/TB", Math.Round(seconds).ToString(UsCulture)); - } - - return string.Format("-af \"{0}aresample={1}async={4}{2}{3}\"", - - adelay, - audioSampleRate, - volParam, - pts, - state.OutputAudioSync); - } - - /// - /// If we're going to put a fixed size on the command line, this will calculate it - /// - /// The state. - /// The output video codec. - /// if set to true [allow time stamp copy]. - /// System.String. - protected string GetOutputSizeParam(StreamState state, - string outputVideoCodec, - bool allowTimeStampCopy = true) - { - // http://sonnati.wordpress.com/2012/10/19/ffmpeg-the-swiss-army-knife-of-internet-streaming-part-vi/ - - var request = state.VideoRequest; - - var filters = new List(); - - if (string.Equals(outputVideoCodec, "h264_vaapi", StringComparison.OrdinalIgnoreCase)) - { - filters.Add("format=nv12|vaapi"); - filters.Add("hwupload"); - } - else if (state.DeInterlace && !string.Equals(outputVideoCodec, "h264_vaapi", StringComparison.OrdinalIgnoreCase)) - { - filters.Add("yadif=0:-1:0"); - } - - if (string.Equals(outputVideoCodec, "h264_vaapi", StringComparison.OrdinalIgnoreCase)) - { - // Work around vaapi's reduced scaling features - var scaler = "scale_vaapi"; - - // Given the input dimensions (inputWidth, inputHeight), determine the output dimensions - // (outputWidth, outputHeight). The user may request precise output dimensions or maximum - // output dimensions. Output dimensions are guaranteed to be even. - decimal inputWidth = Convert.ToDecimal(state.VideoStream.Width); - decimal inputHeight = Convert.ToDecimal(state.VideoStream.Height); - decimal outputWidth = request.Width.HasValue ? Convert.ToDecimal(request.Width.Value) : inputWidth; - decimal outputHeight = request.Height.HasValue ? Convert.ToDecimal(request.Height.Value) : inputHeight; - decimal maximumWidth = request.MaxWidth.HasValue ? Convert.ToDecimal(request.MaxWidth.Value) : outputWidth; - decimal maximumHeight = request.MaxHeight.HasValue ? Convert.ToDecimal(request.MaxHeight.Value) : outputHeight; - - if (outputWidth > maximumWidth || outputHeight > maximumHeight) - { - var scale = Math.Min(maximumWidth / outputWidth, maximumHeight / outputHeight); - outputWidth = Math.Min(maximumWidth, Math.Truncate(outputWidth * scale)); - outputHeight = Math.Min(maximumHeight, Math.Truncate(outputHeight * scale)); - } - - outputWidth = 2 * Math.Truncate(outputWidth / 2); - outputHeight = 2 * Math.Truncate(outputHeight / 2); - - if (outputWidth != inputWidth || outputHeight != inputHeight) - { - filters.Add(string.Format("{0}=w={1}:h={2}", scaler, outputWidth.ToString(UsCulture), outputHeight.ToString(UsCulture))); - } - } - else - { - // If fixed dimensions were supplied - if (request.Width.HasValue && request.Height.HasValue) - { - var widthParam = request.Width.Value.ToString(UsCulture); - var heightParam = request.Height.Value.ToString(UsCulture); - - filters.Add(string.Format("scale=trunc({0}/2)*2:trunc({1}/2)*2", widthParam, heightParam)); - } - - // If Max dimensions were supplied, for width selects lowest even number between input width and width req size and selects lowest even number from in width*display aspect and requested size - else if (request.MaxWidth.HasValue && request.MaxHeight.HasValue) - { - var maxWidthParam = request.MaxWidth.Value.ToString(UsCulture); - var maxHeightParam = request.MaxHeight.Value.ToString(UsCulture); - - filters.Add(string.Format("scale=trunc(min(max(iw\\,ih*dar)\\,min({0}\\,{1}*dar))/2)*2:trunc(min(max(iw/dar\\,ih)\\,min({0}/dar\\,{1}))/2)*2", maxWidthParam, maxHeightParam)); - } - - // If a fixed width was requested - else if (request.Width.HasValue) - { - var widthParam = request.Width.Value.ToString(UsCulture); - - filters.Add(string.Format("scale={0}:trunc(ow/a/2)*2", widthParam)); - } - - // If a fixed height was requested - else if (request.Height.HasValue) - { - var heightParam = request.Height.Value.ToString(UsCulture); - - filters.Add(string.Format("scale=trunc(oh*a/2)*2:{0}", heightParam)); - } - - // If a max width was requested - else if (request.MaxWidth.HasValue) - { - var maxWidthParam = request.MaxWidth.Value.ToString(UsCulture); - - filters.Add(string.Format("scale=trunc(min(max(iw\\,ih*dar)\\,{0})/2)*2:trunc(ow/dar/2)*2", maxWidthParam)); - } - - // If a max height was requested - else if (request.MaxHeight.HasValue) - { - var maxHeightParam = request.MaxHeight.Value.ToString(UsCulture); - - filters.Add(string.Format("scale=trunc(oh*a/2)*2:min(max(iw/dar\\,ih)\\,{0})", maxHeightParam)); - } - } - - var output = string.Empty; - - if (state.SubtitleStream != null && state.SubtitleStream.IsTextSubtitleStream && state.VideoRequest.SubtitleMethod == SubtitleDeliveryMethod.Encode) - { - var subParam = GetTextSubtitleParam(state); - - filters.Add(subParam); - - if (allowTimeStampCopy) - { - output += " -copyts"; - } - } - - if (filters.Count > 0) - { - output += string.Format(" -vf \"{0}\"", string.Join(",", filters.ToArray())); - } - - return output; - } - - /// - /// Gets the text subtitle param. - /// - /// The state. - /// System.String. - protected string GetTextSubtitleParam(StreamState state) - { - var seconds = Math.Round(TimeSpan.FromTicks(state.Request.StartTimeTicks ?? 0).TotalSeconds); - - var setPtsParam = state.VideoRequest.CopyTimestamps - ? string.Empty - : string.Format(",setpts=PTS -{0}/TB", seconds.ToString(UsCulture)); - - if (state.SubtitleStream.IsExternal) - { - var subtitlePath = state.SubtitleStream.Path; - - var charsetParam = string.Empty; - - if (!string.IsNullOrEmpty(state.SubtitleStream.Language)) - { - var charenc = SubtitleEncoder.GetSubtitleFileCharacterSet(subtitlePath, state.SubtitleStream.Language, state.MediaSource.Protocol, CancellationToken.None).Result; - - if (!string.IsNullOrEmpty(charenc)) - { - charsetParam = ":charenc=" + charenc; - } - } - - // TODO: Perhaps also use original_size=1920x800 ?? - return string.Format("subtitles=filename='{0}'{1}{2}", - MediaEncoder.EscapeSubtitleFilterPath(subtitlePath), - charsetParam, - setPtsParam); - } - - var mediaPath = state.MediaPath ?? string.Empty; - - return string.Format("subtitles='{0}:si={1}'{2}", - MediaEncoder.EscapeSubtitleFilterPath(mediaPath), - state.InternalSubtitleStreamOffset.ToString(UsCulture), - setPtsParam); - } - - /// - /// Gets the internal graphical subtitle param. - /// - /// The state. - /// The output video codec. - /// System.String. - protected string GetGraphicalSubtitleParam(StreamState state, string outputVideoCodec) - { - var outputSizeParam = string.Empty; - - var request = state.VideoRequest; - - // Add resolution params, if specified - if (request.Width.HasValue || request.Height.HasValue || request.MaxHeight.HasValue || request.MaxWidth.HasValue) - { - outputSizeParam = GetOutputSizeParam(state, outputVideoCodec).TrimEnd('"'); - - if (string.Equals(outputVideoCodec, "h264_vaapi", StringComparison.OrdinalIgnoreCase)) - { - outputSizeParam = "," + outputSizeParam.Substring(outputSizeParam.IndexOf("format", StringComparison.OrdinalIgnoreCase)); - } - else - { - outputSizeParam = "," + outputSizeParam.Substring(outputSizeParam.IndexOf("scale", StringComparison.OrdinalIgnoreCase)); - } - } - - if (string.Equals(outputVideoCodec, "h264_vaapi", StringComparison.OrdinalIgnoreCase) && outputSizeParam.Length == 0) - { - outputSizeParam = ",format=nv12|vaapi,hwupload"; - } - - var videoSizeParam = string.Empty; - - if (state.VideoStream != null && state.VideoStream.Width.HasValue && state.VideoStream.Height.HasValue) - { - videoSizeParam = string.Format("scale={0}:{1}", state.VideoStream.Width.Value.ToString(UsCulture), state.VideoStream.Height.Value.ToString(UsCulture)); - } - - var mapPrefix = state.SubtitleStream.IsExternal ? - 1 : - 0; - - var subtitleStreamIndex = state.SubtitleStream.IsExternal - ? 0 - : state.SubtitleStream.Index; - - return string.Format(" -filter_complex \"[{0}:{1}]{4}[sub] ; [0:{2}] [sub] overlay{3}\"", - mapPrefix.ToString(UsCulture), - subtitleStreamIndex.ToString(UsCulture), - state.VideoStream.Index.ToString(UsCulture), - outputSizeParam, - videoSizeParam); - } - - /// - /// Gets the probe size argument. - /// - /// The state. - /// System.String. - private string GetProbeSizeArgument(StreamState state) - { - if (state.PlayableStreamFileNames.Count > 0) - { - return MediaEncoder.GetProbeSizeAndAnalyzeDurationArgument(state.PlayableStreamFileNames.ToArray(), state.InputProtocol); - } - - return MediaEncoder.GetProbeSizeAndAnalyzeDurationArgument(new[] { state.MediaPath }, state.InputProtocol); - } - - /// - /// Gets the number of audio channels to specify on the command line - /// - /// The request. - /// The audio stream. - /// The output audio codec. - /// System.Nullable{System.Int32}. - private int? GetNumAudioChannelsParam(StreamRequest request, MediaStream audioStream, string outputAudioCodec) - { - var inputChannels = audioStream == null - ? null - : audioStream.Channels; - - if (inputChannels <= 0) - { - inputChannels = null; - } - - int? transcoderChannelLimit = null; - var codec = outputAudioCodec ?? string.Empty; - - if (codec.IndexOf("wma", StringComparison.OrdinalIgnoreCase) != -1) - { - // wmav2 currently only supports two channel output - transcoderChannelLimit = 2; - } - - else if (codec.IndexOf("mp3", StringComparison.OrdinalIgnoreCase) != -1) - { - // libmp3lame currently only supports two channel output - transcoderChannelLimit = 2; - } - else - { - // If we don't have any media info then limit it to 6 to prevent encoding errors due to asking for too many channels - transcoderChannelLimit = 6; - } - - var isTranscodingAudio = !string.Equals(codec, "copy", StringComparison.OrdinalIgnoreCase); - - int? resultChannels = null; - if (isTranscodingAudio) - { - resultChannels = request.TranscodingMaxAudioChannels; - } - resultChannels = resultChannels ?? request.MaxAudioChannels ?? request.AudioChannels; - - if (inputChannels.HasValue) - { - resultChannels = resultChannels.HasValue - ? Math.Min(resultChannels.Value, inputChannels.Value) - : inputChannels.Value; - } - - if (isTranscodingAudio && transcoderChannelLimit.HasValue) - { - resultChannels = resultChannels.HasValue - ? Math.Min(resultChannels.Value, transcoderChannelLimit.Value) - : transcoderChannelLimit.Value; - } - - return resultChannels ?? request.AudioChannels; - } - - /// - /// Determines whether the specified stream is H264. - /// - /// The stream. - /// true if the specified stream is H264; otherwise, false. - protected bool IsH264(MediaStream stream) - { - var codec = stream.Codec ?? string.Empty; - - return codec.IndexOf("264", StringComparison.OrdinalIgnoreCase) != -1 || - codec.IndexOf("avc", StringComparison.OrdinalIgnoreCase) != -1; - } - - /// - /// Gets the audio encoder. - /// - /// The state. - /// System.String. - protected string GetAudioEncoder(StreamState state) - { - var codec = state.OutputAudioCodec; - - if (string.Equals(codec, "aac", StringComparison.OrdinalIgnoreCase)) - { - return "aac -strict experimental"; - } - if (string.Equals(codec, "mp3", StringComparison.OrdinalIgnoreCase)) - { - return "libmp3lame"; - } - if (string.Equals(codec, "vorbis", StringComparison.OrdinalIgnoreCase)) - { - return "libvorbis"; - } - if (string.Equals(codec, "wma", StringComparison.OrdinalIgnoreCase)) - { - return "wmav2"; - } - - return codec.ToLower(); - } - - /// - /// Gets the name of the output video codec - /// - /// The state. - /// System.String. - protected string GetVideoEncoder(StreamState state) - { - var codec = state.OutputVideoCodec; - - if (!string.IsNullOrEmpty(codec)) - { - if (string.Equals(codec, "h264", StringComparison.OrdinalIgnoreCase)) - { - return GetH264Encoder(state); - } - if (string.Equals(codec, "vpx", StringComparison.OrdinalIgnoreCase)) - { - return "libvpx"; - } - if (string.Equals(codec, "wmv", StringComparison.OrdinalIgnoreCase)) - { - return "wmv2"; - } - if (string.Equals(codec, "theora", StringComparison.OrdinalIgnoreCase)) - { - return "libtheora"; - } - - return codec.ToLower(); - } - - return "copy"; - } - - /// - /// Gets the name of the output video codec - /// - /// The state. - /// System.String. - protected string GetVideoDecoder(StreamState state) - { - if (string.Equals(state.OutputVideoCodec, "copy", StringComparison.OrdinalIgnoreCase)) - { - return null; - } - - // Only use alternative encoders for video files. - // When using concat with folder rips, if the mfx session fails to initialize, ffmpeg will be stuck retrying and will not exit gracefully - // Since transcoding of folder rips is expiremental anyway, it's not worth adding additional variables such as this. - if (state.VideoType != VideoType.VideoFile) - { - return null; - } - - if (state.VideoStream != null && !string.IsNullOrWhiteSpace(state.VideoStream.Codec)) - { - if (string.Equals(ApiEntryPoint.Instance.GetEncodingOptions().HardwareAccelerationType, "qsv", StringComparison.OrdinalIgnoreCase)) - { - switch (state.MediaSource.VideoStream.Codec.ToLower()) - { - case "avc": - case "h264": - if (MediaEncoder.SupportsDecoder("h264_qsv")) - { - // Seeing stalls and failures with decoding. Not worth it compared to encoding. - return "-c:v h264_qsv "; - } - break; - case "mpeg2video": - if (MediaEncoder.SupportsDecoder("mpeg2_qsv")) - { - return "-c:v mpeg2_qsv "; - } - break; - case "vc1": - if (MediaEncoder.SupportsDecoder("vc1_qsv")) - { - return "-c:v vc1_qsv "; - } - break; - } - } - } - - // leave blank so ffmpeg will decide - return null; - } - - /// - /// Gets the input argument. - /// - /// The state. - /// System.String. - protected string GetInputArgument(StreamState state) - { - var arg = string.Format("-i {0}", GetInputPathArgument(state)); - - if (state.SubtitleStream != null && state.VideoRequest.SubtitleMethod == SubtitleDeliveryMethod.Encode) - { - if (state.SubtitleStream.IsExternal && !state.SubtitleStream.IsTextSubtitleStream) - { - if (state.VideoStream != null && state.VideoStream.Width.HasValue) - { - // This is hacky but not sure how to get the exact subtitle resolution - double height = state.VideoStream.Width.Value; - height /= 16; - height *= 9; - - arg += string.Format(" -canvas_size {0}:{1}", state.VideoStream.Width.Value.ToString(CultureInfo.InvariantCulture), Convert.ToInt32(height).ToString(CultureInfo.InvariantCulture)); - } - - var subtitlePath = state.SubtitleStream.Path; - - if (string.Equals(Path.GetExtension(subtitlePath), ".sub", StringComparison.OrdinalIgnoreCase)) - { - var idxFile = Path.ChangeExtension(subtitlePath, ".idx"); - if (FileSystem.FileExists(idxFile)) - { - subtitlePath = idxFile; - } - } - - arg += " -i \"" + subtitlePath + "\""; - } - } - - if (state.VideoRequest != null) - { - var encodingOptions = ApiEntryPoint.Instance.GetEncodingOptions(); - if (GetVideoEncoder(state).IndexOf("vaapi", StringComparison.OrdinalIgnoreCase) != -1) - { - var hasGraphicalSubs = state.SubtitleStream != null && !state.SubtitleStream.IsTextSubtitleStream && state.VideoRequest.SubtitleMethod == SubtitleDeliveryMethod.Encode; - var hwOutputFormat = "vaapi"; - - if (hasGraphicalSubs) - { - hwOutputFormat = "yuv420p"; - } - - arg = "-hwaccel vaapi -hwaccel_output_format " + hwOutputFormat + " -vaapi_device " + encodingOptions.VaapiDevice + " " + arg; - } - } - - return arg.Trim(); - } - - private string GetInputPathArgument(StreamState state) - { - var protocol = state.InputProtocol; - var mediaPath = state.MediaPath ?? string.Empty; - - var inputPath = new[] { mediaPath }; - - if (state.IsInputVideo) - { - if (!(state.VideoType == VideoType.Iso && state.IsoMount == null)) - { - inputPath = MediaEncoderHelpers.GetInputArgument(FileSystem, mediaPath, state.InputProtocol, state.IsoMount, state.PlayableStreamFileNames); - } - } - - return MediaEncoder.GetInputArgument(inputPath, protocol); - } - private async Task AcquireResources(StreamState state, CancellationTokenSource cancellationTokenSource) { if (state.VideoType == VideoType.Iso && state.IsoType.HasValue && IsoManager.CanMount(state.MediaPath)) @@ -1145,11 +176,11 @@ namespace MediaBrowser.Api.Playback }, false, cancellationTokenSource.Token).ConfigureAwait(false); - AttachMediaSourceInfo(state, liveStreamResponse.MediaSource, state.VideoRequest, state.RequestedUrl); + EncodingHelper.AttachMediaSourceInfo(state, liveStreamResponse.MediaSource, state.RequestedUrl); if (state.VideoRequest != null) { - TryStreamCopy(state, state.VideoRequest); + EncodingHelper.TryStreamCopy(state); } } @@ -1304,14 +335,14 @@ namespace MediaBrowser.Api.Playback private bool EnableThrottling(StreamState state) { return false; - // do not use throttling with hardware encoders - return state.InputProtocol == MediaProtocol.File && - state.RunTimeTicks.HasValue && - state.RunTimeTicks.Value >= TimeSpan.FromMinutes(5).Ticks && - state.IsInputVideo && - state.VideoType == VideoType.VideoFile && - !string.Equals(state.OutputVideoCodec, "copy", StringComparison.OrdinalIgnoreCase) && - string.Equals(GetVideoEncoder(state), "libx264", StringComparison.OrdinalIgnoreCase); + //// do not use throttling with hardware encoders + //return state.InputProtocol == MediaProtocol.File && + // state.RunTimeTicks.HasValue && + // state.RunTimeTicks.Value >= TimeSpan.FromMinutes(5).Ticks && + // state.IsInputVideo && + // state.VideoType == VideoType.VideoFile && + // !string.Equals(state.OutputVideoCodec, "copy", StringComparison.OrdinalIgnoreCase) && + // string.Equals(GetVideoEncoder(state), "libx264", StringComparison.OrdinalIgnoreCase); } private async Task StartStreamingLog(TranscodingJob transcodingJob, StreamState state, Stream source, Stream target) @@ -1442,115 +473,6 @@ namespace MediaBrowser.Api.Playback } } - private int? GetVideoBitrateParamValue(VideoStreamRequest request, MediaStream videoStream, string outputVideoCodec) - { - var bitrate = request.VideoBitRate; - - if (videoStream != null) - { - var isUpscaling = request.Height.HasValue && videoStream.Height.HasValue && - request.Height.Value > videoStream.Height.Value; - - if (request.Width.HasValue && videoStream.Width.HasValue && - request.Width.Value > videoStream.Width.Value) - { - isUpscaling = true; - } - - // Don't allow bitrate increases unless upscaling - if (!isUpscaling) - { - if (bitrate.HasValue && videoStream.BitRate.HasValue) - { - bitrate = Math.Min(bitrate.Value, videoStream.BitRate.Value); - } - } - } - - if (bitrate.HasValue) - { - var inputVideoCodec = videoStream == null ? null : videoStream.Codec; - bitrate = ResolutionNormalizer.ScaleBitrate(bitrate.Value, inputVideoCodec, outputVideoCodec); - - // If a max bitrate was requested, don't let the scaled bitrate exceed it - if (request.VideoBitRate.HasValue) - { - bitrate = Math.Min(bitrate.Value, request.VideoBitRate.Value); - } - } - - return bitrate; - } - - protected string GetVideoBitrateParam(StreamState state, string videoCodec) - { - var bitrate = state.OutputVideoBitrate; - - if (bitrate.HasValue) - { - if (string.Equals(videoCodec, "libvpx", StringComparison.OrdinalIgnoreCase)) - { - // With vpx when crf is used, b:v becomes a max rate - // https://trac.ffmpeg.org/wiki/vpxEncodingGuide. But higher bitrate source files -b:v causes judder so limite the bitrate but dont allow it to "saturate" the bitrate. So dont contrain it down just up. - return string.Format(" -maxrate:v {0} -bufsize:v ({0}*2) -b:v {0}", bitrate.Value.ToString(UsCulture)); - } - - if (string.Equals(videoCodec, "msmpeg4", StringComparison.OrdinalIgnoreCase)) - { - return string.Format(" -b:v {0}", bitrate.Value.ToString(UsCulture)); - } - - if (string.Equals(videoCodec, "libx264", StringComparison.OrdinalIgnoreCase)) - { - // h264 - return string.Format(" -maxrate {0} -bufsize {1}", - bitrate.Value.ToString(UsCulture), - (bitrate.Value * 2).ToString(UsCulture)); - } - - // h264 - return string.Format(" -b:v {0} -maxrate {0} -bufsize {1}", - bitrate.Value.ToString(UsCulture), - (bitrate.Value * 2).ToString(UsCulture)); - } - - return string.Empty; - } - - private int? GetAudioBitrateParam(StreamRequest request, MediaStream audioStream) - { - if (request.AudioBitRate.HasValue) - { - // Make sure we don't request a bitrate higher than the source - var currentBitrate = audioStream == null ? request.AudioBitRate.Value : audioStream.BitRate ?? request.AudioBitRate.Value; - - // Don't encode any higher than this - return Math.Min(384000, request.AudioBitRate.Value); - //return Math.Min(currentBitrate, request.AudioBitRate.Value); - } - - return null; - } - - /// - /// Gets the user agent param. - /// - /// The state. - /// System.String. - private string GetUserAgentParam(StreamState state) - { - string useragent = null; - - state.RemoteHttpHeaders.TryGetValue("User-Agent", out useragent); - - if (!string.IsNullOrWhiteSpace(useragent)) - { - return "-user-agent \"" + useragent + "\""; - } - - return string.Empty; - } - /// /// Processes the exited. /// @@ -1588,31 +510,6 @@ namespace MediaBrowser.Api.Playback //} } - protected double? GetFramerateParam(StreamState state) - { - if (state.VideoRequest != null) - { - if (state.VideoRequest.Framerate.HasValue) - { - return state.VideoRequest.Framerate.Value; - } - - var maxrate = state.VideoRequest.MaxFramerate; - - if (maxrate.HasValue && state.VideoStream != null) - { - var contentRate = state.VideoStream.AverageFrameRate ?? state.VideoStream.RealFrameRate; - - if (contentRate.HasValue && contentRate.Value > maxrate.Value) - { - return maxrate; - } - } - } - - return null; - } - /// /// Parses the parameters. /// @@ -1890,7 +787,7 @@ namespace MediaBrowser.Api.Playback if (string.IsNullOrEmpty(request.AudioCodec)) { - request.AudioCodec = InferAudioCodec(url); + request.AudioCodec = EncodingHelper.InferAudioCodec(url); } var state = new StreamState(MediaSourceManager, Logger, TranscodingJobType) @@ -1900,6 +797,12 @@ namespace MediaBrowser.Api.Playback UserAgent = Request.UserAgent }; + var auth = AuthorizationContext.GetAuthorizationInfo(Request); + if (!string.IsNullOrWhiteSpace(auth.UserId)) + { + state.User = UserManager.GetUserById(auth.UserId); + } + //if ((Request.UserAgent ?? string.Empty).IndexOf("iphone", StringComparison.OrdinalIgnoreCase) != -1 || // (Request.UserAgent ?? string.Empty).IndexOf("ipad", StringComparison.OrdinalIgnoreCase) != -1 || // (Request.UserAgent ?? string.Empty).IndexOf("ipod", StringComparison.OrdinalIgnoreCase) != -1) @@ -1969,7 +872,7 @@ namespace MediaBrowser.Api.Playback var videoRequest = request as VideoStreamRequest; - AttachMediaSourceInfo(state, mediaSource, videoRequest, url); + EncodingHelper.AttachMediaSourceInfo(state, mediaSource, url); var container = Path.GetExtension(state.RequestedUrl); @@ -1982,21 +885,21 @@ namespace MediaBrowser.Api.Playback state.OutputContainer = (container ?? string.Empty).TrimStart('.'); - state.OutputAudioBitrate = GetAudioBitrateParam(state.Request, state.AudioStream); + state.OutputAudioBitrate = EncodingHelper.GetAudioBitrateParam(state.Request, state.AudioStream); state.OutputAudioSampleRate = request.AudioSampleRate; state.OutputAudioCodec = state.Request.AudioCodec; - state.OutputAudioChannels = GetNumAudioChannelsParam(state.Request, state.AudioStream, state.OutputAudioCodec); + state.OutputAudioChannels = EncodingHelper.GetNumAudioChannelsParam(state.Request, state.AudioStream, state.OutputAudioCodec); if (videoRequest != null) { state.OutputVideoCodec = state.VideoRequest.VideoCodec; - state.OutputVideoBitrate = GetVideoBitrateParamValue(state.VideoRequest, state.VideoStream, state.OutputVideoCodec); + state.OutputVideoBitrate = EncodingHelper.GetVideoBitrateParamValue(state.VideoRequest, state.VideoStream, state.OutputVideoCodec); if (videoRequest != null) { - TryStreamCopy(state, videoRequest); + EncodingHelper.TryStreamCopy(state); } if (state.OutputVideoBitrate.HasValue && !string.Equals(state.OutputVideoCodec, "copy", StringComparison.OrdinalIgnoreCase)) @@ -2025,334 +928,6 @@ namespace MediaBrowser.Api.Playback return state; } - private void TryStreamCopy(StreamState state, VideoStreamRequest videoRequest) - { - if (state.VideoStream != null && CanStreamCopyVideo(state)) - { - state.OutputVideoCodec = "copy"; - } - else - { - // If the user doesn't have access to transcoding, then force stream copy, regardless of whether it will be compatible or not - var auth = AuthorizationContext.GetAuthorizationInfo(Request); - if (!string.IsNullOrWhiteSpace(auth.UserId)) - { - var user = UserManager.GetUserById(auth.UserId); - if (!user.Policy.EnableVideoPlaybackTranscoding) - { - state.OutputVideoCodec = "copy"; - } - } - } - - if (state.AudioStream != null && CanStreamCopyAudio(state, state.SupportedAudioCodecs)) - { - state.OutputAudioCodec = "copy"; - } - else - { - // If the user doesn't have access to transcoding, then force stream copy, regardless of whether it will be compatible or not - var auth = AuthorizationContext.GetAuthorizationInfo(Request); - if (!string.IsNullOrWhiteSpace(auth.UserId)) - { - var user = UserManager.GetUserById(auth.UserId); - if (!user.Policy.EnableAudioPlaybackTranscoding) - { - state.OutputAudioCodec = "copy"; - } - } - } - } - - private void AttachMediaSourceInfo(StreamState state, - MediaSourceInfo mediaSource, - VideoStreamRequest videoRequest, - string requestedUrl) - { - state.MediaPath = mediaSource.Path; - state.InputProtocol = mediaSource.Protocol; - state.InputContainer = mediaSource.Container; - state.InputFileSize = mediaSource.Size; - state.InputBitrate = mediaSource.Bitrate; - state.RunTimeTicks = mediaSource.RunTimeTicks; - state.RemoteHttpHeaders = mediaSource.RequiredHttpHeaders; - - if (mediaSource.VideoType.HasValue) - { - state.VideoType = mediaSource.VideoType.Value; - } - - state.IsoType = mediaSource.IsoType; - - state.PlayableStreamFileNames = mediaSource.PlayableStreamFileNames.ToList(); - - if (mediaSource.Timestamp.HasValue) - { - state.InputTimestamp = mediaSource.Timestamp.Value; - } - - state.InputProtocol = mediaSource.Protocol; - state.MediaPath = mediaSource.Path; - state.RunTimeTicks = mediaSource.RunTimeTicks; - state.RemoteHttpHeaders = mediaSource.RequiredHttpHeaders; - state.InputBitrate = mediaSource.Bitrate; - state.InputFileSize = mediaSource.Size; - state.ReadInputAtNativeFramerate = mediaSource.ReadAtNativeFramerate; - - if (state.ReadInputAtNativeFramerate || - mediaSource.Protocol == MediaProtocol.File && string.Equals(mediaSource.Container, "wtv", StringComparison.OrdinalIgnoreCase)) - { - state.OutputAudioSync = "1000"; - state.InputVideoSync = "-1"; - state.InputAudioSync = "1"; - } - - if (string.Equals(mediaSource.Container, "wma", StringComparison.OrdinalIgnoreCase)) - { - // Seeing some stuttering when transcoding wma to audio-only HLS - state.InputAudioSync = "1"; - } - - var mediaStreams = mediaSource.MediaStreams; - - if (videoRequest != null) - { - if (string.IsNullOrEmpty(videoRequest.VideoCodec)) - { - videoRequest.VideoCodec = InferVideoCodec(requestedUrl); - } - - state.VideoStream = GetMediaStream(mediaStreams, videoRequest.VideoStreamIndex, MediaStreamType.Video); - state.SubtitleStream = GetMediaStream(mediaStreams, videoRequest.SubtitleStreamIndex, MediaStreamType.Subtitle, false); - state.SubtitleDeliveryMethod = videoRequest.SubtitleMethod; - state.AudioStream = GetMediaStream(mediaStreams, videoRequest.AudioStreamIndex, MediaStreamType.Audio); - - if (state.SubtitleStream != null && !state.SubtitleStream.IsExternal) - { - state.InternalSubtitleStreamOffset = mediaStreams.Where(i => i.Type == MediaStreamType.Subtitle && !i.IsExternal).ToList().IndexOf(state.SubtitleStream); - } - - if (state.VideoStream != null && state.VideoStream.IsInterlaced) - { - state.DeInterlace = true; - } - - EnforceResolutionLimit(state, videoRequest); - } - else - { - state.AudioStream = GetMediaStream(mediaStreams, null, MediaStreamType.Audio, true); - } - - state.MediaSource = mediaSource; - } - - protected bool CanStreamCopyVideo(StreamState state) - { - var request = state.VideoRequest; - var videoStream = state.VideoStream; - - if (videoStream.IsInterlaced) - { - return false; - } - - if (videoStream.IsAnamorphic ?? false) - { - return false; - } - - // Can't stream copy if we're burning in subtitles - if (request.SubtitleStreamIndex.HasValue) - { - if (request.SubtitleMethod == SubtitleDeliveryMethod.Encode) - { - return false; - } - } - - if (string.Equals("h264", videoStream.Codec, StringComparison.OrdinalIgnoreCase)) - { - if (videoStream.IsAVC.HasValue && !videoStream.IsAVC.Value && request.RequireAvc) - { - Logger.Debug("Cannot stream copy video. Stream is marked as not AVC"); - return false; - } - } - - // Source and target codecs must match - if (string.IsNullOrEmpty(videoStream.Codec) || !state.SupportedVideoCodecs.Contains(videoStream.Codec, StringComparer.OrdinalIgnoreCase)) - { - return false; - } - - // If client is requesting a specific video profile, it must match the source - if (!string.IsNullOrEmpty(request.Profile)) - { - if (string.IsNullOrEmpty(videoStream.Profile)) - { - //return false; - } - - if (!string.IsNullOrEmpty(videoStream.Profile) && !string.Equals(request.Profile, videoStream.Profile, StringComparison.OrdinalIgnoreCase)) - { - var currentScore = GetVideoProfileScore(videoStream.Profile); - var requestedScore = GetVideoProfileScore(request.Profile); - - if (currentScore == -1 || currentScore > requestedScore) - { - return false; - } - } - } - - // Video width must fall within requested value - if (request.MaxWidth.HasValue) - { - if (!videoStream.Width.HasValue || videoStream.Width.Value > request.MaxWidth.Value) - { - return false; - } - } - - // Video height must fall within requested value - if (request.MaxHeight.HasValue) - { - if (!videoStream.Height.HasValue || videoStream.Height.Value > request.MaxHeight.Value) - { - return false; - } - } - - // Video framerate must fall within requested value - var requestedFramerate = request.MaxFramerate ?? request.Framerate; - if (requestedFramerate.HasValue) - { - var videoFrameRate = videoStream.AverageFrameRate ?? videoStream.RealFrameRate; - - if (!videoFrameRate.HasValue || videoFrameRate.Value > requestedFramerate.Value) - { - return false; - } - } - - // Video bitrate must fall within requested value - if (request.VideoBitRate.HasValue) - { - if (!videoStream.BitRate.HasValue || videoStream.BitRate.Value > request.VideoBitRate.Value) - { - return false; - } - } - - if (request.MaxVideoBitDepth.HasValue) - { - if (videoStream.BitDepth.HasValue && videoStream.BitDepth.Value > request.MaxVideoBitDepth.Value) - { - return false; - } - } - - if (request.MaxRefFrames.HasValue) - { - if (videoStream.RefFrames.HasValue && videoStream.RefFrames.Value > request.MaxRefFrames.Value) - { - return false; - } - } - - // If a specific level was requested, the source must match or be less than - if (!string.IsNullOrEmpty(request.Level)) - { - double requestLevel; - - if (double.TryParse(request.Level, NumberStyles.Any, UsCulture, out requestLevel)) - { - if (!videoStream.Level.HasValue) - { - //return false; - } - - if (videoStream.Level.HasValue && videoStream.Level.Value > requestLevel) - { - return false; - } - } - } - - return request.EnableAutoStreamCopy; - } - - private int GetVideoProfileScore(string profile) - { - var list = new List - { - "Constrained Baseline", - "Baseline", - "Extended", - "Main", - "High", - "Progressive High", - "Constrained High" - }; - - return Array.FindIndex(list.ToArray(), t => string.Equals(t, profile, StringComparison.OrdinalIgnoreCase)); - } - - protected virtual bool CanStreamCopyAudio(StreamState state, List supportedAudioCodecs) - { - var request = state.VideoRequest; - var audioStream = state.AudioStream; - - // Source and target codecs must match - if (string.IsNullOrEmpty(audioStream.Codec) || !supportedAudioCodecs.Contains(audioStream.Codec, StringComparer.OrdinalIgnoreCase)) - { - return false; - } - - // Video bitrate must fall within requested value - if (request.AudioBitRate.HasValue) - { - if (!audioStream.BitRate.HasValue || audioStream.BitRate.Value <= 0) - { - return false; - } - if (audioStream.BitRate.Value > request.AudioBitRate.Value) - { - return false; - } - } - - // Channels must fall within requested value - var channels = request.AudioChannels ?? request.MaxAudioChannels; - if (channels.HasValue) - { - if (!audioStream.Channels.HasValue || audioStream.Channels.Value <= 0) - { - return false; - } - if (audioStream.Channels.Value > channels.Value) - { - return false; - } - } - - // Sample rate must fall within requested value - if (request.AudioSampleRate.HasValue) - { - if (!audioStream.SampleRate.HasValue || audioStream.SampleRate.Value <= 0) - { - return false; - } - if (audioStream.SampleRate.Value > request.AudioSampleRate.Value) - { - return false; - } - } - - return request.EnableAutoStreamCopy; - } - private void ApplyDeviceProfileSettings(StreamState state) { var headers = Request.Headers.ToDictionary(); @@ -2649,207 +1224,5 @@ namespace MediaBrowser.Api.Playback responseHeaders["TimeSeekRange.dlna.org"] = string.Format("npt={0}-{1}/{1}", startSeconds, runtimeSeconds); responseHeaders["X-AvailableSeekRange"] = string.Format("1 npt={0}-{1}", startSeconds, runtimeSeconds); } - - /// - /// Enforces the resolution limit. - /// - /// The state. - /// The video request. - private void EnforceResolutionLimit(StreamState state, VideoStreamRequest videoRequest) - { - // Switch the incoming params to be ceilings rather than fixed values - videoRequest.MaxWidth = videoRequest.MaxWidth ?? videoRequest.Width; - videoRequest.MaxHeight = videoRequest.MaxHeight ?? videoRequest.Height; - - videoRequest.Width = null; - videoRequest.Height = null; - } - - protected string GetInputModifier(StreamState state, bool genPts = true) - { - var inputModifier = string.Empty; - - var probeSize = GetProbeSizeArgument(state); - inputModifier += " " + probeSize; - inputModifier = inputModifier.Trim(); - - var userAgentParam = GetUserAgentParam(state); - - if (!string.IsNullOrWhiteSpace(userAgentParam)) - { - inputModifier += " " + userAgentParam; - } - - inputModifier = inputModifier.Trim(); - - inputModifier += " " + GetFastSeekCommandLineParameter(state.Request); - inputModifier = inputModifier.Trim(); - - //inputModifier += " -fflags +genpts+ignidx+igndts"; - if (state.VideoRequest != null && genPts) - { - inputModifier += " -fflags +genpts"; - } - - if (!string.IsNullOrEmpty(state.InputAudioSync)) - { - inputModifier += " -async " + state.InputAudioSync; - } - - if (!string.IsNullOrEmpty(state.InputVideoSync)) - { - inputModifier += " -vsync " + state.InputVideoSync; - } - - if (state.ReadInputAtNativeFramerate) - { - inputModifier += " -re"; - } - - var videoDecoder = GetVideoDecoder(state); - if (!string.IsNullOrWhiteSpace(videoDecoder)) - { - inputModifier += " " + videoDecoder; - } - - if (state.VideoRequest != null) - { - // Important: If this is ever re-enabled, make sure not to use it with wtv because it breaks seeking - if (string.Equals(state.OutputContainer, "mkv", StringComparison.OrdinalIgnoreCase) && state.VideoRequest.CopyTimestamps) - { - //inputModifier += " -noaccurate_seek"; - } - - if (!string.IsNullOrWhiteSpace(state.InputContainer)) - { - var inputFormat = GetInputFormat(state.InputContainer); - if (!string.IsNullOrWhiteSpace(inputFormat)) - { - inputModifier += " -f " + inputFormat; - } - } - - if (state.RunTimeTicks.HasValue) - { - foreach (var stream in state.MediaSource.MediaStreams) - { - if (!stream.IsExternal && stream.Type != MediaStreamType.Subtitle) - { - if (!string.IsNullOrWhiteSpace(stream.Codec) && stream.Index != -1) - { - var decoder = GetDecoderFromCodec(stream.Codec); - - if (!string.IsNullOrWhiteSpace(decoder)) - { - inputModifier += " -codec:" + stream.Index.ToString(UsCulture) + " " + decoder; - } - } - } - } - } - } - - return inputModifier; - } - - private string GetInputFormat(string container) - { - if (string.Equals(container, "mkv", StringComparison.OrdinalIgnoreCase)) - { - return "matroska"; - } - - return container; - } - - private string GetDecoderFromCodec(string codec) - { - return null; - - //if (string.Equals(codec, "mp2", StringComparison.OrdinalIgnoreCase)) - //{ - // return null; - //} - //if (string.Equals(codec, "aac_latm", StringComparison.OrdinalIgnoreCase)) - //{ - // return null; - //} - - //return codec; - } - - /// - /// Infers the audio codec based on the url - /// - /// The URL. - /// System.Nullable{AudioCodecs}. - private string InferAudioCodec(string url) - { - var ext = Path.GetExtension(url); - - if (string.Equals(ext, ".mp3", StringComparison.OrdinalIgnoreCase)) - { - return "mp3"; - } - if (string.Equals(ext, ".aac", StringComparison.OrdinalIgnoreCase)) - { - return "aac"; - } - if (string.Equals(ext, ".wma", StringComparison.OrdinalIgnoreCase)) - { - return "wma"; - } - if (string.Equals(ext, ".ogg", StringComparison.OrdinalIgnoreCase)) - { - return "vorbis"; - } - if (string.Equals(ext, ".oga", StringComparison.OrdinalIgnoreCase)) - { - return "vorbis"; - } - if (string.Equals(ext, ".ogv", StringComparison.OrdinalIgnoreCase)) - { - return "vorbis"; - } - if (string.Equals(ext, ".webm", StringComparison.OrdinalIgnoreCase)) - { - return "vorbis"; - } - if (string.Equals(ext, ".webma", StringComparison.OrdinalIgnoreCase)) - { - return "vorbis"; - } - - return "copy"; - } - - /// - /// Infers the video codec. - /// - /// The URL. - /// System.Nullable{VideoCodecs}. - private string InferVideoCodec(string url) - { - var ext = Path.GetExtension(url); - - if (string.Equals(ext, ".asf", StringComparison.OrdinalIgnoreCase)) - { - return "wmv"; - } - if (string.Equals(ext, ".webm", StringComparison.OrdinalIgnoreCase)) - { - return "vpx"; - } - if (string.Equals(ext, ".ogg", StringComparison.OrdinalIgnoreCase) || string.Equals(ext, ".ogv", StringComparison.OrdinalIgnoreCase)) - { - return "theora"; - } - if (string.Equals(ext, ".m3u8", StringComparison.OrdinalIgnoreCase) || string.Equals(ext, ".ts", StringComparison.OrdinalIgnoreCase)) - { - return "h264"; - } - - return "copy"; - } } } From a8428c70d9e98f82cd1a3321645591d40b3e99dc Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Thu, 2 Feb 2017 11:10:17 -0500 Subject: [PATCH 45/55] 3.1.292 --- SharedVersion.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SharedVersion.cs b/SharedVersion.cs index 8454d76dc..180e9ff83 100644 --- a/SharedVersion.cs +++ b/SharedVersion.cs @@ -1,4 +1,4 @@ using System.Reflection; //[assembly: AssemblyVersion("3.1.*")] -[assembly: AssemblyVersion("3.1.291")] +[assembly: AssemblyVersion("3.1.292")] From ad801bfe3235923af57680f508c0169754fb697a Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Fri, 3 Feb 2017 16:17:56 -0500 Subject: [PATCH 46/55] 3.1.7000 --- SharedVersion.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SharedVersion.cs b/SharedVersion.cs index 180e9ff83..e01889cf1 100644 --- a/SharedVersion.cs +++ b/SharedVersion.cs @@ -1,4 +1,4 @@ using System.Reflection; //[assembly: AssemblyVersion("3.1.*")] -[assembly: AssemblyVersion("3.1.292")] +[assembly: AssemblyVersion("3.1.7000")] From 0d10100d6c08cb55bb57d03a44e596480a523c66 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Fri, 3 Feb 2017 16:20:26 -0500 Subject: [PATCH 47/55] 3.1.293 --- SharedVersion.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SharedVersion.cs b/SharedVersion.cs index e01889cf1..2eeeeea84 100644 --- a/SharedVersion.cs +++ b/SharedVersion.cs @@ -1,4 +1,4 @@ using System.Reflection; //[assembly: AssemblyVersion("3.1.*")] -[assembly: AssemblyVersion("3.1.7000")] +[assembly: AssemblyVersion("3.1.293")] From c857b1cb2ce9138e3c52af330ab8a97c048b5533 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Sat, 4 Feb 2017 18:35:03 -0500 Subject: [PATCH 48/55] 3.1.294 --- SharedVersion.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SharedVersion.cs b/SharedVersion.cs index 2eeeeea84..5444299be 100644 --- a/SharedVersion.cs +++ b/SharedVersion.cs @@ -1,4 +1,4 @@ using System.Reflection; //[assembly: AssemblyVersion("3.1.*")] -[assembly: AssemblyVersion("3.1.293")] +[assembly: AssemblyVersion("3.1.294")] From fab2e0c227a1ad5ba70f3f0ba88f7fa451676376 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Sun, 5 Feb 2017 15:47:29 -0500 Subject: [PATCH 49/55] 3.1.295 --- SharedVersion.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SharedVersion.cs b/SharedVersion.cs index 5444299be..05eb1febb 100644 --- a/SharedVersion.cs +++ b/SharedVersion.cs @@ -1,4 +1,4 @@ using System.Reflection; //[assembly: AssemblyVersion("3.1.*")] -[assembly: AssemblyVersion("3.1.294")] +[assembly: AssemblyVersion("3.1.295")] From 84d2a5303b2eee311628876851335b7b926aa2ea Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Mon, 6 Feb 2017 01:08:09 -0500 Subject: [PATCH 50/55] fix merge conflict --- SharedVersion.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SharedVersion.cs b/SharedVersion.cs index e62c8563a..05eb1febb 100644 --- a/SharedVersion.cs +++ b/SharedVersion.cs @@ -1,4 +1,4 @@ using System.Reflection; //[assembly: AssemblyVersion("3.1.*")] -[assembly: AssemblyVersion("3.1.5")] +[assembly: AssemblyVersion("3.1.295")] From 1bf1cfda892e97ff76ff25934ce44c7d4c565af4 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Mon, 6 Feb 2017 01:09:54 -0500 Subject: [PATCH 51/55] 3.2 --- SharedVersion.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SharedVersion.cs b/SharedVersion.cs index 05eb1febb..d1a774c2f 100644 --- a/SharedVersion.cs +++ b/SharedVersion.cs @@ -1,4 +1,4 @@ using System.Reflection; //[assembly: AssemblyVersion("3.1.*")] -[assembly: AssemblyVersion("3.1.295")] +[assembly: AssemblyVersion("3.2.0")] From 730dd523c07a06105b8e0f597c782f1dd5d80a7e Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Mon, 6 Feb 2017 01:52:21 -0500 Subject: [PATCH 52/55] fix merge conflict --- SharedVersion.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/SharedVersion.cs b/SharedVersion.cs index 05eb1febb..b63f7d15e 100644 --- a/SharedVersion.cs +++ b/SharedVersion.cs @@ -1,4 +1,3 @@ using System.Reflection; -//[assembly: AssemblyVersion("3.1.*")] -[assembly: AssemblyVersion("3.1.295")] +[assembly: AssemblyVersion("3.2.0.100")] From 345a619d934432f6f91aa716989d34abebaec117 Mon Sep 17 00:00:00 2001 From: Luke Date: Mon, 6 Feb 2017 13:45:24 -0500 Subject: [PATCH 53/55] update mac project --- .../Emby.Server.Mac.csproj | 828 +----------------- 1 file changed, 6 insertions(+), 822 deletions(-) diff --git a/MediaBrowser.Server.Mac/Emby.Server.Mac.csproj b/MediaBrowser.Server.Mac/Emby.Server.Mac.csproj index 85c7533a7..7f3baf0c0 100644 --- a/MediaBrowser.Server.Mac/Emby.Server.Mac.csproj +++ b/MediaBrowser.Server.Mac/Emby.Server.Mac.csproj @@ -576,39 +576,12 @@ Resources\dashboard-ui\wizarduser.html - - Resources\dashboard-ui\bower_components\Sortable\.bower.json - - - Resources\dashboard-ui\bower_components\Sortable\.editorconfig - - - Resources\dashboard-ui\bower_components\Sortable\.gitignore - - - Resources\dashboard-ui\bower_components\Sortable\.jshintrc - - - Resources\dashboard-ui\bower_components\Sortable\CONTRIBUTING.md - - - Resources\dashboard-ui\bower_components\Sortable\Gruntfile.js - - - Resources\dashboard-ui\bower_components\Sortable\README.md - Resources\dashboard-ui\bower_components\Sortable\Sortable.html Resources\dashboard-ui\bower_components\Sortable\Sortable.min.js - - Resources\dashboard-ui\bower_components\Sortable\bower.json - - - Resources\dashboard-ui\bower_components\Sortable\component.json - Resources\dashboard-ui\bower_components\Sortable\index.html @@ -621,30 +594,12 @@ Resources\dashboard-ui\bower_components\Sortable\ng-sortable.js - - Resources\dashboard-ui\bower_components\Sortable\package.json - Resources\dashboard-ui\bower_components\Sortable\react-sortable-mixin.js - - Resources\dashboard-ui\bower_components\Swiper\.bower.json - - - Resources\dashboard-ui\bower_components\Swiper\CHANGELOG.md - Resources\dashboard-ui\bower_components\Swiper\LICENSE - - Resources\dashboard-ui\bower_components\Swiper\README.md - - - Resources\dashboard-ui\bower_components\Swiper\bower.json - - - Resources\dashboard-ui\bower_components\Swiper\component.json - Resources\dashboard-ui\bower_components\Swiper\gulpfile.js @@ -657,261 +612,24 @@ Resources\dashboard-ui\bower_components\Swiper\dist\js\swiper.min.js - - Resources\dashboard-ui\bower_components\cryptojslib\.bower.json - - - Resources\dashboard-ui\bower_components\cryptojslib\.gitattributes - - - Resources\dashboard-ui\bower_components\cryptojslib\.gitignore - - - Resources\dashboard-ui\bower_components\cryptojslib\README.md - - - Resources\dashboard-ui\bower_components\cryptojslib\bower.json - - - Resources\dashboard-ui\bower_components\cryptojslib\copyright.txt - - - Resources\dashboard-ui\bower_components\cryptojslib\push.bat - - - Resources\dashboard-ui\bower_components\cryptojslib\status.bat - - - Resources\dashboard-ui\bower_components\cryptojslib\components\aes-min.js - - - Resources\dashboard-ui\bower_components\cryptojslib\components\aes.js - - - Resources\dashboard-ui\bower_components\cryptojslib\components\cipher-core-min.js - - - Resources\dashboard-ui\bower_components\cryptojslib\components\cipher-core.js - Resources\dashboard-ui\bower_components\cryptojslib\components\core-min.js - - Resources\dashboard-ui\bower_components\cryptojslib\components\core.js - - - Resources\dashboard-ui\bower_components\cryptojslib\components\enc-base64-min.js - - - Resources\dashboard-ui\bower_components\cryptojslib\components\enc-base64.js - - - Resources\dashboard-ui\bower_components\cryptojslib\components\enc-utf16-min.js - - - Resources\dashboard-ui\bower_components\cryptojslib\components\enc-utf16.js - - - Resources\dashboard-ui\bower_components\cryptojslib\components\evpkdf-min.js - - - Resources\dashboard-ui\bower_components\cryptojslib\components\evpkdf.js - - - Resources\dashboard-ui\bower_components\cryptojslib\components\format-hex-min.js - - - Resources\dashboard-ui\bower_components\cryptojslib\components\format-hex.js - - - Resources\dashboard-ui\bower_components\cryptojslib\components\hmac-min.js - - - Resources\dashboard-ui\bower_components\cryptojslib\components\hmac.js - - - Resources\dashboard-ui\bower_components\cryptojslib\components\lib-typedarrays-min.js - - - Resources\dashboard-ui\bower_components\cryptojslib\components\lib-typedarrays.js - Resources\dashboard-ui\bower_components\cryptojslib\components\md5-min.js - - Resources\dashboard-ui\bower_components\cryptojslib\components\md5.js - - - Resources\dashboard-ui\bower_components\cryptojslib\components\mode-cfb-min.js - - - Resources\dashboard-ui\bower_components\cryptojslib\components\mode-cfb.js - - - Resources\dashboard-ui\bower_components\cryptojslib\components\mode-ctr-gladman-min.js - - - Resources\dashboard-ui\bower_components\cryptojslib\components\mode-ctr-gladman.js - - - Resources\dashboard-ui\bower_components\cryptojslib\components\mode-ctr-min.js - - - Resources\dashboard-ui\bower_components\cryptojslib\components\mode-ctr.js - - - Resources\dashboard-ui\bower_components\cryptojslib\components\mode-ecb-min.js - - - Resources\dashboard-ui\bower_components\cryptojslib\components\mode-ecb.js - - - Resources\dashboard-ui\bower_components\cryptojslib\components\mode-ofb-min.js - - - Resources\dashboard-ui\bower_components\cryptojslib\components\mode-ofb.js - - - Resources\dashboard-ui\bower_components\cryptojslib\components\pad-ansix923-min.js - - - Resources\dashboard-ui\bower_components\cryptojslib\components\pad-ansix923.js - - - Resources\dashboard-ui\bower_components\cryptojslib\components\pad-iso10126-min.js - - - Resources\dashboard-ui\bower_components\cryptojslib\components\pad-iso10126.js - - - Resources\dashboard-ui\bower_components\cryptojslib\components\pad-iso97971-min.js - - - Resources\dashboard-ui\bower_components\cryptojslib\components\pad-iso97971.js - - - Resources\dashboard-ui\bower_components\cryptojslib\components\pad-nopadding-min.js - - - Resources\dashboard-ui\bower_components\cryptojslib\components\pad-nopadding.js - - - Resources\dashboard-ui\bower_components\cryptojslib\components\pad-zeropadding-min.js - - - Resources\dashboard-ui\bower_components\cryptojslib\components\pad-zeropadding.js - - - Resources\dashboard-ui\bower_components\cryptojslib\components\pbkdf2-min.js - - - Resources\dashboard-ui\bower_components\cryptojslib\components\pbkdf2.js - - - Resources\dashboard-ui\bower_components\cryptojslib\components\rabbit-legacy-min.js - - - Resources\dashboard-ui\bower_components\cryptojslib\components\rabbit-legacy.js - - - Resources\dashboard-ui\bower_components\cryptojslib\components\rabbit-min.js - - - Resources\dashboard-ui\bower_components\cryptojslib\components\rabbit.js - - - Resources\dashboard-ui\bower_components\cryptojslib\components\rc4-min.js - - - Resources\dashboard-ui\bower_components\cryptojslib\components\rc4.js - - - Resources\dashboard-ui\bower_components\cryptojslib\components\ripemd160-min.js - - - Resources\dashboard-ui\bower_components\cryptojslib\components\ripemd160.js - Resources\dashboard-ui\bower_components\cryptojslib\components\sha1-min.js - - Resources\dashboard-ui\bower_components\cryptojslib\components\sha1.js - - - Resources\dashboard-ui\bower_components\cryptojslib\components\sha224-min.js - - - Resources\dashboard-ui\bower_components\cryptojslib\components\sha224.js - - - Resources\dashboard-ui\bower_components\cryptojslib\components\sha256-min.js - - - Resources\dashboard-ui\bower_components\cryptojslib\components\sha256.js - - - Resources\dashboard-ui\bower_components\cryptojslib\components\sha3-min.js - - - Resources\dashboard-ui\bower_components\cryptojslib\components\sha3.js - - - Resources\dashboard-ui\bower_components\cryptojslib\components\sha384-min.js - - - Resources\dashboard-ui\bower_components\cryptojslib\components\sha384.js - - - Resources\dashboard-ui\bower_components\cryptojslib\components\sha512-min.js - - - Resources\dashboard-ui\bower_components\cryptojslib\components\sha512.js - - - Resources\dashboard-ui\bower_components\cryptojslib\components\tripledes-min.js - - - Resources\dashboard-ui\bower_components\cryptojslib\components\tripledes.js - - - Resources\dashboard-ui\bower_components\cryptojslib\components\x64-core-min.js - - - Resources\dashboard-ui\bower_components\cryptojslib\components\x64-core.js - - - Resources\dashboard-ui\bower_components\document-register-element\.bower.json - - - Resources\dashboard-ui\bower_components\document-register-element\LICENSE.txt - - - Resources\dashboard-ui\bower_components\document-register-element\README.md - - - Resources\dashboard-ui\bower_components\document-register-element\RESOURCES.md - Resources\dashboard-ui\bower_components\document-register-element\basic.html - - Resources\dashboard-ui\bower_components\document-register-element\bower.json - Resources\dashboard-ui\bower_components\document-register-element\testrunner.js Resources\dashboard-ui\bower_components\document-register-element\build\document-register-element.js - - Resources\dashboard-ui\bower_components\emby-apiclient\.bower.json - - - Resources\dashboard-ui\bower_components\emby-apiclient\LICENSE.md - - - Resources\dashboard-ui\bower_components\emby-apiclient\README.md - Resources\dashboard-ui\bower_components\emby-apiclient\apiclient.js @@ -927,9 +645,6 @@ Resources\dashboard-ui\bower_components\emby-apiclient\appstorage-memory.js - - Resources\dashboard-ui\bower_components\emby-apiclient\bower.json - Resources\dashboard-ui\bower_components\emby-apiclient\cameraroll.js @@ -996,21 +711,9 @@ Resources\dashboard-ui\bower_components\emby-apiclient\sync\userrepository.js - - Resources\dashboard-ui\bower_components\emby-webcomponents\.bower.json - - - Resources\dashboard-ui\bower_components\emby-webcomponents\LICENSE.md - - - Resources\dashboard-ui\bower_components\emby-webcomponents\README.md - Resources\dashboard-ui\bower_components\emby-webcomponents\appsettings.js - - Resources\dashboard-ui\bower_components\emby-webcomponents\bower.json - Resources\dashboard-ui\bower_components\emby-webcomponents\browser.js @@ -1041,6 +744,9 @@ Resources\dashboard-ui\bower_components\emby-webcomponents\filesystem.js + + Resources\dashboard-ui\bower_components\emby-webcomponents\flexstyles.css + Resources\dashboard-ui\bower_components\emby-webcomponents\focusmanager.js @@ -1467,9 +1173,6 @@ Resources\dashboard-ui\bower_components\emby-webcomponents\multiselect\multiselect.js - - Resources\dashboard-ui\bower_components\emby-webcomponents\native-promise-only\README.md - Resources\dashboard-ui\bower_components\emby-webcomponents\native-promise-only\test_adapter.js @@ -1488,6 +1191,9 @@ Resources\dashboard-ui\bower_components\emby-webcomponents\pagejs\page.js + + Resources\dashboard-ui\bower_components\emby-webcomponents\playback\autoplaydetect.js + Resources\dashboard-ui\bower_components\emby-webcomponents\playback\nowplayinghelper.js @@ -1608,9 +1314,6 @@ Resources\dashboard-ui\bower_components\emby-webcomponents\sharing\social-share-kit-1.0.10\LICENSE - - Resources\dashboard-ui\bower_components\emby-webcomponents\sharing\social-share-kit-1.0.10\README.md - Resources\dashboard-ui\bower_components\emby-webcomponents\sharing\social-share-kit-1.0.10\dist\css\social-share-kit.css @@ -1806,9 +1509,6 @@ Resources\dashboard-ui\bower_components\emby-webcomponents\viewmanager\viewmanager.js - - Resources\dashboard-ui\bower_components\emby-webcomponents\voice\Readme.md - Resources\dashboard-ui\bower_components\emby-webcomponents\voice\grammarprocessor.js @@ -1860,48 +1560,15 @@ Resources\dashboard-ui\bower_components\emby-webcomponents\youtubeplayer\style.css - - Resources\dashboard-ui\bower_components\fetch\.bower.json - Resources\dashboard-ui\bower_components\fetch\LICENSE - - Resources\dashboard-ui\bower_components\fetch\bower.json - Resources\dashboard-ui\bower_components\fetch\fetch.js - - Resources\dashboard-ui\bower_components\font-roboto\.bower.json - - - Resources\dashboard-ui\bower_components\font-roboto\README.md - - - Resources\dashboard-ui\bower_components\font-roboto\bower.json - Resources\dashboard-ui\bower_components\font-roboto\roboto.html - - Resources\dashboard-ui\bower_components\hammerjs\.bower.json - - - Resources\dashboard-ui\bower_components\hammerjs\CHANGELOG.md - - - Resources\dashboard-ui\bower_components\hammerjs\CONTRIBUTING.md - - - Resources\dashboard-ui\bower_components\hammerjs\LICENSE.md - - - Resources\dashboard-ui\bower_components\hammerjs\README.md - - - Resources\dashboard-ui\bower_components\hammerjs\bower.json - Resources\dashboard-ui\bower_components\hammerjs\changelog.js @@ -1911,27 +1578,9 @@ Resources\dashboard-ui\bower_components\hammerjs\hammer.min.js - - Resources\dashboard-ui\bower_components\hammerjs\hammer.min.js.map - - - Resources\dashboard-ui\bower_components\hammerjs\hammer.min.map - - - Resources\dashboard-ui\bower_components\headroomjs\.bower.json - Resources\dashboard-ui\bower_components\headroomjs\LICENSE - - Resources\dashboard-ui\bower_components\headroomjs\README.md - - - Resources\dashboard-ui\bower_components\headroomjs\bower.json - - - Resources\dashboard-ui\bower_components\headroomjs\package.json - Resources\dashboard-ui\bower_components\headroomjs\dist\angular.headroom.js @@ -1950,75 +1599,18 @@ Resources\dashboard-ui\bower_components\headroomjs\dist\jQuery.headroom.min.js - - Resources\dashboard-ui\bower_components\hlsjs\.bower.json - - - Resources\dashboard-ui\bower_components\hlsjs\API.md - - - Resources\dashboard-ui\bower_components\hlsjs\CONTRIBUTING.md - - - Resources\dashboard-ui\bower_components\hlsjs\ISSUE_TEMPLATE.md - Resources\dashboard-ui\bower_components\hlsjs\LICENSE - - Resources\dashboard-ui\bower_components\hlsjs\README.md - - - Resources\dashboard-ui\bower_components\hlsjs\bower.json - - - Resources\dashboard-ui\bower_components\hlsjs\design.md - Resources\dashboard-ui\bower_components\hlsjs\hls.js.sublime-project - - Resources\dashboard-ui\bower_components\hlsjs\package.json - Resources\dashboard-ui\bower_components\hlsjs\dist\hls.min.js - - Resources\dashboard-ui\bower_components\howlerjs\.bower.json - - - Resources\dashboard-ui\bower_components\howlerjs\CHANGELOG.md - - - Resources\dashboard-ui\bower_components\howlerjs\LICENSE.md - - - Resources\dashboard-ui\bower_components\howlerjs\README.md - - - Resources\dashboard-ui\bower_components\howlerjs\bower.json - Resources\dashboard-ui\bower_components\howlerjs\howler.min.js - - Resources\dashboard-ui\bower_components\howlerjs\package.json - - - Resources\dashboard-ui\bower_components\jquery\.bower.json - - - Resources\dashboard-ui\bower_components\jquery\AUTHORS.txt - - - Resources\dashboard-ui\bower_components\jquery\LICENSE.txt - - - Resources\dashboard-ui\bower_components\jquery\README.md - - - Resources\dashboard-ui\bower_components\jquery\bower.json - Resources\dashboard-ui\bower_components\jquery\dist\core.js @@ -2028,240 +1620,15 @@ Resources\dashboard-ui\bower_components\jquery\dist\jquery.min.js - - Resources\dashboard-ui\bower_components\jquery\dist\jquery.min.map - Resources\dashboard-ui\bower_components\jquery\dist\jquery.slim.js Resources\dashboard-ui\bower_components\jquery\dist\jquery.slim.min.js - - Resources\dashboard-ui\bower_components\jquery\dist\jquery.slim.min.map - - - Resources\dashboard-ui\bower_components\jquery\external\sizzle\LICENSE.txt - - - Resources\dashboard-ui\bower_components\jquery\external\sizzle\dist\sizzle.js - - - Resources\dashboard-ui\bower_components\jquery\external\sizzle\dist\sizzle.min.js - - - Resources\dashboard-ui\bower_components\jquery\external\sizzle\dist\sizzle.min.map - - - Resources\dashboard-ui\bower_components\jquery\src\.eslintrc.json - - - Resources\dashboard-ui\bower_components\jquery\src\ajax.js - - - Resources\dashboard-ui\bower_components\jquery\src\attributes.js - - - Resources\dashboard-ui\bower_components\jquery\src\callbacks.js - - - Resources\dashboard-ui\bower_components\jquery\src\core.js - - - Resources\dashboard-ui\bower_components\jquery\src\css.js - - - Resources\dashboard-ui\bower_components\jquery\src\data.js - - - Resources\dashboard-ui\bower_components\jquery\src\deferred.js - - - Resources\dashboard-ui\bower_components\jquery\src\deprecated.js - - - Resources\dashboard-ui\bower_components\jquery\src\dimensions.js - - - Resources\dashboard-ui\bower_components\jquery\src\effects.js - - - Resources\dashboard-ui\bower_components\jquery\src\event.js - - - Resources\dashboard-ui\bower_components\jquery\src\jquery.js - - - Resources\dashboard-ui\bower_components\jquery\src\manipulation.js - - - Resources\dashboard-ui\bower_components\jquery\src\offset.js - - - Resources\dashboard-ui\bower_components\jquery\src\queue.js - - - Resources\dashboard-ui\bower_components\jquery\src\selector-native.js - - - Resources\dashboard-ui\bower_components\jquery\src\selector-sizzle.js - - - Resources\dashboard-ui\bower_components\jquery\src\selector.js - - - Resources\dashboard-ui\bower_components\jquery\src\serialize.js - - - Resources\dashboard-ui\bower_components\jquery\src\traversing.js - - - Resources\dashboard-ui\bower_components\jquery\src\wrap.js - - - Resources\dashboard-ui\bower_components\jquery\src\ajax\jsonp.js - - - Resources\dashboard-ui\bower_components\jquery\src\ajax\load.js - - - Resources\dashboard-ui\bower_components\jquery\src\ajax\parseXML.js - - - Resources\dashboard-ui\bower_components\jquery\src\ajax\script.js - - - Resources\dashboard-ui\bower_components\jquery\src\ajax\xhr.js - - - Resources\dashboard-ui\bower_components\jquery\src\attributes\attr.js - - - Resources\dashboard-ui\bower_components\jquery\src\attributes\classes.js - - - Resources\dashboard-ui\bower_components\jquery\src\attributes\prop.js - - - Resources\dashboard-ui\bower_components\jquery\src\attributes\support.js - - - Resources\dashboard-ui\bower_components\jquery\src\attributes\val.js - - - Resources\dashboard-ui\bower_components\jquery\src\core\DOMEval.js - - - Resources\dashboard-ui\bower_components\jquery\src\core\access.js - - - Resources\dashboard-ui\bower_components\jquery\src\core\init.js - - - Resources\dashboard-ui\bower_components\jquery\src\core\parseHTML.js - - - Resources\dashboard-ui\bower_components\jquery\src\core\ready-no-deferred.js - - - Resources\dashboard-ui\bower_components\jquery\src\core\ready.js - - - Resources\dashboard-ui\bower_components\jquery\src\core\readyException.js - - - Resources\dashboard-ui\bower_components\jquery\src\core\stripAndCollapse.js - - - Resources\dashboard-ui\bower_components\jquery\src\core\support.js - - - Resources\dashboard-ui\bower_components\jquery\src\css\addGetHookIf.js - - - Resources\dashboard-ui\bower_components\jquery\src\css\adjustCSS.js - - - Resources\dashboard-ui\bower_components\jquery\src\css\curCSS.js - - - Resources\dashboard-ui\bower_components\jquery\src\css\hiddenVisibleSelectors.js - - - Resources\dashboard-ui\bower_components\jquery\src\css\showHide.js - - - Resources\dashboard-ui\bower_components\jquery\src\css\support.js - - - Resources\dashboard-ui\bower_components\jquery\src\data\Data.js - - - Resources\dashboard-ui\bower_components\jquery\src\deferred\exceptionHook.js - - - Resources\dashboard-ui\bower_components\jquery\src\effects\Tween.js - - - Resources\dashboard-ui\bower_components\jquery\src\effects\animatedSelector.js - - - Resources\dashboard-ui\bower_components\jquery\src\event\ajax.js - - - Resources\dashboard-ui\bower_components\jquery\src\event\alias.js - - - Resources\dashboard-ui\bower_components\jquery\src\event\focusin.js - - - Resources\dashboard-ui\bower_components\jquery\src\event\support.js - - - Resources\dashboard-ui\bower_components\jquery\src\event\trigger.js - - - Resources\dashboard-ui\bower_components\jquery\src\exports\amd.js - - - Resources\dashboard-ui\bower_components\jquery\src\exports\global.js - - - Resources\dashboard-ui\bower_components\jquery\src\manipulation\_evalUrl.js - - - Resources\dashboard-ui\bower_components\jquery\src\manipulation\buildFragment.js - - - Resources\dashboard-ui\bower_components\jquery\src\manipulation\getAll.js - - - Resources\dashboard-ui\bower_components\jquery\src\manipulation\setGlobalEval.js - - - Resources\dashboard-ui\bower_components\jquery\src\manipulation\support.js - - - Resources\dashboard-ui\bower_components\jquery\src\manipulation\wrapMap.js - - - Resources\dashboard-ui\bower_components\jquery\src\queue\delay.js - - - Resources\dashboard-ui\bower_components\jquery\src\traversing\findFilter.js - - - Resources\dashboard-ui\bower_components\jstree\.bower.json - Resources\dashboard-ui\bower_components\jstree\LICENSE-MIT - - Resources\dashboard-ui\bower_components\jstree\bower.json - - - Resources\dashboard-ui\bower_components\jstree\composer.json - Resources\dashboard-ui\bower_components\jstree\dist\jstree.js @@ -2298,195 +1665,36 @@ Resources\dashboard-ui\bower_components\jstree\dist\themes\default-dark\throbber.gif - - Resources\dashboard-ui\bower_components\jstree\src\intro.js - - - Resources\dashboard-ui\bower_components\jstree\src\jstree.checkbox.js - - - Resources\dashboard-ui\bower_components\jstree\src\jstree.contextmenu.js - - - Resources\dashboard-ui\bower_components\jstree\src\jstree.dnd.js - - - Resources\dashboard-ui\bower_components\jstree\src\jstree.js - - - Resources\dashboard-ui\bower_components\jstree\src\jstree.massload.js - - - Resources\dashboard-ui\bower_components\jstree\src\jstree.search.js - - - Resources\dashboard-ui\bower_components\jstree\src\jstree.sort.js - - - Resources\dashboard-ui\bower_components\jstree\src\jstree.state.js - - - Resources\dashboard-ui\bower_components\jstree\src\jstree.types.js - - - Resources\dashboard-ui\bower_components\jstree\src\jstree.unique.js - - - Resources\dashboard-ui\bower_components\jstree\src\jstree.wholerow.js - - - Resources\dashboard-ui\bower_components\jstree\src\misc.js - - - Resources\dashboard-ui\bower_components\jstree\src\outro.js - - - Resources\dashboard-ui\bower_components\jstree\src\sample.js - - - Resources\dashboard-ui\bower_components\jstree\src\vakata-jstree.js - - - Resources\dashboard-ui\bower_components\jstree\src\themes\base.less - - - Resources\dashboard-ui\bower_components\jstree\src\themes\main.less - - - Resources\dashboard-ui\bower_components\jstree\src\themes\mixins.less - - - Resources\dashboard-ui\bower_components\jstree\src\themes\responsive.less - - - Resources\dashboard-ui\bower_components\jstree\src\themes\default\32px.png - - - Resources\dashboard-ui\bower_components\jstree\src\themes\default\40px.png - - - Resources\dashboard-ui\bower_components\jstree\src\themes\default\style.css - - - Resources\dashboard-ui\bower_components\jstree\src\themes\default\style.less - - - Resources\dashboard-ui\bower_components\jstree\src\themes\default\throbber.gif - - - Resources\dashboard-ui\bower_components\jstree\src\themes\default-dark\32px.png - - - Resources\dashboard-ui\bower_components\jstree\src\themes\default-dark\40px.png - - - Resources\dashboard-ui\bower_components\jstree\src\themes\default-dark\style.css - - - Resources\dashboard-ui\bower_components\jstree\src\themes\default-dark\style.less - - - Resources\dashboard-ui\bower_components\jstree\src\themes\default-dark\throbber.gif - - - Resources\dashboard-ui\bower_components\libjass\.bower.json - - - Resources\dashboard-ui\bower_components\libjass\CHANGELOG.md - Resources\dashboard-ui\bower_components\libjass\LICENSE - - Resources\dashboard-ui\bower_components\libjass\README.md - Resources\dashboard-ui\bower_components\libjass\libjass.css Resources\dashboard-ui\bower_components\libjass\libjass.min.js - - Resources\dashboard-ui\bower_components\libjass\package.json - - - Resources\dashboard-ui\bower_components\query-string\.bower.json - - - Resources\dashboard-ui\bower_components\query-string\.editorconfig - - - Resources\dashboard-ui\bower_components\query-string\.gitattributes - - - Resources\dashboard-ui\bower_components\query-string\.gitignore - - - Resources\dashboard-ui\bower_components\query-string\.jshintrc - - - Resources\dashboard-ui\bower_components\query-string\.travis.yml - Resources\dashboard-ui\bower_components\query-string\index.js Resources\dashboard-ui\bower_components\query-string\license - - Resources\dashboard-ui\bower_components\query-string\package.json - - - Resources\dashboard-ui\bower_components\query-string\readme.md - Resources\dashboard-ui\bower_components\query-string\test.js - - Resources\dashboard-ui\bower_components\query-string\test\extract.js - - - Resources\dashboard-ui\bower_components\query-string\test\parse.js - - - Resources\dashboard-ui\bower_components\query-string\test\stringify.js - - - Resources\dashboard-ui\bower_components\requirejs\.bower.json - Resources\dashboard-ui\bower_components\requirejs\LICENSE - - Resources\dashboard-ui\bower_components\requirejs\README.md - - - Resources\dashboard-ui\bower_components\requirejs\bower.json - Resources\dashboard-ui\bower_components\requirejs\require.js - - Resources\dashboard-ui\bower_components\vibrant\.bower.json - - - Resources\dashboard-ui\bower_components\vibrant\LICENSE.md - - - Resources\dashboard-ui\bower_components\vibrant\README.md - - - Resources\dashboard-ui\bower_components\vibrant\bower.json - Resources\dashboard-ui\bower_components\vibrant\gulpfile.coffee Resources\dashboard-ui\bower_components\vibrant\index.html - - Resources\dashboard-ui\bower_components\vibrant\package.json - Resources\dashboard-ui\bower_components\vibrant\style.css @@ -2499,21 +1707,9 @@ Resources\dashboard-ui\bower_components\vibrant\dist\vibrant.min.js - - Resources\dashboard-ui\bower_components\web-animations-js\.bower.json - Resources\dashboard-ui\bower_components\web-animations-js\COPYING - - Resources\dashboard-ui\bower_components\web-animations-js\History.md - - - Resources\dashboard-ui\bower_components\web-animations-js\README.md - - - Resources\dashboard-ui\bower_components\web-animations-js\bower.json - Resources\dashboard-ui\bower_components\web-animations-js\web-animations-next-lite.min.js @@ -2526,18 +1722,6 @@ Resources\dashboard-ui\bower_components\web-animations-js\web-animations.min.js - - Resources\dashboard-ui\bower_components\webcomponentsjs\.bower.json - - - Resources\dashboard-ui\bower_components\webcomponentsjs\README.md - - - Resources\dashboard-ui\bower_components\webcomponentsjs\bower.json - - - Resources\dashboard-ui\bower_components\webcomponentsjs\package.json - Resources\dashboard-ui\bower_components\webcomponentsjs\webcomponents-lite.min.js From 7fdd180b20fab8a49c89edf64f3bb529e517c5a9 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Thu, 9 Feb 2017 19:38:12 -0500 Subject: [PATCH 54/55] fix merge conflict --- SharedVersion.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/SharedVersion.cs b/SharedVersion.cs index d1a774c2f..7a98bd22e 100644 --- a/SharedVersion.cs +++ b/SharedVersion.cs @@ -1,4 +1,3 @@ using System.Reflection; -//[assembly: AssemblyVersion("3.1.*")] -[assembly: AssemblyVersion("3.2.0")] +[assembly: AssemblyVersion("3.2.1.100")] From 926b7fd42d0738f3afc39d6ab353535bb9fb948c Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Thu, 9 Feb 2017 19:38:58 -0500 Subject: [PATCH 55/55] fix merge conflict --- MediaBrowser.Server.Mac/Emby.Server.Mac.csproj | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/MediaBrowser.Server.Mac/Emby.Server.Mac.csproj b/MediaBrowser.Server.Mac/Emby.Server.Mac.csproj index 7f3baf0c0..f7f084917 100644 --- a/MediaBrowser.Server.Mac/Emby.Server.Mac.csproj +++ b/MediaBrowser.Server.Mac/Emby.Server.Mac.csproj @@ -1569,15 +1569,6 @@ Resources\dashboard-ui\bower_components\font-roboto\roboto.html - - Resources\dashboard-ui\bower_components\hammerjs\changelog.js - - - Resources\dashboard-ui\bower_components\hammerjs\hammer.js - - - Resources\dashboard-ui\bower_components\hammerjs\hammer.min.js - Resources\dashboard-ui\bower_components\headroomjs\LICENSE @@ -1917,6 +1908,9 @@ Resources\dashboard-ui\css\images\logo.png + + Resources\dashboard-ui\css\images\logoblack.png + Resources\dashboard-ui\css\images\mblogoicon.png