{ config, lib, ook, ... }: let ookflixLib = import ./lib.nix {inherit lib config;}; inherit (ookflixLib) mkServiceStateDir mkServiceUser; inherit (lib) mkIf optionalAttrs; inherit (ook.lib.container) mkContainerLabel mkContainerEnvironment mkContainerPort; inherit (config.ooknet.server.ookflix) volumes services groups gpuAcceleration; inherit (config.ooknet.server.ookflix.services) jellyfin; in { config = mkIf services.jellyfin.enable { hardware.nvidia-container-toolkit.enable = gpuAcceleration.enable && gpuAcceleration.type == "nvidia"; users = mkServiceUser jellyfin.user.name; systemd.tmpfiles = mkServiceStateDir "jellyfin" jellyfin.stateDir; virtualisation.oci-containers.containers = { # media streaming server # docs: jellyfin = { image = "lscr.io/linuxserver/jellyfin:latest"; autoStart = true; hostname = "jellyfin"; ports = [(mkContainerPort jellyfin.port)]; volumes = [ "${volumes.media.movies}:/data/movies" "${volumes.media.tv}:/data/tv" "${jellyfin.stateDir}:/config" ]; labels = mkContainerLabel { name = "jellyfin"; inherit (jellyfin) port domain; homepage = { group = "media"; description = "media-server streamer"; }; }; extraOptions = optionalAttrs gpuAcceleration.enable ( if gpuAcceleration.type == "nvidia" then [ "--runtime=nvidia" ] else if gpuAcceleration.type == "intel" || "amd" then [ "--device=/dev/dri:/dev/dri" ] else [] ); environment = mkContainerEnvironment jellyfin.user.id groups.media.id // {JELLYFIN_PublishedServerUrl = jellyfin.domain;} // optionalAttrs (gpuAcceleration.enable && gpuAcceleration.type == "nvidia") { NVIDIA_VISIBLE_DEVICES = "all"; }; }; }; }; }