2024-07-24 17:23:32 -04:00
|
|
|
{ pkgs, ... }:
|
|
|
|
|
|
|
|
let
|
|
|
|
gsr-save-replay = pkgs.writeShellScriptBin "gsr-save-replay" ''
|
|
|
|
${pkgs.killall}/bin/killall -SIGUSR1 gpu-screen-recorder
|
|
|
|
OUTPUT_DIR="$HOME/${outputDir}"
|
|
|
|
VIDEO_FILE=$(ls -t $OUTPUT_DIR | head -n1)
|
|
|
|
ACTION=$(${pkgs.libnotify}/bin/notify-send -a 'GPU Screen Recorder' --action 'file=Watch Replay' --action 'dir=View All Replays' -i com.dec05eba.gpu_screen_recorder -t 3000 -u low 'Replay Saved' "$VIDEO_FILE")
|
|
|
|
if [ "$ACTION" == "dir" ]; then
|
|
|
|
xdg-open $OUTPUT_DIR
|
|
|
|
elif [ "$ACTION" == "file" ]; then
|
|
|
|
xdg-open $OUTPUT_DIR/$VIDEO_FILE
|
|
|
|
fi
|
|
|
|
'';
|
|
|
|
|
2024-07-25 22:18:22 -04:00
|
|
|
gsr-record = pkgs.writeShellScriptBin "gsr-start-recording" ''
|
|
|
|
systemctl --user start gpu-screen-recorder.service
|
|
|
|
'';
|
|
|
|
|
|
|
|
gsr-replay = pkgs.writeShellScriptBin "gsr-start-replay" ''
|
2024-07-25 22:18:43 -04:00
|
|
|
systemctl --user start gsr-replay.service
|
|
|
|
'';
|
|
|
|
|
2024-07-25 22:18:22 -04:00
|
|
|
gsr-stop = pkgs.writeShellScriptBin "gsr-stop-replay" ''
|
2024-07-25 22:18:43 -04:00
|
|
|
systemctl --user stop gsr-replay.service
|
|
|
|
'';
|
|
|
|
|
2024-07-24 17:23:32 -04:00
|
|
|
outputDir = "Videos/Replays";
|
|
|
|
in
|
|
|
|
{
|
|
|
|
environment.systemPackages = [
|
|
|
|
gsr-save-replay
|
2024-07-25 22:18:22 -04:00
|
|
|
gsr-replay
|
|
|
|
gsr-record
|
|
|
|
gsr-stop
|
2024-07-24 17:23:32 -04:00
|
|
|
];
|
|
|
|
|
|
|
|
security.wrappers."gsr-kms-server" = {
|
|
|
|
# Required to start recording without password prompt
|
|
|
|
capabilities = "cap_sys_admin+ep";
|
|
|
|
group = "root";
|
|
|
|
owner = "root";
|
|
|
|
source = "${pkgs.gpu-screen-recorder}/bin/gsr-kms-server";
|
|
|
|
};
|
|
|
|
|
|
|
|
services.xserver.desktopManager.gnome = {
|
|
|
|
# TODO: Figure out how to properly add custom keyboard shortcuts to GNOME, this doesn't seem to work for some reason
|
|
|
|
extraGSettingsOverrides = ''
|
|
|
|
[org/gnome/settings-daemon/plugins/media-keys]
|
|
|
|
custom-keybindings=['/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/gsr-save-replay/']
|
|
|
|
|
|
|
|
[org.gnome.settings-daemon.plugins.media-keys.custom-keybindings.gsr-save-replay]
|
|
|
|
binding='<Alt>F12'
|
|
|
|
command='gsr-save-replay'
|
|
|
|
name='GPU Screen Recorder - Save Replay'
|
|
|
|
'';
|
|
|
|
|
|
|
|
extraGSettingsOverridePackages = with pkgs; [ gnome.gnome-settings-daemon ];
|
|
|
|
};
|
|
|
|
|
2024-07-25 22:18:22 -04:00
|
|
|
systemd.user.services = rec {
|
|
|
|
"gpu-screen-recorder" = {
|
|
|
|
after = [ "graphical-session.target" ];
|
|
|
|
description = "GPU Screen Recorder service";
|
|
|
|
serviceConfig = {
|
|
|
|
Environment = [
|
|
|
|
"AUDIO_CODEC=opus"
|
|
|
|
"CODEC=auto"
|
|
|
|
"CONTAINER=mkv"
|
|
|
|
"FRAMERATE=60"
|
|
|
|
"MAKEFOLDERS=no"
|
|
|
|
"QUALITY=very_high"
|
|
|
|
"WINDOW=screen"
|
|
|
|
];
|
|
|
|
ExecStart = pkgs.writeShellScript "start-gpu-screen-recorder-replay" ''
|
|
|
|
#${pkgs.killall}/bin/killall gpu-screen-recorder
|
2024-07-24 17:23:32 -04:00
|
|
|
|
2024-07-25 22:18:22 -04:00
|
|
|
if [ -n "$REPLAYDURATION" ]; then
|
|
|
|
REPLAYARG="-r $REPLAYDURATION"
|
|
|
|
else
|
|
|
|
REPLAYARG=""
|
2024-07-24 17:23:32 -04:00
|
|
|
fi
|
2024-07-25 22:18:22 -04:00
|
|
|
|
|
|
|
${pkgs.gpu-screen-recorder}/bin/gpu-screen-recorder $REPLAYARG -a "$(${pkgs.pulseaudio}/bin/pactl get-default-sink).monitor" -a "$(${pkgs.pulseaudio}/bin/pactl get-default-source)" -ac "$AUDIO_CODEC" -c "$CONTAINER" -f "$FRAMERATE" -k "$CODEC" -mf "$MAKEFOLDERS" -o "${outputDir}" -q "$QUALITY" -v no -w "$WINDOW" $ADDITIONAL_ARGS
|
|
|
|
'';
|
|
|
|
Restart = "on-failure";
|
|
|
|
RestartSec = "5s";
|
|
|
|
Type = "simple";
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
"gsr-replay" = gpu-screen-recorder // {
|
|
|
|
description = "GPU Screen Recorder replay service";
|
|
|
|
serviceConfig = gpu-screen-recorder.serviceConfig // {
|
|
|
|
Environment = gpu-screen-recorder.serviceConfig.Environment ++ [ "REPLAYDURATION=300" ];
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
"gsr-replay-change-audio" = {
|
|
|
|
after = [ "gsr-replay.service" ];
|
|
|
|
description = "Restart GPU Screen Recorder replay service on audio device change";
|
|
|
|
requires = [ "gsr-replay.service" ];
|
|
|
|
serviceConfig = {
|
|
|
|
ExecStart = pkgs.writeShellScript "gsr-restart-on-audio-device-change" ''
|
|
|
|
${pkgs.pulseaudio}/bin/pactl subscribe | while read -r event; do
|
|
|
|
if [[ $event == *"Event 'change' on server"* ]]; then
|
|
|
|
systemctl --user restart gsr-replay.service
|
|
|
|
fi
|
|
|
|
done
|
|
|
|
'';
|
|
|
|
Restart = "on-failure";
|
|
|
|
RestartSec = "5s";
|
|
|
|
Type = "simple";
|
|
|
|
};
|
|
|
|
wantedBy = [ "gsr-replay.service" ];
|
2024-07-24 17:23:32 -04:00
|
|
|
};
|
|
|
|
};
|
|
|
|
}
|