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); }
/// <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); }