예제 #1
0
        public MainWindow()
        {
            Instance = this;

            InitializeComponent();

            var mainModel = ServiceProvider.Get <MainModel>();

            mainModel.Init(!App.CmdOptions.NoPersist, !App.CmdOptions.Reset);

            var hotkeySetup = ServiceProvider.Get <HotkeySetup>();

            hotkeySetup.Setup();

            ServiceProvider.Get <TimerModel>().Init();

            Loaded += (Sender, Args) =>
            {
                RepositionWindowIfOutside();

                WebCamWindow.Instance.SetupWebcamPreview();

                hotkeySetup.ShowUnregistered();

                mainModel.ViewLoaded();
            };

            if (App.CmdOptions.Tray || ServiceProvider.Get <Settings>().Tray.MinToTrayOnStartup)
            {
                Hide();
            }

            Closing += (Sender, Args) =>
            {
                if (!TryExit())
                {
                    Args.Cancel = true;
                }
            };
        }
예제 #2
0
        IVideoWriterItem HandleVideoEncoder(StartCmdOptions StartOptions, out IVideoWriterProvider VideoWriterKind)
        {
            var selected = _videoWriterProviders
                           .Select(M => new
            {
                kind   = M,
                writer = M.ParseCli(StartOptions.Encoder)
            })
                           .FirstOrDefault(M => M.writer != null);

            if (selected != null)
            {
                VideoWriterKind = selected.kind;

                return(selected.writer);
            }

            var sharpAviWriterProvider = ServiceProvider.Get <SharpAviWriterProvider>();

            // Steps in video
            if (StartOptions.Encoder == "steps:video")
            {
                _settings.Video.RecorderMode = RecorderMode.Steps;

                VideoWriterKind = null;
                return(new StepsVideoWriterItem(sharpAviWriterProvider.First()));
            }

            // Steps in set of images
            if (StartOptions.Encoder == "steps:images")
            {
                _settings.Video.RecorderMode = RecorderMode.Steps;

                VideoWriterKind = null;
                return(new ImageFolderWriterItem());
            }

            VideoWriterKind = sharpAviWriterProvider;
            return(sharpAviWriterProvider.First());
        }
예제 #3
0
        IVideoWriterItem HandleVideoEncoder(StartCmdOptions StartOptions, out IVideoWriterProvider VideoWriterKind)
        {
            var selected = _videoWriterProviders
                           .Select(M => new
            {
                kind   = M,
                writer = M.ParseCli(StartOptions.Encoder)
            })
                           .FirstOrDefault(M => M.writer != null);

            if (selected != null)
            {
                VideoWriterKind = selected.kind;

                return(selected.writer);
            }

            var sharpAviWriterProvider = ServiceProvider.Get <SharpAviWriterProvider>();

            VideoWriterKind = sharpAviWriterProvider;
            return(sharpAviWriterProvider.First());
        }
예제 #4
0
        public void Run()
        {
            if (!File.Exists(FileName))
            {
                Console.WriteLine("File not found");
                return;
            }

            switch (Service)
            {
            case UploadService.imgur:
                var imgSystem = ServiceProvider.Get <IImagingSystem>();
                var img       = imgSystem.LoadBitmap(FileName);
                var uploader  = ServiceProvider.Get <IImageUploader>();

                // TODO: Show progress (on a single line)
                var result = uploader.Upload(img, ImageFormats.Png, P => { }).Result;

                Console.WriteLine(result.Url);
                break;
            }
        }
예제 #5
0
        static void Main(string[] Args)
        {
            User32.SetProcessDPIAware();

            ServiceProvider.LoadModule(new CoreModule());
            ServiceProvider.LoadModule(new FakesModule());
            ServiceProvider.LoadModule(new VerbsModule());

            var verbTypes = ServiceProvider
                            .Get <IEnumerable <ICmdlineVerb> >()
                            .Select(M => M.GetType())
                            .ToArray();

            Parser.Default.ParseArguments(Args, verbTypes)
            .WithParsed((ICmdlineVerb Verb) =>
            {
                // Always display Banner
                Banner();

                Verb.Run();
            });
        }
예제 #6
0
        static void HandleVideoEncoder(VideoWritersViewModel VideoWritersViewModel, StartCmdOptions StartOptions)
        {
            if (StartOptions.Encoder == null)
            {
                return;
            }

            // FFmpeg
            if (FFmpegService.FFmpegExists && Regex.IsMatch(StartOptions.Encoder, @"^ffmpeg:\d+$"))
            {
                var index = int.Parse(StartOptions.Encoder.Substring(7));

                VideoWritersViewModel.SelectedVideoWriterKind = ServiceProvider.Get <FFmpegWriterProvider>();

                if (index < VideoWritersViewModel.AvailableVideoWriters.Count)
                {
                    VideoWritersViewModel.SelectedVideoWriter = VideoWritersViewModel.AvailableVideoWriters[index];
                }
            }

            // SharpAvi
            else if (ServiceProvider.FileExists("SharpAvi.dll") && Regex.IsMatch(StartOptions.Encoder, @"^sharpavi:\d+$"))
            {
                var index = int.Parse(StartOptions.Encoder.Substring(9));

                VideoWritersViewModel.SelectedVideoWriterKind = ServiceProvider.Get <SharpAviWriterProvider>();

                if (index < VideoWritersViewModel.AvailableVideoWriters.Count)
                {
                    VideoWritersViewModel.SelectedVideoWriter = VideoWritersViewModel.AvailableVideoWriters[index];
                }
            }

            // Gif
            else if (StartOptions.Encoder == "gif")
            {
                VideoWritersViewModel.SelectedVideoWriterKind = ServiceProvider.Get <GifWriterProvider>();
            }
        }
