Compare commits
4 Commits
ae6915c204
...
288a90f366
| Author | SHA1 | Date | |
|---|---|---|---|
|
288a90f366
|
|||
|
de089f8f64
|
|||
|
5548b9e280
|
|||
|
e77a6cbfcf
|
@@ -6,121 +6,117 @@
|
|||||||
...
|
...
|
||||||
}:
|
}:
|
||||||
let
|
let
|
||||||
radarrPort = builtins.toString service_configs.ports.radarr;
|
configTemplate = (pkgs.formats.yaml {}).generate "recyclarr.yml" {
|
||||||
sonarrPort = builtins.toString service_configs.ports.sonarr;
|
radarr.movies = {
|
||||||
|
base_url = "http://localhost:${builtins.toString service_configs.ports.radarr}";
|
||||||
|
api_key = "RADARR_API_KEY_PLACEHOLDER";
|
||||||
|
|
||||||
configTemplate = pkgs.writeText "recyclarr.yml" ''
|
include = [
|
||||||
radarr:
|
{ template = "radarr-quality-definition-movie"; }
|
||||||
movies:
|
{ template = "radarr-quality-profile-remux-web-2160p"; }
|
||||||
base_url: http://localhost:${radarrPort}
|
{ template = "radarr-custom-formats-remux-web-2160p"; }
|
||||||
api_key: RADARR_API_KEY_PLACEHOLDER
|
];
|
||||||
|
|
||||||
include:
|
quality_profiles = [{
|
||||||
- template: radarr-quality-definition-movie
|
name = "Remux + WEB 2160p";
|
||||||
- template: radarr-quality-profile-remux-web-2160p
|
upgrade = {
|
||||||
- template: radarr-custom-formats-remux-web-2160p
|
allowed = true;
|
||||||
|
until_quality = "Remux-2160p";
|
||||||
|
};
|
||||||
|
qualities = [
|
||||||
|
{ name = "Remux-2160p"; }
|
||||||
|
{
|
||||||
|
name = "WEB 2160p";
|
||||||
|
qualities = [ "WEBDL-2160p" "WEBRip-2160p" ];
|
||||||
|
}
|
||||||
|
{ name = "Remux-1080p"; }
|
||||||
|
{ name = "Bluray-1080p"; }
|
||||||
|
{
|
||||||
|
name = "WEB 1080p";
|
||||||
|
qualities = [ "WEBDL-1080p" "WEBRip-1080p" ];
|
||||||
|
}
|
||||||
|
{ name = "HDTV-1080p"; }
|
||||||
|
];
|
||||||
|
}];
|
||||||
|
|
||||||
# Override template to also allow 1080p (2160p still prioritized via cutoff)
|
custom_formats = [
|
||||||
quality_profiles:
|
# Upscaled
|
||||||
- name: Remux + WEB 2160p
|
{
|
||||||
upgrade:
|
trash_ids = [ "bfd8eb01832d646a0a89c4deb46f8564" ];
|
||||||
allowed: true
|
assign_scores_to = [{ name = "Remux + WEB 2160p"; score = -10000; }];
|
||||||
until_quality: Remux-2160p
|
}
|
||||||
qualities:
|
# x265 (HD) - override template -10000 penalty
|
||||||
- name: Remux-2160p
|
{
|
||||||
- name: WEB 2160p
|
trash_ids = [ "dc98083864ea246d05a42df0d05f81cc" ];
|
||||||
qualities:
|
assign_scores_to = [{ name = "Remux + WEB 2160p"; score = 0; }];
|
||||||
- WEBDL-2160p
|
}
|
||||||
- WEBRip-2160p
|
# x265 (no HDR/DV) - override template -10000 penalty
|
||||||
- name: Remux-1080p
|
{
|
||||||
- name: Bluray-1080p
|
trash_ids = [ "839bea857ed2c0a8e084f3cbdbd65ecb" ];
|
||||||
- name: WEB 1080p
|
assign_scores_to = [{ name = "Remux + WEB 2160p"; score = 0; }];
|
||||||
qualities:
|
}
|
||||||
- WEBDL-1080p
|
];
|
||||||
- WEBRip-1080p
|
};
|
||||||
- name: HDTV-1080p
|
|
||||||
|
|
||||||
custom_formats:
|
sonarr.series = {
|
||||||
- trash_ids:
|
base_url = "http://localhost:${builtins.toString service_configs.ports.sonarr}";
|
||||||
- bfd8eb01832d646a0a89c4deb46f8564 # Upscaled
|
api_key = "SONARR_API_KEY_PLACEHOLDER";
|
||||||
assign_scores_to:
|
|
||||||
- name: Remux + WEB 2160p
|
|
||||||
score: -10000
|
|
||||||
# Codec preferences: allow x265/HEVC (override template -10000 penalties)
|
|
||||||
- trash_ids:
|
|
||||||
- dc98083864ea246d05a42df0d05f81cc # x265 (HD)
|
|
||||||
assign_scores_to:
|
|
||||||
- name: Remux + WEB 2160p
|
|
||||||
score: 0
|
|
||||||
- trash_ids:
|
|
||||||
- 839bea857ed2c0a8e084f3cbdbd65ecb # x265 (no HDR/DV)
|
|
||||||
assign_scores_to:
|
|
||||||
- name: Remux + WEB 2160p
|
|
||||||
score: 0
|
|
||||||
- trash_ids:
|
|
||||||
- cae4ca30163749b891686f95532519bd # AV1
|
|
||||||
assign_scores_to:
|
|
||||||
- name: Remux + WEB 2160p
|
|
||||||
score: 0
|
|
||||||
|
|
||||||
sonarr:
|
include = [
|
||||||
series:
|
{ template = "sonarr-quality-definition-series"; }
|
||||||
base_url: http://localhost:${sonarrPort}
|
{ template = "sonarr-v4-quality-profile-web-2160p"; }
|
||||||
api_key: SONARR_API_KEY_PLACEHOLDER
|
{ template = "sonarr-v4-custom-formats-web-2160p"; }
|
||||||
|
];
|
||||||
|
|
||||||
include:
|
quality_profiles = [{
|
||||||
- template: sonarr-quality-definition-series
|
name = "WEB-2160p";
|
||||||
- template: sonarr-v4-quality-profile-web-2160p
|
upgrade = {
|
||||||
- template: sonarr-v4-custom-formats-web-2160p
|
allowed = true;
|
||||||
|
until_quality = "WEB 2160p";
|
||||||
|
};
|
||||||
|
qualities = [
|
||||||
|
{
|
||||||
|
name = "WEB 2160p";
|
||||||
|
qualities = [ "WEBDL-2160p" "WEBRip-2160p" ];
|
||||||
|
}
|
||||||
|
{ name = "Bluray-1080p Remux"; }
|
||||||
|
{ name = "Bluray-1080p"; }
|
||||||
|
{
|
||||||
|
name = "WEB 1080p";
|
||||||
|
qualities = [ "WEBDL-1080p" "WEBRip-1080p" ];
|
||||||
|
}
|
||||||
|
{ name = "HDTV-1080p"; }
|
||||||
|
];
|
||||||
|
}];
|
||||||
|
|
||||||
# Override template to also allow 1080p (2160p still prioritized via cutoff)
|
custom_formats = [
|
||||||
quality_profiles:
|
# Upscaled
|
||||||
- name: WEB-2160p
|
{
|
||||||
upgrade:
|
trash_ids = [ "23297a736ca77c0fc8e70f8edd7ee56c" ];
|
||||||
allowed: true
|
assign_scores_to = [{ name = "WEB-2160p"; score = -10000; }];
|
||||||
until_quality: WEB 2160p
|
}
|
||||||
qualities:
|
# x265 (HD) - override template -10000 penalty
|
||||||
- name: WEB 2160p
|
{
|
||||||
qualities:
|
trash_ids = [ "47435ece6b99a0b477caf360e79ba0bb" ];
|
||||||
- WEBDL-2160p
|
assign_scores_to = [{ name = "WEB-2160p"; score = 0; }];
|
||||||
- WEBRip-2160p
|
}
|
||||||
- name: Bluray-1080p Remux
|
# x265 (no HDR/DV) - override template -10000 penalty
|
||||||
- name: Bluray-1080p
|
{
|
||||||
- name: WEB 1080p
|
trash_ids = [ "9b64dff695c2115facf1b6ea59c9bd07" ];
|
||||||
qualities:
|
assign_scores_to = [{ name = "WEB-2160p"; score = 0; }];
|
||||||
- WEBDL-1080p
|
}
|
||||||
- WEBRip-1080p
|
];
|
||||||
- name: HDTV-1080p
|
};
|
||||||
|
};
|
||||||
custom_formats:
|
|
||||||
- trash_ids:
|
|
||||||
- 23297a736ca77c0fc8e70f8edd7ee56c # Upscaled
|
|
||||||
assign_scores_to:
|
|
||||||
- name: WEB-2160p
|
|
||||||
score: -10000
|
|
||||||
# Codec preferences: allow x265/HEVC (override template -10000 penalties)
|
|
||||||
- trash_ids:
|
|
||||||
- 47435ece6b99a0b477caf360e79ba0bb # x265 (HD)
|
|
||||||
assign_scores_to:
|
|
||||||
- name: WEB-2160p
|
|
||||||
score: 0
|
|
||||||
- trash_ids:
|
|
||||||
- 9b64dff695c2115facf1b6ea59c9bd07 # x265 (no HDR/DV)
|
|
||||||
assign_scores_to:
|
|
||||||
- name: WEB-2160p
|
|
||||||
score: 0
|
|
||||||
- trash_ids:
|
|
||||||
- 15a05bc7c1a36e2b57fd628f8977e2fc # AV1
|
|
||||||
assign_scores_to:
|
|
||||||
- name: WEB-2160p
|
|
||||||
score: 0
|
|
||||||
'';
|
|
||||||
|
|
||||||
dataDir = service_configs.recyclarr.dataDir;
|
dataDir = service_configs.recyclarr.dataDir;
|
||||||
radarrConfig = "${service_configs.radarr.dataDir}/config.xml";
|
radarrConfig = "${service_configs.radarr.dataDir}/config.xml";
|
||||||
sonarrConfig = "${service_configs.sonarr.dataDir}/config.xml";
|
sonarrConfig = "${service_configs.sonarr.dataDir}/config.xml";
|
||||||
|
|
||||||
# Script to inject API keys from sonarr/radarr config.xml at runtime
|
user = "recyclarr";
|
||||||
|
group = "recyclarr";
|
||||||
|
|
||||||
|
# Runs as root (via + prefix) to read API keys from config.xml, then chowns output
|
||||||
generateConfig = pkgs.writeShellScript "recyclarr-generate-config" ''
|
generateConfig = pkgs.writeShellScript "recyclarr-generate-config" ''
|
||||||
RADARR_KEY=$(${pkgs.gnugrep}/bin/grep -oP '(?<=<ApiKey>)[^<]+' ${radarrConfig})
|
RADARR_KEY=$(${pkgs.gnugrep}/bin/grep -oP '(?<=<ApiKey>)[^<]+' ${radarrConfig})
|
||||||
SONARR_KEY=$(${pkgs.gnugrep}/bin/grep -oP '(?<=<ApiKey>)[^<]+' ${sonarrConfig})
|
SONARR_KEY=$(${pkgs.gnugrep}/bin/grep -oP '(?<=<ApiKey>)[^<]+' ${sonarrConfig})
|
||||||
@@ -128,6 +124,7 @@ let
|
|||||||
-e "s/RADARR_API_KEY_PLACEHOLDER/$RADARR_KEY/" \
|
-e "s/RADARR_API_KEY_PLACEHOLDER/$RADARR_KEY/" \
|
||||||
-e "s/SONARR_API_KEY_PLACEHOLDER/$SONARR_KEY/" \
|
-e "s/SONARR_API_KEY_PLACEHOLDER/$SONARR_KEY/" \
|
||||||
${configTemplate} > ${dataDir}/recyclarr.yml
|
${configTemplate} > ${dataDir}/recyclarr.yml
|
||||||
|
chown ${user}:${group} ${dataDir}/recyclarr.yml
|
||||||
'';
|
'';
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
@@ -138,8 +135,8 @@ in
|
|||||||
];
|
];
|
||||||
|
|
||||||
systemd.tmpfiles.rules = [
|
systemd.tmpfiles.rules = [
|
||||||
"d ${dataDir} 0755 root root -"
|
"d ${dataDir} 0755 ${user} ${group} -"
|
||||||
"d ${dataDir}/data 0755 root root -"
|
"d ${dataDir}/data 0755 ${user} ${group} -"
|
||||||
];
|
];
|
||||||
|
|
||||||
systemd.services.recyclarr = {
|
systemd.services.recyclarr = {
|
||||||
@@ -148,11 +145,21 @@ in
|
|||||||
wants = [ "network-online.target" ];
|
wants = [ "network-online.target" ];
|
||||||
serviceConfig = {
|
serviceConfig = {
|
||||||
Type = "oneshot";
|
Type = "oneshot";
|
||||||
ExecStartPre = "${generateConfig}";
|
User = user;
|
||||||
ExecStart = "${pkgs.recyclarr}/bin/recyclarr sync --config ${dataDir}/recyclarr.yml --app-data ${dataDir}/data";
|
Group = group;
|
||||||
|
ExecStartPre = "+${generateConfig}";
|
||||||
|
ExecStart = "${lib.getExe pkgs.recyclarr} sync --config ${dataDir}/recyclarr.yml --app-data ${dataDir}/data";
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
users.users.${user} = {
|
||||||
|
isSystemUser = true;
|
||||||
|
group = group;
|
||||||
|
home = dataDir;
|
||||||
|
};
|
||||||
|
|
||||||
|
users.groups.${group} = {};
|
||||||
|
|
||||||
systemd.timers.recyclarr = {
|
systemd.timers.recyclarr = {
|
||||||
description = "Run Recyclarr daily";
|
description = "Run Recyclarr daily";
|
||||||
wantedBy = [ "timers.target" ];
|
wantedBy = [ "timers.target" ];
|
||||||
|
|||||||
Reference in New Issue
Block a user