private async Task StartStreaming(string url, TaskCompletionSource <bool> openTaskCompletionSource, CancellationToken cancellationToken) { await Task.Run(async() => { var isFirstAttempt = true; while (!cancellationToken.IsCancellationRequested) { try { using (var response = await _httpClient.SendAsync(new HttpRequestOptions { Url = url, CancellationToken = cancellationToken, BufferContent = false, // Increase a little bit TimeoutMs = 30000 }, "GET").ConfigureAwait(false)) { _logger.Info("Opened HDHR stream from {0}", url); if (!cancellationToken.IsCancellationRequested) { _logger.Info("Beginning multicastStream.CopyUntilCancelled"); Action onStarted = null; if (isFirstAttempt) { onStarted = () => openTaskCompletionSource.TrySetResult(true); } await _multicastStream.CopyUntilCancelled(response.Content, onStarted, cancellationToken).ConfigureAwait(false); } } } catch (OperationCanceledException) { break; } catch (Exception ex) { if (isFirstAttempt) { _logger.ErrorException("Error opening live stream:", ex); openTaskCompletionSource.TrySetException(ex); break; } _logger.ErrorException("Error copying live stream, will reopen", ex); } isFirstAttempt = false; } _liveStreamTaskCompletionSource.TrySetResult(true); }).ConfigureAwait(false); }
private Task StartStreaming(string url, TaskCompletionSource <bool> openTaskCompletionSource, CancellationToken cancellationToken) { return(Task.Run(async() => { var isFirstAttempt = true; while (!cancellationToken.IsCancellationRequested) { try { using (var response = await _httpClient.SendAsync(new HttpRequestOptions { Url = url, CancellationToken = cancellationToken, BufferContent = false, // Increase a little bit TimeoutMs = 30000 }, "GET").ConfigureAwait(false)) { _logger.Info("Opened HDHR stream from {0}", url); if (!cancellationToken.IsCancellationRequested) { _logger.Info("Beginning multicastStream.CopyUntilCancelled"); if (_enableFileBuffer) { FileSystem.CreateDirectory(FileSystem.GetDirectoryName(_tempFilePath)); using (var fileStream = FileSystem.GetFileStream(_tempFilePath, FileOpenMode.Create, FileAccessMode.Write, FileShareMode.Read, FileOpenOptions.None)) { StreamHelper.CopyTo(response.Content, fileStream, 81920, () => Resolve(openTaskCompletionSource), cancellationToken); } } else { await _multicastStream.CopyUntilCancelled(response.Content, () => Resolve(openTaskCompletionSource), cancellationToken).ConfigureAwait(false); } } } } catch (OperationCanceledException) { break; } catch (Exception ex) { if (isFirstAttempt) { _logger.ErrorException("Error opening live stream:", ex); openTaskCompletionSource.TrySetException(ex); break; } _logger.ErrorException("Error copying live stream, will reopen", ex); } isFirstAttempt = false; } _liveStreamTaskCompletionSource.TrySetResult(true); //await DeleteTempFile(_tempFilePath).ConfigureAwait(false); })); }
private async Task StartStreaming(string remoteIp, int localPort, TaskCompletionSource <bool> openTaskCompletionSource, CancellationToken cancellationToken) { await Task.Run(async() => { var isFirstAttempt = true; using (var udpClient = _socketFactory.CreateUdpSocket(localPort)) { using (var hdHomerunManager = new HdHomerunManager(_socketFactory)) { var remoteAddress = _networkManager.ParseIpAddress(remoteIp); IpAddressInfo localAddress = null; using (var tcpSocket = _socketFactory.CreateSocket(remoteAddress.AddressFamily, SocketType.Stream, ProtocolType.Tcp, false)) { try { tcpSocket.Connect(new IpEndPointInfo(remoteAddress, HdHomerunManager.HdHomeRunPort)); localAddress = tcpSocket.LocalEndPoint.IpAddress; tcpSocket.Close(); } catch (Exception) { _logger.Error("Unable to determine local ip address for Legacy HDHomerun stream."); return; } } while (!cancellationToken.IsCancellationRequested) { try { // send url to start streaming await hdHomerunManager.StartStreaming(remoteAddress, localAddress, localPort, _channelCommands, _numTuners, cancellationToken).ConfigureAwait(false); var response = await udpClient.ReceiveAsync(cancellationToken).ConfigureAwait(false); _logger.Info("Opened HDHR UDP stream from {0}", remoteAddress); if (!cancellationToken.IsCancellationRequested) { Action onStarted = null; if (isFirstAttempt) { onStarted = () => openTaskCompletionSource.TrySetResult(true); } var stream = new UdpClientStream(udpClient); await _multicastStream.CopyUntilCancelled(stream, onStarted, cancellationToken).ConfigureAwait(false); } } catch (OperationCanceledException) { break; } catch (Exception ex) { if (isFirstAttempt) { _logger.ErrorException("Error opening live stream:", ex); openTaskCompletionSource.TrySetException(ex); break; } _logger.ErrorException("Error copying live stream, will reopen", ex); } isFirstAttempt = false; } await hdHomerunManager.StopStreaming().ConfigureAwait(false); udpClient.Dispose(); _liveStreamTaskCompletionSource.TrySetResult(true); } } }).ConfigureAwait(false); }