// it is not thread safe ... public void AddHandler(IMediaHandler handler) { string mediaType = handler.GetMediaType(); if (m_Handlers.ContainsKey(mediaType)) { m_Handlers.Remove(mediaType); } m_Handlers.Add(mediaType, handler); }
public Task Play(string fileName, int position = 0, PlaybackSettings settings = null) { TaskCompletionSource <bool> tcs = new TaskCompletionSource <bool>(); Task.Factory.StartNew(() => { if (!File.Exists(fileName)) { tcs.TrySetException(new FileNotFoundException(fileName)); tcs.TrySetResult(false); return; } OnStateChanged(StateType.Initializing); try { Start(); if (_mediaHandler != null) { _mediaHandler.Stop(); _mediaHandler = null; } //TODO : implement Http Live streaming _mediaHandler = new DefaultMediaHandler(_serverAddress, _serverPort, fileName); _mediaHandler.Initialize(); _mediaHandler.Start(); StringBuilder sb = new StringBuilder(); sb.AppendFormat("Content-Location:{0}", _mediaHandler.GetContentLocation()) .AppendLine() .AppendFormat("Start-Position:{0}", position) .AppendLine() .AppendLine(); HttpResponse response = SendRequest("POST", "/play", sb.ToString()); if (response.StatusCode == (int)HttpStatusCode.OK) { tcs.TrySetResult(true); } else { tcs.TrySetException(new HttpException(response.StatusCode, response.StatusDescription)); tcs.TrySetResult(false); } tcs.TrySetResult(true); } catch (Exception e) { tcs.TrySetException(e); tcs.TrySetResult(false); } }); return(tcs.Task); }
// and this is not thread safe, too ... // but "A Dictionary can support multiple readers concurrently, as long as the collection is not modified." public IMediaHandler GetHandler(string mediaType) { IMediaHandler result = null; if (m_Handlers.TryGetValue(mediaType, out result)) { return(result); } else { return(null); } }
/// <summary> /// Saves an uploaded file to disk. /// </summary> private async Task <string> SaveUploadAsync(IFormFile file, string key, IMediaHandler handler) { var ext = Path.GetExtension(file.FileName); var fileName = key + ext; var filePath = Path.Combine(_env.WebRootPath, "media", fileName); using (var localStream = new FileStream(filePath, FileMode.CreateNew)) using (var sourceStream = file.OpenReadStream()) await sourceStream.CopyToAsync(localStream); using (var frame = handler.ExtractThumbnail(filePath, file.ContentType)) MediaHandlerHelper.CreateThumbnails(filePath, frame); return($"~/media/{fileName}"); }
protected virtual void ProcessInputData(object obj) { HttpListenerContext ctx = obj as HttpListenerContext; if (ctx == null) { return; } IMediaHandler handler = null; List <MediaChannel> channels = new List <MediaChannel>(); var urlSegments = ctx.Request.Url.Segments; string channelNames = ""; if (urlSegments.Length > 1) { channelNames = urlSegments[1].Replace("/", ""); } if (channelNames.Length > 0) { var names = channelNames.Split(','); foreach (var channelName in names) { var channel = GetChannel(channelName.Trim()); if (channel != null && channel.IsWorking() == false) { channel.Start(); } if (channel != null) { channels.Add(channel); } } } if (channels.Count > 0) { string typeinfo = ""; if (urlSegments.Length > 2) { typeinfo = urlSegments[2].Replace("/", ""); } if (typeinfo.Length > 0) { handler = m_ResourceManager.GetHandler(typeinfo); } } if (channels.Count > 0 && handler != null) { string mediainfo = ""; if (urlSegments.Length > 3) { mediainfo = urlSegments[3].Replace("/", ""); } if (mediainfo.Length > 0) { mediainfo = handler.GetMediaType() + "(" + mediainfo + ")"; } else { mediainfo = handler.GetMediaType(); } foreach (var channel in channels) { MediaChannelState state = new MediaChannelState(); state.ChannelName = channel.ChannelName; state.AddressInfo = ctx.Request.RemoteEndPoint.ToString(); state.MediaInfo = mediainfo; state.ClientCount = 0; UpdateState(channel.ChannelName, state); } handler.HandleInput(this, channels, ctx.Request.InputStream, mediainfo); foreach (var channel in channels) { //channel.SetWelcomeText(""); channel.RemoveWelcomeText(mediainfo); channel.SetWelcomeData(new byte[0]); RemoveState(channel.ChannelName); } } try { ctx.Response.Abort(); // make sure the connection is closed } catch (Exception ex) { Logger.Error("HTTP context error: " + ex.Message); } }
protected virtual void ProcessInputData(object obj) { HttpListenerContext ctx = obj as HttpListenerContext; if (ctx == null) { return; } string remoteIp = ""; string sourceUrl = ""; try { remoteIp = ctx.Request.RemoteEndPoint.Address.ToString(); sourceUrl = "[" + remoteIp + "] - " + ctx.Request.Url.ToString(); } catch (Exception ex) { Logger.Error("HTTP context error: " + ex.Message); } IMediaHandler handler = null; List <MediaChannel> channels = new List <MediaChannel>(); var urlSegments = ctx.Request.Url.Segments; string channelNames = ""; if (urlSegments.Length > 1) { channelNames = urlSegments[1].Replace("/", ""); } if (channelNames.Length > 0) { var names = channelNames.Split(','); foreach (var channelName in names) { var channel = GetChannel(channelName.Trim()); if (channel != null) { channel.AddInputUrl(sourceUrl); } if (channel != null) { var srcUrls = channel.GetInputUrls(); Logger.Info("Channel #" + channelName + "# input source updated >> "); foreach (var srcUrl in srcUrls) { Logger.Info("#" + channelName + "# - " + srcUrl); } } if (channel != null && channel.IsWorking() == false) { channel.Start(); } if (channel != null) { channels.Add(channel); } Thread.Sleep(50); } } if (channels.Count > 0) { string typeinfo = ""; if (urlSegments.Length > 2) { typeinfo = urlSegments[2].Replace("/", ""); } if (typeinfo.Length > 0) { handler = m_ResourceManager.GetHandler(typeinfo); } } if (channels.Count > 0 && handler != null) { string mediainfo = ""; if (urlSegments.Length > 3) { mediainfo = urlSegments[3].Replace("/", ""); } if (mediainfo.Length > 0) { mediainfo = handler.GetMediaType() + "(" + mediainfo + ")"; } else { mediainfo = handler.GetMediaType(); } foreach (var channel in channels) { MediaChannelState state = new MediaChannelState(); state.ChannelName = channel.ChannelName; state.AddressInfo = ctx.Request.RemoteEndPoint.ToString(); state.MediaInfo = mediainfo; state.ClientCount = 0; UpdateState(channel.ChannelName, state); } // should ensure there is at least a try-catch block inside the process function handler.HandleInput(this, channels, ctx.Request.InputStream, mediainfo); foreach (var channel in channels) { //channel.SetWelcomeText(""); channel.RemoveWelcomeText(mediainfo); channel.SetWelcomeData(new byte[0]); channel.RemoveInputUrl(sourceUrl); if (channel != null) { var srcUrls = channel.GetInputUrls(); if (srcUrls.Count > 0) { Logger.Info("Channel #" + channel.ChannelName + "# input source updated >> "); foreach (var srcUrl in srcUrls) { Logger.Info("#" + channel.ChannelName + "# - " + srcUrl); } } else { Logger.Info("Channel #" + channel.ChannelName + "# input source dropped."); } } RemoveState(channel.ChannelName); Thread.Sleep(50); } } try { ctx.Response.Abort(); // make sure the connection is closed } catch (Exception ex) { Logger.Error("HTTP context error: " + ex.Message); } }
public MediaController(IMediaHandler mediaHandler, AthenaData data, IMapper mapper) { this.data = data; this.mapper = mapper; this.mediaHandler = mediaHandler; }
private void RunHandler(IMediaHandler handler) { handler.SearchMedia(); }