add nixos module to flake, add mainProgram option to package, and fix typo in readme
This commit is contained in:
parent
77c42dffd8
commit
aa0f47607f
|
@ -36,7 +36,7 @@ You can configure the application using environment variables
|
||||||
| YTDL_COOKIES_FROMBROWSER_BROWSER | The name of the browser to load cookies from. (if specified, it disables YTDL_COOKIES_FILEPATH) | ` ` | `brave`, `chrome`, `chromium`, `edge`, `firefox`, `opera`, `safari`, `vivaldi` |
|
| YTDL_COOKIES_FROMBROWSER_BROWSER | The name of the browser to load cookies from. (if specified, it disables YTDL_COOKIES_FILEPATH) | ` ` | `brave`, `chrome`, `chromium`, `edge`, `firefox`, `opera`, `safari`, `vivaldi` |
|
||||||
| YTDL_COOKIES_FROMBROWSER_KEYRING | The name of the keyring for decrypting cookies for the chromium browser on linux | ` ` | `basictext`, `gnomekeyring`, `kwallet` |
|
| YTDL_COOKIES_FROMBROWSER_KEYRING | The name of the keyring for decrypting cookies for the chromium browser on linux | ` ` | `basictext`, `gnomekeyring`, `kwallet` |
|
||||||
| YTDL_COOKIES_FROMBROWSER_PROFILE | The browser profile to load cookies from | ` ` | |
|
| YTDL_COOKIES_FROMBROWSER_PROFILE | The browser profile to load cookies from | ` ` | |
|
||||||
| YTDL_COOKIES_FROMBROWSER_CONTAINER | The container name (if firefox) top load the cookies from | ` ` | |
|
| YTDL_COOKIES_FROMBROWSER_CONTAINER | The container name (if firefox) to load the cookies from | ` ` | |
|
||||||
|
|
||||||
## Building from source
|
## Building from source
|
||||||
|
|
||||||
|
|
|
@ -50,6 +50,7 @@
|
||||||
# agnostic ones like nixosModule and system-enumerating ones, although
|
# agnostic ones like nixosModule and system-enumerating ones, although
|
||||||
# those are more easily expressed in perSystem.
|
# those are more easily expressed in perSystem.
|
||||||
|
|
||||||
|
nixosModules.default = import ./nix/module.nix;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,229 @@
|
||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
let
|
||||||
|
inherit (lib.options) mkOption mkEnableOption mkPackageOption;
|
||||||
|
inherit (lib.modules) mkIf;
|
||||||
|
inherit (lib.types) str enum int path submodule nullOr bool;
|
||||||
|
|
||||||
|
cfg = config.services.ytdl-web;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
options.services.ytdl-web = {
|
||||||
|
enable = mkEnableOption "ytdl-web";
|
||||||
|
package = mkPackageOption pkgs "ytdl-web" { };
|
||||||
|
|
||||||
|
user = mkOption {
|
||||||
|
type = str;
|
||||||
|
default = "ytdl-web";
|
||||||
|
description = ''
|
||||||
|
The user account ytdl-web will run under.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
group = mkOption {
|
||||||
|
type = str;
|
||||||
|
default = "ytdl-web";
|
||||||
|
description = ''
|
||||||
|
The group ytdl-web will run under.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
appEnvironment = mkOption {
|
||||||
|
type = enum [ "Development" "Staging" "Production" ];
|
||||||
|
default = "Production";
|
||||||
|
description = ''
|
||||||
|
The application environment mode.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
ytdlPackage = mkPackageOption pkgs "yt-dlp" { };
|
||||||
|
|
||||||
|
port = mkOption {
|
||||||
|
type = int;
|
||||||
|
default = 8080;
|
||||||
|
description = ''
|
||||||
|
The tcp port for the web server to listen on.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
listen = mkOption {
|
||||||
|
type = str;
|
||||||
|
default = "0.0.0.0";
|
||||||
|
example = "127.0.0.1";
|
||||||
|
description = ''
|
||||||
|
The address for the web server to listen on.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
openFirewall = mkOption {
|
||||||
|
type = bool;
|
||||||
|
default = false;
|
||||||
|
example = literalExpression "true";
|
||||||
|
description = ''
|
||||||
|
Open ports in the firewall for the ytdl-web server.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
basePath = mkOption {
|
||||||
|
type = str;
|
||||||
|
default = "/";
|
||||||
|
example = "/ytdl-web";
|
||||||
|
description = ''
|
||||||
|
The base path that the web application is hosted under.
|
||||||
|
Useful for reverse-proxies that proxy the app with a path prefix.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
cacheTTL = mkOption {
|
||||||
|
type = str;
|
||||||
|
default = "1h";
|
||||||
|
example = "2m";
|
||||||
|
description = ''
|
||||||
|
How long to keep cached metadata for.
|
||||||
|
|
||||||
|
A duration string is a possibly signed sequence of decimal numbers,
|
||||||
|
each with optional fraction and a unit suffix, such as "300ms", "-1.5h" or "2h45m".
|
||||||
|
Valid time units are "ns", "us" (or "µs"), "ms", "s", "m", "h".
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
cacheDir = mkOption {
|
||||||
|
type = path;
|
||||||
|
default = "/var/cache/ytdl-web";
|
||||||
|
example = "/tmp/ytdl-web";
|
||||||
|
description = ''
|
||||||
|
The directory containing the ytdl metadata cache.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
cookies = mkOption {
|
||||||
|
type = submodule {
|
||||||
|
options = {
|
||||||
|
enable = mkEnableOption "ytdl cookies";
|
||||||
|
|
||||||
|
file = mkOption {
|
||||||
|
type = nullOr path;
|
||||||
|
default = null;
|
||||||
|
example = "/etc/ytdl-web/cookies.txt";
|
||||||
|
description = ''
|
||||||
|
The file that contains the netscape formatted cookies.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
fromBrowser = mkOption {
|
||||||
|
description = ''
|
||||||
|
Settings for obtaining cookies from a local browser's cookie storage.
|
||||||
|
'';
|
||||||
|
|
||||||
|
type = submodule {
|
||||||
|
options = {
|
||||||
|
browser = mkOption {
|
||||||
|
type = nullOr (enum [ "brave" "chrome" "chromium" "edge" "firefox" "opera" "safari" "vivaldi" ]);
|
||||||
|
default = null;
|
||||||
|
description = ''
|
||||||
|
The name of the browser to load cookies from.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
keyring = mkOption {
|
||||||
|
type = nullOr (enum [ "basictext" "gnomekeyring" "kwallet" ]);
|
||||||
|
default = null;
|
||||||
|
description = ''
|
||||||
|
The name of the keyring to use to decrypt cookies when using the chromium browser.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
profile = mkOption {
|
||||||
|
type = nullOr str;
|
||||||
|
default = null;
|
||||||
|
description = ''
|
||||||
|
The name of the browser profile to load the cookies from.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
container = mkOption {
|
||||||
|
type = nullOr str;
|
||||||
|
default = null;
|
||||||
|
description = ''
|
||||||
|
The container name to load the cookies from when using the firefox browser.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
config = mkIf cfg.enable {
|
||||||
|
assertions = [
|
||||||
|
{
|
||||||
|
assertion = cfg.cookies.file != null && cfg.cookies.fromBrowser.browser != null;
|
||||||
|
message = "The `services.ytdl-web.cookies.file` and `services.ytdl-web.cookies.fromBrowser.browser` options are mutually exclusive.";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
assertion = cfg.cookies.fromBrowser.browser != null &&
|
||||||
|
!(builtins.elem cfg.cookies.fromBrowser.browser [ "brave" "chrome" "chromium" "edge" "opera" "vivaldi" ]) &&
|
||||||
|
cfg.cookies.fromBrowser.keyring != null;
|
||||||
|
message = "The `services.ytdl-web.cookies.fromBrowser.keyring` only functions with a chromium-based browser.";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
assertion = cfg.cookies.fromBrowser.browser != null &&
|
||||||
|
cfg.cookies.fromBrowser.browser != "firefox" &&
|
||||||
|
cfg.cookies.fromBrowser.container != null;
|
||||||
|
message = "The `services.ytdl-web.cookies.fromBrowser.container` only functions with the firefox browser.";
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
|
systemd.services.ytdl-web = {
|
||||||
|
description = "ytdl-web";
|
||||||
|
after = [ "networking.target" ];
|
||||||
|
wantedBy = [ "multi-user.target" ];
|
||||||
|
|
||||||
|
environment = {
|
||||||
|
YTDL_ENV = cfg.appEnvironment;
|
||||||
|
YTDL_BINARY_PATH = toString cfg.ytdlPackage;
|
||||||
|
YTDL_HTTP_PORT = toString cfg.port;
|
||||||
|
YTDL_HTTP_LISTEN = cfg.listen;
|
||||||
|
YTDL_HTTP_BASEPATH = cfg.basePath;
|
||||||
|
YTDL_CACHE_TTL = cfg.cacheTTL;
|
||||||
|
YTDL_CACHE_DIRPATH = cfg.cacheDir;
|
||||||
|
YTDL_COOKIES_ENABLED = if cfg.cookies.enable then "true" else "false";
|
||||||
|
YTDL_COOKIES_FILEPATH = cfg.cookies.file;
|
||||||
|
YTDL_COOKIES_FROMBROWSER_BROWSER = cfg.cookies.fromBrowser.browser;
|
||||||
|
YTDL_COOKIES_FROMBROWSER_KEYRING = cfg.cookies.fromBrowser.keyring;
|
||||||
|
YTDL_COOKIES_FROMBROWSER_PROFILE = cfg.cookies.fromBrowser.profile;
|
||||||
|
YTDL_COOKIES_FROMBROWSER_CONTAINER = cfg.cookies.fromBrowser.container;
|
||||||
|
};
|
||||||
|
|
||||||
|
serviceConfig = {
|
||||||
|
Type = "simple";
|
||||||
|
User = cfg.user;
|
||||||
|
Group = cfg.group;
|
||||||
|
ExecStart = "${lib.getExe cfg.package} serve";
|
||||||
|
Restart = "on-failure";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
systemd.tmpfiles.rules = [
|
||||||
|
"d ${cfg.cacheDir} 0770 ${cfg.user} ${cfg.group} -"
|
||||||
|
];
|
||||||
|
|
||||||
|
networking.firewall = mkIf cfg.openFirewall {
|
||||||
|
allowedTCPPorts = [ cfg.port ];
|
||||||
|
};
|
||||||
|
|
||||||
|
users = {
|
||||||
|
users = mkIf (cfg.user == "ytdl-web") {
|
||||||
|
ytdl-web = {
|
||||||
|
isSystemUser = true;
|
||||||
|
group = cfg.group;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
groups = mkIf (cfg.group == "ytdl-web") {
|
||||||
|
ytdl-web = { };
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
|
@ -35,5 +35,6 @@ buildGoModule rec {
|
||||||
description = "Yet another yt-dlp web frontend written in Go.";
|
description = "Yet another yt-dlp web frontend written in Go.";
|
||||||
homepage = "https://git.fifitido.net/apps/ytdl-web";
|
homepage = "https://git.fifitido.net/apps/ytdl-web";
|
||||||
license = licenses.gpl3Only;
|
license = licenses.gpl3Only;
|
||||||
|
mainProgram = "ytdl-web";
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue