private async Task RecordFromDirectStreamProvider(IDirectStreamProvider directStreamProvider, string targetFile, TimeSpan duration, Action onStarted, CancellationToken cancellationToken) { Directory.CreateDirectory(Path.GetDirectoryName(targetFile) ?? throw new ArgumentException("Path can't be a root directory.", nameof(targetFile))); await using (var output = new FileStream(targetFile, FileMode.CreateNew, FileAccess.Write, FileShare.Read, IODefaults.FileStreamBufferSize, FileOptions.Asynchronous)) { onStarted(); _logger.LogInformation("Copying recording to file {FilePath}", targetFile); // The media source is infinite so we need to handle stopping ourselves using var durationToken = new CancellationTokenSource(duration); using var cancellationTokenSource = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken, durationToken.Token); var linkedCancellationToken = cancellationTokenSource.Token; var fileStream = new ProgressiveFileStream(directStreamProvider.GetStream()); await using (fileStream.ConfigureAwait(false)) { await _streamHelper.CopyToAsync( fileStream, output, IODefaults.CopyToBufferSize, 1000, linkedCancellationToken).ConfigureAwait(false); } } _logger.LogInformation("Recording completed: {FilePath}", targetFile); }
private async Task CopyFile(string path, bool seekFile, int emptyReadLimit, bool allowAsync, Stream stream, CancellationToken cancellationToken) { using (var inputStream = GetInputStream(path, allowAsync)) { if (seekFile) { TrySeek(inputStream, -20000); } await StreamHelper.CopyToAsync( inputStream, stream, IODefaults.CopyToBufferSize, emptyReadLimit, cancellationToken).ConfigureAwait(false); } }
public async Task WriteToAsync(Stream outputStream, CancellationToken cancellationToken) { if (_directStreamProvider != null) { await _directStreamProvider.CopyToAsync(outputStream, cancellationToken).ConfigureAwait(false); return; } var eofCount = 0; // use non-async filestream along with read due to https://github.com/dotnet/corefx/issues/6039 var allowAsyncFileRead = true; using (var inputStream = GetInputStream(allowAsyncFileRead)) { if (StartPosition > 0) { inputStream.Position = StartPosition; } var emptyReadLimit = AllowEndOfFile ? 20 : 100; while (eofCount < emptyReadLimit) { int bytesRead; bytesRead = await _streamHelper.CopyToAsync(inputStream, outputStream, cancellationToken).ConfigureAwait(false); //var position = fs.Position; //_logger.LogDebug("Streamed {0} bytes to position {1} from file {2}", bytesRead, position, path); if (bytesRead == 0) { eofCount++; await Task.Delay(100, cancellationToken).ConfigureAwait(false); } else { eofCount = 0; } } } }
public async Task WriteToAsync(Stream outputStream, CancellationToken cancellationToken) { if (_directStreamProvider != null) { await _directStreamProvider.CopyToAsync(outputStream, cancellationToken).ConfigureAwait(false); return; } var fileOptions = FileOptions.SequentialScan; // use non-async filestream along with read due to https://github.com/dotnet/corefx/issues/6039 if (Environment.OSVersion.Platform != PlatformID.Win32NT) { fileOptions |= FileOptions.Asynchronous; } using (var inputStream = new FileStream(_path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite, 4096, fileOptions)) { var emptyReadLimit = AllowEndOfFile ? 20 : 100; var eofCount = 0; while (eofCount < emptyReadLimit) { int bytesRead; bytesRead = await _streamHelper.CopyToAsync(inputStream, outputStream, cancellationToken).ConfigureAwait(false); if (bytesRead == 0) { eofCount++; await Task.Delay(100, cancellationToken).ConfigureAwait(false); } else { eofCount = 0; } } } }
private async Task TransmitFileManaged(string path, long offset, long count, FileShareMode fileShareMode, CancellationToken cancellationToken) { var allowAsync = _environment.OperatingSystem != MediaBrowser.Model.System.OperatingSystem.Windows; //if (count <= 0) //{ // allowAsync = true; //} var fileOpenOptions = FileOpenOptions.SequentialScan; if (allowAsync) { fileOpenOptions |= FileOpenOptions.Asynchronous; } // use non-async filestream along with read due to https://github.com/dotnet/corefx/issues/6039 using (var fs = _fileSystem.GetFileStream(path, FileOpenMode.Open, FileAccessMode.Read, fileShareMode, fileOpenOptions)) { if (offset > 0) { fs.Position = offset; } var targetStream = this; if (count > 0) { await _streamHelper.CopyToAsync(fs, targetStream, count, cancellationToken).ConfigureAwait(false); } else { await fs.CopyToAsync(targetStream, StreamCopyToBufferSize, cancellationToken).ConfigureAwait(false); } } }