Compare commits
No commits in common. "794925acb2176f6257d3bc832b7d8023dd546019" and "0a0097f6de08f8ab976ca51cb1d856cd10e80221" have entirely different histories.
794925acb2
...
0a0097f6de
14 changed files with 391 additions and 497 deletions
6
flake.lock
generated
6
flake.lock
generated
|
|
@ -2,11 +2,11 @@
|
|||
"nodes": {
|
||||
"nixpkgs": {
|
||||
"locked": {
|
||||
"lastModified": 1764242076,
|
||||
"narHash": "sha256-sKoIWfnijJ0+9e4wRvIgm/HgE27bzwQxcEmo2J/gNpI=",
|
||||
"lastModified": 1758198701,
|
||||
"narHash": "sha256-7To75JlpekfUmdkUZewnT6MoBANS0XVypW6kjUOXQwc=",
|
||||
"owner": "nixos",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "2fad6eac6077f03fe109c4d4eb171cf96791faa4",
|
||||
"rev": "0147c2f1d54b30b5dd6d4a8c8542e8d7edf93b5d",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
|
|
|
|||
92
flake.nix
92
flake.nix
|
|
@ -2,7 +2,7 @@
|
|||
description = "A very basic flake";
|
||||
|
||||
inputs = {
|
||||
nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
|
||||
nixpkgs.url = "github:nixos/nixpkgs?ref=nixos-unstable";
|
||||
};
|
||||
|
||||
outputs =
|
||||
|
|
@ -10,6 +10,16 @@
|
|||
let
|
||||
inherit (nixpkgs) lib;
|
||||
|
||||
overlay =
|
||||
final: pkgs:
|
||||
(packages pkgs)
|
||||
// lib.attrsets.mapAttrs' (name: value: {
|
||||
name = "jellyfin-plugin-${name}";
|
||||
inherit value;
|
||||
}) (plugins final);
|
||||
|
||||
pkgs' = pkgs: pkgs.extend overlay;
|
||||
|
||||
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 =
|
||||
|
|
@ -35,42 +45,64 @@
|
|||
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;
|
||||
packages =
|
||||
pkgs:
|
||||
let
|
||||
package =
|
||||
name: path:
|
||||
let
|
||||
pkg = (pkgs' pkgs).callPackage path {
|
||||
original = pkgs.${name} or null;
|
||||
};
|
||||
patches = scan (name: type: if lib.strings.removeSuffix ".patch" name != name then name else null) (
|
||||
name: path: path
|
||||
) path;
|
||||
in
|
||||
pkg.overrideAttrs (
|
||||
final: prev: {
|
||||
patches = (prev.patches or [ ]) ++ builtins.attrValues patches;
|
||||
}
|
||||
);
|
||||
}
|
||||
//
|
||||
lib.attrsets.mapAttrs'
|
||||
(name: value: {
|
||||
name = "jellyfin-plugin-${name}";
|
||||
value = value;
|
||||
})
|
||||
(
|
||||
lib.packagesFromDirectoryRecursive {
|
||||
callPackage = self.callPackage;
|
||||
directory = ./plugin;
|
||||
}
|
||||
)
|
||||
);
|
||||
|
||||
in
|
||||
scan'directory package ./package;
|
||||
|
||||
plugins =
|
||||
pkgs:
|
||||
let
|
||||
plugin = name: path: (pkgs' pkgs).jellyfin.plugin path { };
|
||||
in
|
||||
scan'directory plugin ./plugin;
|
||||
|
||||
in
|
||||
{
|
||||
overlay = final: scope;
|
||||
overlays.default = overlay;
|
||||
|
||||
legacyPackages = per-pkgs scope;
|
||||
packages = per-pkgs (
|
||||
pkgs:
|
||||
(packages pkgs)
|
||||
// lib.attrsets.mapAttrs' (name: value: {
|
||||
name = "plugin-${name}";
|
||||
inherit value;
|
||||
}) (plugins pkgs)
|
||||
);
|
||||
|
||||
packages = per-pkgs (pkgs: lib.filterAttrs (_: lib.isDerivation) (scope pkgs));
|
||||
|
||||
nixosModules.default = import ./module/default.nix scope;
|
||||
nixosModules =
|
||||
let
|
||||
directories = scan'directory (_: path: path) ./module;
|
||||
files = scan'nix (_: path: path) ./module;
|
||||
modules = directories // {
|
||||
default.imports = builtins.attrValues files ++ (directories.default or [ ]);
|
||||
};
|
||||
module =
|
||||
name: defs:
|
||||
{ ... }:
|
||||
builtins.trace "module: jellyfin.${name}" {
|
||||
imports = lib.toList defs;
|
||||
config.nixpkgs.overlays = [ overlay ];
|
||||
};
|
||||
in
|
||||
builtins.mapAttrs module modules;
|
||||
|
||||
formatter = per-pkgs ({ nixfmt-tree, ... }: nixfmt-tree);
|
||||
};
|
||||
|
|
|
|||
|
|
@ -1,18 +1,15 @@
|
|||
scope:
|
||||
{
|
||||
lib,
|
||||
pkgs,
|
||||
config,
|
||||
lib,
|
||||
...
|
||||
}:
|
||||
let
|
||||
cfg = config.services.jellyfin;
|
||||
|
||||
plugin = name: (scope pkgs)."jellyfin-plugin-${name}".override {
|
||||
jellyfin = cfg.package;
|
||||
};
|
||||
plugin = name: pkgs."jellyfin-plugin-${name}";
|
||||
|
||||
libs = pkg: fn: lib.lists.foldl (acc: lib: acc ++ lib.toList (fn lib)) [ ] pkg.pluginLibraries;
|
||||
per-file = pkg: fn: lib.lists.foldl (acc: dll: acc ++ lib.toList (fn dll)) [ ] pkg.pluginLibraries;
|
||||
|
||||
serviceConfig =
|
||||
pkg:
|
||||
|
|
@ -25,13 +22,15 @@ let
|
|||
'';
|
||||
in
|
||||
{
|
||||
BindReadOnlyPaths = map (name: "${pkg}/${name}:${cfg.dataDir}/plugins/${pkg.name}/${name}") pkg.jellyfinPluginFiles;
|
||||
BindReadOnlyPaths = per-file pkg (
|
||||
name: "${pkg}/${name}.dll:${cfg.dataDir}/plugins/${pkg.name}/${name}.dll"
|
||||
);
|
||||
BindPaths = [
|
||||
"${cfg.dataDir}/plugins/${pkg.name}/meta.json"
|
||||
];
|
||||
};
|
||||
|
||||
type.plugin = lib.types.addCheck lib.types.package (builtins.hasAttr "jellyfinPluginFiles");
|
||||
type.plugin = lib.types.addCheck lib.types.package (builtins.hasAttr "pluginLibraries");
|
||||
in
|
||||
{
|
||||
options.services.jellyfin.plugins = lib.mkOption {
|
||||
|
|
@ -42,7 +41,7 @@ in
|
|||
config.systemd = lib.mkIf (cfg.plugins != { }) {
|
||||
services.jellyfin.serviceConfig = lib.mkMerge (
|
||||
[
|
||||
{ BindPaths = [ "${cfg.dataDir}/plugins" ]; }
|
||||
{ TemporaryFileSystem = [ "${cfg.dataDir}/plugins:ro" ]; }
|
||||
{ BindPaths = [ "${cfg.dataDir}/plugins/configurations/" ]; }
|
||||
]
|
||||
++ builtins.map serviceConfig cfg.plugins
|
||||
|
|
@ -1,146 +0,0 @@
|
|||
{
|
||||
lib,
|
||||
newScope,
|
||||
|
||||
dotnetCorePackages,
|
||||
buildDotnetModule,
|
||||
fetchJellyfinPlugin,
|
||||
jellyfin,
|
||||
jprm,
|
||||
unzip,
|
||||
}@args:
|
||||
let
|
||||
buildJellyfinPlugin = (lib.makeScope newScope (_: args)).callPackage package;
|
||||
|
||||
capitalize =
|
||||
str:
|
||||
let
|
||||
length = builtins.stringLength str;
|
||||
head = builtins.substring 0 1 str;
|
||||
tail = builtins.substring 1 length str;
|
||||
in
|
||||
"${lib.strings.toUpper head}${tail}";
|
||||
|
||||
package =
|
||||
{
|
||||
lib,
|
||||
name,
|
||||
version,
|
||||
|
||||
dotnetCorePackages,
|
||||
buildDotnetModule,
|
||||
fetchJellyfinPlugin,
|
||||
jellyfin,
|
||||
jprm,
|
||||
unzip,
|
||||
|
||||
...
|
||||
}@params:
|
||||
let
|
||||
self = buildJellyfinPlugin params;
|
||||
|
||||
project = params.project or "Jellyfin.Plugin.${capitalize name}";
|
||||
|
||||
pluginLibraries = params.pluginLibraries or lib.attrsets.foldlAttrs (
|
||||
acc: name: value:
|
||||
acc ++ lib.optional (value == "directory") name
|
||||
) [ ] (builtins.readDir "${self.src}/src");
|
||||
dlls = builtins.map (name: "${name}.dll") pluginLibraries;
|
||||
|
||||
defaults = {
|
||||
pname = "jellyfin-plugin-${name}";
|
||||
version = version;
|
||||
description = "${name} plugin for ${jellyfin.name}";
|
||||
projectFile = "src/${project}/${project}.csproj";
|
||||
dotnet-sdk = dotnetCorePackages.sdk_9_0;
|
||||
dotnet-runtime = jellyfin.dotnet-runtime;
|
||||
dontDotnetBuild = true;
|
||||
dontDotnetInstall = true;
|
||||
src = fetchJellyfinPlugin {
|
||||
inherit name version;
|
||||
tag = "v${builtins.head (builtins.splitVersion version)}";
|
||||
hash = params.hash or "";
|
||||
};
|
||||
};
|
||||
|
||||
override =
|
||||
(lib.attrsets.removeAttrs params (
|
||||
builtins.attrNames (lib.functionArgs package)
|
||||
++ [
|
||||
"project"
|
||||
"pluginLibraries"
|
||||
]
|
||||
))
|
||||
// {
|
||||
inherit jellyfin;
|
||||
jellyfinPluginFiles = (params.jellyfinPluginFiles or []) ++ dlls;
|
||||
meta = {
|
||||
inherit (jellyfin.meta) license homepage;
|
||||
maintaner = [ "nonapode@fbs42.ddnss.de" ];
|
||||
}
|
||||
// (params.meta or { });
|
||||
|
||||
nativeBuildInputs = (params.nativeBuildInputs or [ ]) ++ [
|
||||
jprm
|
||||
unzip
|
||||
];
|
||||
outputs = (params.outputs or [ ]) ++ [
|
||||
"out"
|
||||
"zip"
|
||||
];
|
||||
prePatch = ''
|
||||
sed --sandbox --separate \
|
||||
-e 's:\(PackageReference Include="Jellyfin\..*" Version="\)[^"]\+":\1${jellyfin.version}":' \
|
||||
-e 's:<\(enerateDocumentationFile\|TreatWarningsAsErrors\)>true</\1>:<\1>false</\1>:' \
|
||||
-i ${lib.strings.escapeShellArgs (builtins.map (lib: "src/${lib}/${lib}.csproj") pluginLibraries)}
|
||||
|
||||
success=true
|
||||
for x in ${
|
||||
lib.strings.escapeShellArgs (builtins.map (lib: "src/${lib}/${lib}.csproj") pluginLibraries)
|
||||
}
|
||||
do
|
||||
diff -q $src/$x $x 2>/dev/null || continue
|
||||
printf >&2 'no change: %s\n' $x
|
||||
success=false
|
||||
done
|
||||
$success || exit 1
|
||||
''
|
||||
+ (params.prePatch or "");
|
||||
|
||||
postInstall = (params.postInstall or "") + ''
|
||||
tmp_output_dir="$(mktemp -d)"
|
||||
jprm plugin build . --output="''${tmp_output_dir}" --version="${version}" --dotnet-configuration="''${dotnetBuildType-Release}"
|
||||
env
|
||||
mv "''${tmp_output_dir}/${name}_${version}.zip" $zip
|
||||
mkdir -p $out
|
||||
unzip $zip -d $out
|
||||
|
||||
success=true
|
||||
for file in $out/*;
|
||||
do
|
||||
case "''${file##*/}" in
|
||||
meta.json)
|
||||
;;
|
||||
${builtins.concatStringsSep "|" (builtins.map lib.strings.escapeShellArg dlls)}) ;;
|
||||
*)
|
||||
printf 'unknown file: %s\n' ''${file@Q}
|
||||
success=false
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
for file in meta.json ${lib.strings.escapeShellArgs dlls}
|
||||
do
|
||||
[[ -f "$out/$file" ]] && continue
|
||||
printf 'missing file: %s\n' ''${file@Q}
|
||||
success=false
|
||||
done
|
||||
|
||||
$success || exit 42
|
||||
'';
|
||||
};
|
||||
|
||||
in
|
||||
buildDotnetModule (defaults // override);
|
||||
in
|
||||
buildJellyfinPlugin
|
||||
|
|
@ -1,35 +0,0 @@
|
|||
{
|
||||
lib,
|
||||
fetchFromGitHub,
|
||||
newScope,
|
||||
}@args:
|
||||
let
|
||||
fetchJellyfinPlugin = (lib.makeScope newScope (_: args)).callPackage package;
|
||||
|
||||
package =
|
||||
{
|
||||
name,
|
||||
fetchFromGitHub,
|
||||
...
|
||||
}@args:
|
||||
let
|
||||
self = fetchJellyfinPlugin args;
|
||||
|
||||
extraArgs = lib.attrsets.removeAttrs args (builtins.attrNames (lib.functionArgs package));
|
||||
owner = args.owner or "jellyfin";
|
||||
repo = args.repo or "jellyfin-plugin-${args.name}";
|
||||
name = builtins.concatStringsSep "-" (
|
||||
[ repo ] ++ lib.optional (args ? version) args.version ++ [ "source" ]
|
||||
);
|
||||
|
||||
in
|
||||
fetchFromGitHub (
|
||||
{
|
||||
inherit owner repo name;
|
||||
passthru.override = self.override;
|
||||
}
|
||||
// extraArgs
|
||||
);
|
||||
|
||||
in
|
||||
fetchJellyfinPlugin
|
||||
19
package/jellyfin/default.nix
Normal file
19
package/jellyfin/default.nix
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
{
|
||||
original,
|
||||
callPackage,
|
||||
}:
|
||||
let
|
||||
jellyfin = original.overrideAttrs (
|
||||
final: prev:
|
||||
assert !prev ? "plugin";
|
||||
{
|
||||
passthru.plugin =
|
||||
base:
|
||||
callPackage ./plugin.nix {
|
||||
plugin = base;
|
||||
jellyfin = jellyfin;
|
||||
};
|
||||
}
|
||||
);
|
||||
in
|
||||
jellyfin
|
||||
|
|
@ -1,23 +0,0 @@
|
|||
{
|
||||
pkgs,
|
||||
lib,
|
||||
jellyfin,
|
||||
fetchFromGitHub,
|
||||
|
||||
gnused,
|
||||
jprm,
|
||||
unzip,
|
||||
dotnetCorePackages,
|
||||
buildDotnetModule,
|
||||
...
|
||||
}: jellyfin.overrideAttrs (
|
||||
final: { passthru ? {}, ...}@prev: {
|
||||
passthru = passthru // {
|
||||
plugins = lib.attrsets.foldlAttrs
|
||||
(acc: name: value: assert (builtins.trace name true); if lib.strings.hasPrefix "jellyfin-plugin-" name
|
||||
then acc // {
|
||||
${lib.strings.substring (builtins.stringLength "jellyfin-plugin-") (builtins.stringLength name) name} = value;
|
||||
} else acc) {} pkgs;
|
||||
};
|
||||
}
|
||||
)
|
||||
153
package/jellyfin/plugin.nix
Normal file
153
package/jellyfin/plugin.nix
Normal file
|
|
@ -0,0 +1,153 @@
|
|||
{
|
||||
lib,
|
||||
jellyfin,
|
||||
plugin,
|
||||
fetchFromGitHub,
|
||||
buildDotnetModule,
|
||||
gnused,
|
||||
jprm,
|
||||
unzip,
|
||||
dotnetCorePackages,
|
||||
callPackage,
|
||||
}:
|
||||
let
|
||||
drv =
|
||||
args:
|
||||
let
|
||||
meta = from: { inherit (from) license homepage description; };
|
||||
|
||||
capitalize =
|
||||
upper: str:
|
||||
let
|
||||
length = builtins.stringLength str;
|
||||
head = builtins.substring 0 1 str;
|
||||
tail = builtins.substring 1 length str;
|
||||
in
|
||||
"${upper head}${tail}";
|
||||
|
||||
helper = {
|
||||
base = plugin;
|
||||
name = builtins.baseNameOf info.base;
|
||||
self = info;
|
||||
owner = "jellyfin";
|
||||
repo = "jellyfin-plugin-${info.name}";
|
||||
hash = "sha256-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=";
|
||||
rev = "v${info.version}";
|
||||
description = "${info.name} plugin for jellyfin";
|
||||
homepage = jellyfin.meta.homepage;
|
||||
license = jellyfin.meta.license;
|
||||
mkPlugin = info: result: buildDotnetModule result;
|
||||
inherit jellyfin;
|
||||
ignore = builtins.attrNames helper ++ [
|
||||
"override" "overrideAttrs" "overrideDerivation"
|
||||
];
|
||||
};
|
||||
|
||||
defaults = {
|
||||
pname = "jellyfin-plugin-${info.name}";
|
||||
nugetDeps =
|
||||
let
|
||||
options = builtins.filter builtins.pathExists [
|
||||
"${info.base}/deps.json"
|
||||
];
|
||||
in
|
||||
assert options != [ ];
|
||||
builtins.head options;
|
||||
pluginLibraries = lib.attrsets.foldlAttrs (
|
||||
acc: name: value:
|
||||
acc ++ lib.optional (value == "directory") name
|
||||
) [ ] (builtins.readDir ("${info.src}/src"));
|
||||
dotnet-sdk = dotnetCorePackages.sdk_8_0;
|
||||
dotnet-runtime = dotnetCorePackages.aspnetcore_8_0;
|
||||
dontDotnetBuild = true;
|
||||
dontDotnetInstall = true;
|
||||
project = "Jellyfin.Plugin.${capitalize lib.strings.toUpper info.name}";
|
||||
prePatch = ''
|
||||
sed --sandbox --separate \
|
||||
-e 's:\(PackageReference Include="Jellyfin\..*" Version="\)[^"]\+":\1${info.jellyfin.version}":' \
|
||||
-e 's:<\(enerateDocumentationFile\|TreatWarningsAsErrors\)>true</\1>:<\1>false</\1>:' \
|
||||
-i ${
|
||||
lib.strings.escapeShellArgs (builtins.map (lib: "src/${lib}/${lib}.csproj") info.pluginLibraries)
|
||||
}
|
||||
|
||||
success=true
|
||||
for x in ${
|
||||
lib.strings.escapeShellArgs (builtins.map (lib: "src/${lib}/${lib}.csproj") info.pluginLibraries)
|
||||
}
|
||||
do
|
||||
diff -q $src/$x $x 2>/dev/null || continue
|
||||
printf >&2 'no change: %s\n' $x
|
||||
success=false
|
||||
done
|
||||
$success || exit 1
|
||||
'';
|
||||
projectFile = "src/${info.project}/${info.project}.csproj";
|
||||
src = fetchFromGitHub {
|
||||
owner = info.owner;
|
||||
repo = info.repo;
|
||||
inherit (info) rev hash;
|
||||
};
|
||||
nativeBuildInputs = [
|
||||
gnused
|
||||
jprm
|
||||
unzip
|
||||
];
|
||||
patches =
|
||||
lib.optional (builtins.pathExists "${info.base}.patch") "${info.base}.patch"
|
||||
++ lib.optionals (builtins.pathExists info.base) (
|
||||
lib.attrsets.foldlAttrs (
|
||||
acc: name: type:
|
||||
acc
|
||||
++ lib.optional (type == "regular" && lib.strings.hasSuffix ".patch" name) "${info.base}/${name}"
|
||||
) [ ] (builtins.readDir info.base)
|
||||
);
|
||||
outputs = [
|
||||
"out"
|
||||
"zip"
|
||||
];
|
||||
postInstall =
|
||||
let
|
||||
dlls = builtins.map (name: "${name}.dll") info.pluginLibraries;
|
||||
in
|
||||
''
|
||||
tmp_output_dir="$(mktemp -d)"
|
||||
jprm plugin build . --output="''${tmp_output_dir}" --version="${info.version}" --dotnet-configuration="''${dotnetBuildType-Release}"
|
||||
mv "''${tmp_output_dir}/${info.name}_${info.version}.zip" $zip
|
||||
mkdir -p $out
|
||||
unzip $zip -d $out
|
||||
|
||||
success=true
|
||||
for file in $out/*;
|
||||
do
|
||||
case "''${file##*/}" in
|
||||
meta.json)
|
||||
;;
|
||||
${builtins.concatStringsSep "|" (builtins.map lib.strings.escapeShellArg dlls)}) ;;
|
||||
*)
|
||||
printf 'unknown file: %s\n' ''${file@Q}
|
||||
success=false
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
for file in meta.json ${lib.strings.escapeShellArgs dlls}
|
||||
do
|
||||
[[ -f "$out/$file" ]] && continue
|
||||
printf 'missing file: %s\n' ''${file@Q}
|
||||
success=false
|
||||
done
|
||||
|
||||
$success || exit 42
|
||||
'';
|
||||
meta = meta jellyfin.meta // meta info;
|
||||
};
|
||||
info = helper // defaults // callPackage plugin ({ inherit info; } // args);
|
||||
in info.mkPlugin info (lib.attrsets.removeAttrs info info.ignore);
|
||||
|
||||
functor = args: (drv args).overrideAttrs (final: prev: {
|
||||
passthru = builtins.trace "override passthru" (prev.passthru or {}) // {
|
||||
in-version = { version, rev ? null, hash ? null }@args':
|
||||
callPackage functor (builtins.removeAttrs args [ "version" "rev" "hash" ] // args');
|
||||
};
|
||||
});
|
||||
in lib.trivial.mirrorFunctionArgs plugin functor
|
||||
|
|
@ -2,7 +2,7 @@ let
|
|||
v."1.1.1" = "sha256-PWgZ9K81RX+AboU8/6IGEQ8Fv/e8d2I1KH3+jIQOyj4=";
|
||||
current =
|
||||
lib:
|
||||
lib.lists.foldl (acc: v: if lib.strings.versionOlder acc v then v else acc) "0.0.0" (
|
||||
lib.lists.fold (acc: v: if lib.strings.versionOlder acc v then v else acc) "0.0.0" (
|
||||
builtins.attrNames v
|
||||
);
|
||||
in
|
||||
|
|
@ -21,7 +21,7 @@ python3Packages.buildPythonApplication {
|
|||
src = fetchFromGitHub {
|
||||
owner = "oddstr13";
|
||||
repo = "jellyfin-plugin-repository-manager";
|
||||
rev = "v${version}";
|
||||
tag = "v${version}";
|
||||
hash = hash;
|
||||
};
|
||||
|
||||
21
plugin/dlna/default.nix
Normal file
21
plugin/dlna/default.nix
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
let
|
||||
v."8.0.0.0" = {
|
||||
hash = "sha256-5YUX+w4n3nBhAkdgjF9D5yY/jzRKxpW+mTQCBluzsVI=";
|
||||
rev = "v8";
|
||||
};
|
||||
current =
|
||||
lib:
|
||||
lib.lists.fold (acc: v: if lib.strings.versionOlder acc v then v else acc) "0.0.0" (
|
||||
builtins.attrNames v
|
||||
);
|
||||
in
|
||||
{
|
||||
lib,
|
||||
version ? current lib,
|
||||
hash ? v.${version}.hash,
|
||||
rev ? v.${version}.rev or "v${version}",
|
||||
...
|
||||
}:
|
||||
{
|
||||
inherit version hash rev;
|
||||
}
|
||||
|
|
@ -1,13 +1,8 @@
|
|||
[
|
||||
{
|
||||
"pname": "BitFaster.Caching",
|
||||
"version": "2.5.4",
|
||||
"hash": "sha256-PWuVT1kKjL8ulMtv9hWmg0nMChFh8skr34xUl3mQ0Y8="
|
||||
},
|
||||
{
|
||||
"pname": "Diacritics",
|
||||
"version": "4.0.17",
|
||||
"hash": "sha256-O1pOeOV7c+dfD/EjwiOmqYhP5RDZyosVOk0OjVuK5Eg="
|
||||
"version": "3.3.29",
|
||||
"hash": "sha256-sIbdJ3yMthnmJHly3WheUdYjtwPakcczTJx9ycxtgrY="
|
||||
},
|
||||
{
|
||||
"pname": "ICU4N",
|
||||
|
|
@ -26,43 +21,33 @@
|
|||
},
|
||||
{
|
||||
"pname": "Jellyfin.Common",
|
||||
"version": "10.11.3",
|
||||
"hash": "sha256-d0rIKccKSGqKUoXGT5N+/Wfq5M6eM06WQEzL6CA5eao="
|
||||
"version": "10.10.7",
|
||||
"hash": "sha256-9EIigrDheob4vRP+UBAoIPHH4fyz6Cl27GUpelEGpBg="
|
||||
},
|
||||
{
|
||||
"pname": "Jellyfin.Controller",
|
||||
"version": "10.11.3",
|
||||
"hash": "sha256-Rudd5SwnQSwTkFATD7FCXIf3cdXmiHtQUXl8G+NW1k4="
|
||||
"version": "10.10.7",
|
||||
"hash": "sha256-/obWAuxWpSn+NlMES+fjyrf1g+qbxmSYQUBvgXQYltQ="
|
||||
},
|
||||
{
|
||||
"pname": "Jellyfin.Data",
|
||||
"version": "10.11.3",
|
||||
"hash": "sha256-e0eWPDTh1zgitbeOmg/M1c/fYL5/OLKzAtQZg48IUYg="
|
||||
},
|
||||
{
|
||||
"pname": "Jellyfin.Database.Implementations",
|
||||
"version": "10.11.3",
|
||||
"hash": "sha256-IP1jfyE/3Orzs1ZzIvv8V1qxfkfW9z7eRIZn5CE6WZQ="
|
||||
"version": "10.10.7",
|
||||
"hash": "sha256-lRQjg/HkFAtCN0woL1gX6j5dMfVLP/fzQTKjFTcRth4="
|
||||
},
|
||||
{
|
||||
"pname": "Jellyfin.Extensions",
|
||||
"version": "10.11.3",
|
||||
"hash": "sha256-dipmxz4qL4qo7i+ifrLBVMroUjzW5BkkGNrNwpDCVQw="
|
||||
},
|
||||
{
|
||||
"pname": "Jellyfin.MediaEncoding.Keyframes",
|
||||
"version": "10.11.3",
|
||||
"hash": "sha256-w9BtlQMOeNKj7B+qFtn5oVzaGfRqsGNvISjF4cE4m8k="
|
||||
"version": "10.10.7",
|
||||
"hash": "sha256-AOGJ2IoT2v+LnlEqnb2O4FnXapcQiH0V9ny8GUysNHg="
|
||||
},
|
||||
{
|
||||
"pname": "Jellyfin.Model",
|
||||
"version": "10.11.3",
|
||||
"hash": "sha256-3+ScXU/pWj+Ru1b74v5aWlqg/+XSuKAmqeFbrVYrqRg="
|
||||
"version": "10.10.7",
|
||||
"hash": "sha256-ubsClGTLq/aFnMiBCaHVUX2b88beuL07Yn5VXNbTCjQ="
|
||||
},
|
||||
{
|
||||
"pname": "Jellyfin.Naming",
|
||||
"version": "10.11.3",
|
||||
"hash": "sha256-oZ0qcARGOqAyvhdWMjdvuDVSuFYjyVd5TUpDdIMYRJs="
|
||||
"version": "10.10.7",
|
||||
"hash": "sha256-/jlIS0X4FuBo6Ac1cjLGzgdJ3vR6VotBspxpNrqfMzo="
|
||||
},
|
||||
{
|
||||
"pname": "Microsoft.AspNetCore.Authorization",
|
||||
|
|
@ -74,60 +59,30 @@
|
|||
"version": "8.0.10",
|
||||
"hash": "sha256-SxnMOWJGgUUQyKaRezJQwMUt4eMfWjnhmfk8pldYGNA="
|
||||
},
|
||||
{
|
||||
"pname": "Microsoft.EntityFrameworkCore",
|
||||
"version": "9.0.10",
|
||||
"hash": "sha256-Zm4oMVeloK2WmPskzg4l3SXjJuC+sRg3O5aiTK5rHvw="
|
||||
},
|
||||
{
|
||||
"pname": "Microsoft.EntityFrameworkCore.Abstractions",
|
||||
"version": "9.0.10",
|
||||
"hash": "sha256-FB+8WtFYKn1PH9R3pgKw7dNJiJDCcS78UkeRkxdOuCk="
|
||||
},
|
||||
{
|
||||
"pname": "Microsoft.EntityFrameworkCore.Analyzers",
|
||||
"version": "9.0.10",
|
||||
"hash": "sha256-q6w0uQ4qMAe2EuA65a3rk18rhGXuGVYMrdrIzD5Z+tw="
|
||||
},
|
||||
{
|
||||
"pname": "Microsoft.EntityFrameworkCore.Relational",
|
||||
"version": "9.0.10",
|
||||
"hash": "sha256-2XHQOKvs4mAXwl8vEZpdi6ZtDFhK2hPusRMFemu3Shw="
|
||||
},
|
||||
{
|
||||
"pname": "Microsoft.Extensions.Caching.Abstractions",
|
||||
"version": "2.0.0",
|
||||
"hash": "sha256-Eg1MES40kzkGW9tZmjaKtbWI00Kbv7fLJQmjrigjxqk="
|
||||
},
|
||||
{
|
||||
"pname": "Microsoft.Extensions.Caching.Abstractions",
|
||||
"version": "9.0.10",
|
||||
"hash": "sha256-W/9WhAG5t/hWPZxIL5+ILMsPKO/DjprHRymZUmU5YOA="
|
||||
},
|
||||
{
|
||||
"pname": "Microsoft.Extensions.Caching.Memory",
|
||||
"version": "2.0.0",
|
||||
"hash": "sha256-1fnNvp62KrviVwYlqVl1CbdaZVpCDah9eCZeNDGDbWM="
|
||||
},
|
||||
{
|
||||
"pname": "Microsoft.Extensions.Caching.Memory",
|
||||
"version": "9.0.10",
|
||||
"hash": "sha256-HIXNiUnBJaYN+QGzpTlHzkvkBwYmcU0QUlIgQDhVG5g="
|
||||
},
|
||||
{
|
||||
"pname": "Microsoft.Extensions.Configuration.Abstractions",
|
||||
"version": "9.0.10",
|
||||
"hash": "sha256-sRv0yS2sbyli7eejtnpmd7UIAz4PwSt5/Po5Irc1j98="
|
||||
"version": "8.0.0",
|
||||
"hash": "sha256-4eBpDkf7MJozTZnOwQvwcfgRKQGcNXe0K/kF+h5Rl8o="
|
||||
},
|
||||
{
|
||||
"pname": "Microsoft.Extensions.Configuration.Binder",
|
||||
"version": "9.0.10",
|
||||
"hash": "sha256-4NEBx28byvjjIzo0wQPIUUymk9AzSgPS4fu5IRxkIt4="
|
||||
"version": "8.0.2",
|
||||
"hash": "sha256-aGB0VuoC34YadAEqrwoaXLc5qla55pswDV2xLSmR7SE="
|
||||
},
|
||||
{
|
||||
"pname": "Microsoft.Extensions.DependencyInjection",
|
||||
"version": "9.0.10",
|
||||
"hash": "sha256-f3r2msA/oV9gGdFn9OEr5bPAfINR17P+sS6/2/NnCuk="
|
||||
"version": "8.0.1",
|
||||
"hash": "sha256-O9g0jWS+jfGoT3yqKwZYJGL+jGSIeSbwmvomKDC3hTU="
|
||||
},
|
||||
{
|
||||
"pname": "Microsoft.Extensions.DependencyInjection.Abstractions",
|
||||
|
|
@ -141,24 +96,19 @@
|
|||
},
|
||||
{
|
||||
"pname": "Microsoft.Extensions.DependencyInjection.Abstractions",
|
||||
"version": "9.0.10",
|
||||
"hash": "sha256-5rwFXG+Wjbf+TkXeWrkGVKV4wfvOryTPadEkEyPyKj4="
|
||||
"version": "8.0.2",
|
||||
"hash": "sha256-UfLfEQAkXxDaVPC7foE/J3FVEXd31Pu6uQIhTic3JgY="
|
||||
},
|
||||
{
|
||||
"pname": "Microsoft.Extensions.Logging",
|
||||
"version": "9.0.10",
|
||||
"hash": "sha256-/Et36NBhpMoxQzI+p/moW7knwYDfjI7Ma7DF7KIYn+Q="
|
||||
"version": "8.0.1",
|
||||
"hash": "sha256-vkfVw4tQEg86Xg18v6QO0Qb4Ysz0Njx57d1XcNuj6IU="
|
||||
},
|
||||
{
|
||||
"pname": "Microsoft.Extensions.Logging.Abstractions",
|
||||
"version": "8.0.2",
|
||||
"hash": "sha256-cHpe8X2BgYa5DzulZfq24rg8O2K5Lmq2OiLhoyAVgJc="
|
||||
},
|
||||
{
|
||||
"pname": "Microsoft.Extensions.Logging.Abstractions",
|
||||
"version": "9.0.10",
|
||||
"hash": "sha256-PtYXXHi+mbdQMh2QtA57NbWlt+JEpXiey36zLzbKTmo="
|
||||
},
|
||||
{
|
||||
"pname": "Microsoft.Extensions.Options",
|
||||
"version": "2.0.0",
|
||||
|
|
@ -169,11 +119,6 @@
|
|||
"version": "8.0.2",
|
||||
"hash": "sha256-AjcldddddtN/9aH9pg7ClEZycWtFHLi9IPe1GGhNQys="
|
||||
},
|
||||
{
|
||||
"pname": "Microsoft.Extensions.Options",
|
||||
"version": "9.0.10",
|
||||
"hash": "sha256-QTNhi83xhjJuIQ/3QffzQs/KY7avNyBMvnkuuSr3pBo="
|
||||
},
|
||||
{
|
||||
"pname": "Microsoft.Extensions.Primitives",
|
||||
"version": "2.0.0",
|
||||
|
|
@ -184,11 +129,6 @@
|
|||
"version": "8.0.0",
|
||||
"hash": "sha256-FU8qj3DR8bDdc1c+WeGZx/PCZeqqndweZM9epcpXjSo="
|
||||
},
|
||||
{
|
||||
"pname": "Microsoft.Extensions.Primitives",
|
||||
"version": "9.0.10",
|
||||
"hash": "sha256-It7NQ+Ap/hrqFX3LXDVJqVz1Xl3j8QIapYDcG2MQ/7w="
|
||||
},
|
||||
{
|
||||
"pname": "Microsoft.NETCore.Platforms",
|
||||
"version": "1.1.0",
|
||||
|
|
@ -199,21 +139,6 @@
|
|||
"version": "1.1.0",
|
||||
"hash": "sha256-0AqQ2gMS8iNlYkrD+BxtIg7cXMnr9xZHtKAuN4bjfaQ="
|
||||
},
|
||||
{
|
||||
"pname": "NEbml",
|
||||
"version": "1.1.0.5",
|
||||
"hash": "sha256-MrQLekP6z5y6rfqnCbLefkYv4Fm8di4HqZ/AiYTzBQ4="
|
||||
},
|
||||
{
|
||||
"pname": "Polly",
|
||||
"version": "8.6.4",
|
||||
"hash": "sha256-Z+ZbhnHWMu55qgQkxvw3yMiMd+zIMzzQiFhvn/PeQ3I="
|
||||
},
|
||||
{
|
||||
"pname": "Polly.Core",
|
||||
"version": "8.6.4",
|
||||
"hash": "sha256-4Xrg/H481Y/WOHk1sGvFNEOfgaGrdKi+4U54PTXhh9I="
|
||||
},
|
||||
{
|
||||
"pname": "runtime.any.System.Globalization",
|
||||
"version": "4.3.0",
|
||||
|
|
@ -249,14 +174,19 @@
|
|||
"version": "4.3.0",
|
||||
"hash": "sha256-51813WXpBIsuA6fUtE5XaRQjcWdQ2/lmEokJt97u0Rg="
|
||||
},
|
||||
{
|
||||
"pname": "System.Runtime.CompilerServices.Unsafe",
|
||||
"version": "4.4.0",
|
||||
"hash": "sha256-SeTI4+yVRO2SmAKgOrMni4070OD+Oo8L1YiEVeKDyig="
|
||||
},
|
||||
{
|
||||
"pname": "System.Text.Json",
|
||||
"version": "9.0.10",
|
||||
"hash": "sha256-wqeobpRw3PqOw21q8oGvauj5BkX1pS02Cm78E6c742w="
|
||||
"version": "8.0.5",
|
||||
"hash": "sha256-yKxo54w5odWT6nPruUVsaX53oPRe+gKzGvLnnxtwP68="
|
||||
},
|
||||
{
|
||||
"pname": "System.Threading.Tasks.Dataflow",
|
||||
"version": "9.0.10",
|
||||
"hash": "sha256-V3UjIEGn9Yrl/DQoKeEVg9pDpp4iNz8r9+WmQ09R1bg="
|
||||
"version": "8.0.1",
|
||||
"hash": "sha256-hgCfF91BDd/eOtLEd5jhjzgJdvwmVv4/b42fXRr3nvo="
|
||||
}
|
||||
]
|
||||
|
|
|
|||
|
|
@ -1,56 +0,0 @@
|
|||
let
|
||||
v."8.0.0.0" = {
|
||||
hash = "sha256-5YUX+w4n3nBhAkdgjF9D5yY/jzRKxpW+mTQCBluzsVI=";
|
||||
rev = "v8";
|
||||
};
|
||||
v."10.0.0.0" = {
|
||||
hash = "sha256-pPhMmH17RKktIX16ozSxsigxo6tU8tlST4IAm3vpjrw=";
|
||||
rev = "v10";
|
||||
};
|
||||
|
||||
latest =
|
||||
lib:
|
||||
builtins.foldl' (acc: next: if lib.versionOlder acc next then next else acc) "0" (
|
||||
builtins.attrNames v
|
||||
);
|
||||
|
||||
plugin =
|
||||
{
|
||||
lib,
|
||||
buildJellyfinPlugin,
|
||||
fetchJellyfinPlugin,
|
||||
...
|
||||
}@params:
|
||||
let
|
||||
argNames = builtins.attrNames (lib.trivial.functionArgs plugin) ++ [
|
||||
"name"
|
||||
"version"
|
||||
"hash"
|
||||
];
|
||||
extraArgs = lib.attrsets.removeAttrs params argNames;
|
||||
|
||||
self = plugin params;
|
||||
|
||||
name = params.name or "dlna";
|
||||
version = params.version or (latest lib); # "10.0.0.0"; # TODO latest
|
||||
defaultRev = {
|
||||
tag = "v${lib.versions.major version}";
|
||||
hash = params.hash or "";
|
||||
};
|
||||
|
||||
args = {
|
||||
name = name;
|
||||
version = args.src.version or version;
|
||||
nugetDeps = ./deps.json;
|
||||
src = fetchJellyfinPlugin (
|
||||
{
|
||||
inherit name version;
|
||||
}
|
||||
// (v.${version} or defaultRev)
|
||||
);
|
||||
}
|
||||
// extraArgs;
|
||||
in
|
||||
buildJellyfinPlugin args;
|
||||
in
|
||||
plugin
|
||||
Loading…
Add table
Add a link
Reference in a new issue