private void Result_Error(object sender, Exception e)
 {
     Task.Run(() => BoundTerminal.Send("mediaplayer", new MediaPlayerMessage()
     {
         Action = "error"
     }));
 }
 private void Result_Playing(object sender, EventArgs e)
 {
     Task.Run(() => BoundTerminal.Send("mediaplayer", new MediaPlayerMessage()
     {
         Action = "playing"
     }));
 }
 private void Result_NowPlaying(object sender, string e)
 {
     Task.Run(() => BoundTerminal.Send("mediaplayer", new MediaPlayerMessage()
     {
         Action = "now-playing", Mrl = e
     }));
 }
 private void Result_PositionChanged(object sender, float e)
 {
     Task.Run(() => BoundTerminal.Send("mediaplayer", new MediaPlayerMessage()
     {
         Action = "position", Position = e
     }));
 }
 private void Result_IsSeekableChanged(object sender, bool e)
 {
     Task.Run(() => BoundTerminal.Send("mediaplayer", new MediaPlayerMessage()
     {
         Action = "seekable-changed"
     }));
 }
 private void Result_HasSubtitlesChanged(object sender, bool e)
 {
     Task.Run(() => BoundTerminal.Send("mediaplayer", new MediaPlayerMessage()
     {
         Action = "has-subtitles-changed"
     }));
 }
 private void Result_DurationChanged(object sender, TimeSpan e)
 {
     Task.Run(() => BoundTerminal.Send("mediaplayer", new MediaPlayerMessage()
     {
         Action = "duration-changed"
     }));
 }
        public ScreenCastPlayer(PanaceaServices core)
        {
            this._core = core;
            if (_core.TryGetPairing(out IBoundTerminalManager _pairing))
            {
                if (_pairing.IsBound())
                {
                    BoundTerminal = _pairing.GetBoundTerminal();

                    if (BoundTerminal.Relation == TerminalRelation.Slave)
                    {
                        BoundTerminal.Disconnected += BoundTerminal_Disconnected;
                        BoundTerminal.On <MediaPlayerMessage>("mediaplayer", OnMessageFromMaster);
                    }
                    else
                    {
                        BoundTerminal.On <MediaPlayerMessage>("mediaplayer", OnMessageFromSlave);
                    }
                }
            }
        }
        /* Messages from master to slave to ask for action or information
         */
        private void OnMessageFromMaster(MediaPlayerMessage msg)
        {
            IMediaPlayerContainer container;
            IUiManager            uiManager;
            IAudioManager         _audio;

            switch (msg.Action)
            {
            case "subtitles-on":
                try
                {
                    result?.SetSubtitles(true);
                }
                catch
                {
                    if (_core.TryGetUiManager(out uiManager))
                    {
                        uiManager.Toast(new Translator("ScreenCast").Translate("Subtitles not found for this media"));
                    }
                }
                break;

            case "subtitles-off":
                try
                {
                    result?.SetSubtitles(false);
                }
                catch
                {
                    if (_core.TryGetUiManager(out uiManager))
                    {
                        uiManager.Toast(translator.Translate("Subtitles not found for this media"));
                    }
                }
                break;

            case "play":
                if (_core.TryGetMediaPlayerContainer(out container))
                {
                    if (!string.IsNullOrEmpty(msg.Mrl))
                    {
                        result = container.Play(new MediaRequest(new IptvMedia()
                        {
                            URL = msg.Mrl + " " + msg.Extras
                        })
                        {
                            FullscreenMode = FullscreenMode.FullscreenOnly
                        });
                        AttachToMediaResponse(result);
                    }
                    else
                    {
                        result.Play();
                    }
                }
                break;

            case "pause":
                if (_core.TryGetMediaPlayerContainer(out container))
                {
                    result.Pause();
                }
                break;

            case "stop":
                if (_core.TryGetMediaPlayerContainer(out container))
                {
                    result.Stop();
                }
                break;

            case "previous":
                if (_core.TryGetMediaPlayerContainer(out container))
                {
                    result.Previous();
                }
                break;

            case "next":
                if (_core.TryGetMediaPlayerContainer(out container))
                {
                    result.Next();
                }
                break;

            case "volume":
                if (_core.TryGetMediaPlayerContainer(out container))
                {
                    if (_core.TryGetAudioManager(out _audio))
                    {
                        _audio.SpeakersVolume = (int)Math.Round(msg.Volume * 100f);
                    }
                }
                break;

            case "getvolume":
                if (_core.TryGetMediaPlayerContainer(out container))
                {
                    if (_core.TryGetAudioManager(out _audio))
                    {
                        Task.Run(() => BoundTerminal.Send("mediaplayer", new MediaPlayerMessage {
                            Action = "getvolume", Volume = _audio.SpeakersVolume / 100f
                        }));
                    }
                }
                break;

            default:
                break;
            }
        }