Add media notifications

Signed-off-by: Nikolaos Karaolidis <nick@karaolidis.com>
This commit is contained in:
2025-09-15 16:36:49 +01:00
parent 4cd670bb27
commit f72943c905
11 changed files with 137 additions and 17 deletions

8
flake.lock generated
View File

@@ -511,11 +511,11 @@
"secrets": { "secrets": {
"flake": false, "flake": false,
"locked": { "locked": {
"lastModified": 1757935242, "lastModified": 1757947569,
"narHash": "sha256-es2Uy3QsHtQieTpqSGtU7AePvxkJdLuwla9DcRTbQn4=", "narHash": "sha256-Rm49tH43PW0RVVaW1mjDGwLa4lWgZ35om+LhoD1Y7KM=",
"ref": "refs/heads/main", "ref": "refs/heads/main",
"rev": "4da39113b1b5496b4351a3594c0f6efdbf0a7acf", "rev": "478bf9001cf08c6e1c2111c3deb722f50adda634",
"revCount": 44, "revCount": 45,
"type": "git", "type": "git",
"url": "ssh://git@karaolidis.com/karaolidis/nix-secrets.git" "url": "ssh://git@karaolidis.com/karaolidis/nix-secrets.git"
}, },

View File

@@ -1,5 +1,5 @@
{ user, home }: { user, home }:
{ config, ... }: { config, inputs, ... }:
let let
hmConfig = config.home-manager.users.${user}; hmConfig = config.home-manager.users.${user};
@@ -56,6 +56,8 @@ in
"d /mnt/storage/private/storm/containers/storage/volumes/media/_data/libraries/anime/shows 755 storm storm" "d /mnt/storage/private/storm/containers/storage/volumes/media/_data/libraries/anime/shows 755 storm storm"
]; ];
sops.secrets."ntfy/tokens/jupiter/media".sopsFile = "${inputs.secrets}/hosts/jupiter/secrets.yaml";
virtualisation.quadlet.networks.media = { }; virtualisation.quadlet.networks.media = { };
}; };
} }

View File

@@ -81,7 +81,8 @@ in
public.initialized = true; public.initialized = true;
notifications.agents.email = { notifications.agents = {
email = {
enabled = true; enabled = true;
options = { options = {
emailFrom = "jupiter@karaolidis.com"; emailFrom = "jupiter@karaolidis.com";
@@ -93,6 +94,20 @@ in
}; };
}; };
ntfy = {
enabled = true;
embedPoster = true;
types = 2970;
options = {
url = "https://ntfy.karaolidis.com";
topic = "media";
authMethodUsernamePassword = false;
authMethodToken = true;
token = hmConfig.sops.placeholder."ntfy/tokens/jupiter/media";
};
};
};
network.trustProxy = true; network.trustProxy = true;
} }
); );

View File

@@ -23,6 +23,7 @@ in
templates = { templates = {
prowlarr-env.content = '' prowlarr-env.content = ''
API_KEY=${hmConfig.sops.placeholder."prowlarr/apiKey"} API_KEY=${hmConfig.sops.placeholder."prowlarr/apiKey"}
NTFY_TOKEN=${hmConfig.sops.placeholder."ntfy/tokens/jupiter/media"}
''; '';
} }
// builtins.listToAttrs ( // builtins.listToAttrs (

View File

@@ -205,8 +205,34 @@ build_cardigann_indexer_payload() {
' '
} }
build_ntfy_payload() {
cat <<-EOF
{
"onGrab": false,
"onHealthIssue": true,
"onHealthRestored": true,
"onApplicationUpdate": false,
"includeManualGrabs": false,
"includeHealthWarnings": false,
"name": "ntfy.sh",
"fields": [
{ "name": "serverUrl", "value": "https://ntfy.karaolidis.com" },
{ "name": "accessToken", "value": "$NTFY_TOKEN" },
{ "name": "topics", "value": "media" },
{ "name": "priority", "value": 3 },
{ "name": "tags", "value": "satellite" },
],
"implementation": "Ntfy",
"configContract": "NtfySettings"
}
EOF
}
wait_for_api wait_for_api
try_forever upsert_resource "notification" "name" "ntfy.sh" "$(build_ntfy_payload)"
prune_resources "notification" "name" "ntfy.sh"
try_forever upsert_resource "downloadclient" "name" "Transmission" "$(build_transmission_payload)" try_forever upsert_resource "downloadclient" "name" "Transmission" "$(build_transmission_payload)"
prune_resources "downloadclient" "name" "Transmission" prune_resources "downloadclient" "name" "Transmission"

View File

@@ -28,6 +28,7 @@ in
name = "${radarr.hostName}-env"; name = "${radarr.hostName}-env";
value.content = '' value.content = ''
API_KEY=${hmConfig.sops.placeholder."${radarr.hostName}/apiKey"} API_KEY=${hmConfig.sops.placeholder."${radarr.hostName}/apiKey"}
NTFY_TOKEN=${hmConfig.sops.placeholder."ntfy/tokens/jupiter/media"}
''; '';
}) radarrs }) radarrs
); );

View File

