Compare commits
575 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
fb3065a919 | ||
![]() |
93e1022269 | ||
![]() |
61a7bb4d10 | ||
![]() |
cf4b3eb2c1 | ||
![]() |
8e1b2feaec | ||
![]() |
bba11aae9b | ||
![]() |
d46fe3f3c7 | ||
![]() |
ccf5112211 | ||
![]() |
208761f28c | ||
![]() |
6972103891 | ||
![]() |
7c0d619f2f | ||
![]() |
7bdbc4a025 | ||
![]() |
b4e5009b2f | ||
![]() |
77841cd4c4 | ||
![]() |
df85d334a3 | ||
![]() |
0846ea6a98 | ||
![]() |
945f3f9c7f | ||
![]() |
8b1381aba6 | ||
![]() |
be74b3af7c | ||
![]() |
ef7902b378 | ||
![]() |
c2e3d0e225 | ||
![]() |
0c02767d8f | ||
![]() |
33c5ce86f7 | ||
![]() |
1c9213e7f1 | ||
![]() |
af1aa408c9 | ||
![]() |
716fe0e6b6 | ||
![]() |
3a40e73d43 | ||
![]() |
b6accb02dc | ||
![]() |
5599b05fb3 | ||
![]() |
54b14090dd | ||
![]() |
ad921afe94 | ||
![]() |
9b0a03d002 | ||
![]() |
29d3930baa | ||
![]() |
29c1ee3cac | ||
![]() |
33aac7e602 | ||
![]() |
331de4247b | ||
![]() |
9cecc38189 | ||
![]() |
0965274184 | ||
![]() |
ef49f304de | ||
![]() |
547a607dff | ||
![]() |
486760a211 | ||
![]() |
97a4cd6a1f | ||
![]() |
7cb48969be | ||
![]() |
c3d2659b7f | ||
![]() |
9689ea7881 | ||
![]() |
cba4fe074f | ||
![]() |
821e796678 | ||
![]() |
582784c547 | ||
![]() |
538c455c6a | ||
![]() |
82eaa15537 | ||
![]() |
0e7ce1d38d | ||
![]() |
106ce8aa58 | ||
![]() |
2baf645351 | ||
![]() |
d9d935c267 | ||
![]() |
ef3dfad4aa | ||
![]() |
6d275244ef | ||
![]() |
7a25d94b95 | ||
![]() |
81c9828e4c | ||
![]() |
23b0378d2a | ||
![]() |
dd029db392 | ||
![]() |
40978fbce1 | ||
![]() |
2cc451ebef | ||
![]() |
2f6e1e29b1 | ||
![]() |
99c0de285e | ||
![]() |
d9afee215d | ||
![]() |
dc8f85d33d | ||
![]() |
1134ef71da | ||
![]() |
c9e5f14687 | ||
![]() |
dbe7561642 | ||
![]() |
9fcb16e535 | ||
![]() |
1215548b31 | ||
![]() |
ecf295873f | ||
![]() |
8dcc2aedc9 | ||
![]() |
08b3ba0f02 | ||
![]() |
f587ae3084 | ||
![]() |
58206b0d33 | ||
![]() |
8e5538a11e | ||
![]() |
175bea9269 | ||
![]() |
33cbc71817 | ||
![]() |
f7014f4ca2 | ||
![]() |
874e14018e | ||
![]() |
922c08da19 | ||
![]() |
5fe89a85e9 | ||
![]() |
0bcf922f37 | ||
![]() |
eb485bfa60 | ||
![]() |
74d0e022ae | ||
![]() |
0a8675ea7c | ||
![]() |
eed8cb70a3 | ||
![]() |
e476233f07 | ||
![]() |
b8d40b5259 | ||
![]() |
a399e8d0a5 | ||
![]() |
db049b2478 | ||
![]() |
03ab411d68 | ||
![]() |
20b9b692f0 | ||
![]() |
f99e104755 | ||
![]() |
8a9648d347 | ||
![]() |
3ca760145c | ||
![]() |
3cf09f5b0f | ||
![]() |
657bb15282 | ||
![]() |
069c64f504 | ||
![]() |
65c1aed251 | ||
![]() |
e8e4289b20 | ||
![]() |
0838a0b258 | ||
![]() |
8e8f143b02 | ||
![]() |
2e56f662cd | ||
![]() |
440d59a30e | ||
![]() |
286ef8396a | ||
![]() |
772df7a4c1 | ||
![]() |
134fd3f4cf | ||
![]() |
ae8f8f7ccd | ||
![]() |
f8637051fa | ||
![]() |
eb0e82494c | ||
![]() |
265b949de9 | ||
![]() |
34acbed7f0 | ||
![]() |
42eb68ba76 | ||
![]() |
37591c6da6 | ||
![]() |
f5a8ad61b9 | ||
![]() |
e064fd8ccd | ||
![]() |
8a9949ac93 | ||
![]() |
40dde036d6 | ||
![]() |
171205bdee | ||
![]() |
03e0c6d67e | ||
![]() |
91500c95e6 | ||
![]() |
8a082b0668 | ||
![]() |
650b6986f9 | ||
![]() |
82fd53226c | ||
![]() |
77fd3e206b | ||
![]() |
3989f35827 | ||
![]() |
82376a508a | ||
![]() |
4f9ce14e2f | ||
![]() |
60a2ffbe41 | ||
![]() |
15598e3d66 | ||
![]() |
357be7dda9 | ||
![]() |
a0aa77519b | ||
![]() |
f3ef590d3f | ||
![]() |
d347ea71b8 | ||
![]() |
62f0bdc19c | ||
![]() |
e92b925eab | ||
![]() |
e8239f4899 | ||
![]() |
5c855d3b50 | ||
![]() |
6dfaff6aad | ||
![]() |
849b9e9765 | ||
![]() |
eacfd53466 | ||
![]() |
4459697fe5 | ||
![]() |
94872affa9 | ||
![]() |
a29064e7fb | ||
![]() |
679cba4297 | ||
![]() |
f155a21ee8 | ||
![]() |
0913ee4934 | ||
![]() |
1fa0384eb8 | ||
![]() |
59727fe8fc | ||
![]() |
28707fa146 | ||
![]() |
f408abe7a4 | ||
![]() |
42434c35a1 | ||
![]() |
df941c54ce | ||
![]() |
f2eb4dacd0 | ||
![]() |
9795587e4d | ||
![]() |
15064810f8 | ||
![]() |
fbfee66c7b | ||
![]() |
53e2d9e9cd | ||
![]() |
49fd078a4c | ||
![]() |
3dfba7c204 | ||
![]() |
0e59621650 | ||
![]() |
c2f4cc97ab | ||
![]() |
5fc7fca5c6 | ||
![]() |
7b2dd93f2f | ||
![]() |
a8ddf21081 | ||
![]() |
7db50dba49 | ||
![]() |
9d30f833da | ||
![]() |
bf959f1c29 | ||
![]() |
1cde5c5142 | ||
![]() |
58a7de145a | ||
![]() |
9a66289a26 | ||
![]() |
6201712ce9 | ||
![]() |
f921df948c | ||
![]() |
059701fbf6 | ||
![]() |
addf98e9a3 | ||
![]() |
f124b7e30b | ||
![]() |
0fc2a3083c | ||
![]() |
01141b8cc1 | ||
![]() |
be542272d1 | ||
![]() |
2c4f18128a | ||
![]() |
adbd6c9d0d | ||
![]() |
a854771950 | ||
![]() |
b4fafe2845 | ||
![]() |
1050157546 | ||
![]() |
6f54958ec0 | ||
![]() |
a53fc1e8cb | ||
![]() |
e0e81ff52b | ||
![]() |
4f86272074 | ||
![]() |
d909d0cb60 | ||
![]() |
6a18ec23b2 | ||
![]() |
c40c176b72 | ||
![]() |
55f2951694 | ||
![]() |
5b641a5efc | ||
![]() |
d259f3df0d | ||
![]() |
2ad44cd79b | ||
![]() |
2ffdc1678b | ||
![]() |
db4717b714 | ||
![]() |
6d26fb8f43 | ||
![]() |
ca2b4110bb | ||
![]() |
606e629cc6 | ||
![]() |
0fd925e945 | ||
![]() |
c3033db8fb | ||
![]() |
e312a4da09 | ||
![]() |
467eb453db | ||
![]() |
7c0e22258a | ||
![]() |
bfdc5043eb | ||
![]() |
c2520c86d7 | ||
![]() |
fb41b2a543 | ||
![]() |
384c76e27d | ||
![]() |
eaf84e201f | ||
![]() |
9862ca408a | ||
![]() |
fbc48848d6 | ||
![]() |
894688337e | ||
![]() |
bae4752cad | ||
![]() |
58987e3e38 | ||
![]() |
e63d98acfc | ||
![]() |
c44385e9b7 | ||
![]() |
0dd2dcf497 | ||
![]() |
8f8a1af9d9 | ||
![]() |
369640b464 | ||
![]() |
a908cec280 | ||
![]() |
aab478e378 | ||
![]() |
67bf46ccb6 | ||
![]() |
36ccdd287c | ||
![]() |
d499c291b9 | ||
![]() |
7835da2ea8 | ||
![]() |
2b77ca4322 | ||
![]() |
d801808270 | ||
![]() |
3f629ba7d2 | ||
![]() |
e34ffcbaa6 | ||
![]() |
047bdda088 | ||
![]() |
777f357cec | ||
![]() |
599d1c9c91 | ||
![]() |
37dae02a1b | ||
![]() |
441023a336 | ||
![]() |
56d7d42836 | ||
![]() |
59b90d3896 | ||
![]() |
4283ea5e67 | ||
![]() |
32fa8cf5fd | ||
![]() |
412df7c6f6 | ||
![]() |
e275ebba87 | ||
![]() |
c38a2533e1 | ||
![]() |
bb6f56bfa6 | ||
![]() |
82ae611c81 | ||
![]() |
64e537e77d | ||
![]() |
245855c2ab | ||
![]() |
186136cc86 | ||
![]() |
0295bc68ab | ||
![]() |
9da7866321 | ||
![]() |
9930430026 | ||
![]() |
e56ff204f8 | ||
![]() |
6a3374ea86 | ||
![]() |
c134e72979 | ||
![]() |
d84bd074c0 | ||
![]() |
51b4326920 | ||
![]() |
253bda68e9 | ||
![]() |
7fa558c743 | ||
![]() |
b01bf3e669 | ||
![]() |
dd4eaed4fa | ||
![]() |
ac4787e292 | ||
![]() |
88002d4b53 | ||
![]() |
f30ba7fd59 | ||
![]() |
470b212f32 | ||
![]() |
3ab45960da | ||
![]() |
870c0592fe | ||
![]() |
da2a252848 | ||
![]() |
88f73f185c | ||
![]() |
d3cef38f15 | ||
![]() |
5292e8f342 | ||
![]() |
ef637792c8 | ||
![]() |
09a2e8c084 | ||
![]() |
d3161823ad | ||
![]() |
289844099c | ||
![]() |
98a916b4c1 | ||
![]() |
69ff142596 | ||
![]() |
80fd717970 | ||
![]() |
ab083cdec8 | ||
![]() |
e16454f30c | ||
![]() |
23c13969ae | ||
![]() |
dcc3f2df63 | ||
![]() |
10f7f83ecf | ||
![]() |
b5e6eac3e3 | ||
![]() |
9df337c3c2 | ||
![]() |
d2f0e5ada7 | ||
![]() |
d3aa897b1a | ||
![]() |
0abcf401bb | ||
![]() |
560d257f5b | ||
![]() |
1a619e698a | ||
![]() |
52aea3de5a | ||
![]() |
8fa1268de2 | ||
![]() |
5a4c1282ef | ||
![]() |
3aecc53b5f | ||
![]() |
328f652e1b | ||
![]() |
52a56f5088 | ||
![]() |
5e4c64bf68 | ||
![]() |
930e9db67a | ||
![]() |
27627aa79e | ||
![]() |
ddb94e3f92 | ||
![]() |
f1f5b7028d | ||
![]() |
90959c1fc3 | ||
![]() |
3f79aa62d9 | ||
![]() |
cd1d30fc4f | ||
![]() |
3093651f89 | ||
![]() |
d969305cbe | ||
![]() |
22119dab16 | ||
![]() |
23958ffba7 | ||
![]() |
d9673501fc | ||
![]() |
f9341818da | ||
![]() |
22ab8aca3d | ||
![]() |
dd79de1321 | ||
![]() |
d8035d4245 | ||
![]() |
4642fa4da0 | ||
![]() |
58ee30aa99 | ||
![]() |
5922795587 | ||
![]() |
5eccf08690 | ||
![]() |
037d907028 | ||
![]() |
7cfdaf4b41 | ||
![]() |
e7918bddbc | ||
![]() |
6b253178b6 | ||
![]() |
87448eea31 | ||
![]() |
5e2fa1408e | ||
![]() |
809362e08c | ||
![]() |
c8831b157e | ||
![]() |
2198aebf73 | ||
![]() |
f3f8c2aea5 | ||
![]() |
83c231749d | ||
![]() |
79f3b96c1d | ||
![]() |
fb1c016704 | ||
![]() |
a3febf8b85 | ||
![]() |
254cec98ad | ||
![]() |
9a2ae6aa24 | ||
![]() |
840037aa7f | ||
![]() |
dd24f12eac | ||
![]() |
d1e767bd41 | ||
![]() |
72d3f2ea49 | ||
![]() |
5e8e620df9 | ||
![]() |
0a61887474 | ||
![]() |
2002b9db9d | ||
![]() |
e54e99d8d6 | ||
![]() |
c3a5c7afa3 | ||
![]() |
6f38081cf1 | ||
![]() |
58b35b290b | ||
![]() |
8c1086719d | ||
![]() |
4074ae197b | ||
![]() |
3381d67565 | ||
![]() |
e3c7f3de28 | ||
![]() |
70dfe3a021 | ||
![]() |
377dc3f586 | ||
![]() |
b1a4a98563 | ||
![]() |
366b1ff80b | ||
![]() |
05abb0151e | ||
![]() |
1bf52b8c1e | ||
![]() |
f0a302f7f4 | ||
![]() |
a027bfae54 | ||
![]() |
6576770fa0 | ||
![]() |
45f6b9f768 | ||
![]() |
3dc7aabb6e | ||
![]() |
0f5e18492c | ||
![]() |
2f140fd2c0 | ||
![]() |
661c5f2120 | ||
![]() |
28043e0070 | ||
![]() |
e6bf8918a3 | ||
![]() |
4737abcf58 | ||
![]() |
f7d96c108a | ||
![]() |
96017dd3bc | ||
![]() |
94fd201507 | ||
![]() |
3dbe5774d7 | ||
![]() |
0a577e64d1 | ||
![]() |
64bed2a8b3 | ||
![]() |
2b9b4282f4 | ||
![]() |
595f006f22 | ||
![]() |
0abec9c1b6 | ||
![]() |
6867c4a234 | ||
![]() |
4d2759bcd2 | ||
![]() |
982c3df1ac | ||
![]() |
3dfe2faa6b | ||
![]() |
21cffe2d35 | ||
![]() |
fa9bbaa18c | ||
![]() |
769ceb016f | ||
![]() |
51cb8762b1 | ||
![]() |
f04a97f237 | ||
![]() |
2a020f691c | ||
![]() |
5abdd35e1f | ||
![]() |
5a04e66abe | ||
![]() |
0c02c22654 | ||
![]() |
cd68d06dc3 | ||
![]() |
465e607415 | ||
![]() |
cbf6e45f64 | ||
![]() |
c95d5fd9e2 | ||
![]() |
5991fd62c1 | ||
![]() |
5384f85b5a | ||
![]() |
c33315f59c | ||
![]() |
7eaff55955 | ||
![]() |
71414b805b | ||
![]() |
50a06f640f | ||
![]() |
6cab5fbba8 | ||
![]() |
66e3f8eea5 | ||
![]() |
a26e07210f | ||
![]() |
e612a826d0 | ||
![]() |
4d2240ec6e | ||
![]() |
50fb9ccb5f | ||
![]() |
28d3f22fef | ||
![]() |
8612387e39 | ||
![]() |
7d93361839 | ||
![]() |
9c7ce468ee | ||
![]() |
1ad0e93d01 | ||
![]() |
b53cbce24a | ||
![]() |
087635f22a | ||
![]() |
0263a5f869 | ||
![]() |
b910e42668 | ||
![]() |
33b3740fca | ||
![]() |
6d1d78cb92 | ||
![]() |
d4c9c6d82b | ||
![]() |
485d2705b5 | ||
![]() |
ecd2b33dfc | ||
![]() |
c12736716d | ||
![]() |
c0bdedbae1 | ||
![]() |
2abf4f0ee6 | ||
![]() |
1fdd165d2e | ||
![]() |
55818f9cb6 | ||
![]() |
a4c670df78 | ||
![]() |
c8d558c1eb | ||
![]() |
f56b51e9e3 | ||
![]() |
2e966b674c | ||
![]() |
aa1e31a110 | ||
![]() |
79418d3b1f | ||
![]() |
76f01273d3 | ||
![]() |
ef99687187 | ||
![]() |
5d03e6ec99 | ||
![]() |
3e9165ce4a | ||
![]() |
2a7a950d63 | ||
![]() |
d3d78e48cb | ||
![]() |
791471a716 | ||
![]() |
7f7f6680b2 | ||
![]() |
128591d355 | ||
![]() |
593c2f083e | ||
![]() |
7743267501 | ||
![]() |
268f5a8ae5 | ||
![]() |
121736358b | ||
![]() |
1b0ea00c88 | ||
![]() |
4be1c19c50 | ||
![]() |
aa55849e62 | ||
![]() |
1d2093fc32 | ||
![]() |
5a5d83e5c1 | ||
![]() |
155632e85d | ||
![]() |
cac185f747 | ||
![]() |
6d0d502bd3 | ||
![]() |
ccde6fb53b | ||
![]() |
2afce9f2d9 | ||
![]() |
2647457706 | ||
![]() |
ac5e69a3b2 | ||
![]() |
45fb2a27c3 | ||
![]() |
fb3d7ae81b | ||
![]() |
9b62e8af71 | ||
![]() |
3f292b5e47 | ||
![]() |
bd2abddb09 | ||
![]() |
5135748d1d | ||
![]() |
0fc3d224ab | ||
![]() |
ac07cc34cd | ||
![]() |
3730e05f20 | ||
![]() |
2644fd813e | ||
![]() |
ece16d1075 | ||
![]() |
3b13fa84a4 | ||
![]() |
cda5ea3207 | ||
![]() |
0746616b43 | ||
![]() |
28199ab4be | ||
![]() |
b29c578adb | ||
![]() |
b42f2a0972 | ||
![]() |
040deb2bfb | ||
![]() |
ef8b4e685e | ||
![]() |
364860199c | ||
![]() |
3f2a6fd3f7 | ||
![]() |
2671cf00e0 | ||
![]() |
6a6941d01c | ||
![]() |
5b3862bc3d | ||
![]() |
0452f5ad06 | ||
![]() |
264fc995b2 | ||
![]() |
acc75acb9c | ||
![]() |
a5b1332f95 | ||
![]() |
8871a631b1 | ||
![]() |
bfb58f53f5 | ||
![]() |
d14717c88e | ||
![]() |
d8ff110d8b | ||
![]() |
23737d3b19 | ||
![]() |
b11516760b | ||
![]() |
3a7f8ce268 | ||
![]() |
7a5b2e5c6a | ||
![]() |
ead129eda9 | ||
![]() |
b7cd0aeca8 | ||
![]() |
708b45b02f | ||
![]() |
75f4342499 | ||
![]() |
24ad51ad15 | ||
![]() |
ecc3dd26db | ||
![]() |
aecee29219 | ||
![]() |
bda73dc9c1 | ||
![]() |
63d2407e4f | ||
![]() |
baf44314e9 | ||
![]() |
29ef28b6d7 | ||
![]() |
86dad52919 | ||
![]() |
6ff05656ef | ||
![]() |
71c195cafb | ||
![]() |
dda0ae2485 | ||
![]() |
69dc63c726 | ||
![]() |
ee65721da1 | ||
![]() |
8ffb91f414 | ||
![]() |
50d931b4fb | ||
![]() |
6f475b18f3 | ||
![]() |
782211d06a | ||
![]() |
4f5d7a3d54 | ||
![]() |
f26f2d6f25 | ||
![]() |
6ccbfd6443 | ||
![]() |
c896ed8238 | ||
![]() |
1879ed89df | ||
![]() |
11f99a44d3 | ||
![]() |
f8fcf2fb79 | ||
![]() |
c36a3f558a | ||
![]() |
07a88919b4 | ||
![]() |
d02cb3fefc | ||
![]() |
f05eca3a9f | ||
![]() |
ccc2441a55 | ||
![]() |
5aaa402287 | ||
![]() |
97849dfcaf | ||
![]() |
f2a899eea3 | ||
![]() |
80686c81ee | ||
![]() |
189483b2b7 | ||
![]() |
e7cc147121 | ||
![]() |
73f044c0f2 | ||
![]() |
a268893475 | ||
![]() |
c20e4d0dfa | ||
![]() |
73536b11e2 | ||
![]() |
a35695358d | ||
![]() |
7312c8c230 | ||
![]() |
04fea52956 | ||
![]() |
cd642a48b6 | ||
![]() |
89e0498224 | ||
![]() |
35f9c05cb9 | ||
![]() |
8a54f9d825 | ||
![]() |
34caa78de1 | ||
![]() |
e28fadbd68 | ||
![]() |
0930048d8b | ||
![]() |
42495e36e5 | ||
![]() |
4f36d19b00 | ||
![]() |
2f682ca53f | ||
![]() |
aa7a33496c | ||
![]() |
1f94dec089 | ||
![]() |
e57cbe3b44 | ||
![]() |
7b74f981e3 | ||
![]() |
2901cceea9 | ||
![]() |
ea4d0fe701 | ||
![]() |
02a57533f9 | ||
![]() |
99f0e9c9f6 | ||
![]() |
d1225c17b2 | ||
![]() |
2adecae9bf | ||
![]() |
c7aa0d7b0f | ||
![]() |
a69ecf3e06 | ||
![]() |
9414e7a4b8 | ||
![]() |
d9473781d3 | ||
![]() |
4952199e68 | ||
![]() |
388460993d | ||
![]() |
f21c1f0400 | ||
![]() |
4db62bbf63 | ||
![]() |
42ec634cd3 | ||
![]() |
a07de4d1e9 | ||
![]() |
0361a88856 | ||
![]() |
a88f248b75 | ||
![]() |
82f06d0b46 | ||
![]() |
10e019a1dd | ||
![]() |
173e26c054 | ||
![]() |
24f8d26b2d | ||
![]() |
8ceb8ebbe7 | ||
![]() |
71c583d359 | ||
![]() |
9d4e8f4bda | ||
![]() |
65d2a88591 |
123
README.md
@@ -2,73 +2,166 @@
|
||||
|
||||
This project is a new fork and is recruiting development help. If you are able to help out please contact us.
|
||||
|
||||
Jackett works as a proxy server: it translates queries from apps (Sonarr, SickRage, CouchPotato, Mylar, etc) into tracker-site-specific http queries, parses the html response, then sends results back to the requesting software. This allows for getting recent uploads (like RSS) and performing searches. Jackett is a single repository of maintained indexer scraping & translation logic - removing the burden from other apps.
|
||||
Jackett works as a proxy server: it translates queries from apps (Sonarr, SickRage, CouchPotato, Mylar, etc) into tracker-site-specific http queries, parses the html response, then sends results back to the requesting software. This allows for getting recent uploads (like RSS) and performing searches. Jackett is a single repository of maintained indexer scraping & translation logic - removing the burden from other apps.
|
||||
|
||||
Developer note: The software implements the [Torznab](https://github.com/Sonarr/Sonarr/wiki/Implementing-a-Torznab-indexer) (with [nZEDb](https://github.com/nZEDb/nZEDb/blob/master/docs/newznab_api_specification.txt) category numbering) and [TorrentPotato](https://github.com/RuudBurger/CouchPotatoServer/wiki/Couchpotato-torrent-provider) APIs.
|
||||
Developer note: The software implements the [Torznab](https://github.com/Sonarr/Sonarr/wiki/Implementing-a-Torznab-indexer) (with [nZEDb](https://github.com/nZEDb/nZEDb/blob/dev/docs/newznab_api_specification.txt) category numbering) and [TorrentPotato](https://github.com/RuudBurger/CouchPotatoServer/wiki/Couchpotato-torrent-provider) APIs.
|
||||
|
||||
|
||||
|
||||
#### Supported Systems
|
||||
* Windows using .NET 4.5
|
||||
* Linux and OSX using Mono 4 (v3 should work but you may experience crashes).
|
||||
* Linux and OSX using Mono 4 (With v3 you'll experience crashes).
|
||||
|
||||
|
||||
#### Supported Private Trackers
|
||||
* 7tor
|
||||
* Abnormal
|
||||
* AlphaRatio
|
||||
* AlphaReign
|
||||
* Andraste
|
||||
* AnimeBytes
|
||||
* AnimeTorrents
|
||||
* AOX
|
||||
* Apollo (XANAX)
|
||||
* Avistaz
|
||||
* BakaBT
|
||||
* bB
|
||||
* Best Friends
|
||||
* BeyondHD
|
||||
* Bit-City Reloaded
|
||||
* BIT-HDTV
|
||||
* BitHQ
|
||||
* BitHUmen
|
||||
* BitMeTV
|
||||
* BitSoup
|
||||
* BlueTigers
|
||||
* Bitspyder
|
||||
* Blu-bits
|
||||
* BTN
|
||||
* CHDBits
|
||||
* CinemaZ
|
||||
* DanishBits
|
||||
* DataScene
|
||||
* Demonoid
|
||||
* EuTorrents
|
||||
* DigitalHive
|
||||
* EoT-Forum
|
||||
* eStone
|
||||
* Ethor.net (Thor's Land)
|
||||
* FANO.IN
|
||||
* FileList
|
||||
* Fnt
|
||||
* French-ADN
|
||||
* Freedom-HD
|
||||
* Freshon
|
||||
* FunFile
|
||||
* FunkyTorrents
|
||||
* Fuzer
|
||||
* Ghost City
|
||||
* GODS
|
||||
* Gormogon
|
||||
* Hardbay
|
||||
* HD4Free
|
||||
* HD-Space
|
||||
* HD-Torrents
|
||||
* HDClub
|
||||
* HDSky
|
||||
* Hebits
|
||||
* Hyperay
|
||||
* Hounddawgs
|
||||
* House-of-Torrents
|
||||
* ICE Torrent
|
||||
* ILoveTorrents
|
||||
* Immortalseed
|
||||
* Infinity-T
|
||||
* IPTorrents
|
||||
* M-Team - TP
|
||||
* MoreThanTV
|
||||
* MyAnonamouse
|
||||
* myAmity
|
||||
* MySpleen
|
||||
* Nachtwerk
|
||||
* NCore
|
||||
* NetHD
|
||||
* New Real World
|
||||
* NextGen
|
||||
* Norbits
|
||||
* nostream
|
||||
* notwhat.cd
|
||||
* PassTheHeadphones
|
||||
* PassThePopcorn
|
||||
* PirateTheNet
|
||||
* Pretome
|
||||
* PrivateHD
|
||||
* QcTorrent
|
||||
* RapideTracker
|
||||
* RevolutionTT
|
||||
* Rockhard Lossless
|
||||
* RuTracker
|
||||
* SceneAccess
|
||||
* SceneFZ
|
||||
* SceneTime
|
||||
* SDBits
|
||||
* Secret Cinema
|
||||
* Shareisland
|
||||
* ShareSpaceDB
|
||||
* Shazbat
|
||||
* Shellife
|
||||
* SpeedCD
|
||||
* Superbits
|
||||
* The Horror Charnel
|
||||
* The New Retro
|
||||
* The Shinning
|
||||
* TehConnection
|
||||
* TenYardTracker
|
||||
* Torrent Network
|
||||
* Torrent Sector Crew
|
||||
* TorrentBD
|
||||
* TorrentBytes
|
||||
* TorrentDay
|
||||
* TorrentHeaven
|
||||
* Torrenting
|
||||
* TorrentLeech
|
||||
* Torrents.Md
|
||||
* TorrentShack
|
||||
* Torrent-Syndikat
|
||||
* ToTheGlory
|
||||
* TranceTraffic
|
||||
* TransmitheNet
|
||||
* TV Chaos UK
|
||||
* TV-Vault
|
||||
* u-Torrent
|
||||
* UHDBits
|
||||
* World-In-HD
|
||||
* WorldOfP2P
|
||||
* x264
|
||||
* XSpeeds
|
||||
* Xthor
|
||||
* Xtreme Zone
|
||||
|
||||
#### Installation on Windows
|
||||
|
||||
We recommend you install Jackett as a Windows service using the supplied installer. When installed as a service the tray icon acts as a way to open/start/stop Jackett. If you opted to not install it as a service then Jackett will run its web server from the tray tool.
|
||||
We recommend you install Jackett as a Windows service using the supplied installer. You may also download the zipped version if you would like to configure everything manually.
|
||||
|
||||
Jackett can also be run from the command line using JackettConsole.exe if you would like to see log messages (Ensure the server isn't already running from the tray/service).
|
||||
To get started with using the installer for Jackett, follow the steps below:
|
||||
|
||||
1. Download the latest version of the Windows installer, "Jackett.Installer.Windows.exe" from the [releases](https://github.com/Jackett/Jackett/releases/latest) page.
|
||||
2. When prompted if you would like this app to make changes to your computer, select "yes".
|
||||
3. If you would like to install Jackett as a Windows Service, make sure the "Install as Windows Service" checkbox is filled.
|
||||
4. Once the installation has finished, check the "Launch Jackett" box to get started.
|
||||
5. Navigate your web browser to: http://127.0.0.1:9117
|
||||
6. You're now ready to begin adding your trackers and using Jackett.
|
||||
|
||||
When installed as a service the tray icon acts as a way to open/start/stop Jackett. If you opted to not install it as a service then Jackett will run its web server from the tray tool.
|
||||
|
||||
Jackett can also be run from the command line if you would like to see log messages (Ensure the server isn't already running from the tray/service). This can be done by using "JackettConsole.exe" (for Command Prompt), found in the Jackett data folder: "%ProgramData%\Jackett".
|
||||
|
||||
#### Installation on Linux/OSX
|
||||
1. Install [Mono 4](http://www.mono-project.com/download/) or better
|
||||
* Follow the instructions on the mono website and install the `mono-devel` package.
|
||||
* On Red Hat/CentOS the `mono-locale-extras` package is also required
|
||||
2. Install libcurl:
|
||||
* Debian/Ubunutu: apt-get install libcurl-dev
|
||||
* Redhat/Fedora: yum install libcurl-devel
|
||||
* Debian/Ubunutu: `apt-get install libcurl-dev`
|
||||
* Redhat/Fedora: `yum install libcurl-devel`
|
||||
* For other distros see the [Curl docs](http://curl.haxx.se/dlwiz/?type=devel).
|
||||
3. Download and extract the latest ```.tar.gz``` release from the [releases page](https://github.com/Jackett/Jackett/releases) and run Jackett using mono with the command "mono JackettConsole.exe".
|
||||
|
||||
3. Download and extract the latest `Jackett.Binaries.Mono.tar.gz` release from the [releases page](https://github.com/Jackett/Jackett/releases) and run Jackett using mono with the command `mono JackettConsole.exe`.
|
||||
|
||||
Detailed instructions for [Ubuntu 14.x](http://www.htpcguides.com/install-jackett-on-ubuntu-14-x-for-custom-torrents-in-sonarr/) and [Ubuntu 15.x](http://www.htpcguides.com/install-jackett-ubuntu-15-x-for-custom-torrents-in-sonarr/)
|
||||
|
||||
#### Installation on Synology
|
||||
@@ -92,9 +185,9 @@ You can get additional logging with the switches "-t -l". Please post logs if y
|
||||
Please supply as much information about the problem you are experiencing as possible. Your issue has a much greater chance of being resolved if logs are supplied so that we can see what is going on. Creating an issue with '### isn't working' doesn't help anyone to fix the problem.
|
||||
|
||||
### Contributing
|
||||
All contributions are welcome just send a pull request. Jackett's framework allows our team (and any other volunteering dev) to implement new trackers in an hour or two. If you'd like support for a new tracker but are not a developer then feel free to leave a request on the [issues page](https://github.com/zone117x/Jackett/issues). It is recommended to use Visual studio 2015 when making code changes in this project. We currently only support private trackers.
|
||||
All contributions are welcome just send a pull request. Jackett's framework allows our team (and any other volunteering dev) to implement new trackers in an hour or two. If you'd like support for a new tracker but are not a developer then feel free to leave a request on the [issues page](https://github.com/Jackett/Jackett/issues). It is recommended to use Visual studio 2015 when making code changes in this project. We currently only support private trackers.
|
||||
|
||||
|
||||
### Screenshots
|
||||
|
||||

|
||||

|
||||
|
@@ -7,7 +7,7 @@
|
||||
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
|
||||
<dependentAssembly>
|
||||
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
|
||||
<bindingRedirect oldVersion="0.0.0.0-7.0.0.0" newVersion="7.0.0.0" />
|
||||
<bindingRedirect oldVersion="0.0.0.0-9.0.0.0" newVersion="9.0.0.0" />
|
||||
</dependentAssembly>
|
||||
<dependentAssembly>
|
||||
<assemblyIdentity name="System.Web.Http" publicKeyToken="31bf3856ad364e35" culture="neutral" />
|
||||
|
@@ -57,9 +57,12 @@ namespace Jackett.Console
|
||||
[Option('f', "SSLFix", HelpText = "[true/false] Linux Libcurl NSS Missing ECC Ciphers workaround (Use if you can't access some trackers) .")]
|
||||
public bool? SSLFix { get; set; }
|
||||
|
||||
[Option('n', "IgnoreSslErrors", HelpText = "[true/false] Linux Libcurl - Ignores invalid SSL certificates")]
|
||||
[Option('n', "IgnoreSslErrors", HelpText = "[true/false] Ignores invalid SSL certificates")]
|
||||
public bool? IgnoreSslErrors { get; set; }
|
||||
|
||||
[Option('d', "DataFolder", HelpText = "Specify the location of the data folder (Must be admin on Windows) eg. --DataFolder=\"D:\\Your Data\\Jackett\\\"")]
|
||||
public string DataFolder { get; set; }
|
||||
|
||||
[ParserState]
|
||||
public IParserState LastParserState { get; set; }
|
||||
}
|
||||
|
@@ -94,12 +94,12 @@
|
||||
<HintPath>..\packages\Microsoft.Owin.StaticFiles.3.0.1\lib\net45\Microsoft.Owin.StaticFiles.dll</HintPath>
|
||||
<Private>True</Private>
|
||||
</Reference>
|
||||
<Reference Include="Newtonsoft.Json, Version=7.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\Newtonsoft.Json.7.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
|
||||
<Reference Include="Newtonsoft.Json, Version=9.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\Newtonsoft.Json.9.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
|
||||
<Private>True</Private>
|
||||
</Reference>
|
||||
<Reference Include="NLog, Version=4.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\NLog.4.2.3\lib\net45\NLog.dll</HintPath>
|
||||
<HintPath>..\packages\NLog.4.3.7\lib\net45\NLog.dll</HintPath>
|
||||
<Private>True</Private>
|
||||
</Reference>
|
||||
<Reference Include="Owin, Version=1.0.0.0, Culture=neutral, PublicKeyToken=f0ebd12fd5e55cc5, processorArchitecture=MSIL">
|
||||
|
@@ -9,6 +9,7 @@ using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Net;
|
||||
using System.Reflection;
|
||||
using System.Text;
|
||||
using System.Text.RegularExpressions;
|
||||
@@ -96,7 +97,14 @@ namespace JackettConsole
|
||||
Startup.IgnoreSslErrors = options.IgnoreSslErrors;
|
||||
if (options.IgnoreSslErrors == true)
|
||||
{
|
||||
Engine.Logger.Info("Curl will ignore SSL certificate errors.");
|
||||
Engine.Logger.Info("Jackett will ignore SSL certificate errors.");
|
||||
}
|
||||
|
||||
// Choose Data Folder
|
||||
if (!string.IsNullOrWhiteSpace(options.DataFolder))
|
||||
{
|
||||
Startup.CustomDataFolder = options.DataFolder.Replace("\"", string.Empty).Replace("'", string.Empty).Replace(@"\\", @"\");
|
||||
Engine.Logger.Info("Jackett Data will be stored in: " + Startup.CustomDataFolder);
|
||||
}
|
||||
|
||||
/* ====== Actions ===== */
|
||||
|
@@ -21,7 +21,7 @@
|
||||
<package id="Microsoft.Owin.Host.SystemWeb" version="3.0.1" targetFramework="net45" />
|
||||
<package id="Microsoft.Owin.Hosting" version="3.0.1" targetFramework="net45" />
|
||||
<package id="Microsoft.Owin.StaticFiles" version="3.0.1" targetFramework="net45" />
|
||||
<package id="Newtonsoft.Json" version="7.0.1" targetFramework="net45" />
|
||||
<package id="NLog" version="4.2.3" targetFramework="net45" />
|
||||
<package id="Newtonsoft.Json" version="9.0.1" targetFramework="net45" />
|
||||
<package id="NLog" version="4.3.7" targetFramework="net45" />
|
||||
<package id="Owin" version="1.0" targetFramework="net45" />
|
||||
</packages>
|
@@ -23,7 +23,7 @@
|
||||
</dependentAssembly>
|
||||
<dependentAssembly>
|
||||
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
|
||||
<bindingRedirect oldVersion="0.0.0.0-7.0.0.0" newVersion="7.0.0.0" />
|
||||
<bindingRedirect oldVersion="0.0.0.0-9.0.0.0" newVersion="9.0.0.0" />
|
||||
</dependentAssembly>
|
||||
</assemblyBinding>
|
||||
</runtime>
|
||||
|
@@ -75,12 +75,12 @@
|
||||
<HintPath>..\packages\Microsoft.Owin.StaticFiles.3.0.1\lib\net45\Microsoft.Owin.StaticFiles.dll</HintPath>
|
||||
<Private>True</Private>
|
||||
</Reference>
|
||||
<Reference Include="Newtonsoft.Json, Version=7.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\Newtonsoft.Json.7.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
|
||||
<Reference Include="Newtonsoft.Json, Version=9.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\Newtonsoft.Json.9.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
|
||||
<Private>True</Private>
|
||||
</Reference>
|
||||
<Reference Include="NLog, Version=4.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\NLog.4.2.3\lib\net45\NLog.dll</HintPath>
|
||||
<HintPath>..\packages\NLog.4.3.7\lib\net45\NLog.dll</HintPath>
|
||||
<Private>True</Private>
|
||||
</Reference>
|
||||
<Reference Include="Owin, Version=1.0.0.0, Culture=neutral, PublicKeyToken=f0ebd12fd5e55cc5, processorArchitecture=MSIL">
|
||||
|
@@ -17,7 +17,7 @@
|
||||
<package id="Microsoft.Owin.Host.HttpListener" version="3.0.1" targetFramework="net45" />
|
||||
<package id="Microsoft.Owin.Hosting" version="3.0.1" targetFramework="net45" />
|
||||
<package id="Microsoft.Owin.StaticFiles" version="3.0.1" targetFramework="net45" />
|
||||
<package id="Newtonsoft.Json" version="7.0.1" targetFramework="net45" />
|
||||
<package id="NLog" version="4.2.3" targetFramework="net45" />
|
||||
<package id="Newtonsoft.Json" version="9.0.1" targetFramework="net45" />
|
||||
<package id="NLog" version="4.3.7" targetFramework="net45" />
|
||||
<package id="Owin" version="1.0" targetFramework="net45" />
|
||||
</packages>
|
@@ -62,12 +62,12 @@
|
||||
<HintPath>..\packages\CsQuery.1.3.4\lib\net40\CsQuery.dll</HintPath>
|
||||
<Private>True</Private>
|
||||
</Reference>
|
||||
<Reference Include="FluentAssertions, Version=4.1.1.0, Culture=neutral, PublicKeyToken=33f2691a05b67b6a, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\FluentAssertions.4.1.1\lib\net45\FluentAssertions.dll</HintPath>
|
||||
<Reference Include="FluentAssertions, Version=4.13.0.0, Culture=neutral, PublicKeyToken=33f2691a05b67b6a, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\FluentAssertions.4.13.0\lib\net45\FluentAssertions.dll</HintPath>
|
||||
<Private>True</Private>
|
||||
</Reference>
|
||||
<Reference Include="FluentAssertions.Core, Version=4.1.1.0, Culture=neutral, PublicKeyToken=33f2691a05b67b6a, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\FluentAssertions.4.1.1\lib\net45\FluentAssertions.Core.dll</HintPath>
|
||||
<Reference Include="FluentAssertions.Core, Version=4.13.0.0, Culture=neutral, PublicKeyToken=33f2691a05b67b6a, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\FluentAssertions.4.13.0\lib\net45\FluentAssertions.Core.dll</HintPath>
|
||||
<Private>True</Private>
|
||||
</Reference>
|
||||
<Reference Include="Microsoft.AspNet.Identity.Core, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
|
||||
@@ -87,12 +87,12 @@
|
||||
<HintPath>..\packages\Microsoft.Owin.Hosting.3.0.1\lib\net45\Microsoft.Owin.Hosting.dll</HintPath>
|
||||
<Private>True</Private>
|
||||
</Reference>
|
||||
<Reference Include="Newtonsoft.Json, Version=7.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\Newtonsoft.Json.7.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
|
||||
<Reference Include="Newtonsoft.Json, Version=9.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\Newtonsoft.Json.9.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
|
||||
<Private>True</Private>
|
||||
</Reference>
|
||||
<Reference Include="NLog, Version=4.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\NLog.4.2.3\lib\net45\NLog.dll</HintPath>
|
||||
<HintPath>..\packages\NLog.4.3.7\lib\net45\NLog.dll</HintPath>
|
||||
<Private>True</Private>
|
||||
</Reference>
|
||||
<Reference Include="nunit.core, Version=2.6.4.14350, Culture=neutral, PublicKeyToken=96d09a1eb7f44a77, processorArchitecture=MSIL">
|
||||
@@ -103,8 +103,8 @@
|
||||
<HintPath>..\packages\NUnitTestAdapter.2.0.0\lib\nunit.core.interfaces.dll</HintPath>
|
||||
<Private>True</Private>
|
||||
</Reference>
|
||||
<Reference Include="nunit.framework, Version=3.0.5813.39031, Culture=neutral, PublicKeyToken=2638cd05610744eb, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\NUnit.3.0.1\lib\net45\nunit.framework.dll</HintPath>
|
||||
<Reference Include="nunit.framework, Version=3.4.1.0, Culture=neutral, PublicKeyToken=2638cd05610744eb, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\NUnit.3.4.1\lib\net45\nunit.framework.dll</HintPath>
|
||||
<Private>True</Private>
|
||||
</Reference>
|
||||
<Reference Include="nunit.util, Version=2.6.4.14350, Culture=neutral, PublicKeyToken=96d09a1eb7f44a77, processorArchitecture=MSIL">
|
||||
@@ -164,6 +164,7 @@
|
||||
<Compile Include="TestIIndexerManagerServiceHelper.cs" />
|
||||
<Compile Include="TestUtil.cs" />
|
||||
<Compile Include="TestWebClient.cs" />
|
||||
<Compile Include="Util\ParseUtilTests.cs" />
|
||||
<Compile Include="Util\ServerUtilTests.cs" />
|
||||
<Compile Include="Util\TvCategoryParserTests.cs" />
|
||||
</ItemGroup>
|
||||
@@ -182,6 +183,9 @@
|
||||
<ItemGroup>
|
||||
<Folder Include="Indexers\" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<EmbeddedResource Include="Util\Invalid-RSS.xml" />
|
||||
</ItemGroup>
|
||||
<Choose>
|
||||
<When Condition="'$(VisualStudioVersion)' == '10.0' And '$(IsCodedUITest)' == 'True'">
|
||||
<ItemGroup>
|
||||
|
@@ -42,5 +42,15 @@ namespace JackettTest
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public void InitCardigannIndexers(string path)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public void SortIndexers()
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -1,4 +1,6 @@
|
||||
using Jackett.Utils.Clients;
|
||||
using Jackett.Services;
|
||||
using Jackett.Utils.Clients;
|
||||
using NLog;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
@@ -12,6 +14,13 @@ namespace JackettTest
|
||||
private Dictionary<WebRequest, Func<WebRequest, WebClientByteResult>> byteCallbacks = new Dictionary<WebRequest, Func<WebRequest, WebClientByteResult>>();
|
||||
private Dictionary<WebRequest, Func<WebRequest, WebClientStringResult>> stringCallbacks = new Dictionary<WebRequest, Func<WebRequest, WebClientStringResult>>();
|
||||
|
||||
public TestWebClient(IProcessService p, Logger l, IConfigurationService c)
|
||||
: base(p: p,
|
||||
l: l,
|
||||
c: c)
|
||||
{
|
||||
}
|
||||
|
||||
public void RegisterByteCall(WebRequest req, Func<WebRequest, WebClientByteResult> f)
|
||||
{
|
||||
byteCallbacks.Add(req, f);
|
||||
@@ -22,17 +31,17 @@ namespace JackettTest
|
||||
stringCallbacks.Add(req, f);
|
||||
}
|
||||
|
||||
public Task<WebClientByteResult> GetBytes(WebRequest request)
|
||||
override public Task<WebClientByteResult> GetBytes(WebRequest request)
|
||||
{
|
||||
return Task.FromResult< WebClientByteResult>(byteCallbacks.Where(r => r.Key.Equals(request)).First().Value.Invoke(request));
|
||||
}
|
||||
|
||||
public Task<WebClientStringResult> GetString(WebRequest request)
|
||||
override public Task<WebClientStringResult> GetString(WebRequest request)
|
||||
{
|
||||
return Task.FromResult<WebClientStringResult>(stringCallbacks.Where(r => r.Key.Equals(request)).First().Value.Invoke(request));
|
||||
}
|
||||
|
||||
public void Init()
|
||||
override public void Init()
|
||||
{
|
||||
|
||||
}
|
||||
|
20
src/Jackett.Test/Util/Invalid-RSS.xml
Normal file
@@ -0,0 +1,20 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<rss version="2.0">
|
||||
<channel>
|
||||
<title>RSS Syndicator</title>
|
||||
<link>http://somewebsite.com</link>
|
||||
<description>
|
||||
<br />
|
||||
Enjoy!<br />
|
||||
<br />
|
||||
-<br />
|
||||
<br />
|
||||
group info<br />
|
||||
<br />
|
||||
Know Your Role and Shut Your Mouth!<br />
|
||||
<br />
|
||||
we are now looking for...<br />
|
||||
<br />
|
||||
</description>
|
||||
</channel>
|
||||
</rss>
|
46
src/Jackett.Test/Util/ParseUtilTests.cs
Normal file
@@ -0,0 +1,46 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Xml.Linq;
|
||||
using System.Xml.XPath;
|
||||
using FluentAssertions;
|
||||
using Jackett.Utils;
|
||||
using NUnit.Framework;
|
||||
|
||||
namespace JackettTest.Util
|
||||
{
|
||||
[TestFixture]
|
||||
public class ParseUtilTests
|
||||
{
|
||||
private static string InvalidRssXml
|
||||
{
|
||||
get
|
||||
{
|
||||
var type = typeof(ParseUtilTests);
|
||||
using (var resourceStream = type.Assembly.GetManifestResourceStream($"{type.Namespace}.Invalid-RSS.xml"))
|
||||
using (var sr = new StreamReader(resourceStream))
|
||||
{
|
||||
return sr.ReadToEnd();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Invalid_RSS_should_parse_after_removing_invalid_chars()
|
||||
{
|
||||
var invalidRss = InvalidRssXml;
|
||||
Action parseAction = () => XDocument.Parse(invalidRss);
|
||||
parseAction.ShouldThrow<Exception>().WithMessage("'\a', hexadecimal value 0x07, is an invalid character. Line 12, position 7.");
|
||||
|
||||
var validRSs = ParseUtil.RemoveInvalidXmlChars(invalidRss);
|
||||
var rssDoc = XDocument.Parse(validRSs);
|
||||
rssDoc.Root.Should().NotBeNull();
|
||||
var description = rssDoc.Root.XPathSelectElement("//description");
|
||||
description.Value.Should().Contain("Know Your Role and Shut Your Mouth!");
|
||||
}
|
||||
}
|
||||
}
|
@@ -20,7 +20,7 @@
|
||||
</dependentAssembly>
|
||||
<dependentAssembly>
|
||||
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
|
||||
<bindingRedirect oldVersion="0.0.0.0-7.0.0.0" newVersion="7.0.0.0" />
|
||||
<bindingRedirect oldVersion="0.0.0.0-9.0.0.0" newVersion="9.0.0.0" />
|
||||
</dependentAssembly>
|
||||
<dependentAssembly>
|
||||
<assemblyIdentity name="AutoMapper" publicKeyToken="be96cd2c38ef1005" culture="neutral" />
|
||||
|
@@ -6,7 +6,7 @@
|
||||
<package id="Autofac.WebApi2.Owin" version="3.3.0" targetFramework="net45" />
|
||||
<package id="AutoMapper" version="4.1.1" targetFramework="net45" />
|
||||
<package id="CsQuery" version="1.3.4" targetFramework="net45" />
|
||||
<package id="FluentAssertions" version="4.1.1" targetFramework="net45" />
|
||||
<package id="FluentAssertions" version="4.13.0" targetFramework="net45" />
|
||||
<package id="Microsoft.AspNet.Identity.Core" version="2.2.1" targetFramework="net45" />
|
||||
<package id="Microsoft.AspNet.WebApi.Client" version="5.2.3" targetFramework="net45" />
|
||||
<package id="Microsoft.AspNet.WebApi.Core" version="5.2.3" targetFramework="net45" />
|
||||
@@ -18,9 +18,9 @@
|
||||
<package id="Microsoft.Owin" version="3.0.1" targetFramework="net45" />
|
||||
<package id="Microsoft.Owin.Host.HttpListener" version="3.0.1" targetFramework="net45" />
|
||||
<package id="Microsoft.Owin.Hosting" version="3.0.1" targetFramework="net45" />
|
||||
<package id="Newtonsoft.Json" version="7.0.1" targetFramework="net45" />
|
||||
<package id="NLog" version="4.2.3" targetFramework="net45" />
|
||||
<package id="NUnit" version="3.0.1" targetFramework="net45" />
|
||||
<package id="Newtonsoft.Json" version="9.0.1" targetFramework="net45" />
|
||||
<package id="NLog" version="4.3.7" targetFramework="net45" />
|
||||
<package id="NUnit" version="3.4.1" targetFramework="net45" />
|
||||
<package id="NUnitTestAdapter" version="2.0.0" targetFramework="net45" />
|
||||
<package id="Owin" version="1.0" targetFramework="net45" />
|
||||
</packages>
|
@@ -23,7 +23,7 @@
|
||||
</dependentAssembly>
|
||||
<dependentAssembly>
|
||||
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
|
||||
<bindingRedirect oldVersion="0.0.0.0-7.0.0.0" newVersion="7.0.0.0" />
|
||||
<bindingRedirect oldVersion="0.0.0.0-9.0.0.0" newVersion="9.0.0.0" />
|
||||
</dependentAssembly>
|
||||
<dependentAssembly>
|
||||
<assemblyIdentity name="AutoMapper" publicKeyToken="be96cd2c38ef1005" culture="neutral" />
|
||||
|
@@ -79,12 +79,12 @@
|
||||
<HintPath>..\packages\Microsoft.Owin.StaticFiles.3.0.1\lib\net45\Microsoft.Owin.StaticFiles.dll</HintPath>
|
||||
<Private>True</Private>
|
||||
</Reference>
|
||||
<Reference Include="Newtonsoft.Json, Version=7.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\Newtonsoft.Json.7.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
|
||||
<Reference Include="Newtonsoft.Json, Version=9.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\Newtonsoft.Json.9.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
|
||||
<Private>True</Private>
|
||||
</Reference>
|
||||
<Reference Include="NLog, Version=4.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\NLog.4.2.3\lib\net45\NLog.dll</HintPath>
|
||||
<HintPath>..\packages\NLog.4.3.7\lib\net45\NLog.dll</HintPath>
|
||||
<Private>True</Private>
|
||||
</Reference>
|
||||
<Reference Include="Owin, Version=1.0.0.0, Culture=neutral, PublicKeyToken=f0ebd12fd5e55cc5, processorArchitecture=MSIL">
|
||||
|
@@ -18,7 +18,7 @@
|
||||
<package id="Microsoft.Owin.Host.HttpListener" version="3.0.1" targetFramework="net45" />
|
||||
<package id="Microsoft.Owin.Hosting" version="3.0.1" targetFramework="net45" />
|
||||
<package id="Microsoft.Owin.StaticFiles" version="3.0.1" targetFramework="net45" />
|
||||
<package id="Newtonsoft.Json" version="7.0.1" targetFramework="net45" />
|
||||
<package id="NLog" version="4.2.3" targetFramework="net45" />
|
||||
<package id="Newtonsoft.Json" version="9.0.1" targetFramework="net45" />
|
||||
<package id="NLog" version="4.3.7" targetFramework="net45" />
|
||||
<package id="Owin" version="1.0" targetFramework="net45" />
|
||||
</packages>
|
@@ -23,7 +23,7 @@
|
||||
</dependentAssembly>
|
||||
<dependentAssembly>
|
||||
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
|
||||
<bindingRedirect oldVersion="0.0.0.0-7.0.0.0" newVersion="7.0.0.0" />
|
||||
<bindingRedirect oldVersion="0.0.0.0-9.0.0.0" newVersion="9.0.0.0" />
|
||||
</dependentAssembly>
|
||||
</assemblyBinding>
|
||||
</runtime>
|
||||
|
@@ -39,12 +39,16 @@
|
||||
<ApplicationIcon>jackett.ico</ApplicationIcon>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="Autofac, Version=3.5.0.0, Culture=neutral, PublicKeyToken=17863af14b0044da, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\Autofac.3.5.2\lib\net40\Autofac.dll</HintPath>
|
||||
<Private>True</Private>
|
||||
</Reference>
|
||||
<Reference Include="CommandLine, Version=1.9.71.2, Culture=neutral, PublicKeyToken=de6f01bd326f8c32, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\CommandLineParser.1.9.71\lib\net45\CommandLine.dll</HintPath>
|
||||
<Private>True</Private>
|
||||
</Reference>
|
||||
<Reference Include="NLog, Version=4.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\NLog.4.2.3\lib\net45\NLog.dll</HintPath>
|
||||
<HintPath>..\packages\NLog.4.3.7\lib\net45\NLog.dll</HintPath>
|
||||
<Private>True</Private>
|
||||
</Reference>
|
||||
<Reference Include="System" />
|
||||
|
@@ -1,149 +1,176 @@
|
||||
using CommandLine;
|
||||
using Jackett.Services;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
using System.Text;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Jackett.Updater
|
||||
{
|
||||
class Program
|
||||
{
|
||||
static void Main(string[] args)
|
||||
{
|
||||
new Program().Run(args);
|
||||
}
|
||||
|
||||
private void Run(string[] args)
|
||||
{
|
||||
Engine.Logger.Info("Jackett Updater v" + GetCurrentVersion());
|
||||
|
||||
try {
|
||||
var options = new UpdaterConsoleOptions();
|
||||
if (Parser.Default.ParseArguments(args, options))
|
||||
{
|
||||
ProcessUpdate(options);
|
||||
}
|
||||
else
|
||||
{
|
||||
Engine.Logger.Error("Failed to process update arguments!: " + string.Join(" ", args));
|
||||
Console.ReadKey();
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Engine.Logger.Error(e, "Exception applying update!");
|
||||
}
|
||||
}
|
||||
|
||||
private string GetCurrentVersion()
|
||||
{
|
||||
var assembly = System.Reflection.Assembly.GetExecutingAssembly();
|
||||
var fvi = FileVersionInfo.GetVersionInfo(assembly.Location);
|
||||
return fvi.FileVersion;
|
||||
}
|
||||
|
||||
private void ProcessUpdate(UpdaterConsoleOptions options)
|
||||
{
|
||||
var updateLocation = GetUpdateLocation();
|
||||
if(!(updateLocation.EndsWith("\\") || updateLocation.EndsWith("/")))
|
||||
{
|
||||
updateLocation += Path.DirectorySeparatorChar;
|
||||
}
|
||||
|
||||
var isWindows = System.Environment.OSVersion.Platform != PlatformID.Unix;
|
||||
var trayRunning = false;
|
||||
var trayProcesses = Process.GetProcessesByName("JackettTray");
|
||||
if (isWindows)
|
||||
{
|
||||
if (trayProcesses.Count() > 0)
|
||||
{
|
||||
foreach (var proc in trayProcesses)
|
||||
{
|
||||
try
|
||||
{
|
||||
Engine.Logger.Info("Killing tray process " + proc.Id);
|
||||
proc.Kill();
|
||||
trayRunning = true;
|
||||
}
|
||||
catch { }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Engine.Logger.Info("Waiting for Jackett to close..");
|
||||
Thread.Sleep(2000);
|
||||
|
||||
var files = Directory.GetFiles(updateLocation, "*.*", SearchOption.AllDirectories);
|
||||
foreach(var file in files)
|
||||
{
|
||||
var fileName = Path.GetFileName(file).ToLowerInvariant();
|
||||
|
||||
if (fileName.EndsWith(".zip") ||
|
||||
fileName.EndsWith(".tar") ||
|
||||
fileName.EndsWith(".gz"))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
try {
|
||||
Engine.Logger.Info("Copying " + fileName);
|
||||
var dest = Path.Combine(options.Path, file.Substring(updateLocation.Length));
|
||||
File.Copy(file, dest, true);
|
||||
}
|
||||
catch(Exception e)
|
||||
{
|
||||
Engine.Logger.Error(e);
|
||||
}
|
||||
}
|
||||
|
||||
if (trayRunning)
|
||||
{
|
||||
var startInfo = new ProcessStartInfo()
|
||||
{
|
||||
Arguments = options.Args,
|
||||
FileName = Path.Combine(options.Path, "JackettTray.exe"),
|
||||
UseShellExecute = true
|
||||
};
|
||||
|
||||
Process.Start(startInfo);
|
||||
}
|
||||
|
||||
if(string.Equals(options.Type, "JackettService.exe", StringComparison.InvariantCultureIgnoreCase))
|
||||
{
|
||||
var serviceHelper = new ServiceConfigService(null, null);
|
||||
if (serviceHelper.ServiceExists())
|
||||
{
|
||||
serviceHelper.Start();
|
||||
}
|
||||
} else
|
||||
{
|
||||
var startInfo = new ProcessStartInfo()
|
||||
{
|
||||
Arguments = options.Args,
|
||||
FileName = Path.Combine(options.Path, "JackettConsole.exe"),
|
||||
UseShellExecute = true
|
||||
};
|
||||
|
||||
if (!isWindows)
|
||||
{
|
||||
startInfo.Arguments = startInfo.FileName + " " + startInfo.Arguments;
|
||||
startInfo.FileName = "mono";
|
||||
}
|
||||
|
||||
Engine.Logger.Info("Starting Jackett: " + startInfo.FileName + " " + startInfo.Arguments);
|
||||
Process.Start(startInfo);
|
||||
}
|
||||
}
|
||||
|
||||
private string GetUpdateLocation()
|
||||
{
|
||||
var location = new Uri(Assembly.GetEntryAssembly().GetName().CodeBase);
|
||||
return new FileInfo(location.AbsolutePath).DirectoryName;
|
||||
}
|
||||
}
|
||||
}
|
||||
using CommandLine;
|
||||
using Jackett.Services;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
using System.Text;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Jackett.Updater
|
||||
{
|
||||
class Program
|
||||
{
|
||||
static void Main(string[] args)
|
||||
{
|
||||
new Program().Run(args);
|
||||
}
|
||||
|
||||
private void Run(string[] args)
|
||||
{
|
||||
Engine.SetupLogging(null, "updater.txt");
|
||||
Engine.Logger.Info("Jackett Updater v" + GetCurrentVersion());
|
||||
Engine.Logger.Info("Options " + string.Join(" ", args));
|
||||
try {
|
||||
var options = new UpdaterConsoleOptions();
|
||||
if (Parser.Default.ParseArguments(args, options))
|
||||
{
|
||||
ProcessUpdate(options);
|
||||
}
|
||||
else
|
||||
{
|
||||
Engine.Logger.Error("Failed to process update arguments!: " + string.Join(" ", args));
|
||||
Console.ReadKey();
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Engine.Logger.Error(e, "Exception applying update!");
|
||||
}
|
||||
}
|
||||
|
||||
private string GetCurrentVersion()
|
||||
{
|
||||
var assembly = System.Reflection.Assembly.GetExecutingAssembly();
|
||||
var fvi = FileVersionInfo.GetVersionInfo(assembly.Location);
|
||||
return fvi.FileVersion;
|
||||
}
|
||||
|
||||
private void ProcessUpdate(UpdaterConsoleOptions options)
|
||||
{
|
||||
var updateLocation = GetUpdateLocation();
|
||||
if(!(updateLocation.EndsWith("\\") || updateLocation.EndsWith("/")))
|
||||
{
|
||||
updateLocation += Path.DirectorySeparatorChar;
|
||||
}
|
||||
|
||||
var isWindows = System.Environment.OSVersion.Platform != PlatformID.Unix;
|
||||
var trayRunning = false;
|
||||
var trayProcesses = Process.GetProcessesByName("JackettTray");
|
||||
if (isWindows)
|
||||
{
|
||||
if (trayProcesses.Count() > 0)
|
||||
{
|
||||
foreach (var proc in trayProcesses)
|
||||
{
|
||||
try
|
||||
{
|
||||
Engine.Logger.Info("Killing tray process " + proc.Id);
|
||||
proc.Kill();
|
||||
trayRunning = true;
|
||||
}
|
||||
catch { }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Engine.Logger.Info("Waiting for Jackett to close..");
|
||||
Thread.Sleep(2000);
|
||||
Engine.Logger.Info("Finding files in: " + updateLocation);
|
||||
var files = Directory.GetFiles(updateLocation, "*.*", SearchOption.AllDirectories);
|
||||
foreach(var file in files)
|
||||
{
|
||||
var fileName = Path.GetFileName(file).ToLowerInvariant();
|
||||
|
||||
if (fileName.EndsWith(".zip") ||
|
||||
fileName.EndsWith(".tar") ||
|
||||
fileName.EndsWith(".gz"))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
try {
|
||||
Engine.Logger.Info("Copying " + fileName);
|
||||
var dest = Path.Combine(options.Path, file.Substring(updateLocation.Length));
|
||||
var destDir = Path.GetDirectoryName(dest);
|
||||
if (!Directory.Exists(destDir))
|
||||
{
|
||||
Engine.Logger.Info("Creating directory " + destDir);
|
||||
Directory.CreateDirectory(destDir);
|
||||
}
|
||||
File.Copy(file, dest, true);
|
||||
}
|
||||
catch(Exception e)
|
||||
{
|
||||
Engine.Logger.Error(e);
|
||||
}
|
||||
}
|
||||
|
||||
// delete old files
|
||||
string[] oldDirs = new string[] { "Content/logos" };
|
||||
|
||||
foreach (var oldDir in oldDirs)
|
||||
{
|
||||
try
|
||||
{
|
||||
var deleteDir = Path.Combine(options.Path, oldDir);
|
||||
if (Directory.Exists(deleteDir))
|
||||
{
|
||||
Engine.Logger.Info("Deleting directory " + deleteDir);
|
||||
Directory.Delete(deleteDir, true);
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Engine.Logger.Error(e);
|
||||
}
|
||||
}
|
||||
|
||||
if (trayRunning)
|
||||
{
|
||||
var startInfo = new ProcessStartInfo()
|
||||
{
|
||||
Arguments = options.Args,
|
||||
FileName = Path.Combine(options.Path, "JackettTray.exe"),
|
||||
UseShellExecute = true
|
||||
};
|
||||
|
||||
Process.Start(startInfo);
|
||||
}
|
||||
|
||||
if(string.Equals(options.Type, "JackettService.exe", StringComparison.InvariantCultureIgnoreCase))
|
||||
{
|
||||
var serviceHelper = new ServiceConfigService(null, null);
|
||||
if (serviceHelper.ServiceExists())
|
||||
{
|
||||
serviceHelper.Start();
|
||||
}
|
||||
} else
|
||||
{
|
||||
var startInfo = new ProcessStartInfo()
|
||||
{
|
||||
Arguments = options.Args,
|
||||
FileName = Path.Combine(options.Path, "JackettConsole.exe"),
|
||||
UseShellExecute = true
|
||||
};
|
||||
|
||||
if (!isWindows)
|
||||
{
|
||||
startInfo.Arguments = startInfo.FileName + " " + startInfo.Arguments;
|
||||
startInfo.FileName = "mono";
|
||||
}
|
||||
|
||||
Engine.Logger.Info("Starting Jackett: " + startInfo.FileName + " " + startInfo.Arguments);
|
||||
Process.Start(startInfo);
|
||||
}
|
||||
}
|
||||
|
||||
private string GetUpdateLocation()
|
||||
{
|
||||
var location = new Uri(Assembly.GetEntryAssembly().GetName().CodeBase);
|
||||
return new FileInfo(location.AbsolutePath).DirectoryName;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -1,8 +1,9 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<packages>
|
||||
<package id="Autofac" version="3.5.2" targetFramework="net45" />
|
||||
<package id="CommandLineParser" version="1.9.71" targetFramework="net45" />
|
||||
<package id="Microsoft.Bcl" version="1.1.10" targetFramework="net45" />
|
||||
<package id="Microsoft.Bcl.Build" version="1.0.21" targetFramework="net45" />
|
||||
<package id="Microsoft.Net.Http" version="2.2.29" targetFramework="net45" />
|
||||
<package id="NLog" version="4.2.3" targetFramework="net45" />
|
||||
<package id="NLog" version="4.3.7" targetFramework="net45" />
|
||||
</packages>
|
@@ -9,7 +9,7 @@
|
||||
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
|
||||
<dependentAssembly>
|
||||
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
|
||||
<bindingRedirect oldVersion="0.0.0.0-7.0.0.0" newVersion="7.0.0.0" />
|
||||
<bindingRedirect oldVersion="0.0.0.0-9.0.0.0" newVersion="9.0.0.0" />
|
||||
</dependentAssembly>
|
||||
<dependentAssembly>
|
||||
<assemblyIdentity name="System.Web.Http" publicKeyToken="31bf3856ad364e35" culture="neutral" />
|
||||
|
@@ -20,69 +20,25 @@
|
||||
display: none;
|
||||
}
|
||||
|
||||
.card {
|
||||
background-color: #f9f9f9;
|
||||
border-radius: 6px;
|
||||
box-shadow: 1px 1px 5px 2px #cdcdcd;
|
||||
width: 270px;
|
||||
display: inline-block;
|
||||
vertical-align: top;
|
||||
margin: 5px;
|
||||
overflow: hidden;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
#indexers {
|
||||
text-align: center;
|
||||
margin-top: 30px;
|
||||
}
|
||||
|
||||
|
||||
#unconfigured-indexers{
|
||||
text-align: center;
|
||||
.indexer-table {
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
#unconfigured-indexers .card {
|
||||
width: 200px;
|
||||
position: relative;
|
||||
.test-success {
|
||||
color: #449d44;
|
||||
}
|
||||
|
||||
.unconfigured-indexer {
|
||||
height: 70px;
|
||||
.test-error {
|
||||
color: #c9302c;
|
||||
}
|
||||
|
||||
|
||||
|
||||
.indexer {
|
||||
height: 252px;
|
||||
}
|
||||
|
||||
.add-indexer {
|
||||
border: 0;
|
||||
}
|
||||
|
||||
.indexer-logo {
|
||||
padding-bottom: 5px;
|
||||
}
|
||||
|
||||
.indexer-logo > .hidden-name {
|
||||
position: absolute;
|
||||
color: rgba(255, 255, 255, 0);
|
||||
left: 0;
|
||||
}
|
||||
|
||||
.indexer-logo img {
|
||||
width: 100%;
|
||||
border-bottom: 1px solid #FFF;
|
||||
}
|
||||
|
||||
#unconfigured-indexers .indexer-logo img {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.indexer-name > h3 {
|
||||
margin-top: 13px;
|
||||
text-align: center;
|
||||
.test-inprogress {
|
||||
color: #286090;
|
||||
}
|
||||
|
||||
.indexer-buttons {
|
||||
@@ -94,33 +50,7 @@
|
||||
}
|
||||
|
||||
.indexer-button-test {
|
||||
width: 60px;
|
||||
}
|
||||
|
||||
.indexer-add-content {
|
||||
color: gray;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.indexer-add-content > .glyphicon {
|
||||
font-size: 50px;
|
||||
vertical-align: bottom;
|
||||
}
|
||||
|
||||
.indexer-add-content > .light-text {
|
||||
margin-top: 11px;
|
||||
font-size: 18px;
|
||||
margin-left: -5px;
|
||||
}
|
||||
|
||||
.indexer-host {
|
||||
padding-left: 5px;
|
||||
padding-right: 5px;
|
||||
}
|
||||
|
||||
.indexer-host > input {
|
||||
font-size: 12px;
|
||||
padding: 2px;
|
||||
width: 60px;
|
||||
}
|
||||
|
||||
.setup-item-inputstring {
|
||||
@@ -293,3 +223,24 @@ pre {
|
||||
width: 80px;
|
||||
}
|
||||
|
||||
.setup-item-displayinfo:empty {
|
||||
display: none;
|
||||
}
|
||||
|
||||
table td.fit{
|
||||
white-space: nowrap;
|
||||
width: 1%;
|
||||
}
|
||||
|
||||
.label-imdb {
|
||||
background-color: #d0ab44;
|
||||
}
|
||||
|
||||
.tooltip-inner {
|
||||
max-width: 500px !important;
|
||||
}
|
||||
|
||||
.tooltip-inner img {
|
||||
max-width: 250px;
|
||||
height: auto;
|
||||
}
|
@@ -1,15 +1,21 @@
|
||||
$(document).ready(function () {
|
||||
var basePath = '';
|
||||
|
||||
var indexers = [];
|
||||
var configuredIndexers = [];
|
||||
var unconfiguredIndexers = [];
|
||||
|
||||
$(document).ready(function () {
|
||||
$.ajaxSetup({ cache: false });
|
||||
window.jackettIsLocal = window.location.hostname === 'localhost' ||
|
||||
window.location.hostname === '127.0.0.1';
|
||||
|
||||
bindUIButtons();
|
||||
reloadIndexers();
|
||||
loadJackettSettings();
|
||||
|
||||
});
|
||||
|
||||
function getJackettConfig(callback) {
|
||||
var jqxhr = $.get("/admin/get_jackett_config", function (data) {
|
||||
var jqxhr = $.get("get_jackett_config", function (data) {
|
||||
|
||||
callback(data);
|
||||
}).fail(function () {
|
||||
@@ -22,6 +28,12 @@ function loadJackettSettings() {
|
||||
$("#api-key-input").val(data.config.api_key);
|
||||
$("#app-version").html(data.app_version);
|
||||
$("#jackett-port").val(data.config.port);
|
||||
$("#jackett-basepathoverride").val(data.config.basepathoverride);
|
||||
basePath = data.config.basepathoverride;
|
||||
if (basePath === null || basePath === undefined) {
|
||||
basePath = '';
|
||||
}
|
||||
|
||||
$("#jackett-savedir").val(data.config.blackholedir);
|
||||
$("#jackett-allowext").attr('checked', data.config.external);
|
||||
$("#jackett-allowupdate").attr('checked', data.config.updatedisabled);
|
||||
@@ -32,59 +44,158 @@ function loadJackettSettings() {
|
||||
if (password != null && password != '') {
|
||||
$("#logoutBtn").show();
|
||||
}
|
||||
|
||||
reloadIndexers();
|
||||
});
|
||||
}
|
||||
|
||||
function reloadIndexers() {
|
||||
$('#indexers').hide();
|
||||
$('#indexers > .indexer').remove();
|
||||
$('#unconfigured-indexers').empty();
|
||||
var jqxhr = $.get("/admin/get_indexers", function (data) {
|
||||
displayIndexers(data.items);
|
||||
var jqxhr = $.get("get_indexers", function (data) {
|
||||
indexers = data;
|
||||
configuredIndexers = [];
|
||||
unconfiguredIndexers = [];
|
||||
for (var i = 0; i < data.items.length; i++) {
|
||||
var item = data.items[i];
|
||||
item.torznab_host = resolveUrl(basePath + "/torznab/" + item.id);
|
||||
item.potato_host = resolveUrl(basePath + "/potato/" + item.id);
|
||||
|
||||
if (item.last_error)
|
||||
item.state = "error";
|
||||
else
|
||||
item.state = "success";
|
||||
|
||||
var main_cats_list = [];
|
||||
for (var catID in item.caps) {
|
||||
var cat = item.caps[catID];
|
||||
var mainCat = cat.split("/")[0];
|
||||
main_cats_list.push(mainCat);
|
||||
}
|
||||
item.mains_cats = $.unique(main_cats_list).join(", ");
|
||||
|
||||
if (item.configured)
|
||||
configuredIndexers.push(item);
|
||||
else
|
||||
unconfiguredIndexers.push(item);
|
||||
}
|
||||
displayConfiguredIndexersList(configuredIndexers);
|
||||
displayUnconfiguredIndexersList(unconfiguredIndexers);
|
||||
}).fail(function () {
|
||||
doNotify("Error loading indexers, request to Jackett server failed", "danger", "glyphicon glyphicon-alert");
|
||||
});
|
||||
}
|
||||
|
||||
function displayIndexers(items) {
|
||||
var indexerTemplate = Handlebars.compile($("#configured-indexer").html());
|
||||
var unconfiguredIndexerTemplate = Handlebars.compile($("#unconfigured-indexer").html());
|
||||
function displayConfiguredIndexersList(indexers) {
|
||||
var indexersTemplate = Handlebars.compile($("#configured-indexer-table").html());
|
||||
var indexersTable = $(indexersTemplate({ indexers: indexers, total_configured_indexers: indexers.length }));
|
||||
indexersTable.find('table').DataTable(
|
||||
{
|
||||
"pageLength": 100,
|
||||
"lengthMenu": [[10, 20, 50, 100, 200, -1], [10, 20, 50, 100, 200, "All"]],
|
||||
"order": [[0, "desc"]],
|
||||
"columnDefs": [
|
||||
{
|
||||
"targets": 0,
|
||||
"visible": true,
|
||||
"searchable": true
|
||||
},
|
||||
{
|
||||
"targets": 1,
|
||||
"visible": true,
|
||||
"searchable": false
|
||||
}
|
||||
]
|
||||
});
|
||||
|
||||
$('#indexers').empty();
|
||||
$('#indexers').append(indexersTable);
|
||||
prepareTestButtons();
|
||||
$('#indexers').fadeIn();
|
||||
prepareSearchButtons();
|
||||
prepareSetupButtons();
|
||||
prepareDeleteButtons();
|
||||
prepareCopyButtons();
|
||||
}
|
||||
|
||||
function displayUnconfiguredIndexersList(indexers) {
|
||||
var indexersTemplate = Handlebars.compile($("#unconfigured-indexer-table").html());
|
||||
var indexersTable = $(indexersTemplate({ indexers: indexers, total_unconfigured_indexers: indexers.length }));
|
||||
indexersTable.find('table').DataTable(
|
||||
{
|
||||
"pageLength": 100,
|
||||
"lengthMenu": [[10, 20, 50, 100, 200, -1], [10, 20, 50, 100, 200, "All"]],
|
||||
"order": [[0, "desc"]],
|
||||
"columnDefs": [
|
||||
{
|
||||
"targets": 0,
|
||||
"visible": true,
|
||||
"searchable": true
|
||||
},
|
||||
{
|
||||
"targets": 1,
|
||||
"visible": true,
|
||||
"searchable": true
|
||||
},
|
||||
{
|
||||
"targets": 2,
|
||||
"visible": true,
|
||||
"searchable": true
|
||||
},
|
||||
{
|
||||
"targets": 3,
|
||||
"visible": true,
|
||||
"searchable": false
|
||||
}
|
||||
]
|
||||
});
|
||||
$('#unconfigured-indexers-template').empty();
|
||||
for (var i = 0; i < items.length; i++) {
|
||||
var item = items[i];
|
||||
item.torznab_host = resolveUrl("/torznab/" + item.id);
|
||||
item.potato_host = resolveUrl("/potato/" + item.id);
|
||||
if (item.configured)
|
||||
$('#indexers').append(indexerTemplate(item));
|
||||
else
|
||||
$('#unconfigured-indexers-template').append($(unconfiguredIndexerTemplate(item)));
|
||||
$('#unconfigured-indexers-template').append(indexersTable);
|
||||
}
|
||||
|
||||
function copyToClipboard(text) {
|
||||
// create hidden text element, if it doesn't already exist
|
||||
var targetId = "_hiddenCopyText_";
|
||||
// must use a temporary form element for the selection and copy
|
||||
target = document.getElementById(targetId);
|
||||
if (!target) {
|
||||
var target = document.createElement("textarea");
|
||||
target.style.position = "absolute";
|
||||
target.style.left = "-9999px";
|
||||
target.style.top = "0";
|
||||
target.id = targetId;
|
||||
document.body.appendChild(target);
|
||||
}
|
||||
target.textContent = text;
|
||||
// select the content
|
||||
var currentFocus = document.activeElement;
|
||||
target.focus();
|
||||
target.setSelectionRange(0, target.value.length);
|
||||
|
||||
// copy the selection
|
||||
var succeed;
|
||||
try {
|
||||
succeed = document.execCommand("copy");
|
||||
} catch (e) {
|
||||
succeed = false;
|
||||
}
|
||||
// restore original focus
|
||||
if (currentFocus && typeof currentFocus.focus === "function") {
|
||||
currentFocus.focus();
|
||||
}
|
||||
|
||||
var addIndexerButton = $($('#add-indexer').html());
|
||||
addIndexerButton.appendTo($('#indexers'));
|
||||
target.textContent = "";
|
||||
|
||||
addIndexerButton.click(function () {
|
||||
$("#modals").empty();
|
||||
var dialog = $($("#select-indexer").html());
|
||||
dialog.find('#unconfigured-indexers').html($('#unconfigured-indexers-template').html());
|
||||
$("#modals").append(dialog);
|
||||
dialog.modal("show");
|
||||
$('.indexer-setup').each(function (i, btn) {
|
||||
var $btn = $(btn);
|
||||
var id = $btn.data("id");
|
||||
var link = $btn.data("link");
|
||||
$btn.click(function () {
|
||||
$('#select-indexer-modal').modal('hide').on('hidden.bs.modal', function (e) {
|
||||
displayIndexerSetup(id, link);
|
||||
});
|
||||
});
|
||||
return succeed;
|
||||
}
|
||||
|
||||
function prepareCopyButtons() {
|
||||
$(".indexer-button-copy").each(function (i, btn) {
|
||||
var $btn = $(btn);
|
||||
var title = $btn[0].title;
|
||||
$btn.click(function () {
|
||||
copyToClipboard(title);
|
||||
});
|
||||
});
|
||||
|
||||
$('#indexers').fadeIn();
|
||||
prepareSetupButtons();
|
||||
prepareTestButtons();
|
||||
prepareDeleteButtons();
|
||||
}
|
||||
|
||||
function prepareDeleteButtons() {
|
||||
@@ -92,7 +203,7 @@ function prepareDeleteButtons() {
|
||||
var $btn = $(btn);
|
||||
var id = $btn.data("id");
|
||||
$btn.click(function () {
|
||||
var jqxhr = $.post("/admin/delete_indexer", JSON.stringify({ indexer: id }), function (data) {
|
||||
var jqxhr = $.post("delete_indexer", JSON.stringify({ indexer: id }), function (data) {
|
||||
if (data.result == "error") {
|
||||
doNotify("Delete error for " + id + "\n" + data.error, "danger", "glyphicon glyphicon-alert");
|
||||
}
|
||||
@@ -108,6 +219,16 @@ function prepareDeleteButtons() {
|
||||
});
|
||||
}
|
||||
|
||||
function prepareSearchButtons() {
|
||||
$('.indexer-button-search').each(function (i, btn) {
|
||||
var $btn = $(btn);
|
||||
var id = $btn.data("id");
|
||||
$btn.click(function() {
|
||||
showSearch(id);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function prepareSetupButtons() {
|
||||
$('.indexer-setup').each(function (i, btn) {
|
||||
var $btn = $(btn);
|
||||
@@ -119,35 +240,68 @@ function prepareSetupButtons() {
|
||||
});
|
||||
}
|
||||
|
||||
function updateTestState(id, state, message)
|
||||
{
|
||||
var btn = $(".indexer-button-test[data-id=" + id + "]");
|
||||
if (message) {
|
||||
btn.tooltip("hide");
|
||||
btn.data('bs.tooltip', false).tooltip({ title: message });
|
||||
}
|
||||
var icon = btn.find("span");
|
||||
icon.removeClass("glyphicon-ok test-success glyphicon-alert test-error glyphicon-refresh spinner test-inprogres");
|
||||
|
||||
if (state == "success") {
|
||||
icon.addClass("glyphicon-ok test-success");
|
||||
} else if (state == "error") {
|
||||
icon.addClass("glyphicon-alert test-error");
|
||||
} else if (state == "inprogres") {
|
||||
icon.addClass("glyphicon-refresh test-inprogres spinner");
|
||||
}
|
||||
}
|
||||
|
||||
function testIndexer(id, notifyResult) {
|
||||
updateTestState(id, "inprogres", null);
|
||||
|
||||
if (notifyResult)
|
||||
doNotify("Test started for " + id, "info", "glyphicon glyphicon-transfer");
|
||||
var jqxhr = $.post("test_indexer", JSON.stringify({ indexer: id }), function (data) {
|
||||
if (data.result == "error") {
|
||||
updateTestState(id, "error", data.error);
|
||||
if (notifyResult)
|
||||
doNotify("Test failed for " + id + ": \n" + data.error, "danger", "glyphicon glyphicon-alert");
|
||||
}
|
||||
else {
|
||||
updateTestState(id, "success", "Test successful");
|
||||
if (notifyResult)
|
||||
doNotify("Test successful for " + id, "success", "glyphicon glyphicon-ok");
|
||||
}
|
||||
}).fail(function () {
|
||||
doNotify("Error testing indexer, request to Jackett server error", "danger", "glyphicon glyphicon-alert");
|
||||
});
|
||||
}
|
||||
|
||||
function prepareTestButtons() {
|
||||
$(".indexer-button-test").each(function (i, btn) {
|
||||
var $btn = $(btn);
|
||||
var id = $btn.data("id");
|
||||
var state = $btn.data("state");
|
||||
$btn.tooltip();
|
||||
updateTestState(id, state, null);
|
||||
$btn.click(function () {
|
||||
doNotify("Test started for " + id, "info", "glyphicon glyphicon-transfer");
|
||||
var jqxhr = $.post("/admin/test_indexer", JSON.stringify({ indexer: id }), function (data) {
|
||||
if (data.result == "error") {
|
||||
doNotify("Test failed for " + id + ": \n" + data.error, "danger", "glyphicon glyphicon-alert");
|
||||
}
|
||||
else {
|
||||
doNotify("Test successful for " + id, "success", "glyphicon glyphicon-ok");
|
||||
}
|
||||
}).fail(function () {
|
||||
doNotify("Error testing indexer, request to Jackett server error", "danger", "glyphicon glyphicon-alert");
|
||||
});
|
||||
testIndexer(id, true);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function displayIndexerSetup(id, link) {
|
||||
|
||||
var jqxhr = $.post("/admin/get_config_form", JSON.stringify({ indexer: id }), function (data) {
|
||||
var jqxhr = $.post("get_config_form", JSON.stringify({ indexer: id }), function (data) {
|
||||
if (data.result == "error") {
|
||||
doNotify("Error: " + data.error, "danger", "glyphicon glyphicon-alert");
|
||||
return;
|
||||
}
|
||||
|
||||
populateSetupForm(id, data.name, data.config, data.caps, link);
|
||||
populateSetupForm(id, data.name, data.config, data.caps, link, data.alternativesitelinks);
|
||||
|
||||
}).fail(function () {
|
||||
doNotify("Request to Jackett server failed", "danger", "glyphicon glyphicon-alert");
|
||||
@@ -190,19 +344,52 @@ function populateConfigItems(configForm, config) {
|
||||
var template = setupItemTemplate(item);
|
||||
$formItemContainer.append(template);
|
||||
if (item.type === 'recaptcha') {
|
||||
grecaptcha.render($('.jackettrecaptcha')[0], {
|
||||
'sitekey': item.sitekey
|
||||
});
|
||||
var jackettrecaptcha = $('.jackettrecaptcha');
|
||||
jackettrecaptcha.data("version", item.version);
|
||||
switch (item.version) {
|
||||
case "1":
|
||||
// The v1 reCAPTCHA code uses document.write() calls to write the CAPTCHA to the location where the script was loaded.
|
||||
// As it's loaded async this doesn't work.
|
||||
// We use an iframe to work around this problem.
|
||||
var html = '<script type="text/javascript" src="https://www.google.com/recaptcha/api/challenge?k='+encodeURIComponent(item.sitekey)+'"></script>';
|
||||
var frame = document.createElement('iframe');
|
||||
frame.id = "jackettrecaptchaiframe";
|
||||
frame.style.height = "145px";
|
||||
frame.style.weight = "326px";
|
||||
frame.style.border = "none";
|
||||
frame.onload = function () {
|
||||
// auto resize iframe to content
|
||||
frame.style.height = frame.contentWindow.document.body.scrollHeight + 'px';
|
||||
frame.style.width = frame.contentWindow.document.body.scrollWidth + 'px';
|
||||
}
|
||||
jackettrecaptcha.append(frame);
|
||||
frame.contentDocument.open();
|
||||
frame.contentDocument.write(html);
|
||||
frame.contentDocument.close();
|
||||
break;
|
||||
case "2":
|
||||
grecaptcha.render(jackettrecaptcha[0], {
|
||||
'sitekey': item.sitekey
|
||||
});
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function newConfigModal(title, config, caps, link) {
|
||||
function newConfigModal(title, config, caps, link, alternativesitelinks) {
|
||||
var configTemplate = Handlebars.compile($("#jackett-config-setup-modal").html());
|
||||
var configForm = $(configTemplate({ title: title, caps: caps, link:link }));
|
||||
$("#modals").append(configForm);
|
||||
populateConfigItems(configForm, config);
|
||||
|
||||
if (alternativesitelinks.length >= 1) {
|
||||
var AlternativeSiteLinksTemplate = Handlebars.compile($("#setup-item-alternativesitelinks").html());
|
||||
var template = $(AlternativeSiteLinksTemplate({ "alternativesitelinks": alternativesitelinks }));
|
||||
configForm.find("div[data-id='sitelink']").after(template);
|
||||
}
|
||||
|
||||
return configForm;
|
||||
}
|
||||
|
||||
@@ -225,7 +412,18 @@ function getConfigModalJson(configForm) {
|
||||
break;
|
||||
case "recaptcha":
|
||||
if (window.jackettIsLocal) {
|
||||
itemEntry.value = $('.g-recaptcha-response').val();
|
||||
var version = $el.find('.jackettrecaptcha').data("version");
|
||||
switch (version) {
|
||||
case "1":
|
||||
var frameDoc = $("#jackettrecaptchaiframe")[0].contentDocument;
|
||||
itemEntry.version = version;
|
||||
itemEntry.challenge = $("#recaptcha_challenge_field", frameDoc).val()
|
||||
itemEntry.value = $("#recaptcha_response_field", frameDoc).val()
|
||||
break;
|
||||
case "2":
|
||||
itemEntry.value = $('.g-recaptcha-response').val();
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
itemEntry.cookie = $el.find(".setup-item-recaptcha input").val();
|
||||
}
|
||||
@@ -236,8 +434,8 @@ function getConfigModalJson(configForm) {
|
||||
return configJson;
|
||||
}
|
||||
|
||||
function populateSetupForm(indexerId, name, config, caps, link) {
|
||||
var configForm = newConfigModal(name, config, caps, link);
|
||||
function populateSetupForm(indexerId, name, config, caps, link, alternativesitelinks) {
|
||||
var configForm = newConfigModal(name, config, caps, link, alternativesitelinks);
|
||||
var $goButton = configForm.find(".setup-indexer-go");
|
||||
$goButton.click(function () {
|
||||
var data = { indexer: indexerId, name: name };
|
||||
@@ -247,7 +445,7 @@ function populateSetupForm(indexerId, name, config, caps, link) {
|
||||
$goButton.prop('disabled', true);
|
||||
$goButton.html($('#spinner').html());
|
||||
|
||||
var jqxhr = $.post("/admin/configure_indexer", JSON.stringify(data), function (data) {
|
||||
var jqxhr = $.post("configure_indexer", JSON.stringify(data), function (data) {
|
||||
if (data.result == "error") {
|
||||
if (data.config) {
|
||||
populateConfigItems(configForm, data.config);
|
||||
@@ -298,6 +496,188 @@ function clearNotifications() {
|
||||
$('[data-notify="container"]').remove();
|
||||
}
|
||||
|
||||
function updateReleasesRow(row)
|
||||
{
|
||||
var labels = $(row).find("span.release-labels");
|
||||
var TitleLink = $(row).find("td.Title > a");
|
||||
var IMDBId = $(row).data("imdb");
|
||||
var Banner = $(row).data("banner");
|
||||
var Description = $(row).data("description");
|
||||
var DownloadVolumeFactor = parseFloat($(row).find("td.DownloadVolumeFactor").html());
|
||||
var UploadVolumeFactor = parseFloat($(row).find("td.UploadVolumeFactor").html());
|
||||
|
||||
var TitleTooltip = "";
|
||||
if (Banner)
|
||||
TitleTooltip += "<img src='" + Banner + "' /><br />";
|
||||
if (Description)
|
||||
TitleTooltip += Description;
|
||||
|
||||
if (TitleTooltip) {
|
||||
TitleLink.data("toggle", "tooltip");
|
||||
TitleLink.tooltip({
|
||||
title: TitleTooltip,
|
||||
html: true
|
||||
});
|
||||
}
|
||||
|
||||
labels.empty();
|
||||
|
||||
if (IMDBId) {
|
||||
labels.append('\n<a href="http://www.imdb.com/title/tt' + IMDBId + '/" class="label label-imdb" alt="IMDB" title="IMDB">IMDB</a>');
|
||||
}
|
||||
|
||||
if (!isNaN(DownloadVolumeFactor)) {
|
||||
if (DownloadVolumeFactor == 0) {
|
||||
labels.append('\n<span class="label label-success">FREELEECH</span>');
|
||||
} else if (DownloadVolumeFactor < 1) {
|
||||
labels.append('\n<span class="label label-primary">' + DownloadVolumeFactor * 100 + '%DL</span>');
|
||||
} else if (DownloadVolumeFactor > 1) {
|
||||
labels.append('\n<span class="label label-danger">' + DownloadVolumeFactor * 100 + '%DL</span>');
|
||||
}
|
||||
}
|
||||
|
||||
if (!isNaN(UploadVolumeFactor)) {
|
||||
if (UploadVolumeFactor == 0) {
|
||||
labels.append('\n<span class="label label-warning">NO UPLOAD</span>');
|
||||
} else if (UploadVolumeFactor != 1) {
|
||||
labels.append('\n<span class="label label-info">' + UploadVolumeFactor * 100 + '%UL</span>');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function showSearch(selectedIndexer) {
|
||||
$('#select-indexer-modal').remove();
|
||||
var releaseTemplate = Handlebars.compile($("#jackett-search").html());
|
||||
var releaseDialog = $(releaseTemplate({
|
||||
indexers: configuredIndexers
|
||||
}));
|
||||
|
||||
$("#modals").append(releaseDialog);
|
||||
|
||||
releaseDialog.on('shown.bs.modal', function () {
|
||||
releaseDialog.find('#searchquery').focus();
|
||||
});
|
||||
|
||||
var setCategories = function (tracker, items) {
|
||||
var cats = {};
|
||||
for (var i = 0; i < items.length; i++) {
|
||||
if (items[i].configured === true && (items[i].id === tracker || tracker === '')) {
|
||||
indexers["'" + items[i].id + "'"] = items[i].name;
|
||||
for (var prop in items[i].caps) {
|
||||
cats[prop] = items[i].caps[prop];
|
||||
}
|
||||
}
|
||||
}
|
||||
var select = $('#searchCategory');
|
||||
select.html("<option value=''>-- All --</option>");
|
||||
$.each(cats, function (value, key) {
|
||||
select.append($("<option></option>")
|
||||
.attr("value", value).text(key + ' (' + value + ')'));
|
||||
});
|
||||
};
|
||||
|
||||
$('#searchTracker').change(jQuery.proxy(function () {
|
||||
var trackerId = $('#searchTracker').val();
|
||||
setCategories(trackerId, this.items);
|
||||
}, { items: configuredIndexers }));
|
||||
|
||||
document.getElementById("searchquery")
|
||||
.addEventListener("keyup", function (event) {
|
||||
event.preventDefault();
|
||||
if (event.keyCode == 13) {
|
||||
document.getElementById("jackett-search-perform").click();
|
||||
}
|
||||
});
|
||||
|
||||
$('#jackett-search-perform').click(function () {
|
||||
if ($('#jackett-search-perform').text().trim() !== 'Search trackers') {
|
||||
// We are searchin already
|
||||
return;
|
||||
}
|
||||
var queryObj = {
|
||||
Query: releaseDialog.find('#searchquery').val(),
|
||||
Category: releaseDialog.find('#searchCategory').val(),
|
||||
Tracker: releaseDialog.find('#searchTracker').val().replace("'", "").replace("'", ""),
|
||||
};
|
||||
$('#searchResults').empty();
|
||||
|
||||
$('#jackett-search-perform').html($('#spinner').html());
|
||||
var jqxhr = $.post("search", queryObj, function (data) {
|
||||
$('#jackett-search-perform').html('Search trackers');
|
||||
var resultsTemplate = Handlebars.compile($("#jackett-search-results").html());
|
||||
var results = $('#searchResults');
|
||||
results.html($(resultsTemplate(data)));
|
||||
results.find('tr.jackett-search-results-row').each(function () { updateReleasesRow(this); });
|
||||
|
||||
results.find('table').DataTable(
|
||||
{
|
||||
"pageLength": 20,
|
||||
"lengthMenu": [[10, 20, 50, -1], [10, 20, 50, "All"]],
|
||||
"order": [[0, "desc"]],
|
||||
"columnDefs": [
|
||||
{
|
||||
"targets": 0,
|
||||
"visible": false,
|
||||
"searchable": false,
|
||||
"type": 'date'
|
||||
},
|
||||
{
|
||||
"targets": 1,
|
||||
"visible": true,
|
||||
"searchable": false,
|
||||
"iDataSort": 0
|
||||
},
|
||||
{
|
||||
"targets": 4,
|
||||
"visible": false,
|
||||
"searchable": false,
|
||||
"type": 'num'
|
||||
},
|
||||
{
|
||||
"targets": 5,
|
||||
"visible": true,
|
||||
"searchable": false,
|
||||
"iDataSort": 4
|
||||
}
|
||||
],
|
||||
initComplete: function () {
|
||||
var count = 0;
|
||||
this.api().columns().every(function () {
|
||||
count++;
|
||||
if (count === 3 || count === 8) {
|
||||
var column = this;
|
||||
var select = $('<select><option value=""></option></select>')
|
||||
.appendTo($(column.footer()).empty())
|
||||
.on('change', function () {
|
||||
var val = $.fn.dataTable.util.escapeRegex(
|
||||
$(this).val()
|
||||
);
|
||||
|
||||
column
|
||||
.search(val ? '^' + val + '$' : '', true, false)
|
||||
.draw();
|
||||
});
|
||||
|
||||
column.data().unique().sort().each(function (d, j) {
|
||||
select.append('<option value="' + d + '">' + d + '</option>')
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
}).fail(function () {
|
||||
$('#jackett-search-perform').html('Search trackers');
|
||||
doNotify("Request to Jackett server failed", "danger", "glyphicon glyphicon-alert");
|
||||
});
|
||||
});
|
||||
|
||||
var searchTracker = releaseDialog.find("#searchTracker");
|
||||
if (selectedIndexer)
|
||||
searchTracker.val(selectedIndexer);
|
||||
searchTracker.trigger("change");
|
||||
releaseDialog.modal("show");
|
||||
}
|
||||
|
||||
function bindUIButtons() {
|
||||
$('body').on('click', '.downloadlink', function (e, b) {
|
||||
@@ -320,11 +700,38 @@ function bindUIButtons() {
|
||||
return false;
|
||||
});
|
||||
|
||||
$('#jackett-add-indexer').click(function () {
|
||||
$("#modals").empty();
|
||||
var dialog = $($("#select-indexer").html());
|
||||
dialog.find('#unconfigured-indexers').html($('#unconfigured-indexers-template').html());
|
||||
$("#modals").append(dialog);
|
||||
dialog.modal("show");
|
||||
$('.indexer-setup').each(function (i, btn) {
|
||||
var $btn = $(btn);
|
||||
var id = $btn.data("id");
|
||||
var link = $btn.data("link");
|
||||
$btn.click(function () {
|
||||
$('#select-indexer-modal').modal('hide').on('hidden.bs.modal', function (e) {
|
||||
displayIndexerSetup(id, link);
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
$("#jackett-test-all").click(function () {
|
||||
$(".indexer-button-test").each(function (i, btn) {
|
||||
var $btn = $(btn);
|
||||
var id = $btn.data("id");
|
||||
testIndexer(id, false);
|
||||
});
|
||||
});
|
||||
|
||||
$("#jackett-show-releases").click(function () {
|
||||
var jqxhr = $.get("/admin/GetCache", function (data) {
|
||||
var jqxhr = $.get("GetCache", function (data) {
|
||||
var releaseTemplate = Handlebars.compile($("#jackett-releases").html());
|
||||
var item = { releases: data, Title: 'Releases' };
|
||||
var releaseDialog = $(releaseTemplate(item));
|
||||
releaseDialog.find('tr.jackett-releases-row').each(function () { updateReleasesRow(this); });
|
||||
releaseDialog.find('table').DataTable(
|
||||
{
|
||||
"pageLength": 20,
|
||||
@@ -372,7 +779,7 @@ function bindUIButtons() {
|
||||
var count = 0;
|
||||
this.api().columns().every(function () {
|
||||
count++;
|
||||
if (count === 5 || count === 9) {
|
||||
if (count === 5 || count === 10) {
|
||||
var column = this;
|
||||
var select = $('<select><option value=""></option></select>')
|
||||
.appendTo($(column.footer()).empty())
|
||||
@@ -402,139 +809,11 @@ function bindUIButtons() {
|
||||
});
|
||||
|
||||
$("#jackett-show-search").click(function () {
|
||||
$('#select-indexer-modal').remove();
|
||||
var jqxhr = $.get("/admin/get_indexers", function (data) {
|
||||
var scope = {
|
||||
items: data.items
|
||||
};
|
||||
|
||||
var indexers = [];
|
||||
indexers.push({ id: '', name: '-- All --' });
|
||||
for (var i = 0; i < data.items.length; i++) {
|
||||
if (data.items[i].configured === true) {
|
||||
indexers.push(data.items[i]);
|
||||
}
|
||||
}
|
||||
|
||||
var releaseTemplate = Handlebars.compile($("#jackett-search").html());
|
||||
var releaseDialog = $(releaseTemplate({ indexers: indexers }));
|
||||
$("#modals").append(releaseDialog);
|
||||
releaseDialog.modal("show");
|
||||
|
||||
var setCategories = function (tracker, items) {
|
||||
var cats = {};
|
||||
for (var i = 0; i < items.length; i++) {
|
||||
if (items[i].configured === true && (items[i].id === tracker || tracker === '')) {
|
||||
indexers["'" + items[i].id + "'"] = items[i].name;
|
||||
for (var prop in items[i].caps) {
|
||||
cats[prop] = items[i].caps[prop];
|
||||
}
|
||||
}
|
||||
}
|
||||
var select = $('#searchCategory');
|
||||
select.html("<option value=''>-- All --</option>");
|
||||
$.each(cats, function (value, key) {
|
||||
select.append($("<option></option>")
|
||||
.attr("value", value).text(key + ' (' + value + ')'));
|
||||
});
|
||||
};
|
||||
|
||||
setCategories('', data.items);
|
||||
$('#searchTracker').change(jQuery.proxy(function () {
|
||||
var trackerId = $('#searchTracker').val();
|
||||
setCategories(trackerId, this.items);
|
||||
}, scope));
|
||||
|
||||
|
||||
$('#jackett-search-perform').click(function () {
|
||||
if ($('#jackett-search-perform').text().trim() !== 'Search trackers') {
|
||||
// We are searchin already
|
||||
return;
|
||||
}
|
||||
var queryObj = {
|
||||
Query: releaseDialog.find('#searchquery').val(),
|
||||
Category: releaseDialog.find('#searchCategory').val(),
|
||||
Tracker: releaseDialog.find('#searchTracker').val().replace("'", "").replace("'", ""),
|
||||
};
|
||||
$('#searchResults').empty();
|
||||
|
||||
$('#jackett-search-perform').html($('#spinner').html());
|
||||
var jqxhr = $.post("/admin/search", queryObj, function (data) {
|
||||
$('#jackett-search-perform').html('Search trackers');
|
||||
var resultsTemplate = Handlebars.compile($("#jackett-search-results").html());
|
||||
var results = $('#searchResults');
|
||||
results.html($(resultsTemplate(data)));
|
||||
|
||||
results.find('table').DataTable(
|
||||
{
|
||||
"pageLength": 20,
|
||||
"lengthMenu": [[10, 20, 50, -1], [10, 20, 50, "All"]],
|
||||
"order": [[0, "desc"]],
|
||||
"columnDefs": [
|
||||
{
|
||||
"targets": 0,
|
||||
"visible": false,
|
||||
"searchable": false,
|
||||
"type": 'date'
|
||||
},
|
||||
{
|
||||
"targets": 1,
|
||||
"visible": true,
|
||||
"searchable": false,
|
||||
"iDataSort": 0
|
||||
},
|
||||
{
|
||||
"targets": 4,
|
||||
"visible": false,
|
||||
"searchable": false,
|
||||
"type": 'num'
|
||||
},
|
||||
{
|
||||
"targets": 5,
|
||||
"visible": true,
|
||||
"searchable": false,
|
||||
"iDataSort": 4
|
||||
}
|
||||
],
|
||||
initComplete: function () {
|
||||
var count = 0;
|
||||
this.api().columns().every(function () {
|
||||
count++;
|
||||
if (count === 3 || count === 7) {
|
||||
var column = this;
|
||||
var select = $('<select><option value=""></option></select>')
|
||||
.appendTo($(column.footer()).empty())
|
||||
.on('change', function () {
|
||||
var val = $.fn.dataTable.util.escapeRegex(
|
||||
$(this).val()
|
||||
);
|
||||
|
||||
column
|
||||
.search(val ? '^' + val + '$' : '', true, false)
|
||||
.draw();
|
||||
});
|
||||
|
||||
column.data().unique().sort().each(function (d, j) {
|
||||
select.append('<option value="' + d + '">' + d + '</option>')
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
}).fail(function () {
|
||||
$('#jackett-search-perform').html('Search trackers');
|
||||
doNotify("Request to Jackett server failed", "danger", "glyphicon glyphicon-alert");
|
||||
});
|
||||
});
|
||||
|
||||
}).fail(function () {
|
||||
doNotify("Error loading indexers, request to Jackett server failed", "danger", "glyphicon glyphicon-alert");
|
||||
});
|
||||
showSearch(null);
|
||||
});
|
||||
|
||||
$("#view-jackett-logs").click(function () {
|
||||
var jqxhr = $.get("/admin/GetLogs", function (data) {
|
||||
var jqxhr = $.get("GetLogs", function (data) {
|
||||
var releaseTemplate = Handlebars.compile($("#jackett-logs").html());
|
||||
var item = { logs: data };
|
||||
var releaseDialog = $(releaseTemplate(item));
|
||||
@@ -548,6 +827,7 @@ function bindUIButtons() {
|
||||
|
||||
$("#change-jackett-port").click(function () {
|
||||
var jackett_port = $("#jackett-port").val();
|
||||
var jackett_basepathoverride = $("#jackett-basepathoverride").val();
|
||||
var jackett_external = $("#jackett-allowext").is(':checked');
|
||||
var jackett_update = $("#jackett-allowupdate").is(':checked');
|
||||
var jackett_prerelease = $("#jackett-prerelease").is(':checked');
|
||||
@@ -558,21 +838,17 @@ function bindUIButtons() {
|
||||
updatedisabled: jackett_update,
|
||||
prerelease: jackett_prerelease,
|
||||
blackholedir: $("#jackett-savedir").val(),
|
||||
logging: jackett_logging
|
||||
logging: jackett_logging,
|
||||
basepathoverride: jackett_basepathoverride
|
||||
};
|
||||
var jqxhr = $.post("/admin/set_config", JSON.stringify(jsonObject), function (data) {
|
||||
var jqxhr = $.post("set_config", JSON.stringify(jsonObject), function (data) {
|
||||
if (data.result == "error") {
|
||||
doNotify("Error: " + data.error, "danger", "glyphicon glyphicon-alert");
|
||||
return;
|
||||
} else {
|
||||
doNotify("Redirecting you to complete configuration update..", "success", "glyphicon glyphicon-ok");
|
||||
window.setTimeout(function () {
|
||||
url = window.location.href;
|
||||
if (data.external) {
|
||||
window.location.href = url.substr(0, url.lastIndexOf(":") + 1) + data.port;
|
||||
} else {
|
||||
window.location.href = 'http://127.0.0.1:' + data.port;
|
||||
}
|
||||
window.location.reload(true);
|
||||
}, 3000);
|
||||
|
||||
}
|
||||
@@ -582,7 +858,7 @@ function bindUIButtons() {
|
||||
});
|
||||
|
||||
$("#trigger-updater").click(function () {
|
||||
var jqxhr = $.get("/admin/trigger_update", function (data) {
|
||||
var jqxhr = $.get("trigger_update", function (data) {
|
||||
if (data.result == "error") {
|
||||
doNotify("Error: " + data.error, "danger", "glyphicon glyphicon-alert");
|
||||
return;
|
||||
@@ -598,7 +874,7 @@ function bindUIButtons() {
|
||||
var password = $("#jackett-adminpwd").val();
|
||||
var jsonObject = { password: password };
|
||||
|
||||
var jqxhr = $.post("/admin/set_admin_password", JSON.stringify(jsonObject), function (data) {
|
||||
var jqxhr = $.post("set_admin_password", JSON.stringify(jsonObject), function (data) {
|
||||
|
||||
if (data.result == "error") {
|
||||
doNotify("Error: " + data.error, "danger", "glyphicon glyphicon-alert");
|
||||
@@ -615,4 +891,4 @@ function bindUIButtons() {
|
||||
doNotify("Request to Jackett server failed", "danger", "glyphicon glyphicon-alert");
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
|
@@ -3,28 +3,28 @@
|
||||
<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<link rel='shortcut icon' type='image/x-icon' href='/favicon.ico' />
|
||||
<script src="../../libs/filesize.min.js"></script>
|
||||
<script src="../../libs/jquery.min.js"></script>
|
||||
<script src="../../libs/jquery.dataTables.min.js"></script>
|
||||
<script src="../../libs/handlebars.min.js"></script>
|
||||
<script src="../../libs/moment.min.js"></script>
|
||||
<script src="../../libs/handlebarsmoment.js"></script>
|
||||
<script src="../../bootstrap/bootstrap.min.js"></script>
|
||||
<script src="../../libs/bootstrap-notify.js"></script>
|
||||
<link rel='shortcut icon' type='image/x-icon' href='../favicon.ico' />
|
||||
<script src="../libs/filesize.min.js"></script>
|
||||
<script src="../libs/jquery.min.js"></script>
|
||||
<script src="../libs/jquery.dataTables.min.js"></script>
|
||||
<script src="../libs/handlebars.min.js"></script>
|
||||
<script src="../libs/moment.min.js"></script>
|
||||
<script src="../libs/handlebarsmoment.js"></script>
|
||||
<script src="../bootstrap/bootstrap.min.js"></script>
|
||||
<script src="../libs/bootstrap-notify.js"></script>
|
||||
<script src="https://www.google.com/recaptcha/api.js?onload=onloadCallback&render=explicit" async defer></script>
|
||||
|
||||
<link href="../../bootstrap/bootstrap.min.css" rel="stylesheet">
|
||||
<link href="../../animate.css" rel="stylesheet">
|
||||
<link href="../../custom.css" rel="stylesheet">
|
||||
<link href="../../css/jquery.dataTables.css" rel="stylesheet">
|
||||
<link rel="stylesheet" href="../../css/font-awesome.min.css">
|
||||
<link href="../bootstrap/bootstrap.min.css" rel="stylesheet">
|
||||
<link href="../animate.css" rel="stylesheet">
|
||||
<link href="../custom.css" rel="stylesheet">
|
||||
<link href="../css/jquery.dataTables.css" rel="stylesheet">
|
||||
<link rel="stylesheet" href="../css/font-awesome.min.css">
|
||||
<title>Jackett</title>
|
||||
</head>
|
||||
<body>
|
||||
<div id="page">
|
||||
|
||||
<img id="logo" src="../../jacket_medium.png" alt="Logo" /><span id="header-title">Jackett</span>
|
||||
<img id="logo" src="../jacket_medium.png" alt="Logo" /><span id="header-title">Jackett</span>
|
||||
|
||||
<div class="pull-right jackett-apikey">
|
||||
<span class="input-header">API Key: </span>
|
||||
@@ -32,11 +32,17 @@
|
||||
</div>
|
||||
<hr />
|
||||
<div class="pull-right">
|
||||
<button id="jackett-add-indexer" class="btn btn-success btn-sm">
|
||||
<span class="glyphicon glyphicon-plus" aria-hidden="true"></span> Add indexer
|
||||
</button>
|
||||
<button id="jackett-show-search" class="btn btn-success btn-sm">
|
||||
<i class="fa fa-search"></i> Manual Search <span class="glyphicon glyphicon-ok-wrench" aria-hidden="true"></span>
|
||||
<span class="glyphicon glyphicon-search" aria-hidden="true"></span> Manual Search
|
||||
</button>
|
||||
<button id="jackett-show-releases" class="btn btn-primary btn-sm">
|
||||
<i class="fa fa-database"></i> View cached releases <span class="glyphicon glyphicon-ok-wrench" aria-hidden="true"></span>
|
||||
<i class="fa fa-database"></i> View cached releases
|
||||
</button>
|
||||
<button id="jackett-test-all" class="btn btn-warning btn-sm">
|
||||
<span class="glyphicon glyphicon-screenshot" aria-hidden="true"></span> Test All
|
||||
</button>
|
||||
</div>
|
||||
<h3>Configured Indexers</h3>
|
||||
@@ -48,7 +54,7 @@
|
||||
<ol>
|
||||
<li>Go to <b>Settings > Indexers > Add > Torznab > Custom</b>.</li>
|
||||
<li>For <b>URL</b> enter the <b>Torznab Host</b> of one of the indexers.</li>
|
||||
<li>For the <b>API key</b> using the key below.</li>
|
||||
<li>For the <b>API key</b> using the key above.</li>
|
||||
</ol>
|
||||
<h4>Adding a Jackett indexer in CouchPotato</h4>
|
||||
<ol>
|
||||
@@ -84,10 +90,13 @@
|
||||
Logout
|
||||
</a>
|
||||
</div>
|
||||
<div class="input-area">
|
||||
<span class="input-header">Base Path Override: </span>
|
||||
<input id="jackett-basepathoverride" class="form-control input-right" type="text" value="" placeholder="/jackett/">
|
||||
</div>
|
||||
<div class="input-area">
|
||||
<span class="input-header">Server port: </span>
|
||||
<input id="jackett-port" class="form-control input-right" type="text" value="" placeholder="9117">
|
||||
|
||||
</div>
|
||||
<div class="input-area">
|
||||
<span class="input-header">Manual download blackhole directory: </span>
|
||||
@@ -156,7 +165,7 @@
|
||||
</div>
|
||||
</script>
|
||||
<script id="setup-item-displayimage" type="text/x-handlebars-template">
|
||||
<img class="setup-item-displayimage" src="{{{value}}}" />
|
||||
<img class="setup-item-displayimage" src="{{{value}}}" alt="No image available" />
|
||||
</script>
|
||||
<script id="setup-item-displayinfo" type="text/x-handlebars-template">
|
||||
<div class="setup-item-displayinfo alert alert-info" role="alert">{{{value}}}</div>
|
||||
@@ -166,50 +175,93 @@
|
||||
<input class="form-control" type="text" value="{{{value}}}" />
|
||||
</div>
|
||||
</script>
|
||||
|
||||
<script id="configured-indexer" type="text/x-handlebars-template">
|
||||
<div class="configured-indexer indexer card">
|
||||
<div class="indexer-logo">
|
||||
<!-- Make section browser searchable -->
|
||||
<span class="hidden-name">{{name}}</span>
|
||||
<img alt="{{name}}" title="{{name}}" src="../../logos/{{id}}.png" />
|
||||
</div>
|
||||
<div class="indexer-buttons">
|
||||
<button class="btn btn-primary btn-sm indexer-setup" data-id="{{id}}" data-link="{{site_link}}">
|
||||
<span class="glyphicon glyphicon-wrench" aria-hidden="true"></span>
|
||||
</button>
|
||||
<button class="btn btn-danger btn-sm indexer-button-delete" data-id="{{id}}">
|
||||
<span class="glyphicon glyphicon-trash" aria-hidden="true"></span>
|
||||
</button>
|
||||
<a class="btn btn-info btn-sm" target="_blank" href="{{site_link}}">
|
||||
<span class="glyphicon glyphicon-new-window" aria-hidden="true"></span>
|
||||
</a>
|
||||
<button class="btn btn-warning btn-sm indexer-button-test" data-id="{{id}}">
|
||||
Test <span class="glyphicon glyphicon-screenshot" aria-hidden="true"></span>
|
||||
</button>
|
||||
</div>
|
||||
<div class="indexer-host">
|
||||
<b>Torznab Host:</b>
|
||||
<input class="form-control" type="text" value="{{torznab_host}}" placeholder="Torznab Host" readonly="">
|
||||
<b>CouchPotato Host:</b>
|
||||
{{#if potatoenabled}}
|
||||
|
||||
<input class="form-control" type="text" value="{{potato_host}}" placeholder="Torznab Host" readonly="">
|
||||
{{else}}
|
||||
<input class="form-control" type="text" value="Not available" placeholder="Torznab Host" readonly="">
|
||||
{{/if}}
|
||||
</div>
|
||||
<script id="setup-item-alternativesitelinks" type="text/x-handlebars-template">
|
||||
<div class="setup-item-alternativesitelinks alert alert-info" role="alert">
|
||||
This indexer has multiple known URLs which you can change above:
|
||||
<ul>
|
||||
{{#each alternativesitelinks}}
|
||||
<li>{{this}}</li>
|
||||
{{/each}}
|
||||
</ul>
|
||||
</div>
|
||||
</script>
|
||||
<script id="unconfigured-indexer" type="text/x-handlebars-template">
|
||||
<div class="unconfigured-indexer card">
|
||||
<div class="indexer-logo indexer-setup" data-id="{{id}}" data-link="{{site_link}}">
|
||||
<!-- Make section browser searchable -->
|
||||
<span class="hidden-name">{{name}}</span>
|
||||
<img alt="{{name}}" title="{{name}}" src="../../logos/{{id}}.png" />
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<script id="configured-indexer-table" type="text/x-handlebars-template">
|
||||
<table class="indexer-table configured-indexer-table dataTable compact cell-border hover stripe table table-responsive">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Indexer</th>
|
||||
<th>Actions</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{{#each indexers}}
|
||||
<tr class="configured-indexer-row">
|
||||
<td><a target="_blank" href="{{site_link}}" title="{{description}}">{{name}}</a></td>
|
||||
<td class="fit">
|
||||
<div class="indexer-buttons">
|
||||
<button title="{{torznab_host}}" type="button" class="indexer-button-copy btn btn-xs btn-info">Copy Torznab Feed</button>
|
||||
<button title="{{potato_host}}" type="button" class="indexer-button-copy btn btn-xs btn-info{{#unless potatoenabled}} disabled{{/unless}}">Copy Potato Feed</button>
|
||||
|
||||
<button title="Search" class="btn btn-success btn-xs indexer-button-search" data-id="{{id}}">
|
||||
<span class="glyphicon glyphicon-search" aria-hidden="true"></span>
|
||||
</button>
|
||||
<button title="Configure" class="btn btn-primary btn-xs indexer-setup" data-id="{{id}}" data-link="{{site_link}}">
|
||||
<span class="glyphicon glyphicon-wrench" aria-hidden="true"></span>
|
||||
</button>
|
||||
<button title="Delete" class="btn btn-danger btn-xs indexer-button-delete" data-id="{{id}}">
|
||||
<span class="glyphicon glyphicon-trash" aria-hidden="true"></span>
|
||||
</button>
|
||||
<button title="{{last_error}}" class="btn btn-warning btn-xs indexer-button-test" data-toggle="tooltip" data-id="{{id}}" data-state="{{state}}">
|
||||
Test
|
||||
<span class="glyphicon" aria-hidden="true"></span>
|
||||
</button>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
{{/each}}
|
||||
</tbody>
|
||||
<tfoot>
|
||||
<tr>
|
||||
<td colspan="2">Total configured indexers: {{total_configured_indexers}}</td>
|
||||
</tr>
|
||||
</tfoot>
|
||||
</table>
|
||||
</script>
|
||||
|
||||
<script id="unconfigured-indexer-table" type="text/x-handlebars-template">
|
||||
<table class="indexer-table configured-indexer-table dataTable compact cell-border hover stripe table table-responsive">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Indexer</th>
|
||||
<th>Categories</th>
|
||||
<th>Language</th>
|
||||
<th></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{{#each indexers}}
|
||||
<tr class="unconfigured-indexer-row">
|
||||
<td><a target="_blank" href="{{site_link}}" title="{{description}}">{{name}}</a></td>
|
||||
<td>{{mains_cats}}</td>
|
||||
<td>{{language}}</td>
|
||||
<td class="fit">
|
||||
<div class="indexer-buttons">
|
||||
<button title="Configure" class="btn btn-success btn-xs indexer-setup" data-id="{{id}}" data-link="{{site_link}}">
|
||||
<span class="glyphicon glyphicon-plus" aria-hidden="true"></span>
|
||||
</button>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
{{/each}}
|
||||
</tbody>
|
||||
<tfoot>
|
||||
<tr>
|
||||
<td colspan="4">Total unconfigured indexers: {{total_unconfigured_indexers}}</td>
|
||||
</tr>
|
||||
</tfoot>
|
||||
</table>
|
||||
</script>
|
||||
|
||||
<script id="jackett-releases" type="text/x-handlebars-template">
|
||||
@@ -233,26 +285,34 @@
|
||||
<th>Name</th>
|
||||
<th>Size</th>
|
||||
<th>Size</th>
|
||||
<th>Files</th>
|
||||
<th>Category</th>
|
||||
<th>Grabs</th>
|
||||
<th>Seeds</th>
|
||||
<th>Leechers</th>
|
||||
<th>DL Factor</th>
|
||||
<th>UL Factor</th>
|
||||
<th>Download</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{{#each releases}}
|
||||
<tr>
|
||||
<tr class="jackett-releases-row" data-imdb="{{Imdb}}" data-banner="{{BannerUrl}}" data-description="{{Description}}">
|
||||
<td>{{PublishDate}}</td>
|
||||
<td>{{FirstSeen}}</td>
|
||||
<td>{{jacketTimespan PublishDate}}</td>
|
||||
<td>{{jacketTimespan FirstSeen}}</td>
|
||||
<td>{{Tracker}}</td>
|
||||
<td><a href="{{Comments}}">{{Title}}</a></td>
|
||||
<td class="Title"><a href="{{Comments}}">{{Title}}</a> <span class="release-labels"></span></td>
|
||||
<td>{{Size}}</td>
|
||||
<td>{{jacketSize Size}}</td>
|
||||
<td class="fit">{{jacketSize Size}}</td>
|
||||
<td>{{Files}}</td>
|
||||
<td>{{CategoryDesc}}</td>
|
||||
<td>{{Grabs}}</td>
|
||||
<td>{{Seeders}}</td>
|
||||
<td>{{Peers}}</td>
|
||||
<td class="DownloadVolumeFactor">{{DownloadVolumeFactor}}</td>
|
||||
<td class="UploadVolumeFactor">{{UploadVolumeFactor}}</td>
|
||||
<td class="downloadcolumn">
|
||||
<a class="downloadlink" title="Download locally" href="{{Link}}"><i class="fa fa-download"></i></a>
|
||||
{{#if BlackholeLink}}
|
||||
@@ -274,6 +334,12 @@
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
</tfoot>
|
||||
</table>
|
||||
@@ -302,6 +368,7 @@
|
||||
<select name="category" id="searchCategory"></select>
|
||||
<label>Tracker</label>
|
||||
<select name="tracker" id="searchTracker">
|
||||
<option value="">-- All --</option>
|
||||
{{#each indexers}}
|
||||
<option value="{{id}}">{{name}}</option>
|
||||
{{/each}}
|
||||
@@ -331,24 +398,32 @@
|
||||
<th>Name</th>
|
||||
<th>Size</th>
|
||||
<th>Size</th>
|
||||
<th>Files</th>
|
||||
<th>Category</th>
|
||||
<th>Grabs</th>
|
||||
<th>Seeds</th>
|
||||
<th>Leechers</th>
|
||||
<th>DL Factor</th>
|
||||
<th>UL Factor</th>
|
||||
<th>Download</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{{#each Results}}
|
||||
<tr>
|
||||
<tr class="jackett-search-results-row" data-imdb="{{Imdb}}" data-banner="{{BannerUrl}}" data-description="{{Description}}">
|
||||
<td>{{PublishDate}}</td>
|
||||
<td>{{jacketTimespan PublishDate}}</td>
|
||||
<td>{{Tracker}}</td>
|
||||
<td><a href="{{Comments}}">{{Title}}</a></td>
|
||||
<td class="Title"><a href="{{Comments}}">{{Title}}</a> <span class="release-labels"></span></td>
|
||||
<td>{{Size}}</td>
|
||||
<td>{{jacketSize Size}}</td>
|
||||
<td class="fit">{{jacketSize Size}}</td>
|
||||
<td>{{Files}}</td>
|
||||
<td>{{CategoryDesc}}</td>
|
||||
<td>{{Grabs}}</td>
|
||||
<td>{{Seeders}}</td>
|
||||
<td>{{Peers}}</td>
|
||||
<td class="DownloadVolumeFactor">{{DownloadVolumeFactor}}</td>
|
||||
<td class="UploadVolumeFactor">{{UploadVolumeFactor}}</td>
|
||||
<td class="downloadcolumn">
|
||||
<a class="downloadlink" title="Download locally" href="{{Link}}"><i class="fa fa-download"></i></a>
|
||||
{{#if BlackholeLink}}
|
||||
@@ -368,6 +443,12 @@
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
</tfoot>
|
||||
</table>
|
||||
@@ -466,18 +547,11 @@
|
||||
</div>
|
||||
</div>
|
||||
</script>
|
||||
<script id="add-indexer" type="text/x-handlebars-template">
|
||||
<button class="indexer card add-indexer" data-toggle="modal">
|
||||
<div class="indexer-add-content">
|
||||
<span class="glyphicon glyphicon glyphicon-plus" aria-hidden="true"></span>
|
||||
<div class="light-text">Add</div>
|
||||
</div>
|
||||
</button>
|
||||
</script>
|
||||
|
||||
<script id="spinner" type="text/x-handlebars-template">
|
||||
<span class="spinner glyphicon glyphicon-refresh"></span>
|
||||
</script>
|
||||
|
||||
<script src="../../custom.js"></script>
|
||||
<script src="../custom.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
@@ -4,30 +4,30 @@
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
|
||||
<link rel='shortcut icon' type='image/x-icon' href='/favicon.ico' />
|
||||
<link rel='shortcut icon' type='image/x-icon' href='../favicon.ico' />
|
||||
|
||||
<script src="../../libs/jquery.min.js"></script>
|
||||
<script src="../../libs/jquery.dataTables.min.js"></script>
|
||||
<script src="../../libs/handlebars.min.js"></script>
|
||||
<script src="../../libs/moment.min.js"></script>
|
||||
<script src="../../libs/handlebarsmoment.js"></script>
|
||||
<script src="../../bootstrap/bootstrap.min.js"></script>
|
||||
<script src="../../libs/bootstrap-notify.js"></script>
|
||||
<script src="../libs/jquery.min.js"></script>
|
||||
<script src="../libs/jquery.dataTables.min.js"></script>
|
||||
<script src="../libs/handlebars.min.js"></script>
|
||||
<script src="../libs/moment.min.js"></script>
|
||||
<script src="../libs/handlebarsmoment.js"></script>
|
||||
<script src="../bootstrap/bootstrap.min.js"></script>
|
||||
<script src="../libs/bootstrap-notify.js"></script>
|
||||
|
||||
<link href="../../bootstrap/bootstrap.min.css" rel="stylesheet">
|
||||
<link href="../../animate.css" rel="stylesheet">
|
||||
<link href="../../custom.css" rel="stylesheet">
|
||||
<link href="../bootstrap/bootstrap.min.css" rel="stylesheet">
|
||||
<link href="../animate.css" rel="stylesheet">
|
||||
<link href="../custom.css" rel="stylesheet">
|
||||
|
||||
<title>Jackett</title>
|
||||
</head>
|
||||
<body>
|
||||
<div id="page">
|
||||
|
||||
<img id="logo" src="../../jacket_medium.png" /><span id="header-title">Jackett</span>
|
||||
<img id="logo" src="../jacket_medium.png" /><span id="header-title">Jackett</span>
|
||||
|
||||
<hr />
|
||||
<h1>Login</h1>
|
||||
<form action="../Admin/Dashboard" method="post">
|
||||
<form action="Dashboard" method="post">
|
||||
<div class="input-area">
|
||||
<span class="input-header">Admin password</span>
|
||||
<input id="password" name="password" class="form-control input-right" type="password">
|
||||
@@ -38,4 +38,4 @@
|
||||
</form>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
</html>
|
||||
|
Before Width: | Height: | Size: 4.0 KiB |
Before Width: | Height: | Size: 3.4 KiB |
Before Width: | Height: | Size: 3.5 KiB |
Before Width: | Height: | Size: 3.7 KiB |
Before Width: | Height: | Size: 5.5 KiB |
Before Width: | Height: | Size: 3.9 KiB |
Before Width: | Height: | Size: 19 KiB |
Before Width: | Height: | Size: 9.3 KiB |
Before Width: | Height: | Size: 7.7 KiB |
Before Width: | Height: | Size: 9.2 KiB |
Before Width: | Height: | Size: 6.3 KiB |
Before Width: | Height: | Size: 9.9 KiB |
Before Width: | Height: | Size: 2.2 KiB |
Before Width: | Height: | Size: 13 KiB |
Before Width: | Height: | Size: 22 KiB |
Before Width: | Height: | Size: 25 KiB |
Before Width: | Height: | Size: 9.2 KiB |
Before Width: | Height: | Size: 5.3 KiB |
Before Width: | Height: | Size: 19 KiB |
Before Width: | Height: | Size: 7.1 KiB |
Before Width: | Height: | Size: 4.3 KiB |
Before Width: | Height: | Size: 6.3 KiB |
Before Width: | Height: | Size: 7.1 KiB |
Before Width: | Height: | Size: 7.2 KiB |
Before Width: | Height: | Size: 6.1 KiB |
Before Width: | Height: | Size: 15 KiB |
Before Width: | Height: | Size: 4.5 KiB |
Before Width: | Height: | Size: 4.9 KiB |
Before Width: | Height: | Size: 17 KiB |
Before Width: | Height: | Size: 12 KiB |
Before Width: | Height: | Size: 3.0 KiB |
Before Width: | Height: | Size: 14 KiB |
Before Width: | Height: | Size: 5.9 KiB |
Before Width: | Height: | Size: 4.9 KiB |
Before Width: | Height: | Size: 12 KiB |
Before Width: | Height: | Size: 5.0 KiB |
Before Width: | Height: | Size: 11 KiB |
Before Width: | Height: | Size: 20 KiB |
Before Width: | Height: | Size: 24 KiB |
Before Width: | Height: | Size: 21 KiB |
@@ -80,7 +80,7 @@ namespace Jackett.Controllers
|
||||
var ctx = Request.GetOwinContext();
|
||||
var authManager = ctx.Authentication;
|
||||
authManager.SignOut("ApplicationCookie");
|
||||
return Redirect("/Admin/Dashboard");
|
||||
return Redirect("Admin/Dashboard");
|
||||
}
|
||||
|
||||
[HttpGet]
|
||||
@@ -161,6 +161,7 @@ namespace Jackett.Controllers
|
||||
jsonReply["config"] = config.ToJson(null);
|
||||
jsonReply["caps"] = indexer.TorznabCaps.CapsToJson();
|
||||
jsonReply["name"] = indexer.DisplayName;
|
||||
jsonReply["alternativesitelinks"] = JToken.FromObject(indexer.AlternativeSiteLinks);
|
||||
jsonReply["result"] = "success";
|
||||
}
|
||||
catch (Exception ex)
|
||||
@@ -232,6 +233,8 @@ namespace Jackett.Controllers
|
||||
item["description"] = indexer.DisplayDescription;
|
||||
item["configured"] = indexer.IsConfigured;
|
||||
item["site_link"] = indexer.SiteLink;
|
||||
item["language"] = indexer.Language;
|
||||
item["last_error"] = indexer.LastError;
|
||||
item["potatoenabled"] = indexer.TorznabCaps.Categories.Select(c => c.ID).Any(i => PotatoController.MOVIE_CATS.Contains(i));
|
||||
|
||||
var caps = new JObject();
|
||||
@@ -256,19 +259,24 @@ namespace Jackett.Controllers
|
||||
public async Task<IHttpActionResult> Test()
|
||||
{
|
||||
JToken jsonReply = new JObject();
|
||||
IIndexer indexer = null;
|
||||
try
|
||||
{
|
||||
var postData = await ReadPostDataJson();
|
||||
string indexerString = (string)postData["indexer"];
|
||||
indexer = indexerService.GetIndexer(indexerString);
|
||||
await indexerService.TestIndexer(indexerString);
|
||||
jsonReply["name"] = indexerService.GetIndexer(indexerString).DisplayName;
|
||||
jsonReply["name"] = indexer.DisplayName;
|
||||
jsonReply["result"] = "success";
|
||||
indexer.LastError = null;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
logger.Error(ex, "Exception in test_indexer");
|
||||
jsonReply["result"] = "error";
|
||||
jsonReply["error"] = ex.Message;
|
||||
if (indexer != null)
|
||||
indexer.LastError = ex.Message;
|
||||
}
|
||||
return Json(jsonReply);
|
||||
}
|
||||
@@ -318,6 +326,7 @@ namespace Jackett.Controllers
|
||||
cfg["prerelease"] = serverService.Config.UpdatePrerelease;
|
||||
cfg["password"] = string.IsNullOrEmpty(serverService.Config.AdminPassword) ? string.Empty : serverService.Config.AdminPassword.Substring(0, 10);
|
||||
cfg["logging"] = Startup.TracingEnabled;
|
||||
cfg["basepathoverride"] = serverService.Config.BasePathOverride;
|
||||
|
||||
|
||||
jsonReply["config"] = cfg;
|
||||
@@ -349,9 +358,12 @@ namespace Jackett.Controllers
|
||||
bool updateDisabled = (bool)postData["updatedisabled"];
|
||||
bool preRelease = (bool)postData["prerelease"];
|
||||
bool logging = (bool)postData["logging"];
|
||||
string basePathOverride = (string)postData["basepathoverride"];
|
||||
|
||||
Engine.Server.Config.UpdateDisabled = updateDisabled;
|
||||
Engine.Server.Config.UpdatePrerelease = preRelease;
|
||||
Engine.Server.Config.BasePathOverride = basePathOverride;
|
||||
Startup.BasePath = Engine.Server.BasePath();
|
||||
Engine.Server.SaveConfig();
|
||||
|
||||
Engine.SetLogLevel(logging ? LogLevel.Debug : LogLevel.Info);
|
||||
@@ -446,7 +458,7 @@ namespace Jackett.Controllers
|
||||
|
||||
private void ConfigureCacheResults(List<TrackerCacheResult> results)
|
||||
{
|
||||
var serverUrl = string.Format("{0}://{1}:{2}/", Request.RequestUri.Scheme, Request.RequestUri.Host, Request.RequestUri.Port);
|
||||
var serverUrl = string.Format("{0}://{1}:{2}{3}", Request.RequestUri.Scheme, Request.RequestUri.Host, Request.RequestUri.Port, serverService.BasePath());
|
||||
foreach (var result in results)
|
||||
{
|
||||
var link = result.Link;
|
||||
|
@@ -83,7 +83,9 @@ namespace Jackett.Controllers
|
||||
if (string.IsNullOrWhiteSpace(request.search))
|
||||
{
|
||||
// We are searching by IMDB id so look up the name
|
||||
var response = await webClient.GetString(new Utils.Clients.WebRequest("http://www.omdbapi.com/?type=movie&i=" + request.imdbid));
|
||||
var omdbapiRequest = new Utils.Clients.WebRequest("http://www.omdbapi.com/?type=movie&i=" + request.imdbid);
|
||||
omdbapiRequest.Encoding = Encoding.UTF8;
|
||||
var response = await webClient.GetString(omdbapiRequest);
|
||||
if (response.Status == HttpStatusCode.OK)
|
||||
{
|
||||
JObject result = JObject.Parse(response.Content);
|
||||
@@ -99,7 +101,9 @@ namespace Jackett.Controllers
|
||||
{
|
||||
ApiKey = request.passkey,
|
||||
Categories = MOVIE_CATS,
|
||||
SearchTerm = request.search
|
||||
SearchTerm = request.search,
|
||||
ImdbID = request.imdbid,
|
||||
QueryType = "TorrentPotato"
|
||||
};
|
||||
|
||||
IEnumerable<ReleaseInfo> releases = new List<ReleaseInfo>();
|
||||
@@ -117,7 +121,7 @@ namespace Jackett.Controllers
|
||||
}
|
||||
|
||||
releases = indexer.FilterResults(torznabQuery, releases);
|
||||
var serverUrl = string.Format("{0}://{1}:{2}/", Request.RequestUri.Scheme, Request.RequestUri.Host, Request.RequestUri.Port);
|
||||
var serverUrl = string.Format("{0}://{1}:{2}{3}", Request.RequestUri.Scheme, Request.RequestUri.Host, Request.RequestUri.Port, serverService.BasePath());
|
||||
var potatoResponse = new TorrentPotatoResponse();
|
||||
|
||||
releases = TorznabUtil.FilterResultsToTitle(releases, torznabQuery.SanitizedSearchTerm, year);
|
||||
@@ -138,11 +142,12 @@ namespace Jackett.Controllers
|
||||
details_url = release.Comments.ToString(),
|
||||
download_url = release.Link.ToString(),
|
||||
imdb_id = release.Imdb.HasValue ? "tt" + release.Imdb : null,
|
||||
freeleech = false,
|
||||
freeleech = (release.DownloadVolumeFactor == 0 ? true : false),
|
||||
type = "movie",
|
||||
size = (long)release.Size / (1024 * 1024), // This is in MB
|
||||
leechers = (int)release.Peers - (int)release.Seeders,
|
||||
seeders = (int)release.Seeders
|
||||
seeders = (int)release.Seeders,
|
||||
publish_date = r.PublishDate == DateTime.MinValue ? null : release.PublishDate.ToUniversalTime().ToString("s")
|
||||
});
|
||||
}
|
||||
}
|
||||
|
@@ -1,6 +1,7 @@
|
||||
using AutoMapper;
|
||||
using Jackett.Models;
|
||||
using Jackett.Services;
|
||||
using Jackett.Utils;
|
||||
using NLog;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
@@ -12,7 +13,8 @@ using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Web;
|
||||
using System.Web.Http;
|
||||
|
||||
using System.Xml.Linq;
|
||||
|
||||
namespace Jackett.Controllers
|
||||
{
|
||||
[AllowAnonymous]
|
||||
@@ -32,6 +34,24 @@ namespace Jackett.Controllers
|
||||
cacheService = c;
|
||||
}
|
||||
|
||||
public HttpResponseMessage GetErrorXML(int code, string description)
|
||||
{
|
||||
var xdoc = new XDocument(
|
||||
new XDeclaration("1.0", "UTF-8", null),
|
||||
new XElement("error",
|
||||
new XAttribute("code", code.ToString()),
|
||||
new XAttribute("description", description)
|
||||
)
|
||||
);
|
||||
|
||||
var xml = xdoc.Declaration.ToString() + Environment.NewLine + xdoc.ToString();
|
||||
|
||||
return new HttpResponseMessage()
|
||||
{
|
||||
Content = new StringContent(xml, Encoding.UTF8, "application/xml")
|
||||
};
|
||||
}
|
||||
|
||||
[HttpGet]
|
||||
public async Task<HttpResponseMessage> Call(string indexerID)
|
||||
{
|
||||
@@ -42,7 +62,7 @@ namespace Jackett.Controllers
|
||||
{
|
||||
return new HttpResponseMessage()
|
||||
{
|
||||
Content = new StringContent(indexer.TorznabCaps.ToXml(), Encoding.UTF8, "application/rss+xml")
|
||||
Content = new StringContent(indexer.TorznabCaps.ToXml(), Encoding.UTF8, "application/xml")
|
||||
};
|
||||
}
|
||||
|
||||
@@ -62,6 +82,33 @@ namespace Jackett.Controllers
|
||||
{
|
||||
logger.Warn(string.Format("Rejected a request to {0} which is unconfigured.", indexer.DisplayName));
|
||||
return Request.CreateResponse(HttpStatusCode.Forbidden, "This indexer is not configured.");
|
||||
}
|
||||
|
||||
if (torznabQuery.ImdbID != null)
|
||||
{
|
||||
if (torznabQuery.QueryType != "movie")
|
||||
{
|
||||
logger.Warn(string.Format("A non movie request with an imdbid was made from {0}.", Request.GetOwinContext().Request.RemoteIpAddress));
|
||||
return GetErrorXML(201, "Incorrect parameter: only movie-search supports the imdbid parameter");
|
||||
}
|
||||
|
||||
if (!string.IsNullOrEmpty(torznabQuery.SearchTerm))
|
||||
{
|
||||
logger.Warn(string.Format("A movie-search request from {0} was made contining q and imdbid.", Request.GetOwinContext().Request.RemoteIpAddress));
|
||||
return GetErrorXML(201, "Incorrect parameter: please specify either imdbid or q");
|
||||
}
|
||||
|
||||
if (ParseUtil.GetImdbID(torznabQuery.ImdbID) == null)
|
||||
{
|
||||
logger.Warn(string.Format("A movie-search request from {0} was made with an invalid imdbid.", Request.GetOwinContext().Request.RemoteIpAddress));
|
||||
return GetErrorXML(201, "Incorrect parameter: invalid imdbid format");
|
||||
}
|
||||
|
||||
if (!indexer.TorznabCaps.SupportsImdbSearch)
|
||||
{
|
||||
logger.Warn(string.Format("A movie-search request with imdbid from {0} was made but the indexer {1} doesn't support it.", Request.GetOwinContext().Request.RemoteIpAddress, indexer.DisplayName));
|
||||
return GetErrorXML(203, "Function Not Available: imdbid is not supported by this indexer");
|
||||
}
|
||||
}
|
||||
|
||||
var releases = await indexer.PerformQuery(torznabQuery);
|
||||
@@ -100,7 +147,7 @@ namespace Jackett.Controllers
|
||||
|
||||
logger.Info(logBuilder.ToString());
|
||||
|
||||
var serverUrl = string.Format("{0}://{1}:{2}/", Request.RequestUri.Scheme, Request.RequestUri.Host, Request.RequestUri.Port);
|
||||
var serverUrl = string.Format("{0}://{1}:{2}{3}", Request.RequestUri.Scheme, Request.RequestUri.Host, Request.RequestUri.Port, serverService.BasePath());
|
||||
var resultPage = new ResultPage(new ChannelInfo
|
||||
{
|
||||
Title = indexer.DisplayName,
|
||||
|
@@ -24,14 +24,16 @@ namespace Jackett
|
||||
public string Referer { get; private set; }
|
||||
public HttpMethod Method { get; private set; }
|
||||
public IEnumerable<KeyValuePair<string, string>> PostData { get; set; }
|
||||
public Dictionary<string, string> Headers { get; set; }
|
||||
public string RawPOSTDdata { get; set;}
|
||||
|
||||
public CurlRequest(HttpMethod method, string url, string cookies = null, string referer = null, string rawPOSTData = null)
|
||||
public CurlRequest(HttpMethod method, string url, string cookies = null, string referer = null, Dictionary<string, string> headers = null, string rawPOSTData = null)
|
||||
{
|
||||
Method = method;
|
||||
Url = url;
|
||||
Url = url.Replace(" ", "+"); // avoids bad request to cloudflare for urls containing a space followed by H (" H")
|
||||
Cookies = cookies;
|
||||
Referer = referer;
|
||||
Headers = headers;
|
||||
RawPOSTDdata = rawPOSTData;
|
||||
}
|
||||
}
|
||||
@@ -52,16 +54,16 @@ namespace Jackett
|
||||
}
|
||||
}
|
||||
|
||||
public static async Task<CurlResponse> GetAsync(string url, string cookies = null, string referer = null)
|
||||
public static async Task<CurlResponse> GetAsync(string url, string cookies = null, string referer = null, Dictionary<string, string> headers = null)
|
||||
{
|
||||
var curlRequest = new CurlRequest(HttpMethod.Get, url, cookies, referer);
|
||||
var curlRequest = new CurlRequest(HttpMethod.Get, url, cookies, referer, headers);
|
||||
var result = await PerformCurlAsync(curlRequest);
|
||||
return result;
|
||||
}
|
||||
|
||||
public static async Task<CurlResponse> PostAsync(string url, IEnumerable<KeyValuePair<string, string>> formData, string cookies = null, string referer = null, string rawPostData =null)
|
||||
public static async Task<CurlResponse> PostAsync(string url, IEnumerable<KeyValuePair<string, string>> formData, string cookies = null, string referer = null, Dictionary<string, string> headers = null, string rawPostData =null)
|
||||
{
|
||||
var curlRequest = new CurlRequest(HttpMethod.Post, url, cookies, referer);
|
||||
var curlRequest = new CurlRequest(HttpMethod.Post, url, cookies, referer, headers);
|
||||
curlRequest.PostData = formData;
|
||||
curlRequest.RawPOSTDdata = rawPostData;
|
||||
var result = await PerformCurlAsync(curlRequest);
|
||||
@@ -90,7 +92,16 @@ namespace Jackett
|
||||
easy.BufferSize = 64 * 1024;
|
||||
easy.UserAgent = BrowserUtil.ChromeUserAgent;
|
||||
easy.FollowLocation = false;
|
||||
easy.ConnectTimeout = 20;
|
||||
easy.ConnectTimeout = 20;
|
||||
if(curlRequest.Headers != null)
|
||||
{
|
||||
CurlSlist curlHeaders = new CurlSlist();
|
||||
foreach (var header in curlRequest.Headers)
|
||||
{
|
||||
curlHeaders.Append(header.Key + ": " + header.Value);
|
||||
}
|
||||
easy.SetOpt(CurlOption.HttpHeader, curlHeaders);
|
||||
}
|
||||
|
||||
easy.WriteFunction = (byte[] buf, int size, int nmemb, object data) =>
|
||||
{
|
||||
@@ -151,7 +162,7 @@ namespace Jackett
|
||||
|
||||
if (easy.LastErrorCode != CurlCode.Ok)
|
||||
{
|
||||
var message = "Error " + easy.LastErrorCode.ToString() + " " + easy.LastErrorDescription;
|
||||
var message = "Error " + easy.LastErrorCode.ToString() + " " + easy.LastErrorDescription + " " + easy.ErrorBuffer;
|
||||
if (null != OnErrorMessage)
|
||||
OnErrorMessage(message);
|
||||
else
|
||||
@@ -173,7 +184,7 @@ namespace Jackett
|
||||
var headerParts = headerString.Split(new char[] { '\n', '\r' }, StringSplitOptions.RemoveEmptyEntries);
|
||||
var headers = new List<string[]>();
|
||||
var headerCount = 0;
|
||||
HttpStatusCode status = HttpStatusCode.InternalServerError;
|
||||
HttpStatusCode status = HttpStatusCode.NotImplemented;
|
||||
var cookieBuilder = new StringBuilder();
|
||||
var cookies = new List<Tuple<string, string>>();
|
||||
foreach (var headerPart in headerParts)
|
||||
@@ -216,6 +227,31 @@ namespace Jackett
|
||||
cookieBuilder.AppendFormat("{0} ", cookieGroup.Last().Item2);
|
||||
}
|
||||
|
||||
// add some debug output to track down the problem causing people getting InternalServerError results
|
||||
if (status == HttpStatusCode.NotImplemented || status == HttpStatusCode.InternalServerError)
|
||||
{
|
||||
try
|
||||
{
|
||||
OnErrorMessage("got NotImplemented/InternalServerError");
|
||||
OnErrorMessage("request.Method: " + curlRequest.Method);
|
||||
OnErrorMessage("request.Url: " + curlRequest.Url);
|
||||
OnErrorMessage("request.Cookies: " + curlRequest.Cookies);
|
||||
OnErrorMessage("request.Referer: " + curlRequest.Referer);
|
||||
OnErrorMessage("request.RawPOSTDdata: " + curlRequest.RawPOSTDdata);
|
||||
OnErrorMessage("cookies: "+ cookieBuilder.ToString().Trim());
|
||||
OnErrorMessage("headerString:\n" + headerString);
|
||||
|
||||
foreach (var headerPart in headerParts)
|
||||
{
|
||||
OnErrorMessage("headerParts: "+headerPart);
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
OnErrorMessage(string.Format("CurlHelper: error while handling NotImplemented/InternalServerError:\n{0}", ex));
|
||||
}
|
||||
}
|
||||
|
||||
var contentBytes = Combine(contentBuffers.ToArray());
|
||||
var curlResponse = new CurlResponse(headers, contentBytes, status, cookieBuilder.ToString().Trim());
|
||||
return curlResponse;
|
||||
|
82
src/Jackett/Definitions/alphareign.yml
Normal file
@@ -0,0 +1,82 @@
|
||||
---
|
||||
site: alphareign
|
||||
name: AlphaReign
|
||||
description: "A DHT only tracker"
|
||||
language: en-us
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- https://alphareign.se
|
||||
|
||||
caps:
|
||||
categories:
|
||||
Movies: Movies
|
||||
Movies/HD: Movies/HD
|
||||
Movies/SD: Movies/SD
|
||||
TV: TV
|
||||
TV/HD: TV/HD
|
||||
TV/SD: TV/SD
|
||||
Other: Other
|
||||
|
||||
modes:
|
||||
search: [q]
|
||||
tv-search: [q, season, ep]
|
||||
|
||||
login:
|
||||
path: /login
|
||||
method: form
|
||||
form: form[action^="/login"]
|
||||
inputs:
|
||||
username: "{{ .Config.username }}"
|
||||
password: "{{ .Config.password }}"
|
||||
error:
|
||||
- path: /login
|
||||
selector: div.auth-form > div > div.alert-danger
|
||||
|
||||
test:
|
||||
path: settings
|
||||
selector: a[href="/logout"]
|
||||
|
||||
ratio:
|
||||
text: "∞"
|
||||
|
||||
search:
|
||||
path: /
|
||||
method: get
|
||||
inputs:
|
||||
query: "{{ .Keywords }}"
|
||||
rows:
|
||||
selector: .result
|
||||
fields:
|
||||
title:
|
||||
attribute: data-name
|
||||
details:
|
||||
selector: a[href^="/torrent"]
|
||||
attribute: href
|
||||
download:
|
||||
selector: a[href^="magnet:"]
|
||||
attribute: href
|
||||
date:
|
||||
attribute: data-added
|
||||
size:
|
||||
attribute: data-size
|
||||
seeders:
|
||||
attribute: data-seeders
|
||||
leechers:
|
||||
attribute: data-leechers
|
||||
downloadvolumefactor:
|
||||
case:
|
||||
"*": "1"
|
||||
uploadvolumefactor:
|
||||
case:
|
||||
"*": "1"
|
||||
category:
|
||||
case:
|
||||
"a[class=\"label label-primary\"]:contains(\"video\") + a[class=\"label label-success\"]:contains(\"movie\") + a[class=\"label label-info\"]:contains(\"HD\")": "Movies/HD"
|
||||
"a[class=\"label label-primary\"]:contains(\"video\") + a[class=\"label label-success\"]:contains(\"movie\") + a[class=\"label label-info\"]:contains(\"720p\")": "Movies/HD"
|
||||
"a[class=\"label label-primary\"]:contains(\"video\") + a[class=\"label label-success\"]:contains(\"movie\") + a[class=\"label label-info\"]:contains(\"1080p\")": "Movies/HD"
|
||||
"a[class=\"label label-primary\"]:contains(\"video\") + a[class=\"label label-success\"]:contains(\"movie\") + a[class=\"label label-info\"]:contains(\"SD\")": "Movies/SD"
|
||||
"a[class=\"label label-primary\"]:contains(\"video\") + a[class=\"label label-success\"]:contains(\"movie\")": "Movies"
|
||||
"a[class=\"label label-primary\"]:contains(\"video\") + a[class=\"label label-success\"]:contains(\"show\") + a[class=\"label label-info\"]:contains(\"HD\")": "TV/HD"
|
||||
"a[class=\"label label-primary\"]:contains(\"video\") + a[class=\"label label-success\"]:contains(\"show\") + a[class=\"label label-info\"]:contains(\"SD\")": "TV/SD"
|
||||
"a[class=\"label label-primary\"]:contains(\"video\") + a[class=\"label label-success\"]:contains(\"show\")": "TV"
|
||||
"*": "Other"
|
123
src/Jackett/Definitions/aox.yml
Normal file
@@ -0,0 +1,123 @@
|
||||
---
|
||||
site: aox
|
||||
name: AOX
|
||||
language: en-us
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- https://aox.to/
|
||||
|
||||
caps:
|
||||
categories:
|
||||
# Japanese
|
||||
1: Movies # jMovies
|
||||
2: TV # TV Shows
|
||||
3: TV/Other # Variety Shows
|
||||
|
||||
# Korean
|
||||
6: Movies # kMovies
|
||||
4: TV # TV Shows
|
||||
14: TV/Other # Variety Shows
|
||||
|
||||
# Chinese
|
||||
8: Movies # cMovies
|
||||
9: TV # TV Shows
|
||||
13: TV/Other # Variety Shows
|
||||
|
||||
# Adult
|
||||
13: XXX # Adult
|
||||
|
||||
modes:
|
||||
search: [q]
|
||||
tv-search: [q, season, ep]
|
||||
|
||||
login:
|
||||
path: index.php?page=login
|
||||
method: post
|
||||
inputs:
|
||||
uid: "{{ .Config.username }}"
|
||||
pwd: "{{ .Config.password }}"
|
||||
error:
|
||||
- selector: body[onLoad^="makeAlert('"]
|
||||
message:
|
||||
selector: body[onLoad^="makeAlert('"]
|
||||
attribute: onLoad
|
||||
filters:
|
||||
- name: replace
|
||||
args: ["makeAlert('Error' , '", ""]
|
||||
- name: replace
|
||||
args: ["');", ""]
|
||||
test:
|
||||
path: index.php
|
||||
|
||||
download:
|
||||
selector: a[href^="download.php?id="]
|
||||
|
||||
search:
|
||||
path: index.php
|
||||
inputs:
|
||||
search: "{{ .Query.Keywords }}"
|
||||
page: "torrents"
|
||||
category: "{{range .Categories}}{{.}};{{end}}"
|
||||
options: "0"
|
||||
active: "0"
|
||||
rows:
|
||||
selector: table > tbody > tr > td > table.lista > tbody > tr:has(a[href^="index.php?page=torrent-details&id="])
|
||||
fields:
|
||||
download:
|
||||
selector: a[href^="index.php?page=downloadcheck&id="]
|
||||
attribute: href
|
||||
title:
|
||||
selector: a[onmouseover][href^="index.php?page=torrent-details&id="]
|
||||
banner:
|
||||
selector: a[onmouseover][href^="index.php?page=torrent-details&id="]
|
||||
attribute: onmouseover
|
||||
filters:
|
||||
- name: regexp
|
||||
args: "src=(.*?) "
|
||||
category:
|
||||
selector: a[href^="index.php?page=torrents&category="]
|
||||
attribute: href
|
||||
filters:
|
||||
- name: querystring
|
||||
args: category
|
||||
details:
|
||||
selector: a[onmouseover][href^="index.php?page=torrent-details&id="]
|
||||
attribute: href
|
||||
size:
|
||||
selector: td:nth-child(12)
|
||||
date:
|
||||
selector: td:nth-child(7)
|
||||
filters:
|
||||
- name: append
|
||||
args: " +01:00"
|
||||
- name: dateparse
|
||||
args: "02/01/2006 -07:00"
|
||||
grabs:
|
||||
selector: td:nth-child(10)
|
||||
filters:
|
||||
- name: replace
|
||||
args: ["---", "0"]
|
||||
seeders:
|
||||
selector: td:nth-child(8)
|
||||
leechers:
|
||||
selector: td:nth-child(9)
|
||||
downloadvolumefactor:
|
||||
case:
|
||||
img[alt="Full Star 100% Free"]: "0"
|
||||
img[alt="Half Star 50% Free"]: "0.5"
|
||||
img[alt="Empty Star 25% Free"]: "0.75"
|
||||
"*": "1"
|
||||
uploadvolumefactor:
|
||||
case:
|
||||
"*": "1"
|
||||
description:
|
||||
selector: td:nth-child(2)
|
||||
remove: a
|
||||
description|append:
|
||||
selector: td:nth-child(3) > img
|
||||
attribute: title
|
||||
filters:
|
||||
- name: prepend
|
||||
args: "<br>Language: "
|
||||
|
||||
|
94
src/Jackett/Definitions/apollo.yml
Normal file
@@ -0,0 +1,94 @@
|
||||
---
|
||||
site: apollo
|
||||
name: Apollo
|
||||
description: "A music tracker"
|
||||
language: en-us
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- https://apollo.rip
|
||||
|
||||
caps:
|
||||
categories:
|
||||
1: Audio # Music
|
||||
2: PC # Applications
|
||||
3: Books # E-Books
|
||||
4: Audio/Audiobook # Audiobooks
|
||||
5: Movies # E-Learning Videos
|
||||
6: TV # Comedy
|
||||
7: Books/Comics # Comics
|
||||
|
||||
modes:
|
||||
search: [q]
|
||||
tv-search: [q, season, ep]
|
||||
|
||||
login:
|
||||
path: login.php
|
||||
method: post
|
||||
inputs:
|
||||
username: "{{ .Config.username }}"
|
||||
password: "{{ .Config.password }}"
|
||||
keeplogged: 1
|
||||
login: "Log in"
|
||||
error:
|
||||
- selector: form#loginform > span.warning
|
||||
test:
|
||||
path: torrents.php
|
||||
|
||||
ratio:
|
||||
path: torrents.php
|
||||
selector: li#stats_ratio > span
|
||||
|
||||
search:
|
||||
path: torrents.php
|
||||
inputs:
|
||||
$raw: "{{range .Categories}}filter_cat[{{.}}]=1&{{end}}"
|
||||
searchstr: "{{ .Query.Keywords }}"
|
||||
order_by: time
|
||||
order_way: desc
|
||||
action: basic
|
||||
searchsubmit: 1
|
||||
rows:
|
||||
selector: table#torrent_table > tbody > tr.torrent
|
||||
fields:
|
||||
download:
|
||||
selector: a[href^="torrents.php?action=download&id="]
|
||||
attribute: href
|
||||
description:
|
||||
selector: div.group_info
|
||||
remove: span
|
||||
title:
|
||||
selector: div.group_info
|
||||
remove: span, div.tags
|
||||
category:
|
||||
selector: td.cats_col
|
||||
case:
|
||||
div.cats_music: 1
|
||||
div.cats_applications: 2
|
||||
div.cats_ebooks: 3
|
||||
div.cats_audiobooks: 4
|
||||
div.cats_elearningvideos: 5
|
||||
div.cats_comedy: 6
|
||||
div.cats_comics: 7
|
||||
comments:
|
||||
selector: a[href^="torrents.php?id="]
|
||||
attribute: href
|
||||
files:
|
||||
selector: td:nth-child(3)
|
||||
date:
|
||||
selector: td:nth-child(4)
|
||||
size:
|
||||
selector: td:nth-child(5)
|
||||
grabs:
|
||||
selector: td:nth-child(6)
|
||||
seeders:
|
||||
selector: td:nth-child(7)
|
||||
leechers:
|
||||
selector: td:nth-child(8)
|
||||
downloadvolumefactor:
|
||||
case:
|
||||
":root div.alertbar:contains(\"freeleech\")": "0"
|
||||
":root div.alertbar:contains(\"FREELEECH\")": "0"
|
||||
"*": "1"
|
||||
uploadvolumefactor:
|
||||
case:
|
||||
"*": "1"
|
92
src/Jackett/Definitions/bithq.yml
Normal file
@@ -0,0 +1,92 @@
|
||||
---
|
||||
site: bithq
|
||||
name: BitHQ
|
||||
language: en-us
|
||||
encoding: windows-1252
|
||||
links:
|
||||
- http://www.bithq.org
|
||||
|
||||
caps:
|
||||
categories:
|
||||
7: Movies # Approved Film Series
|
||||
81: TV/HD # BD-MKV
|
||||
62: Audio # CD-R/OST
|
||||
51: Movies/DVD # DVD-R/Animation
|
||||
48: Movies/DVD # DVD-R/Asian Cinema
|
||||
50: Movies/DVD # DVD-R/Documentaries
|
||||
64: Movies/DVD # DVD-R/Foreign Films
|
||||
55: Movies/DVD # DVD-R/Kids
|
||||
49: Movies/DVD # DVD-R/Movies
|
||||
52: Audio/Video # DVD-R/Music
|
||||
53: TV # DVD-R/TV
|
||||
70: Movies # Empire's 500
|
||||
80: Movies # Global Lens | trigon-film
|
||||
65: Other # Hi-Res Covers
|
||||
66: Movies/HD # High Quality
|
||||
57: Movies/SD # Low Quality
|
||||
54: PC/0day # Software/DVD/BD
|
||||
61: PC/0day # Software/System Utilities
|
||||
69: TV/Sport # Sporting Events
|
||||
68: Movies # The Criterion Collection
|
||||
|
||||
modes:
|
||||
search: [q]
|
||||
tv-search: [q, season, ep]
|
||||
|
||||
login:
|
||||
path: takelogin.php
|
||||
method: post
|
||||
inputs:
|
||||
username: "{{ .Config.username }}"
|
||||
password: "{{ .Config.password }}"
|
||||
error:
|
||||
- selector: td.embedded:has(h2:contains("failed"))
|
||||
test:
|
||||
path: browse.php
|
||||
|
||||
search:
|
||||
path: browse.php
|
||||
inputs:
|
||||
$raw: "{{range .Categories}}c{{.}}=1&{{end}}"
|
||||
search: "{{ .Query.Keywords }}"
|
||||
incldead: 1
|
||||
rows:
|
||||
selector: td > table > tbody > tr:has(a[href^="details.php?id="])
|
||||
fields:
|
||||
download:
|
||||
selector: a[href^="download.php/"]
|
||||
attribute: href
|
||||
title:
|
||||
selector: a[href^="details.php?id="]
|
||||
description:
|
||||
selector: td:nth-child(2) > strong
|
||||
details:
|
||||
selector: a[href^="details.php?id="]
|
||||
attribute: href
|
||||
category:
|
||||
selector: a[href^="browse.php?cat="]
|
||||
attribute: href
|
||||
filters:
|
||||
- name: querystring
|
||||
args: cat
|
||||
seeders:
|
||||
selector: td:nth-child(7)
|
||||
leechers:
|
||||
selector: td:nth-child(8)
|
||||
grabs:
|
||||
selector: td:nth-child(6)
|
||||
filters:
|
||||
- name: regexp
|
||||
args: ([\d,]+)
|
||||
files:
|
||||
selector: td:nth-child(3)
|
||||
size:
|
||||
selector: td:nth-child(5)
|
||||
downloadvolumefactor:
|
||||
case:
|
||||
tr[bgcolor="#FFF6CB"]: "0"
|
||||
img[alt^="Goodie.. Download for free!"]: "0"
|
||||
"*": "1"
|
||||
uploadvolumefactor:
|
||||
case:
|
||||
"*": "1"
|
132
src/Jackett/Definitions/bithumen.yml
Normal file
@@ -0,0 +1,132 @@
|
||||
---
|
||||
site: bithumen
|
||||
name: BitHUmen
|
||||
language: hu-hu
|
||||
encoding: ISO-8859-2
|
||||
links:
|
||||
- https://bithumen.be/
|
||||
|
||||
caps:
|
||||
categories:
|
||||
23: Movies/SD # Film/Hun/SD
|
||||
24: Movies/DVD # Film/Hun/DVD-R
|
||||
25: Movies/HD # Film/Hun/720p
|
||||
37: Movies/HD # Film/Hun/1080p
|
||||
33: Movies/BluRay # Film/Hun/Blu-ray
|
||||
30: XXX # XXX/SD
|
||||
19: Movies/SD # Film/Eng/SD
|
||||
20: Movies/DVD # Film/Eng/DVD-R
|
||||
5: Movies/HD # Film/Eng/720p
|
||||
39: Movies/HD # Film/Eng/1080p
|
||||
40: Movies/BluRay # Film/Eng/Blu-ray
|
||||
34: XXX # XXX/HD
|
||||
7: TV/SD # Sorozat/Hun/SD
|
||||
41: TV/HD # Sorozat/Hun/HD
|
||||
26: TV/SD # Sorozat/Eng/SD
|
||||
42: TV/HD # Sorozat/Eng/HD
|
||||
28: Books # eBook/Hun
|
||||
29: Books # eBook/Eng
|
||||
9: Audio/MP3 # Mp3/Hun
|
||||
35: Audio/Lossless # Lossless/Hun
|
||||
1: PC/0day # Programok/ISO
|
||||
4: PC/Games # Játékok/ISO
|
||||
31: Console/PS4 # Játékok/PS
|
||||
36: Console/Wii # Játékok/Wii
|
||||
6: Audio/MP3 # Mp3/Eng
|
||||
38: Audio/Lossless # Lossless/Eng
|
||||
22: PC # Programok/egyéb
|
||||
21: PC # Játékok/Rip/Dox
|
||||
32: Console/Xbox360 # Játékok/Xbox360
|
||||
27: Other # Klipek
|
||||
|
||||
modes:
|
||||
search: [q]
|
||||
tv-search: [q, season, ep]
|
||||
|
||||
login:
|
||||
path: takelogin.php
|
||||
method: post
|
||||
inputs:
|
||||
username: "{{ .Config.username }}"
|
||||
password: "{{ .Config.password }}"
|
||||
error:
|
||||
- selector: td.embedded:has(h2:contains("bejelentkezés"))
|
||||
test:
|
||||
path: browse.php
|
||||
|
||||
search:
|
||||
path: browse.php
|
||||
inputs:
|
||||
$raw: "{{range .Categories}}c{{.}}=1&{{end}}"
|
||||
search: "{{ .Query.Keywords }}"
|
||||
incldead: 1
|
||||
rows:
|
||||
selector: table#torrenttable > tbody > tr:has(a[href^="details.php?id="])
|
||||
filters:
|
||||
- name: andmatch
|
||||
fields:
|
||||
download:
|
||||
selector: a[href^="download.php/"]
|
||||
attribute: href
|
||||
title:
|
||||
selector: a[href^="details.php?id="]
|
||||
title|optional:
|
||||
selector: a[href^="details.php?id="]
|
||||
attribute: title
|
||||
details:
|
||||
selector: a[href^="details.php?id="]
|
||||
attribute: href
|
||||
imdb:
|
||||
selector: a[href^="http://anonym.to/?http://www.imdb.com/title/"]
|
||||
attribute: href
|
||||
banner:
|
||||
selector: a[onmouseover^="bithumen.UI.images.coverShow"]
|
||||
attribute: onmouseover
|
||||
filters:
|
||||
- name: regexp
|
||||
args: "\"(.*?)\""
|
||||
category:
|
||||
selector: a[href^="?cat="]
|
||||
attribute: href
|
||||
filters:
|
||||
- name: querystring
|
||||
args: cat
|
||||
seeders:
|
||||
selector: td:nth-child(8)
|
||||
leechers:
|
||||
selector: td:nth-child(9)
|
||||
filters:
|
||||
- name: regexp
|
||||
args: /\s*([\d,]+)
|
||||
grabs:
|
||||
selector: td:nth-child(7)
|
||||
files:
|
||||
selector: td:nth-child(3)
|
||||
size:
|
||||
selector: td:nth-child(6) > u
|
||||
downloadvolumefactor:
|
||||
text: "1"
|
||||
downloadvolumefactor|optional:
|
||||
selector: td:nth-child(6) > nobr > font:contains(" × ")
|
||||
filters:
|
||||
- name: replace
|
||||
args: ["×", ""]
|
||||
uploadvolumefactor:
|
||||
text: "1"
|
||||
uploadvolumefactor|optional:
|
||||
selector: td:nth-child(5) > nobr > font:contains(" × ")
|
||||
filters:
|
||||
- name: replace
|
||||
args: ["×", ""]
|
||||
date:
|
||||
selector: td:nth-child(5)
|
||||
remove: font
|
||||
filters:
|
||||
- name: replace
|
||||
args: ["ma", "today"]
|
||||
- name: replace
|
||||
args: ["tegnap", "yesterday"]
|
||||
|
||||
description:
|
||||
selector: td:nth-child(2) > div
|
||||
|
132
src/Jackett/Definitions/bitspyder.yml
Normal file
@@ -0,0 +1,132 @@
|
||||
---
|
||||
site: bitspyder
|
||||
name: Bitspyder
|
||||
language: en-us
|
||||
encoding: windows-1252
|
||||
links:
|
||||
- http://bitspyder.net/
|
||||
|
||||
caps:
|
||||
categories:
|
||||
61: Books # 3D
|
||||
69: Books # Anim|GFX
|
||||
56: Books # Art
|
||||
40: Audio/Audiobook # Audio Books
|
||||
55: Books # Business
|
||||
46: Books # Career
|
||||
2: Books # CBTs
|
||||
39: Books # Cert QA
|
||||
63: Books # College
|
||||
53: Books # Cooking
|
||||
42: Books # Documentary
|
||||
37: Books # e-Books
|
||||
65: Books # Engineering
|
||||
54: Books # Health-Fitness
|
||||
64: Books # Kids
|
||||
47: Books # Languages
|
||||
49: Books # Linux CBTs
|
||||
43: Books # Lynda.com
|
||||
57: Books/Magazines # Magazines
|
||||
71: Books # Magic
|
||||
60: Books # Medical
|
||||
44: Books # Misc Learning
|
||||
51: Books # Music Learning
|
||||
41: Books # Others
|
||||
52: Books # Photography
|
||||
35: Books # PPT 'n Docs
|
||||
38: Books # Religion
|
||||
68: Books # Self Growth
|
||||
72: Books # Templates
|
||||
58: Books # Total Training
|
||||
45: Books # Trainsignal
|
||||
59: Books # VTC
|
||||
|
||||
|
||||
modes:
|
||||
search: [q]
|
||||
tv-search: [q, season, ep]
|
||||
|
||||
login:
|
||||
path: processid.php
|
||||
method: post
|
||||
inputs:
|
||||
username: "{{ .Config.username }}"
|
||||
password: "{{ .Config.password }}"
|
||||
error:
|
||||
- selector: td.msg_info > font > b
|
||||
test:
|
||||
path: /browse.php
|
||||
|
||||
search:
|
||||
path: /browse.php
|
||||
method: post
|
||||
inputs:
|
||||
search: "{{ .Query.Keywords }}"
|
||||
incldead: "1"
|
||||
rows:
|
||||
selector: table > tbody > tr[class]
|
||||
filters:
|
||||
- name: andmatch
|
||||
fields:
|
||||
# there are two styles, we support both
|
||||
title:
|
||||
selector: a[href^="details.php?id="]
|
||||
category:
|
||||
selector: a[href^="browse.php?cat="]
|
||||
attribute: href
|
||||
filters:
|
||||
- name: querystring
|
||||
args: cat
|
||||
details:
|
||||
selector: a[href^="details.php?id="]
|
||||
attribute: href
|
||||
download:
|
||||
selector: a[href^="details.php?id="]
|
||||
attribute: href
|
||||
filters:
|
||||
- name: replace
|
||||
args: ["details.php?id=", "download.php/"]
|
||||
- name: replace
|
||||
args: ["&hit=1", "/dummy.torrent"]
|
||||
size:
|
||||
selector: td.rowcol:nth-child(6):has(br), font:contains("Size:") + font
|
||||
files:
|
||||
selector: a[href*="&filelist=1"]
|
||||
grabs:
|
||||
selector: td.rowcol:nth-child(7):contains("times"), font:contains("Snatches:")
|
||||
filters:
|
||||
- name: regexp
|
||||
args: ([\d\,]+)
|
||||
seeders:
|
||||
selector: td.rowcol:nth-last-child(3)
|
||||
leechers:
|
||||
selector: td.rowcol:nth-last-child(2)
|
||||
date|optional|1:
|
||||
selector: font[color="5F5F5F"]
|
||||
filters:
|
||||
- name: split
|
||||
args: [" (", 0]
|
||||
- name: replace
|
||||
args: ["\xA0", " "]
|
||||
- name: append
|
||||
args: " +00:00"
|
||||
- name: dateparse
|
||||
args: "2006-01-02 15:04:05 -07:00"
|
||||
date|optional|2:
|
||||
selector: a[title^="Upploaded at"]
|
||||
attribute: title
|
||||
filters:
|
||||
- name: replace
|
||||
args: ["Upploaded at - ", ""]
|
||||
- name: append
|
||||
args: " +00:00"
|
||||
- name: dateparse
|
||||
args: "2006-01-02 15:04:05 -07:00"
|
||||
downloadvolumefactor:
|
||||
case:
|
||||
"*": "1"
|
||||
uploadvolumefactor:
|
||||
case:
|
||||
"*": "1"
|
||||
description|optional:
|
||||
selector: font[color="#990000"]
|
147
src/Jackett/Definitions/blubits.yml
Normal file
@@ -0,0 +1,147 @@
|
||||
---
|
||||
site: blubits
|
||||
name: Blu-bits
|
||||
description: "A HD tracker"
|
||||
language: en-us
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- https://blu-bits.com/
|
||||
|
||||
caps:
|
||||
categories:
|
||||
# Movies
|
||||
14: Movies/BluRay # Full Blu-ray
|
||||
54: Movies/HD # HD-DVD
|
||||
16: Movies/HD # Remux
|
||||
55: Movies/HD # 2160p
|
||||
15: Movies/HD # 1080p
|
||||
19: Movies/HD # 1080i
|
||||
18: Movies/HD # 720p
|
||||
|
||||
# Documentaries
|
||||
21: Movies/BluRay # Full Blu-ray
|
||||
39: Movies/HD # Remux
|
||||
56: Movies/HD # 2160p
|
||||
23: Movies/HD # 1080p
|
||||
24: Movies/HD # 1080i
|
||||
25: Movies/HD # 720p
|
||||
|
||||
# TV Series
|
||||
27: TV/HD # Full Blu-ray
|
||||
40: TV/HD # Remux
|
||||
28: TV/HD # 1080p
|
||||
29: TV/HD # 1080i
|
||||
30: TV/HD # 720p
|
||||
|
||||
# HDTV
|
||||
35: TV/HD # 1080i
|
||||
36: TV/HD # 720p
|
||||
|
||||
# XXX
|
||||
59: XXX # Full Blu-ray
|
||||
46: XXX # 1080p
|
||||
51: XXX # 720p
|
||||
|
||||
# Music
|
||||
53: Audio/Video # Full Blu-ray
|
||||
57: Audio/Video # Remux
|
||||
45: Audio/Video # 1080p
|
||||
58: Audio/Video # 720p
|
||||
38: Audio/Lossless # Flac
|
||||
|
||||
41: TV/Sport # Sports
|
||||
42: TV/Anime # Anime
|
||||
44: PC # Windows Apps
|
||||
|
||||
modes:
|
||||
search: [q]
|
||||
tv-search: [q, season, ep]
|
||||
|
||||
login:
|
||||
path: index.php?page=login
|
||||
method: post
|
||||
inputs:
|
||||
uid: "{{ .Config.username }}"
|
||||
pwd: "{{ .Config.password }}"
|
||||
error:
|
||||
- selector: table.lista > tbody > tr > td.lista > span[style="color:#FF0000;"]
|
||||
test:
|
||||
path: index.php
|
||||
selector: ul#navlist
|
||||
|
||||
ratio:
|
||||
path: index.php
|
||||
selector: "ul#navlist > li:contains(\"Ratio: \")"
|
||||
filters:
|
||||
- name: split
|
||||
args: ["\u00a0", 1]
|
||||
- name: replace
|
||||
args: ["---", "0"]
|
||||
|
||||
search:
|
||||
path: index.php
|
||||
inputs:
|
||||
search: "{{ .Query.Keywords }}"
|
||||
page: torrents
|
||||
options: 0
|
||||
active: 0
|
||||
rows:
|
||||
selector: div.b-content > table.lista > tbody > tr:has(a[href^="index.php?page=torrents&category="])
|
||||
fields:
|
||||
download:
|
||||
selector: a[href^="download.php?id="]
|
||||
attribute: href
|
||||
title:
|
||||
selector: a[href^="index.php?page=torrent-details&id="]
|
||||
attribute: title
|
||||
filters:
|
||||
- name: replace
|
||||
args: ["View details: ", ""]
|
||||
category:
|
||||
selector: a[href^="index.php?page=torrents&category="]
|
||||
attribute: href
|
||||
filters:
|
||||
- name: querystring
|
||||
args: category
|
||||
comments:
|
||||
selector: a[href^="index.php?page=torrent-details&id="]
|
||||
attribute: href
|
||||
size:
|
||||
selector: p
|
||||
filters:
|
||||
- name: replace
|
||||
args: ["\u00a0", ""]
|
||||
- name: regexp
|
||||
args: "\\|\\s+Size:\\s+([\\w\\d\\.,]+ \\w\\w)\\s+\\|"
|
||||
date:
|
||||
selector: a[href^="index.php?page=torrent-details&id="]
|
||||
attribute: onmouseover
|
||||
filters:
|
||||
- name: regexp
|
||||
args: "<center>Added:(.*?)</center>"
|
||||
grabs:
|
||||
selector: a[href^="index.php?page=torrent_history&id="]
|
||||
filters:
|
||||
- name: replace
|
||||
args: ["---", "0"]
|
||||
seeders:
|
||||
selector: a[title="Click here to view peers details"]:nth-child(1)
|
||||
leechers:
|
||||
selector: a[title="Click here to view peers details"]:nth-child(2)
|
||||
downloadvolumefactor:
|
||||
case:
|
||||
img[alt="gold"]: "0"
|
||||
img[alt="silver"]: "0.5"
|
||||
"*": "1"
|
||||
uploadvolumefactor:
|
||||
case:
|
||||
img[alt="2x Upload Multiplier"]: "2"
|
||||
img[alt="3x Upload Multiplier"]: "3"
|
||||
img[alt="4x Upload Multiplier"]: "4"
|
||||
img[alt="5x Upload Multiplier"]: "5"
|
||||
img[alt="6x Upload Multiplier"]: "6"
|
||||
img[alt="7x Upload Multiplier"]: "7"
|
||||
img[alt="8x Upload Multiplier"]: "8"
|
||||
img[alt="9x Upload Multiplier"]: "9"
|
||||
img[alt="10x Upload Multiplier"]: "10"
|
||||
"*": "1"
|
101
src/Jackett/Definitions/chdbits.yml
Normal file
@@ -0,0 +1,101 @@
|
||||
---
|
||||
site: chdbits
|
||||
name: CHDBits
|
||||
description: "A general tracker"
|
||||
language: zh-cn
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- https://chdbits.co
|
||||
|
||||
caps:
|
||||
categories:
|
||||
401: Movies # Movies
|
||||
404: TV/Documentary # Documentaries
|
||||
405: TV/Anime # Animations
|
||||
402: TV # TV Series
|
||||
403: TV # TV Shows
|
||||
406: Audio/Video # Music Videos
|
||||
407: TV/Sport # Sports
|
||||
409: Other # Misc
|
||||
408: Audio # HQ Audio
|
||||
|
||||
modes:
|
||||
search: [q]
|
||||
tv-search: [q, season, ep]
|
||||
|
||||
login:
|
||||
path: /takelogin.php
|
||||
method: post
|
||||
inputs:
|
||||
username: "{{ .Config.username }}"
|
||||
password: "{{ .Config.password }}"
|
||||
error:
|
||||
- selector: td.embedded:has(h2:contains("failed"))
|
||||
test:
|
||||
path: /torrents.php
|
||||
|
||||
ratio:
|
||||
path: /torrents.php
|
||||
selector: table#info_block
|
||||
filters:
|
||||
- name: regexp
|
||||
args: "Ratio:\\s(.*?)\\s\\s"
|
||||
|
||||
search:
|
||||
path: /torrents.php
|
||||
method: post
|
||||
inputs:
|
||||
$raw: "{{range .Categories}}cat{{.}}=1&{{end}}"
|
||||
search: "{{ .Query.Keywords }}"
|
||||
incldead: "1"
|
||||
rows:
|
||||
selector: table.torrents > tbody > tr:has(table.torrentname)
|
||||
fields:
|
||||
title:
|
||||
selector: a[title][href^="details.php?id="]
|
||||
attribute: title
|
||||
category:
|
||||
selector: a[href^="?cat="]
|
||||
attribute: href
|
||||
filters:
|
||||
- name: querystring
|
||||
args: cat
|
||||
details:
|
||||
selector: a[title][href^="details.php?id="]
|
||||
attribute: href
|
||||
download:
|
||||
selector: a[href^="download.php?id="]
|
||||
attribute: href
|
||||
size:
|
||||
selector: td:nth-child(5)
|
||||
grabs:
|
||||
selector: td:nth-child(8)
|
||||
seeders:
|
||||
selector: td:nth-child(6)
|
||||
leechers:
|
||||
selector: td:nth-child(7)
|
||||
date:
|
||||
selector: td:nth-child(4) > span[title]
|
||||
attribute: title
|
||||
filters:
|
||||
- name: append
|
||||
args: " +08:00"
|
||||
- name: dateparse
|
||||
args: "2006-01-02 15:04:05 -07:00"
|
||||
downloadvolumefactor:
|
||||
case:
|
||||
img.pro_free: "0"
|
||||
img.pro_free2up: "0"
|
||||
img.pro_50pctdown: "0.5"
|
||||
img.pro_50pctdown2up: "0.5"
|
||||
img.pro_30pctdown: "0.3"
|
||||
"*": "1"
|
||||
uploadvolumefactor:
|
||||
case:
|
||||
img.pro_50pctdown2up: "2"
|
||||
img.pro_free2up: "2"
|
||||
img.pro_2up: "2"
|
||||
"*": "1"
|
||||
description:
|
||||
selector: td:nth-child(2)
|
||||
remove: a, img
|
118
src/Jackett/Definitions/datascene.yml
Normal file
@@ -0,0 +1,118 @@
|
||||
---
|
||||
site: datascene
|
||||
name: DataScene
|
||||
language: ro-ro
|
||||
encoding: windows-1252
|
||||
links:
|
||||
- http://datascene.net/
|
||||
|
||||
caps:
|
||||
categories:
|
||||
3: TV/Anime # Anime | Cartoon
|
||||
15: PC/0day # Appz | Win
|
||||
4: PC/0day # Appz | Linux
|
||||
6: Books # E-Book
|
||||
10: PC/Games # Games | PC Iso
|
||||
9: PC/Games # Games | PC Rips
|
||||
11: Console # Games | Pack
|
||||
43: Console # Games | Console
|
||||
29: Other # Images
|
||||
2: Other # MiSC
|
||||
5: PC/Phone-Other # Mobile
|
||||
27: Movies # Movies | Pack
|
||||
46: Movies/3D # Movies | 3D
|
||||
26: Movies/SD # Movies | Cam
|
||||
25: Movies # Movies | Documentary
|
||||
24: Movies/DVD # Movies | DVD-R
|
||||
32: Movies/DVD # Movies | DVD-RO
|
||||
23: Movies/HD # Movies | HD
|
||||
31: Movies/HD # Movies | HD-Ro
|
||||
34: Movies/Foreign # Movies | Hindi
|
||||
30: Movies/SD # Movies | Xvid
|
||||
36: Movies/SD # Movies | Xvid-Ro
|
||||
21: Audio/Video # Music | Video
|
||||
19: Audio # Music | Mp3/Flac
|
||||
18: Other # Other
|
||||
42: Other # Premiera | DsT
|
||||
14: TV/Sport # Sport
|
||||
47: TV/SD # Tv | Episodes
|
||||
28: TV/HD # Tv-HD | Episodes
|
||||
13: Other # Tutoriale
|
||||
12: XXX # XxX
|
||||
|
||||
modes:
|
||||
search: [q]
|
||||
tv-search: [q, season, ep]
|
||||
|
||||
login:
|
||||
path: /takelogin.php
|
||||
method: post
|
||||
inputs:
|
||||
username: "{{ .Config.username }}"
|
||||
password: "{{ .Config.password }}"
|
||||
error:
|
||||
- selector: td.embedded:has(h2:contains("failed"))
|
||||
test:
|
||||
path: /browse.php
|
||||
|
||||
ratio:
|
||||
path: /browse.php
|
||||
selector: font:contains("Ratio:") > span
|
||||
|
||||
search:
|
||||
path: /browse.php
|
||||
inputs:
|
||||
$raw: "{{range .Categories}}c{{.}}=1&{{end}}"
|
||||
search: "{{ .Query.Keywords }}"
|
||||
incldead: 1
|
||||
rows:
|
||||
selector: tr:has(a.tname)
|
||||
fields:
|
||||
title:
|
||||
selector: a.tname
|
||||
attribute: title
|
||||
details:
|
||||
selector: a.tname
|
||||
attribute: href
|
||||
category:
|
||||
selector: a[href^="browse.php?cat="]
|
||||
attribute: href
|
||||
filters:
|
||||
- name: querystring
|
||||
args: cat
|
||||
download:
|
||||
selector: a[href^="/download.php/"]
|
||||
attribute: href
|
||||
grabs:
|
||||
selector: td:nth-child(7)
|
||||
filters:
|
||||
- name: regexp
|
||||
args: (\d+)
|
||||
size:
|
||||
selector: td:nth-child(6)
|
||||
date:
|
||||
selector: td:nth-child(2) > right > div:has(font:contains("Uploaded"))
|
||||
remove: div > font
|
||||
filters:
|
||||
- name: trim
|
||||
args: ":"
|
||||
seeders:
|
||||
selector: td:nth-child(8)
|
||||
leechers:
|
||||
selector: td:nth-child(9)
|
||||
banner:
|
||||
selector: a.tname
|
||||
attribute: onmouseover
|
||||
filters:
|
||||
- name: regexp
|
||||
args: src=([^\s]+)
|
||||
downloadvolumefactor:
|
||||
case:
|
||||
"img[src=\"pic/free.gif\"]": "0"
|
||||
"*": "1"
|
||||
uploadvolumefactor:
|
||||
case:
|
||||
"*": "1"
|
||||
description:
|
||||
selector: td:nth-child(2) > right
|
||||
remove: div
|
177
src/Jackett/Definitions/eotforum.yml
Normal file
@@ -0,0 +1,177 @@
|
||||
---
|
||||
site: eotforum
|
||||
name: EoT-Forum
|
||||
description: "A German gerneral tracker"
|
||||
language: de-de
|
||||
encoding: windows-1252
|
||||
links:
|
||||
- http://eot-forum.net
|
||||
|
||||
caps:
|
||||
categories:
|
||||
# Filme
|
||||
14: Movies/SD # SD XviD
|
||||
15: Movies/SD # SD x264
|
||||
16: Movies/HD # HD
|
||||
68: Movies/HD # UHD
|
||||
17: Movies/3D # 3D
|
||||
18: Movies/DVD # DVD-R
|
||||
19: Movies # Pack
|
||||
20: Movies # International
|
||||
21: XXX # XXX
|
||||
|
||||
# Serien/TV
|
||||
23: TV/SD # SD XviD
|
||||
24: TV/SD # SD x264
|
||||
25: TV/HD # HD
|
||||
26: TV/SD # DVD-R
|
||||
27: TV # Pack
|
||||
28: TV # International
|
||||
29: TV/Sport # Sport
|
||||
|
||||
# Dokus
|
||||
31: TV/Documentary # SD XviD
|
||||
32: TV/Documentary # SD x264
|
||||
33: TV/Documentary # HD
|
||||
34: TV/Documentary # 3D
|
||||
35: TV/Documentary # Pack
|
||||
67: TV/Documentary # DVD-R
|
||||
36: TV/Documentary # International
|
||||
|
||||
# Audio
|
||||
38: Audio # Charts
|
||||
39: Audio/MP3 # MP3
|
||||
40: Audio/Lossless # Flac
|
||||
41: Audio # Pack
|
||||
42: Audio/Video # MusikVideo
|
||||
43: Audio/Audiobook # Hörbücher
|
||||
|
||||
# Spiele
|
||||
45: PC/Games # Windows
|
||||
46: PC/Mac # MacOS
|
||||
47: Console/PS4 # Sony PS
|
||||
48: Console/Xbox # Microsoft XBox
|
||||
49: Console/NDS # Nintendo
|
||||
50: PC/Games # Linux
|
||||
51: Console # Andere
|
||||
|
||||
# Software
|
||||
53: PC # Windows
|
||||
54: PC/Mac # MacOS
|
||||
55: PC # Linux
|
||||
56: PC/Phone-Android # Android
|
||||
57: PC/Phone-IOS # Apple IOS
|
||||
58: PC/Phone-Other # Andere
|
||||
|
||||
# Sonstiges
|
||||
60: Books # EBooks
|
||||
61: Other # Bilder
|
||||
62: TV/Anime # Anime
|
||||
63: Other # MISC
|
||||
64: XXX # XXX-Bilder/EBooks/Audio
|
||||
|
||||
# EOT-Specials
|
||||
66: Other # Special
|
||||
|
||||
modes:
|
||||
search: [q]
|
||||
tv-search: [q, season, ep]
|
||||
|
||||
login:
|
||||
path: index.php?page=login
|
||||
method: post
|
||||
inputs:
|
||||
uid: "{{ .Config.username }}"
|
||||
pwd: "{{ .Config.password }}"
|
||||
rememberme: "forever"
|
||||
submit: "Login"
|
||||
error:
|
||||
- selector: td.lista[align="center"][colspan="2"] > span
|
||||
test:
|
||||
path: index.php
|
||||
selector: img[alt="Ratio"]
|
||||
|
||||
ratio:
|
||||
path: index.php
|
||||
selector: img[alt="Ratio"] + font
|
||||
|
||||
search:
|
||||
path: index.php
|
||||
inputs:
|
||||
page: "torrents"
|
||||
search: "{{ .Query.Keywords }}"
|
||||
options: "0"
|
||||
active: "0"
|
||||
gold: "0"
|
||||
rows:
|
||||
selector: table.lista > tbody > tr:has(a[href^="index.php?page=torrent-details&id="])
|
||||
dateheaders:
|
||||
selector: ":has(td.header > b)"
|
||||
filters:
|
||||
- name: replace
|
||||
args: ["Torrents vom ", ""]
|
||||
- name: replace
|
||||
args: ["Januar", "January"]
|
||||
- name: replace
|
||||
args: ["Februar", "February"]
|
||||
- name: replace
|
||||
args: ["March", "März"]
|
||||
- name: replace
|
||||
args: ["Mai", "May"]
|
||||
- name: replace
|
||||
args: ["Juni", "June"]
|
||||
- name: replace
|
||||
args: ["Juli", "July"]
|
||||
- name: replace
|
||||
args: ["Oktober", "October"]
|
||||
- name: replace
|
||||
args: ["Dezember", "December"]
|
||||
- name: dateparse
|
||||
args: "02.January.2006"
|
||||
fields:
|
||||
download:
|
||||
selector: a[href^="download.php?id="]
|
||||
attribute: href
|
||||
title:
|
||||
selector: a[href^="index.php?page=torrent-details&id="]
|
||||
attribute: title
|
||||
filters:
|
||||
- name: replace
|
||||
args: ["Details anzeigen: ", ""]
|
||||
category:
|
||||
selector: a[href^="index.php?page=torrents&category="]
|
||||
attribute: href
|
||||
filters:
|
||||
- name: querystring
|
||||
args: category
|
||||
comments:
|
||||
selector: a[href*="#comments"]
|
||||
attribute: href
|
||||
size:
|
||||
selector: td:nth-child(3)
|
||||
grabs:
|
||||
selector: td:nth-child(5) > font:nth-child(3)
|
||||
filters:
|
||||
- name: replace
|
||||
args: ["---", "0"]
|
||||
seeders:
|
||||
selector: td:nth-child(5) > font:nth-child(1)
|
||||
leechers:
|
||||
selector: td:nth-child(5) > font:nth-child(2)
|
||||
downloadvolumefactor:
|
||||
case:
|
||||
img[alt="gold"]: "0"
|
||||
img[alt="silver"]: "0.5"
|
||||
"*": "1"
|
||||
uploadvolumefactor:
|
||||
case:
|
||||
img[alt="2x Upload Multiplier"]: "2"
|
||||
img[alt="3x Upload Multiplier"]: "3"
|
||||
img[alt="4x Upload Multiplier"]: "4"
|
||||
img[alt="5x Upload Multiplier"]: "5"
|
||||
img[alt="6x Upload Multiplier"]: "6"
|
||||
img[alt="7x Upload Multiplier"]: "7"
|
||||
img[alt="8x Upload Multiplier"]: "8"
|
||||
img[alt="9x Upload Multiplier"]: "9"
|
||||
img[alt="10x Upload Multiplier"]: "10"
|
||||
"*": "1"
|
118
src/Jackett/Definitions/estone.yml
Normal file
@@ -0,0 +1,118 @@
|
||||
---
|
||||
site: estone
|
||||
name: eStone
|
||||
language: hu-hu
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- http://estone.cc/
|
||||
|
||||
caps:
|
||||
categories:
|
||||
24: Movies/SD # Film/XviD/Hun
|
||||
38: Movies/SD # Film/XviD/Eng
|
||||
51: Movies/SD # Film/SD/Hun
|
||||
52: Movies/SD # Film/SD/Eng
|
||||
25: Movies/DVD # Film/DVD/Hun
|
||||
26: Movies/DVD # Film/DVD/Eng
|
||||
42: Movies/HD # Film/HD/Hun
|
||||
50: Movies/HD # Film/HD/Eng
|
||||
36: TV # Sorozat/Hun
|
||||
47: TV # Sorozat/Eng
|
||||
41: Audio/MP3 # Mp3/Hun
|
||||
40: Audio/MP3 # Mp3/Eng
|
||||
35: PC/0day # Program
|
||||
28: PC/Games # Játék/ISO
|
||||
30: PC/Games # Játék/Rip
|
||||
32: Console # Konzol
|
||||
34: PC/Phone-Other # Mobil
|
||||
44: Books # Könyv/Hun
|
||||
33: Books # Könyv/Eng
|
||||
31: Other # Képek
|
||||
39: XXX # XXX/Film
|
||||
49: XXX/Imageset # XXX/Kép
|
||||
|
||||
modes:
|
||||
search: [q]
|
||||
tv-search: [q, season, ep]
|
||||
|
||||
login:
|
||||
path: login.php
|
||||
method: post
|
||||
inputs:
|
||||
login_username: "{{ .Config.username }}"
|
||||
login_password: "{{ .Config.password }}"
|
||||
error:
|
||||
- selector: script:contains("hiba(\"")
|
||||
message:
|
||||
selector: script:contains("hiba(\"")
|
||||
filters:
|
||||
- name: replace
|
||||
args: ["hiba(\"", ""]
|
||||
- name: replace
|
||||
args: ["\");", ""]
|
||||
test:
|
||||
path: /letoltes.php
|
||||
|
||||
search:
|
||||
path: /letoltes.php
|
||||
method: get
|
||||
inputs:
|
||||
$raw: "{{range .Categories}}kat[]={{.}}&{{end}}"
|
||||
kereses_nev: "{{ .Query.Keywords }}"
|
||||
rows:
|
||||
selector: body > div[id^="torrent_"]
|
||||
fields:
|
||||
title:
|
||||
selector: a[title]
|
||||
attribute: title
|
||||
category:
|
||||
selector: div#kategoria_torrent > a
|
||||
attribute: href
|
||||
filters:
|
||||
- name: querystring
|
||||
args: cat
|
||||
details:
|
||||
attribute: id
|
||||
filters:
|
||||
- name: replace
|
||||
args: ["torrent_", "adatlap.php?id="]
|
||||
download:
|
||||
attribute: id
|
||||
filters:
|
||||
- name: replace
|
||||
args: ["torrent_", "download.php?id="]
|
||||
banner:
|
||||
selector: img[onmouseover]
|
||||
attribute: onmouseover
|
||||
filters:
|
||||
- name: regexp
|
||||
args: borito\("(.*?) +?",
|
||||
size:
|
||||
selector: input[id^="meret_"]
|
||||
attribute: value
|
||||
grabs:
|
||||
selector: div:nth-child(8) > div
|
||||
seeders:
|
||||
selector: div:nth-child(6) > div > a
|
||||
leechers:
|
||||
selector: div:nth-child(7) > div > a
|
||||
date:
|
||||
selector: div:nth-child(4)
|
||||
filters:
|
||||
- name: split
|
||||
args: ["(", 0]
|
||||
- name: append
|
||||
args: "+01:00"
|
||||
- name: dateparse
|
||||
args: "2006-01-02 15:04:05 -07:00"
|
||||
downloadvolumefactor:
|
||||
case:
|
||||
img[src="pic/free.png"]: "0"
|
||||
"*": "1"
|
||||
uploadvolumefactor:
|
||||
case:
|
||||
img[src="pic/dupla_up.png"]: "2"
|
||||
"*": "1"
|
||||
description:
|
||||
selector: div:nth-child(2)
|
||||
remove: a
|
117
src/Jackett/Definitions/ethor.yml
Normal file
@@ -0,0 +1,117 @@
|
||||
---
|
||||
site: ethor
|
||||
name: Ethor.net (Thor's Land)
|
||||
description: "A French gerneral tracker"
|
||||
language: fr-fr
|
||||
encoding: windows-1252
|
||||
links:
|
||||
- https://ethor.net/
|
||||
|
||||
caps:
|
||||
categories:
|
||||
22: PC # Applications/Divers
|
||||
1: PC # Applications/PC ISO
|
||||
44: PC # Applications/Portable
|
||||
47: Movies/BluRay # Films/Bluray
|
||||
20: Movies/DVD # Films/DVDr
|
||||
42: Movies/HD # Films/HD Rip
|
||||
19: Movies/SD # Films/SD Rip
|
||||
5: Movies/SD # Films/VCD
|
||||
4: PC/Games # Jeux/PC
|
||||
41: Console # Jeux/Portable
|
||||
34: Console/PS4 # Jeux/PS2-PS3
|
||||
38: Console/Wii # Jeux/Wii-GC
|
||||
40: Console/Xbox # Jeux/Xbox360
|
||||
6: Audio # Musique
|
||||
37: Audio/Video # Musique/Video
|
||||
48: TV/HD # Série-Télé/Bluray
|
||||
45: TV/SD # Série-Télé/DVDr
|
||||
43: TV/HD # Série-Télé/HD Rip
|
||||
7: TV/SD # Série-Télé/SD Rip
|
||||
23: Books # E-Books
|
||||
46: Other # Évé. sportif
|
||||
36: Other # Kidz
|
||||
25: Other # Misc
|
||||
9: XXX # XXX
|
||||
|
||||
modes:
|
||||
search: [q]
|
||||
tv-search: [q, season, ep]
|
||||
|
||||
login:
|
||||
path: login3.php
|
||||
method: form
|
||||
form: form[action="login3.php?takelogin=1"]
|
||||
captcha:
|
||||
type: image
|
||||
image: img#validationimage
|
||||
input: validationcode
|
||||
inputs:
|
||||
username: "{{ .Config.username }}"
|
||||
password: "{{ .Config.password }}"
|
||||
secure_cookie: "0"
|
||||
test:
|
||||
path: browse.php
|
||||
|
||||
ratio:
|
||||
path: browse.php
|
||||
selector: span#ratioRatio
|
||||
|
||||
search:
|
||||
path: browse.php
|
||||
inputs:
|
||||
$raw: "{{range .Categories}}c{{.}}=1&{{end}}"
|
||||
search: "{{ .Query.Keywords }}"
|
||||
advcat: "0"
|
||||
incldead: "1"
|
||||
stype: "b"
|
||||
dp: "0"
|
||||
isUserClick: "0"
|
||||
rows:
|
||||
selector: p + table > tbody > tr:has(a[href^="/details.php"])
|
||||
fields:
|
||||
download:
|
||||
selector: a[href^="/details.php"]:has(b)
|
||||
attribute: href
|
||||
filters:
|
||||
- name: replace
|
||||
args: ["/details.php", "/download.php"]
|
||||
title:
|
||||
selector: a[href^="/details.php"]:has(b)
|
||||
category:
|
||||
selector: a[href^="/browse.php?cat="]
|
||||
attribute: href
|
||||
filters:
|
||||
- name: querystring
|
||||
args: cat
|
||||
comments:
|
||||
selector: a[href^="/details.php"]:has(b)
|
||||
attribute: href
|
||||
files:
|
||||
selector: a[href*="#filelist"]
|
||||
size:
|
||||
selector: td:nth-child(6)
|
||||
grabs:
|
||||
selector: td:nth-child(7)
|
||||
filters:
|
||||
- name: regexp
|
||||
args: "(\\d+)"
|
||||
seeders:
|
||||
selector: td:nth-child(8)
|
||||
leechers:
|
||||
selector: td:nth-child(9)
|
||||
date:
|
||||
selector: td:nth-child(5)
|
||||
filters:
|
||||
- name: append
|
||||
args: " -05:00" # timezone offset
|
||||
- name: dateparse
|
||||
args: "2006-01-0215:04:05 -07:00"
|
||||
downloadvolumefactor:
|
||||
case:
|
||||
"img[title^=\"Freeleech: \"]": "0"
|
||||
"img[title^=\"Half Freeleech: \"]": "0.5"
|
||||
"*": "1"
|
||||
uploadvolumefactor:
|
||||
case:
|
||||
"*": "1"
|
129
src/Jackett/Definitions/fanoin.yml
Normal file
@@ -0,0 +1,129 @@
|
||||
---
|
||||
site: fanoin
|
||||
name: FANO.IN
|
||||
language: lv-lv
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- https://www.fano.in
|
||||
|
||||
caps:
|
||||
categories:
|
||||
20: Movies/SD # Movies/SD
|
||||
6: TV/SD # TV/SD
|
||||
7: PC/Games # Games/PC ISO
|
||||
5: Audio # Music
|
||||
47: Movies # Packs/Movies
|
||||
44: Audio/Audiobook # A-Books
|
||||
27: TV/Anime # Anime
|
||||
17: Movies/Foreign # Movies/Rus
|
||||
33: TV/Foreign # TV/Rus
|
||||
12: PC/Games # Games/PC Rips
|
||||
31: Audio/Lossless # Music/HQ
|
||||
49: TV # Packs/TV
|
||||
41: Books # E-Books
|
||||
29: Books # Cartoons
|
||||
24: Movies/Foreign # Movies/Lat
|
||||
25: TV/Foreign # TV/Lat
|
||||
34: Console/Xbox # Games/Xbox
|
||||
19: Audio/Video # Music Videos
|
||||
46: Console # Packs/Games
|
||||
42: Other # Study
|
||||
52: Movies/3D # 3D
|
||||
37: Movies/HD # Movies/HD
|
||||
35: TV/HD # TV/HD
|
||||
43: Console/PS4 # Games/PS
|
||||
38: PC/Phone-Other # Mobile
|
||||
48: Audio # Packs/Music
|
||||
36: Other # X-mas
|
||||
53: Movies/SD # Movies/CAM
|
||||
4: Movies/DVD # Movies/DVD-R
|
||||
32: TV # TV/Facts
|
||||
40: Console/Wii # Games/Wii
|
||||
22: PC/0day # Appz/misc
|
||||
50: XXX/Packs # Packs/XXX
|
||||
9: XXX # XXX
|
||||
45: XXX # XXX/HD
|
||||
54: Movies # Movies/Retro
|
||||
23: TV/Sport # TV/Sport
|
||||
51: Console # Games/Misc
|
||||
1: PC/0day # Appz/PC ISO
|
||||
|
||||
modes:
|
||||
search: [q]
|
||||
tv-search: [q, season, ep]
|
||||
|
||||
login:
|
||||
path: takelogin.php
|
||||
method: post
|
||||
inputs:
|
||||
username: "{{ .Config.username }}"
|
||||
password: "{{ .Config.password }}"
|
||||
error:
|
||||
- selector: td.embedded:has(h2:contains("failed"))
|
||||
test:
|
||||
path: browse_old.php
|
||||
|
||||
ratio:
|
||||
path: browse_old.php
|
||||
selector: img[title="Reitings:"]+font
|
||||
|
||||
search:
|
||||
path: browse_old.php
|
||||
inputs:
|
||||
$raw: "{{range .Categories}}c{{.}}=1&{{end}}"
|
||||
search: "{{ .Query.Keywords }}"
|
||||
incldead: 1
|
||||
rows:
|
||||
selector: tr.browse_actions
|
||||
filters:
|
||||
- name: andmatch
|
||||
fields:
|
||||
title:
|
||||
selector: a[href^="details.php?id="]
|
||||
details:
|
||||
selector: a[href^="details.php?id="]
|
||||
attribute: href
|
||||
category:
|
||||
selector: a[href^="browse_old.php?cat="]
|
||||
attribute: href
|
||||
filters:
|
||||
- name: querystring
|
||||
args: cat
|
||||
download:
|
||||
selector: a[href^="details.php?id="]
|
||||
attribute: href
|
||||
filters:
|
||||
- name: replace
|
||||
args: ["details.php", "download.php"]
|
||||
imdb:
|
||||
selector: a[href^="http://www.imdb.com/title/"]
|
||||
attribute: href
|
||||
size:
|
||||
selector: td:nth-child(5)
|
||||
seeders:
|
||||
selector: td:nth-child(7)
|
||||
leechers:
|
||||
selector: td:nth-child(8)
|
||||
grabs:
|
||||
selector: td:nth-child(6)
|
||||
filters:
|
||||
- name: regexp
|
||||
args: (\d+)
|
||||
date:
|
||||
selector: td:nth-child(2) > small:nth-last-child(2)
|
||||
filters:
|
||||
- name: replace
|
||||
args: ["Šodien", "Today"]
|
||||
- name: replace
|
||||
args: ["Vakar", "Yesterday"]
|
||||
downloadvolumefactor:
|
||||
case:
|
||||
img[alt="Free"]: "0"
|
||||
"*": "1"
|
||||
uploadvolumefactor:
|
||||
case:
|
||||
img[alt="x2"]: "2"
|
||||
"*": "1"
|
||||
description:
|
||||
selector: td:nth-child(2) > small:nth-last-child(1)
|
||||
remove: a[href^="details.php?id="]
|
129
src/Jackett/Definitions/freedomhd.yml
Normal file
@@ -0,0 +1,129 @@
|
||||
---
|
||||
site: freedomhd
|
||||
name: Freedom-HD
|
||||
language: fr-fr
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- http://freedom-paradise.eu/
|
||||
|
||||
caps:
|
||||
categories:
|
||||
# ANIMES
|
||||
105: TV/Anime # 1080p
|
||||
104: TV/Anime # 720p
|
||||
90: TV/Anime # HDRIP-720p
|
||||
93: TV/Anime # HDRIP1080p
|
||||
131: TV/Anime # SD
|
||||
120: TV/Anime # X265-1080p
|
||||
119: TV/Anime # X265-720p
|
||||
107: TV/Anime # 1080p
|
||||
106: TV/Anime # 720p
|
||||
94: TV/Anime # HDRIP1080p
|
||||
91: TV/Anime # HDRIP720p
|
||||
|
||||
# EBOOK
|
||||
124: Books # Livres et Magazines
|
||||
|
||||
# FILMS
|
||||
97: Movies/HD # 1080p
|
||||
103: Movies/3D # 3D
|
||||
111: Movies/HD # 4K
|
||||
96: Movies/HD # 720p
|
||||
127: Movies/HD # BDrip
|
||||
128: Movies/HD # BRrip
|
||||
126: Movies/SD # DVDrip
|
||||
89: Movies/HD # HDRIP-720p
|
||||
92: Movies/HD # HDRIP1080p
|
||||
112: Movies/SD # Team-Hush
|
||||
129: Movies/HD # Team-Romkent
|
||||
125: Movies/Other # WEBrip
|
||||
110: Movies/HD # X265-1080p
|
||||
109: Movies/HD # X265-720p
|
||||
|
||||
# MUSIQUES
|
||||
114: Audio/Lossless # Flac
|
||||
113: Audio/MP3 # MP3
|
||||
132: Audio # Musiques-HQ
|
||||
130: Audio/Video # video clip
|
||||
|
||||
# SERIE-sd
|
||||
121: TV/SD # SD
|
||||
|
||||
# SERIES-HD
|
||||
102: TV/HD # 1080p
|
||||
101: TV/HD # 720p
|
||||
100: TV/HD # HDrip1080p
|
||||
99: TV/HD # HDrip720p
|
||||
|
||||
# SPECTACLES
|
||||
118: TV/Sport # HDRIP1080p
|
||||
117: TV/Sport # HDRIP720p
|
||||
|
||||
modes:
|
||||
search: [q]
|
||||
tv-search: [q, season, ep]
|
||||
|
||||
login:
|
||||
path: account-login.php
|
||||
method: post
|
||||
inputs:
|
||||
username: "{{ .Config.username }}"
|
||||
password: "{{ .Config.password }}"
|
||||
remember: "yes"
|
||||
returnto: "/"
|
||||
error:
|
||||
- selector: div.myFrame:has(font.error)
|
||||
test:
|
||||
path: torrents-search.php
|
||||
|
||||
search:
|
||||
path: torrents-search.php
|
||||
inputs:
|
||||
$raw: "{{range .Categories}}c{{.}}=1&{{end}}"
|
||||
search: "{{ .Query.Keywords }}"
|
||||
incldead: "1"
|
||||
|
||||
rows:
|
||||
selector: table.ttable_headinner > tbody > tr[class^="t-row"]
|
||||
filters:
|
||||
- name: andmatch
|
||||
after: 1
|
||||
fields:
|
||||
download:
|
||||
selector: a[href^="torrents-details.php?id="]
|
||||
attribute: href
|
||||
filters:
|
||||
- name: replace
|
||||
args: ["torrents-details.php", "download.php"]
|
||||
title:
|
||||
selector: a[href^="torrents-details.php?id="]
|
||||
attribute: title
|
||||
category:
|
||||
selector: a[href^="torrents.php?cat="]
|
||||
attribute: href
|
||||
filters:
|
||||
- name: querystring
|
||||
args: cat
|
||||
details:
|
||||
selector: a[href^="torrents-details.php?id="]
|
||||
attribute: href
|
||||
description:
|
||||
selector: ul
|
||||
banner:
|
||||
selector: img.rounded-img
|
||||
attribute: src
|
||||
size:
|
||||
selector: td:nth-child(3)
|
||||
grabs:
|
||||
selector: td:nth-child(6)
|
||||
seeders:
|
||||
selector: td:nth-child(4)
|
||||
leechers:
|
||||
selector: td:nth-child(5)
|
||||
downloadvolumefactor:
|
||||
case:
|
||||
img[alt="freeleech"]: "0"
|
||||
"*": "1"
|
||||
uploadvolumefactor:
|
||||
case:
|
||||
"*": "1"
|
112
src/Jackett/Definitions/funkytorrents.yml
Normal file
@@ -0,0 +1,112 @@
|
||||
---
|
||||
site: funkytorrents
|
||||
name: FunkyTorrents
|
||||
language: en-us
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- http://funkytorrents.com
|
||||
|
||||
caps:
|
||||
categories:
|
||||
1: PC # (Apps)
|
||||
2: Books # (eBooks)
|
||||
3: Movies # (Movie)
|
||||
33: Audio # (Music DVDs)
|
||||
5: Audio/Video # (Music Vids)
|
||||
4: Audio # (OST)
|
||||
19: Audio # Alternative
|
||||
28: Audio # Ambient
|
||||
12: Audio # Classical
|
||||
17: Audio # Dance
|
||||
16: Audio # Drum 'n' Bass
|
||||
20: Audio # Electronic
|
||||
14: Audio # Emo
|
||||
23: Audio # Experimental
|
||||
34: Audio # Funk
|
||||
18: Audio # Hardcore
|
||||
13: Audio # House
|
||||
31: Audio # IDM
|
||||
21: Audio # Indie
|
||||
26: Audio # Industrial
|
||||
25: Audio # Jazz/Blues/Soul
|
||||
37: Audio # Lo-Fi
|
||||
6: Audio # Metal
|
||||
22: Audio # Misc
|
||||
7: Audio # Pop/RnB
|
||||
29: Audio # Post-Rock
|
||||
30: Audio # Psychedelic
|
||||
8: Audio # Punk
|
||||
9: Audio # Rap/Hip-Hop
|
||||
35: Audio # Reggae
|
||||
10: Audio # Rock
|
||||
15: Audio # Ska
|
||||
32: Audio # Techno
|
||||
11: Audio # Trance
|
||||
36: Audio # Trip-Hop
|
||||
24: Audio # World/Ethnic
|
||||
|
||||
modes:
|
||||
search: [q]
|
||||
tv-search: [q, season, ep]
|
||||
|
||||
login:
|
||||
path: takelogin.php
|
||||
method: post
|
||||
inputs:
|
||||
username: "{{ .Config.username }}"
|
||||
password: "{{ .Config.password }}"
|
||||
error:
|
||||
- selector: td.embedded:has(h2:contains("failed"))
|
||||
test:
|
||||
path: browse.php
|
||||
|
||||
search:
|
||||
path: /browse.php
|
||||
inputs:
|
||||
$raw: "{{range .Categories}}c{{.}}=1&{{end}}"
|
||||
search: "{{ .Query.Keywords }}"
|
||||
incldead: 1
|
||||
rows:
|
||||
selector: table.mainouter > tbody > tr > td.outer > table > tbody > tr.mouse_out
|
||||
fields:
|
||||
description|optional:
|
||||
selector: td:nth-child(2) > font
|
||||
title:
|
||||
selector: td:nth-child(2)
|
||||
remove: font
|
||||
category:
|
||||
selector: a[href^="browse.php?cat="]
|
||||
attribute: href
|
||||
filters:
|
||||
- name: querystring
|
||||
args: cat
|
||||
details:
|
||||
selector: a[href^="details.php?id="]
|
||||
attribute: href
|
||||
download:
|
||||
selector: a[href^="download.php"]
|
||||
attribute: href
|
||||
files:
|
||||
selector: td:nth-child(5)
|
||||
size:
|
||||
selector: td:nth-child(8)
|
||||
seeders:
|
||||
selector: td:nth-child(10)
|
||||
leechers:
|
||||
selector: td:nth-child(11)
|
||||
date:
|
||||
selector: td:nth-child(7)
|
||||
filters:
|
||||
- name: append
|
||||
args: " +0000"
|
||||
- name: dateparse
|
||||
args: "2006-01-0215:04:05 -0700"
|
||||
grabs:
|
||||
selector: td:nth-child(9)
|
||||
downloadvolumefactor:
|
||||
case:
|
||||
img[alt="Free Leech"]: "0"
|
||||
"*": "1"
|
||||
uploadvolumefactor:
|
||||
case:
|
||||
"*": "1"
|
161
src/Jackett/Definitions/gods.yml
Normal file
@@ -0,0 +1,161 @@
|
||||
---
|
||||
site: gods
|
||||
name: GODS
|
||||
language: de-de
|
||||
encoding: windows-1252
|
||||
links:
|
||||
- https://gods.lu/
|
||||
|
||||
caps:
|
||||
categories:
|
||||
# Movie
|
||||
132: Movies/BluRay # BluRay
|
||||
146: Movies/HD # Remux
|
||||
186: Movies/HD # UHD
|
||||
189: Movies/HD # HD
|
||||
190: Movies/SD # SD
|
||||
20: Movies/DVD # DVD
|
||||
131: Movies/3D # 3D
|
||||
16: Movies # Packs
|
||||
|
||||
# Serien
|
||||
187: TV/HD # Staffeln UHD
|
||||
173: TV/HD # Staffeln HD
|
||||
133: TV/SD # Staffeln SD
|
||||
188: TV/HD # Folgen UHD
|
||||
174: TV/HD # Folgen HD
|
||||
7: TV/SD # Folgen SD
|
||||
|
||||
# Doku
|
||||
152: TV/Documentary # HD
|
||||
153: TV/Documentary # SD
|
||||
|
||||
# Spiele
|
||||
4: PC/Games # Windows
|
||||
29: Console/XBox360 # XBOX 360
|
||||
126: Console/Wii # Wii
|
||||
183: Console/Wii # Wii U
|
||||
128: Console/PS3 # PS3
|
||||
154: Console/Other # Andere
|
||||
|
||||
# Musik
|
||||
6: Audio # Alben
|
||||
139: Audio/Lossless # Lossless
|
||||
177: Audio # Singles
|
||||
157: Audio # Charts
|
||||
192: Audio # Packs
|
||||
161: Audio/Video # Video
|
||||
|
||||
22: PC/0day # Windows
|
||||
129: PC/Mac # Mac OS
|
||||
164: PC/0day # Linux
|
||||
124: PC/Phone-Android # Android
|
||||
165: PC/Phone-IOS # Apple iOS
|
||||
167: PC/Phone-Other # Andere
|
||||
|
||||
# Sport
|
||||
130: TV/Sport # HD
|
||||
135: TV/Sport # SD
|
||||
|
||||
# International
|
||||
170: Movies/Foreign # Filme HD
|
||||
134: Movies/Foreign # Filme SD
|
||||
171: TV/Foreign # Folgen HD
|
||||
172: TV/Foreign # Folgen SD
|
||||
|
||||
# Sonstiges
|
||||
28: TV/Anime # Anime
|
||||
13: Books # e-Book
|
||||
11: Audio/Audiobook # Hören
|
||||
136: Other # Bilder
|
||||
9: Other # Tutorial
|
||||
178: Other # Anderes
|
||||
|
||||
modes:
|
||||
search: [q]
|
||||
tv-search: [q, season, ep]
|
||||
|
||||
settings:
|
||||
- name: pin
|
||||
type: text
|
||||
label: Pin
|
||||
- name: username
|
||||
type: text
|
||||
label: Username
|
||||
- name: password
|
||||
type: password
|
||||
label: Password
|
||||
|
||||
login:
|
||||
path: /login/
|
||||
method: form
|
||||
form: form
|
||||
inputs:
|
||||
username: "{{ .Config.username }}"
|
||||
password: "{{ .Config.password }}"
|
||||
pin: "{{ .Config.pin }}"
|
||||
test:
|
||||
path: browse.php
|
||||
|
||||
search:
|
||||
path: browse.php
|
||||
inputs:
|
||||
$raw: "{{range .Categories}}c{{.}}=1&{{end}}"
|
||||
search: "{{ .Query.Keywords }}"
|
||||
intitle: "1"
|
||||
incldead: "1"
|
||||
team: "0"
|
||||
orderby: "added"
|
||||
sort: desc
|
||||
rows:
|
||||
selector: table.tableinborder > tbody > tr:has(a[href^="details.php"])
|
||||
fields:
|
||||
title:
|
||||
selector: a[href^="details.php"]
|
||||
banner:
|
||||
selector: a[href^="details.php"] > span > img
|
||||
attribute: src
|
||||
category:
|
||||
selector: a[href^="browse.php?cat="]
|
||||
attribute: href
|
||||
filters:
|
||||
- name: querystring
|
||||
args: cat
|
||||
details:
|
||||
selector: a[href^="details.php"]
|
||||
attribute: href
|
||||
comments:
|
||||
selector: a[href*="&tocomm="]
|
||||
attribute: href
|
||||
download:
|
||||
selector: a[href^="download.php"]
|
||||
attribute: href
|
||||
files:
|
||||
selector: td:nth-child(2) > table > tbody > tr:nth-child(2) > td:nth-child(1) > b:nth-child(2)
|
||||
grabs:
|
||||
selector: td:nth-child(2) > table > tbody > tr:nth-child(2) > td:nth-child(3) > b:nth-child(1)
|
||||
size:
|
||||
selector: td:nth-child(2) > table > tbody > tr:nth-child(2) > td:nth-child(1) > b:nth-child(1)
|
||||
filters:
|
||||
- name: replace
|
||||
args: [".", ""]
|
||||
- name: replace
|
||||
args: [",", "."]
|
||||
seeders:
|
||||
selector: td:nth-child(2) > table > tbody > tr:nth-child(2) > td:nth-child(3) > b:nth-child(1)
|
||||
leechers:
|
||||
selector: td:nth-child(2) > table > tbody > tr:nth-child(2) > td:nth-child(3) > b:nth-child(3)
|
||||
date:
|
||||
selector: td:nth-child(2) > table > tbody > tr:nth-child(2) > td:nth-child(6)
|
||||
filters:
|
||||
- name: replace
|
||||
args: ["\xA0", " "]
|
||||
- name: dateparse
|
||||
args: "02.01.2006 15:04:05"
|
||||
downloadvolumefactor:
|
||||
case:
|
||||
img[alt="onlyupload"]: "0"
|
||||
"*": "1"
|
||||
uploadvolumefactor:
|
||||
case:
|
||||
"*": "1"
|
192
src/Jackett/Definitions/gormogon.yml
Normal file
@@ -0,0 +1,192 @@
|
||||
---
|
||||
site: gormogon
|
||||
name: Gormogon
|
||||
language: en-us
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- http://www.gormogon.com
|
||||
|
||||
caps:
|
||||
categories:
|
||||
# Movies:
|
||||
1: Movies/DVD # DVD-R
|
||||
2: Movies # Action
|
||||
14: Movies # Adventure
|
||||
15: Movies # Animation
|
||||
16: Movies # Biography
|
||||
17: Movies # Comedy
|
||||
18: Movies # Crime
|
||||
19: Movies # Disney
|
||||
92: Movies # Documentary
|
||||
20: Movies # Drama
|
||||
21: Movies # Family
|
||||
22: Movies # Fantasy
|
||||
23: Movies # Film Noir
|
||||
97: Movies # History
|
||||
24: Movies # Horror
|
||||
25: Movies # Martial Arts
|
||||
26: Movies # Musicals
|
||||
27: Movies # Mystery
|
||||
28: Movies # Romance
|
||||
29: Movies # Sci-Fi
|
||||
30: Movies # Thriller
|
||||
31: Movies # War
|
||||
32: Movies # Western
|
||||
33: Movies # Other
|
||||
|
||||
# Classic TV:
|
||||
34: TV # Action
|
||||
35: TV # Adventure
|
||||
36: TV # Animation
|
||||
37: TV # Biography
|
||||
38: TV # Comedy
|
||||
39: TV # Crime
|
||||
40: TV # Disney
|
||||
41: TV # Documentary
|
||||
42: TV # Drama
|
||||
43: TV # Family
|
||||
44: TV # Fantasy
|
||||
45: TV # TV Noir
|
||||
46: TV # Horror
|
||||
47: TV # Martial Arts
|
||||
49: TV # Musicals
|
||||
50: TV # Mystery
|
||||
51: TV # Romance
|
||||
52: TV # Sci-Fi
|
||||
48: TV # Shows
|
||||
53: TV # Thriller
|
||||
54: TV # War
|
||||
55: TV # Western
|
||||
56: TV # Other
|
||||
90: TV # TV Movies
|
||||
|
||||
# Old Time Radio
|
||||
57: Audio # Action
|
||||
58: Audio # Adventure
|
||||
59: Audio # Biography
|
||||
60: Audio # Comedy
|
||||
61: Audio # Crime
|
||||
62: Audio # Documentary
|
||||
63: Audio # Drama
|
||||
64: Audio # Family
|
||||
65: Audio # Fantasy
|
||||
66: Audio # Radio Noir
|
||||
67: Audio # Horror
|
||||
68: Audio # Musicals
|
||||
69: Audio # Mystery
|
||||
70: Audio # Romance
|
||||
71: Audio # Sci-Fi
|
||||
72: Audio # Shows
|
||||
73: Audio # Thriller
|
||||
74: Audio # War
|
||||
75: Audio # Western
|
||||
76: Audio # Other
|
||||
|
||||
# Music:
|
||||
77: Audio # Official Sountracks
|
||||
78: Audio # Theme Tunes
|
||||
79: Audio # Music 30s
|
||||
80: Audio # Music 40s
|
||||
81: Audio # Music 50s
|
||||
85: Audio # Music 60s
|
||||
86: Audio # Music 70s
|
||||
87: Audio # Music '80 - '84
|
||||
|
||||
# Printed:
|
||||
82: Books # Books
|
||||
91: Books # Newspaper
|
||||
83: Books # Scripts
|
||||
84: Books # Posters
|
||||
88: Books # Comics
|
||||
89: Books # Magazines
|
||||
|
||||
# Software:
|
||||
94: Other # Screensavers
|
||||
95: PC # Programs
|
||||
96: Other # Other
|
||||
|
||||
modes:
|
||||
search: [q]
|
||||
tv-search: [q, season, ep]
|
||||
|
||||
login:
|
||||
path: index.php?page=login&returnto=index.php
|
||||
method: post
|
||||
inputs:
|
||||
uid: "{{ .Config.username }}"
|
||||
pwd: "{{ .Config.password }}"
|
||||
error:
|
||||
- selector: td.lista > span[style="color:#FF0000;"]
|
||||
test:
|
||||
path: index.php
|
||||
selector: form[name="jump1"]
|
||||
|
||||
ratio:
|
||||
path: index.php
|
||||
selector: form[name="jump1"] > table > tbody > tr > td:contains("SR ")
|
||||
filters:
|
||||
- name: trim
|
||||
args: ")"
|
||||
- name: split
|
||||
args: [" ", 1]
|
||||
|
||||
download:
|
||||
selector: a[href^="download.php?id="]
|
||||
|
||||
search:
|
||||
path: index.php
|
||||
inputs:
|
||||
search: "{{ .Query.Keywords }}"
|
||||
category: "{{range .Categories}}{{.}};{{end}}"
|
||||
page: torrents
|
||||
active: 0
|
||||
rows:
|
||||
selector: table.lista > tbody > tr:has(a[href^="index.php?page=torrents&category="])
|
||||
fields:
|
||||
download:
|
||||
selector: a[href^="index.php?page=downloadcheck&id="]
|
||||
attribute: href
|
||||
title:
|
||||
selector: a[onmouseover][href^="index.php?page=torrent-details&id="]
|
||||
category:
|
||||
selector: a[href^="index.php?page=torrents&category="]
|
||||
attribute: href
|
||||
filters:
|
||||
- name: querystring
|
||||
args: category
|
||||
details:
|
||||
selector: a[onmouseover][href^="index.php?page=torrent-details&id="]
|
||||
attribute: href
|
||||
size:
|
||||
selector: td:nth-child(10)
|
||||
date:
|
||||
selector: td:nth-child(5)
|
||||
filters:
|
||||
- name: dateparse
|
||||
args: "02/01/2006"
|
||||
grabs:
|
||||
selector: td:nth-child(8)
|
||||
filters:
|
||||
- name: replace
|
||||
args: ["---", "0"]
|
||||
seeders:
|
||||
selector: td:nth-child(6)
|
||||
leechers:
|
||||
selector: td:nth-child(7)
|
||||
downloadvolumefactor:
|
||||
case:
|
||||
img[alt="gold"]: "0"
|
||||
img[alt="silver"]: "0.5"
|
||||
"*": "1"
|
||||
uploadvolumefactor:
|
||||
case:
|
||||
img[alt="2x Upload Multiplier"]: "2"
|
||||
img[alt="3x Upload Multiplier"]: "3"
|
||||
img[alt="4x Upload Multiplier"]: "4"
|
||||
img[alt="5x Upload Multiplier"]: "5"
|
||||
img[alt="6x Upload Multiplier"]: "6"
|
||||
img[alt="7x Upload Multiplier"]: "7"
|
||||
img[alt="8x Upload Multiplier"]: "8"
|
||||
img[alt="9x Upload Multiplier"]: "9"
|
||||
img[alt="10x Upload Multiplier"]: "10"
|
||||
"*": "1"
|
97
src/Jackett/Definitions/hdclub.yml
Normal file
@@ -0,0 +1,97 @@
|
||||
---
|
||||
site: hdclub
|
||||
name: HDClub
|
||||
language: ru-ru
|
||||
encoding: windows-1251
|
||||
links:
|
||||
- http://hdclub.org
|
||||
|
||||
caps:
|
||||
categories:
|
||||
70: Movies # Animation
|
||||
71: Movies # Movie
|
||||
81: Audio # HD Audio
|
||||
78: TV/Documentary # Documentary
|
||||
68: Audio/Video # Music Video
|
||||
64: TV # TV Show
|
||||
62: TV/Sport # Sport
|
||||
82: Other # Demo
|
||||
|
||||
modes:
|
||||
search: [q]
|
||||
tv-search: [q, season, ep]
|
||||
|
||||
login:
|
||||
path: login.php
|
||||
method: form
|
||||
form: form[action="takelogin.php"]
|
||||
captcha:
|
||||
type: image
|
||||
image: img#captcha
|
||||
input: imagestring
|
||||
inputs:
|
||||
username: "{{ .Config.username }}"
|
||||
password: "{{ .Config.password }}"
|
||||
error:
|
||||
- selector: td.embedded > div.error
|
||||
test:
|
||||
path: browse.php
|
||||
selector: td.main_bottom
|
||||
|
||||
search:
|
||||
path: browse.php
|
||||
inputs:
|
||||
$raw: "{{range .Categories}}c{{.}}=1&{{end}}"
|
||||
search: "{{ .Query.Keywords }}"
|
||||
dsearch: ""
|
||||
stype: "or"
|
||||
incldead: "1"
|
||||
webdl: "0"
|
||||
3d: "0"
|
||||
rows:
|
||||
selector: tbody#highlighted > tr
|
||||
fields:
|
||||
download:
|
||||
selector: a[href^="details.php?id="]
|
||||
attribute: href
|
||||
filters:
|
||||
- name: replace
|
||||
args: ["details.php", "download.php"]
|
||||
title:
|
||||
selector: a[href^="details.php?id="]
|
||||
details:
|
||||
selector: a[href^="details.php?id="]
|
||||
attribute: href
|
||||
category:
|
||||
selector: a[href^="browse.php?cat="]
|
||||
attribute: href
|
||||
filters:
|
||||
- name: querystring
|
||||
args: cat
|
||||
date:
|
||||
selector: div#frame > div#cleft > font
|
||||
filters:
|
||||
- name: append
|
||||
args: " +02:00"
|
||||
- name: dateparse
|
||||
args: "2006-01-02 15:04:05 -07:00"
|
||||
seeders:
|
||||
selector: td:nth-child(5)
|
||||
leechers:
|
||||
selector: td:nth-child(6)
|
||||
grabs:
|
||||
selector: td:nth-child(7) b
|
||||
filters:
|
||||
- name: regexp
|
||||
args: ([\d,]+)
|
||||
size:
|
||||
selector: td:nth-child(7)
|
||||
remove: a, br, b
|
||||
downloadvolumefactor:
|
||||
case:
|
||||
img[src="pic/freedownload.gif"]: "0"
|
||||
img[src="pic/silver.gif"]: "0.5"
|
||||
"*": "1"
|
||||
uploadvolumefactor:
|
||||
case:
|
||||
"*": "1"
|
102
src/Jackett/Definitions/hdme.yml
Normal file
@@ -0,0 +1,102 @@
|
||||
---
|
||||
site: hdme
|
||||
name: HDME
|
||||
language: en-us
|
||||
encoding: windows-1252
|
||||
links:
|
||||
- https://hdme.eu
|
||||
|
||||
caps:
|
||||
categories:
|
||||
24: TV/Anime # Anime
|
||||
25: PC/0day # Appz
|
||||
47: Movies/HD # AVCHD
|
||||
26: Movies/BluRay # Bluray
|
||||
54: Movies/HD # dbREMUX
|
||||
41: Movies/HD # Documentaries
|
||||
50: Movies/HD # FourGHD
|
||||
44: Movies/HD # HDME
|
||||
28: Audio/Lossless # HQ Music
|
||||
48: Movies/HD # iCandy
|
||||
45: Movies/HD # INtL
|
||||
29: Other # Misc
|
||||
49: PC/Phone-Other # Mobile
|
||||
30: Movies/HD # Movie 1080i
|
||||
31: Movies/HD # Movie 1080p
|
||||
32: Movies/HD # Movie 720p
|
||||
33: Audio/Video # Music Videos
|
||||
34: TV # Packs
|
||||
53: Movies/HD # Remux
|
||||
56: Movies/HD # RUXi
|
||||
55: Movies/HD # SiNiSteR
|
||||
36: TV/Sport # Sports
|
||||
37: TV/HD # TV Series 1080i
|
||||
38: TV/HD # TV Series 1080p
|
||||
39: TV/HD # TV Series 720p
|
||||
57: Movies # UHD 2160p
|
||||
40: XXX # XXX
|
||||
|
||||
modes:
|
||||
search: [q]
|
||||
tv-search: [q, season, ep]
|
||||
|
||||
login:
|
||||
path: /takelogin.php
|
||||
method: post
|
||||
form: form
|
||||
inputs:
|
||||
username: "{{ .Config.username }}"
|
||||
password: "{{ .Config.password }}"
|
||||
error:
|
||||
- selector: td.embedded
|
||||
message:
|
||||
selector: td.text
|
||||
test:
|
||||
path: /my.php
|
||||
|
||||
ratio:
|
||||
path: /my.php
|
||||
selector: span.smallfont > font
|
||||
filters:
|
||||
- name: regexp
|
||||
args: "Ratio:(.+?)Uploaded"
|
||||
- name: replace
|
||||
args: [",", ""]
|
||||
|
||||
search:
|
||||
path: /browse.php
|
||||
inputs:
|
||||
$raw: "{{range .Categories}}c{{.}}=1&{{end}}"
|
||||
search: "{{ .Keywords }}"
|
||||
incldead: "1"
|
||||
blah: "0"
|
||||
rows:
|
||||
selector: table[width="100%"] > tbody > tr:has(td.bottom[background="_images/bg_torrent.jpg"])
|
||||
fields:
|
||||
category:
|
||||
selector: td:nth-child(2) a
|
||||
attribute: href
|
||||
filters:
|
||||
- name: querystring
|
||||
args: cat
|
||||
title:
|
||||
selector: td:nth-child(3) > a
|
||||
attribute: title
|
||||
comments:
|
||||
selector: td:nth-child(3) > a
|
||||
attribute: href
|
||||
download:
|
||||
selector: td:nth-child(11) > a
|
||||
attribute: href
|
||||
size:
|
||||
selector: td:nth-child(6)
|
||||
remove: br
|
||||
date:
|
||||
selector: td:nth-child(3)
|
||||
filters:
|
||||
- name: regexp
|
||||
args: "Added: (.+?)\n"
|
||||
seeders:
|
||||
selector: td:nth-child(8)
|
||||
leechers:
|
||||
selector: td:nth-child(9)
|
117
src/Jackett/Definitions/hdsky.yml
Normal file
@@ -0,0 +1,117 @@
|
||||
---
|
||||
site: hdsky
|
||||
name: HDSky
|
||||
description: "A chinese tracker"
|
||||
language: zh-cn
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- https://hdsky.me
|
||||
|
||||
caps:
|
||||
categories:
|
||||
401: Movies # Movies/电影
|
||||
404: TV/Documentary # Documentaries/纪录片
|
||||
410: Movies # iPad/iPad影视
|
||||
405: TV/Anime # Animations/动漫
|
||||
402: TV # TV Series/剧集
|
||||
403: TV # TV Shows/综艺
|
||||
406: Audio/Video # Music Videos/音乐MV
|
||||
407: TV/Sport # Sports/体育
|
||||
408: Audio # HQ Audio/无损音乐
|
||||
409: Other # Misc/其他
|
||||
|
||||
modes:
|
||||
search: [q]
|
||||
tv-search: [q, season, ep]
|
||||
|
||||
login:
|
||||
path: login.php
|
||||
method: form
|
||||
form: form[action="takelogin.php"]
|
||||
captcha:
|
||||
type: image
|
||||
image: img[alt="CAPTCHA"]
|
||||
input: imagestring
|
||||
inputs:
|
||||
username: "{{ .Config.username }}"
|
||||
password: "{{ .Config.password }}"
|
||||
error:
|
||||
- selector: td.embedded:has(h2:contains("failed"))
|
||||
test:
|
||||
path: /torrents.php
|
||||
|
||||
ratio:
|
||||
path: /torrents.php
|
||||
selector: table#info_block
|
||||
filters:
|
||||
- name: regexp
|
||||
args: "Ratio:\\s(.*?)\\s\\s"
|
||||
|
||||
download:
|
||||
method: post
|
||||
|
||||
search:
|
||||
path: /torrents.php
|
||||
method: post
|
||||
inputs:
|
||||
$raw: "{{range .Categories}}cat{{.}}=1&{{end}}"
|
||||
search: "{{ .Query.Keywords }}"
|
||||
incldead: "1"
|
||||
spstate: "0"
|
||||
inclbookmarked: "0"
|
||||
search_area: "0"
|
||||
search_mode: "0"
|
||||
rows:
|
||||
selector: table.torrents > tbody > tr:has(table.torrentname)
|
||||
fields:
|
||||
title:
|
||||
selector: a[title][href^="details.php?id="]
|
||||
attribute: title
|
||||
category:
|
||||
selector: a[href^="?cat="]
|
||||
attribute: href
|
||||
filters:
|
||||
- name: querystring
|
||||
args: cat
|
||||
details:
|
||||
selector: a[title][href^="details.php?id="]
|
||||
attribute: href
|
||||
download:
|
||||
selector: form[action^="download.php?id="]
|
||||
attribute: action
|
||||
imdb:
|
||||
selector: a[href^="http://www.imdb.com/title/tt"]
|
||||
attribute: href
|
||||
size:
|
||||
selector: td.rowfollow:nth-child(5)
|
||||
grabs:
|
||||
selector: td.rowfollow:nth-child(8)
|
||||
seeders:
|
||||
selector: td.rowfollow:nth-child(6)
|
||||
leechers:
|
||||
selector: td.rowfollow:nth-child(7)
|
||||
date:
|
||||
selector: td.rowfollow:nth-child(4) > span[title]
|
||||
attribute: title
|
||||
filters:
|
||||
- name: append
|
||||
args: " +08:00"
|
||||
- name: dateparse
|
||||
args: "2006-01-02 15:04:05 -07:00"
|
||||
downloadvolumefactor:
|
||||
case:
|
||||
img.pro_free: "0"
|
||||
img.pro_free2up: "0"
|
||||
img.pro_50pctdown: "0.5"
|
||||
img.pro_50pctdown2up: "0.5"
|
||||
img.pro_30pctdown: "0.3"
|
||||
"*": "1"
|
||||
uploadvolumefactor:
|
||||
case:
|
||||
img.pro_50pctdown2up: "2"
|
||||
img.pro_free2up: "2"
|
||||
img.pro_2up: "2"
|
||||
"*": "1"
|
||||
description:
|
||||
selector: td:nth-child(2)
|
||||
remove: a, img
|
104
src/Jackett/Definitions/hyperay.yml
Normal file
@@ -0,0 +1,104 @@
|
||||
---
|
||||
site: hyperay
|
||||
name: Hyperay
|
||||
language: zh-cn
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- https://www.hyperay.cc
|
||||
|
||||
caps:
|
||||
categories:
|
||||
410: Movies/HD # Movies 1080p
|
||||
411: Movies/HD # Movies 720p
|
||||
401: Movies/BluRay # Movies Blu-ray
|
||||
415: Movies # Movies REMUX
|
||||
416: Movies/3D # Movies 3D
|
||||
414: Movies/DVD # Movies DVD
|
||||
412: Movies/WEBDL # Movies WEB-DL
|
||||
413: Movies/SD # Movies HDTV
|
||||
417: Movies/Other # Movies iPad
|
||||
402: TV # TV Series
|
||||
403: TV # TV Shows
|
||||
404: TV/Documentary # Documentaries
|
||||
405: TV/Anime # Animations
|
||||
406: Audio/Video # Music Videos
|
||||
407: TV/Sport # Sports
|
||||
408: Audio # HQ Audio
|
||||
418: Books # Book
|
||||
409: Other # Misc
|
||||
|
||||
modes:
|
||||
search: [q]
|
||||
tv-search: [q, season, ep]
|
||||
|
||||
login:
|
||||
path: takelogin.php
|
||||
method: post
|
||||
inputs:
|
||||
username: "{{ .Config.username }}"
|
||||
password: "{{ .Config.password }}"
|
||||
error:
|
||||
- selector: td.embedded:has(h2:contains("failed"))
|
||||
test:
|
||||
path: /torrents.php
|
||||
|
||||
search:
|
||||
path: /torrents.php
|
||||
method: post
|
||||
inputs:
|
||||
$raw: "{{range .Categories}}cat{{.}}=1&{{end}}"
|
||||
search: "{{ .Query.Keywords }}"
|
||||
incldead: "1"
|
||||
spstate: "0"
|
||||
inclbookmarked: "0"
|
||||
search_area: "0"
|
||||
search_mode: "0"
|
||||
rows:
|
||||
selector: table.torrents > tbody > tr[class]
|
||||
fields:
|
||||
title:
|
||||
selector: a[title][href^="details.php?id="]
|
||||
attribute: title
|
||||
category:
|
||||
selector: a[href^="?cat="]
|
||||
attribute: href
|
||||
filters:
|
||||
- name: querystring
|
||||
args: cat
|
||||
details:
|
||||
selector: a[title][href^="details.php?id="]
|
||||
attribute: href
|
||||
download:
|
||||
selector: a[href^="download.php?id="]
|
||||
attribute: href
|
||||
imdb:
|
||||
selector: a[href^="http://www.imdb.com/title/"]
|
||||
attribute: href
|
||||
banner:
|
||||
selector: a[title][onmouseover][href^="details.php?id="]
|
||||
attribute: onmouseover
|
||||
filters:
|
||||
- name: regexp
|
||||
args: "showmenu\\(this,'.*','(.*)'\\);"
|
||||
size:
|
||||
selector: td.rowfollow:nth-child(6)
|
||||
grabs:
|
||||
selector: td.rowfollow:nth-child(9)
|
||||
seeders:
|
||||
selector: td.rowfollow:nth-child(7)
|
||||
leechers:
|
||||
selector: td.rowfollow:nth-child(8)
|
||||
date:
|
||||
selector: td.rowfollow:nth-child(5) > span[title]
|
||||
attribute: title
|
||||
filters:
|
||||
- name: append
|
||||
args: " +08:00"
|
||||
- name: dateparse
|
||||
args: "2006-01-02 15:04:05 -07:00"
|
||||
downloadvolumefactor:
|
||||
case:
|
||||
"*": "1"
|
||||
uploadvolumefactor:
|
||||
case:
|
||||
"*": "1"
|
129
src/Jackett/Definitions/icetorrent.yml
Normal file
@@ -0,0 +1,129 @@
|
||||
---
|
||||
site: icetorrent
|
||||
name: ICE Torrent
|
||||
language: ro-ro
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- https://www.icetorrent.org
|
||||
|
||||
caps:
|
||||
categories:
|
||||
1: PC/0day # Appz
|
||||
85: Audio/Audiobook # AudioBooks
|
||||
68: Books # Carti/Reviste
|
||||
23: Books # Cartoons
|
||||
73: Audio/Video # Concert/Videoclip
|
||||
75: Other # Diverse
|
||||
69: Books # Documentare
|
||||
51: TV/Documentary # Documentaries
|
||||
43: Books # eBooks
|
||||
63: Movies/DVD # Filme DVD
|
||||
65: Movies/HD # Filme HD
|
||||
64: Movies/SD # Filme Xvid
|
||||
40: Console # Games/Console
|
||||
26: PC/Games # Games/PC
|
||||
38: PC/Phone-Other # Mobile
|
||||
59: Movies/3D # Movies/3D
|
||||
92: Movies/HD # Movies/4K-UHD
|
||||
32: Movies/BluRay # Movies/Blu-Ray
|
||||
28: Movies/DVD # Movies/DVD
|
||||
42: Movies/HD # Movies/HD-x264
|
||||
91: Movies/HD # Movies/HEVC-x265
|
||||
79: Movies/HD # Movies/microHD
|
||||
29: Movies/SD # Movies/SD
|
||||
72: Audio/Lossless # Music/FLAC
|
||||
6: Audio/MP3 # Music/MP3
|
||||
37: Audio/Video # Music/Video
|
||||
70: Audio/Lossless # Muzica FLAC
|
||||
71: Audio/MP3 # Muzica MP3
|
||||
74: Other # Other
|
||||
41: Other # Pictures
|
||||
67: TV # Seriale TV
|
||||
48: TV/Sport # Sports
|
||||
87: Other # TUTS
|
||||
33: TV/SD # TV Episodes
|
||||
34: TV/HD # TVHD Episodes
|
||||
|
||||
modes:
|
||||
search: [q]
|
||||
tv-search: [q, season, ep]
|
||||
|
||||
login:
|
||||
path: /login.php
|
||||
method: form
|
||||
form: form
|
||||
inputs:
|
||||
username: "{{ .Config.username }}"
|
||||
password: "{{ .Config.password }}"
|
||||
error:
|
||||
- selector: font:contains("failed") + table
|
||||
test:
|
||||
path: /browse.php
|
||||
|
||||
ratio:
|
||||
text: -1
|
||||
|
||||
search:
|
||||
path: /browse.php
|
||||
inputs:
|
||||
cat: "{{range .Categories}}c{{.}}=1&{{end}}"
|
||||
search: "{{ .Query.Keywords }}"
|
||||
incldead: 1
|
||||
search_by: "name"
|
||||
rows:
|
||||
selector: td.torrenttable > table > tbody > tr:has(a[title][href^="details.php?id="])
|
||||
fields:
|
||||
title:
|
||||
selector: a[title][href^="details.php?id="]
|
||||
attribute: title
|
||||
details:
|
||||
selector: a[title][href^="details.php?id="]
|
||||
attribute: href
|
||||
category:
|
||||
selector: a[href^="browse.php?cat="]
|
||||
attribute: href
|
||||
filters:
|
||||
- name: querystring
|
||||
args: cat
|
||||
imdb:
|
||||
selector: a[title="IMDB"]
|
||||
attribute: href
|
||||
banner:
|
||||
attribute: rel
|
||||
download:
|
||||
selector: a[href^="download.php"]
|
||||
attribute: href
|
||||
files:
|
||||
selector: td:nth-child(5) > a
|
||||
filters:
|
||||
- name: regexp
|
||||
args: (\d+)
|
||||
size:
|
||||
selector: td:nth-child(5)
|
||||
remove: a
|
||||
date:
|
||||
selector: td:nth-child(2) > div
|
||||
filters:
|
||||
- name: replace
|
||||
args: ["Added on: ", ""]
|
||||
- name: trim
|
||||
args: "\xA0"
|
||||
- name: append
|
||||
args: " +03:00"
|
||||
- name: dateparse
|
||||
args: "2006-01-02 15:04:05 -07:00"
|
||||
grabs:
|
||||
selector: td:nth-child(6)
|
||||
downloadvolumefactor:
|
||||
case:
|
||||
"*": "0"
|
||||
uploadvolumefactor:
|
||||
case:
|
||||
"*": "1"
|
||||
description:
|
||||
selector: td:nth-child(2)
|
||||
remove: a[title][href^="details.php?id="], div
|
||||
seeders:
|
||||
text: "9999"
|
||||
leechers:
|
||||
text: "9999"
|
105
src/Jackett/Definitions/infinityt.yml
Normal file
@@ -0,0 +1,105 @@
|
||||
---
|
||||
site: infinityt
|
||||
name: Infinity-T
|
||||
language: da-dk
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- https://infinity-t.org/
|
||||
|
||||
caps:
|
||||
categories:
|
||||
22: Audio/Audiobook # aBook
|
||||
13: PC/Phone-Android # Appz/Android
|
||||
14: PC/Phone-IOS # Appz/iPhone
|
||||
12: PC/Mac # Appz/Mac
|
||||
11: PC/0day # Appz/Win
|
||||
19: Movies # AU/NEED
|
||||
20: Books # eBook
|
||||
17: Console # Games/Console
|
||||
16: PC/Mac # Games/Mac
|
||||
15: PC/Games # Games/PC
|
||||
8: Movies # Movie/Boxset
|
||||
7: Movies/DVD # Movie/DVD
|
||||
5: Movies/HD # Movie/HD
|
||||
6: Movies/SD # Movie/SD
|
||||
10: Audio/Lossless # Music/FLAC
|
||||
9: Audio/MP3 # Music/MP3
|
||||
21: Movies/Bluray # REMUX/Bluray
|
||||
4: TV # TV/Boxset
|
||||
3: TV # TV/DVD
|
||||
1: TV/HD # TV/HD
|
||||
2: TV/SD # TV/SD
|
||||
18: XXX # XXX
|
||||
|
||||
modes:
|
||||
search: [q]
|
||||
tv-search: [q, season, ep]
|
||||
|
||||
login:
|
||||
path: login.php
|
||||
method: post
|
||||
inputs:
|
||||
username: "{{ .Config.username }}"
|
||||
password: "{{ .Config.password }}"
|
||||
error:
|
||||
- selector: td.embedded:has(h2:contains("failed"))
|
||||
test:
|
||||
path: /browse.php
|
||||
|
||||
search:
|
||||
path: /browse.php
|
||||
inputs:
|
||||
$raw: "{{range .Categories}}c{{.}}=1&{{end}}"
|
||||
search: "{{ .Query.Keywords }}"
|
||||
incldead: 1
|
||||
rows:
|
||||
selector: td.outer > table > tbody > tr[id]
|
||||
fields:
|
||||
imdb:
|
||||
selector: a[href^="https://www.nullrefer.com/?http://imdb.com/title/"]
|
||||
attribute: href
|
||||
banner:
|
||||
selector: a[rel]
|
||||
attribute: rel
|
||||
filters:
|
||||
- name: replace
|
||||
args: ["pic/noposter.jpg", ""]
|
||||
title:
|
||||
selector: a[href^="details.php?id="]
|
||||
category:
|
||||
selector: a[href^="browse.php?cat="]
|
||||
attribute: href
|
||||
filters:
|
||||
- name: querystring
|
||||
args: cat
|
||||
details:
|
||||
selector: a[href^="details.php?id="]
|
||||
attribute: href
|
||||
download:
|
||||
selector: a[href^="download.php"]
|
||||
attribute: href
|
||||
files:
|
||||
selector: td:nth-child(3)
|
||||
size:
|
||||
selector: td:nth-child(6)
|
||||
seeders:
|
||||
selector: td:nth-child(9)
|
||||
leechers:
|
||||
selector: td:nth-child(10)
|
||||
date:
|
||||
selector: td:nth-child(5)
|
||||
filters:
|
||||
- name: replace
|
||||
args: ["I Dag", "Today"]
|
||||
- name: replace
|
||||
args: ["I Går", "Yesterday"]
|
||||
|
||||
grabs:
|
||||
selector: td:nth-child(8)
|
||||
downloadvolumefactor:
|
||||
case:
|
||||
td[style*="/pic/free.png"]: "0"
|
||||
"*": "1"
|
||||
uploadvolumefactor:
|
||||
case:
|
||||
"*": "1"
|
121
src/Jackett/Definitions/mteamtp.yml
Normal file
@@ -0,0 +1,121 @@
|
||||
---
|
||||
site: mteamtp
|
||||
name: M-Team - TP
|
||||
description: "A chinese tracker"
|
||||
language: zh-cn
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- https://tp.m-team.cc
|
||||
|
||||
caps:
|
||||
categories:
|
||||
401: Movies/SD # Movie(電影)/SD
|
||||
419: Movies/HD # Movie(電影)/HD
|
||||
420: Movies/DVD # Movie(電影)/DVDiSo
|
||||
421: Movies/BluRay # Movie(電影)/Blu-Ray
|
||||
439: Movies/Other # Movie(電影)/Remux
|
||||
403: TV/SD # TV Series(影劇/綜藝)/SD
|
||||
402: TV/HD # TV Series(影劇/綜藝)/HD
|
||||
435: TV/SD # TV Series(影劇/綜藝)/DVDiSo
|
||||
438: TV/HD # TV Series(影劇/綜藝)/BD
|
||||
404: TV/Documentary # 紀錄教育
|
||||
405: TV/Anime # Anime(動畫)
|
||||
406: Audio/Video # MV(演唱)
|
||||
408: Audio/Other # Music(AAC/ALAC)
|
||||
434: Audio # Music(無損)
|
||||
407: TV/Sport # Sports(運動)
|
||||
422: PC/0day # Software(軟體)
|
||||
423: PC/Games # PCGame(PC遊戲)
|
||||
427: Books # eBook(電子書)
|
||||
409: Other # Misc(其他)
|
||||
|
||||
modes:
|
||||
search: [q]
|
||||
tv-search: [q, season, ep]
|
||||
|
||||
login:
|
||||
path: takelogin.php
|
||||
method: post
|
||||
inputs:
|
||||
username: "{{ .Config.username }}"
|
||||
password: "{{ .Config.password }}"
|
||||
error:
|
||||
- selector: td.embedded:has(h2:contains("failed"))
|
||||
test:
|
||||
path: /torrents.php
|
||||
|
||||
ratio:
|
||||
path: /torrents.php
|
||||
selector: table#info_block
|
||||
filters:
|
||||
- name: regexp
|
||||
args: "Ratio:\\s(.*?)\\s\\s"
|
||||
|
||||
search:
|
||||
path: /torrents.php
|
||||
method: post
|
||||
inputs:
|
||||
$raw: "{{range .Categories}}cat{{.}}=1&{{end}}"
|
||||
search: "{{ .Query.Keywords }}"
|
||||
incldead: "1"
|
||||
spstate: "0"
|
||||
inclbookmarked: "0"
|
||||
search_area: "0"
|
||||
search_mode: "0"
|
||||
rows:
|
||||
selector: table.torrents > tbody > tr:has(table.torrentname)
|
||||
fields:
|
||||
title:
|
||||
selector: a[title][href^="details.php?id="]
|
||||
attribute: title
|
||||
category:
|
||||
selector: a[href^="?cat="]
|
||||
attribute: href
|
||||
filters:
|
||||
- name: querystring
|
||||
args: cat
|
||||
details:
|
||||
selector: a[title][href^="details.php?id="]
|
||||
attribute: href
|
||||
download:
|
||||
selector: a[href^="download.php?id="]
|
||||
attribute: href
|
||||
banner:
|
||||
selector: img[alt="torrent thumbnail"]
|
||||
attribute: src
|
||||
filters:
|
||||
- name: replace
|
||||
args: ["pic/nopic.jpg", ""]
|
||||
size:
|
||||
selector: td.rowfollow:nth-child(5)
|
||||
grabs:
|
||||
selector: td.rowfollow:nth-child(8)
|
||||
seeders:
|
||||
selector: td.rowfollow:nth-child(6)
|
||||
leechers:
|
||||
selector: td.rowfollow:nth-child(7)
|
||||
date:
|
||||
selector: td.rowfollow:nth-child(4) > span[title]
|
||||
attribute: title
|
||||
filters:
|
||||
- name: append
|
||||
args: " +08:00"
|
||||
- name: dateparse
|
||||
args: "2006-01-02 15:04:05 -07:00"
|
||||
downloadvolumefactor:
|
||||
case:
|
||||
img.pro_free: "0"
|
||||
img.pro_free2up: "0"
|
||||
img.pro_50pctdown: "0.5"
|
||||
img.pro_50pctdown2up: "0.5"
|
||||
img.pro_30pctdown: "0.3"
|
||||
"*": "1"
|
||||
uploadvolumefactor:
|
||||
case:
|
||||
img.pro_50pctdown2up: "2"
|
||||
img.pro_free2up: "2"
|
||||
img.pro_2up: "2"
|
||||
"*": "1"
|
||||
description:
|
||||
selector: td:nth-child(2)
|
||||
remove: a, img
|
98
src/Jackett/Definitions/myspleen.yml
Normal file
@@ -0,0 +1,98 @@
|
||||
---
|
||||
site: myspleen
|
||||
name: MySpleen
|
||||
language: en-us
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- https://www.myspleen.org
|
||||
|
||||
caps:
|
||||
categories:
|
||||
31: TV # Adult Swim
|
||||
30: TV # Animation
|
||||
25: TV # Cartoon Network
|
||||
3: TV # Comedy
|
||||
26: TV # Comedy Central
|
||||
24: TV # MST3K
|
||||
28: TV # MTV
|
||||
29: TV # Nick
|
||||
20: Other # Other
|
||||
32: TV # Star Wars
|
||||
|
||||
modes:
|
||||
search: [q]
|
||||
tv-search: [q, season, ep]
|
||||
|
||||
login:
|
||||
path: /takelogin.php
|
||||
method: post
|
||||
inputs:
|
||||
username: "{{ .Config.username }}"
|
||||
password: "{{ .Config.password }}"
|
||||
returnto: "/"
|
||||
error:
|
||||
- selector: div#content:has(h2:contains("Login Failed"))
|
||||
test:
|
||||
path: /browse.php
|
||||
selector: span.key:contains("Ratio") + span.value
|
||||
|
||||
ratio:
|
||||
path: /browse.php
|
||||
selector: span.key:contains("Ratio") + span.value
|
||||
|
||||
search:
|
||||
path: /browse.php
|
||||
method: post
|
||||
inputs:
|
||||
$raw: "{{range .Categories}}c{{.}}=1&{{end}}"
|
||||
search: "{{ .Query.Keywords }}"
|
||||
incldead: "1"
|
||||
title: "0"
|
||||
rows:
|
||||
selector: table#main-torrents > tbody > tr
|
||||
fields:
|
||||
title:
|
||||
selector: td.tor-name > a
|
||||
attribute: title
|
||||
category:
|
||||
selector: td[class^="cat-"] > a
|
||||
attribute: href
|
||||
filters:
|
||||
- name: querystring
|
||||
args: cat
|
||||
details:
|
||||
selector: td.tor-name > a
|
||||
attribute: href
|
||||
download:
|
||||
selector: td.tor-down > a
|
||||
attribute: href
|
||||
files:
|
||||
selector: td:nth-child(5)
|
||||
size:
|
||||
selector: td:nth-child(8)
|
||||
grabs:
|
||||
selector: td:nth-child(9)
|
||||
filters:
|
||||
- name: regexp
|
||||
args: "(\\d+)"
|
||||
seeders:
|
||||
selector: td:nth-child(10)
|
||||
filters:
|
||||
- name: regexp
|
||||
args: "^(\\d+)"
|
||||
leechers:
|
||||
selector: td:nth-child(11)
|
||||
filters:
|
||||
- name: regexp
|
||||
args: "^(\\d+)"
|
||||
date:
|
||||
selector: td:nth-child(7)
|
||||
downloadvolumefactor:
|
||||
case:
|
||||
span.star: "0"
|
||||
span.fltime: "0"
|
||||
":root li[id=\"alert-fl\"][class=\"alert\"]:contains(\"Freeleech ends in \")": 0
|
||||
"*": "1"
|
||||
uploadvolumefactor:
|
||||
case:
|
||||
"*": "1"
|
151
src/Jackett/Definitions/nachtwerk.yml
Normal file
@@ -0,0 +1,151 @@
|
||||
---
|
||||
site: nachtwerk
|
||||
name: Nachtwerk
|
||||
language: de-de
|
||||
encoding: ISO-8859-15
|
||||
links:
|
||||
- https://nwtracker.com/
|
||||
|
||||
caps:
|
||||
categories:
|
||||
75: Movies/3D # Filme - 3D
|
||||
34: Movies # Filme - Xvid / x264
|
||||
55: Movies/BluRay # Filme - Blu-Ray
|
||||
20: Movies/DVD # Filme - DVD-R
|
||||
71: Movies/HD # Filme - HD 1080p
|
||||
70: Movies/HD # Filme - HD 720p
|
||||
35: Movies/Foreign # Filme - Inter
|
||||
104: Movies/HD # Filme - UHD
|
||||
107: Movies/Other # Filme - Remux
|
||||
7: TV/SD # Serien - Xvid / x264
|
||||
72: TV/HD # Serien - HD
|
||||
82: TV/Foreign # Serien - Inter
|
||||
69: TV # Serien - Pack's
|
||||
42: TV # Serien - TV Show
|
||||
105: TV/HD # Serien - UHD
|
||||
51: XXX # XXX - Xvid / x264
|
||||
73: XXX # XXX - HD
|
||||
84: XXX # XXX - Pack's
|
||||
85: XXX # XXX - Sonstiges
|
||||
102: XXX # XXX - Hentai
|
||||
103: XXX # XXX - UHD
|
||||
6: Audio/MP3 # Audio - MP3
|
||||
74: Audio/Lossless # Audio - Flac
|
||||
86: Audio/Video # Audio - Videos
|
||||
24: Audio/Audiobook # Audio - Hörspiel/Hörbuch
|
||||
93: PC/Mac # Appz - Mac
|
||||
67: PC/0day # Appz - Windows
|
||||
31: PC/Phone-Other # Appz - Handy
|
||||
81: PC # Appz - Sonstiges
|
||||
25: TV/Documentary # Dokus - Xvid / x264
|
||||
76: TV/Documentary # Dokus - HD
|
||||
99: TV/Documentary # Dokus - Pack's
|
||||
100: TV/Documentary # Dokus - 3D
|
||||
106: TV/Documentary # Dokus - UHD
|
||||
90: Console/PS3 # Games - PSX
|
||||
56: Console/Wii # Games - WII
|
||||
43: Console/Xbox # Games - XboX
|
||||
4: PC/Games # Games - PC
|
||||
88: Console/NDS # Games - xDS
|
||||
91: PC/Mac # Games - Mac
|
||||
92: Console # Games - Sonstiges
|
||||
23: TV/Anime # Anime - Xvid / x264
|
||||
80: TV/Anime # Anime - HD
|
||||
98: TV/Anime # Anime - Serien
|
||||
94: Books/Magazines # eBooks - Magazine/Zeitungen
|
||||
95: Books/Comics # eBooks - Comics
|
||||
30: Books # eBooks - Bücher
|
||||
96: TV/Sport # Sport - Wrestling
|
||||
97: TV/Sport # Sport - Fussball
|
||||
45: TV/Sport # Sport - Sonstiges
|
||||
9: Other # Diverses - Sonstiges
|
||||
|
||||
modes:
|
||||
search: [q]
|
||||
tv-search: [q, season, ep]
|
||||
|
||||
login:
|
||||
path: takelogin.php
|
||||
method: post
|
||||
inputs:
|
||||
username: "{{ .Config.username }}"
|
||||
password: "{{ .Config.password }}"
|
||||
error:
|
||||
- selector: td.embedded:has(h2:contains("failed"))
|
||||
test:
|
||||
path: /browse.php
|
||||
|
||||
download:
|
||||
selector: a[href^="download.php?torrent="]
|
||||
|
||||
search:
|
||||
path: /browse.php
|
||||
method: post
|
||||
inputs:
|
||||
$raw: "{{range .Categories}}c{{.}}=1&{{end}}"
|
||||
search: "{{ .Query.Keywords }}"
|
||||
incldead: "1"
|
||||
spstate: "0"
|
||||
inclbookmarked: "0"
|
||||
search_area: "0"
|
||||
search_mode: "0"
|
||||
rows:
|
||||
selector: table.tableinborder[cellspacing="1"][cellpadding="0"] > tbody > tr
|
||||
fields:
|
||||
title:
|
||||
selector: a[href^="details.php?id="]
|
||||
filters:
|
||||
- name: replace
|
||||
args: ["[NW] ", ""]
|
||||
category:
|
||||
selector: a[href^="browse.php?cat="]
|
||||
attribute: href
|
||||
filters:
|
||||
- name: querystring
|
||||
args: cat
|
||||
details:
|
||||
selector: a[href^="details.php?id="]
|
||||
attribute: href
|
||||
download:
|
||||
selector: a[href^="details.php?id="]
|
||||
attribute: href
|
||||
filters:
|
||||
- name: replace
|
||||
args: ["details.php?id=", "thanks1.php?torrentid="]
|
||||
banner:
|
||||
selector: a[onmouseover][href^="details.php?id="]
|
||||
attribute: onmouseover
|
||||
filters:
|
||||
- name: regexp
|
||||
args: "src=.*'\\);"
|
||||
size:
|
||||
selector: td:nth-child(2) > table > tbody > tr:nth-child(2) > td:nth-child(1) > b:nth-child(1)
|
||||
filters:
|
||||
- name: replace
|
||||
args: [".", ""]
|
||||
- name: replace
|
||||
args: [",", "."]
|
||||
files:
|
||||
selector: td:nth-child(2) > table > tbody > tr:nth-child(2) > td:nth-child(1) > b:nth-child(2)
|
||||
grabs:
|
||||
selector: td:nth-child(2) > table > tbody > tr:nth-child(2) > td:nth-child(3) > b:nth-child(1)
|
||||
seeders:
|
||||
selector: td:nth-child(2) > table > tbody > tr:nth-child(2) > td:nth-child(2) > b:nth-child(1)
|
||||
leechers:
|
||||
selector: td:nth-child(2) > table > tbody > tr:nth-child(2) > td:nth-child(2) > b:nth-child(3)
|
||||
date:
|
||||
selector: td:nth-child(2) > table > tbody > tr:nth-child(2) > td:nth-child(5)
|
||||
filters:
|
||||
- name: replace
|
||||
args: ["\xA0", " "]
|
||||
- name: append
|
||||
args: " +01:00"
|
||||
- name: dateparse
|
||||
args: "02.01.2006 15:04:05 -07:00"
|
||||
downloadvolumefactor:
|
||||
case:
|
||||
img[src="pic/onlyuploadd.gif"]: "0"
|
||||
"*": "1"
|
||||
uploadvolumefactor:
|
||||
case:
|
||||
"*": "1"
|
97
src/Jackett/Definitions/nethd.yml
Normal file
@@ -0,0 +1,97 @@
|
||||
---
|
||||
site: nethd
|
||||
name: NetHD
|
||||
description: "A vietnamese tracker"
|
||||
language: vi-vn
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- http://nethd.org/
|
||||
|
||||
caps:
|
||||
categories:
|
||||
401: Movies # Movies
|
||||
402: Audio # Music
|
||||
403: PC/Games # Game
|
||||
404: PC # Software
|
||||
405: Other # Image
|
||||
406: Books # Book
|
||||
|
||||
modes:
|
||||
search: [q]
|
||||
tv-search: [q, season, ep]
|
||||
|
||||
login:
|
||||
path: /takelogin.php
|
||||
method: post
|
||||
inputs:
|
||||
username: "{{ .Config.username }}"
|
||||
password: "{{ .Config.password }}"
|
||||
error:
|
||||
- selector: form#loginform > span.warning
|
||||
test:
|
||||
path: /torrents.php
|
||||
|
||||
ratio:
|
||||
path: /torrents.php
|
||||
selector: div.user-info-extend > dl > dt:contains("Ratio:") + dd
|
||||
search:
|
||||
path: /torrents.php
|
||||
method: post
|
||||
inputs:
|
||||
$raw: "{{range .Categories}}c{{.}}=1&{{end}}"
|
||||
search: "{{ .Query.Keywords }}"
|
||||
search_area: 0
|
||||
search_mode: 0
|
||||
spstate: 0
|
||||
inclbookmarked: 0
|
||||
incldead: 1
|
||||
rows:
|
||||
selector: tr:has(td.name)
|
||||
fields:
|
||||
title:
|
||||
selector: td.name > div > a.poster-preview[title]
|
||||
attribute: title
|
||||
category:
|
||||
selector: td.category > a
|
||||
attribute: href
|
||||
filters:
|
||||
- name: querystring
|
||||
args: cat
|
||||
details:
|
||||
selector: td.name > div > a.poster-preview[title]
|
||||
attribute: href
|
||||
comments:
|
||||
selector: a[href*="#comments"]
|
||||
attribute: href
|
||||
download:
|
||||
selector: a.bookmark[onclick]
|
||||
attribute: onclick
|
||||
filters:
|
||||
- name: replace
|
||||
args: [",false)", ""]
|
||||
- name: replace
|
||||
args: ["return bookmark(", "download.php?id="]
|
||||
size:
|
||||
selector: td:nth-child(5)
|
||||
seeders:
|
||||
selector: td:nth-child(6)
|
||||
leechers:
|
||||
selector: td:nth-child(7)
|
||||
grabs:
|
||||
selector: td:nth-child(8)
|
||||
date:
|
||||
selector: td:nth-child(4)
|
||||
filters:
|
||||
- name: append
|
||||
args: " +0700"
|
||||
- name: dateparse
|
||||
args: "2006-01-0215:04:05 -0700"
|
||||
downloadvolumefactor:
|
||||
case:
|
||||
"span.label:contains(\"Free\")": "0"
|
||||
"span.label:contains(\"50%\")": "0.5"
|
||||
"*": "1"
|
||||
uploadvolumefactor:
|
||||
case:
|
||||
"span.label:contains(\"2X\")": "2"
|
||||
"*": "1"
|
120
src/Jackett/Definitions/newretro.yml
Normal file
@@ -0,0 +1,120 @@
|
||||
---
|
||||
site: newretro
|
||||
name: The New Retro
|
||||
description: "A German gerneral tracker"
|
||||
language: de-de
|
||||
encoding: windows-1252
|
||||
links:
|
||||
- http://new-retro.ddns.net/
|
||||
|
||||
caps:
|
||||
categories:
|
||||
101: TV/Anime # Filme - Animie
|
||||
102: Movies/BluRay # Filme - Bluray
|
||||
131: Movies/Other # Filme - Bollywood
|
||||
103: Movies/DVD # Filme - DVD
|
||||
104: Movies/DVD # Filme - DVD-R
|
||||
132: Movies/DVD # Filme - HD2DVD
|
||||
130: Movies # Filme - Klassiker
|
||||
105: Movies # Filme - x264
|
||||
106: Movies # Filme - XviD / DivX
|
||||
69: XXX # XXX
|
||||
124: Audio # Musik - Alben
|
||||
122: Audio/Audiobook # Musik - Hörbuch
|
||||
123: Audio # Musik - Mixe
|
||||
133: Audio/MP3 # Musik - MP3
|
||||
125: Audio/Video # Musik - Video
|
||||
113: PC # Programme - Linux
|
||||
114: PC/Mac # Programme - Mac
|
||||
115: PC # Programme - Windows
|
||||
117: TV # Allgemein - Serien
|
||||
116: TV/Documentary # Serien - Dokus
|
||||
118: TV/Sport # Serien - Sport
|
||||
119: Other # Bilder
|
||||
120: Books # Ebook
|
||||
127: Other # Für Unsere kleinsten
|
||||
121: Other # Handy Stuff
|
||||
129: Other # Sonstiges
|
||||
109: Other # Spiele - Handy
|
||||
112: Console # Spiele - Konsolen
|
||||
111: PC/Games # Spiele - Mac / Linux
|
||||
110: PC/Games # Spiele - PC
|
||||
|
||||
modes:
|
||||
search: [q]
|
||||
tv-search: [q, season, ep]
|
||||
|
||||
login:
|
||||
path: /takelogin.php
|
||||
method: post
|
||||
inputs:
|
||||
username: "{{ .Config.username }}"
|
||||
password: "{{ .Config.password }}"
|
||||
returnto: "/"
|
||||
error:
|
||||
- selector: table.tableinborder:contains("Anmeldung Gescheitert!") > tbody > tr > td.tablea
|
||||
test:
|
||||
path: /usercp.php
|
||||
|
||||
ratio:
|
||||
path: /usercp.php
|
||||
selector: div#lmtd table > tbody > tr:contains("Ratio:") > td:nth-child(2)
|
||||
filters:
|
||||
- name: replace
|
||||
args: [".", ""]
|
||||
- name: replace
|
||||
args: [",", "."]
|
||||
|
||||
search:
|
||||
path: /browse.php
|
||||
inputs:
|
||||
$raw: "{{range .Categories}}c{{.}}=1&{{end}}"
|
||||
search: "{{ .Query.Keywords }}"
|
||||
showsearch: "1"
|
||||
orderby: "added"
|
||||
sort: "desc"
|
||||
incldead: "1"
|
||||
|
||||
rows:
|
||||
selector: table.tableinborder[summary] > tbody > tr
|
||||
filters:
|
||||
- name: andmatch
|
||||
fields:
|
||||
download:
|
||||
selector: a[href^="download.php?torrent="]
|
||||
attribute: href
|
||||
title:
|
||||
selector: a[href^="details.php?id="]:has(b)
|
||||
category:
|
||||
selector: a[href^="browse.php?cat="]
|
||||
attribute: href
|
||||
filters:
|
||||
- name: querystring
|
||||
args: cat
|
||||
comments:
|
||||
selector: td.tablea > table > tbody > tr:nth-child(2) > td:nth-child(4) > a
|
||||
attribute: href
|
||||
size:
|
||||
selector: td.tablea > table > tbody > tr:nth-child(2) > td:nth-child(1) > b:nth-child(1)
|
||||
grabs:
|
||||
selector: td.tablea > table > tbody > tr:nth-child(2) > td:nth-child(3) > b
|
||||
files:
|
||||
selector: td.tablea > table > tbody > tr:nth-child(2) > td:nth-child(1) > b:nth-child(2)
|
||||
seeders:
|
||||
selector: td.tablea > table > tbody > tr:nth-child(2) > td:nth-child(2) > b:nth-child(1)
|
||||
leechers:
|
||||
selector: td.tablea > table > tbody > tr:nth-child(2) > td:nth-child(2) > b:nth-child(3)
|
||||
date:
|
||||
selector: td.tablea > table > tbody > tr:nth-child(2) > td:nth-child(5)
|
||||
filters:
|
||||
- name: replace
|
||||
args: ["\u00a0", " "]
|
||||
- name: dateparse
|
||||
args: "02.01.2006 15:04:05"
|
||||
downloadvolumefactor:
|
||||
case:
|
||||
"font[color=\"red\"]:contains(\"Only Upload\")": "0"
|
||||
"*": "1"
|
||||
uploadvolumefactor:
|
||||
case:
|
||||
"*": "1"
|