vocard: use nix for configuration

This commit is contained in:
Gerg-L 2025-03-03 19:11:40 -05:00
parent bf8e99ce0e
commit 4f0a7c169c
Signed by: gerg-l
SSH key fingerprint: SHA256:FPYDHIkvMocr4wdmZXpgpJjsb2Tw6rASs2ISPbOb0KI
5 changed files with 273 additions and 287 deletions

View file

@ -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 = "";
};
}

View file

@ -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";
}

View file

@ -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

View file

@ -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"
}

View file

@ -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 = [
{