@@ -146,8 +146,41 @@ build_rootfolder_payload() {
EOF EOF
} }
build_ntfy_payload() {
cat <<-EOF
{
"onGrab": true,
"onDownload": true,
"onUpgrade": true,
"onRename": false,
"onMovieAdded": true,
"onMovieDelete": true,
"onMovieFileDelete": true,
"onMovieFileDeleteForUpgrade": false,
"onHealthIssue": true,
"includeHealthWarnings": false,
"onHealthRestored": true,
"onApplicationUpdate": false,
"onManualInteractionRequired": true,
"name": "ntfy.sh",
"fields": [
{ "name": "serverUrl", "value": "https://ntfy.karaolidis.com" },
{ "name": "accessToken", "value": "$NTFY_TOKEN" },
{ "name": "priority", "value": 2 },
{ "name": "topics", "value": ["media"] },
{ "name": "tags", "value": ["clapper"] }
],
"implementation": "Ntfy",
"configContract": "NtfySettings"
}
EOF
}
wait_for_api wait_for_api
try_forever upsert_resource "notification" "name" "ntfy.sh" "$(build_ntfy_payload)"
prune_resources "notification" "name" "ntfy.sh"
if [ -n "$ROOT_FOLDER" ]; then if [ -n "$ROOT_FOLDER" ]; then
insert_or_skip_resource "rootfolder" "path" "$ROOT_FOLDER" "$(build_rootfolder_payload)" insert_or_skip_resource "rootfolder" "path" "$ROOT_FOLDER" "$(build_rootfolder_payload)"
prune_resources "rootfolder" "path" "$ROOT_FOLDER" prune_resources "rootfolder" "path" "$ROOT_FOLDER"

View File

@@ -28,6 +28,7 @@ in
name = "${sonarr.hostName}-env"; name = "${sonarr.hostName}-env";
value.content = '' value.content = ''
API_KEY=${hmConfig.sops.placeholder."${sonarr.hostName}/apiKey"} API_KEY=${hmConfig.sops.placeholder."${sonarr.hostName}/apiKey"}
NTFY_TOKEN=${hmConfig.sops.placeholder."ntfy/tokens/jupiter/media"}
''; '';
}) sonarrs }) sonarrs
); );

View File

@@ -146,8 +146,42 @@ build_rootfolder_payload() {
EOF EOF
} }
build_ntfy_payload() {
cat <<-EOF
{
"onGrab": true,
"onDownload": true,
"onUpgrade": true,
"onImportComplete": false,
"onRename": false,
"onSeriesAdd": true,
"onSeriesDelete": true,
"onEpisodeFileDelete": true,
"onEpisodeFileDeleteForUpgrade": false,
"onHealthIssue": true,
"includeHealthWarnings": false,
"onHealthRestored": true,
"onApplicationUpdate": false,
"onManualInteractionRequired": true,
"name": "ntfy.sh",
"fields": [
{ "name": "serverUrl", "value": "https://ntfy.karaolidis.com" },
{ "name": "accessToken", "value": "$NTFY_TOKEN" },
{ "name": "priority", "value": 2 },
{ "name": "topics", "value": ["media"] },
{ "name": "tags", "value": ["tv"] }
],
"implementation": "Ntfy",
"configContract": "NtfySettings"
}
EOF
}
wait_for_api wait_for_api
try_forever upsert_resource "notification" "name" "ntfy.sh" "$(build_ntfy_payload)"
prune_resources "notification" "name" "ntfy.sh"
if [ -n "$ROOT_FOLDER" ]; then if [ -n "$ROOT_FOLDER" ]; then
insert_or_skip_resource "rootfolder" "path" "$ROOT_FOLDER" "$(build_rootfolder_payload)" insert_or_skip_resource "rootfolder" "path" "$ROOT_FOLDER" "$(build_rootfolder_payload)"
prune_resources "rootfolder" "path" "$ROOT_FOLDER" prune_resources "rootfolder" "path" "$ROOT_FOLDER"

View File

@@ -19,6 +19,7 @@ in
"ntfy/users/karaolidis".sopsFile = "${inputs.secrets}/hosts/jupiter/secrets.yaml"; "ntfy/users/karaolidis".sopsFile = "${inputs.secrets}/hosts/jupiter/secrets.yaml";
"ntfy/users/jupiter".sopsFile = "${inputs.secrets}/hosts/jupiter/secrets.yaml"; "ntfy/users/jupiter".sopsFile = "${inputs.secrets}/hosts/jupiter/secrets.yaml";
"ntfy/tokens/jupiter/grafana".sopsFile = "${inputs.secrets}/hosts/jupiter/secrets.yaml"; "ntfy/tokens/jupiter/grafana".sopsFile = "${inputs.secrets}/hosts/jupiter/secrets.yaml";
"ntfy/tokens/jupiter/media".sopsFile = "${inputs.secrets}/hosts/jupiter/secrets.yaml";
}; };
templates = { templates = {
@@ -50,9 +51,15 @@ in
"karaolidis:${hmConfig.sops.placeholder."ntfy/users/karaolidis"}:admin" "karaolidis:${hmConfig.sops.placeholder."ntfy/users/karaolidis"}:admin"
]; ];
auth-access = [ "jupiter:grafana:wo" ]; auth-access = [
"jupiter:grafana:wo"
"jupiter:media:wo"
];
auth-tokens = [ "jupiter:${hmConfig.sops.placeholder."ntfy/tokens/jupiter/grafana"}" ]; auth-tokens = [
"jupiter:${hmConfig.sops.placeholder."ntfy/tokens/jupiter/grafana"}"
"jupiter:${hmConfig.sops.placeholder."ntfy/tokens/jupiter/media"}"
];
behind-proxy = true; behind-proxy = true;