예제 #7
0
        public MainWindow()
        {
            Instance = this;

            InitializeComponent();

            _helper = ServiceProvider.Get <MainWindowHelper>();

            _helper.MainViewModel.Init(!App.CmdOptions.NoPersist, !App.CmdOptions.Reset);

            _helper.HotkeySetup.Setup();

            _helper.TimerModel.Init();

            Loaded += (Sender, Args) =>
            {
                RepositionWindowIfOutside();

                ServiceProvider.Get <WebcamPage>().SetupPreview();

                _helper.HotkeySetup.ShowUnregistered();
            };

            if (App.CmdOptions.Tray || _helper.Settings.Tray.MinToTrayOnStartup)
            {
                Hide();
            }

            Closing += (Sender, Args) =>
            {
                if (!TryExit())
                {
                    Args.Cancel = true;
                }
            };

            // Register to bring this instance to foreground when other instances are launched.
            SingleInstanceManager.StartListening(WakeApp);
        }
예제 #8
0
        void Application_Startup(object Sender, StartupEventArgs Args)
        {
            AppDomain.CurrentDomain.UnhandledException += OnCurrentDomainOnUnhandledException;

            ServiceProvider.LoadModule(new CoreModule());
            ServiceProvider.LoadModule(new ViewCoreModule());

            Parser.Default.ParseArguments <CmdOptions>(Args.Args)
            .WithParsed(M => CmdOptions = M);

            if (CmdOptions.Settings != null)
            {
                ServiceProvider.SettingsDir = CmdOptions.Settings;
            }

            var settings = ServiceProvider.Get <Settings>();

            InitTheme(settings);

            BindLanguageSetting(settings);

            BindKeymapSetting(settings);
        }
        void WindowMouseMove(object Sender, MouseEventArgs E)
        {
            var platformServices = ServiceProvider.Get <IPlatformServices>();

            var point = platformServices.CursorPosition;

            switch (_mode)
            {
            case VideoPickerMode.Screen:
                SelectedScreen = _screens.FirstOrDefault(M => M.Rectangle.Contains(point));

                UpdateBorderAndCursor(SelectedScreen?.Rectangle);
                break;

            case VideoPickerMode.Window:
                SelectedWindow = _windows
                                 .Where(M => Predicate?.Invoke(M) ?? true)
                                 .FirstOrDefault(M => M.Rectangle.Contains(point));

                UpdateBorderAndCursor(SelectedWindow?.Rectangle);
                break;
            }
        }
예제 #10
0
        void OnLoaded(object Sender, RoutedEventArgs RoutedEventArgs)
        {
            UpdateSizeText();

            var settings = ServiceProvider.Get <Settings>();

            var keystrokes = Keystrokes(settings.Keystrokes);

            var webcam = Webcam(settings.WebcamOverlay);

            var textOverlayVm = ServiceProvider.Get <CustomOverlaysViewModel>();

            UpdateTextOverlays(textOverlayVm.Collection);
            (textOverlayVm.Collection as INotifyCollectionChanged).CollectionChanged += (S, E) => UpdateTextOverlays(textOverlayVm.Collection);

            var imgOverlayVm = ServiceProvider.Get <CustomImageOverlaysViewModel>();

            UpdateImageOverlays(imgOverlayVm.Collection);
            (imgOverlayVm.Collection as INotifyCollectionChanged).CollectionChanged += (S, E) => UpdateImageOverlays(imgOverlayVm.Collection);

            AddToGrid(keystrokes, false);
            AddToGrid(webcam, true);
        }
예제 #11
0
        static string GetPath(object Value)
        {
            var icons = ServiceProvider.Get <IIconSet>();

            switch (Value)
            {
            case InkCanvasEditingMode.Ink:
            case ExtendedInkTool.Pen:
                return(icons.Pencil);

            case InkCanvasEditingMode.EraseByPoint:
            case ExtendedInkTool.Eraser:
                return(icons.Eraser);

            case InkCanvasEditingMode.EraseByStroke:
            case ExtendedInkTool.StrokeEraser:
                return(icons.StrokeEraser);

            case InkCanvasEditingMode.Select:
            case ExtendedInkTool.Select:
                return(icons.Select);

            case ExtendedInkTool.Line:
                return(icons.Line);

            case ExtendedInkTool.Rectangle:
                return(icons.Rectangle);

            case ExtendedInkTool.Ellipse:
                return(icons.Ellipse);

            case ExtendedInkTool.Arrow:
                return(icons.Arrow);
            }

            return(icons.Cursor);
        }
예제 #12
0
        ScreenPickerWindow()
        {
            SelectScreenCommand = new ReactiveCommand <IScreen>()
                                  .WithSubscribe(M =>
            {
                SelectedScreen = M;

                Close();
            });

            InitializeComponent();

            ScreenContainer.Width  = SystemParameters.VirtualScreenWidth * Scale;
            ScreenContainer.Height = SystemParameters.VirtualScreenHeight * Scale;

            var platformServices = ServiceProvider.Get <IPlatformServices>();

            var screens = platformServices.EnumerateScreens().ToArray();

            foreach (var screen in screens)
            {
                ScreenPickerViewModels.Add(new ScreenPickerViewModel(screen, Scale));
            }
        }
