summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--machines/fourmi/default.nix1
-rw-r--r--modules/go2rtc.nix36
-rw-r--r--modules/klipper.nix7
3 files changed, 44 insertions, 0 deletions
diff --git a/machines/fourmi/default.nix b/machines/fourmi/default.nix
index 091391a..b6b8712 100644
--- a/machines/fourmi/default.nix
+++ b/machines/fourmi/default.nix
@@ -7,6 +7,7 @@
     ./hardware.nix
     ./devices.nix
 
+    ../../modules/go2rtc.nix
     ../../modules/klipper.nix
   ];
 
diff --git a/modules/go2rtc.nix b/modules/go2rtc.nix
new file mode 100644
index 0000000..7ee7ae3
--- /dev/null
+++ b/modules/go2rtc.nix
@@ -0,0 +1,36 @@
+{ me, ... }:
+
+let
+  ffmpegDevice =
+    device: format: resolution: hz:
+    "ffmpeg:device?video=${device}&input_format=${format}&video_size=${resolution}&framerate=${hz}#video=h264#hardware";
+
+  go2rtcPort = 1984;
+  webrtcPort = 8555;
+in
+{
+  services.go2rtc = {
+    enable = true;
+
+    settings = {
+      api = {
+        listen = "${me.tailscale.ip}:${toString go2rtcPort}";
+        base_path = "/webcam";
+        origin = "*"; # stop cors annoyance!
+      };
+
+      webrtc =
+        let
+          address = "${me.tailscale.ip}:${toString webrtcPort}";
+        in
+        {
+          listen = address;
+          candidates = [ address ];
+        };
+
+      streams = {
+        webcam = ffmpegDevice "/dev/video0" "yuyv422" "1280x720" "30";
+      };
+    };
+  };
+}
diff --git a/modules/klipper.nix b/modules/klipper.nix
index 4f7be74..646969f 100644
--- a/modules/klipper.nix
+++ b/modules/klipper.nix
@@ -15,6 +15,8 @@ let
       ${../assets/printer/mainsail.cfg} \
       > $out
   '';
+
+  webcamPort = 1984;
 in
 {
   users.users.klipper = {
@@ -80,6 +82,11 @@ in
         forceSSL = true;
         listenAddresses = [ me.tailscale.ip ];
 
+        locations."/webcam" = {
+          proxyPass = "http://${me.tailscale.ip}:${toString webcamPort}";
+          proxyWebsockets = true;
+        };
+
         extraConfig = ''
           access_log /var/log/nginx/3d.access.log json_combined;
         '';