From 4f0a7c169ce7f71b57b422169875f978a4b78e8d Mon Sep 17 00:00:00 2001 From: Gerg-L Date: Mon, 3 Mar 2025 19:11:40 -0500 Subject: [PATCH] vocard: use nix for configuration --- .../services/vocard/_application.nix | 94 +++++++++++ .../services/vocard/_settings.nix | 146 ++++++++++++++++ .../services/vocard/application.yml | 109 ------------ .../services/vocard/settings.json | 157 ------------------ .../gerg-desktop/services/vocard/vocard.nix | 54 +++--- 5 files changed, 273 insertions(+), 287 deletions(-) create mode 100644 nixosConfigurations/gerg-desktop/services/vocard/_application.nix create mode 100644 nixosConfigurations/gerg-desktop/services/vocard/_settings.nix delete mode 100644 nixosConfigurations/gerg-desktop/services/vocard/application.yml delete mode 100644 nixosConfigurations/gerg-desktop/services/vocard/settings.json diff --git a/nixosConfigurations/gerg-desktop/services/vocard/_application.nix b/nixosConfigurations/gerg-desktop/services/vocard/_application.nix new file mode 100644 index 0000000..728264b --- /dev/null +++ b/nixosConfigurations/gerg-desktop/services/vocard/_application.nix @@ -0,0 +1,94 @@ +{ link, lavalinkPlugins }: +{ + + server = { + http2.enabled = false; + port = link.portStr; + address = link.ipv4; + }; + lavalink = { + plugins = [ + { + dependency = "dev.lavalink.youtube:youtube-plugin:1.11.5"; + enabled = true; + snapshot = false; + } + ]; + server = { + #password = ""; + + bufferDurationMs = 400; + filters = { + channelMix = true; + distortion = true; + equalizer = true; + karaoke = true; + lowPass = true; + rotation = true; + timescale = true; + tremolo = true; + vibrato = true; + volume = true; + }; + frameBufferDurationMs = 5000; + gc-warnings = true; + nonAllocatingFrameBuffer = false; + opusEncodingQuality = 10; + playerUpdateInterval = 5; + resamplingQuality = "LOW"; + soundcloudSearchEnabled = true; + sources = { + bandcamp = true; + http = true; + local = false; + nico = true; + soundcloud = true; + twitch = true; + vimeo = true; + youtube = false; + }; + trackStuckThresholdMs = 10000; + useSeekGhosting = true; + youtubePlaylistLoadLimit = 6; + youtubeSearchEnabled = true; + }; + }; + logging = { + file.path = null; + + level = { + "dev.lavalink.youtube.http.YoutubeOauth2Handler" = "INFO"; + lavalink = "INFO"; + root = "INFO"; + }; + request = { + enabled = true; + includeClientInfo = true; + includeHeaders = false; + includePayload = true; + includeQueryString = true; + maxPayloadLength = 10000; + }; + }; + + metrics.prometheus.enabled = false; + + plugins = { + pluginsDir = lavalinkPlugins; + youtube = { + allowDirectPlaylistIds = true; + allowDirectVideoIds = true; + allowSearch = true; + clients = [ "TVHTML5EMBEDDED" ]; + enabled = true; + oauth = { + enabled = true; + #refreshToken = ""; + }; + }; + }; + sentry = { + dsn = ""; + environment = ""; + }; +} diff --git a/nixosConfigurations/gerg-desktop/services/vocard/_settings.nix b/nixosConfigurations/gerg-desktop/services/vocard/_settings.nix new file mode 100644 index 0000000..501057e --- /dev/null +++ b/nixosConfigurations/gerg-desktop/services/vocard/_settings.nix @@ -0,0 +1,146 @@ +{ + link, + ferretLink, + p, +}: +{ + activity = [ + { + name = "/help"; + status = "online"; + type = "listening"; + } + ]; + aliases = { + connect = [ "join" ]; + leave = [ + "stop" + "bye" + ]; + play = [ "p" ]; + view = [ "v" ]; + }; + bot_access_user = [ ]; + client_id = p."vocard/client_id"; + cooldowns = { + connect = [ + 2 + 30 + ]; + "playlist view" = [ + 1 + 30 + ]; + }; + default_controller = { + default_buttons = [ + [ + "back" + "resume" + "skip" + { stop = "red"; } + "add" + ] + [ "tracks" ] + ]; + disableButtonText = false; + embeds = { + active = { + author = { + icon_url = "@@bot_icon@@"; + name = "Music Controller | @@channel_name@@"; + }; + color = "@@track_color@@"; + description = "**Now Playing: ```[@@track_name@@]```\nLink: [Click Me](@@track_url@@) | Requester: @@requester@@ | DJ: @@dj@@**"; + footer.text = "Queue Length: @@queue_length@@ | Duration: @@track_duration@@ | Volume: @@volume@@% {{loop_mode != 'Off' ?? | Repeat: @@loop_mode@@}}"; + image = "@@track_thumbnail@@"; + }; + inactive = { + color = "@@default_embed_color@@"; + description = "[Support](@@server_invite_link@@) | [Invite](@@invite_link@@) | [Questionnaire](https://forms.gle/Qm8vjBfg2kp13YGD7)"; + image = "https://i.imgur.com/dIFBwU7.png"; + title.name = "There are no songs playing right now"; + }; + }; + }; + default_max_queue = 1000; + default_voice_status_template = "{{@@track_name@@ != 'None' ?? @@track_source_emoji@@ Now Playing: @@track_name@@ // Waiting for song requests}}"; + embed_color = "0xb3b3b3"; + genius_token = "YOUR_GENIUS_TOKEN"; + ipc_client = { + enable = false; + host = "127.0.0.1"; + password = "YOUR_PASSWORD"; + port = 8000; + secure = false; + }; + logging = { + file = { + enable = false; + path = "./logs"; + }; + level = { + discord = "INFO"; + ipc_client = "INFO"; + vocard = "INFO"; + }; + max-history = 30; + }; + lyrics_platform = "lyrist"; + mongodb_name = "vocard"; + mongodb_url = ferretLink.url; + nodes.DEFAULT = { + host = link.ipv4; + identifier = "DEFAULT"; + password = p."vocard/password"; + inherit (link) port; + secure = false; + }; + prefix = "?"; + sources_settings = { + apple = { + color = "0xE298C4"; + emoji = "<:applemusic:994844332374884413>"; + }; + bandcamp = { + color = "0x6F98A7"; + emoji = "<:bandcamp:864694003811221526>"; + }; + reddit = { + color = "0xFF5700"; + emoji = "<:reddit:996007566863773717>"; + }; + soundcloud = { + color = "0xFF7700"; + emoji = "<:soundcloud:852729280027033632>"; + }; + spotify = { + color = "0x1DB954"; + emoji = "<:spotify:826661996615172146>"; + }; + tiktok = { + color = "0x74ECE9"; + emoji = "<:tiktok:996007689798811698>"; + }; + twitch = { + color = "0x9B4AFF"; + emoji = "<:twitch:852729278285086741>"; + }; + vimeo = { + color = "0x1ABCEA"; + emoji = "<:vimeo:864694001919721473>"; + }; + youtube = { + color = "0xFF0000"; + emoji = "<:youtube:826661982760992778>"; + }; + "youtube music" = { + color = "0xFF0000"; + emoji = "<:youtube:826661982760992778>"; + }; + }; + spotify_client_id = p."vocard/spotify_client_id"; + spotify_client_secret = p."vocard/spotify_client_secret"; + token = p."vocard/token"; + version = "v2.6.9"; +} diff --git a/nixosConfigurations/gerg-desktop/services/vocard/application.yml b/nixosConfigurations/gerg-desktop/services/vocard/application.yml deleted file mode 100644 index 92ce11b..0000000 --- a/nixosConfigurations/gerg-desktop/services/vocard/application.yml +++ /dev/null @@ -1,109 +0,0 @@ -server: # REST and WS server - port: 2333 - address: 0.0.0.0 - http2: - enabled: false # Whether to enable HTTP/2 support -plugins: - youtube: - enabled: true - allowSearch: true # Whether "ytsearch:" and "ytmsearch:" can be used. - allowDirectVideoIds: true # Whether just video IDs can match. If false, only complete URLs will be loaded. - allowDirectPlaylistIds: true # Whether just playlist IDs can match. If false, only complete URLs will be loaded. - # The clients to use for track loading. See below for a list of valid clients. - # Clients are queried in the order they are given (so the first client is queried first and so on...) - clients: - - TVHTML5EMBEDDED - oauth: - enabled: true - # Set with env vars - #refreshToken: "" -lavalink: - plugins: - - dependency: "dev.lavalink.youtube:youtube-plugin:1.11.5" - snapshot: false - # setting "enabled: true" is the bare minimum to get OAuth working. - enabled: true - - # Set with env vars - #pluginsDir: "" - server: - - # Set with env vars - #password: "" - sources: - youtube: false - bandcamp: true - soundcloud: true - twitch: true - vimeo: true - nico: true - http: true - local: false - filters: # All filters are enabled by default - volume: true - equalizer: true - karaoke: true - timescale: true - tremolo: true - vibrato: true - distortion: true - rotation: true - channelMix: true - lowPass: true - nonAllocatingFrameBuffer: false # Setting to true reduces the number of allocations made by each player at the expense of frame rebuilding (e.g. non-instantaneous volume changes) - bufferDurationMs: 400 # The duration of the NAS buffer. Higher values fare better against longer GC pauses. Duration <= 0 to disable JDA-NAS. Minimum of 40ms, lower values may introduce pauses. - frameBufferDurationMs: 5000 # How many milliseconds of audio to keep buffered - opusEncodingQuality: 10 # Opus encoder quality. Valid values range from 0 to 10, where 10 is best quality but is the most expensive on the CPU. - resamplingQuality: LOW # Quality of resampling operations. Valid values are LOW, MEDIUM and HIGH, where HIGH uses the most CPU. - trackStuckThresholdMs: 10000 # The threshold for how long a track can be stuck. A track is stuck if does not return any audio data. - useSeekGhosting: true # Seek ghosting is the effect where whilst a seek is in progress, the audio buffer is read from until empty, or until seek is ready. - youtubePlaylistLoadLimit: 6 # Number of pages at 100 each - playerUpdateInterval: 5 # How frequently to send player updates to clients, in seconds - youtubeSearchEnabled: true - soundcloudSearchEnabled: true - gc-warnings: true - #ratelimit: - #ipBlocks: ["1.0.0.0/8", "..."] # list of ip blocks - #excludedIps: ["...", "..."] # ips which should be explicit excluded from usage by lavalink - #strategy: "RotateOnBan" # RotateOnBan | LoadBalance | NanoSwitch | RotatingNanoSwitch - #searchTriggersFail: true # Whether a search 429 should trigger marking the ip as failing - #retryLimit: -1 # -1 = use default lavaplayer value | 0 = infinity | >0 = retry will happen this numbers times - #youtubeConfig: # Required for avoiding all age restrictions by YouTube, some restricted videos still can be played without. - #email: "" # Email of Google account - #password: "" # Password of Google account - #httpConfig: # Useful for blocking bad-actors from ip-grabbing your music node and attacking it, this way only the http proxy will be attacked - #proxyHost: "localhost" # Hostname of the proxy, (ip or domain) - #proxyPort: 3128 # Proxy port, 3128 is the default for squidProxy - #proxyUser: "" # Optional user for basic authentication fields, leave blank if you don't use basic auth - #proxyPassword: "" # Password for basic authentication - -metrics: - prometheus: - enabled: false - endpoint: /metrics - - -sentry: - dsn: "" - environment: "" - -logging: - file: - path: null - level: - root: INFO - lavalink: INFO - dev.lavalink.youtube.http.YoutubeOauth2Handler: INFO - - request: - enabled: true - includeClientInfo: true - includeHeaders: false - includeQueryString: true - includePayload: true - maxPayloadLength: 10000 - - logback: - rollingpolicy: - max-file-size: 1GB - max-history: 30 diff --git a/nixosConfigurations/gerg-desktop/services/vocard/settings.json b/nixosConfigurations/gerg-desktop/services/vocard/settings.json deleted file mode 100644 index 2715a29..0000000 --- a/nixosConfigurations/gerg-desktop/services/vocard/settings.json +++ /dev/null @@ -1,157 +0,0 @@ -{ - "token": "@token@", - "client_id": "@client_id@", - "spotify_client_id": "@spotify_client_id@", - "spotify_client_secret": "@spotify_client_secret@", - "genius_token": "YOUR_GENIUS_TOKEN", - "mongodb_url": "0.0.0.0", - "mongodb_name": "vocard", - "nodes": { - "DEFAULT": { - "host": "0.0.0.0", - "port": 2333, - "password": "@password@", - "secure": false, - "identifier": "DEFAULT" - } - }, - "prefix": "?", - "activity": [ - { - "type": "listening", - "name": "/help", - "status": "online" - } - ], - "logging": { - "file": { - "path": "./logs", - "enable": false - }, - "level": { - "discord": "INFO", - "vocard": "INFO", - "ipc_client": "INFO" - }, - "max-history": 30 - }, - "bot_access_user": [], - "embed_color": "0xb3b3b3", - "default_max_queue": 1000, - "lyrics_platform": "lyrist", - "ipc_client": { - "host": "127.0.0.1", - "port": 8000, - "password": "YOUR_PASSWORD", - "secure": false, - "enable": false - }, - "sources_settings": { - "youtube": { - "emoji": "<:youtube:826661982760992778>", - "color": "0xFF0000" - }, - "youtube music": { - "emoji": "<:youtube:826661982760992778>", - "color": "0xFF0000" - }, - "spotify": { - "emoji": "<:spotify:826661996615172146>", - "color": "0x1DB954" - }, - "soundcloud": { - "emoji": "<:soundcloud:852729280027033632>", - "color": "0xFF7700" - }, - "twitch": { - "emoji": "<:twitch:852729278285086741>", - "color": "0x9B4AFF" - }, - "bandcamp": { - "emoji": "<:bandcamp:864694003811221526>", - "color": "0x6F98A7" - }, - "vimeo": { - "emoji": "<:vimeo:864694001919721473>", - "color": "0x1ABCEA" - }, - "apple": { - "emoji": "<:applemusic:994844332374884413>", - "color": "0xE298C4" - }, - "reddit": { - "emoji": "<:reddit:996007566863773717>", - "color": "0xFF5700" - }, - "tiktok": { - "emoji": "<:tiktok:996007689798811698>", - "color": "0x74ECE9" - } - }, - "default_controller": { - "embeds": { - "active": { - "description": "**Now Playing: ```[@@track_name@@]```\nLink: [Click Me](@@track_url@@) | Requester: @@requester@@ | DJ: @@dj@@**", - "footer": { - "text": "Queue Length: @@queue_length@@ | Duration: @@track_duration@@ | Volume: @@volume@@% {{loop_mode != 'Off' ?? | Repeat: @@loop_mode@@}}" - }, - "image": "@@track_thumbnail@@", - "author": { - "name": "Music Controller | @@channel_name@@", - "icon_url": "@@bot_icon@@" - }, - "color": "@@track_color@@" - }, - "inactive": { - "title": { - "name": "There are no songs playing right now" - }, - "description": "[Support](@@server_invite_link@@) | [Invite](@@invite_link@@) | [Questionnaire](https://forms.gle/Qm8vjBfg2kp13YGD7)", - "image": "https://i.imgur.com/dIFBwU7.png", - "color": "@@default_embed_color@@" - } - }, - "default_buttons": [ - [ - "back", - "resume", - "skip", - { - "stop": "red" - }, - "add" - ], - [ - "tracks" - ] - ], - "disableButtonText": false - }, - "default_voice_status_template": "{{@@track_name@@ != 'None' ?? @@track_source_emoji@@ Now Playing: @@track_name@@ // Waiting for song requests}}", - "cooldowns": { - "connect": [ - 2, - 30 - ], - "playlist view": [ - 1, - 30 - ] - }, - "aliases": { - "connect": [ - "join" - ], - "leave": [ - "stop", - "bye" - ], - "play": [ - "p" - ], - "view": [ - "v" - ] - }, - "version": "v2.6.9" -} diff --git a/nixosConfigurations/gerg-desktop/services/vocard/vocard.nix b/nixosConfigurations/gerg-desktop/services/vocard/vocard.nix index db2ef35..c225408 100644 --- a/nixosConfigurations/gerg-desktop/services/vocard/vocard.nix +++ b/nixosConfigurations/gerg-desktop/services/vocard/vocard.nix @@ -2,8 +2,18 @@ self', lib, config, + pkgs, }: +let + link = config.local.links.lavalink; + ferretLink = config.local.links.ferretdb; +in { + local.links = { + lavalink = { }; + ferretdb.protocol = "mongodb"; + }; + sops = { secrets = { @@ -36,23 +46,12 @@ "vocard.service" "lavalink.service" ]; - content = - builtins.replaceStrings - [ - "@token@" - "@client_id@" - "@spotify_client_id@" - "@spotify_client_secret@" - "@password@" - ] - (map (x: config.sops.placeholder.${x}) [ - "vocard/token" - "vocard/client_id" - "vocard/spotify_client_id" - "vocard/spotify_client_secret" - "vocard/password" - ]) - (builtins.readFile ./settings.json); + content = builtins.toJSON ( + import ./_settings.nix { + inherit link ferretLink; + p = config.sops.placeholder; + } + ); }; }; @@ -88,10 +87,20 @@ "network-online.target" ]; - environment.LAVALINK_PLUGINS_DIR = self'.packages.lavalinkPlugins; - serviceConfig = { - ExecStart = "${lib.getExe self'.packages.lavalink} --spring.config.location='file:${./application.yml}'"; + ExecStart = + let + configFile = pkgs.writeText "application.yml" ( + builtins.toJSON ( + import ./_application.nix { + inherit link; + inherit (self'.packages) lavalinkPlugins; + } + ) + ); + in + + "${lib.getExe self'.packages.lavalink} --spring.config.location='file:${configFile}'"; DynamicUser = true; EnvironmentFile = config.sops.secrets.lavalink.path; Restart = "on-failure"; @@ -100,7 +109,10 @@ }; }; - services.ferretdb.enable = true; + services.ferretdb = { + enable = true; + settings.FERRETDB_LISTEN_ADDR = ferretLink.tuple; + }; systemd.mounts = [ {