private StreamingDetails GetStream(CancellationToken cancellationToken, string itemId, TimeSpan startPosition)
        {
            var identifier = HttpUtility.UrlEncode(String.Format("{0}-{1:yyyyMMddHHmmss}", itemId, DateTime.UtcNow));
            var url        = "";

            if (itemId.StartsWith("Recording"))
            {
                url = GetRecStreamingURL(cancellationToken, itemId);
            }
            else
            {
                url = GetTVStreamingURL(cancellationToken, itemId);
            }

            var streamingDetails = new StreamingDetails()
            {
                StreamIdentifier = identifier,
                SourceInfo       = new MediaSourceInfo()
                {
                    Path     = url,
                    Protocol = MediaProtocol.Http,
                    Id       = identifier, //itemId,
                }
            };

            return(streamingDetails);
        }
Exemple #2
0
        /// <summary>
        /// Gets a live tv stream.
        /// </summary>
        /// <param name="cancellationToken">The cancellation token.</param>
        /// <param name="channelId">The channel to stream.</param>
        /// <returns></returns>
        public StreamingDetails GetLiveTvStream(CancellationToken cancellationToken, String channelId)
        {
            Plugin.Logger.Info("Streaming setting RequiresAuthentication: {0}", Configuration.RequiresAuthentication);
            Plugin.Logger.Info("Streaming setting StreamingProfileName: {0}", Configuration.StreamingProfileName);
            Plugin.Logger.Info("Streaming setting StreamDelay: {0}", Configuration.StreamDelay);
            Plugin.Logger.Info("Streaming Media Type: {0}; Streaming item ID: {1}", WebMediaType.TV, channelId);

            var identifier = WebUtility.UrlEncode(String.Format("{0}-{1}-{2:yyyyMMddHHmmss}", WebMediaType.TV, channelId, DateTime.UtcNow));
            var profile    = WebUtility.UrlEncode(GetTranscoderProfile(cancellationToken, Configuration.StreamingProfileName).Name);

            var streamingDetails = new StreamingDetails()
            {
                SourceInfo = new MediaSourceInfo()
            };

            streamingDetails.StreamIdentifier = identifier;
            streamingDetails.SourceInfo.Id    = identifier;

            if (Configuration.RtspStreaming)
            {
                streamingDetails.SourceInfo.Protocol = MediaProtocol.Rtsp;
                streamingDetails.SourceInfo.ReadAtNativeFramerate = false;
                streamingDetails.SourceInfo.IsInfiniteStream      = true;
                streamingDetails.SourceInfo.SupportsProbing       = (Configuration.EnableProbing) ? true : false;
                streamingDetails.SourceInfo.Path = Plugin.TvProxy.GetLiveTvRtspUrl(cancellationToken, identifier, channelId);
            }
            else
            {
                var authorized = GetFromService <WebBoolResult>(cancellationToken, "AuthorizeStreaming");

                streamingDetails.SourceInfo.Protocol = MediaProtocol.Http;
                streamingDetails.SourceInfo.ReadAtNativeFramerate = true;
                streamingDetails.SourceInfo.IsInfiniteStream      = true;
                streamingDetails.SourceInfo.SupportsProbing       = (Configuration.EnableProbing) ? true : false;
                streamingDetails.SourceInfo.Path = GetUrl(_streamingEndpoint, "DoStream?type={0}&provider={1}&itemId={2}&clientDescription={3}&profileName={4}&startPosition=0&idleTimeout={5}&identifier={6}",
                                                          WebMediaType.TV,
                                                          STREAM_TV_RECORDING_PROVIDER,
                                                          channelId,
                                                          identifier,
                                                          profile,
                                                          STREAM_TIMEOUT_DIRECT,
                                                          identifier);

                if (Configuration.RequiresAuthentication)
                {
                    string authInfo = String.Format("{0}:{1}", Configuration.UserName, Configuration.Password);
                    authInfo = Convert.ToBase64String(Encoding.Default.GetBytes(authInfo));

                    streamingDetails.SourceInfo.SupportsDirectPlay  = false;
                    streamingDetails.SourceInfo.RequiredHttpHeaders = new Dictionary <string, string> {
                        { "Authentication", "Basic " + authInfo }
                    };
                }
            }

            Thread.Sleep(Plugin.Instance.Configuration.StreamDelay.Value);

            Plugin.Logger.Info("Returning StreamingDetails for: {0}", streamingDetails.SourceInfo.Path);
            return(streamingDetails);
        }
        public Task <MediaSourceInfo> GetRecordingStream(string recordingId, string streamId, CancellationToken cancellationToken)
        {
            // Cancel the existing stream if present
            if (_currentStreamDetails != null)
            {
                Plugin.StreamingProxy.CancelStream(cancellationToken, _currentStreamDetails.StreamIdentifier);
            }

            // Start a new one and store it away
            _currentStreamDetails = Plugin.StreamingProxy.GetRecordingStream(cancellationToken, recordingId, TimeSpan.Zero);
            return(Task.FromResult(_currentStreamDetails.SourceInfo));
        }
        public Task <MediaSourceInfo> GetChannelStream(string channelId, string streamId, CancellationToken cancellationToken)
        {
            // Cancel the existing stream if present
            if (_currentStreamDetails != null)
            {
                Plugin.StreamingProxy.CancelStream(cancellationToken, _currentStreamDetails.StreamIdentifier);
            }

            // Start a new one and store it away
            _currentStreamDetails = Plugin.StreamingProxy.GetLiveTvStream(cancellationToken, channelId);
            return(Task.FromResult(_currentStreamDetails.SourceInfo));
        }
        private StreamingDetails GetStream(CancellationToken cancellationToken, WebMediaType webMediaType, string itemId, TimeSpan startPosition)
        {
            Plugin.Logger.Info("Streaming setting RequiresAuthentication: {0}", Configuration.RequiresAuthentication);
            Plugin.Logger.Info("Streaming setting StreamingProfileName: {0}", Configuration.StreamingProfileName);
            Plugin.Logger.Info("Streaming setting StreamDelay: {0}", Configuration.StreamDelay);
            Plugin.Logger.Info("Streaming Media Type: {0}; Streaming item ID: {1}", webMediaType, itemId);

            var identifier = HttpUtility.UrlEncode(String.Format("{0}-{1}-{2:yyyyMMddHHmmss}", webMediaType, itemId, DateTime.UtcNow));
            var profile    = HttpUtility.UrlEncode(GetTranscoderProfile(cancellationToken, Configuration.StreamingProfileName).Name);

            var streamingDetails = new StreamingDetails()
            {
                SourceInfo = new MediaSourceInfo()
            };

            streamingDetails.StreamIdentifier    = identifier;
            streamingDetails.SourceInfo.Id       = identifier;
            streamingDetails.SourceInfo.Protocol = MediaProtocol.Http;
            streamingDetails.SourceInfo.ReadAtNativeFramerate = true;
            streamingDetails.SourceInfo.IsInfiniteStream      = true;
            streamingDetails.SourceInfo.IgnoreIndex           = true;
            streamingDetails.SourceInfo.Path = GetUrl(_streamingEndpoint, "DoStream?type={0}&provider={1}&itemId={2}&clientDescription={3}&profileName={4}&startPosition={5}&idleTimeout={6}&identifier={7}",
                                                      webMediaType,
                                                      STREAM_TV_RECORDING_PROVIDER,
                                                      itemId,
                                                      identifier,
                                                      profile,
                                                      (Int32)startPosition.TotalSeconds,
                                                      STREAM_TIMEOUT_DIRECT,
                                                      identifier);

            if (Configuration.RequiresAuthentication)
            {
                string authInfo = String.Format("{0}:{1}", Configuration.UserName, Configuration.Password);
                authInfo = Convert.ToBase64String(Encoding.Default.GetBytes(authInfo));

                streamingDetails.SourceInfo.SupportsDirectPlay  = false;
                streamingDetails.SourceInfo.RequiredHttpHeaders = new Dictionary <string, string> {
                    { "Authentication", "Basic " + authInfo }
                };
            }

            Thread.Sleep(Plugin.Instance.Configuration.StreamDelay.Value);

            Plugin.Logger.Info("Returning StreamingDetails for: {0}", streamingDetails.SourceInfo.Path);
            return(streamingDetails);
        }
        /// <summary>
        /// Gets a live tv stream.
        /// </summary>
        /// <param name="cancellationToken">The cancellation token.</param>
        /// <param name="channelId">The channel to stream.</param>
        /// <returns></returns>
        public StreamingDetails GetLiveTvStream(CancellationToken cancellationToken, String channelId)
        {
            var identifier = WebUtility.UrlEncode(String.Format("{0}-{1:yyyyMMddHHmmss}", channelId, DateTimeOffset.UtcNow));

            var streamingDetails = new StreamingDetails()
            {
                SourceInfo = new MediaSourceInfo()
            };

            streamingDetails.StreamIdentifier            = identifier;
            streamingDetails.SourceInfo.Id               = identifier;
            streamingDetails.SourceInfo.Protocol         = MediaProtocol.Http;
            streamingDetails.SourceInfo.IsInfiniteStream = true;
            streamingDetails.SourceInfo.Path             = String.Format("http://{0}:{1}/upnp/channelstream/{2}.ts", Configuration.ApiHostName, Configuration.StreamPortNumber, channelId);

            return(streamingDetails);
        }
 public Task <MediaSourceInfo> GetRecordingStream(string recordingId, string streamId, CancellationToken cancellationToken)
 {
     _currentStreamDetails = Plugin.StreamingProxy.GetRecordingStream(cancellationToken, recordingId, TimeSpan.Zero);
     return(Task.FromResult(_currentStreamDetails.SourceInfo));
 }
 public Task <MediaSourceInfo> GetChannelStream(string channelId, string streamId, CancellationToken cancellationToken)
 {
     _currentStreamDetails = Plugin.StreamingProxy.GetLiveTvStream(cancellationToken, channelId);
     return(Task.FromResult(_currentStreamDetails.SourceInfo));
 }
        private StreamingDetails GetStream(CancellationToken cancellationToken, WebMediaType webMediaType, string itemId, TimeSpan startPosition)
        {
            var profile     = GetTranscoderProfile(cancellationToken, Configuration.StreamingProfileName);
            var profilename = String.Format("{0}", Configuration.StreamingProfileName);

            //var mediatype = String.Format("{0}", webMediaType);
            //if (mediatype == "Recording")
            //{
            //    profilename = "Android VLC direct";
            //}

            var identifier          = HttpUtility.UrlEncode(String.Format("{0}-{1}-{2:yyyyMMddHHmmss}", webMediaType, itemId, DateTime.UtcNow));
            var isStreamInitialised = GetFromService <WebBoolResult>(cancellationToken,
                                                                     "InitStream?type={0}&provider={1}&itemId={2}&identifier={3}&idleTimeout={4}&clientDescription={5}",
                                                                     webMediaType,
                                                                     STREAM_TV_RECORDING_PROVIDER, // Provider - use 0 for recordings and tv
                                                                     itemId,                       // itemId
                                                                     identifier,                   // identifier
                                                                     STREAM_TIMEOUT_DIRECT,
                                                                     identifier).Result;           //Idletimoue

            if (!isStreamInitialised)
            {
                throw new Exception(String.Format("Could not initialise the stream. Identifier={0}", identifier));
            }

            // Returns the url for streaming
            var url = GetFromService <WebStringResult>(cancellationToken, "StartStream?identifier={0}&profileName={1}&startPosition={2}",
                                                       identifier,
                                                       profilename, // Provider
                                                       (Int32)startPosition.TotalSeconds).Result;

            var isAuthorised = true;

            foreach (var ipAddress in _networkManager.GetLocalIpAddresses())
            {
                isAuthorised = isAuthorised && GetFromService <WebBoolResult>(
                    cancellationToken, "AuthorizeRemoteHostForStreaming?host={0}", ipAddress).Result;
            }

            if (!isAuthorised)
            {
                throw new Exception(String.Format("Could not authorise the stream. Identifier={0}", identifier));
            }

            var streamingDetails = new StreamingDetails()
            {
                StreamIdentifier = identifier,
                SourceInfo       = new MediaSourceInfo()
                {
                    Path     = url,
                    Protocol = MediaProtocol.Http,
                    Id       = itemId,
                    ReadAtNativeFramerate = true,
                }
            };

            var mediaInfoId = webMediaType == WebMediaType.Recording ? itemId : identifier;
            var mediaInfo   = GetMediaInfoFromStream(cancellationToken, webMediaType, mediaInfoId);

            if (mediaInfo != null)
            {
                streamingDetails.SourceInfo.Container    = mediaInfo.Container;
                streamingDetails.SourceInfo.RunTimeTicks = TimeSpan.FromMilliseconds(mediaInfo.Duration).Ticks;

                //streamingDetails.SourceInfo.AudioChannels = mediaInfo.AudioStreams.Count;
                //var defaultAudioStream = mediaInfo.AudioStreams.FirstOrDefault();
                //if (defaultAudioStream != null)
                //{
                //    streamingDetails.SourceInfo.AudioCodec = defaultAudioStream.Codec;
                //}

                //var defaultVideoStream = mediaInfo.VideoStreams.FirstOrDefault();
                //if (defaultVideoStream != null)
                //{
                //    streamingDetails.SourceInfo.VideoCodec = defaultVideoStream.Codec;
                //    streamingDetails.SourceInfo.Height = defaultVideoStream.Height;
                //    streamingDetails.SourceInfo.Width = defaultVideoStream.Width;
                //}
            }
            return(streamingDetails);
        }