diff --git a/MediaBrowser.Api/Playback/Hls/BaseHlsService.cs b/MediaBrowser.Api/Playback/Hls/BaseHlsService.cs index 1acc42ea52..3c6d33e7e2 100644 --- a/MediaBrowser.Api/Playback/Hls/BaseHlsService.cs +++ b/MediaBrowser.Api/Playback/Hls/BaseHlsService.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Globalization; using System.IO; using System.Text; using System.Threading; @@ -143,10 +144,10 @@ namespace MediaBrowser.Api.Playback.Hls text = text.Replace("#EXTM3U", "#EXTM3U\n#EXT-X-PLAYLIST-TYPE:EVENT"); - var newDuration = "#EXT-X-TARGETDURATION:" + segmentLength.ToString(UsCulture); + var newDuration = "#EXT-X-TARGETDURATION:" + segmentLength.ToString(CultureInfo.InvariantCulture); - text = text.Replace("#EXT-X-TARGETDURATION:" + (segmentLength - 1).ToString(UsCulture), newDuration, StringComparison.OrdinalIgnoreCase); - //text = text.Replace("#EXT-X-TARGETDURATION:" + (segmentLength + 1).ToString(UsCulture), newDuration, StringComparison.OrdinalIgnoreCase); + text = text.Replace("#EXT-X-TARGETDURATION:" + (segmentLength - 1).ToString(CultureInfo.InvariantCulture), newDuration, StringComparison.OrdinalIgnoreCase); + //text = text.Replace("#EXT-X-TARGETDURATION:" + (segmentLength + 1).ToString(CultureInfo.InvariantCulture), newDuration, StringComparison.OrdinalIgnoreCase); return text; } @@ -163,7 +164,7 @@ namespace MediaBrowser.Api.Playback.Hls var paddedBitrate = Convert.ToInt32(bitrate * 1.15); // Main stream - builder.AppendLine("#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=" + paddedBitrate.ToString(UsCulture)); + builder.AppendLine("#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=" + paddedBitrate.ToString(CultureInfo.InvariantCulture)); var playlistUrl = "hls/" + Path.GetFileName(firstPlaylist).Replace(".m3u8", "/stream.m3u8"); builder.AppendLine(playlistUrl); @@ -231,7 +232,7 @@ namespace MediaBrowser.Api.Playback.Hls { var itsOffsetMs = 0; - var itsOffset = itsOffsetMs == 0 ? string.Empty : string.Format("-itsoffset {0} ", TimeSpan.FromMilliseconds(itsOffsetMs).TotalSeconds.ToString(UsCulture)); + var itsOffset = itsOffsetMs == 0 ? string.Empty : string.Format("-itsoffset {0} ", TimeSpan.FromMilliseconds(itsOffsetMs).TotalSeconds.ToString(CultureInfo.InvariantCulture)); var videoCodec = EncodingHelper.GetVideoEncoder(state, encodingOptions); @@ -240,7 +241,7 @@ namespace MediaBrowser.Api.Playback.Hls var inputModifier = EncodingHelper.GetInputModifier(state, encodingOptions); // If isEncoding is true we're actually starting ffmpeg - var startNumberParam = isEncoding ? GetStartNumber(state).ToString(UsCulture) : "0"; + var startNumberParam = isEncoding ? GetStartNumber(state).ToString(CultureInfo.InvariantCulture) : "0"; var baseUrlParam = string.Empty; @@ -272,7 +273,7 @@ namespace MediaBrowser.Api.Playback.Hls EncodingHelper.GetMapArgs(state), GetVideoArguments(state, encodingOptions), GetAudioArguments(state, encodingOptions), - state.SegmentLength.ToString(UsCulture), + state.SegmentLength.ToString(CultureInfo.InvariantCulture), startNumberParam, outputPath, outputTsArg, @@ -293,9 +294,9 @@ namespace MediaBrowser.Api.Playback.Hls EncodingHelper.GetMapArgs(state), GetVideoArguments(state, encodingOptions), GetAudioArguments(state, encodingOptions), - state.SegmentLength.ToString(UsCulture), + state.SegmentLength.ToString(CultureInfo.InvariantCulture), startNumberParam, - state.HlsListSize.ToString(UsCulture), + state.HlsListSize.ToString(CultureInfo.InvariantCulture), baseUrlParam, outputPath ).Trim(); diff --git a/MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs b/MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs index 45f003cae8..fdae59f569 100644 --- a/MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs +++ b/MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs @@ -177,7 +177,7 @@ namespace MediaBrowser.Api.Playback.Hls var cancellationTokenSource = new CancellationTokenSource(); var cancellationToken = cancellationTokenSource.Token; - var requestedIndex = int.Parse(segmentId, NumberStyles.Integer, UsCulture); + var requestedIndex = int.Parse(segmentId, NumberStyles.Integer, CultureInfo.InvariantCulture); var state = await GetState(request, cancellationToken).ConfigureAwait(false); @@ -364,7 +364,7 @@ namespace MediaBrowser.Api.Playback.Hls var indexString = Path.GetFileNameWithoutExtension(file.Name).Substring(playlistFilename.Length); - return int.Parse(indexString, NumberStyles.Integer, UsCulture); + return int.Parse(indexString, NumberStyles.Integer, CultureInfo.InvariantCulture); } private void DeleteLastFile(string playlistPath, string segmentExtension, int retryCount) @@ -438,7 +438,7 @@ namespace MediaBrowser.Api.Playback.Hls segmentId = segmentRequest.SegmentId; } - return int.Parse(segmentId, NumberStyles.Integer, UsCulture); + return int.Parse(segmentId, NumberStyles.Integer, CultureInfo.InvariantCulture); } private string GetSegmentPath(StreamState state, string playlist, int index) @@ -447,7 +447,7 @@ namespace MediaBrowser.Api.Playback.Hls var filename = Path.GetFileNameWithoutExtension(playlist); - return Path.Combine(folder, filename + index.ToString(UsCulture) + GetSegmentFileExtension(state.Request)); + return Path.Combine(folder, filename + index.ToString(CultureInfo.InvariantCulture) + GetSegmentFileExtension(state.Request)); } private async Task GetSegmentResult(StreamState state, @@ -628,8 +628,8 @@ namespace MediaBrowser.Api.Playback.Hls private string ReplaceBitrate(string url, int oldValue, int newValue) { return url.Replace( - "videobitrate=" + oldValue.ToString(UsCulture), - "videobitrate=" + newValue.ToString(UsCulture), + "videobitrate=" + oldValue.ToString(CultureInfo.InvariantCulture), + "videobitrate=" + newValue.ToString(CultureInfo.InvariantCulture), StringComparison.OrdinalIgnoreCase); } @@ -648,8 +648,8 @@ namespace MediaBrowser.Api.Playback.Hls var url = string.Format("{0}/Subtitles/{1}/subtitles.m3u8?SegmentLength={2}&api_key={3}", state.Request.MediaSourceId, - stream.Index.ToString(UsCulture), - 30.ToString(UsCulture), + stream.Index.ToString(CultureInfo.InvariantCulture), + 30.ToString(CultureInfo.InvariantCulture), AuthorizationContext.GetAuthorizationInfo(Request).Token); var line = string.Format(format, @@ -705,7 +705,7 @@ namespace MediaBrowser.Api.Playback.Hls private void AppendPlaylist(StringBuilder builder, StreamState state, string url, int bitrate, string subtitleGroup) { - var header = "#EXT-X-STREAM-INF:BANDWIDTH=" + bitrate.ToString(UsCulture) + ",AVERAGE-BANDWIDTH=" + bitrate.ToString(UsCulture); + var header = "#EXT-X-STREAM-INF:BANDWIDTH=" + bitrate.ToString(CultureInfo.InvariantCulture) + ",AVERAGE-BANDWIDTH=" + bitrate.ToString(CultureInfo.InvariantCulture); // tvos wants resolution, codecs, framerate //if (state.TargetFramerate.HasValue) @@ -770,7 +770,7 @@ namespace MediaBrowser.Api.Playback.Hls builder.AppendLine("#EXTM3U"); builder.AppendLine("#EXT-X-PLAYLIST-TYPE:VOD"); builder.AppendLine("#EXT-X-VERSION:3"); - builder.AppendLine("#EXT-X-TARGETDURATION:" + Math.Ceiling(segmentLengths.Length > 0 ? segmentLengths.Max() : state.SegmentLength).ToString(UsCulture)); + builder.AppendLine("#EXT-X-TARGETDURATION:" + Math.Ceiling(segmentLengths.Length > 0 ? segmentLengths.Max() : state.SegmentLength).ToString(CultureInfo.InvariantCulture)); builder.AppendLine("#EXT-X-MEDIA-SEQUENCE:0"); var queryStringIndex = Request.RawUrl.IndexOf('?'); @@ -785,12 +785,12 @@ namespace MediaBrowser.Api.Playback.Hls foreach (var length in segmentLengths) { - builder.AppendLine("#EXTINF:" + length.ToString("0.0000", UsCulture) + ", nodesc"); + builder.AppendLine("#EXTINF:" + length.ToString("0.0000", CultureInfo.InvariantCulture) + ", nodesc"); builder.AppendLine(string.Format("hls1/{0}/{1}{2}{3}", name, - index.ToString(UsCulture), + index.ToString(CultureInfo.InvariantCulture), GetSegmentFileExtension(request), queryString)); @@ -821,17 +821,17 @@ namespace MediaBrowser.Api.Playback.Hls if (state.OutputAudioBitrate.HasValue) { - audioTranscodeParams.Add("-ab " + state.OutputAudioBitrate.Value.ToString(UsCulture)); + audioTranscodeParams.Add("-ab " + state.OutputAudioBitrate.Value.ToString(CultureInfo.InvariantCulture)); } if (state.OutputAudioChannels.HasValue) { - audioTranscodeParams.Add("-ac " + state.OutputAudioChannels.Value.ToString(UsCulture)); + audioTranscodeParams.Add("-ac " + state.OutputAudioChannels.Value.ToString(CultureInfo.InvariantCulture)); } if (state.OutputAudioSampleRate.HasValue) { - audioTranscodeParams.Add("-ar " + state.OutputAudioSampleRate.Value.ToString(UsCulture)); + audioTranscodeParams.Add("-ar " + state.OutputAudioSampleRate.Value.ToString(CultureInfo.InvariantCulture)); } audioTranscodeParams.Add("-vn"); @@ -863,12 +863,12 @@ namespace MediaBrowser.Api.Playback.Hls if (bitrate.HasValue) { - args += " -ab " + bitrate.Value.ToString(UsCulture); + args += " -ab " + bitrate.Value.ToString(CultureInfo.InvariantCulture); } if (state.OutputAudioSampleRate.HasValue) { - args += " -ar " + state.OutputAudioSampleRate.Value.ToString(UsCulture); + args += " -ar " + state.OutputAudioSampleRate.Value.ToString(CultureInfo.InvariantCulture); } args += " " + EncodingHelper.GetAudioFilterParam(state, encodingOptions, true); @@ -905,7 +905,7 @@ namespace MediaBrowser.Api.Playback.Hls else { var keyFrameArg = string.Format(" -force_key_frames \"expr:gte(t,n_forced*{0})\"", - state.SegmentLength.ToString(UsCulture)); + state.SegmentLength.ToString(CultureInfo.InvariantCulture)); var hasGraphicalSubs = state.SubtitleStream != null && !state.SubtitleStream.IsTextSubtitleStream && state.SubtitleDeliveryMethod == SubtitleDeliveryMethod.Encode; @@ -953,7 +953,7 @@ namespace MediaBrowser.Api.Playback.Hls // If isEncoding is true we're actually starting ffmpeg var startNumber = GetStartNumber(state); - var startNumberParam = isEncoding ? startNumber.ToString(UsCulture) : "0"; + var startNumberParam = isEncoding ? startNumber.ToString(CultureInfo.InvariantCulture) : "0"; var mapArgs = state.IsOutputVideo ? EncodingHelper.GetMapArgs(state) : string.Empty; @@ -984,7 +984,7 @@ namespace MediaBrowser.Api.Playback.Hls mapArgs, GetVideoArguments(state, encodingOptions), GetAudioArguments(state, encodingOptions), - state.SegmentLength.ToString(UsCulture), + state.SegmentLength.ToString(CultureInfo.InvariantCulture), startNumberParam, outputPath, outputTsArg, diff --git a/MediaBrowser.Api/Playback/Hls/VideoHlsService.cs b/MediaBrowser.Api/Playback/Hls/VideoHlsService.cs index eb1bbfb74b..3c715c5add 100644 --- a/MediaBrowser.Api/Playback/Hls/VideoHlsService.cs +++ b/MediaBrowser.Api/Playback/Hls/VideoHlsService.cs @@ -1,4 +1,5 @@ using System; +using System.Globalization; using System.Threading.Tasks; using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Devices; @@ -55,12 +56,12 @@ namespace MediaBrowser.Api.Playback.Hls if (bitrate.HasValue) { - args += " -ab " + bitrate.Value.ToString(UsCulture); + args += " -ab " + bitrate.Value.ToString(CultureInfo.InvariantCulture); } if (state.OutputAudioSampleRate.HasValue) { - args += " -ar " + state.OutputAudioSampleRate.Value.ToString(UsCulture); + args += " -ar " + state.OutputAudioSampleRate.Value.ToString(CultureInfo.InvariantCulture); } args += " " + EncodingHelper.GetAudioFilterParam(state, encodingOptions, true); @@ -100,7 +101,7 @@ namespace MediaBrowser.Api.Playback.Hls else { var keyFrameArg = string.Format(" -force_key_frames \"expr:gte(t,n_forced*{0})\"", - state.SegmentLength.ToString(UsCulture)); + state.SegmentLength.ToString(CultureInfo.InvariantCulture)); var hasGraphicalSubs = state.SubtitleStream != null && !state.SubtitleStream.IsTextSubtitleStream && state.SubtitleDeliveryMethod == SubtitleDeliveryMethod.Encode;