예제 #13
0
        static void RefreshFFmpegCodecs()
        {
            // Refresh only if not Recording and FFmpeg encoder is selected
            var mainVm = ServiceProvider.Get <MainViewModel>();

            var canRefresh = mainVm.RefreshCommand.CanExecute(null);

            if (!canRefresh)
            {
                return;
            }

            var writersVm = ServiceProvider.Get <VideoWritersViewModel>();

            if (!(writersVm.SelectedVideoWriterKind is FFmpegWriterProvider))
            {
                return;
            }

            if (writersVm is IRefreshable refreshable)
            {
                refreshable.Refresh();
            }
        }
예제 #14
0
        static void List()
        {
            Banner();

            var underline = $"\n{new string('-', 30)}";

            #region FFmpeg
            var ffmpegExists = FFmpegService.FFmpegExists;

            WriteLine($"FFmpeg Available: {(ffmpegExists ? "YES" : "NO")}");

            WriteLine();

            if (ffmpegExists)
            {
                WriteLine("FFmpeg ENCODERS" + underline);

                var writerProvider = ServiceProvider.Get <FFmpegWriterProvider>();

                var i = 0;

                foreach (var codec in writerProvider)
                {
                    WriteLine($"{i.ToString().PadRight(2)}: {codec}");
                    ++i;
                }

                WriteLine();
            }
            #endregion

            #region SharpAvi
            var sharpAviExists = ServiceProvider.FileExists("SharpAvi.dll");

            WriteLine($"SharpAvi Available: {(sharpAviExists ? "YES" : "NO")}");

            WriteLine();

            if (sharpAviExists)
            {
                WriteLine("SharpAvi ENCODERS" + underline);

                var writerProvider = ServiceProvider.Get <SharpAviWriterProvider>();

                var i = 0;

                foreach (var codec in writerProvider)
                {
                    WriteLine($"{i.ToString().PadRight(2)}: {codec}");
                    ++i;
                }

                WriteLine();
            }
            #endregion

            #region Windows
            WriteLine("AVAILABLE WINDOWS" + underline);

            // Window Picker is skipped automatically
            foreach (var source in Window.EnumerateVisible())
            {
                WriteLine($"{source.Handle.ToString().PadRight(10)}: {source.Title}");
            }

            WriteLine();
            #endregion

            #region Screens
            WriteLine("AVAILABLE SCREENS" + underline);

            var j = 0;

            // First is Full Screen, Second is Screen Picker
            foreach (var screen in ScreenItem.Enumerate())
            {
                WriteLine($"{j.ToString().PadRight(2)}: {screen.Name}");

                ++j;
            }

            WriteLine();
            #endregion

            var audio = ServiceProvider.Get <AudioSource>();

            WriteLine($"ManagedBass Available: {(audio is BassAudioSource ? "YES" : "NO")}");

            WriteLine();

            #region Microphones
            if (audio.AvailableRecordingSources.Count > 0)
            {
                WriteLine("AVAILABLE MICROPHONES" + underline);

                for (var i = 0; i < audio.AvailableRecordingSources.Count; ++i)
                {
                    WriteLine($"{i.ToString().PadRight(2)}: {audio.AvailableRecordingSources[i]}");
                }

                WriteLine();
            }
            #endregion

            #region Speaker
            if (audio.AvailableLoopbackSources.Count > 0)
            {
                WriteLine("AVAILABLE SPEAKER SOURCES" + underline);

                for (var i = 0; i < audio.AvailableLoopbackSources.Count; ++i)
                {
                    WriteLine($"{i.ToString().PadRight(2)}: {audio.AvailableLoopbackSources[i]}");
                }

                WriteLine();
            }
            #endregion

            #region Webcams
            var webcam = ServiceProvider.Get <IWebCamProvider>();

            if (webcam.AvailableCams.Count > 1)
            {
                WriteLine("AVAILABLE WEBCAMS" + underline);

                for (var i = 1; i < webcam.AvailableCams.Count; ++i)
                {
                    WriteLine($"{(i - 1).ToString().PadRight(2)}: {webcam.AvailableCams[i]}");
                }

                WriteLine();
            }
            #endregion
        }
예제 #15
0
        static void HandleVideoSource(MainViewModel ViewModel, CommonCmdOptions CommonOptions)
        {
            // Desktop
            if (CommonOptions.Source == null || CommonOptions.Source == "desktop")
            {
                return;
            }

            var video = ViewModel.VideoViewModel;

            // Region
            if (Regex.IsMatch(CommonOptions.Source, @"^\d+,\d+,\d+,\d+$"))
            {
                if (MainViewModel.RectangleConverter.ConvertFromInvariantString(CommonOptions.Source) is Rectangle rect)
                {
                    FakeRegionProvider.Instance.SelectedRegion = rect.Even();
                    video.SelectedVideoSourceKind = ServiceProvider.Get <RegionSourceProvider>();
                }
            }

            // Screen
            else if (Regex.IsMatch(CommonOptions.Source, @"^screen:\d+$"))
            {
                var index = int.Parse(CommonOptions.Source.Substring(7));

                if (index < ScreenItem.Count)
                {
                    video.SelectedVideoSourceKind = ServiceProvider.Get <ScreenSourceProvider>();

                    // First item is Full Screen, Second is Screen Picker
                    video.SelectedVideoSource = video.AvailableVideoSources[index + 2];
                }
            }

            // Window
            else if (Regex.IsMatch(CommonOptions.Source, @"^win:\d+$"))
            {
                var handle = new IntPtr(int.Parse(CommonOptions.Source.Substring(4)));

                var winProvider = ServiceProvider.Get <WindowSourceProvider>();

                var matchingWin = winProvider.OfType <WindowItem>().FirstOrDefault(M => M.Window.Handle == handle);

                if (matchingWin != null)
                {
                    video.SelectedVideoSourceKind = winProvider;

                    video.SelectedVideoSource = matchingWin;
                }
            }

            // Start command only
            else if (CommonOptions is StartCmdOptions)
            {
                // Desktop Duplication
                if (Regex.IsMatch(CommonOptions.Source, @"^deskdupl:\d+$"))
                {
                    var index = int.Parse(CommonOptions.Source.Substring(9));

                    if (index < ScreenItem.Count)
                    {
                        video.SelectedVideoSourceKind = ServiceProvider.Get <DeskDuplSourceProvider>();

                        video.SelectedVideoSource = video.AvailableVideoSources[index];
                    }
                }

                // No Video for Start
                else if (CommonOptions.Source == "none")
                {
                    video.SelectedVideoSourceKind = ServiceProvider.Get <NoVideoSourceProvider>();
                }
            }
        }
