From 2e2929c77f720611e33661293ca50d78cc607f9d Mon Sep 17 00:00:00 2001 From: Luke Date: Thu, 24 Dec 2015 02:00:23 -0500 Subject: [PATCH 01/15] fixes #1348 - [Feature Request] Option for single subtitle on DLNA config. --- MediaBrowser.Dlna/Didl/DidlBuilder.cs | 13 ++++++++++--- MediaBrowser.Model/Dlna/DeviceProfile.cs | 3 ++- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/MediaBrowser.Dlna/Didl/DidlBuilder.cs b/MediaBrowser.Dlna/Didl/DidlBuilder.cs index 5589a6e3ba..0a5b591ec5 100644 --- a/MediaBrowser.Dlna/Didl/DidlBuilder.cs +++ b/MediaBrowser.Dlna/Didl/DidlBuilder.cs @@ -175,19 +175,24 @@ namespace MediaBrowser.Dlna.Didl { if (subtitle.DeliveryMethod == SubtitleDeliveryMethod.External) { - AddSubtitleElement(container, subtitle); + var subtitleAdded = AddSubtitleElement(container, subtitle); + + if (subtitleAdded && _profile.EnableSingleSubtitleLimit) + { + break; + } } } } - private void AddSubtitleElement(XmlElement container, SubtitleStreamInfo info) + private bool AddSubtitleElement(XmlElement container, SubtitleStreamInfo info) { var subtitleProfile = _profile.SubtitleProfiles .FirstOrDefault(i => string.Equals(info.Format, i.Format, StringComparison.OrdinalIgnoreCase) && i.Method == SubtitleDeliveryMethod.External); if (subtitleProfile == null) { - return; + return false; } var subtitleMode = subtitleProfile.DidlMode; @@ -226,6 +231,8 @@ namespace MediaBrowser.Dlna.Didl container.AppendChild(res); } + + return true; } private void AddVideoResource(XmlElement container, IHasMediaSources video, string deviceId, Filter filter, string contentFeatures, StreamInfo streamInfo) diff --git a/MediaBrowser.Model/Dlna/DeviceProfile.cs b/MediaBrowser.Model/Dlna/DeviceProfile.cs index 6d4aa34a3c..5554c0623e 100644 --- a/MediaBrowser.Model/Dlna/DeviceProfile.cs +++ b/MediaBrowser.Model/Dlna/DeviceProfile.cs @@ -36,7 +36,8 @@ namespace MediaBrowser.Model.Dlna public string SerialNumber { get; set; } public bool EnableAlbumArtInDidl { get; set; } - public bool EnableSingleAlbumArtLimit { get; set; } + public bool EnableSingleAlbumArtLimit { get; set; } + public bool EnableSingleSubtitleLimit { get; set; } public string SupportedMediaTypes { get; set; } From cc315c573c0b48b5d0f3ad256ddd322c56c75512 Mon Sep 17 00:00:00 2001 From: Luke Date: Thu, 24 Dec 2015 02:15:39 -0500 Subject: [PATCH 02/15] fixes #1349 - Problem with Greek subtitle download --- .../Subtitles/OpenSubtitleDownloader.cs | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/MediaBrowser.Providers/Subtitles/OpenSubtitleDownloader.cs b/MediaBrowser.Providers/Subtitles/OpenSubtitleDownloader.cs index b4accff95c..74296db8aa 100644 --- a/MediaBrowser.Providers/Subtitles/OpenSubtitleDownloader.cs +++ b/MediaBrowser.Providers/Subtitles/OpenSubtitleDownloader.cs @@ -222,6 +222,17 @@ namespace MediaBrowser.Providers.Subtitles }); } + private string NormalizeLanguage(string language) + { + // Problem with Greek subtitle download #1349 + if (string.Equals (language, "gre", StringComparison.OrdinalIgnoreCase)) { + + return "ell"; + } + + return language; + } + public async Task> Search(SubtitleSearchRequest request, CancellationToken cancellationToken) { var imdbIdText = request.GetProviderId(MetadataProviders.Imdb); @@ -258,7 +269,7 @@ namespace MediaBrowser.Providers.Subtitles await Login(cancellationToken).ConfigureAwait(false); - var subLanguageId = request.Language; + var subLanguageId = NormalizeLanguage(request.Language); var hash = Utilities.ComputeHash(request.MediaPath); var fileInfo = new FileInfo(request.MediaPath); var movieByteSize = fileInfo.Length; From c8536040ba7322075b18e29a958f7df4b5e069c3 Mon Sep 17 00:00:00 2001 From: Luke Date: Thu, 24 Dec 2015 13:43:45 -0500 Subject: [PATCH 03/15] fixes #1290 - upgrade audio formats --- MediaBrowser.Model/Net/MimeTypes.cs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/MediaBrowser.Model/Net/MimeTypes.cs b/MediaBrowser.Model/Net/MimeTypes.cs index e905af58da..a138145381 100644 --- a/MediaBrowser.Model/Net/MimeTypes.cs +++ b/MediaBrowser.Model/Net/MimeTypes.cs @@ -238,7 +238,11 @@ namespace MediaBrowser.Model.Net if (StringHelper.EqualsIgnoreCase(ext, ".oga")) { return "audio/ogg"; - } + } + if (StringHelper.EqualsIgnoreCase(ext, ".opus")) + { + return "audio/opus"; + } // Playlists if (StringHelper.EqualsIgnoreCase(ext, ".m3u8")) From 07d0384e87d1b9d8c7b480b27705889b65f327ab Mon Sep 17 00:00:00 2001 From: Luke Date: Thu, 24 Dec 2015 12:49:59 -0500 Subject: [PATCH 04/15] fixes #1347 - Issue with subtitles when resuming using DLNA Play To --- MediaBrowser.Model/Dlna/StreamInfo.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MediaBrowser.Model/Dlna/StreamInfo.cs b/MediaBrowser.Model/Dlna/StreamInfo.cs index 9794729481..f5c54e160a 100644 --- a/MediaBrowser.Model/Dlna/StreamInfo.cs +++ b/MediaBrowser.Model/Dlna/StreamInfo.cs @@ -269,7 +269,7 @@ namespace MediaBrowser.Model.Dlna // HLS will preserve timestamps so we can just grab the full subtitle stream long startPositionTicks = StringHelper.EqualsIgnoreCase(SubProtocol, "hls") ? 0 - : StartPositionTicks; + : (this.PlayMethod == PlayMethod.Transcode ? StartPositionTicks : 0); // First add the selected track if (SubtitleStreamIndex.HasValue) From fb3c69c61207e9f9fe87b515932a81228c4942d4 Mon Sep 17 00:00:00 2001 From: Luke Date: Thu, 24 Dec 2015 15:06:52 -0500 Subject: [PATCH 05/15] fixes #1310 - Downscaling 1280x720 to 720x404 --- .../Playback/BaseStreamingService.cs | 5 +++- .../Encoder/EncodingJobFactory.cs | 5 +++- .../Dlna/ResolutionNormalizer.cs | 23 +++++++++++++++---- 3 files changed, 27 insertions(+), 6 deletions(-) diff --git a/MediaBrowser.Api/Playback/BaseStreamingService.cs b/MediaBrowser.Api/Playback/BaseStreamingService.cs index fa230473bf..fcdd01c732 100644 --- a/MediaBrowser.Api/Playback/BaseStreamingService.cs +++ b/MediaBrowser.Api/Playback/BaseStreamingService.cs @@ -1623,7 +1623,10 @@ namespace MediaBrowser.Api.Playback if (state.OutputVideoBitrate.HasValue) { - var resolution = ResolutionNormalizer.Normalize(state.OutputVideoBitrate.Value, + var resolution = ResolutionNormalizer.Normalize( + state.VideoStream == null ? (int?)null : state.VideoStream.BitRate, + state.OutputVideoBitrate.Value, + state.VideoStream == null ? null : state.VideoStream.Codec, state.OutputVideoCodec, videoRequest.MaxWidth, videoRequest.MaxHeight); diff --git a/MediaBrowser.MediaEncoding/Encoder/EncodingJobFactory.cs b/MediaBrowser.MediaEncoding/Encoder/EncodingJobFactory.cs index 692fe2b6ad..afbd29578e 100644 --- a/MediaBrowser.MediaEncoding/Encoder/EncodingJobFactory.cs +++ b/MediaBrowser.MediaEncoding/Encoder/EncodingJobFactory.cs @@ -82,7 +82,10 @@ namespace MediaBrowser.MediaEncoding.Encoder if (state.OutputVideoBitrate.HasValue) { - var resolution = ResolutionNormalizer.Normalize(state.OutputVideoBitrate.Value, + var resolution = ResolutionNormalizer.Normalize( + state.VideoStream == null ? (int?)null : state.VideoStream.BitRate, + state.OutputVideoBitrate.Value, + state.VideoStream == null ? null : state.VideoStream.Codec, state.OutputVideoCodec, request.MaxWidth, request.MaxHeight); diff --git a/MediaBrowser.Model/Dlna/ResolutionNormalizer.cs b/MediaBrowser.Model/Dlna/ResolutionNormalizer.cs index b23c0b20b1..8a412ac2c6 100644 --- a/MediaBrowser.Model/Dlna/ResolutionNormalizer.cs +++ b/MediaBrowser.Model/Dlna/ResolutionNormalizer.cs @@ -14,14 +14,29 @@ namespace MediaBrowser.Model.Dlna new ResolutionConfiguration(1280, 2500000) }; - public static ResolutionOptions Normalize(int maxBitrate, - string codec, + public static ResolutionOptions Normalize(int? inputBitrate, + int outputBitrate, + string inputCodec, + string outputCodec, int? maxWidth, int? maxHeight) { - foreach (var config in Configurations) + // If the bitrate isn't changing, then don't downlscale the resolution + if (inputBitrate.HasValue && outputBitrate >= inputBitrate.Value) + { + if (maxWidth.HasValue || maxHeight.HasValue) + { + return new ResolutionOptions + { + MaxWidth = maxWidth, + MaxHeight = maxHeight + }; + } + } + + foreach (var config in Configurations) { - if (maxBitrate <= config.MaxBitrate) + if (outputBitrate <= config.MaxBitrate) { var originvalValue = maxWidth; From dcae643097dd0ccef6fd2aa8b7fe659d13d619d8 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Fri, 25 Dec 2015 23:08:25 -0500 Subject: [PATCH 06/15] fixes #898 - Google Cast Ready --- MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj | 3 +++ 1 file changed, 3 insertions(+) diff --git a/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj b/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj index a5d9537cf1..298f2effc2 100644 --- a/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj +++ b/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj @@ -104,6 +104,9 @@ PreserveNewest + + PreserveNewest + PreserveNewest From c2a88b8a9de6fa82bc1c0244ad07006aafeb9a33 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Sat, 26 Dec 2015 09:29:25 -0500 Subject: [PATCH 07/15] fixes #1243 - Cannot set local address. If detection is wrong, chromecast fails --- MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj | 3 +++ 1 file changed, 3 insertions(+) diff --git a/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj b/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj index 298f2effc2..da49e6e13c 100644 --- a/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj +++ b/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj @@ -98,6 +98,9 @@ + + PreserveNewest + PreserveNewest From c5f5e0175b37ff66dd751cc56d3aa2b967c0f01c Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Sat, 26 Dec 2015 03:07:24 -0500 Subject: [PATCH 08/15] update subtitles --- .../MediaEncoding/MediaStreamSelector.cs | 37 +++++++++++++++++++ .../Configuration/SubtitlePlaybackMode.cs | 3 +- 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/MediaBrowser.Controller/MediaEncoding/MediaStreamSelector.cs b/MediaBrowser.Controller/MediaEncoding/MediaStreamSelector.cs index a006a17230..52199c5a21 100644 --- a/MediaBrowser.Controller/MediaEncoding/MediaStreamSelector.cs +++ b/MediaBrowser.Controller/MediaEncoding/MediaStreamSelector.cs @@ -50,6 +50,22 @@ namespace MediaBrowser.Controller.MediaEncoding if (mode == SubtitlePlaybackMode.Default) { + // Prefer embedded metadata over smart logic + + stream = streams.FirstOrDefault(s => s.IsForced && string.Equals(s.Language, audioTrackLanguage, StringComparison.OrdinalIgnoreCase)) ?? + streams.FirstOrDefault(s => s.IsForced) ?? + streams.FirstOrDefault(s => s.IsDefault); + + // if the audio language is not understood by the user, load their preferred subs, if there are any + if (stream == null && !ContainsOrdinal(preferredLanguages, audioTrackLanguage)) + { + stream = streams.Where(s => !s.IsForced).FirstOrDefault(s => ContainsOrdinal(preferredLanguages, s.Language)); + } + } + else if (mode == SubtitlePlaybackMode.Smart) + { + // Prefer smart logic over embedded metadata + // if the audio language is not understood by the user, load their preferred subs, if there are any if (!ContainsOrdinal(preferredLanguages, audioTrackLanguage)) { @@ -61,6 +77,12 @@ namespace MediaBrowser.Controller.MediaEncoding // always load the most suitable full subtitles stream = streams.FirstOrDefault(s => !s.IsForced); } + else if (mode == SubtitlePlaybackMode.OnlyForced) + { + // always load the most suitable full subtitles + stream = streams.FirstOrDefault(s => s.IsForced && string.Equals(s.Language, audioTrackLanguage, StringComparison.OrdinalIgnoreCase)) ?? + streams.FirstOrDefault(s => s.IsForced); + } // load forced subs if we have found no suitable full subtitles stream = stream ?? streams.FirstOrDefault(s => s.IsForced && string.Equals(s.Language, audioTrackLanguage, StringComparison.OrdinalIgnoreCase)); @@ -112,6 +134,15 @@ namespace MediaBrowser.Controller.MediaEncoding if (mode == SubtitlePlaybackMode.Default) { + // Prefer embedded metadata over smart logic + + filteredStreams = streams.Where(s => s.IsForced || s.IsDefault) + .ToList(); + } + else if (mode == SubtitlePlaybackMode.Smart) + { + // Prefer smart logic over embedded metadata + // if the audio language is not understood by the user, load their preferred subs, if there are any if (!ContainsOrdinal(preferredLanguages, audioTrackLanguage)) { @@ -125,6 +156,11 @@ namespace MediaBrowser.Controller.MediaEncoding filteredStreams = streams.Where(s => !s.IsForced) .ToList(); } + else if (mode == SubtitlePlaybackMode.OnlyForced) + { + // always load the most suitable full subtitles + filteredStreams = streams.Where(s => s.IsForced).ToList(); + } // load forced subs if we have found no suitable full subtitles if (filteredStreams.Count == 0) @@ -148,6 +184,7 @@ namespace MediaBrowser.Controller.MediaEncoding values.Add(index == -1 ? 0 : 100 - index); + values.Add(stream.IsForced ? 1 : 0); values.Add(stream.IsDefault ? 1 : 0); values.Add(stream.SupportsExternalStream ? 1 : 0); values.Add(stream.IsTextSubtitleStream ? 1 : 0); diff --git a/MediaBrowser.Model/Configuration/SubtitlePlaybackMode.cs b/MediaBrowser.Model/Configuration/SubtitlePlaybackMode.cs index e6a3c3091e..fbee912d9f 100644 --- a/MediaBrowser.Model/Configuration/SubtitlePlaybackMode.cs +++ b/MediaBrowser.Model/Configuration/SubtitlePlaybackMode.cs @@ -5,6 +5,7 @@ Default = 0, Always = 1, OnlyForced = 2, - None = 3 + None = 3, + Smart = 4 } } \ No newline at end of file From fda7c3e9f8767bff7ddffc3b32d71d3055f25a00 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Sat, 26 Dec 2015 12:01:23 -0500 Subject: [PATCH 09/15] update translations --- .../Localization/Core/ca.json | 28 +++++++++---------- .../Localization/Core/es.json | 2 +- .../Localization/Core/pl.json | 2 +- 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/MediaBrowser.Server.Implementations/Localization/Core/ca.json b/MediaBrowser.Server.Implementations/Localization/Core/ca.json index c0fffff1f1..33fd30c367 100644 --- a/MediaBrowser.Server.Implementations/Localization/Core/ca.json +++ b/MediaBrowser.Server.Implementations/Localization/Core/ca.json @@ -31,24 +31,24 @@ "CategoryApplication": "Aplicaci\u00f3", "CategoryPlugin": "Complement", "NotificationOptionPluginError": "Plugin failure", - "NotificationOptionApplicationUpdateAvailable": "Application update available", - "NotificationOptionApplicationUpdateInstalled": "Application update installed", - "NotificationOptionPluginUpdateInstalled": "Plugin update installed", + "NotificationOptionApplicationUpdateAvailable": "Actualitzaci\u00f3 d'aplicaci\u00f3 disponible", + "NotificationOptionApplicationUpdateInstalled": "Actualitzaci\u00f3 d'aplicaci\u00f3 instal\u00b7lada", + "NotificationOptionPluginUpdateInstalled": "Actualitzaci\u00f3 de complement instal\u00b7lada", "NotificationOptionPluginInstalled": "Complement instal\u00b7lat", "NotificationOptionPluginUninstalled": "Complement desinstal\u00b7lat", - "NotificationOptionVideoPlayback": "Video playback started", - "NotificationOptionAudioPlayback": "Audio playback started", + "NotificationOptionVideoPlayback": "Reproducci\u00f3 de v\u00eddeo iniciada", + "NotificationOptionAudioPlayback": "Reproducci\u00f3 d'\u00e0udio iniciada", "NotificationOptionGamePlayback": "Game playback started", - "NotificationOptionVideoPlaybackStopped": "Video playback stopped", - "NotificationOptionAudioPlaybackStopped": "Audio playback stopped", + "NotificationOptionVideoPlaybackStopped": "Reproducci\u00f3 de v\u00eddeo aturada", + "NotificationOptionAudioPlaybackStopped": "Reproducci\u00f3 d'\u00e0udio aturada", "NotificationOptionGamePlaybackStopped": "Game playback stopped", - "NotificationOptionTaskFailed": "Scheduled task failure", - "NotificationOptionInstallationFailed": "Installation failure", + "NotificationOptionTaskFailed": "Tasca programada fallida", + "NotificationOptionInstallationFailed": "Instal\u00b7laci\u00f3 fallida", "NotificationOptionNewLibraryContent": "Nou contingut afegit", "NotificationOptionNewLibraryContentMultiple": "Nous continguts afegits", "NotificationOptionCameraImageUploaded": "Camera image uploaded", - "NotificationOptionUserLockedOut": "User locked out", - "NotificationOptionServerRestartRequired": "Server restart required", + "NotificationOptionUserLockedOut": "Usuari blocat", + "NotificationOptionServerRestartRequired": "Cal reiniciar el servidor", "ViewTypePlaylists": "Llistes de reproducci\u00f3", "ViewTypeMovies": "Pel\u00b7l\u00edcules", "ViewTypeTvShows": "TV", @@ -108,7 +108,7 @@ "UserConfigurationUpdatedWithName": "User configuration has been updated for {0}", "UserCreatedWithName": "User {0} has been created", "UserPasswordChangedWithName": "Password has been changed for user {0}", - "UserDeletedWithName": "User {0} has been deleted", + "UserDeletedWithName": "L'usuari {0} ha estat eliminat", "MessageServerConfigurationUpdated": "Server configuration has been updated", "MessageNamedServerConfigurationUpdatedWithValue": "Server configuration section {0} has been updated", "MessageApplicationUpdated": "Emby Server has been updated", @@ -134,7 +134,7 @@ "HeaderDate": "Data", "HeaderPremiereDate": "Premiere Date", "HeaderDateAdded": "Data afegida", - "HeaderReleaseDate": "Release date", + "HeaderReleaseDate": "Data de publicaci\u00f3", "HeaderRuntime": "Runtime", "HeaderPlayCount": "Play Count", "HeaderSeason": "Temporada", @@ -143,7 +143,7 @@ "HeaderNetwork": "Network", "HeaderYear": "Any:", "HeaderYears": "Anys:", - "HeaderParentalRating": "Parental Rating", + "HeaderParentalRating": "Valoraci\u00f3 Parental", "HeaderCommunityRating": "Community rating", "HeaderTrailers": "Tr\u00e0ilers", "HeaderSpecials": "Specials", diff --git a/MediaBrowser.Server.Implementations/Localization/Core/es.json b/MediaBrowser.Server.Implementations/Localization/Core/es.json index 9bf56e4afb..60dbd1a445 100644 --- a/MediaBrowser.Server.Implementations/Localization/Core/es.json +++ b/MediaBrowser.Server.Implementations/Localization/Core/es.json @@ -11,7 +11,7 @@ "FolderTypeGames": "Juegos", "FolderTypeBooks": "Libros", "FolderTypeTvShows": "TV", - "FolderTypeInherit": "Heredado ", + "FolderTypeInherit": "Heredado", "HeaderCastCrew": "Reparto y equipo t\u00e9cnico", "HeaderPeople": "People", "ValueSpecialEpisodeName": "Special - {0}", diff --git a/MediaBrowser.Server.Implementations/Localization/Core/pl.json b/MediaBrowser.Server.Implementations/Localization/Core/pl.json index 286d39fd59..3b7d56defa 100644 --- a/MediaBrowser.Server.Implementations/Localization/Core/pl.json +++ b/MediaBrowser.Server.Implementations/Localization/Core/pl.json @@ -14,7 +14,7 @@ "FolderTypeInherit": "Dziedzicz", "HeaderCastCrew": "Obsada & Eikpa", "HeaderPeople": "Ludzie", - "ValueSpecialEpisodeName": "Special - {0}", + "ValueSpecialEpisodeName": "Specjalny - {0}", "LabelChapterName": "Rozdzia\u0142 {0}", "NameSeasonNumber": "Sezon {0}", "LabelExit": "Wyj\u015bcie", From 0dcd698c17139b88dd33f4ab091c67525b9d1f98 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Sat, 26 Dec 2015 13:35:53 -0500 Subject: [PATCH 10/15] try to account for sloppy subtitle file naming --- .../MediaInfo/SubtitleResolver.cs | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/MediaBrowser.Providers/MediaInfo/SubtitleResolver.cs b/MediaBrowser.Providers/MediaInfo/SubtitleResolver.cs index 30995ebad7..2c748d2b7e 100644 --- a/MediaBrowser.Providers/MediaInfo/SubtitleResolver.cs +++ b/MediaBrowser.Providers/MediaInfo/SubtitleResolver.cs @@ -33,12 +33,14 @@ namespace MediaBrowser.Providers.MediaInfo var streams = new List(); var videoFileNameWithoutExtension = _fileSystem.GetFileNameWithoutExtension(video.Path); + videoFileNameWithoutExtension = NormalizeFilenameForSubtitleComparison(videoFileNameWithoutExtension); foreach (var file in files) { var fullName = file.FullName; var fileNameWithoutExtension = _fileSystem.GetFileNameWithoutExtension(file); + fileNameWithoutExtension = NormalizeFilenameForSubtitleComparison(fileNameWithoutExtension); var codec = Path.GetExtension(fullName).ToLower().TrimStart('.'); @@ -59,6 +61,8 @@ namespace MediaBrowser.Providers.MediaInfo var isForced = fullName.IndexOf(".forced.", StringComparison.OrdinalIgnoreCase) != -1 || fullName.IndexOf(".foreign.", StringComparison.OrdinalIgnoreCase) != -1; + var isDefault = fullName.IndexOf(".default.", StringComparison.OrdinalIgnoreCase) != -1; + // Support xbmc naming conventions - 300.spanish.srt var language = fileNameWithoutExtension .Replace(".forced", string.Empty, StringComparison.OrdinalIgnoreCase) @@ -84,7 +88,8 @@ namespace MediaBrowser.Providers.MediaInfo Path = fullName, Codec = codec, Language = language, - IsForced = isForced + IsForced = isForced, + IsDefault = isDefault }); } } @@ -92,6 +97,18 @@ namespace MediaBrowser.Providers.MediaInfo return streams; } + private string NormalizeFilenameForSubtitleComparison(string filename) + { + // Try to account for sloppy file naming + filename = filename.Replace("-", string.Empty); + filename = filename.Replace("_", string.Empty); + filename = filename.Replace(" ", string.Empty); + + //filename = filename.Replace(".", string.Empty); + + return filename; + } + private static IEnumerable SubtitleExtensions { get From 575751dbb07a302d21f8602ba56ae22ab45505c4 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Sat, 26 Dec 2015 21:39:11 -0500 Subject: [PATCH 11/15] capture bit depth with ffprobe --- .../Probing/ProbeResultNormalizer.cs | 38 +++++-------------- 1 file changed, 9 insertions(+), 29 deletions(-) diff --git a/MediaBrowser.MediaEncoding/Probing/ProbeResultNormalizer.cs b/MediaBrowser.MediaEncoding/Probing/ProbeResultNormalizer.cs index d9fda220df..befff72d19 100644 --- a/MediaBrowser.MediaEncoding/Probing/ProbeResultNormalizer.cs +++ b/MediaBrowser.MediaEncoding/Probing/ProbeResultNormalizer.cs @@ -159,6 +159,11 @@ namespace MediaBrowser.MediaEncoding.Probing } stream.ChannelLayout = ParseChannelLayout(streamInfo.channel_layout); + + if (streamInfo.bits_per_sample > 0) + { + stream.BitDepth = streamInfo.bits_per_sample; + } } else if (string.Equals(streamInfo.codec_type, "subtitle", StringComparison.OrdinalIgnoreCase)) { @@ -177,7 +182,10 @@ namespace MediaBrowser.MediaEncoding.Probing stream.AverageFrameRate = GetFrameRate(streamInfo.avg_frame_rate); stream.RealFrameRate = GetFrameRate(streamInfo.r_frame_rate); - stream.BitDepth = GetBitDepth(stream.PixelFormat); + if (streamInfo.bits_per_sample > 0) + { + stream.BitDepth = streamInfo.bits_per_sample; + } //stream.IsAnamorphic = string.Equals(streamInfo.sample_aspect_ratio, "0:1", StringComparison.OrdinalIgnoreCase) || // string.Equals(stream.AspectRatio, "2.35:1", StringComparison.OrdinalIgnoreCase) || @@ -236,34 +244,6 @@ namespace MediaBrowser.MediaEncoding.Probing return stream; } - private int? GetBitDepth(string pixelFormat) - { - var eightBit = new List - { - "yuv420p", - "yuv411p", - "yuvj420p", - "uyyvyy411", - "nv12", - "nv21", - "rgb444le", - "rgb444be", - "bgr444le", - "bgr444be", - "yuvj411p" - }; - - if (!string.IsNullOrEmpty(pixelFormat)) - { - if (eightBit.Contains(pixelFormat, StringComparer.OrdinalIgnoreCase)) - { - return 8; - } - } - - return null; - } - /// /// Gets a string from an FFProbeResult tags dictionary /// From 0cbc9c7900145099acb3c1a455f508b4b6320ebf Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Sun, 27 Dec 2015 00:47:02 -0500 Subject: [PATCH 12/15] sync model --- MediaBrowser.Model/Entities/MediaStream.cs | 3 --- MediaBrowser.Model/Library/UserViewQuery.cs | 9 +++++++++ 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/MediaBrowser.Model/Entities/MediaStream.cs b/MediaBrowser.Model/Entities/MediaStream.cs index 79d1df9110..d089f0aa94 100644 --- a/MediaBrowser.Model/Entities/MediaStream.cs +++ b/MediaBrowser.Model/Entities/MediaStream.cs @@ -233,8 +233,5 @@ namespace MediaBrowser.Model.Entities /// /// null if [is cabac] contains no value, true if [is cabac]; otherwise, false. public bool? IsCabac { get; set; } - - [IgnoreDataMember] - public List KeyFrames { get; set; } } } diff --git a/MediaBrowser.Model/Library/UserViewQuery.cs b/MediaBrowser.Model/Library/UserViewQuery.cs index cceb22c848..3915d76449 100644 --- a/MediaBrowser.Model/Library/UserViewQuery.cs +++ b/MediaBrowser.Model/Library/UserViewQuery.cs @@ -15,9 +15,18 @@ namespace MediaBrowser.Model.Library /// true if [include external content]; otherwise, false. public bool IncludeExternalContent { get; set; } + /// + /// Gets or sets a value indicating whether [include hidden]. + /// + /// true if [include hidden]; otherwise, false. + public bool IncludeHidden { get; set; } + + public string[] PresetViews { get; set; } + public UserViewQuery() { IncludeExternalContent = true; + PresetViews = new string[] { }; } } } From 94ec8d87b8479fa94dec579b2c04f3dfe3eba176 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Sun, 27 Dec 2015 01:05:37 -0500 Subject: [PATCH 13/15] update bit depth probe --- .../Probing/InternalMediaInfoResult.cs | 6 ++++++ .../Probing/ProbeResultNormalizer.cs | 8 ++++++++ 2 files changed, 14 insertions(+) diff --git a/MediaBrowser.MediaEncoding/Probing/InternalMediaInfoResult.cs b/MediaBrowser.MediaEncoding/Probing/InternalMediaInfoResult.cs index 3e4bfe1a70..f32dd178f2 100644 --- a/MediaBrowser.MediaEncoding/Probing/InternalMediaInfoResult.cs +++ b/MediaBrowser.MediaEncoding/Probing/InternalMediaInfoResult.cs @@ -144,6 +144,12 @@ namespace MediaBrowser.MediaEncoding.Probing /// The bits_per_sample. public int bits_per_sample { get; set; } + /// + /// Gets or sets the bits_per_raw_sample. + /// + /// The bits_per_raw_sample. + public int bits_per_raw_sample { get; set; } + /// /// Gets or sets the r_frame_rate. /// diff --git a/MediaBrowser.MediaEncoding/Probing/ProbeResultNormalizer.cs b/MediaBrowser.MediaEncoding/Probing/ProbeResultNormalizer.cs index befff72d19..b52446ac64 100644 --- a/MediaBrowser.MediaEncoding/Probing/ProbeResultNormalizer.cs +++ b/MediaBrowser.MediaEncoding/Probing/ProbeResultNormalizer.cs @@ -164,6 +164,10 @@ namespace MediaBrowser.MediaEncoding.Probing { stream.BitDepth = streamInfo.bits_per_sample; } + else if (streamInfo.bits_per_raw_sample > 0) + { + stream.BitDepth = streamInfo.bits_per_raw_sample; + } } else if (string.Equals(streamInfo.codec_type, "subtitle", StringComparison.OrdinalIgnoreCase)) { @@ -186,6 +190,10 @@ namespace MediaBrowser.MediaEncoding.Probing { stream.BitDepth = streamInfo.bits_per_sample; } + else if (streamInfo.bits_per_raw_sample > 0) + { + stream.BitDepth = streamInfo.bits_per_raw_sample; + } //stream.IsAnamorphic = string.Equals(streamInfo.sample_aspect_ratio, "0:1", StringComparison.OrdinalIgnoreCase) || // string.Equals(stream.AspectRatio, "2.35:1", StringComparison.OrdinalIgnoreCase) || From 2fa34a236b322c0a9274b965c110446091c7dd57 Mon Sep 17 00:00:00 2001 From: Luke Date: Fri, 25 Dec 2015 16:21:18 -0500 Subject: [PATCH 14/15] fixes #1075 - XSS in "Active Devices" Panel of Admin Dashboard --- .../HttpServer/Security/AuthorizationContext.cs | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/MediaBrowser.Server.Implementations/HttpServer/Security/AuthorizationContext.cs b/MediaBrowser.Server.Implementations/HttpServer/Security/AuthorizationContext.cs index 509a00ff9b..75d54a80af 100644 --- a/MediaBrowser.Server.Implementations/HttpServer/Security/AuthorizationContext.cs +++ b/MediaBrowser.Server.Implementations/HttpServer/Security/AuthorizationContext.cs @@ -175,11 +175,22 @@ namespace MediaBrowser.Server.Implementations.HttpServer.Security if (param.Length == 2) { - result.Add(param[0], param[1].Trim(new[] { '"' })); + var value = NormalizeValue (param[1].Trim(new[] { '"' })); + result.Add(param[0], value); } } return result; } + + private string NormalizeValue(string value) + { + if (string.IsNullOrWhiteSpace (value)) + { + return value; + } + + return System.Net.WebUtility.HtmlEncode(value); + } } } From d283b33dde35b0990717c5ceb7fd6be5ecdd7072 Mon Sep 17 00:00:00 2001 From: Luke Date: Fri, 25 Dec 2015 16:27:10 -0500 Subject: [PATCH 15/15] update icon text --- MediaBrowser.Server.Mac/MenuBarIcon.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MediaBrowser.Server.Mac/MenuBarIcon.cs b/MediaBrowser.Server.Mac/MenuBarIcon.cs index 4f2f845ded..51ba7f432e 100644 --- a/MediaBrowser.Server.Mac/MenuBarIcon.cs +++ b/MediaBrowser.Server.Mac/MenuBarIcon.cs @@ -139,7 +139,7 @@ namespace MediaBrowser.Server.Mac quitMenuItem.Title = localization.GetLocalizedString("LabelExit"); communityMenuItem.Title = localization.GetLocalizedString("LabelVisitCommunity"); browseMenuItem.Title = localization.GetLocalizedString("LabelBrowseLibrary"); - configureMenuItem.Title = localization.GetLocalizedString("LabelConfigureMediaBrowser"); + configureMenuItem.Title = localization.GetLocalizedString("LabelConfigureServer"); } } }