Use a systemd container to manage dslr-webcam

This commit is contained in:
Alex Davies 2024-06-06 15:05:19 -03:00
parent 1f3653c6fb
commit 4831928351
1 changed files with 30 additions and 3 deletions

View File

@ -1,4 +1,3 @@
{ pkgs, lib, ... }: { pkgs, lib, ... }:
let let
@ -8,7 +7,8 @@ let
''; '';
dslrUdevRule = '' dslrUdevRule = ''
ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="04a9", ENV{ID_USB_MODEL}=="Canon_Digital_Camera", RUN+="${pkgs.writeScriptBin "dslr-webcam" dslrWebcamScript}/bin/dslr-webcam" ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="04a9", ENV{ID_USB_MODEL}=="Canon_Digital_Camera", RUN+="${pkgs.systemd}/bin/systemctl start dslr-webcam.service"
ACTION=="remove", SUBSYSTEM=="usb", ATTR{idVendor}=="04a9", ENV{ID_USB_MODEL}=="Canon_Digital_Camera", RUN+="${pkgs.systemd}/bin/systemctl stop dslr-webcam.service"
''; '';
dslrWebcamScript = '' dslrWebcamScript = ''
@ -16,6 +16,20 @@ let
modprobe dslr-webcam || true modprobe dslr-webcam || true
exec "${pkgs.gphoto2}/bin/gphoto2" --stdout --capture-movie | "${pkgs.ffmpeg}/bin/ffmpeg" -i - -vcodec rawvideo -pix_fmt yuv420p -f v4l2 /dev/video10 exec "${pkgs.gphoto2}/bin/gphoto2" --stdout --capture-movie | "${pkgs.ffmpeg}/bin/ffmpeg" -i - -vcodec rawvideo -pix_fmt yuv420p -f v4l2 /dev/video10
''; '';
dslrWebcamService = ''
[Unit]
Description=DSLR Webcam Service
After=network.target
[Service]
ExecStart=${pkgs.writeScriptBin "dslr-webcam" dslrWebcamScript}/bin/dslr-webcam
ExecStop=/bin/kill -s TERM $MAINPID
Restart=on-failure
[Install]
WantedBy=multi-user.target
'';
in in
{ {
# Ensure your system configuration includes these options: # Ensure your system configuration includes these options:
@ -28,8 +42,21 @@ in
# Udev rule for DSLR camera # Udev rule for DSLR camera
services.udev.extraRules = dslrUdevRule; services.udev.extraRules = dslrUdevRule;
# Install dslr-webcam script # Install dslr-webcam script and systemd service
environment.systemPackages = with pkgs; [ environment.systemPackages = with pkgs; [
(writeScriptBin "dslr-webcam" dslrWebcamScript) (writeScriptBin "dslr-webcam" dslrWebcamScript)
]; ];
systemd.services.dslr-webcam = {
description = "DSLR Webcam Service";
after = [ "network.target" ];
serviceConfig = {
ExecStart = "${pkgs.writeScriptBin "dslr-webcam" dslrWebcamScript}/bin/dslr-webcam";
ExecStop = "/bin/kill -s TERM $MAINPID";
Restart = "on-failure";
};
wantedBy = [ "multi-user.target" ];
};
} }