mirror of
https://github.com/LibreELEC/LibreELEC.tv
synced 2025-09-24 19:46:01 +07:00
Compare commits
638 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2282c381ee | ||
|
|
e4d6559bfd | ||
|
|
4a47e8f060 | ||
|
|
16921614dc | ||
|
|
9b4b7c7a75 | ||
|
|
fae592ce2a | ||
|
|
b3a1583e67 | ||
|
|
1e5e3e6427 | ||
|
|
6966c1397f | ||
|
|
817f2bfa69 | ||
|
|
a4a5eb8963 | ||
|
|
61c8e1a2cb | ||
|
|
68ee7158df | ||
|
|
d6ec7eff64 | ||
|
|
0bd162f15d | ||
|
|
15f88e4948 | ||
|
|
9ca7acaa1a | ||
|
|
3a477292f2 | ||
|
|
d773d6e738 | ||
|
|
99b3f2675b | ||
|
|
160fdddd23 | ||
|
|
39d93a92a1 | ||
|
|
3b881610d8 | ||
|
|
ee121e9993 | ||
|
|
fe328982fa | ||
|
|
13b65ad75f | ||
|
|
1940e18764 | ||
|
|
b1eb0f58c4 | ||
|
|
b2f4adbf84 | ||
|
|
c68727df6c | ||
|
|
f13449dae2 | ||
|
|
740498e096 | ||
|
|
456c9cdd72 | ||
|
|
14ca662f42 | ||
|
|
22f7efc35d | ||
|
|
7dceb1e217 | ||
|
|
98a8528549 | ||
|
|
0438fcced4 | ||
|
|
eb000371a6 | ||
|
|
9cec883624 | ||
|
|
bce1a70342 | ||
|
|
25630317f4 | ||
|
|
4f8b304a1b | ||
|
|
13f0e4c0d3 | ||
|
|
8c269ca03a | ||
|
|
e024d217fe | ||
|
|
6913364e50 | ||
|
|
ed6ad4174a | ||
|
|
91bf700446 | ||
|
|
48cefb979c | ||
|
|
09ad2a55ca | ||
|
|
dfb4009b56 | ||
|
|
3b7b13400e | ||
|
|
c45e2ec159 | ||
|
|
d3821c7676 | ||
|
|
1b2f78956b | ||
|
|
afbc010651 | ||
|
|
95cf4ab7d4 | ||
|
|
6bd7e983a6 | ||
|
|
9b68353efd | ||
|
|
751a4f5be6 | ||
|
|
d0cd5a7475 | ||
|
|
a30a1fe2e2 | ||
|
|
e489c02d20 | ||
|
|
ebfb346bbc | ||
|
|
1f92a57f8a | ||
|
|
e310eb6d75 | ||
|
|
6e539c3f22 | ||
|
|
70e0f4557a | ||
|
|
e62444b882 | ||
|
|
4e1aa5add0 | ||
|
|
b46cd3c2d8 | ||
|
|
c772700121 | ||
|
|
16c22208da | ||
|
|
6a19e7824f | ||
|
|
711044bf15 | ||
|
|
48dde8a2f5 | ||
|
|
5754b45cae | ||
|
|
856449045f | ||
|
|
7e2344dad8 | ||
|
|
66c93c344c | ||
|
|
0fa2c1dfcf | ||
|
|
d94e10eb99 | ||
|
|
c01e397f8b | ||
|
|
d04e8d93a2 | ||
|
|
96056bfd22 | ||
|
|
5cb4bcab97 | ||
|
|
31e7d8c8aa | ||
|
|
3cfbf0db28 | ||
|
|
73ea7a8e1c | ||
|
|
d9f852a27b | ||
|
|
266d4aa4ce | ||
|
|
706e8c648f | ||
|
|
e2c8b804f6 | ||
|
|
bdac6c810f | ||
|
|
e9f959e19f | ||
|
|
96b1f8957d | ||
|
|
1c135e5303 | ||
|
|
5586394c5d | ||
|
|
664907a263 | ||
|
|
5ced3f0ebe | ||
|
|
9d5f0a978c | ||
|
|
b6b4c7d7e0 | ||
|
|
37eb46b40d | ||
|
|
a27bc5ae79 | ||
|
|
2e6bdbb6ec | ||
|
|
dd8fc8e71b | ||
|
|
8cb3ef1a80 | ||
|
|
09381fc9d7 | ||
|
|
e3dd05ce25 | ||
|
|
a67adaac27 | ||
|
|
38c5dcc56c | ||
|
|
8c355cb452 | ||
|
|
7f8788c706 | ||
|
|
2a3c5fd8a5 | ||
|
|
a5064b2d18 | ||
|
|
aed7171ace | ||
|
|
184b769e4b | ||
|
|
c38540cb5e | ||
|
|
521e56b73c | ||
|
|
ea18b8b85d | ||
|
|
1bf43f8f44 | ||
|
|
0f98749370 | ||
|
|
27543fa547 | ||
|
|
04a6b86c37 | ||
|
|
15efe0470e | ||
|
|
78e23bdee6 | ||
|
|
9ea2e79639 | ||
|
|
ba053bfe26 | ||
|
|
e3ff241929 | ||
|
|
8dca6fefa3 | ||
|
|
d142c8df78 | ||
|
|
02052a9d9f | ||
|
|
0001f8e3a7 | ||
|
|
5075834823 | ||
|
|
6eb56353e1 | ||
|
|
6eb09a0fad | ||
|
|
9d04e03524 | ||
|
|
3d42b3a84c | ||
|
|
39c730cd94 | ||
|
|
545a3c8fef | ||
|
|
4add9c2c4e | ||
|
|
6f5c5ad073 | ||
|
|
b01743b2ea | ||
|
|
afaca60def | ||
|
|
f02c758161 | ||
|
|
8fa0ca9f46 | ||
|
|
be17d1a881 | ||
|
|
aac8699972 | ||
|
|
306f95e759 | ||
|
|
d9d3cc772f | ||
|
|
87f0d3fe32 | ||
|
|
778feb5727 | ||
|
|
fe5fadab7f | ||
|
|
bd5fdddff9 | ||
|
|
2a272e45bb | ||
|
|
1e5a905006 | ||
|
|
ccf5126912 | ||
|
|
ff37e94538 | ||
|
|
6b700cec52 | ||
|
|
fd01286926 | ||
|
|
b5595a3425 | ||
|
|
22e3b2072c | ||
|
|
15b9a35125 | ||
|
|
bcb40164ef | ||
|
|
fba0a0a555 | ||
|
|
a9ba436900 | ||
|
|
62b2f7d853 | ||
|
|
320955e602 | ||
|
|
c4b8e0fba5 | ||
|
|
bcbad5f53f | ||
|
|
e8cbfd8544 | ||
|
|
7eef75bce3 | ||
|
|
156db87de6 | ||
|
|
e564054dd2 | ||
|
|
f54de24693 | ||
|
|
6a668a4d6e | ||
|
|
3471983723 | ||
|
|
84288dfd96 | ||
|
|
c49c61f114 | ||
|
|
9fa76ef360 | ||
|
|
cc3e84c487 | ||
|
|
91854b56c0 | ||
|
|
e952674ef6 | ||
|
|
50d1681bcf | ||
|
|
78c5f3d37e | ||
|
|
42662da0ce | ||
|
|
e2f1868f5d | ||
|
|
5596ef7449 | ||
|
|
5cda64d6a1 | ||
|
|
c7625eb403 | ||
|
|
2d0bc2770d | ||
|
|
d9507c5d1a | ||
|
|
1d7e1cafa7 | ||
|
|
1d5ceba87c | ||
|
|
703c4ddaa0 | ||
|
|
5955423a1b | ||
|
|
7dc2832dfd | ||
|
|
a222d5d8db | ||
|
|
6616e9995a | ||
|
|
05b8058c98 | ||
|
|
3ab9e80fe7 | ||
|
|
d20c7bc0e9 | ||
|
|
e529657f48 | ||
|
|
a1100ce859 | ||
|
|
646e420c94 | ||
|
|
123b5db2ca | ||
|
|
5cba9a8374 | ||
|
|
967bb6328a | ||
|
|
1c61a2c625 | ||
|
|
a80cc28745 | ||
|
|
0e5a2c5f36 | ||
|
|
21c886f95f | ||
|
|
43ba8f3c85 | ||
|
|
4056094b51 | ||
|
|
db212b01df | ||
|
|
40e7ac1d3a | ||
|
|
b3c3f73f6c | ||
|
|
7a29858847 | ||
|
|
30c64498ae | ||
|
|
beafeb58fb | ||
|
|
c13b14ca00 | ||
|
|
ca7f0f6535 | ||
|
|
17f466aaea | ||
|
|
f8b66fc45a | ||
|
|
8199f35673 | ||
|
|
9f5368e6ea | ||
|
|
4aa47ed279 | ||
|
|
ce231f0700 | ||
|
|
cfc89de6a7 | ||
|
|
153f3d3658 | ||
|
|
b17719236c | ||
|
|
e5dc90f3c7 | ||
|
|
d3510b5a96 | ||
|
|
3fefed3376 | ||
|
|
f8c86fe50e | ||
|
|
e2059c7d5a | ||
|
|
6049513bc8 | ||
|
|
10f86efaab | ||
|
|
1eb1667808 | ||
|
|
34bc314c90 | ||
|
|
68d7776712 | ||
|
|
0039390c4c | ||
|
|
cecb05a5d7 | ||
|
|
f54d9091c3 | ||
|
|
645af48ea2 | ||
|
|
e0bf72d476 | ||
|
|
db017e9137 | ||
|
|
3739f6189e | ||
|
|
97a309f14f | ||
|
|
5364e44eec | ||
|
|
989622fe32 | ||
|
|
9f92e69844 | ||
|
|
663ffedb05 | ||
|
|
0d5bde5cb1 | ||
|
|
1fef9f9329 | ||
|
|
4902c19a46 | ||
|
|
04407050ef | ||
|
|
fe446d0370 | ||
|
|
86c09012b9 | ||
|
|
4ff4d2ca74 | ||
|
|
3e890efe59 | ||
|
|
cc1fd2257d | ||
|
|
8a1103d445 | ||
|
|
f68e3e72fa | ||
|
|
cd9403962b | ||
|
|
e05b618ec9 | ||
|
|
03253f885c | ||
|
|
074a450813 | ||
|
|
33dfe1b85f | ||
|
|
25f7154217 | ||
|
|
013b530345 | ||
|
|
a25dd368e4 | ||
|
|
16919f74df | ||
|
|
043b334218 | ||
|
|
2a66340077 | ||
|
|
988af35036 | ||
|
|
e82d2c8db1 | ||
|
|
5cb676e1c6 | ||
|
|
e994d9ca75 | ||
|
|
2a764c82c6 | ||
|
|
01bc69bfd0 | ||
|
|
797bada893 | ||
|
|
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 | ||
|
|
a19b955bd9 | ||
|
|
fc96741f5a | ||
|
|
4c42ff3f82 | ||
|
|
ec3ff1b6d1 | ||
|
|
2f1e06c26d | ||
|
|
10f41385b1 | ||
|
|
2b35beeb0f |
3
.gitignore
vendored
3
.gitignore
vendored
@@ -12,6 +12,9 @@
|
||||
# mkpkg temp
|
||||
mkpkg-temp
|
||||
|
||||
# options
|
||||
/.libreelec
|
||||
|
||||
# private working directory
|
||||
/.work/
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
### Questions about LibreELEC?
|
||||
|
||||
To get your questions answered, please ask in the LibreELEC [Forum], on IRC:
|
||||
\#libreelec on freenode.net.
|
||||
\#libreelec on Libera.Chat.
|
||||
|
||||
Do not open an issue.
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@ LibreELEC is a 'Just enough OS' Linux distribution for running the award-winning
|
||||
|
||||
**Issues & Support**
|
||||
|
||||
Please report issues via the [LibreELEC forum: Bug Reports](https://forum.libreelec.tv/forum-35.html). Please ask support questions in the [LibreELEC forum: Help & Support](https://forum.libreelec.tv/forum-3.html) or ask a member of project staff in the #libreelec IRC channel on Freenode.
|
||||
Please report issues via the [LibreELEC forum: Bug Reports](https://forum.libreelec.tv/forum-35.html). Please ask support questions in the [LibreELEC forum: Help & Support](https://forum.libreelec.tv/forum-3.html) or ask a member of project staff in the #libreelec IRC channel on Libera.Chat.
|
||||
|
||||
**Donations**
|
||||
|
||||
|
||||
@@ -66,33 +66,7 @@ package_worker() {
|
||||
|
||||
if [ "${isaddon}" = "yes" -a "${istarget}" = "yes" ]; then
|
||||
if [ ${result} -eq 0 ]; then
|
||||
(
|
||||
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
|
||||
${SCRIPTS}/install_addon ${pkgname} 2>&1 && result=0 || result=1
|
||||
fi
|
||||
|
||||
if [ ${result} -ne 0 ]; then
|
||||
|
||||
@@ -6,6 +6,8 @@ fi
|
||||
|
||||
# Spaces in paths are verboten
|
||||
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
|
||||
exit 1
|
||||
fi
|
||||
@@ -84,7 +86,12 @@ VERBOSE="${VERBOSE:-yes}"
|
||||
# directory.
|
||||
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
|
||||
. "${HOME}/.libreelec/options"
|
||||
fi
|
||||
|
||||
@@ -95,6 +95,7 @@ show_config() {
|
||||
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 - OpenVPN support:\t\t\t $OPENVPN_SUPPORT"
|
||||
config_message="$config_message\n - WireGuard support:\t\t\t $WIREGUARD_SUPPORT"
|
||||
|
||||
# OS configuration
|
||||
|
||||
|
||||
@@ -115,6 +115,9 @@
|
||||
# build and install OpenVPN support (yes / no)
|
||||
OPENVPN_SUPPORT="yes"
|
||||
|
||||
# build and install WireGuard support (yes / no)
|
||||
WIREGUARD_SUPPORT="yes"
|
||||
|
||||
# build and install diskmounter support (udevil)
|
||||
# this service provide auto mounting support for external drives in the
|
||||
# mediacenter also automount internally drives at boottime via udev (yes / no)
|
||||
@@ -222,3 +225,5 @@
|
||||
# IR remote keymaps supported in default config
|
||||
IR_REMOTE_KEYMAPS="rc6_mce xbox_360 xbox_one"
|
||||
|
||||
# debug tty path
|
||||
DEBUG_TTY="/dev/tty3"
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
LIBREELEC_VERSION="devel"
|
||||
|
||||
# OS_VERSION: OS Version
|
||||
OS_VERSION="9.1"
|
||||
OS_VERSION="9.2"
|
||||
|
||||
# ADDON_VERSION: Addon version
|
||||
ADDON_VERSION="9.1.901"
|
||||
ADDON_VERSION="9.2.0"
|
||||
|
||||
@@ -12,7 +12,8 @@ PKG_DEPENDS_TARGET="toolchain atk dbus glib libXtst"
|
||||
PKG_LONGDESC="Protocol definitions and daemon for D-Bus at-spi."
|
||||
|
||||
PKG_MESON_OPTS_TARGET="-Denable_docs=false \
|
||||
-Denable-introspection=no"
|
||||
-Denable-introspection=no \
|
||||
-Ddbus_daemon=/usr/bin/dbus-daemon"
|
||||
|
||||
pre_configure_target() {
|
||||
LDFLAGS="$LDFLAGS -lXext"
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
# Copyright (C) 2020-present Team LibreELEC (https://libreelec.tv)
|
||||
|
||||
. $(get_pkg_directory libxkbcommon)/package.mk
|
||||
|
||||
PKG_NAME="chrome-libxkbcommon"
|
||||
PKG_LONGDESC="libxkbcommon for chrome"
|
||||
PKG_URL=""
|
||||
PKG_DEPENDS_UNPACK+=" libxkbcommon"
|
||||
# linking failed with meson
|
||||
PKG_TOOLCHAIN="autotools"
|
||||
|
||||
PKG_CONFIGURE_OPTS_TARGET="--enable-docs \
|
||||
--disable-wayland \
|
||||
--disable-static \
|
||||
--enable-shared"
|
||||
|
||||
unpack() {
|
||||
mkdir -p $PKG_BUILD
|
||||
tar --strip-components=1 -xf $SOURCES/${PKG_NAME:7}/${PKG_NAME:7}-$PKG_VERSION.tar.xz -C $PKG_BUILD
|
||||
}
|
||||
|
||||
makeinstall_target() {
|
||||
:
|
||||
}
|
||||
@@ -2,8 +2,8 @@
|
||||
# Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv)
|
||||
|
||||
PKG_NAME="comskip"
|
||||
PKG_VERSION="14dffb241fac0126e261d4ff5bf929479e2592b6"
|
||||
PKG_SHA256="025bfd532aa6ccfd513f4d88f34ec95a9b5a34c763ed13c17433b36415e5bfd4"
|
||||
PKG_VERSION="84fcd7388394c95fc8a7e558642bbadb43134507"
|
||||
PKG_SHA256="4d45d30335ce1c28fb4de8865ada57f81de18d83a77950e9ab7c3ea26d24a883"
|
||||
PKG_LICENSE="GPL"
|
||||
PKG_SITE="http://www.kaashoek.com/comskip/"
|
||||
PKG_URL="https://github.com/erikkaashoek/Comskip/archive/${PKG_VERSION}.tar.gz"
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
# Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv)
|
||||
|
||||
PKG_NAME="krb5"
|
||||
PKG_VERSION="1.17-final"
|
||||
PKG_SHA256="bd170f6aadea5d753cc9a93a3a915a5bde07bd3d294a00651ed647dcf964e867"
|
||||
PKG_VERSION="1.18.2-final"
|
||||
PKG_SHA256="3a92fb44d06a60a79c71a031a528246bf4cf3badad150a2b91dfa7c4702c6c19"
|
||||
PKG_LICENSE="MIT"
|
||||
PKG_SITE="http://web.mit.edu/kerberos/"
|
||||
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)
|
||||
|
||||
PKG_NAME="lttng-ust"
|
||||
PKG_VERSION="2.10.4"
|
||||
PKG_SHA256="9df458fbfeac5a380672751decbd9b57356075acbfe106cb8820e803a94a0d96"
|
||||
PKG_VERSION="2.12.0"
|
||||
PKG_SHA256="ae9a7c7a9730deabacc6c690dcf1ba1c988f7f474326ba33d30b3f339d27a059"
|
||||
PKG_LICENSE="LGPLv2.1"
|
||||
PKG_SITE="https://lttng.org/"
|
||||
PKG_URL="https://github.com/lttng/lttng-ust/archive/v$PKG_VERSION.tar.gz"
|
||||
@@ -11,7 +11,7 @@ PKG_DEPENDS_TARGET="toolchain userspace-rcu"
|
||||
PKG_LONGDESC="LTTng is an open source tracing framework for Linux"
|
||||
PKG_TOOLCHAIN="autotools"
|
||||
|
||||
PKG_CONFIGURE_OPTS_TARGET="--disable-man-pages"
|
||||
PKG_CONFIGURE_OPTS_TARGET="--disable-man-pages --disable-numa"
|
||||
|
||||
makeinstall_target() {
|
||||
make install DESTDIR=$INSTALL $PKG_MAKEINSTALL_OPTS_TARGET
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
# Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv)
|
||||
|
||||
PKG_NAME="userspace-rcu"
|
||||
PKG_VERSION="0.11.1"
|
||||
PKG_SHA256="a0ed8995edfbeac5f5eb2f152a8f3654040ecfc99a746bfe3da3bccf435b7d5d"
|
||||
PKG_VERSION="0.12.1"
|
||||
PKG_SHA256="19f31563db5078f47cabbb06bd7a3935a0964e31449efedd267f311ae79443c6"
|
||||
PKG_LICENSE="LGPLv2.1"
|
||||
PKG_SITE="http://liburcu.org"
|
||||
PKG_URL="https://github.com/urcu/userspace-rcu/archive/v$PKG_VERSION.tar.gz"
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
# Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv)
|
||||
|
||||
PKG_NAME="imagemagick"
|
||||
PKG_VERSION="7.0.8-60"
|
||||
PKG_SHA256="a0ffa621051aa66b4eec919761d1a741aefea8b993acc2425e3ed5855c540156"
|
||||
PKG_VERSION="7.0.10-23"
|
||||
PKG_SHA256="27f8a24858cc5658aa07a13002a41d342b88e5c4e1917ff4d503dbbf8cbff91c"
|
||||
PKG_LICENSE="http://www.imagemagick.org/script/license.php"
|
||||
PKG_SITE="http://www.imagemagick.org/"
|
||||
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)
|
||||
|
||||
PKG_NAME="libvpx"
|
||||
PKG_VERSION="1.8.0"
|
||||
PKG_SHA256="86df18c694e1c06cc8f83d2d816e9270747a0ce6abe316e93a4f4095689373f6"
|
||||
PKG_VERSION="1.8.1"
|
||||
PKG_SHA256="df19b8f24758e90640e1ab228ab4a4676ec3df19d23e4593375e6f3847dee03e"
|
||||
PKG_LICENSE="BSD"
|
||||
PKG_SITE="https://www.webmproject.org"
|
||||
PKG_URL="https://github.com/webmproject/libvpx/archive/v${PKG_VERSION}.tar.gz"
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
# Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv)
|
||||
|
||||
PKG_NAME="x265"
|
||||
PKG_VERSION="3.0"
|
||||
PKG_SHA256="c5b9fc260cabbc4a81561a448f4ce9cad7218272b4011feabc3a6b751b2f0662"
|
||||
PKG_VERSION="3.2"
|
||||
PKG_SHA256="364d79bcd56116a9e070fdeb1d9d2aaef1a786b4970163fb56ff0991a183133b"
|
||||
PKG_ARCH="x86_64"
|
||||
PKG_LICENSE="GPL"
|
||||
PKG_SITE="https://www.videolan.org/developers/x265.html"
|
||||
|
||||
@@ -2,11 +2,11 @@
|
||||
# Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv)
|
||||
|
||||
PKG_NAME="ffmpegx"
|
||||
PKG_VERSION="4.1"
|
||||
PKG_SHA256="7afb163d6974693cdad742aa1224c33683c50845c67ee5ae35506efc631ac121"
|
||||
PKG_VERSION="4.2.4"
|
||||
PKG_SHA256="0d5da81feba073ee78e0f18e0966bcaf91464ae75e18e9a0135186249e3d2a0b"
|
||||
PKG_LICENSE="LGPLv2.1+"
|
||||
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_LONGDESC="FFmpegx is an complete FFmpeg build to support encoding and decoding."
|
||||
PKG_BUILD_FLAGS="-gold"
|
||||
@@ -34,7 +34,7 @@ fi
|
||||
pre_configure_target() {
|
||||
cd $PKG_BUILD
|
||||
rm -rf .$TARGET_NAME
|
||||
|
||||
|
||||
# pass gnutls to build
|
||||
PKG_CONFIG_PATH="$(get_build_dir gnutls)/.INSTALL_PKG/usr/lib/pkgconfig"
|
||||
CFLAGS="$CFLAGS -I$(get_build_dir gnutls)/.INSTALL_PKG/usr/include"
|
||||
@@ -66,14 +66,14 @@ pre_configure_target() {
|
||||
if [[ "$TARGET_ARCH" = "x86_64" ]]; then
|
||||
PKG_FFMPEG_HW_ENCODERS_GENERIC="\
|
||||
`#Video encoders` \
|
||||
--enable-encoder=h264_nvenc \
|
||||
--enable-encoder=h264_vaapi \
|
||||
--enable-encoder=hevc_nvenc \
|
||||
--enable-encoder=hevc_vaapi \
|
||||
--enable-encoder=mjpeg_vaapi \
|
||||
--enable-encoder=mpeg2_vaapi \
|
||||
--enable-encoder=vp8_vaapi \
|
||||
--enable-encoder=vp9_vaapi \
|
||||
--disable-encoder=h264_nvenc \
|
||||
--disable-encoder=hevc_nvenc \
|
||||
\
|
||||
`#Video hwaccel` \
|
||||
--enable-hwaccel=h263_vaapi \
|
||||
@@ -138,7 +138,6 @@ configure_target() {
|
||||
\
|
||||
`#Licensing options` \
|
||||
--enable-gpl \
|
||||
--disable-nonfree \
|
||||
\
|
||||
`#Documentation options` \
|
||||
--disable-doc \
|
||||
|
||||
@@ -1,9 +1,10 @@
|
||||
# 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_VERSION="1.10.7"
|
||||
PKG_SHA256="c8d68b396d9e44b49668bafe0c82f8c89497915254b5395d73d6f6e41d7a0e25"
|
||||
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"
|
||||
@@ -18,8 +19,11 @@ make_host() {
|
||||
./bootstrap.sh
|
||||
./bootstrap/bin/ant -f fetch.xml -Ddest=optional
|
||||
./build.sh -Ddist.dir=${PKG_BUILD}/binary dist
|
||||
|
||||
cp binary/bin/ant ${TOOLCHAIN}/bin
|
||||
cp -r binary/lib ${TOOLCHAIN}
|
||||
)
|
||||
}
|
||||
|
||||
makeinstall_host() {
|
||||
mkdir -p ${TOOLCHAIN}/bin
|
||||
cp binary/bin/ant ${TOOLCHAIN}/bin
|
||||
cp -r binary/lib ${TOOLCHAIN}
|
||||
}
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
# Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv)
|
||||
|
||||
PKG_NAME="rust"
|
||||
PKG_VERSION="1.36.0"
|
||||
PKG_VERSION="1.45.0"
|
||||
PKG_LICENSE="MIT"
|
||||
PKG_SITE="https://www.rust-lang.org"
|
||||
PKG_DEPENDS_TARGET="toolchain rustup.rs"
|
||||
@@ -10,40 +10,43 @@ PKG_LONGDESC="A systems programming language that prevents segfaults, and guaran
|
||||
PKG_TOOLCHAIN="manual"
|
||||
|
||||
make_target() {
|
||||
export CARGO_HOME="$TOOLCHAIN/.cargo"
|
||||
export CARGO_HOME="$PKG_BUILD/cargo"
|
||||
export RUSTUP_HOME="$CARGO_HOME"
|
||||
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
|
||||
aarch64)
|
||||
RUST_TRIPLE="aarch64-unknown-linux-gnu"
|
||||
RUST_TARGET_TRIPLE="aarch64-unknown-linux-gnu"
|
||||
;;
|
||||
arm)
|
||||
RUST_TRIPLE="arm-unknown-linux-gnueabihf"
|
||||
RUST_TARGET_TRIPLE="arm-unknown-linux-gnueabihf"
|
||||
;;
|
||||
x86_64)
|
||||
RUST_TRIPLE="x86_64-unknown-linux-gnu"
|
||||
RUST_TARGET_TRIPLE="x86_64-unknown-linux-gnu"
|
||||
;;
|
||||
esac
|
||||
if [ "$TARGET_ARCH" != "x86_64" ]; then
|
||||
rustup target add "$RUST_TRIPLE"
|
||||
fi
|
||||
"$(get_build_dir rustup.rs)/rustup-init.sh" \
|
||||
--default-toolchain "$PKG_VERSION" \
|
||||
--no-modify-path \
|
||||
--profile minimal \
|
||||
--target "$RUST_TARGET_TRIPLE" \
|
||||
-y
|
||||
|
||||
cat <<EOF >"$CARGO_HOME/config"
|
||||
[target.$RUST_TRIPLE]
|
||||
[build]
|
||||
target = "$RUST_TARGET_TRIPLE"
|
||||
|
||||
[target.$RUST_TARGET_TRIPLE]
|
||||
ar = "$AR"
|
||||
linker = "$CC"
|
||||
EOF
|
||||
|
||||
cat <<'EOF' >"$CARGO_HOME/env"
|
||||
export CARGO_HOME="$TOOLCHAIN/.cargo"
|
||||
export CARGO_TARGET_DIR="$PKG_BUILD/.$TARGET_NAME"
|
||||
cat <<EOF >"$CARGO_HOME/env"
|
||||
export CARGO_HOME="$CARGO_HOME"
|
||||
export CARGO_TARGET_DIR="\$PKG_BUILD/.\$TARGET_NAME"
|
||||
export PATH="$CARGO_HOME/bin:$PATH"
|
||||
export PKG_CONFIG_ALLOW_CROSS="1"
|
||||
export PKG_CONFIG_PATH="$PKG_CONFIG_LIBDIR"
|
||||
export RUSTUP_HOME="$CARGO_HOME"
|
||||
mkdir -p "$CARGO_TARGET_DIR"
|
||||
unset CFLAGS
|
||||
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)
|
||||
|
||||
PKG_NAME="rustup.rs"
|
||||
PKG_VERSION="1.18.3"
|
||||
PKG_SHA256="9a2ae2c85bbbfc838b25d86d049bc677532950d78765725beabb8a61df1c2710"
|
||||
PKG_VERSION="1.22.1"
|
||||
PKG_SHA256="ad46cc624f318a9493aa62fc9612a450564fe20ba93c689e0ad856bff3c64c5b"
|
||||
PKG_LICENSE="MIT"
|
||||
PKG_SITE="https://www.rust-lang.org"
|
||||
PKG_URL="https://github.com/rust-lang-nursery/rustup.rs/archive/$PKG_VERSION.tar.gz"
|
||||
|
||||
@@ -2,13 +2,14 @@
|
||||
# Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv)
|
||||
|
||||
PKG_NAME="opus"
|
||||
PKG_VERSION="1.3"
|
||||
PKG_SHA256="4f3d69aefdf2dbaf9825408e452a8a414ffc60494c70633560700398820dc550"
|
||||
PKG_VERSION="1.3.1"
|
||||
PKG_SHA256="65b58e1e25b2a114157014736a3d9dfeaad8d41be1c8179866f144a2fb44ff9d"
|
||||
PKG_LICENSE="BSD"
|
||||
PKG_SITE="http://www.opus-codec.org"
|
||||
PKG_URL="https://archive.mozilla.org/pub/opus/$PKG_NAME-$PKG_VERSION.tar.gz"
|
||||
PKG_DEPENDS_TARGET="toolchain"
|
||||
PKG_LONGDESC="Codec designed for interactive speech and audio transmission over the Internet."
|
||||
PKG_TOOLCHAIN="configure"
|
||||
|
||||
if [ "$TARGET_ARCH" = "arm" ]; then
|
||||
PKG_FIXED_POINT="--enable-fixed-point"
|
||||
|
||||
@@ -3,12 +3,12 @@
|
||||
# Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv)
|
||||
|
||||
PKG_NAME="qtbase"
|
||||
PKG_VERSION="5.6.2"
|
||||
PKG_SHA256="2f6eae93c5d982fe0a387a01aeb3435571433e23e9d9d9246741faf51f1ee787"
|
||||
PKG_VERSION="5.14.0"
|
||||
PKG_SHA256="4ef921c0f208a1624439801da8b3f4344a3793b660ce1095f2b7f5c4246b9463"
|
||||
PKG_LICENSE="GPL"
|
||||
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_DEPENDS_TARGET="pcre zlib"
|
||||
PKG_URL="http://download.qt.io/archive/qt/${PKG_VERSION%.*}/$PKG_VERSION/submodules/$PKG_NAME-everywhere-src-$PKG_VERSION.tar.xz"
|
||||
PKG_DEPENDS_TARGET="freetype libjpeg-turbo libpng openssl sqlite zlib"
|
||||
PKG_LONGDESC="A cross-platform application and UI framework."
|
||||
|
||||
PKG_CONFIGURE_OPTS_TARGET="-prefix /usr
|
||||
@@ -17,39 +17,50 @@ PKG_CONFIGURE_OPTS_TARGET="-prefix /usr
|
||||
-device linux-libreelec-g++
|
||||
-opensource -confirm-license
|
||||
-release
|
||||
-optimize-size
|
||||
-strip
|
||||
-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
|
||||
-no-cups
|
||||
-no-iconv
|
||||
-no-evdev
|
||||
-no-tslib
|
||||
-no-icu
|
||||
-no-strip
|
||||
-no-fontconfig
|
||||
-force-pkg-config
|
||||
-make libs
|
||||
-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-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-evdev
|
||||
-no-libinput
|
||||
-no-gstreamer
|
||||
-no-eglfs"
|
||||
-no-mtdev
|
||||
-no-tslib
|
||||
-no-xkbcommon
|
||||
-no-gif
|
||||
-no-ico
|
||||
-system-libpng
|
||||
-system-libjpeg
|
||||
-no-sql-mysql
|
||||
-system-sqlite"
|
||||
|
||||
configure_target() {
|
||||
QMAKE_CONF_DIR="mkspecs/devices/linux-libreelec-g++"
|
||||
@@ -86,9 +97,3 @@ EOF
|
||||
unset CC CXX LD RANLIB AR AS CPPFLAGS CFLAGS LDFLAGS CXXFLAGS
|
||||
./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)
|
||||
|
||||
PKG_NAME="RPi.GPIO"
|
||||
PKG_VERSION="0.6.3"
|
||||
PKG_SHA256="a5fc0eb5e401963b6c0a03650da6b42c4005f02d962b81241d96c98d0a578516"
|
||||
PKG_VERSION="0.7.0"
|
||||
PKG_SHA256="7424bc6c205466764f30f666c18187a0824077daf20b295c42f08aea2cb87d3f"
|
||||
PKG_ARCH="arm"
|
||||
PKG_LICENSE="MIT"
|
||||
PKG_SITE="http://sourceforge.net/p/raspberry-gpio-python/"
|
||||
|
||||
@@ -11,8 +11,6 @@ PKG_URL="https://github.com/krallin/tini/archive/${PKG_VERSION}.tar.gz"
|
||||
PKG_DEPENDS_TARGET="toolchain"
|
||||
PKG_LONGDESC="Tini is a simplest init system."
|
||||
|
||||
PKG_CMAKE_OPTS_TARGET="-DMINIMAL=ON"
|
||||
|
||||
PKG_MAKE_OPTS_TARGET="tini-static"
|
||||
|
||||
pre_configure_target(){
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
# Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv)
|
||||
|
||||
PKG_NAME="tvh-dtv-scan-tables"
|
||||
PKG_VERSION="68f86b42272fc364cdd53d7cfeaa2a78d676dbfa"
|
||||
PKG_SHA256="2bb102094696bbaf440b9319a9e8a4c93e2ecbcf2d2c556fb719b1febf1a7d3b"
|
||||
PKG_VERSION="6bb0a70a0dcb97d5457c1ef4a7ccce634ea419b0"
|
||||
PKG_SHA256="a5f375d28e52ff3f527fecb7968f3ede6bc2e128d1ad78537ab4f0f7844edb45"
|
||||
PKG_LICENSE="GPL"
|
||||
PKG_SITE="https://github.com/tvheadend"
|
||||
PKG_URL="https://github.com/tvheadend/dtv-scan-tables/archive/$PKG_VERSION.tar.gz"
|
||||
|
||||
@@ -1,3 +1,13 @@
|
||||
104
|
||||
- fix getting default audio device
|
||||
- updated to 87.0.4280
|
||||
|
||||
103
|
||||
- add flag for dark mode
|
||||
|
||||
102
|
||||
- support for latest Chrome
|
||||
|
||||
101
|
||||
- fix download url
|
||||
|
||||
|
||||
@@ -3,14 +3,16 @@
|
||||
|
||||
PKG_NAME="chrome"
|
||||
PKG_VERSION="1.0"
|
||||
PKG_REV="101"
|
||||
# curl -s http://dl.google.com/linux/chrome/deb/dists/stable/main/binary-amd64/Packages | grep -B 1 Version
|
||||
PKG_VERSION_NUMBER="87.0.4280.66"
|
||||
PKG_REV="104"
|
||||
PKG_ARCH="x86_64"
|
||||
PKG_LICENSE="Custom"
|
||||
PKG_SITE="http://www.google.com/chrome"
|
||||
PKG_DEPENDS_TARGET="toolchain at-spi2-atk atk cairo chrome-libXcomposite \
|
||||
chrome-libXdamage chrome-libXfixes chrome-libXi chrome-libXrender \
|
||||
chrome-libXtst chrome-libxcb cups gdk-pixbuf gtk3 harfbuzz \
|
||||
libXcursor libxss nss pango scrnsaverproto unclutter"
|
||||
chrome-libXtst chrome-libxcb chrome-libxkbcommon cups gdk-pixbuf gtk3 \
|
||||
harfbuzz libXcursor libxss nss pango scrnsaverproto unclutter"
|
||||
PKG_SECTION="browser"
|
||||
PKG_SHORTDESC="Google Chrome Browser"
|
||||
PKG_LONGDESC="Google Chrome Browser"
|
||||
@@ -33,6 +35,7 @@ addon() {
|
||||
|
||||
# config
|
||||
cp -P $PKG_DIR/config/* $ADDON_BUILD/$PKG_ADDON_ID/config
|
||||
echo "CHROME_VERSION=${PKG_VERSION_NUMBER}" >$ADDON_BUILD/$PKG_ADDON_ID/config/chrome.version
|
||||
|
||||
# atk
|
||||
cp -PL $(get_build_dir atk)/.$TARGET_NAME/atk/libatk-1.0.so.0 $ADDON_BUILD/$PKG_ADDON_ID/lib
|
||||
@@ -56,25 +59,26 @@ addon() {
|
||||
cp -PL $(get_build_dir harfbuzz)/.$TARGET_NAME/src/.libs/libharfbuzz-icu.so* $ADDON_BUILD/$PKG_ADDON_ID/lib
|
||||
|
||||
# libatk-bridge
|
||||
cp -PL $(get_build_dir at-spi2-atk)/.$TARGET_NAME/atk-adaptor/libatk-bridge-2.0.so.0 $ADDON_BUILD/$PKG_ADDON_ID/lib
|
||||
cp -PL $(get_build_dir at-spi2-atk)/.$TARGET_NAME/atk-adaptor/libatk-bridge-2.0.so.0 $ADDON_BUILD/$PKG_ADDON_ID/lib
|
||||
|
||||
# libatspi
|
||||
cp -PL $(get_build_dir at-spi2-core)/.$TARGET_NAME/atspi/libatspi.so.0 $ADDON_BUILD/$PKG_ADDON_ID/lib
|
||||
cp -PL $(get_build_dir at-spi2-core)/.$TARGET_NAME/atspi/libatspi.so.0 $ADDON_BUILD/$PKG_ADDON_ID/lib
|
||||
|
||||
# libcups
|
||||
cp -PL $(get_build_dir cups)/cups/libcups.so.2 $ADDON_BUILD/$PKG_ADDON_ID/lib
|
||||
|
||||
# libxcb
|
||||
cp -PL $(get_build_dir chrome-libxcb)/.$TARGET_NAME/src/.libs/libxcb.so.1 $ADDON_BUILD/$PKG_ADDON_ID/lib
|
||||
cp -PL $(get_build_dir chrome-libxcb)/.$TARGET_NAME/src/.libs/libxcb.so.1 $ADDON_BUILD/$PKG_ADDON_ID/lib
|
||||
cp -PL $(get_build_dir chrome-libxcb)/.$TARGET_NAME/src/.libs/libxcb-dri3.so.0 $ADDON_BUILD/$PKG_ADDON_ID/lib
|
||||
|
||||
# libXcomposite
|
||||
cp -PL $(get_build_dir chrome-libXcomposite)/.$TARGET_NAME/src/.libs/libXcomposite.so.1 $ADDON_BUILD/$PKG_ADDON_ID/lib
|
||||
cp -PL $(get_build_dir chrome-libXcomposite)/.$TARGET_NAME/src/.libs/libXcomposite.so.1 $ADDON_BUILD/$PKG_ADDON_ID/lib
|
||||
|
||||
# libXcursor
|
||||
cp -PL $(get_build_dir libXcursor)/.$TARGET_NAME/src/.libs/libXcursor.so.1 $ADDON_BUILD/$PKG_ADDON_ID/lib
|
||||
cp -PL $(get_build_dir libXcursor)/.$TARGET_NAME/src/.libs/libXcursor.so.1 $ADDON_BUILD/$PKG_ADDON_ID/lib
|
||||
|
||||
# libXdamage
|
||||
cp -PL $(get_build_dir chrome-libXdamage)/.$TARGET_NAME/src/.libs/libXdamage.so.1 $ADDON_BUILD/$PKG_ADDON_ID/lib
|
||||
cp -PL $(get_build_dir chrome-libXdamage)/.$TARGET_NAME/src/.libs/libXdamage.so.1 $ADDON_BUILD/$PKG_ADDON_ID/lib
|
||||
|
||||
# libXfixes
|
||||
cp -PL $(get_build_dir chrome-libXfixes)/.$TARGET_NAME/src/.libs/libXfixes.so.3 $ADDON_BUILD/$PKG_ADDON_ID/lib
|
||||
@@ -82,11 +86,14 @@ addon() {
|
||||
# libXi
|
||||
cp -PL $(get_build_dir chrome-libXi)/.$TARGET_NAME/src/.libs/libXi.so.6 $ADDON_BUILD/$PKG_ADDON_ID/lib
|
||||
|
||||
# libxkbcommon
|
||||
cp -PL $(get_build_dir chrome-libxkbcommon)/.$TARGET_NAME/.libs/libxkbcommon.so.0 $ADDON_BUILD/$PKG_ADDON_ID/lib
|
||||
|
||||
# libXrender
|
||||
cp -PL $(get_build_dir chrome-libXrender)/.$TARGET_NAME/src/.libs/libXrender.so.1 $ADDON_BUILD/$PKG_ADDON_ID/lib
|
||||
|
||||
# libxss
|
||||
cp -PL $(get_build_dir libxss)/.$TARGET_NAME/src/.libs/libXss.so.1 $ADDON_BUILD/$PKG_ADDON_ID/lib
|
||||
cp -PL $(get_build_dir libxss)/.$TARGET_NAME/src/.libs/libXss.so.1 $ADDON_BUILD/$PKG_ADDON_ID/lib
|
||||
|
||||
# libXtst
|
||||
cp -PL $(get_build_dir chrome-libXtst)/.$TARGET_NAME/src/.libs/libXtst.so.6 $ADDON_BUILD/$PKG_ADDON_ID/lib
|
||||
@@ -98,5 +105,4 @@ addon() {
|
||||
|
||||
# unclutter
|
||||
cp -P $(get_build_dir unclutter)/.install_pkg/usr/bin/unclutter $ADDON_BUILD/$PKG_ADDON_ID/bin
|
||||
|
||||
}
|
||||
|
||||
@@ -6,9 +6,14 @@
|
||||
. /etc/profile
|
||||
oe_setup_addon browser.chrome
|
||||
|
||||
ICON=$ADDON_DIR/resources/icon.png
|
||||
CONTROL_FILE=/tmp/curl.done
|
||||
DATA_FILE=/tmp/curl.data
|
||||
ICON="$ADDON_DIR/resources/icon.png"
|
||||
CONTROL_FILE="/tmp/curl.done"
|
||||
DATA_FILE="/tmp/curl.data"
|
||||
CHROME_VERSION_FILE="$ADDON_DIR/config/chrome.version"
|
||||
|
||||
. "$CHROME_VERSION_FILE"
|
||||
|
||||
CHROME_FILE="google-chrome-stable_${CHROME_VERSION}-1_amd64.deb"
|
||||
|
||||
# check for enough free disk space
|
||||
if [ $(df . | awk 'END {print $4}') -lt 400000 ]; then
|
||||
@@ -38,12 +43,12 @@ echo "Downloading Chrome"
|
||||
# download chrome
|
||||
rm -f ${CONTROL_FILE} ${DATA_FILE}
|
||||
(
|
||||
curl -# -O -C - https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb 2>${DATA_FILE}
|
||||
curl -# -O -C - https://dl.google.com/linux/chrome/deb/pool/main/g/google-chrome-stable/${CHROME_FILE} 2>${DATA_FILE}
|
||||
touch ${CONTROL_FILE}
|
||||
) | \
|
||||
while [ : ]; do
|
||||
[ -f ${DATA_FILE} ] && prog="$(tr '\r' '\n' < ${DATA_FILE} | tail -n 1 | sed -r 's/^[# ]+/#/;s/^[^0-9]*//g')" || prog=
|
||||
kodi-send --action="Notification(Downloading Chrome,"${prog:-0.0%}",3000,${ICON})" >/dev/null
|
||||
kodi-send --action="Notification(Downloading Chrome,\"${prog:-0.0%}\",3000,${ICON})" >/dev/null
|
||||
[ -f ${CONTROL_FILE} ] && break
|
||||
sleep 4
|
||||
done
|
||||
@@ -53,13 +58,14 @@ rm -f ${CONTROL_FILE} ${DATA_FILE}
|
||||
## extract chrome
|
||||
# extrat chrome.deb
|
||||
kodi-send --action="Notification(Extracting Chrome,starting,1000,${ICON})" >/dev/null
|
||||
ar -x google-chrome-stable_current_amd64.deb
|
||||
ar -x ${CHROME_FILE}
|
||||
|
||||
# extract data.tar.xz to chrome-bin directory
|
||||
mkdir $ADDON_DIR/chrome-bin
|
||||
tar xf data.tar.xz --strip-components=4 -C $ADDON_DIR/chrome-bin ./opt/google/chrome
|
||||
|
||||
# cleanup
|
||||
cd $ADDON_DIR
|
||||
rm -rf $ADDON_DIR/tmp_download
|
||||
touch $ADDON_DIR/extract.ok
|
||||
kodi-send --action="Notification(Extracting Chrome,finished,1000,${ICON})" >/dev/null
|
||||
|
||||
@@ -77,6 +77,12 @@ if [ ! -z $ALSA_DEVICE ]; then
|
||||
chrome_OPTS="$chrome_OPTS --alsa-output-device=$ALSA_DEVICE"
|
||||
fi
|
||||
|
||||
# dark mode
|
||||
if [ "$DARK_MODE" == "true" ]
|
||||
then
|
||||
chrome_OPTS="$chrome_OPTS --force-dark-mode"
|
||||
fi
|
||||
|
||||
# HACK!!! to get sound at Chrome stop pulseaudio
|
||||
systemctl stop pulseaudio
|
||||
|
||||
|
||||
@@ -7,7 +7,7 @@ import sys
|
||||
import time
|
||||
import xbmcaddon
|
||||
import subprocess
|
||||
from xml.dom.minidom import parse
|
||||
import json
|
||||
|
||||
sys.path.append('/usr/share/kodi/addons/service.libreelec.settings')
|
||||
|
||||
@@ -35,6 +35,7 @@ def startchrome(args):
|
||||
new_env['VAAPI_MODE'] = __addon__.getSetting('VAAPI_MODE')
|
||||
new_env['WINDOW_MODE'] = __addon__.getSetting('WINDOW_MODE')
|
||||
new_env['RASTER_MODE'] = __addon__.getSetting('RASTER_MODE')
|
||||
new_env['DARK_MODE'] = __addon__.getSetting('DARK_MODE')
|
||||
|
||||
new_env['ALSA_DEVICE'] = ''
|
||||
if __addon__.getSetting('USE_CUST_AUDIODEVICE') == 'true':
|
||||
@@ -58,21 +59,22 @@ def isRuning(pname):
|
||||
return False
|
||||
|
||||
def getAudioDevice():
|
||||
try:
|
||||
dom = parse("/storage/.kodi/userdata/guisettings.xml")
|
||||
audiooutput=dom.getElementsByTagName('audiooutput')
|
||||
for node in audiooutput:
|
||||
dev = node.getElementsByTagName('audiodevice')[0].childNodes[0].nodeValue
|
||||
if dev.startswith("ALSA:"):
|
||||
dev = dev.split("ALSA:")[1]
|
||||
if dev == "@":
|
||||
return None
|
||||
if dev.startswith("@:"):
|
||||
dev = dev.split("@:")[1]
|
||||
else:
|
||||
# not ALSA
|
||||
dev = json.loads(xbmc.executeJSONRPC(json.dumps({
|
||||
"jsonrpc": "2.0",
|
||||
"method": "Settings.GetSettingValue",
|
||||
"params": {
|
||||
"setting": "audiooutput.audiodevice",
|
||||
},
|
||||
"id": 1,
|
||||
})))['result']['value']
|
||||
if dev.startswith("ALSA:"):
|
||||
dev = dev.split("ALSA:")[1]
|
||||
if dev == "@":
|
||||
return None
|
||||
except:
|
||||
if dev.startswith("@:"):
|
||||
dev = dev.split("@:")[1]
|
||||
else:
|
||||
# not ALSA
|
||||
return None
|
||||
if dev.startswith("CARD="):
|
||||
dev = "plughw:" + dev
|
||||
|
||||
@@ -44,3 +44,7 @@ msgstr ""
|
||||
msgctxt "#30009"
|
||||
msgid "Hide Cursor"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "#30010"
|
||||
msgid "Dark Mode"
|
||||
msgstr ""
|
||||
|
||||
@@ -11,5 +11,6 @@
|
||||
<setting id="USE_CUST_AUDIODEVICE" type="bool" label="30007" default="false" />
|
||||
<setting id="CUST_AUDIODEVICE_STR" type="text" label="30008" visible="eq(-1,true)" subsetting="true" default="" />
|
||||
<setting id="HIDE_CURSOR" type="bool" label="30009" default="false" />
|
||||
<setting id="DARK_MODE" type="bool" label="30010" default="false" />
|
||||
</category>
|
||||
</settings>
|
||||
|
||||
@@ -7,4 +7,5 @@
|
||||
<setting id="USE_CUST_AUDIODEVICE" default="true">false</setting>
|
||||
<setting id="VAAPI_MODE" default="true">intel</setting>
|
||||
<setting id="WINDOW_MODE" default="true">maximized</setting>
|
||||
<setting id="DARK_MODE" default="true">false</setting>
|
||||
</settings>
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
# SPDX-License-Identifier: GPL-2.0-or-later
|
||||
# Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv)
|
||||
# Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv)
|
||||
|
||||
PKG_NAME="sundtek-mediatv"
|
||||
PKG_VERSION="7.0"
|
||||
@@ -8,7 +9,7 @@ PKG_ARCH="any"
|
||||
PKG_LICENSE="nonfree"
|
||||
PKG_SITE="http://support.sundtek.com/"
|
||||
PKG_URL=""
|
||||
PKG_DEPENDS_TARGET=""
|
||||
PKG_DEPENDS_TARGET="xmlstarlet:host p7zip:host"
|
||||
PKG_SECTION="driver/dvb"
|
||||
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."
|
||||
|
||||
@@ -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>
|
||||
@@ -1,5 +1,6 @@
|
||||
# SPDX-License-Identifier: GPL-2.0-or-later
|
||||
# Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv)
|
||||
# Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv)
|
||||
|
||||
PKG_NAME="script.config.vdr"
|
||||
PKG_VERSION="0345a2a3b98de48cbbaf77768ca6c9289f531e2b"
|
||||
@@ -9,7 +10,7 @@ PKG_ARCH="any"
|
||||
PKG_LICENSE="OSS"
|
||||
PKG_SITE="https://libreelec.tv"
|
||||
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_SHORTDESC="script.config.vdr"
|
||||
PKG_LONGDESC="script.config.vdr"
|
||||
|
||||
@@ -1,3 +1,6 @@
|
||||
102
|
||||
- Avoid LibreELEC Settings addon crash
|
||||
|
||||
101
|
||||
- Fix log errors
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
|
||||
PKG_NAME="bluetooth-audio"
|
||||
PKG_VERSION="0"
|
||||
PKG_REV="101"
|
||||
PKG_REV="102"
|
||||
PKG_ARCH="any"
|
||||
PKG_LICENSE="GPL"
|
||||
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
|
||||
# Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv)
|
||||
|
||||
import dbus
|
||||
import dbus.mainloop.glib
|
||||
import gobject
|
||||
import json
|
||||
import subprocess
|
||||
import threading
|
||||
import time
|
||||
import xbmc
|
||||
import xbmcaddon
|
||||
|
||||
__addon__ = xbmcaddon.Addon()
|
||||
__addonid__ = __addon__.getAddonInfo('id')
|
||||
|
||||
gobject.threads_init()
|
||||
__addonpath__ = xbmc.translatePath(xbmcaddon.Addon().getAddonInfo('path')).decode('utf-8')
|
||||
|
||||
class KodiFunctions(object):
|
||||
|
||||
@@ -63,103 +59,38 @@ class BluetoothAudioClient(object):
|
||||
|
||||
xbmc.log('%s: starting add-on' % __addonid__, xbmc.LOGNOTICE)
|
||||
|
||||
self.devices = {}
|
||||
self.signal_added = None
|
||||
self.signal_removed = None
|
||||
|
||||
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):
|
||||
|
||||
xbmc.log('%s: stopping add-on' % __addonid__, xbmc.LOGNOTICE)
|
||||
|
||||
self.service.terminate()
|
||||
self._thread.join()
|
||||
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):
|
||||
|
||||
|
||||
@@ -1,3 +1,6 @@
|
||||
127
|
||||
- Rebuild tini without -DMINIMAL=ON to fix 'docker run --init'
|
||||
|
||||
126
|
||||
- Update to docker 18.09.7
|
||||
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
PKG_NAME="docker"
|
||||
PKG_VERSION="18.09.7"
|
||||
PKG_SHA256="f05dc15f5c11635472534c3aaf759c39c1bba842dd1ac23059431c2fd1ae1795"
|
||||
PKG_REV="126"
|
||||
PKG_REV="127"
|
||||
PKG_ARCH="any"
|
||||
PKG_LICENSE="ASL"
|
||||
PKG_SITE="http://www.docker.com/"
|
||||
|
||||
@@ -1,3 +1,14 @@
|
||||
108
|
||||
- Update to 4.4.2.0
|
||||
- Fix system.d
|
||||
- Update ImageMagick to 7.0.10-23
|
||||
|
||||
107
|
||||
- Update ImageMagick to 7.0.10-9
|
||||
|
||||
106
|
||||
- Update to 4.4.2.0
|
||||
|
||||
105
|
||||
- Update to 4.2.1.0
|
||||
|
||||
|
||||
@@ -2,9 +2,9 @@
|
||||
# Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv)
|
||||
|
||||
PKG_NAME="emby4"
|
||||
PKG_VERSION="4.2.1.0"
|
||||
PKG_SHA256="684a47c36700063141257c6325bbb2519ba11a7c7711e54e128d96f30adecdff"
|
||||
PKG_REV="105"
|
||||
PKG_VERSION="4.4.3.0"
|
||||
PKG_SHA256="9f14243bdc400ca9da2bb1b3e2ca3755f96293a6016bfbb5689cd7fcbc963f6b"
|
||||
PKG_REV="108"
|
||||
PKG_ARCH="any"
|
||||
PKG_LICENSE="prop."
|
||||
PKG_SITE="http://emby.media"
|
||||
@@ -13,7 +13,7 @@ PKG_SOURCE_DIR="system"
|
||||
PKG_DEPENDS_TARGET="toolchain imagemagick"
|
||||
PKG_SECTION="service"
|
||||
PKG_SHORTDESC="Emby Server: a personal media server"
|
||||
PKG_LONGDESC="Emby Server ($PKG_VERSION) brings your home videos, music, and photos together, automatically converting and streaming your media on-the-fly to any device"
|
||||
PKG_LONGDESC="Emby Server ($PKG_VERSION) brings your home videos, music, and photos together, automatically converting and streaming your media on-the-fly to any device."
|
||||
PKG_TOOLCHAIN="manual"
|
||||
|
||||
PKG_IS_ADDON="yes"
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
. /etc/profile
|
||||
oe_setup_addon service.emby4
|
||||
|
||||
LD_PRELOAD="$ADDON_DIR/lib/libMagickCore-7.Q16HDRI.so.6 \
|
||||
LD_PRELOAD="$ADDON_DIR/lib/libMagickCore-7.Q16HDRI.so.7 \
|
||||
$ADDON_DIR/lib/CORE_RL_Wand_.so" \
|
||||
nice -n "$emby_nice" \
|
||||
le_dotnet $ADDON_DIR/emby/EmbyServer.dll \
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
[Unit]
|
||||
Description=Emby 4 - streaming server
|
||||
Documentation=http://emby.media
|
||||
Wants=kodi.service
|
||||
After=kodi.service
|
||||
Wants=multi-user.target
|
||||
After=multi-user.target
|
||||
Conflicts=service.emby.service
|
||||
|
||||
[Service]
|
||||
@@ -10,4 +10,4 @@ ExecStart=/bin/sh /storage/.kodi/addons/service.emby4/bin/emby4.start
|
||||
Restart=always
|
||||
|
||||
[Install]
|
||||
WantedBy=kodi.service
|
||||
WantedBy=multi-user.target
|
||||
|
||||
@@ -1,3 +1,11 @@
|
||||
112
|
||||
- update qt to 5.14.0
|
||||
* fixes screenshot not saving png files
|
||||
|
||||
111
|
||||
- Update to version 2019-08-19
|
||||
* Fix resuming from paused in kodi 18
|
||||
|
||||
110
|
||||
- Fix RPi4 build to use dispmanx grabber
|
||||
|
||||
|
||||
@@ -3,15 +3,16 @@
|
||||
# Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv)
|
||||
|
||||
PKG_NAME="hyperion"
|
||||
PKG_VERSION="22f7be8df010fe8f0a51e3677fe0c8e709042622"
|
||||
PKG_SHA256="51cb6c5694d4bad67255ac4ae61a3c0aa481395c4868fb044a3ee19ca35bf19d"
|
||||
PKG_VERSION_DATE="2018-12-20"
|
||||
PKG_REV="110"
|
||||
PKG_VERSION="fb413cd7e8825ffc26925013f57ac93a774f12bc"
|
||||
PKG_SHA256="fafa4eeddacb15a8fd96b0e69fac400faa735c6e1ccd78673c9d96b0ac84d7a3"
|
||||
PKG_VERSION_DATE="2019-08-19"
|
||||
PKG_REV="112"
|
||||
PKG_ARCH="any"
|
||||
PKG_LICENSE="GPL"
|
||||
PKG_SITE="https://github.com/hyperion-project/hyperion"
|
||||
PKG_URL="https://github.com/hyperion-project/hyperion/archive/$PKG_VERSION.tar.gz"
|
||||
PKG_DEPENDS_TARGET="toolchain Python2 libusb qtbase protobuf rpi_ws281x"
|
||||
PKG_DEPENDS_UNPACK="rpi_ws281x"
|
||||
PKG_SECTION="service"
|
||||
PKG_SHORTDESC="Hyperion: an AmbiLight controller"
|
||||
PKG_LONGDESC="Hyperion($PKG_VERSION_DATE) is an modern opensource AmbiLight implementation."
|
||||
@@ -20,35 +21,34 @@ PKG_IS_ADDON="yes"
|
||||
PKG_ADDON_NAME="Hyperion"
|
||||
PKG_ADDON_TYPE="xbmc.service"
|
||||
|
||||
PKG_AMLOGIC_SUPPORT="-DENABLE_AMLOGIC=0"
|
||||
PKG_DISPMANX_SUPPORT="-DENABLE_DISPMANX=0"
|
||||
PKG_FB_SUPPORT="-DENABLE_FB=1"
|
||||
PKG_X11_SUPPORT="-DENABLE_X11=0"
|
||||
PKG_DISPMANX_SUPPORT="-DENABLE_DISPMANX=OFF"
|
||||
PKG_FB_SUPPORT="-DENABLE_FB=ON"
|
||||
PKG_X11_SUPPORT="-DENABLE_X11=OFF"
|
||||
|
||||
if [ "$PROJECT" = "RPi" ]; then
|
||||
PKG_DEPENDS_TARGET="$PKG_DEPENDS_TARGET bcm2835-driver"
|
||||
PKG_DISPMANX_SUPPORT="-DENABLE_DISPMANX=1"
|
||||
PKG_FB_SUPPORT="-DENABLE_FB=0"
|
||||
PKG_DEPENDS_TARGET+=" bcm2835-driver"
|
||||
PKG_DISPMANX_SUPPORT="-DENABLE_DISPMANX=ON"
|
||||
PKG_FB_SUPPORT="-DENABLE_FB=OFF"
|
||||
elif [ "$DISPLAYSERVER" = "x11" ]; then
|
||||
PKG_DEPENDS_TARGET="$PKG_DEPENDS_TARGET xorg-server xrandr"
|
||||
PKG_X11_SUPPORT="-DENABLE_X11=1"
|
||||
PKG_DEPENDS_TARGET+=" xorg-server xrandr"
|
||||
PKG_X11_SUPPORT="-DENABLE_X11=ON"
|
||||
fi
|
||||
|
||||
PKG_CMAKE_OPTS_TARGET="-DCMAKE_NO_SYSTEM_FROM_IMPORTED=ON \
|
||||
-DHYPERION_VERSION_ID="$PKG_VERSION" \
|
||||
$PKG_AMLOGIC_SUPPORT \
|
||||
-DENABLE_AMLOGIC=OFF \
|
||||
$PKG_DISPMANX_SUPPORT \
|
||||
$PKG_FB_SUPPORT \
|
||||
-DENABLE_OSX=0 \
|
||||
-DUSE_SYSTEM_PROTO_LIBS=1 \
|
||||
-DENABLE_SPIDEV=1 \
|
||||
-DENABLE_TINKERFORGE=0 \
|
||||
-DENABLE_V4L2=1 \
|
||||
-DENABLE_WS2812BPWM=0 \
|
||||
-DENABLE_WS281XPWM=1 \
|
||||
-DENABLE_OSX=OFF \
|
||||
-DUSE_SYSTEM_PROTO_LIBS=ON \
|
||||
-DENABLE_SPIDEV=ON \
|
||||
-DENABLE_TINKERFORGE=OFF \
|
||||
-DENABLE_V4L2=ON \
|
||||
-DENABLE_WS2812BPWM=OFF \
|
||||
-DENABLE_WS281XPWM=ON \
|
||||
$PKG_X11_SUPPORT \
|
||||
-DENABLE_QT5=1 \
|
||||
-DENABLE_TESTS=0 \
|
||||
-DENABLE_QT5=ON \
|
||||
-DENABLE_TESTS=OFF \
|
||||
-Wno-dev"
|
||||
|
||||
pre_build_target() {
|
||||
|
||||
@@ -1,220 +0,0 @@
|
||||
diff -Naur a/libsrc/boblightserver/CMakeLists.txt b/libsrc/boblightserver/CMakeLists.txt
|
||||
--- a/libsrc/boblightserver/CMakeLists.txt 2016-07-17 23:44:37.000000000 -0700
|
||||
+++ b/libsrc/boblightserver/CMakeLists.txt 2016-10-19 14:11:32.946486260 -0700
|
||||
@@ -37,4 +37,4 @@
|
||||
target_link_libraries(boblightserver
|
||||
hyperion
|
||||
hyperion-utils
|
||||
- ${QT_LIBRARIES})
|
||||
+ ${QT_LIBRARIES} pthread pcre16 dl z)
|
||||
diff -Naur a/libsrc/bonjour/CMakeLists.txt b/libsrc/bonjour/CMakeLists.txt
|
||||
--- a/libsrc/bonjour/CMakeLists.txt 2016-07-17 23:44:37.000000000 -0700
|
||||
+++ b/libsrc/bonjour/CMakeLists.txt 2016-10-19 14:11:32.945486250 -0700
|
||||
@@ -43,7 +43,7 @@
|
||||
target_link_libraries(bonjour
|
||||
hyperion
|
||||
hyperion-utils
|
||||
- ${QT_LIBRARIES})
|
||||
+ ${QT_LIBRARIES} pthread pcre16 dl z)
|
||||
|
||||
set(USE_SHARED_AVAHI_LIBS ${DEFAULT_USE_SHARED_AVAHI_LIBS} CACHE BOOL "use avahi libraries from system")
|
||||
|
||||
diff -Naur a/libsrc/effectengine/CMakeLists.txt b/libsrc/effectengine/CMakeLists.txt
|
||||
--- a/libsrc/effectengine/CMakeLists.txt 2016-07-17 23:44:37.000000000 -0700
|
||||
+++ b/libsrc/effectengine/CMakeLists.txt 2016-10-19 14:11:32.946486260 -0700
|
||||
@@ -51,5 +51,5 @@
|
||||
target_link_libraries(effectengine
|
||||
hyperion
|
||||
jsoncpp
|
||||
- ${QT_LIBRARIES}
|
||||
+ ${QT_LIBRARIES} pthread pcre16 dl z
|
||||
${PYTHON_LIBRARIES})
|
||||
diff -Naur a/libsrc/grabber/amlogic/CMakeLists.txt b/libsrc/grabber/amlogic/CMakeLists.txt
|
||||
--- a/libsrc/grabber/amlogic/CMakeLists.txt 2016-10-19 13:53:03.326320836 -0700
|
||||
+++ b/libsrc/grabber/amlogic/CMakeLists.txt 2016-10-19 14:11:32.947486270 -0700
|
||||
@@ -37,4 +37,4 @@
|
||||
|
||||
target_link_libraries(amlogic-grabber
|
||||
hyperion
|
||||
- ${QT_LIBRARIES})
|
||||
+ ${QT_LIBRARIES} pthread pcre16 dl z)
|
||||
diff -Naur a/libsrc/grabber/dispmanx/CMakeLists.txt b/libsrc/grabber/dispmanx/CMakeLists.txt
|
||||
--- a/libsrc/grabber/dispmanx/CMakeLists.txt 2016-07-17 23:44:37.000000000 -0700
|
||||
+++ b/libsrc/grabber/dispmanx/CMakeLists.txt 2016-10-19 14:11:32.948486280 -0700
|
||||
@@ -36,6 +36,6 @@
|
||||
|
||||
target_link_libraries(dispmanx-grabber
|
||||
hyperion
|
||||
- ${QT_LIBRARIES}
|
||||
+ ${QT_LIBRARIES} pthread pcre16 dl z
|
||||
${BCM_LIBRARIES}
|
||||
)
|
||||
diff -Naur a/libsrc/grabber/framebuffer/CMakeLists.txt b/libsrc/grabber/framebuffer/CMakeLists.txt
|
||||
--- a/libsrc/grabber/framebuffer/CMakeLists.txt 2016-07-17 23:44:37.000000000 -0700
|
||||
+++ b/libsrc/grabber/framebuffer/CMakeLists.txt 2016-10-19 14:11:32.948486280 -0700
|
||||
@@ -36,4 +36,4 @@
|
||||
|
||||
target_link_libraries(framebuffer-grabber
|
||||
hyperion
|
||||
- ${QT_LIBRARIES})
|
||||
+ ${QT_LIBRARIES} pthread pcre16 dl z)
|
||||
diff -Naur a/libsrc/grabber/osx/CMakeLists.txt b/libsrc/grabber/osx/CMakeLists.txt
|
||||
--- a/libsrc/grabber/osx/CMakeLists.txt 2016-07-17 23:44:37.000000000 -0700
|
||||
+++ b/libsrc/grabber/osx/CMakeLists.txt 2016-10-19 14:11:32.949486290 -0700
|
||||
@@ -31,4 +31,4 @@
|
||||
|
||||
target_link_libraries(osx-grabber
|
||||
hyperion
|
||||
- ${QT_LIBRARIES})
|
||||
+ ${QT_LIBRARIES} pthread pcre16 dl z)
|
||||
diff -Naur a/libsrc/grabber/v4l2/CMakeLists.txt b/libsrc/grabber/v4l2/CMakeLists.txt
|
||||
--- a/libsrc/grabber/v4l2/CMakeLists.txt 2016-07-17 23:44:37.000000000 -0700
|
||||
+++ b/libsrc/grabber/v4l2/CMakeLists.txt 2016-10-19 14:11:32.947486270 -0700
|
||||
@@ -35,5 +35,5 @@
|
||||
|
||||
target_link_libraries(v4l2-grabber
|
||||
hyperion
|
||||
- ${QT_LIBRARIES}
|
||||
+ ${QT_LIBRARIES} pthread pcre16 dl z
|
||||
)
|
||||
diff -Naur a/libsrc/grabber/x11/CMakeLists.txt b/libsrc/grabber/x11/CMakeLists.txt
|
||||
--- a/libsrc/grabber/x11/CMakeLists.txt 2016-07-17 23:44:37.000000000 -0700
|
||||
+++ b/libsrc/grabber/x11/CMakeLists.txt 2016-10-19 14:11:32.948486280 -0700
|
||||
@@ -37,5 +37,5 @@
|
||||
|
||||
target_link_libraries(x11-grabber
|
||||
hyperion
|
||||
- ${QT_LIBRARIES}
|
||||
+ ${QT_LIBRARIES} pthread pcre16 dl z
|
||||
)
|
||||
diff -Naur a/libsrc/hyperion/CMakeLists.txt b/libsrc/hyperion/CMakeLists.txt
|
||||
--- a/libsrc/hyperion/CMakeLists.txt 2016-07-17 23:44:37.000000000 -0700
|
||||
+++ b/libsrc/hyperion/CMakeLists.txt 2016-10-19 14:11:32.944486240 -0700
|
||||
@@ -68,5 +68,5 @@
|
||||
leddevice
|
||||
effectengine
|
||||
serialport
|
||||
- ${QT_LIBRARIES}
|
||||
+ ${QT_LIBRARIES} pthread pcre16 dl z
|
||||
)
|
||||
diff -Naur a/libsrc/jsonserver/CMakeLists.txt b/libsrc/jsonserver/CMakeLists.txt
|
||||
--- a/libsrc/jsonserver/CMakeLists.txt 2016-07-17 23:44:37.000000000 -0700
|
||||
+++ b/libsrc/jsonserver/CMakeLists.txt 2016-10-19 14:11:32.946486260 -0700
|
||||
@@ -45,4 +45,4 @@
|
||||
hyperion
|
||||
hyperion-utils
|
||||
jsoncpp
|
||||
- ${QT_LIBRARIES})
|
||||
+ ${QT_LIBRARIES} pthread pcre16 dl z)
|
||||
diff -Naur a/libsrc/leddevice/CMakeLists.txt b/libsrc/leddevice/CMakeLists.txt
|
||||
--- a/libsrc/leddevice/CMakeLists.txt 2016-07-17 23:44:37.000000000 -0700
|
||||
+++ b/libsrc/leddevice/CMakeLists.txt 2016-10-19 14:11:32.947486270 -0700
|
||||
@@ -152,7 +152,7 @@
|
||||
serialport
|
||||
${LIBUSB_1_LIBRARIES} #apt-get install libusb-1.0-0-dev
|
||||
${CMAKE_THREAD_LIBS_INIT}
|
||||
- ${QT_LIBRARIES}
|
||||
+ ${QT_LIBRARIES} pthread pcre16 dl z
|
||||
)
|
||||
|
||||
if(ENABLE_TINKERFORGE)
|
||||
diff -Naur a/libsrc/protoserver/CMakeLists.txt b/libsrc/protoserver/CMakeLists.txt
|
||||
--- a/libsrc/protoserver/CMakeLists.txt 2016-07-17 23:44:37.000000000 -0700
|
||||
+++ b/libsrc/protoserver/CMakeLists.txt 2016-10-19 14:11:32.944486240 -0700
|
||||
@@ -57,5 +57,5 @@
|
||||
hyperion
|
||||
hyperion-utils
|
||||
protobuf
|
||||
- ${QT_LIBRARIES}
|
||||
+ ${QT_LIBRARIES} pthread pcre16 dl z
|
||||
)
|
||||
diff -Naur a/libsrc/utils/CMakeLists.txt b/libsrc/utils/CMakeLists.txt
|
||||
--- a/libsrc/utils/CMakeLists.txt 2016-07-17 23:44:37.000000000 -0700
|
||||
+++ b/libsrc/utils/CMakeLists.txt 2016-10-19 14:11:32.945486250 -0700
|
||||
@@ -55,4 +55,4 @@
|
||||
|
||||
target_link_libraries(hyperion-utils
|
||||
jsoncpp
|
||||
- ${QT_LIBRARIES})
|
||||
+ ${QT_LIBRARIES} pthread pcre16 dl z)
|
||||
diff -Naur a/libsrc/webconfig/CMakeLists.txt b/libsrc/webconfig/CMakeLists.txt
|
||||
--- a/libsrc/webconfig/CMakeLists.txt 2016-07-17 23:44:37.000000000 -0700
|
||||
+++ b/libsrc/webconfig/CMakeLists.txt 2016-10-19 14:11:32.949486290 -0700
|
||||
@@ -49,7 +49,7 @@
|
||||
target_link_libraries(webconfig
|
||||
hyperion
|
||||
hyperion-utils
|
||||
- ${QT_LIBRARIES}
|
||||
+ ${QT_LIBRARIES} pthread pcre16 dl z
|
||||
)
|
||||
|
||||
|
||||
diff -Naur a/libsrc/xbmcvideochecker/CMakeLists.txt b/libsrc/xbmcvideochecker/CMakeLists.txt
|
||||
--- a/libsrc/xbmcvideochecker/CMakeLists.txt 2016-07-17 23:44:37.000000000 -0700
|
||||
+++ b/libsrc/xbmcvideochecker/CMakeLists.txt 2016-10-19 14:11:32.945486250 -0700
|
||||
@@ -34,4 +34,4 @@
|
||||
|
||||
target_link_libraries(xbmcvideochecker
|
||||
hyperion
|
||||
- ${QT_LIBRARIES})
|
||||
+ ${QT_LIBRARIES} pthread pcre16 dl z)
|
||||
diff -Naur a/src/hyperion-remote/CMakeLists.txt b/src/hyperion-remote/CMakeLists.txt
|
||||
--- a/src/hyperion-remote/CMakeLists.txt 2016-07-17 23:44:37.000000000 -0700
|
||||
+++ b/src/hyperion-remote/CMakeLists.txt 2016-10-19 15:05:59.050877759 -0700
|
||||
@@ -34,7 +34,8 @@
|
||||
target_link_libraries(${PROJECT_NAME}
|
||||
jsoncpp
|
||||
getoptPlusPlus
|
||||
- ${QT_LIBRARIES})
|
||||
+ hyperion
|
||||
+ ${QT_LIBRARIES} pthread pcre16 dl z)
|
||||
|
||||
if(ENABLE_QT5)
|
||||
qt5_use_modules(${PROJECT_NAME} Widgets Core Network)
|
||||
diff -Naur a/src/hyperion-v4l2/CMakeLists.txt b/src/hyperion-v4l2/CMakeLists.txt
|
||||
--- a/src/hyperion-v4l2/CMakeLists.txt 2016-07-17 23:44:37.000000000 -0700
|
||||
+++ b/src/hyperion-v4l2/CMakeLists.txt 2016-10-19 14:11:32.950486300 -0700
|
||||
@@ -51,7 +51,7 @@
|
||||
hyperion-utils
|
||||
protoserver
|
||||
pthread
|
||||
- ${QT_LIBRARIES}
|
||||
+ ${QT_LIBRARIES} pthread pcre16 dl z
|
||||
)
|
||||
|
||||
if(ENABLE_QT5)
|
||||
diff -Naur a/test/CMakeLists.txt b/test/CMakeLists.txt
|
||||
--- a/test/CMakeLists.txt 2016-07-17 23:44:37.000000000 -0700
|
||||
+++ b/test/CMakeLists.txt 2016-10-19 14:11:32.955486350 -0700
|
||||
@@ -47,11 +47,11 @@
|
||||
|
||||
add_executable(test_qregexp TestQRegExp.cpp)
|
||||
target_link_libraries(test_qregexp
|
||||
- ${QT_LIBRARIES})
|
||||
+ ${QT_LIBRARIES} pthread pcre16 dl z)
|
||||
|
||||
add_executable(test_qtscreenshot TestQtScreenshot.cpp)
|
||||
target_link_libraries(test_qtscreenshot
|
||||
- ${QT_LIBRARIES})
|
||||
+ ${QT_LIBRARIES} pthread pcre16 dl z)
|
||||
|
||||
if(ENABLE_QT5)
|
||||
qt5_use_modules(test_qregexp Widgets)
|
||||
@@ -63,7 +63,7 @@
|
||||
find_package(X11 REQUIRED)
|
||||
|
||||
add_executable(test_x11performance TestX11Performance.cpp)
|
||||
- target_link_libraries(test_x11performance ${X11_LIBRARIES} ${QT_LIBRARIES})
|
||||
+ target_link_libraries(test_x11performance ${X11_LIBRARIES} ${QT_LIBRARIES} pthread pcre16 dl z)
|
||||
if(ENABLE_QT5)
|
||||
qt5_use_modules(test_x11performance Widgets)
|
||||
endif(ENABLE_QT5)
|
||||
diff -Naur a/test/dispmanx2png/CMakeLists.txt b/test/dispmanx2png/CMakeLists.txt
|
||||
--- a/test/dispmanx2png/CMakeLists.txt 2016-07-17 23:44:37.000000000 -0700
|
||||
+++ b/test/dispmanx2png/CMakeLists.txt 2016-10-19 14:11:32.955486350 -0700
|
||||
@@ -16,4 +16,4 @@
|
||||
target_link_libraries(dispmanx2png
|
||||
dispmanx-grabber
|
||||
getoptPlusPlus
|
||||
- ${QT_LIBRARIES})
|
||||
+ ${QT_LIBRARIES} pthread pcre16 dl z)
|
||||
@@ -1,3 +1,36 @@
|
||||
125
|
||||
- Update to 0.1.3
|
||||
- Revert to dns-sd instead of mdns
|
||||
|
||||
124
|
||||
- Update to 9f3a02e (2020-06-22)
|
||||
- Fix switching playback with Android
|
||||
|
||||
123
|
||||
- Handle non ascii track information
|
||||
|
||||
122
|
||||
- Improve track information: fanart, podcast
|
||||
- Improve settings: autoplay, name, RTP port
|
||||
- Drop system.d
|
||||
|
||||
121
|
||||
- Update to 66f8a98 (2020-02-26)
|
||||
- Gapless playback
|
||||
|
||||
120
|
||||
- Update to 0.1.1
|
||||
|
||||
119
|
||||
- Update to f610436 (2020-01-02)
|
||||
- Hook audiotype
|
||||
- Use vorbis, which is more responsive than lewton
|
||||
- Build alsa backend and provide sample alsa service
|
||||
- Python 3 compliance
|
||||
|
||||
118
|
||||
- Update to 0.1.0
|
||||
|
||||
117
|
||||
- Update to 51a634d (2019-07-23)
|
||||
- Set bit rate to 320 kpbs
|
||||
|
||||
@@ -3,15 +3,14 @@
|
||||
# Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv)
|
||||
|
||||
PKG_NAME="librespot"
|
||||
PKG_VERSION="51a634dc33233ca85a92db3e723d19550b548593"
|
||||
PKG_SHA256="581727e560c81cafbfeaf611b51f0a6987a48d348795785b3b6c0a304656a731"
|
||||
PKG_VERSION_DATE="2019-07-23"
|
||||
PKG_REV="117"
|
||||
PKG_VERSION="0.1.3"
|
||||
PKG_SHA256="2d28a63c6dda08ecbc1245c7cfe34c9b3b29e8c5304f4aa8b65aedb899056b25"
|
||||
PKG_REV="125"
|
||||
PKG_ARCH="any"
|
||||
PKG_LICENSE="MIT"
|
||||
PKG_SITE="https://github.com/librespot-org/librespot/"
|
||||
PKG_URL="https://github.com/librespot-org/librespot/archive/$PKG_VERSION.zip"
|
||||
PKG_DEPENDS_TARGET="toolchain avahi pulseaudio rust"
|
||||
PKG_URL="https://github.com/librespot-org/librespot/archive/v$PKG_VERSION.tar.gz"
|
||||
PKG_DEPENDS_TARGET="toolchain alsa-lib avahi libvorbis pulseaudio rust"
|
||||
PKG_SECTION="service"
|
||||
PKG_SHORTDESC="Librespot: play Spotify through Kodi using a Spotify app as a remote"
|
||||
PKG_LONGDESC="Librespot ($PKG_VERSION_DATE) lets you play Spotify through Kodi using a Spotify app as a remote."
|
||||
@@ -20,26 +19,24 @@ PKG_TOOLCHAIN="manual"
|
||||
PKG_IS_ADDON="yes"
|
||||
PKG_ADDON_NAME="Librespot"
|
||||
PKG_ADDON_TYPE="xbmc.service"
|
||||
PKG_ADDON_REQUIRES="script.module.requests:0.0.0"
|
||||
PKG_MAINTAINER="Anton Voyl (awiouy)"
|
||||
|
||||
configure_target() {
|
||||
. "$TOOLCHAIN/.cargo/env"
|
||||
export PKG_CONFIG_ALLOW_CROSS=0
|
||||
}
|
||||
|
||||
make_target() {
|
||||
cd src
|
||||
$CARGO_BUILD --no-default-features --features "pulseaudio-backend with-dns-sd"
|
||||
cd "$PKG_BUILD/.$TARGET_NAME"/*/release
|
||||
$STRIP librespot
|
||||
. $(get_build_dir rust)/cargo/env
|
||||
cargo build \
|
||||
--release \
|
||||
--no-default-features \
|
||||
--features "alsa-backend pulseaudio-backend with-dns-sd with-vorbis"
|
||||
$STRIP $PKG_BUILD/.$TARGET_NAME/*/release/librespot
|
||||
}
|
||||
|
||||
addon() {
|
||||
mkdir -p "$ADDON_BUILD/$PKG_ADDON_ID/bin"
|
||||
cp "$PKG_BUILD/.$TARGET_NAME"/*/release/librespot \
|
||||
"$ADDON_BUILD/$PKG_ADDON_ID/bin"
|
||||
mkdir -p $ADDON_BUILD/$PKG_ADDON_ID/bin
|
||||
cp $PKG_BUILD/.$TARGET_NAME/*/release/librespot \
|
||||
$ADDON_BUILD/$PKG_ADDON_ID/bin
|
||||
|
||||
mkdir -p "$ADDON_BUILD/$PKG_ADDON_ID/lib"
|
||||
cp "$(get_build_dir avahi)/avahi-compat-libdns_sd/.libs/libdns_sd.so.1" \
|
||||
"$ADDON_BUILD/$PKG_ADDON_ID/lib"
|
||||
mkdir -p $ADDON_BUILD/$PKG_ADDON_ID/lib
|
||||
cp $(get_build_dir avahi)/avahi-compat-libdns_sd/.libs/libdns_sd.so.1 \
|
||||
$ADDON_BUILD/$PKG_ADDON_ID/lib
|
||||
}
|
||||
|
||||
@@ -1,126 +1,83 @@
|
||||
commit 10489ef0b9de4241eb8e007596f3d62616120545
|
||||
Author: awiouy <awiouy@gmail.com>
|
||||
Date: Fri May 29 07:40:19 2020 +0200
|
||||
|
||||
Notify Kodi
|
||||
|
||||
diff --git a/core/src/spotify_id.rs b/core/src/spotify_id.rs
|
||||
index 1a5fcd2..c670977 100644
|
||||
--- a/core/src/spotify_id.rs
|
||||
+++ b/core/src/spotify_id.rs
|
||||
@@ -8,6 +8,12 @@ pub enum SpotifyAudioType {
|
||||
NonPlayable,
|
||||
}
|
||||
|
||||
+impl fmt::Display for SpotifyAudioType {
|
||||
+ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||
+ write!(f, "{:?}", self)
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
|
||||
pub struct SpotifyId {
|
||||
pub id: u128,
|
||||
diff --git a/playback/src/config.rs b/playback/src/config.rs
|
||||
index 0f71110..931167d 100644
|
||||
index 9d65042..6d098db 100644
|
||||
--- a/playback/src/config.rs
|
||||
+++ b/playback/src/config.rs
|
||||
@@ -30,6 +30,7 @@ pub struct PlayerConfig {
|
||||
pub bitrate: Bitrate,
|
||||
@@ -31,6 +31,7 @@ pub struct PlayerConfig {
|
||||
pub normalisation: bool,
|
||||
pub normalisation_pregain: f32,
|
||||
pub gapless: bool,
|
||||
+ pub notify_kodi: bool,
|
||||
}
|
||||
|
||||
|
||||
impl Default for PlayerConfig {
|
||||
@@ -38,6 +39,7 @@ impl Default for PlayerConfig {
|
||||
bitrate: Bitrate::default(),
|
||||
@@ -40,6 +41,7 @@ impl Default for PlayerConfig {
|
||||
normalisation: false,
|
||||
normalisation_pregain: 0.0,
|
||||
gapless: true,
|
||||
+ notify_kodi: false,
|
||||
}
|
||||
}
|
||||
}
|
||||
diff --git a/playback/src/player.rs b/playback/src/player.rs
|
||||
index ab1a8ab..19d6394 100644
|
||||
index 2dd8f3b..67b3b28 100644
|
||||
--- a/playback/src/player.rs
|
||||
+++ b/playback/src/player.rs
|
||||
@@ -4,7 +4,8 @@ use futures::sync::oneshot;
|
||||
use futures::{future, Future};
|
||||
use std;
|
||||
use std::borrow::Cow;
|
||||
-use std::io::{Read, Result, Seek, SeekFrom};
|
||||
+use std::fs::OpenOptions;
|
||||
+use std::io::{Read, Result, Seek, SeekFrom, Write};
|
||||
use std::mem;
|
||||
use std::sync::mpsc::{RecvError, RecvTimeoutError, TryRecvError};
|
||||
use std::thread;
|
||||
@@ -394,6 +395,14 @@ impl PlayerInternal {
|
||||
@@ -1442,6 +1442,10 @@ impl PlayerInternal {
|
||||
}
|
||||
}
|
||||
|
||||
+ fn notify_kodi(&mut self, id: &str, track_id: &SpotifyId) {
|
||||
+ // println!("fifo = {} {}", id, track_id.to_base62());
|
||||
+ if self.config.notify_kodi {
|
||||
+ let mut file = OpenOptions::new().write(true).open("/tmp/librespot").unwrap();
|
||||
+ writeln!(&mut file, "{}\n{}", id, track_id.to_base62()).unwrap();
|
||||
+ }
|
||||
|
||||
+ fn notify_kodi(&mut self, event: String) {
|
||||
+ eprintln!("@{}", event);
|
||||
+ }
|
||||
+
|
||||
fn handle_command(&mut self, cmd: PlayerCommand) {
|
||||
debug!("command={:?}", cmd);
|
||||
match cmd {
|
||||
@@ -413,11 +422,17 @@ impl PlayerInternal {
|
||||
| PlayerState::EndOfTrack {
|
||||
track_id: old_track_id,
|
||||
..
|
||||
- } => self.send_event(PlayerEvent::Changed {
|
||||
- old_track_id: old_track_id,
|
||||
- new_track_id: track_id,
|
||||
- }),
|
||||
- _ => self.send_event(PlayerEvent::Started { track_id }),
|
||||
+ } => {
|
||||
+ self.send_event(PlayerEvent::Changed {
|
||||
+ old_track_id: old_track_id,
|
||||
+ new_track_id: track_id,
|
||||
+ });
|
||||
+ self.notify_kodi("1", &track_id)
|
||||
+ }
|
||||
+ _ => {
|
||||
+ self.send_event(PlayerEvent::Started { track_id });
|
||||
+ self.notify_kodi("2", &track_id)
|
||||
+ }
|
||||
}
|
||||
|
||||
self.start_sink();
|
||||
@@ -443,13 +458,17 @@ impl PlayerInternal {
|
||||
| PlayerState::EndOfTrack {
|
||||
track_id: old_track_id,
|
||||
..
|
||||
- } => self.send_event(PlayerEvent::Changed {
|
||||
- old_track_id: old_track_id,
|
||||
- new_track_id: track_id,
|
||||
- }),
|
||||
+ } => {
|
||||
+ self.send_event(PlayerEvent::Changed {
|
||||
+ old_track_id: old_track_id,
|
||||
+ new_track_id: track_id,
|
||||
+ });
|
||||
+ self.notify_kodi("3", &track_id)
|
||||
+ }
|
||||
_ => (),
|
||||
}
|
||||
self.send_event(PlayerEvent::Stopped { track_id });
|
||||
+ self.notify_kodi("4", &track_id)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -476,6 +495,7 @@ impl PlayerInternal {
|
||||
|
||||
self.send_event(PlayerEvent::Started { track_id });
|
||||
self.start_sink();
|
||||
+ self.notify_kodi("5", &track_id)
|
||||
} else {
|
||||
warn!("Player::play called from invalid state");
|
||||
fn send_event(&mut self, event: PlayerEvent) {
|
||||
let mut index = 0;
|
||||
while index < self.event_senders.len() {
|
||||
@@ -1452,6 +1456,16 @@ impl PlayerInternal {
|
||||
}
|
||||
@@ -487,6 +507,7 @@ impl PlayerInternal {
|
||||
|
||||
self.stop_sink_if_running();
|
||||
self.send_event(PlayerEvent::Stopped { track_id });
|
||||
+ self.notify_kodi("6", &track_id)
|
||||
} else {
|
||||
warn!("Player::pause called from invalid state");
|
||||
}
|
||||
@@ -499,6 +520,7 @@ impl PlayerInternal {
|
||||
self.stop_sink_if_running();
|
||||
self.send_event(PlayerEvent::Stopped { track_id });
|
||||
self.state = PlayerState::Stopped;
|
||||
+ self.notify_kodi("7", &track_id)
|
||||
}
|
||||
PlayerState::Stopped => {
|
||||
warn!("Player::stop called from invalid state");
|
||||
}
|
||||
}
|
||||
+ if self.config.notify_kodi {
|
||||
+ use PlayerEvent::*;
|
||||
+ match event {
|
||||
+ Playing {track_id, .. } => self.notify_kodi(["Playing",
|
||||
+ &track_id.audio_type.to_string(),
|
||||
+ &track_id.to_base62()].join(" ")),
|
||||
+ Stopped { .. } => self.notify_kodi("Stopped".to_string()),
|
||||
+ _ => ()
|
||||
+ }
|
||||
+ }
|
||||
}
|
||||
|
||||
fn load_track(
|
||||
diff --git a/src/main.rs b/src/main.rs
|
||||
index 36cd1b5..502cac8 100644
|
||||
index 2efd62b..ecee2ff 100644
|
||||
--- a/src/main.rs
|
||||
+++ b/src/main.rs
|
||||
@@ -168,6 +168,11 @@ fn setup(args: &[String]) -> Setup {
|
||||
@@ -171,6 +171,11 @@ fn setup(args: &[String]) -> Setup {
|
||||
"Pregain (dB) applied by volume normalisation",
|
||||
"PREGAIN",
|
||||
)
|
||||
@@ -132,20 +89,20 @@ index 36cd1b5..502cac8 100644
|
||||
.optflag(
|
||||
"",
|
||||
"linear-volume",
|
||||
@@ -248,6 +253,8 @@ fn setup(args: &[String]) -> Setup {
|
||||
@@ -282,6 +287,8 @@ fn setup(args: &[String]) -> Setup {
|
||||
)
|
||||
};
|
||||
|
||||
|
||||
+ let notify_kodi = matches.opt_present("notify-kodi");
|
||||
+
|
||||
let session_config = {
|
||||
let device_id = device_id(&name);
|
||||
|
||||
@@ -291,6 +298,7 @@ fn setup(args: &[String]) -> Setup {
|
||||
|
||||
@@ -325,6 +332,7 @@ fn setup(args: &[String]) -> Setup {
|
||||
.opt_str("normalisation-pregain")
|
||||
.map(|pregain| pregain.parse::<f32>().expect("Invalid pregain float value"))
|
||||
.unwrap_or(PlayerConfig::default().normalisation_pregain),
|
||||
+ notify_kodi: notify_kodi,
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -1,30 +0,0 @@
|
||||
From b87d18c6513cebc31118ffb447e2b7ae9255e6bd Mon Sep 17 00:00:00 2001
|
||||
From: awiouy <awiouy@gmail.com>
|
||||
Date: Wed, 7 Nov 2018 07:51:46 +0100
|
||||
Subject: [PATCH] libreelec: pulseaudio sink
|
||||
|
||||
---
|
||||
playback/src/audio_backend/pulseaudio.rs | 3 ++-
|
||||
1 file changed, 2 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/playback/src/audio_backend/pulseaudio.rs b/playback/src/audio_backend/pulseaudio.rs
|
||||
index 88f6280..4e7186b 100644
|
||||
--- a/playback/src/audio_backend/pulseaudio.rs
|
||||
+++ b/playback/src/audio_backend/pulseaudio.rs
|
||||
@@ -76,6 +76,7 @@ impl Open for PulseAudioSink {
|
||||
|
||||
impl Sink for PulseAudioSink {
|
||||
fn start(&mut self) -> io::Result<()> {
|
||||
+ let sink = CString::new("librespot_sink").unwrap();
|
||||
if self.s == null_mut() {
|
||||
self.s = call_pulseaudio(
|
||||
|err| unsafe {
|
||||
@@ -83,7 +84,7 @@ impl Sink for PulseAudioSink {
|
||||
null(), // Use the default server.
|
||||
self.name.as_ptr(), // Our application's name.
|
||||
PA_STREAM_PLAYBACK,
|
||||
- null(), // Use the default device.
|
||||
+ sink.as_ptr(), // Our sink.
|
||||
self.desc.as_ptr(), // desc of our stream.
|
||||
&self.ss, // Our sample format.
|
||||
null(), // Use default channel map
|
||||
@@ -1,37 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
# Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv)
|
||||
|
||||
. /etc/profile
|
||||
oe_setup_addon service.librespot
|
||||
|
||||
PORT="6666"
|
||||
SINK_NAME="librespot_sink"
|
||||
|
||||
if ! pactl list modules short | grep "sink_name=$SINK_NAME"; then
|
||||
pactl load-module module-null-sink sink_name="$SINK_NAME" > /dev/null
|
||||
fi
|
||||
if ! pactl list modules short | grep "source=$SINK_NAME"; then
|
||||
pactl load-module module-rtp-send source="$SINK_NAME.monitor" \
|
||||
destination_ip=127.0.0.1 port="$PORT" source_ip=127.0.0.1 > /dev/null
|
||||
fi
|
||||
pactl suspend-sink "$SINK_NAME" 1
|
||||
|
||||
LIBRESPOT="librespot \
|
||||
--backend pulseaudio \
|
||||
--bitrate 320 \
|
||||
--cache \"$ADDON_HOME/cache\" \
|
||||
--device-type TV \
|
||||
--disable-audio-cache \
|
||||
--name \"Kodi ($HOSTNAME)\" \
|
||||
--notify-kodi"
|
||||
|
||||
if [ "$ls_a" = "true" -a -n "$ls_p" -a -n "$ls_u" ]; then
|
||||
LIBRESPOT="$LIBRESPOT \
|
||||
--disable-discovery \
|
||||
--password \"$ls_p\" \
|
||||
--username \"$ls_u\""
|
||||
fi
|
||||
|
||||
eval $LIBRESPOT
|
||||
@@ -1,224 +1,8 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
# Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv)
|
||||
|
||||
import base64
|
||||
import json
|
||||
import os
|
||||
import stat
|
||||
import subprocess
|
||||
import threading
|
||||
import time
|
||||
import urllib
|
||||
import urllib2
|
||||
import xbmc
|
||||
import xbmcaddon
|
||||
import xbmcgui
|
||||
import sys
|
||||
|
||||
ADDON = xbmcaddon.Addon()
|
||||
ADDON_ID = ADDON.getAddonInfo('id')
|
||||
ADDON_NAME = ADDON.getAddonInfo('name')
|
||||
FIFO = '/tmp/librespot'
|
||||
LOG_LEVEL = xbmc.LOGNOTICE
|
||||
LOG_MESSAGE = ADDON.getAddonInfo('name') + ': {}'
|
||||
SINK_NAME = "librespot_sink"
|
||||
SPOTIFY_ID = '169df5532dee47a59913f8528e83ae71'
|
||||
SPOTIFY_SECRET = '1f3d8b507bbe4f68beb3a4472e8ad411'
|
||||
STREAM_CODEC = 'pcm_s16be'
|
||||
STREAM_PORT = '6666'
|
||||
STREAM_URL = 'rtp://127.0.0.1:{}'.format(STREAM_PORT)
|
||||
sys.path.append(os.path.join(os.path.dirname(__file__), 'resources', 'lib'))
|
||||
|
||||
from ls_monitor import Monitor as Monitor
|
||||
|
||||
def log(message):
|
||||
xbmc.log(LOG_MESSAGE.format(message), LOG_LEVEL)
|
||||
|
||||
|
||||
class Monitor(xbmc.Monitor):
|
||||
|
||||
def __init__(self):
|
||||
log('monitor started')
|
||||
self.player = Player()
|
||||
|
||||
def onSettingsChanged(self):
|
||||
log('settings changed')
|
||||
self.player.update()
|
||||
|
||||
def waitForAbort(self):
|
||||
super(Monitor, self).waitForAbort()
|
||||
log('abort requested')
|
||||
self.player.abort()
|
||||
|
||||
|
||||
class Player(threading.Thread, xbmc.Player):
|
||||
|
||||
def __init__(self):
|
||||
log('player started')
|
||||
super(Player, self).__init__()
|
||||
self.isLibrespotStarted = True
|
||||
self.listitem = xbmcgui.ListItem()
|
||||
self.listitem.addStreamInfo('audio', {'codec': STREAM_CODEC})
|
||||
self.listitem.setPath(STREAM_URL)
|
||||
self.spotify = Spotify()
|
||||
if self.isPlaying():
|
||||
self.onAVStarted()
|
||||
else:
|
||||
self.playingFile = ''
|
||||
self.onPlayBackStopped()
|
||||
self.start()
|
||||
|
||||
def abort(self):
|
||||
log('aborting player')
|
||||
with open(FIFO, 'w') as fifo:
|
||||
fifo.close()
|
||||
self.join()
|
||||
|
||||
def onAVChange(self):
|
||||
self.onAVStarted()
|
||||
|
||||
def onAVStarted(self):
|
||||
log('playback started')
|
||||
self.playingFile = self.getPlayingFile()
|
||||
if self.isLibrespotStarted and (self.playingFile != STREAM_URL):
|
||||
self.isLibrespotStarted = False
|
||||
self.systemctl('stop')
|
||||
|
||||
def onPlayBackEnded(self):
|
||||
self.onPlayBackStopped()
|
||||
|
||||
def onPlayBackError(self):
|
||||
self.onPlayBackStopped()
|
||||
|
||||
def onPlayBackStopped(self):
|
||||
log('playback stopped')
|
||||
if self.playingFile == STREAM_URL:
|
||||
self.systemctl('restart')
|
||||
elif not self.isLibrespotStarted:
|
||||
self.systemctl('start')
|
||||
self.isLibrespotStarted = True
|
||||
|
||||
def pauseLibrespot(self):
|
||||
if self.isPlaying() and (self.getPlayingFile() == STREAM_URL):
|
||||
log('pausing librespot playback')
|
||||
self.pause()
|
||||
|
||||
def playLibrespot(self, track_id):
|
||||
track = self.spotify.getTrack(track_id)
|
||||
self.listitem.setArt(track.getArt())
|
||||
self.listitem.setInfo('music', track.getInfo())
|
||||
if not self.isPlaying():
|
||||
subprocess.call(['pactl', 'suspend-sink', SINK_NAME, '0'])
|
||||
log('starting librespot playback')
|
||||
self.play(STREAM_URL, self.listitem)
|
||||
elif self.getPlayingFile() == STREAM_URL:
|
||||
log('updating librespot playback')
|
||||
self.updateInfoTag(self.listitem)
|
||||
|
||||
def run(self):
|
||||
log('control pipe started')
|
||||
try:
|
||||
os.unlink(FIFO)
|
||||
except OSError:
|
||||
pass
|
||||
os.mkfifo(FIFO)
|
||||
while (os.path.exists(FIFO) and
|
||||
stat.S_ISFIFO(os.stat(FIFO).st_mode)):
|
||||
with open(FIFO, 'r') as fifo:
|
||||
command = fifo.read().splitlines()
|
||||
log('control pipe {}'.format(str(command)))
|
||||
if len(command) == 0:
|
||||
break
|
||||
elif command[0] in ['3', '5', '6']:
|
||||
self.pauseLibrespot()
|
||||
elif command[0] in ['1', '2', '4']:
|
||||
self.playLibrespot(command[1])
|
||||
elif command[0] in ['7']:
|
||||
self.stopLibrespot()
|
||||
try:
|
||||
os.unlink(FIFO)
|
||||
except OSError:
|
||||
pass
|
||||
log('control pipe stopped')
|
||||
|
||||
def stopLibrespot(self):
|
||||
if self.isPlaying() and (self.getPlayingFile() == STREAM_URL):
|
||||
log('stopping librespot playback')
|
||||
self.stop()
|
||||
|
||||
def systemctl(self, command):
|
||||
log('{} librespot'.format(command))
|
||||
subprocess.call(['systemctl', command, ADDON_ID])
|
||||
|
||||
def update(self):
|
||||
log('updating player')
|
||||
if self.isLibrespotStarted:
|
||||
self.systemctl('restart')
|
||||
|
||||
|
||||
class Spotify():
|
||||
|
||||
def __init__(self):
|
||||
self.headers = None
|
||||
self.expiration = time.time()
|
||||
self.request = [
|
||||
'https://accounts.spotify.com/api/token',
|
||||
urllib.urlencode({'grant_type': 'client_credentials'}),
|
||||
{'Authorization': 'Basic {}'.format(base64.b64encode(
|
||||
'{}:{}'.format(SPOTIFY_ID, SPOTIFY_SECRET)))}
|
||||
]
|
||||
|
||||
def getHeaders(self):
|
||||
if time.time() > self.expiration:
|
||||
log('token expired')
|
||||
token = json.loads(urllib2.urlopen(
|
||||
urllib2.Request(*self.request)).read())
|
||||
log('new token expires in {} seconds'.format(token['expires_in']))
|
||||
self.expiration = time.time() + float(token['expires_in']) - 60
|
||||
self.headers = {
|
||||
'Accept': 'application/json',
|
||||
'Content-Type': 'application/json',
|
||||
'Authorization': 'Bearer {}'.format(token['access_token'])
|
||||
}
|
||||
|
||||
def getTrack(self, track_id):
|
||||
log('getting track')
|
||||
try:
|
||||
self.getHeaders()
|
||||
track = json.loads(urllib2.urlopen(urllib2.Request(
|
||||
'https://api.spotify.com/v1/tracks/{}'.format(track_id), None,
|
||||
self.headers)).read())
|
||||
except Exception as e:
|
||||
log('failed to get track from Spotify: {}'.format(e))
|
||||
track = dict()
|
||||
return Track(track)
|
||||
|
||||
|
||||
class Track():
|
||||
|
||||
def __init__(self, track):
|
||||
self.track = track
|
||||
|
||||
def get(self, default, *indices):
|
||||
tree = self.track
|
||||
try:
|
||||
for index in indices:
|
||||
tree = tree[index]
|
||||
except LookupError:
|
||||
tree = default
|
||||
return tree
|
||||
|
||||
def getArt(self):
|
||||
return {
|
||||
'thumb': self.get('', 'album', 'images', 0, 'url')
|
||||
}
|
||||
|
||||
def getInfo(self):
|
||||
return {
|
||||
'album': self.get('', 'album', 'name'),
|
||||
'artist': self.get('', 'artists', 0, 'name'),
|
||||
'title': self.get('', 'name'),
|
||||
}
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
log('service started')
|
||||
Monitor().waitForAbort()
|
||||
log('service stopped')
|
||||
Monitor().run()
|
||||
|
||||
@@ -1,5 +0,0 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
# Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv)
|
||||
|
||||
PORT="6666"
|
||||
SINK_NAME="librespot_sink"
|
||||
@@ -0,0 +1,30 @@
|
||||
# Librespot for ALSA
|
||||
# Copy this file to '/storage/.config/system.d/service.librespot-alsa.service' and adapt it to your needs
|
||||
# Enable the service with 'systemctl enable /storage/.config/system.d/service.librespot-alsa.service'
|
||||
# Start the service with 'systemctl start service.librespot-alsa.service'
|
||||
# If you update the file, reload units with 'systemctl daemon-reload' and restart the service
|
||||
|
||||
[Unit]
|
||||
Description=librespot alsa backend
|
||||
After=network-online.target
|
||||
Wants=network-online.target
|
||||
|
||||
[Service]
|
||||
Environment=LD_LIBRARY_PATH=/storage/.kodi/addons/service.librespot/lib
|
||||
#Enable Raspberry Pi onboard audio
|
||||
#ExecStartPre=-dtparam audio=on
|
||||
#Set Raspberry Pi playback route
|
||||
#ExecStartPre=-amixer -c 0 cset name="PCM Playback Route" 1
|
||||
ExecStart=/storage/.kodi/addons/service.librespot/bin/librespot \
|
||||
--backend alsa \
|
||||
--bitrate 320 \
|
||||
--cache "/storage/.config/lsa_cache" \
|
||||
# Use 'aplay -L' to list available devices
|
||||
# --device "default:CARD=ALSA" \
|
||||
--device-type computer \
|
||||
--disable-audio-cache \
|
||||
--name "Librespot ALSA" \
|
||||
Restart=always
|
||||
|
||||
[Install]
|
||||
WantedBy=network-online.target
|
||||
@@ -8,13 +8,25 @@ msgid "Configuration"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "#30101"
|
||||
msgid "User mode"
|
||||
msgid "Autoplay"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "#30102"
|
||||
msgid "Username"
|
||||
msgid "Discovery"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "#30103"
|
||||
msgid "Username"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "#30104"
|
||||
msgid "Password"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "#30105"
|
||||
msgid "Name"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "#30106"
|
||||
msgid "RTP Port"
|
||||
msgstr ""
|
||||
|
||||
@@ -0,0 +1,47 @@
|
||||
import os
|
||||
import socket
|
||||
import xbmc
|
||||
import xbmcaddon
|
||||
import xbmcgui
|
||||
|
||||
|
||||
DEFAULTS = dict(
|
||||
autoplay='true',
|
||||
bitrate='320',
|
||||
device='librespot',
|
||||
discovery='true',
|
||||
name='Librespot@{}',
|
||||
password='',
|
||||
rtp_dest='127.0.0.1',
|
||||
rtp_port='24642',
|
||||
username='',
|
||||
)
|
||||
|
||||
ADDON = xbmcaddon.Addon()
|
||||
ADDON_HOME = xbmc.translatePath(ADDON.getAddonInfo('profile'))
|
||||
ADDON_ICON = ADDON.getAddonInfo('icon')
|
||||
ADDON_NAME = ADDON.getAddonInfo('name')
|
||||
ADDON_PATH = ADDON.getAddonInfo('path')
|
||||
ADDON_ENVT = dict(
|
||||
LD_LIBRARY_PATH=os.path.join(ADDON_PATH, 'lib'),
|
||||
PATH=os.path.join(ADDON_PATH, 'bin'))
|
||||
DIALOG = xbmcgui.Dialog()
|
||||
|
||||
|
||||
def get_settings():
|
||||
if not os.path.exists(ADDON_HOME):
|
||||
os.makedirs(ADDON_HOME)
|
||||
settings = dict()
|
||||
for id in DEFAULTS.keys():
|
||||
value = ADDON.getSetting(id)
|
||||
settings[id] = DEFAULTS[id] if value == '' else value
|
||||
settings['name'] = settings['name'].format(socket.gethostname())
|
||||
return settings
|
||||
|
||||
|
||||
def log(message):
|
||||
xbmc.log('{}: {}'.format(ADDON_NAME, message), xbmc.LOGNOTICE)
|
||||
|
||||
|
||||
def notification(message):
|
||||
DIALOG.notification(ADDON_NAME, message, ADDON_ICON)
|
||||
@@ -0,0 +1,164 @@
|
||||
import pipes
|
||||
import shlex
|
||||
import subprocess
|
||||
import threading
|
||||
import xbmc
|
||||
import xbmcgui
|
||||
|
||||
from ls_addon import ADDON_ENVT as ADDON_ENVT
|
||||
from ls_addon import ADDON_HOME as ADDON_HOME
|
||||
from ls_addon import get_settings as get_settings
|
||||
from ls_addon import log as log
|
||||
from ls_pulseaudio import Pulseaudio as Pulseaudio
|
||||
from ls_spotify import SPOTIFY as SPOTIFY
|
||||
|
||||
|
||||
LIBRESPOT = 'librespot' \
|
||||
' --backend pulseaudio' \
|
||||
' --bitrate {bitrate}' \
|
||||
' --cache cache' \
|
||||
' --device {device}' \
|
||||
' --device-type TV' \
|
||||
' --disable-audio-cache' \
|
||||
' --name {name}' \
|
||||
' --notify-kodi'
|
||||
LIBRESPOT_AUTOPLAY = ' --autoplay'
|
||||
LIBRESPOT_AUTHENTICATE = ' --disable-discovery' \
|
||||
' --password {password}' \
|
||||
' --username {username}'
|
||||
|
||||
CODEC = 'pcm_s16be'
|
||||
MAX_PANICS = 3
|
||||
|
||||
|
||||
class Librespot(xbmc.Player):
|
||||
|
||||
def __init__(self):
|
||||
super(Librespot, self).__init__()
|
||||
settings = get_settings()
|
||||
quoted = {k: pipes.quote(v) for (k, v) in settings.items()}
|
||||
command = LIBRESPOT
|
||||
if settings['autoplay'] == 'true':
|
||||
command += LIBRESPOT_AUTOPLAY
|
||||
if (settings['discovery'] == 'false' and
|
||||
settings['password'] != '' and
|
||||
settings['username'] != ''):
|
||||
command += LIBRESPOT_AUTHENTICATE
|
||||
self.command = shlex.split(command.format(**quoted))
|
||||
log(shlex.split(command.format(**dict(quoted, password='*obfuscated*'))))
|
||||
self.is_aborted = False
|
||||
self.is_dead = False
|
||||
self.pulseaudio = Pulseaudio(settings)
|
||||
self.listitem = xbmcgui.ListItem()
|
||||
self.listitem.addStreamInfo('audio', {'codec': CODEC})
|
||||
self.listitem.setPath(path=self.pulseaudio.url)
|
||||
|
||||
def __enter__(self):
|
||||
self.pulseaudio.load_modules()
|
||||
self.panics = 0
|
||||
self.librespot = None
|
||||
self.is_playing_librespot = False
|
||||
if not self.isPlaying():
|
||||
self.start_librespot()
|
||||
|
||||
def __exit__(self, *args):
|
||||
self.stop_librespot()
|
||||
self.pulseaudio.unload_modules()
|
||||
|
||||
def on_event_panic(self):
|
||||
self.pulseaudio.suspend_sink(1)
|
||||
self.panics += 1
|
||||
log('event panic {}/{}'.format(self.panics, MAX_PANICS))
|
||||
self.is_dead = self.panics >= MAX_PANICS
|
||||
self.stop_librespot(True)
|
||||
|
||||
def on_event_playing(self, type, id):
|
||||
log('event playing')
|
||||
SPOTIFY.update_listitem(self.listitem, type, id, self.country)
|
||||
if not self.isPlaying():
|
||||
log('starting librespot playback')
|
||||
self.pulseaudio.suspend_sink(0)
|
||||
self.play(self.pulseaudio.url, self.listitem)
|
||||
elif self.is_playing_librespot:
|
||||
log('updating librespot playback')
|
||||
self.updateInfoTag(self.listitem)
|
||||
|
||||
def on_event_stopped(self):
|
||||
self.pulseaudio.suspend_sink(1)
|
||||
log('event stopped')
|
||||
self.panics = 0
|
||||
self.stop()
|
||||
|
||||
def onPlayBackEnded(self):
|
||||
self.onPlayBackStopped()
|
||||
|
||||
def onPlayBackError(self):
|
||||
self.onPlayBackStopped()
|
||||
|
||||
def onPlayBackStarted(self):
|
||||
log('Kodi playback started')
|
||||
self.is_playing_librespot = self.getPlayingFile() == self.pulseaudio.url
|
||||
if not self.is_playing_librespot:
|
||||
self.stop_librespot()
|
||||
|
||||
def onPlayBackStopped(self):
|
||||
if self.is_playing_librespot:
|
||||
log('librespot playback stopped')
|
||||
self.is_playing_librespot = False
|
||||
self.stop_librespot(True)
|
||||
else:
|
||||
log('Kodi playback stopped')
|
||||
self.start_librespot()
|
||||
|
||||
def run_librespot(self):
|
||||
log('librespot thread started')
|
||||
self.restart = True
|
||||
while self.restart and not self.is_dead:
|
||||
self.librespot = subprocess.Popen(
|
||||
self.command,
|
||||
cwd=ADDON_HOME,
|
||||
env=ADDON_ENVT,
|
||||
stderr=subprocess.STDOUT,
|
||||
stdout=subprocess.PIPE)
|
||||
log('librespot started')
|
||||
with self.librespot.stdout:
|
||||
while True:
|
||||
line = self.librespot.stdout.readline()
|
||||
if line == '':
|
||||
break
|
||||
words = line.split()
|
||||
if words[0] == '@Playing':
|
||||
self.on_event_playing(words[1], words[2])
|
||||
elif words[0] == '@Stopped':
|
||||
self.on_event_stopped()
|
||||
elif words[0] == 'stack':
|
||||
self.on_event_panic()
|
||||
else:
|
||||
log(line.rstrip())
|
||||
if 'Country:' in line:
|
||||
self.country = words[-1].strip('"')
|
||||
log('country={}'.format(self.country))
|
||||
self.pulseaudio.suspend_sink(1)
|
||||
self.stop()
|
||||
self.librespot.wait()
|
||||
log('librespot stopped')
|
||||
self.librespot = None
|
||||
log('librespot thread stopped')
|
||||
|
||||
def start_librespot(self):
|
||||
if self.librespot is None:
|
||||
self.thread = threading.Thread(target=self.run_librespot)
|
||||
self.thread.start()
|
||||
|
||||
def stop(self):
|
||||
if self.is_playing_librespot and not self.is_aborted:
|
||||
log('stopping librespot playback')
|
||||
self.is_playing_librespot = False
|
||||
super(Librespot, self).stop()
|
||||
|
||||
def stop_librespot(self, restart=False):
|
||||
self.restart = restart
|
||||
if self.librespot is not None:
|
||||
self.librespot.terminate()
|
||||
if not restart:
|
||||
self.thread.join()
|
||||
@@ -0,0 +1,35 @@
|
||||
import xbmc
|
||||
|
||||
from ls_addon import log as log
|
||||
from ls_addon import notification as notification
|
||||
from ls_librespot import Librespot as Librespot
|
||||
|
||||
|
||||
class Monitor(xbmc.Monitor):
|
||||
|
||||
def onSettingsChanged(self):
|
||||
self.is_changed = True
|
||||
|
||||
def run(self):
|
||||
log('monitor started')
|
||||
is_aborted = False
|
||||
is_dead = False
|
||||
while not (is_aborted or is_dead):
|
||||
self.is_changed = False
|
||||
librespot = Librespot()
|
||||
with librespot:
|
||||
while True:
|
||||
is_aborted = self.waitForAbort(1)
|
||||
if is_aborted:
|
||||
log('monitor aborted')
|
||||
librespot.is_aborted = True
|
||||
break
|
||||
is_dead = librespot.is_dead
|
||||
if is_dead:
|
||||
log('librespot died')
|
||||
notification('Too many errors')
|
||||
break
|
||||
if self.is_changed:
|
||||
log('settings changed')
|
||||
break
|
||||
log('monitor stopped')
|
||||
@@ -0,0 +1,46 @@
|
||||
import subprocess
|
||||
|
||||
from ls_addon import log as log
|
||||
|
||||
|
||||
def run(command):
|
||||
return subprocess.check_output(command.split())
|
||||
|
||||
|
||||
class Pulseaudio:
|
||||
|
||||
def __init__(self, settings):
|
||||
self.null_sink = dict(
|
||||
module='module-null-sink',
|
||||
args='sink_name={device}'.format(**settings)
|
||||
)
|
||||
self.rtp_send = dict(
|
||||
module='module-rtp-send',
|
||||
args='destination_ip={rtp_dest} port={rtp_port}'
|
||||
' source={device}.monitor'.format(**settings)
|
||||
)
|
||||
self.suspend = 'pactl suspend-sink {device} {{}}'.format(**settings)
|
||||
self.url = 'rtp://{rtp_dest}:{rtp_port}'.format(**settings)
|
||||
|
||||
def list_modules(self):
|
||||
return [module.split('\t')
|
||||
for module in run('pactl list modules short').splitlines()[::-1]]
|
||||
|
||||
def load_modules(self):
|
||||
args = [module[2] for module in self.list_modules()]
|
||||
for module in [self.null_sink, self.rtp_send]:
|
||||
if module['args'] not in args:
|
||||
run('pactl load-module {} {}'.format(
|
||||
module['module'], module['args']))
|
||||
log('loaded {} {}'.format(module['module'], module['args']))
|
||||
self.suspend_sink(1)
|
||||
|
||||
def suspend_sink(self, bit):
|
||||
run(self.suspend.format(bit))
|
||||
log('suspended sink {}'.format(bit))
|
||||
|
||||
def unload_modules(self):
|
||||
for module in self.list_modules():
|
||||
if module[2] in [self.null_sink['args'], self.rtp_send['args']]:
|
||||
run('pactl unload-module {}'.format(module[0]))
|
||||
log('unloaded {} {}'.format(module[1], module[2]))
|
||||
@@ -0,0 +1,80 @@
|
||||
import requests
|
||||
import time
|
||||
|
||||
|
||||
from ls_addon import ADDON_ICON as ADDON_ICON
|
||||
from ls_addon import log as log
|
||||
|
||||
|
||||
SPOTIFY_ENDPOINT_EPISODES = 'https://api.spotify.com/v1/episodes/'
|
||||
SPOTIFY_ENDPOINT_TRACKS = 'https://api.spotify.com/v1/tracks/'
|
||||
SPOTIFY_HEADERS = {
|
||||
'Accept': 'application/json',
|
||||
'Content-Type': 'application/json',
|
||||
}
|
||||
SPOTIFY_REQUEST_TOKEN = {
|
||||
'url': 'https://accounts.spotify.com/api/token',
|
||||
'data': {'grant_type': 'client_credentials'},
|
||||
'headers': {'Authorization': 'Basic MTY5ZGY1NTMyZGVlNDdhNTk5MTNmODUyOGU4M2FlNzE6MWYzZDhiNTA3YmJlNGY2OGJlYjNhNDQ3MmU4YWQ0MTE='}
|
||||
}
|
||||
|
||||
|
||||
def get(info, indices, default):
|
||||
try:
|
||||
for index in indices:
|
||||
info = info[index]
|
||||
return info.encode('utf-8')
|
||||
except LookupError:
|
||||
return default
|
||||
|
||||
|
||||
class Spotify:
|
||||
|
||||
def __init__(self):
|
||||
self.headers = SPOTIFY_HEADERS
|
||||
self.expiration = time.time()
|
||||
|
||||
def get_headers(self):
|
||||
if time.time() > self.expiration:
|
||||
log('token expired')
|
||||
token = requests.post(**SPOTIFY_REQUEST_TOKEN).json()
|
||||
log(token)
|
||||
self.expiration = time.time() + float(token['expires_in']) - 5
|
||||
self.headers['Authorization'] = 'Bearer {}'.format(
|
||||
token['access_token'])
|
||||
|
||||
def get_endpoint(self, endpoint, id, market):
|
||||
try:
|
||||
self.get_headers()
|
||||
return requests.get(url=endpoint + id,
|
||||
headers=self.headers,
|
||||
params=dict(market=market)).json()
|
||||
except Exception as e:
|
||||
log('failed to get {} from Spotify {}'.format(endpoint, e))
|
||||
return {}
|
||||
|
||||
def update_listitem(self, listitem, type, id, market='SE'):
|
||||
if type == 'Podcast':
|
||||
info = self.get_endpoint(SPOTIFY_ENDPOINT_EPISODES, id, market)
|
||||
album = get(info, ['show', 'name'], 'unknown show',)
|
||||
artist = get(info, ['show', 'publisher'], 'unknown publisher')
|
||||
thumb = get(info, ['images', 0, 'url'], ADDON_ICON)
|
||||
title = get(info, ['name'], 'unknown episode')
|
||||
elif type == 'Track':
|
||||
info = self.get_endpoint(SPOTIFY_ENDPOINT_TRACKS, id, market)
|
||||
album = get(info, ['album', 'name'], 'unknown album')
|
||||
artist = get(info, ['artists', 0, 'name'], 'unknown artist')
|
||||
thumb = get(info, ['album', 'images', 0, 'url'], ADDON_ICON)
|
||||
title = get(info, ['name'], 'unknown title')
|
||||
else:
|
||||
album = ''
|
||||
artist = 'Unknown Media Type'
|
||||
thumb = ADDON_ICON
|
||||
title = ''
|
||||
listitem.setArt(dict(fanart=thumb, thumb=thumb))
|
||||
listitem.setInfo('music', dict(
|
||||
album=album, artist=artist, title=title))
|
||||
log('{}#{}#{}#{}'.format(title, artist, album, thumb))
|
||||
|
||||
|
||||
SPOTIFY = Spotify()
|
||||
@@ -1,8 +1,11 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||
<settings>
|
||||
<category label="30100">
|
||||
<setting label="30101" id="ls_a" type="bool" default="false" />
|
||||
<setting label="30102" id="ls_u" type="text" default="" subsetting="true" visible="eq(-1,true)" />
|
||||
<setting label="30103" id="ls_p" type="text" default="" subsetting="true" visible="eq(-2,true)" option="hidden" />
|
||||
<setting label="30101" id="autoplay" type="bool" default="true" />
|
||||
<setting label="30102" id="discovery" type="bool" default="true" />
|
||||
<setting label="30103" id="username" type="text" default="" subsetting="true" visible="eq(-1,false)" />
|
||||
<setting label="30104" id="password" type="text" default="" subsetting="true" visible="eq(-2,false)" option="hidden" />
|
||||
<setting label="30105" id="name" type="text" default="Librespot@{}" />
|
||||
<setting label="30106" id="rtp_port" type="number" default="24642" />
|
||||
</category>
|
||||
</settings>
|
||||
|
||||
@@ -1,5 +0,0 @@
|
||||
<settings version="2">
|
||||
<setting id="ls_a" default="true">false</setting>
|
||||
<setting id="ls_p" default="true"></setting>
|
||||
<setting id="ls_u" default="true"></setting>
|
||||
</settings>
|
||||
@@ -1,13 +0,0 @@
|
||||
[Unit]
|
||||
Description=librespot
|
||||
Wants=kodi.service
|
||||
After=kodi.service
|
||||
|
||||
[Service]
|
||||
EnvironmentFile=/storage/.kodi/addons/service.librespot/ls_env.py
|
||||
ExecStart=/bin/sh /storage/.kodi/addons/service.librespot/bin/librespot.start
|
||||
ExecStopPost=-/usr/bin/pactl suspend-sink librespot_sink 1
|
||||
Restart=always
|
||||
|
||||
[Install]
|
||||
WantedBy=kodi.service
|
||||
@@ -1,3 +1,6 @@
|
||||
109
|
||||
- Update to 1.4.2
|
||||
|
||||
108
|
||||
- Update to 1.2.0
|
||||
|
||||
|
||||
@@ -2,9 +2,9 @@
|
||||
# Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv)
|
||||
|
||||
PKG_NAME="syncthing"
|
||||
PKG_VERSION="1.2.0"
|
||||
PKG_SHA256="0339877effdcf3bf8aa7d4d1e50b878992792e4752ff778f27788bf71eccecd0"
|
||||
PKG_REV="108"
|
||||
PKG_VERSION="1.4.2"
|
||||
PKG_SHA256="061af43c1bbfcdf949499cdc50a325fff7cd67fb48f9d270adb52b4decbab899"
|
||||
PKG_REV="109"
|
||||
PKG_ARCH="any"
|
||||
PKG_LICENSE="MPLv2"
|
||||
PKG_SITE="https://syncthing.net/"
|
||||
@@ -21,19 +21,15 @@ PKG_ADDON_TYPE="xbmc.service"
|
||||
PKG_MAINTAINER="Anton Voyl (awiouy)"
|
||||
|
||||
configure_target() {
|
||||
export GOLANG=$TOOLCHAIN/lib/golang/bin/go
|
||||
|
||||
cd $PKG_BUILD
|
||||
$GOLANG generate -v ./lib/auto ./cmd/strelaypoolsrv/auto
|
||||
|
||||
export GOOS=linux
|
||||
export CGO_CFLAGS=${CFLAGS}
|
||||
export CGO_ENABLED=1
|
||||
export CGO_NO_EMULATION=1
|
||||
export CGO_CFLAGS=$CFLAGS
|
||||
export LDFLAGS="-w -linkmode external -extldflags -Wl,--unresolved-symbols=ignore-in-shared-libs -extld $CC -X main.Version=v$PKG_VERSION"
|
||||
export GOPATH=$PKG_BUILD:$PKG_BUILD/Godeps/_workspace
|
||||
export GOROOT=$TOOLCHAIN/lib/golang
|
||||
export PATH=$PATH:$GOROOT/bin
|
||||
export GOLANG=${TOOLCHAIN}/lib/golang/bin/go
|
||||
export GOOS=linux
|
||||
export GOROOT=${TOOLCHAIN}/lib/golang
|
||||
export LDFLAGS="-w -linkmode external -extldflags -Wl,--unresolved-symbols=ignore-in-shared-libs -extld ${CC} \
|
||||
-X github.com/syncthing/syncthing/lib/build.Version=v${PKG_VERSION}"
|
||||
export PATH=${PATH}:${GOROOT}/bin
|
||||
|
||||
case $TARGET_ARCH in
|
||||
x86_64)
|
||||
@@ -57,14 +53,10 @@ configure_target() {
|
||||
}
|
||||
|
||||
make_target() {
|
||||
mkdir -p $PKG_BUILD/src/github.com/syncthing
|
||||
ln -sf $PKG_BUILD $PKG_BUILD/src/github.com/syncthing/syncthing
|
||||
cd $PKG_BUILD/src/github.com/syncthing/syncthing
|
||||
mkdir bin
|
||||
$GOLANG build -v -o bin/syncthing -a -ldflags "$LDFLAGS" ./cmd/syncthing
|
||||
${GOLANG} build -v -o bin/syncthing -a -ldflags "${LDFLAGS}" ./cmd/syncthing
|
||||
}
|
||||
|
||||
addon() {
|
||||
mkdir -p $ADDON_BUILD/$PKG_ADDON_ID/bin
|
||||
cp -P $PKG_BUILD/bin/syncthing $ADDON_BUILD/$PKG_ADDON_ID/bin
|
||||
mkdir -p ${ADDON_BUILD}/${PKG_ADDON_ID}/bin
|
||||
cp -P ${PKG_BUILD}/bin/syncthing ${ADDON_BUILD}/${PKG_ADDON_ID}/bin
|
||||
}
|
||||
|
||||
@@ -6,8 +6,6 @@
|
||||
. /etc/profile
|
||||
oe_setup_addon service.system.syncthing
|
||||
|
||||
chmod +x $ADDON_DIR/bin/*
|
||||
|
||||
STNODEFAULTFOLDER="y" syncthing -home=$ADDON_HOME \
|
||||
-gui-address="$gui_address" \
|
||||
-logflags=0 \
|
||||
|
||||
@@ -8,13 +8,13 @@ import xbmcaddon
|
||||
|
||||
class Monitor(xbmc.Monitor):
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
xbmc.Monitor.__init__(self)
|
||||
self.id = xbmcaddon.Addon().getAddonInfo('id')
|
||||
def __init__(self, *args, **kwargs):
|
||||
xbmc.Monitor.__init__(self)
|
||||
self.id = xbmcaddon.Addon().getAddonInfo('id')
|
||||
|
||||
def onSettingsChanged(self):
|
||||
subprocess.call(['systemctl', 'restart', self.id])
|
||||
def onSettingsChanged(self):
|
||||
subprocess.call(['systemctl', 'restart', self.id])
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
Monitor().waitForAbort()
|
||||
if __name__ == '__main__':
|
||||
Monitor().waitForAbort()
|
||||
|
||||
@@ -1,3 +1,14 @@
|
||||
123
|
||||
- update gnutls to 3.6.14
|
||||
|
||||
122
|
||||
- update gnutls to 3.6.13
|
||||
|
||||
121
|
||||
- update to 4.2.8-36
|
||||
- update comskip to 2019-11-03
|
||||
- fixed default recording path
|
||||
|
||||
120
|
||||
- update to 4.2.8-27
|
||||
- update comskip to 2019-03-30
|
||||
|
||||
@@ -2,10 +2,10 @@
|
||||
# Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv)
|
||||
|
||||
PKG_NAME="tvheadend42"
|
||||
PKG_VERSION="5c1b37b50e99f9bf91d38f08f7bd358ee270660f"
|
||||
PKG_SHA256="cfce42a6534eec1728b4e84906f845d4805618e584624d1777d038f9377eed98"
|
||||
PKG_VERSION_NUMBER="4.2.8-27"
|
||||
PKG_REV="120"
|
||||
PKG_VERSION="5bdcfd8ac97b3337e1c7911ae24127df76fa693a"
|
||||
PKG_SHA256="b562a26248cdc02dc94cc62038deea172668fa4c079b2ea4e1b4220f3b1d34f5"
|
||||
PKG_VERSION_NUMBER="4.2.8-36"
|
||||
PKG_REV="123"
|
||||
PKG_ARCH="any"
|
||||
PKG_LICENSE="GPL"
|
||||
PKG_SITE="http://www.tvheadend.org"
|
||||
@@ -112,8 +112,8 @@ addon() {
|
||||
# copy gnutls lib that is needed for ffmpeg
|
||||
mkdir -p $ADDON_BUILD/$PKG_ADDON_ID/lib
|
||||
cp -PL $(get_build_dir gnutls)/.INSTALL_PKG/usr/lib/libgnutls.so.30 $ADDON_BUILD/$PKG_ADDON_ID/lib
|
||||
cp -PL $(get_build_dir nettle)/.install_pkg/usr/lib/libnettle.so.6 $ADDON_BUILD/$PKG_ADDON_ID/lib
|
||||
cp -PL $(get_build_dir nettle)/.install_pkg/usr/lib/libhogweed.so.4 $ADDON_BUILD/$PKG_ADDON_ID/lib
|
||||
cp -PL $(get_build_dir nettle)/.install_pkg/usr/lib/libnettle.so.8 $ADDON_BUILD/$PKG_ADDON_ID/lib
|
||||
cp -PL $(get_build_dir nettle)/.install_pkg/usr/lib/libhogweed.so.6 $ADDON_BUILD/$PKG_ADDON_ID/lib
|
||||
cp -PL $(get_build_dir gmp)/.install_pkg/usr/lib/libgmp.so.10 $ADDON_BUILD/$PKG_ADDON_ID/lib
|
||||
|
||||
# set only version (revision will be added by buildsystem)
|
||||
|
||||
@@ -37,6 +37,11 @@ if [ -f "$ADDON_HOME/dvr/config/dvr-config" ]; then
|
||||
rm $ADDON_HOME/dvr/config/dvr-config
|
||||
fi
|
||||
|
||||
# workaround to create default Tvh directories without entering samba share
|
||||
if [ ! -d "/storage/recordings" ]; then
|
||||
mkdir -p /storage/recordings /storage/picons/tvh /storage/picons/vdr
|
||||
fi
|
||||
|
||||
if [ -f "$ADDON_HOME/channel/config/config.tmp" ]; then
|
||||
rm $ADDON_HOME/channel/config/config.tmp
|
||||
fi
|
||||
|
||||
@@ -1,3 +1,12 @@
|
||||
110
|
||||
- Update to 3.1.5
|
||||
|
||||
109
|
||||
- Fix x86_64 url
|
||||
|
||||
108
|
||||
- Update to 3.1.3
|
||||
|
||||
107
|
||||
- Update to 2.2.6
|
||||
|
||||
|
||||
@@ -4,24 +4,24 @@
|
||||
case "$ARCH" in
|
||||
"aarch64")
|
||||
PKG_NC_ARCH="arm64"
|
||||
PKG_SHA256="48d58ac6ff958ec7155befe76f83e276aceff50c4a7d1f578444a9a40720e412"
|
||||
PKG_URL="https://download.visualstudio.microsoft.com/download/pr/f5e04830-50fc-435c-8bb5-fcd4629da944/8aa7cce5c3fcb6a7db180b923d3574ef/dotnet-runtime-2.2.6-linux-arm64.tar.gz"
|
||||
PKG_SHA256="05875790fbfc487cefb04fc6ff6d9a3ade147f1ae554e859dca60ea6a3c232aa"
|
||||
PKG_URL="https://download.visualstudio.microsoft.com/download/pr/65291ed8-e931-4605-9d5a-265928a835d0/1a15d18655c8b260170117e9bd1a1cb7/dotnet-runtime-3.1.5-linux-arm64.tar.gz"
|
||||
;;
|
||||
"arm")
|
||||
PKG_NC_ARCH="arm"
|
||||
PKG_SHA256="a4f2e63471c296b7b173105a2c1d5feb95b81e0a8131f73aeecc00440fa5f544"
|
||||
PKG_URL="https://download.visualstudio.microsoft.com/download/pr/428aaa32-f66c-4847-b845-aa21f90504e4/1cf033db866414997140c2672bd75069/dotnet-runtime-2.2.6-linux-arm.tar.gz"
|
||||
PKG_SHA256="5728786f517410f25c59799f443d0336129d6b1680fd40cb5b40202407949008"
|
||||
PKG_URL="https://download.visualstudio.microsoft.com/download/pr/15132a5c-f0f4-4373-8b8b-b7e70834d899/cad479dda52359ad43956471274ec932/dotnet-runtime-3.1.5-linux-arm.tar.gz"
|
||||
;;
|
||||
"x86_64")
|
||||
PKG_NC_ARCH="x64"
|
||||
PKG_SHA256="e30d4568c62d747b030e3c74f3d528ecb8d5c90e844e506bc0e3fcbce52b8cb1"
|
||||
PKG_URL="https://download.visualstudio.microsoft.com/download/pr/9f21e352-9d2c-4e3b-af45-915da89158db/0e8a7ea83cc08d4bcf417a927a36ed6f/dotnet-runtime-2.2.6-linux-x64.tar.gz"
|
||||
PKG_SHA256="ae0a4e9a1e875b46d3201cdad2779572de1c12c0aae36688ae3c3978db319ff5"
|
||||
PKG_URL="https://download.visualstudio.microsoft.com/download/pr/d00eaeea-6d7b-4e73-9d96-c0234ed3b665/0d25d9d1aeaebdeef01d15370d5cd22b/dotnet-runtime-3.1.5-linux-x64.tar.gz"
|
||||
;;
|
||||
esac
|
||||
|
||||
PKG_NAME="dotnet-runtime"
|
||||
PKG_VERSION="2.2.6"
|
||||
PKG_REV="107"
|
||||
PKG_VERSION="3.1.5"
|
||||
PKG_REV="110"
|
||||
PKG_ARCH="any"
|
||||
PKG_LICENSE="MIT"
|
||||
PKG_SITE="https://dotnet.github.io/"
|
||||
|
||||
@@ -1,5 +1,23 @@
|
||||
111
|
||||
- Update FFmpeg to 4.2.4
|
||||
- Update gnutls to 3.6.14
|
||||
|
||||
110
|
||||
- Update gnutls to 3.6.13
|
||||
|
||||
109
|
||||
- Update AV1 to 2019-11-15
|
||||
- Update FFmpeg to 4.2.1
|
||||
- Update VPX to 1.8.1
|
||||
- Update x265 to 3.2
|
||||
|
||||
108
|
||||
- Update FFmpeg to 4.1.4
|
||||
- Update libopus to 1.3.1
|
||||
- Update gnutls to 3.6.10
|
||||
|
||||
107
|
||||
- Update aom to 2019-03-05
|
||||
- Update AV1 to 2019-03-05
|
||||
- Update FFmpeg to 4.1.3
|
||||
- Update x264 to 2019-03-06
|
||||
- Update x265 to 3.0
|
||||
@@ -13,7 +31,7 @@
|
||||
- Update AV1 to 2019-01-09
|
||||
|
||||
104
|
||||
- Update aom to d2a592e
|
||||
- Update AV1 to d2a592e
|
||||
- Update FFmpeg to 4.1
|
||||
- Update opus to 1.3
|
||||
- Update x264 to 2018-11-16
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
|
||||
PKG_NAME="ffmpeg-tools"
|
||||
PKG_VERSION="1.0"
|
||||
PKG_REV="107"
|
||||
PKG_REV="111"
|
||||
PKG_ARCH="any"
|
||||
PKG_LICENSE="GPL"
|
||||
PKG_SITE="https://libreelec.tv"
|
||||
@@ -23,8 +23,8 @@ addon() {
|
||||
|
||||
# copy gnutls lib that is needed for ffmpeg
|
||||
mkdir -p $ADDON_BUILD/$PKG_ADDON_ID/lib
|
||||
cp -PL $(get_build_dir gmp)/.install_pkg/usr/lib/libgmp.so.10 $ADDON_BUILD/$PKG_ADDON_ID/lib
|
||||
cp -PL $(get_build_dir gnutls)/.INSTALL_PKG/usr/lib/libgnutls.so.30 $ADDON_BUILD/$PKG_ADDON_ID/lib
|
||||
cp -PL $(get_build_dir nettle)/.install_pkg/usr/lib/libhogweed.so.4 $ADDON_BUILD/$PKG_ADDON_ID/lib
|
||||
cp -PL $(get_build_dir nettle)/.install_pkg/usr/lib/libnettle.so.6 $ADDON_BUILD/$PKG_ADDON_ID/lib
|
||||
cp -PL $(get_build_dir gmp)/.install_pkg/usr/lib/libgmp.so.10 \
|
||||
$(get_build_dir gnutls)/.INSTALL_PKG/usr/lib/libgnutls.so.30 \
|
||||
$(get_build_dir nettle)/.install_pkg/usr/lib/{libhogweed.so.6,libnettle.so.8} \
|
||||
$ADDON_BUILD/$PKG_ADDON_ID/lib
|
||||
}
|
||||
|
||||
@@ -1,3 +1,6 @@
|
||||
104
|
||||
- drop iw
|
||||
|
||||
103
|
||||
- added rar2fs
|
||||
- updated iperf to 3.6
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
|
||||
PKG_NAME="network-tools"
|
||||
PKG_VERSION="1.0"
|
||||
PKG_REV="103"
|
||||
PKG_REV="104"
|
||||
PKG_ARCH="any"
|
||||
PKG_LICENSE="GPL"
|
||||
PKG_SITE="https://libreelec.tv"
|
||||
@@ -11,7 +11,7 @@ PKG_URL=""
|
||||
PKG_DEPENDS_TARGET="toolchain"
|
||||
PKG_SECTION="virtual"
|
||||
PKG_SHORTDESC="A bundle of network tools and programs"
|
||||
PKG_LONGDESC="This bundle currently includes bwm-ng, iftop, iperf, irssi, iw, lftp, ncftp, ngrep, nmap, rar2fs, rsync, sshfs, tcpdump, udpxy and wireless_tools."
|
||||
PKG_LONGDESC="This bundle currently includes bwm-ng, iftop, iperf, irssi, lftp, ncftp, ngrep, nmap, rar2fs, rsync, sshfs, tcpdump, udpxy and wireless_tools."
|
||||
|
||||
PKG_IS_ADDON="yes"
|
||||
PKG_ADDON_NAME="Network Tools"
|
||||
@@ -22,7 +22,6 @@ PKG_DEPENDS_TARGET="toolchain \
|
||||
iftop \
|
||||
iperf \
|
||||
irssi \
|
||||
iw \
|
||||
lftp \
|
||||
ncftp \
|
||||
ngrep \
|
||||
@@ -49,9 +48,6 @@ addon() {
|
||||
# irssi
|
||||
cp -P $(get_build_dir irssi)/.$TARGET_NAME/src/fe-text/irssi $ADDON_BUILD/$PKG_ADDON_ID/bin
|
||||
|
||||
# iw
|
||||
cp -P $(get_build_dir iw)/iw $ADDON_BUILD/$PKG_ADDON_ID/bin
|
||||
|
||||
# lftp
|
||||
cp -P $(get_build_dir lftp)/.$TARGET_NAME/src/lftp $ADDON_BUILD/$PKG_ADDON_ID/bin
|
||||
|
||||
|
||||
@@ -1,3 +1,6 @@
|
||||
107
|
||||
- Update RPi.GPIO to 0.7.0
|
||||
|
||||
106
|
||||
- Update gpiozero to 1.5.0 (doesn't require setuptools)
|
||||
- Add colorzero 1.1 required by gpiozero
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
|
||||
PKG_NAME="rpi-tools"
|
||||
PKG_VERSION="1.0"
|
||||
PKG_REV="106"
|
||||
PKG_REV="107"
|
||||
PKG_ARCH="arm"
|
||||
PKG_LICENSE="GPL"
|
||||
PKG_SITE="https://libreelec.tv"
|
||||
|
||||
2
packages/audio/alsa-lib/modprobe.d/intel-audio.conf
Normal file
2
packages/audio/alsa-lib/modprobe.d/intel-audio.conf
Normal file
@@ -0,0 +1,2 @@
|
||||
# work around no audio issue on Intel NUCs
|
||||
blacklist snd_soc_skl
|
||||
@@ -2,8 +2,8 @@
|
||||
# Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv)
|
||||
|
||||
PKG_NAME="zstd"
|
||||
PKG_VERSION="1.4.2"
|
||||
PKG_SHA256="12730983b521f9a604c6789140fcb94fadf9a3ca99199765e33c56eb65b643c9"
|
||||
PKG_VERSION="1.4.3"
|
||||
PKG_SHA256="e88ec8d420ff228610b77fba4fbf22b9f8b9d3f223a40ef59c9c075fcdad5767"
|
||||
PKG_LICENSE="BSD/GPLv2"
|
||||
PKG_SITE="http://www.zstd.net"
|
||||
PKG_URL="https://github.com/facebook/zstd/releases/download/v${PKG_VERSION}/${PKG_NAME}-${PKG_VERSION}.tar.gz"
|
||||
|
||||
@@ -9,7 +9,7 @@ PKG_LICENSE="GPL"
|
||||
PKG_SITE="http://www.gnu.org/software/binutils/"
|
||||
PKG_URL="http://ftpmirror.gnu.org/binutils/$PKG_NAME-$PKG_VERSION.tar.gz"
|
||||
PKG_DEPENDS_HOST="ccache:host bison:host flex:host linux:host"
|
||||
PKG_DEPENDS_TARGET="toolchain binutils:host"
|
||||
PKG_DEPENDS_TARGET="toolchain zlib binutils:host"
|
||||
PKG_LONGDESC="A GNU collection of binary utilities."
|
||||
|
||||
PKG_CONFIGURE_OPTS_HOST="--target=$TARGET_NAME \
|
||||
@@ -31,6 +31,7 @@ PKG_CONFIGURE_OPTS_HOST="--target=$TARGET_NAME \
|
||||
PKG_CONFIGURE_OPTS_TARGET="--target=$TARGET_NAME \
|
||||
--with-sysroot=$SYSROOT_PREFIX \
|
||||
--with-lib-path=$SYSROOT_PREFIX/lib:$SYSROOT_PREFIX/usr/lib \
|
||||
--with-system-zlib \
|
||||
--without-ppl \
|
||||
--without-cloog \
|
||||
--enable-static \
|
||||
@@ -67,6 +68,7 @@ make_target() {
|
||||
make -C libiberty
|
||||
make -C bfd
|
||||
make -C opcodes
|
||||
make -C binutils strings
|
||||
}
|
||||
|
||||
makeinstall_target() {
|
||||
@@ -74,4 +76,7 @@ makeinstall_target() {
|
||||
cp libiberty/libiberty.a $SYSROOT_PREFIX/usr/lib
|
||||
make DESTDIR="$SYSROOT_PREFIX" -C bfd install
|
||||
make DESTDIR="$SYSROOT_PREFIX" -C opcodes install
|
||||
|
||||
mkdir -p ${INSTALL}/usr/bin
|
||||
cp binutils/strings ${INSTALL}/usr/bin
|
||||
}
|
||||
|
||||
@@ -35,6 +35,11 @@ PKG_CONFIGURE_OPTS_TARGET="BASH_SHELL=/bin/sh \
|
||||
--enable-lock-elision \
|
||||
--disable-timezone-tools"
|
||||
|
||||
# workaround to use arm patches for aarch64
|
||||
if [ "${TARGET_PATCH_ARCH}" = "aarch64" ]; then
|
||||
PKG_PATCH_DIRS="arm"
|
||||
fi
|
||||
|
||||
# busybox:init needs it
|
||||
# testcase: boot with /storage as nfs-share (set cmdline.txt -> "ip=dhcp boot=UUID=2407-5145 disk=NFS=[nfs-share] quiet")
|
||||
PKG_CONFIGURE_OPTS_TARGET+=" --enable-obsolete-rpc"
|
||||
|
||||
@@ -0,0 +1,348 @@
|
||||
From 6676e967dba405ca31d57b63e096becd13d4a200 Mon Sep 17 00:00:00 2001
|
||||
From: Rahul Chaudhry <rahulchaudhry@chromium.org>
|
||||
Date: Thu, 15 Mar 2018 14:30:17 -0700
|
||||
Subject: [PATCH 4/8] sys-libs/glibc: add support for SHT_RELR sections.
|
||||
|
||||
This patch adds experimental support for SHT_RELR sections, proposed
|
||||
here: https://groups.google.com/forum/#!topic/generic-abi/bX460iggiKg
|
||||
|
||||
SHT_RELR sections are supported for arm, aarch64, and x86_64 targets.
|
||||
To enable them, pass '--experimental-use-relr' flag to gold.
|
||||
|
||||
Definitions for the new ELF section type and dynamic array tags, as well
|
||||
as the encoding used in the new section are all under discussion and are
|
||||
subject to change. We plan to send the patch upstream after the gABI has
|
||||
been updated to include the new definitions.
|
||||
|
||||
[Adrian: forward-ported to glibc 2.32]
|
||||
---
|
||||
elf/do-rel.h | 41 ++++++++++++++++++++++++++++++++++--
|
||||
elf/dynamic-link.h | 15 +++++++++++++
|
||||
elf/elf.h | 15 +++++++++++--
|
||||
elf/get-dynamic-info.h | 7 ++++++
|
||||
sysdeps/aarch64/dl-machine.h | 10 +++++++++
|
||||
sysdeps/arm/dl-machine.h | 10 +++++++++
|
||||
sysdeps/i386/dl-machine.h | 10 +++++++++
|
||||
sysdeps/x86_64/dl-machine.h | 10 +++++++++
|
||||
8 files changed, 114 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/elf/do-rel.h b/elf/do-rel.h
|
||||
index 1d0a1f2c5d..25babef6e1 100644
|
||||
--- a/elf/do-rel.h
|
||||
+++ b/elf/do-rel.h
|
||||
@@ -26,6 +26,12 @@
|
||||
# define elf_machine_rel_relative elf_machine_rela_relative
|
||||
#endif
|
||||
|
||||
+#ifdef DO_RELR
|
||||
+# define elf_dynamic_do_Rel elf_dynamic_do_Relr
|
||||
+# define Rel Relr
|
||||
+# define elf_machine_rel_relative elf_machine_relr_relative
|
||||
+#endif
|
||||
+
|
||||
#ifndef DO_ELF_MACHINE_REL_RELATIVE
|
||||
# define DO_ELF_MACHINE_REL_RELATIVE(map, l_addr, relative) \
|
||||
elf_machine_rel_relative (l_addr, relative, \
|
||||
@@ -46,12 +52,12 @@ elf_dynamic_do_Rel (struct link_map *map,
|
||||
const ElfW(Rel) *r = (const void *) reladdr;
|
||||
const ElfW(Rel) *end = (const void *) (reladdr + relsize);
|
||||
ElfW(Addr) l_addr = map->l_addr;
|
||||
-# if defined ELF_MACHINE_IRELATIVE && !defined RTLD_BOOTSTRAP
|
||||
+# if defined ELF_MACHINE_IRELATIVE && !defined RTLD_BOOTSTRAP && !defined DO_RELR
|
||||
const ElfW(Rel) *r2 = NULL;
|
||||
const ElfW(Rel) *end2 = NULL;
|
||||
# endif
|
||||
|
||||
-#if (!defined DO_RELA || !defined ELF_MACHINE_PLT_REL) && !defined RTLD_BOOTSTRAP
|
||||
+#if (!defined DO_RELA || !defined ELF_MACHINE_PLT_REL) && !defined RTLD_BOOTSTRAP && !defined DO_RELR
|
||||
/* We never bind lazily during ld.so bootstrap. Unfortunately gcc is
|
||||
not clever enough to see through all the function calls to realize
|
||||
that. */
|
||||
@@ -80,8 +86,10 @@ elf_dynamic_do_Rel (struct link_map *map,
|
||||
else
|
||||
#endif
|
||||
{
|
||||
+# if !defined DO_RELR
|
||||
const ElfW(Sym) *const symtab =
|
||||
(const void *) D_PTR (map, l_info[DT_SYMTAB]);
|
||||
+# endif
|
||||
const ElfW(Rel) *relative = r;
|
||||
r += nrelative;
|
||||
|
||||
@@ -108,9 +116,36 @@ elf_dynamic_do_Rel (struct link_map *map,
|
||||
if (l_addr != 0 || ! map->l_info[VALIDX(DT_GNU_PRELINKED)])
|
||||
# endif
|
||||
#endif
|
||||
+
|
||||
+#ifdef DO_RELR
|
||||
+ {
|
||||
+ ElfW(Addr) base = 0;
|
||||
+ for (; relative < end; ++relative)
|
||||
+ {
|
||||
+ ElfW(Relr) entry = *relative;
|
||||
+ if ((entry&1) == 0)
|
||||
+ {
|
||||
+ elf_machine_relr_relative (l_addr, (void *) (l_addr + entry));
|
||||
+ base = entry + sizeof(ElfW(Addr));
|
||||
+ continue;
|
||||
+ }
|
||||
+ ElfW(Addr) offset = base;
|
||||
+ while (entry != 0)
|
||||
+ {
|
||||
+ entry >>= 1;
|
||||
+ if ((entry&1) != 0)
|
||||
+ elf_machine_relr_relative (l_addr, (void *) (l_addr + offset));
|
||||
+ offset += sizeof(ElfW(Addr));
|
||||
+ }
|
||||
+ base += (8*sizeof(ElfW(Addr)) - 1) * sizeof(ElfW(Addr));
|
||||
+ }
|
||||
+ }
|
||||
+#else
|
||||
for (; relative < r; ++relative)
|
||||
DO_ELF_MACHINE_REL_RELATIVE (map, l_addr, relative);
|
||||
+#endif
|
||||
|
||||
+#if !defined DO_RELR
|
||||
#ifdef RTLD_BOOTSTRAP
|
||||
/* The dynamic linker always uses versioning. */
|
||||
assert (map->l_info[VERSYMIDX (DT_VERSYM)] != NULL);
|
||||
@@ -179,6 +214,7 @@ elf_dynamic_do_Rel (struct link_map *map,
|
||||
skip_ifunc);
|
||||
# endif
|
||||
}
|
||||
+#endif
|
||||
#endif
|
||||
}
|
||||
}
|
||||
@@ -189,3 +225,4 @@ elf_dynamic_do_Rel (struct link_map *map,
|
||||
#undef elf_machine_rel_relative
|
||||
#undef DO_ELF_MACHINE_REL_RELATIVE
|
||||
#undef DO_RELA
|
||||
+#undef DO_RELR
|
||||
diff --git a/elf/dynamic-link.h b/elf/dynamic-link.h
|
||||
index 6727233e1a..4345df9949 100644
|
||||
--- a/elf/dynamic-link.h
|
||||
+++ b/elf/dynamic-link.h
|
||||
@@ -76,6 +76,11 @@ auto inline void __attribute__((always_inline))
|
||||
elf_machine_rela_relative (ElfW(Addr) l_addr, const ElfW(Rela) *reloc,
|
||||
void *const reloc_addr);
|
||||
# endif
|
||||
+# if ! ELF_MACHINE_NO_RELR
|
||||
+auto inline void __attribute__((always_inline))
|
||||
+elf_machine_relr_relative (ElfW(Addr) l_addr,
|
||||
+ void *const reloc_addr);
|
||||
+# endif
|
||||
# if ELF_MACHINE_NO_RELA || defined ELF_MACHINE_PLT_REL
|
||||
auto inline void __attribute__((always_inline))
|
||||
elf_machine_lazy_rel (struct link_map *map,
|
||||
@@ -190,6 +195,15 @@ elf_machine_lazy_rel (struct link_map *map,
|
||||
# define ELF_DYNAMIC_DO_RELA(map, lazy, skip_ifunc) /* Nothing to do. */
|
||||
# endif
|
||||
|
||||
+# if ! ELF_MACHINE_NO_RELR
|
||||
+# define DO_RELR
|
||||
+# include "do-rel.h"
|
||||
+# define ELF_DYNAMIC_DO_RELR(map, lazy, skip_ifunc) \
|
||||
+ _ELF_DYNAMIC_DO_RELOC (RELR, Relr, map, lazy, skip_ifunc, 1)
|
||||
+# else
|
||||
+# define ELF_DYNAMIC_DO_RELR(map, lazy, skip_ifunc) /* Nothing to do. */
|
||||
+# endif
|
||||
+
|
||||
/* This can't just be an inline function because GCC is too dumb
|
||||
to inline functions containing inlines themselves. */
|
||||
# define ELF_DYNAMIC_RELOCATE(map, lazy, consider_profile, skip_ifunc) \
|
||||
@@ -198,6 +212,7 @@ elf_machine_lazy_rel (struct link_map *map,
|
||||
(consider_profile)); \
|
||||
ELF_DYNAMIC_DO_REL ((map), edr_lazy, skip_ifunc); \
|
||||
ELF_DYNAMIC_DO_RELA ((map), edr_lazy, skip_ifunc); \
|
||||
+ ELF_DYNAMIC_DO_RELR ((map), edr_lazy, skip_ifunc); \
|
||||
} while (0)
|
||||
|
||||
#endif
|
||||
diff --git a/elf/elf.h b/elf/elf.h
|
||||
index 197b557d15..5b6da8e8ae 100644
|
||||
--- a/elf/elf.h
|
||||
+++ b/elf/elf.h
|
||||
@@ -446,7 +446,8 @@ typedef struct
|
||||
#define SHT_PREINIT_ARRAY 16 /* Array of pre-constructors */
|
||||
#define SHT_GROUP 17 /* Section group */
|
||||
#define SHT_SYMTAB_SHNDX 18 /* Extended section indeces */
|
||||
-#define SHT_NUM 19 /* Number of defined types. */
|
||||
+#define SHT_RELR 19 /* Relative relocation, only offsets */
|
||||
+#define SHT_NUM 20 /* Number of defined types. */
|
||||
#define SHT_LOOS 0x60000000 /* Start OS-specific. */
|
||||
#define SHT_GNU_ATTRIBUTES 0x6ffffff5 /* Object attributes. */
|
||||
#define SHT_GNU_HASH 0x6ffffff6 /* GNU-style hash table. */
|
||||
@@ -664,6 +665,12 @@ typedef struct
|
||||
Elf64_Sxword r_addend; /* Addend */
|
||||
} Elf64_Rela;
|
||||
|
||||
+/* Relocation table entry for relative (in section of type SHT_RELR). */
|
||||
+
|
||||
+typedef Elf32_Word Elf32_Relr; /* offset/bitmap for relative relocations */
|
||||
+
|
||||
+typedef Elf64_Xword Elf64_Relr; /* offset/bitmap for relative relocations */
|
||||
+
|
||||
/* How to extract and insert information held in the r_info field. */
|
||||
|
||||
#define ELF32_R_SYM(val) ((val) >> 8)
|
||||
@@ -885,7 +892,10 @@ typedef struct
|
||||
#define DT_PREINIT_ARRAY 32 /* Array with addresses of preinit fct*/
|
||||
#define DT_PREINIT_ARRAYSZ 33 /* size in bytes of DT_PREINIT_ARRAY */
|
||||
#define DT_SYMTAB_SHNDX 34 /* Address of SYMTAB_SHNDX section */
|
||||
-#define DT_NUM 35 /* Number used */
|
||||
+#define DT_RELRSZ 35
|
||||
+#define DT_RELR 36
|
||||
+#define DT_RELRENT 37
|
||||
+#define DT_NUM 38 /* Number used */
|
||||
#define DT_LOOS 0x6000000d /* Start of OS-specific */
|
||||
#define DT_HIOS 0x6ffff000 /* End of OS-specific */
|
||||
#define DT_LOPROC 0x70000000 /* Start of processor-specific */
|
||||
@@ -937,6 +947,7 @@ typedef struct
|
||||
GNU extension. */
|
||||
#define DT_VERSYM 0x6ffffff0
|
||||
|
||||
+#define DT_RELRCOUNT 0x6ffffff8
|
||||
#define DT_RELACOUNT 0x6ffffff9
|
||||
#define DT_RELCOUNT 0x6ffffffa
|
||||
|
||||
diff --git a/elf/get-dynamic-info.h b/elf/get-dynamic-info.h
|
||||
index 4f6a86ef37..79ff22f0c0 100644
|
||||
--- a/elf/get-dynamic-info.h
|
||||
+++ b/elf/get-dynamic-info.h
|
||||
@@ -108,6 +108,9 @@ elf_get_dynamic_info (struct link_map *l, ElfW(Dyn) *temp)
|
||||
# if ! ELF_MACHINE_NO_REL
|
||||
ADJUST_DYN_INFO (DT_REL);
|
||||
# endif
|
||||
+# if ! ELF_MACHINE_NO_RELR
|
||||
+ ADJUST_DYN_INFO (DT_RELR);
|
||||
+#endif
|
||||
ADJUST_DYN_INFO (DT_JMPREL);
|
||||
ADJUST_DYN_INFO (VERSYMIDX (DT_VERSYM));
|
||||
ADJUST_DYN_INFO (ADDRIDX (DT_GNU_HASH));
|
||||
@@ -134,6 +137,10 @@ elf_get_dynamic_info (struct link_map *l, ElfW(Dyn) *temp)
|
||||
if (info[DT_REL] != NULL)
|
||||
assert (info[DT_RELENT]->d_un.d_val == sizeof (ElfW(Rel)));
|
||||
#endif
|
||||
+#if ! ELF_MACHINE_NO_RELR
|
||||
+ if (info[DT_RELR] != NULL)
|
||||
+ assert (info[DT_RELRENT]->d_un.d_val == sizeof (ElfW(Relr)));
|
||||
+# endif
|
||||
#ifdef RTLD_BOOTSTRAP
|
||||
/* Only the bind now flags are allowed. */
|
||||
assert (info[VERSYMIDX (DT_FLAGS_1)] == NULL
|
||||
diff --git a/sysdeps/aarch64/dl-machine.h b/sysdeps/aarch64/dl-machine.h
|
||||
index fde7cfd9e2..eaff6dbc6d 100644
|
||||
--- a/sysdeps/aarch64/dl-machine.h
|
||||
+++ b/sysdeps/aarch64/dl-machine.h
|
||||
@@ -198,6 +198,7 @@ _dl_start_user: \n\
|
||||
/* AArch64 uses RELA not REL */
|
||||
#define ELF_MACHINE_NO_REL 1
|
||||
#define ELF_MACHINE_NO_RELA 0
|
||||
+#define ELF_MACHINE_NO_RELR 0
|
||||
|
||||
#define DL_PLATFORM_INIT dl_platform_init ()
|
||||
|
||||
@@ -383,6 +384,15 @@ elf_machine_rela_relative (ElfW(Addr) l_addr,
|
||||
*reloc_addr = l_addr + reloc->r_addend;
|
||||
}
|
||||
|
||||
+inline void
|
||||
+__attribute__ ((always_inline))
|
||||
+elf_machine_relr_relative (ElfW(Addr) l_addr,
|
||||
+ void *const reloc_addr_arg)
|
||||
+{
|
||||
+ ElfW(Addr) *const reloc_addr = reloc_addr_arg;
|
||||
+ *reloc_addr += l_addr;
|
||||
+}
|
||||
+
|
||||
inline void
|
||||
__attribute__ ((always_inline))
|
||||
elf_machine_lazy_rel (struct link_map *map,
|
||||
diff --git a/sysdeps/arm/dl-machine.h b/sysdeps/arm/dl-machine.h
|
||||
index 90856779b1..c586232c9d 100644
|
||||
--- a/sysdeps/arm/dl-machine.h
|
||||
+++ b/sysdeps/arm/dl-machine.h
|
||||
@@ -296,6 +296,7 @@ elf_machine_plt_value (struct link_map *map, const Elf32_Rel *reloc,
|
||||
Prelinked libraries may use Elf32_Rela though. */
|
||||
#define ELF_MACHINE_NO_RELA defined RTLD_BOOTSTRAP
|
||||
#define ELF_MACHINE_NO_REL 0
|
||||
+#define ELF_MACHINE_NO_RELR 0
|
||||
|
||||
/* Names of the architecture-specific auditing callback functions. */
|
||||
#define ARCH_LA_PLTENTER arm_gnu_pltenter
|
||||
@@ -637,6 +638,15 @@ elf_machine_rel_relative (Elf32_Addr l_addr, const Elf32_Rel *reloc,
|
||||
*reloc_addr += l_addr;
|
||||
}
|
||||
|
||||
+auto inline void
|
||||
+__attribute ((always_inline))
|
||||
+elf_machine_relr_relative (ElfW(Addr) l_addr,
|
||||
+ void *const reloc_addr_arg)
|
||||
+{
|
||||
+ ElfW(Addr) *const reloc_addr = reloc_addr_arg;
|
||||
+ *reloc_addr += l_addr;
|
||||
+}
|
||||
+
|
||||
# ifndef RTLD_BOOTSTRAP
|
||||
auto inline void
|
||||
__attribute__ ((always_inline))
|
||||
diff --git a/sysdeps/i386/dl-machine.h b/sysdeps/i386/dl-machine.h
|
||||
index 672d8f27ce..7c09608913 100644
|
||||
--- a/sysdeps/i386/dl-machine.h
|
||||
+++ b/sysdeps/i386/dl-machine.h
|
||||
@@ -286,6 +286,7 @@ elf_machine_plt_value (struct link_map *map, const Elf32_Rel *reloc,
|
||||
Prelinked libraries may use Elf32_Rela though. */
|
||||
#define ELF_MACHINE_NO_RELA defined RTLD_BOOTSTRAP
|
||||
#define ELF_MACHINE_NO_REL 0
|
||||
+#define ELF_MACHINE_NO_RELR 0
|
||||
|
||||
#ifdef RESOLVE_MAP
|
||||
|
||||
@@ -658,6 +659,15 @@ elf_machine_rel_relative (Elf32_Addr l_addr, const Elf32_Rel *reloc,
|
||||
*reloc_addr += l_addr;
|
||||
}
|
||||
|
||||
+auto inline void
|
||||
+__attribute ((always_inline))
|
||||
+elf_machine_relr_relative (ElfW(Addr) l_addr,
|
||||
+ void *const reloc_addr_arg)
|
||||
+{
|
||||
+ ElfW(Addr) *const reloc_addr = reloc_addr_arg;
|
||||
+ *reloc_addr += l_addr;
|
||||
+}
|
||||
+
|
||||
# ifndef RTLD_BOOTSTRAP
|
||||
auto inline void
|
||||
__attribute__ ((always_inline))
|
||||
diff --git a/sysdeps/x86_64/dl-machine.h b/sysdeps/x86_64/dl-machine.h
|
||||
index 363a749cb2..10a200ba67 100644
|
||||
--- a/sysdeps/x86_64/dl-machine.h
|
||||
+++ b/sysdeps/x86_64/dl-machine.h
|
||||
@@ -214,6 +214,7 @@ _dl_start_user:\n\
|
||||
/* The x86-64 never uses Elf64_Rel/Elf32_Rel relocations. */
|
||||
#define ELF_MACHINE_NO_REL 1
|
||||
#define ELF_MACHINE_NO_RELA 0
|
||||
+#define ELF_MACHINE_NO_RELR 0
|
||||
|
||||
/* We define an initialization function. This is called very early in
|
||||
_dl_sysdep_start. */
|
||||
@@ -549,6 +550,15 @@ elf_machine_rela_relative (ElfW(Addr) l_addr, const ElfW(Rela) *reloc,
|
||||
}
|
||||
}
|
||||
|
||||
+auto inline void
|
||||
+__attribute ((always_inline))
|
||||
+elf_machine_relr_relative (ElfW(Addr) l_addr,
|
||||
+ void *const reloc_addr_arg)
|
||||
+{
|
||||
+ ElfW(Addr) *const reloc_addr = reloc_addr_arg;
|
||||
+ *reloc_addr += l_addr;
|
||||
+}
|
||||
+
|
||||
auto inline void
|
||||
__attribute ((always_inline))
|
||||
elf_machine_lazy_rel (struct link_map *map,
|
||||
--
|
||||
2.30.2
|
||||
|
||||
@@ -0,0 +1,31 @@
|
||||
From 61b3b546450ae0a70cb4a57fbb0e0fc47b331370 Mon Sep 17 00:00:00 2001
|
||||
From: Portisch <hugo.portisch@yahoo.de>
|
||||
Date: Sat, 5 Jun 2021 19:41:25 +0200
|
||||
Subject: [PATCH] tls: libwidevinecdm.so: since 4.10.2252.0 has TLS with
|
||||
64-byte alignment Change the max_align to 64U instead 16 to make it possible
|
||||
to use dlopen again. Tests by changing TLS_TCB_ALIGN directly showed up some
|
||||
random crashes. Reverence: https://lkml.org/lkml/2020/7/3/754
|
||||
|
||||
---
|
||||
elf/dl-tls.c | 5 +++++
|
||||
1 file changed, 5 insertions(+)
|
||||
|
||||
diff --git a/elf/dl-tls.c b/elf/dl-tls.c
|
||||
index 9fa62f5d..d8f2f740 100644
|
||||
--- a/elf/dl-tls.c
|
||||
+++ b/elf/dl-tls.c
|
||||
@@ -213,6 +213,11 @@ void
|
||||
_dl_determine_tlsoffset (void)
|
||||
{
|
||||
size_t max_align = TLS_TCB_ALIGN;
|
||||
+ /* libwidevinecdm.so: since 4.10.2252.0 has TLS with 64-byte alignment.
|
||||
+ Since TLS is initialized before audit modules are loaded and slotinfo
|
||||
+ information is available, this is not taken into account below in
|
||||
+ the audit case. */
|
||||
+ max_align = MAX (max_align, 64U);
|
||||
size_t freetop = 0;
|
||||
size_t freebottom = 0;
|
||||
|
||||
--
|
||||
2.31.1
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
# Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv)
|
||||
|
||||
PKG_NAME="libretro-2048"
|
||||
PKG_VERSION="54d3ddd3c9f81d7bbd5714a670913e46301781c7"
|
||||
PKG_SHA256="cb5616e0984bdf364c7537c998e7341d95f00616aacf23cf8b3a59e6bb1352ba"
|
||||
PKG_VERSION="74d10e41b86111d42309103d3bd7e8910263b1d1"
|
||||
PKG_SHA256="56cb85b12f8050dff1bf4331dee7a18dcc7b532dea0ec6c9125d9e75e133596e"
|
||||
PKG_LICENSE="Public domain"
|
||||
PKG_SITE="https://github.com/libretro/libretro-2048"
|
||||
PKG_URL="https://github.com/libretro/libretro-2048/archive/$PKG_VERSION.tar.gz"
|
||||
|
||||
@@ -1,21 +0,0 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
# Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv)
|
||||
|
||||
PKG_NAME="libretro-4do"
|
||||
PKG_VERSION="1fa503598323f7c573deca8dfef44f3b465c8074"
|
||||
PKG_SHA256="28d8a084fc67d29b27f837800e87307a2365637d92994b9edb2660fade7cfce7"
|
||||
PKG_LICENSE="LGPL"
|
||||
PKG_SITE="https://github.com/libretro/4do-libretro"
|
||||
PKG_URL="https://github.com/libretro/4do-libretro/archive/$PKG_VERSION.tar.gz"
|
||||
PKG_DEPENDS_TARGET="toolchain"
|
||||
PKG_LONGDESC="Port of 4DO/libfreedo to libretro."
|
||||
|
||||
PKG_LIBNAME="4do_libretro.so"
|
||||
PKG_LIBPATH="$PKG_LIBNAME"
|
||||
PKG_LIBVAR="4DO_LIB"
|
||||
|
||||
makeinstall_target() {
|
||||
mkdir -p $SYSROOT_PREFIX/usr/lib/cmake/$PKG_NAME
|
||||
cp $PKG_LIBPATH $SYSROOT_PREFIX/usr/lib/$PKG_LIBNAME
|
||||
echo "set($PKG_LIBVAR $SYSROOT_PREFIX/usr/lib/$PKG_LIBNAME)" > $SYSROOT_PREFIX/usr/lib/cmake/$PKG_NAME/$PKG_NAME-config.cmake
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
diff -Naur a/Makefile b/Makefile
|
||||
--- a/Makefile 2017-07-01 22:16:40.000000000 -0700
|
||||
+++ b/Makefile 2017-07-14 09:55:45.714816515 -0700
|
||||
@@ -37,8 +37,6 @@
|
||||
endif
|
||||
|
||||
ifneq (,$(findstring unix,$(platform)))
|
||||
- AR = ${CC_PREFIX}ar
|
||||
- CC = ${CC_PREFIX}gcc
|
||||
|
||||
TARGET := $(TARGET_NAME)_libretro.so
|
||||
fpic := -fPIC
|
||||
24
packages/emulation/libretro-atari800/package.mk
Normal file
24
packages/emulation/libretro-atari800/package.mk
Normal file
@@ -0,0 +1,24 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
# Copyright (C) 2020-present Team LibreELEC (https://libreelec.tv)
|
||||
|
||||
PKG_NAME="libretro-atari800"
|
||||
PKG_VERSION="70182481ec0ce2d027ed6fb3f7296d9662c7d58e"
|
||||
PKG_SHA256="12edac9c3a4cacdd1139f21d2cafee1d66152d53d1114ee2bf613dcb8b827bbe"
|
||||
PKG_LICENSE="GPLv2"
|
||||
PKG_SITE="https://github.com/libretro/libretro-atari800"
|
||||
PKG_URL="https://github.com/libretro/libretro-atari800/archive/$PKG_VERSION.tar.gz"
|
||||
PKG_DEPENDS_TARGET="toolchain kodi-platform"
|
||||
PKG_LONGDESC="Atari 8-bit computer and 5200 console emulator"
|
||||
PKG_TOOLCHAIN="make"
|
||||
|
||||
PKG_MAKE_OPTS_TARGET="platform=unix"
|
||||
|
||||
PKG_LIBNAME="atari800_libretro.so"
|
||||
PKG_LIBPATH="$PKG_LIBNAME"
|
||||
PKG_LIBVAR="ATARI800_LIB"
|
||||
|
||||
makeinstall_target() {
|
||||
mkdir -p $SYSROOT_PREFIX/usr/lib/cmake/$PKG_NAME
|
||||
cp $PKG_LIBPATH $SYSROOT_PREFIX/usr/lib/$PKG_LIBNAME
|
||||
echo "set($PKG_LIBVAR $SYSROOT_PREFIX/usr/lib/$PKG_LIBNAME)" > $SYSROOT_PREFIX/usr/lib/cmake/$PKG_NAME/$PKG_NAME-config.cmake
|
||||
}
|
||||
@@ -2,8 +2,8 @@
|
||||
# Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv)
|
||||
|
||||
PKG_NAME="libretro-beetle-bsnes"
|
||||
PKG_VERSION="b40adc710bd14684bbb53102a7e42267a8dea9cb"
|
||||
PKG_SHA256="21c39d3557e89b2ae1f1397a996e49f5f73c1e7767d505faff8d1b4fe84357ff"
|
||||
PKG_VERSION="de22d8420ea606f1b2f72afd4dda34619cf2cc20"
|
||||
PKG_SHA256="d55d677a03b48861e34e5ff30402d82024ec6ed7c267e825741d134c4092dd3d"
|
||||
PKG_LICENSE="GPLv2"
|
||||
PKG_SITE="https://github.com/libretro/beetle-bsnes-libretro"
|
||||
PKG_URL="https://github.com/libretro/beetle-bsnes-libretro/archive/$PKG_VERSION.tar.gz"
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
# Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv)
|
||||
|
||||
PKG_NAME="libretro-beetle-gba"
|
||||
PKG_VERSION="654ded0ff7d4c257424891b8b6601b09aa22d003"
|
||||
PKG_SHA256="46256f7cae839f0fa863127b2b30d1475d189210a869d317d70134460d1c4706"
|
||||
PKG_VERSION="135afdbb9591655a3e016b75abba07e481f6d406"
|
||||
PKG_SHA256="5adab5108fb8a703414e9090c12e44e7dc7d09dba4d08e1da798a36a64a88f51"
|
||||
PKG_LICENSE="GPLv2"
|
||||
PKG_SITE="https://github.com/libretro/beetle-gba-libretro"
|
||||
PKG_URL="https://github.com/libretro/beetle-gba-libretro/archive/$PKG_VERSION.tar.gz"
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
# Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv)
|
||||
|
||||
PKG_NAME="libretro-beetle-lynx"
|
||||
PKG_VERSION="9e1de59736b28c8f0cbfe759e0480b19c3dc7bcb"
|
||||
PKG_SHA256="9d769dcd98e82091c3a92f5fd3372cc3ac9ad16b2df796c221b8c445cc277c14"
|
||||
PKG_VERSION="74dde204c0ec6c4bc4cd7821c14548387fbd9ce8"
|
||||
PKG_SHA256="2cf62c74d5fbfd6ead0a83a6778b932a18d5ab6957b5603b56539fefd819e820"
|
||||
PKG_LICENSE="GPLv2"
|
||||
PKG_SITE="https://github.com/libretro/beetle-lynx-libretro"
|
||||
PKG_URL="https://github.com/libretro/beetle-lynx-libretro/archive/$PKG_VERSION.tar.gz"
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user