commit
d73a492e83
@ -0,0 +1,54 @@ |
||||
# Global configuration for the SSH client. |
||||
|
||||
{ config, lib, pkgs, ... }: |
||||
|
||||
with lib; |
||||
|
||||
let |
||||
cfg = config.programs.turbovnc; |
||||
in |
||||
{ |
||||
options = { |
||||
|
||||
programs.turbovnc = { |
||||
|
||||
ensureHeadlessSoftwareOpenGL = mkOption { |
||||
type = types.bool; |
||||
default = false; |
||||
description = '' |
||||
Whether to set up NixOS such that TurboVNC's built-in software OpenGL |
||||
implementation works. |
||||
|
||||
This will enable <option>hardware.opengl.enable</option> so that OpenGL |
||||
programs can find Mesa's llvmpipe drivers. |
||||
|
||||
Setting this option to <code>false</code> does not mean that software |
||||
OpenGL won't work; it may still work depending on your system |
||||
configuration. |
||||
|
||||
This option is also intended to generate warnings if you are using some |
||||
configuration that's incompatible with using headless software OpenGL |
||||
in TurboVNC. |
||||
''; |
||||
}; |
||||
|
||||
}; |
||||
|
||||
}; |
||||
|
||||
config = mkIf cfg.ensureHeadlessSoftwareOpenGL { |
||||
|
||||
# TurboVNC has builtin support for Mesa llvmpipe's `swrast` |
||||
# software rendering to implemnt GLX (OpenGL on Xorg). |
||||
# However, just building TurboVNC with support for that is not enough |
||||
# (it only takes care of the X server side part of OpenGL); |
||||
# the indiviudual applications (e.g. `glxgears`) also need to directly load |
||||
# the OpenGL libs. |
||||
# Thus, this creates `/run/opengl-driver` populated by Mesa so that the applications |
||||
# can find the llvmpipe `swrast.so` software rendering DRI lib via `libglvnd`. |
||||
# This comment exists to explain why `hardware.` is involved, |
||||
# even though 100% software rendering is used. |
||||
hardware.opengl.enable = true; |
||||
|
||||
}; |
||||
} |
@ -0,0 +1,171 @@ |
||||
import ./make-test-python.nix ({ pkgs, lib, ... }: { |
||||
name = "turbovnc-headless-server"; |
||||
meta = { |
||||
maintainers = with lib.maintainers; [ nh2 ]; |
||||
}; |
||||
|
||||
machine = { pkgs, ... }: { |
||||
|
||||
environment.systemPackages = with pkgs; [ |
||||
glxinfo |
||||
procps # for `pkill`, `pidof` in the test |
||||
scrot # for screenshotting Xorg |
||||
turbovnc |
||||
]; |
||||
|
||||
programs.turbovnc.ensureHeadlessSoftwareOpenGL = true; |
||||
|
||||
networking.firewall = { |
||||
# Reject instead of drop, for failures instead of hangs. |
||||
rejectPackets = true; |
||||
allowedTCPPorts = [ |
||||
5900 # VNC :0, for seeing what's going on in the server |
||||
]; |
||||
}; |
||||
|
||||
# So that we can ssh into the VM, see e.g. |
||||
# http://blog.patapon.info/nixos-local-vm/#accessing-the-vm-with-ssh |
||||
services.openssh.enable = true; |
||||
services.openssh.permitRootLogin = "yes"; |
||||
users.extraUsers.root.password = ""; |
||||
users.mutableUsers = false; |
||||
}; |
||||
|
||||
testScript = '' |
||||
def wait_until_terminated_or_succeeds( |
||||
termination_check_shell_command, |
||||
success_check_shell_command, |
||||
get_detail_message_fn, |
||||
retries=60, |
||||
retry_sleep=0.5, |
||||
): |
||||
def check_success(): |
||||
command_exit_code, _output = machine.execute(success_check_shell_command) |
||||
return command_exit_code == 0 |
||||
|
||||
for _ in range(retries): |
||||
exit_check_exit_code, _output = machine.execute(termination_check_shell_command) |
||||
is_terminated = exit_check_exit_code != 0 |
||||
if is_terminated: |
||||
if check_success(): |
||||
return |
||||
else: |
||||
details = get_detail_message_fn() |
||||
raise Exception( |
||||
f"termination check ({termination_check_shell_command}) triggered without command succeeding ({success_check_shell_command}); details: {details}" |
||||
) |
||||
else: |
||||
if check_success(): |
||||
return |
||||
time.sleep(retry_sleep) |
||||
|
||||
if not check_success(): |
||||
details = get_detail_message_fn() |
||||
raise Exception( |
||||
f"action timed out ({success_check_shell_command}); details: {details}" |
||||
) |
||||
|
||||
|
||||
# Below we use the pattern: |
||||
# (cmd | tee stdout.log) 3>&1 1>&2 2>&3 | tee stderr.log |
||||
# to capture both stderr and stdout while also teeing them, see: |
||||
# https://unix.stackexchange.com/questions/6430/how-to-redirect-stderr-and-stdout-to-different-files-and-also-display-in-termina/6431#6431 |
||||
|
||||
|
||||
# Starts headless VNC server, backgrounding it. |
||||
def start_xvnc(): |
||||
xvnc_command = " ".join( |
||||
[ |
||||
"Xvnc", |
||||
":0", |
||||
"-iglx", |
||||
"-auth /root/.Xauthority", |
||||
"-geometry 1240x900", |
||||
"-depth 24", |
||||
"-rfbwait 5000", |
||||
"-deferupdate 1", |
||||
"-verbose", |
||||
"-securitytypes none", |
||||
# We don't enforce localhost listening such that we |
||||
# can connect from outside the VM using |
||||
# env QEMU_NET_OPTS=hostfwd=tcp::5900-:5900 $(nix-build nixos/tests/turbovnc-headless-server.nix -A driver)/bin/nixos-test-driver |
||||
# for testing purposes, and so that we can in the future |
||||
# add another test case that connects the TurboVNC client. |
||||
# "-localhost", |
||||
] |
||||
) |
||||
machine.execute( |
||||
# Note trailing & for backgrounding. |
||||
f"({xvnc_command} | tee /tmp/Xvnc.stdout) 3>&1 1>&2 2>&3 | tee /tmp/Xvnc.stderr &", |
||||
) |
||||
|
||||
|
||||
# Waits until the server log message that tells us that GLX is ready |
||||
# (requires `-verbose` above), avoiding screenshoting racing below. |
||||
def wait_until_xvnc_glx_ready(): |
||||
machine.wait_until_succeeds("test -f /tmp/Xvnc.stderr") |
||||
wait_until_terminated_or_succeeds( |
||||
termination_check_shell_command="pidof Xvnc", |
||||
success_check_shell_command="grep 'GLX: Initialized DRISWRAST' /tmp/Xvnc.stderr", |
||||
get_detail_message_fn=lambda: "Contents of /tmp/Xvnc.stderr:\n" |
||||
+ machine.succeed("cat /tmp/Xvnc.stderr"), |
||||
) |
||||
|
||||
|
||||
# Checks that we detect glxgears failing when |
||||
# `LIBGL_DRIVERS_PATH=/nonexistent` is set |
||||
# (in which case software rendering should not work). |
||||
def test_glxgears_failing_with_bad_driver_path(): |
||||
machine.execute( |
||||
# Note trailing & for backgrounding. |
||||
"(env DISPLAY=:0 LIBGL_DRIVERS_PATH=/nonexistent glxgears -info | tee /tmp/glxgears-should-fail.stdout) 3>&1 1>&2 2>&3 | tee /tmp/glxgears-should-fail.stderr &" |
||||
) |
||||
machine.wait_until_succeeds("test -f /tmp/glxgears-should-fail.stderr") |
||||
wait_until_terminated_or_succeeds( |
||||
termination_check_shell_command="pidof glxgears", |
||||
success_check_shell_command="grep 'libGL error: failed to load driver: swrast' /tmp/glxgears-should-fail.stderr", |
||||
get_detail_message_fn=lambda: "Contents of /tmp/glxgears-should-fail.stderr:\n" |
||||
+ machine.succeed("cat /tmp/glxgears-should-fail.stderr"), |
||||
) |
||||
machine.wait_until_fails("pidof glxgears") |
||||
|
||||
|
||||
# Starts glxgears, backgrounding it. Waits until it prints the `GL_RENDERER`. |
||||
# Does not quit glxgears. |
||||
def test_glxgears_prints_renderer(): |
||||
machine.execute( |
||||
# Note trailing & for backgrounding. |
||||
"(env DISPLAY=:0 glxgears -info | tee /tmp/glxgears.stdout) 3>&1 1>&2 2>&3 | tee /tmp/glxgears.stderr &" |
||||
) |
||||
machine.wait_until_succeeds("test -f /tmp/glxgears.stderr") |
||||
wait_until_terminated_or_succeeds( |
||||
termination_check_shell_command="pidof glxgears", |
||||
success_check_shell_command="grep 'GL_RENDERER' /tmp/glxgears.stdout", |
||||
get_detail_message_fn=lambda: "Contents of /tmp/glxgears.stderr:\n" |
||||
+ machine.succeed("cat /tmp/glxgears.stderr"), |
||||
) |
||||
|
||||
|
||||
with subtest("Start Xvnc"): |
||||
start_xvnc() |
||||
wait_until_xvnc_glx_ready() |
||||
|
||||
with subtest("Ensure bad driver path makes glxgears fail"): |
||||
test_glxgears_failing_with_bad_driver_path() |
||||
|
||||
with subtest("Run 3D application (glxgears)"): |
||||
test_glxgears_prints_renderer() |
||||
|
||||
# Take screenshot; should display the glxgears. |
||||
machine.succeed("scrot --display :0 /tmp/glxgears.png") |
||||
|
||||
# Copy files down. |
||||
machine.copy_from_vm("/tmp/glxgears.png") |
||||
machine.copy_from_vm("/tmp/glxgears.stdout") |
||||
machine.copy_from_vm("/tmp/glxgears-should-fail.stdout") |
||||
machine.copy_from_vm("/tmp/glxgears-should-fail.stderr") |
||||
machine.copy_from_vm("/tmp/Xvnc.stdout") |
||||
machine.copy_from_vm("/tmp/Xvnc.stderr") |
||||
''; |
||||
|
||||
}) |
@ -0,0 +1,23 @@ |
||||
{ writeShellScript |
||||
, nix |
||||
, curl |
||||
, gzip |
||||
, xmlstarlet |
||||
, common-updater-scripts |
||||
}: |
||||
|
||||
{ attrPath }: |
||||
|
||||
let |
||||
url = "http://mirrors.kodi.tv/addons/matrix/addons.xml.gz"; |
||||
updateScript = writeShellScript "update.sh" '' |
||||
set -ex |
||||
|
||||
attrPath=$1 |
||||
namespace=$(${nix}/bin/nix-instantiate $systemArg --eval -E "with import ./. {}; $attrPath.namespace" | tr -d '"') |
||||
version=$(${curl}/bin/curl -s -L ${url} | ${gzip}/bin/gunzip -c | ${xmlstarlet}/bin/xml select -T -t -m "//addons/addon[@id='$namespace']" -v @version) |
||||
|
||||
${common-updater-scripts}/bin/update-source-version "$attrPath" "$version" |
||||
''; |
||||
in |
||||
[ updateScript attrPath ] |
@ -0,0 +1,21 @@ |
||||
{ lib, buildKodiAddon, fetchzip, addonUpdateScript }: |
||||
buildKodiAddon rec { |
||||
pname = "certifi"; |
||||
namespace = "script.module.certifi"; |
||||
version = "2019.11.28+matrix.1"; |
||||
|
||||
src = fetchzip { |
||||
url = "https://mirrors.kodi.tv/addons/matrix/${namespace}/${namespace}-${version}.zip"; |
||||
sha256 = "0vsd68izv1ix0hb1gm74qq3zff0sxmhfhjyh7y9005zzp2gpi62v"; |
||||
}; |
||||
|
||||
passthru.updateScript = addonUpdateScript { |
||||
attrPath = "kodi.packages.certifi"; |
||||
}; |
||||
|
||||
meta = with lib; { |
||||
homepage = "https://certifi.io"; |
||||
description = "Python package for providing Mozilla's CA Bundle"; |
||||
license = licenses.mpl20; |
||||
}; |
||||
} |
@ -0,0 +1,21 @@ |
||||
{ lib, buildKodiAddon, fetchzip, addonUpdateScript }: |
||||
buildKodiAddon rec { |
||||
pname = "chardet"; |
||||
namespace = "script.module.chardet"; |
||||
version = "3.0.4+matrix.3"; |
||||
|
||||
src = fetchzip { |
||||
url = "https://mirrors.kodi.tv/addons/matrix/${namespace}/${namespace}-${version}.zip"; |
||||
sha256 = "05928dj4fsj2zg8ajdial3sdf8izddq64sr0al3zy1gqw91jp80f"; |
||||
}; |
||||
|
||||
passthru.updateScript = addonUpdateScript { |
||||
attrPath = "kodi.packages.chardet"; |
||||
}; |
||||
|
||||
meta = with lib; { |
||||
homepage = "https://github.com/Freso/script.module.chardet"; |
||||
description = "Universal encoding detector"; |
||||
license = licenses.lgpl2Only; |
||||
}; |
||||
} |
@ -0,0 +1,21 @@ |
||||
{ lib, buildKodiAddon, fetchFromGitHub, controller }: |
||||
buildKodiAddon rec { |
||||
pname = "game-controller-${controller}"; |
||||
namespace = "game.controller.${controller}"; |
||||
version = "1.0.3"; |
||||
|
||||
sourceDir = "addons/" + namespace; |
||||
|
||||
src = fetchFromGitHub { |
||||
owner = "kodi-game"; |
||||
repo = "kodi-game-controllers"; |
||||
rev = "01acb5b6e8b85392b3cb298b034aadb1b24ccf18"; |
||||
sha256 = "0sbc0w0fwbp7rbmbgb6a1kglhnn5g85hijcbbvf5x6jdq9v3f1qb"; |
||||
}; |
||||
|
||||
meta = with lib; { |
||||
description = "Add support for different gaming controllers."; |
||||
platforms = platforms.all; |
||||
maintainers = with maintainers; [ edwtjo ]; |
||||
}; |
||||
} |
@ -0,0 +1,21 @@ |
||||
{ lib, buildKodiAddon, fetchzip, addonUpdateScript }: |
||||
buildKodiAddon rec { |
||||
pname = "idna"; |
||||
namespace = "script.module.idna"; |
||||
version = "2.8.1+matrix.1"; |
||||
|
||||
src = fetchzip { |
||||
url = "https://mirrors.kodi.tv/addons/matrix/${namespace}/${namespace}-${version}.zip"; |
||||
sha256 = "02s75fhfmbs3a38wvxba51aj3lv5bidshjdkl6yjfji6waxpr9xh"; |
||||
}; |
||||
|
||||
passthru.updateScript = addonUpdateScript { |
||||
attrPath = "kodi.packages.idna"; |
||||
}; |
||||
|
||||
meta = with lib; { |
||||
homepage = "https://github.com/Freso/script.module.idna"; |
||||
description = "Internationalized Domain Names for Python"; |
||||
license = licenses.bsd3; |
||||
}; |
||||
} |
@ -0,0 +1,28 @@ |
||||
{ stdenv, lib, rel, addonDir, buildKodiBinaryAddon, fetchFromGitHub, expat, glib, nspr, nss }: |
||||
buildKodiBinaryAddon rec { |
||||
pname = "inputstream-adaptive"; |
||||
namespace = "inputstream.adaptive"; |
||||
version = "2.6.7"; |
||||
|
||||
src = fetchFromGitHub { |
||||
owner = "peak3d"; |
||||
repo = "inputstream.adaptive"; |
||||
rev = "${version}-${rel}"; |
||||
sha256 = "1pwqmbr78wp12jn6rwv63npdfc456adwz0amlxf6gvgg43li6p7s"; |
||||
}; |
||||
|
||||
extraBuildInputs = [ expat ]; |
||||
|
||||
extraRuntimeDependencies = [ glib nspr nss stdenv.cc.cc.lib ]; |
||||
|
||||
extraInstallPhase = let n = namespace; in '' |
||||
ln -s $out/lib/addons/${n}/libssd_wv.so $out/${addonDir}/${n}/libssd_wv.so |
||||
''; |
||||
|
||||
meta = with lib; { |
||||
homepage = "https://github.com/peak3d/inputstream.adaptive"; |
||||
description = "Kodi inputstream addon for several manifest types"; |
||||
platforms = platforms.all; |
||||
maintainers = with maintainers; [ sephalon ]; |
||||
}; |
||||
} |
@ -0,0 +1,21 @@ |
||||
{ lib, buildKodiAddon, fetchzip, addonUpdateScript }: |
||||
buildKodiAddon rec { |
||||
pname = "inputstreamhelper"; |
||||
namespace = "script.module.inputstreamhelper"; |
||||
version = "0.5.2+matrix.1"; |
||||
|
||||
src = fetchzip { |
||||
url = "https://mirrors.kodi.tv/addons/matrix/${namespace}/${namespace}-${version}.zip"; |
||||
sha256 = "18lkksljfa57w69yklbldf7dgyykrm84pd10mdjdqdm88fdiiijk"; |
||||
}; |
||||
|
||||
passthru.updateScript = addonUpdateScript { |
||||
attrPath = "kodi.packages.inputstreamhelper"; |
||||
}; |
||||
|
||||
meta = with lib; { |
||||
homepage = "https://github.com/emilsvennesson/script.module.inputstreamhelper"; |
||||
description = "A simple Kodi module that makes life easier for add-on developers relying on InputStream based add-ons and DRM playback"; |
||||
license = licenses.mit; |
||||
}; |
||||
} |
@ -0,0 +1,21 @@ |
||||
{ lib, rel, buildKodiBinaryAddon, fetchFromGitHub, tinyxml, udev }: |
||||
buildKodiBinaryAddon rec { |
||||
pname = namespace; |
||||
namespace = "peripheral.joystick"; |
||||
version = "1.7.1"; |
||||
|
||||
src = fetchFromGitHub { |
||||
owner = "xbmc"; |
||||
repo = namespace; |
||||
rev = "${version}-${rel}"; |
||||
sha256 = "1dhj4afr9kj938xx70fq5r409mz6lbw4n581ljvdjj9lq7akc914"; |
||||
}; |
||||
|
||||
meta = with lib; { |
||||
description = "Binary addon for raw joystick input."; |
||||
platforms = platforms.all; |
||||
maintainers = with maintainers; [ edwtjo ]; |
||||
}; |
||||
|
||||
extraBuildInputs = [ tinyxml udev ]; |
||||
} |
@ -0,0 +1,15 @@ |
||||
{ stdenv, fetchFromGitHub, cmake, kodi, libcec_platform, tinyxml }: |
||||
stdenv.mkDerivation rec { |
||||
pname = "kodi-platform"; |
||||
version = "17.1"; |
||||
|
||||
src = fetchFromGitHub { |
||||
owner = "xbmc"; |
||||
repo = pname; |
||||
rev = "c8188d82678fec6b784597db69a68e74ff4986b5"; |
||||
sha256 = "1r3gs3c6zczmm66qcxh9mr306clwb3p7ykzb70r3jv5jqggiz199"; |
||||
}; |
||||
|
||||
nativeBuildInputs = [ cmake ]; |
||||
buildInputs = [ kodi libcec_platform tinyxml ]; |
||||
} |
@ -0,0 +1,21 @@ |
||||
{ lib, buildKodiAddon, fetchzip, addonUpdateScript }: |
||||
buildKodiAddon rec { |
||||
pname = "myconnpy"; |
||||
namespace = "script.module.myconnpy"; |
||||
version = "8.0.18+matrix.1"; |
||||
|
||||
src = fetchzip { |
||||
url = "https://mirrors.kodi.tv/addons/matrix/${namespace}/${namespace}-${version}.zip"; |
||||
sha256 = "1cx3qdzw9lkkmbyvyrmc2i193is20fihn2sfl7kmv43f708vam0k"; |
||||
}; |
||||
|
||||
passthru.updateScript = addonUpdateScript { |
||||
attrPath = "kodi.packages.myconnpy"; |
||||
}; |
||||
|
||||
meta = with lib; { |
||||
homepage = "http://dev.mysql.com/doc/connector-python/en/index.html"; |
||||
description = "MySQL Connector/Python"; |
||||
license = licenses.gpl2Only; |
||||
}; |
||||
} |
@ -0,0 +1,26 @@ |
||||
{ lib, buildKodiAddon, fetchFromGitHub, signals, inputstreamhelper, requests, myconnpy }: |
||||
buildKodiAddon rec { |
||||
pname = "netflix"; |
||||
namespace = "plugin.video.netflix"; |
||||
version = "1.14.1"; |
||||
|
||||
src = fetchFromGitHub { |
||||
owner = "CastagnaIT"; |
||||
repo = namespace; |
||||
rev = "v${version}"; |
||||
sha256 = "0vv3234gg4brp0gvrsl4vdskmpfbyk4z7cjmmj31zn4m8j33japn"; |
||||
}; |
||||
|
||||
propagatedBuildInputs = [ |
||||
signals |
||||
inputstreamhelper |
||||
requests |
||||
myconnpy |
||||
]; |
||||
|
||||
meta = with lib; { |
||||
homepage = "https://github.com/CastagnaIT/plugin.video.netflix"; |
||||
description = "Netflix VOD Services Add-on"; |
||||
license = licenses.mit; |
||||
}; |
||||
} |
@ -0,0 +1,21 @@ |
||||
{ lib, buildKodiAddon, fetchFromGitHub }: |
||||
buildKodiAddon rec { |
||||
pname = "osmc-skin"; |
||||
namespace = "skin.osmc"; |
||||
version = "18.0.0"; |
||||
|
||||
src = fetchFromGitHub { |
||||
owner = "osmc"; |
||||
repo = namespace; |
||||
rev = "40a6c318641e2cbeac58fb0e7dde9c2beac737a0"; |
||||
sha256 = "1l7hyfj5zvjxjdm94y325bmy1naak455b9l8952sb0gllzrcwj6s"; |
||||
}; |
||||
|
||||
meta = with lib; { |
||||
homepage = "https://github.com/osmc/skin.osmc"; |
||||
description = "The default skin for OSMC"; |
||||
platforms = platforms.all; |
||||
maintainers = with maintainers; [ worldofpeace ]; |
||||
license = licenses.cc-by-nc-sa-30; |
||||
}; |
||||
} |
@ -0,0 +1,19 @@ |
||||
{ lib, buildKodiAddon, fetchFromGitHub }: |
||||
buildKodiAddon rec { |
||||
pname = "pdfreader"; |
||||
namespace = "plugin.image.pdf"; |
||||
version = "2.0.2"; |
||||
|
||||
src = fetchFromGitHub { |
||||
owner = "i96751414"; |
||||
repo = "plugin.image.pdfreader"; |
||||
rev = "v${version}"; |
||||
sha256 = "0nkqhlm1gyagq6xpdgqvd5qxyr2ngpml9smdmzfabc8b972mwjml"; |
||||
}; |
||||
|
||||
meta = with lib; { |
||||
homepage = "https://forum.kodi.tv/showthread.php?tid=187421"; |
||||
description = "A comic book reader"; |
||||
maintainers = with maintainers; [ edwtjo ]; |
||||
}; |
||||
} |
@ -0,0 +1,22 @@ |
||||
{ lib, rel, buildKodiBinaryAddon, fetchFromGitHub, jsoncpp, libhdhomerun }: |
||||
buildKodiBinaryAddon rec { |
||||
pname = "pvr-hdhomerun"; |
||||
namespace = "pvr.hdhomerun"; |
||||
version = "7.1.0"; |
||||
|
||||
src = fetchFromGitHub { |
||||
owner = "kodi-pvr"; |
||||
repo = "pvr.hdhomerun"; |
||||
rev = "${version}-${rel}"; |
||||
sha256 = "0gbwjssnd319csq2kwlyjj1rskg19m1dxac5dl2dymvx5hn3zrgm"; |
||||
}; |
||||
|
||||
meta = with lib; { |
||||
homepage = "https://github.com/kodi-pvr/pvr.hdhomerun"; |
||||
description = "Kodi's HDHomeRun PVR client addon"; |
||||
platforms = platforms.all; |
||||
maintainers = with maintainers; [ titanous ]; |
||||
}; |
||||
|
||||
extraBuildInputs = [ jsoncpp libhdhomerun ]; |
||||
} |
@ -0,0 +1,21 @@ |
||||
{ lib, rel, buildKodiBinaryAddon, fetchFromGitHub }: |
||||
buildKodiBinaryAddon rec { |
||||
pname = "pvr-hts"; |
||||
namespace = "pvr.hts"; |
||||
version = "8.2.2"; |
||||
|
||||
src = fetchFromGitHub { |
||||
owner = "kodi-pvr"; |
||||
repo = "pvr.hts"; |
||||
rev = "${version}-${rel}"; |
||||
sha256 = "0jnn9gfjl556acqjf92wzzn371gxymhbbi665nqgg2gjcan0a49q"; |
||||
}; |
||||
|
||||
meta = with lib; { |
||||
homepage = "https://github.com/kodi-pvr/pvr.hts"; |
||||
description = "Kodi's Tvheadend HTSP client addon"; |
||||
platforms = platforms.all; |
||||
maintainers = with maintainers; [ cpages ]; |
||||
}; |
||||
|
||||
} |
@ -0,0 +1,22 @@ |
||||
{ lib, rel, buildKodiBinaryAddon, fetchFromGitHub, zlib, pugixml }: |
||||
buildKodiBinaryAddon rec { |
||||
pname = "pvr-iptvsimple"; |
||||
namespace = "pvr.iptvsimple"; |
||||
version = "7.4.2"; |
||||
|
||||
src = fetchFromGitHub { |
||||
owner = "kodi-pvr"; |
||||
repo = "pvr.iptvsimple"; |
||||
rev = "${version}-${rel}"; |
||||
sha256 = "062i922qi0izkvn7v47yhyy2cf3fa7xc3k95b1gm9abfdwkk8ywr"; |
||||
}; |
||||
|
||||
meta = with lib; { |
||||
homepage = "https://github.com/kodi-pvr/pvr.iptvsimple"; |
||||
description = "Kodi's IPTV Simple client addon"; |
||||
platforms = platforms.all; |
||||
license = licenses.gpl2Plus; |
||||
}; |
||||
|
||||
extraBuildInputs = [ zlib pugixml ]; |
||||
} |
@ -0,0 +1,28 @@ |
||||
{ lib, buildKodiAddon, fetchzip, addonUpdateScript, certifi, chardet, idna, urllib3 }: |
||||
buildKodiAddon rec { |
||||
pname = "requests"; |
||||
namespace = "script.module.requests"; |
||||
version = "2.22.0+matrix.1"; |
||||
|
||||
src = fetchzip { |
||||
url = "https://mirrors.kodi.tv/addons/matrix/${namespace}/${namespace}-${version}.zip"; |
||||
sha256 = "09576galkyzhw8fhy2h4aablm5rm2v08g0mdmg9nn55dlxhkkljq"; |
||||
}; |
||||
|
||||
propagatedBuildInputs = [ |
||||
certifi |
||||
chardet |
||||
idna |
||||
urllib3 |
||||
]; |
||||
|
||||
passthru.updateScript = addonUpdateScript { |
||||
attrPath = "kodi.packages.requests"; |
||||
}; |
||||
|
||||
meta = with lib; { |
||||
homepage = "http://python-requests.org"; |
||||
description = "Python HTTP for Humans"; |
||||
license = licenses.asl20; |
||||
}; |
||||
} |
@ -0,0 +1,21 @@ |
||||
{ lib, buildKodiAddon, fetchzip, addonUpdateScript }: |
||||
buildKodiAddon rec { |
||||
pname = "signals"; |
||||
namespace = "script.module.addon.signals"; |
||||
version = "0.0.6+matrix.1"; |
||||
|
||||
src = fetchzip { |
||||
url = "https://mirrors.kodi.tv/addons/matrix/${namespace}/${namespace}-${version}.zip"; |
||||
sha256 = "1qcjbakch8hvx02wc01zv014nmzgn6ahc4n2bj5mzr114ppd3hjs"; |
||||
}; |
||||
|
||||
passthru.updateScript = addonUpdateScript { |
||||
attrPath = "kodi.packages.signals"; |
||||
}; |
||||
|
||||
meta = with lib; { |
||||
homepage = "https://github.com/ruuk/script.module.addon.signals"; |
||||
description = "Provides signal/slot mechanism for inter-addon communication"; |
||||
license = licenses.lgpl21Only; |
||||
}; |
||||
} |
@ -0,0 +1,22 @@ |
||||
{ lib, buildKodiBinaryAddon, fetchFromGitHub, libusb1 }: |
||||
buildKodiBinaryAddon rec { |
||||
pname = namespace; |
||||
namespace = "peripheral.steamcontroller"; |
||||
version = "0.11.0"; |
||||
|
||||
src = fetchFromGitHub { |
||||
owner = "kodi-game"; |
||||
repo = namespace; |
||||
rev = "f68140ca44f163a03d3a625d1f2005a6edef96cb"; |
||||
sha256 = "09lm8i119xlsxxk0c64rnp8iw0crr90v7m8iwi9r31qdmxrdxpmg"; |
||||
}; |
||||
|
||||
extraBuildInputs = [ libusb1 ]; |
||||
|
||||
meta = with lib; { |
||||
description = "Binary addon for steam controller."; |
||||
platforms = platforms.all; |
||||
maintainers = with maintainers; [ edwtjo ]; |
||||
}; |
||||
|
||||
} |
@ -0,0 +1,28 @@ |
||||
{ lib, buildKodiAddon, fetchFromGitHub, steam }: |
||||
buildKodiAddon { |
||||
pname = "steam-launcher"; |
||||
namespace = "script.steam.launcher"; |
||||
version = "3.5.1"; |
||||
|
||||
src = fetchFromGitHub rec { |
||||
owner = "teeedubb"; |
||||
repo = owner + "-xbmc-repo"; |
||||
rev = "8260bf9b464846a1f1965da495d2f2b7ceb81d55"; |
||||
sha256 = "1fj3ry5s44nf1jzxk4bmnpa4b9p23nrpmpj2a4i6xf94h7jl7p5k"; |
||||
}; |
||||
|
||||
propagatedBuildInputs = [ steam ]; |
||||
|
||||
meta = with lib; { |
||||
homepage = "https://forum.kodi.tv/showthread.php?tid=157499"; |
||||
description = "Launch Steam in Big Picture Mode from Kodi"; |
||||
longDescription = '' |
||||
This add-on will close/minimise Kodi, launch Steam in Big |
||||
Picture Mode and when Steam BPM is exited (either by quitting |
||||
Steam or returning to the desktop) Kodi will |
||||
restart/maximise. Running pre/post Steam scripts can be |
||||
configured via the addon. |
||||
''; |
||||
maintainers = with maintainers; [ edwtjo ]; |
||||
}; |
||||
} |
@ -0,0 +1,26 @@ |
||||
{ lib, buildKodiAddon, fetchFromGitHub }: |
||||
buildKodiAddon rec { |
||||
pname = "svtplay"; |
||||
namespace = "plugin.video.svtplay"; |
||||
version = "5.1.12"; |
||||
|
||||
src = fetchFromGitHub { |
||||
owner = "nilzen"; |
||||
repo = "xbmc-" + pname; |
||||
rev = "v${version}"; |
||||
sha256 = "04j1nhm7mh9chs995lz6bv1vsq5xzk7a7c0lmk4bnfv8jrfpj0w6"; |
||||
}; |
||||
|
||||
meta = with lib; { |
||||
homepage = "https://forum.kodi.tv/showthread.php?tid=67110"; |
||||
description = "Watch content from SVT Play"; |
||||
longDescription = '' |
||||
With this addon you can stream content from SVT Play |
||||
(svtplay.se). The plugin fetches the video URL from the SVT |
||||
Play website and feeds it to the Kodi video player. HLS (m3u8) |
||||
is the preferred video format by the plugin. |
||||
''; |
||||
platforms = platforms.all; |
||||
maintainers = with maintainers; [ edwtjo ]; |
||||
}; |
||||
} |
@ -0,0 +1,21 @@ |
||||
{ lib, buildKodiAddon, fetchzip, addonUpdateScript }: |
||||
buildKodiAddon rec { |
||||
pname = "urllib3"; |
||||
namespace = "script.module.urllib3"; |
||||
version = "1.25.8+matrix.1"; |
||||
|
||||
src = fetchzip { |
||||
url = "https://mirrors.kodi.tv/addons/matrix/${namespace}/${namespace}-${version}.zip"; |
||||
sha256 = "080yq8ns0sag6rmdag1hjwi0whcmp35wzqjp3by92m81cpszs75q"; |
||||
}; |
||||
|
||||
passthru.updateScript = addonUpdateScript { |
||||
attrPath = "kodi.packages.urllib3"; |
||||
}; |
||||
|
||||
meta = with lib; { |
||||
homepage = "https://urllib3.readthedocs.io/en/latest/"; |
||||
description = "HTTP library with thread-safe connection pooling, file post, and more"; |
||||
license = licenses.mit; |
||||
}; |
||||
} |
@ -0,0 +1,22 @@ |
||||
{ lib, rel, buildKodiBinaryAddon, fetchFromGitHub, libarchive, lzma, bzip2, zlib, lz4, lzo, openssl }: |
||||
buildKodiBinaryAddon rec { |
||||
pname = namespace; |
||||
namespace = "vfs.libarchive"; |
||||
version = "2.0.0"; |
||||
|
||||
src = fetchFromGitHub { |
||||
owner = "xbmc"; |
||||
repo = namespace; |
||||
rev = "${version}-${rel}"; |
||||
sha256 = "1q62p1i6rvqk2zv6f1cpffkh95lgclys2xl4dwyhj3acmqdxd9i5"; |
||||
}; |
||||
|
||||
meta = with lib; { |
||||
description = "LibArchive Virtual Filesystem add-on for Kodi"; |
||||
license = licenses.gpl2Plus; |
||||
platforms = platforms.all; |
||||
maintainers = with maintainers; [ minijackson ]; |
||||
}; |
||||
|
||||
extraBuildInputs = [ libarchive lzma bzip2 zlib lz4 lzo openssl ]; |
||||
} |
@ -0,0 +1,22 @@ |
||||
{ lib, rel, buildKodiBinaryAddon, fetchFromGitHub, openssl, libssh, zlib }: |
||||
buildKodiBinaryAddon rec { |
||||
pname = namespace; |
||||
namespace = "vfs.sftp"; |
||||
version = "2.0.0"; |
||||
|
||||
src = fetchFromGitHub { |
||||
owner = "xbmc"; |
||||
repo = namespace; |
||||
rev = "${version}-${rel}"; |
||||
sha256 = "06w74sh8yagrrp7a7rjaz3xrh1j3wdqald9c4b72c33gpk5997dk"; |
||||
}; |
||||
|
||||
meta = with lib; { |
||||
description = "SFTP Virtual Filesystem add-on for Kodi"; |
||||
license = licenses.gpl2Plus; |
||||
platforms = platforms.all; |
||||
maintainers = with maintainers; [ minijackson ]; |
||||
}; |
||||
|
||||
extraBuildInputs = [ openssl libssh zlib ]; |
||||
} |
@ -0,0 +1,21 @@ |
||||
{ stdenv, toKodiAddon, addonDir }: |
||||
{ name ? "${attrs.pname}-${attrs.version}" |
||||
, namespace |
||||
, sourceDir ? "" |
||||
, ... } @ attrs: |
||||
toKodiAddon (stdenv.mkDerivation ({ |
||||
name = "kodi-" + name; |
||||
|
||||
dontStrip = true; |
||||
|
||||
extraRuntimeDependencies = [ ]; |
||||
|
||||
installPhase = '' |
||||
cd $src/$sourceDir |
||||
d=$out${addonDir}/${namespace} |
||||
mkdir -p $d |
||||
sauce="." |
||||
[ -d ${namespace} ] && sauce=${namespace} |
||||
cp -R "$sauce/"* $d |
||||
''; |
||||
} // attrs)) |
@ -0,0 +1,31 @@ |
||||
{ stdenv, toKodiAddon, addonDir, cmake, kodi, kodi-platform, libcec_platform }: |
||||
{ name ? "${attrs.pname}-${attrs.version}" |
||||
, namespace |
||||
, version |
||||
, extraBuildInputs ? [] |
||||
, extraRuntimeDependencies ? [] |
||||
, extraInstallPhase ? "", ... } @ attrs: |
||||
toKodiAddon (stdenv.mkDerivation ({ |
||||
name = "kodi-" + name; |
||||
|
||||
dontStrip = true; |
||||
|
||||
nativeBuildInputs = [ cmake ]; |
||||
buildInputs = [ kodi kodi-platform libcec_platform ] ++ extraBuildInputs; |
||||
|
||||
inherit extraRuntimeDependencies; |
||||
|
||||
# disables check ensuring install prefix is that of kodi |
||||
cmakeFlags = [ |
||||
"-DOVERRIDE_PATHS=1" |
||||
]; |
||||
|
||||
# kodi checks for addon .so libs existance in the addon folder (share/...) |
||||
# and the non-wrapped kodi lib/... folder before even trying to dlopen |
||||
# them. Symlinking .so, as setting LD_LIBRARY_PATH is of no use |
||||
installPhase = let n = namespace; in '' |
||||
make install |
||||
ln -s $out/lib/addons/${n}/${n}.so.${version} $out${addonDir}/${n}/${n}.so.${version} |
||||
${extraInstallPhase} |
||||
''; |
||||
} // attrs)) |
@ -1,560 +0,0 @@ |
||||
{ lib, stdenv, callPackage, fetchFromGitHub |
||||
, cmake, kodi, libcec_platform, tinyxml, pugixml |
||||
, steam, udev, libusb1, jsoncpp, libhdhomerun, zlib |
||||
, python3Packages, expat, glib, nspr, nss, openssl |
||||
, libssh, libarchive, lzma, bzip2, lz4, lzo }: |
||||
|
||||
with lib; |
||||
|
||||
let self = rec { |
||||
|
||||
addonDir = "/share/kodi/addons"; |
||||
rel = "Matrix"; |
||||
|
||||
inherit kodi; |
||||
|
||||
# Convert derivation to a kodi module. Stolen from ../../../top-level/python-packages.nix |
||||
toKodiAddon = drv: drv.overrideAttrs(oldAttrs: { |
||||
# Use passthru in order to prevent rebuilds when possible. |
||||
passthru = (oldAttrs.passthru or {})// { |
||||
kodiAddonFor = kodi; |
||||
requiredKodiAddons = requiredKodiAddons drv.propagatedBuildInputs; |
||||
}; |
||||
}); |
||||
|
||||
# Check whether a derivation provides a Kodi addon. |
||||
hasKodiAddon = drv: drv ? kodiAddonFor && drv.kodiAddonFor == kodi; |
||||
|
||||
# Get list of required Kodi addons given a list of derivations. |
||||
requiredKodiAddons = drvs: let |
||||
modules = filter hasKodiAddon drvs; |
||||
in unique (modules ++ concatLists (catAttrs "requiredKodiAddons" modules)); |
||||
|
||||
kodi-platform = stdenv.mkDerivation rec { |
||||
project = "kodi-platform"; |
||||
version = "17.1"; |
||||
name = "${project}-${version}"; |
||||
|
||||
src = fetchFromGitHub { |
||||
owner = "xbmc"; |
||||
repo = project; |
||||
rev = "c8188d82678fec6b784597db69a68e74ff4986b5"; |
||||
sha256 = "1r3gs3c6zczmm66qcxh9mr306clwb3p7ykzb70r3jv5jqggiz199"; |
||||
}; |
||||
|
||||
nativeBuildInputs = [ cmake ]; |
||||
buildInputs = [ kodi libcec_platform tinyxml ]; |
||||
}; |
||||
|
||||
buildKodiAddon = |
||||
{ name ? "${attrs.pname}-${attrs.version}" |
||||
, namespace |
||||
, sourceDir ? "" |
||||
, ... } @ attrs: |
||||
toKodiAddon (stdenv.mkDerivation ({ |
||||
name = "kodi-" + name; |
||||
|
||||
dontStrip = true; |
||||
|
||||
extraRuntimeDependencies = [ ]; |
||||
|
||||
installPhase = '' |
||||
cd $src/$sourceDir |
||||
d=$out${addonDir}/${namespace} |
||||
mkdir -p $d |
||||
sauce="." |
||||
[ -d ${namespace} ] && sauce=${namespace} |
||||
cp -R "$sauce/"* $d |
||||
''; |
||||
} // attrs)); |
||||
|
||||
buildKodiBinaryAddon = |
||||
{ name ? "${attrs.pname}-${attrs.version}" |
||||
, namespace |
||||
, version |
||||
, extraBuildInputs ? [] |
||||
, extraRuntimeDependencies ? [] |
||||
, extraInstallPhase ? "", ... } @ attrs: |
||||
toKodiAddon (stdenv.mkDerivation ({ |
||||
name = "kodi-" + name; |
||||
|
||||
dontStrip = true; |
||||
|
||||
nativeBuildInputs = [ cmake ]; |
||||
buildInputs = [ kodi kodi-platform libcec_platform ] ++ extraBuildInputs; |
||||
|
||||
inherit extraRuntimeDependencies; |
||||
|
||||
# disables check ensuring install prefix is that of kodi |
||||
cmakeFlags = [ |
||||
"-DOVERRIDE_PATHS=1" |
||||
]; |
||||
|
||||
# kodi checks for addon .so libs existance in the addon folder (share/...) |
||||
# and the non-wrapped kodi lib/... folder before even trying to dlopen |
||||
# them. Symlinking .so, as setting LD_LIBRARY_PATH is of no use |
||||
installPhase = let n = namespace; in '' |
||||
make install |
||||
ln -s $out/lib/addons/${n}/${n}.so.${version} $out${addonDir}/${n}/${n}.so.${version} |
||||
${extraInstallPhase} |
||||
''; |
||||
} // attrs)); |
||||
|
||||
advanced-launcher = buildKodiAddon rec { |
||||
|
||||
pname = "advanced-launcher"; |
||||
namespace = "plugin.program.advanced.launcher"; |
||||
version = "2.5.8"; |
||||
|
||||
src = fetchFromGitHub { |
||||
owner = "edwtjo"; |
||||
repo = pname; |
||||
rev = version; |
||||
sha256 = "142vvgs37asq5m54xqhjzqvgmb0xlirvm0kz6lxaqynp0vvgrkx2"; |
||||
}; |
||||
|
||||
meta = { |
||||
homepage = "https://forum.kodi.tv/showthread.php?tid=85724"; |
||||
description = "A program launcher for Kodi"; |
||||
longDescription = '' |
||||
Advanced Launcher allows you to start any Linux, Windows and |
||||
macOS external applications (with command line support or not) |
||||
directly from the Kodi GUI. Advanced Launcher also give you |
||||
the possibility to edit, download (from Internet resources) |
||||
and manage all the meta-data (informations and images) related |
||||
to these applications. |
||||
''; |
||||
platforms = platforms.all; |
||||
maintainers = with maintainers; [ edwtjo ]; |
||||
broken = true; # requires port to python3 |
||||
}; |
||||
|
||||
}; |
||||
|
||||
advanced-emulator-launcher = buildKodiAddon rec { |
||||
|
||||
pname = "advanced-emulator-launcher"; |
||||
namespace = "plugin.program.advanced.emulator.launcher"; |
||||
version = "0.9.6"; |
||||
|
||||
src = fetchFromGitHub { |
||||
owner = "Wintermute0110"; |
||||
repo = namespace; |
||||
rev = version; |
||||
sha256 = "1sv9z77jj6bam6llcnd9b3dgkbvhwad2m1v541rv3acrackms2z2"; |
||||
}; |
||||
|
||||
meta = { |
||||
homepage = "https://forum.kodi.tv/showthread.php?tid=287826"; |
||||
description = "A program launcher for Kodi"; |
||||
longDescription = '' |
||||
Advanced Emulator Launcher is a multi-emulator front-end for Kodi |
||||
scalable to collections of thousands of ROMs. Includes offline scrapers |
||||
for MAME and No-Intro ROM sets and also supports scrapping ROM metadata |
||||
and artwork online. ROM auditing for No-Intro ROMs using No-Intro XML |
||||
DATs. Launching of games and standalone applications is also available. |
||||
''; |
||||
platforms = platforms.all; |
||||
maintainers = with maintainers; [ edwtjo ]; |
||||
broken = true; # requires port to python3 |
||||
}; |
||||
|
||||
}; |
||||
|
||||
controllers = let |
||||
pname = "game-controller"; |
||||
version = "1.0.3"; |
||||
|
||||
src = fetchFromGitHub { |
||||
owner = "kodi-game"; |
||||
repo = "kodi-game-controllers"; |
||||
rev = "01acb5b6e8b85392b3cb298b034aadb1b24ccf18"; |
||||
sha256 = "0sbc0w0fwbp7rbmbgb6a1kglhnn5g85hijcbbvf5x6jdq9v3f1qb"; |
||||
}; |
||||
|
||||
meta = { |
||||
description = "Add support for different gaming controllers."; |
||||
platforms = platforms.all; |
||||
maintainers = with maintainers; [ edwtjo ]; |
||||
}; |
||||
|
||||
mkController = controller: { |
||||
${controller} = buildKodiAddon rec { |
||||
pname = pname + "-" + controller; |
||||
namespace = "game.controller." + controller; |
||||
sourceDir = "addons/" + namespace; |
||||
inherit version src meta; |
||||
}; |
||||
}; |
||||
in (mkController "default") |
||||
// (mkController "dreamcast") |
||||
// (mkController "gba") |
||||
// (mkController "genesis") |
||||
// (mkController "mouse") |
||||
// (mkController "n64") |
||||
// (mkController "nes") |
||||
// (mkController "ps") |
||||
// (mkController "snes"); |
||||
|
||||
hyper-launcher = let |
||||
pname = "hyper-launcher"; |
||||
version = "1.5.2"; |
||||
src = fetchFromGitHub rec { |
||||
name = pname + "-" + version + ".tar.gz"; |
||||
owner = "teeedubb"; |
||||
repo = owner + "-xbmc-repo"; |
||||
rev = "f958ba93fe85b9c9025b1745d89c2db2e7dd9bf6"; |
||||
sha256 = "1dvff24fbas25k5kvca4ssks9l1g5rfa3hl8lqxczkaqi3pp41j5"; |
||||
}; |
||||
meta = { |
||||
homepage = "https://forum.kodi.tv/showthread.php?tid=258159"; |
||||
description = "A ROM launcher for Kodi that uses HyperSpin assets."; |
||||
maintainers = with maintainers; [ edwtjo ]; |
||||
broken = true; # requires port to python3 |
||||
}; |
||||
in { |
||||
service = buildKodiAddon { |
||||
pname = pname + "-service"; |
||||
version = "1.2.1"; |
||||
namespace = "service.hyper.launcher"; |
||||
inherit src meta; |
||||
}; |
||||
plugin = buildKodiAddon { |
||||
namespace = "plugin.hyper.launcher"; |
||||
inherit pname version src meta; |
||||
}; |
||||
}; |
||||
|
||||
joystick = buildKodiBinaryAddon rec { |
||||
pname = namespace; |
||||
namespace = "peripheral.joystick"; |
||||
version = "1.7.1"; |
||||
|
||||
src = fetchFromGitHub { |
||||
owner = "xbmc"; |
||||
repo = namespace; |
||||
rev = "${version}-${rel}"; |
||||
sha256 = "1dhj4afr9kj938xx70fq5r409mz6lbw4n581ljvdjj9lq7akc914"; |
||||
}; |
||||
|
||||
meta = { |
||||
description = "Binary addon for raw joystick input."; |
||||
platforms = platforms.all; |
||||
maintainers = with maintainers; [ edwtjo ]; |
||||
}; |
||||
|
||||
extraBuildInputs = [ tinyxml udev ]; |
||||
}; |
||||
|
||||
simpleplugin = buildKodiAddon rec { |
||||
pname = "simpleplugin"; |
||||
namespace = "script.module.simpleplugin"; |
||||
version = "2.3.2"; |
||||
|
||||
src = fetchFromGitHub { |
||||
owner = "romanvm"; |
||||
repo = namespace; |
||||
rev = "v.${version}"; |
||||
sha256 = "0myar8dqjigb75pcc8zx3i5z79p1ifgphgb82s5syqywk0zaxm3j"; |
||||
}; |
||||
|
||||
meta = { |
||||
homepage = src.meta.homepage; |
||||
description = "Simpleplugin API"; |
||||
license = licenses.gpl3; |
||||
broken = true; # requires port to python3 |
||||
}; |
||||
}; |
||||
|
||||
svtplay = buildKodiAddon rec { |
||||
|
||||
pname = "svtplay"; |
||||
namespace = "plugin.video.svtplay"; |
||||
version = "5.1.12"; |
||||
|
||||
src = fetchFromGitHub { |
||||
name = pname + "-" + version + ".tar.gz"; |
||||
owner = "nilzen"; |
||||
repo = "xbmc-" + pname; |
||||
rev = "v${version}"; |
||||
sha256 = "04j1nhm7mh9chs995lz6bv1vsq5xzk7a7c0lmk4bnfv8jrfpj0w6"; |
||||
}; |
||||
|
||||
meta = { |
||||
homepage = "https://forum.kodi.tv/showthread.php?tid=67110"; |
||||
description = "Watch content from SVT Play"; |
||||
longDescription = '' |
||||
With this addon you can stream content from SVT Play |
||||
(svtplay.se). The plugin fetches the video URL from the SVT |
||||
Play website and feeds it to the Kodi video player. HLS (m3u8) |
||||
is the preferred video format by the plugin. |
||||
''; |
||||
platforms = platforms.all; |
||||
maintainers = with maintainers; [ edwtjo ]; |
||||
}; |
||||
|
||||
}; |
||||
|
||||
steam-controller = buildKodiBinaryAddon rec { |
||||
pname = namespace; |
||||
namespace = "peripheral.steamcontroller"; |
||||
version = "0.11.0"; |
||||
|
||||
src = fetchFromGitHub { |
||||
owner = "kodi-game"; |
||||
repo = namespace; |
||||
rev = "f68140ca44f163a03d3a625d1f2005a6edef96cb"; |
||||
sha256 = "09lm8i119xlsxxk0c64rnp8iw0crr90v7m8iwi9r31qdmxrdxpmg"; |
||||
}; |
||||
|
||||
extraBuildInputs = [ libusb1 ]; |
||||
|
||||
meta = { |
||||
description = "Binary addon for steam controller."; |
||||
platforms = platforms.all; |
||||
maintainers = with maintainers; [ edwtjo ]; |
||||
}; |
||||
|
||||
}; |
||||
|
||||
steam-launcher = buildKodiAddon { |
||||
|
||||
pname = "steam-launcher"; |
||||
namespace = "script.steam.launcher"; |
||||
version = "3.5.1"; |
||||
|
||||
src = fetchFromGitHub rec { |
||||
owner = "teeedubb"; |
||||
repo = owner + "-xbmc-repo"; |
||||
rev = "8260bf9b464846a1f1965da495d2f2b7ceb81d55"; |
||||
sha256 = "1fj3ry5s44nf1jzxk4bmnpa4b9p23nrpmpj2a4i6xf94h7jl7p5k"; |
||||
}; |
||||
|
||||
propagatedBuildInputs = [ steam ]; |
||||
|
||||
meta = { |
||||
homepage = "https://forum.kodi.tv/showthread.php?tid=157499"; |
||||
description = "Launch Steam in Big Picture Mode from Kodi"; |
||||
longDescription = '' |
||||
This add-on will close/minimise Kodi, launch Steam in Big |
||||
Picture Mode and when Steam BPM is exited (either by quitting |
||||
Steam or returning to the desktop) Kodi will |
||||
restart/maximise. Running pre/post Steam scripts can be |
||||
configured via the addon. |
||||
''; |
||||
maintainers = with maintainers; [ edwtjo ]; |
||||
}; |
||||
}; |
||||
|
||||
pdfreader = buildKodiAddon rec { |
||||
pname = "pdfreader"; |
||||
namespace = "plugin.image.pdf"; |
||||
version = "2.0.2"; |
||||
|
||||
src = fetchFromGitHub { |
||||
owner = "i96751414"; |
||||
repo = "plugin.image.pdfreader"; |
||||
rev = "v${version}"; |
||||
sha256 = "0nkqhlm1gyagq6xpdgqvd5qxyr2ngpml9smdmzfabc8b972mwjml"; |
||||
}; |
||||
|
||||
meta = { |
||||
homepage = "https://forum.kodi.tv/showthread.php?tid=187421"; |
||||
description = "A comic book reader"; |
||||
maintainers = with maintainers; [ edwtjo ]; |
||||
}; |
||||
}; |
||||
|
||||
pvr-hts = buildKodiBinaryAddon rec { |
||||
|
||||
pname = "pvr-hts"; |
||||
namespace = "pvr.hts"; |
||||
version = "8.2.2"; |
||||
|
||||
src = fetchFromGitHub { |
||||
owner = "kodi-pvr"; |
||||
repo = "pvr.hts"; |
||||
rev = "${version}-${rel}"; |
||||
sha256 = "0jnn9gfjl556acqjf92wzzn371gxymhbbi665nqgg2gjcan0a49q"; |
||||
}; |
||||
|
||||
meta = { |
||||
homepage = "https://github.com/kodi-pvr/pvr.hts"; |
||||
description = "Kodi's Tvheadend HTSP client addon"; |
||||
platforms = platforms.all; |
||||
maintainers = with maintainers; [ cpages ]; |
||||
}; |
||||
|
||||
}; |
||||
|
||||
pvr-hdhomerun = buildKodiBinaryAddon rec { |
||||
|
||||
pname = "pvr-hdhomerun"; |
||||
namespace = "pvr.hdhomerun"; |
||||
version = "7.1.0"; |
||||
|
||||
src = fetchFromGitHub { |
||||
owner = "kodi-pvr"; |
||||
repo = "pvr.hdhomerun"; |
||||
rev = "${version}-${rel}"; |
||||
sha256 = "0gbwjssnd319csq2kwlyjj1rskg19m1dxac5dl2dymvx5hn3zrgm"; |
||||
}; |
||||
|
||||
meta = { |
||||
homepage = "https://github.com/kodi-pvr/pvr.hdhomerun"; |
||||
description = "Kodi's HDHomeRun PVR client addon"; |
||||
platforms = platforms.all; |
||||
maintainers = with maintainers; [ titanous ]; |
||||
}; |
||||
|
||||
extraBuildInputs = [ jsoncpp libhdhomerun ]; |
||||
|
||||
}; |
||||
|
||||
pvr-iptvsimple = buildKodiBinaryAddon rec { |
||||
|
||||
pname = "pvr-iptvsimple"; |
||||
namespace = "pvr.iptvsimple"; |
||||
version = "7.4.2"; |
||||
|
||||
src = fetchFromGitHub { |
||||
owner = "kodi-pvr"; |
||||
repo = "pvr.iptvsimple"; |
||||
rev = "${version}-${rel}"; |
||||
sha256 = "062i922qi0izkvn7v47yhyy2cf3fa7xc3k95b1gm9abfdwkk8ywr"; |
||||
}; |
||||
|
||||
meta = { |
||||
homepage = "https://github.com/kodi-pvr/pvr.iptvsimple"; |
||||
description = "Kodi's IPTV Simple client addon"; |
||||
platforms = platforms.all; |
||||
maintainers = with maintainers; [ ]; |
||||
license = licenses.gpl2Plus; |
||||
}; |
||||
|
||||
extraBuildInputs = [ zlib pugixml ]; |
||||
}; |
||||
|
||||
osmc-skin = buildKodiAddon rec { |
||||
|
||||
pname = "osmc-skin"; |
||||
namespace = "skin.osmc"; |
||||
version = "18.0.0"; |
||||
|
||||
src = fetchFromGitHub { |
||||
owner = "osmc"; |
||||
repo = namespace; |
||||
rev = "40a6c318641e2cbeac58fb0e7dde9c2beac737a0"; |
||||
sha256 = "1l7hyfj5zvjxjdm94y325bmy1naak455b9l8952sb0gllzrcwj6s"; |
||||
}; |
||||
|
||||
meta = { |
||||
homepage = "https://github.com/osmc/skin.osmc"; |
||||
description = "The default skin for OSMC"; |
||||
platforms = platforms.all; |
||||
maintainers = with maintainers; [ worldofpeace ]; |
||||
license = licenses.cc-by-nc-sa-30; |
||||
}; |
||||
}; |
||||
|
||||
yatp = python3Packages.toPythonModule (buildKodiAddon rec { |
||||
pname = "yatp"; |
||||
namespace = "plugin.video.yatp"; |
||||
version = "3.3.2"; |
||||
|
||||
src = fetchFromGitHub { |
||||
owner = "romanvm"; |
||||
repo = "kodi.yatp"; |
||||
rev = "v.${version}"; |
||||
sha256 = "12g1f57sx7dy6wy7ljl7siz2qs1kxcmijcg7xx2xpvmq61x9qa2d"; |
||||
}; |
||||
|
||||
patches = [ ./yatp/dont-monkey.patch ]; |
||||
|
||||
propagatedBuildInputs = [ |
||||
simpleplugin |
||||
python3Packages.requests |
||||
python3Packages.libtorrent-rasterbar |
||||
]; |
||||
|
||||
meta = { |
||||
homepage = src.meta.homepage; |
||||
description = "Yet Another Torrent Player: libtorrent-based torrent streaming for Kodi"; |
||||
license = licenses.gpl3; |
||||
broken = true; # requires port to python3 |
||||
}; |
||||
}); |
||||
|
||||
inputstream-adaptive = buildKodiBinaryAddon rec { |
||||
|
||||
pname = "inputstream-adaptive"; |
||||
namespace = "inputstream.adaptive"; |
||||
version = "2.6.7"; |
||||
|
||||
src = fetchFromGitHub { |
||||
owner = "peak3d"; |
||||
repo = "inputstream.adaptive"; |
||||
rev = "${version}-${rel}"; |
||||
sha256 = "1pwqmbr78wp12jn6rwv63npdfc456adwz0amlxf6gvgg43li6p7s"; |
||||
}; |
||||
|
||||
extraBuildInputs = [ expat ]; |
||||
|
||||
extraRuntimeDependencies = [ glib nspr nss stdenv.cc.cc.lib ]; |
||||
|
||||
extraInstallPhase = let n = namespace; in '' |
||||
ln -s $out/lib/addons/${n}/libssd_wv.so $out/${addonDir}/${n}/libssd_wv.so |
||||
''; |
||||
|
||||
meta = { |
||||
homepage = "https://github.com/peak3d/inputstream.adaptive"; |
||||
description = "Kodi inputstream addon for several manifest types"; |
||||
platforms = platforms.all; |
||||
maintainers = with maintainers; [ sephalon ]; |
||||
}; |
||||
}; |
||||
|
||||
vfs-sftp = buildKodiBinaryAddon rec { |
||||
pname = namespace; |
||||
namespace = "vfs.sftp"; |
||||
version = "2.0.0"; |
||||
|
||||
src = fetchFromGitHub { |
||||
owner = "xbmc"; |
||||
repo = namespace; |
||||
rev = "${version}-${rel}"; |
||||
sha256 = "06w74sh8yagrrp7a7rjaz3xrh1j3wdqald9c4b72c33gpk5997dk"; |
||||
}; |
||||
|
||||
meta = with lib; { |
||||
description = "SFTP Virtual Filesystem add-on for Kodi"; |
||||
license = licenses.gpl2Plus; |
||||
platforms = platforms.all; |
||||
maintainers = with maintainers; [ minijackson ]; |
||||
}; |
||||
|
||||
extraBuildInputs = [ openssl libssh zlib ]; |
||||
}; |
||||
|
||||
vfs-libarchive = buildKodiBinaryAddon rec { |
||||
pname = namespace; |
||||
namespace = "vfs.libarchive"; |
||||
version = "2.0.0"; |
||||
|
||||
src = fetchFromGitHub { |
||||
owner = "xbmc"; |
||||
repo = namespace; |
||||
rev = "${version}-${rel}"; |
||||
sha256 = "1q62p1i6rvqk2zv6f1cpffkh95lgclys2xl4dwyhj3acmqdxd9i5"; |
||||
}; |
||||
|
||||
meta = with lib; { |
||||
description = "LibArchive Virtual Filesystem add-on for Kodi"; |
||||
license = licenses.gpl2Plus; |
||||
platforms = platforms.all; |
||||
maintainers = with maintainers; [ minijackson ]; |
||||
}; |
||||
|
||||
extraBuildInputs = [ libarchive lzma bzip2 zlib lz4 lzo openssl ]; |
||||
}; |
||||
}; in self |
@ -1,29 +0,0 @@ |
||||
diff --git a/plugin.video.yatp/server.py b/plugin.video.yatp/server.py
|
||||
index 1adcbb5..488b72c 100644
|
||||
--- a/plugin.video.yatp/server.py
|
||||
+++ b/plugin.video.yatp/server.py
|
||||
@@ -20,24 +20,8 @@ addon = Addon()
|
||||
_ = addon.initialize_gettext()
|
||||
addon.log_notice('Starting Torrent Server...')
|
||||
|
||||
-# A monkey-patch to set the necessary librorrent version
|
||||
-librorrent_addon = Addon('script.module.libtorrent')
|
||||
-orig_custom_version = librorrent_addon.get_setting('custom_version', False)
|
||||
-orig_set_version = librorrent_addon.get_setting('set_version', False)
|
||||
-librorrent_addon.set_setting('custom_version', 'true')
|
||||
-if addon.libtorrent_version == '1.0.9':
|
||||
- librorrent_addon.set_setting('set_version', '4')
|
||||
-elif addon.libtorrent_version == '1.1.0':
|
||||
- librorrent_addon.set_setting('set_version', '5')
|
||||
-elif addon.libtorrent_version == '1.1.1':
|
||||
- librorrent_addon.set_setting('set_version', '6')
|
||||
-else:
|
||||
- librorrent_addon.set_setting('set_version', '0')
|
||||
-
|
||||
from libs.server import wsgi_app
|
||||
|
||||
-librorrent_addon.set_setting('custom_version', orig_custom_version)
|
||||
-librorrent_addon.set_setting('set_version', orig_set_version)
|
||||
# ======
|
||||
|
||||
if addon.enable_limits:
|
@ -0,0 +1,24 @@ |
||||
{ lib, pythonOlder, buildPythonPackage, fetchPypi, pytestCheckHook }: |
||||
|
||||
buildPythonPackage rec { |
||||
pname = "ajsonrpc"; |
||||
version = "1.1.0"; |
||||
|
||||
disabled = pythonOlder "3.5"; |
||||
|
||||
src = fetchPypi { |
||||
inherit pname version; |
||||
sha256 = "1b5r8975wdnk3qnc1qjnn4lkxmqcir3brbwnxml9ii90dnsw408a"; |
||||
}; |
||||
|
||||
checkInputs = [ pytestCheckHook ]; |
||||
|
||||
pythonImportsCheck = [ "ajsonrpc" ]; |
||||
|
||||
meta = with lib; { |
||||
description = "Async JSON-RPC 2.0 protocol + asyncio server"; |
||||
homepage = "https://github.com/pavlov99/ajsonrpc"; |
||||
license = licenses.mit; |
||||
maintainers = with maintainers; [ oxzi ]; |
||||
}; |
||||
} |
@ -1,8 +0,0 @@ |
||||
source $stdenv/setup |
||||
|
||||
installPhase() { |
||||
mkdir -p $out/bin |
||||
cp -p zdc zdu $out/bin |
||||
} |
||||
|
||||
genericBuild |
@ -1,16 +1,24 @@ |
||||
{lib, stdenv, fetchurl}: |
||||
{ lib, stdenv, fetchurl }: |
||||
|
||||
stdenv.mkDerivation rec { |
||||
name = "zdelta-2.1"; |
||||
builder = ./builder.sh; |
||||
pname = "zdelta"; |
||||
version = "2.1"; |
||||
|
||||
src = fetchurl { |
||||
url = "${meta.homepage}/downloads/${name}.tar.gz"; |
||||
sha256 = "0k6y0r9kv5qiglnr2j4a0yvfynjkvm0pyv8ly28j0pr3w6rbxrh3"; |
||||
url = "https://web.archive.org/web/20160316212948/http://cis.poly.edu/zdelta/downloads/zdelta-2.1.tar.gz"; |
||||
sha256 = "sha256-WiQKWxJkINIwRBcdiuVLMDiupQ8gOsiXOEZvHDa5iFg="; |
||||
}; |
||||
|
||||
makeFlags = [ "CC=${stdenv.cc.targetPrefix}cc" ]; |
||||
|
||||
installPhase = '' |
||||
mkdir -p $out/bin |
||||
cp -p zdc zdu $out/bin |
||||
''; |
||||
|
||||
meta = with lib; { |
||||
homepage = "http://cis.poly.edu/zdelta"; |
||||
platforms = platforms.linux; |
||||
homepage = "https://web.archive.org/web/20160316212948/http://cis.poly.edu/zdelta/"; |
||||
platforms = platforms.all; |
||||
license = licenses.zlib; |
||||
}; |
||||
} |
||||
|
@ -0,0 +1,36 @@ |
||||
{ lib |
||||
, stdenv |
||||
, fetchFromGitHub |
||||
, autoreconfHook |
||||
, pkg-config |
||||
, gtk3 |
||||
}: |
||||
|
||||
stdenv.mkDerivation rec { |
||||
pname = "usbview"; |
||||
version = "2.0"; |
||||
|
||||
src = fetchFromGitHub { |
||||
owner = "gregkh"; |
||||
repo = "usbview"; |
||||
rev = "v${version}"; |
||||
sha256 = "1cw5jjpidjn34rxdjslpdlj99k4dqaq1kz6mplv5hgjdddijvn5p"; |
||||
}; |
||||
|
||||
nativeBuildInputs = [ |
||||
autoreconfHook |
||||
pkg-config |
||||
]; |
||||
|
||||
buildInputs = [ |
||||
gtk3 |
||||
]; |
||||
|
||||
meta = with lib; { |
||||
description = "USB viewer for Linux"; |
||||
license = licenses.gpl2Only; |
||||
homepage = "http://www.kroah.com/linux-usb/"; |
||||
maintainers = with maintainers; [ shamilton ]; |
||||
platforms = platforms.linux; |
||||
}; |
||||
} |
@ -0,0 +1,113 @@ |
||||
{ lib, newScope, kodi }: |
||||
|
||||
with lib; |
||||
|
||||
let self = rec { |
||||
|
||||
addonDir = "/share/kodi/addons"; |
||||
rel = "Matrix"; |
||||
|
||||
callPackage = newScope self; |
||||
|
||||
inherit kodi; |
||||
|
||||
# Convert derivation to a kodi module. Stolen from ../../../top-level/python-packages.nix |
||||
toKodiAddon = drv: drv.overrideAttrs (oldAttrs: { |
||||
# Use passthru in order to prevent rebuilds when possible. |
||||
passthru = (oldAttrs.passthru or {}) // { |
||||
kodiAddonFor = kodi; |
||||
requiredKodiAddons = requiredKodiAddons drv.propagatedBuildInputs; |
||||
}; |
||||
}); |
||||
|
||||
# Check whether a derivation provides a Kodi addon. |
||||
hasKodiAddon = drv: drv ? kodiAddonFor && drv.kodiAddonFor == kodi; |
||||
|
||||
# Get list of required Kodi addons given a list of derivations. |
||||
requiredKodiAddons = drvs: |
||||
let |
||||
modules = filter hasKodiAddon drvs; |
||||
in |
||||
unique (modules ++ concatLists (catAttrs "requiredKodiAddons" modules)); |
||||
|
||||
# package update scripts |
||||
|
||||
addonUpdateScript = callPackage ../applications/video/kodi-packages/addon-update-script { }; |
||||
|
||||
# package builders |
||||
|
||||
buildKodiAddon = callPackage ../applications/video/kodi/build-kodi-addon.nix { }; |
||||
|
||||
buildKodiBinaryAddon = callPackage ../applications/video/kodi/build-kodi-binary-addon.nix { }; |
||||
|
||||
# regular packages |
||||
|
||||
kodi-platform = callPackage ../applications/video/kodi-packages/kodi-platform { }; |
||||
|
||||
# addon packages |
||||
|
||||
controllers = { |
||||
default = callPackage ../applications/video/kodi-packages/controllers { controller = "default"; }; |
||||
|
||||
dreamcast = callPackage ../applications/video/kodi-packages/controllers { controller = "dreamcast"; }; |
||||
|
||||
gba = callPackage ../applications/video/kodi-packages/controllers { controller = "gba"; }; |
||||
|
||||
genesis = callPackage ../applications/video/kodi-packages/controllers { controller = "genesis"; }; |
||||
|
||||
mouse = callPackage ../applications/video/kodi-packages/controllers { controller = "mouse"; }; |
||||
|
||||
n64 = callPackage ../applications/video/kodi-packages/controllers { controller = "n64"; }; |
||||
|
||||
nes = callPackage ../applications/video/kodi-packages/controllers { controller = "nes"; }; |
||||
|
||||
ps = callPackage ../applications/video/kodi-packages/controllers { controller = "ps"; }; |
||||
|
||||
snes = callPackage ../applications/video/kodi-packages/controllers { controller = "snes"; }; |
||||
}; |
||||
|
||||
joystick = callPackage ../applications/video/kodi-packages/joystick { }; |
||||
|
||||
netflix = callPackage ../applications/video/kodi-packages/netflix { }; |
||||
|
||||
svtplay = callPackage ../applications/video/kodi-packages/svtplay { }; |
||||
|
||||
steam-controller = callPackage ../applications/video/kodi-packages/steam-controller { }; |
||||
|
||||
steam-launcher = callPackage ../applications/video/kodi-packages/steam-launcher { }; |
||||
|
||||
pdfreader = callPackage ../applications/video/kodi-packages/pdfreader { }; |
||||
|
||||
pvr-hts = callPackage ../applications/video/kodi-packages/pvr-hts { }; |
||||
|
||||
pvr-hdhomerun = callPackage ../applications/video/kodi-packages/pvr-hdhomerun { }; |
||||
|
||||
pvr-iptvsimple = callPackage ../applications/video/kodi-packages/pvr-iptvsimple { }; |
||||
|
||||
osmc-skin = callPackage ../applications/video/kodi-packages/osmc-skin { }; |
||||
|
||||
vfs-sftp = callPackage ../applications/video/kodi-packages/vfs-sftp { }; |
||||
|
||||
vfs-libarchive = callPackage ../applications/video/kodi-packages/vfs-libarchive { }; |
||||
|
||||
# addon packages (dependencies) |
||||
|
||||
certifi = callPackage ../applications/video/kodi-packages/certifi { }; |
||||
|
||||
chardet = callPackage ../applications/video/kodi-packages/chardet { }; |
||||
|
||||
idna = callPackage ../applications/video/kodi-packages/idna { }; |
||||
|
||||
inputstream-adaptive = callPackage ../applications/video/kodi-packages/inputstream-adaptive { }; |
||||
|
||||
inputstreamhelper = callPackage ../applications/video/kodi-packages/inputstreamhelper { }; |
||||
|
||||
myconnpy = callPackage ../applications/video/kodi-packages/myconnpy { }; |
||||
|
||||
requests = callPackage ../applications/video/kodi-packages/requests { }; |
||||
|
||||
signals = callPackage ../applications/video/kodi-packages/signals { }; |
||||
|
||||
urllib3 = callPackage ../applications/video/kodi-packages/urllib3 { }; |
||||
|
||||
}; in self |
Loading…
Reference in new issue