{ 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"; }; # 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"; }; # 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"; }; }; downloadScript = name: { url , target , output , sponsorBlockCategories ? [ "default" ] , notOlderThan ? "" # e.g: 1week , breakOnExisting ? true }: pkgs.writers.writeDash "download-script-${name}" '' mkdir -p "${target}" yt-dlp \ --no-abort-on-error \ --no-mark-watched \ --continue \ ${optionalString (notOlderThan != "") "--dateafter now-${notOlderThan}" } \ --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"; }; }; }