Compare commits

...

3 commits

9 changed files with 224 additions and 45 deletions

View file

@ -59,11 +59,29 @@ in {
}; };
config = lib.mkIf cfg.enable { config = lib.mkIf cfg.enable {
stylix.targets.noctalia-shell.enable = false; stylix.targets.noctalia-shell.enable = false;
home.packages = [pkgs.app2unit]; home.packages = [pkgs.app2unit pkgs.gpu-screen-recorder];
programs.noctalia-shell = { programs.noctalia-shell = {
enable = true; enable = true;
systemd.enable = true; systemd.enable = true;
plugins = builtins.fromJSON (builtins.readFile ./plugins.json); plugins = builtins.fromJSON (builtins.readFile ./plugins.json);
pluginSettings = let
enabledPlugins = with lib;
flip pipe [
(filterAttrs (_name: settings: settings.enabled or false))
builtins.attrNames
]
config.programs.noctalia-shell.plugins.states;
staticSettings = lib.genAttrs enabledPlugins (name: let
pluginSettingPath = ./plugin + "/${name}.json";
in
if lib.pathIsRegularFile pluginSettingPath
then builtins.fromJSON (builtins.readFile pluginSettingPath)
else {});
in
lib.recursiveUpdate
staticSettings {
screen-recorder.directory = "${config.xdg.userDirs.videos}/records";
};
settings = settings =
lib.recursiveUpdate lib.recursiveUpdate
(builtins.fromJSON (builtins.readFile ./settings.json)) (builtins.fromJSON (builtins.readFile ./settings.json))

View file

@ -0,0 +1,15 @@
{
"hideInactive": false,
"iconColor": "none",
"filenamePattern": "recording_yyyy-MM-dd_HH:mm:ss",
"frameRate": "165",
"audioCodec": "opus",
"videoCodec": "hevc",
"quality": "ultra",
"colorRange": "full",
"showCursor": true,
"copyToClipboard": false,
"audioSource": "default_output",
"videoSource": "portal",
"resolution": "2560x1440"
}

View file

@ -2,15 +2,19 @@
"sources": [ "sources": [
{ {
"enabled": true, "enabled": true,
"name": "Official Noctalia Plugins", "name": "Noctalia Plugins",
"url": "https://github.com/noctalia-dev/noctalia-plugins" "url": "https://github.com/noctalia-dev/noctalia-plugins"
} }
], ],
"states": { "states": {
"screen-recorder": {
"enabled": true,
"sourceUrl": "https://github.com/noctalia-dev/noctalia-plugins"
},
"timer": { "timer": {
"enabled": true, "enabled": true,
"sourceUrl": "https://github.com/noctalia-dev/noctalia-plugins" "sourceUrl": "https://github.com/noctalia-dev/noctalia-plugins"
} }
}, },
"version": 1 "version": 2
} }

View file

@ -95,6 +95,9 @@
}, },
"id": "plugin:timer" "id": "plugin:timer"
}, },
{
"id": "plugin:screen-recorder"
},
{ {
"displayMode": "onhover", "displayMode": "onhover",
"iconColor": "none", "iconColor": "none",
@ -490,7 +493,7 @@
"visualizerType": "mirrored", "visualizerType": "mirrored",
"mprisBlacklist": [], "mprisBlacklist": [],
"preferredPlayer": "spotify, mpv", "preferredPlayer": "spotify, mpv",
"volumeFeedback": false "volumeFeedback": true
}, },
"brightness": { "brightness": {
"brightnessStep": 1, "brightnessStep": 1,

View file

@ -3,6 +3,7 @@
lib, lib,
inputs, inputs,
outputs, outputs,
config,
... ...
}: { }: {
imports = imports =
@ -39,6 +40,19 @@
}; };
}; };
programs = { programs = {
miniserve = {
enable = true;
apps = let
cinny-template = config.youthlic.programs.miniserve.templates.cinny;
in {
cinny-1 = cinny-template {
port = 9093;
};
cinny-2 = cinny-template {
port = 9094;
};
};
};
bash.enable = true; bash.enable = true;
guix.enable = true; guix.enable = true;
dae.enable = true; dae.enable = true;

View file

@ -0,0 +1,27 @@
{
config,
lib,
pkgs,
...
}: let
cfg = config.youthlic.programs.caddy.cinny;
caddy-cfg = config.youthlic.programs.caddy;
in {
options = {
youthlic.programs.caddy.cinny = {
enable = lib.mkEnableOption "caddy.cinny";
};
};
config = lib.mkIf (cfg.enable && caddy-cfg.enable) {
services.caddy.virtualHosts = {
"cinny.${caddy-cfg.baseDomain}" = {
extraConfig = ''
root * ${pkgs.cinny}
encode gzip zstd
try_files {path} /index.html
file_server
'';
};
};
};
}

View file

@ -0,0 +1,16 @@
{
pkgs,
lib,
...
}: {
config.youthlic.programs.miniserve.templates.cinny = {port, ...} @ args:
{
inherit port;
directory = args.cinny or (toString pkgs.cinny);
defaultIndex = "index.html";
isSpa = true;
}
// (lib.optionalAttrs (args ? interface) {
inherit (args) interface;
});
}

