diff --git a/machines/boxy/configuration.nix b/machines/boxy/configuration.nix index 11872b4..fe3cc11 100644 --- a/machines/boxy/configuration.nix +++ b/machines/boxy/configuration.nix @@ -7,10 +7,10 @@ with lib; { - imports = - [ # Include the results of the hardware scan. - ./hardware-configuration.nix - ]; + imports = [ + # Include the results of the hardware scan. + ./hardware-configuration.nix + ]; roles = { audio.enable = true; @@ -22,11 +22,12 @@ with lib; sddm = true; wayland = true; }; - plasma-bigscreen = { + kodi = { enable = true; autologin = true; - jellyfinScaleFactor = 1.0; + wayland = true; appLauncherServer.enable = true; + jellyfinScaleFactor = 1.0; }; nfs-mounts.enable = true; users.enable = true; diff --git a/machines/gym-box/configuration.nix b/machines/gym-box/configuration.nix index 01f6412..0dacaa1 100644 --- a/machines/gym-box/configuration.nix +++ b/machines/gym-box/configuration.nix @@ -22,11 +22,12 @@ with lib; sddm = true; wayland = true; }; - plasma-bigscreen = { + kodi = { enable = true; autologin = true; - jellyfinScaleFactor = 1.0; + wayland = true; appLauncherServer.enable = true; + jellyfinScaleFactor = 1.0; }; nfs-mounts.enable = true; users.enable = true; diff --git a/roles/default.nix b/roles/default.nix index d7bd2c2..9f5f816 100644 --- a/roles/default.nix +++ b/roles/default.nix @@ -19,7 +19,6 @@ with lib; # disabledModules/imports conflict with nix-deck's unstable-based # nixpkgs. Import it directly in machine configs that need it. ./nfs-mounts - ./plasma-bigscreen ./nvidia ./printing ./rclone-mount diff --git a/roles/plasma-bigscreen/default.nix b/roles/plasma-bigscreen/default.nix deleted file mode 100644 index 99d6bb8..0000000 --- a/roles/plasma-bigscreen/default.nix +++ /dev/null @@ -1,134 +0,0 @@ -{ config, lib, pkgs, ... }: - -with lib; - -let - cfg = config.roles.plasma-bigscreen; - - # Plasma Bigscreen package — not yet in nixpkgs, built from upstream master. - # TODO: Replace with pkgs.kdePackages.plasma-bigscreen once available. - plasma-bigscreen = pkgs.kdePackages.callPackage ./package.nix {}; - - jellyfinMediaPlayerPkg = - if cfg.jellyfinScaleFactor != null - then pkgs.symlinkJoin { - name = "jellyfin-media-player-scaled"; - paths = [ pkgs.qt-pinned.jellyfin-media-player ]; - nativeBuildInputs = [ pkgs.makeWrapper ]; - postBuild = '' - mkdir -p $out/bin - rm -f $out/bin/jellyfin-desktop - makeWrapper ${pkgs.qt-pinned.jellyfin-media-player}/bin/jellyfin-desktop $out/bin/jellyfin-desktop \ - --add-flags "--tv --scale-factor ${toString cfg.jellyfinScaleFactor}" - - # Update .desktop file to include scale factor and TV mode arguments - mkdir -p $out/share/applications - rm -f $out/share/applications/org.jellyfin.JellyfinDesktop.desktop - substitute ${pkgs.qt-pinned.jellyfin-media-player}/share/applications/org.jellyfin.JellyfinDesktop.desktop \ - $out/share/applications/org.jellyfin.JellyfinDesktop.desktop \ - --replace-fail "Exec=jellyfin-desktop" "Exec=jellyfin-desktop --tv --scale-factor ${toString cfg.jellyfinScaleFactor}" - ''; - } - else pkgs.qt-pinned.jellyfin-media-player; -in -{ - options.roles.plasma-bigscreen = { - enable = mkEnableOption "Plasma Bigscreen TV interface"; - - autologin = mkOption { - type = types.bool; - default = false; - description = "Auto-login to Plasma Bigscreen session"; - }; - - user = mkOption { - type = types.str; - default = "kodi"; - description = "User account for the Bigscreen session"; - }; - - jellyfinScaleFactor = mkOption { - type = types.nullOr types.float; - default = null; - description = "Scale factor for Jellyfin Media Player UI (e.g., 1.0 for 100% scaling)"; - }; - - appLauncherServer = { - enable = mkOption { - type = types.bool; - default = false; - description = "Enable HTTP app launcher server for remote control"; - }; - port = mkOption { - type = types.int; - default = 8081; - description = "Port for the app launcher HTTP server"; - }; - }; - }; - - config = mkIf cfg.enable { - # Create the bigscreen user - users.extraUsers.${cfg.user} = { - isNormalUser = true; - extraGroups = [ "wheel" "networkmanager" "audio" "video" ]; - }; - - # Plasma Bigscreen is a Plasma 6 shell — needs Plasma 6 desktop manager - services.desktopManager.plasma6.enable = true; - - # Register the bigscreen session with the display manager - services.displayManager = { - sessionPackages = [ plasma-bigscreen ]; - } // optionalAttrs cfg.autologin { - autoLogin.enable = true; - autoLogin.user = cfg.user; - defaultSession = "plasma-bigscreen-wayland"; - }; - xdg.portal.configPackages = [ plasma-bigscreen ]; - - # Fix homescreen not being focused after quitting app or on boot - # xwaylandvideobridge can interfere with focus; exclude if present - environment.plasma6.excludePackages = - lib.optional (pkgs.kdePackages ? xwaylandvideobridge) pkgs.kdePackages.xwaylandvideobridge; - - # Firewall for remote control - networking.firewall = { - allowedTCPPorts = optional cfg.appLauncherServer.enable cfg.appLauncherServer.port; - }; - - environment.systemPackages = with pkgs; [ - plasma-bigscreen - firefox - jellyfinMediaPlayerPkg - qt-pinned.stremio - wget - ] ++ optional cfg.appLauncherServer.enable pkgs.custom.app-launcher-server; - - nixpkgs.config.permittedInsecurePackages = lib.warn - "Allowing insecure package qtwebengine-5.15.19 as a jellyfin-media-player/stremio dependency." - [ - "qtwebengine-5.15.19" - ]; - - programs.kdeconnect.enable = true; - - systemd.user.services = mkIf cfg.appLauncherServer.enable { - app-launcher-server = { - description = "HTTP App Launcher Server"; - wantedBy = [ "graphical-session.target" ]; - after = [ "graphical-session.target" ]; - serviceConfig = { - Type = "simple"; - ExecStart = "${pkgs.custom.app-launcher-server}/bin/app-launcher-server ${toString cfg.appLauncherServer.port}"; - Restart = "always"; - RestartSec = "5s"; - Environment = [ - "PATH=${pkgs.firefox}/bin:/run/current-system/sw/bin" - ]; - }; - }; - }; - - }; -} diff --git a/roles/plasma-bigscreen/package.nix b/roles/plasma-bigscreen/package.nix deleted file mode 100644 index 1933bed..0000000 --- a/roles/plasma-bigscreen/package.nix +++ /dev/null @@ -1,120 +0,0 @@ -# Plasma Bigscreen — TV interface for Plasma 6 -# Not yet released or packaged in nixpkgs; built from upstream master. -# -# TODO: Remove this file once plasma-bigscreen lands in nixpkgs. -# Tracking issue: https://github.com/NixOS/nixpkgs/issues/428077 -# Draft nixpkgs PR: https://github.com/NixOS/nixpkgs/pull/428353 -# When available, switch to pkgs.kdePackages.plasma-bigscreen. -# -# Upstream: https://invent.kde.org/plasma/plasma-bigscreen -{ - mkKdeDerivation, - lib, - fetchFromGitLab, - pkg-config, - # KDE Frameworks 6 - ki18n, - kdeclarative, - kcmutils, - knotifications, - kio, - kwayland, - kwindowsystem, - ksvg, - kiconthemes, - kglobalaccel, - kdbusaddons, - # KDE Plasma 6 - plasma-workspace, - plasma-nano, - plasma-nm, - plasma-activities, - plasma-activities-stats, - milou, - libkscreen, - kdeconnect-kde, - # Qt 6 - qtdeclarative, # needed for Qt6::QmlPrivate — see QCoro workaround in postPatch - qtmultimedia, - qtwebengine, - # Other - bluez-qt, - qcoro, - plasma-wayland-protocols, - wayland, - sdl3, -}: - -mkKdeDerivation { - pname = "plasma-bigscreen"; - version = "unstable-2026-03-07"; - - src = fetchFromGitLab { - domain = "invent.kde.org"; - owner = "plasma"; - repo = "plasma-bigscreen"; - rev = "bd143fea7e386bac1652b8150a3ed3d5ef7cf93c"; - hash = "sha256-y439IX7e0+XqxqFj/4+P5le0hA7DiwA+smDsD0UH/fI="; - }; - - extraNativeBuildInputs = [ - pkg-config - ]; - - extraBuildInputs = [ - # KDE Frameworks (auto-injected by mkKdeDerivation: ki18n, kcmutils, - # knotifications, kio, kwayland, kwindowsystem, ksvg, kiconthemes) - kdeclarative - kglobalaccel - kdbusaddons - # Plasma (auto-injected: plasma-workspace, plasma-activities, - # plasma-activities-stats, libkscreen) - plasma-nano - plasma-nm - milou - kdeconnect-kde - # Qt — qtdeclarative is needed for Qt6::QmlPrivate (see postPatch) - qtdeclarative - qtmultimedia - qtwebengine - # Other (auto-injected: bluez-qt) - qcoro - plasma-wayland-protocols - wayland - sdl3 - ]; - - postPatch = '' - substituteInPlace bin/plasma-bigscreen-wayland.in \ - --replace @KDE_INSTALL_FULL_LIBEXECDIR@ "${plasma-workspace}/libexec" - - # WORKAROUND: Plasma version numbers must match; we're building an - # unreleased package against a stable Plasma release. Remove once - # bigscreen is part of the Plasma release cycle. - substituteInPlace CMakeLists.txt \ - --replace-fail 'set(PROJECT_VERSION "6.5.80")' 'set(PROJECT_VERSION "${plasma-workspace.version}")' - - # WORKAROUND: QCoro6Qml's cmake config links against Qt6::QmlPrivate but - # doesn't call find_package to import the target. This is arguably a QCoro - # packaging bug in nixpkgs (it should propagate qtdeclarative). Remove - # once QCoro or the nixpkgs plasma-bigscreen package is fixed upstream. - substituteInPlace CMakeLists.txt \ - --replace-fail 'find_package(QCoro6' 'find_package(Qt6 ''${QT_MIN_VERSION} CONFIG REQUIRED COMPONENTS QmlPrivate) - find_package(QCoro6' - ''; - - preFixup = '' - wrapQtApp $out/bin/plasma-bigscreen-wayland - ''; - - passthru.providedSessions = [ - "plasma-bigscreen-wayland" - ]; - - meta = { - description = "Plasma shell for TVs (Plasma Bigscreen)"; - homepage = "https://plasma-bigscreen.org"; - license = lib.licenses.gpl2Plus; - platforms = lib.platforms.linux; - }; -}