diff options
11 files changed, 124 insertions, 122 deletions
diff --git a/Emby.Common.Implementations/IO/ManagedFileSystem.cs b/Emby.Common.Implementations/IO/ManagedFileSystem.cs index 62d285072..78070a5d9 100644 --- a/Emby.Common.Implementations/IO/ManagedFileSystem.cs +++ b/Emby.Common.Implementations/IO/ManagedFileSystem.cs @@ -490,38 +490,13 @@ namespace Emby.Common.Implementations.IO var temp1 = Path.GetTempFileName(); // Copying over will fail against hidden files - RemoveHiddenAttribute(file1); - RemoveHiddenAttribute(file2); + SetHidden(file1, false); + SetHidden(file2, false); CopyFile(file1, temp1, true); CopyFile(file2, file1, true); CopyFile(temp1, file2, true); - - DeleteFile(temp1); - } - - /// <summary> - /// Removes the hidden attribute. - /// </summary> - /// <param name="path">The path.</param> - private void RemoveHiddenAttribute(string path) - { - if (string.IsNullOrEmpty(path)) - { - throw new ArgumentNullException("path"); - } - - var currentFile = new FileInfo(path); - - // This will fail if the file is hidden - if (currentFile.Exists) - { - if ((currentFile.Attributes & FileAttributes.Hidden) == FileAttributes.Hidden) - { - currentFile.Attributes &= ~FileAttributes.Hidden; - } - } } public bool ContainsSubPath(string parentPath, string path) diff --git a/Emby.Server.Implementations/Connect/ConnectManager.cs b/Emby.Server.Implementations/Connect/ConnectManager.cs index b7faaa901..8c8b7b026 100644 --- a/Emby.Server.Implementations/Connect/ConnectManager.cs +++ b/Emby.Server.Implementations/Connect/ConnectManager.cs @@ -570,9 +570,9 @@ namespace Emby.Server.Implementations.Connect } catch (HttpException ex) { - if (!ex.StatusCode.HasValue) + if (!ex.StatusCode.HasValue || ex.IsTimedOut) { - throw; + throw new Exception("Unable to invite guest, " + ex.Message, ex); } // If they entered a username, then whatever the error is just throw it, for example, user not found diff --git a/Emby.Server.Implementations/Emby.Server.Implementations.csproj b/Emby.Server.Implementations/Emby.Server.Implementations.csproj index ae2165191..7ee0c566f 100644 --- a/Emby.Server.Implementations/Emby.Server.Implementations.csproj +++ b/Emby.Server.Implementations/Emby.Server.Implementations.csproj @@ -424,6 +424,9 @@ <ItemGroup> <EmbeddedResource Include="Localization\Ratings\us.txt" /> </ItemGroup> + <ItemGroup> + <EmbeddedResource Include="Localization\Ratings\uk.txt" /> + </ItemGroup> <Import Project="$(MSBuildExtensionsPath32)\Microsoft\Portable\$(TargetFrameworkVersion)\Microsoft.Portable.CSharp.targets" /> <!-- To modify your build process, add your task inside one of the targets below and uncomment it. Other similar extension points exist, see Microsoft.Common.targets. diff --git a/Emby.Server.Implementations/HttpServer/HttpListenerHost.cs b/Emby.Server.Implementations/HttpServer/HttpListenerHost.cs index 83885ee2e..4e7dc8836 100644 --- a/Emby.Server.Implementations/HttpServer/HttpListenerHost.cs +++ b/Emby.Server.Implementations/HttpServer/HttpListenerHost.cs @@ -91,16 +91,12 @@ namespace Emby.Server.Implementations.HttpServer readonly Dictionary<Type, int> _mapExceptionToStatusCode = new Dictionary<Type, int> { - {typeof (InvalidOperationException), 500}, - {typeof (NotImplementedException), 500}, {typeof (ResourceNotFoundException), 404}, {typeof (FileNotFoundException), 404}, //{typeof (DirectoryNotFoundException), 404}, {typeof (SecurityException), 401}, {typeof (PaymentRequiredException), 402}, - {typeof (UnauthorizedAccessException), 500}, - {typeof (PlatformNotSupportedException), 500}, - {typeof (NotSupportedException), 500} + {typeof (ArgumentException), 400} }; public override void Configure() @@ -228,6 +224,22 @@ namespace Emby.Server.Implementations.HttpServer } } + private int GetStatusCode(Exception ex) + { + if (ex is ArgumentException) + { + return 400; + } + + int statusCode; + if (!_mapExceptionToStatusCode.TryGetValue(ex.GetType(), out statusCode)) + { + statusCode = 500; + } + + return statusCode; + } + private void ErrorHandler(Exception ex, IRequest httpReq, bool logException = true) { try @@ -244,11 +256,7 @@ namespace Emby.Server.Implementations.HttpServer return; } - int statusCode; - if (!_mapExceptionToStatusCode.TryGetValue(ex.GetType(), out statusCode)) - { - statusCode = 500; - } + var statusCode = GetStatusCode(ex); httpRes.StatusCode = statusCode; httpRes.ContentType = "text/html"; diff --git a/Emby.Server.Implementations/Localization/Ratings/uk.txt b/Emby.Server.Implementations/Localization/Ratings/uk.txt new file mode 100644 index 000000000..20440921f --- /dev/null +++ b/Emby.Server.Implementations/Localization/Ratings/uk.txt @@ -0,0 +1,7 @@ +UK-U,1 +UK-PG,5 +UK-12,7 +UK-12A,7 +UK-15,9 +UK-18,10 +UK-R18,15
\ No newline at end of file diff --git a/MediaBrowser.Api/Playback/BaseStreamingService.cs b/MediaBrowser.Api/Playback/BaseStreamingService.cs index 5e450567a..418ec7fcb 100644 --- a/MediaBrowser.Api/Playback/BaseStreamingService.cs +++ b/MediaBrowser.Api/Playback/BaseStreamingService.cs @@ -870,33 +870,47 @@ namespace MediaBrowser.Api.Playback inputChannels = null; } - int? resultChannels = null; + int? transcoderChannelLimit = null; var codec = outputAudioCodec ?? string.Empty; if (codec.IndexOf("wma", StringComparison.OrdinalIgnoreCase) != -1) { // wmav2 currently only supports two channel output - resultChannels = Math.Min(2, inputChannels ?? 2); + transcoderChannelLimit = 2; } - else if (request.MaxAudioChannels.HasValue) + else if (codec.IndexOf("mp3", StringComparison.OrdinalIgnoreCase) != -1) { - var channelLimit = codec.IndexOf("mp3", StringComparison.OrdinalIgnoreCase) != -1 - ? 2 - : 6; + // libmp3lame currently only supports two channel output + transcoderChannelLimit = 2; + } + else + { + // If we don't have any media info then limit it to 6 to prevent encoding errors due to asking for too many channels + transcoderChannelLimit = 6; + } - if (inputChannels.HasValue) - { - channelLimit = Math.Min(channelLimit, inputChannels.Value); - } + var isTranscodingAudio = !string.Equals(codec, "copy", StringComparison.OrdinalIgnoreCase); - // If we don't have any media info then limit it to 5 to prevent encoding errors due to asking for too many channels - resultChannels = Math.Min(request.MaxAudioChannels.Value, channelLimit); + int? resultChannels = null; + if (isTranscodingAudio) + { + resultChannels = request.TranscodingMaxAudioChannels; } + resultChannels = resultChannels ?? request.MaxAudioChannels ?? request.AudioChannels; - if (request.TranscodingMaxAudioChannels.HasValue && !string.Equals(codec, "copy", StringComparison.OrdinalIgnoreCase)) + if (inputChannels.HasValue) { - resultChannels = Math.Min(request.TranscodingMaxAudioChannels.Value, resultChannels ?? inputChannels ?? request.TranscodingMaxAudioChannels.Value); + resultChannels = resultChannels.HasValue + ? Math.Min(resultChannels.Value, inputChannels.Value) + : inputChannels.Value; + } + + if (isTranscodingAudio && transcoderChannelLimit.HasValue) + { + resultChannels = resultChannels.HasValue + ? Math.Min(resultChannels.Value, transcoderChannelLimit.Value) + : transcoderChannelLimit.Value; } return resultChannels ?? request.AudioChannels; @@ -1054,7 +1068,19 @@ namespace MediaBrowser.Api.Playback arg += string.Format(" -canvas_size {0}:{1}", state.VideoStream.Width.Value.ToString(CultureInfo.InvariantCulture), Convert.ToInt32(height).ToString(CultureInfo.InvariantCulture)); } - arg += " -i \"" + state.SubtitleStream.Path + "\""; + + var subtitlePath = state.SubtitleStream.Path; + + if (string.Equals(Path.GetExtension(subtitlePath), ".sub", StringComparison.OrdinalIgnoreCase)) + { + var idxFile = Path.ChangeExtension(subtitlePath, ".idx"); + if (FileSystem.FileExists(idxFile)) + { + subtitlePath = idxFile; + } + } + + arg += " -i \"" + subtitlePath + "\""; } } diff --git a/MediaBrowser.Controller/MediaEncoding/EncodingJobOptions.cs b/MediaBrowser.Controller/MediaEncoding/EncodingJobOptions.cs index 844fafcde..d5fe790b9 100644 --- a/MediaBrowser.Controller/MediaEncoding/EncodingJobOptions.cs +++ b/MediaBrowser.Controller/MediaEncoding/EncodingJobOptions.cs @@ -35,6 +35,7 @@ namespace MediaBrowser.Controller.MediaEncoding public string VideoCodec { get; set; } + public int? TranscodingMaxAudioChannels { get; set; } public int? VideoBitRate { get; set; } public int? AudioStreamIndex { get; set; } public int? VideoStreamIndex { get; set; } @@ -86,6 +87,7 @@ namespace MediaBrowser.Controller.MediaEncoding MaxVideoBitDepth = info.MaxVideoBitDepth; SubtitleMethod = info.SubtitleDeliveryMethod; Context = info.Context; + TranscodingMaxAudioChannels = info.TranscodingMaxAudioChannels; if (info.SubtitleDeliveryMethod != SubtitleDeliveryMethod.External) { diff --git a/MediaBrowser.MediaEncoding/Encoder/BaseEncoder.cs b/MediaBrowser.MediaEncoding/Encoder/BaseEncoder.cs index d7789a5fd..80bbc87e3 100644 --- a/MediaBrowser.MediaEncoding/Encoder/BaseEncoder.cs +++ b/MediaBrowser.MediaEncoding/Encoder/BaseEncoder.cs @@ -474,7 +474,19 @@ namespace MediaBrowser.MediaEncoding.Encoder arg += string.Format(" -canvas_size {0}:{1}", state.VideoStream.Width.Value.ToString(CultureInfo.InvariantCulture), Convert.ToInt32(height).ToString(CultureInfo.InvariantCulture)); } - arg += " -i \"" + state.SubtitleStream.Path + "\""; + + var subtitlePath = state.SubtitleStream.Path; + + if (string.Equals(Path.GetExtension(subtitlePath), ".sub", StringComparison.OrdinalIgnoreCase)) + { + var idxFile = Path.ChangeExtension(subtitlePath, ".idx"); + if (FileSystem.FileExists(idxFile)) + { + subtitlePath = idxFile; + } + } + + arg += " -i \"" + subtitlePath + "\""; } } diff --git a/MediaBrowser.MediaEncoding/Encoder/EncodingJobFactory.cs b/MediaBrowser.MediaEncoding/Encoder/EncodingJobFactory.cs index e197bdb6f..d6340d4ab 100644 --- a/MediaBrowser.MediaEncoding/Encoder/EncodingJobFactory.cs +++ b/MediaBrowser.MediaEncoding/Encoder/EncodingJobFactory.cs @@ -370,30 +370,50 @@ namespace MediaBrowser.MediaEncoding.Encoder inputChannels = null; } + int? transcoderChannelLimit = null; var codec = outputAudioCodec ?? string.Empty; if (codec.IndexOf("wma", StringComparison.OrdinalIgnoreCase) != -1) { // wmav2 currently only supports two channel output - return Math.Min(2, inputChannels ?? 2); + transcoderChannelLimit = 2; } - if (request.MaxAudioChannels.HasValue) + else if (codec.IndexOf("mp3", StringComparison.OrdinalIgnoreCase) != -1) { - var channelLimit = codec.IndexOf("mp3", StringComparison.OrdinalIgnoreCase) != -1 - ? 2 - : 6; + // libmp3lame currently only supports two channel output + transcoderChannelLimit = 2; + } + else + { + // If we don't have any media info then limit it to 6 to prevent encoding errors due to asking for too many channels + transcoderChannelLimit = 6; + } - if (inputChannels.HasValue) - { - channelLimit = Math.Min(channelLimit, inputChannels.Value); - } + var isTranscodingAudio = !string.Equals(codec, "copy", StringComparison.OrdinalIgnoreCase); - // If we don't have any media info then limit it to 5 to prevent encoding errors due to asking for too many channels - return Math.Min(request.MaxAudioChannels.Value, channelLimit); + int? resultChannels = null; + if (isTranscodingAudio) + { + resultChannels = request.TranscodingMaxAudioChannels; + } + resultChannels = resultChannels ?? request.MaxAudioChannels ?? request.AudioChannels; + + if (inputChannels.HasValue) + { + resultChannels = resultChannels.HasValue + ? Math.Min(resultChannels.Value, inputChannels.Value) + : inputChannels.Value; + } + + if (isTranscodingAudio && transcoderChannelLimit.HasValue) + { + resultChannels = resultChannels.HasValue + ? Math.Min(resultChannels.Value, transcoderChannelLimit.Value) + : transcoderChannelLimit.Value; } - return request.AudioChannels; + return resultChannels ?? request.AudioChannels; } private int? GetVideoBitrateParamValue(EncodingJobOptions request, MediaStream videoStream, string outputVideoCodec) diff --git a/MediaBrowser.Model/Configuration/UserConfiguration.cs b/MediaBrowser.Model/Configuration/UserConfiguration.cs index a4a88f169..efd3d6b67 100644 --- a/MediaBrowser.Model/Configuration/UserConfiguration.cs +++ b/MediaBrowser.Model/Configuration/UserConfiguration.cs @@ -27,7 +27,6 @@ namespace MediaBrowser.Model.Configuration public bool DisplayMissingEpisodes { get; set; } public bool DisplayUnairedEpisodes { get; set; } - public string[] ExcludeFoldersFromGrouping { get; set; } public string[] GroupedFolders { get; set; } public SubtitlePlaybackMode SubtitleMode { get; set; } diff --git a/OpenSubtitlesHandler/Utilities.cs b/OpenSubtitlesHandler/Utilities.cs index 3fe606c78..c012da462 100644 --- a/OpenSubtitlesHandler/Utilities.cs +++ b/OpenSubtitlesHandler/Utilities.cs @@ -37,7 +37,9 @@ namespace OpenSubtitlesHandler public static IHttpClient HttpClient { get; set; } public static ITextEncoding EncodingHelper { get; set; } - private const string XML_RPC_SERVER = "https://api.opensubtitles.org/xml-rpc"; + //private static string XML_RPC_SERVER = "https://api.opensubtitles.org/xml-rpc"; + private static string XML_RPC_SERVER = "https://92.240.234.122/xml-rpc"; + private static string HostHeader = "api.opensubtitles.org:443"; /// <summary> /// Compute movie hash @@ -142,32 +144,6 @@ namespace OpenSubtitlesHandler public static Stream SendRequest(byte[] request, string userAgent) { return SendRequestAsync(request, userAgent, CancellationToken.None).Result; - - //HttpWebRequest req = (HttpWebRequest)WebRequest.Create(XML_RPC_SERVER); - //req.ContentType = "text/xml"; - //req.Host = "api.opensubtitles.org:80"; - //req.Method = "POST"; - //req.UserAgent = "xmlrpc-epi-php/0.2 (PHP)"; - //req.ContentLength = request.Length; - //ServicePointManager.Expect100Continue = false; - //try - //{ - // using (Stream stm = req.GetRequestStream()) - // { - // stm.Write(request, 0, request.Length); - // } - - // WebResponse response = req.GetResponse(); - // return response.GetResponseStream(); - //} - //catch (Exception ex) - //{ - // Stream errorStream = new MemoryStream(); - // byte[] dd = Encoding.ASCII.GetBytes("ERROR: " + ex.Message); - // errorStream.Write(dd, 0, dd.Length); - // errorStream.Position = 0; - // return errorStream; - //} } public static async Task<Stream> SendRequestAsync(byte[] request, string userAgent, CancellationToken cancellationToken) @@ -177,7 +153,7 @@ namespace OpenSubtitlesHandler RequestContentBytes = request, RequestContentType = "text/xml", UserAgent = userAgent, - Host = "api.opensubtitles.org:443", + Host = HostHeader, Url = XML_RPC_SERVER, // Response parsing will fail with this enabled @@ -195,32 +171,6 @@ namespace OpenSubtitlesHandler var result = await HttpClient.Post(options).ConfigureAwait(false); return result.Content; - - //HttpWebRequest req = (HttpWebRequest)WebRequest.Create(XML_RPC_SERVER); - //req.ContentType = "text/xml"; - //req.Host = "api.opensubtitles.org:80"; - //req.Method = "POST"; - //req.UserAgent = "xmlrpc-epi-php/0.2 (PHP)"; - //req.ContentLength = request.Length; - //ServicePointManager.Expect100Continue = false; - //try - //{ - // using (Stream stm = req.GetRequestStream()) - // { - // stm.Write(request, 0, request.Length); - // } - - // WebResponse response = req.GetResponse(); - // return response.GetResponseStream(); - //} - //catch (Exception ex) - //{ - // Stream errorStream = new MemoryStream(); - // byte[] dd = Encoding.ASCII.GetBytes("ERROR: " + ex.Message); - // errorStream.Write(dd, 0, dd.Length); - // errorStream.Position = 0; - // return errorStream; - //} } } |
