@@ -80,8 +80,10 @@ (define-module (gnu packages rust-apps)
#:use-module (gnu packages fontutils)
#:use-module (gnu packages freedesktop)
#:use-module (gnu packages haskell-xyz)
+ #:use-module (gnu packages gettext)
#:use-module (gnu packages glib)
#:use-module (gnu packages gnome)
+ #:use-module (gnu packages gstreamer)
#:use-module (gnu packages gtk)
#:use-module (gnu packages ibus)
#:use-module (gnu packages icu4c)
@@ -105,6 +107,7 @@ (define-module (gnu packages rust-apps)
#:use-module (gnu packages sqlite)
#:use-module (gnu packages tls)
#:use-module (gnu packages version-control)
+ #:use-module (gnu packages video)
#:use-module (gnu packages webkit)
#:use-module (gnu packages xorg))
@@ -366,6 +369,107 @@ (define-public bat
paging.")
(license (list license:expat license:asl2.0))))
+(define-public blue-recorder
+ ;; Tagged releases are infrequent.
+ (let ((commit "1cfa3bbb1b5ea845b3e4c51eba269745f0c3e271")
+ (revision "1"))
+ (package
+ (name "blue-recorder")
+ (version (git-version "0.2.0" revision commit))
+ (source
+ (origin
+ (method git-fetch)
+ (uri (git-reference
+ (url "https://github.com/xlmnxp/blue-recorder")
+ (commit commit)))
+ (snippet
+ #~(begin (use-modules (guix build utils))
+ (substitute* "Cargo.toml"
+ (("gdk = \\{ git =.*\\}")
+ "gdk = { version = \"0.7.3\", package = \"gdk4\" }"))))
+ (file-name (git-file-name name version))
+ (sha256
+ (base32 "0fz5l1z5rq8gx2vhrpfnf5l5karlqa7m8fdwx7ixlvy5klywwa5y"))))
+ (build-system cargo-build-system)
+ (arguments
+ `(;#:cargo-build-flags '("--release")
+ #:install-source? #t ; Needed to wrap the binary.
+ #:phases
+ ,#~(modify-phases %standard-phases
+ ;; As per the application’s build instructions the binary needs
+ ;; to be wrapped with po and data paths as environment variables.
+ (add-after 'install 'wrap-paths
+ (lambda _
+ (let* ((bin (string-append #$output "/bin"))
+ (name-version (string-append #$name "-" #$version))
+ (blue-recorder (string-append bin "/blue-recorder"))
+ (src (string-append #$output "/share/cargo/src/"))
+ (po (string-append src name-version "/po/"))
+ (data (string-append src name-version "/data/")))
+ (wrap-program blue-recorder
+ `("PO_DIR" prefix (,po))
+ `("DATA_DIR" prefix (,data))))))
+ (add-after 'unpack 'substitute-package-paths
+ (lambda* (#:key inputs #:allow-other-keys)
+ (define* (substitute-command-block* file command full-command)
+ (substitute* file
+ (((string-append "Command::new\\(\"" command "\"\\)"))
+ (string-append "Command::new(\"" full-command "\")"))))
+ (substitute-command-block* "src/area_capture.rs"
+ "xwininfo" (search-input-file inputs "/bin/xwininfo"))
+ (substitute-command-block* "src/ffmpeg_interface.rs"
+ "ffmpeg" (search-input-file inputs "/bin/ffmpeg"))
+ (substitute-command-block* "src/ffmpeg_interface.rs"
+ "kill" (search-input-file inputs "/bin/kill"))
+ (substitute-command-block* "src/ffmpeg_interface.rs"
+ "mv" (search-input-file inputs "/bin/mv"))
+ (substitute-command-block* "src/ffmpeg_interface.rs"
+ "xdg-open" (search-input-file inputs "/bin/xdg-open"))
+ (substitute-command-block* "src/main.rs"
+ "pactl" (search-input-file inputs "/bin/pactl"))
+ (substitute-command-block* "src/main.rs"
+ "grep" (search-input-file inputs "/bin/grep")))))
+ #:cargo-inputs (("rust-async-std" ,rust-async-std-1)
+ ("rust-chrono" ,rust-chrono-0.4)
+ ("rust-dark-light" ,rust-dark-light-1)
+ ("rust-dirs" ,rust-dirs-4)
+ ("rust-filename" ,rust-filename-0.1)
+ ("rust-gdk-pixbuf" ,rust-gdk-pixbuf-0.9)
+ ("rust-gdk4" ,rust-gdk4-0.7)
+ ("rust-gettext-rs" ,rust-gettext-rs-0.7)
+ ("rust-gio" ,rust-gio-0.15)
+ ("rust-glib" ,rust-glib-0.10)
+ ("rust-gstreamer" ,rust-gstreamer-0.20)
+ ;("rust-gtk-sys" ,rust-gtk-sys-0.15)
+ ;("rust-gtk4" ,rust-gtk4-0.4)
+ ("rust-regex" ,rust-regex-1)
+ ;("rust-rust-ini" ,rust-rust-ini-0.16)
+ ("rust-secfmt" ,rust-secfmt-0.1)
+ ("rust-subprocess" ,rust-subprocess-0.2)
+ ("rust-tempfile" ,rust-tempfile-3)
+ ("rust-zbus" ,rust-zbus-3))))
+ (native-inputs (list pkg-config
+ gettext-minimal))
+ (inputs (list bash-minimal
+ ;cairo
+ coreutils-minimal
+ ffmpeg
+ ;gdk-pixbuf
+ ;glib
+ ;gstreamer
+ ;gtk
+ ;libappindicator
+ pulseaudio
+ xdg-utils
+ xwininfo))
+ (home-page "https://github.com/xlmnxp/blue-recorder/")
+ (synopsis "Simple Screen Recorder written in Rust based on Green Recorder")
+ (description
+ "A desktop recorder built using GTK4 and ffmpeg. It supports recording
+audio and video on almost all Linux interfaces with support for Wayland display
+server on GNOME session.")
+ (license license:gpl3))))
+
(define-public cargo-machete
(package
(name "cargo-machete")