Files
QueueCube/flake.nix

197 lines
6.1 KiB
Nix
Raw Normal View History

2025-03-02 18:54:17 -08:00
{
description = "NodeJS application with mpv, yt-dlp, and pulseaudio dependencies";
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
flake-utils.url = "github:numtide/flake-utils";
};
outputs = { self, nixpkgs, flake-utils }:
let
# Define the NixOS module for the systemd service
nixosModule = { config, lib, pkgs, ... }:
let
cfg = config.services.queuecube;
in {
options.services.queuecube = {
enable = lib.mkEnableOption "QueueCube media player service";
port = lib.mkOption {
type = lib.types.port;
default = 3000;
description = "Port on which QueueCube will listen";
};
enable_video = lib.mkOption {
type = lib.types.bool;
default = false;
description = "Enable video playback";
};
2025-03-05 00:28:23 -08:00
store_path = lib.mkOption {
type = lib.types.str;
default = "/var/tmp/queuecube";
description = "Path to the store for QueueCube";
};
2025-03-02 18:54:17 -08:00
invidious = lib.mkOption {
type = lib.types.submodule {
options = {
2025-03-02 19:17:45 -08:00
enable = lib.mkOption {
2025-03-02 18:54:17 -08:00
type = lib.types.bool;
default = false;
description = "Enable Invidious";
};
url = lib.mkOption {
type = lib.types.str;
default = "http://invidious.nor";
description = "URL of the Invidious instance to use";
};
};
};
2025-03-02 19:01:34 -08:00
default = {
2025-03-02 19:17:45 -08:00
enable = false;
2025-03-02 19:01:34 -08:00
url = "http://invidious.nor";
};
2025-03-02 18:54:17 -08:00
};
user = lib.mkOption {
type = lib.types.str;
description = "User account under which QueueCube runs (required)";
2025-03-02 18:54:17 -08:00
};
};
config = lib.mkIf cfg.enable {
users.users.${cfg.user} = {
packages = [ self.packages.${pkgs.system}.queuecube ];
2025-03-02 18:54:17 -08:00
};
systemd.user.services.queuecube = {
2025-03-02 18:54:17 -08:00
description = "QueueCube media player service";
wantedBy = [ "default.target" ];
after = [ "pipewire.service" "pipewire-pulse.service" ];
2025-03-02 18:54:17 -08:00
serviceConfig = {
ExecStart = "${self.packages.${pkgs.system}.queuecube}/bin/queuecube";
Restart = "on-failure";
RestartSec = 5;
2025-03-02 18:54:17 -08:00
# Allow access to X11 for mpv
Environment = [ "DISPLAY=:0" ];
};
environment = {
PORT = toString cfg.port;
ENABLE_VIDEO = if cfg.enable_video then "1" else "0";
2025-03-02 19:17:45 -08:00
USE_INVIDIOUS = if cfg.invidious.enable then "1" else "0";
2025-03-02 18:54:17 -08:00
INVIDIOUS_URL = cfg.invidious.url;
2025-03-05 00:28:23 -08:00
STORE_PATH = cfg.store_path;
2025-03-02 18:54:17 -08:00
};
};
};
};
in
flake-utils.lib.eachDefaultSystem (system:
let
pkgs = nixpkgs.legacyPackages.${system};
# Define the package using buildNpmPackage
queuecube = pkgs.buildNpmPackage {
pname = "queuecube";
version = "0.1.0";
src = ./.;
# Skip the standard buildPhase and provide our own
dontNpmBuild = true;
buildPhase = ''
# First install all dependencies
npm install
# Then run the build with workspaces flag
npm run build --workspaces
'';
# Runtime dependencies
buildInputs = with pkgs; [
mpv
yt-dlp
pulseaudio
];
# Create a wrapper script to ensure runtime deps are available
postInstall = ''
# Create the necessary directories
mkdir -p $out/lib/node_modules/queuecube
# Copy the entire project with built files
cp -r . $out/lib/node_modules/queuecube
# Install the frontend build to the backend dist directory
mkdir -p $out/lib/node_modules/queuecube/backend/dist/
cp -r frontend/dist $out/lib/node_modules/queuecube/backend/dist/frontend
# Create bin directory if it doesn't exist
mkdir -p $out/bin
# Create executable script
cat > $out/bin/queuecube <<EOF
#!/bin/sh
exec ${pkgs.nodejs}/bin/node $out/lib/node_modules/queuecube/backend/build/server.js
EOF
# Make it executable
chmod +x $out/bin/queuecube
# Wrap the program to include runtime deps in PATH
wrapProgram $out/bin/queuecube \
--prefix PATH : ${pkgs.lib.makeBinPath [
pkgs.mpv
pkgs.yt-dlp
pkgs.pulseaudio
]}
'';
# Let buildNpmPackage handle npm package hash
2025-05-31 15:21:35 -07:00
npmDepsHash = "sha256-G+rT0f3wZZmZVDBd4CIswNeUzlmJ+TKy/gmZ0B5GMxY=";
2025-03-02 18:54:17 -08:00
meta = with pkgs.lib; {
description = "NodeJS application with media playback capabilities";
platforms = platforms.linux;
};
};
in {
packages = {
default = queuecube;
queuecube = queuecube;
};
apps.default = {
type = "app";
program = "${queuecube}/bin/queuecube";
};
# Development environment
devShells.default = pkgs.mkShell {
buildInputs = with pkgs; [
nodejs_20
nodePackages.npm
mpv
yt-dlp
pulseaudio
];
};
# Add a basic check to verify the package builds
checks.queuecube = queuecube;
}
) // {
# Export the NixOS module
nixosModules.default = nixosModule;
nixosModules.queuecube = nixosModule;
};
}