Переглянути джерело

added a new encoding settings page under advanced

Luke Pulverenti 11 роки тому
батько
коміт
5392ff4da4

+ 19 - 8
MediaBrowser.Api/LiveTv/LiveTvService.cs

@@ -120,16 +120,16 @@ namespace MediaBrowser.Api.LiveTv
         [ApiMember(Name = "UserId", Description = "Optional filter by user id.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
         public string UserId { get; set; }
 
-        [ApiMember(Name = "MinStartDate", Description = "Optional. The minimum premiere date. Format = yyyyMMddHHmmss", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "POST")]
+        [ApiMember(Name = "MinStartDate", Description = "Optional. The minimum premiere date. Format = ISO", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "POST")]
         public string MinStartDate { get; set; }
 
-        [ApiMember(Name = "MaxStartDate", Description = "Optional. The maximum premiere date. Format = yyyyMMddHHmmss", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "POST")]
+        [ApiMember(Name = "MaxStartDate", Description = "Optional. The maximum premiere date. Format = ISO", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "POST")]
         public string MaxStartDate { get; set; }
 
-        [ApiMember(Name = "MinEndDate", Description = "Optional. The minimum premiere date. Format = yyyyMMddHHmmss", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "POST")]
+        [ApiMember(Name = "MinEndDate", Description = "Optional. The minimum premiere date. Format = ISO", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "POST")]
         public string MinEndDate { get; set; }
 
-        [ApiMember(Name = "MaxEndDate", Description = "Optional. The maximum premiere date. Format = yyyyMMddHHmmss", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "POST")]
+        [ApiMember(Name = "MaxEndDate", Description = "Optional. The maximum premiere date. Format = ISO", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "POST")]
         public string MaxEndDate { get; set; }
     }
 
@@ -215,6 +215,12 @@ namespace MediaBrowser.Api.LiveTv
         public string Id { get; set; }
     }
 
+    [Route("/LiveTv/GuideInfo", "GET")]
+    [Api(Description = "Gets guide info")]
+    public class GetGuideInfo : IReturn<GuideInfo>
+    {
+    }
+
     public class LiveTvService : BaseApiService
     {
         private readonly ILiveTvManager _liveTvManager;
@@ -274,22 +280,22 @@ namespace MediaBrowser.Api.LiveTv
 
             if (!string.IsNullOrEmpty(request.MinStartDate))
             {
-                query.MinStartDate = DateTime.ParseExact(request.MinStartDate, "yyyyMMddHHmmss", CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal);
+                query.MinStartDate = DateTime.Parse(request.MinStartDate, null, DateTimeStyles.RoundtripKind).ToUniversalTime();
             }
 
             if (!string.IsNullOrEmpty(request.MinEndDate))
             {
-                query.MinEndDate = DateTime.ParseExact(request.MinEndDate, "yyyyMMddHHmmss", CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal);
+                query.MinEndDate = DateTime.Parse(request.MinEndDate, null, DateTimeStyles.RoundtripKind).ToUniversalTime();
             }
 
             if (!string.IsNullOrEmpty(request.MaxStartDate))
             {
-                query.MaxStartDate = DateTime.ParseExact(request.MaxStartDate, "yyyyMMddHHmmss", CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal);
+                query.MaxStartDate = DateTime.Parse(request.MaxStartDate, null, DateTimeStyles.RoundtripKind).ToUniversalTime();
             }
 
             if (!string.IsNullOrEmpty(request.MaxEndDate))
             {
-                query.MaxEndDate = DateTime.ParseExact(request.MaxEndDate, "yyyyMMddHHmmss", CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal);
+                query.MaxEndDate = DateTime.Parse(request.MaxEndDate, null, DateTimeStyles.RoundtripKind).ToUniversalTime();
             }
 
             var result = _liveTvManager.GetPrograms(query, CancellationToken.None).Result;
@@ -453,5 +459,10 @@ namespace MediaBrowser.Api.LiveTv
 
             return ToOptimizedResult(group);
         }
+
+        public object Get(GetGuideInfo request)
+        {
+            return ToOptimizedResult(_liveTvManager.GetGuideInfo());
+        }
     }
 }

+ 11 - 4
MediaBrowser.Api/Playback/BaseStreamingService.cs

@@ -257,10 +257,10 @@ namespace MediaBrowser.Api.Playback
         /// Gets the number of threads.
         /// </summary>
         /// <returns>System.Int32.</returns>
