From 5392ff4da4794a0c4268baa61572a8cd881db379 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Tue, 7 Jan 2014 13:39:35 -0500 Subject: [PATCH] added a new encoding settings page under advanced --- MediaBrowser.Api/LiveTv/LiveTvService.cs | 27 +++++++++++++------ .../Playback/BaseStreamingService.cs | 15 ++++++++--- .../Playback/Hls/BaseHlsService.cs | 11 +++++++- .../Playback/Progressive/VideoService.cs | 2 ++ MediaBrowser.Api/UserLibrary/ItemsService.cs | 8 +++--- .../WebSocket/LogFileWebSocketListener.cs | 7 ++++- .../LiveTv/ILiveTvManager.cs | 6 +++++ .../Providers/BaseMetadataProvider.cs | 2 +- .../Configuration/ServerConfiguration.cs | 5 +++- .../LiveTv/LiveTvServiceInfo.cs | 18 ++++++++++++- .../Movies/PersonProviderFromXml.cs | 7 +++-- .../LiveTv/LiveTvManager.cs | 14 ++++++++++ .../Api/DashboardService.cs | 1 + MediaBrowser.WebDashboard/ApiClient.js | 11 ++++++++ .../MediaBrowser.WebDashboard.csproj | 6 +++++ MediaBrowser.WebDashboard/packages.config | 2 +- 16 files changed, 116 insertions(+), 26 deletions(-) diff --git a/MediaBrowser.Api/LiveTv/LiveTvService.cs b/MediaBrowser.Api/LiveTv/LiveTvService.cs index e985fb615a..df6d9389b3 100644 --- a/MediaBrowser.Api/LiveTv/LiveTvService.cs +++ b/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 + { + } + 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()); + } } } \ No newline at end of file diff --git a/MediaBrowser.Api/Playback/BaseStreamingService.cs b/MediaBrowser.Api/Playback/BaseStreamingService.cs index ac4b53adf0..dc34fca77c 100644 --- a/MediaBrowser.Api/Playback/BaseStreamingService.cs +++ b/MediaBrowser.Api/Playback/BaseStreamingService.cs @@ -257,10 +257,10 @@ namespace MediaBrowser.Api.Playback /// Gets the number of threads. /// /// System.Int32. - /// Unrecognized EncodingQuality value. + /// Unrecognized MediaEncodingQuality value. 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, diff --git a/MediaBrowser.Api/Playback/Hls/BaseHlsService.cs b/MediaBrowser.Api/Playback/Hls/BaseHlsService.cs index 68342e91d6..9abedde4b4 100644 --- a/MediaBrowser.Api/Playback/Hls/BaseHlsService.cs +++ b/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; diff --git a/MediaBrowser.Api/Playback/Progressive/VideoService.cs b/MediaBrowser.Api/Playback/Progressive/VideoService.cs index f4e4019f67..cdc8e2ffb0 100644 --- a/MediaBrowser.Api/Playback/Progressive/VideoService.cs +++ b/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")] diff --git a/MediaBrowser.Api/UserLibrary/ItemsService.cs b/MediaBrowser.Api/UserLibrary/ItemsService.cs index 464f4ba1ae..202ac293f9 100644 --- a/MediaBrowser.Api/UserLibrary/ItemsService.cs +++ b/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); } diff --git a/MediaBrowser.Api/WebSocket/LogFileWebSocketListener.cs b/MediaBrowser.Api/WebSocket/LogFileWebSocketListener.cs index 07fa0e6100..d057598e3e 100644 --- a/MediaBrowser.Api/WebSocket/LogFileWebSocketListener.cs +++ b/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); + } } } } diff --git a/MediaBrowser.Controller/LiveTv/ILiveTvManager.cs b/MediaBrowser.Controller/LiveTv/ILiveTvManager.cs index ceca14f5bf..d23c8c5554 100644 --- a/MediaBrowser.Controller/LiveTv/ILiveTvManager.cs +++ b/MediaBrowser.Controller/LiveTv/ILiveTvManager.cs @@ -235,5 +235,11 @@ namespace MediaBrowser.Controller.LiveTv /// The cancellation token. /// Task. Task CloseLiveStream(string id, CancellationToken cancellationToken); + + /// + /// Gets the guide information. + /// + /// GuideInfo. + GuideInfo GetGuideInfo(); } } diff --git a/MediaBrowser.Controller/Providers/BaseMetadataProvider.cs b/MediaBrowser.Controller/Providers/BaseMetadataProvider.cs index 67475b3295..3b499b487a 100644 --- a/MediaBrowser.Controller/Providers/BaseMetadataProvider.cs +++ b/MediaBrowser.Controller/Providers/BaseMetadataProvider.cs @@ -45,7 +45,7 @@ namespace MediaBrowser.Controller.Providers protected static readonly Task FalseTaskResult = Task.FromResult(false); - protected static readonly SemaphoreSlim XmlParsingResourcePool = new SemaphoreSlim(5, 5); + protected static readonly SemaphoreSlim XmlParsingResourcePool = new SemaphoreSlim(4, 4); /// /// Supportses the specified item. diff --git a/MediaBrowser.Model/Configuration/ServerConfiguration.cs b/MediaBrowser.Model/Configuration/ServerConfiguration.cs index c8c2054040..02dd909f2b 100644 --- a/MediaBrowser.Model/Configuration/ServerConfiguration.cs +++ b/MediaBrowser.Model/Configuration/ServerConfiguration.cs @@ -207,7 +207,7 @@ namespace MediaBrowser.Model.Configuration /// Gets or sets the encoding quality. /// /// The encoding quality. - 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; } + /// /// Initializes a new instance of the class. /// public ServerConfiguration() : base() { + MediaEncodingQuality = EncodingQuality.HighSpeed; ImageSavingConvention = ImageSavingConvention.Legacy; HttpServerPortNumber = 8096; LegacyWebSocketPortNumber = 8945; diff --git a/MediaBrowser.Model/LiveTv/LiveTvServiceInfo.cs b/MediaBrowser.Model/LiveTv/LiveTvServiceInfo.cs index 87647738f3..a25207509b 100644 --- a/MediaBrowser.Model/LiveTv/LiveTvServiceInfo.cs +++ b/MediaBrowser.Model/LiveTv/LiveTvServiceInfo.cs @@ -1,4 +1,5 @@ - +using System; + namespace MediaBrowser.Model.LiveTv { /// @@ -12,4 +13,19 @@ namespace MediaBrowser.Model.LiveTv /// The name. public string Name { get; set; } } + + public class GuideInfo + { + /// + /// Gets or sets the start date. + /// + /// The start date. + public DateTime StartDate { get; set; } + + /// + /// Gets or sets the end date. + /// + /// The end date. + public DateTime EndDate { get; set; } + } } diff --git a/MediaBrowser.Providers/Movies/PersonProviderFromXml.cs b/MediaBrowser.Providers/Movies/PersonProviderFromXml.cs index 60722f980c..014580025a 100644 --- a/MediaBrowser.Providers/Movies/PersonProviderFromXml.cs +++ b/MediaBrowser.Providers/Movies/PersonProviderFromXml.cs @@ -57,6 +57,7 @@ namespace MediaBrowser.Providers.Movies /// /// The item. /// if set to true [force]. + /// The provider information. /// The cancellation token. /// Task{System.Boolean}. public override async Task 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; } } } diff --git a/MediaBrowser.Server.Implementations/LiveTv/LiveTvManager.cs b/MediaBrowser.Server.Implementations/LiveTv/LiveTvManager.cs index 332cbf0167..d49410b4e3 100644 --- a/MediaBrowser.Server.Implementations/LiveTv/LiveTvManager.cs +++ b/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 + }; + } } } diff --git a/MediaBrowser.WebDashboard/Api/DashboardService.cs b/MediaBrowser.WebDashboard/Api/DashboardService.cs index 5605ce6e7f..c67a90e3e3 100644 --- a/MediaBrowser.WebDashboard/Api/DashboardService.cs +++ b/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", diff --git a/MediaBrowser.WebDashboard/ApiClient.js b/MediaBrowser.WebDashboard/ApiClient.js index be2a342c9b..f2b2d6b7b1 100644 --- a/MediaBrowser.WebDashboard/ApiClient.js +++ b/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) { diff --git a/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj b/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj index cbd53bde9c..7724c02f56 100644 --- a/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj +++ b/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj @@ -160,6 +160,9 @@ PreserveNewest + + PreserveNewest + PreserveNewest @@ -397,6 +400,9 @@ PreserveNewest + + PreserveNewest + PreserveNewest diff --git a/MediaBrowser.WebDashboard/packages.config b/MediaBrowser.WebDashboard/packages.config index 4932cd5c18..3bb7e71050 100644 --- a/MediaBrowser.WebDashboard/packages.config +++ b/MediaBrowser.WebDashboard/packages.config @@ -1,4 +1,4 @@  - + \ No newline at end of file