From 853dbfc558e271d2287ff30c774884072ee1aa6e Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Thu, 29 Dec 2016 02:14:59 -0500 Subject: [PATCH 001/111] separate player selection into it's own script --- .../IO/FileRefresher.cs | 7 ++--- .../Library/LibraryManager.cs | 24 ----------------- .../Chapters/IChapterManager.cs | 6 ----- .../Entities/CollectionFolder.cs | 1 - .../Configuration/ChapterOptions.cs | 11 -------- .../Configuration/LibraryOptions.cs | 1 - .../Configuration/ServerConfiguration.cs | 14 ---------- MediaBrowser.Model/MediaBrowser.Model.csproj | 1 - .../Chapters/ChapterManager.cs | 20 -------------- .../Manager/ProviderManager.cs | 26 +++++++------------ .../MediaInfo/FFProbeVideoInfo.cs | 2 +- .../MediaBrowser.WebDashboard.csproj | 3 +++ 12 files changed, 18 insertions(+), 98 deletions(-) delete mode 100644 MediaBrowser.Model/Configuration/ChapterOptions.cs diff --git a/Emby.Server.Implementations/IO/FileRefresher.cs b/Emby.Server.Implementations/IO/FileRefresher.cs index 39033249fd..d7f2ffa431 100644 --- a/Emby.Server.Implementations/IO/FileRefresher.cs +++ b/Emby.Server.Implementations/IO/FileRefresher.cs @@ -261,10 +261,11 @@ namespace Emby.Server.Implementations.IO // In order to determine if the file is being written to, we have to request write access // But if the server only has readonly access, this is going to cause this entire algorithm to fail // So we'll take a best guess about our access level - var requestedFileAccess = ConfigurationManager.Configuration.SaveLocalMeta - ? FileAccessMode.ReadWrite - : FileAccessMode.Read; + //var requestedFileAccess = ConfigurationManager.Configuration.SaveLocalMeta + // ? FileAccessMode.ReadWrite + // : FileAccessMode.Read; + var requestedFileAccess = FileAccessMode.Read; try { using (_fileSystem.GetFileStream(path, FileOpenMode.Open, requestedFileAccess, FileShareMode.ReadWrite)) diff --git a/Emby.Server.Implementations/Library/LibraryManager.cs b/Emby.Server.Implementations/Library/LibraryManager.cs index 4c788a2abe..4dd6cd3032 100644 --- a/Emby.Server.Implementations/Library/LibraryManager.cs +++ b/Emby.Server.Implementations/Library/LibraryManager.cs @@ -1956,30 +1956,6 @@ namespace Emby.Server.Implementations.Library var options = collectionFolder == null ? new LibraryOptions() : collectionFolder.GetLibraryOptions(); - if (options.SchemaVersion < 3) - { - options.SaveLocalMetadata = ConfigurationManager.Configuration.SaveLocalMeta; - options.EnableInternetProviders = ConfigurationManager.Configuration.EnableInternetProviders; - } - - if (options.SchemaVersion < 2) - { - var chapterOptions = ConfigurationManager.GetConfiguration("chapters"); - options.ExtractChapterImagesDuringLibraryScan = chapterOptions.ExtractDuringLibraryScan; - - if (collectionFolder != null) - { - if (string.Equals(collectionFolder.CollectionType, "movies", StringComparison.OrdinalIgnoreCase)) - { - options.EnableChapterImageExtraction = chapterOptions.EnableMovieChapterImageExtraction; - } - else if (string.Equals(collectionFolder.CollectionType, CollectionType.TvShows, StringComparison.OrdinalIgnoreCase)) - { - options.EnableChapterImageExtraction = chapterOptions.EnableEpisodeChapterImageExtraction; - } - } - } - return options; } diff --git a/MediaBrowser.Controller/Chapters/IChapterManager.cs b/MediaBrowser.Controller/Chapters/IChapterManager.cs index 4b39e66cc2..05517ebcd4 100644 --- a/MediaBrowser.Controller/Chapters/IChapterManager.cs +++ b/MediaBrowser.Controller/Chapters/IChapterManager.cs @@ -26,11 +26,5 @@ namespace MediaBrowser.Controller.Chapters /// The cancellation token. /// Task. Task SaveChapters(string itemId, List chapters, CancellationToken cancellationToken); - - /// - /// Gets the configuration. - /// - /// ChapterOptions. - ChapterOptions GetConfiguration(); } } diff --git a/MediaBrowser.Controller/Entities/CollectionFolder.cs b/MediaBrowser.Controller/Entities/CollectionFolder.cs index 681f16f07c..62ea21a798 100644 --- a/MediaBrowser.Controller/Entities/CollectionFolder.cs +++ b/MediaBrowser.Controller/Entities/CollectionFolder.cs @@ -121,7 +121,6 @@ namespace MediaBrowser.Controller.Entities { LibraryOptions[path] = options; - options.SchemaVersion = 3; XmlSerializer.SerializeToFile(options, GetLibraryOptionsPath(path)); } } diff --git a/MediaBrowser.Model/Configuration/ChapterOptions.cs b/MediaBrowser.Model/Configuration/ChapterOptions.cs deleted file mode 100644 index 1c2b0c5276..0000000000 --- a/MediaBrowser.Model/Configuration/ChapterOptions.cs +++ /dev/null @@ -1,11 +0,0 @@ -namespace MediaBrowser.Model.Configuration -{ - public class ChapterOptions - { - public bool EnableMovieChapterImageExtraction { get; set; } - public bool EnableEpisodeChapterImageExtraction { get; set; } - public bool EnableOtherVideoChapterImageExtraction { get; set; } - - public bool ExtractDuringLibraryScan { get; set; } - } -} \ No newline at end of file diff --git a/MediaBrowser.Model/Configuration/LibraryOptions.cs b/MediaBrowser.Model/Configuration/LibraryOptions.cs index e79253d190..8e344f76e6 100644 --- a/MediaBrowser.Model/Configuration/LibraryOptions.cs +++ b/MediaBrowser.Model/Configuration/LibraryOptions.cs @@ -5,7 +5,6 @@ public bool EnableArchiveMediaFiles { get; set; } public bool EnablePhotos { get; set; } public bool EnableRealtimeMonitor { get; set; } - public int SchemaVersion { get; set; } public bool EnableChapterImageExtraction { get; set; } public bool ExtractChapterImagesDuringLibraryScan { get; set; } public bool DownloadImagesInAdvance { get; set; } diff --git a/MediaBrowser.Model/Configuration/ServerConfiguration.cs b/MediaBrowser.Model/Configuration/ServerConfiguration.cs index 22713b94fe..bd0a53cc03 100644 --- a/MediaBrowser.Model/Configuration/ServerConfiguration.cs +++ b/MediaBrowser.Model/Configuration/ServerConfiguration.cs @@ -54,12 +54,6 @@ namespace MediaBrowser.Model.Configuration /// The value pointing to the file system where the ssl certiifcate is located.. public string CertificatePath { get; set; } - /// - /// Gets or sets a value indicating whether [enable internet providers]. - /// - /// true if [enable internet providers]; otherwise, false. - public bool EnableInternetProviders { get; set; } - /// /// Gets or sets a value indicating whether this instance is port authorized. /// @@ -87,12 +81,6 @@ namespace MediaBrowser.Model.Configuration /// The display name of the season zero. public string SeasonZeroDisplayName { get; set; } - /// - /// Gets or sets a value indicating whether [save local meta]. - /// - /// true if [save local meta]; otherwise, false. - public bool SaveLocalMeta { get; set; } - /// /// Gets or sets the preferred metadata language. /// @@ -243,8 +231,6 @@ namespace MediaBrowser.Model.Configuration LibraryMonitorDelay = 60; - EnableInternetProviders = true; - PathSubstitutions = new PathSubstitution[] { }; ContentTypes = new NameValuePair[] { }; diff --git a/MediaBrowser.Model/MediaBrowser.Model.csproj b/MediaBrowser.Model/MediaBrowser.Model.csproj index f36519e27b..4457c6dc2b 100644 --- a/MediaBrowser.Model/MediaBrowser.Model.csproj +++ b/MediaBrowser.Model/MediaBrowser.Model.csproj @@ -78,7 +78,6 @@ - diff --git a/MediaBrowser.Providers/Chapters/ChapterManager.cs b/MediaBrowser.Providers/Chapters/ChapterManager.cs index 87aaafb39f..5fea2c3cdb 100644 --- a/MediaBrowser.Providers/Chapters/ChapterManager.cs +++ b/MediaBrowser.Providers/Chapters/ChapterManager.cs @@ -43,25 +43,5 @@ namespace MediaBrowser.Providers.Chapters { return _itemRepo.SaveChapters(new Guid(itemId), chapters, cancellationToken); } - - public ChapterOptions GetConfiguration() - { - return _config.GetConfiguration("chapters"); - } - } - - public class ChapterConfigurationStore : IConfigurationFactory - { - public IEnumerable GetConfigurations() - { - return new List - { - new ConfigurationStore - { - Key = "chapters", - ConfigurationType = typeof (ChapterOptions) - } - }; - } } } diff --git a/MediaBrowser.Providers/Manager/ProviderManager.cs b/MediaBrowser.Providers/Manager/ProviderManager.cs index a2f3d04596..a645ab55f9 100644 --- a/MediaBrowser.Providers/Manager/ProviderManager.cs +++ b/MediaBrowser.Providers/Manager/ProviderManager.cs @@ -510,25 +510,19 @@ namespace MediaBrowser.Providers.Manager Type = MetadataPluginType.LocalMetadataProvider })); - if (item.IsInternetMetadataEnabled()) + // Fetchers + list.AddRange(providers.Where(i => (i is IRemoteMetadataProvider)).Select(i => new MetadataPlugin { - // Fetchers - list.AddRange(providers.Where(i => (i is IRemoteMetadataProvider)).Select(i => new MetadataPlugin - { - Name = i.Name, - Type = MetadataPluginType.MetadataFetcher - })); - } + Name = i.Name, + Type = MetadataPluginType.MetadataFetcher + })); - if (item.IsSaveLocalMetadataEnabled()) + // Savers + list.AddRange(_savers.Where(i => IsSaverEnabledForItem(i, item, ItemUpdateType.MetadataEdit, true)).OrderBy(i => i.Name).Select(i => new MetadataPlugin { - // Savers - list.AddRange(_savers.Where(i => IsSaverEnabledForItem(i, item, ItemUpdateType.MetadataEdit, true)).OrderBy(i => i.Name).Select(i => new MetadataPlugin - { - Name = i.Name, - Type = MetadataPluginType.MetadataSaver - })); - } + Name = i.Name, + Type = MetadataPluginType.MetadataSaver + })); } private void AddImagePlugins(List list, T item, List imageProviders) diff --git a/MediaBrowser.Providers/MediaInfo/FFProbeVideoInfo.cs b/MediaBrowser.Providers/MediaInfo/FFProbeVideoInfo.cs index c1bae4b3cb..c4ea13063e 100644 --- a/MediaBrowser.Providers/MediaInfo/FFProbeVideoInfo.cs +++ b/MediaBrowser.Providers/MediaInfo/FFProbeVideoInfo.cs @@ -417,7 +417,7 @@ namespace MediaBrowser.Providers.MediaInfo } if (!string.IsNullOrWhiteSpace(data.Name)) { - if (string.IsNullOrWhiteSpace(video.Name) || string.Equals(video.Name, Path.GetFileNameWithoutExtension(video.Path), StringComparison.OrdinalIgnoreCase)) + if (string.IsNullOrWhiteSpace(video.Name) || (string.Equals(video.Name, Path.GetFileNameWithoutExtension(video.Path), StringComparison.OrdinalIgnoreCase) && !video.ProviderIds.Any())) { // Don't use the embedded name for extras because it will often be the same name as the movie if (!video.ExtraType.HasValue && !video.IsOwnedItem) diff --git a/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj b/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj index 0a67cbdb06..37ee31df1f 100644 --- a/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj +++ b/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj @@ -156,6 +156,9 @@ PreserveNewest + + PreserveNewest + PreserveNewest From 72887a1f6b6abc63f4a412d109241dc5b2ab6a54 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Thu, 29 Dec 2016 14:26:45 -0500 Subject: [PATCH 002/111] specify input codecs --- MediaBrowser.Api/Playback/BaseStreamingService.cs | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/MediaBrowser.Api/Playback/BaseStreamingService.cs b/MediaBrowser.Api/Playback/BaseStreamingService.cs index 7f568183e3..a768d0cc41 100644 --- a/MediaBrowser.Api/Playback/BaseStreamingService.cs +++ b/MediaBrowser.Api/Playback/BaseStreamingService.cs @@ -2691,6 +2691,18 @@ namespace MediaBrowser.Api.Playback { //inputModifier += " -noaccurate_seek"; } + + var videoStream = state.VideoStream; + if (videoStream != null && !string.IsNullOrWhiteSpace(videoStream.Codec)) + { + inputModifier += " -codec:0 " + videoStream.Codec; + + var audioStream = state.AudioStream; + if (audioStream != null && !string.IsNullOrWhiteSpace(audioStream.Codec)) + { + inputModifier += " -codec:1 " + audioStream.Codec; + } + } } return inputModifier; From 845895eae4ca8cc0ef64c00397a2c6c3c00c792e Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Thu, 29 Dec 2016 14:27:14 -0500 Subject: [PATCH 003/111] don't use tmp file --- MediaBrowser.Api/Playback/Hls/BaseHlsService.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/MediaBrowser.Api/Playback/Hls/BaseHlsService.cs b/MediaBrowser.Api/Playback/Hls/BaseHlsService.cs index 84f3955185..17a0eeb8ef 100644 --- a/MediaBrowser.Api/Playback/Hls/BaseHlsService.cs +++ b/MediaBrowser.Api/Playback/Hls/BaseHlsService.cs @@ -223,6 +223,7 @@ namespace MediaBrowser.Api.Playback.Hls protected Stream GetPlaylistFileStream(string path) { var tmpPath = path + ".tmp"; + tmpPath = path; try { From 9da48106c893bf179a00db7dadbb74f513277263 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Thu, 29 Dec 2016 16:50:53 -0500 Subject: [PATCH 004/111] update logging --- .../Encoder/MediaEncoder.cs | 22 ++++++++++--------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/MediaBrowser.MediaEncoding/Encoder/MediaEncoder.cs b/MediaBrowser.MediaEncoding/Encoder/MediaEncoder.cs index 89730a11fd..c26664921e 100644 --- a/MediaBrowser.MediaEncoding/Encoder/MediaEncoder.cs +++ b/MediaBrowser.MediaEncoding/Encoder/MediaEncoder.cs @@ -533,8 +533,10 @@ namespace MediaBrowser.MediaEncoding.Encoder probeSize = probeSize + " " + analyzeDuration; probeSize = probeSize.Trim(); + var forceEnableLogging = request.Protocol != MediaProtocol.File; + return GetMediaInfoInternal(GetInputArgument(inputFiles, request.Protocol), request.InputPath, request.Protocol, extractChapters, - probeSize, request.MediaType == DlnaProfileType.Audio, request.VideoType, cancellationToken); + probeSize, request.MediaType == DlnaProfileType.Audio, request.VideoType, forceEnableLogging, cancellationToken); } /// @@ -577,14 +579,6 @@ namespace MediaBrowser.MediaEncoding.Encoder /// /// Gets the media info internal. /// - /// The input path. - /// The primary path. - /// The protocol. - /// if set to true [extract chapters]. - /// The probe size argument. - /// if set to true [is audio]. - /// Type of the video. - /// The cancellation token. /// Task{MediaInfoResult}. private async Task GetMediaInfoInternal(string inputPath, string primaryPath, @@ -593,6 +587,7 @@ namespace MediaBrowser.MediaEncoding.Encoder string probeSizeArgument, bool isAudio, VideoType videoType, + bool forceEnableLogging, CancellationToken cancellationToken) { var args = extractChapters @@ -614,7 +609,14 @@ namespace MediaBrowser.MediaEncoding.Encoder EnableRaisingEvents = true }); - _logger.Debug("{0} {1}", process.StartInfo.FileName, process.StartInfo.Arguments); + if (forceEnableLogging) + { + _logger.Info("{0} {1}", process.StartInfo.FileName, process.StartInfo.Arguments); + } + else + { + _logger.Debug("{0} {1}", process.StartInfo.FileName, process.StartInfo.Arguments); + } using (var processWrapper = new ProcessWrapper(process, this, _logger)) { From b8f57f586b218558bcb45259d65dfe990e593559 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Fri, 30 Dec 2016 00:55:46 -0500 Subject: [PATCH 005/111] update stream specifiers --- .../Playback/BaseStreamingService.cs | 26 +++++++++++++------ 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/MediaBrowser.Api/Playback/BaseStreamingService.cs b/MediaBrowser.Api/Playback/BaseStreamingService.cs index a768d0cc41..dc137521c8 100644 --- a/MediaBrowser.Api/Playback/BaseStreamingService.cs +++ b/MediaBrowser.Api/Playback/BaseStreamingService.cs @@ -1975,7 +1975,7 @@ namespace MediaBrowser.Api.Playback if (state.OutputVideoBitrate.HasValue && !string.Equals(state.OutputVideoCodec, "copy", StringComparison.OrdinalIgnoreCase)) { var resolution = ResolutionNormalizer.Normalize( - state.VideoStream == null ? (int?) null : state.VideoStream.BitRate, + state.VideoStream == null ? (int?)null : state.VideoStream.BitRate, state.OutputVideoBitrate.Value, state.VideoStream == null ? null : state.VideoStream.Codec, state.OutputVideoCodec, @@ -2692,17 +2692,27 @@ namespace MediaBrowser.Api.Playback //inputModifier += " -noaccurate_seek"; } - var videoStream = state.VideoStream; - if (videoStream != null && !string.IsNullOrWhiteSpace(videoStream.Codec)) + foreach (var stream in state.MediaSource.MediaStreams) { - inputModifier += " -codec:0 " + videoStream.Codec; - - var audioStream = state.AudioStream; - if (audioStream != null && !string.IsNullOrWhiteSpace(audioStream.Codec)) + if (!stream.IsExternal && stream.Type != MediaStreamType.Subtitle) { - inputModifier += " -codec:1 " + audioStream.Codec; + if (!string.IsNullOrWhiteSpace(stream.Codec) && stream.Index != -1) + { + inputModifier += " -codec:" + stream.Index.ToString(UsCulture) + " " + stream.Codec; + } } } + //var videoStream = state.VideoStream; + //if (videoStream != null && !string.IsNullOrWhiteSpace(videoStream.Codec)) + //{ + // inputModifier += " -codec:0 " + videoStream.Codec; + + // var audioStream = state.AudioStream; + // if (audioStream != null && !string.IsNullOrWhiteSpace(audioStream.Codec)) + // { + // inputModifier += " -codec:1 " + audioStream.Codec; + // } + //} } return inputModifier; From 4f053a2b08e08c07332746cb0227751c7760f031 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Fri, 30 Dec 2016 00:57:36 -0500 Subject: [PATCH 006/111] 3.1.266 --- SharedVersion.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SharedVersion.cs b/SharedVersion.cs index c082f56642..ab415b1695 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 1dea300f6ba88d2d87110b91f8f15c015412794c Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Fri, 30 Dec 2016 16:14:21 -0500 Subject: [PATCH 007/111] handle non-existent user with sync jobs --- .../Sync/SyncJobProcessor.cs | 20 ++++++++++--------- .../Sync/SyncManager.cs | 2 +- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/Emby.Server.Implementations/Sync/SyncJobProcessor.cs b/Emby.Server.Implementations/Sync/SyncJobProcessor.cs index b1adc64df6..17cdef5fcd 100644 --- a/Emby.Server.Implementations/Sync/SyncJobProcessor.cs +++ b/Emby.Server.Implementations/Sync/SyncJobProcessor.cs @@ -59,15 +59,8 @@ namespace Emby.Server.Implementations.Sync _mediaSourceManager = mediaSourceManager; } - public async Task EnsureJobItems(SyncJob job) + public async Task EnsureJobItems(SyncJob job, User user) { - var user = _userManager.GetUserById(job.UserId); - - if (user == null) - { - throw new InvalidOperationException("Cannot proceed with sync because user no longer exists."); - } - var items = (await GetItemsForSync(job.Category, job.ParentId, job.RequestedItemIds, user, job.UnwatchedOnly).ConfigureAwait(false)) .ToList(); @@ -385,7 +378,16 @@ namespace Emby.Server.Implementations.Sync if (job.SyncNewContent) { - await EnsureJobItems(job).ConfigureAwait(false); + var user = _userManager.GetUserById(job.UserId); + + if (user == null) + { + await _syncManager.CancelJob(job.Id).ConfigureAwait(false); + } + else + { + await EnsureJobItems(job, user).ConfigureAwait(false); + } } } } diff --git a/Emby.Server.Implementations/Sync/SyncManager.cs b/Emby.Server.Implementations/Sync/SyncManager.cs index 310b35afe3..2687eaefc1 100644 --- a/Emby.Server.Implementations/Sync/SyncManager.cs +++ b/Emby.Server.Implementations/Sync/SyncManager.cs @@ -181,7 +181,7 @@ namespace Emby.Server.Implementations.Sync await _repo.Create(job).ConfigureAwait(false); - await processor.EnsureJobItems(job).ConfigureAwait(false); + await processor.EnsureJobItems(job, user).ConfigureAwait(false); // If it already has a converting status then is must have been aborted during conversion var jobItemsResult = GetJobItems(new SyncJobItemQuery From 52a183804a035e43791a4932a97364993c08f027 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Fri, 30 Dec 2016 16:16:43 -0500 Subject: [PATCH 008/111] verify path exists in realtime monitor --- Emby.Server.Core/IO/LibraryMonitor.cs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Emby.Server.Core/IO/LibraryMonitor.cs b/Emby.Server.Core/IO/LibraryMonitor.cs index 6ed096f441..87b70d0479 100644 --- a/Emby.Server.Core/IO/LibraryMonitor.cs +++ b/Emby.Server.Core/IO/LibraryMonitor.cs @@ -288,6 +288,13 @@ namespace Emby.Server.Core.IO { try { + if (!_fileSystem.DirectoryExists(path)) + { + // Seeing a crash in the mono runtime due to an exception being thrown on a different thread + Logger.Info("Skipping realtime monitor for {0} because the path does not exist", path); + return; + } + var newWatcher = new FileSystemWatcher(path, "*") { IncludeSubdirectories = true From 20e090e14537ed7284e14b8b52239d240c4ec9cf Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Fri, 30 Dec 2016 22:23:29 -0500 Subject: [PATCH 009/111] update hls params --- .../Playback/BaseStreamingService.cs | 7 ++- .../Playback/Hls/DynamicHlsService.cs | 50 ++++++++----------- 2 files changed, 27 insertions(+), 30 deletions(-) diff --git a/MediaBrowser.Api/Playback/BaseStreamingService.cs b/MediaBrowser.Api/Playback/BaseStreamingService.cs index dc137521c8..17997f47a4 100644 --- a/MediaBrowser.Api/Playback/BaseStreamingService.cs +++ b/MediaBrowser.Api/Playback/BaseStreamingService.cs @@ -395,8 +395,6 @@ namespace MediaBrowser.Api.Playback { param += " -crf 23"; } - - param += " -tune zerolatency"; } else if (string.Equals(videoEncoder, "libx265", StringComparison.OrdinalIgnoreCase)) @@ -536,6 +534,11 @@ namespace MediaBrowser.Api.Playback } } + 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)) diff --git a/MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs b/MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs index 171c971f1b..8e428e7983 100644 --- a/MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs +++ b/MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs @@ -348,6 +348,8 @@ namespace MediaBrowser.Api.Playback.Hls return; } + Logger.Debug("Deleting partial HLS file {0}", file.FullName); + try { FileSystem.DeleteFile(file.FullName); @@ -723,7 +725,7 @@ namespace MediaBrowser.Api.Playback.Hls foreach (var length in segmentLengths) { - builder.AppendLine("#EXTINF:" + length.ToString("0.0000", UsCulture) + ","); + builder.AppendLine("#EXTINF:" + length.ToString("0.0000", UsCulture) + ", nodesc"); builder.AppendLine(string.Format("hls1/{0}/{1}{2}{3}", @@ -826,7 +828,7 @@ namespace MediaBrowser.Api.Playback.Hls args += " -bsf:v h264_mp4toannexb"; } - args += " -flags -global_header"; + //args += " -flags -global_header"; } else { @@ -851,7 +853,7 @@ namespace MediaBrowser.Api.Playback.Hls args += GetGraphicalSubtitleParam(state, codec); } - args += " -flags -global_header"; + //args += " -flags -global_header"; } if (EnableCopyTs(state) && args.IndexOf("-copyts", StringComparison.OrdinalIgnoreCase) == -1) @@ -875,27 +877,25 @@ namespace MediaBrowser.Api.Playback.Hls var inputModifier = GetInputModifier(state, false); // If isEncoding is true we're actually starting ffmpeg - var startNumberParam = isEncoding ? GetStartNumber(state).ToString(UsCulture) : "0"; - - var toTimeParam = string.Empty; - var timestampOffsetParam = string.Empty; - - if (state.IsOutputVideo && !EnableCopyTs(state) && !string.Equals(state.OutputVideoCodec, "copy", StringComparison.OrdinalIgnoreCase) && (state.Request.StartTimeTicks ?? 0) > 0) - { - timestampOffsetParam = " -output_ts_offset " + MediaEncoder.GetTimeParameter(state.Request.StartTimeTicks ?? 0); - } + var startNumber = GetStartNumber(state); + var startNumberParam = isEncoding ? startNumber.ToString(UsCulture) : "0"; var mapArgs = state.IsOutputVideo ? GetMapArgs(state) : string.Empty; - var enableSplittingOnNonKeyFrames = string.Equals(state.OutputVideoCodec, "copy", StringComparison.OrdinalIgnoreCase) && false; + var useGenericSegmenter = true; - // TODO: check libavformat version for 57 50.100 and use -hls_flags split_by_time - var hlsProtocolSupportsSplittingByTime = false; - - if (enableSplittingOnNonKeyFrames && !hlsProtocolSupportsSplittingByTime) + if (useGenericSegmenter) { var outputTsArg = Path.Combine(Path.GetDirectoryName(outputPath), Path.GetFileNameWithoutExtension(outputPath)) + "%d" + GetSegmentFileExtension(state); - return string.Format("{0} {10} {1} -map_metadata -1 -map_chapters -1 -threads {2} {3} {4} {5} -f segment -max_delay 5000000 -avoid_negative_ts disabled -start_at_zero -segment_time {6} -break_non_keyframes 1 -segment_format mpegts -segment_list_type m3u8 -segment_start_number {7} -segment_list \"{8}\" -y \"{9}\"", + var timeDeltaParam = String.Empty; + + if (isEncoding && startNumber > 0) + { + var startTime = state.SegmentLength * startNumber; + timeDeltaParam = string.Format("-segment_time_delta -{0}", startTime); + } + + return string.Format("{0} {1} -map_metadata -1 -map_chapters -1 -threads {2} {3} {4} {5} -f segment -max_delay 5000000 -avoid_negative_ts disabled -start_at_zero -segment_time {6} {10} -individual_header_trailer 0 -segment_format mpegts -segment_list_type m3u8 -segment_start_number {7} -segment_list \"{8}\" -y \"{9}\"", inputModifier, GetInputArgument(state), threads, @@ -906,27 +906,21 @@ namespace MediaBrowser.Api.Playback.Hls startNumberParam, outputPath, outputTsArg, - toTimeParam - ).Trim(); + timeDeltaParam + ).Trim(); } - var splitByTime = hlsProtocolSupportsSplittingByTime && enableSplittingOnNonKeyFrames; - var splitByTimeArg = splitByTime ? " -hls_flags split_by_time" : ""; - - return string.Format("{0}{12} {1} -map_metadata -1 -map_chapters -1 -threads {2} {3} {4}{5} {6} -max_delay 5000000 -avoid_negative_ts disabled -start_at_zero -hls_time {7}{8} -start_number {9} -hls_list_size {10} -y \"{11}\"", + return string.Format("{0} {1} -map_metadata -1 -map_chapters -1 -threads {2} {3} {4} {5} -max_delay 5000000 -avoid_negative_ts disabled -start_at_zero -hls_time {6} -individual_header_trailer 0 -start_number {7} -hls_list_size {8} -y \"{9}\"", inputModifier, GetInputArgument(state), threads, mapArgs, GetVideoArguments(state), - timestampOffsetParam, GetAudioArguments(state), state.SegmentLength.ToString(UsCulture), - splitByTimeArg, startNumberParam, state.HlsListSize.ToString(UsCulture), - outputPath, - toTimeParam + outputPath ).Trim(); } From dbba636290bb004392d4e675322d00d40a31b46f Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Sun, 1 Jan 2017 15:47:54 -0500 Subject: [PATCH 010/111] handle unknown video stream --- .../Connect/ConnectEntryPoint.cs | 18 ++++++++++++++---- .../TunerHosts/HdHomerun/HdHomerunHost.cs | 3 ++- .../Playback/BaseStreamingService.cs | 3 ++- .../Encoder/BaseEncoder.cs | 3 ++- 4 files changed, 20 insertions(+), 7 deletions(-) diff --git a/Emby.Server.Implementations/Connect/ConnectEntryPoint.cs b/Emby.Server.Implementations/Connect/ConnectEntryPoint.cs index 170ef07f31..7f15f20cb8 100644 --- a/Emby.Server.Implementations/Connect/ConnectEntryPoint.cs +++ b/Emby.Server.Implementations/Connect/ConnectEntryPoint.cs @@ -9,6 +9,7 @@ using System; using System.IO; using System.Text; using System.Threading.Tasks; +using MediaBrowser.Controller.Security; using MediaBrowser.Model.IO; using MediaBrowser.Model.Threading; @@ -26,8 +27,9 @@ namespace Emby.Server.Implementations.Connect private readonly IApplicationHost _appHost; private readonly IFileSystem _fileSystem; private readonly ITimerFactory _timerFactory; + private readonly IEncryptionManager _encryption; - public ConnectEntryPoint(IHttpClient httpClient, IApplicationPaths appPaths, ILogger logger, INetworkManager networkManager, IConnectManager connectManager, IApplicationHost appHost, IFileSystem fileSystem, ITimerFactory timerFactory) + public ConnectEntryPoint(IHttpClient httpClient, IApplicationPaths appPaths, ILogger logger, INetworkManager networkManager, IConnectManager connectManager, IApplicationHost appHost, IFileSystem fileSystem, ITimerFactory timerFactory, IEncryptionManager encryption) { _httpClient = httpClient; _appPaths = appPaths; @@ -37,6 +39,7 @@ namespace Emby.Server.Implementations.Connect _appHost = appHost; _fileSystem = fileSystem; _timerFactory = timerFactory; + _encryption = encryption; } public void Run() @@ -143,7 +146,7 @@ namespace Emby.Server.Implementations.Connect private string CacheFilePath { - get { return Path.Combine(_appPaths.DataPath, "wan.txt"); } + get { return Path.Combine(_appPaths.DataPath, "wan.dat"); } } private void CacheAddress(IpAddressInfo address) @@ -153,7 +156,14 @@ namespace Emby.Server.Implementations.Connect try { _fileSystem.CreateDirectory(Path.GetDirectoryName(path)); - _fileSystem.WriteAllText(path, address.ToString(), Encoding.UTF8); + } + catch (Exception ex) + { + } + + try + { + _fileSystem.WriteAllText(path, _encryption.EncryptString(address.ToString()), Encoding.UTF8); } catch (Exception ex) { @@ -169,7 +179,7 @@ namespace Emby.Server.Implementations.Connect try { - var endpoint = _fileSystem.ReadAllText(path, Encoding.UTF8); + var endpoint = _encryption.DecryptString(_fileSystem.ReadAllText(path, Encoding.UTF8)); IpAddressInfo ipAddress; if (_networkManager.TryParseIpAddress(endpoint, out ipAddress)) diff --git a/Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunHost.cs b/Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunHost.cs index 77efe8585b..c2abf1d34f 100644 --- a/Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunHost.cs +++ b/Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunHost.cs @@ -103,7 +103,8 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun TunerHostId = info.Id, IsHD = i.HD == 1, AudioCodec = i.AudioCodec, - VideoCodec = i.VideoCodec + VideoCodec = i.VideoCodec, + ChannelType = ChannelType.TV }); } diff --git a/MediaBrowser.Api/Playback/BaseStreamingService.cs b/MediaBrowser.Api/Playback/BaseStreamingService.cs index 17997f47a4..430504a48f 100644 --- a/MediaBrowser.Api/Playback/BaseStreamingService.cs +++ b/MediaBrowser.Api/Playback/BaseStreamingService.cs @@ -205,7 +205,8 @@ namespace MediaBrowser.Api.Playback } else { - args += "-map -0:v"; + // No known video stream + args += "-vn"; } if (state.AudioStream != null) diff --git a/MediaBrowser.MediaEncoding/Encoder/BaseEncoder.cs b/MediaBrowser.MediaEncoding/Encoder/BaseEncoder.cs index 80bbc87e38..1121aeab97 100644 --- a/MediaBrowser.MediaEncoding/Encoder/BaseEncoder.cs +++ b/MediaBrowser.MediaEncoding/Encoder/BaseEncoder.cs @@ -896,7 +896,8 @@ namespace MediaBrowser.MediaEncoding.Encoder } else { - args += "-map -0:v"; + // No known video stream + args += "-vn"; } if (state.AudioStream != null) From 0f1a542c1f71f049b425cbb5c6de16b78cc94d6e Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Sun, 1 Jan 2017 17:35:22 -0500 Subject: [PATCH 011/111] remove transaction from GetItemList --- .../Data/SqliteItemRepository.cs | 72 +++++++++---------- 1 file changed, 34 insertions(+), 38 deletions(-) diff --git a/Emby.Server.Implementations/Data/SqliteItemRepository.cs b/Emby.Server.Implementations/Data/SqliteItemRepository.cs index 8c16216b95..a6119f1556 100644 --- a/Emby.Server.Implementations/Data/SqliteItemRepository.cs +++ b/Emby.Server.Implementations/Data/SqliteItemRepository.cs @@ -2548,57 +2548,53 @@ namespace Emby.Server.Implementations.Data { using (var connection = CreateConnection(true)) { - return connection.RunInTransaction(db => + var list = new List(); + + using (var statement = PrepareStatementSafe(connection, commandText)) { - var list = new List(); - - using (var statement = PrepareStatementSafe(db, commandText)) + if (EnableJoinUserData(query)) { - if (EnableJoinUserData(query)) + statement.TryBind("@UserId", query.User.Id); + } + + BindSimilarParams(query, statement); + + // Running this again will bind the params + GetWhereClauses(query, statement); + + foreach (var row in statement.ExecuteQuery()) + { + var item = GetItem(row, query); + if (item != null) { - statement.TryBind("@UserId", query.User.Id); + list.Add(item); } + } + } - BindSimilarParams(query, statement); + // Hack for right now since we currently don't support filtering out these duplicates within a query + if (query.EnableGroupByMetadataKey) + { + var limit = query.Limit ?? int.MaxValue; + limit -= 4; + var newList = new List(); - // Running this again will bind the params - GetWhereClauses(query, statement); + foreach (var item in list) + { + AddItem(newList, item); - foreach (var row in statement.ExecuteQuery()) + if (newList.Count >= limit) { - var item = GetItem(row, query); - if (item != null) - { - list.Add(item); - } + break; } } - // Hack for right now since we currently don't support filtering out these duplicates within a query - if (query.EnableGroupByMetadataKey) - { - var limit = query.Limit ?? int.MaxValue; - limit -= 4; - var newList = new List(); + list = newList; + } - foreach (var item in list) - { - AddItem(newList, item); + LogQueryTime("GetItemList", commandText, now); - if (newList.Count >= limit) - { - break; - } - } - - list = newList; - } - - LogQueryTime("GetItemList", commandText, now); - - return list; - - }, ReadTransactionMode); + return list; } } } From ea61c6458f09018965fb84f4e29f527059400700 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Mon, 2 Jan 2017 00:13:39 -0500 Subject: [PATCH 012/111] fix SupportsContentUploading --- MediaBrowser.Api/Session/SessionsService.cs | 4 ++++ MediaBrowser.Model/Session/ClientCapabilities.cs | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/MediaBrowser.Api/Session/SessionsService.cs b/MediaBrowser.Api/Session/SessionsService.cs index 9c107bdff0..a424412684 100644 --- a/MediaBrowser.Api/Session/SessionsService.cs +++ b/MediaBrowser.Api/Session/SessionsService.cs @@ -243,6 +243,8 @@ namespace MediaBrowser.Api.Session [ApiMember(Name = "SupportsPersistentIdentifier", Description = "Determines whether the device supports a unique identifier.", IsRequired = false, DataType = "bool", ParameterType = "query", Verb = "POST")] public bool SupportsPersistentIdentifier { get; set; } + public bool SupportsContentUploading { get; set; } + public PostCapabilities() { SupportsPersistentIdentifier = true; @@ -559,6 +561,8 @@ namespace MediaBrowser.Api.Session SupportsSync = request.SupportsSync, + SupportsContentUploading = request.SupportsContentUploading, + SupportsPersistentIdentifier = request.SupportsPersistentIdentifier }); } diff --git a/MediaBrowser.Model/Session/ClientCapabilities.cs b/MediaBrowser.Model/Session/ClientCapabilities.cs index d5e54ae11d..222c1bd64b 100644 --- a/MediaBrowser.Model/Session/ClientCapabilities.cs +++ b/MediaBrowser.Model/Session/ClientCapabilities.cs @@ -10,7 +10,7 @@ namespace MediaBrowser.Model.Session public List SupportedCommands { get; set; } public bool SupportsMediaControl { get; set; } - + public bool SupportsContentUploading { get; set; } public string MessageCallbackUrl { get; set; } public bool SupportsPersistentIdentifier { get; set; } From 14af8211ebe84a75df7692819e5e670eaef5cd62 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Mon, 2 Jan 2017 00:32:37 -0500 Subject: [PATCH 013/111] ps4 dlna fixes --- Emby.Dlna/Didl/DidlBuilder.cs | 20 +++++++++++++++---- Emby.Dlna/Profiles/DishHopperJoeyProfile.cs | 17 +--------------- Emby.Dlna/Profiles/SonyPs4Profile.cs | 4 +++- Emby.Dlna/Profiles/Xml/Dish Hopper-Joey.xml | 4 +--- Emby.Dlna/Profiles/Xml/Sony PlayStation 4.xml | 2 +- 5 files changed, 22 insertions(+), 25 deletions(-) diff --git a/Emby.Dlna/Didl/DidlBuilder.cs b/Emby.Dlna/Didl/DidlBuilder.cs index 3e47362f65..8771681ad7 100644 --- a/Emby.Dlna/Didl/DidlBuilder.cs +++ b/Emby.Dlna/Didl/DidlBuilder.cs @@ -176,6 +176,18 @@ namespace Emby.Dlna.Didl return new NullLogger(); } + private string GetMimeType(string input) + { + var mime = MimeTypes.GetMimeType(input); + + if (string.Equals(mime, "video/mp2t", StringComparison.OrdinalIgnoreCase)) + { + mime = "video/mpeg"; + } + + return mime; + } + private void AddVideoResource(DlnaOptions options, XmlWriter writer, IHasMediaSources video, string deviceId, Filter filter, StreamInfo streamInfo = null) { if (streamInfo == null) @@ -360,7 +372,7 @@ namespace Emby.Dlna.Didl var filename = url.Substring(0, url.IndexOf('?')); var mimeType = mediaProfile == null || string.IsNullOrEmpty(mediaProfile.MimeType) - ? MimeTypes.GetMimeType(filename) + ? GetMimeType(filename) : mediaProfile.MimeType; writer.WriteAttributeString("protocolInfo", String.Format( @@ -481,7 +493,7 @@ namespace Emby.Dlna.Didl var filename = url.Substring(0, url.IndexOf('?')); var mimeType = mediaProfile == null || string.IsNullOrEmpty(mediaProfile.MimeType) - ? MimeTypes.GetMimeType(filename) + ? GetMimeType(filename) : mediaProfile.MimeType; var contentFeatures = new ContentFeatureBuilder(_profile).BuildAudioHeader(streamInfo.Container, @@ -760,7 +772,7 @@ namespace Emby.Dlna.Didl // Seeing some LG models locking up due content with large lists of people // The actual issue might just be due to processing a more metadata than it can handle - var limit = 10; + var limit = 6; foreach (var actor in people) { @@ -1007,7 +1019,7 @@ namespace Emby.Dlna.Didl writer.WriteAttributeString("protocolInfo", String.Format( "http-get:*:{0}:{1}", - MimeTypes.GetMimeType("file." + format), + GetMimeType("file." + format), contentFeatures )); diff --git a/Emby.Dlna/Profiles/DishHopperJoeyProfile.cs b/Emby.Dlna/Profiles/DishHopperJoeyProfile.cs index d494a7bfca..63082f8caf 100644 --- a/Emby.Dlna/Profiles/DishHopperJoeyProfile.cs +++ b/Emby.Dlna/Profiles/DishHopperJoeyProfile.cs @@ -63,22 +63,7 @@ namespace Emby.Dlna.Profiles new DirectPlayProfile { - Container = "mp3", - AudioCodec = "mp3", - Type = DlnaProfileType.Audio - }, - - new DirectPlayProfile - { - Container = "alac", - AudioCodec = "alac", - Type = DlnaProfileType.Audio - }, - - new DirectPlayProfile - { - Container = "flac", - AudioCodec = "flac", + Container = "mp3,alac,flac", Type = DlnaProfileType.Audio }, diff --git a/Emby.Dlna/Profiles/SonyPs4Profile.cs b/Emby.Dlna/Profiles/SonyPs4Profile.cs index 44649911dc..bcb47486cc 100644 --- a/Emby.Dlna/Profiles/SonyPs4Profile.cs +++ b/Emby.Dlna/Profiles/SonyPs4Profile.cs @@ -86,7 +86,9 @@ namespace Emby.Dlna.Profiles { Container = "mp3", AudioCodec = "mp3", - Type = DlnaProfileType.Audio + Type = DlnaProfileType.Audio, + // Transcoded audio won't be playable at all without this + TranscodeSeekInfo = TranscodeSeekInfo.Bytes }, new TranscodingProfile { diff --git a/Emby.Dlna/Profiles/Xml/Dish Hopper-Joey.xml b/Emby.Dlna/Profiles/Xml/Dish Hopper-Joey.xml index eb63352a3f..561ab35b7a 100644 --- a/Emby.Dlna/Profiles/Xml/Dish Hopper-Joey.xml +++ b/Emby.Dlna/Profiles/Xml/Dish Hopper-Joey.xml @@ -37,9 +37,7 @@ - - - + diff --git a/Emby.Dlna/Profiles/Xml/Sony PlayStation 4.xml b/Emby.Dlna/Profiles/Xml/Sony PlayStation 4.xml index 7ec4ccc907..d4eeaf80d0 100644 --- a/Emby.Dlna/Profiles/Xml/Sony PlayStation 4.xml +++ b/Emby.Dlna/Profiles/Xml/Sony PlayStation 4.xml @@ -45,7 +45,7 @@ - + From 111324a726c465f40e96a13bea7ba1bd5e164b9e Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Mon, 2 Jan 2017 14:36:54 -0500 Subject: [PATCH 014/111] improve dispose --- .../EntryPoints/ExternalPortForwarding.cs | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/Emby.Server.Core/EntryPoints/ExternalPortForwarding.cs b/Emby.Server.Core/EntryPoints/ExternalPortForwarding.cs index b75de2ff4f..4fbcf0042c 100644 --- a/Emby.Server.Core/EntryPoints/ExternalPortForwarding.cs +++ b/Emby.Server.Core/EntryPoints/ExternalPortForwarding.cs @@ -106,6 +106,11 @@ namespace Emby.Server.Core.EntryPoints private async void _deviceDiscovery_DeviceDiscovered(object sender, GenericEventArgs e) { + if (_disposed) + { + return; + } + var info = e.Argument; string usn; @@ -169,6 +174,11 @@ namespace Emby.Server.Core.EntryPoints return; } + if (_disposed) + { + return; + } + _logger.Debug("Calling Nat.Handle on " + identifier); NatUtility.Handle(localAddress, info, endpoint, NatProtocol.Upnp); } @@ -185,6 +195,11 @@ namespace Emby.Server.Core.EntryPoints void NatUtility_DeviceFound(object sender, DeviceEventArgs e) { + if (_disposed) + { + return; + } + try { var device = e.Device; @@ -210,6 +225,11 @@ namespace Emby.Server.Core.EntryPoints private List _usnsHandled = new List(); private void CreateRules(INatDevice device) { + if (_disposed) + { + throw new ObjectDisposedException("PortMapper"); + } + // On some systems the device discovered event seems to fire repeatedly // This check will help ensure we're not trying to port map the same device over and over @@ -249,8 +269,10 @@ namespace Emby.Server.Core.EntryPoints _logger.Debug("NAT device lost: {0}", device.LocalAddress.ToString()); } + private bool _disposed = false; public void Dispose() { + _disposed = true; DisposeNat(); } From 4f4c4b669b558900fe21f4983d9ba6287ae89cd7 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Mon, 2 Jan 2017 14:37:27 -0500 Subject: [PATCH 015/111] update hls params --- MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs b/MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs index 8e428e7983..3f33fd0286 100644 --- a/MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs +++ b/MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs @@ -895,7 +895,7 @@ namespace MediaBrowser.Api.Playback.Hls timeDeltaParam = string.Format("-segment_time_delta -{0}", startTime); } - return string.Format("{0} {1} -map_metadata -1 -map_chapters -1 -threads {2} {3} {4} {5} -f segment -max_delay 5000000 -avoid_negative_ts disabled -start_at_zero -segment_time {6} {10} -individual_header_trailer 0 -segment_format mpegts -segment_list_type m3u8 -segment_start_number {7} -segment_list \"{8}\" -y \"{9}\"", + return string.Format("{0} {1} -map_metadata -1 -map_chapters -1 -threads {2} {3} {4} {5} -f segment -max_delay 5000000 -avoid_negative_ts disabled -start_at_zero -segment_time {6} {10} -individual_header_trailer 0 -write_empty_segments 1 -segment_format mpegts -segment_list_type m3u8 -segment_start_number {7} -segment_list \"{8}\" -y \"{9}\"", inputModifier, GetInputArgument(state), threads, From c0ddeaab774c7280514556a01f983eef2cc49e0f Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Mon, 2 Jan 2017 18:15:16 -0500 Subject: [PATCH 016/111] update maxrate --- MediaBrowser.Api/Playback/BaseStreamingService.cs | 10 +++++++++- MediaBrowser.MediaEncoding/Encoder/BaseEncoder.cs | 10 +++++++++- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/MediaBrowser.Api/Playback/BaseStreamingService.cs b/MediaBrowser.Api/Playback/BaseStreamingService.cs index 430504a48f..1ad4720386 100644 --- a/MediaBrowser.Api/Playback/BaseStreamingService.cs +++ b/MediaBrowser.Api/Playback/BaseStreamingService.cs @@ -1496,8 +1496,16 @@ namespace MediaBrowser.Api.Playback 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(" -maxrate {0} -bufsize {1}", + return string.Format(" -b:v {0} -maxrate {0} -bufsize {1}", bitrate.Value.ToString(UsCulture), (bitrate.Value * 2).ToString(UsCulture)); } diff --git a/MediaBrowser.MediaEncoding/Encoder/BaseEncoder.cs b/MediaBrowser.MediaEncoding/Encoder/BaseEncoder.cs index 1121aeab97..7654ec1d76 100644 --- a/MediaBrowser.MediaEncoding/Encoder/BaseEncoder.cs +++ b/MediaBrowser.MediaEncoding/Encoder/BaseEncoder.cs @@ -827,8 +827,16 @@ namespace MediaBrowser.MediaEncoding.Encoder 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(" -maxrate {0} -bufsize {1}", + return string.Format(" -b:v {0} -maxrate {0} -bufsize {1}", bitrate.Value.ToString(UsCulture), (bitrate.Value * 2).ToString(UsCulture)); } From 4c08d26ad43de931223cf349729d7cf57e22bbc1 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Tue, 3 Jan 2017 00:15:16 -0500 Subject: [PATCH 017/111] reduce error logging --- MediaBrowser.Providers/TV/MissingEpisodeProvider.cs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/MediaBrowser.Providers/TV/MissingEpisodeProvider.cs b/MediaBrowser.Providers/TV/MissingEpisodeProvider.cs index 22e7e753ca..1fd04070ba 100644 --- a/MediaBrowser.Providers/TV/MissingEpisodeProvider.cs +++ b/MediaBrowser.Providers/TV/MissingEpisodeProvider.cs @@ -93,6 +93,12 @@ namespace MediaBrowser.Providers.TV return; } + // Check this in order to avoid logging an exception due to directory not existing + if (!_fileSystem.DirectoryExists(seriesDataPath)) + { + return; + } + var episodeFiles = _fileSystem.GetFilePaths(seriesDataPath) .Where(i => string.Equals(Path.GetExtension(i), ".xml", StringComparison.OrdinalIgnoreCase)) .Select(Path.GetFileNameWithoutExtension) From 60666191387b0ebdb12d2fb7b18018a2cc922087 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Tue, 3 Jan 2017 00:15:59 -0500 Subject: [PATCH 018/111] handle bitrate overflow --- .../Sync/SyncHelper.cs | 2 +- MediaBrowser.Api/Playback/MediaInfoService.cs | 8 +++--- MediaBrowser.Api/Playback/StreamState.cs | 6 +---- MediaBrowser.Model/Dlna/AudioOptions.cs | 4 +-- MediaBrowser.Model/Dlna/DeviceProfile.cs | 4 +-- MediaBrowser.Model/Dlna/StreamBuilder.cs | 26 ++++++++++--------- MediaBrowser.Model/Dlna/StreamInfoSorter.cs | 2 +- .../MediaInfo/LiveStreamRequest.cs | 2 +- .../MediaInfo/PlaybackInfoRequest.cs | 2 +- 9 files changed, 27 insertions(+), 29 deletions(-) diff --git a/Emby.Server.Implementations/Sync/SyncHelper.cs b/Emby.Server.Implementations/Sync/SyncHelper.cs index da475f0038..7fe703796f 100644 --- a/Emby.Server.Implementations/Sync/SyncHelper.cs +++ b/Emby.Server.Implementations/Sync/SyncHelper.cs @@ -4,7 +4,7 @@ namespace Emby.Server.Implementations.Sync { public class SyncHelper { - public static int? AdjustBitrate(int? profileBitrate, string quality) + public static long? AdjustBitrate(long? profileBitrate, string quality) { if (profileBitrate.HasValue) { diff --git a/MediaBrowser.Api/Playback/MediaInfoService.cs b/MediaBrowser.Api/Playback/MediaInfoService.cs index 8fb78b6e5d..a2ec747be0 100644 --- a/MediaBrowser.Api/Playback/MediaInfoService.cs +++ b/MediaBrowser.Api/Playback/MediaInfoService.cs @@ -227,7 +227,7 @@ namespace MediaBrowser.Api.Playback PlaybackInfoResponse result, DeviceProfile profile, AuthorizationInfo auth, - int? maxBitrate, + long? maxBitrate, long startTimeTicks, string mediaSourceId, int? audioStreamIndex, @@ -249,7 +249,7 @@ namespace MediaBrowser.Api.Playback MediaSourceInfo mediaSource, DeviceProfile profile, AuthorizationInfo auth, - int? maxBitrate, + long? maxBitrate, long startTimeTicks, string mediaSourceId, int? audioStreamIndex, @@ -383,7 +383,7 @@ namespace MediaBrowser.Api.Playback } } - private int? GetMaxBitrate(int? clientMaxBitrate) + private long? GetMaxBitrate(long? clientMaxBitrate) { var maxBitrate = clientMaxBitrate; var remoteClientMaxBitrate = _config.Configuration.RemoteClientBitrateLimit; @@ -425,7 +425,7 @@ namespace MediaBrowser.Api.Playback } } - private void SortMediaSources(PlaybackInfoResponse result, int? maxBitrate) + private void SortMediaSources(PlaybackInfoResponse result, long? maxBitrate) { var originalList = result.MediaSources.ToList(); diff --git a/MediaBrowser.Api/Playback/StreamState.cs b/MediaBrowser.Api/Playback/StreamState.cs index d1ef996aea..e9e3c33c0e 100644 --- a/MediaBrowser.Api/Playback/StreamState.cs +++ b/MediaBrowser.Api/Playback/StreamState.cs @@ -93,13 +93,9 @@ namespace MediaBrowser.Api.Playback { return 3; } - return 6; - } - - if (!RunTimeTicks.HasValue) - { return 3; } + return 3; } } diff --git a/MediaBrowser.Model/Dlna/AudioOptions.cs b/MediaBrowser.Model/Dlna/AudioOptions.cs index f3b6df861d..24c7aef98b 100644 --- a/MediaBrowser.Model/Dlna/AudioOptions.cs +++ b/MediaBrowser.Model/Dlna/AudioOptions.cs @@ -41,7 +41,7 @@ namespace MediaBrowser.Model.Dlna /// /// The application's configured quality setting /// - public int? MaxBitrate { get; set; } + public long? MaxBitrate { get; set; } /// /// Gets or sets the context. @@ -59,7 +59,7 @@ namespace MediaBrowser.Model.Dlna /// Gets the maximum bitrate. /// /// System.Nullable<System.Int32>. - public int? GetMaxBitrate(bool isAudio) + public long? GetMaxBitrate(bool isAudio) { if (MaxBitrate.HasValue) { diff --git a/MediaBrowser.Model/Dlna/DeviceProfile.cs b/MediaBrowser.Model/Dlna/DeviceProfile.cs index 821531ed06..d99a21e6d1 100644 --- a/MediaBrowser.Model/Dlna/DeviceProfile.cs +++ b/MediaBrowser.Model/Dlna/DeviceProfile.cs @@ -51,8 +51,8 @@ namespace MediaBrowser.Model.Dlna public int? MaxIconWidth { get; set; } public int? MaxIconHeight { get; set; } - public int? MaxStreamingBitrate { get; set; } - public int? MaxStaticBitrate { get; set; } + public long? MaxStreamingBitrate { get; set; } + public long? MaxStaticBitrate { get; set; } public int? MusicStreamingTranscodingBitrate { get; set; } public int? MaxStaticMusicBitrate { get; set; } diff --git a/MediaBrowser.Model/Dlna/StreamBuilder.cs b/MediaBrowser.Model/Dlna/StreamBuilder.cs index bc9a3488f2..262964404e 100644 --- a/MediaBrowser.Model/Dlna/StreamBuilder.cs +++ b/MediaBrowser.Model/Dlna/StreamBuilder.cs @@ -93,7 +93,7 @@ namespace MediaBrowser.Model.Dlna return GetOptimalStream(streams, options.GetMaxBitrate(false)); } - private StreamInfo GetOptimalStream(List streams, int? maxBitrate) + private StreamInfo GetOptimalStream(List streams, long? maxBitrate) { streams = StreamInfoSorter.SortMediaSources(streams, maxBitrate); @@ -277,25 +277,26 @@ namespace MediaBrowser.Model.Dlna playlistItem.MaxAudioChannels = Math.Min(options.MaxAudioChannels.Value, currentValue); } - int transcodingBitrate = options.AudioTranscodingBitrate ?? + long transcodingBitrate = options.AudioTranscodingBitrate ?? options.Profile.MusicStreamingTranscodingBitrate ?? 128000; - int? configuredBitrate = options.GetMaxBitrate(true); + var configuredBitrate = options.GetMaxBitrate(true); if (configuredBitrate.HasValue) { transcodingBitrate = Math.Min(configuredBitrate.Value, transcodingBitrate); } - playlistItem.AudioBitrate = Math.Min(transcodingBitrate, playlistItem.AudioBitrate ?? transcodingBitrate); + var longBitrate = Math.Min(transcodingBitrate, playlistItem.AudioBitrate ?? transcodingBitrate); + playlistItem.AudioBitrate = longBitrate > int.MaxValue ? int.MaxValue : Convert.ToInt32(longBitrate); } return playlistItem; } - private int? GetBitrateForDirectPlayCheck(MediaSourceInfo item, AudioOptions options, bool isAudio) + private long? GetBitrateForDirectPlayCheck(MediaSourceInfo item, AudioOptions options, bool isAudio) { if (item.Protocol == MediaProtocol.File) { @@ -583,11 +584,11 @@ namespace MediaBrowser.Model.Dlna int audioBitrate = GetAudioBitrate(playlistItem.SubProtocol, options.GetMaxBitrate(false), playlistItem.TargetAudioChannels, playlistItem.TargetAudioCodec, audioStream); playlistItem.AudioBitrate = Math.Min(playlistItem.AudioBitrate ?? audioBitrate, audioBitrate); - int? maxBitrateSetting = options.GetMaxBitrate(false); + var maxBitrateSetting = options.GetMaxBitrate(false); // Honor max rate if (maxBitrateSetting.HasValue) { - int videoBitrate = maxBitrateSetting.Value; + var videoBitrate = maxBitrateSetting.Value; if (playlistItem.AudioBitrate.HasValue) { @@ -595,15 +596,16 @@ namespace MediaBrowser.Model.Dlna } // Make sure the video bitrate is lower than bitrate settings but at least 64k - int currentValue = playlistItem.VideoBitrate ?? videoBitrate; - playlistItem.VideoBitrate = Math.Max(Math.Min(videoBitrate, currentValue), 64000); + long currentValue = playlistItem.VideoBitrate ?? videoBitrate; + var longBitrate = Math.Max(Math.Min(videoBitrate, currentValue), 64000); + playlistItem.VideoBitrate = longBitrate > int.MaxValue ? int.MaxValue : Convert.ToInt32(longBitrate); } } return playlistItem; } - private int GetAudioBitrate(string subProtocol, int? maxTotalBitrate, int? targetAudioChannels, string targetAudioCodec, MediaStream audioStream) + private int GetAudioBitrate(string subProtocol, long? maxTotalBitrate, int? targetAudioChannels, string targetAudioCodec, MediaStream audioStream) { int defaultBitrate = audioStream == null ? 192000 : audioStream.BitRate ?? 192000; // Reduce the bitrate if we're downmixing @@ -865,7 +867,7 @@ namespace MediaBrowser.Model.Dlna } private bool IsEligibleForDirectPlay(MediaSourceInfo item, - int? maxBitrate, + long? maxBitrate, MediaStream subtitleStream, VideoOptions options, PlayMethod playMethod) @@ -960,7 +962,7 @@ namespace MediaBrowser.Model.Dlna return null; } - private bool IsAudioEligibleForDirectPlay(MediaSourceInfo item, int? maxBitrate) + private bool IsAudioEligibleForDirectPlay(MediaSourceInfo item, long? maxBitrate) { if (!maxBitrate.HasValue) { diff --git a/MediaBrowser.Model/Dlna/StreamInfoSorter.cs b/MediaBrowser.Model/Dlna/StreamInfoSorter.cs index 293054e5b3..425fb9c93e 100644 --- a/MediaBrowser.Model/Dlna/StreamInfoSorter.cs +++ b/MediaBrowser.Model/Dlna/StreamInfoSorter.cs @@ -7,7 +7,7 @@ namespace MediaBrowser.Model.Dlna { public class StreamInfoSorter { - public static List SortMediaSources(List streams, int? maxBitrate) + public static List SortMediaSources(List streams, long? maxBitrate) { return streams.OrderBy(i => { diff --git a/MediaBrowser.Model/MediaInfo/LiveStreamRequest.cs b/MediaBrowser.Model/MediaInfo/LiveStreamRequest.cs index b6e2a96aa0..913967352f 100644 --- a/MediaBrowser.Model/MediaInfo/LiveStreamRequest.cs +++ b/MediaBrowser.Model/MediaInfo/LiveStreamRequest.cs @@ -7,7 +7,7 @@ namespace MediaBrowser.Model.MediaInfo public string OpenToken { get; set; } public string UserId { get; set; } public string PlaySessionId { get; set; } - public int? MaxStreamingBitrate { get; set; } + public long? MaxStreamingBitrate { get; set; } public long? StartTimeTicks { get; set; } public int? AudioStreamIndex { get; set; } public int? SubtitleStreamIndex { get; set; } diff --git a/MediaBrowser.Model/MediaInfo/PlaybackInfoRequest.cs b/MediaBrowser.Model/MediaInfo/PlaybackInfoRequest.cs index a2b85d121e..fc4714be36 100644 --- a/MediaBrowser.Model/MediaInfo/PlaybackInfoRequest.cs +++ b/MediaBrowser.Model/MediaInfo/PlaybackInfoRequest.cs @@ -8,7 +8,7 @@ namespace MediaBrowser.Model.MediaInfo public string UserId { get; set; } - public int? MaxStreamingBitrate { get; set; } + public long? MaxStreamingBitrate { get; set; } public long? StartTimeTicks { get; set; } From 08cd8b381fd7b17afc39f2c0b2da73c5db591b7c Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Tue, 3 Jan 2017 00:59:29 -0500 Subject: [PATCH 019/111] fix last segment length --- .../Playback/Hls/DynamicHlsService.cs | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs b/MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs index 3f33fd0286..64be7c6c9c 100644 --- a/MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs +++ b/MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs @@ -265,9 +265,15 @@ namespace MediaBrowser.Api.Playback.Hls double startSeconds = 0; var lengths = GetSegmentLengths(state); + if (requestedIndex >= lengths.Length) + { + var msg = string.Format("Invalid segment index requested: {0} - Segment count: {1}", requestedIndex, lengths.Length); + throw new ArgumentException(msg); + } + for (var i = 0; i < requestedIndex; i++) { - startSeconds += lengths[requestedIndex]; + startSeconds += lengths[i]; } var position = TimeSpan.FromSeconds(startSeconds).Ticks; @@ -279,9 +285,15 @@ namespace MediaBrowser.Api.Playback.Hls double startSeconds = 0; var lengths = GetSegmentLengths(state); + if (requestedIndex >= lengths.Length) + { + var msg = string.Format("Invalid segment index requested: {0} - Segment count: {1}", requestedIndex, lengths.Length); + throw new ArgumentException(msg); + } + for (var i = 0; i <= requestedIndex; i++) { - startSeconds += lengths[requestedIndex]; + startSeconds += lengths[i]; } var position = TimeSpan.FromSeconds(startSeconds).Ticks; From f6f52db3c2a60638c8aa25958341b72ee28ac8a5 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Tue, 3 Jan 2017 01:31:18 -0500 Subject: [PATCH 020/111] update hls params --- MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs b/MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs index 64be7c6c9c..cd8d05996b 100644 --- a/MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs +++ b/MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs @@ -907,7 +907,7 @@ namespace MediaBrowser.Api.Playback.Hls timeDeltaParam = string.Format("-segment_time_delta -{0}", startTime); } - return string.Format("{0} {1} -map_metadata -1 -map_chapters -1 -threads {2} {3} {4} {5} -f segment -max_delay 5000000 -avoid_negative_ts disabled -start_at_zero -segment_time {6} {10} -individual_header_trailer 0 -write_empty_segments 1 -segment_format mpegts -segment_list_type m3u8 -segment_start_number {7} -segment_list \"{8}\" -y \"{9}\"", + return string.Format("{0} {1} -map_metadata -1 -map_chapters -1 -threads {2} {3} {4} {5} -f segment -max_delay 5000000 -avoid_negative_ts disabled -start_at_zero -segment_time {6} {10} -individual_header_trailer 0 -segment_format mpegts -segment_list_type m3u8 -segment_start_number {7} -segment_list \"{8}\" -y \"{9}\"", inputModifier, GetInputArgument(state), threads, From 707f4f564bfad0e3627b9d89549907622e389f66 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Tue, 3 Jan 2017 01:51:36 -0500 Subject: [PATCH 021/111] unify video osd --- .../MediaBrowser.WebDashboard.csproj | 21 ++++++------------- 1 file changed, 6 insertions(+), 15 deletions(-) diff --git a/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj b/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj index 37ee31df1f..461be5c629 100644 --- a/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj +++ b/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj @@ -258,6 +258,9 @@ PreserveNewest + + PreserveNewest + PreserveNewest @@ -420,9 +423,6 @@ PreserveNewest - - PreserveNewest - PreserveNewest @@ -816,9 +816,6 @@ PreserveNewest - - PreserveNewest - PreserveNewest @@ -903,9 +900,6 @@ PreserveNewest - - PreserveNewest - PreserveNewest @@ -978,6 +972,9 @@ PreserveNewest + + PreserveNewest + PreserveNewest @@ -1027,9 +1024,6 @@ PreserveNewest - - PreserveNewest - PreserveNewest @@ -1388,9 +1382,6 @@ PreserveNewest - - PreserveNewest - From 9946145308656d90a8613e44c71544b60ff3d488 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Tue, 3 Jan 2017 02:05:57 -0500 Subject: [PATCH 022/111] fix project --- MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj | 3 --- 1 file changed, 3 deletions(-) diff --git a/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj b/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj index 461be5c629..46aa7abc59 100644 --- a/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj +++ b/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj @@ -162,9 +162,6 @@ PreserveNewest - - PreserveNewest - PreserveNewest From 9ad6cc1b4b3c2da63c50949a4c8c2e0c26934f82 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Tue, 3 Jan 2017 03:10:50 -0500 Subject: [PATCH 023/111] update components --- MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj | 3 --- 1 file changed, 3 deletions(-) diff --git a/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj b/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj index 46aa7abc59..ea2b299383 100644 --- a/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj +++ b/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj @@ -645,9 +645,6 @@ PreserveNewest - - PreserveNewest - PreserveNewest From 690906aa38a221692b16eaddd73f5cfeb408483a Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Tue, 3 Jan 2017 16:57:29 -0500 Subject: [PATCH 024/111] add quality button --- RSSDP/SsdpDevicePublisherBase.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RSSDP/SsdpDevicePublisherBase.cs b/RSSDP/SsdpDevicePublisherBase.cs index 2543632b6b..c0ae3955dc 100644 --- a/RSSDP/SsdpDevicePublisherBase.cs +++ b/RSSDP/SsdpDevicePublisherBase.cs @@ -245,7 +245,7 @@ namespace Rssdp.Infrastructure return; } - WriteTrace(String.Format("Search Request Received From {0}, Target = {1}", remoteEndPoint.ToString(), searchTarget)); + //WriteTrace(String.Format("Search Request Received From {0}, Target = {1}", remoteEndPoint.ToString(), searchTarget)); if (IsDuplicateSearchRequest(searchTarget, remoteEndPoint)) { From 352074acd47e3ed63433b77ffcb34fe634fa36e6 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Wed, 4 Jan 2017 01:49:00 -0500 Subject: [PATCH 025/111] update osd --- MediaBrowser.Api/Playback/Hls/BaseHlsService.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MediaBrowser.Api/Playback/Hls/BaseHlsService.cs b/MediaBrowser.Api/Playback/Hls/BaseHlsService.cs index 17a0eeb8ef..299cb33fa6 100644 --- a/MediaBrowser.Api/Playback/Hls/BaseHlsService.cs +++ b/MediaBrowser.Api/Playback/Hls/BaseHlsService.cs @@ -103,7 +103,7 @@ namespace MediaBrowser.Api.Playback.Hls throw; } - var waitForSegments = state.SegmentLength >= 10 ? 2 : (state.SegmentLength > 3 || !isLive ? 3 : 3); + var waitForSegments = state.SegmentLength >= 10 ? 2 : 3; await WaitForMinimumSegmentCount(playlist, waitForSegments, cancellationTokenSource.Token).ConfigureAwait(false); } } From 656a923af177fa7975e5941ca1e61a353d66e5da Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Wed, 4 Jan 2017 03:02:08 -0500 Subject: [PATCH 026/111] update video osd --- MediaBrowser.Model/Session/GeneralCommandType.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/MediaBrowser.Model/Session/GeneralCommandType.cs b/MediaBrowser.Model/Session/GeneralCommandType.cs index 64b61678e2..6cceb162a4 100644 --- a/MediaBrowser.Model/Session/GeneralCommandType.cs +++ b/MediaBrowser.Model/Session/GeneralCommandType.cs @@ -36,6 +36,7 @@ DisplayMessage = 28, SetRepeatMode = 29, ChannelUp = 30, - ChannelDown = 31 + ChannelDown = 31, + SetMaxStreamingBitrate = 31 } } \ No newline at end of file From 96d00fe21d7db7143b256ef09ad1f2aabe935083 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Wed, 4 Jan 2017 15:29:29 -0500 Subject: [PATCH 027/111] update video osd --- Emby.Dlna/Profiles/DishHopperJoeyProfile.cs | 2 +- Emby.Dlna/Profiles/Xml/Dish Hopper-Joey.xml | 2 +- .../LiveTv/Listings/SchedulesDirect.cs | 5 +---- 3 files changed, 3 insertions(+), 6 deletions(-) diff --git a/Emby.Dlna/Profiles/DishHopperJoeyProfile.cs b/Emby.Dlna/Profiles/DishHopperJoeyProfile.cs index 63082f8caf..89e0697c16 100644 --- a/Emby.Dlna/Profiles/DishHopperJoeyProfile.cs +++ b/Emby.Dlna/Profiles/DishHopperJoeyProfile.cs @@ -23,7 +23,7 @@ namespace Emby.Dlna.Profiles { Match = HeaderMatchType.Substring, Name = "User-Agent", - Value ="XiP" + Value ="Zip_" } } }; diff --git a/Emby.Dlna/Profiles/Xml/Dish Hopper-Joey.xml b/Emby.Dlna/Profiles/Xml/Dish Hopper-Joey.xml index 561ab35b7a..556a3d673d 100644 --- a/Emby.Dlna/Profiles/Xml/Dish Hopper-Joey.xml +++ b/Emby.Dlna/Profiles/Xml/Dish Hopper-Joey.xml @@ -5,7 +5,7 @@ Echostar Technologies LLC http://www.echostar.com - + Emby diff --git a/Emby.Server.Implementations/LiveTv/Listings/SchedulesDirect.cs b/Emby.Server.Implementations/LiveTv/Listings/SchedulesDirect.cs index e2446b16ff..46b9142328 100644 --- a/Emby.Server.Implementations/LiveTv/Listings/SchedulesDirect.cs +++ b/Emby.Server.Implementations/LiveTv/Listings/SchedulesDirect.cs @@ -182,7 +182,6 @@ namespace Emby.Server.Implementations.LiveTv.Listings programsInfo.Add(GetProgram(channelNumber, schedule, programDict[schedule.programID])); } - _logger.Info("Finished with EPGData"); } } @@ -322,8 +321,7 @@ namespace Emby.Server.Implementations.LiveTv.Listings using (var response = await Get(httpOptions, true, info).ConfigureAwait(false)) { var root = _jsonSerializer.DeserializeFromStream(response); - _logger.Info("Found " + root.map.Count + " channels on the lineup on ScheduleDirect"); - _logger.Info("Mapping Stations to Channel"); + foreach (ScheduleDirect.Map map in root.map) { var channelNumber = map.logicalChannelNumber; @@ -353,7 +351,6 @@ namespace Emby.Server.Implementations.LiveTv.Listings }); } } - _logger.Info("Added " + GetChannelPairCacheCount(listingsId) + " channels to the dictionary"); foreach (ChannelInfo channel in channels) { From 424c83bda8c44c81eff62a26f4e2e65ceaf6de6f Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Thu, 5 Jan 2017 13:09:12 -0500 Subject: [PATCH 028/111] update video osd --- MediaBrowser.Providers/TV/TheTVDB/TvdbPrescanTask.cs | 6 ++++-- .../TV/TheTVDB/TvdbSeriesProvider.cs | 12 ++++++++---- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/MediaBrowser.Providers/TV/TheTVDB/TvdbPrescanTask.cs b/MediaBrowser.Providers/TV/TheTVDB/TvdbPrescanTask.cs index 8488c56694..f6af365fdb 100644 --- a/MediaBrowser.Providers/TV/TheTVDB/TvdbPrescanTask.cs +++ b/MediaBrowser.Providers/TV/TheTVDB/TvdbPrescanTask.cs @@ -143,7 +143,8 @@ namespace MediaBrowser.Providers.TV Url = ServerTimeUrl, CancellationToken = cancellationToken, EnableHttpCompression = true, - ResourcePool = TvdbSeriesProvider.Current.TvDbResourcePool + ResourcePool = TvdbSeriesProvider.Current.TvDbResourcePool, + BufferContent = false }).ConfigureAwait(false)) { @@ -239,7 +240,8 @@ namespace MediaBrowser.Providers.TV Url = string.Format(UpdatesUrl, lastUpdateTime), CancellationToken = cancellationToken, EnableHttpCompression = true, - ResourcePool = TvdbSeriesProvider.Current.TvDbResourcePool + ResourcePool = TvdbSeriesProvider.Current.TvDbResourcePool, + BufferContent = false }).ConfigureAwait(false)) { diff --git a/MediaBrowser.Providers/TV/TheTVDB/TvdbSeriesProvider.cs b/MediaBrowser.Providers/TV/TheTVDB/TvdbSeriesProvider.cs index cc8a90fe38..1798299e8d 100644 --- a/MediaBrowser.Providers/TV/TheTVDB/TvdbSeriesProvider.cs +++ b/MediaBrowser.Providers/TV/TheTVDB/TvdbSeriesProvider.cs @@ -237,7 +237,8 @@ namespace MediaBrowser.Providers.TV { Url = url, ResourcePool = TvDbResourcePool, - CancellationToken = cancellationToken + CancellationToken = cancellationToken, + BufferContent = false }).ConfigureAwait(false)) { @@ -281,7 +282,8 @@ namespace MediaBrowser.Providers.TV { Url = url, ResourcePool = TvDbResourcePool, - CancellationToken = cancellationToken + CancellationToken = cancellationToken, + BufferContent = false }).ConfigureAwait(false)) { @@ -535,7 +537,8 @@ namespace MediaBrowser.Providers.TV { Url = url, ResourcePool = TvDbResourcePool, - CancellationToken = cancellationToken + CancellationToken = cancellationToken, + BufferContent = false }).ConfigureAwait(false)) { @@ -1664,7 +1667,8 @@ namespace MediaBrowser.Providers.TV { CancellationToken = cancellationToken, Url = url, - ResourcePool = TvDbResourcePool + ResourcePool = TvDbResourcePool, + BufferContent = false }); } } From 5ff78b5130d0b2712494f4830a9d4f025b09ede3 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Thu, 5 Jan 2017 15:25:55 -0500 Subject: [PATCH 029/111] 3.1.267 --- SharedVersion.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SharedVersion.cs b/SharedVersion.cs index ab415b1695..3a0ec44ca8 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 3edf91ce564266e43a96c89edb71887096e8d296 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Thu, 5 Jan 2017 23:38:03 -0500 Subject: [PATCH 030/111] update music artists --- Emby.Dlna/ContentDirectory/ControlHandler.cs | 6 +++--- Emby.Dlna/Didl/DidlBuilder.cs | 2 +- .../Playback/BaseStreamingService.cs | 17 +++++++++++++++- .../Entities/Audio/MusicArtist.cs | 9 +++++++++ .../Entities/Audio/MusicGenre.cs | 9 +++++++++ MediaBrowser.Controller/Entities/BaseItem.cs | 9 +++++++++ MediaBrowser.Controller/Entities/Folder.cs | 9 +++++++++ MediaBrowser.Controller/Entities/Genre.cs | 9 +++++++++ MediaBrowser.Controller/Entities/Studio.cs | 9 +++++++++ .../Manager/ProviderManager.cs | 20 +++++++++---------- 10 files changed, 84 insertions(+), 15 deletions(-) diff --git a/Emby.Dlna/ContentDirectory/ControlHandler.cs b/Emby.Dlna/ContentDirectory/ControlHandler.cs index 5718cbd09f..2251a8f58c 100644 --- a/Emby.Dlna/ContentDirectory/ControlHandler.cs +++ b/Emby.Dlna/ContentDirectory/ControlHandler.cs @@ -260,7 +260,7 @@ namespace Emby.Dlna.ContentDirectory { totalCount = 1; - if (item.IsFolder || serverItem.StubType.HasValue) + if (item.IsDisplayedAsFolder || serverItem.StubType.HasValue) { var childrenResult = (await GetUserItems(item, serverItem.StubType, user, sortCriteria, start, requestedCount).ConfigureAwait(false)); @@ -285,7 +285,7 @@ namespace Emby.Dlna.ContentDirectory var childItem = i.Item; var displayStubType = i.StubType; - if (childItem.IsFolder || displayStubType.HasValue) + if (childItem.IsDisplayedAsFolder || displayStubType.HasValue) { var childCount = (await GetUserItems(childItem, displayStubType, user, sortCriteria, null, 0).ConfigureAwait(false)) .TotalRecordCount; @@ -381,7 +381,7 @@ namespace Emby.Dlna.ContentDirectory foreach (var i in childrenResult.Items) { - if (i.IsFolder) + if (i.IsDisplayedAsFolder) { var childCount = (await GetChildrenSorted(i, user, searchCriteria, sortCriteria, null, 0).ConfigureAwait(false)) .TotalRecordCount; diff --git a/Emby.Dlna/Didl/DidlBuilder.cs b/Emby.Dlna/Didl/DidlBuilder.cs index 8771681ad7..ca4c3b9122 100644 --- a/Emby.Dlna/Didl/DidlBuilder.cs +++ b/Emby.Dlna/Didl/DidlBuilder.cs @@ -686,7 +686,7 @@ namespace Emby.Dlna.Didl writer.WriteStartElement("upnp", "class", NS_UPNP); - if (item.IsFolder || stubType.HasValue) + if (item.IsDisplayedAsFolder || stubType.HasValue) { string classType = null; diff --git a/MediaBrowser.Api/Playback/BaseStreamingService.cs b/MediaBrowser.Api/Playback/BaseStreamingService.cs index 1ad4720386..0e0a22c392 100644 --- a/MediaBrowser.Api/Playback/BaseStreamingService.cs +++ b/MediaBrowser.Api/Playback/BaseStreamingService.cs @@ -2710,7 +2710,12 @@ namespace MediaBrowser.Api.Playback { if (!string.IsNullOrWhiteSpace(stream.Codec) && stream.Index != -1) { - inputModifier += " -codec:" + stream.Index.ToString(UsCulture) + " " + stream.Codec; + var decoder = GetDecoderFromCodec(stream.Codec); + + if (!string.IsNullOrWhiteSpace(decoder)) + { + inputModifier += " -codec:" + stream.Index.ToString(UsCulture) + " " + decoder; + } } } } @@ -2730,6 +2735,16 @@ namespace MediaBrowser.Api.Playback return inputModifier; } + private string GetDecoderFromCodec(string codec) + { + if (string.Equals(codec, "mp2", StringComparison.OrdinalIgnoreCase)) + { + return null; + } + + return codec; + } + /// /// Infers the audio codec based on the url /// diff --git a/MediaBrowser.Controller/Entities/Audio/MusicArtist.cs b/MediaBrowser.Controller/Entities/Audio/MusicArtist.cs index 1d2716b64a..37631bbe8a 100644 --- a/MediaBrowser.Controller/Entities/Audio/MusicArtist.cs +++ b/MediaBrowser.Controller/Entities/Audio/MusicArtist.cs @@ -44,6 +44,15 @@ namespace MediaBrowser.Controller.Entities.Audio } } + [IgnoreDataMember] + public override bool IsDisplayedAsFolder + { + get + { + return true; + } + } + [IgnoreDataMember] public override bool SupportsAddingToPlaylist { diff --git a/MediaBrowser.Controller/Entities/Audio/MusicGenre.cs b/MediaBrowser.Controller/Entities/Audio/MusicGenre.cs index d75b31f6ae..bbe1a54a49 100644 --- a/MediaBrowser.Controller/Entities/Audio/MusicGenre.cs +++ b/MediaBrowser.Controller/Entities/Audio/MusicGenre.cs @@ -40,6 +40,15 @@ namespace MediaBrowser.Controller.Entities.Audio } } + [IgnoreDataMember] + public override bool IsDisplayedAsFolder + { + get + { + return true; + } + } + /// /// Returns the folder containing the item. /// If the item is a folder, it returns the folder itself diff --git a/MediaBrowser.Controller/Entities/BaseItem.cs b/MediaBrowser.Controller/Entities/BaseItem.cs index 2aa53d6515..9e32fd1991 100644 --- a/MediaBrowser.Controller/Entities/BaseItem.cs +++ b/MediaBrowser.Controller/Entities/BaseItem.cs @@ -1631,6 +1631,15 @@ namespace MediaBrowser.Controller.Entities } } + [IgnoreDataMember] + public virtual bool IsDisplayedAsFolder + { + get + { + return false; + } + } + public virtual string GetClientTypeName() { if (IsFolder && SourceType == SourceType.Channel && !(this is Channel)) diff --git a/MediaBrowser.Controller/Entities/Folder.cs b/MediaBrowser.Controller/Entities/Folder.cs index 943c9d8822..b5d07b933a 100644 --- a/MediaBrowser.Controller/Entities/Folder.cs +++ b/MediaBrowser.Controller/Entities/Folder.cs @@ -85,6 +85,15 @@ namespace MediaBrowser.Controller.Entities } } + [IgnoreDataMember] + public override bool IsDisplayedAsFolder + { + get + { + return true; + } + } + [IgnoreDataMember] public virtual bool SupportsCumulativeRunTimeTicks { diff --git a/MediaBrowser.Controller/Entities/Genre.cs b/MediaBrowser.Controller/Entities/Genre.cs index da4ee352fa..1b746ae517 100644 --- a/MediaBrowser.Controller/Entities/Genre.cs +++ b/MediaBrowser.Controller/Entities/Genre.cs @@ -40,6 +40,15 @@ namespace MediaBrowser.Controller.Entities } } + [IgnoreDataMember] + public override bool IsDisplayedAsFolder + { + get + { + return true; + } + } + [IgnoreDataMember] public override bool SupportsAncestors { diff --git a/MediaBrowser.Controller/Entities/Studio.cs b/MediaBrowser.Controller/Entities/Studio.cs index c14dd70bf8..dbd9d1cef4 100644 --- a/MediaBrowser.Controller/Entities/Studio.cs +++ b/MediaBrowser.Controller/Entities/Studio.cs @@ -39,6 +39,15 @@ namespace MediaBrowser.Controller.Entities } } + [IgnoreDataMember] + public override bool IsDisplayedAsFolder + { + get + { + return true; + } + } + [IgnoreDataMember] public override bool SupportsAncestors { diff --git a/MediaBrowser.Providers/Manager/ProviderManager.cs b/MediaBrowser.Providers/Manager/ProviderManager.cs index a645ab55f9..4eab20e7ec 100644 --- a/MediaBrowser.Providers/Manager/ProviderManager.cs +++ b/MediaBrowser.Providers/Manager/ProviderManager.cs @@ -921,19 +921,19 @@ namespace MediaBrowser.Providers.Manager { await item.RefreshMetadata(options, CancellationToken.None).ConfigureAwait(false); - if (item.IsFolder) + // Collection folders don't validate their children so we'll have to simulate that here + var collectionFolder = item as CollectionFolder; + + if (collectionFolder != null) { - // Collection folders don't validate their children so we'll have to simulate that here - var collectionFolder = item as CollectionFolder; + await RefreshCollectionFolderChildren(options, collectionFolder).ConfigureAwait(false); + } + else + { + var folder = item as Folder; - if (collectionFolder != null) + if (folder != null) { - await RefreshCollectionFolderChildren(options, collectionFolder).ConfigureAwait(false); - } - else - { - var folder = (Folder)item; - await folder.ValidateChildren(new Progress(), cancellationToken, options).ConfigureAwait(false); } } From f1fb2128ac5a0cab67b3384d1eabecf54a8e71bd Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Thu, 5 Jan 2017 23:38:49 -0500 Subject: [PATCH 031/111] 3.1.268 --- SharedVersion.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SharedVersion.cs b/SharedVersion.cs index 3a0ec44ca8..b05568e0cb 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 ce00a4f84c4ab4cea1241eaaff4801fea7479733 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Fri, 6 Jan 2017 15:09:17 -0500 Subject: [PATCH 032/111] update hls params --- .../Playback/Hls/BaseHlsService.cs | 26 +++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/MediaBrowser.Api/Playback/Hls/BaseHlsService.cs b/MediaBrowser.Api/Playback/Hls/BaseHlsService.cs index 299cb33fa6..4c9d6b69da 100644 --- a/MediaBrowser.Api/Playback/Hls/BaseHlsService.cs +++ b/MediaBrowser.Api/Playback/Hls/BaseHlsService.cs @@ -243,7 +243,7 @@ namespace MediaBrowser.Api.Playback.Hls var threads = GetNumberOfThreads(state, false); - var inputModifier = GetInputModifier(state); + var inputModifier = GetInputModifier(state, true); // If isEncoding is true we're actually starting ffmpeg var startNumberParam = isEncoding ? GetStartNumber(state).ToString(UsCulture) : "0"; @@ -256,10 +256,32 @@ namespace MediaBrowser.Api.Playback.Hls "hls/" + Path.GetFileNameWithoutExtension(outputPath)); } + var useGenericSegmenter = false; + if (useGenericSegmenter) + { + var outputTsArg = Path.Combine(Path.GetDirectoryName(outputPath), Path.GetFileNameWithoutExtension(outputPath)) + "%d" + GetSegmentFileExtension(state); + + var timeDeltaParam = String.Empty; + + return string.Format("{0} {1} -map_metadata -1 -map_chapters -1 -threads {2} {3} {4} {5} -f segment -max_delay 5000000 -avoid_negative_ts disabled -start_at_zero -segment_time {6} {10} -individual_header_trailer 0 -segment_format mpegts -segment_list_type m3u8 -segment_start_number {7} -segment_list \"{8}\" -y \"{9}\"", + inputModifier, + GetInputArgument(state), + threads, + GetMapArgs(state), + GetVideoArguments(state), + GetAudioArguments(state), + state.SegmentLength.ToString(UsCulture), + startNumberParam, + outputPath, + outputTsArg, + timeDeltaParam + ).Trim(); + } + // add when stream copying? // -avoid_negative_ts make_zero -fflags +genpts - var args = string.Format("{0} {1} {2} -map_metadata -1 -map_chapters -1 -threads {3} {4} {5} -fflags +genpts -sc_threshold 0 {6} -hls_time {7} -start_number {8} -hls_list_size {9}{10} -y \"{11}\"", + var args = string.Format("{0} {1} {2} -map_metadata -1 -map_chapters -1 -threads {3} {4} {5} -max_delay 5000000 -avoid_negative_ts disabled -start_at_zero {6} -hls_time {7} -individual_header_trailer 0 -start_number {8} -hls_list_size {9}{10} -y \"{11}\"", itsOffset, inputModifier, GetInputArgument(state), From 16c08af1783baa7ee29833e7e4f50c3e2108f359 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Fri, 6 Jan 2017 15:10:08 -0500 Subject: [PATCH 033/111] 3.1.269 --- SharedVersion.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SharedVersion.cs b/SharedVersion.cs index b05568e0cb..e94a9f5160 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 b253b86338c613d9977a4db70bef3e5a6eb4f2c5 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Sat, 7 Jan 2017 03:04:18 -0500 Subject: [PATCH 034/111] update m3u media sources --- Emby.Server.Implementations/LiveTv/TunerHosts/M3UTunerHost.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Emby.Server.Implementations/LiveTv/TunerHosts/M3UTunerHost.cs b/Emby.Server.Implementations/LiveTv/TunerHosts/M3UTunerHost.cs index 8027ce2dd7..05d71214eb 100644 --- a/Emby.Server.Implementations/LiveTv/TunerHosts/M3UTunerHost.cs +++ b/Emby.Server.Implementations/LiveTv/TunerHosts/M3UTunerHost.cs @@ -155,7 +155,8 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts ReadAtNativeFramerate = false, Id = channel.Path.GetMD5().ToString("N"), - IsInfiniteStream = true + IsInfiniteStream = true, + SupportsDirectStream = false }; return new List { mediaSource }; From ba9222898b9ad0e5165fc7d34636cdbbc3385dba Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Sat, 7 Jan 2017 03:04:54 -0500 Subject: [PATCH 035/111] update intro queries --- .../Data/SqliteItemRepository.cs | 4 ++-- .../Intros/DefaultIntroProvider.cs | 10 ++++++++-- MediaBrowser.Controller/Entities/BaseItem.cs | 1 + MediaBrowser.Controller/Entities/InternalItemsQuery.cs | 3 +++ 4 files changed, 14 insertions(+), 4 deletions(-) diff --git a/Emby.Server.Implementations/Data/SqliteItemRepository.cs b/Emby.Server.Implementations/Data/SqliteItemRepository.cs index a6119f1556..06704bafad 100644 --- a/Emby.Server.Implementations/Data/SqliteItemRepository.cs +++ b/Emby.Server.Implementations/Data/SqliteItemRepository.cs @@ -3368,9 +3368,9 @@ namespace Emby.Server.Implementations.Data } } - if (query.SimilarTo != null) + if (query.SimilarTo != null && query.MinSimilarityScore > 0) { - whereClauses.Add("SimilarityScore > 0"); + whereClauses.Add("SimilarityScore > " + (query.MinSimilarityScore - 1).ToString(CultureInfo.InvariantCulture)); } if (query.IsFolder.HasValue) diff --git a/Emby.Server.Implementations/Intros/DefaultIntroProvider.cs b/Emby.Server.Implementations/Intros/DefaultIntroProvider.cs index 180f6aba7f..90bb2f5c07 100644 --- a/Emby.Server.Implementations/Intros/DefaultIntroProvider.cs +++ b/Emby.Server.Implementations/Intros/DefaultIntroProvider.cs @@ -100,7 +100,12 @@ namespace Emby.Server.Implementations.Intros if (trailerTypes.Count > 0) { - var trailerResult = _libraryManager.GetItemList(new InternalItemsQuery + if (trailerTypes.Count >= 5) + { + trailerTypes.Clear(); + } + + var trailerResult = _libraryManager.GetItemList(new InternalItemsQuery(user) { IncludeItemTypes = new[] { typeof(Trailer).Name }, TrailerTypes = trailerTypes.ToArray(), @@ -111,7 +116,8 @@ namespace Emby.Server.Implementations.Intros // Account for duplicates by imdb id, since the database doesn't support this yet Limit = config.TrailerLimit * 2, - SourceTypes = sourceTypes.ToArray() + SourceTypes = sourceTypes.ToArray(), + MinSimilarityScore = 0 }).Where(i => string.IsNullOrWhiteSpace(i.GetProviderId(MetadataProviders.Imdb)) || !string.Equals(i.GetProviderId(MetadataProviders.Imdb), item.GetProviderId(MetadataProviders.Imdb), StringComparison.OrdinalIgnoreCase)).Take(config.TrailerLimit); diff --git a/MediaBrowser.Controller/Entities/BaseItem.cs b/MediaBrowser.Controller/Entities/BaseItem.cs index 9e32fd1991..c8f49820ff 100644 --- a/MediaBrowser.Controller/Entities/BaseItem.cs +++ b/MediaBrowser.Controller/Entities/BaseItem.cs @@ -53,6 +53,7 @@ namespace MediaBrowser.Controller.Entities ImageInfos = new List(); InheritedTags = new List(); ProductionLocations = new List(); + SourceType = SourceType.Library; } public static readonly char[] SlugReplaceChars = { '?', '/', '&' }; diff --git a/MediaBrowser.Controller/Entities/InternalItemsQuery.cs b/MediaBrowser.Controller/Entities/InternalItemsQuery.cs index 15af0888d5..f5af7d5c64 100644 --- a/MediaBrowser.Controller/Entities/InternalItemsQuery.cs +++ b/MediaBrowser.Controller/Entities/InternalItemsQuery.cs @@ -160,6 +160,7 @@ namespace MediaBrowser.Controller.Entities public DateTime? MinDateLastSaved { get; set; } public DtoOptions DtoOptions { get; set; } + public int MinSimilarityScore { get; set; } public bool HasField(ItemFields name) { @@ -197,6 +198,8 @@ namespace MediaBrowser.Controller.Entities public InternalItemsQuery() { + MinSimilarityScore = 1; + GroupByPresentationUniqueKey = true; EnableTotalRecordCount = true; From a2555630f4c74767712d1826665a59ced2667c4b Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Sat, 7 Jan 2017 03:08:18 -0500 Subject: [PATCH 036/111] update channel params --- MediaBrowser.Controller/Channels/ChannelMediaInfo.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MediaBrowser.Controller/Channels/ChannelMediaInfo.cs b/MediaBrowser.Controller/Channels/ChannelMediaInfo.cs index 1216ae3522..42ba709ab5 100644 --- a/MediaBrowser.Controller/Channels/ChannelMediaInfo.cs +++ b/MediaBrowser.Controller/Channels/ChannelMediaInfo.cs @@ -65,7 +65,7 @@ namespace MediaBrowser.Controller.Channels Name = id, Id = id, ReadAtNativeFramerate = ReadAtNativeFramerate, - SupportsDirectStream = Protocol == MediaProtocol.File, + SupportsDirectStream = false, SupportsDirectPlay = SupportsDirectPlay }; From 552e21b8647677220ad0cf43578239a3eab3441b Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Sat, 7 Jan 2017 03:08:34 -0500 Subject: [PATCH 037/111] add fr-ca to languages --- Emby.Server.Implementations/Localization/iso6392.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/Emby.Server.Implementations/Localization/iso6392.txt b/Emby.Server.Implementations/Localization/iso6392.txt index 665a5375e4..5616d41bc3 100644 --- a/Emby.Server.Implementations/Localization/iso6392.txt +++ b/Emby.Server.Implementations/Localization/iso6392.txt @@ -137,6 +137,7 @@ fon|||Fon|fon fre|fra|fr|French|français frm|||French, Middle (ca.1400-1600)|français moyen (1400-1600) fro|||French, Old (842-ca.1400)|français ancien (842-ca.1400) +frc||fr-ca|French (Canada)|french frr|||Northern Frisian|frison septentrional frs|||Eastern Frisian|frison oriental fry||fy|Western Frisian|frison occidental From b578877ac486a6e9c5e4e57bb7d037ff967514a9 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Sat, 7 Jan 2017 03:09:24 -0500 Subject: [PATCH 038/111] update hls params --- MediaBrowser.Api/Playback/Hls/BaseHlsService.cs | 7 ------- .../Playback/Hls/DynamicHlsService.cs | 2 +- MediaBrowser.Api/Playback/StreamState.cs | 16 +++++++++++++--- 3 files changed, 14 insertions(+), 11 deletions(-) diff --git a/MediaBrowser.Api/Playback/Hls/BaseHlsService.cs b/MediaBrowser.Api/Playback/Hls/BaseHlsService.cs index 4c9d6b69da..97072115dc 100644 --- a/MediaBrowser.Api/Playback/Hls/BaseHlsService.cs +++ b/MediaBrowser.Api/Playback/Hls/BaseHlsService.cs @@ -309,13 +309,6 @@ namespace MediaBrowser.Api.Playback.Hls return 0; } - protected bool IsLiveStream(StreamState state) - { - var isLiveStream = (state.RunTimeTicks ?? 0) == 0; - - return isLiveStream; - } - public BaseHlsService(IServerConfigurationManager serverConfig, IUserManager userManager, ILibraryManager libraryManager, IIsoManager isoManager, IMediaEncoder mediaEncoder, IFileSystem fileSystem, IDlnaManager dlnaManager, ISubtitleEncoder subtitleEncoder, IDeviceManager deviceManager, IMediaSourceManager mediaSourceManager, IZipClient zipClient, IJsonSerializer jsonSerializer, IAuthorizationContext authorizationContext) : base(serverConfig, userManager, libraryManager, isoManager, mediaEncoder, fileSystem, dlnaManager, subtitleEncoder, deviceManager, mediaSourceManager, zipClient, jsonSerializer, authorizationContext) { } diff --git a/MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs b/MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs index cd8d05996b..e922094ada 100644 --- a/MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs +++ b/MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs @@ -521,7 +521,7 @@ namespace MediaBrowser.Api.Playback.Hls builder.AppendLine("#EXTM3U"); - var isLiveStream = IsLiveStream(state); + var isLiveStream = state.IsSegmentedLiveStream; var queryStringIndex = Request.RawUrl.IndexOf('?'); var queryString = queryStringIndex == -1 ? string.Empty : Request.RawUrl.Substring(queryStringIndex); diff --git a/MediaBrowser.Api/Playback/StreamState.cs b/MediaBrowser.Api/Playback/StreamState.cs index e9e3c33c0e..ab0bfd502b 100644 --- a/MediaBrowser.Api/Playback/StreamState.cs +++ b/MediaBrowser.Api/Playback/StreamState.cs @@ -89,17 +89,25 @@ namespace MediaBrowser.Api.Playback return 10; } - if (!RunTimeTicks.HasValue) + if (IsSegmentedLiveStream) { return 3; } - return 3; + return 6; } return 3; } } + public bool IsSegmentedLiveStream + { + get + { + return TranscodingType != TranscodingJobType.Progressive && !RunTimeTicks.HasValue; + } + } + public int HlsListSize { get @@ -119,8 +127,9 @@ namespace MediaBrowser.Api.Playback public List SupportedAudioCodecs { get; set; } public List SupportedVideoCodecs { get; set; } public string UserAgent { get; set; } + public TranscodingJobType TranscodingType { get; set; } - public StreamState(IMediaSourceManager mediaSourceManager, ILogger logger) + public StreamState(IMediaSourceManager mediaSourceManager, ILogger logger, TranscodingJobType transcodingType) { _mediaSourceManager = mediaSourceManager; _logger = logger; @@ -128,6 +137,7 @@ namespace MediaBrowser.Api.Playback SupportedVideoCodecs = new List(); PlayableStreamFileNames = new List(); RemoteHttpHeaders = new Dictionary(StringComparer.OrdinalIgnoreCase); + TranscodingType = transcodingType; } public string InputAudioSync { get; set; } From 9a360eeaed1dc5e4be232af9379cbb67100c4b69 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Sat, 7 Jan 2017 15:45:20 -0500 Subject: [PATCH 039/111] update project --- MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj | 3 --- 1 file changed, 3 deletions(-) diff --git a/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj b/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj index ea2b299383..7afb140ac4 100644 --- a/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj +++ b/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj @@ -849,9 +849,6 @@ PreserveNewest - - PreserveNewest - PreserveNewest From ee084849a1ecfe44c8d0031c3860905115acb84d Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Sat, 7 Jan 2017 15:49:35 -0500 Subject: [PATCH 040/111] fix param --- MediaBrowser.Api/Playback/BaseStreamingService.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MediaBrowser.Api/Playback/BaseStreamingService.cs b/MediaBrowser.Api/Playback/BaseStreamingService.cs index 0e0a22c392..58046454ea 100644 --- a/MediaBrowser.Api/Playback/BaseStreamingService.cs +++ b/MediaBrowser.Api/Playback/BaseStreamingService.cs @@ -1885,7 +1885,7 @@ namespace MediaBrowser.Api.Playback request.AudioCodec = InferAudioCodec(url); } - var state = new StreamState(MediaSourceManager, Logger) + var state = new StreamState(MediaSourceManager, Logger, TranscodingJobType) { Request = request, RequestedUrl = url, From b738d560bf54577618ccfeeb6d363d789042b68f Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Sat, 7 Jan 2017 15:52:56 -0500 Subject: [PATCH 041/111] update audio metadata --- .../MediaInfo/FFProbeProvider.cs | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/MediaBrowser.Providers/MediaInfo/FFProbeProvider.cs b/MediaBrowser.Providers/MediaInfo/FFProbeProvider.cs index eaffc12d78..15f9853ec8 100644 --- a/MediaBrowser.Providers/MediaInfo/FFProbeProvider.cs +++ b/MediaBrowser.Providers/MediaInfo/FFProbeProvider.cs @@ -20,9 +20,6 @@ using System; using System.Linq; using System.Threading; using System.Threading.Tasks; -using MediaBrowser.Common.IO; -using MediaBrowser.Controller.IO; -using MediaBrowser.Model.IO; using MediaBrowser.Model.Globalization; namespace MediaBrowser.Providers.MediaInfo @@ -35,6 +32,8 @@ namespace MediaBrowser.Providers.MediaInfo ICustomMetadataProvider, ICustomMetadataProvider