mirror of
https://github.com/LibreELEC/LibreELEC.tv
synced 2025-09-24 19:46:01 +07:00
Compare commits
276 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9a33cd2a76 | ||
|
|
b0f562fdb0 | ||
|
|
c409e369bc | ||
|
|
ad0254186f | ||
|
|
1555189e7d | ||
|
|
9b1e894782 | ||
|
|
38c0b60fea | ||
|
|
7863fdfb90 | ||
|
|
17d73d1d30 | ||
|
|
f7558a4798 | ||
|
|
90f0ffa348 | ||
|
|
6aa195f595 | ||
|
|
f8c7c8326e | ||
|
|
9183fcdfa0 | ||
|
|
5a270b3807 | ||
|
|
d68baebaa1 | ||
|
|
8719bceafa | ||
|
|
880951d749 | ||
|
|
f4466f211e | ||
|
|
3eeaaeb269 | ||
|
|
202f6146fe | ||
|
|
9244dde514 | ||
|
|
296cee2c4c | ||
|
|
8f236b2799 | ||
|
|
d377104232 | ||
|
|
82b67bee29 | ||
|
|
bcb3a254e5 | ||
|
|
dd0aa3b3e7 | ||
|
|
248f640ead | ||
|
|
5031b3ba8a | ||
|
|
ee35c2601b | ||
|
|
2fd6b9ae31 | ||
|
|
d07b2ce816 | ||
|
|
c99d0173f7 | ||
|
|
7a744cf99a | ||
|
|
bf84e20652 | ||
|
|
c0d7eb62c5 | ||
|
|
fc54f40df0 | ||
|
|
6fbd1e65dc | ||
|
|
5b92ff99ab | ||
|
|
1a4bdeaec0 | ||
|
|
fafa8cbfbc | ||
|
|
563d6d6d48 | ||
|
|
b7bf1958c8 | ||
|
|
086ba5e6fe | ||
|
|
d174df44a6 | ||
|
|
9d525e2383 | ||
|
|
a3ca53e54b | ||
|
|
a54b88f19c | ||
|
|
387ecdc9e7 | ||
|
|
c5b7574ca6 | ||
|
|
251b6ee13d | ||
|
|
45649c3525 | ||
|
|
7507ef5f32 | ||
|
|
5cbfc56947 | ||
|
|
564a734482 | ||
|
|
37878c1101 | ||
|
|
b596550b0e | ||
|
|
07a8ee8938 | ||
|
|
fcb78a50c5 | ||
|
|
83bd9b7dc3 | ||
|
|
b8c25675d3 | ||
|
|
bfdea4bf29 | ||
|
|
73f7933525 | ||
|
|
b6039226b7 | ||
|
|
806e0f5ef8 | ||
|
|
4ce3c96239 | ||
|
|
a1d19b43e0 | ||
|
|
06b81cccdc | ||
|
|
892d2943cc | ||
|
|
97bfce34c0 | ||
|
|
b0be544ba2 | ||
|
|
38753fd02c | ||
|
|
cffcac2157 | ||
|
|
8d99a4bf24 | ||
|
|
00ef38defa | ||
|
|
45d5e80ac5 | ||
|
|
b43819bf6d | ||
|
|
e06be90c11 | ||
|
|
5b5e1dfb9e | ||
|
|
305d1a6518 | ||
|
|
a3b8e868b7 | ||
|
|
7426953602 | ||
|
|
a4484efb92 | ||
|
|
807a523c60 | ||
|
|
7c1f88db24 | ||
|
|
c3ca265704 | ||
|
|
34e01ffd19 | ||
|
|
f999195ee4 | ||
|
|
2a5ddc2d25 | ||
|
|
70e5377081 | ||
|
|
c33ef604f3 | ||
|
|
3b81e1f895 | ||
|
|
15fb02cc4f | ||
|
|
eb9923c34c | ||
|
|
eeb08c93e5 | ||
|
|
f6aa45e14f | ||
|
|
fbfa284bd4 | ||
|
|
864420aae0 | ||
|
|
d9174ee766 | ||
|
|
e290b1c429 | ||
|
|
78e2ec014a | ||
|
|
511c9abe98 | ||
|
|
69117e577c | ||
|
|
1f878f7d4f | ||
|
|
80a9367bae | ||
|
|
b7e52ba5f8 | ||
|
|
9a9092b40d | ||
|
|
068d87309d | ||
|
|
372c4792b6 | ||
|
|
b6a8709fae | ||
|
|
c7e9dbf3da | ||
|
|
690a4fbf46 | ||
|
|
8cf52171a8 | ||
|
|
93a98ea0e8 | ||
|
|
a9bd0de19c | ||
|
|
1a54f9ad50 | ||
|
|
d1095debcb | ||
|
|
f8d9b98b7d | ||
|
|
758800a252 | ||
|
|
84cc997dc0 | ||
|
|
3a119595dc | ||
|
|
f1977b90c5 | ||
|
|
d2b3612ef2 | ||
|
|
185f6f76f7 | ||
|
|
c4aa4ed8cc | ||
|
|
115b829af2 | ||
|
|
69dad39f28 | ||
|
|
af4ea9d439 | ||
|
|
17de9d54ac | ||
|
|
b4907acc8e | ||
|
|
5533b2f389 | ||
|
|
b350c79dc3 | ||
|
|
3d675c9a53 | ||
|
|
1680dbaf12 | ||
|
|
b943cd209b | ||
|
|
c0788bf034 | ||
|
|
e10d59f750 | ||
|
|
4de8123127 | ||
|
|
3a8ef09613 | ||
|
|
171bbd5cfb | ||
|
|
1cb93803d5 | ||
|
|
03cdde395f | ||
|
|
d71f38c101 | ||
|
|
63e3a0cace | ||
|
|
efb9002222 | ||
|
|
e878ad774a | ||
|
|
719f02112a | ||
|
|
aab96fceac | ||
|
|
806b9eed61 | ||
|
|
8890cb5dc8 | ||
|
|
0f41381753 | ||
|
|
f3adad642d | ||
|
|
7ec62a0242 | ||
|
|
728ba5f3e6 | ||
|
|
841b70d009 | ||
|
|
f2801aa47c | ||
|
|
db0e96ae97 | ||
|
|
9ead1e460a | ||
|
|
2aa26eb5b0 | ||
|
|
ded92d470e | ||
|
|
77192d1f37 | ||
|
|
64e9552d1b | ||
|
|
6464772a8e | ||
|
|
90f94bb767 | ||
|
|
3a9c971f50 | ||
|
|
1bca26e8ba | ||
|
|
bb4c561fe2 | ||
|
|
636bc77df6 | ||
|
|
0adb582098 | ||
|
|
a09d471083 | ||
|
|
9bd74cef15 | ||
|
|
f5f9a9e1cc | ||
|
|
25c52d4e55 | ||
|
|
c44ef45e99 | ||
|
|
1d502b3242 | ||
|
|
ceb3783c78 | ||
|
|
a0f002bc17 | ||
|
|
d996527193 | ||
|
|
9da7818ac2 | ||
|
|
34b1b6f77e | ||
|
|
d34ae2aca9 | ||
|
|
788526ae54 | ||
|
|
197ef0ec26 | ||
|
|
7468c12ca4 | ||
|
|
2ca8a7228b | ||
|
|
02b5256816 | ||
|
|
866c027410 | ||
|
|
1f9729d213 | ||
|
|
08665f1c32 | ||
|
|
8b5e4c03d8 | ||
|
|
0da28ba159 | ||
|
|
7b3313a17d | ||
|
|
c1fd8cdbe6 | ||
|
|
98490c3218 | ||
|
|
1e008188ba | ||
|
|
d1ae498653 | ||
|
|
48eb53b647 | ||
|
|
4d4de8c13d | ||
|
|
98a35fd100 | ||
|
|
afe8988f4d | ||
|
|
7f73298c27 | ||
|
|
b3166cec47 | ||
|
|
9f01192546 | ||
|
|
a426a3d199 | ||
|
|
d7b5ed8645 | ||
|
|
5c9a3e81fa | ||
|
|
f222356059 | ||
|
|
35c0915eac | ||
|
|
0926cf2776 | ||
|
|
458f3e191a | ||
|
|
4cb93f084a | ||
|
|
cd5095bc10 | ||
|
|
c2dec8fd3f | ||
|
|
3077558ecb | ||
|
|
47aba0a344 | ||
|
|
902c7dcf41 | ||
|
|
ef67de1ff4 | ||
|
|
5f5e719c48 | ||
|
|
aae861df88 | ||
|
|
4747e6e688 | ||
|
|
cf1296b3d1 | ||
|
|
a798e0b5d8 | ||
|
|
b724032556 | ||
|
|
aacd3629ff | ||
|
|
13d3f9f82d | ||
|
|
aadbd4cace | ||
|
|
df7391bef6 | ||
|
|
37ef591093 | ||
|
|
cbc7d3e75c | ||
|
|
dfc23bf03e | ||
|
|
184cf5295c | ||
|
|
d6a255cd1b | ||
|
|
0a31b3eb4e | ||
|
|
23a9a4899d | ||
|
|
0562e5adbc | ||
|
|
035fa332cd | ||
|
|
e16d9e8e44 | ||
|
|
8b01ceb005 | ||
|
|
d7876df684 | ||
|
|
707238c7dd | ||
|
|
daf339777c | ||
|
|
6f264f6b8f | ||
|
|
e499c2b372 | ||
|
|
2c7b4ed0d3 | ||
|
|
e39f9656e0 | ||
|
|
0f10694c26 | ||
|
|
62b254abb4 | ||
|
|
84d83d1083 | ||
|
|
22a018934d | ||
|
|
61296540f0 | ||
|
|
9f7c82be4b | ||
|
|
177094ca2d | ||
|
|
d7d589e7d7 | ||
|
|
97fac3eb57 | ||
|
|
72692fa9f1 | ||
|
|
1f23cfa056 | ||
|
|
b91fd79e4a | ||
|
|
258e4b9b3d | ||
|
|
a720cd39f5 | ||
|
|
d7d581451a | ||
|
|
c69b7674a7 | ||
|
|
cd68b48986 | ||
|
|
266ffa3db7 | ||
|
|
dd3231db00 | ||
|
|
d3d944b2b2 | ||
|
|
2dbecfad4f | ||
|
|
3597832ab1 | ||
|
|
29613fc147 | ||
|
|
4543d07b1a | ||
|
|
47a43e3dde | ||
|
|
47bfcfa8d9 | ||
|
|
80ac35852f | ||
|
|
048eb0cbfa | ||
|
|
e23b581709 | ||
|
|
a38c6134e8 |
@@ -20,7 +20,6 @@
|
||||
generic|cortex-a35|cortex-a53|cortex-a57|cortex-a72|exynos-m1|qdf24xx|thunderx|xgene1|cortex-a57.cortex-a53|cortex-a72.cortex-a53|cortex-a73.cortex-a53)
|
||||
TARGET_SUBARCH=aarch64
|
||||
TARGET_VARIANT=armv8-a
|
||||
TARGET_ABI=eabi
|
||||
;;
|
||||
esac
|
||||
|
||||
|
||||
@@ -3,8 +3,8 @@
|
||||
# Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv)
|
||||
|
||||
PKG_NAME="ccid"
|
||||
PKG_VERSION="1.5.1"
|
||||
PKG_SHA256="e7a78c398ec0d617a4f98bac70d5b64f78689284dd0ae87d4692e2857f117377"
|
||||
PKG_VERSION="1.5.2"
|
||||
PKG_SHA256="13934487e6f8b48f699a16d367cc7a1af7a3ca874de721ac6e9633beb86e7219"
|
||||
PKG_LICENSE="LGPL"
|
||||
PKG_SITE="https://ccid.apdu.fr"
|
||||
PKG_URL="https://ccid.apdu.fr/files/${PKG_NAME}-${PKG_VERSION}.tar.bz2"
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
|
||||
PKG_NAME="cli"
|
||||
PKG_VERSION="$(get_pkg_version moby)"
|
||||
PKG_SHA256="37bc1c71a782fc10d35aa6708c1b3c90a71f3947c33665cb0de68df25dc14d94"
|
||||
PKG_SHA256="b31eb0343e8bb587e921a7630baa659896602072a77ad97720e5f2a8e48005e9"
|
||||
PKG_LICENSE="ASL"
|
||||
PKG_SITE="https://github.com/docker/cli"
|
||||
PKG_URL="https://github.com/docker/cli/archive/v${PKG_VERSION}.tar.gz"
|
||||
@@ -12,7 +12,7 @@ PKG_LONGDESC="The Docker CLI"
|
||||
PKG_TOOLCHAIN="manual"
|
||||
|
||||
# Git commit of the matching release https://github.com/docker/cli/releases
|
||||
export PKG_GIT_COMMIT="a5ee5b1dfc9b8f08ed9e020bb54fc18550173ef6"
|
||||
export PKG_GIT_COMMIT="ef23cbc4315ae76c744e02d687c09548ede461bd"
|
||||
|
||||
configure_target() {
|
||||
go_configure
|
||||
|
||||
@@ -3,8 +3,8 @@
|
||||
# Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv)
|
||||
|
||||
PKG_NAME="containerd"
|
||||
PKG_VERSION="1.6.16"
|
||||
PKG_SHA256="e0a893cf67df9dfaecbcde2ba4e896efb3a86ffe48dcfe0d2b26f7cf19b5af3a"
|
||||
PKG_VERSION="1.7.1"
|
||||
PKG_SHA256="fd844af82afda7242d8eba5e0086c5a0d54ddc3041c1bbdd4d3c62bfee844e3a"
|
||||
PKG_LICENSE="APL"
|
||||
PKG_SITE="https://containerd.io"
|
||||
PKG_URL="https://github.com/containerd/containerd/archive/v${PKG_VERSION}.tar.gz"
|
||||
@@ -19,9 +19,9 @@ pre_make_target() {
|
||||
|
||||
go_configure
|
||||
|
||||
export CONTAINERD_VERSION=${PKG_VERSION}
|
||||
export CONTAINERD_REVISION=${PKG_GIT_COMMIT}
|
||||
export CONTAINERD_PKG=github.com/containerd/containerd
|
||||
export CONTAINERD_VERSION="${PKG_VERSION}"
|
||||
export CONTAINERD_REVISION="${PKG_GIT_COMMIT}"
|
||||
export CONTAINERD_PKG="github.com/containerd/containerd"
|
||||
export LDFLAGS="-w -extldflags -static -X ${CONTAINERD_PKG}/version.Version=${CONTAINERD_VERSION} -X ${CONTAINERD_PKG}/version.Revision=${CONTAINERD_REVISION} -X ${CONTAINERD_PKG}/version.Package=${CONTAINERD_PKG} -extld ${CC}"
|
||||
export GO111MODULE=off
|
||||
|
||||
|
||||
32
packages/addons/addon-depends/docker/ctop/package.mk
Normal file
32
packages/addons/addon-depends/docker/ctop/package.mk
Normal file
@@ -0,0 +1,32 @@
|
||||
# SPDX-License-Identifier: GPL-2.0-only
|
||||
# Copyright (C) 2023-present Team LibreELEC (https://libreelec.tv)
|
||||
|
||||
PKG_NAME="ctop"
|
||||
PKG_VERSION="0.7.7"
|
||||
PKG_SHA256="0db439f2030af73ad5345884b08a33a762c3b41b30604223dd0ebddde72d2741"
|
||||
PKG_LICENSE="MIT"
|
||||
PKG_SITE="https://ctop.sh"
|
||||
PKG_URL="https://github.com/bcicen/ctop/archive/v${PKG_VERSION}.tar.gz"
|
||||
PKG_DEPENDS_TARGET="toolchain go:host"
|
||||
PKG_LONGDESC="Top-like interface for container metrics"
|
||||
PKG_TOOLCHAIN="manual"
|
||||
|
||||
# Git commit of the matching release https://github.com/bcicen/ctop/releases
|
||||
PKG_GIT_COMMIT="11a1cb10f416b4ca5e36c22c1acc2d11dbb24fb4"
|
||||
|
||||
pre_make_target() {
|
||||
go_configure
|
||||
|
||||
export CTOP_VERSION="${PKG_VERSION}"
|
||||
export CTOP_REVISION="${PKG_GIT_COMMIT}"
|
||||
export CTOP_PKG="github.com/bcicen/ctop"
|
||||
export LDFLAGS="-w -extldflags -static -X main.version=${CTOP_VERSION} -X main.build=${CTOP_REVISION} -extld ${CC}"
|
||||
|
||||
mkdir -p ${GOPATH}/src/github.com/bcicen
|
||||
ln -fs ${PKG_BUILD} ${GOPATH}/src/${CTOP_PKG}
|
||||
}
|
||||
|
||||
make_target() {
|
||||
mkdir -p bin
|
||||
${GOLANG} build -v -o bin/ctop -a -tags "static_build release" -ldflags "${LDFLAGS}"
|
||||
}
|
||||
@@ -2,8 +2,8 @@
|
||||
# Copyright (C) 2022-present Team LibreELEC (https://libreelec.tv)
|
||||
|
||||
PKG_NAME="moby"
|
||||
PKG_VERSION="23.0.1"
|
||||
PKG_SHA256="c8e6c0ac5f0c772023e3430f80190e0f86644b6d94cac63118b03561385f7b56"
|
||||
PKG_VERSION="23.0.6"
|
||||
PKG_SHA256="3bbd32f401f652cc15084d3c09bd7acd381571802beac9333fd63d803dc66c3e"
|
||||
PKG_LICENSE="ASL"
|
||||
PKG_SITE="https://mobyproject.org/"
|
||||
PKG_URL="https://github.com/moby/moby/archive/v${PKG_VERSION}.tar.gz"
|
||||
@@ -12,7 +12,7 @@ PKG_LONGDESC="Moby is an open-source project created by Docker to enable and acc
|
||||
PKG_TOOLCHAIN="manual"
|
||||
|
||||
# Git commit of the matching release https://github.com/moby/moby
|
||||
export PKG_GIT_COMMIT="bc3805a0a0d3b5bd3f0e6c69f46ac08dd53377c7"
|
||||
export PKG_GIT_COMMIT="9dbdbd4b6d7681bd18c897a6ba0376073c2a72ff"
|
||||
|
||||
PKG_MOBY_BUILDTAGS="daemon \
|
||||
autogen \
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
# Copyright (C) 2022-present Team LibreELEC (https://libreelec.tv)
|
||||
|
||||
PKG_NAME="aspnet6-runtime"
|
||||
PKG_VERSION="6.0.14"
|
||||
PKG_VERSION="6.0.19"
|
||||
PKG_LICENSE="MIT"
|
||||
PKG_SITE="https://dotnet.microsoft.com/"
|
||||
PKG_DEPENDS_TARGET="toolchain"
|
||||
@@ -11,16 +11,16 @@ PKG_TOOLCHAIN="manual"
|
||||
|
||||
case "${ARCH}" in
|
||||
"aarch64")
|
||||
PKG_SHA256="c25a09594965b241ee42ddb41d5fb68afab1b58e37a68317f2678a7cf7309a8b"
|
||||
PKG_URL="https://download.visualstudio.microsoft.com/download/pr/10762208-8896-423a-b7f3-5084c7548ce7/620af5c42e5a4087478890294dbe39fb/aspnetcore-runtime-6.0.14-linux-arm64.tar.gz"
|
||||
PKG_SHA256="fb4d55dd30f3956595c398477436322819fd1cf7d273a559db5e43a14435c9bb"
|
||||
PKG_URL="https://download.visualstudio.microsoft.com/download/pr/86b5e7ea-d316-4b44-a543-95cbfeafadd9/7e7b8ed4c007d9290c2099b5bcd144af/aspnetcore-runtime-6.0.19-linux-arm64.tar.gz"
|
||||
;;
|
||||
"arm")
|
||||
PKG_SHA256="da7f9e231476cfb5f52f1f469a1ef22b5bb052a0ce53af97b21b70bca0abef0a"
|
||||
PKG_URL="https://download.visualstudio.microsoft.com/download/pr/4fac9144-1998-4d99-8000-6f8c8a19e9a3/3d722a6e310cf82c898f91138971be5b/aspnetcore-runtime-6.0.14-linux-arm.tar.gz"
|
||||
PKG_SHA256="d9ac8112187666535e2940daa90c55606d2f62a3a267ae471c92859e25a87b60"
|
||||
PKG_URL="https://download.visualstudio.microsoft.com/download/pr/f33d9dc8-1f77-48dc-89f5-8f691038d629/90926d8575953228ee5271530e08b595/aspnetcore-runtime-6.0.19-linux-arm.tar.gz"
|
||||
;;
|
||||
"x86_64")
|
||||
PKG_SHA256="721dc8e29892dcaaaab4bc7d2e8630a98d349f2d832855156f7b7898d1a55b07"
|
||||
PKG_URL="https://download.visualstudio.microsoft.com/download/pr/092f7e69-2e23-40b3-8f36-628d25ac7109/4995e4e141b26ea049163af84592222c/aspnetcore-runtime-6.0.14-linux-x64.tar.gz"
|
||||
PKG_SHA256="217e4dfb3c9469580559f5714daa3c505f36156d2bd97a15238d240c6bcc54bf"
|
||||
PKG_URL="https://download.visualstudio.microsoft.com/download/pr/fb0913f6-79a8-40b6-b604-bda42b60d0c2/eb98e78d3d75c16326a54cd0277b5406/aspnetcore-runtime-6.0.19-linux-x64.tar.gz"
|
||||
;;
|
||||
esac
|
||||
PKG_SOURCE_NAME="aspnetcore-runtime_${PKG_VERSION}_${ARCH}.tar.gz"
|
||||
|
||||
@@ -3,8 +3,8 @@
|
||||
# Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv)
|
||||
|
||||
PKG_NAME="go"
|
||||
PKG_VERSION="1.19.5"
|
||||
PKG_SHA256="1c24a6a2bf71d64d0ca8e228028d6108521f06b6edc7bf6b34ed6d767a795809"
|
||||
PKG_VERSION="1.20.3"
|
||||
PKG_SHA256="991a67cecebb7b9b1237fdbca76c4754a9f5e1669d5d49b58a9931813047e905"
|
||||
PKG_LICENSE="BSD"
|
||||
PKG_SITE="https://golang.org"
|
||||
PKG_URL="https://github.com/golang/go/archive/${PKG_NAME}${PKG_VERSION}.tar.gz"
|
||||
|
||||
14
packages/addons/addon-depends/libseccomp/package.mk
Normal file
14
packages/addons/addon-depends/libseccomp/package.mk
Normal file
@@ -0,0 +1,14 @@
|
||||
# SPDX-License-Identifier: GPL-2.0-only
|
||||
# Copyright (C) 2023-present Team LibreELEC (https://libreelec.tv)
|
||||
|
||||
PKG_NAME="libseccomp"
|
||||
PKG_VERSION="2.5.4"
|
||||
PKG_SHA256="d82902400405cf0068574ef3dc1fe5f5926207543ba1ae6f8e7a1576351dcbdb"
|
||||
PKG_LICENSE="LGPLv2.1"
|
||||
PKG_SITE="https://github.com/seccomp/libseccomp"
|
||||
PKG_URL="https://github.com/seccomp/libseccomp/releases/download/v${PKG_VERSION}/libseccomp-${PKG_VERSION}.tar.gz"
|
||||
PKG_DEPENDS_TARGET="toolchain"
|
||||
PKG_LONGDESC="An easy to use, platform independent, interface to the Linux Kernel syscall filtering mechanism"
|
||||
PKG_BUILD_FLAGS="-sysroot"
|
||||
|
||||
PKG_CONFIGURE_OPTS_TARGET+=" --enable-static --enable-shared"
|
||||
@@ -2,8 +2,8 @@
|
||||
# Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv)
|
||||
|
||||
PKG_NAME="mpg123"
|
||||
PKG_VERSION="1.31.1"
|
||||
PKG_SHA256="5dcb0936efd44cb583498b6585845206f002a7b19d5066a2683be361954d955a"
|
||||
PKG_VERSION="1.31.3"
|
||||
PKG_SHA256="1ca77d3a69a5ff845b7a0536f783fee554e1041139a6b978f6afe14f5814ad1a"
|
||||
PKG_LICENSE="LGPLv2"
|
||||
PKG_SITE="https://www.mpg123.org/"
|
||||
PKG_URL="https://downloads.sourceforge.net/sourceforge/mpg123/mpg123-${PKG_VERSION}.tar.bz2"
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
# Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv)
|
||||
|
||||
PKG_NAME="mpv-drmprime"
|
||||
PKG_VERSION="0.35.0"
|
||||
PKG_SHA256="dc411c899a64548250c142bf1fa1aa7528f1b4398a24c86b816093999049ec00"
|
||||
PKG_VERSION="0.35.1"
|
||||
PKG_SHA256="41df981b7b84e33a2ef4478aaf81d6f4f5c8b9cd2c0d337ac142fc20b387d1a9"
|
||||
PKG_LICENSE="GPL"
|
||||
PKG_SITE="https://mpv.io/"
|
||||
PKG_URL="https://github.com/mpv-player/mpv/archive/v${PKG_VERSION}.tar.gz"
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
# Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv)
|
||||
|
||||
PKG_NAME="libpcap"
|
||||
PKG_VERSION="1.10.2"
|
||||
PKG_SHA256="db6d79d4ad03b8b15fb16c42447d093ad3520c0ec0ae3d331104dcfb1ce77560"
|
||||
PKG_VERSION="1.10.3"
|
||||
PKG_SHA256="2a8885c403516cf7b0933ed4b14d6caa30e02052489ebd414dc75ac52e7559e6"
|
||||
PKG_LICENSE="GPL"
|
||||
PKG_SITE="https://www.tcpdump.org/"
|
||||
PKG_URL="https://www.tcpdump.org/release/libpcap-${PKG_VERSION}.tar.gz"
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
# Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv)
|
||||
|
||||
PKG_NAME="iperf"
|
||||
PKG_VERSION="3.12"
|
||||
PKG_SHA256="e38e0a97b30a97b4355da93467160a20dea10932f6c17473774802e03d61d4a7"
|
||||
PKG_VERSION="3.13"
|
||||
PKG_SHA256="a49d23fe0d3b1482047ad7f3b9e384c69657a63b486c4e3f0ce512a077d94434"
|
||||
PKG_LICENSE="BSD"
|
||||
PKG_SITE="http://software.es.net/iperf/"
|
||||
PKG_URL="https://github.com/esnet/iperf/archive/${PKG_VERSION}.tar.gz"
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
# Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv)
|
||||
|
||||
PKG_NAME="rar2fs"
|
||||
PKG_VERSION="1.29.5"
|
||||
PKG_SHA256="a56e9f2fd3d5037087b8405cff85ce7ffb74a904176f33f55b7bd15117cff2be"
|
||||
PKG_VERSION="1.29.6"
|
||||
PKG_SHA256="ba3a0b649f2322498d54168f03d2e8bca9b1c96d70d0d97d83ea336a7525d4cb"
|
||||
PKG_LICENSE="GPL3"
|
||||
PKG_SITE="https://github.com/hasse69/rar2fs"
|
||||
PKG_URL="https://github.com/hasse69/rar2fs/releases/download/v${PKG_VERSION}/rar2fs-${PKG_VERSION}.tar.gz"
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
# Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv)
|
||||
|
||||
PKG_NAME="tcpdump"
|
||||
PKG_VERSION="4.99.2"
|
||||
PKG_SHA256="f4304357d34b79d46f4e17e654f1f91f9ce4e3d5608a1badbd53295a26fb44d5"
|
||||
PKG_VERSION="4.99.3"
|
||||
PKG_SHA256="ad75a6ed3dc0d9732945b2e5483cb41dc8b4b528a169315e499c6861952e73b3"
|
||||
PKG_SITE="https://www.tcpdump.org/"
|
||||
PKG_URL="https://www.tcpdump.org/release/tcpdump-${PKG_VERSION}.tar.gz"
|
||||
PKG_DEPENDS_TARGET="toolchain libpcap libtirpc"
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
# Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv)
|
||||
|
||||
PKG_NAME="librelp"
|
||||
PKG_VERSION="1.10.0"
|
||||
PKG_SHA256="148db4e4d1a23e8136e9ec08810929a55faf5d45e24c2e3186d5ab34355dab31"
|
||||
PKG_VERSION="1.11.0"
|
||||
PKG_SHA256="7719b5f31e07cbb9872289ad32b787c613b5355d407982a0a2c4d69938457fd6"
|
||||
PKG_LICENSE="GPL"
|
||||
PKG_SITE="https://www.rsyslog.com/category/librelp/"
|
||||
PKG_URL="https://download.rsyslog.com/librelp/${PKG_NAME}-${PKG_VERSION}.tar.gz"
|
||||
|
||||
@@ -3,12 +3,12 @@
|
||||
# Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv)
|
||||
|
||||
PKG_NAME="runc"
|
||||
PKG_VERSION="1.1.4"
|
||||
PKG_SHA256="4f02077432642eebd768fc857318ae7929290b3a3511eb1be338005e360cfa34"
|
||||
PKG_VERSION="1.1.7"
|
||||
PKG_SHA256="f1885d6dfa188f8112328ac2355e5d67346174a2e2e795ec514a972bcbfcc2fa"
|
||||
PKG_LICENSE="APL"
|
||||
PKG_SITE="https://github.com/opencontainers/runc"
|
||||
PKG_URL="https://github.com/opencontainers/runc/archive/v${PKG_VERSION}.tar.gz"
|
||||
PKG_DEPENDS_TARGET="toolchain go:host"
|
||||
PKG_DEPENDS_TARGET="toolchain go:host libseccomp"
|
||||
PKG_LONGDESC="A CLI tool for spawning and running containers according to the OCI specification."
|
||||
PKG_TOOLCHAIN="manual"
|
||||
|
||||
@@ -19,6 +19,7 @@ pre_make_target() {
|
||||
go_configure
|
||||
|
||||
export LDFLAGS="-w -extldflags -static -X main.gitCommit=${PKG_GIT_COMMIT} -X main.version=$(cat ./VERSION) -extld ${CC}"
|
||||
export PKG_CONFIG_PATH="$(get_install_dir libseccomp)/usr/lib/pkgconfig:${PKG_CONFIG_PATH}"
|
||||
|
||||
mkdir -p ${GOPATH}
|
||||
if [ -d ${PKG_BUILD}/vendor ]; then
|
||||
@@ -30,5 +31,5 @@ pre_make_target() {
|
||||
|
||||
make_target() {
|
||||
mkdir -p bin
|
||||
${GOLANG} build -v -o bin/runc -a -tags "cgo static_build" -ldflags "${LDFLAGS}" ./
|
||||
${GOLANG} build -v -o bin/runc -a -tags "cgo seccomp static_build" -ldflags "${LDFLAGS}" ./
|
||||
}
|
||||
@@ -2,8 +2,8 @@
|
||||
# Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv)
|
||||
|
||||
PKG_NAME="asio"
|
||||
PKG_VERSION="1.24.0"
|
||||
PKG_SHA256="6bb8139ebc1c97a4364f6e517b9258ecc96345a3bfc4d110f931ac123dbdc824"
|
||||
PKG_VERSION="1.28.0"
|
||||
PKG_SHA256="5c2af07ef73b42a2d48e34c0ecbf41cd40dc823bc681bf5833c129384999c963"
|
||||
PKG_LICENSE="BSL"
|
||||
PKG_SITE="http://think-async.com/Asio"
|
||||
PKG_URL="https://github.com/chriskohlhoff/asio/archive/asio-${PKG_VERSION//./-}.zip"
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
# Copyright (C) 2022-present Team LibreELEC (https://libreelec.tv)
|
||||
|
||||
PKG_NAME="nqptp"
|
||||
PKG_VERSION="c71b49a3556ba8547ee28482cb31a97fe99298aa"
|
||||
PKG_SHA256="02ed710ed37269adbede06fcd4e12892cc0f9d14d5c68b7f45d67b8694bff1e4"
|
||||
PKG_VERSION="1.2.1"
|
||||
PKG_SHA256="fab700572961ca81addb405e8bd4bd57c47259f91e7e8e0f5f82240c38c63ce5"
|
||||
PKG_LICENSE="GPL-2.0"
|
||||
PKG_SITE="https://github.com/mikebrady/nqptp"
|
||||
PKG_URL="https://github.com/mikebrady/nqptp/archive/${PKG_VERSION}.tar.gz"
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
# Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv)
|
||||
|
||||
PKG_NAME="shairport-sync"
|
||||
PKG_VERSION="4.1.1"
|
||||
PKG_SHA256="e55caad73dcd36341baf8947cf5e0923997370366d6caf3dd917b345089c4a20"
|
||||
PKG_VERSION="4.2"
|
||||
PKG_SHA256="649d95eede8b9284b2e8b9c97d18c1c64cffae0a6c75bc4f03e3ae494a3e25b6"
|
||||
PKG_LICENSE="OSS"
|
||||
PKG_SITE="https://github.com/mikebrady/shairport-sync"
|
||||
PKG_URL="https://github.com/mikebrady/shairport-sync/archive/${PKG_VERSION}.tar.gz"
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
# Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv)
|
||||
|
||||
PKG_NAME="snapcast"
|
||||
PKG_VERSION="0.26.0"
|
||||
PKG_SHA256="166353267a5c461a3a0e7cbd05d78c4bfdaebeda078801df3b76820b54f27683"
|
||||
PKG_VERSION="0.27.0"
|
||||
PKG_SHA256="c662c6eafbaa42a4797a4ed6ba4a7602332abf99f6ba6ea88ff8ae59978a86ba"
|
||||
PKG_LICENSE="GPLv3"
|
||||
PKG_SITE="https://github.com/badaix/snapcast"
|
||||
PKG_URL="https://github.com/badaix/snapcast/archive/v${PKG_VERSION}.tar.gz"
|
||||
|
||||
@@ -1,48 +0,0 @@
|
||||
commit 438b83b0b93f2914b1830347b4e24722618d9ba4
|
||||
Author: Rudi Heitbaum <rudi@heitbaum.com>
|
||||
Date: Wed Dec 21 11:31:29 2022 +0000
|
||||
|
||||
server/control_session_http: update for boost 1.81.0
|
||||
|
||||
diff --git a/server/control_session_http.cpp b/server/control_session_http.cpp
|
||||
index 385b3197..6522f5a9 100644
|
||||
--- a/server/control_session_http.cpp
|
||||
+++ b/server/control_session_http.cpp
|
||||
@@ -127,8 +127,8 @@ boost::beast::string_view mime_type(boost::beast::string_view path)
|
||||
std::string path_cat(boost::beast::string_view base, boost::beast::string_view path)
|
||||
{
|
||||
if (base.empty())
|
||||
- return path.to_string();
|
||||
- std::string result = base.to_string();
|
||||
+ return static_cast<std::string>(path);
|
||||
+ std::string result = static_cast<std::string>(base);
|
||||
char constexpr path_separator = '/';
|
||||
if (result.back() == path_separator)
|
||||
result.resize(result.size() - 1);
|
||||
@@ -171,7 +171,7 @@ void ControlSessionHttp::handle_request(http::request<Body, http::basic_fields<A
|
||||
res.set(http::field::server, HTTP_SERVER_NAME);
|
||||
res.set(http::field::content_type, "text/html");
|
||||
res.keep_alive(req.keep_alive());
|
||||
- res.body() = why.to_string();
|
||||
+ res.body() = static_cast<std::string>(why);
|
||||
res.prepare_payload();
|
||||
return res;
|
||||
};
|
||||
@@ -182,7 +182,7 @@ void ControlSessionHttp::handle_request(http::request<Body, http::basic_fields<A
|
||||
res.set(http::field::server, HTTP_SERVER_NAME);
|
||||
res.set(http::field::content_type, "text/html");
|
||||
res.keep_alive(req.keep_alive());
|
||||
- res.body() = "The resource '" + target.to_string() + "' was not found.";
|
||||
+ res.body() = "The resource '" + static_cast<std::string>(target) + "' was not found.";
|
||||
res.prepare_payload();
|
||||
return res;
|
||||
};
|
||||
@@ -204,7 +204,7 @@ void ControlSessionHttp::handle_request(http::request<Body, http::basic_fields<A
|
||||
res.set(http::field::server, HTTP_SERVER_NAME);
|
||||
res.set(http::field::content_type, "text/html");
|
||||
res.keep_alive(req.keep_alive());
|
||||
- res.body() = "An error occurred: '" + what.to_string() + "'";
|
||||
+ res.body() = "An error occurred: '" + static_cast<std::string>(what) + "'";
|
||||
res.prepare_payload();
|
||||
return res;
|
||||
};
|
||||
@@ -2,8 +2,8 @@
|
||||
# Copyright (C) 2020-present Team LibreELEC (https://libreelec.tv)
|
||||
|
||||
PKG_NAME="bottom"
|
||||
PKG_VERSION="0.6.8"
|
||||
PKG_SHA256="4e4eb251972a7af8c46dd36bcf1335fea334fb670569434fbfd594208905b2d9"
|
||||
PKG_VERSION="0.8.0"
|
||||
PKG_SHA256="0fe6a826d18570ab33b2af3b26ce28c61e3aa830abb2b622f2c3b81da802437a"
|
||||
PKG_LICENSE="MIT"
|
||||
PKG_SITE="https://github.com/ClementTsang/bottom"
|
||||
PKG_URL="https://github.com/ClementTsang/bottom/archive/${PKG_VERSION}.tar.gz"
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
# Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv)
|
||||
|
||||
PKG_NAME="diffutils"
|
||||
PKG_VERSION="3.8"
|
||||
PKG_SHA256="a6bdd7d1b31266d11c4f4de6c1b748d4607ab0231af5188fc2533d0ae2438fec"
|
||||
PKG_VERSION="3.9"
|
||||
PKG_SHA256="d80d3be90a201868de83d78dad3413ad88160cc53bcc36eb9eaf7c20dbf023f1"
|
||||
PKG_LICENSE="GPL"
|
||||
PKG_SITE="http://www.gnu.org/software/diffutils/"
|
||||
PKG_URL="http://ftpmirror.gnu.org/diffutils/${PKG_NAME}-${PKG_VERSION}.tar.xz"
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
# Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv)
|
||||
|
||||
PKG_NAME="htop"
|
||||
PKG_VERSION="3.2.1"
|
||||
PKG_SHA256="b5ffac1949a8daaabcffa659c0964360b5008782aae4dfa7702d2323cfb4f438"
|
||||
PKG_VERSION="3.2.2"
|
||||
PKG_SHA256="3829c742a835a0426db41bb039d1b976420c21ec65e93b35cd9bfd2d57f44ac8"
|
||||
PKG_LICENSE="GPL"
|
||||
PKG_SITE="https://hisham.hm/htop"
|
||||
PKG_URL="https://github.com/htop-dev/htop/archive/${PKG_VERSION}.tar.gz"
|
||||
|
||||
@@ -12,5 +12,6 @@ PKG_LONGDESC="A small tool to provide detailed information on the hardware confi
|
||||
PKG_BUILD_FLAGS="-sysroot"
|
||||
|
||||
make_target() {
|
||||
export VERSION="B.${PKG_VERSION}"
|
||||
make CXX=${CXX} -C src/
|
||||
}
|
||||
|
||||
@@ -3,8 +3,8 @@
|
||||
# Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv)
|
||||
|
||||
PKG_NAME="mc"
|
||||
PKG_VERSION="4.8.28"
|
||||
PKG_SHA256="e994d9be9a7172e9ac4a4ad62107921f6aa312e668b056dfe5b8bcebbaf53803"
|
||||
PKG_VERSION="4.8.29"
|
||||
PKG_SHA256="01d8a3b94f58180cca5bf17257b5078d1fd6fd27a9b5c0e970ec767549540ad4"
|
||||
PKG_LICENSE="GPL"
|
||||
PKG_SITE="http://www.midnight-commander.org"
|
||||
PKG_URL="http://ftp.midnight-commander.org/mc-${PKG_VERSION}.tar.xz"
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
# Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv)
|
||||
|
||||
PKG_NAME="stress-ng"
|
||||
PKG_VERSION="0.15.01"
|
||||
PKG_SHA256="2168627350d8e3b7f4571732d6117ab054a9851600899c30ad82fd3c9649d644"
|
||||
PKG_VERSION="0.15.06"
|
||||
PKG_SHA256="c38cefcf0a83f6c65aed7c36e57a9a1ee8373418ef71cf089a75b0661dcd4623"
|
||||
PKG_LICENSE="GPLv2"
|
||||
PKG_SITE="https://github.com/ColinIanKing/stress-ng"
|
||||
PKG_URL="https://github.com/ColinIanKing/stress-ng/archive/refs/tags/V${PKG_VERSION}.tar.gz"
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
# Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv)
|
||||
|
||||
PKG_NAME="unrar"
|
||||
PKG_VERSION="6.2.3"
|
||||
PKG_SHA256="120936e41f826cd63d77a580aeea64c1b79fd3e2434f58ce8184e783b51e5b01"
|
||||
PKG_VERSION="6.2.6"
|
||||
PKG_SHA256="0c2d4cbc8b34d0e3bec7b474e0f52bbcc6c4320ec089b4141223ee355f63c318"
|
||||
PKG_LICENSE="free"
|
||||
PKG_SITE="https://www.rarlab.com/rar_add.htm"
|
||||
PKG_URL="https://www.rarlab.com/rar/unrarsrc-${PKG_VERSION}.tar.gz"
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
# Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv)
|
||||
|
||||
PKG_NAME="vim"
|
||||
PKG_VERSION="9.0.1065"
|
||||
PKG_SHA256="f3db36c8ebe665ee750f6b729d6fe25de9dac202829f1f7390ceb62955750dc9"
|
||||
PKG_VERSION="9.0.1417"
|
||||
PKG_SHA256="02c67859046f7c0206afb909061763cf40747c6bf40c22bb6efaf9c06be41591"
|
||||
PKG_LICENSE="VIM"
|
||||
PKG_SITE="http://www.vim.org/"
|
||||
PKG_URL="https://github.com/vim/vim/archive/v${PKG_VERSION}.tar.gz"
|
||||
|
||||
@@ -1 +1,17 @@
|
||||
initial release
|
||||
1
|
||||
- not released for LE11
|
||||
|
||||
2
|
||||
- not released for LE11
|
||||
|
||||
3
|
||||
- fix ctop
|
||||
- update moby and cli to 23.0.4
|
||||
- containerd: update to 1.7.0
|
||||
- runc: build with seccomp
|
||||
- runc: update to 1.1.5
|
||||
|
||||
4
|
||||
- update moby and cli to 23.0.6
|
||||
- containerd: update to 1.7.1
|
||||
- runc: update to 1.1.7
|
||||
|
||||
@@ -3,11 +3,11 @@
|
||||
# Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv)
|
||||
|
||||
PKG_NAME="docker"
|
||||
PKG_REV="0"
|
||||
PKG_REV="4"
|
||||
PKG_ARCH="any"
|
||||
PKG_LICENSE="ASL"
|
||||
PKG_SITE="http://www.docker.com/"
|
||||
PKG_DEPENDS_TARGET="cli containerd moby runc tini"
|
||||
PKG_DEPENDS_TARGET="cli containerd ctop moby runc tini"
|
||||
PKG_SECTION="service/system"
|
||||
PKG_SHORTDESC="Docker is an open-source engine that automates the deployment of any application as a lightweight, portable, self-sufficient container that will run virtually anywhere."
|
||||
PKG_LONGDESC="Docker containers can encapsulate any payload, and will run consistently on and between virtually any server. The same container that a developer builds and tests on a laptop will run at scale, in production*, on VMs, bare-metal servers, OpenStack clusters, public instances, or combinations of the above."
|
||||
@@ -32,6 +32,9 @@ addon() {
|
||||
cp -P $(get_build_dir containerd)/bin/containerd-shim ${ADDON_BUILD}/${PKG_ADDON_ID}/bin/containerd-shim
|
||||
cp -P $(get_build_dir containerd)/bin/containerd-shim-runc-v2 ${ADDON_BUILD}/${PKG_ADDON_ID}/bin/containerd-shim-runc-v2
|
||||
|
||||
# ctop
|
||||
cp -P $(get_build_dir ctop)/bin/ctop ${ADDON_BUILD}/${PKG_ADDON_ID}/bin/ctop
|
||||
|
||||
# runc
|
||||
cp -P $(get_build_dir runc)/bin/runc ${ADDON_BUILD}/${PKG_ADDON_ID}/bin/runc
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1 +1,2 @@
|
||||
initial release
|
||||
1
|
||||
- jellyfin: update to 10.8.10
|
||||
|
||||
@@ -3,8 +3,8 @@
|
||||
|
||||
PKG_NAME="jellyfin"
|
||||
PKG_VERSION="1.0"
|
||||
PKG_VERSION_NUMBER="10.8.9"
|
||||
PKG_REV="0"
|
||||
PKG_VERSION_NUMBER="10.8.10"
|
||||
PKG_REV="1"
|
||||
PKG_ARCH="any"
|
||||
PKG_LICENSE="GPLv2"
|
||||
PKG_SITE="https://jellyfin.org/"
|
||||
|
||||
@@ -1 +1,4 @@
|
||||
initial release
|
||||
1
|
||||
- update librespot to githash 03b547d (2023-04-16)
|
||||
2
|
||||
- update librespot to githash c964102 (2023-05-14)
|
||||
|
||||
@@ -3,13 +3,14 @@
|
||||
# Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv)
|
||||
|
||||
PKG_NAME="librespot"
|
||||
PKG_VERSION="0.3.1"
|
||||
PKG_SHA256="d360eaf61ad4216ee2c4a4d583d61c8ec7367b5efbe512011d049f73e4f24952"
|
||||
PKG_REV="0"
|
||||
PKG_VERSION="c964102a349589d644baef5f43a566d6d1e151f1"
|
||||
PKG_VERSION_DATE="2023-05-14"
|
||||
PKG_SHA256="3bc6782d8796253040d995043fba4e6f6c71ff902da110b50398071e082b1930"
|
||||
PKG_REV="2"
|
||||
PKG_ARCH="any"
|
||||
PKG_LICENSE="MIT"
|
||||
PKG_SITE="https://github.com/librespot-org/librespot/"
|
||||
PKG_URL="https://github.com/librespot-org/librespot/archive/v${PKG_VERSION}.tar.gz"
|
||||
PKG_URL="https://github.com/librespot-org/librespot/archive/${PKG_VERSION}.tar.gz"
|
||||
PKG_DEPENDS_TARGET="toolchain alsa-lib avahi pulseaudio cargo:host"
|
||||
PKG_SECTION="service"
|
||||
PKG_SHORTDESC="Librespot: play Spotify through Kodi using a Spotify app as a remote"
|
||||
@@ -19,10 +20,10 @@ PKG_TOOLCHAIN="manual"
|
||||
PKG_IS_ADDON="yes"
|
||||
PKG_ADDON_NAME="Librespot"
|
||||
PKG_ADDON_TYPE="xbmc.service"
|
||||
PKG_ADDON_REQUIRES="script.module.requests:0.0.0"
|
||||
PKG_MAINTAINER="Anton Voyl (awiouy)"
|
||||
|
||||
make_target() {
|
||||
export RUSTC_LINKER=${CC}
|
||||
cargo build \
|
||||
--target ${TARGET_NAME} \
|
||||
--release \
|
||||
|
||||
@@ -1,108 +0,0 @@
|
||||
commit 10489ef0b9de4241eb8e007596f3d62616120545
|
||||
Author: awiouy <awiouy@gmail.com>
|
||||
Date: Fri May 29 07:40:19 2020 +0200
|
||||
|
||||
Notify Kodi
|
||||
|
||||
diff --git a/core/src/spotify_id.rs b/core/src/spotify_id.rs
|
||||
index 1a5fcd2..c670977 100644
|
||||
--- a/core/src/spotify_id.rs
|
||||
+++ b/core/src/spotify_id.rs
|
||||
@@ -9,6 +9,12 @@
|
||||
Podcast,
|
||||
NonPlayable,
|
||||
}
|
||||
+
|
||||
+impl fmt::Display for SpotifyAudioType {
|
||||
+ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||
+ write!(f, "{:?}", self)
|
||||
+ }
|
||||
+}
|
||||
|
||||
impl From<&str> for SpotifyAudioType {
|
||||
fn from(v: &str) -> Self {
|
||||
diff --git a/playback/src/config.rs b/playback/src/config.rs
|
||||
index 9d65042..6d098db 100644
|
||||
--- a/playback/src/config.rs
|
||||
+++ b/playback/src/config.rs
|
||||
@@ -142,6 +142,7 @@
|
||||
// pass function pointers so they can be lazily instantiated *after* spawning a thread
|
||||
// (thereby circumventing Send bounds that they might not satisfy)
|
||||
pub ditherer: Option<DithererBuilder>,
|
||||
+ pub notify_kodi: bool,
|
||||
}
|
||||
|
||||
impl Default for PlayerConfig {
|
||||
@@ -159,6 +160,7 @@
|
||||
normalisation_knee: 1.0,
|
||||
passthrough: false,
|
||||
ditherer: Some(mk_ditherer::<TriangularDitherer>),
|
||||
+ notify_kodi: false,
|
||||
}
|
||||
}
|
||||
}
|
||||
diff --git a/playback/src/player.rs b/playback/src/player.rs
|
||||
index 2dd8f3b..67b3b28 100644
|
||||
--- a/playback/src/player.rs
|
||||
+++ b/playback/src/player.rs
|
||||
@@ -1868,6 +1868,10 @@ impl PlayerInternal {
|
||||
}
|
||||
}
|
||||
|
||||
+ fn notify_kodi(&mut self, event: String) {
|
||||
+ eprintln!("@{}", event);
|
||||
+ }
|
||||
+
|
||||
fn send_event(&mut self, event: PlayerEvent) {
|
||||
let mut index = 0;
|
||||
while index < self.event_senders.len() {
|
||||
@@ -1878,6 +1882,16 @@ impl PlayerInternal {
|
||||
}
|
||||
}
|
||||
}
|
||||
+ if self.config.notify_kodi {
|
||||
+ use PlayerEvent::*;
|
||||
+ match event {
|
||||
+ Playing {track_id, .. } => self.notify_kodi(["Playing",
|
||||
+ &track_id.audio_type.to_string(),
|
||||
+ &track_id.to_base62()].join(" ")),
|
||||
+ Stopped { .. } => self.notify_kodi("Stopped".to_string()),
|
||||
+ _ => ()
|
||||
+ }
|
||||
+ }
|
||||
}
|
||||
|
||||
fn load_track(
|
||||
diff --git a/src/main.rs b/src/main.rs
|
||||
index 2efd62b..ecee2ff 100644
|
||||
--- a/src/main.rs
|
||||
+++ b/src/main.rs
|
||||
@@ -424,6 +424,11 @@
|
||||
"",
|
||||
PASSTHROUGH,
|
||||
"Pass a raw stream to the output. Only works with the pipe and subprocess backends.",
|
||||
+ )
|
||||
+ .optflag(
|
||||
+ "",
|
||||
+ "notify-kodi",
|
||||
+ "Notify Kodi",
|
||||
);
|
||||
|
||||
let matches = match opts.parse(&args[1..]) {
|
||||
@@ -644,6 +649,8 @@ fn setup(args: &[String]) -> Setup {
|
||||
)
|
||||
};
|
||||
|
||||
+ let notify_kodi = matches.opt_present("notify-kodi");
|
||||
+
|
||||
let session_config = {
|
||||
let device_id = device_id(&name);
|
||||
|
||||
@@ -763,6 +763,7 @@
|
||||
normalisation_release,
|
||||
normalisation_knee,
|
||||
ditherer,
|
||||
+ notify_kodi: notify_kodi,
|
||||
}
|
||||
};
|
||||
|
||||
66
packages/addons/service/librespot/source/bin/onevent.py
Normal file
66
packages/addons/service/librespot/source/bin/onevent.py
Normal file
@@ -0,0 +1,66 @@
|
||||
#!/usr/bin/python
|
||||
import json
|
||||
import os
|
||||
import socket
|
||||
|
||||
ADDRESS = ('127.0.0.1', 36963)
|
||||
BUFFER_SIZE = 1024
|
||||
|
||||
|
||||
def send_event(event):
|
||||
data = json.dumps(event).encode()
|
||||
with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as sock:
|
||||
sock.sendto(data, ADDRESS)
|
||||
|
||||
|
||||
def receive_event():
|
||||
with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as sock:
|
||||
sock.settimeout(None)
|
||||
sock.bind(ADDRESS)
|
||||
while True:
|
||||
data, addr = sock.recvfrom(BUFFER_SIZE)
|
||||
event = json.loads(data.decode())
|
||||
if not event:
|
||||
break
|
||||
yield event
|
||||
|
||||
|
||||
ARG_ALBUM = 'album'
|
||||
ARG_ARTIST = 'artist'
|
||||
ARG_ART = 'art'
|
||||
ARG_TITLE = 'title'
|
||||
|
||||
KEY_ALBUM = 'ALBUM'
|
||||
KEY_ARTISTS = 'ARTISTS'
|
||||
KEY_COVERS = 'COVERS'
|
||||
KEY_ITEM_TYPE = 'ITEM_TYPE'
|
||||
KEY_NAME = 'NAME'
|
||||
KEY_PLAYER_EVENT = 'PLAYER_EVENT'
|
||||
KEY_SHOW_NAME = 'SHOW_NAME'
|
||||
|
||||
PLAYER_EVENT_STOPPED = 'stopped'
|
||||
PLAYER_EVENT_TRACK_CHANGED = 'track_changed'
|
||||
|
||||
ITEM_TYPE_EPISODE = 'Episode'
|
||||
ITEM_TYPE_TRACK = 'Track'
|
||||
|
||||
|
||||
def get_env_value(key):
|
||||
return os.environ.get(key, '').partition('\n')[0]
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
player_event = get_env_value(KEY_PLAYER_EVENT)
|
||||
event = {KEY_PLAYER_EVENT: player_event}
|
||||
if player_event == PLAYER_EVENT_STOPPED:
|
||||
send_event(event)
|
||||
elif player_event == PLAYER_EVENT_TRACK_CHANGED:
|
||||
event[ARG_ART] = get_env_value(KEY_COVERS)
|
||||
event[ARG_TITLE] = get_env_value(KEY_NAME)
|
||||
item_type = get_env_value(KEY_ITEM_TYPE)
|
||||
if item_type == ITEM_TYPE_EPISODE:
|
||||
event[ARG_ALBUM] = get_env_value(KEY_SHOW_NAME)
|
||||
elif item_type == ITEM_TYPE_TRACK:
|
||||
event[ARG_ALBUM] = get_env_value(KEY_ALBUM)
|
||||
event[ARG_ARTIST] = get_env_value(KEY_ARTISTS)
|
||||
send_event(event)
|
||||
@@ -1,8 +1,25 @@
|
||||
import os
|
||||
import sys
|
||||
import xbmcaddon
|
||||
import xbmcvfs
|
||||
|
||||
sys.path.append(os.path.join(os.path.dirname(__file__), 'resources', 'lib'))
|
||||
|
||||
from ls_monitor import Monitor as Monitor
|
||||
def _set_home():
|
||||
home = xbmcvfs.translatePath(xbmcaddon.Addon().getAddonInfo('profile'))
|
||||
os.makedirs(home, exist_ok=True)
|
||||
os.chdir(home)
|
||||
|
||||
Monitor().run()
|
||||
|
||||
def _set_paths():
|
||||
path = xbmcaddon.Addon().getAddonInfo('path')
|
||||
os.environ['PATH'] += os.pathsep + os.path.join(path, 'bin')
|
||||
os.environ['LD_LIBRARY_PATH'] += os.pathsep + os.path.join(path, 'lib')
|
||||
sys.path.append(os.path.join(path, 'bin'))
|
||||
sys.path.append(os.path.join(path, 'resources', 'lib'))
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
_set_home()
|
||||
_set_paths()
|
||||
import service
|
||||
service.Monitor().run()
|
||||
|
||||
@@ -1,30 +0,0 @@
|
||||
# Librespot for ALSA
|
||||
# Copy this file to '/storage/.config/system.d/service.librespot-alsa.service' and adapt it to your needs
|
||||
# Enable the service with 'systemctl enable /storage/.config/system.d/service.librespot-alsa.service'
|
||||
# Start the service with 'systemctl start service.librespot-alsa.service'
|
||||
# If you update the file, reload units with 'systemctl daemon-reload' and restart the service
|
||||
|
||||
[Unit]
|
||||
Description=librespot alsa backend
|
||||
After=network-online.target
|
||||
Wants=network-online.target
|
||||
|
||||
[Service]
|
||||
Environment=LD_LIBRARY_PATH=/storage/.kodi/addons/service.librespot/lib
|
||||
#Enable Raspberry Pi onboard audio
|
||||
#ExecStartPre=-dtparam audio=on
|
||||
#Set Raspberry Pi playback route
|
||||
#ExecStartPre=-amixer -c 0 cset name="PCM Playback Route" 1
|
||||
ExecStart=/storage/.kodi/addons/service.librespot/bin/librespot \
|
||||
--backend alsa \
|
||||
--bitrate 320 \
|
||||
--cache "/storage/.config/lsa_cache" \
|
||||
# Use 'aplay -L' to list available devices
|
||||
# --device "default:CARD=ALSA" \
|
||||
--device-type computer \
|
||||
--disable-audio-cache \
|
||||
--name "Librespot ALSA" \
|
||||
Restart=always
|
||||
|
||||
[Install]
|
||||
WantedBy=network-online.target
|
||||
@@ -8,29 +8,21 @@ msgid "Configuration"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "#30101"
|
||||
msgid "Autoplay"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "#30102"
|
||||
msgid "Discovery"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "#30103"
|
||||
msgid "Username"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "#30104"
|
||||
msgid "Password"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "#30105"
|
||||
msgid "Name"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "#30106"
|
||||
msgid "RTP Port"
|
||||
msgctxt "#30102"
|
||||
msgid "Do not disturb Kodi"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "#30107"
|
||||
msgid "Connect Port"
|
||||
msgctxt "#30103"
|
||||
msgid "User options"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "#30104"
|
||||
msgid "Backend"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "#30105"
|
||||
msgid "ALSA device"
|
||||
msgstr ""
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
import player
|
||||
import service
|
||||
|
||||
|
||||
class Player(player.Player):
|
||||
|
||||
def onLibrespotTrackChanged(self, art, artist, title, **kwargs):
|
||||
service.notification(heading=title, message=artist, icon=art)
|
||||
@@ -0,0 +1,34 @@
|
||||
import xbmc
|
||||
import xbmcgui
|
||||
|
||||
import player
|
||||
import service
|
||||
|
||||
|
||||
class Player(player.Player):
|
||||
|
||||
def __init__(self, codec='pcm_sb16be', max_fanarts='10', **kwargs):
|
||||
super().__init__(**kwargs)
|
||||
self._max_fanarts = int(max_fanarts)
|
||||
self._list_item = xbmcgui.ListItem(path=self.librespot.file)
|
||||
self._list_item.getVideoInfoTag().addAudioStream(xbmc.AudioStreamDetail(2, codec))
|
||||
self._music_info_tag = self._list_item.getMusicInfoTag()
|
||||
|
||||
def onLibrespotTrackChanged(self, album='', art='', artist='', title=''):
|
||||
fanart = service.get_fanart(art, self._max_fanarts) if art else art
|
||||
self._list_item.setArt({'fanart': fanart, 'thumb': art})
|
||||
self._music_info_tag.setAlbum(album)
|
||||
self._music_info_tag.setArtist(artist)
|
||||
self._music_info_tag.setTitle(title)
|
||||
if self.isPlaying() and self.getPlayingFile() == self.librespot.file:
|
||||
self.updateInfoTag(self._list_item)
|
||||
else:
|
||||
self.stop() # fixes unepxected behaviour of Player.play()
|
||||
self.librespot.start_sink()
|
||||
self.play(self.librespot.file, listitem=self._list_item)
|
||||
|
||||
def onLibrespotStopped(self):
|
||||
self.librespot.stop_sink()
|
||||
if self.isPlaying() and self.getPlayingFile() == self.librespot.file:
|
||||
self.last_file = None
|
||||
self.stop()
|
||||
@@ -0,0 +1,93 @@
|
||||
import shlex
|
||||
import socket
|
||||
import subprocess
|
||||
import threading
|
||||
|
||||
import external_player
|
||||
import internal_player
|
||||
import service
|
||||
|
||||
|
||||
class Librespot:
|
||||
|
||||
def __init__(self,
|
||||
bitrate='320',
|
||||
device_type='tv',
|
||||
max_retries='5',
|
||||
name='Librespot@{}',
|
||||
options='',
|
||||
**kwargs):
|
||||
name = name.format(socket.gethostname())
|
||||
self.command = [
|
||||
'librespot',
|
||||
'--bitrate', f'{bitrate}',
|
||||
'--device-type', f'{device_type}',
|
||||
'--disable-audio-cache',
|
||||
'--disable-credential-cache',
|
||||
'--name', f'{name}',
|
||||
'--onevent', 'onevent.py',
|
||||
'--quiet',
|
||||
] + shlex.split(options)
|
||||
service.log(self.command)
|
||||
self.file = ''
|
||||
self._is_started = threading.Event()
|
||||
self._is_stopped = threading.Event()
|
||||
self._librespot = None
|
||||
self._max_retries = int(max_retries)
|
||||
self._retries = 0
|
||||
self._thread = threading.Thread()
|
||||
|
||||
def get_player(self, **kwargs):
|
||||
return (internal_player if self.file else external_player).Player(**kwargs)
|
||||
|
||||
def restart(self):
|
||||
if self._thread.is_alive():
|
||||
self._librespot.terminate()
|
||||
else:
|
||||
self.start()
|
||||
|
||||
def start(self):
|
||||
if not self._thread.is_alive() and self._retries < self._max_retries:
|
||||
self._thread = threading.Thread(daemon=True, target=self._run)
|
||||
self._thread.start()
|
||||
self._is_started.wait(1)
|
||||
|
||||
def stop(self):
|
||||
if self._thread.is_alive():
|
||||
self._is_stopped.set()
|
||||
self._librespot.terminate()
|
||||
self._thread.join()
|
||||
|
||||
def start_sink(self):
|
||||
pass
|
||||
|
||||
def stop_sink(self):
|
||||
pass
|
||||
|
||||
def _run(self):
|
||||
service.log('librespot thread started')
|
||||
self._is_started.clear()
|
||||
self._is_stopped.clear()
|
||||
while not self._is_stopped.is_set():
|
||||
with subprocess.Popen(self.command, stderr=subprocess.PIPE, text=True) as self._librespot:
|
||||
self._is_started.set()
|
||||
for line in self._librespot.stderr:
|
||||
service.log(line.rstrip())
|
||||
self.stop_sink()
|
||||
if self._librespot.returncode <= 0:
|
||||
self._retries = 0
|
||||
else:
|
||||
self._retries += 1
|
||||
if self._retries < self._max_retries:
|
||||
service.notification(
|
||||
f'librespot failed {self._retries}/{self._max_retries}')
|
||||
else:
|
||||
service.notification('librespot failed too many times')
|
||||
break
|
||||
service.log('librespot thread stopped')
|
||||
|
||||
def __enter__(self):
|
||||
return self
|
||||
|
||||
def __exit__(self, *args):
|
||||
self.stop()
|
||||
@@ -0,0 +1,11 @@
|
||||
import librespot
|
||||
|
||||
|
||||
class Librespot(librespot.Librespot):
|
||||
|
||||
def __init__(self, alsa_device='hw:2,0', **kwargs):
|
||||
super().__init__(**kwargs)
|
||||
self.command += [
|
||||
'--backend', 'alsa',
|
||||
'--device', f'{alsa_device}',
|
||||
]
|
||||
@@ -0,0 +1,73 @@
|
||||
import socket
|
||||
import subprocess
|
||||
|
||||
import librespot
|
||||
import service
|
||||
|
||||
|
||||
class Librespot(librespot.Librespot):
|
||||
|
||||
def __init__(self,
|
||||
codec='pcm_sb16be',
|
||||
pa_rtp_address='127.0.0.1',
|
||||
pa_rtp_device='librespot',
|
||||
pa_rtp_port='24642',
|
||||
**kwargs):
|
||||
service.log('pulseaudio backend started')
|
||||
sap_cmd = f'nc -l -u -s {pa_rtp_address} -p 9875'.split()
|
||||
self._sap_server = subprocess.Popen(sap_cmd,
|
||||
stdout=subprocess.DEVNULL,
|
||||
stderr=subprocess.STDOUT)
|
||||
service.log(f'sap server started')
|
||||
if not pa_rtp_port:
|
||||
with socket.socket() as s:
|
||||
s.bind((pa_rtp_address, 0))
|
||||
pa_rtp_port = s.getsockname()[1]
|
||||
modules = [
|
||||
[
|
||||
f'module-null-sink',
|
||||
f'sink_name={pa_rtp_device}',
|
||||
],
|
||||
[
|
||||
f'module-rtp-send',
|
||||
f'destination_ip={pa_rtp_address}',
|
||||
f'inhibit_auto_suspend=always',
|
||||
f'port={pa_rtp_port}',
|
||||
f'source={pa_rtp_device}.monitor',
|
||||
],
|
||||
]
|
||||
self._modules = [self._pactl('load-module', *m) for m in modules]
|
||||
self._sink_name = f'{pa_rtp_device}'
|
||||
self.stop_sink()
|
||||
service.log(f'pulseaudio modules loaded: {self._modules}')
|
||||
super().__init__(**kwargs)
|
||||
self.command += [
|
||||
'--backend', 'pulseaudio',
|
||||
'--device', f'{pa_rtp_device}',
|
||||
]
|
||||
self.file = f'rtp://{pa_rtp_address}:{pa_rtp_port}'
|
||||
|
||||
def start_sink(self):
|
||||
self._pactl('suspend-sink', self._sink_name, '0')
|
||||
|
||||
def stop_sink(self):
|
||||
self._pactl('suspend-sink', self._sink_name, '1')
|
||||
|
||||
def _pactl(self, command, *args):
|
||||
out = subprocess.run(['pactl', command, *args],
|
||||
stdout=subprocess.PIPE,
|
||||
text=True
|
||||
).stdout.rstrip()
|
||||
service.log(f'pactl {command} {args}: {out}')
|
||||
return out
|
||||
|
||||
def __exit__(self, *args):
|
||||
super().__exit__(*args)
|
||||
for module in reversed(self._modules):
|
||||
if module:
|
||||
self._pactl('unload-module', module)
|
||||
service.log('pulseaudio backend stopped')
|
||||
if self._sap_server.poll() is None:
|
||||
self._sap_server.terminate()
|
||||
self._sap_server.wait()
|
||||
service.log('sap server stopped')
|
||||
@@ -1,49 +0,0 @@
|
||||
import os
|
||||
import socket
|
||||
import xbmc
|
||||
import xbmcvfs
|
||||
import xbmcaddon
|
||||
import xbmcgui
|
||||
|
||||
|
||||
DEFAULTS = dict(
|
||||
autoplay='true',
|
||||
bitrate='320',
|
||||
device='librespot',
|
||||
discovery='true',
|
||||
name='Librespot@{}',
|
||||
password='',
|
||||
rtp_dest='127.0.0.1',
|
||||
rtp_port='24642',
|
||||
connect_port='0',
|
||||
username='',
|
||||
)
|
||||
|
||||
ADDON = xbmcaddon.Addon()
|
||||
ADDON_HOME = xbmcvfs.translatePath(ADDON.getAddonInfo('profile'))
|
||||
ADDON_ICON = ADDON.getAddonInfo('icon')
|
||||
ADDON_NAME = ADDON.getAddonInfo('name')
|
||||
ADDON_PATH = ADDON.getAddonInfo('path')
|
||||
ADDON_ENVT = dict(
|
||||
LD_LIBRARY_PATH=os.path.join(ADDON_PATH, 'lib'),
|
||||
PATH=os.path.join(ADDON_PATH, 'bin'))
|
||||
DIALOG = xbmcgui.Dialog()
|
||||
|
||||
|
||||
def get_settings():
|
||||
if not os.path.exists(ADDON_HOME):
|
||||
os.makedirs(ADDON_HOME)
|
||||
settings = dict()
|
||||
for id in DEFAULTS.keys():
|
||||
value = ADDON.getSetting(id)
|
||||
settings[id] = DEFAULTS[id] if value == '' else value
|
||||
settings['name'] = settings['name'].format(socket.gethostname())
|
||||
return settings
|
||||
|
||||
|
||||
def log(message):
|
||||
xbmc.log('{}: {}'.format(ADDON_NAME, message), xbmc.LOGINFO)
|
||||
|
||||
|
||||
def notification(message):
|
||||
DIALOG.notification(ADDON_NAME, message, ADDON_ICON)
|
||||
@@ -1,164 +0,0 @@
|
||||
import shlex
|
||||
import subprocess
|
||||
import threading
|
||||
import xbmc
|
||||
import xbmcgui
|
||||
|
||||
from ls_addon import ADDON_ENVT as ADDON_ENVT
|
||||
from ls_addon import ADDON_HOME as ADDON_HOME
|
||||
from ls_addon import get_settings as get_settings
|
||||
from ls_addon import log as log
|
||||
from ls_pulseaudio import Pulseaudio as Pulseaudio
|
||||
from ls_spotify import SPOTIFY as SPOTIFY
|
||||
|
||||
|
||||
LIBRESPOT = 'librespot' \
|
||||
' --backend pulseaudio' \
|
||||
' --bitrate {bitrate}' \
|
||||
' --cache cache' \
|
||||
' --device {device}' \
|
||||
' --device-type TV' \
|
||||
' --disable-audio-cache' \
|
||||
' --name {name}' \
|
||||
' --notify-kodi'
|
||||
LIBRESPOT_AUTOPLAY = ' --autoplay'
|
||||
LIBRESPOT_AUTHENTICATE = ' --disable-discovery' \
|
||||
' --password {password}' \
|
||||
' --username {username}'
|
||||
|
||||
CODEC = 'pcm_s16be'
|
||||
MAX_PANICS = 3
|
||||
|
||||
|
||||
class Librespot(xbmc.Player):
|
||||
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
settings = get_settings()
|
||||
quoted = {k: shlex.quote(v) for (k, v) in settings.items()}
|
||||
command = LIBRESPOT
|
||||
if settings['connect_port'] != "0":
|
||||
command += ' --zeroconf-port %s ' % settings['connect_port']
|
||||
if settings['autoplay'] == 'true':
|
||||
command += LIBRESPOT_AUTOPLAY
|
||||
if (settings['discovery'] == 'false' and
|
||||
settings['password'] != '' and
|
||||
settings['username'] != ''):
|
||||
command += LIBRESPOT_AUTHENTICATE
|
||||
self.command = shlex.split(command.format(**quoted))
|
||||
log(shlex.split(command.format(**dict(quoted, password='*obfuscated*'))))
|
||||
self.is_aborted = False
|
||||
self.is_dead = False
|
||||
self.pulseaudio = Pulseaudio(settings)
|
||||
self.listitem = xbmcgui.ListItem()
|
||||
self.listitem.addStreamInfo('audio', {'codec': CODEC})
|
||||
self.listitem.setPath(path=self.pulseaudio.url)
|
||||
|
||||
def __enter__(self):
|
||||
self.pulseaudio.load_modules()
|
||||
self.panics = 0
|
||||
self.librespot = None
|
||||
self.is_playing_librespot = False
|
||||
if not self.isPlaying():
|
||||
self.start_librespot()
|
||||
|
||||
def __exit__(self, *args):
|
||||
self.stop_librespot()
|
||||
self.pulseaudio.unload_modules()
|
||||
|
||||
def on_event_panic(self):
|
||||
self.pulseaudio.suspend_sink(1)
|
||||
self.panics += 1
|
||||
log('event panic {}/{}'.format(self.panics, MAX_PANICS))
|
||||
self.is_dead = self.panics >= MAX_PANICS
|
||||
self.stop_librespot(True)
|
||||
|
||||
def on_event_playing(self, type, id):
|
||||
log('event playing')
|
||||
SPOTIFY.update_listitem(self.listitem, type, id, self.country)
|
||||
if not self.isPlaying():
|
||||
log('starting librespot playback')
|
||||
self.pulseaudio.suspend_sink(0)
|
||||
self.play(self.pulseaudio.url, self.listitem)
|
||||
elif self.is_playing_librespot:
|
||||
log('updating librespot playback')
|
||||
self.updateInfoTag(self.listitem)
|
||||
|
||||
def on_event_stopped(self):
|
||||
self.pulseaudio.suspend_sink(1)
|
||||
log('event stopped')
|
||||
self.panics = 0
|
||||
self.stop()
|
||||
|
||||
def onPlayBackEnded(self):
|
||||
self.onPlayBackStopped()
|
||||
|
||||
def onPlayBackError(self):
|
||||
self.onPlayBackStopped()
|
||||
|
||||
def onPlayBackStarted(self):
|
||||
log('Kodi playback started')
|
||||
self.is_playing_librespot = self.getPlayingFile() == self.pulseaudio.url
|
||||
if not self.is_playing_librespot:
|
||||
self.stop_librespot()
|
||||
|
||||
def onPlayBackStopped(self):
|
||||
if self.is_playing_librespot:
|
||||
log('librespot playback stopped')
|
||||
self.is_playing_librespot = False
|
||||
self.stop_librespot(True)
|
||||
else:
|
||||
log('Kodi playback stopped')
|
||||
self.start_librespot()
|
||||
|
||||
def run_librespot(self):
|
||||
log('librespot thread started')
|
||||
self.restart = True
|
||||
while self.restart and not self.is_dead:
|
||||
self.librespot = subprocess.Popen(
|
||||
self.command,
|
||||
cwd=ADDON_HOME,
|
||||
env=ADDON_ENVT,
|
||||
stderr=subprocess.STDOUT,
|
||||
stdout=subprocess.PIPE,
|
||||
text=True,
|
||||
encoding='utf-8')
|
||||
log('librespot started')
|
||||
with self.librespot.stdout:
|
||||
for line in self.librespot.stdout:
|
||||
words = line.split()
|
||||
if words[0] == '@Playing':
|
||||
self.on_event_playing(words[1], words[2])
|
||||
elif words[0] == '@Stopped':
|
||||
self.on_event_stopped()
|
||||
elif words[0] == 'stack':
|
||||
self.on_event_panic()
|
||||
else:
|
||||
log(line.rstrip())
|
||||
if 'Country:' in line:
|
||||
self.country = words[-1].strip('"')
|
||||
log('country={}'.format(self.country))
|
||||
self.pulseaudio.suspend_sink(1)
|
||||
self.stop()
|
||||
self.librespot.wait()
|
||||
log('librespot stopped')
|
||||
self.librespot = None
|
||||
log('librespot thread stopped')
|
||||
|
||||
def start_librespot(self):
|
||||
if self.librespot is None:
|
||||
self.thread = threading.Thread(target=self.run_librespot)
|
||||
self.thread.start()
|
||||
|
||||
def stop(self):
|
||||
if self.is_playing_librespot and not self.is_aborted:
|
||||
log('stopping librespot playback')
|
||||
self.is_playing_librespot = False
|
||||
super().stop()
|
||||
|
||||
def stop_librespot(self, restart=False):
|
||||
self.restart = restart
|
||||
if self.librespot is not None:
|
||||
self.librespot.terminate()
|
||||
if not restart:
|
||||
self.thread.join()
|
||||
@@ -1,35 +0,0 @@
|
||||
import xbmc
|
||||
|
||||
from ls_addon import log as log
|
||||
from ls_addon import notification as notification
|
||||
from ls_librespot import Librespot as Librespot
|
||||
|
||||
|
||||
class Monitor(xbmc.Monitor):
|
||||
|
||||
def onSettingsChanged(self):
|
||||
self.is_changed = True
|
||||
|
||||
def run(self):
|
||||
log('monitor started')
|
||||
is_aborted = False
|
||||
is_dead = False
|
||||
while not (is_aborted or is_dead):
|
||||
self.is_changed = False
|
||||
librespot = Librespot()
|
||||
with librespot:
|
||||
while True:
|
||||
is_aborted = self.waitForAbort(1)
|
||||
if is_aborted:
|
||||
log('monitor aborted')
|
||||
librespot.is_aborted = True
|
||||
break
|
||||
is_dead = librespot.is_dead
|
||||
if is_dead:
|
||||
log('librespot died')
|
||||
notification('Too many errors')
|
||||
break
|
||||
if self.is_changed:
|
||||
log('settings changed')
|
||||
break
|
||||
log('monitor stopped')
|
||||
@@ -1,46 +0,0 @@
|
||||
import subprocess
|
||||
|
||||
from ls_addon import log as log
|
||||
|
||||
|
||||
def run(command):
|
||||
return subprocess.check_output(command.split(), text=True)
|
||||
|
||||
|
||||
class Pulseaudio:
|
||||
|
||||
def __init__(self, settings):
|
||||
self.null_sink = dict(
|
||||
module='module-null-sink',
|
||||
args='sink_name={device}'.format(**settings)
|
||||
)
|
||||
self.rtp_send = dict(
|
||||
module='module-rtp-send',
|
||||
args='destination_ip={rtp_dest} port={rtp_port}'
|
||||
' source={device}.monitor'.format(**settings)
|
||||
)
|
||||
self.suspend = 'pactl suspend-sink {device} {{}}'.format(**settings)
|
||||
self.url = 'rtp://{rtp_dest}:{rtp_port}'.format(**settings)
|
||||
|
||||
def list_modules(self):
|
||||
return [module.split('\t')
|
||||
for module in run('pactl list modules short').splitlines()[::-1]]
|
||||
|
||||
def load_modules(self):
|
||||
args = [module[2] for module in self.list_modules()]
|
||||
for module in [self.null_sink, self.rtp_send]:
|
||||
if module['args'] not in args:
|
||||
run('pactl load-module {} {}'.format(
|
||||
module['module'], module['args']))
|
||||
log('loaded {} {}'.format(module['module'], module['args']))
|
||||
self.suspend_sink(1)
|
||||
|
||||
def suspend_sink(self, bit):
|
||||
run(self.suspend.format(bit))
|
||||
log('suspended sink {}'.format(bit))
|
||||
|
||||
def unload_modules(self):
|
||||
for module in self.list_modules():
|
||||
if module[2] in [self.null_sink['args'], self.rtp_send['args']]:
|
||||
run('pactl unload-module {}'.format(module[0]))
|
||||
log('unloaded {} {}'.format(module[1], module[2]))
|
||||
@@ -1,80 +0,0 @@
|
||||
import requests
|
||||
import time
|
||||
|
||||
|
||||
from ls_addon import ADDON_ICON as ADDON_ICON
|
||||
from ls_addon import log as log
|
||||
|
||||
|
||||
SPOTIFY_ENDPOINT_EPISODES = 'https://api.spotify.com/v1/episodes/'
|
||||
SPOTIFY_ENDPOINT_TRACKS = 'https://api.spotify.com/v1/tracks/'
|
||||
SPOTIFY_HEADERS = {
|
||||
'Accept': 'application/json',
|
||||
'Content-Type': 'application/json',
|
||||
}
|
||||
SPOTIFY_REQUEST_TOKEN = {
|
||||
'url': 'https://accounts.spotify.com/api/token',
|
||||
'data': {'grant_type': 'client_credentials'},
|
||||
'headers': {'Authorization': 'Basic MTY5ZGY1NTMyZGVlNDdhNTk5MTNmODUyOGU4M2FlNzE6MWYzZDhiNTA3YmJlNGY2OGJlYjNhNDQ3MmU4YWQ0MTE='}
|
||||
}
|
||||
|
||||
|
||||
def get(info, indices, default):
|
||||
try:
|
||||
for index in indices:
|
||||
info = info[index]
|
||||
return info.encode('utf-8')
|
||||
except LookupError:
|
||||
return default
|
||||
|
||||
|
||||
class Spotify:
|
||||
|
||||
def __init__(self):
|
||||
self.headers = SPOTIFY_HEADERS
|
||||
self.expiration = time.time()
|
||||
|
||||
def get_headers(self):
|
||||
if time.time() > self.expiration:
|
||||
log('token expired')
|
||||
token = requests.post(**SPOTIFY_REQUEST_TOKEN).json()
|
||||
log(token)
|
||||
self.expiration = time.time() + float(token['expires_in']) - 5
|
||||
self.headers['Authorization'] = 'Bearer {}'.format(
|
||||
token['access_token'])
|
||||
|
||||
def get_endpoint(self, endpoint, id, market):
|
||||
try:
|
||||
self.get_headers()
|
||||
return requests.get(url=endpoint + id,
|
||||
headers=self.headers,
|
||||
params=dict(market=market)).json()
|
||||
except Exception as e:
|
||||
log('failed to get {} from Spotify {}'.format(endpoint, e))
|
||||
return {}
|
||||
|
||||
def update_listitem(self, listitem, type, id, market='SE'):
|
||||
if type == 'Podcast':
|
||||
info = self.get_endpoint(SPOTIFY_ENDPOINT_EPISODES, id, market)
|
||||
album = get(info, ['show', 'name'], 'unknown show',)
|
||||
artist = get(info, ['show', 'publisher'], 'unknown publisher')
|
||||
thumb = get(info, ['images', 0, 'url'], ADDON_ICON)
|
||||
title = get(info, ['name'], 'unknown episode')
|
||||
elif type == 'Track':
|
||||
info = self.get_endpoint(SPOTIFY_ENDPOINT_TRACKS, id, market)
|
||||
album = get(info, ['album', 'name'], 'unknown album')
|
||||
artist = get(info, ['artists', 0, 'name'], 'unknown artist')
|
||||
thumb = get(info, ['album', 'images', 0, 'url'], ADDON_ICON)
|
||||
title = get(info, ['name'], 'unknown title')
|
||||
else:
|
||||
album = ''
|
||||
artist = 'Unknown Media Type'
|
||||
thumb = ADDON_ICON
|
||||
title = ''
|
||||
listitem.setArt(dict(fanart=thumb, thumb=thumb))
|
||||
listitem.setInfo('music', dict(
|
||||
album=album, artist=artist, title=title))
|
||||
log('{}#{}#{}#{}'.format(title, artist, album, thumb))
|
||||
|
||||
|
||||
SPOTIFY = Spotify()
|
||||
@@ -0,0 +1,71 @@
|
||||
import threading
|
||||
import xbmc
|
||||
|
||||
import onevent
|
||||
import service
|
||||
|
||||
|
||||
class Player(xbmc.Player):
|
||||
|
||||
def __init__(self, dnd_kodi='false', librespot=None, **kwargs):
|
||||
super().__init__()
|
||||
self._dnd_kodi = (dnd_kodi == 'true')
|
||||
self._thread = threading.Thread(daemon=True, target=self._run)
|
||||
self._thread.start()
|
||||
self.last_file = None
|
||||
self.librespot = librespot
|
||||
if not (self._dnd_kodi and self.isPlaying()):
|
||||
self.librespot.start()
|
||||
|
||||
def onAVStarted(self):
|
||||
file = self.getPlayingFile()
|
||||
if file != self.librespot.file:
|
||||
if self._dnd_kodi:
|
||||
self.librespot.stop()
|
||||
elif self.last_file == self.librespot.file:
|
||||
self.librespot.restart()
|
||||
self.last_file = file
|
||||
|
||||
def onLibrespotStopped(self):
|
||||
pass
|
||||
|
||||
def onLibrespotTrackChanged(self, album='', art='', artist='', title=''):
|
||||
pass
|
||||
|
||||
def onPlayBackEnded(self):
|
||||
if self.last_file == self.librespot.file:
|
||||
self.librespot.restart()
|
||||
else:
|
||||
self.librespot.start()
|
||||
self.last_file = None
|
||||
|
||||
def onPlayBackError(self):
|
||||
self.onPlayBackEnded()
|
||||
|
||||
def onPlayBackStopped(self):
|
||||
self.onPlayBackEnded()
|
||||
|
||||
# fixes unexpected behaviour of Player.stop()
|
||||
def stop(self):
|
||||
xbmc.executebuiltin('PlayerControl(Stop)')
|
||||
|
||||
def _run(self):
|
||||
service.log('onevent dispatcher started')
|
||||
for event in onevent.receive_event():
|
||||
try:
|
||||
player_event = event.pop(onevent.KEY_PLAYER_EVENT)
|
||||
if player_event == onevent.PLAYER_EVENT_STOPPED:
|
||||
self.onLibrespotStopped()
|
||||
elif player_event == onevent.PLAYER_EVENT_TRACK_CHANGED:
|
||||
self.onLibrespotTrackChanged(**event)
|
||||
except Exception as e:
|
||||
service.log(e, True)
|
||||
service.log('onevent dispatcher stopped')
|
||||
|
||||
def __enter__(self):
|
||||
return self
|
||||
|
||||
def __exit__(self, *args):
|
||||
onevent.send_event({})
|
||||
self._thread.join()
|
||||
self.onLibrespotStopped()
|
||||
@@ -0,0 +1,88 @@
|
||||
import PIL.Image
|
||||
import urllib.request
|
||||
import tempfile
|
||||
import os
|
||||
import xbmc
|
||||
import xbmcaddon
|
||||
import xbmcgui
|
||||
|
||||
_ADDON = xbmcaddon.Addon()
|
||||
_ICON = _ADDON.getAddonInfo('icon')
|
||||
_NAME = _ADDON.getAddonInfo('name')
|
||||
_DIALOG = xbmcgui.Dialog()
|
||||
|
||||
|
||||
def log(message, show=False):
|
||||
xbmc.log(f'{_NAME}: {message}', xbmc.LOGINFO if show else xbmc.LOGDEBUG)
|
||||
|
||||
|
||||
def notification(message='', sound=False, heading=_NAME, icon=_ICON, time=5000):
|
||||
_DIALOG.notification(heading, message, icon, time, sound)
|
||||
|
||||
|
||||
_FANART_DIR = os.path.join(tempfile.gettempdir(), 'librespot.fanart')
|
||||
|
||||
|
||||
def get_fanart(url, max_fanarts):
|
||||
name = os.path.basename(url)
|
||||
target = os.path.join(_FANART_DIR, f'{name}_16x9')
|
||||
if not os.path.exists(target):
|
||||
if not os.path.exists(_FANART_DIR):
|
||||
os.makedirs(_FANART_DIR)
|
||||
files = os.listdir(_FANART_DIR)
|
||||
files = [os.path.join(_FANART_DIR, file) for file in files if os.path.isfile(
|
||||
os.path.join(_FANART_DIR, file))]
|
||||
files.sort(key=os.path.getmtime)
|
||||
for file in files[:-max_fanarts]:
|
||||
os.remove(file)
|
||||
source = os.path.join(_FANART_DIR, f'{name}_9x9')
|
||||
urllib.request.urlretrieve(url, source)
|
||||
image = PIL.Image.open(source)
|
||||
width, height = image.size
|
||||
new_width = int(height * 16 / 9)
|
||||
delta_w = new_width - width
|
||||
new_image = PIL.Image.new('RGB', (new_width, height), (0, 0, 0))
|
||||
new_image.paste(image, (delta_w // 2, 0))
|
||||
new_image.save(target, 'JPEG', optimize=True)
|
||||
os.remove(source)
|
||||
return target
|
||||
|
||||
|
||||
_SETTINGS = {
|
||||
'alsa_device': 'hw:2,0',
|
||||
'backend': 'pulseaudio_rtp',
|
||||
'dnd_kodi': 'false',
|
||||
'name': f'{_NAME}@{{}}',
|
||||
'options': '',
|
||||
}
|
||||
|
||||
|
||||
def _get_setting(setting, default):
|
||||
value = _ADDON.getSetting(setting)
|
||||
return value if value else default
|
||||
|
||||
|
||||
def _get_librespot():
|
||||
while True:
|
||||
settings = {k: _get_setting(k, v) for k, v in _SETTINGS.items()}
|
||||
backend = settings.pop('backend')
|
||||
librespot_class = __import__(f'librespot_{backend}').Librespot
|
||||
with librespot_class(**settings) as librespot:
|
||||
with librespot.get_player(librespot=librespot, **settings) as player:
|
||||
yield
|
||||
|
||||
|
||||
class Monitor(xbmc.Monitor):
|
||||
|
||||
def __init__(self):
|
||||
self._get_librespot = _get_librespot()
|
||||
self.onSettingsChanged()
|
||||
|
||||
def onSettingsChanged(self):
|
||||
log('settings changed')
|
||||
next(self._get_librespot)
|
||||
|
||||
def run(self):
|
||||
self.waitForAbort()
|
||||
log('abort requested')
|
||||
self._get_librespot.close()
|
||||
@@ -1,12 +1,10 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||
<settings>
|
||||
<category label="30100">
|
||||
<setting label="30101" id="autoplay" type="bool" default="true" />
|
||||
<setting label="30102" id="discovery" type="bool" default="true" />
|
||||
<setting label="30103" id="username" type="text" default="" subsetting="true" visible="eq(-1,false)" />
|
||||
<setting label="30104" id="password" type="text" default="" subsetting="true" visible="eq(-2,false)" option="hidden" />
|
||||
<setting label="30105" id="name" type="text" default="Librespot@{}" />
|
||||
<setting label="30106" id="rtp_port" type="number" default="24642" />
|
||||
<setting label="30107" id="connect_port" type="number" default="0" />
|
||||
<setting label="30101" id="name" type="text" default="Librespot@{}" />
|
||||
<setting label="30102" id="dnd_kodi" type="bool" default="false" />
|
||||
<setting label="30103" id="options" type="text" default="" />
|
||||
<setting label="30104" id="backend" type="select" values="pulseaudio_rtp|alsa" />
|
||||
<setting label="30105" id="alsa_device" type="text" default="hw:2,0" subsetting="true" visible="eq(-1,1)" />
|
||||
</category>
|
||||
</settings>
|
||||
|
||||
@@ -1 +1,3 @@
|
||||
initial release
|
||||
1
|
||||
- include mariadb-upgrade and mariadb-check
|
||||
copy mariadb* binaries and make symbolic links to mysql*
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
|
||||
PKG_NAME="mariadb"
|
||||
PKG_VERSION="10.11.2"
|
||||
PKG_REV="0"
|
||||
PKG_REV="1"
|
||||
PKG_SHA256="1c89dee0caed0f68bc2a1d203eb98a123150e6a179f6ee0f1fc0ba3f08dc71dc"
|
||||
PKG_LICENSE="GPL2"
|
||||
PKG_SITE="https://mariadb.org"
|
||||
@@ -89,13 +89,15 @@ addon() {
|
||||
mkdir -p ${ADDON}/config
|
||||
|
||||
cp ${MARIADB}/bin/mariadbd \
|
||||
${MARIADB}/bin/mysql \
|
||||
${MARIADB}/bin/mysqladmin \
|
||||
${MARIADB}/bin/mysqldump \
|
||||
${MARIADB}/bin/mysql_secure_installation \
|
||||
${MARIADB}/bin/mariadb \
|
||||
${MARIADB}/bin/mariadb-admin \
|
||||
${MARIADB}/bin/mariadb-check \
|
||||
${MARIADB}/bin/mariadb-dump \
|
||||
${MARIADB}/bin/mariadb-secure-installation \
|
||||
${MARIADB}/bin/mariadb-upgrade \
|
||||
${MARIADB}/bin/my_print_defaults \
|
||||
${MARIADB}/bin/resolveip \
|
||||
${MARIADB}/scripts/mysql_install_db \
|
||||
${MARIADB}/scripts/mariadb-install-db \
|
||||
${ADDON}/bin
|
||||
|
||||
cp -PR ${MARIADB}/share ${ADDON}
|
||||
|
||||
@@ -3,6 +3,10 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
# Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv)
|
||||
|
||||
_create_bin_link() {
|
||||
[ ! -L ${ADDON_DIR}/bin/${2} ] && ln -sfn ${1} ${ADDON_DIR}/bin/${2}
|
||||
}
|
||||
|
||||
. /etc/profile
|
||||
oe_setup_addon service.mariadb
|
||||
|
||||
@@ -11,49 +15,57 @@ mkdir -p /run/mysqld
|
||||
|
||||
# exit if already running
|
||||
PID=$(ps aux | awk '/\/bin\/mariadbd/ {print $1; exit 0}')
|
||||
if [ -n "$PID" ]; then
|
||||
if [ -n "${PID}" ]; then
|
||||
echo "MariaDB server is already running"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# create symbolic links
|
||||
_create_bin_link mariadb mysql
|
||||
_create_bin_link mariadb-admin mysqladmin
|
||||
_create_bin_link mariadb-dump mysqldump
|
||||
_create_bin_link mariadb-secure-installation mysql_secure_installation
|
||||
_create_bin_link mariadb-upgrade mysql_upgrade
|
||||
_create_bin_link mariadb-install-db mysql_install_db
|
||||
|
||||
# copy config file
|
||||
if [ ! -f $ADDON_HOME/my.cnf ]; then
|
||||
cp $ADDON_DIR/config/my.cnf $ADDON_HOME
|
||||
if [ ! -f ${ADDON_HOME}/my.cnf ]; then
|
||||
cp ${ADDON_DIR}/config/my.cnf ${ADDON_HOME}
|
||||
fi
|
||||
|
||||
# install database
|
||||
if [ ! -d "$ADDON_HOME/data/mysql" ]; then
|
||||
mkdir -p $ADDON_HOME/data
|
||||
if [ ! -d "${ADDON_HOME}/data/mysql" ]; then
|
||||
mkdir -p ${ADDON_HOME}/data
|
||||
echo "Installing database"
|
||||
$ADDON_DIR/bin/mysql_install_db --basedir=$ADDON_DIR --datadir=$ADDON_HOME/data
|
||||
${ADDON_DIR}/bin/mariadb-install-db --basedir=${ADDON_DIR} --datadir=${ADDON_HOME}/data
|
||||
fi
|
||||
|
||||
# check for first run and generate passwords
|
||||
if grep -q "@MYSQL_ROOT_PASS@" $ADDON_HOME/settings.xml; then
|
||||
if grep -q "@MYSQL_ROOT_PASS@" ${ADDON_HOME}/settings.xml; then
|
||||
MYSQL_ROOT_PASS="$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 8)"
|
||||
MYSQL_KODI_PASS="$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 8)"
|
||||
|
||||
sed -e "s|@MYSQL_ROOT_PASS@|$MYSQL_ROOT_PASS|g" \
|
||||
-e "s|@MYSQL_KODI_PASS@|$MYSQL_KODI_PASS|g" \
|
||||
-i $ADDON_HOME/settings.xml
|
||||
sed -e "s|@MYSQL_ROOT_PASS@|${MYSQL_ROOT_PASS}|g" \
|
||||
-e "s|@MYSQL_KODI_PASS@|${MYSQL_KODI_PASS}|g" \
|
||||
-i ${ADDON_HOME}/settings.xml
|
||||
fi
|
||||
|
||||
# init script to create user kodi and change passwords
|
||||
init_file=""
|
||||
if [[ ! -f $ADDON_HOME/set_mysql_passwords.sql ]] || [[ $ADDON_HOME/settings.xml -nt $ADDON_HOME/set_mysql_passwords.sql ]]; then
|
||||
cat << SQL_DATA > $ADDON_HOME/set_mysql_passwords.sql
|
||||
SET PASSWORD FOR 'root'@'localhost'=PASSWORD('$MYSQL_ROOT_PASS');
|
||||
if [[ ! -f ${ADDON_HOME}/set_mysql_passwords.sql ]] || [[ ${ADDON_HOME}/settings.xml -nt ${ADDON_HOME}/set_mysql_passwords.sql ]]; then
|
||||
cat << SQL_DATA > ${ADDON_HOME}/set_mysql_passwords.sql
|
||||
SET PASSWORD FOR 'root'@'localhost'=PASSWORD('${MYSQL_ROOT_PASS}');
|
||||
CREATE USER IF NOT EXISTS 'kodi';
|
||||
CREATE USER IF NOT EXISTS 'kodi'@'localhost';
|
||||
SET PASSWORD FOR 'kodi'=PASSWORD('$MYSQL_KODI_PASS');
|
||||
SET PASSWORD FOR 'kodi'@'localhost'=PASSWORD('$MYSQL_KODI_PASS');
|
||||
SET PASSWORD FOR 'kodi'=PASSWORD('${MYSQL_KODI_PASS}');
|
||||
SET PASSWORD FOR 'kodi'@'localhost'=PASSWORD('${MYSQL_KODI_PASS}');
|
||||
GRANT ALL ON *.* TO 'kodi';
|
||||
GRANT ALL ON *.* TO 'kodi'@'localhost';
|
||||
flush privileges;
|
||||
SQL_DATA
|
||||
|
||||
init_file="--init-file=$ADDON_HOME/set_mysql_passwords.sql"
|
||||
init_file="--init-file=${ADDON_HOME}/set_mysql_passwords.sql"
|
||||
fi
|
||||
|
||||
echo "Starting mariadbd"
|
||||
MYSQL_HOME="$ADDON_HOME" exec $ADDON_DIR/bin/mariadbd $init_file &
|
||||
MYSQL_HOME="${ADDON_HOME}" exec ${ADDON_DIR}/bin/mariadbd ${init_file} &
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
|
||||
PKG_NAME="minisatip"
|
||||
PKG_VERSION="1.2.84"
|
||||
PKG_SHA256="b8e58eae2e0502d940b59cf60bf73ffb6af1a4c7d4cd23ddd939f29cd4004d8c"
|
||||
PKG_SHA256="d5a06b0c371e1f5ccba6fcb3d76abf348e93e14ab4d7317bb701ae023c085e4b"
|
||||
PKG_REV="0"
|
||||
PKG_ARCH="any"
|
||||
PKG_LICENSE="GPL"
|
||||
|
||||
@@ -1 +1,2 @@
|
||||
initial release
|
||||
1
|
||||
- mpd: update to 0.23.12
|
||||
|
||||
@@ -3,9 +3,9 @@
|
||||
# Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv)
|
||||
|
||||
PKG_NAME="mpd"
|
||||
PKG_VERSION="0.23.11"
|
||||
PKG_SHA256="edb4e7a8f9dff238b5610f9e2461940ea98c727a5462fafb1cdf836304dfdca9"
|
||||
PKG_REV="0"
|
||||
PKG_VERSION="0.23.12"
|
||||
PKG_SHA256="b7fca62284ecc25a681ea6a07abc49200af5353be42cb5a31e3173be9d8702e7"
|
||||
PKG_REV="1"
|
||||
PKG_ARCH="any"
|
||||
PKG_LICENSE="GPL"
|
||||
PKG_SITE="https://www.musicpd.org"
|
||||
|
||||
@@ -1,32 +0,0 @@
|
||||
From e4b055eb6d08c5c8f8d85828ce4005d410e462cb Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?=C4=90o=C3=A0n=20Tr=E1=BA=A7n=20C=C3=B4ng=20Danh?=
|
||||
<congdanhqx@gmail.com>
|
||||
Date: Thu, 1 Dec 2022 08:29:23 +0700
|
||||
Subject: [PATCH] v0.23.x: RemoteTagCache: add missing include
|
||||
|
||||
Fix build with Boost 1.81.0. `<array>` was included by one of those boost headers,
|
||||
however, it's no longer included as of Boost 1.81.0.
|
||||
|
||||
`master` doesn't use `std::array` in this file.
|
||||
|
||||
While we're at it, add all necessary inclusion files.
|
||||
---
|
||||
src/RemoteTagCache.hxx | 4 ++++
|
||||
1 file changed, 4 insertions(+)
|
||||
|
||||
diff --git a/src/RemoteTagCache.hxx b/src/RemoteTagCache.hxx
|
||||
index ed87f9706f..e8b198a219 100644
|
||||
--- a/src/RemoteTagCache.hxx
|
||||
+++ b/src/RemoteTagCache.hxx
|
||||
@@ -28,7 +28,11 @@
|
||||
#include <boost/intrusive/list.hpp>
|
||||
#include <boost/intrusive/unordered_set.hpp>
|
||||
|
||||
+#include <array>
|
||||
+#include <functional>
|
||||
+#include <memory>
|
||||
#include <string>
|
||||
+#include <utility>
|
||||
|
||||
class RemoteTagCacheHandler;
|
||||
|
||||
@@ -1,3 +1,9 @@
|
||||
4
|
||||
- download NextPVR 6.1.4
|
||||
|
||||
3
|
||||
- download NextPVR 6.1.3
|
||||
|
||||
2
|
||||
Fix nextpvr-downloader script
|
||||
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
# Copyright (C) 2021-present Team LibreELEC (https://libreelec.tv)
|
||||
|
||||
PKG_NAME="nextpvr"
|
||||
PKG_VERSION="6.1.1~Nexus"
|
||||
PKG_ADDON_VERSION="6.1.1~2"
|
||||
PKG_VERSION="6.1.4~Nexus"
|
||||
PKG_ADDON_VERSION="6.1.4~4"
|
||||
PKG_REV="0"
|
||||
PKG_ARCH="any"
|
||||
PKG_LICENSE="NextPVR"
|
||||
|
||||
@@ -1 +1,2 @@
|
||||
initial release
|
||||
1
|
||||
- ccid: update to 1.5.2
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
|
||||
PKG_NAME="pcscd"
|
||||
PKG_VERSION="1.0"
|
||||
PKG_REV="0"
|
||||
PKG_REV="1"
|
||||
PKG_ARCH="any"
|
||||
PKG_LICENSE="GPL"
|
||||
PKG_SITE="https://libreelec.tv"
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
# Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv)
|
||||
|
||||
PKG_NAME="rsyslog"
|
||||
PKG_VERSION="8.2212.0"
|
||||
PKG_SHA256="53b59a872e3dc7384cdc149abe9744916776f7057d905f3df6722d2eb1b04f35"
|
||||
PKG_VERSION="8.2302.0"
|
||||
PKG_SHA256="25415f85b662615ce3c83077d53758029e8743cb5929044bfd3564e3d626a3b9"
|
||||
PKG_REV="0"
|
||||
PKG_ARCH="any"
|
||||
PKG_LICENSE="GPL"
|
||||
|
||||
@@ -1 +1,8 @@
|
||||
initial release
|
||||
2
|
||||
- asio: update to 1.28.0
|
||||
- nqptp: update to 1.2.1
|
||||
- shairport-sync: update to 4.2
|
||||
|
||||
1
|
||||
- asio: update to 1.27.0
|
||||
- snapcast: update to 0.27.0
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
# Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv)
|
||||
|
||||
PKG_NAME="snapclient"
|
||||
PKG_VERSION="0.26.0"
|
||||
PKG_REV="0"
|
||||
PKG_VERSION="0.27.0"
|
||||
PKG_REV="2"
|
||||
PKG_ARCH="any"
|
||||
PKG_LICENSE="GPLv3"
|
||||
PKG_DEPENDS_TARGET="toolchain alsa-plugins snapcast"
|
||||
|
||||
@@ -1 +1,8 @@
|
||||
initial release
|
||||
2
|
||||
- asio: update to 1.28.0
|
||||
- nqptp: update to 1.2.1
|
||||
- shairport-sync: update to 4.2
|
||||
|
||||
1
|
||||
- asio: update to 1.27.0
|
||||
- snapcast: update to 0.27.0
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
# Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv)
|
||||
|
||||
PKG_NAME="snapserver"
|
||||
PKG_VERSION="0.26.0"
|
||||
PKG_REV="0"
|
||||
PKG_VERSION="0.27.0"
|
||||
PKG_REV="2"
|
||||
PKG_ARCH="any"
|
||||
PKG_LICENSE="GPLv3"
|
||||
PKG_DEPENDS_TARGET="toolchain nqptp shairport-sync snapcast"
|
||||
|
||||
@@ -1 +1,5 @@
|
||||
initial release
|
||||
1
|
||||
- not released for LE11
|
||||
|
||||
2
|
||||
- syncthing: update to 1.23.4
|
||||
|
||||
@@ -2,9 +2,9 @@
|
||||
# Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv)
|
||||
|
||||
PKG_NAME="syncthing"
|
||||
PKG_VERSION="1.22.2"
|
||||
PKG_SHA256="211704904788808ef2818994fb36e33c3e33ed1b52267f7adbf1411fa5ee2d2f"
|
||||
PKG_REV="0"
|
||||
PKG_VERSION="1.23.4"
|
||||
PKG_SHA256="06a2882f8ac49e15faf96025b01d0edcd4cc190a419d5de98fbe8271695329fa"
|
||||
PKG_REV="2"
|
||||
PKG_ARCH="any"
|
||||
PKG_LICENSE="MPLv2"
|
||||
PKG_SITE="https://syncthing.net/"
|
||||
|
||||
@@ -1 +1,2 @@
|
||||
initial release
|
||||
1
|
||||
- fix not working TigerVNC
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
PKG_NAME="tigervnc"
|
||||
PKG_VERSION="1.10.1"
|
||||
PKG_SHA256="19fcc80d7d35dd58115262e53cac87d8903180261d94c2a6b0c19224f50b58c4"
|
||||
PKG_REV="0"
|
||||
PKG_REV="1"
|
||||
PKG_ARCH="x86_64"
|
||||
PKG_LICENSE="GPLv2"
|
||||
PKG_SITE="http://www.tigervnc.org"
|
||||
@@ -24,10 +24,20 @@ makeinstall_target() {
|
||||
: # nothing to do
|
||||
}
|
||||
|
||||
# find ${1}.so.[0-9]* in ${2} and copy it to dest
|
||||
_pkg_copy_lib() {
|
||||
find "${2}/usr/lib" -regextype sed -regex ".*/${1}\.so\.[0-9]*" \
|
||||
-exec cp {} "${ADDON_BUILD}/${PKG_ADDON_ID}/lib" \;
|
||||
}
|
||||
|
||||
addon() {
|
||||
mkdir -p ${ADDON_BUILD}/${PKG_ADDON_ID}/bin
|
||||
mkdir -p ${ADDON_BUILD}/${PKG_ADDON_ID}/{bin,lib}
|
||||
|
||||
cp ${PKG_BUILD}/.${TARGET_NAME}/unix/vncconfig/vncconfig \
|
||||
${PKG_BUILD}/.${TARGET_NAME}/unix/vncpasswd/vncpasswd \
|
||||
${PKG_BUILD}/.${TARGET_NAME}/unix/x0vncserver/x0vncserver \
|
||||
${ADDON_BUILD}/${PKG_ADDON_ID}/bin/
|
||||
|
||||
# copy required libraries for tigervnc
|
||||
_pkg_copy_lib libXtst $(get_install_dir libXtst)
|
||||
}
|
||||
|
||||
@@ -1 +1,2 @@
|
||||
initial release
|
||||
1
|
||||
- ttyd: update to 1.7.3
|
||||
|
||||
@@ -2,9 +2,9 @@
|
||||
# Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv)
|
||||
|
||||
PKG_NAME="ttyd"
|
||||
PKG_VERSION="1.7.2"
|
||||
PKG_SHA256="edc44cd5319c0c9d0858081496cae36fc5c54ee7722e0a547dde39537dfb63de"
|
||||
PKG_REV="0"
|
||||
PKG_VERSION="1.7.3"
|
||||
PKG_SHA256="c9cf5eece52d27c5d728000f11315d36cb400c6948d1964a34a7eae74b454099"
|
||||
PKG_REV="1"
|
||||
PKG_ARCH="any"
|
||||
PKG_LICENSE="MIT"
|
||||
PKG_SITE="https://github.com/tsl0922/ttyd"
|
||||
|
||||
@@ -1 +1,2 @@
|
||||
initial release
|
||||
1
|
||||
- btrfs-progs: update to 6.2.2
|
||||
|
||||
@@ -2,9 +2,9 @@
|
||||
# Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv)
|
||||
|
||||
PKG_NAME="btrfs-progs"
|
||||
PKG_VERSION="6.1.3"
|
||||
PKG_SHA256="e6512ff305963bc68f11803fa759fecbead778a3a951aeb4f7f3f76dabb31db4"
|
||||
PKG_REV="0"
|
||||
PKG_VERSION="6.2.2"
|
||||
PKG_SHA256="140d3d98f2cba4c7f05c16aec3038f044e11555a40c27a5006185c99a10c7ca2"
|
||||
PKG_REV="1"
|
||||
PKG_ARCH="any"
|
||||
PKG_LICENSE="GPL"
|
||||
PKG_SITE="https://btrfs.wiki.kernel.org/index.php/Main_Page"
|
||||
|
||||
@@ -1 +1,11 @@
|
||||
initial release
|
||||
4
|
||||
- aspnet6-runtime: update to 6.0.19
|
||||
|
||||
3
|
||||
- aspnet6-runtime: update to 6.0.18
|
||||
|
||||
2
|
||||
- aspnet6-runtime: update to 6.0.16
|
||||
|
||||
1
|
||||
- aspnet6-runtime: update to 6.0.15
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
# Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv)
|
||||
|
||||
PKG_NAME="dotnet-runtime"
|
||||
PKG_REV="0"
|
||||
PKG_REV="4"
|
||||
PKG_ARCH="any"
|
||||
PKG_LICENSE="MIT"
|
||||
PKG_SITE="https://dotnet.microsoft.com/"
|
||||
|
||||
@@ -1 +1,3 @@
|
||||
initial release
|
||||
1
|
||||
- mpg123: update to 1.31.3
|
||||
- mpv-drmprime: update to 0.35.1
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
|
||||
PKG_NAME="multimedia-tools"
|
||||
PKG_VERSION="1.0"
|
||||
PKG_REV="0"
|
||||
PKG_REV="1"
|
||||
PKG_ARCH="any"
|
||||
PKG_LICENSE="GPL"
|
||||
PKG_SITE="https://libreelec.tv"
|
||||
|
||||
@@ -1 +1,5 @@
|
||||
initial release
|
||||
1
|
||||
- iperf: update to 3.13
|
||||
- libpcap: update to 1.10.3
|
||||
- rar2fs: update to 1.29.6
|
||||
- tcpdump: update to 4.99.3
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
|
||||
PKG_NAME="network-tools"
|
||||
PKG_VERSION="1.0"
|
||||
PKG_REV="0"
|
||||
PKG_REV="1"
|
||||
PKG_ARCH="any"
|
||||
PKG_LICENSE="GPL"
|
||||
PKG_SITE="https://libreelec.tv"
|
||||
|
||||
@@ -1 +1,9 @@
|
||||
initial release
|
||||
1
|
||||
- bottom: update to 0.8.0
|
||||
- diffutils: update to 3.9
|
||||
- htop: update to 3.2.2
|
||||
- lshw: fix lshw -version display
|
||||
- mc: update to 4.8.29
|
||||
- stress-ng: update to 0.15.06
|
||||
- unrar: update to 6.2.6
|
||||
- vim: update to 9.0.1417
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
|
||||
PKG_NAME="system-tools"
|
||||
PKG_VERSION="1.0"
|
||||
PKG_REV="0"
|
||||
PKG_REV="1"
|
||||
PKG_ARCH="any"
|
||||
PKG_LICENSE="GPL"
|
||||
PKG_SITE="https://libreelec.tv"
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
# Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv)
|
||||
|
||||
PKG_NAME="libretro-2048"
|
||||
PKG_VERSION="0edef01f4c2dd2cbd0bb66b888ca4b57fad297d1"
|
||||
PKG_SHA256="d8eec941029b85418da76eb49b3459617af12effe243876225e87739c374f0c8"
|
||||
PKG_VERSION="331c1de588ed8f8c370dcbc488e5434a3c09f0f2"
|
||||
PKG_SHA256="9b30278e61b8dfe067d8f7cc9cb0d467e16a3d2de995e950b712570d7e4aa195"
|
||||
PKG_LICENSE="Public domain"
|
||||
PKG_SITE="https://github.com/libretro/libretro-2048"
|
||||
PKG_URL="https://github.com/libretro/libretro-2048/archive/${PKG_VERSION}.tar.gz"
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
# Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv)
|
||||
|
||||
PKG_NAME="libretro-beetle-lynx"
|
||||
PKG_VERSION="fc1288ccc0a4c6c07d690e0f0f5e883b43c20ba4"
|
||||
PKG_SHA256="fda851d729340e7247db122496af3218a49df1c6ebd6f91050aa22c02cae2510"
|
||||
PKG_VERSION="d718564b468590f6ed8abf5de6d2e9dfab64cb53"
|
||||
PKG_SHA256="b40158ba62f271ac5f9fb3034aa41fa1977b8375583763abd22231ddf0d88ca5"
|
||||
PKG_LICENSE="GPLv2"
|
||||
PKG_SITE="https://github.com/libretro/beetle-lynx-libretro"
|
||||
PKG_URL="https://github.com/libretro/beetle-lynx-libretro/archive/${PKG_VERSION}.tar.gz"
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
# Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv)
|
||||
|
||||
PKG_NAME="libretro-beetle-ngp"
|
||||
PKG_VERSION="00c7cb8ea97ad9a372307405d8abf34e401fec8a"
|
||||
PKG_SHA256="c7b24f77606c81818af335377ebedb09da344546c19092e3afe47954c8a4f2f2"
|
||||
PKG_VERSION="65460e3a9ad529f6901caf669abbda11f437ab55"
|
||||
PKG_SHA256="2d866f6be840b5cbcf6c4159b860d8cb0dffd00c540d230c98de48941d12c38e"
|
||||
PKG_LICENSE="GPLv2"
|
||||
PKG_SITE="https://github.com/libretro/beetle-ngp-libretro"
|
||||
PKG_URL="https://github.com/libretro/beetle-ngp-libretro/archive/${PKG_VERSION}.tar.gz"
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
# Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv)
|
||||
|
||||
PKG_NAME="libretro-beetle-pce-fast"
|
||||
PKG_VERSION="411176fbae51ff9d052e1775adeff1375c0dd6e0"
|
||||
PKG_SHA256="0af570c10eeab4eee1d8f1c613fd25aecab0f796c11cb762a6337f1a08613ee7"
|
||||
PKG_VERSION="703d0566858bf693996213af7b2a438636d8d991"
|
||||
PKG_SHA256="2a1c7e4251e56e60fd3c7c91ead660055bb97e7417621ec1b04ede688edc3818"
|
||||
PKG_LICENSE="GPLv2"
|
||||
PKG_SITE="https://github.com/libretro/beetle-pce-fast-libretro"
|
||||
PKG_URL="https://github.com/libretro/beetle-pce-fast-libretro/archive/${PKG_VERSION}.tar.gz"
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
# Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv)
|
||||
|
||||
PKG_NAME="libretro-beetle-pcfx"
|
||||
PKG_VERSION="45fa33f020e245f7681fc061b63064ec5bbf73c1"
|
||||
PKG_SHA256="8c8dc8250d51248855b6b5bf17d6b2d0889d8ba71b18cc05f53bb222ea6bb86f"
|
||||
PKG_VERSION="06f7ff996051feaf9e0d928bd2bce3c4c35af45a"
|
||||
PKG_SHA256="12545b05a6ec0374de91b3467ee5ec0afae82a3ebccdd6dce0fa66f4f7496db6"
|
||||
PKG_LICENSE="GPLv2"
|
||||
PKG_SITE="https://github.com/libretro/beetle-pcfx-libretro"
|
||||
PKG_URL="https://github.com/libretro/beetle-pcfx-libretro/archive/${PKG_VERSION}.tar.gz"
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
# Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv)
|
||||
|
||||
PKG_NAME="libretro-beetle-psx"
|
||||
PKG_VERSION="4adf707626da25c31aa43aa58fe6e91c0264c285"
|
||||
PKG_SHA256="a70ed648fd50a90237cb770aa7ae629df204c0d11199f264236ed5f657fddea6"
|
||||
PKG_VERSION="17df2b9b93ba20c520c4592deed4531afc37bc7a"
|
||||
PKG_SHA256="505c0db4bab3ff81bae5230ea52618a48e2ee84e24f1c3783c1ea4d91d9bc6e4"
|
||||
PKG_LICENSE="GPLv2"
|
||||
PKG_SITE="https://github.com/libretro/beetle-psx-libretro"
|
||||
PKG_URL="https://github.com/libretro/beetle-psx-libretro/archive/${PKG_VERSION}.tar.gz"
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
# Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv)
|
||||
|
||||
PKG_NAME="libretro-beetle-supergrafx"
|
||||
PKG_VERSION="4e7272be6feeecd1c4d793181c42d1eae289f3f2"
|
||||
PKG_SHA256="55fcdc7a77590f84ee327c4aba32616e21c62b8254e02b78f8bc96c2b46d37bb"
|
||||
PKG_VERSION="bd50eae63ef38f4ff6d61e8f3a782fdac6a3eeb3"
|
||||
PKG_SHA256="e194b968e853b9787bc71eb2a7010be9f2a248d8990fee6a59c855c1be531b0f"
|
||||
PKG_LICENSE="GPLv2"
|
||||
PKG_SITE="https://github.com/libretro/beetle-supergrafx-libretro"
|
||||
PKG_URL="https://github.com/libretro/beetle-supergrafx-libretro/archive/${PKG_VERSION}.tar.gz"
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
# Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv)
|
||||
|
||||
PKG_NAME="libretro-beetle-vb"
|
||||
PKG_VERSION="3e845666d7ce235a071eb306e94074f1a72633bf"
|
||||
PKG_SHA256="50804a63e430b18d40ff35c8bd2cba5db02c9490399e21f4cf8c6901f1ad6650"
|
||||
PKG_VERSION="34996eb1aa7d84ef9bf768628ab0235f85662406"
|
||||
PKG_SHA256="6c9aa6cc8565d77ec3d037f2634fa33b0b21baa52d599c488395ca2c3ab71d98"
|
||||
PKG_LICENSE="GPLv2"
|
||||
PKG_SITE="https://github.com/libretro/beetle-vb-libretro"
|
||||
PKG_URL="https://github.com/libretro/beetle-vb-libretro/archive/${PKG_VERSION}.tar.gz"
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
# Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv)
|
||||
|
||||
PKG_NAME="libretro-beetle-wswan"
|
||||
PKG_VERSION="05ec7364913a95d8bb8691a41505d3d66b9e8367"
|
||||
PKG_SHA256="e0553ac593b73b8a03f33a0cd79f8d967baed65d11ca2b002fce0ccdd3deafe7"
|
||||
PKG_VERSION="4b1bf823fca4c489e13d826913a875b544432828"
|
||||
PKG_SHA256="f4fac412969d0b846552dcf69c29b77d6e4e3eb61f4a0ddd2f08b9fcf1347002"
|
||||
PKG_LICENSE="GPLv2"
|
||||
PKG_SITE="https://github.com/libretro/beetle-wswan-libretro"
|
||||
PKG_URL="https://github.com/libretro/beetle-wswan-libretro/archive/${PKG_VERSION}.tar.gz"
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
# Copyright (C) 2021-present Team LibreELEC (https://libreelec.tv)
|
||||
|
||||
PKG_NAME="libretro-fbneo"
|
||||
PKG_VERSION="c68d212443c8fef7cea79b1548c64d18baed0ff5"
|
||||
PKG_SHA256="bbc07a6cea3ccf573486962a267553b03a9b5ea026810123e7c39bb05b41131e"
|
||||
PKG_VERSION="afcd7234fc93b2824f6b8fe1aa80c142a61ad528"
|
||||
PKG_SHA256="94d5f9215a3231ee040a2841e3512e32cc21416e7eec5f6c3b42f1d6eca2a4ea"
|
||||
PKG_LICENSE="OSS"
|
||||
PKG_SITE="https://github.com/libretro/FBNeo"
|
||||
PKG_URL="https://github.com/libretro/FBNeo/archive/${PKG_VERSION}.tar.gz"
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
# Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv)
|
||||
|
||||
PKG_NAME="libretro-fceumm"
|
||||
PKG_VERSION="159f27a1f16e74f4e1f7f424477d3bb098302ea0"
|
||||
PKG_SHA256="ef7e654b6110538bce66f175f89fb7b74ddbf131c815ad0cf0063992dec07869"
|
||||
PKG_VERSION="c795a25647614ee68cc3c8c187566fae3acfde60"
|
||||
PKG_SHA256="74be2198a61d561bf513b42d235abd78401a287b3f9ed88eb0acd6b831ea6ee5"
|
||||
PKG_LICENSE="GPLv2"
|
||||
PKG_SITE="https://github.com/libretro/libretro-fceumm"
|
||||
PKG_URL="https://github.com/libretro/libretro-fceumm/archive/${PKG_VERSION}.tar.gz"
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
# Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv)
|
||||
|
||||
PKG_NAME="libretro-gambatte"
|
||||
PKG_VERSION="ca0f7e14c55698a8eb81ea5af58701173e85bc7f"
|
||||
PKG_SHA256="2bf266ffeaff920b16a6153a6b0b2a85f350a548f1cabdf22954c509153b595d"
|
||||
PKG_VERSION="5ae3727f51798b1da437429f7559ffb36c575127"
|
||||
PKG_SHA256="81465ee673c8f64ad07a18603aeaf9161a425f84dff245fa95bc78b71ea71749"
|
||||
PKG_LICENSE="GPLv2"
|
||||
PKG_SITE="https://github.com/libretro/gambatte-libretro"
|
||||
PKG_URL="https://github.com/libretro/gambatte-libretro/archive/${PKG_VERSION}.tar.gz"
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
# Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv)
|
||||
|
||||
PKG_NAME="libretro-genplus"
|
||||
PKG_VERSION="38acb118026690a3afa28eb08eb247fd94f6082c"
|
||||
PKG_SHA256="f36336512ba70e0d750a7b5acca16cd0ebdf33eda87870b4d5d3e995603caad6"
|
||||
PKG_VERSION="118e2b83873beba1a2f154a8bad8a02bdd8ea98d"
|
||||
PKG_SHA256="b6599120b736b2579cf56725b7eff8454f469c42d5039eaf6524dbb6d138eff0"
|
||||
PKG_LICENSE="Modified BSD / LGPLv2.1"
|
||||
PKG_SITE="https://github.com/libretro/Genesis-Plus-GX"
|
||||
PKG_URL="https://github.com/libretro/Genesis-Plus-GX/archive/${PKG_VERSION}.tar.gz"
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user