From ea37aee1f93e9cebaa603736194f3425eb49bdd2 Mon Sep 17 00:00:00 2001 From: Giulio De Pasquale Date: Thu, 10 Jul 2025 16:09:31 +0100 Subject: [PATCH] fix: navidrome --- hosts/architect/default.nix | 9 ++ hosts/architect/navidrome.nix | 83 ----------------- modules/services/navidrome/default.nix | 118 +++++++++++++++++++++---- secrets/discogs.age | Bin 0 -> 1504 bytes secrets/lastfm-key.age | 28 ++++++ secrets/lastfm-secret.age | 27 ++++++ secrets/secrets.nix | 5 ++ secrets/spotify-id.age | 27 ++++++ secrets/spotify-secret.age | 27 ++++++ 9 files changed, 225 insertions(+), 99 deletions(-) delete mode 100644 hosts/architect/navidrome.nix create mode 100644 secrets/discogs.age create mode 100644 secrets/lastfm-key.age create mode 100644 secrets/lastfm-secret.age create mode 100644 secrets/spotify-id.age create mode 100644 secrets/spotify-secret.age diff --git a/hosts/architect/default.nix b/hosts/architect/default.nix index 1090cdf..003416f 100644 --- a/hosts/architect/default.nix +++ b/hosts/architect/default.nix @@ -269,6 +269,15 @@ in log.level = "debug"; }; }; + + navidrome = { + enable = true; + domain = "music.giugl.io"; + package = pkgs.unstablePkgs.navidrome; + + enableBeets = true; + beetsPackage = pkgs.unstablePkgs.beets; + }; }; }; } diff --git a/hosts/architect/navidrome.nix b/hosts/architect/navidrome.nix deleted file mode 100644 index 4a24873..0000000 --- a/hosts/architect/navidrome.nix +++ /dev/null @@ -1,83 +0,0 @@ -{ config, lib, pkgs, ... }: - -let - domain = "music.giugl.io"; - library_path = "/media/Music"; - beets_config = "/media/beets.conf"; -in -{ - services.navidrome = { - enable = true; - - settings = { - MusicFolder = library_path; - LastFM.enable = true; - LastFM.ApiKey = "5cef5cb5f9d31326b97d0f929ca9cf20"; - LastFM.Secret = "d1296896126f4caae47407aecf080b25"; - Spotify.ID = "3900c029b4f34f3fb61d554dda64794d"; - Spotify.Secret = "d931ce5575a9401aa5ff8d37558cca0a"; - EnableGravatar = true; - LogLevel = "WARN"; - }; - }; - - architect.vhost.${domain} = { - dnsInterfaces = [ "lan" "tailscale" ]; - locations."/" = { - port = 4533; - allowLan = true; - allowWAN = true; - # allow = [ config.architect.networks."tailscale".net ]; - }; - }; - - systemd.services = { - "beets-update" = { - enable = true; - # requires = [ "remove-badmp3.service" "remove-badflac.service" ]; - before = [ "beets-import.service" ]; - serviceConfig = { - Type = "oneshot"; - ExecStart = "${pkgs.beets}/bin/beet -c ${beets_config} update"; - }; - }; - - "beets-import" = { - enable = true; - path = [ pkgs.imagemagick ]; - requires = [ "beets-update.service" ]; - after = [ "beets-update.service" ]; - serviceConfig = { - Type = "oneshot"; - ExecStart = - "${pkgs.beets}/bin/beet -c ${beets_config} import --flat -q ${library_path}"; - }; - startAt = "weekly"; - }; - }; - - # "remove-badmp3" = { - # enable = true; - # before = [ "beets-import.service" "beets-update.service" ]; - # serviceConfig = { - # Type = "oneshot"; - # ExecStart = '' - # ${pkgs.findutils}/bin/find ${library_path} -name "*.mp3" -type f -exec ${pkgs.bash}/bin/sh -c '${pkgs.mp3val}/bin/mp3val "{}" | grep -Pi error 1>/dev/null && ${pkgs.busybox}/bin/rm "{}"' \; - # ''; - # }; - # }; - - # "remove-badflac" = { - # enable = true; - # before = [ "beets-import.service" "beets-update.service" ]; - # serviceConfig = { - # Type = "oneshot"; - # ExecStart = '' - # ${pkgs.findutils}/bin/find ${library_path} -name "*.flac" -type f -exec ${pkgs.bash}/bin/sh -c '${pkgs.flac}/bin/flac -st "{}" || ${pkgs.busybox}/bin/rm "{}"' \; - # ''; - # }; - # }; - # }; - - users.groups.media.members = [ "navidrome" ]; -} diff --git a/modules/services/navidrome/default.nix b/modules/services/navidrome/default.nix index 50a6208..f80147d 100644 --- a/modules/services/navidrome/default.nix +++ b/modules/services/navidrome/default.nix @@ -4,11 +4,82 @@ let inherit (lib) mkIf; cfg = config.pepe.services.navidrome; + + beetsConfigTemplate = pkgs.writeText "beets.conf.template" '' + directory: ${cfg.musicFolder} + plugins: embedart fetchart scrub lastgenre chroma + + import: + write: yes + move: yes + incremental: yes + from_scratch: yes + group_albums: yes + log: ${cfg.musicFolder}/beets.log + original_date: yes + discogs: + user_token: "__DISCOGS_TOKEN__" + paths: + default: $albumartist/$album ($original_year)/$track - $title + singleton: $artist/singles/$title + match: + strong_rec_thresh: 0.20 + musicbrainz: + extra_tags: [year] + lastfm: + user: peperunas + api_key: "__LASTFM_KEY__" + embedart: + auto: yes + fetchart: + auto: yes + lastfmkey: "__LASTFM_KEY__" + enforce_ratio: 0.5% + scrub: + auto: yes + lastgenre: + auto: yes + count: 5 + min_weight: 10 + prefer_specific: yes + force: yes + chroma: + auto: yes + ''; + + preStartBeetsDecrypt = '' + set -eu + sed \ + -e "s|__DISCOGS_TOKEN__|$(cat ${config.age.secrets.discogs.path})|g" \ + -e "s|__LASTFM_KEY__|$(cat ${config.age.secrets.lastfmKey.path})|g" \ + ${beetsConfigTemplate} > /run/beets.conf + ''; + + navidromeWrapped = pkgs.writeShellScriptBin "navidrome-wrapped" '' + set -eu + + ${preStartNavidromeDecrypt} + + exec ${cfg.package}/bin/navidrome "$@" + ''; + + preStartNavidromeDecrypt = '' + set -eu + + # export ND_LASTFM_APIKEY=$(cat ${config.age.secrets.lastfmKey.path}) + # export ND_LASTFM_SECRET=$(cat ${config.age.secrets.lastfmSecret.path}) + # export ND_SPOTIFY_ID=$(cat ${config.age.secrets.spotifyID.path}) + # export ND_SPOTIFY_SECRET=$(cat ${config.age.secrets.spotifySecret.path}) + ''; in { options.pepe.services.navidrome = with lib; { enable = mkEnableOption "Enable navidrome"; + enableBeets = mkEnableOption "Enable beets"; + package = mkPackageOption pkgs "navidrome" { }; + beetsPackage = mkPackageOption pkgs "beets" { }; + domain = mkOption { type = types.str; default = null; @@ -18,14 +89,9 @@ in default = "/media/Music"; description = "Path to the music library"; }; - beetsConfig = mkOption { - type = types.str; - default = "/media/beets.conf"; - description = "Path to the beets configuration file"; - }; settings = mkOption { type = types.attrs; - default = {}; + default = { }; description = "Additional settings for Navidrome"; }; }; @@ -33,36 +99,56 @@ in config = mkIf cfg.enable { services.navidrome = { enable = true; - package = cfg.package; + package = navidromeWrapped; settings = { MusicFolder = cfg.musicFolder; LastFM.enable = true; - LastFM.ApiKey = "5cef5cb5f9d31326b97d0f929ca9cf20"; - LastFM.Secret = "d1296896126f4caae47407aecf080b25"; - Spotify.ID = "3900c029b4f34f3fb61d554dda64794d"; - Spotify.Secret = "d931ce5575a9401aa5ff8d37558cca0a"; EnableGravatar = true; LogLevel = "WARN"; } // cfg.settings; }; - pepe.core.vhost.hosts.${cfg.domain} = with config.pepe.core.network; { - dnsInterfaces = [ interfaceTypes.lan interfaceTypes.vpn ]; + pepe.core.vhost.hosts.${cfg.domain} = { locations."/" = { - port = 4533; + port = config.services.navidrome.settings.Port; allowLAN = true; allowVPN = true; allowWAN = true; }; }; + age.secrets = { + discogs = mkIf cfg.enableBeets { + file = ../../../secrets/discogs.age; + }; + + lastfmKey = { + file = ../../../secrets/lastfm-key.age; + }; + + lastfmSecret = { + file = ../../../secrets/lastfm-key.age; + }; + + spotifyID = { + file = ../../../secrets/spotify-id.age; + }; + + spotifySecret = { + file = ../../../secrets/spotify-secret.age; + }; + }; + systemd.services = { + "navidrome".preStart = preStartNavidromeDecrypt; + } // mkIf cfg.enableBeets { "beets-update" = { enable = true; + preStart = preStartBeetsDecrypt; before = [ "beets-import.service" ]; serviceConfig = { Type = "oneshot"; - ExecStart = "${pkgs.beets}/bin/beet -c ${cfg.beetsConfig} update"; + ExecStart = "${cfg.beetsPackage}/bin/beet -c /run/beets.conf update"; }; }; @@ -73,7 +159,7 @@ in after = [ "beets-update.service" ]; serviceConfig = { Type = "oneshot"; - ExecStart = "${pkgs.beets}/bin/beet -c ${cfg.beetsConfig} import --flat -q ${cfg.musicFolder}"; + ExecStart = "${cfg.beetsPackage}/bin/beet -c /run/beets.conf import --flat -q ${cfg.musicFolder}"; }; startAt = "weekly"; }; diff --git a/secrets/discogs.age b/secrets/discogs.age new file mode 100644 index 0000000000000000000000000000000000000000..a3df4c193955096a3aef35a6778a47dd38d1289d GIT binary patch literal 1504 zcmYdHPt{G$OD?J`D9Oyv)5|YP*Do{V(zR14F3!*`Do#`gjEG9fFXsw!_sKUaE-TJ) zwoEb34==XxGcEKBweZM{2r4v53wQB$j4(~AEC@&`bIT444=E}4F;7nM3Cpfb4v+MA zP7dXYFi-a}3d>1L_jJ?tNHxgz_6Q0!^D`?qbxR7Vigc_DHwiTi3dxIz%nPqd@$_>q z3ULn1HYjs(smS-tPjw39^7l(iD-JFz@r%eU&-BPEDGLowG|jXKFRn1F%yQLtPBPBb z_De1^D{w4M$t4hx zGtLY#jmURTH!mynH+A$2G%oQn@{6jh$PNm~NYgLP^vN|hwG8pB3gasFFUjyM&ULeJ zkIYL7&n(g}2}|=d@U=|I_Ab^o&nz@6%`7o-GE4U=bn~!Ca`P}xb9V{LN;Qqlw)70h z3<%+>^7Sh9Dz5a&EcOUAvk0j&OY+S2&2}qyEX=Sp^h{6p^9U+&b_+G|tMDn03U<~` zOU*Cx^r$o{&^9pg$cv2Nat+MTE_F3_iHP#a()Tbocg!+13o>OfU6FHHgTn3JQt}4a&>Uv2czw=kjuKa}IX(jI;VDoqSXbN8zVGR-nKb_&Tg zv@9?*s5E!-bqX$a(a(tFs&tGfF!M1DG0w|$4)!bb&WWf@@e#Tp!oKqTr|`&(w;1 zkI*Qm+zO|#@{nZH$|7f1u4FTdki^hP6E~AU*IZ-6WS`0;6Yug&qXLseQ{TWai=RE0Uk?j{0<>p~p9Bfz`>f`B_l%^k<80em6Qt0ay z6scX{6KP~vXyD=I7?4$(q@R*7)z5$5IWk>#gdlJ6F!9j0AblI@abQDm4L%oP+_=pW#t zpPTRI9Oaj1Y7}0TpRb+kR1xf-5t{6t;_PYZ5}Xy0m|t8T?2~61o*W$ImFgLgX>6Hq zSZNYsSj82dVd-R46zY)|n(U|@mgMV_6PXuP;8SK6R+^uho}QLx=@pS5Sm_<+TWsJ| z7#^-|tZkZ^n3LsMo*z_ZXjaH&qVH7TR2bpuW07d?T^XKeo>8eE6qHvL=QeEl~mxC;~W@NUYY3ZRZ!u~l~i099Of39Y~U1G6yTib<{IVe z=vV6Nq#fbr>+0iT;uGnT?-P`nAE@tDl9&^gR2*fXUy>W(o9=FGTu>fr&gC8I>uq3O z>EvHl;AUE?ZDiu?Z{cZLXi@4`m>C%2QITIzTAu0{;FD(=km?i`T4|Kw6J(NIk(yW) znimoo5y(}P5}p)l=2%>jsjZ*lpX+QHl^miSWe^(T9ii>x?ok-wW zWn>U)<`@`I;2hyrm}VA`ZCuL5rK_u};N%e;R#s4MR^;icZ;=(1Yh;jN?qOz6y{l!tzD9u?-A+AB|o$8+nrgrqmNv@z4n(l!{4l?1MDd;3f6>KUq{Fme=xeLe-7`Tji_VXU0zcd=vn8q5Mh! literal 0 HcmV?d00001 diff --git a/secrets/lastfm-key.age b/secrets/lastfm-key.age new file mode 100644 index 0000000..04d8bef --- /dev/null +++ b/secrets/lastfm-key.age @@ -0,0 +1,28 @@ +age-encryption.org/v1 +-> ssh-rsa QXZdow +egfNMkr5s1byfetcNOZJtCjdsr6gGT2yostUlnWmzINU6iwymI1lvmZEYAC3jRHL +nlp1qS99HZb2hrIxS/RfWxWm8TBDwSw14755GIrUi6u2zZTdAGx90oiTolMx/Jfp +Lwk0HNohXfU7rLuUOAO4GpT1WhX1u2yKlxyS+DUtF/ayZN5cWTbQnAFrCJhH+lrY +5V1oytbel1zHOV7QpzT+sR09Z4VUqptmlIFtyleIO7ksEnZtFqYhhF+tMx/Bfxjg +BzLX8IyUOvvyMMUDeIOq5f0+QsqhTNk8BTNlRWznrNKKdS8P60a9J0flGz+dtczq +s3i8Xncx+6PliasnAkzOhxDUwU+CQUcRoFsQX+03yS2c0X/3V0OgOk74SCkrInCP +gCZfgVVm19gAQWHvRfjkw2qSVo2V1y6BsXb2RskZCF3+1ZfPv1kl9YCb0WUbEzZC +OGooxrJFa1Yub+zNG0RFAQKUA0yaWZSZBjmzQI7jjcYbGlBC8HgTir44vHWmJuz2 +lp14bEPVacJcvb7aBpIuaEk0Q++DuVzVtu4U3TzEXE/ViJQjkPdzQXfhM9v6TslV ++T0ebVVm5UL745G3BGhWaAOgwSuABvufVHXVvbHfUDcpW+sDCStUyD3JOyH2VJuN +gpsuz1kFsM4eMCs9CVXFxJGDQxiLAcnRX4rngYnj+4M +-> ssh-ed25519 7eGqHw Prblc9FRLxhXxffw1D061xTl7aBVLN1qbIC6wU2lLQ8 +rlifmY4sxITF3TKW6GXtGKCgyL2PZbza71mlf+pEZXo +-> ssh-rsa tO3rGg +KWwIfzOQf8ngvfmwMQzZQ7DfzMc+y7w35hZb4zmQ3YBr+Uzj9WE3MD91G63/kDjH +w9qlYrdd5FGLlPJzx3S5j9S2BAnCTQ0lgaHb3m2ta8QAnfZVNTc31uY91raZdvJ5 +wEH43UsWqU7f+haakJ3PiXDrLvyDM3ZPpE3Z3JJU+ZntXrZOVBWuOYe1FcExvHyb +rIUudxeQqlIG6Jph5m8crRP+GsNL7ApJAXwMVKCuvnsDv0XYqWVN085EnLBle7ar +OIKI/Q9t5SK1Mvh9ktuojdzzRjg+HpoCpuh3AfxvmcDBmvERH96KVrB6Mi96uHxJ +ML1O2GrjT2rpIuoqskO5ofrUMjUSqEOB6+QNU9mMiDbPzabn16DsIck3iohqDWd1 +HfaWeezEG/LdIsuBug9KTz+VcFLVugbdB0rpOO7CZ+EIdQb4tT2UCAjvnNaFJjQ0 +j/Nnry4ocThgLNn51HTPtLtPt3yh/6e7oRMrwLFB+Al8PDHZRuTWHPBqI/EpUs2A + +--- mFtuMJrCJ513/pq0hrc1f2pIoktElxa26jddGgXcje0 +E|W?rm3_^lpϜ.-Ȉ7#ݔ +E3 \ No newline at end of file diff --git a/secrets/lastfm-secret.age b/secrets/lastfm-secret.age new file mode 100644 index 0000000..08e8bdd --- /dev/null +++ b/secrets/lastfm-secret.age @@ -0,0 +1,27 @@ +age-encryption.org/v1 +-> ssh-rsa QXZdow +k4xDfb04a7A3UTCe6a+rXCQuGv59nMqER6g8aAuObleC5cXI2ChH0LJO9cVCmvox +UVh7jPhqKm9b2yGRzwdvtLHwIzJwoSXiwGXgJ66qTdWyoEKHBGYncMw1khPbY2p1 +TyBvd54b2fBEToGZfsrzKncDk/f75/50OAHXdWu7pOWTMnw7Q6zo7xCkkSQQ1oqQ +s3IZf82bT1fsr48OApsvAnFgjJngwXd5sCd+1n5WJXRpxlLXUp95vpKp2Wn8/0Tr +E76qBpkbxNWblqzz3ozo/WSinlUTSAKt9y3RjLHD49wXK2qAI3vyP8Eq22sqnXV9 +b8n+kTNVR3+d8ojjtd2cr6krOsCagqCPm890Jqx6+H8pNuzYS+DO5r7b8nUnknPz +0HRx1h7Zc2CK85hT0NtllLqlAsp3eJSj6p3FV/mlefFw7YdFHsKLAf0rVQvcPvIa +L3EPUs0cIGt58FHz0Cyj+9vGSMtqpN9RQAaL6FKl6T4CW2lpRevyrj4Kdpb1a3mU +0HSnkoqjh39Wb34GCpq2Gcdw3m/nOTGIZkGfUuoC5rXVL5cRl8JDEm0+D2DZIsVB +eGGUogvfuuZQLCbwX5dILsC7gRDfTHgSmM7LrVj0TimVKETogz3a2vyATK7MmHCy +uhn9gp5HKYXjpjxgsRrUWl7JqZBqujyduBLu+VN/vL0 +-> ssh-ed25519 7eGqHw 8FRoz15ouOkUpDc8mVoNRHVdz/jZMkiKU8JaVizTTRg +iGqUpOfnHxYMpThSf87yqqtKLyLbbANKlRxQ4DGwrjc +-> ssh-rsa tO3rGg +i9o0tQQnn4puU9d1yA9Vfy/8a2AC9MRhNZ08pd+q+YQuMLijyqD8fUuacpcoiXQj +afZgBn/x0sD6N3zx9oOrTtL+H/utsp1N6SIlx7y/3Z/65qwgPu+AiC/zAjnV+5vS ++Ny8e7VPnY0/+Jho4hTtYPFCauMFHaV1or9ShX/wTM57893oRQzuhtufsh4TwfcU +WRQKN7szRAcKnN7wB2wfcVzbGzucx+Q37Dro8qn6ZT7LIXP4qkoEmYnukkctlXDT +yxDmSE8RNr8HUZEvNdJsYTIlwjG9Vpp/EULkNfIR5oJFYr6OWjco48IWW3EaqjeV +XONL7OATIB1NUldH0C6EYNu6bHit5oe9WRUhkXpNFfsAKtLze71Rjb1ejzB1Jv5P +xRXLbzcsuisgpo/R2pIAEyG2sRozF0fQS7JipiosACWAE3ZepKIZfT2G0IfPLUkI +Z5+a7qRLw6OxUXfoLfhsFeb/tW7pFEm+oFzdGLcR06EhV0FzkkESyuTTxr8gOLKQ + +--- bDIHhN9Oo1GmQR/LwfzDuCfiWi/xE40rrupqfJZfv5k +L{֗f+^`Ģw]V~f-{h2LO]}k"P !z \ No newline at end of file diff --git a/secrets/secrets.nix b/secrets/secrets.nix index 2bca43e..fdae516 100644 --- a/secrets/secrets.nix +++ b/secrets/secrets.nix @@ -12,4 +12,9 @@ in "restic-environment.age".publicKeys = pubkeys; "restic-passwords.age".publicKeys = pubkeys; "cloudflare.age".publicKeys = pubkeys; + "lastfm-key.age".publicKeys = pubkeys; + "lastfm-secret.age".publicKeys = pubkeys; + "spotify-id.age".publicKeys = pubkeys; + "spotify-secret.age".publicKeys = pubkeys; + "discogs.age".publicKeys = pubkeys; } diff --git a/secrets/spotify-id.age b/secrets/spotify-id.age new file mode 100644 index 0000000..9e5ee26 --- /dev/null +++ b/secrets/spotify-id.age @@ -0,0 +1,27 @@ +age-encryption.org/v1 +-> ssh-rsa QXZdow +lBdNlqhlpJ93wZGsRug3AC0etQa13DACtAbM+xbe/weSH26kQ/ByBcx1FSdAN4A4 +6yaVrpG+T1JLwUZQTGKkTAGWHOuKZ7EoN0EfYPVFjVIQfb/FUuB7ZDw9Mn+VFsgm +gO7XdEi9PYGA0eMdc1a0Pg8fXNMSo7XuXYhC3tygS25Um8hwSn/LfCCfSOKs8gL7 +oXWNuemamidYrQLcDNcRKQuSkwVlUNN7C2+u7+55gYl3cCQocgxmYjF97UIwKjYp +iSjJTB9WfeFWwFq/JLcf1DmPcaFs5w1qipHCe2LfT43EMsp89cHOE7Cs2++NWZLw +iqu+IhlONAYa7dse5JbixQnD+tdfMRJFWuLZuGXvXShtYBnqTBI3d5CFuWFrdH0M +cwTXnXv47Ehai8ybI/izeqrpsceX1QR92GmsdTVbINWUewppvR9WRXCZkb5FzWNZ +jtfjxmnG/FpTqqD52+PepFsQQKULEj+iPw+XsiihnWnIw8XyclIkm7EbMSfB1jAg +3mhZYWSY92kwqPr23xg4mvQjJDEiqFbWHmhXTdMOQebRV+L8BJzdeybInm/kTn8v +avoCb7LEzji41zJW3Mc/hy5LaBslDfzk7kiXl5xn5VTYgAJbeL6ClasuQG+U7pk2 +HhO1b5RvryyGpCoYWaG6Psb4pQnyXv3kneCIGX+ES8E +-> ssh-ed25519 7eGqHw PXDvB/Z6KRfKLejzDTg4W9KxbIrfPPfUJCxmRi8CuC8 +zPQb2zSLvV+vWvPnI7dNjYVmT6uOfxupcVwtVdEwasE +-> ssh-rsa tO3rGg +s6NIc6yEvYKMYLXtEgMUW4DJIOmEIvytwWwrYjSZ0nf0UX3FJ/E2ClL520MIBERq +ALQWm8L0YTjPyCB1kAAHFaN7wdUyrGIjCPt5PuvNmZKvYc9MlTRLBz0dpQTBmjLY +YwFbZwNjv7kT3STAYtoZUKzMI+LH9Nkj+pX2R2U1pItKuwZdC7y6/kyLO4t3mtwl +IC6AeiVs8rEB6eUCPHqVAZbzLVUpTQiCVQYDXvaWn991lp5AsPr/wUc4pBkE6OUv +L0yT2NpodeZKj6gCgaVoq0hzVDA5YeuW2uvMTTuNar/sfpW3ffYrxSw2D/g0o2So +Z/OCzCohtQqyTzFO3vCbW2MqdtaSUkAimUZMydnua2wk0xOmMg15+1NxbIDbBKxO +lkwLgy8ip2ptFmNklKoHOTjddo3kMZFESrLn7wgJYXgjV/bxYnxvDAF8xCxEb/ut +KWgR17S0Fwtl3xsBEVQdhPH02AXQQQiDdourKKFhyJQgyKyPAjrFDglKeynwiJcg + +--- m22wYScxjP5MjYujDOF+ae/4Oi06BSfF4T42kYksMCg +X@|ۑm%qCܱ:EKڊ9n˿18[YU^ߡLs(ŠH \ No newline at end of file diff --git a/secrets/spotify-secret.age b/secrets/spotify-secret.age new file mode 100644 index 0000000..286c416 --- /dev/null +++ b/secrets/spotify-secret.age @@ -0,0 +1,27 @@ +age-encryption.org/v1 +-> ssh-rsa QXZdow +BfRVGeK/PkpDZLZ+t2pdV9npzaSmDNtOZ1HaKspFEi7yZi02+a4A9GHWeLU5RTmC +RYsCgsEPMvkqpPLWp1nKB6S+5B2ZrZOpq7PkRPymJ9oD+UxhmvyOB4yVihXeO34Q +d3yB6jxAN2w5lcZpgIDhwMyCl60wbcB9UfzFl9Z7qFXck07rGeigpb2SuTCz5J59 +l++BRpyG8XmPc3kLTU41nKZjF9L2l5zkRyraW3GAkQc4M5MFD7Lxkfdprd/2lAiy +nQuWmp8uKRYn33oTMXSAYmtdkQ5G731OVLy8F6czKsOlg88gm2IrH642ogT1OihL +goay4V6pbcu9DlZSHZKFVrClSN1/6kYgELcbLjHimq8NU8U5rqdC+xcVRvmQATf+ +tWcm9etKQ4pzfhMKaZDD+E8EVd5HF7C97TEZvkM2p7EHnz9vqXmkyZVVM2LQ3luJ +v/kz7maWcWbifKOMKIg8VsdOCt14Puvmn9H5J1YZd/vjNgZZB9hOeSXgUIfLqQ1P +HvVZiyGClgGhtNBbE0vazIXklSP2BxaorotmIlXB+KQRKjF+VLXj8svo2i1WclRe +lnoQq+bsvV+TAnFDYSj3DZ3yXZ4VN6yHkz+vBHBvWZWUi20yhR791z+QZpEX95uf +S33X+zuyyE0nyZHEOdOAy8HsNPiR1gta4f2aSU9smQk +-> ssh-ed25519 7eGqHw XeIa/7XPhmXc7iY3N3vM4DTpUycnIULk8lKebmGPVFk +hAhEikEFAMOCIT0py3Dv1Gx8LlavjvoyH7fOMVI4AwE +-> ssh-rsa tO3rGg +swqr1l/Z1zV3Z8c9hmpAAN4rOeL+HfWLqC6Y+lecg8cDgMDVxnspFChJxAcB2nVg +NRTNSiDFpohBpbg8N24FGq974bMMcdgmNZ4frL7BbFhbZvJoU2xKTuf/LZN6if60 ++zSZpeRZSVB43LyicjvhxgtIJ9gxI/jHrjuEN4H1yYC/QuVMfallTvuXapC2M82h +om5k49VS0tU2rMRVAQtOoYya8DNLmvulDsr9Uj3uQvhtXawTmzQryAd+pD3KZ21L ++ugNiBD2jVSMdAHM5T7bR4/fqq0Kg2b9qh1IX0euTmaFTa4uwObgwmCNjdPN51+a +IBfSKaVD+xMNsGItZnFahhcDUntZvfsM1UPPmj4ZdvpD+WxxnDLhbwL+l/dvqEin +cfwlVQfVNkpm84ggvesQMwrHMGdfj/cROFKI6iK3xY+5sfK85lwYoEKdbRnS5WKU +o1CxOCX4Pf0kMYXsuKmOkWnydKNeN56fPIyNWHWUwgE2XxjooartoJH4fQBsJLOu + +--- /+TRk43KDpHb4FrGQfhT6S1SDAoK54W770E181F+Q6M +{gZEZ/w G""cPցŸYM8a )M+YѾ|## \ No newline at end of file