mirror of
https://github.com/vdr-projects/vdr.git
synced 2025-03-01 10:50:46 +00:00
Compare commits
2060 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
dd71a004e2 | ||
|
45091fbd72 | ||
|
988d5aebfa | ||
|
8c3671fae6 | ||
|
2a12af481a | ||
|
7817e64695 | ||
|
ebbaa39098 | ||
|
d3dcbbd4f2 | ||
|
3045995bbc | ||
|
1b4233d6ad | ||
|
34aa8fe8b4 | ||
|
baa97e9ff1 | ||
|
03afc4a353 | ||
|
ef4ebeb7ee | ||
|
80d8851e62 | ||
|
ead135f716 | ||
|
49dc61a92c | ||
|
af0309cc40 | ||
|
4ed7421b1c | ||
|
3058354dba | ||
|
20a8c5d240 | ||
|
0749a34342 | ||
|
e595eed57d | ||
|
a7576f0b6c | ||
|
657e5dda5d | ||
|
8fb6a2b24b | ||
|
53cac302d8 | ||
|
2c6c014dd8 | ||
|
a7071f580e | ||
|
de5327a048 | ||
|
7ab94c7bcb | ||
|
0f80fc5e86 | ||
|
d169f30e5c | ||
|
7a1842cba6 | ||
|
e4e9d7a55f | ||
|
ccbef6ce6c | ||
|
7461a1ba3a | ||
|
bb55e3036e | ||
|
bbf2cca198 | ||
|
8ce034d124 | ||
|
4030698007 | ||
|
66fea5c9f1 | ||
|
285574eeaa | ||
|
55cfb057e0 | ||
|
b4c538cff7 | ||
|
5a626fef9f | ||
|
2bcd8ba8f3 | ||
|
2dacc776bd | ||
|
a91d687a1a | ||
|
0d3882d43e | ||
|
72ad601328 | ||
|
2c6fd804f6 | ||
|
c590444b7d | ||
|
4805af7915 | ||
|
171b20a80d | ||
|
d00ae923ab | ||
|
d8ab5dc5c6 | ||
|
292af5d4f4 | ||
|
3d6b31b115 | ||
|
9e523073aa | ||
|
32d8e473fb | ||
|
5cd25df60c | ||
|
52c4816c9c | ||
|
6f6b05ffcb | ||
|
6dd5854b7a | ||
|
83425df0b6 | ||
|
82b09eaa8e | ||
|
ec5b1aadab | ||
|
f786510ba2 | ||
|
f006884e57 | ||
|
c0a005b3cd | ||
|
0c91893643 | ||
|
796da9e0f6 | ||
|
5d539be071 | ||
|
1df138d876 | ||
|
71b0140003 | ||
|
a33adf365d | ||
|
8d82b05071 | ||
|
930e3b4200 | ||
|
2543f2c486 | ||
|
d919817c35 | ||
|
6bbb596968 | ||
|
8aec1974bb | ||
|
b3ad9ec699 | ||
|
87410442b6 | ||
|
305735a886 | ||
|
41b7e1546a | ||
|
f3972e4795 | ||
|
e7ea087a6e | ||
|
749ba57dcc | ||
|
0360b0d0e7 | ||
|
2b495e0f87 | ||
|
32b11e1a53 | ||
|
db81c07b27 | ||
|
1c2401eb6c | ||
|
5828d347f7 | ||
|
9c64622718 | ||
|
f9260d0141 | ||
|
746cdaff01 | ||
|
179d5b87fc | ||
|
51dca45a0c | ||
|
62ad9b41dd | ||
|
8b87a6968a | ||
|
faf562fd4e | ||
|
6a09a2fbd6 | ||
|
bc32ffe2f9 | ||
|
ff16bbd777 | ||
|
f7f8a6b131 | ||
|
a3310e2954 | ||
|
0b08666310 | ||
|
42db3fbee0 | ||
|
bfa25d6276 | ||
|
824c495d33 | ||
|
561be36958 | ||
|
8bd0437497 | ||
|
18c9cef1ea | ||
|
2c66d57d4b | ||
|
29200d040e | ||
|
385738cadd | ||
|
a2591d6e98 | ||
|
fe97a38e77 | ||
|
552f5fc4e7 | ||
|
21d3d489fd | ||
|
78b7e4e252 | ||
|
5d984b606e | ||
|
88b1e30494 | ||
|
939071bf25 | ||
|
655682b5d2 | ||
|
b1418b6bcd | ||
|
35c8b3d22c | ||
|
e5ae02e3fa | ||
|
f0da21ea13 | ||
|
eb35faaf7d | ||
|
05f03d6e38 | ||
|
0d4284df29 | ||
|
cade92cda1 | ||
|
f0bbf64da0 | ||
|
6458f8b581 | ||
|
1770a18598 | ||
|
5f136032a2 | ||
|
63efcf3927 | ||
|
468dc1115e | ||
|
d53e0fd5c3 | ||
|
14b907b01c | ||
|
e0d87da768 | ||
|
42b584e38d | ||
|
a0f79bdd5f | ||
|
4372d55dd1 | ||
|
13672280b6 | ||
|
5b134cb23e | ||
|
87cf0b7a3d | ||
|
8b14723e9e | ||
|
7fe59548cd | ||
|
15f13ac936 | ||
|
5b176f97a4 | ||
|
0bb6f87776 | ||
|
c06d2389e9 | ||
|
548a33c728 | ||
|
4336b55f4e | ||
|
c12c7378e9 | ||
|
a299d8d348 | ||
|
c7bf474a42 | ||
|
8d65cc6dc0 | ||
|
f2b9f0e8dd | ||
|
30f05ba714 | ||
|
76445411a5 | ||
|
4425918d31 | ||
|
6888ea68b6 | ||
|
abb82a2396 | ||
|
6192ca81d9 | ||
|
d06c5efa54 | ||
|
f859b8d2ae | ||
|
035d5fd5b9 | ||
|
93d578d9b8 | ||
|
d756628297 | ||
|
a4cde807bc | ||
|
83c9677899 | ||
|
b14ed38a48 | ||
|
2bf0967a47 | ||
|
7ed306d127 | ||
|
5a029eb29f | ||
|
230adc8235 | ||
|
982a9a5157 | ||
|
c8e4921a0a | ||
|
786245efe5 | ||
|
74460f22bf | ||
|
a843d03af1 | ||
|
d3f3e856e4 | ||
|
be3c6048ed | ||
|
2a0222226a | ||
|
50c3951017 | ||
|
ea1ad945b4 | ||
|
8cde8464eb | ||
|
14b108f104 | ||
|
330dbce1e7 | ||
|
adeb6314fb | ||
|
78a09b5926 | ||
|
d05765c670 | ||
|
a5a4b72d1c | ||
|
955b1c914f | ||
|
5b28aa7e02 | ||
|
f34a6d66a0 | ||
|
104bddc560 | ||
|
e7107b789e | ||
|
f2e71eb668 | ||
|
f275346ecc | ||
|
33b47142e4 | ||
|
5f3d42bcd8 | ||
|
3f2dd916c1 | ||
|
0d50ec57f5 | ||
|
7301f2de08 | ||
|
8c7d387e86 | ||
|
6c5a448dec | ||
|
a84f9a8e19 | ||
|
545613e0e7 | ||
|
ac4da6e380 | ||
|
4d5cbaf57d | ||
|
a4a2466bf4 | ||
|
a0cdfc432a | ||
|
60c858689b | ||
|
9686a9b474 | ||
|
0f6265a97f | ||
|
7b1c097958 | ||
|
58e21d8e37 | ||
|
e1f04cd6fa | ||
|
7775698bac | ||
|
8f52603665 | ||
|
c40fb4b4aa | ||
|
161fa8ead4 | ||
|
115eb9fdb4 | ||
|
b7112ece6c | ||
|
f7c8f582ea | ||
|
ada85b693e | ||
|
a1a8c5d94c | ||
|
505bcee926 | ||
|
c02c081d91 | ||
|
c8566fab77 | ||
|
54c4e69299 | ||
|
31b87544f1 | ||
|
cd3cda2654 | ||
|
c98fdd9120 | ||
|
10ffd08c82 | ||
|
4a199fe4ac | ||
|
98fa6206ac | ||
|
ce23ba64bd | ||
|
02c668a6a9 | ||
|
9de337d2ee | ||
|
fa8c7c35b5 | ||
|
3d13eb002f | ||
|
b2fb654bb3 | ||
|
cd834c79ba | ||
|
65aafacd8e | ||
|
ebd92dcd31 | ||
|
0003d6391c | ||
|
4e52547a59 | ||
|
d3755c92d7 | ||
|
d536cf0947 | ||
|
19a0e3cda7 | ||
|
7fb13b3cbf | ||
|
23d986657a | ||
|
8f1419fff5 | ||
|
b80c22e9c4 | ||
|
f672fe90c1 | ||
|
3d55d3045e | ||
|
7ffc1a5efe | ||
|
36a833053b | ||
|
ad35c9c2d3 | ||
|
1b1465a677 | ||
|
2f6ce68ca7 | ||
|
dee1225fa4 | ||
|
d78d6fba7e | ||
|
80bdc90650 | ||
|
c402d57809 | ||
|
f1836af0b0 | ||
|
eebcc57079 | ||
|
cbc04d73b8 | ||
|
be9eff0fad | ||
|
3f3e47d280 | ||
|
40ca081ff4 | ||
|
c46fd1ff5b | ||
|
55b237dbe8 | ||
|
2b3556b460 | ||
|
d2e0087c4e | ||
|
9a650a4772 | ||
|
f4739f89bf | ||
|
7ade54dfd7 | ||
|
45fde332a0 | ||
|
82cc5c76a4 | ||
|
67a4ba4228 | ||
|
79a3607d0c | ||
|
dffeabbacb | ||
|
9fa7de2036 | ||
|
bacc873896 | ||
|
375d25627d | ||
|
56e2ed2628 | ||
|
ad55da4ef9 | ||
|
272231467a | ||
|
6cb818c7ad | ||
|
c23547c4ca | ||
|
0468b38ff3 | ||
|
ebbc562aab | ||
|
f387bb5e77 | ||
|
c5461ffd9f | ||
|
8c1c92bff6 | ||
|
36be6abfbd | ||
|
f24e93ade1 | ||
|
1a6a518f49 | ||
|
fc7ca12edd | ||
|
bbd36d0610 | ||
|
eebe7c798a | ||
|
76a7bed575 | ||
|
46b480c798 | ||
|
b4a6c36215 | ||
|
121f348379 | ||
|
16fb7967ff | ||
|
88a2ef45ee | ||
|
dd6077eb90 | ||
|
568ca0e773 | ||
|
fa5c9f764a | ||
|
5193fd9d99 | ||
|
a526eee165 | ||
|
848c65fe4f | ||
|
488a13543e | ||
|
3cc0abf6ea | ||
|
35b95c2b00 | ||
|
7630f579e1 | ||
|
8bd2ed1494 | ||
|
f5dba03447 | ||
|
73bcd869dc | ||
|
1dabb9b8c5 | ||
|
5d39daa13c | ||
|
54cf10588d | ||
|
52826ec4c1 | ||
|
ba9ccc12a5 | ||
|
67ea2163f4 | ||
|
1e1cd4554e | ||
|
319df53e87 | ||
|
8e1be83b56 | ||
|
5cfa736ad0 | ||
|
8a282ef267 | ||
|
709055980e | ||
|
576e21f2fd | ||
|
e6bf3b6975 | ||
|
196785ff05 | ||
|
dd9dd76722 | ||
|
aae02a43da | ||
|
ab308bea31 | ||
|
5f3ad4fc9b | ||
|
f031563400 | ||
|
d354d01af7 | ||
|
35b936200f | ||
|
e6c450b346 | ||
|
c813de133b | ||
|
abe61dc903 | ||
|
f624a082ad | ||
|
38703cbf5d | ||
|
930c2cd2eb | ||
|
225c495632 | ||
|
5705ffbd2b | ||
|
6e0f5287ea | ||
|
f63a066b98 | ||
|
6ff6db23bf | ||
|
2af25bc58e | ||
|
2b39c192a6 | ||
|
0873d14614 | ||
|
712523f004 | ||
|
c2634a7ccf | ||
|
e8ae4afd09 | ||
|
96aa4cacae | ||
|
4242fa7f22 | ||
|
abdab18807 | ||
|
12d8ef5a21 | ||
|
6f95a495ab | ||
|
99dad019cc | ||
|
ff2af3dffd | ||
|
294452cd43 | ||
|
820c22775c | ||
|
16f18cbce8 | ||
|
0f10c8824c | ||
|
c5277df361 | ||
|
b83d29764e | ||
|
dd13070260 | ||
|
bd3b6f17e4 | ||
|
1fa861ecb9 | ||
|
2cf207b53e | ||
|
4bd6d6559f | ||
|
4b3fec660a | ||
|
dc160ab570 | ||
|
4c7efcbd02 | ||
|
27c0fffe7c | ||
|
df8f5f4800 | ||
|
71461c6082 | ||
|
61ea56a1bd | ||
|
235c652648 | ||
|
61c00ccae5 | ||
|
084f51c7db | ||
|
18bb52554f | ||
|
b9162ad7bd | ||
|
5300077109 | ||
|
cbc77f1f25 | ||
|
bcee8ad43d | ||
|
336822f672 | ||
|
5543f13051 | ||
|
30eb01ef37 | ||
|
d380b57d28 | ||
|
820a0ddb8a | ||
|
d84ec07ff6 | ||
|
c48d5242ce | ||
|
c057e057f9 | ||
|
fb03134411 | ||
|
732ba55126 | ||
|
49d54df7d0 | ||
|
c89c83f5c1 | ||
|
3e83390fb9 | ||
|
0f9b4b6fd5 | ||
|
bac9c65515 | ||
|
5b9b09a90e | ||
|
43544435fa | ||
|
ac30924cdf | ||
|
675e10d6fb | ||
|
77f438ed85 | ||
|
9dea1502eb | ||
|
e1a71ce7cc | ||
|
53aea17949 | ||
|
1f16ada70c | ||
|
b539134e54 | ||
|
6180dcce45 | ||
|
040f842e6c | ||
|
5cb66f8090 | ||
|
a2b6b142d8 | ||
|
55408b73ca | ||
|
f4b60f0b68 | ||
|
a1af84f29a | ||
|
0e1956bb29 | ||
|
64e8a34281 | ||
|
043929d850 | ||
|
af3cb1c9c3 | ||
|
c6796ac6df | ||
|
6b4911c6a2 | ||
|
ec0e368a7f | ||
|
1275de1b07 | ||
|
746ce7d406 | ||
|
bb4b6901ad | ||
|
a7fdd3c165 | ||
|
1f9832b449 | ||
|
75648e80cf | ||
|
8a7540321d | ||
|
adc7056c9e | ||
|
b1b4a12848 | ||
|
7b77f400a1 | ||
|
4d7455e783 | ||
|
66d66b31dc | ||
|
9c3ce0048a | ||
|
3a3a233994 | ||
|
d5db0c5ba7 | ||
|
dd6c37c13d | ||
|
e4af94d3f9 | ||
|
bf497f4aae | ||
|
6600478675 | ||
|
bbbc36a1e6 | ||
|
361d642660 | ||
|
a72806a0ba | ||
|
a1c53eae1e | ||
|
a4343bdfd9 | ||
|
940e4a7c4d | ||
|
3090d8146f | ||
|
78831a72d5 | ||
|
68f0f24670 | ||
|
6b9c5aa1ac | ||
|
902c83ece3 | ||
|
30650b9c13 | ||
|
5976079fd3 | ||
|
1e3f146707 | ||
|
015b269c21 | ||
|
802544662d | ||
|
41c247b8ff | ||
|
b2d3c92da9 | ||
|
bc295040d0 | ||
|
c441a634a5 | ||
|
c71c3115cc | ||
|
5ae8d1a7a3 | ||
|
0055eeeeb8 | ||
|
5443fd4219 | ||
|
626ae82fee | ||
|
4fd2870720 | ||
|
a9e32ad0a5 | ||
|
165eae9c31 | ||
|
a343b375df | ||
|
28b6ee47e3 | ||
|
ae41be85c8 | ||
|
e7936c8595 | ||
|
5467bc4f24 | ||
|
477fb7dc20 | ||
|
05bfa4b476 | ||
|
630cc496ea | ||
|
c3af5a69da | ||
|
7455fbd2ad | ||
|
ea217de338 | ||
|
1492f6dbc4 | ||
|
e757f10e44 | ||
|
c868265397 | ||
|
e5e0315d34 | ||
|
0224fc5210 | ||
|
b96277e28a | ||
|
b5d8f68b87 | ||
|
0a47b30528 | ||
|
26a40bc174 | ||
|
990bc6a11f | ||
|
91774cf074 | ||
|
9d5ce204aa | ||
|
a9d82331e6 | ||
|
8dcff164fa | ||
|
54b721ebde | ||
|
d19a3fc3b8 | ||
|
950b248220 | ||
|
bc3b6ed601 | ||
|
33bbff2aa5 | ||
|
5c94900026 | ||
|
e02a0a8c88 | ||
|
d8523b0db8 | ||
|
d74dd7a60a | ||
|
c08ed3ce44 | ||
|
19275aa8bb | ||
|
7bbbfb0dee | ||
|
ef7018cca4 | ||
|
f2a2c67152 | ||
|
9719766007 | ||
|
32fb2e8a3e | ||
|
363dee6846 | ||
|
a28d92d049 | ||
|
39294e0147 | ||
|
027ae738a8 | ||
|
ce5e23f209 | ||
|
139a93156b | ||
|
9cf7328452 | ||
|
0bccf29254 | ||
|
ede2e89670 | ||
|
56117751a8 | ||
|
1bce499383 | ||
|
699c073d85 | ||
|
95947a29d5 | ||
|
70f48e6ca3 | ||
|
0a2c88c288 | ||
|
c70d62aeb4 | ||
|
a4a3c63779 | ||
|
a98f6ca354 | ||
|
deb96b372e | ||
|
360d8fe6b1 | ||
|
93102b45e0 | ||
|
fd3bf51f7d | ||
|
79314ab98f | ||
|
38fed8c901 | ||
|
081e9eb45f | ||
|
c0b8666d1f | ||
|
210df9d835 | ||
|
dc775bc5f8 | ||
|
ec47c4f932 | ||
|
25d28e7421 | ||
|
2c74a31afe | ||
|
bae02358a3 | ||
|
f97a59597f | ||
|
6edfcda43a | ||
|
c9c15a727d | ||
|
5324809a91 | ||
|
f69b920dbc | ||
|
a4c851f759 | ||
|
2751e239eb | ||
|
0af3ed548c | ||
|
7cdd4877c3 | ||
|
37acfbd372 | ||
|
e7cd3f0b33 | ||
|
354910faab | ||
|
0f1f277819 | ||
|
3b1b5bde68 | ||
|
82813f48c4 | ||
|
0b9870959b | ||
|
4100b47b37 | ||
|
43c828f8ca | ||
|
b01a1ee818 | ||
|
50211c706a | ||
|
ce42e42ed7 | ||
|
34f572f792 | ||
|
44287ca25e | ||
|
6bed5368e6 | ||
|
4591dcad2c | ||
|
dbcea07600 | ||
|
b76601482f | ||
|
8e9d445248 | ||
|
7d1dde01ba | ||
|
79b57feab6 | ||
|
1a92ae77a0 | ||
|
84b8ea8395 | ||
|
9491948f04 | ||
|
073268bd45 | ||
|
7cfce2fffa | ||
|
a1fda4f218 | ||
|
1a31974789 | ||
|
3d63936a36 | ||
|
2e9060d549 | ||
|
467829af32 | ||
|
9cd28b2ded | ||
|
686831caf5 | ||
|
1efd5e6b7e | ||
|
f90edc1e8b | ||
|
d1ff365767 | ||
|
6132a46768 | ||
|
1f541487e0 | ||
|
1a160e7afe | ||
|
016e10c1b0 | ||
|
6d52c80273 | ||
|
63a32ce483 | ||
|
7170c20c7e | ||
|
7e6667f58f | ||
|
67cb53d587 | ||
|
e622854789 | ||
|
792b9dc45f | ||
|
fe535d25e5 | ||
|
c4cc5e613c | ||
|
0a5a7893a5 | ||
|
f39d31631b | ||
|
8d3ae53bcd | ||
|
d6f57259fa | ||
|
112bfa5897 | ||
|
da105e3bda | ||
|
2e8815ece8 | ||
|
830e30e2fb | ||
|
d60336ba96 | ||
|
44813e56a5 | ||
|
b313d88db1 | ||
|
9e808255f8 | ||
|
fe57c16f6f | ||
|
2d9eb7e25d | ||
|
b7be7c900a | ||
|
e2756f8e9a | ||
|
367557039a | ||
|
31b0feae14 | ||
|
2cc25e65f4 | ||
|
3f9cdea1c1 | ||
|
71601e363e | ||
|
9b9d15438e | ||
|
6121095a30 | ||
|
6773ab35d2 | ||
|
196f2af596 | ||
|
d1ddb39781 | ||
|
882273d508 | ||
|
0aba3abaeb | ||
|
1c7c2f50b0 | ||
|
f345908f77 | ||
|
ab9e7d50a3 | ||
|
834ac04c3b | ||
|
e2ba3d09a5 | ||
|
bac0ca39ba | ||
|
68acf8815c | ||
|
736f2fed42 | ||
|
fdbbbd146a | ||
|
bac165a751 | ||
|
3d488bcf1c | ||
|
39c9fc1199 | ||
|
99dfe9f66a | ||
|
03d6fbec0a | ||
|
5c8d366975 | ||
|
26252c37cd | ||
|
b6080634cc | ||
|
f91468ff9b | ||
|
22cb026e5e | ||
|
be4cdcf170 | ||
|
fd85701a84 | ||
|
1135a1f9d5 | ||
|
d71544d797 | ||
|
08066065e3 | ||
|
a9bd3ca0dc | ||
|
031bbcef40 | ||
|
d6c26af696 | ||
|
12308b3c29 | ||
|
85ae27e372 | ||
|
ce6c90a450 | ||
|
1172937e8a | ||
|
146f2cbd4d | ||
|
8ea018404a | ||
|
5d249c1ae5 | ||
|
09e64c24f2 | ||
|
462e094783 | ||
|
8a09e90f02 | ||
|
bfc3f1f4b2 | ||
|
2b20b9e064 | ||
|
3427e224e3 | ||
|
cf1474fc19 | ||
|
e6068912a4 | ||
|
e59b5bf1af | ||
|
6f315bc235 | ||
|
2491984da3 | ||
|
f1bef11f45 | ||
|
4e46d2bb3b | ||
|
a384d14f92 | ||
|
471c1cc044 | ||
|
1cdbdc548a | ||
|
0f18bd0a6a | ||
|
14f97d0f2a | ||
|
75f28cb0cb | ||
|
9e58503aee | ||
|
18f0ce26fd | ||
|
bc0de5dbc5 | ||
|
4e3325b7f7 | ||
|
3284e941c6 | ||
|
aa40223ff2 | ||
|
04edd69b7a | ||
|
50d268538e | ||
|
3cd5294d8a | ||
|
8a7bc6a0bb | ||
|
894a392640 | ||
|
c3b0347556 | ||
|
2b9e988dd5 | ||
|
b6af7a9cf9 | ||
|
d14adc1e68 | ||
|
5499d5ae84 | ||
|
0a40ce6f9d | ||
|
15927fd097 | ||
|
c17328da87 | ||
|
165aa63d2e | ||
|
fa701228d7 | ||
|
7aef23e97f | ||
|
e6592e6201 | ||
|
38ee88e5ee | ||
|
7d49075079 | ||
|
577d43facf | ||
|
909e6c6249 | ||
|
62596f991e | ||
|
fd7ccc7627 | ||
|
0bcf5d6da6 | ||
|
57513db5c4 | ||
|
70eb639c41 | ||
|
52b1e2a9ff | ||
|
a4b657b040 | ||
|
371e60238a | ||
|
cc306290da | ||
|
eb7816259c | ||
|
735fb20ac6 | ||
|
a429eefbe7 | ||
|
f53815c6ee | ||
|
f2fceac341 | ||
|
968c2ede0d | ||
|
a90a977d68 | ||
|
7ab61f6732 | ||
|
7aae78e8a7 | ||
|
77a1ff8b00 | ||
|
9e6ca94a72 | ||
|
5aa16b7489 | ||
|
d48355c305 | ||
|
519ecddc52 | ||
|
c73e635936 | ||
|
1ed2b21aaa | ||
|
1786dc714d | ||
|
cc1494bfb6 | ||
|
7b1f643977 | ||
|
01b1137284 | ||
|
d99d408fd8 | ||
|
e1d05f0a0f | ||
|
c36d3f5145 | ||
|
ac953f5327 | ||
|
a2b5d4e02b | ||
|
83b139e7ba | ||
|
62494e735f | ||
|
7b3c905a46 | ||
|
ddc4a26457 | ||
|
2457dce862 | ||
|
0c19df09d9 | ||
|
c298cd5714 | ||
|
60d5d9762b | ||
|
22106f6dd3 | ||
|
89f5244007 | ||
|
d34abd6665 | ||
|
fb37e93b04 | ||
|
888c33c890 | ||
|
434bc96c74 | ||
|
9c100c8d0a | ||
|
2eb23cb9f4 | ||
|
9c9c1d9e19 | ||
|
42bdf852da | ||
|
b547141f7a | ||
|
0633053d5d | ||
|
3a71b2e887 | ||
|
cdb5e90515 | ||
|
b5128a6e1c | ||
|
ac7fa82b2f | ||
|
a7fa43fd39 | ||
|
890e57cfab | ||
|
f656e7f6a9 | ||
|
3104f123ca | ||
|
f041cf97a2 | ||
|
8225d3758f | ||
|
202a6b3072 | ||
|
5b88d0bfac | ||
|
8b57eacd1b | ||
|
18e7903b78 | ||
|
5d8302b147 | ||
|
2e8f4b8d21 | ||
|
9c13f76b66 | ||
|
f3e6d39382 | ||
|
4ffd2d6ccd | ||
|
1b2a62623c | ||
|
ad45f801d5 | ||
|
f60d90aeb6 | ||
|
8a519202a8 | ||
|
9c9e200df5 | ||
|
b3b0747328 | ||
|
8f9ff2cfe0 | ||
|
ea94337f96 | ||
|
3e06c99a0a | ||
|
f2807bc782 | ||
|
6464eff516 | ||
|
e1acb774c6 | ||
|
de6d37134c | ||
|
93ec1a9df2 | ||
|
0703fbf527 | ||
|
0e5de67d5f | ||
|
d993d51367 | ||
|
3909ce39ef | ||
|
e8cd0ed7c5 | ||
|
85969bc0bd | ||
|
659f67f04f | ||
|
e2d0f3f845 | ||
|
ed766859d7 | ||
|
5503161fdc | ||
|
e83b09b4eb | ||
|
2e34a10e93 | ||
|
aa838791bf | ||
|
4a6f714153 | ||
|
f736d3a3de | ||
|
471b287f70 | ||
|
1c4865147a | ||
|
b3bc711ed2 | ||
|
ef09e376b1 | ||
|
0a5eb88696 | ||
|
63372cd4aa | ||
|
b9f0e39b1b | ||
|
ebab5f3ec1 | ||
|
6749e4ead9 | ||
|
58c4fd5a0b | ||
|
fccebc816d | ||
|
bf7cc2c04f | ||
|
7f195606ee | ||
|
91e0151674 | ||
|
4aa496b079 | ||
|
4fcd3ba56e | ||
|
77c0de71c4 | ||
|
7c40f797dc | ||
|
189f694710 | ||
|
b02c8b606c | ||
|
24c9e45789 | ||
|
53db7fdc50 | ||
|
70aa4e4247 | ||
|
b26898e6e1 | ||
|
0c2316b638 | ||
|
f42cbac237 | ||
|
b06d9cce37 | ||
|
be92ad13ab | ||
|
3bb447cf8d | ||
|
66c65beea7 | ||
|
be9a6de0ef | ||
|
b3954aefd5 | ||
|
555fe68a01 | ||
|
1ddda558b0 | ||
|
db47cdaa1a | ||
|
7062583ab4 | ||
|
b454a0777f | ||
|
6ba9de491c | ||
|
24b38eb812 | ||
|
14e37ed124 | ||
|
cee82d8659 | ||
|
f5bbf06b60 | ||
|
6b229d7d5f | ||
|
67fff7f4fc | ||
|
6e35f47a3e | ||
|
6514649439 | ||
|
77340e9273 | ||
|
35f73199d4 | ||
|
34c79fdc50 | ||
|
c8e789e12a | ||
|
77173b7057 | ||
|
7fac1d4ae2 | ||
|
52620f147b | ||
|
f3d583b124 | ||
|
fc0094231d | ||
|
aacdeba5d9 | ||
|
761fb103b7 | ||
|
afc17c1168 | ||
|
bfdd611fde | ||
|
ffeb43a38a | ||
|
93f4852ba3 | ||
|
4e460da371 | ||
|
6feb8d8875 | ||
|
57222002b2 | ||
|
4fc8101910 | ||
|
011a984951 | ||
|
105ad61b6f | ||
|
23ea3dcb48 | ||
|
a4b8729e6a | ||
|
687b93b215 | ||
|
8af9abbbb9 | ||
|
25e2dbf031 | ||
|
af56e53315 | ||
|
7a114d640c | ||
|
c5071cc87b | ||
|
0990c279c7 | ||
|
76c32d60f9 | ||
|
ebdac2ddfc | ||
|
caf708b618 | ||
|
40aaf784b9 | ||
|
db1ca2c854 | ||
|
a9f1297022 | ||
|
f8058586f9 | ||
|
ad1352f109 | ||
|
df03740741 | ||
|
a437a3d743 | ||
|
927aa49576 | ||
|
de1ce0b27d | ||
|
a9e1ca63dd | ||
|
4cd251fc48 | ||
|
6d59e2866b | ||
|
da13903228 | ||
|
585f622886 | ||
|
0de69c3899 | ||
|
0238234c52 | ||
|
8b2f500d2a | ||
|
a30563634d | ||
|
e5fde77e56 | ||
|
bfb9c8fddd | ||
|
0402ce9b8e | ||
|
e2f0edd8f6 | ||
|
4f1404e991 | ||
|
9813a9164b | ||
|
b9ba7000bb | ||
|
4c304467ba | ||
|
6a9502ab17 | ||
|
9eda923269 | ||
|
47a6f8fbff | ||
|
c2826000bb | ||
|
7cea5df074 | ||
|
8b9e1f513f | ||
|
fdbf796b6b | ||
|
5ac41bf091 | ||
|
e158021a4d | ||
|
549c499501 | ||
|
838566ea41 | ||
|
6e2f0f695f | ||
|
6f9929b1c0 | ||
|
35d4ceaf37 | ||
|
2e41129c36 | ||
|
1df6a87249 | ||
|
e02d608bce | ||
|
7008aeaf22 | ||
|
ac44e6f2ae | ||
|
1d869c4b36 | ||
|
e7c86c6760 | ||
|
dbf342df3c | ||
|
3cf87dfe8a | ||
|
ea5e373df6 | ||
|
c7256c1c11 | ||
|
7cbced0c12 | ||
|
a84defe86f | ||
|
9dbd953cc2 | ||
|
ea613e6b26 | ||
|
16dd077fb2 | ||
|
4da70bbab1 | ||
|
566c6fa464 | ||
|
b95b85fee4 | ||
|
63ee17701a | ||
|
00e2415b81 | ||
|
6a8a2cf5fb | ||
|
c949ad35cc | ||
|
ae4ffacbda | ||
|
1379b621f7 | ||
|
089b5eb212 | ||
|
7c877edd2d | ||
|
4e22b62192 | ||
|
21c8829783 | ||
|
20791e4d95 | ||
|
f6283b8e91 | ||
|
b936cb366f | ||
|
31e334a332 | ||
|
7a2d3d993c | ||
|
a9acab6b7e | ||
|
a8cbe3a56d | ||
|
dfb9862460 | ||
|
215fde71a3 | ||
|
4bee872c09 | ||
|
e8f557ae5f | ||
|
d7462ae5ad | ||
|
a48a0543c8 | ||
|
ff4aed2227 | ||
|
39f6b6fc6b | ||
|
0b5085f4f0 | ||
|
512cd24e53 | ||
|
83a8d5a561 | ||
|
26fbb921f5 | ||
|
589f5519d7 | ||
|
3592293cca | ||
|
4312dfcf41 | ||
|
94ced5845a | ||
|
a16391ecb0 | ||
|
4ea90cefe8 | ||
|
97eb54738f | ||
|
641acd5709 | ||
|
856f67b4ac | ||
|
71778859a7 | ||
|
47b09cce5d | ||
|
c9fb7eb4d6 | ||
|
3870322888 | ||
|
396f8c96af | ||
|
9bd415d58e | ||
|
8bc6bcf86e | ||
|
54b3135d59 | ||
|
446c3b4cfd | ||
|
adf0dac2c3 | ||
|
1caa78a3e7 | ||
|
e61e1ed425 | ||
|
01d7269904 | ||
|
7c72f79329 | ||
|
bf52b1a2e3 | ||
|
2bdb599fbc | ||
|
3971cc6e88 | ||
|
209b850067 | ||
|
7251fefa89 | ||
|
3c72be23f0 | ||
|
699454ad7f | ||
|
e8fb500819 | ||
|
d6c10fec7b | ||
|
f34be6f5f0 | ||
|
b931724b75 | ||
|
bd6da13a67 | ||
|
f52e8759c5 | ||
|
2090ed6f7c | ||
|
246d5412e0 | ||
|
9b1b6b3ce4 | ||
|
c8c14e31d8 | ||
|
4d0a1db4ac | ||
|
a0f63d40c6 | ||
|
f0537ea0f1 | ||
|
9492231058 | ||
|
c385d5bf0c | ||
|
d377c778a7 | ||
|
17b12a32b0 | ||
|
99321b371a | ||
|
58c9fdc8c5 | ||
|
7fc654eb21 | ||
|
a0a4421278 | ||
|
7a359a958e | ||
|
cd10b439d0 | ||
|
5b76eec1af | ||
|
f55aee0fc1 | ||
|
21957f6e38 | ||
|
fc697bfdb1 | ||
|
818763b332 | ||
|
cc6c05fcf2 | ||
|
f6adb32202 | ||
|
4e1a01959d | ||
|
435978648b | ||
|
c354540a31 | ||
|
8d98b9193b | ||
|
d8e8941c77 | ||
|
d32498f65f | ||
|
29537da370 | ||
|
cbe8542622 | ||
|
fd3bf6c3d2 | ||
|
53ef55410c | ||
|
4263a1a410 | ||
|
37d2bf4d9a | ||
|
6bd7123072 | ||
|
c979ef393b | ||
|
0e4b404102 | ||
|
89de3b6c01 | ||
|
1682e2708d | ||
|
71fb3e84da | ||
|
3bb55dfdde | ||
|
497553d985 | ||
|
d336191ed1 | ||
|
cf7f25fe50 | ||
|
b6b66acfc7 | ||
|
d962999161 | ||
|
ac25275b10 | ||
|
965feab54f | ||
|
f30ac5075e | ||
|
649351c2c4 | ||
|
a465820c1c | ||
|
c191acaa3d | ||
|
65f6e9ae98 | ||
|
495f197327 | ||
|
8d6c1f3e54 | ||
|
5e805b5dfd | ||
|
b7f4536fe1 | ||
|
b6d407a212 | ||
|
e724d871b2 | ||
|
a5d524b7e6 | ||
|
eac63172e5 | ||
|
4477a0171e | ||
|
a033ebf167 | ||
|
66a2bf9906 | ||
|
9bd2b9901f | ||
|
21b564805d | ||
|
87acd119ce | ||
|
1b61b7f5bc | ||
|
4118097e73 | ||
|
ec7fac3c0d | ||
|
cee221e843 | ||
|
a8ae0d2f7c | ||
|
7100e4c209 | ||
|
ccbe1905a1 | ||
|
3488050173 | ||
|
6213afa230 | ||
|
cb6c2f7125 | ||
|
552b1e542f | ||
|
bc72b7e6cd | ||
|
f3ca6f2083 | ||
|
c8ef40ee92 | ||
|
aa17488a5b | ||
|
38a15ef510 | ||
|
b526a70071 | ||
|
d08777ed87 | ||
|
f7645402ff | ||
|
a67fe0663d | ||
|
16c931453d | ||
|
0a0db91018 | ||
|
4e65807dc5 | ||
|
4a3d74e511 | ||
|
5cca94d1b3 | ||
|
5b94631467 | ||
|
6f43287d07 | ||
|
023f9366ef | ||
|
9711380e57 | ||
|
37da7d9961 | ||
|
f53913f144 | ||
|
926f980d87 | ||
|
3b7ae17055 | ||
|
4f76862ff1 | ||
|
2b792e3519 | ||
|
670e5a1eb6 | ||
|
889547de72 | ||
|
366ef1b812 | ||
|
993dc45922 | ||
|
db8cf38b5b | ||
|
f3eb300bb0 | ||
|
02bf57ba71 | ||
|
aaffda3119 | ||
|
4da13b57ec | ||
|
4d8f68e906 | ||
|
64c81d24dc | ||
|
2966432870 | ||
|
01c44e8b2c | ||
|
1983983214 | ||
|
f239934bf9 | ||
|
e0448bded8 | ||
|
030b41c370 | ||
|
3766a71741 | ||
|
65cc35f7f9 | ||
|
df4e5a1072 | ||
|
5c47a0033e | ||
|
4c5f7bc80e | ||
|
85027db9b9 | ||
|
9e47d589e2 | ||
|
bb4035f812 | ||
|
24e46b3604 | ||
|
ce94ced9d3 | ||
|
b5fefa2f9e | ||
|
037b10b4e9 | ||
|
680838947b | ||
|
f13e8a156e | ||
|
bcdbfe95e7 | ||
|
8260adafc2 | ||
|
851318c9b4 | ||
|
39ad232ee5 | ||
|
20654b12ed | ||
|
a353b544cd | ||
|
7d181c2e35 | ||
|
eda593934d | ||
|
a88ca5d4e5 | ||
|
0cce3f7c87 | ||
|
f7c0216ed0 | ||
|
fb60a3e836 | ||
|
4056de5d1c | ||
|
3ca58a42e7 | ||
|
212a2fea41 | ||
|
a3daf79d6f | ||
|
9177e4b7f8 | ||
|
54d81f0b8f | ||
|
7076f20b44 | ||
|
30e10239ca | ||
|
ff27cca4fe | ||
|
4c827ff8a4 | ||
|
8cc4f36690 | ||
|
bb47d52f95 | ||
|
cd2ed6cfe7 | ||
|
2502068015 | ||
|
bd478955e6 | ||
|
2de75c3e9f | ||
|
b4d8d93534 | ||
|
92888b3e57 | ||
|
441ee74ff1 | ||
|
410968304c | ||
|
11e04d4228 | ||
|
62dfd2f996 | ||
|
9455b9a2b0 | ||
|
d2cfd52013 | ||
|
78d338ffce | ||
|
764308667d | ||
|
b6b9a148c6 | ||
|
8ef71dbbdf | ||
|
e5295be30a | ||
|
027ec5a63f | ||
|
4aaaa97ade | ||
|
cc2e3bfeb0 | ||
|
cda320549d | ||
|
a41f3b1351 | ||
|
6dd788f484 | ||
|
a2b018d72b | ||
|
d2ef44f8f5 | ||
|
d8ba7158bc | ||
|
8146386c30 | ||
|
c1a56702f9 | ||
|
d8626d8b47 | ||
|
a5701717e0 | ||
|
4b931c7fd6 | ||
|
9d2367d967 | ||
|
c9e5b13789 | ||
|
0b85bb8053 | ||
|
245ae52d36 | ||
|
7f66e1573e | ||
|
b16437e784 | ||
|
1bad5d1e6f | ||
|
bb7d8b3b5b | ||
|
45f660e358 | ||
|
250419d2c9 | ||
|
d95804fec3 | ||
|
7fa0d338eb | ||
|
06e414aacb | ||
|
573cf3fc8b | ||
|
0364b026cf | ||
|
9fe795ca61 | ||
|
36e4202c14 | ||
|
a9c9b76aeb | ||
|
a5426b58c6 | ||
|
a906cd52df | ||
|
79dad980cf | ||
|
01c26a5c6c | ||
|
cfb62845ec | ||
|
8281be1480 | ||
|
b833de1761 | ||
|
956ac7e70d | ||
|
b2ae3062ab | ||
|
5b720a4fdb | ||
|
1ba20fa20f | ||
|
abde1d04ae | ||
|
db98ecf54e | ||
|
6a8a790312 | ||
|
904903f8d5 | ||
|
c984204944 | ||
|
7a3f809f5c | ||
|
a9099cb4d3 | ||
|
89dc592727 | ||
|
a5a8bf0164 | ||
|
d1d157d755 | ||
|
fef409fe23 | ||
|
16d37090dc | ||
|
e6d52e3455 | ||
|
188fe74c8a | ||
|
36dfa5cb8f | ||
|
2d850b14e2 | ||
|
811078a0fe | ||
|
0dd2dcf5a2 | ||
|
26e6ba7dd7 | ||
|
39a95018b0 | ||
|
1a433954f0 | ||
|
acbe56f6d0 | ||
|
f70414cf5b | ||
|
2e138748c2 | ||
|
c52df91e44 | ||
|
763e6e4c49 | ||
|
28441aded5 | ||
|
70c4a2d5d5 | ||
|
3649145acb | ||
|
4545c9e93e | ||
|
db59a8e745 | ||
|
ef3af3b702 | ||
|
dee67e7061 | ||
|
d6efa529c9 | ||
|
ea951daa44 | ||
|
b03aa8371c | ||
|
e66ef9f695 | ||
|
9f26ba57c1 | ||
|
0263c82614 | ||
|
4e87443a2d | ||
|
fb2c77defc | ||
|
df33d402ca | ||
|
65223eb8fd | ||
|
62daedf95e | ||
|
4132f5e745 | ||
|
8e54caa205 | ||
|
63d47f1f5d | ||
|
4151e73dcc | ||
|
40bfe40368 | ||
|
e33824217b | ||
|
169bfc0128 | ||
|
03658cd480 | ||
|
83fe591f32 | ||
|
bc0b67e630 | ||
|
a94f45a1b3 | ||
|
dbb6c29cff | ||
|
9a0236b9e2 | ||
|
c005465d90 | ||
|
0f7b73016a | ||
|
41f94447d6 | ||
|
76a9b09e25 | ||
|
cfd9206195 | ||
|
551b46cab1 | ||
|
85b9c2f370 | ||
|
bcce056292 | ||
|
1e14401e74 | ||
|
45a29931cb | ||
|
f61645b4d2 | ||
|
f1603e9128 | ||
|
7cd8ab4686 | ||
|
6ca541e876 | ||
|
780aeab4ff | ||
|
e2796948b2 | ||
|
441bf30032 | ||
|
a23a13873f | ||
|
b73c83e2a1 | ||
|
2eadd7d4dd | ||
|
4db9a3b636 | ||
|
75aee155ea | ||
|
21186ced97 | ||
|
c13980e130 | ||
|
9fff8b3fe9 | ||
|
8f9136ecab | ||
|
56f8752b9a | ||
|
d46a31d417 | ||
|
3c65130e38 | ||
|
cca2cd35ad | ||
|
5b4e1fa793 | ||
|
e24aa0aa1a | ||
|
bc06fdf414 | ||
|
b951ca48a5 | ||
|
1a1b7234ea | ||
|
3ad369d249 | ||
|
f98ae169e1 | ||
|
1e3d1e0f0b | ||
|
b19e6d071f | ||
|
57a3169013 | ||
|
38d48afad9 | ||
|
4149053935 | ||
|
15bb8ca60d | ||
|
8c633a5f65 | ||
|
7f7fa7fd90 | ||
|
0aae0d9cf7 | ||
|
6b6a372244 | ||
|
43883ee159 | ||
|
9f832ef482 | ||
|
86fc7ba77c | ||
|
612f696bb7 | ||
|
1e9b16d20b | ||
|
5a407d0e68 | ||
|
90d854c0b4 | ||
|
1b7a32472e | ||
|
f1000d75c0 | ||
|
3cc12a401a | ||
|
3c860ee043 | ||
|
c5dfaf9681 | ||
|
62dee6514a | ||
|
6f1577a659 | ||
|
7cdfca45f4 | ||
|
72c03260d7 | ||
|
e898a28258 | ||
|
e11908cae6 | ||
|
ed456adc80 | ||
|
14eb0d77e9 | ||
|
e6526ae269 | ||
|
8423b5ea4c | ||
|
050b7cdebf | ||
|
c9ac6f5196 | ||
|
cc16e9fdc7 | ||
|
e775f25add | ||
|
eb8fbeba27 | ||
|
3d60eba129 | ||
|
e6e9996060 | ||
|
2ceb19e566 | ||
|
f7a1954fe3 | ||
|
e64ab2a2a7 | ||
|
378a05a96d | ||
|
13edfc1382 | ||
|
d3b3c43e8f | ||
|
5d0410de3e | ||
|
4986f76b0a | ||
|
021778d370 | ||
|
f99572d84f | ||
|
60d8c61da1 | ||
|
08ab22f987 | ||
|
3f03cfa14d | ||
|
da26141015 | ||
|
cee8341545 | ||
|
f4aabad2ae | ||
|
c13dd17505 | ||
|
06761bf157 | ||
|
45d261fb74 | ||
|
1912d36f00 | ||
|
0192c6023f | ||
|
2a18fb9687 | ||
|
a8dc76a8ac | ||
|
13ee94de2c | ||
|
8f39242ba5 | ||
|
10b708b79e | ||
|
478027b5e9 | ||
|
6dec09a376 | ||
|
e595e3b1d4 | ||
|
c020b708a5 | ||
|
440c119b0a | ||
|
0b6c96a515 | ||
|
e496fac87a | ||
|
d623479e32 | ||
|
ab62437ac6 | ||
|
f93fc58f3d | ||
|
8a5764c5e5 | ||
|
04f176b248 | ||
|
8d8dd8ecbd | ||
|
4bce65eb10 | ||
|
cd4a7e3ef4 | ||
|
bfc2c41c12 | ||
|
f15bb1f9af | ||
|
f8fc3b502a | ||
|
857e29a43d | ||
|
e16e8b182f | ||
|
95e180a3e3 | ||
|
1bb441e699 | ||
|
3efb79c855 | ||
|
47e3b4afe2 | ||
|
95e5cf0fdd | ||
|
56c8464774 | ||
|
ad5ef06857 | ||
|
78e11d8c6f | ||
|
ebf8a285b2 | ||
|
2de28295fc | ||
|
eec6b1d818 | ||
|
68d5e7b548 | ||
|
4e57f40096 | ||
|
7548639021 | ||
|
41b1160f01 | ||
|
5ee947a492 | ||
|
d2030debc0 | ||
|
cdaf99121b | ||
|
2e393c6e1f | ||
|
1378f599c2 | ||
|
c1ddc63fda | ||
|
4f889749b3 | ||
|
5f93700e07 | ||
|
2193ea32f6 | ||
|
0b4069c91f | ||
|
06b8fe94ef | ||
|
4f7523a3a2 | ||
|
353233a27e | ||
|
97e242d1b5 | ||
|
109586571a | ||
|
299f1f312c | ||
|
2cd697d146 | ||
|
71d53f2c63 | ||
|
b5ddaedfb3 | ||
|
fb3e5ca4ee | ||
|
53d0825515 | ||
|
28685f9895 | ||
|
3d32b07862 | ||
|
09e58657a1 | ||
|
f822cdf261 | ||
|
c650904794 | ||
|
170e05e1e6 | ||
|
c24a891568 | ||
|
4e8dedb7ad | ||
|
d5aa5f7294 | ||
|
0ac4d23cab | ||
|
01c55ad694 | ||
|
8f628ceb8c | ||
|
16967a231e | ||
|
1f5cf1db58 | ||
|
55b6ab1dc6 | ||
|
bf970b5bf4 | ||
|
adce2fe42d | ||
|
6504e55b76 | ||
|
c8b0ee3289 | ||
|
cd676fda36 | ||
|
d62f710413 | ||
|
2781c337b1 | ||
|
4bc2a502a4 | ||
|
71f02e4f80 | ||
|
845d6f36c1 | ||
|
4dcbf19ea2 | ||
|
ed10aaf68b | ||
|
9fa1654d04 | ||
|
66639dc187 | ||
|
d43ab41c02 | ||
|
2050f7ac7b | ||
|
ea16f64773 | ||
|
7958688ae1 | ||
|
42b40aecf5 | ||
|
526310bdcc | ||
|
a05b544414 | ||
|
c174dc0f5b | ||
|
2be049f5f7 | ||
|
daf25f300d | ||
|
5cf69d18ba | ||
|
860786f809 | ||
|
bc06fc2ce3 | ||
|
0863c5b065 | ||
|
baf473aedf | ||
|
120fb54d49 | ||
|
9b68c100b2 | ||
|
57f58a1546 | ||
|
680b1b8f87 | ||
|
40d06559bb | ||
|
61e420bdf6 | ||
|
a57acf570d | ||
|
90f5779228 | ||
|
f1441cebf6 | ||
|
55f0978c32 | ||
|
4bdc69eb92 | ||
|
f35e4acf88 | ||
|
31cca0c85b | ||
|
0127bf264c | ||
|
78c1fee7f8 | ||
|
0432198e0b | ||
|
c5eb60f07a | ||
|
e7b0f909ff | ||
|
1e3f6d6da2 | ||
|
c8808a854b | ||
|
28bc34b245 | ||
|
a188928e6e | ||
|
d2d4dacf5b | ||
|
f2d8f17018 | ||
|
083ee1f74e | ||
|
6d34a8a7a0 | ||
|
cd0f403bbc | ||
|
aaca30f2ac | ||
|
d0cd92a455 | ||
|
42c42b554a | ||
|
f2c396ee07 | ||
|
0206157558 | ||
|
1b104953ae | ||
|
a3d37dfc71 | ||
|
a949b9c7d2 | ||
|
7519c21a51 | ||
|
7685196e60 | ||
|
42d3d99ae1 | ||
|
1f22931a77 | ||
|
f6cdae50ef | ||
|
5b2bdf2049 | ||
|
343ca17b17 | ||
|
73314207dc | ||
|
23ec57d822 | ||
|
50e09d1232 | ||
|
882691e32f | ||
|
f1eecdeb1c | ||
|
6a93cfe0c9 | ||
|
6c7b28705e | ||
|
26d2fe51d1 | ||
|
3432b2638c | ||
|
7a8cadd393 | ||
|
825dd70bc4 | ||
|
8dc6eb0cda | ||
|
63e2507b15 | ||
|
b74cb56d2b | ||
|
5e16ed7aab | ||
|
adc88b3790 | ||
|
573449e935 | ||
|
1e74f596b2 | ||
|
cace8bed8d | ||
|
2772964f99 | ||
|
b3891d8319 | ||
|
9e7a2134b4 | ||
|
fbe4f2a056 | ||
|
6469b666bd | ||
|
d3bf039f3f | ||
|
33342fb17b | ||
|
f8d0f77307 | ||
|
9cd835b35e | ||
|
d2f4fbb0b2 | ||
|
f1b0011a10 | ||
|
41f185b000 | ||
|
98a443cc61 | ||
|
3a0f7d314a | ||
|
2d3fa1416f | ||
|
c36c65416e | ||
|
81f349bf58 | ||
|
5f86af093e | ||
|
262f20eaa0 | ||
|
a7d8c92ddc | ||
|
9b754a6729 | ||
|
64f23b27d9 | ||
|
0730f502c5 | ||
|
ea6c6d370e | ||
|
4bd9756caf | ||
|
70d4e5105b | ||
|
44da06f384 | ||
|
303e85e3a3 | ||
|
de4780fad2 | ||
|
875aebe14b | ||
|
ed118b079f | ||
|
48de95f5d2 | ||
|
73ccde16e8 | ||
|
4d30033936 | ||
|
2b3821cc88 | ||
|
acaa549404 | ||
|
d661735e15 | ||
|
e197b04e4d | ||
|
76b6ae2cab | ||
|
96160f91db | ||
|
8a49851b05 | ||
|
b25efc415e | ||
|
da352e63c6 | ||
|
7d590428ec | ||
|
4dd52ffe39 | ||
|
773c4419ea | ||
|
97d47b6a91 | ||
|
96647c3c3d | ||
|
8db58ff99e | ||
|
04e5380723 | ||
|
989fa21a21 | ||
|
7584780dbf | ||
|
a613816050 | ||
|
7ab9d4fcfd | ||
|
c298ed0330 | ||
|
abb95de8a9 | ||
|
fe0a011611 | ||
|
ada6766c19 | ||
|
9eeecef612 | ||
|
a49ce434f6 | ||
|
a964269fe9 | ||
|
ae8627e6fc | ||
|
583f840990 | ||
|
0f320c7d88 | ||
|
0ecf6b00d4 | ||
|
b1f6b586d4 | ||
|
b40cd95dcc | ||
|
b228086355 | ||
|
ffaf10c3f3 | ||
|
fea8c9a64f | ||
|
7d637b588f | ||
|
56bdd34c07 | ||
|
413a0e6373 | ||
|
78e89efee8 | ||
|
873b14ac0c | ||
|
699fd6d5d7 | ||
|
96061c5b40 | ||
|
6c110a7272 | ||
|
d2342ae2ef | ||
|
6700e772e5 | ||
|
ac5f296f20 | ||
|
048d0df54a | ||
|
e4892e536c | ||
|
6b5e9f56ed | ||
|
2d3cb812fb | ||
|
d00941c1fd | ||
|
dac837d38d | ||
|
97ad2fa95d | ||
|
e5d2240bbb | ||
|
12f60ee151 | ||
|
3a19051c76 | ||
|
f4007c7ff3 | ||
|
4a9fd9b097 | ||
|
9ebdb61995 | ||
|
4bbbd89ee9 | ||
|
adb92a1999 | ||
|
fc4bed511d | ||
|
c13d6e6070 | ||
|
5e2f8e7613 | ||
|
ff866ef828 | ||
|
da8cde8615 | ||
|
06513252b1 | ||
|
3000906715 | ||
|
ef611229f3 | ||
|
67e7f93d29 | ||
|
d2e0898d64 | ||
|
ce14873e89 | ||
|
b863d9a702 | ||
|
2c2ed53adf | ||
|
0f8495f1d8 | ||
|
15007f76cf | ||
|
5cfd39dfca | ||
|
69aa850d1e | ||
|
570656b073 | ||
|
fdd82cd972 | ||
|
4278458e69 | ||
|
404124eca4 | ||
|
ba5bae0d1c | ||
|
c066f803f1 | ||
|
8ee2c5e293 | ||
|
b2812b7e71 | ||
|
263dc29508 | ||
|
61a9b09403 | ||
|
edb85b014c | ||
|
b0fd7ed933 | ||
|
72d342ce02 | ||
|
098d21117e | ||
|
c90e87d71f | ||
|
b226ab46d6 | ||
|
1afb2cf1c2 | ||
|
e572cbda47 | ||
|
40278ec121 | ||
|
d7c07ecbfd | ||
|
7978112850 | ||
|
7c1a04d7c3 | ||
|
80e3c06fa7 | ||
|
8cb8e6333a | ||
|
2993351536 | ||
|
85af76ab63 | ||
|
ee382b4ad2 | ||
|
464552dd91 | ||
|
914b04c1d2 | ||
|
c670c0645f | ||
|
71dacdce96 | ||
|
31d80e527e | ||
|
bcdd5cb886 | ||
|
e33a38a542 | ||
|
5138ccc1ce | ||
|
8e3c9f553f | ||
|
79f8c5f38e | ||
|
475e64eeec | ||
|
05ea68e2bb | ||
|
c23b6a7e13 | ||
|
4b8fd4e1af | ||
|
fa85bb7c01 | ||
|
4ed9d95394 | ||
|
9f0ac31f0d | ||
|
1387660744 | ||
|
48d2caa73e | ||
|
08d5ad047a | ||
|
8768a9c321 | ||
|
16bd3bd5b9 | ||
|
53942c3d9a | ||
|
a914aed05a | ||
|
d7d57c3d2a | ||
|
31d4abab37 | ||
|
d1dd7df17a | ||
|
22f70b02e2 | ||
|
5f35ff690f | ||
|
06a16e7fba | ||
|
1c86e0127e | ||
|
580aafd8cc | ||
|
2bd17596a0 | ||
|
11cca8015c | ||
|
39c0065fe0 | ||
|
5e09783947 | ||
|
75861a97bc | ||
|
e8406def02 | ||
|
607c860c81 | ||
|
83a3136228 | ||
|
61c6b36bbc | ||
|
cd3c26b815 | ||
|
8253754cc3 | ||
|
9f4a264454 | ||
|
63fb010fc5 | ||
|
387ee5b604 | ||
|
750d98f1e6 | ||
|
0b8356aa92 | ||
|
d1ab9dbc5f | ||
|
e145ee45e2 | ||
|
76d9240395 | ||
|
82a13c7a0e | ||
|
e85852672f | ||
|
698ffdc970 | ||
|
1722cb7bd1 | ||
|
6c7089afd2 | ||
|
343071cc6a | ||
|
9f60bd2fc4 | ||
|
6c0612546e | ||
|
c60c8b9e4f | ||
|
9cc9553c63 | ||
|
b5aad148d6 | ||
|
c8cc3a6e36 | ||
|
5bc4b0072c | ||
|
4d3167231d | ||
|
7b77774a99 | ||
|
1e166490c8 | ||
|
5eef32b558 | ||
|
6c176e0e7b | ||
|
eff0655b1d | ||
|
cfb37a7edf | ||
|
4f50c34824 | ||
|
55d0d8f9ba | ||
|
0542371ead | ||
|
1cad1a89be | ||
|
61f4576808 | ||
|
dfae319686 | ||
|
e0dcecf96d | ||
|
1c5ece6100 | ||
|
fbbcb8e9c8 | ||
|
ad650b5883 | ||
|
208b703e5b | ||
|
12870faf87 | ||
|
ab0beb2ddb | ||
|
f1d4e66582 | ||
|
07c7bc2951 | ||
|
2009716599 | ||
|
5203fa03e8 | ||
|
505574fa98 | ||
|
22a4f5a504 | ||
|
27852272bc | ||
|
d2376946f4 | ||
|
00541fe531 | ||
|
24ec693c2d | ||
|
8a13fc45c7 | ||
|
3aba9ec4e0 | ||
|
fd42609883 | ||
|
9377d831b3 | ||
|
174eaaffbd | ||
|
b4b3c8a3dd | ||
|
a096fcb88c | ||
|
c6d1b4574f | ||
|
7f3d21f867 | ||
|
0f9b247122 | ||
|
225f7ab641 | ||
|
08e6d87a86 | ||
|
539c0da853 | ||
|
e2a995f3e7 | ||
|
3c51267763 | ||
|
88dc4e3351 | ||
|
c19c63530e | ||
|
fd554d9750 | ||
|
774e77b26e | ||
|
b79436fd76 | ||
|
515966cdea | ||
|
512522f259 | ||
|
5a67f86207 | ||
|
123bd2fec0 | ||
|
f1ded40a55 | ||
|
d5df309df4 | ||
|
7a5d64a984 | ||
|
c270adfaa5 | ||
|
db5c3cd36a | ||
|
1bf0c3d23a | ||
|
d23f609dd8 | ||
|
1f72e039d1 | ||
|
5646b49ceb | ||
|
d7bdbcc80a | ||
|
e306849159 | ||
|
9fcdfc1808 | ||
|
e2a2422151 | ||
|
84b386c4a1 | ||
|
6564d8e928 | ||
|
42928ff2d3 | ||
|
c07dd4c35b | ||
|
1c922cbb54 | ||
|
74d6d35bce | ||
|
2f16565bc8 | ||
|
d01a497a09 | ||
|
179e129c09 | ||
|
e7148f3bee | ||
|
ab9af4cea1 | ||
|
3e09f8565d | ||
|
b874b0aa7f | ||
|
2a7a20945a | ||
|
44fdf30170 | ||
|
9424ab26a6 | ||
|
7506867fbe | ||
|
cdea3827d3 | ||
|
e3cc20ed3e | ||
|
1eb033576f | ||
|
d255ad785d | ||
|
0aad780fbe | ||
|
f4a9b33b6d | ||
|
7949793f00 | ||
|
24a2b4680c | ||
|
94d2bad657 | ||
|
1d2eef218b | ||
|
08e05d3fcd | ||
|
978807e4d1 | ||
|
184db9ec8a | ||
|
91115a64e4 | ||
|
f7831543b3 | ||
|
644a9f07f2 | ||
|
2517b2ee8d | ||
|
cabf18db73 | ||
|
4bf5c793f4 | ||
|
19e256d792 | ||
|
01329040ad | ||
|
b9f4f4f805 | ||
|
86291b6205 | ||
|
0889960232 | ||
|
a9543347af | ||
|
9ff0e7ef27 | ||
|
96ce981713 | ||
|
eb394c68f1 | ||
|
27aaf4fc06 | ||
|
b19650251c | ||
|
40bb2f21e0 | ||
|
27939266f1 | ||
|
3c5b11abbb | ||
|
c198a25943 | ||
|
97e4dbe773 | ||
|
a503c6ab3f | ||
|
61c1df7004 | ||
|
c5dcea7de6 | ||
|
2cc10815ed | ||
|
af494287cf | ||
|
4743fc349c | ||
|
3e05217a5f | ||
|
708230bee9 | ||
|
fc3b402d43 | ||
|
56627cd12d | ||
|
4b5f232e59 | ||
|
4577bfdd9e | ||
|
b5edaaa7cc | ||
|
0faae7c3f0 | ||
|
68d59e2921 | ||
|
491c6d0a85 | ||
|
39f1ba7e03 | ||
|
2b7c81f72d | ||
|
3d7338de5a | ||
|
a8260204c3 | ||
|
6a4d4607e4 | ||
|
b6e76b3bce | ||
|
c1b01bdc61 | ||
|
3124c7598e | ||
|
07d50dc8c4 | ||
|
25148b7b05 | ||
|
0bfc5e2f71 | ||
|
37850dfa87 | ||
|
64b6642851 | ||
|
d8d65c7536 | ||
|
1bb58100b0 | ||
|
d3684149ca | ||
|
140ed23e7e | ||
|
a648187de4 | ||
|
89b5e0da05 | ||
|
15961bb34a | ||
|
5c2a51a7cf | ||
|
6a208294be | ||
|
1b973fd8eb | ||
|
fa5db6d777 | ||
|
82fe2cc0ad | ||
|
8335ba0a7e | ||
|
ed3783e08e | ||
|
62901748b3 | ||
|
a5e9da1de3 | ||
|
2d5dfd72de | ||
|
561d41c0d4 | ||
|
2e8f2b8557 | ||
|
c8402639f6 | ||
|
d8857154a1 | ||
|
8ffbea3788 | ||
|
2db303d6f5 | ||
|
ff858b78a3 | ||
|
b2715518f8 | ||
|
999df31b8d | ||
|
95c9d3cf51 | ||
|
cb0b4768ad | ||
|
2fc5e35eb9 | ||
|
611625ca3d | ||
|
5f3b995200 | ||
|
20c8cd161f | ||
|
98d2cd84dc | ||
|
c9a27b09af | ||
|
0709d357ce | ||
|
e9e277e409 | ||
|
ff29045d14 | ||
|
9b61b20f9a | ||
|
be3ea31119 | ||
|
99468a776d | ||
|
fbc3a77d60 | ||
|
a397b8a512 | ||
|
78fc3f2b30 | ||
|
6d060a98f2 | ||
|
23b5b1336d | ||
|
c5910f7987 | ||
|
8a85d7cd31 | ||
|
e33ba08af4 | ||
|
b14d498613 | ||
|
a492a999a5 | ||
|
884d10fbf6 | ||
|
e392051752 | ||
|
e093d4c8a8 | ||
|
82ed7c1723 | ||
|
abd5a81c89 | ||
|
1d03f30e93 | ||
|
96d25c3be1 | ||
|
1f798b0f8e | ||
|
03245bdaf6 | ||
|
e639e3a76a | ||
|
78d2fd3d0e | ||
|
6f912d247f | ||
|
bad922e955 | ||
|
23099d7ba0 | ||
|
e92739086e | ||
|
81cc592c33 | ||
|
3de4811a42 | ||
|
ea5ee20db1 | ||
|
e51e38bc33 | ||
|
6cdfb489ae | ||
|
02921f8851 | ||
|
2c5faf0b65 | ||
|
d007c8c0d4 | ||
|
d41461ad40 | ||
|
877d4851e8 | ||
|
b250709407 | ||
|
941c4360e2 | ||
|
e81b822a5f | ||
|
448f95f817 | ||
|
8a7dbd1e56 | ||
|
aae1aa5271 | ||
|
7e4aed4927 | ||
|
ac3db05853 | ||
|
74646c0487 | ||
|
bf543736b6 | ||
|
5227621a02 | ||
|
0b79ecc193 | ||
|
f936db2ac6 | ||
|
61c811ac70 | ||
|
b0d380ba06 | ||
|
f161d1b2fe | ||
|
34b3d46784 | ||
|
509fc7f098 | ||
|
6aeeae28ef | ||
|
e7c18af94c | ||
|
85645317ae | ||
|
3f492c4f57 | ||
|
457208b101 | ||
|
ce4c062e0d | ||
|
efd7427bbe | ||
|
fc54164405 | ||
|
73b4cecacb | ||
|
b83439b87e | ||
|
5b57bdebdc | ||
|
b36d06e1ea | ||
|
c674d80762 | ||
|
7f314c07b6 | ||
|
27c061e449 | ||
|
3628bbbfa1 | ||
|
1d829aaf6d | ||
|
ffc0f49c12 | ||
|
af89f39e82 | ||
|
ee97c6abee | ||
|
fc0d238194 | ||
|
0a2de94d07 | ||
|
daa6799705 | ||
|
5a42f6b29f | ||
|
371a9a9025 | ||
|
43d25f07de | ||
|
5ee2a21c8a | ||
|
8114d7c63e | ||
|
9ff445dce4 | ||
|
168907fd0b | ||
|
d666dca6a4 | ||
|
c886e69bc6 | ||
|
1b02cc9c94 | ||
|
b3931e646f | ||
|
d0a42e9c81 | ||
|
2e4aa1a595 | ||
|
e3de25dd11 | ||
|
323969e58d | ||
|
e7ea3b3c70 | ||
|
4c0ab3d3e7 | ||
|
3d309c498c | ||
|
a8d053b66d | ||
|
6a6aac9dd3 | ||
|
9a7473eaf3 | ||
|
2bc0af882c |
1453
CONTRIBUTORS
1453
CONTRIBUTORS
File diff suppressed because it is too large
Load Diff
34
Doxyfile.filter
Normal file
34
Doxyfile.filter
Normal file
@ -0,0 +1,34 @@
|
||||
#!/usr/bin/perl
|
||||
|
||||
# Filter source files for use with Doxygen.
|
||||
#
|
||||
# Escapes special characters in comments marked with "///<".
|
||||
#
|
||||
# Usage: Doxyfile.filter filename
|
||||
#
|
||||
# See the main source file 'vdr.c' for copyright information and
|
||||
# how to reach the author.
|
||||
#
|
||||
# $Id: Doxyfile.filter 2.1 2013/02/17 10:54:05 kls Exp $
|
||||
|
||||
$TAG = "///<";
|
||||
|
||||
while (<>) {
|
||||
$t = $_;
|
||||
$p = index($t, $TAG);
|
||||
if ($p >= 0) {
|
||||
$p += length($TAG);
|
||||
print substr($t, 0, $p);
|
||||
$quote = 0;
|
||||
while (1) {
|
||||
$s = substr($t, $p++, 1);
|
||||
last if ($s eq "");
|
||||
$quote ^= 1 if ($s eq '"');
|
||||
print "\\" if (!$quote && $s =~ /[\\\@<>]/);
|
||||
print $s;
|
||||
}
|
||||
}
|
||||
else {
|
||||
print $t;
|
||||
}
|
||||
}
|
238
INSTALL
238
INSTALL
@ -1,7 +1,7 @@
|
||||
Installation of the Video Disk Recorder
|
||||
---------------------------------------
|
||||
|
||||
Version 1.7
|
||||
Version 2.7
|
||||
-----------
|
||||
|
||||
Compiling and running the program:
|
||||
@ -16,14 +16,14 @@ to Make.config and adjust the definition of DVBDIR in that file.
|
||||
|
||||
Refer to http://linuxtv.org for more information about the Linux-DVB driver.
|
||||
|
||||
VDR requires the Linux-DVB driver version dated 2003-08-23 or higher
|
||||
to work properly.
|
||||
VDR requires the Linux-DVB driver version that supports the S2API interface.
|
||||
|
||||
You will also need to install the following libraries, as well as their
|
||||
"devel" packages to get the necessary header files for compiling VDR:
|
||||
|
||||
fontconfig
|
||||
freetype2
|
||||
fribidi (see "BiDi support" below)
|
||||
gettext
|
||||
libcap
|
||||
libjpeg
|
||||
@ -36,6 +36,10 @@ and type 'make'. This should produce an executable file
|
||||
named 'vdr', which can be run after the DVB driver has been
|
||||
installed.
|
||||
|
||||
If you want to build a 32-bit version of VDR on a 64-bit machine, you can
|
||||
use 'make M32=1' to do so. Note that you also need to have a Make.config file
|
||||
(derived from Make.config.template) to make this work.
|
||||
|
||||
IMPORTANT: See "Configuration files" below for information on how
|
||||
========= to set up the configuration files at the proper location!
|
||||
|
||||
@ -43,22 +47,21 @@ By default the 'vdr' program can be controlled via the PC keyboard.
|
||||
If you want to disable control via the keyboard, you can add NO_KBD=1
|
||||
to the 'make' call, or use the '--no-kbd' option at runtime.
|
||||
|
||||
If you have an infrared remote control unit you can define the REMOTE macro
|
||||
to one of the following values in the 'make' call to make the respective control
|
||||
the default:
|
||||
If you have a LIRC compatible infrared remote control receiver you can define
|
||||
the REMOTE macro to one of the following values in the 'make' call to make
|
||||
the respective control the default:
|
||||
|
||||
REMOTE=RCU control via the "Remote Control Unit" receiver
|
||||
(see http://www.cadsoft.de/vdr/remote.htm)
|
||||
REMOTE=LIRC control via the "Linux Infrared Remote Control"
|
||||
(see http://www.lirc.org)
|
||||
|
||||
Alternatively you can use the '--rcu' or '--lirc' options at runtime.
|
||||
These options accept an optional path to the remote control device,
|
||||
the defaults of which can be set via the RCU_DEVICE and LIRC_DEVICE macros,
|
||||
respectively.
|
||||
Alternatively you can use the '--lirc' option at runtime.
|
||||
This option accepts an optional path to the remote control device,
|
||||
the default of which can be set via the LIRC_DEVICE macro.
|
||||
|
||||
If your video directory will be on a VFAT partition, you can call VDR with
|
||||
the command line option '--vfat'.
|
||||
If you want to make your video directory available to other machines that
|
||||
have limitations on directory name lengths and/or allowed characters in
|
||||
directory names, you can call VDR with the command line option '--dirnames'
|
||||
(see man vdr(1) for details).
|
||||
|
||||
When running, the 'vdr' program writes status information into the
|
||||
system log file, which is usually /var/log/messages (or /var/log/user.log,
|
||||
@ -67,19 +70,18 @@ messages (tail -f /var/log/messages) to see if there are any problems.
|
||||
|
||||
The program can be controlled via a network connection to its SVDRP
|
||||
port ("Simple Video Disk Recorder Protocol"). By default, it listens
|
||||
on port 2001 (use the --port=PORT option to change this). For details
|
||||
on port 6419 (use the --port=PORT option to change this). For details
|
||||
about the SVDRP syntax see the source file 'svdrp.c'.
|
||||
|
||||
WARNING: DUE TO THE OPEN SVDRP PORT THIS PROGRAM MAY CONSTITUTE A
|
||||
======= POTENTIAL SECURITY HAZARD! IF YOU ARE NOT RUNNING VDR IN
|
||||
A CONTROLLED ENVIRONMENT, YOU MAY WANT TO DISABLE SVDRP
|
||||
BY USING '--port=0'!
|
||||
|
||||
The file 'svdrphosts.conf' can be used to define which hosts are allowed
|
||||
to access the SVDRP port. By default only localhost (127.0.0.1) is granted
|
||||
access. If you want to give other hosts access to your SVDRP port you need to
|
||||
add their IP numbers to 'svdrphosts.conf'.
|
||||
|
||||
You can disable SVDRP access entirely by either running VDR with '--port=0',
|
||||
or by removing all entries (including 127.0.0.1 for the localhost) from
|
||||
'svdrphosts.conf'.
|
||||
|
||||
If the program shall run as a daemon, use the --daemon option. This
|
||||
will completely detach it from the terminal and will continue as a
|
||||
background process.
|
||||
@ -91,6 +93,33 @@ vdr:123:respawn:/usr/local/bin/vdr --terminal=/dev/tty8 -w 60
|
||||
|
||||
See the man page vdr(1) for complete information about all command line options.
|
||||
|
||||
Output devices
|
||||
--------------
|
||||
|
||||
VDR by itself doesn't produce any audio or video output. In order to watch
|
||||
live tv or recordings, you will need to use a plugin that supports the actual
|
||||
hardware in your system, for instance:
|
||||
|
||||
Plugin: Device:
|
||||
|
||||
dvbsddevice Full-Featured SD DVB cards (Fujitsu-Siemens Design)
|
||||
ftp://ftp.tvdr.de/vdr/Plugins
|
||||
dvbhddevice Full-featured HD DVB cards (Technotrend TT S2-6400)
|
||||
https://bitbucket.org/powARman/dvbhddevice
|
||||
rpihddevice Raspberry Pi
|
||||
https://projects.vdr-developer.org/git/vdr-plugin-rpihddevice.git
|
||||
|
||||
See https://linuxtv.org/vdrwiki/index.php/Output_devices for more.
|
||||
|
||||
Standard compliance
|
||||
-------------------
|
||||
|
||||
Basically VDR works according to the DVB standard, but there are countries/providers
|
||||
that use other standards, which in some details deviate from the DVB standard.
|
||||
This makes it necessary to handle things differently in some areas, depending on
|
||||
which standard is actually used. If this is the case in your area, you may need
|
||||
to adjust the option "DVB/Standard compliance" in the Setup menu accordingly.
|
||||
|
||||
Locale
|
||||
------
|
||||
|
||||
@ -112,18 +141,32 @@ in English.
|
||||
Note that for VDR's internationalized texts to work, the LANG environment
|
||||
variable must be set to a valid locale!
|
||||
|
||||
Workaround for providers not encoding their EPG data correctly
|
||||
--------------------------------------------------------------
|
||||
BiDi support
|
||||
------------
|
||||
|
||||
According to "ETSI EN 300 468" the default character set fo SI data is
|
||||
Some languages are written right-to-left. In order to display such languages
|
||||
correctly, you need to build VDR with BIDI=1. This will link to the "fribidi"
|
||||
library and implement a function that prepares bidirectional texts to be
|
||||
displayed correctly. Since BiDi support adds some runtime overhead by requiring
|
||||
additional memory allocation and copying, this feature is not compiled in
|
||||
by default, so that users that have no need for this don't get any overhead.
|
||||
|
||||
Workaround for providers not encoding their DVB SI table strings correctly
|
||||
--------------------------------------------------------------------------
|
||||
|
||||
According to "ETSI EN 300 468" the default character set for SI data is
|
||||
ISO6937. But unfortunately some broadcasters actually use ISO-8859-9 or
|
||||
other encodings, but fail to correctly announce that.
|
||||
Users who want to set the default character set to something different can
|
||||
do this by setting the environment variable VDR_CHARSET_OVERRIDE to something
|
||||
do this by using the command line option --chartab with something
|
||||
like ISO-8859-9.
|
||||
|
||||
Automatic restart in case of hangups:
|
||||
-------------------------------------
|
||||
Start script with automatic restart in case of hangups:
|
||||
-------------------------------------------------------
|
||||
|
||||
The VDR source directory contains a 'runvdr.template'. Just copy it as 'runvdr'
|
||||
into your /usr/bin or /usr/local/bin directory and adjust it to your particular
|
||||
requirements. (See the comments inside the script for more information.)
|
||||
|
||||
If you run VDR using the 'runvdr' shell script it will use the built-in
|
||||
watchdog timer to restart the program in case something happens that
|
||||
@ -132,9 +175,6 @@ call to the VDR program, be sure to NOT use the '-d' option! Otherwise
|
||||
VDR will go into 'daemon' mode and the initial program call will return
|
||||
immediately! 'runvdr' needs to be started as user 'root'. Use the '-u'
|
||||
option to run the actual 'vdr' program under a different user id.
|
||||
Note that the 'runvdr' script needs to be adjusted to your particular
|
||||
requirements before you can actually use it. See the comments inside
|
||||
the script for more information.
|
||||
|
||||
Setting the system time:
|
||||
------------------------
|
||||
@ -224,19 +264,27 @@ Executing commands before and after a recording:
|
||||
------------------------------------------------
|
||||
|
||||
You can use the '-r' option to define a program or script that gets called
|
||||
before and after a recording is performed, and after an editing process
|
||||
has finished.
|
||||
at various stages of handling recordings.
|
||||
|
||||
The program will be called with two string parameters. The first parameter
|
||||
is one of
|
||||
The program will be called with two or three string parameters.
|
||||
The first parameter is one of
|
||||
|
||||
before if this is *before* a recording starts
|
||||
started if this is after a recording has *started*
|
||||
after if this is *after* a recording has finished
|
||||
editing if this is before *editing* a recording
|
||||
edited if this is after a recording has been *edited*
|
||||
deleted if this is after a recording has been *deleted*
|
||||
copying if this is before *copying* a recording
|
||||
copied if this is after a recording has been *copied*
|
||||
renamed if this is after a recording has been *renamed*
|
||||
moved if this is after a recording has been *moved*
|
||||
(note that a move across file system borders triggers a sequence
|
||||
of "copying", "copied" and "deleted")
|
||||
|
||||
and the second parameter contains the full name of the recording's
|
||||
and the second and third parameter (if present) contain the full name of the recording's
|
||||
directory (which may not yet exists at that moment in the "before" case).
|
||||
In the "edited" case it will be the name of the edited version.
|
||||
See the example below for the exact meaning of these parameters.
|
||||
|
||||
Within this program you can do anything you would like to do before and/or
|
||||
after a recording or after an editing process. However, the program must return
|
||||
@ -252,11 +300,38 @@ case "$1" in
|
||||
before)
|
||||
echo "Before recording $2"
|
||||
;;
|
||||
started)
|
||||
echo "Started recording $2"
|
||||
;;
|
||||
after)
|
||||
echo "After recording $2"
|
||||
;;
|
||||
editing)
|
||||
echo "Editing recording $2"
|
||||
echo "Source recording $3"
|
||||
;;
|
||||
edited)
|
||||
echo "Edited recording $2"
|
||||
echo "Source recording $3"
|
||||
;;
|
||||
deleted)
|
||||
echo "Deleted recording $2"
|
||||
;;
|
||||
copying)
|
||||
echo "Destination recording $2"
|
||||
echo "Source recording $3"
|
||||
;;
|
||||
copied)
|
||||
echo "Destination recording $2"
|
||||
echo "Source recording $3"
|
||||
;;
|
||||
renamed)
|
||||
echo "New name of recording $2"
|
||||
echo "Old name of recording $3"
|
||||
;;
|
||||
moved)
|
||||
echo "New path of recording $2"
|
||||
echo "Old path of recording $3"
|
||||
;;
|
||||
*)
|
||||
echo "ERROR: unknown state: $1"
|
||||
@ -282,7 +357,7 @@ This program must be given to VDR with the '-a' option, as in
|
||||
The video data directory:
|
||||
-------------------------
|
||||
|
||||
All recordings are written into directories below "/video". Please
|
||||
All recordings are written into directories below "/srv/vdr/video". Please
|
||||
make sure this directory exists, and that the user who runs the 'vdr'
|
||||
program has read and write access to that directory.
|
||||
If you prefer a different location for your video files, you can use
|
||||
@ -293,39 +368,22 @@ multiple slashes).
|
||||
Note that the file system need not be 64-bit proof, since the 'vdr'
|
||||
program splits video files into chunks of about 2GB. You should use
|
||||
a disk with several gigabytes of free space. One GB can store roughly
|
||||
half an hour of video data.
|
||||
half an hour of SD video data, or 10 minutes of HD video.
|
||||
Either use one of today's large terabyte disks (preferably with a backup disk
|
||||
in a RAID-1 array), or use something like "mhddfs" to group several disks
|
||||
into one large volume.
|
||||
|
||||
If you have more than one disk and don't want to combine them to form
|
||||
one large logical volume, you can set up several video directories as
|
||||
mount points for these disks. All of these directories must have the
|
||||
same basic name and must end with a numeric part, which starts at 0 for
|
||||
the main directory and has increasing values for the rest of the
|
||||
directories. For example
|
||||
|
||||
/video0
|
||||
/video1
|
||||
/video2
|
||||
|
||||
would be a setup with three directories. You can use more than one
|
||||
numeric digit, and the directories need not be directly under '/':
|
||||
|
||||
/mnt/MyVideos/vdr.00
|
||||
/mnt/MyVideos/vdr.01
|
||||
/mnt/MyVideos/vdr.02
|
||||
...
|
||||
/mnt/MyVideos/vdr.11
|
||||
|
||||
would set up twelve disks (wow, what a machine that would be!).
|
||||
|
||||
To use such a multi directory setup, you need to add the '-v' option
|
||||
with the name of the basic directory when running 'vdr':
|
||||
|
||||
vdr -v /video0
|
||||
|
||||
Note that you should not copy any non-VDR files into the /videoX directories,
|
||||
Note that you should not copy any non-VDR files into the video directory,
|
||||
since this might cause a lot of unnecessary disk access when VDR cleans up those
|
||||
directories and there is a large number of files and/or subdirectories in
|
||||
there.
|
||||
there. If you have a large disk that you want to use for VDR's video data as
|
||||
well as other stuff, you may want to create a subdirectory for VDR, as in
|
||||
|
||||
/mydisk/video
|
||||
|
||||
and put your other stuff into, say,
|
||||
|
||||
/mydisk/otherstuff
|
||||
|
||||
If your video directory is mounted via a Samba share, and you are experiencing
|
||||
problems with replaying in fast forward mode, you can comment out the line
|
||||
@ -339,9 +397,11 @@ Configuration files:
|
||||
|
||||
There are several configuration files that hold information about
|
||||
channels, remote control keys, timers etc. By default these files are
|
||||
assumed to be located in the video directory, but a different directory
|
||||
can be used with the '-c' option. Plugins assume their configuration files
|
||||
in a subdirectory called "plugins" of this directory.
|
||||
spread around the system according to the FHS ("File system Hierarchy Standard").
|
||||
If you prefer to have VDR built to run locally under the VDR source tree,
|
||||
you can copy the file Make.config.template to Make.config and set the parameter
|
||||
LCLBLD=1. If you also want to have all data files under one single directory,
|
||||
set ONEDIR=1 in Make.config.
|
||||
|
||||
For starters just copy all *.conf files from the VDR directory into your
|
||||
video directory.
|
||||
@ -368,6 +428,28 @@ accessed using DiSEqC, you have to go to the "Setup" menu and set the "DiSEqC"
|
||||
parameter to "on". You also need to set up the file 'diseqc.conf' to properly
|
||||
access your DiSEqC equipment (see man vdr(5) for details).
|
||||
|
||||
A special form of DiSEqC is used to connect several receivers to one signal
|
||||
source using only a single cable. This method, known as "Satellite Channel Routing"
|
||||
according to EN50494 (aka "Unicable(TM)", "OLT(TM)", "SatCR", "Single Cable
|
||||
Distribution", "Channel Stacking System" or "Single Cable Interface") or
|
||||
EN50607 (aka "JESS") uses the file "scr.conf" to specify which SCR channels
|
||||
use which user band frequency.
|
||||
|
||||
If DVB-S devices need to be connected to the same satellite cable, but no
|
||||
"Satellite Channel Routing" is available, they can be set to be "bonded" in
|
||||
the Setup/LNB menu. Bonded devices can only be tuned to the same polarization
|
||||
and frequency band, which reduces the number of potentially receivable channels.
|
||||
|
||||
Note that it doesn't make sense to use "Satellite Channel Routing" and
|
||||
"Device Bonding" at the same time with the same devices. If you use either
|
||||
of these methods, it is necessary that your devices are always created in the
|
||||
same sequence when the drivers are loaded. You may need to configure some
|
||||
proper "udev" rules to make sure this happens.
|
||||
If you use "Device Bonding" and you add devices to your setup that don't
|
||||
provide DVB-S and take up a position in which there used to be a bonded DVB-S
|
||||
device, make sure you open, adjust (if necessary) and confirm the Setup/LNB
|
||||
menu to have the device bondings set correctly again.
|
||||
|
||||
Running VDR with DVB-C (cable) or DVB-T (terrestrial):
|
||||
------------------------------------------------------
|
||||
|
||||
@ -402,19 +484,17 @@ for a detailed description).
|
||||
|
||||
The recommended PC key assignments are:
|
||||
|
||||
Up, Down, Left, Right Crsr keys in numeric block
|
||||
Menu 'Home' in numeric block
|
||||
Up, Down, Left, Right Cursor keys
|
||||
Menu 'Home'
|
||||
Ok 'Enter'
|
||||
Back 'End' in numeric block
|
||||
Back 'Backspace'
|
||||
Red, Green, Yellow, Blue 'F1'..'F4'
|
||||
0..9 '0'..'9' in top row
|
||||
Power 'P'
|
||||
Volume+/- '+', '-'
|
||||
Mute 'm'
|
||||
0..9 '0'..'9'
|
||||
Volume+/- 'PgUp', 'PgDn'
|
||||
Mute 'F10'
|
||||
|
||||
If you prefer different key assignments, or if the default doesn't work for
|
||||
your keyboard, simply delete the file 'remote.conf' and restart 'vdr' to get
|
||||
into learning mode.
|
||||
If you want to change your key assignments later, simply delete the file
|
||||
'remote.conf' and restart 'vdr' to get into learning mode.
|
||||
|
||||
Generating source code documentation:
|
||||
-------------------------------------
|
||||
|
571
MANUAL
571
MANUAL
@ -1,7 +1,7 @@
|
||||
Video Disk Recorder User's Manual
|
||||
---------------------------------
|
||||
|
||||
Version 1.6
|
||||
Version 2.7
|
||||
-----------
|
||||
|
||||
* Remote Control Keys
|
||||
@ -24,7 +24,7 @@ Version 1.6
|
||||
Green - Audio New New Ins/Ovr Rewind Skip -60s -
|
||||
Yellow - Pause live Delete Delete Delete Delete Skip +60s -
|
||||
Blue - Stop/Resume Mark Info - Info Stop -
|
||||
0..9 Ch select - Sort(2) Day(3) Numeric inp. Exec cmd(1) Editing -
|
||||
0..9 Ch select - Sort(2) Day(3) Numeric inp. Sort/Exec cmd(1) Editing -
|
||||
|
||||
In a numerical input field (like the response to a CAM enquiry) the keys 0..9
|
||||
are used to enter the data, and the Left key can be used to delete the last
|
||||
@ -39,6 +39,7 @@ Version 1.6
|
||||
|
||||
Info display information on the currently viewed programme or recording,
|
||||
or on the current item in a menu
|
||||
Play/Pause combined key to resume or pause replay, or pause live video
|
||||
Play resume normal replay
|
||||
Pause pause replay or live video
|
||||
Stop stop replay
|
||||
@ -49,8 +50,8 @@ Version 1.6
|
||||
Next Next/previous channel group (in live tv mode)
|
||||
Prev or next/previous editing mark (in replay mode)
|
||||
|
||||
Channel+ channel up
|
||||
Channel- channel down
|
||||
Channel+ channel up (live view), next error (replay)
|
||||
Channel- channel down (live view), previous error (replay)
|
||||
PrevChannel previous channel
|
||||
|
||||
Power shutdown
|
||||
@ -81,7 +82,7 @@ Version 1.6
|
||||
Yellow Info
|
||||
Blue Timers menu
|
||||
|
||||
(1) See "Processing Recordings" below.
|
||||
(1) See "Sort Recordings" and "Processing Recordings" below.
|
||||
(2) In the "Channels" menu the '0' key switches the sort mode through "by number",
|
||||
"by name" and "by provider". Other numeric input positions the cursor to
|
||||
the channel with the number entered so far. If there is no channel with that
|
||||
@ -89,7 +90,7 @@ Version 1.6
|
||||
be treated as part of that number, not as a sort mode toggle. If no numeric
|
||||
key has been pressed for more than one second, the number is reset and '0'
|
||||
functions as sort mode toggle again.
|
||||
(3) In the "Timers" menu, when on the "Day" item, the '0' key toggles between
|
||||
(3) In the "Edit timer" menu, when on the "Day" item, the '0' key toggles between
|
||||
a single shot and a repeating timer. If "Day" indicates a repeating timer,
|
||||
the keys '1'...'7' can be used to toggle the individual days ('1' is Monday).
|
||||
|
||||
@ -263,7 +264,7 @@ Version 1.6
|
||||
|
||||
* Pausing live video
|
||||
|
||||
If you want to pause the live programme you are just watching, simple press
|
||||
If you want to pause the live programme you are just watching, simply press
|
||||
"Menu/Yellow" or "Pause" on your remote control. VDR will start an instant
|
||||
recording of the current channel (just as if you had pressed "Menu/Red" or
|
||||
"Record") and immediately begin replaying that recording. Replay will be
|
||||
@ -275,6 +276,9 @@ Version 1.6
|
||||
in the "Setup/Recording" menu. Recording time will be the same as for
|
||||
any other instant recording, so by default it will record 3 hours (which
|
||||
should be enough for any normal broadcast).
|
||||
Note that the timer that is created for recording the paused live video will
|
||||
always record on the local VDR, even if an "SVDRP default host" has been
|
||||
set for normal timer recordings.
|
||||
|
||||
* Replaying a Recording
|
||||
|
||||
@ -301,6 +305,14 @@ Version 1.6
|
||||
A previously stopped playback session can be resumed by pressing the "Blue"
|
||||
key in the "VDR" menu.
|
||||
|
||||
* Sort Recordings
|
||||
|
||||
Within the "Recordings" menu, pressing the '0' key toggles sorting between
|
||||
"by time" and "by name". The selected sort mode is stored separately for each
|
||||
folder (provided you have write access to that folder).
|
||||
If a folder is newly created by a repeating timer, the sort mode for that
|
||||
folder is initially set to "by time".
|
||||
|
||||
* Processing Recordings
|
||||
|
||||
The configuration file 'reccmds.conf' can be used to define system commands
|
||||
@ -354,18 +366,35 @@ Version 1.6
|
||||
- 0 Toggles an editing mark. If the mark indicator shows a red triangle,
|
||||
the current mark is deleted. Otherwise a new mark is set at the
|
||||
current position.
|
||||
- 4, 6 Move an editing mark back and forward. You need to first jump to
|
||||
an editing mark for this to work.
|
||||
- 1, 3 Move an editing mark back and forward in "adaptive" mode. Pressing
|
||||
either of these keys for the first time moves the mark 120 seconds
|
||||
in the given direction (configurable via "Setup/Replay/Initial
|
||||
duration for adaptive skipping"). Further presses of the same key
|
||||
keep moving the mark by the same value. Once the other key is
|
||||
pressed, the value is divided by 2 (hence the name "adaptive") with
|
||||
every further press of either key. Pressing '1' and '3'
|
||||
alternatingly divides the distance all the way down to a single
|
||||
I-frame. That way a particular place in a recording (for instance
|
||||
the beginning or end of a commercial break) can be found very
|
||||
quickly. If none of these two keys is pressed for a while
|
||||
(configurable via "Setup/Replay/Reset timeout for adaptive
|
||||
skipping") the distance falls back to the initial value.
|
||||
If replay is not in Pause mode, or if there is no mark at the
|
||||
current position, the skip is performed without moving any mark.
|
||||
- 4, 6 Move an editing mark back and forward by one I-frame. You need to
|
||||
first jump to an editing mark for this to work.
|
||||
- 7, 9 Jump back and forward between editing marks. Replay goes into still
|
||||
mode after jumping to a mark.
|
||||
mode after jumping to a mark. If the current position is at the
|
||||
first or last mark, or if there are no marks at all, these keys
|
||||
jump to the very beginning or end, respectively, of the recording.
|
||||
- 8 Positions replay at a point 3 seconds before the current or next
|
||||
"start" mark and starts replay.
|
||||
- 2 Start the actual cutting process.
|
||||
"begin" mark and starts replay.
|
||||
- 2 Starts the actual cutting process.
|
||||
|
||||
Editing marks are represented by black, vertical lines in the progress display.
|
||||
A small black triangle at the top of the mark means that this is a "start"
|
||||
A small black triangle at the top of the mark means that this is a "begin"
|
||||
mark, and a triangle at the bottom means that this is an "end" mark.
|
||||
The cutting process will save all video data between "start" and "end" marks
|
||||
The cutting process will save all video data between "begin" and "end" marks
|
||||
into a new file (the original recording remains untouched). The new file will
|
||||
have the same name as the original recording, preceded with a '%' character
|
||||
(imagine the '%' somehow looking like a pair of scissors ;-). Red bars in the
|
||||
@ -374,7 +403,7 @@ Version 1.6
|
||||
|
||||
The video sequences to be saved by the cutting process are determined by an
|
||||
"even/odd" algorithm. This means that every odd numbered editing mark (i.e.
|
||||
1, 3, 5,...) represents a "start" mark, while every even numbered mark (2, 4,
|
||||
1, 3, 5,...) represents a "begin" mark, while every even numbered mark (2, 4,
|
||||
6,...) is an "end" mark. Inserting or toggling a mark on or off automatically
|
||||
adjusts the sequence to the right side of that mark.
|
||||
|
||||
@ -387,11 +416,13 @@ Version 1.6
|
||||
version of the recording you can use the '8' key to jump to a point just
|
||||
before the next cut and have a look at the resulting sequence.
|
||||
|
||||
Currently editing marks can only be set at I-frames, which typically is
|
||||
every 12th frame. So editing can be done with a resolution of roughly half
|
||||
a second. A "start" mark marks the first frame of a resulting video
|
||||
sequence, and an "end" mark marks the last frame of that sequence.
|
||||
|
||||
Currently editing marks can only be set at I-frames, which typically appear
|
||||
every half of a second to a second. A "begin" mark marks the first frame of
|
||||
a resulting video sequence, and an "end" mark marks the last frame of that
|
||||
sequence. Note that the actual frame indicated by the an "end" mark will
|
||||
not be included in the edited version of the recording. That's because every
|
||||
recording (and every sequence of an edited recording) begins with an I-frame
|
||||
and ends right before the next I-frame.
|
||||
An edited recording (indicated by the '%' character) will never be deleted
|
||||
automatically in case the disk runs full (no matter what "lifetime" it has).
|
||||
|
||||
@ -449,6 +480,8 @@ Version 1.6
|
||||
"forever", and a value of 0 means that this recording can be
|
||||
deleted any time if a recording with a higher priority needs disk
|
||||
space.
|
||||
Pattern: The pattern to use for recordings matching events (only available
|
||||
for pattern timers). See section "Pattern timers" below.
|
||||
File: The name under which a recording created through this timer will
|
||||
be stored on disk (the actual name will also contain the date and
|
||||
time, so it is possible to have a "repeating timer" store all its
|
||||
@ -470,10 +503,197 @@ Version 1.6
|
||||
the name of the recording.
|
||||
First day: The date of the first day when this timer shall start recording
|
||||
(only available for repeating timers).
|
||||
Record on: The name of the remote VDR this timer shall record on (only available
|
||||
if there are any remote VDRs connected to this VDR). If this field
|
||||
is empty, the timer will record on the local VDR.
|
||||
|
||||
A timer can also be programmed by pressing the "Red" key on the "Schedule",
|
||||
"Now", "Next" or "Event" menus.
|
||||
|
||||
The "Red" key in the "Edit timer" menu opens a list of folders, which can be
|
||||
used to define the file name in which the recording will be stored.
|
||||
|
||||
The "Yellow" key in the "Edit timer" menu toggles the timer between "Pattern"
|
||||
and "Regular".
|
||||
|
||||
When editing the "File" field, the "Blue" key in can be used to insert useful
|
||||
macros.
|
||||
|
||||
* Pattern timers
|
||||
|
||||
There are cases where it would make sense to have a more flexible kind of
|
||||
recording timer. For instance, some channels that provide VPS don't always
|
||||
use the exact same VPS time for a series, which is extremely annoying.
|
||||
Or you might want to record all films that have a certain pattern in their
|
||||
title, no matter when they are broadcast. In such cases, "pattern timers"
|
||||
can help.
|
||||
|
||||
In the "Edit timer" menu press the Yellow button to turn a regular timer into
|
||||
a pattern timer. Pressing this button again switches back to regular.
|
||||
|
||||
The following rules apply to pattern timers:
|
||||
|
||||
- Pattern timers can only work for channels that provide EPG data.
|
||||
- When using pattern timers, there should always be at least one free device that
|
||||
can be used to regularly receive the EPG of the pattern timer's channel.
|
||||
- A pattern timer records every matching event on the given channel that overlaps
|
||||
with the given start/stop time. Overlapping events are recorded in full,
|
||||
even if they extend outside the given start/stop interval.
|
||||
- In order to actually record an event, a pattern timer "spawns" a separate timer
|
||||
that does the recording. If there are matching events that would start while
|
||||
the first spawned timer is still recording (due to the start/stop margins), timers
|
||||
for those events are also spawned.
|
||||
- Spawned timers are marked with the flag tfSpawned.
|
||||
- Spawned timers take the Priority, Lifetime and VPS settings from the pattern timer.
|
||||
- The special pattern "*" matches every event. So a timer with
|
||||
a start/stop time of 00:00/23:59 will record every event of that day
|
||||
into separate recordings. Note that when using this pattern there should
|
||||
be no other timers for the same channel, because these might interfere.
|
||||
- Once a timer has been spawned, it is treated like any other regular
|
||||
timer. Any changes made to the corresponding pattern timer thereafter will have
|
||||
no effect on spawned timers. Note that after deleting a spawned timer,
|
||||
the corresponding pattern timer may respawn it.
|
||||
- Recording is done according to the event's begin/end times, either
|
||||
by adding the start/stop margins (for non-VPS timers) or by using the
|
||||
event's running status (for VPS timers).
|
||||
- If the start/stop margins of a spawned timer are reduced because the event
|
||||
before and/or after that timer's event is shorter than the respective margin,
|
||||
the actual recording still uses the full margins.
|
||||
- If the times of the event change, a non-VPS pattern timer automatically adjusts
|
||||
itself to the new times. This also happens if the start/stop margins are changed
|
||||
in the setup.
|
||||
- The recording of a pattern timer is stored under the given file name, just like
|
||||
regular timers do. In addition to the "TITLE" and "EPISODE" macros the file
|
||||
name of a pattern timer can also use "{<}" and "{>}" to reference the part of the
|
||||
event's title before and after the pattern, respectively. For instance,
|
||||
if the event's title is "Abc def ghi" and the pattern is "def ", "{<}"
|
||||
would contain "Abc " and "{>}" would contain "ghi" (note the matching of the
|
||||
blanks). For completeness, "{=}" can be used to reference the matching
|
||||
pattern itself.
|
||||
- In the "Timers" menu pressing the Red button on a pattern timer only toggles the
|
||||
timer between "on" and "off", even if this is a repeating timer.
|
||||
- In the "Timers" menu pattern timers are sorted alphabetically to the end of the
|
||||
list of timers.
|
||||
- A regular timer that is currently recording can't be changed into a pattern timer.
|
||||
- In the "Edit timer" menu the file name and pattern are displayed as
|
||||
separate items. The Yellow button can be used to toggle between a regular
|
||||
timer and a pattern timer. When going from regular to pattern, the Pattern item will
|
||||
be initialized with the base part of the file name.
|
||||
- The characters '^' and '$' can be used at the very beginning and end of
|
||||
the pattern to anchor the pattern to the begin or end of the title.
|
||||
Using both of these will match only titles that consist of exactly the given pattern,
|
||||
with nothing before and nothing after it.
|
||||
- The Pattern field in the "Edit timer" menu allows blanks at the end of the string,
|
||||
which may help to separate the text after the matching pattern.
|
||||
- If the first character of the pattern is '@', an event that matches the
|
||||
rest of the pattern is only recorded if the resulting recording's file
|
||||
name (without any folders) is not contained in the donerecs.data file.
|
||||
This avoids duplicate recordings of the same programme. Timers spawned from
|
||||
such a pattern timer are marked with the flag tfAvoid.
|
||||
- When editing the "File" field of a timer, the Blue button can be pressed to
|
||||
insert one of the macros "TITLE", "EPISODE", "{<}", "{=}" or "{>}",
|
||||
respectively. Pressing the Blue button repeatedly loops through the available
|
||||
macros. The "{...}" macros are only available for pattern timers.
|
||||
- In the "Schedule" and "What's on...?" menus the events that will be recorded
|
||||
by a pattern timer are marked in the same way as regular timers.
|
||||
- The TIMERS column in the LCARS skin doesn't show the basic definitions of
|
||||
pattern timers, it only shows timers actually spawned from pattern timers.
|
||||
|
||||
If the pattern is prepended with '@', the name of the resulting recording (everything
|
||||
after the rightmost '~', or the entire file name, if there is no '~') will be stored
|
||||
in the file donerecs.data, so that multiple recordings of the same programme can be
|
||||
avoided. When using this feature, special care must be taken regarding the recording's
|
||||
file name. For instance, with a combination of
|
||||
|
||||
pattern file name
|
||||
@Columbo Movies~TITLE
|
||||
|
||||
if the event's title is just "Columbo", this pattern timer would only record once,
|
||||
and ignore any future events with that title, even if the episode would be different.
|
||||
So you may want to use the episode name, as in
|
||||
|
||||
pattern file name
|
||||
@Columbo Movies~TITLE - EPISODE
|
||||
|
||||
to make the file name unique. If you have several pattern timers for the same show on
|
||||
different channels, chances are that the broadcasters handle title and episode
|
||||
differently, as for example in
|
||||
|
||||
TITLE EPISODE pattern file name
|
||||
Columbo Blueprint for Murder @^Columbo$ TITLE - EPISODE
|
||||
Columbo - Blueprint for Murder @^Columbo TITLE
|
||||
Columbo: Blueprint for Murder @^Columbo:_ Columbo - {>}
|
||||
|
||||
(note the '_' in the pattern of the third example; this is just used to visualize
|
||||
the blank at the end of the pattern)
|
||||
|
||||
In order to have the same episode result in the same recording file name on all
|
||||
channels, the file name needs to be generated differently for each channel. First
|
||||
you need to decide on a proper combination of title and episode name, preferably
|
||||
one that is already used by one of your channels (let's say the second one).
|
||||
In the first case, title and episode name are correctly put in their respective
|
||||
places, and "TITLE - EPISODE" as file name will do. The second case is our common
|
||||
version, where everything is in the title, so TITLE is just fine. The third case
|
||||
poses a problem, because everything is in the title, but with a different separator.
|
||||
Here the special macro "{>}" can be used in the file name, which contains everything
|
||||
following the matching pattern. There are three macros that can be used here:
|
||||
|
||||
{<} everything before the matching pattern
|
||||
{>} everything after the matching pattern
|
||||
{=} the matching pattern itself (just for completeness)
|
||||
|
||||
As of VDR version 2.5.2, the characters ' ' (blank), ':' and '-' are ignored
|
||||
when checking whether a particular recording has already been made by a pattern
|
||||
timer, making "TITLE - EPISODE" and "TITLE: EPISODE" the same.
|
||||
VDR version 2.6.6 added '/' to this list.
|
||||
|
||||
* Managing folders
|
||||
|
||||
The "Select folder" menu, which can be accessed by pressing the "Red" key in
|
||||
the "Edit timer" menu, offers a list of folders that can be used for storing
|
||||
a recording. In this menu, the "Green" key allows you to define a new folder
|
||||
within the current one; if the "Sub folder" option is set to "yes", this will
|
||||
be a folder that contains other folders (indicated by "..." following the
|
||||
folder name in the list). The "Yellow" key deletes the current folder (note
|
||||
that this will merely delete the folder definition stored in 'folders.conf'
|
||||
and has no effect on existing timers or recordings). The "Blue" key can be
|
||||
used to edit an existing folder definition. The "Red" key opens a folder that
|
||||
contains sub folders, while pressing Ok selects the current folder. Once a
|
||||
folder has been selected, the entire path of the timer's file name will be
|
||||
replaced with the selected folder.
|
||||
|
||||
In the "Recordings" menu the folders of existing recordings can be renamed or
|
||||
moved by pressing the "Blue" key ("Edit") while the cursor is positioned on
|
||||
a folder. This will open a menu in which the folder's name and location (the
|
||||
"parent" folder) can be edited. If such an operation will result in moving
|
||||
more than one recording, you will be asked for confirmation.
|
||||
The name, folder, priority and lifetime of an individual recording can be
|
||||
changed by pressing the "Blue" key ("Info") while the cursor is positioned
|
||||
on a recording, and in the resulting Info menu pressing the "Blue" key again
|
||||
to bring up the "Edit recording" menu.
|
||||
In the "Edit recording" menu the Red button ("Folder") allows you to select one
|
||||
of your predefined folders. The Green button has multiple functions, depending
|
||||
on what is currently going on with the recording. It can either stop or cancel
|
||||
a cut, move or copy operation. If the button reads "Stop..." it means that the
|
||||
respective operation is already happening, while "Cancel..." means that the
|
||||
operation is still pending execution. If no operation is currently happening
|
||||
and the recording has editing marks, the Button will read "Cut" and triggers
|
||||
cutting the recording (same as pressing '2' while replaying the recording).
|
||||
The Yellow button ("Delete marks") allows you to delete all editing marks from
|
||||
the selected recording (if there are any and the recording is not currently
|
||||
being cut). To directly edit the folder or name of the recording, position the
|
||||
cursor to the respective line and press the Right key to start editing (press
|
||||
Ok to confirm the edit, or Back to return to the previous value). If you want
|
||||
to remove the name of the recording and make the folder name the actual
|
||||
recording's name, you can position the cursor to the "Name:" field and press
|
||||
the '0' key. This will take the last element of the recording's folder path
|
||||
and make it the actual name of the recording. You can do this in turn until
|
||||
the recording is moved all the way up to the root of the video directory.
|
||||
Note that, in case you inadvertently pressed the '0' key, you can leave the
|
||||
"Edit recording" menu with the "Back" key and any changes you have made so far
|
||||
will not be applied. Once you are finished with editing the recording
|
||||
properties, press Ok to confirm the changes.
|
||||
|
||||
* Parameters in the "Setup" menu
|
||||
|
||||
Select "Setup" from the "VDR" menu to enter the setup menu. From there you can
|
||||
@ -489,12 +709,13 @@ Version 1.6
|
||||
|
||||
Theme = Default Defines the "theme" to use with the current skin.
|
||||
|
||||
Left = 54 The top and left offset of the OSD.
|
||||
Top = 45 The valid ranges are left=0...672, top=0...567.
|
||||
Left = 8 The left and top offset of the OSD, in percent of the
|
||||
Top = 8 total video display width and height, respectively.
|
||||
The valid range is 0...50%.
|
||||
|
||||
Width = 624 The width and height of the OSD.
|
||||
Height = 486 The valid ranges are width=480...672, height=324...567.
|
||||
The Width must be a multiple of 8.
|
||||
Width = 87 The width and height of the OSD, in percent of the
|
||||
Height = 84 total video display width and height, respectively.
|
||||
The valid range is 50...100%.
|
||||
|
||||
Message time = 1 The time (in seconds) how long an informational
|
||||
message shall be displayed on the OSD. The valid range
|
||||
@ -516,11 +737,12 @@ Version 1.6
|
||||
Fixed font = Courier:Bold
|
||||
The names of the various fonts to use.
|
||||
|
||||
Default font size = 22
|
||||
Small font size = 18
|
||||
Fixed font size = 20
|
||||
The sizes (in pixel) of the various fonts. Valid range is
|
||||
10...64.
|
||||
Default font size = 3.8
|
||||
Small font size = 3.5
|
||||
Fixed font size = 3.1
|
||||
The sizes (in percent of the total video display height)
|
||||
of the various fonts. The valid range is 1...10%, at
|
||||
a resolution of 0.1%.
|
||||
|
||||
Channel info position = bottom
|
||||
The position of the channel info window in the OSD
|
||||
@ -565,6 +787,40 @@ Version 1.6
|
||||
Turns displaying the Recordings menu as a hierarchical
|
||||
directory structure on or off.
|
||||
|
||||
Folders in timer menu = yes
|
||||
Controls whether the full folder path is shown in the
|
||||
"Timers" menu, or just the basic recording name.
|
||||
|
||||
Always sort folders first = yes
|
||||
In the "Recordings" menu folders are always listed before
|
||||
plain recordings. Set this option to "no" if you want folders
|
||||
to be interspersed with recordings when sorted alphabetically.
|
||||
|
||||
Default sort mode for recordings = by time
|
||||
Controls whether recordings are sorted by time or by name.
|
||||
If a particular sort mode has been selected for a folder by
|
||||
pressing '0', the default no longer applies to that folder.
|
||||
|
||||
Sorting direction for recordings = ascending
|
||||
When recordings are sorted "by time", they appear in ascending
|
||||
order (i.e. "oldest" to "newest"). If this parameter is set to
|
||||
"descending", they will be presented "newest" to "oldest.
|
||||
Note that in the latter case, if "Always sort folders first"
|
||||
is "yes", folders will appear in reverse alphabetical order.
|
||||
|
||||
Number keys for characters = yes
|
||||
Controls whether the number keys can be used to enter
|
||||
characters in a text input field. You may want to set this
|
||||
to "no" if you are using an actual keyboard to control VDR.
|
||||
|
||||
Color key 0 = 0 By default, VDR assumes that the sequence of the color
|
||||
Color key 1 = 1 keys on the remote control is red-green-yellow-blue. If
|
||||
Color key 2 = 2 your remote control has these keys in a different sequence,
|
||||
Color key 3 = 3 you can adjust these parameters to reorder the corresponding
|
||||
color buttons in the menus accordingly. Note that this does
|
||||
not change the functionality of the individual keys; it only
|
||||
changes the sequence in which the color buttons are displayed.
|
||||
|
||||
EPG:
|
||||
|
||||
EPG scan timeout = 5 The time (in hours) of user inactivity after which the
|
||||
@ -573,6 +829,16 @@ Version 1.6
|
||||
A value of '0' completely turns off scanning on both single
|
||||
and multiple card systems.
|
||||
|
||||
EPG scan max. channel number = 0
|
||||
The EPG scan will only tune to transponders of channels with
|
||||
numbers below this limit. By default all transponders will
|
||||
be scanned.
|
||||
|
||||
EPG pause after scan = no
|
||||
After a complete scan of all transponders (optionally limited
|
||||
by "EPG scan max. channel number") the EPG scan pauses for
|
||||
"EPG scan timeout" hours if this option is set to "yes".
|
||||
|
||||
EPG bugfix level = 3 Some tv stations transmit weirdly formatted EPG data.
|
||||
VDR attempts to fix these bugs up to the given level:
|
||||
0 = no EPG fixing
|
||||
@ -646,27 +912,33 @@ Version 1.6
|
||||
from the primary DVB interface, so that the viewer will
|
||||
be disturbed as little as possible.
|
||||
|
||||
Standard Compliance = 0
|
||||
Defines the standard compliance mode:
|
||||
0 = DVB
|
||||
1 = ANSI/SCTE
|
||||
2 = NORDIG
|
||||
|
||||
Video format = 4:3 The video format (or aspect ratio) of the tv set in use
|
||||
(4:3 or 16:9).
|
||||
(4:3 or 16:9). Applies only to SD output devices.
|
||||
|
||||
Video display format = letterbox
|
||||
The display format to use for playing wide screen video on
|
||||
a 4:3 tv set ("pan & scan", "letterbox" or "center cut out").
|
||||
This option is only available if "Video format" is set to
|
||||
4:3.
|
||||
4:3. Applies only to SD output devices.
|
||||
|
||||
Use Dolby Digital = yes
|
||||
Turns recording of the Dolby Digital audio channels on
|
||||
or off. This may be useful if you don't have the equipment
|
||||
to replay Dolby Digital audio and want to save disk space.
|
||||
If turned off, Dolby Digital tracks also don't appear in the
|
||||
"Audio" menu.
|
||||
Controls whether Dolby Digital tracks appear in the "Audio"
|
||||
menu. This is useful if you don't have the equipment to
|
||||
replay Dolby Digital audio.
|
||||
|
||||
Update channels = 5 Controls the automatic channel update function. '0' means
|
||||
no update, '1' will only update channel names, '2' will
|
||||
only update PIDs, '3' will update channel names and PIDs,
|
||||
'4' will perform all updates and also add newly found channels,
|
||||
and '5' will also add newly found transponders.
|
||||
Note that adding new transponders only works if the "EPG scan"
|
||||
is active.
|
||||
|
||||
Audio languages = 0 Some tv stations broadcast various audio tracks in different
|
||||
languages. This option allows you to define which language(s)
|
||||
@ -704,12 +976,40 @@ Version 1.6
|
||||
|
||||
LNB:
|
||||
|
||||
Use DiSEqC = no Generally turns DiSEqC support on or off.
|
||||
|
||||
SLOF = 11700 The switching frequency (in MHz) between low and
|
||||
high LOF
|
||||
Low LNB frequency = 9750 The LNB's low and high local oscillator frequencies
|
||||
High LNB frequency = 10600 (in MHz, these have no meaning for DVB-C receivers)
|
||||
|
||||
Use DiSEqC = no Generally turns DiSEqC support on or off.
|
||||
Device n connected to sat cable = own
|
||||
Defines whether DVB-S device n has its own satellite cable,
|
||||
or is "bonded" with another device. All DVB-S devices that
|
||||
are connected to the same sat cable must be set to the same
|
||||
number here.
|
||||
|
||||
Use dish positioner = no
|
||||
By default, the 'P' command code in DiSEqC command sequences
|
||||
is ignored. Set this parameter to 'yes' if you are using a
|
||||
satellite dish positioner.
|
||||
|
||||
Site latitude (degrees) = 0
|
||||
Site longitude (degrees) = 0
|
||||
Set these to the latitude and longitude of your dish's
|
||||
location if you use a satellite dish positioner. Use the
|
||||
"Green" key to switch between north/south and east/west,
|
||||
respectively.
|
||||
|
||||
Max. positioner swing (degrees) = 65
|
||||
Defines the maximum angle by which the positioner can move
|
||||
the dish away from due south (or north) in either direction.
|
||||
The valid range is 0...90.
|
||||
|
||||
Positioner speed (degrees/s) = 1.5
|
||||
Defines the speed at which the positioner moves the dish.
|
||||
The valid range is 0.1...180. This value is used to calculate
|
||||
how long it takes the positioner to reach the target position.
|
||||
|
||||
CAM:
|
||||
|
||||
@ -719,7 +1019,19 @@ Version 1.6
|
||||
if it is in the process of being reset, its current status
|
||||
is displayed. The "Red" key can be pressed to enter the CAM
|
||||
menu, and the "Green" key triggers a reset of the selected
|
||||
slot. The "Ok" key also opens the CAM menu.
|
||||
slot. The "Ok" key also opens the CAM menu. The "Yellow" key
|
||||
assigns the selected CAM to a device and switches it to the
|
||||
current channel. The CAM/device combination remains tuned to
|
||||
the current channel until the smart card in the CAM has been
|
||||
activated and thus starts to descramble, or until a recording
|
||||
needs this device. Pressing the "Yellow" key while a CAM is
|
||||
in activation mode cancels the activation. The activation mode
|
||||
remains in effect even if you switch to a different channel
|
||||
(provided there is more than one device in the system) or
|
||||
watch a recording. To activate your smart card simply switch
|
||||
to the channel you want to watch, open the "Setup/CAM" menu,
|
||||
select the CAM that contains the smart card (in case you
|
||||
have more than one CAM) and press the "Yellow" key.
|
||||
|
||||
Recording:
|
||||
|
||||
@ -728,21 +1040,30 @@ Version 1.6
|
||||
after the official end time it shall stop recording.
|
||||
These margins are added automatically to timers that
|
||||
are created from the EPG data.
|
||||
|
||||
Primary limit = 0 The minimum priority a timer must have to be allowed to
|
||||
use the primary DVB interface, or to force another timer
|
||||
with higher priority to use the primary DVB interface.
|
||||
This is mainly useful for recordings that should take
|
||||
place only when there is nothing else to do, but should
|
||||
never keep the user from viewing stuff on the primary
|
||||
interface. On systems with only one DVB card, timers
|
||||
with a priority below PrimaryLimit will never execute.
|
||||
Note that the actual margins used may be smaller than the
|
||||
given values, if the event before and/or after the event
|
||||
to be recorded is shorter than the respective margin.
|
||||
|
||||
Default priority = 50 The default Priority and Lifetime values used when
|
||||
Default lifetime = 99 creating a new timer event. A Lifetime value of 99
|
||||
means that this recording will never be deleted
|
||||
automatically.
|
||||
|
||||
Record key handling = 2
|
||||
Defines what happens if the Record key on the remote control
|
||||
is pressed during live tv.
|
||||
0 = no instant recording
|
||||
1 = confirm instant recording
|
||||
2 = record instantly
|
||||
The default is 2.
|
||||
|
||||
Pause key handling = 2 Defines what happens if the Pause key on the remote control
|
||||
is pressed during live tv.
|
||||
0 = do not pause live video
|
||||
1 = confirm pause live video
|
||||
2 = pause live video
|
||||
The default is 2.
|
||||
|
||||
Pause priority = 10 The Priority and Lifetime values used when pausing live
|
||||
Pause lifetime = 1 video.
|
||||
|
||||
@ -784,10 +1105,15 @@ Version 1.6
|
||||
Default is 180 minutes (3 hours). The stop time of an
|
||||
instant recording can be modified at any time by editing
|
||||
the respective timer in the "Timers" menu.
|
||||
If this parameter is set to 0 ("present event"), only the
|
||||
currently running event will be recorded, using the stop
|
||||
margin and VPS setting as configured.
|
||||
Note that this parameter is also used when pausing live
|
||||
video!
|
||||
|
||||
Max. video file size = 2000
|
||||
The maximum size of a single recorded video file in MB.
|
||||
The valid range is 100...2000. Default is 2000, but
|
||||
The valid range is 100...1048570. Default is 2000, but
|
||||
you may want to use smaller values if you are planning
|
||||
on archiving a recording to CD.
|
||||
|
||||
@ -795,9 +1121,17 @@ Version 1.6
|
||||
During the actual editing process VDR writes the result
|
||||
into files that may grow up to MaxVideoFileSize. If you
|
||||
prefer to have each marked sequence stored in a separate
|
||||
file (named 001.vdr, 002.vdr, ...) you can set this
|
||||
file (named 00001.ts, 00002.ts, ...) you can set this
|
||||
option to 'yes'.
|
||||
|
||||
Delete timeshift recording = 0
|
||||
Controls whether a timeshift recording is deleted after
|
||||
viewing it.
|
||||
0 = no
|
||||
1 = confirm
|
||||
2 = yes
|
||||
The default is 0.
|
||||
|
||||
Replay:
|
||||
|
||||
Multi speed mode = no Defines the function of the "Left" and "Right" keys in
|
||||
@ -807,11 +1141,88 @@ Version 1.6
|
||||
|
||||
Show replay mode = no Turns displaying the current replay mode on or off.
|
||||
|
||||
Show remaining time = no
|
||||
Defines whether the replay progress display shows the
|
||||
remaining time or the total length of the recording.
|
||||
|
||||
Progress display time (s) = 0
|
||||
Defines how long (in seconds) the progress display is shown
|
||||
when replay of a recording is started. The default value of 0
|
||||
means that it will not be shown.
|
||||
|
||||
Pause replay when setting mark = no
|
||||
Defines whether the player automatically goes into Pause
|
||||
mode when setting an editing mark.
|
||||
|
||||
Pause replay when jumping to a mark = yes
|
||||
By default replay is automatically paused whenever you jump
|
||||
to an editing mark with the '7' or '9' key in order to allow
|
||||
you to easily adjust those marks. If this option is set to
|
||||
'no', the '9' key will not pause if you are in Play mode and
|
||||
the mark you jump to is not within 3 seconds of the end of
|
||||
the recording.
|
||||
|
||||
Skip edited parts = no Defines whether the edited parts of a recording are
|
||||
automatically skipped during replay. This includes jumping
|
||||
to the first mark if replay starts at the beginning of the
|
||||
recording, and stopping at the last mark.
|
||||
|
||||
Pause replay at last mark = no
|
||||
If enabled, replay of a recording will go into Pause mode
|
||||
when it has reached the last "end" mark (if any). Note that
|
||||
the actual position at which the pause occurs may be a couple
|
||||
of frames before the last "end" mark, depending on how much
|
||||
data is buffered by your output device.
|
||||
|
||||
Initial duration for adaptive skipping (s) = 120
|
||||
Defines the number of seconds to jump from the current replay
|
||||
position in either direction, when pressing the '1' or '3'
|
||||
key for the first time after the "Reset timeout for adaptive
|
||||
skipping".
|
||||
The valid range is 10...600.
|
||||
|
||||
Reset timeout for adaptive skipping (s) = 3
|
||||
Defines the number of seconds after which pressing the
|
||||
'1' or '3' key falls back to the "Initial duration for adaptive
|
||||
skipping".
|
||||
The valid range is 0...10. Setting the timeout to 0 disables
|
||||
the adaptive mode and makes '1' and '3' always skip the number
|
||||
of seconds configured as the initial duration.
|
||||
|
||||
Alternate behavior for adaptive skipping = no
|
||||
When skipping in adaptive mode with the '1' and '3' keys, the
|
||||
distance of the skip is halved with every key press after the
|
||||
first change of direction. While this allows for locating a
|
||||
particular position in a recording very fast, once you make
|
||||
one step too many in the current direction you have no chance
|
||||
of ever reaching the desired point any more. You will have to
|
||||
wait for the timeout to occur and start adaptive skipping anew.
|
||||
If this option is set to 'yes', the skip distance will only be
|
||||
halved if the direction actually changes. That way, even if
|
||||
you missed the target point, you can still back up to it.
|
||||
|
||||
Use Prev/Next keys for adaptive skipping = no
|
||||
Normally the Prev/Next keys jump between editing marks (or
|
||||
the beginning/end of the recording). You can set this option
|
||||
to 'yes' if you want to use these keys for adaptive skipping
|
||||
instead.
|
||||
|
||||
Skip distance with Green/Yellow keys (s) = 60
|
||||
Defines the number of seconds to skip in either direction
|
||||
when pressing the "Green" or "Yellow" key, respectively.
|
||||
The valid range is 5...600.
|
||||
|
||||
Skip distance with Green/Yellow keys in repeat (s) = 60
|
||||
Defines the number of seconds to skip in either direction
|
||||
when pressing and holding the "Green" or "Yellow" key,
|
||||
respectively.
|
||||
The valid range is 5...600.
|
||||
|
||||
Resume ID = 0 Defines an additional ID that can be used in a multi user
|
||||
environment, so that every user has his/her own resume
|
||||
files for each recording. The valid range is 0...99, with
|
||||
0 resulting in a file named 'resume.vdr', and any other
|
||||
value resulting in 'resume.n.vdr'.
|
||||
0 resulting in a file named 'resume', and any other
|
||||
value resulting in 'resume.n'.
|
||||
|
||||
Miscellaneous:
|
||||
|
||||
@ -830,6 +1241,23 @@ Version 1.6
|
||||
connection after which the connection is automatically
|
||||
closed. Default is 300, a value of 0 means no timeout.
|
||||
|
||||
SVDRP peering = off Activates automatic connections between VDRs in the same
|
||||
network. If set to "any hosts" this VDR will establish
|
||||
connections with any available hosts. If set to "only
|
||||
default host" this VDR will only connect to the VDR with
|
||||
the name defined in "SVDRP default host". If no default
|
||||
host has been defined, the behavior is the same as with
|
||||
"any hosts". To switch from "off" to "only default host",
|
||||
you may need to select "any hosts" first and confirm the
|
||||
dialog by pressing "Ok" in order to be able to select a
|
||||
default host.
|
||||
|
||||
SVDRP host name The name of this VDR, which is used when connecting VDRs
|
||||
via SVDRP. By default, the machine's host name is used.
|
||||
|
||||
SVDRP default host The name of the VDR to be used by default when creating a
|
||||
new timer.
|
||||
|
||||
Zap timeout = 3 The time (in seconds) until a channel counts as "previous"
|
||||
for switching with '0'
|
||||
|
||||
@ -842,8 +1270,20 @@ Version 1.6
|
||||
key. Note that the total maximum is also limited by
|
||||
the "OSD/Channel info time" parameter.
|
||||
|
||||
Initial channel = 0 The number of the channel that shall be tuned to when
|
||||
VDR starts. Default is 0, which means that it will
|
||||
Remote control repeat delay = 300
|
||||
The earliest time (in milliseconds) after which the repeat
|
||||
function of the remote control kicks in if a key is held
|
||||
pressed down for a while. If the remote control in use
|
||||
has a repeat delay that is longer than that given in this
|
||||
parameter, that longer delay will prevail.
|
||||
Remote control repeat delta = 100
|
||||
The time (in milliseconds) between two subsequent key
|
||||
presses generated by the remote control's repeat function.
|
||||
If the remote control in use has a repeat delta that is
|
||||
longer than that given in this parameter, that longer delta
|
||||
will prevail.
|
||||
Initial channel = The channel ID of the channel that shall be tuned to when
|
||||
VDR starts. Default is empty, which means that it will
|
||||
tune to the channel that was on before VDR was stopped.
|
||||
|
||||
Initial volume = -1 The volume that shall be set when VDR starts. Default
|
||||
@ -851,6 +1291,28 @@ Version 1.6
|
||||
VDR was stopped will be used. The valid range is from
|
||||
0 (silent) to 255 (loudest).
|
||||
|
||||
Volume steps = 51 The number of steps the volume will use when moving from
|
||||
the lowest to the highest value. The valid range is from
|
||||
5 to 255.
|
||||
|
||||
Volume linearize = 0 How to linearize the volume control. The valid range is
|
||||
from -20 to 20. A value of 0 results in no linearization.
|
||||
The higher this value is, the more fine grained the control
|
||||
of the volume is for low sound levels. Lower values do the
|
||||
same for high sound levels. This allows you to adjust the
|
||||
more or less linear volume control of your sound card.
|
||||
|
||||
Channels wrap = no During zapping with the "Up" and "Down" keys (or the
|
||||
"Channel+" and "Channel-" keys) the current channel will
|
||||
wrap around the beginning or end of the channel list if
|
||||
this parameter is set to 'yes'.
|
||||
|
||||
Show channel names with source = off
|
||||
If this option is turned on, channel names will be displayed
|
||||
with the source appended to them, as in "ZDF (S)" (if the
|
||||
option is set to "type), or "ZDF (S19.2E)" (if it is set to
|
||||
"full"), where 'S' stands for "Satellite".
|
||||
|
||||
Emergency exit = yes If, for some reason, a recording fails because the video
|
||||
data stream is broken, or the CAM doesn't decrypt etc.,
|
||||
VDR automatically exits in order to allow the surrounding
|
||||
@ -882,4 +1344,3 @@ Version 1.6
|
||||
DEFINING THESE COMMANDS AND MAKE SURE THEY DON'T HARM YOUR SYSTEM,
|
||||
ESPECIALLY IF YOU ARE RUNNING VDR UNDER A HIGH PRIVILEGED USER ID
|
||||
(LIKE 'root').
|
||||
|
||||
|
@ -6,44 +6,95 @@
|
||||
# See the main source file 'vdr.c' for copyright information and
|
||||
# how to reach the author.
|
||||
#
|
||||
# $Id: Make.config.template 2.1 2009/01/18 10:46:13 kls Exp $
|
||||
# $Id: Make.config.template 5.2 2024/10/11 14:21:04 kls Exp $
|
||||
|
||||
### The C compiler and options:
|
||||
|
||||
CC = gcc
|
||||
CFLAGS = -g -O2 -Wall
|
||||
CFLAGS = -g -O3 -Wall
|
||||
|
||||
CXX = g++
|
||||
CXXFLAGS = -g -O2 -Wall -Woverloaded-virtual -Wno-parentheses
|
||||
CXXFLAGS = -g -O3 -Wall -Werror=overloaded-virtual -Wno-parentheses
|
||||
|
||||
ifdef PLUGIN
|
||||
CFLAGS += -fPIC
|
||||
CXXFLAGS += -fPIC
|
||||
DEFINES += -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE
|
||||
# Use 'make DEBUG=1 ...' to build a debug version of VDR and plugins:
|
||||
ifdef DEBUG
|
||||
CFLAGS += -O0
|
||||
CXXFLAGS += -O0
|
||||
endif
|
||||
|
||||
# Use 'make M32=1 ...' to build a 32-bit version of VDR on a 64-bit machine:
|
||||
ifdef M32
|
||||
CFLAGS += -m32
|
||||
CXXFLAGS += -m32
|
||||
endif
|
||||
|
||||
### The directory environment:
|
||||
|
||||
#DVBDIR = /usr/src/v4l-dvb/linux
|
||||
MANDIR = /usr/local/man
|
||||
BINDIR = /usr/local/bin
|
||||
# Default directories (adjust as necessary or desired):
|
||||
|
||||
LOCDIR = ./locale
|
||||
PLUGINDIR= ./PLUGINS
|
||||
PLUGINLIBDIR= $(PLUGINDIR)/lib
|
||||
VIDEODIR = /video
|
||||
CONFDIR = $(VIDEODIR)
|
||||
#PREFIX = /usr/local
|
||||
#VDRROOT = $(PREFIX)
|
||||
#BINDIR = $(VDRROOT)/bin
|
||||
#INCDIR = $(VDRROOT)/include
|
||||
#LIBDIR = $(VDRROOT)/lib
|
||||
#LOCDIR = $(VDRROOT)/locale
|
||||
#MANDIR = $(VDRROOT)/man
|
||||
#PCDIR = $(VDRROOT)/pkgconfig
|
||||
#RESDIR = $(VDRROOT)/share
|
||||
#DVBDIR = /usr/include
|
||||
|
||||
#VIDEODIR = /srv/vdr/video
|
||||
#CONFDIR = /var/lib/vdr
|
||||
#ARGSDIR = /etc/vdr/conf.d
|
||||
#CACHEDIR = /var/cache/vdr
|
||||
|
||||
# Overrides for preset/legacy configurations:
|
||||
|
||||
# Use 'make LCLBLD=1' to build locale and plugin files under the source directory:
|
||||
ifdef LCLBLD
|
||||
LOCDIR = $(CWD)/locale
|
||||
PLUGINDIR = $(CWD)/PLUGINS
|
||||
ifndef PLUGIN # don't overwrite for plugins with old makefiles
|
||||
LIBDIR = $(PLUGINDIR)/lib
|
||||
endif
|
||||
HDRDIR = $(CWD)/include
|
||||
endif
|
||||
|
||||
# Use 'make ONEDIR=1' to have all data in one single directory:
|
||||
ifdef ONEDIR
|
||||
VIDEODIR = /video
|
||||
CACHEDIR = $(VIDEODIR)
|
||||
CONFDIR = $(VIDEODIR)
|
||||
ARGSDIR = $(VIDEODIR)/conf.d
|
||||
RESDIR = $(VIDEODIR)
|
||||
endif
|
||||
|
||||
# Use this if you want to have a central place where you configure compile time
|
||||
# parameters for plugins:
|
||||
#PLGCFG = $(CONFDIR)/plugins.mk
|
||||
|
||||
### The remote control:
|
||||
LIRC_DEVICE = /var/run/lirc/lircd
|
||||
### Use this for kernel based driver:
|
||||
#LIRC_DEVICE = /dev/lirc0
|
||||
|
||||
LIRC_DEVICE = /dev/lircd
|
||||
RCU_DEVICE = /dev/ttyS1
|
||||
### Define if you always want to use LIRC, independent of the --lirc option:
|
||||
#REMOTE=LIRC
|
||||
|
||||
## Define if you want vdr to not run as root
|
||||
### Define if you don't want keyboard remote control:
|
||||
#NO_KBD = 1
|
||||
|
||||
### Define if you want vdr to not run as root:
|
||||
#VDR_USER = vdr
|
||||
|
||||
### You don't need to touch the following:
|
||||
### Define if you want to compile in 'bidi' support:
|
||||
#BIDI = 1
|
||||
|
||||
ifdef DVBDIR
|
||||
INCLUDES += -I$(DVBDIR)/include
|
||||
### Define if you want 'systemd' notification:
|
||||
#SDNOTIFY = 1
|
||||
|
||||
### Fallback for plugins with old makefiles:
|
||||
ifdef PLUGIN
|
||||
CFLAGS += -fPIC
|
||||
CXXFLAGS += -fPIC
|
||||
endif
|
||||
|
10
Make.global
Normal file
10
Make.global
Normal file
@ -0,0 +1,10 @@
|
||||
#
|
||||
# Strictly necessary Makefile options for the Video Disk Recorder
|
||||
#
|
||||
# See the main source file 'vdr.c' for copyright information and
|
||||
# how to reach the author.
|
||||
#
|
||||
# $Id: Make.global 1.2 2012/12/29 12:03:01 kls Exp $
|
||||
|
||||
# This is just a dummy file for plugins that use old style (version 1.7.33
|
||||
# or earlier) Makefiles.
|
284
Makefile
284
Makefile
@ -4,45 +4,103 @@
|
||||
# See the main source file 'vdr.c' for copyright information and
|
||||
# how to reach the author.
|
||||
#
|
||||
# $Id: Makefile 2.3 2009/01/05 13:04:10 kls Exp $
|
||||
# $Id: Makefile 5.4 2024/10/21 19:01:16 kls Exp $
|
||||
|
||||
.DELETE_ON_ERROR:
|
||||
|
||||
# Compiler flags:
|
||||
|
||||
PKG_CONFIG ?= pkg-config
|
||||
|
||||
CC ?= gcc
|
||||
CFLAGS ?= -g -O2 -Wall
|
||||
CFLAGS ?= -g -O3 -Wall
|
||||
|
||||
CXX ?= g++
|
||||
CXXFLAGS ?= -g -O2 -Wall -Woverloaded-virtual -Wno-parentheses
|
||||
CXXFLAGS ?= -g -O3 -Wall -Werror=overloaded-virtual -Wno-parentheses
|
||||
CXXFLAGS += $(CPPFLAGS)
|
||||
|
||||
LSIDIR = ./libsi
|
||||
DESTDIR ?=
|
||||
PREFIX ?= /usr/local
|
||||
MANDIR = $(PREFIX)/share/man
|
||||
BINDIR = $(PREFIX)/bin
|
||||
LOCDIR = ./locale
|
||||
LIBS = -ljpeg -lpthread -ldl -lcap -lrt -lfreetype -lfontconfig
|
||||
INCLUDES = -I/usr/include/freetype2
|
||||
CDEFINES = -D_GNU_SOURCE
|
||||
CDEFINES += -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE
|
||||
|
||||
PLUGINDIR= ./PLUGINS
|
||||
PLUGINLIBDIR= $(PLUGINDIR)/lib
|
||||
LIBS = -ljpeg -lpthread -ldl -lcap -lrt $(shell $(PKG_CONFIG) --libs freetype2 fontconfig)
|
||||
INCLUDES ?= $(shell $(PKG_CONFIG) --cflags freetype2 fontconfig)
|
||||
|
||||
VIDEODIR = /video
|
||||
CONFDIR = $(VIDEODIR)
|
||||
# Directories:
|
||||
|
||||
DOXYGEN = /usr/bin/doxygen
|
||||
DOXYFILE = Doxyfile
|
||||
CWD ?= $(shell pwd)
|
||||
LSIDIR ?= $(CWD)/libsi
|
||||
PLUGINDIR ?= $(CWD)/PLUGINS
|
||||
|
||||
# Failsafe defaults for "make LCLBLD=1":
|
||||
ifdef LCLBLD
|
||||
DESTDIR ?= $(CWD)
|
||||
LOCDIR ?= $(CWD)/locale
|
||||
HDRDIR ?= $(CWD)/include
|
||||
LIBDIR ?= $(PLUGINDIR)/lib
|
||||
endif
|
||||
|
||||
DESTDIR ?=
|
||||
VIDEODIR ?= /srv/vdr/video
|
||||
CONFDIR ?= /var/lib/vdr
|
||||
ARGSDIR ?= /etc/vdr/conf.d
|
||||
CACHEDIR ?= /var/cache/vdr
|
||||
|
||||
PREFIX ?= /usr/local
|
||||
VDRROOT ?= $(PREFIX)
|
||||
BINDIR ?= $(VDRROOT)/bin
|
||||
INCDIR ?= $(VDRROOT)/include
|
||||
LIBDIR ?= $(VDRROOT)/lib/vdr
|
||||
LOCDIR ?= $(VDRROOT)/share/locale
|
||||
MANDIR ?= $(VDRROOT)/share/man
|
||||
PCDIR ?= $(VDRROOT)/lib/pkgconfig
|
||||
RESDIR ?= $(VDRROOT)/share/vdr
|
||||
|
||||
# Source documentation
|
||||
|
||||
DOXYGEN ?= /usr/bin/doxygen
|
||||
DOXYFILE = Doxyfile
|
||||
|
||||
# User configuration
|
||||
|
||||
-include Make.config
|
||||
|
||||
# Output control
|
||||
|
||||
ifdef VERBOSE
|
||||
Q =
|
||||
else
|
||||
Q = @
|
||||
endif
|
||||
export Q
|
||||
|
||||
# Mandatory compiler flags:
|
||||
|
||||
CFLAGS += -fPIC
|
||||
CXXFLAGS += -fPIC
|
||||
|
||||
# Common include files:
|
||||
|
||||
ifdef DVBDIR
|
||||
CINCLUDES += -I$(DVBDIR)
|
||||
endif
|
||||
|
||||
# Object files
|
||||
|
||||
SILIB = $(LSIDIR)/libsi.a
|
||||
|
||||
OBJS = audio.o channels.o ci.o config.o cutter.o device.o diseqc.o dvbdevice.o dvbci.o dvbosd.o\
|
||||
OBJS = args.o audio.o channels.o ci.o config.o cutter.o device.o diseqc.o dvbdevice.o dvbci.o\
|
||||
dvbplayer.o dvbspu.o dvbsubtitle.o eit.o eitscan.o epg.o filter.o font.o i18n.o interface.o keys.o\
|
||||
lirc.o menu.o menuitems.o nit.o osdbase.o osd.o pat.o player.o plugin.o rcu.o\
|
||||
lirc.o menu.o menuitems.o mtd.o nit.o osdbase.o osd.o pat.o player.o plugin.o positioner.o\
|
||||
receiver.o recorder.o recording.o remote.o remux.o ringbuffer.o sdt.o sections.o shutdown.o\
|
||||
skinclassic.o skins.o skinsttng.o sources.o spu.o status.o svdrp.o themes.o thread.o\
|
||||
skinclassic.o skinlcars.o skins.o skinsttng.o sourceparams.o sources.o spu.o status.o svdrp.o themes.o thread.o\
|
||||
timers.o tools.o transfer.o vdr.o videodir.o
|
||||
|
||||
DEFINES += $(CDEFINES)
|
||||
INCLUDES += $(CINCLUDES)
|
||||
|
||||
ifdef HDRDIR
|
||||
HDRDIR := -I$(HDRDIR)
|
||||
endif
|
||||
ifndef NO_KBD
|
||||
DEFINES += -DREMOTE_KBD
|
||||
endif
|
||||
@ -52,19 +110,26 @@ endif
|
||||
ifdef VDR_USER
|
||||
DEFINES += -DVDR_USER=\"$(VDR_USER)\"
|
||||
endif
|
||||
ifdef BIDI
|
||||
INCLUDES += $(shell $(PKG_CONFIG) --cflags fribidi)
|
||||
DEFINES += -DBIDI
|
||||
LIBS += $(shell $(PKG_CONFIG) --libs fribidi)
|
||||
endif
|
||||
ifdef SDNOTIFY
|
||||
INCLUDES += $(shell $(PKG_CONFIG) --silence-errors --cflags libsystemd-daemon || $(PKG_CONFIG) --cflags libsystemd)
|
||||
DEFINES += -DSDNOTIFY
|
||||
LIBS += $(shell $(PKG_CONFIG) --silence-errors --libs libsystemd-daemon || $(PKG_CONFIG) --libs libsystemd)
|
||||
endif
|
||||
|
||||
LIRC_DEVICE ?= /dev/lircd
|
||||
RCU_DEVICE ?= /dev/ttyS1
|
||||
|
||||
DEFINES += -DLIRC_DEVICE=\"$(LIRC_DEVICE)\" -DRCU_DEVICE=\"$(RCU_DEVICE)\"
|
||||
|
||||
DEFINES += -D_GNU_SOURCE
|
||||
|
||||
DEFINES += -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE
|
||||
LIRC_DEVICE ?= /var/run/lirc/lircd
|
||||
|
||||
DEFINES += -DLIRC_DEVICE=\"$(LIRC_DEVICE)\"
|
||||
DEFINES += -DVIDEODIR=\"$(VIDEODIR)\"
|
||||
DEFINES += -DCONFDIR=\"$(CONFDIR)\"
|
||||
DEFINES += -DPLUGINDIR=\"$(PLUGINLIBDIR)\"
|
||||
DEFINES += -DARGSDIR=\"$(ARGSDIR)\"
|
||||
DEFINES += -DCACHEDIR=\"$(CACHEDIR)\"
|
||||
DEFINES += -DRESDIR=\"$(RESDIR)\"
|
||||
DEFINES += -DPLUGINDIR=\"$(LIBDIR)\"
|
||||
DEFINES += -DLOCDIR=\"$(LOCDIR)\"
|
||||
|
||||
# The version numbers of VDR and the plugin API (taken from VDR's "config.h"):
|
||||
@ -72,12 +137,13 @@ DEFINES += -DLOCDIR=\"$(LOCDIR)\"
|
||||
VDRVERSION = $(shell sed -ne '/define VDRVERSION/s/^.*"\(.*\)".*$$/\1/p' config.h)
|
||||
APIVERSION = $(shell sed -ne '/define APIVERSION/s/^.*"\(.*\)".*$$/\1/p' config.h)
|
||||
|
||||
all: vdr i18n
|
||||
all: vdr i18n plugins
|
||||
|
||||
# Implicit rules:
|
||||
|
||||
%.o: %.c
|
||||
$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) $<
|
||||
@echo CC $@
|
||||
$(Q)$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) -o $@ $<
|
||||
|
||||
# Dependencies:
|
||||
|
||||
@ -91,41 +157,73 @@ $(DEPFILE): Makefile
|
||||
# The main program:
|
||||
|
||||
vdr: $(OBJS) $(SILIB)
|
||||
$(CXX) $(CXXFLAGS) -rdynamic $(OBJS) $(LIBS) $(LIBDIRS) $(SILIB) -o vdr
|
||||
@echo LD $@
|
||||
$(Q)$(CXX) $(CXXFLAGS) -rdynamic $(LDFLAGS) $(OBJS) $(LIBS) $(SILIB) -o vdr
|
||||
|
||||
# The libsi library:
|
||||
|
||||
$(SILIB):
|
||||
$(MAKE) -C $(LSIDIR) all
|
||||
$(SILIB): make-libsi
|
||||
@$(MAKE) --no-print-directory -C $(LSIDIR) CXXFLAGS="$(CXXFLAGS)" DEFINES="$(CDEFINES)" all
|
||||
make-libsi: # empty rule makes sure the sub-make for libsi is always called
|
||||
|
||||
# pkg-config file:
|
||||
|
||||
.PHONY: vdr.pc
|
||||
vdr.pc:
|
||||
@echo "vdrrootdir=$(VDRROOT)" > $@
|
||||
@echo "bindir=$(BINDIR)" >> $@
|
||||
@echo "incdir=$(INCDIR)" >> $@
|
||||
@echo "mandir=$(MANDIR)" >> $@
|
||||
@echo "videodir=$(VIDEODIR)" >> $@
|
||||
@echo "configdir=$(CONFDIR)" >> $@
|
||||
@echo "argsdir=$(ARGSDIR)" >> $@
|
||||
@echo "cachedir=$(CACHEDIR)" >> $@
|
||||
@echo "resdir=$(RESDIR)" >> $@
|
||||
@echo "libdir=$(LIBDIR)" >> $@
|
||||
@echo "locdir=$(LOCDIR)" >> $@
|
||||
@echo "plgcfg=$(PLGCFG)" >> $@
|
||||
@echo "apiversion=$(APIVERSION)" >> $@
|
||||
@echo "cflags=$(CFLAGS) $(CDEFINES) $(CINCLUDES) $(HDRDIR)" >> $@
|
||||
@echo "cxxflags=$(CXXFLAGS) $(CDEFINES) $(CINCLUDES) $(HDRDIR)" >> $@
|
||||
@echo "" >> $@
|
||||
@echo "Name: VDR" >> $@
|
||||
@echo "Description: Video Disk Recorder" >> $@
|
||||
@echo "URL: https://www.tvdr.de/" >> $@
|
||||
@echo "Version: $(VDRVERSION)" >> $@
|
||||
@echo "Cflags: \$${cflags}" >> $@
|
||||
|
||||
# Internationalization (I18N):
|
||||
|
||||
PODIR = po
|
||||
LOCALEDIR = locale
|
||||
I18Npo = $(wildcard $(PODIR)/*.po)
|
||||
I18Nmo = $(addsuffix .mo, $(foreach file, $(I18Npo), $(basename $(file))))
|
||||
I18Nmsgs = $(addprefix $(LOCALEDIR)/, $(addsuffix /LC_MESSAGES/vdr.mo, $(notdir $(foreach file, $(I18Npo), $(basename $(file))))))
|
||||
I18Npot = $(PODIR)/vdr.pot
|
||||
|
||||
%.mo: %.po
|
||||
msgfmt -c -o $@ $<
|
||||
@echo MO $@
|
||||
$(Q)msgfmt -c -o $@ $<
|
||||
|
||||
$(I18Npot): $(wildcard *.c)
|
||||
xgettext -C -cTRANSLATORS --no-wrap --no-location -k -ktr -ktrNOOP --msgid-bugs-address='<vdr-bugs@cadsoft.de>' -o $@ $^
|
||||
@echo GT $@
|
||||
$(Q)xgettext -C -cTRANSLATORS --no-wrap --no-location -k -ktr -ktrNOOP --package-name=VDR --package-version=$(VDRVERSION) --msgid-bugs-address='<vdr-bugs@tvdr.de>' -o $@ `ls $^`
|
||||
|
||||
%.po: $(I18Npot)
|
||||
msgmerge -U --no-wrap --no-location --backup=none -q $@ $<
|
||||
@echo PO $@
|
||||
$(Q)msgmerge -U --no-wrap --no-location --backup=none -q -N $@ $<
|
||||
@touch $@
|
||||
|
||||
$(I18Nmsgs): $(LOCALEDIR)/%/LC_MESSAGES/vdr.mo: $(PODIR)/%.mo
|
||||
@mkdir -p $(dir $@)
|
||||
cp $< $@
|
||||
@echo IN $@
|
||||
$(Q)install -D -m644 $< $@
|
||||
|
||||
.PHONY: i18n
|
||||
i18n: $(I18Nmsgs)
|
||||
|
||||
install-i18n:
|
||||
install-i18n: i18n
|
||||
@mkdir -p $(DESTDIR)$(LOCDIR)
|
||||
@(cd $(LOCALEDIR); cp -r --parents * $(DESTDIR)$(LOCDIR))
|
||||
cp -r $(LOCALEDIR)/* $(DESTDIR)$(LOCDIR)
|
||||
|
||||
# The 'include' directory (for plugins):
|
||||
|
||||
@ -137,43 +235,80 @@ include-dir:
|
||||
|
||||
# Plugins:
|
||||
|
||||
plugins: include-dir
|
||||
plugins: include-dir vdr.pc
|
||||
@failed="";\
|
||||
noapiv="";\
|
||||
oldmakefile="";\
|
||||
for i in `ls $(PLUGINDIR)/src | grep -v '[^a-z0-9]'`; do\
|
||||
echo "Plugin $$i:";\
|
||||
echo; echo "*** Plugin $$i:";\
|
||||
# No APIVERSION: Skip\
|
||||
if ! grep -q "\$$(LIBDIR)/.*\$$(APIVERSION)" "$(PLUGINDIR)/src/$$i/Makefile" ; then\
|
||||
echo "ERROR: plugin $$i doesn't honor APIVERSION - not compiled!";\
|
||||
noapiv="$$noapiv $$i";\
|
||||
continue;\
|
||||
fi;\
|
||||
$(MAKE) -C "$(PLUGINDIR)/src/$$i" all || failed="$$failed $$i";\
|
||||
# Old Makefile\
|
||||
if ! grep -q "PKGCFG" "$(PLUGINDIR)/src/$$i/Makefile" ; then\
|
||||
echo "WARNING: plugin $$i is using an old Makefile!";\
|
||||
oldmakefile="$$oldmakefile $$i";\
|
||||
$(MAKE) --no-print-directory -C "$(PLUGINDIR)/src/$$i" CFLAGS="$(CFLAGS) $(CDEFINES) $(CINCLUDES)" CXXFLAGS="$(CXXFLAGS) $(CDEFINES) $(CINCLUDES)" LIBDIR="$(PLUGINDIR)/lib" VDRDIR="$(CWD)" all || failed="$$failed $$i";\
|
||||
continue;\
|
||||
fi;\
|
||||
# New Makefile\
|
||||
INCLUDES="-I$(CWD)/include"\
|
||||
$(MAKE) --no-print-directory -C "$(PLUGINDIR)/src/$$i" VDRDIR="$(CWD)" || failed="$$failed $$i";\
|
||||
if [ -n "$(LCLBLD)" ] ; then\
|
||||
(cd $(PLUGINDIR)/src/$$i; for l in `find -name "libvdr-*.so" -o -name "lib$$i-*.so"`; do install -D $$l $(LIBDIR)/`basename $$l`.$(APIVERSION); done);\
|
||||
if [ -d $(PLUGINDIR)/src/$$i/po ]; then\
|
||||
for l in `ls $(PLUGINDIR)/src/$$i/po/*.mo`; do\
|
||||
install -D -m644 $$l $(LOCDIR)/`basename $$l | cut -d. -f1`/LC_MESSAGES/vdr-$$i.mo;\
|
||||
done;\
|
||||
fi;\
|
||||
fi;\
|
||||
done;\
|
||||
# Conclusion\
|
||||
if [ -n "$$noapiv" ] ; then echo; echo "*** plugins without APIVERSION:$$noapiv"; echo; fi;\
|
||||
if [ -n "$$oldmakefile" ] ; then\
|
||||
echo; echo "*** plugins with old Makefile:$$oldmakefile"; echo;\
|
||||
echo "**********************************************************************";\
|
||||
echo "*** While this currently still works, it is strongly recommended";\
|
||||
echo "*** that you convert old Makefiles to the new style used since";\
|
||||
echo "*** VDR version 1.7.36. Support for old style Makefiles may be dropped";\
|
||||
echo "*** in future versions of VDR.";\
|
||||
echo "**********************************************************************";\
|
||||
fi;\
|
||||
if [ -n "$$failed" ] ; then echo; echo "*** failed plugins:$$failed"; echo; exit 1; fi
|
||||
|
||||
clean-plugins:
|
||||
@for i in `ls $(PLUGINDIR)/src | grep -v '[^a-z0-9]'`; do $(MAKE) -C "$(PLUGINDIR)/src/$$i" clean; done
|
||||
clean-plugins: vdr.pc
|
||||
@for i in `ls $(PLUGINDIR)/src | grep -v '[^a-z0-9]'`; do $(MAKE) --no-print-directory -C "$(PLUGINDIR)/src/$$i" VDRDIR="$(CWD)" clean; done
|
||||
@-rm -f $(PLUGINDIR)/lib/lib*-*.so.$(APIVERSION)
|
||||
|
||||
# Install the files:
|
||||
# Install the files (note that 'install-pc' must be first!):
|
||||
|
||||
install: install-bin install-conf install-doc install-plugins install-i18n
|
||||
install: install-pc install-bin install-conf install-doc install-plugins install-i18n install-includes
|
||||
|
||||
# VDR binary:
|
||||
|
||||
install-bin: vdr
|
||||
@mkdir -p $(DESTDIR)$(BINDIR)
|
||||
@cp --remove-destination vdr runvdr svdrpsend.pl $(DESTDIR)$(BINDIR)
|
||||
@cp --remove-destination vdr svdrpsend $(DESTDIR)$(BINDIR)
|
||||
|
||||
# Configuration files:
|
||||
|
||||
install-conf:
|
||||
install-dirs:
|
||||
@mkdir -p $(DESTDIR)$(VIDEODIR)
|
||||
@if [ ! -d $(DESTDIR)$(CONFDIR) ]; then\
|
||||
mkdir -p $(DESTDIR)$(CONFDIR);\
|
||||
cp *.conf $(DESTDIR)$(CONFDIR);\
|
||||
fi
|
||||
@mkdir -p $(DESTDIR)$(CONFDIR)
|
||||
@mkdir -p $(DESTDIR)$(ARGSDIR)
|
||||
@mkdir -p $(DESTDIR)$(CACHEDIR)
|
||||
@mkdir -p $(DESTDIR)$(RESDIR)
|
||||
|
||||
install-conf: install-dirs
|
||||
# 'cp -n' may be broken, so let's do it the hard way
|
||||
@for i in *.conf; do\
|
||||
if ! [ -e $(DESTDIR)$(CONFDIR)/$$i ] ; then\
|
||||
cp -p $$i $(DESTDIR)$(CONFDIR);\
|
||||
fi\
|
||||
done
|
||||
|
||||
# Documentation:
|
||||
|
||||
@ -182,28 +317,51 @@ install-doc:
|
||||
@mkdir -p $(DESTDIR)$(MANDIR)/man5
|
||||
@gzip -c vdr.1 > $(DESTDIR)$(MANDIR)/man1/vdr.1.gz
|
||||
@gzip -c vdr.5 > $(DESTDIR)$(MANDIR)/man5/vdr.5.gz
|
||||
@gzip -c svdrpsend.1 > $(DESTDIR)$(MANDIR)/man1/svdrpsend.1.gz
|
||||
|
||||
# Plugins:
|
||||
|
||||
install-plugins: plugins
|
||||
@mkdir -p $(DESTDIR)$(PLUGINLIBDIR)
|
||||
@cp --remove-destination $(PLUGINDIR)/lib/lib*-*.so.$(APIVERSION) $(DESTDIR)$(PLUGINLIBDIR)
|
||||
@-for i in `ls $(PLUGINDIR)/src | grep -v '[^a-z0-9]'`; do\
|
||||
echo; echo "*** Plugin $$i:";\
|
||||
$(MAKE) --no-print-directory -C "$(PLUGINDIR)/src/$$i" VDRDIR=$(CWD) DESTDIR=$(DESTDIR) install;\
|
||||
done
|
||||
@if [ -d $(PLUGINDIR)/lib ] ; then\
|
||||
for i in `find $(PLUGINDIR)/lib -name 'lib*-*.so.$(APIVERSION)'`; do\
|
||||
install -D $$i $(DESTDIR)$(LIBDIR);\
|
||||
done;\
|
||||
fi
|
||||
|
||||
# Includes:
|
||||
|
||||
install-includes: include-dir
|
||||
@mkdir -p $(DESTDIR)$(INCDIR)
|
||||
@cp -pLR include/vdr include/libsi $(DESTDIR)$(INCDIR)
|
||||
|
||||
# pkg-config file:
|
||||
|
||||
install-pc: vdr.pc
|
||||
if [ -n "$(PCDIR)" ] ; then\
|
||||
mkdir -p $(DESTDIR)$(PCDIR) ;\
|
||||
cp vdr.pc $(DESTDIR)$(PCDIR) ;\
|
||||
fi
|
||||
|
||||
# Source documentation:
|
||||
|
||||
srcdoc:
|
||||
@cp $(DOXYFILE) $(DOXYFILE).tmp
|
||||
@cat $(DOXYFILE) > $(DOXYFILE).tmp
|
||||
@echo PROJECT_NUMBER = $(VDRVERSION) >> $(DOXYFILE).tmp
|
||||
@chmod +x $(DOXYFILE).filter
|
||||
$(DOXYGEN) $(DOXYFILE).tmp
|
||||
@rm $(DOXYFILE).tmp
|
||||
|
||||
# Housekeeping:
|
||||
|
||||
clean:
|
||||
$(MAKE) -C $(LSIDIR) clean
|
||||
-rm -f $(OBJS) $(DEPFILE) vdr core* *~
|
||||
-rm -rf $(LOCALEDIR) $(PODIR)/*.mo $(PODIR)/*.pot
|
||||
-rm -rf include
|
||||
-rm -rf srcdoc
|
||||
@$(MAKE) --no-print-directory -C $(LSIDIR) clean
|
||||
@-rm -f $(OBJS) $(DEPFILE) vdr vdr.pc core* *~
|
||||
@-rm -rf $(LOCALEDIR) $(PODIR)/*~ $(PODIR)/*.mo $(PODIR)/*.pot
|
||||
@-rm -rf include
|
||||
@-rm -rf srcdoc
|
||||
CLEAN: clean
|
||||
|
||||
distclean: clean-plugins clean
|
||||
|
402
PLUGINS.html
402
PLUGINS.html
@ -21,6 +21,9 @@ html, body {
|
||||
.modified {
|
||||
background-color: #FFDDDD;
|
||||
}
|
||||
modified {
|
||||
background-color: #FFDDDD;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
@ -28,15 +31,12 @@ html, body {
|
||||
<div class="center">
|
||||
<h1>The VDR Plugin System</h1>
|
||||
|
||||
<b>Version 1.7</b>
|
||||
<b>Version 2.7</b>
|
||||
<p>
|
||||
Copyright © 2009 Klaus Schmidinger<br>
|
||||
<a href="mailto:kls@cadsoft.de">kls@cadsoft.de</a><br>
|
||||
<a href="http://www.cadsoft.de/vdr">www.cadsoft.de/vdr</a>
|
||||
Copyright © 2021 Klaus Schmidinger<br>
|
||||
<a href="mailto:vdr@tvdr.de">vdr@tvdr.de</a><br>
|
||||
<a href="https://www.tvdr.de">www.tvdr.de</a>
|
||||
</div>
|
||||
<div class="modified">
|
||||
Important modifications introduced since version 1.6 are marked like this.
|
||||
</div modified>
|
||||
<p>
|
||||
VDR provides an easy to use plugin interface that allows additional functionality
|
||||
to be added to the program by implementing a dynamically loadable library file.
|
||||
@ -74,15 +74,15 @@ structures and allows it to hook itself into specific areas to perform special a
|
||||
<li><a href="#Main menu entry">Main menu entry</a>
|
||||
<li><a href="#User interaction">User interaction</a>
|
||||
<li><a href="#Housekeeping">Housekeeping</a>
|
||||
<li><a href="#Main thread hook">Main thread hook</a>
|
||||
<li><a href="#Activity">Activity</a>
|
||||
<li><a href="#Wakeup">Wakeup</a>
|
||||
<li><a href="#Setup parameters">Setup parameters</a>
|
||||
<li><a href="#The Setup menu">The Setup menu</a>
|
||||
<li><a href="#Configuration files">Configuration files</a>
|
||||
<li><a href="#Additional files">Additional files</a>
|
||||
<li><a href="#Internationalization">Internationalization</a>
|
||||
<li><a href="#Custom services">Custom services</a>
|
||||
<li><a href="#SVDRP commands">SVDRP commands</a>
|
||||
<li><a href="#Locking">Locking</a>
|
||||
<li><a href="#Loading plugins into VDR">Loading plugins into VDR</a>
|
||||
<li><a href="#Building the distribution package">Building the distribution package</a>
|
||||
</ul>
|
||||
@ -96,9 +96,12 @@ structures and allows it to hook itself into specific areas to perform special a
|
||||
<li><a href="#Skins">Skins</a>
|
||||
<li><a href="#Themes">Themes</a>
|
||||
<li><a href="#Devices">Devices</a>
|
||||
<li><a href="#Positioners">Positioners</a>
|
||||
<li><a href="#Audio">Audio</a>
|
||||
<li><a href="#Remote Control">Remote Control</a>
|
||||
<li><a href="#Conditional Access">Conditional Access</a>
|
||||
<li><a href="#Electronic Program Guide">Electronic Program Guide</a>
|
||||
<li><a href="#The video directory">The video directory</a>
|
||||
</ul>
|
||||
</ul>
|
||||
|
||||
@ -162,22 +165,26 @@ is used:
|
||||
VDR/PLUGINS/src
|
||||
VDR/PLUGINS/src/hello
|
||||
VDR/PLUGINS/lib
|
||||
VDR/PLUGINS/lib/libvdr-hello.so.1.1.0
|
||||
VDR/PLUGINS/lib/libvdr-hello.so.1
|
||||
</pre></td></tr></table><p>
|
||||
|
||||
The <tt>src</tt> directory contains one subdirectory for each plugin, which carries
|
||||
the name of that plugin (in the above example that would be <tt>hello</tt>).
|
||||
What's inside the individual source directory of a
|
||||
plugin is entirely up to the author of that plugin. The only prerequisites are
|
||||
that there is a <tt>Makefile</tt> that provides the targets <tt>all</tt> and
|
||||
that there is a <tt>Makefile</tt> that provides the targets <tt>all</tt>, <tt>install</tt> and
|
||||
<tt>clean</tt>, and that a call to <tt>make all</tt> actually produces a dynamically
|
||||
loadable library file for that plugin (we'll get to the details later).
|
||||
The dynamically loadable library file for the plugin shall be located directly under
|
||||
the plugin's source directory.
|
||||
See the section <a href="#Initializing a new plugin directory">Initializing a new plugin directory</a>
|
||||
for how to generate an example Makefile.
|
||||
<p>
|
||||
The <tt>lib</tt> directory contains the dynamically loadable libraries of all
|
||||
available plugins. Note that the names of these files are created by concatenating
|
||||
<p>
|
||||
<table border=2>
|
||||
<tr><td align=center><b><tt>libvdr-</tt></b></td><td align=center><b><tt>hello</tt></b></td><td align=center><b><tt>.so.</tt></b></td><td align=center><b><tt>1.1.0</tt></b></td></tr>
|
||||
<tr><td align=center><b><tt>libvdr-</tt></b></td><td align=center><b><tt>hello</tt></b></td><td align=center><b><tt>.so.</tt></b></td><td align=center><b><tt>1</tt></b></td></tr>
|
||||
<tr><td align=center><small>VDR plugin<br>library prefix</small></td><td align=center><small>name of<br>the plugin</small></td><td align=center><small>shared object<br>indicator</small></td><td align=center><small>API version number<br>this plugin was<br>compiled for</small></td></tr>
|
||||
</table>
|
||||
<p>
|
||||
@ -188,6 +195,11 @@ the current VDR version. That way minor fixes to VDR, that don't require changes
|
||||
to the VDR header files, can be made without requiring all plugins to be
|
||||
recompiled.
|
||||
<p>
|
||||
While in earlier versions of VDR the API version number was closely related to the
|
||||
VDR version number, starting with VDR version 2.7.2 the API version number was changed
|
||||
from a dot separated, three part number to a single integer, completely unrelated to
|
||||
the VDR version. This was done to avoid confusion.
|
||||
<p>
|
||||
The plugin library files can be stored in any directory. If the default organization
|
||||
is not used, the path to the plugin directory has be be given to VDR through the
|
||||
<b><tt>-L</tt></b> option.
|
||||
@ -383,13 +395,7 @@ just like shown in the above example. This is a convention that allows the <tt>M
|
||||
to extract the version number when generating the file name for the distribution archive.
|
||||
<p>
|
||||
A new plugin project should start with version number <tt>0.0.1</tt> and should reach
|
||||
version <tt>1.0.0</tt> once it is completely operative and well tested. Following the
|
||||
Linux kernel version numbering scheme, versions with <i>even</i> release numbers
|
||||
(like <tt>1.0.x</tt>, <tt>1.2.x</tt>, <tt>1.4.x</tt>...) should be stable releases,
|
||||
while those with <i>odd</i> release numbers (like <tt>1.1.x</tt>, <tt>1.3.x</tt>,
|
||||
<tt>1.5.x</tt>...) are usually considered "under development". The three parts of
|
||||
a version number are not limited to single digits, so a version number of <tt>1.2.15</tt>
|
||||
would be acceptable.
|
||||
version <tt>1.0.0</tt> once it is completely operative and well tested.
|
||||
|
||||
<hr><h2><a name="Description">Description</a></h2>
|
||||
|
||||
@ -555,6 +561,8 @@ as the <a href="#Getting started"><tt>Start()</tt></a> functions were called.
|
||||
|
||||
<hr><h2><a name="Logging">Logging</a></h2>
|
||||
|
||||
<div class="blurb">Traces in the sand...</div><p>
|
||||
|
||||
<p>
|
||||
If the plugin should print log messages, you can use <tt>dsyslog()</tt>, <tt>isyslog()</tt> or <tt>esyslog()</tt>.<br>
|
||||
<ul>
|
||||
@ -563,7 +571,7 @@ If the plugin should print log messages, you can use <tt>dsyslog()</tt>, <tt>isy
|
||||
<li><tt>esyslog()</tt> prints the log message only if the log level of vdr is set to 1 or above.
|
||||
</ul>
|
||||
The output of this log is the syslog of the system vdr is running on.
|
||||
The logmessage can be formatted like <tt>printf()</tt>, as in
|
||||
The log message can be formatted like <tt>printf()</tt>, as in
|
||||
|
||||
<p><table><tr><td class="code"><pre>
|
||||
esyslog("pluginname: error #%d has occurred", ErrorNumber);
|
||||
@ -571,6 +579,31 @@ esyslog("pluginname: error #%d has occurred", ErrorNumber);
|
||||
|
||||
Note that the log messages will be given as provided, the plugin's name will not
|
||||
automatically be added, so make sure your log messages are obvious enough.
|
||||
<p>
|
||||
Only use the above logging functions for occasional log messages. Do not use
|
||||
them unconditionally for frequent messages that produce long sequences of lines
|
||||
in the log file every few seconds. That might make it hard to work on other plugins
|
||||
or the core VDR code, watching their log entries while they are permanently
|
||||
interspersed with unrelated stuff.<br>
|
||||
<br>
|
||||
The recommended behavior for a plugin that does logging is to implement a command
|
||||
line option that controls the level of log messages, preferably '-l N, --log=N',
|
||||
where 'N' is in the range 0...3, with 0 meaning no logging whatsoever, 1 log only
|
||||
errors, 2 log errors and informational messages, and 3 also log debug information.<br>
|
||||
<br>
|
||||
If a plugin can output extensive data for special debugging purposes (either to
|
||||
the log file or stdout/stderr), this should be enabled by setting proper switches
|
||||
in one of its source files (see for example how the communication between VDR and
|
||||
CAMs can be monitored in VDR/ci.c).<br>
|
||||
<br>
|
||||
Under no circumstances must a plugin print anything to stdout or stderr during
|
||||
normal operation! The only exceptions being special debug information as described
|
||||
above, fatal error messages that will cause VDR to abort, or if it is the sole
|
||||
purpose of the plugin to display something on stdout, like for instance the
|
||||
<i>skincurses</i> plugin, which displays the OSD at the console.<br>
|
||||
<br>
|
||||
Please make any log messages in <b>ENGLISH</b>! Logs are usually sent to the developers
|
||||
of a program, and they may not be able to read them if they are in an exotic language.
|
||||
|
||||
<hr><h2><a name="Main menu entry">Main menu entry</a></h2>
|
||||
|
||||
@ -658,27 +691,6 @@ interaction is possible. If a specific action takes longer than a few seconds,
|
||||
the plugin should launch a separate thread to do this.
|
||||
</b>
|
||||
|
||||
<hr><h2><a name="Main thread hook">Main thread hook</a></h2>
|
||||
|
||||
<div class="blurb">Pushing in...</div><p>
|
||||
|
||||
Normally a plugin only reacts on user input if directly called through its
|
||||
<a href="#Main menu entry">main menu entry</a>, or performs some background
|
||||
activity in a separate thread. However, sometimes a plugin may need to do
|
||||
something in the context of the main program thread, without being explicitly
|
||||
called up by the user. In such a case it can implement the function
|
||||
|
||||
<p><table><tr><td class="code"><pre>
|
||||
virtual void MainThreadHook(void);
|
||||
</pre></td></tr></table><p>
|
||||
|
||||
in which it can do this. This function is called for every plugin once during
|
||||
every cycle of VDR's main program loop, which typically happens once every
|
||||
second.
|
||||
<b>Be very careful when using this function, and make sure you return from it
|
||||
as soon as possible! If you spend too much time in this function, the user
|
||||
interface performance will become sluggish!</b>
|
||||
|
||||
<hr><h2><a name="Activity">Activity</a></h2>
|
||||
|
||||
<div class="blurb">Now is not a good time!</div><p>
|
||||
@ -879,39 +891,51 @@ You can first assign the temporary values to the global variables and then do th
|
||||
your setup parameters and use that one to copy all parameters with one single statement
|
||||
(like VDR does with its cSetup class).
|
||||
|
||||
<hr><h2><a name="Configuration files">Configuration files</a></h2>
|
||||
<hr><h2><a name="Additional files">Additional files</a></h2>
|
||||
|
||||
<div class="blurb">I want my own stuff!</div><p>
|
||||
|
||||
There may be situations where a plugin requires configuration files of its own, maybe
|
||||
for data that can't be stored in the simple <a href="#Setup parameters">setup parameters</a>
|
||||
of VDR, or maybe because it needs to launch other programs that simply need a separate
|
||||
configuration file. While the plugin is free to store such files anywhere it
|
||||
sees fit, it might be a good idea to put them in a common place, preferably
|
||||
where other configuration data already exists. VDR provides the function
|
||||
There may be situations where a plugin requires files of its own. While the plugin is
|
||||
free to store such files anywhere it sees fit, it might be a good idea to put them in a common
|
||||
place, preferably where such data already exists.
|
||||
<p>
|
||||
<i>configuration files</i>, maybe for data that can't be stored in the simple
|
||||
<a href="#Setup parameters">setup parameters</a> of VDR, or maybe because it needs to
|
||||
launch other programs that simply need a separate configuration file.
|
||||
<p>
|
||||
<i>cache files</i>, to store data so that future requests for that data can be served faster. The data
|
||||
that is stored within a cache might be values that have been computed earlier or duplicates of
|
||||
original values that are stored elsewhere.
|
||||
<p>
|
||||
<i>resource files</i>, for providing additional files, like pictures, movie clips or channel logos.
|
||||
<p>
|
||||
Therefore VDR provides the functions
|
||||
|
||||
<p><table><tr><td class="code"><pre>
|
||||
const char *ConfigDirectory(const char *PluginName = NULL);
|
||||
const char *CacheDirectory(const char *PluginName = NULL);
|
||||
const char *ResourceDirectory(const char *PluginName = NULL);
|
||||
</pre></td></tr></table><p>
|
||||
|
||||
which returns a string containing the directory that VDR uses for its own configuration
|
||||
files (defined through the <tt><b>-c</b></tt> option in the call to VDR), extended by
|
||||
each of which returns a string containing the directory that VDR uses for its own
|
||||
files (defined through the options in the call to VDR), extended by
|
||||
<tt>"/plugins"</tt>. So assuming the VDR configuration directory is <tt>/video</tt>
|
||||
(the default if no <tt><b>-c</b></tt> or <tt><b>-v</b></tt> option is given),
|
||||
a call to <tt>ConfigDirectory()</tt> will return <tt>/video/plugins</tt>. The first
|
||||
call to <tt>ConfigDirectory()</tt> will automatically make sure that the <tt>plugins</tt>
|
||||
subdirectory will exist. If, for some reason, this cannot be achieved, <tt>NULL</tt>
|
||||
will be returned.
|
||||
The behavior of <tt>CacheDirectory()</tt> and <tt>ResourceDirectory()</tt> is similar.
|
||||
<p>
|
||||
The additional <tt>plugins</tt> directory is used to keep files from plugins apart
|
||||
from those of VDR itself, making sure there will be no name clashes. If a plugin
|
||||
needs only one extra configuration file, it is suggested that this file be named
|
||||
<tt>name.conf</tt>, where <i>name</i> shall be the name of the plugin.
|
||||
needs only one extra file, it is suggested that this file be named <tt>name.*</tt>,
|
||||
where <i>name</i> shall be the name of the plugin.
|
||||
<p>
|
||||
If a plugin needs more than one such file, it is suggested that the plugin stores
|
||||
these in a subdirectory of its own, named after the plugin. To easily get such a name
|
||||
the <tt>ConfigDirectory()</tt> function can be given an additional string that will
|
||||
be appended to the returned directory name, as in
|
||||
the functions can be given an additional string that will be appended to the returned
|
||||
directory name, as in
|
||||
|
||||
<p><table><tr><td class="code"><pre>
|
||||
const char *MyConfigDir = ConfigDirectory(Name());
|
||||
@ -922,13 +946,12 @@ plugin's name. Again, VDR will make sure that the requested directory will exist
|
||||
(or return <tt>NULL</tt> in case of an error).
|
||||
<p>
|
||||
<b>
|
||||
The returned string is statically allocated and will be overwritten by subsequent
|
||||
calls to ConfigDirectory()!
|
||||
The returned strings are statically allocated and will be overwritten by subsequent calls!
|
||||
</b>
|
||||
<p>
|
||||
The <tt>ConfigDirectory()</tt> function is a static member function of the <tt>cPlugin</tt>
|
||||
class. This allows it to be called even from outside any member function of the derived
|
||||
plugin class, by writing
|
||||
The <tt>ConfigDirectory()</tt>, <tt>CacheDirectory()</tt> and <tt>ResourceDirectory()</tt>
|
||||
functions are static member functions of the <tt>cPlugin</tt> class. This allows them to be
|
||||
called even from outside any member function of the derived plugin class, by writing
|
||||
|
||||
<p><table><tr><td class="code"><pre>
|
||||
const char *MyConfigDir = cPlugin::ConfigDirectory();
|
||||
@ -1138,6 +1161,60 @@ The returned string may consist of several lines, separated by the newline chara
|
||||
('<tt>\n</tt>'). Each of these lines will be preceded with the <tt>ReplyCode</tt>
|
||||
when presenting them to the caller, and the continuation character ('<tt>-</tt>')
|
||||
will be set for all but the last one.
|
||||
<p>
|
||||
<b>The SVDRP functions are called from the separate "SVDRP server handler" thread.
|
||||
Therefore the plugin needs to take care of proper <a href="#Locking">locking</a> if it accesses any
|
||||
global data.</b>
|
||||
|
||||
<hr><h2><a name="Locking">Locking</a></h2>
|
||||
|
||||
<div class="blurb">U can't touch this</div><p>
|
||||
|
||||
When accessing global data structures, proper locking is absolutely necessary.
|
||||
<p>
|
||||
There are several macros that allow for easy locking and unlocking. They all
|
||||
follow the naming convention <tt>LOCK_*_READ|WRITE</tt>, where <tt>'*'</tt> is the name
|
||||
of the global data structure, which can be one of <tt>TIMERS</tt>, <tt>CHANNELS</tt>,
|
||||
<tt>RECORDINGS</tt> or <tt>SCHEDULES</tt>. To implicitly avoid deadlocks in case you
|
||||
need to lock more than one structure, always make sure you use these macros in
|
||||
this sequence!
|
||||
<p>
|
||||
Using one of these macros sets a lock on the structure, creates a local pointer to the
|
||||
respective structure and makes sure the lock is released at the end of the current
|
||||
block:
|
||||
|
||||
<p><table><tr><td class="code"><pre>
|
||||
if (some condition) {
|
||||
LOCK_TIMERS_READ; // creates local const cTimers *Timers
|
||||
for (const cTimer *Timer = Timers->First(); Timer; Timer = Timers->Next(Timer)) {
|
||||
// do something with Timer
|
||||
}
|
||||
}
|
||||
</pre></td></tr></table><p>
|
||||
|
||||
Note the naming convention: TIMERS -> Timers etc.
|
||||
<p>
|
||||
The <tt>LOCK_*_READ</tt> macros create pointers that are '<tt>const</tt>', while
|
||||
the <tt>LOCK_*_WRITE</tt> macros allow modifications to the data structures.
|
||||
Both wait indefinitely to obtain the lock. However, if <tt>LOCK_*_WRITE</tt> is
|
||||
used twice in the same block, the second call will not obtain a lock and
|
||||
immediately return <tt>NULL</tt>, which may lead to a crash. In such cases a
|
||||
warning and backtrace is logged.
|
||||
<p>
|
||||
You may keep pointers to objects in such lists, even after releasing
|
||||
the lock. However, you may only access such objects if you are
|
||||
holding a proper lock again. If an object has been deleted from the list
|
||||
while you did not hold a lock (for instance by an other thread), the
|
||||
object will still be there, but no longer within this list (it is then
|
||||
stored in the ListGarbageCollector for a few seconds). That way even if you
|
||||
access the object after it has been deleted, you won't cause a segfault.
|
||||
You can call the Contains() function to check whether an object you are
|
||||
holding a pointer to is still in the list. Note that the garbage collector
|
||||
is purged when the usual housekeeping is done.
|
||||
<p>
|
||||
See tools.h, class <tt>cListBase</tt> for more documentation and information on how
|
||||
to use locking with timeouts, and thread.h, classes <tt>cStateLock</tt> and
|
||||
<tt>cStateKey</tt> on how to easily react to changes in such lists.
|
||||
|
||||
<hr><h2><a name="Loading plugins into VDR">Loading plugins into VDR</a></h2>
|
||||
|
||||
@ -1219,10 +1296,10 @@ If a plugin wants to get informed on various events in VDR, it can derive a clas
|
||||
|
||||
class cMyStatusMonitor : public cStatus {
|
||||
protected:
|
||||
virtual void ChannelSwitch(const cDevice *Device, int ChannelNumber);
|
||||
virtual void ChannelSwitch(const cDevice *Device, int ChannelNumber, bool LiveView);
|
||||
};
|
||||
|
||||
void cMyStatusMonitor::ChannelSwitch(const cDevice *Device, int ChannelNumber)
|
||||
void cMyStatusMonitor::ChannelSwitch(const cDevice *Device, int ChannelNumber, bool LiveView)
|
||||
{
|
||||
if (ChannelNumber)
|
||||
dsyslog("channel switched to %d on DVB %d", ChannelNumber, Device->CardIndex());
|
||||
@ -1480,8 +1557,9 @@ public:
|
||||
};
|
||||
|
||||
cMyReceiver::cMyReceiver(int Pid)
|
||||
:cReceiver(tChannelID(), -1, Pid)
|
||||
:cReceiver(NULL, -1)
|
||||
{
|
||||
AddPid(Pid);
|
||||
}
|
||||
|
||||
cMyReceiver::~cMyReceiver()
|
||||
@ -1507,7 +1585,8 @@ member functions of <tt>cReceiver</tt>.
|
||||
The above example sets up a receiver that wants to receive data from only one
|
||||
PID (for example the Teletext PID). In order to not interfere with other recording
|
||||
operations, it sets its priority to <tt>-1</tt> (any negative value will allow
|
||||
a <tt>cReceiver</tt> to be detached from its <tt>cDevice</tt> at any time.
|
||||
a <tt>cReceiver</tt> to be detached from its <tt>cDevice</tt> at any time
|
||||
in favor of a timer recording or live viewing).
|
||||
<p>
|
||||
Once a <tt>cReceiver</tt> has been created, it needs to be <i>attached</i> to
|
||||
a <tt>cDevice</tt>:
|
||||
@ -1523,8 +1602,7 @@ the receiver is attached to the device that actually receives the current live
|
||||
video stream (this may be different from the primary device in case of <i>Transfer
|
||||
Mode</i>).
|
||||
<p>
|
||||
If the <tt>cReceiver</tt> isn't needed any more, it may simply be <i>deleted</i>
|
||||
and will automatically detach itself from the <tt>cDevice</tt>.
|
||||
The <tt>cReceiver</tt> must be detached from its device before it is deleted.
|
||||
|
||||
<hr><h2><a name="Filters">Filters</a></h2>
|
||||
|
||||
@ -1653,7 +1731,7 @@ restricts this to a <tt>cOsdObject</tt> returned from the plugin's <tt>MainMenuA
|
||||
function, or any of the skin classes a plugin might implement.
|
||||
<p>
|
||||
If a plugin runs a separate thread and wants to issue a message directly from
|
||||
within that tread, it can call
|
||||
within that thread, it can call
|
||||
|
||||
<p><table><tr><td class="code"><pre>
|
||||
int cSkins::QueueMessage(eMessageType Type, const char *s, int Seconds = 0, int Timeout = 0);
|
||||
@ -1679,7 +1757,7 @@ The first step in implementing a new skin is to derive a class from <tt>cSkin</t
|
||||
that provides the handling objects necessary to do the actual work:
|
||||
|
||||
<p><table><tr><td class="code"><pre>
|
||||
#include "skins.h"
|
||||
#include <vdr/skins.h>
|
||||
|
||||
class cMySkin : public cSkin {
|
||||
public:
|
||||
@ -1689,7 +1767,7 @@ public:
|
||||
virtual cSkinDisplayMenu *DisplayMenu(void);
|
||||
virtual cSkinDisplayReplay *DisplayReplay(bool ModeOnly);
|
||||
virtual cSkinDisplayVolume *DisplayVolume(void);
|
||||
virtual cSkinDisplayMessage *DisplayTrack(int NumTracks, const char * const *Tracks);
|
||||
virtual cSkinDisplayTracks *DisplayTracks(const char *Title, int NumTracks, const char * const *Tracks);
|
||||
virtual cSkinDisplayMessage *DisplayMessage(void);
|
||||
};
|
||||
</pre></td></tr></table><p>
|
||||
@ -1802,6 +1880,7 @@ If the new device can receive, it most likely needs to provide a way of
|
||||
selecting which channel it shall tune to:
|
||||
|
||||
<p><table><tr><td class="code"><pre>
|
||||
virtual int NumProvidedSystems(void) const;
|
||||
virtual bool ProvidesSource(int Source) const;
|
||||
virtual bool ProvidesTransponder(const cChannel *Channel) const;
|
||||
virtual bool ProvidesChannel(const cChannel *Channel, int Priority = -1, bool *NeedsDetachReceivers = NULL) const;
|
||||
@ -1850,11 +1929,9 @@ virtual bool HasDecoder(void) const;
|
||||
virtual bool CanReplay(void) const;
|
||||
virtual bool SetPlayMode(ePlayMode PlayMode);
|
||||
virtual int64_t GetSTC(void);
|
||||
<div class="modified">
|
||||
virtual bool IsPlayingVideo(void) const;
|
||||
</div modified>
|
||||
virtual bool HasIBPTrickSpeed(void);
|
||||
virtual void TrickSpeed(int Speed);
|
||||
virtual void TrickSpeed(int Speed, bool Forward);
|
||||
virtual void Clear(void);
|
||||
virtual void Play(void);
|
||||
virtual void Freeze(void);
|
||||
@ -1881,6 +1958,7 @@ the functions
|
||||
|
||||
<p><table><tr><td class="code"><pre>
|
||||
virtual int OpenFilter(u_short Pid, u_char Tid, u_char Mask);
|
||||
virtual int ReadFilter(int Handle, void *Buffer, size_t Length);
|
||||
virtual void CloseFilter(int Handle);
|
||||
</pre></td></tr></table><p>
|
||||
|
||||
@ -1929,12 +2007,21 @@ void cMyDevice::MakePrimaryDevice(bool On)
|
||||
The OSD provider object is allocated on the heap and shall not be deleted
|
||||
(it will be deleted automatically in case a different device sets up an OSD
|
||||
provider, or when the program ends).
|
||||
|
||||
<p>
|
||||
Note that an OSD implementation need not be physically linked to the device
|
||||
in any way. All it needs to make sure is that the OSD will be visible to the
|
||||
user - whether this goes through OSD facilities of the physical device (like
|
||||
a "full featured" DVB card) or through a graphics adapter that overlays its
|
||||
output with the video signal, doesn't matter.
|
||||
<p>
|
||||
In order to be able to determine the proper size of the OSD, the device
|
||||
should implement the function
|
||||
|
||||
<p><table><tr><td class="code"><pre>
|
||||
virtual void GetOsdSize(int &Width, int &Height, double &Aspect);
|
||||
</pre></td></tr></table><p>
|
||||
|
||||
By default, an OSD size of 720x480 with an aspect ratio of 1.0 is assumed.
|
||||
|
||||
<p>
|
||||
<b>Initializing new devices</b>
|
||||
@ -1955,6 +2042,108 @@ Nothing needs to be done to shut down the devices. VDR will automatically
|
||||
shut down (delete) all devices when the program terminates. It is therefore
|
||||
important that the devices are created on the heap, using the <tt>new</tt>
|
||||
operator!
|
||||
<p>
|
||||
<b>Device hooks</b>
|
||||
<p>
|
||||
VDR has builtin facilities that select which device is able to provide a given
|
||||
transponder, or, which device may provide EIT data. However, there may be
|
||||
situations where the setup is so special that it requires considerations that
|
||||
exceed the scope of the core VDR code.
|
||||
This is where <i>device hooks</i> can be used.
|
||||
|
||||
<p><table><tr><td class="code"><pre>
|
||||
class cMyDeviceHook : public cDeviceHook {
|
||||
public:
|
||||
cMyDeviceHook(void);
|
||||
virtual bool DeviceProvidesTransponder(const cDevice *Device, const cChannel *Channel) const;
|
||||
virtual bool DeviceProvidesEIT(const cDevice *Device) const;
|
||||
};
|
||||
</pre></td></tr></table><p>
|
||||
|
||||
In its <tt>DeviceProvidesTransponder()</tt> function the device hook can take
|
||||
whatever actions are necessary to determine whether the given Device can
|
||||
provide the given Channel's transponder, as in
|
||||
|
||||
<p><table><tr><td class="code"><pre>
|
||||
bool cMyDeviceHook::DeviceProvidesTransponder(const cDevice *Device, const cChannel *Channel) const
|
||||
{
|
||||
if (<i>condition where Device can't provide Channel</i>)
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
</pre></td></tr></table><p>
|
||||
|
||||
In its <tt>DeviceProvidesEIT()</tt> function the device hook can take
|
||||
whatever actions are necessary to determine whether the given Device can
|
||||
provide EIT data, as in
|
||||
|
||||
<p><table><tr><td class="code"><pre>
|
||||
bool cMyDeviceHook::DeviceProvidesEIT(const cDevice *Device) const
|
||||
{
|
||||
if (<i>condition where Device can't provide EIT data</i>)
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
</pre></td></tr></table><p>
|
||||
|
||||
A plugin that creates a derived cDeviceHook shall do so in its <tt>Initialize()</tt>
|
||||
function, as in
|
||||
|
||||
<p><table><tr><td class="code"><pre>
|
||||
new cMyDeviceHook;
|
||||
</pre></td></tr></table><p>
|
||||
|
||||
and shall not delete this object. It will be automatically deleted when the program ends.
|
||||
<p>
|
||||
<b>Power management</b>
|
||||
<p>
|
||||
A device that can be put into a power save mode can implement the function
|
||||
|
||||
<p><table><tr><td class="code"><pre>
|
||||
virtual void SetPowerSaveMode(bool On);
|
||||
</pre></td></tr></table><p>
|
||||
|
||||
If On is true, power save mode shall be activated, if it is false,
|
||||
normal operating mode shall be restored.
|
||||
|
||||
<hr><h2><a name="Positioners">Positioners</a></h2>
|
||||
|
||||
<div class="blurb">Now you see me - now you don't!</div><p>
|
||||
|
||||
If you are using a positioner (also known as "motor" or "rotor") to move your
|
||||
satellite dish to receive various satellites, you will be using the 'P' command
|
||||
in the <tt>diseqc.conf</tt> file. This command sends the necessary data to the
|
||||
positioner to move the dish to the satellite's orbital position. By default VDR
|
||||
uses its builtin DiSEqC positioner control. If your positioner requires a different
|
||||
method of controlling (like maybe via a serial link), you can derive a class
|
||||
from <tt>cPositioner</tt>, as in
|
||||
|
||||
<p><table><tr><td class="code"><pre>
|
||||
#include <vdr/positioner.h>
|
||||
|
||||
class cMyPositioner : public cPositioner {
|
||||
public:
|
||||
cMyPositioner(void);
|
||||
virtual void Drive(ePositionerDirection Direction);
|
||||
virtual void Step(ePositionerDirection Direction, uint Steps = 1);
|
||||
virtual void Halt(void);
|
||||
virtual void SetLimit(ePositionerDirection Direction);
|
||||
virtual void DisableLimits(void);
|
||||
virtual void EnableLimits(void);
|
||||
virtual void StorePosition(uint Number);
|
||||
virtual void RecalcPositions(uint Number);
|
||||
virtual void GotoPosition(uint Number, int Longitude);
|
||||
virtual void GotoAngle(int Longitude);
|
||||
};
|
||||
</pre></td></tr></table><p>
|
||||
|
||||
See the implementation of <tt>cDiseqcPositioner</tt> in <tt>diseqc.c</tt> for details.
|
||||
<p>
|
||||
You should create your derived positioner object in the
|
||||
<a href="#Getting started"><tt>Start()</tt></a> function of your plugin.
|
||||
Note that the object has to be created on the heap (using <tt>new</tt>),
|
||||
and you shall not delete it at any point (it will be deleted automatically
|
||||
when the program ends).
|
||||
|
||||
<hr><h2><a name="Audio">Audio</a></h2>
|
||||
|
||||
@ -2119,6 +2308,11 @@ Put(uint64 Code, bool Repeat = false, bool Release = false);
|
||||
</pre></td></tr></table><p>
|
||||
|
||||
The other parameters have the same meaning as in the first version of this function.
|
||||
<p>
|
||||
If your remote control has a repeat function that automatically repeats key events
|
||||
if a key is held pressed down for a while, your derived class should use the global
|
||||
parameters <tt>Setup.RcRepeatDelay</tt> and <tt>Setup.RcRepeatDelta</tt> to allow
|
||||
users to configure the behavior of this function.
|
||||
|
||||
<hr><h2><a name="Conditional Access">Conditional Access</a></h2>
|
||||
|
||||
@ -2155,5 +2349,69 @@ virtual bool Assign(cDevice *Device, bool Query = false);
|
||||
|
||||
See the description of this function in <tt>ci.h</tt> for details.
|
||||
|
||||
<hr><h2><a name="Electronic Program Guide">Electronic Program Guide</a></h2>
|
||||
|
||||
<div class="blurb">The grass is always greener on the other side...</div><p>
|
||||
|
||||
In case the <i>Electronic Program Guide (EPG)</i> provided by the broadcaster
|
||||
isn't sufficient for your taste, you can implement a <tt>cEpgHandler</tt> to
|
||||
improve it from external sources. For instance, to replace the description
|
||||
of the broadcaster's EPG with one from some external database, you could do:
|
||||
|
||||
<p><table><tr><td class="code"><pre>
|
||||
#include <vdr/epg.h>
|
||||
|
||||
class cMyEpgHandler : public cEpgHandler {
|
||||
public:
|
||||
virtual bool SetDescription(cEvent *Event, const char *Description);
|
||||
};
|
||||
|
||||
bool cMyEpgHandler::SetDescription(cEvent *Event, const char *Description)
|
||||
{
|
||||
Event->SetDescription(DescriptionFromDatabase(Event));
|
||||
return true;
|
||||
}
|
||||
</pre></td></tr></table><p>
|
||||
|
||||
where <tt>DescriptionFromDatabase()</tt> would derive the description of the
|
||||
given event from some external source. Note that the function returns <tt>true</tt>
|
||||
to signal VDR that no other EPG handlers shall be queried after this one.
|
||||
<p>
|
||||
See <tt>VDR/epg.h</tt> for details.
|
||||
|
||||
<hr><h2><a name="The video directory">The video directory</a></h2>
|
||||
|
||||
<div class="blurb">Bits and pieces...</div><p>
|
||||
|
||||
By default VDR assumes that the video directory consists of one large
|
||||
volume, on which it can store its recordings. If you want to distribute your
|
||||
recordings over several physical drives, you can derive from <tt>cVideoDirectory</tt>,
|
||||
as in
|
||||
|
||||
<p><table><tr><td class="code"><pre>
|
||||
#include <vdr/videodir.h>
|
||||
|
||||
class cMyVideoDirectory : public cVideoDirectory {
|
||||
public:
|
||||
cMyVideoDirectory(void);
|
||||
virtual ~cMyVideoDirectory();
|
||||
virtual int FreeMB(int *UsedMB = NULL);
|
||||
virtual bool Register(const char *FileName);
|
||||
virtual bool Rename(const char *OldName, const char *NewName);
|
||||
virtual bool Move(const char *FromName, const char *ToName);
|
||||
virtual bool Remove(const char *Name);
|
||||
virtual void Cleanup(const char *IgnoreFiles[] = NULL);
|
||||
virtual bool Contains(const char *Name);
|
||||
};
|
||||
</pre></td></tr></table><p>
|
||||
|
||||
See the description in <tt>videodir.h</tt> for details.
|
||||
<p>
|
||||
You should create your derived video directory object in the
|
||||
<a href="#Getting started"><tt>Start()</tt></a> function of your plugin.
|
||||
Note that the object has to be created on the heap (using <tt>new</tt>),
|
||||
and you shall not delete it at any point (it will be deleted automatically
|
||||
when the program ends).
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
34
PLUGINS/src/epgtableid0/HISTORY
Normal file
34
PLUGINS/src/epgtableid0/HISTORY
Normal file
@ -0,0 +1,34 @@
|
||||
VDR Plugin 'epgtableid0' Revision History
|
||||
-----------------------------------------
|
||||
|
||||
2012-03-10: Version 0.0.1
|
||||
|
||||
- Initial revision.
|
||||
|
||||
2012-12-27: Version 0.0.2
|
||||
|
||||
- Adapted Makefile to changes introduced in recent VDR versions.
|
||||
|
||||
2013-01-12: Version 0.0.3
|
||||
|
||||
- Adapted Makefile to changes introduced in recent VDR versions.
|
||||
|
||||
2013-03-31: Version 2.0.0
|
||||
|
||||
- Official release.
|
||||
|
||||
2014-01-01: Version 2.1.1
|
||||
|
||||
- Avoiding unnecessary pkg-config warnings in plugin Makefiles.
|
||||
|
||||
2015-02-19: Version 2.2.0
|
||||
|
||||
- Official release.
|
||||
|
||||
2018-04-15: Version 2.4.0
|
||||
|
||||
- Official release.
|
||||
|
||||
2021-12-27: Version 2.6.0
|
||||
|
||||
- Official release.
|
97
PLUGINS/src/epgtableid0/Makefile
Normal file
97
PLUGINS/src/epgtableid0/Makefile
Normal file
@ -0,0 +1,97 @@
|
||||
#
|
||||
# Makefile for a Video Disk Recorder plugin
|
||||
#
|
||||
# $Id: Makefile 4.3 2020/06/22 15:08:46 kls Exp $
|
||||
|
||||
# The official name of this plugin.
|
||||
# This name will be used in the '-P...' option of VDR to load the plugin.
|
||||
# By default the main source file also carries this name.
|
||||
|
||||
PLUGIN = epgtableid0
|
||||
|
||||
### The version number of this plugin (taken from the main source file):
|
||||
|
||||
VERSION = $(shell grep 'static const char \*VERSION *=' $(PLUGIN).c | awk '{ print $$6 }' | sed -e 's/[";]//g')
|
||||
|
||||
### The directory environment:
|
||||
|
||||
# Use package data if installed...otherwise assume we're under the VDR source directory:
|
||||
PKG_CONFIG ?= pkg-config
|
||||
PKGCFG = $(if $(VDRDIR),$(shell $(PKG_CONFIG) --variable=$(1) $(VDRDIR)/vdr.pc),$(shell PKG_CONFIG_PATH="$$PKG_CONFIG_PATH:../../.." $(PKG_CONFIG) --variable=$(1) vdr))
|
||||
LIBDIR = $(call PKGCFG,libdir)
|
||||
PLGCFG = $(call PKGCFG,plgcfg)
|
||||
#
|
||||
TMPDIR ?= /tmp
|
||||
|
||||
### The compiler options:
|
||||
|
||||
export CFLAGS = $(call PKGCFG,cflags)
|
||||
export CXXFLAGS = $(call PKGCFG,cxxflags)
|
||||
|
||||
### The version number of VDR's plugin API:
|
||||
|
||||
APIVERSION = $(call PKGCFG,apiversion)
|
||||
|
||||
### Allow user defined options to overwrite defaults:
|
||||
|
||||
-include $(PLGCFG)
|
||||
|
||||
### The name of the distribution archive:
|
||||
|
||||
ARCHIVE = $(PLUGIN)-$(VERSION)
|
||||
PACKAGE = vdr-$(ARCHIVE)
|
||||
|
||||
### The name of the shared object file:
|
||||
|
||||
SOFILE = libvdr-$(PLUGIN).so
|
||||
|
||||
### Includes and Defines (add further entries here):
|
||||
|
||||
INCLUDES +=
|
||||
|
||||
DEFINES += -DPLUGIN_NAME_I18N='"$(PLUGIN)"'
|
||||
|
||||
### The object files (add further files here):
|
||||
|
||||
OBJS = $(PLUGIN).o
|
||||
|
||||
### The main target:
|
||||
|
||||
all: $(SOFILE)
|
||||
|
||||
### Implicit rules:
|
||||
|
||||
%.o: %.c
|
||||
@echo CC $@
|
||||
$(Q)$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) -o $@ $<
|
||||
|
||||
### Dependencies:
|
||||
|
||||
MAKEDEP = $(CXX) -MM -MG
|
||||
DEPFILE = .dependencies
|
||||
$(DEPFILE): Makefile
|
||||
@$(MAKEDEP) $(CXXFLAGS) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@
|
||||
|
||||
-include $(DEPFILE)
|
||||
|
||||
### Targets:
|
||||
|
||||
$(SOFILE): $(OBJS)
|
||||
@echo LD $@
|
||||
$(Q)$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS) -o $@
|
||||
|
||||
install-lib: $(SOFILE)
|
||||
install -D $^ $(DESTDIR)$(LIBDIR)/$^.$(APIVERSION)
|
||||
|
||||
install: install-lib
|
||||
|
||||
dist: clean
|
||||
@-rm -rf $(TMPDIR)/$(ARCHIVE)
|
||||
@mkdir $(TMPDIR)/$(ARCHIVE)
|
||||
@cp -a * $(TMPDIR)/$(ARCHIVE)
|
||||
@tar czf $(PACKAGE).tgz -C $(TMPDIR) $(ARCHIVE)
|
||||
@-rm -rf $(TMPDIR)/$(ARCHIVE)
|
||||
@echo Distribution package created as $(PACKAGE).tgz
|
||||
|
||||
clean:
|
||||
@-rm -f $(OBJS) $(DEPFILE) *.so *.tgz core* *~
|
19
PLUGINS/src/epgtableid0/README
Normal file
19
PLUGINS/src/epgtableid0/README
Normal file
@ -0,0 +1,19 @@
|
||||
This is a "plugin" for the Video Disk Recorder (VDR).
|
||||
|
||||
Written by: Klaus Schmidinger <vdr@tvdr.de>
|
||||
|
||||
Project's homepage: https://www.tvdr.de
|
||||
|
||||
Latest version available at: https://www.tvdr.de
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
See the file COPYING for more information.
|
||||
|
||||
Description:
|
||||
|
||||
The special handling of EPG events with table id 0x00 has been dropped
|
||||
in VDR version 1.7.26, and replaced by a more felxible "EPG Handler"
|
||||
concept. You can use this plugin to get the previous functionality back.
|
98
PLUGINS/src/epgtableid0/epgtableid0.c
Normal file
98
PLUGINS/src/epgtableid0/epgtableid0.c
Normal file
@ -0,0 +1,98 @@
|
||||
/*
|
||||
* epgtableid0.c: A plugin for the Video Disk Recorder
|
||||
*
|
||||
* See the README file for copyright information and how to reach the author.
|
||||
*
|
||||
* $Id: epgtableid0.c 4.1 2018/04/10 13:00:18 kls Exp $
|
||||
*/
|
||||
|
||||
#include <vdr/epg.h>
|
||||
#include <vdr/plugin.h>
|
||||
|
||||
static const char *VERSION = "2.4.0";
|
||||
static const char *DESCRIPTION = "EPG handler for events with table id 0x00";
|
||||
|
||||
// --- cTable0Handler --------------------------------------------------------
|
||||
|
||||
class cTable0Handler : public cEpgHandler {
|
||||
private:
|
||||
bool Ignore(cEvent *Event) { return Event->TableID() == 0x00; }
|
||||
public:
|
||||
virtual bool SetEventID(cEvent *Event, tEventID EventID);
|
||||
virtual bool SetStartTime(cEvent *Event, time_t StartTime);
|
||||
virtual bool SetDuration(cEvent *Event, int Duration);
|
||||
virtual bool SetTitle(cEvent *Event, const char *Title);
|
||||
virtual bool SetShortText(cEvent *Event, const char *ShortText);
|
||||
virtual bool SetDescription(cEvent *Event, const char *Description);
|
||||
virtual bool SetContents(cEvent *Event, uchar *Contents);
|
||||
virtual bool SetParentalRating(cEvent *Event, int ParentalRating);
|
||||
virtual bool SetVps(cEvent *Event, time_t Vps);
|
||||
virtual bool FixEpgBugs(cEvent *Event);
|
||||
};
|
||||
|
||||
bool cTable0Handler::SetEventID(cEvent *Event, tEventID EventID)
|
||||
{
|
||||
return Ignore(Event);
|
||||
}
|
||||
|
||||
bool cTable0Handler::SetStartTime(cEvent *Event, time_t StartTime)
|
||||
{
|
||||
return Ignore(Event);
|
||||
}
|
||||
|
||||
bool cTable0Handler::SetDuration(cEvent *Event, int Duration)
|
||||
{
|
||||
return Ignore(Event);
|
||||
}
|
||||
|
||||
bool cTable0Handler::SetTitle(cEvent *Event, const char *Title)
|
||||
{
|
||||
return Ignore(Event);
|
||||
}
|
||||
|
||||
bool cTable0Handler::SetShortText(cEvent *Event, const char *ShortText)
|
||||
{
|
||||
return Ignore(Event);
|
||||
}
|
||||
|
||||
bool cTable0Handler::SetDescription(cEvent *Event, const char *Description)
|
||||
{
|
||||
return Ignore(Event);
|
||||
}
|
||||
|
||||
bool cTable0Handler::SetContents(cEvent *Event, uchar *Contents)
|
||||
{
|
||||
return Ignore(Event);
|
||||
}
|
||||
|
||||
bool cTable0Handler::SetParentalRating(cEvent *Event, int ParentalRating)
|
||||
{
|
||||
return Ignore(Event);
|
||||
}
|
||||
|
||||
bool cTable0Handler::SetVps(cEvent *Event, time_t Vps)
|
||||
{
|
||||
return Ignore(Event);
|
||||
}
|
||||
|
||||
bool cTable0Handler::FixEpgBugs(cEvent *Event)
|
||||
{
|
||||
return Ignore(Event);
|
||||
}
|
||||
|
||||
// --- cPluginEpgtableid0 ----------------------------------------------------
|
||||
|
||||
class cPluginEpgtableid0 : public cPlugin {
|
||||
public:
|
||||
virtual const char *Version(void) { return VERSION; }
|
||||
virtual const char *Description(void) { return DESCRIPTION; }
|
||||
virtual bool Initialize(void);
|
||||
};
|
||||
|
||||
bool cPluginEpgtableid0::Initialize(void)
|
||||
{
|
||||
new cTable0Handler;
|
||||
return true;
|
||||
}
|
||||
|
||||
VDRPLUGINCREATOR(cPluginEpgtableid0); // Don't touch this!
|
@ -63,6 +63,43 @@ VDR Plugin 'hello' Revision History
|
||||
|
||||
- Updated the Croatian language texts (thanks to Adrian Caval).
|
||||
|
||||
2008-009-06 Version 0.2.3
|
||||
2008-09-06: Version 0.2.3
|
||||
|
||||
- Updated the Turkish language texts (thanks to Oktay Yolgeçen).
|
||||
|
||||
2009-12-06: Version 0.2.4
|
||||
|
||||
- Several code modifications to avoid compiler warnings (thanks to Winfried Köhler).
|
||||
|
||||
2010-02-28: Version 0.2.5
|
||||
|
||||
- Added Lithuanian language translations (thanks to Valdemaras Pipiras).
|
||||
|
||||
2012-12-27: Version 0.2.6
|
||||
|
||||
- Adapted Makefile to changes introduced in recent VDR versions.
|
||||
|
||||
2013-01-12: Version 0.2.7
|
||||
|
||||
- Adapted Makefile to changes introduced in recent VDR versions.
|
||||
|
||||
2013-03-31: Version 2.0.0
|
||||
|
||||
- Official release.
|
||||
|
||||
2014-01-01: Version 2.1.1
|
||||
|
||||
- Avoiding unnecessary pkg-config warnings in plugin Makefiles.
|
||||
|
||||
2015-02-19: Version 2.2.0
|
||||
|
||||
- Official release.
|
||||
|
||||
2018-04-15: Version 2.4.0
|
||||
|
||||
- Updated the French OSD texts (thanks to Bernard Jaulin).
|
||||
- Official release.
|
||||
|
||||
2021-12-27: Version 2.6.0
|
||||
|
||||
- Official release.
|
||||
|
@ -1,49 +1,56 @@
|
||||
#
|
||||
# Makefile for a Video Disk Recorder plugin
|
||||
#
|
||||
# $Id: Makefile 1.22 2008/01/13 12:59:58 kls Exp $
|
||||
# $Id: Makefile 4.3 2020/06/22 15:08:46 kls Exp $
|
||||
|
||||
# The official name of this plugin.
|
||||
# This name will be used in the '-P...' option of VDR to load the plugin.
|
||||
# By default the main source file also carries this name.
|
||||
# IMPORTANT: the presence of this macro is important for the Make.config
|
||||
# file. So it must be defined, even if it is not used here!
|
||||
#
|
||||
|
||||
PLUGIN = hello
|
||||
|
||||
### The version number of this plugin (taken from the main source file):
|
||||
|
||||
VERSION = $(shell grep 'static const char \*VERSION *=' $(PLUGIN).c | awk '{ print $$6 }' | sed -e 's/[";]//g')
|
||||
|
||||
### The C++ compiler and options:
|
||||
|
||||
CXX ?= g++
|
||||
CXXFLAGS ?= -fPIC -g -O2 -Wall -Woverloaded-virtual -Wno-parentheses
|
||||
|
||||
### The directory environment:
|
||||
|
||||
VDRDIR = ../../..
|
||||
LIBDIR = ../../lib
|
||||
TMPDIR = /tmp
|
||||
# Use package data if installed...otherwise assume we're under the VDR source directory:
|
||||
PKG_CONFIG ?= pkg-config
|
||||
PKGCFG = $(if $(VDRDIR),$(shell $(PKG_CONFIG) --variable=$(1) $(VDRDIR)/vdr.pc),$(shell PKG_CONFIG_PATH="$$PKG_CONFIG_PATH:../../.." $(PKG_CONFIG) --variable=$(1) vdr))
|
||||
LIBDIR = $(call PKGCFG,libdir)
|
||||
LOCDIR = $(call PKGCFG,locdir)
|
||||
PLGCFG = $(call PKGCFG,plgcfg)
|
||||
#
|
||||
TMPDIR ?= /tmp
|
||||
|
||||
### The compiler options:
|
||||
|
||||
export CFLAGS = $(call PKGCFG,cflags)
|
||||
export CXXFLAGS = $(call PKGCFG,cxxflags)
|
||||
|
||||
### The version number of VDR's plugin API:
|
||||
|
||||
APIVERSION = $(call PKGCFG,apiversion)
|
||||
|
||||
### Allow user defined options to overwrite defaults:
|
||||
|
||||
-include $(VDRDIR)/Make.config
|
||||
|
||||
### The version number of VDR's plugin API (taken from VDR's "config.h"):
|
||||
|
||||
APIVERSION = $(shell sed -ne '/define APIVERSION/s/^.*"\(.*\)".*$$/\1/p' $(VDRDIR)/config.h)
|
||||
-include $(PLGCFG)
|
||||
|
||||
### The name of the distribution archive:
|
||||
|
||||
ARCHIVE = $(PLUGIN)-$(VERSION)
|
||||
PACKAGE = vdr-$(ARCHIVE)
|
||||
|
||||
### The name of the shared object file:
|
||||
|
||||
SOFILE = libvdr-$(PLUGIN).so
|
||||
|
||||
### Includes and Defines (add further entries here):
|
||||
|
||||
INCLUDES += -I$(VDRDIR)/include
|
||||
INCLUDES +=
|
||||
|
||||
DEFINES += -D_GNU_SOURCE -DPLUGIN_NAME_I18N='"$(PLUGIN)"'
|
||||
DEFINES += -DPLUGIN_NAME_I18N='"$(PLUGIN)"'
|
||||
|
||||
### The object files (add further files here):
|
||||
|
||||
@ -51,54 +58,64 @@ OBJS = $(PLUGIN).o
|
||||
|
||||
### The main target:
|
||||
|
||||
all: libvdr-$(PLUGIN).so i18n
|
||||
all: $(SOFILE) i18n
|
||||
|
||||
### Implicit rules:
|
||||
|
||||
%.o: %.c
|
||||
$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) $<
|
||||
@echo CC $@
|
||||
$(Q)$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) -o $@ $<
|
||||
|
||||
### Dependencies:
|
||||
|
||||
MAKEDEP = $(CXX) -MM -MG
|
||||
DEPFILE = .dependencies
|
||||
$(DEPFILE): Makefile
|
||||
@$(MAKEDEP) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@
|
||||
@$(MAKEDEP) $(CXXFLAGS) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@
|
||||
|
||||
-include $(DEPFILE)
|
||||
|
||||
### Internationalization (I18N):
|
||||
|
||||
PODIR = po
|
||||
LOCALEDIR = $(VDRDIR)/locale
|
||||
I18Npo = $(wildcard $(PODIR)/*.po)
|
||||
I18Nmsgs = $(addprefix $(LOCALEDIR)/, $(addsuffix /LC_MESSAGES/vdr-$(PLUGIN).mo, $(notdir $(foreach file, $(I18Npo), $(basename $(file))))))
|
||||
I18Nmo = $(addsuffix .mo, $(foreach file, $(I18Npo), $(basename $(file))))
|
||||
I18Nmsgs = $(addprefix $(DESTDIR)$(LOCDIR)/, $(addsuffix /LC_MESSAGES/vdr-$(PLUGIN).mo, $(notdir $(foreach file, $(I18Npo), $(basename $(file))))))
|
||||
I18Npot = $(PODIR)/$(PLUGIN).pot
|
||||
|
||||
%.mo: %.po
|
||||
msgfmt -c -o $@ $<
|
||||
@echo MO $@
|
||||
$(Q)msgfmt -c -o $@ $<
|
||||
|
||||
$(I18Npot): $(wildcard *.c)
|
||||
xgettext -C -cTRANSLATORS --no-wrap --no-location -k -ktr -ktrNOOP --msgid-bugs-address='<vdr-bugs@cadsoft.de>' -o $@ $^
|
||||
@echo GT $@
|
||||
$(Q)xgettext -C -cTRANSLATORS --no-wrap --no-location -k -ktr -ktrNOOP --package-name=vdr-$(PLUGIN) --package-version=$(VERSION) --msgid-bugs-address='<see README>' -o $@ `ls $^`
|
||||
|
||||
%.po: $(I18Npot)
|
||||
msgmerge -U --no-wrap --no-location --backup=none -q $@ $<
|
||||
@echo PO $@
|
||||
$(Q)msgmerge -U --no-wrap --no-location --backup=none -q -N $@ $<
|
||||
@touch $@
|
||||
|
||||
$(I18Nmsgs): $(LOCALEDIR)/%/LC_MESSAGES/vdr-$(PLUGIN).mo: $(PODIR)/%.mo
|
||||
@mkdir -p $(dir $@)
|
||||
cp $< $@
|
||||
$(I18Nmsgs): $(DESTDIR)$(LOCDIR)/%/LC_MESSAGES/vdr-$(PLUGIN).mo: $(PODIR)/%.mo
|
||||
install -D -m644 $< $@
|
||||
|
||||
.PHONY: i18n
|
||||
i18n: $(I18Nmsgs)
|
||||
i18n: $(I18Nmo) $(I18Npot)
|
||||
|
||||
install-i18n: $(I18Nmsgs)
|
||||
|
||||
### Targets:
|
||||
|
||||
libvdr-$(PLUGIN).so: $(OBJS)
|
||||
$(CXX) $(CXXFLAGS) -shared $(OBJS) -o $@
|
||||
@cp --remove-destination $@ $(LIBDIR)/$@.$(APIVERSION)
|
||||
$(SOFILE): $(OBJS)
|
||||
@echo LD $@
|
||||
$(Q)$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS) -o $@
|
||||
|
||||
dist: clean
|
||||
install-lib: $(SOFILE)
|
||||
install -D $^ $(DESTDIR)$(LIBDIR)/$^.$(APIVERSION)
|
||||
|
||||
install: install-lib install-i18n
|
||||
|
||||
dist: $(I18Npo) clean
|
||||
@-rm -rf $(TMPDIR)/$(ARCHIVE)
|
||||
@mkdir $(TMPDIR)/$(ARCHIVE)
|
||||
@cp -a * $(TMPDIR)/$(ARCHIVE)
|
||||
|
@ -1,10 +1,10 @@
|
||||
This is a "plugin" for the Video Disk Recorder (VDR).
|
||||
|
||||
Written by: Klaus Schmidinger <kls@cadsoft.de>
|
||||
Written by: Klaus Schmidinger <vdr@tvdr.de>
|
||||
|
||||
Project's homepage: www.cadsoft.de/people/kls/vdr
|
||||
Project's homepage: https://www.tvdr.de
|
||||
|
||||
Latest version available at: www.cadsoft.de/people/kls/vdr/software.htm
|
||||
Latest version available at: https://www.tvdr.de
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
|
@ -3,7 +3,7 @@
|
||||
*
|
||||
* See the README file for copyright information and how to reach the author.
|
||||
*
|
||||
* $Id: hello.c 2.1 2008/09/06 14:30:00 kls Exp $
|
||||
* $Id: hello.c 4.1 2018/04/10 13:00:22 kls Exp $
|
||||
*/
|
||||
|
||||
#include <getopt.h>
|
||||
@ -12,7 +12,7 @@
|
||||
#include <vdr/interface.h>
|
||||
#include <vdr/plugin.h>
|
||||
|
||||
static const char *VERSION = "0.2.3";
|
||||
static const char *VERSION = "2.4.0";
|
||||
static const char *DESCRIPTION = trNOOP("A friendly greeting");
|
||||
static const char *MAINMENUENTRY = trNOOP("Hello");
|
||||
|
||||
@ -96,7 +96,7 @@ bool cPluginHello::ProcessArgs(int argc, char *argv[])
|
||||
static struct option long_options[] = {
|
||||
{ "aaa", required_argument, NULL, 'a' },
|
||||
{ "bbb", no_argument, NULL, 'b' },
|
||||
{ NULL }
|
||||
{ NULL, no_argument, NULL, 0 }
|
||||
};
|
||||
|
||||
int c;
|
||||
|
@ -1,5 +1,5 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2008 Klaus Schmidinger <kls@cadsoft.de>
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Marc Rovira Vall <tm05462@salleURL.edu>, 2003
|
||||
# Ramon Roca <ramon.roca@xcombo.com>, 2003
|
||||
@ -7,12 +7,13 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: VDR 1.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <vdr-bugs@cadsoft.de>\n"
|
||||
"POT-Creation-Date: 2007-10-13 11:52+0200\n"
|
||||
"Project-Id-Version: vdr-hello 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
||||
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
||||
"Last-Translator: Jordi Vilà <jvila@tinet.org>\n"
|
||||
"Language-Team: Catalanian\n"
|
||||
"Language-Team: Catalan <vdr@linuxtv.org>\n"
|
||||
"Language: ca\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=ISO-8859-1\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
@ -1,16 +1,17 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2008 Klaus Schmidinger <kls@cadsoft.de>
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Vladimír Bárta <vladimir.barta@k2atmitec.cz>, 2006
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: VDR 1.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <vdr-bugs@cadsoft.de>\n"
|
||||
"POT-Creation-Date: 2007-10-13 11:52+0200\n"
|
||||
"Project-Id-Version: vdr-hello 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
||||
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
||||
"Last-Translator: Vladimír Bárta <vladimir.barta@k2atmitec.cz>\n"
|
||||
"Language-Team: Czech\n"
|
||||
"Language-Team: Czech <vdr@linuxtv.org>\n"
|
||||
"Language: cs\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=ISO-8859-2\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
@ -1,16 +1,17 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2008 Klaus Schmidinger <kls@cadsoft.de>
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Mogens Elneff <mogens@elneff.dk>, 2004
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: VDR 1.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <vdr-bugs@cadsoft.de>\n"
|
||||
"POT-Creation-Date: 2007-10-13 11:52+0200\n"
|
||||
"Project-Id-Version: vdr-hello 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
||||
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
||||
"Last-Translator: Mogens Elneff <mogens@elneff.dk>\n"
|
||||
"Language-Team: Danish\n"
|
||||
"Language-Team: Danish <vdr@linuxtv.org>\n"
|
||||
"Language: da\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=ISO-8859-15\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
@ -1,16 +1,17 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2008 Klaus Schmidinger <kls@cadsoft.de>
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Klaus Schmidinger <kls@cadsoft.de>, 2000
|
||||
# Klaus Schmidinger <vdr@tvdr.de>, 2000
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: VDR 1.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <vdr-bugs@cadsoft.de>\n"
|
||||
"POT-Creation-Date: 2007-10-13 11:52+0200\n"
|
||||
"Project-Id-Version: vdr-hello 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
||||
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
||||
"Last-Translator: Klaus Schmidinger <kls@cadsoft.de>\n"
|
||||
"Language-Team: German\n"
|
||||
"Last-Translator: Klaus Schmidinger <vdr@tvdr.de>\n"
|
||||
"Language-Team: German <vdr@linuxtv.org>\n"
|
||||
"Language: de\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=ISO-8859-15\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
@ -1,16 +1,17 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2008 Klaus Schmidinger <kls@cadsoft.de>
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Dimitrios Dimitrakos <mail@dimitrios.de>, 2002
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: VDR 1.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <vdr-bugs@cadsoft.de>\n"
|
||||
"POT-Creation-Date: 2007-10-13 11:52+0200\n"
|
||||
"Project-Id-Version: vdr-hello 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
||||
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
||||
"Last-Translator: Dimitrios Dimitrakos <mail@dimitrios.de>\n"
|
||||
"Language-Team: Greek\n"
|
||||
"Language-Team: Greek <vdr@linuxtv.org>\n"
|
||||
"Language: el\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=ISO-8859-7\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
@ -1,16 +1,17 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2008 Klaus Schmidinger <kls@cadsoft.de>
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Ruben Nunez Francisco <ruben.nunez@tang-it.com>, 2002
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: VDR 1.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <vdr-bugs@cadsoft.de>\n"
|
||||
"POT-Creation-Date: 2007-10-13 11:52+0200\n"
|
||||
"Project-Id-Version: vdr-hello 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
||||
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
||||
"Last-Translator: Ruben Nunez Francisco <ruben.nunez@tang-it.com>\n"
|
||||
"Language-Team: Spanish\n"
|
||||
"Language-Team: Spanish <vdr@linuxtv.org>\n"
|
||||
"Language: es\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=ISO-8859-15\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
@ -1,34 +1,35 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2008 Klaus Schmidinger <kls@cadsoft.de>
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Arthur Konovalov <kasjas@hot.ee>, 2004
|
||||
# Arthur Konovalov <artlov@gmail.com>, 2004, 2015
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: VDR 1.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <vdr-bugs@cadsoft.de>\n"
|
||||
"POT-Creation-Date: 2007-10-13 11:52+0200\n"
|
||||
"Project-Id-Version: vdr-hello 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
||||
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
||||
"Last-Translator: Arthur Konovalov <kasjas@hot.ee>\n"
|
||||
"Language-Team: Estonian\n"
|
||||
"Last-Translator: Arthur Konovalov <artlov@gmail.com>\n"
|
||||
"Language-Team: Estonian <vdr@linuxtv.org>\n"
|
||||
"Language: et\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=ISO-8859-13\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
msgid "A friendly greeting"
|
||||
msgstr ""
|
||||
msgstr "Sõbralik tervitus"
|
||||
|
||||
msgid "Hello"
|
||||
msgstr ""
|
||||
msgstr "Tere"
|
||||
|
||||
msgid "Greeting time (s)"
|
||||
msgstr ""
|
||||
msgstr "Tervituse kestus (s)"
|
||||
|
||||
msgid "Use alternate greeting"
|
||||
msgstr ""
|
||||
msgstr "Vahelduv tervitus"
|
||||
|
||||
msgid "Howdy folks!"
|
||||
msgstr ""
|
||||
msgstr "Kuidas käsi käib?"
|
||||
|
||||
msgid "Hello world!"
|
||||
msgstr ""
|
||||
msgstr "Tere, maailm!"
|
||||
|
@ -1,25 +1,26 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2008 Klaus Schmidinger <kls@cadsoft.de>
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Hannu Savolainen <hannu@opensound.com>, 2002
|
||||
# Jaakko Hyvätti <jaakko@hyvatti.iki.fi>, 2002
|
||||
# Jaakko Hyvätti <jaakko@hyvatti.iki.fi>, 2002
|
||||
# Niko Tarnanen <niko.tarnanen@hut.fi>, 2003
|
||||
# Rolf Ahrenberg <rahrenbe@cc.hut.fi>, 2003
|
||||
# Rolf Ahrenberg <Rolf.Ahrenberg@sci.fi>, 2003
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: VDR 1.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <vdr-bugs@cadsoft.de>\n"
|
||||
"POT-Creation-Date: 2007-10-13 11:52+0200\n"
|
||||
"Project-Id-Version: vdr-hello 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
||||
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
||||
"Last-Translator: Rolf Ahrenberg <rahrenbe@cc.hut.fi>\n"
|
||||
"Language-Team: Finnish\n"
|
||||
"Last-Translator: Rolf Ahrenberg <Rolf.Ahrenberg@sci.fi>\n"
|
||||
"Language-Team: Finnish <vdr@linuxtv.org>\n"
|
||||
"Language: fi\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=ISO-8859-15\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
msgid "A friendly greeting"
|
||||
msgstr "Ystävällisin terveisin"
|
||||
msgstr "Ystävällisin terveisin"
|
||||
|
||||
msgid "Hello"
|
||||
msgstr "Hei"
|
||||
@ -28,10 +29,10 @@ msgid "Greeting time (s)"
|
||||
msgstr "Tervehdysaika (s)"
|
||||
|
||||
msgid "Use alternate greeting"
|
||||
msgstr "Käytä vaihtoehtoista tervehdystä"
|
||||
msgstr "Käytä vaihtoehtoista tervehdystä"
|
||||
|
||||
msgid "Howdy folks!"
|
||||
msgstr "Mitä kuuluu?"
|
||||
msgstr "Mitä kuuluu?"
|
||||
|
||||
msgid "Hello world!"
|
||||
msgstr "Hei maailma!"
|
||||
|
@ -1,37 +1,39 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2008 Klaus Schmidinger <kls@cadsoft.de>
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Jean-Claude Repetto <jc@repetto.org>, 2001
|
||||
# Olivier Jacques <jacquesolivier@hotmail.com>, 2003
|
||||
# Gregoire Favre <greg@magma.unil.ch>, 2003
|
||||
# Nicolas Huillard <nhuillard@e-dition.fr>, 2005
|
||||
# Bernard Jaulin <bernard.jaulin@gmail.com>, 2018
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: VDR 1.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <vdr-bugs@cadsoft.de>\n"
|
||||
"POT-Creation-Date: 2007-10-13 11:52+0200\n"
|
||||
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
||||
"Last-Translator: Nicolas Huillard <nhuillard@e-dition.fr>\n"
|
||||
"Language-Team: French\n"
|
||||
"Project-Id-Version: vdr-hello 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
||||
"PO-Revision-Date: 2018-04-14 8:34+0200\n"
|
||||
"Last-Translator: Bernard Jaulin <bernard.jaulin@gmail.com>\n"
|
||||
"Language-Team: French <vdr@linuxtv.org>\n"
|
||||
"Language: fr\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=ISO-8859-1\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
msgid "A friendly greeting"
|
||||
msgstr ""
|
||||
msgstr "Bien le bonjour"
|
||||
|
||||
msgid "Hello"
|
||||
msgstr ""
|
||||
msgstr "Hello"
|
||||
|
||||
msgid "Greeting time (s)"
|
||||
msgstr ""
|
||||
msgstr "Durée pour le salut (s)"
|
||||
|
||||
msgid "Use alternate greeting"
|
||||
msgstr ""
|
||||
msgstr "Changer de salutation"
|
||||
|
||||
msgid "Howdy folks!"
|
||||
msgstr ""
|
||||
msgstr "Bonjour à tous !"
|
||||
|
||||
msgid "Hello world!"
|
||||
msgstr ""
|
||||
msgstr "Bonjour le monde !"
|
||||
|
@ -1,16 +1,17 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2008 Klaus Schmidinger <kls@cadsoft.de>
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Adrian Caval <anrxc@sysphere.org>, 2008
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: VDR 1.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <vdr-bugs@cadsoft.de>\n"
|
||||
"POT-Creation-Date: 2007-10-13 11:52+0200\n"
|
||||
"Project-Id-Version: vdr-hello 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
||||
"PO-Revision-Date: 2008-03-17 19:52+0100\n"
|
||||
"Last-Translator: Adrian Caval <anrxc@sysphere.org>\n"
|
||||
"Language-Team: Croatian\n"
|
||||
"Language-Team: Croatian <vdr@linuxtv.org>\n"
|
||||
"Language: hr\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=ISO-8859-2\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
@ -1,17 +1,18 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2008 Klaus Schmidinger <kls@cadsoft.de>
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Istvan Koenigsberger <istvnko@hotmail.com>, 2002
|
||||
# Guido Josten <guido.josten@t-online.de>, 2002
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: VDR 1.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <vdr-bugs@cadsoft.de>\n"
|
||||
"POT-Creation-Date: 2007-10-13 11:52+0200\n"
|
||||
"Project-Id-Version: vdr-hello 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
||||
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
||||
"Last-Translator: Istvan Koenigsberger <istvnko@hotmail.com>, Guido Josten <guido.josten@t-online.de>\n"
|
||||
"Language-Team: Hungarian\n"
|
||||
"Language-Team: Hungarian <vdr@linuxtv.org>\n"
|
||||
"Language: hu\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=ISO-8859-2\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
@ -1,16 +1,17 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2008 Klaus Schmidinger <kls@cadsoft.de>
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Diego Pierotto <vdr-italian@tiscali.it>, 2008
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: VDR 1.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <vdr-bugs@cadsoft.de>\n"
|
||||
"POT-Creation-Date: 2007-10-13 11:52+0200\n"
|
||||
"Project-Id-Version: vdr-hello 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
||||
"PO-Revision-Date: 2008-01-27 20:11+0100\n"
|
||||
"Last-Translator: Diego Pierotto <vdr-italian@tiscali.it>\n"
|
||||
"Language-Team: Italian\n"
|
||||
"Language-Team: Italian <vdr@linuxtv.org>\n"
|
||||
"Language: it\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=ISO-8859-15\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
35
PLUGINS/src/hello/po/lt_LT.po
Normal file
35
PLUGINS/src/hello/po/lt_LT.po
Normal file
@ -0,0 +1,35 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Valdemaras Pipiras <varas@ambernet.lt>, 2009
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: vdr-hello 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
||||
"PO-Revision-Date: 2009-12-08 12:18+0200\n"
|
||||
"Last-Translator: Valdemaras Pipiras <varas@ambernet.lt>\n"
|
||||
"Language-Team: Lithuanian <vdr@linuxtv.org>\n"
|
||||
"Language: lt\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
msgid "A friendly greeting"
|
||||
msgstr "Draugiškas labas"
|
||||
|
||||
msgid "Hello"
|
||||
msgstr "Labas!"
|
||||
|
||||
msgid "Greeting time (s)"
|
||||
msgstr "Pasveikinomo laikas (s)"
|
||||
|
||||
msgid "Use alternate greeting"
|
||||
msgstr "Naudoti alternatyvų pasveikinimą"
|
||||
|
||||
msgid "Howdy folks!"
|
||||
msgstr "Kaip yr chebryte?"
|
||||
|
||||
msgid "Hello world!"
|
||||
msgstr "Labas pasauli!"
|
@ -1,5 +1,5 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2008 Klaus Schmidinger <kls@cadsoft.de>
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Arnold Niessen <niessen@iae.nl> <arnold.niessen@philips.com>, 2001
|
||||
# Hans Dingemans <hans.dingemans@tacticalops.nl>, 2003
|
||||
@ -7,12 +7,13 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: VDR 1.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <vdr-bugs@cadsoft.de>\n"
|
||||
"POT-Creation-Date: 2007-10-13 11:52+0200\n"
|
||||
"Project-Id-Version: vdr-hello 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
||||
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
||||
"Last-Translator: Maarten Wisse <Maarten.Wisse@urz.uni-hd.de>\n"
|
||||
"Language-Team: Dutch\n"
|
||||
"Language-Team: Dutch <vdr@linuxtv.org>\n"
|
||||
"Language: nl\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=ISO-8859-15\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
@ -1,17 +1,18 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2008 Klaus Schmidinger <kls@cadsoft.de>
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Jørgen Tvedt <pjtvedt@online.no>, 2001
|
||||
# Truls Slevigen <truls@slevigen.no>, 2002
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: VDR 1.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <vdr-bugs@cadsoft.de>\n"
|
||||
"POT-Creation-Date: 2007-10-13 11:52+0200\n"
|
||||
"Project-Id-Version: vdr-hello 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
||||
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
||||
"Last-Translator: Truls Slevigen <truls@slevigen.no>\n"
|
||||
"Language-Team: Norwegian\n"
|
||||
"Language-Team: Norwegian Nynorsk <vdr@linuxtv.org>\n"
|
||||
"Language: nn\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=ISO-8859-1\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
@ -1,34 +1,38 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2008 Klaus Schmidinger <kls@cadsoft.de>
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Michael Rakowski <mrak@gmx.de>, 2002
|
||||
# Tomasz Maciej Nowak <tmn505@gmail.com>, 2018
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: VDR 1.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <vdr-bugs@cadsoft.de>\n"
|
||||
"POT-Creation-Date: 2007-10-13 11:52+0200\n"
|
||||
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
||||
"Last-Translator: Michael Rakowski <mrak@gmx.de>\n"
|
||||
"Language-Team: Polish\n"
|
||||
"Project-Id-Version: vdr-hello 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
||||
"PO-Revision-Date: 2018-02-19 00:41+0100\n"
|
||||
"Last-Translator: Tomasz Maciej Nowak <tmn505@gmail.com>\n"
|
||||
"Language-Team: Polish <vdr@linuxtv.org>\n"
|
||||
"Language: pl_PL\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=ISO-8859-2\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
|
||||
"X-Generator: Poedit 2.0.6\n"
|
||||
|
||||
msgid "A friendly greeting"
|
||||
msgstr ""
|
||||
msgstr "Przyjazne pozdrowienie"
|
||||
|
||||
msgid "Hello"
|
||||
msgstr ""
|
||||
msgstr "Witaj"
|
||||
|
||||
msgid "Greeting time (s)"
|
||||
msgstr ""
|
||||
msgstr "Czas pozdrowienia (s)"
|
||||
|
||||
msgid "Use alternate greeting"
|
||||
msgstr ""
|
||||
msgstr "Użyj alternatywnego pozdrowienia"
|
||||
|
||||
msgid "Howdy folks!"
|
||||
msgstr ""
|
||||
msgstr "Siema ziomy!"
|
||||
|
||||
msgid "Hello world!"
|
||||
msgstr ""
|
||||
msgstr "Witaj świecie!"
|
||||
|
@ -1,16 +1,17 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2008 Klaus Schmidinger <kls@cadsoft.de>
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Paulo Lopes <pmml@netvita.pt>, 2001
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: VDR 1.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <vdr-bugs@cadsoft.de>\n"
|
||||
"POT-Creation-Date: 2007-10-13 11:52+0200\n"
|
||||
"Project-Id-Version: vdr-hello 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
||||
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
||||
"Last-Translator: Paulo Lopes <pmml@netvita.pt>\n"
|
||||
"Language-Team: Portuguese\n"
|
||||
"Language-Team: Portuguese <vdr@linuxtv.org>\n"
|
||||
"Language: pt\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=ISO-8859-1\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
@ -1,17 +1,18 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2008 Klaus Schmidinger <kls@cadsoft.de>
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Paul Lacatus <paul@campina.iiruc.ro>, 2002
|
||||
# Lucian Muresan <lucianm@users.sourceforge.net>, 2004
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: VDR 1.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <vdr-bugs@cadsoft.de>\n"
|
||||
"POT-Creation-Date: 2007-10-13 11:52+0200\n"
|
||||
"Project-Id-Version: vdr-hello 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
||||
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
||||
"Last-Translator: Lucian Muresan <lucianm@users.sourceforge.net>\n"
|
||||
"Language-Team: Romanian\n"
|
||||
"Language-Team: Romanian <vdr@linuxtv.org>\n"
|
||||
"Language: ro\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=ISO-8859-2\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
@ -1,16 +1,17 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2008 Klaus Schmidinger <kls@cadsoft.de>
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Vyacheslav Dikonov <sdiconov@mail.ru>, 2004
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: VDR 1.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <vdr-bugs@cadsoft.de>\n"
|
||||
"POT-Creation-Date: 2007-10-13 11:52+0200\n"
|
||||
"Project-Id-Version: vdr-hello 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
||||
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
||||
"Last-Translator: Vyacheslav Dikonov <sdiconov@mail.ru>\n"
|
||||
"Language-Team: Russian\n"
|
||||
"Language-Team: Russian <vdr@linuxtv.org>\n"
|
||||
"Language: ru\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=ISO-8859-5\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
35
PLUGINS/src/hello/po/sk_SK.po
Normal file
35
PLUGINS/src/hello/po/sk_SK.po
Normal file
@ -0,0 +1,35 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Vladimír Bárta <vladimir.barta@k2atmitec.cz>, 2006
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: vdr-hello 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
||||
"PO-Revision-Date: 2009-09-30 09:48+0100\n"
|
||||
"Last-Translator: Milan Hrala <hrala.milan@gmail.com>\n"
|
||||
"Language-Team: Slovak <vdr@linuxtv.org>\n"
|
||||
"Language: sk\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=ISO-8859-2\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
msgid "A friendly greeting"
|
||||
msgstr "Priateµský pozdrav"
|
||||
|
||||
msgid "Hello"
|
||||
msgstr "Ahoj"
|
||||
|
||||
msgid "Greeting time (s)"
|
||||
msgstr "Èas pozdravu (s)"
|
||||
|
||||
msgid "Use alternate greeting"
|
||||
msgstr "Pou¾i» náhradný pozdrav"
|
||||
|
||||
msgid "Howdy folks!"
|
||||
msgstr "Ahojte v¹etci!"
|
||||
|
||||
msgid "Hello world!"
|
||||
msgstr "Ahoj svet!"
|
@ -1,17 +1,18 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2008 Klaus Schmidinger <kls@cadsoft.de>
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Miha Setina <mihasetina@softhome.net>, 2000
|
||||
# Matjaz Thaler <matjaz.thaler@guest.arnes.si>, 2003
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: VDR 1.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <vdr-bugs@cadsoft.de>\n"
|
||||
"POT-Creation-Date: 2007-10-13 11:52+0200\n"
|
||||
"Project-Id-Version: vdr-hello 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
||||
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
||||
"Last-Translator: Matjaz Thaler <matjaz.thaler@guest.arnes.si>\n"
|
||||
"Language-Team: Slovenian\n"
|
||||
"Language-Team: Slovenian <vdr@linuxtv.org>\n"
|
||||
"Language: sl\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=ISO-8859-2\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
@ -1,17 +1,18 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2008 Klaus Schmidinger <kls@cadsoft.de>
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Tomas Prybil <tomas@prybil.se>, 2002
|
||||
# Jan Ekholm <chakie@infa.abo.fi>, 2003
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: VDR 1.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <vdr-bugs@cadsoft.de>\n"
|
||||
"POT-Creation-Date: 2007-10-13 11:52+0200\n"
|
||||
"Project-Id-Version: vdr-hello 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
||||
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
||||
"Last-Translator: Tomas Prybil <tomas@prybil.se>\n"
|
||||
"Language-Team: Swedish\n"
|
||||
"Language-Team: Swedish <vdr@linuxtv.org>\n"
|
||||
"Language: sv\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=ISO-8859-1\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
@ -1,16 +1,17 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2008 Klaus Schmidinger <kls@cadsoft.de>
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Oktay Yolgeçen <oktay_73@yahoo.de>, 2007
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: VDR 1.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <vdr-bugs@cadsoft.de>\n"
|
||||
"POT-Creation-Date: 2007-10-13 11:52+0200\n"
|
||||
"Project-Id-Version: vdr-hello 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
||||
"PO-Revision-Date: 2008-05-12 22:34:4800\n"
|
||||
"Last-Translator: Oktay Yolgeçen <oktay_73@yahoo.de>\n"
|
||||
"Language-Team: Turkish\n"
|
||||
"Language-Team: Turkish <vdr@linuxtv.org>\n"
|
||||
"Language: tr\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=ISO-8859-9\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
38
PLUGINS/src/hello/po/zh_CN.po
Normal file
38
PLUGINS/src/hello/po/zh_CN.po
Normal file
@ -0,0 +1,38 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Marc Rovira Vall <tm05462@salleURL.edu>, 2003
|
||||
# Ramon Roca <ramon.roca@xcombo.com>, 2003
|
||||
# Jordi Vilà <jvila@tinet.org>, 2003
|
||||
# Nan Feng VDR <nfgx@21cn.com>, 2009
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: vdr-hello 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
||||
"PO-Revision-Date: 2009-01-23 09:48+0800\n"
|
||||
"Last-Translator: senin\n"
|
||||
"Language-Team: Chinese (simplified) <vdr@linuxtv.org>\n"
|
||||
"Language: zh_CN\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=utf-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
msgid "A friendly greeting"
|
||||
msgstr "友好的问候"
|
||||
|
||||
msgid "Hello"
|
||||
msgstr "你好"
|
||||
|
||||
msgid "Greeting time (s)"
|
||||
msgstr "问候时间 (s)"
|
||||
|
||||
msgid "Use alternate greeting"
|
||||
msgstr "使用替代贺卡"
|
||||
|
||||
msgid "Howdy folks!"
|
||||
msgstr "你好人!"
|
||||
|
||||
msgid "Hello world!"
|
||||
msgstr "世界您好!"
|
@ -21,3 +21,73 @@ VDR Plugin 'osddemo' Revision History
|
||||
2008-04-13: Version 0.1.3
|
||||
|
||||
- Fixed setting the OSD level (thanks to Wolfgang Rohdewald).
|
||||
|
||||
2011-02-20: Version 0.2.0
|
||||
|
||||
- Added support for TrueColor OSD.
|
||||
|
||||
2011-03-28: Version 0.2.1
|
||||
|
||||
- Added Cancel(3) to ~cTrueColorDemo() (thanks to Reinhard Nissl).
|
||||
- Added a missing font deletion in cTrueColorDemo::Action() (thanks to Reinhard Nissl).
|
||||
|
||||
2011-04-17: Version 0.2.2
|
||||
|
||||
- Fixed a possible NULL pointer dereference in osddemo.c (reported by Paul Menzel).
|
||||
|
||||
2012-03-13: Version 0.2.3
|
||||
|
||||
- No longer using GetFont() (which is not thread safe) in the 'osddemo' plugin,
|
||||
|
||||
2012-12-27: Version 0.2.4
|
||||
|
||||
- Adapted Makefile to changes introduced in recent VDR versions.
|
||||
|
||||
2013-01-12: Version 0.2.5
|
||||
|
||||
- Adapted Makefile to changes introduced in recent VDR versions.
|
||||
|
||||
2013-02-13: Version 0.3.0
|
||||
|
||||
- Added demos of the DrawEllipse() and DrawSlope() function (press '1' or '2',
|
||||
respectively).
|
||||
|
||||
2013-02-19: Version 0.3.1
|
||||
|
||||
- The demos can now also be ended with the "Back" key.
|
||||
|
||||
2013-03-31: Version 2.0.0
|
||||
|
||||
- Official release.
|
||||
|
||||
2014-01-01: Version 2.1.1
|
||||
|
||||
- Avoiding unnecessary pkg-config warnings in plugin Makefiles.
|
||||
|
||||
2014-02-06: Version 2.1.2
|
||||
|
||||
- Fixed flickering if subtitles are active while the OSD demo is running.
|
||||
- Fixed a possible crash in the OSD demo (reported by Christopher Reimer).
|
||||
|
||||
2015-02-19: Version 2.2.0
|
||||
|
||||
- Official release.
|
||||
|
||||
2015-03-08: Version 2.3.1
|
||||
|
||||
- Now using cOsd::MaxPixmapSize().
|
||||
- Fixed a vertical black line in the "TiledPixmaps" area on the rpihddevice OSD with
|
||||
1280x800 pixel (thanks to Thomas Reufer).
|
||||
- Added a demo case for storing images (thanks to Thomas Reufer).
|
||||
|
||||
2018-04-15: Version 2.4.0
|
||||
|
||||
- Official release.
|
||||
|
||||
2020-10-12: Version 2.4.1
|
||||
|
||||
- Added test cases for alignment of semi-circles (press key '4').
|
||||
|
||||
2021-12-27: Version 2.6.0
|
||||
|
||||
- Official release.
|
||||
|
@ -1,47 +1,55 @@
|
||||
#
|
||||
# Makefile for a Video Disk Recorder plugin
|
||||
#
|
||||
# $Id: Makefile 1.11 2008/01/13 13:00:01 kls Exp $
|
||||
# $Id: Makefile 4.3 2020/06/22 15:08:46 kls Exp $
|
||||
|
||||
# The official name of this plugin.
|
||||
# This name will be used in the '-P...' option of VDR to load the plugin.
|
||||
# By default the main source file also carries this name.
|
||||
#
|
||||
|
||||
PLUGIN = osddemo
|
||||
|
||||
### The version number of this plugin (taken from the main source file):
|
||||
|
||||
VERSION = $(shell grep 'static const char \*VERSION *=' $(PLUGIN).c | awk '{ print $$6 }' | sed -e 's/[";]//g')
|
||||
|
||||
### The C++ compiler and options:
|
||||
|
||||
CXX ?= g++
|
||||
CXXFLAGS ?= -fPIC -g -O2 -Wall -Woverloaded-virtual -Wno-parentheses
|
||||
|
||||
### The directory environment:
|
||||
|
||||
VDRDIR = ../../..
|
||||
LIBDIR = ../../lib
|
||||
TMPDIR = /tmp
|
||||
# Use package data if installed...otherwise assume we're under the VDR source directory:
|
||||
PKG_CONFIG ?= pkg-config
|
||||
PKGCFG = $(if $(VDRDIR),$(shell $(PKG_CONFIG) --variable=$(1) $(VDRDIR)/vdr.pc),$(shell PKG_CONFIG_PATH="$$PKG_CONFIG_PATH:../../.." $(PKG_CONFIG) --variable=$(1) vdr))
|
||||
LIBDIR = $(call PKGCFG,libdir)
|
||||
PLGCFG = $(call PKGCFG,plgcfg)
|
||||
#
|
||||
TMPDIR ?= /tmp
|
||||
|
||||
### The compiler options:
|
||||
|
||||
export CFLAGS = $(call PKGCFG,cflags)
|
||||
export CXXFLAGS = $(call PKGCFG,cxxflags)
|
||||
|
||||
### The version number of VDR's plugin API:
|
||||
|
||||
APIVERSION = $(call PKGCFG,apiversion)
|
||||
|
||||
### Allow user defined options to overwrite defaults:
|
||||
|
||||
-include $(VDRDIR)/Make.config
|
||||
|
||||
### The version number of VDR's plugin API (taken from VDR's "config.h"):
|
||||
|
||||
APIVERSION = $(shell sed -ne '/define APIVERSION/s/^.*"\(.*\)".*$$/\1/p' $(VDRDIR)/config.h)
|
||||
-include $(PLGCFG)
|
||||
|
||||
### The name of the distribution archive:
|
||||
|
||||
ARCHIVE = $(PLUGIN)-$(VERSION)
|
||||
PACKAGE = vdr-$(ARCHIVE)
|
||||
|
||||
### The name of the shared object file:
|
||||
|
||||
SOFILE = libvdr-$(PLUGIN).so
|
||||
|
||||
### Includes and Defines (add further entries here):
|
||||
|
||||
INCLUDES += -I$(VDRDIR)/include
|
||||
INCLUDES +=
|
||||
|
||||
DEFINES += -D_GNU_SOURCE -DPLUGIN_NAME_I18N='"$(PLUGIN)"'
|
||||
DEFINES += -DPLUGIN_NAME_I18N='"$(PLUGIN)"'
|
||||
|
||||
### The object files (add further files here):
|
||||
|
||||
@ -49,27 +57,33 @@ OBJS = $(PLUGIN).o
|
||||
|
||||
### The main target:
|
||||
|
||||
all: libvdr-$(PLUGIN).so
|
||||
all: $(SOFILE)
|
||||
|
||||
### Implicit rules:
|
||||
|
||||
%.o: %.c
|
||||
$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) $<
|
||||
@echo CC $@
|
||||
$(Q)$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) -o $@ $<
|
||||
|
||||
# Dependencies:
|
||||
### Dependencies:
|
||||
|
||||
MAKEDEP = g++ -MM -MG
|
||||
MAKEDEP = $(CXX) -MM -MG
|
||||
DEPFILE = .dependencies
|
||||
$(DEPFILE): Makefile
|
||||
@$(MAKEDEP) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@
|
||||
@$(MAKEDEP) $(CXXFLAGS) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@
|
||||
|
||||
-include $(DEPFILE)
|
||||
|
||||
### Targets:
|
||||
|
||||
libvdr-$(PLUGIN).so: $(OBJS)
|
||||
$(CXX) $(CXXFLAGS) -shared $(OBJS) -o $@
|
||||
@cp --remove-destination $@ $(LIBDIR)/$@.$(APIVERSION)
|
||||
$(SOFILE): $(OBJS)
|
||||
@echo LD $@
|
||||
$(Q)$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS) -o $@
|
||||
|
||||
install-lib: $(SOFILE)
|
||||
install -D $^ $(DESTDIR)$(LIBDIR)/$^.$(APIVERSION)
|
||||
|
||||
install: install-lib
|
||||
|
||||
dist: clean
|
||||
@-rm -rf $(TMPDIR)/$(ARCHIVE)
|
||||
|
@ -1,10 +1,10 @@
|
||||
This is a "plugin" for the Video Disk Recorder (VDR).
|
||||
|
||||
Written by: Klaus Schmidinger <kls@cadsoft.de>
|
||||
Written by: Klaus Schmidinger <vdr@tvdr.de>
|
||||
|
||||
Project's homepage: http://www.cadsoft.de/vdr
|
||||
Project's homepage: https://www.tvdr.de
|
||||
|
||||
Latest version available at: http://www.cadsoft.de/vdr
|
||||
Latest version available at: https://www.tvdr.de
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
@ -19,4 +19,16 @@ Demonstration of how a plugin can have its very own OSD setup.
|
||||
It's a very primitive game that opens a small window in which the
|
||||
user can draw lines with the Up, Down, Left and Right buttons.
|
||||
The color buttons are used to switch color.
|
||||
|
||||
On a VDR system with TrueColor support it displays some of the
|
||||
possibilities available with the TrueColor OSD. Once the "Animation"
|
||||
pixmap is displayed, it can be moved around with the Up, Down, Left
|
||||
and Right buttons. The Red button turns off the "Tiled Pixmaps"
|
||||
display, and the Green button toggles the color display.
|
||||
|
||||
In both variants of the demo, pressing the '1' key displays all
|
||||
possible ellipses that can be drawn with the DrawEllipse() function,
|
||||
while pressing the '2' key shows all possible slopes the DrawSlope()
|
||||
function can draw.
|
||||
|
||||
Press Ok to close the window.
|
||||
|
@ -3,15 +3,224 @@
|
||||
*
|
||||
* See the README file for copyright information and how to reach the author.
|
||||
*
|
||||
* $Id: osddemo.c 2.1 2008/04/13 12:59:57 kls Exp $
|
||||
* $Id: osddemo.c 4.5 2020/10/14 20:32:41 kls Exp $
|
||||
*/
|
||||
|
||||
#include <vdr/osd.h>
|
||||
#include <vdr/plugin.h>
|
||||
|
||||
static const char *VERSION = "0.1.3";
|
||||
static const char *VERSION = "2.4.1";
|
||||
static const char *DESCRIPTION = "Demo of arbitrary OSD setup";
|
||||
static const char *MAINMENUENTRY = "Osd Demo";
|
||||
|
||||
// --- DrawEllipses ----------------------------------------------------------
|
||||
|
||||
void DrawEllipse(cOsd *Osd, int x1, int y1, int x2, int y2, int Quadrants)
|
||||
{
|
||||
Osd->DrawRectangle(x1 + 2, y1 + 2, x2 - 2, y2 - 2, clrGreen);
|
||||
Osd->DrawEllipse(x1 + 3, y1 + 3, x2 - 3, y2 - 3, clrRed, Quadrants);
|
||||
}
|
||||
|
||||
void DrawEllipses(cOsd *Osd)
|
||||
{
|
||||
int xa = 0;
|
||||
int ya = 0;
|
||||
int xb = Osd->Width() - 1;
|
||||
int yb = Osd->Height() - 1;
|
||||
int x0 = xa;
|
||||
int x5 = xb;
|
||||
int x1 = x0 + (xb - xa) / 5;
|
||||
int x2 = x0 + (xb - xa) * 2 / 5;
|
||||
int x3 = x0 + (xb - xa) * 3 / 5;
|
||||
int x4 = x0 + (xb - xa) * 4 / 5;
|
||||
int y0 = ya;
|
||||
int y4 = yb;
|
||||
int y2 = (y0 + y4) / 2;
|
||||
int y1 = (y0 + y2) / 2;
|
||||
int y3 = (y2 + y4) / 2;
|
||||
Osd->DrawRectangle(xa, ya, xb, yb, clrGray50);
|
||||
DrawEllipse(Osd, x4, y0, x5, y4, 0);
|
||||
DrawEllipse(Osd, x2, y1, x3, y2, 1);
|
||||
DrawEllipse(Osd, x1, y1, x2, y2, 2);
|
||||
DrawEllipse(Osd, x1, y2, x2, y3, 3);
|
||||
DrawEllipse(Osd, x2, y2, x3, y3, 4);
|
||||
DrawEllipse(Osd, x3, y1, x4, y3, 5);
|
||||
DrawEllipse(Osd, x1, y0, x3, y1, 6);
|
||||
DrawEllipse(Osd, x0, y1, x1, y3, 7);
|
||||
DrawEllipse(Osd, x1, y3, x3, y4, 8);
|
||||
DrawEllipse(Osd, x3, y0, x4, y1, -1);
|
||||
DrawEllipse(Osd, x0, y0, x1, y1, -2);
|
||||
DrawEllipse(Osd, x0, y3, x1, y4, -3);
|
||||
DrawEllipse(Osd, x3, y3, x4, y4, -4);
|
||||
Osd->Flush();
|
||||
}
|
||||
|
||||
// --- DrawSlopes ------------------------------------------------------------
|
||||
|
||||
void DrawSlope(cOsd *Osd, int x1, int y1, int x2, int y2, int Type)
|
||||
{
|
||||
Osd->DrawRectangle(x1 + 2, y1 + 2, x2 - 2, y2 - 2, clrGreen);
|
||||
Osd->DrawSlope(x1 + 3, y1 + 3, x2 - 3, y2 - 3, clrRed, Type);
|
||||
}
|
||||
|
||||
void DrawSlopes(cOsd *Osd)
|
||||
{
|
||||
int xa = 0;
|
||||
int ya = 0;
|
||||
int xb = Osd->Width() - 1;
|
||||
int yb = Osd->Height() - 1;
|
||||
int x0 = xa;
|
||||
int x4 = xb;
|
||||
int x2 = (x0 + x4) / 2;
|
||||
int x1 = (x0 + x2) / 2;
|
||||
int x3 = (x2 + x4) / 2;
|
||||
int y0 = ya;
|
||||
int y3 = yb;
|
||||
int y2 = (y0 + y3) / 2;
|
||||
int y1 = (y0 + y2) / 2;
|
||||
Osd->DrawRectangle(xa, ya, xb, yb, clrGray50);
|
||||
DrawSlope(Osd, x0, y0, x2, y1, 0);
|
||||
DrawSlope(Osd, x2, y0, x4, y1, 1);
|
||||
DrawSlope(Osd, x0, y1, x2, y2, 2);
|
||||
DrawSlope(Osd, x2, y1, x4, y2, 3);
|
||||
DrawSlope(Osd, x0, y2, x1, y3, 4);
|
||||
DrawSlope(Osd, x1, y2, x2, y3, 5);
|
||||
DrawSlope(Osd, x2, y2, x3, y3, 6);
|
||||
DrawSlope(Osd, x3, y2, x4, y3, 7);
|
||||
Osd->Flush();
|
||||
}
|
||||
|
||||
// --- DrawImages ------------------------------------------------------------
|
||||
|
||||
struct tOsdImageRef {
|
||||
int image;
|
||||
cSize size;
|
||||
};
|
||||
|
||||
#define NUMOSDIMAGES 16
|
||||
#define NUMOSDIMAGEVARIANTS 8
|
||||
|
||||
void DrawImages(cOsd *Osd)
|
||||
{
|
||||
// Create images:
|
||||
cImage *images[NUMOSDIMAGEVARIANTS];
|
||||
for (int i = 0; i < NUMOSDIMAGEVARIANTS; i++) {
|
||||
images[i] = new cImage(cSize(
|
||||
i == 0 || i == 1 ? Osd->MaxPixmapSize().Width() + 1 : rand() % Osd->Width(),
|
||||
i == 0 || i == 2 ? Osd->MaxPixmapSize().Height() + 1 : rand() % Osd->Height()));
|
||||
for (int x = 0; x < images[i]->Width(); x++) {
|
||||
for (int y = 0; y < images[i]->Height(); y++) {
|
||||
images[i]->SetPixel(cPoint(x, y),
|
||||
(!x || !y || x == images[i]->Width() - 1 || y == images[i]->Height() - 1) ? clrWhite :
|
||||
(x > images[i]->Width() / 2 ?
|
||||
(y > images[i]->Height() / 2 ? clrBlue : clrGreen) :
|
||||
(y > images[i]->Height() / 2 ? clrRed : clrYellow)));
|
||||
}
|
||||
}
|
||||
}
|
||||
// Store images:
|
||||
tOsdImageRef osdImages[NUMOSDIMAGES];
|
||||
for (int i = 0; i < NUMOSDIMAGES; i++) {
|
||||
osdImages[i].image = cOsdProvider::StoreImage(*images[i % NUMOSDIMAGEVARIANTS]);
|
||||
osdImages[i].size.Set(images[i % NUMOSDIMAGEVARIANTS]->Size());
|
||||
}
|
||||
// Delete images:
|
||||
for (int i = 0; i < NUMOSDIMAGEVARIANTS; i++)
|
||||
delete images[i];
|
||||
// Draw images:
|
||||
for (int i = 0; i < NUMOSDIMAGES; i++)
|
||||
Osd->DrawImage(cPoint(rand() % (Osd->Width() + osdImages[i].size.Width()), rand() % (Osd->Height() + osdImages[i].size.Height())).Shifted(-osdImages[i].size.Width(), -osdImages[i].size.Height()), osdImages[i].image);
|
||||
// Drop image references:
|
||||
for (int i = 0; i < NUMOSDIMAGES; i++)
|
||||
cOsdProvider::DropImage(osdImages[i].image);
|
||||
Osd->Flush();
|
||||
}
|
||||
|
||||
// --- DrawEllipseAlignments -------------------------------------------------
|
||||
|
||||
void DrawEllipseAlignments(cOsd *Osd)
|
||||
{
|
||||
cFont *Font = cFont::CreateFont(Setup.FontOsd, 20);
|
||||
int xa = 0;
|
||||
int ya = 0;
|
||||
int xb = Osd->Width() - 1;
|
||||
int yb = Osd->Height() - 1;
|
||||
Osd->DrawRectangle(xa, ya, xb, yb, clrBlack);
|
||||
int d = 50;
|
||||
int a = d / 2 + 1;
|
||||
int t = a * 2;
|
||||
int n = 30;
|
||||
for (int i = 0; i < n; i++) {
|
||||
Osd->DrawRectangle(a, t, a + d - 1, t + d - 1, clrGreen);
|
||||
Osd->DrawEllipse(a, t - d / 2, a + d - 1, t, clrGreen, 6);
|
||||
Osd->DrawEllipse(a, t + d, a + d - 1, t + d + d / 2, clrGreen, 8);
|
||||
Osd->DrawText(a + d / 3, t + d / 3, itoa(d), clrRed, clrGreen, Font);
|
||||
a += d + 5;
|
||||
d++;
|
||||
}
|
||||
d = 50;
|
||||
a = d * 3;
|
||||
n = 20;
|
||||
for (int i = 0; i < n; i++) {
|
||||
Osd->DrawRectangle(t, a, t + d - 1, a + d - 1, clrGreen);
|
||||
Osd->DrawEllipse(t - d / 2, a, t, a + d - 1, clrGreen, 7);
|
||||
Osd->DrawEllipse(t + d, a, t + d + d / 2, a + d - 1, clrGreen, 5);
|
||||
Osd->DrawText(t + d / 3, a + d / 3, itoa(d), clrRed, clrGreen, Font);
|
||||
a += d + 5;
|
||||
d++;
|
||||
}
|
||||
d = 50;
|
||||
a = d * 3;
|
||||
t = d * 5;
|
||||
n = 30;
|
||||
for (int i = 0; i < n; i++) {
|
||||
Osd->DrawRectangle(a, t, a + d - 1, t + d - 1, clrGreen);
|
||||
Osd->DrawEllipse(a, t - d, a + d - 1, t, clrGreen, 2);
|
||||
Osd->DrawEllipse(a, t + d, a + d - 1, t + d + d, clrGreen, 3);
|
||||
Osd->DrawText(a + d / 3, t + d / 3, itoa(d), clrRed, clrGreen, Font);
|
||||
a += d + 5;
|
||||
d++;
|
||||
}
|
||||
d = 50;
|
||||
a = d * 3;
|
||||
t = d * 9;
|
||||
n = 30;
|
||||
for (int i = 0; i < n; i++) {
|
||||
Osd->DrawRectangle(a, t, a + d - 1, t + d - 1, clrGreen);
|
||||
Osd->DrawEllipse(a, t - d, a + d - 1, t, clrGreen, 1);
|
||||
Osd->DrawEllipse(a, t + d, a + d - 1, t + d + d, clrGreen, 4);
|
||||
Osd->DrawText(a + d / 3, t + d / 3, itoa(d), clrRed, clrGreen, Font);
|
||||
a += d + 5;
|
||||
d++;
|
||||
}
|
||||
d = 50;
|
||||
a = d * 12;
|
||||
t = d * 5;
|
||||
n = 20;
|
||||
for (int i = 0; i < n; i++) {
|
||||
Osd->DrawRectangle(t, a, t + d - 1, a + d - 1, clrGreen);
|
||||
Osd->DrawEllipse(t - d, a, t, a + d - 1, clrGreen, 2);
|
||||
Osd->DrawEllipse(t + d, a, t + d + d, a + d - 1, clrGreen, 1);
|
||||
Osd->DrawText(t + d / 3, a + d / 3, itoa(d), clrRed, clrGreen, Font);
|
||||
a += d + 5;
|
||||
d++;
|
||||
}
|
||||
d = 50;
|
||||
a = d * 12;
|
||||
t = d * 9;
|
||||
n = 20;
|
||||
for (int i = 0; i < n; i++) {
|
||||
Osd->DrawRectangle(t, a, t + d - 1, a + d - 1, clrGreen);
|
||||
Osd->DrawEllipse(t - d, a, t, a + d - 1, clrGreen, 3);
|
||||
Osd->DrawEllipse(t + d, a, t + d + d, a + d - 1, clrGreen, 4);
|
||||
Osd->DrawText(t + d / 3, a + d / 3, itoa(d), clrRed, clrGreen, Font);
|
||||
a += d + 5;
|
||||
d++;
|
||||
}
|
||||
Osd->Flush();
|
||||
delete Font;
|
||||
}
|
||||
|
||||
// --- cLineGame -------------------------------------------------------------
|
||||
|
||||
class cLineGame : public cOsdObject {
|
||||
@ -22,7 +231,7 @@ private:
|
||||
tColor color;
|
||||
public:
|
||||
cLineGame(void);
|
||||
~cLineGame();
|
||||
virtual ~cLineGame();
|
||||
virtual void Show(void);
|
||||
virtual eOSState ProcessKey(eKeys Key);
|
||||
};
|
||||
@ -30,7 +239,7 @@ public:
|
||||
cLineGame::cLineGame(void)
|
||||
{
|
||||
osd = NULL;
|
||||
x = y = 50;
|
||||
x = y = 0;
|
||||
color = clrRed;
|
||||
}
|
||||
|
||||
@ -41,12 +250,23 @@ cLineGame::~cLineGame()
|
||||
|
||||
void cLineGame::Show(void)
|
||||
{
|
||||
osd = cOsdProvider::NewOsd(100, 50, 50);
|
||||
osd = cOsdProvider::NewOsd(cOsd::OsdLeft(), cOsd::OsdTop());
|
||||
if (osd) {
|
||||
tArea Area = { 0, 0, 99, 199, 4 };
|
||||
osd->SetAreas(&Area, 1);
|
||||
osd->DrawRectangle(0, 0, 99, 199, clrGray50);
|
||||
osd->Flush();
|
||||
int x1 = cOsd::OsdWidth() - 1;
|
||||
int y1 = cOsd::OsdHeight() - 1;
|
||||
while (x1 > 0 && y1 > 0) {
|
||||
tArea Area = { 0, 0, x1, y1, 4 };
|
||||
if (osd->CanHandleAreas(&Area, 1) == oeOk) {
|
||||
osd->SetAreas(&Area, 1);
|
||||
osd->DrawRectangle(0, 0, osd->Width() - 1, osd->Height() - 1, clrGray50);
|
||||
osd->Flush();
|
||||
x = osd->Width() / 2;
|
||||
y = osd->Height() / 2;
|
||||
break;
|
||||
}
|
||||
x1 = x1 * 9 / 10;
|
||||
y1 = y1 * 9 / 10;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -54,25 +274,420 @@ eOSState cLineGame::ProcessKey(eKeys Key)
|
||||
{
|
||||
eOSState state = cOsdObject::ProcessKey(Key);
|
||||
if (state == osUnknown) {
|
||||
const int d = 4;
|
||||
switch (Key & ~k_Repeat) {
|
||||
case kUp: if (y > 0) y--; break;
|
||||
case kDown: if (y < 196) y++; break;
|
||||
case kLeft: if (x > 0) x--; break;
|
||||
case kRight: if (x < 96) x++; break;
|
||||
case kUp: y = max(0, y - d); break;
|
||||
case kDown: y = min(osd->Height() - d, y + d); break;
|
||||
case kLeft: x = max(0, x - d); break;
|
||||
case kRight: x = min(osd->Width() - d, x + d); break;
|
||||
case kRed: color = clrRed; break;
|
||||
case kGreen: color = clrGreen; break;
|
||||
case kYellow: color = clrYellow; break;
|
||||
case kBlue: color = clrBlue; break;
|
||||
case k1: DrawEllipses(osd);
|
||||
return osContinue;
|
||||
case k2: DrawSlopes(osd);
|
||||
return osContinue;
|
||||
case kBack:
|
||||
case kOk: return osEnd;
|
||||
default: return state;
|
||||
}
|
||||
osd->DrawRectangle(x, y, x + 3, y + 3, color);
|
||||
osd->DrawRectangle(x, y, x + d - 1, y + d - 1, color);
|
||||
osd->Flush();
|
||||
state = osContinue;
|
||||
}
|
||||
return state;
|
||||
}
|
||||
|
||||
// --- cTrueColorDemo --------------------------------------------------------
|
||||
|
||||
class cTrueColorDemo : public cOsdObject, public cThread {
|
||||
private:
|
||||
cOsd *osd;
|
||||
cPoint cursor;
|
||||
cRect cursorLimits;
|
||||
bool clockwise;
|
||||
cPixmap *destroyablePixmap;
|
||||
cPixmap *toggleablePixmap;
|
||||
bool SetArea(void);
|
||||
virtual void Action(void);
|
||||
cPixmap *CreateTextPixmap(const char *s, int Line, int Layer, tColor ColorFg, tColor ColorBg, const cFont *Font);
|
||||
public:
|
||||
cTrueColorDemo(void);
|
||||
virtual ~cTrueColorDemo();
|
||||
virtual void Show(void);
|
||||
virtual eOSState ProcessKey(eKeys Key);
|
||||
};
|
||||
|
||||
cTrueColorDemo::cTrueColorDemo(void)
|
||||
{
|
||||
osd = NULL;
|
||||
clockwise = true;
|
||||
destroyablePixmap = NULL;
|
||||
toggleablePixmap = NULL;
|
||||
}
|
||||
|
||||
cTrueColorDemo::~cTrueColorDemo()
|
||||
{
|
||||
Cancel(3);
|
||||
delete osd;
|
||||
}
|
||||
|
||||
cPixmap *cTrueColorDemo::CreateTextPixmap(const char *s, int Line, int Layer, tColor ColorFg, tColor ColorBg, const cFont *Font)
|
||||
{
|
||||
const int h = Font->Height(s);
|
||||
int w = Font->Width(s);
|
||||
cPixmap *Pixmap = osd->CreatePixmap(Layer, cRect((osd->Width() - w) / 2, Line, w, h));
|
||||
if (Pixmap) {
|
||||
Pixmap->Clear();
|
||||
Pixmap->SetAlpha(0);
|
||||
Pixmap->DrawText(cPoint(0, 0), s, ColorFg, ColorBg, Font, w);
|
||||
}
|
||||
return Pixmap;
|
||||
}
|
||||
|
||||
void cTrueColorDemo::Action(void)
|
||||
{
|
||||
cPixmap *FadeInPixmap = NULL;
|
||||
cPixmap *FadeOutPixmap = NULL;
|
||||
cPixmap *MovePixmap = NULL;
|
||||
cPixmap *NextPixmap = NULL;
|
||||
cPixmap *TilePixmap = NULL;
|
||||
cPixmap *ScrollPixmap = NULL;
|
||||
cPixmap *AnimPixmap = NULL;
|
||||
cFont *OsdFont = cFont::CreateFont(Setup.FontOsd, Setup.FontOsdSize);
|
||||
cFont *SmlFont = cFont::CreateFont(Setup.FontSml, Setup.FontSmlSize);
|
||||
cFont *LrgFont = cFont::CreateFont(Setup.FontOsd, osd->Height() / 10);
|
||||
int FrameTime = 40; // ms
|
||||
int FadeTime = 1000; // ms
|
||||
int MoveTime = 4000; // ms
|
||||
int TileTime = 6000; // ms
|
||||
int ScrollWaitTime = 1000; // ms
|
||||
int ScrollLineTime = 200; // ms
|
||||
int ScrollTotalTime = 8000; // ms
|
||||
uint64_t Start = 0;
|
||||
uint64_t ScrollStartTime = 0;
|
||||
int ScrollLineNumber = 0;
|
||||
cPoint MoveStart, MoveEnd;
|
||||
cPoint TileStart, TileEnd;
|
||||
cPoint ScrollStart, ScrollEnd;
|
||||
int Line = osd->Height() / 20;
|
||||
int StartLine = Line;
|
||||
cPoint OldCursor;
|
||||
int State = 0;
|
||||
while (Running()) {
|
||||
cPixmap::Lock();
|
||||
bool Animated = false;
|
||||
uint64_t Now = cTimeMs::Now();
|
||||
if (FadeInPixmap) {
|
||||
double t = min(double(Now - Start) / FadeTime, 1.0);
|
||||
int Alpha = t * ALPHA_OPAQUE;
|
||||
FadeInPixmap->SetAlpha(Alpha);
|
||||
if (t >= 1)
|
||||
FadeInPixmap = NULL;
|
||||
Animated = true;
|
||||
}
|
||||
if (FadeOutPixmap) {
|
||||
double t = min(double(Now - Start) / FadeTime, 1.0);
|
||||
int Alpha = ALPHA_OPAQUE - t * ALPHA_OPAQUE;
|
||||
FadeOutPixmap->SetAlpha(Alpha);
|
||||
if (t >= 1)
|
||||
FadeOutPixmap = NULL;
|
||||
Animated = true;
|
||||
}
|
||||
if (MovePixmap) {
|
||||
double t = min(double(Now - Start) / MoveTime, 1.0);
|
||||
int x = MoveStart.X() + t * (MoveEnd.X() - MoveStart.X());
|
||||
int y = MoveStart.Y() + t * (MoveEnd.Y() - MoveStart.Y());
|
||||
cRect r = MovePixmap->ViewPort();
|
||||
r.SetPoint(x, y);
|
||||
MovePixmap->SetViewPort(r);
|
||||
if (t >= 1)
|
||||
MovePixmap = NULL;
|
||||
Animated = true;
|
||||
}
|
||||
if (TilePixmap) {
|
||||
double t = min(double(Now - Start) / TileTime, 1.0);
|
||||
int x = TileStart.X() + t * (TileEnd.X() - TileStart.X());
|
||||
int y = TileStart.Y() + t * (TileEnd.Y() - TileStart.Y());
|
||||
TilePixmap->SetDrawPortPoint(cPoint(x, y));
|
||||
if (t >= 1) {
|
||||
destroyablePixmap = TilePixmap;
|
||||
TilePixmap = NULL;
|
||||
}
|
||||
Animated = true;
|
||||
}
|
||||
if (ScrollPixmap) {
|
||||
if (int(Now - Start) > ScrollWaitTime) {
|
||||
if (ScrollStartTime) {
|
||||
double t = min(double(Now - ScrollStartTime) / ScrollLineTime, 1.0);
|
||||
int x = ScrollStart.X() + t * (ScrollEnd.X() - ScrollStart.X());
|
||||
int y = ScrollStart.Y() + t * (ScrollEnd.Y() - ScrollStart.Y());
|
||||
ScrollPixmap->SetDrawPortPoint(cPoint(x, y));
|
||||
if (t >= 1) {
|
||||
if (int(Now - Start) < ScrollTotalTime) {
|
||||
cRect r = ScrollPixmap->DrawPort();
|
||||
r.SetPoint(-r.X(), -r.Y());
|
||||
ScrollPixmap->Pan(cPoint(0, 0), r);
|
||||
cString s = cString::sprintf("Line %d", ++ScrollLineNumber);
|
||||
ScrollPixmap->DrawRectangle(cRect(0, ScrollPixmap->ViewPort().Height(), ScrollPixmap->DrawPort().Width(), ScrollPixmap->DrawPort().Height()), clrTransparent);
|
||||
ScrollPixmap->DrawText(cPoint(0, ScrollPixmap->ViewPort().Height()), s, clrYellow, clrTransparent, OsdFont);
|
||||
ScrollStartTime = Now;
|
||||
}
|
||||
else {
|
||||
FadeOutPixmap = ScrollPixmap;
|
||||
ScrollPixmap = NULL;
|
||||
Start = cTimeMs::Now();
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
ScrollStartTime = Now;
|
||||
}
|
||||
Animated = true;
|
||||
}
|
||||
if (AnimPixmap) {
|
||||
int d = AnimPixmap->ViewPort().Height();
|
||||
if (clockwise)
|
||||
d = -d;
|
||||
cPoint p = AnimPixmap->DrawPort().Point().Shifted(0, d);
|
||||
if (clockwise && p.Y() <= -AnimPixmap->DrawPort().Height())
|
||||
p.SetY(0);
|
||||
else if (!clockwise && p.Y() > 0)
|
||||
p.SetY(-(AnimPixmap->DrawPort().Height() - AnimPixmap->ViewPort().Height()));
|
||||
AnimPixmap->SetDrawPortPoint(p);
|
||||
}
|
||||
if (!Animated) {
|
||||
switch (State) {
|
||||
case 0: {
|
||||
FadeInPixmap = CreateTextPixmap("VDR", Line, 1, clrYellow, clrTransparent, LrgFont);
|
||||
if (FadeInPixmap)
|
||||
Line += FadeInPixmap->DrawPort().Height();
|
||||
Start = cTimeMs::Now();
|
||||
State++;
|
||||
}
|
||||
break;
|
||||
case 1: {
|
||||
FadeInPixmap = CreateTextPixmap("Video Disk Recorder", Line, 3, clrYellow, clrTransparent, OsdFont);
|
||||
if (FadeInPixmap)
|
||||
Line += FadeInPixmap->DrawPort().Height();
|
||||
Start = cTimeMs::Now();
|
||||
State++;
|
||||
}
|
||||
break;
|
||||
case 2: {
|
||||
FadeInPixmap = CreateTextPixmap("True Color OSD Demo", Line, 1, clrYellow, clrTransparent, OsdFont);
|
||||
if (FadeInPixmap)
|
||||
Line += FadeInPixmap->DrawPort().Height();
|
||||
Start = cTimeMs::Now();
|
||||
State++;
|
||||
}
|
||||
break;
|
||||
case 3: {
|
||||
NextPixmap = CreateTextPixmap("Millions of colors", Line, 1, clrYellow, clrTransparent, LrgFont);
|
||||
if (NextPixmap) {
|
||||
FadeInPixmap = NextPixmap;
|
||||
Start = cTimeMs::Now();
|
||||
StartLine = Line;
|
||||
Line += NextPixmap->DrawPort().Height();
|
||||
}
|
||||
State++;
|
||||
}
|
||||
break;
|
||||
case 4: {
|
||||
Line += osd->Height() / 10;
|
||||
int w = osd->Width() / 2;
|
||||
int h = osd->Height() - Line - osd->Height() / 10;
|
||||
cImage Image(cSize(w, h));
|
||||
for (int y = 0; y < h; y++) {
|
||||
for (int x = 0; x < w; x++)
|
||||
Image.SetPixel(cPoint(x, y), HsvToColor(360 * double(x) / w, 1 - double(y) / h, 1) | 0xDF000000);
|
||||
}
|
||||
if (cPixmap *Pixmap = osd->CreatePixmap(2, cRect((osd->Width() - w) / 2, Line, w, h))) {
|
||||
Pixmap->DrawImage(cPoint(0, 0), Image);
|
||||
toggleablePixmap = Pixmap;
|
||||
}
|
||||
State++;
|
||||
}
|
||||
break;
|
||||
case 5: {
|
||||
if (NextPixmap) {
|
||||
MovePixmap = NextPixmap;
|
||||
MoveStart = MovePixmap->ViewPort().Point();
|
||||
MoveEnd.Set(osd->Width() - MovePixmap->ViewPort().Width(), osd->Height() - MovePixmap->ViewPort().Height());
|
||||
Start = cTimeMs::Now();
|
||||
}
|
||||
State++;
|
||||
}
|
||||
break;
|
||||
case 6: {
|
||||
TilePixmap = CreateTextPixmap("Tiled Pixmaps", StartLine, 1, clrRed, clrWhite, OsdFont);
|
||||
if (TilePixmap) {
|
||||
TilePixmap->SetViewPort(TilePixmap->ViewPort().Grown(TilePixmap->DrawPort().Width(), TilePixmap->DrawPort().Height()));
|
||||
TilePixmap->SetAlpha(200);
|
||||
TilePixmap->SetTile(true);
|
||||
TileStart = TilePixmap->DrawPort().Point();
|
||||
TileEnd = TileStart.Shifted(TilePixmap->ViewPort().Width(), TilePixmap->ViewPort().Height());
|
||||
MovePixmap = TilePixmap;
|
||||
MoveStart = MovePixmap->ViewPort().Point();
|
||||
MoveEnd.Set(10, osd->Height() - MovePixmap->ViewPort().Height() - 10);
|
||||
Start = cTimeMs::Now();
|
||||
}
|
||||
State++;
|
||||
}
|
||||
break;
|
||||
case 7: {
|
||||
const char *Text = "Scrolling Pixmaps";
|
||||
int w = OsdFont->Width(Text);
|
||||
int h = OsdFont->Height();
|
||||
if (cPixmap *Pixmap = osd->CreatePixmap(2, cRect((osd->Width() - w) / 2, StartLine, w, 2 * h), cRect(0, 0, w, 3 * h))) {
|
||||
Pixmap->Clear();
|
||||
Pixmap->DrawText(cPoint(0, 0), Text, clrYellow, clrTransparent, OsdFont);
|
||||
cString s = cString::sprintf("Line %d", ++ScrollLineNumber);
|
||||
Pixmap->DrawText(cPoint(0, Pixmap->ViewPort().Height()), s, clrYellow, clrTransparent, OsdFont);
|
||||
ScrollPixmap = Pixmap;
|
||||
ScrollStart.Set(0, 0);
|
||||
ScrollEnd.Set(0, -h);
|
||||
Start = cTimeMs::Now();
|
||||
}
|
||||
State++;
|
||||
}
|
||||
break;
|
||||
case 8: {
|
||||
const char *Text = "Animation";
|
||||
const int Size = SmlFont->Width(Text) + 10;
|
||||
const int NumDots = 12;
|
||||
const int AnimFrames = NumDots;
|
||||
int Rows = min(osd->MaxPixmapSize().Height() / Size, AnimFrames);
|
||||
int Cols = (AnimFrames + Rows - 1) / Rows;
|
||||
// Temporarily using pixmap layer 0 to have the text alpha blended:
|
||||
AnimPixmap = osd->CreatePixmap(0, cRect((osd->Width() - Size) / 2, StartLine, Size, Size), cRect(0, 0, Size * Cols, Size * Rows));
|
||||
if (AnimPixmap) {
|
||||
AnimPixmap->SetAlpha(0);
|
||||
AnimPixmap->Clear();
|
||||
const int Diameter = Size / 5;
|
||||
for (int Frame = 0; Frame < AnimFrames; Frame++) {
|
||||
int x0 = Frame / Rows * Size;
|
||||
int y0 = Frame % Rows * Size;
|
||||
AnimPixmap->DrawEllipse(cRect(x0, y0, Size, Size), 0xDDFFFFFF);
|
||||
int xc = x0 + Size / 2 - Diameter / 2;
|
||||
int yc = y0 + Size / 2 - Diameter / 2;
|
||||
int Color = 0xFF;
|
||||
int Delta = Color / NumDots / 3;
|
||||
for (int a = 0; a < NumDots; a++) {
|
||||
double t = 2 * M_PI * (Frame + a) / NumDots;
|
||||
int x = xc + ((Size - Diameter) / 2 - 5) * cos(t);
|
||||
int y = yc + ((Size - Diameter) / 2 - 5) * sin(t);
|
||||
AnimPixmap->DrawEllipse(cRect(x, y, Diameter, Diameter), ArgbToColor(0xFF, Color, Color, Color));
|
||||
Color -= Delta;
|
||||
}
|
||||
AnimPixmap->DrawText(cPoint(x0, y0), Text, clrBlack, clrTransparent, SmlFont, Size, Size, taCenter);
|
||||
}
|
||||
AnimPixmap->SetLayer(3); // now setting the actual pixmap layer
|
||||
FadeInPixmap = AnimPixmap;
|
||||
LOCK_THREAD;
|
||||
OldCursor = cursor = AnimPixmap->ViewPort().Point();
|
||||
cursorLimits.Set(0, 0, osd->Width(), osd->Height());
|
||||
cursorLimits.SetRight(cursorLimits.Right() - Size);
|
||||
cursorLimits.SetBottom(cursorLimits.Bottom() - Size);
|
||||
cursorLimits.Grow(-10, -10);
|
||||
Start = cTimeMs::Now();
|
||||
}
|
||||
State++;
|
||||
}
|
||||
break;
|
||||
case 9: {
|
||||
LOCK_THREAD;
|
||||
if (cursor != OldCursor) {
|
||||
MovePixmap = AnimPixmap;
|
||||
MoveStart = MovePixmap->ViewPort().Point();
|
||||
MoveEnd = OldCursor = cursor;
|
||||
MoveTime = 500;
|
||||
Start = cTimeMs::Now();
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
osd->Flush();
|
||||
cPixmap::Unlock();
|
||||
int Delta = cTimeMs::Now() - Now;
|
||||
if (Delta < FrameTime)
|
||||
cCondWait::SleepMs(FrameTime - Delta);
|
||||
}
|
||||
destroyablePixmap = NULL;
|
||||
toggleablePixmap = NULL;
|
||||
delete OsdFont;
|
||||
delete SmlFont;
|
||||
delete LrgFont;
|
||||
}
|
||||
|
||||
bool cTrueColorDemo::SetArea(void)
|
||||
{
|
||||
if (osd) {
|
||||
tArea Area = { 0, 0, cOsd::OsdWidth() - 1, cOsd::OsdHeight() - 1, 32 };
|
||||
return osd->SetAreas(&Area, 1) == oeOk;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
void cTrueColorDemo::Show(void)
|
||||
{
|
||||
osd = cOsdProvider::NewOsd(cOsd::OsdLeft(), cOsd::OsdTop());
|
||||
if (osd) {
|
||||
if (SetArea()) {
|
||||
osd->DrawRectangle(0, 0, osd->Width() - 1, osd->Height() - 1, clrGray50);
|
||||
osd->Flush();
|
||||
Start();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
eOSState cTrueColorDemo::ProcessKey(eKeys Key)
|
||||
{
|
||||
eOSState state = cOsdObject::ProcessKey(Key);
|
||||
if (state == osUnknown) {
|
||||
LOCK_PIXMAPS;
|
||||
LOCK_THREAD;
|
||||
const int d = 80;
|
||||
switch (Key & ~k_Repeat) {
|
||||
case kUp: cursor.SetY(max(cursorLimits.Top(), cursor.Y() - d)); clockwise = false; break;
|
||||
case kDown: cursor.SetY(min(cursorLimits.Bottom(), cursor.Y() + d)); clockwise = true; break;
|
||||
case kLeft: cursor.SetX(max(cursorLimits.Left(), cursor.X() - d)); clockwise = false; break;
|
||||
case kRight: cursor.SetX(min(cursorLimits.Right(), cursor.X() + d)); clockwise = true; break;
|
||||
case kRed: if (destroyablePixmap) {
|
||||
osd->DestroyPixmap(destroyablePixmap);
|
||||
destroyablePixmap = NULL;
|
||||
}
|
||||
break;
|
||||
case kGreen: if (toggleablePixmap)
|
||||
toggleablePixmap->SetLayer(-toggleablePixmap->Layer());
|
||||
break;
|
||||
case k1: Cancel(3);
|
||||
SetArea();
|
||||
DrawEllipses(osd);
|
||||
break;
|
||||
case k2: Cancel(3);
|
||||
SetArea();
|
||||
DrawSlopes(osd);
|
||||
break;
|
||||
case k3: Cancel(3);
|
||||
SetArea();
|
||||
DrawImages(osd);
|
||||
break;
|
||||
case k4: Cancel(3);
|
||||
SetArea();
|
||||
DrawEllipseAlignments(osd);
|
||||
return osContinue;
|
||||
case kBack:
|
||||
case kOk: return osEnd;
|
||||
default: return state;
|
||||
}
|
||||
state = osContinue;
|
||||
}
|
||||
return state;
|
||||
}
|
||||
|
||||
// --- cPluginOsddemo --------------------------------------------------------
|
||||
|
||||
class cPluginOsddemo : public cPlugin {
|
||||
@ -131,6 +746,8 @@ void cPluginOsddemo::Housekeeping(void)
|
||||
cOsdObject *cPluginOsddemo::MainMenuAction(void)
|
||||
{
|
||||
// Perform the action when selected from the main VDR menu.
|
||||
if (cOsdProvider::SupportsTrueColor())
|
||||
return new cTrueColorDemo;
|
||||
return new cLineGame;
|
||||
}
|
||||
|
||||
|
@ -9,7 +9,7 @@ VDR Plugin 'pictures' Revision History
|
||||
|
||||
- Fixed the Play function (when used from a directory in the pictures menu
|
||||
it always started with the next directory).
|
||||
- Added Finnish texts (thanks to Rolf Ahrenberg <rahrenbe@cc.hut.fi>).
|
||||
- Added Finnish texts (thanks to Rolf Ahrenberg <Rolf.Ahrenberg@sci.fi>).
|
||||
|
||||
2008-01-27: Version 0.0.3
|
||||
|
||||
@ -33,3 +33,90 @@ VDR Plugin 'pictures' Revision History
|
||||
2008-03-14: Version 0.0.7
|
||||
|
||||
- Added Russian translations (thanks to Alexander Gross).
|
||||
|
||||
2009-12-06: Version 0.0.8
|
||||
|
||||
- Several code modifications to avoid compiler warnings (thanks to Winfried Köhler).
|
||||
|
||||
2010-02-28: Version 0.0.9
|
||||
|
||||
- Added Lithuanian language translations (thanks to Valdemaras Pipiras).
|
||||
|
||||
2011-02-20: Version 0.1.0
|
||||
|
||||
- Fixed reallocating memory (reported by Paul Menzel).
|
||||
|
||||
2011-07-23:
|
||||
|
||||
- Now rotating images according to the EXIF 'Orientation' parameter.
|
||||
|
||||
2011-08-14:
|
||||
|
||||
- The pic2mpg script now generates HD images (thanks to Andre Weidemann for his
|
||||
support in using convert/ffmpeg). The old SD version is still available as
|
||||
pic2mpg-sd.
|
||||
|
||||
2011-11-02:
|
||||
|
||||
- Fixed handling images that are rotated by 180 degrees in pic2mpg.
|
||||
|
||||
2012-01-08:
|
||||
|
||||
- Added option -o to pic2mpg.
|
||||
|
||||
2012-02-17:
|
||||
|
||||
- cReadDir::Next() now skips directory entries "." and "..".
|
||||
|
||||
2012-02-27: Version 0.1.2
|
||||
|
||||
- Removed an obsolete command line option.
|
||||
|
||||
2012-04-28: Version 0.1.3
|
||||
|
||||
- Added cPictureControl::GetHeader().
|
||||
|
||||
2012-12-27: Version 0.1.4
|
||||
|
||||
- Adapted Makefile to changes introduced in recent VDR versions.
|
||||
|
||||
2013-01-12: Version 0.1.5
|
||||
|
||||
- Adapted Makefile to changes introduced in recent VDR versions.
|
||||
|
||||
2013-03-31: Version 2.0.0
|
||||
|
||||
- Official release.
|
||||
|
||||
2013-07-01:
|
||||
|
||||
- Added option -x to pic2mpg.
|
||||
|
||||
2014-01-01: Version 2.1.1
|
||||
|
||||
- Avoiding unnecessary pkg-config warnings in plugin Makefiles.
|
||||
|
||||
2015-02-19: Version 2.2.0
|
||||
|
||||
- Official release.
|
||||
|
||||
2015-07-23: Version 2.3.1
|
||||
|
||||
- Added a missing 'const'.
|
||||
|
||||
2017-10-06: Version 2.3.2
|
||||
|
||||
- Adapted the pic2mpg script to new ffmpeg options.
|
||||
- No longer using 'convert' to scale/rotate the pictures.
|
||||
|
||||
2018-04-15: Version 2.4.0
|
||||
|
||||
- Official release.
|
||||
|
||||
2021-12-27: Version 2.6.0
|
||||
|
||||
- Official release.
|
||||
|
||||
2022-12-05: Version 2.6.1
|
||||
|
||||
Fixed initializing cPictureControl.
|
||||
|
@ -1,49 +1,56 @@
|
||||
#
|
||||
# Makefile for a Video Disk Recorder plugin
|
||||
#
|
||||
# $Id: Makefile 1.2 2008/01/13 13:00:04 kls Exp $
|
||||
# $Id: Makefile 4.3 2020/06/22 15:08:46 kls Exp $
|
||||
|
||||
# The official name of this plugin.
|
||||
# This name will be used in the '-P...' option of VDR to load the plugin.
|
||||
# By default the main source file also carries this name.
|
||||
# IMPORTANT: the presence of this macro is important for the Make.config
|
||||
# file. So it must be defined, even if it is not used here!
|
||||
#
|
||||
|
||||
PLUGIN = pictures
|
||||
|
||||
### The version number of this plugin (taken from the main source file):
|
||||
|
||||
VERSION = $(shell grep 'static const char \*VERSION *=' $(PLUGIN).c | awk '{ print $$6 }' | sed -e 's/[";]//g')
|
||||
|
||||
### The C++ compiler and options:
|
||||
|
||||
CXX ?= g++
|
||||
CXXFLAGS ?= -fPIC -g -O2 -Wall -Woverloaded-virtual -Wno-parentheses
|
||||
|
||||
### The directory environment:
|
||||
|
||||
VDRDIR = ../../..
|
||||
LIBDIR = ../../lib
|
||||
TMPDIR = /tmp
|
||||
# Use package data if installed...otherwise assume we're under the VDR source directory:
|
||||
PKG_CONFIG ?= pkg-config
|
||||
PKGCFG = $(if $(VDRDIR),$(shell $(PKG_CONFIG) --variable=$(1) $(VDRDIR)/vdr.pc),$(shell PKG_CONFIG_PATH="$$PKG_CONFIG_PATH:../../.." $(PKG_CONFIG) --variable=$(1) vdr))
|
||||
LIBDIR = $(call PKGCFG,libdir)
|
||||
LOCDIR = $(call PKGCFG,locdir)
|
||||
PLGCFG = $(call PKGCFG,plgcfg)
|
||||
#
|
||||
TMPDIR ?= /tmp
|
||||
|
||||
### The compiler options:
|
||||
|
||||
export CFLAGS = $(call PKGCFG,cflags)
|
||||
export CXXFLAGS = $(call PKGCFG,cxxflags)
|
||||
|
||||
### The version number of VDR's plugin API:
|
||||
|
||||
APIVERSION = $(call PKGCFG,apiversion)
|
||||
|
||||
### Allow user defined options to overwrite defaults:
|
||||
|
||||
-include $(VDRDIR)/Make.config
|
||||
|
||||
### The version number of VDR's plugin API (taken from VDR's "config.h"):
|
||||
|
||||
APIVERSION = $(shell sed -ne '/define APIVERSION/s/^.*"\(.*\)".*$$/\1/p' $(VDRDIR)/config.h)
|
||||
-include $(PLGCFG)
|
||||
|
||||
### The name of the distribution archive:
|
||||
|
||||
ARCHIVE = $(PLUGIN)-$(VERSION)
|
||||
PACKAGE = vdr-$(ARCHIVE)
|
||||
|
||||
### The name of the shared object file:
|
||||
|
||||
SOFILE = libvdr-$(PLUGIN).so
|
||||
|
||||
### Includes and Defines (add further entries here):
|
||||
|
||||
INCLUDES += -I$(VDRDIR)/include
|
||||
INCLUDES +=
|
||||
|
||||
DEFINES += -D_GNU_SOURCE -DPLUGIN_NAME_I18N='"$(PLUGIN)"'
|
||||
DEFINES += -DPLUGIN_NAME_I18N='"$(PLUGIN)"'
|
||||
|
||||
### The object files (add further files here):
|
||||
|
||||
@ -51,54 +58,64 @@ OBJS = $(PLUGIN).o entry.o menu.o player.o
|
||||
|
||||
### The main target:
|
||||
|
||||
all: libvdr-$(PLUGIN).so i18n
|
||||
all: $(SOFILE) i18n
|
||||
|
||||
### Implicit rules:
|
||||
|
||||
%.o: %.c
|
||||
$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) $<
|
||||
@echo CC $@
|
||||
$(Q)$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) -o $@ $<
|
||||
|
||||
### Dependencies:
|
||||
|
||||
MAKEDEP = $(CXX) -MM -MG
|
||||
DEPFILE = .dependencies
|
||||
$(DEPFILE): Makefile
|
||||
@$(MAKEDEP) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@
|
||||
@$(MAKEDEP) $(CXXFLAGS) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@
|
||||
|
||||
-include $(DEPFILE)
|
||||
|
||||
### Internationalization (I18N):
|
||||
|
||||
PODIR = po
|
||||
LOCALEDIR = $(VDRDIR)/locale
|
||||
I18Npo = $(wildcard $(PODIR)/*.po)
|
||||
I18Nmsgs = $(addprefix $(LOCALEDIR)/, $(addsuffix /LC_MESSAGES/vdr-$(PLUGIN).mo, $(notdir $(foreach file, $(I18Npo), $(basename $(file))))))
|
||||
I18Nmo = $(addsuffix .mo, $(foreach file, $(I18Npo), $(basename $(file))))
|
||||
I18Nmsgs = $(addprefix $(DESTDIR)$(LOCDIR)/, $(addsuffix /LC_MESSAGES/vdr-$(PLUGIN).mo, $(notdir $(foreach file, $(I18Npo), $(basename $(file))))))
|
||||
I18Npot = $(PODIR)/$(PLUGIN).pot
|
||||
|
||||
%.mo: %.po
|
||||
msgfmt -c -o $@ $<
|
||||
@echo MO $@
|
||||
$(Q)msgfmt -c -o $@ $<
|
||||
|
||||
$(I18Npot): $(wildcard *.c)
|
||||
xgettext -C -cTRANSLATORS --no-wrap --no-location -k -ktr -ktrNOOP --msgid-bugs-address='<vdr-bugs@cadsoft.de>' -o $@ $^
|
||||
@echo GT $@
|
||||
$(Q)xgettext -C -cTRANSLATORS --no-wrap --no-location -k -ktr -ktrNOOP --package-name=vdr-$(PLUGIN) --package-version=$(VERSION) --msgid-bugs-address='<see README>' -o $@ `ls $^`
|
||||
|
||||
%.po: $(I18Npot)
|
||||
msgmerge -U --no-wrap --no-location --backup=none -q $@ $<
|
||||
@echo PO $@
|
||||
$(Q)msgmerge -U --no-wrap --no-location --backup=none -q -N $@ $<
|
||||
@touch $@
|
||||
|
||||
$(I18Nmsgs): $(LOCALEDIR)/%/LC_MESSAGES/vdr-$(PLUGIN).mo: $(PODIR)/%.mo
|
||||
@mkdir -p $(dir $@)
|
||||
cp $< $@
|
||||
$(I18Nmsgs): $(DESTDIR)$(LOCDIR)/%/LC_MESSAGES/vdr-$(PLUGIN).mo: $(PODIR)/%.mo
|
||||
install -D -m644 $< $@
|
||||
|
||||
.PHONY: i18n
|
||||
i18n: $(I18Nmsgs) $(I18Npot)
|
||||
i18n: $(I18Nmo) $(I18Npot)
|
||||
|
||||
install-i18n: $(I18Nmsgs)
|
||||
|
||||
### Targets:
|
||||
|
||||
libvdr-$(PLUGIN).so: $(OBJS)
|
||||
$(CXX) $(CXXFLAGS) -shared $(OBJS) -o $@
|
||||
@cp --remove-destination $@ $(LIBDIR)/$@.$(APIVERSION)
|
||||
$(SOFILE): $(OBJS)
|
||||
@echo LD $@
|
||||
$(Q)$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS) -o $@
|
||||
|
||||
dist: clean
|
||||
install-lib: $(SOFILE)
|
||||
install -D $^ $(DESTDIR)$(LIBDIR)/$^.$(APIVERSION)
|
||||
|
||||
install: install-lib install-i18n
|
||||
|
||||
dist: $(I18Npo) clean
|
||||
@-rm -rf $(TMPDIR)/$(ARCHIVE)
|
||||
@mkdir $(TMPDIR)/$(ARCHIVE)
|
||||
@cp -a * $(TMPDIR)/$(ARCHIVE)
|
||||
@ -107,4 +124,5 @@ dist: clean
|
||||
@echo Distribution package created as $(PACKAGE).tgz
|
||||
|
||||
clean:
|
||||
@-rm -f $(OBJS) $(DEPFILE) *.so *.tgz core* *~ $(PODIR)/*.mo $(PODIR)/*.pot
|
||||
@-rm -f $(PODIR)/*.mo $(PODIR)/*.pot
|
||||
@-rm -f $(OBJS) $(DEPFILE) *.so *.tgz core* *~
|
||||
|
@ -1,10 +1,10 @@
|
||||
This is a "plugin" for the Video Disk Recorder (VDR).
|
||||
|
||||
Written by: Klaus Schmidinger <kls@cadsoft.de>
|
||||
Written by: Klaus Schmidinger <vdr@tvdr.de>
|
||||
|
||||
Project's homepage: www.cadsoft.de/vdr
|
||||
Project's homepage: https://www.tvdr.de
|
||||
|
||||
Latest version available at: www.cadsoft.de/vdr
|
||||
Latest version available at: https://www.tvdr.de
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
|
@ -3,7 +3,7 @@
|
||||
*
|
||||
* See the README file for copyright information and how to reach the author.
|
||||
*
|
||||
* $Id: entry.c 1.3 2008/02/17 13:42:34 kls Exp $
|
||||
* $Id: entry.c 2.1 2012/02/17 14:00:28 kls Exp $
|
||||
*/
|
||||
|
||||
#include "entry.h"
|
||||
@ -48,13 +48,11 @@ void cPictureEntry::Load(void) const
|
||||
if (d.Ok()) {
|
||||
struct dirent *e;
|
||||
while ((e = d.Next()) != NULL) {
|
||||
if (strcmp(e->d_name, ".") && strcmp(e->d_name, "..")) {
|
||||
struct stat ds;
|
||||
if (stat(AddDirectory(Directory, e->d_name), &ds) == 0) {
|
||||
if (!entries)
|
||||
entries = new cList<cPictureEntry>;
|
||||
entries->Add(new cPictureEntry(e->d_name, this, S_ISDIR(ds.st_mode)));
|
||||
}
|
||||
struct stat ds;
|
||||
if (stat(AddDirectory(Directory, e->d_name), &ds) == 0) {
|
||||
if (!entries)
|
||||
entries = new cList<cPictureEntry>;
|
||||
entries->Add(new cPictureEntry(e->d_name, this, S_ISDIR(ds.st_mode)));
|
||||
}
|
||||
}
|
||||
if (entries)
|
||||
|
@ -3,7 +3,7 @@
|
||||
*
|
||||
* See the README file for copyright information and how to reach the author.
|
||||
*
|
||||
* $Id: menu.c 1.1 2008/01/13 11:35:18 kls Exp $
|
||||
* $Id: menu.c 4.1 2015/07/17 10:13:56 kls Exp $
|
||||
*/
|
||||
|
||||
#include "menu.h"
|
||||
@ -85,7 +85,7 @@ eOSState cPictureMenu::SelectItem(const char *Path, bool SlideShow)
|
||||
if (Item) {
|
||||
const cList<cPictureEntry> *l = pictureEntry->Entries();
|
||||
if (l) {
|
||||
cPictureEntry *pe = l->Get(Current());
|
||||
const cPictureEntry *pe = l->Get(Current());
|
||||
if (pe) {
|
||||
if (SlideShow) {
|
||||
cControl::Launch(new cPictureControl(pictures, pe, true));
|
||||
|
@ -7,62 +7,49 @@
|
||||
#
|
||||
# See the README file for copyright information and how to reach the author.
|
||||
#
|
||||
# $Id: pic2mpg 1.4 2008/02/29 14:34:22 kls Exp $
|
||||
|
||||
## TODO implement HDTV (1920 x 1080)
|
||||
# $Id: pic2mpg 4.1 2017/10/06 14:42:18 kls Exp $
|
||||
|
||||
use File::Path;
|
||||
use File::Spec;
|
||||
use Getopt::Std;
|
||||
use Image::Size;
|
||||
use Image::ExifTool qw(:Public);
|
||||
|
||||
$Usage = qq{
|
||||
Usage: $0 [options] picture-dir mpeg-dir
|
||||
$0 [options] picture-file mpeg-file
|
||||
|
||||
Options: -a Aspect ratio 4:3 (default is 16:9)
|
||||
-f Force conversion
|
||||
Options: -f Force conversion
|
||||
-h print Help
|
||||
-i Ignore unknown file types
|
||||
-n NTSC (default is PAL)
|
||||
-o percent overscan in percent
|
||||
-s size Screen size (WIDTHxHEIGHT, default is 1920x1080)
|
||||
-v num Verbose (0=none, 1=list files, 2=detailed)
|
||||
-x percent X overscan in percent
|
||||
-y percent Y overscan in percent
|
||||
-x dir[,...] eXclude the given directories
|
||||
};
|
||||
|
||||
getopts("afhinv:x:y:") || die $Usage;
|
||||
getopts("fho:s:v:x:") || die $Usage;
|
||||
|
||||
die $Usage if $opt_h;
|
||||
|
||||
$Aspect = $opt_a;
|
||||
$Force = $opt_f;
|
||||
$Ignore = $opt_i;
|
||||
$NTSC = $opt_n;
|
||||
$Overscan = $opt_o || 0;
|
||||
$Size = $opt_s || "1920x1080";
|
||||
$Verbose = $opt_v;
|
||||
$OverscanX = $opt_x;
|
||||
$OverscanY = $opt_y;
|
||||
@Exclude = split(',', $opt_x || "");
|
||||
|
||||
$ListFiles = $Verbose >= 1;
|
||||
$Detailed = $Verbose >= 2;
|
||||
|
||||
# Screen size:
|
||||
# Supported picture types:
|
||||
|
||||
$SW = $NTSC ? 720 : 720;
|
||||
$SH = $NTSC ? 480 : 576;
|
||||
|
||||
$ScreenRatio = $Aspect ? 4 / 3 : 16 / 9;
|
||||
|
||||
# Converter programs:
|
||||
|
||||
%PNMCONV = (
|
||||
bmp => "bmptopnm",
|
||||
gif => "giftopnm",
|
||||
jpeg => "jpegtopnm",
|
||||
jpg => "jpegtopnm",
|
||||
png => "pngtopnm",
|
||||
pnm => "cat",
|
||||
tif => "tifftopnm",
|
||||
tiff => "tifftopnm",
|
||||
%PICTYPES = (
|
||||
bmp => 1,
|
||||
gif => 1,
|
||||
jpeg => 1,
|
||||
jpg => 1,
|
||||
png => 1,
|
||||
pnm => 1,
|
||||
tif => 1,
|
||||
tiff => 1,
|
||||
);
|
||||
|
||||
# Command options:
|
||||
@ -71,12 +58,14 @@ die "$0: missing parameter\n" unless $ARGV[0] && $ARGV[1];
|
||||
die "$0: file or directory not found: $ARGV[0]\n" unless -e $ARGV[0];
|
||||
die "$0: source and destination must be different\n" if $ARGV[0] eq $ARGV[1];
|
||||
|
||||
$verbose1 = $Detailed ? "--verbose" : "";
|
||||
$verbose2 = $Detailed ? "-v 2" : "-v 0";
|
||||
$system1 = $NTSC ? "" : "--pal";
|
||||
$system2 = $NTSC ? "n" : "p";
|
||||
$framerate = $NTSC ? "30000:1001" : "25:1";
|
||||
$aspect = $Aspect ? "2" : "3";
|
||||
$Extent = $Size;
|
||||
if ($Overscan > 0) {
|
||||
my ($x, $y) = $Size =~ /(.*)x(.*)/;
|
||||
my $r = (100 + $Overscan) / 100;
|
||||
$x = int($x * $r + 0.5);
|
||||
$y = int($y * $r + 0.5);
|
||||
$Extent = "${x}x$y";
|
||||
}
|
||||
|
||||
# Convert a single file:
|
||||
|
||||
@ -95,10 +84,14 @@ $MPGDIR = File::Spec->rel2abs($ARGV[1]);
|
||||
|
||||
chdir($PICDIR) || die "$PICDIR: $!\n";
|
||||
|
||||
@Pictures = `find -type f`;
|
||||
@Pictures = `find -type f | sort`;
|
||||
chomp(@Pictures);
|
||||
|
||||
PIC:
|
||||
for $pic (@Pictures) {
|
||||
for (@Exclude) {
|
||||
next PIC if ($pic =~ /\/$_\//);
|
||||
}
|
||||
my $mpg = "$MPGDIR/$pic.mpg";
|
||||
if ($Force || !-e $mpg || -M $mpg > -M $pic) {
|
||||
(my $dir = $mpg) =~ s/\/[^\/]*$//;
|
||||
@ -135,7 +128,7 @@ for ($i = 0; $i < 10; $i++) { # dirs might become empty when removing empty subd
|
||||
for $dir (@Dirs) {
|
||||
$dir = EscapeMeta($dir);
|
||||
print "removing $dir\n";
|
||||
!system("rm -rf $dir") || die "$dir: $!\n";
|
||||
Exec("rm -rf $dir");
|
||||
}
|
||||
}
|
||||
|
||||
@ -145,32 +138,22 @@ sub ConvertFile
|
||||
{
|
||||
my ($Pict, $Mpeg) = @_;
|
||||
(my $Type) = lc($Pict) =~ /\.([^\.]*)$/;
|
||||
if (!defined $PNMCONV{$Type}) {
|
||||
return if ($Ignore);
|
||||
die "unknown file type '$Type': '$Pict'\n";
|
||||
}
|
||||
my ($w, $h) = imgsize($Pict);
|
||||
print "image size is $w x $h\n" if ($Detailed);
|
||||
if ($w / $h <= $ScreenRatio) {
|
||||
$w = $h * $ScreenRatio;
|
||||
}
|
||||
else {
|
||||
$h = $w / $ScreenRatio;
|
||||
}
|
||||
my $ScaleW = $SW / $w * (100 - 2 * $OverscanX) / 100;
|
||||
my $ScaleH = $SH / $h * (100 - 2 * $OverscanY) / 100;
|
||||
return if (!defined $PICTYPES{$Type});
|
||||
my $Exif = ImageInfo($Pict);
|
||||
my $Orientation = $$Exif{"Orientation"};
|
||||
my ($Degrees) = $Orientation =~ /Rotate ([0-9]+)/;
|
||||
my $Rotate = ($Degrees == 90) ? "transpose=clock" : ($Degrees == 180) ? "hflip,vflip" : ($Degrees == 270) ? "transpose=cclock" : "";
|
||||
$Rotate .= ',' if ($Rotate);
|
||||
my $Background = '#000000@1';
|
||||
print "orientation = '$Orientation' -> rotation = $Rotate\n" if ($Detailed);
|
||||
$Pict = EscapeMeta($Pict);
|
||||
$Mpeg = EscapeMeta($Mpeg);
|
||||
print "$Pict -> $Mpeg\n" if $ListFiles;
|
||||
my $Cmd = "$PNMCONV{$Type} $Pict 2> /dev/null |"
|
||||
. "pnmscale $verbose1 --xscale=$ScaleW --yscale=$ScaleH |"
|
||||
. "pnmpad $verbose1 --black --width $SW --height $SH |"
|
||||
. "ppmntsc $verbose1 $system1 |"
|
||||
. "ppmtoy4m $verbose2 -F $framerate -I p -S 420mpeg2 |"
|
||||
. "mpeg2enc $verbose2 -f 3 -b 12500 -a $aspect -q 1 -n $system2 -o $Mpeg";
|
||||
!system($Cmd) || die "$Cmd: $!\n";
|
||||
print "$Pict -> $Mpeg $Rotate\n" if $ListFiles;
|
||||
my $Cmd = "ffmpeg -i $Pict -vf '${Rotate}scale=1920:1080:force_original_aspect_ratio=decrease,pad=1920:1080:(ow-iw)/2:(oh-ih)/2:$Background' -c:v libx264 -pix_fmt yuv420p -f mpegts -y $Mpeg "
|
||||
. ($Detailed ? "" : "2>/dev/null");
|
||||
Exec($Cmd);
|
||||
$Cmd = "touch -r $Pict $Mpeg";
|
||||
!system($Cmd) || die "$Cmd: $!\n";
|
||||
Exec($Cmd);
|
||||
}
|
||||
|
||||
sub EscapeMeta
|
||||
@ -180,3 +163,10 @@ sub EscapeMeta
|
||||
$s =~ s/([$META])/\\$1/g;
|
||||
return $s;
|
||||
}
|
||||
|
||||
sub Exec
|
||||
{
|
||||
my $Cmd = shift;
|
||||
print "==> '$Cmd'\n" if ($Verbose);
|
||||
!system($Cmd) || die "$Cmd: $!\n";
|
||||
}
|
||||
|
193
PLUGINS/src/pictures/pic2mpg-sd
Executable file
193
PLUGINS/src/pictures/pic2mpg-sd
Executable file
@ -0,0 +1,193 @@
|
||||
#!/usr/bin/perl
|
||||
|
||||
# pic2mpg: Convert picture files to MPEG still frames
|
||||
#
|
||||
# Converts either a single picture file or all files in a
|
||||
# given directory (recursively) to MPEG still frames.
|
||||
#
|
||||
# See the README file for copyright information and how to reach the author.
|
||||
#
|
||||
# $Id: pic2mpg-sd 2.1 2011/07/23 14:23:59 kls Exp $
|
||||
|
||||
## TODO implement HDTV (1920 x 1080)
|
||||
|
||||
use File::Path;
|
||||
use File::Spec;
|
||||
use Getopt::Std;
|
||||
use Image::ExifTool qw(:Public);
|
||||
use Image::Size;
|
||||
|
||||
$Usage = qq{
|
||||
Usage: $0 [options] picture-dir mpeg-dir
|
||||
$0 [options] picture-file mpeg-file
|
||||
|
||||
Options: -a Aspect ratio 4:3 (default is 16:9)
|
||||
-f Force conversion
|
||||
-h print Help
|
||||
-i Ignore unknown file types
|
||||
-n NTSC (default is PAL)
|
||||
-v num Verbose (0=none, 1=list files, 2=detailed)
|
||||
-x percent X overscan in percent
|
||||
-y percent Y overscan in percent
|
||||
};
|
||||
|
||||
getopts("afhinv:x:y:") || die $Usage;
|
||||
|
||||
die $Usage if $opt_h;
|
||||
|
||||
$Aspect = $opt_a;
|
||||
$Force = $opt_f;
|
||||
$Ignore = $opt_i;
|
||||
$NTSC = $opt_n;
|
||||
$Verbose = $opt_v;
|
||||
$OverscanX = $opt_x;
|
||||
$OverscanY = $opt_y;
|
||||
|
||||
$ListFiles = $Verbose >= 1;
|
||||
$Detailed = $Verbose >= 2;
|
||||
|
||||
# Screen size:
|
||||
|
||||
$SW = $NTSC ? 720 : 720;
|
||||
$SH = $NTSC ? 480 : 576;
|
||||
|
||||
$ScreenRatio = $Aspect ? 4 / 3 : 16 / 9;
|
||||
|
||||
# Converter programs:
|
||||
|
||||
%PNMCONV = (
|
||||
bmp => "bmptopnm",
|
||||
gif => "giftopnm",
|
||||
jpeg => "jpegtopnm",
|
||||
jpg => "jpegtopnm",
|
||||
png => "pngtopnm",
|
||||
pnm => "cat",
|
||||
tif => "tifftopnm",
|
||||
tiff => "tifftopnm",
|
||||
);
|
||||
|
||||
# Command options:
|
||||
|
||||
die "$0: missing parameter\n" unless $ARGV[0] && $ARGV[1];
|
||||
die "$0: file or directory not found: $ARGV[0]\n" unless -e $ARGV[0];
|
||||
die "$0: source and destination must be different\n" if $ARGV[0] eq $ARGV[1];
|
||||
|
||||
$verbose1 = $Detailed ? "--verbose" : "";
|
||||
$verbose2 = $Detailed ? "-v 2" : "-v 0";
|
||||
$system1 = $NTSC ? "" : "--pal";
|
||||
$system2 = $NTSC ? "n" : "p";
|
||||
$framerate = $NTSC ? "30000:1001" : "25:1";
|
||||
$aspect = $Aspect ? "2" : "3";
|
||||
|
||||
# Convert a single file:
|
||||
|
||||
if (-f $ARGV[0]) {
|
||||
die "$0: mixed file and directory ('$ARGV[0]' <-> '$ARGV[1]')\n" unless !-e $ARGV[1] || -f $ARGV[1];
|
||||
ConvertFile($ARGV[0], $ARGV[1]);
|
||||
exit;
|
||||
}
|
||||
|
||||
die "$0: mixed directory and file ('$ARGV[0]' <-> '$ARGV[1]')\n" unless !-e $ARGV[1] || -d $ARGV[1];
|
||||
|
||||
$PICDIR = File::Spec->rel2abs($ARGV[0]);
|
||||
$MPGDIR = File::Spec->rel2abs($ARGV[1]);
|
||||
|
||||
# Convert pictures to mpegs:
|
||||
|
||||
chdir($PICDIR) || die "$PICDIR: $!\n";
|
||||
|
||||
@Pictures = `find -type f`;
|
||||
chomp(@Pictures);
|
||||
|
||||
for $pic (@Pictures) {
|
||||
my $mpg = "$MPGDIR/$pic.mpg";
|
||||
if ($Force || !-e $mpg || -M $mpg > -M $pic) {
|
||||
(my $dir = $mpg) =~ s/\/[^\/]*$//;
|
||||
mkpath($dir);
|
||||
ConvertFile($pic, $mpg);
|
||||
}
|
||||
}
|
||||
|
||||
# Remove mpegs without pictures:
|
||||
|
||||
chdir($MPGDIR) || die "$MPGDIR: $!\n";
|
||||
|
||||
@Mpegs = `find -type f`;
|
||||
chomp(@Mpegs);
|
||||
|
||||
for $mpg (@Mpegs) {
|
||||
my $pic = "$PICDIR/$mpg";
|
||||
$pic =~ s/\.mpg$//;
|
||||
if (!-e $pic) {
|
||||
print "removing $mpg\n";
|
||||
unlink($mpg);
|
||||
}
|
||||
}
|
||||
|
||||
# Remove empty directories:
|
||||
|
||||
chdir($MPGDIR) || die "$MPGDIR: $!\n";
|
||||
|
||||
for ($i = 0; $i < 10; $i++) { # dirs might become empty when removing empty subdirs
|
||||
@Dirs = `find -type d -empty`;
|
||||
chomp(@Dirs);
|
||||
last unless @Dirs;
|
||||
|
||||
for $dir (@Dirs) {
|
||||
$dir = EscapeMeta($dir);
|
||||
print "removing $dir\n";
|
||||
!system("rm -rf $dir") || die "$dir: $!\n";
|
||||
}
|
||||
}
|
||||
|
||||
# Actual file conversion:
|
||||
|
||||
sub ConvertFile
|
||||
{
|
||||
my ($Pict, $Mpeg) = @_;
|
||||
(my $Type) = lc($Pict) =~ /\.([^\.]*)$/;
|
||||
if (!defined $PNMCONV{$Type}) {
|
||||
return if ($Ignore);
|
||||
die "unknown file type '$Type': '$Pict'\n";
|
||||
}
|
||||
my ($w, $h) = imgsize($Pict);
|
||||
print "image size is $w x $h\n" if ($Detailed);
|
||||
my $Exif = ImageInfo($Pict);
|
||||
my $Orientation = $$Exif{"Orientation"};
|
||||
my ($Degrees) = $Orientation =~ /Rotate ([0-9]+) /;
|
||||
my $Rotate = "-null";
|
||||
$Rotate = "-cw" if $Degrees eq "90";
|
||||
$Rotate = "-ccw" if $Degrees eq "270";
|
||||
$Rotate = "-r180" if $Degrees eq "180";
|
||||
print "orientation = '$Orientation' -> rotation = $Rotate\n" if ($Detailed);
|
||||
($w, $h) = ($h, $w) if ($Degrees eq "90" || $Degrees eq "270");
|
||||
if ($w / $h <= $ScreenRatio) {
|
||||
$w = $h * $ScreenRatio;
|
||||
}
|
||||
else {
|
||||
$h = $w / $ScreenRatio;
|
||||
}
|
||||
my $ScaleW = $SW / $w * (100 - 2 * $OverscanX) / 100;
|
||||
my $ScaleH = $SH / $h * (100 - 2 * $OverscanY) / 100;
|
||||
$Pict = EscapeMeta($Pict);
|
||||
$Mpeg = EscapeMeta($Mpeg);
|
||||
print "$Pict -> $Mpeg $Rotate\n" if $ListFiles;
|
||||
my $Cmd = "$PNMCONV{$Type} $Pict 2> /dev/null |"
|
||||
. "pamflip $verbose1 $Rotate |"
|
||||
. "pnmscale $verbose1 --xscale=$ScaleW --yscale=$ScaleH |"
|
||||
. "pnmpad $verbose1 --black --width $SW --height $SH |"
|
||||
. "ppmntsc $verbose1 $system1 |"
|
||||
. "ppmtoy4m $verbose2 -F $framerate -I p -S 420mpeg2 |"
|
||||
. "mpeg2enc $verbose2 -f 3 -b 12500 -a $aspect -q 1 -n $system2 -o $Mpeg";
|
||||
!system($Cmd) || die "$Cmd: $!\n";
|
||||
$Cmd = "touch -r $Pict $Mpeg";
|
||||
!system($Cmd) || die "$Cmd: $!\n";
|
||||
}
|
||||
|
||||
sub EscapeMeta
|
||||
{
|
||||
my $META = ' !"#$%&\'()*;<>?[\\]`{|}~';
|
||||
my $s = shift;
|
||||
$s =~ s/([$META])/\\$1/g;
|
||||
return $s;
|
||||
}
|
@ -3,7 +3,7 @@
|
||||
*
|
||||
* See the README file for copyright information and how to reach the author.
|
||||
*
|
||||
* $Id: pictures.c 1.7 2008/03/14 12:57:19 kls Exp $
|
||||
* $Id: pictures.c 5.1 2022/12/05 15:26:23 kls Exp $
|
||||
*/
|
||||
|
||||
#include <getopt.h>
|
||||
@ -11,7 +11,7 @@
|
||||
#include "menu.h"
|
||||
#include "player.h"
|
||||
|
||||
static const char *VERSION = "0.0.7";
|
||||
static const char *VERSION = "2.6.1";
|
||||
static const char *DESCRIPTION = trNOOP("A simple picture viewer");
|
||||
static const char *MAINMENUENTRY = trNOOP("Pictures");
|
||||
|
||||
@ -82,11 +82,11 @@ bool cPluginPictures::ProcessArgs(int argc, char *argv[])
|
||||
// Implement command line argument processing here if applicable.
|
||||
static struct option long_options[] = {
|
||||
{ "dir", required_argument, NULL, 'd' },
|
||||
{ NULL }
|
||||
{ NULL, no_argument, NULL, 0 }
|
||||
};
|
||||
|
||||
int c;
|
||||
while ((c = getopt_long(argc, argv, "d:s:", long_options, NULL)) != -1) {
|
||||
while ((c = getopt_long(argc, argv, "d:", long_options, NULL)) != -1) {
|
||||
switch (c) {
|
||||
case 'd': strn0cpy(PictureDirectory, optarg, sizeof(PictureDirectory));
|
||||
break;
|
||||
|
@ -3,7 +3,7 @@
|
||||
*
|
||||
* See the README file for copyright information and how to reach the author.
|
||||
*
|
||||
* $Id: player.c 1.3 2008/02/09 12:13:10 kls Exp $
|
||||
* $Id: player.c 5.1 2022/12/05 15:26:23 kls Exp $
|
||||
*/
|
||||
|
||||
#include "player.h"
|
||||
@ -66,8 +66,15 @@ void cPicturePlayer::SetPicture(const char *FileName)
|
||||
length = read(f, buffer, size);
|
||||
if (length > 0) {
|
||||
if (length >= size) {
|
||||
size = size * 3 / 2;
|
||||
buffer = (uchar *)realloc(buffer, size);
|
||||
int NewSize = size * 3 / 2;
|
||||
if (uchar *NewBuffer = (uchar *)realloc(buffer, NewSize)) {
|
||||
buffer = NewBuffer;
|
||||
size = NewSize;
|
||||
}
|
||||
else {
|
||||
LOG_ERROR_STR("out of memory");
|
||||
break;
|
||||
}
|
||||
lseek(f, 0, SEEK_SET);
|
||||
continue;
|
||||
}
|
||||
@ -89,8 +96,10 @@ int cPictureControl::active = 0;
|
||||
cString cPictureControl::lastDisplayed;
|
||||
|
||||
cPictureControl::cPictureControl(cPictureEntry *Pictures, const cPictureEntry *PictureEntry, bool SlideShow)
|
||||
:cControl(player = new cPicturePlayer)
|
||||
:cControl(NULL)
|
||||
{
|
||||
player = new cPicturePlayer;
|
||||
SetPlayer(player);
|
||||
pictures = Pictures;
|
||||
pictureEntry = PictureEntry;
|
||||
osd = NULL;
|
||||
@ -197,9 +206,14 @@ void cPictureControl::DisplayCaption(void)
|
||||
osd->Flush();
|
||||
}
|
||||
|
||||
cString cPictureControl::GetHeader(void)
|
||||
{
|
||||
return tr("Pictures");
|
||||
}
|
||||
|
||||
eOSState cPictureControl::ProcessKey(eKeys Key)
|
||||
{
|
||||
switch (Key) {
|
||||
switch (int(Key)) {
|
||||
case kUp:
|
||||
case kPlay: slideShowDelay.Set();
|
||||
slideShow = true;
|
||||
|
@ -3,7 +3,7 @@
|
||||
*
|
||||
* See the README file for copyright information and how to reach the author.
|
||||
*
|
||||
* $Id: player.h 1.1 2008/01/13 11:29:27 kls Exp $
|
||||
* $Id: player.h 2.1 2012/04/28 11:56:01 kls Exp $
|
||||
*/
|
||||
|
||||
#ifndef _PLAYER_H
|
||||
@ -39,6 +39,7 @@ private:
|
||||
public:
|
||||
cPictureControl(cPictureEntry *Pictures, const cPictureEntry *PictureEntry, bool SlideShow = false);
|
||||
virtual ~cPictureControl();
|
||||
virtual cString GetHeader(void);
|
||||
virtual eOSState ProcessKey(eKeys Key);
|
||||
static bool Active(void) { return active > 0; }
|
||||
static const char *LastDisplayed(void);
|
||||
|
@ -1,16 +1,17 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2008 Klaus Schmidinger <kls@cadsoft.de>
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Klaus Schmidinger <kls@cadsoft.de>, 2008
|
||||
# Klaus Schmidinger <vdr@tvdr.de>, 2008
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: VDR 1.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <vdr-bugs@cadsoft.de>\n"
|
||||
"POT-Creation-Date: 2008-01-12 17:38+0100\n"
|
||||
"Project-Id-Version: vdr-pictures 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2012-12-18 12:57+0100\n"
|
||||
"PO-Revision-Date: 2008-01-12 17:41+0100\n"
|
||||
"Last-Translator: Klaus Schmidinger <kls@cadsoft.de>\n"
|
||||
"Language-Team: German\n"
|
||||
"Last-Translator: Klaus Schmidinger <vdr@tvdr.de>\n"
|
||||
"Language-Team: German <vdr@linuxtv.org>\n"
|
||||
"Language: de\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=ISO-8859-15\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
33
PLUGINS/src/pictures/po/et_EE.po
Normal file
33
PLUGINS/src/pictures/po/et_EE.po
Normal file
@ -0,0 +1,33 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Arthur Konovalov <artlov@gmail.com>, 2015
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: vdr-pictures 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2012-12-18 12:57+0100\n"
|
||||
"PO-Revision-Date: 2008-01-12 17:41+0100\n"
|
||||
"Last-Translator: Arthur Konovalov <artlov@gmail.com>\n"
|
||||
"Language-Team: Estonian <vdr@linuxtv.org>\n"
|
||||
"Language: et\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
msgid "Pictures"
|
||||
msgstr "Pildid"
|
||||
|
||||
msgid "A simple picture viewer"
|
||||
msgstr "Lihtne pildivaatur"
|
||||
|
||||
msgid "Picture directory"
|
||||
msgstr "Pildikaust"
|
||||
|
||||
msgid "Slide show delay (s)"
|
||||
msgstr "Slaidiseanssi viide (s)"
|
||||
|
||||
msgid "No picture directory has been defined!"
|
||||
msgstr "Pildikaust on määramata!"
|
@ -1,18 +1,19 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2008 Klaus Schmidinger <kls@cadsoft.de>
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Rolf Ahrenberg <rahrenbe@cc.hut.fi>, 2008
|
||||
# Rolf Ahrenberg <Rolf.Ahrenberg@sci.fi>, 2008
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: VDR 1.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <vdr-bugs@cadsoft.de>\n"
|
||||
"POT-Creation-Date: 2008-01-12 17:38+0100\n"
|
||||
"Project-Id-Version: vdr-pictures 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2012-12-18 12:57+0100\n"
|
||||
"PO-Revision-Date: 2008-01-12 17:41+0100\n"
|
||||
"Last-Translator: Rolf Ahrenberg <rahrenbe@cc.hut.fi>\n"
|
||||
"Language-Team: Finnish\n"
|
||||
"Last-Translator: Rolf Ahrenberg <Rolf.Ahrenberg@sci.fi>\n"
|
||||
"Language-Team: Finnish <vdr@linuxtv.org>\n"
|
||||
"Language: fi\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=ISO-8859-15\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
@ -29,4 +30,4 @@ msgid "Slide show delay (s)"
|
||||
msgstr "Diaesityksen viive (s)"
|
||||
|
||||
msgid "No picture directory has been defined!"
|
||||
msgstr "Kuvahakemistoa ei ole määritelty!"
|
||||
msgstr "Kuvahakemistoa ei ole määritelty!"
|
||||
|
@ -1,16 +1,17 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2008 Klaus Schmidinger <kls@cadsoft.de>
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Patrice Staudt <patrice.staudt@laposte.net>, 2008
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: VDR 1.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <vdr-bugs@cadsoft.de>\n"
|
||||
"POT-Creation-Date: 2008-01-12 17:38+0100\n"
|
||||
"Project-Id-Version: vdr-pictures 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2012-12-18 12:57+0100\n"
|
||||
"PO-Revision-Date: 2008-01-12 17:41+0100\n"
|
||||
"Last-Translator: Patrice Staudt <patrice.staudt@laposte.net>\n"
|
||||
"Language-Team: French\n"
|
||||
"Language-Team: French <vdr@linuxtv.org>\n"
|
||||
"Language: fr\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=ISO-8859-15\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
@ -1,16 +1,17 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2008 Klaus Schmidinger <kls@cadsoft.de>
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Diego Pierotto <vdr-italian@tiscali.it>, 2008
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: VDR 1.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <vdr-bugs@cadsoft.de>\n"
|
||||
"POT-Creation-Date: 2008-01-12 17:38+0100\n"
|
||||
"Project-Id-Version: vdr-pictures 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2012-12-18 12:57+0100\n"
|
||||
"PO-Revision-Date: 2008-01-27 20:22+0100\n"
|
||||
"Last-Translator: Diego Pierotto <vdr-italian@tiscali.it>\n"
|
||||
"Language-Team: Italian\n"
|
||||
"Language-Team: Italian <vdr@linuxtv.org>\n"
|
||||
"Language: it\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=ISO-8859-15\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
33
PLUGINS/src/pictures/po/lt_LT.po
Normal file
33
PLUGINS/src/pictures/po/lt_LT.po
Normal file
@ -0,0 +1,33 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Valdemaras Pipiras <varas@ambernet.lt>, 2009
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: vdr-pictures 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2012-12-18 12:57+0100\n"
|
||||
"PO-Revision-Date: 2009-12-08 12:41+0100\n"
|
||||
"Last-Translator: Valdemaras Pipiras <varas@ambernet.lt>, 2009\n"
|
||||
"Language-Team: Lithuanian <vdr@linuxtv.org>\n"
|
||||
"Language: lt\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
msgid "Pictures"
|
||||
msgstr "Nuotraukos"
|
||||
|
||||
msgid "A simple picture viewer"
|
||||
msgstr "Paprasta nuotraukų naršyklė"
|
||||
|
||||
msgid "Picture directory"
|
||||
msgstr "Nuotraukų katalogas"
|
||||
|
||||
msgid "Slide show delay (s)"
|
||||
msgstr "Skaidrių peržiūros užlaikymas (s)"
|
||||
|
||||
msgid "No picture directory has been defined!"
|
||||
msgstr "Nenustatytas nuotraukų katalogas!"
|
34
PLUGINS/src/pictures/po/pl_PL.po
Normal file
34
PLUGINS/src/pictures/po/pl_PL.po
Normal file
@ -0,0 +1,34 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Tomasz Maciej Nowak <tmn505@gmail.com>, 2018
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: vdr-pictures 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2018-02-19 00:48+0100\n"
|
||||
"PO-Revision-Date: 2018-02-19 00:53+0100\n"
|
||||
"Last-Translator: Tomasz Maciej Nowak <tmn505@gmail.com>\n"
|
||||
"Language-Team: Polish <vdr@linuxtv.org>\n"
|
||||
"Language: pl_PL\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
|
||||
"X-Generator: Poedit 2.0.6\n"
|
||||
|
||||
msgid "Pictures"
|
||||
msgstr "Zdjęcia"
|
||||
|
||||
msgid "A simple picture viewer"
|
||||
msgstr "Prosta przeglądarka zdjęć"
|
||||
|
||||
msgid "Picture directory"
|
||||
msgstr "Katalog ze zdjęciami"
|
||||
|
||||
msgid "Slide show delay (s)"
|
||||
msgstr "Pokaz slajdów opóźnienie (s)"
|
||||
|
||||
msgid "No picture directory has been defined!"
|
||||
msgstr "Nie zdefiniowano katalogu ze zdjęciami!"
|
@ -1,16 +1,17 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2008 Klaus Schmidinger <kls@cadsoft.de>
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Alexander Gross <Bikalexander@gmail.com>, 2008
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: VDR 1.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <vdr-bugs@cadsoft.de>\n"
|
||||
"POT-Creation-Date: 2008-01-12 17:38+0100\n"
|
||||
"Project-Id-Version: vdr-pictures 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2012-12-18 12:57+0100\n"
|
||||
"PO-Revision-Date: 2008-03-14 00:45+0100\n"
|
||||
"Last-Translator: Alexander Gross <Bikalexander@gmail.com>\n"
|
||||
"Language-Team: Russian\n"
|
||||
"Language-Team: Russian <vdr@linuxtv.org>\n"
|
||||
"Language: ru\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=ISO-8859-5\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
@ -27,7 +28,7 @@ msgid "Picture directory"
|
||||
msgstr "ºÐâÐÛÞÓ Ø×ÞÑàÐÖÕÝØÙ"
|
||||
|
||||
msgid "Slide show delay (s)"
|
||||
msgstr "·ÐÔÕàÖÚÐ áÛÐÙÔ-èÞã (áÕÚ)"
|
||||
msgstr "·ÐÔÕàÖÚÐ áÛÐÙÔ-èÞã (áÕÚ)"
|
||||
|
||||
msgid "No picture directory has been defined!"
|
||||
msgstr "½Õ ÞßàÕÔÕÛñÝ ÚÐâÐÛÞÓ Ø×ÞÑàÐÖÕÝØÙ!"
|
||||
|
32
PLUGINS/src/pictures/po/sk_SK.po
Normal file
32
PLUGINS/src/pictures/po/sk_SK.po
Normal file
@ -0,0 +1,32 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Klaus Schmidinger <vdr@tvdr.de>, 2008
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: vdr-pictures 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2012-12-18 12:57+0100\n"
|
||||
"PO-Revision-Date: 2009-09-30 12:54+0100\n"
|
||||
"Last-Translator: Milan Hrala <hrala.milan@gmail.com>\n"
|
||||
"Language-Team: Slovak <vdr@linuxtv.org>\n"
|
||||
"Language: sk\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=iso-8859-2\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
msgid "Pictures"
|
||||
msgstr "Obrázky"
|
||||
|
||||
msgid "A simple picture viewer"
|
||||
msgstr "Jednoduchý prehliadaè obrázkov"
|
||||
|
||||
msgid "Picture directory"
|
||||
msgstr "Umiestnenie obrázkov"
|
||||
|
||||
msgid "Slide show delay (s)"
|
||||
msgstr "Oneskorenie prezentácia (s)"
|
||||
|
||||
msgid "No picture directory has been defined!"
|
||||
msgstr "Neboli preukázané ¾iadne fotky v adresári!"
|
@ -9,3 +9,31 @@ VDR Plugin 'servicedemo' Revision History
|
||||
|
||||
- Moved the "all" target in the Makefile before the "Implicit rules",
|
||||
so that a plain "make" will compile everything.
|
||||
|
||||
2012-12-27: Version 0.1.3
|
||||
|
||||
- Adapted Makefile to changes introduced in recent VDR versions.
|
||||
|
||||
2013-01-12: Version 0.1.4
|
||||
|
||||
- Adapted Makefile to changes introduced in recent VDR versions.
|
||||
|
||||
2013-03-31: Version 2.0.0
|
||||
|
||||
- Official release.
|
||||
|
||||
2014-01-01: Version 2.1.1
|
||||
|
||||
- Avoiding unnecessary pkg-config warnings in plugin Makefiles.
|
||||
|
||||
2015-02-19: Version 2.2.0
|
||||
|
||||
- Official release.
|
||||
|
||||
2018-04-15: Version 2.4.0
|
||||
|
||||
- Official release.
|
||||
|
||||
2021-12-27: Version 2.6.0
|
||||
|
||||
- Official release.
|
||||
|
@ -1,13 +1,12 @@
|
||||
#
|
||||
# Makefile for a Video Disk Recorder plugin
|
||||
#
|
||||
# $Id: Makefile 1.10 2008/01/13 13:00:07 kls Exp $
|
||||
# $Id: Makefile 4.3 2020/06/22 15:08:46 kls Exp $
|
||||
|
||||
# The official name of this plugin.
|
||||
# This name will be used in the '-P...' option of VDR to load the plugin.
|
||||
# By default the main source file also carries this name.
|
||||
#
|
||||
PLUGIN = servicedemo # dummy name for Make.config
|
||||
|
||||
PLUGIN1 = svccli
|
||||
PLUGIN2 = svcsvr
|
||||
|
||||
@ -15,24 +14,28 @@ PLUGIN2 = svcsvr
|
||||
|
||||
VERSION = $(shell grep 'static const char \*VERSION *=' $(PLUGIN1).c | awk '{ print $$6 }' | sed -e 's/[";]//g')
|
||||
|
||||
### The C++ compiler and options:
|
||||
|
||||
CXX ?= g++
|
||||
CXXFLAGS ?= -fPIC -g -O2 -Wall -Woverloaded-virtual -Wno-parentheses
|
||||
|
||||
### The directory environment:
|
||||
|
||||
VDRDIR = ../../..
|
||||
LIBDIR = ../../lib
|
||||
TMPDIR = /tmp
|
||||
# Use package data if installed...otherwise assume we're under the VDR source directory:
|
||||
PKG_CONFIG ?= pkg-config
|
||||
PKGCFG = $(if $(VDRDIR),$(shell $(PKG_CONFIG) --variable=$(1) $(VDRDIR)/vdr.pc),$(shell PKG_CONFIG_PATH="$$PKG_CONFIG_PATH:../../.." $(PKG_CONFIG) --variable=$(1) vdr))
|
||||
LIBDIR = $(call PKGCFG,libdir)
|
||||
PLGCFG = $(call PKGCFG,plgcfg)
|
||||
#
|
||||
TMPDIR ?= /tmp
|
||||
|
||||
### The compiler options:
|
||||
|
||||
export CFLAGS = $(call PKGCFG,cflags)
|
||||
export CXXFLAGS = $(call PKGCFG,cxxflags)
|
||||
|
||||
### The version number of VDR's plugin API:
|
||||
|
||||
APIVERSION = $(call PKGCFG,apiversion)
|
||||
|
||||
### Allow user defined options to overwrite defaults:
|
||||
|
||||
-include $(VDRDIR)/Make.config
|
||||
|
||||
### The version number of VDR's plugin API (taken from VDR's "config.h"):
|
||||
|
||||
APIVERSION = $(shell sed -ne '/define APIVERSION/s/^.*"\(.*\)".*$$/\1/p' $(VDRDIR)/config.h)
|
||||
-include $(PLGCFG)
|
||||
|
||||
### The name of the distribution archive:
|
||||
|
||||
@ -41,9 +44,9 @@ PACKAGE = vdr-$(ARCHIVE)
|
||||
|
||||
### Includes and Defines (add further entries here):
|
||||
|
||||
INCLUDES += -I$(VDRDIR)/include
|
||||
INCLUDES +=
|
||||
|
||||
DEFINES += -D_GNU_SOURCE -DPLUGIN_NAME_I18N='"$(PLUGIN)"'
|
||||
DEFINES += -DPLUGIN_NAME_I18N='"$(PLUGIN)"'
|
||||
|
||||
### The object files (add further files here):
|
||||
|
||||
@ -56,26 +59,33 @@ all: libvdr-$(PLUGIN1).so libvdr-$(PLUGIN2).so
|
||||
### Implicit rules:
|
||||
|
||||
%.o: %.c
|
||||
$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) $<
|
||||
@echo CC $@
|
||||
$(Q)$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) -o $@ $<
|
||||
|
||||
# Dependencies:
|
||||
### Dependencies:
|
||||
|
||||
MAKEDEP = g++ -MM -MG
|
||||
MAKEDEP = $(CXX) -MM -MG
|
||||
DEPFILE = .dependencies
|
||||
$(DEPFILE): Makefile
|
||||
@$(MAKEDEP) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@
|
||||
@$(MAKEDEP) $(CXXFLAGS) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@
|
||||
|
||||
-include $(DEPFILE)
|
||||
|
||||
### Targets:
|
||||
|
||||
libvdr-$(PLUGIN1).so: $(PLUGIN1).o
|
||||
$(CXX) $(CXXFLAGS) -shared $(PLUGIN1).o -o $@
|
||||
@cp --remove-destination $@ $(LIBDIR)/$@.$(APIVERSION)
|
||||
@echo LD $@
|
||||
$(Q)$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(PLUGIN1).o -o $@
|
||||
|
||||
libvdr-$(PLUGIN2).so: $(PLUGIN2).o
|
||||
$(CXX) $(CXXFLAGS) -shared $(PLUGIN2).o -o $@
|
||||
@cp --remove-destination $@ $(LIBDIR)/$@.$(APIVERSION)
|
||||
@echo LD $@
|
||||
$(Q)$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(PLUGIN2).o -o $@
|
||||
|
||||
install-lib: libvdr-$(PLUGIN1).so libvdr-$(PLUGIN2).so
|
||||
install -D libvdr-$(PLUGIN1).so $(DESTDIR)$(LIBDIR)/libvdr-$(PLUGIN1).so.$(APIVERSION)
|
||||
install -D libvdr-$(PLUGIN2).so $(DESTDIR)$(LIBDIR)/libvdr-$(PLUGIN2).so.$(APIVERSION)
|
||||
|
||||
install: install-lib
|
||||
|
||||
dist: clean
|
||||
@-rm -rf $(TMPDIR)/$(ARCHIVE)
|
||||
|
@ -2,9 +2,9 @@ This is a "plugin" for the Video Disk Recorder (VDR).
|
||||
|
||||
Written by: Udo Richter <udo_richter@gmx.de>
|
||||
|
||||
Project's homepage: www.cadsoft.de/vdr
|
||||
Project's homepage: https://www.tvdr.de
|
||||
|
||||
Latest version available at: www.cadsoft.de/vdr
|
||||
Latest version available at: https://www.tvdr.de
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
|
@ -3,14 +3,14 @@
|
||||
*
|
||||
* See the README file for copyright information and how to reach the author.
|
||||
*
|
||||
* $Id: svccli.c 1.2 2007/08/15 13:18:08 kls Exp $
|
||||
* $Id: svccli.c 4.1 2018/04/10 13:00:53 kls Exp $
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <vdr/interface.h>
|
||||
#include <vdr/plugin.h>
|
||||
|
||||
static const char *VERSION = "0.1.2";
|
||||
static const char *VERSION = "2.4.0";
|
||||
static const char *DESCRIPTION = "Service demo client";
|
||||
static const char *MAINMENUENTRY = "Service demo";
|
||||
|
||||
@ -32,7 +32,7 @@ struct AddService_v1_0 {
|
||||
int sum;
|
||||
};
|
||||
|
||||
// --- cPluginSvcCli ----------------------------------------------------------
|
||||
// --- cPluginSvcCli ---------------------------------------------------------
|
||||
|
||||
cOsdObject *cPluginSvcCli::MainMenuAction(void)
|
||||
{
|
||||
|
@ -3,14 +3,14 @@
|
||||
*
|
||||
* See the README file for copyright information and how to reach the author.
|
||||
*
|
||||
* $Id: svcsvr.c 1.2 2007/08/15 13:18:59 kls Exp $
|
||||
* $Id: svcsvr.c 4.1 2018/04/10 13:00:57 kls Exp $
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <vdr/interface.h>
|
||||
#include <vdr/plugin.h>
|
||||
|
||||
static const char *VERSION = "0.1.2";
|
||||
static const char *VERSION = "2.4.0";
|
||||
static const char *DESCRIPTION = "Service demo server";
|
||||
|
||||
class cPluginSvcSvr : public cPlugin {
|
||||
@ -29,7 +29,7 @@ struct AddService_v1_0 {
|
||||
int sum;
|
||||
};
|
||||
|
||||
// --- cPluginSvcSvr ----------------------------------------------------------
|
||||
// --- cPluginSvcSvr ---------------------------------------------------------
|
||||
|
||||
bool cPluginSvcSvr::Service(const char *Id, void *Data)
|
||||
{
|
||||
|
@ -79,3 +79,85 @@ VDR Plugin 'skincurses' Revision History
|
||||
2008-03-14: Version 0.1.7
|
||||
|
||||
- Added Russian translations (thanks to Alexander Gross).
|
||||
|
||||
2010-01-03: Version 0.1.8
|
||||
|
||||
- Displaying "genre" in event descriptions.
|
||||
- Displaying "parental rating" in event descriptions.
|
||||
|
||||
2010-02-28: Version 0.1.9
|
||||
|
||||
- Added Lithuanian language translations (thanks to Valdemaras Pipiras).
|
||||
|
||||
2011-05-15: Version 0.1.10
|
||||
|
||||
- Avoiding a gcc 4.6 compiler error (thanks to Tobias Grimm).
|
||||
|
||||
2012-03-11: Version 0.1.11
|
||||
|
||||
- Adapted menu column widths of 'skincurses' to the wider HD OSD sizes.
|
||||
|
||||
2012-04-23: Version 0.1.12
|
||||
|
||||
- Now displaying disk usage in the title of the main and "Recordings" menu,
|
||||
which is no longer done by the VDR core.
|
||||
|
||||
2012-12-27: Version 0.1.13
|
||||
|
||||
- Adapted Makefile to changes introduced in recent VDR versions.
|
||||
|
||||
2013-01-12: Version 0.1.14
|
||||
|
||||
- Adapted Makefile to changes introduced in recent VDR versions.
|
||||
|
||||
2013-03-03: Version 0.1.15
|
||||
|
||||
- The "Recording info" page now displays the name of the channel (if available)
|
||||
from which this recording was taken.
|
||||
|
||||
2013-03-31: Version 2.0.0
|
||||
|
||||
- Official release.
|
||||
|
||||
2014-01-01: Version 2.1.1
|
||||
|
||||
- Avoiding unnecessary pkg-config warnings in plugin Makefiles.
|
||||
|
||||
2015-02-08: Version 2.1.2
|
||||
|
||||
- Added a missing trailing blank in some translations.
|
||||
|
||||
2015-02-19: Version 2.2.0
|
||||
|
||||
- Official release.
|
||||
|
||||
2016-12-22: Version 2.3.2
|
||||
|
||||
- Added cFont::Width(void) to get the default character width and allow stretched
|
||||
font drawing in high level OSDs (dummy for skincurses).
|
||||
- Fixed truncated date/time strings in the skins on multi-byte UTF-8 systems
|
||||
(reported by Sergey Chernyavskiy).
|
||||
|
||||
2018-04-15: Version 2.4.0
|
||||
|
||||
- Official release.
|
||||
|
||||
2019-03-12: Version 2.4.1
|
||||
|
||||
- Changes for ncurses version 6 (thanks to Ulrick Eckhardt).
|
||||
|
||||
2020-05-11: Version 2.4.2
|
||||
|
||||
- Fixed 'Changes for ncurses version 6'.
|
||||
- Reacting to changes in screen size.
|
||||
- Simplified color handling.
|
||||
- Using 'stdscr' directly instead of an additional window.
|
||||
|
||||
2021-07-01: Version 2.4.3
|
||||
|
||||
- The number of errors (if any) of a recording is now displayed in the recording's
|
||||
Info menu.
|
||||
|
||||
2021-12-27: Version 2.6.0
|
||||
|
||||
- Official release.
|
||||
|
@ -1,49 +1,56 @@
|
||||
#
|
||||
# Makefile for a Video Disk Recorder plugin
|
||||
#
|
||||
# $Id: Makefile 1.15 2008/01/19 11:40:33 kls Exp $
|
||||
# $Id: Makefile 4.3 2020/06/22 15:08:46 kls Exp $
|
||||
|
||||
# The official name of this plugin.
|
||||
# This name will be used in the '-P...' option of VDR to load the plugin.
|
||||
# By default the main source file also carries this name.
|
||||
# IMPORTANT: the presence of this macro is important for the Make.config
|
||||
# file. So it must be defined, even if it is not used here!
|
||||
#
|
||||
|
||||
PLUGIN = skincurses
|
||||
|
||||
### The version number of this plugin (taken from the main source file):
|
||||
|
||||
VERSION = $(shell grep 'static const char \*VERSION *=' $(PLUGIN).c | awk '{ print $$6 }' | sed -e 's/[";]//g')
|
||||
|
||||
### The C++ compiler and options:
|
||||
|
||||
CXX ?= g++
|
||||
CXXFLAGS ?= -fPIC -g -O2 -Wall -Woverloaded-virtual -Wno-parentheses
|
||||
|
||||
### The directory environment:
|
||||
|
||||
VDRDIR = ../../..
|
||||
LIBDIR = ../../lib
|
||||
TMPDIR = /tmp
|
||||
# Use package data if installed...otherwise assume we're under the VDR source directory:
|
||||
PKG_CONFIG ?= pkg-config
|
||||
PKGCFG = $(if $(VDRDIR),$(shell $(PKG_CONFIG) --variable=$(1) $(VDRDIR)/vdr.pc),$(shell PKG_CONFIG_PATH="$$PKG_CONFIG_PATH:../../.." $(PKG_CONFIG) --variable=$(1) vdr))
|
||||
LIBDIR = $(call PKGCFG,libdir)
|
||||
LOCDIR = $(call PKGCFG,locdir)
|
||||
PLGCFG = $(call PKGCFG,plgcfg)
|
||||
#
|
||||
TMPDIR ?= /tmp
|
||||
|
||||
### The compiler options:
|
||||
|
||||
export CFLAGS = $(call PKGCFG,cflags)
|
||||
export CXXFLAGS = $(call PKGCFG,cxxflags)
|
||||
|
||||
### The version number of VDR's plugin API:
|
||||
|
||||
APIVERSION = $(call PKGCFG,apiversion)
|
||||
|
||||
### Allow user defined options to overwrite defaults:
|
||||
|
||||
-include $(VDRDIR)/Make.config
|
||||
|
||||
### The version number of VDR's plugin API (taken from VDR's "config.h"):
|
||||
|
||||
APIVERSION = $(shell sed -ne '/define APIVERSION/s/^.*"\(.*\)".*$$/\1/p' $(VDRDIR)/config.h)
|
||||
-include $(PLGCFG)
|
||||
|
||||
### The name of the distribution archive:
|
||||
|
||||
ARCHIVE = $(PLUGIN)-$(VERSION)
|
||||
PACKAGE = vdr-$(ARCHIVE)
|
||||
|
||||
### The name of the shared object file:
|
||||
|
||||
SOFILE = libvdr-$(PLUGIN).so
|
||||
|
||||
### Includes and Defines (add further entries here):
|
||||
|
||||
INCLUDES += -I$(VDRDIR)/include
|
||||
INCLUDES +=
|
||||
|
||||
DEFINES += -D_GNU_SOURCE -DPLUGIN_NAME_I18N='"$(PLUGIN)"'
|
||||
DEFINES += -DPLUGIN_NAME_I18N='"$(PLUGIN)"'
|
||||
|
||||
### The object files (add further files here):
|
||||
|
||||
@ -51,54 +58,64 @@ OBJS = $(PLUGIN).o
|
||||
|
||||
### The main target:
|
||||
|
||||
all: libvdr-$(PLUGIN).so i18n
|
||||
all: $(SOFILE) i18n
|
||||
|
||||
### Implicit rules:
|
||||
|
||||
%.o: %.c
|
||||
$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) $<
|
||||
@echo CC $@
|
||||
$(Q)$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) -o $@ $<
|
||||
|
||||
### Dependencies:
|
||||
|
||||
MAKEDEP = $(CXX) -MM -MG
|
||||
DEPFILE = .dependencies
|
||||
$(DEPFILE): Makefile
|
||||
@$(MAKEDEP) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@
|
||||
@$(MAKEDEP) $(CXXFLAGS) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@
|
||||
|
||||
-include $(DEPFILE)
|
||||
|
||||
### Internationalization (I18N):
|
||||
|
||||
PODIR = po
|
||||
LOCALEDIR = $(VDRDIR)/locale
|
||||
I18Npo = $(wildcard $(PODIR)/*.po)
|
||||
I18Nmsgs = $(addprefix $(LOCALEDIR)/, $(addsuffix /LC_MESSAGES/vdr-$(PLUGIN).mo, $(notdir $(foreach file, $(I18Npo), $(basename $(file))))))
|
||||
I18Nmo = $(addsuffix .mo, $(foreach file, $(I18Npo), $(basename $(file))))
|
||||
I18Nmsgs = $(addprefix $(DESTDIR)$(LOCDIR)/, $(addsuffix /LC_MESSAGES/vdr-$(PLUGIN).mo, $(notdir $(foreach file, $(I18Npo), $(basename $(file))))))
|
||||
I18Npot = $(PODIR)/$(PLUGIN).pot
|
||||
|
||||
%.mo: %.po
|
||||
msgfmt -c -o $@ $<
|
||||
@echo MO $@
|
||||
$(Q)msgfmt -c -o $@ $<
|
||||
|
||||
$(I18Npot): $(wildcard *.c)
|
||||
xgettext -C -cTRANSLATORS --no-wrap --no-location -k -ktr -ktrNOOP --msgid-bugs-address='<vdr-bugs@cadsoft.de>' -o $@ $^
|
||||
@echo GT $@
|
||||
$(Q)xgettext -C -cTRANSLATORS --no-wrap --no-location -k -ktr -ktrNOOP --package-name=vdr-$(PLUGIN) --package-version=$(VERSION) --msgid-bugs-address='<see README>' -o $@ `ls $^`
|
||||
|
||||
%.po: $(I18Npot)
|
||||
msgmerge -U --no-wrap --no-location --backup=none -q $@ $<
|
||||
@echo PO $@
|
||||
$(Q)msgmerge -U --no-wrap --no-location --backup=none -q -N $@ $<
|
||||
@touch $@
|
||||
|
||||
$(I18Nmsgs): $(LOCALEDIR)/%/LC_MESSAGES/vdr-$(PLUGIN).mo: $(PODIR)/%.mo
|
||||
@mkdir -p $(dir $@)
|
||||
cp $< $@
|
||||
$(I18Nmsgs): $(DESTDIR)$(LOCDIR)/%/LC_MESSAGES/vdr-$(PLUGIN).mo: $(PODIR)/%.mo
|
||||
install -D -m644 $< $@
|
||||
|
||||
.PHONY: i18n
|
||||
i18n: $(I18Nmsgs) $(I18Npot)
|
||||
i18n: $(I18Nmo) $(I18Npot)
|
||||
|
||||
install-i18n: $(I18Nmsgs)
|
||||
|
||||
### Targets:
|
||||
|
||||
libvdr-$(PLUGIN).so: $(OBJS)
|
||||
$(CXX) $(CXXFLAGS) -shared $(OBJS) -lncursesw -o $@
|
||||
@cp --remove-destination $@ $(LIBDIR)/$@.$(APIVERSION)
|
||||
$(SOFILE): $(OBJS)
|
||||
@echo LD $@
|
||||
$(Q)$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS) -lncursesw -o $@
|
||||
|
||||
dist: clean
|
||||
install-lib: $(SOFILE)
|
||||
install -D $^ $(DESTDIR)$(LIBDIR)/$^.$(APIVERSION)
|
||||
|
||||
install: install-lib install-i18n
|
||||
|
||||
dist: $(I18Npo) clean
|
||||
@-rm -rf $(TMPDIR)/$(ARCHIVE)
|
||||
@mkdir $(TMPDIR)/$(ARCHIVE)
|
||||
@cp -a * $(TMPDIR)/$(ARCHIVE)
|
||||
@ -107,4 +124,5 @@ dist: clean
|
||||
@echo Distribution package created as $(PACKAGE).tgz
|
||||
|
||||
clean:
|
||||
@-rm -f $(OBJS) $(DEPFILE) *.so *.tgz core* *~ $(PODIR)/*.mo $(PODIR)/*.pot
|
||||
@-rm -f $(PODIR)/*.mo $(PODIR)/*.pot
|
||||
@-rm -f $(OBJS) $(DEPFILE) *.so *.tgz core* *~
|
||||
|
@ -1,10 +1,10 @@
|
||||
This is a "plugin" for the Video Disk Recorder (VDR).
|
||||
|
||||
Written by: Klaus Schmidinger <kls@cadsoft.de>
|
||||
Written by: Klaus Schmidinger <vdr@tvdr.de>
|
||||
|
||||
Project's homepage: www.cadsoft.de/vdr
|
||||
Project's homepage: https://www.tvdr.de
|
||||
|
||||
Latest version available at: www.cadsoft.de/vdr
|
||||
Latest version available at: https://www.tvdr.de
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
|
@ -1,16 +1,17 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2008 Klaus Schmidinger <kls@cadsoft.de>
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Klaus Schmidinger <kls@cadsoft.de>, 2007
|
||||
# Klaus Schmidinger <vdr@tvdr.de>, 2007
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: VDR 1.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <vdr-bugs@cadsoft.de>\n"
|
||||
"POT-Creation-Date: 2007-08-15 16:04+0200\n"
|
||||
"Project-Id-Version: vdr-skincurses 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2021-07-01 17:28+0200\n"
|
||||
"PO-Revision-Date: 2007-08-15 16:07+0200\n"
|
||||
"Last-Translator: Klaus Schmidinger <kls@cadsoft.de>\n"
|
||||
"Language-Team: German\n"
|
||||
"Last-Translator: Klaus Schmidinger <vdr@tvdr.de>\n"
|
||||
"Language-Team: German <vdr@linuxtv.org>\n"
|
||||
"Language: de\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=ISO-8859-15\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
@ -18,11 +19,15 @@ msgstr ""
|
||||
msgid "A text only skin"
|
||||
msgstr "Eine reine Text-Oberfläche"
|
||||
|
||||
msgid "errors"
|
||||
msgstr "Fehler"
|
||||
|
||||
msgid "Key$Mute"
|
||||
msgstr "Stumm"
|
||||
|
||||
#. TRANSLATORS: note the trailing blank!
|
||||
msgid "Volume "
|
||||
msgstr "Lautstärke"
|
||||
msgstr "Lautstärke "
|
||||
|
||||
msgid "Text mode"
|
||||
msgstr "Text-Modus"
|
||||
|
33
PLUGINS/src/skincurses/po/et_EE.po
Normal file
33
PLUGINS/src/skincurses/po/et_EE.po
Normal file
@ -0,0 +1,33 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Arthur Konovalov <artlov@gmail.com>, 2015
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: vdr-skincurses 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2021-07-01 17:28+0200\n"
|
||||
"PO-Revision-Date: 2007-08-14 20:48+0300\n"
|
||||
"Last-Translator: Arthur Konovalov <artlov@gmail.com>\n"
|
||||
"Language-Team: Estonian <vdr@linuxtv.org>\n"
|
||||
"Language: et\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
msgid "A text only skin"
|
||||
msgstr "Tekstipõhine kest"
|
||||
|
||||
msgid "errors"
|
||||
msgstr ""
|
||||
|
||||
msgid "Key$Mute"
|
||||
msgstr "Hääletu"
|
||||
|
||||
#. TRANSLATORS: note the trailing blank!
|
||||
msgid "Volume "
|
||||
msgstr "Helitugevus "
|
||||
|
||||
msgid "Text mode"
|
||||
msgstr "Tekst"
|
@ -1,28 +1,33 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2008 Klaus Schmidinger <kls@cadsoft.de>
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Rolf Ahrenberg <rahrenbe@cc.hut.fi>, 2007
|
||||
# Rolf Ahrenberg <Rolf.Ahrenberg@sci.fi>, 2007
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: VDR 1.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <vdr-bugs@cadsoft.de>\n"
|
||||
"POT-Creation-Date: 2007-08-14 20:54+0300\n"
|
||||
"Project-Id-Version: vdr-skincurses 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2021-07-01 17:28+0200\n"
|
||||
"PO-Revision-Date: 2007-08-14 20:48+0300\n"
|
||||
"Last-Translator: Rolf Ahrenberg <rahrenbe@cc.hut.fi>\n"
|
||||
"Language-Team: Finnish\n"
|
||||
"Last-Translator: Rolf Ahrenberg <Rolf.Ahrenberg@sci.fi>\n"
|
||||
"Language-Team: Finnish <vdr@linuxtv.org>\n"
|
||||
"Language: fi\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=ISO-8859-15\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
msgid "A text only skin"
|
||||
msgstr "Tekstipohjainen ulkoasu"
|
||||
|
||||
msgid "errors"
|
||||
msgstr ""
|
||||
|
||||
msgid "Key$Mute"
|
||||
msgstr "Mykistys"
|
||||
|
||||
#. TRANSLATORS: note the trailing blank!
|
||||
msgid "Volume "
|
||||
msgstr "Äänenvoimakkuus "
|
||||
msgstr "Äänenvoimakkuus "
|
||||
|
||||
msgid "Text mode"
|
||||
msgstr "Teksti"
|
||||
|
@ -1,16 +1,17 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2008 Klaus Schmidinger <kls@cadsoft.de>
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Diego Pierotto <vdr-italian@tiscali.it>, 2008
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: VDR 1.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <vdr-bugs@cadsoft.de>\n"
|
||||
"POT-Creation-Date: 2007-08-15 16:04+0200\n"
|
||||
"Project-Id-Version: vdr-skincurses 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2021-07-01 17:28+0200\n"
|
||||
"PO-Revision-Date: 2008-01-27 20:35+0100\n"
|
||||
"Last-Translator: Diego Pierotto <vdr-italian@tiscali.it>\n"
|
||||
"Language-Team: Italian\n"
|
||||
"Language-Team: Italian <vdr@linuxtv.org>\n"
|
||||
"Language: it\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=ISO-8859-15\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
@ -18,9 +19,13 @@ msgstr ""
|
||||
msgid "A text only skin"
|
||||
msgstr "Una interfaccia solo testo"
|
||||
|
||||
msgid "errors"
|
||||
msgstr ""
|
||||
|
||||
msgid "Key$Mute"
|
||||
msgstr "Muto"
|
||||
|
||||
#. TRANSLATORS: note the trailing blank!
|
||||
msgid "Volume "
|
||||
msgstr "Volume "
|
||||
|
||||
|
33
PLUGINS/src/skincurses/po/lt_LT.po
Normal file
33
PLUGINS/src/skincurses/po/lt_LT.po
Normal file
@ -0,0 +1,33 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Valdemaras Pipiras <varas@ambernet.lt>, 2010
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: vdr-skincurses 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2021-07-01 17:28+0200\n"
|
||||
"PO-Revision-Date: 2010-02-22 18:18+0200\n"
|
||||
"Last-Translator: Valdemaras Pipiras <varas@ambernet.lt>\n"
|
||||
"Language-Team: Lithuanian <vdr@linuxtv.org>\n"
|
||||
"Language: lt\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
msgid "A text only skin"
|
||||
msgstr "Tekstinis apvalkalas"
|
||||
|
||||
msgid "errors"
|
||||
msgstr ""
|
||||
|
||||
msgid "Key$Mute"
|
||||
msgstr "Išjungti garsą"
|
||||
|
||||
#. TRANSLATORS: note the trailing blank!
|
||||
msgid "Volume "
|
||||
msgstr "Garsas "
|
||||
|
||||
msgid "Text mode"
|
||||
msgstr "Tekstinis ręžimas"
|
35
PLUGINS/src/skincurses/po/pl_PL.po
Normal file
35
PLUGINS/src/skincurses/po/pl_PL.po
Normal file
@ -0,0 +1,35 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Tomasz Maciej Nowak <tmn505@gmail.com>, 2018
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: vdr-skincurses 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2021-07-01 17:28+0200\n"
|
||||
"PO-Revision-Date: 2018-02-19 01:02+0100\n"
|
||||
"Last-Translator: Tomasz Maciej Nowak <tmn505@gmail.com>\n"
|
||||
"Language-Team: Polish <vdr@linuxtv.org>\n"
|
||||
"Language: pl_PL\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
|
||||
"X-Generator: Poedit 2.0.6\n"
|
||||
|
||||
msgid "A text only skin"
|
||||
msgstr "Skóra tekstowa"
|
||||
|
||||
msgid "errors"
|
||||
msgstr ""
|
||||
|
||||
msgid "Key$Mute"
|
||||
msgstr "Wycisz"
|
||||
|
||||
#. TRANSLATORS: note the trailing blank!
|
||||
msgid "Volume "
|
||||
msgstr "Głośność "
|
||||
|
||||
msgid "Text mode"
|
||||
msgstr "Tryb tekstowy"
|
@ -1,16 +1,17 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2008 Klaus Schmidinger <kls@cadsoft.de>
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Alexander Gross <Bikalexander@gmail.com>, 2008
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: VDR 1.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <vdr-bugs@cadsoft.de>\n"
|
||||
"POT-Creation-Date: 2007-08-15 16:04+0200\n"
|
||||
"Project-Id-Version: vdr-skincurses 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2021-07-01 17:28+0200\n"
|
||||
"PO-Revision-Date: 2008-03-14 00:21+0100\n"
|
||||
"Last-Translator: Alexander Gross <Bikalexander@gmail.com>\n"
|
||||
"Language-Team: Russian\n"
|
||||
"Language-Team: Russian <vdr@linuxtv.org>\n"
|
||||
"Language: ru\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=ISO-8859-5\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
@ -19,11 +20,15 @@ msgstr ""
|
||||
msgid "A text only skin"
|
||||
msgstr "¿àÞáâÞ âÕÚáâÞÒëÙ ØÝâÕàäÕÙá"
|
||||
|
||||
msgid "errors"
|
||||
msgstr ""
|
||||
|
||||
msgid "Key$Mute"
|
||||
msgstr "²ëÚÛ. ÓàÞÜÚÞáâì"
|
||||
|
||||
#. TRANSLATORS: note the trailing blank!
|
||||
msgid "Volume "
|
||||
msgstr "³àÞÜÚÞáâì"
|
||||
msgstr "³àÞÜÚÞáâì "
|
||||
|
||||
msgid "Text mode"
|
||||
msgstr "ÀÕÖØÜ âÕÚáâÐ"
|
||||
|
33
PLUGINS/src/skincurses/po/sk_SK.po
Normal file
33
PLUGINS/src/skincurses/po/sk_SK.po
Normal file
@ -0,0 +1,33 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Klaus Schmidinger <vdr@tvdr.de>, 2007
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: vdr-skincurses 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2021-07-01 17:28+0200\n"
|
||||
"PO-Revision-Date: 2009-09-30 12:52+0100\n"
|
||||
"Last-Translator: Milan Hrala <hrala.milan@gmail.com>\n"
|
||||
"Language-Team: Slovak <vdr@linuxtv.org>\n"
|
||||
"Language: sk\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=iso-8859-2\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
msgid "A text only skin"
|
||||
msgstr "Iba text vzhµadu"
|
||||
|
||||
msgid "errors"
|
||||
msgstr ""
|
||||
|
||||
msgid "Key$Mute"
|
||||
msgstr "Stlmi» zvuk"
|
||||
|
||||
#. TRANSLATORS: note the trailing blank!
|
||||
msgid "Volume "
|
||||
msgstr "Hlasitos» "
|
||||
|
||||
msgid "Text mode"
|
||||
msgstr "Textový re¾im"
|
@ -3,15 +3,16 @@
|
||||
*
|
||||
* See the README file for copyright information and how to reach the author.
|
||||
*
|
||||
* $Id: skincurses.c 1.23 2008/03/14 12:57:14 kls Exp $
|
||||
* $Id: skincurses.c 5.1 2021/07/01 15:40:46 kls Exp $
|
||||
*/
|
||||
|
||||
#include <ncurses.h>
|
||||
#include <vdr/osd.h>
|
||||
#include <vdr/plugin.h>
|
||||
#include <vdr/skins.h>
|
||||
#include <vdr/videodir.h>
|
||||
|
||||
static const char *VERSION = "0.1.7";
|
||||
static const char *VERSION = "2.4.3";
|
||||
static const char *DESCRIPTION = trNOOP("A text only skin");
|
||||
static const char *MAINMENUENTRY = NULL;
|
||||
|
||||
@ -19,13 +20,15 @@ static const char *MAINMENUENTRY = NULL;
|
||||
|
||||
class cCursesFont : public cFont {
|
||||
public:
|
||||
virtual int Width(void) const { return 1; }
|
||||
virtual int Width(uint c) const { return 1; }
|
||||
virtual int Width(const char *s) const { return s ? Utf8StrLen(s) : 0; }
|
||||
virtual int Height(void) const { return 1; }
|
||||
virtual void DrawText(cBitmap *Bitmap, int x, int y, const char *s, tColor ColorFg, tColor ColorBg, int Width) const {}
|
||||
virtual void DrawText(cPixmap *Pixmap, int x, int y, const char *s, tColor ColorFg, tColor ColorBg, int Width) const {}
|
||||
};
|
||||
|
||||
static const cCursesFont Font;
|
||||
static const cCursesFont Font = cCursesFont(); // w/o the '= cCursesFont()' gcc 4.6 complains - can anybody explain why this is necessary?
|
||||
|
||||
// --- cCursesOsd ------------------------------------------------------------
|
||||
|
||||
@ -57,9 +60,7 @@ static int ScOsdHeight = 20;
|
||||
class cCursesOsd : public cOsd {
|
||||
private:
|
||||
WINDOW *savedRegion;
|
||||
WINDOW *window;
|
||||
enum { MaxColorPairs = 16 };
|
||||
int colorPairs[MaxColorPairs];
|
||||
cVector<int> colorPairs;
|
||||
void SetColor(int colorFg, int colorBg = clrBackground);
|
||||
public:
|
||||
cCursesOsd(int Left, int Top);
|
||||
@ -76,40 +77,34 @@ cCursesOsd::cCursesOsd(int Left, int Top)
|
||||
{
|
||||
savedRegion = NULL;
|
||||
|
||||
memset(colorPairs, 0x00, sizeof(colorPairs));
|
||||
start_color();
|
||||
leaveok(stdscr, true);
|
||||
refresh(); // to react on changes to screen size
|
||||
|
||||
window = subwin(stdscr, ScOsdHeight, ScOsdWidth, 0, 0);
|
||||
syncok(window, true);
|
||||
int begy, begx;
|
||||
int maxy, maxx;
|
||||
getmaxyx(stdscr, maxy, maxx);
|
||||
getbegyx(stdscr, begy, begx);
|
||||
ScOsdWidth = maxx - begx;
|
||||
ScOsdHeight = maxy - begy;
|
||||
}
|
||||
|
||||
cCursesOsd::~cCursesOsd()
|
||||
{
|
||||
if (window) {
|
||||
werase(window);
|
||||
Flush();
|
||||
delwin(window);
|
||||
window = NULL;
|
||||
}
|
||||
erase();
|
||||
Flush();
|
||||
}
|
||||
|
||||
void cCursesOsd::SetColor(int colorFg, int colorBg)
|
||||
{
|
||||
int color = (colorBg << 16) | colorFg | 0x80000000;
|
||||
for (int i = 0; i < MaxColorPairs; i++) {
|
||||
if (!colorPairs[i]) {
|
||||
colorPairs[i] = color;
|
||||
init_pair(i + 1, colorFg, colorBg);
|
||||
//XXX??? attron(COLOR_PAIR(WHITE_ON_BLUE));
|
||||
wattrset(window, COLOR_PAIR(i + 1));
|
||||
break;
|
||||
}
|
||||
else if (color == colorPairs[i]) {
|
||||
wattrset(window, COLOR_PAIR(i + 1));
|
||||
break;
|
||||
}
|
||||
}
|
||||
int i = colorPairs.IndexOf(color);
|
||||
if (i < 0) {
|
||||
colorPairs.Append(color);
|
||||
i = colorPairs.Size() - 1;
|
||||
init_pair(i + 1, colorFg, colorBg);
|
||||
}
|
||||
attrset(COLOR_PAIR(i + 1));
|
||||
}
|
||||
|
||||
void cCursesOsd::SaveRegion(int x1, int y1, int x2, int y2)
|
||||
@ -119,13 +114,14 @@ void cCursesOsd::SaveRegion(int x1, int y1, int x2, int y2)
|
||||
savedRegion = NULL;
|
||||
}
|
||||
savedRegion = newwin(y2 - y1 + 1, x2 - x1 + 1, y1, x1);
|
||||
copywin(window, savedRegion, y1, x1, 0, 0, y2 - y1, x2 - x1, false);
|
||||
if (savedRegion)
|
||||
copywin(stdscr, savedRegion, y1, x1, 0, 0, y2 - y1, x2 - x1, false);
|
||||
}
|
||||
|
||||
void cCursesOsd::RestoreRegion(void)
|
||||
{
|
||||
if (savedRegion) {
|
||||
copywin(savedRegion, window, 0, 0, savedRegion->_begy, savedRegion->_begx, savedRegion->_maxy - savedRegion->_begy, savedRegion->_maxx - savedRegion->_begx, false);
|
||||
overwrite(savedRegion, stdscr);
|
||||
delwin(savedRegion);
|
||||
savedRegion = NULL;
|
||||
}
|
||||
@ -165,18 +161,22 @@ void cCursesOsd::DrawText(int x, int y, const char *s, tColor ColorFg, tColor Co
|
||||
}
|
||||
}
|
||||
SetColor(ColorFg, ColorBg);
|
||||
wmove(window, y, x); // ncurses wants 'y' before 'x'!
|
||||
waddnstr(window, s, Width ? Width : ScOsdWidth - x);
|
||||
mvaddnstr(y, x, s, Width ? Width : ScOsdWidth - x);
|
||||
}
|
||||
|
||||
void cCursesOsd::DrawRectangle(int x1, int y1, int x2, int y2, tColor Color)
|
||||
{
|
||||
SetColor(Color, Color);
|
||||
for (int y = y1; y <= y2; y++) {
|
||||
wmove(window, y, x1); // ncurses wants 'y' before 'x'!
|
||||
whline(window, ' ', x2 - x1 + 1);
|
||||
}
|
||||
wsyncup(window); // shouldn't be necessary because of 'syncok()', but w/o it doesn't work
|
||||
int dx = x2 - x1;
|
||||
int dy = y2 - y1;
|
||||
if (dx >= dy) {
|
||||
for (int y = y1; y <= y2; y++)
|
||||
mvhline(y, x1, ' ', dx + 1);
|
||||
}
|
||||
else {
|
||||
for (int x = x1; x <= x2; x++)
|
||||
mvvline(y1, x, ' ', dy + 1);
|
||||
}
|
||||
}
|
||||
|
||||
void cCursesOsd::Flush(void)
|
||||
@ -261,6 +261,9 @@ void cSkinCursesDisplayChannel::Flush(void)
|
||||
class cSkinCursesDisplayMenu : public cSkinDisplayMenu {
|
||||
private:
|
||||
cOsd *osd;
|
||||
cString title;
|
||||
int lastDiskUsageState;
|
||||
void DrawTitle(void);
|
||||
void DrawScrollbar(int Total, int Offset, int Shown, int Top, int Height, bool CanScrollUp, bool CanScrollDown);
|
||||
void SetTextScrollbar(void);
|
||||
public:
|
||||
@ -284,6 +287,7 @@ public:
|
||||
cSkinCursesDisplayMenu::cSkinCursesDisplayMenu(void)
|
||||
{
|
||||
osd = new cCursesOsd(0, 0);
|
||||
lastDiskUsageState = -1;
|
||||
osd->DrawRectangle(0, 0, ScOsdWidth - 1, ScOsdHeight - 1, clrBackground);
|
||||
}
|
||||
|
||||
@ -331,9 +335,16 @@ void cSkinCursesDisplayMenu::Clear(void)
|
||||
textScroller.Reset();
|
||||
}
|
||||
|
||||
void cSkinCursesDisplayMenu::DrawTitle(void)
|
||||
{
|
||||
bool WithDisk = MenuCategory() == mcMain || MenuCategory() == mcRecording;
|
||||
osd->DrawText(0, 0, WithDisk ? cString::sprintf("%s - %s", *title, *cVideoDiskUsage::String()) : title, clrBlack, clrCyan, &Font, ScOsdWidth);
|
||||
}
|
||||
|
||||
void cSkinCursesDisplayMenu::SetTitle(const char *Title)
|
||||
{
|
||||
osd->DrawText(0, 0, Title, clrBlack, clrCyan, &Font, ScOsdWidth);
|
||||
title = Title;
|
||||
DrawTitle();
|
||||
}
|
||||
|
||||
void cSkinCursesDisplayMenu::SetButtons(const char *Red, const char *Green, const char *Yellow, const char *Blue)
|
||||
@ -374,13 +385,13 @@ void cSkinCursesDisplayMenu::SetItem(const char *Text, int Index, bool Current,
|
||||
for (int i = 0; i < MaxTabs; i++) {
|
||||
const char *s = GetTabbedText(Text, i);
|
||||
if (s) {
|
||||
int xt = Tab(i) / 12;// Tab() is in "pixel" - see also skins.c!!!
|
||||
int xt = Tab(i) / AvgCharWidth();// Tab() is in "pixel" - see also skins.c!!!
|
||||
osd->DrawText(xt, y, s, ColorFg, ColorBg, &Font, ScOsdWidth - 2 - xt);
|
||||
}
|
||||
if (!Tab(i + 1))
|
||||
break;
|
||||
}
|
||||
SetEditableWidth(ScOsdWidth - 2 - Tab(1) / 12); // Tab() is in "pixel" - see also skins.c!!!
|
||||
SetEditableWidth(ScOsdWidth - 2 - Tab(1) / AvgCharWidth()); // Tab() is in "pixel" - see also skins.c!!!
|
||||
}
|
||||
|
||||
void cSkinCursesDisplayMenu::SetScrollbar(int Total, int Offset)
|
||||
@ -394,14 +405,17 @@ void cSkinCursesDisplayMenu::SetEvent(const cEvent *Event)
|
||||
return;
|
||||
int y = 2;
|
||||
cTextScroller ts;
|
||||
char t[32];
|
||||
snprintf(t, sizeof(t), "%s %s - %s", *Event->GetDateString(), *Event->GetTimeString(), *Event->GetEndTimeString());
|
||||
cString t = cString::sprintf("%s %s - %s", *Event->GetDateString(), *Event->GetTimeString(), *Event->GetEndTimeString());
|
||||
ts.Set(osd, 0, y, ScOsdWidth, ScOsdHeight - y - 2, t, &Font, clrYellow, clrBackground);
|
||||
if (Event->Vps() && Event->Vps() != Event->StartTime()) {
|
||||
cString buffer = cString::sprintf(" VPS: %s", *Event->GetVpsString());
|
||||
osd->DrawText(ScOsdWidth - Utf8StrLen(buffer), y, buffer, clrBlack, clrYellow, &Font);
|
||||
}
|
||||
y += ts.Height();
|
||||
if (Event->ParentalRating()) {
|
||||
cString buffer = cString::sprintf(" %s ", *Event->GetParentalRatingString());
|
||||
osd->DrawText(ScOsdWidth - Utf8StrLen(buffer), y, buffer, clrBlack, clrYellow, &Font);
|
||||
}
|
||||
y += 1;
|
||||
ts.Set(osd, 0, y, ScOsdWidth, ScOsdHeight - y - 2, Event->Title(), &Font, clrCyan, clrBackground);
|
||||
y += ts.Height();
|
||||
@ -409,6 +423,13 @@ void cSkinCursesDisplayMenu::SetEvent(const cEvent *Event)
|
||||
ts.Set(osd, 0, y, ScOsdWidth, ScOsdHeight - y - 2, Event->ShortText(), &Font, clrYellow, clrBackground);
|
||||
y += ts.Height();
|
||||
}
|
||||
for (int i = 0; Event->Contents(i); i++) {
|
||||
const char *s = Event->ContentToString(Event->Contents(i));
|
||||
if (!isempty(s)) {
|
||||
ts.Set(osd, 0, y, ScOsdWidth, ScOsdHeight - y - 2, s, &Font, clrYellow, clrBackground);
|
||||
y += 1;
|
||||
}
|
||||
}
|
||||
y += 1;
|
||||
if (!isempty(Event->Description())) {
|
||||
textScroller.Set(osd, 0, y, ScOsdWidth - 2, ScOsdHeight - y - 2, Event->Description(), &Font, clrCyan, clrBackground);
|
||||
@ -423,10 +444,22 @@ void cSkinCursesDisplayMenu::SetRecording(const cRecording *Recording)
|
||||
const cRecordingInfo *Info = Recording->Info();
|
||||
int y = 2;
|
||||
cTextScroller ts;
|
||||
char t[32];
|
||||
snprintf(t, sizeof(t), "%s %s", *DateString(Recording->start), *TimeString(Recording->start));
|
||||
cString t = cString::sprintf("%s %s %s", *DateString(Recording->Start()), *TimeString(Recording->Start()), Info->ChannelName() ? Info->ChannelName() : "");
|
||||
ts.Set(osd, 0, y, ScOsdWidth, ScOsdHeight - y - 2, t, &Font, clrYellow, clrBackground);
|
||||
y += ts.Height();
|
||||
int xt = ScOsdWidth;
|
||||
if (Info->GetEvent()->ParentalRating()) {
|
||||
cString buffer = cString::sprintf(" %s ", *Info->GetEvent()->GetParentalRatingString());
|
||||
int w = Utf8StrLen(buffer);
|
||||
osd->DrawText(xt - w, y, buffer, clrBlack, clrYellow, &Font);
|
||||
xt -= w + 1;
|
||||
}
|
||||
if (Info->Errors() > 0) {
|
||||
cString buffer = cString::sprintf(" %d %s ", Info->Errors(), tr("errors"));
|
||||
int w = Utf8StrLen(buffer);
|
||||
osd->DrawText(xt - w, y, buffer, clrBlack, clrYellow, &Font);
|
||||
xt -= w + 1;
|
||||
}
|
||||
y += 1;
|
||||
const char *Title = Info->Title();
|
||||
if (isempty(Title))
|
||||
@ -437,6 +470,13 @@ void cSkinCursesDisplayMenu::SetRecording(const cRecording *Recording)
|
||||
ts.Set(osd, 0, y, ScOsdWidth, ScOsdHeight - y - 2, Info->ShortText(), &Font, clrYellow, clrBackground);
|
||||
y += ts.Height();
|
||||
}
|
||||
for (int i = 0; Info->GetEvent()->Contents(i); i++) {
|
||||
const char *s = Info->GetEvent()->ContentToString(Info->GetEvent()->Contents(i));
|
||||
if (!isempty(s)) {
|
||||
ts.Set(osd, 0, y, ScOsdWidth, ScOsdHeight - y - 2, s, &Font, clrYellow, clrBackground);
|
||||
y += 1;
|
||||
}
|
||||
}
|
||||
y += 1;
|
||||
if (!isempty(Info->Description())) {
|
||||
textScroller.Set(osd, 0, y, ScOsdWidth - 2, ScOsdHeight - y - 2, Info->Description(), &Font, clrCyan, clrBackground);
|
||||
@ -452,6 +492,8 @@ void cSkinCursesDisplayMenu::SetText(const char *Text, bool FixedFont)
|
||||
|
||||
void cSkinCursesDisplayMenu::Flush(void)
|
||||
{
|
||||
if (cVideoDiskUsage::HasChanged(lastDiskUsageState))
|
||||
DrawTitle();
|
||||
cString date = DayDateTime();
|
||||
osd->DrawText(ScOsdWidth - Utf8StrLen(date) - 2, 0, date, clrBlack, clrCyan, &Font);
|
||||
osd->Flush();
|
||||
@ -578,6 +620,7 @@ void cSkinCursesDisplayVolume::SetVolume(int Current, int Total, bool Mute)
|
||||
osd->DrawText(0, 0, tr("Key$Mute"), clrGreen, clrBackground, &Font);
|
||||
}
|
||||
else {
|
||||
// TRANSLATORS: note the trailing blank!
|
||||
const char *Prompt = tr("Volume ");
|
||||
int l = Utf8StrLen(Prompt);
|
||||
int p = (ScOsdWidth - l) * Current / Total;
|
||||
@ -790,12 +833,8 @@ bool cPluginSkinCurses::ProcessArgs(int argc, char *argv[])
|
||||
bool cPluginSkinCurses::Initialize(void)
|
||||
{
|
||||
// Initialize any background activities the plugin shall perform.
|
||||
WINDOW *w = initscr();
|
||||
if (w) {
|
||||
ScOsdWidth = w->_maxx - w->_begx + 1;
|
||||
ScOsdHeight = w->_maxy - w->_begy + 1;
|
||||
if (initscr())
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -1,70 +0,0 @@
|
||||
VDR Plugin 'sky' Revision History
|
||||
---------------------------------
|
||||
|
||||
2002-12-01: Version 0.0.1
|
||||
|
||||
- Initial revision.
|
||||
|
||||
2002-12-13: Version 0.1.0
|
||||
|
||||
- Changed setting of CXX and CXXFLAGS variables in Makefile.
|
||||
|
||||
2003-05-09: Version 0.1.1
|
||||
|
||||
- Changed Start() to Initialize().
|
||||
|
||||
2004-01-04: Version 0.2.0
|
||||
|
||||
- Implemented automatic PID switching and channel detection
|
||||
|
||||
2004-02-15: Version 0.3.0
|
||||
|
||||
- Now using the actual channel IDs a derived from the data stream.
|
||||
- Switched EPG data retrieval to http://www.bleb.org.
|
||||
- Added automatic DST detection to getskyepg.pl.
|
||||
- Fixed handling receivers, so that a recording on the same channel
|
||||
won't interrupt an ongoing Transfer mode.
|
||||
|
||||
2004-10-16: Version 0.3.1
|
||||
|
||||
- Improved buffer handling.
|
||||
|
||||
2004-12-12: Version 0.3.2
|
||||
|
||||
- Changed Apid access in cChannel.
|
||||
|
||||
2004-12-19: Version 0.3.3
|
||||
|
||||
- Made several functions threadsafe.
|
||||
- Removed delay_ms(), using cCondWait::SleepMs() instead.
|
||||
|
||||
2005-09-17: Version 0.3.4
|
||||
|
||||
- Added a missing include statement.
|
||||
|
||||
2006-03-26: Version 0.3.5
|
||||
|
||||
- Fixed format string handling.
|
||||
|
||||
2006-12-02: Version 0.3.5 (version number not increased)
|
||||
|
||||
- Made the getskyepg.pl script send a user agent message to
|
||||
the server, according to the rules at http://bleb.org/tv/data/listings.
|
||||
If your version of 'wget' doesn't support the -U option to set the user agent,
|
||||
use the new option -U of getskyepg.pl to have the information added to the URL
|
||||
as a query string.
|
||||
- The getskyepg.pl script now replaces "&" with "&".
|
||||
|
||||
2007-08-15: Version 0.3.6
|
||||
|
||||
- Moved the "all" target in the Makefile before the "Implicit rules",
|
||||
so that a plain "make" will compile everything.
|
||||
|
||||
2008-03-22: Version 0.3.7
|
||||
|
||||
- Removed the full path from the 'logger' call in the getskyepg.pl script (this
|
||||
program is apparently "on the move" through the file system...).
|
||||
|
||||
2008-09-07: Version 0.3.8
|
||||
|
||||
- Fixed renamed constants (thanks to Udo Richter).
|
@ -1,83 +0,0 @@
|
||||
#
|
||||
# Makefile for a Video Disk Recorder plugin
|
||||
#
|
||||
# $Id: Makefile 1.11 2008/01/13 13:00:16 kls Exp $
|
||||
|
||||
# The official name of this plugin.
|
||||
# This name will be used in the '-P...' option of VDR to load the plugin.
|
||||
# By default the main source file also carries this name.
|
||||
#
|
||||
PLUGIN = sky
|
||||
|
||||
### The version number of this plugin (taken from the main source file):
|
||||
|
||||
VERSION = $(shell grep 'static const char \*VERSION *=' $(PLUGIN).c | awk '{ print $$6 }' | sed -e 's/[";]//g')
|
||||
|
||||
### The C++ compiler and options:
|
||||
|
||||
CXX ?= g++
|
||||
CXXFLAGS ?= -fPIC -g -O2 -Wall -Woverloaded-virtual -Wno-parentheses
|
||||
|
||||
### The directory environment:
|
||||
|
||||
VDRDIR = ../../..
|
||||
LIBDIR = ../../lib
|
||||
TMPDIR = /tmp
|
||||
|
||||
### Allow user defined options to overwrite defaults:
|
||||
|
||||
-include $(VDRDIR)/Make.config
|
||||
|
||||
### The version number of VDR's plugin API (taken from VDR's "config.h"):
|
||||
|
||||
APIVERSION = $(shell sed -ne '/define APIVERSION/s/^.*"\(.*\)".*$$/\1/p' $(VDRDIR)/config.h)
|
||||
|
||||
### The name of the distribution archive:
|
||||
|
||||
ARCHIVE = $(PLUGIN)-$(VERSION)
|
||||
PACKAGE = vdr-$(ARCHIVE)
|
||||
|
||||
### Includes and Defines (add further entries here):
|
||||
|
||||
INCLUDES += -I$(VDRDIR)/include
|
||||
|
||||
DEFINES += -D_GNU_SOURCE -DPLUGIN_NAME_I18N='"$(PLUGIN)"'
|
||||
|
||||
### The object files (add further files here):
|
||||
|
||||
OBJS = $(PLUGIN).o
|
||||
|
||||
### The main target:
|
||||
|
||||
all: libvdr-$(PLUGIN).so
|
||||
|
||||
### Implicit rules:
|
||||
|
||||
%.o: %.c
|
||||
$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) $<
|
||||
|
||||
# Dependencies:
|
||||
|
||||
MAKEDEP = g++ -MM -MG
|
||||
DEPFILE = .dependencies
|
||||
$(DEPFILE): Makefile
|
||||
@$(MAKEDEP) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@
|
||||
|
||||
-include $(DEPFILE)
|
||||
|
||||
### Targets:
|
||||
|
||||
libvdr-$(PLUGIN).so: $(OBJS)
|
||||
$(CXX) $(CXXFLAGS) -shared $(OBJS) -o $@
|
||||
@cp --remove-destination $@ $(LIBDIR)/$@.$(APIVERSION)
|
||||
|
||||
dist: clean
|
||||
@-rm -rf $(TMPDIR)/$(ARCHIVE)
|
||||
@mkdir $(TMPDIR)/$(ARCHIVE)
|
||||
@cp -a * $(TMPDIR)/$(ARCHIVE)
|
||||
@tar czf $(PACKAGE).tgz -C $(TMPDIR) $(ARCHIVE)
|
||||
@-rm -rf $(TMPDIR)/$(ARCHIVE)
|
||||
@echo Distribution package created as $(PACKAGE).tgz
|
||||
|
||||
clean:
|
||||
@-rm -f $(OBJS) $(DEPFILE) *.so *.tgz core* *~
|
@ -1,49 +0,0 @@
|
||||
This is a "plugin" for the Video Disk Recorder (VDR).
|
||||
|
||||
Written by: Klaus Schmidinger <kls@cadsoft.de>
|
||||
|
||||
Project's homepage: www.cadsoft.de/vdr
|
||||
|
||||
Latest version available at: www.cadsoft.de/vdr
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
See the file COPYING for more information.
|
||||
|
||||
Description:
|
||||
|
||||
The 'sky' plugin implements a new device for VDR, which is based on the
|
||||
MPEG2 encoder card described at linuxtv.org/mpeg2/kfir.xml. It
|
||||
allows you to connect the analog a/v output of your Sky Digibox to VDR,
|
||||
so that you can enjoy the full recording flexibility of VDR with your
|
||||
Sky subscription. Note that this is NOT something that does anything
|
||||
illegal, like decrypting the Sky programme without a subscription. You
|
||||
will need a Sky Digibox and a valid subscription in order to use this
|
||||
plugin.
|
||||
|
||||
The 'kfir' module must be loaded with the option 'streamtype=4' to make it
|
||||
produce a Transport Stream.
|
||||
|
||||
The Digibox is remotely controlled through VDR via LIRC (see lirc.org).
|
||||
The file lircd.conf.sky contains the remote control codes necessary to
|
||||
control the Digibox.
|
||||
|
||||
In order to access the Sky channels VDR needs to know the channel number
|
||||
under which each channel is stored in the Sky Digibox. These numbers are
|
||||
stored in the file 'channels.conf.sky', together with the channel IDs as
|
||||
derived from the actual channel data and the names under which the EPG
|
||||
data for each channel can be found (see below). Copy this file to your
|
||||
plugins config directory, in a subdirectory named 'sky', as in
|
||||
|
||||
/video/plugins/sky/channels.conf.sky
|
||||
|
||||
The Sky EPG is available on the Internet at http://www.bleb.org.
|
||||
The Perl script getskyepg.pl extracts the EPG data from these pages
|
||||
and sends it to VDR via an SVDRP connection. The channel names as
|
||||
used on the bleb.org pages are defined in the channels.conf.sky file.
|
||||
You can keep your EPG data up-to-date by entering a call to getskyepg.pl
|
||||
into your /etc/crontab. Call 'getskyepg.pl -h' for a list of options.
|
||||
The getskyepg.pl script requires the programs /usr/bin/wget and /usr/bin/logger
|
||||
to be installed on your system.
|
@ -1,34 +0,0 @@
|
||||
# Sky channel definitions
|
||||
#
|
||||
# Syntax:
|
||||
#
|
||||
# ChannelID:ChannelNumber:EPGname
|
||||
#
|
||||
# where
|
||||
#
|
||||
# ChannelID is the channel ID as derived from the actual channel
|
||||
# data as broadcast in the data stream (see man vdr(5)).
|
||||
#
|
||||
# ChannelNumber is the number of this channel as you have to
|
||||
# enter it on the DigiBox remote control.
|
||||
#
|
||||
# EPGname is the name of the page at www.bleb.org that has EPG
|
||||
# data for this channel (without the '.xml'). If no such
|
||||
# page exists, 'x' is entered.
|
||||
#
|
||||
S28.2E-2-2027-4705:106:sky_one
|
||||
S28.2E-2-2027-5104:107:sky_two
|
||||
S28.2E-2-2044-10070:118:itv2
|
||||
S28.2E-2-2023-4905:130:scifi
|
||||
S28.2E-2-2025-5904:127:paramount
|
||||
S28.2E-2-2009-6201:551:discovery
|
||||
S28.2E-2-2030-4809:310:sky_cinema
|
||||
S28.2E-2-2007-4303:301:sky_movies1
|
||||
S28.2E-2-2007-4302:302:sky_movies2
|
||||
S28.2E-2-2007-4403:303:sky_movies3
|
||||
S28.2E-2-2011-4402:304:sky_movies4
|
||||
S28.2E-2-2011-4503:305:sky_movies5
|
||||
S28.2E-2-2011-4502:306:sky_movies6
|
||||
S28.2E-2-2030-4603:307:sky_movies7
|
||||
S28.2E-2-2007-5502:308:sky_movies8
|
||||
S28.2E-2-2030-4602:309:sky_movies9
|
@ -1,260 +0,0 @@
|
||||
#!/usr/bin/perl
|
||||
|
||||
# getskyepg.pl: Get EPG data for Sky channels from the Internet
|
||||
#
|
||||
# Connects to a running VDR instance via SVDRP, gets the channel data
|
||||
# for the Sky channels and connects to Internet web pages to extract the
|
||||
# EPG data for these channels. The result is sent to VDR via SVDRP.
|
||||
#
|
||||
# See the README file for copyright information and how to reach the author.
|
||||
#
|
||||
# $Id: getskyepg.pl 1.7 2008/03/22 10:17:42 kls Exp $
|
||||
|
||||
use Getopt::Std;
|
||||
use Time::Local;
|
||||
|
||||
$Usage = qq{
|
||||
Usage: $0 [options]
|
||||
|
||||
Options: -c filename channel config file name (default: channels.conf.sky)
|
||||
-d hostname destination hostname (default: localhost)
|
||||
-p port SVDRP port number (default: 2001)
|
||||
-S source channel source (default: S28.2E)
|
||||
-D days days to get EPG for (1..7, default: 2)
|
||||
-U use this if your version of 'wget' doesn't support -U
|
||||
};
|
||||
|
||||
die $Usage if (!getopts("c:d:D:hp:S:U") || $opt_h);
|
||||
|
||||
$Conf = $opt_c || "channels.conf.sky";
|
||||
$Dest = $opt_d || "localhost";
|
||||
$Port = $opt_p || 2001;
|
||||
$Source = $opt_S || "S28.2E";
|
||||
$Days = $opt_D || 2;
|
||||
$User = $opt_U;
|
||||
|
||||
# See "Rules for using this data" on http://bleb.org/tv/data/listings.
|
||||
# In case you modify this script in a way that changes its behavior
|
||||
# towards the www.bleb.org website, please replace 'vdrbugs@cadsoft.de'
|
||||
# with your own email address! That way Andrew Flegg <andrew@bleb.org>,
|
||||
# who runs that web site, can contact you in case of problems.
|
||||
$IDENT = "VDR::getskyepg.pl, http://www.cadsoft.de/vdr - vdrbugs\@cadsoft.de";
|
||||
$GAP = 2;
|
||||
|
||||
$SkyWebPage = "www.bleb.org/tv/data/listings";
|
||||
$WGET = "/usr/bin/wget -q -O-";
|
||||
$WGET .= " -U '$IDENT'" unless $User;
|
||||
$LOGGER = "logger -t SKYEPG";
|
||||
|
||||
$DST = -3600; # Daylight Saving Time offset
|
||||
$SecsInDay = 86400;
|
||||
|
||||
@Channels = ();
|
||||
|
||||
$idxSource = 0;
|
||||
$idxNumber = 1;
|
||||
$idxName = 2;
|
||||
|
||||
Error("days out of range: $Days") unless (1 <= $Days && $Days <= 7);
|
||||
|
||||
sub Log
|
||||
{
|
||||
system("$LOGGER '@_'");
|
||||
}
|
||||
|
||||
sub Error
|
||||
{
|
||||
Log(@_);
|
||||
die "$0: @_\n";
|
||||
}
|
||||
|
||||
sub GetChannels
|
||||
{
|
||||
open(CHANNELS, $Conf) || Error("$Conf: $!");
|
||||
while (<CHANNELS>) {
|
||||
chomp;
|
||||
next if (/^#/);
|
||||
my @a = split(":");
|
||||
push(@Channels, [@a]) unless ($a[$idxName] eq "x");
|
||||
}
|
||||
close(CHANNELS);
|
||||
}
|
||||
|
||||
GetChannels();
|
||||
|
||||
sub GetPage
|
||||
{
|
||||
my $channel = shift;
|
||||
my $day = shift;
|
||||
$day--;
|
||||
my $url = "http://$SkyWebPage/$day/$channel.xml";
|
||||
$url .= "?$IDENT" if $User;
|
||||
Log("reading $url");
|
||||
my @page = split("\n", `$WGET '$url'`);
|
||||
Log("received " . ($#page + 1) . " lines");
|
||||
return @page;
|
||||
}
|
||||
|
||||
sub ReplaceTags
|
||||
{
|
||||
my $s = shift;
|
||||
$s =~ s/&/&/g;
|
||||
return $s;
|
||||
}
|
||||
|
||||
sub StripWhitespace
|
||||
{
|
||||
my $s = shift;
|
||||
$s =~ s/\s*(.*)\s*/$1/;
|
||||
$s =~ s/\s+/ /g;
|
||||
return $s;
|
||||
}
|
||||
|
||||
sub Extract
|
||||
{
|
||||
my $s = shift;
|
||||
my $t = shift;
|
||||
$s =~ /<$t>([^<]*)<\/$t>/;
|
||||
return ReplaceTags(StripWhitespace($1));
|
||||
}
|
||||
|
||||
# In order to get the duration we need to buffer the last event:
|
||||
$Id = "";
|
||||
$Time = 0;
|
||||
$Title = "";
|
||||
$Subtitle = "";
|
||||
$Desc = "";
|
||||
|
||||
sub GetEpgData
|
||||
{
|
||||
my ($channel, $channelID) = @_;
|
||||
my $numEvents = 0;
|
||||
SVDRPsend("C $channelID");
|
||||
$Time = 0;
|
||||
for $day (1 .. $Days) {
|
||||
my $dt = 0;
|
||||
my @page = GetPage($channel, $day);
|
||||
my $data = "";
|
||||
for $line (@page) {
|
||||
chomp($line);
|
||||
if ($line =~ /<programme>/) {
|
||||
$data = "";
|
||||
}
|
||||
elsif ($line =~ /<\/programme>/) {
|
||||
my $title = Extract($data, "title");
|
||||
my $subtitle = Extract($data, "subtitle");
|
||||
my $desc = Extract($data, "desc");
|
||||
my $start = Extract($data, "start");
|
||||
# 'end' is useless, because it is sometimes missing :-(
|
||||
# my $end = Extract($data, "end");
|
||||
if (!$subtitle) {
|
||||
# They sometimes write all info into the description, as in
|
||||
# Episode: some description.
|
||||
# Why don't they just fill in the data correctly?
|
||||
my ($s, $d) = ($desc =~ /([^:]*)[:](.*)/);
|
||||
if ($s && $d) {
|
||||
$subtitle = $s;
|
||||
$desc = $d;
|
||||
}
|
||||
}
|
||||
# 'start' and 'end' as time of day isn't of much use here, since
|
||||
# the page for one day contains data that actually belongs to the
|
||||
# next day (after midnight). Oh well, lets reconstruct the missing
|
||||
# information:
|
||||
$start = "0" . $start if (length($start) < 4);
|
||||
my ($h, $m) = ($start =~ /(..)(..)/);
|
||||
$dt = $SecsInDay if ($h > 12);
|
||||
# convert to time_t:
|
||||
my @gmt = gmtime;
|
||||
$gmt[0] = 0; # seconds
|
||||
$gmt[1] = $m; # minutes
|
||||
$gmt[2] = $h; # hours
|
||||
$time = timegm(@gmt) + ($day - 1) * $SecsInDay + ($h < 12 ? $dt : 0);
|
||||
# compensate for DST:
|
||||
$time += $DST if (localtime($time))[8];
|
||||
# create EPG data:
|
||||
if ($Time) {
|
||||
$duration = $time - $Time;
|
||||
SVDRPsend("E $Id $Time $duration");
|
||||
SVDRPsend("T $Title");
|
||||
SVDRPsend("S $Subtitle");
|
||||
SVDRPsend("D $Desc");
|
||||
SVDRPsend("e");
|
||||
$numEvents++;
|
||||
}
|
||||
# buffer the last event:
|
||||
$Id = $time / 60 % 0xFFFF; # this gives us unique ids for every minute of over 6 weeks
|
||||
$Time = $time;
|
||||
$Title = $title;
|
||||
$Subtitle = $subtitle;
|
||||
$Desc = $desc;
|
||||
}
|
||||
else {
|
||||
$data .= $line;
|
||||
}
|
||||
}
|
||||
sleep($GAP);
|
||||
}
|
||||
SVDRPsend("c");
|
||||
Log("generated $numEvents EPG events");
|
||||
}
|
||||
|
||||
sub ProcessEpg
|
||||
{
|
||||
for (@Channels) {
|
||||
my $channel = @$_[$idxName];
|
||||
my $channelID = @$_[$idxSource];
|
||||
Log("processing channel $channel - $channelID");
|
||||
SVDRPsend("PUTE");
|
||||
SVDRPreceive(354);
|
||||
GetEpgData($channel, $channelID);
|
||||
SVDRPsend(".");
|
||||
SVDRPreceive(250);
|
||||
}
|
||||
Log("done");
|
||||
}
|
||||
|
||||
#---------------------------------------------------------------------------
|
||||
# TODO: make this a Perl module??? What about Error()???
|
||||
|
||||
use Socket;
|
||||
|
||||
$Timeout = 300; # max. seconds to wait for response
|
||||
|
||||
$SIG{ALRM} = sub { Error("timeout"); };
|
||||
alarm($Timeout);
|
||||
|
||||
$iaddr = inet_aton($Dest) || Error("no host: $Dest");
|
||||
$paddr = sockaddr_in($Port, $iaddr);
|
||||
|
||||
$proto = getprotobyname('tcp');
|
||||
socket(SOCK, PF_INET, SOCK_STREAM, $proto) || Error("socket: $!");
|
||||
connect(SOCK, $paddr) || Error("connect: $!");
|
||||
select(SOCK); $| = 1;
|
||||
SVDRPreceive(220);
|
||||
ProcessEpg();
|
||||
SVDRPsend("QUIT");
|
||||
|
||||
sub SVDRPsend
|
||||
{
|
||||
my $s = shift;
|
||||
print SOCK "$s\r\n";
|
||||
}
|
||||
|
||||
sub SVDRPreceive
|
||||
{
|
||||
my $expect = shift | 0;
|
||||
my @a = ();
|
||||
while (<SOCK>) {
|
||||
s/\s*$//; # 'chomp' wouldn't work with "\r\n"
|
||||
push(@a, $_);
|
||||
if (substr($_, 3, 1) ne "-") {
|
||||
my $code = substr($_, 0, 3);
|
||||
Error("expected SVDRP code $expect, but received $code") if ($code != $expect);
|
||||
last;
|
||||
}
|
||||
}
|
||||
return @a;
|
||||
}
|
||||
|
||||
#---------------------------------------------------------------------------
|
@ -1,299 +0,0 @@
|
||||
# Copyright (C) 1999 Christoph Bartelmus
|
||||
#
|
||||
# You may only use this file if you make it available to others,
|
||||
# i.e. if you send it to <lirc@bartelmus.de>
|
||||
#
|
||||
# this config file was automatically generated
|
||||
# using lirc-0.6.4-CVS(serial) on Mon Jul 9 08:14:04 2001
|
||||
#
|
||||
# contributed by Steve Davies <steve@daviesfam.org>
|
||||
#
|
||||
# brand: sky
|
||||
# model no. of remote control:
|
||||
# supported devices: 34000 20
|
||||
#
|
||||
#
|
||||
|
||||
begin remote
|
||||
|
||||
name SKY
|
||||
flags CONST_LENGTH|RAW_CODES
|
||||
eps 30
|
||||
aeps 100
|
||||
ptrail 0
|
||||
repeat 0 0
|
||||
gap 149692
|
||||
frequency 36000
|
||||
duty_cycle 50
|
||||
|
||||
begin raw_codes
|
||||
|
||||
name 0
|
||||
2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
|
||||
444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
|
||||
444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
|
||||
444 444 444
|
||||
|
||||
name 1
|
||||
2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
|
||||
444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
|
||||
444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
|
||||
888
|
||||
|
||||
name 2
|
||||
2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
|
||||
444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
|
||||
444 444 444 444 444 444 444 444 444 444 444 444 444 444 888 888
|
||||
444
|
||||
|
||||
name 3
|
||||
2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
|
||||
444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
|
||||
444 444 444 444 444 444 444 444 444 444 444 444 444 444 888 444
|
||||
444
|
||||
|
||||
name 4
|
||||
2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
|
||||
444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
|
||||
444 444 444 444 444 444 444 444 444 444 444 444 888 888 444 444
|
||||
444
|
||||
|
||||
name 5
|
||||
2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
|
||||
444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
|
||||
444 444 444 444 444 444 444 444 444 444 444 444 888 888 888
|
||||
|
||||
name 6
|
||||
2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
|
||||
444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
|
||||
444 444 444 444 444 444 444 444 444 444 444 444 888 444 444 888
|
||||
444
|
||||
|
||||
name 7
|
||||
2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
|
||||
444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
|
||||
444 444 444 444 444 444 444 444 444 444 444 444 888 444 444 444
|
||||
444
|
||||
|
||||
name 8
|
||||
2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
|
||||
444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
|
||||
444 444 444 444 444 444 444 444 444 444 888 888 444 444 444 444
|
||||
444
|
||||
|
||||
name 9
|
||||
2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
|
||||
444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
|
||||
444 444 444 444 444 444 444 444 444 444 888 888 444 444 888
|
||||
|
||||
name RED
|
||||
2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
|
||||
444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
|
||||
444 444 444 444 888 444 444 888 888 444 444 888 888
|
||||
|
||||
name GREEN
|
||||
2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
|
||||
444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
|
||||
444 444 444 444 888 444 444 888 888 444 444 444 444 888 444
|
||||
|
||||
name YELLOW
|
||||
2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
|
||||
444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
|
||||
444 444 444 444 888 444 444 888 888 444 444 444 444 444 444
|
||||
|
||||
name BLUE
|
||||
2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
|
||||
444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
|
||||
444 444 444 444 888 444 444 444 444 888 444 444 444 444 444 444
|
||||
444
|
||||
|
||||
name TEXT
|
||||
2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
|
||||
444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
|
||||
444 444 444 444 444 444 888 444 444 444 444 444 444 888 444 444
|
||||
444
|
||||
|
||||
name BACKUP
|
||||
2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
|
||||
444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
|
||||
444 444 888 888 444 444 444 444 444 444 444 444 888 444 444
|
||||
|
||||
name HELP
|
||||
2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
|
||||
444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
|
||||
444 444 888 888 444 444 444 444 444 444 444 444 444 444 888
|
||||
|
||||
name CURSOR-LEFT
|
||||
2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
|
||||
444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
|
||||
444 444 444 444 888 888 888 444 444 888 888 888 444
|
||||
|
||||
name CURSOR-DOWN
|
||||
2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
|
||||
444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
|
||||
444 444 444 444 888 888 888 444 444 888 444 444 888
|
||||
|
||||
name CURSOR-RIGHT
|
||||
2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
|
||||
444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
|
||||
444 444 444 444 888 888 888 444 444 888 888 444 444
|
||||
|
||||
name CURSOR-UP
|
||||
2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
|
||||
444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
|
||||
444 444 444 444 888 888 888 444 444 888 444 444 444 444 444
|
||||
|
||||
name SELECT
|
||||
2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
|
||||
444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
|
||||
444 444 444 444 888 888 888 444 444 444 444 888 444 444 444
|
||||
|
||||
name CHANNEL-DOWN
|
||||
2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
|
||||
444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
|
||||
444 444 444 444 444 444 888 888 444 444 444 444 444 444 888
|
||||
|
||||
name CHANNEL-UP
|
||||
2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
|
||||
444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
|
||||
444 444 444 444 444 444 888 888 444 444 444 444 444 444 444 444
|
||||
444
|
||||
|
||||
name I
|
||||
2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
|
||||
444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
|
||||
444 444 888 444 444 888 444 444 888 888 888 444 444
|
||||
|
||||
name ONOFF
|
||||
2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
|
||||
444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
|
||||
444 444 444 444 444 444 444 444 444 444 888 444 444 888 444 444
|
||||
444
|
||||
|
||||
name SKY
|
||||
2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
|
||||
444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
|
||||
444 444 888 888 444 444 444 444 444 444 444 444 444 444 444 444
|
||||
444
|
||||
|
||||
name TV
|
||||
2830 724 583 333 553 339
|
||||
548 791 543 795 977 357
|
||||
527 364 524 367 524 368
|
||||
522 369 521 370 520 371
|
||||
519 372 519 372 519 372
|
||||
518 372 518 374 963 818
|
||||
516 376 510 381 509 382
|
||||
954 828 508 407 481
|
||||
|
||||
name SKY
|
||||
2829 726 580 336 551 340
|
||||
547 791 540 798 977 366
|
||||
519 364 523 367 521 370
|
||||
521 370 520 371 520 371
|
||||
520 371 519 372 518 373
|
||||
517 374 517 374 957 825
|
||||
512 379 512 380 513 377
|
||||
511 381 506 410 477 413
|
||||
483
|
||||
|
||||
name MUTE
|
||||
2567 429 751 447 743 456
|
||||
1335 464 734 466 1325 496
|
||||
697 504 693 506 1284 513
|
||||
681 518 681 517 679 520
|
||||
678 26288 2533 462 734 489
|
||||
705 470 1323 501 695 503
|
||||
1287 511 683 516 683 518
|
||||
1277 522 676 521 678 521
|
||||
675 523 675 26286 2533 465
|
||||
731 491 702 499 1293 504
|
||||
692 507 1280 518 683 516
|
||||
679 524 1272 522 675 529
|
||||
670 523 682 517 675 26286
|
||||
2532 465 729 493 702 473
|
||||
1318 506 688 509 1282 517
|
||||
680 519 677 524 1274 523
|
||||
676
|
||||
|
||||
name VOLUME-UP
|
||||
2568 430 766 433 1342 456
|
||||
734 489 708 466 1326 497
|
||||
699 505 686 508 1286 512
|
||||
688 510 683 516 682 516
|
||||
681 26284 2540 481 711 488
|
||||
1301 498 703 495 695 504
|
||||
1284 516 682 516 684 515
|
||||
1276 522 675 523 675 524
|
||||
674 524 675 26286 2532 490
|
||||
709 489 1300 500 689 509
|
||||
695 517 1270 516 683 520
|
||||
675 519 1274 529 668 525
|
||||
675 524 673 526 672 26288
|
||||
2532 466 731 491 1300 499
|
||||
695 503 692 509 1277 520
|
||||
681 518 679 519 1278 520
|
||||
675
|
||||
|
||||
name VOLUME-DOWN
|
||||
2562 434 1348 451 1332 465
|
||||
733 489 704 496 1296 504
|
||||
690 507 694 511 1281 511
|
||||
683 523 677 515 679 520
|
||||
680 25687 2533 464 1330 491
|
||||
1295 505 693 506 689 510
|
||||
1293 505 684 516 678 520
|
||||
1276 523 677 520 675 524
|
||||
673 526 674 25686 2531 467
|
||||
1324 498 1292 506 691 509
|
||||
683 515 1280 518 678 521
|
||||
675 523 1273 525 674 527
|
||||
672 525 673 527 671 25685
|
||||
2531 467 1320 501 1288 511
|
||||
687 511 688 512 1282 516
|
||||
678 521 675 524 1273
|
||||
|
||||
name TVGUIDE
|
||||
2834 720 586 330 554 338
|
||||
548 794 539 796 975 360
|
||||
528 363 521 371 519 371
|
||||
520 371 519 375 514 374
|
||||
517 374 516 375 513 379
|
||||
511 380 510 381 949 387
|
||||
500 836 505 387 945 391
|
||||
493 868 469 422 468
|
||||
|
||||
name BOXOFFICE
|
||||
2833 745 564 329 555 338
|
||||
548 790 545 793 982 352
|
||||
529 362 526 365 522 370
|
||||
519 371 519 372 519 372
|
||||
518 373 517 374 513 378
|
||||
515 376 507 384 506 385
|
||||
945 390 496 396 498 392
|
||||
496 419 468 847 936
|
||||
|
||||
name SERVICES
|
||||
2829 725 585 330 555 338
|
||||
548 798 537 794 979 356
|
||||
528 368 522 363 523 369
|
||||
521 370 521 370 520 370
|
||||
520 371 520 371 520 371
|
||||
519 372 519 372 518 373
|
||||
964 371 517 375 513 377
|
||||
511 404 489 402 485 828
|
||||
514
|
||||
|
||||
name INTERACTIVE
|
||||
2829 726 591 324 553 340
|
||||
550 788 542 796 981 354
|
||||
532 359 522 369 522 369
|
||||
520 372 518 373 518 373
|
||||
516 375 515 375 513 379
|
||||
515 375 510 381 948 389
|
||||
498 392 504 412 470 867
|
||||
916 866 913
|
||||
|
||||
end raw_codes
|
||||
|
||||
end remote
|
@ -1,303 +0,0 @@
|
||||
/*
|
||||
* sky.c: A plugin for the Video Disk Recorder
|
||||
*
|
||||
* See the README file for copyright information and how to reach the author.
|
||||
*
|
||||
* $Id: sky.c 2.1 2008/09/07 11:54:07 kls Exp $
|
||||
*/
|
||||
|
||||
#include <sys/socket.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/time.h>
|
||||
#include <sys/un.h>
|
||||
#include <unistd.h>
|
||||
#include <vdr/device.h>
|
||||
#include <vdr/plugin.h>
|
||||
#include <vdr/sources.h>
|
||||
|
||||
static const char *VERSION = "0.3.8";
|
||||
static const char *DESCRIPTION = "Sky Digibox interface";
|
||||
|
||||
// --- cDigiboxDevice --------------------------------------------------------
|
||||
|
||||
#define DUMMYAPID 80
|
||||
#define DUMMYVPID 160
|
||||
|
||||
class cSkyChannel : public cListObject {
|
||||
public:
|
||||
tChannelID channelID;
|
||||
int digiboxChannelNumber;
|
||||
bool Parse(const char *s);
|
||||
};
|
||||
|
||||
bool cSkyChannel::Parse(const char *s)
|
||||
{
|
||||
char *id = NULL;
|
||||
if (2 == sscanf(s, "%a[^:]:%d", &id, &digiboxChannelNumber))
|
||||
channelID = tChannelID::FromString(id);
|
||||
free(id);
|
||||
return digiboxChannelNumber && channelID.Valid();
|
||||
}
|
||||
|
||||
class cSkyChannels : public cConfig<cSkyChannel> {
|
||||
public:
|
||||
cSkyChannel *GetSkyChannel(const cChannel *Channel);
|
||||
};
|
||||
|
||||
cSkyChannel *cSkyChannels::GetSkyChannel(const cChannel *Channel)
|
||||
{
|
||||
tChannelID ChannelID = Channel->GetChannelID();
|
||||
for (cSkyChannel *sc = First(); sc; sc = Next(sc)) {
|
||||
if (ChannelID == sc->channelID)
|
||||
return sc;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
cSkyChannels SkyChannels;
|
||||
|
||||
class cDigiboxDevice : public cDevice {
|
||||
private:
|
||||
int source;
|
||||
int digiboxChannelNumber;
|
||||
int fd_dvr;
|
||||
int apid, vpid;
|
||||
cTSBuffer *tsBuffer;
|
||||
int fd_lirc;
|
||||
void LircSend(const char *s);
|
||||
void LircSend(int n);
|
||||
protected:
|
||||
virtual bool SetPid(cPidHandle *Handle, int Type, bool On);
|
||||
virtual bool OpenDvr(void);
|
||||
virtual void CloseDvr(void);
|
||||
virtual bool GetTSPacket(uchar *&Data);
|
||||
public:
|
||||
cDigiboxDevice(void);
|
||||
virtual ~cDigiboxDevice();
|
||||
virtual bool ProvidesSource(int Source) const;
|
||||
virtual bool ProvidesTransponder(const cChannel *Channel) const;
|
||||
virtual bool ProvidesChannel(const cChannel *Channel, int Priority = -1, bool *NeedsSetChannel = NULL) const;
|
||||
virtual bool SetChannelDevice(const cChannel *Channel, bool LiveView);
|
||||
};
|
||||
|
||||
cDigiboxDevice::cDigiboxDevice(void)
|
||||
{
|
||||
source = cSource::FromString("S28.2E");//XXX parameter???
|
||||
digiboxChannelNumber = 0;
|
||||
fd_dvr = -1;
|
||||
apid = vpid = 0;
|
||||
struct sockaddr_un addr;
|
||||
addr.sun_family = AF_UNIX;
|
||||
strn0cpy(addr.sun_path, "/dev/lircd", sizeof(addr.sun_path));//XXX parameter???
|
||||
fd_lirc = socket(AF_UNIX, SOCK_STREAM, 0);
|
||||
if (fd_lirc >= 0) {
|
||||
if (connect(fd_lirc, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
|
||||
LOG_ERROR;
|
||||
close(fd_lirc);
|
||||
}
|
||||
}
|
||||
else
|
||||
LOG_ERROR;
|
||||
}
|
||||
|
||||
cDigiboxDevice::~cDigiboxDevice()
|
||||
{
|
||||
if (fd_lirc >= 0)
|
||||
close(fd_lirc);
|
||||
}
|
||||
|
||||
void cDigiboxDevice::LircSend(const char *s)
|
||||
{
|
||||
char buf[100];
|
||||
snprintf(buf, sizeof(buf), "SEND_ONCE SKY %s\n", s);
|
||||
dsyslog(buf);//XXX
|
||||
if (write(fd_lirc, buf, strlen(buf)) < 0)
|
||||
LOG_ERROR;//XXX _STR
|
||||
cCondWait::SleepMs(200);
|
||||
}
|
||||
|
||||
void cDigiboxDevice::LircSend(int n)
|
||||
{
|
||||
char buf[10];
|
||||
snprintf(buf, sizeof(buf), "%d", n);
|
||||
char *p = buf;
|
||||
while (*p) {
|
||||
char q[10];
|
||||
sprintf(q, "%c", *p);
|
||||
LircSend(q);
|
||||
p++;
|
||||
}
|
||||
}
|
||||
|
||||
bool cDigiboxDevice::SetPid(cPidHandle *Handle, int Type, bool On)
|
||||
{
|
||||
//dsyslog("SetPid %d %d", Handle->pid, On);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool cDigiboxDevice::OpenDvr(void)
|
||||
{
|
||||
CloseDvr();
|
||||
fd_dvr = open("/dev/video2", O_RDONLY | O_NONBLOCK);//XXX parameter???
|
||||
if (fd_dvr >= 0)
|
||||
tsBuffer = new cTSBuffer(fd_dvr, MEGABYTE(2), CardIndex() + 1);
|
||||
return fd_dvr >= 0;
|
||||
}
|
||||
|
||||
void cDigiboxDevice::CloseDvr(void)
|
||||
{
|
||||
if (fd_dvr >= 0) {
|
||||
close(fd_dvr);
|
||||
fd_dvr = -1;
|
||||
delete tsBuffer;
|
||||
tsBuffer = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
bool cDigiboxDevice::GetTSPacket(uchar *&Data)
|
||||
{
|
||||
if (tsBuffer) {
|
||||
Data = tsBuffer->Get();
|
||||
if (Data) {
|
||||
// insert the actual PIDs:
|
||||
int Pid = (((uint16_t)Data[1] & TS_PID_MASK_HI) << 8) | Data[2];
|
||||
if (Pid == DUMMYAPID)
|
||||
Pid = apid;
|
||||
else if (Pid == DUMMYVPID)
|
||||
Pid = vpid;
|
||||
Data[1] = ((Pid >> 8) & 0xFF) | (Data[1] & ~TS_PID_MASK_HI);
|
||||
Data[2] = Pid & 0xFF;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool cDigiboxDevice::ProvidesSource(int Source) const
|
||||
{
|
||||
return source == Source;
|
||||
}
|
||||
|
||||
bool cDigiboxDevice::ProvidesTransponder(const cChannel *Channel) const
|
||||
{
|
||||
return false; // can't provide any actual transponder
|
||||
}
|
||||
|
||||
bool cDigiboxDevice::ProvidesChannel(const cChannel *Channel, int Priority, bool *NeedsDetachReceivers) const
|
||||
{
|
||||
bool result = false;
|
||||
bool hasPriority = Priority < 0 || Priority > this->Priority();
|
||||
bool needsDetachReceivers = true;
|
||||
|
||||
cSkyChannel *SkyChannel = SkyChannels.GetSkyChannel(Channel);
|
||||
if (SkyChannel) {
|
||||
if (Receiving(true)) {
|
||||
if (digiboxChannelNumber == SkyChannel->digiboxChannelNumber) {
|
||||
needsDetachReceivers = false;
|
||||
result = true;
|
||||
}
|
||||
else
|
||||
result = hasPriority;
|
||||
}
|
||||
else
|
||||
result = hasPriority;
|
||||
}
|
||||
if (NeedsDetachReceivers)
|
||||
*NeedsDetachReceivers = needsDetachReceivers;
|
||||
return result;
|
||||
}
|
||||
|
||||
bool cDigiboxDevice::SetChannelDevice(const cChannel *Channel, bool LiveView)
|
||||
{
|
||||
if (fd_lirc >= 0 && !Receiving(true)) { // if we are receiving the channel is already set!
|
||||
cSkyChannel *SkyChannel = SkyChannels.GetSkyChannel(Channel);
|
||||
if (SkyChannel) {
|
||||
digiboxChannelNumber = SkyChannel->digiboxChannelNumber;
|
||||
apid = Channel->Apid(0);
|
||||
vpid = Channel->Vpid();
|
||||
//XXX only when recording??? -> faster channel switching!
|
||||
LircSend("SKY"); // makes sure the Digibox is "on"
|
||||
//XXX lircprint(fd_lirc, "BACKUP");
|
||||
//XXX lircprint(fd_lirc, "BACKUP");
|
||||
//XXX lircprint(fd_lirc, "BACKUP");
|
||||
LircSend(digiboxChannelNumber);
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
// --- cPluginSky ------------------------------------------------------------
|
||||
|
||||
class cPluginSky : public cPlugin {
|
||||
private:
|
||||
// Add any member variables or functions you may need here.
|
||||
public:
|
||||
cPluginSky(void);
|
||||
virtual ~cPluginSky();
|
||||
virtual const char *Version(void) { return VERSION; }
|
||||
virtual const char *Description(void) { return DESCRIPTION; }
|
||||
virtual const char *CommandLineHelp(void);
|
||||
virtual bool ProcessArgs(int argc, char *argv[]);
|
||||
virtual bool Initialize(void);
|
||||
virtual void Housekeeping(void);
|
||||
virtual cMenuSetupPage *SetupMenu(void);
|
||||
virtual bool SetupParse(const char *Name, const char *Value);
|
||||
};
|
||||
|
||||
cPluginSky::cPluginSky(void)
|
||||
{
|
||||
// Initialize any member variables here.
|
||||
// DON'T DO ANYTHING ELSE THAT MAY HAVE SIDE EFFECTS, REQUIRE GLOBAL
|
||||
// VDR OBJECTS TO EXIST OR PRODUCE ANY OUTPUT!
|
||||
}
|
||||
|
||||
cPluginSky::~cPluginSky()
|
||||
{
|
||||
// Clean up after yourself!
|
||||
}
|
||||
|
||||
const char *cPluginSky::CommandLineHelp(void)
|
||||
{
|
||||
// Return a string that describes all known command line options.
|
||||
return NULL;
|
||||
}
|
||||
|
||||
bool cPluginSky::ProcessArgs(int argc, char *argv[])
|
||||
{
|
||||
// Implement command line argument processing here if applicable.
|
||||
return true;
|
||||
}
|
||||
|
||||
bool cPluginSky::Initialize(void)
|
||||
{
|
||||
// Initialize any background activities the plugin shall perform.
|
||||
const char *ConfigDir = ConfigDirectory(Name());
|
||||
if (ConfigDir) {
|
||||
if (SkyChannels.Load(AddDirectory(ConfigDir, "channels.conf.sky"), true)) {
|
||||
new cDigiboxDevice;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
else
|
||||
esyslog("ERROR: can't get config directory");
|
||||
return false;
|
||||
}
|
||||
|
||||
void cPluginSky::Housekeeping(void)
|
||||
{
|
||||
// Perform any cleanup or other regular tasks.
|
||||
}
|
||||
|
||||
cMenuSetupPage *cPluginSky::SetupMenu(void)
|
||||
{
|
||||
// Return a setup menu in case the plugin supports one.
|
||||
return NULL;
|
||||
}
|
||||
|
||||
bool cPluginSky::SetupParse(const char *Name, const char *Value)
|
||||
{
|
||||
// Parse your own setup parameters and store their values.
|
||||
return false;
|
||||
}
|
||||
|
||||
VDRPLUGINCREATOR(cPluginSky); // Don't touch this!
|
@ -44,3 +44,42 @@ VDR Plugin 'status' Revision History
|
||||
2008-02-16: Version 0.3.0
|
||||
|
||||
- Added new cStatus functions.
|
||||
|
||||
2012-03-11: Version 0.3.1
|
||||
|
||||
- Added new parameter LiveView to ChannelSwitch() (reported by Udo Richter).
|
||||
|
||||
2012-12-27: Version 0.3.2
|
||||
|
||||
- Adapted Makefile to changes introduced in recent VDR versions.
|
||||
|
||||
2013-01-12: Version 0.3.3
|
||||
|
||||
- Adapted Makefile to changes introduced in recent VDR versions.
|
||||
|
||||
2013-03-31: Version 2.0.0
|
||||
|
||||
- Official release.
|
||||
|
||||
2014-01-01: Version 2.1.1
|
||||
|
||||
- Avoiding unnecessary pkg-config warnings in plugin Makefiles.
|
||||
|
||||
2015-02-19: Version 2.2.0
|
||||
|
||||
- Official release.
|
||||
|
||||
2018-04-15: Version 2.4.0
|
||||
|
||||
- Official release.
|
||||
|
||||
2021-12-27: Version 2.6.0
|
||||
|
||||
- Official release.
|
||||
|
||||
2025-02-10: Version 2.6.1
|
||||
|
||||
- Added cStatus::OsdItem2().
|
||||
- Activated logging of OsdItem2().
|
||||
- Added cStatus::OsdCurrentItem2().
|
||||
- Added cStatus::OsdStatusMessage2().
|
||||
|
@ -1,47 +1,55 @@
|
||||
#
|
||||
# Makefile for a Video Disk Recorder plugin
|
||||
#
|
||||
# $Id: Makefile 1.15 2008/01/13 13:00:18 kls Exp $
|
||||
# $Id: Makefile 4.3 2020/06/22 15:08:46 kls Exp $
|
||||
|
||||
# The official name of this plugin.
|
||||
# This name will be used in the '-P...' option of VDR to load the plugin.
|
||||
# By default the main source file also carries this name.
|
||||
#
|
||||
|
||||
PLUGIN = status
|
||||
|
||||
### The version number of this plugin (taken from the main source file):
|
||||
|
||||
VERSION = $(shell grep 'static const char \*VERSION *=' $(PLUGIN).c | awk '{ print $$6 }' | sed -e 's/[";]//g')
|
||||
|
||||
### The C++ compiler and options:
|
||||
|
||||
CXX ?= g++
|
||||
CXXFLAGS ?= -fPIC -g -O2 -Wall -Woverloaded-virtual -Wno-parentheses
|
||||
|
||||
### The directory environment:
|
||||
|
||||
VDRDIR = ../../..
|
||||
LIBDIR = ../../lib
|
||||
TMPDIR = /tmp
|
||||
# Use package data if installed...otherwise assume we're under the VDR source directory:
|
||||
PKG_CONFIG ?= pkg-config
|
||||
PKGCFG = $(if $(VDRDIR),$(shell $(PKG_CONFIG) --variable=$(1) $(VDRDIR)/vdr.pc),$(shell PKG_CONFIG_PATH="$$PKG_CONFIG_PATH:../../.." $(PKG_CONFIG) --variable=$(1) vdr))
|
||||
LIBDIR = $(call PKGCFG,libdir)
|
||||
PLGCFG = $(call PKGCFG,plgcfg)
|
||||
#
|
||||
TMPDIR ?= /tmp
|
||||
|
||||
### The compiler options:
|
||||
|
||||
export CFLAGS = $(call PKGCFG,cflags)
|
||||
export CXXFLAGS = $(call PKGCFG,cxxflags)
|
||||
|
||||
### The version number of VDR's plugin API:
|
||||
|
||||
APIVERSION = $(call PKGCFG,apiversion)
|
||||
|
||||
### Allow user defined options to overwrite defaults:
|
||||
|
||||
-include $(VDRDIR)/Make.config
|
||||
|
||||
### The version number of VDR's plugin API (taken from VDR's "config.h"):
|
||||
|
||||
APIVERSION = $(shell sed -ne '/define APIVERSION/s/^.*"\(.*\)".*$$/\1/p' $(VDRDIR)/config.h)
|
||||
-include $(PLGCFG)
|
||||
|
||||
### The name of the distribution archive:
|
||||
|
||||
ARCHIVE = $(PLUGIN)-$(VERSION)
|
||||
PACKAGE = vdr-$(ARCHIVE)
|
||||
|
||||
### The name of the shared object file:
|
||||
|
||||
SOFILE = libvdr-$(PLUGIN).so
|
||||
|
||||
### Includes and Defines (add further entries here):
|
||||
|
||||
INCLUDES += -I$(VDRDIR)/include
|
||||
INCLUDES +=
|
||||
|
||||
DEFINES += -D_GNU_SOURCE -DPLUGIN_NAME_I18N='"$(PLUGIN)"'
|
||||
DEFINES += -DPLUGIN_NAME_I18N='"$(PLUGIN)"'
|
||||
|
||||
### The object files (add further files here):
|
||||
|
||||
@ -49,27 +57,33 @@ OBJS = $(PLUGIN).o
|
||||
|
||||
### The main target:
|
||||
|
||||
all: libvdr-$(PLUGIN).so
|
||||
all: $(SOFILE)
|
||||
|
||||
### Implicit rules:
|
||||
|
||||
%.o: %.c
|
||||
$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) $<
|
||||
@echo CC $@
|
||||
$(Q)$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) -o $@ $<
|
||||
|
||||
# Dependencies:
|
||||
### Dependencies:
|
||||
|
||||
MAKEDEP = g++ -MM -MG
|
||||
MAKEDEP = $(CXX) -MM -MG
|
||||
DEPFILE = .dependencies
|
||||
$(DEPFILE): Makefile
|
||||
@$(MAKEDEP) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@
|
||||
@$(MAKEDEP) $(CXXFLAGS) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@
|
||||
|
||||
-include $(DEPFILE)
|
||||
|
||||
### Targets:
|
||||
|
||||
libvdr-$(PLUGIN).so: $(OBJS)
|
||||
$(CXX) $(CXXFLAGS) -shared $(OBJS) -o $@
|
||||
@cp --remove-destination $@ $(LIBDIR)/$@.$(APIVERSION)
|
||||
$(SOFILE): $(OBJS)
|
||||
@echo LD $@
|
||||
$(Q)$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS) -o $@
|
||||
|
||||
install-lib: $(SOFILE)
|
||||
install -D $^ $(DESTDIR)$(LIBDIR)/$^.$(APIVERSION)
|
||||
|
||||
install: install-lib
|
||||
|
||||
dist: clean
|
||||
@-rm -rf $(TMPDIR)/$(ARCHIVE)
|
||||
|
@ -1,10 +1,10 @@
|
||||
This is a "plugin" for the Video Disk Recorder (VDR).
|
||||
|
||||
Written by: Klaus Schmidinger <kls@cadsoft.de>
|
||||
Written by: Klaus Schmidinger <vdr@tvdr.de>
|
||||
|
||||
Project's homepage: www.cadsoft.de/people/kls/vdr
|
||||
Project's homepage: https://www.tvdr.de
|
||||
|
||||
Latest version available at: www.cadsoft.de/people/kls/vdr/software.htm
|
||||
Latest version available at: https://www.tvdr.de
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
|
@ -3,13 +3,13 @@
|
||||
*
|
||||
* See the README file for copyright information and how to reach the author.
|
||||
*
|
||||
* $Id: status.c 1.10 2008/02/16 15:41:05 kls Exp $
|
||||
* $Id: status.c 5.4 2025/02/12 21:18:53 kls Exp $
|
||||
*/
|
||||
|
||||
#include <vdr/plugin.h>
|
||||
#include <vdr/status.h>
|
||||
|
||||
static const char *VERSION = "0.3.0";
|
||||
static const char *VERSION = "2.6.1";
|
||||
static const char *DESCRIPTION = "Status monitor test";
|
||||
static const char *MAINMENUENTRY = NULL;
|
||||
|
||||
@ -18,7 +18,7 @@ static const char *MAINMENUENTRY = NULL;
|
||||
class cStatusTest : public cStatus {
|
||||
protected:
|
||||
virtual void TimerChange(const cTimer *Timer, eTimerChange Change);
|
||||
virtual void ChannelSwitch(const cDevice *Device, int ChannelNumber);
|
||||
virtual void ChannelSwitch(const cDevice *Device, int ChannelNumber, bool LiveView);
|
||||
virtual void Recording(const cDevice *Device, const char *Name, const char *FileName, bool On);
|
||||
virtual void Replaying(const cControl *Control, const char *Name, const char *FileName, bool On);
|
||||
virtual void SetVolume(int Volume, bool Absolute);
|
||||
@ -27,10 +27,10 @@ protected:
|
||||
virtual void SetSubtitleTrack(int Index, const char * const *Tracks);
|
||||
virtual void OsdClear(void);
|
||||
virtual void OsdTitle(const char *Title);
|
||||
virtual void OsdStatusMessage(const char *Message);
|
||||
virtual void OsdStatusMessage2(eMessageType Type, const char *Message);
|
||||
virtual void OsdHelpKeys(const char *Red, const char *Green, const char *Yellow, const char *Blue);
|
||||
virtual void OsdItem(const char *Text, int Index);
|
||||
virtual void OsdCurrentItem(const char *Text);
|
||||
virtual void OsdItem2(const char *Text, int Index, bool Selectable);
|
||||
virtual void OsdCurrentItem2(const char *Text, int Index);
|
||||
virtual void OsdTextItem(const char *Text, bool Scroll);
|
||||
virtual void OsdChannel(const char *Text);
|
||||
virtual void OsdProgramme(time_t PresentTime, const char *PresentTitle, const char *PresentSubtitle, time_t FollowingTime, const char *FollowingTitle, const char *FollowingSubtitle);
|
||||
@ -41,9 +41,9 @@ void cStatusTest::TimerChange(const cTimer *Timer, eTimerChange Change)
|
||||
dsyslog("status: cStatusTest::TimerChange %s %d", Timer ? *Timer->ToText(true) : "-", Change);
|
||||
}
|
||||
|
||||
void cStatusTest::ChannelSwitch(const cDevice *Device, int ChannelNumber)
|
||||
void cStatusTest::ChannelSwitch(const cDevice *Device, int ChannelNumber, bool LiveView)
|
||||
{
|
||||
dsyslog("status: cStatusTest::ChannelSwitch %d %d", Device->CardIndex(), ChannelNumber);
|
||||
dsyslog("status: cStatusTest::ChannelSwitch %d %d %d", Device->CardIndex(), ChannelNumber, LiveView);
|
||||
}
|
||||
|
||||
void cStatusTest::Recording(const cDevice *Device, const char *Name, const char *FileName, bool On)
|
||||
@ -86,9 +86,9 @@ void cStatusTest::OsdTitle(const char *Title)
|
||||
dsyslog("status: cStatusTest::OsdTitle '%s'", Title);
|
||||
}
|
||||
|
||||
void cStatusTest::OsdStatusMessage(const char *Message)
|
||||
void cStatusTest::OsdStatusMessage2(eMessageType Type, const char *Message)
|
||||
{
|
||||
dsyslog("status: cStatusTest::OsdStatusMessage '%s'", Message);
|
||||
dsyslog("status: cStatusTest::OsdStatusMessage2 %d '%s'", Type, Message);
|
||||
}
|
||||
|
||||
void cStatusTest::OsdHelpKeys(const char *Red, const char *Green, const char *Yellow, const char *Blue)
|
||||
@ -96,14 +96,14 @@ void cStatusTest::OsdHelpKeys(const char *Red, const char *Green, const char *Ye
|
||||
dsyslog("status: cStatusTest::OsdHelpKeys %s - %s - %s - %s", Red, Green, Yellow, Blue);
|
||||
}
|
||||
|
||||
void cStatusTest::OsdItem(const char *Text, int Index)
|
||||
void cStatusTest::OsdItem2(const char *Text, int Index, bool Selected)
|
||||
{
|
||||
//dsyslog("status: cStatusTest::OsdItem %s %d", Text, Index);
|
||||
dsyslog("status: cStatusTest::OsdItem2 %s %d %d", Text, Index, Selected);
|
||||
}
|
||||
|
||||
void cStatusTest::OsdCurrentItem(const char *Text)
|
||||
void cStatusTest::OsdCurrentItem2(const char *Text, int Index)
|
||||
{
|
||||
dsyslog("status: cStatusTest::OsdCurrentItem %s", Text);
|
||||
dsyslog("status: cStatusTest::OsdCurrentItem %s %d", Text, Index);
|
||||
}
|
||||
|
||||
void cStatusTest::OsdTextItem(const char *Text, bool Scroll)
|
||||
|
@ -13,3 +13,31 @@ VDR Plugin 'svdrpdemo' Revision History
|
||||
|
||||
- Moved the "all" target in the Makefile before the "Implicit rules",
|
||||
so that a plain "make" will compile everything.
|
||||
|
||||
2012-12-27: Version 0.0.4
|
||||
|
||||
- Adapted Makefile to changes introduced in recent VDR versions.
|
||||
|
||||
2013-01-12: Version 0.0.5
|
||||
|
||||
- Adapted Makefile to changes introduced in recent VDR versions.
|
||||
|
||||
2013-03-31: Version 2.0.0
|
||||
|
||||
- Official release.
|
||||
|
||||
2014-01-01: Version 2.1.1
|
||||
|
||||
- Avoiding unnecessary pkg-config warnings in plugin Makefiles.
|
||||
|
||||
2015-02-19: Version 2.2.0
|
||||
|
||||
- Official release.
|
||||
|
||||
2018-04-15: Version 2.4.0
|
||||
|
||||
- Official release.
|
||||
|
||||
2021-12-27: Version 2.6.0
|
||||
|
||||
- Official release.
|
||||
|
@ -1,47 +1,55 @@
|
||||
#
|
||||
# Makefile for a Video Disk Recorder plugin
|
||||
#
|
||||
# $Id: Makefile 1.9 2008/01/13 13:00:20 kls Exp $
|
||||
# $Id: Makefile 4.3 2020/06/22 15:08:46 kls Exp $
|
||||
|
||||
# The official name of this plugin.
|
||||
# This name will be used in the '-P...' option of VDR to load the plugin.
|
||||
# By default the main source file also carries this name.
|
||||
#
|
||||
|
||||
PLUGIN = svdrpdemo
|
||||
|
||||
### The version number of this plugin (taken from the main source file):
|
||||
|
||||
VERSION = $(shell grep 'static const char \*VERSION *=' $(PLUGIN).c | awk '{ print $$6 }' | sed -e 's/[";]//g')
|
||||
|
||||
### The C++ compiler and options:
|
||||
|
||||
CXX ?= g++
|
||||
CXXFLAGS ?= -fPIC -g -O2 -Wall -Woverloaded-virtual -Wno-parentheses
|
||||
|
||||
### The directory environment:
|
||||
|
||||
VDRDIR = ../../..
|
||||
LIBDIR = ../../lib
|
||||
TMPDIR = /tmp
|
||||
# Use package data if installed...otherwise assume we're under the VDR source directory:
|
||||
PKG_CONFIG ?= pkg-config
|
||||
PKGCFG = $(if $(VDRDIR),$(shell $(PKG_CONFIG) --variable=$(1) $(VDRDIR)/vdr.pc),$(shell PKG_CONFIG_PATH="$$PKG_CONFIG_PATH:../../.." $(PKG_CONFIG) --variable=$(1) vdr))
|
||||
LIBDIR = $(call PKGCFG,libdir)
|
||||
PLGCFG = $(call PKGCFG,plgcfg)
|
||||
#
|
||||
TMPDIR ?= /tmp
|
||||
|
||||
### The compiler options:
|
||||
|
||||
export CFLAGS = $(call PKGCFG,cflags)
|
||||
export CXXFLAGS = $(call PKGCFG,cxxflags)
|
||||
|
||||
### The version number of VDR's plugin API:
|
||||
|
||||
APIVERSION = $(call PKGCFG,apiversion)
|
||||
|
||||
### Allow user defined options to overwrite defaults:
|
||||
|
||||
-include $(VDRDIR)/Make.config
|
||||
|
||||
### The version number of VDR's plugin API (taken from VDR's "config.h"):
|
||||
|
||||
APIVERSION = $(shell sed -ne '/define APIVERSION/s/^.*"\(.*\)".*$$/\1/p' $(VDRDIR)/config.h)
|
||||
-include $(PLGCFG)
|
||||
|
||||
### The name of the distribution archive:
|
||||
|
||||
ARCHIVE = $(PLUGIN)-$(VERSION)
|
||||
PACKAGE = vdr-$(ARCHIVE)
|
||||
|
||||
### The name of the shared object file:
|
||||
|
||||
SOFILE = libvdr-$(PLUGIN).so
|
||||
|
||||
### Includes and Defines (add further entries here):
|
||||
|
||||
INCLUDES += -I$(VDRDIR)/include
|
||||
INCLUDES +=
|
||||
|
||||
DEFINES += -D_GNU_SOURCE -DPLUGIN_NAME_I18N='"$(PLUGIN)"'
|
||||
DEFINES += -DPLUGIN_NAME_I18N='"$(PLUGIN)"'
|
||||
|
||||
### The object files (add further files here):
|
||||
|
||||
@ -49,27 +57,33 @@ OBJS = $(PLUGIN).o
|
||||
|
||||
### The main target:
|
||||
|
||||
all: libvdr-$(PLUGIN).so
|
||||
all: $(SOFILE)
|
||||
|
||||
### Implicit rules:
|
||||
|
||||
%.o: %.c
|
||||
$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) $<
|
||||
@echo CC $@
|
||||
$(Q)$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) -o $@ $<
|
||||
|
||||
# Dependencies:
|
||||
### Dependencies:
|
||||
|
||||
MAKEDEP = $(CXX) -MM -MG
|
||||
DEPFILE = .dependencies
|
||||
$(DEPFILE): Makefile
|
||||
@$(MAKEDEP) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@
|
||||
@$(MAKEDEP) $(CXXFLAGS) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@
|
||||
|
||||
-include $(DEPFILE)
|
||||
|
||||
### Targets:
|
||||
|
||||
libvdr-$(PLUGIN).so: $(OBJS)
|
||||
$(CXX) $(CXXFLAGS) -shared $(OBJS) -o $@
|
||||
@cp --remove-destination $@ $(LIBDIR)/$@.$(APIVERSION)
|
||||
$(SOFILE): $(OBJS)
|
||||
@echo LD $@
|
||||
$(Q)$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS) -o $@
|
||||
|
||||
install-lib: $(SOFILE)
|
||||
install -D $^ $(DESTDIR)$(LIBDIR)/$^.$(APIVERSION)
|
||||
|
||||
install: install-lib
|
||||
|
||||
dist: clean
|
||||
@-rm -rf $(TMPDIR)/$(ARCHIVE)
|
||||
|
@ -1,10 +1,10 @@
|
||||
This is a "plugin" for the Video Disk Recorder (VDR).
|
||||
|
||||
Written by: Klaus Schmidinger <Klaus.Schmidinger@cadsoft.de>
|
||||
Written by: Klaus Schmidinger <Klaus.Schmidinger@tvdr.de>
|
||||
|
||||
Project's homepage: http://www.cadsoft.de/vdr
|
||||
Project's homepage: https://www.tvdr.de
|
||||
|
||||
Latest version available at: http://www.cadsoft.de/vdr
|
||||
Latest version available at: https://www.tvdr.de
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
|
@ -3,12 +3,12 @@
|
||||
*
|
||||
* See the README file for copyright information and how to reach the author.
|
||||
*
|
||||
* $Id: svdrpdemo.c 1.3 2007/08/15 13:19:57 kls Exp $
|
||||
* $Id: svdrpdemo.c 4.1 2018/04/10 13:01:07 kls Exp $
|
||||
*/
|
||||
|
||||
#include <vdr/plugin.h>
|
||||
|
||||
static const char *VERSION = "0.0.3";
|
||||
static const char *VERSION = "2.4.0";
|
||||
static const char *DESCRIPTION = "How to add SVDRP support to a plugin";
|
||||
|
||||
class cPluginSvdrpdemo : public cPlugin {
|
||||
|
15
README
15
README
@ -4,10 +4,7 @@ Video Disk Recorder ('VDR')
|
||||
These files contain the source code of the "Video Disk Recorder",
|
||||
which is based on the DVB driver of the LinuxTV project (http://linuxtv.org).
|
||||
For details about the "Video Disk Recorder" project please
|
||||
refer to http://www.cadsoft.de/vdr.
|
||||
|
||||
There is also a remote control unit described on those
|
||||
Web pages, which can be used within this program.
|
||||
refer to https://www.tvdr.de.
|
||||
|
||||
Please see the INSTALL file for details on how to install
|
||||
this program on your computer.
|
||||
@ -17,7 +14,7 @@ The MANUAL file describes how to operate the VDR.
|
||||
The CONTRIBUTORS file lists all the people who have contributed to the
|
||||
development of VDR.
|
||||
|
||||
The author can be contacted at kls@cadsoft.de.
|
||||
The author can be contacted at vdr@tvdr.de.
|
||||
|
||||
Yet another "set-top box"?
|
||||
--------------------------
|
||||
@ -34,3 +31,11 @@ file management and even "on disk editing". The menus
|
||||
of commercial set-top boxes usually are a lot more fancy than
|
||||
the ones in this system, but here we have the full source code
|
||||
and can modify the menus in whatever way desired.
|
||||
|
||||
If you actually use VDR, please add yourself to the "VDR User Counter"
|
||||
at https://www.tvdr.de/counter.htm. You can also like VDR on facebook
|
||||
at https://www.facebook.com/VideoDiskRecorder.
|
||||
|
||||
|
||||
"VDR Video Disk Recorder" is a registered trademark of Klaus Schmidinger.
|
||||
"TVDR TV Done Right" is a registered trademark of Klaus Schmidinger.
|
||||
|
@ -52,5 +52,5 @@ How to maintain an existing language file
|
||||
|
||||
Once you have created or updated a translation file, please
|
||||
send it to the maintainer of the respective plugin (in case
|
||||
it belongs to a plugin) or to kls@cadsoft.de (for core VDR
|
||||
it belongs to a plugin) or to vdr@tvdr.de (for core VDR
|
||||
language files).
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user