Esempio n. 1
0
        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();
            }
        }
Esempio n. 2
0
        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();
            }
        }
Esempio n. 3
0
        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();
            }
        }