-        /// <exception cref="System.Exception">Unrecognized EncodingQuality value.</exception>
+        /// <exception cref="System.Exception">Unrecognized MediaEncodingQuality value.</exception>
         protected int GetNumberOfThreads()
         {
-            var quality = ServerConfigurationManager.Configuration.EncodingQuality;
+            var quality = ServerConfigurationManager.Configuration.MediaEncodingQuality;
 
             switch (quality)
             {
@@ -273,7 +273,7 @@ namespace MediaBrowser.Api.Playback
                 case EncodingQuality.MaxQuality:
                     return 0;
                 default:
-                    throw new Exception("Unrecognized EncodingQuality value.");
+                    throw new Exception("Unrecognized MediaEncodingQuality value.");
             }
         }
 
@@ -706,6 +706,13 @@ namespace MediaBrowser.Api.Playback
                 state.IsoMount = await IsoManager.Mount(state.MediaPath, CancellationToken.None).ConfigureAwait(false);
             }
 
+            var commandLineArgs = GetCommandLineArguments(outputPath, state, true);
+
+            if (ServerConfigurationManager.Configuration.EnableDebugEncodingLogging)
+            {
+                commandLineArgs = "-loglevel debug " + commandLineArgs;
+            }
+
             var process = new Process
             {
                 StartInfo = new ProcessStartInfo
@@ -719,7 +726,7 @@ namespace MediaBrowser.Api.Playback
 
                     FileName = MediaEncoder.EncoderPath,
                     WorkingDirectory = Path.GetDirectoryName(MediaEncoder.EncoderPath),
-                    Arguments = GetCommandLineArguments(outputPath, state, true),
+                    Arguments = commandLineArgs,
 
                     WindowStyle = ProcessWindowStyle.Hidden,
                     ErrorDialog = false,

+ 10 - 1
MediaBrowser.Api/Playback/Hls/BaseHlsService.cs

@@ -7,6 +7,7 @@ using MediaBrowser.Controller.Dto;
 using MediaBrowser.Controller.Library;
 using MediaBrowser.Controller.LiveTv;
 using MediaBrowser.Controller.Persistence;
+using MediaBrowser.Model.Configuration;
 using MediaBrowser.Model.Dto;
 using MediaBrowser.Model.IO;
 using System;
@@ -111,7 +112,15 @@ namespace MediaBrowser.Api.Playback.Hls
 
             if (isPlaylistNewlyCreated)
             {
-                await WaitForMinimumSegmentCount(playlist, 3).ConfigureAwait(false);
+                var minimumSegmentCount = 3;
+                var quality = ServerConfigurationManager.Configuration.MediaEncodingQuality;
+
+                if (quality == EncodingQuality.HighSpeed || quality == EncodingQuality.HighQuality)
+                {
+                    minimumSegmentCount = 2;
+                }
+
+                await WaitForMinimumSegmentCount(playlist, minimumSegmentCount).ConfigureAwait(false);
             }
 
             int audioBitrate;

+ 2 - 0
MediaBrowser.Api/Playback/Progressive/VideoService.cs

@@ -29,6 +29,7 @@ namespace MediaBrowser.Api.Playback.Progressive
     [Route("/Videos/{Id}/stream.m2ts", "GET")]
     [Route("/Videos/{Id}/stream.3gp", "GET")]
     [Route("/Videos/{Id}/stream.wmv", "GET")]
+    [Route("/Videos/{Id}/stream.wtv", "GET")]
     [Route("/Videos/{Id}/stream", "GET")]
     [Route("/Videos/{Id}/stream.ts", "HEAD")]
     [Route("/Videos/{Id}/stream.webm", "HEAD")]
@@ -42,6 +43,7 @@ namespace MediaBrowser.Api.Playback.Progressive
     [Route("/Videos/{Id}/stream.avi", "HEAD")]
     [Route("/Videos/{Id}/stream.3gp", "HEAD")]
     [Route("/Videos/{Id}/stream.wmv", "HEAD")]
+    [Route("/Videos/{Id}/stream.wtv", "HEAD")]
     [Route("/Videos/{Id}/stream.m2ts", "HEAD")]
     [Route("/Videos/{Id}/stream", "HEAD")]
     [Api(Description = "Gets a video stream")]

+ 4 - 4
MediaBrowser.Api/UserLibrary/ItemsService.cs

@@ -196,10 +196,10 @@ namespace MediaBrowser.Api.UserLibrary
         [ApiMember(Name = "AiredDuringSeason", Description = "Gets all episodes that aired during a season, including specials.", IsRequired = false, DataType = "int", ParameterType = "query", Verb = "GET")]
         public int? AiredDuringSeason { get; set; }
 
-        [ApiMember(Name = "MinPremiereDate", Description = "Optional. The minimum premiere date. Format = yyyyMMddHHmmss", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "POST")]
+        [ApiMember(Name = "MinPremiereDate", Description = "Optional. The minimum premiere date. Format = ISO", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "POST")]
         public string MinPremiereDate { get; set; }
 
-        [ApiMember(Name = "MaxPremiereDate", Description = "Optional. The maximum premiere date. Format = yyyyMMddHHmmss", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "POST")]
+        [ApiMember(Name = "MaxPremiereDate", Description = "Optional. The maximum premiere date. Format = ISO", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "POST")]
         public string MaxPremiereDate { get; set; }
 
         [ApiMember(Name = "HasOverview", Description = "Optional filter by items that have an overview or not.", IsRequired = false, DataType = "bool", ParameterType = "query", Verb = "GET")]
@@ -1031,14 +1031,14 @@ namespace MediaBrowser.Api.UserLibrary
 
             if (!string.IsNullOrEmpty(request.MinPremiereDate))
             {
-                var date = DateTime.ParseExact(request.MinPremiereDate, "yyyyMMddHHmmss", CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal);
+                var date = DateTime.Parse(request.MinPremiereDate, null, DateTimeStyles.RoundtripKind).ToUniversalTime();
 
                 items = items.Where(i => i.PremiereDate.HasValue && i.PremiereDate.Value >= date);
             }
 
             if (!string.IsNullOrEmpty(request.MaxPremiereDate))
             {
-                var date = DateTime.ParseExact(request.MaxPremiereDate, "yyyyMMddHHmmss", CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal);
+                var date = DateTime.Parse(request.MaxPremiereDate, null, DateTimeStyles.RoundtripKind).ToUniversalTime();
 
                 items = items.Where(i => i.PremiereDate.HasValue && i.PremiereDate.Value <= date);
             }

+ 6 - 1
MediaBrowser.Api/WebSocket/LogFileWebSocketListener.cs

@@ -109,7 +109,12 @@ namespace MediaBrowser.Api.WebSocket
                 {
                     while (!reader.EndOfStream)
                     {
-                        lines.Add(await reader.ReadLineAsync().ConfigureAwait(false));
+                        var line = await reader.ReadLineAsync().ConfigureAwait(false);
+
+                        if (line.IndexOf(", Debug,", StringComparison.OrdinalIgnoreCase) == -1)
+                        {
+                            lines.Add(line);
+                        }
                     }
                 }
             }