예제 #16
0
        static void Main(string[] Args)
        {
            if (Args.Length == 0)
            {
                var uiPath = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location),
                                          "captura.exe");

                if (File.Exists(uiPath))
                {
                    Process.Start(uiPath);

                    return;
                }
            }

            User32.SetProcessDPIAware();

            ServiceProvider.LoadModule(new CoreModule());
            ServiceProvider.LoadModule(new FakesModule());

            // Hide on Full Screen Screenshot doesn't work on Console
            ServiceProvider.Get <Settings>().UI.HideOnFullScreenShot = false;

            Parser.Default.ParseArguments <StartCmdOptions, ShotCmdOptions, FFmpegCmdOptions, ListCmdOptions>(Args)
            .WithParsed <ListCmdOptions>(Options => List())
            .WithParsed <StartCmdOptions>(Options =>
            {
                Banner();

                using (var vm = ServiceProvider.Get <MainViewModel>())
                {
                    vm.Init(false, false, false, false);

                    // Load settings dummy
                    var dummySettings = new Settings();
                    dummySettings.Load();

                    vm.Settings.WebcamOverlay       = dummySettings.WebcamOverlay;
                    vm.Settings.MousePointerOverlay = dummySettings.MousePointerOverlay;
                    vm.Settings.Clicks     = dummySettings.Clicks;
                    vm.Settings.Keystrokes = dummySettings.Keystrokes;
                    vm.Settings.Elapsed    = dummySettings.Elapsed;

                    // FFmpeg Path
                    vm.Settings.FFmpeg.FolderPath = dummySettings.FFmpeg.FolderPath;

                    foreach (var overlay in dummySettings.Censored)
                    {
                        vm.Settings.Censored.Add(overlay);
                    }

                    foreach (var overlay in dummySettings.TextOverlays)
                    {
                        vm.Settings.TextOverlays.Add(overlay);
                    }

                    foreach (var overlay in dummySettings.ImageOverlays)
                    {
                        vm.Settings.ImageOverlays.Add(overlay);
                    }

                    Start(vm, Options);
                }
            })
            .WithParsed <ShotCmdOptions>(Options =>
            {
                Banner();

                using (var vm = ServiceProvider.Get <MainViewModel>())
                {
                    vm.Init(false, false, false, false);

                    Shot(vm, Options);
                }
            })
            .WithParsed <FFmpegCmdOptions>(Options =>
            {
                Banner();

                FFmpeg(Options);
            });
        }
예제 #17
0
        IVideoWriterItem HandleVideoEncoder(StartCmdOptions StartOptions, out IVideoWriterProvider VideoWriterKind)
        {
            var ffmpegExists           = FFmpegService.FFmpegExists;
            var sharpAviWriterProvider = ServiceProvider.Get <SharpAviWriterProvider>();

            if (StartOptions.Encoder == null)
            {
                StartOptions.Encoder = "sharpavi:0";
            }

            // FFmpeg
            if (ffmpegExists && Regex.IsMatch(StartOptions.Encoder, @"^ffmpeg:\d+$"))
            {
                var index = int.Parse(StartOptions.Encoder.Substring(7));

                var ffmpegWriterProvider = ServiceProvider.Get <FFmpegWriterProvider>();
                var writers = ffmpegWriterProvider.ToArray();

                if (index < writers.Length)
                {
                    VideoWriterKind = ffmpegWriterProvider;

                    return(writers[index]);
                }
            }

            // SharpAvi
            else if (ServiceProvider.FileExists("SharpAvi.dll") && Regex.IsMatch(StartOptions.Encoder, @"^sharpavi:\d+$"))
            {
                var index = int.Parse(StartOptions.Encoder.Substring(9));

                var writers = sharpAviWriterProvider.ToArray();

                if (index < writers.Length)
                {
                    VideoWriterKind = sharpAviWriterProvider;

                    return(writers[index]);
                }
            }

            // Stream
            else if (ffmpegExists && Regex.IsMatch(StartOptions.Encoder, @"^stream:\S+$"))
            {
                var url = StartOptions.Encoder.Substring(7);
                _settings.FFmpeg.CustomStreamingUrl = url;

                VideoWriterKind = ServiceProvider.Get <StreamingWriterProvider>();

                return(StreamingWriterProvider.GetCustomStreamingCodec());
            }

            // Rolling
            else if (ffmpegExists && Regex.IsMatch(StartOptions.Encoder, @"^roll:\d+$"))
            {
                var duration = int.Parse(StartOptions.Encoder.Substring(5));

                VideoWriterKind = ServiceProvider.Get <FFmpegWriterProvider>();

                return(new FFmpegRollingWriterItem(duration));
            }

            VideoWriterKind = sharpAviWriterProvider;
            return(sharpAviWriterProvider.First());
        }
