mirror of
https://github.com/LibreELEC/LibreELEC.tv
synced 2025-09-24 19:46:01 +07:00
Compare commits
826 Commits
6a7c6a4277
...
9.2.2
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
074a450813 | ||
|
|
33dfe1b85f | ||
|
|
25f7154217 | ||
|
|
16919f74df | ||
|
|
2a66340077 | ||
|
|
0f97dc22f7 | ||
|
|
6738b8a61e | ||
|
|
fceeb1b2e3 | ||
|
|
9d3282937c | ||
|
|
0050462a91 | ||
|
|
209800edee | ||
|
|
0cb36e0ec7 | ||
|
|
ecd7264ea4 | ||
|
|
23d30bbc43 | ||
|
|
5baab17211 | ||
|
|
8bc985b782 | ||
|
|
f3f6aeabd7 | ||
|
|
ecfbc2cbb6 | ||
|
|
48c7fbb928 | ||
|
|
e82aba47d3 | ||
|
|
c96642e72b | ||
|
|
8f1f6dfcfa | ||
|
|
006f797c57 | ||
|
|
98789b4a2f | ||
|
|
870c6050f6 | ||
|
|
5f4a2563be | ||
|
|
fc05726626 | ||
|
|
975b30d64d | ||
|
|
5a0591e51b | ||
|
|
4229e893b4 | ||
|
|
4a2ffb39a0 | ||
|
|
5cccd642e2 | ||
|
|
475e4829dd | ||
|
|
29328988d3 | ||
|
|
4269b7e2ee | ||
|
|
5d916fdd84 | ||
|
|
e3e5770a31 | ||
|
|
235c67ca05 | ||
|
|
e5c6cd69a5 | ||
|
|
5a9c9e2727 | ||
|
|
3a2a735298 | ||
|
|
5101f8090d | ||
|
|
710041d5d9 | ||
|
|
5d2454fe5f | ||
|
|
68f09abc06 | ||
|
|
2438e5a0b7 | ||
|
|
67d9be9c87 | ||
|
|
4b4f842fbd | ||
|
|
667ac4a718 | ||
|
|
db03bf5cf0 | ||
|
|
b75cc324f0 | ||
|
|
24dfda1f7c | ||
|
|
ddd6aea16f | ||
|
|
9cffe263f1 | ||
|
|
64fdc40a21 | ||
|
|
0cd5daa4e3 | ||
|
|
1b5da0f6c1 | ||
|
|
6cc5ae1e17 | ||
|
|
c3776ffb6b | ||
|
|
c85978a499 | ||
|
|
559e717326 | ||
|
|
09a0068c78 | ||
|
|
c9ee8849e9 | ||
|
|
3db71a02f4 | ||
|
|
601c1b43ed | ||
|
|
c8d3bbff46 | ||
|
|
a48aeb0100 | ||
|
|
6f1ff8b102 | ||
|
|
031971bab8 | ||
|
|
5861c69ceb | ||
|
|
fc50866af5 | ||
|
|
c82937d99d | ||
|
|
d4eee23479 | ||
|
|
c1e0fc7fce | ||
|
|
c96d5a4852 | ||
|
|
b7cd7fdfc5 | ||
|
|
e5109c952e | ||
|
|
d74973747a | ||
|
|
4bd7b1527d | ||
|
|
2b3f770e33 | ||
|
|
6536838edc | ||
|
|
001a3fa611 | ||
|
|
cbfdcbca2d | ||
|
|
6b8fe40614 | ||
|
|
0a7bb4ffeb | ||
|
|
6ac10dc4f8 | ||
|
|
701b80f7c5 | ||
|
|
d1640fe4c0 | ||
|
|
79788d560d | ||
|
|
2a7444beca | ||
|
|
a709cbbdac | ||
|
|
000cf1768c | ||
|
|
664eed9977 | ||
|
|
773d76e5aa | ||
|
|
15aebe1e00 | ||
|
|
57dcbbf631 | ||
|
|
b0ccfbc797 | ||
|
|
1719192ee1 | ||
|
|
751f49eec5 | ||
|
|
065799ec68 | ||
|
|
5c83a514f6 | ||
|
|
a8b12b1052 | ||
|
|
175b7ed46e | ||
|
|
cffbf60a6a | ||
|
|
ed4847e430 | ||
|
|
8a76bd17e7 | ||
|
|
03074b2a69 | ||
|
|
08474e7a7d | ||
|
|
e7ac31c253 | ||
|
|
bb6356da78 | ||
|
|
4c37dd51d8 | ||
|
|
f2ff582d14 | ||
|
|
ff7194584f | ||
|
|
6f80a63266 | ||
|
|
8b8fa8b2a1 | ||
|
|
97a6b1e063 | ||
|
|
5ce2a0bf78 | ||
|
|
d5cf40ff13 | ||
|
|
91b9547161 | ||
|
|
2b7d71f18e | ||
|
|
3bfc4fb706 | ||
|
|
1a63f585e1 | ||
|
|
68e4184c9a | ||
|
|
986c4987f1 | ||
|
|
092bd988c2 | ||
|
|
a1fe4c868a | ||
|
|
57f6504a55 | ||
|
|
36a98f18a0 | ||
|
|
64e85d7498 | ||
|
|
fdcd179f81 | ||
|
|
01e975b153 | ||
|
|
5e2bc84e27 | ||
|
|
4a5f3a22c2 | ||
|
|
0ad0fe764f | ||
|
|
1392e81d00 | ||
|
|
8d5111c208 | ||
|
|
cf1a273718 | ||
|
|
f9f53151b5 | ||
|
|
49ebd0f9ab | ||
|
|
54f729222c | ||
|
|
e8c6ad8164 | ||
|
|
7a16627f50 | ||
|
|
ff729852fe | ||
|
|
fa0aca6347 | ||
|
|
07734490f3 | ||
|
|
dcd0bbac62 | ||
|
|
3f0c2ebb56 | ||
|
|
d97ed1c987 | ||
|
|
da2c9c33ae | ||
|
|
bfb998c0f7 | ||
|
|
0cea576b22 | ||
|
|
4947b861ce | ||
|
|
fb123d5dac | ||
|
|
b6abdacf9c | ||
|
|
9004f896ff | ||
|
|
dd8e12d847 | ||
|
|
c43b5f2fbe | ||
|
|
4dd199dff2 | ||
|
|
5d0330e6ad | ||
|
|
84875e4f25 | ||
|
|
176222f38c | ||
|
|
e089b59f30 | ||
|
|
7616baf0e8 | ||
|
|
41bc6862e3 | ||
|
|
6b8a687fca | ||
|
|
17e869e877 | ||
|
|
83234e1b48 | ||
|
|
d9fd376c71 | ||
|
|
2b59e9b214 | ||
|
|
8af7ac11ad | ||
|
|
99cba92719 | ||
|
|
a46fb152a0 | ||
|
|
a83d11491b | ||
|
|
c81b7617c0 | ||
|
|
ab47f0baf7 | ||
|
|
c5d37bf33a | ||
|
|
1fbeb10f5f | ||
|
|
564850c626 | ||
|
|
eb9dcf60de | ||
|
|
8628b74a0e | ||
|
|
7daee4bacd | ||
|
|
63d5d8bfb2 | ||
|
|
0ef8a5b3b0 | ||
|
|
62cf3edf1a | ||
|
|
bc18fe7b3b | ||
|
|
084fcb1c44 | ||
|
|
33449d042f | ||
|
|
c6abc6f9ae | ||
|
|
f6473f65a8 | ||
|
|
a286f2d135 | ||
|
|
607ab8bb31 | ||
|
|
ead39e7478 | ||
|
|
f7ddb3e412 | ||
|
|
29d9d08e49 | ||
|
|
dd6f2cfe5c | ||
|
|
092e574f57 | ||
|
|
97e2c5204c | ||
|
|
4f5fee7653 | ||
|
|
bee4bb3f4a | ||
|
|
4159f97316 | ||
|
|
3be49f5d07 | ||
|
|
66b50feecd | ||
|
|
582e5e4fc7 | ||
|
|
cccd235148 | ||
|
|
847945e219 | ||
|
|
a2e51e3a7a | ||
|
|
abf6dc244f | ||
|
|
821ad52da0 | ||
|
|
779efbc35c | ||
|
|
9ad1a0ade3 | ||
|
|
e9af55d89a | ||
|
|
ddcfc575f6 | ||
|
|
4543ce351c | ||
|
|
09b0403f0e | ||
|
|
fe9b2e812a | ||
|
|
047797822c | ||
|
|
821447c6ee | ||
|
|
a60d05411b | ||
|
|
855ec8710c | ||
|
|
e14652e9db | ||
|
|
260e26ac4b | ||
|
|
8c2dda0d92 | ||
|
|
438266895d | ||
|
|
ff1e4f8565 | ||
|
|
c73614dc3d | ||
|
|
781e637b16 | ||
|
|
b6e9a63684 | ||
|
|
10665ba6b1 | ||
|
|
828ff0a987 | ||
|
|
0321837881 | ||
|
|
13b3252810 | ||
|
|
c97f38e942 | ||
|
|
e2e05ade82 | ||
|
|
a00b801426 | ||
|
|
a233e7936a | ||
|
|
d2ea00a971 | ||
|
|
3524972190 | ||
|
|
99b2aba8c3 | ||
|
|
4a2fd7e371 | ||
|
|
bee07eede2 | ||
|
|
654f3024eb | ||
|
|
e79385c0e4 | ||
|
|
6ba88724bf | ||
|
|
8897a17546 | ||
|
|
703b46a64a | ||
|
|
17692771e2 | ||
|
|
e3c1bd93fc | ||
|
|
d86dcbd288 | ||
|
|
309dbfe866 | ||
|
|
98394a9d5a | ||
|
|
46bd66865e | ||
|
|
e005812677 | ||
|
|
d2d351da83 | ||
|
|
22bd6ecacb | ||
|
|
d4508cd883 | ||
|
|
a18f219654 | ||
|
|
0c366f4a37 | ||
|
|
477629bdb9 | ||
|
|
fd9975888c | ||
|
|
5ecc7e3674 | ||
|
|
cad016cb9f | ||
|
|
a15eeec91b | ||
|
|
e1034f423d | ||
|
|
5625e11f5e | ||
|
|
ba7ecaa609 | ||
|
|
bc6b6d0551 | ||
|
|
47d66c7e3f | ||
|
|
104c9defd8 | ||
|
|
a3e8e7d302 | ||
|
|
ad83ea63e3 | ||
|
|
be75d3b872 | ||
|
|
c35ea1ac6c | ||
|
|
c1bb7b94ab | ||
|
|
eff2608820 | ||
|
|
4a6cf78f5d | ||
|
|
cb59513294 | ||
|
|
236ea95fd8 | ||
|
|
2684517ad1 | ||
|
|
f979e6ab62 | ||
|
|
f75ec82571 | ||
|
|
4e1fc8b029 | ||
|
|
ecc3500395 | ||
|
|
dae7e1c534 | ||
|
|
d25b4aef4a | ||
|
|
b18d021586 | ||
|
|
766cfd33a2 | ||
|
|
a33f204304 | ||
|
|
a873b63d46 | ||
|
|
b0d2a1f51d | ||
|
|
8f3a881f12 | ||
|
|
68bf4bdd00 | ||
|
|
dbf8f36048 | ||
|
|
259a5b7f73 | ||
|
|
e1d6e92907 | ||
|
|
010bd5fd9d | ||
|
|
707b974d76 | ||
|
|
78080a6a46 | ||
|
|
01931c4940 | ||
|
|
4ba4ba6df2 | ||
|
|
f44f964127 | ||
|
|
f504f8cdcf | ||
|
|
a06ddbdce1 | ||
|
|
28ecf8f4ac | ||
|
|
ebceed98a9 | ||
|
|
c74a96b92d | ||
|
|
bd07ce9ac5 | ||
|
|
a559932c08 | ||
|
|
97c2967826 | ||
|
|
a6459fe37e | ||
|
|
12495fad3f | ||
|
|
17827c1c71 | ||
|
|
226cc4234c | ||
|
|
e807b9ca54 | ||
|
|
e5236c3910 | ||
|
|
138374b949 | ||
|
|
1c091618e8 | ||
|
|
5f778a505a | ||
|
|
7cfe729d29 | ||
|
|
1c3da1e645 | ||
|
|
536a2d0014 | ||
|
|
dd198bf0b4 | ||
|
|
ec342bdd9b | ||
|
|
9ee80a21b7 | ||
|
|
048a33c99c | ||
|
|
07f8b9418e | ||
|
|
c04a6f4759 | ||
|
|
74afcc236f | ||
|
|
233b4ed056 | ||
|
|
2129e29c22 | ||
|
|
c042c433f6 | ||
|
|
2fd8ed32ce | ||
|
|
d6367beef7 | ||
|
|
87e293535a | ||
|
|
55bb46103b | ||
|
|
6000b5c87b | ||
|
|
438198dcd6 | ||
|
|
9e79363e78 | ||
|
|
505df7c788 | ||
|
|
72e19ccae8 | ||
|
|
3e32f390db | ||
|
|
da11d70f7d | ||
|
|
c1cd2e5c73 | ||
|
|
6e05ca4a69 | ||
|
|
bdeb0ccd4f | ||
|
|
44d46b4a23 | ||
|
|
749b9b2068 | ||
|
|
2a5b368872 | ||
|
|
276b989054 | ||
|
|
329dbc22f2 | ||
|
|
18e6c50ee1 | ||
|
|
ccfaa1ea32 | ||
|
|
d2015cf60b | ||
|
|
5c262a7c63 | ||
|
|
572c3ad9a2 | ||
|
|
728d0ee3ee | ||
|
|
b615639ab1 | ||
|
|
23434e18ca | ||
|
|
480fc09d5a | ||
|
|
077ee9572b | ||
|
|
38f45582e2 | ||
|
|
f43acfbbde | ||
|
|
a80ee9d033 | ||
|
|
d58acf754d | ||
|
|
0bd3e610a3 | ||
|
|
a076e074ef | ||
|
|
a3cab3855a | ||
|
|
4e2e7c824c | ||
|
|
e117405cec | ||
|
|
3ac9286fbf | ||
|
|
be5afc4cdd | ||
|
|
4d9d148629 | ||
|
|
9ae87b9e15 | ||
|
|
58430ffe6a | ||
|
|
a7c4f092e1 | ||
|
|
61461cd8e1 | ||
|
|
b7d6680f15 | ||
|
|
b2b2eea1c2 | ||
|
|
cebad6b63f | ||
|
|
b8d6a1dfc9 | ||
|
|
a19b955bd9 | ||
|
|
fc96741f5a | ||
|
|
0225a0342b | ||
|
|
4c42ff3f82 | ||
|
|
ec3ff1b6d1 | ||
|
|
2f1e06c26d | ||
|
|
10f41385b1 | ||
|
|
2b35beeb0f | ||
|
|
d81cc10a81 | ||
|
|
4533bf3ea7 | ||
|
|
7da4fa4dc9 | ||
|
|
316620cdb9 | ||
|
|
7deb7b0236 | ||
|
|
827e3f1444 | ||
|
|
50935255f0 | ||
|
|
ee2503e625 | ||
|
|
86f677ceea | ||
|
|
50afe5e20c | ||
|
|
55a50f3ec7 | ||
|
|
210f15173c | ||
|
|
db3061c294 | ||
|
|
7437f95512 | ||
|
|
7f8b26a001 | ||
|
|
ea370a93cf | ||
|
|
8883bab7b5 | ||
|
|
b8637f24ee | ||
|
|
3e0369fac2 | ||
|
|
b081a83003 | ||
|
|
50fe8d25bb | ||
|
|
3487aa4f59 | ||
|
|
538793e0e8 | ||
|
|
2c2a752bb4 | ||
|
|
bcb6fbb2dd | ||
|
|
066d1f4915 | ||
|
|
f3ec7145ab | ||
|
|
810135dfb1 | ||
|
|
cc3f393bce | ||
|
|
87a3e42c97 | ||
|
|
e7e3247c27 | ||
|
|
b6d91f188f | ||
|
|
d044026689 | ||
|
|
3aa1bc4080 | ||
|
|
854f65ff6f | ||
|
|
fdd66d5dc9 | ||
|
|
6a1675d0c4 | ||
|
|
352fa92689 | ||
|
|
7b1fe3b40f | ||
|
|
9243994d4d | ||
|
|
e45756a624 | ||
|
|
4c82cf416b | ||
|
|
2b05e02808 | ||
|
|
7fdcfe9d4a | ||
|
|
a30489aef6 | ||
|
|
5b9312d366 | ||
|
|
0af77e49db | ||
|
|
027f5f9542 | ||
|
|
1ca4b9e2ab | ||
|
|
0a63988817 | ||
|
|
dc56cf1aa0 | ||
|
|
c31b78aa65 | ||
|
|
7f2c559952 | ||
|
|
f07b611b85 | ||
|
|
9be01dd43b | ||
|
|
d9f5c1f594 | ||
|
|
ea070a4252 | ||
|
|
5052df5098 | ||
|
|
11c50fa049 | ||
|
|
51952298df | ||
|
|
fb481d6e8b | ||
|
|
692820c7e6 | ||
|
|
49665d0f56 | ||
|
|
10b73fa523 | ||
|
|
be4588cba8 | ||
|
|
f4ba1c8d0a | ||
|
|
ba7682954f | ||
|
|
32fb0dbdb6 | ||
|
|
2307fc6682 | ||
|
|
9689856e11 | ||
|
|
dc79a08ac8 | ||
|
|
f7d3be64e8 | ||
|
|
158db2052d | ||
|
|
31ae0db426 | ||
|
|
4136121967 | ||
|
|
76abc3a94e | ||
|
|
e7ea4cda81 | ||
|
|
be5631bfca | ||
|
|
0e2c544636 | ||
|
|
dff7803273 | ||
|
|
3a2cb71bdb | ||
|
|
cc23c1aa7d | ||
|
|
63dc844972 | ||
|
|
9fca79227d | ||
|
|
73aef806ae | ||
|
|
27a9b68274 | ||
|
|
d676a82920 | ||
|
|
434b5dcd20 | ||
|
|
ff14fc75de | ||
|
|
ee01247de3 | ||
|
|
62f0784860 | ||
|
|
151ff51d3d | ||
|
|
a62c0088b7 | ||
|
|
6fce87427b | ||
|
|
ec6cd1c748 | ||
|
|
af21cb6650 | ||
|
|
e5204380fa | ||
|
|
a2c343813a | ||
|
|
ad6a9f656e | ||
|
|
6a0e35e8c4 | ||
|
|
838b7587c4 | ||
|
|
a5480b6fbb | ||
|
|
089293d1b1 | ||
|
|
60c0025939 | ||
|
|
d40e6da679 | ||
|
|
02781b9cbf | ||
|
|
2ae4537216 | ||
|
|
43e58805d7 | ||
|
|
212c181de6 | ||
|
|
af7dd480fd | ||
|
|
4200d032e3 | ||
|
|
f2340cbcc9 | ||
|
|
e25aee7b70 | ||
|
|
3d3548216e | ||
|
|
9a21fc75d9 | ||
|
|
66d3241701 | ||
|
|
224bbd25a8 | ||
|
|
0ebb14559d | ||
|
|
7b0de5b7f6 | ||
|
|
161b7d7942 | ||
|
|
1ebce4e7eb | ||
|
|
5a6715c5aa | ||
|
|
d93bd49a02 | ||
|
|
426ff4cb1f | ||
|
|
8fc217337c | ||
|
|
82f70d28c9 | ||
|
|
eaf81e7277 | ||
|
|
fc97f456dc | ||
|
|
8380877cf5 | ||
|
|
ff8c463b31 | ||
|
|
7d84fbe6fa | ||
|
|
cff7ea1ab8 | ||
|
|
e0dc24ea42 | ||
|
|
79b31b45fd | ||
|
|
341aa35c3c | ||
|
|
02601a2500 | ||
|
|
adbe82298a | ||
|
|
365faa110f | ||
|
|
f1614bbac7 | ||
|
|
e89045361a | ||
|
|
ff813fca35 | ||
|
|
3e1563cb68 | ||
|
|
b50aa11e7d | ||
|
|
05a8e96592 | ||
|
|
2caa3e3b8b | ||
|
|
ff815836c5 | ||
|
|
39a81f5182 | ||
|
|
e826e18033 | ||
|
|
a6bc84ddd3 | ||
|
|
f04ec17bed | ||
|
|
357615473e | ||
|
|
96d92948a7 | ||
|
|
28b122f38b | ||
|
|
1e68ced1fb | ||
|
|
8dbe022c96 | ||
|
|
c2a626cdb6 | ||
|
|
266954d8b0 | ||
|
|
94aa4aebf6 | ||
|
|
6536414a46 | ||
|
|
a4a45cb3ba | ||
|
|
8c216956fd | ||
|
|
2b95120495 | ||
|
|
e44dd201a7 | ||
|
|
69e818ad25 | ||
|
|
bf06da5c6b | ||
|
|
973b437725 | ||
|
|
5fd83ea792 | ||
|
|
78e9965676 | ||
|
|
8aad391e89 | ||
|
|
fd1a20ede9 | ||
|
|
5ae38dba9d | ||
|
|
1fb4d27773 | ||
|
|
84e70210df | ||
|
|
664cadb820 | ||
|
|
237ed098f2 | ||
|
|
f1ef2f099c | ||
|
|
8bf41b5646 | ||
|
|
285ff64f93 | ||
|
|
f51e242eb6 | ||
|
|
5f4af38bda | ||
|
|
15cf6edcda | ||
|
|
fad82f0e52 | ||
|
|
f999f5818e | ||
|
|
60541fc7a4 | ||
|
|
1da93cec4f | ||
|
|
5c211cf5d1 | ||
|
|
965be3346f | ||
|
|
d46852e00c | ||
|
|
8fc25d9216 | ||
|
|
bb6cb4a18c | ||
|
|
75104714e1 | ||
|
|
788419c782 | ||
|
|
30f1e06c23 | ||
|
|
5cd2c6e4c9 | ||
|
|
aba8d19930 | ||
|
|
27130e8aa1 | ||
|
|
c29f446179 | ||
|
|
87eb94dc15 | ||
|
|
e76f0a39c0 | ||
|
|
b26a38279d | ||
|
|
0644052754 | ||
|
|
7678359759 | ||
|
|
5a5768aa60 | ||
|
|
eb8a4720ae | ||
|
|
541d29df36 | ||
|
|
f8ebb2f97a | ||
|
|
bd95afbae4 | ||
|
|
4ba7e76c64 | ||
|
|
d7c2207b8a | ||
|
|
c4b17555e1 | ||
|
|
7562b1f433 | ||
|
|
1aebc8cbf5 | ||
|
|
6f8b63acfe | ||
|
|
331d203edf | ||
|
|
f63b7fba07 | ||
|
|
60e06a17a3 | ||
|
|
2a9c4bb5be | ||
|
|
3cf175b0b2 | ||
|
|
a4b0706441 | ||
|
|
240d6f7917 | ||
|
|
e8a8df3f00 | ||
|
|
92e234cb70 | ||
|
|
a5bdc03af1 | ||
|
|
8f3af234a2 | ||
|
|
e7e91da91c | ||
|
|
6a01a9db3b | ||
|
|
243ca122d3 | ||
|
|
e910fb0626 | ||
|
|
d64d3819b0 | ||
|
|
10050ae75e | ||
|
|
ca4b9da4c6 | ||
|
|
d41d3b9cc6 | ||
|
|
ab0021b78f | ||
|
|
a7004681fa | ||
|
|
c3cc72fe3c | ||
|
|
c7babb3620 | ||
|
|
fc72e5d751 | ||
|
|
68570a6588 | ||
|
|
3adcb6ca9b | ||
|
|
ba818a4e9c | ||
|
|
c010cd4852 | ||
|
|
06a4a58835 | ||
|
|
3365ab2af7 | ||
|
|
818afbc013 | ||
|
|
a8cffb1142 | ||
|
|
bdd90f6c23 | ||
|
|
4c7e6a19d2 | ||
|
|
67de716210 | ||
|
|
bde8334d50 | ||
|
|
edf491d1c1 | ||
|
|
40b068464b | ||
|
|
d7ca15cce3 | ||
|
|
1f64a8165d | ||
|
|
9917b60837 | ||
|
|
a94ed02bac | ||
|
|
12169b7387 | ||
|
|
23c75ecd68 | ||
|
|
4d65280e66 | ||
|
|
439d3ff31e | ||
|
|
5e495a2bd2 | ||
|
|
26b2b6317c | ||
|
|
df47b8be68 | ||
|
|
ce7b145f29 | ||
|
|
2d400f1239 | ||
|
|
8a7f1edad0 | ||
|
|
b6027210f5 | ||
|
|
113b2829ab | ||
|
|
0e2b1c616b | ||
|
|
0ef9bd02e5 | ||
|
|
b63c7cfe41 | ||
|
|
b4a9b00c60 | ||
|
|
5225394e95 | ||
|
|
8daa6cd4a2 | ||
|
|
bd66701ec9 | ||
|
|
1279115624 | ||
|
|
2d418f67cc | ||
|
|
934cb939f3 | ||
|
|
a032fbd82e | ||
|
|
2f3ef07ca5 | ||
|
|
dc44c45496 | ||
|
|
97c44d6185 | ||
|
|
8cb1faf75a | ||
|
|
1d18803bd6 | ||
|
|
0f9583da99 | ||
|
|
e748d109b4 | ||
|
|
95422fadf0 | ||
|
|
d7e956544a | ||
|
|
267a536c16 | ||
|
|
987f53ca59 | ||
|
|
a3f6e5a14a | ||
|
|
91594773df | ||
|
|
0019bbb7db | ||
|
|
1f360da59f | ||
|
|
42d2f83366 | ||
|
|
3c36022773 | ||
|
|
7bd39a17c5 | ||
|
|
f0b6c134bc | ||
|
|
68a053bf5d | ||
|
|
61e8300e84 | ||
|
|
a01d717b01 | ||
|
|
ef00cbec7a | ||
|
|
ba4d163046 | ||
|
|
d44512f065 | ||
|
|
644437a35c | ||
|
|
86a09910c8 | ||
|
|
324c9b9e91 | ||
|
|
18835008d7 | ||
|
|
424156e8c2 | ||
|
|
58652ed54f | ||
|
|
7fe797c21d | ||
|
|
8a44aff0ae | ||
|
|
b350409a87 | ||
|
|
02c26cf74c | ||
|
|
10ceab95eb | ||
|
|
19eab3c0b4 | ||
|
|
1de4183ac9 | ||
|
|
8468cb546d | ||
|
|
1ef9d61701 | ||
|
|
8b74db943e | ||
|
|
a25d0284bb | ||
|
|
6c35c7744d | ||
|
|
d015207763 | ||
|
|
309c06aa95 | ||
|
|
48454e8f09 | ||
|
|
dce3e3d9b2 | ||
|
|
bf92570214 | ||
|
|
f308199746 | ||
|
|
33a9e93a8b | ||
|
|
7e8d54b030 | ||
|
|
44e5a963ec | ||
|
|
84b141fb03 | ||
|
|
549631cc92 | ||
|
|
79faa669af | ||
|
|
ef314ac176 | ||
|
|
1994796f5f | ||
|
|
c5c03e9217 | ||
|
|
ae802aa241 | ||
|
|
45b4a7eaf9 | ||
|
|
2e82cb8bfe | ||
|
|
a8f0af8f9f | ||
|
|
b01294dfbd | ||
|
|
075cd80895 | ||
|
|
17402b185f | ||
|
|
ecfc4182fb | ||
|
|
997b403b4c | ||
|
|
b66f07ff23 | ||
|
|
3c407df2fc | ||
|
|
65b88d4550 | ||
|
|
5224281992 | ||
|
|
ed3f230d16 | ||
|
|
37fb055954 | ||
|
|
531c4785ec | ||
|
|
5897e8155e | ||
|
|
61ad04c423 | ||
|
|
10e8774143 | ||
|
|
0423b4c8b6 | ||
|
|
c01f524e80 | ||
|
|
89c4916d11 | ||
|
|
f25a4c7159 | ||
|
|
48bda22cbc | ||
|
|
43df7485f8 | ||
|
|
2c5d302d8e | ||
|
|
02cca7dc25 | ||
|
|
0127603ce4 | ||
|
|
78cb67eebf | ||
|
|
d7d0f551e2 | ||
|
|
6027f4759b | ||
|
|
076d6c901a | ||
|
|
a48dc02c2e | ||
|
|
2ab4c72852 | ||
|
|
b1ace294eb | ||
|
|
1e505759d7 | ||
|
|
2082afff78 | ||
|
|
fb0007845a | ||
|
|
d7fc0eb6f0 | ||
|
|
8bfb08e555 | ||
|
|
abc9d658a2 | ||
|
|
0e5401939e | ||
|
|
6e69cd582f | ||
|
|
54072e33c8 | ||
|
|
08c38cb59a | ||
|
|
235fb0c12b | ||
|
|
8ac3106fb6 | ||
|
|
5b5284cd6a | ||
|
|
08565fa0e3 | ||
|
|
0bd4793492 | ||
|
|
04b8036e32 | ||
|
|
0eb36d786b | ||
|
|
195c206669 | ||
|
|
fbf0c54b71 | ||
|
|
9a24528e3f | ||
|
|
775df5da16 | ||
|
|
7604df2686 | ||
|
|
17ab4518fd | ||
|
|
bb9f7fa623 | ||
|
|
c3e674ed7d | ||
|
|
5f777dcbe8 | ||
|
|
6400a8cb7e | ||
|
|
7aabe781cb | ||
|
|
5cdbdf0303 | ||
|
|
9d6a971612 | ||
|
|
dc1d83925e | ||
|
|
f8ec58745e | ||
|
|
85cb44de99 | ||
|
|
c10e761b0d | ||
|
|
6c8ab49eec | ||
|
|
9e9e6befb3 | ||
|
|
f470d833b7 | ||
|
|
06f48133bb | ||
|
|
8ebda35e84 | ||
|
|
4fb34fc66a | ||
|
|
26e3588d79 | ||
|
|
e50834fd82 | ||
|
|
0b13c7b6fe | ||
|
|
b96e205f14 | ||
|
|
7ae3eb5b10 | ||
|
|
9e39ce6f1c | ||
|
|
1122893a50 | ||
|
|
ffdd6878a3 | ||
|
|
4ef5e73ae6 | ||
|
|
69f3db483e | ||
|
|
2fb1df6623 | ||
|
|
6202251a6c | ||
|
|
caaf067615 | ||
|
|
18d9847829 | ||
|
|
505ccecbc8 | ||
|
|
50fc3b5569 | ||
|
|
8f4bdc77cc | ||
|
|
902f198d46 | ||
|
|
3d10ea2d16 | ||
|
|
0f73329ce0 | ||
|
|
1fd115b699 | ||
|
|
58fc3e7ea9 | ||
|
|
c0ed05c6f6 | ||
|
|
ca952e8937 | ||
|
|
08c06b05cf | ||
|
|
284432cf4f | ||
|
|
c502b14ce6 | ||
|
|
707655ced2 |
3
.gitignore
vendored
3
.gitignore
vendored
@@ -12,6 +12,9 @@
|
|||||||
# mkpkg temp
|
# mkpkg temp
|
||||||
mkpkg-temp
|
mkpkg-temp
|
||||||
|
|
||||||
|
# options
|
||||||
|
/.libreelec
|
||||||
|
|
||||||
# private working directory
|
# private working directory
|
||||||
/.work/
|
/.work/
|
||||||
|
|
||||||
|
|||||||
19
Makefile
19
Makefile
@@ -14,25 +14,6 @@ image:
|
|||||||
noobs:
|
noobs:
|
||||||
./scripts/image noobs
|
./scripts/image noobs
|
||||||
|
|
||||||
amlpkg:
|
|
||||||
./scripts/image amlpkg
|
|
||||||
|
|
||||||
# legacy sequential build targets
|
|
||||||
system-st:
|
|
||||||
./scripts/image_st
|
|
||||||
|
|
||||||
release-st:
|
|
||||||
./scripts/image_st release
|
|
||||||
|
|
||||||
image-st:
|
|
||||||
./scripts/image_st mkimage
|
|
||||||
|
|
||||||
noobs-st:
|
|
||||||
./scripts/image_st noobs
|
|
||||||
|
|
||||||
amlpkg-st:
|
|
||||||
./scripts/image_st amlpkg
|
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -rf $(BUILD_DIRS)/* $(BUILD_DIRS)/.stamps
|
rm -rf $(BUILD_DIRS)/* $(BUILD_DIRS)/.stamps
|
||||||
|
|
||||||
|
|||||||
@@ -136,7 +136,7 @@ safe_remove() {
|
|||||||
|
|
||||||
[ -z "${path}" ] && return 0
|
[ -z "${path}" ] && return 0
|
||||||
|
|
||||||
if [ -f "${path}" -o -d "${path}" ]; then
|
if [ -e "${path}" -o -L "${path}" ]; then
|
||||||
rm -r "${path}"
|
rm -r "${path}"
|
||||||
elif [ -n "${PKG_NAME}" ]; then
|
elif [ -n "${PKG_NAME}" ]; then
|
||||||
print_color CLR_WARNING "safe_remove: path does not exist: [${PKG_NAME}]: ${path}\n"
|
print_color CLR_WARNING "safe_remove: path does not exist: [${PKG_NAME}]: ${path}\n"
|
||||||
@@ -242,12 +242,12 @@ setup_toolchain() {
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
# parallel
|
# parallel
|
||||||
if ! flag_enabled "parallel" "yes"; then
|
if flag_enabled "parallel" "yes"; then
|
||||||
NINJA_OPTS="$NINJA_OPTS -j1"
|
|
||||||
export MAKEFLAGS="-j1"
|
|
||||||
else
|
|
||||||
NINJA_OPTS="$NINJA_OPTS -j$CONCURRENCY_MAKE_LEVEL"
|
NINJA_OPTS="$NINJA_OPTS -j$CONCURRENCY_MAKE_LEVEL"
|
||||||
export MAKEFLAGS="-j$CONCURRENCY_MAKE_LEVEL"
|
export MAKEFLAGS="-j$CONCURRENCY_MAKE_LEVEL"
|
||||||
|
else
|
||||||
|
NINJA_OPTS="$NINJA_OPTS -j1"
|
||||||
|
export MAKEFLAGS="-j1"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# verbose flag
|
# verbose flag
|
||||||
@@ -357,11 +357,9 @@ setup_toolchain() {
|
|||||||
create_meson_conf() {
|
create_meson_conf() {
|
||||||
local endian root properties
|
local endian root properties
|
||||||
case "$1" in
|
case "$1" in
|
||||||
target|init) endian="little"
|
target|init) root="$SYSROOT_PREFIX/usr"
|
||||||
root="$SYSROOT_PREFIX/usr"
|
|
||||||
;;
|
;;
|
||||||
host|bootstrap) endian="big"
|
host|bootstrap) root="$TOOLCHAIN"
|
||||||
root="$TOOLCHAIN"
|
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
@@ -380,12 +378,14 @@ llvm-config = '$SYSROOT_PREFIX/usr/bin/llvm-config-host'
|
|||||||
system = 'linux'
|
system = 'linux'
|
||||||
cpu_family = '$TARGET_ARCH'
|
cpu_family = '$TARGET_ARCH'
|
||||||
cpu = '$TARGET_SUBARCH'
|
cpu = '$TARGET_SUBARCH'
|
||||||
endian = '$endian'
|
endian = 'little'
|
||||||
|
|
||||||
[properties]
|
[properties]
|
||||||
root = '$root'
|
root = '$root'
|
||||||
$(python -c "import os; print('c_args = {}'.format([x for x in os.getenv('CFLAGS').split()]))")
|
$(python -c "import os; print('c_args = {}'.format([x for x in os.getenv('CFLAGS').split()]))")
|
||||||
$(python -c "import os; print('c_link_args = {}'.format([x for x in os.getenv('LDFLAGS').split()]))")
|
$(python -c "import os; print('c_link_args = {}'.format([x for x in os.getenv('LDFLAGS').split()]))")
|
||||||
|
$(python -c "import os; print('cpp_args = {}'.format([x for x in os.getenv('CXXFLAGS').split()]))")
|
||||||
|
$(python -c "import os; print('cpp_link_args = {}'.format([x for x in os.getenv('LDFLAGS').split()]))")
|
||||||
${!properties}
|
${!properties}
|
||||||
EOF
|
EOF
|
||||||
}
|
}
|
||||||
@@ -714,7 +714,7 @@ get_pkg_variable() {
|
|||||||
|
|
||||||
# get package's build dir
|
# get package's build dir
|
||||||
get_build_dir() {
|
get_build_dir() {
|
||||||
local _PKG_NAME="$(get_pkg_variable "$1" PKG_NAME)" _PKG_VERSION="$(get_pkg_version "$1")"
|
local _PKG_NAME="${1%:*}" _PKG_VERSION="$(get_pkg_version "$1")"
|
||||||
if [ -n "$_PKG_NAME" -a -n "$_PKG_VERSION" ]; then
|
if [ -n "$_PKG_NAME" -a -n "$_PKG_VERSION" ]; then
|
||||||
echo $BUILD/${_PKG_NAME}-${_PKG_VERSION}
|
echo $BUILD/${_PKG_NAME}-${_PKG_VERSION}
|
||||||
fi
|
fi
|
||||||
@@ -989,8 +989,10 @@ kernel_config_path() {
|
|||||||
$pkg_linux_dir/config/$config_name \
|
$pkg_linux_dir/config/$config_name \
|
||||||
; do
|
; do
|
||||||
[[ $cfg =~ /devices//linux/ ]] && continue
|
[[ $cfg =~ /devices//linux/ ]] && continue
|
||||||
[ -f "$cfg" ] && echo "$cfg" && break
|
[ -f "$cfg" ] && echo "$cfg" && return
|
||||||
done
|
done
|
||||||
|
|
||||||
|
die "ERROR: Unable to locate kernel config for ${LINUX} - looking for ${config_name}"
|
||||||
}
|
}
|
||||||
|
|
||||||
kernel_make() {
|
kernel_make() {
|
||||||
@@ -1155,6 +1157,8 @@ done
|
|||||||
}
|
}
|
||||||
|
|
||||||
install_addon_files() {
|
install_addon_files() {
|
||||||
|
mkdir -p "$1"
|
||||||
|
|
||||||
install_addon_source "$1"
|
install_addon_source "$1"
|
||||||
install_addon_images "$1"
|
install_addon_images "$1"
|
||||||
create_addon_xml "$1"
|
create_addon_xml "$1"
|
||||||
@@ -1190,7 +1194,7 @@ add_user() {
|
|||||||
|
|
||||||
mkdir -p ${INSTALL}/usr/cache
|
mkdir -p ${INSTALL}/usr/cache
|
||||||
touch ${INSTALL}/usr/cache/shadow
|
touch ${INSTALL}/usr/cache/shadow
|
||||||
ln -sf /storage/.cache/shadow ${INSTALL}/etc/shadow
|
ln -sf /storage/.cache/shadow ${INSTALL}/etc/shadow 2>/dev/null || true
|
||||||
|
|
||||||
PASSWORD="$2"
|
PASSWORD="$2"
|
||||||
if [ "$PASSWORD" = "x" ]; then
|
if [ "$PASSWORD" = "x" ]; then
|
||||||
@@ -1235,6 +1239,8 @@ enable_service() {
|
|||||||
|
|
||||||
|
|
||||||
### MULTI-THREADED FUNCTION HELPERS ###
|
### MULTI-THREADED FUNCTION HELPERS ###
|
||||||
|
# Test MTWITHLOCKS so that these functions are a no-op during non-multithreaded builds.
|
||||||
|
|
||||||
# Prevent concurrent modifications to a package (unpack) or
|
# Prevent concurrent modifications to a package (unpack) or
|
||||||
# package:target (install/build).
|
# package:target (install/build).
|
||||||
#
|
#
|
||||||
@@ -1245,7 +1251,7 @@ pkg_lock() {
|
|||||||
|
|
||||||
local pkg="$1" task="$2" parent_pkg="$3"
|
local pkg="$1" task="$2" parent_pkg="$3"
|
||||||
local this_job="${MTJOBID}"
|
local this_job="${MTJOBID}"
|
||||||
local lock_job lock_seq lock_task lock_pkg locked=no
|
local lock_job lock_seq lock_task lock_pkg locked=no idwidth
|
||||||
local fail_seq
|
local fail_seq
|
||||||
|
|
||||||
exec 98>"${THREAD_CONTROL}/locks/${pkg}.${task}"
|
exec 98>"${THREAD_CONTROL}/locks/${pkg}.${task}"
|
||||||
@@ -1256,13 +1262,14 @@ pkg_lock() {
|
|||||||
done
|
done
|
||||||
|
|
||||||
if [ "${locked}" = "no" -a "${lock_job}/${lock_seq}" != "${this_job}/${PARALLEL_SEQ}" ]; then
|
if [ "${locked}" = "no" -a "${lock_job}/${lock_seq}" != "${this_job}/${PARALLEL_SEQ}" ]; then
|
||||||
pkg_lock_status "STALLED" "${parent_pkg}" "${task}" "$(printf "waiting on [%02d] %s %s" ${lock_job} "${lock_task}" "${lock_pkg}")"
|
[ "${THREADCOUNT}" = "0" ] && idwidth=${#MTMAXJOBS} || idwidth=2
|
||||||
|
pkg_lock_status "STALLED" "${parent_pkg}" "${task}" "$(printf "waiting on [%0*d] %s %s" ${idwidth} ${lock_job} "${lock_task}" "${lock_pkg}")"
|
||||||
flock --exclusive 98
|
flock --exclusive 98
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# As we now have the lock, if .failed still exists then a previous process must have failed
|
# As we now have the lock, if .failed still exists then a previous process must have failed
|
||||||
if [ -f "${THREAD_CONTROL}/locks/${pkg}.${task}.failed" ]; then
|
if [ -f "${THREAD_CONTROL}/locks/${pkg}.${task}.failed" ]; then
|
||||||
fail_seq="$(cat "${THREAD_CONTROL}/locks/${pkg}.${task}.failed")"
|
fail_seq="$(< "${THREAD_CONTROL}/locks/${pkg}.${task}.failed")"
|
||||||
print_color CLR_ERROR "FAILURE: ${pkg}.${task}.failed exists, a previous dependency process has failed (seq: ${fail_seq})\n"
|
print_color CLR_ERROR "FAILURE: ${pkg}.${task}.failed exists, a previous dependency process has failed (seq: ${fail_seq})\n"
|
||||||
if [ -d "${THREAD_CONTROL}/logs" ]; then
|
if [ -d "${THREAD_CONTROL}/logs" ]; then
|
||||||
cat <<EOF
|
cat <<EOF
|
||||||
@@ -1284,13 +1291,15 @@ pkg_lock_status() {
|
|||||||
[ "${MTWITHLOCKS}" != "yes" ] && return 0
|
[ "${MTWITHLOCKS}" != "yes" ] && return 0
|
||||||
|
|
||||||
local status="$1" pkg="$2" task="$3" msg="$4"
|
local status="$1" pkg="$2" task="$3" msg="$4"
|
||||||
local this_job="${MTJOBID}" line
|
local this_job="${MTJOBID}" line idwidth
|
||||||
|
|
||||||
|
[ "${THREADCOUNT}" = "0" ] && idwidth=${#MTMAXJOBS} || idwidth=2
|
||||||
|
|
||||||
(
|
(
|
||||||
flock --exclusive 94
|
flock --exclusive 94
|
||||||
|
|
||||||
printf -v line "%s: <%05d> [%02d/%0*d] %-7s %-7s %-35s" \
|
printf -v line "%s: <%06d> [%0*d/%0*d] %-7s %-7s %-35s" \
|
||||||
"$(date +%Y-%m-%d\ %H:%M:%S.%N)" $$ ${this_job} ${#MTMAXJOBS} ${PARALLEL_SEQ:-0} "${status}" "${task}" "${pkg}"
|
"$(date +%Y-%m-%d\ %H:%M:%S.%N)" $$ ${idwidth} ${this_job} ${#MTMAXJOBS} ${PARALLEL_SEQ:-0} "${status}" "${task}" "${pkg}"
|
||||||
[ -n "${msg}" ] && line+=" (${msg})"
|
[ -n "${msg}" ] && line+=" (${msg})"
|
||||||
|
|
||||||
echo "${line}" >>"${THREAD_CONTROL}/history"
|
echo "${line}" >>"${THREAD_CONTROL}/history"
|
||||||
@@ -1316,19 +1325,25 @@ update_dashboard() {
|
|||||||
|
|
||||||
local status="$1" pkg="$2" task="$3" msg="$4"
|
local status="$1" pkg="$2" task="$3" msg="$4"
|
||||||
local line sedline preamble num elapsed projdevarch
|
local line sedline preamble num elapsed projdevarch
|
||||||
local boldred boldgreen boldyellow endcolor
|
local boldred boldgreen boldyellow endcolor idwidth
|
||||||
|
|
||||||
sedline=$((MTJOBID + 2))
|
sedline=$((MTJOBID + 2))
|
||||||
|
|
||||||
num=$(cat "${THREAD_CONTROL}/status" | wc -l)
|
[ "${THREADCOUNT}" = "0" ] && idwidth=${#MTMAXJOBS} || idwidth=2
|
||||||
while [ ${num} -lt ${sedline} ]; do echo "" >>"${THREAD_CONTROL}/status"; num=$((num + 1)); done
|
|
||||||
|
|
||||||
num=$(($(cat "${THREAD_CONTROL}/progress.prev") + 1))
|
num=$(< "${THREAD_CONTROL}/status.max")
|
||||||
|
if [ ${num} -lt ${sedline} ]; then
|
||||||
|
echo ${sedline} >"${THREAD_CONTROL}/status.max"
|
||||||
|
for i in $(seq $((num + 1)) ${sedline}); do echo "" >>"${THREAD_CONTROL}/status"; done
|
||||||
|
fi
|
||||||
|
|
||||||
|
num=$(< "${THREAD_CONTROL}/progress.prev")
|
||||||
projdevarch="${PROJECT}/"
|
projdevarch="${PROJECT}/"
|
||||||
[ -n "${DEVICE}" ] && projdevarch+="${DEVICE}/"
|
[ -n "${DEVICE}" ] && projdevarch+="${DEVICE}/"
|
||||||
projdevarch+="${TARGET_ARCH}"
|
projdevarch+="${TARGET_ARCH}"
|
||||||
|
[ -n "${BUILD_SUFFIX}" ] && projdevarch+=", ${BUILD_SUFFIX}"
|
||||||
TZ=UTC0 printf -v elapsed "%(%H:%M:%S)T" $(($(date +%s) - MTBUILDSTART))
|
TZ=UTC0 printf -v elapsed "%(%H:%M:%S)T" $(($(date +%s) - MTBUILDSTART))
|
||||||
printf -v preamble "%s Dashboard (%s) - %d of %d jobs completed, %s elapsed" "${DISTRONAME}" "${projdevarch}" ${num} ${MTMAXJOBS} "${elapsed}"
|
printf -v preamble "%s Dashboard (%s) - %d of %d jobs completed, %s elapsed" "${DISTRONAME}" "${projdevarch}" $((num + 1)) ${MTMAXJOBS} "${elapsed}"
|
||||||
printf -v preamble "%b%-105s %s" "\e[2J\e[0;0H" "${preamble//\//\\/}" "$(date "+%Y-%m-%d %H:%M:%S")"
|
printf -v preamble "%b%-105s %s" "\e[2J\e[0;0H" "${preamble//\//\\/}" "$(date "+%Y-%m-%d %H:%M:%S")"
|
||||||
|
|
||||||
if [ "${DISABLE_COLORS}" != "yes" ]; then
|
if [ "${DISABLE_COLORS}" != "yes" ]; then
|
||||||
@@ -1347,7 +1362,7 @@ update_dashboard() {
|
|||||||
esac
|
esac
|
||||||
fi
|
fi
|
||||||
|
|
||||||
printf -v line "[%02d\/%0*d] %b%-7s%b %-7s %-35s" ${MTJOBID} ${#MTMAXJOBS} ${PARALLEL_SEQ:-0} "${color}" "${status//\//\\/}" "${endcolor}" "${task}" "${pkg}"
|
printf -v line "[%0*d\/%0*d] %b%-7s%b %-7s %-35s" ${idwidth} ${MTJOBID} ${#MTMAXJOBS} ${PARALLEL_SEQ:-0} "${color}" "${status//\//\\/}" "${endcolor}" "${task}" "${pkg}"
|
||||||
[ -n "${msg}" ] && line+=" ${msg//\//\\/}"
|
[ -n "${msg}" ] && line+=" ${msg//\//\\/}"
|
||||||
|
|
||||||
sed -e "1s/.*/${preamble}/;${sedline}s/.*/${line}/" -i "${THREAD_CONTROL}/status"
|
sed -e "1s/.*/${preamble}/;${sedline}s/.*/${line}/" -i "${THREAD_CONTROL}/status"
|
||||||
@@ -1355,13 +1370,12 @@ update_dashboard() {
|
|||||||
|
|
||||||
# Thread concurrency helpers to avoid concurrency issues with some code,
|
# Thread concurrency helpers to avoid concurrency issues with some code,
|
||||||
# eg. when Python installs directly into $TOOLCHAIN.
|
# eg. when Python installs directly into $TOOLCHAIN.
|
||||||
# Test MTJOBID so that these functions are a no-op during non-multithreaded builds.
|
|
||||||
acquire_exclusive_lock() {
|
acquire_exclusive_lock() {
|
||||||
[ "${MTWITHLOCKS}" != "yes" ] && return 0
|
[ "${MTWITHLOCKS}" != "yes" ] && return 0
|
||||||
|
|
||||||
local pkg="$1" task="$2" lockfile="${3:-global}"
|
local pkg="$1" task="$2" lockfile="${3:-global}"
|
||||||
local this_job="${MTJOBID}"
|
local this_job="${MTJOBID}"
|
||||||
local lock_job lock_seq lock_task lock_pkg locked=no
|
local lock_job lock_seq lock_task lock_pkg locked=no idwidth
|
||||||
|
|
||||||
exec 96>"${THREAD_CONTROL}/locks/.mutex.${lockfile}"
|
exec 96>"${THREAD_CONTROL}/locks/.mutex.${lockfile}"
|
||||||
while [ : ]; do
|
while [ : ]; do
|
||||||
@@ -1371,7 +1385,8 @@ acquire_exclusive_lock() {
|
|||||||
done
|
done
|
||||||
|
|
||||||
if [ "${locked}" = "no" -a "${lock_job}/${lock_seq}" != "${this_job}/${PARALLEL_SEQ}" ]; then
|
if [ "${locked}" = "no" -a "${lock_job}/${lock_seq}" != "${this_job}/${PARALLEL_SEQ}" ]; then
|
||||||
pkg_lock_status "MUTEX/W" "${pkg}" "${task}" "$(printf "mutex: %s; waiting on [%02d] %s %s" "${lockfile}" ${lock_job} "${lock_task}" "${lock_pkg}")"
|
[ "${THREADCOUNT}" = "0" ] && idwidth=${#MTMAXJOBS} || idwidth=2
|
||||||
|
pkg_lock_status "MUTEX/W" "${pkg}" "${task}" "$(printf "mutex: %s; waiting on [%0*d] %s %s" "${lockfile}" ${idwidth} ${lock_job} "${lock_task}" "${lock_pkg}")"
|
||||||
flock --exclusive 96
|
flock --exclusive 96
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|||||||
@@ -107,7 +107,7 @@ get_graphicdrivers() {
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
if listcontains "${GRAPHIC_DRIVERS}" "vc4"; then
|
if listcontains "${GRAPHIC_DRIVERS}" "vc4"; then
|
||||||
GALLIUM_DRIVERS+=" vc4"
|
GALLIUM_DRIVERS+=" vc4 v3d kmsro"
|
||||||
V4L2_SUPPORT="yes"
|
V4L2_SUPPORT="yes"
|
||||||
VAAPI_SUPPORT="no"
|
VAAPI_SUPPORT="no"
|
||||||
VDPAU_SUPPORT="no"
|
VDPAU_SUPPORT="no"
|
||||||
|
|||||||
@@ -66,33 +66,7 @@ package_worker() {
|
|||||||
|
|
||||||
if [ "${isaddon}" = "yes" -a "${istarget}" = "yes" ]; then
|
if [ "${isaddon}" = "yes" -a "${istarget}" = "yes" ]; then
|
||||||
if [ ${result} -eq 0 ]; then
|
if [ ${result} -eq 0 ]; then
|
||||||
(
|
${SCRIPTS}/install_addon ${pkgname} 2>&1 && result=0 || result=1
|
||||||
pkg_lock "${pkgname}" "packadd"
|
|
||||||
pkg_lock_status "ACTIVE" "${pkgname}" "packadd"
|
|
||||||
|
|
||||||
# cleanup old install path
|
|
||||||
rm -rf "${ADDON_BUILD}"
|
|
||||||
|
|
||||||
# install addon parts
|
|
||||||
if pkg_call_exists addon; then
|
|
||||||
pkg_call addon
|
|
||||||
else
|
|
||||||
install_binary_addon "${PKG_ADDON_ID}"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# HACK for packages that provide multiple addons like screensavers.rsxs
|
|
||||||
# addon's addon() in package.mk should take care for exporting
|
|
||||||
# MULTI_ADDONS="addon.boo1 addon.boo2 addon.boo3"
|
|
||||||
if [ -n "${MULTI_ADDONS}" ] ; then
|
|
||||||
for addon in ${MULTI_ADDONS}; do
|
|
||||||
${SCRIPTS}/install_addon "${PKG_NAME}" "${addon}"
|
|
||||||
done
|
|
||||||
else
|
|
||||||
${SCRIPTS}/install_addon "${PKG_NAME}" "${PKG_ADDON_ID}"
|
|
||||||
fi
|
|
||||||
|
|
||||||
pkg_lock_status "UNLOCK" "${pkgname}" "packadd" "packed"
|
|
||||||
) 2>&1 || result=1
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ ${result} -ne 0 ]; then
|
if [ ${result} -ne 0 ]; then
|
||||||
@@ -107,8 +81,9 @@ package_worker() {
|
|||||||
(
|
(
|
||||||
flock --exclusive 95
|
flock --exclusive 95
|
||||||
[ ${result} -eq 0 ] && status="DONE" || status="FAIL"
|
[ ${result} -eq 0 ] && status="DONE" || status="FAIL"
|
||||||
num=$(($(cat "${THREAD_CONTROL}/progress") + 1))
|
num=$(< "${THREAD_CONTROL}/progress")
|
||||||
mv "${THREAD_CONTROL}/progress" "${THREAD_CONTROL}/progress.prev"
|
mv "${THREAD_CONTROL}/progress" "${THREAD_CONTROL}/progress.prev"
|
||||||
|
num=$((num + 1))
|
||||||
echo ${num} >"${THREAD_CONTROL}/progress"
|
echo ${num} >"${THREAD_CONTROL}/progress"
|
||||||
printf "[%0*d/%0*d] [%-4s] %-7s %s\n" ${#jobs} ${num} ${#jobs} ${jobs} "${status}" "${task}" "${pkgname}" >&2
|
printf "[%0*d/%0*d] [%-4s] %-7s %s\n" ${#jobs} ${num} ${#jobs} ${jobs} "${status}" "${task}" "${pkgname}" >&2
|
||||||
) 95>"${THREAD_CONTROL}/locks/.progress"
|
) 95>"${THREAD_CONTROL}/locks/.progress"
|
||||||
@@ -143,17 +118,19 @@ start_multithread_build() {
|
|||||||
mkdir -p "${THREAD_CONTROL}/locks"
|
mkdir -p "${THREAD_CONTROL}/locks"
|
||||||
echo -1 >"${THREAD_CONTROL}/progress.prev"
|
echo -1 >"${THREAD_CONTROL}/progress.prev"
|
||||||
echo 0 >"${THREAD_CONTROL}/progress"
|
echo 0 >"${THREAD_CONTROL}/progress"
|
||||||
|
echo 0 >"${THREAD_CONTROL}/status.max"
|
||||||
touch "${THREAD_CONTROL}/status"
|
touch "${THREAD_CONTROL}/status"
|
||||||
|
|
||||||
[ "${THREADCOUNT}" = "0" ] && THREADCOUNT=1
|
# Increase file descriptors if building one thread/package
|
||||||
|
[ "${THREADCOUNT}" = "0" ] && ulimit -n ${ULIMITN:-10240}
|
||||||
|
|
||||||
# Bootstrap GNU parallel
|
# Bootstrap GNU parallel
|
||||||
$SCRIPTS/build parallel:host 2>&1 || die "Unable to bootstrap parallel package"
|
MTWITHLOCKS=no $SCRIPTS/build parallel:host 2>&1 || die "Unable to bootstrap parallel package"
|
||||||
|
|
||||||
# if number of detected slots is 1 then don't bother using inter-process locks as this is a sequential build
|
# determine number of available slots for the given THREADCOUNT - optimise logging for single threaded builds
|
||||||
[ $(seq 1 32 | ${TOOLCHAIN}/bin/parallel --plain --no-notice --max-procs ${THREADCOUNT} echo {%} | sort -n | tail -1) -eq 1 ] && singlethread=yes || singlethread=no
|
[ $(seq 1 32 | ${TOOLCHAIN}/bin/parallel --plain --no-notice --max-procs ${THREADCOUNT} echo {%} | sort -n | tail -1) -eq 1 ] && singlethread=yes || singlethread=no
|
||||||
|
|
||||||
# create a single log file by default if not using locks (single build process), or the builder is a masochist
|
# create a single log file by default for a single threaded build (or the builder is a masochist)
|
||||||
if [ "${singlethread}" = "yes" -a "${ONELOG,,}" != "no" ] || [ "${ONELOG,,}" = "yes" ]; then
|
if [ "${singlethread}" = "yes" -a "${ONELOG,,}" != "no" ] || [ "${ONELOG,,}" = "yes" ]; then
|
||||||
buildopts+=" --ungroup"
|
buildopts+=" --ungroup"
|
||||||
else
|
else
|
||||||
@@ -172,6 +149,8 @@ start_multithread_build() {
|
|||||||
${SCRIPTS}/genbuildplan.py --no-reorder --show-wants --build ${@} > "${THREAD_CONTROL}"/plan || result=1
|
${SCRIPTS}/genbuildplan.py --no-reorder --show-wants --build ${@} > "${THREAD_CONTROL}"/plan || result=1
|
||||||
|
|
||||||
if [ ${result} -eq 0 ]; then
|
if [ ${result} -eq 0 ]; then
|
||||||
|
save_build_config
|
||||||
|
|
||||||
cat "${THREAD_CONTROL}"/plan | awk '{print $1 " " $2}' | \
|
cat "${THREAD_CONTROL}"/plan | awk '{print $1 " " $2}' | \
|
||||||
MTBUILDSTART=$(date +%s) MTWITHLOCKS=yes ${TOOLCHAIN}/bin/parallel \
|
MTBUILDSTART=$(date +%s) MTWITHLOCKS=yes ${TOOLCHAIN}/bin/parallel \
|
||||||
--plain --no-notice --max-procs ${THREADCOUNT} --joblog="${THREAD_CONTROL}/joblog" --plus ${buildopts} \
|
--plain --no-notice --max-procs ${THREADCOUNT} --joblog="${THREAD_CONTROL}/joblog" --plus ${buildopts} \
|
||||||
|
|||||||
@@ -6,6 +6,6 @@
|
|||||||
"description": "@DESCRIPTION@",
|
"description": "@DESCRIPTION@",
|
||||||
"username": "root",
|
"username": "root",
|
||||||
"password": "@ROOT_PASSWORD@",
|
"password": "@ROOT_PASSWORD@",
|
||||||
"supported_models": [@NOOBS_SUPPORTED_MODELS@],
|
"supported_hex_revisions": "@NOOBS_HEX@",
|
||||||
"supported_hex_revisions": "@NOOBS_HEX@"
|
"supported_models": [@NOOBS_SUPPORTED_MODELS@]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,6 +6,8 @@ fi
|
|||||||
|
|
||||||
# Spaces in paths are verboten
|
# Spaces in paths are verboten
|
||||||
if [[ ${PWD} =~ [[:space:]] ]]; then
|
if [[ ${PWD} =~ [[:space:]] ]]; then
|
||||||
|
echo "Current PWD: \"${PWD}\"" 1>&2
|
||||||
|
echo 1>&2
|
||||||
echo "Building in a folder that includes spaces is NOT supported. Use a folder without spaces." 1>&2
|
echo "Building in a folder that includes spaces is NOT supported. Use a folder without spaces." 1>&2
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
@@ -84,7 +86,12 @@ VERBOSE="${VERBOSE:-yes}"
|
|||||||
# directory.
|
# directory.
|
||||||
CCACHE_CACHE_SIZE="10G"
|
CCACHE_CACHE_SIZE="10G"
|
||||||
|
|
||||||
# read options from $HOME if available
|
# read local persistent options from $ROOT if available
|
||||||
|
if [ -f "${ROOT}/.libreelec/options" ]; then
|
||||||
|
. "${ROOT}/.libreelec/options"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# read global persistent options from $HOME if available
|
||||||
if [ -f "${HOME}/.libreelec/options" ]; then
|
if [ -f "${HOME}/.libreelec/options" ]; then
|
||||||
. "${HOME}/.libreelec/options"
|
. "${HOME}/.libreelec/options"
|
||||||
fi
|
fi
|
||||||
|
|||||||
@@ -53,7 +53,6 @@ show_config() {
|
|||||||
config_message="$config_message\n $dashes$dashes"
|
config_message="$config_message\n $dashes$dashes"
|
||||||
|
|
||||||
config_message="$config_message\n - Remote support:\t\t\t $REMOTE_SUPPORT"
|
config_message="$config_message\n - Remote support:\t\t\t $REMOTE_SUPPORT"
|
||||||
config_message="$config_message\n - ATV Remote support:\t\t\t $ATVCLIENT_SUPPORT"
|
|
||||||
config_message="$config_message\n - CEC Adapter support:\t\t\t $CEC_SUPPORT"
|
config_message="$config_message\n - CEC Adapter support:\t\t\t $CEC_SUPPORT"
|
||||||
config_message="$config_message\n - CEC Framework support:\t\t $CEC_FRAMEWORK_SUPPORT"
|
config_message="$config_message\n - CEC Framework support:\t\t $CEC_FRAMEWORK_SUPPORT"
|
||||||
config_message="$config_message\n - Kodi Joystick support:\t\t $JOYSTICK_SUPPORT"
|
config_message="$config_message\n - Kodi Joystick support:\t\t $JOYSTICK_SUPPORT"
|
||||||
@@ -96,6 +95,7 @@ show_config() {
|
|||||||
config_message="$config_message\n - SAMBA server support:\t\t $SAMBA_SERVER"
|
config_message="$config_message\n - SAMBA server support:\t\t $SAMBA_SERVER"
|
||||||
config_message="$config_message\n - SFTP server support:\t\t\t $SFTP_SERVER"
|
config_message="$config_message\n - SFTP server support:\t\t\t $SFTP_SERVER"
|
||||||
config_message="$config_message\n - OpenVPN support:\t\t\t $OPENVPN_SUPPORT"
|
config_message="$config_message\n - OpenVPN support:\t\t\t $OPENVPN_SUPPORT"
|
||||||
|
config_message="$config_message\n - WireGuard support:\t\t\t $WIREGUARD_SUPPORT"
|
||||||
|
|
||||||
# OS configuration
|
# OS configuration
|
||||||
|
|
||||||
@@ -105,10 +105,6 @@ show_config() {
|
|||||||
config_message="$config_message\n - OEM Support:\t\t\t\t $OEM_SUPPORT"
|
config_message="$config_message\n - OEM Support:\t\t\t\t $OEM_SUPPORT"
|
||||||
config_message="$config_message\n - Default ROOT Password:\t\t $ROOT_PASSWORD"
|
config_message="$config_message\n - Default ROOT Password:\t\t $ROOT_PASSWORD"
|
||||||
config_message="$config_message\n - Bootloader:\t\t\t\t $BOOTLOADER"
|
config_message="$config_message\n - Bootloader:\t\t\t\t $BOOTLOADER"
|
||||||
if [ "$BOOTLOADER" = "u-boot" ]; then
|
|
||||||
config_message="$config_message\n - U-Boot configuration:\t\t $UBOOT_CONFIG"
|
|
||||||
config_message="$config_message\n - U-Boot config file:\t\t $UBOOT_CONFIGFILE"
|
|
||||||
fi
|
|
||||||
config_message="$config_message\n - UDevil support:\t\t\t $UDEVIL"
|
config_message="$config_message\n - UDevil support:\t\t\t $UDEVIL"
|
||||||
config_message="$config_message\n - Installer support:\t\t\t $INSTALLER_SUPPORT"
|
config_message="$config_message\n - Installer support:\t\t\t $INSTALLER_SUPPORT"
|
||||||
for config_package in $ADDITIONAL_PACKAGES; do
|
for config_package in $ADDITIONAL_PACKAGES; do
|
||||||
|
|||||||
@@ -115,6 +115,9 @@
|
|||||||
# build and install OpenVPN support (yes / no)
|
# build and install OpenVPN support (yes / no)
|
||||||
OPENVPN_SUPPORT="yes"
|
OPENVPN_SUPPORT="yes"
|
||||||
|
|
||||||
|
# build and install WireGuard support (yes / no)
|
||||||
|
WIREGUARD_SUPPORT="yes"
|
||||||
|
|
||||||
# build and install diskmounter support (udevil)
|
# build and install diskmounter support (udevil)
|
||||||
# this service provide auto mounting support for external drives in the
|
# this service provide auto mounting support for external drives in the
|
||||||
# mediacenter also automount internally drives at boottime via udev (yes / no)
|
# mediacenter also automount internally drives at boottime via udev (yes / no)
|
||||||
@@ -140,9 +143,6 @@
|
|||||||
# build and install remote support (yes / no)
|
# build and install remote support (yes / no)
|
||||||
REMOTE_SUPPORT="yes"
|
REMOTE_SUPPORT="yes"
|
||||||
|
|
||||||
# build and install ATV IR remote support (yes / no)
|
|
||||||
ATVCLIENT_SUPPORT="yes"
|
|
||||||
|
|
||||||
# build and install Joystick support (yes / no)
|
# build and install Joystick support (yes / no)
|
||||||
JOYSTICK_SUPPORT="yes"
|
JOYSTICK_SUPPORT="yes"
|
||||||
|
|
||||||
@@ -225,3 +225,5 @@
|
|||||||
# IR remote keymaps supported in default config
|
# IR remote keymaps supported in default config
|
||||||
IR_REMOTE_KEYMAPS="rc6_mce xbox_360 xbox_one"
|
IR_REMOTE_KEYMAPS="rc6_mce xbox_360 xbox_one"
|
||||||
|
|
||||||
|
# debug tty path
|
||||||
|
DEBUG_TTY="/dev/tty3"
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
LIBREELEC_VERSION="devel"
|
LIBREELEC_VERSION="devel"
|
||||||
|
|
||||||
# OS_VERSION: OS Version
|
# OS_VERSION: OS Version
|
||||||
OS_VERSION="9.1"
|
OS_VERSION="9.2"
|
||||||
|
|
||||||
# ADDON_VERSION: Addon version
|
# ADDON_VERSION: Addon version
|
||||||
ADDON_VERSION="9.1"
|
ADDON_VERSION="9.2.0"
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ PKG_SHA256="d007f89ae8a2543a53525c74359b65b36412fa84b3349f1400be6dcf409fafef"
|
|||||||
PKG_LICENSE="Custom"
|
PKG_LICENSE="Custom"
|
||||||
PKG_SITE="http://www.icu-project.org"
|
PKG_SITE="http://www.icu-project.org"
|
||||||
PKG_URL="http://download.icu-project.org/files/icu4c/${PKG_VERSION}/icu4c-${PKG_VERSION//./_}-src.tgz"
|
PKG_URL="http://download.icu-project.org/files/icu4c/${PKG_VERSION}/icu4c-${PKG_VERSION//./_}-src.tgz"
|
||||||
|
PKG_DEPENDS_HOST="gcc:host"
|
||||||
PKG_DEPENDS_TARGET="toolchain icu:host"
|
PKG_DEPENDS_TARGET="toolchain icu:host"
|
||||||
PKG_LONGDESC="International Components for Unicode library."
|
PKG_LONGDESC="International Components for Unicode library."
|
||||||
|
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ PKG_SHA256="5c0133ec4e228e41bdf52f726d271a2d821499c2ab97afd3aa3d6cf43efcdc83"
|
|||||||
PKG_LICENSE="GPL2"
|
PKG_LICENSE="GPL2"
|
||||||
PKG_SITE="https://freedesktop.org/wiki/Software/shared-mime-info/"
|
PKG_SITE="https://freedesktop.org/wiki/Software/shared-mime-info/"
|
||||||
PKG_URL="http://freedesktop.org/~hadess/shared-mime-info-$PKG_VERSION.tar.xz"
|
PKG_URL="http://freedesktop.org/~hadess/shared-mime-info-$PKG_VERSION.tar.xz"
|
||||||
PKG_DEPENDS_TARGET="toolchain libxml2"
|
PKG_DEPENDS_TARGET="toolchain glib libxml2"
|
||||||
PKG_LONGDESC="The shared-mime-info package contains the core database of common types."
|
PKG_LONGDESC="The shared-mime-info package contains the core database of common types."
|
||||||
PKG_BUILD_FLAGS="-parallel"
|
PKG_BUILD_FLAGS="-parallel"
|
||||||
|
|
||||||
|
|||||||
@@ -2,17 +2,17 @@
|
|||||||
# Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv)
|
# Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv)
|
||||||
|
|
||||||
PKG_NAME="comskip"
|
PKG_NAME="comskip"
|
||||||
PKG_VERSION="6030aa0d3b589161ec96c6c986c48aa826fb9f72"
|
PKG_VERSION="84fcd7388394c95fc8a7e558642bbadb43134507"
|
||||||
PKG_SHA256="df0b4b0354aef5acc17e4e94a20a396fa69c474af7579c94aad09dd490e0ee38"
|
PKG_SHA256="4d45d30335ce1c28fb4de8865ada57f81de18d83a77950e9ab7c3ea26d24a883"
|
||||||
PKG_LICENSE="GPL"
|
PKG_LICENSE="GPL"
|
||||||
PKG_SITE="http://www.kaashoek.com/comskip/"
|
PKG_SITE="http://www.kaashoek.com/comskip/"
|
||||||
PKG_URL="https://github.com/erikkaashoek/Comskip/archive/${PKG_VERSION}.tar.gz"
|
PKG_URL="https://github.com/erikkaashoek/Comskip/archive/${PKG_VERSION}.tar.gz"
|
||||||
PKG_DEPENDS_TARGET="toolchain argtable2 ffmpeg"
|
PKG_DEPENDS_TARGET="toolchain argtable2 ffmpeg gnutls"
|
||||||
PKG_LONGDESC="Comskip detects commercial breaks from a video stream. It can be used for post-processing recordings."
|
PKG_LONGDESC="Comskip detects commercial breaks from a video stream. It can be used for post-processing recordings."
|
||||||
PKG_TOOLCHAIN="autotools"
|
PKG_TOOLCHAIN="autotools"
|
||||||
|
|
||||||
pre_configure_target() {
|
pre_configure_target() {
|
||||||
LDFLAGS="$LDFLAGS -ldl"
|
LDFLAGS+=" -ldl"
|
||||||
|
|
||||||
export argtable2_CFLAGS="-I$(get_build_dir argtable2)/src"
|
export argtable2_CFLAGS="-I$(get_build_dir argtable2)/src"
|
||||||
export argtable2_LIBS="-L$(get_build_dir argtable2)/src/.libs -largtable2"
|
export argtable2_LIBS="-L$(get_build_dir argtable2)/src/.libs -largtable2"
|
||||||
|
|||||||
@@ -3,8 +3,8 @@
|
|||||||
# Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv)
|
# Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv)
|
||||||
|
|
||||||
PKG_NAME="containerd"
|
PKG_NAME="containerd"
|
||||||
PKG_VERSION="1.2.6"
|
PKG_VERSION="1.2.7"
|
||||||
PKG_SHA256="f2d578b743fb9faa5b3477b7cf4b33d00501087043a53b27754f14bbe741f891"
|
PKG_SHA256="7179c709a0d187708a1eeddcbdecd7206b2c642dc4413bcdb049cd6b38d06801"
|
||||||
PKG_LICENSE="APL"
|
PKG_LICENSE="APL"
|
||||||
PKG_SITE="https://containerd.tools/"
|
PKG_SITE="https://containerd.tools/"
|
||||||
PKG_URL="https://github.com/containerd/containerd/archive/v$PKG_VERSION.tar.gz"
|
PKG_URL="https://github.com/containerd/containerd/archive/v$PKG_VERSION.tar.gz"
|
||||||
|
|||||||
@@ -2,8 +2,8 @@
|
|||||||
# Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv)
|
# Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv)
|
||||||
|
|
||||||
PKG_NAME="krb5"
|
PKG_NAME="krb5"
|
||||||
PKG_VERSION="1.16.2-final"
|
PKG_VERSION="1.17-final"
|
||||||
PKG_SHA256="92f62e5a54404d22aa2a7eee9fba64d1be8d10d8dd3aa052e1799993208acce4"
|
PKG_SHA256="bd170f6aadea5d753cc9a93a3a915a5bde07bd3d294a00651ed647dcf964e867"
|
||||||
PKG_LICENSE="MIT"
|
PKG_LICENSE="MIT"
|
||||||
PKG_SITE="http://web.mit.edu/kerberos/"
|
PKG_SITE="http://web.mit.edu/kerberos/"
|
||||||
PKG_URL="https://github.com/krb5/krb5/archive/krb5-$PKG_VERSION.tar.gz"
|
PKG_URL="https://github.com/krb5/krb5/archive/krb5-$PKG_VERSION.tar.gz"
|
||||||
|
|||||||
@@ -2,8 +2,8 @@
|
|||||||
# Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv)
|
# Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv)
|
||||||
|
|
||||||
PKG_NAME="lttng-ust"
|
PKG_NAME="lttng-ust"
|
||||||
PKG_VERSION="2.10.2"
|
PKG_VERSION="2.10.4"
|
||||||
PKG_SHA256="015452be6f94e4468315d0478cd5a4d01d9e52672bcea122b4ff7426198d5803"
|
PKG_SHA256="9df458fbfeac5a380672751decbd9b57356075acbfe106cb8820e803a94a0d96"
|
||||||
PKG_LICENSE="LGPLv2.1"
|
PKG_LICENSE="LGPLv2.1"
|
||||||
PKG_SITE="https://lttng.org/"
|
PKG_SITE="https://lttng.org/"
|
||||||
PKG_URL="https://github.com/lttng/lttng-ust/archive/v$PKG_VERSION.tar.gz"
|
PKG_URL="https://github.com/lttng/lttng-ust/archive/v$PKG_VERSION.tar.gz"
|
||||||
|
|||||||
@@ -2,8 +2,8 @@
|
|||||||
# Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv)
|
# Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv)
|
||||||
|
|
||||||
PKG_NAME="userspace-rcu"
|
PKG_NAME="userspace-rcu"
|
||||||
PKG_VERSION="0.10.1"
|
PKG_VERSION="0.11.1"
|
||||||
PKG_SHA256="4ddbca9927b459b7a295dec612cf43df5886d398161d50c59d0097995e368a3b"
|
PKG_SHA256="a0ed8995edfbeac5f5eb2f152a8f3654040ecfc99a746bfe3da3bccf435b7d5d"
|
||||||
PKG_LICENSE="LGPLv2.1"
|
PKG_LICENSE="LGPLv2.1"
|
||||||
PKG_SITE="http://liburcu.org"
|
PKG_SITE="http://liburcu.org"
|
||||||
PKG_URL="https://github.com/urcu/userspace-rcu/archive/v$PKG_VERSION.tar.gz"
|
PKG_URL="https://github.com/urcu/userspace-rcu/archive/v$PKG_VERSION.tar.gz"
|
||||||
|
|||||||
@@ -10,14 +10,6 @@ PKG_URL="https://github.com/mighty-p/t2scan/archive/$PKG_VERSION.tar.gz"
|
|||||||
PKG_DEPENDS_TARGET="toolchain"
|
PKG_DEPENDS_TARGET="toolchain"
|
||||||
PKG_LONGDESC="A small channel scan tool which generates DVB-T/T2 channels.conf files."
|
PKG_LONGDESC="A small channel scan tool which generates DVB-T/T2 channels.conf files."
|
||||||
|
|
||||||
# aml 3.14 hack
|
|
||||||
pre_configure_target() {
|
|
||||||
if [ "$LINUX" = "amlogic-3.14" -o "$LINUX" = "amlogic-3.10" ]; then
|
|
||||||
sed -i 's/DVB_HEADER=0/DVB_HEADER=1/g' $PKG_BUILD/configure*
|
|
||||||
sed -i 's/HAS_DVB_API5=0/HAS_DVB_API5=1/g' $PKG_BUILD/configure*
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
makeinstall_target() {
|
makeinstall_target() {
|
||||||
:
|
:
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,14 +11,6 @@ PKG_DEPENDS_TARGET="toolchain"
|
|||||||
PKG_LONGDESC="A channel scan tool which generates ATSC, DVB-C, DVB-S/S2 and DVB-T channels.conf files."
|
PKG_LONGDESC="A channel scan tool which generates ATSC, DVB-C, DVB-S/S2 and DVB-T channels.conf files."
|
||||||
PKG_TOOLCHAIN="autotools"
|
PKG_TOOLCHAIN="autotools"
|
||||||
|
|
||||||
# aml 3.14 hack
|
|
||||||
pre_configure_target() {
|
|
||||||
if [ "$LINUX" = "amlogic-3.14" -o "$LINUX" = "amlogic-3.10" ]; then
|
|
||||||
sed -i 's/DVB_HEADER=0/DVB_HEADER=1/g' $PKG_BUILD/configure*
|
|
||||||
sed -i 's/HAS_DVB_API5=0/HAS_DVB_API5=1/g' $PKG_BUILD/configure*
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
makeinstall_target() {
|
makeinstall_target() {
|
||||||
:
|
:
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,8 +2,8 @@
|
|||||||
# Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv)
|
# Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv)
|
||||||
|
|
||||||
PKG_NAME="imagemagick"
|
PKG_NAME="imagemagick"
|
||||||
PKG_VERSION="7.0.8-11"
|
PKG_VERSION="7.0.8-60"
|
||||||
PKG_SHA256="95e4da5fa109bc8b59b5e7a54cdfcf1af3230067c95adf608ff21c08eca1de20"
|
PKG_SHA256="a0ffa621051aa66b4eec919761d1a741aefea8b993acc2425e3ed5855c540156"
|
||||||
PKG_LICENSE="http://www.imagemagick.org/script/license.php"
|
PKG_LICENSE="http://www.imagemagick.org/script/license.php"
|
||||||
PKG_SITE="http://www.imagemagick.org/"
|
PKG_SITE="http://www.imagemagick.org/"
|
||||||
PKG_URL="https://github.com/ImageMagick/ImageMagick/archive/$PKG_VERSION.tar.gz"
|
PKG_URL="https://github.com/ImageMagick/ImageMagick/archive/$PKG_VERSION.tar.gz"
|
||||||
|
|||||||
@@ -2,8 +2,8 @@
|
|||||||
# Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv)
|
# Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv)
|
||||||
|
|
||||||
PKG_NAME="libvpx"
|
PKG_NAME="libvpx"
|
||||||
PKG_VERSION="1.7.0"
|
PKG_VERSION="1.8.1"
|
||||||
PKG_SHA256="1fec931eb5c94279ad219a5b6e0202358e94a93a90cfb1603578c326abfc1238"
|
PKG_SHA256="df19b8f24758e90640e1ab228ab4a4676ec3df19d23e4593375e6f3847dee03e"
|
||||||
PKG_LICENSE="BSD"
|
PKG_LICENSE="BSD"
|
||||||
PKG_SITE="https://www.webmproject.org"
|
PKG_SITE="https://www.webmproject.org"
|
||||||
PKG_URL="https://github.com/webmproject/libvpx/archive/v${PKG_VERSION}.tar.gz"
|
PKG_URL="https://github.com/webmproject/libvpx/archive/v${PKG_VERSION}.tar.gz"
|
||||||
|
|||||||
@@ -2,8 +2,8 @@
|
|||||||
# Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv)
|
# Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv)
|
||||||
|
|
||||||
PKG_NAME="x264"
|
PKG_NAME="x264"
|
||||||
PKG_VERSION="545de2ffec6ae9a80738de1b2c8cf820249a2530"
|
PKG_VERSION="d4099dd4c722f52c4f3c14575d7d39eb8fadb97f"
|
||||||
PKG_SHA256="74725cf7036b2c96387c2c014ef00d181942d00230f21e16277f11d2d9683adc"
|
PKG_SHA256="9b6688b81e13cf342fc9b6b7adf1759eebd300c243c0707566ffe7ea9f0ccc7e"
|
||||||
PKG_LICENSE="GPL"
|
PKG_LICENSE="GPL"
|
||||||
PKG_SITE="http://www.videolan.org/developers/x264.html"
|
PKG_SITE="http://www.videolan.org/developers/x264.html"
|
||||||
PKG_URL="http://repo.or.cz/x264.git/snapshot/$PKG_VERSION.tar.gz"
|
PKG_URL="http://repo.or.cz/x264.git/snapshot/$PKG_VERSION.tar.gz"
|
||||||
|
|||||||
@@ -2,8 +2,8 @@
|
|||||||
# Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv)
|
# Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv)
|
||||||
|
|
||||||
PKG_NAME="x265"
|
PKG_NAME="x265"
|
||||||
PKG_VERSION="2.9"
|
PKG_VERSION="3.2"
|
||||||
PKG_SHA256="ebae687c84a39f54b995417c52a2fdde65a4e2e7ebac5730d251471304b91024"
|
PKG_SHA256="364d79bcd56116a9e070fdeb1d9d2aaef1a786b4970163fb56ff0991a183133b"
|
||||||
PKG_ARCH="x86_64"
|
PKG_ARCH="x86_64"
|
||||||
PKG_LICENSE="GPL"
|
PKG_LICENSE="GPL"
|
||||||
PKG_SITE="https://www.videolan.org/developers/x265.html"
|
PKG_SITE="https://www.videolan.org/developers/x265.html"
|
||||||
|
|||||||
@@ -2,11 +2,11 @@
|
|||||||
# Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv)
|
# Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv)
|
||||||
|
|
||||||
PKG_NAME="ffmpegx"
|
PKG_NAME="ffmpegx"
|
||||||
PKG_VERSION="4.1"
|
PKG_VERSION="4.2.1"
|
||||||
PKG_SHA256="7afb163d6974693cdad742aa1224c33683c50845c67ee5ae35506efc631ac121"
|
PKG_SHA256="cec7c87e9b60d174509e263ac4011b522385fd0775292e1670ecc1180c9bb6d4"
|
||||||
PKG_LICENSE="LGPLv2.1+"
|
PKG_LICENSE="LGPLv2.1+"
|
||||||
PKG_SITE="https://ffmpeg.org"
|
PKG_SITE="https://ffmpeg.org"
|
||||||
PKG_URL="https://github.com/FFmpeg/FFmpeg/archive/n${PKG_VERSION}.tar.gz"
|
PKG_URL="https://ffmpeg.org/releases/ffmpeg-$PKG_VERSION.tar.xz"
|
||||||
PKG_DEPENDS_TARGET="toolchain aom bzip2 gnutls libvorbis opus x264 zlib"
|
PKG_DEPENDS_TARGET="toolchain aom bzip2 gnutls libvorbis opus x264 zlib"
|
||||||
PKG_LONGDESC="FFmpegx is an complete FFmpeg build to support encoding and decoding."
|
PKG_LONGDESC="FFmpegx is an complete FFmpeg build to support encoding and decoding."
|
||||||
PKG_BUILD_FLAGS="-gold"
|
PKG_BUILD_FLAGS="-gold"
|
||||||
@@ -19,7 +19,7 @@ if [ "$KODIPLAYER_DRIVER" == "bcm2835-driver" ]; then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
if [ "$TARGET_ARCH" = "x86_64" ]; then
|
if [ "$TARGET_ARCH" = "x86_64" ]; then
|
||||||
PKG_DEPENDS_TARGET+=" nasm:host x265"
|
PKG_DEPENDS_TARGET+=" nasm:host intel-vaapi-driver x265"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ ! $TARGET_ARCH = arm ]] || target_has_feature neon; then
|
if [[ ! $TARGET_ARCH = arm ]] || target_has_feature neon; then
|
||||||
@@ -66,14 +66,14 @@ pre_configure_target() {
|
|||||||
if [[ "$TARGET_ARCH" = "x86_64" ]]; then
|
if [[ "$TARGET_ARCH" = "x86_64" ]]; then
|
||||||
PKG_FFMPEG_HW_ENCODERS_GENERIC="\
|
PKG_FFMPEG_HW_ENCODERS_GENERIC="\
|
||||||
`#Video encoders` \
|
`#Video encoders` \
|
||||||
--enable-encoder=h264_nvenc \
|
|
||||||
--enable-encoder=h264_vaapi \
|
--enable-encoder=h264_vaapi \
|
||||||
--enable-encoder=hevc_nvenc \
|
|
||||||
--enable-encoder=hevc_vaapi \
|
--enable-encoder=hevc_vaapi \
|
||||||
--enable-encoder=mjpeg_vaapi \
|
--enable-encoder=mjpeg_vaapi \
|
||||||
--enable-encoder=mpeg2_vaapi \
|
--enable-encoder=mpeg2_vaapi \
|
||||||
--enable-encoder=vp8_vaapi \
|
--enable-encoder=vp8_vaapi \
|
||||||
--enable-encoder=vp9_vaapi \
|
--enable-encoder=vp9_vaapi \
|
||||||
|
--disable-encoder=h264_nvenc \
|
||||||
|
--disable-encoder=hevc_nvenc \
|
||||||
\
|
\
|
||||||
`#Video hwaccel` \
|
`#Video hwaccel` \
|
||||||
--enable-hwaccel=h263_vaapi \
|
--enable-hwaccel=h263_vaapi \
|
||||||
@@ -138,7 +138,6 @@ configure_target() {
|
|||||||
\
|
\
|
||||||
`#Licensing options` \
|
`#Licensing options` \
|
||||||
--enable-gpl \
|
--enable-gpl \
|
||||||
--disable-nonfree \
|
|
||||||
\
|
\
|
||||||
`#Documentation options` \
|
`#Documentation options` \
|
||||||
--disable-doc \
|
--disable-doc \
|
||||||
|
|||||||
@@ -3,8 +3,8 @@
|
|||||||
# Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv)
|
# Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv)
|
||||||
|
|
||||||
PKG_NAME="go"
|
PKG_NAME="go"
|
||||||
PKG_VERSION="1.12.3"
|
PKG_VERSION="1.12.6"
|
||||||
PKG_SHA256="b710a65982e9001ef99a167cf6e8636e46ec36a10e487e7c1c7384cdcd6fcd7c"
|
PKG_SHA256="d61ff8fa5685b911653c8153de6e6501728ec3aee26a9d5a56880bab3120426b"
|
||||||
PKG_LICENSE="BSD"
|
PKG_LICENSE="BSD"
|
||||||
PKG_SITE="https://golang.org"
|
PKG_SITE="https://golang.org"
|
||||||
PKG_URL="https://github.com/golang/go/archive/${PKG_NAME}${PKG_VERSION}.tar.gz"
|
PKG_URL="https://github.com/golang/go/archive/${PKG_NAME}${PKG_VERSION}.tar.gz"
|
||||||
|
|||||||
@@ -0,0 +1,29 @@
|
|||||||
|
# SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
# Copyright (C) 2019-present Peter Vicman (peter.vicman@gmail.com)
|
||||||
|
# Copyright (C) 2020-present Team LibreELEC (https://libreelec.tv)
|
||||||
|
|
||||||
|
PKG_NAME="apache-ant"
|
||||||
|
PKG_VERSION="1.10.6"
|
||||||
|
PKG_SHA256="a4adf371696089e1730d4f55fd4d0c6f3784dea1eee402fcc981f2330f8d6fc1"
|
||||||
|
PKG_LICENSE="Apache License 2.0"
|
||||||
|
PKG_SITE="https://ant.apache.org/"
|
||||||
|
PKG_URL="https://archive.apache.org/dist/ant/source/${PKG_NAME}-${PKG_VERSION}-src.tar.xz"
|
||||||
|
PKG_DEPENDS_HOST="jdk-x86_64-zulu:host"
|
||||||
|
PKG_LONGDESC="Apache Ant is a Java library and command-line tool that help building software."
|
||||||
|
PKG_TOOLCHAIN="manual"
|
||||||
|
|
||||||
|
make_host() {
|
||||||
|
(
|
||||||
|
export JAVA_HOME=$(get_build_dir jdk-x86_64-zulu)
|
||||||
|
|
||||||
|
./bootstrap.sh
|
||||||
|
./bootstrap/bin/ant -f fetch.xml -Ddest=optional
|
||||||
|
./build.sh -Ddist.dir=${PKG_BUILD}/binary dist
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
makeinstall_host() {
|
||||||
|
mkdir -p ${TOOLCHAIN}/bin
|
||||||
|
cp binary/bin/ant ${TOOLCHAIN}/bin
|
||||||
|
cp -r binary/lib ${TOOLCHAIN}
|
||||||
|
}
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
# SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
# Copyright (C) 2019-present Peter Vicman (peter.vicman@gmail.com)
|
||||||
|
|
||||||
|
PKG_NAME="jdk-aarch64-zulu"
|
||||||
|
PKG_VERSION="8.38.0.162-1.8.0_212"
|
||||||
|
PKG_SHA256="2afa6b9a86fea6f9275856506b5cc1efd8420f674c5e2dc3e1b04e140d6ad852"
|
||||||
|
PKG_LICENSE="GPLv2"
|
||||||
|
PKG_SITE="https://www.azul.com/products/zulu-embedded/"
|
||||||
|
PKG_URL="http://cdn.azul.com/zulu-embedded/bin/zulu${PKG_VERSION%%-*}-ca-jdk${PKG_VERSION##*-}-linux_aarch64.tar.gz"
|
||||||
|
PKG_LONGDESC="Zulu, the open Java(TM) platform from Azul Systems."
|
||||||
|
PKG_TOOLCHAIN="manual"
|
||||||
|
|
||||||
|
post_unpack() {
|
||||||
|
rm -f $PKG_BUILD/src.zip
|
||||||
|
}
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
# SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
# Copyright (C) 2019-present Peter Vicman (peter.vicman@gmail.com)
|
||||||
|
|
||||||
|
PKG_NAME="jdk-arm-zulu"
|
||||||
|
PKG_VERSION="8.38.0.163-1.8.0_212"
|
||||||
|
PKG_SHA256="bc45f41eab6e55c4e740e980001831c5e35db85745ec61a2b110e816e1074715"
|
||||||
|
PKG_LICENSE="GPLv2"
|
||||||
|
PKG_SITE="https://www.azul.com/products/zulu-embedded/"
|
||||||
|
PKG_URL="https://cdn.azul.com/zulu-embedded/bin/zulu${PKG_VERSION%%-*}-ca-jdk${PKG_VERSION##*-}-linux_aarch32hf.tar.gz"
|
||||||
|
PKG_LONGDESC="Zulu, the open Java(TM) platform from Azul Systems."
|
||||||
|
PKG_TOOLCHAIN="manual"
|
||||||
|
|
||||||
|
post_unpack() {
|
||||||
|
rm -f $PKG_BUILD/src.zip
|
||||||
|
|
||||||
|
# libbluray needs arm/server
|
||||||
|
mv $PKG_BUILD/jre/lib/aarch32 $PKG_BUILD/jre/lib/arm
|
||||||
|
mv $PKG_BUILD/jre/lib/arm/client $PKG_BUILD/jre/lib/arm/server
|
||||||
|
}
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
# SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
# Copyright (C) 2019-present Peter Vicman (peter.vicman@gmail.com)
|
||||||
|
|
||||||
|
PKG_NAME="jdk-x86_64-zulu"
|
||||||
|
PKG_VERSION="8.38.0.13-8.0.212"
|
||||||
|
PKG_SHA256="568e7578f1b20b1e62a8ed2c374bad4eb0e75d221323ccfa6ba8d7bc56cf33cf"
|
||||||
|
PKG_LICENSE="GPLv2"
|
||||||
|
PKG_SITE="https://www.azul.com/products/zulu-enterprise/"
|
||||||
|
PKG_URL="https://cdn.azul.com/zulu/bin/zulu${PKG_VERSION%%-*}-ca-jdk${PKG_VERSION##*-}-linux_x64.tar.gz"
|
||||||
|
PKG_LONGDESC="Zulu, the open Java(TM) platform from Azul Systems."
|
||||||
|
PKG_TOOLCHAIN="manual"
|
||||||
|
|
||||||
|
post_unpack() {
|
||||||
|
rm -f $PKG_BUILD/src.zip
|
||||||
|
}
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
# SPDX-License-Identifier: GPL-2.0
|
||||||
|
# Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv)
|
||||||
|
|
||||||
|
. $(get_pkg_directory libXinerama)/package.mk
|
||||||
|
|
||||||
|
PKG_NAME="jre-libXinerama"
|
||||||
|
PKG_LONGDESC="libXinerama for JRE"
|
||||||
|
PKG_URL=""
|
||||||
|
PKG_DEPENDS_UNPACK+=" libXinerama"
|
||||||
|
|
||||||
|
PKG_CONFIGURE_OPTS_TARGET+=" --disable-static --enable-shared"
|
||||||
|
|
||||||
|
unpack() {
|
||||||
|
mkdir -p $PKG_BUILD
|
||||||
|
tar --strip-components=1 -xf $SOURCES/${PKG_NAME:4}/${PKG_NAME:4}-$PKG_VERSION.tar.bz2 -C $PKG_BUILD
|
||||||
|
}
|
||||||
|
|
||||||
|
makeinstall_target() {
|
||||||
|
:
|
||||||
|
}
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
# SPDX-License-Identifier: GPL-2.0
|
||||||
|
# Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv)
|
||||||
|
|
||||||
|
. $(get_pkg_directory libbluray)/package.mk
|
||||||
|
|
||||||
|
PKG_NAME="jre-libbluray"
|
||||||
|
PKG_DEPENDS_TARGET+=" jdk-x86_64-zulu:host apache-ant:host"
|
||||||
|
PKG_LONGDESC="libbluray jar for BD-J menus"
|
||||||
|
PKG_URL=""
|
||||||
|
PKG_DEPENDS_UNPACK+=" libbluray"
|
||||||
|
PKG_PATCH_DIRS+=" $(get_pkg_directory libbluray)/patches"
|
||||||
|
|
||||||
|
unpack() {
|
||||||
|
mkdir -p $PKG_BUILD
|
||||||
|
tar --strip-components=1 -xf $SOURCES/${PKG_NAME:4}/${PKG_NAME:4}-$PKG_VERSION.tar.bz2 -C $PKG_BUILD
|
||||||
|
}
|
||||||
|
|
||||||
|
pre_configure_target() {
|
||||||
|
# build also jar
|
||||||
|
PKG_CONFIGURE_OPTS_TARGET="${PKG_CONFIGURE_OPTS_TARGET/disable-bdjava-jar/enable-bdjava-jar}"
|
||||||
|
}
|
||||||
|
|
||||||
|
make_target() {
|
||||||
|
(
|
||||||
|
export JAVA_HOME="$(get_build_dir jdk-x86_64-zulu)"
|
||||||
|
|
||||||
|
make all-local
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
makeinstall_target() {
|
||||||
|
:
|
||||||
|
}
|
||||||
@@ -26,16 +26,14 @@ pre_configure_target() {
|
|||||||
export ac_cv_path_LIBUSB_CONFIG=$SYSROOT_PREFIX/usr/bin/libusb-config
|
export ac_cv_path_LIBUSB_CONFIG=$SYSROOT_PREFIX/usr/bin/libusb-config
|
||||||
}
|
}
|
||||||
|
|
||||||
post_make_target() {
|
makeinstall_target() {
|
||||||
# copy necessary libs and headers to build serdisplib support
|
# copy necessary libs and headers to build serdisplib support
|
||||||
# into the driver glcd from lcdproc
|
# into the driver glcd from lcdproc
|
||||||
mkdir -p $SYSROOT_PREFIX/usr/include/serdisplib
|
mkdir -p $SYSROOT_PREFIX/usr/include/serdisplib
|
||||||
cp include/serdisplib/*.h $SYSROOT_PREFIX/usr/include/serdisplib
|
cp include/serdisplib/*.h $SYSROOT_PREFIX/usr/include/serdisplib
|
||||||
mkdir -p $SYSROOT_PREFIX/usr/lib
|
mkdir -p $SYSROOT_PREFIX/usr/lib
|
||||||
cp lib/libserdisp.so* $SYSROOT_PREFIX/usr/lib
|
cp lib/libserdisp.so* $SYSROOT_PREFIX/usr/lib
|
||||||
}
|
|
||||||
|
|
||||||
makeinstall_target() {
|
|
||||||
mkdir -p $INSTALL/usr/lib
|
mkdir -p $INSTALL/usr/lib
|
||||||
cp lib/libserdisp.so* $INSTALL/usr/lib
|
cp lib/libserdisp.so* $INSTALL/usr/lib
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,8 +3,8 @@
|
|||||||
# Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv)
|
# Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv)
|
||||||
|
|
||||||
PKG_NAME="libnetwork"
|
PKG_NAME="libnetwork"
|
||||||
PKG_VERSION="4725f2163fb214a6312f3beae5991f838ec36326"
|
PKG_VERSION="e7933d41e7b206756115aa9df5e0599fc5169742"
|
||||||
PKG_SHA256="049bddc1e584f30c29e0fed8716b3c7023d4bb31789d7c3aa48d17b979f1522b"
|
PKG_SHA256="b9695c4d7711487543b2eff8ca74cc2deb9828f7f4582196324d39d20eab3855"
|
||||||
PKG_LICENSE="APL"
|
PKG_LICENSE="APL"
|
||||||
PKG_SITE="https://github.com/docker/libnetwork"
|
PKG_SITE="https://github.com/docker/libnetwork"
|
||||||
PKG_URL="https://github.com/docker/libnetwork/archive/${PKG_VERSION}.tar.gz"
|
PKG_URL="https://github.com/docker/libnetwork/archive/${PKG_VERSION}.tar.gz"
|
||||||
|
|||||||
@@ -1,25 +0,0 @@
|
|||||||
# SPDX-License-Identifier: GPL-2.0
|
|
||||||
# Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv)
|
|
||||||
|
|
||||||
PKG_NAME="pyalsaaudio"
|
|
||||||
PKG_VERSION="0.8.4"
|
|
||||||
PKG_SHA256="84e8f8da544d7f4bd96479ce4a237600077984d9be1d7f16c1d9a492ecf50085"
|
|
||||||
PKG_LICENSE="PSF"
|
|
||||||
PKG_SITE="http://larsimmisch.github.io/pyalsaaudio/"
|
|
||||||
PKG_URL="https://files.pythonhosted.org/packages/source/${PKG_NAME:0:1}/$PKG_NAME/$PKG_NAME-$PKG_VERSION.tar.gz"
|
|
||||||
PKG_DEPENDS_TARGET="toolchain Python2 distutilscross:host alsa-lib"
|
|
||||||
PKG_LONGDESC="ALSA bindings"
|
|
||||||
PKG_TOOLCHAIN="manual"
|
|
||||||
|
|
||||||
make_target() {
|
|
||||||
export LDSHARED="$CC -shared"
|
|
||||||
export PYTHONXCPREFIX="$SYSROOT_PREFIX/usr"
|
|
||||||
python setup.py build --cross-compile
|
|
||||||
}
|
|
||||||
|
|
||||||
makeinstall_target() {
|
|
||||||
python setup.py install --root=$INSTALL --prefix=/usr
|
|
||||||
find $INSTALL/usr/lib -name "*.py" -exec rm -rf "{}" ";"
|
|
||||||
rm -rf $INSTALL/usr/lib/python*/site-packages/*.egg-info \
|
|
||||||
$INSTALL/usr/lib/python*/site-packages/*/tests
|
|
||||||
}
|
|
||||||
@@ -2,7 +2,7 @@
|
|||||||
# Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv)
|
# Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv)
|
||||||
|
|
||||||
PKG_NAME="rust"
|
PKG_NAME="rust"
|
||||||
PKG_VERSION="1.31.1"
|
PKG_VERSION="1.39.0"
|
||||||
PKG_LICENSE="MIT"
|
PKG_LICENSE="MIT"
|
||||||
PKG_SITE="https://www.rust-lang.org"
|
PKG_SITE="https://www.rust-lang.org"
|
||||||
PKG_DEPENDS_TARGET="toolchain rustup.rs"
|
PKG_DEPENDS_TARGET="toolchain rustup.rs"
|
||||||
@@ -10,40 +10,43 @@ PKG_LONGDESC="A systems programming language that prevents segfaults, and guaran
|
|||||||
PKG_TOOLCHAIN="manual"
|
PKG_TOOLCHAIN="manual"
|
||||||
|
|
||||||
make_target() {
|
make_target() {
|
||||||
export CARGO_HOME="$TOOLCHAIN/.cargo"
|
export CARGO_HOME="$PKG_BUILD/cargo"
|
||||||
export RUSTUP_HOME="$CARGO_HOME"
|
export RUSTUP_HOME="$CARGO_HOME"
|
||||||
export PATH="$CARGO_HOME/bin:$PATH"
|
export PATH="$CARGO_HOME/bin:$PATH"
|
||||||
rm -rf "$CARGO_HOME"
|
|
||||||
$(get_build_dir rustup.rs)/rustup-init.sh --no-modify-path -y
|
|
||||||
rustup default "$PKG_VERSION"
|
|
||||||
case "$TARGET_ARCH" in
|
case "$TARGET_ARCH" in
|
||||||
aarch64)
|
aarch64)
|
||||||
RUST_TRIPLE="aarch64-unknown-linux-gnu"
|
RUST_TARGET_TRIPLE="aarch64-unknown-linux-gnu"
|
||||||
;;
|
;;
|
||||||
arm)
|
arm)
|
||||||
RUST_TRIPLE="arm-unknown-linux-gnueabihf"
|
RUST_TARGET_TRIPLE="arm-unknown-linux-gnueabihf"
|
||||||
;;
|
;;
|
||||||
x86_64)
|
x86_64)
|
||||||
RUST_TRIPLE="x86_64-unknown-linux-gnu"
|
RUST_TARGET_TRIPLE="x86_64-unknown-linux-gnu"
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
if [ "$TARGET_ARCH" != "x86_64" ]; then
|
"$(get_build_dir rustup.rs)/rustup-init.sh" \
|
||||||
rustup target add "$RUST_TRIPLE"
|
--default-toolchain "$PKG_VERSION" \
|
||||||
fi
|
--no-modify-path \
|
||||||
|
--profile minimal \
|
||||||
|
--target "$RUST_TARGET_TRIPLE" \
|
||||||
|
-y
|
||||||
|
|
||||||
cat <<EOF >"$CARGO_HOME/config"
|
cat <<EOF >"$CARGO_HOME/config"
|
||||||
[target.$RUST_TRIPLE]
|
[build]
|
||||||
|
target = "$RUST_TARGET_TRIPLE"
|
||||||
|
|
||||||
|
[target.$RUST_TARGET_TRIPLE]
|
||||||
|
ar = "$AR"
|
||||||
linker = "$CC"
|
linker = "$CC"
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
cat <<'EOF' >"$CARGO_HOME/env"
|
cat <<EOF >"$CARGO_HOME/env"
|
||||||
export CARGO_HOME="$TOOLCHAIN/.cargo"
|
export CARGO_HOME="$CARGO_HOME"
|
||||||
export CARGO_TARGET_DIR="$PKG_BUILD/.$TARGET_NAME"
|
export CARGO_TARGET_DIR="\$PKG_BUILD/.\$TARGET_NAME"
|
||||||
export PATH="$CARGO_HOME/bin:$PATH"
|
export PATH="$CARGO_HOME/bin:$PATH"
|
||||||
|
export PKG_CONFIG_ALLOW_CROSS="1"
|
||||||
|
export PKG_CONFIG_PATH="$PKG_CONFIG_LIBDIR"
|
||||||
export RUSTUP_HOME="$CARGO_HOME"
|
export RUSTUP_HOME="$CARGO_HOME"
|
||||||
mkdir -p "$CARGO_TARGET_DIR"
|
unset CFLAGS
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
echo "CARGO_BUILD=\"cargo build --release --target $RUST_TRIPLE\"" \
|
|
||||||
>>"$CARGO_HOME/env"
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,8 +2,8 @@
|
|||||||
# Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv)
|
# Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv)
|
||||||
|
|
||||||
PKG_NAME="rustup.rs"
|
PKG_NAME="rustup.rs"
|
||||||
PKG_VERSION="1.16.0"
|
PKG_VERSION="1.20.2"
|
||||||
PKG_SHA256="8c4ffeda2088dbdd5ea2eac8acef5ddd57dfcfe1f06a503e3da790f93161e1a6"
|
PKG_SHA256="28207ee4c2d66840ca903df152b23b916326a5d3eeb643a1de0f24a16afa4209"
|
||||||
PKG_LICENSE="MIT"
|
PKG_LICENSE="MIT"
|
||||||
PKG_SITE="https://www.rust-lang.org"
|
PKG_SITE="https://www.rust-lang.org"
|
||||||
PKG_URL="https://github.com/rust-lang-nursery/rustup.rs/archive/$PKG_VERSION.tar.gz"
|
PKG_URL="https://github.com/rust-lang-nursery/rustup.rs/archive/$PKG_VERSION.tar.gz"
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
# SPDX-License-Identifier: GPL-2.0-or-later
|
# SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
# Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv)
|
# Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv)
|
||||||
|
# Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv)
|
||||||
|
|
||||||
PKG_NAME="libzip"
|
PKG_NAME="libzip"
|
||||||
PKG_VERSION="0.11.2"
|
PKG_VERSION="0.11.2"
|
||||||
@@ -7,7 +8,7 @@ PKG_SHA256="7cfbbc2c540e154b933b6e9ec781e2671086bd8114eb744ae1a1ade34d2bb6bb"
|
|||||||
PKG_LICENSE="GPL"
|
PKG_LICENSE="GPL"
|
||||||
PKG_SITE="http://www.nih.at/libzip/"
|
PKG_SITE="http://www.nih.at/libzip/"
|
||||||
PKG_URL="http://www.nih.at/libzip/${PKG_NAME}-${PKG_VERSION}.tar.xz"
|
PKG_URL="http://www.nih.at/libzip/${PKG_NAME}-${PKG_VERSION}.tar.xz"
|
||||||
PKG_DEPENDS_TARGET="toolchain"
|
PKG_DEPENDS_TARGET="toolchain zlib"
|
||||||
PKG_LONGDESC="A C library for reading, creating, and modifying zip archives."
|
PKG_LONGDESC="A C library for reading, creating, and modifying zip archives."
|
||||||
PKG_TOOLCHAIN="configure"
|
PKG_TOOLCHAIN="configure"
|
||||||
|
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ PKG_SHA256="6c1337aee2e4bf993299851c70b7db11faec785303cfca3a5c3eb5f329ba7023"
|
|||||||
PKG_LICENSE="LGPLv2"
|
PKG_LICENSE="LGPLv2"
|
||||||
PKG_SITE="http://www.mpg123.org/"
|
PKG_SITE="http://www.mpg123.org/"
|
||||||
PKG_URL="http://downloads.sourceforge.net/sourceforge/mpg123/mpg123-$PKG_VERSION.tar.bz2"
|
PKG_URL="http://downloads.sourceforge.net/sourceforge/mpg123/mpg123-$PKG_VERSION.tar.bz2"
|
||||||
PKG_DEPENDS_TARGET="toolchain alsa-lib SDL2"
|
PKG_DEPENDS_TARGET="toolchain alsa-lib"
|
||||||
PKG_LONGDESC="A console based real time MPEG Audio Player for Layer 1, 2 and 3."
|
PKG_LONGDESC="A console based real time MPEG Audio Player for Layer 1, 2 and 3."
|
||||||
|
|
||||||
PKG_CONFIGURE_OPTS_TARGET="--disable-shared \
|
PKG_CONFIGURE_OPTS_TARGET="--disable-shared \
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ PKG_SHA256="c9d77f98b31d53f521e3179003a9cb66b0586704717e9d401f3bc0dafa243865"
|
|||||||
PKG_LICENSE="GPL"
|
PKG_LICENSE="GPL"
|
||||||
PKG_SITE="http://www.avalpa.com/the-key-values/15-free-software/33-opencaster"
|
PKG_SITE="http://www.avalpa.com/the-key-values/15-free-software/33-opencaster"
|
||||||
PKG_URL="http://ftp.de.debian.org/debian/pool/main/o/opencaster/opencaster_${PKG_VERSION}+dfsg.orig.tar.gz"
|
PKG_URL="http://ftp.de.debian.org/debian/pool/main/o/opencaster/opencaster_${PKG_VERSION}+dfsg.orig.tar.gz"
|
||||||
PKG_DEPENDS_TARGET="toolchain"
|
PKG_DEPENDS_TARGET="toolchain zlib"
|
||||||
PKG_LONGDESC="A free and open source MPEG2 transport stream data generator and packet manipulator."
|
PKG_LONGDESC="A free and open source MPEG2 transport stream data generator and packet manipulator."
|
||||||
|
|
||||||
pre_configure_target() {
|
pre_configure_target() {
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
# SPDX-License-Identifier: GPL-2.0-or-later
|
# SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv)
|
# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv)
|
||||||
|
# Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv)
|
||||||
|
|
||||||
PKG_NAME="tsdecrypt"
|
PKG_NAME="tsdecrypt"
|
||||||
PKG_VERSION="10.0"
|
PKG_VERSION="10.0"
|
||||||
@@ -7,7 +8,7 @@ PKG_SHA256="a337a7d60cc8f78b9dffbd7d675390497763bcb8f878ec9f1bec3eb80f32b1f1"
|
|||||||
PKG_LICENSE="GPL"
|
PKG_LICENSE="GPL"
|
||||||
PKG_SITE="http://georgi.unixsol.org/programs/tsdecrypt"
|
PKG_SITE="http://georgi.unixsol.org/programs/tsdecrypt"
|
||||||
PKG_URL="http://georgi.unixsol.org/programs/tsdecrypt/${PKG_NAME}-${PKG_VERSION}.tar.bz2"
|
PKG_URL="http://georgi.unixsol.org/programs/tsdecrypt/${PKG_NAME}-${PKG_VERSION}.tar.bz2"
|
||||||
PKG_DEPENDS_TARGET="toolchain libdvbcsa"
|
PKG_DEPENDS_TARGET="toolchain libdvbcsa openssl"
|
||||||
PKG_LONGDESC="A tool that reads incoming mpeg transport stream over UDP/RTP and then decrypts it using libdvbcsa/ffdecsa."
|
PKG_LONGDESC="A tool that reads incoming mpeg transport stream over UDP/RTP and then decrypts it using libdvbcsa/ffdecsa."
|
||||||
|
|
||||||
make_target() {
|
make_target() {
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ PKG_SHA256="4ebc271e9e5cea84a683375a0f7e91086e5dac90c5d51bb3f169f75386107a62"
|
|||||||
PKG_LICENSE="GPLv3"
|
PKG_LICENSE="GPLv3"
|
||||||
PKG_SITE="http://lftp.yar.ru/"
|
PKG_SITE="http://lftp.yar.ru/"
|
||||||
PKG_URL="http://lftp.yar.ru/ftp/${PKG_NAME}-${PKG_VERSION}.tar.xz"
|
PKG_URL="http://lftp.yar.ru/ftp/${PKG_NAME}-${PKG_VERSION}.tar.xz"
|
||||||
PKG_DEPENDS_TARGET="toolchain readline openssl zlib"
|
PKG_DEPENDS_TARGET="toolchain readline openssl zlib libidn2"
|
||||||
PKG_LONGDESC="A sophisticated ftp/http client, and a file transfer program supporting a number of network protocols."
|
PKG_LONGDESC="A sophisticated ftp/http client, and a file transfer program supporting a number of network protocols."
|
||||||
|
|
||||||
PKG_CONFIGURE_OPTS_TARGET="--disable-nls \
|
PKG_CONFIGURE_OPTS_TARGET="--disable-nls \
|
||||||
|
|||||||
@@ -10,6 +10,10 @@ PKG_URL="http://www.udpxy.com/download/1_23/${PKG_NAME}.${PKG_VERSION}-prod.tar.
|
|||||||
PKG_DEPENDS_TARGET="toolchain"
|
PKG_DEPENDS_TARGET="toolchain"
|
||||||
PKG_LONGDESC="A UDP-to-HTTP multicast traffic relay daemon."
|
PKG_LONGDESC="A UDP-to-HTTP multicast traffic relay daemon."
|
||||||
|
|
||||||
|
configure_target() {
|
||||||
|
export CFLAGS+=" -Wno-stringop-truncation"
|
||||||
|
}
|
||||||
|
|
||||||
makeinstall_target() {
|
makeinstall_target() {
|
||||||
:
|
:
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,13 +2,14 @@
|
|||||||
# Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv)
|
# Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv)
|
||||||
|
|
||||||
PKG_NAME="opus"
|
PKG_NAME="opus"
|
||||||
PKG_VERSION="1.3"
|
PKG_VERSION="1.3.1"
|
||||||
PKG_SHA256="4f3d69aefdf2dbaf9825408e452a8a414ffc60494c70633560700398820dc550"
|
PKG_SHA256="65b58e1e25b2a114157014736a3d9dfeaad8d41be1c8179866f144a2fb44ff9d"
|
||||||
PKG_LICENSE="BSD"
|
PKG_LICENSE="BSD"
|
||||||
PKG_SITE="http://www.opus-codec.org"
|
PKG_SITE="http://www.opus-codec.org"
|
||||||
PKG_URL="https://archive.mozilla.org/pub/opus/$PKG_NAME-$PKG_VERSION.tar.gz"
|
PKG_URL="https://archive.mozilla.org/pub/opus/$PKG_NAME-$PKG_VERSION.tar.gz"
|
||||||
PKG_DEPENDS_TARGET="toolchain"
|
PKG_DEPENDS_TARGET="toolchain"
|
||||||
PKG_LONGDESC="Codec designed for interactive speech and audio transmission over the Internet."
|
PKG_LONGDESC="Codec designed for interactive speech and audio transmission over the Internet."
|
||||||
|
PKG_TOOLCHAIN="configure"
|
||||||
|
|
||||||
if [ "$TARGET_ARCH" = "arm" ]; then
|
if [ "$TARGET_ARCH" = "arm" ]; then
|
||||||
PKG_FIXED_POINT="--enable-fixed-point"
|
PKG_FIXED_POINT="--enable-fixed-point"
|
||||||
|
|||||||
@@ -3,12 +3,12 @@
|
|||||||
# Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv)
|
# Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv)
|
||||||
|
|
||||||
PKG_NAME="qtbase"
|
PKG_NAME="qtbase"
|
||||||
PKG_VERSION="5.6.2"
|
PKG_VERSION="5.14.0"
|
||||||
PKG_SHA256="2f6eae93c5d982fe0a387a01aeb3435571433e23e9d9d9246741faf51f1ee787"
|
PKG_SHA256="4ef921c0f208a1624439801da8b3f4344a3793b660ce1095f2b7f5c4246b9463"
|
||||||
PKG_LICENSE="GPL"
|
PKG_LICENSE="GPL"
|
||||||
PKG_SITE="http://qt-project.org"
|
PKG_SITE="http://qt-project.org"
|
||||||
PKG_URL="http://download.qt.io/official_releases/qt/5.6/$PKG_VERSION/submodules/$PKG_NAME-opensource-src-$PKG_VERSION.tar.xz"
|
PKG_URL="http://download.qt.io/archive/qt/${PKG_VERSION%.*}/$PKG_VERSION/submodules/$PKG_NAME-everywhere-src-$PKG_VERSION.tar.xz"
|
||||||
PKG_DEPENDS_TARGET="pcre zlib"
|
PKG_DEPENDS_TARGET="freetype libjpeg-turbo libpng openssl sqlite zlib"
|
||||||
PKG_LONGDESC="A cross-platform application and UI framework."
|
PKG_LONGDESC="A cross-platform application and UI framework."
|
||||||
|
|
||||||
PKG_CONFIGURE_OPTS_TARGET="-prefix /usr
|
PKG_CONFIGURE_OPTS_TARGET="-prefix /usr
|
||||||
@@ -17,39 +17,50 @@ PKG_CONFIGURE_OPTS_TARGET="-prefix /usr
|
|||||||
-device linux-libreelec-g++
|
-device linux-libreelec-g++
|
||||||
-opensource -confirm-license
|
-opensource -confirm-license
|
||||||
-release
|
-release
|
||||||
|
-optimize-size
|
||||||
|
-strip
|
||||||
-static
|
-static
|
||||||
-make libs
|
|
||||||
-force-pkg-config
|
|
||||||
-no-accessibility
|
|
||||||
-no-sql-sqlite
|
|
||||||
-no-sql-mysql
|
|
||||||
-no-qml-debug
|
|
||||||
-system-zlib
|
|
||||||
-no-mtdev
|
|
||||||
-no-gif
|
|
||||||
-no-libpng
|
|
||||||
-no-libjpeg
|
|
||||||
-no-harfbuzz
|
|
||||||
-no-openssl
|
|
||||||
-no-libproxy
|
|
||||||
-system-pcre
|
|
||||||
-no-glib
|
|
||||||
-no-pulseaudio
|
|
||||||
-no-alsa
|
|
||||||
-silent
|
-silent
|
||||||
-no-cups
|
-force-pkg-config
|
||||||
-no-iconv
|
-make libs
|
||||||
-no-evdev
|
|
||||||
-no-tslib
|
|
||||||
-no-icu
|
|
||||||
-no-strip
|
|
||||||
-no-fontconfig
|
|
||||||
-no-dbus
|
-no-dbus
|
||||||
|
-no-accessibility
|
||||||
|
-no-glib
|
||||||
|
-no-iconv
|
||||||
|
-no-icu
|
||||||
|
-qt-pcre
|
||||||
|
-system-zlib
|
||||||
|
-openssl-linked
|
||||||
|
-no-libproxy
|
||||||
|
-no-cups
|
||||||
|
-no-fontconfig
|
||||||
|
-system-freetype
|
||||||
|
-no-harfbuzz
|
||||||
-no-opengl
|
-no-opengl
|
||||||
|
-no-egl
|
||||||
|
-no-eglfs
|
||||||
|
-no-gbm
|
||||||
|
-no-kms
|
||||||
|
-no-linuxfb
|
||||||
|
-no-xcb
|
||||||
|
-no-feature-vnc
|
||||||
|
-no-feature-sessionmanager
|
||||||
|
-no-feature-easingcurve
|
||||||
|
-no-feature-effects
|
||||||
|
-no-feature-gestures
|
||||||
|
-no-feature-itemmodel
|
||||||
-no-libudev
|
-no-libudev
|
||||||
|
-no-evdev
|
||||||
-no-libinput
|
-no-libinput
|
||||||
-no-gstreamer
|
-no-mtdev
|
||||||
-no-eglfs"
|
-no-tslib
|
||||||
|
-no-xkbcommon
|
||||||
|
-no-gif
|
||||||
|
-no-ico
|
||||||
|
-system-libpng
|
||||||
|
-system-libjpeg
|
||||||
|
-no-sql-mysql
|
||||||
|
-system-sqlite"
|
||||||
|
|
||||||
configure_target() {
|
configure_target() {
|
||||||
QMAKE_CONF_DIR="mkspecs/devices/linux-libreelec-g++"
|
QMAKE_CONF_DIR="mkspecs/devices/linux-libreelec-g++"
|
||||||
@@ -86,9 +97,3 @@ EOF
|
|||||||
unset CC CXX LD RANLIB AR AS CPPFLAGS CFLAGS LDFLAGS CXXFLAGS
|
unset CC CXX LD RANLIB AR AS CPPFLAGS CFLAGS LDFLAGS CXXFLAGS
|
||||||
./configure ${PKG_CONFIGURE_OPTS_TARGET}
|
./configure ${PKG_CONFIGURE_OPTS_TARGET}
|
||||||
}
|
}
|
||||||
|
|
||||||
post_makeinstall_target() {
|
|
||||||
# Qt installs directly to $SYSROOT_PREFIX so don't rely on scripts/build fixing this up
|
|
||||||
# PKG_ORIG_SYSROOT_PREFIX will be undefined when performing a legacy build
|
|
||||||
sed -e "s:\(['= ]\)/usr:\\1${PKG_ORIG_SYSROOT_PREFIX:-${SYSROOT_PREFIX}}/usr:g" -i "${PKG_ORIG_SYSROOT_PREFIX:-${SYSROOT_PREFIX}}/usr/lib"/libQt*.la
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -0,0 +1,41 @@
|
|||||||
|
From 0650bbb7d79c6db34bc54dfb73320303d83a8f56 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Jonas Karlman <jonas@kwiboo.se>
|
||||||
|
Date: Tue, 14 Jan 2020 21:35:57 +0000
|
||||||
|
Subject: [PATCH] use sysroot path for pkgconfig and libtool
|
||||||
|
|
||||||
|
---
|
||||||
|
mkspecs/features/qt_module.prf | 8 ++++----
|
||||||
|
1 file changed, 4 insertions(+), 4 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/mkspecs/features/qt_module.prf b/mkspecs/features/qt_module.prf
|
||||||
|
index 828a9621b9..0f3472fffc 100644
|
||||||
|
--- a/mkspecs/features/qt_module.prf
|
||||||
|
+++ b/mkspecs/features/qt_module.prf
|
||||||
|
@@ -275,12 +275,12 @@ load(qt_targets)
|
||||||
|
host_build: \
|
||||||
|
QMAKE_PKGCONFIG_LIBDIR = $$[QT_HOST_LIBS]
|
||||||
|
else: \
|
||||||
|
- QMAKE_PKGCONFIG_LIBDIR = $$[QT_INSTALL_LIBS/raw]
|
||||||
|
+ QMAKE_PKGCONFIG_LIBDIR = $$[QT_INSTALL_LIBS]
|
||||||
|
lib_bundle {
|
||||||
|
- QMAKE_PKGCONFIG_INCDIR = $$[QT_INSTALL_LIBS/raw]/$${MODULE_INCNAME}.framework/Headers
|
||||||
|
+ QMAKE_PKGCONFIG_INCDIR = $$[QT_INSTALL_LIBS]/$${MODULE_INCNAME}.framework/Headers
|
||||||
|
QMAKE_PKGCONFIG_CFLAGS = -D$$MODULE_DEFINE
|
||||||
|
} else {
|
||||||
|
- QMAKE_PKGCONFIG_INCDIR = $$[QT_INSTALL_HEADERS/raw]
|
||||||
|
+ QMAKE_PKGCONFIG_INCDIR = $$[QT_INSTALL_HEADERS]
|
||||||
|
QMAKE_PKGCONFIG_CFLAGS = -D$$MODULE_DEFINE -I${includedir}/$$MODULE_INCNAME
|
||||||
|
for(inc, MODULE_AUX_INCLUDES): \
|
||||||
|
QMAKE_PKGCONFIG_CFLAGS += -I${includedir}/$$section(inc, /, 1, 1)
|
||||||
|
@@ -308,7 +308,7 @@ load(qt_targets)
|
||||||
|
host_build: \
|
||||||
|
QMAKE_LIBTOOL_LIBDIR = $$[QT_HOST_LIBS]
|
||||||
|
else: \
|
||||||
|
- QMAKE_LIBTOOL_LIBDIR = "=$$[QT_INSTALL_LIBS/raw]"
|
||||||
|
+ QMAKE_LIBTOOL_LIBDIR = "=$$[QT_INSTALL_LIBS]"
|
||||||
|
!isEmpty(lib_replace0.match) {
|
||||||
|
ltlib_replace0.match = $$lib_replace0.match
|
||||||
|
ltlib_replace0.replace = $$QMAKE_LIBTOOL_LIBDIR/
|
||||||
|
--
|
||||||
|
2.17.1
|
||||||
|
|
||||||
@@ -1,111 +0,0 @@
|
|||||||
From 9f3efa796acb97ea4887468f1e8136e2e0711118 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Peter Levine <plevine457@gmail.com>
|
|
||||||
Date: Fri, 13 May 2016 20:04:00 -0400
|
|
||||||
Subject: [PATCH] Remove -isystem from qmake due to QTBUG-53375
|
|
||||||
|
|
||||||
Change-Id: If0595fc2f209a48585e7e9b9a61f11c0d4e0664f
|
|
||||||
---
|
|
||||||
mkspecs/common/clang.conf | 1 -
|
|
||||||
mkspecs/common/gcc-base.conf | 1 -
|
|
||||||
mkspecs/linux-icc/qmake.conf | 1 -
|
|
||||||
qmake/generators/unix/unixmake2.cpp | 14 +++-----------
|
|
||||||
qmake/generators/win32/mingw_make.cpp | 8 +-------
|
|
||||||
5 files changed, 4 insertions(+), 21 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/mkspecs/common/clang.conf b/mkspecs/common/clang.conf
|
|
||||||
index ee9c1b8..fbe370e 100644
|
|
||||||
--- a/mkspecs/common/clang.conf
|
|
||||||
+++ b/mkspecs/common/clang.conf
|
|
||||||
@@ -16,7 +16,6 @@ QMAKE_LINK_SHLIB = $$QMAKE_CXX
|
|
||||||
CONFIG += clang_pch_style
|
|
||||||
QMAKE_PCH_OUTPUT_EXT = .pch
|
|
||||||
|
|
||||||
-QMAKE_CFLAGS_ISYSTEM = -isystem
|
|
||||||
QMAKE_CFLAGS_PRECOMPILE = -x c-header -c ${QMAKE_PCH_INPUT} -o ${QMAKE_PCH_OUTPUT}
|
|
||||||
QMAKE_CFLAGS_USE_PRECOMPILE = -Xclang -include-pch -Xclang ${QMAKE_PCH_OUTPUT}
|
|
||||||
QMAKE_CFLAGS_LTCG = -flto
|
|
||||||
diff --git a/mkspecs/common/gcc-base.conf b/mkspecs/common/gcc-base.conf
|
|
||||||
index 6e043f5..df8d314 100644
|
|
||||||
--- a/mkspecs/common/gcc-base.conf
|
|
||||||
+++ b/mkspecs/common/gcc-base.conf
|
|
||||||
@@ -44,7 +44,6 @@ QMAKE_CFLAGS_DEBUG += -g
|
|
||||||
QMAKE_CFLAGS_SHLIB += -fPIC
|
|
||||||
QMAKE_CFLAGS_STATIC_LIB += -fPIC
|
|
||||||
QMAKE_CFLAGS_APP += -fPIC
|
|
||||||
-QMAKE_CFLAGS_ISYSTEM = -isystem
|
|
||||||
QMAKE_CFLAGS_YACC += -Wno-unused -Wno-parentheses
|
|
||||||
QMAKE_CFLAGS_HIDESYMS += -fvisibility=hidden
|
|
||||||
QMAKE_CFLAGS_EXCEPTIONS_OFF += -fno-exceptions
|
|
||||||
diff --git a/mkspecs/linux-icc/qmake.conf b/mkspecs/linux-icc/qmake.conf
|
|
||||||
index 495fd15..935833b 100644
|
|
||||||
--- a/mkspecs/linux-icc/qmake.conf
|
|
||||||
+++ b/mkspecs/linux-icc/qmake.conf
|
|
||||||
@@ -21,7 +21,6 @@ QMAKE_CFLAGS_DEBUG = -O0 -g
|
|
||||||
QMAKE_CFLAGS_SHLIB = -fPIC
|
|
||||||
QMAKE_CFLAGS_STATIC_LIB = $$QMAKE_CFLAGS_SHLIB
|
|
||||||
QMAKE_CFLAGS_YACC =
|
|
||||||
-QMAKE_CFLAGS_ISYSTEM = -isystem
|
|
||||||
QMAKE_CFLAGS_THREAD = -D_REENTRANT
|
|
||||||
QMAKE_CFLAGS_SPLIT_SECTIONS = -ffunction-sections
|
|
||||||
QMAKE_CFLAGS_LTCG = -ipo -fno-fat-lto-objects
|
|
||||||
diff --git a/qmake/generators/unix/unixmake2.cpp b/qmake/generators/unix/unixmake2.cpp
|
|
||||||
index 9312f19..009a674 100644
|
|
||||||
--- a/qmake/generators/unix/unixmake2.cpp
|
|
||||||
+++ b/qmake/generators/unix/unixmake2.cpp
|
|
||||||
@@ -176,16 +176,10 @@ UnixMakefileGenerator::writeMakeParts(QTextStream &t)
|
|
||||||
t << "CXXFLAGS = " << var("QMAKE_CXXFLAGS") << " $(DEFINES)\n";
|
|
||||||
t << "INCPATH =";
|
|
||||||
{
|
|
||||||
- QString isystem = var("QMAKE_CFLAGS_ISYSTEM");
|
|
||||||
const ProStringList &incs = project->values("INCLUDEPATH");
|
|
||||||
for(int i = 0; i < incs.size(); ++i) {
|
|
||||||
const ProString &inc = incs.at(i);
|
|
||||||
- if (inc.isEmpty())
|
|
||||||
- continue;
|
|
||||||
-
|
|
||||||
- if (!isystem.isEmpty() && isSystemInclude(inc.toQString()))
|
|
||||||
- t << ' ' << isystem << ' ';
|
|
||||||
- else
|
|
||||||
+ if (!inc.isEmpty())
|
|
||||||
t << " -I";
|
|
||||||
t << escapeFilePath(inc);
|
|
||||||
}
|
|
||||||
@@ -1328,10 +1322,8 @@ void UnixMakefileGenerator::init2()
|
|
||||||
}
|
|
||||||
|
|
||||||
if (include_deps && project->isActiveConfig("gcc_MD_depends")) {
|
|
||||||
- // use -MMD if we know about -isystem too
|
|
||||||
- ProString MD_flag(project->values("QMAKE_CFLAGS_ISYSTEM").isEmpty() ? "-MD" : "-MMD");
|
|
||||||
- project->values("QMAKE_CFLAGS") += MD_flag;
|
|
||||||
- project->values("QMAKE_CXXFLAGS") += MD_flag;
|
|
||||||
+ project->values("QMAKE_CFLAGS") += "-MD";
|
|
||||||
+ project->values("QMAKE_CXXFLAGS") += "-MD";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
diff --git a/qmake/generators/win32/mingw_make.cpp b/qmake/generators/win32/mingw_make.cpp
|
|
||||||
index 382b10c..c9eebd8 100644
|
|
||||||
--- a/qmake/generators/win32/mingw_make.cpp
|
|
||||||
+++ b/qmake/generators/win32/mingw_make.cpp
|
|
||||||
@@ -249,17 +249,11 @@ void MingwMakefileGenerator::writeIncPart(QTextStream &t)
|
|
||||||
{
|
|
||||||
t << "INCPATH = ";
|
|
||||||
|
|
||||||
- QString isystem = var("QMAKE_CFLAGS_ISYSTEM");
|
|
||||||
const ProStringList &incs = project->values("INCLUDEPATH");
|
|
||||||
for (ProStringList::ConstIterator incit = incs.begin(); incit != incs.end(); ++incit) {
|
|
||||||
QString inc = (*incit).toQString();
|
|
||||||
inc.replace(QRegExp("\\\\$"), "");
|
|
||||||
-
|
|
||||||
- if (!isystem.isEmpty() && isSystemInclude(inc))
|
|
||||||
- t << isystem << ' ';
|
|
||||||
- else
|
|
||||||
- t << "-I";
|
|
||||||
- t << escapeFilePath(inc) << ' ';
|
|
||||||
+ t << "-I" << escapeFilePath(inc) << ' ';
|
|
||||||
}
|
|
||||||
t << endl;
|
|
||||||
}
|
|
||||||
--
|
|
||||||
2.7.4
|
|
||||||
|
|
||||||
@@ -2,8 +2,8 @@
|
|||||||
# Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv)
|
# Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv)
|
||||||
|
|
||||||
PKG_NAME="RPi.GPIO"
|
PKG_NAME="RPi.GPIO"
|
||||||
PKG_VERSION="0.6.3"
|
PKG_VERSION="0.7.0"
|
||||||
PKG_SHA256="a5fc0eb5e401963b6c0a03650da6b42c4005f02d962b81241d96c98d0a578516"
|
PKG_SHA256="7424bc6c205466764f30f666c18187a0824077daf20b295c42f08aea2cb87d3f"
|
||||||
PKG_ARCH="arm"
|
PKG_ARCH="arm"
|
||||||
PKG_LICENSE="MIT"
|
PKG_LICENSE="MIT"
|
||||||
PKG_SITE="http://sourceforge.net/p/raspberry-gpio-python/"
|
PKG_SITE="http://sourceforge.net/p/raspberry-gpio-python/"
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ PKG_SHA256="dd779b6992de37995555e1d54caf0716a694765efc65480eed2c713105ab46fe"
|
|||||||
PKG_LICENSE="GPL"
|
PKG_LICENSE="GPL"
|
||||||
PKG_SITE="http://www.liblognorm.com"
|
PKG_SITE="http://www.liblognorm.com"
|
||||||
PKG_URL="https://github.com/rsyslog/liblognorm/archive/v$PKG_VERSION.tar.gz"
|
PKG_URL="https://github.com/rsyslog/liblognorm/archive/v$PKG_VERSION.tar.gz"
|
||||||
PKG_DEPENDS_TARGET="toolchain libestr"
|
PKG_DEPENDS_TARGET="toolchain libestr libfastjson"
|
||||||
PKG_TOOLCHAIN="autotools"
|
PKG_TOOLCHAIN="autotools"
|
||||||
PKG_LONGDESC="A fast samples-based log normalization library."
|
PKG_LONGDESC="A fast samples-based log normalization library."
|
||||||
|
|
||||||
|
|||||||
@@ -3,8 +3,8 @@
|
|||||||
# Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv)
|
# Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv)
|
||||||
|
|
||||||
PKG_NAME="runc"
|
PKG_NAME="runc"
|
||||||
PKG_VERSION="v1.0.0-rc7"
|
PKG_VERSION="v1.0.0-rc8"
|
||||||
PKG_SHA256="e8388b812d93a8a131a2a2fdd851847295c8e341721002940dadd2999fb81b51"
|
PKG_SHA256="efe4ff9bbe49b19074346d65c914d809c0a3e90d062ea9619fe240f931f0b700"
|
||||||
PKG_LICENSE="APL"
|
PKG_LICENSE="APL"
|
||||||
PKG_SITE="https://github.com/opencontainers/runc"
|
PKG_SITE="https://github.com/opencontainers/runc"
|
||||||
PKG_URL="https://github.com/opencontainers/runc/archive/${PKG_VERSION}.tar.gz"
|
PKG_URL="https://github.com/opencontainers/runc/archive/${PKG_VERSION}.tar.gz"
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ PKG_ARCH="x86_64"
|
|||||||
PKG_LICENSE="LGPL"
|
PKG_LICENSE="LGPL"
|
||||||
PKG_SITE="https://github.com/rhboot/efivar"
|
PKG_SITE="https://github.com/rhboot/efivar"
|
||||||
PKG_URL="https://github.com/rhboot/efivar/archive/$PKG_VERSION.tar.gz"
|
PKG_URL="https://github.com/rhboot/efivar/archive/$PKG_VERSION.tar.gz"
|
||||||
|
PKG_DEPENDS_HOST="gcc:host"
|
||||||
PKG_DEPENDS_TARGET="toolchain efivar:host"
|
PKG_DEPENDS_TARGET="toolchain efivar:host"
|
||||||
PKG_LONGDESC="Tools and library to manipulate EFI variables."
|
PKG_LONGDESC="Tools and library to manipulate EFI variables."
|
||||||
|
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ PKG_SHA256="acc16f878576ad0bb29bbb7c724e29d2827f14ddb39fe94d76c3a859d4a3d0d9"
|
|||||||
PKG_LICENSE="BSD"
|
PKG_LICENSE="BSD"
|
||||||
PKG_SITE="http://www.darwinsys.com/file/"
|
PKG_SITE="http://www.darwinsys.com/file/"
|
||||||
PKG_URL="https://github.com/file/file/archive/${PKG_VERSION}.tar.gz"
|
PKG_URL="https://github.com/file/file/archive/${PKG_VERSION}.tar.gz"
|
||||||
PKG_DEPENDS_HOST="ccache:host"
|
PKG_DEPENDS_HOST="toolchain"
|
||||||
PKG_DEPENDS_TARGET="toolchain file:host zlib"
|
PKG_DEPENDS_TARGET="toolchain file:host zlib"
|
||||||
PKG_LONGDESC="The file utility is used to determine the types of various files."
|
PKG_LONGDESC="The file utility is used to determine the types of various files."
|
||||||
PKG_TOOLCHAIN="autotools"
|
PKG_TOOLCHAIN="autotools"
|
||||||
|
|||||||
@@ -0,0 +1,24 @@
|
|||||||
|
From c4c59790f3191c1a233fc1a61f8fedad85de1aeb Mon Sep 17 00:00:00 2001
|
||||||
|
From: Peter Fink <pfink@christ-es.de>
|
||||||
|
Date: Wed, 8 Feb 2017 14:04:45 +0100
|
||||||
|
Subject: [PATCH] fbutils: Fix x64 execution. Call malloc not with a hardcoded
|
||||||
|
sizeof(__u32). This caused the application to crash with segfaults on x64
|
||||||
|
machines.
|
||||||
|
|
||||||
|
---
|
||||||
|
tests/fbutils.c | 2 +-
|
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/tests/fbutils.c b/tests/fbutils.c
|
||||||
|
index 8ee494bc..fd7fbfe9 100644
|
||||||
|
--- a/tests/fbutils.c
|
||||||
|
+++ b/tests/fbutils.c
|
||||||
|
@@ -138,7 +138,7 @@ int open_framebuffer(void)
|
||||||
|
memset(fbuffer,0,fix.smem_len);
|
||||||
|
|
||||||
|
bytes_per_pixel = (var.bits_per_pixel + 7) / 8;
|
||||||
|
- line_addr = malloc (sizeof (__u32) * var.yres_virtual);
|
||||||
|
+ line_addr = malloc (sizeof (line_addr) * var.yres_virtual);
|
||||||
|
addr = 0;
|
||||||
|
for (y = 0; y < var.yres_virtual; y++, addr += fix.line_length)
|
||||||
|
line_addr [y] = fbuffer + addr;
|
||||||
@@ -2,8 +2,8 @@
|
|||||||
# Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv)
|
# Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv)
|
||||||
|
|
||||||
PKG_NAME="tvh-dtv-scan-tables"
|
PKG_NAME="tvh-dtv-scan-tables"
|
||||||
PKG_VERSION="68f86b42272fc364cdd53d7cfeaa2a78d676dbfa"
|
PKG_VERSION="6bb0a70a0dcb97d5457c1ef4a7ccce634ea419b0"
|
||||||
PKG_SHA256="2bb102094696bbaf440b9319a9e8a4c93e2ecbcf2d2c556fb719b1febf1a7d3b"
|
PKG_SHA256="a5f375d28e52ff3f527fecb7968f3ede6bc2e128d1ad78537ab4f0f7844edb45"
|
||||||
PKG_LICENSE="GPL"
|
PKG_LICENSE="GPL"
|
||||||
PKG_SITE="https://github.com/tvheadend"
|
PKG_SITE="https://github.com/tvheadend"
|
||||||
PKG_URL="https://github.com/tvheadend/dtv-scan-tables/archive/$PKG_VERSION.tar.gz"
|
PKG_URL="https://github.com/tvheadend/dtv-scan-tables/archive/$PKG_VERSION.tar.gz"
|
||||||
|
|||||||
@@ -3,8 +3,8 @@
|
|||||||
# Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv)
|
# Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv)
|
||||||
|
|
||||||
PKG_NAME="vdr-plugin-epgsearch"
|
PKG_NAME="vdr-plugin-epgsearch"
|
||||||
PKG_VERSION="84b59b81137887a48533cc897551bccf2e9e10f6"
|
PKG_VERSION="770de32f1908b1f9c60f66bf288a4c8a03f97d52"
|
||||||
PKG_SHA256="d6c4a9136588a7cdf2eb43b6b9643a5bb81a44c542c6e6fcf7448b2383901914"
|
PKG_SHA256="8b6144ee3d22b0c13ba81be94920b421b05fd9b921dfe8245ed582db407acac8"
|
||||||
PKG_LICENSE="GPL"
|
PKG_LICENSE="GPL"
|
||||||
PKG_SITE="http://winni.vdr-developer.org/epgsearch/"
|
PKG_SITE="http://winni.vdr-developer.org/epgsearch/"
|
||||||
PKG_URL="https://github.com/vdr-projects/vdr-plugin-epgsearch/archive/$PKG_VERSION.tar.gz"
|
PKG_URL="https://github.com/vdr-projects/vdr-plugin-epgsearch/archive/$PKG_VERSION.tar.gz"
|
||||||
|
|||||||
@@ -2,8 +2,8 @@
|
|||||||
# Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv)
|
# Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv)
|
||||||
|
|
||||||
PKG_NAME="vdr-plugin-robotv"
|
PKG_NAME="vdr-plugin-robotv"
|
||||||
PKG_VERSION="50d4bdcdbe3bdb6e85fe02de4c4086ca1f8db94d"
|
PKG_VERSION="13b691af63743ce6481e2558dc50ee89dd7a0349"
|
||||||
PKG_SHA256="062489e55111f0ba2420463cc506865ac59b1c1d080b318cb81d58ec3f4fbd3f"
|
PKG_SHA256="1bd508383d3b393dd1273af9bef07a1a64ac22c8eada85c96e5aa541c3abf228"
|
||||||
PKG_LICENSE="GPL"
|
PKG_LICENSE="GPL"
|
||||||
PKG_SITE="https://github.com/pipelka/roboTV"
|
PKG_SITE="https://github.com/pipelka/roboTV"
|
||||||
PKG_URL="https://github.com/pipelka/vdr-plugin-robotv/archive/$PKG_VERSION.tar.gz"
|
PKG_URL="https://github.com/pipelka/vdr-plugin-robotv/archive/$PKG_VERSION.tar.gz"
|
||||||
|
|||||||
@@ -3,8 +3,8 @@
|
|||||||
# Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv)
|
# Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv)
|
||||||
|
|
||||||
PKG_NAME="vdr-plugin-satip"
|
PKG_NAME="vdr-plugin-satip"
|
||||||
PKG_VERSION="a4051bf88c1f3c86cfe5133fd703517296f7f590"
|
PKG_VERSION="b697e435d4bf42754309e6b5a9c5f8ff43463077"
|
||||||
PKG_SHA256="ea9f930b829e4c333f8401e64b5e03a82efb88a4c6db3320463b295d297b0035"
|
PKG_SHA256="9ccb90b4b55848bad738236e07e0feb2af9e78e6c9ee6614b5a1172db3e00fb0"
|
||||||
PKG_LICENSE="GPL"
|
PKG_LICENSE="GPL"
|
||||||
PKG_SITE="http://www.saunalahti.fi/~rahrenbe/vdr/satip/"
|
PKG_SITE="http://www.saunalahti.fi/~rahrenbe/vdr/satip/"
|
||||||
PKG_URL="https://github.com/rofafor/vdr-plugin-satip/archive/$PKG_VERSION.tar.gz"
|
PKG_URL="https://github.com/rofafor/vdr-plugin-satip/archive/$PKG_VERSION.tar.gz"
|
||||||
|
|||||||
@@ -4,11 +4,11 @@
|
|||||||
# Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv)
|
# Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv)
|
||||||
|
|
||||||
PKG_NAME="vdr"
|
PKG_NAME="vdr"
|
||||||
PKG_VERSION="2.4.0"
|
PKG_VERSION="2.4.1"
|
||||||
PKG_SHA256="93af49fe87048073dc38ef5e6c71e9704344d730f21c261afac69e3c937f8cce"
|
PKG_SHA256="25c3f835c4f3ff92cd2db10c004439ef22c2e895193c77fbe8cc7eac4858a1dc"
|
||||||
PKG_LICENSE="GPL"
|
PKG_LICENSE="GPL"
|
||||||
PKG_SITE="http://www.tvdr.de"
|
PKG_SITE="http://www.tvdr.de"
|
||||||
PKG_URL="ftp://ftp.tvdr.de/vdr/vdr-$PKG_VERSION.tar.bz2"
|
PKG_URL="http://ftp.tvdr.de/vdr-$PKG_VERSION.tar.bz2"
|
||||||
PKG_DEPENDS_TARGET="toolchain bzip2 fontconfig freetype libcap libiconv libjpeg-turbo"
|
PKG_DEPENDS_TARGET="toolchain bzip2 fontconfig freetype libcap libiconv libjpeg-turbo"
|
||||||
PKG_LONGDESC="A DVB TV server application."
|
PKG_LONGDESC="A DVB TV server application."
|
||||||
PKG_TOOLCHAIN="manual"
|
PKG_TOOLCHAIN="manual"
|
||||||
|
|||||||
@@ -1,46 +0,0 @@
|
|||||||
ftp://ftp.tvdr.de/vdr/Developer/Patches/vdr-2.4/
|
|
||||||
|
|
||||||
# This patch fixes a bug in handling the tfRecording flag in the SVDRP commands MODT
|
|
||||||
# and UPDT. The tfRecording flag must only be handled by the VDR that actually hosts
|
|
||||||
# and processes the timer.
|
|
||||||
#
|
|
||||||
--- a/svdrp.c 2018/03/19 12:16:33 5.0
|
|
||||||
+++ b/svdrp.c 2018/04/19 09:45:08
|
|
||||||
@@ -2036,6 +2036,7 @@
|
|
||||||
LOCK_TIMERS_WRITE;
|
|
||||||
Timers->SetExplicitModify();
|
|
||||||
if (cTimer *Timer = Timers->GetById(Id)) {
|
|
||||||
+ bool IsRecording = Timer->HasFlags(tfRecording);
|
|
||||||
cTimer t = *Timer;
|
|
||||||
if (strcasecmp(tail, "ON") == 0)
|
|
||||||
t.SetFlags(tfActive);
|
|
||||||
@@ -2046,6 +2047,10 @@
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
*Timer = t;
|
|
||||||
+ if (IsRecording)
|
|
||||||
+ Timer->SetFlags(tfRecording);
|
|
||||||
+ else
|
|
||||||
+ Timer->ClrFlags(tfRecording);
|
|
||||||
Timers->SetModified();
|
|
||||||
isyslog("SVDRP %s < %s modified timer %s (%s)", Setup.SVDRPHostName, *clientName, *Timer->ToDescr(), Timer->HasFlags(tfActive) ? "active" : "inactive");
|
|
||||||
Reply(250, "%d %s", Timer->Id(), *Timer->ToText(true));
|
|
||||||
@@ -2478,12 +2483,18 @@
|
|
||||||
if (Timer->Parse(Option)) {
|
|
||||||
LOCK_TIMERS_WRITE;
|
|
||||||
if (cTimer *t = Timers->GetTimer(Timer)) {
|
|
||||||
+ bool IsRecording = t->HasFlags(tfRecording);
|
|
||||||
t->Parse(Option);
|
|
||||||
delete Timer;
|
|
||||||
Timer = t;
|
|
||||||
+ if (IsRecording)
|
|
||||||
+ Timer->SetFlags(tfRecording);
|
|
||||||
+ else
|
|
||||||
+ Timer->ClrFlags(tfRecording);
|
|
||||||
isyslog("SVDRP %s < %s updated timer %s", Setup.SVDRPHostName, *clientName, *Timer->ToDescr());
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
+ Timer->ClrFlags(tfRecording);
|
|
||||||
Timers->Add(Timer);
|
|
||||||
isyslog("SVDRP %s < %s added timer %s", Setup.SVDRPHostName, *clientName, *Timer->ToDescr());
|
|
||||||
}
|
|
||||||
@@ -1,48 +0,0 @@
|
|||||||
# This patch fixes a possible invalid locking sequence in case a remote timer handling error message
|
|
||||||
# is displayed on the OSD and the skin tries to lock the Recordings or DeletedRecordings
|
|
||||||
# list in its Flush() function (for instance by calling cVideoDiskUsage::HasChanged()).
|
|
||||||
# To do this, the call to Skins.Message() in menu.c's HandleRemoteModifications() has
|
|
||||||
# been changed to Skins.QueueMessage(), and cSkins::ProcessQueuedMessages() is now called
|
|
||||||
# unconditionally in the main loop, and checks whether the current cSkinDisplay object
|
|
||||||
# (if any) implements SetMessage().
|
|
||||||
#
|
|
||||||
--- 1/menu.c 2018/04/14 10:24:41 5.0
|
|
||||||
+++ 1/menu.c 2018/04/28 12:09:45
|
|
||||||
@@ -1075,7 +1075,7 @@
|
|
||||||
{
|
|
||||||
cString ErrorMessage;
|
|
||||||
if (!HandleRemoteTimerModifications(NewTimer, OldTimer, &ErrorMessage)) {
|
|
||||||
- Skins.Message(mtError, ErrorMessage);
|
|
||||||
+ Skins.QueueMessage(mtError, ErrorMessage);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
--- 1/skins.c 2013/08/18 12:07:22 5.0
|
|
||||||
+++ 1/skins.c 2018/04/28 12:13:01
|
|
||||||
@@ -352,6 +352,14 @@
|
|
||||||
dsyslog("cSkins::ProcessQueuedMessages() called from background thread - ignored!");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
+ // Check whether there is a cSkinDisplay object (if any) that implements SetMessage():
|
|
||||||
+ if (cSkinDisplay *sd = cSkinDisplay::Current()) {
|
|
||||||
+ if (!(dynamic_cast<cSkinDisplayChannel *>(sd) ||
|
|
||||||
+ dynamic_cast<cSkinDisplayMenu *>(sd) ||
|
|
||||||
+ dynamic_cast<cSkinDisplayReplay *>(sd) ||
|
|
||||||
+ dynamic_cast<cSkinDisplayMessage *>(sd)))
|
|
||||||
+ return;
|
|
||||||
+ }
|
|
||||||
cSkinQueuedMessage *msg = NULL;
|
|
||||||
// Get the first waiting message:
|
|
||||||
queueMessageMutex.Lock();
|
|
||||||
--- 1/vdr.c 2018/04/10 13:24:43 5.0
|
|
||||||
+++ 1/vdr.c 2018/04/28 11:27:48
|
|
||||||
@@ -1176,8 +1176,7 @@
|
|
||||||
if (!Menu && !cOsd::IsOpen())
|
|
||||||
Menu = CamControl();
|
|
||||||
// Queued messages:
|
|
||||||
- if (!Skins.IsOpen())
|
|
||||||
- Skins.ProcessQueuedMessages();
|
|
||||||
+ Skins.ProcessQueuedMessages();
|
|
||||||
// User Input:
|
|
||||||
cOsdObject *Interact = Menu ? Menu : cControl::Control();
|
|
||||||
eKeys key = Interface->GetKey(!Interact || !Interact->NeedsFastResponse());
|
|
||||||
@@ -1,89 +0,0 @@
|
|||||||
# Fixed locking the Channels list in cDisplayChannel, where the lock was still held
|
|
||||||
# when Flush() was called.
|
|
||||||
#
|
|
||||||
--- 1/menu.c 2018/04/28 12:09:45 5.1
|
|
||||||
+++ 1/menu.c 2018/05/06 09:30:11
|
|
||||||
@@ -4626,14 +4626,17 @@
|
|
||||||
cOsdProvider::OsdSizeChanged(osdState); // just to get the current state
|
|
||||||
positioner = NULL;
|
|
||||||
channel = NULL;
|
|
||||||
- LOCK_CHANNELS_READ;
|
|
||||||
- channel = Channels->GetByNumber(Number);
|
|
||||||
- lastPresent = lastFollowing = NULL;
|
|
||||||
- if (channel) {
|
|
||||||
- DisplayChannel();
|
|
||||||
- DisplayInfo();
|
|
||||||
+ {
|
|
||||||
+ LOCK_CHANNELS_READ;
|
|
||||||
+ channel = Channels->GetByNumber(Number);
|
|
||||||
+ lastPresent = lastFollowing = NULL;
|
|
||||||
+ if (channel) {
|
|
||||||
+ DisplayChannel();
|
|
||||||
+ DisplayInfo();
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+ if (channel)
|
|
||||||
displayChannel->Flush();
|
|
||||||
- }
|
|
||||||
lastTime.Set();
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -4868,31 +4871,33 @@
|
|
||||||
}
|
|
||||||
};
|
|
||||||
if (positioner || !timeout || lastTime.Elapsed() < (uint64_t)(Setup.ChannelInfoTime * 1000)) {
|
|
||||||
- LOCK_CHANNELS_READ;
|
|
||||||
- if (Key == kNone && !number && group < 0 && !NewChannel && channel && channel->Number() != cDevice::CurrentChannel()) {
|
|
||||||
- // makes sure a channel switch through the SVDRP CHAN command is displayed
|
|
||||||
- channel = Channels->GetByNumber(cDevice::CurrentChannel());
|
|
||||||
- Refresh();
|
|
||||||
- lastTime.Set();
|
|
||||||
- }
|
|
||||||
- DisplayInfo();
|
|
||||||
- if (NewChannel) {
|
|
||||||
- SetTrackDescriptions(NewChannel->Number()); // to make them immediately visible in the channel display
|
|
||||||
- Channels->SwitchTo(NewChannel->Number());
|
|
||||||
- SetTrackDescriptions(NewChannel->Number()); // switching the channel has cleared them
|
|
||||||
- channel = NewChannel;
|
|
||||||
- }
|
|
||||||
- const cPositioner *Positioner = cDevice::ActualDevice()->Positioner();
|
|
||||||
- bool PositionerMoving = Positioner && Positioner->IsMoving();
|
|
||||||
- SetNeedsFastResponse(PositionerMoving);
|
|
||||||
- if (!PositionerMoving) {
|
|
||||||
- if (positioner)
|
|
||||||
- lastTime.Set(); // to keep the channel display up a few seconds after the target position has been reached
|
|
||||||
- Positioner = NULL;
|
|
||||||
- }
|
|
||||||
- if (Positioner || positioner) // making sure we call SetPositioner(NULL) if there is a switch from "with" to "without" positioner
|
|
||||||
- displayChannel->SetPositioner(Positioner);
|
|
||||||
- positioner = Positioner;
|
|
||||||
+ {
|
|
||||||
+ LOCK_CHANNELS_READ;
|
|
||||||
+ if (Key == kNone && !number && group < 0 && !NewChannel && channel && channel->Number() != cDevice::CurrentChannel()) {
|
|
||||||
+ // makes sure a channel switch through the SVDRP CHAN command is displayed
|
|
||||||
+ channel = Channels->GetByNumber(cDevice::CurrentChannel());
|
|
||||||
+ Refresh();
|
|
||||||
+ lastTime.Set();
|
|
||||||
+ }
|
|
||||||
+ DisplayInfo();
|
|
||||||
+ if (NewChannel) {
|
|
||||||
+ SetTrackDescriptions(NewChannel->Number()); // to make them immediately visible in the channel display
|
|
||||||
+ Channels->SwitchTo(NewChannel->Number());
|
|
||||||
+ SetTrackDescriptions(NewChannel->Number()); // switching the channel has cleared them
|
|
||||||
+ channel = NewChannel;
|
|
||||||
+ }
|
|
||||||
+ const cPositioner *Positioner = cDevice::ActualDevice()->Positioner();
|
|
||||||
+ bool PositionerMoving = Positioner && Positioner->IsMoving();
|
|
||||||
+ SetNeedsFastResponse(PositionerMoving);
|
|
||||||
+ if (!PositionerMoving) {
|
|
||||||
+ if (positioner)
|
|
||||||
+ lastTime.Set(); // to keep the channel display up a few seconds after the target position has been reached
|
|
||||||
+ Positioner = NULL;
|
|
||||||
+ }
|
|
||||||
+ if (Positioner || positioner) // making sure we call SetPositioner(NULL) if there is a switch from "with" to "without" positioner
|
|
||||||
+ displayChannel->SetPositioner(Positioner);
|
|
||||||
+ positioner = Positioner;
|
|
||||||
+ }
|
|
||||||
displayChannel->Flush();
|
|
||||||
return osContinue;
|
|
||||||
}
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
# Fixed locking the Channels list in cDisplayChannel, where the lock was still held
|
|
||||||
# when Flush() was called (cont'd).
|
|
||||||
#
|
|
||||||
--- 1/menu.c 2018/05/06 09:30:11 5.2
|
|
||||||
+++ 1/menu.c 2018/05/27 09:51:56 5.3
|
|
||||||
@@ -4654,8 +4654,10 @@
|
|
||||||
displayChannel = Skins.Current()->DisplayChannel(withInfo);
|
|
||||||
positioner = NULL;
|
|
||||||
channel = NULL;
|
|
||||||
- LOCK_CHANNELS_READ;
|
|
||||||
- channel = Channels->GetByNumber(cDevice::CurrentChannel());
|
|
||||||
+ {
|
|
||||||
+ LOCK_CHANNELS_READ;
|
|
||||||
+ channel = Channels->GetByNumber(cDevice::CurrentChannel());
|
|
||||||
+ }
|
|
||||||
ProcessKey(FirstKey);
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,33 +0,0 @@
|
|||||||
# Fixed shutdown after user inactivity in case a plugin is keeping the OSD open.
|
|
||||||
#
|
|
||||||
--- a/vdr.c 2018/04/28 11:27:48 5.1
|
|
||||||
+++ b/vdr.c 2018/07/16 08:52:40 5.2
|
|
||||||
@@ -1514,9 +1514,7 @@
|
|
||||||
ShutdownHandler.countdown.Cancel();
|
|
||||||
}
|
|
||||||
|
|
||||||
- if ((Now - LastInteract) > ACTIVITYTIMEOUT && !cRecordControls::Active() && !RecordingsHandler.Active() && (Now - cRemote::LastActivity()) > ACTIVITYTIMEOUT) {
|
|
||||||
- // Handle housekeeping tasks
|
|
||||||
-
|
|
||||||
+ if (!cRecordControls::Active() && !RecordingsHandler.Active() && (Now - cRemote::LastActivity()) > ACTIVITYTIMEOUT) {
|
|
||||||
// Shutdown:
|
|
||||||
// Check whether VDR will be ready for shutdown in SHUTDOWNWAIT seconds:
|
|
||||||
time_t Soon = Now + SHUTDOWNWAIT;
|
|
||||||
@@ -1535,7 +1533,8 @@
|
|
||||||
// Do this again a bit later:
|
|
||||||
ShutdownHandler.SetRetry(SHUTDOWNRETRY);
|
|
||||||
}
|
|
||||||
-
|
|
||||||
+ // Handle housekeeping tasks
|
|
||||||
+ if ((Now - LastInteract) > ACTIVITYTIMEOUT) {
|
|
||||||
// Disk housekeeping:
|
|
||||||
RemoveDeletedRecordings();
|
|
||||||
ListGarbageCollector.Purge();
|
|
||||||
@@ -1543,6 +1542,7 @@
|
|
||||||
// Plugins housekeeping:
|
|
||||||
PluginManager.Housekeeping();
|
|
||||||
}
|
|
||||||
+ }
|
|
||||||
|
|
||||||
ReportEpgBugFixStats();
|
|
||||||
|
|
||||||
@@ -1,31 +0,0 @@
|
|||||||
# Fixed switching through encrypted channels with the Up/Down keys
|
|
||||||
#
|
|
||||||
--- a/device.c 2018/03/24 09:49:14 5.0
|
|
||||||
+++ b/device.c 2018/07/16 09:29:57
|
|
||||||
@@ -787,6 +787,7 @@
|
|
||||||
if (LiveView) {
|
|
||||||
isyslog("switching to channel %d %s (%s)", Channel->Number(), *Channel->GetChannelID().ToString(), Channel->Name());
|
|
||||||
cControl::Shutdown(); // prevents old channel from being shown too long if GetDevice() takes longer
|
|
||||||
+ // and, if decrypted, this removes the now superflous PIDs from the CAM, too
|
|
||||||
}
|
|
||||||
for (int i = 3; i--;) {
|
|
||||||
switch (SetChannel(Channel, LiveView)) {
|
|
||||||
@@ -809,6 +810,7 @@
|
|
||||||
Direction = sgn(Direction);
|
|
||||||
if (Direction) {
|
|
||||||
cControl::Shutdown(); // prevents old channel from being shown too long if GetDevice() takes longer
|
|
||||||
+ // and, if decrypted, this removes the now superflous PIDs from the CAM, too
|
|
||||||
int n = CurrentChannel() + Direction;
|
|
||||||
int first = n;
|
|
||||||
LOCK_CHANNELS_READ;
|
|
||||||
--- a/menu.c 2018/05/27 09:51:56 5.3
|
|
||||||
+++ b/menu.c 2018/07/16 09:29:57
|
|
||||||
@@ -4704,6 +4704,8 @@
|
|
||||||
const cChannel *cDisplayChannel::NextAvailableChannel(const cChannel *Channel, int Direction)
|
|
||||||
{
|
|
||||||
if (Direction) {
|
|
||||||
+ cControl::Shutdown(); // prevents old channel from being shown too long if GetDevice() takes longer
|
|
||||||
+ // and, if decrypted, this removes the now superflous PIDs from the CAM, too
|
|
||||||
LOCK_CHANNELS_READ;
|
|
||||||
while (Channel) {
|
|
||||||
Channel = Direction > 0 ? Channels->Next(Channel) : Channels->Prev(Channel);
|
|
||||||
@@ -1,13 +0,0 @@
|
|||||||
# Now deactivating MTD support if a non MCD capable CAM is inserted after removing
|
|
||||||
# a previously used CAM that is MCD capable.
|
|
||||||
#
|
|
||||||
--- a/ci.c 2018/03/19 16:37:03 5.0
|
|
||||||
+++ b/ci.c 2018/09/23 10:17:20
|
|
||||||
@@ -1213,6 +1213,7 @@
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
dsyslog("CAM %d: doesn't reply to QUERY - only a single channel can be decrypted", CamSlot()->SlotNumber());
|
|
||||||
+ CamSlot()->MtdActivate(false);
|
|
||||||
state = 4; // normal operation
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
# SPDX-License-Identifier: GPL-2.0-or-later
|
# SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
# Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv)
|
# Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv)
|
||||||
|
# Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv)
|
||||||
|
|
||||||
PKG_NAME="sundtek-mediatv"
|
PKG_NAME="sundtek-mediatv"
|
||||||
PKG_VERSION="7.0"
|
PKG_VERSION="7.0"
|
||||||
@@ -8,7 +9,7 @@ PKG_ARCH="any"
|
|||||||
PKG_LICENSE="nonfree"
|
PKG_LICENSE="nonfree"
|
||||||
PKG_SITE="http://support.sundtek.com/"
|
PKG_SITE="http://support.sundtek.com/"
|
||||||
PKG_URL=""
|
PKG_URL=""
|
||||||
PKG_DEPENDS_TARGET=""
|
PKG_DEPENDS_TARGET="xmlstarlet:host p7zip:host"
|
||||||
PKG_SECTION="driver/dvb"
|
PKG_SECTION="driver/dvb"
|
||||||
PKG_SHORTDESC="Sundtek MediaTV: a Linux driver to add support for SUNDTEK USB DVB devices"
|
PKG_SHORTDESC="Sundtek MediaTV: a Linux driver to add support for SUNDTEK USB DVB devices"
|
||||||
PKG_LONGDESC="Install this to add support for Sundtek USB DVB devices."
|
PKG_LONGDESC="Install this to add support for Sundtek USB DVB devices."
|
||||||
|
|||||||
@@ -1,8 +0,0 @@
|
|||||||
102
|
|
||||||
- rebuild for 8.1
|
|
||||||
|
|
||||||
101
|
|
||||||
- switched to new official Kodinerds repo
|
|
||||||
|
|
||||||
100
|
|
||||||
- initial LibreELEC version
|
|
||||||
Binary file not shown.
|
Before Width: | Height: | Size: 68 KiB |
@@ -1,30 +0,0 @@
|
|||||||
# SPDX-License-Identifier: GPL-2.0
|
|
||||||
# Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv)
|
|
||||||
|
|
||||||
PKG_NAME="repository.kodinerds"
|
|
||||||
PKG_VERSION="9.0"
|
|
||||||
PKG_REV="103"
|
|
||||||
PKG_ARCH="any"
|
|
||||||
PKG_LICENSE="GPL"
|
|
||||||
PKG_SITE="http://www.kodinerds.net"
|
|
||||||
PKG_URL=""
|
|
||||||
PKG_DEPENDS_TARGET="toolchain"
|
|
||||||
PKG_SECTION=""
|
|
||||||
PKG_SHORTDESC="Kodinerds add-on repository"
|
|
||||||
PKG_LONGDESC="Kodinerds add-on repository"
|
|
||||||
PKG_TOOLCHAIN="manual"
|
|
||||||
|
|
||||||
PKG_IS_ADDON="yes"
|
|
||||||
PKG_ADDON_NAME="Kodinerds Repository"
|
|
||||||
PKG_ADDON_TYPE="xbmc.addon.repository"
|
|
||||||
|
|
||||||
make_target() {
|
|
||||||
sed -e "s|@PKG_VERSION@|$PKG_VERSION|g" \
|
|
||||||
-e "s|@PKG_REV@|$PKG_REV|g" \
|
|
||||||
-i addon.xml
|
|
||||||
}
|
|
||||||
|
|
||||||
addon() {
|
|
||||||
mkdir -p $ADDON_BUILD/$PKG_ADDON_ID
|
|
||||||
cp -R $PKG_BUILD/* $ADDON_BUILD/$PKG_ADDON_ID
|
|
||||||
}
|
|
||||||
@@ -1,26 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
|
||||||
<addon id="repository.kodinerds"
|
|
||||||
name="Kodinerds Add-ons"
|
|
||||||
version="@PKG_VERSION@.@PKG_REV@"
|
|
||||||
provider-name="Kodinerds.net">
|
|
||||||
<requires>
|
|
||||||
<import addon="xbmc.addon" version="12.0.0"/>
|
|
||||||
</requires>
|
|
||||||
<extension point="xbmc.addon.repository" name="L0RE">
|
|
||||||
<info compressed="true">https://raw.githubusercontent.com/kodinerds/repo/master/addons.xml</info>
|
|
||||||
<checksum>https://raw.githubusercontent.com/kodinerds/repo/master/addons.xml.md5</checksum>
|
|
||||||
<datadir zip="true">https://raw.githubusercontent.com/kodinerds/repo/master/</datadir>
|
|
||||||
</extension>
|
|
||||||
<extension point="xbmc.addon.metadata">
|
|
||||||
<summary>Install add-ons from Kodinerds</summary>
|
|
||||||
<summary lang="de">Installiere Add-ons von Kodinerds</summary>
|
|
||||||
<description>Download and install add-ons from Kodinerds repository.</description>
|
|
||||||
<description lang="de">Downloade und installiere Add-ons von der Kodinerds Repository.</description>
|
|
||||||
<disclaimer></disclaimer>
|
|
||||||
<platform>all</platform>
|
|
||||||
<assets>
|
|
||||||
<icon>resources/icon.png</icon>
|
|
||||||
<fanart>resources/fanart.png</fanart>
|
|
||||||
</assets>
|
|
||||||
</extension>
|
|
||||||
</addon>
|
|
||||||
@@ -5,7 +5,6 @@ PKG_NAME="repository.linuxserver.docker"
|
|||||||
PKG_VERSION="9.0"
|
PKG_VERSION="9.0"
|
||||||
PKG_REV="102"
|
PKG_REV="102"
|
||||||
PKG_ARCH="any"
|
PKG_ARCH="any"
|
||||||
PKG_ADDON_PROJECTS="any !WeTek_Core !WeTek_Play"
|
|
||||||
PKG_LICENSE="GPL"
|
PKG_LICENSE="GPL"
|
||||||
PKG_SITE="https://linuxserver.io"
|
PKG_SITE="https://linuxserver.io"
|
||||||
PKG_URL=""
|
PKG_URL=""
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
# SPDX-License-Identifier: GPL-2.0-or-later
|
# SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
# Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv)
|
# Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv)
|
||||||
|
# Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv)
|
||||||
|
|
||||||
PKG_NAME="script.config.vdr"
|
PKG_NAME="script.config.vdr"
|
||||||
PKG_VERSION="0345a2a3b98de48cbbaf77768ca6c9289f531e2b"
|
PKG_VERSION="0345a2a3b98de48cbbaf77768ca6c9289f531e2b"
|
||||||
@@ -9,7 +10,7 @@ PKG_ARCH="any"
|
|||||||
PKG_LICENSE="OSS"
|
PKG_LICENSE="OSS"
|
||||||
PKG_SITE="https://libreelec.tv"
|
PKG_SITE="https://libreelec.tv"
|
||||||
PKG_URL="https://github.com/LibreELEC/script.config.vdr/archive/$PKG_VERSION.tar.gz"
|
PKG_URL="https://github.com/LibreELEC/script.config.vdr/archive/$PKG_VERSION.tar.gz"
|
||||||
PKG_DEPENDS_TARGET=""
|
PKG_DEPENDS_TARGET="xmlstarlet:host p7zip:host"
|
||||||
PKG_SECTION=""
|
PKG_SECTION=""
|
||||||
PKG_SHORTDESC="script.config.vdr"
|
PKG_SHORTDESC="script.config.vdr"
|
||||||
PKG_LONGDESC="script.config.vdr"
|
PKG_LONGDESC="script.config.vdr"
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
102
|
||||||
|
- Avoid LibreELEC Settings addon crash
|
||||||
|
|
||||||
101
|
101
|
||||||
- Fix log errors
|
- Fix log errors
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
PKG_NAME="bluetooth-audio"
|
PKG_NAME="bluetooth-audio"
|
||||||
PKG_VERSION="0"
|
PKG_VERSION="0"
|
||||||
PKG_REV="101"
|
PKG_REV="102"
|
||||||
PKG_ARCH="any"
|
PKG_ARCH="any"
|
||||||
PKG_LICENSE="GPL"
|
PKG_LICENSE="GPL"
|
||||||
PKG_SITE=""
|
PKG_SITE=""
|
||||||
|
|||||||
110
packages/addons/service/bluetooth-audio/source/bin/dbusservice.py
Executable file
110
packages/addons/service/bluetooth-audio/source/bin/dbusservice.py
Executable file
@@ -0,0 +1,110 @@
|
|||||||
|
#!/usr/bin/python2
|
||||||
|
# SPDX-License-Identifier: GPL-2.0
|
||||||
|
# Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv)
|
||||||
|
|
||||||
|
from __future__ import print_function
|
||||||
|
import sys
|
||||||
|
import dbus
|
||||||
|
import dbus.mainloop.glib
|
||||||
|
import gobject
|
||||||
|
import time
|
||||||
|
|
||||||
|
gobject.threads_init()
|
||||||
|
|
||||||
|
class BluetoothAudioClient(object):
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
|
||||||
|
self.devices = {}
|
||||||
|
self.signal_added = None
|
||||||
|
self.signal_removed = None
|
||||||
|
|
||||||
|
self._setup_loop()
|
||||||
|
self._setup_bus()
|
||||||
|
self._setup_signals()
|
||||||
|
|
||||||
|
def quit(self):
|
||||||
|
|
||||||
|
self.signal_added.remove()
|
||||||
|
self.signal_removed.remove()
|
||||||
|
|
||||||
|
self._loop.quit()
|
||||||
|
|
||||||
|
def _setup_loop(self):
|
||||||
|
|
||||||
|
self._loop = gobject.MainLoop()
|
||||||
|
|
||||||
|
def run(self):
|
||||||
|
self._loop.run()
|
||||||
|
|
||||||
|
def _setup_bus(self):
|
||||||
|
|
||||||
|
dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
|
||||||
|
self._bus = dbus.SystemBus()
|
||||||
|
|
||||||
|
def _setup_signals(self):
|
||||||
|
|
||||||
|
self.signal_added = self._bus.add_signal_receiver(handler_function=self.switch_audio,
|
||||||
|
signal_name='InterfacesAdded',
|
||||||
|
dbus_interface='org.freedesktop.DBus.ObjectManager',
|
||||||
|
bus_name='org.bluez',
|
||||||
|
member_keyword='signal')
|
||||||
|
|
||||||
|
self.signal_removed = self._bus.add_signal_receiver(handler_function=self.switch_audio,
|
||||||
|
signal_name='InterfacesRemoved',
|
||||||
|
dbus_interface='org.freedesktop.DBus.ObjectManager',
|
||||||
|
bus_name='org.bluez',
|
||||||
|
member_keyword='signal')
|
||||||
|
|
||||||
|
def switch_audio(self, *args, **kwargs):
|
||||||
|
|
||||||
|
device_path = args[0]
|
||||||
|
|
||||||
|
try:
|
||||||
|
if kwargs['signal'] == 'InterfacesAdded':
|
||||||
|
|
||||||
|
self.devices[device_path] = {
|
||||||
|
'Connected': '',
|
||||||
|
'Device': '',
|
||||||
|
'Class': '',
|
||||||
|
}
|
||||||
|
|
||||||
|
device = self._bus.get_object('org.bluez', device_path)
|
||||||
|
device_iface = dbus.Interface(device, dbus.PROPERTIES_IFACE)
|
||||||
|
self.devices[device_path]['Device'] = device_iface.Get('org.bluez.MediaTransport1', 'Device')
|
||||||
|
|
||||||
|
audio_device_path = self._bus.get_object('org.bluez', self.devices[device_path]['Device'])
|
||||||
|
audio_device_iface = dbus.Interface(audio_device_path, dbus.PROPERTIES_IFACE)
|
||||||
|
self.devices[device_path]['Class'] = audio_device_iface.Get('org.bluez.Device1', 'Class')
|
||||||
|
self.devices[device_path]['Connected'] = audio_device_iface.Get('org.bluez.Device1', 'Connected')
|
||||||
|
|
||||||
|
if self.devices[device_path]['Class'] & (1 << 21):
|
||||||
|
print('bluetooth')
|
||||||
|
sys.stdout.flush()
|
||||||
|
|
||||||
|
elif kwargs['signal'] == 'InterfacesRemoved':
|
||||||
|
if self.devices[device_path]['Device'] is not None and self.devices[device_path]['Class'] & (1 << 21):
|
||||||
|
audio_device_path = self._bus.get_object('org.bluez', self.devices[device_path]['Device'])
|
||||||
|
audio_device_iface = dbus.Interface(audio_device_path, dbus.PROPERTIES_IFACE)
|
||||||
|
self.devices[device_path]['Connected'] = audio_device_iface.Get('org.bluez.Device1', 'Connected')
|
||||||
|
|
||||||
|
while self.devices[device_path]['Connected']:
|
||||||
|
self.devices[device_path]['Connected'] = audio_device_iface.Get('org.bluez.Device1', 'Connected')
|
||||||
|
time.sleep(0.1)
|
||||||
|
|
||||||
|
for path in self.devices:
|
||||||
|
if self.devices[path]['Connected'] and self.devices[path]['Class'] & (1 << 21):
|
||||||
|
return
|
||||||
|
|
||||||
|
print('default')
|
||||||
|
sys.stdout.flush()
|
||||||
|
|
||||||
|
except (TypeError, KeyError, dbus.exceptions.DBusException) as e:
|
||||||
|
print('%s: ' % unicode(e), file=sys.stderr)
|
||||||
|
|
||||||
|
|
||||||
|
client = BluetoothAudioClient()
|
||||||
|
|
||||||
|
client.run()
|
||||||
|
|
||||||
|
del BluetoothAudioClient
|
||||||
@@ -1,19 +1,15 @@
|
|||||||
# SPDX-License-Identifier: GPL-2.0
|
# SPDX-License-Identifier: GPL-2.0
|
||||||
# Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv)
|
# Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv)
|
||||||
|
|
||||||
import dbus
|
|
||||||
import dbus.mainloop.glib
|
|
||||||
import gobject
|
|
||||||
import json
|
import json
|
||||||
|
import subprocess
|
||||||
import threading
|
import threading
|
||||||
import time
|
|
||||||
import xbmc
|
import xbmc
|
||||||
import xbmcaddon
|
import xbmcaddon
|
||||||
|
|
||||||
__addon__ = xbmcaddon.Addon()
|
__addon__ = xbmcaddon.Addon()
|
||||||
__addonid__ = __addon__.getAddonInfo('id')
|
__addonid__ = __addon__.getAddonInfo('id')
|
||||||
|
__addonpath__ = xbmc.translatePath(xbmcaddon.Addon().getAddonInfo('path')).decode('utf-8')
|
||||||
gobject.threads_init()
|
|
||||||
|
|
||||||
class KodiFunctions(object):
|
class KodiFunctions(object):
|
||||||
|
|
||||||
@@ -63,103 +59,38 @@ class BluetoothAudioClient(object):
|
|||||||
|
|
||||||
xbmc.log('%s: starting add-on' % __addonid__, xbmc.LOGNOTICE)
|
xbmc.log('%s: starting add-on' % __addonid__, xbmc.LOGNOTICE)
|
||||||
|
|
||||||
self.devices = {}
|
|
||||||
self.signal_added = None
|
|
||||||
self.signal_removed = None
|
|
||||||
|
|
||||||
self.kodi = KodiFunctions()
|
self.kodi = KodiFunctions()
|
||||||
|
self.path = __addonpath__ + '/bin/dbusservice.py'
|
||||||
|
|
||||||
|
self.service = subprocess.Popen([self.path], stdout=subprocess.PIPE)
|
||||||
|
|
||||||
|
self._thread = threading.Thread(target=self.loop)
|
||||||
|
self._thread.start()
|
||||||
|
|
||||||
|
|
||||||
|
def loop(self):
|
||||||
|
|
||||||
|
while True:
|
||||||
|
line = self.service.stdout.readline()
|
||||||
|
if line == '':
|
||||||
|
break
|
||||||
|
if line == 'bluetooth\n':
|
||||||
|
self.kodi.select_pulse()
|
||||||
|
continue
|
||||||
|
if line == 'default\n':
|
||||||
|
self.kodi.select_default()
|
||||||
|
continue
|
||||||
|
xbmc.log('%s: unexpected input: %s' % (__addonid__, line), xbmc.LOGERROR)
|
||||||
|
|
||||||
self._setup_loop()
|
|
||||||
self._setup_bus()
|
|
||||||
self._setup_signals()
|
|
||||||
|
|
||||||
def quit(self):
|
def quit(self):
|
||||||
|
|
||||||
xbmc.log('%s: stopping add-on' % __addonid__, xbmc.LOGNOTICE)
|
xbmc.log('%s: stopping add-on' % __addonid__, xbmc.LOGNOTICE)
|
||||||
|
|
||||||
|
self.service.terminate()
|
||||||
|
self._thread.join()
|
||||||
self.kodi.select_default()
|
self.kodi.select_default()
|
||||||
|
|
||||||
self.signal_added.remove()
|
|
||||||
self.signal_removed.remove()
|
|
||||||
|
|
||||||
self._loop.quit()
|
|
||||||
|
|
||||||
def _setup_loop(self):
|
|
||||||
|
|
||||||
self._loop = gobject.MainLoop()
|
|
||||||
|
|
||||||
self._thread = threading.Thread(target=self._loop.run)
|
|
||||||
self._thread.start()
|
|
||||||
|
|
||||||
def _setup_bus(self):
|
|
||||||
|
|
||||||
dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
|
|
||||||
self._bus = dbus.SystemBus()
|
|
||||||
|
|
||||||
def _setup_signals(self):
|
|
||||||
|
|
||||||
self.signal_added = self._bus.add_signal_receiver(handler_function=self.switch_audio,
|
|
||||||
signal_name='InterfacesAdded',
|
|
||||||
dbus_interface='org.freedesktop.DBus.ObjectManager',
|
|
||||||
bus_name='org.bluez',
|
|
||||||
member_keyword='signal')
|
|
||||||
|
|
||||||
self.signal_removed = self._bus.add_signal_receiver(handler_function=self.switch_audio,
|
|
||||||
signal_name='InterfacesRemoved',
|
|
||||||
dbus_interface='org.freedesktop.DBus.ObjectManager',
|
|
||||||
bus_name='org.bluez',
|
|
||||||
member_keyword='signal')
|
|
||||||
|
|
||||||
def switch_audio(self, *args, **kwargs):
|
|
||||||
|
|
||||||
device_path = args[0]
|
|
||||||
|
|
||||||
try:
|
|
||||||
if kwargs['signal'] == 'InterfacesAdded':
|
|
||||||
|
|
||||||
self.devices[device_path] = {
|
|
||||||
'Connected': '',
|
|
||||||
'Device': '',
|
|
||||||
'Class': '',
|
|
||||||
}
|
|
||||||
|
|
||||||
device = self._bus.get_object('org.bluez', device_path)
|
|
||||||
device_iface = dbus.Interface(device, dbus.PROPERTIES_IFACE)
|
|
||||||
self.devices[device_path]['Device'] = device_iface.Get('org.bluez.MediaTransport1', 'Device')
|
|
||||||
|
|
||||||
audio_device_path = self._bus.get_object('org.bluez', self.devices[device_path]['Device'])
|
|
||||||
audio_device_iface = dbus.Interface(audio_device_path, dbus.PROPERTIES_IFACE)
|
|
||||||
self.devices[device_path]['Class'] = audio_device_iface.Get('org.bluez.Device1', 'Class')
|
|
||||||
self.devices[device_path]['Connected'] = audio_device_iface.Get('org.bluez.Device1', 'Connected')
|
|
||||||
|
|
||||||
if self.devices[device_path]['Class'] & (1 << 21):
|
|
||||||
xbmc.log('%s: bluetooth audio device connected' % __addonid__, xbmc.LOGNOTICE)
|
|
||||||
xbmc.log('%s: switching to bluetooth audio device' % __addonid__, xbmc.LOGNOTICE)
|
|
||||||
self.kodi.select_pulse()
|
|
||||||
|
|
||||||
elif kwargs['signal'] == 'InterfacesRemoved':
|
|
||||||
if self.devices[device_path]['Device'] is not None and self.devices[device_path]['Class'] & (1 << 21):
|
|
||||||
audio_device_path = self._bus.get_object('org.bluez', self.devices[device_path]['Device'])
|
|
||||||
audio_device_iface = dbus.Interface(audio_device_path, dbus.PROPERTIES_IFACE)
|
|
||||||
self.devices[device_path]['Connected'] = audio_device_iface.Get('org.bluez.Device1', 'Connected')
|
|
||||||
|
|
||||||
while self.devices[device_path]['Connected']:
|
|
||||||
self.devices[device_path]['Connected'] = audio_device_iface.Get('org.bluez.Device1', 'Connected')
|
|
||||||
time.sleep(0.1)
|
|
||||||
|
|
||||||
xbmc.log('%s: bluetooth audio device disconnected' % __addonid__, xbmc.LOGNOTICE)
|
|
||||||
xbmc.log('%s: checking for other connected devices' % __addonid__, xbmc.LOGNOTICE)
|
|
||||||
|
|
||||||
for path in self.devices:
|
|
||||||
if self.devices[path]['Connected'] and self.devices[path]['Class'] & (1 << 21):
|
|
||||||
xbmc.log('%s: found connected bluetooth audio device' % __addonid__, xbmc.LOGNOTICE)
|
|
||||||
return
|
|
||||||
|
|
||||||
xbmc.log('%s: switching to default audio device' % __addonid__, xbmc.LOGNOTICE)
|
|
||||||
self.kodi.select_default()
|
|
||||||
|
|
||||||
except (TypeError, KeyError, dbus.exceptions.DBusException) as e:
|
|
||||||
xbmc.log('%s: ' % __addonid__ + unicode(e), xbmc.LOGERROR)
|
|
||||||
|
|
||||||
class BluetoothMonitor(xbmc.Monitor):
|
class BluetoothMonitor(xbmc.Monitor):
|
||||||
|
|
||||||
|
|||||||
@@ -48,7 +48,6 @@ addon() {
|
|||||||
mkdir -p $ADDON_BUILD/$PKG_ADDON_ID/bin
|
mkdir -p $ADDON_BUILD/$PKG_ADDON_ID/bin
|
||||||
cp -P $PKG_BUILD/.$TARGET_NAME/src/boblightd $ADDON_BUILD/$PKG_ADDON_ID/bin
|
cp -P $PKG_BUILD/.$TARGET_NAME/src/boblightd $ADDON_BUILD/$PKG_ADDON_ID/bin
|
||||||
cp -P $PKG_BUILD/.$TARGET_NAME/src/boblight-constant $ADDON_BUILD/$PKG_ADDON_ID/bin
|
cp -P $PKG_BUILD/.$TARGET_NAME/src/boblight-constant $ADDON_BUILD/$PKG_ADDON_ID/bin
|
||||||
cp -P $PKG_BUILD/.$TARGET_NAME/src/boblight-aml $ADDON_BUILD/$PKG_ADDON_ID/bin
|
|
||||||
if [ "$DISPLAYSERVER" = "x11" ] ; then
|
if [ "$DISPLAYSERVER" = "x11" ] ; then
|
||||||
cp -P $PKG_BUILD/.$TARGET_NAME/src/boblight-X11 $ADDON_BUILD/$PKG_ADDON_ID/bin
|
cp -P $PKG_BUILD/.$TARGET_NAME/src/boblight-X11 $ADDON_BUILD/$PKG_ADDON_ID/bin
|
||||||
fi
|
fi
|
||||||
|
|||||||
@@ -1,632 +0,0 @@
|
|||||||
diff --git a/src/Makefile.am b/src/Makefile.am
|
|
||||||
index 9ba5381..c5a4dc6 100644
|
|
||||||
--- a/src/Makefile.am
|
|
||||||
+++ b/src/Makefile.am
|
|
||||||
@@ -7,6 +7,7 @@ AM_CFLAGS =\
|
|
||||||
-g
|
|
||||||
|
|
||||||
bin_PROGRAMS = boblightd \
|
|
||||||
+ boblight-aml \
|
|
||||||
boblight-constant
|
|
||||||
|
|
||||||
|
|
||||||
@@ -19,6 +20,11 @@ endif
|
|
||||||
|
|
||||||
endif
|
|
||||||
|
|
||||||
+boblight_aml_SOURCES = clients/boblight-aml/boblight-aml.cpp
|
|
||||||
+boblight_aml_SOURCES += clients/boblight-aml/flagmanager-aml.cpp
|
|
||||||
+boblight_aml_SOURCES += clients/flagmanager.cpp
|
|
||||||
+boblight_aml_SOURCES += util/misc.cpp
|
|
||||||
+
|
|
||||||
boblight_v4l_SOURCES = \
|
|
||||||
clients/boblight-v4l/boblight-v4l.cpp \
|
|
||||||
clients/boblight-v4l/flagmanager-v4l.cpp \
|
|
||||||
diff -urPp src/clients/boblight-aml.cpp src/clients/boblight-aml/boblight-aml.cpp
|
|
||||||
--- /dev/null Thu Jan 1 00:00:00 1970
|
|
||||||
+++ b/src/clients/boblight-aml/boblight-aml.cpp Thu Jan 15 10:24:16 2015
|
|
||||||
@@ -0,0 +1,491 @@
|
|
||||||
+/*
|
|
||||||
+ * boblight
|
|
||||||
+ * Copyright (C) Bob 2009
|
|
||||||
+ *
|
|
||||||
+ * boblight is free software: you can redistribute it and/or modify it
|
|
||||||
+ * under the terms of the GNU General Public License as published by the
|
|
||||||
+ * Free Software Foundation, either version 3 of the License, or
|
|
||||||
+ * (at your option) any later version.
|
|
||||||
+ *
|
|
||||||
+ * boblight is distributed in the hope that it will be useful, but
|
|
||||||
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
||||||
+ * See the GNU General Public License for more details.
|
|
||||||
+ *
|
|
||||||
+ * You should have received a copy of the GNU General Public License along
|
|
||||||
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
+ */
|
|
||||||
+
|
|
||||||
+#define BOBLIGHT_DLOPEN
|
|
||||||
+#include "lib/boblight.h"
|
|
||||||
+
|
|
||||||
+#include <stdio.h>
|
|
||||||
+#include <stdlib.h>
|
|
||||||
+#include <string.h>
|
|
||||||
+#include <unistd.h>
|
|
||||||
+#include <signal.h>
|
|
||||||
+#include <algorithm>
|
|
||||||
+
|
|
||||||
+#include <fcntl.h>
|
|
||||||
+#include <errno.h>
|
|
||||||
+#include <sys/stat.h>
|
|
||||||
+#include <sys/poll.h>
|
|
||||||
+#include <sys/types.h>
|
|
||||||
+#include <sys/time.h>
|
|
||||||
+#include <sys/ioctl.h>
|
|
||||||
+
|
|
||||||
+#include "config.h"
|
|
||||||
+#include "util/misc.h"
|
|
||||||
+#include "util/timeutils.h"
|
|
||||||
+#include "flagmanager-aml.h"
|
|
||||||
+
|
|
||||||
+using namespace std;
|
|
||||||
+
|
|
||||||
+//from linux/amlogic/amports/amvideocap.h
|
|
||||||
+#define AMVIDEOCAP_IOC_MAGIC 'V'
|
|
||||||
+#define AMVIDEOCAP_IOW_SET_WANTFRAME_WIDTH _IOW(AMVIDEOCAP_IOC_MAGIC, 0x02, int)
|
|
||||||
+#define AMVIDEOCAP_IOW_SET_WANTFRAME_HEIGHT _IOW(AMVIDEOCAP_IOC_MAGIC, 0x03, int)
|
|
||||||
+
|
|
||||||
+
|
|
||||||
+// helper class - tries to load the "movie" settings from the script.xbmc.boblight addon
|
|
||||||
+// and pass them to the boblight-aml client
|
|
||||||
+class CBoblightAddonSettings
|
|
||||||
+{
|
|
||||||
+ public:
|
|
||||||
+ CBoblightAddonSettings() : m_bobdisable(false), m_settingsLoaded(false)
|
|
||||||
+ {
|
|
||||||
+ m_settingsLoaded = loadBoblightAddonSettings();
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ std::string getBoblightClientCmdLine()
|
|
||||||
+ {
|
|
||||||
+ std::string cmdLine = "";
|
|
||||||
+ //convert bool string to lowercase
|
|
||||||
+ transform(m_interpolation.begin(), m_interpolation.end(), m_interpolation.begin(), ::tolower);
|
|
||||||
+
|
|
||||||
+ cmdLine += "-s " + m_ip + ":" + m_port;
|
|
||||||
+ cmdLine += " -o autospeed=" + m_autospeed;
|
|
||||||
+ cmdLine += " -o interpolation=" + m_interpolation;
|
|
||||||
+ cmdLine += " -o saturation=" + m_saturation;
|
|
||||||
+ cmdLine += " -o speed=" + m_speed;
|
|
||||||
+ cmdLine += " -o threshold=" + m_threshold;
|
|
||||||
+ cmdLine += " -o value=" + m_value;
|
|
||||||
+ return cmdLine;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ bool m_bobdisable;
|
|
||||||
+ bool m_settingsLoaded;
|
|
||||||
+ std::string m_ip;
|
|
||||||
+ std::string m_port;
|
|
||||||
+ std::string m_autospeed;
|
|
||||||
+ std::string m_interpolation;
|
|
||||||
+ std::string m_saturation;
|
|
||||||
+ std::string m_speed;
|
|
||||||
+ std::string m_threshold;
|
|
||||||
+ std::string m_value;
|
|
||||||
+
|
|
||||||
+ private:
|
|
||||||
+ #define SETTINGS_ATTR_BOBDISABLE "bobdisable"
|
|
||||||
+ #define SETTINGS_ATTR_IP "hostip"
|
|
||||||
+ #define SETTINGS_ATTR_PORT "hostport"
|
|
||||||
+ #define SETTINGS_ATTR_AUTOSPEED "movie_autospeed"
|
|
||||||
+ #define SETTINGS_ATTR_INTERPOLATION "movie_interpolation"
|
|
||||||
+ #define SETTINGS_ATTR_SATURATION "movie_saturation"
|
|
||||||
+ #define SETTINGS_ATTR_SPEED "movie_speed"
|
|
||||||
+ #define SETTINGS_ATTR_THRESHOLD "movie_threshold"
|
|
||||||
+ #define SETTINGS_ATTR_VALUE "movie_value"
|
|
||||||
+ #define KODI_HOME_ENV_VAR "HOME"
|
|
||||||
+
|
|
||||||
+ bool loadBoblightAddonSettings()
|
|
||||||
+ {
|
|
||||||
+ bool ret = false;
|
|
||||||
+ char *kodiHome = getenv(KODI_HOME_ENV_VAR);
|
|
||||||
+ //fallback to custom settings file in case boblight addon is not installed
|
|
||||||
+ std::string settingsFile = "/storage/boblight-aml.xml";
|
|
||||||
+
|
|
||||||
+ if (kodiHome != NULL)
|
|
||||||
+ {
|
|
||||||
+ settingsFile = std::string(kodiHome) + "/.kodi/userdata/addon_data/script.xbmc.boblight/settings.xml";
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ FILE *fd = fopen(settingsFile.c_str(), "r");
|
|
||||||
+
|
|
||||||
+ if (fd != NULL)
|
|
||||||
+ {
|
|
||||||
+ fseek(fd, 0, SEEK_END);
|
|
||||||
+ size_t fileSize = ftell(fd);
|
|
||||||
+ fseek(fd, 0, SEEK_SET);
|
|
||||||
+ if (fileSize > 0)
|
|
||||||
+ {
|
|
||||||
+ if (fileSize > 32000)//read 16k max - there shouldn't be a bigger settings.xml from boblight [tm]
|
|
||||||
+ fileSize = 32000;
|
|
||||||
+ char *xmlBuffer = new char[fileSize];
|
|
||||||
+ size_t readCount = fread(xmlBuffer, fileSize, 1, fd);
|
|
||||||
+ fclose(fd);
|
|
||||||
+
|
|
||||||
+ if (readCount == 1)
|
|
||||||
+ {
|
|
||||||
+ parseBoblightSettings(std::string(xmlBuffer));
|
|
||||||
+ ret = true;
|
|
||||||
+ }
|
|
||||||
+ else
|
|
||||||
+ {
|
|
||||||
+ fprintf(stderr, "Failed reading boblight addon settings.xml");
|
|
||||||
+ }
|
|
||||||
+ delete[] xmlBuffer;
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+ return ret;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ void parseBoblightSettings(std::string xmlBuffer)
|
|
||||||
+ {
|
|
||||||
+ std::string settings_bobdisable_str;
|
|
||||||
+ settings_bobdisable_str = getValueFromXmlBuffer(xmlBuffer, SETTINGS_ATTR_BOBDISABLE);
|
|
||||||
+ if (settings_bobdisable_str == "true" || settings_bobdisable_str == "True")
|
|
||||||
+ m_bobdisable = true;
|
|
||||||
+
|
|
||||||
+ m_ip = getValueFromXmlBuffer(xmlBuffer, SETTINGS_ATTR_IP);
|
|
||||||
+ m_port = getValueFromXmlBuffer(xmlBuffer, SETTINGS_ATTR_PORT);
|
|
||||||
+ m_autospeed = getValueFromXmlBuffer(xmlBuffer, SETTINGS_ATTR_AUTOSPEED);
|
|
||||||
+ m_interpolation = getValueFromXmlBuffer(xmlBuffer, SETTINGS_ATTR_INTERPOLATION);
|
|
||||||
+ m_saturation = getValueFromXmlBuffer(xmlBuffer, SETTINGS_ATTR_SATURATION);
|
|
||||||
+ m_speed = getValueFromXmlBuffer(xmlBuffer, SETTINGS_ATTR_SPEED);
|
|
||||||
+ m_threshold = getValueFromXmlBuffer(xmlBuffer, SETTINGS_ATTR_THRESHOLD);
|
|
||||||
+ m_value = getValueFromXmlBuffer(xmlBuffer, SETTINGS_ATTR_VALUE);
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ std::string getValueFromXmlBuffer(const std::string &xmlBuffer, const char* xmlAttribute)
|
|
||||||
+ {
|
|
||||||
+ size_t strPos = 0;
|
|
||||||
+ std::string valueStr;
|
|
||||||
+
|
|
||||||
+ // each line in the xml looks like this:
|
|
||||||
+ // <setting id="movie_value" value="1.000006" />
|
|
||||||
+ // find the attribute
|
|
||||||
+ if ((strPos = xmlBuffer.find(xmlAttribute)) != std::string::npos)
|
|
||||||
+ {
|
|
||||||
+ size_t strPos2 = 0;
|
|
||||||
+ // from movie_value" value="1.000006" /> look for "value"
|
|
||||||
+ if ((strPos2 = xmlBuffer.find("value", strPos)) != std::string::npos)
|
|
||||||
+ {
|
|
||||||
+ size_t strPos3 = 0;
|
|
||||||
+ // from value="1.000006" /> look for "="
|
|
||||||
+ if ((strPos3 = xmlBuffer.find("=", strPos2)) != std::string::npos)
|
|
||||||
+ {
|
|
||||||
+ //extract the value - strPos3 points to ="1.000006"
|
|
||||||
+ int valueOffset = 1; //skip the "="
|
|
||||||
+ if (xmlBuffer[strPos3 + valueOffset] == '"')
|
|
||||||
+ valueOffset++;//skip " if needed
|
|
||||||
+ int strLen = 0;
|
|
||||||
+ do
|
|
||||||
+ {
|
|
||||||
+ // value stops with " or space
|
|
||||||
+ if (xmlBuffer[strPos3 + valueOffset + strLen] == '"' ||
|
|
||||||
+ xmlBuffer[strPos3 + valueOffset + strLen] == ' ')
|
|
||||||
+ break;
|
|
||||||
+ strLen++;
|
|
||||||
+ } while (strLen < 20);// no insane xml garbage ...
|
|
||||||
+
|
|
||||||
+ valueStr = xmlBuffer.substr(strPos3 + valueOffset, strLen);
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+ return valueStr;
|
|
||||||
+ }
|
|
||||||
+};
|
|
||||||
+
|
|
||||||
+struct aml_snapshot_t {
|
|
||||||
+ unsigned int dst_width;
|
|
||||||
+ unsigned int dst_height;
|
|
||||||
+ unsigned int dst_stride;
|
|
||||||
+ unsigned int dst_size;
|
|
||||||
+ void *dst_vaddr;
|
|
||||||
+};
|
|
||||||
+
|
|
||||||
+volatile bool g_stop = false;
|
|
||||||
+CFlagManagerAML g_flagmanager;
|
|
||||||
+/*********************************************************
|
|
||||||
+ *********************************************************/
|
|
||||||
+static void SignalHandler(int signum)
|
|
||||||
+{
|
|
||||||
+ if (signum == SIGTERM)
|
|
||||||
+ {
|
|
||||||
+ fprintf(stderr, "caught SIGTERM\n");
|
|
||||||
+ g_stop = true;
|
|
||||||
+ }
|
|
||||||
+ else if (signum == SIGINT)
|
|
||||||
+ {
|
|
||||||
+ fprintf(stderr, "caught SIGTERM\n");
|
|
||||||
+ g_stop = true;
|
|
||||||
+ }
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+#define VIDEO_PATH "/dev/amvideo"
|
|
||||||
+#define AMSTREAM_IOC_MAGIC 'S'
|
|
||||||
+#define AMSTREAM_IOC_GET_VIDEO_DISABLE _IOR(AMSTREAM_IOC_MAGIC, 0x48, unsigned long)
|
|
||||||
+static int amvideo_utils_video_playing()
|
|
||||||
+{
|
|
||||||
+ int video_fd;
|
|
||||||
+ int video_disable;
|
|
||||||
+
|
|
||||||
+ video_fd = open(VIDEO_PATH, O_RDWR);
|
|
||||||
+ if (video_fd < 0) {
|
|
||||||
+ return -1;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ ioctl(video_fd, AMSTREAM_IOC_GET_VIDEO_DISABLE, &video_disable);
|
|
||||||
+ if (video_disable)
|
|
||||||
+ {
|
|
||||||
+ close(video_fd);
|
|
||||||
+ return 1;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ close(video_fd);
|
|
||||||
+
|
|
||||||
+// fprintf(stderr, "pos x %d y %d w %d h %d\n",snapshot.src_x, snapshot.src_y,snapshot.src_width,snapshot.src_height);
|
|
||||||
+ return 0;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static int capture_frame(int fd, aml_snapshot_t &snapshot)
|
|
||||||
+{
|
|
||||||
+ int ret = 0;
|
|
||||||
+
|
|
||||||
+ ssize_t readResult = pread(fd, snapshot.dst_vaddr, snapshot.dst_size, 0);
|
|
||||||
+
|
|
||||||
+ if (readResult < snapshot.dst_size)
|
|
||||||
+ {
|
|
||||||
+ fprintf(stderr, "frame read returned %d\n", readResult);
|
|
||||||
+ }
|
|
||||||
+ //fprintf(stderr, "requ: %d read %d \n", snapshot.dst_size, readResult);
|
|
||||||
+ fprintf(stderr, ".");
|
|
||||||
+ return ret;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static int configure_capture(int fd, aml_snapshot_t &snapshot)
|
|
||||||
+{
|
|
||||||
+ int ret = 0;
|
|
||||||
+ int ioctlret = 0;
|
|
||||||
+
|
|
||||||
+ if ((ioctlret = ioctl(fd, AMVIDEOCAP_IOW_SET_WANTFRAME_WIDTH, snapshot.dst_width)) != 0)
|
|
||||||
+ {
|
|
||||||
+ ret = 2;
|
|
||||||
+ fprintf(stderr, "Error setting frame width (ret: %d errno: %d)\n", ioctlret, errno);
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+
|
|
||||||
+ if ((ioctlret = ioctl(fd, AMVIDEOCAP_IOW_SET_WANTFRAME_HEIGHT, snapshot.dst_height)) != 0)
|
|
||||||
+ {
|
|
||||||
+ ret = 3;
|
|
||||||
+ fprintf(stderr, "Error setting frame height (ret: %d errno: %d)\n", ioctlret, errno);
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ return ret;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static void frameToboblight(void *boblight, uint8_t* outputptr, int w, int h, int stride)
|
|
||||||
+{
|
|
||||||
+ if (!boblight)
|
|
||||||
+ {
|
|
||||||
+ fprintf(stderr, "no boblight\n");
|
|
||||||
+ return;
|
|
||||||
+ }
|
|
||||||
+ if (!outputptr)
|
|
||||||
+ {
|
|
||||||
+ fprintf(stderr, "no outputptr\n");
|
|
||||||
+ return;
|
|
||||||
+ }
|
|
||||||
+ //read out pixels and hand them to libboblight
|
|
||||||
+ uint8_t* buffptr;
|
|
||||||
+ for (int y = h; y > 0; y--) {
|
|
||||||
+ buffptr = outputptr + stride * y;
|
|
||||||
+ for (int x = 0; x < w; x++) {
|
|
||||||
+ int rgb[3];
|
|
||||||
+ rgb[2] = *(buffptr++);
|
|
||||||
+ rgb[1] = *(buffptr++);
|
|
||||||
+ rgb[0] = *(buffptr++);
|
|
||||||
+
|
|
||||||
+ //fprintf(stdout, "frameToboblight: x(%d), y(%d)\n", x, y);
|
|
||||||
+
|
|
||||||
+ boblight_addpixelxy(boblight, x, y, rgb);
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static int Run(void* boblight)
|
|
||||||
+{
|
|
||||||
+ int snapshot_fd = -1;
|
|
||||||
+ aml_snapshot_t aml_snapshot = {0};
|
|
||||||
+ int lastPriority = 255;
|
|
||||||
+
|
|
||||||
+ aml_snapshot.dst_width = 160;
|
|
||||||
+ aml_snapshot.dst_height = 160;
|
|
||||||
+
|
|
||||||
+ // calc stride, size and alloc mem
|
|
||||||
+ aml_snapshot.dst_stride = aml_snapshot.dst_width * 3;
|
|
||||||
+ aml_snapshot.dst_size = aml_snapshot.dst_stride * aml_snapshot.dst_height;
|
|
||||||
+ aml_snapshot.dst_vaddr = calloc(aml_snapshot.dst_size, 1);
|
|
||||||
+
|
|
||||||
+ fprintf(stdout, "Connection to boblightd config: width(%d), height(%d)\n",
|
|
||||||
+ aml_snapshot.dst_width, aml_snapshot.dst_height);
|
|
||||||
+ //tell libboblight how big our image is
|
|
||||||
+ boblight_setscanrange(boblight, (int)aml_snapshot.dst_width, (int)aml_snapshot.dst_height);
|
|
||||||
+
|
|
||||||
+ while(!g_stop)
|
|
||||||
+ {
|
|
||||||
+ int64_t bgn = GetTimeUs();
|
|
||||||
+
|
|
||||||
+ if (snapshot_fd == -1) {
|
|
||||||
+ snapshot_fd = open(g_flagmanager.m_device.c_str(), O_RDWR, 0);
|
|
||||||
+
|
|
||||||
+ if (snapshot_fd == -1) {
|
|
||||||
+ sleep(1);
|
|
||||||
+ continue;
|
|
||||||
+ } else {
|
|
||||||
+ fprintf(stdout, "snapshot_fd(%d) \n", snapshot_fd);
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ // match source ratio if possible
|
|
||||||
+ if (amvideo_utils_video_playing() != 0) {
|
|
||||||
+ if ( lastPriority != 255)
|
|
||||||
+ {
|
|
||||||
+ boblight_setpriority(boblight, 255);
|
|
||||||
+ lastPriority = 255;
|
|
||||||
+ }
|
|
||||||
+ sleep(1);
|
|
||||||
+ continue;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ if (configure_capture(snapshot_fd, aml_snapshot) == 0)
|
|
||||||
+ {
|
|
||||||
+ if (capture_frame(snapshot_fd, aml_snapshot) == 0)
|
|
||||||
+ {
|
|
||||||
+ // image to boblight convert.
|
|
||||||
+ frameToboblight(boblight, (uint8_t*)aml_snapshot.dst_vaddr,
|
|
||||||
+ aml_snapshot.dst_width, aml_snapshot.dst_height, aml_snapshot.dst_stride);
|
|
||||||
+
|
|
||||||
+ if (lastPriority != g_flagmanager.m_priority)
|
|
||||||
+ {
|
|
||||||
+ boblight_setpriority(boblight, g_flagmanager.m_priority);
|
|
||||||
+ lastPriority = g_flagmanager.m_priority;
|
|
||||||
+ }
|
|
||||||
+ if (!boblight_sendrgb(boblight, 1, NULL))
|
|
||||||
+ {
|
|
||||||
+ // some error happened, probably connection broken, so bitch and try again
|
|
||||||
+ PrintError(boblight_geterror(boblight));
|
|
||||||
+ boblight_destroy(boblight);
|
|
||||||
+ continue;
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+ else
|
|
||||||
+ {
|
|
||||||
+ fprintf(stdout, "nap time\n");
|
|
||||||
+ sleep(1);
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+ int64_t end = GetTimeUs();
|
|
||||||
+ float calc_time_ms = (float)(end - bgn) / 1000.0;
|
|
||||||
+ // throttle to 100ms max cycle rate
|
|
||||||
+ calc_time_ms -= 100.0;
|
|
||||||
+ if ((int)calc_time_ms < 0)
|
|
||||||
+ usleep((int)(-calc_time_ms * 1000));
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ // last image is black
|
|
||||||
+ boblight_setpriority(boblight, 255);
|
|
||||||
+ boblight_destroy(boblight);
|
|
||||||
+ close(snapshot_fd);
|
|
||||||
+ return 0;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+/*********************************************************
|
|
||||||
+ *********************************************************/
|
|
||||||
+int main(int argc, char *argv[])
|
|
||||||
+{
|
|
||||||
+ //load the boblight lib, if it fails we get a char* from dlerror()
|
|
||||||
+ const char* boblight_error = boblight_loadlibrary(NULL);
|
|
||||||
+ if (boblight_error)
|
|
||||||
+ {
|
|
||||||
+ PrintError(boblight_error);
|
|
||||||
+ return 1;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ //try to parse the flags and bitch to stderr if there's an error
|
|
||||||
+ try {
|
|
||||||
+ g_flagmanager.ParseFlags(argc, argv);
|
|
||||||
+ }
|
|
||||||
+ catch (string error) {
|
|
||||||
+ PrintError(error);
|
|
||||||
+ g_flagmanager.PrintHelpMessage();
|
|
||||||
+ return 1;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ if (g_flagmanager.m_printhelp) {
|
|
||||||
+ g_flagmanager.PrintHelpMessage();
|
|
||||||
+ return 1;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ if (g_flagmanager.m_printboblightoptions) {
|
|
||||||
+ g_flagmanager.PrintBoblightOptions();
|
|
||||||
+ return 1;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ // check if we only should generate a cmdline based
|
|
||||||
+ // on settings from possible found boblight addon
|
|
||||||
+ if (g_flagmanager.generateCmdLine)
|
|
||||||
+ {
|
|
||||||
+ CBoblightAddonSettings settings;
|
|
||||||
+ string cmdLine = "-p 100"; //default cmdline just contains priority 100
|
|
||||||
+
|
|
||||||
+ if (settings.m_settingsLoaded)
|
|
||||||
+ cmdLine += " " + settings.getBoblightClientCmdLine();
|
|
||||||
+ fprintf(stdout, "%s", cmdLine.c_str());
|
|
||||||
+ return 0;//exit
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ fprintf(stderr, "Using device: %s \n", g_flagmanager.m_device.c_str());
|
|
||||||
+
|
|
||||||
+ //set up signal handlers
|
|
||||||
+ signal(SIGINT, SignalHandler);
|
|
||||||
+ signal(SIGTERM, SignalHandler);
|
|
||||||
+
|
|
||||||
+ //keep running until we want to quit
|
|
||||||
+ while(!g_stop) {
|
|
||||||
+ //init boblight
|
|
||||||
+ void* boblight = boblight_init();
|
|
||||||
+
|
|
||||||
+ fprintf(stdout, "Connecting to boblightd(%p)\n", boblight);
|
|
||||||
+
|
|
||||||
+ //try to connect, if we can't then bitch to stderr and destroy boblight
|
|
||||||
+ if (!boblight_connect(boblight, g_flagmanager.m_address, g_flagmanager.m_port, 5000000) ||
|
|
||||||
+ !boblight_setpriority(boblight, 255)) {
|
|
||||||
+ PrintError(boblight_geterror(boblight));
|
|
||||||
+ fprintf(stdout, "Waiting 10 seconds before trying again\n");
|
|
||||||
+ boblight_destroy(boblight);
|
|
||||||
+ sleep(2);
|
|
||||||
+ continue;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ fprintf(stdout, "Connection to boblightd opened\n");
|
|
||||||
+
|
|
||||||
+ //try to parse the boblight flags and bitch to stderr if we can't
|
|
||||||
+ try {
|
|
||||||
+ g_flagmanager.ParseBoblightOptions(boblight);
|
|
||||||
+ }
|
|
||||||
+ catch (string error) {
|
|
||||||
+ PrintError(error);
|
|
||||||
+ return 1;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ try {
|
|
||||||
+ Run(boblight);
|
|
||||||
+ }
|
|
||||||
+ catch (string error) {
|
|
||||||
+ PrintError(error);
|
|
||||||
+ boblight_destroy(boblight);
|
|
||||||
+ return 1;
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+ fprintf(stdout, "Exiting\n");
|
|
||||||
+}
|
|
||||||
diff -urPp src/clients/flagmanager-aml.cpp src/clients/boblight-aml/flagmanager-aml.cpp
|
|
||||||
--- /dev/null Thu Jan 1 00:00:00 1970
|
|
||||||
+++ b/src/clients/boblight-aml/flagmanager-aml.cpp Thu Jan 15 10:21:40 2015
|
|
||||||
@@ -0,0 +1,68 @@
|
|
||||||
+/*
|
|
||||||
+ * boblight
|
|
||||||
+ * Copyright (C) Bob 2009
|
|
||||||
+ *
|
|
||||||
+ * boblight is free software: you can redistribute it and/or modify it
|
|
||||||
+ * under the terms of the GNU General Public License as published by the
|
|
||||||
+ * Free Software Foundation, either version 3 of the License, or
|
|
||||||
+ * (at your option) any later version.
|
|
||||||
+ *
|
|
||||||
+ * boblight is distributed in the hope that it will be useful, but
|
|
||||||
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
||||||
+ * See the GNU General Public License for more details.
|
|
||||||
+ *
|
|
||||||
+ * You should have received a copy of the GNU General Public License along
|
|
||||||
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
+ */
|
|
||||||
+
|
|
||||||
+#include <iostream>
|
|
||||||
+
|
|
||||||
+#include "flagmanager-aml.h"
|
|
||||||
+#include "util/misc.h"
|
|
||||||
+#include "config.h"
|
|
||||||
+
|
|
||||||
+#define DEFAULT_CAPTURE_DEVICE "/dev/amvideocap0"
|
|
||||||
+
|
|
||||||
+using namespace std;
|
|
||||||
+
|
|
||||||
+CFlagManagerAML::CFlagManagerAML()
|
|
||||||
+{
|
|
||||||
+ // extend the flags -d -> device
|
|
||||||
+ // -g -> only generate cmdline from possible found boblight addon settings.xml
|
|
||||||
+ m_flags += "d:g";
|
|
||||||
+ m_device = DEFAULT_CAPTURE_DEVICE;
|
|
||||||
+ generateCmdLine = false;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+void CFlagManagerAML::ParseFlagsExtended(int& argc, char**& argv, int& c, char*& optarg)
|
|
||||||
+{
|
|
||||||
+ if (c == 'd') //devicename
|
|
||||||
+ {
|
|
||||||
+ if (optarg) //optional device
|
|
||||||
+ {
|
|
||||||
+ m_device = optarg;
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ if (c == 'g') //generate cmdline
|
|
||||||
+ {
|
|
||||||
+ generateCmdLine = true;
|
|
||||||
+ }
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+void CFlagManagerAML::PrintHelpMessage()
|
|
||||||
+{
|
|
||||||
+ cout << "Usage: boblight-aml\n";
|
|
||||||
+ cout << "\n";
|
|
||||||
+ cout << " options:\n";
|
|
||||||
+ cout << "\n";
|
|
||||||
+ cout << " -p priority, from 0 to 255, default is 128\n";
|
|
||||||
+ cout << " -s address[:port], set the address and optional port to connect to\n";
|
|
||||||
+ cout << " -o add libboblight option, syntax: [light:]option=value\n";
|
|
||||||
+ cout << " -l list libboblight options\n";
|
|
||||||
+ cout << " -f fork\n";
|
|
||||||
+ cout << " -d <device> (defaults to " << m_device << ")\n";
|
|
||||||
+ cout << " -g try to find the settings.xml file from boblight addon and return the cmdline to use its options\n";
|
|
||||||
+ cout << "\n";
|
|
||||||
+}
|
|
||||||
diff -urPp src/clients/flagmanager-aml.h src/clients/boblight-aml/flagmanager-aml.h
|
|
||||||
--- /dev/null Thu Jan 1 00:00:00 1970
|
|
||||||
+++ b/src/clients/boblight-aml/flagmanager-aml.h Thu Jan 15 10:20:15 2015
|
|
||||||
@@ -0,0 +1,36 @@
|
|
||||||
+/*
|
|
||||||
+ * boblight
|
|
||||||
+ * Copyright (C) Bob 2009
|
|
||||||
+ *
|
|
||||||
+ * boblight is free software: you can redistribute it and/or modify it
|
|
||||||
+ * under the terms of the GNU General Public License as published by the
|
|
||||||
+ * Free Software Foundation, either version 3 of the License, or
|
|
||||||
+ * (at your option) any later version.
|
|
||||||
+ *
|
|
||||||
+ * boblight is distributed in the hope that it will be useful, but
|
|
||||||
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
||||||
+ * See the GNU General Public License for more details.
|
|
||||||
+ *
|
|
||||||
+ * You should have received a copy of the GNU General Public License along
|
|
||||||
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
+ */
|
|
||||||
+
|
|
||||||
+#ifndef FLAGMANAGERAML
|
|
||||||
+#define FLAGMANAGERAML
|
|
||||||
+
|
|
||||||
+#include "clients/flagmanager.h"
|
|
||||||
+
|
|
||||||
+class CFlagManagerAML : public CFlagManager
|
|
||||||
+{
|
|
||||||
+ public:
|
|
||||||
+ CFlagManagerAML();
|
|
||||||
+ void ParseFlagsExtended(int& argc, char**& argv, int& c, char*& optarg);
|
|
||||||
+
|
|
||||||
+ void PrintHelpMessage();
|
|
||||||
+ std::string m_device; //device to open for amvideocap
|
|
||||||
+ bool generateCmdLine;
|
|
||||||
+
|
|
||||||
+};
|
|
||||||
+
|
|
||||||
+#endif //FLAGMANAGERAML
|
|
||||||
\ No newline at end of file
|
|
||||||
@@ -18,10 +18,4 @@ if [ -x $ADDON_DIR/bin/boblight-X11 -a -e $ADDON_HOME/boblight.X11 ] ; then
|
|||||||
boblight-X11 -f >/dev/null 2>&1
|
boblight-X11 -f >/dev/null 2>&1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ -x $ADDON_DIR/bin/boblight-aml -a -e /dev/amvideocap0 ] ; then
|
|
||||||
#generates cmdline from boblight addon settings
|
|
||||||
CMDLINE=`boblight-aml -g`
|
|
||||||
boblight-aml $CMDLINE >/dev/null 2>&1 &
|
|
||||||
fi
|
|
||||||
|
|
||||||
exec boblightd -c $ADDON_HOME/boblight.conf > $ADDON_LOG_FILE 2>&1
|
exec boblightd -c $ADDON_HOME/boblight.conf > $ADDON_LOG_FILE 2>&1
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
126
|
||||||
|
- Update to docker 18.09.7
|
||||||
|
|
||||||
125
|
125
|
||||||
- Update to docker 18.09.5
|
- Update to docker 18.09.5
|
||||||
|
|
||||||
|
|||||||
@@ -3,11 +3,10 @@
|
|||||||
# Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv)
|
# Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv)
|
||||||
|
|
||||||
PKG_NAME="docker"
|
PKG_NAME="docker"
|
||||||
PKG_VERSION="18.09.5"
|
PKG_VERSION="18.09.7"
|
||||||
PKG_SHA256="57f2a5d3374d86a8eb680c91df4351f5cb648351b9b32520c6fd2d66e7e97fd5"
|
PKG_SHA256="f05dc15f5c11635472534c3aaf759c39c1bba842dd1ac23059431c2fd1ae1795"
|
||||||
PKG_REV="125"
|
PKG_REV="126"
|
||||||
PKG_ARCH="any"
|
PKG_ARCH="any"
|
||||||
PKG_ADDON_PROJECTS="any !WeTek_Core !WeTek_Play"
|
|
||||||
PKG_LICENSE="ASL"
|
PKG_LICENSE="ASL"
|
||||||
PKG_SITE="http://www.docker.com/"
|
PKG_SITE="http://www.docker.com/"
|
||||||
PKG_URL="https://github.com/docker/docker-ce/archive/v${PKG_VERSION}.tar.gz"
|
PKG_URL="https://github.com/docker/docker-ce/archive/v${PKG_VERSION}.tar.gz"
|
||||||
|
|||||||
@@ -1,8 +1,25 @@
|
|||||||
From 9979cbaa4d0108da552fd452294788a042766995 Mon Sep 17 00:00:00 2001
|
From de25daa9281709a90e4dc23b4c27cbcdcef32fd3 Mon Sep 17 00:00:00 2001
|
||||||
From: 5schatten <supervisedthinking@gmail.com>
|
From: 5schatten <supervisedthinking@gmail.com>
|
||||||
Date: Wed, 7 Nov 2018 12:22:23 +0100
|
Date: Sat, 29 Jun 2019 17:58:09 +0200
|
||||||
Subject: [PATCH] use Kodi addon storage location
|
Subject: [PATCH] use Kodi addon storage location
|
||||||
|
|
||||||
|
---
|
||||||
|
.../github.com/docker/docker/registry/config_unix.go | 2 +-
|
||||||
|
.../github.com/docker/docker/registry/endpoint_v1.go | 2 +-
|
||||||
|
components/engine/cmd/dockerd/daemon_unix.go | 4 ++--
|
||||||
|
components/engine/daemon/config/config_test.go | 2 +-
|
||||||
|
.../engine/integration-cli/docker_cli_daemon_test.go | 12 ++++++------
|
||||||
|
.../docker_cli_external_volume_driver_unix_test.go | 8 ++++----
|
||||||
|
.../integration-cli/docker_cli_network_unix_test.go | 8 ++++----
|
||||||
|
.../engine/integration-cli/docker_cli_swarm_test.go | 8 ++++----
|
||||||
|
.../integration/plugin/authz/authz_plugin_test.go | 6 +++---
|
||||||
|
.../integration/plugin/graphdriver/external_test.go | 6 +++---
|
||||||
|
components/engine/pkg/plugins/discovery_unix.go | 2 +-
|
||||||
|
components/engine/pkg/plugins/plugins.go | 2 +-
|
||||||
|
components/engine/registry/config_unix.go | 2 +-
|
||||||
|
components/engine/registry/endpoint_v1.go | 2 +-
|
||||||
|
14 files changed, 33 insertions(+), 33 deletions(-)
|
||||||
|
|
||||||
diff --git a/components/cli/vendor/github.com/docker/docker/registry/config_unix.go b/components/cli/vendor/github.com/docker/docker/registry/config_unix.go
|
diff --git a/components/cli/vendor/github.com/docker/docker/registry/config_unix.go b/components/cli/vendor/github.com/docker/docker/registry/config_unix.go
|
||||||
index 20fb47bcae..a023df7895 100644
|
index 20fb47bcae..a023df7895 100644
|
||||||
--- a/components/cli/vendor/github.com/docker/docker/registry/config_unix.go
|
--- a/components/cli/vendor/github.com/docker/docker/registry/config_unix.go
|
||||||
@@ -65,7 +82,7 @@ index 6998ed3312..c255b62146 100644
|
|||||||
flags.String("config-file", configFile, "")
|
flags.String("config-file", configFile, "")
|
||||||
err := Reload(configFile, flags, func(c *Config) {
|
err := Reload(configFile, flags, func(c *Config) {
|
||||||
diff --git a/components/engine/integration-cli/docker_cli_daemon_test.go b/components/engine/integration-cli/docker_cli_daemon_test.go
|
diff --git a/components/engine/integration-cli/docker_cli_daemon_test.go b/components/engine/integration-cli/docker_cli_daemon_test.go
|
||||||
index 986cc27530..7a0c2805cd 100644
|
index d3cd5f1676..b5e504489d 100644
|
||||||
--- a/components/engine/integration-cli/docker_cli_daemon_test.go
|
--- a/components/engine/integration-cli/docker_cli_daemon_test.go
|
||||||
+++ b/components/engine/integration-cli/docker_cli_daemon_test.go
|
+++ b/components/engine/integration-cli/docker_cli_daemon_test.go
|
||||||
@@ -546,11 +546,11 @@ func (s *DockerDaemonSuite) TestDaemonAllocatesListeningPort(c *check.C) {
|
@@ -546,11 +546,11 @@ func (s *DockerDaemonSuite) TestDaemonAllocatesListeningPort(c *check.C) {
|
||||||
@@ -121,11 +138,11 @@ index da8bb7e011..605a162e79 100644
|
|||||||
|
|
||||||
- err := os.MkdirAll("/etc/docker/plugins", 0755)
|
- err := os.MkdirAll("/etc/docker/plugins", 0755)
|
||||||
+ err := os.MkdirAll("/storage/.kodi/userdata/addon_data/service.system.docker/config/plugins", 0755)
|
+ err := os.MkdirAll("/storage/.kodi/userdata/addon_data/service.system.docker/config/plugins", 0755)
|
||||||
c.Assert(err, checker.IsNil)
|
assert.NilError(c, err)
|
||||||
|
|
||||||
- err = ioutil.WriteFile("/etc/docker/plugins/"+name+".spec", []byte(s.Server.URL), 0644)
|
- err = ioutil.WriteFile("/etc/docker/plugins/"+name+".spec", []byte(s.Server.URL), 0644)
|
||||||
+ err = ioutil.WriteFile("/storage/.kodi/userdata/addon_data/service.system.docker/config/plugins/"+name+".spec", []byte(s.Server.URL), 0644)
|
+ err = ioutil.WriteFile("/storage/.kodi/userdata/addon_data/service.system.docker/config/plugins/"+name+".spec", []byte(s.Server.URL), 0644)
|
||||||
c.Assert(err, checker.IsNil)
|
assert.NilError(c, err)
|
||||||
return s
|
return s
|
||||||
}
|
}
|
||||||
@@ -278,7 +278,7 @@ func newVolumePlugin(c *check.C, name string) *volumePlugin {
|
@@ -278,7 +278,7 @@ func newVolumePlugin(c *check.C, name string) *volumePlugin {
|
||||||
@@ -134,7 +151,7 @@ index da8bb7e011..605a162e79 100644
|
|||||||
|
|
||||||
- err := os.RemoveAll("/etc/docker/plugins")
|
- err := os.RemoveAll("/etc/docker/plugins")
|
||||||
+ err := os.RemoveAll("/storage/.kodi/userdata/addon_data/service.system.docker/config/plugins")
|
+ err := os.RemoveAll("/storage/.kodi/userdata/addon_data/service.system.docker/config/plugins")
|
||||||
c.Assert(err, checker.IsNil)
|
assert.NilError(c, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -371,7 +371,7 @@ func hostVolumePath(name string) string {
|
@@ -371,7 +371,7 @@ func hostVolumePath(name string) string {
|
||||||
@@ -156,17 +173,17 @@ index d3d6256a75..a0f0ae973d 100644
|
|||||||
|
|
||||||
- err := os.MkdirAll("/etc/docker/plugins", 0755)
|
- err := os.MkdirAll("/etc/docker/plugins", 0755)
|
||||||
+ err := os.MkdirAll("/storage/.kodi/userdata/addon_data/service.system.docker/config/plugins", 0755)
|
+ err := os.MkdirAll("/storage/.kodi/userdata/addon_data/service.system.docker/config/plugins", 0755)
|
||||||
c.Assert(err, checker.IsNil)
|
assert.NilError(c, err)
|
||||||
|
|
||||||
- fileName := fmt.Sprintf("/etc/docker/plugins/%s.spec", netDrv)
|
- fileName := fmt.Sprintf("/etc/docker/plugins/%s.spec", netDrv)
|
||||||
+ fileName := fmt.Sprintf("/storage/.kodi/userdata/addon_data/service.system.docker/config/plugins/%s.spec", netDrv)
|
+ fileName := fmt.Sprintf("/storage/.kodi/userdata/addon_data/service.system.docker/config/plugins/%s.spec", netDrv)
|
||||||
err = ioutil.WriteFile(fileName, []byte(url), 0644)
|
err = ioutil.WriteFile(fileName, []byte(url), 0644)
|
||||||
c.Assert(err, checker.IsNil)
|
assert.NilError(c, err)
|
||||||
|
|
||||||
- ipamFileName := fmt.Sprintf("/etc/docker/plugins/%s.spec", ipamDrv)
|
- ipamFileName := fmt.Sprintf("/etc/docker/plugins/%s.spec", ipamDrv)
|
||||||
+ ipamFileName := fmt.Sprintf("/storage/.kodi/userdata/addon_data/service.system.docker/config/plugins/%s.spec", ipamDrv)
|
+ ipamFileName := fmt.Sprintf("/storage/.kodi/userdata/addon_data/service.system.docker/config/plugins/%s.spec", ipamDrv)
|
||||||
err = ioutil.WriteFile(ipamFileName, []byte(url), 0644)
|
err = ioutil.WriteFile(ipamFileName, []byte(url), 0644)
|
||||||
c.Assert(err, checker.IsNil)
|
assert.NilError(c, err)
|
||||||
}
|
}
|
||||||
@@ -227,7 +227,7 @@ func (s *DockerNetworkSuite) TearDownSuite(c *check.C) {
|
@@ -227,7 +227,7 @@ func (s *DockerNetworkSuite) TearDownSuite(c *check.C) {
|
||||||
|
|
||||||
@@ -174,11 +191,11 @@ index d3d6256a75..a0f0ae973d 100644
|
|||||||
|
|
||||||
- err := os.RemoveAll("/etc/docker/plugins")
|
- err := os.RemoveAll("/etc/docker/plugins")
|
||||||
+ err := os.RemoveAll("/storage/.kodi/userdata/addon_data/service.system.docker/config/plugins")
|
+ err := os.RemoveAll("/storage/.kodi/userdata/addon_data/service.system.docker/config/plugins")
|
||||||
c.Assert(err, checker.IsNil)
|
assert.NilError(c, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
diff --git a/components/engine/integration-cli/docker_cli_swarm_test.go b/components/engine/integration-cli/docker_cli_swarm_test.go
|
diff --git a/components/engine/integration-cli/docker_cli_swarm_test.go b/components/engine/integration-cli/docker_cli_swarm_test.go
|
||||||
index 9f99d0c849..2d9a4b088e 100644
|
index f6fadcf995..5d0b5256c1 100644
|
||||||
--- a/components/engine/integration-cli/docker_cli_swarm_test.go
|
--- a/components/engine/integration-cli/docker_cli_swarm_test.go
|
||||||
+++ b/components/engine/integration-cli/docker_cli_swarm_test.go
|
+++ b/components/engine/integration-cli/docker_cli_swarm_test.go
|
||||||
@@ -783,14 +783,14 @@ func setupRemoteGlobalNetworkPlugin(c *check.C, mux *http.ServeMux, url, netDrv,
|
@@ -783,14 +783,14 @@ func setupRemoteGlobalNetworkPlugin(c *check.C, mux *http.ServeMux, url, netDrv,
|
||||||
@@ -187,17 +204,17 @@ index 9f99d0c849..2d9a4b088e 100644
|
|||||||
|
|
||||||
- err := os.MkdirAll("/etc/docker/plugins", 0755)
|
- err := os.MkdirAll("/etc/docker/plugins", 0755)
|
||||||
+ err := os.MkdirAll("/storage/.kodi/userdata/addon_data/service.system.docker/config/plugins", 0755)
|
+ err := os.MkdirAll("/storage/.kodi/userdata/addon_data/service.system.docker/config/plugins", 0755)
|
||||||
c.Assert(err, checker.IsNil)
|
assert.NilError(c, err)
|
||||||
|
|
||||||
- fileName := fmt.Sprintf("/etc/docker/plugins/%s.spec", netDrv)
|
- fileName := fmt.Sprintf("/etc/docker/plugins/%s.spec", netDrv)
|
||||||
+ fileName := fmt.Sprintf("/storage/.kodi/userdata/addon_data/service.system.docker/config/plugins/%s.spec", netDrv)
|
+ fileName := fmt.Sprintf("/storage/.kodi/userdata/addon_data/service.system.docker/config/plugins/%s.spec", netDrv)
|
||||||
err = ioutil.WriteFile(fileName, []byte(url), 0644)
|
err = ioutil.WriteFile(fileName, []byte(url), 0644)
|
||||||
c.Assert(err, checker.IsNil)
|
assert.NilError(c, err)
|
||||||
|
|
||||||
- ipamFileName := fmt.Sprintf("/etc/docker/plugins/%s.spec", ipamDrv)
|
- ipamFileName := fmt.Sprintf("/etc/docker/plugins/%s.spec", ipamDrv)
|
||||||
+ ipamFileName := fmt.Sprintf("/storage/.kodi/userdata/addon_data/service.system.docker/config/plugins/%s.spec", ipamDrv)
|
+ ipamFileName := fmt.Sprintf("/storage/.kodi/userdata/addon_data/service.system.docker/config/plugins/%s.spec", ipamDrv)
|
||||||
err = ioutil.WriteFile(ipamFileName, []byte(url), 0644)
|
err = ioutil.WriteFile(ipamFileName, []byte(url), 0644)
|
||||||
c.Assert(err, checker.IsNil)
|
assert.NilError(c, err)
|
||||||
}
|
}
|
||||||
@@ -802,7 +802,7 @@ func (s *DockerSwarmSuite) TestSwarmNetworkPlugin(c *check.C) {
|
@@ -802,7 +802,7 @@ func (s *DockerSwarmSuite) TestSwarmNetworkPlugin(c *check.C) {
|
||||||
setupRemoteGlobalNetworkPlugin(c, mux, s.server.URL, globalNetworkPlugin, globalIPAMPlugin)
|
setupRemoteGlobalNetworkPlugin(c, mux, s.server.URL, globalNetworkPlugin, globalIPAMPlugin)
|
||||||
@@ -205,11 +222,11 @@ index 9f99d0c849..2d9a4b088e 100644
|
|||||||
s.server.Close()
|
s.server.Close()
|
||||||
- err := os.RemoveAll("/etc/docker/plugins")
|
- err := os.RemoveAll("/etc/docker/plugins")
|
||||||
+ err := os.RemoveAll("/storage/.kodi/userdata/addon_data/service.system.docker/config/plugins")
|
+ err := os.RemoveAll("/storage/.kodi/userdata/addon_data/service.system.docker/config/plugins")
|
||||||
c.Assert(err, checker.IsNil)
|
assert.NilError(c, err)
|
||||||
}()
|
}()
|
||||||
|
|
||||||
diff --git a/components/engine/integration/plugin/authz/authz_plugin_test.go b/components/engine/integration/plugin/authz/authz_plugin_test.go
|
diff --git a/components/engine/integration/plugin/authz/authz_plugin_test.go b/components/engine/integration/plugin/authz/authz_plugin_test.go
|
||||||
index d0f5d8a783..ba626c6310 100644
|
index 105affc1af..fa631a377a 100644
|
||||||
--- a/components/engine/integration/plugin/authz/authz_plugin_test.go
|
--- a/components/engine/integration/plugin/authz/authz_plugin_test.go
|
||||||
+++ b/components/engine/integration/plugin/authz/authz_plugin_test.go
|
+++ b/components/engine/integration/plugin/authz/authz_plugin_test.go
|
||||||
@@ -55,15 +55,15 @@ func setupTestV1(t *testing.T) func() {
|
@@ -55,15 +55,15 @@ func setupTestV1(t *testing.T) func() {
|
||||||
@@ -268,7 +285,7 @@ index 58058f2828..a7b449ca25 100644
|
|||||||
-var specsPaths = []string{"/etc/docker/plugins", "/usr/lib/docker/plugins"}
|
-var specsPaths = []string{"/etc/docker/plugins", "/usr/lib/docker/plugins"}
|
||||||
+var specsPaths = []string{"/storage/.kodi/userdata/addon_data/service.system.docker/config/plugins", "/usr/lib/docker/plugins"}
|
+var specsPaths = []string{"/storage/.kodi/userdata/addon_data/service.system.docker/config/plugins", "/usr/lib/docker/plugins"}
|
||||||
diff --git a/components/engine/pkg/plugins/plugins.go b/components/engine/pkg/plugins/plugins.go
|
diff --git a/components/engine/pkg/plugins/plugins.go b/components/engine/pkg/plugins/plugins.go
|
||||||
index 28c06ff693..c24cad2b63 100644
|
index 6962079df9..77b69265b1 100644
|
||||||
--- a/components/engine/pkg/plugins/plugins.go
|
--- a/components/engine/pkg/plugins/plugins.go
|
||||||
+++ b/components/engine/pkg/plugins/plugins.go
|
+++ b/components/engine/pkg/plugins/plugins.go
|
||||||
@@ -4,7 +4,7 @@
|
@@ -4,7 +4,7 @@
|
||||||
|
|||||||
@@ -1,3 +1,12 @@
|
|||||||
|
105
|
||||||
|
- Update to 4.2.1.0
|
||||||
|
|
||||||
|
104
|
||||||
|
- Update to 4.2.0.40
|
||||||
|
|
||||||
|
103
|
||||||
|
- Update to 4.1.1.0
|
||||||
|
|
||||||
102
|
102
|
||||||
- Update to 4.1.0.26
|
- Update to 4.1.0.26
|
||||||
|
|
||||||
|
|||||||
@@ -2,9 +2,9 @@
|
|||||||
# Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv)
|
# Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv)
|
||||||
|
|
||||||
PKG_NAME="emby4"
|
PKG_NAME="emby4"
|
||||||
PKG_VERSION="4.1.0.26"
|
PKG_VERSION="4.2.1.0"
|
||||||
PKG_SHA256="ccb9bb463e6ff5e084f731ccbb48119176cdc3592b3234796eefa09ec9e03e0f"
|
PKG_SHA256="684a47c36700063141257c6325bbb2519ba11a7c7711e54e128d96f30adecdff"
|
||||||
PKG_REV="102"
|
PKG_REV="105"
|
||||||
PKG_ARCH="any"
|
PKG_ARCH="any"
|
||||||
PKG_LICENSE="prop."
|
PKG_LICENSE="prop."
|
||||||
PKG_SITE="http://emby.media"
|
PKG_SITE="http://emby.media"
|
||||||
|
|||||||
@@ -1,13 +0,0 @@
|
|||||||
110
|
|
||||||
- Rewrite add-on from scratch
|
|
||||||
- Add support for APPS, SETUP, CVBS (X92) and POWER (A1 Max) indicators.
|
|
||||||
- Add a configuration dialog:
|
|
||||||
* Adjust display brightness.
|
|
||||||
* Storage access indication.
|
|
||||||
* Advanced hardware configuration of the display.
|
|
||||||
- Fix crash if aml_fd628 module is not loaded (led_on, led_off files don't exist)
|
|
||||||
- Fix disable add-on from Kodi UI.
|
|
||||||
- Turn off indicators when add-on is disabled.
|
|
||||||
|
|
||||||
100
|
|
||||||
- Initial add-on
|
|
||||||
Binary file not shown.
|
Before Width: | Height: | Size: 31 KiB |
@@ -1,30 +0,0 @@
|
|||||||
# SPDX-License-Identifier: GPL-2.0
|
|
||||||
# Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv)
|
|
||||||
|
|
||||||
PKG_NAME="fd628"
|
|
||||||
PKG_VERSION="1.1"
|
|
||||||
PKG_REV="100"
|
|
||||||
PKG_ARCH="any"
|
|
||||||
PKG_LICENSE="GPL"
|
|
||||||
PKG_SITE="https://libreelec.tv"
|
|
||||||
PKG_URL=""
|
|
||||||
PKG_DEPENDS_TARGET="toolchain"
|
|
||||||
PKG_SECTION="service"
|
|
||||||
PKG_SHORTDESC="fd628: Kodi service to light up additional icons on devices with FD628 display"
|
|
||||||
PKG_LONGDESC="fd628: Kodi service to light up additional icons on devices with FD628 display"
|
|
||||||
PKG_TOOLCHAIN="manual"
|
|
||||||
|
|
||||||
PKG_IS_ADDON="yes"
|
|
||||||
PKG_ADDON_NAME="service.fd628"
|
|
||||||
PKG_ADDON_PROJECTS="S905 S912"
|
|
||||||
PKG_ADDON_TYPE="xbmc.service"
|
|
||||||
|
|
||||||
make_target() {
|
|
||||||
sed -e "s|@PKG_VERSION@|$PKG_VERSION|g" \
|
|
||||||
-i addon.xml
|
|
||||||
}
|
|
||||||
|
|
||||||
addon() {
|
|
||||||
mkdir -p $ADDON_BUILD/$PKG_ADDON_ID
|
|
||||||
cp -R $PKG_BUILD/* $ADDON_BUILD/$PKG_ADDON_ID
|
|
||||||
}
|
|
||||||
@@ -1,22 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
|
||||||
<addon id="service.fd628"
|
|
||||||
name="FD628 Display"
|
|
||||||
version="@PKG_VERSION@"
|
|
||||||
provider-name="Team LibreELEC">
|
|
||||||
<requires>
|
|
||||||
<import addon="xbmc.python" version="2.1.0"/>
|
|
||||||
</requires>
|
|
||||||
<extension point="xbmc.service"
|
|
||||||
library="resources/lib/service.py"
|
|
||||||
start="startup">
|
|
||||||
</extension>
|
|
||||||
<extension point="xbmc.addon.metadata">
|
|
||||||
<summary>Service for controlling FD628 VFD display icons</summary>
|
|
||||||
<description>Service for controlling FD628 VFD display icons, e.g. Ethernet/WiFi connection status and Time</description>
|
|
||||||
<platform>all</platform>
|
|
||||||
<assets>
|
|
||||||
<icon>resources/icon.png</icon>
|
|
||||||
</assets>
|
|
||||||
</extension>
|
|
||||||
</addon>
|
|
||||||
|
|
||||||
@@ -1,136 +0,0 @@
|
|||||||
# Kodi Media Center language file
|
|
||||||
# Addon Name: FD628 Display
|
|
||||||
# Addon id: service.fd628
|
|
||||||
# Addon Provider: Team LibreELEC
|
|
||||||
msgid ""
|
|
||||||
msgstr ""
|
|
||||||
"Project-Id-Version: XBMC-Addons\n"
|
|
||||||
"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n"
|
|
||||||
"POT-Creation-Date: 2018-02-12 17:48+0200\n"
|
|
||||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
|
||||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
|
||||||
"Language-Team: LANGUAGE\n"
|
|
||||||
"MIME-Version: 1.0\n"
|
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
|
||||||
"Language: en_GB\n"
|
|
||||||
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
|
|
||||||
|
|
||||||
# Kodi Settings
|
|
||||||
msgctxt "#30000"
|
|
||||||
msgid "General"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgctxt "#30001"
|
|
||||||
msgid "Turn on display"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgctxt "#30002"
|
|
||||||
msgid "Display brightness"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgctxt "#30003"
|
|
||||||
msgid "Advanced settings"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgctxt "#30004"
|
|
||||||
msgid "Display type"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgctxt "#30026"
|
|
||||||
msgid "Common anode display (transposed ram)"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgctxt "#30013"
|
|
||||||
msgid "Enable storage access (RW) indicator"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgctxt "#30014"
|
|
||||||
msgid "Select which icon is to be used as the access indicator"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgctxt "#30028"
|
|
||||||
msgid "Clock colon (:) always on"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgctxt "#30015"
|
|
||||||
msgid "play"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgctxt "#30016"
|
|
||||||
msgid "pause"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgctxt "#30017"
|
|
||||||
msgid "hdmi"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgctxt "#30018"
|
|
||||||
msgid "cvbs"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgctxt "#30019"
|
|
||||||
msgid "eth"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgctxt "#30020"
|
|
||||||
msgid "wifi"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgctxt "#30021"
|
|
||||||
msgid "setup"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgctxt "#30022"
|
|
||||||
msgid "apps"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgctxt "#30023"
|
|
||||||
msgid "usb"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgctxt "#30024"
|
|
||||||
msgid "sd"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgctxt "#30025"
|
|
||||||
msgid "alarm"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgctxt "#30027"
|
|
||||||
msgid "power"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgctxt "#30012"
|
|
||||||
msgid "Reorder character indexes"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgctxt "#30005"
|
|
||||||
msgid "Index 0"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgctxt "#30006"
|
|
||||||
msgid "Index 1"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgctxt "#30007"
|
|
||||||
msgid "Index 2"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgctxt "#30008"
|
|
||||||
msgid "Index 3"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgctxt "#30009"
|
|
||||||
msgid "Index 4"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgctxt "#30010"
|
|
||||||
msgid "Index 5"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgctxt "#30011"
|
|
||||||
msgid "Index 6"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
# Max index 30028
|
|
||||||
@@ -1,78 +0,0 @@
|
|||||||
# SPDX-License-Identifier: GPL-2.0
|
|
||||||
# Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv)
|
|
||||||
|
|
||||||
import os
|
|
||||||
import struct
|
|
||||||
from fd628utils import *
|
|
||||||
|
|
||||||
_led_cmd = '/sys/class/leds/le-vfd/led_cmd'
|
|
||||||
|
|
||||||
class fd628Dev:
|
|
||||||
def __init__(self):
|
|
||||||
import ioctl
|
|
||||||
import ctypes
|
|
||||||
size = ctypes.sizeof(ctypes.c_int(0))
|
|
||||||
self._FD628_IOC_MAGIC = ord('M')
|
|
||||||
self._FD628_IOC_SMODE = ioctl.IOW(self._FD628_IOC_MAGIC, 1, size)
|
|
||||||
self._FD628_IOC_GMODE = ioctl.IOR(self._FD628_IOC_MAGIC, 2, size)
|
|
||||||
self._FD628_IOC_SBRIGHT = ioctl.IOW(self._FD628_IOC_MAGIC, 3, size)
|
|
||||||
self._FD628_IOC_GBRIGHT = ioctl.IOR(self._FD628_IOC_MAGIC, 4, size)
|
|
||||||
self._FD628_IOC_POWER = ioctl.IOW(self._FD628_IOC_MAGIC, 5, size)
|
|
||||||
self._FD628_IOC_GVER = ioctl.IOR(self._FD628_IOC_MAGIC, 6, size)
|
|
||||||
self._FD628_IOC_STATUS_LED = ioctl.IOW(self._FD628_IOC_MAGIC, 7, size)
|
|
||||||
self._FD628_IOC_GDISPLAY_TYPE = ioctl.IOR(self._FD628_IOC_MAGIC, 8, size)
|
|
||||||
self._FD628_IOC_SDISPLAY_TYPE = ioctl.IOW(self._FD628_IOC_MAGIC, 9, size)
|
|
||||||
self._FD628_IOC_SCHARS_ORDER = ioctl.IOW(self._FD628_IOC_MAGIC, 10, 7)
|
|
||||||
self._FD628_IOC_USE_DTB_CONFIG = ioctl.IOW(self._FD628_IOC_MAGIC, 11, size)
|
|
||||||
self._FD628_IOC_MAXNR = 12
|
|
||||||
|
|
||||||
def enableDisplay(self, value):
|
|
||||||
self.__writeFD628(self._FD628_IOC_POWER, int(value))
|
|
||||||
|
|
||||||
def getBrightness(self):
|
|
||||||
return self.__readFD628(self._FD628_IOC_GBRIGHT)
|
|
||||||
|
|
||||||
def setBrightness(self, value):
|
|
||||||
self.__writeFD628(self._FD628_IOC_SBRIGHT, value)
|
|
||||||
|
|
||||||
def getDisplayType(self):
|
|
||||||
return self.__readFD628(self._FD628_IOC_GDISPLAY_TYPE)
|
|
||||||
|
|
||||||
def setDisplayType(self, value):
|
|
||||||
self.__writeFD628(self._FD628_IOC_SDISPLAY_TYPE, value)
|
|
||||||
|
|
||||||
def setCharacterOrder(self, value):
|
|
||||||
pack = struct.pack('BBBBBBB', value[0], value[1], value[2], value[3], value[4], value[5], value[6])
|
|
||||||
self.__writeFD628(self._FD628_IOC_SCHARS_ORDER, pack, True)
|
|
||||||
|
|
||||||
def useDtbConfig(self):
|
|
||||||
self.__writeFD628(self._FD628_IOC_USE_DTB_CONFIG, 0)
|
|
||||||
|
|
||||||
def __readFD628(self, cmd, isBuf = False):
|
|
||||||
import ioctl
|
|
||||||
ret = None
|
|
||||||
if (ioctl.DIR(cmd) == ioctl.READ and self.__writeFD628(cmd, 0)):
|
|
||||||
with open(_led_cmd, "rb") as vfd:
|
|
||||||
ret = vfd.read()
|
|
||||||
if (ret == ''):
|
|
||||||
ret = None
|
|
||||||
if (not isBuf and ret != None):
|
|
||||||
ret = int(ret, 0)
|
|
||||||
kodiLog('fd628Dev.__readFD628: value = {0}'.format(str(ret)))
|
|
||||||
return ret
|
|
||||||
|
|
||||||
def __writeFD628(self, cmd, value, isBuf = False):
|
|
||||||
ret = False
|
|
||||||
if (os.path.isfile(_led_cmd)):
|
|
||||||
if isBuf:
|
|
||||||
value = ''.join([struct.pack('I', cmd), value])
|
|
||||||
else:
|
|
||||||
value = struct.pack('Ii', cmd, value)
|
|
||||||
kodiLog('fd628Dev.__writeFD628: value = {0}'.format(repr(value)))
|
|
||||||
try:
|
|
||||||
with open(_led_cmd, "wb") as vfd:
|
|
||||||
vfd.write(value)
|
|
||||||
ret = True
|
|
||||||
except Exception as inst:
|
|
||||||
kodiLogError(inst)
|
|
||||||
return ret
|
|
||||||
@@ -1,95 +0,0 @@
|
|||||||
# SPDX-License-Identifier: GPL-2.0
|
|
||||||
# Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv)
|
|
||||||
|
|
||||||
import xbmcaddon
|
|
||||||
|
|
||||||
addon = xbmcaddon.Addon(id='service.fd628')
|
|
||||||
|
|
||||||
def getSetting(id):
|
|
||||||
return addon.getSetting(id)
|
|
||||||
|
|
||||||
def getSettingBool(id):
|
|
||||||
value = getSetting(id).lower()
|
|
||||||
if (value == 'true'):
|
|
||||||
value = True
|
|
||||||
else:
|
|
||||||
value = False
|
|
||||||
return value
|
|
||||||
|
|
||||||
def getSettingInt(id):
|
|
||||||
return int(getSetting(id))
|
|
||||||
|
|
||||||
def getSettingNumber(id):
|
|
||||||
return float(getSetting(id))
|
|
||||||
|
|
||||||
class fd628Settings:
|
|
||||||
def __init__(self):
|
|
||||||
self.readValues()
|
|
||||||
|
|
||||||
def isDisplayOn(self):
|
|
||||||
return self._displayOn
|
|
||||||
|
|
||||||
def isAdvancedSettings(self):
|
|
||||||
return self._displayAdvanced
|
|
||||||
|
|
||||||
def getBrightness(self):
|
|
||||||
return self._displayBrightness
|
|
||||||
|
|
||||||
def getDisplayType(self):
|
|
||||||
return self._displayType
|
|
||||||
|
|
||||||
def isCommonAnode(self):
|
|
||||||
return self._commonAnode
|
|
||||||
|
|
||||||
def getDisplay(self):
|
|
||||||
value = self.getDisplayType()
|
|
||||||
if (self.isCommonAnode()):
|
|
||||||
value = value + (1 << 16)
|
|
||||||
return value
|
|
||||||
|
|
||||||
def getCharacterIndex(self, i):
|
|
||||||
return self._characterIndexes[i]
|
|
||||||
|
|
||||||
def getCharacterIndexes(self):
|
|
||||||
return self._characterIndexes
|
|
||||||
|
|
||||||
def isStorageIndicator(self):
|
|
||||||
return self._storageIndicator
|
|
||||||
|
|
||||||
def getStorageIndicatorIcon(self):
|
|
||||||
return self._storageIndicatorIcon
|
|
||||||
|
|
||||||
def isColonOn(self):
|
|
||||||
return self._colonOn
|
|
||||||
|
|
||||||
def readValues(self):
|
|
||||||
self._displayAdvanced = False
|
|
||||||
self._displayOn = getSettingBool('display.on')
|
|
||||||
if (self._displayOn):
|
|
||||||
self._displayBrightness = getSettingInt('display.brightness')
|
|
||||||
self._storageIndicator = getSettingBool('display.storage.indicator')
|
|
||||||
self._storageIndicatorIcon = getSetting('display.storage.indicator.icon')
|
|
||||||
self._colonOn = getSettingBool('display.colon.on')
|
|
||||||
self._displayAdvanced = getSettingBool('display.advanced')
|
|
||||||
if (self._displayAdvanced):
|
|
||||||
self._displayType = getSettingInt('display.type')
|
|
||||||
self._commonAnode = getSettingBool('display.common.anode')
|
|
||||||
self._characterIndexes = []
|
|
||||||
for i in range(7):
|
|
||||||
self._characterIndexes.append(getSettingInt('display.char.index{0}'.format(i)))
|
|
||||||
else:
|
|
||||||
self.__initDefaultValues()
|
|
||||||
else:
|
|
||||||
self.__initDefaultValues()
|
|
||||||
|
|
||||||
def __initDefaultValues(self):
|
|
||||||
if not (self._displayOn):
|
|
||||||
self._displayBrightness = 7
|
|
||||||
self._storageIndicator = False
|
|
||||||
self._storageIndicatorIcon = ''
|
|
||||||
self._colonOn = False
|
|
||||||
self._displayAdvanced = False
|
|
||||||
if not (self._displayAdvanced):
|
|
||||||
self._displayType = 0
|
|
||||||
self._commonAnode = False
|
|
||||||
self._characterIndexes = range(0, 7)
|
|
||||||
@@ -1,187 +0,0 @@
|
|||||||
# SPDX-License-Identifier: GPL-2.0
|
|
||||||
# Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv)
|
|
||||||
|
|
||||||
import xbmc
|
|
||||||
import os
|
|
||||||
from fd628utils import *
|
|
||||||
|
|
||||||
class fd628State(object):
|
|
||||||
def __init__(self, ledName):
|
|
||||||
self._value = False
|
|
||||||
self._hasChanged = False
|
|
||||||
self._ledName = ledName
|
|
||||||
|
|
||||||
def _getStr(self, className):
|
|
||||||
return '{0} ({1})'.format(className, self._ledName)
|
|
||||||
|
|
||||||
def update(self):
|
|
||||||
raise NotImplementedError
|
|
||||||
|
|
||||||
def getValue(self):
|
|
||||||
return self._value
|
|
||||||
|
|
||||||
def hasChanged(self):
|
|
||||||
return self._hasChanged
|
|
||||||
|
|
||||||
def getLedName(self):
|
|
||||||
return self._ledName
|
|
||||||
|
|
||||||
def _update(self, value):
|
|
||||||
if (value != self._value):
|
|
||||||
self._hasChanged = True
|
|
||||||
self._value = value
|
|
||||||
else:
|
|
||||||
self._hasChanged = False
|
|
||||||
|
|
||||||
class fd628IconIndicator(fd628State):
|
|
||||||
def __init__(self, on, ledName):
|
|
||||||
super(fd628IconIndicator, self).__init__(ledName)
|
|
||||||
self._on = on
|
|
||||||
|
|
||||||
def __str__(self):
|
|
||||||
return self._getStr('fd628IconIndicator')
|
|
||||||
|
|
||||||
def turnOn(self):
|
|
||||||
self._on = True
|
|
||||||
|
|
||||||
def turnOff(self):
|
|
||||||
self._on = False
|
|
||||||
|
|
||||||
def toggle(self):
|
|
||||||
self._on = not self._on
|
|
||||||
|
|
||||||
def update(self):
|
|
||||||
self._update(self._on)
|
|
||||||
|
|
||||||
class fd628CondVisibility(fd628State):
|
|
||||||
def __init__(self, ledName, cmd):
|
|
||||||
super(fd628CondVisibility, self).__init__(ledName)
|
|
||||||
self._cmd = cmd
|
|
||||||
|
|
||||||
def __str__(self):
|
|
||||||
return self._getStr('fd628CondVisibility')
|
|
||||||
|
|
||||||
def update(self):
|
|
||||||
value = xbmc.getCondVisibility(self._cmd)
|
|
||||||
self._update(value)
|
|
||||||
|
|
||||||
class fd628FileContains(fd628State):
|
|
||||||
def __init__(self, ledName, path, strings):
|
|
||||||
super(fd628FileContains, self).__init__(ledName)
|
|
||||||
self._path = path
|
|
||||||
self._strings = strings
|
|
||||||
|
|
||||||
def __str__(self):
|
|
||||||
return self._getStr('fd628FileContains')
|
|
||||||
|
|
||||||
def update(self):
|
|
||||||
if (os.path.isfile(self._path)):
|
|
||||||
with open(self._path, 'rb') as state:
|
|
||||||
content = state.read()
|
|
||||||
value = self.__checkContent(content)
|
|
||||||
self._update(value)
|
|
||||||
else:
|
|
||||||
self._update(False)
|
|
||||||
|
|
||||||
def __checkContent(self, content):
|
|
||||||
ret = False
|
|
||||||
for s in self._strings:
|
|
||||||
if (s in content):
|
|
||||||
ret = True
|
|
||||||
break
|
|
||||||
return ret
|
|
||||||
|
|
||||||
class fd628WindowChecker(fd628State):
|
|
||||||
def __init__(self, ledName, windows):
|
|
||||||
super(fd628WindowChecker, self).__init__(ledName)
|
|
||||||
self._windows = windows
|
|
||||||
|
|
||||||
def __str__(self):
|
|
||||||
return self._getStr('fd628WindowChecker')
|
|
||||||
|
|
||||||
def update(self):
|
|
||||||
value = False
|
|
||||||
for id in self._windows:
|
|
||||||
if (xbmc.getCondVisibility('Window.IsVisible({0})'.format(id))):
|
|
||||||
value = True
|
|
||||||
break
|
|
||||||
self._update(value)
|
|
||||||
|
|
||||||
class fd628ExtStorageChecker(fd628State):
|
|
||||||
def __init__(self, ledName, path):
|
|
||||||
super(fd628ExtStorageChecker, self).__init__(ledName)
|
|
||||||
self._path = path
|
|
||||||
|
|
||||||
def __str__(self):
|
|
||||||
return self._getStr('fd628ExtStorageChecker')
|
|
||||||
|
|
||||||
def update(self):
|
|
||||||
value = False
|
|
||||||
for folder, subs, files in os.walk('/dev/disk/by-uuid'):
|
|
||||||
for filename in files:
|
|
||||||
path = os.path.realpath(os.path.join(folder, filename))
|
|
||||||
if (path.startswith(self._path)):
|
|
||||||
value = True
|
|
||||||
break
|
|
||||||
self._update(value)
|
|
||||||
|
|
||||||
class fd628ExtStorageCount(fd628State):
|
|
||||||
def __init__(self, ledName, drives, type):
|
|
||||||
super(fd628ExtStorageCount, self).__init__(ledName)
|
|
||||||
if (drives == None): # Monitor all drives
|
|
||||||
self._drives = None
|
|
||||||
drives = self.__getAllDrives()
|
|
||||||
else: # Monitor listed drives
|
|
||||||
self._drives = drives
|
|
||||||
drives = self.__getSelectedDrives()
|
|
||||||
self._driveStats = {key: self.__readStatus(key) for key in drives}
|
|
||||||
kodiLogNotice('fd628ExtStorageCount.__init__: Drive stats ' + str(self._driveStats))
|
|
||||||
self._read = False
|
|
||||||
self._write = False
|
|
||||||
if (type == 'r'):
|
|
||||||
self._read = True
|
|
||||||
elif (type == 'w'):
|
|
||||||
self._write = True
|
|
||||||
elif (type == 'rw'):
|
|
||||||
self._read = True
|
|
||||||
self._write = True
|
|
||||||
else:
|
|
||||||
raise Exception('\'type\' must be \'r\', \'w\' or \'rw\'.')
|
|
||||||
|
|
||||||
def update(self):
|
|
||||||
value = False
|
|
||||||
if (self._drives == None):
|
|
||||||
drives = self.__getAllDrives()
|
|
||||||
else:
|
|
||||||
drives = self.__getSelectedDrives()
|
|
||||||
for drive in drives:
|
|
||||||
if (not drive in self._driveStats):
|
|
||||||
self._driveStats[drive] = None
|
|
||||||
kodiLogNotice('fd628ExtStorageCount.update: New drive found \'{0}\''.format(drive))
|
|
||||||
for path, stats in self._driveStats.iteritems():
|
|
||||||
newStats = self.__readStatus(path)
|
|
||||||
if (stats != None and newStats != None):
|
|
||||||
if (self._read):
|
|
||||||
value = value or stats[0] != newStats[0]
|
|
||||||
if (self._write):
|
|
||||||
value = value or stats[1] != newStats[1]
|
|
||||||
self._driveStats[path] = newStats
|
|
||||||
self._update(value)
|
|
||||||
|
|
||||||
def __readStatus(self, path):
|
|
||||||
path = os.path.join('/sys/block', path, 'stat')
|
|
||||||
if (os.path.isfile(path)):
|
|
||||||
with open(path, 'rb') as status:
|
|
||||||
values = status.read().split()
|
|
||||||
return (values[2], values[6])
|
|
||||||
else:
|
|
||||||
return None
|
|
||||||
|
|
||||||
def __getAllDrives(self):
|
|
||||||
drives = []
|
|
||||||
for folder, subs, files in os.walk('/sys/block'):
|
|
||||||
drives = [sub for sub in subs if (not sub.startswith('loop'))]
|
|
||||||
return drives
|
|
||||||
|
|
||||||
def __getSelectedDrives(self):
|
|
||||||
return [drive for drive in self.__getAllDrives() if ([d for d in self._drives if drive.startswith(d)])]
|
|
||||||
@@ -1,19 +0,0 @@
|
|||||||
# SPDX-License-Identifier: GPL-2.0
|
|
||||||
# Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv)
|
|
||||||
|
|
||||||
import xbmc
|
|
||||||
import xbmcaddon
|
|
||||||
|
|
||||||
addonName = xbmcaddon.Addon(id='service.fd628').getAddonInfo('name')
|
|
||||||
|
|
||||||
def kodiLog(message, level = xbmc.LOGDEBUG):
|
|
||||||
xbmc.log('{0} -> {1}'.format(addonName, str(message)), level)
|
|
||||||
|
|
||||||
def kodiLogError(message):
|
|
||||||
kodiLog(message, xbmc.LOGERROR)
|
|
||||||
|
|
||||||
def kodiLogWarning(message):
|
|
||||||
kodiLog(message, xbmc.LOGWARNING)
|
|
||||||
|
|
||||||
def kodiLogNotice(message):
|
|
||||||
kodiLog(message, xbmc.LOGNOTICE)
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user