+ 6 - 0
MediaBrowser.Controller/LiveTv/ILiveTvManager.cs

@@ -235,5 +235,11 @@ namespace MediaBrowser.Controller.LiveTv
         /// <param name="cancellationToken">The cancellation token.</param>
         /// <returns>Task.</returns>
         Task CloseLiveStream(string id, CancellationToken cancellationToken);
+
+        /// <summary>
+        /// Gets the guide information.
+        /// </summary>
+        /// <returns>GuideInfo.</returns>
+        GuideInfo GetGuideInfo();
     }
 }

+ 1 - 1
MediaBrowser.Controller/Providers/BaseMetadataProvider.cs

@@ -45,7 +45,7 @@ namespace MediaBrowser.Controller.Providers
 
         protected static readonly Task<bool> FalseTaskResult = Task.FromResult(false);
 
-        protected static readonly SemaphoreSlim XmlParsingResourcePool = new SemaphoreSlim(5, 5);
+        protected static readonly SemaphoreSlim XmlParsingResourcePool = new SemaphoreSlim(4, 4);
 
         /// <summary>
         /// Supportses the specified item.

+ 4 - 1
MediaBrowser.Model/Configuration/ServerConfiguration.cs

@@ -207,7 +207,7 @@ namespace MediaBrowser.Model.Configuration
         /// Gets or sets the encoding quality.
         /// </summary>
         /// <value>The encoding quality.</value>
-        public EncodingQuality EncodingQuality { get; set; }
+        public EncodingQuality MediaEncodingQuality { get; set; }
 
         public bool EnableMovieChapterImageExtraction { get; set; }
         public bool EnableEpisodeChapterImageExtraction { get; set; }
@@ -219,12 +219,15 @@ namespace MediaBrowser.Model.Configuration
         public MetadataOptions GameOptions { get; set; }
         public MetadataOptions BookOptions { get; set; }
 