예제 #18
0
        public void OnLoad(IBinder Binder)
        {
            // Singleton View Models
            Binder.BindSingleton <MainViewModel>();
            Binder.BindSingleton <VideoViewModel>();
            Binder.BindSingleton <ProxySettingsViewModel>();
            Binder.BindSingleton <LicensesViewModel>();
            Binder.BindSingleton <CrashLogsViewModel>();
            Binder.BindSingleton <FFmpegCodecsViewModel>();
            Binder.BindSingleton <ScreenShotViewModel>();
            Binder.BindSingleton <RecentViewModel>();
            Binder.BindSingleton <RecordingViewModel>();
            Binder.BindSingleton <FileNameFormatViewModel>();

            Binder.BindSingleton <CustomOverlaysViewModel>();
            Binder.BindSingleton <CustomImageOverlaysViewModel>();
            Binder.BindSingleton <CensorOverlaysViewModel>();

            // Settings
            Binder.BindSingleton <Settings>();
            Binder.Bind(() => ServiceProvider.Get <Settings>().Audio);
            Binder.Bind(() => ServiceProvider.Get <Settings>().FFmpeg);
            Binder.Bind(() => ServiceProvider.Get <Settings>().Gif);
            Binder.Bind(() => ServiceProvider.Get <Settings>().Proxy);

            // Keymap
            Binder.BindSingleton <KeymapViewModel>();

            // Localization
            Binder.Bind(() => LanguageManager.Instance);

            // Hotkeys
            Binder.BindSingleton <HotKeyManager>();

            // Image Writers
            Binder.BindSingleton <DiskWriter>();
            Binder.BindSingleton <ClipboardWriter>();
            Binder.BindSingleton <ImgurWriter>();

            Binder.Bind <IImageWriterItem>(ServiceProvider.Get <DiskWriter>);
            Binder.Bind <IImageWriterItem>(ServiceProvider.Get <ClipboardWriter>);
            Binder.Bind <IImageWriterItem>(ServiceProvider.Get <ImgurWriter>);

            // Video Writer Providers
            Binder.BindSingleton <FFmpegWriterProvider>();
            Binder.BindSingleton <GifWriterProvider>();
            Binder.BindSingleton <StreamingWriterProvider>();
            Binder.BindSingleton <DiscardWriterProvider>();
            Binder.BindSingleton <SharpAviWriterProvider>();

            Binder.BindSingleton <FullScreenItem>();

            // Video Source Providers
            Binder.BindSingleton <ScreenSourceProvider>();
            Binder.BindSingleton <FullScreenSourceProvider>();
            Binder.BindSingleton <RegionSourceProvider>();
            Binder.BindSingleton <WindowSourceProvider>();
            Binder.BindSingleton <DeskDuplSourceProvider>();
            Binder.BindSingleton <NoVideoSourceProvider>();

            // Folder Browser Dialog
            Binder.Bind <IDialogService, DialogService>();

            // Clipboard
            Binder.Bind <IClipboardService, ClipboardService>();

            // FFmpeg Log
            Binder.BindSingleton <FFmpegLog>();

            // Check if Bass is available
            if (BassAudioSource.Available)
            {
                Binder.Bind <AudioSource, BassAudioSource>();
            }
            else
            {
                Binder.Bind <AudioSource, NoAudioSource>();
            }
        }
예제 #19
0
        void Application_Startup(object Sender, StartupEventArgs Args)
        {
            AppDomain.CurrentDomain.UnhandledException += (S, E) =>
            {
                var dir = Path.Combine(ServiceProvider.SettingsDir, "Crashes");

                Directory.CreateDirectory(dir);

                File.WriteAllText(Path.Combine(dir, $"{DateTime.Now:yyyy-MM-dd-HH-mm-ss}.txt"), E.ExceptionObject.ToString());

                if (E.ExceptionObject is Exception e)
                {
                    Current.Dispatcher.Invoke(() => new ExceptionWindow(e).ShowDialog());
                }

                Shutdown();
            };

            ServiceProvider.LoadModule(new CoreModule());

            Parser.Default.ParseArguments <CmdOptions>(Args.Args)
            .WithParsed(M => CmdOptions = M);

            if (CmdOptions.Settings != null)
            {
                ServiceProvider.SettingsDir = CmdOptions.Settings;
            }

            var settings = ServiceProvider.Get <Settings>();

            if (!CmdOptions.Reset)
            {
                settings.Load();
            }

            if (settings.UI.DarkTheme)
            {
                AppearanceManager.Current.ThemeSource = AppearanceManager.DarkThemeSource;
            }

            var accent = settings.UI.AccentColor;

            if (!string.IsNullOrEmpty(accent))
            {
                AppearanceManager.Current.AccentColor = WpfExtensions.ParseColor(accent);
            }

            if (!string.IsNullOrWhiteSpace(settings.UI.Language))
            {
                var matchedCulture = LanguageManager.Instance.AvailableCultures.FirstOrDefault(M => M.Name == settings.UI.Language);

                if (matchedCulture != null)
                {
                    LanguageManager.Instance.CurrentCulture = matchedCulture;
                }
            }

            LanguageManager.Instance.LanguageChanged += L => settings.UI.Language = L.Name;

            var keymap = ServiceProvider.Get <KeymapViewModel>();

            if (!string.IsNullOrWhiteSpace(settings.Keystrokes.KeymapName))
            {
                var matched = keymap.AvailableKeymaps.FirstOrDefault(M => M.Name == settings.Keystrokes.KeymapName);

                if (matched != null)
                {
                    keymap.SelectedKeymap = matched;
                }
            }

            keymap.PropertyChanged += (S, E) => settings.Keystrokes.KeymapName = keymap.SelectedKeymap.Name;
        }
