{ config, 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/";
    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.yt-dlp ];
      script = ''
        mkdir -p /data/mixcloud/${source}/
        cd /data/mixcloud/${source}/
        yt-dlp --ignore-errors --playlist-random --download-archive .already-downloaded.txt --newline -x --audio-format mp3 ${url}
      '';
      startAt = "*-*-* 05:05:00";
    }
  );

  generateYoutubedlMixcloudTimers = source: url: (
    nameValuePair "youtube-dl-mixcloud-${source}" {
      timerConfig = {
        RandomizedDelaySec = 10800;
      };
    }
  );

in {
  sops.secrets.mixcloud-htpasswd = {
    owner = "nginx";
    group = "nginx";
  };

  services.nginx.virtualHosts = {
    "mixcloud.clerie.de" = {
      enableACME = true;
      forceSSL = true;
      locations."/" = {
        alias = "/data/mixcloud/";
        basicAuthFile = config.sops.secrets.mixcloud-htpasswd.path;
        extraConfig = ''
          autoindex on;
          autoindex_exact_size off;
        '';
      };
      locations."/media/" = {
        alias = "/data/media/";
        basicAuthFile = config.sops.secrets.mixcloud-htpasswd.path;
        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.tmpfiles.rules = [
    "d /data/mixcloud - data-mixcloud data-mixcloud - -"
  ];

  systemd.services = (mapAttrs' generateYoutubedlMixcloudUnits mixcloudSources);
  systemd.timers = (mapAttrs' generateYoutubedlMixcloudTimers mixcloudSources);
}