2022-12-12 21:57:00 +01:00
|
|
|
{ config, lib, pkgs, ... }:
|
|
|
|
|
|
|
|
let
|
2023-11-11 23:21:00 +01:00
|
|
|
owncastArchiver = with pkgs; writeShellScript "owncast-archiver.sh" ''
|
2022-12-12 21:57:00 +01:00
|
|
|
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;
|
2023-05-27 18:55:15 +02:00
|
|
|
default = "/archive";
|
2022-12-12 21:57:00 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
pollInterval = mkOption {
|
|
|
|
type = types.int;
|
|
|
|
default = 10;
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
config = lib.mkIf cfg.enable {
|
|
|
|
users.users.archiver = {
|
|
|
|
isSystemUser = true;
|
|
|
|
group = "nginx";
|
|
|
|
};
|
|
|
|
|
2023-11-11 23:21:00 +01:00
|
|
|
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;
|
|
|
|
};
|
2022-12-12 21:57:00 +01:00
|
|
|
};
|
2023-11-11 23:21:00 +01:00
|
|
|
|
|
|
|
tmpfiles.rules = [
|
2023-11-27 01:36:00 +01:00
|
|
|
"d ${cfg.targetDir} 0770 archiver nginx -"
|
2023-11-11 23:21:00 +01:00
|
|
|
];
|
2022-12-12 21:57:00 +01:00
|
|
|
};
|
|
|
|
};
|
|
|
|
}
|