62 lines
1.4 KiB
Nix
62 lines
1.4 KiB
Nix
|
{ config, lib, pkgs, ... }:
|
||
|
|
||
|
let
|
||
|
|
||
|
owncastArchiver = with pkgs; writeScript "owncast-archiver.sh" ''
|
||
|
#! ${runtimeShell} -e
|
||
|
|
||
|
PATH=${lib.makeBinPath [ coreutils curl jq ffmpeg ]}
|
||
|
|
||
|
while true; do
|
||
|
|
||
|
STATUS="$(curl -s https://owncast.c3d2.de/api/status)"
|
||
|
ONLINE="$(echo "$STATUS" | jq -r .online)"
|
||
|
if [ "$ONLINE" = true ]; then
|
||
|
TITLE="$(echo "$STATUS" | jq -r .streamTitle)"
|
||
|
ffmpeg -i https://owncast.c3d2.de/hls/0/stream.m3u8 -c copy "$(echo "$(date -Iseconds)_$TITLE.mkv"|tr " +<>:/" "____\\-\\-")"
|
||
|
fi
|
||
|
|
||
|
sleep ${toString cfg.pollInterval}
|
||
|
done
|
||
|
'';
|
||
|
|
||
|
cfg = config.services.owncast-archiver;
|
||
|
|
||
|
in
|
||
|
|
||
|
{
|
||
|
options.services.owncast-archiver = with lib; {
|
||
|
enable = mkEnableOption "owncast archiver";
|
||
|
|
||
|
targetDir = mkOption {
|
||
|
type = types.str;
|
||
|
default = "/mnt/archive";
|
||
|
};
|
||
|
|
||
|
pollInterval = mkOption {
|
||
|
type = types.int;
|
||
|
default = 10;
|
||
|
};
|
||
|
};
|
||
|
|
||
|
config = lib.mkIf cfg.enable {
|
||
|
users.users.archiver = {
|
||
|
isSystemUser = true;
|
||
|
group = "nginx";
|
||
|
};
|
||
|
|
||
|
systemd.services.owncast-archiver = {
|
||
|
wantedBy = [ "multi-user.target" ];
|
||
|
after = [ "owncast.service" ];
|
||
|
serviceConfig = {
|
||
|
ReadWritePaths = cfg.targetDir;
|
||
|
WorkingDirectory = cfg.targetDir;
|
||
|
User = "archiver";
|
||
|
ExecStart = owncastArchiver;
|
||
|
Restart = "always";
|
||
|
RestartSec = 60;
|
||
|
};
|
||
|
};
|
||
|
};
|
||
|
}
|