{ lib, pkgs, ... }: with lib; let mixcloudSources = { avocadoom = "https://www.mixcloud.com/avocadoom/"; b4m = "https://www.mixcloud.com/b4m/"; barbnerdy = "https://soundcloud.com/barbnerdy"; beh2342 = "https://soundcloud.com/beh2342"; couchsofa = "https://www.mixcloud.com/couchsofa/"; das-kraftfuttermischwerk = "https://soundcloud.com/das-kraftfuttermischwerk"; dj-spock = "https://www.mixcloud.com/dj_spock/"; LoungeControl = "https://www.mixcloud.com/LoungeControl/"; matthiasdamasty = "https://www.mixcloud.com/matthiasdamasty/"; sh1bumi = "https://soundcloud.com/sh1bumi"; shroombab = "https://www.mixcloud.com/shroombab/"; tasmo = "https://www.mixcloud.com/tasmo/"; vidister = "https://mixcloud.com/vidister/"; }; generateYoutubedlMixcloudUnits = source: url: ( nameValuePair "youtube-dl-mixcloud-${source}" { serviceConfig = { User = "data-mixcloud"; Group = "data-mixcloud"; Restart="on-failure"; }; path = [ pkgs.youtube-dl ]; script = '' mkdir -p /data/mixcloud/${source}/ cd /data/mixcloud/${source}/ youtube-dl --ignore-errors --playlist-random --newline ${url} ''; startAt = "*-*-* 05:05:00"; } ); generateYoutubedlMixcloudTimers = source: url: ( nameValuePair "youtube-dl-mixcloud-${source}" { timerConfig = { RandomizedDelaySec = 10800; }; } ); in { services.nginx.virtualHosts = { "mixcloud.clerie.de" = { enableACME = true; forceSSL = true; locations."/" = { alias = "/data/mixcloud/"; basicAuthFile = "/var/src/secrets/nginx/mixcloud.htpasswd"; extraConfig = '' autoindex on; autoindex_exact_size off; ''; }; }; }; users.users.data-mixcloud = { group = "data-mixcloud"; home = "/data/mixcloud"; useDefaultShell = true; isSystemUser = true; }; users.groups.data-mixcloud = {}; systemd.services = (mapAttrs' generateYoutubedlMixcloudUnits mixcloudSources); systemd.timers = (mapAttrs' generateYoutubedlMixcloudTimers mixcloudSources); }