예제 #20
0
        public void OnLoad(IBinder Binder)
        {
            // Singleton View Models
            Binder.BindSingleton <MainViewModel>();
            Binder.BindSingleton <VideoViewModel>();
            Binder.BindSingleton <ProxySettingsViewModel>();
            Binder.BindSingleton <LicensesViewModel>();
            Binder.BindSingleton <CrashLogsViewModel>();
            Binder.BindSingleton <FFmpegCodecsViewModel>();

            Binder.BindSingleton <CustomOverlaysViewModel>();
            Binder.BindSingleton <CustomImageOverlaysViewModel>();
            Binder.BindSingleton <CensorOverlaysViewModel>();

            // Settings
            Binder.BindSingleton <Settings>();
            Binder.Bind(() => ServiceProvider.Get <Settings>().Audio);
            Binder.Bind(() => ServiceProvider.Get <Settings>().FFmpeg);
            Binder.Bind(() => ServiceProvider.Get <Settings>().Gif);
            Binder.Bind(() => ServiceProvider.Get <Settings>().Proxy);

            // Localization
            Binder.Bind(() => LanguageManager.Instance);

            // Hotkeys
            Binder.BindSingleton <HotKeyManager>();

            // Image Writers
            Binder.BindSingleton <DiskWriter>();
            Binder.BindSingleton <ClipboardWriter>();
            Binder.BindSingleton <ImgurWriter>();

            Binder.Bind <IImageWriterItem>(ServiceProvider.Get <DiskWriter>);
            Binder.Bind <IImageWriterItem>(ServiceProvider.Get <ClipboardWriter>);
            Binder.Bind <IImageWriterItem>(ServiceProvider.Get <ImgurWriter>);

            // Video Writer Providers
            Binder.Bind <IVideoWriterProvider, FFmpegWriterProvider>();
            Binder.Bind <IVideoWriterProvider, GifWriterProvider>();
            Binder.Bind <IVideoWriterProvider, StreamingWriterProvider>();

#if DEBUG
            Binder.Bind <IVideoWriterProvider, DiscardWriterProvider>();
#endif

            // Check if SharpAvi is available
            if (ServiceProvider.FileExists("SharpAvi.dll"))
            {
                Binder.Bind <IVideoWriterProvider, SharpAviWriterProvider>();
            }

            Binder.BindSingleton <WindowPickerItem>();
            Binder.BindSingleton <ScreenPickerItem>();
            Binder.BindSingleton <FullScreenItem>();

            // Video Source Providers
            Binder.Bind <IVideoSourceProvider, ScreenSourceProvider>();
            Binder.Bind <IVideoSourceProvider, RegionSourceProvider>();
            Binder.Bind <IVideoSourceProvider, WindowSourceProvider>();
            Binder.Bind <IVideoSourceProvider, DeskDuplSourceProvider>();
            Binder.Bind <IVideoSourceProvider, NoVideoSourceProvider>();

            // Folder Browser Dialog
            Binder.Bind <IDialogService, DialogService>();

            // Clipboard
            Binder.Bind <IClipboardService, ClipboardService>();

            // FFmpeg Log
            Binder.BindSingleton <FFmpegLog>();

            // Check if Bass is available
            if (BassAudioSource.Available)
            {
                Binder.Bind <AudioSource, BassAudioSource>();
            }
            else
            {
                Binder.Bind <AudioSource, NoAudioSource>();
            }
        }
예제 #21
0
        public MainWindow()
        {
            Instance = this;

            FFmpegService.FFmpegDownloader += () =>
            {
                if (_downloader == null)
                {
                    _downloader         = new FFmpegDownloaderWindow();
                    _downloader.Closed += (Sender, Args) => _downloader = null;
                }

                _downloader.ShowAndFocus();
            };

            InitializeComponent();

            if (DataContext is MainViewModel vm)
            {
                var mainModel = ServiceProvider.Get <MainModel>();

                mainModel.Init(!App.CmdOptions.NoPersist, !App.CmdOptions.Reset, !App.CmdOptions.NoHotkeys);
                ServiceProvider.Get <HotkeyActionRegisterer>().Register();
                ServiceProvider.Get <TimerModel>().Init();

                var listener = new HotkeyListener();

                var hotkeyManager = ServiceProvider.Get <HotKeyManager>();

                listener.HotkeyReceived += Id => hotkeyManager.ProcessHotkey(Id);

                ServiceProvider.Get <HotKeyManager>().HotkeyPressed += Service =>
                {
                    switch (Service)
                    {
                    case ServiceName.OpenImageEditor:
                        new ImageEditorWindow().ShowAndFocus();
                        break;

                    case ServiceName.ShowMainWindow:
                        this.ShowAndFocus();
                        break;
                    }
                };

                Loaded += (Sender, Args) =>
                {
                    RepositionWindowIfOutside();

                    mainModel.ViewLoaded();
                };
            }

            if (App.CmdOptions.Tray || ServiceProvider.Get <Settings>().Tray.MinToTrayOnStartup)
            {
                Hide();
            }

            Closing += (Sender, Args) =>
            {
                if (!TryExit())
                {
                    Args.Cancel = true;
                }
            };
        }
        public void Run()
        {
            var lister = ServiceProvider.Get <ConsoleLister>();

            lister.List();
        }
