{ description = "A very basic flake"; inputs = { nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; }; outputs = { self, nixpkgs }: let inherit (nixpkgs) lib; scan'directory = scan (name: type: if type == "directory" then name else null); scan'regular = scan (name: type: if type == "regular" then name else null); scan'nix = let stem = lib.strings.removeSuffix ".nix"; in scan (name: type: if type == "regular" && name == "${stem name}.nix" then stem name else null); per-pkgs = fn: builtins.mapAttrs (_: fn) nixpkgs.legacyPackages; scan = filter: fn: base: let empty = { }; create = name: entry: lib.optionalAttrs (name != null) { ${name} = fn name (base + "/${entry}"); }; fold = acc: name: kind: acc // create (filter name kind) name; files = lib.optionalAttrs (builtins.pathExists base) (builtins.readDir base); in lib.attrsets.foldlAttrs fold empty files; scope = pkgs: lib.makeScope pkgs.newScope ( self: lib.packagesFromDirectoryRecursive { callPackage = self.callPackage; directory = ./package; } // { jellyfin = ( self.callPackage ./package/jellyfin/package.nix { jellyfin = pkgs.jellyfin; } ); } // lib.attrsets.mapAttrs' (name: value: { name = "jellyfin-plugin-${name}"; value = value; }) ( lib.packagesFromDirectoryRecursive { callPackage = self.callPackage; directory = ./plugin; } ) ); in { overlay = final: scope; legacyPackages = per-pkgs scope; packages = per-pkgs (pkgs: lib.filterAttrs (_: lib.isDerivation) (scope pkgs)); nixosModules.default = import ./module/default.nix scope; formatter = per-pkgs ({ nixfmt-tree, ... }: nixfmt-tree); }; }