+        public bool EnableDebugEncodingLogging { get; set; }
+
         /// <summary>
         /// Initializes a new instance of the <see cref="ServerConfiguration" /> class.
         /// </summary>
         public ServerConfiguration()
             : base()
         {
+            MediaEncodingQuality = EncodingQuality.HighSpeed;
             ImageSavingConvention = ImageSavingConvention.Legacy;
             HttpServerPortNumber = 8096;
             LegacyWebSocketPortNumber = 8945;

+ 17 - 1
MediaBrowser.Model/LiveTv/LiveTvServiceInfo.cs

@@ -1,4 +1,5 @@
-
+using System;
+
 namespace MediaBrowser.Model.LiveTv
 {
     /// <summary>
@@ -12,4 +13,19 @@ namespace MediaBrowser.Model.LiveTv
         /// <value>The name.</value>
         public string Name { get; set; }
     }
+
+    public class GuideInfo
+    {
+        /// <summary>
+        /// Gets or sets the start date.
+        /// </summary>
+        /// <value>The start date.</value>
+        public DateTime StartDate { get; set; }
+
+        /// <summary>
+        /// Gets or sets the end date.
+        /// </summary>
+        /// <value>The end date.</value>
+        public DateTime EndDate { get; set; }
+    }
 }

+ 3 - 4
MediaBrowser.Providers/Movies/PersonProviderFromXml.cs

@@ -57,6 +57,7 @@ namespace MediaBrowser.Providers.Movies
         /// </summary>
         /// <param name="item">The item.</param>
         /// <param name="force">if set to <c>true</c> [force].</param>
+        /// <param name="providerInfo">The provider information.</param>
         /// <param name="cancellationToken">The cancellation token.</param>
         /// <returns>Task{System.Boolean}.</returns>
         public override async Task<bool> FetchAsync(BaseItem item, bool force, BaseProviderInfo providerInfo, CancellationToken cancellationToken)
@@ -79,12 +80,10 @@ namespace MediaBrowser.Providers.Movies
                 {
                     XmlParsingResourcePool.Release();
                 }
-
-                SetLastRefreshed(item, DateTime.UtcNow, providerInfo);
-                return true;
             }
 
-            return false;
+            SetLastRefreshed(item, DateTime.UtcNow, providerInfo);
+            return true;
         }
     }
 }

+ 14 - 0
MediaBrowser.Server.Implementations/LiveTv/LiveTvManager.cs

@@ -980,5 +980,19 @@ namespace MediaBrowser.Server.Implementations.LiveTv
         {
             return ActiveService.CloseLiveStream(id, cancellationToken);
         }
+
+        public GuideInfo GetGuideInfo()
+        {
+            var programs = _programs.ToList();
+
+            var startDate = programs.Select(i => i.Value.ProgramInfo.StartDate).Min();
+            var endDate = programs.Select(i => i.Value.ProgramInfo.StartDate).Max();
+
+            return new GuideInfo
+            {
+                StartDate = startDate,
+                EndDate = endDate
+            };
+        }
     }
 }

+ 1 - 0
MediaBrowser.WebDashboard/Api/DashboardService.cs

@@ -481,6 +481,7 @@ namespace MediaBrowser.WebDashboard.Api
                                       "edititemmetadata.js",
                                       "edititempeople.js",
                                       "edititemimages.js",
+                                      "encodingsettings.js",
                                       "gamesrecommendedpage.js",
                                       "gamesystemspage.js",
                                       "gamespage.js",

+ 11 - 0
MediaBrowser.WebDashboard/ApiClient.js

@@ -389,6 +389,17 @@ MediaBrowser.ApiClient = function ($, navigator, JSON, WebSocket, setTimeout, wi
             });
         };
 
+        self.getLiveTvGuideInfo = function (options) {
+
+            var url = self.getUrl("LiveTv/GuideInfo", options || {});
+
+            return self.ajax({
+                type: "GET",
+                url: url,
+                dataType: "json"
+            });
+        };
+
         self.getLiveTvChannel = function (id, userId) {
 
             if (!id) {

+ 6 - 0
MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj

@@ -160,6 +160,9 @@
     <Content Include="dashboard-ui\css\mediaplayer.css">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
+    <Content Include="dashboard-ui\encodingsettings.html">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
     <Content Include="dashboard-ui\livetvchannel.html">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
@@ -397,6 +400,9 @@
     <Content Include="dashboard-ui\scripts\appsplayback.js">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
+    <Content Include="dashboard-ui\scripts\encodingsettings.js">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
     <Content Include="dashboard-ui\scripts\librarymenu.js">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>

+ 1 - 1
MediaBrowser.WebDashboard/packages.config

@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
 <packages>
-  <package id="MediaBrowser.ApiClient.Javascript" version="3.0.218" targetFramework="net45" />
+  <package id="MediaBrowser.ApiClient.Javascript" version="3.0.219" targetFramework="net45" />
 </packages>