예제 #23
0
        static void HandleVideoSource(MainViewModel ViewModel, CommonCmdOptions CommonOptions)
        {
            // Desktop
            if (CommonOptions.Source == null || CommonOptions.Source == "desktop")
            {
                return;
            }

            var video = ViewModel.VideoViewModel;

            // Region
            if (Regex.IsMatch(CommonOptions.Source, @"^\d+,\d+,\d+,\d+$"))
            {
                if (MainViewModel.RectangleConverter.ConvertFromInvariantString(CommonOptions.Source) is Rectangle rect)
                {
                    FakeRegionProvider.Instance.SelectedRegion = rect.Even();
                    video.SelectedVideoSourceKind = ServiceProvider.Get <RegionSourceProvider>();
                }
            }

            // Screen
            else if (Regex.IsMatch(CommonOptions.Source, @"^screen:\d+$"))
            {
                var index = int.Parse(CommonOptions.Source.Substring(7));

                if (index < ScreenItem.Count)
                {
                    var screenSourceProvider = ServiceProvider.Get <ScreenSourceProvider>();

                    screenSourceProvider.Set(index);

                    video.RestoreSourceKind(screenSourceProvider);
                }
            }

            // Window
            else if (Regex.IsMatch(CommonOptions.Source, @"^win:\d+$"))
            {
                var handle = new IntPtr(int.Parse(CommonOptions.Source.Substring(4)));

                var winProvider = ServiceProvider.Get <WindowSourceProvider>();

                winProvider.Set(handle);

                video.RestoreSourceKind(winProvider);
            }

            // Start command only
            else if (CommonOptions is StartCmdOptions)
            {
                // Desktop Duplication
                if (Regex.IsMatch(CommonOptions.Source, @"^deskdupl:\d+$"))
                {
                    var index = int.Parse(CommonOptions.Source.Substring(9));

                    if (index < ScreenItem.Count)
                    {
                        var deskDuplSourceProvider = ServiceProvider.Get <DeskDuplSourceProvider>();

                        deskDuplSourceProvider.Set(new ScreenWrapper(Screen.AllScreens[index]));

                        video.RestoreSourceKind(deskDuplSourceProvider);
                    }
                }

                // No Video for Start
                else if (CommonOptions.Source == "none")
                {
                    video.SelectedVideoSourceKind = ServiceProvider.Get <NoVideoSourceProvider>();
                }
            }
        }
예제 #24
0
        public ImageUploadNotification()
        {
            _loc = ServiceProvider.Get <ILocalizationProvider>();

            PrimaryText = _loc.ImageUploading;
        }
예제 #25
0
        public void OnLoad(IBinder Binder)
        {
            Binder.BindSingleton <HotkeyActionRegisterer>();
            Binder.Bind <IIconSet, MaterialDesignIcons>();
            Binder.Bind <IImagurApiKeys, ApiKeys>();

            // Singleton View Models
            Binder.BindSingleton <MainViewModel>();
            Binder.BindSingleton <VideoSourcesViewModel>();
            Binder.BindSingleton <VideoWritersViewModel>();
            Binder.BindSingleton <FFmpegCodecsViewModel>();
            Binder.BindSingleton <ScreenShotViewModel>();
            Binder.BindSingleton <RecordingViewModel>();

            Binder.Bind <IRecentList, RecentListRepository>();

            // Settings
            Binder.BindSingleton <Settings>();
            Binder.Bind(() => ServiceProvider.Get <Settings>().Audio);
            Binder.Bind(() => ServiceProvider.Get <Settings>().FFmpeg);
            Binder.Bind(() => ServiceProvider.Get <Settings>().Gif);
            Binder.Bind(() => ServiceProvider.Get <Settings>().Proxy);
            Binder.Bind(() => ServiceProvider.Get <Settings>().Sounds);
            Binder.Bind(() => ServiceProvider.Get <Settings>().Imgur);

            // Keymap
            Binder.BindSingleton <KeymapViewModel>();

            // Localization
            Binder.Bind(() => LanguageManager.Instance);

            // Hotkeys
            Binder.BindSingleton <HotKeyManager>();

            // Image Writers
            BindAsInterfaceAndClass <IImageWriterItem, DiskWriter>(Binder);
            BindAsInterfaceAndClass <IImageWriterItem, ClipboardWriter>(Binder);
            BindAsInterfaceAndClass <IImageWriterItem, ImageUploadWriter>(Binder);

            Binder.Bind <IImageUploader, ImgurUploader>();

            // Video Writer Providers
            BindAsInterfaceAndClass <IVideoWriterProvider, FFmpegWriterProvider>(Binder);
            BindAsInterfaceAndClass <IVideoWriterProvider, GifWriterProvider>(Binder);
            BindAsInterfaceAndClass <IVideoWriterProvider, SharpAviWriterProvider>(Binder);
            BindAsInterfaceAndClass <IVideoWriterProvider, StreamingWriterProvider>(Binder);
            BindAsInterfaceAndClass <IVideoWriterProvider, DiscardWriterProvider>(Binder);

            Binder.BindSingleton <FullScreenItem>();

            // Video Source Providers
            BindAsInterfaceAndClass <IVideoSourceProvider, NoVideoSourceProvider>(Binder);
            BindAsInterfaceAndClass <IVideoSourceProvider, FullScreenSourceProvider>(Binder);
            BindAsInterfaceAndClass <IVideoSourceProvider, ScreenSourceProvider>(Binder);
            BindAsInterfaceAndClass <IVideoSourceProvider, WindowSourceProvider>(Binder);
            BindAsInterfaceAndClass <IVideoSourceProvider, RegionSourceProvider>(Binder);

            if (Windows8OrAbove)
            {
                BindAsInterfaceAndClass <IVideoSourceProvider, DeskDuplSourceProvider>(Binder);
            }


            // Folder Browser Dialog
            Binder.Bind <IDialogService, DialogService>();

            // Clipboard
            Binder.Bind <IClipboardService, ClipboardService>();

            // FFmpeg Log
            Binder.BindSingleton <FFmpegLog>();

            // Recent Serializers
            Binder.Bind <IRecentItemSerializer, FileRecentSerializer>();
            Binder.Bind <IRecentItemSerializer, UploadRecentSerializer>();

            // Check if Bass is available
            if (BassAudioSource.Available)
            {
                Binder.Bind <AudioSource, BassAudioSource>();
            }
            else
            {
                Binder.Bind <AudioSource, NAudioSource>();
            }

            // Update Checker
            var version = Assembly.GetEntryAssembly()?.GetName().Version;

            if (version?.Major == 0)
            {
                Binder.Bind <IUpdateChecker, DevUpdateChecker>();
            }
            else
            {
                Binder.Bind <IUpdateChecker, UpdateChecker>();
            }
        }
