From 48319283510719fe0d6cac1cdd835a292654836a Mon Sep 17 00:00:00 2001
From: Alex Davies <traverse.da@gmail.com>
Date: Thu, 6 Jun 2024 15:05:19 -0300
Subject: [PATCH] Use a systemd container to manage dslr-webcam

---
 nixos/misc/dslr-webcam.nix | 33 ++++++++++++++++++++++++++++++---
 1 file changed, 30 insertions(+), 3 deletions(-)

diff --git a/nixos/misc/dslr-webcam.nix b/nixos/misc/dslr-webcam.nix
index df094a3..38928f7 100644
--- a/nixos/misc/dslr-webcam.nix
+++ b/nixos/misc/dslr-webcam.nix
@@ -1,4 +1,3 @@
-
 { pkgs, lib, ... }:
 
 let
@@ -8,7 +7,8 @@ let
   '';
 
   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 = ''
@@ -16,6 +16,20 @@ let
     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
   '';
+
+  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
 {
   # Ensure your system configuration includes these options:
@@ -28,8 +42,21 @@ in
   # Udev rule for DSLR camera
   services.udev.extraRules = dslrUdevRule;
 
-  # Install dslr-webcam script
+  # Install dslr-webcam script and systemd service
   environment.systemPackages = with pkgs; [
     (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" ];
+  };
 }
+
+