nixos-config/nixos/machines/chungus/media-youtube.nix
2023-08-04 03:07:23 +02:00

182 lines
6.4 KiB
Nix

{ 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";
};
# 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";
};
};
}