{
  config,
  pkgs,
  lib,
  ...
}:
with lib;
let
  configuration = {

    # series
    # ------

    druck1 = {
      url = "https://www.youtube.com/watch?list=PLUQncgYMM1RncxDFRfjkucPWRz5-8rjaH";
      target = "/media/youtube/series/Druck";
      output = "Druck S01E%(playlist_index)s %(title)s.%(ext)s";
    };
    druck2 = {
      url = "https://www.youtube.com/watch?list=PLUQncgYMM1RmbJojNI6lxS1Gn6UipeOdd";
      target = "/media/youtube/series/Druck";
      output = "Druck S02E%(playlist_index)s %(title)s.%(ext)s";
    };
    druck3 = {
      url = "https://www.youtube.com/watch?list=PLUQncgYMM1RnNv9KjVfvGCkDfIIuzSJpC";
      target = "/media/youtube/series/Druck";
      output = "Druck S03E%(playlist_index)s %(title)s.%(ext)s";
    };
    druck4 = {
      url = "https://www.youtube.com/watch?list=PLUQncgYMM1Rlbfz3vlmiW4EOAVZMh5kVF";
      target = "/media/youtube/series/Druck";
      output = "Druck S04E%(playlist_index)s %(title)s.%(ext)s";
    };
    druck5 = {
      url = "https://www.youtube.com/watch?list=PLUQncgYMM1RkacxBEWFO4jx6rOhgmMHf4";
      target = "/media/youtube/series/Druck";
      output = "Druck S05E%(playlist_index)s %(title)s.%(ext)s";
    };
    druck6 = {
      url = "https://www.youtube.com/watch?list=PLUQncgYMM1Rnj83qu3xujxw-LuI-2m4TS";
      target = "/media/youtube/series/Druck";
      output = "Druck S06E%(playlist_index)s %(title)s.%(ext)s";
    };
    druck7 = {
      url = "https://www.youtube.com/watch?list=PLUQncgYMM1RmN41ni6iDmBRg5Cos_bD--";
      target = "/media/youtube/series/Druck";
      output = "Druck S07E%(playlist_index)s %(title)s.%(ext)s";
    };
    druck8 = {
      url = "https://www.youtube.com/watch?list=PLUQncgYMM1RlzMSECHQDOHx2A4l4G-7yX";
      target = "/media/youtube/series/Druck";
      output = "Druck S08E%(playlist_index)s %(title)s.%(ext)s";
    };
    SunkCostGalaxy = {
      url = "https://www.youtube.com/watch?list=PL7SIP0NDfM2yyHKfRmCAociCcJKZHHY0E";
      target = "/media/youtube/series/Sunk Cost Galaxy";
      output = "Sunk Cost Galaxy S01E%(playlist_index)s %(title)s.%(ext)s";
    };
    BigLez = {
      url = "https://www.youtube.com/watch?list=PLGMC7oz7XpmCR1RWxqvFWvXVO_ry6FdHI";
      target = "/media/youtube/series/Big Lez";
      output = "Big Lez S01E%(playlist_index)s %(title)s.%(ext)s";
    };
    Sassy = {
      url = "https://www.youtube.com/watch?v=Dw_tGRblTXk";
      target = "/media/youtube/series/Big Lez";
      output = "Big Lez S02E01 %(title)s.%(ext)s";
    };
    HelluvaBoss = {
      url = "https://www.youtube.com/watch?list=PL-uopgYBi65HwiiDR9Y23lomAkGr9mm-S";
      target = "/media/youtube/series/Helluva Boss";
      output = "%(title)s.%(ext)s";
    };

    # channels
    # --------

    ordinary_things = {
      url = "https://www.youtube.com/@OrdinaryThings";
      target = "/media/youtube/channels/Ordinary Things";
      output = "%(channel)s S%(upload_date>%Y)sE%(upload_date>%m%d)s %(title)s.%(ext)s";
    };
    internet_historian = {
      url = "https://www.youtube.com/@InternetHistorian";
      target = "/media/youtube/channels/Internet Historian";
      output = "%(channel)s S%(upload_date>%Y)sE%(upload_date>%m%d)s %(title)s.%(ext)s";
    };
    bigboss = {
      url = "https://www.youtube.com/@bigbosstube";
      target = "/media/youtube/channels/Big Boss";
      output = "%(channel)s S%(upload_date>%Y)sE%(upload_date>%m%d)s %(title)s.%(ext)s";
    };
    CGPGrey = {
      url = "https://www.youtube.com/@CGPGrey";
      target = "/media/youtube/channels/CGP Grey";
      output = "%(channel)s S%(upload_date>%Y)sE%(upload_date>%m%d)s %(title)s.%(ext)s";
    };
    Joeseppi = {
      url = "https://www.youtube.com/@Joeseppi";
      target = "/media/youtube/channels/Joeseppi";
      output = "%(channel)s S%(upload_date>%Y)sE%(upload_date>%m%d)s %(title)s.%(ext)s";
    };
    HungrigerHugo = {
      url = "https://www.youtube.com/@HungrigerHugo";
      target = "/media/youtube/channels/HungrigerHugo";
      output = "%(channel)s S%(upload_date>%Y)sE%(upload_date>%m%d)s %(title)s.%(ext)s";
    };
    Kurzgesagt = {
      url = "https://www.youtube.com/@KurzgesagtDE";
      target = "/media/youtube/channels/Kurzgesagt";
      output = "%(channel)s S%(upload_date>%Y)sE%(upload_date>%m%d)s %(title)s.%(ext)s";
    };
    Simplicissimus = {
      url = "https://www.youtube.com/@Simplicissimus";
      target = "/media/youtube/channels/Simplicissimus";
      output = "%(channel)s S%(upload_date>%Y)sE%(upload_date>%m%d)s %(title)s.%(ext)s";
    };
    Soosenbinder = {
      url = "https://www.youtube.com/@Soosenbinder";
      target = "/media/youtube/channels/Soosenbinder";
      output = "%(channel)s S%(upload_date>%Y)sE%(upload_date>%m%d)s %(title)s.%(ext)s";
    };
    AllGasNoBreaks = {
      url = "https://www.youtube.com/@allgasnobrakes2491";
      target = "/media/youtube/channels/All Gas No Breaks";
      output = "%(channel)s S%(upload_date>%Y)sE%(upload_date>%m%d)s %(title)s.%(ext)s";
    };
    Jules = {
      url = "https://www.youtube.com/@Jules1";
      target = "/media/youtube/channels/Jules";
      output = "%(channel)s S%(upload_date>%Y)sE%(upload_date>%m%d)s %(title)s.%(ext)s";
    };
    #UrknallWeltallLeben = {
    #  url = "https://youtube.com/@UrknallWeltallLeben";
    #  target = "/media/youtube/channels/Urknall Weltall Leben";
    #  output = "%(channel)s S%(upload_date>%Y)sE%(upload_date>%m%d)s %(title)s.%(ext)s";
    #};
    ColdMirrorProdukte = {
      url = "https://www.youtube.com/watch?list=PLDvBqWb1UAGckU8CEJ8kDsk3ii8bbHT-s";
      target = "/media/youtube/channels/ColdMirror ProduktBeschreibungen";
      output = "%(channel)s S%(upload_date>%Y)sE%(upload_date>%m%d)s %(title)s.%(ext)s";
    };
    ColdMirror5Minuten = {
      url = "https://www.youtube.com/watch?list=PLDvBqWb1UAGeEt9n6vFH_zdGw65Obf3sH";
      target = "/media/youtube/channels/ColdMirror 5 Minuten Harry Potter";
      output = "%(channel)s S%(upload_date>%Y)sE%(upload_date>%m%d)s %(title)s.%(ext)s";
    };

    # My Playlists
    # ------------

    MusicVideos = {
      url = "https://www.youtube.com/playlist?list=PLP33x-q_GftakJgpD48pZNl0TkhljQI7S";
      target = "/media/youtube/music-videos";
      output = "%(title)s.%(ext)s";
    };
    Movies = {
      url = "https://www.youtube.com/playlist?list=PLP33x-q_Gftb-r8eUWBS1mjMlQZgCAljE";
      target = "/media/youtube/movies";
      output = "%(title)s.%(ext)s";
    };
    # like Documentations or something
    Videos = {
      url = "https://www.youtube.com/playlist?list=PLP33x-q_GftZa0-UG9yltYLea5scEHxd7";
      target = "/media/youtube/loot";
      output = "%(title)s.%(ext)s";
    };
    FridayVideos = {
      url = "https://www.youtube.com/playlist?list=PLP33x-q_GftbqHBybHABOwsRcUX7XZl_D";
      target = "/media/youtube/loot";
      output = "%(title)s.%(ext)s";
    };
  };

  downloadScript =
    name:
    {
      url,
      target,
      output,
      sponsorBlockCategories ? [ "default" ],
      notOlderThan ? "", # e.g: 1week
      breakOnExisting ? true,
      reverse ? false,
    }:
    pkgs.writers.writeDash "download-script-${name}" ''
      mkdir -p "${target}"
      yt-dlp \
          --no-abort-on-error \
          --no-mark-watched \
          --continue \
          ${optionalString (notOlderThan != "") "--dateafter now-${notOlderThan}"} \
          ${optionalString reverse "--playlist-reverse"} \
          --download-archive "${target}/.downloaded.txt" \
          --output "${target}/${output}" \
          --format "bestvideo[ext=mp4]+bestaudio[ext=m4a]" \
          --merge-output-format mp4 \
          --add-metadata \
          --write-thumbnail \
          --convert-thumbnail jpg \
          --sponsorblock-mark "default" \
          ${
            optionalString (
              sponsorBlockCategories != [ ]
            ) "--sponsorblock-remove ${concatStringsSep "," sponsorBlockCategories}"
          } \
          ${optionalString breakOnExisting "--break-on-existing"} \
          "${url}" || true
    '';

in
{

  systemd.services.youtube = {
    after = [ "network.target" ];
    path = [ pkgs.yt-dlp ];
    serviceConfig = {
      User = "media";
      Group = "media";
    };
    script = (concatStringsSep "\n" (mapAttrsToList downloadScript configuration));
  };

  systemd.timers.youtube = {
    enable = true;
    wantedBy = [ "multi-user.target" ];
    timerConfig = {
      OnCalendar = "daily";
      Persistent = "true";
    };
  };

}