public async Task <LiveStreamResponse> OpenLiveStream(LiveStreamRequest request, bool enableAutoClose, CancellationToken cancellationToken) { enableAutoClose = false; await _liveStreamSemaphore.WaitAsync(cancellationToken).ConfigureAwait(false); try { var tuple = GetProvider(request.OpenToken); var provider = tuple.Item1; var mediaSourceTuple = await provider.OpenMediaSource(tuple.Item2, cancellationToken).ConfigureAwait(false); var mediaSource = mediaSourceTuple.Item1; if (string.IsNullOrWhiteSpace(mediaSource.LiveStreamId)) { throw new InvalidOperationException(string.Format("{0} returned null LiveStreamId", provider.GetType().Name)); } SetKeyProperties(provider, mediaSource); var info = new LiveStreamInfo { Date = DateTime.UtcNow, EnableCloseTimer = enableAutoClose, Id = mediaSource.LiveStreamId, MediaSource = mediaSource, DirectStreamProvider = mediaSourceTuple.Item2 }; _openStreams[mediaSource.LiveStreamId] = info; if (enableAutoClose) { StartCloseTimer(); } var json = _jsonSerializer.SerializeToString(mediaSource); _logger.Debug("Live stream opened: " + json); var clone = _jsonSerializer.DeserializeFromString <MediaSourceInfo>(json); if (!string.IsNullOrWhiteSpace(request.UserId)) { var user = _userManager.GetUserById(request.UserId); var item = string.IsNullOrWhiteSpace(request.ItemId) ? null : _libraryManager.GetItemById(request.ItemId); SetUserProperties(item, clone, user); } return(new LiveStreamResponse { MediaSource = clone }); } finally { _liveStreamSemaphore.Release(); } }
public async Task <LiveStreamResponse> OpenLiveStream(LiveStreamRequest request, CancellationToken cancellationToken) { await _liveStreamSemaphore.WaitAsync(cancellationToken).ConfigureAwait(false); try { var tuple = GetProvider(request.OpenToken); var provider = tuple.Item1; var mediaSourceTuple = await provider.OpenMediaSource(tuple.Item2, cancellationToken).ConfigureAwait(false); var mediaSource = mediaSourceTuple.Item1; // Validate that this is actually possible if (mediaSource.SupportsDirectStream) { mediaSource.SupportsDirectStream = SupportsDirectStream(mediaSource.Path, mediaSource.Protocol); } if (string.IsNullOrEmpty(mediaSource.LiveStreamId)) { throw new InvalidOperationException(string.Format("{0} returned null LiveStreamId", provider.GetType().Name)); } SetKeyProperties(provider, mediaSource); var info = new LiveStreamInfo { Id = mediaSource.LiveStreamId, MediaSource = mediaSource, DirectStreamProvider = mediaSourceTuple.Item2, AllowLiveMediaInfoProbe = mediaSourceTuple.Item3 }; _openStreams[mediaSource.LiveStreamId] = info; var json = _jsonSerializer.SerializeToString(mediaSource); _logger.Info("Live stream opened: " + json); var clone = _jsonSerializer.DeserializeFromString <MediaSourceInfo>(json); if (!string.IsNullOrEmpty(request.UserId)) { var user = _userManager.GetUserById(request.UserId); var item = string.IsNullOrEmpty(request.ItemId) ? null : _libraryManager.GetItemById(request.ItemId); SetDefaultAudioAndSubtitleStreamIndexes(item, clone, user); } return(new LiveStreamResponse { MediaSource = clone }); } finally { _liveStreamSemaphore.Release(); } }
public async Task<LiveStreamResponse> OpenLiveStream(LiveStreamRequest request, bool enableAutoClose, CancellationToken cancellationToken) { await _liveStreamSemaphore.WaitAsync(cancellationToken).ConfigureAwait(false); try { var tuple = GetProvider(request.OpenToken); var provider = tuple.Item1; var mediaSourceTuple = await provider.OpenMediaSource(tuple.Item2, cancellationToken).ConfigureAwait(false); var mediaSource = mediaSourceTuple.Item1; if (string.IsNullOrWhiteSpace(mediaSource.LiveStreamId)) { throw new InvalidOperationException(string.Format("{0} returned null LiveStreamId", provider.GetType().Name)); } SetKeyProperties(provider, mediaSource); var info = new LiveStreamInfo { Date = DateTime.UtcNow, EnableCloseTimer = enableAutoClose, Id = mediaSource.LiveStreamId, MediaSource = mediaSource, DirectStreamProvider = mediaSourceTuple.Item2 }; _openStreams[mediaSource.LiveStreamId] = info; if (enableAutoClose) { StartCloseTimer(); } var json = _jsonSerializer.SerializeToString(mediaSource); _logger.Debug("Live stream opened: " + json); var clone = _jsonSerializer.DeserializeFromString<MediaSourceInfo>(json); if (!string.IsNullOrWhiteSpace(request.UserId)) { var user = _userManager.GetUserById(request.UserId); var item = string.IsNullOrWhiteSpace(request.ItemId) ? null : _libraryManager.GetItemById(request.ItemId); SetUserProperties(item, clone, user); } return new LiveStreamResponse { MediaSource = clone }; } finally { _liveStreamSemaphore.Release(); } }