Compare commits
6561 Commits
v2.3.3
...
nuovo_upda
| Author | SHA1 | Date | |
|---|---|---|---|
| 22b61234a9 | |||
| f129d57f30 | |||
| 607f3c8128 | |||
| 75e0f8bfa0 | |||
| 50954f50ec | |||
| 59ad6be60e | |||
| b22139ba2c | |||
| bde83602d6 | |||
|
|
84a6d7ec93 | ||
|
|
3ffa260525 | ||
|
|
edb24c906f | ||
|
|
8d6ef2aebd | ||
|
|
df6b7c70d8 | ||
|
|
e0cc7d9edb | ||
|
|
e93b58895c | ||
|
|
ae13adb02f | ||
|
|
bcbb42b4c0 | ||
|
|
771d2d571a | ||
|
|
bbdb4375c5 | ||
|
|
88cdae47ff | ||
|
|
f1d055d4fa | ||
|
|
7d641bf83f | ||
|
|
eb14c3c0ac | ||
|
|
bb4e63471e | ||
|
|
73c5b73b64 | ||
|
|
ffffcf691d | ||
|
|
cc8353ddca | ||
|
|
b100f758af | ||
|
|
43b173c7a2 | ||
|
|
2c901fdbf1 | ||
|
|
d378d31677 | ||
|
|
3d25d8d098 | ||
|
|
1818994ded | ||
|
|
da7d766531 | ||
|
|
7d46b74bee | ||
|
|
bc90ba67be | ||
|
|
4bd441bf4d | ||
|
|
d049be14e0 | ||
|
|
5e4cf944b1 | ||
|
|
2a150f7978 | ||
|
|
125e62e763 | ||
|
|
b8a2ea0dc4 | ||
|
|
2f6c6cf453 | ||
|
|
6bc86936b2 | ||
|
|
404c9558eb | ||
|
|
7ce8acd5eb | ||
|
|
2f4edf4d79 | ||
|
|
6c5746a2ad | ||
|
|
521f168ab9 | ||
|
|
26e5fb068e | ||
|
|
895b81edb7 | ||
|
|
412025c514 | ||
|
|
29915fa6e4 | ||
|
|
48fd712f81 | ||
|
|
c8ffa002a3 | ||
|
|
430b7174bf | ||
|
|
251d7f2687 | ||
|
|
c8047932e2 | ||
|
|
f6e2410a2d | ||
|
|
f84527c700 | ||
|
|
f7e467c23a | ||
|
|
1f160b96f9 | ||
|
|
6c08f820e6 | ||
|
|
cc07517afb | ||
|
|
72f850ef3b | ||
|
|
26c8122500 | ||
|
|
1b7fc47781 | ||
|
|
db0802f5bc | ||
|
|
3ce79ced23 | ||
|
|
8f98b6486a | ||
|
|
ef1c9a7736 | ||
|
|
8150bace6c | ||
|
|
987755c058 | ||
|
|
a44c567ad7 | ||
|
|
74c43e5755 | ||
|
|
cc5619d7b2 | ||
|
|
58c402bcc6 | ||
|
|
575629a3ac | ||
|
|
8d72b692a4 | ||
|
|
41e6e87115 | ||
|
|
75b3db40c4 | ||
|
|
28e811b576 | ||
|
|
3f1351e11b | ||
|
|
913b8d7bed | ||
|
|
72de374f9e | ||
|
|
272f0b68e7 | ||
|
|
8b8105adef | ||
|
|
a9992b9ea6 | ||
|
|
1ca9c7031c | ||
|
|
68937da460 | ||
|
|
afe008ea89 | ||
|
|
3a183b82f8 | ||
|
|
a172fe86f3 | ||
|
|
d484a64fb2 | ||
|
|
299327d47f | ||
|
|
bf2e80dbcd | ||
|
|
79efa0a193 | ||
|
|
cea5feb59d | ||
|
|
9d28622ce8 | ||
|
|
be05eb6ec3 | ||
|
|
ae00b017a8 | ||
|
|
b5e2b26f9f | ||
|
|
86768ed294 | ||
|
|
ca3fb3e7ff | ||
|
|
d5c22b2043 | ||
|
|
1c6069eba5 | ||
|
|
d24eced956 | ||
|
|
e3cf5c6e5d | ||
|
|
ca1159e163 | ||
|
|
f1f8330419 | ||
|
|
22159f5f28 | ||
|
|
cd15000d71 | ||
|
|
aa501e2f7d | ||
|
|
9bed2d29c9 | ||
|
|
ec5a56f91e | ||
|
|
2c8dd243a6 | ||
|
|
7e5964d840 | ||
|
|
b9aed889af | ||
|
|
511f95298d | ||
|
|
b6c81c8b4e | ||
|
|
559ae1edd2 | ||
|
|
bdc025b87d | ||
|
|
2acd018503 | ||
|
|
dfff40552d | ||
|
|
09036d4d59 | ||
|
|
32f6781af5 | ||
|
|
b96b63448c | ||
|
|
803b77b9b7 | ||
|
|
6de3ae422c | ||
|
|
349752a380 | ||
|
|
6421ba1229 | ||
|
|
529c6f3669 | ||
|
|
ae34d43429 | ||
|
|
03a332eb75 | ||
|
|
9b25357d46 | ||
|
|
111a5a58d5 | ||
|
|
3e233c0658 | ||
|
|
8d7867d084 | ||
|
|
4328677965 | ||
|
|
018062037b | ||
|
|
1f3eea05ef | ||
|
|
d1d991b887 | ||
|
|
95251821f1 | ||
|
|
44109843af | ||
|
|
3ba2b28ef7 | ||
|
|
f1e7263a07 | ||
|
|
2191660bac | ||
|
|
6ddec976b9 | ||
|
|
a3999d2746 | ||
|
|
2fe75c1470 | ||
|
|
e4edd5872d | ||
|
|
7ab21e01c5 | ||
|
|
c3fa9f22aa | ||
|
|
2a1394767c | ||
|
|
647406ea5b | ||
|
|
43f343555d | ||
|
|
5b04e52af4 | ||
|
|
880b228dee | ||
|
|
f4f0dbfe97 | ||
|
|
d6c0efaba2 | ||
|
|
bbcc6e126e | ||
|
|
280dc6f217 | ||
|
|
7ae3f7e30e | ||
|
|
956526affc | ||
|
|
f44ab32bab | ||
|
|
1ab05e540c | ||
|
|
27d06bf875 | ||
|
|
a415644995 | ||
|
|
3d480a9b15 | ||
|
|
682e9e8b91 | ||
|
|
3b7f277270 | ||
|
|
e14f01ec80 | ||
|
|
08eb178410 | ||
|
|
46c191c725 | ||
|
|
3dbf1ee755 | ||
|
|
7faf8c726a | ||
|
|
604896083c | ||
|
|
afcd204167 | ||
|
|
14b7d8fefa | ||
|
|
4d2968a308 | ||
|
|
074adf7e73 | ||
|
|
95f28f0187 | ||
|
|
5b55e3c9f2 | ||
|
|
036252990f | ||
|
|
9aed9468d7 | ||
|
|
75b8e42fd8 | ||
|
|
29c483618f | ||
|
|
fb74d5ccb3 | ||
|
|
d4bbb01b9c | ||
|
|
14872314b6 | ||
|
|
b38631d19b | ||
|
|
34e0cde285 | ||
|
|
7c09dba22a | ||
|
|
6314317766 | ||
|
|
0d218b592e | ||
|
|
57d2aaadb3 | ||
|
|
c97c70a00e | ||
|
|
141e24e8fa | ||
|
|
c1c2aa6f0c | ||
|
|
b3ebe95278 | ||
|
|
f913513d47 | ||
|
|
03166d3226 | ||
|
|
b2288673dc | ||
|
|
7431f78b58 | ||
|
|
58ca87ce64 | ||
|
|
60807b637b | ||
|
|
93f8386df6 | ||
|
|
96acd612d6 | ||
|
|
8400b15c60 | ||
|
|
e5bb7fbca9 | ||
|
|
c85f0e28be | ||
|
|
68048f1d61 | ||
|
|
d42310a1ac | ||
|
|
1ca2b1e981 | ||
|
|
76550bcebb | ||
|
|
e1ce48e859 | ||
|
|
8cc7cd3ae6 | ||
|
|
db36530e97 | ||
|
|
84b7e9e5f2 | ||
|
|
f66c75a0e0 | ||
|
|
b4b2c4aa43 | ||
|
|
7d92a9bc41 | ||
|
|
a01a097b88 | ||
|
|
18ee7b3c17 | ||
|
|
62d63483d4 | ||
|
|
5d611224c6 | ||
|
|
17d4615015 | ||
|
|
f3127f54f5 | ||
|
|
b7e28501a7 | ||
|
|
58e01dc49d | ||
|
|
769306faa3 | ||
|
|
14660b5aaa | ||
|
|
a7dbe4f287 | ||
|
|
839885c5c7 | ||
|
|
14488c4c54 | ||
|
|
0cfe48cc74 | ||
|
|
9055e2ac02 | ||
|
|
b46cec8041 | ||
|
|
aabaa8d78c | ||
|
|
0333e1262d | ||
|
|
d628d9108d | ||
|
|
66a79e4e21 | ||
|
|
0a25af3aba | ||
|
|
c59bb0da6f | ||
|
|
f65d05b52f | ||
|
|
9af9a564f9 | ||
|
|
a88e915d0f | ||
|
|
2a2e0d8c60 | ||
|
|
36be150ad4 | ||
|
|
a6f9413ee1 | ||
|
|
ff4b428e1b | ||
|
|
e19b5245d8 | ||
|
|
29e27940d5 | ||
|
|
2717037824 | ||
|
|
cfc7ee7855 | ||
|
|
a507fa3143 | ||
|
|
9d0fe1fdf7 | ||
|
|
f6bc183fba | ||
|
|
bd61acb55f | ||
|
|
6bf5f01442 | ||
|
|
d5af2723b7 | ||
|
|
4ab3f80e05 | ||
|
|
4364ae20be | ||
|
|
647abfc5b0 | ||
|
|
f20f223da0 | ||
|
|
5f12bdf049 | ||
|
|
f528dd9556 | ||
|
|
b611c4ca3a | ||
|
|
990017a533 | ||
|
|
1cdc11d84e | ||
|
|
e40145fae2 | ||
|
|
44903392e1 | ||
|
|
89a5513852 | ||
|
|
184d497aec | ||
|
|
b1983b754b | ||
|
|
36665f517b | ||
|
|
43526800bb | ||
|
|
e1c9cd232f | ||
|
|
4263b76650 | ||
|
|
24443db5ee | ||
|
|
fcb1ecfde7 | ||
|
|
49e22dbe3b | ||
|
|
1433ee2a32 | ||
|
|
3b7beb6daf | ||
|
|
09be82638d | ||
|
|
52aadb2352 | ||
|
|
92aa849d16 | ||
|
|
fdfa364943 | ||
|
|
c1832406c3 | ||
|
|
a511eaa355 | ||
|
|
1bedea3214 | ||
|
|
14c77d2d8d | ||
|
|
5ed63ea2ed | ||
|
|
8a048464a4 | ||
|
|
14ce21a646 | ||
|
|
39dbbc655e | ||
|
|
9a821de508 | ||
|
|
14ee433eb5 | ||
|
|
605b74e8f8 | ||
|
|
fc96554986 | ||
|
|
24580fec0b | ||
|
|
c1ce1abcae | ||
|
|
2c294785da | ||
|
|
9fb3b3c261 | ||
|
|
dc04b19ce7 | ||
|
|
c0f14dbe4f | ||
|
|
1dfc394565 | ||
|
|
11b6e8bc75 | ||
|
|
1bf4acac39 | ||
|
|
3e9a5813af | ||
|
|
74de895999 | ||
|
|
a846c17e79 | ||
|
|
5bf69c93b9 | ||
|
|
4fd7b80203 | ||
|
|
b1e46658f0 | ||
|
|
fcf3f8cba3 | ||
|
|
09a5a07923 | ||
|
|
726e524c1f | ||
|
|
0eaada8ba4 | ||
|
|
41e4a9f02d | ||
|
|
295d6560cc | ||
|
|
9ec6f09ca3 | ||
|
|
36042ac2bc | ||
|
|
00c9a72966 | ||
|
|
13a14dd3e5 | ||
|
|
2787c980db | ||
|
|
ef018fce11 | ||
|
|
f18aab9fa8 | ||
|
|
f0ab97a6fd | ||
|
|
043f12afe8 | ||
|
|
f5a6384653 | ||
|
|
8982993835 | ||
|
|
84e22ca681 | ||
|
|
54816418b3 | ||
|
|
8748cd39e9 | ||
|
|
c77e6105ec | ||
|
|
66f562b5f6 | ||
|
|
2f37557f97 | ||
|
|
265f00c20d | ||
|
|
7cacbf1b22 | ||
|
|
7bf554d333 | ||
|
|
e13b8fc202 | ||
|
|
e91e29b95d | ||
|
|
d7ab122d31 | ||
|
|
17f8cab8d7 | ||
|
|
5c56c5e1ec | ||
|
|
bb49bf1405 | ||
|
|
b98ac40d66 | ||
|
|
d44f23497e | ||
|
|
0536c4dfde | ||
|
|
237a8cad77 | ||
|
|
e78e0006b0 | ||
|
|
e94885cedc | ||
|
|
75b2937c41 | ||
|
|
75fd8e04c7 | ||
|
|
9ca822fb7b | ||
|
|
b625462cbc | ||
|
|
09d29418b9 | ||
|
|
340f202c6d | ||
|
|
3fe8478a00 | ||
|
|
4a37dc5207 | ||
|
|
43fc32c5cd | ||
|
|
1f1bf35493 | ||
|
|
2968299354 | ||
|
|
136782b5fc | ||
|
|
5d5080ca7f | ||
|
|
1c322fc604 | ||
|
|
fba9e0f007 | ||
|
|
f78a60d612 | ||
|
|
43d43543b7 | ||
|
|
7e1769bfe5 | ||
|
|
9c07dceab7 | ||
|
|
54bab829b5 | ||
|
|
204ae57e2b | ||
|
|
770e819ad6 | ||
|
|
b2ec377d56 | ||
|
|
e2f195ebd3 | ||
|
|
c94b32da26 | ||
|
|
5ff98c23ce | ||
|
|
707d8c7fd1 | ||
|
|
6abf9d0d09 | ||
|
|
88ccec0b15 | ||
|
|
0a4cba7489 | ||
|
|
b11fb3dec3 | ||
|
|
84951a6801 | ||
|
|
84bc6f6135 | ||
|
|
94e107e17c | ||
|
|
8ae182536c | ||
|
|
f545d74a75 | ||
|
|
b23480664b | ||
|
|
8648014368 | ||
|
|
3da43a418b | ||
|
|
bb9ec6dcdc | ||
|
|
d78abb98ee | ||
|
|
2ef54dd4be | ||
|
|
c30e1311d6 | ||
|
|
61dac80edd | ||
|
|
e059f6e4c6 | ||
|
|
cd7ecd2c48 | ||
|
|
9128f26657 | ||
|
|
183c285b6f | ||
|
|
6a0a46dcff | ||
|
|
3e019573c9 | ||
|
|
22bfc53eaa | ||
|
|
04639802d5 | ||
|
|
46658a2595 | ||
|
|
650489ac46 | ||
|
|
abdfd25011 | ||
|
|
ee837ace97 | ||
|
|
6c43f5101b | ||
|
|
9109d6ec55 | ||
|
|
f6a10e1eda | ||
|
|
1542f6493a | ||
|
|
10f0899e81 | ||
|
|
d5ec41e305 | ||
|
|
0be70c79b1 | ||
|
|
36b8912a18 | ||
|
|
b66d292ff2 | ||
|
|
d723f0552b | ||
|
|
4cfb971475 | ||
|
|
b0f3e4022c | ||
|
|
7e2c5a6b4b | ||
|
|
a832a90dfa | ||
|
|
be782638d1 | ||
|
|
d3e6779ea5 | ||
|
|
c3ba3a1be6 | ||
|
|
7feac8a061 | ||
|
|
e937b70a65 | ||
|
|
51042bf9df | ||
|
|
ef6e3eecb4 | ||
|
|
518d99893a | ||
|
|
56869b48d0 | ||
|
|
4a8b3fd1b6 | ||
|
|
de8d6ff46d | ||
|
|
667f7f31ff | ||
|
|
1102ad2191 | ||
|
|
88c011ec75 | ||
|
|
d83541b5cb | ||
|
|
24c5489d2d | ||
|
|
50372763dc | ||
|
|
a5c265ac40 | ||
|
|
77dc4168ff | ||
|
|
d20384c9cf | ||
|
|
fb80f47bc8 | ||
|
|
f590067983 | ||
|
|
5383448d44 | ||
|
|
9e991c2d49 | ||
|
|
555c0491f2 | ||
|
|
1fda900526 | ||
|
|
17d90cd906 | ||
|
|
d4129b0da2 | ||
|
|
80261ee7ce | ||
|
|
2f5cb8d959 | ||
|
|
1bfc5841f8 | ||
|
|
89e13e71f8 | ||
|
|
2d67edd310 | ||
|
|
352df6dea6 | ||
|
|
636371b658 | ||
|
|
c190f9e3d7 | ||
|
|
812b4a5b08 | ||
|
|
22337380aa | ||
|
|
83aab2a115 | ||
|
|
c9798071f3 | ||
|
|
1cc2790198 | ||
|
|
ed82c22823 | ||
|
|
0042142878 | ||
|
|
422d21d2a0 | ||
|
|
2c4e0330ba | ||
|
|
20b5a52d40 | ||
|
|
d300adbdb4 | ||
|
|
aec6f6811e | ||
|
|
86bff2be1e | ||
|
|
bfff10a459 | ||
|
|
d93ac324ce | ||
|
|
96b2a4dbfd | ||
|
|
fa188aa719 | ||
|
|
65475409b6 | ||
|
|
16d3ad375f | ||
|
|
50b8ac8c08 | ||
|
|
794828696b | ||
|
|
26da64bceb | ||
|
|
20f9048225 | ||
|
|
7d7f191f3c | ||
|
|
89c577dc32 | ||
|
|
52ad47a924 | ||
|
|
bf9e875195 | ||
|
|
eca909a5f8 | ||
|
|
2198e6a8a8 | ||
|
|
005236f52e | ||
|
|
4441f443b4 | ||
|
|
fd4071bc36 | ||
|
|
f7639a7321 | ||
|
|
44808ac042 | ||
|
|
95ff7ddeea | ||
|
|
09df8697ea | ||
|
|
3b746a5fa1 | ||
|
|
7c41d4a16f | ||
|
|
68b126153b | ||
|
|
bff9e65af6 | ||
|
|
f7d661dabf | ||
|
|
336470cc96 | ||
|
|
43da897cf3 | ||
|
|
51da0d223d | ||
|
|
a1236b244d | ||
|
|
a33b455d85 | ||
|
|
bf04f60efd | ||
|
|
0576e101d9 | ||
|
|
47b1dca226 | ||
|
|
f3bd94fd2b | ||
|
|
e0b99a5491 | ||
|
|
5fbf15b83b | ||
|
|
4b71a0d708 | ||
|
|
1401d79879 | ||
|
|
7fc11153fd | ||
|
|
d79e9f358c | ||
|
|
aaab9b867d | ||
|
|
4ac8a7d863 | ||
|
|
ebd3473750 | ||
|
|
074e7b9c79 | ||
|
|
f85f8a94d5 | ||
|
|
71b7f72f13 | ||
|
|
ccf72d517b | ||
|
|
6f9a35ebbc | ||
|
|
7ab66fbb8a | ||
|
|
5484fcc661 | ||
|
|
1a782fd8da | ||
|
|
33ba9fea0d | ||
|
|
4f4d4bc54f | ||
|
|
336e485f60 | ||
|
|
6c3976424a | ||
|
|
72ba8d6efd | ||
|
|
d39194384b | ||
|
|
58287a76ac | ||
|
|
fc924e604d | ||
|
|
1398e96ed6 | ||
|
|
6aabebb232 | ||
|
|
9e3f74f453 | ||
|
|
cc9445ae7c | ||
|
|
61057ded3b | ||
|
|
b3a552e7ef | ||
|
|
7b64e558e7 | ||
|
|
ee5bde91a5 | ||
|
|
e33e46570f | ||
|
|
94912089b7 | ||
|
|
1135c9b96d | ||
|
|
82346899f1 | ||
|
|
49e609b4e0 | ||
|
|
75d83f423c | ||
|
|
6c6d10f35c | ||
|
|
92d009ccd7 | ||
|
|
70e3deaa31 | ||
|
|
4eeb4f7627 | ||
|
|
152633e912 | ||
|
|
1c07e53788 | ||
|
|
ad2804a32c | ||
|
|
247630947f | ||
|
|
a2f03b5f55 | ||
|
|
3f9ecc60eb | ||
|
|
4b5488b445 | ||
|
|
51e19264f4 | ||
|
|
4af7e668cc | ||
|
|
26cd6d4f24 | ||
|
|
2d9413af9d | ||
|
|
f3011b5b5d | ||
|
|
2b8b1d42f2 | ||
|
|
f92894e877 | ||
|
|
0fca66e7f4 | ||
|
|
5cc3290bef | ||
|
|
0e1c544add | ||
|
|
4805152a7d | ||
|
|
4cea872956 | ||
|
|
c7fad20777 | ||
|
|
7de34da0b8 | ||
|
|
7c9da143a9 | ||
|
|
e3544248ee | ||
|
|
87cfef27ea | ||
|
|
8803f1a1dd | ||
|
|
823b234549 | ||
|
|
06ea564dbf | ||
|
|
5923da3325 | ||
|
|
12943c26d9 | ||
|
|
afa381d6ba | ||
|
|
911d4b2a9d | ||
|
|
e8ad9c3c0f | ||
|
|
46302a0f7f | ||
|
|
77e9338661 | ||
|
|
647fdf9987 | ||
|
|
4396e4ce15 | ||
|
|
905e9aeafe | ||
|
|
bbd10b5f76 | ||
|
|
ff5a009167 | ||
|
|
4ef558dd5b | ||
|
|
3b89ecd157 | ||
|
|
fae18dd562 | ||
|
|
a1e14e3f51 | ||
|
|
d02891bb2b | ||
|
|
7eec8ffbc0 | ||
|
|
84b5d77139 | ||
|
|
5c072c8530 | ||
|
|
41ed3c2210 | ||
|
|
88251e9f1a | ||
|
|
cd7df20b9f | ||
|
|
4e8c12ed50 | ||
|
|
49ad5154cf | ||
|
|
9e06b9acb5 | ||
|
|
1e2bd87b7e | ||
|
|
0cf74df051 | ||
|
|
9342bfaa06 | ||
|
|
ff4e30dcd7 | ||
|
|
d3240f4b78 | ||
|
|
69d5088b85 | ||
|
|
566628b774 | ||
|
|
bf8417674e | ||
|
|
c829292cc3 | ||
|
|
0d34139dea | ||
|
|
788cfcff22 | ||
|
|
1d9b5c9dd1 | ||
|
|
30842961d2 | ||
|
|
537668906f | ||
|
|
69fa5e7bf4 | ||
|
|
2de8b6c7e0 | ||
|
|
6324d3124c | ||
|
|
a58129f03c | ||
|
|
d7451c421d | ||
|
|
61b50ec301 | ||
|
|
73247722da | ||
|
|
724e61820e | ||
|
|
cf41316ffc | ||
|
|
613b9abcc6 | ||
|
|
7e7c7e8654 | ||
|
|
3b3902cb29 | ||
|
|
9b65bb4291 | ||
|
|
104c2d4fd4 | ||
|
|
0e915e591a | ||
|
|
8221e09825 | ||
|
|
71cb39ddc4 | ||
|
|
aacdd5d749 | ||
|
|
db39d6bed9 | ||
|
|
187b66fd7c | ||
|
|
c2625c9ba8 | ||
|
|
64fe224029 | ||
|
|
471a7bb74b | ||
|
|
938b1b5c69 | ||
|
|
8bad53bdd5 | ||
|
|
e0eef19c78 | ||
|
|
52abd760a4 | ||
|
|
888956b158 | ||
|
|
e892af34bb | ||
|
|
621725d354 | ||
|
|
caf4b83230 | ||
|
|
872170d935 | ||
|
|
71e29792d0 | ||
|
|
de6d1eb0da | ||
|
|
6cb981d4f1 | ||
|
|
21574b21db | ||
|
|
881f268079 | ||
|
|
29a5b2569e | ||
|
|
a7a94eb20b | ||
|
|
f339fabffa | ||
|
|
adfaa868c8 | ||
|
|
06c7467e4a | ||
|
|
0129828c54 | ||
|
|
542cb33c03 | ||
|
|
c21ae8cf07 | ||
|
|
c02050417d | ||
|
|
edecfb8df4 | ||
|
|
9cc3ab7f52 | ||
|
|
17a33a6ed9 | ||
|
|
682eeddce6 | ||
|
|
0505607b09 | ||
|
|
de8a2388fd | ||
|
|
297603f6cb | ||
|
|
db33ccf61f | ||
|
|
180c2d640a | ||
|
|
ed94dedbc2 | ||
|
|
8ce21e8e10 | ||
|
|
d682cd7886 | ||
|
|
519830bfea | ||
|
|
a6c8a61a0b | ||
|
|
03e8d7018f | ||
|
|
91871c7846 | ||
|
|
92e8a3fcc4 | ||
|
|
791ac16674 | ||
|
|
afd99db33f | ||
|
|
4caad5d27f | ||
|
|
a9ccecdd44 | ||
|
|
38585f5baa | ||
|
|
0dd880537c | ||
|
|
84b30d3be6 | ||
|
|
4a1735fbb4 | ||
|
|
2bfad01bd5 | ||
|
|
3b52812f55 | ||
|
|
c92fbd38bb | ||
|
|
fe109622fa | ||
|
|
a3bfb3b184 | ||
|
|
139a7fe588 | ||
|
|
42b3bbf574 | ||
|
|
867a0bf36b | ||
|
|
27634c3907 | ||
|
|
d8388c44a4 | ||
|
|
dd2314153c | ||
|
|
a47103c056 | ||
|
|
d17b46465c | ||
|
|
a953280d4d | ||
|
|
b4ab8549ff | ||
|
|
0338d248e0 | ||
|
|
3fa58014f6 | ||
|
|
a038497d94 | ||
|
|
3bd5d636e1 | ||
|
|
a588b44c9c | ||
|
|
4a96b8c987 | ||
|
|
83b7e1e821 | ||
|
|
3e88831439 | ||
|
|
3de1441225 | ||
|
|
18e5302741 | ||
|
|
e3939507b8 | ||
|
|
0a6708009e | ||
|
|
b2a390a5c2 | ||
|
|
da4ed8af4c | ||
|
|
05e6e5dea8 | ||
|
|
a2bd4e464d | ||
|
|
d2338d07b2 | ||
|
|
c0b487b280 | ||
|
|
446af0fcfb | ||
|
|
71e4a487db | ||
|
|
4d31b961dd | ||
|
|
d97ca5d5fa | ||
|
|
d27fd3782f | ||
|
|
0c76096a22 | ||
|
|
897a5643a7 | ||
|
|
295304567d | ||
|
|
f82509e60c | ||
|
|
8ec1b818f2 | ||
|
|
3d4893061c | ||
|
|
cb963ec76f | ||
|
|
ad40a34d5c | ||
|
|
35ff445f9b | ||
|
|
2409f7db37 | ||
|
|
d8d1e123ef | ||
|
|
70665bea3c | ||
|
|
59e79739e5 | ||
|
|
1abb62ee01 | ||
|
|
6352e33a5a | ||
|
|
4298468aca | ||
|
|
bc4f4330c1 | ||
|
|
591fb12edf | ||
|
|
5233da7638 | ||
|
|
bc0af7e372 | ||
|
|
bd4cca09ba | ||
|
|
cbccf06cc5 | ||
|
|
92be087cc4 | ||
|
|
9af83f59d9 | ||
|
|
2ce628e367 | ||
|
|
d67ccd9b75 | ||
|
|
94262e9a0c | ||
|
|
377044a879 | ||
|
|
264b2d4292 | ||
|
|
15785a653e | ||
|
|
2dee7d7708 | ||
|
|
e1e817a93c | ||
|
|
547839f0b0 | ||
|
|
944d98a937 | ||
|
|
37e40653a8 | ||
|
|
34cc89f79e | ||
|
|
ddd2933883 | ||
|
|
38eb4ac49f | ||
|
|
80019ab6b7 | ||
|
|
83cd0280ed | ||
|
|
abec23383d | ||
|
|
7450a36530 | ||
|
|
d0baa85fe2 | ||
|
|
08a0e5c0eb | ||
|
|
338526f107 | ||
|
|
b7ba220e18 | ||
|
|
6f294c99bf | ||
|
|
b62c616693 | ||
|
|
7b7f186e47 | ||
|
|
d5c870db44 | ||
|
|
dea6782c5e | ||
|
|
95f3ec68da | ||
|
|
6b546f0dc1 | ||
|
|
52f85673cc | ||
|
|
a151ffbdff | ||
|
|
49764eae1f | ||
|
|
447104a66e | ||
|
|
49f341f6db | ||
|
|
4077f8888b | ||
|
|
802fcc3a13 | ||
|
|
06239735f5 | ||
|
|
5fec26bd6c | ||
|
|
e1d6540fe6 | ||
|
|
6f2b34a857 | ||
|
|
aafb008d5a | ||
|
|
d21ba2dcb7 | ||
|
|
646de5cae4 | ||
|
|
54ad39f1fc | ||
|
|
686d491daf | ||
|
|
70f69acfff | ||
|
|
5e08aa3391 | ||
|
|
35f7a50345 | ||
|
|
f1523e7467 | ||
|
|
6b03659b81 | ||
|
|
07fc2fb724 | ||
|
|
c1efb6db57 | ||
|
|
fdcc00d69e | ||
|
|
f24e8c8da6 | ||
|
|
158372ed1b | ||
|
|
818a423dc9 | ||
|
|
b43520223d | ||
|
|
714ea10b55 | ||
|
|
438b2a5da6 | ||
|
|
05102262ca | ||
|
|
df6f3f1177 | ||
|
|
60de78f448 | ||
|
|
6e4aec0ab9 | ||
|
|
ebbf37222e | ||
|
|
9828908bfe | ||
|
|
925a696a17 | ||
|
|
9d81c2e4b6 | ||
|
|
4610ba71af | ||
|
|
0aebc644fa | ||
|
|
cce2e330ba | ||
|
|
d0de267be7 | ||
|
|
18bb6bc4b2 | ||
|
|
e70c18efa3 | ||
|
|
852588254a | ||
|
|
e8c5f335b3 | ||
|
|
1b61616806 | ||
|
|
ae93e4d1f6 | ||
|
|
9dcd33ac07 | ||
|
|
d6d8153004 | ||
|
|
b33a250f9e | ||
|
|
d09be99136 | ||
|
|
ec4510aea4 | ||
|
|
0276dd46f6 | ||
|
|
40d8501afc | ||
|
|
3f55c94662 | ||
|
|
ebf520aaf2 | ||
|
|
8686308f86 | ||
|
|
d002307088 | ||
|
|
182cca5d5e | ||
|
|
df04d70e38 | ||
|
|
bbc6aef5d2 | ||
|
|
b3015d3ed8 | ||
|
|
9d1390491a | ||
|
|
2265300ebd | ||
|
|
2254d2851a | ||
|
|
6fde4bd5d7 | ||
|
|
fe18e7c6c2 | ||
|
|
d9a4f15340 | ||
|
|
d6dd20ba1a | ||
|
|
1e4e68cb24 | ||
|
|
cbb0d138ab | ||
|
|
9dfc558dc5 | ||
|
|
9c83458d93 | ||
|
|
d8963766c2 | ||
|
|
53fa709767 | ||
|
|
3de393f030 | ||
|
|
6f4c090e7e | ||
|
|
04e121b196 | ||
|
|
7d855652e8 | ||
|
|
0b44d573a9 | ||
|
|
70a5a55e6d | ||
|
|
7270bda78e | ||
|
|
f34269245c | ||
|
|
3defaa16ed | ||
|
|
8315a289b7 | ||
|
|
ac6883c8b2 | ||
|
|
39a1c46b62 | ||
|
|
0274446ebb | ||
|
|
74ed9e24dc | ||
|
|
5b2c76a7de | ||
|
|
06fe40ed9e | ||
|
|
3bc27f3b05 | ||
|
|
253aae6137 | ||
|
|
cdca6bb55f | ||
|
|
e1e36e1a6a | ||
|
|
8c5ea39edf | ||
|
|
133b9e07aa | ||
|
|
bc9e0a09e8 | ||
|
|
ae36c65714 | ||
|
|
3b40059cac | ||
|
|
8877110b80 | ||
|
|
4eed606c30 | ||
|
|
3452861693 | ||
|
|
c1a7544cc5 | ||
|
|
f2fc022a7c | ||
|
|
c0d514c165 | ||
|
|
e926f8f504 | ||
|
|
039117311c | ||
|
|
bd242f4875 | ||
|
|
974a581428 | ||
|
|
9977c2aa3c | ||
|
|
63ba995222 | ||
|
|
42f10a56d3 | ||
|
|
1efe6595e1 | ||
|
|
3ca7707c01 | ||
|
|
a5ba79d176 | ||
|
|
8afa165501 | ||
|
|
6e0cd8ff46 | ||
|
|
1544f32c8c | ||
|
|
999dd188fb | ||
|
|
af14b730f1 | ||
|
|
5229deeaf2 | ||
|
|
2aa492587f | ||
|
|
8c8a5c6f21 | ||
|
|
1bd771b565 | ||
|
|
613087342b | ||
|
|
be6eb18570 | ||
|
|
207df5678d | ||
|
|
1892eab9a7 | ||
|
|
b3a199e457 | ||
|
|
6a93857cc6 | ||
|
|
e5d6d71017 | ||
|
|
40841e6435 | ||
|
|
716625fd34 | ||
|
|
03c4cc53a6 | ||
|
|
a043fc3ab2 | ||
|
|
72300864c7 | ||
|
|
f78ab57f5b | ||
|
|
9d3ca7d4bc | ||
|
|
3c1094ded3 | ||
|
|
23942b3245 | ||
|
|
01d3902fbb | ||
|
|
c18b7fb226 | ||
|
|
bb52f0eb00 | ||
|
|
729bc59e96 | ||
|
|
3954e0f2a2 | ||
|
|
c984813f94 | ||
|
|
e1d2352dc2 | ||
|
|
a782901afc | ||
|
|
b8de2e3df5 | ||
|
|
a0b64c4cdf | ||
|
|
293f9e15c6 | ||
|
|
4350a593d7 | ||
|
|
d50299ca55 | ||
|
|
2d00118252 | ||
|
|
9e44409ab5 | ||
|
|
a286187235 | ||
|
|
87b205c50a | ||
|
|
352cdbaf3d | ||
|
|
2f5c6752bd | ||
|
|
3712d65afd | ||
|
|
6b12a2c893 | ||
|
|
d89d2d2ebb | ||
|
|
f0132c00a3 | ||
|
|
12446fc1b7 | ||
|
|
4f83b6f8be | ||
|
|
48eac3643b | ||
|
|
babe187084 | ||
|
|
7bb4c5b790 | ||
|
|
1e7959439f | ||
|
|
0d30206ffd | ||
|
|
55dfc1b2e4 | ||
|
|
2d6a4abc1c | ||
|
|
ffd69d9067 | ||
|
|
1bdbc18926 | ||
|
|
daae458952 | ||
|
|
917c9f4c84 | ||
|
|
664d1da7b7 | ||
|
|
e38ec3527c | ||
|
|
673147646c | ||
|
|
b29aaea5f8 | ||
|
|
6d2760278c | ||
|
|
1747d75f92 | ||
|
|
4ca25679eb | ||
|
|
dbb44fbbd1 | ||
|
|
be8cfc1948 | ||
|
|
96b9886660 | ||
|
|
4d6d447cba | ||
|
|
958038667e | ||
|
|
f9a5010785 | ||
|
|
b8e75f2dec | ||
|
|
803c374da8 | ||
|
|
0736bc316c | ||
|
|
453cbe4cb5 | ||
|
|
cc58111668 | ||
|
|
9465608423 | ||
|
|
2203a7fef8 | ||
|
|
1f354e359e | ||
|
|
28fbc4ed82 | ||
|
|
789ab9990a | ||
|
|
4647f2f1d6 | ||
|
|
bc2b7320a3 | ||
|
|
24cdd4793c | ||
|
|
12525d5791 | ||
|
|
46f06dea2d | ||
|
|
23bc83cd1b | ||
|
|
934aa0c005 | ||
|
|
fef622860c | ||
|
|
4838be5705 | ||
|
|
6fc76ddcae | ||
|
|
eee60e9187 | ||
|
|
c42bc9c0eb | ||
|
|
c71a0a8f2f | ||
|
|
db444c2eb2 | ||
|
|
f184ce97fd | ||
|
|
57076cc62f | ||
|
|
605ca3affe | ||
|
|
876e66dcf8 | ||
|
|
48f38e7ee3 | ||
|
|
803400a693 | ||
|
|
01577f9c89 | ||
|
|
b81d66bd81 | ||
|
|
a30da726c5 | ||
|
|
993ac5ab16 | ||
|
|
8d6d6a41cf | ||
|
|
8b051e49f2 | ||
|
|
9f1b65613a | ||
|
|
3321a8a119 | ||
|
|
25a97a3f11 | ||
|
|
3950ad91ef | ||
|
|
d3bde5dd51 | ||
|
|
2c852fd826 | ||
|
|
e7d5a98c4e | ||
|
|
30e4fa0261 | ||
|
|
79781333ef | ||
|
|
d7918418a2 | ||
|
|
a810a2fe4d | ||
|
|
0b52bd671a | ||
|
|
4c82dbdc2d | ||
|
|
846ac879fd | ||
|
|
4f322793b1 | ||
|
|
e531962cd9 | ||
|
|
6cca77bcf2 | ||
|
|
79198b9f0e | ||
|
|
65c63fdf87 | ||
|
|
8e91250913 | ||
|
|
07e7c550ae | ||
|
|
32ce20c630 | ||
|
|
3f08dc88e1 | ||
|
|
333cb14dfa | ||
|
|
b561d3708f | ||
|
|
e728947a6e | ||
|
|
1b2782a976 | ||
|
|
62fd35e9e2 | ||
|
|
8b7450a343 | ||
|
|
514ee756e1 | ||
|
|
d53906a30a | ||
|
|
86a04bc81c | ||
|
|
0e42a8ecb6 | ||
|
|
5b144ac71b | ||
|
|
a9746da11e | ||
|
|
68557aed96 | ||
|
|
abaff93e9f | ||
|
|
da312433f6 | ||
|
|
befa59f160 | ||
|
|
0634538f8d | ||
|
|
5e4a6d9e28 | ||
|
|
1017c661d2 | ||
|
|
74e4652d5b | ||
|
|
cbe69ac2e3 | ||
|
|
4ef89cdda8 | ||
|
|
7c197f89f1 | ||
|
|
415fcea517 | ||
|
|
9f595ef409 | ||
|
|
18720adc37 | ||
|
|
17eea720bc | ||
|
|
5be564b3e9 | ||
|
|
e9c561318e | ||
|
|
f32088bf50 | ||
|
|
955cb201a3 | ||
|
|
7b3ebf687a | ||
|
|
d4cf099e95 | ||
|
|
d87d7a17e0 | ||
|
|
ffa7749116 | ||
|
|
6524a3af02 | ||
|
|
eafb27d99c | ||
|
|
65500b10d4 | ||
|
|
a11203ec66 | ||
|
|
80149175d5 | ||
|
|
7a60974005 | ||
|
|
c9a455d4de | ||
|
|
cfeba7b2a6 | ||
|
|
be75cd2e1a | ||
|
|
2ccb90d480 | ||
|
|
41b2731f5b | ||
|
|
45f26036a1 | ||
|
|
45680c8ce4 | ||
|
|
9f41be6da0 | ||
|
|
4e0174a36a | ||
|
|
4439278232 | ||
|
|
81d9ecb41f | ||
|
|
964cc80cce | ||
|
|
8e020bb605 | ||
|
|
cf125d1e2b | ||
|
|
29a4769bcc | ||
|
|
a62841c1b3 | ||
|
|
3048b49140 | ||
|
|
39a2a4f64b | ||
|
|
a95aa5f816 | ||
|
|
3286638d37 | ||
|
|
2816a08801 | ||
|
|
e4755fd44c | ||
|
|
43f2509a56 | ||
|
|
9d7d0efde9 | ||
|
|
aa55d2e37d | ||
|
|
43b385d24d | ||
|
|
b54aa3ef85 | ||
|
|
db2a4cea91 | ||
|
|
a00641ab7a | ||
|
|
c8517dfa6d | ||
|
|
e28e59d5ae | ||
|
|
c5474c839b | ||
|
|
1e7f7d9407 | ||
|
|
986d6e63ea | ||
|
|
10939c5d7b | ||
|
|
96dcbae05d | ||
|
|
fc8b8652ca | ||
|
|
802e316539 | ||
|
|
d32349d33b | ||
|
|
a561e67735 | ||
|
|
53807e3c3c | ||
|
|
1393e46eb2 | ||
|
|
0d06c13d4e | ||
|
|
1856fb9ea5 | ||
|
|
8bab7f5b93 | ||
|
|
a77f659593 | ||
|
|
4b24d7e794 | ||
|
|
78c354ac71 | ||
|
|
5e29d761e1 | ||
|
|
d2e9b98c69 | ||
|
|
413cf4576b | ||
|
|
c8a3a8496a | ||
|
|
57191e6891 | ||
|
|
e4f9a5f9c9 | ||
|
|
1194f90b94 | ||
|
|
3f05d31c56 | ||
|
|
0532391a9d | ||
|
|
01235a9b97 | ||
|
|
49c03638df | ||
|
|
c21b2166f5 | ||
|
|
7853ad41b9 | ||
|
|
f417d643f3 | ||
|
|
0ea5f1ca51 | ||
|
|
1ff475354a | ||
|
|
e530ff7215 | ||
|
|
df541c3178 | ||
|
|
d31801fd67 | ||
|
|
b431109fcb | ||
|
|
8ede1efe6f | ||
|
|
a74a5eb5dc | ||
|
|
3256b0d8e8 | ||
|
|
cc3eb24317 | ||
|
|
87541fb1e4 | ||
|
|
f8647df9e0 | ||
|
|
bb4ccff339 | ||
|
|
3f72cebd96 | ||
|
|
5dfd4a09c2 | ||
|
|
c48e15d55d | ||
|
|
9b70993ad6 | ||
|
|
51347e597b | ||
|
|
0f24cbdfe9 | ||
|
|
f278b93314 | ||
|
|
323ef6631c | ||
|
|
8006301d72 | ||
|
|
642c0acc41 | ||
|
|
8d923b8af8 | ||
|
|
90d55a5a22 | ||
|
|
5685b106be | ||
|
|
ec752459da | ||
|
|
29049e0628 | ||
|
|
a1cc62bb24 | ||
|
|
a2b148684d | ||
|
|
1614191d70 | ||
|
|
a52d24edec | ||
|
|
d008d3922d | ||
|
|
e43cab06e0 | ||
|
|
813b71e085 | ||
|
|
4d9eab3204 | ||
|
|
a2b36c4a5c | ||
|
|
92c8841999 | ||
|
|
3032581564 | ||
|
|
a3a5651692 | ||
|
|
5988776120 | ||
|
|
0eae151584 | ||
|
|
0380382bed | ||
|
|
aa4b352349 | ||
|
|
ea75601601 | ||
|
|
d876eadea9 | ||
|
|
2ae2288452 | ||
|
|
93429cacd9 | ||
|
|
8077af637c | ||
|
|
536bf24abc | ||
|
|
dcf9248483 | ||
|
|
2fdc231967 | ||
|
|
b933646c12 | ||
|
|
f94be667ad | ||
|
|
7bc7aff1ac | ||
|
|
1312c498f2 | ||
|
|
6f6a13809a | ||
|
|
2f38a52ec9 | ||
|
|
b4832cf599 | ||
|
|
2832470acb | ||
|
|
28a7613d4f | ||
|
|
050291c701 | ||
|
|
95bd39c887 | ||
|
|
12673d5d19 | ||
|
|
9f2ede3c64 | ||
|
|
b791532691 | ||
|
|
2d3a1722a7 | ||
|
|
ff5f40b966 | ||
|
|
a1ad38d2ea | ||
|
|
5833b38f3b | ||
|
|
4308943816 | ||
|
|
34d667ffd7 | ||
|
|
7f4928bcd8 | ||
|
|
c54790b2c4 | ||
|
|
2552f6f846 | ||
|
|
4e75232460 | ||
|
|
5381a435b5 | ||
|
|
3b9a850b09 | ||
|
|
91c9089b31 | ||
|
|
43cc48174d | ||
|
|
7bb6f10ddb | ||
|
|
ff93ee6389 | ||
|
|
61d3d5cf54 | ||
|
|
2dbd7eee00 | ||
|
|
84f5a82070 | ||
|
|
c714734141 | ||
|
|
4151b88d7a | ||
|
|
81438ffa07 | ||
|
|
46c6feb086 | ||
|
|
ac1c95d537 | ||
|
|
52c8db7acb | ||
|
|
5ccf65b418 | ||
|
|
693cbc6efd | ||
|
|
eafae197a2 | ||
|
|
bfb9e7ecd3 | ||
|
|
8ce63d4e46 | ||
|
|
67a3335346 | ||
|
|
722c7b63a9 | ||
|
|
a3ea3e0ee2 | ||
|
|
9b54df6528 | ||
|
|
931f345e35 | ||
|
|
1e55f25b05 | ||
|
|
7fa8212fed | ||
|
|
7b9ac44128 | ||
|
|
b76f454c25 | ||
|
|
fd06c066f3 | ||
|
|
e1fb73139a | ||
|
|
2ef9f08bd7 | ||
|
|
00ee4fa0e9 | ||
|
|
5336a7e448 | ||
|
|
f458341d26 | ||
|
|
9d3fde88de | ||
|
|
788b7be621 | ||
|
|
8d9c45be9b | ||
|
|
768bf40c05 | ||
|
|
6424e3881c | ||
|
|
c054389a9d | ||
|
|
05424ee827 | ||
|
|
f514c3899b | ||
|
|
ae13866937 | ||
|
|
c8543e95f0 | ||
|
|
93b4174017 | ||
|
|
b9566f9cb9 | ||
|
|
a4a700b9ac | ||
|
|
b22df3e973 | ||
|
|
2850e56813 | ||
|
|
6791954287 | ||
|
|
8b6f6bf2c8 | ||
|
|
643b0bbde8 | ||
|
|
20941d820b | ||
|
|
36ae7ea078 | ||
|
|
3efb36878f | ||
|
|
1bdb9809b3 | ||
|
|
87adb67877 | ||
|
|
58084388e6 | ||
|
|
b5ae37855a | ||
|
|
6fafe0b079 | ||
|
|
1eb2ebd00d | ||
|
|
5f58a796bb | ||
|
|
6031a94a7a | ||
|
|
3be9a8f3a6 | ||
|
|
1a144a21b0 | ||
|
|
57469a1b8d | ||
|
|
fae2d805c4 | ||
|
|
27f9311a9e | ||
|
|
59aceeaeb7 | ||
|
|
b0079b4d77 | ||
|
|
3cbfb92eb3 | ||
|
|
a0e4ecb6cb | ||
|
|
d75e18b5ba | ||
|
|
76a2637aa6 | ||
|
|
88f4d57039 | ||
|
|
110adc3eba | ||
|
|
66d5ef1d5c | ||
|
|
6a9d1e9bea | ||
|
|
9881e04427 | ||
|
|
6761012a02 | ||
|
|
b6a6fdd42a | ||
|
|
bc9540064a | ||
|
|
bf70737555 | ||
|
|
9f231db4d1 | ||
|
|
92dc09f370 | ||
|
|
3c90065624 | ||
|
|
f7d0afc041 | ||
|
|
a28888b032 | ||
|
|
7aaed87dfe | ||
|
|
1d42a2ec02 | ||
|
|
18bd2b1ae7 | ||
|
|
6b2a35175e | ||
|
|
ff04ad4285 | ||
|
|
4ee336aae9 | ||
|
|
485691e6fd | ||
|
|
dce5d75b99 | ||
|
|
eeeacffed5 | ||
|
|
e2cc66211a | ||
|
|
2403789a8d | ||
|
|
bf8a096d18 | ||
|
|
8d55760990 | ||
|
|
5f786c3eb4 | ||
|
|
c2d1228665 | ||
|
|
2251d3030e | ||
|
|
4a64642ad0 | ||
|
|
cac6ff221b | ||
|
|
1392989a57 | ||
|
|
8c7b504627 | ||
|
|
f005e80cce | ||
|
|
1c6749c809 | ||
|
|
f4cc9fec05 | ||
|
|
561aaa3b2e | ||
|
|
61fa12e7a6 | ||
|
|
869929e2a3 | ||
|
|
17226d63f3 | ||
|
|
638c6f6de0 | ||
|
|
55c5f53ff1 | ||
|
|
adf5425a09 | ||
|
|
fe73fb92e5 | ||
|
|
1b26b5fac2 | ||
|
|
421f145a94 | ||
|
|
87694b51ab | ||
|
|
61d7f86ea1 | ||
|
|
bf2cd59db7 | ||
|
|
f9dcedfd83 | ||
|
|
779d916332 | ||
|
|
620c952d7e | ||
|
|
5070e32d65 | ||
|
|
c9127de030 | ||
|
|
34281e14f4 | ||
|
|
fe221566ff | ||
|
|
e7b4feae5e | ||
|
|
7a897caa2d | ||
|
|
83d1914a2a | ||
|
|
cd9e55da87 | ||
|
|
5db2172c09 | ||
|
|
e4d5311288 | ||
|
|
bb202f3dd4 | ||
|
|
6b909cfefc | ||
|
|
f296f402d6 | ||
|
|
ce42f40a24 | ||
|
|
ec8ab9db35 | ||
|
|
efa07dc581 | ||
|
|
503fe75d26 | ||
|
|
a171a9dbee | ||
|
|
077e0b2f37 | ||
|
|
383727b22b | ||
|
|
22cac8cc62 | ||
|
|
7e646f286d | ||
|
|
ea9b576fc5 | ||
|
|
843f62bcfd | ||
|
|
d3787e7dc7 | ||
|
|
463212d041 | ||
|
|
934f10682d | ||
|
|
6cda61385d | ||
|
|
0d78d6ee95 | ||
|
|
2a68a4901d | ||
|
|
68a5917e47 | ||
|
|
0401959df2 | ||
|
|
dbfc9fc341 | ||
|
|
1685856bd9 | ||
|
|
359a444e1e | ||
|
|
3914c42187 | ||
|
|
65f2093136 | ||
|
|
d123d53742 | ||
|
|
b2fb8a0a67 | ||
|
|
9908ffe697 | ||
|
|
babb973087 | ||
|
|
15caff7cd2 | ||
|
|
b13784c5af | ||
|
|
34c74849b0 | ||
|
|
bad099605c | ||
|
|
02931ef2a1 | ||
|
|
bc4c71d19c | ||
|
|
492536fcbd | ||
|
|
4513ad3282 | ||
|
|
7dde92eb43 | ||
|
|
bf147f7cdf | ||
|
|
0527ec2396 | ||
|
|
345cb3a626 | ||
|
|
420d070ca0 | ||
|
|
e40bdc341a | ||
|
|
c5d95a1013 | ||
|
|
54b56e2556 | ||
|
|
f49ed10102 | ||
|
|
d90dde306e | ||
|
|
72192899d1 | ||
|
|
8068aa42ef | ||
|
|
9244201ac1 | ||
|
|
b780f4dee7 | ||
|
|
b83cd14ecd | ||
|
|
d87deb9c3a | ||
|
|
e14abc1315 | ||
|
|
cf31c655a8 | ||
|
|
a5400226cd | ||
|
|
953138233d | ||
|
|
918fd2b20b | ||
|
|
fa52783f1b | ||
|
|
6cefae53f6 | ||
|
|
2d7a950362 | ||
|
|
370a889122 | ||
|
|
604ed63f11 | ||
|
|
41be7d15d0 | ||
|
|
24fa4dd0d2 | ||
|
|
59041eed4d | ||
|
|
2c66ec0ec0 | ||
|
|
072f1692a1 | ||
|
|
169ea9a8c4 | ||
|
|
87ed8e874a | ||
|
|
a9dac9c65b | ||
|
|
c28154608b | ||
|
|
4bcbec4253 | ||
|
|
35def5e512 | ||
|
|
e74a868799 | ||
|
|
aa54ad8755 | ||
|
|
81a9787d06 | ||
|
|
a180136f8c | ||
|
|
59ba64a5e0 | ||
|
|
d9ed79c552 | ||
|
|
45ca7943d3 | ||
|
|
749e635911 | ||
|
|
e2840b00b9 | ||
|
|
327290efdb | ||
|
|
46af20912b | ||
|
|
cc61259e88 | ||
|
|
7588c1a9cf | ||
|
|
3ecf89732e | ||
|
|
0f921975bf | ||
|
|
6fc7d73cf6 | ||
|
|
c51861e4a4 | ||
|
|
b8ba6f9bba | ||
|
|
9c8f33f7cf | ||
|
|
d1bf89a4c3 | ||
|
|
709cb616e7 | ||
|
|
ddf75b8192 | ||
|
|
0952f63584 | ||
|
|
29c98b48ea | ||
|
|
213a573d10 | ||
|
|
5ad6f2d228 | ||
|
|
433b28b3a0 | ||
|
|
ce9e41171b | ||
|
|
3e037fcdb2 | ||
|
|
8a13267d75 | ||
|
|
15f96768c4 | ||
|
|
5cc9f96b4b | ||
|
|
b8b7d26542 | ||
|
|
3baf7422b7 | ||
|
|
c07558e545 | ||
|
|
e62f9fd51d | ||
|
|
3ecc17db98 | ||
|
|
a9c6dac6f4 | ||
|
|
058b3ed507 | ||
|
|
d0f022070f | ||
|
|
4982a1021f | ||
|
|
f1ef16661b | ||
|
|
634b9b3b84 | ||
|
|
b0ac43c5e3 | ||
|
|
abe07810d2 | ||
|
|
744ce34473 | ||
|
|
5c62b0186c | ||
|
|
7de181cf2d | ||
|
|
7238c011d2 | ||
|
|
3929bf4140 | ||
|
|
3e4141151f | ||
|
|
feaf9fb826 | ||
|
|
e0fcc9c11c | ||
|
|
11557ed5e4 | ||
|
|
9ee4c95453 | ||
|
|
154dfa469f | ||
|
|
2c98ce45cf | ||
|
|
0fe1fb9d11 | ||
|
|
5b7203a9cd | ||
|
|
59a7f14b75 | ||
|
|
d01ef7bc55 | ||
|
|
3975e1e9c5 | ||
|
|
0ecca0ba46 | ||
|
|
2ba7af7d03 | ||
|
|
bb3ed403bd | ||
|
|
a9ff01be70 | ||
|
|
37403795ff | ||
|
|
a7125e158a | ||
|
|
4b926ff4b3 | ||
|
|
9e83b9aaa9 | ||
|
|
bb767470a8 | ||
|
|
95c0688c63 | ||
|
|
527cfa86d7 | ||
|
|
43726402a7 | ||
|
|
37a42e485d | ||
|
|
585aebec95 | ||
|
|
6f95182718 | ||
|
|
3cbbee1dcd | ||
|
|
6447b0ac4e | ||
|
|
af0a83b5cf | ||
|
|
342d36fa78 | ||
|
|
30bde135b2 | ||
|
|
b9c059f84e | ||
|
|
51b138dd88 | ||
|
|
03a5253e0e | ||
|
|
2c84897674 | ||
|
|
d38b11667e | ||
|
|
7ffb74c0e1 | ||
|
|
1e1327da90 | ||
|
|
bce00f441b | ||
|
|
3ef5876ab9 | ||
|
|
ca974293bc | ||
|
|
9c951f918f | ||
|
|
245196fa7d | ||
|
|
f878c1f224 | ||
|
|
4439679d15 | ||
|
|
20404c1c5b | ||
|
|
7a7b914585 | ||
|
|
d2ca99c7fc | ||
|
|
f291e42832 | ||
|
|
964a754b09 | ||
|
|
cfef5b0198 | ||
|
|
4f0aaf3969 | ||
|
|
7998362b0b | ||
|
|
fd0e476cda | ||
|
|
d702648ef4 | ||
|
|
ddb5f02bc1 | ||
|
|
6f97d167db | ||
|
|
f0dc793112 | ||
|
|
5740220340 | ||
|
|
1bf332262a | ||
|
|
2e8e241ad8 | ||
|
|
3fe3fe4438 | ||
|
|
95ab9c6953 | ||
|
|
6ab09686ce | ||
|
|
8f3440cce6 | ||
|
|
cf18ee92d8 | ||
|
|
eb4242e091 | ||
|
|
89b1893b30 | ||
|
|
639ddefbe1 | ||
|
|
89f1684693 | ||
|
|
113a1dc7df | ||
|
|
96d3692522 | ||
|
|
794f7d6d79 | ||
|
|
8eae130850 | ||
|
|
8a28fb3499 | ||
|
|
089cec0ea6 | ||
|
|
207aabbc79 | ||
|
|
742c3307d0 | ||
|
|
a1f0609fc8 | ||
|
|
ed3d959d5a | ||
|
|
02e19a962a | ||
|
|
5a679b6fa8 | ||
|
|
7b1ba2d4f2 | ||
|
|
bee4b3fcff | ||
|
|
c353686eaa | ||
|
|
ecb8fc910b | ||
|
|
09cc856460 | ||
|
|
4a5dca826e | ||
|
|
0075f61d6c | ||
|
|
3ad48eb38c | ||
|
|
4d49b74c26 | ||
|
|
ba30ce20ba | ||
|
|
2ffe3d5fbd | ||
|
|
eb460fe44e | ||
|
|
0872713436 | ||
|
|
2f2957c5f6 | ||
|
|
180400d487 | ||
|
|
494393d216 | ||
|
|
f807938f35 | ||
|
|
7f8c9f8db4 | ||
|
|
391bce3905 | ||
|
|
c97e1744e1 | ||
|
|
ccd4cb22c8 | ||
|
|
7932613f76 | ||
|
|
d6cd5ccf76 | ||
|
|
f002201565 | ||
|
|
4944f3d9b8 | ||
|
|
375db0d2a5 | ||
|
|
6c5af264c3 | ||
|
|
195f207dd4 | ||
|
|
8f0afb0bb5 | ||
|
|
4bae35e072 | ||
|
|
36d2d6b355 | ||
|
|
18bf5e998e | ||
|
|
91a8800a92 | ||
|
|
6468e1898c | ||
|
|
c5e5dc9b1c | ||
|
|
9e58ed9e50 | ||
|
|
f5e384a554 | ||
|
|
b489ee97b7 | ||
|
|
7b6bc11486 | ||
|
|
91e33053fd | ||
|
|
8ec243a0af | ||
|
|
7930b95211 | ||
|
|
a8c72db863 | ||
|
|
7a1404628d | ||
|
|
b492a2bd71 | ||
|
|
8cbb109c01 | ||
|
|
1a61aa5c1b | ||
|
|
59c1e66b28 | ||
|
|
6e8dd1c551 | ||
|
|
c93fd73f77 | ||
|
|
bba0a43573 | ||
|
|
8cf472d5b1 | ||
|
|
3bfbb38214 | ||
|
|
17bced601f | ||
|
|
a997a14ec8 | ||
|
|
93edf5deab | ||
|
|
a30d765713 | ||
|
|
1de58db75b | ||
|
|
dda4d4bbc6 | ||
|
|
c45a0017e9 | ||
|
|
6d5d4f6046 | ||
|
|
528218aed3 | ||
|
|
44b5cfac27 | ||
|
|
4fba90059f | ||
|
|
86adb7ee8e | ||
|
|
ddfd86f48e | ||
|
|
6f19d3263d | ||
|
|
67ffce6ede | ||
|
|
61ee2dc1c6 | ||
|
|
74ae96f97f | ||
|
|
e33c6d836d | ||
|
|
da94fe501e | ||
|
|
3e599cfd62 | ||
|
|
e755d71127 | ||
|
|
483fab34df | ||
|
|
4f2e889b23 | ||
|
|
7a2b2bd843 | ||
|
|
c563b0e089 | ||
|
|
e71718a047 | ||
|
|
8184ecf1ce | ||
|
|
866f7aac81 | ||
|
|
73c7fb6b6d | ||
|
|
6ad913ddea | ||
|
|
0a870f2e04 | ||
|
|
47704ba79e | ||
|
|
8c2ded3fc1 | ||
|
|
74c380fa64 | ||
|
|
d169a8c193 | ||
|
|
da1a2b6837 | ||
|
|
5f09acd7c2 | ||
|
|
e80834e110 | ||
|
|
039a82945a | ||
|
|
f5bbd3b78b | ||
|
|
012b7ba940 | ||
|
|
75427b5ee1 | ||
|
|
dec79f130c | ||
|
|
19d22c3c41 | ||
|
|
b2d3429eca | ||
|
|
ccd60185ab | ||
|
|
2acd828874 | ||
|
|
98eacce893 | ||
|
|
8fa69efc71 | ||
|
|
3ffb7498f4 | ||
|
|
923beb5bba | ||
|
|
e55da824fc | ||
|
|
43f850fbdb | ||
|
|
896a7ea045 | ||
|
|
aeba476572 | ||
|
|
fce5633602 | ||
|
|
c17cc9be72 | ||
|
|
2489e8ed6c | ||
|
|
d8592bc0ba | ||
|
|
3d45a725f2 | ||
|
|
a7977ef57c | ||
|
|
da793f2e31 | ||
|
|
34adfe11b9 | ||
|
|
7e49da0998 | ||
|
|
e4aaeca3c8 | ||
|
|
e4065078dd | ||
|
|
e9eb4b38e0 | ||
|
|
009b34fb2e | ||
|
|
20afab27e9 | ||
|
|
ae5d33e47a | ||
|
|
a8f24f5840 | ||
|
|
9416857884 | ||
|
|
bb32d975eb | ||
|
|
c260b658cc | ||
|
|
a9be1f60af | ||
|
|
c90ac0e936 | ||
|
|
de648659b2 | ||
|
|
1b3b67c4dd | ||
|
|
b07dc69a90 | ||
|
|
c55a3f444f | ||
|
|
29d233afca | ||
|
|
887515db61 | ||
|
|
247b8c618c | ||
|
|
d729ef4fa9 | ||
|
|
ab80b4e8ce | ||
|
|
5f45c31e82 | ||
|
|
bdd9ae1d94 | ||
|
|
402a56a0ed | ||
|
|
9f8eef846a | ||
|
|
13f081ae90 | ||
|
|
ffb2857031 | ||
|
|
f7feeb515c | ||
|
|
531ba2d65b | ||
|
|
9a6f7d55be | ||
|
|
16f6aaa459 | ||
|
|
395f695c23 | ||
|
|
26a8ff7a8c | ||
|
|
5c2302eb4a | ||
|
|
91b6cf6691 | ||
|
|
36dcb2bf01 | ||
|
|
2d73b5adb2 | ||
|
|
2951129936 | ||
|
|
38f8ed6487 | ||
|
|
8bc3464ef5 | ||
|
|
601962df83 | ||
|
|
8c07ff95a7 | ||
|
|
0d8af39a0c | ||
|
|
702d89ff51 | ||
|
|
030ea82231 | ||
|
|
f7d2a83cdb | ||
|
|
ce4a810804 | ||
|
|
00a4195da8 | ||
|
|
465b68638c | ||
|
|
d877f98317 | ||
|
|
cf00c2a410 | ||
|
|
50eacd96f9 | ||
|
|
31f5c7e564 | ||
|
|
da62ee547d | ||
|
|
3d22cbbaa6 | ||
|
|
be23cf8cce | ||
|
|
49224723fc | ||
|
|
0afc888490 | ||
|
|
8395c0abeb | ||
|
|
a923745572 | ||
|
|
c2fd125268 | ||
|
|
2206265250 | ||
|
|
22c1ab4d16 | ||
|
|
a50c27f41b | ||
|
|
6b858ed281 | ||
|
|
9a37482b5e | ||
|
|
d2506cb078 | ||
|
|
c126219b03 | ||
|
|
8bd5d06ce8 | ||
|
|
c3d20372ab | ||
|
|
d1cdd98ac0 | ||
|
|
c60fe0cb97 | ||
|
|
9347c0dbbe | ||
|
|
0f4c1c7de1 | ||
|
|
29b1cc1dff | ||
|
|
660662669b | ||
|
|
a3d8362d13 | ||
|
|
e18b48516f | ||
|
|
ac40d94d9f | ||
|
|
e4607f5a74 | ||
|
|
40c201f4fc | ||
|
|
d57af7d738 | ||
|
|
0670dcee49 | ||
|
|
568cb30d7b | ||
|
|
319c639965 | ||
|
|
049281991b | ||
|
|
560f46946c | ||
|
|
536464fc5b | ||
|
|
f0c93e778a | ||
|
|
46995fe32a | ||
|
|
b477c070f3 | ||
|
|
84c4523d1f | ||
|
|
d2bdca72f8 | ||
|
|
88f23ef43d | ||
|
|
c5c1bb2221 | ||
|
|
3a86eb22c7 | ||
|
|
08ee223497 | ||
|
|
c01e299d16 | ||
|
|
ba380910bf | ||
|
|
6e290a8118 | ||
|
|
d3efc81e8b | ||
|
|
1ea7b8b016 | ||
|
|
afcdc79531 | ||
|
|
94b8f21373 | ||
|
|
a91d98185f | ||
|
|
22f4e80783 | ||
|
|
288af804e7 | ||
|
|
c9772d1c2a | ||
|
|
f9baa3306e | ||
|
|
978344a01f | ||
|
|
94f5b13012 | ||
|
|
34ccc1e905 | ||
|
|
055e09f033 | ||
|
|
4ca90ecd9a | ||
|
|
b2b62a4d36 | ||
|
|
de7dcf686b | ||
|
|
5acd3addc6 | ||
|
|
fbdc50bc86 | ||
|
|
f779782cdc | ||
|
|
ee11b037ab | ||
|
|
872cad2903 | ||
|
|
a815b2a877 | ||
|
|
4f498a05f8 | ||
|
|
9f11eac225 | ||
|
|
ee79bf219d | ||
|
|
96066d0ec2 | ||
|
|
7b1a7264e2 | ||
|
|
43a7cbb227 | ||
|
|
123d540bc6 | ||
|
|
125458af20 | ||
|
|
0adc78564c | ||
|
|
9df29b6113 | ||
|
|
096f8dbfe1 | ||
|
|
9b6384e14c | ||
|
|
b180ea9a23 | ||
|
|
43504da41d | ||
|
|
005d11bb38 | ||
|
|
20c9509104 | ||
|
|
c90953138e | ||
|
|
5363031f4e | ||
|
|
271944b006 | ||
|
|
9ee5a50e4f | ||
|
|
7ffa90f92b | ||
|
|
8459bd6dc7 | ||
|
|
952a862d8c | ||
|
|
71215dcba2 | ||
|
|
e974ab740f | ||
|
|
131e7f55f7 | ||
|
|
a4ba6542c9 | ||
|
|
396dfb59ea | ||
|
|
3e80e31c9c | ||
|
|
e119041ef6 | ||
|
|
efe9e0664a | ||
|
|
e8c06af550 | ||
|
|
f88ca6e560 | ||
|
|
1501b4fdda | ||
|
|
87b960007a | ||
|
|
bc5b29dfdf | ||
|
|
d2c23f8b6d | ||
|
|
91e33dbd68 | ||
|
|
1b427788e5 | ||
|
|
4f224de759 | ||
|
|
911ec9a3bf | ||
|
|
19240c6ab4 | ||
|
|
d90062f6d3 | ||
|
|
da471c5f6e | ||
|
|
549ca38125 | ||
|
|
84452a962b | ||
|
|
bd321ec073 | ||
|
|
47d2144b0a | ||
|
|
f35db58f70 | ||
|
|
630bc93614 | ||
|
|
711ad239af | ||
|
|
f17c2cd5a6 | ||
|
|
9bd8764805 | ||
|
|
8caad5f96c | ||
|
|
d21deca5fa | ||
|
|
c70aabdb33 | ||
|
|
986ad678e7 | ||
|
|
11c943f917 | ||
|
|
58c19eb210 | ||
|
|
81dd318e3d | ||
|
|
79b3f56dad | ||
|
|
fc78b3a6a4 | ||
|
|
b022109f9e | ||
|
|
3f72418773 | ||
|
|
daaf40fd96 | ||
|
|
1b819493cb | ||
|
|
65775228b3 | ||
|
|
ca9b53df5c | ||
|
|
0b5c0cd617 | ||
|
|
f8a87542eb | ||
|
|
1058c3e904 | ||
|
|
23373994a3 | ||
|
|
0c7a266476 | ||
|
|
a6bd8f49fa | ||
|
|
3d39fbf4fa | ||
|
|
b4f9bd596e | ||
|
|
be8c66d768 | ||
|
|
454ef459f5 | ||
|
|
b6f4114f63 | ||
|
|
51dc8a8ad1 | ||
|
|
f107909b0e | ||
|
|
7d621412e5 | ||
|
|
fde6d7e0de | ||
|
|
7cef26be19 | ||
|
|
e753c343be | ||
|
|
922f54fafe | ||
|
|
cae469fa55 | ||
|
|
aec033163e | ||
|
|
c65598710a | ||
|
|
73008d958d | ||
|
|
ac8852c894 | ||
|
|
0bddeee5b3 | ||
|
|
1e3a253015 | ||
|
|
56e16ae732 | ||
|
|
03cfa559c7 | ||
|
|
7222296d60 | ||
|
|
162ec4a0b3 | ||
|
|
63781076d3 | ||
|
|
eb5fff6939 | ||
|
|
4212425427 | ||
|
|
59adce11a1 | ||
|
|
f4f61e687c | ||
|
|
5a00501a77 | ||
|
|
cb8c0f172b | ||
|
|
4e5aebf8a5 | ||
|
|
08cd73d170 | ||
|
|
da2f06a566 | ||
|
|
ebe3d3df7b | ||
|
|
365d7fd062 | ||
|
|
0e01936f50 | ||
|
|
26870e89da | ||
|
|
055c22d59f | ||
|
|
08c3871987 | ||
|
|
10f297fac5 | ||
|
|
e2310f12e0 | ||
|
|
5152323676 | ||
|
|
63a7db8692 | ||
|
|
3910127690 | ||
|
|
5afda1ff50 | ||
|
|
d26b1ef955 | ||
|
|
1eb01c32f5 | ||
|
|
4925d7cf88 | ||
|
|
14bf1027d6 | ||
|
|
6771b317b9 | ||
|
|
c09b7a9fe9 | ||
|
|
eb3141c5fd | ||
|
|
25c0657a54 | ||
|
|
f2e0040eda | ||
|
|
94d4180995 | ||
|
|
bb0540329c | ||
|
|
4f3fcbe03c | ||
|
|
e3129b9b9e | ||
|
|
d17401ebc1 | ||
|
|
049757aa30 | ||
|
|
dc72c11c6f | ||
|
|
1758f35fa5 | ||
|
|
39f5467825 | ||
|
|
9b5dd9d374 | ||
|
|
385fd0fd8a | ||
|
|
abf5e48f0c | ||
|
|
4050343c12 | ||
|
|
cd1c73834c | ||
|
|
d0d1321482 | ||
|
|
f2b5230640 | ||
|
|
d489fb443b | ||
|
|
0b605cf215 | ||
|
|
d37050b85e | ||
|
|
1742e229bf | ||
|
|
c57f4ae587 | ||
|
|
d3cb75b4aa | ||
|
|
3c8eca8e37 | ||
|
|
f58f380482 | ||
|
|
fea9d2f3b1 | ||
|
|
070ee66f5d | ||
|
|
8a40b4f53f | ||
|
|
602e965813 | ||
|
|
433d33f545 | ||
|
|
0e1cd140f4 | ||
|
|
a2e25a27e9 | ||
|
|
40304ccf44 | ||
|
|
3eec8ffdf7 | ||
|
|
9198e61791 | ||
|
|
3b98850326 | ||
|
|
a55a1f8390 | ||
|
|
0d62f1ef26 | ||
|
|
3004199d0d | ||
|
|
265252f317 | ||
|
|
055ec17fdb | ||
|
|
83485bbdc8 | ||
|
|
73589bb775 | ||
|
|
7d3c0cb928 | ||
|
|
e4b72bf9c8 | ||
|
|
58d9078309 | ||
|
|
7c850118e9 | ||
|
|
52bcbf7130 | ||
|
|
fcedf023e9 | ||
|
|
8efde4ce75 | ||
|
|
f2fdc563eb | ||
|
|
17def48a3e | ||
|
|
b011c4167d | ||
|
|
47d7d52bcf | ||
|
|
e6aba0a0c9 | ||
|
|
b3736143bc | ||
|
|
8fac8b78f6 | ||
|
|
7b2db01105 | ||
|
|
293948d189 | ||
|
|
a6a301e855 | ||
|
|
43d916b56a | ||
|
|
d36f82f39b | ||
|
|
2e43b023aa | ||
|
|
4b4ffe09a8 | ||
|
|
ce3e12064b | ||
|
|
bbf7cabc35 | ||
|
|
42028f3e33 | ||
|
|
164bac13c1 | ||
|
|
22abc226aa | ||
|
|
e29b70e4ee | ||
|
|
45c38ff7ee | ||
|
|
14b282bcab | ||
|
|
76df639e42 | ||
|
|
a102dd7e32 | ||
|
|
1b5d8ff44b | ||
|
|
084c0e1036 | ||
|
|
c7e41f41a2 | ||
|
|
bfb80f6889 | ||
|
|
ae2a9d7c72 | ||
|
|
8505158a2f | ||
|
|
1a5bb28891 | ||
|
|
36d64d3151 | ||
|
|
919e5341c3 | ||
|
|
2420217ede | ||
|
|
d2d76a7e92 | ||
|
|
2817a5bd34 | ||
|
|
fdca271289 | ||
|
|
3331f37d82 | ||
|
|
e326d5fe15 | ||
|
|
347e26c9c1 | ||
|
|
9b95480ce4 | ||
|
|
c5078b73be | ||
|
|
eb0610ad62 | ||
|
|
edf116a9b2 | ||
|
|
a5ce165bda | ||
|
|
1f84c64c08 | ||
|
|
302a4621a6 | ||
|
|
7b55ca889d | ||
|
|
2e765654cf | ||
|
|
98a03439f1 | ||
|
|
e4fce66a62 | ||
|
|
904dd7f190 | ||
|
|
aca894c240 | ||
|
|
21b7d4e7ce | ||
|
|
8fe172079c | ||
|
|
59f27d4740 | ||
|
|
579f5ae8d5 | ||
|
|
74c0f407df | ||
|
|
a94782571a | ||
|
|
486b969bea | ||
|
|
5e6618c495 | ||
|
|
408ec2466f | ||
|
|
28af133a7e | ||
|
|
0ef3da0bca | ||
|
|
aaeb0390cc | ||
|
|
ef3e45b742 | ||
|
|
cf9f950945 | ||
|
|
88d9ed5c55 | ||
|
|
39c3291826 | ||
|
|
4b99e2a057 | ||
|
|
96fb57109a | ||
|
|
f773204794 | ||
|
|
dcf2df88bb | ||
|
|
e95ec249f3 | ||
|
|
d9bc044bdc | ||
|
|
12bdf02770 | ||
|
|
20d099fcb9 | ||
|
|
66a5863682 | ||
|
|
4d061f6645 | ||
|
|
0959ff5b7c | ||
|
|
009a3ecabb | ||
|
|
7486484b0d | ||
|
|
6b6321b5da | ||
|
|
11443ab0ea | ||
|
|
6cda4be691 | ||
|
|
d6c338e949 | ||
|
|
8a2ad04880 | ||
|
|
c35a78336e | ||
|
|
297a894a64 | ||
|
|
8271630d89 | ||
|
|
2867f28458 | ||
|
|
f3ee6e5211 | ||
|
|
aaa5e821c4 | ||
|
|
d8b00b3fad | ||
|
|
369c6b39fc | ||
|
|
16a2040470 | ||
|
|
190d75912c | ||
|
|
01f85fd766 | ||
|
|
15c8ba4618 | ||
|
|
691a9f28fa | ||
|
|
9b4e870c4b | ||
|
|
1a17b493aa | ||
|
|
a8aa097581 | ||
|
|
c8c1106757 | ||
|
|
7bf8a9184c | ||
|
|
105d88608c | ||
|
|
a41da5fb4c | ||
|
|
8179827666 | ||
|
|
4cab1c68e4 | ||
|
|
4d09959630 | ||
|
|
d559ef8432 | ||
|
|
e81dfd1d8c | ||
|
|
83fa56ad0d | ||
|
|
498428aad7 | ||
|
|
f6f4843daf | ||
|
|
3d47fa2d29 | ||
|
|
b19395d8a1 | ||
|
|
70c33ff7df | ||
|
|
84b9a879e0 | ||
|
|
a3818cc84d | ||
|
|
d489672220 | ||
|
|
38da0df92e | ||
|
|
f19f534059 | ||
|
|
f695069007 | ||
|
|
74bd918f63 | ||
|
|
e48738a40d | ||
|
|
ceed3fb350 | ||
|
|
865ff915c4 | ||
|
|
4ebf767ba1 | ||
|
|
e6d3180a82 | ||
|
|
cf3badcfc6 | ||
|
|
7ed7983520 | ||
|
|
5a10d6976a | ||
|
|
2fb0ad7b35 | ||
|
|
fe3cb79ebb | ||
|
|
646e2fc0a1 | ||
|
|
7f9f20fc4d | ||
|
|
a90190e869 | ||
|
|
ff146de84e | ||
|
|
dd52447969 | ||
|
|
9e7b2eed1f | ||
|
|
a079da904f | ||
|
|
7844ddaba7 | ||
|
|
c41e4b9a3c | ||
|
|
719d69150b | ||
|
|
0109888967 | ||
|
|
57501f5628 | ||
|
|
33e79d9c67 | ||
|
|
0df61bcc43 | ||
|
|
0cf93d9d12 | ||
|
|
a5062e8ea3 | ||
|
|
dc5b317ba4 | ||
|
|
5764ac6185 | ||
|
|
27502947b4 | ||
|
|
d77e517dd4 | ||
|
|
f2a1af112f | ||
|
|
46101d972b | ||
|
|
f55673b391 | ||
|
|
83561cc68a | ||
|
|
9c47313933 | ||
|
|
d2d8194131 | ||
|
|
bafa08166f | ||
|
|
ff0d4341f9 | ||
|
|
040babdcb5 | ||
|
|
f54cba2f99 | ||
|
|
4c56380f4b | ||
|
|
275918835b | ||
|
|
79760a2650 | ||
|
|
5273a113f5 | ||
|
|
f727a959d7 | ||
|
|
5e8b6894a4 | ||
|
|
71ef2cb483 | ||
|
|
b2ccd72cfd | ||
|
|
7c2ae8f4e4 | ||
|
|
4bb9a04bb0 | ||
|
|
66dbeec51e | ||
|
|
5c886af397 | ||
|
|
d3589e5cb3 | ||
|
|
189bb60232 | ||
|
|
f8fa4e00a5 | ||
|
|
17e0de9f8b | ||
|
|
fdd20fc29f | ||
|
|
3732e2e2d5 | ||
|
|
c9113f1760 | ||
|
|
29ad20dd6f | ||
|
|
26f77a67c0 | ||
|
|
87474c56dd | ||
|
|
9097e47063 | ||
|
|
b0ecddab06 | ||
|
|
dc6d23b909 | ||
|
|
0eb3d35862 | ||
|
|
d5d570db90 | ||
|
|
d5f09d03ce | ||
|
|
1195c51991 | ||
|
|
00784561f3 | ||
|
|
a401cd3394 | ||
|
|
1cbca3db26 | ||
|
|
237a8dcc71 | ||
|
|
9c2dc9030b | ||
|
|
22faf2b4a0 | ||
|
|
8c69c532f9 | ||
|
|
9d883e0e46 | ||
|
|
284c31f27f | ||
|
|
fde6c91ae1 | ||
|
|
77913e76a6 | ||
|
|
b5b0ef16a6 | ||
|
|
5b80df0232 | ||
|
|
34178f0d63 | ||
|
|
b3730bd720 | ||
|
|
5de72e7061 | ||
|
|
528c8678e1 | ||
|
|
4de638d69a | ||
|
|
604d0c7e2f | ||
|
|
0e7a059daf | ||
|
|
53047a65a6 | ||
|
|
10399c5deb | ||
|
|
ad42cf151e | ||
|
|
b20f2c3828 | ||
|
|
08e7b5c6bc | ||
|
|
4e7749afaf | ||
|
|
5c4d07c7f9 | ||
|
|
47d61d3b2f | ||
|
|
935ee7f954 | ||
|
|
579e36b23c | ||
|
|
920156c55f | ||
|
|
fe16253e47 | ||
|
|
2243656cf2 | ||
|
|
b40592fa95 | ||
|
|
5e1395570d | ||
|
|
4c6ca4e0c3 | ||
|
|
f58288ae73 | ||
|
|
77c5be55b4 | ||
|
|
6684219e9f | ||
|
|
277b5495f1 | ||
|
|
f0ec7321f3 | ||
|
|
30a5457bf6 | ||
|
|
917535d3b0 | ||
|
|
283b0a886c | ||
|
|
9f262dc605 | ||
|
|
5d20deddf1 | ||
|
|
714381884f | ||
|
|
72068dcda9 | ||
|
|
1b19dbf460 | ||
|
|
161a7ce3ae | ||
|
|
f820ab55d5 | ||
|
|
3365d512f5 | ||
|
|
a506576fd8 | ||
|
|
37b769b0d8 | ||
|
|
935887cce7 | ||
|
|
68d79694a9 | ||
|
|
c06bbb9795 | ||
|
|
a43d0d7050 | ||
|
|
ce75e1d79d | ||
|
|
4bea75104a | ||
|
|
8e0a53b25e | ||
|
|
9bf01164f6 | ||
|
|
8c3d5dca92 | ||
|
|
660782b418 | ||
|
|
65b912fce7 | ||
|
|
958f99b802 | ||
|
|
d0c3294314 | ||
|
|
3770274912 | ||
|
|
9cfc2be01d | ||
|
|
dad5871180 | ||
|
|
0d74b73f53 | ||
|
|
9f0aee8820 | ||
|
|
21de09c0ef | ||
|
|
cd6fdb721c | ||
|
|
04fa44d8ca | ||
|
|
afda997453 | ||
|
|
42b81cfbbc | ||
|
|
fe92d9d581 | ||
|
|
f31aed8925 | ||
|
|
32b9b39b29 | ||
|
|
6617f1665f | ||
|
|
e11f4c714f | ||
|
|
27b6a85067 | ||
|
|
560f21c006 | ||
|
|
28a02e2f2d | ||
|
|
8c4a9c42d4 | ||
|
|
7cd5c905a4 | ||
|
|
ac7aedd703 | ||
|
|
ad9d0ae022 | ||
|
|
9039cdbb68 | ||
|
|
2c48dca135 | ||
|
|
cd155871ce | ||
|
|
598b395d96 | ||
|
|
8243a5cf97 | ||
|
|
9fd1ab1d11 | ||
|
|
1ec6339cf2 | ||
|
|
b0ef55251a | ||
|
|
5b4212391e | ||
|
|
bf96870221 | ||
|
|
a8a22e01e3 | ||
|
|
825c3db14d | ||
|
|
22813311d6 | ||
|
|
4fda3e9406 | ||
|
|
0b4563b0a9 | ||
|
|
d9e2283116 | ||
|
|
8b90da65d7 | ||
|
|
f376fc66ac | ||
|
|
a77ec61c64 | ||
|
|
26e8141ba2 | ||
|
|
4d64da0c05 | ||
|
|
ac525f259f | ||
|
|
8acb6e3a9d | ||
|
|
8ee5a1e543 | ||
|
|
9d651a122f | ||
|
|
8905b670da | ||
|
|
342bb070da | ||
|
|
a0d084ffba | ||
|
|
b463c314fe | ||
|
|
235f0afaaf | ||
|
|
f8b155e37f | ||
|
|
225666b31e | ||
|
|
709b693a1a | ||
|
|
b44709ff5a | ||
|
|
4e67763f67 | ||
|
|
6543d72499 | ||
|
|
2749687509 | ||
|
|
42c93aa2dc | ||
|
|
0e22056e48 | ||
|
|
a077b2c10f | ||
|
|
f31ea2eb74 | ||
|
|
941d105745 | ||
|
|
18bf9ed314 | ||
|
|
3c2a77dfcd | ||
|
|
f4dda811c8 | ||
|
|
d8e1fa0cd8 | ||
|
|
e37bbc32ec | ||
|
|
18c000a44e | ||
|
|
3d8c0e93d6 | ||
|
|
cc32cc11ac | ||
|
|
bb316e66b3 | ||
|
|
95ff16137a | ||
|
|
2b493faeb8 | ||
|
|
d9c32b8947 | ||
|
|
724bac6159 | ||
|
|
6c320a2290 | ||
|
|
bf1ce6c67b | ||
|
|
cd0c280cb5 | ||
|
|
2e8d950775 | ||
|
|
65d8d63733 | ||
|
|
4d1d84779d | ||
|
|
5f914c191c | ||
|
|
6e5f3389e2 | ||
|
|
79d1e94f3d | ||
|
|
c8ffb4a55e | ||
|
|
c4946486ba | ||
|
|
0f60f46165 | ||
|
|
61e74e37f7 | ||
|
|
ad487d8ed5 | ||
|
|
ccffa29234 | ||
|
|
349e79c9fb | ||
|
|
dbc08bbf92 | ||
|
|
e0b3d5ab5a | ||
|
|
5c721a1921 | ||
|
|
00691dd53a | ||
|
|
fa7bc0a9ed | ||
|
|
43902995e7 | ||
|
|
ee45b90c2a | ||
|
|
b6856f9a8d | ||
|
|
813e8ccd3f | ||
|
|
2ee7ef8f93 | ||
|
|
68b3545322 | ||
|
|
d2ceafe36c | ||
|
|
3d955fffd7 | ||
|
|
4a5ed0397c | ||
|
|
1442752911 | ||
|
|
082086e3e8 | ||
|
|
6e1443b69b | ||
|
|
6ab4fcf220 | ||
|
|
5094eaad97 | ||
|
|
eb402385ca | ||
|
|
3bd87a904e | ||
|
|
0bcdf90344 | ||
|
|
6443c0f3b5 | ||
|
|
8d1c362e4d | ||
|
|
84c5bb5f8b | ||
|
|
a17019cd6a | ||
|
|
0999b1892f | ||
|
|
40c4b73ea0 | ||
|
|
fc13bbdc72 | ||
|
|
3d43ada7f3 | ||
|
|
15db87fa3e | ||
|
|
1286392de9 | ||
|
|
0759c26fe9 | ||
|
|
28a70669af | ||
|
|
ddfbc81b91 | ||
|
|
138c5ae4ec | ||
|
|
1700c43a33 | ||
|
|
e30fcc0ef2 | ||
|
|
573e6fb3c1 | ||
|
|
8416cb8d59 | ||
|
|
46defa07e4 | ||
|
|
747c0e5531 | ||
|
|
ca243ef999 | ||
|
|
4a7e19c749 | ||
|
|
cfb7c7a6f5 | ||
|
|
54dfa00cb8 | ||
|
|
8ec2a445b7 | ||
|
|
1bb559bb14 | ||
|
|
916764ada1 | ||
|
|
176d01204d | ||
|
|
b3da920da5 | ||
|
|
64bcdc4bef | ||
|
|
8e2691b39a | ||
|
|
2fa15538f4 | ||
|
|
538a17254f | ||
|
|
9135c2076e | ||
|
|
84fdc83068 | ||
|
|
b411642af3 | ||
|
|
eb3ba4e9f5 | ||
|
|
2ec4e1dbe3 | ||
|
|
c3447cba4b | ||
|
|
85624fc15c | ||
|
|
ebdbcdf4f9 | ||
|
|
458f8c8be3 | ||
|
|
ff717774b8 | ||
|
|
af2eece4f4 | ||
|
|
e304656da6 | ||
|
|
9b8deb82fe | ||
|
|
c44ea638a6 | ||
|
|
174a6aaae9 | ||
|
|
ebff2385b5 | ||
|
|
8bff1d0ec4 | ||
|
|
9307f72b99 | ||
|
|
929e2ec42d | ||
|
|
96f9b9d3d5 | ||
|
|
568094d911 | ||
|
|
d662881112 | ||
|
|
e68187ff6b | ||
|
|
9569d33b98 | ||
|
|
cfc5171a84 | ||
|
|
ed5bf3efac | ||
|
|
0ec3a37660 | ||
|
|
60b3d83cab | ||
|
|
2fd781b4d7 | ||
|
|
beaf398a4e | ||
|
|
99e39218a6 | ||
|
|
3e14ab8c32 | ||
|
|
19904a31bb | ||
|
|
ae031e3793 | ||
|
|
f6daf71b46 | ||
|
|
e4d814b4f9 | ||
|
|
94bd2f3701 | ||
|
|
95a1dd985f | ||
|
|
13447f8050 | ||
|
|
6601d961f4 | ||
|
|
ad02fc8df3 | ||
|
|
214ca783cc | ||
|
|
e7cedef90a | ||
|
|
792c1b02dc | ||
|
|
f6786add26 | ||
|
|
76140cdad3 | ||
|
|
71ce97432e | ||
|
|
aad871cf28 | ||
|
|
886940f46d | ||
|
|
a5b0ce0974 | ||
|
|
24283aeff7 | ||
|
|
b6775b59b2 | ||
|
|
6422964468 | ||
|
|
c186f2cdc8 | ||
|
|
70dd948ffc | ||
|
|
c4f62feb03 | ||
|
|
2ee25b0a21 | ||
|
|
ad39171be5 | ||
|
|
5cc48a4d7b | ||
|
|
f7c85c97dd | ||
|
|
7484be7656 | ||
|
|
240cf0d226 | ||
|
|
4a859bef48 | ||
|
|
4c9430c377 | ||
|
|
a21554f6d1 | ||
|
|
4d44ac1103 | ||
|
|
ce3917941e | ||
|
|
c69b5512d3 | ||
|
|
e40e3cb0cb | ||
|
|
ad59f4e03f | ||
|
|
b794133b1a | ||
|
|
17d641ef4c | ||
|
|
264f3b7626 | ||
|
|
d53bf785ac | ||
|
|
50ff2802d9 | ||
|
|
23662f6165 | ||
|
|
ca3f7e76fc | ||
|
|
affdc20a65 | ||
|
|
67c5fd1847 | ||
|
|
39e2e7712f | ||
|
|
249f8568db | ||
|
|
a94ec1cd2a | ||
|
|
380a55d574 | ||
|
|
c0cc4bdb2f | ||
|
|
9b4e464c94 | ||
|
|
1da3262bec | ||
|
|
5ec80daab9 | ||
|
|
a523decb65 | ||
|
|
a16d777fc4 | ||
|
|
4324aa50b1 | ||
|
|
8cd92ee71f | ||
|
|
99c9f5f134 | ||
|
|
df6262ba26 | ||
|
|
0e8bf17f0b | ||
|
|
ac86c3fcfe | ||
|
|
5d24f6ca19 | ||
|
|
e8486ba140 | ||
|
|
7374c9639e | ||
|
|
e60525fee1 | ||
|
|
1152befcf1 | ||
|
|
a1be422ad6 | ||
|
|
8dbd81bb4c | ||
|
|
aacacfed04 | ||
|
|
9a28c2fb86 | ||
|
|
7518a8c851 | ||
|
|
c02100cc89 | ||
|
|
9e4d1d33e2 | ||
|
|
cd367c9d2b | ||
|
|
212d407bb3 | ||
|
|
05422437df | ||
|
|
ec408c80f1 | ||
|
|
377160a742 | ||
|
|
3c6fcd2665 | ||
|
|
1a72acf12e | ||
|
|
ac88bec8fb | ||
|
|
44b5c6221b | ||
|
|
034d957be4 | ||
|
|
e9f6987324 | ||
|
|
5f42e2a0b5 | ||
|
|
288b900350 | ||
|
|
0e91901fcf | ||
|
|
63566a6b8e | ||
|
|
6540d6b4c7 | ||
|
|
a9de91e40d | ||
|
|
b81996212a | ||
|
|
6d8a6e8a2f | ||
|
|
b076bd2981 | ||
|
|
8cf8a8efaf | ||
|
|
1a1c3d8157 | ||
|
|
afd5bbeda1 | ||
|
|
9e0b7c37dd | ||
|
|
67864db59b | ||
|
|
ed56eb4174 | ||
|
|
1fd4628b01 | ||
|
|
55d89657dc | ||
|
|
a88bf736bc | ||
|
|
9d2bd2f255 | ||
|
|
6960ca4649 | ||
|
|
8e68ea7b46 | ||
|
|
556bd2cff0 | ||
|
|
aeed2d709e | ||
|
|
55f00756ce | ||
|
|
578fbf54c4 | ||
|
|
932bb97afc | ||
|
|
4c894f5d20 | ||
|
|
6e2f4697aa | ||
|
|
5699bc082d | ||
|
|
4c91972105 | ||
|
|
7bee9cd72f | ||
|
|
bbfd3a2946 | ||
|
|
9d5f0f6f5d | ||
|
|
8bd67a6cd8 | ||
|
|
73079d7989 | ||
|
|
029d419e64 | ||
|
|
219317632e | ||
|
|
6eaaa46779 | ||
|
|
126aa46196 | ||
|
|
d6b761c341 | ||
|
|
341edad850 | ||
|
|
5d1d48b2d2 | ||
|
|
2ece968c75 | ||
|
|
6263863395 | ||
|
|
9748a5a35c | ||
|
|
85084a59d4 | ||
|
|
a6446fb58c | ||
|
|
9a646b6f01 | ||
|
|
074185a235 | ||
|
|
e75f7b1c3e | ||
|
|
6f026e0c1d | ||
|
|
6cb7277cd4 | ||
|
|
d74e31756b | ||
|
|
45e3f391b4 | ||
|
|
8999dac823 | ||
|
|
7492f5a31f | ||
|
|
e291ebbde8 | ||
|
|
0903d79edc | ||
|
|
d106ea1326 | ||
|
|
a3e51bd1bf | ||
|
|
b5c06e279e | ||
|
|
db36213039 | ||
|
|
e93b6d5257 | ||
|
|
53d5eab46a | ||
|
|
764f33fbee | ||
|
|
d283aeb939 | ||
|
|
b68a94efc3 | ||
|
|
27ae5c8058 | ||
|
|
708bc91f86 | ||
|
|
3708a25d0c | ||
|
|
2502ac48b2 | ||
|
|
6ad981043a | ||
|
|
0938a4be8a | ||
|
|
93b45f27a8 | ||
|
|
b119a78569 | ||
|
|
fda97254a0 | ||
|
|
e6de770389 | ||
|
|
275134d134 | ||
|
|
55ae33e602 | ||
|
|
41e7425292 | ||
|
|
10649da46d | ||
|
|
efb44af530 | ||
|
|
09e5fae8bd | ||
|
|
3b850f7efd | ||
|
|
2759459920 | ||
|
|
2d3527b38a | ||
|
|
740282e755 | ||
|
|
690266044e | ||
|
|
42bdbf01b0 | ||
|
|
bf0e190b0b | ||
|
|
023e219143 | ||
|
|
908cfdc2ed | ||
|
|
84681caf33 | ||
|
|
def7cb206c | ||
|
|
a37f5e918e | ||
|
|
0ab8cc16d6 | ||
|
|
6cc58314a8 | ||
|
|
823694bfdd | ||
|
|
6cb159352d | ||
|
|
c17f4db5c0 | ||
|
|
d2a37f73ee | ||
|
|
f08eea1d62 | ||
|
|
cedaa8f156 | ||
|
|
07c580e45d | ||
|
|
e0aac7e0b5 | ||
|
|
d48883e7fb | ||
|
|
2bbf5b8187 | ||
|
|
8f4b963096 | ||
|
|
e480492594 | ||
|
|
564b2fda57 | ||
|
|
cb4c8acfd1 | ||
|
|
8dbd306657 | ||
|
|
7b1b7c1737 | ||
|
|
13620ed535 | ||
|
|
076a546df6 | ||
|
|
0ccc36dc07 | ||
|
|
3d07cd9a69 | ||
|
|
f14b3edfe0 | ||
|
|
d0d1c15a55 | ||
|
|
000b0c6fe9 | ||
|
|
a86b6615d6 | ||
|
|
a728fab273 | ||
|
|
20d66e020a | ||
|
|
0d8a7c924d | ||
|
|
dff7a1d012 | ||
|
|
78c9b5b919 | ||
|
|
b1bd07ab9e | ||
|
|
dc0a7df625 | ||
|
|
a2aa100178 | ||
|
|
ef7198b9c8 | ||
|
|
7c5a57a7b2 | ||
|
|
91ab737ff3 | ||
|
|
2fcb6d8170 | ||
|
|
2cfc98a670 | ||
|
|
35ada5c545 | ||
|
|
386f0fd966 | ||
|
|
8c60d7479a | ||
|
|
3e7fda40f2 | ||
|
|
d0f73e3997 | ||
|
|
b7a43cd434 | ||
|
|
843cc4a913 | ||
|
|
e82ef65134 | ||
|
|
3a921c1c96 | ||
|
|
ca26d57b4b | ||
|
|
5d20cf73f6 | ||
|
|
4431e316ce | ||
|
|
366708c7ef | ||
|
|
004692ca84 | ||
|
|
63857bde9d | ||
|
|
fbb8744558 | ||
|
|
e9eecd7892 | ||
|
|
2dfea51e35 | ||
|
|
e8163181e3 | ||
|
|
296d30d66c | ||
|
|
9b9236751c | ||
|
|
5d07ec19c7 | ||
|
|
9409a2bf42 | ||
|
|
3929511437 | ||
|
|
e23bc368d8 | ||
|
|
13f0ba5bd2 | ||
|
|
15bdd314ca | ||
|
|
510f6c75e9 | ||
|
|
f2fdb777cf | ||
|
|
14cd1cee26 | ||
|
|
4464889c71 | ||
|
|
6059c36663 | ||
|
|
f8f92c9b4d | ||
|
|
5c88ba2f65 | ||
|
|
6767e95a89 | ||
|
|
d3b54cb032 | ||
|
|
36ea5ff352 | ||
|
|
f4b01a6ffd | ||
|
|
95269795e8 | ||
|
|
c2ebc725ee | ||
|
|
e713f982f0 | ||
|
|
1e100746ba | ||
|
|
a6f2a043d1 | ||
|
|
20846db182 | ||
|
|
4fce7cc3af | ||
|
|
93fa9c0156 | ||
|
|
3ad0489eb2 | ||
|
|
63f95d7b68 | ||
|
|
fe600f7011 | ||
|
|
3dc33e2bc6 | ||
|
|
73e813a0b7 | ||
|
|
9fe07187fb | ||
|
|
36969b0a11 | ||
|
|
c9e64e3b14 | ||
|
|
0d73d1950f | ||
|
|
765d3faeb0 | ||
|
|
f6117dc228 | ||
|
|
7aa5a8ee4e | ||
|
|
7150f471f1 | ||
|
|
7621aa1cdc | ||
|
|
ab73700691 | ||
|
|
1e004a7b2f | ||
|
|
a19a1cdec1 | ||
|
|
01ec31624f | ||
|
|
01f1beaecf | ||
|
|
a3e17d84aa | ||
|
|
2c23b9f7fd | ||
|
|
0cdf9c63f7 | ||
|
|
542ab75196 | ||
|
|
06f04e8f0b | ||
|
|
2a9fb562be | ||
|
|
2de846edca | ||
|
|
0564b104c8 | ||
|
|
c85f7eebe7 | ||
|
|
a4d722762e | ||
|
|
f4af6d1c60 | ||
|
|
74b978675b | ||
|
|
d4fc6f1ada | ||
|
|
8766be3f56 | ||
|
|
b179939a83 | ||
|
|
1d1faa7bbf | ||
|
|
5ccc23a15b | ||
|
|
a04c487b92 | ||
|
|
952ff5a4b4 | ||
|
|
4a6f49976f | ||
|
|
dd7de29e19 | ||
|
|
99b941392d | ||
|
|
e7fe125e95 | ||
|
|
3f447ae0d3 | ||
|
|
bea64d56b3 | ||
|
|
951569e8f2 | ||
|
|
42e717d035 | ||
|
|
9c9f8a8ad0 | ||
|
|
470fb254cd | ||
|
|
6e405f3b08 | ||
|
|
38a726afb0 | ||
|
|
090210a930 | ||
|
|
b3af639f9c | ||
|
|
c78ff1d1d4 | ||
|
|
ff79e499a9 | ||
|
|
e44578c4a3 | ||
|
|
58ec5b2c01 | ||
|
|
920fe54a3d | ||
|
|
0a19b97c1b | ||
|
|
d530dfe241 | ||
|
|
d488409742 | ||
|
|
5ade7ee4db | ||
|
|
1edef5fa57 | ||
|
|
f88009b0b3 | ||
|
|
6a3dde4ba0 | ||
|
|
1c3dc9e22e | ||
|
|
5edc2a4cc8 | ||
|
|
b50a704260 | ||
|
|
f351270c6f | ||
|
|
47be8c1e9e | ||
|
|
183078baff | ||
|
|
072551a3eb | ||
|
|
0765becb6d | ||
|
|
cb6463ef09 | ||
|
|
acb1f92e71 | ||
|
|
c9aa5c7151 | ||
|
|
df94b062da | ||
|
|
a486561f77 | ||
|
|
67249d24ea | ||
|
|
4a06f77803 | ||
|
|
df45c0af90 | ||
|
|
deb0f20ecd | ||
|
|
97c12e3f11 | ||
|
|
cd1ea3a76e | ||
|
|
5e9b647b3c | ||
|
|
df1479740f | ||
|
|
4ce14db645 | ||
|
|
4cd7a46c35 | ||
|
|
90c701a3d5 | ||
|
|
c4b2797ea8 | ||
|
|
6987c5e922 | ||
|
|
4172933d7f | ||
|
|
cf78aa4a04 | ||
|
|
194ad1aa89 | ||
|
|
4ca8c2ec36 | ||
|
|
f159b772c3 | ||
|
|
97408cc1d5 | ||
|
|
0bd5a93194 | ||
|
|
3214fc193e | ||
|
|
93e0ba9a4b | ||
|
|
7ae36b72e6 | ||
|
|
b0212de4d4 | ||
|
|
d1135529d1 | ||
|
|
dfbc96a018 | ||
|
|
57c29eceab | ||
|
|
364a73d137 | ||
|
|
02de81775c | ||
|
|
eb44dad0f3 | ||
|
|
68ebd4bd0f | ||
|
|
764d365b0a | ||
|
|
4add45f4ab | ||
|
|
61eb47d472 | ||
|
|
4e2582d250 | ||
|
|
ebcdc39c77 | ||
|
|
77a75ade85 | ||
|
|
9ff04b3627 | ||
|
|
14a7ebd1d4 | ||
|
|
b43305d50a | ||
|
|
b9b3770593 | ||
|
|
b5fdaeabeb | ||
|
|
4772b9e82c | ||
|
|
1aafa79ea4 | ||
|
|
3c5bd90a08 | ||
|
|
25157d32ba | ||
|
|
479a3f4099 | ||
|
|
cf789ae1d5 | ||
|
|
72a6768d8f | ||
|
|
65ec3aec83 | ||
|
|
a50ce4c396 | ||
|
|
5753866874 | ||
|
|
4a0283575f | ||
|
|
02e8b8510a | ||
|
|
4955643421 | ||
|
|
8caf5a8727 | ||
|
|
13fd5e17a9 | ||
|
|
a0c72fd78b | ||
|
|
ffa709c463 | ||
|
|
fa41a2bc2d | ||
|
|
02b74481d7 | ||
|
|
bf3e5b5660 | ||
|
|
ca281950c1 | ||
|
|
db609ce972 | ||
|
|
97745aa237 | ||
|
|
3d6e8d70f5 | ||
|
|
f3d8b87045 | ||
|
|
6c0585834f | ||
|
|
1bb0686aff | ||
|
|
f14b8d1375 | ||
|
|
e5b7bd1d10 | ||
|
|
f82fc86414 | ||
|
|
f1c5798eab | ||
|
|
2b4e273a05 | ||
|
|
e3fea0227f | ||
|
|
c42dccbba7 | ||
|
|
f0e137b9b6 | ||
|
|
7c27686c72 | ||
|
|
d1a8d1ea7c | ||
|
|
9258f8fbea | ||
|
|
60dbf521fc | ||
|
|
f94d3af077 | ||
|
|
8c3dc2f57a | ||
|
|
31f5c88e2a | ||
|
|
3a890e0794 | ||
|
|
f75ec7aa20 | ||
|
|
bb0b35d92e | ||
|
|
a2a080c560 | ||
|
|
7f82ef2d3c | ||
|
|
64f9338ce7 | ||
|
|
03e8d0223d | ||
|
|
ca4b07193e | ||
|
|
8589026531 | ||
|
|
0935e05ed0 | ||
|
|
5b3e145c58 | ||
|
|
245e264451 | ||
|
|
560b161b5d | ||
|
|
f7539f948e | ||
|
|
90f3c5fed9 | ||
|
|
ad5748d2dd | ||
|
|
effe1ec89c | ||
|
|
7ffb1684a4 | ||
|
|
16d46acb7e | ||
|
|
516c74264f | ||
|
|
307cafc7ec | ||
|
|
2ecdf23042 | ||
|
|
a2c4aeb93b | ||
|
|
048652eabd | ||
|
|
4446bd852a | ||
|
|
f7903b42c0 | ||
|
|
4178ada3cc | ||
|
|
aac1e9562b | ||
|
|
ccd79ae26a | ||
|
|
698ec0eb7a | ||
|
|
17bc321c3a | ||
|
|
224f723640 | ||
|
|
e6a4743743 | ||
|
|
d3bf71083a | ||
|
|
0d3edd37be | ||
|
|
73859c855f | ||
|
|
b8dc5d880c | ||
|
|
389f04129c | ||
|
|
ad3392880f | ||
|
|
4dc434a32a | ||
|
|
80d4cacb06 | ||
|
|
0a73bb4ea3 | ||
|
|
29e7379b37 | ||
|
|
cecb520a5e | ||
|
|
2625cd446b | ||
|
|
08946ebc19 | ||
|
|
2e274e2d2c | ||
|
|
e855c40f9b | ||
|
|
74ad4469eb | ||
|
|
3d0437004e | ||
|
|
d96fe358a8 | ||
|
|
f602bb0430 | ||
|
|
9abd5b27cc | ||
|
|
9d54cbed8e | ||
|
|
53428d13da | ||
|
|
fdad6c7d74 | ||
|
|
8397378786 | ||
|
|
d4dc1a4f3c | ||
|
|
ac44288328 | ||
|
|
4f1c0f2e66 | ||
|
|
85766699c1 | ||
|
|
8eb8d11863 | ||
|
|
3e3be4307b | ||
|
|
8a05fdf438 | ||
|
|
48cd3d52aa | ||
|
|
345f18cff6 | ||
|
|
79802d120e | ||
|
|
1ce6cc8ed3 | ||
|
|
1c7222827c | ||
|
|
fa91686460 | ||
|
|
7e824b34d7 | ||
|
|
1a556e02b7 | ||
|
|
ce45f15775 | ||
|
|
ab45121773 | ||
|
|
c0f56d74d3 | ||
|
|
9c50d2b7e0 | ||
|
|
dedf988eb8 | ||
|
|
57f35855b4 | ||
|
|
e57ea7b495 | ||
|
|
0f179bc7d8 | ||
|
|
0767a0ed5a | ||
|
|
b7bc51f358 | ||
|
|
eefbaf460c | ||
|
|
6a1741c921 | ||
|
|
d2ba398587 | ||
|
|
de6e1d8149 | ||
|
|
a9c55a4964 | ||
|
|
304c2642b4 | ||
|
|
22e0a2b8db | ||
|
|
d81f057c18 | ||
|
|
bc9b3381dc | ||
|
|
854ec6e26d | ||
|
|
dd573f18d1 | ||
|
|
4fbdd18da9 | ||
|
|
b5c328fcfb | ||
|
|
2ba50cf15e | ||
|
|
dd7d4f8bb4 | ||
|
|
320fcd19fd | ||
|
|
796d3d894d | ||
|
|
ab98e2e737 | ||
|
|
818e90e2b8 | ||
|
|
73a7d9d655 | ||
|
|
bf813ccbcd | ||
|
|
6b2ec59efc | ||
|
|
cddfc53d2e | ||
|
|
981b564863 | ||
|
|
0212ef63ac | ||
|
|
2f8b09dd79 | ||
|
|
1dd1b8ec2e | ||
|
|
c944fbba4c | ||
|
|
bc21d68cf0 | ||
|
|
9cccc46dde | ||
|
|
17be3a6fac | ||
|
|
9f4b106270 | ||
|
|
3aca38a5eb | ||
|
|
32f68499f0 | ||
|
|
1fd9338ea8 | ||
|
|
b6e2dcad50 | ||
|
|
0ff1160d6f | ||
|
|
d72a4fadea | ||
|
|
1864bb13c5 | ||
|
|
23dc3e00ef | ||
|
|
dcfa86f366 | ||
|
|
2344409faa | ||
|
|
7c6a5ef891 | ||
|
|
ec0aaf7c91 | ||
|
|
4e2d3d9e46 | ||
|
|
607767151a | ||
|
|
ab10f8d46b | ||
|
|
7b3eb1e366 | ||
|
|
3272766ef0 | ||
|
|
8ef5bf8252 | ||
|
|
d17576a112 | ||
|
|
ab8949f37f | ||
|
|
485ce9850f | ||
|
|
e50c5f0079 | ||
|
|
0ebb61cdfc | ||
|
|
8092b32eb1 | ||
|
|
e4a83b590f | ||
|
|
a680775c79 | ||
|
|
7f378f4a1c | ||
|
|
03e5390d71 | ||
|
|
7a20f0a433 | ||
|
|
edb61e7383 | ||
|
|
5d9fd2fac6 | ||
|
|
2732488633 | ||
|
|
e24f8782c2 | ||
|
|
abe6588dfb | ||
|
|
d11fd43d71 | ||
|
|
dc72297270 | ||
|
|
7f4844646e | ||
|
|
c262c9d528 | ||
|
|
1ddf563e0a | ||
|
|
53b1436e68 | ||
|
|
3bc1575dd1 | ||
|
|
06d3f4a42d | ||
|
|
9e1cea2217 | ||
|
|
94727450ee | ||
|
|
8b497ab062 | ||
|
|
183e718289 | ||
|
|
d39e007eee | ||
|
|
c36765d095 | ||
|
|
53691c917d | ||
|
|
1ae85cb606 | ||
|
|
73dbf24912 | ||
|
|
8471ea4da6 | ||
|
|
45d1e418d0 | ||
|
|
81c3f2b07c | ||
|
|
117d38f182 | ||
|
|
0f549143f1 | ||
|
|
4871ed6fa7 | ||
|
|
633528e878 | ||
|
|
b44f5a8acf | ||
|
|
34d644435c | ||
|
|
029c8a682d | ||
|
|
b51e4e6da2 | ||
|
|
786cd66e09 | ||
|
|
c7cf3be804 | ||
|
|
a2994feac1 | ||
|
|
4d679b88e9 | ||
|
|
09b4f53846 | ||
|
|
cd08343d56 | ||
|
|
a3930c40a1 | ||
|
|
e21c22b7a5 | ||
|
|
afee68c01d | ||
|
|
06ee387ca4 | ||
|
|
6884799532 | ||
|
|
3bd2560c2a | ||
|
|
436a3fa340 | ||
|
|
a36af150a3 | ||
|
|
41a338338a | ||
|
|
19815f345f | ||
|
|
664e176e6d | ||
|
|
a0377fad29 | ||
|
|
a14c9933b2 | ||
|
|
51a7e4f2ab | ||
|
|
4926604bb2 | ||
|
|
be7522f1c9 | ||
|
|
ff5dd46daa | ||
|
|
c6f9e35319 | ||
|
|
a42e88b0c1 | ||
|
|
af97021e1a | ||
|
|
1874afb3b8 | ||
|
|
a6744438e0 | ||
|
|
25b5cf9e90 | ||
|
|
4211b276e2 | ||
|
|
af523e3355 | ||
|
|
ecde63f8ee | ||
|
|
898d237e1c | ||
|
|
01545db6c4 | ||
|
|
db1682f73d | ||
|
|
0256004bec | ||
|
|
410b93191b | ||
|
|
b3006183cc | ||
|
|
d011a9ae75 | ||
|
|
3313e0f7cf | ||
|
|
b3585f43e2 | ||
|
|
88fba710c1 | ||
|
|
db96e414b5 | ||
|
|
dd900ba2a7 | ||
|
|
851798d3fc | ||
|
|
96487e7b69 | ||
|
|
f715e66068 | ||
|
|
c785e5abdd | ||
|
|
a2a9fa447a | ||
|
|
bc57bf8c8b | ||
|
|
3830b53416 | ||
|
|
4ac6655d11 | ||
|
|
019d4c0ee1 | ||
|
|
b1c34af71c | ||
|
|
996188a871 | ||
|
|
5b04ccffc3 | ||
|
|
2ed9ff6df4 | ||
|
|
d4f83a97bb | ||
|
|
93d186ad42 | ||
|
|
55d615393e | ||
|
|
17f8d9e203 | ||
|
|
61c6044b60 | ||
|
|
3dc81cf9b0 | ||
|
|
9c7a015397 | ||
|
|
778e79b391 | ||
|
|
f372c834f1 | ||
|
|
ac1d59a35b | ||
|
|
863ca6b0ad | ||
|
|
0095ad5e8a | ||
|
|
b0cbab0d1c | ||
|
|
78f01e5d7b | ||
|
|
6a2717be04 | ||
|
|
beb304f9a0 | ||
|
|
05e7591218 | ||
|
|
14a4901808 | ||
|
|
503f716b1f | ||
|
|
4c88543f30 | ||
|
|
f38e8cad58 | ||
|
|
c3580f3874 | ||
|
|
d6c94f493f | ||
|
|
1c3896c991 | ||
|
|
e7f9bed8c6 | ||
|
|
20f0038734 | ||
|
|
d6e776cdcb | ||
|
|
e155a35ea2 | ||
|
|
60ddb620b3 | ||
|
|
ad62dea1b5 | ||
|
|
b9ecf6aa98 | ||
|
|
38c76b5e04 | ||
|
|
51513ac9be | ||
|
|
27f7415698 | ||
|
|
26d61d3a50 | ||
|
|
47a44a0ade | ||
|
|
b65f86b3fd | ||
|
|
f0b6dd9421 | ||
|
|
12dd0170c1 | ||
|
|
fce3bf2590 | ||
|
|
89cbb8ae12 | ||
|
|
7febc01d6a | ||
|
|
020619e94f | ||
|
|
8f2dce12ab | ||
|
|
c7f95d5a20 | ||
|
|
13c00d5655 | ||
|
|
81248ed0bd | ||
|
|
7e4371f482 | ||
|
|
c5cb55bf5e | ||
|
|
2b902fadd5 | ||
|
|
2c048602ce | ||
|
|
e7e1d3da77 | ||
|
|
b6999150bd | ||
|
|
6fda96e366 | ||
|
|
5f67d8db15 | ||
|
|
a505cd44cf | ||
|
|
03a6a992bc | ||
|
|
056a20c5b4 | ||
|
|
5d1fd6eaff | ||
|
|
13a9d5b2e1 | ||
|
|
9fd915575e | ||
|
|
dbe6a48541 | ||
|
|
763c3e67da | ||
|
|
6ab5e3db79 | ||
|
|
f302f3081a | ||
|
|
35503691a5 | ||
|
|
75e79c7988 | ||
|
|
dd08336865 | ||
|
|
72512f9d80 | ||
|
|
064a8a7fa9 | ||
|
|
b107d5dadf | ||
|
|
6850d8a92d | ||
|
|
31ae3b7d9e | ||
|
|
c19a506be7 | ||
|
|
a155f808d4 | ||
|
|
8bae623c40 | ||
|
|
55fff914e1 | ||
|
|
4eb615560f | ||
|
|
5e35877c1d | ||
|
|
fee75619de | ||
|
|
8d75ca3e2b | ||
|
|
9c829f1234 | ||
|
|
9e063a31cf | ||
|
|
a90b731b9d | ||
|
|
8b77317f3f | ||
|
|
4212bef5ff | ||
|
|
87dc6b6ac6 | ||
|
|
25960521ba | ||
|
|
d7e346db0c | ||
|
|
e4762e882b | ||
|
|
b2b7b1fedf | ||
|
|
18ee76903e | ||
|
|
d1b5b83464 | ||
|
|
d5f8b1bc03 | ||
|
|
d3061c14d6 | ||
|
|
f8929a86b6 | ||
|
|
89de6370b0 | ||
|
|
d767bcea84 | ||
|
|
793652caa2 | ||
|
|
e00e1b9298 | ||
|
|
47a912b407 | ||
|
|
7cb35cb36c | ||
|
|
6ae24a4f78 | ||
|
|
5ce0723c27 | ||
|
|
aaf906e2e7 | ||
|
|
3c541ab081 | ||
|
|
1e1b862ba6 | ||
|
|
1ab7044d22 | ||
|
|
dfdb150130 | ||
|
|
2ff034e580 | ||
|
|
05d7dff003 | ||
|
|
85c723d298 | ||
|
|
46bdfa2986 | ||
|
|
ca57cfafb2 | ||
|
|
0692132a3d | ||
|
|
e1c3900039 | ||
|
|
935df3adb4 | ||
|
|
82232aea17 | ||
|
|
f649946d25 | ||
|
|
8d04a49348 | ||
|
|
f88f96383d | ||
|
|
0739865153 | ||
|
|
c42798914d | ||
|
|
6a226785d2 | ||
|
|
aea46a7b42 | ||
|
|
a1db66cc36 | ||
|
|
db1d980a25 | ||
|
|
9c1441c4a7 | ||
|
|
2c74efde79 | ||
|
|
2f9a058b39 | ||
|
|
e84ae3b7d3 | ||
|
|
c18d05dea3 | ||
|
|
0190144cb2 | ||
|
|
00d6db435e | ||
|
|
4659c0f62b | ||
|
|
ac556bf6e3 | ||
|
|
c45ade924c | ||
|
|
ed5903d8e8 | ||
|
|
e8131f6c3a | ||
|
|
3117cccf77 | ||
|
|
9ab2f6139e | ||
|
|
6af7f1e336 | ||
|
|
122fa744d5 | ||
|
|
5337e59f6d | ||
|
|
b001731f00 | ||
|
|
4da2ede624 | ||
|
|
07c4911f84 | ||
|
|
aa6427ff64 | ||
|
|
82705ef806 | ||
|
|
2756f73ebc | ||
|
|
757cd00481 | ||
|
|
de66b12cd9 | ||
|
|
0e5914386e | ||
|
|
7212301ce7 | ||
|
|
255e901985 | ||
|
|
d458952a9d | ||
|
|
345f6580e1 | ||
|
|
d0d60eeb64 | ||
|
|
f63a557c2b | ||
|
|
9be3944503 | ||
|
|
3ef0596bab | ||
|
|
80c318a7b8 | ||
|
|
2f0457a7c7 | ||
|
|
fe23970464 | ||
|
|
44c289f8bd | ||
|
|
5c0d48ae05 | ||
|
|
817970dcb5 | ||
|
|
8364f69150 | ||
|
|
3463ededcb | ||
|
|
810f729bc4 | ||
|
|
ad28751bf5 | ||
|
|
53da4a5eaa | ||
|
|
fe7ebb5f22 | ||
|
|
303e3d793f | ||
|
|
1c0b862082 | ||
|
|
7245a82ae8 | ||
|
|
1796238bf1 | ||
|
|
02e72a8d3f | ||
|
|
2923bbed79 | ||
|
|
f647347235 | ||
|
|
af75ac398f | ||
|
|
4efb41a3b0 | ||
|
|
0679df49ff | ||
|
|
269f505f75 | ||
|
|
51bbad9fc4 | ||
|
|
087564e8ec | ||
|
|
930fe4517c | ||
|
|
d9ef99b30b | ||
|
|
e7c2e9947f | ||
|
|
43a6103285 | ||
|
|
de0f115f92 | ||
|
|
5fef6a21f2 | ||
|
|
ee2c2ea0a8 | ||
|
|
f9c7b7bef9 | ||
|
|
71aaa90a3d | ||
|
|
4f6d2611e3 | ||
|
|
e2b6ff47cf | ||
|
|
8b6d5049a0 | ||
|
|
3b04a93363 | ||
|
|
7f1a8f768b | ||
|
|
ae6cf6aa74 | ||
|
|
44174f1b54 | ||
|
|
80ab5c71d6 | ||
|
|
3accaae0ab | ||
|
|
205ed61c30 | ||
|
|
dd1e92f200 | ||
|
|
dfdeeaa7b2 | ||
|
|
c688f07e4a | ||
|
|
3b960d7af8 | ||
|
|
d060880a08 | ||
|
|
a89df6e6f9 | ||
|
|
d0982e40b8 | ||
|
|
b2b5d7336b | ||
|
|
52eded0c35 | ||
|
|
cf19adec2e | ||
|
|
68229bef38 | ||
|
|
bf9471809e | ||
|
|
696477864b | ||
|
|
d75d771fe0 | ||
|
|
528b2e1c75 | ||
|
|
d64e3a6629 | ||
|
|
406d003fd0 | ||
|
|
c2f3407727 | ||
|
|
cbbf115241 | ||
|
|
2e8275d6eb | ||
|
|
a2ae482a2e | ||
|
|
5307db2a3c | ||
|
|
c313b27b27 | ||
|
|
0ca9a07dd0 | ||
|
|
a15be6c1a8 | ||
|
|
54225bb401 | ||
|
|
0177b178c4 | ||
|
|
b1d6036c10 | ||
|
|
1d347f4f1b | ||
|
|
917f1a2c4b | ||
|
|
ef822e749d | ||
|
|
3b533d4ef9 | ||
|
|
6dd193c917 | ||
|
|
01262a8e2a | ||
|
|
191e30201c | ||
|
|
f537c5eec0 | ||
|
|
86b722c2dd | ||
|
|
2390909e05 | ||
|
|
24e5ae385e | ||
|
|
61b480840b | ||
|
|
7c45ada269 | ||
|
|
0ac020cac2 | ||
|
|
8edaba230d | ||
|
|
cc0685e84e | ||
|
|
d0b02f327d | ||
|
|
4651e0d179 | ||
|
|
42a3b8f9f7 | ||
|
|
79aeaf0312 | ||
|
|
cc10d13b8d | ||
|
|
7b931df995 | ||
|
|
cae5dac4e9 | ||
|
|
909a5fab6c | ||
|
|
6abff904d4 | ||
|
|
89764d0a7d | ||
|
|
deba2b7113 | ||
|
|
786adb9f6d | ||
|
|
f34284ac6f | ||
|
|
5ecd90fc71 | ||
|
|
8e58d7fd4e | ||
|
|
11f9289298 | ||
|
|
479fab0812 | ||
|
|
d73034b348 | ||
|
|
092243fa99 | ||
|
|
b7f7ffb3f0 | ||
|
|
b12201bb8e | ||
|
|
436367da6d | ||
|
|
99405ea94e | ||
|
|
ad0a4ee6a9 | ||
|
|
189cafba5f | ||
|
|
d5821e18ef | ||
|
|
3d4de0722a | ||
|
|
21c75241f3 | ||
|
|
e4e2304a7a | ||
|
|
a933ac584c | ||
|
|
f90b913f09 | ||
|
|
a7d362b765 | ||
|
|
baf7394b18 | ||
|
|
2e87f8045f | ||
|
|
739bfbd1e8 | ||
|
|
effafdbf2c | ||
|
|
9afeaf6d85 | ||
|
|
a751b71eef | ||
|
|
4963f7710b | ||
|
|
4618b54437 | ||
|
|
925e1d256f | ||
|
|
0c2a49af89 | ||
|
|
cba66f029b | ||
|
|
e00ce1a786 | ||
|
|
9a18a3af63 | ||
|
|
d22f57a707 | ||
|
|
c531a3f2a2 | ||
|
|
eebd0556c3 | ||
|
|
22a32211bf | ||
|
|
2bda982a21 | ||
|
|
ebdd89bc29 | ||
|
|
1ed7dfd34a | ||
|
|
d33fdfd4ba | ||
|
|
57077045c3 | ||
|
|
316d4cff28 | ||
|
|
c24ecfa5df | ||
|
|
ae496f2c4a | ||
|
|
01974685f8 | ||
|
|
0d2ac65c27 | ||
|
|
233811a9be | ||
|
|
1274343416 | ||
|
|
10cd0f26f2 | ||
|
|
5f0e3732d7 | ||
|
|
71989f43f4 | ||
|
|
f8969e3111 | ||
|
|
cc4dd31051 | ||
|
|
e55b18e37f | ||
|
|
6142c31006 | ||
|
|
6699e56b96 | ||
|
|
55fd3b7812 | ||
|
|
ff7e3a3fc0 | ||
|
|
9dad4bc4d6 | ||
|
|
1dc74269f3 | ||
|
|
3f32c572cd | ||
|
|
9333a976a1 | ||
|
|
e7711d4abc | ||
|
|
d7dd4a9b36 | ||
|
|
2432914631 | ||
|
|
72e8b2d0f9 | ||
|
|
1ccd9654eb | ||
|
|
c4f2d9c609 | ||
|
|
06102f36be | ||
|
|
9576f85a5e | ||
|
|
9eb70696cb | ||
|
|
a9642cad6b | ||
|
|
0b76972c42 | ||
|
|
f486591a87 | ||
|
|
8bbee5aba8 | ||
|
|
2f5dc56cb0 | ||
|
|
21349d883c | ||
|
|
a90d45fc6f | ||
|
|
3980b6b451 | ||
|
|
b88bde2b45 | ||
|
|
f31b457bcd | ||
|
|
51a66e5fdb | ||
|
|
00cbf2acbf | ||
|
|
5ecb4e0f0e | ||
|
|
99328cae74 | ||
|
|
9460525bf3 | ||
|
|
ffb2686d43 | ||
|
|
b583d6ecd5 | ||
|
|
d8a038921f | ||
|
|
6aa03a43ba | ||
|
|
5d9f3ae2a9 | ||
|
|
0f3f066eb9 | ||
|
|
71d909827d | ||
|
|
03810f131e | ||
|
|
3b9413274d | ||
|
|
22548dd982 | ||
|
|
9a115483e9 | ||
|
|
6cb3683875 | ||
|
|
04e0013780 | ||
|
|
7398200cfd | ||
|
|
dc17c8350c | ||
|
|
4c05cc7259 | ||
|
|
66b4c424e9 | ||
|
|
dbc28cb451 | ||
|
|
c959888801 | ||
|
|
2edc2d5d8c | ||
|
|
e227f735cf | ||
|
|
2e80dd5421 | ||
|
|
4932f3b6b1 | ||
|
|
865dc1c543 | ||
|
|
4e865f5d64 | ||
|
|
0f3098d169 | ||
|
|
eae0e207f8 | ||
|
|
a41fc47544 | ||
|
|
7093117fb7 | ||
|
|
0dc7889b4d | ||
|
|
54edffe7c8 | ||
|
|
46132a087e | ||
|
|
67f26bfa0e | ||
|
|
7be79532db | ||
|
|
e13d163edc | ||
|
|
8f778ad067 | ||
|
|
b90e2949e7 | ||
|
|
adf2230d4a | ||
|
|
9d361966e3 | ||
|
|
bee564fd76 | ||
|
|
56431a2b63 | ||
|
|
e923cd2e0e | ||
|
|
dc81375150 | ||
|
|
caebd98825 | ||
|
|
816c97ad46 | ||
|
|
b205db96ad | ||
|
|
0fc1950400 | ||
|
|
8c974aafc7 | ||
|
|
0c798d691d | ||
|
|
a30031a3b3 | ||
|
|
ee3b45b38e | ||
|
|
fb490ec1e0 | ||
|
|
4e78da1b6d | ||
|
|
fda847f7f8 | ||
|
|
e641856118 | ||
|
|
a4797c5bc8 | ||
|
|
23955e65c0 | ||
|
|
dfb1572ffe | ||
|
|
b6d98dc02d | ||
|
|
d91df6837c | ||
|
|
c3bf4eac2d | ||
|
|
aa4b2d2f6b | ||
|
|
24e75e73b2 | ||
|
|
081c77c5e8 | ||
|
|
d108142470 | ||
|
|
09a1e5f755 | ||
|
|
1ba419de43 | ||
|
|
2835da67e5 | ||
|
|
d8d2bb7111 | ||
|
|
03eb2a0e9f | ||
|
|
e5b6c0a790 | ||
|
|
09631d585f | ||
|
|
2307a53dad | ||
|
|
635f1f31dc | ||
|
|
85f72f6592 | ||
|
|
5edaa9ae4e | ||
|
|
a6f5cb2061 | ||
|
|
f839815855 | ||
|
|
e1d3ad0cce | ||
|
|
462676144b | ||
|
|
aaeeb2b32b | ||
|
|
81bc172569 | ||
|
|
080ae3187d | ||
|
|
d2af1a86da | ||
|
|
2e6460c7ab | ||
|
|
8c725bcf7f | ||
|
|
fddc03c37f | ||
|
|
9df5b4d83f | ||
|
|
9b240699ae | ||
|
|
413d25791b | ||
|
|
b444b07d68 | ||
|
|
c20c73bb96 | ||
|
|
7ee9c45326 | ||
|
|
6f183b83d9 | ||
|
|
75ab1763bf | ||
|
|
a240610772 | ||
|
|
0b4eadc263 | ||
|
|
1e81d4d1fe | ||
|
|
d751c27253 | ||
|
|
833724a845 | ||
|
|
cbc633eaf5 | ||
|
|
35822d615f | ||
|
|
3cd606ff24 | ||
|
|
934dd32568 | ||
|
|
9426ebdf6f | ||
|
|
93d476198d | ||
|
|
70ee68dc12 | ||
|
|
1c1004e0ee | ||
|
|
3464671874 | ||
|
|
247aff2676 | ||
|
|
693e7babca | ||
|
|
ab739925d0 | ||
|
|
b9446d283b | ||
|
|
e0961a1a4c | ||
|
|
3674033c42 | ||
|
|
d394f8a620 | ||
|
|
87c6fe6d28 | ||
|
|
0dd336a451 | ||
|
|
dd24470d75 | ||
|
|
7be983c1e3 | ||
|
|
130d0fc1df | ||
|
|
24d0896071 | ||
|
|
c692f6f393 | ||
|
|
d4624143f4 | ||
|
|
45036868df | ||
|
|
7f1180be38 | ||
|
|
857bc7224c | ||
|
|
68537c924c | ||
|
|
9ce3328695 | ||
|
|
2a2e1b4f05 | ||
|
|
c200756247 | ||
|
|
c5009afced | ||
|
|
c9c9719d04 | ||
|
|
1637fa7870 | ||
|
|
11ae49e28b | ||
|
|
e345b085ab | ||
|
|
afd947fdba | ||
|
|
a5b25f0dba | ||
|
|
072f63608b | ||
|
|
24c14e2a75 | ||
|
|
1ecc024543 | ||
|
|
68fbdc8469 | ||
|
|
0561948cf8 | ||
|
|
dd8cc50163 | ||
|
|
df49e689a8 | ||
|
|
acb4243a3a | ||
|
|
08da626c15 | ||
|
|
0aefe60360 | ||
|
|
08fa4d48a4 | ||
|
|
78647e27e6 | ||
|
|
672fe67c48 | ||
|
|
c8542c7d7c | ||
|
|
6bc4b7199c | ||
|
|
20a1499dde | ||
|
|
42a51c0810 | ||
|
|
da68ed881f | ||
|
|
4c473d5f9a | ||
|
|
5340c588cb | ||
|
|
614a54e204 | ||
|
|
959e78cfe3 | ||
|
|
3bd7f4e000 | ||
|
|
d55115885e | ||
|
|
265a661cc8 | ||
|
|
2adb98c8f5 | ||
|
|
69775d106b | ||
|
|
54459e0042 | ||
|
|
be14537f85 | ||
|
|
dcf6b47f58 | ||
|
|
ab1f3f6312 | ||
|
|
a04b06923e | ||
|
|
fd5c33d528 | ||
|
|
b6a12cdbf3 | ||
|
|
c03b08562d | ||
|
|
939b8fa225 | ||
|
|
c905f14f7a | ||
|
|
3221ed9f9b | ||
|
|
d979499d5b | ||
|
|
feac914b27 | ||
|
|
3a0db373ed | ||
|
|
c86dbd6ef9 | ||
|
|
e586e0a92e | ||
|
|
bab1fcadc2 | ||
|
|
cb67854213 | ||
|
|
71bc265772 | ||
|
|
1043a62d87 | ||
|
|
899c8bd754 | ||
|
|
be7c3f492a | ||
|
|
e0b3348d2e | ||
|
|
fd60565435 | ||
|
|
1f46fd2737 | ||
|
|
1058007e7d | ||
|
|
35e8e04417 | ||
|
|
4c98763120 | ||
|
|
4694b7cd33 | ||
|
|
925d2d2dd8 | ||
|
|
c6ec08068c | ||
|
|
2b760459fc | ||
|
|
8ec68ac58e | ||
|
|
ca96e110be | ||
|
|
8b14031051 | ||
|
|
ead0fefd01 | ||
|
|
aa19c3ec09 | ||
|
|
40531e074c | ||
|
|
0201d47113 | ||
|
|
165cc0250d | ||
|
|
c80a397d40 | ||
|
|
5fe5d445c3 | ||
|
|
4e0c0f5436 | ||
|
|
cc07868d43 | ||
|
|
4e9934b928 | ||
|
|
f60d449c69 | ||
|
|
7ae608f7cc | ||
|
|
89f7e48ff4 | ||
|
|
a8fe4b4a98 | ||
|
|
258dc1c324 | ||
|
|
11101190ad | ||
|
|
f50e460e33 | ||
|
|
0aba0a833a | ||
|
|
5fe0450a17 | ||
|
|
2af6d39c4d | ||
|
|
a8d0f11cb1 | ||
|
|
98ef22649e | ||
|
|
23b23cf16d | ||
|
|
fc8c99535f | ||
|
|
2a31dc5ef1 | ||
|
|
8c5f47a606 | ||
|
|
ac0d36674b | ||
|
|
d41476c0dc | ||
|
|
a5159714f9 | ||
|
|
ab687f9786 | ||
|
|
89b0e349c3 | ||
|
|
b270c10c9e | ||
|
|
d2b4869261 | ||
|
|
443813fa78 | ||
|
|
d74652ad77 | ||
|
|
3351f6f310 | ||
|
|
44b682e76c | ||
|
|
f77a07f23a | ||
|
|
34a6cf6bf3 | ||
|
|
ba91e609f9 | ||
|
|
8ed2b17098 | ||
|
|
b291568527 | ||
|
|
7c468bb984 | ||
|
|
44bb8fc91c | ||
|
|
d126eab38e | ||
|
|
6bc96e9845 | ||
|
|
4a7fe5c784 | ||
|
|
0ef0ba36fb | ||
|
|
94b82a6632 | ||
|
|
0c19c15d38 | ||
|
|
92d83adabf | ||
|
|
56533b5ff6 | ||
|
|
57facf1ff9 | ||
|
|
a06a98d6b4 | ||
|
|
02c05cf855 | ||
|
|
0afd723690 | ||
|
|
cfd77783cb | ||
|
|
7c3de03d22 | ||
|
|
6ebae236dc | ||
|
|
9fbd01524e | ||
|
|
6beebe2d1b | ||
|
|
ae3fa3eb4b | ||
|
|
491ed144c8 | ||
|
|
37ed34b2ae | ||
|
|
5ffe16db27 | ||
|
|
f638e3d801 | ||
|
|
bdf77bb7b3 | ||
|
|
a6bb76628c | ||
|
|
12e13d5d1c | ||
|
|
d202bfdf33 | ||
|
|
e31121e729 | ||
|
|
213f859d6a | ||
|
|
e183b0a59a | ||
|
|
4c6d045b26 | ||
|
|
fac5778c3c | ||
|
|
259cbff6cf | ||
|
|
26a29c0bbf | ||
|
|
fcec323f10 | ||
|
|
e1c3380307 | ||
|
|
1bbc127a12 | ||
|
|
8238eb7a2e | ||
|
|
ea3d91f9a6 | ||
|
|
8125518e5a | ||
|
|
1cccfdbc0a | ||
|
|
fec75fb30c | ||
|
|
9e59127c4b | ||
|
|
b6f9abb42e | ||
|
|
2a3b7691df | ||
|
|
88cf547a18 | ||
|
|
7c80b14778 | ||
|
|
efd2a66d4d | ||
|
|
17733ae97e | ||
|
|
6292d17272 | ||
|
|
bbdb0df3fe | ||
|
|
49d75fce7b | ||
|
|
d254e8f77a | ||
|
|
b7497fd26b | ||
|
|
60cc55f149 | ||
|
|
10dac50943 | ||
|
|
780d4da30a | ||
|
|
941fa45804 | ||
|
|
b4c3006e53 | ||
|
|
889dfc91c5 | ||
|
|
317557903a | ||
|
|
e2046ebd3e | ||
|
|
c0956eaa87 | ||
|
|
b07844afa6 | ||
|
|
213f6a6fec | ||
|
|
dd3b9851d8 | ||
|
|
d2884c0f44 | ||
|
|
bdb188813a | ||
|
|
2e37cae1db | ||
|
|
492c648c9a | ||
|
|
fb8f99f4bb | ||
|
|
0fc39accca | ||
|
|
ac7304623f | ||
|
|
e5445e35c5 | ||
|
|
76b7dfba73 | ||
|
|
c889dfc383 | ||
|
|
a8db744cf1 | ||
|
|
a38b843d41 | ||
|
|
75029123a1 | ||
|
|
b7f9058092 | ||
|
|
48bc1f8a2f | ||
|
|
fc020f6856 | ||
|
|
e350c34922 | ||
|
|
4d4e7fc261 | ||
|
|
2d52e33eec | ||
|
|
607e720a71 | ||
|
|
08a930567a | ||
|
|
8fee70efc6 | ||
|
|
7f9608e465 | ||
|
|
1048ca4d31 | ||
|
|
89ec968bc5 | ||
|
|
d367e0a603 | ||
|
|
2f2f14523f | ||
|
|
80328cc998 | ||
|
|
80422ba730 | ||
|
|
e1730fdb79 | ||
|
|
b1a83cda4b | ||
|
|
5c2b8b4da3 | ||
|
|
bc5a29d3ed | ||
|
|
60b6ccbca3 | ||
|
|
6702aac0c2 | ||
|
|
31673889df | ||
|
|
fa7d176469 | ||
|
|
4b2e83ca2e | ||
|
|
7ec8930cbe | ||
|
|
03de480af2 | ||
|
|
db817b7609 | ||
|
|
7f6a7fba58 | ||
|
|
6c6c8f93a3 | ||
|
|
a4e0c89fb7 | ||
|
|
9d8c1802f6 | ||
|
|
af11368c30 | ||
|
|
1399ee9866 | ||
|
|
1f04cbe947 | ||
|
|
076ac4cec7 | ||
|
|
9f4356027e | ||
|
|
1717cd7e54 | ||
|
|
45118f9ff7 | ||
|
|
d07066dd60 | ||
|
|
539e67d14f | ||
|
|
0d7395d4c0 | ||
|
|
39a6561c78 | ||
|
|
62511d2f0d | ||
|
|
c52d0c8d1f | ||
|
|
7e852ab067 | ||
|
|
aa438b4c8b | ||
|
|
1e07b9e029 | ||
|
|
5959e1a297 | ||
|
|
affcbd2957 | ||
|
|
387b77e0e3 | ||
|
|
ad9cbcaad2 | ||
|
|
880fa0788b | ||
|
|
7c9562db82 | ||
|
|
3782c165f8 | ||
|
|
94d78de927 | ||
|
|
244ae736d1 | ||
|
|
53bf691fea | ||
|
|
a332955926 | ||
|
|
8e87409b64 | ||
|
|
a0a30bd8aa | ||
|
|
bf5005fb35 | ||
|
|
34072cded2 | ||
|
|
d4211f957c | ||
|
|
d91d9ab35f | ||
|
|
2dfc726c38 | ||
|
|
67186e6422 | ||
|
|
f57ee81e99 | ||
|
|
6d447236b2 | ||
|
|
c03fd40dbf | ||
|
|
71ab5a1507 | ||
|
|
806c1654d5 | ||
|
|
09fb06a0f8 | ||
|
|
7d282c606e | ||
|
|
03302643db | ||
|
|
2dfc875b76 | ||
|
|
2cd1728186 | ||
|
|
065c28854f | ||
|
|
020b41abaa | ||
|
|
040e132d2e | ||
|
|
5986af1690 | ||
|
|
77f5915915 | ||
|
|
6493c127fa | ||
|
|
091125ed08 | ||
|
|
04435e6374 | ||
|
|
f6299dd8cd | ||
|
|
593f9eff79 | ||
|
|
d8b61a92bd | ||
|
|
b010155f31 | ||
|
|
cebf2ca8f5 | ||
|
|
cbb3ca7363 | ||
|
|
333ecaeb07 | ||
|
|
7dde9ab0bb | ||
|
|
88767b8aa3 | ||
|
|
30d51a5f6a | ||
|
|
b876679619 | ||
|
|
e151f0977e | ||
|
|
23637972b1 | ||
|
|
5c5274bbe4 | ||
|
|
5a172d30f1 | ||
|
|
836e421363 | ||
|
|
c22451aa05 | ||
|
|
3376debc78 | ||
|
|
a9deda4f31 | ||
|
|
da7e44f55d | ||
|
|
8dc2e0a160 | ||
|
|
a0a4ff9655 | ||
|
|
4db1db9bcf | ||
|
|
179beb2a4c | ||
|
|
49194f893b | ||
|
|
c11096373e | ||
|
|
0b56ffbc24 | ||
|
|
2a5940d420 | ||
|
|
c6f191790c | ||
|
|
c3737aaf2e | ||
|
|
14c1ee66c6 | ||
|
|
e97ea67535 | ||
|
|
5774df2e62 | ||
|
|
032f024e12 | ||
|
|
9b3b1c3cc6 | ||
|
|
6aa0aeeee4 | ||
|
|
83267c2744 | ||
|
|
1e37aae43e | ||
|
|
3c83fdaccd | ||
|
|
af0e425306 | ||
|
|
a80cf0f502 | ||
|
|
1ca3a5cb09 | ||
|
|
8ab35ec423 | ||
|
|
2808024594 | ||
|
|
f43cf32516 | ||
|
|
81c26556b1 | ||
|
|
bf4338590a | ||
|
|
b1f74c929b | ||
|
|
0b59c879a9 | ||
|
|
a1f0756396 | ||
|
|
47b9f5a4c4 | ||
|
|
f79192b231 | ||
|
|
437c47868b | ||
|
|
170af495f2 | ||
|
|
4294bd5bf5 | ||
|
|
406cde65db | ||
|
|
aebe27dbf9 | ||
|
|
d44fc5cf70 | ||
|
|
5aeced673a | ||
|
|
f6b9c69382 | ||
|
|
1c6eaf2c29 | ||
|
|
7e48899b61 | ||
|
|
26690d1e69 | ||
|
|
95a2bc5d04 | ||
|
|
24aad20869 | ||
|
|
468ee8bffe | ||
|
|
f4cd4c7375 | ||
|
|
7f34e64efb | ||
|
|
037bf6525d | ||
|
|
5621d64891 | ||
|
|
762a92f156 | ||
|
|
2beb9bace0 | ||
|
|
3aa9871440 | ||
|
|
aa490aefe2 | ||
|
|
da215ffb9d | ||
|
|
a7458f1597 | ||
|
|
0d931a0bd7 | ||
|
|
15944245f8 | ||
|
|
deba02be6c | ||
|
|
c58807d8bb | ||
|
|
0d085e66c9 | ||
|
|
bdd4f4c908 | ||
|
|
d0896aa911 | ||
|
|
57f18e2913 | ||
|
|
b1c5725a78 | ||
|
|
e791ed4ba5 | ||
|
|
b7a1475217 | ||
|
|
a9a1043e5d | ||
|
|
be045d15ee | ||
|
|
4b7da3530f | ||
|
|
b78fe84421 | ||
|
|
56484c6b34 | ||
|
|
aa36403572 | ||
|
|
61b09cd93f | ||
|
|
e604f9de38 | ||
|
|
e586399abb | ||
|
|
fb88a5379a | ||
|
|
ae65547498 | ||
|
|
267d51b8ce | ||
|
|
8a0d2cbd61 | ||
|
|
6ebbf3b901 | ||
|
|
c8ea6adc94 | ||
|
|
135c0139fa | ||
|
|
0750684ec4 | ||
|
|
c7c73224da | ||
|
|
6d5c7887ae | ||
|
|
ad98de19e8 | ||
|
|
e80002e7fd | ||
|
|
28474b0249 | ||
|
|
c79b1f9705 | ||
|
|
b14673e4eb | ||
|
|
f9af12c05c | ||
|
|
59574159b0 | ||
|
|
95e7685d4b | ||
|
|
844e1dc8a1 | ||
|
|
d98a0f2890 | ||
|
|
3b8a20fbd7 | ||
|
|
76130a91f6 | ||
|
|
0a9114bc49 | ||
|
|
5edd305d37 | ||
|
|
c2c20da250 | ||
|
|
b76fef912c | ||
|
|
155e6e0bf2 | ||
|
|
cdac6dacc9 | ||
|
|
07972a671e | ||
|
|
d409394bdf | ||
|
|
043b2fe7e5 | ||
|
|
8b47a22bdc | ||
|
|
0f484dc85e | ||
|
|
c493d45517 | ||
|
|
c084d7a2c8 | ||
|
|
25ac3338ec | ||
|
|
f35fd13600 | ||
|
|
1b7e09ca77 | ||
|
|
12290267eb | ||
|
|
ebbecf4b84 | ||
|
|
58359146cf | ||
|
|
9a9fea87b1 | ||
|
|
b29695acc5 | ||
|
|
8a79508fae | ||
|
|
f391f7928d | ||
|
|
9ea939469f | ||
|
|
cbb45094a5 | ||
|
|
e9863f8ffd | ||
|
|
4dc1d6b91d | ||
|
|
b5a47566d6 | ||
|
|
5feb40590b | ||
|
|
6966036c99 | ||
|
|
1b997ae1f9 | ||
|
|
09a071e124 | ||
|
|
614fa385db | ||
|
|
9c298a80e2 | ||
|
|
b9c0e38fae | ||
|
|
383cba7354 | ||
|
|
aeda561e1b | ||
|
|
e330a6e1ae | ||
|
|
302855dfbd | ||
|
|
fcb26a2dab | ||
|
|
f11cc86e8d | ||
|
|
6be539d148 | ||
|
|
595541fb2a | ||
|
|
ed06db5643 | ||
|
|
feb4b0f232 | ||
|
|
1a16d8a69d | ||
|
|
f4bb92fe8c | ||
|
|
0ed9913358 | ||
|
|
320eb3fe20 | ||
|
|
857d0a9834 | ||
|
|
a273cca87d | ||
|
|
80a2cb8356 | ||
|
|
b8fedbb512 | ||
|
|
4107dbd5ae | ||
|
|
fbe8c16f6c | ||
|
|
8a5357e565 | ||
|
|
694ff78a8f | ||
|
|
ccb68c8691 | ||
|
|
147f22b1d5 | ||
|
|
b382c5a4b2 | ||
|
|
6e5fc39f94 | ||
|
|
3eaf36d3e4 | ||
|
|
cff9f91172 | ||
|
|
156049b854 | ||
|
|
ccff430c1b | ||
|
|
699c8384c0 | ||
|
|
e05c2f4f02 | ||
|
|
3f82d1d595 | ||
|
|
faee259868 | ||
|
|
faf083a084 | ||
|
|
6819a06d21 | ||
|
|
4de98507f2 | ||
|
|
932abb840f | ||
|
|
cc6168afd2 | ||
|
|
12d797b01d | ||
|
|
b7bac17db8 | ||
|
|
1cefdb9a24 | ||
|
|
6977aa090a | ||
|
|
b5d3a4c53d | ||
|
|
0d8b72f494 | ||
|
|
c91f8193ae | ||
|
|
22bedee8ea | ||
|
|
1950aabbd3 | ||
|
|
4249c242ae | ||
|
|
bf968ee96c | ||
|
|
95fbfba6f5 | ||
|
|
b0e162e820 | ||
|
|
96ad022091 | ||
|
|
14a1353684 | ||
|
|
e30498458e | ||
|
|
525db3e566 | ||
|
|
d0deef5085 | ||
|
|
2d8c0d8d46 | ||
|
|
fe346acb80 | ||
|
|
a86c6819df | ||
|
|
47790ceee6 | ||
|
|
dc6e06647f | ||
|
|
1c0c7b152a | ||
|
|
90f03a62f8 | ||
|
|
69f6e3e11d | ||
|
|
179c02dfb0 | ||
|
|
582a5daf7a | ||
|
|
c692322053 | ||
|
|
07d58522cd | ||
|
|
4e1275d014 | ||
|
|
ae8351effa | ||
|
|
a3426ba78c | ||
|
|
5f41f6f3fd | ||
|
|
4a869d5793 | ||
|
|
f676ab0fb4 | ||
|
|
26cbb07ce4 | ||
|
|
2e09c985fc | ||
|
|
a0d0c9e855 | ||
|
|
e4493ea30e | ||
|
|
b0daad0e7d | ||
|
|
660a96be70 | ||
|
|
4c06d1139d | ||
|
|
b6ce889ed5 | ||
|
|
e7cacde27a | ||
|
|
9578b2d8a7 | ||
|
|
eb390b3c44 | ||
|
|
61150c5103 | ||
|
|
d88081d2ec | ||
|
|
590165d9d8 | ||
|
|
0cc1e53857 | ||
|
|
53cc111e74 | ||
|
|
67b3c3ab48 | ||
|
|
691ab27283 | ||
|
|
f071976811 | ||
|
|
cf1fe176da | ||
|
|
3e582c07eb | ||
|
|
52cd18e33b | ||
|
|
5699e65b9e | ||
|
|
07085766c4 | ||
|
|
04e15d8ed0 | ||
|
|
7551aed8ba | ||
|
|
378689ebdb | ||
|
|
7fbfea568b | ||
|
|
08886297cd | ||
|
|
ff015a32f7 | ||
|
|
9c61d7fa83 | ||
|
|
d630ba1b4c | ||
|
|
afc4dd9a80 | ||
|
|
4e498f6674 | ||
|
|
fd02f208c0 | ||
|
|
eecf79c6a2 | ||
|
|
ae1eec4258 | ||
|
|
4df193a60c | ||
|
|
2c6be044d5 | ||
|
|
f9f5a08a5b | ||
|
|
08b1493953 | ||
|
|
5182fc42c3 | ||
|
|
7ffb000f45 | ||
|
|
3566dc4971 | ||
|
|
6bc54772ad | ||
|
|
45796c324a | ||
|
|
f1222d0232 | ||
|
|
e5c926a678 | ||
|
|
c8b55e7ab0 | ||
|
|
56aab05ae3 | ||
|
|
33f70c3bc8 | ||
|
|
da2c4edcd6 | ||
|
|
5c7c21576c | ||
|
|
ed42c22f09 | ||
|
|
cb39735535 | ||
|
|
aeffad02a9 | ||
|
|
da4a26d03f | ||
|
|
c9bc609c8f | ||
|
|
c715138972 | ||
|
|
b17f0996d5 | ||
|
|
f0633b8ed0 | ||
|
|
8d74126db0 | ||
|
|
7f2fe7940d | ||
|
|
4d337576e3 | ||
|
|
2cb6cfdb15 | ||
|
|
1bb9e9872c | ||
|
|
800d59083d | ||
|
|
f7fce55f90 | ||
|
|
4e16922165 | ||
|
|
fb5f18a4c3 | ||
|
|
eca5fa4480 | ||
|
|
70d744e65f | ||
|
|
8208179f40 | ||
|
|
d0aeaabaef | ||
|
|
9594d4770d | ||
|
|
a31d5d100e | ||
|
|
f137dba2b1 | ||
|
|
9b0dc67001 | ||
|
|
a72856165a | ||
|
|
06ce82727e | ||
|
|
9b6bb89fcc | ||
|
|
7591a9e206 | ||
|
|
28afbaa836 | ||
|
|
d3e5b70cb6 | ||
|
|
4143672f45 | ||
|
|
455dc35408 | ||
|
|
499c19f399 | ||
|
|
4b9e06d204 | ||
|
|
6376af7466 | ||
|
|
9138cac8bf | ||
|
|
d9e32745c9 | ||
|
|
271ae4fd2b | ||
|
|
f73c7b75d6 | ||
|
|
d3adbbf23a | ||
|
|
202dfb7429 | ||
|
|
018c8408d8 | ||
|
|
68e4cf93d7 | ||
|
|
6dbf6c8281 | ||
|
|
a40ca80b98 | ||
|
|
845daabef4 | ||
|
|
537ca12076 | ||
|
|
3202c71141 | ||
|
|
d777865ae8 | ||
|
|
ac6053de8d | ||
|
|
bcb67cb036 | ||
|
|
7c5324d4a6 | ||
|
|
3ba0f3edc5 | ||
|
|
a4518dc84f | ||
|
|
d8ad7334fb | ||
|
|
d9211871c0 | ||
|
|
e85ef540ff | ||
|
|
352312c7c5 | ||
|
|
48f2d335e3 | ||
|
|
a7effd0d7d | ||
|
|
c95617f707 | ||
|
|
f5a8e6fad9 | ||
|
|
2e33775aa9 | ||
|
|
3ba355714b | ||
|
|
3c49a1132f | ||
|
|
735591aea3 | ||
|
|
187f5024ec | ||
|
|
bfe02144b2 | ||
|
|
e7a750564f | ||
|
|
a634ad5965 | ||
|
|
9ea769b1c6 | ||
|
|
74528bb0d7 | ||
|
|
a897428753 | ||
|
|
8b5236ad9c | ||
|
|
5dd8f9b9b2 | ||
|
|
9aedaa171b | ||
|
|
8a551636e4 | ||
|
|
1690674941 | ||
|
|
e4ee8ca046 | ||
|
|
ab408b726b | ||
|
|
4ed0a53c5f | ||
|
|
788343ed6b | ||
|
|
c4f193ed08 | ||
|
|
86dff4d61b | ||
|
|
24bd6bc471 | ||
|
|
a89b5c5961 | ||
|
|
bdbdeab847 | ||
|
|
15c7aa8dc9 | ||
|
|
3a6276aa86 | ||
|
|
c733a6d0f6 | ||
|
|
45ad567a74 | ||
|
|
8046ef9e2f | ||
|
|
2e0eb94b97 | ||
|
|
dd8108f7eb | ||
|
|
dc0c43e3ac | ||
|
|
59ae8205dc | ||
|
|
69c3700f27 | ||
|
|
ab63a093cc | ||
|
|
5b98d812a0 | ||
|
|
cc6f511df4 | ||
|
|
d9fb2a34d5 | ||
|
|
e5d1526006 | ||
|
|
479d9042c8 | ||
|
|
652281a6f8 | ||
|
|
cd1640acda | ||
|
|
a340b6f054 | ||
|
|
7026837f7d | ||
|
|
ee2d56b049 | ||
|
|
927bc8100e | ||
|
|
03d1b00d0e | ||
|
|
98dd7655c5 | ||
|
|
faac91bd5f | ||
|
|
18a2f8b20a | ||
|
|
b2704088fa | ||
|
|
459dc13a34 | ||
|
|
84dae6f6f4 | ||
|
|
adc3b9efd5 | ||
|
|
5f262de65f | ||
|
|
37af023351 | ||
|
|
9f22426b56 | ||
|
|
f584cbdcf8 | ||
|
|
b4fb980ef6 | ||
|
|
1f31b7cc20 | ||
|
|
6cb6414f5b | ||
|
|
271a8f57cc | ||
|
|
0bd62bfeb9 | ||
|
|
a1de0b2759 | ||
|
|
0dd95087c2 | ||
|
|
f51c50a68b | ||
|
|
44219d6f1b | ||
|
|
6aa69c3434 | ||
|
|
3486dd8b11 | ||
|
|
da333e3607 | ||
|
|
27085d3d29 | ||
|
|
4c4f618255 | ||
|
|
2fbcc1837e | ||
|
|
c14cf65f36 | ||
|
|
9328002e2b | ||
|
|
bfdf23d18f | ||
|
|
6a2ffb092b | ||
|
|
985169fb63 | ||
|
|
9e3ec14a39 | ||
|
|
40b00a16d4 | ||
|
|
14ad8e098f | ||
|
|
bd026be036 | ||
|
|
3fc817675c | ||
|
|
66515cd4a5 | ||
|
|
a184cadb91 | ||
|
|
844e2ebeff | ||
|
|
f5cb4ec06c | ||
|
|
f62c2a2291 | ||
|
|
e76b0ba023 | ||
|
|
73ea6106c3 | ||
|
|
97cc90bfd3 | ||
|
|
a35e8bb56b | ||
|
|
cfb6854ae0 | ||
|
|
edac3e9d34 | ||
|
|
ed4131f985 | ||
|
|
3ca3d5296a | ||
|
|
4e361dd78d | ||
|
|
0776288de1 | ||
|
|
bb62870eda | ||
|
|
875205ca83 | ||
|
|
b3693fd09e | ||
|
|
a61dfad2f1 | ||
|
|
667524c639 | ||
|
|
7489deb36a | ||
|
|
5eb7d4927f | ||
|
|
e62c55afb9 | ||
|
|
36557689c0 | ||
|
|
c4e62adc35 | ||
|
|
b772593982 | ||
|
|
e7af2346cc | ||
|
|
8ff89dce18 | ||
|
|
b78090b362 | ||
|
|
d23ffc1ccc | ||
|
|
c27d16a656 | ||
|
|
a24cf52798 | ||
|
|
d25b90eebe | ||
|
|
a7ceb48d0e | ||
|
|
6f63bd2ed8 | ||
|
|
870b3221f8 | ||
|
|
e6bcc38e04 | ||
|
|
8adcb5af50 | ||
|
|
04267208f3 | ||
|
|
ab6fd69088 | ||
|
|
5df7ba79e7 | ||
|
|
4c8709c03d | ||
|
|
8d2f752efe | ||
|
|
8e39c4dff8 | ||
|
|
c257824ad0 | ||
|
|
b4a69e9675 | ||
|
|
498579e5b0 | ||
|
|
a7e915f8aa | ||
|
|
3d9599f241 | ||
|
|
067a0b0f0b | ||
|
|
b81d6e16c9 | ||
|
|
db5b27a860 | ||
|
|
8de41084ea | ||
|
|
8a262a1c1b | ||
|
|
d50a51c571 | ||
|
|
e30f9329e1 | ||
|
|
0a124e05c7 | ||
|
|
f84730531c | ||
|
|
404a2e140a | ||
|
|
3ed2c59b08 | ||
|
|
64d8822e4d | ||
|
|
8a5550cfc6 | ||
|
|
0e8650f686 | ||
|
|
58f24002b0 | ||
|
|
193470e986 | ||
|
|
6d677a6bec | ||
|
|
422b5a93be | ||
|
|
5899f6968d | ||
|
|
86f2cc28ed | ||
|
|
87bf359e12 | ||
|
|
0358549069 | ||
|
|
ca05847e2d | ||
|
|
f12f1e0fb3 | ||
|
|
19e120f280 | ||
|
|
98ec87c6da | ||
|
|
5a3f1eecef | ||
|
|
a5a110c987 | ||
|
|
fe13788de2 | ||
|
|
643e4b9c98 | ||
|
|
1e87f43c61 | ||
|
|
e1fa7894b7 | ||
|
|
baae46173f | ||
|
|
faab749a78 | ||
|
|
3869b68b14 | ||
|
|
98a557a6dc | ||
|
|
9ac9cce63c | ||
|
|
09f00d6c4a | ||
|
|
1c61348979 | ||
|
|
99202645e4 | ||
|
|
e584e43592 | ||
|
|
8253aba976 | ||
|
|
57f008589e | ||
|
|
3f15c6f6de | ||
|
|
9314679fc8 | ||
|
|
3bfc112331 | ||
|
|
9c69763529 | ||
|
|
2a06900da8 | ||
|
|
c2d4c5357d | ||
|
|
bec626e970 | ||
|
|
4606cbe90c | ||
|
|
363eb41129 | ||
|
|
ccad45e511 | ||
|
|
edf407e1d8 | ||
|
|
54193fd7e5 | ||
|
|
faac026cec | ||
|
|
9d8d355033 | ||
|
|
ba2eb633a0 | ||
|
|
d384ee00e0 | ||
|
|
901be7b116 | ||
|
|
8cf5b5d13b | ||
|
|
f182b1da96 | ||
|
|
c7315d6598 | ||
|
|
9541769cb4 | ||
|
|
28994925d8 | ||
|
|
f308e2e2c3 | ||
|
|
d2ac191754 | ||
|
|
2b7d80a6c7 | ||
|
|
87b59c61d9 | ||
|
|
c7afad73f0 | ||
|
|
2c76ae793f | ||
|
|
20d86c5678 | ||
|
|
7462caa9ef | ||
|
|
dd4f89d891 | ||
|
|
1123114298 | ||
|
|
15d600dd6a | ||
|
|
ea2311d28c | ||
|
|
e11c3f4294 | ||
|
|
aa390443e9 | ||
|
|
0de146c2e6 | ||
|
|
784e8c82a7 | ||
|
|
048abf9a2d | ||
|
|
154acdefdd | ||
|
|
df62a93b69 | ||
|
|
3be064d67d | ||
|
|
30a3f2c386 | ||
|
|
7b79168851 | ||
|
|
b966bb68bd | ||
|
|
466331c1c6 | ||
|
|
1747bc98db | ||
|
|
2a6a5e62d4 | ||
|
|
1090a4b5d8 | ||
|
|
08e7a9509b | ||
|
|
cb5c5d59fc | ||
|
|
2db17b805d | ||
|
|
656e765b5f | ||
|
|
032ee17bee | ||
|
|
ebda842850 | ||
|
|
8573dd975b | ||
|
|
d8fc9720a4 | ||
|
|
a4676f3350 | ||
|
|
c64688b4ae | ||
|
|
b2cc2d6c8f | ||
|
|
0ba7bbe209 | ||
|
|
04c33ec365 | ||
|
|
88b7d79325 | ||
|
|
6cdca895ce | ||
|
|
8943f4acfa | ||
|
|
824854bc7b | ||
|
|
8e7ee78a87 | ||
|
|
659751b2f4 | ||
|
|
62b405a5d6 | ||
|
|
b6e9a0d932 | ||
|
|
e28d9f124f | ||
|
|
94efb3f1a2 | ||
|
|
c04ee031d5 | ||
|
|
a93599f0bb | ||
|
|
7f3d9c1e92 | ||
|
|
50caf3ea19 | ||
|
|
e434d593a6 | ||
|
|
e3db022fd8 | ||
|
|
a3553e115b | ||
|
|
7f928a4b97 | ||
|
|
7014a36a0f | ||
|
|
cb1634da45 | ||
|
|
16285675ef | ||
|
|
85f0135acd | ||
|
|
d110e52c19 | ||
|
|
d8e40f5cf2 | ||
|
|
9d13aae833 | ||
|
|
be47983fc2 | ||
|
|
ea7c89c9ac | ||
|
|
7a0500ae97 | ||
|
|
a831503c5b | ||
|
|
b29b861ee6 | ||
|
|
ba65dfeb75 | ||
|
|
7c4611e9bb | ||
|
|
d37babe2fe | ||
|
|
3b51f610d0 | ||
|
|
82feca4ca2 | ||
|
|
69d4a6fd3c | ||
|
|
9542fadce1 | ||
|
|
11c7204be6 | ||
|
|
1cc3a2aec3 | ||
|
|
99906a8c02 | ||
|
|
07efa50db6 | ||
|
|
74dcb81ef9 | ||
|
|
0e94b60294 | ||
|
|
293eff6454 | ||
|
|
6d7d9af788 | ||
|
|
a6799d0dea | ||
|
|
d992b45afa | ||
|
|
ceffb74c73 | ||
|
|
a9090a1ef3 | ||
|
|
ec3dca1022 | ||
|
|
b1f77fbff4 | ||
|
|
c83cc3b27f | ||
|
|
34beb82cd2 | ||
|
|
69f451c332 | ||
|
|
4ae99fc44c | ||
|
|
577ef71edd | ||
|
|
6fe2a658df | ||
|
|
934b206f45 | ||
|
|
d1b327a5ba | ||
|
|
0e869dde77 | ||
|
|
a9d8aa626a | ||
|
|
90a5e2f277 | ||
|
|
04f81a0040 | ||
|
|
d9db40f595 | ||
|
|
b4b1a3c78b | ||
|
|
0989ae3ab4 | ||
|
|
6d2e37ab49 | ||
|
|
3626dc7c84 | ||
|
|
8b855ca5eb | ||
|
|
65e384bde4 | ||
|
|
5097e1c64e | ||
|
|
56e3281f62 | ||
|
|
027db68b38 | ||
|
|
392f0f73fc | ||
|
|
6a823b1fec | ||
|
|
f99d568503 | ||
|
|
c2567622e2 | ||
|
|
58fe78caa3 | ||
|
|
81761817cd | ||
|
|
6a625b7e78 | ||
|
|
c819a07205 | ||
|
|
6fc31a5f66 | ||
|
|
8a207c757b | ||
|
|
264eaa1f23 | ||
|
|
0375ea568a | ||
|
|
5f24b4b73b | ||
|
|
41d6f77ebf | ||
|
|
7ef8f9d5ad | ||
|
|
df38f7e635 | ||
|
|
200c9ae769 | ||
|
|
61d5bd7932 | ||
|
|
5cf4f1f846 | ||
|
|
4c7d08ad6b | ||
|
|
31aae38fff | ||
|
|
2f5b99aebd | ||
|
|
4afb9f53f0 | ||
|
|
ff5dffaf8d | ||
|
|
4a1fae7383 | ||
|
|
24c93adcf2 | ||
|
|
6e6536e95e | ||
|
|
5ffb071ab7 | ||
|
|
fb9fa93ba4 | ||
|
|
d94143d616 | ||
|
|
f6b53d7a99 | ||
|
|
c8b696739c | ||
|
|
88b519216f | ||
|
|
1ef29f00fe | ||
|
|
c212fa482c | ||
|
|
b8c0caa19b | ||
|
|
f04f584b39 | ||
|
|
30c4bab694 | ||
|
|
263c9c2292 | ||
|
|
f6a5bfbfc6 | ||
|
|
dabfee5843 | ||
|
|
5edff6f38b | ||
|
|
49ee98ee7f | ||
|
|
9cfdc37145 | ||
|
|
9304a70165 | ||
|
|
b6681e6c84 | ||
|
|
37b8436688 | ||
|
|
43517d4eed | ||
|
|
f8a4d2d62b | ||
|
|
e74bdf54d6 | ||
|
|
8b44748176 | ||
|
|
0d33a9dfbf | ||
|
|
2aadf8efa5 | ||
|
|
c29eb41d7d | ||
|
|
98a432fcf5 | ||
|
|
a76df22552 | ||
|
|
d46ed2f004 | ||
|
|
845dedc2dc | ||
|
|
c043bd6a11 | ||
|
|
23fc68bcd0 | ||
|
|
a157df6254 | ||
|
|
66769d67f7 | ||
|
|
537ee7be61 | ||
|
|
c1431e50c0 | ||
|
|
03bcd7421e | ||
|
|
815e22d916 | ||
|
|
2110fa8088 | ||
|
|
cb864c74e4 | ||
|
|
3f793cac34 | ||
|
|
865353a613 | ||
|
|
5ca47e6c42 | ||
|
|
3021469872 | ||
|
|
efd84343c3 | ||
|
|
0019ed2b64 | ||
|
|
8a08cdb421 | ||
|
|
696db0cf3c | ||
|
|
cc192d0ba3 | ||
|
|
ec509ff184 | ||
|
|
5e735fbefc | ||
|
|
38774a6f8b | ||
|
|
f0f41b217e | ||
|
|
b96d608c80 | ||
|
|
97ce1218c7 | ||
|
|
39838c853b | ||
|
|
33aeb05222 | ||
|
|
4a6973b5ff | ||
|
|
5f0539c16a | ||
|
|
9a470ab653 | ||
|
|
c5672253d4 | ||
|
|
65d0ecb3d8 | ||
|
|
16f14ff6b1 | ||
|
|
d6c220d2be | ||
|
|
8390669bcc | ||
|
|
08774b6fd9 | ||
|
|
d861c7c0b5 | ||
|
|
5922afb70c | ||
|
|
7404ed29af | ||
|
|
52b99ea163 | ||
|
|
746547c7ce | ||
|
|
51ad5e6268 | ||
|
|
8857bcfd39 | ||
|
|
904973be83 | ||
|
|
747ff77132 | ||
|
|
846172cef9 | ||
|
|
048de8000c | ||
|
|
2ad2bf0399 | ||
|
|
deb647839f | ||
|
|
0a4fba59a9 | ||
|
|
3e3f56f43a | ||
|
|
86fe4103b4 | ||
|
|
90704ecfa8 | ||
|
|
83eee2d464 | ||
|
|
14f73f22ab | ||
|
|
45cbccbc6b | ||
|
|
550e67da94 | ||
|
|
7eece68c45 | ||
|
|
c00e776cae | ||
|
|
867a14fe23 | ||
|
|
0720b69781 | ||
|
|
3b064faacd | ||
|
|
ac43e8da36 | ||
|
|
fb6b3a9da2 | ||
|
|
00024f2e23 | ||
|
|
99ec94bae5 | ||
|
|
6c50e5c2b6 | ||
|
|
3fad1e3566 | ||
|
|
0e20aaf456 | ||
|
|
190b1591dc | ||
|
|
037f84ff54 | ||
|
|
3b8bfb8ab6 | ||
|
|
059885ab7b | ||
|
|
631ca2e490 | ||
|
|
dcb4c059f6 | ||
|
|
494fe1d4e8 | ||
|
|
0767a8fcea | ||
|
|
5048c9f0a1 | ||
|
|
389bb95c69 | ||
|
|
835ffe76cf | ||
|
|
a23a7970d4 | ||
|
|
447de3fa96 | ||
|
|
6f542582b8 | ||
|
|
809aa9e919 | ||
|
|
d468219e1e | ||
|
|
908fba039d | ||
|
|
0498d6fd46 | ||
|
|
9d2ace5b7a | ||
|
|
924aa9561a | ||
|
|
c1571914b7 | ||
|
|
9007503461 | ||
|
|
e61ba6f193 | ||
|
|
144412f57c | ||
|
|
4cc78c39be | ||
|
|
0633c0898d | ||
|
|
e73f3382be | ||
|
|
213cced77c | ||
|
|
54ee60b26e | ||
|
|
dba3b73378 | ||
|
|
cbe616da37 | ||
|
|
0ebc4d493a | ||
|
|
f3419ee98b | ||
|
|
43e3fa6ae7 | ||
|
|
96f8eba9b0 | ||
|
|
89bbb64de7 | ||
|
|
dfe16f210c | ||
|
|
34f02238c6 | ||
|
|
097207ba8b | ||
|
|
c78988bfad | ||
|
|
7884d63384 | ||
|
|
3a266f6888 | ||
|
|
3d988779d6 | ||
|
|
672f7e4310 | ||
|
|
e7b24c54b5 | ||
|
|
7659df8087 | ||
|
|
0ff89615b4 | ||
|
|
54095fa4dc | ||
|
|
cdd50cbc60 | ||
|
|
c2617c6c3b | ||
|
|
261017dc7d | ||
|
|
bff4e57bea | ||
|
|
7fe220301f | ||
|
|
60ad90829d | ||
|
|
0513bfae1b | ||
|
|
157f28a249 | ||
|
|
2d34dafa4c | ||
|
|
41a5105ad4 | ||
|
|
43cf0bf51b | ||
|
|
459465abde | ||
|
|
87c7832b66 | ||
|
|
d462edf80d | ||
|
|
6bbbf6ed27 | ||
|
|
b4c8855d73 | ||
|
|
bb237bcf40 | ||
|
|
ec6b89bf55 | ||
|
|
5553b44c27 | ||
|
|
8e61a74e03 | ||
|
|
238e77a401 | ||
|
|
dd02fb4030 | ||
|
|
c4baeed03b | ||
|
|
491c342be2 | ||
|
|
da81d4a9cc | ||
|
|
618c591742 | ||
|
|
7cfc6e3910 | ||
|
|
262ff4fb29 | ||
|
|
20878b2f57 | ||
|
|
ee54582795 | ||
|
|
660a7899eb | ||
|
|
75baffaf0e | ||
|
|
5e1fdcafae | ||
|
|
ea0371ed8f | ||
|
|
feedeeb47d | ||
|
|
dcf99d1c3d | ||
|
|
48bdea0403 | ||
|
|
9dcae97c2d | ||
|
|
3967b58aa4 | ||
|
|
0e596877e1 | ||
|
|
0b9694cd02 | ||
|
|
4d2292a415 | ||
|
|
3b4103a1a1 | ||
|
|
24dbf44b3d | ||
|
|
22424cdc2a | ||
|
|
4f30dc51a7 | ||
|
|
bbd94e7643 | ||
|
|
d54e14289e | ||
|
|
1e9fdd1bc0 | ||
|
|
7fba644183 | ||
|
|
1b6a3432d2 | ||
|
|
3a4629ca3c | ||
|
|
ce0fb15d8d | ||
|
|
7dd7a302b5 | ||
|
|
31baaf7676 | ||
|
|
a17dfbf732 | ||
|
|
f869817be4 | ||
|
|
e2213c7876 | ||
|
|
5730cb6e7b | ||
|
|
8589bdc118 | ||
|
|
1d5e1793fa | ||
|
|
284bf0bef5 | ||
|
|
dad8cfca40 | ||
|
|
8b08e90a23 | ||
|
|
60a5d76cef | ||
|
|
1a34ff337a | ||
|
|
80a0f04206 | ||
|
|
c9709ee310 | ||
|
|
d8cc461754 | ||
|
|
4a34264fb9 | ||
|
|
e5d9f3d2ab | ||
|
|
3fd060770a | ||
|
|
127a7f455a | ||
|
|
2244d02c51 | ||
|
|
70e984564d | ||
|
|
ba91c923c1 | ||
|
|
5898e05b35 | ||
|
|
bfb2e7a7e8 | ||
|
|
1acc1efc26 | ||
|
|
e1b9050106 | ||
|
|
e147c9c5cc | ||
|
|
445701b0fc | ||
|
|
79021a889b | ||
|
|
ba5e27ec0e | ||
|
|
fd28e7337b | ||
|
|
6d70eb7400 | ||
|
|
ee4f6388ab | ||
|
|
d33eb9f0c1 | ||
|
|
4d50c631e6 | ||
|
|
29001df8a6 | ||
|
|
0e9bb8f7ef | ||
|
|
96eea44967 | ||
|
|
0d6df8b9d4 | ||
|
|
dd66346760 | ||
|
|
687b505386 | ||
|
|
c8fdfd00ff | ||
|
|
8bebff48ef | ||
|
|
8d77b4d080 | ||
|
|
fc88f500fa | ||
|
|
369360c9b3 | ||
|
|
7a07d59997 | ||
|
|
c32e854de7 | ||
|
|
674b71cc87 | ||
|
|
9a6daa2bc1 | ||
|
|
20dcb49c38 | ||
|
|
1d2fe6bb8c | ||
|
|
fb67d6de34 | ||
|
|
aade84cfa6 | ||
|
|
0737a558da | ||
|
|
25241da539 | ||
|
|
dde49417c4 | ||
|
|
9a28c1a5dd | ||
|
|
214469782d | ||
|
|
cc1cf0a234 | ||
|
|
e709115995 | ||
|
|
cb6f1d208c | ||
|
|
54413c6389 | ||
|
|
a19fb25c1f | ||
|
|
74efefa454 | ||
|
|
4d51791286 | ||
|
|
337c072b34 | ||
|
|
241d097793 | ||
|
|
d1647735ff | ||
|
|
f8be11f353 | ||
|
|
3db49c47ec | ||
|
|
fc2bd2db1a | ||
|
|
b145301632 | ||
|
|
f1c2f2a5e6 | ||
|
|
5ec5b67e87 | ||
|
|
cff6417223 | ||
|
|
c7a3d08e0d | ||
|
|
65bf7b75ff | ||
|
|
0ed3347653 | ||
|
|
79f289b283 | ||
|
|
4b9902fff6 | ||
|
|
f019e97a5f | ||
|
|
9c641083ec | ||
|
|
bcfe2be11a | ||
|
|
e7d092f24c | ||
|
|
4799d6909f | ||
|
|
81970cc4ba | ||
|
|
9cc9d7e621 | ||
|
|
f9331c2181 | ||
|
|
92555e80bf | ||
|
|
5d69461677 | ||
|
|
a27b31ce8b | ||
|
|
deafeadd0b | ||
|
|
18c42d61ee | ||
|
|
f5123e8970 | ||
|
|
f4088497de | ||
|
|
f895a644ab | ||
|
|
580e9f538b | ||
|
|
70bb10a2fc | ||
|
|
a9f705aa4c | ||
|
|
55a80c5c7a | ||
|
|
3241e8df87 | ||
|
|
f099faa825 | ||
|
|
4f82826efd | ||
|
|
2217c905fe | ||
|
|
0d0fa298ca | ||
|
|
9b16e1baad | ||
|
|
5a1b687b1b | ||
|
|
368a10ef1a | ||
|
|
8f84c95215 | ||
|
|
171c1881ca | ||
|
|
631d020f9e | ||
|
|
f0b52f692a | ||
|
|
3db04d3a73 | ||
|
|
fcd95e1849 | ||
|
|
9d26eb0c43 | ||
|
|
97333692a7 | ||
|
|
76d88dc501 | ||
|
|
814bfcbc5c | ||
|
|
19502f61b0 | ||
|
|
f3e996076a | ||
|
|
8fb76cf42a | ||
|
|
23312e9ea8 | ||
|
|
4887e067ce | ||
|
|
b5d09f513d | ||
|
|
5f2b5e312c | ||
|
|
138350cec7 | ||
|
|
e74e0e0324 | ||
|
|
95dba214ef | ||
|
|
ec3be5a22f | ||
|
|
022b7a61ef | ||
|
|
c928c9c3b3 | ||
|
|
7177b662f5 | ||
|
|
cfb969e580 | ||
|
|
c6728cd303 | ||
|
|
c962fa3e42 | ||
|
|
bffbd371d3 | ||
|
|
086ef54b8b | ||
|
|
794eddf51f | ||
|
|
3374ac0a14 | ||
|
|
aac49e11c3 | ||
|
|
22469b9233 | ||
|
|
77f18b8105 | ||
|
|
d8d5840df2 | ||
|
|
147f73c49b | ||
|
|
c94bbc8c23 | ||
|
|
b4cac78005 | ||
|
|
0ce87e5220 | ||
|
|
a3a5017a49 | ||
|
|
00c7bd6112 | ||
|
|
c462d38d83 | ||
|
|
5e713d4c77 | ||
|
|
4a7d2d0cae | ||
|
|
b5171e27aa | ||
|
|
d9708069d9 | ||
|
|
e93db620a5 | ||
|
|
8227575019 | ||
|
|
79c8029be3 | ||
|
|
f03d003460 | ||
|
|
f55bb774b0 | ||
|
|
c61ab03e20 | ||
|
|
3559f3d253 | ||
|
|
fa93ff5f5c | ||
|
|
ed25c98bb5 | ||
|
|
86e4fb1abf | ||
|
|
6543e5512c | ||
|
|
1256e1f765 | ||
|
|
7a5fd37648 | ||
|
|
f29e086498 | ||
|
|
3bf456e44b | ||
|
|
7912159335 | ||
|
|
b6673053eb | ||
|
|
fb14f64fcb | ||
|
|
e34d04e47e | ||
|
|
19beccd948 | ||
|
|
98b100b3b1 | ||
|
|
5ce870722f | ||
|
|
1c00ef7b46 | ||
|
|
d623e801b3 | ||
|
|
eafb323e50 | ||
|
|
545c509742 | ||
|
|
2f62377035 | ||
|
|
0fd2260f18 | ||
|
|
a9e3a12869 | ||
|
|
c3d8267e55 | ||
|
|
3ac2716ee9 | ||
|
|
3bd39826b6 | ||
|
|
feb8b00e01 | ||
|
|
44b4b85f6f | ||
|
|
99cac6e225 | ||
|
|
b68489d04d | ||
|
|
7f5327a69d | ||
|
|
9e493fb526 | ||
|
|
97663563a4 | ||
|
|
a48dec32d7 | ||
|
|
5a8be6902d | ||
|
|
affaf5de7b | ||
|
|
0cc7fa3799 | ||
|
|
eaa2339c16 | ||
|
|
fc04c143ec | ||
|
|
13ad03beca | ||
|
|
86a4c16180 | ||
|
|
36f9e69193 | ||
|
|
9b521e9fe2 | ||
|
|
73a6c68de5 | ||
|
|
1c1901b038 | ||
|
|
9d2d076682 | ||
|
|
377598351c | ||
|
|
72a7860d9c | ||
|
|
bc8f854089 | ||
|
|
e37fed841e | ||
|
|
643c515d7c | ||
|
|
5d7af2ed55 | ||
|
|
9f09b0d21b | ||
|
|
4faa4de7f4 | ||
|
|
f4f983c29b | ||
|
|
7ead13eaf3 | ||
|
|
15de4d3b9a | ||
|
|
e62bd5d6a2 | ||
|
|
04043d25bc | ||
|
|
c3f4c5f3d7 | ||
|
|
4c28d5bb54 | ||
|
|
9a5bedf42a | ||
|
|
2e81930088 | ||
|
|
cb1de76f63 | ||
|
|
705e304feb | ||
|
|
40bea6cd98 | ||
|
|
6af6d4f50a | ||
|
|
cd75a60b65 | ||
|
|
4baecdbb76 | ||
|
|
58edc9f528 | ||
|
|
193efdda6d | ||
|
|
97e027cb90 | ||
|
|
b51399e132 | ||
|
|
6f0a25e131 | ||
|
|
f112fdec68 | ||
|
|
a82fcf4f05 | ||
|
|
52856a8614 | ||
|
|
db9007fa9a | ||
|
|
b04cf69d1f | ||
|
|
17f57aedf0 | ||
|
|
6a9f6ed1df | ||
|
|
85989353f0 | ||
|
|
23a2659352 | ||
|
|
4b54442e9b | ||
|
|
1da2fe0289 | ||
|
|
2a10eb4fda | ||
|
|
f9a161ba3b | ||
|
|
615f0e3aa0 | ||
|
|
59c022fcef | ||
|
|
d6e351d8db | ||
|
|
2e5b35a861 | ||
|
|
d16e3efffb | ||
|
|
fe9e8216e8 | ||
|
|
f89569d0b8 | ||
|
|
cf4d838a9e | ||
|
|
e700becfed | ||
|
|
77a9019f4e | ||
|
|
1bc8ad1267 | ||
|
|
4d4545bde6 | ||
|
|
0064b93461 | ||
|
|
dfdbbb4d73 | ||
|
|
dc37f0eb4b | ||
|
|
17396aaa66 | ||
|
|
0778a0212b | ||
|
|
ad9238b740 | ||
|
|
07147d7e48 | ||
|
|
5368826cbb | ||
|
|
2dbc319f99 | ||
|
|
00884a5164 | ||
|
|
0013b89eb1 | ||
|
|
f113ffe3c1 | ||
|
|
3c335f7cea | ||
|
|
3760e46a84 | ||
|
|
d038dacdd5 | ||
|
|
6b946c2de9 | ||
|
|
2cb955a078 | ||
|
|
3e9f85edaf | ||
|
|
707cd6a12b | ||
|
|
b5de8b5929 | ||
|
|
e1174766b6 | ||
|
|
553d7fecad | ||
|
|
f277b110c7 | ||
|
|
90574c6b0a | ||
|
|
efbc685786 | ||
|
|
a030de0912 | ||
|
|
4d47654cce | ||
|
|
51512e9678 | ||
|
|
3e7513c6c7 | ||
|
|
568c273828 | ||
|
|
c49ef133f2 | ||
|
|
164c514953 | ||
|
|
b4f78e1cd0 | ||
|
|
893ef178c8 | ||
|
|
fd596fec42 | ||
|
|
024f6308c4 | ||
|
|
30e26d9187 | ||
|
|
e9599c9035 | ||
|
|
7bcbaf248e | ||
|
|
2f2acd87d3 | ||
|
|
f887238f06 | ||
|
|
c38afe1c72 | ||
|
|
6d934d216f | ||
|
|
57e99b1db6 | ||
|
|
19e9107efe | ||
|
|
1d1992bed9 | ||
|
|
3e881a8c81 | ||
|
|
68c746d615 | ||
|
|
9aca1489a8 | ||
|
|
4d13c23a7e | ||
|
|
3118bc7731 | ||
|
|
b45fe92788 | ||
|
|
82409bff75 | ||
|
|
4b63f6a7cb | ||
|
|
320e352b9a | ||
|
|
584e3929f1 | ||
|
|
00310bb802 | ||
|
|
f7a4a67191 | ||
|
|
3e32a23aed | ||
|
|
7b111a2be0 | ||
|
|
41cb83611c | ||
|
|
d6c640bec5 | ||
|
|
8bee9bfed0 | ||
|
|
6df263f37d | ||
|
|
77ce87d09c | ||
|
|
fe86c1a4d9 | ||
|
|
eef016d69e | ||
|
|
994817a65b | ||
|
|
f0acb25f18 | ||
|
|
ef98181c86 | ||
|
|
452e80d5ed | ||
|
|
8f3fe66e85 | ||
|
|
9a993c711b | ||
|
|
01d033cac5 | ||
|
|
d0911ba052 | ||
|
|
307554b3b4 | ||
|
|
a894498f57 | ||
|
|
1d358c7527 | ||
|
|
3e624aa165 | ||
|
|
138c419c23 | ||
|
|
fe5b72c2ff | ||
|
|
be15285d52 | ||
|
|
dc253ec40c | ||
|
|
82a0ab8fbe | ||
|
|
2663ab7ae7 | ||
|
|
643050ade3 | ||
|
|
891df9ca18 | ||
|
|
c315a99f3f | ||
|
|
669c44e449 | ||
|
|
4826a1bac9 | ||
|
|
e7249a5889 | ||
|
|
0094d05b8f | ||
|
|
43221df6f1 | ||
|
|
c1e3f7be2e | ||
|
|
988a42b36f | ||
|
|
f73733f63a | ||
|
|
6be525ddab | ||
|
|
cfe21cfe90 | ||
|
|
51cf52a455 | ||
|
|
a1cd42cac6 | ||
|
|
892a052b40 | ||
|
|
38e8b0a2c4 | ||
|
|
dff5d0e8d7 | ||
|
|
43eedec1b9 | ||
|
|
cc0c23aa49 | ||
|
|
004de12ad5 | ||
|
|
b9af498155 | ||
|
|
0b103f3f5d | ||
|
|
da81e6a5dd | ||
|
|
546f5ba76c | ||
|
|
f8e72cbbef | ||
|
|
53f6c43d86 | ||
|
|
3cba5abba1 | ||
|
|
ddda349e2d | ||
|
|
bc1271c2ab | ||
|
|
8dacef0af6 | ||
|
|
f2888e1e62 | ||
|
|
fffea11ac0 | ||
|
|
f22216c8cf | ||
|
|
b70ad9cbc9 | ||
|
|
3802d02fec | ||
|
|
598e2f3d50 | ||
|
|
091a1bf26f | ||
|
|
f3cf2e518b | ||
|
|
0caa11ef11 | ||
|
|
b6d1093cc6 | ||
|
|
44a1604d62 | ||
|
|
62a112df5b | ||
|
|
00c8f79606 | ||
|
|
331a4d99b8 | ||
|
|
6be05f0709 | ||
|
|
2130898fdd | ||
|
|
03253ebe49 | ||
|
|
2b50852146 | ||
|
|
eb055fabf1 | ||
|
|
7c29285953 | ||
|
|
ad8fadaed9 | ||
|
|
f2a0d576ec | ||
|
|
73efed17d0 | ||
|
|
a5a6f55a1b | ||
|
|
b881e8c9e7 | ||
|
|
64d2342049 | ||
|
|
807b547db5 | ||
|
|
d070277b9a | ||
|
|
5260bceb12 | ||
|
|
f274cc0af9 | ||
|
|
b8e7dd8e33 | ||
|
|
5925d2878e | ||
|
|
2a4fdcd095 | ||
|
|
046241797a | ||
|
|
247e29a573 | ||
|
|
a6eeaf333d | ||
|
|
24f7a47fea | ||
|
|
c78f02b3b2 | ||
|
|
1a632b7d86 | ||
|
|
78693bb5ec | ||
|
|
814a24c1ce | ||
|
|
0593322cf0 | ||
|
|
ae95c6ad56 | ||
|
|
2c87391f4c | ||
|
|
abd62471c0 | ||
|
|
ce3690f06b | ||
|
|
4c949d5d89 | ||
|
|
3a76265a2d | ||
|
|
baa2bb87f9 | ||
|
|
acec5ff234 | ||
|
|
01675f66ad | ||
|
|
2fa7e82377 | ||
|
|
8ff7249ed4 | ||
|
|
306dc80a5c | ||
|
|
e65b4b0cee | ||
|
|
14a5125910 | ||
|
|
995cd26bfa | ||
|
|
b8b1b5317c | ||
|
|
839876993c | ||
|
|
3c98be46bf | ||
|
|
3181eef6a4 | ||
|
|
1f02b33ce7 | ||
|
|
44d70f9dd2 | ||
|
|
cb36622cba | ||
|
|
487c24c466 | ||
|
|
6e13daf4df | ||
|
|
aaf43eefc3 | ||
|
|
3793c2212d | ||
|
|
e313a4b77a | ||
|
|
aad3083add | ||
|
|
9e700792ef | ||
|
|
2d0dbb7f34 | ||
|
|
38cd61c571 | ||
|
|
cdf92cca75 | ||
|
|
bee30aab92 | ||
|
|
1e2d7fbca7 | ||
|
|
d42934f101 | ||
|
|
03ca863051 | ||
|
|
f48a8afd36 | ||
|
|
b8383e3842 | ||
|
|
2972f3d0b3 | ||
|
|
79f2f3336a | ||
|
|
13ab21bff2 | ||
|
|
d4e49347c4 | ||
|
|
62404eabfb | ||
|
|
bb771e7e7a | ||
|
|
f3f8e2fb1f | ||
|
|
21ddf003e3 | ||
|
|
5667f89587 | ||
|
|
d38c01fd08 | ||
|
|
9931d2864f | ||
|
|
54b4bad0b3 | ||
|
|
c5dffe09da | ||
|
|
9892784e1d | ||
|
|
2ec8a0b3b5 | ||
|
|
52ad97f043 | ||
|
|
6126488131 | ||
|
|
252d5be3de | ||
|
|
139fd78832 | ||
|
|
30d9b976b2 | ||
|
|
7277735695 | ||
|
|
3ec0157d93 | ||
|
|
b9b25ca3f8 | ||
|
|
ad129617f8 | ||
|
|
1353b2d6e8 | ||
|
|
edc40358a7 | ||
|
|
cc7b7e0819 | ||
|
|
0dd8d14c05 | ||
|
|
851acaca88 | ||
|
|
2889f20cba | ||
|
|
fd2aa976b2 | ||
|
|
bcdc63bc3c | ||
|
|
aaf6855de0 | ||
|
|
9eb4210e6c | ||
|
|
037e0c8069 | ||
|
|
5a302d7946 | ||
|
|
c9e2052f61 | ||
|
|
b1dbd022d7 | ||
|
|
8c8527806c | ||
|
|
7271486d8a | ||
|
|
8892fcd2c2 | ||
|
|
159bfb8dbb | ||
|
|
777c583bd7 | ||
|
|
4b721dd717 | ||
|
|
1938301408 | ||
|
|
481385fd12 | ||
|
|
7602cacc8f | ||
|
|
21d3534399 | ||
|
|
3691001f8f | ||
|
|
f51c918f6a | ||
|
|
6f78e7bc77 | ||
|
|
5d3e7f38de | ||
|
|
7b9337a850 | ||
|
|
a548fec38d | ||
|
|
ad232e7477 | ||
|
|
73c4e2a2c2 | ||
|
|
d48cd119b9 | ||
|
|
23c7b6f75a | ||
|
|
bb4734ccb6 | ||
|
|
384cc81b3c | ||
|
|
6c370c8f2e | ||
|
|
b75b9076c5 | ||
|
|
bf9bf77c49 | ||
|
|
e378b3b5e9 | ||
|
|
9cc18a7029 | ||
|
|
992abbda76 | ||
|
|
540419020e | ||
|
|
e29618a045 | ||
|
|
33e45928b4 | ||
|
|
fd65464162 | ||
|
|
fc75f37e22 | ||
|
|
55a1770c4e | ||
|
|
5448bef247 | ||
|
|
228193ac72 | ||
|
|
442a08e3f9 | ||
|
|
6b412ba67b | ||
|
|
79a4f1408b | ||
|
|
eba5f5c9a7 | ||
|
|
a9629cd3ea | ||
|
|
68484e69d6 | ||
|
|
85bb9c6b46 | ||
|
|
3a39dd4e19 | ||
|
|
7a35dc1471 | ||
|
|
057a66c184 | ||
|
|
bb7147db7d | ||
|
|
9bdc8bcc1e | ||
|
|
625f97b60b | ||
|
|
03d528f71b | ||
|
|
9918a96355 | ||
|
|
d44fb104a8 | ||
|
|
81eeba4360 | ||
|
|
9c9e7f1dd5 | ||
|
|
1363cbc7f5 | ||
|
|
12ca88d813 | ||
|
|
c31f0637e5 | ||
|
|
d2fc45259e | ||
|
|
45e406c448 | ||
|
|
d7b7006709 | ||
|
|
7e80eaf8d2 | ||
|
|
5e828f73b1 | ||
|
|
9929913a48 | ||
|
|
4ac77a3307 | ||
|
|
eb6310a5e2 | ||
|
|
49e32e1f34 | ||
|
|
c58e16d097 | ||
|
|
67a7904ad9 | ||
|
|
128e122e92 | ||
|
|
ed8446f1a2 | ||
|
|
aa02d6a4c4 | ||
|
|
16293d252e | ||
|
|
0447e8676b | ||
|
|
cb09c2fe89 | ||
|
|
3ca1973d22 | ||
|
|
1d2a534d28 | ||
|
|
4c4be52726 | ||
|
|
221768544a | ||
|
|
5da3cce6bf | ||
|
|
3f291efafe | ||
|
|
0894938f07 | ||
|
|
6d2f5a8f7b | ||
|
|
30ea5989dc | ||
|
|
86e85362c8 | ||
|
|
a2396123c8 | ||
|
|
fa5bb51759 | ||
|
|
cc17c1f7fc | ||
|
|
fd659594fd | ||
|
|
0d1845ff81 | ||
|
|
21faec62c9 | ||
|
|
b05adcf4de | ||
|
|
f5c39d3817 | ||
|
|
6b4bbe7a87 | ||
|
|
82658ea362 | ||
|
|
f0ed5b7773 | ||
|
|
e04a7e9381 | ||
|
|
393a23e11a | ||
|
|
f44785740e | ||
|
|
b2d3692f7f | ||
|
|
b3f4316a19 | ||
|
|
5f89b8ecb6 | ||
|
|
1bd9cb7390 | ||
|
|
35e544cacc | ||
|
|
03e93549f6 | ||
|
|
db7a82d99b | ||
|
|
f1a9a5a14b | ||
|
|
1a9f946edf | ||
|
|
10cf8da3f5 | ||
|
|
8ed9a3d60a | ||
|
|
1c751fc1b7 | ||
|
|
8ddfdaad1a | ||
|
|
f7135427e6 | ||
|
|
a6da885a53 | ||
|
|
5c85f7cfbd | ||
|
|
d423630999 | ||
|
|
a88fce906f | ||
|
|
92560c68e3 | ||
|
|
90e4a1e9f9 | ||
|
|
a043b1bc99 | ||
|
|
b28a9039b5 | ||
|
|
3e699940c5 | ||
|
|
29581c50ca | ||
|
|
c2e0beb5db | ||
|
|
83555feaf9 | ||
|
|
5df4fbbd45 | ||
|
|
4c4ddf0b61 | ||
|
|
06e62e5a3a | ||
|
|
ac6d87d6db | ||
|
|
5701585bc1 | ||
|
|
a3869d058b | ||
|
|
839e02513a | ||
|
|
681300450b | ||
|
|
e0af2b83ef | ||
|
|
3e29a898b0 | ||
|
|
e4636b8221 | ||
|
|
9813a4d54b | ||
|
|
c14b0fe462 | ||
|
|
6882a2a11a | ||
|
|
cb359c5aae | ||
|
|
c1022d8afe | ||
|
|
9ab9a6b7f4 | ||
|
|
46a9b62563 | ||
|
|
c4e476068d | ||
|
|
7c39c355de | ||
|
|
c75197245c | ||
|
|
d76441d564 | ||
|
|
bc93a826e2 | ||
|
|
2edb353650 | ||
|
|
109cdf3250 | ||
|
|
5b399a5ec7 | ||
|
|
dcc7837008 | ||
|
|
4489083254 | ||
|
|
326281b7c5 | ||
|
|
bcdebda846 | ||
|
|
d120d50f7d | ||
|
|
10d152dbc0 | ||
|
|
0bc730de3d | ||
|
|
020d967e03 | ||
|
|
1b8f50ba46 | ||
|
|
590c9b14f6 | ||
|
|
905f03a396 | ||
|
|
a48a65911e | ||
|
|
13334bda08 | ||
|
|
cdbc0055bc | ||
|
|
8e2924815b | ||
|
|
2460f0e61f | ||
|
|
f6e1982c69 | ||
|
|
6e82eb6c87 | ||
|
|
72e3d81ff4 | ||
|
|
abd31650f8 | ||
|
|
bfc1055e4f | ||
|
|
7f2e37ec12 | ||
|
|
c555cb46cc | ||
|
|
6244fa1dc1 | ||
|
|
89daed44af | ||
|
|
7aaa3a2a44 | ||
|
|
afc8b6e49f | ||
|
|
b621840d22 | ||
|
|
8e7140f4aa | ||
|
|
0c0f160b71 | ||
|
|
8a125825cc | ||
|
|
e7a17abced | ||
|
|
b1a0dbba34 | ||
|
|
48bbe3beec | ||
|
|
31bbe6aa48 | ||
|
|
2f973a75eb | ||
|
|
f22dbac329 | ||
|
|
e68e6d8a4c | ||
|
|
22cb47a8c3 | ||
|
|
982974d7f4 | ||
|
|
80288bb1c4 | ||
|
|
0c6b602ae9 | ||
|
|
27f0375e4e | ||
|
|
69cb284982 | ||
|
|
aa72291d2b | ||
|
|
f4113f9963 | ||
|
|
b7113a1a0a | ||
|
|
c70287939d | ||
|
|
c298627c17 | ||
|
|
10eae26bba | ||
|
|
93d792c106 | ||
|
|
946f17d8e3 | ||
|
|
d19588cf21 | ||
|
|
7ee6759948 | ||
|
|
2d1cca2918 | ||
|
|
d16fa3daf7 | ||
|
|
8170f21f5d | ||
|
|
967497641d | ||
|
|
7c682cc394 | ||
|
|
bdf9a89bd9 | ||
|
|
7d47cd7e3f | ||
|
|
cd9700f20e | ||
|
|
083ba34205 | ||
|
|
33f39a94d1 | ||
|
|
129c8f0102 | ||
|
|
006fa97596 | ||
|
|
1dea265e3d | ||
|
|
93f1658b20 | ||
|
|
d7cd95bec3 | ||
|
|
bf6f015563 | ||
|
|
ae96c2177d | ||
|
|
a8f27d1508 | ||
|
|
450b726087 | ||
|
|
2a88cb3d1d | ||
|
|
d350c7d17e | ||
|
|
a608505e94 | ||
|
|
27518c8461 | ||
|
|
13a9b7fd79 | ||
|
|
3c883d874c | ||
|
|
9f6fa2576d | ||
|
|
15cba7b520 | ||
|
|
df534c31b4 | ||
|
|
af28ebb382 | ||
|
|
10bcd34d5d | ||
|
|
a857001f2a | ||
|
|
2e8ef3b202 | ||
|
|
20e2e2ed87 | ||
|
|
0e238f9fae | ||
|
|
95716bd70e | ||
|
|
752105207f | ||
|
|
4cdf3b44ea | ||
|
|
c2ac2095cf | ||
|
|
e9d8896e93 | ||
|
|
a8771652ab | ||
|
|
68a3657169 | ||
|
|
6f04ffb061 | ||
|
|
4fb5ef6c01 | ||
|
|
919ab19eac | ||
|
|
018357c19b | ||
|
|
9c905bf5cf | ||
|
|
2f6b4316ee | ||
|
|
0349270027 | ||
|
|
350d0c35ce | ||
|
|
c184574bea | ||
|
|
7ba4dbef89 | ||
|
|
2fd080aafe | ||
|
|
42d2611e40 | ||
|
|
14271fe457 | ||
|
|
64779236dc | ||
|
|
376397ebdd | ||
|
|
de4952d4d5 | ||
|
|
78b228b657 | ||
|
|
a729face6b | ||
|
|
8a5356e9a5 | ||
|
|
2f839ec297 | ||
|
|
5134245b56 | ||
|
|
109f2e5962 | ||
|
|
a385a39677 | ||
|
|
7fa4fe2b01 | ||
|
|
16c637fc97 | ||
|
|
600edda421 | ||
|
|
7097091e90 | ||
|
|
89dc9e2324 | ||
|
|
515e013fc3 | ||
|
|
b1ba248e43 | ||
|
|
57fba976f8 | ||
|
|
fc6c56bdbd | ||
|
|
6baeb3c2c5 | ||
|
|
2b653dd71a | ||
|
|
e1a151884f | ||
|
|
4db4452b4c | ||
|
|
62ed78c12c | ||
|
|
ce2e7a78ee | ||
|
|
b7736ee3c3 | ||
|
|
b357e24a9e | ||
|
|
7efcacae52 | ||
|
|
ed24030b1c | ||
|
|
64ba34f3ba | ||
|
|
4449b5416e | ||
|
|
a62e72e8be | ||
|
|
4e99f6ca20 | ||
|
|
2804bcdb4d | ||
|
|
d371e61770 | ||
|
|
879512e909 | ||
|
|
6eb95f5fda | ||
|
|
d23bb2d53e | ||
|
|
798c31bd31 | ||
|
|
bb0c75847b | ||
|
|
810b33858b | ||
|
|
403c35edf1 | ||
|
|
adf6e40223 | ||
|
|
8da44a26ab | ||
|
|
8afb9b11ed | ||
|
|
56905b13b1 | ||
|
|
bcd38eff4e | ||
|
|
d9ba8c5658 | ||
|
|
3d89989881 | ||
|
|
d85583ca57 | ||
|
|
8cf0023cf1 | ||
|
|
6867817ae7 | ||
|
|
6fe8f99fc3 | ||
|
|
be52551c9a | ||
|
|
6022483804 | ||
|
|
f64f7c8f91 | ||
|
|
a5a9141f57 | ||
|
|
42abd43078 | ||
|
|
eb278095df | ||
|
|
8752684289 | ||
|
|
eca46e32d3 | ||
|
|
4619e9e77b | ||
|
|
558cbd4bc5 | ||
|
|
397493a7f4 | ||
|
|
a2871ac1dc | ||
|
|
24cea8ad6d | ||
|
|
167da239ef | ||
|
|
be8dc45239 | ||
|
|
6d4c07fdd6 | ||
|
|
9c164918dd | ||
|
|
54defe125e | ||
|
|
45c3e8cac1 | ||
|
|
2523dc6d84 | ||
|
|
8ac003de13 | ||
|
|
b25f2895da | ||
|
|
3f27e1f227 | ||
|
|
d69bf51152 | ||
|
|
6cea25c184 | ||
|
|
e0c60d524c | ||
|
|
9ddb1ee5b6 | ||
|
|
9b1f39d5db | ||
|
|
9d34b83ce0 | ||
|
|
a29282e3d9 | ||
|
|
702a07b5d3 | ||
|
|
6e7588c86c | ||
|
|
a1bb21feca | ||
|
|
b2d9fb3841 | ||
|
|
6132f66a67 | ||
|
|
c93744e8ab | ||
|
|
96ffc3d7bb | ||
|
|
023aae8495 | ||
|
|
edb8b2a149 | ||
|
|
d1c2778dd1 | ||
|
|
f82e9120a1 | ||
|
|
fd81998d3b | ||
|
|
72a69458a9 | ||
|
|
97ff5124bb | ||
|
|
8f406aee76 | ||
|
|
05f18490e5 | ||
|
|
dcc4b3d1d4 | ||
|
|
500b111851 | ||
|
|
1a76c7cd79 | ||
|
|
fa5cb4baa1 | ||
|
|
0efdf788eb | ||
|
|
c9dc403e2c | ||
|
|
b2df8be166 | ||
|
|
ff6f4ea339 | ||
|
|
fae8fc0ef9 | ||
|
|
5f5849b52e | ||
|
|
4c7cd8a140 | ||
|
|
1cb13c09b0 | ||
|
|
ba66e4106b | ||
|
|
f31a46f5d7 | ||
|
|
8974426990 | ||
|
|
708548e7f3 | ||
|
|
a1cb798faa | ||
|
|
7c25db4644 | ||
|
|
cf5c6e540b | ||
|
|
ef81d4f320 | ||
|
|
4e8d143774 | ||
|
|
a7dccc0f36 | ||
|
|
f4198b61c2 | ||
|
|
3fca1d07fa | ||
|
|
ba1523f2fc | ||
|
|
4d97c85495 | ||
|
|
ca83da0350 | ||
|
|
ac1b346019 | ||
|
|
5e5459337c | ||
|
|
28df6f2e41 | ||
|
|
8f0d921e03 | ||
|
|
5cf89dd58a | ||
|
|
f6bf19f11e | ||
|
|
6935081f81 | ||
|
|
46b85d0172 | ||
|
|
9ee1fd25e0 | ||
|
|
0750c99df4 | ||
|
|
98175e4975 | ||
|
|
ddf1c220b7 | ||
|
|
966410f15a | ||
|
|
cbc2804651 | ||
|
|
ab0c17c77c | ||
|
|
ed26fe6fc0 | ||
|
|
65fdd72306 | ||
|
|
7f2d99238c | ||
|
|
ed3d13efd6 | ||
|
|
19ac4fa5ea | ||
|
|
ba44e9653c | ||
|
|
29d19cf763 | ||
|
|
f15c0d622b | ||
|
|
232194d7dd | ||
|
|
fc1bf0d390 | ||
|
|
cd0fc1f75e | ||
|
|
312d7a6ffa | ||
|
|
7a42f6c7bd | ||
|
|
4188a5be19 | ||
|
|
f1176365bf | ||
|
|
653841d791 | ||
|
|
1d10653648 | ||
|
|
2713004e0e | ||
|
|
ae523fc94a | ||
|
|
f63cca2780 | ||
|
|
0925eb1300 | ||
|
|
5945011c2f | ||
|
|
80d94aa198 | ||
|
|
68b5f77e93 | ||
|
|
a785cb0f4d | ||
|
|
4b545f6d9e | ||
|
|
a7f1772341 | ||
|
|
0d7318fba7 | ||
|
|
492077e48d | ||
|
|
b76190c029 | ||
|
|
0655aca616 | ||
|
|
5fcb09b4a2 | ||
|
|
16c72cf4d6 | ||
|
|
7d5ba0044b | ||
|
|
ad21497492 | ||
|
|
94cceedb86 | ||
|
|
739727c4f8 | ||
|
|
73e7a73270 | ||
|
|
95a44eea11 | ||
|
|
7654c38a91 | ||
|
|
2e1be4398f | ||
|
|
84b5de3daf | ||
|
|
bfcac9caa1 | ||
|
|
a6aa1e39fd | ||
|
|
d2ff740653 | ||
|
|
b64f377cfa | ||
|
|
6c7d5c30ef | ||
|
|
9a4773a2f6 | ||
|
|
677da37019 | ||
|
|
de9dbae265 | ||
|
|
cbd2b2770a | ||
|
|
3d0620ccd6 | ||
|
|
65e2a8735f | ||
|
|
693e73da50 | ||
|
|
ab1d4192f2 | ||
|
|
3ee17bcb9c | ||
|
|
51935e8ad1 | ||
|
|
bb49f79c28 | ||
|
|
de21ede19b | ||
|
|
c1d637db2e | ||
|
|
2b43a88142 | ||
|
|
c2680866c5 | ||
|
|
0b5952639d | ||
|
|
2af3a6e098 | ||
|
|
41c56cef86 | ||
|
|
eae19c9b67 | ||
|
|
eabaa5c285 | ||
|
|
b62aecde50 | ||
|
|
34ec400e82 | ||
|
|
7b186b22ec | ||
|
|
8a717aa8ea | ||
|
|
99ab3f1360 | ||
|
|
5360c0129d | ||
|
|
07a2377855 | ||
|
|
07fc210cee | ||
|
|
50fe274301 | ||
|
|
c6dd6826e0 | ||
|
|
6ee80d4c59 | ||
|
|
0a61ee639e | ||
|
|
b1d25cc429 | ||
|
|
d37f10591d | ||
|
|
9c46a49c7e | ||
|
|
6c143e1dca | ||
|
|
13e9af7733 | ||
|
|
feb169f116 | ||
|
|
55e9cc19e2 | ||
|
|
bccfcc96ba | ||
|
|
665fc8b098 | ||
|
|
0ce0db4616 | ||
|
|
8bb0a6880c | ||
|
|
73aecca47a | ||
|
|
45fe28bdae | ||
|
|
5a0e58923d | ||
|
|
7a72828530 | ||
|
|
14c6ed54f3 | ||
|
|
b6dbfd8205 | ||
|
|
ceb5d93254 | ||
|
|
3908dce501 | ||
|
|
c3ffd4f5c2 | ||
|
|
3db02db15a | ||
|
|
2020d20adb | ||
|
|
b652e68843 | ||
|
|
3b6c7e0e0e | ||
|
|
9b397c5c4c | ||
|
|
1a57cf2fe5 | ||
|
|
e30ae8c248 | ||
|
|
a876485305 | ||
|
|
ae8bfff8fb | ||
|
|
969403fc77 | ||
|
|
61326ae9f1 | ||
|
|
6d776c3958 | ||
|
|
9c14ec63ed | ||
|
|
7875c33ae4 | ||
|
|
af974ea653 | ||
|
|
6f3f7093d0 | ||
|
|
19fd3ed29d | ||
|
|
b9059b3b5d | ||
|
|
3639cf91ad | ||
|
|
48f6d4afe6 | ||
|
|
c9438893c0 | ||
|
|
6759e7ac3f | ||
|
|
b149af0aee | ||
|
|
b210b06b26 | ||
|
|
3f03905f4d | ||
|
|
c24c660555 | ||
|
|
b51a06b473 | ||
|
|
f33c3157b3 | ||
|
|
0876c48a72 | ||
|
|
6692855fd8 | ||
|
|
66cc88d393 | ||
|
|
4c9d9c9733 | ||
|
|
aa45a4176b | ||
|
|
f95fbab31c | ||
|
|
846ca4d84b | ||
|
|
48e72dc8ff | ||
|
|
315fc0b972 | ||
|
|
c305aa5d84 | ||
|
|
331e3a2f04 | ||
|
|
a620665c0f | ||
|
|
322a91a936 | ||
|
|
834984b9d8 | ||
|
|
1afe4b750d | ||
|
|
5e49b8b6e1 | ||
|
|
3fe4f99e40 | ||
|
|
9b0d3f24a0 | ||
|
|
ab6be85177 | ||
|
|
435902fea6 | ||
|
|
5e11c91b80 | ||
|
|
e6025ae411 | ||
|
|
017e3ba976 | ||
|
|
5faba0d79f | ||
|
|
e416089190 | ||
|
|
4e74641f19 | ||
|
|
ecd7d4aefb | ||
|
|
8749ae5690 | ||
|
|
9605ab096b | ||
|
|
2a6b98edac | ||
|
|
33c7d4bf6d | ||
|
|
ecef0bd435 | ||
|
|
117b8979c3 | ||
|
|
74ec8311e6 | ||
|
|
ee6d7b83d8 | ||
|
|
d912906d8a | ||
|
|
e380b23c61 | ||
|
|
0dd41b1873 | ||
|
|
46262ebe45 | ||
|
|
5dca91c1a5 | ||
|
|
6532619190 | ||
|
|
62c386c284 | ||
|
|
6f1907c946 | ||
|
|
1010388910 | ||
|
|
0cb8dccd8c | ||
|
|
88d55658f1 | ||
|
|
2e87846c87 | ||
|
|
65182e1f97 | ||
|
|
22f3b24469 | ||
|
|
e032e025c8 | ||
|
|
d54046be01 | ||
|
|
97f10c1db0 | ||
|
|
081dad6404 | ||
|
|
6f6271987a | ||
|
|
ef46a1a499 | ||
|
|
7ed0102ca4 | ||
|
|
6924df744e | ||
|
|
feb28acf65 | ||
|
|
f726e0c7a1 | ||
|
|
649c622876 | ||
|
|
317007be45 | ||
|
|
5ad0f99f42 | ||
|
|
7758c8dd3e | ||
|
|
9bc1e62d02 | ||
|
|
423684a1e2 | ||
|
|
0ceea160b3 | ||
|
|
685c4d93a9 | ||
|
|
a0defe2c03 | ||
|
|
b4e656c7d7 | ||
|
|
62fdb6f77b | ||
|
|
de12cfb9cd | ||
|
|
14ea9e4ad6 | ||
|
|
b2e0cf72ac | ||
|
|
7759847400 | ||
|
|
0bbb86d954 | ||
|
|
6e7d9be234 | ||
|
|
3fd25a0568 | ||
|
|
9ef463ac62 | ||
|
|
6ef4e361c4 | ||
|
|
e66e0fd94e | ||
|
|
d2246ad677 | ||
|
|
9db9cca4be | ||
|
|
285fbf217b | ||
|
|
c805359720 | ||
|
|
b75bf8537f | ||
|
|
beebd67962 | ||
|
|
768dcfb610 | ||
|
|
54b3c501e3 | ||
|
|
442b609c0c | ||
|
|
0ecbbf8065 | ||
|
|
dab92fdda3 | ||
|
|
2e1f2f7b77 | ||
|
|
a4d020d6fd | ||
|
|
b79105c92c | ||
|
|
07bc92239e | ||
|
|
a1f23fe966 | ||
|
|
64a16a0c1f | ||
|
|
8b2c0adbf4 | ||
|
|
38e27aa014 | ||
|
|
35e60c14d2 | ||
|
|
13c4d56d90 | ||
|
|
3c7a2cef98 | ||
|
|
0f772a4aeb | ||
|
|
33109bee85 | ||
|
|
d06efda5c9 | ||
|
|
90557c8fcb | ||
|
|
de8e430eda | ||
|
|
f94c73d319 | ||
|
|
d2a5d590ea | ||
|
|
a676b835ca | ||
|
|
cb558fe936 | ||
|
|
5c38bfa069 | ||
|
|
70b54a939f | ||
|
|
3d2272e26c | ||
|
|
080b2d7eb8 | ||
|
|
561cfca21d | ||
|
|
d2377e9b2f | ||
|
|
ca7d1830c9 | ||
|
|
77a854a5d0 | ||
|
|
7ac0169515 | ||
|
|
12ee366504 | ||
|
|
978d6a4344 | ||
|
|
aa7548749b | ||
|
|
b20607c8ac | ||
|
|
888146ee64 | ||
|
|
d19e123d2e | ||
|
|
20cc786878 | ||
|
|
4c3393249d | ||
|
|
5ed7161763 | ||
|
|
12b54f1e1c | ||
|
|
cfdf78e4b2 | ||
|
|
0f7d792894 | ||
|
|
bcbe79a898 | ||
|
|
da684f98dd | ||
|
|
7de3711614 | ||
|
|
b57dd2989a | ||
|
|
ffad697bfc | ||
|
|
4fcbc82af9 | ||
|
|
9ad7a0dd87 | ||
|
|
bc34fec50f | ||
|
|
576061fcdd | ||
|
|
9ac3468690 | ||
|
|
4ab82178fc | ||
|
|
513b93949e | ||
|
|
20d2002576 | ||
|
|
3eb4cfd3a8 | ||
|
|
3700f4871a | ||
|
|
7b86fce6bf | ||
|
|
7c57c6bda7 | ||
|
|
e0944e5e34 | ||
|
|
b06627f863 | ||
|
|
86de19dfe2 | ||
|
|
5733a40910 | ||
|
|
e5439af179 | ||
|
|
36dd12da3d | ||
|
|
b58717436d | ||
|
|
4706be7012 | ||
|
|
46b87fe955 | ||
|
|
c949b2780a | ||
|
|
6cbad988fe | ||
|
|
a6d2905c0b | ||
|
|
94d359b8c8 | ||
|
|
0942c3a5b1 | ||
|
|
ceed742ca9 | ||
|
|
2ef4234a42 | ||
|
|
d521454862 | ||
|
|
4fe9c4975b | ||
|
|
9f314ceba2 | ||
|
|
37bea96e95 | ||
|
|
ef2dff063c | ||
|
|
4e1e2ccc6a | ||
|
|
e6b1b7c105 | ||
|
|
563f05658d | ||
|
|
96c40785a8 | ||
|
|
f72a8100af | ||
|
|
77986883fc | ||
|
|
9fb879e013 | ||
|
|
5903156c38 | ||
|
|
a3118619ed | ||
|
|
2fe38e7a28 | ||
|
|
ebf093a744 | ||
|
|
bf9c3a5a8a | ||
|
|
78cb4b5923 | ||
|
|
b8cba87532 | ||
|
|
fff7df4697 | ||
|
|
bb7368c08a | ||
|
|
c47f4f813a | ||
|
|
96f6484503 | ||
|
|
2576ebcac1 | ||
|
|
1a35609773 | ||
|
|
fc5fb473dd | ||
|
|
645aca52db | ||
|
|
e7eb0075ae | ||
|
|
6cd7320ecc | ||
|
|
87f67acf33 | ||
|
|
39211200ab | ||
|
|
4e59a6178c | ||
|
|
d573508c8d | ||
|
|
d8717a0654 | ||
|
|
c0b0369626 | ||
|
|
f959c5e516 | ||
|
|
c15a10fae7 | ||
|
|
320171eea5 | ||
|
|
b746cf65db | ||
|
|
52fed32251 | ||
|
|
cf59ba461d | ||
|
|
cf5ffb4294 | ||
|
|
504d9a151b | ||
|
|
d144391393 | ||
|
|
eec3738e70 | ||
|
|
6e8de07c77 | ||
|
|
58d8709534 | ||
|
|
745f5c7a24 | ||
|
|
ac30503a3d | ||
|
|
420148de92 | ||
|
|
e2960f4737 | ||
|
|
7230d454a8 | ||
|
|
7585aa33b6 | ||
|
|
0654a1eabd | ||
|
|
c71b7a6c27 | ||
|
|
0a121b7f73 | ||
|
|
f0fe6723d8 | ||
|
|
a12e9edb76 | ||
|
|
1f61946f97 | ||
|
|
a944cadfe6 | ||
|
|
e649fa9b9c | ||
|
|
add730aa60 | ||
|
|
f730a16ffa | ||
|
|
701fd16328 | ||
|
|
535c0ff4a7 | ||
|
|
74a8bfa5da | ||
|
|
d427949252 | ||
|
|
ca97e43e2c | ||
|
|
beedfb6ab5 | ||
|
|
3ff15fe156 | ||
|
|
21ee98ceb0 | ||
|
|
8034c67651 | ||
|
|
22783c6c61 | ||
|
|
b3f77519d2 | ||
|
|
6aa7b5da2a | ||
|
|
ee513872b2 | ||
|
|
98756c7650 | ||
|
|
bfd30bb6b1 | ||
|
|
9b88aaa8a0 | ||
|
|
78986bc14d | ||
|
|
86ec11849b | ||
|
|
09a5933b8b | ||
|
|
b81a2202f3 | ||
|
|
ca4941da7e | ||
|
|
d60c9517b2 | ||
|
|
8ebaee6fc6 | ||
|
|
5a614e97b7 | ||
|
|
96c7ab501c | ||
|
|
b28b5ff17e | ||
|
|
b1cf39c8ac | ||
|
|
f90b24bbac | ||
|
|
5080915be4 | ||
|
|
ffa3b2b785 | ||
|
|
dc3efc8190 | ||
|
|
994f8983ee | ||
|
|
d3e119128a | ||
|
|
8b2c70a20b | ||
|
|
790c42475a | ||
|
|
ee6a9f0b82 | ||
|
|
52c0dd1aa9 | ||
|
|
074a5ca7d9 | ||
|
|
f09761f906 | ||
|
|
9caf20b738 | ||
|
|
65aed337d1 | ||
|
|
39ceac9bef | ||
|
|
d4c9ceb85c | ||
|
|
eb6e655de9 | ||
|
|
7056d85988 | ||
|
|
1a184b57f4 | ||
|
|
7fb95eef35 | ||
|
|
f7041019d4 | ||
|
|
cd61b46c6c | ||
|
|
e1b52b6e75 | ||
|
|
cb90a6dc49 | ||
|
|
9840bba436 | ||
|
|
682312da6e | ||
|
|
a3e7961165 | ||
|
|
3b8222825e | ||
|
|
1f3705551b | ||
|
|
74c84ab5e2 | ||
|
|
e142e98088 | ||
|
|
a67ce05e95 | ||
|
|
3995de090c | ||
|
|
4dc05ce25c | ||
|
|
038424e294 | ||
|
|
6a8bc829bd | ||
|
|
547de1fc2c | ||
|
|
9e9bf76e2b | ||
|
|
2fac60383c | ||
|
|
e027784063 | ||
|
|
4817f5aef0 | ||
|
|
f7e955e696 | ||
|
|
0694d0af20 | ||
|
|
446fb980d6 | ||
|
|
4e72e12c04 | ||
|
|
152aaca252 | ||
|
|
37a0278509 | ||
|
|
dfa8600b03 | ||
|
|
e4d23ef9fe | ||
|
|
62941962ad | ||
|
|
c83f4c36e4 | ||
|
|
c023908dec | ||
|
|
9fba55f907 | ||
|
|
5032593b81 | ||
|
|
0ff90a634e | ||
|
|
16aae25386 | ||
|
|
9ebbf9ee1e | ||
|
|
66fb0456d0 | ||
|
|
7ef9a4368f | ||
|
|
1022d0348b | ||
|
|
7eeb08e07b | ||
|
|
1abda590d7 | ||
|
|
0bf72a77a9 | ||
|
|
cbc2180a18 | ||
|
|
a7283e498b | ||
|
|
f4ce92135d | ||
|
|
b933c0da66 | ||
|
|
2e4f6deb2e | ||
|
|
3682c0bfdb | ||
|
|
dbced66545 | ||
|
|
632d1d4b07 | ||
|
|
cfecf41d04 | ||
|
|
bd021c16bb | ||
|
|
564e39023b | ||
|
|
52bb685697 | ||
|
|
f50a1a888e | ||
|
|
f2f67aac28 | ||
|
|
ca4ed5ec02 | ||
|
|
a2c8a5fdd7 | ||
|
|
2a88053fee | ||
|
|
b817ba40e8 | ||
|
|
fb6d960075 | ||
|
|
0068491f9f | ||
|
|
00a2a19131 | ||
|
|
881efdfe84 | ||
|
|
da43a31ed2 | ||
|
|
3e767d9cb5 | ||
|
|
c2085d91af | ||
|
|
800a89c24b | ||
|
|
e9660f94a9 | ||
|
|
936628a9c4 | ||
|
|
f402610023 | ||
|
|
82752a818c | ||
|
|
1f9e7e4fd9 | ||
|
|
561b4c3ab7 | ||
|
|
566d1c87be | ||
|
|
cb423adc88 | ||
|
|
113ccca343 | ||
|
|
378591608d | ||
|
|
3af2e191c9 | ||
|
|
8873559812 | ||
|
|
acb3abbb69 | ||
|
|
444b23eafe | ||
|
|
14b3ad1b5d | ||
|
|
d29edda3a9 | ||
|
|
b90ea4de2b | ||
|
|
6952b1a3ff | ||
|
|
d26ddbf9f4 | ||
|
|
6233bef9f3 | ||
|
|
88347d96fc | ||
|
|
ef22d23d03 | ||
|
|
fadc8157cd | ||
|
|
a96df6bd67 | ||
|
|
08bfa983e8 | ||
|
|
96ee127c5d | ||
|
|
f0c204a1c3 | ||
|
|
dce04b808b | ||
|
|
0b6a02c743 | ||
|
|
e5917f5b38 | ||
|
|
0926d5b9a9 | ||
|
|
64913f6783 | ||
|
|
356d1d6fac | ||
|
|
e934885a00 | ||
|
|
a3440c96d4 | ||
|
|
fe428495d4 | ||
|
|
33c1b7dc0f | ||
|
|
94e82bba56 | ||
|
|
ef6d71a488 | ||
|
|
b19c31ecf5 | ||
|
|
c250d535a6 | ||
|
|
c37d0ada3c | ||
|
|
82fe2b67c9 | ||
|
|
0c891a3753 | ||
|
|
bb8d728ece | ||
|
|
13bff10cf8 | ||
|
|
43f584ff55 | ||
|
|
46801aff6b | ||
|
|
9a0f0c125d | ||
|
|
3e89264230 | ||
|
|
430c6793b5 | ||
|
|
da8246b56d | ||
|
|
923d4109ca | ||
|
|
726d79e2e2 | ||
|
|
16e62184a8 | ||
|
|
ed41edc22d | ||
|
|
a8fefe3dba | ||
|
|
0447345da8 | ||
|
|
d177a1ed87 | ||
|
|
370b13af6d | ||
|
|
5259bef98d | ||
|
|
da8cc6cf3d | ||
|
|
b0d6b2e32c | ||
|
|
11aab0888c | ||
|
|
daffc2a319 | ||
|
|
5f90f16cfa | ||
|
|
b3c24de464 | ||
|
|
229d50d8d2 | ||
|
|
2de3d52595 | ||
|
|
b97dccbb7d | ||
|
|
c8c7b7060d | ||
|
|
dd1f51a87c | ||
|
|
90976ca700 | ||
|
|
b4bd688db8 | ||
|
|
2f4f2e8e50 | ||
|
|
cdb735e3a3 | ||
|
|
1812454f54 | ||
|
|
7f3d9127e3 | ||
|
|
460ba24080 | ||
|
|
cd67ad587c | ||
|
|
65a95628e9 | ||
|
|
be79907577 | ||
|
|
7ae82725e9 | ||
|
|
c132d2c2bf | ||
|
|
1fa64b85db | ||
|
|
f1886ec99c | ||
|
|
126fb76ff3 | ||
|
|
425c96f323 | ||
|
|
fc3795bf75 | ||
|
|
0eb66566fb | ||
|
|
d22bb54ac6 | ||
|
|
b115f926b5 | ||
|
|
f09feabb5f | ||
|
|
139276ab34 | ||
|
|
4b9a86f644 | ||
|
|
0335c82f28 | ||
|
|
8b4802b4e1 | ||
|
|
854b412575 | ||
|
|
8c046b02e2 | ||
|
|
b27254d695 | ||
|
|
02c4898680 | ||
|
|
e24311b20e | ||
|
|
95c3f619af | ||
|
|
42d0fddf37 | ||
|
|
4ea7f2af2e | ||
|
|
0e3cae850d | ||
|
|
07741c9443 | ||
|
|
73010c0156 | ||
|
|
8bf1498742 | ||
|
|
efdc770d3b | ||
|
|
9eadf04e3b | ||
|
|
3da864c192 | ||
|
|
330c5043b8 | ||
|
|
fe4910eb8c | ||
|
|
97c15da679 | ||
|
|
40ea972180 | ||
|
|
e9e6eaa0e6 | ||
|
|
37accc0818 | ||
|
|
e7a81b3255 | ||
|
|
7f69da3e7d | ||
|
|
70d8dee348 | ||
|
|
c2d3e34f6b | ||
|
|
1db9e4fb91 | ||
|
|
88f7c493a6 | ||
|
|
be0a762ddf | ||
|
|
63e3f9d1a4 | ||
|
|
19bbaa133e | ||
|
|
0bf51ab8e9 | ||
|
|
410b1e5be5 | ||
|
|
13f7f882a8 | ||
|
|
dc095616dc | ||
|
|
4ef6efdc5d | ||
|
|
0d342552d3 | ||
|
|
b42aae2eb9 | ||
|
|
453b71bc7a | ||
|
|
c4c63aed53 | ||
|
|
40b475b554 | ||
|
|
467ac55faa | ||
|
|
b2881f3f9c | ||
|
|
c6d02446f1 | ||
|
|
ccd80af38d | ||
|
|
c9f82b1b85 | ||
|
|
f8f4b58d24 | ||
|
|
d1301c3004 | ||
|
|
78b4a8d768 | ||
|
|
537c640771 | ||
|
|
d76430c6d7 | ||
|
|
b97f01d4d4 | ||
|
|
9059a6d14f | ||
|
|
b8f66623da | ||
|
|
1a1c8f2547 | ||
|
|
0fc75a5305 | ||
|
|
f4238302a5 | ||
|
|
ba2a6c682e | ||
|
|
02abbfcc64 | ||
|
|
4a0f1b5c41 | ||
|
|
738fb50ce9 | ||
|
|
c591450261 | ||
|
|
64396b3a4f | ||
|
|
9e1c190c0b | ||
|
|
7b8c1c6eb7 | ||
|
|
9a5b8cb4e7 | ||
|
|
2793ea9952 | ||
|
|
3067d137cb | ||
|
|
825d9f2198 | ||
|
|
b41c2c08fc | ||
|
|
1f4825dd05 | ||
|
|
4f760040bc | ||
|
|
5391152408 | ||
|
|
815857404d | ||
|
|
239a73219e | ||
|
|
b7787e0ee5 | ||
|
|
14fce6ebac | ||
|
|
16a530a9d4 | ||
|
|
f4bc398f9e | ||
|
|
841f5e5f3d | ||
|
|
ee80f9c4d2 | ||
|
|
50c42fbc4b | ||
|
|
76170820bb | ||
|
|
b5083d16b5 | ||
|
|
6927f1f955 | ||
|
|
a3b70aba22 | ||
|
|
1fb8db8496 | ||
|
|
201e7f1e2e | ||
|
|
245190ca70 | ||
|
|
23ebf3d19b | ||
|
|
5c699ed892 | ||
|
|
2da412890e | ||
|
|
b47db3ae04 | ||
|
|
660a05f39d | ||
|
|
1f1b860715 | ||
|
|
bc318f7a18 | ||
|
|
87e8ee4d46 | ||
|
|
de5eda5477 | ||
|
|
0738a82372 | ||
|
|
c3ca5b472f | ||
|
|
4008c63e12 | ||
|
|
f5a5328620 | ||
|
|
48d7f754be | ||
|
|
f1ffdf425e | ||
|
|
fac578f631 | ||
|
|
f7df5e9494 | ||
|
|
aeea88395a | ||
|
|
8cc0ac4083 | ||
|
|
ba2e824ec6 | ||
|
|
3aabe7eb75 | ||
|
|
b3c345fd11 | ||
|
|
9ddc0c7eec | ||
|
|
6a25a4add4 | ||
|
|
b339965287 | ||
|
|
800d6ae02e | ||
|
|
f441d34222 | ||
|
|
57001ef13e | ||
|
|
19df05e956 | ||
|
|
9f20d50a79 | ||
|
|
d8052c4bab | ||
|
|
4aca9a2306 | ||
|
|
5729e04cb5 | ||
|
|
d0997c272d | ||
|
|
eb27cd53bc | ||
|
|
afaf2fd4b4 | ||
|
|
e264614a2e | ||
|
|
de439ff8ea | ||
|
|
37df471d60 | ||
|
|
98b61f1b50 | ||
|
|
65648bca9b | ||
|
|
e7fd77bcee | ||
|
|
27f93b9d98 | ||
|
|
a77a009c3a | ||
|
|
94d4244cd1 | ||
|
|
c2b9f1f009 | ||
|
|
7c887bf546 | ||
|
|
05535344c2 | ||
|
|
0caea46619 | ||
|
|
d385dee368 | ||
|
|
c49439bdc7 | ||
|
|
b5f1e7180c | ||
|
|
29324c4302 | ||
|
|
b88ef13772 | ||
|
|
b7b0c02589 | ||
|
|
f0e07b7b28 | ||
|
|
735b4a6584 | ||
|
|
120e77b44b | ||
|
|
ac27cd2f00 | ||
|
|
002e62aa19 | ||
|
|
4b9bbd0540 | ||
|
|
b474db07e3 | ||
|
|
9a6e070799 | ||
|
|
e0997a387b | ||
|
|
02797b5571 | ||
|
|
de8f6af086 | ||
|
|
e3887f7b77 | ||
|
|
98c06a1140 | ||
|
|
2e9573b6e9 | ||
|
|
fd5b972281 | ||
|
|
30e32ac133 | ||
|
|
1a7d23d7dc | ||
|
|
34f4e474fd | ||
|
|
c546976329 | ||
|
|
fe4c2685d7 | ||
|
|
1b7e71e3bf | ||
|
|
0ab5deba05 | ||
|
|
dd4bcb8ef4 | ||
|
|
796bf25e6f | ||
|
|
f136e6e2aa | ||
|
|
bad4e91aee | ||
|
|
48d76ad6d4 | ||
|
|
4d248cab54 | ||
|
|
df3022353c | ||
|
|
48a8f2fa1a | ||
|
|
5304271782 | ||
|
|
3701aba7fa | ||
|
|
ef962d7ed2 | ||
|
|
9d03b4de54 | ||
|
|
6bbf26a9a9 | ||
|
|
392435e6fb | ||
|
|
8b445165df | ||
|
|
ba28a426e6 | ||
|
|
aa5fa6d275 | ||
|
|
057f2edf43 | ||
|
|
6d8de2efec | ||
|
|
0c65e2d20c | ||
|
|
2a5c27355b | ||
|
|
cad93526ce | ||
|
|
4cfe60c2a8 | ||
|
|
10a7535242 | ||
|
|
489cd02192 | ||
|
|
089098c58f | ||
|
|
57e5d32567 | ||
|
|
9adcafc343 | ||
|
|
cf068bc13f | ||
|
|
7579428087 | ||
|
|
5ca2ed6212 | ||
|
|
11494549b9 | ||
|
|
77423ec5a8 | ||
|
|
be2c691909 | ||
|
|
8fb445edaf | ||
|
|
f5cdcc5399 | ||
|
|
fada17bb78 | ||
|
|
5c90256a3d | ||
|
|
611a0e28a3 | ||
|
|
8ea2efb632 | ||
|
|
f71de37f0f | ||
|
|
d4b2a61318 | ||
|
|
fd1f5c28df | ||
|
|
1e08ee9bd6 | ||
|
|
08ac52b279 | ||
|
|
7b52463ce6 | ||
|
|
e79364ef93 | ||
|
|
de4b08606a | ||
|
|
21b655b074 | ||
|
|
48120ac6ab | ||
|
|
5c360bdc68 | ||
|
|
de267299e7 | ||
|
|
d0139dfde3 | ||
|
|
7115c2f832 | ||
|
|
85135711de | ||
|
|
8c5c495633 | ||
|
|
fdcf27a5fa | ||
|
|
7523b02e62 | ||
|
|
3ca234f8ae | ||
|
|
2848692d79 | ||
|
|
d6f73e1f06 | ||
|
|
0dbf9c544a | ||
|
|
4fdf382ca3 | ||
|
|
ca943ab6ef | ||
|
|
41a66823e5 | ||
|
|
a6206420b5 | ||
|
|
1ebe99ede1 | ||
|
|
aaa0149bc8 | ||
|
|
4cb704a6c3 | ||
|
|
411b3ce23d | ||
|
|
1b0f91d4f2 | ||
|
|
3f1baae10c | ||
|
|
a91643694b | ||
|
|
3bd8507889 | ||
|
|
f97a283175 | ||
|
|
3b02b62a29 | ||
|
|
25f8a9dc4b | ||
|
|
860bd0f834 | ||
|
|
6bede726f8 | ||
|
|
f045d2ee7c | ||
|
|
51c4d7d746 | ||
|
|
f340cbce3a | ||
|
|
16bcfdcb15 | ||
|
|
11ef80c3e0 | ||
|
|
4d2562eaac | ||
|
|
5a1a1a97f1 | ||
|
|
035f27f887 | ||
|
|
f1db1236f1 | ||
|
|
790420df0d | ||
|
|
6999f615c8 | ||
|
|
78a6eecf2e | ||
|
|
c9a96831d8 | ||
|
|
e6cfcd3151 | ||
|
|
4fda116759 | ||
|
|
3c2902d5ea | ||
|
|
b9bd644e0a | ||
|
|
93ab41c2da | ||
|
|
87541a3291 | ||
|
|
46646e09d1 | ||
|
|
a206b9ddaf | ||
|
|
76f52ce404 | ||
|
|
afc13bd1d3 | ||
|
|
4469fc75cd | ||
|
|
8428e8571b | ||
|
|
b640303143 | ||
|
|
7456c32fbb | ||
|
|
a8ddc664d4 | ||
|
|
be3345d34f | ||
|
|
d9677a13ea | ||
|
|
d3d44463b7 | ||
|
|
6f63ea5128 | ||
|
|
48740f4a1d | ||
|
|
5224547446 | ||
|
|
feb4f239e3 | ||
|
|
164804d484 | ||
|
|
162928f4d6 | ||
|
|
4c24fe48ed | ||
|
|
5bf145114d | ||
|
|
39669395ae | ||
|
|
f5a5979f74 | ||
|
|
476f7f985d | ||
|
|
42d20e9434 | ||
|
|
9adb713d07 | ||
|
|
513d66dfb4 | ||
|
|
537c2cb0e4 | ||
|
|
ddda31b2af | ||
|
|
c5d1bc1988 | ||
|
|
44a89836d5 | ||
|
|
878dbc8393 | ||
|
|
d625419219 | ||
|
|
3032770580 | ||
|
|
742ff3feff | ||
|
|
df0607ec90 | ||
|
|
d83a49743c | ||
|
|
66762b2c46 | ||
|
|
79c761206d | ||
|
|
f04647f348 | ||
|
|
0f81113225 | ||
|
|
169c09db16 | ||
|
|
306bb6533d | ||
|
|
210e90cb96 | ||
|
|
74e53f362b | ||
|
|
947cb7f51f | ||
|
|
f88ca81ff5 | ||
|
|
42cd9ac14b | ||
|
|
b7520145bb | ||
|
|
209af696b2 | ||
|
|
3965fdd1c6 | ||
|
|
03589b9c39 | ||
|
|
a3337df4da | ||
|
|
acf7f9a27a | ||
|
|
8082e1b244 | ||
|
|
689e2cc534 | ||
|
|
d37f911d3f | ||
|
|
9345115869 | ||
|
|
7ae8b203b6 | ||
|
|
56c16f2922 | ||
|
|
7e47e3ae59 | ||
|
|
9eef89d1b0 | ||
|
|
2b3d81c9a0 | ||
|
|
876b02b81f | ||
|
|
8028290051 | ||
|
|
78252d3452 | ||
|
|
9aa77400d5 | ||
|
|
c7850cef56 | ||
|
|
783b8a11c1 | ||
|
|
3746d3bfb0 | ||
|
|
5d592f724d | ||
|
|
d288031a83 | ||
|
|
41a39ff02b | ||
|
|
0bad69a7cb | ||
|
|
74e6145d2f | ||
|
|
c344832c8c | ||
|
|
a9caf59ce1 | ||
|
|
770a2e215a | ||
|
|
28d99deb48 | ||
|
|
23ac80fbd6 | ||
|
|
9a5ddfbccb | ||
|
|
50bbf7d9aa | ||
|
|
2aab5ae0ff | ||
|
|
1bbc51a885 | ||
|
|
f95c3621d4 | ||
|
|
f05cbba109 | ||
|
|
16968f9204 | ||
|
|
8985f3ebdd | ||
|
|
d60c246bbb | ||
|
|
3b29fe47bb | ||
|
|
3093f72ce5 | ||
|
|
55dcf3f091 | ||
|
|
2924b6958d | ||
|
|
927310c7c6 | ||
|
|
0c25891790 | ||
|
|
212c06057f | ||
|
|
9c3b3e9256 | ||
|
|
6dc853b41e | ||
|
|
7afd09dfa9 | ||
|
|
6855508eaa | ||
|
|
2925c29671 | ||
|
|
506e68e8a3 | ||
|
|
9cc30152f8 | ||
|
|
267c9d8031 | ||
|
|
bd68b83b6c | ||
|
|
71bf6ce57b | ||
|
|
c1f8039672 | ||
|
|
f3b4ddee25 | ||
|
|
2f4fb66ff0 | ||
|
|
5a7905d5e0 | ||
|
|
672d1ce0c0 | ||
|
|
17002ddf94 | ||
|
|
2618168737 | ||
|
|
e6e572922f | ||
|
|
6a7e883299 | ||
|
|
d1a264f7c7 | ||
|
|
295f4eab68 | ||
|
|
e72320f12f | ||
|
|
dc77e9733b | ||
|
|
7864fe3740 | ||
|
|
ba03b01cc0 | ||
|
|
97d299b863 | ||
|
|
e85f31dadf | ||
|
|
c54ed630f9 | ||
|
|
5122d2f7fa |
34
.gitea/workflows/updateDomains.yaml
Normal file
34
.gitea/workflows/updateDomains.yaml
Normal file
@@ -0,0 +1,34 @@
|
||||
name: Update channel domains
|
||||
on:
|
||||
workflow_dispatch:
|
||||
schedule:
|
||||
- cron: '30 17 * * *'
|
||||
push:
|
||||
branches:
|
||||
- master
|
||||
|
||||
jobs:
|
||||
update:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
# Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
|
||||
- uses: actions/checkout@v2
|
||||
|
||||
- name: Set up Python ${{ matrix.python-version }}
|
||||
uses: actions/setup-python@v2
|
||||
with:
|
||||
python-version: '3.7'
|
||||
architecture: 'x64'
|
||||
|
||||
- name: Install dependencies
|
||||
run: pip install requests
|
||||
|
||||
- name: Update domains
|
||||
run: python tools/updateDomains.py
|
||||
|
||||
- name: Commit & Push changes
|
||||
uses: actions-js/push@master
|
||||
with:
|
||||
message: "Aggiornamento domini"
|
||||
branch: "master"
|
||||
github_token: ${{ secrets.API_TOKEN_GITHUB }}
|
||||
21
.github/ISSUE_TEMPLATE/canale-non-funzionante.md
vendored
Executable file
21
.github/ISSUE_TEMPLATE/canale-non-funzionante.md
vendored
Executable file
@@ -0,0 +1,21 @@
|
||||
---
|
||||
name: Segnala Problemi ad un Canale
|
||||
about: Invio segnalazione per un canale non funzionante
|
||||
title: 'Inserisci il nome del canale'
|
||||
labels: Problema Canale
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
**Per poter scrivere o allegare file nella pagina devi:**
|
||||
- cliccare sui [ ... ] in alto a destra della scheda
|
||||
- Edit. Da questo momento puoi scrivere e/o inviare file.
|
||||
|
||||
|
||||
Inserisci il nome del canale
|
||||
|
||||
|
||||
- Indica il tipo di problema riscontrato, sii il più esauriente possibile. Che azione ha portato all'errore (Es. non riesco ad aggiungere film nella videoteca, ne dal menu contestuale, ne dalla voce in fondo alla lista dei server)
|
||||
|
||||
- Ottieni il log seguendo le istruzioni: https://telegra.ph/LOG-11-20 e invialo qui.
|
||||
|
||||
19
.github/ISSUE_TEMPLATE/server-non-funzionante.md
vendored
Executable file
19
.github/ISSUE_TEMPLATE/server-non-funzionante.md
vendored
Executable file
@@ -0,0 +1,19 @@
|
||||
---
|
||||
name: Segnala Problemi ad un Server
|
||||
about: Invio segnalazione per un server non funzionante
|
||||
title: 'Inserisci il nome del server'
|
||||
labels: Problema Server
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
**Per poter scrivere o allegare file nella pagina devi:**
|
||||
- cliccare sui [ ... ] in alto a destra della scheda
|
||||
- Edit. Da questo momento puoi scrivere e/o inviare file.
|
||||
|
||||
|
||||
Inserisci il nome del server che indica problemi e se il problema è circoscritto ad un solo canale, indicalo
|
||||
|
||||
|
||||
- Allega il file di log nella sua completezza. Non cancellarne delle parti.
|
||||
|
||||
286
.github/ISSUE_TEMPLATE/test-canale.md
vendored
Executable file
286
.github/ISSUE_TEMPLATE/test-canale.md
vendored
Executable file
@@ -0,0 +1,286 @@
|
||||
---
|
||||
name: Test Canale
|
||||
about: Pagina per il test di un canale
|
||||
title: ''
|
||||
labels: Test Canale
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
Documento Template per il Test del canale
|
||||
|
||||
Specifica, dove possibile, il tipo di problema che incontri, anche se non è presente alcuna voce per indicarlo.
|
||||
Se hai **suggerimenti/consigli/dubbi sul test**...Proponili e/o Chiedi! Scrivendo un commento a questo stesso issue, che trovi in fondo, dopo questa pagina.
|
||||
|
||||
**Avvertenze:**
|
||||
|
||||
Per il test dei canali **DEVI**:
|
||||
- utilizzare la versione **[BETA](https://kodiondemand.github.io/repo/KoD-installer-BETA.zip)** di KOD!
|
||||
- **ABILITARE IL DEBUG PER I LOG**
|
||||
|
||||
**Per eseguire il test, ricordati di titolarlo con il nome del canale da te scelto, e salvare la pagina cliccando sul bottone verde in basso "SUBMIT NEW ISSUE"**
|
||||
|
||||
**Ogni volta che hai un ERRORE con avviso di LOG. Puoi scegliere se:
|
||||
ALLEGARE IMMEDIATAMENTE il file kodi.log nel punto, della pagina, in cui sei nel test
|
||||
Allegare il file kodi.log a fine pagina.**
|
||||
|
||||
**Per poter scrivere o allegare file nella pagina devi:**
|
||||
- cliccare sui [ ... ] in alto a destra della scheda
|
||||
- Edit. Da questo momento puoi scrivere e/o inviare file.
|
||||
Dopodiché clicca sul bottone verde "Update comment" per continuare il test nel modo consueto o per terminarlo!
|
||||
|
||||
Se hai problemi non previsti dal test, segnalali aggiungendoli in fondo al test.
|
||||
|
||||
**SE VEDI I QUADRATINI MA NON RIESCI A CLICCARLI... DEVI CLICCARE SUL BOTTONE VERDE "SUBMIT NEW ISSUE"**
|
||||
|
||||
***
|
||||
I file relativi al canale li trovi:
|
||||
- su browser:
|
||||
[Apre la pagina dei Canali](https://github.com/kodiondemand/addon/tree/master/channels)
|
||||
- sul device:
|
||||
[nella specifica cartella](https://github.com/kodiondemand/addon/wiki/Percorsi-sui-diversi-S.O.) , .kodi/addons/channels.
|
||||
Per aprirli non servono programmi particolari un semplice editor di testo è sufficiente.
|
||||
|
||||
**Test N.1**: Controllo del file .json
|
||||
|
||||
Occorrente: file .json
|
||||
|
||||
**1. Indica la coerenza delle voci presenti in "language" con i contenuti presenti sul sito:**
|
||||
valori: ita, sub-ita (sub-ita)
|
||||
|
||||
- [ ] coerenti
|
||||
- [ ] non coerenti
|
||||
|
||||
Se non sono coerenti il test è FALLITO, continua comunque a revisionare il resto
|
||||
|
||||
**2. Icone del canale**
|
||||
Controlla sia presente qualcosa, tra le " " di thumbnail e banner, e che le immagini appaiano su KoD
|
||||
|
||||
**in thumbnail:**
|
||||
- [ ] Presente
|
||||
- [ ] Assente
|
||||
|
||||
**in banner:**
|
||||
- [ ] Presente
|
||||
- [ ] Assente
|
||||
|
||||
**3. Verifica la coerenza delle voci presenti in "categories" con i contenuti presenti sul sito:**
|
||||
|
||||
Riepilogo voci:
|
||||
|
||||
movie, tvshow, anime, documentary, vos, adult
|
||||
|
||||
(se il sito contiene film e serie, devono esserci sia movie che tvshow, se contiene solo film, solo movie)
|
||||
|
||||
- [ ] Corrette
|
||||
- [ ] 1 o più Errata/e
|
||||
- [ ] Assenti - Non sono presenti voci in categories, in questo caso non puoi continuare il test.
|
||||
|
||||
Se le voci sono: Assenti, dopo aver compilato la risposta, salva il test e **NON** proseguire.
|
||||
**TEST FALLITO**
|
||||
|
||||
***
|
||||
|
||||
**Test su KOD.**
|
||||
|
||||
Entra in KOD -> Canali. Nella lista accedi al canale che stai testando.
|
||||
**N.B.**: Il nome del canale è il campo **name** nel file .json.
|
||||
|
||||
**Test N.2: Pagina Canale**
|
||||
|
||||
**1. Cerca o Cerca Film...**
|
||||
Cerca un titolo a caso in KOD e lo stesso titolo sul sito. Confronta i risultati.
|
||||
|
||||
- [ ] OK
|
||||
- indica il tipo di problema
|
||||
|
||||
**Sezione FILM (se il sito non ha film elimina questa parte)**
|
||||
|
||||
**TestN.3: Pagina dei Titoli**
|
||||
*Test da effettuare mentre sei dentro un menu del canale (film, serietv, in corso ecc..)*.
|
||||
Voci nel menu contestuale di KOD. Posizionati su di un titolo e controlla se hai le seguenti voci, nel menu contestuale (tasto c o tenendo enter premuto):
|
||||
|
||||
**1. Aggiungi Film in videoteca**
|
||||
|
||||
- [ ] Si
|
||||
- [ ] No
|
||||
|
||||
**2. Scarica Film (devi avere il download abilitato)**
|
||||
|
||||
- [ ] Si
|
||||
- [ ] No
|
||||
|
||||
**Fine test menu contestuale**
|
||||
|
||||
**Fondo pagina dei titoli**
|
||||
|
||||
**3. Paginazione, controlla ci sia la voce "Successivo" (se non c'è controlla sul sito se è presente)**
|
||||
|
||||
- [ ] Sì
|
||||
- [ ] NO
|
||||
|
||||
**Dentro un titolo
|
||||
|
||||
**4. Entra nella pagina del titolo e verifica ci sia almeno 1 server:**
|
||||
|
||||
- [ ] Si
|
||||
- [ ] No
|
||||
|
||||
**5. Eventuali problemi riscontrati**
|
||||
- scrivi qui il problema/i
|
||||
|
||||
**Sezione Serie TV (se il sito non ha serietv elimina questa parte)**
|
||||
|
||||
Test da effettuare mentre sei nella pagina dei titoli.
|
||||
Per ogni titolo verifica ci siano le voci nel menu contestuale.
|
||||
|
||||
**1. Aggiungi Serie in videoteca**
|
||||
|
||||
- [ ] Si
|
||||
- [ ] No
|
||||
|
||||
**2. Scarica Stagione (devi avere il download abilitato)**
|
||||
|
||||
- [ ] Si
|
||||
- [ ] No
|
||||
|
||||
**3. Scarica Serie (devi avere il download abilitato)**
|
||||
|
||||
- [ ] Si
|
||||
- [ ] No
|
||||
|
||||
**4. Cerca o Cerca Serie...**
|
||||
Cerca un titolo a caso in KOD e lo stesso titolo sul sito. Confronta i risultati.
|
||||
|
||||
- [ ] Ok
|
||||
- indica il tipo di problema
|
||||
|
||||
**5. Entra nella pagina della serie, verifica che come ultima voce ci sia "Aggiungi in videoteca":**
|
||||
|
||||
- [ ] Si, appare
|
||||
- [ ] Non appare
|
||||
|
||||
**6. Entra nella pagina dell'episodio, **NON** deve apparire la voce "Aggiungi in videoteca":**
|
||||
|
||||
- [ ] Si, appare
|
||||
- [ ] Non appare
|
||||
|
||||
**7. Eventuali problemi riscontrati**
|
||||
- scrivi qui il problema/i
|
||||
|
||||
**Sezione Anime (se il sito non ha anime elimina questa parte)**
|
||||
|
||||
Test da effettuare mentre sei nella pagina dei titoli. Per ogni titolo verifica ci siano le voci nel menu contestuale.
|
||||
|
||||
**1. Rinumerazione (se gli episodi non appaiono nella forma 1x01)**
|
||||
|
||||
- [ ] Si
|
||||
- [ ] No
|
||||
|
||||
**2. Aggiungi Serie in videoteca**
|
||||
|
||||
- [ ] Si
|
||||
- [ ] No
|
||||
|
||||
**3. Aggiungi 2-3 titoli in videoteca.**
|
||||
- [ ] Aggiunti correttamente
|
||||
- [Indica eventuali problemi] (copia-incolla per tutti i titoli con cui hai avuto il problema)
|
||||
|
||||
- COPIA qui l'ERRORE dal LOG
|
||||
|
||||
**4. Scarica Serie**
|
||||
|
||||
- [ ] Si
|
||||
- [ ] No
|
||||
|
||||
**5. Cerca o Cerca Serie...**
|
||||
Cerca un titolo a caso in KOD e lo stesso titolo sul sito. Confronta i risultati.
|
||||
|
||||
- [ ] Ok
|
||||
- indica il tipo di problema
|
||||
|
||||
**6. Entra nella pagina della serie, verifica che come ultima voce ci sia "Aggiungi in videoteca":**
|
||||
|
||||
- [ ] Appare
|
||||
- [ ] Non appare
|
||||
|
||||
**7. Entra nella pagina dell'episodio, NON ci deve essere la voce "Aggiungi in videoteca":**
|
||||
|
||||
- [ ] Non appare
|
||||
- [ ] Appare
|
||||
|
||||
**8. Eventuali problemi riscontrati**
|
||||
- scrivi qui il problema/i
|
||||
|
||||
** TEST PER IL CONFRONTO TRA SITO E CANALE **
|
||||
|
||||
**TestN.4: Pagina Sito - Menu Canale**
|
||||
|
||||
Occorrente: Browser, KOD! e il file canale.py ( da browser o da file )
|
||||
Avviso:
|
||||
- Sul Browser disattiva eventuali componenti aggiuntivi che bloccano i JS (javascript), li riattivi alla fine del test.
|
||||
|
||||
Entra in ogni menu e controlla che i risultati, delle prime 5-6 pagine, siano gli stessi che trovi sul sito, comprese le varie info (ita/sub-ita, qualità ecc..), inoltre entra, se ci sono, nei menu dei generi - anni - lettera, verifica che cliccando su una voce si visualizzino i titoli.
|
||||
|
||||
*Copia questa sezione per ogni voce che presenta problemi:*
|
||||
|
||||
- [ ] Voce menu ( del canale dove riscontri errori)
|
||||
|
||||
Titoli non corrispondenti:
|
||||
|
||||
- [ ] Il totale dei Titoli è diverso da quello del sito. Alcuni Titoli non compaiono.
|
||||
- [ ] Appaiono titoli per pagine informative o link a siti esterni. Es: Avviso agli utenti.
|
||||
- [ ] La lingua, del titolo, è diversa da quella riportata dal sito
|
||||
- [ ] Non è indicato in 1 o più titoli che sono SUB-ITA
|
||||
- [ ] Cliccando su "Successivo" non si visualizzano titoli
|
||||
- [ ] Non è indicata la qualità: Hd-DVD/rip e altri, nonostante sul sito siano presenti
|
||||
|
||||
- [ ] NO
|
||||
|
||||
|
||||
*Fine Copia*
|
||||
|
||||
|
||||
**Test.N5: Ricerca Globale**
|
||||
|
||||
Per questo test ti consiglio di inserire come UNICO sito quello che stai testando, come canale incluso in: Ricerca Globale -> scegli i canali da includere
|
||||
Il test è già compilato con le spunte, dato che devi copiarlo solo in caso di errori. Togli la spunta dove funziona.
|
||||
Si consiglia di cercare almeno a fino 5 titoli. O perlomeno non fermarti al 1°.
|
||||
|
||||
Cerca 5 FILM a tuo piacimento, se il titolo non esce controlla confrontando i risultati sul sito...:
|
||||
|
||||
*Copia questa sezione per ogni voce che presenta problemi*
|
||||
|
||||
controlla ci siano queste voci se titolo è un FILM:
|
||||
|
||||
- [ ] inserisci il titolo cercato che da problemi
|
||||
- [x] Aggiungi in videoteca
|
||||
- [x] Scarica Film
|
||||
|
||||
*Fine Copia*
|
||||
|
||||
controlla ci siano queste voci se titolo è una SERIE/ANIME:
|
||||
|
||||
*Copia questa sezione per ogni voce che presenta problemi*
|
||||
|
||||
controlla ci siano queste voci se titolo è un FILM:
|
||||
|
||||
- [ ] inserisci il titolo cercato che da problemi
|
||||
- [x] Aggiungi in videoteca
|
||||
- [x] Scarica Serie
|
||||
- [x] Scarica Stagione
|
||||
|
||||
- [ ] inserisci il titolo cercato che da problemi
|
||||
|
||||
*Fine Copia*
|
||||
|
||||
|
||||
Se il canale ha la parte Novità (questa stringa avvisa che NON è presente: "not_active": ["include_in_newest"]).
|
||||
|
||||
**Test.N6: Novità.**
|
||||
Per questo test ti consiglio di inserire come UNICO sito quello che stai testando, come canale incluso in: Novità -> categoria (film, serie o altro )
|
||||
|
||||
- [ ] Descrivere il problema
|
||||
|
||||
Fine TEST!
|
||||
|
||||
Grazie mille da parte di tutto il team KoD!
|
||||
30
.github/workflows/tests.yml
vendored
Executable file
30
.github/workflows/tests.yml
vendored
Executable file
@@ -0,0 +1,30 @@
|
||||
name: Test Suite
|
||||
on:
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
tests:
|
||||
runs-on: macos-latest
|
||||
steps:
|
||||
# Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
|
||||
- uses: actions/checkout@v3
|
||||
|
||||
- name: Set up Python ${{ matrix.python-version }}
|
||||
uses: actions/setup-python@v4.3.0
|
||||
with:
|
||||
python-version: 3.9
|
||||
|
||||
- name: Run tests
|
||||
run: |
|
||||
./tests/run.sh
|
||||
|
||||
- name: Commit & Push changes
|
||||
uses: dmnemec/copy_file_to_another_repo_action@main
|
||||
env:
|
||||
API_TOKEN_GITHUB: ${{ secrets.API_TOKEN_GITHUB }}
|
||||
with:
|
||||
source_file: 'reports'
|
||||
destination_repo: 'kodiondemand/kodiondemand.github.io'
|
||||
user_email: 'tests@kod.bot'
|
||||
user_name: 'bot'
|
||||
commit_message: 'Test suite'
|
||||
30
.github/workflows/updateDomains.yml
vendored
Executable file
30
.github/workflows/updateDomains.yml
vendored
Executable file
@@ -0,0 +1,30 @@
|
||||
name: Update channel domains
|
||||
on:
|
||||
workflow_dispatch:
|
||||
schedule:
|
||||
- cron: '30 17 * * *'
|
||||
|
||||
jobs:
|
||||
update:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
# Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
|
||||
- uses: actions/checkout@v2
|
||||
|
||||
- name: Set up Python ${{ matrix.python-version }}
|
||||
uses: actions/setup-python@v1
|
||||
with:
|
||||
python-version: 3.7
|
||||
|
||||
- name: Install dependencies
|
||||
run: pip install requests
|
||||
|
||||
- name: Update domains
|
||||
run: python tools/updateDomains.py
|
||||
|
||||
- name: Commit & Push changes
|
||||
uses: actions-js/push@master
|
||||
with:
|
||||
message: "Aggiornamento domini"
|
||||
branch: "master"
|
||||
github_token: ${{ secrets.API_TOKEN_GITHUB }}
|
||||
32
.github/workflows/updateDomainsStable.yml
vendored
Executable file
32
.github/workflows/updateDomainsStable.yml
vendored
Executable file
@@ -0,0 +1,32 @@
|
||||
name: Update channel domains
|
||||
on:
|
||||
workflow_dispatch:
|
||||
schedule:
|
||||
- cron: '30 17 * * *'
|
||||
|
||||
jobs:
|
||||
update:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
# Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
|
||||
- uses: actions/checkout@v2
|
||||
with:
|
||||
ref: stable
|
||||
|
||||
- name: Set up Python ${{ matrix.python-version }}
|
||||
uses: actions/setup-python@v1
|
||||
with:
|
||||
python-version: 3.7
|
||||
|
||||
- name: Install dependencies
|
||||
run: pip install requests
|
||||
|
||||
- name: Update domains
|
||||
run: python tools/updateDomains.py
|
||||
|
||||
- name: Commit & Push changes
|
||||
uses: actions-js/push@master
|
||||
with:
|
||||
message: "Aggiornamento domini"
|
||||
branch: "stable"
|
||||
github_token: ${{ secrets.API_TOKEN_GITHUB }}
|
||||
9
.gitignore
vendored
Normal file → Executable file
9
.gitignore
vendored
Normal file → Executable file
@@ -2,3 +2,12 @@
|
||||
*.pyc
|
||||
.DS_Store
|
||||
.idea/
|
||||
.directory
|
||||
custom_code.json
|
||||
last_commit.txt
|
||||
__pycache__/
|
||||
.vscode/settings.json
|
||||
bin/
|
||||
lib/abi
|
||||
tests/home/
|
||||
reports/
|
||||
55
CONTRIBUTING.md
Executable file
55
CONTRIBUTING.md
Executable file
@@ -0,0 +1,55 @@
|
||||
Ciao, grazie per aver preso in considerazione di contribuire a questo progetto!<br>
|
||||
Ci sono molti modi per farlo, e per alcuni di essi non è necessario essere uno sviluppatore.
|
||||
|
||||
Puoi ad esempio [segnalare i cambiamenti di struttura](#segnalare-i-cambiamenti-di-struttura) dei canali/server, [scrivere guide o registrare video-esempi](#scrivere-guide-o-registrare-video-esempi) su alcune funzionalità "avanzate", dare consigli su funzionalità nuove o per migliorare quelle già presenti.
|
||||
|
||||
# Segnalare i cambiamenti di struttura
|
||||
KoD, alla fine, non è altro che un browser che estrapola dai siti le info richieste secondo regole ben precise, basate sulla struttura dei siti.<br>
|
||||
I siti web cambiano, spesso, ciò che oggi funziona domani potrebbe non più funzionare, pertanto sono fondamentali le segnalazioni, ma esse per essere realmente utili devono:
|
||||
- contenere il file di log (lo potete generare andando in Aiuto - Segnala un problema e seguendo le istruzioni)
|
||||
- spiegare brevemente qual'è il problema e dove, ad esempio "cineblog da errore quando entro nella sezione Film", oppure "wstream non da nessun errore ma il video di fatto non parte"
|
||||
- essere replicabili, se si tratta di cose che accadono una volta ogni tanto puoi provare a segnalare lo stesso, sperando che nel log ci sia qualche indizio. Se non c'è, nada
|
||||
|
||||
Prima di segnalare un problema assicurati che sia realmemte legato a KoD, sotto alcuni requisiti necessari:
|
||||
- avere l'ultima versione di KoD, per controllare vai qui e confronta il numero con quello presente nella sezione aiuto: https://github.com/kodiondemand/addon/commits/stable
|
||||
- avere una versione di kodi supportata, attualmente si tratta di 17.x e 18.x
|
||||
- verificare che il problema non dipenda dal sito stesso: se esce il messaggio 'Apri nel Browser': apri il tuo Browser e prova se li il film o serie tv funziona, senno apri il menù contestuale (tasto c) e clicca su "apri nel browser"
|
||||
|
||||
Sei pregato di attenerti il più possibile a quanto descritto qua perchè un semplice "non funziona" fa solo perdere tempo.
|
||||
Puoi fare tutte le segnalazioni nella sezione [issues](https://github.com/kodiondemand/addon/issues), cliccando su "new issue" appariranno dei template che ti guideranno nel processo.
|
||||
Assicurati che qualcun'altro non abbia già effettuato la stessa segnalazione, nel caso avessi altro da aggiungere rispondi ad un issue già aperto piuttosto che farne uno nuovo.
|
||||
|
||||
# Scrivere guide o registrare video-esempi
|
||||
Cerca di essere sintetico ma senza tralasciare le informazioni essenziali, una volta fatto mandalo pure sul [gruppo telegram](https://t.me/kodiondemand) taggando gli admin (@admin).<br>
|
||||
Verrà preso in considerazione il prima possibile ed eventualmente inserito nella [wiki](https://github.com/kodiondemand/addon/wiki) o verrà creato un comando richiamabile nel gruppo.
|
||||
|
||||
# Consigli
|
||||
Effettuali sempre nella sezione [issues](https://github.com/kodiondemand/addon/issues), miraccomando descrivi e fai esempi pratici.<br>
|
||||
|
||||
# Per sviluppatori
|
||||
|
||||
Di seguito tutte le info su come prendere confidenza col codice e come contribuire
|
||||
|
||||
## Da dove posso partire?
|
||||
Un buon punto di partenza è [la wiki](https://github.com/kodiondemand/addon/wiki), qui è presente un minimo di documentazione sul funzionamento di KoD.<br>
|
||||
Ti consigliamo vivamente, una volta compreso il funzionamento generale dell'addon (e prima di iniziare a sviluppare), di [forkare e clonare il repository](https://help.github.com/en/github/getting-started-with-github/fork-a-repo).<br>
|
||||
Questo perchè, oltre al fatto di poter iniziare a mandare modifiche sul tuo account github, l'utilizzo di git abilita la [dev mode](https://github.com/kodiondemand/addon/wiki/dev-mode), che ti sarà di aiuto nelle tue attività.
|
||||
|
||||
## che cosa posso fare?
|
||||
Puoi provare a fixare un bug che hai riscontrato, aggiungere un canale/server che ti interessa ecc..
|
||||
Oppure puoi guardare nella sezione [Projects](https://github.com/kodiondemand/addon/projects) cosa è previsto e iniziare a svilupparlo!
|
||||
|
||||
## ho fatto le modifiche che volevo, e ora?
|
||||
Pusha sul tuo fork le modifiche che hai fatto e manda una pull request. Se è la prima volta ecco qualche link che ti aiuterà:
|
||||
- http://makeapullrequest.com/
|
||||
- http://www.firsttimersonly.com/
|
||||
- [How to Contribute to an Open Source Project on GitHub](https://egghead.io/series/how-to-contribute-to-an-open-source-project-on-github).
|
||||
|
||||
Quando crei la pull request, ricordati di spiegare brevemente qual'è la modifica e perchè l'hai fatta.
|
||||
Quando avremo tempo revisioneremo le modifiche, potremmo anche segnalarti alcuni problemi, nel caso prenditi pure il tutto il tempo che vuoi per sistemare (non è necessaria un'altra pull, tutti i commit verranno riportati nella prima).<br>
|
||||
Quando sarà tutto a posto accetteremo la pull includendo le modifiche
|
||||
|
||||
## Regole per le collaborazioni:
|
||||
- Se si riutilizza codice proveniente da altri addon è necessario citarne la fonte, per rispetto di chi ci ha lavorato, in caso contrario il pull request verrà respinto.
|
||||
- Ogni modifica o novità inviata dev'essere testata, può capitare che vi sia sfuggito qualche bug (è normale), ma l'invio di materiale senza preventivi controlli non è gradito.
|
||||
- I nuovi canali devono essere funzionanti e completi di tutte le feature, comprese videoteca ed autoplay, non verranno accettati finchè non lo saranno.
|
||||
18
README.md
18
README.md
@@ -1,13 +1,13 @@
|
||||
# Alfa addon
|
||||
### Es un proyecto sin ánimo de lucro y con fines educativos, basado en el código open source de pelisalacarta-ce, que permite utilizar Kodi u otra plataforma compatible como "navegador" para ver vídeos alojados en paginas web.
|
||||
# Kodi On Demand
|
||||
### Un fork italiano di [Alfa](https://github.com/alfa-addon)
|
||||
|
||||
### Este addon es totalmente gratuito por lo tanto esta prohibida su venta en solitario o como parte de software integrado en cualquier dispositivo, es absolutamente para uso educativo y personal.
|
||||
Installazione: https://kodiondemand.github.io/#download
|
||||
|
||||
## Colaborar
|
||||
Si deseas colaborar con el proyecto eres bienvenido a hacerlo, pero ten en cuenta por favor estas pautas
|
||||
KoD, come Alfa, è sotto licenza GPL v3, pertanto siete liberi di utilizzare parte del codice, a patto di rispettare i termini di suddetta licenza, che si possono riassumere in:
|
||||
|
||||
- Il tuo addon deve essere rilasciando secondo la stessa licenza, ovvero essere open source (il fatto che lo zip sia visibile da chiunque non ha importanza, è necessario avere un repository git come questo)
|
||||
- Aggiungere i crediti a tutto ciò che copiate/modificate, ad esempio aggiungendo un commento nel file in questione o, meglio, facendo un cherry-pick (in modo da preservarne lo storico)
|
||||
|
||||
- Para colaborar con sus Pull Request se pide seguir unas reglas de estilo basadas en las de python PEP8. Esto se puede
|
||||
hacer desde diferentes IDEs que lo traen integrado como pydev, pycharm o ninjaIDE, o extensiones que se pueden
|
||||
agregar a por ejemplo sublime, atom.
|
||||
### Come contribuire o fare segnalazioni?
|
||||
Ti piace il progetto e vuoi dare una mano? Leggi [qui](https://github.com/kodiondemand/addon/blob/master/CONTRIBUTING.md)
|
||||
|
||||
- Utilizar nombre de clases, métodos y variables en inglés para favorecer la comprensión de personas no hispano parlantes.
|
||||
|
||||
0
mediaserver/__init__.py → __init__.py
Normal file → Executable file
0
mediaserver/__init__.py → __init__.py
Normal file → Executable file
43
addon.xml
Executable file
43
addon.xml
Executable file
@@ -0,0 +1,43 @@
|
||||
<addon id="plugin.video.kod" name="Kodi on Demand" version="1.7.7" provider-name="KoD Team">
|
||||
<requires>
|
||||
<!-- <import addon="script.module.libtorrent" optional="true"/> -->
|
||||
<import addon="metadata.themoviedb.org" optional="true"/>
|
||||
<import addon="metadata.tvshows.themoviedb.org" optional="true"/>
|
||||
<!-- <import addon="metadata.tvdb.com"/> -->
|
||||
|
||||
</requires>
|
||||
<extension point="xbmc.python.pluginsource" library="default.py">
|
||||
<provides>video</provides>
|
||||
</extension>
|
||||
<extension point="kodi.context.item">
|
||||
<menu id="kodi.core.main">
|
||||
<item library="contextmenu.py">
|
||||
<label>90001</label>
|
||||
<visible>!String.StartsWith(ListItem.FileNameAndPath, plugin://plugin.video.kod/) + [ String.IsEqual(ListItem.dbtype, tvshow) | String.IsEqual(ListItem.dbtype, movie) | String.IsEqual(ListItem.dbtype, season) | String.IsEqual(ListItem.dbtype, episode) ]</visible>
|
||||
</item>
|
||||
</menu>
|
||||
</extension>
|
||||
<extension point="xbmc.addon.metadata">
|
||||
<summary lang="en">Kodi on Demand is a Kodi add-on to search and watch contents on the web.</summary>
|
||||
<summary lang="it">Kodi on Demand è un addon di Kodi per cercare e guardare contenuti sul web.</summary>
|
||||
<assets>
|
||||
<icon>resources/media/logo.png</icon>
|
||||
<fanart>resources/media/fanart.jpg</fanart>
|
||||
<screenshot>resources/media/screenshot-1.png</screenshot>
|
||||
<screenshot>resources/media/screenshot-2.png</screenshot>
|
||||
<screenshot>resources/media/screenshot-3.png</screenshot>
|
||||
</assets>
|
||||
<news>- fix di routine ai canali/server
|
||||
</news>
|
||||
<description lang="it">Naviga velocemente sul web e guarda i contenuti presenti</description>
|
||||
<disclaimer>[COLOR red]The owners and submitters to this addon do not host or distribute any of the content displayed by these addons nor do they have any affiliation with the content providers.[/COLOR]
|
||||
[COLOR yellow]Kodi © is a registered trademark of the XBMC Foundation. We are not connected to or in any other way affiliated with Kodi, Team Kodi, or the XBMC Foundation. Furthermore, any software, addons, or products offered by us will receive no support in official Kodi channels, including the Kodi forums and various social networks.[/COLOR]</disclaimer>
|
||||
<platform>all</platform>
|
||||
<license>GNU GPL v3</license>
|
||||
<website>https://kodiondemand.github.io/</website>
|
||||
<forum>https://t.me/kodiondemand</forum>
|
||||
<source>https://github.com/kodiondemand/addon</source>
|
||||
</extension>
|
||||
<extension point="xbmc.service" library="service.py" start="login|startup">
|
||||
</extension>
|
||||
</addon>
|
||||
44
channels.json
Executable file
44
channels.json
Executable file
@@ -0,0 +1,44 @@
|
||||
{
|
||||
"direct": {
|
||||
"altadefinizione01": "https://altadefinizione01.pet",
|
||||
"animealtadefinizione": "http://ww38.animealtadefinizione.it",
|
||||
"animeforce": "https://www.animeforce.it",
|
||||
"animesaturn": "https://www.animesaturn.cx",
|
||||
"animeunity": "https://www.animeunity.tv",
|
||||
"animeworld": "https://www.animeworld.so",
|
||||
"aniplay": "https://aniplay.co",
|
||||
"casacinema": "https://casacinema.media",
|
||||
"cb01anime": "https://cb01new.one",
|
||||
"cinemalibero": "https://cinemalibero.cafe",
|
||||
"cinetecadibologna": "http://cinestore.cinetecadibologna.it",
|
||||
"dinostreaming": "https://dinostreaming.it",
|
||||
"discoveryplus": "https://www.discoveryplus.com",
|
||||
"dreamsub": "https://www.animeworld.so",
|
||||
"eurostreaming": "https://eurostreaming.lifestyle",
|
||||
"eurostreaming_actor": "https://eurostreaming.my",
|
||||
"filmstreaming": "https://film-streaming-ita.cam",
|
||||
"guardaseriecam": "https://guardaserie.kitchen",
|
||||
"hd4me": "https://hd4me.net",
|
||||
"ilcorsaronero": "https://ilcorsaronero.link",
|
||||
"ilgeniodellostreaming_cam": "https://ilgeniodellostreaming.foo",
|
||||
"italiafilm": "https://italia-film.biz",
|
||||
"mediasetplay": "https://mediasetinfinity.mediaset.it",
|
||||
"mondoserietv": "http://ww25.mondoserietv.club/?subid1=20230304-0434-261c-9cb0-a0044930e0a9",
|
||||
"paramount": "https://www.mtv.it",
|
||||
"piratestreaming": "https://piratestreaming.design",
|
||||
"plutotv": "https://pluto.tv",
|
||||
"raiplay": "https://www.raiplay.it",
|
||||
"serietvu": "http://ww1.serietvu.live/?sub1=47fb879a-5325-11ee-94a7-cc35006f53d1",
|
||||
"streamingcommunity": "https://streamingcommunity.ooo",
|
||||
"streamingita": "https://streamingita.click",
|
||||
"tantifilm": "https://tantifilm.name",
|
||||
"toonitalia": "https://toonitalia.xyz"
|
||||
},
|
||||
"findhost": {
|
||||
"altadefinizione": "https://altadefinizione.nuovo.live",
|
||||
"altadefinizionecommunity": "https://altaregistrazione.net",
|
||||
"animealtadefinizione": "https://www.animealtadefinizione.it",
|
||||
"cineblog01": "https://cb01.uno",
|
||||
"filmpertutti": "https://filmpertuttiii.nuovo.live"
|
||||
}
|
||||
}
|
||||
107
channels/0example.json.txt
Executable file
107
channels/0example.json.txt
Executable file
@@ -0,0 +1,107 @@
|
||||
Rev:0.2
|
||||
Update: 03-10-2019
|
||||
#####################
|
||||
|
||||
Promemoria da cancellare pena la non visibilità del canale in KOD!!
|
||||
|
||||
#####################
|
||||
|
||||
|
||||
le voci in settings sono state inserite per l'unico scopo
|
||||
di velocizzare la scrittura del file
|
||||
Vanno lasciate solo quelle voci il cui funzionamento sul
|
||||
canale non vanno attivate.
|
||||
"not_active": ["include_in_newest"], VA INSERITO nei canali che NON hanno nessuna voce newest.
|
||||
Ovviamente va mantenuto tutto il codice di quell'id tra le {}
|
||||
se vanno cancellati tutti deve rimanere la voce:
|
||||
"settings": []
|
||||
##################### Cancellare fino a qui!
|
||||
{
|
||||
"id": "nome del file .json",
|
||||
"name": "Nome del canale visualizzato in KOD",
|
||||
"language": ["ita", "sub-ita"],
|
||||
"active": false,
|
||||
"thumbnail": "",
|
||||
"banner": "",
|
||||
"categories": ["movie", "tvshow", "anime", "vos", "documentary"],
|
||||
"not_active": ["include_in_newest"],
|
||||
"settings": [
|
||||
{
|
||||
"id": "include_in_global_search",
|
||||
"type": "bool",
|
||||
"label": "@70728",
|
||||
"default": false,
|
||||
"enabled": false,
|
||||
"visible": false
|
||||
},
|
||||
{
|
||||
"id": "include_in_newest_peliculas",
|
||||
"type": "bool",
|
||||
"label": "@70727",
|
||||
"default": false,
|
||||
"enabled": false,
|
||||
"visible": false
|
||||
},
|
||||
{
|
||||
"id": "include_in_newest_series",
|
||||
"type": "bool",
|
||||
"label": "@70727",
|
||||
"default": false,
|
||||
"enabled": false,
|
||||
"visible": false
|
||||
},
|
||||
{
|
||||
"id": "include_in_newest_anime",
|
||||
"type": "bool",
|
||||
"label": "@70727",
|
||||
"default": false,
|
||||
"enabled": false,
|
||||
"visible": false
|
||||
},
|
||||
{
|
||||
"id": "checklinks",
|
||||
"type": "bool",
|
||||
"label": "Verifica se i link esistono",
|
||||
"default": false,
|
||||
"enabled": false,
|
||||
"visible": false
|
||||
},
|
||||
{
|
||||
"id": "checklinks_number",
|
||||
"type": "list",
|
||||
"label": "Numero di link da verificare",
|
||||
"default": 2,
|
||||
"enabled": false,
|
||||
"visible": "eq(-1,false)",
|
||||
"lvalues": [ "3", "5", "10", "15", "20" ]
|
||||
},
|
||||
{
|
||||
"id": "filter_languages",
|
||||
"type": "list",
|
||||
"label": "@30019",
|
||||
"default": 0,
|
||||
"enabled": false,
|
||||
"visible": false,
|
||||
"lvalues": ["Non Filtrare"]
|
||||
}
|
||||
],
|
||||
|
||||
"renumber": [
|
||||
{
|
||||
"id": "autorenumber",
|
||||
"type": "bool",
|
||||
"label": "@70712",
|
||||
"default": false,
|
||||
"enabled": false,
|
||||
"visible": false
|
||||
},
|
||||
{
|
||||
"id": "autorenumber_mode",
|
||||
"type": "bool",
|
||||
"label": "@70688",
|
||||
"default": false,
|
||||
"enabled": false,
|
||||
"visible": "eq(-1,false)"
|
||||
}
|
||||
]
|
||||
}
|
||||
269
channels/0example.py.txt
Executable file
269
channels/0example.py.txt
Executable file
@@ -0,0 +1,269 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# ------------------------------------------------------------
|
||||
# Canale per 'idcanale nel json'
|
||||
# By: pincopallo!
|
||||
# Eventuali crediti se vuoi aggiungerli
|
||||
# ------------------------------------------------------------
|
||||
# Rev: 0.2
|
||||
# Update 12-10-2019
|
||||
# fix:
|
||||
# 1. aggiunto pagination e sistemate alcune voci
|
||||
# 2. modificato problemi in eccezioni
|
||||
# 3. aggiunta la def check
|
||||
# 4. modifica alla legenda e altre aggiunte
|
||||
|
||||
# Questo vuole solo essere uno scheletro per velocizzare la scrittura di un canale.
|
||||
# La maggior parte dei canali può essere scritta con il decoratore.
|
||||
# I commenti sono più un promemoria... che una vera e propria spiegazione!
|
||||
# Niente di più.
|
||||
# Ulteriori informazioni sono reperibili nel wiki:
|
||||
# https://github.com/kodiondemand/addon/wiki/decoratori
|
||||
|
||||
"""
|
||||
Questi sono commenti per i beta-tester.
|
||||
|
||||
Su questo canale, nella categoria 'Ricerca Globale'
|
||||
non saranno presenti le voci 'Aggiungi alla Videoteca'
|
||||
e 'Scarica Film'/'Scarica Serie', dunque,
|
||||
la loro assenza, nel Test, NON dovrà essere segnalata come ERRORE.
|
||||
|
||||
Novità. Indicare in quale/i sezione/i è presente il canale:
|
||||
- Nessuna, film, serie, anime...
|
||||
|
||||
Avvisi:
|
||||
- Eventuali avvisi per i tester
|
||||
|
||||
Ulteriori info:
|
||||
|
||||
"""
|
||||
# CANCELLARE Ciò CHE NON SERVE per il canale, lascia il codice commentato ove occorre,
|
||||
# ma fare PULIZIA quando si è finito di testarlo
|
||||
|
||||
# Qui gli import
|
||||
#import re
|
||||
|
||||
# per l'uso dei decoratori, per i log, e funzioni per siti particolari
|
||||
from core import support
|
||||
|
||||
# in caso di necessità
|
||||
#from core import scrapertools, httptools, servertools, tmdb
|
||||
from core.item import Item # per newest
|
||||
#from lib import unshortenit
|
||||
|
||||
##### fine import
|
||||
|
||||
# se il sito ha un link per ottenere l'url corretto in caso di oscuramenti
|
||||
# la funzione deve ritornare l'indirizzo corretto, verrà chiamata solo se necessario (link primario irraggiungibile)
|
||||
def findhost(url):
|
||||
permUrl = httptools.downloadpage(url, follow_redirects=False).headers
|
||||
if 'google' in permUrl['location']:
|
||||
host = permUrl['location'].replace('https://www.google.it/search?q=site:', '')
|
||||
else:
|
||||
host = permUrl['location']
|
||||
return host
|
||||
|
||||
# se si usa findhost metti in channels.json l'url del sito che contiene sempre l'ultimo dominio
|
||||
host = config.get_channel_url(findhost)
|
||||
# se non si usa metti direttamente l'url finale in channels.json
|
||||
host = config.get_channel_url()
|
||||
headers = [['Referer', host]]
|
||||
|
||||
|
||||
### fine variabili
|
||||
|
||||
#### Inizio delle def principali ###
|
||||
|
||||
@support.menu
|
||||
def mainlist(item):
|
||||
support.info(item)
|
||||
|
||||
# Ordine delle voci
|
||||
# Voce FILM, puoi solo impostare l'url
|
||||
film = ['', # url per la voce FILM, se possibile la pagina principale con le ultime novità
|
||||
#Voce Menu,['url','action','args',contentType]
|
||||
('Al Cinema', ['', 'peliculas', '']),
|
||||
('Generi', ['', 'genres', 'genres']),
|
||||
('Per Lettera', ['', 'genres', 'letters']),
|
||||
('Anni', ['', 'genres', 'years']),
|
||||
('Qualità', ['', 'genres', 'quality']),
|
||||
('Mi sento fortunato', ['', 'genres', 'lucky']),
|
||||
('Popolari', ['', 'peliculas', '']),
|
||||
('Sub-ITA', ['', 'peliculas', ''])
|
||||
]
|
||||
|
||||
# Voce SERIE, puoi solo impostare l'url
|
||||
tvshow = ['', # url per la voce Serie, se possibile la pagina con titoli di serie
|
||||
#Voce Menu,['url','action','args',contentType]
|
||||
('Novità', ['', '', '']),
|
||||
('Per Lettera', ['', 'genres', 'letters']),
|
||||
('Per Genere', ['', 'genres', 'genres']),
|
||||
('Per anno', ['', 'genres', 'years'])
|
||||
]
|
||||
# Voce ANIME, puoi solo impostare l'url
|
||||
anime = ['', # url per la voce Anime, se possibile la pagina con titoli di anime
|
||||
#Voce Menu,['url','action','args',contentType]
|
||||
('Novità', ['', '', '']),
|
||||
('In Corso',['', '', '', '']),
|
||||
('Ultimi Episodi',['', '', '', '']),
|
||||
('Ultime Serie',['', '', '', ''])
|
||||
]
|
||||
|
||||
"""
|
||||
Eventuali Menu per voci non contemplate!
|
||||
"""
|
||||
|
||||
# se questa voce non è presente il menu genera una voce
|
||||
# search per ogni voce del menu. Es. Cerca Film...
|
||||
search = '' # se alla funzione search non serve altro
|
||||
|
||||
# VOCE CHE APPARIRA' come prima voce nel menu di KOD!
|
||||
# [Voce Menu,['url','action','args',contentType]
|
||||
top = ([ '' ['', '', '', ''])
|
||||
|
||||
# Se vuoi creare un menu personalizzato o perchè gli altri non
|
||||
# ti soddisfano
|
||||
# [Voce Menu,['url','action','args',contentType]
|
||||
nome = [( '' ['', '', '', ''])
|
||||
return locals()
|
||||
|
||||
|
||||
# Legenda known_keys per i groups nei patron
|
||||
# known_keys = ['url', 'title', 'title2', 'season', 'episode', 'thumb', 'quality',
|
||||
# 'year', 'plot', 'duration', 'genere', 'rating', 'type', 'lang']
|
||||
# url = link relativo o assoluto alla pagina titolo film/serie
|
||||
# title = titolo Film/Serie/Anime/Altro
|
||||
# title2 = titolo dell'episodio Serie/Anime/Altro
|
||||
# season = stagione in formato numerico
|
||||
# episode = numero episodio, in formato numerico.
|
||||
# thumb = linkrealtivo o assoluto alla locandina Film/Serie/Anime/Altro
|
||||
# quality = qualità indicata del video
|
||||
# year = anno in formato numerico (4 cifre)
|
||||
# duration = durata del Film/Serie/Anime/Altro
|
||||
# genere = genere del Film/Serie/Anime/Altro. Es: avventura, commedia
|
||||
# rating = punteggio/voto in formato numerico
|
||||
# type = tipo del video. Es. movie per film o tvshow per le serie. Di solito sono discrimanti usati dal sito
|
||||
# lang = lingua del video. Es: ITA, Sub-ITA, Sub, SUB ITA.
|
||||
# AVVERTENZE: Se il titolo è trovato nella ricerca TMDB/TVDB/Altro allora le locandine e altre info non saranno quelle recuperate nel sito.!!!!
|
||||
@support.scrape
|
||||
def peliculas(item):
|
||||
support.info(item)
|
||||
#support.dbg() # decommentare per attivare web_pdb
|
||||
|
||||
action = ''
|
||||
blacklist = ['']
|
||||
patron = r''
|
||||
patronBlock = r''
|
||||
patronNext = ''
|
||||
pagination = ''
|
||||
|
||||
#debug = True # True per testare le regex sul sito
|
||||
return locals()
|
||||
|
||||
@support.scrape
|
||||
def episodios(item):
|
||||
support.info(item)
|
||||
#support.dbg()
|
||||
|
||||
action = ''
|
||||
blacklist = ['']
|
||||
patron = r''
|
||||
patronBlock = r''
|
||||
patronNext = ''
|
||||
pagination = ''
|
||||
|
||||
#debug = True
|
||||
return locals()
|
||||
|
||||
# Questa def è utilizzata per generare i menu del canale
|
||||
# per genere, per anno, per lettera, per qualità ecc ecc
|
||||
@support.scrape
|
||||
def genres(item):
|
||||
support.info(item)
|
||||
#support.dbg()
|
||||
|
||||
action = ''
|
||||
blacklist = ['']
|
||||
patron = r''
|
||||
patronBlock = r''
|
||||
patronNext = ''
|
||||
pagination = ''
|
||||
|
||||
#debug = True
|
||||
return locals()
|
||||
|
||||
############## Fine ordine obbligato
|
||||
## Def ulteriori
|
||||
|
||||
# per quei casi dove il sito non differenzia film e/o serie e/o anime
|
||||
# e la ricerca porta i titoli mischiati senza poterli distinguere tra loro
|
||||
# andranno modificate anche le def peliculas e episodios ove occorre
|
||||
def check(item):
|
||||
support.info('select --->', item)
|
||||
#support.dbg()
|
||||
data = httptools.downloadpage(item.url, headers=headers).data
|
||||
# pulizia di data, in caso commentare le prossime 2 righe
|
||||
data = re.sub('\n|\t', ' ', data)
|
||||
data = re.sub(r'>\s+<', '> <', data)
|
||||
block = scrapertools.find_single_match(data, r'')
|
||||
if re.findall('', data, re.IGNORECASE):
|
||||
support.info('select = ### è una serie ###')
|
||||
return episodios(Item(channel=item.channel,
|
||||
title=item.title,
|
||||
fulltitle=item.fulltitle,
|
||||
url=item.url,
|
||||
args='serie',
|
||||
contentType='tvshow',
|
||||
#data1 = data decommentando portiamo data nella def senza doverla riscaricare
|
||||
))
|
||||
|
||||
############## Fondo Pagina
|
||||
# da adattare al canale
|
||||
def search(item, text):
|
||||
support.info('search', item)
|
||||
itemlist = []
|
||||
text = text.replace(' ', '+')
|
||||
item.url = host + '/index.php?do=search&story=%s&subaction=search' % (text)
|
||||
# bisogna inserire item.contentType per la ricerca globale
|
||||
# se il canale è solo film, si può omettere, altrimenti bisgona aggiungerlo e discriminare.
|
||||
item.contentType = item.contentType
|
||||
try:
|
||||
return peliculas(item)
|
||||
# Se captura la excepcion, para no interrumpir al buscador global si un canal falla
|
||||
except:
|
||||
import sys
|
||||
for line in sys.exc_info():
|
||||
info('search log:', line)
|
||||
return []
|
||||
|
||||
|
||||
# da adattare al canale
|
||||
# inserire newest solo se il sito ha la pagina con le ultime novità/aggiunte
|
||||
# altrimenti NON inserirlo
|
||||
def newest(categoria):
|
||||
support.info('newest ->', categoria)
|
||||
itemlist = []
|
||||
item = Item()
|
||||
try:
|
||||
if categoria == 'peliculas':
|
||||
item.url = host
|
||||
item.action = 'peliculas'
|
||||
itemlist = peliculas(item)
|
||||
|
||||
if itemlist[-1].action == 'peliculas':
|
||||
itemlist.pop()
|
||||
# Continua la ricerca in caso di errore
|
||||
except:
|
||||
import sys
|
||||
for line in sys.exc_info():
|
||||
support.info('newest log: ', {0}.format(line))
|
||||
return []
|
||||
|
||||
return itemlist
|
||||
|
||||
# da adattare...
|
||||
# consultare il wiki sia per support.server che ha vari parametri,
|
||||
# sia per i siti con hdpass
|
||||
#support.server(item, data='', itemlist=[], headers='', AutoPlay=True, CheckLinks=True)
|
||||
def findvideos(item):
|
||||
support.info('findvideos ->', item)
|
||||
return support.server(item, headers=headers)
|
||||
20
channels/1337x.json
Executable file
20
channels/1337x.json
Executable file
@@ -0,0 +1,20 @@
|
||||
{
|
||||
"id": "1337x",
|
||||
"name": "1337x",
|
||||
"language": ["ita", "sub-ita", "eng"],
|
||||
"active": true,
|
||||
"thumbnail": "1337x.png",
|
||||
"banner": "1337x.png",
|
||||
"categories": ["movie", "tvshow", "torrent"],
|
||||
"not_active": ["include_in_newest"],
|
||||
"settings": [
|
||||
{
|
||||
"id": "itaSearch",
|
||||
"type": "bool",
|
||||
"label": "Cerca contenuti in italiano",
|
||||
"default": false,
|
||||
"enabled": true,
|
||||
"visible": true
|
||||
}
|
||||
]
|
||||
}
|
||||
193
channels/1337x.py
Executable file
193
channels/1337x.py
Executable file
@@ -0,0 +1,193 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# ------------------------------------------------------------
|
||||
# Canale per 1337x
|
||||
# ------------------------------------------------------------
|
||||
|
||||
import inspect
|
||||
from core import support
|
||||
from platformcode import logger, config
|
||||
|
||||
# host = support.config.get_channel_url()
|
||||
host = 'https://www.1337x.to'
|
||||
|
||||
@support.menu
|
||||
def mainlist(item):
|
||||
|
||||
menu = [('Film ITA {bullet bold}',['/movie-lib-sort/all/it/popularity/desc/all/1/', 'peliculas', '', 'movie']),
|
||||
('Film {submenu}',['/movie-library/1/', 'peliculas', 'filter', 'movie']),
|
||||
('Serie TV {bullet bold}',['/series-library/', 'az', '', 'tvshow'])]
|
||||
|
||||
search = ''
|
||||
|
||||
return locals()
|
||||
|
||||
|
||||
def moviefilter(item):
|
||||
if logger.testMode:
|
||||
return host +'/movie-lib-sort/all/all/score/desc/all/1/'
|
||||
from platformcode import platformtools
|
||||
|
||||
item.args = ''
|
||||
controls = []
|
||||
data = support.match(item).data
|
||||
|
||||
patronBlock = r'<select name="{}"[^>]+>(.+?)</select>'
|
||||
patron = r'value="([^"]+)">([^<]+)'
|
||||
|
||||
genres = support.match(data, patronBlock=patronBlock.format('genre'), patron=patron).matches
|
||||
years = support.match(data, patronBlock=patronBlock.format('year'), patron=patron).matches
|
||||
langs = support.match(data, patronBlock=patronBlock.format('lang'), patron=patron).matches
|
||||
sorts = support.match(data, patronBlock=patronBlock.format('sortby'), patron=patron).matches
|
||||
orders = support.match(data, patronBlock=patronBlock.format('sort'), patron=patron).matches
|
||||
|
||||
item.genreValues = [x[0] for x in genres]
|
||||
item.yearValues = [x[0] for x in years]
|
||||
item.langValues = [x[0] for x in langs]
|
||||
item.sortValues = [x[0] for x in sorts]
|
||||
item.orderValues = [x[0] for x in orders]
|
||||
|
||||
genres = [g[1] for g in genres]
|
||||
years = [g[1] for g in years]
|
||||
langs = [g[1] for g in langs]
|
||||
sorts = [g[1] for g in sorts]
|
||||
orders = [g[1] for g in orders]
|
||||
|
||||
controls.append({'id': 'lang', 'label': 'Lingua', 'type': 'list', 'enabled':True, 'visible':True, 'lvalues':langs, 'default': 0})
|
||||
controls.append({'id': 'genre', 'label': 'Genere', 'type': 'list', 'enabled':True, 'visible':True, 'lvalues':genres, 'default': 0})
|
||||
controls.append({'id': 'year', 'label': 'Anno', 'type': 'list', 'enabled':True, 'visible':True, 'lvalues':years, 'default': 0})
|
||||
controls.append({'id': 'sort', 'label': 'Anno', 'type': 'list', 'enabled':True, 'visible':True, 'lvalues':sorts, 'default': 0})
|
||||
controls.append({'id': 'order', 'label': 'Anno', 'type': 'list', 'enabled':True, 'visible':True, 'lvalues':orders, 'default': 0})
|
||||
return platformtools.show_channel_settings(list_controls=controls, item=item, caption='Filtro', callback='filtered')
|
||||
|
||||
|
||||
|
||||
def filtered(item, values):
|
||||
genre = item.genreValues[values['genre']]
|
||||
lang = item.langValues[values['lang']]
|
||||
sortby = item.sortValues[values['sort']]
|
||||
order = item.orderValues[values['order']]
|
||||
year = item.yearValues[values['year']]
|
||||
|
||||
return '{}/movie-lib-sort/{}/{}/{}/{}/{}/1/'.format(host, genre, lang, sortby, order, year)
|
||||
|
||||
|
||||
def az(item):
|
||||
import string
|
||||
itemlist = [item.clone(title='1-9', url=item.url +'num/1/', action='peliculas', thumbnail=support.thumb('az'))]
|
||||
for letter in list(string.ascii_lowercase):
|
||||
itemlist.append(item.clone(title=letter.upper(), url=item.url + letter +'/1/', action='peliculas', thumbnail=support.thumb('az')))
|
||||
return itemlist
|
||||
|
||||
|
||||
def search(item, text):
|
||||
support.info('search', text)
|
||||
item.args = 'search'
|
||||
if config.get_setting('itaSearch', channel=item.channel, default=False):
|
||||
text += ' ita'
|
||||
text = text.replace(' ', '+')
|
||||
item.url = '{}/search/{}/1/'.format(host, text)
|
||||
try:
|
||||
return peliculas(item)
|
||||
# Cattura la eccezione così non interrompe la ricerca globle se il canale si rompe!
|
||||
except:
|
||||
import sys
|
||||
for line in sys.exc_info():
|
||||
support.logger.error("search except: ", line)
|
||||
return []
|
||||
|
||||
@support.scrape
|
||||
def peliculas(item):
|
||||
if item.args == 'filter':
|
||||
item.url = moviefilter(item)
|
||||
if not item.url:
|
||||
data = ' '
|
||||
else:
|
||||
data = support.match(item).data
|
||||
# debug = True
|
||||
if item.args == 'search':
|
||||
sceneTitle = 'undefined'
|
||||
patron = r'<a href="(?P<url>[^"]+)">(?P<title>[^<]+)<(?:[^>]+>){3,7}(?P<seed>[^<]+)<(?:[^>]+>){6}(?P<size>[^<]+)<span'
|
||||
patronNext = r'"([^"]+)">>>'
|
||||
elif item.contentType == 'movie':
|
||||
patron = r'<img[^>]+data-original="(?P<thumb>[^"]+)(?:[^>]+>){15}(?P<title>[^<]+).*?<p>(?P<plot>[^<]+).*?<a href="(?P<url>[^"]+)'
|
||||
patronNext = r'"([^"]+)">>>'
|
||||
else:
|
||||
action = 'seasons'
|
||||
patron = r'<img src="(?P<thumb>[^"]+)(?:[^>]+>){4}\s*<a href="(?P<url>[^"]+)[^>]+>(?P<title>[^<]+)'
|
||||
|
||||
if (item.args == 'search' or item.contentType != 'movie') and not support.stackCheck(['get_channel_results']):
|
||||
patronNext = None
|
||||
def itemlistHook(itemlist):
|
||||
lastUrl = support.match(data, patron=r'href="([^"]+)">Last').match
|
||||
if lastUrl:
|
||||
currentPage = support.match(item.url, string=True, patron=r'/(\d+)/').match
|
||||
nextPage = int(currentPage) + 1
|
||||
support.nextPage(itemlist, item, next_page=item.url.replace('/{}'.format(currentPage), '/{}'.format(nextPage)), function_or_level='peliculas')
|
||||
return itemlist
|
||||
|
||||
return locals()
|
||||
|
||||
|
||||
@support.scrape
|
||||
def seasons(item):
|
||||
item.contentType = 'season'
|
||||
action = 'episodios'
|
||||
patron = r'<li>\s*<a href="(?P<url>[^"]+)[^>]+>\s*<img alt="[^"]*"\ssrc="(?P<thumb>[^"]+)(?:([^>]+)>){2}\s*(?P<title>\w+ (?P<season>\d+))'
|
||||
return locals()
|
||||
|
||||
@support.scrape
|
||||
def episodios(item):
|
||||
patron = r'<img src="(?P<thumb>[^"]+)(?:[^>]+>){13}\s*(?P<season>\d+)x(?P<episode>\d+)\s*<span class="seperator">(?:[^>]+>){2}\s*<a href="(?P<url>[^"]+)">(?P<title>[^<]+)'
|
||||
def itemlistHook(itemlist):
|
||||
itemlist.reverse()
|
||||
return itemlist
|
||||
return locals()
|
||||
|
||||
|
||||
def findvideos(item):
|
||||
itemlist = []
|
||||
item.disableAutoplay = True
|
||||
if item.args == 'search':
|
||||
itemlist.append(item.clone(server='torrent', action='play'))
|
||||
else:
|
||||
from lib.guessit import guessit
|
||||
|
||||
items = support.match(item.url, patron=r'<a href="([^"]+)">([^<]+)<(?:[^>]+>){3}([^<]+)<(?:[^>]+>){6}([^<]+)<span').matches
|
||||
|
||||
for url, title, seed, size in items:
|
||||
parsedTitle = guessit(title)
|
||||
|
||||
title = support.scrapertools.unescape(parsedTitle.get('title', ''))
|
||||
|
||||
lang = ''
|
||||
if parsedTitle.get('language'):
|
||||
langs = parsedTitle.get('language')
|
||||
if isinstance(langs, list):
|
||||
lang = 'MULTI'
|
||||
else:
|
||||
lang = vars(langs).get('alpha3').upper()
|
||||
if not (lang.startswith('MUL') or lang.startswith('ITA')):
|
||||
subs = parsedTitle.get('subtitle_language')
|
||||
if isinstance(subs, list):
|
||||
lang = 'Multi-Sub'
|
||||
else:
|
||||
lang = vars(subs).get('alpha3').upper()
|
||||
if lang:
|
||||
title = '{} [{}]'.format(title, lang)
|
||||
|
||||
sizematch = support.match(size, patron='(\d+(?:\.\d+)?)\s* (\w+)').match
|
||||
sizenumber = float(sizematch[0])
|
||||
if sizematch[1].lower() == 'gb':
|
||||
sizenumber = sizenumber * 1024
|
||||
|
||||
itemlist.append(item.clone(title = '{} [{} SEEDS] [{}]'.format(title, seed, size), seed=int(seed), size=sizenumber, url=host + url, server='torrent', action='play'))
|
||||
itemlist.sort(key=lambda it: (it.seed, it.size), reverse=True)
|
||||
|
||||
Videolibrary = True if 'movie' in item.args else False
|
||||
return support.server(item, itemlist=itemlist, Videolibrary=Videolibrary, Sorted=False)
|
||||
|
||||
|
||||
def play(item):
|
||||
from core import servertools
|
||||
data = support.match(item.url, patron=r'href="(magnet[^"]+)').match
|
||||
return servertools.find_video_items(item, data=data)
|
||||
0
mediaserver/platformcode/__init__.py → channels/__init__.py
Normal file → Executable file
0
mediaserver/platformcode/__init__.py → channels/__init__.py
Normal file → Executable file
11
channels/accuradio.json
Executable file
11
channels/accuradio.json
Executable file
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"id": "accuradio",
|
||||
"name": "AccuRadio",
|
||||
"active": true,
|
||||
"language": ["*"],
|
||||
"thumbnail": "accuradio.png",
|
||||
"banner": "accuradio.png",
|
||||
"categories": ["music"],
|
||||
"not_active":["include_in_global_search"],
|
||||
"settings" :[]
|
||||
}
|
||||
88
channels/accuradio.py
Executable file
88
channels/accuradio.py
Executable file
@@ -0,0 +1,88 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# ------------------------------------------------------------
|
||||
# Canale per accuradio
|
||||
# ------------------------------------------------------------
|
||||
|
||||
import random
|
||||
from core import httptools, support
|
||||
from platformcode import logger
|
||||
|
||||
host = 'https://www.accuradio.com'
|
||||
api_url = host + '/c/m/json/{}/'
|
||||
headers = [['Referer', host]]
|
||||
|
||||
|
||||
|
||||
def mainlist(item):
|
||||
itemlist = []
|
||||
item.action = 'peliculas'
|
||||
js = httptools.downloadpage(api_url.format('brands')).json
|
||||
for it in js.get('features',[]):
|
||||
itemlist.append(
|
||||
item.clone(url= '{}/{}'.format(host,it.get('canonical_url','')),
|
||||
title=support.typo(it['name'],'italic') + support.typo(it.get('channels',''),'_ [] color kod')
|
||||
))
|
||||
for it in js.get('brands',[]):
|
||||
itemlist.append(
|
||||
item.clone(url= '{}/{}'.format(host,it.get('canonical_url','')),
|
||||
title=support.typo(it['name'],'bullet bold') + support.typo(it.get('channels',''),'_ [] color kod')
|
||||
))
|
||||
|
||||
itemlist.append(item.clone(title=support.typo('Cerca...', 'bold color kod'), action='search', thumbnail=support.thumb('search')))
|
||||
support.channel_config(item, itemlist)
|
||||
return itemlist
|
||||
|
||||
|
||||
@support.scrape
|
||||
def peliculas(item):
|
||||
# debug=True
|
||||
action = 'playradio'
|
||||
patron = r'data-id="(?P<id>[^"]+)"\s*data-oldid="(?P<oldid>[^"]+)".*?data-name="(?P<title>[^"]+)(?:[^>]+>){2}<img src="(?P<thumb>[^"]+)(?:[^>]+>){16}\s*(?P<plot>[^<]+)'
|
||||
return locals()
|
||||
|
||||
|
||||
def playradio(item):
|
||||
import xbmcgui, xbmc
|
||||
items = httptools.downloadpage('{}/playlist/json/{}/?ando={}&rand={}'.format(host, item.id, item.oldid, random.random())).json
|
||||
playlist = xbmc.PlayList(xbmc.PLAYLIST_MUSIC)
|
||||
playlist.clear()
|
||||
for i in items:
|
||||
if 'id' in i:
|
||||
url = i['primary'] + i['fn'] + '.m4a'
|
||||
title = i['title']
|
||||
artist = i['track_artist']
|
||||
album = i['album']['title']
|
||||
year = i['album']['year']
|
||||
thumb = 'https://www.accuradio.com/static/images/covers300' + i['album']['cdcover']
|
||||
duration = i.get('duration',0)
|
||||
info = {'duration':duration,
|
||||
'album':album,
|
||||
'artist':artist,
|
||||
'title':title,
|
||||
'year':year,
|
||||
'mediatype':'music'}
|
||||
item = xbmcgui.ListItem(title, path=url)
|
||||
item.setArt({'thumb':thumb, 'poster':thumb, 'icon':thumb})
|
||||
item.setInfo('music',info)
|
||||
playlist.add(url, item)
|
||||
xbmc.Player().play(playlist)
|
||||
|
||||
|
||||
def search(item, text):
|
||||
support.info(text)
|
||||
item.url = host + '/search/' + text
|
||||
itemlist = []
|
||||
try:
|
||||
data = support.match(item.url).data
|
||||
artists = support.match(data, patronBlock=r'artistResults(.*?)</ul', patron=r'href="(?P<url>[^"]+)"\s*>(?P<title>[^<]+)').matches
|
||||
if artists:
|
||||
for url, artist in artists:
|
||||
itemlist.append(item.clone(title=support.typo(artist,'bullet bold'), thumbnail=support.thumb('music'), url=host+url, action='peliculas'))
|
||||
item.data = data
|
||||
itemlist += peliculas(item)
|
||||
# Continua la ricerca in caso di errore
|
||||
except:
|
||||
import sys
|
||||
for line in sys.exc_info():
|
||||
logger.error("%s" % line)
|
||||
return itemlist
|
||||
11
channels/altadefinizione.json
Executable file
11
channels/altadefinizione.json
Executable file
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"id": "altadefinizione",
|
||||
"name": "Altadefinizione",
|
||||
"language": ["ita", "sub-ita"],
|
||||
"active": true,
|
||||
"thumbnail": "altadefinizione.png",
|
||||
"banner": "altadefinizione.png",
|
||||
"categories": ["movie", "tvshow", "vos"],
|
||||
"settings": [],
|
||||
"not_active": ["include_in_newest"]
|
||||
}
|
||||
136
channels/altadefinizione.py
Executable file
136
channels/altadefinizione.py
Executable file
@@ -0,0 +1,136 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# ------------------------------------------------------------
|
||||
# Canale per altadefinizione
|
||||
# ------------------------------------------------------------
|
||||
|
||||
|
||||
from core import httptools, support, tmdb, scrapertools
|
||||
from platformcode import config, logger
|
||||
import re
|
||||
|
||||
def findhost(url):
|
||||
host = support.match(url, patron=r'<h2[^>]+><a href="([^"]+)').match.rstrip('/')
|
||||
permUrl = httptools.downloadpage(host, follow_redirects=False, only_headers=True).headers
|
||||
|
||||
if 'location' in permUrl.keys(): # handle redirection
|
||||
return permUrl['location']
|
||||
return host
|
||||
|
||||
host = config.get_channel_url(findhost)
|
||||
headers = [['Referer', host]]
|
||||
|
||||
@support.menu
|
||||
def mainlist(item):
|
||||
menu = [('Film',['/category/film/', 'peliculas', '', 'movie']),
|
||||
('Film al cinema {submenu}',['/category/ora-al-cinema/', 'peliculas', '', 'movie']),
|
||||
('Generi',['', 'genres', '', 'undefined']),
|
||||
('Saghe',['', 'genres', 'saghe', 'undefined']),
|
||||
('Serie TV',['/category/serie-tv/', 'peliculas', '', 'tvshow']),
|
||||
#('Aggiornamenti Serie TV', ['/aggiornamenti-serie-tv/', 'peliculas']) da fixare
|
||||
]
|
||||
search = ''
|
||||
return locals()
|
||||
|
||||
@support.scrape
|
||||
def genres(item):
|
||||
action = 'peliculas'
|
||||
blacklist = ['Scegli il Genere', 'Film', 'Serie Tv', 'Sub-Ita', 'Anime', "Non reperibile", 'Anime Sub-ITA', 'Prossimamente',]
|
||||
wantSaga = True if item.args == 'saghe' else False
|
||||
|
||||
patronBlock = r'<div class=\"categories-buttons-container\"(?P<block>.*?)</div>'
|
||||
if not wantSaga: # se non richiedo le sage carico le icone in automatico
|
||||
patronMenu = r'<a href=\"(?P<url>https:\/\/.*?)\".*?>(?P<title>.*?)</a>'
|
||||
else: # mantengo l'icona del padre
|
||||
patron = r'<a href=\"(?P<url>https:\/\/.*?)\".*?>(?P<title>.*?)</a>'
|
||||
|
||||
def itemlistHook(itemlist):
|
||||
itl = []
|
||||
for item in itemlist:
|
||||
isSaga = item.fulltitle.startswith('Saga')
|
||||
|
||||
if len(item.fulltitle) != 3:
|
||||
if (isSaga and wantSaga) or (not isSaga and not wantSaga):
|
||||
itl.append(item)
|
||||
return itl
|
||||
return locals()
|
||||
|
||||
|
||||
def search(item, text):
|
||||
item.url = "{}/?{}".format(host, support.urlencode({'s': text}))
|
||||
item.args = 'search'
|
||||
|
||||
try:
|
||||
return peliculas(item)
|
||||
|
||||
except:
|
||||
import sys
|
||||
for line in sys.exc_info():
|
||||
logger.error("search except: %s" % line)
|
||||
return []
|
||||
|
||||
@support.scrape
|
||||
def peliculas(item):
|
||||
if not item.args == 'search': # pagination not works
|
||||
if not item.nextpage:
|
||||
item.page = 1
|
||||
else:
|
||||
item.page = item.nextpage
|
||||
|
||||
if not item.parent_url:
|
||||
item.parent_url = item.url
|
||||
|
||||
item.nextpage = item.page + 1
|
||||
nextPageUrl = "{}/page/{}".format(item.parent_url, item.nextpage)
|
||||
resp = httptools.downloadpage(nextPageUrl, only_headers = True)
|
||||
if (resp.code > 399): # no more elements
|
||||
nextPageUrl = ''
|
||||
else:
|
||||
action = 'check'
|
||||
|
||||
patron= r'<article class=\"elementor-post.*?(<img .*?src=\"(?P<thumb>[^\"]+).*?)?<h1 class=\"elementor-post__title\".*?<a href=\"(?P<url>[^\"]+)\" >\s*(?P<title>[^<]+?)\s*(\((?P<lang>Sub-[a-zA-Z]+)*\))?\s*(\[(?P<quality>[A-Z]*)\])?\s*(\((?P<year>[0-9]{4})\))?\s+<'
|
||||
|
||||
return locals()
|
||||
|
||||
def episodios(item):
|
||||
item.quality = ''
|
||||
data = item.data if item.data else httptools.downloadpage(item.url).data
|
||||
itemlist = []
|
||||
|
||||
for it in support.match(data, patron=[r'div class=\"single-season.*?(?P<id>season_[0-9]+).*?>Stagione:\s(?P<season>[0-9]+).*?(\s-\s(?P<lang>[a-zA-z]+?))?<']).matches:
|
||||
block = support.match(data, patron = r'div id=\"'+ it[0] +'\".*?</div').match
|
||||
for ep in support.match(block, patron=[r'<li><a href=\"(?P<url>[^\"]+).*?img\" src=\"(?P<thumb>[^\"]+).*?title\">(?P<episode>[0-9]+)\.\s+(?P<title>.*?)</span>']).matches:
|
||||
itemlist.append(item.clone(contentType = 'episode',
|
||||
action='findvideos',
|
||||
thumb = ep[1],
|
||||
title = support.format_longtitle(support.cleantitle(ep[3]), season = it[1], episode = ep[2], lang= it[3]),
|
||||
url = ep[0], data = '')
|
||||
)
|
||||
|
||||
support.check_trakt(itemlist)
|
||||
support.videolibrary(itemlist, item)
|
||||
if (config.get_setting('downloadenabled')):
|
||||
support.download(itemlist, item)
|
||||
|
||||
return itemlist
|
||||
|
||||
def check(item):
|
||||
item.data = httptools.downloadpage(item.url).data
|
||||
if 'season-details' in item.data.lower():
|
||||
item.contentType = 'tvshow'
|
||||
return episodios(item)
|
||||
else:
|
||||
return findvideos(item)
|
||||
|
||||
|
||||
def findvideos(item):
|
||||
video_url = item.url
|
||||
|
||||
if item.contentType == 'movie':
|
||||
video_url = support.match(item, patron=[r'<div class="video-wrapper">.*?<iframe src=\"(https://.*?)\"',
|
||||
r'window.open\(\'([^\']+).*?_blank']).match
|
||||
if (video_url == ''):
|
||||
return []
|
||||
itemlist = [item.clone(action="play", url=srv) for srv in support.match(video_url, patron='<div class="megaButton" meta-type="v" meta-link="([^"]+).*?(?=>)>').matches]
|
||||
itemlist = support.server(item,itemlist=itemlist)
|
||||
|
||||
return itemlist
|
||||
10
channels/altadefinizione01.json
Executable file
10
channels/altadefinizione01.json
Executable file
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"id": "altadefinizione01",
|
||||
"name": "Altadefinizione01",
|
||||
"language": ["ita", "sub-ita"],
|
||||
"active": true,
|
||||
"thumbnail": "altadefinizione01.png",
|
||||
"banner": "altadefinizione01.png",
|
||||
"categories": ["movie", "vos"],
|
||||
"settings": []
|
||||
}
|
||||
157
channels/altadefinizione01.py
Executable file
157
channels/altadefinizione01.py
Executable file
@@ -0,0 +1,157 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# ------------------------------------------------------------
|
||||
# Canale per altadefinizione01
|
||||
# ------------------------------------------------------------
|
||||
"""
|
||||
|
||||
Eccezioni note che non superano il test del canale:
|
||||
|
||||
Avvisi:
|
||||
- L'url si prende da questo file.
|
||||
- è presente nelle novità-> Film.
|
||||
|
||||
Ulteriori info:
|
||||
|
||||
"""
|
||||
from core import scrapertools, httptools, support
|
||||
from core.item import Item
|
||||
from platformcode import config, logger
|
||||
|
||||
|
||||
# def findhost(url):
|
||||
# data = httptools.downloadpage(url).data
|
||||
# host = scrapertools.find_single_match(data, '<div class="elementor-button-wrapper"> <a href="([^"]+)"')
|
||||
# return host
|
||||
|
||||
|
||||
host = config.get_channel_url()
|
||||
headers = [['Referer', host]]
|
||||
|
||||
|
||||
@support.menu
|
||||
def mainlist(item):
|
||||
|
||||
film = [
|
||||
('Al Cinema', ['/cinema/', 'peliculas', 'pellicola']),
|
||||
('Ultimi Aggiornati-Aggiunti', ['','peliculas', 'update']),
|
||||
('Generi', ['', 'genres', 'genres']),
|
||||
('Lettera', ['/catalog/a/', 'genres', 'orderalf']),
|
||||
('Anni', ['', 'genres', 'years']),
|
||||
('Sub-ITA', ['/sub-ita/', 'peliculas', 'pellicola'])
|
||||
]
|
||||
|
||||
return locals()
|
||||
|
||||
|
||||
@support.scrape
|
||||
def peliculas(item):
|
||||
support.info('peliculas', item)
|
||||
|
||||
## deflang = 'ITA'
|
||||
action="findvideos"
|
||||
|
||||
patron = r'<div class="cover boxcaption"> +<h2>\s*<a href="(?P<url>[^"]+)">(?P<title>[^<]+).*?src="(?P<thumb>[^"]+).*?<div class="trdublaj">(?P<quality>[^<]+).*?<span class="ml-label">(?P<year>[0-9]+).*?<span class="ml-label">(?P<duration>[^<]+).*?<p>(?P<plot>[^<]+)'
|
||||
patronNext = '<span>\d</span> <a href="([^"]+)">'
|
||||
|
||||
if item.args == "search":
|
||||
patronBlock = r'</script> <div class="boxgrid caption">(?P<block>.*)<div id="right_bar">'
|
||||
elif item.args == 'update':
|
||||
patronBlock = r'<div class="widget-title">Ultimi Film Aggiunti/Aggiornati</div>(?P<block>.*?)<div id="alt_menu">'
|
||||
patron = r'style="background-image:url\((?P<thumb>[^\)]+).+?<p class="h4">(?P<title>.*?)</p>[^>]+> [^>]+> [^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+> [^>]+> [^>]+>[^>]+>(?P<year>\d{4})[^>]+>[^>]+> [^>]+>[^>]+>(?P<duration>\d+|N/A)?.+?>.*?(?:>Film (?P<lang>Sub ITA)</a></p> )?<p>(?P<plot>[^<]+)<.*?href="(?P<url>[^"]+)'
|
||||
patronNext = '' # non ha nessuna paginazione
|
||||
elif item.args == 'orderalf':
|
||||
patron = r'<td class="mlnh-thumb"><a href="(?P<url>[^"]+)".*?src="(?P<thumb>[^"]+)"' \
|
||||
'.+?[^>]+>[^>]+ [^>]+[^>]+ [^>]+>(?P<title>[^<]+).*?[^>]+>(?P<year>\d{4})<' \
|
||||
'[^>]+>[^>]+>(?P<quality>[A-Z]+)[^>]+> <td class="mlnh-5">(?P<lang>.*?)</td>'
|
||||
else:
|
||||
patronBlock = r'<div class="cover_kapsul ml-mask">(?P<block>.*)<div class="page_nav">'
|
||||
|
||||
# debug = True
|
||||
return locals()
|
||||
|
||||
|
||||
@support.scrape
|
||||
def genres(item):
|
||||
support.info('genres',item)
|
||||
action = "peliculas"
|
||||
|
||||
blacklist = ['Altadefinizione01']
|
||||
if item.args == 'genres':
|
||||
patronBlock = r'<ul class="kategori_list">(?P<block>.*?)<div class="tab-pane fade" id="wtab2">'
|
||||
patronMenu = '<li><a href="(?P<url>[^"]+)">(?P<title>.*?)</a>'
|
||||
elif item.args == 'years':
|
||||
patronBlock = r'<ul class="anno_list">(?P<block>.*?)</li> </ul> </div>'
|
||||
patronMenu = '<li><a href="(?P<url>[^"]+)">(?P<title>.*?)</a>'
|
||||
elif item.args == 'orderalf':
|
||||
patronBlock = r'<div class="movies-letter">(?P<block>.*?)<div class="clearfix">'
|
||||
patronMenu = '<a title=.*?href="(?P<url>[^"]+)"><span>(?P<title>.*?)</span>'
|
||||
|
||||
#debug = True
|
||||
return locals()
|
||||
|
||||
@support.scrape
|
||||
def orderalf(item):
|
||||
support.info('orderalf',item)
|
||||
|
||||
action = 'findvideos'
|
||||
patron = r'<td class="mlnh-thumb"><a href="(?P<url>[^"]+)".*?src="(?P<thumb>[^"]+)"'\
|
||||
'.+?[^>]+>[^>]+ [^>]+[^>]+ [^>]+>(?P<title>[^<]+).*?[^>]+>(?P<year>\d{4})<'\
|
||||
'[^>]+>[^>]+>(?P<quality>[A-Z]+)[^>]+> <td class="mlnh-5">(?P<lang>.*?)</td>'
|
||||
patronNext = r'<span>[^<]+</span>[^<]+<a href="(.*?)">'
|
||||
|
||||
return locals()
|
||||
|
||||
|
||||
def search(item, text):
|
||||
support.info(item, text)
|
||||
|
||||
|
||||
itemlist = []
|
||||
text = text.replace(" ", "+")
|
||||
item.url = host + "/index.php?do=search&story=%s&subaction=search" % (text)
|
||||
item.args = "search"
|
||||
try:
|
||||
return peliculas(item)
|
||||
# Cattura la eccezione così non interrompe la ricerca globle se il canale si rompe!
|
||||
except:
|
||||
import sys
|
||||
for line in sys.exc_info():
|
||||
logger.error("search except: %s" % line)
|
||||
return []
|
||||
|
||||
def newest(categoria):
|
||||
support.info(categoria)
|
||||
|
||||
itemlist = []
|
||||
item = Item()
|
||||
try:
|
||||
if categoria == "peliculas":
|
||||
item.url = host
|
||||
item.action = "peliculas"
|
||||
item.contentType = 'movie'
|
||||
itemlist = peliculas(item)
|
||||
if itemlist[-1].action == "peliculas":
|
||||
itemlist.pop()
|
||||
# Continua la ricerca in caso di errore
|
||||
except:
|
||||
import sys
|
||||
for line in sys.exc_info():
|
||||
logger.error("{0}".format(line))
|
||||
return []
|
||||
|
||||
return itemlist
|
||||
|
||||
|
||||
def findvideos(item):
|
||||
support.info('findvideos', item)
|
||||
data = httptools.downloadpage(item.url).data
|
||||
iframe = support.match(data, patron='src="(http[^"]+)" frameborder=\"0\" allow=\"accelerometer; autoplay;').match
|
||||
if iframe:
|
||||
item.url = iframe
|
||||
return support.server(item)
|
||||
|
||||
# TODO: verificare se si puo' reinsierire il trailer youtube
|
||||
#itemlist = [item.clone(action="play", url=srv[0], quality=srv[1]) for srv in support.match(item, patron='<a href="#" data-link="([^"]+).*?<span class="d">([^<]+)').matches]
|
||||
#itemlist = support.server(item, itemlist=itemlist, headers=headers)
|
||||
|
||||
#return itemlist
|
||||
11
channels/altadefinizioneclick.json
Executable file
11
channels/altadefinizioneclick.json
Executable file
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"id": "altadefinizioneclick",
|
||||
"name": "AltadefinizioneClick",
|
||||
"active": false,
|
||||
"language": ["ita","sub-ita"],
|
||||
"thumbnail": "altadefinizioneclick.png",
|
||||
"bannermenu": "altadefinizioneciclk.png",
|
||||
"categories": ["tvshow","movie","vos"],
|
||||
"not_active":["include_in_newest_series"],
|
||||
"settings": []
|
||||
}
|
||||
151
channels/altadefinizioneclick.py
Executable file
151
channels/altadefinizioneclick.py
Executable file
@@ -0,0 +1,151 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# ------------------------------------------------------------
|
||||
# Canale per Altadefinizione Click
|
||||
# ----------------------------------------------------------
|
||||
|
||||
from core import support
|
||||
from platformcode import config, logger
|
||||
|
||||
def findhost(url):
|
||||
return support.match(url, patron=r'<div class="elementor-button-wrapper">\s*<a href="([^"]+)"').match
|
||||
|
||||
host = config.get_channel_url(findhost)
|
||||
if host.endswith('/'):
|
||||
host = host[:-1]
|
||||
headers = {'Referer': host, 'x-requested-with': 'XMLHttpRequest'}
|
||||
order = ['', 'i_piu_visti', 'i_piu_votati', 'i_piu_votati_dellultimo_mese', 'titolo_az', 'voto_imdb_piu_alto'][config.get_setting('order', 'altadefinizionecommunity')]
|
||||
|
||||
|
||||
@support.menu
|
||||
def mainlist(item):
|
||||
logger.debug(item)
|
||||
|
||||
film = ['/type/movie',
|
||||
('Generi', ['/type/movie', 'genres', 'genres']),
|
||||
('Anni', ['/type/movie', 'genres', 'year']),]
|
||||
|
||||
tvshow = ['/serie-tv/tvshow',
|
||||
('Generi', ['/serie-tv/tvshow', 'genres', 'genres']),
|
||||
('Anni', ['/serie-tv/tvshow', 'genres', 'year'])]
|
||||
|
||||
return locals()
|
||||
|
||||
|
||||
def search(item, texto):
|
||||
logger.debug("search ", texto)
|
||||
|
||||
item.args = 'search'
|
||||
item.url = host + "/search?s={}&f={}&page=1".format(texto, item.contentType)
|
||||
try:
|
||||
return peliculas(item)
|
||||
# Continua la ricerca in caso di errore
|
||||
except:
|
||||
import sys
|
||||
for line in sys.exc_info():
|
||||
support.logger.error("%s" % line)
|
||||
return []
|
||||
|
||||
|
||||
@support.scrape
|
||||
def genres(item):
|
||||
logger.debug(item)
|
||||
data = support.httptools.downloadpage(item.url, cloudscraper=True).data
|
||||
blacklist= ['Film', 'Serie TV']
|
||||
|
||||
if item.args == 'genres':
|
||||
categories ={}
|
||||
res = support.match(host + '/cerca', patron=r'for="cat-(\d+)[^>]+>([^<]+)').matches
|
||||
for _id, name in res:
|
||||
categories[name] = _id
|
||||
|
||||
patronBlock = r'{}<span></span>(?P<block>.*?)</ul>\s*</li'.format('Film' if item.contentType == 'movie' else 'Serie TV')
|
||||
patronMenu = r'<a href="[^"]+">(?P<title>[^<]+)'
|
||||
|
||||
def itemHook(it):
|
||||
it.cat_id = categories[it.fulltitle]
|
||||
return it
|
||||
|
||||
if item.args == 'year':
|
||||
patron = r'value="(?P<year_id>[^"]+)"[^>]*>(?P<title>\d+)'
|
||||
patronBlock = r'Anno</option>(?P<block>.*?</select>)'
|
||||
|
||||
elif item.args == 'quality':
|
||||
patronMenu = r'quality/(?P<quality_id>[^"]+)">(?P<title>[^<]+)'
|
||||
patronBlock = r'Risoluzione(?P<block>.*?)</ul>'
|
||||
action = 'peliculas'
|
||||
return locals()
|
||||
|
||||
|
||||
@support.scrape
|
||||
def peliculas(item):
|
||||
item.quality = 'HD'
|
||||
json = {}
|
||||
params ={'type':item.contentType, 'anno':item.year_id, 'quality':item.quality_id, 'cat':item.cat_id, 'order':order}
|
||||
|
||||
|
||||
if item.contentType == 'movie':
|
||||
action = 'findvideos'
|
||||
else:
|
||||
action = 'episodios'
|
||||
if not item.page: item.page = 1
|
||||
try:
|
||||
# support.dbg()
|
||||
if item.args in ['search']:
|
||||
page = support.httptools.downloadpage(item.url, headers=headers)
|
||||
if page.json:
|
||||
data = "\n".join(page.json['data'])
|
||||
else:
|
||||
data = page.data
|
||||
else:
|
||||
params['page'] = item.page
|
||||
|
||||
url = '{}/load-more-film?{}'.format(host, support.urlencode(params))
|
||||
json = support.httptools.downloadpage(url, headers=headers).json
|
||||
data = "\n".join(json['data'])
|
||||
except:
|
||||
data = ' '
|
||||
|
||||
patron = r'wrapFilm">\s*<a href="(?P<url>[^"]+)">[^>]+>(?P<year>\d+)(?:[^>]+>){2}(?P<rating>[^<]+)(?:[^>]+>){4}\s*<img src="(?P<thumb>[^"]+)(?:[^>]+>){3}(?P<title>[^<[]+)(?:\[(?P<lang>[sSuUbBiItTaA-]+))?'
|
||||
# patron = r'wrapFilm">\s*<a href="(?P<url>[^"]+)">[^>]+>(?P<year>\d+)(?:[^>]+>){2}(?P<rating>[^<]+)(?:[^>]+>){2}(?P<quality>[^<]+)(?:[^>]+>){2}\s*<img src="(?P<thumb>[^"]+)(?:[^>]+>){3}(?P<title>[^<[]+)(?:\[(?P<lang>[sSuUbBiItTaA-]+))?'
|
||||
|
||||
# paginazione
|
||||
if json.get('have_next') or 'have_next_film=true' in data:
|
||||
def fullItemlistHook(itemlist):
|
||||
cat_id = support.match(data, patron=r''''cat':"(\d+)"''').match
|
||||
if cat_id: item.cat_id = cat_id
|
||||
item.page += 1
|
||||
support.nextPage(itemlist, item, function_or_level='peliculas')
|
||||
return itemlist
|
||||
|
||||
return locals()
|
||||
|
||||
|
||||
@support.scrape
|
||||
def episodios(item):
|
||||
logger.debug(item)
|
||||
# debug = True
|
||||
data = item.data
|
||||
patron = r'class="playtvshow "\s+data-href="(?P<url>[^"]+)'
|
||||
|
||||
def itemHook(it):
|
||||
spl = it.url.split('/')[-2:]
|
||||
it.infoLabels['season'] = int(spl[0])+1
|
||||
it.infoLabels['episode'] = int(spl[1])+1
|
||||
it.url = it.url.replace('/watch-unsubscribed', '/watch-external')
|
||||
it.title = '{}x{:02d} - {}'.format(it.contentSeason, it.contentEpisodeNumber, it.fulltitle)
|
||||
return it
|
||||
|
||||
return locals()
|
||||
|
||||
|
||||
def findvideos(item):
|
||||
itemlist = []
|
||||
playWindow = support.match(item, patron='(?:playWindow|iframe)" (?:href|src)="([^"]+)').match
|
||||
if host in playWindow:
|
||||
url = support.match(playWindow, patron='allowfullscreen[^<]+src="([^"]+)"').match
|
||||
else:
|
||||
url = playWindow
|
||||
itemlist.append(item.clone(action='play', url=url, quality=''))
|
||||
|
||||
|
||||
return support.server(item, itemlist=itemlist)
|
||||
37
channels/altadefinizionecommunity.json
Executable file
37
channels/altadefinizionecommunity.json
Executable file
@@ -0,0 +1,37 @@
|
||||
{
|
||||
"id": "altadefinizionecommunity",
|
||||
"name": "Altadefinizione Community",
|
||||
"language": ["ita", "sub-ita"],
|
||||
"active": false,
|
||||
"thumbnail": "altadefinizionecommunity.png",
|
||||
"banner": "",
|
||||
"categories": ["movie", "tvshow", "vos"],
|
||||
"not_active": ["include_in_newest"],
|
||||
"settings": [
|
||||
{
|
||||
"default": "",
|
||||
"enabled": true,
|
||||
"id": "username",
|
||||
"label": "username",
|
||||
"type": "text",
|
||||
"visible": true
|
||||
},
|
||||
{
|
||||
"default": "",
|
||||
"enabled": true,
|
||||
"id": "password",
|
||||
"label": "password",
|
||||
"type": "text",
|
||||
"visible": true
|
||||
},
|
||||
{
|
||||
"id": "order",
|
||||
"type": "list",
|
||||
"label": "Ordine di Visualizzazione",
|
||||
"default": 0,
|
||||
"enabled": true,
|
||||
"visible": true,
|
||||
"lvalues": [ "Nessuno", "I più visti", "I più votati", "I più votati dell'ultimo mese", "Titolo A-Z", "Voto IMDB più alto"]
|
||||
}
|
||||
]
|
||||
}
|
||||
273
channels/altadefinizionecommunity.py
Executable file
273
channels/altadefinizionecommunity.py
Executable file
@@ -0,0 +1,273 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# ------------------------------------------------------------
|
||||
# Canale per Altadefinizione Community
|
||||
|
||||
from core import support
|
||||
from lib.fakeMail import Gmailnator
|
||||
from platformcode import config, platformtools, logger
|
||||
from core import scrapertools, httptools
|
||||
|
||||
|
||||
def findhost(url):
|
||||
return support.match(url, patron=r'<a href="([^"]+)/\w+">Accedi').match
|
||||
|
||||
|
||||
host = config.get_channel_url(findhost)
|
||||
register_url = 'https://altaregistrazione.net'
|
||||
|
||||
if 'altadefinizionecommunity' not in host:
|
||||
config.get_channel_url(findhost, forceFindhost=True)
|
||||
|
||||
if host.endswith('/'):
|
||||
host = host[:-1]
|
||||
|
||||
headers = {'Referer': host}
|
||||
order = ['', 'i_piu_visti', 'i_piu_votati', 'i_piu_votati_dellultimo_mese', 'titolo_az', 'voto_imdb_piu_alto'][config.get_setting('order', 'altadefinizionecommunity')]
|
||||
|
||||
|
||||
@support.menu
|
||||
def mainlist(item):
|
||||
logger.debug(item)
|
||||
|
||||
film = ['/type/movie',
|
||||
('Generi', ['/type/movie', 'genres', 'genres']),
|
||||
('Anni', ['/type/movie', 'genres', 'year']),]
|
||||
|
||||
tvshow = ['/serie-tv/tvshow',
|
||||
('Generi', ['/serie-tv/tvshow', 'genres', 'genres']),
|
||||
('Anni', ['/serie-tv/tvshow', 'genres', 'year'])]
|
||||
|
||||
return locals()
|
||||
|
||||
|
||||
def search(item, text):
|
||||
logger.debug("search ", text)
|
||||
# per evitare fastidi da ricerca globale
|
||||
if not item.globalsearch:
|
||||
registerOrLogin()
|
||||
|
||||
item.args = 'search'
|
||||
item.url = host + "/search?s={}&f={}".format(text.replace(' ', '+'), item.contentType)
|
||||
try:
|
||||
return peliculas(item)
|
||||
|
||||
# Continua la ricerca in caso di errore
|
||||
except:
|
||||
import sys
|
||||
for line in sys.exc_info():
|
||||
support.logger.error("%s" % line)
|
||||
return []
|
||||
|
||||
|
||||
@support.scrape
|
||||
def genres(item):
|
||||
registerOrLogin()
|
||||
logger.debug(item)
|
||||
data = support.httptools.downloadpage(item.url).data
|
||||
blacklist= ['Film', 'Serie TV']
|
||||
|
||||
if item.args == 'genres':
|
||||
categories ={}
|
||||
res = support.match(host + '/cerca', patron=r'for="cat-(\d+)[^>]+>([^<]+)').matches
|
||||
for _id, name in res:
|
||||
categories[name] = _id
|
||||
|
||||
patronBlock = r'{}<span></span>(?P<block>.*?)</ul>\s*</li'.format('Film' if item.contentType == 'movie' else 'Serie TV')
|
||||
patronMenu = r'<a href="[^"]+">(?P<title>[^<]+)'
|
||||
|
||||
def itemHook(it):
|
||||
it.cat_id = categories[it.fulltitle]
|
||||
return it
|
||||
|
||||
if item.args == 'year':
|
||||
patronMenu = r'value="(?P<year_id>[^"]+)"[^>]*>(?P<title>\d+)'
|
||||
patronBlock = r'Anno</option>(?P<block>.*?</select>)'
|
||||
|
||||
elif item.args == 'quality':
|
||||
patronMenu = r'quality/(?P<quality_id>[^"]+)">(?P<title>[^<]+)'
|
||||
patronBlock = r'Risoluzione(?P<block>.*?)</ul>'
|
||||
|
||||
action = 'peliculas'
|
||||
return locals()
|
||||
|
||||
|
||||
@support.scrape
|
||||
def peliculas(item):
|
||||
item.quality = 'HD'
|
||||
json = {}
|
||||
if not item.page: item.page = 1
|
||||
params ={'type':item.contentType, 'anno':item.year_id, 'quality':item.quality_id, 'cat':item.cat_id, 'order':order, 'page':item.page}
|
||||
# debug = True
|
||||
|
||||
action = 'findvideos' if item.contentType == 'movie' else 'episodios'
|
||||
|
||||
try:
|
||||
# support.dbg()
|
||||
if item.args in ['search']:
|
||||
page = support.httptools.downloadpage(item.url, headers=headers)
|
||||
if page.json:
|
||||
data = "\n".join(page.json['data'])
|
||||
else:
|
||||
data = page.data
|
||||
else:
|
||||
params['page'] = item.page
|
||||
|
||||
url = '{}/load-more-film?{}'.format(host, support.urlencode(params))
|
||||
json = support.httptools.downloadpage(url, headers=headers).json
|
||||
data = "\n".join(json['data'])
|
||||
except:
|
||||
data = ' '
|
||||
|
||||
patron = r'wrapFilm"[^>]*>\s*<a href="(?P<url>[^"]+)">[^>]+>(?P<year>\d+)(?:[^>]+>){2}(?P<rating>[^<]+)(?:[^>]+>){4}\s*<img src="(?P<thumb>[^"]+)(?:[^>]+>){2,6}\s+<h3>(?P<title>[^<[]+)(?:\[(?P<lang>[sSuUbBiItTaA -]+))?'
|
||||
# patron = r'wrapFilm">\s*<a href="(?P<url>[^"]+)">[^>]+>(?P<year>\d+)(?:[^>]+>){2}(?P<rating>[^<]+)(?:[^>]+>){4}\s*<img src="(?P<thumb>[^"]+)(?:[^>]+>){3}(?P<title>[^<[]+)(?:\[(?P<lang>[sSuUbBiItTaA-]+))?'
|
||||
|
||||
def itemHook(item):
|
||||
item.quality = item.quality.replace('2K', 'HD').replace('4K', 'HD')
|
||||
item.title = item.title.replace('2K', 'HD').replace('4K', 'HD')
|
||||
return item
|
||||
|
||||
# paginazione
|
||||
if json.get('have_next') or support.match(data, patron=r'have_next_film\s*=\s*true').match:
|
||||
def fullItemlistHook(itemlist):
|
||||
cat_id = support.match(data, patron=r''''cat':"(\d+)"''').match
|
||||
if cat_id: item.cat_id = cat_id
|
||||
item.page += 1
|
||||
support.nextPage(itemlist, item, function_or_level='peliculas')
|
||||
return itemlist
|
||||
|
||||
return locals()
|
||||
|
||||
|
||||
@support.scrape
|
||||
def episodios(item):
|
||||
registerOrLogin()
|
||||
logger.debug(item)
|
||||
# debug = True
|
||||
data = item.data
|
||||
patron = r'class="playtvshow "\s+data-href="(?P<url>[^"]+)'
|
||||
|
||||
def itemHook(it):
|
||||
spl = it.url.split('/')[-2:]
|
||||
it.infoLabels['season'] = int(spl[0])+1
|
||||
it.infoLabels['episode'] = int(spl[1])+1
|
||||
it.url = it.url.replace('/watch-unsubscribed', '/watch-external')
|
||||
it.title = '{}x{:02d} - {}'.format(it.contentSeason, it.contentEpisodeNumber, it.fulltitle)
|
||||
return it
|
||||
|
||||
return locals()
|
||||
|
||||
|
||||
def findvideos(item):
|
||||
itemlist = []
|
||||
resolve_url(item)
|
||||
|
||||
itemlist.append(item.clone(action='play', url=support.match(item.url, patron='allowfullscreen[^<]+src="([^"]+)"', cloudscraper=True).match, quality=''))
|
||||
|
||||
return support.server(item, itemlist=itemlist)
|
||||
|
||||
|
||||
def play(item):
|
||||
if host in item.url: # intercetto il server proprietario
|
||||
# if registerOrLogin():
|
||||
return support.get_jwplayer_mediaurl(support.httptools.downloadpage(item.url, cloudscraper=True).data, 'Diretto')
|
||||
# else:
|
||||
# platformtools.play_canceled = True
|
||||
# return []
|
||||
else:
|
||||
return [item]
|
||||
|
||||
|
||||
def resolve_url(item):
|
||||
registerOrLogin()
|
||||
if '/watch-unsubscribed' not in item.url and '/watch-external' not in item.url:
|
||||
playWindow = support.match(support.httptools.downloadpage(item.url, cloudscraper=True).data, patron='playWindow" href="([^"]+)')
|
||||
video_url = playWindow.match
|
||||
item.data = playWindow.data
|
||||
item.url = video_url.replace('/watch-unsubscribed', '/watch-external')
|
||||
return item
|
||||
|
||||
|
||||
def login():
|
||||
r = support.httptools.downloadpage(host, cloudscraper=True)
|
||||
Token = support.match(r.data, patron=r'name=\s*"_token"\s*value=\s*"([^"]+)', cloudscraper=True).match
|
||||
if 'id="logged"' in r.data:
|
||||
logger.info('Già loggato')
|
||||
else:
|
||||
logger.info('Login in corso')
|
||||
post = {'_token': '',
|
||||
'form_action':'login',
|
||||
'email': config.get_setting('username', channel='altadefinizionecommunity'),
|
||||
'password':config.get_setting('password', channel='altadefinizionecommunity')}
|
||||
|
||||
r = support.httptools.downloadpage(host + '/login', post=post, headers={'referer': host}, cloudscraper=True)
|
||||
if r.code not in [200, 302] or 'Email o Password non validi' in r.data:
|
||||
platformtools.dialog_ok('AltadefinizioneCommunity', 'Username/password non validi')
|
||||
return False
|
||||
|
||||
return 'id="logged"' in r.data
|
||||
|
||||
|
||||
def registerOrLogin():
|
||||
if config.get_setting('username', channel='altadefinizionecommunity') and config.get_setting('password', channel='altadefinizionecommunity'):
|
||||
if login():
|
||||
return True
|
||||
|
||||
action = platformtools.dialog_yesno('AltadefinizioneCommunity',
|
||||
'Questo server necessita di un account, ne hai già uno oppure vuoi tentare una registrazione automatica?',
|
||||
yeslabel='Accedi', nolabel='Tenta registrazione', customlabel='Annulla')
|
||||
if action == 1: # accedi
|
||||
from specials import setting
|
||||
from core.item import Item
|
||||
user_pre = config.get_setting('username', channel='altadefinizionecommunity')
|
||||
password_pre = config.get_setting('password', channel='altadefinizionecommunity')
|
||||
setting.channel_config(Item(config='altadefinizionecommunity'))
|
||||
user_post = config.get_setting('username', channel='altadefinizionecommunity')
|
||||
password_post = config.get_setting('password', channel='altadefinizionecommunity')
|
||||
|
||||
if user_pre != user_post or password_pre != password_post:
|
||||
return registerOrLogin()
|
||||
else:
|
||||
return []
|
||||
elif action == 0: # tenta registrazione
|
||||
import random
|
||||
import string
|
||||
logger.debug('Registrazione automatica in corso')
|
||||
mailbox = Gmailnator()
|
||||
randPsw = ''.join(random.choice(string.ascii_letters + string.digits) for i in range(10))
|
||||
logger.debug('email: ' + mailbox.address)
|
||||
logger.debug('pass: ' + randPsw)
|
||||
reg = platformtools.dialog_register(register_url, email=True, password=True, email_default=mailbox.address, password_default=randPsw)
|
||||
if not reg:
|
||||
return False
|
||||
regPost = httptools.downloadpage(register_url, post={'email': reg['email'], 'password': reg['password']}, cloudscraper=True)
|
||||
|
||||
if regPost.url == register_url:
|
||||
error = scrapertools.htmlclean(scrapertools.find_single_match(regPost.data, 'Impossibile proseguire.*?</div>'))
|
||||
error = scrapertools.unescape(scrapertools.re.sub('\n\s+', ' ', error))
|
||||
platformtools.dialog_ok('AltadefinizioneCommunity', error)
|
||||
return False
|
||||
if reg['email'] == mailbox.address:
|
||||
if "L'indirizzo email risulta già registrato" in regPost.data:
|
||||
# httptools.downloadpage(baseUrl + '/forgotPassword', post={'email': reg['email']})
|
||||
platformtools.dialog_ok('AltadefinizioneCommunity', 'Indirizzo mail già utilizzato')
|
||||
return False
|
||||
mail = mailbox.waitForMail()
|
||||
if mail:
|
||||
checkUrl = scrapertools.find_single_match(mail.body, '<a href="([^"]+)[^>]+>Verifica').replace(r'\/', '/')
|
||||
logger.debug('CheckURL: ' + checkUrl)
|
||||
httptools.downloadpage(checkUrl, cloudscraper=True)
|
||||
config.set_setting('username', mailbox.address, channel='altadefinizionecommunity')
|
||||
config.set_setting('password', randPsw, channel='altadefinizionecommunity')
|
||||
platformtools.dialog_ok('AltadefinizioneCommunity',
|
||||
'Registrato automaticamente con queste credenziali:\nemail:' + mailbox.address + '\npass: ' + randPsw)
|
||||
else:
|
||||
platformtools.dialog_ok('AltadefinizioneCommunity', 'Impossibile registrarsi automaticamente')
|
||||
return False
|
||||
else:
|
||||
platformtools.dialog_ok('AltadefinizioneCommunity', 'Hai modificato la mail quindi KoD non sarà in grado di effettuare la verifica in autonomia, apri la casella ' + reg['email']
|
||||
+ ' e clicca sul link. Premi ok quando fatto')
|
||||
logger.debug('Registrazione completata')
|
||||
else:
|
||||
return False
|
||||
|
||||
return True
|
||||
21
channels/animealtadefinizione.json
Executable file
21
channels/animealtadefinizione.json
Executable file
@@ -0,0 +1,21 @@
|
||||
{
|
||||
"id": "animealtadefinizione",
|
||||
"name": "AnimealtAdefinizione",
|
||||
"active": false,
|
||||
"language": ["ita", "sub-ita"],
|
||||
"thumbnail": "animealtadefinizione.png",
|
||||
"banner": "animealtadefinizione.png",
|
||||
"categories": ["anime", "sub-ita"],
|
||||
"default_off": ["include_in_newest"],
|
||||
"settings": [
|
||||
{
|
||||
"id": "perpage",
|
||||
"type": "list",
|
||||
"label": "Elementi per pagina",
|
||||
"default": 3,
|
||||
"enabled": true,
|
||||
"visible": true,
|
||||
"lvalues": ["20","30","40","50","60","70","80","90","100"]
|
||||
}
|
||||
]
|
||||
}
|
||||
134
channels/animealtadefinizione.py
Executable file
134
channels/animealtadefinizione.py
Executable file
@@ -0,0 +1,134 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# ------------------------------------------------------------
|
||||
# Canale per animealtadefinizione
|
||||
# ----------------------------------------------------------
|
||||
|
||||
from core import support
|
||||
|
||||
host = support.config.get_channel_url()
|
||||
headers = [['Referer', host]]
|
||||
|
||||
perpage_list = ['20','30','40','50','60','70','80','90','100']
|
||||
perpage = perpage_list[support.config.get_setting('perpage' , 'animealtadefinizione')]
|
||||
epPatron = r'<td>\s*(?P<title>[^<]+)[^>]+>[^>]+>\s*<a href="(?P<url>[^"]+)"[^>]+>\s*<img[^>]+/Streaming'
|
||||
|
||||
|
||||
@support.menu
|
||||
def mainlist(item):
|
||||
anime=['/anime/',
|
||||
('Tipo',['', 'menu', 'Anime']),
|
||||
('Anno',['', 'menu', 'Anno']),
|
||||
('Genere', ['', 'menu','Genere']),
|
||||
('Ultimi Episodi',['', 'peliculas', 'last'])]
|
||||
return locals()
|
||||
|
||||
|
||||
@support.scrape
|
||||
def menu(item):
|
||||
action = 'peliculas'
|
||||
patronBlock= r'<a href="' + host + r'/category/' + item.args.lower() + r'/">' + item.args + r'</a>\s*<ul class="sub-menu">(?P<block>.*?)</ul>'
|
||||
patronMenu = r'<a href="(?P<url>[^"]+)">(?P<title>[^<]+)<'
|
||||
return locals()
|
||||
|
||||
|
||||
def search(item, texto):
|
||||
support.info(texto)
|
||||
item.search = texto
|
||||
try:
|
||||
return peliculas(item)
|
||||
# Continua la ricerca in caso di errore
|
||||
except:
|
||||
import sys
|
||||
for line in sys.exc_info():
|
||||
support.logger.error("%s" % line)
|
||||
return []
|
||||
|
||||
|
||||
def newest(categoria):
|
||||
support.info(categoria)
|
||||
item = support.Item()
|
||||
try:
|
||||
if categoria == "anime":
|
||||
item.url = host
|
||||
item.args = "last"
|
||||
return peliculas(item)
|
||||
# Continua la ricerca in caso di errore
|
||||
except:
|
||||
import sys
|
||||
for line in sys.exc_info():
|
||||
support.logger.error("{0}".format(line))
|
||||
return []
|
||||
|
||||
|
||||
@support.scrape
|
||||
def peliculas(item):
|
||||
if '/movie/' in item.url:
|
||||
item.contentType = 'movie'
|
||||
action='findvideos'
|
||||
elif item.args == 'last':
|
||||
item.contentType = 'episode'
|
||||
action='episodios'
|
||||
else:
|
||||
item.contentType = 'tvshow'
|
||||
action='episodios'
|
||||
if item.search:
|
||||
query = 's'
|
||||
searchtext = item.search
|
||||
else:
|
||||
query='category_name'
|
||||
searchtext = item.url.split('/')[-2]
|
||||
if not item.pag: item.pag = 1
|
||||
# debug = True
|
||||
anime = True
|
||||
data = support.match(host + '/wp-admin/admin-ajax.php', post='action=itajax-sort&loop=main+loop&location=&thumbnail=1&rating=1sorter=recent&columns=4&numarticles='+perpage+'&paginated='+str(item.pag)+'¤tquery%5B'+query+'%5D='+searchtext).data.replace('\\','')
|
||||
patron = r'<a href="(?P<url>[^"]+)"><img width="[^"]+" height="[^"]+" src="(?P<thumb>[^"]+)" class="[^"]+" alt="" title="(?P<title>[^"]+?)\s+(?P<type>Movie)?\s*(?P<lang>Sub Ita|Ita)?\s*[sS]treaming'
|
||||
typeContentDict = {'movie':['movie']}
|
||||
typeActionDict = {'findvideos':['movie']}
|
||||
|
||||
def itemHook(item):
|
||||
item.url = support.re.sub('episodio-[0-9-]+', '', item.url)
|
||||
return item
|
||||
|
||||
def itemlistHook(itemlist):
|
||||
if item.search:
|
||||
itemlist = [ it for it in itemlist if ' Episodio ' not in it.title ]
|
||||
if len(itemlist) == int(perpage):
|
||||
item.pag += 1
|
||||
itemlist.append(item.clone(title=support.typo(support.config.get_localized_string(30992), 'color kod bold'), action='peliculas'))
|
||||
return itemlist
|
||||
return locals()
|
||||
|
||||
|
||||
@support.scrape
|
||||
def episodios(item):
|
||||
anime = True
|
||||
# debug = True
|
||||
pagination = int(perpage)
|
||||
patron = epPatron
|
||||
return locals()
|
||||
|
||||
|
||||
def findvideos(item):
|
||||
itemlist = []
|
||||
if item.contentType == 'movie':
|
||||
matches = support.match(item, patron=epPatron).matches
|
||||
for title, url in matches:
|
||||
# support.dbg()
|
||||
get_video_list(item, url, title, itemlist)
|
||||
else:
|
||||
get_video_list(item, item.url, support.config.get_localized_string(30137), itemlist)
|
||||
return support.server(item, itemlist=itemlist)
|
||||
|
||||
|
||||
def get_video_list(item, url, title, itemlist):
|
||||
if 'vvvvid' in url:
|
||||
itemlist.append(item.clone(title='VVVVID', url=url, server='vvvvid', action='play'))
|
||||
else:
|
||||
from requests import get
|
||||
if not url.startswith('http'): url = host + url
|
||||
|
||||
url = support.match(get(url).url, string=True, patron=r'file=([^$]+)').match
|
||||
if 'http' not in url: url = 'http://' + url
|
||||
itemlist.append(item.clone(title=title, url=url, server='directo', action='play'))
|
||||
|
||||
return itemlist
|
||||
60
channels/animeforce.json
Executable file
60
channels/animeforce.json
Executable file
@@ -0,0 +1,60 @@
|
||||
{
|
||||
"id": "animeforce",
|
||||
"name": "AnimeForce",
|
||||
"language": ["ita"],
|
||||
"active": false,
|
||||
"thumbnail": "animeforce.png",
|
||||
"banner": "animeforce.png",
|
||||
"categories": ["anime"],
|
||||
"settings": [
|
||||
{
|
||||
"id": "include_in_global_search",
|
||||
"type": "bool",
|
||||
"label": "Includi in Ricerca Globale",
|
||||
"default": false,
|
||||
"enabled": false,
|
||||
"visible": true
|
||||
},
|
||||
{
|
||||
"id": "include_in_newest_anime",
|
||||
"type": "bool",
|
||||
"label": "Includi in Novità - Anime",
|
||||
"default": true,
|
||||
"enabled": true,
|
||||
"visible": true
|
||||
},
|
||||
{
|
||||
"id": "checklinks",
|
||||
"type": "bool",
|
||||
"label": "Verifica se i link esistono",
|
||||
"default": false,
|
||||
"enabled": true,
|
||||
"visible": true
|
||||
},
|
||||
{
|
||||
"id": "checklinks_number",
|
||||
"type": "list",
|
||||
"label": "Numero de link da verificare",
|
||||
"default": 1,
|
||||
"enabled": true,
|
||||
"visible": "eq(-1,true)",
|
||||
"lvalues": [ "1", "3", "5", "10" ]
|
||||
},
|
||||
{
|
||||
"id": "autorenumber",
|
||||
"type": "bool",
|
||||
"label": "@70712",
|
||||
"default": false,
|
||||
"enabled": true,
|
||||
"visible": true
|
||||
},
|
||||
{
|
||||
"id": "autorenumber_mode",
|
||||
"type": "bool",
|
||||
"label": "@70688",
|
||||
"default": false,
|
||||
"enabled": true,
|
||||
"visible": "eq(-1,true)"
|
||||
}
|
||||
]
|
||||
}
|
||||
162
channels/animeforce.py
Executable file
162
channels/animeforce.py
Executable file
@@ -0,0 +1,162 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# ------------------------------------------------------------
|
||||
# Canale per AnimeForce
|
||||
# ------------------------------------------------------------
|
||||
|
||||
from core import support
|
||||
|
||||
host = support.config.get_channel_url()
|
||||
headers = [['Referer', host]]
|
||||
|
||||
|
||||
@support.menu
|
||||
def mainlist(item):
|
||||
anime = ['/anime',
|
||||
('In Corso',['/anime/anime-status/in-corso/', 'peliculas', 'status']),
|
||||
('Completi',['/anime/anime-status/completo/', 'peliculas', 'status']),
|
||||
('Genere',['/anime', 'submenu', 'genre']),
|
||||
('Anno',['/anime', 'submenu', 'anime-year']),
|
||||
('Tipologia',['/anime', 'submenu', 'anime-type']),
|
||||
('Stagione',['/anime', 'submenu', 'anime-season']),
|
||||
('Ultime Serie',['/category/anime/articoli-principali/','peliculas','last'])
|
||||
]
|
||||
return locals()
|
||||
|
||||
|
||||
@support.scrape
|
||||
def submenu(item):
|
||||
action = 'peliculas'
|
||||
patronBlock = r'data-taxonomy="' + item.args + r'"(?P<block>.*?)</select'
|
||||
patronMenu = r'<option class="level-\d+ (?P<url>[^"]+)"[^>]+>(?P<t>[^(]+)[^\(]+\((?P<num>\d+)'
|
||||
def itemHook(item):
|
||||
if not item.url.startswith('http'):
|
||||
item.url = host + '/anime/' + item.args + '/' + item.url
|
||||
item.title = support.typo(item.t, 'bold')
|
||||
return item
|
||||
return locals()
|
||||
|
||||
|
||||
def newest(categoria):
|
||||
support.info(categoria)
|
||||
itemlist = []
|
||||
item = support.Item()
|
||||
try:
|
||||
if categoria == "anime":
|
||||
item.contentType = 'tvshow'
|
||||
item.url = host
|
||||
item.args = 'newest'
|
||||
return peliculas(item)
|
||||
# Continua la ricerca in caso di errore
|
||||
except:
|
||||
import sys
|
||||
for line in sys.exc_info():
|
||||
support.logger.error("{0}".format(line))
|
||||
return []
|
||||
|
||||
return itemlist
|
||||
|
||||
def search(item, text):
|
||||
support.info('search',text)
|
||||
item.search = text
|
||||
item.url = host + '/lista-anime/'
|
||||
item.contentType = 'tvshow'
|
||||
try:
|
||||
return peliculas(item)
|
||||
# Continua la ricerca in caso di errore
|
||||
except:
|
||||
import sys
|
||||
for line in sys.exc_info():
|
||||
support.logger.error("%s" % line)
|
||||
return []
|
||||
|
||||
|
||||
@support.scrape
|
||||
def peliculas(item):
|
||||
search = item.search
|
||||
anime = True
|
||||
action = 'check'
|
||||
|
||||
patron = r'<a href="(?P<url>[^"]+)"[^>]+>\s*<img src="(?P<thumb>[^"]+)" alt="(?P<title>.*?)(?: Sub| sub| SUB|")'
|
||||
|
||||
if search:
|
||||
patron = r'<a href="(?P<url>[^"]+)"\s*title="(?P<title>.*?)(?: Sub| sub| SUB|")'
|
||||
|
||||
if item.args == 'newest': item.action = 'findvideos'
|
||||
|
||||
patronNext = '<li class="page-item disabled">(?:[^>]+>){4}<a class="page-link" href="([^"]+)'
|
||||
|
||||
def itemHook(item):
|
||||
if 'sub-ita' in item.url:
|
||||
if item.args != 'newest': item.title = item.title + support.typo('Sub-ITA','_ [] color kod')
|
||||
item.contentLanguage = 'Sub-ITA'
|
||||
return item
|
||||
|
||||
return locals()
|
||||
|
||||
|
||||
def check(item):
|
||||
m = support.match(item, headers=headers, patron=r'Tipologia[^>]+>\s*<a href="([^"]+)"')
|
||||
item.data = m.data
|
||||
if 'movie' in m.match:
|
||||
item.contentType = 'movie'
|
||||
return findvideos(item)
|
||||
else:
|
||||
return episodios(item)
|
||||
|
||||
|
||||
@support.scrape
|
||||
def episodios(item):
|
||||
anime = True
|
||||
pagination = 50
|
||||
data = item.data
|
||||
|
||||
if '<h6>Streaming</h6>' in data:
|
||||
patron = r'<td style[^>]+>\s*.*?(?:<span[^>]+)?<strong>(?P<title>[^<]+)<\/strong>.*?<td style[^>]+>\s*<a href="(?P<url>[^"]+)"[^>]+>(?P<episode>\d+)'
|
||||
else:
|
||||
patron = r'<a\s*href="(?P<url>[^"]+)"\s*title="(?P<title>[^"]+)"\s*class="btn btn-dark mb-1">(?P<episode>\d+)'
|
||||
def itemHook(item):
|
||||
support.info(item)
|
||||
if item.url.startswith('//'): item.url= 'https:' + item.url
|
||||
elif item.url.startswith('/'): item.url= 'https:/' + item.url
|
||||
return item
|
||||
action = 'findvideos'
|
||||
return locals()
|
||||
|
||||
|
||||
def findvideos(item):
|
||||
support.info(item)
|
||||
itemlist = []
|
||||
if item.data:
|
||||
url = support.match(item.data, patron=r'<a\s*href="([^"]+)"\s*title="[^"]+"\s*class="btn btn-dark mb-1">').match
|
||||
else:
|
||||
url = item.url
|
||||
|
||||
# if 'adf.ly' in item.url:
|
||||
# from servers.decrypters import adfly
|
||||
# url = adfly.get_long_url(item.url)
|
||||
|
||||
# elif 'bit.ly' in item.url:
|
||||
# url = support.httptools.downloadpage(item.url, only_headers=True, follow_redirects=False).headers.get("location")
|
||||
|
||||
# else:
|
||||
# url = host
|
||||
# for u in item.url.split('/'):
|
||||
# if u and 'animeforce' not in u and 'http' not in u:
|
||||
# url += '/' + u
|
||||
|
||||
|
||||
# if 'php?' in url:
|
||||
# url = support.httptools.downloadpage(url, only_headers=True, follow_redirects=False).headers.get("location")
|
||||
# url = support.match(url, patron=r'class="button"><a href=(?:")?([^" ]+)', headers=headers).match
|
||||
# else:
|
||||
# if item.data: url = item.data
|
||||
# if item.contentType == 'movie': url = support.match()
|
||||
# url = support.match(url, patron=r'data-href="([^"]+)" target').match
|
||||
# if not url: url = support.match(url, patron=[r'<source src=(?:")?([^" ]+)',r'name="_wp_http_referer" value="([^"]+)"']).match
|
||||
# if url.startswith('//'): url = 'https:' + url
|
||||
# elif url.startswith('/'): url = 'https:/' + url
|
||||
url = support.match(url, patron=r'data-href="([^"]+)" target').match
|
||||
if 'vvvvid' in url: itemlist.append(item.clone(action="play", title='VVVVID', url=url, server='vvvvid'))
|
||||
else: itemlist.append(item.clone(action="play", title=support.config.get_localized_string(30137), url=url, server='directo'))
|
||||
|
||||
return support.server(item, itemlist=itemlist)
|
||||
10
channels/animesaturn.json
Executable file
10
channels/animesaturn.json
Executable file
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"id": "animesaturn",
|
||||
"name": "AnimeSaturn",
|
||||
"active": true,
|
||||
"language": ["ita"],
|
||||
"thumbnail": "animesaturn.png",
|
||||
"banner": "animesaturn.png",
|
||||
"categories": ["anime"],
|
||||
"settings": []
|
||||
}
|
||||
194
channels/animesaturn.py
Executable file
194
channels/animesaturn.py
Executable file
@@ -0,0 +1,194 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# ------------------------------------------------------------
|
||||
# Canale per AnimeSaturn
|
||||
# ----------------------------------------------------------
|
||||
|
||||
from core import support
|
||||
|
||||
host = support.config.get_channel_url()
|
||||
__channel__ = 'animesaturn'
|
||||
cookie = support.config.get_setting('cookie', __channel__)
|
||||
headers = {'X-Requested-With': 'XMLHttpRequest', 'Cookie': cookie}
|
||||
|
||||
|
||||
def get_cookie(data):
|
||||
global cookie, headers
|
||||
cookie = support.match(data, patron=r'document.cookie="([^\s]+)').match
|
||||
support.config.set_setting('cookie', cookie, __channel__)
|
||||
headers = [['Cookie', cookie]]
|
||||
|
||||
|
||||
def get_data(item):
|
||||
# support.dbg()
|
||||
# url = support.match(item.url, headers=headers, follow_redirects=True, only_headers=True).url
|
||||
data = support.match(item.url, headers=headers, follow_redirects=True).data
|
||||
if 'ASCookie' in data:
|
||||
get_cookie(data)
|
||||
data = get_data(item)
|
||||
return data
|
||||
|
||||
|
||||
@support.menu
|
||||
def mainlist(item):
|
||||
|
||||
anime = ['/animelist?load_all=1&d=1',
|
||||
('ITA',['', 'submenu', '/filter?language%5B0%5D=1']),
|
||||
('SUB-ITA',['', 'submenu', '/filter?language%5B0%5D=0']),
|
||||
('Più Votati',['/toplist','menu', 'top']),
|
||||
('In Corso',['/animeincorso','peliculas','incorso']),
|
||||
('Ultimi Episodi',['/fetch_pages.php?request=episodes&d=1','peliculas','updated'])]
|
||||
|
||||
return locals()
|
||||
|
||||
|
||||
def search(item, texto):
|
||||
support.info(texto)
|
||||
item.url = host + '/animelist?search=' + texto
|
||||
item.contentType = 'tvshow'
|
||||
try:
|
||||
return peliculas(item)
|
||||
# Continua la ricerca in caso di errore
|
||||
except:
|
||||
import sys
|
||||
for line in sys.exc_info():
|
||||
support.logger.error("%s" % line)
|
||||
return []
|
||||
|
||||
|
||||
def newest(categoria):
|
||||
support.info()
|
||||
itemlist = []
|
||||
item = support.Item()
|
||||
try:
|
||||
if categoria == "anime":
|
||||
item.url = host + '/fetch_pages.php?request=episodes&d=1'
|
||||
item.args = "updated"
|
||||
return peliculas(item)
|
||||
# Continua la ricerca in caso di errore
|
||||
except:
|
||||
import sys
|
||||
for line in sys.exc_info():
|
||||
support.logger.error("{0}".format(line))
|
||||
return []
|
||||
|
||||
return itemlist
|
||||
|
||||
|
||||
@support.scrape
|
||||
def submenu(item):
|
||||
data = support.match(item.url + item.args).data
|
||||
action = 'filter'
|
||||
patronMenu = r'<h5 class="[^"]+">(?P<title>[^<]+)[^>]+>[^>]+>\s*<select id="(?P<parameter>[^"]+)"[^>]+>(?P<data>.*?)</select>'
|
||||
def itemlistHook(itemlist):
|
||||
itemlist.insert(0, item.clone(title=support.typo('Tutti','bold'), url=item.url + item.args, action='peliculas'))
|
||||
return itemlist[:-1]
|
||||
return locals()
|
||||
|
||||
|
||||
def filter(item):
|
||||
itemlist = []
|
||||
matches = support.match(item.data if item.data else item.url, patron=r'<option value="(?P<value>[^"]+)"[^>]*>(?P<title>[^<]+)').matches
|
||||
for value, title in matches:
|
||||
itemlist.append(item.clone(title= support.typo(title,'bold'), url='{}{}&{}%5B0%5D={}'.format(host, item.args, item.parameter, value), action='peliculas', args='filter'))
|
||||
support.thumb(itemlist, genre=True)
|
||||
return itemlist
|
||||
|
||||
|
||||
@support.scrape
|
||||
def menu(item):
|
||||
patronMenu = r'<div class="col-md-13 bg-dark-as-box-shadow p-2 text-white text-center">(?P<title>[^"<]+)<(?P<other>.*?)(?:"lista-top"|"clearfix")'
|
||||
action = 'peliculas'
|
||||
item.args = 'top'
|
||||
def itemHook(item2):
|
||||
item2.url = item.url
|
||||
return item2
|
||||
|
||||
return locals()
|
||||
|
||||
|
||||
@support.scrape
|
||||
def peliculas(item):
|
||||
anime = True
|
||||
|
||||
deflang= 'Sub-ITA'
|
||||
action = 'check'
|
||||
page = None
|
||||
post = "page=" + str(item.page if item.page else 1) if item.page and int(item.page) > 1 else None
|
||||
data = get_data(item)
|
||||
|
||||
# debug = True
|
||||
|
||||
if item.args == 'top':
|
||||
data = item.other
|
||||
patron = r'light">(?P<title2>[^<]+)</div>\s*(?P<title>[^<]+)[^>]+>[^>]+>\s*<a href="(?P<url>[^"]+)">(?:<a[^>]+>|\s*)<img.*?src="(?P<thumb>[^"]+)"'
|
||||
else:
|
||||
data = support.match(item, post=post, headers=headers).data
|
||||
if item.args == 'updated':
|
||||
page = support.match(data, patron=r'data-page="(\d+)" title="Next">').match
|
||||
patron = r'<a href="(?P<url>[^"]+)" title="(?P<title>[^"(]+)(?:\s*\((?P<year>\d+)\))?(?:\s*\((?P<lang>[A-Za-z-]+)\))?">\s*<img src="(?P<thumb>[^"]+)"[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>\s\s*(?P<type>[^\s]+)\s*(?P<episode>\d+)'
|
||||
typeContentDict = {'Movie':'movie', 'Episodio':'episode'} #item.contentType='episode'
|
||||
action = 'findvideos'
|
||||
def itemlistHook(itemlist):
|
||||
if page:
|
||||
itemlist.append(item.clone(title=support.typo(support.config.get_localized_string(30992), 'color kod bold'),page= page, thumbnail=support.thumb()))
|
||||
return itemlist
|
||||
elif 'filter' in item.args:
|
||||
page = support.match(data, patron=r'totalPages:\s*(\d+)').match
|
||||
patron = r'<a href="(?P<url>[^"]+)" title="(?P<title>[^"(]+)(?:\s*\((?P<year>\d+)\))?(?:\s*\((?P<lang>[A-Za-z-]+)\))?">\s*<img src="(?P<thumb>[^"]+)"'
|
||||
def itemlistHook(itemlist):
|
||||
if item.nextpage: item.nextpage += 1
|
||||
else: item.nextpage = 2
|
||||
if page and item.nextpage < int(page):
|
||||
itemlist.append(item.clone(title=support.typo(support.config.get_localized_string(30992), 'color kod bold'), url= '{}&page={}'.format(item.url, item.nextpage), infoLabels={}, thumbnail=support.thumb()))
|
||||
return itemlist
|
||||
|
||||
else:
|
||||
# pagination = ''
|
||||
if item.args == 'incorso':
|
||||
patron = r'<a href="(?P<url>[^"]+)"[^>]+>(?P<title>[^<(]+)(?:\s*\((?P<year>\d+)\))?(?:\s*\((?P<lang>[A-za-z-]+)\))?</a>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>\s*<img width="[^"]+" height="[^"]+" src="(?P<thumb>[^"]+)"[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>(?P<plot>[^<]+)<'
|
||||
else:
|
||||
# debug=True
|
||||
patron = r'<img src="(?P<thumb>[^"]+)" alt="(?P<title>[^"\(]+)(?:\((?P<lang>[Ii][Tt][Aa])\))?(?:\s*\((?P<year>\d+)\))?[^"]*"[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>\s*<a class="[^"]+" href="(?P<url>[^"]+)">[^>]+>[^>]+>[^>]+>\s*<p[^>]+>(?:(?P<plot>[^<]+))?<'
|
||||
|
||||
return locals()
|
||||
|
||||
|
||||
def check(item):
|
||||
movie = support.match(item, patron=r'Episodi:</b> (\d*) Movie')
|
||||
if movie.match:
|
||||
episodes = episodios(item)
|
||||
if len(episodes) > 0:
|
||||
it = episodes[0].clone(contentType = 'movie', contentTitle=item.fulltitle, contentSerieName='')
|
||||
return findvideos(it)
|
||||
else:
|
||||
item.contentType = 'tvshow'
|
||||
return episodios(item)
|
||||
|
||||
|
||||
@support.scrape
|
||||
def episodios(item):
|
||||
if item.contentType != 'movie': anime = True
|
||||
patron = r'episodi-link-button">\s*<a href="(?P<url>[^"]+)"[^>]+>\s*(?P<title>[^\d<]+(?P<episode>\d+))\s*</a>'
|
||||
return locals()
|
||||
|
||||
|
||||
def findvideos(item):
|
||||
support.info()
|
||||
itemlist = []
|
||||
links = []
|
||||
|
||||
main_url = support.match(item, patron=r'<a href="([^"]+)">[^>]+>[^>]+>G').match
|
||||
urls = support.match(support.match(main_url, headers=headers).data, patron=r'<a class="dropdown-item"\s*href="([^"]+)', headers=headers).matches
|
||||
itemlist.append(item.clone(action="play", title='Primario', url=main_url, server='directo'))
|
||||
itemlist.append(item.clone(action="play", title='Secondario', url=main_url + '&s=alt', server='directo'))
|
||||
for url in urls:
|
||||
link = support.match(url, patron=r'<a href="([^"]+)"[^>]+><button', headers=headers).match
|
||||
if link:
|
||||
links.append(link)
|
||||
return support.server(item, data=links, itemlist=itemlist)
|
||||
|
||||
|
||||
def play(item):
|
||||
if item.server == 'directo':
|
||||
item.url = support.match(item.url, patron=r'(?:source type="[^"]+"\s*src=|file:[^"]+)"([^"]+)').match
|
||||
return[item]
|
||||
20
channels/animeunity.json
Executable file
20
channels/animeunity.json
Executable file
@@ -0,0 +1,20 @@
|
||||
{
|
||||
"id": "animeunity",
|
||||
"name": "AnimeUnity",
|
||||
"active": true,
|
||||
"language": ["ita", "sub-ita"],
|
||||
"thumbnail": "animeunity.png",
|
||||
"banner": "animeunity.png",
|
||||
"categories": ["anime"],
|
||||
"settings": [
|
||||
{
|
||||
"id": "order",
|
||||
"type": "list",
|
||||
"label": "Ordine di Visualizzazione",
|
||||
"default": 0,
|
||||
"enabled": true,
|
||||
"visible": true,
|
||||
"lvalues": [ "Standard", "Lista A-Z", "Lista Z-A", "Popolarità", "Valutazione" ]
|
||||
}
|
||||
]
|
||||
}
|
||||
268
channels/animeunity.py
Executable file
268
channels/animeunity.py
Executable file
@@ -0,0 +1,268 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# ------------------------------------------------------------
|
||||
# Canale per AnimeUnity
|
||||
# ------------------------------------------------------------
|
||||
|
||||
import cloudscraper, json, copy, inspect
|
||||
from core import jsontools, support, httptools, scrapertools
|
||||
from platformcode import autorenumber
|
||||
|
||||
# support.dbg()
|
||||
host = support.config.get_channel_url()
|
||||
response = httptools.downloadpage(host + '/archivio')
|
||||
csrf_token = support.match(response.data, patron='name="csrf-token" content="([^"]+)"').match
|
||||
headers = {'content-type': 'application/json;charset=UTF-8',
|
||||
'x-csrf-token': csrf_token,
|
||||
'Cookie' : '; '.join([x.name + '=' + x.value for x in response.cookies])}
|
||||
|
||||
|
||||
@support.menu
|
||||
def mainlist(item):
|
||||
top = [('Ultimi Episodi', ['', 'news'])]
|
||||
|
||||
menu = [('Anime {bullet bold}',['', 'menu', {}, 'tvshow']),
|
||||
('Film {submenu}',['', 'menu', {'type': 'Movie'}]),
|
||||
('TV {submenu}',['', 'menu', {'type': 'TV'}, 'tvshow']),
|
||||
('OVA {submenu} {tv}',['', 'menu', {'type': 'OVA'}, 'tvshow']),
|
||||
('ONA {submenu} {tv}',['', 'menu', {'type': 'ONA'}, 'tvshow']),
|
||||
('Special {submenu} {tv}',['', 'menu', {'type': 'Special'}, 'tvshow'])]
|
||||
search =''
|
||||
return locals()
|
||||
|
||||
def menu(item):
|
||||
item.action = 'peliculas'
|
||||
ITA = copy.copy(item.args)
|
||||
ITA['title'] = '(ita)'
|
||||
InCorso = copy.copy(item.args)
|
||||
InCorso['status'] = 'In Corso'
|
||||
Terminato = copy.copy(item.args)
|
||||
Terminato['status'] = 'Terminato'
|
||||
itemlist = [item.clone(title=support.typo('Tutti','bold')),
|
||||
item.clone(title=support.typo('ITA','bold'), args=ITA),
|
||||
item.clone(title=support.typo('Genere','bold'), action='genres'),
|
||||
item.clone(title=support.typo('Anno','bold'), action='years')]
|
||||
if item.contentType == 'tvshow':
|
||||
itemlist += [item.clone(title=support.typo('In Corso','bold'), args=InCorso),
|
||||
item.clone(title=support.typo('Terminato','bold'), args=Terminato)]
|
||||
itemlist +=[item.clone(title=support.typo('Cerca...','bold'), action='search', thumbnail=support.thumb('search'))]
|
||||
return itemlist
|
||||
|
||||
|
||||
def genres(item):
|
||||
support.info()
|
||||
# support.dbg()
|
||||
itemlist = []
|
||||
|
||||
genres = json.loads(support.match(response.data, patron='genres="([^"]+)').match.replace('"','"'))
|
||||
|
||||
for genre in genres:
|
||||
item.args['genres'] = [genre]
|
||||
itemlist.append(item.clone(title=support.typo(genre['name'],'bold'), action='peliculas'))
|
||||
return support.thumb(itemlist)
|
||||
|
||||
def years(item):
|
||||
support.info()
|
||||
itemlist = []
|
||||
|
||||
from datetime import datetime
|
||||
next_year = datetime.today().year + 1
|
||||
oldest_year = int(support.match(response.data, patron='anime_oldest_date="([^"]+)').match)
|
||||
|
||||
for year in list(reversed(range(oldest_year, next_year + 1))):
|
||||
item.args['year']=year
|
||||
itemlist.append(item.clone(title=support.typo(year,'bold'), action='peliculas'))
|
||||
return itemlist
|
||||
|
||||
|
||||
def search(item, text):
|
||||
support.info('search', item)
|
||||
if not item.args:
|
||||
item.args = {'title':text}
|
||||
else:
|
||||
item.args['title'] = text
|
||||
item.search = text
|
||||
|
||||
try:
|
||||
return peliculas(item)
|
||||
# Continua la ricerca in caso di errore
|
||||
except:
|
||||
import sys
|
||||
for line in sys.exc_info():
|
||||
support.info('search log:', line)
|
||||
return []
|
||||
|
||||
|
||||
def newest(categoria):
|
||||
support.info(categoria)
|
||||
itemlist = []
|
||||
item = support.Item()
|
||||
item.url = host
|
||||
|
||||
try:
|
||||
itemlist = news(item)
|
||||
|
||||
if itemlist[-1].action == 'news':
|
||||
itemlist.pop()
|
||||
# Continua la ricerca in caso di errore
|
||||
except:
|
||||
import sys
|
||||
for line in sys.exc_info():
|
||||
support.info(line)
|
||||
return []
|
||||
|
||||
return itemlist
|
||||
|
||||
def news(item):
|
||||
support.info()
|
||||
item.contentType = 'episode'
|
||||
itemlist = []
|
||||
|
||||
fullJs = json.loads(support.match(httptools.downloadpage(item.url).data, headers=headers, patron=r'items-json="([^"]+)"').match.replace('"','"'))
|
||||
js = fullJs['data']
|
||||
|
||||
for it in js:
|
||||
if it.get('anime', {}).get('title') or it.get('anime', {}).get('title_eng'):
|
||||
title_name = it['anime']['title'] if it.get('anime', {}).get('title') else it['anime']['title_eng']
|
||||
pattern = r'[sS](?P<season>\d+)[eE](?P<episode>\d+)'
|
||||
match = scrapertools.find_single_match(it['file_name'], pattern)
|
||||
full_episode = ''
|
||||
if match:
|
||||
season, episode = match
|
||||
full_episode = ' - S' + season + ' E' + episode
|
||||
else:
|
||||
pattern = r'[._\s]Ep[._\s]*(?P<episode>\d+)'
|
||||
episode = scrapertools.find_single_match(it['file_name'], pattern)
|
||||
if episode:
|
||||
full_episode = ' - E' + episode
|
||||
itemlist.append(
|
||||
item.clone(title = support.typo(title_name + full_episode, 'bold'),
|
||||
fulltitle = it['anime']['title'],
|
||||
thumbnail = it['anime']['imageurl'],
|
||||
forcethumb = True,
|
||||
scws_id = it.get('scws_id', ''),
|
||||
url = '{}/anime/{}-{}'.format(item.url, it['anime']['id'],it['anime']['slug']),
|
||||
plot = it['anime']['plot'],
|
||||
action = 'findvideos')
|
||||
)
|
||||
if 'next_page_url' in fullJs:
|
||||
itemlist.append(item.clone(title=support.typo(support.config.get_localized_string(30992), 'color kod bold'),thumbnail=support.thumb(), url=fullJs['next_page_url']))
|
||||
return itemlist
|
||||
|
||||
|
||||
def peliculas(item):
|
||||
support.info()
|
||||
itemlist = []
|
||||
|
||||
page = item.page if item.page else 0
|
||||
item.args['offset'] = page * 30
|
||||
|
||||
order = support.config.get_setting('order', item.channel)
|
||||
if order:
|
||||
order_list = [ "Standard", "Lista A-Z", "Lista Z-A", "Popolarità", "Valutazione" ]
|
||||
item.args['order'] = order_list[order]
|
||||
|
||||
payload = json.dumps(item.args)
|
||||
records = httptools.downloadpage(host + '/archivio/get-animes', headers=headers, post=payload).json['records']
|
||||
# support.dbg()
|
||||
|
||||
for it in records:
|
||||
if not it['title']:
|
||||
it['title'] = ''
|
||||
lang = support.match(it['title'], patron=r'\(([It][Tt][Aa])\)').match
|
||||
title = support.re.sub(r'\s*\([^\)]+\)', '', it['title'])
|
||||
|
||||
if 'ita' in lang.lower(): language = 'ITA'
|
||||
else: language = 'Sub-ITA'
|
||||
|
||||
if title:
|
||||
itm = item.clone(title=support.typo(title,'bold') + support.typo(language,'_ [] color kod') + (support.typo(it['title_eng'],'_ ()') if it['title_eng'] else ''))
|
||||
else:
|
||||
itm = item.clone(title=support.typo(it['title_eng'],'bold') + support.typo(language,'_ [] color kod'))
|
||||
itm.contentLanguage = language
|
||||
itm.type = it['type']
|
||||
itm.thumbnail = it['imageurl']
|
||||
itm.plot = it['plot']
|
||||
itm.url = '{}/anime/{}-{}'.format(item.url, it.get('id'), it.get('slug'))
|
||||
|
||||
if it['episodes_count'] == 1:
|
||||
itm.contentType = 'movie'
|
||||
itm.fulltitle = itm.show = itm.contentTitle = title
|
||||
itm.contentSerieName = ''
|
||||
itm.action = 'findvideos'
|
||||
itm.scws_id = it['episodes'][0].get('scws_id', '')
|
||||
# itm.video_url = it['episodes'][0].get('link', '')
|
||||
|
||||
else:
|
||||
itm.contentType = 'tvshow'
|
||||
itm.contentTitle = ''
|
||||
itm.fulltitle = itm.show = itm.contentSerieName = title
|
||||
itm.action = 'episodios'
|
||||
itm.episodes = it['episodes'] if 'episodes' in it else it.get('scws_id', '')
|
||||
|
||||
itemlist.append(itm)
|
||||
|
||||
autorenumber.start(itemlist)
|
||||
if len(itemlist) >= 30:
|
||||
itemlist.append(item.clone(title=support.typo(support.config.get_localized_string(30992), 'color kod bold'), thumbnail=support.thumb(), page=page + 1))
|
||||
|
||||
return itemlist
|
||||
|
||||
def episodios(item):
|
||||
support.info()
|
||||
itemlist = []
|
||||
title = 'Parte' if item.type.lower() == 'movie' else 'Episodio'
|
||||
for it in item.episodes:
|
||||
itemlist.append(
|
||||
item.clone(title=support.typo('{}. {} {}'.format(it['number'], title, it['number']), 'bold'),
|
||||
episode = it['number'],
|
||||
fulltitle=item.title,
|
||||
show=item.title,
|
||||
contentTitle='',
|
||||
contentSerieName=item.contentSerieName,
|
||||
thumbnail=item.thumbnail,
|
||||
plot=item.plot,
|
||||
action='findvideos',
|
||||
contentType='episode',
|
||||
url = '{}/{}'.format(item.url, it['id'])
|
||||
)
|
||||
# video_url=it.get('link', ''))
|
||||
)
|
||||
|
||||
if inspect.stack(0)[1][3] not in ['find_episodes']:
|
||||
autorenumber.start(itemlist, item)
|
||||
support.videolibrary(itemlist, item)
|
||||
support.download(itemlist, item)
|
||||
return itemlist
|
||||
|
||||
|
||||
def findvideos(item):
|
||||
# if item.scws_id:
|
||||
# from time import time
|
||||
# from base64 import b64encode
|
||||
# from hashlib import md5
|
||||
#
|
||||
# client_ip = support.httptools.downloadpage('http://ip-api.com/json/').json.get('query')
|
||||
#
|
||||
# expires = int(time() + 172800)
|
||||
# token = b64encode(md5('{}{} Yc8U6r8KjAKAepEA'.format(expires, client_ip).encode('utf-8')).digest()).decode('utf-8').replace('=', '').replace('+', '-').replace('/', '_')
|
||||
#
|
||||
# url = 'https://scws.work/master/{}?token={}&expires={}&n=1'.format(item.scws_id, token, expires)
|
||||
#
|
||||
# itemlist = [item.clone(title=support.config.get_localized_string(30137), url=url, server='directo', action='play')]
|
||||
|
||||
from core import channeltools
|
||||
itemlist = [item.clone(title=channeltools.get_channel_parameters(item.channel)['title'],
|
||||
url=item.url, server='streamingcommunityws')]
|
||||
return support.server(item, itemlist=itemlist, referer=False)
|
||||
|
||||
# return support.server(item, itemlist=itemlist)
|
||||
|
||||
#
|
||||
# def play(item):
|
||||
# urls = list()
|
||||
# info = support.match(item.url, patron=r'(http.*?rendition=(\d+)[^\s]+)').matches
|
||||
#
|
||||
# if info:
|
||||
# for url, res in info:
|
||||
# urls.append(['hls [{}]'.format(res), url])
|
||||
# return urls
|
||||
21
channels/animeuniverse.json
Executable file
21
channels/animeuniverse.json
Executable file
@@ -0,0 +1,21 @@
|
||||
{
|
||||
"id": "animeuniverse",
|
||||
"name": "AnimeHDitalia",
|
||||
"active": false,
|
||||
"language": ["ita", "sub-ita"],
|
||||
"thumbnail": "animeuniverse.png",
|
||||
"banner": "animeuniverse.png",
|
||||
"categories": ["anime", "sub-ita"],
|
||||
"default_off": ["include_in_newest"],
|
||||
"settings": [
|
||||
{
|
||||
"id": "perpage",
|
||||
"type": "list",
|
||||
"label": "Elementi per pagina",
|
||||
"default": 3,
|
||||
"enabled": true,
|
||||
"visible": true,
|
||||
"lvalues": ["20","30","40","50","60","70","80","90","100"]
|
||||
}
|
||||
]
|
||||
}
|
||||
129
channels/animeuniverse.py
Executable file
129
channels/animeuniverse.py
Executable file
@@ -0,0 +1,129 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# ------------------------------------------------------------
|
||||
# Canale per animeuniverse
|
||||
# ----------------------------------------------------------
|
||||
|
||||
from core import support
|
||||
|
||||
host = support.config.get_channel_url()
|
||||
headers = {}
|
||||
|
||||
perpage_list = ['20','30','40','50','60','70','80','90','100']
|
||||
perpage = perpage_list[support.config.get_setting('perpage' , 'animeuniverse')]
|
||||
epPatron = r'<td>\s*(?P<title>[^<]+)[^>]+>[^>]+>\s*<a href="(?P<url>[^"]+)"[^>]+>\s*<img [^>]+Streaming'
|
||||
|
||||
|
||||
@support.menu
|
||||
def mainlist(item):
|
||||
anime=['/anime/',
|
||||
('Tipo',['', 'menu', 'Anime']),
|
||||
('Anno',['', 'menu', 'Anno']),
|
||||
('Genere', ['', 'menu','Genere']),
|
||||
('Ultimi Episodi',['/2/', 'peliculas', 'last']),
|
||||
('Hentai', ['/hentai/', 'peliculas'])]
|
||||
return locals()
|
||||
|
||||
|
||||
@support.scrape
|
||||
def menu(item):
|
||||
action = 'peliculas'
|
||||
patronBlock = item.args + r'</a>\s*<ul class="sub-menu">(?P<block>.*?)</ul>'
|
||||
patronMenu = r'<a href="(?P<url>[^"]+)">(?P<title>[^<]+)<'
|
||||
return locals()
|
||||
|
||||
|
||||
def search(item, texto):
|
||||
support.info(texto)
|
||||
item.search = texto
|
||||
try:
|
||||
return peliculas(item)
|
||||
# Continua la ricerca in caso di errore
|
||||
except:
|
||||
import sys
|
||||
for line in sys.exc_info():
|
||||
support.logger.error("%s" % line)
|
||||
return []
|
||||
|
||||
|
||||
def newest(categoria):
|
||||
support.info(categoria)
|
||||
item = support.Item()
|
||||
try:
|
||||
if categoria == "anime":
|
||||
item.url = host
|
||||
item.args = "last"
|
||||
return peliculas(item)
|
||||
# Continua la ricerca in caso di errore
|
||||
except:
|
||||
import sys
|
||||
for line in sys.exc_info():
|
||||
support.logger.error("{0}".format(line))
|
||||
return []
|
||||
|
||||
|
||||
@support.scrape
|
||||
def peliculas(item):
|
||||
query = ''
|
||||
if '/mos/' in item.url:
|
||||
item.contentType = 'movie'
|
||||
action='findvideos'
|
||||
elif item.args == 'last':
|
||||
query='cat%5D=1¤tquery%5Bcategory__not_in%5D%5B'
|
||||
searchtext=''
|
||||
item.contentType = 'episode'
|
||||
action='findvideos'
|
||||
else:
|
||||
item.contentType = 'tvshow'
|
||||
action='episodios'
|
||||
if item.search:
|
||||
query = 's'
|
||||
searchtext = item.search
|
||||
if not query:
|
||||
query='category_name'
|
||||
searchtext = item.url.split('/')[-2] if item.url != host else ''
|
||||
if not item.pag: item.pag = 1
|
||||
|
||||
anime=True
|
||||
# blacklist=['Altri Hentai']
|
||||
data = support.match(host + '/wp-content/themes/animeuniverse/functions/ajax.php', post='sorter=recent&location=&loop=main+loop&action=sort&numarticles='+perpage+'&paginated='+str(item.pag)+'¤tquery%5B'+query+'%5D='+searchtext+'&thumbnail=1').data.replace('\\','')
|
||||
patron=r'<a href="(?P<url>[^"]+)"><img width="[^"]+" height="[^"]+" src="(?P<thumb>[^"]+)" class="[^"]+" alt="" title="(?P<title>.*?)\s*(?P<lang>Sub ITA|ITA)?(?:"| \[)'
|
||||
|
||||
def itemlistHook(itemlist):
|
||||
if len(itemlist) == int(perpage):
|
||||
item.pag += 1
|
||||
itemlist.append(item.clone(title=support.typo(support.config.get_localized_string(30992), 'color kod bold'), action='peliculas'))
|
||||
return itemlist
|
||||
return locals()
|
||||
|
||||
|
||||
|
||||
|
||||
@support.scrape
|
||||
def episodios(item):
|
||||
anime = True
|
||||
pagination = int(perpage)
|
||||
patron = epPatron
|
||||
# debug = True
|
||||
return locals()
|
||||
|
||||
|
||||
def findvideos(item):
|
||||
itemlist = []
|
||||
if item.contentType == 'movie':
|
||||
matches = support.match(item, patron=epPatron).matches
|
||||
for title, url in matches:
|
||||
get_video_list(url, title, itemlist)
|
||||
else:
|
||||
get_video_list(item.url, support.config.get_localized_string(30137), itemlist)
|
||||
return support.server(item, itemlist=itemlist)
|
||||
|
||||
|
||||
def get_video_list(url, title, itemlist):
|
||||
from requests import get
|
||||
if not url.startswith('http'): url = host + url
|
||||
|
||||
url = support.match(get(url).url, string=True, patron=r'file=([^$]+)').match
|
||||
if 'http' not in url: url = 'http://' + url
|
||||
itemlist.append(support.Item(title=title, url=url, server='directo', action='play'))
|
||||
|
||||
return itemlist
|
||||
29
channels/animeworld.json
Executable file
29
channels/animeworld.json
Executable file
@@ -0,0 +1,29 @@
|
||||
{
|
||||
"id": "animeworld",
|
||||
"name": "AnimeWorld",
|
||||
"active": true,
|
||||
"language": ["ita", "sub-ita"],
|
||||
"thumbnail": "animeworld.png",
|
||||
"banner": "animeworld.png",
|
||||
"categories": ["anime", "vos"],
|
||||
"settings": [
|
||||
{
|
||||
"id": "lang",
|
||||
"type": "list",
|
||||
"label": "Lingua di Ricerca",
|
||||
"default": 0,
|
||||
"enabled": true,
|
||||
"visible": true,
|
||||
"lvalues": [ "Tutte", "Ita", "Sub-Ita"]
|
||||
},
|
||||
{
|
||||
"id": "order",
|
||||
"type": "list",
|
||||
"label": "Ordine di Visualizzazione",
|
||||
"default": 0,
|
||||
"enabled": true,
|
||||
"visible": true,
|
||||
"lvalues": [ "Standard", "Ultime Aggiunte", "Lista A-Z", "Lista A-Z", "Più Vecchi", "Più Recenti", "Più Visti" ]
|
||||
}
|
||||
]
|
||||
}
|
||||
196
channels/animeworld.py
Executable file
196
channels/animeworld.py
Executable file
@@ -0,0 +1,196 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# ------------------------------------------------------------
|
||||
# Canale per animeworld
|
||||
# thanks to fatshotty
|
||||
# ----------------------------------------------------------
|
||||
|
||||
from core import httptools, support, config, jsontools
|
||||
|
||||
host = support.config.get_channel_url()
|
||||
__channel__ = 'animeworld'
|
||||
cookie = support.config.get_setting('cookie', __channel__)
|
||||
headers = [['Cookie', cookie]]
|
||||
|
||||
|
||||
def get_cookie(data):
|
||||
global cookie, headers
|
||||
cookie = support.match(data, patron=r'document.cookie="([^\s]+)').match
|
||||
support.config.set_setting('cookie', cookie, __channel__)
|
||||
headers = [['Cookie', cookie]]
|
||||
|
||||
|
||||
def get_data(item):
|
||||
# support.dbg()
|
||||
url = httptools.downloadpage(item.url, headers=headers, follow_redirects=True, only_headers=True).url
|
||||
data = support.match(url, headers=headers, follow_redirects=True).data
|
||||
if 'SecurityAW' in data:
|
||||
get_cookie(data)
|
||||
data = get_data(item)
|
||||
return data
|
||||
|
||||
|
||||
def order():
|
||||
# Seleziona l'ordinamento dei risultati
|
||||
return str(support.config.get_setting("order", __channel__))
|
||||
|
||||
|
||||
@support.menu
|
||||
def mainlist(item):
|
||||
anime=['/filter?sort=',
|
||||
('ITA',['/filter?dub=1&sort=', 'menu', 'dub=1']),
|
||||
('SUB-ITA',['/filter?dub=0&sort=', 'menu', 'dub=0']),
|
||||
('In Corso', ['/ongoing', 'peliculas','noorder']),
|
||||
('Ultimi Episodi', ['/updated', 'peliculas', 'updated']),
|
||||
('Nuove Aggiunte',['/newest', 'peliculas','noorder' ]),
|
||||
('Generi',['/?d=1','genres',])]
|
||||
return locals()
|
||||
|
||||
|
||||
@support.scrape
|
||||
def genres(item):
|
||||
action = 'peliculas'
|
||||
data = get_data(item)
|
||||
|
||||
patronBlock = r'dropdown[^>]*>\s*Generi\s*<span.[^>]+>(?P<block>.*?)</ul>'
|
||||
patronMenu = r'<input.*?name="(?P<name>[^"]+)" value="(?P<value>[^"]+)"\s*>[^>]+>(?P<title>[^<]+)</label>'
|
||||
|
||||
def itemHook(item):
|
||||
item.url = host + '/filter?' + item.name + '=' + item.value + '&sort='
|
||||
return item
|
||||
return locals()
|
||||
|
||||
|
||||
@support.scrape
|
||||
def menu(item):
|
||||
action = 'submenu'
|
||||
data = get_data(item)
|
||||
patronMenu=r'<button[^>]+>\s*(?P<title>[A-Za-z0-9]+)\s*<span.[^>]+>(?P<other>.*?)</ul>'
|
||||
def itemlistHook(itemlist):
|
||||
itemlist.insert(0, item.clone(title=support.typo('Tutti','bold'), action='peliculas'))
|
||||
itemlist.append(item.clone(title=support.typo('Cerca...','bold'), action='search', search=True, thumbnail=support.thumb('search.png')))
|
||||
return itemlist
|
||||
return locals()
|
||||
|
||||
|
||||
@support.scrape
|
||||
def submenu(item):
|
||||
action = 'peliculas'
|
||||
data = item.other
|
||||
# debug=True
|
||||
patronMenu = r'<input.*?name="(?P<name>[^"]+)" value="(?P<value>[^"]+)"\s*>[^>]+>(?P<title>[^<]+)<\/label>'
|
||||
def itemHook(item):
|
||||
item.url = '{}/filter?{}={}&{}{}'.format(host, item.name, item.value, item.args, ('&sort=' if item.name != 'sort' else ''))
|
||||
return item
|
||||
return locals()
|
||||
|
||||
|
||||
def newest(categoria):
|
||||
support.info(categoria)
|
||||
item = support.Item()
|
||||
lang = config.get_setting('lang', channel=item.channel)
|
||||
try:
|
||||
if categoria == "anime":
|
||||
item.url = host
|
||||
item.args = "updated"
|
||||
return peliculas(item)
|
||||
# Continua la ricerca in caso di errore
|
||||
except:
|
||||
import sys
|
||||
for line in sys.exc_info():
|
||||
support.logger.error("{0}".format(line))
|
||||
return []
|
||||
|
||||
|
||||
def search(item, text):
|
||||
support.info(text)
|
||||
if item.search:
|
||||
item.url = '{}/filter?{}&keyword={}&sort='.format(host, item.args, text)
|
||||
else:
|
||||
lang = ['?', '?dub=1&', '?dub=0&'][config.get_setting('lang', channel=item.channel)]
|
||||
item.url = '{}/filter{}&keyword={}&sort='.format(host, lang, text)
|
||||
item.contentType = 'tvshow'
|
||||
try:
|
||||
return peliculas(item)
|
||||
# Continua la ricerca in caso di errore
|
||||
except:
|
||||
import sys
|
||||
for line in sys.exc_info():
|
||||
support.logger.error("%s" % line)
|
||||
return []
|
||||
|
||||
|
||||
@support.scrape
|
||||
def peliculas(item):
|
||||
data = get_data(item)
|
||||
anime = True
|
||||
if item.args not in ['noorder', 'updated'] and not item.url[-1].isdigit(): item.url += order() # usa l'ordinamento di configura canale
|
||||
data = get_data(item)
|
||||
|
||||
if item.args == 'updated':
|
||||
item.contentType='episode'
|
||||
patron=r'<div class="inner">\s*<a href="(?P<url>[^"]+)" class[^>]+>\s*<img.*?src="(?P<thumb>[^"]+)" alt?="(?P<title>[^\("]+)(?:\((?P<lang>[^\)]+)\))?"[^>]+>[^>]+>\s*(?:<div class="[^"]+">(?P<type>[^<]+)</div>)?(?:[^>]+>){2,4}\s*<div class="ep">[^\d]+(?P<episode>\d+)[^<]*</div>'
|
||||
action='findvideos'
|
||||
else:
|
||||
patron= r'<div class="inner">\s*<a href="(?P<url>[^"]+)" class[^>]+>\s*<img.*?src="(?P<thumb>[^"]+)" alt?="(?P<title>[^\("]+)(?:\((?P<year>\d+)\) )?(?:\((?P<lang>[^\)]+)\))?(?P<title2>[^"]+)?[^>]+>[^>]+>(?:\s*<div class="(?P<l>[^"]+)">[^>]+>)?\s*(?:<div class="[^"]+">(?P<type>[^<]+)</div>)?'
|
||||
action='episodios'
|
||||
|
||||
# Controlla la lingua se assente
|
||||
patronNext=r'<a href="([^"]+)" class="[^"]+" id="go-next'
|
||||
typeContentDict={'movie':['movie', 'special']}
|
||||
typeActionDict={'findvideos':['movie', 'special']}
|
||||
def itemHook(item):
|
||||
if not item.contentLanguage:
|
||||
if 'dub=1' in item.url or item.l == 'dub':
|
||||
item.contentLanguage = 'ITA'
|
||||
item.title += support.typo(item.contentLanguage,'_ [] color kod')
|
||||
else:
|
||||
item.contentLanguage = 'Sub-ITA'
|
||||
item.title += support.typo(item.contentLanguage,'_ [] color kod')
|
||||
return item
|
||||
return locals()
|
||||
|
||||
|
||||
@support.scrape
|
||||
def episodios(item):
|
||||
data = get_data(item)
|
||||
anime = True
|
||||
pagination = 50
|
||||
patronBlock= r'<div class="server\s*active\s*"(?P<block>.*?)(?:<div class="server|<link)'
|
||||
patron = r'<li[^>]*>\s*<a.*?href="(?P<url>[^"]+)"[^>]*>(?P<episode>[^-<]+)(?:-(?P<episode2>[^<]+))?'
|
||||
def itemHook(item):
|
||||
item.number = support.re.sub(r'\[[^\]]+\]', '', item.title)
|
||||
item.title += support.typo(item.fulltitle,'-- bold')
|
||||
return item
|
||||
action='findvideos'
|
||||
return locals()
|
||||
|
||||
|
||||
def findvideos(item):
|
||||
import time
|
||||
support.info(item)
|
||||
itemlist = []
|
||||
urls = []
|
||||
# resp = support.match(get_data(item), headers=headers, patron=r'data-name="(\d+)">([^<]+)<')
|
||||
resp = support.match(get_data(item), headers=headers, patron=r'data-name="(\d+)">([^<]+)<')
|
||||
data = resp.data
|
||||
|
||||
for ID, name in resp.matches:
|
||||
if not item.number: item.number = support.match(item.title, patron=r'(\d+) -').match
|
||||
match = support.match(data, patronBlock=r'data-name="' + ID + r'"[^>]+>(.*?)(?:<div class="(?:server|download)|link)', patron=r'data-id="([^"]+)" data-episode-num="' + (item.number if item.number else '1') + '"' + r'.*?href="([^"]+)"').match
|
||||
if match:
|
||||
epID, epurl = match
|
||||
# if 'vvvvid' in name.lower():
|
||||
# urls.append(support.match(host + '/api/episode/ugly/serverPlayerAnimeWorld?id=' + epID, headers=headers, patron=r'<a.*?href="([^"]+)"', debug=True).match)
|
||||
if 'animeworld' in name.lower():
|
||||
url = support.match(data, patron=r'href="([^"]+)"\s*id="alternativeDownloadLink"', headers=headers).match
|
||||
title = support.match(url, patron=r'http[s]?://(?:www.)?([^.]+)', string=True).match
|
||||
itemlist.append(item.clone(action="play", title=title, url=url, server='directo'))
|
||||
else:
|
||||
dataJson = support.match(host + '/api/episode/info?id=' + epID + '&alt=0', headers=headers).data
|
||||
json = jsontools.load(dataJson)
|
||||
|
||||
title = support.match(json['grabber'], patron=r'server\d+.([^.]+)', string=True).match
|
||||
if title: itemlist.append(item.clone(action="play", title=title, url=json['grabber'].split('=')[-1], server='directo'))
|
||||
else: urls.append(json['grabber'])
|
||||
# support.info(urls)
|
||||
return support.server(item, urls, itemlist)
|
||||
37
channels/aniplay.json
Executable file
37
channels/aniplay.json
Executable file
@@ -0,0 +1,37 @@
|
||||
{
|
||||
"id": "aniplay",
|
||||
"name": "AniPlay",
|
||||
"active": false,
|
||||
"language": ["ita", "sub-ita"],
|
||||
"thumbnail": "aniplay.png",
|
||||
"banner": "aniplay.png",
|
||||
"categories": ["anime", "vos"],
|
||||
"settings": [
|
||||
{
|
||||
"id": "sort",
|
||||
"type": "list",
|
||||
"label": "Ordine di Visualizzazione",
|
||||
"default": 0,
|
||||
"enabled": true,
|
||||
"visible": true,
|
||||
"lvalues": [ "Popolarità", "Titolo", "Numero Episodi", "Data di inizio", "Data di fine", "Data di aggiunta"]
|
||||
},
|
||||
{
|
||||
"id": "order",
|
||||
"type": "bool",
|
||||
"label": "Visualizza in ordine Discendente?",
|
||||
"default": false,
|
||||
"enabled": true,
|
||||
"visible": true
|
||||
},
|
||||
{
|
||||
"id": "perpage",
|
||||
"type": "list",
|
||||
"label": "Numero di elementi per pagina",
|
||||
"default": 1,
|
||||
"enabled": true,
|
||||
"visible": true,
|
||||
"lvalues": ["10", "20", "30", "40", "50", "60", "80", "90"]
|
||||
}
|
||||
]
|
||||
}
|
||||
331
channels/aniplay.py
Executable file
331
channels/aniplay.py
Executable file
@@ -0,0 +1,331 @@
|
||||
from platformcode import config, logger, autorenumber
|
||||
from core import httptools, scrapertools, support, tmdb, jsontools
|
||||
from inspect import stack
|
||||
|
||||
import sys
|
||||
if sys.version_info[0] >= 3:
|
||||
from concurrent import futures
|
||||
else:
|
||||
from concurrent_py2 import futures
|
||||
|
||||
host = config.get_channel_url()
|
||||
sort = ['views', 'title', 'episodeNumber', 'startDate', 'endDate', 'createdDate'][config.get_setting('sort', 'aniplay')]
|
||||
order = 'asc' if config.get_setting('order', 'aniplay') else 'desc'
|
||||
perpage = [10, 20, 30 ,40, 50, 60, 70, 80, 90][config.get_setting('perpage', 'aniplay')]
|
||||
|
||||
|
||||
@support.menu
|
||||
def mainlist(item):
|
||||
anime=['/api/anime/advanced-search',
|
||||
('A-Z', ['/api/anime/advanced-search', 'submenu_az', '']),
|
||||
('Anno', ['', 'submenu_year', '']),
|
||||
('Top', ['', 'submenu_top', '']),
|
||||
('Ultimi aggiunti', ['', 'latest_added', ''])]
|
||||
return locals()
|
||||
|
||||
|
||||
def submenu_az(item):
|
||||
itemlist = []
|
||||
for letter in ['0-9'] + list('ABCDEFGHIJKLMNOPQRSTUVWXYZ'):
|
||||
itemlist.append(item.clone(title = support.typo(letter, 'bold'),
|
||||
url= host + '/api/anime/find-by-char',
|
||||
action= 'peliculas',
|
||||
variable= '&character=' + letter,
|
||||
thumbnail=support.thumb('az')))
|
||||
return itemlist
|
||||
|
||||
|
||||
def submenu_year(item):
|
||||
itemlist = []
|
||||
from datetime import date
|
||||
current = date.today().year
|
||||
first = int(httptools.downloadpage('{}/api/anime/advanced-search?page=0&size=1&sort=startDate,asc&sort=id'.format(host)).json[0]['startDate'].split('-')[0]) -1
|
||||
for year in range(current, first, -1):
|
||||
itemlist.append(item.clone(title = support.typo(year, 'bold'),
|
||||
action= 'submenu_season',
|
||||
variable= year,
|
||||
thumbnail=support.thumb('year')))
|
||||
return itemlist
|
||||
|
||||
|
||||
def submenu_top(item):
|
||||
itemlist = []
|
||||
links = {'Top del giorno':'daily-top', 'Top della settimana':'weekly-top', 'Top del mese':'monthly-top'}
|
||||
for label in links:
|
||||
link = links[label]
|
||||
itemlist.append(item.clone(title = support.typo(label, 'bold'),
|
||||
action= 'submenu_top_of',
|
||||
variable= link))
|
||||
return itemlist
|
||||
|
||||
|
||||
def submenu_season(item):
|
||||
itemlist = []
|
||||
seasons = {'winter':'Inverno', 'spring':'Primavera', 'summer':'Estate', 'fall':'Autunno'}
|
||||
url= '{}/api/seasonal-view?page=0&size=36&years={}'.format(host, item.variable)
|
||||
js = httptools.downloadpage(url).json[0]['seasonalAnime']
|
||||
for season in js:
|
||||
s = season['season'].split('.')[-1]
|
||||
title = seasons[s]
|
||||
itemlist.append(item.clone(title=title,
|
||||
url = '{}/api/seasonal-view/{}-{}'.format(host, s, item.variable),
|
||||
thumbnail = support.thumb(s),
|
||||
action = 'peliculas',
|
||||
variable=''))
|
||||
return itemlist
|
||||
|
||||
|
||||
def submenu_top_of(item):
|
||||
itemlist = []
|
||||
url= '{}/api/home/{}'.format(host, item.variable)
|
||||
js = httptools.downloadpage(url).json
|
||||
for anime in js:
|
||||
fulltitle = anime['animeTitle']
|
||||
title = fulltitle.split('(')[0].strip()
|
||||
scrapedlang = scrapertools.find_single_match(fulltitle, r'\(([^\)]+)')
|
||||
lang = scrapedlang.upper() if scrapedlang else 'Sub-ITA'
|
||||
long_title = support.typo(title, 'bold') + support.typo(lang, '_ [] color kod')
|
||||
|
||||
itemlist.append(item.clone(title=long_title,
|
||||
url = '{}/anime/{}'.format(host, anime['animeId']),
|
||||
video_url = '{}/api/anime/{}'.format(host, anime['animeId']),
|
||||
thumbnail = get_thumbnail(anime, 'animeHorizontalImages'),
|
||||
action = 'episodios',
|
||||
variable=anime['animeId']))
|
||||
return itemlist
|
||||
|
||||
|
||||
def search(item, texto):
|
||||
support.info(texto)
|
||||
item.url = host + '/api/anime/advanced-search'
|
||||
item.variable = '&query=' + texto
|
||||
|
||||
try:
|
||||
return peliculas(item)
|
||||
# Continua la ricerca in caso di errore
|
||||
except:
|
||||
import sys
|
||||
for line in sys.exc_info():
|
||||
support.logger.error("%s" % line)
|
||||
return []
|
||||
|
||||
|
||||
def newest(categoria):
|
||||
support.info(categoria)
|
||||
item = support.Item()
|
||||
try:
|
||||
if categoria == "anime":
|
||||
return latest_added(item)
|
||||
# Continua la ricerca in caso di errore
|
||||
except:
|
||||
import sys
|
||||
for line in sys.exc_info():
|
||||
support.logger.error("{0}".format(line))
|
||||
return []
|
||||
|
||||
|
||||
def latest_added(item):
|
||||
itemlist = []
|
||||
page = item.page if item.page else 0
|
||||
url= '{}/api/home/latest-episodes?page={}'.format(host, page)
|
||||
js = httptools.downloadpage(url).json
|
||||
|
||||
for episode in js:
|
||||
title = episode['title'] if episode['title'] else ''
|
||||
animeTitle, lang = get_lang(episode['animeTitle'])
|
||||
quality = 'Full HD' if episode['fullHd'] else 'HD'
|
||||
long_title = support.typo('{}. {}{}'.format(int(float(episode['episodeNumber'])), title + ' - ' if title else '', animeTitle), 'bold') + support.typo(lang, '_ [] color kod') + support.typo(quality, '_ [] color kod')
|
||||
image = get_thumbnail(episode, 'episodeImages')
|
||||
|
||||
itemlist.append(item.clone(title=long_title,
|
||||
fulltitle=title,
|
||||
url='{}/play/{}'.format(host, episode['id']),
|
||||
contentType = 'episode',
|
||||
contentTitle = title,
|
||||
contentSerieName = animeTitle,
|
||||
contentLanguage = lang,
|
||||
quality = quality,
|
||||
contentEpisodeNumber = int(float(episode['episodeNumber'])),
|
||||
video_url = '{}/api/episode/{}'.format(host, episode['id']),
|
||||
thumbnail = image,
|
||||
fanart = image,
|
||||
action = 'findvideos'))
|
||||
|
||||
if stack()[1][3] not in ['newest']:
|
||||
support.nextPage(itemlist, item.clone(page = page + 1))
|
||||
|
||||
return itemlist
|
||||
|
||||
|
||||
def peliculas(item):
|
||||
logger.debug()
|
||||
|
||||
itemlist = []
|
||||
page = item.page if item.page else 0
|
||||
js = httptools.downloadpage('{}?page={}&size={}{}&sort={},{}&sort=id'.format(item.url, page, perpage, item.variable, sort, order)).json
|
||||
|
||||
for it in js:
|
||||
logger.debug(jsontools.dump(js))
|
||||
title, lang = get_lang(it['title'])
|
||||
|
||||
long_title = support.typo(title, 'bold') + support.typo(lang, '_ [] color kod')
|
||||
|
||||
itemlist.append(item.clone(title = long_title,
|
||||
fulltitle = title,
|
||||
show = title,
|
||||
contentLanguage = lang,
|
||||
contentType = 'movie' if it['type'] == 'Movie' else 'tvshow',
|
||||
contentTitle = title,
|
||||
contentSerieName = title if it['type'] == 'Serie' else '',
|
||||
action ='findvideos' if it['type'] == 'Movie' else 'episodios',
|
||||
plot = it['storyline'],
|
||||
url = '{}/anime/{}'.format(host, it['id']),
|
||||
video_url = '{}/api/anime/{}'.format(host, it.get('animeId', it.get('id'))),
|
||||
thumbnail = get_thumbnail(it),
|
||||
fanart = get_thumbnail(it, 'horizontalImages')))
|
||||
|
||||
autorenumber.start(itemlist)
|
||||
tmdb.set_infoLabels_itemlist(itemlist, seekTmdb=True)
|
||||
|
||||
if len(itemlist) == perpage:
|
||||
support.nextPage(itemlist, item.clone(page = page + 1))
|
||||
return itemlist
|
||||
|
||||
|
||||
def episodios(item):
|
||||
logger.debug()
|
||||
itemlist = []
|
||||
if not item.video_url:
|
||||
item.video_url = item.url.replace('/anime/', '/api/anime/')
|
||||
# url = '{}/api/anime/{}'.format(host, item.id)
|
||||
json = httptools.downloadpage(item.video_url, CF=False ).json
|
||||
|
||||
if type(json) == list:
|
||||
item.show_renumber = False
|
||||
itemlist = list_episodes(item, json)
|
||||
|
||||
elif json.get('seasons'):
|
||||
seasons = json['seasons']
|
||||
seasons.sort(key=lambda s: s['episodeStart'])
|
||||
|
||||
for it in seasons:
|
||||
title = it['name']
|
||||
|
||||
itemlist.append(item.clone(title = title,
|
||||
video_url = '{}/api/anime/{}/season/{}'.format(host, it['animeId'], it['id']),
|
||||
contentType = 'season',
|
||||
action = 'list_episodes',
|
||||
plot = json['storyline'],
|
||||
year = it['yearStart'],
|
||||
show_renumber = True))
|
||||
|
||||
# If the call come from the videolibrary or autorenumber, shows the episodes
|
||||
if stack()[1][3] in ['add_tvshow', 'get_episodes', 'update', 'find_episodes']:
|
||||
itlist = []
|
||||
with futures.ThreadPoolExecutor() as executor:
|
||||
eplist = []
|
||||
for ep in itemlist:
|
||||
ep.show_renumber = False
|
||||
eplist.append(executor.submit(list_episodes, ep))
|
||||
for res in futures.as_completed(eplist):
|
||||
if res.result():
|
||||
itlist.extend(res.result())
|
||||
itemlist = itlist
|
||||
elif json.get('episodes'):
|
||||
itemlist = list_episodes(item, json)
|
||||
|
||||
# add renumber option
|
||||
if stack()[1][3] not in ['find_episodes'] and itemlist and itemlist[0].contentType == 'episode':
|
||||
autorenumber.start(itemlist, item)
|
||||
|
||||
# add add to videolibrary menu
|
||||
if stack()[1][3] not in ['add_tvshow', 'get_episodes', 'update', 'find_episodes']:
|
||||
support.videolibrary(itemlist, item)
|
||||
|
||||
return itemlist
|
||||
|
||||
|
||||
def list_episodes(item, json=None):
|
||||
itemlist = []
|
||||
|
||||
if not json:
|
||||
json = httptools.downloadpage(item.video_url, CF=False ).json
|
||||
|
||||
episodes = json['episodes'] if 'episodes' in json else json
|
||||
episodes.sort(key=lambda ep: int(ep['episodeNumber'].split('.')[0]))
|
||||
|
||||
for it in episodes:
|
||||
quality = 'Full HD' if it['fullHd'] else 'HD'
|
||||
|
||||
if item.contentSeason:
|
||||
episode = '{}x{:02d}'.format(item.contentSeason, int(it['episodeNumber'].split('.')[0]))
|
||||
else:
|
||||
episode = '{:02d}'.format(int(it['episodeNumber'].split('.')[0]))
|
||||
|
||||
title = support.typo('{}. {}'.format(episode, it['title']), 'bold')
|
||||
image = get_thumbnail(it, 'episodeImages')
|
||||
|
||||
itemlist.append(item.clone(title = title,
|
||||
url= '{}/play/{}'.format(host, it['id']),
|
||||
video_url= '{}/api/episode/{}'.format(host, it['id']),
|
||||
contentType = 'episode',
|
||||
contentEpisodeNumber = int(it['episodeNumber'].split('.')[0]),
|
||||
contentSeason = item.contentSeason if item.contentSeason else '',
|
||||
action = 'findvideos',
|
||||
quality = quality,
|
||||
thumbnail = image,
|
||||
fanart= image))
|
||||
|
||||
# Renumber episodes only if shown in the menu
|
||||
if item.show_renumber:
|
||||
autorenumber.start(itemlist, item)
|
||||
|
||||
return itemlist
|
||||
|
||||
|
||||
def findvideos(item):
|
||||
logger.debug()
|
||||
|
||||
res = httptools.downloadpage(item.video_url, CF=False ).json
|
||||
|
||||
if res.get('episodes', []):
|
||||
res = httptools.downloadpage('{}/api/episode/{}'.format(host, res['episodes'][0]['id'])).json
|
||||
|
||||
item.url = res['videoUrl']
|
||||
item.server = 'directo'
|
||||
|
||||
if '.m3u' in item.url:
|
||||
item.manifest = 'hls'
|
||||
|
||||
return support.server(item, itemlist=[item])
|
||||
|
||||
|
||||
def get_thumbnail(data, prop = 'verticalImages', key = 'full'):
|
||||
"""
|
||||
" Returns the vertical image as per given key and prop
|
||||
" possibile key values are:
|
||||
" - small
|
||||
" - full
|
||||
" - blurred
|
||||
" - medium
|
||||
" possibile prop values are:
|
||||
" - verticalImages
|
||||
" - animeHorizontalImages
|
||||
" - animeVerticalImages
|
||||
" - horizontalImages
|
||||
" - episodeImages
|
||||
"""
|
||||
value = None
|
||||
verticalImages = data.get(prop, [])
|
||||
if verticalImages:
|
||||
first = verticalImages[0]
|
||||
if first:
|
||||
value = first.get('image' + key.capitalize(), '')
|
||||
return value
|
||||
|
||||
|
||||
def get_lang(value):
|
||||
title = value.split('(')[0] if value else ''
|
||||
scrapedlang = scrapertools.find_single_match(value, r'\(([^\)]+)')
|
||||
lang = scrapedlang.upper() if scrapedlang else 'Sub-ITA'
|
||||
return title, lang
|
||||
11
channels/casacinema.json
Executable file
11
channels/casacinema.json
Executable file
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"id": "casacinema",
|
||||
"name": "Casacinema",
|
||||
"language": ["ita", "sub-ita"],
|
||||
"active": false,
|
||||
"thumbnail": "casacinema.png",
|
||||
"banner": "casacinema.png",
|
||||
"categories": ["tvshow", "movie","vos"],
|
||||
"settings": [
|
||||
]
|
||||
}
|
||||
145
channels/casacinema.py
Executable file
145
channels/casacinema.py
Executable file
@@ -0,0 +1,145 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# ------------------------------------------------------------
|
||||
# Canale per 'casacinema'
|
||||
# ------------------------------------------------------------
|
||||
|
||||
|
||||
from core import support
|
||||
|
||||
host = support.config.get_channel_url()
|
||||
headers = [['Referer', host]]
|
||||
|
||||
|
||||
@support.menu
|
||||
def mainlist(item):
|
||||
film = ['/category/film',
|
||||
('Generi', ['', 'genres', 'genres']),
|
||||
]
|
||||
|
||||
tvshow = ['/category/serie-tv',
|
||||
('Novità', ['/aggiornamenti-serie-tv', 'peliculas', '']),
|
||||
]
|
||||
|
||||
search = ''
|
||||
|
||||
return locals()
|
||||
|
||||
|
||||
@support.scrape
|
||||
def genres(item):
|
||||
action = 'peliculas'
|
||||
blacklist = ['PRIME VISIONI', 'ULTIME SERIE TV', 'ULTIMI FILM']
|
||||
patronMenu = r'<li><a href="(?P<url>[^"]+)">(?P<title>[^<>]+)</a></li>'
|
||||
patronBlock = r'<div class="container home-cats">(?P<block>.*?)<div class="clear">'
|
||||
return locals()
|
||||
|
||||
|
||||
def check(item):
|
||||
item.data = support.match(item).data
|
||||
if 'episodi e stagioni' in item.data.lower():
|
||||
support.info('select = ### è una serie ###')
|
||||
item.contentType = 'tvshow'
|
||||
return episodios(item)
|
||||
else:
|
||||
support.info('select = ### è un film ###')
|
||||
item.contentType = 'movie'
|
||||
return findvideos(item)
|
||||
|
||||
|
||||
def search(item, text):
|
||||
support.info(text)
|
||||
text = text.replace(' ', '+')
|
||||
item.url = host + '/?a=b&s=' + text
|
||||
item.args = 'search'
|
||||
try:
|
||||
return peliculas(item)
|
||||
|
||||
except:
|
||||
import sys
|
||||
for line in sys.exc_info():
|
||||
support.info('search log:', line)
|
||||
return []
|
||||
|
||||
|
||||
def newest(categoria):
|
||||
itemlist = []
|
||||
item = support.Item()
|
||||
item.args = 'newest'
|
||||
|
||||
try:
|
||||
if categoria == 'series':
|
||||
item.contentType = 'tvshow'
|
||||
item.url = host+'/aggiornamenti-serie-tv'
|
||||
|
||||
else:
|
||||
item.contentType = 'movie'
|
||||
item.url = host+'/category/film'
|
||||
|
||||
item.action = 'peliculas'
|
||||
itemlist = peliculas(item)
|
||||
|
||||
if itemlist[-1].action == 'peliculas':
|
||||
itemlist.pop()
|
||||
|
||||
# Continua la ricerca in caso di errore
|
||||
except:
|
||||
import sys
|
||||
for line in sys.exc_info():
|
||||
support.info("%s" % line)
|
||||
return []
|
||||
|
||||
return itemlist
|
||||
|
||||
|
||||
@support.scrape
|
||||
def peliculas(item):
|
||||
if item.contentType == 'movie':
|
||||
action = 'findvideos'
|
||||
elif item.contentType == 'tvshow':
|
||||
action = 'episodios'
|
||||
pagination = ''
|
||||
else:
|
||||
action = 'check'
|
||||
|
||||
if item.args == 'newest':
|
||||
patron = r'<li><a href="(?P<url>[^"]+)"[^=]+="(?P<thumb>[^"]+)"><div>\s*?<div[^>]+>(?P<title>[^\(\[<]+)(?:\[(?P<quality1>HD)\])?[ ]?(?:\(|\[)?(?P<lang>[sS]ub-[iI][tT][aA])?(?:\)|\])?[ ]?(?:\[(?P<quality>.+?)\])?[ ]?(?:\((?P<year>\d+)\))?<(?:[^>]+>.+?(?:title="Nuovi episodi">(?P<episode>\d+x\d+)[ ]?(?P<lang2>Sub-Ita)?|title="IMDb">(?P<rating>[^<]+)))?'
|
||||
else:
|
||||
patron = r'<li><a href="(?P<url>[^"]+)"[^=]+="(?P<thumb>[^"]+)"><div>\s*?<div[^>]+>(?P<title>[^\(\[<]+)(?P<title2>\([\D*]+\))?(?:\[(?P<quality1>HD)\])?\s?(?:[\(\[])?(?P<lang>[sS]ub-[iI][tT][aA])?(?:[\)\]])?\s?(?:\[(?P<quality>.+?)\])?\s?(?:\((?P<year>\d+)\))?(?:\(\D{2}\s\d{4}\))?<'
|
||||
|
||||
patronNext = r'<a href="([^"]+)"\s*>Pagina'
|
||||
|
||||
|
||||
def itemHook(item):
|
||||
if item.quality1:
|
||||
item.quality = item.quality1
|
||||
item.title += support.typo(item.quality, '_ [] color kod')
|
||||
if item.lang2:
|
||||
item.contentLanguage = item.lang2
|
||||
item.title += support.typo(item.lang2, '_ [] color kod')
|
||||
if item.args == 'novita':
|
||||
item.title = item.title
|
||||
|
||||
return item
|
||||
return locals()
|
||||
|
||||
|
||||
@support.scrape
|
||||
def episodios(item):
|
||||
if item.data:
|
||||
data = item.data
|
||||
action = 'findvideos'
|
||||
item.contentType = 'tvshow'
|
||||
blacklist = ['']
|
||||
patron = r'"season-no">(?P<season>\d+)x(?P<episode>\d+)(?:[^>]+>){5}\s*(?P<title>[^<]+)(?P<data>.*?)</table>'
|
||||
patronBlock = r'<span>(?:.+?Stagione*.+?(?P<lang>[Ii][Tt][Aa]|[Ss][Uu][Bb][\-]?[iI][tT][aA]))?.*?</span>.*?class="content(?P<block>.*?)(?:"accordion-item|<script>)'
|
||||
return locals()
|
||||
|
||||
|
||||
def findvideos(item):
|
||||
if item.contentType != 'movie':
|
||||
links = support.match(item.data, patron=r'href="([^"]+)"').matches
|
||||
else:
|
||||
matchData = item.data if item.data else support.match(item.url, headers=headers).data
|
||||
links = support.match(matchData, patron=r'data-id="([^"]+)"').matches
|
||||
|
||||
return support.server(item, links)
|
||||
10
channels/cb01anime.json
Executable file
10
channels/cb01anime.json
Executable file
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"id": "cb01anime",
|
||||
"name": "Cb01anime",
|
||||
"language": ["ita", "vos", "sub-ita"],
|
||||
"active": false,
|
||||
"thumbnail": "cb01anime.png",
|
||||
"banner": "cb01anime.png",
|
||||
"categories": ["anime"],
|
||||
"settings": []
|
||||
}
|
||||
139
channels/cb01anime.py
Executable file
139
channels/cb01anime.py
Executable file
@@ -0,0 +1,139 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# ------------------------------------------------------------
|
||||
# XBMC Plugin
|
||||
# Canale per cineblog01 - anime
|
||||
# ------------------------------------------------------------
|
||||
|
||||
from core import support
|
||||
|
||||
host = support.config.get_channel_url() + '/cb01-anime-cartoon'
|
||||
|
||||
Blacklist = ['AVVISO IMPORTANTE – CB01.ROCKS', 'Lista Alfabetica Completa Anime/Cartoon', 'CB01.UNO ▶ TROVA L’INDIRIZZO UFFICIALE','Lista Richieste Up & Re-Up']
|
||||
|
||||
|
||||
headers = [['Referer', host]]
|
||||
|
||||
@support.menu
|
||||
def mainlist(item):
|
||||
anime = [('Genere',['','menu', '2']),
|
||||
('Per Lettera',['','menu', '1']),
|
||||
('Per Anno',['','menu', '3']),
|
||||
('Ultimi Anime Aggiornati',['','peliculas', 'newest'])]
|
||||
return locals()
|
||||
|
||||
|
||||
@support.scrape
|
||||
def menu(item):
|
||||
blacklist = ['Anime per Genere', 'Anime per Anno', 'Anime per Lettera']
|
||||
patronBlock = r'<select name="select%s"(?P<block>.*?)</select>' % item.args
|
||||
patronMenu = r'<option value="(?P<url>[^"]+)">(?P<title>[^<]+)</option>'
|
||||
action = 'peliculas'
|
||||
def itemHook(item):
|
||||
item.url = item.url.replace('cb01-anime/','cb01-anime-cartoon/')
|
||||
return item
|
||||
return locals()
|
||||
|
||||
|
||||
def search(item, texto):
|
||||
support.info(texto)
|
||||
item.url = host + "/search/" + texto
|
||||
try:
|
||||
return peliculas(item)
|
||||
except:
|
||||
import sys
|
||||
for line in sys.exc_info():
|
||||
support.info('search log:', line)
|
||||
return []
|
||||
|
||||
|
||||
def newest(categoria):
|
||||
support.info(categoria)
|
||||
itemlist = []
|
||||
item = support.Item()
|
||||
try:
|
||||
if categoria == "anime":
|
||||
item.url = host
|
||||
item.args = 'newest'
|
||||
itemlist = peliculas(item)
|
||||
# Continua la ricerca in caso di errore
|
||||
except:
|
||||
import sys
|
||||
for line in sys.exc_info():
|
||||
support.logger.error("{0}".format(line))
|
||||
return []
|
||||
|
||||
return itemlist
|
||||
|
||||
@support.scrape
|
||||
def peliculas(item):
|
||||
# debug=True
|
||||
blacklist = Blacklist
|
||||
item.contentType = 'tvshow'
|
||||
if item.args == 'newest':
|
||||
patron = r'<div id="blockvids">\s*<ul>\s*<li>\s*<a href="(?P<url>[^"]+)"[^>]+><img[^>]+src="(?P<thumb>[^"]+)"[^>]*>(?:[^>]+>){4}(?P<title>[^\[]+)\[(?P<lang>[^\]]+)\]'
|
||||
else:
|
||||
patron = r'<div class="span4">\s*<a href="(?P<url>[^"]+)"><img src="(?P<thumb>[^"]+)"[^>]+><\/a>(?:[^>]+>){7}\s*<h1>(?P<title>[^<\[]+)(?:\[(?P<lang>[^\]]+)\])?</h1></a>.*?-->(?:.*?<br(?: /)?>)?\s*(?P<plot>[^<]+)'
|
||||
patronNext = r'<link rel="next" href="([^"]+)"'
|
||||
action = 'check'
|
||||
return locals()
|
||||
|
||||
def check(item):
|
||||
# support.dbg()
|
||||
item.url = support.match(item, patron=r'(?:<p>|/>)(.*?)(?:<br|</td>|</p>)', patronBlock=r'Streaming:(.*?)</tr>').matches
|
||||
if 'Episodio' in str(item.url):
|
||||
item.contentType = 'tvshow'
|
||||
item.action ='episodios'
|
||||
return episodios(item)
|
||||
else:
|
||||
item.contentType = 'movie'
|
||||
item.action = 'findvideos'
|
||||
return findvideos(item)
|
||||
|
||||
@support.scrape
|
||||
def episodios(item):
|
||||
support.info('EPISODIOS ', item.data)
|
||||
data = ''
|
||||
matches = item.data
|
||||
season = 1
|
||||
s = 1
|
||||
e = 0
|
||||
sp = 0
|
||||
|
||||
for match in item.url:
|
||||
if 'stagione' in match.lower():
|
||||
find_season = support.match(match, patron=r'Stagione\s*(\d+)').match
|
||||
season = int(find_season) if find_season else season + 1 if 'prima' not in match.lower() else season
|
||||
else:
|
||||
try: title = support.match(match, patron=r'<a[^>]+>([^<]+)</a>').match
|
||||
except: title = ''
|
||||
if title:
|
||||
if 'episodio' in title.lower():
|
||||
ep = support.match(match, patron=r'Episodio ((?:\d+.\d|\d+|\D+))').match
|
||||
check = ep.isdigit()
|
||||
if check or '.' in ep:
|
||||
if '.' in ep:
|
||||
sp += 1
|
||||
title = '0' + 'x' + str(sp).zfill(2) + ' - ' + title
|
||||
else:
|
||||
ep = int(ep)
|
||||
if season > s and ep > 1:
|
||||
s += 1
|
||||
e = ep - 1
|
||||
title = str(season) + 'x' + str(ep-e).zfill(2) + ' - ' + title
|
||||
data += title + '|' + match + '\|'
|
||||
else:
|
||||
title += ' #movie'
|
||||
data += title + '|' + match + '\|'
|
||||
def itemHook(item):
|
||||
if '#movie' in item.title:
|
||||
item.contentType='movie'
|
||||
item.title = item.title.replace(' #movie','')
|
||||
return item
|
||||
|
||||
patron = r'(?P<title>[^\|]+)\|(?P<url>[^\|]+)\|'
|
||||
action = 'findvideos'
|
||||
return locals()
|
||||
|
||||
def findvideos(item):
|
||||
return support.server(item, item.url)
|
||||
|
||||
10
channels/cineblog01.json
Executable file
10
channels/cineblog01.json
Executable file
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"id": "cineblog01",
|
||||
"name": "CB01",
|
||||
"language": ["ita", "sub-ita"],
|
||||
"active": true,
|
||||
"thumbnail": "cb01.png",
|
||||
"banner": "cb01.png",
|
||||
"categories": ["tvshow", "movie", "vos", "documentary"],
|
||||
"settings": []
|
||||
}
|
||||
242
channels/cineblog01.py
Executable file
242
channels/cineblog01.py
Executable file
@@ -0,0 +1,242 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# ------------------------------------------------------------
|
||||
# Canale per cineblog01
|
||||
# ------------------------------------------------------------
|
||||
import re
|
||||
|
||||
from core import scrapertools, httptools, servertools, support
|
||||
from platformcode import logger, config
|
||||
|
||||
|
||||
def findhost(url):
|
||||
host = httptools.downloadpage(url, follow_redirect=True).url
|
||||
if host == 'https://cb01.uno/':
|
||||
host = support.match(host, patron=r'<a href="([^"]+)').match
|
||||
return host
|
||||
|
||||
|
||||
host = config.get_channel_url(findhost)
|
||||
headers = [['Referer', host]]
|
||||
|
||||
|
||||
@support.menu
|
||||
def mainlist(item):
|
||||
film = [
|
||||
('HD', ['', 'menu', 'Film HD Streaming']),
|
||||
('Genere', ['', 'menu', 'Film per Genere']),
|
||||
('Anni', ['', 'menu', 'Film per Anno']),
|
||||
('Popolari per Genere', ['', 'menu', 'Film Popolari']),
|
||||
('Ultimi Aggiunti', ['/ultimi-100-film-aggiunti/', 'peliculas', 'newest']),
|
||||
('Popolari', ['/category/film-popolari/']),
|
||||
('Italiani', ['/category/nazione/italia/'])
|
||||
# ('Film in Lista', ['/lista-film/', 'peliculas', 'newest'])
|
||||
]
|
||||
tvshow = ['/serietv/',
|
||||
('Per Lettera', ['/serietv/', 'menu', 'Serie-TV x Lettera']),
|
||||
('Per Genere', ['/serietv/', 'menu', 'Serie-TV x Genere']),
|
||||
('Per anno', ['/serietv/', 'menu', 'Serie-TV x Anno']),
|
||||
('Ultime Aggiunte', ['/serietv/ultime-100-serie-tv-aggiunte/', 'peliculas', 'newest'])
|
||||
]
|
||||
docu = [('Documentari {bullet bold}', ['/category/documentario/', 'peliculas']),
|
||||
('HD {submenu} {documentari}', ['/category/hd-alta-definizione/documentario-hd/', 'peliculas'])
|
||||
]
|
||||
|
||||
return locals()
|
||||
|
||||
|
||||
@support.scrape
|
||||
def menu(item):
|
||||
# debug = True
|
||||
patronBlock = item.args + r'<span.*?><\/span>.*?<ul.*?>(?P<block>.*?)<\/ul>'
|
||||
patronMenu = r'href="?(?P<url>[^">]+)"?[^>]+>(?P<title>[^<»]+)'
|
||||
action = 'peliculas'
|
||||
|
||||
return locals()
|
||||
|
||||
|
||||
def newest(categoria):
|
||||
support.info(categoria)
|
||||
|
||||
item = support.Item()
|
||||
try:
|
||||
if categoria == "series":
|
||||
item.contentType = 'tvshow'
|
||||
item.url = host + '/serietv/' # aggiornamento-quotidiano-serie-tv/'
|
||||
else:
|
||||
item.contentType = 'movie'
|
||||
item.url = host + '/ultimi-100-film-aggiunti/'
|
||||
item.args = "newest"
|
||||
return peliculas(item)
|
||||
# Continua la ricerca in caso di errore
|
||||
except:
|
||||
import sys
|
||||
for line in sys.exc_info():
|
||||
logger.error("{0}".format(line))
|
||||
return []
|
||||
|
||||
|
||||
def search(item, text):
|
||||
logger.info("search", text)
|
||||
if item.contentType == 'tvshow': item.url = host + '/serietv'
|
||||
else: item.url = host
|
||||
try:
|
||||
item.url = item.url + "/search/" + text.replace(' ', '+')
|
||||
return peliculas(item)
|
||||
|
||||
# Continua la ricerca in caso di errore
|
||||
except:
|
||||
import sys
|
||||
for line in sys.exc_info():
|
||||
logger.error("%s" % line)
|
||||
return []
|
||||
|
||||
|
||||
@support.scrape
|
||||
def peliculas(item):
|
||||
#debug = True
|
||||
# esclusione degli articoli 'di servizio'
|
||||
# curYear = datetime.date.today().year
|
||||
# blacklist = ['BENVENUTI', 'Richieste Serie TV', 'CB01.UNO ▶ TROVA L’INDIRIZZO UFFICIALE ',
|
||||
# 'Aggiornamento Quotidiano Serie TV', 'AVVISO!!!',
|
||||
# 'Openload: la situazione. Benvenuto Verystream', 'Openload: lo volete ancora?',
|
||||
# 'OSCAR ' + str(curYear) + ' ▶ VOTA IL TUO FILM PREFERITO! 🎬',
|
||||
# 'Auguri di Buon Natale e Felice Anno Nuovo! – ' + str(curYear) + '!']
|
||||
|
||||
if 'newest' in item.args:
|
||||
pagination = ''
|
||||
patronBlock = r'sequex-page-left(?P<block>.*?)sequex-page-right'
|
||||
if '/serietv/' not in item.url:
|
||||
patron = r'src="?(?P<thumb>[^ "]+)"? alt="?(?P<title>.*?)(?:\[(?P<quality>[a-zA-Z]+(?:[/]?3D)?)\]\s*)?(?:\[(?P<lang>Sub-ITA|ITA)\]\s*)?(?:\[(?P<quality2>[a-zA-Z]+(?:[/]?3D)?)\]\s*)?\((?P<year>\d{4})[^\)]*\)[^>]*>.*?<a href=(?:")?(?P<url>[^" ]+)(?:")?.*?rpwe-summary[^>]*>(?P<genre>\w+) [^ ]+ DURATA (?P<duration>[0-9]+)[^ ]+ [^ ]+ [A-Z ]+ (?P<plot>[^<]+)<'
|
||||
action = 'findvideos'
|
||||
else:
|
||||
patron = r'src=(?:")?(?P<thumb>[^ "]+)(?:")? alt=(?:")?(?P<title>.*?)(?: – \d+×\d+)?(?:>|"| – )(?:(?P<lang>Sub-ITA|ITA))?[^>]*>.*?<a href=(?:")?(?P<url>[^" ]+)(?:")?.*?rpwe-summary[^>]*>(?P<genre>[^\(]*)\((?P<year>\d{4})[^\)]*\) (?P<plot>[^<]+)<'
|
||||
action = 'episodios'
|
||||
|
||||
elif '/serietv/' not in item.url:
|
||||
patron = r'(?<!sticky )hentry.*?<div class="card-image">\s*<a[^>]+>\s*<img src="(?P<thumb>[^" ]+)" alt[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+><a href="?(?P<url>[^" >]+)(?:\/|"|\s+)>(?P<title>[^<[(]+)(?:\[(?P<quality>[a-zA-Z]+(?:[/]?3D)?)\]\s*)?(?:\[(?P<lang>Sub-ITA|ITA)\]\s*)?(?:\[(?P<quality2>[a-zA-Z/]+)\]\s*)? (?:\((?P<year>[0-9]{4})\))?[^>]+>[^>]+>[^>]+>[^>]+>(?P<genre>[^<>&âÃÂÖ]+)(?:[^ ]+\s*DURATA\s*(?P<duration>[0-9]+)[^>]+>[^>]+>[^>]+>(?P<plot>[^<>]+))?'
|
||||
action = 'findvideos'
|
||||
|
||||
else:
|
||||
patron = r'(?<!sticky )hentry.*?card-image[^>]*>\s*<a href=(?:")?(?P<url>[^" >]+)(?:")?\s*>\s*<img src=(?:")?(?P<thumb>[^" ]+)(?:")? alt="(?P<title>.*?)(?: – \d+×\d+)?(?:"| – )(?:(?P<lang>Sub-ITA|ITA))?[^>]*>[^>]+>[^>]+>[^>]*>[^>]+>[^>]+>[^>]*>[^>]+>[^>]+>[^>]*>[^>]+>[^>]+>[^>]*>(?P<genre>[^\(]+)\((?P<year>\d{4})[^>]*>[^>]+>[^>]+>[^>]+>(?:<p>)?(?P<plot>[^<]+)'
|
||||
action = 'episodios'
|
||||
item.contentType = 'tvshow'
|
||||
|
||||
patronNext = '<a class="?page-link"? href="?([^>"]+)"?><i class="fa fa-angle-right">'
|
||||
|
||||
def itemHook(item):
|
||||
if item.quality2:
|
||||
item.quality = item.quality2
|
||||
item.title += support.typo(item.quality2, '_ [] color kod')
|
||||
return item
|
||||
|
||||
return locals()
|
||||
|
||||
|
||||
@support.scrape
|
||||
def episodios(item):
|
||||
@support.scrape
|
||||
def folder(item, url):
|
||||
"""
|
||||
Quando c'è un link ad una cartella contenente più stagioni
|
||||
"""
|
||||
if url:
|
||||
data = support.match(url).data
|
||||
actLike = 'episodios'
|
||||
addVideolibrary = False
|
||||
downloadEnabled = False
|
||||
|
||||
patron = r'<tr><td>(?P<title>[^<]+)<td><span [^>].+?><a [^>]+href="(?P<url>[^"]+)[^>]+>'
|
||||
sceneTitle = True
|
||||
# debug = True
|
||||
|
||||
def itemHook(item):
|
||||
item.serieFolder = True
|
||||
return item
|
||||
return locals()
|
||||
|
||||
# debugBlock=True
|
||||
data = support.match(item.url, headers=headers).data
|
||||
folderItemlist = folder(item, scrapertools.find_single_match(data, r'TUTT[EA] L[EA] \w+\s+(?:–|-)\s+<a href="?([^" ]+)'))
|
||||
|
||||
patronBlock = r'(?P<block>sp-head[^>]+>\s*(?:STAGION[EI]\s*(?:(?:DA)?\s*[0-9]+\s*A)?\s*[0-9]+|MINISSERIE)(?::\s*PARTE\s*[0-9]+)? - (?P<lang>[^-<]+)(?:- (?P<quality>[^-<]+))?.*?<\/div>.*?)spdiv[^>]*>'
|
||||
patron = r'(?:/>|<p>|<strong>)(?P<other>.*?(?P<episode>[0-9]+(?:×|ÃÂ)[0-9]+)\s*(?P<title2>.*?)?(?:\s*–|\s*-|\s*<).*?)(?:<\/p>|<br)'
|
||||
def itemlistHook(itemlist):
|
||||
title_dict = {}
|
||||
itlist = []
|
||||
for i in itemlist:
|
||||
i.url = item.url
|
||||
i.title = re.sub(r'\.(\D)',' \\1', i.title)
|
||||
match = support.match(i.title, patron=r'(\d+.\d+)').match.replace('x','')
|
||||
i.order = match
|
||||
if match not in title_dict:
|
||||
title_dict[match] = i
|
||||
elif match in title_dict and i.contentLanguage == title_dict[match].contentLanguage \
|
||||
or i.contentLanguage == 'ITA' and not title_dict[match].contentLanguage \
|
||||
or title_dict[match].contentLanguage == 'ITA' and not i.contentLanguage:
|
||||
title_dict[match].url = i.url
|
||||
else:
|
||||
title_dict[match + '1'] = i
|
||||
|
||||
for key, value in title_dict.items():
|
||||
itlist.append(value)
|
||||
|
||||
itlist = sorted(itlist, key=lambda it: (it.contentLanguage, int(it.order)))
|
||||
|
||||
itlist.extend(folderItemlist)
|
||||
|
||||
return itlist
|
||||
return locals()
|
||||
|
||||
|
||||
def findvideos(item):
|
||||
if item.serieFolder:
|
||||
return support.server(item, data=item.url)
|
||||
if item.contentType == "episode":
|
||||
return findvid_serie(item)
|
||||
|
||||
def load_links(itemlist, re_txt, desc_txt, quality=""):
|
||||
streaming = scrapertools.find_single_match(data, re_txt).replace('"', '')
|
||||
logger.debug('STREAMING=', streaming)
|
||||
matches = support.match(streaming, patron = r'<td><a.*?href=([^ ]+) [^>]+>([^<]+)<').matches
|
||||
for scrapedurl, scrapedtitle in matches:
|
||||
logger.debug("##### findvideos %s ## %s ## %s ##" % (desc_txt, scrapedurl, scrapedtitle))
|
||||
itemlist.append(item.clone(action="play", title=scrapedtitle, url=scrapedurl, server=scrapedtitle, quality=quality))
|
||||
|
||||
logger.debug()
|
||||
|
||||
itemlist = []
|
||||
|
||||
# Carica la pagina
|
||||
data = httptools.downloadpage(item.url).data
|
||||
data = re.sub('\n|\t', '', data)
|
||||
|
||||
# Estrae i contenuti - Streaming
|
||||
load_links(itemlist, '<strong>Streamin?g:</strong>(.*?)cbtable', "Streaming", "SD")
|
||||
|
||||
# Estrae i contenuti - Streaming HD
|
||||
load_links(itemlist, '<strong>Streamin?g HD[^<]+</strong>(.*?)cbtable', "Streaming HD", "HD")
|
||||
|
||||
# Estrae i contenuti - Streaming 3D
|
||||
load_links(itemlist, '<strong>Streamin?g 3D[^<]+</strong>(.*?)cbtable', "Streaming 3D")
|
||||
|
||||
# Extract the quality format
|
||||
patronvideos = r'([\w.]+)</strong></div></td>'
|
||||
return support.server(item, itemlist=itemlist, patronTag=patronvideos)
|
||||
|
||||
# Estrae i contenuti - Download
|
||||
# load_links(itemlist, '<strong>Download:</strong>(.*?)<tableclass=cbtable height=30>', "aqua", "Download")
|
||||
|
||||
# Estrae i contenuti - Download HD
|
||||
# load_links(itemlist, '<strong>Download HD[^<]+</strong>(.*?)<tableclass=cbtable width=100% height=20>', "azure", "Download HD")
|
||||
|
||||
|
||||
def findvid_serie(item):
|
||||
logger.debug()
|
||||
data = re.sub(r'((?:<p>|<strong>)?[^\d]*\d*(?:×|Ã)[0-9]+[^<]+)', '', item.other)
|
||||
|
||||
return support.server(item, data=data)
|
||||
|
||||
|
||||
def play(item):
|
||||
logger.debug()
|
||||
return servertools.find_video_items(item, data=item.url)
|
||||
11
channels/cinemalibero.json
Executable file
11
channels/cinemalibero.json
Executable file
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"id": "cinemalibero",
|
||||
"name": "Cinemalibero",
|
||||
"language": ["ita"],
|
||||
"active": false,
|
||||
"thumbnail": "cinemalibero.png",
|
||||
"banner": "cinemalibero.png",
|
||||
"categories": ["movie","tvshow","anime"],
|
||||
"not_active": ["include_in_newest_anime", "include_in_newest_peliculas"],
|
||||
"settings": []
|
||||
}
|
||||
292
channels/cinemalibero.py
Executable file
292
channels/cinemalibero.py
Executable file
@@ -0,0 +1,292 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# ------------------------------------------------------------
|
||||
# Canale per 'cinemaLibero'
|
||||
# ------------------------------------------------------------
|
||||
|
||||
import re
|
||||
|
||||
from core import httptools, support, scrapertools
|
||||
from core.item import Item
|
||||
from core.support import typo
|
||||
from platformcode import config, logger
|
||||
import sys
|
||||
|
||||
from platformcode.logger import debug
|
||||
if sys.version_info[0] >= 3:
|
||||
from concurrent import futures
|
||||
else:
|
||||
from concurrent_py2 import futures
|
||||
|
||||
# rimanda a .today che contiene tutti link a .plus
|
||||
# def findhost(url):
|
||||
# permUrl = httptools.downloadpage('https://www.cinemalibero.online/', follow_redirects=False).headers
|
||||
# try:
|
||||
# import urlparse
|
||||
# except:
|
||||
# import urllib.parse as urlparse
|
||||
# p = list(urlparse.urlparse(permUrl['location'].replace('https://www.google.com/search?q=site:', '')))
|
||||
# if not p[0]:
|
||||
# p[0] = 'https'
|
||||
# return urlparse.urlunparse(p)
|
||||
|
||||
host = config.get_channel_url()
|
||||
headers = [['Referer', host]]
|
||||
|
||||
@support.menu
|
||||
def mainlist(item):
|
||||
|
||||
film = ['/category/film/',
|
||||
('Novità', ['', 'peliculas', 'update']),
|
||||
('Generi', ['', 'genres'])]
|
||||
|
||||
tvshow = ['/category/serie-tv/']
|
||||
|
||||
anime = ['/category/anime-giapponesi/']
|
||||
|
||||
## Sport = [(support.typo('Sport', 'bullet bold'), ['/category/sport/', 'peliculas', 'sport', 'tvshow'])]
|
||||
news = [('Ultimi episodi Serie/Anime', ['/aggiornamenti-serie-tv/', 'peliculas', 'update', 'tvshow'])]
|
||||
|
||||
search = ''
|
||||
|
||||
return locals()
|
||||
|
||||
|
||||
@support.scrape
|
||||
def peliculas(item):
|
||||
# debug = True
|
||||
action = 'check'
|
||||
patronBlock = r'<div class="container">.*?class="col-md-12[^"]*?">(?P<block>.*?)<div class=(?:"container"|"bg-dark ")>'
|
||||
if item.args == 'newest':
|
||||
patron = r'<div class="col-lg-3">[^>]+>[^>]+>\s<a href="(?P<url>[^"]+)".+?url\((?P<thumb>[^\)]+)\)">[^>]+>(?P<title>[^<]+)<[^>]+>[^>]+>(?:[^>]+>)?\s?(?P<rating>[\d\.]+)?[^>]+>.+?(?:[ ]\((?P<year>\d{4})\))?<[^>]+>[^>]+>(.?[\d\-x]+\s\(?(?P<lang>[sSuUbBiItTaA\-]+)?\)?\s?(?P<quality>[\w]+)?[|]?\s?(?:[fFiInNeE]+)?\s?\(?(?P<lang2>[sSuUbBiItTaA\-]+)?\)?)?'
|
||||
pagination = 25
|
||||
elif item.contentType == 'movie':
|
||||
# action = 'findvideos'
|
||||
patron = r'<a href="(?P<url>[^"]+)" title="(?P<title>.+?)(?:[ ]\[(?P<lang>[sSuUbB\-iItTaA]+)\])?(?:[ ]\((?P<year>\d{4})?\))?"\s*alt="[^"]+"\s*class="[^"]+"(?: style="background-image: url\((?P<thumb>.+?)\)">)?\s*<div class="voto">[^>]+>[^>]+>.(?P<rating>[\d\.a-zA-Z\/]+)?[^>]+>[^>]+>[^>]+>(?:<div class="genere">(?P<quality>[^<]+)</div>)?'
|
||||
if item.args == 'update':
|
||||
patronBlock = r'<section id="slider">(?P<block>.*?)</section>'
|
||||
patron = r'<a href="(?P<url>(?:https:\/\/.+?\/(?P<title>[^\/]+[a-zA-Z0-9\-]+)(?P<year>\d{4})?))/".+?url\((?P<thumb>[^\)]+)\)">'
|
||||
elif item.contentType == 'tvshow':
|
||||
# action = 'episodios'
|
||||
if item.args == 'update':
|
||||
patron = r'<a href="(?P<url>[^"]+)"[^<]+?url\((?P<thumb>.+?)\)">\s*?<div class="titolo">(?P<title>.+?)(?: – Serie TV)?(?:\([sSuUbBiItTaA\-]+\))?[ ]?(?P<year>\d{4})?</div>\s*?(?:<div class="genere">)?(?:[\w]+?\.?\s?[\s|S]?[\dx\-S]+?\s\(?(?P<lang>[iItTaA]+|[sSuUbBiItTaA\-]+)\)?\s?(?P<quality>[HD]+)?|.+?\(?(?P<lang2>[sSuUbBiItTaA\-]+)?\)?</div>)'
|
||||
pagination = 25
|
||||
else:
|
||||
patron = r'<a href="(?P<url>[^"]+)"\s*title="(?P<title>[^"\(]+)(?:"|\()(?:(?P<year>\d+)[^"]+)?.*?url\((?P<thumb>[^\)]+)\)(?:.*?<div class="voto">[^>]+>[^>]+>\s*(?P<rating>[^<]+))?.*?<div class="titolo">[^>]+>(?:<div class="genere">[^ ]*(?:\s\d+)?\s*(?:\()?(?P<lang>[^\)< ]+))?'
|
||||
else:
|
||||
patron = r'<div class="col-lg-3">[^>]+>[^>]+>\s*<a href="(?P<url>[^"]+)".+?url\((?P<thumb>[^\)]+)\)">[^>]+>[^>]+>[^>]+>(?:[^>]+>)?\s?(?P<rating>[\d\.]+)?[^>]+>(?P<title>.+?)(?:[ ]\((?P<year>\d{4})\))?<[^>]+>[^>]+>(.?[\d\-x]+\s\(?(?P<lang>[sSuUbBiItTaA\-]+)?\)?\s?(?P<quality>[\w]+)?[|]?\s?(?:[fFiInNeE]+)?\s?\(?(?P<lang2>[sSuUbBiItTaA\-]+)?\)?)?'
|
||||
|
||||
def itemHook(item):
|
||||
if 'sub' in item.contentLanguage.lower() and not 'ita' in item.contentLanguage.lower():
|
||||
item.contentLanguage= 'Sub-ITA'
|
||||
item.title = re.sub('[Ss]ub(?:-)?', item.contentLanguage, item.title)
|
||||
if item.lang2:
|
||||
if len(item.lang2)<3:
|
||||
item.lang2 = 'ITA'
|
||||
item.contentLanguage = item.lang2
|
||||
item.title += support.typo(item.lang2, '_ [] color kod')
|
||||
if item.args == 'update':
|
||||
item.title = item.title.replace('-', ' ')
|
||||
# if item.args == 'search':
|
||||
# item.contentType = 'tvshow' if 'serie-' in item.url else 'movie'
|
||||
|
||||
return item
|
||||
|
||||
patronNext = r'<a class="next page-numbers".*?href="([^"]+)">'
|
||||
return locals()
|
||||
|
||||
@support.scrape
|
||||
def episodios(item):
|
||||
data = item.data
|
||||
# debug=True
|
||||
|
||||
if item.args == 'anime':
|
||||
logger.debug("Anime :", item)
|
||||
patron = r'<a target=(?P<url>[^>]+>(?P<title>Episodio\s(?P<episode>\d+))(?::)?(?:(?P<title2>[^<]+))?.*?(?:<br|</p))|(?P<data>.+)'
|
||||
patronBlock = r'(?:Stagione (?P<season>\d+))?(?:</span><br />|</span></p>|strong></p>)(?P<block>.*?)(?:<div style="margin-left|<span class="txt_dow">)'
|
||||
item.contentType = 'tvshow'
|
||||
elif item.args == 'sport':
|
||||
logger.debug("Sport :", item)
|
||||
patron = r'(?:/>|<p>)\s*(?P<title>[^-]+)-(?P<data>.+?)(?:<br|</p)'
|
||||
patronBlock = r'</strong>\s*</p>(?P<block>.*?</p>)'
|
||||
item.contentType = 'tvshow'
|
||||
elif item.args == 'serie' or item.contentType == 'tvshow':
|
||||
logger.debug("Serie :", item)
|
||||
patron = r'(?:/>|<p>)\s*(?:(?P<episode>\d+(?:x|×|×)\d+|Puntata \d+)(?:-(?P<episode2>\d+))?[;]?[ ]?(?P<title>[^<–-]+))?(?P<data>.*?)(?:<br|</p)'
|
||||
patronBlock = r'Stagione\s(?:[Uu]nica)?(?:(?P<lang>iTA|ITA|Sub-ITA|Sub-iTA))?.*?</strong>(?P<block>.+?)(?:strong>|<div class="at-below)'
|
||||
item.contentType = 'tvshow'
|
||||
else:
|
||||
patron = r'(?P<title>\s*[0-9]{2}/[0-9]{2}/[0-9]{4})(?P<data>.*?)(?:<br|</p)'
|
||||
|
||||
def itemHook(it):
|
||||
if not scrapertools.find_single_match(it.title, r'(\d+x\d+)'):
|
||||
it.title = re.sub(r'(\d+) -', '1x\\1', it.title)
|
||||
return it
|
||||
|
||||
def itemlistHook(itl):
|
||||
ret = []
|
||||
if item.args == 'sport':
|
||||
return itl
|
||||
# support.dbg()
|
||||
for it in itl:
|
||||
ep = scrapertools.find_single_match(it.title, r'(\d+x\d+)')
|
||||
if not ep and 'http' in it.data: # stagione intera
|
||||
# from lib import unshortenit
|
||||
# data = unshortenit.findlinks(it.data)
|
||||
episodes = {}
|
||||
|
||||
def get_ep(s):
|
||||
srv_mod = __import__('servers.%s' % s.server, None, None, ["servers.%s" % s.server])
|
||||
if hasattr(srv_mod, 'get_filename'):
|
||||
title = srv_mod.get_filename(s.url)
|
||||
if item.args == 'anime':
|
||||
ep = title
|
||||
else:
|
||||
ep = scrapertools.get_season_and_episode(title)
|
||||
if ep:
|
||||
if ep not in episodes:
|
||||
episodes[ep] = []
|
||||
episodes[ep].append(s)
|
||||
|
||||
servers = support.server(item, it.data, CheckLinks=False, Download=False, Videolibrary=False)
|
||||
# for s in servers:
|
||||
# get_ep(s)
|
||||
# ottengo l'episodio dal nome del file
|
||||
with futures.ThreadPoolExecutor() as executor:
|
||||
for s in servers:
|
||||
executor.submit(get_ep, s)
|
||||
# logger.debug(it.contentLanguage)
|
||||
if item.args != 'anime':
|
||||
for ep in episodes:
|
||||
ret.append(it.clone(title=typo(ep, 'bold') + typo(it.contentLanguage, '_ [] color kod bold'),
|
||||
servers=[srv.tourl() for srv in episodes[ep]], contentSeason=int(ep.split('x')[0]), contentEpisodeNumber=int(ep.split('x')[1])))
|
||||
else:
|
||||
ret.extend([it.clone(title=typo(ep, 'bold') + typo(it.contentLanguage, '_ [] color kod bold'),
|
||||
servers=[srv.tourl() for srv in episodes[ep]]) for ep in episodes])
|
||||
elif ep:
|
||||
ret.append(it)
|
||||
return sorted(ret, key=lambda i: i.title)
|
||||
|
||||
return locals()
|
||||
|
||||
|
||||
@support.scrape
|
||||
def genres(item):
|
||||
action='peliculas'
|
||||
patron_block=r'<div id="bordobar" class="dropdown-menu(?P<block>.*?)</li>'
|
||||
patronMenu=r'<a class="dropdown-item" href="(?P<url>[^"]+)" title="(?P<title>[A-z]+)"'
|
||||
|
||||
return locals()
|
||||
|
||||
|
||||
def search(item, texto):
|
||||
logger.debug(item.url,texto)
|
||||
texto = texto.replace(' ', '+')
|
||||
item.url = host + "/?s=" + texto
|
||||
# item.contentType = 'tv'
|
||||
item.args = 'search'
|
||||
try:
|
||||
return peliculas(item)
|
||||
# Continua la ricerca in caso di errore
|
||||
except:
|
||||
import sys
|
||||
for line in sys.exc_info():
|
||||
logger.error("%s" % line)
|
||||
return []
|
||||
|
||||
|
||||
def newest(categoria):
|
||||
logger.debug('newest ->', categoria)
|
||||
itemlist = []
|
||||
item = Item()
|
||||
item.args = 'newest'
|
||||
try:
|
||||
if categoria == 'series' or categoria == 'anime':
|
||||
item.args = 'update'
|
||||
item.url = host+'/aggiornamenti-serie-tv/'
|
||||
item.contentType = 'tvshow'
|
||||
item.action = 'peliculas'
|
||||
itemlist = peliculas(item)
|
||||
except:
|
||||
import sys
|
||||
for line in sys.exc_info():
|
||||
logger.error('newest log: ', (line))
|
||||
return []
|
||||
|
||||
return itemlist
|
||||
|
||||
|
||||
def check(item):
|
||||
data = support.match(item.url, headers=headers).data
|
||||
|
||||
if data:
|
||||
ck = str(support.match(data, patronBlock=r'Genere:(.*?)</span>', patron=r'tag">([^<]+)').matches).lower()
|
||||
|
||||
if 'serie tv' in ck or 'anime' in ck or 'wrestling wwe' in ck :# in ['serie tv', 'wrestling wwe', 'anime']:
|
||||
if 'anime' in ck:
|
||||
item.args = 'anime'
|
||||
elif 'sport' in ck or 'wrestling' in ck:
|
||||
item.args = 'sport'
|
||||
else:
|
||||
item.args = 'serie'
|
||||
item.contentType = 'tvshow'
|
||||
item.data = data
|
||||
itemlist = episodios(item)
|
||||
if not itemlist:
|
||||
item.data = data
|
||||
return findvideos(item)
|
||||
else:
|
||||
item.contentType = 'movie'
|
||||
item.data = data
|
||||
# item.action = 'findvideos'
|
||||
return findvideos(item)
|
||||
|
||||
return itemlist
|
||||
|
||||
|
||||
def findvideos(item):
|
||||
def filter_ep(s):
|
||||
srv_mod = __import__('servers.%s' % s.server, None, None, ["servers.%s" % s.server])
|
||||
if hasattr(srv_mod, 'get_filename'):
|
||||
title = srv_mod.get_filename(s.url)
|
||||
# support.dbg()
|
||||
if scrapertools.get_season_and_episode(title) == str(item.contentSeason) + "x" + str(
|
||||
item.contentEpisodeNumber).zfill(2):
|
||||
servers.append(s)
|
||||
logger.debug()
|
||||
# support.dbg()
|
||||
if item.servers:
|
||||
return support.server(item, itemlist=[Item().fromurl(s) for s in item.servers])
|
||||
if not item.data:
|
||||
item.data = httptools.downloadpage(item.url)
|
||||
data = scrapertools.find_single_match(item.data, '<div class="at-above-post addthis_tool"(.*?)(?:<div class="at-below-post|[dD][oO][wW][nN][lL][oO][aA][dD])')
|
||||
if data:
|
||||
item.data = data
|
||||
|
||||
servers = []
|
||||
# if item.args == 'anime':
|
||||
# if item.urls: # this is a episode
|
||||
# return support.server(item, itemlist=[Item(url=support.unshortenit.FileCrypt().unshorten(u)) for u in item.urls])
|
||||
# itemlist = []
|
||||
# episodes = {}
|
||||
# for uri in support.unshortenit.FileCrypt().find(item.data):
|
||||
# for ep in support.unshortenit.FileCrypt(uri).list_files():
|
||||
# ep = ('.'.join(ep[0].split('.')[:-1]), ep[1]) # remove extension
|
||||
# if not ep[0] in episodes:
|
||||
# episodes[ep[0]] = []
|
||||
# episodes[ep[0]].append(ep[1])
|
||||
# for ep in episodes.keys():
|
||||
# itemlist.append(item.clone(title=ep, urls=episodes[ep], action='findvideos', data=''))
|
||||
# return itemlist
|
||||
total_servers = support.server(item, data=item.data)
|
||||
|
||||
if item.contentType == 'episode' and len(set([srv.server for srv in total_servers])) < len([srv.server for srv in total_servers]):
|
||||
# i link contengono più puntate, cerco quindi quella selezionata
|
||||
with futures.ThreadPoolExecutor() as executor:
|
||||
for s in total_servers:
|
||||
if s.server:
|
||||
executor.submit(filter_ep, s)
|
||||
else:
|
||||
servers.append(s)
|
||||
return servers
|
||||
else:
|
||||
return total_servers
|
||||
11
channels/cinetecadibologna.json
Executable file
11
channels/cinetecadibologna.json
Executable file
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"id": "cinetecadibologna",
|
||||
"name": "Cineteca di Bologna",
|
||||
"language": ["ita"],
|
||||
"active": true,
|
||||
"thumbnail": "cinetecadibologna.png",
|
||||
"banner": "cinetecadibologna.png",
|
||||
"categories": ["documentary"],
|
||||
"not_active":["include_in_newest_peliculas", "include_in_newest_series", "include_in_newest_anime", "include_in_global_search"],
|
||||
"settings": []
|
||||
}
|
||||
74
channels/cinetecadibologna.py
Executable file
74
channels/cinetecadibologna.py
Executable file
@@ -0,0 +1,74 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# ------------------------------------------------------------
|
||||
# Canale per cinetecadibologna
|
||||
# ------------------------------------------------------------
|
||||
from core.item import Item
|
||||
|
||||
from core import support
|
||||
|
||||
host = support.config.get_channel_url()
|
||||
|
||||
|
||||
headers = [['Referer', host]]
|
||||
@support.menu
|
||||
def mainlist(item):
|
||||
film = ['/video/alfabetico_completo',
|
||||
('Anni',['/video/epoche', 'menu']),
|
||||
('Registi',['/video/registi', 'menu']),
|
||||
('Attori',['/video/attori', 'menu']),
|
||||
('Percorsi Tematici',['/video/percorsi','menu'])]
|
||||
return locals()
|
||||
|
||||
|
||||
@support.scrape
|
||||
def menu(item):
|
||||
action = 'peliculas'
|
||||
if 'epoche' in item.url:
|
||||
patronMenu =r'<li>\s*<a href="(?P<url>[^"]+)">(?P<title>[^>]+)<'
|
||||
elif 'percorsi' in item.url:
|
||||
patron = r'<div class="cover_percorso">\s*<a href="(?P<url>[^"]+)">\s*<img src="(?P<thumb>[^"]+)"[^>]+>\s*[^>]+>(?P<title>.*?)<'
|
||||
else:
|
||||
patron = r'<h2>\s*<a href="(?P<url>[^,"]+),[^"]+"\s*>(?P<title>[^<]+)<'
|
||||
patronNext = r'<div class="dx">\s*<a href="(.*?)">pagina suc'
|
||||
return locals()
|
||||
|
||||
|
||||
def search(item, text):
|
||||
support.info(text)
|
||||
item.args = 'noorder'
|
||||
item.url = host + '/ricerca/type_ALL/ricerca_' + text
|
||||
item.contentType = 'movie'
|
||||
try:
|
||||
return peliculas(item)
|
||||
# Continua la ricerca in caso di errore
|
||||
except:
|
||||
import sys
|
||||
for line in sys.exc_info():
|
||||
support.logger.error("%s" % line)
|
||||
return []
|
||||
|
||||
|
||||
|
||||
@support.scrape
|
||||
def peliculas(item):
|
||||
if 'alfabetico' in item.url:
|
||||
patron = r'<img src="(?P<thumb>[^"]+)"[^>]+>\s*[^>]+>\s*<div[^>]+>\s*<div[^>]+>[^>]+>\s*<a href="(?P<url>[^"]+)"[^>]+>(?:\[)?(?P<title>[^\]<]+)(?:\]|<)'
|
||||
else:
|
||||
if 'type_ALL' in item.url: patronBlock = r'Video:(?P<block>.*?)(?:<div class=""|<!--)'
|
||||
elif not 'NomePersona' in item.url: patronBlock = r'<h3>Film</h3>(?P<block>.*?)<div class="list_wrapper'
|
||||
patron = r'<a href="(?P<url>[^"]+)"\s*class="[^"]+"\s*title="(?:\[)?(?P<title>[^\]"]+)(?:\])?"\s*rel="(?P<thumb>[^"]+)"'
|
||||
patronNext = r'<div class="dx">\s*<a href="(.*?)">pagina suc'
|
||||
return locals()
|
||||
|
||||
|
||||
def findvideos(item):
|
||||
support.info()
|
||||
itemlist = []
|
||||
|
||||
matches = support.match(item, patron=r'filename: "(.*?)"').matches
|
||||
|
||||
for url in matches:
|
||||
itemlist.append(item.clone(action="play", title=support.config.get_localized_string(30137), server='directo', url=host + url))
|
||||
|
||||
return support.server(item, itemlist=itemlist)
|
||||
|
||||
11
channels/dinostreaming.json
Executable file
11
channels/dinostreaming.json
Executable file
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"id": "dinostreaming",
|
||||
"name": "DinoStreaming",
|
||||
"language": ["ita"],
|
||||
"active": true,
|
||||
"thumbnail": "dinostreaming.png",
|
||||
"banner": "dinostreaming.png",
|
||||
"categories": ["movie"],
|
||||
"settings": [],
|
||||
"not_active": ["include_in_newest"]
|
||||
}
|
||||
77
channels/dinostreaming.py
Executable file
77
channels/dinostreaming.py
Executable file
@@ -0,0 +1,77 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# ------------------------------------------------------------
|
||||
# Canale per Dinostreaming
|
||||
# by ilmich
|
||||
# ------------------------------------------------------------
|
||||
|
||||
from core import httptools, support
|
||||
from core.item import Item
|
||||
from platformcode import logger
|
||||
|
||||
host = support.config.get_channel_url()
|
||||
headers = [['Referer', host]]
|
||||
|
||||
@support.menu
|
||||
def mainlist(item):
|
||||
film = [('Film al cinema',['/film-category/al-cinema/', 'peliculas']),
|
||||
('Generi',['', 'genres']),
|
||||
]
|
||||
search = ''
|
||||
return locals()
|
||||
|
||||
@support.scrape
|
||||
def genres(item):
|
||||
action = 'peliculas'
|
||||
blacklist = ['Seguici su Telegram',]
|
||||
patronMenu = r'<li class="elementor-icon-list-item">.*?href="(?P<url>.*?)".*?text">(?P<title>.*?)</span>'
|
||||
|
||||
return locals()
|
||||
|
||||
@support.scrape
|
||||
def peliculas(item):
|
||||
if not item.args == 'search': # pagination not works
|
||||
if not item.nextpage:
|
||||
item.page = 1
|
||||
else:
|
||||
item.page = item.nextpage
|
||||
|
||||
if not item.parent_url:
|
||||
item.parent_url = item.url
|
||||
|
||||
item.nextpage = item.page + 1
|
||||
nextPageUrl = "{}/page/{}".format(item.parent_url, item.nextpage)
|
||||
|
||||
resp = httptools.downloadpage(nextPageUrl, only_headers = True)
|
||||
if (resp.code > 399): # no more elements
|
||||
nextPageUrl = ''
|
||||
|
||||
patron = r'<div data-elementor-type="loop-item".*?<a.*?url="(?P<thumb>[^"]+).*?<a href=\"(?P<url>[^"]+)\">(?P<title>.*?)</a>.*?<span class="elementor-heading-title elementor-size-default">(?P<year>.*?)</span>'
|
||||
|
||||
def itemlistHook(itemlist):
|
||||
return itemlist[:-1:]
|
||||
return locals()
|
||||
|
||||
def search(item, text):
|
||||
item.url = "{}/?{}".format(host, support.urlencode({'s': text}))
|
||||
item.args = 'search'
|
||||
|
||||
try:
|
||||
return peliculas(item)
|
||||
|
||||
except:
|
||||
import sys
|
||||
for line in sys.exc_info():
|
||||
logger.error("search except: %s" % line)
|
||||
return []
|
||||
|
||||
def findvideos(item):
|
||||
support.info()
|
||||
data = httptools.downloadpage(item.url).data
|
||||
video_url = support.match(data, patron=r'<a href="([^"]+)" rel="nofollow" title="Guarda il film in streaming">' ).match
|
||||
if (video_url == ''):
|
||||
return []
|
||||
|
||||
item.url = video_url
|
||||
itemlist = support.server(item)
|
||||
return itemlist
|
||||
|
||||
12
channels/discoveryplus.json
Executable file
12
channels/discoveryplus.json
Executable file
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"id": "discoveryplus",
|
||||
"name": "Discovery + [free]",
|
||||
"active": true,
|
||||
"language": ["ita"],
|
||||
"thumbnail": "discoveryplus.png",
|
||||
"banner": "discoveryplus.png",
|
||||
"categories": ["tvshow", "documentary", "live"],
|
||||
"not_active": ["include_in_newest"],
|
||||
"default_off": ["include_in_global_search"],
|
||||
"settings": []
|
||||
}
|
||||
280
channels/discoveryplus.py
Executable file
280
channels/discoveryplus.py
Executable file
@@ -0,0 +1,280 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# ------------------------------------------------------------
|
||||
# Canale per Rai Play
|
||||
# ------------------------------------------------------------
|
||||
import functools
|
||||
|
||||
import requests, uuid
|
||||
from core import jsontools, support, httptools
|
||||
from platformcode import logger, config
|
||||
|
||||
|
||||
typo = support.typo
|
||||
session = requests.Session()
|
||||
session.request = functools.partial(session.request, timeout=httptools.HTTPTOOLS_DEFAULT_DOWNLOAD_TIMEOUT)
|
||||
host = support.config.get_channel_url()
|
||||
deviceId = uuid.uuid4().hex
|
||||
|
||||
# domain = 'https://eu1-prod-direct.discoveryplus.com'
|
||||
domain = 'https://' + session.get("https://prod-realmservice.mercury.dnitv.com/realm-config/www.discoveryplus.com%2Fit%2Fepg").json()["domain"]
|
||||
token = session.get('{}/token?deviceId={}&realm=dplay&shortlived=true'.format(domain, deviceId)).json()['data']['attributes']['token']
|
||||
session.headers = {'User-Agent': httptools.get_user_agent(), #'Mozilla/50.0 (Windows NT 10.0; WOW64; rv:45.0) Gecko/20100101 Firefox/45.0',
|
||||
'Referer': host,
|
||||
'Origin': host,
|
||||
'Cookie': 'st={}'.format(token),
|
||||
'content-type': 'application/json',
|
||||
'x-disco-client': 'WEB:UNKNOWN:dplus_us:2.46.0',
|
||||
'x-disco-params': 'realm=dplay,siteLookupKey=dplus_it'}
|
||||
|
||||
@support.menu
|
||||
def mainlist(item):
|
||||
top = [('Dirette {bold}', ['', 'live']),
|
||||
('Programmi {bullet bold tv}', ['', 'programs', 'programmi'])]
|
||||
|
||||
search = ''
|
||||
|
||||
return locals()
|
||||
|
||||
|
||||
def search(item, text):
|
||||
itemlist = []
|
||||
|
||||
item.text = text
|
||||
|
||||
try:
|
||||
itemlist = peliculas(item)
|
||||
except:
|
||||
import sys
|
||||
for line in sys.exc_info():
|
||||
logger.error(line)
|
||||
|
||||
return itemlist
|
||||
|
||||
|
||||
def live(item):
|
||||
logger.debug()
|
||||
|
||||
itemlist =[]
|
||||
# data = session.get(domain + '/cms/routes/epg?include=default').json()['included']
|
||||
data = session.get(domain + '/cms/routes/home?include=default&decorators=playbackAllowed').json()['included']
|
||||
|
||||
for key in data:
|
||||
|
||||
if key['type'] == 'channel' and key.get('attributes',{}).get('hasLiveStream', '') and 'Free' in key.get('attributes',{}).get('packages', []):
|
||||
itemlist.append(item.clone(title = typo(key['attributes']['name'], 'bold'),
|
||||
fulltitle = key['attributes']['name'],
|
||||
plot = key['attributes'].get('description', ''),
|
||||
url = "{}/canali/{}".format(host, key['attributes']['alternateId']),
|
||||
id = key['id'],
|
||||
action = 'findvideos'))
|
||||
return support.thumb(itemlist, live=True)
|
||||
|
||||
|
||||
def programs(item):
|
||||
logger.debug()
|
||||
|
||||
itemlist = []
|
||||
data = session.get(domain + '/cms/routes/browse?include=default').json()['included']
|
||||
images = {key['id'] : key['attributes']['src'] for key in data if key['type'] == 'image'}
|
||||
|
||||
channels = {}
|
||||
for key in data:
|
||||
if key['type'] == 'link' and 'Free' in key['attributes']['packages']:
|
||||
logger.debug(jsontools.dump(key))
|
||||
_title = key['attributes'].get('title', key['attributes'].get('name',''))
|
||||
_id = key['relationships']['linkedContent']['data']['id']
|
||||
_thumb = images.get(key['relationships'].get('images', {}).get('data',[{}])[0].get('id'))
|
||||
channels[_title] ={'id':_id, 'thumb':_thumb}
|
||||
|
||||
itemlist = [item.clone(title='Tutti', id=channels['Tutti']['id'], action='peliculas'),
|
||||
item.clone(title='Generi', id=channels['Tutti']['id'], action='genres'),
|
||||
item.clone(title='Per canale', channels=channels, action='channels')]
|
||||
|
||||
return support.thumb(itemlist)
|
||||
|
||||
|
||||
def genres(item):
|
||||
logger.debug()
|
||||
|
||||
itemlist = []
|
||||
data = session.get('{}/cms/collections/{}?include=default'. format(domain, item.id)).json()['included']
|
||||
collection = {k['id']: k['relationships'].get('show', k['relationships'].get('collection'))['data']['id'] for k in data if k['type'] == 'collectionItem'}
|
||||
|
||||
included = {}
|
||||
for key in data:
|
||||
if key.get('relationships', {}).get('items') and key['type'] == 'collection' and key['attributes']['title'] not in ['A-Z', 'I più visti']:
|
||||
included[key['attributes']['title']] = [k['id'] for k in key['relationships']['items']['data']]
|
||||
|
||||
for title, values in included.items():
|
||||
itemlist.append(item.clone(title=title, action='peliculas', filter=[collection[k] for k in values]))
|
||||
|
||||
itemlist.sort(key=lambda it: it.title)
|
||||
|
||||
return support.thumb(itemlist, genre=True)
|
||||
|
||||
|
||||
def channels(item):
|
||||
logger.debug()
|
||||
|
||||
itemlist = [item.clone(title=k, id=v['id'], thumbnail=v['thumb'], action='peliculas') for k, v in item.channels.items() if k !='Tutti']
|
||||
itemlist.sort(key=lambda it: it.title)
|
||||
|
||||
return itemlist
|
||||
|
||||
|
||||
def peliculas(item):
|
||||
logger.debug()
|
||||
|
||||
itemlist =[]
|
||||
|
||||
if item.text:
|
||||
data = session.get('{}/cms/routes/search/result?include=default&contentFilter[query]={}'.format(domain, item.text)).json()['included']
|
||||
else:
|
||||
data = session.get('{}/cms/collections/{}?include=default'.format(domain, item.id)).json()['included']
|
||||
|
||||
images = {key['id'] : key['attributes']['src'] for key in data if key['type'] == 'image'}
|
||||
|
||||
for key in data:
|
||||
if key['type'] == 'show' and 'Free' in str(key.get('relationships',{}).get('contentPackages',{}).get('data',[])) and key['attributes']['episodeCount']:
|
||||
|
||||
if item.filter and key['id'] not in item.filter:
|
||||
continue
|
||||
|
||||
thumbId = key['relationships'].get('images',{}).get('data', [{},{},{}])[2].get('id', '')
|
||||
fanartId = key['relationships'].get('images',{}).get('data', [{}])[0].get('id', '')
|
||||
itemlist.append(
|
||||
item.clone(title=typo(key['attributes']['name'],'bold'),
|
||||
plot=key['attributes'].get('description',''),
|
||||
programid=key['attributes']['alternateId'],
|
||||
seasons=key['attributes']['seasonNumbers'],
|
||||
action='seasons',
|
||||
thumbnail=images[thumbId] if thumbId else item.thumbnail,
|
||||
fanart=images[fanartId] if fanartId else item.fanart,
|
||||
contentType='tvshow'))
|
||||
|
||||
itemlist.sort(key=lambda it: it.title)
|
||||
|
||||
if not itemlist:
|
||||
from core.item import Item
|
||||
itemlist = [Item(title='Nessun Contenuto Free Disponibile', thumbnail=support.thumb('info'))]
|
||||
|
||||
return itemlist
|
||||
|
||||
|
||||
def seasons(item):
|
||||
logger.debug()
|
||||
|
||||
itemlist = []
|
||||
data = session.get('{}/cms/routes/show/{}?include=default'.format(domain, item.programid)).json()['included']
|
||||
|
||||
for key in data:
|
||||
if key['type'] == 'collection' and 'filters' in key['attributes']['component']:
|
||||
for option in key['attributes']['component']['filters'][0]['options']:
|
||||
itemlist.append(item.clone(title="Stagione {}".format(option['value']),
|
||||
season=int(option['value']),
|
||||
seasonparams=option['parameter'],
|
||||
showparams=key['attributes']['component']['mandatoryParams'],
|
||||
id=key['id'],
|
||||
contentType='season',
|
||||
action='episodios'))
|
||||
break
|
||||
|
||||
if key['type'] == 'collection' and 'title' in key['attributes']:
|
||||
itemlist.append(
|
||||
item.clone(title=typo(key['attributes']['title'],'bold'),
|
||||
plot=key['attributes'].get('description',''),
|
||||
programid=key['attributes']['alias'],
|
||||
id=key['id'],
|
||||
action='episodios',
|
||||
contentType='season'))
|
||||
|
||||
return itemlist
|
||||
|
||||
|
||||
def episodios(item):
|
||||
logger.debug()
|
||||
|
||||
itemlist =[]
|
||||
data = session.get('{}/cms/collections/{}?include=default&{}&{}'.format(domain, item.id, item.seasonparams, item.showparams)).json()['included']
|
||||
images = {key['id'] : key['attributes']['src'] for key in data if key['type'] == 'image'}
|
||||
|
||||
for key in data:
|
||||
if key['type'] == 'video' and 'Free' in str(key.get('relationships',{}).get('contentPackages',{}).get('data',[])):
|
||||
if item.season:
|
||||
itemlist.append(item.clone(title = "{}x{:02d} - {}".format(item.season, key['attributes']['episodeNumber'], key['attributes']['name']),
|
||||
plot = key['attributes']['description'],
|
||||
episode = key['attributes']['episodeNumber'],
|
||||
contentType = 'episode',
|
||||
action = 'findvideos',
|
||||
thumbnail = images[key['relationships']['images']['data'][0]['id']],
|
||||
id=key['id']))
|
||||
else:
|
||||
itemlist.append(item.clone(title = key['attributes']['name'],
|
||||
plot = key['attributes']['longDescription'],
|
||||
contentType = 'episode',
|
||||
action = 'findvideos',
|
||||
thumbnail = images[key['relationships']['images']['data'][0]['id']],
|
||||
id=key['id']))
|
||||
|
||||
itemlist.sort(key=lambda it: it.episode)
|
||||
|
||||
if not itemlist:
|
||||
from core.item import Item
|
||||
itemlist = [Item(title='Nessun Episodio Free Disponibile', thumbnail=support.thumb('info'))]
|
||||
|
||||
return itemlist
|
||||
|
||||
|
||||
def findvideos(item):
|
||||
logger.debug()
|
||||
|
||||
content = 'video' if item.contentType == 'episode' else 'channel'
|
||||
|
||||
post = {content + 'Id': item.id,
|
||||
'deviceInfo': {
|
||||
'adBlocker': 'true',
|
||||
'drmSupported': 'true',
|
||||
'hwDecodingCapabilities': [],
|
||||
'screen':{
|
||||
'width':1920,
|
||||
'height':1080
|
||||
},
|
||||
'player':{
|
||||
'width':1920,
|
||||
'height':1080
|
||||
}
|
||||
},
|
||||
'wisteriaProperties':{
|
||||
'advertiser': {
|
||||
'firstPlay': 0,
|
||||
'fwIsLat': 0
|
||||
},
|
||||
'device':{
|
||||
'browser':{
|
||||
'name': 'chrome',
|
||||
'version': config.get_setting("chrome_ua_version")
|
||||
},
|
||||
'type': 'desktop'
|
||||
},
|
||||
'platform': 'desktop',
|
||||
'product': 'dplus_emea',
|
||||
'sessionId': deviceId,
|
||||
'streamProvider': {
|
||||
'suspendBeaconing': 0,
|
||||
'hlsVersion': 6,
|
||||
'pingConfig': 1
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
data = session.post('{}/playback/v3/{}PlaybackInfo'.format(domain, content), json=post).json().get('data',{}).get('attributes',{})
|
||||
if data.get('streaming', [{}])[0].get('protection', {}).get('drmEnabled',False):
|
||||
item.url = data['streaming'][0]['url']
|
||||
item.drm = 'com.widevine.alpha'
|
||||
item.license ="{}|PreAuthorization={}|R{{SSM}}|".format(data['streaming'][0]['protection']['schemes']['widevine']['licenseUrl'],
|
||||
data['streaming'][0]['protection']['drmToken'])
|
||||
else:
|
||||
item.url = data['streaming'][0]['url']
|
||||
item.manifest = 'hls'
|
||||
|
||||
return support.server(item, itemlist=[item], Download=False, Videolibrary=False)
|
||||
10
channels/dreamsub.json
Executable file
10
channels/dreamsub.json
Executable file
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"id": "dreamsub",
|
||||
"name": "DreamSub",
|
||||
"language": ["ita", "sub-ita"],
|
||||
"active": false,
|
||||
"thumbnail": "dreamsub.png",
|
||||
"banner": "dreamsub.png",
|
||||
"categories": ["anime", "vos"],
|
||||
"settings": []
|
||||
}
|
||||
145
channels/dreamsub.py
Executable file
145
channels/dreamsub.py
Executable file
@@ -0,0 +1,145 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# ------------------------------------------------------------
|
||||
# Canale per 'dreamsub'
|
||||
# ------------------------------------------------------------
|
||||
|
||||
from core import support
|
||||
|
||||
host = support.config.get_channel_url()
|
||||
headers = [['Referer', host]]
|
||||
|
||||
@support.menu
|
||||
def mainlist(item):
|
||||
support.info(item)
|
||||
|
||||
anime = ['/search?typeY=tv',
|
||||
('Movie', ['/search?typeY=movie', 'peliculas', '', 'movie']),
|
||||
('OAV', ['/search?typeY=oav', 'peliculas', '', 'tvshow']),
|
||||
('Spinoff', ['/search?typeY=spinoff', 'peliculas', '', 'tvshow']),
|
||||
('Generi', ['','menu','Generi']),
|
||||
('Stato', ['','menu','Stato']),
|
||||
('Ultimi Episodi', ['', 'peliculas', ['last', 'episodiRecenti']]),
|
||||
('Ultimi Aggiornamenti', ['', 'peliculas', ['last', 'episodiNuovi']])
|
||||
]
|
||||
|
||||
return locals()
|
||||
|
||||
|
||||
@support.scrape
|
||||
def menu(item):
|
||||
item.contentType = ''
|
||||
action = 'peliculas'
|
||||
|
||||
|
||||
patronBlock = r'<div class="filter-header"><b>%s</b>(?P<block>.*?)<div class="filter-box">' % item.args
|
||||
patronMenu = r'<a class="[^"]+" data-state="[^"]+" (?P<other>[^>]+)>[^>]+></i>[^>]+></i>[^>]+></i>(?P<title>[^>]+)</a>'
|
||||
|
||||
def itemHook(item):
|
||||
support.info(item.type)
|
||||
for Type, ID in support.match(item.other, patron=r'data-type="([^"]+)" data-id="([^"]+)"').matches:
|
||||
item.url = host + '/search?' + Type + 'Y=' + ID
|
||||
return item
|
||||
return locals()
|
||||
|
||||
|
||||
def search(item, text):
|
||||
support.info(text)
|
||||
|
||||
text = text.replace(' ', '+')
|
||||
item.url = host + '/search/' + text
|
||||
item.args = 'search'
|
||||
try:
|
||||
return peliculas(item)
|
||||
# Continua la ricerca in caso di errore
|
||||
except:
|
||||
import sys
|
||||
for line in sys.exc_info():
|
||||
support.info('search log:', line)
|
||||
return []
|
||||
|
||||
|
||||
def newest(categoria):
|
||||
support.info(categoria)
|
||||
item = support.Item()
|
||||
try:
|
||||
if categoria == "anime":
|
||||
item.url = host
|
||||
item.args = ['last', 'episodiNuovi']
|
||||
return peliculas(item)
|
||||
# Continua la ricerca in caso di errore
|
||||
except:
|
||||
import sys
|
||||
for line in sys.exc_info():
|
||||
support.logger.error("{0}".format(line))
|
||||
return []
|
||||
|
||||
|
||||
|
||||
@support.scrape
|
||||
def peliculas(item):
|
||||
# debug = True
|
||||
anime = True
|
||||
if 'movie' in item.url:
|
||||
item.contentType = 'movie'
|
||||
action = 'findvideos'
|
||||
else:
|
||||
item.contentType = 'tvshow'
|
||||
action = 'episodios'
|
||||
|
||||
if len(item.args) > 1 and item.args[0] == 'last':
|
||||
patronBlock = r'<div id="%s"[^>]+>(?P<block>.*?)<div class="vistaDettagliata"' % item.args[1]
|
||||
patron = r'<li>\s*<a href="(?P<url>[^"]+)" title="(?P<title>[^"]+)" class="thumb">[^>]+>[^>]+>[^>]+>\s*[EePp]+\s*(?P<episode>\d+)[^>]+>\s+<img src="(?P<thumb>[^"]+)"'
|
||||
else:
|
||||
patron = r'<div class="showStreaming">\s*<b>(?P<title>[^<]+)[^>]+>[^>]+>\s*<span>Lingua:\s*(?:DUB|JAP)?\s*(?P<lang>(?:SUB )?ITA)[^>]+>[<>br\s]+a href="(?P<url>[^"]+)"[^>]+>.*?--image-url:url\(/*(?P<thumb>[^\)]+).*?Anno di inizio</b>:\s*(?P<year>[0-9]{4})'
|
||||
patronNext = '<li class="currentPage">[^>]+><li[^<]+<a href="([^"]+)">'
|
||||
|
||||
def itemHook(item):
|
||||
if item.thumbnail and not item.thumbinail.startswith('http'):
|
||||
item.thumbnail = 'http://' + item.thumbnail
|
||||
return item
|
||||
|
||||
return locals()
|
||||
|
||||
|
||||
@support.scrape
|
||||
def episodios(item):
|
||||
anime = True
|
||||
# debug = True
|
||||
pagination = 100
|
||||
|
||||
if item.data:
|
||||
data = item.data
|
||||
|
||||
patron = r'<div class="sli-name">\s*<a\s+href="(?P<url>[^"]+)"[^>]+>(?P<title>[^<]+)<'
|
||||
|
||||
return locals()
|
||||
|
||||
|
||||
def findvideos(item):
|
||||
itemlist = []
|
||||
support.info()
|
||||
# support.dbg()
|
||||
|
||||
matches = support.match(item, patron=r'href="([^"]+)"', patronBlock=r'<div style="white-space: (.*?)<div id="main-content"')
|
||||
|
||||
if not matches.matches and item.contentType != 'episode':
|
||||
item.data = matches.data
|
||||
item.contentType = 'tvshow'
|
||||
return episodios(item)
|
||||
|
||||
if 'vvvvid' in matches.data:
|
||||
itemlist.append(item.clone(action="play", title='VVVVID', url=support.match(matches.data, patron=r'(http://www.vvvvid[^"]+)').match, server='vvvvid'))
|
||||
else:
|
||||
support.info('VIDEO')
|
||||
for url in matches.matches:
|
||||
lang = url.split('/')[-2]
|
||||
if 'ita' in lang.lower():
|
||||
language = 'ITA'
|
||||
if 'sub' in lang.lower():
|
||||
language = 'Sub-' + language
|
||||
quality = url.split('/')[-1].split('?')[0]
|
||||
url += '|User-Agent=' + support.httptools.get_user_agent() + '&Referer=' + url
|
||||
|
||||
itemlist.append(item.clone(action="play", title='', url=url, contentLanguage = language, quality = quality, order = quality.replace('p','').zfill(4), server='directo',))
|
||||
return support.server(item, itemlist=itemlist)
|
||||
|
||||
10
channels/eurostreaming.json
Executable file
10
channels/eurostreaming.json
Executable file
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"id": "eurostreaming",
|
||||
"name": "Eurostreaming",
|
||||
"active": false,
|
||||
"language": ["ita", "sub-ita"],
|
||||
"thumbnail": "eurostreaming.png",
|
||||
"banner": "eurostreaming.png",
|
||||
"categories": ["tvshow", "anime", "vos"],
|
||||
"settings": []
|
||||
}
|
||||
109
channels/eurostreaming.py
Executable file
109
channels/eurostreaming.py
Executable file
@@ -0,0 +1,109 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# ------------------------------------------------------------
|
||||
# Canale per Eurostreaming
|
||||
# by Greko
|
||||
# ------------------------------------------------------------
|
||||
|
||||
from core import support
|
||||
from core.item import Item
|
||||
|
||||
# def findhost(url):
|
||||
# permUrl = httptools.downloadpage(url, follow_redirects=False, only_headers=True).headers
|
||||
# host = 'https://'+permUrl['location'].replace('https://www.google.it/search?q=site:', '')
|
||||
# return host
|
||||
|
||||
host = support.config.get_channel_url()
|
||||
headers = [['Referer', host]]
|
||||
|
||||
@support.menu
|
||||
def mainlist(item):
|
||||
support.info()
|
||||
tvshow = []
|
||||
anime = ['/category/anime-cartoni-animati/']
|
||||
mix = [('Aggiornamenti {bullet bold} {TV}', ['/aggiornamento-episodi-nuovi/', 'peliculas', 'newest']),
|
||||
('Archivio {bullet bold} {TV}', ['/category/serie-tv-archive/', 'peliculas'])]
|
||||
search = ''
|
||||
|
||||
return locals()
|
||||
|
||||
|
||||
@support.scrape
|
||||
def peliculas(item):
|
||||
# debug = True
|
||||
action = 'episodios'
|
||||
|
||||
if item.args == 'newest':
|
||||
item.contentType = 'episode'
|
||||
patron = r'<span class="serieTitle" style="font-size:20px">(?P<title>[^<]+) –\s*<a href="(?P<url>[^"]+)"[^>]*>\s+?(?P<episode>\d+[×x]\d+-\d+|\d+[×x]\d+) (?P<title2>[^<\(]+)\s?\(?(?P<lang>SUB ITA)?\)?</a>'
|
||||
pagination = ''
|
||||
else:
|
||||
patron = r'<div class="post-thumb">.*?<img src="(?P<thumb>[^"]+)".*?><a href="(?P<url>[^"]+)"[^>]+>(?P<title>.+?)\s?(?: Serie Tv)?\s?\(?(?P<year>\d{4})?\)?<\/a><\/h2>'
|
||||
patronNext=r'a class="next page-numbers" href="?([^>"]+)">Avanti »</a>'
|
||||
|
||||
return locals()
|
||||
|
||||
|
||||
@support.scrape
|
||||
def episodios(item):
|
||||
# debug = True
|
||||
data = support.match(item, headers=headers).data
|
||||
if 'clicca qui per aprire' in data.lower(): data = support.match(support.match(data, patron=r'"go_to":"([^"]+)"').match.replace('\\',''), headers=headers).data
|
||||
elif 'clicca qui</span>' in data.lower(): data = support.match(support.match(data, patron=r'<h2 style="text-align: center;"><a href="([^"]+)">').match, headers=headers).data
|
||||
|
||||
patronBlock = r'</span>(?P<block>[a-zA-Z\s]+\d+(.+?)?(?:\()?(?P<lang>ITA|SUB ITA)(?:\))?.*?)</div></div>'
|
||||
patron = r'(?P<season>\d+)×(?P<episode>\d+)(</strong>)*(?P<title>.*?)<(?P<other>.*?br/>)'
|
||||
|
||||
def itemHook(i):
|
||||
i.url = item.url
|
||||
return i
|
||||
|
||||
return locals()
|
||||
|
||||
|
||||
def search(item, texto):
|
||||
support.info()
|
||||
|
||||
item.url = "%s/?s=%s" % (host, texto)
|
||||
item.contentType = 'tvshow'
|
||||
|
||||
try:
|
||||
return peliculas(item)
|
||||
|
||||
# Continua la ricerca in caso di errore
|
||||
except:
|
||||
import sys
|
||||
for line in sys.exc_info():
|
||||
support.info(line)
|
||||
return []
|
||||
|
||||
|
||||
def newest(categoria):
|
||||
support.info()
|
||||
|
||||
itemlist = []
|
||||
item = Item()
|
||||
item.contentType = 'tvshow'
|
||||
item.args = 'newest'
|
||||
try:
|
||||
item.url = "%s/aggiornamento-episodi-nuovi/" % host
|
||||
item.action = "peliculas"
|
||||
itemlist = peliculas(item)
|
||||
# Continua la ricerca in caso di errore
|
||||
except:
|
||||
import sys
|
||||
for line in sys.exc_info():
|
||||
support.info("{0}".format(line))
|
||||
return []
|
||||
|
||||
return itemlist
|
||||
|
||||
|
||||
def findvideos(item):
|
||||
support.info()
|
||||
itemlist = support.server(item, item.other)
|
||||
# testo che tutti i link siano stati risolti
|
||||
if support.logger.testMode:
|
||||
if len(itemlist) < len(support.match(item.other, patron='<a href="([^"]+)').matches):
|
||||
raise Exception('Manca qualche server')
|
||||
return itemlist
|
||||
|
||||
10
channels/eurostreaming_actor.json
Executable file
10
channels/eurostreaming_actor.json
Executable file
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"id": "eurostreaming_actor",
|
||||
"name": "Eurostreaming Actor",
|
||||
"active": true,
|
||||
"language": ["ita","sub-ita"],
|
||||
"thumbnail": "eurostreaming.png",
|
||||
"banner": "eurostreaming.png",
|
||||
"categories": ["tvshow","anime","vos"],
|
||||
"settings": []
|
||||
}
|
||||
97
channels/eurostreaming_actor.py
Executable file
97
channels/eurostreaming_actor.py
Executable file
@@ -0,0 +1,97 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# ------------------------------------------------------------
|
||||
# Canale per Eurostreaming.Actor
|
||||
# by Napster32
|
||||
# ------------------------------------------------------------
|
||||
|
||||
from core import support
|
||||
from core.item import Item
|
||||
|
||||
host = support.config.get_channel_url()
|
||||
headers = [['Referer', host]]
|
||||
|
||||
@support.menu
|
||||
def mainlist(item):
|
||||
support.info()
|
||||
tvshow = []
|
||||
anime = ['/animazione/']
|
||||
mix = [('Aggiornamenti {bullet bold} {TV}', ['/aggiornamento-episodi/', 'peliculas', 'newest'])]
|
||||
search = ''
|
||||
|
||||
return locals()
|
||||
|
||||
|
||||
@support.scrape
|
||||
def peliculas(item):
|
||||
action = 'episodios'
|
||||
|
||||
if item.args == 'newest':
|
||||
item.contentType = 'episode'
|
||||
patron = r'<span class="serieTitle" style="font-size:20px">(?P<title>[^<]+) –\s*<a href="(?P<url>[^"]+)"[^>]*>(?P<episode>\d+[×x]\d+-\d+|\d+[×x]\d+) (?P<title2>[^<\(]+)\s?\(?(?P<lang>SUB ITA)?\)?</a>'
|
||||
patronNext = r'class="next".*?"(.+?)"'
|
||||
|
||||
else:
|
||||
patron = r'<div class="post-thumb">.*?<img src="(?P<thumb>[^"]+)".*?><a href="(?P<url>[^"]+)"[^>]+>(?P<title>.+?)[\<]'
|
||||
patronNext = r'next.*?href="(.*?)"'
|
||||
# debug = True
|
||||
return locals()
|
||||
|
||||
|
||||
@support.scrape
|
||||
def episodios(item):
|
||||
# debug = True
|
||||
data = support.match(item, headers=headers).data
|
||||
if 'clicca qui per aprire' in data.lower():
|
||||
data = support.match(support.match(data, patron=r'"go_to":"([^"]+)"').match.replace('\\',''), headers=headers).data
|
||||
|
||||
elif 'clicca qui</span>' in data.lower():
|
||||
data = support.match(support.match(data, patron=r'<h2 style="text-align: center;"><a href="([^"]+)">').match, headers=headers).data
|
||||
|
||||
patronBlock = r'tab-content(?P<block>.*?)serie-player'
|
||||
patron = r'data.num..(?P<season>\d+)x(?P<episode>\d+)" data-title="(?P<title>[^"]+).*?data-link="(?P<url>http.*?)</li>'
|
||||
|
||||
return locals()
|
||||
|
||||
|
||||
def search(item, texto):
|
||||
support.info()
|
||||
|
||||
item.url = host + '/index.php?story=%s&do=search&subaction=search' % (texto)
|
||||
item.contentType = 'tvshow'
|
||||
|
||||
try:
|
||||
return peliculas(item)
|
||||
|
||||
# Continua la ricerca in caso di errore
|
||||
except:
|
||||
import sys
|
||||
for line in sys.exc_info():
|
||||
support.info(line)
|
||||
return []
|
||||
|
||||
|
||||
def newest(categoria):
|
||||
support.info()
|
||||
|
||||
itemlist = []
|
||||
item = Item()
|
||||
item.contentType = 'tvshow'
|
||||
item.args = 'newest'
|
||||
try:
|
||||
item.url = "%s/aggiornamento-episodi/" % host
|
||||
item.action = "peliculas"
|
||||
itemlist = peliculas(item)
|
||||
|
||||
# Continua la ricerca in caso di errore
|
||||
except:
|
||||
import sys
|
||||
for line in sys.exc_info():
|
||||
support.info("{0}".format(line))
|
||||
return []
|
||||
|
||||
return itemlist
|
||||
|
||||
def findvideos(item):
|
||||
support.info()
|
||||
itemlist = support.server(item, item.url)
|
||||
return itemlist
|
||||
10
channels/filmpertutti.json
Executable file
10
channels/filmpertutti.json
Executable file
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"id": "filmpertutti",
|
||||
"name": "Filmpertutti",
|
||||
"active": true,
|
||||
"language": ["ita", "sub-ita"],
|
||||
"thumbnail": "filmpertutti.png",
|
||||
"banner": "filmpertutti.png",
|
||||
"categories": ["anime", "tvshow","movie"],
|
||||
"settings": []
|
||||
}
|
||||
185
channels/filmpertutti.py
Executable file
185
channels/filmpertutti.py
Executable file
@@ -0,0 +1,185 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# ------------------------------------------------------------
|
||||
# Canale per filmpertutti.py
|
||||
# ------------------------------------------------------------
|
||||
|
||||
from core import httptools, support, scrapertools
|
||||
from core.item import Item
|
||||
from platformcode import config, logger
|
||||
|
||||
def findhost(url):
|
||||
page = httptools.downloadpage(url).data
|
||||
url = support.scrapertools.find_single_match(page, 'Il nuovo indirizzo di FILMPERTUTTI è ?<a href="([^"]+)')
|
||||
return url
|
||||
|
||||
host = config.get_channel_url(findhost)
|
||||
headers = [['Referer', host]]
|
||||
|
||||
@support.menu
|
||||
def mainlist(item):
|
||||
|
||||
film = ['/category/film/feed/',
|
||||
('Film al cinema', ['/category/ora-al-cinema/feed/', 'peliculas']),
|
||||
('Generi', ['/', 'genres']),
|
||||
('Saghe', ['/', 'genres', 'saghe']),
|
||||
]
|
||||
|
||||
tvshow = ['/category/serie-tv/feed/',
|
||||
]
|
||||
|
||||
anime = ['/category/anime/feed/',
|
||||
('SUB-ITA',['/category/anime-sub-ita/feed/', 'peliculas']),
|
||||
]
|
||||
|
||||
search = ''
|
||||
return locals()
|
||||
|
||||
|
||||
@support.scrape
|
||||
def peliculas(item):
|
||||
if not item.args == 'search': # pagination not works
|
||||
if not item.nextpage:
|
||||
item.page = 1
|
||||
else:
|
||||
item.page = item.nextpage
|
||||
|
||||
if not item.parent_url:
|
||||
item.parent_url = item.url
|
||||
|
||||
if item.args == 'genres':
|
||||
action = 'check'
|
||||
|
||||
item.nextpage = item.page + 1
|
||||
nextPageUrl = "{}/?paged={}".format(item.parent_url, item.nextpage)
|
||||
patron= r'<item>\s<title>(?P<title>[^<]+?)\s*(\((?P<lang>Sub-[a-zA-Z]+)*\))?\s*(\[(?P<quality>[A-Z]*)\])?\s*(\((?P<year>[0-9]{4})\))?</title>.*?<link>(?P<url>.*?)</link>'
|
||||
def fullItemlistHook(itemlist):
|
||||
if len(itemlist) < 10:
|
||||
return itemlist[:-1:]
|
||||
else:
|
||||
return itemlist
|
||||
else:
|
||||
action = 'check'
|
||||
patron= r'<article class=\"elementor-post.*?(<img .*?src=\"(?P<thumb>[^\"]+).*?)?<h3 class=\"elementor-post__title\".*?<a href=\"(?P<url>[^\"]+)\" >\s*(?P<title>[^<]+?)\s*(\((?P<lang>Sub-[a-zA-Z]+)*\))?\s*(\[(?P<quality>[A-Z]*)\])?\s*(\((?P<year>[0-9]{4})\))?\s+<'
|
||||
|
||||
return locals()
|
||||
|
||||
def episodios(item):
|
||||
item.quality = ''
|
||||
data = item.data if item.data else httptools.downloadpage(item.url).data
|
||||
itemlist = []
|
||||
|
||||
for it in support.match(data, patron=[r'div class=\"single-season.*?(?P<id>season_[0-9]+).*?>Stagione:\s(?P<season>[0-9]+).*?(\s-\s(?P<lang>[a-zA-z]+?))?<']).matches:
|
||||
block = support.match(data, patron = r'div id=\"'+ it[0] +'\".*?</div').match
|
||||
for ep in support.match(block, patron=[r'<li><a href=\"(?P<url>[^\"]+).*?img\" src=\"(?P<thumb>[^\"]+).*?title\">(?P<episode>[0-9]+)\.\s+(?P<title>.*?)</span>']).matches:
|
||||
itemlist.append(item.clone(contentType = 'episode',
|
||||
action='findvideos',
|
||||
thumb=ep[1],
|
||||
episode=ep[2],
|
||||
season=it[1],
|
||||
contentSeason=it[1],
|
||||
contentEpisodeNumber=ep[2],
|
||||
title = support.format_longtitle(support.cleantitle(ep[3]), season = it[1], episode = ep[2], lang= it[3]),
|
||||
url = scrapertools.unescape(ep[0]), data = '')
|
||||
)
|
||||
|
||||
if config.get_setting('episode_info') and not support.stackCheck(['add_tvshow', 'get_newest']):
|
||||
support.tmdb.set_infoLabels_itemlist(itemlist, seekTmdb=True)
|
||||
support.check_trakt(itemlist)
|
||||
support.videolibrary(itemlist, item)
|
||||
if (config.get_setting('downloadenabled')):
|
||||
support.download(itemlist, item)
|
||||
|
||||
return itemlist
|
||||
|
||||
@support.scrape
|
||||
def genres(item):
|
||||
action = 'peliculas'
|
||||
blacklist = ['Tutti i film',]
|
||||
wantSaga = True if item.args == 'saghe' else False
|
||||
item.args = 'genres'
|
||||
|
||||
patronBlock = r'<nav class="elementor-nav-menu--main (?P<block>.*?)</nav>'
|
||||
patronMenu = r'<li class="menu-item.*?<a href="(?P<url>https:\/\/.*?)".*?>(?P<title>.*?)</a></li>'
|
||||
|
||||
def itemHook(item):
|
||||
item.url = "{}/feed/".format(item.url)
|
||||
return item
|
||||
|
||||
def itemlistHook(itemlist):
|
||||
itl = []
|
||||
for item in itemlist:
|
||||
isSaga = item.fulltitle.startswith('Saga')
|
||||
|
||||
if len(item.fulltitle) != 3:
|
||||
if (isSaga and wantSaga) or (not isSaga and not wantSaga):
|
||||
itl.append(item)
|
||||
return itl
|
||||
return locals()
|
||||
|
||||
|
||||
def check(item):
|
||||
item.data = httptools.downloadpage(item.url).data
|
||||
if 'season-details' in item.data.lower():
|
||||
item.contentType = 'tvshow'
|
||||
return episodios(item)
|
||||
else:
|
||||
item.contentType = 'movie'
|
||||
return findvideos(item)
|
||||
|
||||
|
||||
def search(item, text):
|
||||
item.url = "{}/?{}".format(host, support.urlencode({'s': text}))
|
||||
item.args = 'search'
|
||||
|
||||
try:
|
||||
return peliculas(item)
|
||||
|
||||
except:
|
||||
import sys
|
||||
for line in sys.exc_info():
|
||||
logger.error("search except: %s" % line)
|
||||
return []
|
||||
|
||||
|
||||
def newest(categoria):
|
||||
support.info()
|
||||
itemlist = []
|
||||
item = Item()
|
||||
try:
|
||||
if categoria == "peliculas":
|
||||
item.url = host + "/category/film/feed/"
|
||||
item.action = "peliculas"
|
||||
item.extra = "movie"
|
||||
item.contentType = 'movie'
|
||||
itemlist = peliculas(item)
|
||||
else:
|
||||
item.url = host + "/category/serie-tv/feed/"
|
||||
item.action = "peliculas"
|
||||
item.args = "newest"
|
||||
item.contentType = 'tvshow'
|
||||
itemlist = peliculas(item)
|
||||
|
||||
# Continua la ricerca in caso di errore
|
||||
except:
|
||||
import sys
|
||||
for line in sys.exc_info():
|
||||
support.info("{0}".format(line))
|
||||
return []
|
||||
|
||||
return itemlist
|
||||
|
||||
|
||||
def findvideos(item):
|
||||
video_url = item.url
|
||||
|
||||
if item.contentType == 'movie':
|
||||
video_url = support.match(item.url, patron=r'<a href="([^"]+)" rel="nofollow">').match
|
||||
|
||||
video_url = support.match(video_url, patron=r'<iframe src=\"(https://.*?)\"').match
|
||||
|
||||
if (video_url == ''):
|
||||
return []
|
||||
|
||||
itemlist = [item.clone(action="play", url=srv) for srv in support.match(video_url, patron='<div class=\"megaButton\" meta-type=\"v\" meta-link=\"([^\"]+).*?(?=>)>').matches]
|
||||
itemlist = support.server(item,itemlist=itemlist)
|
||||
return itemlist
|
||||
10
channels/filmstreaming.json
Executable file
10
channels/filmstreaming.json
Executable file
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"id": "filmstreaming",
|
||||
"name": "Film Streaming",
|
||||
"language": ["ita"],
|
||||
"active": false,
|
||||
"thumbnail": "filmstreaming.png",
|
||||
"banner": "filmstreaming.png",
|
||||
"categories": ["movie"],
|
||||
"settings": []
|
||||
}
|
||||
94
channels/filmstreaming.py
Executable file
94
channels/filmstreaming.py
Executable file
@@ -0,0 +1,94 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# ------------------------------------------------------------
|
||||
# Canale per filmstreaming
|
||||
# ------------------------------------------------------------
|
||||
|
||||
from core import support
|
||||
from core.item import Item
|
||||
from platformcode import config, logger
|
||||
|
||||
host = config.get_channel_url()
|
||||
headers = [['Referer', host]]
|
||||
|
||||
|
||||
@support.menu
|
||||
def mainlist(item):
|
||||
|
||||
film = ['/film',
|
||||
('Al Cinema', ['/cinema', 'peliculas']),
|
||||
('Ultimi Inseriti', ['', 'peliculas', 'last']),
|
||||
('Generi', ['', 'genres', 'genres']),
|
||||
('Anno', ['', 'genres', 'years'])]
|
||||
|
||||
return locals()
|
||||
|
||||
|
||||
def search(item, text):
|
||||
logger.debug('search', text)
|
||||
itemlist = []
|
||||
text = text.replace(" ", "+")
|
||||
item.url = '{}/index.php?do=search&subaction=search&story={}'.format(host, text)
|
||||
|
||||
try:
|
||||
return peliculas(item)
|
||||
except:
|
||||
import sys
|
||||
for line in sys.exc_info():
|
||||
logger.error("search except: %s" % line)
|
||||
return []
|
||||
|
||||
|
||||
def newest(categoria):
|
||||
logger.debug(categoria)
|
||||
|
||||
itemlist = []
|
||||
item = Item()
|
||||
try:
|
||||
if categoria == "peliculas":
|
||||
item.url = host
|
||||
item.action = "peliculas"
|
||||
item.contentType = 'movie'
|
||||
item.args = 'last'
|
||||
itemlist = peliculas(item)
|
||||
if itemlist[-1].action == "peliculas":
|
||||
itemlist.pop()
|
||||
# Continua la ricerca in caso di errore
|
||||
except:
|
||||
import sys
|
||||
for line in sys.exc_info():
|
||||
logger.error("{0}".format(line))
|
||||
return []
|
||||
|
||||
return itemlist
|
||||
|
||||
|
||||
@support.scrape
|
||||
def peliculas(item):
|
||||
# debug=True
|
||||
if item.args == 'last':
|
||||
patronBlock = r'inseriti:(?P<block>.*?)<div class="block-showmore'
|
||||
patron = r'item-movie">[^>]+><a href="(?P<url>[^"]+)[^>]+><img data-src="(?P<thumb>[^"]+)(?:[^>]+>){6}(?P<title>[^<]+)(?:[^>]+>){4}(?P<year>\d+)?(?:[^>]+>){2}(?P<quality>[^<]+)'
|
||||
# patron = r'item-movie">[^>]+><a href="(?P<url>[^"]+)[^>]+><img data-src="(?P<thumb>[^"]+)(?:[^>]+>){6}(?P<title>[^<]+)(?:[^>]+>){6}(?P<quality>[^<]+)'
|
||||
patronNext = r'<a href="([^"]+)">&rarr'
|
||||
return locals()
|
||||
|
||||
|
||||
@support.scrape
|
||||
def genres(item):
|
||||
action = "peliculas"
|
||||
_type ={'years':'Anno', 'genres':'Categorie'}
|
||||
|
||||
patronBlock = _type[item.args] + r'(?:[^>]+>){4}(?P<block>.*?)</ul>'
|
||||
patronMenu = '<li><a href="(?P<url>[^"]+)">(?P<title>.*?)</a>'
|
||||
|
||||
return locals()
|
||||
|
||||
|
||||
def findvideos(item):
|
||||
urls = []
|
||||
data = support.match(item.url).data
|
||||
urls += support.match(data, patron=r'<span data-link="([^"]+)').matches
|
||||
url = support.match(data, patron='<iframe [^>]+src="([^"]+)').match
|
||||
if url:
|
||||
urls.append(support.match(url).data)
|
||||
return support.server(item, urls)
|
||||
11
channels/guardaseriecam.json
Executable file
11
channels/guardaseriecam.json
Executable file
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"id": "guardaseriecam",
|
||||
"name": "GuardaSerie Cam",
|
||||
"language": ["ita", "sub-ita"],
|
||||
"active": true,
|
||||
"thumbnail": "https://raw.githubusercontent.com/32Dexter/DexterRepo/master/media/guardaserie_live.png",
|
||||
"banner": "",
|
||||
"categories": ["tvshow"],
|
||||
"not_active": ["include_in_newest"],
|
||||
"settings": []
|
||||
}
|
||||
71
channels/guardaseriecam.py
Executable file
71
channels/guardaseriecam.py
Executable file
@@ -0,0 +1,71 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# ------------------------------------------------------------
|
||||
# Canale per 'guardaserie_live'
|
||||
# By: Napster32
|
||||
# ------------------------------------------------------------
|
||||
# Rev: 0.0
|
||||
# Update 11-06-2020
|
||||
# fix:
|
||||
# 1. Emissione
|
||||
|
||||
# possibilità di miglioramento: inserire menu per genere - lista serie tv e gestire le novità
|
||||
|
||||
from core import support
|
||||
from core.support import info
|
||||
from platformcode import logger, config
|
||||
|
||||
host = config.get_channel_url()
|
||||
headers = [['Referer', host]]
|
||||
|
||||
|
||||
@support.menu
|
||||
def mainlist(item):
|
||||
tvshow = ['/serietv-streaming',
|
||||
('Per Lettera', ['/serietv-streaming/A', 'list', 'Serie-Tv per Lettera'])
|
||||
]
|
||||
return locals()
|
||||
|
||||
|
||||
@support.scrape
|
||||
def list(item):
|
||||
patronMenu = r'<a title="(?P<title>[^"]+)" href="(?P<url>[^"]+)'
|
||||
action = 'peliculas'
|
||||
return locals()
|
||||
|
||||
|
||||
@support.scrape
|
||||
def peliculas(item):
|
||||
# debug = True
|
||||
patron = r'<div class="mlnh-thumb"><a href="(?P<url>[^"]+)[^>]+title="(?P<title>[^"]+).*?<img src="(?P<thumb>[^"]+).*?hdn">[^<]*(?P<year>[0-9]{4})'
|
||||
patronNext = 'pagenavi.*?<a href="([^"]+)">\d+'
|
||||
action = 'episodios'
|
||||
return locals()
|
||||
|
||||
|
||||
@support.scrape
|
||||
def episodios(item):
|
||||
patronBlock = r'<div class="tab-pane fade" id="season-(?P<season>.)"(?P<block>.*?)</ul>\s*</div>'
|
||||
patron = r'(?P<data><a href="#" allowfullscreen data-link="[^"]+.*?title="(?P<title>[^"]+)(?P<lang>[sS][uU][bB]-?[iI][tT][aA])?\s*">(?P<episode>[^<]+).*?</li>)'
|
||||
action = 'findvideos'
|
||||
# debug = True
|
||||
return locals()
|
||||
|
||||
|
||||
def search(item, text):
|
||||
support.info('search', text)
|
||||
item.contentType = 'tvshow'
|
||||
itemlist = []
|
||||
text = text.replace(' ', '+')
|
||||
item.url = host + '/index.php?story=%s&do=search&subaction=search' % (text)
|
||||
try:
|
||||
return peliculas(item)
|
||||
except:
|
||||
import sys
|
||||
for line in sys.exc_info():
|
||||
info('search log:', line)
|
||||
return []
|
||||
|
||||
|
||||
def findvideos(item):
|
||||
logger.debug()
|
||||
return support.server(item, item.data)
|
||||
29
channels/guardaserieclick.json
Executable file
29
channels/guardaserieclick.json
Executable file
@@ -0,0 +1,29 @@
|
||||
{
|
||||
"id": "guardaserieclick",
|
||||
"name": "GuardaSerie.click",
|
||||
"active": false,
|
||||
"language": ["ita", "vos"],
|
||||
"thumbnail": "guardaserieclick.png",
|
||||
"bannermenu": "guardaserieclick.png",
|
||||
"categories": ["tvshow", "anime"],
|
||||
"not_active": ["include_in_newest_peliculas", "include_in_newest_anime"],
|
||||
"settings": [
|
||||
{
|
||||
"id": "include_in_newest_peliculas",
|
||||
"type": "bool",
|
||||
"label": "@70727",
|
||||
"default": false,
|
||||
"enabled": false,
|
||||
"visible": false
|
||||
},
|
||||
{
|
||||
"id": "include_in_newest_anime",
|
||||
"type": "bool",
|
||||
"label": "@70727",
|
||||
"default": false,
|
||||
"enabled": false,
|
||||
"visible": false
|
||||
}
|
||||
],
|
||||
"cloudflare": true
|
||||
}
|
||||
187
channels/guardaserieclick.py
Executable file
187
channels/guardaserieclick.py
Executable file
@@ -0,0 +1,187 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# ------------------------------------------------------------
|
||||
# Canale per guardaserieclick
|
||||
# ------------------------------------------------------------
|
||||
|
||||
"""
|
||||
|
||||
Avvisi per il test:
|
||||
- Le voci del menu le trovi in "lista serie" del sito, e Generi = Sfoglia
|
||||
- SE capita che entrando in una voce trovi "nessun elemento" torna indietro e rientra nella voce.
|
||||
- Tutte le voci, tranne: Anime/Cartoni, mostrano per ogni pagina, al max 25 titoli
|
||||
|
||||
Presente in NOVITà:
|
||||
- Serietv
|
||||
"""
|
||||
|
||||
from core import support
|
||||
from core.item import Item
|
||||
from platformcode import config
|
||||
from core.support import info
|
||||
|
||||
host = config.get_channel_url()
|
||||
headers = [['Referer', host]]
|
||||
|
||||
|
||||
@support.menu
|
||||
def mainlist(item):
|
||||
tvshow = ['',
|
||||
('Aggiornamenti', ['', 'peliculas', 'update']),
|
||||
('Generi', ['', 'genres', 'genres']),
|
||||
('News Sub-ITA', ['', 'peliculas', 'ined']),
|
||||
('Anime/Cartoni', ["/category/animazione/", 'peliculas', 'genres'])
|
||||
]
|
||||
|
||||
return locals()
|
||||
|
||||
|
||||
##@support.scrape
|
||||
##def peliculas(item):
|
||||
#### import web_pdb; web_pdb.set_trace()
|
||||
## info('peliculas ->\n', item)
|
||||
##
|
||||
## action = 'episodios'
|
||||
## block = r'(?P<block>.*?)<div\s+class="btn btn-lg btn-default btn-load-other-series">'
|
||||
##
|
||||
## if item.args == 'ined':
|
||||
## deflang = 'SUB-ITA'
|
||||
## patronBlock = r'<span\s+class="label label-default label-title-typology">'+block
|
||||
## patron = r'<a href="(?P<url>[^"]+)".*?>\s<img\s.*?src="(?P<thumb>[^"]+)"\s/>[^>]+>[^>]+>\s[^>]+>\s(?P<year>\d{4})?\s.+?class="strongText">(?P<title>.+?)<'
|
||||
## pagination = 25
|
||||
## elif item.args == 'update':
|
||||
## patronBlock = r'<div\s+class="container-fluid greybg title-serie-lastep title-last-ep fixed-title-wrapper containerBottomBarTitle">'+block
|
||||
## patron = r'<a(?: rel="[^"]+")? href="(?P<url>[^"]+)"(?: class="[^"]+")?>[ ]<img class="[^"]+"[ ]title="[^"]+"[ ]alt="[^"]+"[ ]src="(?P<thumb>[^"]+)"[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>(?P<episode>\d+.\d+)[ ]\((?P<lang>[a-zA-Z\-]+)[^<]+<[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>(?P<title>[^<]+)<'
|
||||
## elif item.args == 'genres':
|
||||
## patronBlock = r'<h2 style="color: white !important" class="title-typology">(?P<block>.+?)<div class="container-fluid whitebg" style="">'
|
||||
## patron = r'<a href="(?P<url>[^"]+)".*?>\s<img\s.*?src="(?P<thumb>[^"]+)"\s/>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>(?P<title>[^<]+)</p>'
|
||||
## patronNext = r'rel="next" href="([^"]+)">'
|
||||
## item.contentType = 'tvshow'
|
||||
## elif item.args == 'nolost':
|
||||
## patronBlock = r'<h2 class="title-typology styck-top" meta-class="title-serie-danonperd">'+block
|
||||
## patron = r'<a href="(?P<url>[^"]+)".*?>\s<img\s.*?src="(?P<thumb>[^"]+)"\s/>[^>]+>[^>]+>\s[^>]+>\s(?P<year>\d{4})?\s.+?class="strongText">(?P<title>.+?)<'
|
||||
## pagination = 25
|
||||
## elif item.args == 'classic':
|
||||
## patronBlock = r'<h2 class="title-typology styck-top" meta-class="title-serie-classiche">'+block
|
||||
## patron = r'<a href="(?P<url>[^"]+)".*?>\s<img\s.*?src="(?P<thumb>[^"]+)"\s/>[^>]+>[^>]+>\s[^>]+>\s(?P<year>\d{4})?\s.+?class="strongText">(?P<title>.+?)<'
|
||||
## pagination = 25
|
||||
## else:
|
||||
## patronBlock = r'<div\s+class="container container-title-serie-new container-scheda" meta-slug="new">'+block
|
||||
## patron = r'<a href="(?P<url>[^"]+)".*?>\s<img\s.*?src="(?P<thumb>[^"]+)"\s/>[^>]+>[^>]+>\s[^>]+>\s(?P<year>\d{4})?\s.+?class="strongText">(?P<title>.+?)<'
|
||||
## pagination = 25
|
||||
##
|
||||
## debug = True
|
||||
## return locals()
|
||||
|
||||
@support.scrape
|
||||
def peliculas(item):
|
||||
## import web_pdb; web_pdb.set_trace()
|
||||
info('peliculas ->\n', item)
|
||||
|
||||
action = 'episodios'
|
||||
blacklist = ['DMCA']
|
||||
|
||||
if item.args == 'genres' or item.args == 'search':
|
||||
patronBlock = r'<h2 style="color:\s?white !important;?" class="title-typology">(?P<block>.+?)<div class="container-fluid whitebg" style="">'
|
||||
patron = r'<a href="(?P<url>[^"]+)".*?>\s<img\s.*?src="(?P<thumb>[^"]+)"\s/>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>(?P<title>[^<]+)</p>'
|
||||
patronNext = r'rel="next" href="([^"]+)">'
|
||||
item.contentType = 'tvshow'
|
||||
## elif item.args == 'search':
|
||||
## patronBlock = r'<h2 style="color:\s?white !important.?" class="title-typology">(?P<block>.*?)<div class="container-fluid whitebg" style="">'
|
||||
## patron = r'<a href="(?P<url>[^"]+)".*?>\s<img\s.*?src="(?P<thumb>[^"]+)"\s/>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>(?P<title>[^<]+)</p>'
|
||||
else:
|
||||
end_block = r'(?P<block>.*?)<div\s+class="btn btn-lg btn-default btn-load-other-series">'
|
||||
patron = r'<a href="(?P<url>[^"]+)".*?>\s<img\s.*?src="(?P<thumb>[^"]+)"\s/>[^>]+>[^>]+>\s[^>]+>\s(?P<year>\d{4})?\s.+?class="strongText">(?P<title>.+?)<'
|
||||
pagination = 25
|
||||
if item.args == 'ined':
|
||||
deflang = 'SUB-ITA'
|
||||
patronBlock = r'<span\s+class="label label-default label-title-typology">' + end_block
|
||||
## patron = r'<a href="(?P<url>[^"]+)".*?>\s<img\s.*?src="(?P<thumb>[^"]+)"\s/>[^>]+>[^>]+>\s[^>]+>\s(?P<year>\d{4})?\s.+?class="strongText">(?P<title>.+?)<'
|
||||
## pagination = 25
|
||||
elif item.args == 'update':
|
||||
patronBlock = r'<div\s+class="container-fluid greybg title-serie-lastep title-last-ep fixed-title-wrapper containerBottomBarTitle">' + end_block
|
||||
patron = r'href="(?P<url>[^"]+)".*?>\s<img\s.*?src="(?P<thumb>[^"]+)"\s/>[^>]+>[^>]+>\s[^>]+>.+?class="strongText">(?P<title>.+?)<'
|
||||
# elif item.args == 'nolost':
|
||||
# patronBlock = r'<h2 class="title-typology styck-top" meta-class="title-serie-danonperd">' + end_block
|
||||
# pagination = 25
|
||||
# elif item.args == 'classic':
|
||||
# patronBlock = r'<h2 class="title-typology styck-top" meta-class="title-serie-classiche">' + end_block
|
||||
## patron = r'<a href="(?P<url>[^"]+)".*?>\s<img\s.*?src="(?P<thumb>[^"]+)"\s/>[^>]+>[^>]+>\s[^>]+>\s(?P<year>\d{4})?\s.+?class="strongText">(?P<title>.+?)<'
|
||||
## pagination = 25
|
||||
## elif item.args == 'anime':
|
||||
##
|
||||
else:
|
||||
patronBlock = r'<div\s+class="container container-title-serie-new container-scheda" meta-slug="new">' + end_block
|
||||
## patron = r'<a href="(?P<url>[^"]+)".*?>\s<img\s.*?src="(?P<thumb>[^"]+)"\s/>[^>]+>[^>]+>\s[^>]+>\s(?P<year>\d{4})?\s.+?class="strongText">(?P<title>.+?)<'
|
||||
## pagination = 25
|
||||
# support.regexDbg(item, patronBlock, headers)
|
||||
# debug = True
|
||||
return locals()
|
||||
|
||||
|
||||
@support.scrape
|
||||
def episodios(item):
|
||||
info()
|
||||
|
||||
action = 'findvideos'
|
||||
patron = r'<div class="number-episodes-on-img">\s?\d+.\d+\s?(?:\((?P<lang>[a-zA-Z\-]+)\))?</div>.+?(?:<span class="pull-left bottom-year">(?P<title2>[^<]+)<[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>(?P<plot>[^<]+)<[^>]+>[^>]+>[^>]+>\s?)?<span(?: meta-nextep="[^"]+")? class="[^"]+" meta-serie="(?P<title>[^"]+)" meta-stag="(?P<season>\d+)" meta-ep="(?P<episode>\d+)" meta-embed="(?P<url>[^>]+)">'
|
||||
patronBlock = r'<h2 class="title-typology">Episodi (?P<stagione>\d+).{1,3}Stagione</h2>(?P<block>.*?)<div class="container">'
|
||||
|
||||
def itemHook(item):
|
||||
item.title = item.title.replace(item.fulltitle, '').replace('-', '', 1)
|
||||
return item
|
||||
|
||||
# debug = True
|
||||
return locals()
|
||||
|
||||
|
||||
@support.scrape
|
||||
def genres(item):
|
||||
info()
|
||||
|
||||
action = 'peliculas'
|
||||
patronMenu = r'<li>\s<a\shref="(?P<url>[^"]+)"[^>]+>(?P<title>[^<]+)</a></li>'
|
||||
patron_block = r'<ul\sclass="dropdown-menu category">(?P<block>.*?)</ul>'
|
||||
# debug = True
|
||||
return locals()
|
||||
|
||||
|
||||
def search(item, text):
|
||||
info(text)
|
||||
item.url = host + "/?s=" + text
|
||||
item.contentType = 'tvshow'
|
||||
item.args = 'search'
|
||||
try:
|
||||
return peliculas(item)
|
||||
# Continua la ricerca in caso di errore
|
||||
except:
|
||||
import sys
|
||||
for line in sys.exc_info():
|
||||
info("%s" % line)
|
||||
return []
|
||||
|
||||
|
||||
def newest(categoria):
|
||||
info()
|
||||
itemlist = []
|
||||
item = Item()
|
||||
item.contentType = 'tvshow'
|
||||
item.args = 'update'
|
||||
try:
|
||||
if categoria == "series":
|
||||
item.url = host
|
||||
item.action = "peliculas"
|
||||
itemlist = peliculas(item)
|
||||
|
||||
# Continua la ricerca in caso di errore
|
||||
except:
|
||||
import sys
|
||||
for line in sys.exc_info():
|
||||
info("{0}".format(line))
|
||||
return []
|
||||
|
||||
return itemlist
|
||||
|
||||
|
||||
def findvideos(item):
|
||||
info('--->', item)
|
||||
return support.server(item, item.url)
|
||||
11
channels/guardaserieicu.json
Executable file
11
channels/guardaserieicu.json
Executable file
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"id": "guardaserieicu",
|
||||
"name": "Guarda Serie Icu",
|
||||
"language": ["ita", "sub-ita"],
|
||||
"active": false,
|
||||
"thumbnail": "https://raw.githubusercontent.com/32Dexter/DexterRepo/master/media/guarda_serie.jpg",
|
||||
"banner": "",
|
||||
"categories": ["tvshow"],
|
||||
"not_active": ["include_in_newest"],
|
||||
"settings": []
|
||||
}
|
||||
65
channels/guardaserieicu.py
Executable file
65
channels/guardaserieicu.py
Executable file
@@ -0,0 +1,65 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# ------------------------------------------------------------
|
||||
# Canale per 'Guarda_Serie'
|
||||
# By: Napster32
|
||||
# ------------------------------------------------------------
|
||||
# Rev: 0.0
|
||||
# Update 11-06-2020
|
||||
# fix:
|
||||
# 1. Emissione
|
||||
|
||||
# possibilità di miglioramento: gestire le novità (sezione Ultimi episodi sul sito)
|
||||
|
||||
from core.support import info
|
||||
from core import support
|
||||
from platformcode import config
|
||||
|
||||
host = config.get_channel_url()
|
||||
headers = [['Referer', host]]
|
||||
|
||||
|
||||
@support.menu
|
||||
def mainlist(item):
|
||||
tvshow = ['/serie']
|
||||
return locals()
|
||||
|
||||
|
||||
@support.scrape
|
||||
def peliculas(item):
|
||||
# debug = True
|
||||
# patronBlock = r'movies-list movies-list-full(?P<block>.*?)footer>'
|
||||
if item.args == 'search':
|
||||
patron = r'<div data-movie-id[^>]+>\s*<a href="(?P<url>[^"]+)"[^>]+>(?:\s*<span class="mli-quality">(?P<quality>[^>]+)</span>)?\s*<img src="(?P<thumbnail>[^"]+)[^>]+>[^>]+>[^>]+>(?P<title>[^<]+).*?jt-info[^>]+>[^:]+:\s*(?P<rating>[^<]+)[^>]+>[^>]+>[^>]+>(?P<year>\d*)[^>]+>[^>]+>[^>]+>(?P<duration>\d*).*?"f-desc">(?:\s*<p>(?P<plot>[^<]+))?'
|
||||
else:
|
||||
patron = r'<div data-movie-id[^>]+>\s*<a href="(?P<url>[^"]+)"[^>]+>[^>]+>[^>]+><img src="(?P<thumbnail>[^"]+)[^>]+>[^>]+>[^>]+>[^>]+>(?P<title>[^<]+).*?jt-info[^>]+>[^:]+:\s*(?P<rating>[^<]+)[^>]+>[^>]+>[^>]+>(?P<year>\d*)[^>]+>[^>]+>[^>]+>(?P<duration>\d*)'
|
||||
patronNext = '<li class=.active.>.*?href=.(.*?).>'
|
||||
action = 'episodios'
|
||||
return locals()
|
||||
|
||||
|
||||
@support.scrape
|
||||
def episodios(item):
|
||||
patronBlock = r'<strong>Stagione (?P<season>[0-9]+)(?P<block>.*?)</div></div>'
|
||||
patron = r'<a href="(?P<url>[^"]+)">\s*Episodio\s*(?P<episode>[0-9]+)'
|
||||
return locals()
|
||||
|
||||
|
||||
def search(item, text):
|
||||
info(text)
|
||||
item.contentType = 'tvshow'
|
||||
item.url = host + "/?s=" + text
|
||||
try:
|
||||
item.args = 'search'
|
||||
return peliculas(item)
|
||||
except:
|
||||
import sys
|
||||
for line in sys.exc_info():
|
||||
info("%s" % line)
|
||||
|
||||
return []
|
||||
|
||||
|
||||
def findvideos(item):
|
||||
support.info('findvideos', item)
|
||||
data = support.match(item, headers=headers, patron=r'div class="movieplay">([^>]+)').matches
|
||||
return support.server(item, data=data )
|
||||
11
channels/hd4me.json
Executable file
11
channels/hd4me.json
Executable file
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"id": "hd4me",
|
||||
"name": "HD4ME",
|
||||
"language": ["ita", "sub-ita"],
|
||||
"active": true,
|
||||
"thumbnail": "hd4me.png",
|
||||
"banner": "hd4me.png",
|
||||
"categories": ["movie", "vos"],
|
||||
"not_active": ["include_in_newest"],
|
||||
"settings": []
|
||||
}
|
||||
63
channels/hd4me.py
Executable file
63
channels/hd4me.py
Executable file
@@ -0,0 +1,63 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# ------------------------------------------------------------
|
||||
# Canale per HD4ME
|
||||
# ------------------------------------------------------------
|
||||
|
||||
from core import support
|
||||
|
||||
|
||||
host = support.config.get_channel_url()
|
||||
headers = [['Referer', host]]
|
||||
|
||||
|
||||
@support.menu
|
||||
def mainlist(item):
|
||||
|
||||
film = [('Genere', ['', 'genre'])]
|
||||
|
||||
return locals()
|
||||
|
||||
|
||||
@support.scrape
|
||||
def peliculas(item):
|
||||
# debug = True
|
||||
if item.args == 'alternative':
|
||||
pagination = ''
|
||||
patron = r'<a title="(?P<title>[^\(]+)\(\s*(?P<year>\d+)\)\s\D+(?P<quality>\d+p).{3}(?P<lang>[^ ]+).*?[^"]+"\s*href="(?P<url>[^"]+)'
|
||||
else:
|
||||
patron = r'<a href="(?P<url>[^"]+)" (?:rel="?[0-9]+"?)? title="(?P<title>[^"]+)(?!\()\s*\((?P<year>\d+)\)\s(?:[^\]]+\])?\D+(?P<quality>\d+p).{3}(?P<lang>[^ ]+).*?<img id="?cov"?.*?src="(?P<thumb>[^"]+)'
|
||||
patronNext = r'current(?:[^>]*>){2}\s*<a class="[^"]+"\s* href="([^"]+)'
|
||||
return locals()
|
||||
|
||||
|
||||
@support.scrape
|
||||
def genre(item):
|
||||
action = 'peliculas'
|
||||
blacklist =['prova ']
|
||||
patronMenu = r'<a href="(?P<url>[^"]+)" class="menu-link\s*sub-menu-link">(?P<title>[^<]+)<'
|
||||
def itemHook(item):
|
||||
if item.fulltitle in ['Classici Disney', 'Studio Ghibli', 'Pixar']:
|
||||
item.args = 'alternative'
|
||||
return item
|
||||
return locals()
|
||||
|
||||
|
||||
def search(item, text):
|
||||
support.info(text)
|
||||
item.url = host + '/?s=' + text
|
||||
try:
|
||||
return peliculas(item)
|
||||
# Cattura la eccezione così non interrompe la ricerca globle se il canale si rompe!
|
||||
except:
|
||||
import sys
|
||||
for line in sys.exc_info():
|
||||
support.logger.error("search except: %s" % line)
|
||||
return []
|
||||
|
||||
|
||||
def findvideos(item):
|
||||
url = support.match(item, patron=r'<a class=["]?bot1["]? href="([^"]+)"').match
|
||||
if not url.startswith('http'):
|
||||
url = host + url
|
||||
url = support.httptools.downloadpage(url, followredirect=True).url
|
||||
return support.server(item, url)
|
||||
11
channels/ilcorsaronero.json
Executable file
11
channels/ilcorsaronero.json
Executable file
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"id": "ilcorsaronero",
|
||||
"name": "ilCorSaRoNeRo",
|
||||
"active": true,
|
||||
"language": ["ita"],
|
||||
"thumbnail": "ilcorsaronero.png",
|
||||
"banner": "ilcorsaronero.png",
|
||||
"categories": ["movie", "tvshow", "music", "torrent"],
|
||||
"not_active": ["include_in_newest"],
|
||||
"settings": []
|
||||
}
|
||||
62
channels/ilcorsaronero.py
Executable file
62
channels/ilcorsaronero.py
Executable file
@@ -0,0 +1,62 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# ------------------------------------------------------------
|
||||
# Canale per ilcorsaronero
|
||||
# ------------------------------------------------------------
|
||||
|
||||
from core import support, httptools
|
||||
|
||||
host = support.config.get_channel_url()
|
||||
support.info('HOST',host)
|
||||
headers = [['Referer', host]]
|
||||
|
||||
@support.menu
|
||||
def mainlist(item):
|
||||
|
||||
menu = [
|
||||
('Film {film}', ['/cat/film', 'peliculas', [0, 'movie', True], 'undefined']),
|
||||
('Serie TV', ['/cat/serie-tv', 'peliculas', [0 , 'tvshow', True], 'undefined']),
|
||||
('Animazione', ['/cat/animazione', 'peliculas', [0 , 'anime', True], 'undefined']),
|
||||
('Documentari', ['/cat/altro/documentari', 'peliculas', [0 , 'documentary', True], 'undefined']),
|
||||
('Programmi TV', ['/cat/altro/programmi-tv', 'peliculas', [0 , 'tvshow', True], 'tvshow']),
|
||||
('Video Musica', ['/cat/musica/video-musicali', 'peliculas', [0 , 'music', False], 'undefined']),
|
||||
('Videocorsi', ['/cat/altro/videocorsi', 'peliculas', [0 , 'music', False], 'undefined'])
|
||||
]
|
||||
search = ''
|
||||
|
||||
return locals()
|
||||
|
||||
@support.scrape
|
||||
def peliculas(item):
|
||||
debug = False
|
||||
action = 'findvideos'
|
||||
sceneTitle = item.args[2]
|
||||
|
||||
def itemHook(item):
|
||||
if not sceneTitle:
|
||||
item.title = item.title.replace('_', ' ')
|
||||
item.fulltitle = item.fulltitle.replace('_', ' ')
|
||||
item.title = support.scrapertools.decodeHtmlentities(support.urlparse.unquote(item.title))
|
||||
|
||||
return item
|
||||
|
||||
patron = r'<a class="hover:underline line-clamp-1.*?href="(?P<url>[^"]+)"\s*>(?P<title>.*?)</a>[^>]+>[^>]+>[^>]+>(?P<seed>.*?)<'
|
||||
patronNext = r'<a href="(?P<url>[^"]+)".*?Next</span>'
|
||||
return locals()
|
||||
|
||||
def search(item, text):
|
||||
item.url = "{}/search?{}".format(host, support.urlencode({'q': text}))
|
||||
item.args = 'search'
|
||||
|
||||
try:
|
||||
return peliculas(item)
|
||||
|
||||
except:
|
||||
import sys
|
||||
for line in sys.exc_info():
|
||||
logger.error("search except: %s" % line)
|
||||
return []
|
||||
|
||||
def findvideos(item):
|
||||
if item.contentType == 'tvshow': item.contentType = 'episode'
|
||||
Videolibrary = True if 'movie' in item.args else False
|
||||
return support.server(item, support.match(item.url, patron=r'"(magnet[^"]+)').match, Videolibrary=Videolibrary)
|
||||
10
channels/ilgeniodellostreaming.json
Executable file
10
channels/ilgeniodellostreaming.json
Executable file
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"id": "ilgeniodellostreaming",
|
||||
"name": "IlGenioDelloStreaming",
|
||||
"active": false,
|
||||
"language": ["ita", "sub-ita"],
|
||||
"thumbnail": "ilgeniodellostreaming.png",
|
||||
"banner": "ilgeniodellostreaming.png",
|
||||
"categories": ["movie", "tvshow", "anime", "vos"],
|
||||
"settings": ["include_in_newest_anime"]
|
||||
}
|
||||
202
channels/ilgeniodellostreaming.py
Executable file
202
channels/ilgeniodellostreaming.py
Executable file
@@ -0,0 +1,202 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# ------------------------------------------------------------
|
||||
#
|
||||
# Canale per ilgeniodellostreaming
|
||||
# ------------------------------------------------------------
|
||||
|
||||
|
||||
from core import support
|
||||
from core.support import info
|
||||
from core.item import Item
|
||||
from platformcode import config
|
||||
|
||||
host = config.get_channel_url()
|
||||
headers = [['Referer', host]]
|
||||
|
||||
@support.menu
|
||||
def mainlist(item):
|
||||
support.info(item)
|
||||
|
||||
film = ['/film/',
|
||||
('Generi',['', 'genres', 'genres']),
|
||||
('Per Lettera',['/film-a-z/', 'genres', 'letter']),
|
||||
('Anni',['', 'genres', 'year']),
|
||||
('Popolari',['/trending/?get=movies', 'peliculas', 'populared']),
|
||||
('Più Votati', ['/ratings/?get=movies', 'peliculas', 'populared'])
|
||||
]
|
||||
|
||||
tvshow = ['/serie/',
|
||||
('Aggiornamenti', ['/aggiornamenti-serie/', 'peliculas', 'update']),
|
||||
('Popolari',['/trending/?get=tv', 'peliculas', 'populared']),
|
||||
('Più Votati', ['/ratings/?get=tv', 'peliculas', 'populared'])
|
||||
|
||||
]
|
||||
|
||||
anime = ['/anime/'
|
||||
]
|
||||
|
||||
Tvshow = [
|
||||
('Show TV {bullet bold}', ['/tv-show/', 'peliculas', '', 'tvshow'])
|
||||
]
|
||||
|
||||
search = ''
|
||||
|
||||
return locals()
|
||||
|
||||
|
||||
@support.scrape
|
||||
def peliculas(item):
|
||||
info()
|
||||
# debugBlock = True
|
||||
# debug=True
|
||||
|
||||
if item.args == 'search':
|
||||
patronBlock = r'<div class="search-page">(?P<block>.*?)<footer class="main">'
|
||||
patron = r'<img src="(?P<thumb>[^"]+)" alt="[^"]+" ?/?>[^>]+>(?P<type>[^<]+)</span>.*?<a href="(?P<url>[^"]+)">(?P<title>.+?)[ ]?(?:\[(?P<lang>Sub-ITA)\])?</a>[^>]+>[^>]+>(?:<span class="rating">IMDb\s*(?P<rating>[^>]+)</span>)?.?(?:<span class="year">(?P<year>[0-9]+)</span>)?.*?<p>(?P<plot>.*?)</p>'
|
||||
|
||||
typeContentDict={'movie': ['film'], 'tvshow': ['tv']}
|
||||
typeActionDict={'findvideos': ['film'], 'episodios': ['tv']}
|
||||
else:
|
||||
|
||||
if item.contentType == 'movie':
|
||||
endBlock = '</article></div>'
|
||||
else:
|
||||
endBlock = '<footer class="main">'
|
||||
|
||||
patronBlock = r'<header><h1>.+?</h1>(?P<block>.*?)'+endBlock
|
||||
|
||||
if item.contentType == 'movie':
|
||||
if item.args == 'letter':
|
||||
patronBlock = r'<table class="table table-striped">(?P<block>.+?)</table>'
|
||||
patron = r'<img src="(?P<thumb>[^"]+)"[^>]+>[^>]+>[^>]+><td class="mlnh-2"><a href="(?P<url>[^"]+)">(?P<title>.+?)[ ]?(?:\[(?P<lang>Sub-ITA)\])?<[^>]+>[^>]+>[^>]+>(?P<year>\d{4})\s+<'
|
||||
elif item.args == 'populared':
|
||||
patron = r'<img src="(?P<thumb>[^"]+)" alt="[^"]+">[^>]+>[^>]+>[^>]+>[^>]+>\s+?(?P<rating>\d+.?\d+|\d+)<[^>]+>[^>]+>(?P<quality>[a-zA-Z\-]+)[^>]+>[^>]+>[^>]+>[^>]+><a href="(?P<url>[^"]+)">(?P<title>[^<]+)<[^>]+>[^>]+>[^>]+>(?P<year>\d+)<'
|
||||
else:
|
||||
|
||||
#patron = r'<div class="poster">\s*<a href="(?P<url>[^"]+)"><img src="(?P<thumb>[^"]+)" alt="[^"]+"><\/a>[^>]+>[^>]+>[^>]+>\s*(?P<rating>[0-9.]+)<\/div><span class="quality">(?:SUB-ITA|)?(?P<quality>|[^<]+)?<\/span>[^>]+>[^>]+>[^>]+>[^>]+>(?P<title>.+?)[ ]?(?:\[(?P<lang>Sub-ITA)\])?<\/a>[^>]+>[^>]+>(?P<year>[^<]+)<\/span>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>(?P<plot>[^<]+)<div'
|
||||
patron = r'<div class="poster">\s?<a href="(?P<url>[^"]+)"><img src="(?P<thumb>[^"]+)" alt="[^"]+"><\/a>[^>]+>[^>]+>[^>]+>\s*(?P<rating>[0-9.]+)<\/div>(?:<span class="quality">(?:SUB-ITA|)?(?P<quality>|[^<]+)?<\/span>)?[^>]+>[^>]+>[^>]+>[^>]+>(?P<title>.+?)[ ]?(?:\[(?P<lang>Sub-ITA)\])?<\/a>[^>]+>[^>]+>(?P<year>[^<]+)<\/span>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>(?P<plot>[^<]+)<div'
|
||||
else:
|
||||
# TVSHOW
|
||||
action = 'episodios'
|
||||
if item.args == 'update':
|
||||
action = 'findvideos'
|
||||
patron = r'<div class="poster"><img src="(?P<thumb>[^"]+)"(?:[^>]+>){2}<a href="(?P<url>[^"]+)">[^>]+>(?P<episode>[\d\-x]+)(?:[^>]+>){4}(?P<title>.+?)(?:\[(?P<lang>[SsuUbBiItTaA-]{7})\])?<(?:[^>]+>){4}(?P<quality>[HDWEBRIP-]+)?(?:.+?)?/span><p class="serie"'
|
||||
pagination = 25
|
||||
def itemHook(item):
|
||||
item.contentType = 'episode'
|
||||
return item
|
||||
else:
|
||||
patron = r'<div class="poster">\s?<a href="(?P<url>[^"]+)"><img src="(?P<thumb>[^"]+)" alt="[^"]+"><\/a>[^>]+>[^>]+>[^>]+> (?P<rating>[0-9.]+)<[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>(?P<title>.+?)[ ]?(?:\[(?P<lang>Sub-ITA|Sub-ita)\])?<[^>]+>[^>]+>[^>]+>(?P<year>[0-9]{4})?[^<]*(?:<.*?<div class="texto">(?P<plot>[^<]+)?)?'
|
||||
patronNext = '<span class="current">[^<]+<[^>]+><a href=[\'"]([^\'"]+)[\'"]'
|
||||
|
||||
#support.regexDbg(item, patron, headers)
|
||||
# debug = True
|
||||
return locals()
|
||||
|
||||
|
||||
@support.scrape
|
||||
def episodios(item):
|
||||
info()
|
||||
|
||||
patronBlock = r'<h1>.*?[ ]?(?:\[(?P<lang>.+?\]))?</h1>.+?<div class="se-a" style="display:block">\s*<ul class="episodios">(?P<block>.*?)</ul>\s*</div>\s*</div>\s*</div>\s*</div>\s*</div>'
|
||||
patron = r'<a href="(?P<url>[^"]+)"><img src="(?P<thumb>[^"]+)">.*?'\
|
||||
'<div class="numerando">(?P<episode>[^<]+).*?<div class="episodiotitle">'\
|
||||
'[^>]+>(?P<title>[^<]+)<\/a>'
|
||||
# debugBlock = True
|
||||
return locals()
|
||||
|
||||
|
||||
@support.scrape
|
||||
def genres(item):
|
||||
info(item)
|
||||
|
||||
action='peliculas'
|
||||
if item.args == 'genres':
|
||||
patronBlock = r'<div class="sidemenu"><h2>Genere</h2>(?P<block>.*?)/li></ul></div>'
|
||||
elif item.args == 'year':
|
||||
item.args = 'genres'
|
||||
patronBlock = r'<div class="sidemenu"><h2>Anno di uscita</h2>(?P<block>.*?)/li></ul></div>'
|
||||
elif item.args == 'letter':
|
||||
patronBlock = r'<div class="movies-letter">(?P<block>.*?)<div class="clearfix">'
|
||||
|
||||
patronMenu = r'<a(?:.+?)?href="(?P<url>.*?)"[ ]?>(?P<title>.*?)<\/a>'
|
||||
# debugBlock = True
|
||||
|
||||
return locals()
|
||||
|
||||
|
||||
def search(item, text):
|
||||
info(text)
|
||||
import uuid
|
||||
text = text.replace(' ', '+')
|
||||
item.url = host + '/?' + uuid.uuid4().hex + '=' + uuid.uuid4().hex + '&s=' + text
|
||||
try:
|
||||
item.args = 'search'
|
||||
return peliculas(item)
|
||||
except:
|
||||
import sys
|
||||
for line in sys.exc_info():
|
||||
info("%s" % line)
|
||||
|
||||
return []
|
||||
|
||||
def newest(categoria):
|
||||
info(categoria)
|
||||
itemlist = []
|
||||
item = Item()
|
||||
|
||||
if categoria == 'peliculas':
|
||||
item.contentType = 'movie'
|
||||
item.url = host + '/film/'
|
||||
elif categoria == 'series':
|
||||
item.args = 'update'
|
||||
item.contentType = 'tvshow'
|
||||
item.url = host + '/aggiornamenti-serie/'
|
||||
## elif categoria == 'anime':
|
||||
## item.contentType = 'tvshow'
|
||||
## item.url = host + '/anime/'
|
||||
try:
|
||||
item.action = 'peliculas'
|
||||
itemlist = peliculas(item)
|
||||
|
||||
except:
|
||||
import sys
|
||||
for line in sys.exc_info():
|
||||
info("{0}".format(line))
|
||||
return []
|
||||
|
||||
return itemlist
|
||||
|
||||
|
||||
def findvideos(item):
|
||||
info()
|
||||
matches = support.match(item, patron=[r'var ilinks\s?=\s?([^;]+)',r' href="#option-\d">([^\s]+)\s*([^\s]+)']).matches
|
||||
itemlist = []
|
||||
list_url = []
|
||||
list_quality = []
|
||||
list_servers = []
|
||||
for match in matches:
|
||||
if type(match) == tuple:
|
||||
list_servers.append(match[0])
|
||||
list_quality.append(match[1])
|
||||
else:
|
||||
import ast, base64
|
||||
encLinks = ast.literal_eval(match)
|
||||
|
||||
for link in encLinks:
|
||||
linkDec = base64.b64decode(link.encode()).decode()
|
||||
if 'player.php' in linkDec:
|
||||
linkDec = support.httptools.downloadpage(linkDec, only_headers=True, follow_redirects=False).headers.get('Location')
|
||||
if linkDec:
|
||||
list_url.append(linkDec)
|
||||
if list_servers:
|
||||
for i, url in enumerate(list_url):
|
||||
itemlist.append(support.Item(
|
||||
channel=item.channel,
|
||||
title=list_servers[i],
|
||||
url=url,
|
||||
action='play',
|
||||
quality=list_quality[i],
|
||||
infoLabels=item.infoLabels))
|
||||
|
||||
return support.server(item, itemlist=itemlist)
|
||||
10
channels/ilgeniodellostreaming_cam.json
Executable file
10
channels/ilgeniodellostreaming_cam.json
Executable file
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"id": "ilgeniodellostreaming_cam",
|
||||
"name": "IlGenioDelloStreaming CAM",
|
||||
"active": true,
|
||||
"language": ["ita"],
|
||||
"thumbnail": "ilgeniodellostreaming.png",
|
||||
"banner": "ilgeniodellostreaming.png",
|
||||
"categories": ["movie"],
|
||||
"settings": []
|
||||
}
|
||||
102
channels/ilgeniodellostreaming_cam.py
Executable file
102
channels/ilgeniodellostreaming_cam.py
Executable file
@@ -0,0 +1,102 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# ------------------------------------------------------------
|
||||
# Canale per ilgeniodellostreaming_cam
|
||||
# ------------------------------------------------------------
|
||||
|
||||
|
||||
from core import support
|
||||
from core.support import info
|
||||
from core.item import Item
|
||||
from platformcode import config
|
||||
|
||||
host = config.get_channel_url()
|
||||
headers = [['Referer', host]]
|
||||
|
||||
@support.menu
|
||||
def mainlist(item):
|
||||
film = ['/film/',
|
||||
('In Sala', ['', 'peliculas', 'sala']),
|
||||
('Generi',['', 'genres', 'genres']),
|
||||
('Per Lettera',['/catalog/all', 'genres', 'az']),
|
||||
('Anni',['', 'genres', 'year'])]
|
||||
|
||||
return locals()
|
||||
|
||||
|
||||
@support.scrape
|
||||
def peliculas(item):
|
||||
if item.text:
|
||||
data = support.httptools.downloadpage(host + '/?s=' + item.text, post={'story': item.text, 'do': 'search', 'subaction': 'search'}).data
|
||||
patron = '<img src="(?P<thumb>[^"]+)(?:[^>]+>){8}\s*<a href="(?P<url>[^"]+)[^>]+>(?P<title>[^<]+)(?:[^>]+>){4}IMDb\s(?P<rating>[^<]+)(?:[^>]+>){2}(?P<year>\d+)'
|
||||
else:
|
||||
if item.args == 'sala':
|
||||
patronBlock = r'insala(?P<block>.*?)<header>'
|
||||
patron = r'<img src="(?P<thumb>[^"]+)[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>\s*(?P<rating>[^<]+)[^>]+>[^>]+>(?P<quality>[^<]+)[^>]+>[^>]+>[^>]+>[^>]+><a href="(?P<url>[^"]+)">(?P<title>[^<]+)[^>]+>[^>]+>[^>]+>(?P<year>\d{4})'
|
||||
elif item.args == 'az':
|
||||
patron = r'<img src="(?P<thumb>[^"]+)[^>]+>[^>]+>[^>]+>[^>]+><a href="(?P<url>[^"]+)[^>]+>(?P<title>[^<]+)<[^>]+>[^>]+>[^>]+>.*?<span class="labelimdb">(?P<rating>[^>]+)<'
|
||||
else:
|
||||
patron = r'<img src="(?P<thumb>[^"]+)[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>\s*(?P<rating>[^<]+)[^>]+>[^>]+>(?P<quality>[^<]+)[^>]+>[^>]+>[^>]+>[^>]+><a href="(?P<url>[^"]+)">(?P<title>[^<]+)[^>]+>[^>]+>[^>]+>(?P<year>\d{4})[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>\s*(?P<plot>[^<]+)<[^>]+>'
|
||||
|
||||
patronNext = 'href="([^>]+)">»'
|
||||
|
||||
return locals()
|
||||
|
||||
|
||||
@support.scrape
|
||||
def genres(item):
|
||||
action='peliculas'
|
||||
if item.args == 'genres':
|
||||
patronBlock = r'<div class="sidemenu">\s*<h2>Genere</h2>(?P<block>.*?)</ul'
|
||||
elif item.args == 'year':
|
||||
item.args = 'genres'
|
||||
patronBlock = r'<div class="sidemenu">\s*<h2>Anno di uscita</h2>(?P<block>.*?)</ul'
|
||||
elif item.args == 'az':
|
||||
patronBlock = r'<div class="movies-letter">(?P<block>.*?)<div class="clearfix">'
|
||||
|
||||
patronMenu = r'<a(?:.+?)?href="(?P<url>.*?)"[ ]?>(?P<title>.*?)<\/a>'
|
||||
|
||||
return locals()
|
||||
|
||||
def search(item, text):
|
||||
info(text)
|
||||
item.text = text
|
||||
try:
|
||||
return peliculas(item)
|
||||
except:
|
||||
import sys
|
||||
for line in sys.exc_info():
|
||||
info("%s" % line)
|
||||
|
||||
return []
|
||||
|
||||
def newest(categoria):
|
||||
info(categoria)
|
||||
itemlist = []
|
||||
item = Item()
|
||||
|
||||
if categoria == 'peliculas':
|
||||
item.contentType = 'movie'
|
||||
item.url = host + '/film/'
|
||||
try:
|
||||
item.action = 'peliculas'
|
||||
itemlist = peliculas(item)
|
||||
|
||||
except:
|
||||
import sys
|
||||
for line in sys.exc_info():
|
||||
info("{0}".format(line))
|
||||
return []
|
||||
|
||||
return itemlist
|
||||
|
||||
|
||||
def findvideos(item):
|
||||
info()
|
||||
urls = []
|
||||
data = support.match(item).data
|
||||
urls += support.match(data, patron=r'id="urlEmbed" value="([^"]+)').matches
|
||||
matches = support.match(data, patron=r'<iframe.*?src="([^"]+)').matches
|
||||
for m in matches:
|
||||
if 'youtube' not in m and not m.endswith('.js'):
|
||||
urls += support.match(m, patron=r'data-link="([^"]+)').matches
|
||||
return support.server(item, urls)
|
||||
11
channels/italiafilm.json
Executable file
11
channels/italiafilm.json
Executable file
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"id": "italiafilm",
|
||||
"name": "ItaliaFilm",
|
||||
"language": ["ita", "sub-ita"],
|
||||
"active": true,
|
||||
"thumbnail": "italiafilm.png",
|
||||
"banner": "",
|
||||
"categories": ["movie"],
|
||||
"not_active": ["include_in_newest"],
|
||||
"settings": []
|
||||
}
|
||||
90
channels/italiafilm.py
Executable file
90
channels/italiafilm.py
Executable file
@@ -0,0 +1,90 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# ------------------------------------------------------------
|
||||
# Canale per 'italifilm'
|
||||
# ------------------------------------------------------------
|
||||
|
||||
from core import support, httptools, scrapertools, tmdb
|
||||
from platformcode import config, logger
|
||||
|
||||
host = config.get_channel_url()
|
||||
headers = [['Referer', host]]
|
||||
|
||||
|
||||
@support.menu
|
||||
def mainlist(item):
|
||||
menu = [
|
||||
('Film', ['/film/', 'list', 'film']),
|
||||
('Per Genere', ['', 'list', 'genere']),
|
||||
('Al Cinema', ['/cinema/', 'list', 'film']),
|
||||
('Sub-ITA', ['/sub-ita/', 'list', 'film']),
|
||||
('Top del Mese', ['/top-del-mese.html', 'list', 'film'])
|
||||
]
|
||||
search = ''
|
||||
|
||||
return locals()
|
||||
|
||||
|
||||
@support.scrape
|
||||
def list(item):
|
||||
actLike = 'peliculas'
|
||||
if item.args == 'genere':
|
||||
patronBlock = r'<ul class="sub-menu">(?P<block>.*?)</ul>'
|
||||
patronMenu = r'<li><a href="(?P<url>[^"]+)">(?P<title>[^<]+)'
|
||||
action = 'peliculas'
|
||||
elif item.args == 'film':
|
||||
patron = r'<div class="entry-summary.*?<a href="(?P<url>[^"]+)" title="(?P<title>[^\("]+)(?:\((?P<year>\d+)\))" class="[^"]+"><img class="lazyload" data-src="(?P<thumb>[^"]+)" alt="[^"]+".*?></a>'
|
||||
patronNext = r'<a href="([^"]+)">(?:&rarr|→)'
|
||||
|
||||
return locals()
|
||||
|
||||
def peliculas(item):
|
||||
data = httptools.downloadpage(item.url).data
|
||||
itemlist = []
|
||||
for it in support.match(data, patron=[r'<div class="entry-summary.*?<a href="(?P<url>[^"]+)" title="(?P<title>[^"]+)(?:\((?P<year>\d+)\))" class="[^"]+"><img class="lazyload" data-src="(?P<thumb>[^"]+)" alt="[^"]+".*?></a>']).matches:
|
||||
infoLabels = dict()
|
||||
infoLabels['title'] = it[1]
|
||||
infoLabels['mediatype'] = 'movie'
|
||||
infoLabels['year'] = it[2]
|
||||
itemlist.append(item.clone(action='findvideos', thumbnail = host + it[3].replace(' ','%20'), title = support.cleantitle(it[1]), url= it[0], infoLabels=infoLabels))
|
||||
|
||||
tmdb.set_infoLabels_itemlist(itemlist, seekTmdb=True)
|
||||
if item.args == 'search':
|
||||
next = support.match(data, patron=['<a name="nextlink".*list_submit\((\d+)\);.*(?:&rarr|→)']).matches
|
||||
else:
|
||||
next = support.match(data, patron=['<a href="([^"]+)">(?:&rarr|→)']).matches
|
||||
|
||||
if next:
|
||||
if item.args == 'search':
|
||||
item.url = "{}/?{}".format(host, support.urlencode({"story": item.search_text,"do": "search","subaction": "search", "search_start": next[0]}))
|
||||
else:
|
||||
item.url = next[0]
|
||||
support.nextPage(itemlist = itemlist, item = item, next_page=item.url)
|
||||
|
||||
return itemlist
|
||||
|
||||
|
||||
def search(item, text):
|
||||
item.args = 'search'
|
||||
item.url = "{}/?{}".format(host, support.urlencode({"story": text,"do": "search","subaction": "search", "search_start": item.page}))
|
||||
item.search_text = text
|
||||
try:
|
||||
return peliculas(item)
|
||||
|
||||
except:
|
||||
import sys
|
||||
for line in sys.exc_info():
|
||||
logger.error("search except: %s" % line)
|
||||
return []
|
||||
|
||||
#action di default
|
||||
def findvideos(item):
|
||||
|
||||
support.info('findvideos')
|
||||
urls = []
|
||||
data = support.match(item).data
|
||||
matches = support.match(data, patron=r'<iframe.*?src="([^"]+)').matches
|
||||
|
||||
for m in matches:
|
||||
if 'youtube' not in m and not m.endswith('.js'):
|
||||
urls += support.match(m, patron=r'data-link="([^"]+)').matches
|
||||
return support.server(item, urls)
|
||||
11
channels/italiaserie.json
Executable file
11
channels/italiaserie.json
Executable file
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"id": "italiaserie",
|
||||
"name": "Italia Serie",
|
||||
"active": false,
|
||||
"language": ["ita","sub-ita"],
|
||||
"thumbnail": "italiaserie.png",
|
||||
"bannermenu": "italiaserie.png",
|
||||
"categories": ["tvshow", "vos"],
|
||||
"not_active": ["include_in_newest_peliculas", "include_in_newest_anime"],
|
||||
"settings": []
|
||||
}
|
||||
116
channels/italiaserie.py
Executable file
116
channels/italiaserie.py
Executable file
@@ -0,0 +1,116 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# ------------------------------------------------------------
|
||||
# Canale per italiaserie
|
||||
# ------------------------------------------------------------
|
||||
|
||||
|
||||
from core import support, httptools, scrapertools
|
||||
from core.item import Item
|
||||
from platformcode import config, logger
|
||||
|
||||
host = config.get_channel_url()
|
||||
headers = [['Referer', host]]
|
||||
|
||||
|
||||
@support.menu
|
||||
def mainlist(item):
|
||||
tvshow = ['',
|
||||
('Aggiornamenti', ['/aggiornamento-episodi/', 'peliculas', 'update']),
|
||||
('Top 10', ['/top-10', 'peliculas', 'top']),
|
||||
('Netflix {tv submenu}', ['/genere/netflix', 'peliculas'])
|
||||
]
|
||||
|
||||
return locals()
|
||||
|
||||
|
||||
@support.scrape
|
||||
def peliculas(item):
|
||||
# debug=True
|
||||
blacklist = ['Aggiornamento Episodi']
|
||||
action = 'episodios'
|
||||
patron = r'<div class="post-thumb">\s*<a href="(?P<url>[^"]+)" title="(?P<title>[^"\[]+)[^>]+>\s*<img src="(?P<thumb>[^"]+)"[^>]+>'
|
||||
|
||||
if item.args == 'update':
|
||||
pagination = ''
|
||||
#patron = r'br />(?:[^>]+>)?(?P<title>[^–]+)[^<]+<a href="(?P<url>[^"]+)">(?P<episode>[^ ]+)\s*(?P<title2>[^\(<]+)(?:\((?P<lang>[^\)]+))?'
|
||||
patron = r'br[\s/]*>(?:\s*<[^>]+>)*(?P<title>[^–<]+)[^<]+<a href="(?P<url>[^"]+)"[^>]*>(?:[^,]{0,80}[, ]{2})*(?P<episode>[\S]+)\s*(?P<title2>[^\(<]+)(?:\((?P<lang>[^\)]+))?'
|
||||
action = 'episodios'
|
||||
if item.args == 'top':
|
||||
patron = r'<a href="(?P<url>[^"]+)">(?P<title>[^<]+)</a>(?:[^>]+>){3}<img.*?src="(?P<thumb>[^"]+)"[^>]+>(?:[^>]+>){5}:\s*(?P<rating>[^/]+)'
|
||||
if item.args =='a-z':
|
||||
pagination = ''
|
||||
patron = r'<li ><a href="(?P<url>[^"]+)" title="(?P<title>[^"]+)"'
|
||||
patronNext = r'<a class="next page-numbers" href="(.*?)">'
|
||||
|
||||
def itemHook(item):
|
||||
item.title = support.re.sub(r'<[^>]+>','', item.title)
|
||||
return item
|
||||
|
||||
return locals()
|
||||
|
||||
|
||||
@support.scrape
|
||||
def episodios(item):
|
||||
res = support.match(item, patron=r'<a href="([^"]+)">>')
|
||||
if res.match: data = support.match(res.match).data
|
||||
else: data = res.data
|
||||
|
||||
patronBlock = r'(?:Stagione|STAGIONE)\s*(?P<lang>[^<]+)?(?:</p>)?(?P<block>.*?)</p>'
|
||||
patron = r'(?:p>|/>)(?P<title>[^–]+)–(?P<data>.*?)(?:<br|$)'
|
||||
|
||||
def itemHook(item):
|
||||
item.title = support.re.sub('<[^>]+>','', item.title)
|
||||
return item
|
||||
return locals()
|
||||
|
||||
|
||||
@support.scrape
|
||||
def category(item):
|
||||
action = 'peliculas'
|
||||
patron = r'<li class="cat-item.*?href="(?P<url>[^"]+)".*?>(?P<title>.*?)</a>'
|
||||
return locals()
|
||||
|
||||
|
||||
def search(item, texto):
|
||||
support.info("s=", texto)
|
||||
item.url = host + "/?s=" + texto
|
||||
item.contentType = 'tvshow'
|
||||
try:
|
||||
return peliculas(item)
|
||||
# Continua la ricerca in caso di errore
|
||||
except:
|
||||
import sys
|
||||
for line in sys.exc_info():
|
||||
support.info("%s" % line)
|
||||
return []
|
||||
|
||||
|
||||
def newest(categoria):
|
||||
support.info("newest", categoria)
|
||||
itemlist = []
|
||||
item = Item()
|
||||
try:
|
||||
if categoria == "series":
|
||||
item.url = host + "/aggiornamento-episodi/"
|
||||
item.action = "peliculas"
|
||||
item.args = "update"
|
||||
item.contentType = "episode"
|
||||
itemlist = peliculas(item)
|
||||
|
||||
if itemlist[-1].action == "peliculas":
|
||||
itemlist.pop()
|
||||
|
||||
# Continua la ricerca in caso di errore
|
||||
except:
|
||||
import sys
|
||||
for line in sys.exc_info():
|
||||
logger.error("{0}".format(line))
|
||||
return []
|
||||
|
||||
return itemlist
|
||||
|
||||
|
||||
def findvideos(item):
|
||||
logger.debug()
|
||||
data = support.match(item.data, patron=r'href="([^"]+)').matches
|
||||
return support.server(item, data=data)
|
||||
13
channels/la7.json
Executable file
13
channels/la7.json
Executable file
@@ -0,0 +1,13 @@
|
||||
{
|
||||
"id": "la7",
|
||||
"name": "La7",
|
||||
"active": true,
|
||||
"language": ["ita"],
|
||||
"thumbnail": "la7.png",
|
||||
"banner": "la7.png",
|
||||
"categories": ["movie", "tvshow", "documentary", "live"],
|
||||
"not_active": ["include_in_newest"],
|
||||
"default_off": ["include_in_global_search"],
|
||||
"settings": [],
|
||||
"cloudflare": true
|
||||
}
|
||||
165
channels/la7.py
Executable file
165
channels/la7.py
Executable file
@@ -0,0 +1,165 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# ------------------------------------------------------------
|
||||
# Canale per La7
|
||||
# ------------------------------------------------------------
|
||||
|
||||
import requests
|
||||
from core import support, httptools
|
||||
from platformcode import logger
|
||||
|
||||
DRM = 'com.widevine.alpha'
|
||||
key_widevine = "https://la7.prod.conax.cloud/widevine/license"
|
||||
host = 'https://www.la7.it'
|
||||
headers = {
|
||||
'host_token': 'pat.la7.it',
|
||||
'host_license': 'la7.prod.conax.cloud',
|
||||
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36',
|
||||
'accept': '*/*',
|
||||
'accept-language': 'en,en-US;q=0.9,it;q=0.8',
|
||||
'dnt': '1',
|
||||
'te': 'trailers',
|
||||
'origin': 'https://www.la7.it',
|
||||
'referer': 'https://www.la7.it/',
|
||||
}
|
||||
|
||||
@support.menu
|
||||
def mainlist(item):
|
||||
top = [('Dirette {bold}', ['', 'live']),
|
||||
('Replay {bold}', ['', 'replay_channels'])]
|
||||
|
||||
menu = [('Programmi TV {bullet bold}', ['/tutti-i-programmi', 'peliculas', '', 'tvshow']),
|
||||
('Teche La7 {bullet bold}', ['/la7teche', 'peliculas', '', 'tvshow'])]
|
||||
|
||||
search = ''
|
||||
return locals()
|
||||
|
||||
|
||||
def live(item):
|
||||
itemlist = [item.clone(title=support.typo('La7', 'bold'), fulltitle='La7', url= host + '/dirette-tv', action='findvideos', forcethumb = True, no_return=True),
|
||||
item.clone(title=support.typo('La7d', 'bold'), fulltitle='La7d', url= host + '/live-la7d', action='findvideos', forcethumb = True, no_return=True)]
|
||||
return support.thumb(itemlist, live=True)
|
||||
|
||||
|
||||
def replay_channels(item):
|
||||
itemlist = [item.clone(title=support.typo('La7', 'bold'), fulltitle='La7', url= host + '/rivedila7/0/la7', action='replay_menu', forcethumb = True),
|
||||
item.clone(title=support.typo('La7d', 'bold'), fulltitle='La7d', url= host + '/rivedila7/0/la7d', action='replay_menu', forcethumb = True)]
|
||||
return support.thumb(itemlist, live=True)
|
||||
|
||||
|
||||
@support.scrape
|
||||
def replay_menu(item):
|
||||
action = 'replay'
|
||||
patron = r'href="(?P<url>[^"]+)"><div class="giorno-text">\s*(?P<day>[^>]+)</div><[^>]+>\s*(?P<num>[^<]+)</div><[^>]+>\s*(?P<month>[^<]+)<'
|
||||
def itemHook(item):
|
||||
item.title = support.typo(item.day + ' ' + item.num + ' ' + item.month,'bold')
|
||||
return item
|
||||
return locals()
|
||||
|
||||
|
||||
@support.scrape
|
||||
def replay(item):
|
||||
action = 'findvideos'
|
||||
patron = r'guida-tv"><[^>]+><[^>]+>(?P<hour>[^<]+)<[^>]+><[^>]+><[^>]+>\s*<a href="(?P<url>[^"]+)"><[^>]+><div class="[^"]+" data-background-image="(?P<t>[^"]+)"><[^>]+><[^>]+><[^>]+><[^>]+>\s*(?P<name>[^<]+)<[^>]+><[^>]+><[^>]+>(?P<plot>[^<]+)<'
|
||||
def itemHook(item):
|
||||
item.title = support.typo(item.hour + ' - ' + item.name,'bold')
|
||||
item.contentTitle = item.fulltitle = item.show = item.name
|
||||
item.thumbnail = 'http:' + item.t
|
||||
item.fanart = item.thumbnail
|
||||
item.forcethumb = True
|
||||
return item
|
||||
return locals()
|
||||
|
||||
def search(item, text):
|
||||
item.url = host + '/tutti-i-programmi'
|
||||
item.search = text
|
||||
try:
|
||||
return peliculas(item)
|
||||
except:
|
||||
import sys
|
||||
for line in sys.exc_info():
|
||||
support.info('search log:', line)
|
||||
return []
|
||||
|
||||
|
||||
@support.scrape
|
||||
def peliculas(item):
|
||||
search = item.search
|
||||
action = 'episodios'
|
||||
pagination = 20
|
||||
disabletmdb = True
|
||||
addVideolibrary = False
|
||||
downloadEnabled = False
|
||||
|
||||
patron = r'<a href="(?P<url>[^"]+)"[^>]+><div class="[^"]+" data-background-image="(?P<t>[^"]+)"></div><div class="titolo">\s*(?P<title>[^<]+)<'
|
||||
|
||||
if 'la7teche' in item.url:
|
||||
patron = r'<a href="(?P<url>[^"]+)" title="(?P<title>[^"]+)" class="teche-i-img".*?url\(\'(?P<thumb>[^\']+)'
|
||||
|
||||
def itemHook(item):
|
||||
item.fanart = item.thumb
|
||||
return item
|
||||
return locals()
|
||||
|
||||
|
||||
@support.scrape
|
||||
def episodios(item):
|
||||
action = 'findvideos'
|
||||
addVideolibrary = False
|
||||
downloadEnabled = False
|
||||
|
||||
if 'la7teche' in item.url:
|
||||
patron = r'<a href="(?P<url>[^"]+)">\s*<div class="holder-bg">.*?data-background-image="(?P<thumb>[^"]+)(?:[^>]+>){4}\s*(?P<title>[^<]+)(?:(?:[^>]+>){2}\s*(?P<plot>[^<]+))?'
|
||||
else:
|
||||
data = str(support.match(item.url, patron=r'"home-block home-block--oggi(.*?)</section>').matches)
|
||||
data += httptools.downloadpage(item.url + '/video').data
|
||||
|
||||
patron = r'item[^>]+>\s*<a href="(?P<url>[^"]+)">.*?image="(?P<thumb>[^"]+)(?:[^>]+>){4,5}\s*(?P<title>[\d\w][^<]+)(?:(?:[^>]+>){7}\s*(?P<title2>[\d\w][^<]+))?'
|
||||
patronNext = r'<a href="([^"]+)">›'
|
||||
return locals()
|
||||
|
||||
|
||||
def findvideos(item):
|
||||
support.info()
|
||||
if item.livefilter:
|
||||
for it in live(item):
|
||||
if it.fulltitle == item.livefilter:
|
||||
item = it
|
||||
break
|
||||
data = support.match(item).data
|
||||
|
||||
url = support.match(data, patron=r'''["]?dash["]?\s*:\s*["']([^"']+)["']''').match
|
||||
if url:
|
||||
preurl = support.match(data, patron=r'preTokenUrl = "(.+?)"').match
|
||||
tokenHeader = {
|
||||
'host': headers['host_token'],
|
||||
'user-agent': headers['user-agent'],
|
||||
'accept': headers['accept'],
|
||||
'accept-language': headers['accept-language'],
|
||||
'dnt': headers['dnt'],
|
||||
'te': headers['te'],
|
||||
'origin': headers['origin'],
|
||||
'referer': headers['referer'],
|
||||
}
|
||||
preAuthToken = requests.get(preurl, headers=tokenHeader,verify=False).json()['preAuthToken']
|
||||
licenseHeader = {
|
||||
'host': headers['host_license'],
|
||||
'user-agent': headers['user-agent'],
|
||||
'accept': headers['accept'],
|
||||
'accept-language': headers['accept-language'],
|
||||
'preAuthorization': preAuthToken,
|
||||
'origin': headers['origin'],
|
||||
'referer': headers['referer'],
|
||||
}
|
||||
preLic= '&'.join(['%s=%s' % (name, value) for (name, value) in licenseHeader.items()])
|
||||
tsatmp=str(int(support.time()))
|
||||
license_url= key_widevine + '?d=%s'%tsatmp
|
||||
lic_url='%s|%s|R{SSM}|'%(license_url, preLic)
|
||||
item.drm = DRM
|
||||
item.license = lic_url
|
||||
else:
|
||||
match = support.match(data, patron='/content/entry/data/(.*?).mp4').match
|
||||
if match:
|
||||
url = 'https://awsvodpkg.iltrovatore.it/local/hls/,/content/entry/data/' + support.match(item, patron='/content/entry/data/(.*?).mp4').match + '.mp4.urlset/master.m3u8'
|
||||
|
||||
item = item.clone(title='Direct', server='directo', url=url, action='play')
|
||||
return support.server(item, itemlist=[item], Download=False, Videolibrary=False)
|
||||
30
channels/mediasetplay.json
Executable file
30
channels/mediasetplay.json
Executable file
@@ -0,0 +1,30 @@
|
||||
{
|
||||
"id": "mediasetplay",
|
||||
"name": "Mediaset play infinity [free]",
|
||||
"active": true,
|
||||
"language": ["ita"],
|
||||
"thumbnail": "mediasetplayinfinity.png",
|
||||
"banner": "mediasetplayinfinity.png",
|
||||
"categories": ["movie", "tvshow", "documentary", "live"],
|
||||
"not_active": ["include_in_newest"],
|
||||
"default_off": ["include_in_global_search"],
|
||||
"settings": [
|
||||
{
|
||||
"id": "mpd",
|
||||
"type": "bool",
|
||||
"label": "Preferisci mpd",
|
||||
"default": true,
|
||||
"enabled": true,
|
||||
"visible": true
|
||||
},
|
||||
{
|
||||
"id": "pagination",
|
||||
"type": "list",
|
||||
"label": "Pagination",
|
||||
"default": 1,
|
||||
"enabled": true,
|
||||
"visible": true,
|
||||
"lvalues": ["10", "20", "30", "40", "50", "60", "70", "80", "90", "100"]
|
||||
}
|
||||
]
|
||||
}
|
||||
357
channels/mediasetplay.py
Executable file
357
channels/mediasetplay.py
Executable file
@@ -0,0 +1,357 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# ------------------------------------------------------------
|
||||
# Canale per Mediaset Play
|
||||
# ------------------------------------------------------------
|
||||
import functools
|
||||
|
||||
from platformcode import logger, config
|
||||
import uuid, datetime, xbmc
|
||||
|
||||
import requests, sys
|
||||
from core import jsontools, support, httptools
|
||||
|
||||
if sys.version_info[0] >= 3:
|
||||
from urllib.parse import urlencode, quote
|
||||
else:
|
||||
from urllib import urlencode, quote
|
||||
|
||||
host = 'https://www.mediasetplay.mediaset.it'
|
||||
loginUrl = 'https://api-ott-prod-fe.mediaset.net/PROD/play/idm/anonymous/login/v2.0'
|
||||
|
||||
clientid = 'f66e2a01-c619-4e53-8e7c-4761449dd8ee'
|
||||
|
||||
|
||||
loginData = {"client_id": clientid, "platform": "pc", "appName": "web//mediasetplay-web/5.1.493-plus-da8885b"}
|
||||
sessionUrl = "https://api.one.accedo.tv/session?appKey=59ad346f1de1c4000dfd09c5&uuid={uuid}&gid=default"
|
||||
|
||||
session = requests.Session()
|
||||
session.request = functools.partial(session.request, timeout=httptools.HTTPTOOLS_DEFAULT_DOWNLOAD_TIMEOUT)
|
||||
session.headers.update({'Content-Type': 'application/json', 'User-Agent': support.httptools.get_user_agent(), 'Referer': host})
|
||||
|
||||
entry = 'https://api.one.accedo.tv/content/entry/{id}?locale=it'
|
||||
entries = 'https://api.one.accedo.tv/content/entries?id={id}&locale=it'
|
||||
|
||||
# login anonimo
|
||||
res = session.post(loginUrl, json=loginData, verify=False)
|
||||
Token = res.json()['response']['beToken']
|
||||
sid = res.json()['response']['sid']
|
||||
session.headers.update({'authorization': 'Bearer ' + Token})
|
||||
|
||||
# sessione
|
||||
#sessionKey = session.get(sessionUrl.format(uuid=str(uuid.uuid4())), verify=False).json()['sessionKey']
|
||||
#session.headers.update({'x-session': sessionKey})
|
||||
|
||||
pagination = [10, 20, 30, 40, 50, 60, 70, 80, 90, 100][config.get_setting('pagination', 'mediasetplay')]
|
||||
|
||||
|
||||
@support.menu
|
||||
def mainlist(item):
|
||||
top = [('Dirette {bold}', ['', 'live'])]
|
||||
|
||||
menu = [('Film Più Visti {submenu}', ['/cinema', 'peliculas', {'uxReference':'filmPiuVisti24H'}, 'movie']),
|
||||
('Film ultimi arrivi {submenu}', ['/cinema', 'peliculas', {'uxReference':'filmUltimiArrivi'}, 'movie']),
|
||||
('Film Da Non Perdere {submenu}', ['/cinema', 'peliculas', {'uxReference':'filmClustering'}, 'movie']),
|
||||
('Fiction e Serie Tv del momento {submenu}', ['/fiction', 'peliculas', {'uxReference':'fictionSerieTvDelMomento'}, 'tvshow']),
|
||||
('Serie TV Piu Viste {submenu}', ['/fiction', 'peliculas', {'uxReference':'serieTvPiuViste24H'}, 'tvshow']),
|
||||
('Soap del momento {submenu}', ['/cinema', 'peliculas', {'uxReference':'fictionSerieTvParamsGenre', 'params': 'genre≈Soap opera'}, 'tvshow']),
|
||||
('Programmi TV Prima serata{ submenu}', ['/programmitv', 'peliculas', {'uxReference':'stagioniPrimaSerata'}, 'tvshow']),
|
||||
('Programmi TV Daytime{ submenu}', ['/programmitv', 'peliculas', {'uxReference':'stagioniDaytime'}, 'tvshow']),
|
||||
('Talent e reality {submenu}', ['/talent', 'peliculas', {'uxReference':'multipleBlockProgrammiTv', 'userContext' :'iwiAeyJwbGF0Zm9ybSI6IndlYiJ9Aw'}, 'tvshow']),
|
||||
('Kids Evergreen {submenu}', ['/kids', 'peliculas', {'uxReference':'kidsMediaset' }, 'undefined']),
|
||||
('Kids Boing {submenu}', ['/kids', 'peliculas', {'uxReference':'kidsBoing' }, 'undefined']),
|
||||
('Kids Cartoonito {submenu}', ['/kids', 'peliculas', {'uxReference':'kidsCartoonito' }, 'undefined']),
|
||||
('Documentari più visti {submenu}', ['/documentari', 'peliculas', {'uxReference': 'documentariPiuVisti24H'}, 'undefined']),
|
||||
]
|
||||
|
||||
search = ''
|
||||
return locals()
|
||||
|
||||
def menu(item):
|
||||
logger.debug()
|
||||
itemlist = []
|
||||
res = get_from_id(item)
|
||||
for it in res:
|
||||
if 'uxReference' in it:
|
||||
itemlist.append(item.clone(title=support.typo(it['title'], 'bullet bold'),
|
||||
url= it['landingUrl'],
|
||||
args={'uxReference':it.get('uxReferenceV2', ''), 'params':it.get('uxReferenceV2Params', ''), 'feed':it.get('feedurlV2','')},
|
||||
action='peliculas'))
|
||||
return itemlist
|
||||
|
||||
|
||||
def live(item):
|
||||
itemlist = []
|
||||
|
||||
res = session.get('https://static3.mediasetplay.mediaset.it/apigw/nownext/nownext.json').json()['response']
|
||||
allguide = res['listings']
|
||||
stations = res['stations']
|
||||
|
||||
for it in stations.values():
|
||||
logger.debug(jsontools.dump(it))
|
||||
plot = ''
|
||||
title = it['title']
|
||||
url = 'https:' + it['mediasetstation$pageUrl']
|
||||
if 'SVOD' in it['mediasetstation$channelsRights']: continue
|
||||
thumb = it.get('thumbnails',{}).get('channel_logo-100x100',{}).get('url','')
|
||||
if it['callSign'] in allguide:
|
||||
|
||||
guide = allguide[it['callSign']]
|
||||
plot = '[B]{}[/B]\n{}'.format(guide.get('currentListing', {}).get('mediasetlisting$epgTitle', ''),guide.get('currentListing', {}).get('description', ''))
|
||||
if 'nextListing' in guide.keys():
|
||||
plot += '\n\nA Seguire:\n[B]{}[/B]\n{}'.format(guide.get('nextListing', {}).get('mediasetlisting$epgTitle', ''),guide.get('nextListing', {}).get('description', ''))
|
||||
itemlist.append(item.clone(title=support.typo(title, 'bold'),
|
||||
fulltitle=title, callSign=it['callSign'],
|
||||
# urls=[guide['publicUrl']],
|
||||
plot=plot,
|
||||
url=url,
|
||||
action='findvideos',
|
||||
thumbnail=thumb,
|
||||
forcethumb=True))
|
||||
|
||||
itemlist.sort(key=lambda it: support.channels_order.get(it.fulltitle, 999))
|
||||
support.thumb(itemlist, live=True)
|
||||
return itemlist
|
||||
|
||||
|
||||
def search(item, text):
|
||||
item.args = {'uxReference':'main', 'params':'channel≈', 'query':text}
|
||||
|
||||
try:
|
||||
return peliculas(item)
|
||||
# Continua la ricerca in caso di errore
|
||||
except:
|
||||
import sys
|
||||
for line in sys.exc_info():
|
||||
support.logger.error("%s" % line)
|
||||
return []
|
||||
|
||||
|
||||
def peliculas(item):
|
||||
itemlist = []
|
||||
res = get_programs(item)
|
||||
video_id= ''
|
||||
|
||||
for it in res['items']:
|
||||
if not 'MediasetPlay_ANY' in it.get('mediasetprogram$channelsRights',['MediasetPlay_ANY']): continue
|
||||
thumb = ''
|
||||
fanart = ''
|
||||
contentSerieName = ''
|
||||
url = 'https:'+ it.get('mediasettvseason$pageUrl', it.get('mediasetprogram$videoPageUrl', it.get('mediasetprogram$pageUrl')))
|
||||
title = it.get('mediasetprogram$brandTitle', it.get('title'))
|
||||
title2 = it['title']
|
||||
if title != title2:
|
||||
title = '{} - {}'.format(title, title2)
|
||||
plot = it.get('longDescription', it.get('description', it.get('mediasettvseason$brandDescription', '')))
|
||||
|
||||
if it.get('seriesTitle') or it.get('seriesTvSeasons'):
|
||||
contentSerieName = it.get('seriesTitle', it.get('title'))
|
||||
contentType = 'tvshow'
|
||||
action = 'epmenu'
|
||||
else:
|
||||
contentType = 'movie'
|
||||
video_id = it['guid']
|
||||
action = 'findvideos'
|
||||
for k, v in it['thumbnails'].items():
|
||||
if 'image_vertical' in k and not thumb:
|
||||
thumb = v['url'].replace('.jpg', '@3.jpg')
|
||||
if 'image_header_poster' in k and not fanart:
|
||||
fanart = v['url'].replace('.jpg', '@3.jpg')
|
||||
if thumb and fanart:
|
||||
break
|
||||
|
||||
itemlist.append(item.clone(title=support.typo(title, 'bold'),
|
||||
fulltitle=title,
|
||||
contentTitle=title,
|
||||
contentSerieName=contentSerieName,
|
||||
action=action,
|
||||
contentType=contentType,
|
||||
thumbnail=thumb,
|
||||
fanart=fanart,
|
||||
plot=plot,
|
||||
url=url,
|
||||
video_id=video_id,
|
||||
seriesid = it.get('seriesTvSeasons', it.get('id','')),
|
||||
disable_videolibrary = True,
|
||||
forcethumb=True))
|
||||
if res['next']:
|
||||
item.page = res['next']
|
||||
support.nextPage(itemlist, item)
|
||||
|
||||
return itemlist
|
||||
|
||||
def epmenu(item):
|
||||
logger.debug()
|
||||
itemlist = []
|
||||
|
||||
epUrl = 'https://feed.entertainment.tv.theplatform.eu/f/PR1GhC/mediaset-prod-all-subbrands-v2?byTvSeasonId={}&sort=mediasetprogram$order'
|
||||
|
||||
if item.seriesid:
|
||||
if type(item.seriesid) == list:
|
||||
res = []
|
||||
for s in item.seriesid:
|
||||
itemlist.append(
|
||||
item.clone(seriesid = s['id'],
|
||||
title=support.typo(s['title'], 'bold')))
|
||||
if len(itemlist) == 1: return epmenu(itemlist[0])
|
||||
else:
|
||||
res = requests.get(epUrl.format(item.seriesid)).json()['entries']
|
||||
for it in res:
|
||||
itemlist.append(
|
||||
item.clone(seriesid = '',
|
||||
title=support.typo(it['description'], 'bold'),
|
||||
subbrand=it['mediasetprogram$subBrandId'],
|
||||
action='episodios'))
|
||||
itemlist = sorted(itemlist, key=lambda it: it.title, reverse=True)
|
||||
if len(itemlist) == 1: return episodios(itemlist[0])
|
||||
|
||||
return itemlist
|
||||
|
||||
def episodios(item):
|
||||
# create month list
|
||||
months = []
|
||||
try:
|
||||
for month in range(21, 33): months.append(xbmc.getLocalizedString(month))
|
||||
except: # per i test, xbmc.getLocalizedString non è supportato
|
||||
for month in range(21, 33): months.append('dummy')
|
||||
|
||||
# i programmi tv vanno ordinati per data decrescente, gli episodi delle serie per data crescente
|
||||
order = 'desc' if '/programmi-tv/' in item.url else 'asc'
|
||||
|
||||
itemlist = []
|
||||
res = requests.get('https://feed.entertainment.tv.theplatform.eu/f/PR1GhC/mediaset-prod-all-programs-v2?byCustomValue={subBrandId}{' + item.subbrand +'}&range=0-10000&sort=:publishInfo_lastPublished|' + order + ',tvSeasonEpisodeNumber').json()['entries']
|
||||
|
||||
for it in res:
|
||||
thumb = ''
|
||||
titleDate = ''
|
||||
if 'mediasetprogram$publishInfo_lastPublished' in it:
|
||||
date = datetime.date.fromtimestamp(it['mediasetprogram$publishInfo_lastPublished'] / 1000)
|
||||
titleDate =' [{} {}]'.format(date.day, months[date.month-1])
|
||||
title = '[B]{}[/B]{}'.format(it['title'], titleDate)
|
||||
for k, v in it['thumbnails'].items():
|
||||
if 'image_keyframe' in k and not thumb:
|
||||
thumb = v['url'].replace('.jpg', '@3.jpg')
|
||||
break
|
||||
if not thumb: thumb = item.thumbnail
|
||||
|
||||
itemlist.append(item.clone(title=title,
|
||||
thumbnail=thumb,
|
||||
forcethumb=True,
|
||||
contentType='episode',
|
||||
action='findvideos',
|
||||
video_id=it['guid']))
|
||||
|
||||
return itemlist
|
||||
|
||||
|
||||
def findvideos(item):
|
||||
logger.debug()
|
||||
item.no_return=True
|
||||
# support.dbg()
|
||||
mpd = config.get_setting('mpd', item.channel)
|
||||
|
||||
|
||||
lic_url = 'https://widevine.entitlement.theplatform.eu/wv/web/ModularDrm/getRawWidevineLicense?releasePid={pid}&account=http://access.auth.theplatform.com/data/Account/2702976343&schema=1.0&token={token}|Accept=*/*&Content-Type=&User-Agent={ua}|R{{SSM}}|'
|
||||
url = ''
|
||||
# support.dbg()
|
||||
if item.urls:
|
||||
url = ''
|
||||
pid = ''
|
||||
# Format = 'dash+xml' if mpd else 'x-mpegURL'
|
||||
# for it in item.urls:
|
||||
# if Format in it['format']:
|
||||
item.url = requests.head(item.urls[0], headers={'User-Agent': support.httptools.get_user_agent()}).headers['Location']
|
||||
# pid = it['releasePids'][0]
|
||||
# if mpd and 'widevine' in it['assetTypes']:
|
||||
# break
|
||||
|
||||
if mpd:
|
||||
item.manifest = 'mpd'
|
||||
item.drm = 'com.widevine.alpha'
|
||||
item.license = lic_url.format(pid=pid, token=Token, ua=support.httptools.get_user_agent())
|
||||
|
||||
else:
|
||||
item.manifest = 'hls'
|
||||
return support.server(item, itemlist=[item], Download=False, Videolibrary=False)
|
||||
|
||||
elif item.video_id:
|
||||
payload = {"contentId":item.video_id, "streamType":"VOD", "delivery":"Streaming", "createDevice":"true", "overrideAppName":"web//mediasetplay-web/5.2.4-6ad16a4"}
|
||||
res = session.post('https://api-ott-prod-fe.mediaset.net/PROD/play/playback/check/v2.0?sid=' + sid, json=payload).json()['response']['mediaSelector']
|
||||
|
||||
else:
|
||||
payload = {"channelCode":item.callSign, "streamType":"LIVE", "delivery":"Streaming", "createDevice":"true", "overrideAppName":"web//mediasetplay-web/5.2.4-6ad16a4"}
|
||||
res = session.post('https://api-ott-prod-fe.mediaset.net/PROD/play/playback/check/v2.0?sid=' + sid, json=payload).json()['response']['mediaSelector']
|
||||
|
||||
url = res['url']
|
||||
mpd = True if 'dash' in res['formats'].lower() else False
|
||||
|
||||
if url:
|
||||
|
||||
sec_data = support.match(url + '?' + urlencode(res)).data
|
||||
item.url = support.match(sec_data, patron=r'<video src="([^"]+)').match + '|User-Agent=' + support.httptools.get_user_agent()
|
||||
pid = support.match(sec_data, patron=r'pid=([^|]+)').match
|
||||
|
||||
if mpd and pid:
|
||||
item.manifest = 'mpd'
|
||||
item.drm = 'com.widevine.alpha'
|
||||
item.license = lic_url.format(pid=pid, token=Token, ua=support.httptools.get_user_agent())
|
||||
else:
|
||||
item.manifest = 'hls'
|
||||
|
||||
return support.server(item, itemlist=[item], Download=False, Videolibrary=False)
|
||||
|
||||
|
||||
def get_from_id(item):
|
||||
#sessionKey = session.get(sessionUrl.format(uuid=str(uuid.uuid4())), verify=False).json()['sessionKey']
|
||||
#session.headers.update({'x-session': sessionKey})
|
||||
res = session.get(entry.format(id=item.args)).json()
|
||||
if 'components' in res:
|
||||
id = quote(",".join(res["components"]))
|
||||
res = session.get(entries.format(id=id)).json()
|
||||
if 'entries' in res:
|
||||
return res['entries']
|
||||
return {}
|
||||
|
||||
def get_programs(item):
|
||||
url = ''
|
||||
pag = item.page if item.page else 1
|
||||
ret = {}
|
||||
|
||||
if item.args.get('feed'):
|
||||
pag = item.page if item.page else 1
|
||||
url='{}&range={}-{}'.format(item.args.get('feed'), pag, pag + pagination - 1)
|
||||
ret['next'] = pag + pagination
|
||||
res = requests.get(url).json()
|
||||
|
||||
else:
|
||||
args = {key:value for key, value in item.args.items()}
|
||||
args['context'] = 'platform≈web'
|
||||
args['sid'] = sid
|
||||
args['sessionId'] = sid
|
||||
args['hitsPerPage'] = pagination
|
||||
args['property'] = 'search' if args.get('query') else 'play'
|
||||
args['tenant'] = 'play-prod-v2'
|
||||
args['page'] = pag
|
||||
args['deviceId'] = '017ac511182d008322c989f3aac803083002507b00bd0'
|
||||
url="https://api-ott-prod-fe.mediaset.net/PROD/play/reco/anonymous/v2.0?" + urlencode(args)
|
||||
|
||||
res = session.get(url).json()
|
||||
|
||||
if res:
|
||||
res = res.get('response', res)
|
||||
if 'entries' in res:
|
||||
ret['items'] = res['entries']
|
||||
elif 'blocks' in res:
|
||||
items = []
|
||||
for block in res['blocks']:
|
||||
items += block['items']
|
||||
ret['items'] = items
|
||||
if not 'next' in ret:
|
||||
next = res.get('pagination',{}).get('hasNextPage', False)
|
||||
ret['next'] = pag + 1 if next else 0
|
||||
return ret
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
369
channels/mediasetplay.py.old
Executable file
369
channels/mediasetplay.py.old
Executable file
@@ -0,0 +1,369 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# ------------------------------------------------------------
|
||||
# Canale per Mediaset Play
|
||||
# ------------------------------------------------------------
|
||||
from platformcode import logger, config
|
||||
import uuid
|
||||
|
||||
import requests, sys
|
||||
from core import support, jsontools
|
||||
if sys.version_info[0] >= 3: from urllib.parse import urlencode, quote
|
||||
else: from urllib import urlencode, quote
|
||||
if sys.version_info[0] >= 3: from concurrent import futures
|
||||
else: from concurrent_py2 import futures
|
||||
from collections import OrderedDict
|
||||
|
||||
PAGINATION = 4
|
||||
|
||||
host = config.get_channel_url()
|
||||
post_url = '?assetTypes=HD,browser,widevine,geoIT|geoNo:HD,browser,geoIT|geoNo:HD,geoIT|geoNo:SD,browser,widevine,geoIT|geoNo:SD,browser,geoIT|geoNo:SD,geoIT|geoNo&auto=true&balance=true&format=smil&formats=MPEG-DASH,MPEG4,M3U&tracking=true'
|
||||
deviceid = '61d27df7-5cbf-4419-ba06-cfd27ecd4588'
|
||||
loginUrl = 'https://api-ott-prod-fe.mediaset.net/PROD/play/idm/anonymous/login/v2.0'
|
||||
loginData = {"cid": deviceid, "platform": "pc", "appName": "web/mediasetplay-web/d667681"}
|
||||
lic_url = 'https://widevine.entitlement.theplatform.eu/wv/web/ModularDrm/getRawWidevineLicense?releasePid=%s&account=http://access.auth.theplatform.com/data/Account/2702976343&schema=1.0&token={token}|Accept=*/*&Content-Type=&User-Agent=' + support.httptools.get_user_agent() + '|R{{SSM}}|'
|
||||
entry = 'https://api.one.accedo.tv/content/entry/{id}?locale=it'
|
||||
entries = 'https://api.one.accedo.tv/content/entries?id={id}&locale=it'
|
||||
sessionUrl = "https://api.one.accedo.tv/session?appKey=59ad346f1de1c4000dfd09c5&uuid={uuid}&gid=default"
|
||||
|
||||
current_session = requests.Session()
|
||||
current_session.headers.update({'Content-Type': 'application/json', 'User-Agent': support.httptools.get_user_agent(), 'Referer': support.config.get_channel_url()})
|
||||
|
||||
# login anonimo
|
||||
res = current_session.post(loginUrl, json=loginData, verify=False)
|
||||
support.dbg()
|
||||
Token = res.json['response']['beToken']
|
||||
sid = res.json['response']['sid']
|
||||
current_session.headers.update({'authorization': 'Bearer' + Token})
|
||||
lic_url = lic_url.format(token=Token)
|
||||
tracecid = res.json()['response']['traceCid']
|
||||
cwid = res.json()['response']['cwId']
|
||||
|
||||
# sessione
|
||||
res = current_session.get(sessionUrl.format(uuid=str(uuid.uuid4())), verify=False)
|
||||
current_session.headers.update({'x-session': res.json()['sessionKey']})
|
||||
|
||||
cdict = {'CVFILM':'filmUltimiArrivi',
|
||||
'CWFILMTOPVIEWED':'filmPiuVisti24H',
|
||||
'CWFILMCOMEDY':'filmCommedia',
|
||||
'CWFILMACTION':'filmAzioneThrillerAvventura',
|
||||
'CWFILMDRAMATIC':'filmDrammatico',
|
||||
'CWFILMSENTIMENTAL':'filmSentimentale',
|
||||
'CWFILMCLASSIC':'filmClassici',
|
||||
'personToContentFilm':'personToContentFilm',
|
||||
'CWHOMEFICTIONNOWELITE':'stagioniFictionSerieTvSezione',
|
||||
'CWFICTIONSOAP':'mostRecentSoapOpera',
|
||||
'CWFICTIONDRAMATIC':'stagioniFictionDrammatico',
|
||||
'CWFICTIONPOLICE':'stagioniFictionPoliziesco',
|
||||
'CWFICTIONCOMEDY':'stagioniFictionCommedia',
|
||||
'CWFICTIONSITCOM':'stagioniFictionSitCom',
|
||||
'CWFICTIONSENTIMENTAL':'stagioniFictionSentimentale',
|
||||
'CWFICTIONBIOGRAPHICAL':'stagioniFictionBiografico',
|
||||
'CWPROGTVPRIME':'stagioniPrimaSerata',
|
||||
'CWPROGTVDAY':'stagioniDaytime',
|
||||
'CWPROGTVTOPVIEWED':'programmiTvClip24H',
|
||||
'CWPROGTVTALENT':'stagioniReality',
|
||||
'CWPROGTVVARIETY':'stagioniVarieta',
|
||||
'CWPROGTVTALK':'stagioniTalk',
|
||||
'CWPROGTVTG':'mostRecentTg',
|
||||
'CWPROGTVSPORT':'mostRecentSport',
|
||||
'CWPROGTVMAGAZINE':'stagioniCucinaLifestyle',
|
||||
'CWDOCUMOSTRECENT':'mostRecentDocumentariFep',
|
||||
'CWDOCUTOPVIEWED':'stagioniDocumentari',
|
||||
'CWDOCUSPAZIO':'documentariSpazio',
|
||||
'CWDOCUNATURANIMALI':'documentariNatura',
|
||||
'CWDOCUSCIENZATECH':'documentariScienza',
|
||||
'CWDOCUBIOSTORIE':'documentariBioStoria',
|
||||
'CWDOCUINCHIESTE':'documentariInchiesta',
|
||||
'CWFILMDOCU':'filmDocumentario',
|
||||
'CWKIDSBOINGFORYOU':'kidsBoing',
|
||||
'CWKIDSCARTOONITO':'kidsCartoonito',
|
||||
'CWKIDSMEDIASETBRAND':'kidsMediaset',
|
||||
'CWENABLERKIDS':'stagioniKids'}
|
||||
|
||||
|
||||
@support.menu
|
||||
def mainlist(item):
|
||||
top = [('Dirette {bold}', ['https://feed.entertainment.tv.theplatform.eu/f/PR1GhC/mediaset-prod-all-stations?sort=ShortTitle', 'live'])]
|
||||
|
||||
menu = [('Fiction / Serie TV {bullet bold}', ['/fiction', 'menu', ['Tutte','all','searchStagioni', '5acfcb3c23eec6000d64a6a4'], 'tvshow']),
|
||||
('Programmi TV{ bullet bold}', ['/programmitv', 'menu', ['Tutti','all','searchStagioni', '5acfc8011de1c4000b6ec953'], 'tvshow']),
|
||||
('Documentari {bullet bold}', ['/documentari', 'menu', ['Tutti','all','', '5bfd17c423eec6001aec49f9'], 'undefined']),
|
||||
('Kids {bullet bold}', ['/kids', 'menu',['Tutti','all','', '5acfcb8323eec6000d64a6b3'], 'undefined'])]
|
||||
|
||||
search = ''
|
||||
return locals()
|
||||
|
||||
|
||||
def search(item, text):
|
||||
itemlist = []
|
||||
logger.debug(text)
|
||||
item.search = text
|
||||
|
||||
try:
|
||||
itemlist = peliculas(item)
|
||||
except:
|
||||
import sys
|
||||
for line in sys.exc_info():
|
||||
support.logger.error("%s" % line)
|
||||
|
||||
return itemlist
|
||||
|
||||
|
||||
def menu(item):
|
||||
logger.debug()
|
||||
itemlist = []
|
||||
if item.url:
|
||||
json = get_from_id(item)
|
||||
for it in json:
|
||||
logger.debug(jsontools.dump(it))
|
||||
if 'uxReference' in it: itemlist.append(
|
||||
item.clone(title=support.typo(it['title'], 'bullet bold'), url= it['landingUrl'], feed = it.get('feedurlV2',''), ref=it['uxReference'], args='', action='peliculas'))
|
||||
return itemlist
|
||||
|
||||
|
||||
def liveDict():
|
||||
livedict = OrderedDict({})
|
||||
json = current_session.get('https://feed.entertainment.tv.theplatform.eu/f/PR1GhC/mediaset-prod-all-stations?sort=ShortTitle').json()['entries']
|
||||
for it in json:
|
||||
urls = []
|
||||
if it.get('tuningInstruction') and not it.get('mediasetstation$digitalOnly'):
|
||||
guide=current_session.get('https://static3.mediasetplay.mediaset.it/apigw/nownext/' + it['callSign'] + '.json').json()['response']
|
||||
for key in it['tuningInstruction']['urn:theplatform:tv:location:any']:
|
||||
urls += key['publicUrls']
|
||||
title = it['title']
|
||||
livedict[title] = {}
|
||||
livedict[title]['urls'] = urls
|
||||
livedict[title]['plot'] = support.typo(guide['currentListing']['mediasetlisting$epgTitle'],'bold') + '\n' + guide['currentListing']['mediasetlisting$shortDescription'] + '\n' + guide['currentListing']['description'] + '\n\n' + support.typo('A Seguire:' + guide['nextListing']['mediasetlisting$epgTitle'], 'bold')
|
||||
return livedict
|
||||
|
||||
|
||||
def live(item):
|
||||
logger.debug()
|
||||
itemlist = []
|
||||
for key, value in liveDict().items():
|
||||
itemlist.append(item.clone(title=support.typo(key, 'bold'),
|
||||
fulltitle=key,
|
||||
show=key,
|
||||
contentTitle=key,
|
||||
forcethumb=True,
|
||||
urls=value['urls'],
|
||||
plot=value['plot'],
|
||||
action='play',
|
||||
no_return=True))
|
||||
return support.thumb(itemlist, live=True)
|
||||
|
||||
|
||||
def peliculas(item):
|
||||
logger.debug()
|
||||
itemlist = []
|
||||
titlelist = []
|
||||
contentType = ''
|
||||
if item.text:
|
||||
json = []
|
||||
itlist = []
|
||||
with futures.ThreadPoolExecutor() as executor:
|
||||
for arg in ['searchMovie', 'searchStagioni', 'searchClip']:
|
||||
item.args = ['', 'search', arg]
|
||||
itlist += [executor.submit(get_programs, item)]
|
||||
for res in futures.as_completed(itlist):
|
||||
json += res.result()
|
||||
else:
|
||||
json = get_programs(item)
|
||||
|
||||
for it in json:
|
||||
if item.search.lower() in it['title'].lower() and it['title'] not in titlelist:
|
||||
titlelist.append(it['title'])
|
||||
if 'media' in it:
|
||||
action = 'findvideos'
|
||||
contentType = 'movie'
|
||||
urls = []
|
||||
for key in it['media']:
|
||||
urls.append(key['publicUrl'])
|
||||
|
||||
else:
|
||||
action = 'epmenu'
|
||||
contentType = 'tvshow'
|
||||
urls = it['mediasetprogram$brandId']
|
||||
if urls:
|
||||
title = it['mediasetprogram$brandTitle'] + ' - ' if 'mediasetprogram$brandTitle' in it and it['mediasetprogram$brandTitle'] != it['title'] else ''
|
||||
itemlist.append(
|
||||
item.clone(channel=item.channel,
|
||||
action=action,
|
||||
title=support.typo(title + it['title'], 'bold'),
|
||||
fulltitle=it['title'],
|
||||
show=it['title'],
|
||||
contentType=contentType if contentType else item.contentType,
|
||||
contentTitle=it['title'] if 'movie' in [contentType, item.contentType] else '',
|
||||
contentSerieName=it['title'] if 'tvshow' in [contentType, item.contentType] else '',
|
||||
thumbnail=it['thumbnails']['image_vertical-264x396']['url'] if 'image_vertical-264x396' in it['thumbnails'] else '',
|
||||
fanart=it['thumbnails']['image_keyframe_poster-1280x720']['url'] if 'image_keyframe_poster-1280x720' in it['thumbnails'] else '',
|
||||
plot=it['longDescription'] if 'longDescription' in it else it['description'] if 'description' in it else '',
|
||||
urls=urls,
|
||||
seriesid = it.get('seriesId',''),
|
||||
url=it['mediasetprogram$pageUrl'],
|
||||
forcethumb=True,
|
||||
no_return=True))
|
||||
if item.feed:
|
||||
item.page = item.page + 100 if item.page else 101
|
||||
support.nextPage(itemlist, item)
|
||||
return itemlist
|
||||
|
||||
|
||||
def epmenu(item):
|
||||
logger.debug()
|
||||
itemlist = []
|
||||
|
||||
if item.seriesid:
|
||||
seasons = current_session.get('https://feed.entertainment.tv.theplatform.eu/f/PR1GhC/mediaset-prod-tv-seasons?bySeriesId=' + item.seriesid).json()['entries']
|
||||
for season in seasons:
|
||||
if 'mediasettvseason$brandId' in season and 'mediasettvseason$displaySeason' in season:
|
||||
itemlist.append(
|
||||
item.clone(seriesid = '',
|
||||
title=support.typo(season['mediasettvseason$displaySeason'], 'bold'),
|
||||
urls=season['mediasettvseason$brandId']))
|
||||
itemlist = sorted(itemlist, key=lambda it: it.title, reverse=True)
|
||||
if len(itemlist) == 1: return epmenu(itemlist[0])
|
||||
if not itemlist:
|
||||
entries = current_session.get('https://feed.entertainment.tv.theplatform.eu/f/PR1GhC/mediaset-prod-all-brands?byCustomValue={brandId}{' + item.urls + '}').json()['entries']
|
||||
for entry in entries:
|
||||
if 'mediasetprogram$subBrandId' in entry:
|
||||
itemlist.append(
|
||||
item.clone(action='episodios',
|
||||
title=support.typo(entry['description'], 'bold'),
|
||||
url=entry['mediasetprogram$subBrandId'],
|
||||
order=entry.get('mediasetprogram$order',0)))
|
||||
if len(itemlist) == 1: return episodios(itemlist[0])
|
||||
itemlist = sorted(itemlist, key=lambda it: it.order)
|
||||
return itemlist
|
||||
|
||||
|
||||
def episodios(item):
|
||||
logger.debug()
|
||||
itemlist = []
|
||||
if not item.nextIndex: item.nextIndex = 1
|
||||
|
||||
url = 'https://feed.entertainment.tv.theplatform.eu/f/PR1GhC/mediaset-prod-all-programs?byCustomValue={subBrandId}{'+ item.url + '}&range=' + str(item.nextIndex) + '-' + str(item.nextIndex + PAGINATION)
|
||||
json = current_session.get(url).json()['entries']
|
||||
|
||||
for it in json:
|
||||
urls = []
|
||||
if 'media' in it:
|
||||
for key in it['media']:
|
||||
urls.append(key['publicUrl'])
|
||||
if urls:
|
||||
title = it['title']
|
||||
itemlist.append(
|
||||
item.clone(action='findvideos',
|
||||
title=support.typo(title, 'bold'),
|
||||
contentType='episode',
|
||||
thumbnail=it['thumbnails']['image_vertical-264x396']['url'] if 'image_vertical-264x396' in it['thumbnails'] else '',
|
||||
fanart=it['thumbnails']['image_keyframe_poster-1280x720']['url'] if 'image_keyframe_poster-1280x720' in it['thumbnails'] else '',
|
||||
plot=it['longDescription'] if 'longDescription' in it else it['description'],
|
||||
urls=urls,
|
||||
url=it['mediasetprogram$pageUrl'],
|
||||
year=it.get('year',''),
|
||||
ep= it.get('tvSeasonEpisodeNumber', 0) if it.get('tvSeasonEpisodeNumber', 0) else 0,
|
||||
forcethumb=True,
|
||||
no_return=True))
|
||||
|
||||
if len(itemlist) == 1: return findvideos(itemlist[0])
|
||||
|
||||
if (len(json) >= PAGINATION):
|
||||
item.nextIndex += PAGINATION + 1
|
||||
support.nextPage(itemlist, item)
|
||||
|
||||
return itemlist
|
||||
|
||||
|
||||
def findvideos(item):
|
||||
logger.debug()
|
||||
itemlist = [item.clone(server='directo', title='Mediaset Play', urls=item.urls, action='play')]
|
||||
return support.server(item, itemlist=itemlist, Download=False)
|
||||
|
||||
|
||||
def play(item):
|
||||
logger.debug()
|
||||
for url in item.urls:
|
||||
sec_data = support.match(url + post_url).data
|
||||
item.url = support.match(sec_data, patron=r'<video src="([^"]+)').match
|
||||
pid = support.match(sec_data, patron=r'pid=([^|]+)').match
|
||||
item.manifest = 'mpd'
|
||||
|
||||
if pid:
|
||||
item.drm = 'com.widevine.alpha'
|
||||
item.license = lic_url % pid
|
||||
break
|
||||
|
||||
return [item]
|
||||
|
||||
|
||||
def subBrand(json):
|
||||
logger.debug()
|
||||
subBrandId = current_session.get('https://feed.entertainment.tv.theplatform.eu/f/PR1GhC/mediaset-prod-all-brands?byCustomValue={brandId}{' + json + '}').json()['entries'][-1]['mediasetprogram$subBrandId']
|
||||
json = current_session.get('https://feed.entertainment.tv.theplatform.eu/f/PR1GhC/mediaset-prod-all-programs?byCustomValue={subBrandId}{' + subBrandId + '}').json()['entries']
|
||||
return json
|
||||
|
||||
|
||||
def get_from_id(item):
|
||||
logger.debug()
|
||||
json = current_session.get(entry.format(id=item.args[3])).json()
|
||||
if 'components' in json:
|
||||
id = quote(",".join(json["components"]))
|
||||
json = current_session.get(entries.format(id=id)).json()
|
||||
if 'entries' in json:
|
||||
return json['entries']
|
||||
return {}
|
||||
|
||||
|
||||
def get_programs(item, ret=[], args={}):
|
||||
hasMore = False
|
||||
url = ''
|
||||
# support.dbg()
|
||||
|
||||
if 'search' in item.args:
|
||||
args['uxReference'] = item.args[2]
|
||||
args["query"] = item.text
|
||||
args['traceCid'] = tracecid
|
||||
args['cwId'] = cwid
|
||||
args['page'] = 1
|
||||
args['platform'] = 'pc'
|
||||
args['hitsPerPage'] = 500
|
||||
url = 'https://api-ott-prod-fe.mediaset.net/PROD/play/rec2/search/v1.0?' + urlencode(args)
|
||||
elif item.feed:
|
||||
pag = item.page if item.page else 1
|
||||
url='{}&range={}-{}'.format(item.feed, pag, pag + 99)
|
||||
elif not args:
|
||||
if item.ref in cdict:
|
||||
args['uxReference'] = cdict[item.ref]
|
||||
args['platform'] = 'pc'
|
||||
else:
|
||||
args = {"query": "*:*"}
|
||||
if item.args[2]:
|
||||
args['categories'] = item.args[2]
|
||||
|
||||
args['cwId'] = cwid
|
||||
args['traceCid'] = tracecid
|
||||
args['hitsPerPage'] = 500
|
||||
args['page'] = '0'
|
||||
args['deviceId'] = deviceid
|
||||
url="https://api-ott-prod-fe.mediaset.net/PROD/play/rec2/cataloguelisting/v1.0?" + urlencode(args)
|
||||
|
||||
|
||||
if url:
|
||||
json = current_session.get(url).json()
|
||||
if 'response' in json:
|
||||
json = json['response']
|
||||
if 'hasMore' in json:
|
||||
hasMore = json['hasMore']
|
||||
if 'components' in json:
|
||||
id = quote(",".join(json["components"]))
|
||||
json = current_session.get(entries.format(id=id)).json()
|
||||
if 'entries' in json:
|
||||
ret += json['entries']
|
||||
if hasMore:
|
||||
args['page'] = str(int(args['page']) + 1)
|
||||
return get_programs(item, ret, args)
|
||||
else:
|
||||
return ret
|
||||
else:
|
||||
return ret
|
||||
11
channels/metalvideo.json
Executable file
11
channels/metalvideo.json
Executable file
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"id": "metalvideo",
|
||||
"name": "Metal Video",
|
||||
"active": false,
|
||||
"language": ["*"],
|
||||
"thumbnail": "metalvideo.png",
|
||||
"banner": "metalvideo.png",
|
||||
"categories": ["music"],
|
||||
"not_active":["include_in_global_search"],
|
||||
"settings" :[]
|
||||
}
|
||||
62
channels/metalvideo.py
Executable file
62
channels/metalvideo.py
Executable file
@@ -0,0 +1,62 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# ------------------------------------------------------------
|
||||
# Canale per altadefinizione01
|
||||
# ------------------------------------------------------------
|
||||
|
||||
from core import support
|
||||
|
||||
host = 'https://metalvideo.com'
|
||||
headers = {'X-Requested-With': 'XMLHttpRequest'}
|
||||
|
||||
|
||||
@support.menu
|
||||
def mainlist(item):
|
||||
menu = [('Generi',['', 'genres']),
|
||||
('Ultimi Video',['/videos/latest', 'peliculas']),
|
||||
('Top Video',['/videos/top', 'peliculas']),
|
||||
('Cerca...',['','search',])]
|
||||
return locals()
|
||||
|
||||
|
||||
@support.scrape
|
||||
def genres(item):
|
||||
item.url = host
|
||||
action = 'peliculas'
|
||||
patronBlock = r'<div class="swiper-slide">(?P<block>.*?)<button'
|
||||
patron = r'class="" href="(?P<url>[^"]+)[^>]+>(?P<title>[^<]+)<'
|
||||
def itemHook(item):
|
||||
item.thumbnail = support.thumb('music')
|
||||
item.contentType = 'music'
|
||||
return item
|
||||
return locals()
|
||||
|
||||
@support.scrape
|
||||
def peliculas(item):
|
||||
# debug=True
|
||||
action = 'findvideos'
|
||||
patron= r'<a href="(?P<url>[^"]+)"[^>]+>\s*<img src="(?P<thumb>[^"]+)" alt="(?P<title>[^"]+)"[^>]*>'
|
||||
patronNext = r'<a href="([^"]+)" data-load="[^"]+" class="[^"]+" title="Next'
|
||||
typeContentDict = {'': 'music'}
|
||||
def itemHook(item):
|
||||
item.contentType = 'music'
|
||||
item.thumbnail = item.thumbnail.replace('https:','http:')
|
||||
return item
|
||||
return locals()
|
||||
|
||||
|
||||
def findvideos(item):
|
||||
data = support.match(item, patron=r'<source src="[^"]+').match
|
||||
return support.server(item, Videolibrary=False, data=data)
|
||||
|
||||
|
||||
def search(item, text):
|
||||
support.info(text)
|
||||
item.url = host + '/search?keyword=' + text
|
||||
try:
|
||||
return peliculas(item)
|
||||
# Continua la ricerca in caso di errore
|
||||
except:
|
||||
import sys
|
||||
for line in sys.exc_info():
|
||||
support.logger.error("%s" % line)
|
||||
return []
|
||||
11
channels/mondoserietv.json
Executable file
11
channels/mondoserietv.json
Executable file
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"id": "mondoserietv",
|
||||
"name": "MondoSerieTV",
|
||||
"active": false,
|
||||
"language": ["ita"],
|
||||
"thumbnail": "mondoserietv.png",
|
||||
"bannermenu": "mondoserietv.png",
|
||||
"categories": ["movie","anime","tvshow","documentary"],
|
||||
"not_active":["include_in_newest_anime","include_in_newest_documentary"],
|
||||
"settings": []
|
||||
}
|
||||
119
channels/mondoserietv.py
Executable file
119
channels/mondoserietv.py
Executable file
@@ -0,0 +1,119 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# ------------------------------------------------------------
|
||||
# Canale per mondoserietv
|
||||
# ----------------------------------------------------------
|
||||
|
||||
from core import support
|
||||
|
||||
host = support.config.get_channel_url()
|
||||
headers = {'Referer': host}
|
||||
|
||||
|
||||
@support.menu
|
||||
def mainlist(item):
|
||||
|
||||
film = ['/lista-film',
|
||||
('Ultimi Film Aggiunti', ['/ultimi-film-aggiunti', 'peliculas' , 'last'])]
|
||||
|
||||
tvshow = ['/lista-serie-tv',
|
||||
('HD {TV}', ['/lista-serie-tv-in-altadefinizione']),
|
||||
('Anni 50 60 70 80 {TV}',['/lista-serie-tv-anni-60-70-80']),
|
||||
('Serie Italiane',['/lista-serie-tv-italiane'])]
|
||||
|
||||
anime = ['/lista-cartoni-animati-e-anime']
|
||||
|
||||
docu = [('Documentari {bullet bold}',['/lista-documentari', 'peliculas', '', 'tvshow'])]
|
||||
|
||||
search = ''
|
||||
|
||||
return locals()
|
||||
|
||||
|
||||
def search(item, text):
|
||||
support.info(text)
|
||||
if item.contentType == 'movie' or item.extra == 'movie':
|
||||
action = 'findvideos'
|
||||
else:
|
||||
action = 'episodios'
|
||||
item.args = 'search'
|
||||
item.url = host + "?a=b&s=" + text
|
||||
try:
|
||||
return peliculas(item)
|
||||
# Continua la ricerca in caso di errore .
|
||||
except:
|
||||
import sys
|
||||
for line in sys.exc_info():
|
||||
support.logger.error("%s" % line)
|
||||
return []
|
||||
|
||||
|
||||
def newest(categoria):
|
||||
support.info(categoria)
|
||||
item = support.Item()
|
||||
try:
|
||||
if categoria == "series":
|
||||
item.contentType= 'tvshow'
|
||||
item.url = host + '/ultimi-episodi-aggiunti'
|
||||
item.args = "lastep"
|
||||
if categoria == "peliculas":
|
||||
item.contentType= 'movie'
|
||||
item.url = host + '/ultimi-film-aggiunti'
|
||||
item.args = "last"
|
||||
return peliculas(item)
|
||||
# Continua la ricerca in caso di errore
|
||||
except:
|
||||
import sys
|
||||
for line in sys.exc_info():
|
||||
support.logger.error("{0}".format(line))
|
||||
return []
|
||||
|
||||
|
||||
@support.scrape
|
||||
def peliculas(item):
|
||||
pagination = ''
|
||||
anime = True
|
||||
patronNext = r'href="([^"]+)" title="[^"]+" class="lcp_nextlink"'
|
||||
action = 'findvideos'
|
||||
# debug=True
|
||||
if item.args == 'last':
|
||||
patronBlock = r'<table>(?P<block>.*?)</table>'
|
||||
patron = r'<tr><td><a href="(?P<url>[^"]+)">\s*[^>]+>(?P<title>.*?)(?:\s(?P<year>\d{4}))?\s*(?:Streaming|</b>)'
|
||||
elif item.args == 'lastep':
|
||||
patronBlock = r'<table>(?P<block>.*?)</table>'
|
||||
patron = r'<td>\s*<a href="[^>]+>(?P<title>.*?)(?:\s(?P<year>\d{4}))?\s(?:(?P<episode>(?:\d+x\d+|\d+)))\s*(?P<title2>[^<]+)(?P<url>.*?)<tr>'
|
||||
elif item.args == 'search':
|
||||
patronBlock = r'<div class="peliculas">(?P<block>.*?)<div id="paginador"'
|
||||
patron = r'class="item">\s*<a href="(?P<url>[^"]+)">\s*<div class="image">\s*<img src="(?P<thumb>[^"]+)" alt="(?P<title>.+?)(?:"| \d{4}).*?<span class="ttx">(?P<plot>[^<]+)<div class="degradado">[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>\s*(?:<span class="imdbs">(?P<rating>[^<]+))?(?:[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>(?P<year>\d+))?'
|
||||
def itemHook(item):
|
||||
if '/film/' in item.url:
|
||||
item.contentType = 'movie'
|
||||
item.action = 'findvideos'
|
||||
else:
|
||||
item.contentType = 'tvshow'
|
||||
item.action = 'episodios'
|
||||
return item
|
||||
else:
|
||||
patronBlock = r'<div class="entry-content pagess">(?P<block>.*?)</ul>'
|
||||
patron = r'<li\s*><a href="(?P<url>[^"]+)" title="(?P<title>.*?)(?:\s(?P<year>\d{4}))?"[^>]*>'
|
||||
if item.contentType == 'tvshow':
|
||||
action = 'episodios'
|
||||
anime = True
|
||||
return locals()
|
||||
|
||||
|
||||
@support.scrape
|
||||
def episodios(item):
|
||||
anime = True
|
||||
pagination = 50
|
||||
patronBlock = r'<table>(?P<block>.*?)</table>'
|
||||
patron = r'<tr><td><b>(?P<title>(?:\d+)?.*?)\s*(?:(?P<episode>(?:\d+x\d+|\d+)))\s*(?P<title2>[^<]+)(?P<data>.*?)<tr>'
|
||||
def itemHook(item):
|
||||
clear = support.re.sub(r'\[[^\]]+\]', '', item.title)
|
||||
if clear.isdigit():
|
||||
item.title = support. typo('Episodio ' + clear, 'bold')
|
||||
return item
|
||||
return locals()
|
||||
|
||||
def findvideos(item):
|
||||
if item.contentType == 'movie': return support.server(item)
|
||||
else: return support.server(item, item.data)
|
||||
12
channels/paramount.json
Executable file
12
channels/paramount.json
Executable file
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"id": "paramount",
|
||||
"name": "Paramount Network",
|
||||
"active": false,
|
||||
"language": ["ita"],
|
||||
"thumbnail": "paramount.png",
|
||||
"banner": "paramount.png",
|
||||
"categories": ["movie", "tvshow", "documentary", "live"],
|
||||
"not_active": ["include_in_newest"],
|
||||
"default_off": ["include_in_global_search"],
|
||||
"settings": []
|
||||
}
|
||||
183
channels/paramount.py
Executable file
183
channels/paramount.py
Executable file
@@ -0,0 +1,183 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# ------------------------------------------------------------
|
||||
# Canale per Paramount Network
|
||||
# ------------------------------------------------------------
|
||||
import inspect
|
||||
from core import support, jsontools
|
||||
from platformcode import autorenumber, logger
|
||||
from collections import OrderedDict
|
||||
|
||||
from specials import videolibrary
|
||||
|
||||
host = support.config.get_channel_url()
|
||||
headers = [['Referer', host]]
|
||||
|
||||
|
||||
@support.menu
|
||||
def mainlist(item):
|
||||
top = [('Dirette {bold}', ['', 'live'])]
|
||||
film = ['/film']
|
||||
tvshow = ['/programmi']
|
||||
return locals()
|
||||
|
||||
@support.scrape
|
||||
def menu(item):
|
||||
action='peliculas'
|
||||
blacklist=['Tutti']
|
||||
patronMenu = r'<a data-display-name="Link" href="(?P<url>[^"]+)" class="[^"]+">(?P<title>[^<]+)'
|
||||
return locals()
|
||||
|
||||
|
||||
def search(item, text):
|
||||
logger.info(text)
|
||||
|
||||
item.text = text
|
||||
try:
|
||||
return peliculas(item)
|
||||
# Continua la ricerca in caso di errore .
|
||||
except:
|
||||
import sys
|
||||
for line in sys.exc_info():
|
||||
logger.error("%s" % line)
|
||||
return []
|
||||
|
||||
|
||||
def liveDict():
|
||||
livedict = OrderedDict({})
|
||||
urls=[]
|
||||
matches = support.match(host, patron=r'(/diretta-tv/[^"]+)"[^>]+>([^ ]+)').matches
|
||||
from datetime import date
|
||||
today = date.today()
|
||||
channels = jsontools.load(support.match(host + '/api/more/tvschedule/' + str(today.year) + str(today.month) + str(today.day)).data)['channels']
|
||||
|
||||
for channel in channels:
|
||||
title = channel['label']
|
||||
livedict[title] = {}
|
||||
livedict[title]['id'] = channel['channelId']
|
||||
for url, title in matches:
|
||||
if url not in urls:
|
||||
urls.append(url)
|
||||
livedict[title]['url'] = host + url
|
||||
info = jsontools.load(support.match(host +'/api/on-air?channelId=' + livedict[title]['id']).data)
|
||||
livedict[title]['plot']= '[B]' + info['seriesTitle'] +'[/B]\n' + info['description'] if 'seriesTitle' in info else ''
|
||||
return livedict
|
||||
|
||||
def live(item):
|
||||
logger.debug()
|
||||
itemlist=[]
|
||||
for key, value in liveDict().items():
|
||||
itemlist.append(item.clone(title=support.typo(key,'bold'), contentTitle=key, fulltitle=key, show=key, url=value['url'], plot=value['plot'], action='findvideos', forcethumb=True, no_return=True))
|
||||
return support.thumb(itemlist, live=True)
|
||||
|
||||
|
||||
def peliculas(item):
|
||||
logger.debug()
|
||||
def load_more(url):
|
||||
second_url = host if url.startswith('/') else '' + url.replace('\u002F','/').replace('\\u002F','/').replace('%5C','/')
|
||||
new_data = support.match(host + second_url).data.replace('\x01','l').replace('\x02','a')
|
||||
return jsontools.load(new_data)['items']
|
||||
|
||||
itemlist = []
|
||||
data = []
|
||||
page_data = support.match(item.url).data
|
||||
more = support.match(page_data, patron=r'loadingTitle":[^,]+,"url":"([^"]+)"').match
|
||||
data = jsontools.load(support.scrapertools.decodeHtmlentities(support.match(page_data, patron=[r'"nextPageUrl":[^,]+,"items":(.*?),"customContainerClass"', r'Streaming"},"items":(.*?),"isGrid"']).match))
|
||||
|
||||
if data:
|
||||
if more:
|
||||
new_data = load_more(more)
|
||||
data += new_data
|
||||
for it in data:
|
||||
try:
|
||||
title = it['meta']['header']['title']
|
||||
except:
|
||||
continue
|
||||
if item.text.lower() in title.lower():
|
||||
itemlist.append(
|
||||
item.clone(title=support.typo(title,'bold'),
|
||||
fulltitle = title,
|
||||
show = title,
|
||||
contentTitle = title if item.contentType == 'movie' else '',
|
||||
contentSerieName = title if item.contentType != 'movie' else '',
|
||||
url = host + it['url'] if it['url'].startswith('/') else it['url'],
|
||||
thumbnail = it['media']['image']['url'],
|
||||
fanart = it['media']['image']['url'],
|
||||
plot = it['meta']['description'],
|
||||
action = 'findvideos' if item.contentType == 'movie' else 'episodios'))
|
||||
return itemlist
|
||||
|
||||
|
||||
def episodios(item):
|
||||
logger.debug()
|
||||
reEp = r'"isEpisodes":[^,]+,"items":(.*?])'
|
||||
def load_more(url):
|
||||
second_url = host if url.startswith('/') else '' + url.replace('\u002F','/').replace('%5C','/')
|
||||
new_data = support.match(host + second_url).data
|
||||
match = support.scrapertools.decodeHtmlentities(support.match(new_data, headers=headers, patron=r'"items":([^\]]+])').match.replace('\x01','l').replace('\x02','a'))
|
||||
return jsontools.load(match)
|
||||
|
||||
itemlist = []
|
||||
page_data = support.match(item.url).data
|
||||
seasons = support.match(page_data, patron=r'href="([^"]+)"[^>]+>Stagione\s*\d+').matches
|
||||
more = support.match(page_data, patron=r'loadingTitle":[^,]+,"url":"([^"]+)"').match
|
||||
data = jsontools.load(support.scrapertools.decodeHtmlentities(support.match(page_data, patron=reEp).match))
|
||||
|
||||
if data:
|
||||
if more:
|
||||
data += load_more(more)
|
||||
if seasons:
|
||||
for url in seasons:
|
||||
new_data = support.match(host + url).data
|
||||
data += jsontools.load(support.scrapertools.decodeHtmlentities(support.match(new_data, patron=reEp).match.replace('\x01','l').replace('\x02','a')))
|
||||
match = support.match(new_data, patron=r'loadingTitle":[^,]+,"url":"([^"]+)"').match
|
||||
if match and match != load_more:
|
||||
data += load_more(match)
|
||||
|
||||
for it in data:
|
||||
if 'text' in it['meta']['header']['title']:
|
||||
se = it['meta']['header']['title']['text']
|
||||
s = support.match(se, patron=r'S\s*(?P<season>\d+)').match
|
||||
e = support.match(se, patron=r'E\s*(?P<episode>\d+)').match
|
||||
if not e: e = support.match(it['meta']['subHeader'], patron=r'(\d+)').match
|
||||
title = support.typo((s + 'x' if s else 'Episodio ') + e.zfill(2) + ' - ' + it['meta']['subHeader'],'bold')
|
||||
else:
|
||||
s = e = '0'
|
||||
title = support.typo(it['meta']['header']['title'],'bold')
|
||||
itemlist.append(
|
||||
item.clone(title=title,
|
||||
season=int(s) if s else '',
|
||||
episode=int(e),
|
||||
url=host + it['url'] if it['url'].startswith('/') else it['url'],
|
||||
thumbnail=it['media']['image']['url'],
|
||||
fanart=it['media']['image']['url'],
|
||||
plot=it['meta']['description'],
|
||||
contentType='episode',
|
||||
action='findvideos'))
|
||||
|
||||
itemlist.sort(key=lambda item: (item.season, item.episode))
|
||||
if inspect.stack(0)[1][3] not in ['find_episodes']:
|
||||
autorenumber.start(itemlist, item)
|
||||
return support.videolibrary(itemlist, item)
|
||||
|
||||
|
||||
def findvideos(item):
|
||||
logger.debug()
|
||||
logger.debug()
|
||||
item.manifest = 'hls'
|
||||
mgid = support.match(item.url, patron=r'uri":"([^"]+)"').match
|
||||
url = 'https://media.mtvnservices.com/pmt/e1/access/index.html?uri=' + mgid + '&configtype=edge&ref=' + item.url
|
||||
ID, rootUrl = support.match(url, patron=[r'"id":"([^"]+)",',r'brightcove_mediagenRootURL":"([^"]+)"']).matches
|
||||
item.url = jsontools.load(support.match(rootUrl.replace('&device={device}','').format(uri = ID)).data)['package']['video']['item'][0]['rendition'][0]['src']
|
||||
return support.server(item, itemlist=[item.clone(title='Paramount', server='directo', action='play')], Download=False, Videolibrary=False)
|
||||
|
||||
|
||||
# def play(item):
|
||||
# logger.debug()
|
||||
# item.manifest = 'hls'
|
||||
# mgid = support.match(item.url, patron=r'uri":"([^"]+)"').match
|
||||
# url = 'https://media.mtvnservices.com/pmt/e1/access/index.html?uri=' + mgid + '&configtype=edge&ref=' + item.url
|
||||
# ID, rootUrl = support.match(url, patron=[r'"id":"([^"]+)",',r'brightcove_mediagenRootURL":"([^"]+)"']).matches
|
||||
# item.url = jsontools.load(support.match(rootUrl.replace('&device={device}','').format(uri = ID)).data)['package']['video']['item'][0]['rendition'][0]['src']
|
||||
|
||||
|
||||
# return [item]
|
||||
11
channels/piratestreaming.json
Executable file
11
channels/piratestreaming.json
Executable file
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"id": "piratestreaming",
|
||||
"name": "Pirate Streaming",
|
||||
"active": false,
|
||||
"language": ["ita"],
|
||||
"thumbnail": "piratestreaming.png",
|
||||
"bannermenu": "piratestreaming.png",
|
||||
"categories": ["anime","movie","tvshow"],
|
||||
"settings": [],
|
||||
"cloudflare": true
|
||||
}
|
||||
97
channels/piratestreaming.py
Executable file
97
channels/piratestreaming.py
Executable file
@@ -0,0 +1,97 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# ------------------------------------------------------------
|
||||
# Canale per piratestreaming
|
||||
# ----------------------------------------------------------
|
||||
|
||||
|
||||
from core import support
|
||||
from core.support import config, info
|
||||
|
||||
host = config.get_channel_url()
|
||||
headers = [['Referer', host]]
|
||||
|
||||
|
||||
@support.menu
|
||||
def mainlist(item):
|
||||
|
||||
film = ['/category/films']
|
||||
tvshow = ['/category/serie']
|
||||
anime = ['/category/anime-cartoni-animati']
|
||||
search = ''
|
||||
|
||||
return locals()
|
||||
|
||||
|
||||
def search(item, texto):
|
||||
info(texto)
|
||||
item.url = host + "/?s=" + texto
|
||||
try:
|
||||
return peliculas(item)
|
||||
# Continua la ricerca in caso di errore
|
||||
except:
|
||||
import sys
|
||||
for line in sys.exc_info():
|
||||
support.logger.error("%s" % line)
|
||||
return []
|
||||
|
||||
|
||||
def newest(categoria):
|
||||
support.info(categoria)
|
||||
itemlist = []
|
||||
item = support.Item()
|
||||
try:
|
||||
if categoria == "peliculas":
|
||||
item.url = host + '/category/films'
|
||||
item.contentType = 'movies'
|
||||
return peliculas(item)
|
||||
if categoria == "series":
|
||||
item.url = host + '/category/serie'
|
||||
item.contentType = 'tvshow'
|
||||
return peliculas(item)
|
||||
if categoria == "anime":
|
||||
item.url = host + '/category/anime-cartoni-animati'
|
||||
item.contentType = 'tvshow'
|
||||
return peliculas(item)
|
||||
# Continua la ricerca in caso di errore
|
||||
except:
|
||||
import sys
|
||||
for line in sys.exc_info():
|
||||
support.logger.error("{0}".format(line))
|
||||
return []
|
||||
|
||||
return itemlist
|
||||
|
||||
|
||||
@support.scrape
|
||||
def peliculas(item):
|
||||
patron = r'data-placement="bottom" title="(?P<title>[^"]+)" alt=[^=]+="(?P<url>[^"]+)"> <img class="[^"]+" title="[^"]+(?P<type>film|serie)[^"]+" alt="[^"]+" src="(?P<thumb>[^"]+)"'
|
||||
patronNext = r'<a\s*class="nextpostslink" rel="next" href="([^"]+)">Avanti'
|
||||
|
||||
typeActionDict = {'findvideos': ['film'], 'episodios': ['serie']}
|
||||
typeContentDict = {'movie': ['film'], 'tvshow': ['serie']}
|
||||
# debug = True
|
||||
return locals()
|
||||
|
||||
|
||||
@support.scrape
|
||||
def episodios(item):
|
||||
if item.data: data = item.data
|
||||
# debug= True
|
||||
title = item.fulltitle
|
||||
patron = r'link-episode">(?:\s*<strong>)?\s*(?P<episode>\d+.\d+(?:.\d+)?)(?:\s*\((?P<lang>[?P<lang>A-Za-z-]+)[^>]+>)?(?:\s*(?P<title>[^-<]+))[^>]+</span>\s*(?P<url>.*?)</div>'
|
||||
def itemHook(item):
|
||||
if 'Episodio' in item.title:
|
||||
item.title = support.re.sub(r'Episodio [0-9.-]+', title, item.title)
|
||||
return item
|
||||
return locals()
|
||||
|
||||
|
||||
def findvideos(item):
|
||||
if item.contentType == 'episode':
|
||||
data = item.url
|
||||
else:
|
||||
data = support.match(item).data
|
||||
if 'link-episode' in data:
|
||||
item.data = data
|
||||
return episodios(item)
|
||||
return support.server(item, data=data)
|
||||
12
channels/plutotv.json
Executable file
12
channels/plutotv.json
Executable file
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"id": "plutotv",
|
||||
"name": "Pluto TV",
|
||||
"active": true,
|
||||
"language": ["ita"],
|
||||
"thumbnail": "plutotv.png",
|
||||
"banner": "plutotv.png",
|
||||
"categories": ["movie", "tvshow", "documentary", "live"],
|
||||
"not_active": ["include_in_newest"],
|
||||
"default_off": ["include_in_global_search"],
|
||||
"settings": []
|
||||
}
|
||||
134
channels/plutotv.py
Executable file
134
channels/plutotv.py
Executable file
@@ -0,0 +1,134 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# ------------------------------------------------------------
|
||||
# Canale per Pluto TV
|
||||
# ------------------------------------------------------------
|
||||
|
||||
import uuid, datetime
|
||||
from platformcode import logger, config
|
||||
from core.item import Item
|
||||
from core import jsontools, support, httptools
|
||||
|
||||
host = support.config.get_channel_url()
|
||||
|
||||
api = 'https://api.pluto.tv'
|
||||
UUID = 'sid={}&deviceId={}'.format(uuid.uuid1().hex, uuid.uuid4().hex)
|
||||
vod_url = '{}/v3/vod/categories?includeItems=true&deviceType=web&'.format(api, UUID)
|
||||
|
||||
@support.menu
|
||||
def mainlist(item):
|
||||
top = [('Dirette {bold}', ['/it/live-tv/', 'live'])]
|
||||
|
||||
menu = [('Categorie', ['', 'category'])]
|
||||
|
||||
search = ''
|
||||
|
||||
return locals()
|
||||
|
||||
@support.menu
|
||||
def category(item):
|
||||
menu = sorted([(it['name'], ['/it/on-demand', 'peliculas', it['items']]) for it in httptools.downloadpage(vod_url).json['categories'][1:]])
|
||||
return locals()
|
||||
|
||||
def live(item):
|
||||
logger.debug()
|
||||
|
||||
now = datetime.datetime.now()
|
||||
start = (now.strftime('%Y-%m-%dT%H:00:00Z'))
|
||||
stop = (now + datetime.timedelta(hours=4)).strftime('%Y-%m-%dT%H:00:00Z')
|
||||
|
||||
|
||||
live_url = '{}/v2/channels.json?{}'.format(api, UUID)
|
||||
guide_url = '{}/v2/channels?start={}&stop={}&{}'.format(api, start, stop, UUID)
|
||||
|
||||
guide = {g['number']:[g['timelines'][0]['title'], g['timelines'][1]['title']] for g in httptools.downloadpage(guide_url).json}
|
||||
|
||||
itemlist = []
|
||||
|
||||
for it in httptools.downloadpage(live_url).json:
|
||||
itemlist.append(item.clone(title= '[B]{}[/B] | {}'.format(it['name'], guide[it['number']][0]),
|
||||
number=it['number'],
|
||||
contentTitle=it['name'],
|
||||
action='findvideos',
|
||||
thumbnail=it['solidLogoPNG']['path'],
|
||||
fanart=it['featuredImage']['path'],
|
||||
plot='{}\n\n[B]A seguire:[/B]\n{}'.format(it['summary'], guide[it['number']][1]),
|
||||
videourl= it['stitched']['urls'][0]['url'].split('?')[0],
|
||||
forcethumb=True))
|
||||
itemlist.sort(key=lambda it: it.number)
|
||||
return itemlist
|
||||
|
||||
|
||||
def search(item, text):
|
||||
logger.debug('Search', text)
|
||||
try:
|
||||
item.search = text.lower()
|
||||
item.args = []
|
||||
for it in httptools.downloadpage(vod_url).json['categories'][1:]:
|
||||
item.args.extend(it['items'])
|
||||
return peliculas(item)
|
||||
|
||||
except:
|
||||
import sys
|
||||
for line in sys.exc_info():
|
||||
support.logger.error("%s" % line)
|
||||
return []
|
||||
|
||||
|
||||
def peliculas(item):
|
||||
logger.debug()
|
||||
itemlist = []
|
||||
recordlist = []
|
||||
|
||||
for i, it in enumerate(item.args):
|
||||
if item.search in it['name'].lower():
|
||||
itm = Item(channel=item.channel,
|
||||
url=item.url,
|
||||
title=it['name'],
|
||||
contentTitle=it['name'],
|
||||
contentSerieName= it['name'] if it['type'] == 'series' else '',
|
||||
plot=it['description'],
|
||||
contentType='tvshow' if it['type'] == 'series' else 'movie',
|
||||
action='episodios' if it['type'] == 'series' else 'findvideos',
|
||||
thumbnail= it['covers'][0]['url'],
|
||||
fanart= it['covers'][2]['url'] if len(it['covers']) > 2 else '',
|
||||
id= it['_id'],
|
||||
videourl= it.get('stitched', {}).get('urls', [{}])[0].get('url','').split('?')[0])
|
||||
|
||||
if i < 20 or item.search:
|
||||
itemlist.append(itm)
|
||||
else:
|
||||
recordlist.append(it)
|
||||
|
||||
support.tmdb.set_infoLabels_itemlist(itemlist, seekTmdb=True)
|
||||
if recordlist and not item.search:
|
||||
itemlist.append(item.clone(title=support.typo(support.config.get_localized_string(30992), 'color kod bold'), thumbnail=support.thumb(), args=recordlist))
|
||||
return itemlist
|
||||
|
||||
|
||||
def episodios(item):
|
||||
logger.debug()
|
||||
itemlist = []
|
||||
seasons = httptools.downloadpage('{}/v3/vod/series/{}/seasons?includeItems=true&deviceType=web&{}'.format(api, item.id, UUID)).json['seasons']
|
||||
for season in seasons:
|
||||
for episode in season['episodes']:
|
||||
itemlist.append(item.clone(title='{}x{:02d} - {}'.format(episode['season'], episode['number'], episode['name']),
|
||||
contrentTitle=episode['name'],
|
||||
contentSeason=episode['season'],
|
||||
contentEpisodeNumber=episode['number'],
|
||||
plot=episode['description'],
|
||||
thumbnail=episode['covers'][1]['url'],
|
||||
videourl=episode['stitched']['urls'][0]['url'].split('?')[0],
|
||||
action='findvideos'))
|
||||
|
||||
if config.get_setting('episode_info'):
|
||||
support.tmdb.set_infoLabels_itemlist(itemlist, seekTmdb=True)
|
||||
support.videolibrary(itemlist,item)
|
||||
return itemlist
|
||||
|
||||
|
||||
def findvideos(item):
|
||||
item.server = 'directo'
|
||||
item.manifest='hls'
|
||||
params = '{}?deviceDNT=0&deviceVersion=unknow&appVersion=unknow&deviceType=web&deviceMake=firefox&deviceModel=firefox&appName=web&{}'
|
||||
item.url = params.format(item.videourl, UUID)
|
||||
return support.server(item, itemlist=[item], Download=False, Videolibrary=False)
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user