View file

@ -0,0 +1,84 @@
{
config,
lib,
pkgs,
...
}: let
cfg = config.youthlic.programs.miniserve;
in {
imports = lib.youthlic.loadImports ./.;
options = {
youthlic.programs.miniserve = {
enable = lib.mkEnableOption "miniserve";
package = lib.mkOption {
type = lib.types.package;
default = pkgs.miniserve;
};
templates = lib.mkOption {
type = lib.types.attrsOf lib.types.anything;
default = {};
};
apps = lib.mkOption {
type = lib.types.attrsOf (lib.types.submodule ({...}: {
options = {
port = lib.mkOption {
type = lib.types.port;
};
interface = lib.mkOption {
type = lib.types.str;
default = "127.0.0.1";
};
isSpa = lib.mkEnableOption "is spa";
directory = lib.mkOption {
type = lib.types.either lib.types.package lib.types.path;
};
defaultIndex = lib.mkOption {
type = lib.types.str;
default = "index.html";
};
};
}));
default = {};
};
};
};
config = lib.mkIf (cfg.enable && (cfg.apps != {})) {
systemd.services =
lib.concatMapAttrs (name: value: {
"miniserve-${name}" = {
description = ''
miniserve for ${name}
'';
after = ["network-online.target"];
wants = ["network-online.target"];
wantedBy = ["multi-user.target"];
serviceConfig = {
ExecStart = ''
${lib.getExe cfg.package} ${lib.optionalString value.isSpa "--spa"} --index ${value.directory}/${value.defaultIndex} --port ${toString value.port} --interfaces ${value.interface} ${value.directory}
'';
IPAccounting = "yes";
IPAddressAllow = value.interface;
IPAddressDeny = "any";
DynamicUser = "yes";
PrivateTmp = "yes";
PrivateUsers = "yes";
PrivateDevices = "yes";
NoNewPrivileges = true;
ProtectSystem = "strict";
ProtectHome = "yes";
ProtectClock = "yes";
ProtectControlGroups = "yes";
ProtectKernelLogs = "yes";
ProtectKernelModules = "yes";
ProtectKernelTunables = "yes";
ProtectProc = "invisible";
CapabilityBoundingSet = [
"CAP_NET_BIND_SERVICE"
"CAP_DAC_READ_SEARCH"
];
};
};
})
cfg.apps;
};
}

View file

@ -1,46 +1,44 @@
{ {
perSystem = {lib, ...}: { perSystem = {lib, ...}: {
treefmt = { treefmt.programs = {
programs = { alejandra = {
alejandra = { enable = true;
enable = true; excludes = ["_sources/*.nix"];
excludes = ["_sources/*.nix"]; };
}; oxfmt = let
oxfmt = let oxfmtConfig = with lib;
oxfmtConfig = with lib; pipe ./.oxfmtrc.json [builtins.readFile builtins.fromJSON];
pipe ./.oxfmtrc.json [builtins.readFile builtins.fromJSON]; in {
in { enable = true;
enable = true; includes = ["*.json" "*.md" "*.toml" "*.yaml"];
includes = ["*.json" "*.md" "*.toml" "*.yaml"]; excludes = oxfmtConfig.ignorePatterns;
excludes = oxfmtConfig.ignorePatterns; };
}; just = {
just = { enable = true;
enable = true; includes = [".justfile"];
includes = [".justfile"]; };
}; typos = let
typos = let config = with lib;
config = with lib; pipe ./.typos.toml [builtins.readFile fromTOML];
pipe ./.typos.toml [builtins.readFile fromTOML]; in {
in { enable = true;
enable = true; includes = ["*"];
includes = ["*"]; excludes = ["assets/*"] ++ config.files.extend-exclude;
excludes = ["assets/*"] ++ config.files.extend-exclude; configFile = toString ./.typos.toml;
configFile = toString ./.typos.toml; # Disable all extra option in treefmt module.
# Disable all extra option in treefmt module. # Use config file.
# Use config file. sort = false;
sort = false; isolated = false;
isolated = false; hidden = false;
hidden = false; noIgnore = false;
noIgnore = false; noIgnoreDot = false;
noIgnoreDot = false; noIgnoreGlobal = false;
noIgnoreGlobal = false; noIgnoreParent = false;
noIgnoreParent = false; noIgnoreVCS = false;
noIgnoreVCS = false; binary = false;
binary = false; noCheckFilenames = false;
noCheckFilenames = false; noCheckFiles = false;
noCheckFiles = false; noUnicode = false;
noUnicode = false;
};
}; };
}; };
}; };