mirror of
https://github.com/Jackett/Jackett.git
synced 2025-12-22 14:16:59 +01:00
Compare commits
352 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
401c3a3f41 | ||
|
|
6f854d0d99 | ||
|
|
7c33c536bc | ||
|
|
3d6da64973 | ||
|
|
be8dfd7ad6 | ||
|
|
60da4948fa | ||
|
|
b2040d3a5b | ||
|
|
869b09f574 | ||
|
|
aac2e42f9e | ||
|
|
2ad340f1bc | ||
|
|
943ddba22b | ||
|
|
79fa4da2bf | ||
|
|
da7589838f | ||
|
|
2a4be14998 | ||
|
|
c81a2163ce | ||
|
|
d3ada91c3a | ||
|
|
653dcca2af | ||
|
|
c2a24cae22 | ||
|
|
babd49c082 | ||
|
|
1007366471 | ||
|
|
e747d4e2fa | ||
|
|
efab277714 | ||
|
|
7f8cfa7eca | ||
|
|
6abc8adcd1 | ||
|
|
8e1d171937 | ||
|
|
9f433dd0de | ||
|
|
65da3e83af | ||
|
|
21250c275f | ||
|
|
e612c111c6 | ||
|
|
e24c95d4e2 | ||
|
|
2920caf7c0 | ||
|
|
f73a047ed9 | ||
|
|
313ade66f4 | ||
|
|
392a0d7b7e | ||
|
|
324afbcd0f | ||
|
|
7f003427fd | ||
|
|
a89246c9a7 | ||
|
|
69b01c34f8 | ||
|
|
a41bf6ebe4 | ||
|
|
5bf224d84d | ||
|
|
03af2a6d1d | ||
|
|
aee7bba3ce | ||
|
|
29b1304967 | ||
|
|
81029b3019 | ||
|
|
62caeb3f4d | ||
|
|
fba3e1922f | ||
|
|
0aacf6344d | ||
|
|
9d3d8ea18d | ||
|
|
4da3921e21 | ||
|
|
fed41d5b68 | ||
|
|
15841e26a8 | ||
|
|
22a5f46276 | ||
|
|
eb5642f293 | ||
|
|
98297b2d85 | ||
|
|
d900ac065f | ||
|
|
469620d88b | ||
|
|
461594e336 | ||
|
|
63f1870319 | ||
|
|
ba9710cd7c | ||
|
|
44c814417c | ||
|
|
d1290fc226 | ||
|
|
fa88fa8af8 | ||
|
|
318b3667ff | ||
|
|
7b0adc7e45 | ||
|
|
d27ab11d8c | ||
|
|
5b6c9fee49 | ||
|
|
594959c858 | ||
|
|
5b570b5cec | ||
|
|
875be5dde9 | ||
|
|
ffd1600226 | ||
|
|
07ef45b637 | ||
|
|
24f7fa461d | ||
|
|
8ebeb2bb17 | ||
|
|
fe3fcda356 | ||
|
|
b689b4581e | ||
|
|
623da8f70d | ||
|
|
6afaf39d5a | ||
|
|
55bd19dc45 | ||
|
|
0979b0c86d | ||
|
|
f4c8677091 | ||
|
|
1123e9d101 | ||
|
|
9a39fcc310 | ||
|
|
e8fc2c758f | ||
|
|
b8cdf9f929 | ||
|
|
89c860a16d | ||
|
|
ee5255b24a | ||
|
|
674e6e37ad | ||
|
|
082e761d0d | ||
|
|
6e8726c197 | ||
|
|
3a8ed21d75 | ||
|
|
eda0205dcd | ||
|
|
bd250ff971 | ||
|
|
1c63e9444d | ||
|
|
57a5959751 | ||
|
|
9e005c4c0b | ||
|
|
c6d4746e85 | ||
|
|
e9851a1dbc | ||
|
|
96d23ca19a | ||
|
|
733494a8a3 | ||
|
|
ed763fe7e1 | ||
|
|
1ef146eea4 | ||
|
|
ed884f507d | ||
|
|
ec6ed23ecc | ||
|
|
9d5456e370 | ||
|
|
ad08e28aa9 | ||
|
|
34dcdd3332 | ||
|
|
628944cb59 | ||
|
|
08bc5cca75 | ||
|
|
5c16161bfc | ||
|
|
4eb7392678 | ||
|
|
0448193ecd | ||
|
|
dc27463826 | ||
|
|
d3ef94c8db | ||
|
|
74e3dec4ed | ||
|
|
0b45557292 | ||
|
|
0387de3c67 | ||
|
|
6358e62741 | ||
|
|
b012502f87 | ||
|
|
608bb7d9e4 | ||
|
|
5f4206608e | ||
|
|
aef10d1246 | ||
|
|
6fc972aa08 | ||
|
|
271dcda7aa | ||
|
|
94656892f8 | ||
|
|
5fedb9c613 | ||
|
|
538fa6a38d | ||
|
|
4bd4d9cb0f | ||
|
|
a353af2ee5 | ||
|
|
565a368689 | ||
|
|
972d4c9485 | ||
|
|
45b77de6b2 | ||
|
|
a27c641bcb | ||
|
|
00cd1bd81c | ||
|
|
80493b7fa1 | ||
|
|
925471fa0c | ||
|
|
9ae16dea57 | ||
|
|
1aa3a256eb | ||
|
|
89d12c6fa9 | ||
|
|
ab6ca013d3 | ||
|
|
20d6e3eb09 | ||
|
|
37a50f8374 | ||
|
|
fac07933a2 | ||
|
|
8b77c6b483 | ||
|
|
f1414eeeec | ||
|
|
7a7bf83d98 | ||
|
|
1d48eb2dd7 | ||
|
|
e3956e123e | ||
|
|
1cfe4f9226 | ||
|
|
2cc601c5a9 | ||
|
|
a69664428a | ||
|
|
389daf9957 | ||
|
|
93d200895b | ||
|
|
43414bc9ed | ||
|
|
e630390c3f | ||
|
|
eb59c0bd51 | ||
|
|
e743f8b3aa | ||
|
|
6aaf12f1de | ||
|
|
bd5e407b53 | ||
|
|
c93d2821b1 | ||
|
|
f65d2ba9e9 | ||
|
|
0f5655ce0d | ||
|
|
5484d05291 | ||
|
|
fcc4168f54 | ||
|
|
905a52a82b | ||
|
|
86fd318211 | ||
|
|
e66beb64f4 | ||
|
|
4b507a3cbb | ||
|
|
5033171c54 | ||
|
|
8faf1c94dc | ||
|
|
d05ad1ccb5 | ||
|
|
9a1562ef8b | ||
|
|
b5aee501e2 | ||
|
|
dc9519c451 | ||
|
|
692d006078 | ||
|
|
7aac4fcfcb | ||
|
|
81e5589707 | ||
|
|
c36e3356e2 | ||
|
|
d477f01f84 | ||
|
|
d080c4a2ac | ||
|
|
6252c73cf2 | ||
|
|
3f9d182083 | ||
|
|
0cabbd68c5 | ||
|
|
c42027842b | ||
|
|
66b433bde1 | ||
|
|
ae303a5d4e | ||
|
|
ca19d2219e | ||
|
|
28a85d6426 | ||
|
|
bd1d95ade5 | ||
|
|
6634c5a036 | ||
|
|
cc671dfab5 | ||
|
|
dccdd89299 | ||
|
|
c23370b5fc | ||
|
|
d53a0ae4b9 | ||
|
|
4e8c52e16a | ||
|
|
eaae440c66 | ||
|
|
c7e288a372 | ||
|
|
a8375e8cfe | ||
|
|
4ed5507e4d | ||
|
|
682304d186 | ||
|
|
1455a905f1 | ||
|
|
64f066839d | ||
|
|
cf676b4a3f | ||
|
|
8bd74a2cc9 | ||
|
|
77837b7483 | ||
|
|
96e5e259e9 | ||
|
|
6999410617 | ||
|
|
e55e92f9ac | ||
|
|
4710fa619c | ||
|
|
61f9bec045 | ||
|
|
318e8722db | ||
|
|
86ce7ef1c8 | ||
|
|
0997bf674a | ||
|
|
c07c4f0682 | ||
|
|
1563418d88 | ||
|
|
771c0ac68c | ||
|
|
143ffbf790 | ||
|
|
a3f30a2dd9 | ||
|
|
a9d3ae0107 | ||
|
|
012f3d1bbc | ||
|
|
9826e2c2af | ||
|
|
a512ea37c3 | ||
|
|
3aedbc7baf | ||
|
|
b32257ae95 | ||
|
|
6c1c4092bd | ||
|
|
758138415e | ||
|
|
b9a6c7c810 | ||
|
|
dda62f1e18 | ||
|
|
8fcb19e1ea | ||
|
|
66e7ced25b | ||
|
|
5f1848d1de | ||
|
|
1f9c760246 | ||
|
|
3f19e6becf | ||
|
|
130c0bebbe | ||
|
|
b944993733 | ||
|
|
542f8d67e4 | ||
|
|
35f9e0fbe0 | ||
|
|
db669b31a1 | ||
|
|
1b64476102 | ||
|
|
5530fa1ca4 | ||
|
|
1fb77a6334 | ||
|
|
175249d6f0 | ||
|
|
f59f73e228 | ||
|
|
c1b2328bbf | ||
|
|
a3c1f3eb52 | ||
|
|
f238e78337 | ||
|
|
fd8823f6bd | ||
|
|
c14ee124f5 | ||
|
|
f4d45517c5 | ||
|
|
091cfbb310 | ||
|
|
698050e86a | ||
|
|
bb3faa3f62 | ||
|
|
08a68e0116 | ||
|
|
d22ef13fb2 | ||
|
|
d5e2014233 | ||
|
|
dd52a16bff | ||
|
|
a697aba985 | ||
|
|
1533ad1927 | ||
|
|
348461ebfc | ||
|
|
b83a984365 | ||
|
|
b07d1a32ca | ||
|
|
e3bb63aac4 | ||
|
|
65fc651d88 | ||
|
|
218e0c989c | ||
|
|
6f252254e3 | ||
|
|
977052dfd7 | ||
|
|
b78d04c116 | ||
|
|
63267b597e | ||
|
|
544501d2a8 | ||
|
|
169fda4dbb | ||
|
|
d3d78d3662 | ||
|
|
2d1175dcc1 | ||
|
|
0a7f06de31 | ||
|
|
9f3f11ac49 | ||
|
|
49affa0555 | ||
|
|
f5c482f939 | ||
|
|
6c67b7a8de | ||
|
|
368947a061 | ||
|
|
f0138405a6 | ||
|
|
8373ee3b0c | ||
|
|
dfaf9dd3a6 | ||
|
|
c1bde9b643 | ||
|
|
d86c60ffef | ||
|
|
e4cfedfcfb | ||
|
|
d3161e7b75 | ||
|
|
baf4730316 | ||
|
|
a89b69e821 | ||
|
|
4d48c1be44 | ||
|
|
8056e47fef | ||
|
|
63a3465aa6 | ||
|
|
03bbafb0c9 | ||
|
|
d8cbae68d5 | ||
|
|
99c269c896 | ||
|
|
b4075d1d35 | ||
|
|
49eebc90e4 | ||
|
|
68b25de828 | ||
|
|
00104205c0 | ||
|
|
28b53d8fb1 | ||
|
|
8a94d689b8 | ||
|
|
ad00e49fe2 | ||
|
|
888361f46f | ||
|
|
edc4c31fa6 | ||
|
|
a1dde973fb | ||
|
|
525f58eb1d | ||
|
|
124fbf7c1b | ||
|
|
b9b10e4e91 | ||
|
|
427b556869 | ||
|
|
04f9f2dfe7 | ||
|
|
d8e7a63768 | ||
|
|
2f694147a1 | ||
|
|
c339d54aed | ||
|
|
58974623de | ||
|
|
889a8da4e5 | ||
|
|
2f91d99e19 | ||
|
|
65e93ce137 | ||
|
|
0784e0784c | ||
|
|
963616fe07 | ||
|
|
e407067c8b | ||
|
|
a8ba61fc9d | ||
|
|
bbc360be00 | ||
|
|
d82c11650c | ||
|
|
6067a4ff73 | ||
|
|
8c344b2917 | ||
|
|
62769325b4 | ||
|
|
a96b3841b0 | ||
|
|
a3dcb0455a | ||
|
|
5d808e006d | ||
|
|
694c39503b | ||
|
|
12b2de2725 | ||
|
|
d806bb18a2 | ||
|
|
5a02bb9c27 | ||
|
|
a3dc1b295b | ||
|
|
471ab7f204 | ||
|
|
bdcdd78cee | ||
|
|
966c64c48e | ||
|
|
d5724f2f63 | ||
|
|
3ecdbfe7f4 | ||
|
|
b1ad8ed0bf | ||
|
|
3a35e4e40a | ||
|
|
0d58b2d63f | ||
|
|
3c596c978c | ||
|
|
cc2a69cc77 | ||
|
|
7627671900 | ||
|
|
4a4af3d8c8 | ||
|
|
950d38a651 | ||
|
|
49d4c3248c | ||
|
|
3da168ef6c | ||
|
|
d4da96559f | ||
|
|
084c89d9db | ||
|
|
6a913f79d4 | ||
|
|
938c1f1de0 | ||
|
|
480f2ebfeb | ||
|
|
b32869badd |
@@ -123,7 +123,7 @@ dotnet_style_prefer_compound_assignment=true:suggestion
|
|||||||
###############################
|
###############################
|
||||||
# Style Definitions
|
# Style Definitions
|
||||||
dotnet_naming_style.pascal_case_style.capitalization=pascal_case
|
dotnet_naming_style.pascal_case_style.capitalization=pascal_case
|
||||||
# Use PascalCase for constant fields
|
# Use PascalCase for constant fields
|
||||||
dotnet_naming_rule.constant_fields_should_be_pascal_case.severity=warning
|
dotnet_naming_rule.constant_fields_should_be_pascal_case.severity=warning
|
||||||
dotnet_naming_rule.constant_fields_should_be_pascal_case.symbols=constant_fields
|
dotnet_naming_rule.constant_fields_should_be_pascal_case.symbols=constant_fields
|
||||||
dotnet_naming_rule.constant_fields_should_be_pascal_case.style=pascal_case_style
|
dotnet_naming_rule.constant_fields_should_be_pascal_case.style=pascal_case_style
|
||||||
@@ -161,11 +161,11 @@ dotnet_naming_rule.asyncmethods_should_be_ends_with_async.style = ends_with_asyn
|
|||||||
|
|
||||||
dotnet_naming_symbols.interface.applicable_kinds = interface
|
dotnet_naming_symbols.interface.applicable_kinds = interface
|
||||||
dotnet_naming_symbols.interface.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
|
dotnet_naming_symbols.interface.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
|
||||||
dotnet_naming_symbols.interface.required_modifiers =
|
dotnet_naming_symbols.interface.required_modifiers =
|
||||||
|
|
||||||
dotnet_naming_symbols.private_or_internal_field.applicable_kinds = field
|
dotnet_naming_symbols.private_or_internal_field.applicable_kinds = field
|
||||||
dotnet_naming_symbols.private_or_internal_field.applicable_accessibilities = internal, private, private_protected
|
dotnet_naming_symbols.private_or_internal_field.applicable_accessibilities = internal, private, private_protected
|
||||||
dotnet_naming_symbols.private_or_internal_field.required_modifiers =
|
dotnet_naming_symbols.private_or_internal_field.required_modifiers =
|
||||||
|
|
||||||
dotnet_naming_symbols.private_or_internal_static_field.applicable_kinds = field
|
dotnet_naming_symbols.private_or_internal_static_field.applicable_kinds = field
|
||||||
dotnet_naming_symbols.private_or_internal_static_field.applicable_accessibilities = internal, private, private_protected
|
dotnet_naming_symbols.private_or_internal_static_field.applicable_accessibilities = internal, private, private_protected
|
||||||
@@ -173,11 +173,11 @@ dotnet_naming_symbols.private_or_internal_static_field.required_modifiers = stat
|
|||||||
|
|
||||||
dotnet_naming_symbols.types.applicable_kinds = class, struct, interface, enum
|
dotnet_naming_symbols.types.applicable_kinds = class, struct, interface, enum
|
||||||
dotnet_naming_symbols.types.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
|
dotnet_naming_symbols.types.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
|
||||||
dotnet_naming_symbols.types.required_modifiers =
|
dotnet_naming_symbols.types.required_modifiers =
|
||||||
|
|
||||||
dotnet_naming_symbols.non_field_members.applicable_kinds = property, event, method
|
dotnet_naming_symbols.non_field_members.applicable_kinds = property, event, method
|
||||||
dotnet_naming_symbols.non_field_members.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
|
dotnet_naming_symbols.non_field_members.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
|
||||||
dotnet_naming_symbols.non_field_members.required_modifiers =
|
dotnet_naming_symbols.non_field_members.required_modifiers =
|
||||||
|
|
||||||
dotnet_naming_symbols.asyncmethods.applicable_kinds = delegate, method, local_function
|
dotnet_naming_symbols.asyncmethods.applicable_kinds = delegate, method, local_function
|
||||||
dotnet_naming_symbols.asyncmethods.applicable_accessibilities = *
|
dotnet_naming_symbols.asyncmethods.applicable_accessibilities = *
|
||||||
@@ -185,29 +185,29 @@ dotnet_naming_symbols.asyncmethods.required_modifiers = async
|
|||||||
|
|
||||||
# Naming styles
|
# Naming styles
|
||||||
|
|
||||||
dotnet_naming_style.pascal_case.required_prefix =
|
dotnet_naming_style.pascal_case.required_prefix =
|
||||||
dotnet_naming_style.pascal_case.required_suffix =
|
dotnet_naming_style.pascal_case.required_suffix =
|
||||||
dotnet_naming_style.pascal_case.word_separator =
|
dotnet_naming_style.pascal_case.word_separator =
|
||||||
dotnet_naming_style.pascal_case.capitalization = pascal_case
|
dotnet_naming_style.pascal_case.capitalization = pascal_case
|
||||||
|
|
||||||
dotnet_naming_style.begins_with_i.required_prefix = I
|
dotnet_naming_style.begins_with_i.required_prefix = I
|
||||||
dotnet_naming_style.begins_with_i.required_suffix =
|
dotnet_naming_style.begins_with_i.required_suffix =
|
||||||
dotnet_naming_style.begins_with_i.word_separator =
|
dotnet_naming_style.begins_with_i.word_separator =
|
||||||
dotnet_naming_style.begins_with_i.capitalization = pascal_case
|
dotnet_naming_style.begins_with_i.capitalization = pascal_case
|
||||||
|
|
||||||
dotnet_naming_style.private_or_internal_static_with_prefix.required_prefix = s_
|
dotnet_naming_style.private_or_internal_static_with_prefix.required_prefix = _
|
||||||
dotnet_naming_style.private_or_internal_static_with_prefix.required_suffix =
|
dotnet_naming_style.private_or_internal_static_with_prefix.required_suffix =
|
||||||
dotnet_naming_style.private_or_internal_static_with_prefix.word_separator =
|
dotnet_naming_style.private_or_internal_static_with_prefix.word_separator =
|
||||||
dotnet_naming_style.private_or_internal_static_with_prefix.capitalization = pascal_case
|
dotnet_naming_style.private_or_internal_static_with_prefix.capitalization = pascal_case
|
||||||
|
|
||||||
dotnet_naming_style.private_prefix.required_prefix = _
|
dotnet_naming_style.private_prefix.required_prefix = _
|
||||||
dotnet_naming_style.private_prefix.required_suffix =
|
dotnet_naming_style.private_prefix.required_suffix =
|
||||||
dotnet_naming_style.private_prefix.word_separator =
|
dotnet_naming_style.private_prefix.word_separator =
|
||||||
dotnet_naming_style.private_prefix.capitalization = camel_case
|
dotnet_naming_style.private_prefix.capitalization = camel_case
|
||||||
|
|
||||||
dotnet_naming_style.ends_with_async.required_prefix =
|
dotnet_naming_style.ends_with_async.required_prefix =
|
||||||
dotnet_naming_style.ends_with_async.required_suffix = Async
|
dotnet_naming_style.ends_with_async.required_suffix = Async
|
||||||
dotnet_naming_style.ends_with_async.word_separator =
|
dotnet_naming_style.ends_with_async.word_separator =
|
||||||
dotnet_naming_style.ends_with_async.capitalization = pascal_case
|
dotnet_naming_style.ends_with_async.capitalization = pascal_case
|
||||||
|
|
||||||
###############################
|
###############################
|
||||||
|
|||||||
19
.gitattributes
vendored
19
.gitattributes
vendored
@@ -1,16 +1,13 @@
|
|||||||
# Set the default behavior, in case people don't have core.autocrlf set.
|
# Set the default behavior, in case people don't have core.autocrlf set.
|
||||||
* text=auto
|
* text=auto
|
||||||
|
* text eol=lf
|
||||||
# Explicitly declare text files you want to always be normalized and converted
|
|
||||||
# to native line endings on checkout.
|
|
||||||
|
|
||||||
# Declare files that will always have LF line endings on checkout.
|
|
||||||
*.yml text eol=lf
|
|
||||||
*.sh text eol=lf
|
|
||||||
|
|
||||||
# Declare files that will always have CRLF line endings on checkout.
|
|
||||||
*.cs text eol=crlf
|
|
||||||
|
|
||||||
# Denote all files that are truly binary and should not be modified.
|
# Denote all files that are truly binary and should not be modified.
|
||||||
*.png binary
|
*.eot binary
|
||||||
|
*.ico binary
|
||||||
*.jpg binary
|
*.jpg binary
|
||||||
|
*.otf binary
|
||||||
|
*.png binary
|
||||||
|
*.ttf binary
|
||||||
|
*.woff binary
|
||||||
|
*.woff2 binary
|
||||||
|
|||||||
3
.gitignore
vendored
3
.gitignore
vendored
@@ -195,9 +195,6 @@ FakesAssemblies/
|
|||||||
# Visual Studio 6 workspace options file
|
# Visual Studio 6 workspace options file
|
||||||
*.opt
|
*.opt
|
||||||
/tools
|
/tools
|
||||||
/BuildOutput
|
|
||||||
/Artifacts
|
|
||||||
/TestResults
|
|
||||||
*.DS_Store
|
*.DS_Store
|
||||||
.idea/
|
.idea/
|
||||||
launchSettings.json
|
launchSettings.json
|
||||||
|
|||||||
225
README.md
225
README.md
@@ -2,8 +2,7 @@
|
|||||||
|
|
||||||
[](https://github.com/Jackett/Jackett/issues)
|
[](https://github.com/Jackett/Jackett/issues)
|
||||||
[](https://github.com/Jackett/Jackett/pulls)
|
[](https://github.com/Jackett/Jackett/pulls)
|
||||||
[](https://ci.appveyor.com/project/Jackett/jackett)
|
[](https://dev.azure.com/jackett/jackett/_build/latest?definitionId=1&branchName=master)
|
||||||
[](https://dev.azure.com/Jackett-project/Jackett/_build/latest?definitionId=1&branchName=master)
|
|
||||||
[](https://github.com/Jackett/Jackett/releases/latest)
|
[](https://github.com/Jackett/Jackett/releases/latest)
|
||||||
[](https://hub.docker.com/r/linuxserver/jackett/)
|
[](https://hub.docker.com/r/linuxserver/jackett/)
|
||||||
[](https://discord.gg/J865QuA)
|
[](https://discord.gg/J865QuA)
|
||||||
@@ -19,14 +18,15 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
|
|||||||
|
|
||||||
|
|
||||||
#### Supported Systems
|
#### Supported Systems
|
||||||
* Windows 7SP1 or greater using .NET 4.6.1 or above [Download here](https://www.microsoft.com/net/framework/versions/net461)
|
* Windows 7SP1 or greater
|
||||||
* Linux [supported operating systems here](https://github.com/dotnet/core/blob/master/release-notes/2.1/2.1-supported-os.md#linux)
|
* Linux [supported operating systems here](https://github.com/dotnet/core/blob/master/release-notes/3.1/3.1-supported-os.md#linux)
|
||||||
* macOS 10.13 or greater
|
* macOS 10.13 or greater
|
||||||
|
|
||||||
<details> <summary> <b> Supported Public Trackers </b> </summary>
|
<details> <summary> <b> Supported Public Trackers </b> </summary>
|
||||||
|
|
||||||
* 1337x
|
* 1337x
|
||||||
* 7torrents
|
* 7torrents
|
||||||
|
* AcademicTorrents
|
||||||
* ACG.RIP
|
* ACG.RIP
|
||||||
* ACGsou
|
* ACGsou
|
||||||
* Anidex
|
* Anidex
|
||||||
@@ -37,9 +37,10 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
|
|||||||
* BigFANGroup
|
* BigFANGroup
|
||||||
* BitRu
|
* BitRu
|
||||||
* BitTorrent.AM
|
* BitTorrent.AM
|
||||||
|
* BT.etree
|
||||||
* BTDB
|
* BTDB
|
||||||
* BTDIGG
|
* BTDIGG
|
||||||
* BT.etree
|
* BTeye
|
||||||
* BTSOW
|
* BTSOW
|
||||||
* Cili180
|
* Cili180
|
||||||
* ConCen
|
* ConCen
|
||||||
@@ -48,11 +49,11 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
|
|||||||
* cpasbienClone
|
* cpasbienClone
|
||||||
* Demonoid
|
* Demonoid
|
||||||
* dmhy
|
* dmhy
|
||||||
* ETTV
|
|
||||||
* EliteTorrent.biz
|
* EliteTorrent.biz
|
||||||
* EstrenosDTL
|
* EstrenosDTL
|
||||||
* ExtraTorrent.cd
|
* ETTV
|
||||||
* EXT Torrents
|
* EXT Torrents
|
||||||
|
* ExtraTorrent.cd
|
||||||
* EZTV
|
* EZTV
|
||||||
* Filebase
|
* Filebase
|
||||||
* FireBit
|
* FireBit
|
||||||
@@ -64,16 +65,17 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
|
|||||||
* Horrible Subs
|
* Horrible Subs
|
||||||
* IBit
|
* IBit
|
||||||
* Idope
|
* Idope
|
||||||
|
* Il CorSaRo Blu
|
||||||
* Il Corsaro Nero <!-- maintained by bonny1992 -->
|
* Il Corsaro Nero <!-- maintained by bonny1992 -->
|
||||||
* Il Corsaro Blu
|
|
||||||
* Internet Archive (archive.org)
|
* Internet Archive (archive.org)
|
||||||
* Isohunt2
|
* Isohunt2
|
||||||
* iTorrent
|
* iTorrent
|
||||||
* KickAssTorrent (KATcr)
|
|
||||||
* KickAssTorrent (kat.li)
|
* KickAssTorrent (kat.li)
|
||||||
|
* KickAssTorrent (KATcr)
|
||||||
* Legit Torrents
|
* Legit Torrents
|
||||||
* LePorno
|
* LePorno
|
||||||
* LimeTorrents
|
* LimeTorrents
|
||||||
|
* LinuxTracker
|
||||||
* MacTorrents
|
* MacTorrents
|
||||||
* Magnet4You
|
* Magnet4You
|
||||||
* MagnetDL
|
* MagnetDL
|
||||||
@@ -81,28 +83,37 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
|
|||||||
* Monova
|
* Monova
|
||||||
* MovCr
|
* MovCr
|
||||||
* MoviesDVDR
|
* MoviesDVDR
|
||||||
|
* MyPornClub
|
||||||
* Newpct (aka: tvsinpagar, descargas2020, torrentlocura, torrentrapid, tumejortorrent, pctnew, etc)
|
* Newpct (aka: tvsinpagar, descargas2020, torrentlocura, torrentrapid, tumejortorrent, pctnew, etc)
|
||||||
* Newstudio
|
* Newstudio
|
||||||
* Nitro
|
* Nitro
|
||||||
* NNTT
|
* NNTT
|
||||||
* NoName Club (NNM-Club)
|
* NoName Club (NNM-Club)
|
||||||
* Nyaa.si
|
|
||||||
* Nyaa-Pantsu
|
* Nyaa-Pantsu
|
||||||
|
* Nyaa.si
|
||||||
|
* OneJAV
|
||||||
* OxTorrent
|
* OxTorrent
|
||||||
|
* ParnuXi
|
||||||
* PiratBit
|
* PiratBit
|
||||||
* Pirateiro
|
* Pirateiro
|
||||||
* PornLeech
|
* PornLeech
|
||||||
|
* PornoLive
|
||||||
|
* PornoRip
|
||||||
|
* PornoTor
|
||||||
* ProStyleX
|
* ProStyleX
|
||||||
|
* Rapidzona
|
||||||
* RARBG
|
* RARBG
|
||||||
* Rus-media
|
* Rus-media
|
||||||
* RuTor
|
* RuTor
|
||||||
|
* RuTracker.RU
|
||||||
* Seedpeer
|
* Seedpeer
|
||||||
* shokweb
|
* shokweb
|
||||||
* ShowRSS
|
* ShowRSS
|
||||||
* SkyTorrentsClone
|
* SkyTorrentsClone
|
||||||
* SolidTorrents
|
* SolidTorrents
|
||||||
* sukebei.Nyaa.si
|
* sosulki
|
||||||
* sukebei-Pantsu
|
* sukebei-Pantsu
|
||||||
|
* sukebei.Nyaa.si
|
||||||
* TFile
|
* TFile
|
||||||
* The Pirate Bay (TPB)
|
* The Pirate Bay (TPB)
|
||||||
* Tokyo Tosho
|
* Tokyo Tosho
|
||||||
@@ -110,6 +121,8 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
|
|||||||
* Torlock
|
* Torlock
|
||||||
* TOROS
|
* TOROS
|
||||||
* Torrent Downloads (TD)
|
* Torrent Downloads (TD)
|
||||||
|
* Torrent Oyun indir
|
||||||
|
* torrent-pirat
|
||||||
* Torrent4You
|
* Torrent4You
|
||||||
* Torrent9
|
* Torrent9
|
||||||
* Torrent9Clone
|
* Torrent9Clone
|
||||||
@@ -119,19 +132,23 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
|
|||||||
* TorrentKitty
|
* TorrentKitty
|
||||||
* TorrentParadise
|
* TorrentParadise
|
||||||
* TorrentProject2
|
* TorrentProject2
|
||||||
|
* TorrentRex
|
||||||
* TorrentQuest
|
* TorrentQuest
|
||||||
* Torrents.csv
|
* Torrents.csv
|
||||||
* TorrentWal
|
* Torrentv
|
||||||
|
* TorrentView
|
||||||
* Torrentz2
|
* Torrentz2
|
||||||
* Underverse
|
* Underverse
|
||||||
|
* UnionDHT
|
||||||
|
* xxxtor
|
||||||
* YourBittorrent
|
* YourBittorrent
|
||||||
* YTS.ag
|
* YTS.ag
|
||||||
|
* zetorrents
|
||||||
* Zooqle
|
* Zooqle
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
<details> <summary> <b> Supported Semi-Private Trackers </b> </summary>
|
<details> <summary> <b> Supported Semi-Private Trackers </b> </summary>
|
||||||
|
|
||||||
* Alein
|
|
||||||
* AlexFilm
|
* AlexFilm
|
||||||
* AniDUB
|
* AniDUB
|
||||||
* ArenaBG
|
* ArenaBG
|
||||||
@@ -140,29 +157,33 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
|
|||||||
* CasStudioTV
|
* CasStudioTV
|
||||||
* Crazy's Corner
|
* Crazy's Corner
|
||||||
* CzTorrent
|
* CzTorrent
|
||||||
* Deildu
|
|
||||||
* DXP (Deaf Experts)
|
* DXP (Deaf Experts)
|
||||||
|
* Deildu
|
||||||
* EniaHD
|
* EniaHD
|
||||||
|
* Erzsebet
|
||||||
|
* ExKinoRay
|
||||||
* ExtremlymTorrents
|
* ExtremlymTorrents
|
||||||
* Film-Paleis
|
* FilmsClub
|
||||||
* Gay-Torrents.net
|
* Gay-Torrents.net
|
||||||
* Gay-Torrents.org
|
* Gay-Torrents.org
|
||||||
* HamsterStudio
|
|
||||||
* HD Dolby
|
* HD Dolby
|
||||||
|
* HamsterStudio
|
||||||
|
* IV-Torrents
|
||||||
|
* KinoNaVse100
|
||||||
* Kinozal
|
* Kinozal
|
||||||
* Korsar
|
* Korsar
|
||||||
* LostFilm.tv
|
* LostFilm.tv
|
||||||
|
* MVGroup Forum
|
||||||
|
* MVGroup Main
|
||||||
* Marine Tracker
|
* Marine Tracker
|
||||||
* Metal Tracker
|
* Metal Tracker
|
||||||
* MuziekFrabriek
|
* MuziekFrabriek
|
||||||
* MVGroup Forum
|
|
||||||
* MVGroup Main
|
|
||||||
* NetHD (VietTorrent)
|
* NetHD (VietTorrent)
|
||||||
* Pornolab
|
* Pornolab
|
||||||
* RiperAM
|
* RiperAM
|
||||||
* RockBox
|
* RockBox
|
||||||
* Rustorka
|
|
||||||
* RuTracker
|
* RuTracker
|
||||||
|
* Rustorka
|
||||||
* Sharewood
|
* Sharewood
|
||||||
* SkTorrent
|
* SkTorrent
|
||||||
* SoundPark
|
* SoundPark
|
||||||
@@ -171,7 +192,6 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
|
|||||||
* Torrents-Local
|
* Torrents-Local
|
||||||
* TribalMixes
|
* TribalMixes
|
||||||
* Union Fansub
|
* Union Fansub
|
||||||
* Vanila
|
|
||||||
* YggTorrent (YGG)
|
* YggTorrent (YGG)
|
||||||
* Ztracker
|
* Ztracker
|
||||||
</details>
|
</details>
|
||||||
@@ -185,6 +205,7 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
|
|||||||
* 4thD (4th Dimension)
|
* 4thD (4th Dimension)
|
||||||
* 52PT
|
* 52PT
|
||||||
* 720pier
|
* 720pier
|
||||||
|
* AST4u
|
||||||
* Abnormal
|
* Abnormal
|
||||||
* Acid Lounge (A-L)
|
* Acid Lounge (A-L)
|
||||||
* Aftershock
|
* Aftershock
|
||||||
@@ -196,54 +217,55 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
|
|||||||
* Araba Fenice (Phoenix)
|
* Araba Fenice (Phoenix)
|
||||||
* Asgaard (AG)
|
* Asgaard (AG)
|
||||||
* AsianCinema
|
* AsianCinema
|
||||||
* AST4u
|
|
||||||
* Audiobook Torrents (ABT)
|
|
||||||
* AudioNews (AN)
|
* AudioNews (AN)
|
||||||
* Awesome-HD (AHD)
|
* Audiobook Torrents (ABT)
|
||||||
* Avistaz (AsiaTorrents)
|
* Avistaz (AsiaTorrents)
|
||||||
* Back-ups
|
* Awesome-HD (AHD)
|
||||||
* BakaBT
|
|
||||||
* BaconBits (bB)
|
|
||||||
* BeiTai
|
|
||||||
* BeyondHD (BHD)
|
|
||||||
* Bibliotik
|
|
||||||
* BIGTorrent
|
* BIGTorrent
|
||||||
* BigTower
|
|
||||||
* Bit-City Reloaded
|
|
||||||
* BIT-HDTV
|
* BIT-HDTV
|
||||||
* BiT-TiTAN
|
|
||||||
* Bithorlo (BHO)
|
|
||||||
* BitHUmen
|
|
||||||
* Bitspyder
|
|
||||||
* BitTorrentFiles
|
|
||||||
* BitTurk
|
|
||||||
* BJ-Share (BJ)
|
* BJ-Share (BJ)
|
||||||
* BlueBird
|
|
||||||
* Blutopia (BLU)
|
|
||||||
* Brasil Tracker
|
|
||||||
* BroadcastTheNet (BTN)
|
|
||||||
* BroadCity
|
|
||||||
* BRObits
|
* BRObits
|
||||||
* BrokenStones
|
|
||||||
* BTGigs (TG)
|
* BTGigs (TG)
|
||||||
* BTNext (BTNT)
|
* BTNext (BTNT)
|
||||||
* BTSCHOOL
|
* BTSCHOOL
|
||||||
* Carpathians
|
* Back-ups
|
||||||
* CartoonChaos (CC)
|
* BaconBits (bB)
|
||||||
* CasaTorrent
|
* BakaBT
|
||||||
|
* BeiTai
|
||||||
|
* BeyondHD (BHD)
|
||||||
|
* BiT-TiTAN
|
||||||
|
* Bibliotik
|
||||||
|
* BigTower
|
||||||
|
* Bit-City Reloaded
|
||||||
|
* BitHUmen
|
||||||
|
* BitTorrentFiles
|
||||||
|
* BitTurk
|
||||||
|
* Bithorlo (BHO)
|
||||||
|
* Bitspyder
|
||||||
|
* BlueBird
|
||||||
|
* Blutopia (BLU)
|
||||||
|
* Boxing Torrents
|
||||||
|
* Brasil Tracker
|
||||||
|
* BroadCity
|
||||||
|
* BroadcastTheNet (BTN)
|
||||||
|
* BrokenStones
|
||||||
* CCFBits
|
* CCFBits
|
||||||
* CGPeers
|
* CGPeers
|
||||||
* CHDBits
|
* CHDBits
|
||||||
|
* Carpathians
|
||||||
|
* CartoonChaos (CC)
|
||||||
|
* CasaTorrent
|
||||||
* ChannelX
|
* ChannelX
|
||||||
* Cinemageddon
|
|
||||||
* CinemaMovies
|
* CinemaMovies
|
||||||
* Cinematik
|
|
||||||
* CinemaZ (EuTorrents)
|
* CinemaZ (EuTorrents)
|
||||||
|
* Cinemageddon
|
||||||
|
* Cinematik
|
||||||
* Classix
|
* Classix
|
||||||
* Concertos
|
* Concertos
|
||||||
* CrazyHD
|
* CrazyHD
|
||||||
* CrazySpirits
|
* CrazySpirits
|
||||||
* CrnaBerza
|
* CrnaBerza
|
||||||
|
* DXDHD
|
||||||
* DanishBits (DB)
|
* DanishBits (DB)
|
||||||
* Das Unerwartete
|
* Das Unerwartete
|
||||||
* DataScene (DS)
|
* DataScene (DS)
|
||||||
@@ -257,21 +279,21 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
|
|||||||
* DocumentaryTorrents (DT)
|
* DocumentaryTorrents (DT)
|
||||||
* Downloadville
|
* Downloadville
|
||||||
* Dragonworld Reloaded
|
* Dragonworld Reloaded
|
||||||
* DXDHD
|
|
||||||
* EbookParadijs
|
* EbookParadijs
|
||||||
* Ebooks-Shares
|
* Ebooks-Shares
|
||||||
* EfectoDoppler
|
* EfectoDoppler
|
||||||
* EggMeOn
|
|
||||||
* Elite-Tracker
|
* Elite-Tracker
|
||||||
* Empornium (EMP)
|
* Empornium (EMP)
|
||||||
* eShareNet
|
* EpubLibre
|
||||||
* eStone (XiDER, BeLoad)
|
|
||||||
* Ethor.net (Thor's Land)
|
* Ethor.net (Thor's Land)
|
||||||
|
* ExoticaZ (YourExotic)
|
||||||
* ExtremeTorrents
|
* ExtremeTorrents
|
||||||
* FANO.IN
|
* FANO.IN
|
||||||
|
* Fantastic Heaven
|
||||||
* FeedUrNeed (FuN)
|
* FeedUrNeed (FuN)
|
||||||
* Femdomcult
|
* Femdomcult
|
||||||
* FileList (FL)
|
* FileList (FL)
|
||||||
|
* Film-Paleis
|
||||||
* FinVip
|
* FinVip
|
||||||
* FocusX
|
* FocusX
|
||||||
* FreeTorrent
|
* FreeTorrent
|
||||||
@@ -279,24 +301,22 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
|
|||||||
* FunFile (FF)
|
* FunFile (FF)
|
||||||
* FunkyTorrents (FT)
|
* FunkyTorrents (FT)
|
||||||
* Fuzer (FZ)
|
* Fuzer (FZ)
|
||||||
* Galeriens (LaPauseTorrents)
|
|
||||||
* GAYtorrent.ru
|
* GAYtorrent.ru
|
||||||
|
* GFXPeers
|
||||||
|
* Galeriens (LaPauseTorrents)
|
||||||
* GazelleGames (GGn)
|
* GazelleGames (GGn)
|
||||||
* Generation-Free
|
* Generation-Free
|
||||||
* GFXPeers
|
|
||||||
* GigaTorrents
|
* GigaTorrents
|
||||||
* GimmePeers (formerly ILT) <!-- maintained by jamesb2147 -->
|
* GimmePeers (formerly ILT)
|
||||||
* GiroTorrent
|
* GiroTorrent
|
||||||
* Greek Legends
|
|
||||||
* Greek Team
|
* Greek Team
|
||||||
* HacheDe
|
* HD-Bits.com
|
||||||
* HD-Forever (HDF)
|
* HD-Forever (HDF)
|
||||||
* HD-Olimpo
|
* HD-Olimpo
|
||||||
* HD-Only (HDO)
|
* HD-Only (HDO)
|
||||||
* HD-Space (HDS)
|
* HD-Space (HDS)
|
||||||
* HD-Spain
|
* HD-Spain
|
||||||
* HD-Torrents (HDT)
|
* HD-Torrents (HDT)
|
||||||
* HD-Bits.com
|
|
||||||
* HD4FANS
|
* HD4FANS
|
||||||
* HDArea (HDA)
|
* HDArea (HDA)
|
||||||
* HDBits
|
* HDBits
|
||||||
@@ -313,23 +333,26 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
|
|||||||
* HDTurk
|
* HDTurk
|
||||||
* HDU
|
* HDU
|
||||||
* HDZone
|
* HDZone
|
||||||
|
* HQSource (HQS)
|
||||||
|
* HacheDe
|
||||||
* Hebits
|
* Hebits
|
||||||
* Hon3y HD
|
* Hon3y HD
|
||||||
* HQSource (HQS)
|
* Horror Site
|
||||||
* HuSh
|
* HuSh
|
||||||
* ICE Torrent
|
* ICE Torrent
|
||||||
|
* IPTorrents (IPT)
|
||||||
* ImmortalSeed (iS)
|
* ImmortalSeed (iS)
|
||||||
* Immortuos
|
* Immortuos
|
||||||
* inPeril
|
|
||||||
* Insane Tracker
|
* Insane Tracker
|
||||||
* IPTorrents (IPT)
|
|
||||||
* JPopsuki
|
* JPopsuki
|
||||||
* Kapaki
|
* Kapaki
|
||||||
* Karagarga
|
* Karagarga
|
||||||
* LegacyHD (HD4Free)
|
* LastFiles
|
||||||
* Le Saloon
|
* Le Saloon
|
||||||
|
* LeChaudron
|
||||||
* LeagueHD
|
* LeagueHD
|
||||||
* LearnFlakes
|
* LearnFlakes
|
||||||
|
* LegacyHD (HD4Free)
|
||||||
* LibraNet (LN)
|
* LibraNet (LN)
|
||||||
* LinkoManija
|
* LinkoManija
|
||||||
* LosslessClub
|
* LosslessClub
|
||||||
@@ -337,11 +360,11 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
|
|||||||
* Magico (Trellas)
|
* Magico (Trellas)
|
||||||
* Majomparádé (TurkDepo)
|
* Majomparádé (TurkDepo)
|
||||||
* MicroBit (µBit)
|
* MicroBit (µBit)
|
||||||
|
* MMA-Torrents
|
||||||
* MoeCat
|
* MoeCat
|
||||||
* Mononoké-BT
|
* Mononoké-BT
|
||||||
* MoreThanTV (MTV)
|
* MoreThanTV (MTV)
|
||||||
* MyAnonamouse (MAM)
|
* MyAnonamouse (MAM)
|
||||||
* myAmity
|
|
||||||
* MySpleen
|
* MySpleen
|
||||||
* NBTorrents
|
* NBTorrents
|
||||||
* NCore
|
* NCore
|
||||||
@@ -351,57 +374,54 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
|
|||||||
* New Real World
|
* New Real World
|
||||||
* Norbits
|
* Norbits
|
||||||
* NordicBits (NB)
|
* NordicBits (NB)
|
||||||
* NORDiCHD
|
* Nostalgic (The Archive / VHSTAPES)
|
||||||
* Nostalgic (The Archive)
|
|
||||||
* notwhat.cd
|
|
||||||
* OnlineSelfEducation
|
* OnlineSelfEducation
|
||||||
* Orpheus
|
* Orpheus
|
||||||
* Ourbits (HDPter)
|
* Ourbits (HDPter)
|
||||||
* P2PBG
|
* P2PBG
|
||||||
* P2PElite
|
* P2PElite
|
||||||
|
* PT99
|
||||||
|
* PTFiles (PTF)
|
||||||
|
* PThome
|
||||||
|
* PWTorrents (PWT)
|
||||||
* Partis
|
* Partis
|
||||||
* PassThePopcorn (PTP)
|
* PassThePopcorn (PTP)
|
||||||
* Peers.FM
|
* Peers.FM
|
||||||
|
* PiXELHD (PxHD)
|
||||||
* PirateTheNet (PTN)
|
* PirateTheNet (PTN)
|
||||||
* PixelCove (Ultimate Gamer)
|
* PixelCove (Ultimate Gamer)
|
||||||
* PiXELHD (PxHD)
|
|
||||||
* Pleasuredome
|
* Pleasuredome
|
||||||
* PolishSource (PS)
|
* PolishSource (PS)
|
||||||
* PolishTracker
|
* PolishTracker
|
||||||
* Pornbay
|
|
||||||
* PornBits (PB)
|
* PornBits (PB)
|
||||||
|
* Pornbay
|
||||||
* Pretome
|
* Pretome
|
||||||
* PrivateHD (PHD)
|
* PrivateHD (PHD)
|
||||||
* ProAudioTorrents (PAT)
|
* ProAudioTorrents (PAT)
|
||||||
* Psytorrents
|
* Psytorrents
|
||||||
* PT99
|
|
||||||
* PTFiles (PTF)
|
|
||||||
* PThome
|
|
||||||
* PuntoTorrent
|
* PuntoTorrent
|
||||||
* PWTorrents (PWT)
|
|
||||||
* R3V WTF!
|
* R3V WTF!
|
||||||
|
* RPTorrents
|
||||||
* Racing4Everyone (R4E)
|
* Racing4Everyone (R4E)
|
||||||
* RacingForMe (RFM)
|
* RacingForMe (RFM)
|
||||||
* RainbowNation Sharing (RNS)
|
* RainbowNation Sharing (RNS)
|
||||||
* Redacted (PassTheHeadphones)
|
|
||||||
* Red Star Torrent (RST)
|
* Red Star Torrent (RST)
|
||||||
|
* Redacted (PassTheHeadphones)
|
||||||
* RetroFlix
|
* RetroFlix
|
||||||
* RevolutionTT
|
* RevolutionTT
|
||||||
* RoDVD (Cinefiles)
|
* RoDVD (Cinefiles)
|
||||||
* Romanian Metal Torrent (RMT)
|
* Romanian Metal Torrent (RMT)
|
||||||
* RPTorrents
|
* SDBits
|
||||||
* SceneFZ
|
* SceneFZ
|
||||||
* SceneHD
|
* SceneHD
|
||||||
* ScenePalace (SP)
|
* ScenePalace (SP)
|
||||||
* SceneRush
|
* SceneRush
|
||||||
* SceneTime
|
* SceneTime
|
||||||
* SceneXpress
|
|
||||||
* SDBits
|
|
||||||
* Secret Cinema
|
* Secret Cinema
|
||||||
* SeedFile (SF)
|
* SeedFile (SF)
|
||||||
* Shareisland
|
|
||||||
* ShareSpaceDB
|
* ShareSpaceDB
|
||||||
* ShareUniversity
|
* ShareUniversity
|
||||||
|
* Shareisland
|
||||||
* Shazbat
|
* Shazbat
|
||||||
* Shellife (SL)
|
* Shellife (SL)
|
||||||
* SiamBIT
|
* SiamBIT
|
||||||
@@ -409,61 +429,63 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
|
|||||||
* SpaceTorrent
|
* SpaceTorrent
|
||||||
* SpeedCD
|
* SpeedCD
|
||||||
* SpeedTorrent Reloaded
|
* SpeedTorrent Reloaded
|
||||||
|
* Spirit of Revolution
|
||||||
* SportHD
|
* SportHD
|
||||||
* SportsCult
|
* SportsCult
|
||||||
* SpringSunday
|
* SpringSunday
|
||||||
* SuperBits (SBS)
|
* SuperBits (SBS)
|
||||||
|
* TEKNO3D
|
||||||
|
* TLFBits
|
||||||
|
* TOrrent-tuRK (TORK)
|
||||||
|
* TTsWEB
|
||||||
|
* TV Chaos UK (TVCUK)
|
||||||
|
* TV-Vault
|
||||||
|
* TVstore
|
||||||
* TakeaByte
|
* TakeaByte
|
||||||
* Tapochek
|
* Tapochek
|
||||||
* Tasmanit
|
* Tasmanit
|
||||||
* TeamHD
|
* TeamHD
|
||||||
* TeamOS
|
* TeamOS
|
||||||
* TEKNO3D
|
|
||||||
* TellyTorrent
|
* TellyTorrent
|
||||||
* TenYardTorrents (TYT)
|
* TenYardTorrents (TYT)
|
||||||
* TheAudioScene
|
|
||||||
* TheEmpire (TE)
|
|
||||||
* The Falling Angels (TFA)
|
* The Falling Angels (TFA)
|
||||||
* The Geeks
|
* The Geeks
|
||||||
* The Horror Charnel (THC)
|
* The Horror Charnel (THC)
|
||||||
* The New Retro
|
* The New Retro
|
||||||
* The Occult
|
* The Occult
|
||||||
* The Place
|
* The Place
|
||||||
* The Resurrection
|
|
||||||
* The Shinning (TsH)
|
* The Shinning (TsH)
|
||||||
* The Show
|
* The Show
|
||||||
* The-Madhouse
|
|
||||||
* The Vault
|
* The Vault
|
||||||
* TLFBits
|
* The-Madhouse
|
||||||
|
* TheAudioScene
|
||||||
|
* TheEmpire (TE)
|
||||||
|
* ToTheGlory
|
||||||
* Torrent Network (TN)
|
* Torrent Network (TN)
|
||||||
* Torrent Sector Crew (TSC)
|
* Torrent Sector Crew (TSC)
|
||||||
|
* Torrent-Syndikat
|
||||||
* Torrent.LT
|
* Torrent.LT
|
||||||
* TorrentBD
|
* TorrentBD
|
||||||
* TorrentBytes (TBy)
|
* TorrentBytes (TBy)
|
||||||
* TorrentCCF (TCCF)
|
* TorrentCCF (TCCF)
|
||||||
* TorrentDay (TD)
|
* TorrentDay (TD)
|
||||||
* Torrentech (TTH)
|
|
||||||
* TorrentFactory
|
* TorrentFactory
|
||||||
* TorrentHeaven
|
|
||||||
* TorrentHR
|
* TorrentHR
|
||||||
* Torrenting (TT)
|
* TorrentHeaven
|
||||||
* Torrentland
|
|
||||||
* TorrentLeech (TL)
|
* TorrentLeech (TL)
|
||||||
* TorrentLeech.pl
|
* TorrentLeech.pl
|
||||||
* TorrentSeeds (TS)
|
* TorrentSeeds (TS)
|
||||||
* Torrent-Syndikat
|
* Torrentech (TTH)
|
||||||
* TOrrent-tuRK (TORK)
|
* Torrenting (TT)
|
||||||
|
* Torrentland
|
||||||
* TotallyKids (TK)
|
* TotallyKids (TK)
|
||||||
* ToTheGlory
|
|
||||||
* TranceTraffic
|
* TranceTraffic
|
||||||
* Trezzor
|
* Trezzor
|
||||||
* TurkTorrent (TT)
|
* TurkTorrent (TT)
|
||||||
* TV Chaos UK (TVCUK)
|
|
||||||
* TV-Vault
|
|
||||||
* TVstore
|
|
||||||
* Twilight Torrents
|
* Twilight Torrents
|
||||||
* Twilights Zoom
|
* Twilights Zoom
|
||||||
* u-torrents (SceneFZ)
|
* U-Torrents
|
||||||
|
* U2 (U2分享園@動漫花園)
|
||||||
* UHDBits
|
* UHDBits
|
||||||
* UnionGang
|
* UnionGang
|
||||||
* UnlimitZ
|
* UnlimitZ
|
||||||
@@ -471,17 +493,22 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
|
|||||||
* WDT (Wrestling Desires Torrents / Ultimate Wrestling Torrents)
|
* WDT (Wrestling Desires Torrents / Ultimate Wrestling Torrents)
|
||||||
* World-In-HD
|
* World-In-HD
|
||||||
* World-of-Tomorrow
|
* World-of-Tomorrow
|
||||||
* x-ite.me (XM)
|
|
||||||
* xBytesV2
|
|
||||||
* XSpeeds (XS)
|
* XSpeeds (XS)
|
||||||
* XWTorrents (XWT)
|
|
||||||
* XWT-Classics
|
* XWT-Classics
|
||||||
|
* XWTorrents (XWT)
|
||||||
* Xthor
|
* Xthor
|
||||||
* XtremeFile
|
|
||||||
* XtreMeZone (MYXZ)
|
* XtreMeZone (MYXZ)
|
||||||
* ExoticaZ (YourExotic)
|
* XtremeFile
|
||||||
* Zamunda.net
|
* Zamunda.net
|
||||||
* Zelka.org
|
* Zelka.org
|
||||||
|
* eShareNet
|
||||||
|
* eStone (XiDER, BeLoad)
|
||||||
|
* inPeril
|
||||||
|
* myAmity
|
||||||
|
* notwhat.cd
|
||||||
|
* u-torrents (SceneFZ)
|
||||||
|
* x-ite.me (XM)
|
||||||
|
* xBytesV2
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
Trackers marked with [![(invite needed)][inviteneeded]](#) have no active maintainer and are missing features or are broken. If you have an invite for them please send it to garfieldsixtynine -at- gmail.com to get them fixed/improved.
|
Trackers marked with [![(invite needed)][inviteneeded]](#) have no active maintainer and are missing features or are broken. If you have an invite for them please send it to garfieldsixtynine -at- gmail.com to get them fixed/improved.
|
||||||
|
|||||||
@@ -1,20 +1,20 @@
|
|||||||
author "sea3pea0"
|
author "sea3pea0"
|
||||||
description "Upstart Script to run NzbDrone as a service on Ubuntu/Debian based systems, as well as others"
|
description "Upstart Script to run NzbDrone as a service on Ubuntu/Debian based systems, as well as others"
|
||||||
|
|
||||||
#Set username for the process. Should probably be what you use for logging in
|
#Set username for the process. Should probably be what you use for logging in
|
||||||
setuid {username to run jackett}
|
setuid {username to run jackett}
|
||||||
setgid users
|
setgid users
|
||||||
|
|
||||||
#This is the install directory. If you installed using a deb package or the NzbDrone Repository you do not need to change this
|
#This is the install directory. If you installed using a deb package or the NzbDrone Repository you do not need to change this
|
||||||
|
|
||||||
env DIR=/opt/Jackett
|
env DIR=/opt/Jackett
|
||||||
env LD_LIBRARY_PATH=/usr/local/nzbdrone/lib
|
env LD_LIBRARY_PATH=/usr/local/nzbdrone/lib
|
||||||
|
|
||||||
start on runlevel [2345]
|
start on runlevel [2345]
|
||||||
stop on runlevel [016]
|
stop on runlevel [016]
|
||||||
|
|
||||||
respawn
|
respawn
|
||||||
script
|
script
|
||||||
chdir $DIR
|
chdir $DIR
|
||||||
exec /volume1/@appstore/Mono/usr/bin/mono --debug JackettConsole.exe
|
exec /volume1/@appstore/Mono/usr/bin/mono --debug JackettConsole.exe
|
||||||
end script
|
end script
|
||||||
|
|||||||
47
appveyor.yml
47
appveyor.yml
@@ -1,47 +0,0 @@
|
|||||||
version: 0.12.{build}
|
|
||||||
skip_tags: true
|
|
||||||
image:
|
|
||||||
- Ubuntu
|
|
||||||
- Visual Studio 2019
|
|
||||||
environment:
|
|
||||||
APPVEYOR_YML_DISABLE_PS_LINUX: true
|
|
||||||
CAKE_SETTINGS_SKIPPACKAGEVERSIONCHECK: true
|
|
||||||
configuration: Release
|
|
||||||
assembly_info:
|
|
||||||
patch: true
|
|
||||||
file: '**\AssemblyInfo.*'
|
|
||||||
assembly_version: '{version}'
|
|
||||||
assembly_file_version: '{version}'
|
|
||||||
assembly_informational_version: '{version}'
|
|
||||||
dotnet_csproj:
|
|
||||||
patch: true
|
|
||||||
file: '**\*.csproj'
|
|
||||||
version: '{version}'
|
|
||||||
package_version: '{version}'
|
|
||||||
assembly_version: '{version}'
|
|
||||||
file_version: '{version}'
|
|
||||||
informational_version: '{version}'
|
|
||||||
build_script:
|
|
||||||
- ps: .\build.ps1 --target=Windows-Appveyor
|
|
||||||
- sh: ./build.sh --target=Linux
|
|
||||||
test: off
|
|
||||||
before_deploy:
|
|
||||||
- ps: ${env:release_description} = ( Get-Content -LiteralPath BuildOutput/ReleaseNotes.txt -Encoding UTF8 ) -join "`n";
|
|
||||||
deploy:
|
|
||||||
- provider: GitHub
|
|
||||||
tag: v$(APPVEYOR_BUILD_VERSION)
|
|
||||||
description: $(release_description)
|
|
||||||
auth_token:
|
|
||||||
secure: hOg+16YTIbq4kO9u4D1YVOTbWDqgCX6mAQYMbnmBBSw2CiUsZh7OKbupoUb3FtWa
|
|
||||||
artifact: /^(?:(?![Ee]xperimental).)*$/
|
|
||||||
draft: true
|
|
||||||
force_update: true
|
|
||||||
on:
|
|
||||||
branch: master
|
|
||||||
notifications:
|
|
||||||
- provider: Webhook
|
|
||||||
url: https://skyhook.glitch.me/api/webhooks/346588605843767297/_VWi5abKliaWsBmQO7AX69tD28FhqSLjKyLBwkSwwT13uyWJQHx5TSWK_iAs-0RzmyvZ/appveyor
|
|
||||||
method: POST
|
|
||||||
on_build_success: true
|
|
||||||
on_build_failure: true
|
|
||||||
on_build_status_changed: true
|
|
||||||
@@ -1,12 +1,19 @@
|
|||||||
name: $(majorVersion).$(minorVersion).$(patchVersion)
|
name: $(majorVersion).$(minorVersion).$(patchVersion)
|
||||||
variables:
|
variables:
|
||||||
majorVersion: 0
|
majorVersion: 0
|
||||||
minorVersion: 13
|
minorVersion: 14
|
||||||
patchVersion: $[counter(variables['minorVersion'], 1)] #this will reset when we bump minor
|
patchVersion: $[counter(variables['minorVersion'], 1)] #this will reset when we bump minor
|
||||||
jackettVersion: $(majorVersion).$(minorVersion).$(patchVersion)
|
jackettVersion: $(majorVersion).$(minorVersion).$(patchVersion)
|
||||||
buildConfiguration: Release
|
buildConfiguration: Release
|
||||||
netCoreFramework: netcoreapp3.1
|
netCoreFramework: netcoreapp3.1
|
||||||
netCoreSdkVersion: 3.1.x
|
netCoreSdkVersion: 3.1.x
|
||||||
|
system.debug: true
|
||||||
|
|
||||||
|
pr:
|
||||||
|
autoCancel: true
|
||||||
|
|
||||||
|
trigger:
|
||||||
|
batch: true
|
||||||
|
|
||||||
stages:
|
stages:
|
||||||
- stage: BuildJackett
|
- stage: BuildJackett
|
||||||
@@ -321,24 +328,6 @@ stages:
|
|||||||
if [[ "$(artifactName)" == *"macOS"* ]]; then sudo ./install_service_macos; fi
|
if [[ "$(artifactName)" == *"macOS"* ]]; then sudo ./install_service_macos; fi
|
||||||
if [[ "$(artifactName)" == *"LinuxAMDx64"* ]]; then sudo ./install_service_systemd.sh; fi
|
if [[ "$(artifactName)" == *"LinuxAMDx64"* ]]; then sudo ./install_service_systemd.sh; fi
|
||||||
|
|
||||||
#Remove this task once ChromeDriver is deployed to Ubuntu image https://github.com/actions/virtual-environments/issues/9
|
|
||||||
- task: Bash@3
|
|
||||||
displayName: Install ChromeDriver (Linux and Mono)
|
|
||||||
condition: and(succeeded(), eq(variables['imageName'], 'ubuntu-latest'))
|
|
||||||
inputs:
|
|
||||||
targetType: inline
|
|
||||||
script: |
|
|
||||||
CHROME_VERSION=$(google-chrome --version | cut -f 3 -d ' ' | cut -d '.' -f 1) \
|
|
||||||
&& CHROMEDRIVER_RELEASE=$(curl --location --fail --retry 3 http://chromedriver.storage.googleapis.com/LATEST_RELEASE_${CHROME_VERSION}) \
|
|
||||||
&& curl --silent --show-error --location --fail --retry 3 --output /tmp/chromedriver_linux64.zip "http://chromedriver.storage.googleapis.com/$CHROMEDRIVER_RELEASE/chromedriver_linux64.zip" \
|
|
||||||
&& cd /tmp \
|
|
||||||
&& unzip chromedriver_linux64.zip \
|
|
||||||
&& rm -rf chromedriver_linux64.zip \
|
|
||||||
&& sudo mv chromedriver /usr/local/bin/chromedriver \
|
|
||||||
&& sudo chmod +x /usr/local/bin/chromedriver \
|
|
||||||
&& chromedriver --version
|
|
||||||
echo "##vso[task.setvariable variable=CHROMEWEBDRIVER]/usr/local/bin"
|
|
||||||
|
|
||||||
- task: UseDotNet@2
|
- task: UseDotNet@2
|
||||||
displayName: Install .NET Core SDK
|
displayName: Install .NET Core SDK
|
||||||
inputs:
|
inputs:
|
||||||
@@ -370,17 +359,40 @@ stages:
|
|||||||
patterns: '**/Jackett*'
|
patterns: '**/Jackett*'
|
||||||
path: $(Build.ArtifactStagingDirectory)
|
path: $(Build.ArtifactStagingDirectory)
|
||||||
|
|
||||||
- task: GitHubRelease@0
|
- task: GitHubRelease@1
|
||||||
displayName: Create Github release
|
displayName: Create Github release
|
||||||
inputs:
|
inputs:
|
||||||
gitHubConnection: github.com_jackett
|
gitHubConnection: github.com_jackett
|
||||||
repositoryName: '$(Build.Repository.Name)'
|
repositoryName: '$(Build.Repository.Name)'
|
||||||
action: create
|
action: create
|
||||||
target: $(Build.SourceVersion)
|
target: $(Build.SourceVersion)
|
||||||
tagSource: manual
|
tagSource: userSpecifiedTag
|
||||||
tag: v$(Build.BuildNumber)
|
tag: v$(Build.BuildNumber)
|
||||||
title: v$(Build.BuildNumber)
|
title: v$(Build.BuildNumber)
|
||||||
assets: $(Build.ArtifactStagingDirectory)/drop/*
|
assets: $(Build.ArtifactStagingDirectory)/drop/*
|
||||||
|
assetUploadMode: replace
|
||||||
isDraft: true
|
isDraft: true
|
||||||
addChangeLog: true
|
addChangeLog: true
|
||||||
compareWith: lastNonDraftRelease
|
compareWith: lastNonDraftRelease
|
||||||
|
|
||||||
|
- task: PowerShell@2
|
||||||
|
displayName: Ensure all artifacts are uploaded to Github
|
||||||
|
inputs:
|
||||||
|
targetType: inline
|
||||||
|
script: |
|
||||||
|
$json = Invoke-WebRequest 'https://dev.azure.com/jackett/jackett/_apis/build/builds/$(Build.BuildId)/logs?api-version=5.0' | ConvertFrom-Json
|
||||||
|
$lastTwoLogUrls = $json.value[-1..-2].url
|
||||||
|
foreach($logUrl in $lastTwoLogUrls)
|
||||||
|
{
|
||||||
|
Write-Output $logUrl
|
||||||
|
$logText = Invoke-WebRequest $logUrl
|
||||||
|
if ($logText -like '*Creating a release for tag:*')
|
||||||
|
{
|
||||||
|
$logInspect = ($logText -split "Creating a release for tag:")[-1]
|
||||||
|
$successCount = (Select-String "Uploaded file successfully:" -InputObject $logInspect -AllMatches).Matches.Count
|
||||||
|
$failureCount = (Select-String "Duplicate asset found:" -InputObject $logInspect -AllMatches).Matches.Count
|
||||||
|
Write-Output "Success count is: $successCount and failure count is: $failureCount"
|
||||||
|
if (($successCount -ne 7) -or ($failureCount -ne 0)) { Write-Host "##vso[task.complete result=Failed;]DONE" }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
510
build.cake
510
build.cake
@@ -1,510 +0,0 @@
|
|||||||
#tool nuget:?package=NUnit.ConsoleRunner
|
|
||||||
#addin nuget:?package=Cake.Git
|
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////
|
|
||||||
// ARGUMENTS
|
|
||||||
//////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
var target = Argument("target", "Default");
|
|
||||||
var configuration = Argument("configuration", "Debug");
|
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////
|
|
||||||
// PREPARATION
|
|
||||||
//////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
// Define directories.
|
|
||||||
var workingDir = MakeAbsolute(Directory("./"));
|
|
||||||
string artifactsDirName = "Artifacts";
|
|
||||||
string testResultsDirName = "TestResults";
|
|
||||||
string netCoreFramework = "netcoreapp3.1";
|
|
||||||
string serverProjectPath = "./src/Jackett.Server/Jackett.Server.csproj";
|
|
||||||
string updaterProjectPath = "./src/Jackett.Updater/Jackett.Updater.csproj";
|
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////
|
|
||||||
// TASKS
|
|
||||||
//////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
Task("Info")
|
|
||||||
.Does(() =>
|
|
||||||
{
|
|
||||||
Information(@"Jackett Cake build script starting...");
|
|
||||||
Information(@"Requires InnoSetup and C:\msys64 to be present for packaging (Pre-installed on AppVeyor) on Windows");
|
|
||||||
Information(@"Working directory is: " + workingDir);
|
|
||||||
|
|
||||||
if (IsRunningOnWindows())
|
|
||||||
{
|
|
||||||
Information("Platform is Windows");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Information("Platform is Linux, Windows builds will be skipped");
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
Task("Clean")
|
|
||||||
.IsDependentOn("Info")
|
|
||||||
.Does(() =>
|
|
||||||
{
|
|
||||||
CleanDirectories("./src/**/obj");
|
|
||||||
CleanDirectories("./src/**/bin");
|
|
||||||
CleanDirectories("./BuildOutput");
|
|
||||||
CleanDirectories("./" + artifactsDirName);
|
|
||||||
CleanDirectories("./" + testResultsDirName);
|
|
||||||
|
|
||||||
CreateDirectory("./" + artifactsDirName);
|
|
||||||
|
|
||||||
Information("Clean completed");
|
|
||||||
});
|
|
||||||
|
|
||||||
Task("Build-Full-Framework")
|
|
||||||
.IsDependentOn("Clean")
|
|
||||||
.Does(() =>
|
|
||||||
{
|
|
||||||
NuGetRestore("./src/Jackett.sln");
|
|
||||||
|
|
||||||
var buildSettings = new MSBuildSettings()
|
|
||||||
.SetConfiguration(configuration)
|
|
||||||
.UseToolVersion(MSBuildToolVersion.VS2019);
|
|
||||||
|
|
||||||
MSBuild("./src/Jackett.sln", buildSettings);
|
|
||||||
});
|
|
||||||
|
|
||||||
Task("Run-Unit-Tests")
|
|
||||||
.IsDependentOn("Build-Full-Framework")
|
|
||||||
.Does(() =>
|
|
||||||
{
|
|
||||||
CreateDirectory("./" + testResultsDirName);
|
|
||||||
var resultsFile = $"./{testResultsDirName}/JackettTestResult.xml";
|
|
||||||
|
|
||||||
NUnit3("./src/**/bin/" + configuration + "/net461/*.Test.dll", new NUnit3Settings
|
|
||||||
{
|
|
||||||
Results = new[] { new NUnit3Result { FileName = resultsFile } }
|
|
||||||
});
|
|
||||||
|
|
||||||
if (AppVeyor.IsRunningOnAppVeyor && IsRunningOnWindows())
|
|
||||||
{
|
|
||||||
AppVeyor.UploadTestResults(resultsFile, AppVeyorTestResultsType.NUnit3);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
Task("Package-Windows-Full-Framework")
|
|
||||||
.IsDependentOn("Run-Unit-Tests")
|
|
||||||
.Does(() =>
|
|
||||||
{
|
|
||||||
string buildOutputPath = "./BuildOutput/net461/win7-x86/Jackett";
|
|
||||||
|
|
||||||
DotNetCorePublish(serverProjectPath, "net461", "win7-x86", buildOutputPath);
|
|
||||||
|
|
||||||
CopyFiles("./src/Jackett.Service/bin/" + configuration + "/net461" + "/JackettService.*", buildOutputPath);
|
|
||||||
CopyFiles("./src/Jackett.Tray/bin/" + configuration + "/net461" + "/JackettTray.*", buildOutputPath);
|
|
||||||
CopyFiles("./src/Jackett.Updater/bin/" + configuration + "/net461" + "/JackettUpdater.*", buildOutputPath);
|
|
||||||
|
|
||||||
Zip("./BuildOutput/net461/win7-x86", $"./{artifactsDirName}/Jackett.Binaries.Windows.zip");
|
|
||||||
|
|
||||||
//InnoSetup
|
|
||||||
string sourceFolder = MakeAbsolute(Directory(buildOutputPath)).ToString();
|
|
||||||
|
|
||||||
InnoSetupSettings settings = new InnoSetupSettings();
|
|
||||||
settings.OutputDirectory = workingDir + "/" + artifactsDirName;
|
|
||||||
//Can remove below line once Cake is updated for InnoSetup 6 - https://github.com/cake-build/cake/pull/2565
|
|
||||||
settings.ToolPath = @"C:\Program Files (x86)\Inno Setup 6\ISCC.exe";
|
|
||||||
settings.Defines = new Dictionary<string, string>
|
|
||||||
{
|
|
||||||
{ "MyFileForVersion", sourceFolder + "/Jackett.Common.dll" },
|
|
||||||
{ "MySourceFolder", sourceFolder },
|
|
||||||
{ "MyOutputFilename", "Jackett.Installer.Windows" },
|
|
||||||
};
|
|
||||||
|
|
||||||
InnoSetup("./Installer.iss", settings);
|
|
||||||
});
|
|
||||||
|
|
||||||
Task("Package-Mono-Full-Framework")
|
|
||||||
.IsDependentOn("Run-Unit-Tests")
|
|
||||||
.Does(() =>
|
|
||||||
{
|
|
||||||
string buildOutputPath = "./BuildOutput/net461/linux-x64/Jackett";
|
|
||||||
|
|
||||||
DotNetCorePublish(serverProjectPath, "net461", "linux-x64", buildOutputPath);
|
|
||||||
|
|
||||||
CopyFiles("./src/Jackett.Updater/bin/" + configuration + "/net461" + "/JackettUpdater.*", buildOutputPath); //builds against multiple frameworks
|
|
||||||
|
|
||||||
CopyFileToDirectory("./install_service_systemd_mono.sh", buildOutputPath);
|
|
||||||
CopyFileToDirectory("./Upstart.config", buildOutputPath);
|
|
||||||
|
|
||||||
//There is an issue with Mono 5.8 (fixed in Mono 5.12) where its expecting to use its own patched version of System.Net.Http.dll, instead of the version supplied in folder
|
|
||||||
//https://github.com/dotnet/corefx/issues/19914
|
|
||||||
//https://bugzilla.xamarin.com/show_bug.cgi?id=60315
|
|
||||||
//The workaround is to delete System.Net.Http.dll and patch the .exe.config file
|
|
||||||
|
|
||||||
DeleteFile(buildOutputPath + "/System.Net.Http.dll");
|
|
||||||
|
|
||||||
var configFile = File(buildOutputPath + "/JackettConsole.exe.config");
|
|
||||||
XmlPoke(configFile, "configuration/runtime/*[name()='assemblyBinding']/*[name()='dependentAssembly']/*[name()='assemblyIdentity'][@name='System.Net.Http']/../*[name()='bindingRedirect']/@newVersion", "4.0.0.0");
|
|
||||||
|
|
||||||
//Mono on FreeBSD doesn't like the bundled System.Runtime.InteropServices.RuntimeInformation
|
|
||||||
//https://github.com/dotnet/corefx/issues/23989
|
|
||||||
//https://github.com/Jackett/Jackett/issues/3547
|
|
||||||
|
|
||||||
DeleteFile(buildOutputPath + "/System.Runtime.InteropServices.RuntimeInformation.dll");
|
|
||||||
|
|
||||||
CheckForGzipAndTar();
|
|
||||||
Gzip("./BuildOutput/net461/linux-x64", $"./{artifactsDirName}", "Jackett", "Jackett.Binaries.Mono.tar.gz");
|
|
||||||
});
|
|
||||||
|
|
||||||
Task("Package-DotNetCore-macOS")
|
|
||||||
.IsDependentOn("Clean")
|
|
||||||
.Does(() =>
|
|
||||||
{
|
|
||||||
string runtimeId = "osx-x64";
|
|
||||||
string buildOutputPath = $"./BuildOutput/{netCoreFramework}/{runtimeId}/Jackett";
|
|
||||||
string updaterOutputPath = buildOutputPath + "/Updater";
|
|
||||||
|
|
||||||
DotNetCorePublish(serverProjectPath, netCoreFramework, runtimeId, buildOutputPath);
|
|
||||||
|
|
||||||
DotNetCorePublish(updaterProjectPath, netCoreFramework, runtimeId, updaterOutputPath);
|
|
||||||
CopyFiles(updaterOutputPath + "/JackettUpdater*", buildOutputPath);
|
|
||||||
DeleteDirectory(updaterOutputPath, new DeleteDirectorySettings {Recursive = true, Force = true});
|
|
||||||
|
|
||||||
CopyFileToDirectory("./install_service_macos", buildOutputPath);
|
|
||||||
|
|
||||||
Gzip($"./BuildOutput/{netCoreFramework}/{runtimeId}", $"./{artifactsDirName}", "Jackett", "Jackett.Binaries.macOS.tar.gz");
|
|
||||||
});
|
|
||||||
|
|
||||||
Task("Package-DotNetCore-LinuxAMDx64")
|
|
||||||
.IsDependentOn("Clean")
|
|
||||||
.Does(() =>
|
|
||||||
{
|
|
||||||
string runtimeId = "linux-x64";
|
|
||||||
string buildOutputPath = $"./BuildOutput/{netCoreFramework}/{runtimeId}/Jackett";
|
|
||||||
string updaterOutputPath = buildOutputPath + "/Updater";
|
|
||||||
|
|
||||||
DotNetCorePublish(serverProjectPath, netCoreFramework, runtimeId, buildOutputPath);
|
|
||||||
|
|
||||||
DotNetCorePublish(updaterProjectPath, netCoreFramework, runtimeId, updaterOutputPath);
|
|
||||||
CopyFiles(updaterOutputPath + "/JackettUpdater*", buildOutputPath);
|
|
||||||
DeleteDirectory(updaterOutputPath, new DeleteDirectorySettings {Recursive = true, Force = true});
|
|
||||||
|
|
||||||
CopyFileToDirectory("./install_service_systemd.sh", buildOutputPath);
|
|
||||||
CopyFileToDirectory("./jackett_launcher.sh", buildOutputPath);
|
|
||||||
|
|
||||||
Gzip($"./BuildOutput/{netCoreFramework}/{runtimeId}", $"./{artifactsDirName}", "Jackett", "Jackett.Binaries.LinuxAMDx64.tar.gz");
|
|
||||||
});
|
|
||||||
|
|
||||||
Task("Package-DotNetCore-LinuxARM32")
|
|
||||||
.IsDependentOn("Clean")
|
|
||||||
.Does(() =>
|
|
||||||
{
|
|
||||||
string runtimeId = "linux-arm";
|
|
||||||
string buildOutputPath = $"./BuildOutput/{netCoreFramework}/{runtimeId}/Jackett";
|
|
||||||
string updaterOutputPath = buildOutputPath + "/Updater";
|
|
||||||
|
|
||||||
DotNetCorePublish(serverProjectPath, netCoreFramework, runtimeId, buildOutputPath);
|
|
||||||
|
|
||||||
DotNetCorePublish(updaterProjectPath, netCoreFramework, runtimeId, updaterOutputPath);
|
|
||||||
CopyFiles(updaterOutputPath + "/JackettUpdater*", buildOutputPath);
|
|
||||||
DeleteDirectory(updaterOutputPath, new DeleteDirectorySettings {Recursive = true, Force = true});
|
|
||||||
|
|
||||||
CopyFileToDirectory("./install_service_systemd.sh", buildOutputPath);
|
|
||||||
CopyFileToDirectory("./jackett_launcher.sh", buildOutputPath);
|
|
||||||
|
|
||||||
Gzip($"./BuildOutput/{netCoreFramework}/{runtimeId}", $"./{artifactsDirName}", "Jackett", "Jackett.Binaries.LinuxARM32.tar.gz");
|
|
||||||
});
|
|
||||||
|
|
||||||
Task("Package-DotNetCore-LinuxARM64")
|
|
||||||
.IsDependentOn("Clean")
|
|
||||||
.Does(() =>
|
|
||||||
{
|
|
||||||
string runtimeId = "linux-arm64";
|
|
||||||
string buildOutputPath = $"./BuildOutput/{netCoreFramework}/{runtimeId}/Jackett";
|
|
||||||
string updaterOutputPath = buildOutputPath + "/Updater";
|
|
||||||
|
|
||||||
DotNetCorePublish(serverProjectPath, netCoreFramework, runtimeId, buildOutputPath);
|
|
||||||
|
|
||||||
DotNetCorePublish(updaterProjectPath, netCoreFramework, runtimeId, updaterOutputPath);
|
|
||||||
CopyFiles(updaterOutputPath + "/JackettUpdater*", buildOutputPath);
|
|
||||||
DeleteDirectory(updaterOutputPath, new DeleteDirectorySettings {Recursive = true, Force = true});
|
|
||||||
|
|
||||||
CopyFileToDirectory("./install_service_systemd.sh", buildOutputPath);
|
|
||||||
CopyFileToDirectory("./jackett_launcher.sh", buildOutputPath);
|
|
||||||
|
|
||||||
Gzip($"./BuildOutput/{netCoreFramework}/{runtimeId}", $"./{artifactsDirName}", "Jackett", "Jackett.Binaries.LinuxARM64.tar.gz");
|
|
||||||
});
|
|
||||||
|
|
||||||
Task("Appveyor-Push-Artifacts")
|
|
||||||
.IsDependentOn("Clean")
|
|
||||||
.Does(() =>
|
|
||||||
{
|
|
||||||
if (AppVeyor.IsRunningOnAppVeyor)
|
|
||||||
{
|
|
||||||
foreach (var file in GetFiles(workingDir + $"/{artifactsDirName}/*"))
|
|
||||||
{
|
|
||||||
AppVeyor.UploadArtifact(file.FullPath);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Information(@"Skipping artifact push as not running in AppVeyor Windows Environment");
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
Task("Release-Notes")
|
|
||||||
.IsDependentOn("Clean")
|
|
||||||
.Does(() =>
|
|
||||||
{
|
|
||||||
string latestTag = GitDescribe(".", false, GitDescribeStrategy.Tags, 0);
|
|
||||||
Information($"Latest tag is: {latestTag}" + Environment.NewLine);
|
|
||||||
|
|
||||||
List<GitCommit> relevantCommits = new List<GitCommit>();
|
|
||||||
|
|
||||||
var commitCollection = GitLog("./", 50);
|
|
||||||
|
|
||||||
foreach(GitCommit commit in commitCollection)
|
|
||||||
{
|
|
||||||
var commitTag = GitDescribe(".", commit.Sha, false, GitDescribeStrategy.Tags, 0);
|
|
||||||
|
|
||||||
if (commitTag == latestTag)
|
|
||||||
{
|
|
||||||
relevantCommits.Add(commit);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
relevantCommits = relevantCommits.AsEnumerable().Reverse().Skip(1).ToList();
|
|
||||||
|
|
||||||
if (relevantCommits.Count() > 0)
|
|
||||||
{
|
|
||||||
List<string> notesList = new List<string>();
|
|
||||||
|
|
||||||
foreach(GitCommit commit in relevantCommits)
|
|
||||||
{
|
|
||||||
notesList.Add($"{commit.MessageShort} (Thank you @{commit.Author.Name})");
|
|
||||||
}
|
|
||||||
|
|
||||||
string buildNote = String.Join(Environment.NewLine, notesList);
|
|
||||||
Information(buildNote);
|
|
||||||
|
|
||||||
System.IO.File.WriteAllLines(workingDir + "/BuildOutput/ReleaseNotes.txt", notesList.ToArray());
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Information($"No commit messages found to create release notes");
|
|
||||||
}
|
|
||||||
|
|
||||||
});
|
|
||||||
|
|
||||||
Task("Windows-Environment-Dev")
|
|
||||||
.IsDependentOn("Package-Windows-Full-Framework")
|
|
||||||
.IsDependentOn("Package-Mono-Full-Framework")
|
|
||||||
.IsDependentOn("Package-DotNetCore-macOS")
|
|
||||||
.IsDependentOn("Package-DotNetCore-LinuxAMDx64")
|
|
||||||
.IsDependentOn("Package-DotNetCore-LinuxARM32")
|
|
||||||
.IsDependentOn("Package-DotNetCore-LinuxARM64")
|
|
||||||
.IsDependentOn("Appveyor-Push-Artifacts")
|
|
||||||
.IsDependentOn("Release-Notes")
|
|
||||||
.Does(() =>
|
|
||||||
{
|
|
||||||
Information("Windows-Environment Task Completed");
|
|
||||||
});
|
|
||||||
|
|
||||||
Task("Windows-Environment-Appveyor")
|
|
||||||
.IsDependentOn("Package-Windows-Full-Framework")
|
|
||||||
.IsDependentOn("Package-Mono-Full-Framework")
|
|
||||||
.IsDependentOn("Appveyor-Push-Artifacts")
|
|
||||||
.IsDependentOn("Release-Notes")
|
|
||||||
.Does(() =>
|
|
||||||
{
|
|
||||||
Information("Windows-Environment Task Completed");
|
|
||||||
});
|
|
||||||
|
|
||||||
Task("Linux-Environment")
|
|
||||||
.IsDependentOn("Package-DotNetCore-macOS")
|
|
||||||
.IsDependentOn("Package-DotNetCore-LinuxAMDx64")
|
|
||||||
.IsDependentOn("Package-DotNetCore-LinuxARM32")
|
|
||||||
.IsDependentOn("Package-DotNetCore-LinuxARM64")
|
|
||||||
.IsDependentOn("Appveyor-Push-Artifacts")
|
|
||||||
.IsDependentOn("Release-Notes")
|
|
||||||
.Does(() =>
|
|
||||||
{
|
|
||||||
Information("Linux-Environment Task Completed");
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
private void RunMsysCommand(string utility, string utilityArguments)
|
|
||||||
{
|
|
||||||
var msysDir = @"C:\msys64\usr\bin\";
|
|
||||||
var utilityProcess = msysDir + utility + ".exe";
|
|
||||||
|
|
||||||
Information("MSYS2 Utility: " + utility);
|
|
||||||
Information("MSYS2 Directory: " + msysDir);
|
|
||||||
Information("Utility Location: " + utilityProcess);
|
|
||||||
Information("Utility Arguments: " + utilityArguments);
|
|
||||||
|
|
||||||
IEnumerable<string> redirectedStandardOutput;
|
|
||||||
IEnumerable<string> redirectedErrorOutput;
|
|
||||||
var exitCodeWithArgument =
|
|
||||||
StartProcess(
|
|
||||||
utilityProcess,
|
|
||||||
new ProcessSettings {
|
|
||||||
Arguments = utilityArguments,
|
|
||||||
WorkingDirectory = msysDir,
|
|
||||||
RedirectStandardOutput = true
|
|
||||||
},
|
|
||||||
out redirectedStandardOutput,
|
|
||||||
out redirectedErrorOutput
|
|
||||||
);
|
|
||||||
|
|
||||||
Information(utility + " output:" + Environment.NewLine + string.Join(Environment.NewLine, redirectedStandardOutput.ToArray()));
|
|
||||||
|
|
||||||
// Throw exception if anything was written to the standard error.
|
|
||||||
if (redirectedErrorOutput != null && redirectedErrorOutput.Any())
|
|
||||||
{
|
|
||||||
throw new Exception(
|
|
||||||
string.Format(
|
|
||||||
utility + " Errors ocurred: {0}",
|
|
||||||
string.Join(", ", redirectedErrorOutput)));
|
|
||||||
}
|
|
||||||
|
|
||||||
Information(utility + " Exit code: {0}", exitCodeWithArgument);
|
|
||||||
}
|
|
||||||
|
|
||||||
private string RelativeWinPathToFullPath(string relativePath)
|
|
||||||
{
|
|
||||||
return (workingDir + relativePath.TrimStart('.'));
|
|
||||||
}
|
|
||||||
|
|
||||||
private void RunLinuxCommand(string file, string arg)
|
|
||||||
{
|
|
||||||
var startInfo = new System.Diagnostics.ProcessStartInfo()
|
|
||||||
{
|
|
||||||
Arguments = arg,
|
|
||||||
FileName = file,
|
|
||||||
UseShellExecute = true
|
|
||||||
};
|
|
||||||
|
|
||||||
var process = System.Diagnostics.Process.Start(startInfo);
|
|
||||||
process.WaitForExit();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void Gzip(string sourceFolder, string outputDirectory, string tarCdirectoryOption, string outputFileName)
|
|
||||||
{
|
|
||||||
var tarFileName = outputFileName.Remove(outputFileName.Length - 3, 3);
|
|
||||||
|
|
||||||
if (IsRunningOnWindows())
|
|
||||||
{
|
|
||||||
var fullSourcePath = RelativeWinPathToFullPath(sourceFolder);
|
|
||||||
var tarArguments = @"--force-local -cvf " + fullSourcePath + "/" + tarFileName + " -C " + fullSourcePath + $" {tarCdirectoryOption} --mode ='755'";
|
|
||||||
var gzipArguments = @"-k " + fullSourcePath + "/" + tarFileName;
|
|
||||||
|
|
||||||
RunMsysCommand("tar", tarArguments);
|
|
||||||
RunMsysCommand("gzip", gzipArguments);
|
|
||||||
MoveFile($"{sourceFolder}/{tarFileName}.gz", $"{outputDirectory}/{tarFileName}.gz");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
RunLinuxCommand("find", MakeAbsolute(Directory(sourceFolder)) + @" -type d -exec chmod 755 {} \;");
|
|
||||||
RunLinuxCommand("find", MakeAbsolute(Directory(sourceFolder)) + @" -type f -exec chmod 644 {} \;");
|
|
||||||
RunLinuxCommand("chmod", $"755 {MakeAbsolute(Directory(sourceFolder))}/Jackett/jackett");
|
|
||||||
RunLinuxCommand("chmod", $"755 {MakeAbsolute(Directory(sourceFolder))}/Jackett/JackettUpdater");
|
|
||||||
|
|
||||||
string macOsServiceScript = MakeAbsolute(Directory(sourceFolder)) + "/Jackett/install_service_macos";
|
|
||||||
if (FileExists(macOsServiceScript))
|
|
||||||
{
|
|
||||||
RunLinuxCommand("chmod", $"755 {macOsServiceScript}");
|
|
||||||
}
|
|
||||||
|
|
||||||
string systemdMonoScript = MakeAbsolute(Directory(sourceFolder)) + "/Jackett/install_service_systemd_mono.sh";
|
|
||||||
if (FileExists(systemdMonoScript))
|
|
||||||
{
|
|
||||||
RunLinuxCommand("chmod", $"755 {systemdMonoScript}");
|
|
||||||
}
|
|
||||||
|
|
||||||
string systemdScript = MakeAbsolute(Directory(sourceFolder)) + "/Jackett/install_service_systemd.sh";
|
|
||||||
if (FileExists(systemdScript))
|
|
||||||
{
|
|
||||||
RunLinuxCommand("chmod", $"755 {systemdScript}");
|
|
||||||
}
|
|
||||||
|
|
||||||
string launcherScript = MakeAbsolute(Directory(sourceFolder)) + "/Jackett/jackett_launcher.sh";
|
|
||||||
if (FileExists(launcherScript))
|
|
||||||
{
|
|
||||||
RunLinuxCommand("chmod", $"755 {launcherScript}");
|
|
||||||
}
|
|
||||||
|
|
||||||
RunLinuxCommand("tar", $"-C {sourceFolder} -zcvf {outputDirectory}/{tarFileName}.gz {tarCdirectoryOption}");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void CheckForGzipAndTar()
|
|
||||||
{
|
|
||||||
if (FileExists(@"C:\msys64\usr\bin\tar.exe") && FileExists(@"C:\msys64\usr\bin\gzip.exe"))
|
|
||||||
{
|
|
||||||
Information("tar.exe and gzip.exe were found");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
throw new Exception("tar.exe and gzip.exe were NOT found");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void DotNetCorePublish(string projectPath, string framework, string runtime, string outputPath)
|
|
||||||
{
|
|
||||||
bool publishSingleFile = false;
|
|
||||||
|
|
||||||
if (publishSingleFile && framework != "net461")
|
|
||||||
{
|
|
||||||
var settings = new DotNetCorePublishSettings
|
|
||||||
{
|
|
||||||
Framework = framework,
|
|
||||||
Runtime = runtime,
|
|
||||||
OutputDirectory = outputPath,
|
|
||||||
ArgumentCustomization = args=>args.Append("/p:PublishSingleFile=true")
|
|
||||||
};
|
|
||||||
|
|
||||||
DotNetCorePublish(projectPath, settings);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
var settings = new DotNetCorePublishSettings
|
|
||||||
{
|
|
||||||
Framework = framework,
|
|
||||||
Runtime = runtime,
|
|
||||||
OutputDirectory = outputPath
|
|
||||||
};
|
|
||||||
|
|
||||||
DotNetCorePublish(projectPath, settings);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////
|
|
||||||
// TASK TARGETS
|
|
||||||
//////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
Task("Default")
|
|
||||||
.IsDependentOn("Windows-Environment-Dev")
|
|
||||||
.Does(() =>
|
|
||||||
{
|
|
||||||
Information("Default Task Completed");
|
|
||||||
});
|
|
||||||
|
|
||||||
Task("Windows-Appveyor")
|
|
||||||
.IsDependentOn("Windows-Environment-Appveyor")
|
|
||||||
.Does(() =>
|
|
||||||
{
|
|
||||||
Information("Windows Appveyor Task Completed");
|
|
||||||
});
|
|
||||||
|
|
||||||
Task("Linux")
|
|
||||||
.IsDependentOn("Linux-Environment")
|
|
||||||
.Does(() =>
|
|
||||||
{
|
|
||||||
Information("Linux Task Completed");
|
|
||||||
});
|
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////
|
|
||||||
// EXECUTION
|
|
||||||
//////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
RunTarget(target);
|
|
||||||
242
build.ps1
242
build.ps1
@@ -1,242 +0,0 @@
|
|||||||
##########################################################################
|
|
||||||
# This is the Cake bootstrapper script for PowerShell.
|
|
||||||
# This file was downloaded from https://github.com/cake-build/resources
|
|
||||||
# Feel free to change this file to fit your needs.
|
|
||||||
##########################################################################
|
|
||||||
|
|
||||||
<#
|
|
||||||
|
|
||||||
.SYNOPSIS
|
|
||||||
This is a Powershell script to bootstrap a Cake build.
|
|
||||||
|
|
||||||
.DESCRIPTION
|
|
||||||
This Powershell script will download NuGet if missing, restore NuGet tools (including Cake)
|
|
||||||
and execute your Cake build script with the parameters you provide.
|
|
||||||
|
|
||||||
.PARAMETER Script
|
|
||||||
The build script to execute.
|
|
||||||
.PARAMETER Target
|
|
||||||
The build script target to run.
|
|
||||||
.PARAMETER Configuration
|
|
||||||
The build configuration to use.
|
|
||||||
.PARAMETER Verbosity
|
|
||||||
Specifies the amount of information to be displayed.
|
|
||||||
.PARAMETER ShowDescription
|
|
||||||
Shows description about tasks.
|
|
||||||
.PARAMETER DryRun
|
|
||||||
Performs a dry run.
|
|
||||||
.PARAMETER SkipToolPackageRestore
|
|
||||||
Skips restoring of packages.
|
|
||||||
.PARAMETER ScriptArgs
|
|
||||||
Remaining arguments are added here.
|
|
||||||
|
|
||||||
.LINK
|
|
||||||
https://cakebuild.net
|
|
||||||
|
|
||||||
#>
|
|
||||||
|
|
||||||
[CmdletBinding()]
|
|
||||||
Param(
|
|
||||||
[string]$Script = "build.cake",
|
|
||||||
[string]$Target,
|
|
||||||
[string]$Configuration,
|
|
||||||
[ValidateSet("Quiet", "Minimal", "Normal", "Verbose", "Diagnostic")]
|
|
||||||
[string]$Verbosity,
|
|
||||||
[switch]$ShowDescription,
|
|
||||||
[Alias("WhatIf", "Noop")]
|
|
||||||
[switch]$DryRun,
|
|
||||||
[switch]$SkipToolPackageRestore,
|
|
||||||
[Parameter(Position=0,Mandatory=$false,ValueFromRemainingArguments=$true)]
|
|
||||||
[string[]]$ScriptArgs
|
|
||||||
)
|
|
||||||
|
|
||||||
# Attempt to set highest encryption available for SecurityProtocol.
|
|
||||||
# PowerShell will not set this by default (until maybe .NET 4.6.x). This
|
|
||||||
# will typically produce a message for PowerShell v2 (just an info
|
|
||||||
# message though)
|
|
||||||
try {
|
|
||||||
# Set TLS 1.2 (3072), then TLS 1.1 (768), then TLS 1.0 (192), finally SSL 3.0 (48)
|
|
||||||
# Use integers because the enumeration values for TLS 1.2 and TLS 1.1 won't
|
|
||||||
# exist in .NET 4.0, even though they are addressable if .NET 4.5+ is
|
|
||||||
# installed (.NET 4.5 is an in-place upgrade).
|
|
||||||
[System.Net.ServicePointManager]::SecurityProtocol = 3072 -bor 768 -bor 192 -bor 48
|
|
||||||
} catch {
|
|
||||||
Write-Output 'Unable to set PowerShell to use TLS 1.2 and TLS 1.1 due to old .NET Framework installed. If you see underlying connection closed or trust errors, you may need to upgrade to .NET Framework 4.5+ and PowerShell v3'
|
|
||||||
}
|
|
||||||
|
|
||||||
[Reflection.Assembly]::LoadWithPartialName("System.Security") | Out-Null
|
|
||||||
function MD5HashFile([string] $filePath)
|
|
||||||
{
|
|
||||||
if ([string]::IsNullOrEmpty($filePath) -or !(Test-Path $filePath -PathType Leaf))
|
|
||||||
{
|
|
||||||
return $null
|
|
||||||
}
|
|
||||||
|
|
||||||
[System.IO.Stream] $file = $null;
|
|
||||||
[System.Security.Cryptography.MD5] $md5 = $null;
|
|
||||||
try
|
|
||||||
{
|
|
||||||
$md5 = [System.Security.Cryptography.MD5]::Create()
|
|
||||||
$file = [System.IO.File]::OpenRead($filePath)
|
|
||||||
return [System.BitConverter]::ToString($md5.ComputeHash($file))
|
|
||||||
}
|
|
||||||
finally
|
|
||||||
{
|
|
||||||
if ($file -ne $null)
|
|
||||||
{
|
|
||||||
$file.Dispose()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function GetProxyEnabledWebClient
|
|
||||||
{
|
|
||||||
$wc = New-Object System.Net.WebClient
|
|
||||||
$proxy = [System.Net.WebRequest]::GetSystemWebProxy()
|
|
||||||
$proxy.Credentials = [System.Net.CredentialCache]::DefaultCredentials
|
|
||||||
$wc.Proxy = $proxy
|
|
||||||
return $wc
|
|
||||||
}
|
|
||||||
|
|
||||||
Write-Host "Preparing to run build script..."
|
|
||||||
|
|
||||||
if(!$PSScriptRoot){
|
|
||||||
$PSScriptRoot = Split-Path $MyInvocation.MyCommand.Path -Parent
|
|
||||||
}
|
|
||||||
|
|
||||||
$TOOLS_DIR = Join-Path $PSScriptRoot "tools"
|
|
||||||
$ADDINS_DIR = Join-Path $TOOLS_DIR "Addins"
|
|
||||||
$MODULES_DIR = Join-Path $TOOLS_DIR "Modules"
|
|
||||||
$NUGET_EXE = Join-Path $TOOLS_DIR "nuget.exe"
|
|
||||||
$CAKE_EXE = Join-Path $TOOLS_DIR "Cake/Cake.exe"
|
|
||||||
$NUGET_URL = "https://dist.nuget.org/win-x86-commandline/latest/nuget.exe"
|
|
||||||
$PACKAGES_CONFIG = Join-Path $TOOLS_DIR "packages.config"
|
|
||||||
$PACKAGES_CONFIG_MD5 = Join-Path $TOOLS_DIR "packages.config.md5sum"
|
|
||||||
$ADDINS_PACKAGES_CONFIG = Join-Path $ADDINS_DIR "packages.config"
|
|
||||||
$MODULES_PACKAGES_CONFIG = Join-Path $MODULES_DIR "packages.config"
|
|
||||||
|
|
||||||
# Make sure tools folder exists
|
|
||||||
if ((Test-Path $PSScriptRoot) -and !(Test-Path $TOOLS_DIR)) {
|
|
||||||
Write-Verbose -Message "Creating tools directory..."
|
|
||||||
New-Item -Path $TOOLS_DIR -Type directory | out-null
|
|
||||||
}
|
|
||||||
|
|
||||||
# Make sure that packages.config exist.
|
|
||||||
if (!(Test-Path $PACKAGES_CONFIG)) {
|
|
||||||
Write-Verbose -Message "Downloading packages.config..."
|
|
||||||
try {
|
|
||||||
$wc = GetProxyEnabledWebClient
|
|
||||||
$wc.DownloadFile("https://cakebuild.net/download/bootstrapper/packages", $PACKAGES_CONFIG)
|
|
||||||
} catch {
|
|
||||||
Throw "Could not download packages.config."
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
# Try find NuGet.exe in path if not exists
|
|
||||||
if (!(Test-Path $NUGET_EXE)) {
|
|
||||||
Write-Verbose -Message "Trying to find nuget.exe in PATH..."
|
|
||||||
$existingPaths = $Env:Path -Split ';' | Where-Object { (![string]::IsNullOrEmpty($_)) -and (Test-Path $_ -PathType Container) }
|
|
||||||
$NUGET_EXE_IN_PATH = Get-ChildItem -Path $existingPaths -Filter "nuget.exe" | Select -First 1
|
|
||||||
if ($NUGET_EXE_IN_PATH -ne $null -and (Test-Path $NUGET_EXE_IN_PATH.FullName)) {
|
|
||||||
Write-Verbose -Message "Found in PATH at $($NUGET_EXE_IN_PATH.FullName)."
|
|
||||||
$NUGET_EXE = $NUGET_EXE_IN_PATH.FullName
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
# Try download NuGet.exe if not exists
|
|
||||||
if (!(Test-Path $NUGET_EXE)) {
|
|
||||||
Write-Verbose -Message "Downloading NuGet.exe..."
|
|
||||||
try {
|
|
||||||
$wc = GetProxyEnabledWebClient
|
|
||||||
$wc.DownloadFile($NUGET_URL, $NUGET_EXE)
|
|
||||||
} catch {
|
|
||||||
Throw "Could not download NuGet.exe."
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
# Save nuget.exe path to environment to be available to child processed
|
|
||||||
$ENV:NUGET_EXE = $NUGET_EXE
|
|
||||||
|
|
||||||
# Restore tools from NuGet?
|
|
||||||
if(-Not $SkipToolPackageRestore.IsPresent) {
|
|
||||||
Push-Location
|
|
||||||
Set-Location $TOOLS_DIR
|
|
||||||
|
|
||||||
# Check for changes in packages.config and remove installed tools if true.
|
|
||||||
[string] $md5Hash = MD5HashFile($PACKAGES_CONFIG)
|
|
||||||
if((!(Test-Path $PACKAGES_CONFIG_MD5)) -Or
|
|
||||||
($md5Hash -ne (Get-Content $PACKAGES_CONFIG_MD5 ))) {
|
|
||||||
Write-Verbose -Message "Missing or changed package.config hash..."
|
|
||||||
Get-ChildItem -Exclude packages.config,nuget.exe,Cake.Bakery |
|
|
||||||
Remove-Item -Recurse
|
|
||||||
}
|
|
||||||
|
|
||||||
Write-Verbose -Message "Restoring tools from NuGet..."
|
|
||||||
$NuGetOutput = Invoke-Expression "&`"$NUGET_EXE`" install -ExcludeVersion -OutputDirectory `"$TOOLS_DIR`""
|
|
||||||
|
|
||||||
if ($LASTEXITCODE -ne 0) {
|
|
||||||
Throw "An error occurred while restoring NuGet tools."
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
$md5Hash | Out-File $PACKAGES_CONFIG_MD5 -Encoding "ASCII"
|
|
||||||
}
|
|
||||||
Write-Verbose -Message ($NuGetOutput | out-string)
|
|
||||||
|
|
||||||
Pop-Location
|
|
||||||
}
|
|
||||||
|
|
||||||
# Restore addins from NuGet
|
|
||||||
if (Test-Path $ADDINS_PACKAGES_CONFIG) {
|
|
||||||
Push-Location
|
|
||||||
Set-Location $ADDINS_DIR
|
|
||||||
|
|
||||||
Write-Verbose -Message "Restoring addins from NuGet..."
|
|
||||||
$NuGetOutput = Invoke-Expression "&`"$NUGET_EXE`" install -ExcludeVersion -OutputDirectory `"$ADDINS_DIR`""
|
|
||||||
|
|
||||||
if ($LASTEXITCODE -ne 0) {
|
|
||||||
Throw "An error occurred while restoring NuGet addins."
|
|
||||||
}
|
|
||||||
|
|
||||||
Write-Verbose -Message ($NuGetOutput | out-string)
|
|
||||||
|
|
||||||
Pop-Location
|
|
||||||
}
|
|
||||||
|
|
||||||
# Restore modules from NuGet
|
|
||||||
if (Test-Path $MODULES_PACKAGES_CONFIG) {
|
|
||||||
Push-Location
|
|
||||||
Set-Location $MODULES_DIR
|
|
||||||
|
|
||||||
Write-Verbose -Message "Restoring modules from NuGet..."
|
|
||||||
$NuGetOutput = Invoke-Expression "&`"$NUGET_EXE`" install -ExcludeVersion -OutputDirectory `"$MODULES_DIR`""
|
|
||||||
|
|
||||||
if ($LASTEXITCODE -ne 0) {
|
|
||||||
Throw "An error occurred while restoring NuGet modules."
|
|
||||||
}
|
|
||||||
|
|
||||||
Write-Verbose -Message ($NuGetOutput | out-string)
|
|
||||||
|
|
||||||
Pop-Location
|
|
||||||
}
|
|
||||||
|
|
||||||
# Make sure that Cake has been installed.
|
|
||||||
if (!(Test-Path $CAKE_EXE)) {
|
|
||||||
Throw "Could not find Cake.exe at $CAKE_EXE"
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Build Cake arguments
|
|
||||||
$cakeArguments = @("$Script");
|
|
||||||
if ($Target) { $cakeArguments += "-target=$Target" }
|
|
||||||
if ($Configuration) { $cakeArguments += "-configuration=$Configuration" }
|
|
||||||
if ($Verbosity) { $cakeArguments += "-verbosity=$Verbosity" }
|
|
||||||
if ($ShowDescription) { $cakeArguments += "-showdescription" }
|
|
||||||
if ($DryRun) { $cakeArguments += "-dryrun" }
|
|
||||||
$cakeArguments += $ScriptArgs
|
|
||||||
|
|
||||||
# Start Cake
|
|
||||||
Write-Host "Running build script..."
|
|
||||||
&$CAKE_EXE $cakeArguments
|
|
||||||
exit $LASTEXITCODE
|
|
||||||
117
build.sh
117
build.sh
@@ -1,117 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
|
|
||||||
##########################################################################
|
|
||||||
# This is the Cake bootstrapper script for Linux and OS X.
|
|
||||||
# This file was downloaded from https://github.com/cake-build/resources
|
|
||||||
# Feel free to change this file to fit your needs.
|
|
||||||
##########################################################################
|
|
||||||
|
|
||||||
# Define directories.
|
|
||||||
SCRIPT_DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )
|
|
||||||
TOOLS_DIR=$SCRIPT_DIR/tools
|
|
||||||
ADDINS_DIR=$TOOLS_DIR/Addins
|
|
||||||
MODULES_DIR=$TOOLS_DIR/Modules
|
|
||||||
NUGET_EXE=$TOOLS_DIR/nuget.exe
|
|
||||||
CAKE_EXE=$TOOLS_DIR/Cake/Cake.exe
|
|
||||||
PACKAGES_CONFIG=$TOOLS_DIR/packages.config
|
|
||||||
PACKAGES_CONFIG_MD5=$TOOLS_DIR/packages.config.md5sum
|
|
||||||
ADDINS_PACKAGES_CONFIG=$ADDINS_DIR/packages.config
|
|
||||||
MODULES_PACKAGES_CONFIG=$MODULES_DIR/packages.config
|
|
||||||
|
|
||||||
# Define md5sum or md5 depending on Linux/OSX
|
|
||||||
MD5_EXE=
|
|
||||||
if [[ "$(uname -s)" == "Darwin" ]]; then
|
|
||||||
MD5_EXE="md5 -r"
|
|
||||||
else
|
|
||||||
MD5_EXE="md5sum"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Define default arguments.
|
|
||||||
SCRIPT="build.cake"
|
|
||||||
CAKE_ARGUMENTS=()
|
|
||||||
|
|
||||||
# Parse arguments.
|
|
||||||
for i in "$@"; do
|
|
||||||
case $1 in
|
|
||||||
-s|--script) SCRIPT="$2"; shift ;;
|
|
||||||
--) shift; CAKE_ARGUMENTS+=("$@"); break ;;
|
|
||||||
*) CAKE_ARGUMENTS+=("$1") ;;
|
|
||||||
esac
|
|
||||||
shift
|
|
||||||
done
|
|
||||||
|
|
||||||
# Make sure the tools folder exist.
|
|
||||||
if [ ! -d "$TOOLS_DIR" ]; then
|
|
||||||
mkdir "$TOOLS_DIR"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Make sure that packages.config exist.
|
|
||||||
if [ ! -f "$TOOLS_DIR/packages.config" ]; then
|
|
||||||
echo "Downloading packages.config..."
|
|
||||||
curl -Lsfo "$TOOLS_DIR/packages.config" https://cakebuild.net/download/bootstrapper/packages
|
|
||||||
if [ $? -ne 0 ]; then
|
|
||||||
echo "An error occurred while downloading packages.config."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Download NuGet if it does not exist.
|
|
||||||
if [ ! -f "$NUGET_EXE" ]; then
|
|
||||||
echo "Downloading NuGet..."
|
|
||||||
curl -Lsfo "$NUGET_EXE" https://dist.nuget.org/win-x86-commandline/latest/nuget.exe
|
|
||||||
if [ $? -ne 0 ]; then
|
|
||||||
echo "An error occurred while downloading nuget.exe."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Restore tools from NuGet.
|
|
||||||
pushd "$TOOLS_DIR" >/dev/null
|
|
||||||
if [ ! -f "$PACKAGES_CONFIG_MD5" ] || [ "$( cat "$PACKAGES_CONFIG_MD5" | sed 's/\r$//' )" != "$( $MD5_EXE "$PACKAGES_CONFIG" | awk '{ print $1 }' )" ]; then
|
|
||||||
find . -type d ! -name . ! -name 'Cake.Bakery' | xargs rm -rf
|
|
||||||
fi
|
|
||||||
|
|
||||||
mono "$NUGET_EXE" install -ExcludeVersion
|
|
||||||
if [ $? -ne 0 ]; then
|
|
||||||
echo "Could not restore NuGet tools."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
$MD5_EXE "$PACKAGES_CONFIG" | awk '{ print $1 }' >| "$PACKAGES_CONFIG_MD5"
|
|
||||||
|
|
||||||
popd >/dev/null
|
|
||||||
|
|
||||||
# Restore addins from NuGet.
|
|
||||||
if [ -f "$ADDINS_PACKAGES_CONFIG" ]; then
|
|
||||||
pushd "$ADDINS_DIR" >/dev/null
|
|
||||||
|
|
||||||
mono "$NUGET_EXE" install -ExcludeVersion
|
|
||||||
if [ $? -ne 0 ]; then
|
|
||||||
echo "Could not restore NuGet addins."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
popd >/dev/null
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Restore modules from NuGet.
|
|
||||||
if [ -f "$MODULES_PACKAGES_CONFIG" ]; then
|
|
||||||
pushd "$MODULES_DIR" >/dev/null
|
|
||||||
|
|
||||||
mono "$NUGET_EXE" install -ExcludeVersion
|
|
||||||
if [ $? -ne 0 ]; then
|
|
||||||
echo "Could not restore NuGet modules."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
popd >/dev/null
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Make sure that Cake has been installed.
|
|
||||||
if [ ! -f "$CAKE_EXE" ]; then
|
|
||||||
echo "Could not find Cake.exe at '$CAKE_EXE'."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Start Cake
|
|
||||||
exec mono "$CAKE_EXE" $SCRIPT "${CAKE_ARGUMENTS[@]}"
|
|
||||||
@@ -1,39 +1,66 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
#Setting up colors
|
# If you have problems installing Jackett, please open an issue on
|
||||||
|
# https://github.com/Jackett/Jackett/issues
|
||||||
|
|
||||||
|
# Setting up colors
|
||||||
BOLDRED="$(printf '\033[1;31m')"
|
BOLDRED="$(printf '\033[1;31m')"
|
||||||
BOLDGREEN="$(printf '\033[1;32m')"
|
BOLDGREEN="$(printf '\033[1;32m')"
|
||||||
NC="$(printf '\033[0m')" # No Color
|
NC="$(printf '\033[0m')" # No Color
|
||||||
|
|
||||||
# Stop and unload the service if it's running
|
# Check if the install script is running as root
|
||||||
jackettservice="jackett.service"
|
if [ "$EUID" -ne 0 ]; then
|
||||||
systemctl stop ${jackettservice}
|
echo "${BOLDRED}ERROR${NC}: Please run this script as root"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Check if Jackett service is running
|
||||||
|
JACKETT_SERVICE="jackett.service"
|
||||||
|
echo "Checking if the service '${JACKETT_SERVICE}' is running ..."
|
||||||
|
if systemctl is-active --quiet "${JACKETT_SERVICE}"; then
|
||||||
|
echo "Service '${JACKETT_SERVICE}' is running"
|
||||||
|
|
||||||
|
# Stop and unload the service
|
||||||
|
if systemctl stop "${JACKETT_SERVICE}"; then
|
||||||
|
echo "Service '${JACKETT_SERVICE}' stopped"
|
||||||
|
else
|
||||||
|
echo "${BOLDRED}ERROR${NC}: The service '${JACKETT_SERVICE}' Can not be stopped"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
else
|
||||||
|
echo "Service '${JACKETT_SERVICE}' is not running"
|
||||||
|
fi
|
||||||
|
|
||||||
# Move working directory to Jackett's
|
# Move working directory to Jackett's
|
||||||
cd "$(dirname "$0")"
|
JACKETT_DIR="$(dirname "$(readlink -f "$0")")"
|
||||||
|
echo "Jackett will be installed in '${JACKETT_DIR}'"
|
||||||
|
if ! cd "${JACKETT_DIR}"; then
|
||||||
|
echo "${BOLDRED}ERROR${NC}: Can not cd into '${JACKETT_DIR}' folder"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
# Check if we're running from Jackett's directory
|
# Check if we're running from Jackett's directory
|
||||||
if [ ! -f ./jackett ]; then
|
if [ ! -f ./jackett ]; then
|
||||||
echo "${BOLDRED}ERROR${NC}: Couldn't locate jackett. Is the script in the right directory?"
|
echo "${BOLDRED}ERROR${NC}: Can not locate 'jackett' file in '${JACKETT_DIR}'."
|
||||||
|
echo "Is the script in the right directory?"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
jackettdir="$(pwd)"
|
|
||||||
|
|
||||||
# Check if Jackett's owner is root
|
# Check if Jackett's owner is root
|
||||||
jackettuser="$(stat -c "%U" ./jackett)"
|
JACKETT_USER="$(stat -c "%U" ./jackett)"
|
||||||
if [ "${jackettuser}" == "root" ]; then
|
if [ "${JACKETT_USER}" == "root" ] || [ "${JACKETT_USER}" == "UNKNOWN" ] ; then
|
||||||
echo "${BOLDRED}ERROR${NC}: Jackett shouldn't run as root. Please, change the owner of the Jackett directory."
|
echo "${BOLDRED}ERROR${NC}: The owner of Jackett directory is '${JACKETT_USER}'."
|
||||||
exit 1
|
echo "Please, change the owner with the command 'chown <user>:<user> -R \"${JACKETT_DIR}\"'"
|
||||||
fi
|
echo "The user <user> will be used to run Jackett."
|
||||||
|
|
||||||
# Check that no other service called Jackett is already running
|
|
||||||
if [[ $(systemctl status ${jackettservice} | grep "active (running)") ]]; then
|
|
||||||
echo "${BOLDRED}ERROR${NC}: Jackett already seems to be running as a service. Please stop it before running this script again."
|
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
echo "Jackett will be executed with the user '${JACKETT_USER}'"
|
||||||
|
|
||||||
# Write the systemd service descriptor
|
# Write the systemd service descriptor
|
||||||
cat >"/etc/systemd/system/${jackettservice}" <<EOL
|
JACKETT_SERVICE_PATH="/etc/systemd/system/${JACKETT_SERVICE}"
|
||||||
|
echo "Creating Jackett unit file in '${JACKETT_SERVICE_PATH}' ..."
|
||||||
|
cat > "${JACKETT_SERVICE_PATH}" <<EOL
|
||||||
[Unit]
|
[Unit]
|
||||||
Description=Jackett Daemon
|
Description=Jackett Daemon
|
||||||
After=network.target
|
After=network.target
|
||||||
@@ -43,35 +70,39 @@ SyslogIdentifier=jackett
|
|||||||
Restart=always
|
Restart=always
|
||||||
RestartSec=5
|
RestartSec=5
|
||||||
Type=simple
|
Type=simple
|
||||||
User=${jackettuser}
|
User=${JACKETT_USER}
|
||||||
Group=${jackettuser}
|
Group=${JACKETT_USER}
|
||||||
WorkingDirectory=${jackettdir}
|
WorkingDirectory=${JACKETT_DIR}
|
||||||
ExecStart=${jackettdir}/jackett_launcher.sh
|
ExecStart=/bin/sh "${JACKETT_DIR}/jackett_launcher.sh"
|
||||||
TimeoutStopSec=20
|
TimeoutStopSec=30
|
||||||
|
|
||||||
[Install]
|
[Install]
|
||||||
WantedBy=multi-user.target
|
WantedBy=multi-user.target
|
||||||
|
|
||||||
EOL
|
EOL
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
echo "${BOLDRED}ERROR${NC}: Can not create the file '${JACKETT_SERVICE_PATH}'"
|
||||||
|
echo "The UnitPath of systemd changes from one distribution to another. You may have to edit the script and change the path manually."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "Installing Jackett service ..."
|
||||||
# Reload systemd daemon
|
# Reload systemd daemon
|
||||||
systemctl daemon-reload
|
if ! systemctl daemon-reload; then
|
||||||
|
echo "${BOLDRED}ERROR${NC}: Can not reload systemd daemon"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
# Enable the service for following restarts
|
# Enable the service for following restarts
|
||||||
systemctl enable ${jackettservice}
|
if ! systemctl enable "${JACKETT_SERVICE}"; then
|
||||||
|
echo "${BOLDRED}ERROR${NC}: Can not enable the service '${JACKETT_SERVICE}'"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
# Run the service
|
# Run the service
|
||||||
systemctl start ${jackettservice}
|
if systemctl start "${JACKETT_SERVICE}"; then
|
||||||
|
echo "${BOLDGREEN}Service successfully installed and launched!${NC}"
|
||||||
# Check that it's running
|
|
||||||
if [[ $(systemctl status ${jackettservice} | grep "active (running)") ]]; then
|
|
||||||
echo "${BOLDGREEN}Agent successfully installed and launched!${NC}"
|
|
||||||
else
|
else
|
||||||
cat << EOL
|
echo "${BOLDRED}ERROR${NC}: Can not start the service '${JACKETT_SERVICE}'"
|
||||||
${BOLDRED}ERROR${NC}: Could not launch service. The installation might have failed.
|
exit 1
|
||||||
Please open an issue on https://github.com/Jackett/Jackett/issues and paste following information:
|
|
||||||
Jackett directory: \`${jackettdir}\`
|
|
||||||
Jackett user: \`${jackettuser}\`
|
|
||||||
|
|
||||||
EOL
|
|
||||||
fi
|
fi
|
||||||
|
|||||||
@@ -1,43 +1,75 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
#Setting up colors
|
# If you have problems installing Jackett, please open an issue on
|
||||||
|
# https://github.com/Jackett/Jackett/issues
|
||||||
|
|
||||||
|
# Setting up colors
|
||||||
BOLDRED="$(printf '\033[1;31m')"
|
BOLDRED="$(printf '\033[1;31m')"
|
||||||
BOLDGREEN="$(printf '\033[1;32m')"
|
BOLDGREEN="$(printf '\033[1;32m')"
|
||||||
NC="$(printf '\033[0m')" # No Color
|
NC="$(printf '\033[0m')" # No Color
|
||||||
|
|
||||||
# Stop and unload the service if it's running
|
# Check if the install script is running as root
|
||||||
jackettservice="jackett.service"
|
if [ "$EUID" -ne 0 ]; then
|
||||||
systemctl stop ${jackettservice}
|
echo "${BOLDRED}ERROR${NC}: Please run this script as root"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Check if Jackett service is running
|
||||||
|
JACKETT_SERVICE="jackett.service"
|
||||||
|
echo "Checking if the service '${JACKETT_SERVICE}' is running ..."
|
||||||
|
if systemctl is-active --quiet "${JACKETT_SERVICE}"; then
|
||||||
|
echo "Service '${JACKETT_SERVICE}' is running"
|
||||||
|
|
||||||
|
# Stop and unload the service
|
||||||
|
if systemctl stop "${JACKETT_SERVICE}"; then
|
||||||
|
echo "Service '${JACKETT_SERVICE}' stopped"
|
||||||
|
else
|
||||||
|
echo "${BOLDRED}ERROR${NC}: The service '${JACKETT_SERVICE}' Can not be stopped"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
else
|
||||||
|
echo "Service '${JACKETT_SERVICE}' is not running"
|
||||||
|
fi
|
||||||
|
|
||||||
# Move working directory to Jackett's
|
# Move working directory to Jackett's
|
||||||
cd "$(dirname "$0")"
|
JACKETT_DIR="$(dirname "$(readlink -f "$0")")"
|
||||||
|
echo "Jackett will be installed in '${JACKETT_DIR}'"
|
||||||
|
if ! cd "${JACKETT_DIR}"; then
|
||||||
|
echo "${BOLDRED}ERROR${NC}: Can not cd into '${JACKETT_DIR}' folder"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
# Check if we're running from Jackett's directory
|
# Check if we're running from Jackett's directory
|
||||||
if [ ! -f ./JackettConsole.exe ]; then
|
if [ ! -f ./JackettConsole.exe ]; then
|
||||||
echo "${BOLDRED}ERROR${NC}: Couldn't locate JackettConsole.exe. Is the script in the right directory?"
|
echo "${BOLDRED}ERROR${NC}: Can not locate 'JackettConsole.exe' file in '${JACKETT_DIR}'."
|
||||||
|
echo "Is the script in the right directory?"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
jackettdir="$(pwd)"
|
|
||||||
|
|
||||||
# Check if Jackett's owner is root
|
# Check if Jackett's owner is root
|
||||||
jackettuser="$(stat -c "%U" ./JackettConsole.exe)"
|
JACKETT_USER="$(stat -c "%U" ./JackettConsole.exe)"
|
||||||
if [ "${jackettuser}" == "root" ]; then
|
if [ "${JACKETT_USER}" == "root" ] || [ "${JACKETT_USER}" == "UNKNOWN" ] ; then
|
||||||
echo "${BOLDRED}ERROR${NC}: Jackett shouldn't run as root. Please, change the owner of the Jackett directory."
|
echo "${BOLDRED}ERROR${NC}: The owner of Jackett directory is '${JACKETT_USER}'."
|
||||||
|
echo "Please, change the owner with the command 'chown <user>:<user> -R \"${JACKETT_DIR}\"'"
|
||||||
|
echo "The user <user> will be used to run Jackett."
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
echo "Jackett will be executed with the user '${JACKETT_USER}'"
|
||||||
|
|
||||||
# Check if mono is installed
|
# Check if Mono is installed
|
||||||
command -v mono >/dev/null 2>&1 || { echo >&2 "${BOLDRED}ERROR${NC}: Jackett requires Mono but it's not installed. Aborting."; exit 1; }
|
echo "Checking if Mono is installed ..."
|
||||||
monodir="$(dirname $(command -v mono))"
|
if ! command -v mono > /dev/null; then
|
||||||
|
echo "${BOLDRED}ERROR${NC}: Jackett requires Mono but it's not installed"
|
||||||
# Check that no other service called Jackett is already running
|
|
||||||
if [[ $(systemctl status ${jackettservice} | grep "active (running)") ]]; then
|
|
||||||
echo "${BOLDRED}ERROR${NC}: Jackett already seems to be running as a service. Please stop it before running this script again."
|
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
MONO_DIR="$(dirname "$(command -v mono)")"
|
||||||
|
echo "Mono is installed in '${MONO_DIR}'"
|
||||||
|
|
||||||
# Write the systemd service descriptor
|
# Write the systemd service descriptor
|
||||||
cat >"/etc/systemd/system/${jackettservice}" <<EOL
|
JACKETT_SERVICE_PATH="/etc/systemd/system/${JACKETT_SERVICE}"
|
||||||
|
echo "Creating Jackett unit file in '${JACKETT_SERVICE_PATH}' ..."
|
||||||
|
cat > "${JACKETT_SERVICE_PATH}" <<EOL
|
||||||
[Unit]
|
[Unit]
|
||||||
Description=Jackett Daemon
|
Description=Jackett Daemon
|
||||||
After=network.target
|
After=network.target
|
||||||
@@ -47,36 +79,39 @@ SyslogIdentifier=jackett
|
|||||||
Restart=always
|
Restart=always
|
||||||
RestartSec=5
|
RestartSec=5
|
||||||
Type=simple
|
Type=simple
|
||||||
User=${jackettuser}
|
User=${JACKETT_USER}
|
||||||
Group=${jackettuser}
|
Group=${JACKETT_USER}
|
||||||
WorkingDirectory=${jackettdir}
|
WorkingDirectory=${JACKETT_DIR}
|
||||||
ExecStart=${monodir}/mono --debug ${jackettdir}/JackettConsole.exe --NoRestart
|
ExecStart="${MONO_DIR}/mono" --debug "${JACKETT_DIR}/JackettConsole.exe" --NoRestart
|
||||||
TimeoutStopSec=20
|
TimeoutStopSec=30
|
||||||
|
|
||||||
[Install]
|
[Install]
|
||||||
WantedBy=multi-user.target
|
WantedBy=multi-user.target
|
||||||
|
|
||||||
EOL
|
EOL
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
echo "${BOLDRED}ERROR${NC}: Can not create the file '${JACKETT_SERVICE_PATH}'"
|
||||||
|
echo "The UnitPath of systemd changes from one distribution to another. You may have to edit the script and change the path manually."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "Installing Jackett service ..."
|
||||||
# Reload systemd daemon
|
# Reload systemd daemon
|
||||||
systemctl daemon-reload
|
if ! systemctl daemon-reload; then
|
||||||
|
echo "${BOLDRED}ERROR${NC}: Can not reload systemd daemon"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
# Enable the service for following restarts
|
# Enable the service for following restarts
|
||||||
systemctl enable ${jackettservice}
|
if ! systemctl enable "${JACKETT_SERVICE}"; then
|
||||||
|
echo "${BOLDRED}ERROR${NC}: Can not enable the service '${JACKETT_SERVICE}'"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
# Run the service
|
# Run the service
|
||||||
systemctl start ${jackettservice}
|
if systemctl start "${JACKETT_SERVICE}"; then
|
||||||
|
echo "${BOLDGREEN}Service successfully installed and launched!${NC}"
|
||||||
# Check that it's running
|
|
||||||
if [[ $(systemctl status ${jackettservice} | grep "active (running)") ]]; then
|
|
||||||
echo "${BOLDGREEN}Agent successfully installed and launched!${NC}"
|
|
||||||
else
|
else
|
||||||
cat << EOL
|
echo "${BOLDRED}ERROR${NC}: Can not start the service '${JACKETT_SERVICE}'"
|
||||||
${BOLDRED}ERROR${NC}: Could not launch service. The installation might have failed.
|
exit 1
|
||||||
Please open an issue on https://github.com/Jackett/Jackett/issues and paste following information:
|
|
||||||
Mono directory: \`${monodir}\`
|
|
||||||
Jackett directory: \`${jackettdir}\`
|
|
||||||
Jackett user: \`${jackettuser}\`
|
|
||||||
|
|
||||||
EOL
|
|
||||||
fi
|
fi
|
||||||
|
|||||||
@@ -7,12 +7,12 @@
|
|||||||
JACKETT_DIR="$(dirname "$(readlink -f "$0")")"
|
JACKETT_DIR="$(dirname "$(readlink -f "$0")")"
|
||||||
|
|
||||||
# Launch Jackett
|
# Launch Jackett
|
||||||
${JACKETT_DIR}/jackett --NoRestart
|
"${JACKETT_DIR}/jackett" --NoRestart
|
||||||
|
|
||||||
# Get user running the service
|
# Get user running the service
|
||||||
JACKETT_USER=$(whoami)
|
JACKETT_USER=$(whoami)
|
||||||
|
|
||||||
# Wait until the updater ends
|
# Wait until the updater ends
|
||||||
while pgrep -u ${JACKETT_USER} JackettUpdater > /dev/null; do
|
while pgrep -u "${JACKETT_USER}" JackettUpdater > /dev/null; do
|
||||||
sleep 1
|
sleep 1
|
||||||
done
|
done
|
||||||
|
|||||||
@@ -9,6 +9,10 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Text.RegularExpressions;
|
using System.Text.RegularExpressions;
|
||||||
|
|
||||||
|
// ReSharper disable NotAccessedField.Global
|
||||||
|
// ReSharper disable MemberCanBePrivate.Global
|
||||||
|
// ReSharper disable UnusedMember.Global
|
||||||
|
|
||||||
namespace DateTimeRoutines
|
namespace DateTimeRoutines
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -21,11 +25,11 @@ namespace DateTimeRoutines
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Amount of seconds elapsed between 1970-01-01 00:00:00 and the date-time.
|
/// Amount of seconds elapsed between 1970-01-01 00:00:00 and the date-time.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="date_time">date-time</param>
|
/// <param name="dateTime">date-time</param>
|
||||||
/// <returns>seconds</returns>
|
/// <returns>seconds</returns>
|
||||||
public static uint GetSecondsSinceUnixEpoch(this DateTime date_time)
|
public static uint GetSecondsSinceUnixEpoch(this DateTime dateTime)
|
||||||
{
|
{
|
||||||
var t = date_time - new DateTime(1970, 1, 1);
|
var t = dateTime - new DateTime(1970, 1, 1);
|
||||||
var ss = (int)t.TotalSeconds;
|
var ss = (int)t.TotalSeconds;
|
||||||
if (ss < 0)
|
if (ss < 0)
|
||||||
return 0;
|
return 0;
|
||||||
@@ -44,19 +48,19 @@ namespace DateTimeRoutines
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Index of first char of a date substring found in the string
|
/// Index of first char of a date substring found in the string
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public readonly int IndexOfDate = -1;
|
public readonly int IndexOfDate;
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Length a date substring found in the string
|
/// Length a date substring found in the string
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public readonly int LengthOfDate = -1;
|
public readonly int LengthOfDate;
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Index of first char of a time substring found in the string
|
/// Index of first char of a time substring found in the string
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public readonly int IndexOfTime = -1;
|
public readonly int IndexOfTime;
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Length of a time substring found in the string
|
/// Length of a time substring found in the string
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public readonly int LengthOfTime = -1;
|
public readonly int LengthOfTime;
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// DateTime found in the string
|
/// DateTime found in the string
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -82,45 +86,45 @@ namespace DateTimeRoutines
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public DateTime UtcDateTime;
|
public DateTime UtcDateTime;
|
||||||
|
|
||||||
internal ParsedDateTime(int index_of_date, int length_of_date, int index_of_time, int length_of_time, DateTime date_time)
|
internal ParsedDateTime(int indexOfDate, int lengthOfDate, int indexOfTime, int lengthOfTime, DateTime dateTime)
|
||||||
{
|
{
|
||||||
IndexOfDate = index_of_date;
|
IndexOfDate = indexOfDate;
|
||||||
LengthOfDate = length_of_date;
|
LengthOfDate = lengthOfDate;
|
||||||
IndexOfTime = index_of_time;
|
IndexOfTime = indexOfTime;
|
||||||
LengthOfTime = length_of_time;
|
LengthOfTime = lengthOfTime;
|
||||||
DateTime = date_time;
|
DateTime = dateTime;
|
||||||
IsDateFound = index_of_date > -1;
|
IsDateFound = indexOfDate > -1;
|
||||||
IsTimeFound = index_of_time > -1;
|
IsTimeFound = indexOfTime > -1;
|
||||||
UtcOffset = new TimeSpan(25, 0, 0);
|
UtcOffset = new TimeSpan(25, 0, 0);
|
||||||
IsUtcOffsetFound = false;
|
IsUtcOffsetFound = false;
|
||||||
UtcDateTime = new DateTime(1, 1, 1);
|
UtcDateTime = new DateTime(1, 1, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
internal ParsedDateTime(int index_of_date, int length_of_date, int index_of_time, int length_of_time, DateTime date_time, TimeSpan utc_offset)
|
internal ParsedDateTime(int indexOfDate, int lengthOfDate, int indexOfTime, int lengthOfTime, DateTime dateTime, TimeSpan utcOffset)
|
||||||
{
|
{
|
||||||
IndexOfDate = index_of_date;
|
IndexOfDate = indexOfDate;
|
||||||
LengthOfDate = length_of_date;
|
LengthOfDate = lengthOfDate;
|
||||||
IndexOfTime = index_of_time;
|
IndexOfTime = indexOfTime;
|
||||||
LengthOfTime = length_of_time;
|
LengthOfTime = lengthOfTime;
|
||||||
DateTime = date_time;
|
DateTime = dateTime;
|
||||||
IsDateFound = index_of_date > -1;
|
IsDateFound = indexOfDate > -1;
|
||||||
IsTimeFound = index_of_time > -1;
|
IsTimeFound = indexOfTime > -1;
|
||||||
UtcOffset = utc_offset;
|
UtcOffset = utcOffset;
|
||||||
IsUtcOffsetFound = Math.Abs(utc_offset.TotalHours) < 12;
|
IsUtcOffsetFound = Math.Abs(utcOffset.TotalHours) < 12;
|
||||||
if (!IsUtcOffsetFound)
|
if (!IsUtcOffsetFound)
|
||||||
UtcDateTime = new DateTime(1, 1, 1);
|
UtcDateTime = new DateTime(1, 1, 1);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (index_of_date < 0)//to avoid negative date exception when date is undefined
|
if (indexOfDate < 0)//to avoid negative date exception when date is undefined
|
||||||
{
|
{
|
||||||
var ts = date_time.TimeOfDay + utc_offset;
|
var ts = dateTime.TimeOfDay + utcOffset;
|
||||||
if (ts < new TimeSpan(0))
|
if (ts < new TimeSpan(0))
|
||||||
UtcDateTime = new DateTime(1, 1, 2) + ts;
|
UtcDateTime = new DateTime(1, 1, 2) + ts;
|
||||||
else
|
else
|
||||||
UtcDateTime = new DateTime(1, 1, 1) + ts;
|
UtcDateTime = new DateTime(1, 1, 1) + ts;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
UtcDateTime = date_time + utc_offset;
|
UtcDateTime = dateTime + utcOffset;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -129,7 +133,7 @@ namespace DateTimeRoutines
|
|||||||
/// Date that is accepted in the following cases:
|
/// Date that is accepted in the following cases:
|
||||||
/// - no date was parsed by TryParseDateOrTime();
|
/// - no date was parsed by TryParseDateOrTime();
|
||||||
/// - no year was found by TryParseDate();
|
/// - no year was found by TryParseDate();
|
||||||
/// It is ignored if DefaultDateIsNow = true was set after DefaultDate
|
/// It is ignored if DefaultDateIsNow = true was set after DefaultDate
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static DateTime DefaultDate
|
public static DateTime DefaultDate
|
||||||
{
|
{
|
||||||
@@ -138,13 +142,7 @@ namespace DateTimeRoutines
|
|||||||
_DefaultDate = value;
|
_DefaultDate = value;
|
||||||
DefaultDateIsNow = false;
|
DefaultDateIsNow = false;
|
||||||
}
|
}
|
||||||
get
|
get => DefaultDateIsNow ? DateTime.Now : _DefaultDate;
|
||||||
{
|
|
||||||
if (DefaultDateIsNow)
|
|
||||||
return DateTime.Now;
|
|
||||||
else
|
|
||||||
return _DefaultDate;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static DateTime _DefaultDate = DateTime.Now;
|
private static DateTime _DefaultDate = DateTime.Now;
|
||||||
@@ -157,16 +155,17 @@ namespace DateTimeRoutines
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Defines default date-time format.
|
/// Defines default date-time format.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[Flags]
|
||||||
public enum DateTimeFormat
|
public enum DateTimeFormat
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// month number goes before day number
|
/// month number goes before day number
|
||||||
/// </summary>
|
/// </summary>
|
||||||
USA_DATE,
|
UsaDate,
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// day number goes before month number
|
/// day number goes before month number
|
||||||
/// </summary>
|
/// </summary>
|
||||||
UK_DATE,
|
UkDate,
|
||||||
///// <summary>
|
///// <summary>
|
||||||
///// time is specifed through AM or PM
|
///// time is specifed through AM or PM
|
||||||
///// </summary>
|
///// </summary>
|
||||||
@@ -178,79 +177,79 @@ namespace DateTimeRoutines
|
|||||||
#region parsing derived methods for DateTime output
|
#region parsing derived methods for DateTime output
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Tries to find date and time within the passed string and return it as DateTime structure.
|
/// Tries to find date and time within the passed string and return it as DateTime structure.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="str">string that contains date and/or time</param>
|
/// <param name="str">string that contains date and/or time</param>
|
||||||
/// <param name="default_format">format to be used preferably in ambivalent instances</param>
|
/// <param name="defaultFormat">format to be used preferably in ambivalent instances</param>
|
||||||
/// <param name="date_time">parsed date-time output</param>
|
/// <param name="dateTime">parsed date-time output</param>
|
||||||
/// <returns>true if both date and time were found, else false</returns>
|
/// <returns>true if both date and time were found, else false</returns>
|
||||||
public static bool TryParseDateTime(this string str, DateTimeFormat default_format, out DateTime date_time)
|
public static bool TryParseDateTime(this string str, DateTimeFormat defaultFormat, out DateTime dateTime)
|
||||||
{
|
{
|
||||||
if (!TryParseDateTime(str, default_format, out ParsedDateTime parsed_date_time))
|
if (!TryParseDateTime(str, defaultFormat, out ParsedDateTime parsedDateTime))
|
||||||
{
|
{
|
||||||
date_time = new DateTime(1, 1, 1);
|
dateTime = new DateTime(1, 1, 1);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
date_time = parsed_date_time.DateTime;
|
dateTime = parsedDateTime.DateTime;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Tries to find date and/or time within the passed string and return it as DateTime structure.
|
/// Tries to find date and/or time within the passed string and return it as DateTime structure.
|
||||||
/// If only date was found, time in the returned DateTime is always 0:0:0.
|
/// If only date was found, time in the returned DateTime is always 0:0:0.
|
||||||
/// If only time was found, date in the returned DateTime is DefaultDate.
|
/// If only time was found, date in the returned DateTime is DefaultDate.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="str">string that contains date and(or) time</param>
|
/// <param name="str">string that contains date and(or) time</param>
|
||||||
/// <param name="default_format">format to be used preferably in ambivalent instances</param>
|
/// <param name="defaultFormat">format to be used preferably in ambivalent instances</param>
|
||||||
/// <param name="date_time">parsed date-time output</param>
|
/// <param name="dateTime">parsed date-time output</param>
|
||||||
/// <returns>true if date and/or time was found, else false</returns>
|
/// <returns>true if date and/or time was found, else false</returns>
|
||||||
public static bool TryParseDateOrTime(this string str, DateTimeFormat default_format, out DateTime date_time)
|
public static bool TryParseDateOrTime(this string str, DateTimeFormat defaultFormat, out DateTime dateTime)
|
||||||
{
|
{
|
||||||
if (!TryParseDateOrTime(str, default_format, out ParsedDateTime parsed_date_time))
|
if (!TryParseDateOrTime(str, defaultFormat, out ParsedDateTime parsedDateTime))
|
||||||
{
|
{
|
||||||
date_time = new DateTime(1, 1, 1);
|
dateTime = new DateTime(1, 1, 1);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
date_time = parsed_date_time.DateTime;
|
dateTime = parsedDateTime.DateTime;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Tries to find time within the passed string and return it as DateTime structure.
|
/// Tries to find time within the passed string and return it as DateTime structure.
|
||||||
/// It recognizes only time while ignoring date, so date in the returned DateTime is always 1/1/1.
|
/// It recognizes only time while ignoring date, so date in the returned DateTime is always 1/1/1.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="str">string that contains time</param>
|
/// <param name="str">string that contains time</param>
|
||||||
/// <param name="default_format">format to be used preferably in ambivalent instances</param>
|
/// <param name="defaultFormat">format to be used preferably in ambivalent instances</param>
|
||||||
/// <param name="time">parsed time output</param>
|
/// <param name="time">parsed time output</param>
|
||||||
/// <returns>true if time was found, else false</returns>
|
/// <returns>true if time was found, else false</returns>
|
||||||
public static bool TryParseTime(this string str, DateTimeFormat default_format, out DateTime time)
|
public static bool TryParseTime(this string str, DateTimeFormat defaultFormat, out DateTime time)
|
||||||
{
|
{
|
||||||
if (!TryParseTime(str, default_format, out var parsed_time, null))
|
if (!TryParseTime(str, defaultFormat, out var parsedTime, null))
|
||||||
{
|
{
|
||||||
time = new DateTime(1, 1, 1);
|
time = new DateTime(1, 1, 1);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
time = parsed_time.DateTime;
|
time = parsedTime.DateTime;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Tries to find date within the passed string and return it as DateTime structure.
|
/// Tries to find date within the passed string and return it as DateTime structure.
|
||||||
/// It recognizes only date while ignoring time, so time in the returned DateTime is always 0:0:0.
|
/// It recognizes only date while ignoring time, so time in the returned DateTime is always 0:0:0.
|
||||||
/// If year of the date was not found then it accepts the current year.
|
/// If year of the date was not found then it accepts the current year.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="str">string that contains date</param>
|
/// <param name="str">string that contains date</param>
|
||||||
/// <param name="default_format">format to be used preferably in ambivalent instances</param>
|
/// <param name="defaultFormat">format to be used preferably in ambivalent instances</param>
|
||||||
/// <param name="date">parsed date output</param>
|
/// <param name="date">parsed date output</param>
|
||||||
/// <returns>true if date was found, else false</returns>
|
/// <returns>true if date was found, else false</returns>
|
||||||
public static bool TryParseDate(this string str, DateTimeFormat default_format, out DateTime date)
|
public static bool TryParseDate(this string str, DateTimeFormat defaultFormat, out DateTime date)
|
||||||
{
|
{
|
||||||
if (!TryParseDate(str, default_format, out ParsedDateTime parsed_date))
|
if (!TryParseDate(str, defaultFormat, out ParsedDateTime parsedDate))
|
||||||
{
|
{
|
||||||
date = new DateTime(1, 1, 1);
|
date = new DateTime(1, 1, 1);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
date = parsed_date.DateTime;
|
date = parsedDate.DateTime;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -259,71 +258,69 @@ namespace DateTimeRoutines
|
|||||||
#region parsing derived methods for ParsedDateTime output
|
#region parsing derived methods for ParsedDateTime output
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Tries to find date and time within the passed string and return it as ParsedDateTime object.
|
/// Tries to find date and time within the passed string and return it as ParsedDateTime object.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="str">string that contains date-time</param>
|
/// <param name="str">string that contains date-time</param>
|
||||||
/// <param name="default_format">format to be used preferably in ambivalent instances</param>
|
/// <param name="defaultFormat">format to be used preferably in ambivalent instances</param>
|
||||||
/// <param name="parsed_date_time">parsed date-time output</param>
|
/// <param name="parsedDateTime">parsed date-time output</param>
|
||||||
/// <returns>true if both date and time were found, else false</returns>
|
/// <returns>true if both date and time were found, else false</returns>
|
||||||
public static bool TryParseDateTime(this string str, DateTimeFormat default_format, out ParsedDateTime parsed_date_time)
|
public static bool TryParseDateTime(this string str, DateTimeFormat defaultFormat, out ParsedDateTime parsedDateTime)
|
||||||
{
|
{
|
||||||
if (DateTimeRoutines.TryParseDateOrTime(str, default_format, out parsed_date_time)
|
if (TryParseDateOrTime(str, defaultFormat, out parsedDateTime)
|
||||||
&& parsed_date_time.IsDateFound
|
&& parsedDateTime.IsDateFound
|
||||||
&& parsed_date_time.IsTimeFound
|
&& parsedDateTime.IsTimeFound
|
||||||
)
|
)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
parsed_date_time = null;
|
parsedDateTime = null;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Tries to find time within the passed string and return it as ParsedDateTime object.
|
/// Tries to find time within the passed string and return it as ParsedDateTime object.
|
||||||
/// It recognizes only time while ignoring date, so date in the returned ParsedDateTime is always 1/1/1
|
/// It recognizes only time while ignoring date, so date in the returned ParsedDateTime is always 1/1/1
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="str">string that contains date-time</param>
|
/// <param name="str">string that contains date-time</param>
|
||||||
/// <param name="default_format">format to be used preferably in ambivalent instances</param>
|
/// <param name="defaultFormat">format to be used preferably in ambivalent instances</param>
|
||||||
/// <param name="parsed_time">parsed date-time output</param>
|
/// <param name="parsedTime">parsed date-time output</param>
|
||||||
/// <returns>true if time was found, else false</returns>
|
/// <returns>true if time was found, else false</returns>
|
||||||
public static bool TryParseTime(this string str, DateTimeFormat default_format, out ParsedDateTime parsed_time)
|
public static bool TryParseTime(this string str, DateTimeFormat defaultFormat, out ParsedDateTime parsedTime)
|
||||||
{
|
=> TryParseTime(str, defaultFormat, out parsedTime, null);
|
||||||
return TryParseTime(str, default_format, out parsed_time, null);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Tries to find date and/or time within the passed string and return it as ParsedDateTime object.
|
/// Tries to find date and/or time within the passed string and return it as ParsedDateTime object.
|
||||||
/// If only date was found, time in the returned ParsedDateTime is always 0:0:0.
|
/// If only date was found, time in the returned ParsedDateTime is always 0:0:0.
|
||||||
/// If only time was found, date in the returned ParsedDateTime is DefaultDate.
|
/// If only time was found, date in the returned ParsedDateTime is DefaultDate.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="str">string that contains date-time</param>
|
/// <param name="str">string that contains date-time</param>
|
||||||
/// <param name="default_format">format to be used preferably in ambivalent instances</param>
|
/// <param name="defaultFormat">format to be used preferably in ambivalent instances</param>
|
||||||
/// <param name="parsed_date_time">parsed date-time output</param>
|
/// <param name="parsedDateTime">parsed date-time output</param>
|
||||||
/// <returns>true if date or time was found, else false</returns>
|
/// <returns>true if date or time was found, else false</returns>
|
||||||
public static bool TryParseDateOrTime(this string str, DateTimeFormat default_format, out ParsedDateTime parsed_date_time)
|
public static bool TryParseDateOrTime(this string str, DateTimeFormat defaultFormat, out ParsedDateTime parsedDateTime)
|
||||||
{
|
{
|
||||||
parsed_date_time = null;
|
parsedDateTime = null;
|
||||||
|
|
||||||
ParsedDateTime parsed_time;
|
ParsedDateTime parsedTime;
|
||||||
if (!TryParseDate(str, default_format, out
|
if (!TryParseDate(str, defaultFormat, out
|
||||||
ParsedDateTime parsed_date))
|
ParsedDateTime parsedDate))
|
||||||
{
|
{
|
||||||
if (!TryParseTime(str, default_format, out parsed_time, null))
|
if (!TryParseTime(str, defaultFormat, out parsedTime, null))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
var date_time = new DateTime(DefaultDate.Year, DefaultDate.Month, DefaultDate.Day, parsed_time.DateTime.Hour, parsed_time.DateTime.Minute, parsed_time.DateTime.Second);
|
var dateTime = new DateTime(DefaultDate.Year, DefaultDate.Month, DefaultDate.Day, parsedTime.DateTime.Hour, parsedTime.DateTime.Minute, parsedTime.DateTime.Second);
|
||||||
parsed_date_time = new ParsedDateTime(-1, -1, parsed_time.IndexOfTime, parsed_time.LengthOfTime, date_time, parsed_time.UtcOffset);
|
parsedDateTime = new ParsedDateTime(-1, -1, parsedTime.IndexOfTime, parsedTime.LengthOfTime, dateTime, parsedTime.UtcOffset);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (!TryParseTime(str, default_format, out parsed_time, parsed_date))
|
if (!TryParseTime(str, defaultFormat, out parsedTime, parsedDate))
|
||||||
{
|
{
|
||||||
var date_time = new DateTime(parsed_date.DateTime.Year, parsed_date.DateTime.Month, parsed_date.DateTime.Day, 0, 0, 0);
|
var dateTime = new DateTime(parsedDate.DateTime.Year, parsedDate.DateTime.Month, parsedDate.DateTime.Day, 0, 0, 0);
|
||||||
parsed_date_time = new ParsedDateTime(parsed_date.IndexOfDate, parsed_date.LengthOfDate, -1, -1, date_time);
|
parsedDateTime = new ParsedDateTime(parsedDate.IndexOfDate, parsedDate.LengthOfDate, -1, -1, dateTime);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
var date_time = new DateTime(parsed_date.DateTime.Year, parsed_date.DateTime.Month, parsed_date.DateTime.Day, parsed_time.DateTime.Hour, parsed_time.DateTime.Minute, parsed_time.DateTime.Second);
|
var dateTime = new DateTime(parsedDate.DateTime.Year, parsedDate.DateTime.Month, parsedDate.DateTime.Day, parsedTime.DateTime.Hour, parsedTime.DateTime.Minute, parsedTime.DateTime.Second);
|
||||||
parsed_date_time = new ParsedDateTime(parsed_date.IndexOfDate, parsed_date.LengthOfDate, parsed_time.IndexOfTime, parsed_time.LengthOfTime, date_time, parsed_time.UtcOffset);
|
parsedDateTime = new ParsedDateTime(parsedDate.IndexOfDate, parsedDate.LengthOfDate, parsedTime.IndexOfTime, parsedTime.LengthOfTime, dateTime, parsedTime.UtcOffset);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -339,42 +336,39 @@ namespace DateTimeRoutines
|
|||||||
/// It recognizes only time while ignoring date, so date in the returned ParsedDateTime is always 1/1/1
|
/// It recognizes only time while ignoring date, so date in the returned ParsedDateTime is always 1/1/1
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="str">string that contains date</param>
|
/// <param name="str">string that contains date</param>
|
||||||
/// <param name="default_format">format to be used preferably in ambivalent instances</param>
|
/// <param name="defaultFormat">format to be used preferably in ambivalent instances</param>
|
||||||
/// <param name="parsed_time">parsed date-time output</param>
|
/// <param name="parsedTime">parsed date-time output</param>
|
||||||
/// <param name="parsed_date">ParsedDateTime object if the date was found within this string, else NULL</param>
|
/// <param name="parsedDate">ParsedDateTime object if the date was found within this string, else NULL</param>
|
||||||
/// <returns>true if time was found, else false</returns>
|
/// <returns>true if time was found, else false</returns>
|
||||||
public static bool TryParseTime(this string str, DateTimeFormat default_format, out ParsedDateTime parsed_time, ParsedDateTime parsed_date)
|
public static bool TryParseTime(this string str, DateTimeFormat defaultFormat, out ParsedDateTime parsedTime, ParsedDateTime parsedDate)
|
||||||
{
|
{
|
||||||
parsed_time = null;
|
parsedTime = null;
|
||||||
|
|
||||||
string time_zone_r;
|
var timeZoneR = defaultFormat == DateTimeFormat.UsaDate ?
|
||||||
if (default_format == DateTimeFormat.USA_DATE)
|
@"(?:\s*(?'time_zone'UTC|GMT|CST|EST))?" : @"(?:\s*(?'time_zone'UTC|GMT))?";
|
||||||
time_zone_r = @"(?:\s*(?'time_zone'UTC|GMT|CST|EST))?";
|
|
||||||
else
|
|
||||||
time_zone_r = @"(?:\s*(?'time_zone'UTC|GMT))?";
|
|
||||||
|
|
||||||
Match m;
|
Match m;
|
||||||
if (parsed_date != null && parsed_date.IndexOfDate > -1)
|
if (parsedDate != null && parsedDate.IndexOfDate > -1)
|
||||||
{//look around the found date
|
{//look around the found date
|
||||||
//look for <date> hh:mm:ss <UTC offset>
|
//look for <date> hh:mm:ss <UTC offset>
|
||||||
m = Regex.Match(str.Substring(parsed_date.IndexOfDate + parsed_date.LengthOfDate), @"(?<=^\s*,?\s+|^\s*at\s*|^\s*[T\-]\s*)(?'hour'\d{2})\s*:\s*(?'minute'\d{2})\s*:\s*(?'second'\d{2})\s+(?'offset_sign'[\+\-])(?'offset_hh'\d{2}):?(?'offset_mm'\d{2})(?=$|[^\d\w])", RegexOptions.Compiled);
|
m = Regex.Match(str.Substring(parsedDate.IndexOfDate + parsedDate.LengthOfDate), @"(?<=^\s*,?\s+|^\s*at\s*|^\s*[T\-]\s*)(?'hour'\d{2})\s*:\s*(?'minute'\d{2})\s*:\s*(?'second'\d{2})\s+(?'offset_sign'[\+\-])(?'offset_hh'\d{2}):?(?'offset_mm'\d{2})(?=$|[^\d\w])", RegexOptions.Compiled);
|
||||||
if (!m.Success)
|
if (!m.Success)
|
||||||
//look for <date> [h]h:mm[:ss] [PM/AM] [UTC/GMT]
|
//look for <date> [h]h:mm[:ss] [PM/AM] [UTC/GMT]
|
||||||
m = Regex.Match(str.Substring(parsed_date.IndexOfDate + parsed_date.LengthOfDate), @"(?<=^\s*,?\s+|^\s*at\s*|^\s*[T\-]\s*)(?'hour'\d{1,2})\s*:\s*(?'minute'\d{2})\s*(?::\s*(?'second'\d{2}))?(?:\s*(?'ampm'AM|am|PM|pm))?" + time_zone_r + @"(?=$|[^\d\w])", RegexOptions.Compiled);
|
m = Regex.Match(str.Substring(parsedDate.IndexOfDate + parsedDate.LengthOfDate), @"(?<=^\s*,?\s+|^\s*at\s*|^\s*[T\-]\s*)(?'hour'\d{1,2})\s*:\s*(?'minute'\d{2})\s*(?::\s*(?'second'\d{2}))?(?:\s*(?'ampm'AM|am|PM|pm))?" + timeZoneR + @"(?=$|[^\d\w])", RegexOptions.Compiled);
|
||||||
if (!m.Success)
|
if (!m.Success)
|
||||||
//look for [h]h:mm:ss [PM/AM] [UTC/GMT] <date>
|
//look for [h]h:mm:ss [PM/AM] [UTC/GMT] <date>
|
||||||
m = Regex.Match(str.Substring(0, parsed_date.IndexOfDate), @"(?<=^|[^\d])(?'hour'\d{1,2})\s*:\s*(?'minute'\d{2})\s*(?::\s*(?'second'\d{2}))?(?:\s*(?'ampm'AM|am|PM|pm))?" + time_zone_r + @"(?=$|[\s,]+)", RegexOptions.Compiled);
|
m = Regex.Match(str.Substring(0, parsedDate.IndexOfDate), @"(?<=^|[^\d])(?'hour'\d{1,2})\s*:\s*(?'minute'\d{2})\s*(?::\s*(?'second'\d{2}))?(?:\s*(?'ampm'AM|am|PM|pm))?" + timeZoneR + @"(?=$|[\s,]+)", RegexOptions.Compiled);
|
||||||
if (!m.Success)
|
if (!m.Success)
|
||||||
//look for [h]h:mm:ss [PM/AM] [UTC/GMT] within <date>
|
//look for [h]h:mm:ss [PM/AM] [UTC/GMT] within <date>
|
||||||
m = Regex.Match(str.Substring(parsed_date.IndexOfDate, parsed_date.LengthOfDate), @"(?<=^|[^\d])(?'hour'\d{1,2})\s*:\s*(?'minute'\d{2})\s*(?::\s*(?'second'\d{2}))?(?:\s*(?'ampm'AM|am|PM|pm))?" + time_zone_r + @"(?=$|[\s,]+)", RegexOptions.Compiled);
|
m = Regex.Match(str.Substring(parsedDate.IndexOfDate, parsedDate.LengthOfDate), @"(?<=^|[^\d])(?'hour'\d{1,2})\s*:\s*(?'minute'\d{2})\s*(?::\s*(?'second'\d{2}))?(?:\s*(?'ampm'AM|am|PM|pm))?" + timeZoneR + @"(?=$|[\s,]+)", RegexOptions.Compiled);
|
||||||
}
|
}
|
||||||
else//look anywhere within string
|
else//look anywhere within string
|
||||||
{
|
{
|
||||||
//look for hh:mm:ss <UTC offset>
|
//look for hh:mm:ss <UTC offset>
|
||||||
m = Regex.Match(str, @"(?<=^|\s+|\s*T\s*)(?'hour'\d{2})\s*:\s*(?'minute'\d{2})\s*:\s*(?'second'\d{2})\s+(?'offset_sign'[\+\-])(?'offset_hh'\d{2}):?(?'offset_mm'\d{2})?(?=$|[^\d\w])", RegexOptions.Compiled);
|
m = Regex.Match(str, @"(?<=^|\s+|\s*T\s*)(?'hour'\d{2})\s*:\s*(?'minute'\d{2})\s*:\s*(?'second'\d{2})\s+(?'offset_sign'[\+\-])(?'offset_hh'\d{2}):?(?'offset_mm'\d{2})?(?=$|[^\d\w])", RegexOptions.Compiled);
|
||||||
if (!m.Success)
|
if (!m.Success)
|
||||||
//look for [h]h:mm[:ss] [PM/AM] [UTC/GMT]
|
//look for [h]h:mm[:ss] [PM/AM] [UTC/GMT]
|
||||||
m = Regex.Match(str, @"(?<=^|\s+|\s*T\s*)(?'hour'\d{1,2})\s*:\s*(?'minute'\d{2})\s*(?::\s*(?'second'\d{2}))?(?:\s*(?'ampm'AM|am|PM|pm))?" + time_zone_r + @"(?=$|[^\d\w])", RegexOptions.Compiled);
|
m = Regex.Match(str, @"(?<=^|\s+|\s*T\s*)(?'hour'\d{1,2})\s*:\s*(?'minute'\d{2})\s*(?::\s*(?'second'\d{2}))?(?:\s*(?'ampm'AM|am|PM|pm))?" + timeZoneR + @"(?=$|[^\d\w])", RegexOptions.Compiled);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!m.Success)
|
if (!m.Success)
|
||||||
@@ -398,49 +392,49 @@ namespace DateTimeRoutines
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (string.Compare(m.Groups["ampm"].Value, "PM", true) == 0 && hour < 12)
|
if ("PM".Equals(m.Groups["ampm"].Value, StringComparison.OrdinalIgnoreCase) && hour < 12)
|
||||||
hour += 12;
|
hour += 12;
|
||||||
else if (string.Compare(m.Groups["ampm"].Value, "AM", true) == 0 && hour == 12)
|
else if ("AM".Equals(m.Groups["ampm"].Value, StringComparison.OrdinalIgnoreCase) && hour == 12)
|
||||||
hour -= 12;
|
hour -= 12;
|
||||||
|
|
||||||
var date_time = new DateTime(1, 1, 1, hour, minute, second);
|
var dateTime = new DateTime(1, 1, 1, hour, minute, second);
|
||||||
|
|
||||||
if (m.Groups["offset_hh"].Success)
|
if (m.Groups["offset_hh"].Success)
|
||||||
{
|
{
|
||||||
var offset_hh = int.Parse(m.Groups["offset_hh"].Value);
|
var offsetHh = int.Parse(m.Groups["offset_hh"].Value);
|
||||||
var offset_mm = 0;
|
var offsetMm = 0;
|
||||||
if (m.Groups["offset_mm"].Success)
|
if (m.Groups["offset_mm"].Success)
|
||||||
offset_mm = int.Parse(m.Groups["offset_mm"].Value);
|
offsetMm = int.Parse(m.Groups["offset_mm"].Value);
|
||||||
var utc_offset = new TimeSpan(offset_hh, offset_mm, 0);
|
var utcOffset = new TimeSpan(offsetHh, offsetMm, 0);
|
||||||
if (m.Groups["offset_sign"].Value == "-")
|
if (m.Groups["offset_sign"].Value == "-")
|
||||||
utc_offset = -utc_offset;
|
utcOffset = -utcOffset;
|
||||||
parsed_time = new ParsedDateTime(-1, -1, m.Index, m.Length, date_time, utc_offset);
|
parsedTime = new ParsedDateTime(-1, -1, m.Index, m.Length, dateTime, utcOffset);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m.Groups["time_zone"].Success)
|
if (m.Groups["time_zone"].Success)
|
||||||
{
|
{
|
||||||
TimeSpan utc_offset;
|
TimeSpan utcOffset;
|
||||||
switch (m.Groups["time_zone"].Value)
|
switch (m.Groups["time_zone"].Value)
|
||||||
{
|
{
|
||||||
case "UTC":
|
case "UTC":
|
||||||
case "GMT":
|
case "GMT":
|
||||||
utc_offset = new TimeSpan(0, 0, 0);
|
utcOffset = new TimeSpan(0, 0, 0);
|
||||||
break;
|
break;
|
||||||
case "CST":
|
case "CST":
|
||||||
utc_offset = new TimeSpan(-6, 0, 0);
|
utcOffset = new TimeSpan(-6, 0, 0);
|
||||||
break;
|
break;
|
||||||
case "EST":
|
case "EST":
|
||||||
utc_offset = new TimeSpan(-5, 0, 0);
|
utcOffset = new TimeSpan(-5, 0, 0);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
throw new Exception("Time zone: " + m.Groups["time_zone"].Value + " is not defined.");
|
throw new Exception("Time zone: " + m.Groups["time_zone"].Value + " is not defined.");
|
||||||
}
|
}
|
||||||
parsed_time = new ParsedDateTime(-1, -1, m.Index, m.Length, date_time, utc_offset);
|
parsedTime = new ParsedDateTime(-1, -1, m.Index, m.Length, dateTime, utcOffset);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
parsed_time = new ParsedDateTime(-1, -1, m.Index, m.Length, date_time);
|
parsedTime = new ParsedDateTime(-1, -1, m.Index, m.Length, dateTime);
|
||||||
//}
|
//}
|
||||||
//catch(Exception e)
|
//catch(Exception e)
|
||||||
//{
|
//{
|
||||||
@@ -450,17 +444,17 @@ namespace DateTimeRoutines
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Tries to find date within the passed string and return it as ParsedDateTime object.
|
/// Tries to find date within the passed string and return it as ParsedDateTime object.
|
||||||
/// It recognizes only date while ignoring time, so time in the returned ParsedDateTime is always 0:0:0.
|
/// It recognizes only date while ignoring time, so time in the returned ParsedDateTime is always 0:0:0.
|
||||||
/// If year of the date was not found then it accepts the current year.
|
/// If year of the date was not found then it accepts the current year.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="str">string that contains date</param>
|
/// <param name="str">string that contains date</param>
|
||||||
/// <param name="default_format">format to be used preferably in ambivalent instances</param>
|
/// <param name="defaultFormat">format to be used preferably in ambivalent instances</param>
|
||||||
/// <param name="parsed_date">parsed date output</param>
|
/// <param name="parsedDate">parsed date output</param>
|
||||||
/// <returns>true if date was found, else false</returns>
|
/// <returns>true if date was found, else false</returns>
|
||||||
public static bool TryParseDate(this string str, DateTimeFormat default_format, out ParsedDateTime parsed_date)
|
public static bool TryParseDate(this string str, DateTimeFormat defaultFormat, out ParsedDateTime parsedDate)
|
||||||
{
|
{
|
||||||
parsed_date = null;
|
parsedDate = null;
|
||||||
|
|
||||||
if (string.IsNullOrEmpty(str))
|
if (string.IsNullOrEmpty(str))
|
||||||
return false;
|
return false;
|
||||||
@@ -470,17 +464,17 @@ namespace DateTimeRoutines
|
|||||||
if (m.Success)
|
if (m.Success)
|
||||||
{
|
{
|
||||||
DateTime date;
|
DateTime date;
|
||||||
if ((default_format ^ DateTimeFormat.USA_DATE) == DateTimeFormat.USA_DATE)
|
if ((defaultFormat ^ DateTimeFormat.UsaDate) == DateTimeFormat.UsaDate)
|
||||||
{
|
{
|
||||||
if (!convert_to_date(int.Parse(m.Groups["year"].Value), int.Parse(m.Groups["day"].Value), int.Parse(m.Groups["month"].Value), out date))
|
if (!ConvertToDate(int.Parse(m.Groups["year"].Value), int.Parse(m.Groups["day"].Value), int.Parse(m.Groups["month"].Value), out date))
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (!convert_to_date(int.Parse(m.Groups["year"].Value), int.Parse(m.Groups["month"].Value), int.Parse(m.Groups["day"].Value), out date))
|
if (!ConvertToDate(int.Parse(m.Groups["year"].Value), int.Parse(m.Groups["month"].Value), int.Parse(m.Groups["day"].Value), out date))
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
parsed_date = new ParsedDateTime(m.Index, m.Length, -1, -1, date);
|
parsedDate = new ParsedDateTime(m.Index, m.Length, -1, -1, date);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -488,9 +482,9 @@ namespace DateTimeRoutines
|
|||||||
m = Regex.Match(str, @"(?<=^|[^\d])(?'year'\d{2}|\d{4})\s*(?'separator'[\-])\s*(?'month'\d{1,2})\s*\'separator'+\s*(?'day'\d{1,2})(?=$|[^\d])", RegexOptions.Compiled | RegexOptions.IgnoreCase);
|
m = Regex.Match(str, @"(?<=^|[^\d])(?'year'\d{2}|\d{4})\s*(?'separator'[\-])\s*(?'month'\d{1,2})\s*\'separator'+\s*(?'day'\d{1,2})(?=$|[^\d])", RegexOptions.Compiled | RegexOptions.IgnoreCase);
|
||||||
if (m.Success)
|
if (m.Success)
|
||||||
{
|
{
|
||||||
if (!convert_to_date(int.Parse(m.Groups["year"].Value), int.Parse(m.Groups["month"].Value), int.Parse(m.Groups["day"].Value), out var date))
|
if (!ConvertToDate(int.Parse(m.Groups["year"].Value), int.Parse(m.Groups["month"].Value), int.Parse(m.Groups["day"].Value), out var date))
|
||||||
return false;
|
return false;
|
||||||
parsed_date = new ParsedDateTime(m.Index, m.Length, -1, -1, date);
|
parsedDate = new ParsedDateTime(m.Index, m.Length, -1, -1, date);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -511,8 +505,8 @@ namespace DateTimeRoutines
|
|||||||
if (m.Success)
|
if (m.Success)
|
||||||
{
|
{
|
||||||
var month = -1;
|
var month = -1;
|
||||||
var index_of_date = m.Index;
|
var indexOfDate = m.Index;
|
||||||
var length_of_date = m.Length;
|
var lengthOfDate = m.Length;
|
||||||
|
|
||||||
switch (m.Groups["month"].Value)
|
switch (m.Groups["month"].Value)
|
||||||
{
|
{
|
||||||
@@ -565,22 +559,19 @@ namespace DateTimeRoutines
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
int year;
|
var year = !string.IsNullOrEmpty(m.Groups["year"].Value) ?
|
||||||
if (!string.IsNullOrEmpty(m.Groups["year"].Value))
|
int.Parse(m.Groups["year"].Value) : DefaultDate.Year;
|
||||||
year = int.Parse(m.Groups["year"].Value);
|
|
||||||
else
|
|
||||||
year = DefaultDate.Year;
|
|
||||||
|
|
||||||
if (!convert_to_date(year, month, int.Parse(m.Groups["day"].Value), out var date))
|
if (!ConvertToDate(year, month, int.Parse(m.Groups["day"].Value), out var date))
|
||||||
return false;
|
return false;
|
||||||
parsed_date = new ParsedDateTime(index_of_date, length_of_date, -1, -1, date);
|
parsedDate = new ParsedDateTime(indexOfDate, lengthOfDate, -1, -1, date);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static bool convert_to_date(int year, int month, int day, out DateTime date)
|
private static bool ConvertToDate(int year, int month, int day, out DateTime date)
|
||||||
{
|
{
|
||||||
if (year >= 100)
|
if (year >= 100)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,7 +1,10 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFramework>netstandard2.0</TargetFramework>
|
<TargetFramework>netstandard2.0</TargetFramework>
|
||||||
|
<LangVersion>8</LangVersion>
|
||||||
|
<NoWarn />
|
||||||
|
<TreatWarningsAsErrors>false</TreatWarningsAsErrors>
|
||||||
|
<WarningsAsErrors />
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
function getUrlParams() {
|
function getUrlParams() {
|
||||||
var vars = [], hash;
|
var vars = [], hash;
|
||||||
var hashes = window.location.href.slice(window.location.href.indexOf('?') + 1).split('&');
|
var hashes = window.location.href.slice(window.location.href.indexOf('?') + 1).split('&');
|
||||||
for (var i = 0; i < hashes.length; i++) {
|
for (var i = 0; i < hashes.length; i++) {
|
||||||
@@ -7,4 +7,4 @@
|
|||||||
vars[hash[0]] = hash[1];
|
vars[hash[0]] = hash[1];
|
||||||
}
|
}
|
||||||
return vars;
|
return vars;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -55,6 +55,14 @@ body {
|
|||||||
max-width: 255px;
|
max-width: 255px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.setup-item-inputcheckbox label {
|
||||||
|
padding: 0 1.5em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.setup-item-inputcheckbox input {
|
||||||
|
height: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
.setup-item-inputbool input {
|
.setup-item-inputbool input {
|
||||||
max-width: 100px;
|
max-width: 100px;
|
||||||
height: 20px;
|
height: 20px;
|
||||||
@@ -175,6 +183,12 @@ hr {
|
|||||||
border-bottom: 1px solid #ddd;
|
border-bottom: 1px solid #ddd;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.jackettlog-narrowcol {
|
||||||
|
width: 1px;
|
||||||
|
white-space: nowrap;
|
||||||
|
vertical-align: top;
|
||||||
|
}
|
||||||
|
|
||||||
.jackettlogWarn {
|
.jackettlogWarn {
|
||||||
background-color: #FFFF8E !important;
|
background-color: #FFFF8E !important;
|
||||||
}
|
}
|
||||||
@@ -202,11 +216,15 @@ pre {
|
|||||||
font-size: 13px;
|
font-size: 13px;
|
||||||
line-height: 1.42857143;
|
line-height: 1.42857143;
|
||||||
color: #333;
|
color: #333;
|
||||||
word-break: break-all;
|
|
||||||
word-wrap: break-word;
|
|
||||||
background-color: transparent;
|
background-color: transparent;
|
||||||
border: 0;
|
border: 0;
|
||||||
border-radius: 0;
|
border-radius: 0;
|
||||||
|
word-break: normal;
|
||||||
|
white-space: pre-wrap; /* Since CSS 2.1 */
|
||||||
|
white-space: -moz-pre-wrap; /* Mozilla, since 1999 */
|
||||||
|
white-space: -pre-wrap; /* Opera 4-6 */
|
||||||
|
white-space: -o-pre-wrap; /* Opera 7 */
|
||||||
|
word-wrap: break-word; /* Internet Explorer 5.5+ */
|
||||||
}
|
}
|
||||||
|
|
||||||
.modal-open .modal {
|
.modal-open .modal {
|
||||||
@@ -277,7 +295,7 @@ table td.fit{
|
|||||||
|
|
||||||
.tooltip-inner img {
|
.tooltip-inner img {
|
||||||
max-width: 250px;
|
max-width: 250px;
|
||||||
height: auto;
|
height: auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
.type-public {
|
.type-public {
|
||||||
|
|||||||
@@ -32,7 +32,15 @@ $(document).ready(function () {
|
|||||||
return opts.fn(this);
|
return opts.fn(this);
|
||||||
else
|
else
|
||||||
return opts.inverse(this);
|
return opts.inverse(this);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
Handlebars.registerHelper('if_in', function(elem, list, opts) {
|
||||||
|
if(list.indexOf(elem) > -1) {
|
||||||
|
return opts.fn(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
return opts.inverse(this);
|
||||||
|
});
|
||||||
|
|
||||||
var index = window.location.pathname.indexOf("/UI");
|
var index = window.location.pathname.indexOf("/UI");
|
||||||
var pathPrefix = window.location.pathname.substr(0, index);
|
var pathPrefix = window.location.pathname.substr(0, index);
|
||||||
@@ -43,7 +51,12 @@ $(document).ready(function () {
|
|||||||
});
|
});
|
||||||
|
|
||||||
function openSearchIfNecessary() {
|
function openSearchIfNecessary() {
|
||||||
const hashArgs = location.hash.substring(1).split('&').reduce((prev, item) => Object.assign({ [item.split('=')[0]]: (item.split('=').length < 2 ? undefined : decodeURIComponent(item.split('=')[1])) }, prev), {});
|
const hashArgs = location.hash.substring(1).split('&').reduce((prev, item) =>
|
||||||
|
Object.assign({
|
||||||
|
[item.split('=')[0]]: (item.split('=').length < 2 ?
|
||||||
|
undefined :
|
||||||
|
decodeURIComponent(item.split('=')[1].replace(/\+/g,'%20')))
|
||||||
|
}, prev), {});
|
||||||
if ("search" in hashArgs) {
|
if ("search" in hashArgs) {
|
||||||
showSearch(hashArgs.tracker, hashArgs.search, hashArgs.category);
|
showSearch(hashArgs.tracker, hashArgs.search, hashArgs.category);
|
||||||
}
|
}
|
||||||
@@ -169,6 +182,7 @@ function displayConfiguredIndexersList(indexers) {
|
|||||||
indexersTable.find("table").dataTable(
|
indexersTable.find("table").dataTable(
|
||||||
{
|
{
|
||||||
"stateSave": true,
|
"stateSave": true,
|
||||||
|
"stateDuration": 0,
|
||||||
"pageLength": -1,
|
"pageLength": -1,
|
||||||
"lengthMenu": [[10, 20, 50, 100, 250, 500, -1], [10, 20, 50, 100, 250, 500, "All"]],
|
"lengthMenu": [[10, 20, 50, 100, 250, 500, -1], [10, 20, 50, 100, 250, 500, "All"]],
|
||||||
"order": [[0, "asc"]],
|
"order": [[0, "asc"]],
|
||||||
@@ -228,9 +242,9 @@ function displayUnconfiguredIndexersList() {
|
|||||||
}).fail(function (data) {
|
}).fail(function (data) {
|
||||||
if(data.responseJSON.error !== undefined) {
|
if(data.responseJSON.error !== undefined) {
|
||||||
var indexEnd = 2048 - "https://github.com/Jackett/Jackett/issues/new?title=[".length - indexerId.length - "] ".length - " (Config)".length; // keep url <= 2k #5104
|
var indexEnd = 2048 - "https://github.com/Jackett/Jackett/issues/new?title=[".length - indexerId.length - "] ".length - " (Config)".length; // keep url <= 2k #5104
|
||||||
doNotify("An error occured while configuring this indexer<br /><b>" + data.responseJSON.error.substring(0, indexEnd) + "</b><br /><i><a href=\"https://github.com/Jackett/Jackett/issues/new?title=[" + indexerId + "] " + data.responseJSON.error.substring(0, indexEnd) + " (Config)\" target=\"_blank\">Click here to open an issue on GitHub for this indexer.</a><i>", "danger", "glyphicon glyphicon-alert", false);
|
doNotify("An error occurred while configuring this indexer<br /><b>" + data.responseJSON.error.substring(0, indexEnd) + "</b><br /><i><a href=\"https://github.com/Jackett/Jackett/issues/new?title=[" + indexerId + "] " + data.responseJSON.error.substring(0, indexEnd) + " (Config)\" target=\"_blank\">Click here to open an issue on GitHub for this indexer.</a><i>", "danger", "glyphicon glyphicon-alert", false);
|
||||||
} else {
|
} else {
|
||||||
doNotify("An error occured while configuring this indexer, is Jackett server running ?", "danger", "glyphicon glyphicon-alert");
|
doNotify("An error occurred while configuring this indexer, is Jackett server running ?", "danger", "glyphicon glyphicon-alert");
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
@@ -240,6 +254,7 @@ function displayUnconfiguredIndexersList() {
|
|||||||
indexersTable.find("table").DataTable(
|
indexersTable.find("table").DataTable(
|
||||||
{
|
{
|
||||||
"stateSave": true,
|
"stateSave": true,
|
||||||
|
"stateDuration": 0,
|
||||||
"fnStateSaveParams": function (oSettings, sValue) {
|
"fnStateSaveParams": function (oSettings, sValue) {
|
||||||
sValue.search.search = ""; // don't save the search filter content
|
sValue.search.search = ""; // don't save the search filter content
|
||||||
return sValue;
|
return sValue;
|
||||||
@@ -608,6 +623,11 @@ function getConfigModalJson(configForm) {
|
|||||||
case "inputbool":
|
case "inputbool":
|
||||||
itemEntry.value = $el.find(".setup-item-inputbool input").is(":checked");
|
itemEntry.value = $el.find(".setup-item-inputbool input").is(":checked");
|
||||||
break;
|
break;
|
||||||
|
case "inputcheckbox":
|
||||||
|
itemEntry.values = [];
|
||||||
|
$el.find(".setup-item-inputcheckbox input:checked").each(function () {
|
||||||
|
itemEntry.values.push($(this).val());
|
||||||
|
});
|
||||||
case "inputselect":
|
case "inputselect":
|
||||||
itemEntry.value = $el.find(".setup-item-inputselect select").val();
|
itemEntry.value = $el.find(".setup-item-inputselect select").val();
|
||||||
break;
|
break;
|
||||||
@@ -762,7 +782,7 @@ function updateReleasesRow(row)
|
|||||||
}
|
}
|
||||||
|
|
||||||
function showSearch(selectedIndexer, query, category) {
|
function showSearch(selectedIndexer, query, category) {
|
||||||
var selectedIndexers = []
|
var selectedIndexers = [];
|
||||||
if (selectedIndexer)
|
if (selectedIndexer)
|
||||||
selectedIndexers = selectedIndexer.split(",");
|
selectedIndexers = selectedIndexer.split(",");
|
||||||
$('#select-indexer-modal').remove();
|
$('#select-indexer-modal').remove();
|
||||||
@@ -829,7 +849,11 @@ function showSearch(selectedIndexer, query, category) {
|
|||||||
Tracker: releaseDialog.find('#searchTracker').val()
|
Tracker: releaseDialog.find('#searchTracker').val()
|
||||||
};
|
};
|
||||||
|
|
||||||
window.location.hash = $.param({ search: queryObj.Query, tracker: queryObj.Tracker.join(","), category: queryObj.Category.join(",") });
|
window.location.hash = Object.entries({
|
||||||
|
search: encodeURIComponent(queryObj.Query).replace(/%20/g,'+'),
|
||||||
|
tracker: queryObj.Tracker.join(","),
|
||||||
|
category: queryObj.Category.join(",")
|
||||||
|
}).map(([k, v], i) => k + '=' + v).join('&');
|
||||||
|
|
||||||
$('#jackett-search-perform').html($('#spinner').html());
|
$('#jackett-search-perform').html($('#spinner').html());
|
||||||
$('#searchResults div.dataTables_filter input').val("");
|
$('#searchResults div.dataTables_filter input').val("");
|
||||||
@@ -877,7 +901,7 @@ function showSearch(selectedIndexer, query, category) {
|
|||||||
enableCaseInsensitiveFiltering: true,
|
enableCaseInsensitiveFiltering: true,
|
||||||
nonSelectedText: 'All'
|
nonSelectedText: 'All'
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
if (category !== undefined) {
|
if (category !== undefined) {
|
||||||
searchCategory.val(category.split(","));
|
searchCategory.val(category.split(","));
|
||||||
@@ -933,6 +957,7 @@ function updateSearchResultTable(element, results) {
|
|||||||
|
|
||||||
"dom": "lfr<\"dataTables_deadfilter\">tip",
|
"dom": "lfr<\"dataTables_deadfilter\">tip",
|
||||||
"stateSave": true,
|
"stateSave": true,
|
||||||
|
"stateDuration": 0,
|
||||||
"bAutoWidth": false,
|
"bAutoWidth": false,
|
||||||
"pageLength": 20,
|
"pageLength": 20,
|
||||||
"lengthMenu": [[10, 20, 50, 100, 250, 500, -1], [10, 20, 50, 100, 250, 500, "All"]],
|
"lengthMenu": [[10, 20, 50, 100, 250, 500, -1], [10, 20, 50, 100, 250, 500, "All"]],
|
||||||
@@ -1060,6 +1085,7 @@ function bindUIButtons() {
|
|||||||
table.DataTable(
|
table.DataTable(
|
||||||
{
|
{
|
||||||
"stateSave": true,
|
"stateSave": true,
|
||||||
|
"stateDuration": 0,
|
||||||
"bAutoWidth": false,
|
"bAutoWidth": false,
|
||||||
"pageLength": 20,
|
"pageLength": 20,
|
||||||
"lengthMenu": [[10, 20, 50, -1], [10, 20, 50, "All"]],
|
"lengthMenu": [[10, 20, 50, -1], [10, 20, 50, "All"]],
|
||||||
@@ -1155,8 +1181,8 @@ function bindUIButtons() {
|
|||||||
var jackett_port = Number($("#jackett-port").val());
|
var jackett_port = Number($("#jackett-port").val());
|
||||||
var jackett_basepathoverride = $("#jackett-basepathoverride").val();
|
var jackett_basepathoverride = $("#jackett-basepathoverride").val();
|
||||||
var jackett_external = $("#jackett-allowext").is(':checked');
|
var jackett_external = $("#jackett-allowext").is(':checked');
|
||||||
var jackett_update = $("#jackett-allowupdate").is(':checked');
|
var jackett_update = $("#jackett-allowupdate").is(':checked');
|
||||||
var jackett_prerelease = $("#jackett-prerelease").is(':checked');
|
var jackett_prerelease = $("#jackett-prerelease").is(':checked');
|
||||||
var jackett_logging = $("#jackett-logging").is(':checked');
|
var jackett_logging = $("#jackett-logging").is(':checked');
|
||||||
var jackett_omdb_key = $("#jackett-omdbkey").val();
|
var jackett_omdb_key = $("#jackett-omdbkey").val();
|
||||||
var jackett_omdb_url = $("#jackett-omdburl").val();
|
var jackett_omdb_url = $("#jackett-omdburl").val();
|
||||||
|
|||||||
@@ -175,6 +175,12 @@ hr {
|
|||||||
border-bottom: 1px solid #ddd;
|
border-bottom: 1px solid #ddd;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.jackettlog-narrowcol {
|
||||||
|
width: 1px;
|
||||||
|
white-space: nowrap;
|
||||||
|
vertical-align: top;
|
||||||
|
}
|
||||||
|
|
||||||
.jackettlogWarn {
|
.jackettlogWarn {
|
||||||
background-color: #FFFF8E !important;
|
background-color: #FFFF8E !important;
|
||||||
}
|
}
|
||||||
@@ -202,11 +208,15 @@ pre {
|
|||||||
font-size: 13px;
|
font-size: 13px;
|
||||||
line-height: 1.42857143;
|
line-height: 1.42857143;
|
||||||
color: #333;
|
color: #333;
|
||||||
word-break: break-all;
|
|
||||||
word-wrap: break-word;
|
|
||||||
background-color: transparent;
|
background-color: transparent;
|
||||||
border: 0;
|
border: 0;
|
||||||
border-radius: 0;
|
border-radius: 0;
|
||||||
|
word-break: normal;
|
||||||
|
white-space: pre-wrap; /* Since CSS 2.1 */
|
||||||
|
white-space: -moz-pre-wrap; /* Mozilla, since 1999 */
|
||||||
|
white-space: -pre-wrap; /* Opera 4-6 */
|
||||||
|
white-space: -o-pre-wrap; /* Opera 7 */
|
||||||
|
word-wrap: break-word; /* Internet Explorer 5.5+ */
|
||||||
}
|
}
|
||||||
|
|
||||||
.modal-open .modal {
|
.modal-open .modal {
|
||||||
@@ -276,7 +286,7 @@ table td.fit{
|
|||||||
|
|
||||||
.tooltip-inner img {
|
.tooltip-inner img {
|
||||||
max-width: 250px;
|
max-width: 250px;
|
||||||
height: auto;
|
height: auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
.type-public {
|
.type-public {
|
||||||
|
|||||||
Binary file not shown.
|
Before Width: | Height: | Size: 361 KiB After Width: | Height: | Size: 101 KiB |
@@ -1,4 +1,4 @@
|
|||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
|
|
||||||
<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
|
<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
|
||||||
<head>
|
<head>
|
||||||
@@ -34,8 +34,8 @@
|
|||||||
|
|
||||||
<link rel="stylesheet" type="text/css" href="../bootstrap/bootstrap.min.css?changed=2017083001">
|
<link rel="stylesheet" type="text/css" href="../bootstrap/bootstrap.min.css?changed=2017083001">
|
||||||
<link rel="stylesheet" type="text/css" href="../animate.css?changed=2017083001">
|
<link rel="stylesheet" type="text/css" href="../animate.css?changed=2017083001">
|
||||||
<link rel="stylesheet" type="text/css" href="../custom.css?changed=20200102" media="only screen and (min-device-width: 480px)">
|
<link rel="stylesheet" type="text/css" href="../custom.css?changed=20200223" media="only screen and (min-device-width: 480px)">
|
||||||
<link rel="stylesheet" type="text/css" href="../custom_mobile.css?changed=20200102" media="only screen and (max-device-width: 480px)">
|
<link rel="stylesheet" type="text/css" href="../custom_mobile.css?changed=20200223" media="only screen and (max-device-width: 480px)">
|
||||||
<link rel="stylesheet" type="text/css" href="../css/jquery.dataTables.min.css?changed=2017083001">
|
<link rel="stylesheet" type="text/css" href="../css/jquery.dataTables.min.css?changed=2017083001">
|
||||||
<link rel="stylesheet" type="text/css" href="../css/bootstrap-multiselect.css?changed=2017083001" />
|
<link rel="stylesheet" type="text/css" href="../css/bootstrap-multiselect.css?changed=2017083001" />
|
||||||
<link rel="stylesheet" type="text/css" href="../css/font-awesome.min.css?changed=2017083001">
|
<link rel="stylesheet" type="text/css" href="../css/font-awesome.min.css?changed=2017083001">
|
||||||
@@ -52,11 +52,11 @@
|
|||||||
</div>
|
</div>
|
||||||
<hr />
|
<hr />
|
||||||
|
|
||||||
<div id="can-upgrade-from-mono" hidden class="alert alert-info" role="alert">
|
<div id="can-upgrade-from-mono" hidden class="alert alert-info" role="alert">
|
||||||
<strong>Standalone version of Jackett is now available - Mono not required</strong> <br>
|
<strong>Standalone version of Jackett is now available - Mono not required</strong> <br>
|
||||||
To upgrade to the standalone version of Jackett, <a href="https://github.com/Jackett/Jackett#install-on-linux-amdx64" target="_blank" class="alert-link">click here</a> for install instructions.
|
To upgrade to the standalone version of Jackett, <a href="https://github.com/Jackett/Jackett#install-on-linux-amdx64" target="_blank" class="alert-link">click here</a> for install instructions.
|
||||||
Upgrading is straight forward, simply install the standalone version and your indexers/configuration will carry over.
|
Upgrading is straight forward, simply install the standalone version and your indexers/configuration will carry over.
|
||||||
Benefits include: increased performance, improved stability and no dependency on Mono.
|
Benefits include: increased performance, improved stability and no dependency on Mono.
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="pull-right">
|
<div class="pull-right">
|
||||||
@@ -235,6 +235,19 @@
|
|||||||
{{/if}}
|
{{/if}}
|
||||||
</div>
|
</div>
|
||||||
</script>
|
</script>
|
||||||
|
<script id="setup-item-inputcheckbox" type="text/x-handlebars-template">
|
||||||
|
<div class="setup-item-inputcheckbox">
|
||||||
|
{{#each options}}
|
||||||
|
<div class="checkbox"><label>
|
||||||
|
{{#if_in @key ../values}}
|
||||||
|
<input type="checkbox" data-id="{{../../id}}" class="form-control" value="{{@key}}" checked />
|
||||||
|
{{else}}
|
||||||
|
<input type="checkbox" data-id="{{../../id}}" class="form-control" value="{{@key}}" />
|
||||||
|
{{/if_in}}
|
||||||
|
{{this}}</label></div>
|
||||||
|
{{/each}}
|
||||||
|
</div>
|
||||||
|
</script>
|
||||||
<script id="setup-item-inputselect" type="text/x-handlebars-template">
|
<script id="setup-item-inputselect" type="text/x-handlebars-template">
|
||||||
<div class="setup-item-inputselect">
|
<div class="setup-item-inputselect">
|
||||||
<select class="form-control" data-id="{{id}}">
|
<select class="form-control" data-id="{{id}}">
|
||||||
@@ -603,16 +616,16 @@
|
|||||||
<table class="dataTable compact cell-border hover stripe">
|
<table class="dataTable compact cell-border hover stripe">
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
<th style="width: 200px">When</th>
|
<th>Date</th>
|
||||||
<th style="width: 80px">Level</th>
|
<th>Level</th>
|
||||||
<th>Message</th>
|
<th>Message</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
{{#each logs}}
|
{{#each logs}}
|
||||||
<tr class="jackettlog{{Level}}">
|
<tr class="jackettlog{{Level}}">
|
||||||
<td>{{dateFormat When}}</td>
|
<td class="jackettlog-narrowcol">{{dateFormat When}}</td>
|
||||||
<td>{{Level}}</td>
|
<td class="jackettlog-narrowcol">{{Level}}</td>
|
||||||
<td><pre>{{Message}}</pre></td>
|
<td><pre>{{Message}}</pre></td>
|
||||||
</tr>
|
</tr>
|
||||||
{{/each}}
|
{{/each}}
|
||||||
@@ -678,6 +691,6 @@
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<script type="text/javascript" src="../libs/api.js?changed=2017083001"></script>
|
<script type="text/javascript" src="../libs/api.js?changed=2017083001"></script>
|
||||||
<script type="text/javascript" src="../custom.js?changed=20200102"></script>
|
<script type="text/javascript" src="../custom.js?changed=20200316"></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
@@ -86,4 +86,4 @@ var api = {
|
|||||||
success: callback
|
success: callback
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
Handlebars.registerHelper('ifCond', function (v1, v2, options) {
|
Handlebars.registerHelper('ifCond', function (v1, v2, options) {
|
||||||
if(v1 === v2) {
|
if(v1 === v2) {
|
||||||
return options.fn(this);
|
return options.fn(this);
|
||||||
}
|
}
|
||||||
return options.inverse(this);
|
return options.inverse(this);
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
|
|
||||||
Handlebars.registerHelper('dateFormat', function (context, block) {
|
Handlebars.registerHelper('dateFormat', function (context, block) {
|
||||||
if (window.moment) {
|
if (window.moment) {
|
||||||
var f = block.hash.format || "MMM DD, YYYY hh:mm:ss A";
|
var f = block.hash.format || "YYYY-MM-DD HH:mm:ss";
|
||||||
return moment(context).format(f); //had to remove Date(context)
|
return moment(context).format(f); //had to remove Date(context)
|
||||||
} else {
|
} else {
|
||||||
return context; // moment plugin not available. return data as is.
|
return context; // moment plugin not available. return data as is.
|
||||||
};
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
Handlebars.registerHelper('jacketTimespan', function (context, block) {
|
Handlebars.registerHelper('jacketTimespan', function (context, block) {
|
||||||
@@ -22,7 +22,7 @@ Handlebars.registerHelper('jacketTimespan', function (context, block) {
|
|||||||
if (hours < 48) {
|
if (hours < 48) {
|
||||||
return Math.round(hours) + 'h ago';
|
return Math.round(hours) + 'h ago';
|
||||||
}
|
}
|
||||||
|
|
||||||
var days = timeSpan.asDays();
|
var days = timeSpan.asDays();
|
||||||
if (days < 365) {
|
if (days < 365) {
|
||||||
return Math.round(days) + 'd ago';
|
return Math.round(days) + 'd ago';
|
||||||
@@ -34,4 +34,4 @@ Handlebars.registerHelper('jacketTimespan', function (context, block) {
|
|||||||
|
|
||||||
Handlebars.registerHelper('jacketSize', function (context, block) {
|
Handlebars.registerHelper('jacketSize', function (context, block) {
|
||||||
return filesize(context, { round: 1 });
|
return filesize(context, { round: 1 });
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
|
|
||||||
<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
|
<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
|
||||||
<head>
|
<head>
|
||||||
@@ -16,7 +16,7 @@
|
|||||||
|
|
||||||
<link href="../bootstrap/bootstrap.min.css" rel="stylesheet">
|
<link href="../bootstrap/bootstrap.min.css" rel="stylesheet">
|
||||||
<link href="../animate.css" rel="stylesheet">
|
<link href="../animate.css" rel="stylesheet">
|
||||||
<link href="../custom.css" rel="stylesheet">
|
<link href="../custom.css?changed=20200223" rel="stylesheet">
|
||||||
|
|
||||||
<title>Jackett</title>
|
<title>Jackett</title>
|
||||||
</head>
|
</head>
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
---
|
---
|
||||||
site: 0daykiev
|
site: 0daykiev
|
||||||
name: 0day.kiev
|
name: 0day.kiev
|
||||||
description: "0day.kiev.ua is a RUSSIAN Private Torrent Tracker for MOVIES / TV / GENERAL"
|
description: "0day.kiev.ua is a RUSSIAN Private Torrent Tracker for MOVIES / TV / GENERAL"
|
||||||
|
|||||||
@@ -5,6 +5,7 @@
|
|||||||
language: en-us
|
language: en-us
|
||||||
type: public
|
type: public
|
||||||
encoding: UTF-8
|
encoding: UTF-8
|
||||||
|
followredirect: true
|
||||||
links:
|
links:
|
||||||
- https://1337x.to/
|
- https://1337x.to/
|
||||||
- https://1337x.gd/
|
- https://1337x.gd/
|
||||||
@@ -13,6 +14,8 @@
|
|||||||
- https://x1337x.ws/
|
- https://x1337x.ws/
|
||||||
- https://x1337x.eu/
|
- https://x1337x.eu/
|
||||||
- https://x1337x.se/
|
- https://x1337x.se/
|
||||||
|
- https://1337x.unblockit.pro/
|
||||||
|
legacylinks:
|
||||||
- https://1337x.unblocked.earth/
|
- https://1337x.unblocked.earth/
|
||||||
|
|
||||||
caps:
|
caps:
|
||||||
@@ -44,12 +47,12 @@
|
|||||||
- {id: 3, cat: Movies, desc: "Movies/SVCD/VCD"}
|
- {id: 3, cat: Movies, desc: "Movies/SVCD/VCD"}
|
||||||
- {id: 4, cat: Movies/Foreign, desc: "Movies/Dubs/Dual Audio"}
|
- {id: 4, cat: Movies/Foreign, desc: "Movies/Dubs/Dual Audio"}
|
||||||
- {id: 42, cat: Movies/HD, desc: "Movies/HD"}
|
- {id: 42, cat: Movies/HD, desc: "Movies/HD"}
|
||||||
- {id: 54, cat: Movies, desc: "Movies/h.264/x264"}
|
- {id: 54, cat: Movies/HD, desc: "Movies/h.264/x264"}
|
||||||
- {id: 55, cat: Movies, desc: "Movies/Mp4"}
|
- {id: 55, cat: Movies, desc: "Movies/Mp4"}
|
||||||
- {id: 66, cat: Movies/3D, desc: "Movies/3D"}
|
- {id: 66, cat: Movies/3D, desc: "Movies/3D"}
|
||||||
- {id: 70, cat: Movies, desc: "Movies/HEVC/x265"}
|
- {id: 70, cat: Movies/HD, desc: "Movies/HEVC/x265"}
|
||||||
- {id: 73, cat: Movies, desc: "Movies/Bollywood"}
|
- {id: 73, cat: Movies, desc: "Movies/Bollywood"}
|
||||||
- {id: 76, cat: Movies, desc: "Movies/UHD"}
|
- {id: 76, cat: Movies/UHD, desc: "Movies/UHD"}
|
||||||
|
|
||||||
#TV
|
#TV
|
||||||
- {id: 5, cat: TV, desc: "TV/DVD"}
|
- {id: 5, cat: TV, desc: "TV/DVD"}
|
||||||
@@ -138,7 +141,7 @@
|
|||||||
"asc": "asc"
|
"asc": "asc"
|
||||||
|
|
||||||
download:
|
download:
|
||||||
# the .torrent url is on the on the details page
|
# the .torrent url is on the on the details page
|
||||||
selector: ul li a[href^="{{ .Config.downloadlink }}"]
|
selector: ul li a[href^="{{ .Config.downloadlink }}"]
|
||||||
attribute: href
|
attribute: href
|
||||||
|
|
||||||
@@ -148,7 +151,7 @@
|
|||||||
- path: "{{if or (.Query.Album) (.Query.Artist) (.Keywords) }}sort-search{{else}}cat/Movies{{end}}{{if or (.Query.Album) (.Query.Artist) }}/{{ or (.Query.Album) (.Query.Artist) }}{{else}}/{{ .Keywords }}{{end}}{{if or (.Query.Album) (.Query.Artist) (.Keywords) }}/{{else}}{{end}}{{ .Config.sort }}/{{ .Config.type }}/1/"
|
- path: "{{if or (.Query.Album) (.Query.Artist) (.Keywords) }}sort-search{{else}}cat/Movies{{end}}{{if or (.Query.Album) (.Query.Artist) }}/{{ or (.Query.Album) (.Query.Artist) }}{{else}}/{{ .Keywords }}{{end}}{{if or (.Query.Album) (.Query.Artist) (.Keywords) }}/{{else}}{{end}}{{ .Config.sort }}/{{ .Config.type }}/1/"
|
||||||
- path: "{{if or (.Query.Album) (.Query.Artist) (.Keywords) }}sort-search{{else}}cat/TV{{end}}{{if or (.Query.Album) (.Query.Artist) }}/{{ or (.Query.Album) (.Query.Artist) }}{{else}}/{{ .Keywords }}{{end}}{{if or (.Query.Album) (.Query.Artist) (.Keywords) }}/{{else}}{{end}}{{ .Config.sort }}/{{ .Config.type }}/{{if or (.Query.Album) (.Query.Artist) (.Keywords) }}2{{else}}1{{end}}/"
|
- path: "{{if or (.Query.Album) (.Query.Artist) (.Keywords) }}sort-search{{else}}cat/TV{{end}}{{if or (.Query.Album) (.Query.Artist) }}/{{ or (.Query.Album) (.Query.Artist) }}{{else}}/{{ .Keywords }}{{end}}{{if or (.Query.Album) (.Query.Artist) (.Keywords) }}/{{else}}{{end}}{{ .Config.sort }}/{{ .Config.type }}/{{if or (.Query.Album) (.Query.Artist) (.Keywords) }}2{{else}}1{{end}}/"
|
||||||
- path: "{{if or (.Query.Album) (.Query.Artist) (.Keywords) }}sort-search{{else}}cat/Music{{end}}{{if or (.Query.Album) (.Query.Artist) }}/{{ or (.Query.Album) (.Query.Artist) }}{{else}}/{{ .Keywords }}{{end}}{{if or (.Query.Album) (.Query.Artist) (.Keywords) }}/{{else}}{{end}}{{ .Config.sort }}/{{ .Config.type }}/{{if or (.Query.Album) (.Query.Artist) (.Keywords) }}3{{else}}1{{end}}/"
|
- path: "{{if or (.Query.Album) (.Query.Artist) (.Keywords) }}sort-search{{else}}cat/Music{{end}}{{if or (.Query.Album) (.Query.Artist) }}/{{ or (.Query.Album) (.Query.Artist) }}{{else}}/{{ .Keywords }}{{end}}{{if or (.Query.Album) (.Query.Artist) (.Keywords) }}/{{else}}{{end}}{{ .Config.sort }}/{{ .Config.type }}/{{if or (.Query.Album) (.Query.Artist) (.Keywords) }}3{{else}}1{{end}}/"
|
||||||
keywordsfilters:
|
keywordsfilters:
|
||||||
- name: replace # use this as a workaround till #893 is implemented
|
- name: replace # use this as a workaround till #893 is implemented
|
||||||
args: ["Greys Anatomy", "Grey's Anatomy"]
|
args: ["Greys Anatomy", "Grey's Anatomy"]
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
---
|
---
|
||||||
site: 2fast4you
|
site: 2fast4you
|
||||||
name: 2 Fast 4 You
|
name: 2 Fast 4 You
|
||||||
description: "2 Fast 4 You is a FRENCH Private site for TV / MOVIES / GENERAL"
|
description: "2 Fast 4 You is a FRENCH Private site for TV / MOVIES / GENERAL"
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
type: private
|
type: private
|
||||||
encoding: UTF-8
|
encoding: UTF-8
|
||||||
links:
|
links:
|
||||||
- http://www.3dtorrents.org/
|
- http://www.3dtorrents.org/ # site does not support https ERR_CONNECTION_CLOSED
|
||||||
|
|
||||||
caps:
|
caps:
|
||||||
categorymappings:
|
categorymappings:
|
||||||
@@ -60,7 +60,7 @@
|
|||||||
- selector: span.errormsg
|
- selector: span.errormsg
|
||||||
test:
|
test:
|
||||||
path: index.php
|
path: index.php
|
||||||
|
|
||||||
search:
|
search:
|
||||||
paths:
|
paths:
|
||||||
- path: index.php
|
- path: index.php
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
---
|
---
|
||||||
site: 3evils
|
site: 3evils
|
||||||
name: 3evils
|
name: 3evils
|
||||||
description: "3evils is a Private Torrent Tracker for MOVIES / TV / GENERAL"
|
description: "3evils is a Private Torrent Tracker for MOVIES / TV / GENERAL"
|
||||||
|
|||||||
@@ -22,7 +22,7 @@
|
|||||||
- {id: 408, cat: Audio, desc: "HQ Audio/无损音乐"}
|
- {id: 408, cat: Audio, desc: "HQ Audio/无损音乐"}
|
||||||
|
|
||||||
modes:
|
modes:
|
||||||
search: [q]
|
search: [q, imdbid]
|
||||||
tv-search: [q, season, ep, imdbid]
|
tv-search: [q, season, ep, imdbid]
|
||||||
movie-search: [q, imdbid]
|
movie-search: [q, imdbid]
|
||||||
|
|
||||||
@@ -103,7 +103,7 @@
|
|||||||
args: cat
|
args: cat
|
||||||
details:
|
details:
|
||||||
selector: a[href^="details.php?id="]
|
selector: a[href^="details.php?id="]
|
||||||
attribute: href
|
attribute: href
|
||||||
download:
|
download:
|
||||||
selector: a[href^="download.php?id="]
|
selector: a[href^="download.php?id="]
|
||||||
attribute: href
|
attribute: href
|
||||||
|
|||||||
@@ -20,7 +20,7 @@
|
|||||||
settings:
|
settings:
|
||||||
- name: info
|
- name: info
|
||||||
type: info
|
type: info
|
||||||
default: 7torrents does not use categories. In your software Indexer settings, set the category to 100001.
|
default: 7torrents does not use categories. In your software Indexer settings, set the category to 7000.
|
||||||
- name: sort
|
- name: sort
|
||||||
type: select
|
type: select
|
||||||
label: Sort requested from site
|
label: Sort requested from site
|
||||||
|
|||||||
100
src/Jackett.Common/Definitions/academictorrents.yml
Normal file
100
src/Jackett.Common/Definitions/academictorrents.yml
Normal file
@@ -0,0 +1,100 @@
|
|||||||
|
---
|
||||||
|
site: academictorrents
|
||||||
|
name: AcademicTorrents
|
||||||
|
description: "AcademicTorrents is a Public Community-Maintained Distributed Repository for datasets and scientific knowledge."
|
||||||
|
language: en-us
|
||||||
|
type: public
|
||||||
|
encoding: UTF-8
|
||||||
|
links:
|
||||||
|
- https://academictorrents.com/
|
||||||
|
|
||||||
|
caps:
|
||||||
|
categorymappings:
|
||||||
|
- {id: 5, cat: Books, desc: "Paper"}
|
||||||
|
- {id: 6, cat: Other, desc: "Dataset"}
|
||||||
|
- {id: 7, cat: TV/Documentary, desc: "Course"}
|
||||||
|
|
||||||
|
modes:
|
||||||
|
search: [q]
|
||||||
|
|
||||||
|
settings:
|
||||||
|
- name: sort
|
||||||
|
type: select
|
||||||
|
label: Sort requested from site
|
||||||
|
default: "added"
|
||||||
|
options:
|
||||||
|
"added": "created"
|
||||||
|
"seeders": "seeders"
|
||||||
|
"size": "size"
|
||||||
|
"name": "title"
|
||||||
|
- name: type
|
||||||
|
type: select
|
||||||
|
label: Order requested from site
|
||||||
|
default: "DESC"
|
||||||
|
options:
|
||||||
|
"DESC": "desc"
|
||||||
|
"ASC": "asc"
|
||||||
|
|
||||||
|
search:
|
||||||
|
# https://academictorrents.com/browse.php?search=&c5=1&c6=1&c7=1&sort_field=added&sort_dir=DESC
|
||||||
|
paths:
|
||||||
|
- path: browse.php
|
||||||
|
- path: browse.php
|
||||||
|
inputs:
|
||||||
|
page: 1
|
||||||
|
inputs:
|
||||||
|
$raw: "{{ range .Categories }}c{{.}}=1&{{end}}"
|
||||||
|
search: "{{ .Keywords }}"
|
||||||
|
sort_field: "{{ .Config.sort }}"
|
||||||
|
sort_dir: "{{ .Config.type }}"
|
||||||
|
|
||||||
|
rows:
|
||||||
|
selector: table.table> tbody > tr:has(a[href^="/browse.php?cat="])
|
||||||
|
filters:
|
||||||
|
- name: andmatch
|
||||||
|
|
||||||
|
fields:
|
||||||
|
category:
|
||||||
|
selector: a[href^="/browse.php?cat="]
|
||||||
|
attribute: href
|
||||||
|
filters:
|
||||||
|
- name: querystring
|
||||||
|
args: cat
|
||||||
|
title:
|
||||||
|
selector: a[href^="/details/"]
|
||||||
|
details:
|
||||||
|
selector: a[href^="/details/"]
|
||||||
|
attribute: href
|
||||||
|
download:
|
||||||
|
# /download/08078e0894099530913e9335bdbc804f42f6e872.torrent"
|
||||||
|
selector: a[href^="/details/"]
|
||||||
|
attribute: href
|
||||||
|
filters:
|
||||||
|
- name: replace
|
||||||
|
args: ["/details/", "/download/"]
|
||||||
|
- name: append
|
||||||
|
args: ".torrent"
|
||||||
|
date:
|
||||||
|
selector: td:nth-child(4)
|
||||||
|
filters:
|
||||||
|
- name: dateparse
|
||||||
|
args: "2006-01-02"
|
||||||
|
size:
|
||||||
|
selector: td:nth-child(5)
|
||||||
|
grabs:
|
||||||
|
selector: td:nth-child(6)
|
||||||
|
seeders:
|
||||||
|
text: 0
|
||||||
|
seeders:
|
||||||
|
selector: td:nth-child(7):not(:empty)
|
||||||
|
optional: true
|
||||||
|
filters:
|
||||||
|
- name: replace
|
||||||
|
args: ["+", ""]
|
||||||
|
leechers:
|
||||||
|
selector: td:nth-child(8)
|
||||||
|
downloadvolumefactor:
|
||||||
|
text: 0
|
||||||
|
uploadvolumefactor:
|
||||||
|
text: 1
|
||||||
|
# engine n/a
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
---
|
---
|
||||||
site: acidlounge
|
site: acidlounge
|
||||||
name: Acid-Lounge
|
name: Acid-Lounge
|
||||||
description: "Acid Lounge (A-L) is a Private Torrent Tracker for 0DAY / GENERAL"
|
description: "Acid Lounge (A-L) is a Private Torrent Tracker for 0DAY / GENERAL"
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
---
|
---
|
||||||
site: aftershock
|
site: aftershock
|
||||||
name: Aftershock
|
name: Aftershock
|
||||||
description: "Aftershock is a HUNGARIAN Private Torrent Tracker for MOVIES / GENERAL"
|
description: "Aftershock is a HUNGARIAN Private Torrent Tracker for MOVIES / GENERAL"
|
||||||
@@ -170,4 +170,4 @@
|
|||||||
case:
|
case:
|
||||||
span.icon_upload: 2
|
span.icon_upload: 2
|
||||||
"*": 1
|
"*": 1
|
||||||
# XBT v3
|
# XBT v3
|
||||||
|
|||||||
@@ -1,146 +0,0 @@
|
|||||||
---
|
|
||||||
site: alein
|
|
||||||
name: Alein
|
|
||||||
description: "Alein is a BULGARIAN Semi-Private Torrent Tracker for MOVIES / TV / GENERAL"
|
|
||||||
language: bg
|
|
||||||
type: semi-private
|
|
||||||
encoding: UTF-8
|
|
||||||
links:
|
|
||||||
- http://alein.org/
|
|
||||||
|
|
||||||
caps:
|
|
||||||
categorymappings:
|
|
||||||
- {id: 1, cat: Movies/SD, desc: "Movies-XviD"}
|
|
||||||
- {id: 15, cat: Movies/HD, desc: "Movies-x264"}
|
|
||||||
- {id: 41, cat: Movies, desc: "Movies-BG"}
|
|
||||||
- {id: 14, cat: Movies/HD, desc: "Movies-HD"}
|
|
||||||
- {id: 48, cat: Movies/UHD, desc: "Movies-x265"}
|
|
||||||
- {id: 39, cat: Movies/Foreign, desc: "Movies-XviD-Rus"}
|
|
||||||
- {id: 40, cat: Movies/Foreign, desc: "Movies-x264-Rus"}
|
|
||||||
- {id: 20, cat: Movies/Other, desc: "Movies-Animations"}
|
|
||||||
- {id: 16, cat: Movies/3D, desc: "Movies-3D"}
|
|
||||||
- {id: 5, cat: TV/Anime, desc: "Movies-Anime"}
|
|
||||||
- {id: 21, cat: Movies/BluRay, desc: "Movies-Blu-ray"}
|
|
||||||
- {id: 22, cat: TV/Documentary , desc: "Movies-Documentaries"}
|
|
||||||
- {id: 11, cat: Movies/DVD, desc: "Movies-DVD-R"}
|
|
||||||
- {id: 47, cat: TV/SD, desc: "TV-Episodes"}
|
|
||||||
- {id: 46, cat: TV/HD, desc: "TV-Episodes-HD"}
|
|
||||||
- {id: 3, cat: PC/ISO, desc: "Games-PC ISO"}
|
|
||||||
- {id: 31, cat: Console/Xbox, desc: "Games-XBOX"}
|
|
||||||
- {id: 33, cat: Console/PSP, desc: "Games-PS"}
|
|
||||||
- {id: 2, cat: Audio/MP3, desc: "Music-MP3"}
|
|
||||||
- {id: 50, cat: Audio/Lossless, desc: "Music-FLAC"}
|
|
||||||
- {id: 18, cat: Audio/Video, desc: "Music-Video"}
|
|
||||||
- {id: 9, cat: PC/0day, desc: "Software-Windows"}
|
|
||||||
- {id: 8, cat: PC, desc: "Software-Linux"}
|
|
||||||
- {id: 36, cat: Other, desc: "Trailer"}
|
|
||||||
- {id: 34, cat: Other/Misc, desc: "Pictures"}
|
|
||||||
- {id: 4, cat: Other, desc: "Other"}
|
|
||||||
- {id: 6, cat: Books/Comics, desc: "Books-Comics"}
|
|
||||||
- {id: 24, cat: PC/Phone-Other, desc: "Mobile-GSM"}
|
|
||||||
- {id: 23, cat: TV/Sport, desc: "Sport"}
|
|
||||||
|
|
||||||
modes:
|
|
||||||
search: [q]
|
|
||||||
tv-search: [q, season, ep]
|
|
||||||
movie-search: [q]
|
|
||||||
|
|
||||||
settings:
|
|
||||||
- name: username
|
|
||||||
type: text
|
|
||||||
label: Username
|
|
||||||
- name: password
|
|
||||||
type: password
|
|
||||||
label: Password
|
|
||||||
- name: sort
|
|
||||||
type: select
|
|
||||||
label: Sort requested from site
|
|
||||||
default: "3"
|
|
||||||
options:
|
|
||||||
"3": "created"
|
|
||||||
"5": "seeders"
|
|
||||||
"4": "size"
|
|
||||||
"2": "title"
|
|
||||||
- name: type
|
|
||||||
type: select
|
|
||||||
label: Order requested from site
|
|
||||||
default: "2"
|
|
||||||
options:
|
|
||||||
"2": "desc"
|
|
||||||
"1": "asc"
|
|
||||||
|
|
||||||
login:
|
|
||||||
path: index.php?page=login
|
|
||||||
method: form
|
|
||||||
form: form[action*="/index.php?page=login"]
|
|
||||||
inputs:
|
|
||||||
uid: "{{ .Config.username }}"
|
|
||||||
pwd: "{{ .Config.password }}"
|
|
||||||
error:
|
|
||||||
- selector: td.lista span[style="color:#FF0000;"]
|
|
||||||
test:
|
|
||||||
path: /
|
|
||||||
selector: a[href="logout.php"]
|
|
||||||
|
|
||||||
search:
|
|
||||||
paths:
|
|
||||||
# http://alein.org/index.php?page=torrents&category=1;15;41;14;48;39;20;16;5;21;22;11&search=venom&active=1
|
|
||||||
- path: index.php
|
|
||||||
inputs:
|
|
||||||
page: torrents
|
|
||||||
category: "{{ range .Categories }}{{.}};{{end}}"
|
|
||||||
search: "{{ .Keywords }}"
|
|
||||||
# 0 all 1 active only 2 dead only
|
|
||||||
active: 0
|
|
||||||
order: "{{ .Config.sort }}"
|
|
||||||
by: "{{ .Config.type }}"
|
|
||||||
|
|
||||||
rows:
|
|
||||||
selector: tr.trclass:not(:has(td.lista-cat-rec))
|
|
||||||
|
|
||||||
fields:
|
|
||||||
title:
|
|
||||||
selector: td a[href*="id="]
|
|
||||||
details:
|
|
||||||
selector: td a[href*="id="]
|
|
||||||
attribute: href
|
|
||||||
category:
|
|
||||||
selector: td a[href*="category="]
|
|
||||||
attribute: href
|
|
||||||
filters:
|
|
||||||
- name: querystring
|
|
||||||
args: category
|
|
||||||
download:
|
|
||||||
selector: td a[href*="id="]
|
|
||||||
attribute: href
|
|
||||||
filters:
|
|
||||||
- name: querystring
|
|
||||||
args: id
|
|
||||||
- name: prepend
|
|
||||||
args: "download.php?id="
|
|
||||||
- name: append
|
|
||||||
args: "&f={{ .Result.title }}.torrent"
|
|
||||||
banner:
|
|
||||||
selector: td a[href*="id="]
|
|
||||||
attribute: onmouseover
|
|
||||||
filters:
|
|
||||||
- name: regexp
|
|
||||||
args: "src=(.+?) width="
|
|
||||||
size:
|
|
||||||
selector: td:nth-child(6)
|
|
||||||
seeders:
|
|
||||||
selector: td:nth-child(7)
|
|
||||||
leechers:
|
|
||||||
selector: td:nth-child(8)
|
|
||||||
grabs:
|
|
||||||
selector: td:nth-child(9)
|
|
||||||
date:
|
|
||||||
selector: td:nth-child(5)
|
|
||||||
filters:
|
|
||||||
- name: dateparse
|
|
||||||
args: "02/01/2006"
|
|
||||||
downloadvolumefactor:
|
|
||||||
text: 0
|
|
||||||
uploadvolumefactor:
|
|
||||||
text: 1
|
|
||||||
# xbtit 2.3
|
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
---
|
---
|
||||||
site: alexfilm
|
site: alexfilm
|
||||||
name: AlexFilm
|
name: AlexFilm
|
||||||
description: "AlexFilm is a RUSSIAN Semi-Private Torrent Tracker for TV"
|
description: "AlexFilm is a RUSSIAN Semi-Private Torrent Tracker for TV"
|
||||||
|
|||||||
@@ -158,8 +158,10 @@
|
|||||||
keywordsfilters:
|
keywordsfilters:
|
||||||
- name: re_replace
|
- name: re_replace
|
||||||
args: ["([12][0-9]{3})", ""]
|
args: ["([12][0-9]{3})", ""]
|
||||||
|
|
||||||
rows:
|
rows:
|
||||||
selector: div#fancy-list-group ul.list-group li.list-group-item
|
selector: div#fancy-list-group ul.list-group li.list-group-item
|
||||||
|
|
||||||
fields:
|
fields:
|
||||||
_quality:
|
_quality:
|
||||||
selector: div.list-group-item-content p.m-0 span.badge-primary:contains("1080p"), div.list-group-item-content p.m-0 span.badge-primary:contains("720p"), div.list-group-item-content p.m-0 span.badge-primary:contains("4k")
|
selector: div.list-group-item-content p.m-0 span.badge-primary:contains("1080p"), div.list-group-item-content p.m-0 span.badge-primary:contains("720p"), div.list-group-item-content p.m-0 span.badge-primary:contains("4k")
|
||||||
@@ -196,69 +198,70 @@
|
|||||||
attribute: src
|
attribute: src
|
||||||
case:
|
case:
|
||||||
# unfortunately the site does not have category numbers on the results page, just a .png which can apply to both movies and tv.
|
# unfortunately the site does not have category numbers on the results page, just a .png which can apply to both movies and tv.
|
||||||
# therefore I've order the list to favour movies,
|
# therefore I've order the list to favour movies,
|
||||||
# also, not all .png have been verified as the site has many empty categories. their image names have been extrapolated from the cat desc.
|
# also, not all .png have been verified as the site has many empty categories. their image names have been extrapolated from the cat desc.
|
||||||
"[src$=\"/XXXZ.png\"]": "74"
|
"[src$=\"/XXXZ.png\"]": 74
|
||||||
"[src$=\"/Hentai.png\"]": "75"
|
"[src$=\"/Hentai.png\"]": 75
|
||||||
"[src$=\"/Anime.png\"]": "69"
|
"[src$=\"/Anime.png\"]": 69
|
||||||
"[src$=\"/Windows.png\"]": "21"
|
"[src$=\"/Windows.png\"]": 21
|
||||||
"[src$=\"/Mac.png\"]": "22"
|
"[src$=\"/Mac.png\"]": 22
|
||||||
"[src$=\"/Android.png\"]": "23"
|
"[src$=\"/Android.png\"]": 23
|
||||||
"[src$=\"/Linux.png\"]": "25"
|
"[src$=\"/Linux.png\"]": 25
|
||||||
"[src$=\"/iPhone.png\"]": "26"
|
"[src$=\"/iPhone.png\"]": 26
|
||||||
"[src$=\"/iPad.png\"]": "27"
|
"[src$=\"/iPad.png\"]": 27
|
||||||
"[src$=\"/iPod.png\"]": "28"
|
"[src$=\"/iPod.png\"]": 28
|
||||||
"[src$=\"/Cursos.png\"]": "71"
|
"[src$=\"/Cursos.png\"]": 71
|
||||||
"[src$=\"/Apostila.png\"]": "72"
|
"[src$=\"/Apostila.png\"]": 72
|
||||||
"[src$=\"/E-books.png\"]": "67"
|
"[src$=\"/E-books.png\"]": 67
|
||||||
"[src$=\"/Revista.png\"]": "68"
|
"[src$=\"/Revista.png\"]": 68
|
||||||
"[src$=\"/HQ.png\"]": "112"
|
"[src$=\"/HQ.png\"]": 112
|
||||||
"[src$=\"/Filmes.png\"]": "119"
|
"[src$=\"/Filmes.png\"]": 119
|
||||||
"[src$=\"/Revistas-XXX.png\"]": "70"
|
"[src$=\"/Revistas-XXX.png\"]": 70
|
||||||
"[src$=\"/PS4.png\"]": "79"
|
"[src$=\"/PS4.png\"]": 79
|
||||||
"[src$=\"/Jogos-PC.png\"]": "47"
|
"[src$=\"/Jogos-PC.png\"]": 47
|
||||||
"[src$=\"/Emulador.png\"]": "61"
|
"[src$=\"/Emulador.png\"]": 61
|
||||||
"[src$=\"/Emulacao.png\"]": "109"
|
"[src$=\"/Emulacao.png\"]": 109
|
||||||
"[src$=\"/Jogos-Mac.png\"]": "48"
|
"[src$=\"/Jogos-Mac.png\"]": 48
|
||||||
"[src$=\"/Jogos-PS1.png\"]": "49"
|
"[src$=\"/Jogos-PS1.png\"]": 49
|
||||||
"[src$=\"/Jogos-PS2.png\"]": "50"
|
"[src$=\"/Jogos-PS2.png\"]": 50
|
||||||
"[src$=\"/Jogos-PS3.png\"]": "51"
|
"[src$=\"/Jogos-PS3.png\"]": 51
|
||||||
"[src$=\"/Jogos-Dreamcast.png\"]": "52"
|
"[src$=\"/Jogos-Dreamcast.png\"]": 52
|
||||||
"[src$=\"/Jogos-Xbox360.png\"]": "54"
|
"[src$=\"/Jogos-Xbox360.png\"]": 54
|
||||||
"[src$=\"/Jogos-Xbox.png\"]": "56"
|
"[src$=\"/Jogos-Xbox.png\"]": 56
|
||||||
"[src$=\"/Jogos-Wii.png\"]": "55"
|
"[src$=\"/Jogos-Wii.png\"]": 55
|
||||||
"[src$=\"/Jogos-DS.png\"]": "58"
|
"[src$=\"/Jogos-DS.png\"]": 58
|
||||||
"[src$=\"/jogosandroid.png\"]": "57"
|
"[src$=\"/jogosandroid.png\"]": 57
|
||||||
"[src$=\"/Jogos-PSP.png\"]": "82"
|
"[src$=\"/Jogos-PSP.png\"]": 82
|
||||||
"[src$=\"/Jogos-NS.png\"]": "110"
|
"[src$=\"/Jogos-NS.png\"]": 110
|
||||||
"[src$=\"/Jogos-XboxOne.png\"]": "78"
|
"[src$=\"/Jogos-XboxOne.png\"]": 78
|
||||||
"[src$=\"/Axe.png\"]": "29"
|
"[src$=\"/Axe.png\"]": 29
|
||||||
"[src$=\"/Funk.png\"]": "31"
|
"[src$=\"/Funk.png\"]": 31
|
||||||
"[src$=\"/Pagode.png\"]": "32"
|
"[src$=\"/Pagode.png\"]": 32
|
||||||
"[src$=\"/HIP_HOP.png\"]": "33"
|
"[src$=\"/HIP_HOP.png\"]": 33
|
||||||
"[src$=\"/Rap.png\"]": "34"
|
"[src$=\"/Rap.png\"]": 34
|
||||||
"[src$=\"/Rock.png\"]": "36"
|
"[src$=\"/Rock.png\"]": 36
|
||||||
"[src$=\"/Hard-Rock.png\"]": "37"
|
"[src$=\"/Hard-Rock.png\"]": 37
|
||||||
"[src$=\"/Blues.png\"]": "38"
|
"[src$=\"/Blues.png\"]": 38
|
||||||
"[src$=\"/Dance.png\"]": "39"
|
"[src$=\"/Dance.png\"]": 39
|
||||||
"[src$=\"/Discografia.png\"]": "40"
|
"[src$=\"/Discografia.png\"]": 40
|
||||||
"[src$=\"/Erudita.png\"]": "41"
|
"[src$=\"/Erudita.png\"]": 41
|
||||||
"[src$=\"/Forro.png\"]": "42"
|
"[src$=\"/Forro.png\"]": 42
|
||||||
"[src$=\"/Dubstep.png\"]": "43"
|
"[src$=\"/Dubstep.png\"]": 43
|
||||||
"[src$=\"/Sertanejo.png\"]": "46"
|
"[src$=\"/Sertanejo.png\"]": 46
|
||||||
"[src$=\"/Samba.png\"]": "45"
|
"[src$=\"/Samba.png\"]": 45
|
||||||
"[src$=\"/Musica-Outros.png\"]": "77"
|
"[src$=\"/Musica-Outros.png\"]": 77
|
||||||
"[src$=\"/Reggae.png\"]": "76"
|
"[src$=\"/Reggae.png\"]": 76
|
||||||
"[src$=\"/Gospel.png\"]": "83"
|
"[src$=\"/Gospel.png\"]": 83
|
||||||
"[src$=\"/POP.png\"]": "115"
|
"[src$=\"/POP.png\"]": 115
|
||||||
"[src$=\"/MPB.png\"]": "114"
|
"[src$=\"/MPB.png\"]": 114
|
||||||
"[src$=\"/OST.png\"]": "84"
|
"[src$=\"/OST.png\"]": 84
|
||||||
"[src$=\"/Seriados.png\"]": "120"
|
"[src$=\"/Seriados.png\"]": 120
|
||||||
"[src$=\"/Shows.png\"]": "65"
|
"[src$=\"/Shows.png\"]": 65
|
||||||
"[src$=\"/Aberta.png\"]": "63"
|
"[src$=\"/Aberta.png\"]": 63
|
||||||
"[src$=\"/Esporte.png\"]": "62"
|
"[src$=\"/Esporte.png\"]": 62
|
||||||
"[src$=\"/Fechada.png\"]": "64"
|
"[src$=\"/Fechada.png\"]": 64
|
||||||
"[src$=\"/Videoaula.png\"]": "73"
|
"[src$=\"/Videoaula.png\"]": 73
|
||||||
|
"*": 999
|
||||||
date:
|
date:
|
||||||
text: now
|
text: now
|
||||||
date:
|
date:
|
||||||
@@ -284,5 +287,5 @@
|
|||||||
"span.badge-success:contains(\"FREE\")": 0
|
"span.badge-success:contains(\"FREE\")": 0
|
||||||
"*": 1
|
"*": 1
|
||||||
uploadvolumefactor:
|
uploadvolumefactor:
|
||||||
case:
|
text: 1
|
||||||
"*": 1
|
# engine n/a
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
---
|
---
|
||||||
site: arabafenice
|
site: arabafenice
|
||||||
name: ArabaFenice
|
name: ArabaFenice
|
||||||
description: "Araba Fenice (Phoenix) is an ITALIAN Private site for TV / MOVIES / GENERAL"
|
description: "Araba Fenice (Phoenix) is an ITALIAN Private site for TV / MOVIES / GENERAL"
|
||||||
@@ -14,7 +14,7 @@
|
|||||||
categorymappings:
|
categorymappings:
|
||||||
# HRS
|
# HRS
|
||||||
- {id: 34, cat: Movies/HD, desc: "1080p HRS x264"}
|
- {id: 34, cat: Movies/HD, desc: "1080p HRS x264"}
|
||||||
- {id: 47, cat: Movies/HD, desc: "2160p 4k UltraHD HRS"}
|
- {id: 47, cat: Movies/UHD, desc: "2160p 4k UltraHD HRS"}
|
||||||
- {id: 35, cat: TV, desc: "Serie TV HRS"}
|
- {id: 35, cat: TV, desc: "Serie TV HRS"}
|
||||||
- {id: 36, cat: Movies/SD, desc: "DVDRip HRS"}
|
- {id: 36, cat: Movies/SD, desc: "DVDRip HRS"}
|
||||||
- {id: 41, cat: Movies/SD, desc: "BDRip 576p HRS"}
|
- {id: 41, cat: Movies/SD, desc: "BDRip 576p HRS"}
|
||||||
@@ -38,7 +38,7 @@
|
|||||||
- {id: 42, cat: TV, desc: "Serie Tv Sub Ita"}
|
- {id: 42, cat: TV, desc: "Serie Tv Sub Ita"}
|
||||||
- {id: 15, cat: TV/Documentary, desc: "documentaries"}
|
- {id: 15, cat: TV/Documentary, desc: "documentaries"}
|
||||||
- {id: 33, cat: TV, desc: "mp4"}
|
- {id: 33, cat: TV, desc: "mp4"}
|
||||||
- {id: 40, cat: TV/HD, desc: "2160p 4K UltraHD"}
|
- {id: 40, cat: TV/UHD, desc: "2160p 4K UltraHD"}
|
||||||
- {id: 38, cat: XXX, desc: "xXx"}
|
- {id: 38, cat: XXX, desc: "xXx"}
|
||||||
- {id: 43, cat: Other, desc: "Arabic for social"}
|
- {id: 43, cat: Other, desc: "Arabic for social"}
|
||||||
|
|
||||||
@@ -65,7 +65,7 @@
|
|||||||
- {id: 32, cat: PC/Phone-Android, desc: "Android APP"}
|
- {id: 32, cat: PC/Phone-Android, desc: "Android APP"}
|
||||||
|
|
||||||
modes:
|
modes:
|
||||||
search: [q]
|
search: [q, imdbid]
|
||||||
tv-search: [q, season, ep, imdbid]
|
tv-search: [q, season, ep, imdbid]
|
||||||
movie-search: [q, imdbid]
|
movie-search: [q, imdbid]
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
---
|
---
|
||||||
site: arenabg
|
site: arenabg
|
||||||
name: ArenaBG
|
name: ArenaBG
|
||||||
description: "ArenaBG is a BULGARIAN Semi-Private Torrent Tracker for 0DAY / GENERAL"
|
description: "ArenaBG is a BULGARIAN Semi-Private Torrent Tracker for 0DAY / GENERAL"
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
---
|
---
|
||||||
site: asgaard
|
site: asgaard
|
||||||
name: Asgaard
|
name: Asgaard
|
||||||
description: "Asgaard (AG) is a NORDIC Private Torrent Tracker for MOVIES / TV / GENERAL"
|
description: "Asgaard (AG) is a NORDIC Private Torrent Tracker for MOVIES / TV / GENERAL"
|
||||||
@@ -57,7 +57,7 @@
|
|||||||
- {id: 43, cat: Books/Technical, desc: "Books Education"}
|
- {id: 43, cat: Books/Technical, desc: "Books Education"}
|
||||||
|
|
||||||
modes:
|
modes:
|
||||||
search: [q]
|
search: [q, imdbid]
|
||||||
tv-search: [q, season, ep, imdbid]
|
tv-search: [q, season, ep, imdbid]
|
||||||
movie-search: [q, imdbid]
|
movie-search: [q, imdbid]
|
||||||
|
|
||||||
@@ -104,7 +104,7 @@
|
|||||||
test:
|
test:
|
||||||
path: /
|
path: /
|
||||||
selector: a[href$="/logout.php"]
|
selector: a[href$="/logout.php"]
|
||||||
|
|
||||||
search:
|
search:
|
||||||
paths:
|
paths:
|
||||||
# https://asgrd.org/browse.php?sns=&sna=&spf=&sr=&sg=&sys=&sye=&srs=&sre=&si=tt2401090&ss=&incldead=0&only_free=0&sort=4&type=desc
|
# https://asgrd.org/browse.php?sns=&sna=&spf=&sr=&sg=&sys=&sye=&srs=&sre=&si=tt2401090&ss=&incldead=0&only_free=0&sort=4&type=desc
|
||||||
@@ -178,6 +178,5 @@
|
|||||||
img[src="./images/gold.png"]: 0
|
img[src="./images/gold.png"]: 0
|
||||||
"*": 1
|
"*": 1
|
||||||
uploadvolumefactor:
|
uploadvolumefactor:
|
||||||
case:
|
text: 1
|
||||||
"*": 1
|
|
||||||
# Midgaard
|
# Midgaard
|
||||||
|
|||||||
@@ -15,7 +15,7 @@
|
|||||||
- {id: 3, cat: Audio, desc: "Music"}
|
- {id: 3, cat: Audio, desc: "Music"}
|
||||||
|
|
||||||
modes:
|
modes:
|
||||||
search: [q]
|
search: [q, imdbid]
|
||||||
tv-search: [q, season, ep, imdbid]
|
tv-search: [q, season, ep, imdbid]
|
||||||
movie-search: [q, imdbid]
|
movie-search: [q, imdbid]
|
||||||
|
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
type: public
|
type: public
|
||||||
encoding: UTF-8
|
encoding: UTF-8
|
||||||
links:
|
links:
|
||||||
- http://audiobookbay.nl/
|
- http://audiobookbay.nl/ # site forces http, does not support https
|
||||||
legacylinks:
|
legacylinks:
|
||||||
- https://audiobookbay.la/
|
- https://audiobookbay.la/
|
||||||
|
|
||||||
|
|||||||
@@ -44,15 +44,27 @@
|
|||||||
modes:
|
modes:
|
||||||
search: [q]
|
search: [q]
|
||||||
|
|
||||||
|
settings:
|
||||||
|
- name: username
|
||||||
|
type: text
|
||||||
|
label: Username
|
||||||
|
- name: password
|
||||||
|
type: password
|
||||||
|
label: Password
|
||||||
|
- name: info_results
|
||||||
|
type: info
|
||||||
|
label: Search results
|
||||||
|
default: "If you are getting the error <b>Login Failed, got redirected</b> then access the site with your browser and <b>mark as read</b> all PMs."
|
||||||
|
|
||||||
login:
|
login:
|
||||||
path: takelogin.php
|
path: takelogin.php
|
||||||
method: post
|
method: post
|
||||||
inputs:
|
inputs:
|
||||||
username: "{{ .Config.username }}"
|
username: "{{ .Config.username }}"
|
||||||
password: "{{ .Config.password }}"
|
password: "{{ .Config.password }}"
|
||||||
use_ssl: "1"
|
use_ssl: 1
|
||||||
perm_ssl: "1"
|
perm_ssl: 1
|
||||||
submitme: "X"
|
submitme: X
|
||||||
error:
|
error:
|
||||||
- selector: td.embedded:has(h2:contains("Oops"))
|
- selector: td.embedded:has(h2:contains("Oops"))
|
||||||
- selector: td.embedded:has(h2:contains("failed"))
|
- selector: td.embedded:has(h2:contains("failed"))
|
||||||
@@ -65,58 +77,38 @@
|
|||||||
inputs:
|
inputs:
|
||||||
$raw: "{{range .Categories}}c{{.}}=1&{{end}}"
|
$raw: "{{range .Categories}}c{{.}}=1&{{end}}"
|
||||||
search: "{{ .Keywords }}"
|
search: "{{ .Keywords }}"
|
||||||
searchin: "title"
|
searchin: title
|
||||||
incldead: "1"
|
incldead: 1
|
||||||
|
|
||||||
rows:
|
rows:
|
||||||
selector: tr.browse_color, tr.freeleech_color, tr[id^="kdescr"]
|
selector: tr.browse_color, tr.freeleech_color, tr[id^="kdescr"]
|
||||||
after: 1
|
after: 1
|
||||||
|
|
||||||
fields: # some users (rank specific?) have an extra column (td:nth-child(4)) with bookmark features
|
fields: # some users (rank specific?) have an extra column (td:nth-child(4)) with bookmark features
|
||||||
banner:
|
|
||||||
selector: a[href^="details.php?id="][onmouseover]
|
|
||||||
attribute: onmouseover
|
|
||||||
filters:
|
|
||||||
- name: regexp
|
|
||||||
args: src=\'(.*?)\'
|
|
||||||
title:
|
|
||||||
selector: a[href^="details.php?id="][onmouseover]
|
|
||||||
attribute: onmouseover
|
|
||||||
filters:
|
|
||||||
- name: regexp
|
|
||||||
args: Tip\('<b>(.*?)</b>
|
|
||||||
category:
|
category:
|
||||||
selector: a[href^="browse.php?cat="]
|
selector: a[href^="browse.php?cat="]
|
||||||
attribute: href
|
attribute: href
|
||||||
filters:
|
filters:
|
||||||
- name: querystring
|
- name: querystring
|
||||||
args: cat
|
args: cat
|
||||||
|
title:
|
||||||
|
selector: a[href^="details.php?id="][onmouseover]
|
||||||
|
attribute: onmouseover
|
||||||
|
filters:
|
||||||
|
- name: regexp
|
||||||
|
args: Tip\('<b>(.*?)</b>
|
||||||
details:
|
details:
|
||||||
selector: a[href^="details.php?id="][onmouseover]
|
selector: a[href^="details.php?id="][onmouseover]
|
||||||
attribute: href
|
attribute: href
|
||||||
download:
|
download:
|
||||||
selector: a[href^="download.php"]
|
selector: a[href^="download.php"]
|
||||||
attribute: href
|
attribute: href
|
||||||
files:
|
banner:
|
||||||
selector: a[href^="filelist.php"]
|
selector: a[href^="details.php?id="][onmouseover]
|
||||||
size:
|
attribute: onmouseover
|
||||||
selector: td:nth-last-child(6)
|
|
||||||
grabs:
|
|
||||||
selector: td:nth-last-child(5)
|
|
||||||
filters:
|
filters:
|
||||||
- name: regexp
|
- name: regexp
|
||||||
args: ([\d,]+)
|
args: src=\'(.*?)\'
|
||||||
seeders:
|
|
||||||
selector: td:nth-last-child(4)
|
|
||||||
leechers:
|
|
||||||
selector: td:nth-last-child(3)
|
|
||||||
date:
|
|
||||||
selector: td:nth-last-child(7)
|
|
||||||
downloadvolumefactor:
|
|
||||||
case:
|
|
||||||
"a.info > b:contains(\"[FREE]\")": "0"
|
|
||||||
"*": "1"
|
|
||||||
uploadvolumefactor:
|
|
||||||
case:
|
|
||||||
"*": "1"
|
|
||||||
description:
|
description:
|
||||||
selector: a[href^="details.php?id="][onmouseover]
|
selector: a[href^="details.php?id="][onmouseover]
|
||||||
attribute: onmouseover
|
attribute: onmouseover
|
||||||
@@ -130,7 +122,29 @@
|
|||||||
- name: prepend
|
- name: prepend
|
||||||
args: "{{ .Result.description }}<br>\n"
|
args: "{{ .Result.description }}<br>\n"
|
||||||
description:
|
description:
|
||||||
selector: td[colspan=13]
|
selector: td[colspan="13"]
|
||||||
filters:
|
filters:
|
||||||
- name: prepend
|
- name: prepend
|
||||||
args: "{{ .Result.description }}<br>\n"
|
args: "{{ .Result.description }}<br>\n"
|
||||||
|
files:
|
||||||
|
selector: td:nth-last-child(9)
|
||||||
|
date:
|
||||||
|
selector: td:nth-last-child(7)
|
||||||
|
size:
|
||||||
|
selector: td:nth-last-child(6)
|
||||||
|
grabs:
|
||||||
|
selector: td:nth-last-child(5)
|
||||||
|
filters:
|
||||||
|
- name: regexp
|
||||||
|
args: (\d+)
|
||||||
|
seeders:
|
||||||
|
selector: td:nth-last-child(4)
|
||||||
|
leechers:
|
||||||
|
selector: td:nth-last-child(3)
|
||||||
|
downloadvolumefactor:
|
||||||
|
case:
|
||||||
|
"a.info > b:contains(\"[FREE]\")": 0
|
||||||
|
"*": 1
|
||||||
|
uploadvolumefactor:
|
||||||
|
text: 1
|
||||||
|
# U-232 V4
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
---
|
---
|
||||||
site: audionews
|
site: audionews
|
||||||
name: AudioNews
|
name: AudioNews
|
||||||
description: "AudioNews (AN) is a Private Torrent Tracker for AUDIO SOFTWARE / SAMPLES / ETC"
|
description: "AudioNews (AN) is a Private Torrent Tracker for AUDIO SOFTWARE / SAMPLES / ETC"
|
||||||
|
|||||||
@@ -40,6 +40,10 @@
|
|||||||
options:
|
options:
|
||||||
"desc": "desc"
|
"desc": "desc"
|
||||||
"asc": "asc"
|
"asc": "asc"
|
||||||
|
- name: info_login
|
||||||
|
type: info
|
||||||
|
label: "Password Changes"
|
||||||
|
default: "This site forces you to change your <b>Password</b> every <b>90 days</b>.<br/>If you get a <b>Login Failed, got redirected</b> error, then access the site with your browser and check if you need to change your password. Logout after saving, and update this config to login."
|
||||||
|
|
||||||
login:
|
login:
|
||||||
path: login.php
|
path: login.php
|
||||||
@@ -65,7 +69,7 @@
|
|||||||
order_way: "{{ .Config.type }}"
|
order_way: "{{ .Config.type }}"
|
||||||
|
|
||||||
rows:
|
rows:
|
||||||
selector: table#torrent_table > tbody > tr.group, tr.torrent, tr.group_torrent:not(.edition_info)
|
selector: table#torrent_table > tbody > tr.group, tr.torrent, tr.group_torrent:not(.edition_info)
|
||||||
|
|
||||||
fields:
|
fields:
|
||||||
download:
|
download:
|
||||||
@@ -94,4 +98,4 @@
|
|||||||
"*": 1
|
"*": 1
|
||||||
uploadvolumefactor:
|
uploadvolumefactor:
|
||||||
case:
|
case:
|
||||||
"*": 1
|
"*": 1
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
site: backups
|
site: backups
|
||||||
name: Back-ups
|
name: Back-ups
|
||||||
description: "Back-Ups is a Private Torrent Tracker for MOVIES / TV / GENERAL"
|
description: "Back-Ups is a Private Torrent Tracker for MOVIES / TV / GENERAL"
|
||||||
language: en-us
|
language: en-us
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
---
|
---
|
||||||
site: baibako
|
site: baibako
|
||||||
name: BaibaKo
|
name: BaibaKo
|
||||||
description: "BaibaKo is a RUSSIAN Semi-Private Torrent Tracker for TV"
|
description: "BaibaKo is a RUSSIAN Semi-Private Torrent Tracker for TV"
|
||||||
@@ -6,7 +6,7 @@
|
|||||||
type: semi-private
|
type: semi-private
|
||||||
encoding: windows-1251
|
encoding: windows-1251
|
||||||
links:
|
links:
|
||||||
- http://baibako.tv/
|
- http://baibako.tv/ # site does not support https NET::ERR_CERT_AUTHORITY_INVALID
|
||||||
|
|
||||||
caps:
|
caps:
|
||||||
categorymappings:
|
categorymappings:
|
||||||
|
|||||||
@@ -21,7 +21,7 @@
|
|||||||
- {id: 408, cat: Audio, desc: "HQ Audio/无损音乐"}
|
- {id: 408, cat: Audio, desc: "HQ Audio/无损音乐"}
|
||||||
|
|
||||||
modes:
|
modes:
|
||||||
search: [q]
|
search: [q, imdbid]
|
||||||
tv-search: [q, season, ep, imdbid]
|
tv-search: [q, season, ep, imdbid]
|
||||||
movie-search: [q, imdbid]
|
movie-search: [q, imdbid]
|
||||||
|
|
||||||
@@ -96,7 +96,7 @@
|
|||||||
args: cat
|
args: cat
|
||||||
details:
|
details:
|
||||||
selector: a[href^="details.php?id="]
|
selector: a[href^="details.php?id="]
|
||||||
attribute: href
|
attribute: href
|
||||||
download:
|
download:
|
||||||
selector: a[href^="download.php?id="]
|
selector: a[href^="download.php?id="]
|
||||||
attribute: href
|
attribute: href
|
||||||
@@ -148,4 +148,4 @@
|
|||||||
description:
|
description:
|
||||||
selector: td:nth-child(2)
|
selector: td:nth-child(2)
|
||||||
remove: a, img
|
remove: a, img
|
||||||
# NexusPHP Standard v1.5 Beta 4
|
# NexusPHP Standard v1.5 Beta 4
|
||||||
|
|||||||
@@ -35,7 +35,7 @@
|
|||||||
- {id: 2, cat: TV, desc: "TV"}
|
- {id: 2, cat: TV, desc: "TV"}
|
||||||
|
|
||||||
modes:
|
modes:
|
||||||
search: [q]
|
search: [q, imdbid]
|
||||||
tv-search: [q, season, ep, imdbid]
|
tv-search: [q, season, ep, imdbid]
|
||||||
movie-search: [q, imdbid]
|
movie-search: [q, imdbid]
|
||||||
|
|
||||||
@@ -50,8 +50,8 @@
|
|||||||
paths:
|
paths:
|
||||||
- path: torrents
|
- path: torrents
|
||||||
inputs:
|
inputs:
|
||||||
$raw: "{{range .Categories}}categories[]={{.}}&{{end}}"
|
$raw: "{{ range .Categories }}categories[]={{.}}&{{end}}"
|
||||||
search: "{{if .Query.IMDBID}}{{else}}{{ .Keywords }}{{end}}"
|
search: "{{ if .Query.IMDBID }}{{else}}{{ .Keywords }}{{end}}"
|
||||||
description: ""
|
description: ""
|
||||||
uploader: ""
|
uploader: ""
|
||||||
imdb: "{{ .Query.IMDBIDShort }}"
|
imdb: "{{ .Query.IMDBIDShort }}"
|
||||||
@@ -114,6 +114,5 @@
|
|||||||
i[data-original-title="75% Promo"]: 0.25
|
i[data-original-title="75% Promo"]: 0.25
|
||||||
"*": 1
|
"*": 1
|
||||||
uploadvolumefactor:
|
uploadvolumefactor:
|
||||||
case:
|
text: 1
|
||||||
"*": 1
|
# UNIT3D
|
||||||
# UNIT3D
|
|
||||||
|
|||||||
@@ -14,7 +14,7 @@
|
|||||||
- {id: 2, cat: TV, desc: "TV"}
|
- {id: 2, cat: TV, desc: "TV"}
|
||||||
|
|
||||||
modes:
|
modes:
|
||||||
search: [q]
|
search: [q, imdbid]
|
||||||
tv-search: [q, season, ep, imdbid]
|
tv-search: [q, season, ep, imdbid]
|
||||||
movie-search: [q, imdbid]
|
movie-search: [q, imdbid]
|
||||||
|
|
||||||
@@ -126,6 +126,5 @@
|
|||||||
i[data-original-title="75% Promo"]: 0.25
|
i[data-original-title="75% Promo"]: 0.25
|
||||||
"*": 1
|
"*": 1
|
||||||
uploadvolumefactor:
|
uploadvolumefactor:
|
||||||
case:
|
text: 1
|
||||||
"*": 1
|
# UNIT3D
|
||||||
# UNIT3D
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
---
|
---
|
||||||
site: bigfangroup
|
site: bigfangroup
|
||||||
name: BigFANGroup
|
name: BigFANGroup
|
||||||
description: "BigFANGroup is a RUSSIAN Public Torrent Tracker for MOVIES / TV"
|
description: "BigFANGroup is a RUSSIAN Public Torrent Tracker for MOVIES / TV"
|
||||||
|
|||||||
@@ -6,6 +6,8 @@
|
|||||||
type: private
|
type: private
|
||||||
encoding: UTF-8
|
encoding: UTF-8
|
||||||
links:
|
links:
|
||||||
|
- https://www.bigtorrent.eu/
|
||||||
|
legacylinks:
|
||||||
- http://www.bigtorrent.eu/
|
- http://www.bigtorrent.eu/
|
||||||
|
|
||||||
caps:
|
caps:
|
||||||
@@ -96,4 +98,4 @@
|
|||||||
"*": "1"
|
"*": "1"
|
||||||
uploadvolumefactor:
|
uploadvolumefactor:
|
||||||
case:
|
case:
|
||||||
"*": "1"
|
"*": "1"
|
||||||
|
|||||||
@@ -6,14 +6,16 @@
|
|||||||
type: private
|
type: private
|
||||||
encoding: UTF-8
|
encoding: UTF-8
|
||||||
links:
|
links:
|
||||||
- http://bigtower.info/
|
- http://bigtower.info/ # site does not support https NET::ERR_CERT_DATE_INVALID
|
||||||
|
legacylinks:
|
||||||
|
- https://bigtower.info/
|
||||||
|
|
||||||
caps:
|
caps:
|
||||||
categorymappings:
|
categorymappings:
|
||||||
|
|
||||||
# Movies
|
# Movies
|
||||||
- {id: 11, cat: Movies/HD, desc: "DSS"}
|
- {id: 11, cat: Movies/HD, desc: "DSS"}
|
||||||
- {id: 1, cat: Movies, desc: "Screener"}
|
- {id: 1, cat: Movies, desc: "Screener"}
|
||||||
- {id: 2, cat: Movies, desc: "DVDRip & BDRip"}
|
- {id: 2, cat: Movies, desc: "DVDRip & BDRip"}
|
||||||
- {id: 3, cat: Movies/BluRay, desc: "Bluray 1080p & 720p"}
|
- {id: 3, cat: Movies/BluRay, desc: "Bluray 1080p & 720p"}
|
||||||
- {id: 5, cat: Movies/UHD, desc: "Ultra HD 4K"}
|
- {id: 5, cat: Movies/UHD, desc: "Ultra HD 4K"}
|
||||||
@@ -25,10 +27,10 @@
|
|||||||
|
|
||||||
# MUSIC
|
# MUSIC
|
||||||
- {id: 8, cat: Audio, desc: "Musica"}
|
- {id: 8, cat: Audio, desc: "Musica"}
|
||||||
|
|
||||||
# SOFTWARE
|
# SOFTWARE
|
||||||
- {id: 9, cat: PC/0day, desc: "Software"}
|
- {id: 9, cat: PC/0day, desc: "Software"}
|
||||||
|
|
||||||
# PHONE
|
# PHONE
|
||||||
- {id: 12, cat: PC/Phone-Other, desc: "Applicazioni"}
|
- {id: 12, cat: PC/Phone-Other, desc: "Applicazioni"}
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
---
|
---
|
||||||
site: bit-titan
|
site: bit-titan
|
||||||
name: BiT-TiTAN
|
name: BiT-TiTAN
|
||||||
description: "BiT-TiTAN is a GERMAN Private Torrent Tracker for MOVIES / TV / GENERAL"
|
description: "BiT-TiTAN is a GERMAN Private Torrent Tracker for MOVIES / TV / GENERAL"
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
---
|
---
|
||||||
site: bithorlo
|
site: bithorlo
|
||||||
name: Bithorlo
|
name: Bithorlo
|
||||||
description: "Bithorlo (BHO) is a HUNGARIAN Private Torrent Tracker for MOVIES / GENERAL"
|
description: "Bithorlo (BHO) is a HUNGARIAN Private Torrent Tracker for MOVIES / GENERAL"
|
||||||
@@ -56,6 +56,10 @@
|
|||||||
movie-search: [q]
|
movie-search: [q]
|
||||||
|
|
||||||
settings:
|
settings:
|
||||||
|
- name: info_alert
|
||||||
|
type: info
|
||||||
|
label: Alert about Cookie
|
||||||
|
default: "If during your cookie save you get the following error:</br><b>The 'Value'='xzlogin,xzrecover,xzsignup' part of the cookie is invalid.</b></br>Then remove <b>acopendivids=xzlogin,xzrecover,xzsignup; </b> from the cookie string before proceeding to save."
|
||||||
- name: cookie
|
- name: cookie
|
||||||
type: text
|
type: text
|
||||||
label: Cookie
|
label: Cookie
|
||||||
|
|||||||
@@ -42,8 +42,8 @@
|
|||||||
- {id: 27, cat: Other, desc: "Klipek"}
|
- {id: 27, cat: Other, desc: "Klipek"}
|
||||||
|
|
||||||
modes:
|
modes:
|
||||||
search: [q]
|
search: [q, imdbid]
|
||||||
tv-search: [q, season, ep]
|
tv-search: [q, season, ep, imdbid]
|
||||||
movie-search: [q, imdbid]
|
movie-search: [q, imdbid]
|
||||||
|
|
||||||
login:
|
login:
|
||||||
@@ -61,13 +61,15 @@
|
|||||||
paths:
|
paths:
|
||||||
- path: browse.php
|
- path: browse.php
|
||||||
inputs:
|
inputs:
|
||||||
$raw: "{{range .Categories}}c{{.}}=1&{{end}}"
|
$raw: "{{ range .Categories }}c{{.}}=1&{{end}}"
|
||||||
search: "{{if .Query.IMDBID}}{{ .Query.IMDBID }}{{else}}{{ .Query.Keywords }}{{end}}"
|
search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{else}}{{ .Keywords }}{{end}}"
|
||||||
incldead: 1
|
incldead: 1
|
||||||
|
|
||||||
rows:
|
rows:
|
||||||
selector: table#torrenttable > tbody > tr:has(a[href^="details.php?id="])
|
selector: table#torrenttable > tbody > tr:has(a[href^="details.php?id="])
|
||||||
filters:
|
filters:
|
||||||
- name: andmatch
|
- name: andmatch
|
||||||
|
|
||||||
fields:
|
fields:
|
||||||
# download button can be disbled in the profile, use details link instead
|
# download button can be disbled in the profile, use details link instead
|
||||||
# download:
|
# download:
|
||||||
@@ -156,3 +158,4 @@
|
|||||||
args: ["tegnap", "yesterday"]
|
args: ["tegnap", "yesterday"]
|
||||||
description:
|
description:
|
||||||
selector: td:nth-child(2) > div
|
selector: td:nth-child(2) > div
|
||||||
|
# engine tbd
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
type: public
|
type: public
|
||||||
encoding: UTF-8
|
encoding: UTF-8
|
||||||
links:
|
links:
|
||||||
- http://bitru.org/
|
- http://bitru.org/ # site forces http, https is not supported
|
||||||
|
|
||||||
caps:
|
caps:
|
||||||
categories:
|
categories:
|
||||||
@@ -84,8 +84,8 @@
|
|||||||
- name: regexp
|
- name: regexp
|
||||||
args: "src=(.*?) "
|
args: "src=(.*?) "
|
||||||
date:
|
date:
|
||||||
# Сегодня в 09:09 от
|
# Сегодня в 09:09 от
|
||||||
# Вчера в 22:47 от
|
# Вчера в 22:47 от
|
||||||
selector: td:nth-child(2) div.b-info div span:nth-child(2):contains("Сегодня"), td:nth-child(2) div.b-info div span:nth-child(2):contains("Вчера")
|
selector: td:nth-child(2) div.b-info div span:nth-child(2):contains("Сегодня"), td:nth-child(2) div.b-info div span:nth-child(2):contains("Вчера")
|
||||||
optional: true
|
optional: true
|
||||||
filters:
|
filters:
|
||||||
@@ -96,7 +96,7 @@
|
|||||||
- name: replace
|
- name: replace
|
||||||
args: ["Вчера в", "Yesterday"]
|
args: ["Вчера в", "Yesterday"]
|
||||||
date:
|
date:
|
||||||
# 08 ноября 2019 в 23:53 от
|
# 08 ноября 2019 в 23:53 от
|
||||||
selector: td:nth-child(2) div.b-info div span:nth-child(2):not(:contains("Сегодня")):not(:contains("Вчера"))
|
selector: td:nth-child(2) div.b-info div span:nth-child(2):not(:contains("Сегодня")):not(:contains("Вчера"))
|
||||||
optional: true
|
optional: true
|
||||||
filters:
|
filters:
|
||||||
@@ -134,7 +134,7 @@
|
|||||||
selector: td:nth-child(3)
|
selector: td:nth-child(3)
|
||||||
filters:
|
filters:
|
||||||
- name: replace
|
- name: replace
|
||||||
args: ["ТБ", "TB"]
|
args: ["ТБ", "TB"]
|
||||||
- name: replace
|
- name: replace
|
||||||
args: ["ГБ", "GB"]
|
args: ["ГБ", "GB"]
|
||||||
- name: replace
|
- name: replace
|
||||||
@@ -145,12 +145,12 @@
|
|||||||
selector: td:nth-child(4)
|
selector: td:nth-child(4)
|
||||||
filters:
|
filters:
|
||||||
- name: replace
|
- name: replace
|
||||||
args: ["?", "1"]
|
args: ["?", "1"]
|
||||||
leechers:
|
leechers:
|
||||||
selector: td:nth-child(5)
|
selector: td:nth-child(5)
|
||||||
filters:
|
filters:
|
||||||
- name: replace
|
- name: replace
|
||||||
args: ["?", "0"]
|
args: ["?", "0"]
|
||||||
downloadvolumefactor:
|
downloadvolumefactor:
|
||||||
text: 0
|
text: 0
|
||||||
uploadvolumefactor:
|
uploadvolumefactor:
|
||||||
|
|||||||
@@ -6,6 +6,8 @@
|
|||||||
type: private
|
type: private
|
||||||
encoding: windows-1252
|
encoding: windows-1252
|
||||||
links:
|
links:
|
||||||
|
- https://bitspyder.net/
|
||||||
|
legacylinks:
|
||||||
- http://bitspyder.net/
|
- http://bitspyder.net/
|
||||||
|
|
||||||
caps:
|
caps:
|
||||||
@@ -47,9 +49,34 @@
|
|||||||
modes:
|
modes:
|
||||||
search: [q]
|
search: [q]
|
||||||
|
|
||||||
|
settings:
|
||||||
|
- name: username
|
||||||
|
type: text
|
||||||
|
label: Username
|
||||||
|
- name: password
|
||||||
|
type: password
|
||||||
|
label: Password
|
||||||
|
- name: sort
|
||||||
|
type: select
|
||||||
|
label: Sort requested from site
|
||||||
|
default: "8"
|
||||||
|
options:
|
||||||
|
"8": "created"
|
||||||
|
"6": "seeders"
|
||||||
|
"4": "size"
|
||||||
|
"1": "title"
|
||||||
|
- name: type
|
||||||
|
type: select
|
||||||
|
label: Order requested from site
|
||||||
|
default: "desc"
|
||||||
|
options:
|
||||||
|
"desc": "desc"
|
||||||
|
"asc": "asc"
|
||||||
|
|
||||||
login:
|
login:
|
||||||
path: processf.php
|
path: login.php
|
||||||
method: post
|
method: form
|
||||||
|
form: form
|
||||||
inputs:
|
inputs:
|
||||||
username: "{{ .Config.username }}"
|
username: "{{ .Config.username }}"
|
||||||
password: "{{ .Config.password }}"
|
password: "{{ .Config.password }}"
|
||||||
@@ -61,17 +88,20 @@
|
|||||||
search:
|
search:
|
||||||
paths:
|
paths:
|
||||||
- path: browse.php
|
- path: browse.php
|
||||||
method: post
|
|
||||||
inputs:
|
inputs:
|
||||||
search: "{{ .Keywords }}"
|
search: "{{ .Keywords }}"
|
||||||
# 0 active 1 incldead 2 onlydead
|
# 0 active 1 incldead 2 onlydead
|
||||||
incldead: 1
|
incldead: 1
|
||||||
# 0 title 1 default
|
# 0 title 1 default
|
||||||
scope: 1
|
scope: 1
|
||||||
|
sort: "{{ .Config.sort }}"
|
||||||
|
type: "{{ .Config.type }}"
|
||||||
|
|
||||||
rows:
|
rows:
|
||||||
selector: table > tbody > tr[class]
|
selector: table > tbody > tr[class]
|
||||||
filters:
|
filters:
|
||||||
- name: andmatch
|
- name: andmatch
|
||||||
|
|
||||||
fields:
|
fields:
|
||||||
# there are two styles, we support both
|
# there are two styles, we support both
|
||||||
title:
|
title:
|
||||||
@@ -101,7 +131,7 @@
|
|||||||
selector: td.rowcol:nth-child(7):has(br), td.clear:nth-child(4)
|
selector: td.rowcol:nth-child(7):has(br), td.clear:nth-child(4)
|
||||||
filters:
|
filters:
|
||||||
- name: regexp
|
- name: regexp
|
||||||
args: ([\d,]+)
|
args: (\d+)
|
||||||
seeders:
|
seeders:
|
||||||
selector: td.rowcol:nth-last-child(3)
|
selector: td.rowcol:nth-last-child(3)
|
||||||
leechers:
|
leechers:
|
||||||
@@ -138,3 +168,4 @@
|
|||||||
description:
|
description:
|
||||||
optional: true
|
optional: true
|
||||||
selector: font[color="#990000"]
|
selector: font[color="#990000"]
|
||||||
|
# custom v4
|
||||||
|
|||||||
@@ -6,8 +6,8 @@
|
|||||||
type: private
|
type: private
|
||||||
encoding: UTF-8
|
encoding: UTF-8
|
||||||
links:
|
links:
|
||||||
- http://www.bitturk.net/
|
- http://www.bitturk.net/ # site does not support https ERR_CONNECTION_REFUSED
|
||||||
|
|
||||||
caps:
|
caps:
|
||||||
categorymappings:
|
categorymappings:
|
||||||
- {id: 69, cat: Movies, desc: "BiTTuRK Altın"}
|
- {id: 69, cat: Movies, desc: "BiTTuRK Altın"}
|
||||||
@@ -20,6 +20,7 @@
|
|||||||
- {id: 67, cat: XXX, desc: "XxX"}
|
- {id: 67, cat: XXX, desc: "XxX"}
|
||||||
- {id: 68, cat: Movies, desc: "Dual (TR-~)"}
|
- {id: 68, cat: Movies, desc: "Dual (TR-~)"}
|
||||||
- {id: 58, cat: Movies, desc: "Film"}
|
- {id: 58, cat: Movies, desc: "Film"}
|
||||||
|
- {id: 72, cat: Movies, desc: "Belgesel"}
|
||||||
- {id: 60, cat: Movies/3D, desc: "3D"}
|
- {id: 60, cat: Movies/3D, desc: "3D"}
|
||||||
- {id: 45, cat: Movies, desc: "Eğitim / Prog "}
|
- {id: 45, cat: Movies, desc: "Eğitim / Prog "}
|
||||||
- {id: 1, cat: Movies, desc: "Filmler"}
|
- {id: 1, cat: Movies, desc: "Filmler"}
|
||||||
@@ -52,12 +53,12 @@
|
|||||||
- {id: 50, cat: TV, desc: "Yab@ncı Dizi"}
|
- {id: 50, cat: TV, desc: "Yab@ncı Dizi"}
|
||||||
- {id: 51, cat: TV, desc: "Yerli Dizi"}
|
- {id: 51, cat: TV, desc: "Yerli Dizi"}
|
||||||
- {id: 44, cat: Books, desc: "E-BooK"}
|
- {id: 44, cat: Books, desc: "E-BooK"}
|
||||||
|
|
||||||
modes:
|
modes:
|
||||||
search: [q]
|
search: [q]
|
||||||
tv-search: [q, season, ep]
|
tv-search: [q, season, ep]
|
||||||
movie-search: [q]
|
movie-search: [q]
|
||||||
|
|
||||||
settings:
|
settings:
|
||||||
- name: username
|
- name: username
|
||||||
type: text
|
type: text
|
||||||
@@ -84,7 +85,7 @@
|
|||||||
options:
|
options:
|
||||||
"desc": "desc"
|
"desc": "desc"
|
||||||
"asc": "asc"
|
"asc": "asc"
|
||||||
|
|
||||||
login:
|
login:
|
||||||
path: ?p=home&pid=1
|
path: ?p=home&pid=1
|
||||||
method: form
|
method: form
|
||||||
@@ -106,11 +107,11 @@
|
|||||||
test:
|
test:
|
||||||
path: ?p=home&pid=1
|
path: ?p=home&pid=1
|
||||||
selector: a[href*="/?p=logout&"]
|
selector: a[href*="/?p=logout&"]
|
||||||
|
|
||||||
search:
|
search:
|
||||||
paths:
|
paths:
|
||||||
- path: /
|
- path: /
|
||||||
keywordsfilters:
|
keywordsfilters:
|
||||||
- name: re_replace
|
- name: re_replace
|
||||||
args: ["[^a-zA-Z0-9]+", "%25"]
|
args: ["[^a-zA-Z0-9]+", "%25"]
|
||||||
inputs:
|
inputs:
|
||||||
@@ -145,7 +146,7 @@
|
|||||||
attribute: href
|
attribute: href
|
||||||
date:
|
date:
|
||||||
optional: true
|
optional: true
|
||||||
# Uploaded 30-01-2019 15:02 by
|
# Uploaded 30-01-2019 15:02 by
|
||||||
selector: td.torrent_name:not(:contains(" at "))
|
selector: td.torrent_name:not(:contains(" at "))
|
||||||
filters:
|
filters:
|
||||||
- name: regexp
|
- name: regexp
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
---
|
---
|
||||||
site: bluebirdhd
|
site: bluebirdhd
|
||||||
name: BlueBird
|
name: BlueBird
|
||||||
description: "BlueBird is a RUSSIAN Private Torrent Tracker for HD MOVIES"
|
description: "BlueBird is a RUSSIAN Private Torrent Tracker for HD MOVIES"
|
||||||
|
|||||||
@@ -13,9 +13,11 @@
|
|||||||
- {id: 1, cat: Movies, desc: "Movies"}
|
- {id: 1, cat: Movies, desc: "Movies"}
|
||||||
- {id: 2, cat: TV, desc: "TV"}
|
- {id: 2, cat: TV, desc: "TV"}
|
||||||
- {id: 3, cat: Movies, desc: "FANRES"}
|
- {id: 3, cat: Movies, desc: "FANRES"}
|
||||||
|
- {id: 6, cat: TV/Anime, desc: "Anime"}
|
||||||
|
- {id: 7, cat: Movies/Other, desc: "Trailer"}
|
||||||
|
|
||||||
modes:
|
modes:
|
||||||
search: [q]
|
search: [q, imdbid]
|
||||||
tv-search: [q, season, ep, imdbid]
|
tv-search: [q, season, ep, imdbid]
|
||||||
movie-search: [q, imdbid]
|
movie-search: [q, imdbid]
|
||||||
|
|
||||||
@@ -51,7 +53,7 @@
|
|||||||
test:
|
test:
|
||||||
path: /
|
path: /
|
||||||
selector: a[href$="/logout"]
|
selector: a[href$="/logout"]
|
||||||
|
|
||||||
ratio:
|
ratio:
|
||||||
path: /
|
path: /
|
||||||
selector: li:has(i.fa-sync-alt)
|
selector: li:has(i.fa-sync-alt)
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
---
|
---
|
||||||
site: booktracker
|
site: booktracker
|
||||||
name: BookTracker
|
name: BookTracker
|
||||||
description: "BookTracker is a RUSSIAN Semi-Private Torrent Tracker for EBOOKS"
|
description: "BookTracker is a RUSSIAN Semi-Private Torrent Tracker for EBOOKS"
|
||||||
|
|||||||
133
src/Jackett.Common/Definitions/boxingtorrents.yml
Normal file
133
src/Jackett.Common/Definitions/boxingtorrents.yml
Normal file
@@ -0,0 +1,133 @@
|
|||||||
|
---
|
||||||
|
site: boxingtorrents
|
||||||
|
name: Boxing Torrents
|
||||||
|
description: "Boxing Torrents is a Private Torrent Tracker for BOXING"
|
||||||
|
language: en-us
|
||||||
|
type: private
|
||||||
|
encoding: UTF-8
|
||||||
|
links:
|
||||||
|
- https://tc-boxing.com/
|
||||||
|
|
||||||
|
caps:
|
||||||
|
categorymappings:
|
||||||
|
- {id: 15, cat: TV/Sport, desc: "3D"}
|
||||||
|
- {id: 9, cat: TV/Sport, desc: "Amateur - Full"}
|
||||||
|
- {id: 16, cat: TV/Sport, desc: "Blu-ray"}
|
||||||
|
- {id: 13, cat: TV/Sport, desc: "Career Set"}
|
||||||
|
- {id: 8, cat: TV/Sport, desc: "DVD"}
|
||||||
|
- {id: 10, cat: TV/Sport, desc: "Foreign - Excellent"}
|
||||||
|
- {id: 11, cat: TV/Sport, desc: "Foreign - Fair"}
|
||||||
|
- {id: 6, cat: TV/Sport, desc: "Foreign - Good"}
|
||||||
|
- {id: 12, cat: TV/Sport, desc: "Foreign - Poor"}
|
||||||
|
- {id: 1, cat: TV/Sport, desc: "Full - Excellent"}
|
||||||
|
- {id: 3, cat: TV/Sport, desc: "Full - Fair"}
|
||||||
|
- {id: 2, cat: TV/Sport, desc: "Full - Good"}
|
||||||
|
- {id: 4, cat: TV/Sport, desc: "Full - Poor"}
|
||||||
|
- {id: 14, cat: TV/Sport, desc: "HD"}
|
||||||
|
- {id: 7, cat: TV/Sport, desc: "Misc"}
|
||||||
|
|
||||||
|
|
||||||
|
modes:
|
||||||
|
search: [q]
|
||||||
|
tv-search: [q, season, ep]
|
||||||
|
|
||||||
|
settings:
|
||||||
|
- name: username
|
||||||
|
type: text
|
||||||
|
label: Username
|
||||||
|
- name: password
|
||||||
|
type: password
|
||||||
|
label: Password
|
||||||
|
- name: sort
|
||||||
|
type: select
|
||||||
|
label: Sort requested from site
|
||||||
|
default: "added"
|
||||||
|
options:
|
||||||
|
"added": "created"
|
||||||
|
"seeders": "seeders"
|
||||||
|
"size": "size"
|
||||||
|
"name": "title"
|
||||||
|
- name: type
|
||||||
|
type: select
|
||||||
|
label: Order requested from site
|
||||||
|
default: "DESC"
|
||||||
|
options:
|
||||||
|
"DESC": "desc"
|
||||||
|
"ASC": "asc"
|
||||||
|
- name: info_download
|
||||||
|
type: info
|
||||||
|
label: "Download Restrictions"
|
||||||
|
default: "You must have uploaded at least 10GB before you are able to access all torrent sizes. Until then, you are restricted to torrents no larger than 2.5GB."
|
||||||
|
|
||||||
|
login:
|
||||||
|
path: takelogin.php
|
||||||
|
method: post
|
||||||
|
inputs:
|
||||||
|
username: "{{ .Config.username }}"
|
||||||
|
password: "{{ .Config.password }}"
|
||||||
|
error:
|
||||||
|
- selector: td.embedded:contains("Login failed!")
|
||||||
|
test:
|
||||||
|
path: browse.php
|
||||||
|
selector: a[href="logout.php"]
|
||||||
|
|
||||||
|
download:
|
||||||
|
selector: a[href^="download.php"]
|
||||||
|
attribute: href
|
||||||
|
|
||||||
|
search:
|
||||||
|
paths:
|
||||||
|
# https://tc-boxing.com/browse.php?c16=1&c8=1&c14=1&incldead=1
|
||||||
|
# https://tc-boxing.com/browse.php?search=tyson&cat=0&incldead=1
|
||||||
|
- path: browse.php
|
||||||
|
inputs:
|
||||||
|
$raw: "{{ if .Categories }}{{ range .Categories }}c{{.}}=1&{{end}}{{else}}cat=0{{end}}"
|
||||||
|
# 0 active 1 incldead 2 onlydead
|
||||||
|
incldead: 1
|
||||||
|
search: "{{ .Keywords }}"
|
||||||
|
sort: "{{ .Config.sort }}"
|
||||||
|
d: "{{ .Config.type }}"
|
||||||
|
|
||||||
|
rows:
|
||||||
|
selector: table[border="1"][cellspacing="0"][cellpadding="5"] tr:has(a[href^="details.php?id="])
|
||||||
|
|
||||||
|
fields:
|
||||||
|
category:
|
||||||
|
selector: a[href^="browse.php?cat="]
|
||||||
|
attribute: href
|
||||||
|
filters:
|
||||||
|
- name: querystring
|
||||||
|
args: cat
|
||||||
|
title:
|
||||||
|
selector: a[href^="details.php?id="]
|
||||||
|
details:
|
||||||
|
selector: a[href^="details.php?id="]
|
||||||
|
attribute: href
|
||||||
|
download:
|
||||||
|
selector: a[href^="details.php?id="]
|
||||||
|
attribute: href
|
||||||
|
files:
|
||||||
|
selector: td:nth-last-child(8)
|
||||||
|
date:
|
||||||
|
selector: td:nth-last-child(6)
|
||||||
|
filters:
|
||||||
|
- name: dateparse
|
||||||
|
args: "2006-01-0215:04:05"
|
||||||
|
size:
|
||||||
|
selector: td:nth-last-child(5)
|
||||||
|
grabs:
|
||||||
|
selector: td:nth-last-child(4)
|
||||||
|
filters:
|
||||||
|
- name: regexp
|
||||||
|
args: (\d+)
|
||||||
|
seeders:
|
||||||
|
selector: td:nth-last-child(3)
|
||||||
|
leechers:
|
||||||
|
selector: td:nth-last-child(2)
|
||||||
|
downloadvolumefactor:
|
||||||
|
case:
|
||||||
|
"b:contains(\"FreeLeech\")": 0
|
||||||
|
"*": 1
|
||||||
|
uploadvolumefactor:
|
||||||
|
text: 1
|
||||||
|
# engine n/a
|
||||||
@@ -6,6 +6,8 @@
|
|||||||
type: private
|
type: private
|
||||||
encoding: UTF-8
|
encoding: UTF-8
|
||||||
links:
|
links:
|
||||||
|
- https://broadcity.in/
|
||||||
|
legacylinks:
|
||||||
- http://broadcity.in/
|
- http://broadcity.in/
|
||||||
|
|
||||||
caps:
|
caps:
|
||||||
|
|||||||
@@ -15,7 +15,7 @@
|
|||||||
- {id: 410, cat: TV, desc: "TV Series/剧集"}
|
- {id: 410, cat: TV, desc: "TV Series/剧集"}
|
||||||
|
|
||||||
modes:
|
modes:
|
||||||
search: [q]
|
search: [q, imdbid]
|
||||||
tv-search: [q, season, ep, imdbid]
|
tv-search: [q, season, ep, imdbid]
|
||||||
movie-search: [q, imdbid]
|
movie-search: [q, imdbid]
|
||||||
|
|
||||||
@@ -43,7 +43,7 @@
|
|||||||
options:
|
options:
|
||||||
"desc": "desc"
|
"desc": "desc"
|
||||||
"asc": "asc"
|
"asc": "asc"
|
||||||
|
|
||||||
login:
|
login:
|
||||||
method: cookie
|
method: cookie
|
||||||
inputs:
|
inputs:
|
||||||
@@ -86,7 +86,7 @@
|
|||||||
args: cat
|
args: cat
|
||||||
details:
|
details:
|
||||||
selector: a[href^="details.php?id="]
|
selector: a[href^="details.php?id="]
|
||||||
attribute: href
|
attribute: href
|
||||||
download:
|
download:
|
||||||
selector: a[href^="download.php?id="]
|
selector: a[href^="download.php?id="]
|
||||||
attribute: href
|
attribute: href
|
||||||
|
|||||||
@@ -5,12 +5,14 @@
|
|||||||
language: en-us
|
language: en-us
|
||||||
type: public
|
type: public
|
||||||
encoding: UTF-8
|
encoding: UTF-8
|
||||||
|
followredirect: true
|
||||||
links:
|
links:
|
||||||
- https://btdb.io/
|
- https://btdb.io/
|
||||||
legacylinks:
|
legacylinks:
|
||||||
- https://btdb.to/
|
- https://btdb.to/
|
||||||
- https://btdb.unblocked.app/
|
- https://btdb.unblocked.app/
|
||||||
- https://btdb.eu/
|
- https://btdb.eu/
|
||||||
|
- https://btdb.unblockit.pro/
|
||||||
|
|
||||||
caps:
|
caps:
|
||||||
categorymappings:
|
categorymappings:
|
||||||
@@ -33,39 +35,59 @@
|
|||||||
options:
|
options:
|
||||||
"time": "created"
|
"time": "created"
|
||||||
"length": "size"
|
"length": "size"
|
||||||
"popular": "seeders"
|
"seeders": "seeders"
|
||||||
|
|
||||||
search:
|
search:
|
||||||
paths:
|
paths:
|
||||||
- path: "{{ if .Keywords }}?s={{ .Keywords }}&sort={{ .Config.sort }}{{else}}recent?sort={{ .Config.sort }}{{end}}"
|
- path: "{{ if .Keywords }}search/{{ .Keywords }}/{{else}}recent{{end}}?sort={{ .Config.sort }}"
|
||||||
|
- path: "{{ if .Keywords }}search/{{ .Keywords }}/{{else}}recent{{end}}?sort={{ .Config.sort }}&page=2"
|
||||||
|
- path: "{{ if .Keywords }}search/{{ .Keywords }}/{{else}}recent{{end}}?sort={{ .Config.sort }}&page=3"
|
||||||
|
- path: "{{ if .Keywords }}search/{{ .Keywords }}/{{else}}recent{{end}}?sort={{ .Config.sort }}&page=4"
|
||||||
|
- path: "{{ if .Keywords }}search/{{ .Keywords }}/{{else}}recent{{end}}?sort={{ .Config.sort }}&page=5"
|
||||||
|
|
||||||
rows:
|
rows:
|
||||||
selector: li[class$="item"]
|
selector: div.media
|
||||||
|
|
||||||
fields:
|
fields:
|
||||||
title:
|
|
||||||
selector: h2[class$="title"] a[href*="/torrent/"]
|
|
||||||
attribute: title
|
|
||||||
category:
|
category:
|
||||||
text: 1
|
text: 1
|
||||||
|
title:
|
||||||
|
selector: a[href*="/torrent/"]
|
||||||
details:
|
details:
|
||||||
selector: h2[class$="title"] a[href*="/torrent/"]
|
selector: a[href*="/torrent/"]
|
||||||
attribute: href
|
attribute: href
|
||||||
|
download:
|
||||||
|
# download can be missing despite icon being present. Fortunately the magnet is always there
|
||||||
|
selector: a[href$=".torrent"]
|
||||||
|
attribute: href
|
||||||
|
optional: true
|
||||||
magnet:
|
magnet:
|
||||||
selector: div[class$="info"] a[href^="magnet:?xt="]
|
selector: a[href^="magnet:?xt="]
|
||||||
attribute: href
|
attribute: href
|
||||||
|
banner:
|
||||||
|
selector: a.img-thumbnail img
|
||||||
|
attribute: src
|
||||||
|
filters:
|
||||||
|
- name: replace
|
||||||
|
args: ["https://btdb.io/assets/img/placeholder.png", ""]
|
||||||
size:
|
size:
|
||||||
selector: div[class$="info"] span:nth-of-type(1)
|
selector: small:nth-of-type(1) strong
|
||||||
files:
|
files:
|
||||||
selector: div[class$="info"] span:nth-of-type(2)
|
selector: small:nth-of-type(2) strong
|
||||||
|
seeders:
|
||||||
|
selector: small:nth-of-type(3) strong
|
||||||
|
filters:
|
||||||
|
- name: replace
|
||||||
|
args: [",", ""]
|
||||||
|
leechers:
|
||||||
|
selector: small:nth-of-type(4) strong
|
||||||
|
filters:
|
||||||
|
- name: replace
|
||||||
|
args: [",", ""]
|
||||||
date:
|
date:
|
||||||
selector: div[class$="info"] span:nth-of-type(3)
|
selector: small:nth-of-type(5) strong
|
||||||
filters:
|
filters:
|
||||||
- name: timeago
|
- name: timeago
|
||||||
seeders:
|
|
||||||
selector: div[class$="info"] span:nth-of-type(4)
|
|
||||||
leechers:
|
|
||||||
selector: div[class$="info"] span:nth-of-type(5)
|
|
||||||
downloadvolumefactor:
|
downloadvolumefactor:
|
||||||
text: 0
|
text: 0
|
||||||
uploadvolumefactor:
|
uploadvolumefactor:
|
||||||
|
|||||||
@@ -20,7 +20,7 @@
|
|||||||
settings:
|
settings:
|
||||||
- name: info
|
- name: info
|
||||||
type: info
|
type: info
|
||||||
default: BTDigg does not use categories. In your software Indexer settings, set the category to 100001.
|
default: BTDigg does not use categories. In your software Indexer settings, set the category to 7000.
|
||||||
- name: sort
|
- name: sort
|
||||||
type: select
|
type: select
|
||||||
label: Sort requested from site
|
label: Sort requested from site
|
||||||
|
|||||||
68
src/Jackett.Common/Definitions/bteye.yml
Normal file
68
src/Jackett.Common/Definitions/bteye.yml
Normal file
@@ -0,0 +1,68 @@
|
|||||||
|
---
|
||||||
|
site: bteye
|
||||||
|
name: BTeye
|
||||||
|
description: "BTeye is a Public BitTorrent DHT search engine."
|
||||||
|
language: en-us
|
||||||
|
type: public
|
||||||
|
encoding: UTF-8
|
||||||
|
links:
|
||||||
|
- https://www.bteye.org/
|
||||||
|
|
||||||
|
caps:
|
||||||
|
categories:
|
||||||
|
1: Other
|
||||||
|
|
||||||
|
modes:
|
||||||
|
search: [q]
|
||||||
|
tv-search: [q, season, ep]
|
||||||
|
movie-search: [q]
|
||||||
|
|
||||||
|
settings:
|
||||||
|
- name: info
|
||||||
|
type: info
|
||||||
|
default: BTeye does not use categories. In your software Indexer settings, set the category to 7000.
|
||||||
|
|
||||||
|
download:
|
||||||
|
selector: a[href^="magnet:?xt="]
|
||||||
|
attribute: href
|
||||||
|
|
||||||
|
search:
|
||||||
|
# https://www.bteye.org/q/2020
|
||||||
|
paths:
|
||||||
|
- path: "q/{{ if .Keywords }}{{ .Keywords }}{{else}}2020{{end}}"
|
||||||
|
|
||||||
|
rows:
|
||||||
|
selector: div.plist
|
||||||
|
filters:
|
||||||
|
- name: andmatch
|
||||||
|
|
||||||
|
fields:
|
||||||
|
category:
|
||||||
|
text: 1
|
||||||
|
title:
|
||||||
|
selector: div.pname a
|
||||||
|
attribute: title
|
||||||
|
details:
|
||||||
|
selector: div.pname a
|
||||||
|
attribute: href
|
||||||
|
download:
|
||||||
|
selector: div.pname a
|
||||||
|
attribute: href
|
||||||
|
date:
|
||||||
|
selector: div.plink b:nth-of-type(3)
|
||||||
|
filters:
|
||||||
|
- name: dateparse
|
||||||
|
args: "2006-01-02"
|
||||||
|
files:
|
||||||
|
selector: div.plink b:nth-of-type(2)
|
||||||
|
size:
|
||||||
|
selector: div.plink b:nth-of-type(1)
|
||||||
|
seeders:
|
||||||
|
text: 1
|
||||||
|
leechers:
|
||||||
|
text: 1
|
||||||
|
downloadvolumefactor:
|
||||||
|
text: 0
|
||||||
|
uploadvolumefactor:
|
||||||
|
text: 1
|
||||||
|
# engine n/a
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
---
|
---
|
||||||
site: btnext
|
site: btnext
|
||||||
name: BTNext
|
name: BTNext
|
||||||
description: "BTNext (BTNT) is a PORTUGUESE Private Torrent Tracker for 0DAY / GENERAL"
|
description: "BTNext (BTNT) is a PORTUGUESE Private Torrent Tracker for 0DAY / GENERAL"
|
||||||
@@ -6,7 +6,7 @@
|
|||||||
type: private
|
type: private
|
||||||
encoding: UTF-8
|
encoding: UTF-8
|
||||||
links:
|
links:
|
||||||
- http://tracker.btnext.com/
|
- http://tracker.btnext.com/ # site forces http, https is not supported
|
||||||
|
|
||||||
caps:
|
caps:
|
||||||
categorymappings:
|
categorymappings:
|
||||||
@@ -15,67 +15,80 @@
|
|||||||
- {id: 89, cat: Console, desc: "Games"}
|
- {id: 89, cat: Console, desc: "Games"}
|
||||||
- {id: 87, cat: TV, desc: "Series"}
|
- {id: 87, cat: TV, desc: "Series"}
|
||||||
- {id: 93, cat: Audio, desc: "Musica"}
|
- {id: 93, cat: Audio, desc: "Musica"}
|
||||||
|
- {id: 108, cat: Movies, desc: "ViP"}
|
||||||
- {id: 1, cat: Movies, desc: "Movies"}
|
- {id: 1, cat: Movies, desc: "Movies"}
|
||||||
- {id: 70, cat: Movies/3D, desc: "3D"}
|
- {id: 70, cat: Movies/3D, desc: "Movies 3D"}
|
||||||
- {id: 71, cat: Movies/Sd, desc: "480p"}
|
- {id: 71, cat: Movies/SD, desc: "Movies 480p"}
|
||||||
- {id: 72, cat: Movies/BluRay, desc: "BD-R"}
|
- {id: 72, cat: Movies/BluRay, desc: "Movies BD-R"}
|
||||||
- {id: 31, cat: Movies/HD, desc: "BDRIP/BRRip"}
|
- {id: 31, cat: Movies/HD, desc: "Movies BDRIP/BRRip"}
|
||||||
- {id: 16, cat: Movies/SD, desc: "CAM"}
|
- {id: 16, cat: Movies/SD, desc: "Movies CAM"}
|
||||||
- {id: 74, cat: Movies/DVD, desc: "DvD-R"}
|
- {id: 74, cat: Movies/DVD, desc: "Movies DvD-R"}
|
||||||
- {id: 17, cat: Movies/HD, desc: "HD"}
|
- {id: 76, cat: Movies, desc: "Movies Packs"}
|
||||||
- {id: 91, cat: Movies/Other, desc: "Kids"}
|
- {id: 115, cat: Movies/Other, desc: "Movies Kids"}
|
||||||
- {id: 76, cat: Movies, desc: "Packs"}
|
- {id: 91, cat: Movies/Other, desc: "Movies Kids Inglês"}
|
||||||
- {id: 77, cat: Movies/WEBDL, desc: "WEB-DL"}
|
- {id: 113, cat: Movies/Other, desc: "Movies Kids PT-BR"}
|
||||||
- {id: 14, cat: Movies/SD, desc: "DVDRip/XViD"}
|
- {id: 114, cat: Movies/Other, desc: "Movies Kids PT-PT"}
|
||||||
- {id: 85, cat: Movies/DVD, desc: "Custom-DVDR"}
|
- {id: 77, cat: Movies/WEBDL, desc: "Movies WEB-DL"}
|
||||||
- {id: 96, cat: Movies/HD, desc: "4K"}
|
- {id: 85, cat: Movies/DVD, desc: "Movies Custom-DVDR"}
|
||||||
- {id: 6, cat: PC, desc: "Applications"}
|
- {id: 14, cat: Movies/SD, desc: "Movies DVDRip/XViD"}
|
||||||
- {id: 18, cat: PC/ISO, desc: "PC Applications"}
|
- {id: 98, cat: Movies/Other, desc: "Movies Juvenil"}
|
||||||
- {id: 19, cat: PC/Mac, desc: "Macintosh Applications"}
|
- {id: 104, cat: Movies/UHD, desc: "Movies Bluray-UHD"}
|
||||||
- {id: 34, cat: PC/ISO, desc: "Linux Applications"}
|
- {id: 102, cat: Movies/HD, desc: "Movies HD-720p"}
|
||||||
- {id: 7, cat: Audio, desc: "Music"}
|
- {id: 101, cat: Movies/HD, desc: "Movies HD-1080p"}
|
||||||
- {id: 20, cat: Audio/Video, desc: "MVideo"}
|
- {id: 103, cat: Movies/UHD, desc: "Movies HD-2160p"}
|
||||||
- {id: 21, cat: Audio/MP3, desc: "Mp3"}
|
|
||||||
- {id: 33, cat: Audio/Other, desc: "Mp4"}
|
|
||||||
- {id: 32, cat: Audio/Lossless, desc: "FLAC"}
|
|
||||||
- {id: 2, cat: Console, desc: "Games"}
|
|
||||||
- {id: 78, cat: PC/Games, desc: "Linux"}
|
|
||||||
- {id: 79, cat: PC/Mac, desc: "MacOSX"}
|
|
||||||
- {id: 28, cat: Console/NDS, desc: "Nintendo DS"}
|
|
||||||
- {id: 27, cat: PC/Games, desc: "PC/Windows"}
|
|
||||||
- {id: 80, cat: Console/PS3, desc: "PS2"}
|
|
||||||
- {id: 81, cat: Console/PS3, desc: "PS3"}
|
|
||||||
- {id: 82, cat: Console/PS4, desc: "PS4"}
|
|
||||||
- {id: 83, cat: Console/PSP, desc: "PSP"}
|
|
||||||
- {id: 95, cat: Console/PSVita, desc: "PSVITA"}
|
|
||||||
- {id: 4, cat: Console/Wii, desc: "Wii"}
|
|
||||||
- {id: 26, cat: Console/Xbox360, desc: "XBOX360"}
|
|
||||||
- {id: 84, cat: Console/Xbox, desc: "XONE"}
|
|
||||||
- {id: 42, cat: TV, desc: "TV Series"}
|
- {id: 42, cat: TV, desc: "TV Series"}
|
||||||
- {id: 45, cat: TV/Documentary, desc: "Documentaries"}
|
- {id: 45, cat: TV/Documentary, desc: "Documentaries"}
|
||||||
- {id: 46, cat: TV/Sport, desc: "Sports"}
|
- {id: 46, cat: TV/Sport, desc: "Sports"}
|
||||||
- {id: 47, cat: TV/HD, desc: "TV-Bluray"}
|
- {id: 47, cat: TV/HD, desc: "TV Bluray"}
|
||||||
- {id: 48, cat: TV/SD, desc: "TV-Dvd-R"}
|
- {id: 48, cat: TV/SD, desc: "TV Dvd-R"}
|
||||||
- {id: 49, cat: TV/SD, desc: "TV-DVDRiP"}
|
- {id: 49, cat: TV/SD, desc: "TV DVDRiP"}
|
||||||
- {id: 50, cat: TV, desc: "TV-Packs"}
|
- {id: 50, cat: TV, desc: "TV Packs"}
|
||||||
- {id: 92, cat: TV/Anime, desc: "TV-Kids"}
|
- {id: 92, cat: TV, desc: "TV Kids"}
|
||||||
- {id: 52, cat: TV/SD, desc: "TV-SDx264"}
|
- {id: 112, cat: TV, desc: "TV Juvenil"}
|
||||||
- {id: 53, cat: TV/WEB-DL, desc: "TV-WEB-DL"}
|
- {id: 52, cat: TV/SD, desc: "TV SDx264"}
|
||||||
- {id: 55, cat: TV/HD, desc: "TV-X264"}
|
- {id: 53, cat: TV/WEB-DL, desc: "TV WEB-DL"}
|
||||||
|
- {id: 55, cat: TV/HD, desc: "TV X264"}
|
||||||
- {id: 56, cat: TV/SD, desc: "TV-XViD"}
|
- {id: 56, cat: TV/SD, desc: "TV-XViD"}
|
||||||
- {id: 44, cat: TV, desc: "Miscellaneous"}
|
- {id: 7, cat: Audio, desc: "Music"}
|
||||||
- {id: 51, cat: TV/Anime, desc: "Anime"}
|
- {id: 20, cat: Audio/Video, desc: "Music MVideo"}
|
||||||
- {id: 54, cat: Audio/Audiobook, desc: "Audiobook"}
|
- {id: 21, cat: Audio/MP3, desc: "Music MP3"}
|
||||||
- {id: 57, cat: Books, desc: "E-Books"}
|
- {id: 33, cat: Audio/Video, desc: "Music MP4"}
|
||||||
- {id: 58, cat: Books/Comics, desc: "Comics"}
|
- {id: 32, cat: Audio/Lossless, desc: "Music FLAC"}
|
||||||
- {id: 59, cat: Books, desc: "Educational"}
|
- {id: 2, cat: Console, desc: "Games"}
|
||||||
- {id: 60, cat: Books, desc: "Magazines/Journals"}
|
- {id: 78, cat: PC/Games, desc: "Games Linux"}
|
||||||
|
- {id: 79, cat: PC/Mac, desc: "Games MacOSX"}
|
||||||
|
- {id: 28, cat: Console/NDS, desc: "Games Nintendo DS"}
|
||||||
|
- {id: 27, cat: PC/Games, desc: "Games PC/Windows"}
|
||||||
|
- {id: 111, cat: Console, desc: "Games Nintendo Sw"}
|
||||||
|
- {id: 80, cat: Console/PS3, desc: "Games PS2"}
|
||||||
|
- {id: 81, cat: Console/PS3, desc: "Games PS3"}
|
||||||
|
- {id: 82, cat: Console/PS4, desc: "Games PS4"}
|
||||||
|
- {id: 83, cat: Console/PSP, desc: "Games PSP"}
|
||||||
|
- {id: 95, cat: Console/PSVita, desc: "Games PSVITA"}
|
||||||
|
- {id: 4, cat: Console/Wii, desc: "Games Wii"}
|
||||||
|
- {id: 26, cat: Console/Xbox360, desc: "Games XBOX360"}
|
||||||
|
- {id: 84, cat: Console/Xbox, desc: "Games XONE"}
|
||||||
|
- {id: 6, cat: PC, desc: "Applications"}
|
||||||
|
- {id: 18, cat: PC/ISO, desc: "Applications PC"}
|
||||||
|
- {id: 19, cat: PC/Mac, desc: "Applications Macintosh"}
|
||||||
|
- {id: 34, cat: PC/ISO, desc: "Applications Linux"}
|
||||||
|
- {id: 44, cat: Other, desc: "Miscellaneous"}
|
||||||
|
- {id: 54, cat: Audio/Audiobook, desc: "Books Audiobook"}
|
||||||
|
- {id: 57, cat: Books/Ebook, desc: "Books E-Books"}
|
||||||
|
- {id: 58, cat: Books/Comics, desc: "Books Comics"}
|
||||||
|
- {id: 59, cat: Books, desc: "Books Educational"}
|
||||||
|
- {id: 60, cat: Books/Magazines, desc: "Books Magazines/Journals"}
|
||||||
- {id: 61, cat: Other, desc: "Pics/Wallpapers"}
|
- {id: 61, cat: Other, desc: "Pics/Wallpapers"}
|
||||||
- {id: 62, cat: PC/Phone-Android, desc: "Android"}
|
- {id: 62, cat: PC/Phone-Android, desc: "Android"}
|
||||||
- {id: 63, cat: PC/Phone-IOS, desc: "iOS"}
|
- {id: 63, cat: PC/Phone-IOS, desc: "iOS"}
|
||||||
- {id: 66, cat: PC/Phone-Other, desc: "WindowsPhone"}
|
- {id: 66, cat: PC/Phone-Other, desc: "WindowsPhone"}
|
||||||
- {id: 90, cat: Other, desc: "GPS"}
|
- {id: 90, cat: Other, desc: "GPS"}
|
||||||
- {id: 68, cat: Other, desc: "Others"}
|
- {id: 68, cat: Other, desc: "Others"}
|
||||||
|
- {id: 100, cat: Other, desc: "Revistas"}
|
||||||
|
- {id: 109, cat: TV/Anime, desc: "Anime"}
|
||||||
|
- {id: 51, cat: TV/Anime, desc: "Anime Filmes"}
|
||||||
|
- {id: 99, cat: TV/Anime, desc: "Anime Hentai"}
|
||||||
|
- {id: 110, cat: TV/Anime, desc: "Anime TV Séries"}
|
||||||
- {id: 41, cat: XXX, desc: "XXX"}
|
- {id: 41, cat: XXX, desc: "XXX"}
|
||||||
- {id: 64, cat: XXX, desc: "XXX-Magazines"}
|
- {id: 64, cat: XXX, desc: "XXX-Magazines"}
|
||||||
- {id: 65, cat: XXX, desc: "XXX-Movies"}
|
- {id: 65, cat: XXX, desc: "XXX-Movies"}
|
||||||
@@ -83,8 +96,40 @@
|
|||||||
- {id: 69, cat: XXX/Imageset, desc: "XXX-Pics/Wallpapers"}
|
- {id: 69, cat: XXX/Imageset, desc: "XXX-Pics/Wallpapers"}
|
||||||
|
|
||||||
modes:
|
modes:
|
||||||
search: [q]
|
search: [q, imdbid]
|
||||||
tv-search: [q, season, ep]
|
tv-search: [q, season, ep, imdbid]
|
||||||
|
movie-search: [q, imdbid]
|
||||||
|
|
||||||
|
settings:
|
||||||
|
- name: username
|
||||||
|
type: text
|
||||||
|
label: Username
|
||||||
|
- name: password
|
||||||
|
type: password
|
||||||
|
label: Password
|
||||||
|
- name: info
|
||||||
|
type: info
|
||||||
|
label: Layout
|
||||||
|
default: "<ol><li>Only the English Classic profile is supported.<li>Make sure to set the <b>Torrent Listing (Lista de Torrents)</b> option in your profile to <b>Classic (Clássico)</b><li>Using the <i>Moderna</i> theme will prevent results.</ol>"
|
||||||
|
- name: sort
|
||||||
|
type: select
|
||||||
|
label: Sort requested from site
|
||||||
|
default: "added"
|
||||||
|
options:
|
||||||
|
"added": "created"
|
||||||
|
"seeders": "seeders"
|
||||||
|
"size": "size"
|
||||||
|
- name: type
|
||||||
|
type: select
|
||||||
|
label: Order requested from site
|
||||||
|
default: "desc"
|
||||||
|
options:
|
||||||
|
"desc": "desc"
|
||||||
|
"asc": "asc"
|
||||||
|
- name: info_results
|
||||||
|
type: info
|
||||||
|
label: Search results
|
||||||
|
default: "If you get 0 results check the log for error: <b>An error has occured!You can't view this page unless you read all your unread messages</b>, then access the site with your browser and <b>mark as read</b> all PMs."
|
||||||
|
|
||||||
login:
|
login:
|
||||||
path: ?p=home&pid=1
|
path: ?p=home&pid=1
|
||||||
@@ -92,7 +137,7 @@
|
|||||||
form: form#loginbox_form
|
form: form#loginbox_form
|
||||||
submitpath: /ajax/login.php
|
submitpath: /ajax/login.php
|
||||||
inputs:
|
inputs:
|
||||||
action: "login"
|
action: login
|
||||||
loginbox_membername: "{{ .Config.username }}"
|
loginbox_membername: "{{ .Config.username }}"
|
||||||
loginbox_password: "{{ .Config.password }}"
|
loginbox_password: "{{ .Config.password }}"
|
||||||
loginbox_remember: 1
|
loginbox_remember: 1
|
||||||
@@ -111,16 +156,18 @@
|
|||||||
search:
|
search:
|
||||||
paths:
|
paths:
|
||||||
- path: /
|
- path: /
|
||||||
keywordsfilters:
|
keywordsfilters:
|
||||||
- name: re_replace
|
- name: re_replace
|
||||||
args: ["[^a-zA-Z0-9]+", "%25"]
|
args: ["[^a-zA-Z0-9]+", "%25"]
|
||||||
inputs:
|
inputs:
|
||||||
p: torrents
|
p: torrents
|
||||||
pid: 32
|
pid: 32
|
||||||
$raw: "{{ range .Categories }}cid[]={{.}}&{{end}}"
|
$raw: "{{ range .Categories }}cid[]={{.}}&{{end}}"
|
||||||
keywords: "{{ .Keywords }}"
|
keywords: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{else}}{{ .Keywords }}{{end}}"
|
||||||
search_type: name
|
# name , description , both , uploader
|
||||||
searchin: title
|
search_type: "{{ if .Query.IMDBID }}description{{else}}name{{end}}"
|
||||||
|
"sortOptions[sortBy]": "{{ .Config.sort }}"
|
||||||
|
"sortOptions[sortOrder]": "{{ .Config.type }}"
|
||||||
error:
|
error:
|
||||||
- selector: div.error:not(:contains("Não existem resultados encontrados.")):not(:contains("There are no results found."))
|
- selector: div.error:not(:contains("Não existem resultados encontrados.")):not(:contains("There are no results found."))
|
||||||
|
|
||||||
@@ -154,28 +201,62 @@
|
|||||||
selector: a[rel="fancybox"]
|
selector: a[rel="fancybox"]
|
||||||
optional: true
|
optional: true
|
||||||
attribute: href
|
attribute: href
|
||||||
|
imdb:
|
||||||
|
# a href="http://tracker.btnext.com/data/torrents/imdb/tt0249677.jpg"
|
||||||
|
optional: true
|
||||||
|
selector: a[href*="/imdb/tt"]
|
||||||
|
attribute: href
|
||||||
|
filters:
|
||||||
|
- name: regexp
|
||||||
|
args: "imdb/(.+?).jpg"
|
||||||
|
- name: prepend
|
||||||
|
args: "https://www.imdb.com/title/"
|
||||||
downloadvolumefactor:
|
downloadvolumefactor:
|
||||||
case:
|
case:
|
||||||
"img[title=\"FREE!\"]": 0
|
"img[title=\"FREE!\"]": 0
|
||||||
"*": 1
|
"*": 1
|
||||||
uploadvolumefactor:
|
uploadvolumefactor:
|
||||||
case:
|
text: 1
|
||||||
"*": 1
|
|
||||||
date:
|
date:
|
||||||
selector: td.torrent_name > abbr.timeago
|
selector: td.torrent_name > abbr.timeago
|
||||||
optional: true
|
optional: true
|
||||||
attribute: data-time
|
attribute: data-time
|
||||||
date:
|
date:
|
||||||
selector: td.torrent_name:not(:has(abbr.timeago))
|
selector: td.torrent_name:not(:has(abbr.timeago)):not(:contains("day")):not(:contains("Domingo")):not(:contains("Sábado")):not(:contains("Sexta")):not(:contains("Quinta")):not(:contains("Quarta")):not(:contains("Terça")):not(:contains("Segunda")):not(:contains("ontem")):not(:contains("Hoje"))
|
||||||
optional: true
|
optional: true
|
||||||
remove: span, a, br
|
remove: span, a, br
|
||||||
filters:
|
filters:
|
||||||
- name: replace
|
- name: replace
|
||||||
args: ["Enviado ", ""] # Uploaded
|
args: ["Enviado ", ""] # Uploaded
|
||||||
|
- name: replace
|
||||||
|
args: ["Uploaded ", ""]
|
||||||
- name: replace
|
- name: replace
|
||||||
args: [" por", ""] # by
|
args: [" por", ""] # by
|
||||||
|
- name: replace
|
||||||
|
args: [" by", ""]
|
||||||
- name: replace
|
- name: replace
|
||||||
args: ["às ", ""] # at
|
args: ["às ", ""] # at
|
||||||
|
- name: replace
|
||||||
|
args: ["at ", ""]
|
||||||
|
- name: dateparse
|
||||||
|
args: "02-01-2006 15:04"
|
||||||
|
date:
|
||||||
|
selector: td.torrent_name:not(:has(abbr.timeago)):contains("day"), td.torrent_name:not(:has(abbr.timeago)):contains("Domingo"), td.torrent_name:not(:has(abbr.timeago)):contains("Sábado"), td.torrent_name:not(:has(abbr.timeago)):contains("Quinta"), td.torrent_name:not(:has(abbr.timeago)):contains("Sexta"), td.torrent_name:not(:has(abbr.timeago)):contains("Quarta"), td.torrent_name:not(:has(abbr.timeago)):contains("Terça"), td.torrent_name:not(:has(abbr.timeago)):contains("Segunda"), td.torrent_name:not(:has(abbr.timeago)):contains("ontem"), td.torrent_name:not(:has(abbr.timeago)):contains("Hoje")
|
||||||
|
optional: true
|
||||||
|
remove: span, a, br
|
||||||
|
filters:
|
||||||
|
- name: replace
|
||||||
|
args: ["Enviado ", ""] # Uploaded
|
||||||
|
- name: replace
|
||||||
|
args: ["Uploaded ", ""]
|
||||||
|
- name: replace
|
||||||
|
args: [" por", ""] # by
|
||||||
|
- name: replace
|
||||||
|
args: [" by", ""]
|
||||||
|
- name: replace
|
||||||
|
args: ["às ", ""] # at
|
||||||
|
- name: replace
|
||||||
|
args: ["at ", ""]
|
||||||
- name: replace
|
- name: replace
|
||||||
args: ["Hoje", "Today"]
|
args: ["Hoje", "Today"]
|
||||||
- name: replace
|
- name: replace
|
||||||
@@ -194,6 +275,5 @@
|
|||||||
args: ["Sábado", "Saturday"]
|
args: ["Sábado", "Saturday"]
|
||||||
- name: replace
|
- name: replace
|
||||||
args: ["Domingo", "Sunday"]
|
args: ["Domingo", "Sunday"]
|
||||||
- name: dateparse
|
- name: fuzzytime
|
||||||
args: "02-01-2006 15:04"
|
|
||||||
# TSUE 2.2
|
# TSUE 2.2
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
---
|
---
|
||||||
site: btschool
|
site: btschool
|
||||||
name: BTSCHOOL
|
name: BTSCHOOL
|
||||||
description: "BTSCHOOL is a CHINESE Private Torrent Tracker for MOVIES / TV / GENERAL"
|
description: "BTSCHOOL is a CHINESE Private Torrent Tracker for MOVIES / TV / GENERAL"
|
||||||
@@ -23,28 +23,27 @@
|
|||||||
- {id: 415, cat: Other, desc: "其他/Other"}
|
- {id: 415, cat: Other, desc: "其他/Other"}
|
||||||
|
|
||||||
modes:
|
modes:
|
||||||
search: [q]
|
search: [q, imdbid]
|
||||||
tv-search: [q, season, ep, imdbid]
|
tv-search: [q, season, ep, imdbid]
|
||||||
movie-search: [q, imdbid]
|
movie-search: [q, imdbid]
|
||||||
|
|
||||||
|
settings:
|
||||||
|
- name: cookie
|
||||||
|
type: text
|
||||||
|
label: Cookie
|
||||||
|
- name: info
|
||||||
|
type: info
|
||||||
|
label: How to get the Cookie
|
||||||
|
default: "<ol><li>Login to this tracker in your browser<li>Open the <b>DevTools</b> panel by pressing <b>F12</b><li>Select the <b>Network</b> tab<li>Click on the <b>Doc</b> button<li>Refresh the page by pressing <b>F5</b><li>Select the <b>Headers</b> tab<li>Find 'cookie:' in the <b>Request Headers</b> section<li>Copy & paste the whole cookie string to here</ol>"
|
||||||
|
|
||||||
login:
|
login:
|
||||||
path: login.php
|
method: cookie
|
||||||
method: form
|
|
||||||
form: form[action="takelogin.php"]
|
|
||||||
captcha:
|
|
||||||
type: image
|
|
||||||
selector: img[alt="CAPTCHA"]
|
|
||||||
input: imagestring
|
|
||||||
inputs:
|
inputs:
|
||||||
username: "{{ .Config.username }}"
|
cookie: "{{ .Config.cookie }}"
|
||||||
password: "{{ .Config.password }}"
|
|
||||||
error:
|
|
||||||
- selector: td.embedded:has(h2:contains("登錄失敗"))
|
|
||||||
- selector: td.embedded:has(h2:contains("失败"))
|
|
||||||
test:
|
test:
|
||||||
path: index.php
|
path: index.php
|
||||||
selector: a[href="logout.php"]
|
selector: a[href="logout.php"]
|
||||||
|
|
||||||
search:
|
search:
|
||||||
paths:
|
paths:
|
||||||
- path: torrents.php
|
- path: torrents.php
|
||||||
@@ -79,7 +78,7 @@
|
|||||||
attribute: title
|
attribute: title
|
||||||
details:
|
details:
|
||||||
selector: a[title][href^="details.php?id="]
|
selector: a[title][href^="details.php?id="]
|
||||||
attribute: href
|
attribute: href
|
||||||
download:
|
download:
|
||||||
selector: a[href^="download.php?id="]
|
selector: a[href^="download.php?id="]
|
||||||
attribute: href
|
attribute: href
|
||||||
|
|||||||
@@ -6,9 +6,10 @@
|
|||||||
type: public
|
type: public
|
||||||
encoding: UTF-8
|
encoding: UTF-8
|
||||||
links:
|
links:
|
||||||
- https://btio.pw/
|
- https://btsow.club/
|
||||||
legacylinks:
|
legacylinks:
|
||||||
- https://btos.pw/
|
- https://btos.pw/
|
||||||
|
- https://btio.pw/
|
||||||
|
|
||||||
caps:
|
caps:
|
||||||
categories:
|
categories:
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
---
|
---
|
||||||
site: carpathians
|
site: carpathians
|
||||||
name: Carpathians
|
name: Carpathians
|
||||||
description: "Carpathians is a HUNGARIAN Private Torrent Tracker for 0DAY / GENERAL"
|
description: "Carpathians is a HUNGARIAN Private Torrent Tracker for 0DAY / GENERAL"
|
||||||
@@ -38,9 +38,33 @@
|
|||||||
- {id: 110, cat: XXX, desc: "XXX"}
|
- {id: 110, cat: XXX, desc: "XXX"}
|
||||||
|
|
||||||
modes:
|
modes:
|
||||||
search: [q]
|
search: [q, imdbid]
|
||||||
tv-search: [q, season, ep]
|
tv-search: [q, season, ep, imdbid]
|
||||||
movie-search: [q]
|
movie-search: [q, imdbid]
|
||||||
|
|
||||||
|
settings:
|
||||||
|
- name: username
|
||||||
|
type: text
|
||||||
|
label: Username
|
||||||
|
- name: password
|
||||||
|
type: password
|
||||||
|
label: Password
|
||||||
|
- name: sort
|
||||||
|
type: select
|
||||||
|
label: Sort requested from site
|
||||||
|
default: "5"
|
||||||
|
options:
|
||||||
|
"5": "created"
|
||||||
|
"8": "seeders"
|
||||||
|
"6": "size"
|
||||||
|
"2": "title"
|
||||||
|
- name: type
|
||||||
|
type: select
|
||||||
|
label: Order requested from site
|
||||||
|
default: "desc"
|
||||||
|
options:
|
||||||
|
"desc": "desc"
|
||||||
|
"asc": "asc"
|
||||||
|
|
||||||
login:
|
login:
|
||||||
path: takelogin.php
|
path: takelogin.php
|
||||||
@@ -55,13 +79,18 @@
|
|||||||
paths:
|
paths:
|
||||||
- path: browse.php
|
- path: browse.php
|
||||||
inputs:
|
inputs:
|
||||||
$raw: "{{range .Categories}}c{{.}}=1&{{end}}"
|
$raw: "{{ range .Categories }}c{{.}}=1&{{end}}"
|
||||||
search: "{{ .Keywords }}"
|
search: "{{ if .Query.IMDBID }}https://www.imdb.com/title/{{ .Query.IMDBID }}{{else}}{{ .Keywords }}{{end}}"
|
||||||
|
# 0 both 1 only active 2 only dead
|
||||||
incldead: 0
|
incldead: 0
|
||||||
onlyname: 1
|
onlyname: 1
|
||||||
onlyname2: true
|
onlyname2: true
|
||||||
|
sort: "{{ .Config.sort }}"
|
||||||
|
type: "{{ .Config.type }}"
|
||||||
|
|
||||||
rows:
|
rows:
|
||||||
selector: table[id!="torrent_ajanlo"] > tbody > tr[id]
|
selector: table[id!="torrent_ajanlo"] > tbody > tr[id]
|
||||||
|
|
||||||
fields:
|
fields:
|
||||||
download:
|
download:
|
||||||
selector: a[href^="download.php/"]
|
selector: a[href^="download.php/"]
|
||||||
@@ -84,7 +113,7 @@
|
|||||||
selector: a[id][href^="details.php?"]
|
selector: a[id][href^="details.php?"]
|
||||||
attribute: href
|
attribute: href
|
||||||
imdb:
|
imdb:
|
||||||
selector: a[href*="https://www.imdb.com/title/"]
|
selector: a[href*="www.imdb.com/title/tt"]
|
||||||
optional: true
|
optional: true
|
||||||
attribute: href
|
attribute: href
|
||||||
banner:
|
banner:
|
||||||
@@ -99,7 +128,7 @@
|
|||||||
selector: td:nth-child(7)
|
selector: td:nth-child(7)
|
||||||
filters:
|
filters:
|
||||||
- name: regexp
|
- name: regexp
|
||||||
args: ([\d\.]+)
|
args: (\d+)
|
||||||
seeders:
|
seeders:
|
||||||
selector: td:nth-child(8)
|
selector: td:nth-child(8)
|
||||||
leechers:
|
leechers:
|
||||||
@@ -123,9 +152,10 @@
|
|||||||
args: ["hete", "week"]
|
args: ["hete", "week"]
|
||||||
- name: timeago
|
- name: timeago
|
||||||
downloadvolumefactor:
|
downloadvolumefactor:
|
||||||
case:
|
text: 1
|
||||||
"*": "1"
|
|
||||||
uploadvolumefactor:
|
uploadvolumefactor:
|
||||||
case:
|
case:
|
||||||
img[src="pic/double.png"]: "2"
|
img[src="pic/double.png"]: 2
|
||||||
"*": "1"
|
img[src="pic/doubledouble2.png"]: 4
|
||||||
|
"*": 1
|
||||||
|
# TBDev & XBTT
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
---
|
---
|
||||||
site: cartoonchaos
|
site: cartoonchaos
|
||||||
name: CartoonChaos
|
name: CartoonChaos
|
||||||
description: "CartoonChaos (CC) is a Private Torrent Tracker for ANIMATED MOVIES / TV"
|
description: "CartoonChaos (CC) is a Private Torrent Tracker for ANIMATED MOVIES / TV"
|
||||||
@@ -6,7 +6,7 @@
|
|||||||
type: private
|
type: private
|
||||||
encoding: UTF-8
|
encoding: UTF-8
|
||||||
links:
|
links:
|
||||||
- http://www.cartoonchaos.org/
|
- http://www.cartoonchaos.org/ # site does not support https NET::ERR_CERT_AUTHORITY_INVALID
|
||||||
|
|
||||||
settings:
|
settings:
|
||||||
- name: username
|
- name: username
|
||||||
@@ -59,6 +59,7 @@
|
|||||||
search: [q, imdbid]
|
search: [q, imdbid]
|
||||||
tv-search: [q, season, ep, imdbid]
|
tv-search: [q, season, ep, imdbid]
|
||||||
movie-search: [q, imdbid]
|
movie-search: [q, imdbid]
|
||||||
|
music-search: [q]
|
||||||
|
|
||||||
login:
|
login:
|
||||||
path: index.php?page=login
|
path: index.php?page=login
|
||||||
@@ -81,8 +82,9 @@
|
|||||||
page: torrents
|
page: torrents
|
||||||
search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{else}}{{ .Keywords }}{{end}}"
|
search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{else}}{{ .Keywords }}{{end}}"
|
||||||
category: "{{ if .Categories }}{{ range .Categories }}{{.}};{{end}}{{else}}0{{end}}"
|
category: "{{ if .Categories }}{{ range .Categories }}{{.}};{{end}}{{else}}0{{end}}"
|
||||||
# options: 0=title, 1=title&descr, 2=descr
|
# 0=title, 1=title&descr, 2=descr
|
||||||
options: "{{ if .Query.IMDBID }}1{{else}}0{{end}}"
|
options: "{{ if .Query.IMDBID }}2{{else}}0{{end}}"
|
||||||
|
# 0 all 1 activeonly 2 deadonly
|
||||||
active: 0
|
active: 0
|
||||||
order: "{{ .Config.sort }}"
|
order: "{{ .Config.sort }}"
|
||||||
by: "{{ .Config.type }}"
|
by: "{{ .Config.type }}"
|
||||||
@@ -115,6 +117,14 @@
|
|||||||
args: [" http://anonym.to?javascript:popdetails('", ""]
|
args: [" http://anonym.to?javascript:popdetails('", ""]
|
||||||
- name: replace
|
- name: replace
|
||||||
args: ["');", ""]
|
args: ["');", ""]
|
||||||
|
banner:
|
||||||
|
selector: td a[href^="index.php?page=torrent-details"]
|
||||||
|
attribute: onmouseover
|
||||||
|
filters:
|
||||||
|
- name: regexp
|
||||||
|
args: "src=(.+?) width"
|
||||||
|
- name: replace
|
||||||
|
args: ["torrentimg/nocover.jpg", ""]
|
||||||
size:
|
size:
|
||||||
selector: td:nth-child(10)
|
selector: td:nth-child(10)
|
||||||
# two flavours of dates
|
# two flavours of dates
|
||||||
@@ -146,4 +156,4 @@
|
|||||||
"*": 1
|
"*": 1
|
||||||
uploadvolumefactor:
|
uploadvolumefactor:
|
||||||
text: 1
|
text: 1
|
||||||
# xbtit 2.0.0
|
# xbtit 2.0.0
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
---
|
---
|
||||||
site: casatorrent
|
site: casatorrent
|
||||||
name: Casa-Torrent
|
name: Casa-Torrent
|
||||||
description: "Casa-Torrent is a FRENCH Private Torrent Tracker for MOVIES / TV / GENERAL"
|
description: "Casa-Torrent is a FRENCH Private Torrent Tracker for MOVIES / TV / GENERAL"
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
---
|
---
|
||||||
site: casstudiotv
|
site: casstudiotv
|
||||||
name: CasStudioTV
|
name: CasStudioTV
|
||||||
description: "CasStudioTV is a RUSSIAN Semi-Private Torrent Tracker for TV"
|
description: "CasStudioTV is a RUSSIAN Semi-Private Torrent Tracker for TV"
|
||||||
|
|||||||
@@ -42,9 +42,33 @@
|
|||||||
- {id: 22, cat: Other, desc: "杂项"}
|
- {id: 22, cat: Other, desc: "杂项"}
|
||||||
|
|
||||||
modes:
|
modes:
|
||||||
search: [q]
|
search: [q, imdbid]
|
||||||
tv-search: [q, season, ep]
|
tv-search: [q, season, ep, imdbid]
|
||||||
movie-search: [q]
|
movie-search: [q, imdbid]
|
||||||
|
|
||||||
|
settings:
|
||||||
|
- name: username
|
||||||
|
type: text
|
||||||
|
label: Username
|
||||||
|
- name: password
|
||||||
|
type: password
|
||||||
|
label: Password
|
||||||
|
- name: sort
|
||||||
|
type: select
|
||||||
|
label: Sort requested from site
|
||||||
|
default: "added"
|
||||||
|
options:
|
||||||
|
"added": "created"
|
||||||
|
"seeders": "seeders"
|
||||||
|
"size": "size"
|
||||||
|
"name": "title"
|
||||||
|
- name: type
|
||||||
|
type: select
|
||||||
|
label: Order requested from site
|
||||||
|
default: "DESC"
|
||||||
|
options:
|
||||||
|
"DESC": "desc"
|
||||||
|
"ASC": "asc"
|
||||||
|
|
||||||
login:
|
login:
|
||||||
path: takelogin.php
|
path: takelogin.php
|
||||||
@@ -60,13 +84,14 @@
|
|||||||
search:
|
search:
|
||||||
paths:
|
paths:
|
||||||
- path: browse.php
|
- path: browse.php
|
||||||
method: get
|
|
||||||
inputs:
|
inputs:
|
||||||
$raw: "{{ range .Categories }}c{{.}}=1&{{end}}"
|
$raw: "{{ range .Categories }}c{{.}}=1&{{end}}"
|
||||||
search: "{{ .Keywords }}"
|
search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{else}}{{ .Keywords }}{{end}}"
|
||||||
|
# 0 active 1 incldead 2 deadonly
|
||||||
incldead: 1
|
incldead: 1
|
||||||
sort: added
|
fullsearch: "{{ if .Query.IMDBID }}1{{else}}{{end}}"
|
||||||
d: DESC
|
sort: "{{ .Config.sort }}"
|
||||||
|
d: "{{ .Config.sort }}"
|
||||||
|
|
||||||
rows:
|
rows:
|
||||||
selector: table[border="1"][cellpadding="5"] > tbody > tr:has(a[href^="details.php?id="])
|
selector: table[border="1"][cellpadding="5"] > tbody > tr:has(a[href^="details.php?id="])
|
||||||
@@ -86,7 +111,7 @@
|
|||||||
args: cat
|
args: cat
|
||||||
details:
|
details:
|
||||||
selector: a[href^="details.php?id="]
|
selector: a[href^="details.php?id="]
|
||||||
attribute: href
|
attribute: href
|
||||||
download:
|
download:
|
||||||
selector: a[href^="download.php/"]
|
selector: a[href^="download.php/"]
|
||||||
attribute: href
|
attribute: href
|
||||||
@@ -122,7 +147,10 @@
|
|||||||
"*": 1
|
"*": 1
|
||||||
uploadvolumefactor:
|
uploadvolumefactor:
|
||||||
case:
|
case:
|
||||||
|
"font:has([src=\"/pic/arrowup1.gif\"]):contains(\"1.5x\")": 1.5
|
||||||
|
"font:has([src=\"/pic/arrowup1.gif\"]):contains(\"2x\")": 2
|
||||||
"*": 1
|
"*": 1
|
||||||
description:
|
description:
|
||||||
selector: td:nth-child(2) > table > tbody > tr:nth-child(2)
|
selector: td:nth-child(2) > table > tbody > tr:nth-child(2)
|
||||||
remove: a, img
|
remove: a, img
|
||||||
|
# Discuz! 7.2
|
||||||
|
|||||||
@@ -18,7 +18,7 @@
|
|||||||
- {id: 4, cat: TV/Sport, desc: "Sports"}
|
- {id: 4, cat: TV/Sport, desc: "Sports"}
|
||||||
|
|
||||||
modes:
|
modes:
|
||||||
search: [q]
|
search: [q, imdbid]
|
||||||
tv-search: [q, season, ep, imdbid]
|
tv-search: [q, season, ep, imdbid]
|
||||||
movie-search: [q, imdbid]
|
movie-search: [q, imdbid]
|
||||||
|
|
||||||
@@ -85,8 +85,10 @@
|
|||||||
sort: "{{ .Config.sort }}"
|
sort: "{{ .Config.sort }}"
|
||||||
direction: "{{ .Config.type }}"
|
direction: "{{ .Config.type }}"
|
||||||
qty: 100
|
qty: 100
|
||||||
|
|
||||||
rows:
|
rows:
|
||||||
selector: table > tbody > tr
|
selector: table > tbody > tr
|
||||||
|
|
||||||
fields:
|
fields:
|
||||||
category:
|
category:
|
||||||
selector: a[href*="/categories/"]
|
selector: a[href*="/categories/"]
|
||||||
|
|||||||
@@ -6,9 +6,10 @@
|
|||||||
type: public
|
type: public
|
||||||
encoding: UTF-8
|
encoding: UTF-8
|
||||||
links:
|
links:
|
||||||
- http://www.cilijj.xyz/
|
- https://www.cilijj.xyz/
|
||||||
legacylinks:
|
legacylinks:
|
||||||
- http://www.cili180.com/
|
- http://www.cili180.com/
|
||||||
|
- http://www.cilijj.xyz/
|
||||||
|
|
||||||
caps:
|
caps:
|
||||||
categories:
|
categories:
|
||||||
|
|||||||
@@ -6,6 +6,8 @@
|
|||||||
type: private
|
type: private
|
||||||
encoding: UTF-8
|
encoding: UTF-8
|
||||||
links:
|
links:
|
||||||
|
- https://cinemageddon.net/
|
||||||
|
legacylinks:
|
||||||
- http://cinemageddon.net/
|
- http://cinemageddon.net/
|
||||||
|
|
||||||
caps:
|
caps:
|
||||||
@@ -45,7 +47,7 @@
|
|||||||
- selector: table:contains("Login failed!")
|
- selector: table:contains("Login failed!")
|
||||||
test:
|
test:
|
||||||
path: index.php
|
path: index.php
|
||||||
|
|
||||||
search:
|
search:
|
||||||
paths:
|
paths:
|
||||||
- path: browse.php
|
- path: browse.php
|
||||||
@@ -94,4 +96,4 @@
|
|||||||
"*": "1"
|
"*": "1"
|
||||||
uploadvolumefactor:
|
uploadvolumefactor:
|
||||||
case:
|
case:
|
||||||
"*": "1"
|
"*": "1"
|
||||||
|
|||||||
@@ -31,9 +31,9 @@
|
|||||||
- {id: 21, cat: Books, desc: "Book"}
|
- {id: 21, cat: Books, desc: "Book"}
|
||||||
|
|
||||||
modes:
|
modes:
|
||||||
search: [q]
|
search: [q, imdbid]
|
||||||
tv-search: [q, season, ep]
|
tv-search: [q, season, ep, imdbid]
|
||||||
movie-search: [q]
|
movie-search: [q, imdbid]
|
||||||
|
|
||||||
settings:
|
settings:
|
||||||
- name: cookie
|
- name: cookie
|
||||||
@@ -67,17 +67,19 @@
|
|||||||
test:
|
test:
|
||||||
path: index.php
|
path: index.php
|
||||||
selector: a[href^="/logout.php"]
|
selector: a[href^="/logout.php"]
|
||||||
|
|
||||||
search:
|
search:
|
||||||
paths:
|
paths:
|
||||||
- path: browse.php
|
- path: browse.php
|
||||||
inputs:
|
inputs:
|
||||||
$raw: "{{ range .Categories }}c{{.}}=1&{{end}}"
|
$raw: "{{ range .Categories }}c{{.}}=1&{{end}}"
|
||||||
search: "{{ .Keywords }}"
|
search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{else}}{{ .Keywords }}{{end}}"
|
||||||
# 0 onlyactive 1 all 4 requests 5 onlydead 6 polish 8 free 10 doubleup 11 premier 13 VOD
|
# 0 onlyactive 1 all 4 requests 5 onlydead 6 polish 8 free 10 doubleup 11 premier 13 VOD
|
||||||
incldead: 1
|
incldead: 1
|
||||||
# 0 title 1 descr
|
# 0 title 1 descr
|
||||||
blah: 0
|
blah: "{{ if .Query.IMDBID }}1{{else}}0{{end}}"
|
||||||
|
gatunek: 0
|
||||||
|
quality: none
|
||||||
sort: "{{ .Config.sort }}"
|
sort: "{{ .Config.sort }}"
|
||||||
type: "{{ .Config.type }}"
|
type: "{{ .Config.type }}"
|
||||||
|
|
||||||
@@ -98,13 +100,17 @@
|
|||||||
attribute: href
|
attribute: href
|
||||||
download:
|
download:
|
||||||
selector: a[href^="download.php/"]
|
selector: a[href^="download.php/"]
|
||||||
attribute: href
|
attribute: href
|
||||||
banner:
|
banner:
|
||||||
selector: a[href^="details.php?id="]
|
selector: a[href^="details.php?id="]
|
||||||
attribute: onmouseover
|
attribute: onmouseover
|
||||||
filters:
|
filters:
|
||||||
- name: regexp
|
- name: regexp
|
||||||
args: "src=(.+?) "
|
args: "src=(.+?) "
|
||||||
|
imdb:
|
||||||
|
optional: true
|
||||||
|
selector: a[href*="www.imdb.com/title/tt"]
|
||||||
|
attribute: href
|
||||||
description:
|
description:
|
||||||
optional: true
|
optional: true
|
||||||
selector: img[src="pic/Poland.png"]
|
selector: img[src="pic/Poland.png"]
|
||||||
|
|||||||
@@ -117,4 +117,4 @@
|
|||||||
uploadvolumefactor:
|
uploadvolumefactor:
|
||||||
case:
|
case:
|
||||||
"img[title=\"Platinum Torrent: No Download Stats are Recorded, Upload Stats are Doubled!\"]": 2
|
"img[title=\"Platinum Torrent: No Download Stats are Recorded, Upload Stats are Doubled!\"]": 2
|
||||||
"*": 1
|
"*": 1
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
type: private
|
type: private
|
||||||
encoding: UTF-8
|
encoding: UTF-8
|
||||||
links:
|
links:
|
||||||
- http://classix-unlimited.co.uk/
|
- http://classix-unlimited.co.uk/ # site does not support https ERR_CONNECTION_CLOSED
|
||||||
|
|
||||||
caps:
|
caps:
|
||||||
categorymappings:
|
categorymappings:
|
||||||
@@ -63,4 +63,4 @@
|
|||||||
"*": "1"
|
"*": "1"
|
||||||
uploadvolumefactor:
|
uploadvolumefactor:
|
||||||
case:
|
case:
|
||||||
"*": "1"
|
"*": "1"
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
---
|
---
|
||||||
site: cpasbien
|
site: cpasbien
|
||||||
name: cpasbien
|
name: cpasbien
|
||||||
description: "cpasbien is a FRENCH Public site for TV / MOVIES / GENERAL"
|
description: "cpasbien is a FRENCH Public site for TV / MOVIES / GENERAL"
|
||||||
@@ -7,7 +7,7 @@
|
|||||||
encoding: UTF-8
|
encoding: UTF-8
|
||||||
followredirect: true
|
followredirect: true
|
||||||
links:
|
links:
|
||||||
- https://vww.cpasbien-fr.fr/
|
- https://wvw.cpasbien-fr.fr/
|
||||||
legacylinks:
|
legacylinks:
|
||||||
- http://www.cpasbiens.cc/
|
- http://www.cpasbiens.cc/
|
||||||
- http://www.cpabien.cm/
|
- http://www.cpabien.cm/
|
||||||
@@ -38,6 +38,7 @@
|
|||||||
- https://www.cpasbien.vg/
|
- https://www.cpasbien.vg/
|
||||||
- https://www.cpasbien.lol/
|
- https://www.cpasbien.lol/
|
||||||
- https://www.gktorrent.biz/
|
- https://www.gktorrent.biz/
|
||||||
|
- https://vww.cpasbien-fr.fr/
|
||||||
|
|
||||||
caps:
|
caps:
|
||||||
categorymappings:
|
categorymappings:
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
---
|
---
|
||||||
site: crazyscorner
|
site: crazyscorner
|
||||||
name: Crazy's Corner
|
name: Crazy's Corner
|
||||||
description: "Crazy's Corner is a Private Torrent Tracker for MUSIC"
|
description: "Crazy's Corner is a Private Torrent Tracker for MUSIC"
|
||||||
@@ -6,7 +6,7 @@
|
|||||||
type: private
|
type: private
|
||||||
encoding: UTF-8
|
encoding: UTF-8
|
||||||
links:
|
links:
|
||||||
- http://crazys-corner.info/
|
- http://crazys-corner.info/ # site does not support https ERR_CONNECTION_REFUSED
|
||||||
|
|
||||||
caps:
|
caps:
|
||||||
categorymappings:
|
categorymappings:
|
||||||
@@ -132,9 +132,6 @@
|
|||||||
download:
|
download:
|
||||||
selector: a[href*="/details.php?id="]
|
selector: a[href*="/details.php?id="]
|
||||||
attribute: href
|
attribute: href
|
||||||
magnet:
|
|
||||||
selector: a[href^="magnet:?xt="]
|
|
||||||
attribute: href
|
|
||||||
banner:
|
banner:
|
||||||
selector: img[src*="/torrents/images/"]
|
selector: img[src*="/torrents/images/"]
|
||||||
attribute: src
|
attribute: src
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
---
|
---
|
||||||
site: crazyspirits
|
site: crazyspirits
|
||||||
name: CrazySpirits
|
name: CrazySpirits
|
||||||
description: "Crazy Spirits is a FRENCH Private Torrent Tracker for MOVIES / TV / GENERAL"
|
description: "Crazy Spirits is a FRENCH Private Torrent Tracker for MOVIES / TV / GENERAL"
|
||||||
@@ -12,20 +12,21 @@
|
|||||||
categorymappings:
|
categorymappings:
|
||||||
# Documentaire
|
# Documentaire
|
||||||
- {id: 96, cat: TV/Documentary, desc: "Docus TV"}
|
- {id: 96, cat: TV/Documentary, desc: "Docus TV"}
|
||||||
|
- {id: 124, cat: TV/Documentary, desc: "Docus Formation Video"}
|
||||||
# Films
|
# Films
|
||||||
- {id: 49, cat: Movies/3D, desc: "Films 3D"}
|
- {id: 49, cat: Movies/3D, desc: "Films 3D"}
|
||||||
- {id: 1, cat: XXX, desc: "3X"}
|
- {id: 1, cat: XXX, desc: "3X"}
|
||||||
- {id: 48, cat: XXX, desc: "3X HD1080p"}
|
- {id: 48, cat: XXX, desc: "3X HD1080p"}
|
||||||
- {id: 47, cat: XXX, desc: "3X HD720p"}
|
- {id: 47, cat: XXX, desc: "3X HD720p"}
|
||||||
- {id: 50, cat: Movies/UHD, desc: "Films 4K"}
|
- {id: 50, cat: Movies/UHD, desc: "Films 4K"}
|
||||||
- {id: 51, cat: Movies/UHD, desc: "Films 4K UHDTV"}
|
- {id: 51, cat: TV/UHD, desc: "Films 4K UHDTV"}
|
||||||
- {id: 57, cat: Movies/BluRay, desc: "Films BDRip"}
|
- {id: 57, cat: Movies/BluRay, desc: "Films BDRip"}
|
||||||
- {id: 56, cat: Movies/BluRay, desc: "Films Blu-Ray"}
|
- {id: 56, cat: Movies/BluRay, desc: "Films Blu-Ray"}
|
||||||
- {id: 58, cat: Movies/BluRay, desc: "Films BRRip"}
|
- {id: 58, cat: Movies/BluRay, desc: "Films BRRip"}
|
||||||
- {id: 66, cat: Movies, desc: "Films CamTS"}
|
- {id: 66, cat: Movies, desc: "Films CamTS"}
|
||||||
- {id: 59, cat: Movies/DVD, desc: "Films DVDR"}
|
- {id: 59, cat: Movies/DVD, desc: "Films DVDR"}
|
||||||
- {id: 60, cat: Movies/DVD, desc: "Films DVDRip"}
|
- {id: 60, cat: Movies/DVD, desc: "Films DVDRip"}
|
||||||
- {id: 98, cat: Movies, desc: "Films Film Animées"}
|
- {id: 98, cat: TV/Anime, desc: "Films Film Animées"}
|
||||||
- {id: 65, cat: Movies, desc: "Films FSCR"}
|
- {id: 65, cat: Movies, desc: "Films FSCR"}
|
||||||
- {id: 52, cat: Movies/HD, desc: "Films HD 720p"}
|
- {id: 52, cat: Movies/HD, desc: "Films HD 720p"}
|
||||||
- {id: 53, cat: Movies/HD, desc: "Films HD1080p"}
|
- {id: 53, cat: Movies/HD, desc: "Films HD1080p"}
|
||||||
@@ -124,7 +125,7 @@
|
|||||||
options:
|
options:
|
||||||
"desc": "desc"
|
"desc": "desc"
|
||||||
"asc": "asc"
|
"asc": "asc"
|
||||||
|
|
||||||
login:
|
login:
|
||||||
method: cookie
|
method: cookie
|
||||||
inputs:
|
inputs:
|
||||||
@@ -149,13 +150,17 @@
|
|||||||
# http://crazyspirits.com/torrents-search.php?c101=1&c102=1&c103=1&c104=1&c105=1&c106=1&search=&cat=0&incldead=0&freeleech=0&lang=0
|
# http://crazyspirits.com/torrents-search.php?c101=1&c102=1&c103=1&c104=1&c105=1&c106=1&search=&cat=0&incldead=0&freeleech=0&lang=0
|
||||||
- path: torrents-search.php
|
- path: torrents-search.php
|
||||||
inputs:
|
inputs:
|
||||||
$raw: "{{range .Categories}}c{{.}}=1&{{end}}"
|
$raw: "{{ range .Categories }}c{{.}}=1&{{end}}"
|
||||||
search: "{{ .Keywords }}"
|
search: "{{ .Keywords }}"
|
||||||
|
# 0 active 1 incldead 2 onlydead
|
||||||
incldead: 1
|
incldead: 1
|
||||||
|
# 0 all 1 inclfree 2 onlyfree
|
||||||
freeleech: 0
|
freeleech: 0
|
||||||
|
# 0 all 1 french 2 english etc
|
||||||
lang: 0
|
lang: 0
|
||||||
sort: "{{ .Config.sort }}"
|
sort: "{{ .Config.sort }}"
|
||||||
order: "{{ .Config.type }}"
|
order: "{{ .Config.type }}"
|
||||||
|
# imdb search not supported and imdb links not in results.
|
||||||
|
|
||||||
rows:
|
rows:
|
||||||
selector: table.border_table > tbody > tr.t-row
|
selector: table.border_table > tbody > tr.t-row
|
||||||
@@ -192,13 +197,13 @@
|
|||||||
attribute: onmouseover
|
attribute: onmouseover
|
||||||
filters:
|
filters:
|
||||||
- name: regexp
|
- name: regexp
|
||||||
args: "Taille : </b>(.*?)<br"
|
args: "Taille : </b>(.*?)<br"
|
||||||
date:
|
date:
|
||||||
selector: a[onmouseover][href^="torrents-details.php?id="]
|
selector: a[onmouseover][href^="torrents-details.php?id="]
|
||||||
attribute: onmouseover
|
attribute: onmouseover
|
||||||
filters:
|
filters:
|
||||||
- name: regexp
|
- name: regexp
|
||||||
args: " Le : </b>(.*?)<br"
|
args: " Le : </b>(.*?)<br"
|
||||||
- name: dateparse
|
- name: dateparse
|
||||||
args: "02-01-2006"
|
args: "02-01-2006"
|
||||||
downloadvolumefactor:
|
downloadvolumefactor:
|
||||||
@@ -206,6 +211,5 @@
|
|||||||
img[src="images/Torrents/free.png"]: 0
|
img[src="images/Torrents/free.png"]: 0
|
||||||
"*": 1
|
"*": 1
|
||||||
uploadvolumefactor:
|
uploadvolumefactor:
|
||||||
case:
|
text: 1
|
||||||
"*": 1
|
# TT3.0
|
||||||
# TT3.0
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
---
|
---
|
||||||
site: crnaberza
|
site: crnaberza
|
||||||
name: CrnaBerza
|
name: CrnaBerza
|
||||||
description: "Crna Berza is a BALKAN Private Torrent Tracker for MOVIES / TV / GENERAL"
|
description: "Crna Berza is a BALKAN Private Torrent Tracker for MOVIES / TV / GENERAL"
|
||||||
@@ -100,15 +100,17 @@
|
|||||||
search:
|
search:
|
||||||
paths:
|
paths:
|
||||||
# http://www.crnaberza.com/browse.php?c52=1&c20=1&c34=1&incldead=1&search=star+trek
|
# http://www.crnaberza.com/browse.php?c52=1&c20=1&c34=1&incldead=1&search=star+trek
|
||||||
- path: browse.php
|
- path: browse.php
|
||||||
inputs:
|
inputs:
|
||||||
$raw: "{{ range .Categories }}c{{.}}=1&{{end}}"
|
$raw: "{{ range .Categories }}c{{.}}=1&{{end}}"
|
||||||
search: "{{ .Keywords }}"
|
search: "{{ .Keywords }}"
|
||||||
searchin: title
|
# 0 title 1 descr 2 both
|
||||||
|
blah: 0
|
||||||
# 0 active 1 incldead 2 onlydead
|
# 0 active 1 incldead 2 onlydead
|
||||||
incldead: 1
|
incldead: 1
|
||||||
sort: "{{ .Config.sort }}"
|
sort: "{{ .Config.sort }}"
|
||||||
type: "{{ .Config.type }}"
|
type: "{{ .Config.type }}"
|
||||||
|
# does not support searching imdbid and does not return imdb links
|
||||||
|
|
||||||
rows:
|
rows:
|
||||||
selector: tr:has(td.trowtorrent)
|
selector: tr:has(td.trowtorrent)
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
site: cztorrent
|
site: cztorrent
|
||||||
name: CzTorrent
|
name: CzTorrent
|
||||||
description: "CzTorrent is a Czech Semi-Private site for TV / MOVIES / GENERAL"
|
description: "CzTorrent is a Czech Semi-Private site for TV / MOVIES / GENERAL"
|
||||||
language: cs-cz
|
language: cs-cz
|
||||||
@@ -22,7 +22,7 @@
|
|||||||
- {id: 38, cat: Movies/HD, desc: "HD-LQ"}
|
- {id: 38, cat: Movies/HD, desc: "HD-LQ"}
|
||||||
- {id: 3, cat: PC/Games, desc: "Hry"}
|
- {id: 3, cat: PC/Games, desc: "Hry"}
|
||||||
- {id: 2, cat: Audio, desc: "Hudba"}
|
- {id: 2, cat: Audio, desc: "Hudba"}
|
||||||
- {id: 34, cat: Audio/Video, desc: "Hudba DVD/HD"}
|
- {id: 34, cat: Audio/Video, desc: "Hudební video"}
|
||||||
- {id: 6, cat: Books, desc: "Knihy"}
|
- {id: 6, cat: Books, desc: "Knihy"}
|
||||||
- {id: 13, cat: Console, desc: "Konzole"}
|
- {id: 13, cat: Console, desc: "Konzole"}
|
||||||
- {id: 32, cat: Audio, desc: "Mluvené slovo"}
|
- {id: 32, cat: Audio, desc: "Mluvené slovo"}
|
||||||
@@ -30,7 +30,6 @@
|
|||||||
- {id: 4, cat: Other, desc: "Ostatní"}
|
- {id: 4, cat: Other, desc: "Ostatní"}
|
||||||
- {id: 25, cat: TV, desc: "Seriály"}
|
- {id: 25, cat: TV, desc: "Seriály"}
|
||||||
- {id: 29, cat: Audio, desc: "Soundtrack"}
|
- {id: 29, cat: Audio, desc: "Soundtrack"}
|
||||||
- {id: 19, cat: Audio/Video, desc: "Videoklipy"}
|
|
||||||
- {id: 24, cat: XXX, desc: "xXx"}
|
- {id: 24, cat: XXX, desc: "xXx"}
|
||||||
|
|
||||||
modes:
|
modes:
|
||||||
@@ -74,12 +73,18 @@
|
|||||||
inputs:
|
inputs:
|
||||||
$raw: "{{ range .Categories }}c{{.}}=1&{{end}}"
|
$raw: "{{ range .Categories }}c{{.}}=1&{{end}}"
|
||||||
s: "{{ .Keywords }}"
|
s: "{{ .Keywords }}"
|
||||||
|
# 0 approved 1 all 2 not approved
|
||||||
t: 1
|
t: 1
|
||||||
o: "{{ .Config.sort }}"
|
o: "{{ .Config.sort }}"
|
||||||
|
# does not support imdbid search and does not return imdb links
|
||||||
|
|
||||||
rows:
|
rows:
|
||||||
selector: tr.torr_hover
|
selector: tr.torr_hover
|
||||||
|
|
||||||
|
keywordsfilters:
|
||||||
|
- name: re_replace
|
||||||
|
args: ["S[0-9]{2}([^E]|$)", ""] # remove season tag without episode (search doesn't support it)
|
||||||
|
|
||||||
fields:
|
fields:
|
||||||
title:
|
title:
|
||||||
selector: td.detaily a
|
selector: td.detaily a
|
||||||
@@ -89,17 +94,17 @@
|
|||||||
- name: diacritics
|
- name: diacritics
|
||||||
args: replace
|
args: replace
|
||||||
- name: replace
|
- name: replace
|
||||||
args: ["1080i", "1080p"]
|
args: ["1080i", "1080p"]
|
||||||
- name: replace
|
- name: replace
|
||||||
args: ["720i", "720p"]
|
args: ["720i", "720p"]
|
||||||
- name: replace
|
- name: replace
|
||||||
args: ["pLQ", "p"]
|
args: ["pLQ", "p"]
|
||||||
- name: replace
|
- name: replace
|
||||||
args: ["pHD", "p"]
|
args: ["pHD", "p"]
|
||||||
- name: replace
|
- name: replace
|
||||||
args: ["serie", ""]
|
args: ["serie", ""]
|
||||||
- name: replace
|
- name: replace
|
||||||
args: ["Serie", ""]
|
args: ["Serie", ""]
|
||||||
- name: re_replace
|
- name: re_replace
|
||||||
args: ["(\\d{2})\\.", "S$1"]
|
args: ["(\\d{2})\\.", "S$1"]
|
||||||
- name: re_replace
|
- name: re_replace
|
||||||
@@ -148,7 +153,7 @@
|
|||||||
args: [ "|", 2 ]
|
args: [ "|", 2 ]
|
||||||
- name: append
|
- name: append
|
||||||
args: " +02:00"
|
args: " +02:00"
|
||||||
- name: dateparse
|
- name: dateparse
|
||||||
args: "2.1.2006 15:04 -07:00"
|
args: "2.1.2006 15:04 -07:00"
|
||||||
seeders:
|
seeders:
|
||||||
selector: td:nth-child(7) span
|
selector: td:nth-child(7) span
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
---
|
---
|
||||||
site: datascene
|
site: datascene
|
||||||
name: DataScene
|
name: DataScene
|
||||||
description: "DataScene (DS) is a ROMANIAN Private Torrent Tracker for MOVIES / TV / GENERAL"
|
description: "DataScene (DS) is a ROMANIAN Private Torrent Tracker for MOVIES / TV / GENERAL"
|
||||||
@@ -54,9 +54,33 @@
|
|||||||
- {id: 12, cat: XXX, desc: "XxX"}
|
- {id: 12, cat: XXX, desc: "XxX"}
|
||||||
|
|
||||||
modes:
|
modes:
|
||||||
search: [q]
|
search: [q, imdbid]
|
||||||
movie-search: [q]
|
tv-search: [q, season, ep, imdbid]
|
||||||
tv-search: [q, season, ep]
|
movie-search: [q, imdbid]
|
||||||
|
|
||||||
|
settings:
|
||||||
|
- name: username
|
||||||
|
type: text
|
||||||
|
label: Username
|
||||||
|
- name: password
|
||||||
|
type: password
|
||||||
|
label: Password
|
||||||
|
- name: sort
|
||||||
|
type: select
|
||||||
|
label: Sort requested from site
|
||||||
|
default: "4"
|
||||||
|
options:
|
||||||
|
"4": "created"
|
||||||
|
"7": "seeders"
|
||||||
|
"5": "size"
|
||||||
|
"1": "title"
|
||||||
|
- name: type
|
||||||
|
type: select
|
||||||
|
label: Order requested from site
|
||||||
|
default: "desc"
|
||||||
|
options:
|
||||||
|
"desc": "desc"
|
||||||
|
"asc": "asc"
|
||||||
|
|
||||||
login:
|
login:
|
||||||
path: takelogin.php
|
path: takelogin.php
|
||||||
@@ -68,7 +92,7 @@
|
|||||||
- selector: td.embedded:has(h2:contains("failed"))
|
- selector: td.embedded:has(h2:contains("failed"))
|
||||||
test:
|
test:
|
||||||
path: browse.php
|
path: browse.php
|
||||||
|
|
||||||
ratio:
|
ratio:
|
||||||
path: browse.php
|
path: browse.php
|
||||||
selector: font:contains("Ratio:") > span
|
selector: font:contains("Ratio:") > span
|
||||||
@@ -77,9 +101,14 @@
|
|||||||
paths:
|
paths:
|
||||||
- path: browse.php
|
- path: browse.php
|
||||||
inputs:
|
inputs:
|
||||||
$raw: "{{ range .Categories }}c{{.}}=1&{{end}}"
|
$raw: "{{ if .Categories}}{{ range .Categories }}c{{.}}=1&{{end}}{{else}}cat=0{{end}}"
|
||||||
search: "{{ .Keywords }}"
|
search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{else}}{{ .Keywords }}{{end}}"
|
||||||
incldead: 1
|
# 1 active 2 incldead 3 onlydead 4 free
|
||||||
|
incldead: 2
|
||||||
|
# 0 name 1 genre 2 descr 3 imdb
|
||||||
|
blah: "{{ if .Query.IMDBID }}3{{else}}0{{end}}"
|
||||||
|
sort: "{{ .Config.sort }}"
|
||||||
|
type: "{{ .Config.type }}"
|
||||||
|
|
||||||
rows:
|
rows:
|
||||||
selector: div.ncls > table > tbody > tr:has(a.tname)
|
selector: div.ncls > table > tbody > tr:has(a.tname)
|
||||||
|
|||||||
@@ -26,9 +26,9 @@
|
|||||||
- {id: 8, cat: TV, desc: "TV shows"}
|
- {id: 8, cat: TV, desc: "TV shows"}
|
||||||
|
|
||||||
modes:
|
modes:
|
||||||
search: [q]
|
search: [q, imdbid]
|
||||||
tv-search: [q, season, ep]
|
tv-search: [q, season, ep, imdbid]
|
||||||
movie-search: [q]
|
movie-search: [q, imdbid]
|
||||||
|
|
||||||
settings:
|
settings:
|
||||||
- name: username
|
- name: username
|
||||||
@@ -69,10 +69,14 @@
|
|||||||
- path: browse.php
|
- path: browse.php
|
||||||
inputs:
|
inputs:
|
||||||
$raw: "{{ range .Categories }}c{{.}}=1&{{end}}"
|
$raw: "{{ range .Categories }}c{{.}}=1&{{end}}"
|
||||||
search: "{{ .Keywords }}"
|
search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{else}}{{ .Keywords }}{{end}}"
|
||||||
|
# active 1 incldead 2 onlydead
|
||||||
incldead: 1
|
incldead: 1
|
||||||
|
# 1 = look in description
|
||||||
|
Lysing: "{{ if .Query.IMDBID }}1{{else}}{{end}}"
|
||||||
sort: "{{ .Config.sort }}"
|
sort: "{{ .Config.sort }}"
|
||||||
type: "{{ .Config.type }}"
|
type: "{{ .Config.type }}"
|
||||||
|
# does not return imdb links
|
||||||
|
|
||||||
rows:
|
rows:
|
||||||
selector: table[class="torrentlist"] > tbody > tr:has(a[href*="details.php?id="])
|
selector: table[class="torrentlist"] > tbody > tr:has(a[href*="details.php?id="])
|
||||||
|
|||||||
@@ -5,8 +5,10 @@
|
|||||||
language: en-us
|
language: en-us
|
||||||
type: public
|
type: public
|
||||||
encoding: UTF-8
|
encoding: UTF-8
|
||||||
|
followredirect: true
|
||||||
links:
|
links:
|
||||||
- https://www.demonoid.is/
|
- https://www.demonoid.is/
|
||||||
|
- https://demonoid.unblockit.pro/
|
||||||
legacylinks:
|
legacylinks:
|
||||||
- https://www.dnoid.to/
|
- https://www.dnoid.to/
|
||||||
|
|
||||||
|
|||||||
@@ -17,7 +17,7 @@
|
|||||||
- {id: 5, cat: Console, desc: "Game"}
|
- {id: 5, cat: Console, desc: "Game"}
|
||||||
|
|
||||||
modes:
|
modes:
|
||||||
search: [q]
|
search: [q, imdbid]
|
||||||
tv-search: [q, season, ep, imdbid]
|
tv-search: [q, season, ep, imdbid]
|
||||||
movie-search: [q, imdbid]
|
movie-search: [q, imdbid]
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
---
|
---
|
||||||
site: divteam
|
site: divteam
|
||||||
name: DivTeam
|
name: DivTeam
|
||||||
description: "DivTeam is a SPANISH Private Torrent Tracker for MOVIES / GENERAL"
|
description: "DivTeam is a SPANISH Private Torrent Tracker for MOVIES / GENERAL"
|
||||||
@@ -12,7 +12,7 @@
|
|||||||
categorymappings:
|
categorymappings:
|
||||||
- {id: 60, cat: Movies/HD, desc: "MicroHD 720p"}
|
- {id: 60, cat: Movies/HD, desc: "MicroHD 720p"}
|
||||||
- {id: 77, cat: Movies/HD, desc: "MicroHD 1080p"}
|
- {id: 77, cat: Movies/HD, desc: "MicroHD 1080p"}
|
||||||
- {id: 78, cat: Movies/HD, desc: "MicroHD 4k"}
|
- {id: 78, cat: Movies/HD, desc: "MicroHD 4K"}
|
||||||
- {id: 64, cat: TV/HD, desc: "Pack Series"}
|
- {id: 64, cat: TV/HD, desc: "Pack Series"}
|
||||||
- {id: 65, cat: TV/HD, desc: "Pack Series VOSE"}
|
- {id: 65, cat: TV/HD, desc: "Pack Series VOSE"}
|
||||||
- {id: 80, cat: Movies/BluRay, desc: "BDRip X265 1080p"}
|
- {id: 80, cat: Movies/BluRay, desc: "BDRip X265 1080p"}
|
||||||
@@ -43,13 +43,13 @@
|
|||||||
- {id: 48, cat: Movies/BluRay, desc: "BR-Rip/HD-Rip"}
|
- {id: 48, cat: Movies/BluRay, desc: "BR-Rip/HD-Rip"}
|
||||||
- {id: 17, cat: Movies/BluRay, desc: "BD-Rip"}
|
- {id: 17, cat: Movies/BluRay, desc: "BD-Rip"}
|
||||||
- {id: 5, cat: TV/Anime, desc: "Anime"}
|
- {id: 5, cat: TV/Anime, desc: "Anime"}
|
||||||
- {id: 34, cat: PC/Games, desc: "Juegos Pc"}
|
- {id: 34, cat: PC/Games, desc: "Juegos PC"}
|
||||||
- {id: 7, cat: PC/0day, desc: "Software Pc"}
|
- {id: 7, cat: PC/0day, desc: "Software PC"}
|
||||||
- {id: 35, cat: Console, desc: "Juegos Sony"}
|
- {id: 35, cat: Console, desc: "Juegos Sony"}
|
||||||
- {id: 36, cat: PC/Games, desc: "Juegos Microsoft"}
|
- {id: 36, cat: PC/Games, desc: "Juegos Microsoft"}
|
||||||
- {id: 37, cat: Console/NDS, desc: "Juegos Nintendo"}
|
- {id: 37, cat: Console/NDS, desc: "Juegos Nintendo"}
|
||||||
- {id: 45, cat: Audio/MP3, desc: "Music MP3"}
|
- {id: 45, cat: Audio/MP3, desc: "Music MP3"}
|
||||||
- {id: 44, cat: Audio/Lossless, desc: "Music flac"}
|
- {id: 44, cat: Audio/Lossless, desc: "Music FLAC"}
|
||||||
|
|
||||||
modes:
|
modes:
|
||||||
search: [q]
|
search: [q]
|
||||||
@@ -84,7 +84,7 @@
|
|||||||
type: info
|
type: info
|
||||||
label: Results Per Page
|
label: Results Per Page
|
||||||
default: For best results, change the <b>Torrents per page:</b> setting to <b>100</b> on your account profile.
|
default: For best results, change the <b>Torrents per page:</b> setting to <b>100</b> on your account profile.
|
||||||
|
|
||||||
login:
|
login:
|
||||||
method: cookie
|
method: cookie
|
||||||
inputs:
|
inputs:
|
||||||
@@ -99,11 +99,14 @@
|
|||||||
inputs:
|
inputs:
|
||||||
page: "torrents"
|
page: "torrents"
|
||||||
category: "{{ range .Categories }}{{.}};{{end}}"
|
category: "{{ range .Categories }}{{.}};{{end}}"
|
||||||
search: "{{ if .Keywords }}{{ .Keywords }}{{else}}{{end}}"
|
search: "{{ .Keywords }}"
|
||||||
|
# 0 all 1 activeonly 2 deadonly
|
||||||
active: 0
|
active: 0
|
||||||
|
# 0 title 1 title&desc 2 descr 3 uploaders 5 gold 6 silver 9 2x 10 3x 11 4x
|
||||||
options: 0
|
options: 0
|
||||||
order: "{{ .Config.sort }}"
|
order: "{{ .Config.sort }}"
|
||||||
by: "{{ .Config.type }}"
|
by: "{{ .Config.type }}"
|
||||||
|
# does not support imdbid search and does not supply imdb link in results.
|
||||||
|
|
||||||
rows:
|
rows:
|
||||||
selector: table.table.table-bordered > tbody > tr:has(a[href^="download.php?id="])
|
selector: table.table.table-bordered > tbody > tr:has(a[href^="download.php?id="])
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
---
|
---
|
||||||
site: documentarytorrents
|
site: documentarytorrents
|
||||||
name: DocumentaryTorrents
|
name: DocumentaryTorrents
|
||||||
description: "Documentary Torrents (DT) is a Private Torrent Tracker for E-LEARNING MOVIES / TV"
|
description: "Documentary Torrents (DT) is a Private Torrent Tracker for E-LEARNING MOVIES / TV"
|
||||||
@@ -74,7 +74,8 @@
|
|||||||
|
|
||||||
modes:
|
modes:
|
||||||
search: [q]
|
search: [q]
|
||||||
tv-search: [q, season, ep]
|
tv-search: [q]
|
||||||
|
movie-search: [q]
|
||||||
|
|
||||||
settings:
|
settings:
|
||||||
- name: username
|
- name: username
|
||||||
@@ -88,7 +89,7 @@
|
|||||||
label: Sort requested from site
|
label: Sort requested from site
|
||||||
default: "id"
|
default: "id"
|
||||||
options:
|
options:
|
||||||
"is": "created"
|
"id": "created"
|
||||||
"seeders": "seeders"
|
"seeders": "seeders"
|
||||||
"size": "size"
|
"size": "size"
|
||||||
"name": "title"
|
"name": "title"
|
||||||
@@ -125,11 +126,15 @@
|
|||||||
$raw: "{{ range .Categories }}c{{.}}=1&{{end}}"
|
$raw: "{{ range .Categories }}c{{.}}=1&{{end}}"
|
||||||
search: "{{ .Keywords }}"
|
search: "{{ .Keywords }}"
|
||||||
cat: 0
|
cat: 0
|
||||||
|
# 0 active 1 incldead 2 onlydead
|
||||||
incldead: 1
|
incldead: 1
|
||||||
|
# 0 all 1 notfree 2 onlyfree
|
||||||
freeleech: 0
|
freeleech: 0
|
||||||
|
# 0 all 1 english 2 french etc
|
||||||
lang: 0
|
lang: 0
|
||||||
sort: "{{ .Config.sort }}"
|
sort: "{{ .Config.sort }}"
|
||||||
order: "{{ .Config.type }}"
|
order: "{{ .Config.type }}"
|
||||||
|
# does not support imdbid search and does not return imdb link in results
|
||||||
|
|
||||||
rows:
|
rows:
|
||||||
selector: table.ttable_headinner tr.t-row
|
selector: table.ttable_headinner tr.t-row
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
---
|
---
|
||||||
site: downloadville
|
site: downloadville
|
||||||
name: Downloadville
|
name: Downloadville
|
||||||
description: "Downloadville is a FRENCH Private Torrent Tracker for MOVIES / TV / GENERAL"
|
description: "Downloadville is a FRENCH Private Torrent Tracker for MOVIES / TV / GENERAL"
|
||||||
@@ -14,68 +14,70 @@
|
|||||||
categorymappings:
|
categorymappings:
|
||||||
# Films
|
# Films
|
||||||
- {id: 1, cat: Movies, desc: "Films"}
|
- {id: 1, cat: Movies, desc: "Films"}
|
||||||
- {id: 13, cat: Movies, desc: "Films BD-Rip / BRRip"}
|
- {id: 13, cat: Movies/BluRay, desc: "Films BD-Rip / BRRip"}
|
||||||
- {id: 15, cat: Movies, desc: "Films DVD-Rip"}
|
- {id: 15, cat: Movies/DVD, desc: "Films DVD-Rip"}
|
||||||
- {id: 18, cat: Movies, desc: "Films HD 720p"}
|
- {id: 18, cat: Movies/HD, desc: "Films HD 720p"}
|
||||||
- {id: 19, cat: Movies, desc: "Films WEB-DL / WEB-Rip"}
|
- {id: 19, cat: Movies/WEBDL, desc: "Films WEB-DL / WEB-Rip"}
|
||||||
- {id: 20, cat: Movies, desc: "Films HD 1080p"}
|
- {id: 20, cat: Movies/HD, desc: "Films HD 1080p"}
|
||||||
- {id: 26, cat: Movies, desc: "Films mHD 720p"}
|
- {id: 26, cat: Movies/HD, desc: "Films mHD 720p"}
|
||||||
- {id: 27, cat: Movies, desc: "Films mHD 1080p"}
|
- {id: 27, cat: Movies/HD, desc: "Films mHD 1080p"}
|
||||||
- {id: 28, cat: Movies, desc: "Films x265"}
|
- {id: 28, cat: Movies/HD, desc: "Films x265"}
|
||||||
- {id: 30, cat: Movies, desc: "Films Blu-Ray (complet)"}
|
- {id: 30, cat: Movies/BluRay, desc: "Films Blu-Ray (complet)"}
|
||||||
- {id: 31, cat: Movies, desc: "Films 3D"}
|
- {id: 31, cat: Movies/3D, desc: "Films 3D"}
|
||||||
- {id: 32, cat: Movies, desc: "Films 4K UHD"}
|
- {id: 32, cat: Movies/UHD, desc: "Films 4K UHD"}
|
||||||
- {id: 33, cat: Movies, desc: "Films Québécois SD"}
|
- {id: 33, cat: Movies/SD, desc: "Films Québécois SD"}
|
||||||
- {id: 34, cat: Movies, desc: "Films Québécois HD"}
|
- {id: 34, cat: Movies/HD, desc: "Films Québécois HD"}
|
||||||
- {id: 35, cat: Movies, desc: "Films Québécois DVD-R"}
|
- {id: 35, cat: Movies/DVD, desc: "Films Québécois DVD-R"}
|
||||||
- {id: 37, cat: Movies, desc: "Films DVD-R"}
|
- {id: 37, cat: Movies/DVD, desc: "Films DVD-R"}
|
||||||
- {id: 38, cat: Movies, desc: "Films V.O.S.T. SD"}
|
- {id: 38, cat: Movies/SD, desc: "Films V.O.S.T. SD"}
|
||||||
- {id: 39, cat: Movies, desc: "Films V.O.S.T. HD"}
|
- {id: 39, cat: MovieS/HD, desc: "Films V.O.S.T. HD"}
|
||||||
- {id: 40, cat: Movies, desc: "Films V.O. SD"}
|
- {id: 40, cat: Movies/SD, desc: "Films V.O. SD"}
|
||||||
- {id: 41, cat: Movies, desc: "Films V.O. HD"}
|
- {id: 41, cat: Movies/HD, desc: "Films V.O. HD"}
|
||||||
- {id: 42, cat: Movies, desc: "Films TV-Rip"}
|
- {id: 42, cat: Movies, desc: "Films TV-Rip"}
|
||||||
|
# 4K LIGHT
|
||||||
|
- {id: 95, cat: Movies, desc: "4K LIGHT"}
|
||||||
# Séries-Télé
|
# Séries-Télé
|
||||||
- {id: 16, cat: TV, desc: "Séries-Télé"}
|
- {id: 16, cat: TV, desc: "Séries-Télé"}
|
||||||
- {id: 17, cat: TV, desc: "Séries-Télé TV Pack SD"}
|
- {id: 17, cat: TV/SD, desc: "Séries-Télé TV Pack SD"}
|
||||||
- {id: 21, cat: TV, desc: "Séries-Télé SD"}
|
- {id: 21, cat: TV/SD, desc: "Séries-Télé SD"}
|
||||||
- {id: 22, cat: TV, desc: "Séries-Télé HD"}
|
- {id: 22, cat: TV/HD, desc: "Séries-Télé HD"}
|
||||||
- {id: 23, cat: TV, desc: "Séries-Télé TV Pack HD"}
|
- {id: 23, cat: TV/HD, desc: "Séries-Télé TV Pack HD"}
|
||||||
- {id: 45, cat: TV, desc: "Séries-Télé Québécois SD"}
|
- {id: 45, cat: TV/SD, desc: "Séries-Télé Québécois SD"}
|
||||||
- {id: 46, cat: TV, desc: "Séries-Télé Québécois HD"}
|
- {id: 46, cat: TV/HD, desc: "Séries-Télé Québécois HD"}
|
||||||
- {id: 47, cat: TV, desc: "Séries-Télé V.O.S.T. SD"}
|
- {id: 47, cat: TV/SD, desc: "Séries-Télé V.O.S.T. SD"}
|
||||||
- {id: 48, cat: TV, desc: "Séries-TéléV.O.S.T. HD"}
|
- {id: 48, cat: TV/HD, desc: "Séries-TéléV.O.S.T. HD"}
|
||||||
- {id: 49, cat: TV, desc: "Séries-Télé Émissions TV SD"}
|
- {id: 49, cat: TV/SD, desc: "Séries-Télé Émissions TV SD"}
|
||||||
- {id: 50, cat: TV, desc: "Séries-Télé Émissions TV HD"}
|
- {id: 50, cat: TV/HD, desc: "Séries-Télé Émissions TV HD"}
|
||||||
- {id: 51, cat: TV, desc: "Séries-Télé Blu-Ray"}
|
- {id: 51, cat: TV, desc: "Séries-Télé Blu-Ray"}
|
||||||
- {id: 52, cat: TV, desc: "Séries-Télé DVD-R"}
|
- {id: 52, cat: TV, desc: "Séries-Télé DVD-R"}
|
||||||
- {id: 94, cat: TV, desc: "Séries-Télé x265 - TV"}
|
- {id: 94, cat: TV/HD, desc: "Séries-Télé x265 - TV"}
|
||||||
# Musique
|
# Musique
|
||||||
- {id: 2, cat: Audio, desc: "Musique"}
|
- {id: 2, cat: Audio, desc: "Musique"}
|
||||||
- {id: 54, cat: Audio, desc: "Musique MP3"}
|
- {id: 54, cat: Audio/MP3, desc: "Musique MP3"}
|
||||||
- {id: 55, cat: Audio, desc: "Musique FLAC"}
|
- {id: 55, cat: Audio/Lossless, desc: "Musique FLAC"}
|
||||||
- {id: 56, cat: Audio, desc: "Musique DSD"}
|
- {id: 56, cat: Audio, desc: "Musique DSD"}
|
||||||
- {id: 57, cat: Audio, desc: "Musique Karaoke"}
|
- {id: 57, cat: Audio, desc: "Musique Karaoke"}
|
||||||
- {id: 58, cat: Audio, desc: "Musique Autres"}
|
- {id: 58, cat: Audio, desc: "Musique Autres"}
|
||||||
# Jeux
|
# Jeux
|
||||||
- {id: 3, cat: PC/Games, desc: "Jeux"}
|
- {id: 3, cat: PC/Games, desc: "Jeux"}
|
||||||
- {id: 59, cat: PC/Games, desc: "Jeux PC"}
|
- {id: 59, cat: PC/Games, desc: "Jeux PC"}
|
||||||
- {id: 60, cat: PC/Games, desc: "Jeux Consoles"}
|
- {id: 60, cat: Console, desc: "Jeux Consoles"}
|
||||||
- {id: 84, cat: PC/Games, desc: "Jeux Android"}
|
- {id: 84, cat: PC/Games, desc: "Jeux Android"}
|
||||||
# Livres
|
# Livres
|
||||||
- {id: 6, cat: Books, desc: "Livres"}
|
- {id: 6, cat: Books, desc: "Livres"}
|
||||||
- {id: 61, cat: Books, desc: "Livres epub"}
|
- {id: 61, cat: Books/Ebook, desc: "Livres epub"}
|
||||||
- {id: 62, cat: Books, desc: "Livres pdf"}
|
- {id: 62, cat: Books, desc: "Livres pdf"}
|
||||||
- {id: 63, cat: Books, desc: "Livres Journaux"}
|
- {id: 63, cat: Books, desc: "Livres Journaux"}
|
||||||
- {id: 64, cat: Books, desc: "Livres Magazines"}
|
- {id: 64, cat: Books/Magazines, desc: "Livres Magazines"}
|
||||||
- {id: 65, cat: Books, desc: "Livres Bandes Dessinées"}
|
- {id: 65, cat: Books, desc: "Livres Bandes Dessinées"}
|
||||||
- {id: 66, cat: Books, desc: "Livres Multi-Format"}
|
- {id: 66, cat: Books, desc: "Livres Multi-Format"}
|
||||||
- {id: 85, cat: Books, desc: "Livres Audio"}
|
- {id: 85, cat: Audio/Audiobook, desc: "Livres Audio"}
|
||||||
# Logiciels
|
# Logiciels
|
||||||
- {id: 67, cat: PC, desc: "Logiciels"}
|
- {id: 67, cat: PC, desc: "Logiciels"}
|
||||||
- {id: 68, cat: PC, desc: "Logiciels Windows"}
|
- {id: 68, cat: PC/0day, desc: "Logiciels Windows"}
|
||||||
- {id: 69, cat: PC, desc: "Logiciels Mac"}
|
- {id: 69, cat: PC/Mac, desc: "Logiciels Mac"}
|
||||||
- {id: 86, cat: PC, desc: "Logiciels Linux"}
|
- {id: 86, cat: PC, desc: "Logiciels Linux"}
|
||||||
- {id: 87, cat: PC, desc: "Logiciels Android"}
|
- {id: 87, cat: PC/Phone-Android, desc: "Logiciels Android"}
|
||||||
# Spectacles
|
# Spectacles
|
||||||
- {id: 70, cat: TV/Other, desc: "Spectacles"}
|
- {id: 70, cat: TV/Other, desc: "Spectacles"}
|
||||||
- {id: 71, cat: TV/Other, desc: "Spectacles Humour"}
|
- {id: 71, cat: TV/Other, desc: "Spectacles Humour"}
|
||||||
@@ -138,7 +140,7 @@
|
|||||||
default: FRENCH
|
default: FRENCH
|
||||||
options:
|
options:
|
||||||
FRENCH : "FRENCH"
|
FRENCH : "FRENCH"
|
||||||
MULTI.FRENCH : "MULTI.FRENCH"
|
MULTI.FRENCH : "MULTI.FRENCH"
|
||||||
ENGLISH: "ENGLISH"
|
ENGLISH: "ENGLISH"
|
||||||
- name: sort
|
- name: sort
|
||||||
type: select
|
type: select
|
||||||
@@ -169,7 +171,7 @@
|
|||||||
uid: "{{ .Config.uid }}"
|
uid: "{{ .Config.uid }}"
|
||||||
pwd: "{{ .Config.pwd }}"
|
pwd: "{{ .Config.pwd }}"
|
||||||
error:
|
error:
|
||||||
- selector: form[action="index.php?page=login&returnto=index.php"] table tr:nth-of-type(2) td
|
- selector: form[action="index.php?page=login&returnto=index.php"] table tr:nth-of-type(2) td
|
||||||
message:
|
message:
|
||||||
selector: form[action="index.php?page=login&returnto=index.php"] table tr:nth-of-type(2) td span
|
selector: form[action="index.php?page=login&returnto=index.php"] table tr:nth-of-type(2) td span
|
||||||
test:
|
test:
|
||||||
@@ -190,15 +192,19 @@
|
|||||||
search:
|
search:
|
||||||
paths:
|
paths:
|
||||||
- path: tracker/index.php
|
- path: tracker/index.php
|
||||||
|
headers:
|
||||||
|
Referer: ["https://downloadville.net/tracker/index.php?page=torrents&search=fake_referer&active=0"]
|
||||||
inputs:
|
inputs:
|
||||||
page: torrents
|
page: torrents
|
||||||
search: "{{ .Keywords }}"
|
search: "{{ .Keywords }}"
|
||||||
category: "{{ range .Categories }}{{.}};{{end}}"
|
category: "{{ range .Categories }}{{.}};{{end}}"
|
||||||
|
# 0 title 1 title&descr 2 descr
|
||||||
options: 0
|
options: 0
|
||||||
active: "{{ .Config.active }}"
|
active: "{{ .Config.active }}"
|
||||||
gold: "{{ .Config.gold }}"
|
gold: "{{ .Config.gold }}"
|
||||||
order: "{{ .Config.sort }}"
|
order: "{{ .Config.sort }}"
|
||||||
by: "{{ .Config.type }}"
|
by: "{{ .Config.type }}"
|
||||||
|
# does not support imdbid search and does not ruturn imdb link in results
|
||||||
|
|
||||||
rows:
|
rows:
|
||||||
selector: table > tbody > tr > td > table.lista > tbody > tr:has(td[onmouseover="this.className='post'"])
|
selector: table > tbody > tr > td > table.lista > tbody > tr:has(td[onmouseover="this.className='post'"])
|
||||||
@@ -210,7 +216,7 @@
|
|||||||
text: "{{ .Result.title_phase1 }}"
|
text: "{{ .Result.title_phase1 }}"
|
||||||
filters:
|
filters:
|
||||||
- name: re_replace
|
- name: re_replace
|
||||||
args: ["[\\.\\s\\[\\-][Mm][Uu][Ll][Tt][Ii][\\.\\s\\]\\-]", ".{{ .Config.multilanguage }}."]
|
args: ["[\\.\\s\\[\\-][Mm][Uu][Ll][Tt][Ii][\\.\\s\\]\\-]", ".{{ .Config.multilanguage }}."]
|
||||||
title:
|
title:
|
||||||
text: "{{if .Config.multilang }}{{ .Result.title_multilang }}{{else}}{{ .Result.title_phase1 }}{{end}}"
|
text: "{{if .Config.multilang }}{{ .Result.title_multilang }}{{else}}{{ .Result.title_phase1 }}{{end}}"
|
||||||
details:
|
details:
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
---
|
---
|
||||||
site: dragonworldreloaded
|
site: dragonworldreloaded
|
||||||
name: Dragonworld Reloaded
|
name: Dragonworld Reloaded
|
||||||
description: "Dragonworld Reloaded is a GERMAN Private Torrent Tracker for MOVIES / TV / GENERAL"
|
description: "Dragonworld Reloaded is a GERMAN Private Torrent Tracker for MOVIES / TV / GENERAL"
|
||||||
|
|||||||
@@ -24,7 +24,7 @@
|
|||||||
- {id: 12, cat: TV/Anime, desc: "Anime-Movie"}
|
- {id: 12, cat: TV/Anime, desc: "Anime-Movie"}
|
||||||
|
|
||||||
modes:
|
modes:
|
||||||
search: [q]
|
search: [q, imdbid]
|
||||||
tv-search: [q, season, ep, imdbid]
|
tv-search: [q, season, ep, imdbid]
|
||||||
movie-search: [q, imdbid]
|
movie-search: [q, imdbid]
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
---
|
---
|
||||||
site: ebookparadijs
|
site: ebookparadijs
|
||||||
name: EbookParadijs
|
name: EbookParadijs
|
||||||
description: "EbookParadijs is a DUTCH Private Tracker for EBOOKS"
|
description: "EbookParadijs is a DUTCH Private Tracker for EBOOKS"
|
||||||
|
|||||||
@@ -352,4 +352,4 @@
|
|||||||
"*": 1
|
"*": 1
|
||||||
uploadvolumefactor:
|
uploadvolumefactor:
|
||||||
case:
|
case:
|
||||||
"*": 1
|
"*": 1
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
---
|
---
|
||||||
site: efectodoppler
|
site: efectodoppler
|
||||||
name: Efecto Doppler
|
name: Efecto Doppler
|
||||||
description: "Efecto Doppler is a SPANISH Private Torrent Tracker for MUSIC"
|
description: "Efecto Doppler is a SPANISH Private Torrent Tracker for MUSIC"
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user