Ejemplo n.º 1
0
        // 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);
        }
Ejemplo n.º 2
0
        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);
        }
Ejemplo n.º 3
0
        // 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);
            }
        }
Ejemplo n.º 4
0
        /// <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);
            }
        }
Ejemplo n.º 7
0
 public MediaController(IMediaHandler mediaHandler, AthenaData data, IMapper mapper)
 {
     this.data         = data;
     this.mapper       = mapper;
     this.mediaHandler = mediaHandler;
 }
Ejemplo n.º 8
0
 private void RunHandler(IMediaHandler handler)
 {
     handler.SearchMedia();
 }