예제 #26
0
        public ImgurNotification()
        {
            _loc = ServiceProvider.Get <LanguageManager>();

            PrimaryText = _loc.ImgurUploading;
        }
예제 #27
0
 static Settings GetSettings() => ServiceProvider.Get <Settings>();
예제 #28
0
        static void List()
        {
            Banner();

            var underline = $"\n{new string('-', 30)}";

            #region FFmpeg
            var ffmpegExists = FFMpegService.FFMpegExists;

            WriteLine($"FFmpeg Available: {(ffmpegExists ? "YES" : "NO")}");

            WriteLine();

            if (ffmpegExists)
            {
                WriteLine("FFmpeg ENCODERS" + underline);

                var writerProvider = ServiceProvider.Get <FFMpegWriterProvider>();

                var i = 0;

                foreach (var codec in writerProvider)
                {
                    WriteLine($"{i.ToString().PadRight(2)}: {codec}");
                    ++i;
                }

                WriteLine();
            }
            #endregion

            #region SharpAvi
            var sharpAviExists = ServiceProvider.FileExists("SharpAvi.dll");

            WriteLine($"SharpAvi Available: {(sharpAviExists ? "YES" : "NO")}");

            WriteLine();

            if (sharpAviExists)
            {
                WriteLine("SharpAvi ENCODERS" + underline);

                var writerProvider = ServiceProvider.Get <SharpAviWriterProvider>();

                var i = 0;

                foreach (var codec in writerProvider)
                {
                    WriteLine($"{i.ToString().PadRight(2)}: {codec}");
                    ++i;
                }

                WriteLine();
            }
            #endregion

            #region Windows
            WriteLine("AVAILABLE WINDOWS" + underline);

            var winProvider = ServiceProvider.Get <WindowSourceProvider>();

            foreach (var source in winProvider.OfType <WindowItem>())
            {
                WriteLine($"{source.Window.Handle.ToString().PadRight(10)}: {source}");
            }

            WriteLine();
            #endregion

            #region Screens
            WriteLine("AVAILABLE SCREENS" + underline);

            var scrProvider = ServiceProvider.Get <ScreenSourceProvider>();

            var j = 0;

            // First is Full Screen
            foreach (var screen in scrProvider.Skip(1))
            {
                WriteLine($"{j.ToString().PadRight(2)}: {screen}");

                ++j;
            }

            WriteLine();
            #endregion

            #region MouseKeyHook
            WriteLine($"MouseKeyHook Available: {(ServiceProvider.Get<MainViewModel>().MouseKeyHookAvailable ? "YES" : "NO")}");

            WriteLine();
            #endregion

            var audio = ServiceProvider.Get <AudioSource>();

            WriteLine($"ManagedBass Available: {(audio is BassAudioSource ? "YES" : "NO")}");

            WriteLine();

            #region Microphones
            if (audio.AvailableRecordingSources.Count > 1)
            {
                WriteLine("AVAILABLE MICROPHONES" + underline);

                for (var i = 1; i < audio.AvailableRecordingSources.Count; ++i)
                {
                    WriteLine($"{(i - 1).ToString().PadRight(2)}: {audio.AvailableRecordingSources[i]}");
                }

                WriteLine();
            }
            #endregion

            #region Speaker
            if (audio.AvailableLoopbackSources.Count > 1)
            {
                WriteLine("AVAILABLE SPEAKER SOURCES" + underline);

                for (var i = 1; i < audio.AvailableLoopbackSources.Count; ++i)
                {
                    WriteLine($"{(i - 1).ToString().PadRight(2)}: {audio.AvailableLoopbackSources[i]}");
                }

                WriteLine();
            }
            #endregion

            #region Webcams
            var webcam = ServiceProvider.Get <IWebCamProvider>();

            if (webcam.AvailableCams.Count > 1)
            {
                WriteLine("AVAILABLE WEBCAMS" + underline);

                for (var i = 1; i < webcam.AvailableCams.Count; ++i)
                {
                    WriteLine($"{(i - 1).ToString().PadRight(2)}: {webcam.AvailableCams[i]}");
                }

                WriteLine();
            }
            #endregion
        }
예제 #29
0
 static FFmpegSettings GetSettings() => ServiceProvider.Get <FFmpegSettings>();
예제 #30
0
 public Server()
 {
     _recordingViewModel = ServiceProvider.Get <RecordingViewModel>();
 }