202 lines
7.4 KiB
Nix
202 lines
7.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";
|
|
};
|
|
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";
|
|
};
|
|
};
|
|
|
|
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";
|
|
};
|
|
};
|
|
|
|
}
|