mirror of
https://github.com/Jackett/Jackett.git
synced 2025-09-15 00:14:10 +02:00
Compare commits
366 Commits
v0.12.1323
...
v0.13.201
Author | SHA1 | Date | |
---|---|---|---|
![]() |
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 | ||
![]() |
f2c6eadb89 | ||
![]() |
1f79f4a165 | ||
![]() |
fa917dd66c | ||
![]() |
dcd10211e2 | ||
![]() |
3271efe478 | ||
![]() |
c3ea12694c | ||
![]() |
1375b62cf9 | ||
![]() |
8a9e29a2ac | ||
![]() |
ccaa0c5255 | ||
![]() |
e2b2346eb2 | ||
![]() |
a82c3cf963 | ||
![]() |
cab1184f13 | ||
![]() |
46f03dbb6d | ||
![]() |
196ca5e83d | ||
![]() |
3e89a2f364 | ||
![]() |
3ab620af28 | ||
![]() |
3d8a761524 | ||
![]() |
848ec59b18 | ||
![]() |
e409179b74 | ||
![]() |
e977ba521c | ||
![]() |
a193bfe3e7 | ||
![]() |
1bf05e3934 | ||
![]() |
2f724b4de0 | ||
![]() |
585147d43c | ||
![]() |
19043ea2b3 | ||
![]() |
332c4eea73 | ||
![]() |
f8e5d67049 | ||
![]() |
283429f125 | ||
![]() |
32207cf1a4 | ||
![]() |
cf06cd3541 | ||
![]() |
afd9566388 | ||
![]() |
c976ab8d9a | ||
![]() |
fbecbea7be | ||
![]() |
438714a527 | ||
![]() |
348dddfbee | ||
![]() |
e13cee2e95 | ||
![]() |
5c0f028cca | ||
![]() |
58b6272e1e | ||
![]() |
2ed11bd562 | ||
![]() |
5326d6b33f | ||
![]() |
6748738db3 | ||
![]() |
9efe27ca7a | ||
![]() |
c0d7a85db3 | ||
![]() |
cba78c299b | ||
![]() |
f8048c7572 | ||
![]() |
3ee947c8a1 | ||
![]() |
98541ac6f8 | ||
![]() |
c08f511d1e | ||
![]() |
53e2527c72 | ||
![]() |
e2310ea70b | ||
![]() |
c12da520a4 | ||
![]() |
2fe1e03da9 | ||
![]() |
7543b9ef35 | ||
![]() |
4809ee1383 | ||
![]() |
2d56ce11b7 | ||
![]() |
af6c7b530b | ||
![]() |
cee7ceb1f6 | ||
![]() |
f770596354 | ||
![]() |
77a2264164 | ||
![]() |
48a9765c48 | ||
![]() |
e5784503b5 | ||
![]() |
9693a9890f | ||
![]() |
0593f30115 | ||
![]() |
9e37ef0c02 | ||
![]() |
c22b2b3ea6 | ||
![]() |
24c907961c | ||
![]() |
35b606805f | ||
![]() |
f8f0c5d907 | ||
![]() |
1715f0fda4 | ||
![]() |
054e0e6440 | ||
![]() |
1a0b62540e | ||
![]() |
5fbc92682a | ||
![]() |
5be778c28c | ||
![]() |
acb2cef2b4 | ||
![]() |
1a85cb3e22 | ||
![]() |
614372a272 | ||
![]() |
234433ba8a | ||
![]() |
d124fa9cde | ||
![]() |
4d05ab3fbc | ||
![]() |
43ddc7a854 | ||
![]() |
5bb163d521 | ||
![]() |
056f683de3 | ||
![]() |
a164cfe010 | ||
![]() |
6b51888919 | ||
![]() |
daa1149bd3 | ||
![]() |
b9dbba280b | ||
![]() |
b6e8f7261e | ||
![]() |
67750982bc | ||
![]() |
163b162b2d | ||
![]() |
9f03831321 | ||
![]() |
48d793fcd2 | ||
![]() |
574bd29108 | ||
![]() |
e215870735 | ||
![]() |
f718052e4a | ||
![]() |
c1e71a9df2 | ||
![]() |
d031371083 | ||
![]() |
dbb3234bf1 | ||
![]() |
9157294dc0 | ||
![]() |
6f8afcf584 | ||
![]() |
7b57510507 | ||
![]() |
42ec8b63a3 | ||
![]() |
a43522e4db | ||
![]() |
694c61990d | ||
![]() |
f488cab31b | ||
![]() |
72ff71de9a | ||
![]() |
41beca0afc | ||
![]() |
be7bd4ea22 | ||
![]() |
8744fd3fa1 | ||
![]() |
7d87b3287b | ||
![]() |
6752eb6321 | ||
![]() |
36f91abc35 | ||
![]() |
6fc1992851 | ||
![]() |
fadaa9eb7a | ||
![]() |
cd239498c0 | ||
![]() |
b0e5c2e7a9 | ||
![]() |
7200ba9660 | ||
![]() |
620a09858c | ||
![]() |
5bd4f7c364 | ||
![]() |
bf7f5d4fd8 | ||
![]() |
40a0cc70bf | ||
![]() |
65ac2c8339 | ||
![]() |
b58d1d6bea | ||
![]() |
b60c6d132c | ||
![]() |
67491cb4f6 | ||
![]() |
860168fe44 | ||
![]() |
ad24dd4600 | ||
![]() |
dc0e37f3dc | ||
![]() |
dc7c84bec8 | ||
![]() |
e695f90c80 | ||
![]() |
fe3ca03847 | ||
![]() |
962b29825b | ||
![]() |
fa1cedb49d | ||
![]() |
7b7f600794 | ||
![]() |
370a70ba26 | ||
![]() |
5a13b1253d | ||
![]() |
eba53cc4be | ||
![]() |
1dc3c98da8 | ||
![]() |
c3f24eb788 | ||
![]() |
760c663259 | ||
![]() |
e3f44dbbce | ||
![]() |
45c204e37b | ||
![]() |
752403fff1 | ||
![]() |
6d78a8c218 | ||
![]() |
c25726dcd0 | ||
![]() |
8402275093 | ||
![]() |
5a27395553 | ||
![]() |
837656ce3d | ||
![]() |
a092a931a5 | ||
![]() |
2368e2631b | ||
![]() |
ff1d818d5f | ||
![]() |
2f8a093962 | ||
![]() |
1ac309d513 | ||
![]() |
1344499534 | ||
![]() |
7a1c8f9419 | ||
![]() |
92556a56c6 | ||
![]() |
5d4b252c32 | ||
![]() |
a39711d619 | ||
![]() |
3d5c32b63a | ||
![]() |
f0d05b5a56 | ||
![]() |
d460369545 | ||
![]() |
5e8493bc9a | ||
![]() |
2513f7a473 | ||
![]() |
11ad12abbe | ||
![]() |
26564cdfbd | ||
![]() |
748e1c4f2e | ||
![]() |
dc87b36ae0 | ||
![]() |
17db2b5df3 | ||
![]() |
584ea4cf01 | ||
![]() |
2d9a6803c6 | ||
![]() |
6e8ff3fa08 | ||
![]() |
ab2e41df75 | ||
![]() |
9413006524 | ||
![]() |
74dcf37352 | ||
![]() |
c08e7ee827 | ||
![]() |
a11f811c20 | ||
![]() |
77a1ce1670 | ||
![]() |
4f7f495200 | ||
![]() |
835681fcfc | ||
![]() |
1ca8b1e8a4 | ||
![]() |
02fc8cee0e | ||
![]() |
5405405d1a | ||
![]() |
953f9c7709 | ||
![]() |
38efce8f2f | ||
![]() |
85b5a1a1da | ||
![]() |
3ccd8b148e | ||
![]() |
138297718d | ||
![]() |
eff0d3e332 | ||
![]() |
0730b0bc64 | ||
![]() |
f14cdd4828 | ||
![]() |
e4a511347c | ||
![]() |
c2588d619f | ||
![]() |
7d073af14f | ||
![]() |
0605b66b67 | ||
![]() |
a89c7dedeb | ||
![]() |
9565469559 | ||
![]() |
dcda239b3f | ||
![]() |
7b8f2d4dab | ||
![]() |
003d37ab27 | ||
![]() |
32ea40cf82 | ||
![]() |
d4f873e46f | ||
![]() |
5b91445d59 | ||
![]() |
797cdb5b0b | ||
![]() |
fdc4db3a5d | ||
![]() |
79aa770a9b | ||
![]() |
54cc92a6a1 | ||
![]() |
fb1683e8fa | ||
![]() |
6f4ae67fb2 | ||
![]() |
2ee2dfc608 | ||
![]() |
6e9c312679 | ||
![]() |
0beb82bbd6 | ||
![]() |
76c9000393 | ||
![]() |
9aedb34dc9 | ||
![]() |
9ea09c4498 | ||
![]() |
96f74ee15a | ||
![]() |
eb36aca641 | ||
![]() |
603001a75c | ||
![]() |
ab55c6af7c | ||
![]() |
ee37d5b8f0 | ||
![]() |
3ccefe33b3 | ||
![]() |
48515cf3b9 | ||
![]() |
b891b24e26 | ||
![]() |
424370a1c3 | ||
![]() |
e230fe25c0 | ||
![]() |
b70f38b8ff | ||
![]() |
d8361f3486 | ||
![]() |
1188ad0a67 | ||
![]() |
391a4f8fec | ||
![]() |
3534cfd3eb | ||
![]() |
45b205ddc3 | ||
![]() |
7e93a86ae0 | ||
![]() |
9060d8acca | ||
![]() |
2dcf151396 | ||
![]() |
1e84213f1a | ||
![]() |
6c1044e88c | ||
![]() |
727e33675c | ||
![]() |
22f5b59393 | ||
![]() |
e7a48c4234 | ||
![]() |
a865a697fa | ||
![]() |
ca8fbd081d | ||
![]() |
0046fb2a13 | ||
![]() |
cd39b17307 | ||
![]() |
7e9aed1154 | ||
![]() |
de3894e3dc | ||
![]() |
fca687a5c4 | ||
![]() |
1a8445dc6f | ||
![]() |
429e58c16e | ||
![]() |
9220efcc18 | ||
![]() |
b8ce4784eb | ||
![]() |
3e04d8ad92 | ||
![]() |
976cfe9182 | ||
![]() |
38edc02df5 | ||
![]() |
93aa1dd759 | ||
![]() |
201b6997ee | ||
![]() |
8b34e80d5b | ||
![]() |
e098943b69 | ||
![]() |
c2174dfdb2 | ||
![]() |
dc07c27531 | ||
![]() |
638586c36d | ||
![]() |
1f7403f6a5 | ||
![]() |
a3cb9ad079 | ||
![]() |
36a5895664 | ||
![]() |
5b45cb438a | ||
![]() |
123a56f577 | ||
![]() |
6df77c762e | ||
![]() |
51e556b369 | ||
![]() |
aad9c3a9ec | ||
![]() |
be329e0bbc | ||
![]() |
6cb77ab427 | ||
![]() |
d91c4891d8 | ||
![]() |
72ab0e4a9f | ||
![]() |
8ced18b4c7 | ||
![]() |
c3f4d9cc53 | ||
![]() |
9437d24f45 | ||
![]() |
352690e1cd | ||
![]() |
e217a97e23 | ||
![]() |
10353c7406 | ||
![]() |
ee5686c5d6 | ||
![]() |
d671a3dfba | ||
![]() |
9a876b7dc7 | ||
![]() |
00f4cfa50f | ||
![]() |
9cf7811a8e | ||
![]() |
458a797fb8 | ||
![]() |
c13653f3b9 | ||
![]() |
f9f7978a07 | ||
![]() |
a2d3811736 | ||
![]() |
583d575a77 | ||
![]() |
e47c59eca3 | ||
![]() |
74e0d12a72 | ||
![]() |
788fef5ce6 | ||
![]() |
a3f5ef6acf | ||
![]() |
2bc130a93a | ||
![]() |
897ebe4b14 | ||
![]() |
c9537128dd | ||
![]() |
f0b46a1873 | ||
![]() |
7291efebae | ||
![]() |
3851d8352e | ||
![]() |
0cd46efe35 | ||
![]() |
1433ffcd13 | ||
![]() |
450bc8b5ff | ||
![]() |
4eadff404a | ||
![]() |
213141f55e | ||
![]() |
370f95f888 | ||
![]() |
7c8ad8ac41 | ||
![]() |
f7401d6344 | ||
![]() |
e85ffec947 | ||
![]() |
cf1f70d581 | ||
![]() |
e0161487fd | ||
![]() |
92946670b6 | ||
![]() |
4f2ef558ad | ||
![]() |
9b0c4c8ed2 | ||
![]() |
7ae1b57ddd | ||
![]() |
246bf48aba | ||
![]() |
41cbbe5818 | ||
![]() |
66964f9b58 | ||
![]() |
c2123de964 | ||
![]() |
b81147812c | ||
![]() |
27a8b8dda4 | ||
![]() |
bc88f98cf4 | ||
![]() |
af32e419ae | ||
![]() |
c68d0f27b8 | ||
![]() |
593680f8d3 | ||
![]() |
0b59811c77 | ||
![]() |
c836fa7a74 | ||
![]() |
172f71de81 | ||
![]() |
3d582fe851 | ||
![]() |
8f18304257 |
295
.editorconfig
Normal file
295
.editorconfig
Normal file
@@ -0,0 +1,295 @@
|
||||
root=true
|
||||
# To learn more about .editorconfig see https://aka.ms/editorconfigdocs
|
||||
# With more recent updates Visual Studio 2017 supports EditorConfig files out of the box
|
||||
# Visual Studio Code needs an extension: https://github.com/editorconfig/editorconfig-vscode
|
||||
# For emacs, vim, np++ and other editors, see here: https://github.com/editorconfig
|
||||
###############################
|
||||
# Core EditorConfig Options #
|
||||
###############################
|
||||
# All files
|
||||
[*]
|
||||
indent_style=space
|
||||
insert_final_newline=true
|
||||
charset=utf-8
|
||||
end_of_line=lf
|
||||
trim_trailing_whitespace=true
|
||||
|
||||
# Microsoft .NET properties
|
||||
csharp_new_line_before_members_in_object_initializers=true
|
||||
csharp_space_after_cast=false
|
||||
csharp_style_var_elsewhere=true:suggestion
|
||||
csharp_style_var_for_built_in_types=true:suggestion
|
||||
csharp_style_var_when_type_is_apparent=true:suggestion
|
||||
dotnet_style_parentheses_in_arithmetic_binary_operators=never_if_unnecessary:none
|
||||
dotnet_style_parentheses_in_other_binary_operators=never_if_unnecessary:none
|
||||
dotnet_style_parentheses_in_relational_binary_operators=never_if_unnecessary:none
|
||||
|
||||
# ReSharper properties
|
||||
resharper_align_linq_query=true
|
||||
resharper_align_multiline_argument=true
|
||||
resharper_align_multiline_calls_chain=true
|
||||
resharper_align_multiline_extends_list=true
|
||||
resharper_align_multiline_for_stmt=true
|
||||
resharper_align_tuple_components=true
|
||||
resharper_csharp_alignment_tab_fill_style=optimal_fill
|
||||
resharper_csharp_align_multiline_parameter=true
|
||||
resharper_csharp_align_multiple_declaration=true
|
||||
resharper_csharp_indent_pars=outside
|
||||
resharper_csharp_keep_blank_lines_in_code=0
|
||||
resharper_csharp_keep_blank_lines_in_declarations=1
|
||||
resharper_csharp_max_line_length=125
|
||||
resharper_csharp_stick_comment=false
|
||||
resharper_csharp_wrap_after_invocation_lpar=true
|
||||
resharper_force_attribute_style=join
|
||||
resharper_indent_invocation_pars=outside
|
||||
resharper_indent_method_decl_pars=outside
|
||||
resharper_indent_preprocessor_region=no_indent
|
||||
resharper_indent_statement_pars=outside
|
||||
resharper_indent_typearg_angles=outside
|
||||
resharper_indent_typeparam_angles=outside
|
||||
resharper_keep_existing_embedded_arrangement=false
|
||||
resharper_keep_existing_expr_member_arrangement=false
|
||||
resharper_keep_existing_invocation_parens_arrangement=false
|
||||
resharper_keep_existing_linebreaks=false
|
||||
resharper_keep_existing_switch_expression_arrangement=false
|
||||
resharper_place_attribute_on_same_line=false
|
||||
resharper_place_expr_accessor_on_single_line=true
|
||||
resharper_place_expr_method_on_single_line=true
|
||||
resharper_place_expr_property_on_single_line=true
|
||||
resharper_place_simple_embedded_statement_on_same_line=false
|
||||
resharper_space_within_empty_braces=false
|
||||
resharper_wrap_array_initializer_style=chop_always
|
||||
resharper_wrap_before_extends_colon=true
|
||||
resharper_wrap_before_type_parameter_langle=true
|
||||
resharper_wrap_multiple_type_parameter_constraints_style=wrap_if_long
|
||||
resharper_wrap_object_and_collection_initializer_style=chop_always
|
||||
|
||||
# ReSharper inspection severities
|
||||
resharper_arrange_attributes_highlighting=suggestion
|
||||
resharper_arrange_redundant_parentheses_highlighting=suggestion
|
||||
resharper_enforce_if_statement_braces_highlighting=suggestion
|
||||
|
||||
# Xml project files
|
||||
[*.{csproj,vbproj,vcxproj,vcxproj.filters,proj,projitems,shproj}]
|
||||
indent_size=2
|
||||
|
||||
# JavaScript/HTML
|
||||
[*.{js,ts,json,html,cshtml}]
|
||||
indent_size=2
|
||||
|
||||
# Code files
|
||||
[*.{cs,csx,vb,vbx}]
|
||||
indent_size=4
|
||||
|
||||
###############################
|
||||
# .NET Coding Conventions #
|
||||
###############################
|
||||
[*.{cs,vb}]
|
||||
# Organize usings
|
||||
dotnet_sort_system_directives_first=true
|
||||
# this. preferences
|
||||
dotnet_style_qualification_for_field=false:suggestion
|
||||
dotnet_style_qualification_for_property=false:suggestion
|
||||
dotnet_style_qualification_for_method=false:suggestion
|
||||
dotnet_style_qualification_for_event=false:suggestion
|
||||
# Language keywords vs BCL types preferences
|
||||
dotnet_style_predefined_type_for_locals_parameters_members=true:warning
|
||||
dotnet_style_predefined_type_for_member_access=true:suggestion
|
||||
# Parentheses preferences
|
||||
dotnet_style_parentheses_in_arithmetic_binary_operators=always_for_clarity:silent
|
||||
dotnet_style_parentheses_in_relational_binary_operators=always_for_clarity:silent
|
||||
dotnet_style_parentheses_in_other_binary_operators=always_for_clarity:silent
|
||||
dotnet_style_parentheses_in_other_operators=never_if_unnecessary:silent
|
||||
# Modifier preferences
|
||||
dotnet_style_require_accessibility_modifiers=for_non_interface_members:silent
|
||||
dotnet_style_readonly_field=true:suggestion
|
||||
|
||||
# Expression-level preferences
|
||||
dotnet_style_object_initializer=true:warning
|
||||
dotnet_style_collection_initializer=true:warning
|
||||
dotnet_style_explicit_tuple_names=true:suggestion
|
||||
dotnet_style_null_propagation=true:suggestion
|
||||
dotnet_style_coalesce_expression=true:suggestion
|
||||
dotnet_style_prefer_is_null_check_over_reference_equality_method=true:suggestion
|
||||
dotnet_style_prefer_inferred_tuple_names=true:suggestion
|
||||
dotnet_style_prefer_inferred_anonymous_type_member_names=true:suggestion
|
||||
dotnet_style_prefer_auto_properties=true:suggestion
|
||||
dotnet_style_prefer_conditional_expression_over_assignment=true:suggestion
|
||||
dotnet_style_prefer_conditional_expression_over_return=true:suggestion
|
||||
dotnet_style_prefer_compound_assignment=true:suggestion
|
||||
|
||||
###############################
|
||||
# Naming Conventions #
|
||||
###############################
|
||||
# Style Definitions
|
||||
dotnet_naming_style.pascal_case_style.capitalization=pascal_case
|
||||
# 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.symbols=constant_fields
|
||||
dotnet_naming_rule.constant_fields_should_be_pascal_case.style=pascal_case_style
|
||||
dotnet_naming_symbols.constant_fields.applicable_kinds=field
|
||||
dotnet_naming_symbols.constant_fields.applicable_accessibilities=*
|
||||
dotnet_naming_symbols.constant_fields.required_modifiers=const
|
||||
|
||||
# Naming rules
|
||||
|
||||
dotnet_naming_rule.interface_should_be_begins_with_i.severity = warning
|
||||
dotnet_naming_rule.interface_should_be_begins_with_i.symbols = interface
|
||||
dotnet_naming_rule.interface_should_be_begins_with_i.style = begins_with_i
|
||||
|
||||
dotnet_naming_rule.types_should_be_pascal_case.severity = warning
|
||||
dotnet_naming_rule.types_should_be_pascal_case.symbols = types
|
||||
dotnet_naming_rule.types_should_be_pascal_case.style = pascal_case
|
||||
|
||||
dotnet_naming_rule.non_field_members_should_be_pascal_case.severity = warning
|
||||
dotnet_naming_rule.non_field_members_should_be_pascal_case.symbols = non_field_members
|
||||
dotnet_naming_rule.non_field_members_should_be_pascal_case.style = pascal_case
|
||||
|
||||
dotnet_naming_rule.private_or_internal_static_field_should_be_private_or_internal_static_with_prefix.severity = warning
|
||||
dotnet_naming_rule.private_or_internal_static_field_should_be_private_or_internal_static_with_prefix.symbols = private_or_internal_static_field
|
||||
dotnet_naming_rule.private_or_internal_static_field_should_be_private_or_internal_static_with_prefix.style = private_or_internal_static_with_prefix
|
||||
|
||||
dotnet_naming_rule.private_or_internal_field_should_be_private_prefix.severity = warning
|
||||
dotnet_naming_rule.private_or_internal_field_should_be_private_prefix.symbols = private_or_internal_field
|
||||
dotnet_naming_rule.private_or_internal_field_should_be_private_prefix.style = private_prefix
|
||||
|
||||
dotnet_naming_rule.asyncmethods_should_be_ends_with_async.severity = warning
|
||||
dotnet_naming_rule.asyncmethods_should_be_ends_with_async.symbols = asyncmethods
|
||||
dotnet_naming_rule.asyncmethods_should_be_ends_with_async.style = ends_with_async
|
||||
|
||||
# Symbol specifications
|
||||
|
||||
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.required_modifiers =
|
||||
|
||||
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.required_modifiers =
|
||||
|
||||
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.required_modifiers = static
|
||||
|
||||
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.required_modifiers =
|
||||
|
||||
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.required_modifiers =
|
||||
|
||||
dotnet_naming_symbols.asyncmethods.applicable_kinds = delegate, method, local_function
|
||||
dotnet_naming_symbols.asyncmethods.applicable_accessibilities = *
|
||||
dotnet_naming_symbols.asyncmethods.required_modifiers = async
|
||||
|
||||
# Naming styles
|
||||
|
||||
dotnet_naming_style.pascal_case.required_prefix =
|
||||
dotnet_naming_style.pascal_case.required_suffix =
|
||||
dotnet_naming_style.pascal_case.word_separator =
|
||||
dotnet_naming_style.pascal_case.capitalization = pascal_case
|
||||
|
||||
dotnet_naming_style.begins_with_i.required_prefix = I
|
||||
dotnet_naming_style.begins_with_i.required_suffix =
|
||||
dotnet_naming_style.begins_with_i.word_separator =
|
||||
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_suffix =
|
||||
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_prefix.required_prefix = _
|
||||
dotnet_naming_style.private_prefix.required_suffix =
|
||||
dotnet_naming_style.private_prefix.word_separator =
|
||||
dotnet_naming_style.private_prefix.capitalization = camel_case
|
||||
|
||||
dotnet_naming_style.ends_with_async.required_prefix =
|
||||
dotnet_naming_style.ends_with_async.required_suffix = Async
|
||||
dotnet_naming_style.ends_with_async.word_separator =
|
||||
dotnet_naming_style.ends_with_async.capitalization = pascal_case
|
||||
|
||||
###############################
|
||||
# C# Coding Conventions #
|
||||
###############################
|
||||
[*.cs]
|
||||
# var preferences
|
||||
csharp_style_var_for_built_in_types=true:suggestion
|
||||
csharp_style_var_when_type_is_apparent=true:suggestion
|
||||
csharp_style_var_elsewhere=true:suggestion
|
||||
# Expression-bodied members
|
||||
csharp_style_expression_bodied_methods=when_on_single_line:suggestion
|
||||
csharp_style_expression_bodied_constructors=when_on_single_line:suggestion
|
||||
csharp_style_expression_bodied_operators=when_on_single_line:suggestion
|
||||
csharp_style_expression_bodied_properties=true:suggestion
|
||||
csharp_style_expression_bodied_indexers=true:suggestion
|
||||
csharp_style_expression_bodied_accessors=true:suggestion
|
||||
csharp_style_expression_bodied_lambdas=true:suggestion
|
||||
csharp_style_expression_bodied_local_functions=true:suggestion
|
||||
|
||||
# Pattern matching preferences
|
||||
csharp_style_pattern_matching_over_is_with_cast_check=true:suggestion
|
||||
csharp_style_pattern_matching_over_as_with_null_check=true:suggestion
|
||||
# Null-checking preferences
|
||||
csharp_style_throw_expression=true:warning
|
||||
csharp_style_conditional_delegate_call=true:warning
|
||||
# Modifier preferences
|
||||
csharp_preferred_modifier_order=public,private,protected,internal,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,volatile,async:suggestion
|
||||
# Expression-level preferences
|
||||
csharp_prefer_braces=false:suggestion
|
||||
csharp_style_deconstructed_variable_declaration=true:suggestion
|
||||
csharp_prefer_simple_default_expression=true:warning
|
||||
csharp_style_pattern_local_over_anonymous_function=true:suggestion
|
||||
csharp_style_inlined_variable_declaration=true:suggestion
|
||||
# Prefer C# 8.0 Indexing Features
|
||||
csharp_style_prefer_index_operator=true:suggestion
|
||||
csharp_style_prefer_range_operator=true:suggestion
|
||||
|
||||
csharp_style_deconstructed_variable_declaration=true:suggestion
|
||||
csharp_style_pattern_local_over_anonymous_function=true:suggestion
|
||||
csharp_using_directive_placement=outside_namespace:suggestion
|
||||
csharp_prefer_static_local_function=true:suggestion
|
||||
csharp_prefer_simple_using_statement=true:suggestion
|
||||
csharp_style_prefer_switch_expression=true:suggestion
|
||||
|
||||
###############################
|
||||
# C# Formatting Rules #
|
||||
###############################
|
||||
# New line preferences
|
||||
csharp_new_line_before_open_brace=all
|
||||
csharp_new_line_before_else=true
|
||||
csharp_new_line_before_catch=true
|
||||
csharp_new_line_before_finally=true
|
||||
csharp_new_line_before_members_in_object_initializers=true
|
||||
csharp_new_line_before_members_in_anonymous_types=true
|
||||
csharp_new_line_between_query_expression_clauses=true
|
||||
# Indentation preferences
|
||||
csharp_indent_case_contents=true
|
||||
csharp_indent_switch_labels=true
|
||||
csharp_indent_labels=flush_left
|
||||
csharp_indent_block_contents=true
|
||||
csharp_indent_braces=false
|
||||
csharp_indent_case_contents_when_block=true
|
||||
# Space preferences
|
||||
csharp_space_after_cast=false
|
||||
csharp_space_after_keywords_in_control_flow_statements=true
|
||||
csharp_space_between_method_call_parameter_list_parentheses=false
|
||||
csharp_space_between_method_declaration_parameter_list_parentheses=false
|
||||
csharp_space_between_parentheses=false
|
||||
csharp_space_before_colon_in_inheritance_clause=true
|
||||
csharp_space_after_colon_in_inheritance_clause=true
|
||||
csharp_space_around_binary_operators=before_and_after
|
||||
csharp_space_between_method_declaration_empty_parameter_list_parentheses=false
|
||||
csharp_space_between_method_call_name_and_opening_parenthesis=false
|
||||
csharp_space_between_method_call_empty_parameter_list_parentheses=false
|
||||
# Wrapping preferences
|
||||
csharp_preserve_single_line_statements=false
|
||||
csharp_preserve_single_line_blocks=true
|
||||
|
||||
###############################
|
||||
# VB Coding Conventions #
|
||||
###############################
|
||||
[*.vb]
|
||||
# Modifier preferences
|
||||
visual_basic_preferred_modifier_order=Partial,Default,Private,Protected,Public,Friend,NotOverridable,Overridable,MustOverride,Overloads,Overrides,MustInherit,NotInheritable,Static,Shared,Shadows,ReadOnly,WriteOnly,Dim,Const,WithEvents,Widening,Narrowing,Custom,Async:suggestion
|
38
.github/ISSUE_TEMPLATE.md
vendored
38
.github/ISSUE_TEMPLATE.md
vendored
@@ -1,13 +1,33 @@
|
||||
**Please use the search bar** at the top of the page and make sure you are not creating an already submitted issue. Duplicating issues makes it more difficult for everyone to follow. Your issue may have already been solved in the past as well.
|
||||
**Please use the search bar** at the top of the page and make sure you are not creating an already submitted issue.
|
||||
Check closed issues as well, because your issue may have already been fixed.
|
||||
|
||||
Provide a description of the feature request or bug, the more details the better.
|
||||
Please read our [Contributing Guidelines](https://github.com/Jackett/Jackett/blob/master/CONTRIBUTING.md) before submitting your issue to ensure a prompt response to your bug.
|
||||
|
||||
If you are experiencing an issue with a tracker, then:
|
||||
1. Use your browser to check you can access the site directly, and if a login is required, check you can login and that you do not have any outstanding account issues.
|
||||
2. If you haven't already, try upgrading to the latest version of Jackett, your issue may have already been resolved.
|
||||
3. If it is still not working for you, then a **full enhanced log must be included**. Instructions for obtaining logs are here: https://github.com/Jackett/Jackett#troubleshooting
|
||||
### Environment
|
||||
|
||||
(At the bottom of your Jackett Dashboard page) **Jackett version**:
|
||||
(if you installed using Jackett.Binaries.Mono.tar.gz) **Mono version**:
|
||||
**OS**:
|
||||
|
||||
-------------------------------
|
||||
**.Net Runtime**: [.Net-Core/.Net-Framework/Mono]
|
||||
|
||||
**.Net Version**:
|
||||
|
||||
**Jackett Version**:
|
||||
|
||||
**Last Working Jackett Version**:
|
||||
|
||||
**Are you using a proxy or VPN?** [yes/no]
|
||||
|
||||
### Description
|
||||
|
||||
[List steps to reproduce the error and details on what happens and what you expected to happen]
|
||||
|
||||
|
||||
### Logged Error Messages
|
||||
|
||||
[Place any relevant error messages you noticed from the logs here.]
|
||||
|
||||
[Make sure you attach the full logs with your personal information removed in case we need more information]
|
||||
|
||||
### Screenshots
|
||||
|
||||
[Place any screenshots of the issue here if needed]
|
||||
|
BIN
.github/jackett-screenshot1.png
vendored
Executable file
BIN
.github/jackett-screenshot1.png
vendored
Executable file
Binary file not shown.
After Width: | Height: | Size: 202 KiB |
BIN
.github/jackett-screenshot2.png
vendored
Executable file
BIN
.github/jackett-screenshot2.png
vendored
Executable file
Binary file not shown.
After Width: | Height: | Size: 80 KiB |
BIN
.github/jackett-screenshot3.png
vendored
Executable file
BIN
.github/jackett-screenshot3.png
vendored
Executable file
Binary file not shown.
After Width: | Height: | Size: 135 KiB |
31
.github/no_information_provided.md
vendored
31
.github/no_information_provided.md
vendored
@@ -2,8 +2,31 @@ Hi @{{ payload.sender.login }},
|
||||
|
||||
You've created an issue, but haven't provided any details to allow the community to assist you. To prevent issue tracker clutter, this issue will now be closed. Please provide the information needed below and your comment will automatically re-open this issue.
|
||||
|
||||
Provide a description of the feature request or bug, the more details the better.
|
||||
If you are experiencing an issue with a tracker, a **full enhanced log must be included**. Instructions for obtaining logs are here: https://github.com/Jackett/Jackett#troubleshooting
|
||||
### Environment
|
||||
|
||||
(At the bottom of your Jackett Dashboard page) **Jackett version**:
|
||||
(if you installed using Jackett.Binaries.Mono.tar.gz) **Mono version**:
|
||||
**OS**:
|
||||
|
||||
**.Net Runtime**: [.Net-Core/.Net-Framework/Mono]
|
||||
|
||||
**.Net Version**:
|
||||
|
||||
**Jackett Version**:
|
||||
|
||||
**Last Working Jackett Version**:
|
||||
|
||||
**Are you using a proxy or VPN?** [yes/no]
|
||||
|
||||
### Description
|
||||
|
||||
[List steps to reproduce the error and details on what happens and what you expected to happen]
|
||||
|
||||
|
||||
### Logged Error Messages
|
||||
|
||||
[Place any relevant error messages you noticed from the logs here.]
|
||||
|
||||
[Make sure you attach the full logs with your personal information removed in case we need more information]
|
||||
|
||||
### Screenshots
|
||||
|
||||
[Place any screenshots of the issue here if needed]
|
||||
|
200
CONTRIBUTING.md
Normal file
200
CONTRIBUTING.md
Normal file
@@ -0,0 +1,200 @@
|
||||
# Contributing to Jackett
|
||||
|
||||
So, you've decided you want to help make Jackett a better program for everyone. Not everyone chooses to help, so we thank you for your decision.
|
||||
In order to help us make the most of your contribution please take the time to read these contributing guidelines.
|
||||
These are just guidelines, not hard rules. Use your best judgment, and feel free to propose changes to this document in a pull request.
|
||||
|
||||
## Ways you can help
|
||||
|
||||
- [Getting Started](#getting-started)
|
||||
- [Troubleshooting](#troubleshooting)
|
||||
- [Reporting a bug](#reporting-a-bug)
|
||||
- [Adding a new tracker](#adding-a-new-tracker)
|
||||
- [Contributing Code](#contributing-code)
|
||||
- [Setting up your environment](#setting-up-your-environment)
|
||||
- [Coding style](#coding-style)
|
||||
- [Getting your code accepted & pull requests](#pull-requests)
|
||||
|
||||
# Getting Started
|
||||
|
||||
Now that you've decided you want to help us make Jackett a better program the big question is: Where do you start?
|
||||
Why right here of course. You can help in several ways, from finding and reporting bugs, to adding new trackers,
|
||||
to fixing bugs in the program code itself. Below, we outline the steps needed to file your first bug report.
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
Before you submit a bug report, it's important to make sure it's not already a known issue,
|
||||
and to make sure it's a bug we can find and fix quickly.
|
||||
These troubleshooting tips will help make sure your bug report is high quality and can be fixed quickly.
|
||||
|
||||
**Update your Jackett to the latest version**
|
||||
|
||||
Before you submit a bug-report or do any other troubleshooting, make sure your Jackett is the latest release version.
|
||||
We are releasing bug fixes almost daily, so your issue may have been fixed already.
|
||||
Bugs that are submitted without being on the latest version may be closed.
|
||||
|
||||
**Error "An error occurred while sending the request: Error: TrustFailure (A call to SSPI failed, see inner exception.)"**
|
||||
|
||||
This is often caused by missing CA certificates.
|
||||
Try reimporting the certificates in this case:
|
||||
- On Linux (as user root): `wget -O - https://curl.haxx.se/ca/cacert.pem | cert-sync /dev/stdin`
|
||||
- On macOS: `curl -sS https://curl.haxx.se/ca/cacert.pem | cert-sync --user /dev/stdin`
|
||||
|
||||
**Tracker isn't working**
|
||||
|
||||
If you are experiencing an issue with a tracker, then:
|
||||
- Use your browser to check you can access the site directly, and if a login is required,
|
||||
check you can login and that you do not have any outstanding account issues.
|
||||
- If you haven't already, try upgrading to the latest version of Jackett.
|
||||
- If it is still not working for you, then a **full enhanced log must be included**.
|
||||
|
||||
**Enable enhanced logging**
|
||||
|
||||
- You can get *enhanced* logging with the command line switches `-t -l` or by enabling `Enhanced logging` via the web interface
|
||||
(followed by clicking on the `Apply Server Settings` button).
|
||||
- These enhanced logs are necessary for us to quickly track down your bug and get a fix implemented in code.
|
||||
- Make sure you remove your username/password/cookies from the log files before submitting them with your issue.
|
||||
- The logfiles (log.txt/updater.txt) are stored on Windows in `%ProgramData%\Jackett`, on Linux/macOS in `~/.config/Jackett/`,
|
||||
and on FreeBSD in `/usr/local/jackett`.
|
||||
|
||||
## Reporting a Bug
|
||||
|
||||
Once you have your enhanced logs and you are still unable to resolve your issue yourself, now it's time to prepare to submit a bug report!
|
||||
Before you submit your report, make sure you've searched open *and* closed bugs to see if someone's already informed us of your issue.
|
||||
|
||||
If your search doesn't help you fix your issue and you can't find a similar bug already listed, then you get to make a new issue.
|
||||
Your issue should have the following information.
|
||||
|
||||
- **Descriptive Title** - The title of your bug should include keywords and a descriptive summary of what you're experiencing
|
||||
to help others avoid duplicating your bug report
|
||||
- Keywords in the title should be as follows:
|
||||
- Tracker bugs should start with the tracker in brackets e.g. [**AnimeBytes**]
|
||||
- Feature requests should start with [**REQ**]
|
||||
- New trackers should begin with [**New**] and the tracker type [**Public**/**Private**/**Semi-Private**] e.g. **[New][Public] ThePirateBay**
|
||||
- **Environment Details** - These are things like your OS version, Jackett type and version, mono/.Net-core/framework version(s).
|
||||
These are asked for by the issue template when you create a new issue on GitHub.
|
||||
- **Steps** to cause the problem, if applicable. These should be specific and repeatable.
|
||||
- **What happens** when you take the steps and **what you expected to happen**
|
||||
- **Error messages** and/or screenshots of the issue.
|
||||
- The **last working version** if it's applicable. Tracker issues normally don't need this information.
|
||||
- An attached copy of your **enhanced logs**. Don't forget to remove usernames/passwords/API-keys from the logs.
|
||||
We'll be working on making sure these are automatically censored in the future.
|
||||
- Any other **relevant details** you can think of. The more information we have, the quicker we can solve the problem.
|
||||
|
||||
## Adding a New Tracker
|
||||
|
||||
Jackett's framework typically allows our team and volunteering developers to implement new trackers in a couple of hours
|
||||
|
||||
Depending on logic complexity, there are two common ways new trackers are implemented:
|
||||
|
||||
1. simple [definitions](http://github.com/Jackett/Jackett/tree/master/src/Jackett.Common/Definitions) (.yml / YAML)
|
||||
2. advanced (native) [indexers](http://github.com/Jackett/Jackett/tree/master/src/Jackett.Common/Indexers) (.cs / C#)
|
||||
|
||||
Read more about the [simple definition format](https://github.com/Jackett/Jackett/wiki/Definition-format).
|
||||
|
||||
# Contributing Code
|
||||
|
||||
While reporting the bugs is super helpful since you can't fix bugs you don't know about, they don't get fixed unless someone goes in and fixes them.
|
||||
Luckily, you're a developer who wants to help us do just that. Thanks!
|
||||
We really need more developers working on Jackett, no matter their skill level or walk of life.
|
||||
We've developed the guide below to make sure we're all on the same page because this makes reading and fixing code much simpler, faster, and less bug-prone.
|
||||
|
||||
## Setting up your environment
|
||||
|
||||
The following guide assumes you've never worked with a Visual Studio project with GitHub before.
|
||||
This will give you the minimum necessary tools to get started. There are plenty of optional tools that may help you, but we won't cover those here.
|
||||
|
||||
- The guide is currently only geared towards developing on Windows using Visual Studio Community 2019.
|
||||
If you use something else, please add it here for others.
|
||||
|
||||
<details open=true> <summary> Windows </summary>
|
||||
|
||||
<details open=true> <summary> Visual Studio 2019 </summary>
|
||||
|
||||
- Install [Visual Studio Community 2019](http://visualstudio.com) for free.
|
||||
- About 2GB download. 8GB installed.
|
||||
- Make sure it includes the following Workloads/Components:
|
||||
- .Net Desktop Development
|
||||
- .Net Core Cross-Platform Development
|
||||
- GitHub extension for Visual Studio
|
||||
- [Connect and synchronize your forked repository to Visual Studio](https://doc.fireflymigration.com/working-with-github-fork-in-visual-studio.html)
|
||||
- Open `Tools -> NuGet Package Manager -> Package Manager Console`
|
||||
- From the PMC, run `dotnet tool install -g dotnet-format` and `dotnet restore`
|
||||
- Run `Build -> Rebuild Solution` to restore NuGet packages
|
||||
- Ensure `Jackett.Server` is the Startup Project (instead of `Jackett.Service`), and the Run Target (instead of `IIS Express`)
|
||||
|
||||
</details>
|
||||
|
||||
</details>
|
||||
|
||||
## Coding Style
|
||||
|
||||
Now that you're ready to code, it's time to teach you our style guidelines. This style guide helps our code stay readable and bug-free.
|
||||
You can see the full details in the [Editor Config](.editorconfig) file.
|
||||
Running `dotnet format` from the Package Manager Console will apply the style guide to the solution and is required before any pull request will be accepted.
|
||||
|
||||
- Whitespace
|
||||
- Indenting is done with 4 spaces
|
||||
- No whitespace at the end of lines
|
||||
- All files have a final newline
|
||||
- Unix style new lines for committed code
|
||||
- Spaces around all non-unary operators
|
||||
|
||||
- Braces
|
||||
- Opening brace on its own line
|
||||
- Single line statements do not use braces
|
||||
- If any part of an `if ... else if ... else` block needs braces, all blocks will use braces
|
||||
|
||||
- Naming
|
||||
- `interface` names begin with I and are `PascalCase`
|
||||
- `private` variables begin with _ and are `camelCase`
|
||||
- `private static` variables begin with s_ and are `camelCase`
|
||||
- local variables are `camelCase`
|
||||
- `async` function names end with Async
|
||||
- all others are `PascalCase`
|
||||
|
||||
- Others
|
||||
- Prefer `var` for declarations
|
||||
- Prefer modern language enhancements (C#7, C#8 features)
|
||||
- switch expressions
|
||||
- range operator
|
||||
- using statements
|
||||
- `default` over `default(T)`
|
||||
- Prefer conditional access `?.` and null coalescing `??` over null checks
|
||||
- Prefer pattern matching
|
||||
- Prefer expression bodies
|
||||
- Avoid `this` qualifier
|
||||
- `using` statements go outside namespace declaration and are sorted:
|
||||
- `using System`
|
||||
- `using System.*` alphabetically
|
||||
- all others alphabetically
|
||||
- Prefer explicit variable modifiers: `private`, `public`, `protected`
|
||||
- Prefer `readonly` and `const` variables when appropriate
|
||||
|
||||
## Pull Requests
|
||||
|
||||
At this point, you've found the bug, fixed it, tested that the bug is gone, and you haven't broken anything else in the process.
|
||||
Now it's time to share your code with everyone else so we can all enjoy a better version of the program.
|
||||
Here's what you need to do to give your pull request the best chance at a timely review and maximize that it will be accepted.
|
||||
|
||||
- Make sure your code follows GitHub and Jackett's standards and practices.
|
||||
- Your changes should be made in a new branch based on `master` not directly on your `master` branch
|
||||
- Your commit messages should start with a capital letter, be in the singular imperative voice, and do not end with punctuation marks, e.g.:
|
||||
- Fix login handling for xxx tracker
|
||||
- Add feature yyy
|
||||
- Remove dead tracker fff
|
||||
- Run `dotnet format` from the Package Manager Console (found in `Tools -> NuGet Package Manager` or `View -> Other Windows`)
|
||||
- If your branch falls out of sync and has merge conflicts with the Jackett official `master`
|
||||
[rebase](https://mohitgoyal.co/2018/04/18/working-with-git-and-visual-studio-use-git-rebase-inside-visual-studio/) your fix before submission.
|
||||
- If you deleted, moved, or renamed any files/folders, be sure to add the old file/folder path to the appropriate array in `Jacket.Updater/Program.cs`
|
||||
- If you added or renamed a tracker, update the README to include the new name
|
||||
- [Squash your local commits](https://github.com/spottedmahn/my-blog/issues/26)
|
||||
|
||||
- Push your commit branch to your fork on GitHub.
|
||||
- Create your Pull Request
|
||||
- You can do this from the GitHub website or from the GitHub window in Visual Studio.
|
||||
- Give your Pull Request a descriptive title
|
||||
- Include keywords like `[New Tracker]` or `[Feature]` at the beginning of the title
|
||||
- Include any open tickets this Pull Request should fix in the description. **Do not** put ticket numbers in the title.
|
||||
|
||||
We will be by when we can to review your Pull Request.
|
@@ -19,7 +19,7 @@ AppPublisher={#MyAppPublisher}
|
||||
AppPublisherURL={#MyAppURL}
|
||||
AppSupportURL={#MyAppURL}
|
||||
AppUpdatesURL={#MyAppURL}
|
||||
DefaultDirName={pf}\{#MyAppName}
|
||||
DefaultDirName={commonappdata}\{#MyAppName}
|
||||
DefaultGroupName={#MyAppName}
|
||||
DisableProgramGroupPage=yes
|
||||
OutputBaseFilename={#MyOutputFilename}
|
||||
|
220
README.md
220
README.md
@@ -3,13 +3,16 @@
|
||||
[](https://github.com/Jackett/Jackett/issues)
|
||||
[](https://github.com/Jackett/Jackett/pulls)
|
||||
[](https://ci.appveyor.com/project/Jackett/jackett)
|
||||
[](https://github.com/Jackett/Jackett/releases/latest)
|
||||
[](https://dev.azure.com/Jackett-project/Jackett/_build/latest?definitionId=1&branchName=master)
|
||||
[](https://github.com/Jackett/Jackett/releases/latest)
|
||||
[](https://hub.docker.com/r/linuxserver/jackett/)
|
||||
[](https://discord.gg/J865QuA)
|
||||
|
||||
This project is a new fork and is recruiting development help. If you are able to help out please contact us.
|
||||
|
||||
Jackett works as a proxy server: it translates queries from apps ([Sonarr](https://github.com/Sonarr/Sonarr), [Radarr](https://github.com/Radarr/Radarr), [SickRage](https://sickrage.github.io/), [CouchPotato](https://couchpota.to/), [Mylar](https://github.com/evilhero/mylar), [Lidarr](https://github.com/lidarr/lidarr), [DuckieTV](https://github.com/SchizoDuckie/DuckieTV), [qBittorrent](https://www.qbittorrent.org/), [Nefarious](https://github.com/lardbit/nefarious) etc) into tracker-site-specific http queries, parses the html response, then sends results back to the requesting software. This allows for getting recent uploads (like RSS) and performing searches. Jackett is a single repository of maintained indexer scraping & translation logic - removing the burden from other apps.
|
||||
Please see our [troubleshooting and contributing guidelines](CONTRIBUTING.md) before submitting any issues or pull requests
|
||||
|
||||
Jackett works as a proxy server: it translates queries from apps ([Sonarr](https://github.com/Sonarr/Sonarr), [Radarr](https://github.com/Radarr/Radarr), [SickRage](https://sickrage.github.io/), [CouchPotato](https://couchpota.to/), [Mylar](https://github.com/evilhero/mylar), [Lidarr](https://github.com/lidarr/lidarr), [DuckieTV](https://github.com/SchizoDuckie/DuckieTV), [qBittorrent](https://www.qbittorrent.org/), [Nefarious](https://github.com/lardbit/nefarious) etc.) into tracker-site-specific http queries, parses the html response, then sends results back to the requesting software. This allows for getting recent uploads (like RSS) and performing searches. Jackett is a single repository of maintained indexer scraping & translation logic - removing the burden from other apps.
|
||||
|
||||
Developer note: The software implements the [Torznab](https://github.com/Sonarr/Sonarr/wiki/Implementing-a-Torznab-indexer) (with [nZEDb](https://github.com/nZEDb/nZEDb/blob/dev/docs/newznab_api_specification.txt) category numbering) and [TorrentPotato](https://github.com/RuudBurger/CouchPotatoServer/wiki/Couchpotato-torrent-provider) APIs.
|
||||
|
||||
@@ -18,23 +21,28 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
|
||||
#### Supported Systems
|
||||
* Windows 7SP1 or greater using .NET 4.6.1 or above [Download here](https://www.microsoft.com/net/framework/versions/net461)
|
||||
* Linux [supported operating systems here](https://github.com/dotnet/core/blob/master/release-notes/2.1/2.1-supported-os.md#linux)
|
||||
* macOS 10.12 or greater
|
||||
* macOS 10.13 or greater
|
||||
|
||||
<details> <summary> <b> Supported Public Trackers </b> </summary>
|
||||
|
||||
### Supported Public Trackers
|
||||
* 1337x
|
||||
* 7torrents
|
||||
* ACG.RIP
|
||||
* ACGsou
|
||||
* Anidex
|
||||
* Anime Tosho
|
||||
* AniRena
|
||||
* AudioBook Bay (ABB)
|
||||
* Badass Torrents
|
||||
* BigFANGroup
|
||||
* BitRu
|
||||
* BitTorrent.AM
|
||||
* BTDB
|
||||
* BTDIGG
|
||||
* BTeye
|
||||
* BT.etree
|
||||
* BTSOW
|
||||
* Cili180
|
||||
* ConCen
|
||||
* Corsaro.red
|
||||
* cpasbien
|
||||
@@ -44,20 +52,22 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
|
||||
* ETTV
|
||||
* EliteTorrent.biz
|
||||
* EstrenosDTL
|
||||
* ExtraTorrent.ag
|
||||
* ExtraTorrent.cd
|
||||
* EXT Torrents
|
||||
* EZTV
|
||||
* Filebase
|
||||
* FireBit
|
||||
* Frozen Layer
|
||||
* GamesTorrents
|
||||
* GkTorrent
|
||||
* GloDLS
|
||||
* HDReactor
|
||||
* Hon3yHD.net
|
||||
* Horrible Subs
|
||||
* IBit
|
||||
* Idope
|
||||
* Il Corsaro Nero <!-- maintained by bonny1992 -->
|
||||
* Il Corsaro Blu
|
||||
* Internet Archive (archive.org)
|
||||
* Isohunt2
|
||||
* iTorrent
|
||||
* KickAssTorrent (KATcr)
|
||||
@@ -66,6 +76,7 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
|
||||
* LePorno
|
||||
* LimeTorrents
|
||||
* MacTorrents
|
||||
* Magnet4You
|
||||
* MagnetDL
|
||||
* MejorTorrent <!-- maintained by ivandelabeldad -->
|
||||
* Monova
|
||||
@@ -80,6 +91,8 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
|
||||
* Nyaa-Pantsu
|
||||
* OxTorrent
|
||||
* PiratBit
|
||||
* Pirateiro
|
||||
* PornLeech
|
||||
* ProStyleX
|
||||
* RARBG
|
||||
* Rus-media
|
||||
@@ -98,23 +111,28 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
|
||||
* Torlock
|
||||
* TOROS
|
||||
* Torrent Downloads (TD)
|
||||
* Torrent4You
|
||||
* Torrent9
|
||||
* Torrent9Clone
|
||||
* TorrentDownload
|
||||
* TorrentFunk
|
||||
* TorrentGalaxy (TGx)
|
||||
* TorrentKitty
|
||||
* TorrentParadise
|
||||
* TorrentProject2
|
||||
* TorrentQuest
|
||||
* Torrents.csv
|
||||
* TorrentView
|
||||
* TorrentWal
|
||||
* Torrentz2
|
||||
* Underverse
|
||||
* YourBittorrent
|
||||
* YTS.ag
|
||||
* Zooqle
|
||||
</details>
|
||||
|
||||
<details> <summary> <b> Supported Semi-Private Trackers </b> </summary>
|
||||
|
||||
### Supported Semi-Private Trackers
|
||||
* Alein
|
||||
* AlexFilm
|
||||
* AniDUB
|
||||
@@ -127,12 +145,14 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
|
||||
* Deildu
|
||||
* DXP (Deaf Experts)
|
||||
* EniaHD
|
||||
* Film-Paleis
|
||||
* Erzsebet
|
||||
* ExtremlymTorrents
|
||||
* Gay-Torrents.net
|
||||
* Gay-Torrents.org
|
||||
* HamsterStudio
|
||||
* HD Dolby
|
||||
* Kinozal
|
||||
* Korsar
|
||||
* LostFilm.tv
|
||||
* Marine Tracker
|
||||
* Metal Tracker
|
||||
@@ -143,6 +163,7 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
|
||||
* Pornolab
|
||||
* RiperAM
|
||||
* RockBox
|
||||
* Rustorka
|
||||
* RuTracker
|
||||
* Sharewood
|
||||
* SkTorrent
|
||||
@@ -152,16 +173,18 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
|
||||
* Torrents-Local
|
||||
* TribalMixes
|
||||
* Union Fansub
|
||||
* Vanila
|
||||
* YggTorrent (YGG)
|
||||
* Ztracker
|
||||
</details>
|
||||
|
||||
<details> <summary> <b> Supported Private Trackers </b> </summary>
|
||||
|
||||
### Supported Private Trackers
|
||||
* 0day.kiev
|
||||
* 2 Fast 4 You
|
||||
* 3D Torrents (3DT)
|
||||
* 3D Torrents (3DT)
|
||||
* 3evils
|
||||
* 4thD (4th Dimension)
|
||||
* 52PT
|
||||
* 720pier
|
||||
* Abnormal
|
||||
* Acid Lounge (A-L)
|
||||
@@ -182,7 +205,9 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
|
||||
* Back-ups
|
||||
* BakaBT
|
||||
* BaconBits (bB)
|
||||
* BeiTai
|
||||
* BeyondHD (BHD)
|
||||
* Bibliotik
|
||||
* BIGTorrent
|
||||
* BigTower
|
||||
* Bit-City Reloaded
|
||||
@@ -196,7 +221,10 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
|
||||
* BJ-Share (BJ)
|
||||
* BlueBird
|
||||
* Blutopia (BLU)
|
||||
* Brasil Tracker
|
||||
* BroadcastTheNet (BTN)
|
||||
* BroadCity
|
||||
* BRObits
|
||||
* BrokenStones
|
||||
* BTGigs (TG)
|
||||
* BTNext (BTNT)
|
||||
@@ -209,6 +237,7 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
|
||||
* CHDBits
|
||||
* ChannelX
|
||||
* Cinemageddon
|
||||
* CinemaMovies
|
||||
* Cinematik
|
||||
* CinemaZ (EuTorrents)
|
||||
* Classix
|
||||
@@ -225,6 +254,7 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
|
||||
* DigitalCore
|
||||
* DigitalHive
|
||||
* DivTeam
|
||||
* DivxTotal
|
||||
* DocumentaryTorrents (DT)
|
||||
* Downloadville
|
||||
* Dragonworld Reloaded
|
||||
@@ -232,14 +262,19 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
|
||||
* EbookParadijs
|
||||
* Ebooks-Shares
|
||||
* EfectoDoppler
|
||||
* EggMeOn
|
||||
* Elite-Tracker
|
||||
* Empornium (EMP)
|
||||
* eShareNet
|
||||
* eStone (XiDER, BeLoad)
|
||||
* Ethor.net (Thor's Land)
|
||||
* ExtremeTorrents
|
||||
* FANO.IN
|
||||
* FileList (FL)
|
||||
* FeedUrNeed (FuN)
|
||||
* Femdomcult
|
||||
* FileList (FL)
|
||||
* Film-Paleis
|
||||
* FinVip
|
||||
* FocusX
|
||||
* FreeTorrent
|
||||
* FullMixMusic
|
||||
@@ -258,6 +293,7 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
|
||||
* Greek Team
|
||||
* HacheDe
|
||||
* HD-Forever (HDF)
|
||||
* HD-Olimpo
|
||||
* HD-Only (HDO)
|
||||
* HD-Space (HDS)
|
||||
* HD-Spain
|
||||
@@ -269,10 +305,12 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
|
||||
* HDCenter
|
||||
* HDChina (HDWing)
|
||||
* HDCity
|
||||
* HDDisk (HDD)
|
||||
* HDHome (HDBigger)
|
||||
* HDME
|
||||
* HDRoute
|
||||
* HDSky
|
||||
* HDTime
|
||||
* HDTorrents.it
|
||||
* HDTurk
|
||||
* HDU
|
||||
@@ -280,7 +318,7 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
|
||||
* Hebits
|
||||
* Hon3y HD
|
||||
* HQSource (HQS)
|
||||
* HuSh
|
||||
* HuSh
|
||||
* ICE Torrent
|
||||
* ImmortalSeed (iS)
|
||||
* Immortuos
|
||||
@@ -290,7 +328,9 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
|
||||
* JPopsuki
|
||||
* Kapaki
|
||||
* Karagarga
|
||||
* LegacyHD (HD4Free)
|
||||
* Le Saloon
|
||||
* LeagueHD
|
||||
* LearnFlakes
|
||||
* LibraNet (LN)
|
||||
* LinkoManija
|
||||
@@ -298,6 +338,8 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
|
||||
* M-Team TP (MTTP)
|
||||
* Magico (Trellas)
|
||||
* Majomparádé (TurkDepo)
|
||||
* MicroBit (µBit)
|
||||
* MoeCat
|
||||
* Mononoké-BT
|
||||
* MoreThanTV (MTV)
|
||||
* MyAnonamouse (MAM)
|
||||
@@ -306,17 +348,20 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
|
||||
* NBTorrents
|
||||
* NCore
|
||||
* Nebulance (NBL) (TransmiTheNet)
|
||||
* NetCosmo
|
||||
* NetLab
|
||||
* New Real World
|
||||
* Norbits
|
||||
* NordicBits (NB)
|
||||
* NORDiCHD
|
||||
* Nostalgic (The Archive)
|
||||
* notwhat.cd
|
||||
* OnlineSelfEducation
|
||||
* Orpheus
|
||||
* Ourbits (HDPter)
|
||||
* P2PBG
|
||||
* P2PElite
|
||||
* Partis
|
||||
* Passione Torrent <!-- maintained by bonny1992 -->
|
||||
* PassThePopcorn (PTP)
|
||||
* Peers.FM
|
||||
* PirateTheNet (PTN)
|
||||
@@ -326,6 +371,7 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
|
||||
* PolishSource (PS)
|
||||
* PolishTracker
|
||||
* Pornbay
|
||||
* PornBits (PB)
|
||||
* Pretome
|
||||
* PrivateHD (PHD)
|
||||
* ProAudioTorrents (PAT)
|
||||
@@ -351,6 +397,7 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
|
||||
* ScenePalace (SP)
|
||||
* SceneRush
|
||||
* SceneTime
|
||||
* SceneXpress
|
||||
* SDBits
|
||||
* Secret Cinema
|
||||
* SeedFile (SF)
|
||||
@@ -360,6 +407,7 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
|
||||
* Shazbat
|
||||
* Shellife (SL)
|
||||
* SiamBIT
|
||||
* SnowPT (SSPT)
|
||||
* SpaceTorrent
|
||||
* SpeedCD
|
||||
* SpeedTorrent Reloaded
|
||||
@@ -370,7 +418,6 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
|
||||
* TakeaByte
|
||||
* Tapochek
|
||||
* Tasmanit
|
||||
* Tazmania-Den
|
||||
* TeamHD
|
||||
* TeamOS
|
||||
* TEKNO3D
|
||||
@@ -378,16 +425,18 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
|
||||
* TenYardTorrents (TYT)
|
||||
* TheAudioScene
|
||||
* TheEmpire (TE)
|
||||
* The Falling Angels (TFA)
|
||||
* The Geeks
|
||||
* The Horror Charnel (THC)
|
||||
* The Movie Cave
|
||||
* The New Retro
|
||||
* The Occult
|
||||
* The Place
|
||||
* The Resurrection
|
||||
* The Shinning (TsH)
|
||||
* The Show
|
||||
* The-Torrents
|
||||
* The-Madhouse
|
||||
* The Vault
|
||||
* TLFBits
|
||||
* Torrent Network (TN)
|
||||
* Torrent Sector Crew (TSC)
|
||||
* Torrent.LT
|
||||
@@ -396,11 +445,13 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
|
||||
* TorrentCCF (TCCF)
|
||||
* TorrentDay (TD)
|
||||
* Torrentech (TTH)
|
||||
* TorrentFactory
|
||||
* TorrentHeaven
|
||||
* TorrentHR
|
||||
* Torrenting (TT)
|
||||
* Torrentland
|
||||
* TorrentLeech (TL)
|
||||
* TorrentLeech.pl
|
||||
* TorrentSeeds (TS)
|
||||
* Torrent-Syndikat
|
||||
* TOrrent-tuRK (TORK)
|
||||
@@ -408,16 +459,18 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
|
||||
* ToTheGlory
|
||||
* TranceTraffic
|
||||
* Trezzor
|
||||
* TurkTorrent (TT) [![(invite needed)][inviteneeded]](#)
|
||||
* TurkTorrent (TT)
|
||||
* TV Chaos UK (TVCUK)
|
||||
* TV-Vault
|
||||
* TVstore
|
||||
* Twilight Torrents
|
||||
* Twilights Zoom
|
||||
* u-torrents (SceneFZ)
|
||||
* UHDBits
|
||||
* UnionGang
|
||||
* UnlimitZ
|
||||
* Vizuk
|
||||
* WDT (Wrestling Desires Torrents / Ultimate Wrestling Torrents)
|
||||
* World-In-HD
|
||||
* World-of-Tomorrow
|
||||
* x-ite.me (XM)
|
||||
@@ -431,8 +484,9 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
|
||||
* ExoticaZ (YourExotic)
|
||||
* Zamunda.net
|
||||
* Zelka.org
|
||||
</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 kaso1717 -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.
|
||||
|
||||
### Aggregate indexers
|
||||
|
||||
@@ -442,12 +496,12 @@ It will query all configured indexers and return the combined results.
|
||||
If your client supports multiple feeds it's recommended to add each indexer directly instead of using the all indexer.
|
||||
Using the all indexer has no advantages (besides reduced management overhead), only disadvantages:
|
||||
* you lose control over indexer specific settings (categories, search modes, etc.)
|
||||
* mixing search modes (IMDB, query, etc.) might cause low quality results
|
||||
* mixing search modes (IMDB, query, etc.) might cause low-quality results
|
||||
* indexer specific categories (>= 100000) can't be used.
|
||||
* slow indexers will slow down the overall result
|
||||
* total results are limited to 1000
|
||||
|
||||
To get all Jackett indexers including their capabilities you can use `t=indexers` on the all indexer. To get only configured/unconfigured indexers you can also add `configured=true/false` as query parameter.
|
||||
To get all Jackett indexers including their capabilities you can use `t=indexers` on the all indexer. To get only configured/unconfigured indexers you can also add `configured=true/false` as a query parameter.
|
||||
|
||||
|
||||
## Installation on Windows
|
||||
@@ -459,7 +513,7 @@ To get started with using the installer for Jackett, follow the steps below:
|
||||
2. When prompted if you would like this app to make changes to your computer, select "yes".
|
||||
3. If you would like to install Jackett as a Windows Service, make sure the "Install as Windows Service" checkbox is filled.
|
||||
4. Once the installation has finished, check the "Launch Jackett" box to get started.
|
||||
5. Navigate your web browser to: http://127.0.0.1:9117
|
||||
5. Navigate your web browser to http://127.0.0.1:9117
|
||||
6. You're now ready to begin adding your trackers and using Jackett.
|
||||
|
||||
When installed as a service the tray icon acts as a way to open/start/stop Jackett. If you opted to not install it as a service then Jackett will run its web server from the tray tool.
|
||||
@@ -468,7 +522,7 @@ Jackett can also be run from the command line if you would like to see log messa
|
||||
|
||||
|
||||
## Install on Linux (AMDx64)
|
||||
On most operating systems all the required dependencies will already be present. In case they are not, you can refer to this page https://github.com/dotnet/core/blob/master/Documentation/linux-prereqs.md
|
||||
On most operating systems all the required dependencies will already be present. In case they are not, you can refer to this page https://github.com/dotnet/core/blob/master/Documentation/linux-prereqs.md
|
||||
|
||||
### Install as service
|
||||
1. Download and extract the latest `Jackett.Binaries.LinuxAMDx64.tar.gz` release from the [releases page](https://github.com/Jackett/Jackett/releases)
|
||||
@@ -478,21 +532,21 @@ On most operating systems all the required dependencies will already be present.
|
||||
Download and extract the latest `Jackett.Binaries.LinuxAMDx64.tar.gz` release from the [releases page](https://github.com/Jackett/Jackett/releases), open a Terminal, cd to the jackett folder and run Jackett with the command `./jackett`
|
||||
|
||||
### home directory
|
||||
If you want to run it with a user without a /home directory you need to add `Environment=XDG_CONFIG_HOME=/path/to/folder` to your systemd file, this folder will be used to store your config files.
|
||||
If you want to run it with a user without a /home directory you need to add `Environment=XDG_CONFIG_HOME=/path/to/folder` to your systemd file, this folder will be used to store your config files.
|
||||
|
||||
|
||||
## Install on Linux (ARMv7 or above)
|
||||
On most operating systems all the required dependencies will already be present. In case they are not, you can refer to this page https://github.com/dotnet/core/blob/master/Documentation/linux-prereqs.md
|
||||
On most operating systems all the required dependencies will already be present. In case they are not, you can refer to this page https://github.com/dotnet/core/blob/master/Documentation/linux-prereqs.md
|
||||
|
||||
### Install as service
|
||||
1. Download and extract the latest `Jackett.Binaries.LinuxARM32.tar.gz` or `Jackett.Binaries.LinuxARM64.tar.gz` (32 bit is the most common on ARM) release from the [releases page](https://github.com/Jackett/Jackett/releases)
|
||||
1. Download and extract the latest `Jackett.Binaries.LinuxARM32.tar.gz` or `Jackett.Binaries.LinuxARM64.tar.gz` (32 bit is the most common on ARM) release from the [releases page](https://github.com/Jackett/Jackett/releases)
|
||||
2. To install Jackett as a service, open a Terminal, cd to the jackett folder and run `sudo ./install_service_systemd.sh` You need root permissions to install the service. The service will start on each logon. You can always stop it by running `systemctl stop jackett.service` from Terminal. You can start it again it using `systemctl start jackett.service`. Logs are stored as usual under `~/.config/Jackett/log.txt` and also in `journalctl -u jackett.service`.
|
||||
|
||||
### Run without installing as a service
|
||||
Download and extract the latest `Jackett.Binaries.LinuxARM32.tar.gz` or `Jackett.Binaries.LinuxARM64.tar.gz` (32 bit is the most common on ARM) release from the [releases page](https://github.com/Jackett/Jackett/releases), open a Terminal, cd to the jackett folder and run Jackett with the command `./jackett`
|
||||
|
||||
### home directory
|
||||
If you want to run it with a user without a /home directory you need to add `Environment=XDG_CONFIG_HOME=/path/to/folder` to your systemd file, this folder will be used to store your config files.
|
||||
If you want to run it with a user without a /home directory you need to add `Environment=XDG_CONFIG_HOME=/path/to/folder` to your systemd file, this folder will be used to store your config files.
|
||||
|
||||
|
||||
## Installation on Linux (ARMv6 or below)
|
||||
@@ -500,13 +554,13 @@ If you want to run it with a user without a /home directory you need to add `Env
|
||||
* Follow the instructions on the mono website and install the `mono-devel` and the `ca-certificates-mono` packages.
|
||||
* On Red Hat/CentOS/openSUSE/Fedora the `mono-locale-extras` package is also required.
|
||||
2. Install libcurl:
|
||||
* Debian/Ubunutu: `apt-get install libcurl4-openssl-dev`
|
||||
* Debian/Ubuntu: `apt-get install libcurl4-openssl-dev`
|
||||
* Redhat/Fedora: `yum install libcurl-devel`
|
||||
* For other distros see the [Curl docs](http://curl.haxx.se/dlwiz/?type=devel).
|
||||
3. Download and extract the latest `Jackett.Binaries.Mono.tar.gz` release from the [releases page](https://github.com/Jackett/Jackett/releases) and run Jackett using mono with the command `mono --debug JackettConsole.exe`.
|
||||
4. (Optional) To install Jackett as a service, open the Terminal and run `sudo ./install_service_systemd_mono.sh` You need root permissions to install the service. The service will start on each logon. You can always stop it by running `systemctl stop jackett.service` from Terminal. You can start it again it using `systemctl start jackett.service`. Logs are stored as usual under `~/.config/Jackett/log.txt` and also in `journalctl -u jackett.service`.
|
||||
|
||||
If you want to run it with a user without a /home directory you need to add `Environment=XDG_CONFIG_HOME=/path/to/folder` to your systemd file, this folder will be used to store your config files.
|
||||
If you want to run it with a user without a /home directory you need to add `Environment=XDG_CONFIG_HOME=/path/to/folder` to your systemd file, this folder will be used to store your config files.
|
||||
|
||||
Mono must be compiled with the Roslyn compiler (default), using MCS will cause "An error has occurred." errors (See https://github.com/Jackett/Jackett/issues/2704).
|
||||
|
||||
@@ -521,7 +575,7 @@ On an Ubuntu 16 system: [chrisjohnson00.jackett](https://galaxy.ansible.com/chri
|
||||
## Installation on macOS
|
||||
|
||||
### Prerequisites
|
||||
macOS 10.12 or greater
|
||||
macOS 10.13 or greater
|
||||
|
||||
### Install as service
|
||||
1. Download and extract the latest `Jackett.Binaries.macOS.tar.gz` release from the [releases page](https://github.com/Jackett/Jackett/releases).
|
||||
@@ -536,11 +590,11 @@ Download and extract the latest `Jackett.Binaries.macOS.tar.gz` release from the
|
||||
|
||||
|
||||
## Installation using Docker
|
||||
Detailed instructions are available at [LinuxServer.io Jackett Docker](https://hub.docker.com/r/linuxserver/jackett/). The Jackett Docker is highly recommended, especially if you are having Mono stability issues or having issues running Mono on your system eg. QNAP, Synology. Thanks to [LinuxServer.io](https://linuxserver.io)
|
||||
Detailed instructions are available at [LinuxServer.io Jackett Docker](https://hub.docker.com/r/linuxserver/jackett/). The Jackett Docker is highly recommended, especially if you are having Mono stability issues or having issues running Mono on your system e.g. QNAP, Synology. Thanks to [LinuxServer.io](https://linuxserver.io)
|
||||
|
||||
|
||||
## Installation on Synology
|
||||
Jackett is available as beta package from [SynoCommunity](https://synocommunity.com/)
|
||||
Jackett is available as a beta package from [SynoCommunity](https://synocommunity.com/)
|
||||
|
||||
|
||||
## Running Jackett behind a reverse proxy
|
||||
@@ -556,7 +610,7 @@ Example config for apache:
|
||||
</Location>
|
||||
```
|
||||
|
||||
Example config for nginx:
|
||||
Example config for Nginx:
|
||||
```
|
||||
location /jackett {
|
||||
proxy_pass http://127.0.0.1:9117;
|
||||
@@ -568,91 +622,105 @@ location /jackett {
|
||||
}
|
||||
```
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
* __Command line switches__
|
||||
|
||||
You can pass various options when running via the command line, see --help for details.
|
||||
|
||||
* __Error "An error occurred while sending the request: Error: TrustFailure (A call to SSPI failed, see inner exception.)"__
|
||||
|
||||
This is often caused by missing CA certificates.
|
||||
Try reimporting the certificates in this case:
|
||||
- On Linux (as user root): `wget -O - https://curl.haxx.se/ca/cacert.pem | cert-sync /dev/stdin`
|
||||
- On macOS: `curl -sS https://curl.haxx.se/ca/cacert.pem | cert-sync --user /dev/stdin`
|
||||
|
||||
* __Enable enhanced logging__
|
||||
|
||||
You can get *enhanced* logging with the command line switches `-t -l` or by enabling `Enhanced logging` via the web interface (followed by clicking on the `Apply Server Settings` button).
|
||||
Please post logs if you are unable to resolve your issue with these switches ensuring to remove your username/password/cookies.
|
||||
The logfiles (log.txt/updater.txt) are stored in `%ProgramData%\Jackett` on Windows and `~/.config/Jackett/` on Linux/macOS.
|
||||
|
||||
## Configuring OMDb
|
||||
This feature is used as a fallback (when using the aggregate Indexer) to get the movie/series title if only the IMDB ID is provided in the request.
|
||||
To use it, please just request a free API key on [OMDb](http://www.omdbapi.com/apikey.aspx) (1,000 daily requests limit) and paste the key in Jackett
|
||||
|
||||
## Creating an issue
|
||||
Please supply as much information about the problem you are experiencing as possible. Your issue has a much greater chance of being resolved if logs are supplied so that we can see what is going on. Creating an issue with '### isn't working' doesn't help anyone to fix the problem.
|
||||
## Command line switches
|
||||
|
||||
## Contributing
|
||||
You can pass various options when running via the command line:
|
||||
|
||||
Jackett's framework typically allows our team and volunteering developers to implement new trackers in a couple of hours
|
||||
<details> <summary> Command Line Switches </summary>
|
||||
|
||||
Depending on logic complexity, there are two common ways new trackers are implemented:
|
||||
- `-i, --Install` Install Jackett windows service (Must be admin)
|
||||
- `-s, --Start` Start the Jacket Windows service (Must be admin)
|
||||
- `-k, --Stop` Stop the Jacket Windows service (Must be admin)
|
||||
- `-u, --Uninstall` Uninstall Jackett windows service (Must be admin).
|
||||
|
||||
1. simple [definitions](http://github.com/Jackett/Jackett/tree/master/src/Jackett.Common/Definitions) (.yml / YAML), and;
|
||||
2. advanced (native) [indexers](http://github.com/Jackett/Jackett/tree/master/src/Jackett.Common/Indexers) (.cs / C#)
|
||||
- `-r, --ReserveUrls` (Re)Register windows port reservations (Required for
|
||||
listening on all interfaces).
|
||||
|
||||
Read more about the [simple definition format](https://github.com/Jackett/Jackett/wiki/Definition-format).
|
||||
- `-l, --Logging` Log all requests/responses to Jackett
|
||||
|
||||
If you are a developer then it's recommended to download the free community version of [Visual Studio](http://visualstudio.com)
|
||||
- `-t, --Tracing` Enable tracing
|
||||
|
||||
If you are not a developer and would like a (new) tracker supported then feel free to leave an [issue](https://github.com/Jackett/Jackett/issues) request.
|
||||
- `-c, --UseClient` Override web client selection.
|
||||
[automatic(Default)/httpclient/httpclient2]
|
||||
|
||||
All contributions are welcome just send a pull request.
|
||||
- `-j, --ProxyConnection` use proxy - e.g. 127.0.0.1:8888
|
||||
|
||||
|
||||
- `-x, --ListenPublic` Listen publicly
|
||||
|
||||
- `-z, --ListenPrivate` Only allow local access
|
||||
|
||||
- `-p, --Port` Web server port
|
||||
|
||||
- `-m, --MigrateSettings` Migrate settings manually (Must be an admin on Windows)
|
||||
|
||||
- `-n, --IgnoreSslErrors` [true/false] Ignores invalid SSL certificates
|
||||
|
||||
- `-d, --DataFolder` Specify the location of the data folder (Must be an admin on Windows)
|
||||
- e.g. --DataFolder="D:\Your Data\Jackett\".
|
||||
- Don't use this on Unix (mono) systems. On Unix just adjust the HOME directory of the user to the datadir or set the XDG_CONFIG_HOME environment variable.
|
||||
|
||||
- `--NoRestart` Don't restart after update
|
||||
|
||||
- `--PIDFile` Specify the location of PID file
|
||||
|
||||
- `--NoUpdates` Disable automatic updates
|
||||
|
||||
- `--help` Display this help screen.
|
||||
|
||||
- `--version` Display version information.
|
||||
</details>
|
||||
|
||||
## Building from source
|
||||
|
||||
### Windows
|
||||
* Install the .NET Core [SDK](https://www.microsoft.com/net/download/windows)
|
||||
* Clone Jackett
|
||||
* Open Powershell and from the `src` directory, run `dotnet restore`
|
||||
* Open the Jackett solution in Visual Studio 2019 (version 16.3 or above)
|
||||
* Right click on the Jackett solution and click 'Rebuild Solution' to restore nuget packages
|
||||
* Select Jackett.Server as startup project
|
||||
* In the drop down menu of the run button select "Jackett.Server" instead of "IIS Express"
|
||||
* Open PowerShell and from the `src` directory, run `dotnet restore`
|
||||
* Open the Jackett solution in Visual Studio 2019 (version 16.4 or above)
|
||||
* Right-click on the Jackett solution and click 'Rebuild Solution' to restore NuGet packages
|
||||
* Select Jackett.Server as the startup project
|
||||
* In the drop-down menu of the run button select "Jackett.Server" instead of "IIS Express"
|
||||
* Build/Start the project
|
||||
|
||||
### OSX
|
||||
|
||||
|
||||
```bash
|
||||
# manually install osx dotnet via:
|
||||
# manually install osx dotnet via:
|
||||
https://dotnet.microsoft.com/download?initial-os=macos
|
||||
# then:
|
||||
# then:
|
||||
git clone https://github.com/Jackett/Jackett.git
|
||||
cd Jackett/src
|
||||
|
||||
# dotnet core version
|
||||
dotnet publish Jackett.Server -f netcoreapp3.0 --self-contained -r osx-x64 -c Debug # takes care of everything
|
||||
./Jackett.Server/bin/Debug/netcoreapp3.0/osx-x64/jackett # run jackett
|
||||
dotnet publish Jackett.Server -f netcoreapp3.1 --self-contained -r osx-x64 -c Debug # takes care of everything
|
||||
./Jackett.Server/bin/Debug/netcoreapp3.1/osx-x64/jackett # run jackett
|
||||
```
|
||||
|
||||
### Linux
|
||||
|
||||
|
||||
```bash
|
||||
sudo apt install mono-complete nuget msbuild dotnet-sdk-3.0 # install build tools (debian/ubuntu)
|
||||
sudo apt install mono-complete nuget msbuild dotnet-sdk-3.1 # install build tools (Debian/ubuntu)
|
||||
git clone https://github.com/Jackett/Jackett.git
|
||||
cd Jackett/src
|
||||
|
||||
# dotnet core version
|
||||
dotnet publish Jackett.Server -f netcoreapp3.0 --self-contained -r linux-x64 -c Debug # takes care of everything
|
||||
./Jackett.Server/bin/Debug/netcoreapp3.0/linux-x64/jackett # run jackett
|
||||
dotnet publish Jackett.Server -f netcoreapp3.1 --self-contained -r linux-x64 -c Debug # takes care of everything
|
||||
./Jackett.Server/bin/Debug/netcoreapp3.1/linux-x64/jackett # run jackett
|
||||
```
|
||||
|
||||
## Screenshots
|
||||
|
||||

|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
[inviteneeded]: https://raw.githubusercontent.com/Jackett/Jackett/master/.github/label-inviteneeded.png
|
||||
|
46
appveyor.yml
46
appveyor.yml
@@ -1,46 +0,0 @@
|
||||
version: 0.12.{build}
|
||||
skip_tags: true
|
||||
image:
|
||||
- Ubuntu
|
||||
- Visual Studio 2019
|
||||
environment:
|
||||
APPVEYOR_YML_DISABLE_PS_LINUX: 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
|
369
azure-pipelines.yml
Normal file
369
azure-pipelines.yml
Normal file
@@ -0,0 +1,369 @@
|
||||
name: $(majorVersion).$(minorVersion).$(patchVersion)
|
||||
variables:
|
||||
majorVersion: 0
|
||||
minorVersion: 13
|
||||
patchVersion: $[counter(variables['minorVersion'], 1)] #this will reset when we bump minor
|
||||
jackettVersion: $(majorVersion).$(minorVersion).$(patchVersion)
|
||||
buildConfiguration: Release
|
||||
netCoreFramework: netcoreapp3.1
|
||||
netCoreSdkVersion: 3.1.x
|
||||
|
||||
stages:
|
||||
- stage: BuildJackett
|
||||
displayName: Create Binaries
|
||||
jobs:
|
||||
- job: Build
|
||||
workspace:
|
||||
clean: all
|
||||
strategy:
|
||||
matrix:
|
||||
Mono:
|
||||
buildDescription: Mono
|
||||
imageName: ubuntu-latest
|
||||
framework: net461
|
||||
runtime: linux-x64
|
||||
archiveType: tar
|
||||
artifactName: Jackett.Binaries.Mono.tar.gz
|
||||
Windows:
|
||||
buildDescription: Windows
|
||||
imageName: windows-latest
|
||||
framework: $(netCoreFramework)
|
||||
runtime: win-x86
|
||||
archiveType: zip
|
||||
artifactName: Jackett.Binaries.Windows.zip
|
||||
macOS:
|
||||
buildDescription: macOS
|
||||
imageName: macOS-latest
|
||||
framework: $(netCoreFramework)
|
||||
runtime: osx-x64
|
||||
archiveType: tar
|
||||
artifactName: Jackett.Binaries.macOS.tar.gz
|
||||
LinuxAmdx64:
|
||||
buildDescription: Linux AMD x64
|
||||
imageName: ubuntu-latest
|
||||
framework: $(netCoreFramework)
|
||||
runtime: linux-x64
|
||||
archiveType: tar
|
||||
artifactName: Jackett.Binaries.LinuxAMDx64.tar.gz
|
||||
LinuxARM32:
|
||||
buildDescription: Linux ARM32
|
||||
imageName: ubuntu-latest
|
||||
framework: $(netCoreFramework)
|
||||
runtime: linux-arm
|
||||
archiveType: tar
|
||||
artifactName: Jackett.Binaries.LinuxARM32.tar.gz
|
||||
LinuxARM64:
|
||||
buildDescription: Linux ARM64
|
||||
imageName: ubuntu-latest
|
||||
framework: $(netCoreFramework)
|
||||
runtime: linux-arm64
|
||||
archiveType: tar
|
||||
artifactName: Jackett.Binaries.LinuxARM64.tar.gz
|
||||
pool:
|
||||
vmImage: $(imageName)
|
||||
displayName: ${{ variables.buildDescription }}
|
||||
steps:
|
||||
- checkout: self
|
||||
|
||||
- task: UseDotNet@2
|
||||
displayName: Install .NET Core SDK
|
||||
inputs:
|
||||
packageType: sdk
|
||||
version: $(netCoreSdkVersion)
|
||||
installationPath: $(Agent.ToolsDirectory)/dotnet
|
||||
|
||||
- task: DotNetCoreCLI@2
|
||||
displayName: Build Jackett Server
|
||||
inputs:
|
||||
command: publish
|
||||
projects: 'src/Jackett.Server/Jackett.Server.csproj'
|
||||
publishWebProjects: false
|
||||
zipAfterPublish: false
|
||||
arguments: '--configuration $(buildConfiguration) --runtime $(runtime) --framework $(framework) --output $(Build.BinariesDirectory) /p:AssemblyVersion=$(jackettVersion) /p:FileVersion=$(jackettVersion) /p:InformationalVersion=$(jackettVersion) /p:Version=$(jackettVersion)'
|
||||
|
||||
- task: DotNetCoreCLI@2
|
||||
displayName: Build Jackett Updater
|
||||
inputs:
|
||||
command: publish
|
||||
projects: 'src/Jackett.Updater/Jackett.Updater.csproj'
|
||||
publishWebProjects: false
|
||||
zipAfterPublish: false
|
||||
arguments: '--configuration $(buildConfiguration) --runtime $(runtime) --framework $(framework) --output $(Build.BinariesDirectory) /p:AssemblyVersion=$(jackettVersion) /p:FileVersion=$(jackettVersion) /p:InformationalVersion=$(jackettVersion) /p:Version=$(jackettVersion)'
|
||||
|
||||
- task: DotNetCoreCLI@2
|
||||
displayName: Build Jackett Tray (Windows only)
|
||||
condition: and(succeeded(), startsWith(variables['runtime'], 'win'))
|
||||
inputs:
|
||||
command: publish
|
||||
projects: 'src/Jackett.Tray/Jackett.Tray.csproj'
|
||||
publishWebProjects: false
|
||||
zipAfterPublish: false
|
||||
arguments: '--configuration $(buildConfiguration) --runtime $(runtime) --framework $(framework) --output $(Build.BinariesDirectory) /p:AssemblyVersion=$(jackettVersion) /p:FileVersion=$(jackettVersion) /p:InformationalVersion=$(jackettVersion) /p:Version=$(jackettVersion)'
|
||||
|
||||
- task: DotNetCoreCLI@2
|
||||
displayName: Build Jackett Service (Windows only)
|
||||
condition: and(succeeded(), startsWith(variables['runtime'], 'win'))
|
||||
inputs:
|
||||
command: publish
|
||||
projects: 'src/Jackett.Service/Jackett.Service.csproj'
|
||||
publishWebProjects: false
|
||||
zipAfterPublish: false
|
||||
arguments: '--configuration $(buildConfiguration) --runtime $(runtime) --framework $(framework) --output $(Build.BinariesDirectory) /p:AssemblyVersion=$(jackettVersion) /p:FileVersion=$(jackettVersion) /p:InformationalVersion=$(jackettVersion) /p:Version=$(jackettVersion)'
|
||||
|
||||
- task: CopyFiles@2
|
||||
displayName: Copy Jackett Server
|
||||
inputs:
|
||||
SourceFolder: $(Build.BinariesDirectory)/Jackett.Server
|
||||
contents: '**'
|
||||
targetFolder: $(Build.BinariesDirectory)/Jackett
|
||||
|
||||
- task: CopyFiles@2
|
||||
displayName: Copy Jackett Updater
|
||||
inputs:
|
||||
SourceFolder: $(Build.BinariesDirectory)/Jackett.Updater
|
||||
contents: JackettUpdater*
|
||||
targetFolder: $(Build.BinariesDirectory)/Jackett
|
||||
|
||||
- task: CopyFiles@2
|
||||
displayName: Copy Jackett Tray (Windows only)
|
||||
condition: and(succeeded(), startsWith(variables['runtime'], 'win'))
|
||||
inputs:
|
||||
SourceFolder: $(Build.BinariesDirectory)/Jackett.Tray
|
||||
contents: |
|
||||
System.Drawing.dll
|
||||
System.Security.Cryptography.ProtectedData.dll
|
||||
WindowsBase.dll
|
||||
targetFolder: $(Build.BinariesDirectory)/Jackett
|
||||
overWrite: true
|
||||
|
||||
- task: CopyFiles@2
|
||||
displayName: Copy Jackett Tray Part 2 (Windows only)
|
||||
condition: and(succeeded(), startsWith(variables['runtime'], 'win'))
|
||||
inputs:
|
||||
SourceFolder: $(Build.BinariesDirectory)/Jackett.Tray
|
||||
contents: '*'
|
||||
targetFolder: $(Build.BinariesDirectory)/Jackett
|
||||
overWrite: false
|
||||
|
||||
- task: CopyFiles@2
|
||||
displayName: Copy Jackett Service (Windows only)
|
||||
condition: and(succeeded(), startsWith(variables['runtime'], 'win'))
|
||||
inputs:
|
||||
SourceFolder: $(Build.BinariesDirectory)/Jackett.Service
|
||||
contents: JackettService*
|
||||
targetFolder: $(Build.BinariesDirectory)/Jackett
|
||||
|
||||
- task: CopyFiles@2
|
||||
displayName: Copy Mono Specific Scripts
|
||||
condition: and(succeeded(), startsWith(variables['buildDescription'], 'Mono'))
|
||||
inputs:
|
||||
SourceFolder: $(Build.SourcesDirectory)
|
||||
contents: |
|
||||
install_service_systemd_mono.sh
|
||||
Upstart.config
|
||||
targetFolder: $(Build.BinariesDirectory)/Jackett
|
||||
|
||||
- task: CopyFiles@2
|
||||
displayName: Copy macOS Specific Scripts
|
||||
condition: and(succeeded(), startsWith(variables['buildDescription'], 'macOS'))
|
||||
inputs:
|
||||
SourceFolder: $(Build.SourcesDirectory)
|
||||
contents: install_service_macos
|
||||
targetFolder: $(Build.BinariesDirectory)/Jackett
|
||||
|
||||
- task: CopyFiles@2
|
||||
displayName: Copy Linux Specific Scripts
|
||||
condition: and(succeeded(), startsWith(variables['buildDescription'], 'Linux'))
|
||||
inputs:
|
||||
SourceFolder: $(Build.SourcesDirectory)
|
||||
contents: |
|
||||
install_service_systemd.sh
|
||||
jackett_launcher.sh
|
||||
targetFolder: $(Build.BinariesDirectory)/Jackett
|
||||
|
||||
#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
|
||||
#Mono on FreeBSD doesn't like the bundled System.Runtime.InteropServices.RuntimeInformation -> Delete it
|
||||
#https://github.com/dotnet/corefx/issues/23989
|
||||
#https://github.com/Jackett/Jackett/issues/3547
|
||||
- task: PowerShell@2
|
||||
displayName: Patch Mono Build (Mono only)
|
||||
condition: and(succeeded(), startsWith(variables['buildDescription'], 'Mono'))
|
||||
inputs:
|
||||
workingDirectory: $(Build.BinariesDirectory)/Jackett
|
||||
targetType: inline
|
||||
script: |
|
||||
$file = '$(Build.BinariesDirectory)/Jackett/JackettConsole.exe.config'
|
||||
$xml = [xml] (Get-Content $file)
|
||||
$newVersion = $xml.SelectSingleNode("configuration/runtime/*[name()='assemblyBinding']/*[name()='dependentAssembly']/*[name()='assemblyIdentity'][@name='System.Net.Http']/../*[name()='bindingRedirect']/@newVersion")
|
||||
$newVersion.Value = '4.0.0.0'
|
||||
$xml.Save($file)
|
||||
Remove-Item '$(Build.BinariesDirectory)/Jackett/System.Net.Http.dll'
|
||||
Remove-Item '$(Build.BinariesDirectory)/Jackett/System.Runtime.InteropServices.RuntimeInformation.dll'
|
||||
|
||||
- task: Bash@3
|
||||
displayName: Set Folder and File Permissions (Mono, Linux and macOS)
|
||||
condition: and(succeeded(), not(startsWith(variables['runtime'], 'win')))
|
||||
inputs:
|
||||
workingDirectory: $(Build.BinariesDirectory)/Jackett
|
||||
targetType: inline
|
||||
script: |
|
||||
chmod 755 $(find "$(Build.BinariesDirectory)"/Jackett -type d)
|
||||
chmod 644 $(find "$(Build.BinariesDirectory)"/Jackett -type f)
|
||||
chmod 755 jackett
|
||||
chmod 755 JackettUpdater
|
||||
if [ -f install_service_systemd_mono.sh ]; then chmod 755 install_service_systemd_mono.sh; fi
|
||||
if [ -f install_service_macos ]; then chmod 755 install_service_macos; fi
|
||||
if [ -f install_service_systemd.sh ]; then chmod 755 install_service_systemd.sh; fi
|
||||
if [ -f jackett_launcher.sh ]; then chmod 755 jackett_launcher.sh; fi
|
||||
|
||||
- task: ArchiveFiles@2
|
||||
displayName: Compress Binaries
|
||||
inputs:
|
||||
rootFolderOrFile: $(Build.BinariesDirectory)/Jackett
|
||||
includeRootFolder: true
|
||||
archiveType: '$(archiveType)'
|
||||
tarCompression: gz
|
||||
archiveFile: '$(Build.ArtifactStagingDirectory)/$(artifactName)'
|
||||
|
||||
- task: CmdLine@2
|
||||
displayName: Create Jackett Installer (Windows only)
|
||||
condition: and(succeeded(), startsWith(variables['runtime'], 'win'))
|
||||
inputs:
|
||||
script: >
|
||||
iscc.exe $(Build.SourcesDirectory)/Installer.iss
|
||||
/O"$(Build.ArtifactStagingDirectory)"
|
||||
/DMyFileForVersion=$(Build.BinariesDirectory)/Jackett/Jackett.Common.dll
|
||||
/DMySourceFolder=$(Build.BinariesDirectory)/Jackett
|
||||
/DMyOutputFilename=Jackett.Installer.Windows
|
||||
|
||||
- task: PublishBuildArtifacts@1
|
||||
inputs:
|
||||
pathtoPublish: '$(Build.ArtifactStagingDirectory)'
|
||||
|
||||
- task: DotNetCoreCLI@2
|
||||
displayName: Unit Tests (Windows only)
|
||||
condition: and(succeeded(), startsWith(variables['runtime'], 'win'))
|
||||
inputs:
|
||||
command: test
|
||||
projects: '**/*.Test*/*.csproj'
|
||||
arguments: '--configuration $(buildConfiguration) --framework $(framework)'
|
||||
|
||||
- task: DotNetCoreCLI@2
|
||||
displayName: Unit Tests (Mono, Linux and macOS)
|
||||
condition: and(succeeded(), not(startsWith(variables['runtime'], 'win')))
|
||||
inputs:
|
||||
command: test
|
||||
projects: '**/*.Test*/*.csproj'
|
||||
arguments: '--configuration $(buildConfiguration) --framework $(framework) --runtime $(runtime)'
|
||||
|
||||
|
||||
- stage: Integration
|
||||
displayName: Integration Tests
|
||||
dependsOn: BuildJackett
|
||||
jobs:
|
||||
- job: Selenium
|
||||
workspace:
|
||||
clean: all
|
||||
strategy:
|
||||
matrix:
|
||||
Mono:
|
||||
buildDescription: Mono
|
||||
imageName: ubuntu-latest
|
||||
artifactName: Jackett.Binaries.Mono.tar.gz
|
||||
Windows:
|
||||
buildDescription: Windows
|
||||
imageName: windows-latest
|
||||
artifactName: Jackett.Binaries.Windows.zip
|
||||
# Enable once ChromeDriver is deployed to macOS image https://github.com/actions/virtual-environments/issues/7
|
||||
# macOS:
|
||||
# buildDescription: macOS
|
||||
# imageName: macOS-latest
|
||||
# artifactName: Jackett.Binaries.macOS.tar.gz
|
||||
LinuxAmdx64:
|
||||
buildDescription: Linux AMD x64
|
||||
imageName: ubuntu-latest
|
||||
artifactName: Jackett.Binaries.LinuxAMDx64.tar.gz
|
||||
pool:
|
||||
vmImage: $(imageName)
|
||||
displayName: ${{ variables.buildDescription }}
|
||||
steps:
|
||||
- checkout: self
|
||||
|
||||
- task: DownloadPipelineArtifact@2
|
||||
displayName: Download artifacts for integration tests
|
||||
inputs:
|
||||
patterns: '**/Jackett*'
|
||||
path: $(Build.ArtifactStagingDirectory)
|
||||
|
||||
- task: PowerShell@2
|
||||
displayName: Install Jackett (Windows only)
|
||||
condition: and(succeeded(), eq(variables['buildDescription'], 'Windows'))
|
||||
inputs:
|
||||
workingDirectory: $(Build.ArtifactStagingDirectory)/drop
|
||||
targetType: inline
|
||||
script: |
|
||||
Start-Process ./Jackett.Installer.Windows.exe /silent -NoNewWindow -Wait
|
||||
|
||||
- task: Bash@3
|
||||
displayName: Install Jackett (Mono, Linux and macOS)
|
||||
condition: and(succeeded(), ne(variables['buildDescription'], 'Windows'))
|
||||
inputs:
|
||||
workingDirectory: $(Build.ArtifactStagingDirectory)/drop
|
||||
targetType: inline
|
||||
script: |
|
||||
tar xzf "$(artifactName)"
|
||||
cd Jackett
|
||||
if [[ "$(artifactName)" == *"Mono"* ]]; then mono --version; fi
|
||||
if [[ "$(artifactName)" == *"Mono"* ]]; then sudo ./install_service_systemd_mono.sh; fi
|
||||
if [[ "$(artifactName)" == *"macOS"* ]]; then sudo ./install_service_macos; fi
|
||||
if [[ "$(artifactName)" == *"LinuxAMDx64"* ]]; then sudo ./install_service_systemd.sh; fi
|
||||
|
||||
- task: UseDotNet@2
|
||||
displayName: Install .NET Core SDK
|
||||
inputs:
|
||||
packageType: sdk
|
||||
version: $(netCoreSdkVersion)
|
||||
installationPath: $(Agent.ToolsDirectory)/dotnet
|
||||
|
||||
- task: DotNetCoreCLI@2
|
||||
displayName: Run Integration Tests
|
||||
inputs:
|
||||
command: test
|
||||
projects: '**/*IntegrationTest*/*.csproj'
|
||||
|
||||
|
||||
- stage: PublishGithub
|
||||
displayName: Publish to Github
|
||||
dependsOn: Integration
|
||||
condition: and(succeeded(), ne(variables['Build.Reason'], 'PullRequest'), eq(variables['Build.SourceBranch'], 'refs/heads/master'))
|
||||
jobs:
|
||||
- job: Publish
|
||||
workspace:
|
||||
clean: all
|
||||
steps:
|
||||
- checkout: self
|
||||
|
||||
- task: DownloadPipelineArtifact@2
|
||||
displayName: Download Artifacts for Publish
|
||||
inputs:
|
||||
patterns: '**/Jackett*'
|
||||
path: $(Build.ArtifactStagingDirectory)
|
||||
|
||||
- task: GitHubRelease@0
|
||||
displayName: Create Github release
|
||||
inputs:
|
||||
gitHubConnection: github.com_jackett
|
||||
repositoryName: '$(Build.Repository.Name)'
|
||||
action: create
|
||||
target: $(Build.SourceVersion)
|
||||
tagSource: manual
|
||||
tag: v$(Build.BuildNumber)
|
||||
title: v$(Build.BuildNumber)
|
||||
assets: $(Build.ArtifactStagingDirectory)/drop/*
|
||||
assetUploadMode: replace
|
||||
isDraft: true
|
||||
addChangeLog: true
|
||||
compareWith: lastNonDraftRelease
|
522
build.cake
522
build.cake
@@ -1,522 +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.0";
|
||||
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 + "/**/*.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 + "/JackettService.*", buildOutputPath);
|
||||
CopyFiles("./src/Jackett.Tray/bin/" + configuration + "/JackettTray.*", buildOutputPath);
|
||||
CopyFiles("./src/Jackett.Updater/bin/" + configuration + "/net461" + "/JackettUpdater.*", buildOutputPath); //builds against multiple frameworks
|
||||
|
||||
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");
|
||||
|
||||
InstallMsysTar();
|
||||
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 InstallMsysTar()
|
||||
{
|
||||
//Gzip is included by default with MSYS2, but not tar. Use the package manager to install tar
|
||||
|
||||
var startInfo = new System.Diagnostics.ProcessStartInfo()
|
||||
{
|
||||
Arguments = "-S --noconfirm tar",
|
||||
FileName = @"C:\msys64\usr\bin\pacman.exe",
|
||||
UseShellExecute = false
|
||||
};
|
||||
|
||||
var process = System.Diagnostics.Process.Start(startInfo);
|
||||
process.WaitForExit();
|
||||
|
||||
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[@]}"
|
@@ -25,8 +25,8 @@ namespace DateTimeRoutines
|
||||
/// <returns>seconds</returns>
|
||||
public static uint GetSecondsSinceUnixEpoch(this DateTime date_time)
|
||||
{
|
||||
TimeSpan t = date_time - new DateTime(1970, 1, 1);
|
||||
int ss = (int)t.TotalSeconds;
|
||||
var t = date_time - new DateTime(1970, 1, 1);
|
||||
var ss = (int)t.TotalSeconds;
|
||||
if (ss < 0)
|
||||
return 0;
|
||||
return (uint)ss;
|
||||
@@ -44,39 +44,39 @@ namespace DateTimeRoutines
|
||||
/// <summary>
|
||||
/// Index of first char of a date substring found in the string
|
||||
/// </summary>
|
||||
readonly public int IndexOfDate = -1;
|
||||
public readonly int IndexOfDate = -1;
|
||||
/// <summary>
|
||||
/// Length a date substring found in the string
|
||||
/// </summary>
|
||||
readonly public int LengthOfDate = -1;
|
||||
public readonly int LengthOfDate = -1;
|
||||
/// <summary>
|
||||
/// Index of first char of a time substring found in the string
|
||||
/// </summary>
|
||||
readonly public int IndexOfTime = -1;
|
||||
public readonly int IndexOfTime = -1;
|
||||
/// <summary>
|
||||
/// Length of a time substring found in the string
|
||||
/// </summary>
|
||||
readonly public int LengthOfTime = -1;
|
||||
public readonly int LengthOfTime = -1;
|
||||
/// <summary>
|
||||
/// DateTime found in the string
|
||||
/// </summary>
|
||||
readonly public DateTime DateTime;
|
||||
public readonly DateTime DateTime;
|
||||
/// <summary>
|
||||
/// True if a date was found within the string
|
||||
/// </summary>
|
||||
readonly public bool IsDateFound;
|
||||
public readonly bool IsDateFound;
|
||||
/// <summary>
|
||||
/// True if a time was found within the string
|
||||
/// </summary>
|
||||
readonly public bool IsTimeFound;
|
||||
public readonly bool IsTimeFound;
|
||||
/// <summary>
|
||||
/// UTC offset if it was found within the string
|
||||
/// </summary>
|
||||
readonly public TimeSpan UtcOffset;
|
||||
public readonly TimeSpan UtcOffset;
|
||||
/// <summary>
|
||||
/// True if UTC offset was found in the string
|
||||
/// </summary>
|
||||
readonly public bool IsUtcOffsetFound;
|
||||
public readonly bool IsUtcOffsetFound;
|
||||
/// <summary>
|
||||
/// Utc gotten from DateTime if IsUtcOffsetFound is True
|
||||
/// </summary>
|
||||
@@ -113,7 +113,7 @@ namespace DateTimeRoutines
|
||||
{
|
||||
if (index_of_date < 0)//to avoid negative date exception when date is undefined
|
||||
{
|
||||
TimeSpan ts = date_time.TimeOfDay + utc_offset;
|
||||
var ts = date_time.TimeOfDay + utc_offset;
|
||||
if (ts < new TimeSpan(0))
|
||||
UtcDateTime = new DateTime(1, 1, 2) + ts;
|
||||
else
|
||||
@@ -146,7 +146,8 @@ namespace DateTimeRoutines
|
||||
return _DefaultDate;
|
||||
}
|
||||
}
|
||||
static DateTime _DefaultDate = DateTime.Now;
|
||||
|
||||
private static DateTime _DefaultDate = DateTime.Now;
|
||||
|
||||
/// <summary>
|
||||
/// If true then DefaultDate property is ignored and DefaultDate is always DateTime.Now
|
||||
@@ -183,10 +184,9 @@ namespace DateTimeRoutines
|
||||
/// <param name="default_format">format to be used preferably in ambivalent instances</param>
|
||||
/// <param name="date_time">parsed date-time output</param>
|
||||
/// <returns>true if both date and time were found, else false</returns>
|
||||
static public bool TryParseDateTime(this string str, DateTimeFormat default_format, out DateTime date_time)
|
||||
public static bool TryParseDateTime(this string str, DateTimeFormat default_format, out DateTime date_time)
|
||||
{
|
||||
ParsedDateTime parsed_date_time;
|
||||
if (!TryParseDateTime(str, default_format, out parsed_date_time))
|
||||
if (!TryParseDateTime(str, default_format, out ParsedDateTime parsed_date_time))
|
||||
{
|
||||
date_time = new DateTime(1, 1, 1);
|
||||
return false;
|
||||
@@ -204,10 +204,9 @@ namespace DateTimeRoutines
|
||||
/// <param name="default_format">format to be used preferably in ambivalent instances</param>
|
||||
/// <param name="date_time">parsed date-time output</param>
|
||||
/// <returns>true if date and/or time was found, else false</returns>
|
||||
static public bool TryParseDateOrTime(this string str, DateTimeFormat default_format, out DateTime date_time)
|
||||
public static bool TryParseDateOrTime(this string str, DateTimeFormat default_format, out DateTime date_time)
|
||||
{
|
||||
ParsedDateTime parsed_date_time;
|
||||
if (!TryParseDateOrTime(str, default_format, out parsed_date_time))
|
||||
if (!TryParseDateOrTime(str, default_format, out ParsedDateTime parsed_date_time))
|
||||
{
|
||||
date_time = new DateTime(1, 1, 1);
|
||||
return false;
|
||||
@@ -226,8 +225,7 @@ namespace DateTimeRoutines
|
||||
/// <returns>true if time was found, else false</returns>
|
||||
public static bool TryParseTime(this string str, DateTimeFormat default_format, out DateTime time)
|
||||
{
|
||||
ParsedDateTime parsed_time;
|
||||
if (!TryParseTime(str, default_format, out parsed_time, null))
|
||||
if (!TryParseTime(str, default_format, out var parsed_time, null))
|
||||
{
|
||||
time = new DateTime(1, 1, 1);
|
||||
return false;
|
||||
@@ -245,10 +243,9 @@ namespace DateTimeRoutines
|
||||
/// <param name="default_format">format to be used preferably in ambivalent instances</param>
|
||||
/// <param name="date">parsed date output</param>
|
||||
/// <returns>true if date was found, else false</returns>
|
||||
static public bool TryParseDate(this string str, DateTimeFormat default_format, out DateTime date)
|
||||
public static bool TryParseDate(this string str, DateTimeFormat default_format, out DateTime date)
|
||||
{
|
||||
ParsedDateTime parsed_date;
|
||||
if (!TryParseDate(str, default_format, out parsed_date))
|
||||
if (!TryParseDate(str, default_format, out ParsedDateTime parsed_date))
|
||||
{
|
||||
date = new DateTime(1, 1, 1);
|
||||
return false;
|
||||
@@ -268,7 +265,7 @@ namespace DateTimeRoutines
|
||||
/// <param name="default_format">format to be used preferably in ambivalent instances</param>
|
||||
/// <param name="parsed_date_time">parsed date-time output</param>
|
||||
/// <returns>true if both date and time were found, else false</returns>
|
||||
static public bool TryParseDateTime(this string str, DateTimeFormat default_format, out ParsedDateTime parsed_date_time)
|
||||
public static bool TryParseDateTime(this string str, DateTimeFormat default_format, out ParsedDateTime parsed_date_time)
|
||||
{
|
||||
if (DateTimeRoutines.TryParseDateOrTime(str, default_format, out parsed_date_time)
|
||||
&& parsed_date_time.IsDateFound
|
||||
@@ -288,7 +285,7 @@ namespace DateTimeRoutines
|
||||
/// <param name="default_format">format to be used preferably in ambivalent instances</param>
|
||||
/// <param name="parsed_time">parsed date-time output</param>
|
||||
/// <returns>true if time was found, else false</returns>
|
||||
static public bool TryParseTime(this string str, DateTimeFormat default_format, out ParsedDateTime parsed_time)
|
||||
public static bool TryParseTime(this string str, DateTimeFormat default_format, out ParsedDateTime parsed_time)
|
||||
{
|
||||
return TryParseTime(str, default_format, out parsed_time, null);
|
||||
}
|
||||
@@ -302,30 +299,30 @@ namespace DateTimeRoutines
|
||||
/// <param name="default_format">format to be used preferably in ambivalent instances</param>
|
||||
/// <param name="parsed_date_time">parsed date-time output</param>
|
||||
/// <returns>true if date or time was found, else false</returns>
|
||||
static public bool TryParseDateOrTime(this string str, DateTimeFormat default_format, out ParsedDateTime parsed_date_time)
|
||||
public static bool TryParseDateOrTime(this string str, DateTimeFormat default_format, out ParsedDateTime parsed_date_time)
|
||||
{
|
||||
parsed_date_time = null;
|
||||
|
||||
ParsedDateTime parsed_date;
|
||||
ParsedDateTime parsed_time;
|
||||
if (!TryParseDate(str, default_format, out parsed_date))
|
||||
if (!TryParseDate(str, default_format, out
|
||||
ParsedDateTime parsed_date))
|
||||
{
|
||||
if (!TryParseTime(str, default_format, out parsed_time, null))
|
||||
return false;
|
||||
|
||||
DateTime date_time = new DateTime(DefaultDate.Year, DefaultDate.Month, DefaultDate.Day, parsed_time.DateTime.Hour, parsed_time.DateTime.Minute, parsed_time.DateTime.Second);
|
||||
var date_time = new DateTime(DefaultDate.Year, DefaultDate.Month, DefaultDate.Day, parsed_time.DateTime.Hour, parsed_time.DateTime.Minute, parsed_time.DateTime.Second);
|
||||
parsed_date_time = new ParsedDateTime(-1, -1, parsed_time.IndexOfTime, parsed_time.LengthOfTime, date_time, parsed_time.UtcOffset);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!TryParseTime(str, default_format, out parsed_time, parsed_date))
|
||||
{
|
||||
DateTime date_time = new DateTime(parsed_date.DateTime.Year, parsed_date.DateTime.Month, parsed_date.DateTime.Day, 0, 0, 0);
|
||||
var date_time = new DateTime(parsed_date.DateTime.Year, parsed_date.DateTime.Month, parsed_date.DateTime.Day, 0, 0, 0);
|
||||
parsed_date_time = new ParsedDateTime(parsed_date.IndexOfDate, parsed_date.LengthOfDate, -1, -1, date_time);
|
||||
}
|
||||
else
|
||||
{
|
||||
DateTime 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 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);
|
||||
parsed_date_time = new ParsedDateTime(parsed_date.IndexOfDate, parsed_date.LengthOfDate, parsed_time.IndexOfTime, parsed_time.LengthOfTime, date_time, parsed_time.UtcOffset);
|
||||
}
|
||||
}
|
||||
@@ -351,7 +348,7 @@ namespace DateTimeRoutines
|
||||
parsed_time = null;
|
||||
|
||||
string time_zone_r;
|
||||
if(default_format == DateTimeFormat.USA_DATE)
|
||||
if (default_format == DateTimeFormat.USA_DATE)
|
||||
time_zone_r = @"(?:\s*(?'time_zone'UTC|GMT|CST|EST))?";
|
||||
else
|
||||
time_zone_r = @"(?:\s*(?'time_zone'UTC|GMT))?";
|
||||
@@ -363,13 +360,13 @@ namespace DateTimeRoutines
|
||||
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);
|
||||
if (!m.Success)
|
||||
//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(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);
|
||||
if (!m.Success)
|
||||
//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, 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);
|
||||
if (!m.Success)
|
||||
//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(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);
|
||||
}
|
||||
else//look anywhere within string
|
||||
{
|
||||
@@ -377,7 +374,7 @@ namespace DateTimeRoutines
|
||||
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)
|
||||
//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))?" + time_zone_r + @"(?=$|[^\d\w])", RegexOptions.Compiled);
|
||||
}
|
||||
|
||||
if (!m.Success)
|
||||
@@ -385,15 +382,15 @@ namespace DateTimeRoutines
|
||||
|
||||
//try
|
||||
//{
|
||||
int hour = int.Parse(m.Groups["hour"].Value);
|
||||
var hour = int.Parse(m.Groups["hour"].Value);
|
||||
if (hour < 0 || hour > 23)
|
||||
return false;
|
||||
|
||||
int minute = int.Parse(m.Groups["minute"].Value);
|
||||
var minute = int.Parse(m.Groups["minute"].Value);
|
||||
if (minute < 0 || minute > 59)
|
||||
return false;
|
||||
|
||||
int second = 0;
|
||||
var second = 0;
|
||||
if (!string.IsNullOrEmpty(m.Groups["second"].Value))
|
||||
{
|
||||
second = int.Parse(m.Groups["second"].Value);
|
||||
@@ -406,15 +403,15 @@ namespace DateTimeRoutines
|
||||
else if (string.Compare(m.Groups["ampm"].Value, "AM", true) == 0 && hour == 12)
|
||||
hour -= 12;
|
||||
|
||||
DateTime date_time = new DateTime(1, 1, 1, hour, minute, second);
|
||||
|
||||
var date_time = new DateTime(1, 1, 1, hour, minute, second);
|
||||
|
||||
if (m.Groups["offset_hh"].Success)
|
||||
{
|
||||
int offset_hh = int.Parse(m.Groups["offset_hh"].Value);
|
||||
int offset_mm = 0;
|
||||
var offset_hh = int.Parse(m.Groups["offset_hh"].Value);
|
||||
var offset_mm = 0;
|
||||
if (m.Groups["offset_mm"].Success)
|
||||
offset_mm = int.Parse(m.Groups["offset_mm"].Value);
|
||||
TimeSpan utc_offset = new TimeSpan(offset_hh, offset_mm, 0);
|
||||
var utc_offset = new TimeSpan(offset_hh, offset_mm, 0);
|
||||
if (m.Groups["offset_sign"].Value == "-")
|
||||
utc_offset = -utc_offset;
|
||||
parsed_time = new ParsedDateTime(-1, -1, m.Index, m.Length, date_time, utc_offset);
|
||||
@@ -428,7 +425,7 @@ namespace DateTimeRoutines
|
||||
{
|
||||
case "UTC":
|
||||
case "GMT":
|
||||
utc_offset = new TimeSpan(0, 0, 0);
|
||||
utc_offset = new TimeSpan(0, 0, 0);
|
||||
break;
|
||||
case "CST":
|
||||
utc_offset = new TimeSpan(-6, 0, 0);
|
||||
@@ -461,7 +458,7 @@ namespace DateTimeRoutines
|
||||
/// <param name="default_format">format to be used preferably in ambivalent instances</param>
|
||||
/// <param name="parsed_date">parsed date output</param>
|
||||
/// <returns>true if date was found, else false</returns>
|
||||
static public bool TryParseDate(this string str, DateTimeFormat default_format, out ParsedDateTime parsed_date)
|
||||
public static bool TryParseDate(this string str, DateTimeFormat default_format, out ParsedDateTime parsed_date)
|
||||
{
|
||||
parsed_date = null;
|
||||
|
||||
@@ -469,7 +466,7 @@ namespace DateTimeRoutines
|
||||
return false;
|
||||
|
||||
//look for dd/mm/yy
|
||||
Match m = Regex.Match(str, @"(?<=^|[^\d])(?'day'\d{1,2})\s*(?'separator'[\\/\.])+\s*(?'month'\d{1,2})\s*\'separator'+\s*(?'year'\d{2}|\d{4})(?=$|[^\d])", RegexOptions.Compiled | RegexOptions.IgnoreCase);
|
||||
var m = Regex.Match(str, @"(?<=^|[^\d])(?'day'\d{1,2})\s*(?'separator'[\\/\.])+\s*(?'month'\d{1,2})\s*\'separator'+\s*(?'year'\d{2}|\d{4})(?=$|[^\d])", RegexOptions.Compiled | RegexOptions.IgnoreCase);
|
||||
if (m.Success)
|
||||
{
|
||||
DateTime date;
|
||||
@@ -491,8 +488,7 @@ 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);
|
||||
if (m.Success)
|
||||
{
|
||||
DateTime date;
|
||||
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 (!convert_to_date(int.Parse(m.Groups["year"].Value), int.Parse(m.Groups["month"].Value), int.Parse(m.Groups["day"].Value), out var date))
|
||||
return false;
|
||||
parsed_date = new ParsedDateTime(m.Index, m.Length, -1, -1, date);
|
||||
return true;
|
||||
@@ -514,9 +510,9 @@ namespace DateTimeRoutines
|
||||
m = Regex.Match(str, @"(?:^|[^\d\w])(?'month'Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)[uarychilestmbro]*\s+(?'day'\d{1,2})(?:-?st|-?th|-?rd|-?nd)?(?:\s*,?\s*(?'year'\d{4}))?(?=$|[^\d\w])", RegexOptions.Compiled | RegexOptions.IgnoreCase);
|
||||
if (m.Success)
|
||||
{
|
||||
int month = -1;
|
||||
int index_of_date = m.Index;
|
||||
int length_of_date = m.Length;
|
||||
var month = -1;
|
||||
var index_of_date = m.Index;
|
||||
var length_of_date = m.Length;
|
||||
|
||||
switch (m.Groups["month"].Value)
|
||||
{
|
||||
@@ -575,8 +571,7 @@ namespace DateTimeRoutines
|
||||
else
|
||||
year = DefaultDate.Year;
|
||||
|
||||
DateTime date;
|
||||
if (!convert_to_date(year, month, int.Parse(m.Groups["day"].Value), out date))
|
||||
if (!convert_to_date(year, month, int.Parse(m.Groups["day"].Value), out var date))
|
||||
return false;
|
||||
parsed_date = new ParsedDateTime(index_of_date, length_of_date, -1, -1, date);
|
||||
return true;
|
||||
@@ -585,7 +580,7 @@ namespace DateTimeRoutines
|
||||
return false;
|
||||
}
|
||||
|
||||
static bool convert_to_date(int year, int month, int day, out DateTime date)
|
||||
private static bool convert_to_date(int year, int month, int day, out DateTime date)
|
||||
{
|
||||
if (year >= 100)
|
||||
{
|
||||
@@ -597,9 +592,9 @@ namespace DateTimeRoutines
|
||||
}
|
||||
else
|
||||
if (year > 30)
|
||||
year += 1900;
|
||||
else
|
||||
year += 2000;
|
||||
year += 1900;
|
||||
else
|
||||
year += 2000;
|
||||
|
||||
try
|
||||
{
|
||||
@@ -615,4 +610,4 @@ namespace DateTimeRoutines
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -1,7 +1,7 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFrameworks>netstandard2.0</TargetFrameworks>
|
||||
<TargetFramework>netstandard2.0</TargetFramework>
|
||||
</PropertyGroup>
|
||||
|
||||
</Project>
|
||||
|
@@ -7,10 +7,8 @@ body {
|
||||
border-radius: 6px;
|
||||
background-color: white;
|
||||
max-width: 900px;
|
||||
margin: 0 auto;
|
||||
margin-top: 30px;
|
||||
padding: 20px;
|
||||
margin-bottom: 100px;
|
||||
margin: 30px auto 100px;
|
||||
}
|
||||
|
||||
.container-fluid {
|
||||
@@ -22,7 +20,7 @@ body {
|
||||
|
||||
#indexers {
|
||||
text-align: center;
|
||||
margin-top: 30px;
|
||||
margin-top: 20px;
|
||||
}
|
||||
|
||||
.indexer-table {
|
||||
@@ -57,6 +55,14 @@ body {
|
||||
max-width: 255px;
|
||||
}
|
||||
|
||||
.setup-item-inputcheckbox label {
|
||||
padding: 0 1.5em;
|
||||
}
|
||||
|
||||
.setup-item-inputcheckbox input {
|
||||
height: 20px;
|
||||
}
|
||||
|
||||
.setup-item-inputbool input {
|
||||
max-width: 100px;
|
||||
height: 20px;
|
||||
@@ -116,7 +122,7 @@ hr {
|
||||
}
|
||||
|
||||
.input-area {
|
||||
margin: 4px 0px;
|
||||
margin: 4px 0;
|
||||
}
|
||||
|
||||
.input-area > * {
|
||||
@@ -155,8 +161,7 @@ hr {
|
||||
|
||||
#footer {
|
||||
color: #444444;
|
||||
margin: 0 auto;
|
||||
margin-top: 10px;
|
||||
margin: 10px auto 0;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
@@ -170,7 +175,7 @@ hr {
|
||||
}
|
||||
|
||||
.indexer-caps {
|
||||
padding: 0px 15px 15px 15px;
|
||||
padding: 0 15px 15px 15px;
|
||||
border-top: 1px solid #e5e5e5;
|
||||
}
|
||||
|
||||
@@ -178,6 +183,12 @@ hr {
|
||||
border-bottom: 1px solid #ddd;
|
||||
}
|
||||
|
||||
.jackettlog-narrowcol {
|
||||
width: 1px;
|
||||
white-space: nowrap;
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
.jackettlogWarn {
|
||||
background-color: #FFFF8E !important;
|
||||
}
|
||||
@@ -201,23 +212,57 @@ hr {
|
||||
pre {
|
||||
display: block;
|
||||
padding: 3px;
|
||||
margin: 0 0 0px;
|
||||
margin: 0 0 0;
|
||||
font-size: 13px;
|
||||
line-height: 1.42857143;
|
||||
color: #333;
|
||||
word-break: break-all;
|
||||
word-wrap: break-word;
|
||||
background-color: transparent;
|
||||
border: 0px;
|
||||
border-radius: 0px;
|
||||
border: 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 {
|
||||
overflow-x: auto; /* Model can be bigger than the screen on mobiles */
|
||||
}
|
||||
|
||||
.dataTables_length {
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.dataTables_length select, .dataTables_filter input, .dataTable.compact tfoot td select {
|
||||
display: inline-block;
|
||||
height: 26px;
|
||||
padding: 0 8px;
|
||||
background-color: #fff;
|
||||
border: 1px solid #ccc;
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
||||
.dataTables_length select {
|
||||
width: inherit;
|
||||
}
|
||||
|
||||
.dataTables_filter input {
|
||||
width: 400px
|
||||
width: 400px;
|
||||
}
|
||||
|
||||
.dataTable.compact tfoot td {
|
||||
padding: 4px 0;
|
||||
}
|
||||
|
||||
.dataTable.compact tfoot td select {
|
||||
height: 26px;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
.dataTables_wrapper .dataTables_paginate .paginate_button {
|
||||
padding: 3px 9px !important;
|
||||
}
|
||||
|
||||
#unconfigured-indexers-template {
|
||||
@@ -250,7 +295,7 @@ table td.fit{
|
||||
|
||||
.tooltip-inner img {
|
||||
max-width: 250px;
|
||||
height: auto;
|
||||
height: auto;
|
||||
}
|
||||
|
||||
.type-public {
|
||||
@@ -272,7 +317,8 @@ table td.fit{
|
||||
}
|
||||
|
||||
input#searchquery {
|
||||
width:400px;
|
||||
width: 400px;
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
#proxy-warning {
|
||||
|
@@ -32,7 +32,15 @@ $(document).ready(function () {
|
||||
return opts.fn(this);
|
||||
else
|
||||
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 pathPrefix = window.location.pathname.substr(0, index);
|
||||
@@ -43,7 +51,12 @@ $(document).ready(function () {
|
||||
});
|
||||
|
||||
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) {
|
||||
showSearch(hashArgs.tracker, hashArgs.search, hashArgs.category);
|
||||
}
|
||||
@@ -333,6 +346,7 @@ function copyToClipboard(text) {
|
||||
var succeed;
|
||||
try {
|
||||
succeed = document.execCommand("copy");
|
||||
doNotify("Copied to clipboard!", "success", "glyphicon glyphicon-ok");
|
||||
} catch (e) {
|
||||
succeed = false;
|
||||
}
|
||||
@@ -607,6 +621,11 @@ function getConfigModalJson(configForm) {
|
||||
case "inputbool":
|
||||
itemEntry.value = $el.find(".setup-item-inputbool input").is(":checked");
|
||||
break;
|
||||
case "inputcheckbox":
|
||||
itemEntry.values = [];
|
||||
$el.find(".setup-item-inputcheckbox input:checked").each(function () {
|
||||
itemEntry.values.push($(this).val());
|
||||
});
|
||||
case "inputselect":
|
||||
itemEntry.value = $el.find(".setup-item-inputselect select").val();
|
||||
break;
|
||||
@@ -761,7 +780,7 @@ function updateReleasesRow(row)
|
||||
}
|
||||
|
||||
function showSearch(selectedIndexer, query, category) {
|
||||
var selectedIndexers = []
|
||||
var selectedIndexers = [];
|
||||
if (selectedIndexer)
|
||||
selectedIndexers = selectedIndexer.split(",");
|
||||
$('#select-indexer-modal').remove();
|
||||
@@ -828,7 +847,11 @@ function showSearch(selectedIndexer, query, category) {
|
||||
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());
|
||||
$('#searchResults div.dataTables_filter input').val("");
|
||||
@@ -876,7 +899,7 @@ function showSearch(selectedIndexer, query, category) {
|
||||
enableCaseInsensitiveFiltering: true,
|
||||
nonSelectedText: 'All'
|
||||
});
|
||||
|
||||
|
||||
|
||||
if (category !== undefined) {
|
||||
searchCategory.val(category.split(","));
|
||||
@@ -955,22 +978,22 @@ function updateSearchResultTable(element, results) {
|
||||
"searchable": false,
|
||||
"type": 'num'
|
||||
},
|
||||
{
|
||||
"targets": 5,
|
||||
"visible": true,
|
||||
"searchable": false,
|
||||
"iDataSort": 4
|
||||
}
|
||||
{
|
||||
"targets": 5,
|
||||
"visible": true,
|
||||
"searchable": false,
|
||||
"iDataSort": 4
|
||||
}
|
||||
],
|
||||
fnPreDrawCallback: function () {
|
||||
var table = this;
|
||||
var deadfilterdiv = element.find(".dataTables_deadfilter");
|
||||
var deadfiltercheckbox = deadfilterdiv.find("input");
|
||||
if (!deadfiltercheckbox.length) {
|
||||
deadfilterlabel = $('<label><input type="checkbox" id="jackett-search-results-datatable_deadfilter_checkbox" value="1">Show dead torrents</label>'
|
||||
deadfilterlabel = $('<label><input type="checkbox" id="jackett-search-results-datatable_deadfilter_checkbox" value="1"> Show dead torrents</label>'
|
||||
);
|
||||
deadfilterdiv.append(deadfilterlabel);
|
||||
deadfiltercheckbox = deadfilterlabel.find("input")
|
||||
deadfiltercheckbox = deadfilterlabel.find("input");
|
||||
deadfiltercheckbox.on("change", function () {
|
||||
settings.deadfilter = this.checked;
|
||||
table.api().draw();
|
||||
@@ -1154,8 +1177,8 @@ function bindUIButtons() {
|
||||
var jackett_port = Number($("#jackett-port").val());
|
||||
var jackett_basepathoverride = $("#jackett-basepathoverride").val();
|
||||
var jackett_external = $("#jackett-allowext").is(':checked');
|
||||
var jackett_update = $("#jackett-allowupdate").is(':checked');
|
||||
var jackett_prerelease = $("#jackett-prerelease").is(':checked');
|
||||
var jackett_update = $("#jackett-allowupdate").is(':checked');
|
||||
var jackett_prerelease = $("#jackett-prerelease").is(':checked');
|
||||
var jackett_logging = $("#jackett-logging").is(':checked');
|
||||
var jackett_omdb_key = $("#jackett-omdbkey").val();
|
||||
var jackett_omdb_url = $("#jackett-omdburl").val();
|
||||
|
@@ -7,10 +7,8 @@ body {
|
||||
border-radius: 6px;
|
||||
background-color: white;
|
||||
max-width: 900px;
|
||||
margin: 0 auto;
|
||||
margin-top: 30px;
|
||||
padding: 20px;
|
||||
margin-bottom: 30px;
|
||||
margin: 30px auto;
|
||||
}
|
||||
|
||||
.container-fluid {
|
||||
@@ -22,7 +20,7 @@ body {
|
||||
|
||||
#indexers {
|
||||
text-align: center;
|
||||
margin-top: 30px;
|
||||
margin-top: 20px;
|
||||
}
|
||||
|
||||
.indexer-table {
|
||||
@@ -116,7 +114,7 @@ hr {
|
||||
}
|
||||
|
||||
.input-area {
|
||||
margin: 4px 0px;
|
||||
margin: 4px 0;
|
||||
}
|
||||
|
||||
.input-area > * {
|
||||
@@ -155,8 +153,7 @@ hr {
|
||||
|
||||
#footer {
|
||||
color: #444444;
|
||||
margin: 0 auto;
|
||||
margin-top: 10px;
|
||||
margin: 10px auto 0;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
@@ -170,7 +167,7 @@ hr {
|
||||
}
|
||||
|
||||
.indexer-caps {
|
||||
padding: 0px 15px 15px 15px;
|
||||
padding: 0 15px 15px 15px;
|
||||
border-top: 1px solid #e5e5e5;
|
||||
}
|
||||
|
||||
@@ -178,6 +175,12 @@ hr {
|
||||
border-bottom: 1px solid #ddd;
|
||||
}
|
||||
|
||||
.jackettlog-narrowcol {
|
||||
width: 1px;
|
||||
white-space: nowrap;
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
.jackettlogWarn {
|
||||
background-color: #FFFF8E !important;
|
||||
}
|
||||
@@ -201,23 +204,57 @@ hr {
|
||||
pre {
|
||||
display: block;
|
||||
padding: 3px;
|
||||
margin: 0 0 0px;
|
||||
margin: 0 0 0;
|
||||
font-size: 13px;
|
||||
line-height: 1.42857143;
|
||||
color: #333;
|
||||
word-break: break-all;
|
||||
word-wrap: break-word;
|
||||
background-color: transparent;
|
||||
border: 0px;
|
||||
border-radius: 0px;
|
||||
border: 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 {
|
||||
overflow-x: auto; /* Model can be bigger than the screen on mobiles */
|
||||
}
|
||||
|
||||
.dataTables_length {
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.dataTables_length select, .dataTables_filter input, .dataTable.compact tfoot td select {
|
||||
display: inline-block;
|
||||
height: 26px;
|
||||
padding: 0 8px;
|
||||
background-color: #fff;
|
||||
border: 1px solid #ccc;
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
||||
.dataTables_length select {
|
||||
width: inherit;
|
||||
}
|
||||
|
||||
.dataTables_filter input {
|
||||
width: 75%
|
||||
width: 75%;
|
||||
}
|
||||
|
||||
.dataTable.compact tfoot td {
|
||||
padding: 4px 0;
|
||||
}
|
||||
|
||||
.dataTable.compact tfoot td select {
|
||||
height: 26px;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
.dataTables_wrapper .dataTables_paginate .paginate_button {
|
||||
padding: 3px 9px !important;
|
||||
}
|
||||
|
||||
#unconfigured-indexers-template {
|
||||
@@ -249,7 +286,7 @@ table td.fit{
|
||||
|
||||
.tooltip-inner img {
|
||||
max-width: 250px;
|
||||
height: auto;
|
||||
height: auto;
|
||||
}
|
||||
|
||||
.type-public {
|
||||
@@ -282,7 +319,8 @@ div#jackett-releases-datatable_wrapper {
|
||||
overflow-x: scroll;
|
||||
}
|
||||
input#searchquery {
|
||||
width:50%;
|
||||
width: 50%;
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
#proxy-warning {
|
||||
|
@@ -34,8 +34,8 @@
|
||||
|
||||
<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="../custom.css?changed=20190401" media="only screen and (min-device-width: 480px)">
|
||||
<link rel="stylesheet" type="text/css" href="../custom_mobile.css?changed=20190401" media="only screen and (max-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=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/bootstrap-multiselect.css?changed=2017083001" />
|
||||
<link rel="stylesheet" type="text/css" href="../css/font-awesome.min.css?changed=2017083001">
|
||||
@@ -52,11 +52,11 @@
|
||||
</div>
|
||||
<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>
|
||||
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.
|
||||
Benefits include: increased performance, improved stability and no dependency on Mono.
|
||||
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.
|
||||
Benefits include: increased performance, improved stability and no dependency on Mono.
|
||||
</div>
|
||||
|
||||
<div class="pull-right">
|
||||
@@ -235,6 +235,19 @@
|
||||
{{/if}}
|
||||
</div>
|
||||
</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">
|
||||
<div class="setup-item-inputselect">
|
||||
<select class="form-control" data-id="{{id}}">
|
||||
@@ -471,7 +484,7 @@
|
||||
<div class="modal-body">
|
||||
<p>You can search all configured indexers from this screen.</p>
|
||||
<label for="text">Query</label>
|
||||
<input type="text" name="query" id="searchquery" />
|
||||
<input class="form-control" type="text" name="query" id="searchquery" />
|
||||
<label for="tracker">Tracker</label>
|
||||
<select name="tracker" id="searchTracker" multiple="multiple">
|
||||
{{#each indexers}}
|
||||
@@ -603,16 +616,16 @@
|
||||
<table class="dataTable compact cell-border hover stripe">
|
||||
<thead>
|
||||
<tr>
|
||||
<th style="width: 200px">When</th>
|
||||
<th style="width: 80px">Level</th>
|
||||
<th>Date</th>
|
||||
<th>Level</th>
|
||||
<th>Message</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{{#each logs}}
|
||||
<tr class="jackettlog{{Level}}">
|
||||
<td>{{dateFormat When}}</td>
|
||||
<td>{{Level}}</td>
|
||||
<td class="jackettlog-narrowcol">{{dateFormat When}}</td>
|
||||
<td class="jackettlog-narrowcol">{{Level}}</td>
|
||||
<td><pre>{{Message}}</pre></td>
|
||||
</tr>
|
||||
{{/each}}
|
||||
@@ -678,6 +691,6 @@
|
||||
</script>
|
||||
|
||||
<script type="text/javascript" src="../libs/api.js?changed=2017083001"></script>
|
||||
<script type="text/javascript" src="../custom.js?changed=20190427"></script>
|
||||
<script type="text/javascript" src="../custom.js?changed=20200222"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
@@ -1,11 +1,11 @@
|
||||
|
||||
Handlebars.registerHelper('dateFormat', function (context, block) {
|
||||
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)
|
||||
} else {
|
||||
return context; // moment plugin not available. return data as is.
|
||||
};
|
||||
}
|
||||
});
|
||||
|
||||
Handlebars.registerHelper('jacketTimespan', function (context, block) {
|
||||
@@ -22,7 +22,7 @@ Handlebars.registerHelper('jacketTimespan', function (context, block) {
|
||||
if (hours < 48) {
|
||||
return Math.round(hours) + 'h ago';
|
||||
}
|
||||
|
||||
|
||||
var days = timeSpan.asDays();
|
||||
if (days < 365) {
|
||||
return Math.round(days) + 'd ago';
|
||||
@@ -34,4 +34,4 @@ Handlebars.registerHelper('jacketTimespan', function (context, block) {
|
||||
|
||||
Handlebars.registerHelper('jacketSize', function (context, block) {
|
||||
return filesize(context, { round: 1 });
|
||||
});
|
||||
});
|
||||
|
@@ -16,7 +16,7 @@
|
||||
|
||||
<link href="../bootstrap/bootstrap.min.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>
|
||||
</head>
|
||||
|
@@ -67,7 +67,6 @@
|
||||
"desc": "desc"
|
||||
"asc": "asc"
|
||||
|
||||
|
||||
login:
|
||||
path: takelogin.php
|
||||
method: post
|
||||
@@ -183,3 +182,4 @@
|
||||
"*": 1
|
||||
uploadvolumefactor:
|
||||
text: 1
|
||||
# engine n/a
|
||||
|
@@ -109,6 +109,7 @@
|
||||
search: [q]
|
||||
tv-search: [q, season, ep]
|
||||
movie-search: [q]
|
||||
music-search: [q, album, artist, label, year]
|
||||
|
||||
settings:
|
||||
- name: downloadlink
|
||||
@@ -139,24 +140,21 @@
|
||||
download:
|
||||
# the .torrent url is on the on the details page
|
||||
selector: ul li a[href^="{{ .Config.downloadlink }}"]
|
||||
filters:
|
||||
- name: replace # temp fix for #5372
|
||||
args: ["%E2%AD%90", ""]
|
||||
attribute: href
|
||||
|
||||
search:
|
||||
paths:
|
||||
# present first page of movies and tv results if there are no search parms supplied
|
||||
- path: "{{if .Keywords}}sort-search/{{ .Keywords}}/{{ .Config.sort }}/{{ .Config.type }}/1/{{else}}cat/Movies/{{ .Config.sort }}/{{ .Config.type }}/1/{{end}}"
|
||||
- path: "{{if .Keywords}}{{else}}cat/TV/{{ .Config.sort }}/{{ .Config.type }}/1/{{end}}"
|
||||
- path: "{{if .Keywords}}sort-search/{{ .Keywords}}/{{ .Config.sort }}/{{ .Config.type }}/2/{{else}}{{end}}"
|
||||
- path: "{{if .Keywords}}sort-search/{{ .Keywords}}/{{ .Config.sort }}/{{ .Config.type }}/3/{{else}}{{end}}"
|
||||
- path: "{{if .Keywords}}sort-search/{{ .Keywords}}/{{ .Config.sort }}/{{ .Config.type }}/4/{{else}}{{end}}"
|
||||
- path: "{{if .Keywords}}sort-search/{{ .Keywords}}/{{ .Config.sort }}/{{ .Config.type }}/5/{{else}}{{end}}"
|
||||
# present first page of movies tv and music results if there are no search parms supplied (20 hits per page)
|
||||
- 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/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:
|
||||
- name: replace # use this as a workaround till #893 is implemented
|
||||
args: ["Greys Anatomy", "Grey's Anatomy"]
|
||||
|
||||
rows:
|
||||
selector: tr:has(a[href^="/torrent/"])
|
||||
|
||||
fields:
|
||||
title:
|
||||
selector: td[class^="coll-1"] a[href^="/torrent/"]
|
||||
@@ -230,3 +228,4 @@
|
||||
text: 0
|
||||
uploadvolumefactor:
|
||||
text: 1
|
||||
# engine n/a
|
||||
|
@@ -140,6 +140,7 @@
|
||||
|
||||
rows:
|
||||
selector: table.ttable_headinner > tbody > tr[class^="t-row"]
|
||||
|
||||
fields:
|
||||
category:
|
||||
selector: a[href^="torrents.php?cat="]
|
||||
@@ -179,3 +180,4 @@
|
||||
uploadvolumefactor:
|
||||
case:
|
||||
"*": 1
|
||||
# engine n/a
|
||||
|
@@ -33,6 +33,18 @@
|
||||
modes:
|
||||
search: [q]
|
||||
|
||||
settings:
|
||||
- name: username
|
||||
type: text
|
||||
label: Username
|
||||
- name: password
|
||||
type: password
|
||||
label: Password
|
||||
- name: info
|
||||
type: info
|
||||
label: Results Per Page
|
||||
default: For best results, change the <b>Torrents per page:</b> setting to <b>100</b> on your account profile.
|
||||
|
||||
login:
|
||||
path: index.php?page=login&returnto=index.php
|
||||
method: form
|
||||
@@ -53,14 +65,16 @@
|
||||
paths:
|
||||
- path: index.php
|
||||
inputs:
|
||||
$raw: "{{range .Categories}}filter_cat[{{.}}]=1&{{end}}"
|
||||
search: "{{ .Query.Keywords }}"
|
||||
$raw: "{{ range .Categories }}filter_cat[{{.}}]=1&{{end}}"
|
||||
search: "{{ .Keywords }}"
|
||||
page: torrents
|
||||
category: 0
|
||||
3dformat: 0
|
||||
active: 1
|
||||
|
||||
rows:
|
||||
selector: table[cellspacing!="1"].lista > tbody > tr:has(a[href^="index.php?page=torrents&category="])
|
||||
|
||||
fields:
|
||||
category:
|
||||
selector: a[href^="index.php?page=torrents&category="]
|
||||
@@ -93,8 +107,9 @@
|
||||
args: "02/01/2006"
|
||||
downloadvolumefactor:
|
||||
case:
|
||||
img[title^="You get 50% off download count on this torrent"]: "0.5"
|
||||
"*": "1"
|
||||
img[title^="You get 50% off download count on this torrent"]: 0.5
|
||||
"*": 1
|
||||
uploadvolumefactor:
|
||||
case:
|
||||
"*": "1"
|
||||
"*": 1
|
||||
# xbtit
|
||||
|
@@ -87,6 +87,7 @@
|
||||
selector: table.responsive-card-table tr:has(td[data-label])
|
||||
filters:
|
||||
- name: andmatch
|
||||
|
||||
fields:
|
||||
category:
|
||||
selector: td[data-label="Type"] a
|
||||
@@ -149,4 +150,5 @@
|
||||
"*": 1
|
||||
uploadvolumefactor:
|
||||
case:
|
||||
"*": 1
|
||||
"*": 1
|
||||
# U-232 V5
|
||||
|
@@ -141,3 +141,4 @@
|
||||
uploadvolumefactor:
|
||||
case:
|
||||
"*": 1
|
||||
# Engine n/a
|
||||
|
158
src/Jackett.Common/Definitions/52pt.yml
Normal file
158
src/Jackett.Common/Definitions/52pt.yml
Normal file
@@ -0,0 +1,158 @@
|
||||
---
|
||||
site: 52pt
|
||||
name: 52PT
|
||||
description: "52PT is a CHINESE Private Torrent Tracker for HD MOVIES / TV"
|
||||
language: zh-cn
|
||||
type: private
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- https://52pt.site/
|
||||
|
||||
caps:
|
||||
categorymappings:
|
||||
- {id: 401, cat: Movies, desc: "Movies/电影"}
|
||||
- {id: 404, cat: TV/Documentary, desc: "Documentaries/纪录片"}
|
||||
- {id: 405, cat: TV/Anime, desc: "Animations/动漫"}
|
||||
- {id: 402, cat: TV, desc: "TV Series/剧集"}
|
||||
- {id: 403, cat: TV, desc: "TV Shows/综艺"}
|
||||
- {id: 406, cat: Audio/Video, desc: "MusicVideo/音乐MV"}
|
||||
- {id: 407, cat: TV/Sport, desc: "Sports/运体"}
|
||||
- {id: 409, cat: Other, desc: "Misc/其他"}
|
||||
- {id: 410, cat: Other, desc: "Opera/戏曲 曲艺"}
|
||||
- {id: 408, cat: Audio, desc: "HQ Audio/无损音乐"}
|
||||
|
||||
modes:
|
||||
search: [q]
|
||||
tv-search: [q, season, ep, imdbid]
|
||||
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:
|
||||
path: login.php
|
||||
method: form
|
||||
form: form[action="takelogin.php"]
|
||||
captcha:
|
||||
type: image
|
||||
selector: img[alt="CAPTCHA"]
|
||||
input: imagestring
|
||||
inputs:
|
||||
username: "{{ .Config.username }}"
|
||||
password: "{{ .Config.password }}"
|
||||
error:
|
||||
- selector: td.embedded:has(h2:contains("失败"))
|
||||
- selector: td.embedded:has(h2:contains("登录失败"))
|
||||
test:
|
||||
path: index.php
|
||||
selector: a[href*="logout.php"]
|
||||
|
||||
search:
|
||||
paths:
|
||||
- path: torrents.php
|
||||
inputs:
|
||||
$raw: "{{ range .Categories }}cat{{.}}=1&{{end}}"
|
||||
search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{else}}{{ .Keywords }}{{end}}"
|
||||
# 0 incldead 1 active 2 dead
|
||||
incldead: 0
|
||||
# 0 all 1 normal 2 free 3 2x 4 2xfree 5 50% 6 2x50% 7 30%
|
||||
spstate: 0
|
||||
# 0 title 1 descr 3 uploaded 4 imdburl
|
||||
search_area: "{{ if .Query.IMDBID }}4{{else}}0{{end}}"
|
||||
# 0 AND 1 OR 2 exact
|
||||
search_mode: 0
|
||||
sort: "{{ .Config.sort }}"
|
||||
type: "{{ .Config.type }}"
|
||||
|
||||
rows:
|
||||
selector: table.torrents > tbody > tr:has(table.torrentname)
|
||||
|
||||
fields:
|
||||
title:
|
||||
selector: a[href^="details.php?id="]
|
||||
title:
|
||||
optional: true
|
||||
selector: a[title][href^="details.php?id="]
|
||||
attribute: title
|
||||
category:
|
||||
selector: a[href^="?cat="]
|
||||
attribute: href
|
||||
filters:
|
||||
- name: querystring
|
||||
args: cat
|
||||
details:
|
||||
selector: a[href^="details.php?id="]
|
||||
attribute: href
|
||||
download:
|
||||
selector: a[href^="download.php?id="]
|
||||
attribute: href
|
||||
imdb:
|
||||
optional: true
|
||||
selector: div.imdb_100 > a
|
||||
attribute: href
|
||||
date:
|
||||
# time type: time elapsed (default)
|
||||
selector: td:nth-child(4) > span[title]
|
||||
attribute: title
|
||||
optional: true
|
||||
filters:
|
||||
- name: append
|
||||
args: " +08:00"
|
||||
- name: dateparse
|
||||
args: "2006-01-02 15:04:05 -07:00"
|
||||
date:
|
||||
# time added
|
||||
selector: td:nth-child(4):not(:has(span))
|
||||
optional: true
|
||||
filters:
|
||||
- name: append
|
||||
args: " +08:00"
|
||||
- name: dateparse
|
||||
args: "2006-01-0215:04:05 -07:00"
|
||||
size:
|
||||
selector: td:nth-child(5)
|
||||
seeders:
|
||||
selector: td:nth-child(6)
|
||||
leechers:
|
||||
selector: td:nth-child(7)
|
||||
grabs:
|
||||
selector: td:nth-child(8)
|
||||
downloadvolumefactor:
|
||||
case:
|
||||
img.pro_free: 0
|
||||
img.pro_free2up: 0
|
||||
img.pro_50pctdown: 0.5
|
||||
img.pro_50pctdown2up: 0.5
|
||||
img.pro_30pctdown: 0.3
|
||||
"*": 1
|
||||
uploadvolumefactor:
|
||||
case:
|
||||
img.pro_50pctdown2up: 2
|
||||
img.pro_free2up: 2
|
||||
img.pro_2up: 2
|
||||
"*": 1
|
||||
description:
|
||||
selector: td:nth-child(2)
|
||||
remove: a, img
|
||||
# NexusPHP Standard v1.5 Beta 4
|
77
src/Jackett.Common/Definitions/7torrents.yml
Normal file
77
src/Jackett.Common/Definitions/7torrents.yml
Normal file
@@ -0,0 +1,77 @@
|
||||
---
|
||||
site: 7torrents
|
||||
name: 7torrents
|
||||
description: "7torrents is a Public BitTorrent DHT search engine."
|
||||
language: en-us
|
||||
type: public
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- https://www.7torrents.cc/
|
||||
|
||||
caps:
|
||||
categories:
|
||||
1: Other
|
||||
|
||||
modes:
|
||||
search: [q]
|
||||
tv-search: [q, season, ep]
|
||||
movie-search: [q]
|
||||
|
||||
settings:
|
||||
- name: info
|
||||
type: info
|
||||
default: 7torrents does not use categories. In your software Indexer settings, set the category to 100001.
|
||||
- name: sort
|
||||
type: select
|
||||
label: Sort requested from site
|
||||
default: "created"
|
||||
options:
|
||||
"created": "created"
|
||||
"length": "size"
|
||||
"seeders": "seeders"
|
||||
|
||||
search:
|
||||
# https://www.7torrents.cc/search?query=2020&sort=created
|
||||
paths:
|
||||
- path: search
|
||||
inputs:
|
||||
query: "{{ if .Keywords }}{{ .Keywords }}{{else}}2020{{end}}"
|
||||
sort: "{{ .Config.sort }}"
|
||||
|
||||
rows:
|
||||
selector: div.media
|
||||
|
||||
fields:
|
||||
category:
|
||||
text: 1
|
||||
title:
|
||||
selector: div.media
|
||||
attribute: data-name
|
||||
details:
|
||||
selector: div.media h5 a
|
||||
attribute: href
|
||||
download:
|
||||
selector: div.media-right a[href*="/torrent/"]
|
||||
attribute: href
|
||||
magnet:
|
||||
selector: a[href^="magnet:?xt="]
|
||||
attribute: href
|
||||
date:
|
||||
selector: div.media
|
||||
attribute: data-added
|
||||
filters:
|
||||
- name: timeago
|
||||
size:
|
||||
selector: div.media
|
||||
attribute: data-size
|
||||
seeders:
|
||||
selector: div.media
|
||||
attribute: data-seeders
|
||||
leechers:
|
||||
selector: div.media
|
||||
attribute: data-leechers
|
||||
downloadvolumefactor:
|
||||
text: 0
|
||||
uploadvolumefactor:
|
||||
text: 1
|
||||
# engine n/a
|
@@ -150,6 +150,7 @@
|
||||
|
||||
rows:
|
||||
selector: table.tableinborder > tbody > tr:has(a[href^="details.php"])
|
||||
|
||||
fields:
|
||||
title:
|
||||
selector: a[href^="details.php"]
|
||||
@@ -225,3 +226,4 @@
|
||||
case:
|
||||
img[alt="2xU"]: 2
|
||||
"*": 1
|
||||
# engine n/a
|
||||
|
@@ -8,13 +8,15 @@
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- https://acg.rip/
|
||||
certificates:
|
||||
- bfd88de41aeeda5c9d98d5e081e8c4ec40204b6b # expired 4 jan 20
|
||||
|
||||
caps:
|
||||
categories:
|
||||
1: TV
|
||||
modes:
|
||||
tv-search: [q, season, ep]
|
||||
search: [q]
|
||||
tv-search: [q, season, ep]
|
||||
|
||||
settings: []
|
||||
|
||||
@@ -22,9 +24,11 @@
|
||||
paths:
|
||||
- path: /
|
||||
inputs:
|
||||
term: "{{ .Query.Keywords }}"
|
||||
term: "{{ .Keywords }}"
|
||||
|
||||
rows:
|
||||
selector: tbody tr
|
||||
|
||||
fields:
|
||||
title:
|
||||
selector: td.title > span.title a
|
||||
@@ -50,6 +54,7 @@
|
||||
filters:
|
||||
- name: fuzzytime
|
||||
downloadvolumefactor:
|
||||
text: "0"
|
||||
text: 0
|
||||
uploadvolumefactor:
|
||||
text: "1"
|
||||
text: 1
|
||||
# engine n/a
|
||||
|
@@ -38,14 +38,17 @@
|
||||
|
||||
download:
|
||||
selector: a[href^="magnet:?xt="]
|
||||
attribute: href
|
||||
|
||||
search:
|
||||
paths:
|
||||
# https://www.acgsou.com/1.html
|
||||
# https://www.acgsou.com/search.php?keyword=test
|
||||
- path: "{{ if .Keywords }}search.php?keyword={{ .Keywords }}{{else}}1.html{{end}}"
|
||||
|
||||
rows:
|
||||
selector: table tbody tr[class^="alt"]:has(td:nth-child(3) a)
|
||||
|
||||
fields:
|
||||
date:
|
||||
selector: td:nth-child(1):contains("昨天")
|
||||
@@ -86,6 +89,7 @@
|
||||
leechers:
|
||||
text: 1
|
||||
downloadvolumefactor:
|
||||
text: "0"
|
||||
text: 0
|
||||
uploadvolumefactor:
|
||||
text: "1"
|
||||
text: 1
|
||||
# BTMaster 2.1.1
|
||||
|
@@ -102,7 +102,7 @@
|
||||
paths:
|
||||
- path: browse.php
|
||||
inputs:
|
||||
$raw: "{{range .Categories}}c{{.}}=1&{{end}}"
|
||||
$raw: "{{ range .Categories }}c{{.}}=1&{{end}}"
|
||||
search: "{{ .Keywords }}"
|
||||
incldead: 1
|
||||
sort: "{{ .Config.sort }}"
|
||||
@@ -164,9 +164,10 @@
|
||||
args: "2006-01-02 15:04:05"
|
||||
downloadvolumefactor:
|
||||
case:
|
||||
span.icon_gift: "0"
|
||||
"*": "1"
|
||||
span.icon_gift: 0
|
||||
"*": 1
|
||||
uploadvolumefactor:
|
||||
case:
|
||||
span.icon_upload: "2"
|
||||
"*": "1"
|
||||
span.icon_upload: 2
|
||||
"*": 1
|
||||
# XBT v3
|
@@ -97,6 +97,7 @@
|
||||
|
||||
rows:
|
||||
selector: tr.trclass:not(:has(td.lista-cat-rec))
|
||||
|
||||
fields:
|
||||
title:
|
||||
selector: td a[href*="id="]
|
||||
@@ -142,4 +143,4 @@
|
||||
text: 0
|
||||
uploadvolumefactor:
|
||||
text: 1
|
||||
|
||||
# xbtit 2.3
|
||||
|
@@ -107,6 +107,7 @@
|
||||
|
||||
rows:
|
||||
selector: tr[id^="tor_"]
|
||||
|
||||
fields:
|
||||
title:
|
||||
selector: td a.tLink
|
||||
@@ -147,9 +148,10 @@
|
||||
selector: td:nth-child(6) span:nth-last-child(1)
|
||||
downloadvolumefactor:
|
||||
case:
|
||||
img[src="./styles/images/tor_gold.gif"]: "0"
|
||||
img[src="./styles/images/tor_silver.gif"]: "0.5"
|
||||
"*": "1"
|
||||
img[src="./styles/images/tor_gold.gif"]: 0
|
||||
img[src="./styles/images/tor_silver.gif"]: 0.5
|
||||
"*": 1
|
||||
uploadvolumefactor:
|
||||
case:
|
||||
"*": "1"
|
||||
"*": 1
|
||||
# engine n/a
|
||||
|
@@ -1,107 +0,0 @@
|
||||
---
|
||||
site: anidex
|
||||
name: Anidex
|
||||
description: "Anidex is a Public torrent tracker and indexer, primarily for English fansub groups of anime"
|
||||
language: en-us
|
||||
encoding: UTF-8
|
||||
type: public
|
||||
links:
|
||||
- https://anidex.info/
|
||||
|
||||
caps:
|
||||
categorymappings:
|
||||
- {id: 1, cat: TV/Anime, desc: "Anime - Sub"}
|
||||
- {id: 2, cat: TV/Anime, desc: "Anime - Raw"}
|
||||
- {id: 3, cat: TV/Anime, desc: "Anime - Dub"}
|
||||
- {id: 4, cat: TV/Anime, desc: "LA - Sub"}
|
||||
- {id: 5, cat: TV/Anime, desc: "LA - Raw"}
|
||||
- {id: 6, cat: TV/Anime, desc: "Light Novel"}
|
||||
- {id: 7, cat: TV/Anime, desc: "Manga - TLed"}
|
||||
- {id: 8, cat: TV/Anime, desc: "Manga - Raw"}
|
||||
- {id: 9, cat: TV/Anime, desc: "♫ - Lossy"}
|
||||
- {id: 10, cat: TV/Anime, desc: "♫ - Lossless"}
|
||||
- {id: 11, cat: TV/Anime, desc: "♫ - Video"}
|
||||
- {id: 12, cat: TV/Anime, desc: "Games"}
|
||||
- {id: 13, cat: TV/Anime, desc: "Applications"}
|
||||
- {id: 14, cat: TV/Anime, desc: "Pictures"}
|
||||
- {id: 15, cat: TV/Anime, desc: "Adult Video"}
|
||||
- {id: 16, cat: TV/Anime, desc: "Other"}
|
||||
|
||||
modes:
|
||||
search: [q]
|
||||
tv-search: [q, season, ep]
|
||||
|
||||
settings:
|
||||
- name: lang-id
|
||||
type: text
|
||||
label: Language ID
|
||||
- name: info
|
||||
type: info
|
||||
label: Language ID Note
|
||||
default: "You can filter your searches using any of the following language ID (comma delimited):<br>19 :Arabic<br>22 :Bengali<br>14 :Bulgarian<br>21 :Chinese (Simplified)<br>24 :Czech<br>20 :Danish<br>5 :Dutch<br>1 :English<br>11 :Finnish<br>10 :French<br>8 :German<br>13 :Greek<br>9 :Hungarian<br>27 :Indonesian<br>6 :Italian<br>2 :Japanese<br>28 :Korean<br>31 :Malaysian<br>25 :Mongolian<br>30 :Persian<br>3 :Polish<br>16 :Portuguese (Brazil)<br>17 :Portuguese (Portugal)<br>23 :Romanian<br>7 :Russian<br>4 :Serbo-Croatian<br>29 :Spanish (LATAM)<br>15 :Spanish (Spain)<br>18 :Swedish<br>26 :Turkish<br>12 :Vietnamese"
|
||||
- name: sort
|
||||
type: select
|
||||
label: Sort requested from site
|
||||
default: "upload_timestamp"
|
||||
options:
|
||||
"upload_timestamp": "created"
|
||||
"seeders": "seeders"
|
||||
"size": "size"
|
||||
"filename": "title"
|
||||
- name: type
|
||||
type: select
|
||||
label: Order requested from site
|
||||
default: "desc"
|
||||
options:
|
||||
"desc": "desc"
|
||||
"asc": "asc"
|
||||
|
||||
search:
|
||||
paths:
|
||||
# https://anidex.info/?page=search&id=1,2,3&lang_id=5,1,10&group_id=0&q=rinshi
|
||||
- path: "?page=search&id={{ if .Categories }}{{ range .Categories }},{{.}}{{end}}{{else}}0{{end}}{{ if .Config.lang-id }}&lang_id={{ .Config.lang-id }}{{else}}{{end}}&group_id=0&q={{ if .Keywords }}{{ .Keywords }}{{else}}{{end}}&s={{ .Config.sort }}&o={{ .Config.type }}"
|
||||
|
||||
rows:
|
||||
selector: div.table-responsive > table > tbody > tr
|
||||
|
||||
fields:
|
||||
category:
|
||||
selector: a[href^="/?id="]
|
||||
attribute: href
|
||||
filters:
|
||||
- name: querystring
|
||||
args: id
|
||||
title:
|
||||
selector: td:nth-child(3) > a.torrent > span.span-1440
|
||||
filters:
|
||||
- name: re_replace # remove anidb id from return string
|
||||
args: ["(\\[[A-Z0-9]*\\])\\.", "."]
|
||||
details:
|
||||
selector: td:nth-child(3) > a.torrent
|
||||
attribute: href
|
||||
download:
|
||||
selector: td:nth-child(5) > a
|
||||
attribute: href
|
||||
magnet:
|
||||
selector: a[href^="magnet:?"]
|
||||
attribute: href
|
||||
size:
|
||||
selector: td:nth-child(7)
|
||||
date:
|
||||
selector: td:nth-child(8)
|
||||
attribute: title
|
||||
filters:
|
||||
- name: replace
|
||||
args: ["UTC", "+00:00"]
|
||||
- name: dateparse
|
||||
args: "2006-01-02 15:04:05 -07:00"
|
||||
seeders:
|
||||
selector: td:nth-child(9)
|
||||
leechers:
|
||||
selector: td:nth-child(10)
|
||||
grabs:
|
||||
selector: td:nth-child(11)
|
||||
downloadvolumefactor:
|
||||
text: 0
|
||||
uploadvolumefactor:
|
||||
text: 1
|
@@ -36,8 +36,10 @@
|
||||
search:
|
||||
paths:
|
||||
- path: "{{if .Keywords}}?s={{ .Keywords}}{{else}}{{end}}"
|
||||
|
||||
rows:
|
||||
selector: table tbody tr:has(td.torrents_small_type_data1)
|
||||
|
||||
fields:
|
||||
title:
|
||||
selector: .torrents_small_info_data1 div
|
||||
@@ -61,18 +63,19 @@
|
||||
selector: .torrents_small_type_data1 img
|
||||
attribute: src
|
||||
case:
|
||||
"[src=\"./styles/tracker/imageset/cat_raw_small.png\"]": "1"
|
||||
"[src=\"./styles/tracker/imageset/cat_anime_small.png\"]": "2"
|
||||
"[src=\"./styles/tracker/imageset/cat_hentai_small.png\"]": "3"
|
||||
"[src=\"./styles/tracker/imageset/cat_drama_small.png\"]": "4"
|
||||
"[src=\"./styles/tracker/imageset/cat_dvd_small.png\"]": "5"
|
||||
"[src=\"./styles/tracker/imageset/cat_hgame2_small.png\"]": "6"
|
||||
"[src=\"./styles/tracker/imageset/cat_manga_small.png\"]": "7"
|
||||
"[src=\"./styles/tracker/imageset/cat_music_small.png\"]": "8"
|
||||
"[src=\"./styles/tracker/imageset/cat_musicvid_small.png\"]": "9"
|
||||
"[src=\"./styles/tracker/imageset/cat_noneng_small.png\"]": "10"
|
||||
"[src=\"./styles/tracker/imageset/cat_other_small.png\"]": "11"
|
||||
"[src=\"./styles/tracker/imageset/cat_raw_small.png\"]": 1
|
||||
"[src=\"./styles/tracker/imageset/cat_anime_small.png\"]": 2
|
||||
"[src=\"./styles/tracker/imageset/cat_hentai_small.png\"]": 3
|
||||
"[src=\"./styles/tracker/imageset/cat_drama_small.png\"]": 4
|
||||
"[src=\"./styles/tracker/imageset/cat_dvd_small.png\"]": 5
|
||||
"[src=\"./styles/tracker/imageset/cat_hgame2_small.png\"]": 6
|
||||
"[src=\"./styles/tracker/imageset/cat_manga_small.png\"]": 7
|
||||
"[src=\"./styles/tracker/imageset/cat_music_small.png\"]": 8
|
||||
"[src=\"./styles/tracker/imageset/cat_musicvid_small.png\"]": 9
|
||||
"[src=\"./styles/tracker/imageset/cat_noneng_small.png\"]": 10
|
||||
"[src=\"./styles/tracker/imageset/cat_other_small.png\"]": 11
|
||||
downloadvolumefactor:
|
||||
text: "0"
|
||||
text: 0
|
||||
uploadvolumefactor:
|
||||
text: "1"
|
||||
text: 1
|
||||
# engine n/a
|
||||
|
@@ -69,6 +69,34 @@
|
||||
tv-search: [q, season, ep, imdbid]
|
||||
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: "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"
|
||||
- name: info
|
||||
type: info
|
||||
label: Results Per Page
|
||||
default: For best results, change the <b>Torrents per page:</b> setting to <b>100</b> on your account profile.
|
||||
|
||||
login:
|
||||
path: index.php?page=login
|
||||
method: post
|
||||
@@ -91,12 +119,13 @@
|
||||
download:
|
||||
before:
|
||||
path: thanks.php
|
||||
method: "post"
|
||||
method: post
|
||||
inputs:
|
||||
infohash: "{{ .DownloadUri.Query.id }}"
|
||||
thanks: "1"
|
||||
thanks: 1
|
||||
rndval: "1487013827343"
|
||||
selector: a[href^="download.php?id="]
|
||||
attribute: href
|
||||
|
||||
search:
|
||||
paths:
|
||||
@@ -110,12 +139,16 @@
|
||||
args: ["(?i)\\bS0*(\\d+)E0*(\\d+)\\b", "$1 $2"]
|
||||
inputs:
|
||||
search: "{{if .Query.IMDBID}}{{ .Query.IMDBIDShort }}{{else}}{{ .Keywords }}{{end}}"
|
||||
page: "torrents"
|
||||
category: "{{range .Categories}}{{.}};{{end}}"
|
||||
page: torrents
|
||||
category: "{{ range .Categories }}{{.}};{{end}}"
|
||||
options: "{{ if .Query.IMDBID }}4{{else}}0{{end}}"
|
||||
active: "0"
|
||||
active: 0
|
||||
order: "{{ .Config.sort }}"
|
||||
by: "{{ .Config.type }}"
|
||||
|
||||
rows:
|
||||
selector: table > tbody > tr > td > table.lista > tbody > tr:has(a[href^="index.php?page=torrent-details&id="])
|
||||
|
||||
fields:
|
||||
download:
|
||||
selector: a[href^="index.php?page=downloadcheck&id="]
|
||||
@@ -172,19 +205,20 @@
|
||||
selector: td:nth-last-child(7)
|
||||
downloadvolumefactor:
|
||||
case:
|
||||
img[alt="Gold 100% Free"]: "0"
|
||||
img[alt="Silver 50% Free"]: "0.5"
|
||||
img[alt="Bronze 25% Free"]: "0.75"
|
||||
"*": "1"
|
||||
img[alt="Gold 100% Free"]: 0
|
||||
img[alt="Silver 50% Free"]: 0.5
|
||||
img[alt="Bronze 25% Free"]: 0.75
|
||||
"*": 1
|
||||
uploadvolumefactor:
|
||||
case:
|
||||
img[alt="2x Upload Multiplier"]: "2"
|
||||
img[alt="3x Upload Multiplier"]: "3"
|
||||
img[alt="4x Upload Multiplier"]: "4"
|
||||
img[alt="5x Upload Multiplier"]: "5"
|
||||
img[alt="6x Upload Multiplier"]: "6"
|
||||
img[alt="7x Upload Multiplier"]: "7"
|
||||
img[alt="8x Upload Multiplier"]: "8"
|
||||
img[alt="9x Upload Multiplier"]: "9"
|
||||
img[alt="10x Upload Multiplier"]: "10"
|
||||
"*": "1"
|
||||
img[alt="2x Upload Multiplier"]: 2
|
||||
img[alt="3x Upload Multiplier"]: 3
|
||||
img[alt="4x Upload Multiplier"]: 4
|
||||
img[alt="5x Upload Multiplier"]: 5
|
||||
img[alt="6x Upload Multiplier"]: 6
|
||||
img[alt="7x Upload Multiplier"]: 7
|
||||
img[alt="8x Upload Multiplier"]: 8
|
||||
img[alt="9x Upload Multiplier"]: 9
|
||||
img[alt="10x Upload Multiplier"]: 10
|
||||
"*": 1
|
||||
# xbtitFM v1.16
|
||||
|
@@ -102,6 +102,7 @@
|
||||
|
||||
download:
|
||||
selector: a[href*="{{ .Config.downloadlink }}"]
|
||||
attribute: href
|
||||
|
||||
search:
|
||||
paths:
|
||||
@@ -118,6 +119,7 @@
|
||||
|
||||
rows:
|
||||
selector: tr:has(td.category)
|
||||
|
||||
fields:
|
||||
title:
|
||||
# use the second div for full title
|
||||
@@ -177,3 +179,4 @@
|
||||
text: 0
|
||||
uploadvolumefactor:
|
||||
text: 1
|
||||
# engine n/a
|
||||
|
@@ -133,6 +133,7 @@
|
||||
selector: table.table-striped > tbody > tr:has(a[href*="details.php?id="])
|
||||
filters:
|
||||
- name: andmatch
|
||||
|
||||
fields:
|
||||
title:
|
||||
selector: div.torrent-name
|
||||
@@ -179,3 +180,4 @@
|
||||
uploadvolumefactor:
|
||||
case:
|
||||
"*": 1
|
||||
# Midgaard
|
||||
|
@@ -67,6 +67,7 @@
|
||||
|
||||
download:
|
||||
selector: a[href*="/download/"]
|
||||
attribute: href
|
||||
|
||||
search:
|
||||
paths:
|
||||
@@ -133,29 +134,35 @@
|
||||
filters:
|
||||
# translations for Turkish|Estonian|Danish|Italian|Polish|Norwegian|Portuguese|Czech|Russian|Romanian|Spanish|French|German|Bulgarian|Dutch|Chinese
|
||||
- name: re_replace
|
||||
args: ["(?i)(önce|tagasi|geleden|fa|temu|siden|atrás|nazpět|назад|acum|hace|il y a|vor|преди|前)", " ago"]
|
||||
- name: re_replace
|
||||
args: ["(?i)(dakika|minut|minuto|minuta|minutt|минута|Minute|minuut|分钟)", " minute"]
|
||||
args: ["(?i)(önce|tagasi|geleden|fa|temu|siden|atrás|nazpět|назад|acum|în urmă|hace|il y a|vor|преди|前)", " ago"]
|
||||
- name: re_replace
|
||||
args: ["(?i)(minutit|minutter|minuti|minuty|minutos|минуты|минут|Minuten|минути|minuten)", "minutes"]
|
||||
- name: re_replace
|
||||
args: ["(?i)(saat|tund|time|ora|godzina|hora|hodina|час|oră|heure|Stunde|uur|小时)", " hour"]
|
||||
args: ["(?i)(dakika|minut|minuto|minuta|minutt|минута|Minute|minuut|分钟)", " minute"]
|
||||
- name: re_replace
|
||||
args: ["(?i)(tundi|timer|ore|godziny|horas|hodiny|hoden|часа|часов|ore|heures|Stunden)", "hours"]
|
||||
- name: re_replace
|
||||
args: ["(?i)(gün|päev|dag|giorno|dzień|dia|den|день|zi|día|jour|Tag|ден|天)", " day"]
|
||||
args: ["(?i)(saat|tund|time|ora|godzina|hora|hodina|час|oră|heure|Stunde|uur|小时)", " hour"]
|
||||
- name: re_replace
|
||||
args: ["(?i)(päeva|dage|giorni|dni|dias|dny|дня|дней|zile|días|jours|Tagen|дни|dagen)", "days"]
|
||||
- name: re_replace
|
||||
args: ["(?i)(hafta|nädal|uge|settimana|tydzień|uke|semana|týden|неделю|săptămână|semaine|Woche|седмица|周)", " week"]
|
||||
args: ["(?i)(gün|päev|dag|giorno|dzień|dia|den|день|zi|día|jour|Tag|ден|天)", " day"]
|
||||
- name: re_replace
|
||||
args: ["(?i)(nädalat|uger|settimane|tygodnie|uker|semanas|týdny|недели|недель|săptămâni|semaines|Wochen|седмици|weken)", "weeks"]
|
||||
- name: re_replace
|
||||
args: ["(?i)(hafta|nädal|uge|settimana|tydzień|uke|semana|týden|неделю|săptămână|semaine|Woche|седмица|周)", " week"]
|
||||
- name: re_replace
|
||||
args: ["(?i) (ay)", "month"]
|
||||
- name: re_replace
|
||||
args: ["(?i)(kuu|måned|mese|miesiąc|mês|měsíc|месяц|lună|mes|mois|Monat|месец|maand|个月)", " month"]
|
||||
- name: re_replace
|
||||
args: ["(?i)(kuud|måneder|mesi|miesiące|meses|měsíce|месяца|месяцев|luni|meses|mois|Monaten|месеца|maanden)", "months"]
|
||||
- name: re_replace
|
||||
args: ["(?i)(kuu|måned|mese|miesiąc|mês|měsíc|месяц|lună|mes|Monat|месец|maand|个月)", " month"]
|
||||
- name: re_replace
|
||||
args: ["(?i)(aastat|anni|lata|anos|roky|года|ani|años|ans|Jahren|години)", " years"]
|
||||
- name: re_replace
|
||||
args: ["(?i)(yil|aasta|år|anno|rok|ano|год|año|Jahr|година|jaar|年)", " year"]
|
||||
- name: re_replace
|
||||
args: ["(?i) (an)", "year"]
|
||||
downloadvolumefactor:
|
||||
case:
|
||||
i[class*="fa-id-badge text-orange"]: 0 # 24 Hour FreeLeech From BON Store
|
||||
|
@@ -1,11 +1,10 @@
|
||||
---
|
||||
site: audiobookbay
|
||||
name: AudioBookBay
|
||||
description: "AudioBook Bay (ABB) is a semi-private Torrent Tracker for AUDIOBOOKS"
|
||||
description: "AudioBook Bay (ABB) is a public Torrent Tracker for AUDIOBOOKS"
|
||||
language: en-us
|
||||
type: semi-private
|
||||
type: public
|
||||
encoding: UTF-8
|
||||
followredirect: true
|
||||
links:
|
||||
- http://audiobookbay.nl/
|
||||
legacylinks:
|
||||
@@ -75,41 +74,30 @@
|
||||
modes:
|
||||
search: [q]
|
||||
|
||||
login:
|
||||
path: https://audiobookbay.nl/member/login.php
|
||||
form: form[action$="/member/login.php"]
|
||||
method: post
|
||||
form: form
|
||||
inputs:
|
||||
username: "{{ .Config.username }}"
|
||||
password: "{{ .Config.password }}"
|
||||
error:
|
||||
- selector: div.warning
|
||||
test:
|
||||
path: http://audiobookbay.nl/member/users/
|
||||
selector: a[href="/member/logout"]
|
||||
settings: []
|
||||
|
||||
download:
|
||||
method: get
|
||||
before:
|
||||
path: https://audiobookbay.nl/member/login.php
|
||||
method: "post"
|
||||
inputs:
|
||||
username: "{{ .Config.username }}"
|
||||
password: "{{ .Config.password }}"
|
||||
selector: td:contains("Info Hash:") ~ td
|
||||
filters:
|
||||
- name: prepend
|
||||
args: "magnet:?xt=urn:btih:"
|
||||
- name: append
|
||||
args: "&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969%2Fannounce&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969%2Fannounce&tr=udp%3A%2F%2Fopen.stealth.si%3A80%2Fannounce&tr=udp%3A%2F%2Fexodus.desync.com%3A6969&tr=udp%3A%2F%2Fp4p.arenabg.com%3A1337%2Fannounce&tr=udp%3A%2F%2Fexplodie.org%3A6969%2Fannounce&tr=udp%3A%2F%2Ftracker.opentrackr.org%3A1337%2Fannounce&tr=udp%3A%2F%2Ftracker.tiny-vps.com%3A6969%2Fannounce&tr=udp%3A%2F%2Fopen.demonii.si%3A1337%2Fannounce&tr=udp%3A%2F%2Ftracker.torrent.eu.org%3A451%2Fannounce&tr=udp%3A%2F%2Ftracker.pirateparty.gr%3A6969%2Fannounce&tr=udp%3A%2F%2Fipv4.tracker.harry.lu%3A80%2Fannounce&tr=udp%3A%2F%2Ftracker.cyberia.is%3A6969%2Fannounce&tr=udp%3A%2F%2F9.rarbg.to%3A2710%2Fannounce&tr=udp%3A%2F%2Fdenis.stalker.upeer.me%3A6969%2Fannounce"
|
||||
|
||||
search:
|
||||
paths:
|
||||
# with just 7 results per page, try to grab up to 35 results
|
||||
# http://audiobookbay.nl/?s=teeth
|
||||
# http://audiobookbay.nl/page/2/?s=teeth
|
||||
- path: "{{if .Keywords}}/?s={{ .Keywords}}{{else}}/{{end}}"
|
||||
- path: "{{if .Keywords}}/page/2/?s={{ .Keywords}}{{else}}{{end}}"
|
||||
- path: "{{if .Keywords}}/page/3/?s={{ .Keywords}}{{else}}{{end}}"
|
||||
- path: "{{if .Keywords}}/page/4/?s={{ .Keywords}}{{else}}{{end}}"
|
||||
- path: "{{if .Keywords}}/page/5/?s={{ .Keywords}}{{else}}{{end}}"
|
||||
- path: "{{ if .Keywords }}/?s={{ .Keywords }}{{else}}/{{end}}"
|
||||
- path: "{{ if .Keywords }}/page/2/?s={{ .Keywords }}{{else}}{{end}}"
|
||||
- path: "{{ if .Keywords }}/page/3/?s={{ .Keywords }}{{else}}{{end}}"
|
||||
- path: "{{ if .Keywords }}/page/4/?s={{ .Keywords }}{{else}}{{end}}"
|
||||
- path: "{{ if .Keywords }}/page/5/?s={{ .Keywords }}{{else}}{{end}}"
|
||||
|
||||
rows:
|
||||
selector: div.post:has(div[class="postTitle"])
|
||||
|
||||
fields:
|
||||
title:
|
||||
selector: div.postTitle
|
||||
@@ -117,11 +105,8 @@
|
||||
selector: div.postTitle h2 a
|
||||
attribute: href
|
||||
download:
|
||||
selector: a[href^="/dl-now?f="]
|
||||
selector: div.postTitle h2 a
|
||||
attribute: href
|
||||
filters:
|
||||
- name: replace
|
||||
args: ["/dl-now?f=", "/download?f="]
|
||||
banner:
|
||||
optional: true
|
||||
selector: img
|
||||
@@ -142,7 +127,13 @@
|
||||
selector: div.postContent p:contains("File Size:")
|
||||
filters:
|
||||
- name: regexp
|
||||
args: "File Size: (.+?)s"
|
||||
args: "File Size: (.+?)$"
|
||||
- name: replace
|
||||
args: ["MBs", "MB"]
|
||||
- name: replace
|
||||
args: ["GBs", "GB"]
|
||||
- name: replace
|
||||
args: ["KBs", "KB"]
|
||||
seeders:
|
||||
text: 1
|
||||
leechers:
|
||||
@@ -151,3 +142,4 @@
|
||||
text: 0
|
||||
uploadvolumefactor:
|
||||
text: 1
|
||||
# engine n/a
|
||||
|
@@ -269,6 +269,7 @@
|
||||
filters:
|
||||
- name: dateparse
|
||||
args: "01-02-2006"
|
||||
|
||||
fields:
|
||||
title:
|
||||
selector: td a[href*="/viewtopic.php?t="]
|
||||
@@ -299,17 +300,17 @@
|
||||
optional: true
|
||||
selector: td:contains(\00a0B)
|
||||
seeders:
|
||||
text: "0"
|
||||
text: 0
|
||||
seeders:
|
||||
optional: true
|
||||
selector: td[title="Seeders"]
|
||||
leechers:
|
||||
text: "0"
|
||||
text: 0
|
||||
leechers:
|
||||
optional: true
|
||||
selector: td[title="Leechers"]
|
||||
grabs:
|
||||
text: "0"
|
||||
text: 0
|
||||
grabs:
|
||||
optional: true
|
||||
selector: td[title^="Replies:"]
|
||||
@@ -317,3 +318,4 @@
|
||||
text: 1
|
||||
uploadvolumefactor:
|
||||
text: 1
|
||||
# engine n/a
|
||||
|
73
src/Jackett.Common/Definitions/badasstorrents.yml
Normal file
73
src/Jackett.Common/Definitions/badasstorrents.yml
Normal file
@@ -0,0 +1,73 @@
|
||||
---
|
||||
site: badasstorrents
|
||||
name: Badass Torrents
|
||||
description: "Badass Torrents is a Public torrent site for MOVIES / TV / GENERAL"
|
||||
language: en-us
|
||||
type: public
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- https://badasstorrents.com/
|
||||
|
||||
caps:
|
||||
categories:
|
||||
"Anime": TV/Anime
|
||||
"apps": PC
|
||||
"Books": Books
|
||||
"Games": PC/Games
|
||||
"Movies": Movies
|
||||
"Music": Audio
|
||||
"Other": Other
|
||||
"TV": TV
|
||||
"XXX": XXX
|
||||
|
||||
modes:
|
||||
search: [q]
|
||||
tv-search: [q, season, ep]
|
||||
movie-search: [q]
|
||||
|
||||
settings:
|
||||
- name: downloadlink
|
||||
type: select
|
||||
label: Download link
|
||||
default: "magnet:?xt="
|
||||
options:
|
||||
"/download/" : ".torrent"
|
||||
"magnet:?xt=": "magnet"
|
||||
|
||||
download:
|
||||
selector: a[href*="{{ .Config.downloadlink }}"]
|
||||
attribute: href
|
||||
|
||||
search:
|
||||
paths:
|
||||
- path: "torrents/search/{{ .Keywords }}"
|
||||
|
||||
rows:
|
||||
selector: table.table-hover > tbody > tr:has(a[href*="/torrent/"])
|
||||
|
||||
fields:
|
||||
category:
|
||||
selector: a[href*="/cat/"]
|
||||
title:
|
||||
selector: a[href*="/torrent/"]
|
||||
details:
|
||||
selector: a[href*="/torrent/"]
|
||||
attribute: href
|
||||
download:
|
||||
selector: a[href*="/torrent/"]
|
||||
attribute: href
|
||||
date:
|
||||
selector: td:nth-child(3)
|
||||
filters:
|
||||
- name: timeago
|
||||
size:
|
||||
selector: td:nth-child(4)
|
||||
seeders:
|
||||
selector: td:nth-child(5)
|
||||
leechers:
|
||||
selector: td:nth-child(6)
|
||||
downloadvolumefactor:
|
||||
text: 0
|
||||
uploadvolumefactor:
|
||||
text: 1
|
||||
# engine n/a
|
@@ -167,3 +167,4 @@
|
||||
uploadvolumefactor:
|
||||
case:
|
||||
"*": 1
|
||||
# engine n/a
|
||||
|
151
src/Jackett.Common/Definitions/beitai.yml
Normal file
151
src/Jackett.Common/Definitions/beitai.yml
Normal file
@@ -0,0 +1,151 @@
|
||||
---
|
||||
site: beitai
|
||||
name: BeiTai
|
||||
description: "BeiTai is a CHINESE Private Torrent Tracker for HD MOVIES / TV"
|
||||
language: zh-cn
|
||||
type: private
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- https://www.beitai.pt/
|
||||
|
||||
caps:
|
||||
categorymappings:
|
||||
- {id: 401, cat: Movies, desc: "Movies/电影"}
|
||||
- {id: 404, cat: TV/Documentary, desc: "Documentaries/纪录片"}
|
||||
- {id: 405, cat: TV/Anime, desc: "Animations/动漫"}
|
||||
- {id: 402, cat: TV, desc: "TV Series/剧集"}
|
||||
- {id: 403, cat: TV, desc: "TV Shows/综艺"}
|
||||
- {id: 406, cat: Audio/Video, desc: "MusicVideo/音乐MV"}
|
||||
- {id: 407, cat: TV/Sport, desc: "Sports/运体"}
|
||||
- {id: 409, cat: Other, desc: "Misc/其他"}
|
||||
- {id: 408, cat: Audio, desc: "HQ Audio/无损音乐"}
|
||||
|
||||
modes:
|
||||
search: [q]
|
||||
tv-search: [q, season, ep, imdbid]
|
||||
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:
|
||||
path: takelogin.php
|
||||
method: post
|
||||
inputs:
|
||||
username: "{{ .Config.username }}"
|
||||
password: "{{ .Config.password }}"
|
||||
error:
|
||||
- selector: td.embedded:has(h2:contains("登录失败"))
|
||||
test:
|
||||
path: index.php
|
||||
selector: a[href="logout.php"]
|
||||
|
||||
search:
|
||||
paths:
|
||||
- path: torrents.php
|
||||
inputs:
|
||||
$raw: "{{ range .Categories }}cat{{.}}=1&{{end}}"
|
||||
search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{else}}{{ .Keywords }}{{end}}"
|
||||
# 0 incldead 1 active 2 dead
|
||||
incldead: 0
|
||||
# 0 all 1 normal 2 free 3 2x 4 2xfree 5 50% 6 2x50% 7 30%
|
||||
spstate: 0
|
||||
# 0 title 1 descr 3 uploaded 4 imdburl
|
||||
search_area: "{{ if .Query.IMDBID }}4{{else}}0{{end}}"
|
||||
# 0 AND 1 OR 2 exact
|
||||
search_mode: 0
|
||||
sort: "{{ .Config.sort }}"
|
||||
type: "{{ .Config.type }}"
|
||||
|
||||
rows:
|
||||
selector: table.torrents > tbody > tr:has(table.torrentname)
|
||||
|
||||
fields:
|
||||
title:
|
||||
selector: a[href^="details.php?id="]
|
||||
title:
|
||||
optional: true
|
||||
selector: a[title][href^="details.php?id="]
|
||||
attribute: title
|
||||
category:
|
||||
selector: a[href^="?cat="]
|
||||
attribute: href
|
||||
filters:
|
||||
- name: querystring
|
||||
args: cat
|
||||
details:
|
||||
selector: a[href^="details.php?id="]
|
||||
attribute: href
|
||||
download:
|
||||
selector: a[href^="download.php?id="]
|
||||
attribute: href
|
||||
imdb:
|
||||
optional: true
|
||||
selector: div.imdb_100 > a
|
||||
attribute: href
|
||||
date:
|
||||
# time type: time elapsed (default)
|
||||
selector: td:nth-child(4) > span[title]
|
||||
attribute: title
|
||||
optional: true
|
||||
filters:
|
||||
- name: append
|
||||
args: " +08:00"
|
||||
- name: dateparse
|
||||
args: "2006-01-02 15:04:05 -07:00"
|
||||
date:
|
||||
# time added
|
||||
selector: td:nth-child(4):not(:has(span))
|
||||
optional: true
|
||||
filters:
|
||||
- name: append
|
||||
args: " +08:00"
|
||||
- name: dateparse
|
||||
args: "2006-01-0215:04:05 -07:00"
|
||||
size:
|
||||
selector: td:nth-child(5)
|
||||
seeders:
|
||||
selector: td:nth-child(6)
|
||||
leechers:
|
||||
selector: td:nth-child(7)
|
||||
grabs:
|
||||
selector: td:nth-child(8)
|
||||
downloadvolumefactor:
|
||||
case:
|
||||
img.pro_free: 0
|
||||
img.pro_free2up: 0
|
||||
img.pro_50pctdown: 0.5
|
||||
img.pro_50pctdown2up: 0.5
|
||||
img.pro_30pctdown: 0.3
|
||||
"*": 1
|
||||
uploadvolumefactor:
|
||||
case:
|
||||
img.pro_50pctdown2up: 2
|
||||
img.pro_free2up: 2
|
||||
img.pro_2up: 2
|
||||
"*": 1
|
||||
description:
|
||||
selector: td:nth-child(2)
|
||||
remove: a, img
|
||||
# NexusPHP Standard v1.5 Beta 4
|
143
src/Jackett.Common/Definitions/bibliotik.yml
Normal file
143
src/Jackett.Common/Definitions/bibliotik.yml
Normal file
@@ -0,0 +1,143 @@
|
||||
---
|
||||
site: bibliotik
|
||||
name: Bibliotik
|
||||
description: "Bibliotik is a private site for eBooks and audiobooks"
|
||||
language: en-US
|
||||
type: private
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- https://bibliotik.me/
|
||||
|
||||
caps:
|
||||
categorymappings:
|
||||
- { id: 1, cat: PC, desc: "Applications" }
|
||||
- { id: 3, cat: Audio/Audiobook, desc: "Audiobooks" }
|
||||
- { id: 4, cat: Books/Comics, desc: "Comics" }
|
||||
- { id: 5, cat: Books/Ebook, desc: "eBooks" }
|
||||
- { id: 7, cat: Books/Magazines, desc: "Magazines" }
|
||||
|
||||
modes:
|
||||
search: [q]
|
||||
|
||||
settings:
|
||||
- name: username
|
||||
type: text
|
||||
label: Username
|
||||
- name: password
|
||||
type: password
|
||||
label: Password
|
||||
- name: orderby
|
||||
type: select
|
||||
label: Sort requested from site
|
||||
default: "relevance"
|
||||
options:
|
||||
"relevance": "relevance"
|
||||
"year": "year"
|
||||
"size": "size"
|
||||
"duration": "duration"
|
||||
"added": "added"
|
||||
"leechers": "leechers"
|
||||
"seeders": "seeders"
|
||||
"snatches": "snatches"
|
||||
"comments": "comments"
|
||||
"files": "files"
|
||||
- name: order
|
||||
type: select
|
||||
label: Order requested from site
|
||||
default: "desc"
|
||||
options:
|
||||
"desc": "desc"
|
||||
"asc": "asc"
|
||||
|
||||
login:
|
||||
path: /
|
||||
method: form
|
||||
form: form#loginform
|
||||
submitpath: /
|
||||
inputs:
|
||||
action: login
|
||||
username: "{{ .Config.username }}"
|
||||
password: "{{ .Config.password }}"
|
||||
keeploggedin: 1
|
||||
error:
|
||||
- selector: center:first-of-type
|
||||
test:
|
||||
path: torrents/
|
||||
selector: div#pre_header
|
||||
|
||||
search:
|
||||
paths:
|
||||
- path: torrents/
|
||||
inputs:
|
||||
search: "{{ .Keywords }}"
|
||||
$raw: "{{ range .Categories }}cat[]={{.}}&{{end}}"
|
||||
orderby: "{{ .Config.orderby }}"
|
||||
order: "{{ .Config.order }}"
|
||||
|
||||
rows:
|
||||
selector: table#torrents_table > tbody > tr:has(.title)
|
||||
|
||||
fields:
|
||||
category:
|
||||
selector: td:first-child
|
||||
case:
|
||||
div[title="Applications"]: 1
|
||||
div[title="Audiobooks"]: 3
|
||||
div[title="Comics"]: 4
|
||||
div[title="Ebooks"]: 5
|
||||
div[title="Magazines"]: 7
|
||||
_year:
|
||||
selector: .torYear
|
||||
optional: true
|
||||
_filetype:
|
||||
selector: .torFormat
|
||||
optional: true
|
||||
title:
|
||||
selector: .title a
|
||||
filters:
|
||||
- name: append
|
||||
args: "{{ if .Result._year }} {{ .Result._year }}{{else}}{{end}}{{ if .Result._filetype }} {{ .Result._filetype }}{{else}}{{end}}"
|
||||
details:
|
||||
selector: .title a
|
||||
attribute: href
|
||||
date:
|
||||
optional: true
|
||||
selector: .t_files_size_added time
|
||||
filters:
|
||||
- name: timeago
|
||||
download:
|
||||
selector: a[title="Download"]
|
||||
attribute: href
|
||||
# files:
|
||||
# selector: .t_files_size_added
|
||||
# filters:
|
||||
# - name: regexp
|
||||
# args: "^\\s*(\\d+)\\s*file"
|
||||
size:
|
||||
selector: .t_files_size_added
|
||||
filters:
|
||||
- name: split
|
||||
args: [",", 1]
|
||||
- name: trim
|
||||
seeders:
|
||||
text: 0
|
||||
seeders:
|
||||
optional: true
|
||||
selector: .seeders
|
||||
leechers:
|
||||
text: 0
|
||||
leechers:
|
||||
optional: true
|
||||
selector: .leechers
|
||||
grabs:
|
||||
text: 0
|
||||
grabs:
|
||||
optional: true
|
||||
selector: .snatches
|
||||
downloadvolumefactor:
|
||||
case:
|
||||
"*": 1
|
||||
uploadvolumefactor:
|
||||
case:
|
||||
"*": 1
|
||||
# engine tbc
|
@@ -62,8 +62,6 @@
|
||||
|
||||
modes:
|
||||
search: [q]
|
||||
# seems that site does not support season/episode searching
|
||||
# tv-search: [q, season, ep]
|
||||
movie-search: [q]
|
||||
|
||||
settings:
|
||||
@@ -93,17 +91,7 @@
|
||||
#
|
||||
paths:
|
||||
- path: browse.php
|
||||
# cant get season/episode search working on this site
|
||||
# keywordsfilters:
|
||||
# - name: diacritics
|
||||
# args: replace
|
||||
# - name: re_replace # S01 to Сезон 1
|
||||
# args: ["(?i)\\bS0*(\\d+)\\b", ", Сезон $1"]
|
||||
# - name: re_replace # S01E01 to Сезон 1 Серия 1
|
||||
# args: ["(?i)\\bS0*(\\d+)E0*(\\d+)\\b", ", Сезон $1, Серия $2"]
|
||||
inputs:
|
||||
# multi category filters not supported
|
||||
# $raw: "{{range .Categories}}c{{.}}=1&{{end}}"
|
||||
search: "{{ .Keywords }}"
|
||||
cat: 0
|
||||
# 0 active 1 incldead 2 onlydead 3 gold 4 noseed 5 silver 7 BFG
|
||||
@@ -202,3 +190,4 @@
|
||||
"*": 1
|
||||
uploadvolumefactor:
|
||||
text: 1
|
||||
# engine n/a
|
||||
|
@@ -55,7 +55,8 @@
|
||||
|
||||
download:
|
||||
selector: a[href^="download.php?id="]
|
||||
|
||||
attribute: href
|
||||
|
||||
search:
|
||||
paths:
|
||||
- path: browse.php
|
||||
|
@@ -54,6 +54,10 @@
|
||||
type: checkbox
|
||||
label: Show donor torrent? (Enable if you're a donor)
|
||||
default: false
|
||||
- name: info
|
||||
type: info
|
||||
label: Results Per Page
|
||||
default: For best results, change the <b>Torrents per page:</b> setting to <b>100</b> on your account profile.
|
||||
|
||||
login:
|
||||
path: index.php?page=login
|
||||
@@ -72,12 +76,14 @@
|
||||
- path: index.php
|
||||
inputs:
|
||||
search: "{{ .Keywords }}"
|
||||
page: "torrents"
|
||||
category: "{{range .Categories}}{{.}};{{end}}"
|
||||
options: "0"
|
||||
active: "0"
|
||||
page: torrents
|
||||
category: "{{ range .Categories }}{{.}};{{end}}"
|
||||
options: 0
|
||||
active: 0
|
||||
|
||||
rows:
|
||||
selector: table > tbody > tr > td > table.lista > tbody > tr:has(a[href^="index.php?page=torrent-details&id="]){{if .Config.donor }}{{else}}:not(:has(img[src*="keditbookmarks.png"])){{end}}
|
||||
|
||||
fields:
|
||||
download:
|
||||
selector: a[href^="index.php?page=torrent-details&id="]
|
||||
@@ -125,19 +131,20 @@
|
||||
selector: td:nth-last-child(6)
|
||||
downloadvolumefactor:
|
||||
case:
|
||||
img[alt="Gold 100% Free"]: "0"
|
||||
img[alt="Silver 50% Free"]: "0.5"
|
||||
img[alt="Bronze 25% Free"]: "0.75"
|
||||
"*": "1"
|
||||
img[alt="Gold 100% Free"]: 0
|
||||
img[alt="Silver 50% Free"]: 0.5
|
||||
img[alt="Bronze 25% Free"]: 0.75
|
||||
"*": 1
|
||||
uploadvolumefactor:
|
||||
case:
|
||||
img[alt="2x Upload Multiplier"]: "2"
|
||||
img[alt="3x Upload Multiplier"]: "3"
|
||||
img[alt="4x Upload Multiplier"]: "4"
|
||||
img[alt="5x Upload Multiplier"]: "5"
|
||||
img[alt="6x Upload Multiplier"]: "6"
|
||||
img[alt="7x Upload Multiplier"]: "7"
|
||||
img[alt="8x Upload Multiplier"]: "8"
|
||||
img[alt="9x Upload Multiplier"]: "9"
|
||||
img[alt="10x Upload Multiplier"]: "10"
|
||||
"*": "1"
|
||||
img[alt="2x Upload Multiplier"]: 2
|
||||
img[alt="3x Upload Multiplier"]: 3
|
||||
img[alt="4x Upload Multiplier"]: 4
|
||||
img[alt="5x Upload Multiplier"]: 5
|
||||
img[alt="6x Upload Multiplier"]: 6
|
||||
img[alt="7x Upload Multiplier"]: 7
|
||||
img[alt="8x Upload Multiplier"]: 8
|
||||
img[alt="9x Upload Multiplier"]: 9
|
||||
img[alt="10x Upload Multiplier"]: 10
|
||||
"*": 1
|
||||
# xbtitFM v3.0.00
|
||||
|
@@ -20,7 +20,7 @@
|
||||
- {id: 1080, cat: Movies/DVD, desc: "Movies DVD"}
|
||||
- {id: 1090, cat: Movies/BluRay, desc: "Movies BluRay"}
|
||||
- {id: 1100, cat: Movies/DVD, desc: "Movies HD2DVD"}
|
||||
- {id: 1110, cat: Movies/Foreign, desc: "Movies nternational"}
|
||||
- {id: 1110, cat: Movies/Foreign, desc: "Movies International"}
|
||||
- {id: 1120, cat: Movies/HD, desc: "Movies HD Packs"}
|
||||
- {id: 1130, cat: Movies/SD, desc: "Movies SD Packs"}
|
||||
- {id: 2010, cat: TV/UHD, desc: "TV 2160p"}
|
||||
@@ -55,6 +55,7 @@
|
||||
- {id: 5060, cat: XXX, desc: "XXX XviD"}
|
||||
- {id: 5070, cat: XXX, desc: "XXX HD Packs"}
|
||||
- {id: 5080, cat: XXX, desc: "XXX SD Packs"}
|
||||
- {id: 5090, cat: XXX, desc: "XXX Sonstiges"}
|
||||
- {id: 6010, cat: PC/Games, desc: "Games Windows"}
|
||||
- {id: 6020, cat: Console, desc: "Games Linux"}
|
||||
- {id: 6030, cat: PC/Mac, desc: "Games MacOS"}
|
||||
@@ -101,19 +102,19 @@
|
||||
- name: sort
|
||||
type: select
|
||||
label: Sort requested from site
|
||||
default: "added"
|
||||
default: "1"
|
||||
options:
|
||||
"added": "created"
|
||||
"seeds": "seeders"
|
||||
"size": "size"
|
||||
"name": "title"
|
||||
"1": "created"
|
||||
"8": "seeders"
|
||||
"6": "size"
|
||||
"2": "title"
|
||||
- name: type
|
||||
type: select
|
||||
label: Order requested from site
|
||||
default: "desc"
|
||||
default: "1"
|
||||
options:
|
||||
"desc": "desc"
|
||||
"asc": "asc"
|
||||
"1": "desc"
|
||||
"2": "asc"
|
||||
|
||||
login:
|
||||
path: login.php
|
||||
@@ -146,44 +147,46 @@
|
||||
paths:
|
||||
- path: browse.php
|
||||
inputs:
|
||||
$raw: "{{range .Categories}}c{{.}}=1&{{end}}"
|
||||
search: "{{ .Keywords }}"
|
||||
# seachin 0=name 1=descr 2=both
|
||||
blah: 0
|
||||
# include dead 0=active 1=all 2=dead
|
||||
incldead: 1
|
||||
orderby: "{{ .Config.sort }}"
|
||||
sort: "{{ .Config.type }}"
|
||||
showsearch: 0
|
||||
suchfeld: 2
|
||||
alleanzeigen: 1
|
||||
$raw: "{{ range .Categories }}kategorie[]={{.}}&{{end}}"
|
||||
suche: "{{ .Keywords }}"
|
||||
# searchin 1 name 2 descr 3 both
|
||||
durchsuche: 1
|
||||
# includedead 1 active 2 all 3 dead 4 highlight 5 bookmark 6 onlyups 7 freeleech 8 multi2 9 multi5 10 multi10 11 25%dl 12 50%dl 13 75%dl
|
||||
suchein: 2
|
||||
# cat 1 all 1000 film 2000 tv 3000 docs 4000 sport 5000 xxx 6000 games 7000 apps 8000 music 9000 other
|
||||
sucheaus: 1
|
||||
sortierenach: "{{ .Config.sort }}"
|
||||
sortierung: "{{ .Config.type }}"
|
||||
|
||||
rows:
|
||||
selector: table.tableinborder[border="0"][cellspacing="0"][cellpadding="0"] tr
|
||||
|
||||
fields:
|
||||
category:
|
||||
selector: td.tableb a
|
||||
selector: a.bt-cat
|
||||
attribute: href
|
||||
filters:
|
||||
- name: querystring
|
||||
args: cat
|
||||
- name: regexp
|
||||
args: (\d+)$
|
||||
title:
|
||||
selector: div a.tor-name
|
||||
selector: a.tor-name
|
||||
details:
|
||||
selector: div a.tor-name
|
||||
selector: a.tor-name
|
||||
attribute: href
|
||||
download:
|
||||
selector: div a.tor-name
|
||||
selector: div.tor-metadl a
|
||||
attribute: href
|
||||
filters:
|
||||
- name: replace
|
||||
args: ["details.php?id=", "download.php?torrent="]
|
||||
banner:
|
||||
selector: div[id^="details-"] img
|
||||
attribute: src
|
||||
seeders:
|
||||
selector: div.tor-sl b
|
||||
selector: div.tor-seeder
|
||||
leechers:
|
||||
selector: div.tor-sl b:last-of-type
|
||||
selector: div.tor-leecher
|
||||
grabs:
|
||||
selector: div.tor-snatcher
|
||||
# 2 flavours of dates
|
||||
date:
|
||||
# Heute 13:30:04
|
||||
@@ -196,12 +199,12 @@
|
||||
- name: replace
|
||||
args: ["Gestern", "Yesterday"]
|
||||
date:
|
||||
# 30.02.2018 23:12:50
|
||||
# 27.05.2019 <b>12:52:11</b>
|
||||
selector: div.tor-date:contains(".")
|
||||
optional: true
|
||||
filters:
|
||||
- name: replace
|
||||
args: ["\u00a0", " "]
|
||||
args: ["\u00a0", ""]
|
||||
- name: dateparse
|
||||
args: "02.01.2006 15:04:05"
|
||||
size:
|
||||
@@ -211,21 +214,16 @@
|
||||
args: [".", ""]
|
||||
- name: replace
|
||||
args: [",", "."]
|
||||
grabs:
|
||||
selector: div.tor-take
|
||||
filters:
|
||||
- name: regexp
|
||||
args: (\d+)
|
||||
downloadvolumefactor:
|
||||
case:
|
||||
img[src="pic/new_details/25k.png"]: 0.25
|
||||
img[src="pic/new_details/50k.png"]: 0.5
|
||||
img[src="pic/new_details/75k.png"]: 0.75
|
||||
img[src="pic/ou_new.png"]: 0
|
||||
font.ou: 0 # only upload is counted
|
||||
font.fl: 0 # freeleech neither dl or ul is counted
|
||||
"*": 1
|
||||
uploadvolumefactor:
|
||||
case:
|
||||
img[src="pic/sc-dark/multi2.jpg"]: 2
|
||||
img[src="pic/sc-dark/multi5.jpg"]: 5
|
||||
img[src="pic/sc-dark/multi10.jpg"]: 10
|
||||
"font.mu:contains(\"2x\")": 2
|
||||
"font.mu:contains(\"5x\")": 5
|
||||
"font.mu:contains(\"10x\")": 10
|
||||
font.fl: 0 # freeleech neither dl or ul is counted
|
||||
"*": 1
|
||||
# engine n/a
|
||||
|
@@ -133,10 +133,11 @@
|
||||
selector: "a[style=\"font-size: 8pt;cursor: pointer;\"][title]"
|
||||
downloadvolumefactor:
|
||||
case:
|
||||
img[title="Ingyenes letöltés"]: "0"
|
||||
"*": "1"
|
||||
img[title="Ingyenes letöltés"]: 0
|
||||
"*": 1
|
||||
uploadvolumefactor:
|
||||
selector: span:contains("Feltöltési szorzó")
|
||||
filters:
|
||||
- name: replace
|
||||
args: ["Feltöltési szorzó × ", ""]
|
||||
# engine n/a
|
||||
|
@@ -51,6 +51,7 @@
|
||||
|
||||
rows:
|
||||
selector: table.browse-list > tbody > tr
|
||||
|
||||
fields:
|
||||
category:
|
||||
selector: td:nth-child(1) a
|
||||
@@ -154,3 +155,4 @@
|
||||
text: 0
|
||||
uploadvolumefactor:
|
||||
text: 1
|
||||
# engine n/a
|
||||
|
@@ -6,6 +6,8 @@
|
||||
type: private
|
||||
encoding: windows-1252
|
||||
links:
|
||||
- https://bitspyder.net/
|
||||
legacylinks:
|
||||
- http://bitspyder.net/
|
||||
|
||||
caps:
|
||||
@@ -47,9 +49,34 @@
|
||||
modes:
|
||||
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:
|
||||
path: processf.php
|
||||
method: post
|
||||
path: login.php
|
||||
method: form
|
||||
form: form
|
||||
inputs:
|
||||
username: "{{ .Config.username }}"
|
||||
password: "{{ .Config.password }}"
|
||||
@@ -61,17 +88,20 @@
|
||||
search:
|
||||
paths:
|
||||
- path: browse.php
|
||||
method: post
|
||||
inputs:
|
||||
search: "{{ .Keywords }}"
|
||||
# 0 active 1 incldead 2 onlydead
|
||||
incldead: 1
|
||||
# 0 title 1 default
|
||||
scope: 1
|
||||
sort: "{{ .Config.sort }}"
|
||||
type: "{{ .Config.type }}"
|
||||
|
||||
rows:
|
||||
selector: table > tbody > tr[class]
|
||||
filters:
|
||||
- name: andmatch
|
||||
|
||||
fields:
|
||||
# there are two styles, we support both
|
||||
title:
|
||||
@@ -101,7 +131,7 @@
|
||||
selector: td.rowcol:nth-child(7):has(br), td.clear:nth-child(4)
|
||||
filters:
|
||||
- name: regexp
|
||||
args: ([\d,]+)
|
||||
args: (\d+)
|
||||
seeders:
|
||||
selector: td.rowcol:nth-last-child(3)
|
||||
leechers:
|
||||
@@ -138,3 +168,4 @@
|
||||
description:
|
||||
optional: true
|
||||
selector: font[color="#990000"]
|
||||
# custom v4
|
||||
|
@@ -41,10 +41,11 @@
|
||||
|
||||
download:
|
||||
selector: a[ href^="magnet:?xt="]
|
||||
attribute: href
|
||||
|
||||
search:
|
||||
paths:
|
||||
- path: "{{if .Keywords}}search.php?kwds={{ .Keywords}}&ord={{ .Config.sort }}&cat=100{{else}}/{{end}}"
|
||||
- path: "{{ if .Keywords }}search.php?kwds={{ .Keywords }}&ord={{ .Config.sort }}&cat=100{{else}}/{{end}}"
|
||||
rows:
|
||||
selector: table.torrentsTable:has(tr.r) tbody tr.r
|
||||
fields:
|
||||
@@ -79,3 +80,4 @@
|
||||
text: 0
|
||||
uploadvolumefactor:
|
||||
text: 1
|
||||
# engine n/a
|
||||
|
@@ -91,7 +91,7 @@
|
||||
form: form#loginbox_form
|
||||
submitpath: ajax/login.php
|
||||
inputs:
|
||||
action: "login"
|
||||
action: login
|
||||
loginbox_membername: "{{ .Config.username }}"
|
||||
loginbox_password: "{{ .Config.password }}"
|
||||
loginbox_remember: 1
|
||||
@@ -124,8 +124,10 @@
|
||||
"sortOptions[sortOrder]": "{{ .Config.type }}"
|
||||
error:
|
||||
- selector: div.error:not(:contains("Gösterilecek sonuç bulunamadı."))
|
||||
|
||||
rows:
|
||||
selector: table#torrents_table_classic tr:has(td.torrent_name)
|
||||
|
||||
fields:
|
||||
title:
|
||||
selector: a[href*="?p=torrents&pid=10&action=details"]
|
||||
@@ -181,3 +183,4 @@
|
||||
case:
|
||||
"img[src$=\"/torrent_multiple_upload.png\"]": 2
|
||||
"*": 1
|
||||
# TSUE 2.2
|
||||
|
@@ -20,12 +20,13 @@
|
||||
movie-search: [q, imdbid]
|
||||
|
||||
settings:
|
||||
- name: username
|
||||
- name: cookie
|
||||
type: text
|
||||
label: Username
|
||||
- name: password
|
||||
type: password
|
||||
label: Password
|
||||
label: Cookie
|
||||
- name: info
|
||||
type: info
|
||||
label: How to get the Cookie
|
||||
default: "<ol><li>Login to this tracker with 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>"
|
||||
- name: sort
|
||||
type: select
|
||||
label: Sort requested from site
|
||||
@@ -44,16 +45,9 @@
|
||||
"asc": "asc"
|
||||
|
||||
login:
|
||||
path: login
|
||||
method: form
|
||||
method: cookie
|
||||
inputs:
|
||||
username: "{{ .Config.username }}"
|
||||
password: "{{ .Config.password }}"
|
||||
remember: on
|
||||
error:
|
||||
- selector: script[nonce]:contains("Error")
|
||||
message:
|
||||
selector: script[nonce]:contains("Error")
|
||||
cookie: "{{ .Config.cookie }}"
|
||||
test:
|
||||
path: /
|
||||
selector: a[href$="/logout"]
|
||||
@@ -131,29 +125,35 @@
|
||||
filters:
|
||||
# translations for Turkish|Estonian|Danish|Italian|Polish|Norwegian|Portuguese|Czech|Russian|Romanian|Spanish|French|German|Bulgarian|Dutch|Chinese
|
||||
- name: re_replace
|
||||
args: ["(?i)(önce|tagasi|geleden|fa|temu|siden|atrás|nazpět|назад|acum|hace|il y a|vor|преди|前)", " ago"]
|
||||
- name: re_replace
|
||||
args: ["(?i)(dakika|minut|minuto|minuta|minutt|минута|Minute|minuut|分钟)", " minute"]
|
||||
args: ["(?i)(önce|tagasi|geleden|fa|temu|siden|atrás|nazpět|назад|acum|în urmă|hace|il y a|vor|преди|前)", " ago"]
|
||||
- name: re_replace
|
||||
args: ["(?i)(minutit|minutter|minuti|minuty|minutos|минуты|минут|Minuten|минути|minuten)", "minutes"]
|
||||
- name: re_replace
|
||||
args: ["(?i)(saat|tund|time|ora|godzina|hora|hodina|час|oră|heure|Stunde|uur|小时)", " hour"]
|
||||
args: ["(?i)(dakika|minut|minuto|minuta|minutt|минута|Minute|minuut|分钟)", " minute"]
|
||||
- name: re_replace
|
||||
args: ["(?i)(tundi|timer|ore|godziny|horas|hodiny|hoden|часа|часов|ore|heures|Stunden)", "hours"]
|
||||
- name: re_replace
|
||||
args: ["(?i)(gün|päev|dag|giorno|dzień|dia|den|день|zi|día|jour|Tag|ден|天)", " day"]
|
||||
args: ["(?i)(saat|tund|time|ora|godzina|hora|hodina|час|oră|heure|Stunde|uur|小时)", " hour"]
|
||||
- name: re_replace
|
||||
args: ["(?i)(päeva|dage|giorni|dni|dias|dny|дня|дней|zile|días|jours|Tagen|дни|dagen)", "days"]
|
||||
- name: re_replace
|
||||
args: ["(?i)(hafta|nädal|uge|settimana|tydzień|uke|semana|týden|неделю|săptămână|semaine|Woche|седмица|周)", " week"]
|
||||
args: ["(?i)(gün|päev|dag|giorno|dzień|dia|den|день|zi|día|jour|Tag|ден|天)", " day"]
|
||||
- name: re_replace
|
||||
args: ["(?i)(nädalat|uger|settimane|tygodnie|uker|semanas|týdny|недели|недель|săptămâni|semaines|Wochen|седмици|weken)", "weeks"]
|
||||
- name: re_replace
|
||||
args: ["(?i)(hafta|nädal|uge|settimana|tydzień|uke|semana|týden|неделю|săptămână|semaine|Woche|седмица|周)", " week"]
|
||||
- name: re_replace
|
||||
args: ["(?i) (ay)", "month"]
|
||||
- name: re_replace
|
||||
args: ["(?i)(kuu|måned|mese|miesiąc|mês|měsíc|месяц|lună|mes|mois|Monat|месец|maand|个月)", " month"]
|
||||
- name: re_replace
|
||||
args: ["(?i)(kuud|måneder|mesi|miesiące|meses|měsíce|месяца|месяцев|luni|meses|mois|Monaten|месеца|maanden)", "months"]
|
||||
- name: re_replace
|
||||
args: ["(?i)(kuu|måned|mese|miesiąc|mês|měsíc|месяц|lună|mes|Monat|месец|maand|个月)", " month"]
|
||||
- name: re_replace
|
||||
args: ["(?i)(aastat|anni|lata|anos|roky|года|ani|años|ans|Jahren|години)", " years"]
|
||||
- name: re_replace
|
||||
args: ["(?i)(yil|aasta|år|anno|rok|ano|год|año|Jahr|година|jaar|年)", " year"]
|
||||
- name: re_replace
|
||||
args: ["(?i) (an)", "year"]
|
||||
downloadvolumefactor:
|
||||
case:
|
||||
i[class*="fa-id-badge text-orange"]: 0 # 24 Hour FreeLeech From BON Store
|
||||
@@ -170,4 +170,4 @@
|
||||
i[class*="fa-globe text-green"]: 2 # Global Double Upload
|
||||
i[class*="fa-certificate text-pink"]: 2 # Featured Torrent
|
||||
"*": 1
|
||||
# UNIT3D 2.2.7
|
||||
# UNIT3D 2.3.0
|
||||
|
@@ -96,3 +96,4 @@
|
||||
text: 1
|
||||
uploadvolumefactor:
|
||||
text: 1
|
||||
# TorrentPier
|
||||
|
118
src/Jackett.Common/Definitions/brasiltracker.yml
Normal file
118
src/Jackett.Common/Definitions/brasiltracker.yml
Normal file
@@ -0,0 +1,118 @@
|
||||
---
|
||||
site: brasiltracker
|
||||
name: BrasilTracker
|
||||
description: "BrasilTracker is a BRAZILIAN Private Torrent Tracker for MOVIES / TV / GENERAL"
|
||||
language: en-us
|
||||
encoding: UTF-8
|
||||
type: private
|
||||
links:
|
||||
- https://brasiltracker.org/
|
||||
|
||||
caps:
|
||||
categorymappings:
|
||||
- {id: 1, cat: Other, desc: "Filmes/Series/Música"}
|
||||
|
||||
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: "time"
|
||||
options:
|
||||
"time": "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: "This indexer does not support <b>Torrent Groups</b><br />Un-tick the <b>Torrent grouping</b><i> (Habilitar Grupo de Torrents)</i> checkbox in your <b>Configurações</b>."
|
||||
- name: info_categories
|
||||
type: info
|
||||
label: "About categories"
|
||||
default: "BrasilTracker does not show <b>Categories</b> in its Search Results.<br />To use this indexer with Sonarr/Radarr set your indexer category to <b>7000</b>."
|
||||
|
||||
login:
|
||||
path: login.php
|
||||
method: form
|
||||
form: form#loginform
|
||||
inputs:
|
||||
username: "{{ .Config.username }}"
|
||||
password: "{{ .Config.password }}"
|
||||
keeplogged: 1
|
||||
error:
|
||||
- selector: form#loginform:contains("incorretos")
|
||||
test:
|
||||
path: index.php
|
||||
selector: a[href^="logout.php?auth="]
|
||||
|
||||
search:
|
||||
paths:
|
||||
- path: torrents.php
|
||||
inputs:
|
||||
# torrents.php?searchstr=mandalorain&order_by=size&order_way=desc&action=basic&searchsubmit=1
|
||||
searchstr: "{{ .Keywords }}"
|
||||
order_by: "{{ .Config.sort }}"
|
||||
order_way: "{{ .Config.type }}"
|
||||
action: basic
|
||||
searchsubmit: 1
|
||||
|
||||
rows:
|
||||
selector: table#torrent_table > tbody > tr.torrent
|
||||
|
||||
fields:
|
||||
category:
|
||||
text: 1
|
||||
title:
|
||||
selector: a[href^="torrents.php?id="]
|
||||
details:
|
||||
selector: a[href^="torrents.php?id="]
|
||||
attribute: href
|
||||
download:
|
||||
selector: a[href^="torrents.php?action=download&id="]
|
||||
attribute: href
|
||||
description:
|
||||
selector: div.tags
|
||||
banner:
|
||||
selector: img[alt="Cover"]
|
||||
attribute: src
|
||||
files:
|
||||
selector: td:nth-child(3)
|
||||
date:
|
||||
selector: span.time
|
||||
attribute: title
|
||||
filters:
|
||||
- name: dateparse
|
||||
args: "Jan 2 2006, 15:04"
|
||||
size:
|
||||
selector: td:nth-child(5)
|
||||
grabs:
|
||||
selector: td:nth-child(6)
|
||||
seeders:
|
||||
selector: td:nth-child(7)
|
||||
leechers:
|
||||
selector: td:nth-child(8)
|
||||
downloadvolumefactor:
|
||||
case:
|
||||
strong.tl_free: 0
|
||||
"*": 1
|
||||
uploadvolumefactor:
|
||||
case:
|
||||
"*": 1
|
||||
# engine n/a
|
145
src/Jackett.Common/Definitions/broadcity.yml
Normal file
145
src/Jackett.Common/Definitions/broadcity.yml
Normal file
@@ -0,0 +1,145 @@
|
||||
---
|
||||
site: broadcity
|
||||
name: BroadCity
|
||||
description: "BroadCity is a TURKISH Private Torrent Tracker for MOVIES and TV"
|
||||
language: tr
|
||||
type: private
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- http://broadcity.in/
|
||||
|
||||
caps:
|
||||
categorymappings:
|
||||
- {id: 1, cat: Movies/UHD, desc: "UHD"}
|
||||
- {id: 2, cat: Movies/HD, desc: "BluRay"}
|
||||
- {id: 8, cat: Movies/HD, desc: "TV"}
|
||||
- {id: 6, cat: Movies/HD, desc: "WEB-DL"}
|
||||
- {id: 16, cat: Movies/HD, desc: "WEBRip"}
|
||||
- {id: 3, cat: Movies/HD, desc: "Movies HD"}
|
||||
- {id: 25, cat: Movies/3D, desc: "Movies 3D"}
|
||||
- {id: 4, cat: Movies/HD, desc: "BluRay"}
|
||||
- {id: 7, cat: Movies/HD, desc: "TV"}
|
||||
- {id: 5, cat: Movies/HD, desc: "WEB-DL"}
|
||||
- {id: 14, cat: Movies/HD, desc: "WEBRip"}
|
||||
- {id: 27, cat: Movies/HD, desc: "LORD Rips"}
|
||||
- {id: 9, cat: Movies/SD, desc: "SD"}
|
||||
- {id: 23, cat: Movies/SD, desc: "BluRay"}
|
||||
- {id: 10, cat: Movies/SD, desc: "DVD"}
|
||||
- {id: 12, cat: Movies/SD, desc: "TV"}
|
||||
- {id: 13, cat: Movies/SD, desc: "WEB-DL"}
|
||||
- {id: 15, cat: Movies/SD, desc: "WEBRip"}
|
||||
- {id: 17, cat: TV, desc: "TV"}
|
||||
- {id: 26, cat: TV/Other, desc: "TV Program"}
|
||||
- {id: 19, cat: TV, desc: "Yabanci Dizi"}
|
||||
- {id: 18, cat: TV, desc: "Yerli Dizi"}
|
||||
- {id: 20, cat: Movies/HD, desc: "VIP"}
|
||||
|
||||
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: info
|
||||
type: info
|
||||
label: Captcha Text Note
|
||||
default: The <i>Captcha Text</i> code is <b>case sensitive</b>.
|
||||
|
||||
login:
|
||||
path: login.php
|
||||
method: form
|
||||
form: form[action$="takelogin.php"]
|
||||
inputs:
|
||||
username: "{{ .Config.username }}"
|
||||
password: "{{ .Config.password }}"
|
||||
captcha:
|
||||
type: image
|
||||
selector: img#regimage
|
||||
input: imagestring
|
||||
error:
|
||||
- selector: table:contains("Bir Hata oluştu!")
|
||||
- selector: table:contains("Bir Hata Oluştu!")
|
||||
- selector: table:contains("Login Giriş Kilitlendi!")
|
||||
test:
|
||||
path: index.php
|
||||
selector: a[href*="/logout.php?logouthash="]
|
||||
|
||||
ratio:
|
||||
path: index.php
|
||||
selector: div#top div:nth-child(2) span:nth-child(2)
|
||||
filters:
|
||||
- name: regexp
|
||||
args: "Ratio: (.+?) Bonus:"
|
||||
|
||||
search:
|
||||
paths:
|
||||
- path: browse.php
|
||||
keywordsfilters:
|
||||
- name: re_replace # E01 to BL01
|
||||
args: ["(?i)\\bE(\\d+)\\b", "E$1"]
|
||||
inputs:
|
||||
# does not support multi categories so defaulting to ALL
|
||||
do: search
|
||||
keywords: "{{ .Keywords }}"
|
||||
category: 0
|
||||
search_type: t_name
|
||||
include_dead_torrents: yes
|
||||
|
||||
rows:
|
||||
selector: table#sortabletable tbody tr:has(div[id^="port-target-"])
|
||||
|
||||
fields:
|
||||
title:
|
||||
selector: div[id^="port-target-"] a
|
||||
filters:
|
||||
- name: re_replace # BL01 to E01
|
||||
args: ["(?i)\\bBL(\\d+)\\b", " E$1 "]
|
||||
details:
|
||||
selector: div[id^="port-target-"] a
|
||||
attribute: href
|
||||
category:
|
||||
selector: a[href*="browse.php?category="]
|
||||
attribute: href
|
||||
filters:
|
||||
- name: querystring
|
||||
args: category
|
||||
banner:
|
||||
selector: div[id^="port-content-"] img
|
||||
attribute: src
|
||||
date:
|
||||
selector: td:nth-child(2)
|
||||
filters:
|
||||
- name: regexp
|
||||
args: (\d{2}-\d{2}-\d{4} \d{2}:\d{2})
|
||||
filters:
|
||||
- name: dateparse
|
||||
args: "02-01-2006 15:04"
|
||||
download:
|
||||
selector: a[href*="download.php?id="]
|
||||
attribute: href
|
||||
comments:
|
||||
selector: td:nth-child(4) a
|
||||
attribute: href
|
||||
size:
|
||||
selector: td:nth-child(5)
|
||||
grabs:
|
||||
selector: td:nth-child(6)
|
||||
seeders:
|
||||
selector: td:nth-child(7)
|
||||
leechers:
|
||||
selector: td:nth-child(8)
|
||||
downloadvolumefactor:
|
||||
case:
|
||||
img[src$="/freedownload.gif"]: 0
|
||||
img[src$="/silverdownload.gif"]: 0.5
|
||||
"*": 1
|
||||
uploadvolumefactor:
|
||||
case:
|
||||
img[src$="/x2.gif"]: 2
|
||||
"*": 1
|
141
src/Jackett.Common/Definitions/brobits.yml
Normal file
141
src/Jackett.Common/Definitions/brobits.yml
Normal file
@@ -0,0 +1,141 @@
|
||||
---
|
||||
site: brobits
|
||||
name: BRObits
|
||||
description: "BRObits is a CHINESE Private Torrent Tracker for HD MOVIES / TV"
|
||||
language: zh-cn
|
||||
type: private
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- https://brobits.cc/
|
||||
|
||||
caps:
|
||||
categorymappings:
|
||||
- {id: 401, cat: Movies, desc: "Movies/电影"}
|
||||
- {id: 404, cat: TV/Documentary, desc: "Documentaries/纪录片"}
|
||||
- {id: 410, cat: TV, desc: "TV Series/剧集"}
|
||||
|
||||
modes:
|
||||
search: [q]
|
||||
tv-search: [q, season, ep, 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>"
|
||||
- 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:
|
||||
method: cookie
|
||||
inputs:
|
||||
cookie: "{{ .Config.cookie }}"
|
||||
test:
|
||||
path: index.php
|
||||
|
||||
search:
|
||||
paths:
|
||||
- path: torrents.php
|
||||
inputs:
|
||||
$raw: "{{ range .Categories }}cat{{.}}=1&{{end}}"
|
||||
search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{else}}{{ .Keywords }}{{end}}"
|
||||
# 0 incldead 1 active 2 dead
|
||||
incldead: 0
|
||||
# 0 all 1 normal 2 free 3 2x 4 2xfree 5 50% 6 2x50% 7 30%
|
||||
spstate: 0
|
||||
# 0 title 1 descr 3 uploader 4 imdburl
|
||||
search_area: "{{ if .Query.IMDBID }}4{{else}}0{{end}}"
|
||||
# 0 AND 1 OR 2 exact
|
||||
search_mode: 0
|
||||
sort: "{{ .Config.sort }}"
|
||||
type: "{{ .Config.type }}"
|
||||
|
||||
rows:
|
||||
selector: table.torrents > tbody > tr:has(table.torrentname)
|
||||
|
||||
fields:
|
||||
title:
|
||||
selector: a[href^="details.php?id="]
|
||||
title:
|
||||
optional: true
|
||||
selector: a[title][href^="details.php?id="]
|
||||
attribute: title
|
||||
category:
|
||||
selector: a[href^="?cat="]
|
||||
attribute: href
|
||||
filters:
|
||||
- name: querystring
|
||||
args: cat
|
||||
details:
|
||||
selector: a[href^="details.php?id="]
|
||||
attribute: href
|
||||
download:
|
||||
selector: a[href^="download.php?id="]
|
||||
attribute: href
|
||||
imdb:
|
||||
optional: true
|
||||
selector: div.imdb_100 > a
|
||||
attribute: href
|
||||
date:
|
||||
# time type: time elapsed (default)
|
||||
selector: td:nth-child(4) > span[title]
|
||||
attribute: title
|
||||
optional: true
|
||||
filters:
|
||||
- name: append
|
||||
args: " +08:00"
|
||||
- name: dateparse
|
||||
args: "2006-01-02 15:04:05 -07:00"
|
||||
date:
|
||||
# time added
|
||||
selector: td:nth-child(4):not(:has(span))
|
||||
optional: true
|
||||
filters:
|
||||
- name: append
|
||||
args: " +08:00"
|
||||
- name: dateparse
|
||||
args: "2006-01-0215:04:05 -07:00"
|
||||
size:
|
||||
selector: td:nth-child(5)
|
||||
seeders:
|
||||
selector: td:nth-child(6)
|
||||
leechers:
|
||||
selector: td:nth-child(7)
|
||||
grabs:
|
||||
selector: td:nth-child(8)
|
||||
downloadvolumefactor:
|
||||
case:
|
||||
img.pro_free: 0
|
||||
img.pro_free2up: 0
|
||||
img.pro_50pctdown: 0.5
|
||||
img.pro_50pctdown2up: 0.5
|
||||
img.pro_30pctdown: 0.3
|
||||
"*": 1
|
||||
uploadvolumefactor:
|
||||
case:
|
||||
img.pro_50pctdown2up: 2
|
||||
img.pro_free2up: 2
|
||||
img.pro_2up: 2
|
||||
"*": 1
|
||||
description:
|
||||
selector: td:nth-child(2)
|
||||
remove: a, img
|
||||
# NexusPHP Standard v1.5 Beta 4
|
@@ -33,39 +33,59 @@
|
||||
options:
|
||||
"time": "created"
|
||||
"length": "size"
|
||||
"seeders": "seeders"
|
||||
|
||||
search:
|
||||
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:
|
||||
selector: li[class$="item"]
|
||||
selector: div.media
|
||||
|
||||
fields:
|
||||
title:
|
||||
selector: h2[class$="title"] a[href*="/torrent/"]
|
||||
attribute: title
|
||||
category:
|
||||
text: 1
|
||||
title:
|
||||
selector: a[href^="/torrent/"]
|
||||
details:
|
||||
selector: h2[class$="title"] a[href*="/torrent/"]
|
||||
selector: a[href^="/torrent/"]
|
||||
attribute: href
|
||||
download:
|
||||
selector: a[href$=".torrent"]
|
||||
attribute: href
|
||||
magnet:
|
||||
selector: div[class$="info"] a[href^="magnet:?xt="]
|
||||
selector: a[href^="magnet:?xt="]
|
||||
attribute: href
|
||||
banner:
|
||||
selector: a.img-thumbnail img
|
||||
attribute: src
|
||||
filters:
|
||||
- name: replace
|
||||
args: ["https://btdb.io/assets/img/placeholder.png", ""]
|
||||
size:
|
||||
selector: div[class$="info"] span:nth-of-type(1)
|
||||
selector: small:nth-of-type(1) strong
|
||||
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:
|
||||
selector: div[class$="info"] span:nth-of-type(3)
|
||||
selector: small:nth-of-type(5) strong
|
||||
filters:
|
||||
- name: timeago
|
||||
grabs:
|
||||
selector: div[class$="info"] span:nth-of-type(4)
|
||||
seeders:
|
||||
text: 1
|
||||
leechers:
|
||||
text: 1
|
||||
downloadvolumefactor:
|
||||
text: 0
|
||||
uploadvolumefactor:
|
||||
text: 1
|
||||
# engine n/a
|
||||
|
@@ -74,4 +74,5 @@
|
||||
downloadvolumefactor:
|
||||
text: 0
|
||||
uploadvolumefactor:
|
||||
text: 1
|
||||
text: 1
|
||||
# dhtcrawler2
|
||||
|
@@ -6,6 +6,8 @@
|
||||
type: public
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- https://bt.etree.org/
|
||||
legacylinks:
|
||||
- http://bt.etree.org/
|
||||
|
||||
caps:
|
||||
@@ -76,3 +78,4 @@
|
||||
text: 0
|
||||
uploadvolumefactor:
|
||||
text: 1
|
||||
# engine n/a
|
||||
|
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 100001.
|
||||
|
||||
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
|
@@ -7,6 +7,7 @@
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- http://tracker.btnext.com/
|
||||
# note: the site forces http, https is not supported
|
||||
|
||||
caps:
|
||||
categorymappings:
|
||||
@@ -15,67 +16,76 @@
|
||||
- {id: 89, cat: Console, desc: "Games"}
|
||||
- {id: 87, cat: TV, desc: "Series"}
|
||||
- {id: 93, cat: Audio, desc: "Musica"}
|
||||
- {id: 108, cat: Movies, desc: "ViP"}
|
||||
- {id: 1, cat: Movies, desc: "Movies"}
|
||||
- {id: 70, cat: Movies/3D, desc: "3D"}
|
||||
- {id: 71, cat: Movies/Sd, desc: "480p"}
|
||||
- {id: 72, cat: Movies/BluRay, desc: "BD-R"}
|
||||
- {id: 31, cat: Movies/HD, desc: "BDRIP/BRRip"}
|
||||
- {id: 16, cat: Movies/SD, desc: "CAM"}
|
||||
- {id: 74, cat: Movies/DVD, desc: "DvD-R"}
|
||||
- {id: 17, cat: Movies/HD, desc: "HD"}
|
||||
- {id: 91, cat: Movies/Other, desc: "Kids"}
|
||||
- {id: 76, cat: Movies, desc: "Packs"}
|
||||
- {id: 77, cat: Movies/WEBDL, desc: "WEB-DL"}
|
||||
- {id: 14, cat: Movies/SD, desc: "DVDRip/XViD"}
|
||||
- {id: 85, cat: Movies/DVD, desc: "Custom-DVDR"}
|
||||
- {id: 96, cat: Movies/HD, desc: "4K"}
|
||||
- {id: 6, cat: PC, desc: "Applications"}
|
||||
- {id: 18, cat: PC/ISO, desc: "PC Applications"}
|
||||
- {id: 19, cat: PC/Mac, desc: "Macintosh Applications"}
|
||||
- {id: 34, cat: PC/ISO, desc: "Linux Applications"}
|
||||
- {id: 7, cat: Audio, desc: "Music"}
|
||||
- {id: 20, cat: Audio/Video, desc: "MVideo"}
|
||||
- {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: 70, cat: Movies/3D, desc: "Movies 3D"}
|
||||
- {id: 71, cat: Movies/SD, desc: "Movies 480p"}
|
||||
- {id: 72, cat: Movies/BluRay, desc: "Movies BD-R"}
|
||||
- {id: 31, cat: Movies/HD, desc: "Movies BDRIP/BRRip"}
|
||||
- {id: 16, cat: Movies/SD, desc: "Movies CAM"}
|
||||
- {id: 74, cat: Movies/DVD, desc: "Movies DvD-R"}
|
||||
- {id: 76, cat: Movies, desc: "Movies Packs"}
|
||||
- {id: 91, cat: Movies/Other, desc: "Movies Kids"}
|
||||
- {id: 77, cat: Movies/WEBDL, desc: "Movies WEB-DL"}
|
||||
- {id: 85, cat: Movies/DVD, desc: "Movies Custom-DVDR"}
|
||||
- {id: 14, cat: Movies/SD, desc: "Movies DVDRip/XViD"}
|
||||
- {id: 98, cat: Movies/Other, desc: "Movies Juvenil"}
|
||||
- {id: 104, cat: Movies/UHD, desc: "Movies Bluray-UHD"}
|
||||
- {id: 102, cat: Movies/HD, desc: "Movies HD-720p"}
|
||||
- {id: 101, cat: Movies/HD, desc: "Movies HD-1080p"}
|
||||
- {id: 103, cat: Movies/UHD, desc: "Movies HD-2160p"}
|
||||
- {id: 42, cat: TV, desc: "TV Series"}
|
||||
- {id: 45, cat: TV/Documentary, desc: "Documentaries"}
|
||||
- {id: 46, cat: TV/Sport, desc: "Sports"}
|
||||
- {id: 47, cat: TV/HD, desc: "TV-Bluray"}
|
||||
- {id: 48, cat: TV/SD, desc: "TV-Dvd-R"}
|
||||
- {id: 49, cat: TV/SD, desc: "TV-DVDRiP"}
|
||||
- {id: 50, cat: TV, desc: "TV-Packs"}
|
||||
- {id: 92, cat: TV/Anime, desc: "TV-Kids"}
|
||||
- {id: 52, cat: TV/SD, desc: "TV-SDx264"}
|
||||
- {id: 53, cat: TV/WEB-DL, desc: "TV-WEB-DL"}
|
||||
- {id: 55, cat: TV/HD, desc: "TV-X264"}
|
||||
- {id: 47, cat: TV/HD, desc: "TV Bluray"}
|
||||
- {id: 48, cat: TV/SD, desc: "TV Dvd-R"}
|
||||
- {id: 49, cat: TV/SD, desc: "TV DVDRiP"}
|
||||
- {id: 50, cat: TV, desc: "TV Packs"}
|
||||
- {id: 92, cat: TV, desc: "TV Kids"}
|
||||
- {id: 112, cat: TV, desc: "TV Juvenil"}
|
||||
- {id: 52, cat: TV/SD, desc: "TV SDx264"}
|
||||
- {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: 44, cat: TV, desc: "Miscellaneous"}
|
||||
- {id: 51, cat: TV/Anime, desc: "Anime"}
|
||||
- {id: 54, cat: Audio/Audiobook, desc: "Audiobook"}
|
||||
- {id: 57, cat: Books, desc: "E-Books"}
|
||||
- {id: 58, cat: Books/Comics, desc: "Comics"}
|
||||
- {id: 59, cat: Books, desc: "Educational"}
|
||||
- {id: 60, cat: Books, desc: "Magazines/Journals"}
|
||||
- {id: 7, cat: Audio, desc: "Music"}
|
||||
- {id: 20, cat: Audio/Video, desc: "Music MVideo"}
|
||||
- {id: 21, cat: Audio/MP3, desc: "Music MP3"}
|
||||
- {id: 33, cat: Audio/Other, desc: "Music MP4"}
|
||||
- {id: 32, cat: Audio/Lossless, desc: "Music FLAC"}
|
||||
- {id: 2, cat: Console, desc: "Games"}
|
||||
- {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: 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, desc: "Books E-Books"}
|
||||
- {id: 58, cat: Books/Comics, desc: "Books Comics"}
|
||||
- {id: 59, cat: Books, desc: "Books Educational"}
|
||||
- {id: 60, cat: Books, desc: "Books Magazines/Journals"}
|
||||
- {id: 61, cat: Other, desc: "Pics/Wallpapers"}
|
||||
- {id: 62, cat: PC/Phone-Android, desc: "Android"}
|
||||
- {id: 63, cat: PC/Phone-IOS, desc: "iOS"}
|
||||
- {id: 66, cat: PC/Phone-Other, desc: "WindowsPhone"}
|
||||
- {id: 90, cat: Other, desc: "GPS"}
|
||||
- {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: 64, cat: XXX, desc: "XXX-Magazines"}
|
||||
- {id: 65, cat: XXX, desc: "XXX-Movies"}
|
||||
@@ -85,6 +95,34 @@
|
||||
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: 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"
|
||||
|
||||
login:
|
||||
path: ?p=home&pid=1
|
||||
@@ -92,7 +130,7 @@
|
||||
form: form#loginbox_form
|
||||
submitpath: /ajax/login.php
|
||||
inputs:
|
||||
action: "login"
|
||||
action: login
|
||||
loginbox_membername: "{{ .Config.username }}"
|
||||
loginbox_password: "{{ .Config.password }}"
|
||||
loginbox_remember: 1
|
||||
@@ -115,16 +153,20 @@
|
||||
- name: re_replace
|
||||
args: ["[^a-zA-Z0-9]+", "%25"]
|
||||
inputs:
|
||||
p: "torrents"
|
||||
pid: "32"
|
||||
$raw: "{{range .Categories}}cid[]={{.}}&{{end}}"
|
||||
p: torrents
|
||||
pid: 32
|
||||
$raw: "{{ range .Categories }}cid[]={{.}}&{{end}}"
|
||||
keywords: "{{ .Keywords }}"
|
||||
search_type: "name"
|
||||
searchin: "title"
|
||||
search_type: name
|
||||
searchin: title
|
||||
"sortOptions[sortBy]": "{{ .Config.sort }}"
|
||||
"sortOptions[sortOrder]": "{{ .Config.type }}"
|
||||
error:
|
||||
- selector: div.error:not(:contains("Não existem resultados encontrados."))
|
||||
- selector: div.error:not(:contains("Não existem resultados encontrados.")):not(:contains("There are no results found."))
|
||||
|
||||
rows:
|
||||
selector: table#torrents_table_classic > tbody > tr:has(td.torrent_name)
|
||||
|
||||
fields:
|
||||
title:
|
||||
selector: a[href*="?p=torrents&pid=10&action=details"]
|
||||
@@ -154,11 +196,11 @@
|
||||
attribute: href
|
||||
downloadvolumefactor:
|
||||
case:
|
||||
"img[title=\"FREE!\"]": "0"
|
||||
"*": "1"
|
||||
"img[title=\"FREE!\"]": 0
|
||||
"*": 1
|
||||
uploadvolumefactor:
|
||||
case:
|
||||
"*": "1"
|
||||
"*": 1
|
||||
date:
|
||||
selector: td.torrent_name > abbr.timeago
|
||||
optional: true
|
||||
@@ -194,3 +236,4 @@
|
||||
args: ["Domingo", "Sunday"]
|
||||
- name: dateparse
|
||||
args: "02-01-2006 15:04"
|
||||
# TSUE 2.2
|
||||
|
@@ -27,30 +27,29 @@
|
||||
tv-search: [q, season, ep, 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:
|
||||
path: login.php
|
||||
method: form
|
||||
form: form[action="takelogin.php"]
|
||||
captcha:
|
||||
type: image
|
||||
selector: img[alt="CAPTCHA"]
|
||||
input: imagestring
|
||||
method: cookie
|
||||
inputs:
|
||||
username: "{{ .Config.username }}"
|
||||
password: "{{ .Config.password }}"
|
||||
error:
|
||||
- selector: td.embedded:has(h2:contains("登錄失敗"))
|
||||
- selector: td.embedded:has(h2:contains("失败"))
|
||||
cookie: "{{ .Config.cookie }}"
|
||||
test:
|
||||
path: index.php
|
||||
selector: a[href="logout.php"]
|
||||
|
||||
|
||||
search:
|
||||
paths:
|
||||
- path: torrents.php
|
||||
inputs:
|
||||
$raw: "{{range .Categories}}cat{{.}}=1&{{end}}"
|
||||
search: "{{if .Query.IMDBID}}{{ .Query.IMDBID }}{{else}}{{ .Keywords }}{{end}}"
|
||||
$raw: "{{ range .Categories }}cat{{.}}=1&{{end}}"
|
||||
search: "{{if .Query.IMDBID }}{{ .Query.IMDBID }}{{else}}{{ .Keywords }}{{end}}"
|
||||
# 0 incldead 1 active 2 justdead
|
||||
incldead: 0
|
||||
# promotion: 0 all 1 normal 2 free 3 2x 4 2xfree 5 50% 6 2x 50% 7 30%
|
||||
@@ -63,8 +62,10 @@
|
||||
search_mode: 0
|
||||
sort: 4
|
||||
type: desc
|
||||
|
||||
rows:
|
||||
selector: table.torrents > tbody > tr:has(table.torrentname)
|
||||
|
||||
fields:
|
||||
category:
|
||||
selector: a[href^="?cat="]
|
||||
@@ -99,19 +100,19 @@
|
||||
selector: td.rowfollow:nth-child(8)
|
||||
downloadvolumefactor:
|
||||
case:
|
||||
img.pro_free: "0"
|
||||
img.pro_free2up: "0"
|
||||
img.pro_50pctdown: "0.5"
|
||||
img.pro_50pctdown2up: "0.5"
|
||||
img.pro_30pctdown: "0.3"
|
||||
"*": "1"
|
||||
img.pro_free: 0
|
||||
img.pro_free2up: 0
|
||||
img.pro_50pctdown: 0.5
|
||||
img.pro_50pctdown2up: 0.5
|
||||
img.pro_30pctdown: 0.3
|
||||
"*": 1
|
||||
uploadvolumefactor:
|
||||
case:
|
||||
img.pro_50pctdown2up: "2"
|
||||
img.pro_free2up: "2"
|
||||
img.pro_2up: "2"
|
||||
"*": "1"
|
||||
img.pro_50pctdown2up: 2
|
||||
img.pro_free2up: 2
|
||||
img.pro_2up: 2
|
||||
"*": 1
|
||||
description:
|
||||
selector: td:nth-child(2)
|
||||
remove: a, img
|
||||
# NexusPHP
|
||||
# NexusPHP Standard v1.5 Beta 4
|
||||
|
@@ -6,6 +6,8 @@
|
||||
type: public
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- https://btio.pw/
|
||||
legacylinks:
|
||||
- https://btos.pw/
|
||||
|
||||
caps:
|
||||
@@ -21,9 +23,11 @@
|
||||
|
||||
download:
|
||||
selector: a#magnetOpen
|
||||
attribute: href
|
||||
|
||||
search:
|
||||
paths:
|
||||
- path: "search/{{if .Keywords}}{{ .Keywords}}{{else}}2019{{end}}"
|
||||
- path: "search/{{ if .Keywords }}{{ .Keywords }}{{else}}2019{{end}}"
|
||||
rows:
|
||||
selector: div.row:has(a[href*="/detail/hash/"])
|
||||
fields:
|
||||
@@ -31,6 +35,7 @@
|
||||
text: other
|
||||
title:
|
||||
selector: a[href*="/detail/hash/"]
|
||||
attribute: title
|
||||
details:
|
||||
selector: a[href*="/detail/hash/"]
|
||||
attribute: href
|
||||
@@ -52,3 +57,4 @@
|
||||
text: 0
|
||||
uploadvolumefactor:
|
||||
text: 1
|
||||
# engine n/a
|
||||
|
@@ -146,3 +146,4 @@
|
||||
"*": 1
|
||||
uploadvolumefactor:
|
||||
text: 1
|
||||
# xbtit 2.0.0
|
@@ -120,9 +120,13 @@
|
||||
lang: 0
|
||||
sort: "{{ .Config.sort }}"
|
||||
order: "{{ .Config.type }}"
|
||||
keywordsfilters:
|
||||
- name: re_replace
|
||||
args: ["(\\w+)", " +$1"] # prepend + to each word
|
||||
|
||||
rows:
|
||||
selector: table.ttable_headinner > tbody > tr.t-row
|
||||
|
||||
fields:
|
||||
title:
|
||||
selector: a[href^="torrents-details.php?id="] b
|
||||
@@ -167,4 +171,5 @@
|
||||
"*": 1
|
||||
uploadvolumefactor:
|
||||
case:
|
||||
"*": 1
|
||||
"*": 1
|
||||
# engine n/a
|
||||
|
@@ -2,7 +2,7 @@
|
||||
site: casstudiotv
|
||||
name: CasStudioTV
|
||||
description: "CasStudioTV is a RUSSIAN Semi-Private Torrent Tracker for TV"
|
||||
language: ru
|
||||
language: ru-ru
|
||||
type: semi-private
|
||||
encoding: UTF-8
|
||||
links:
|
||||
@@ -267,9 +267,6 @@
|
||||
path: /
|
||||
selector: :has(a[href^="./ucp.php?mode=logout&sid="])
|
||||
|
||||
# download:
|
||||
# selector: a[href^="./download/file.php?id="]:not(img)
|
||||
|
||||
search:
|
||||
paths:
|
||||
#https://casstudio.tv/search.php?tracker_search=torrent&keywords=star&terms=all&author=&sc=1&sf=titleonly&sr=topics&sk=t&sd=d&st=0&ch=300&t=0&submit=Search
|
||||
@@ -362,3 +359,4 @@
|
||||
text: 1
|
||||
uploadvolumefactor:
|
||||
text: 1
|
||||
# phpBB
|
||||
|
@@ -6,6 +6,8 @@
|
||||
type: private
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- https://channelx.xyz/
|
||||
legacylinks:
|
||||
- https://channelx.online/
|
||||
|
||||
caps:
|
||||
@@ -130,29 +132,35 @@
|
||||
filters:
|
||||
# translations for Turkish|Estonian|Danish|Italian|Polish|Norwegian|Portuguese|Czech|Russian|Romanian|Spanish|French|German|Bulgarian|Dutch|Chinese
|
||||
- name: re_replace
|
||||
args: ["(?i)(önce|tagasi|geleden|fa|temu|siden|atrás|nazpět|назад|acum|hace|il y a|vor|преди|前)", " ago"]
|
||||
- name: re_replace
|
||||
args: ["(?i)(dakika|minut|minuto|minuta|minutt|минута|Minute|minuut|分钟)", " minute"]
|
||||
args: ["(?i)(önce|tagasi|geleden|fa|temu|siden|atrás|nazpět|назад|acum|în urmă|hace|il y a|vor|преди|前)", " ago"]
|
||||
- name: re_replace
|
||||
args: ["(?i)(minutit|minutter|minuti|minuty|minutos|минуты|минут|Minuten|минути|minuten)", "minutes"]
|
||||
- name: re_replace
|
||||
args: ["(?i)(saat|tund|time|ora|godzina|hora|hodina|час|oră|heure|Stunde|uur|小时)", " hour"]
|
||||
args: ["(?i)(dakika|minut|minuto|minuta|minutt|минута|Minute|minuut|分钟)", " minute"]
|
||||
- name: re_replace
|
||||
args: ["(?i)(tundi|timer|ore|godziny|horas|hodiny|hoden|часа|часов|ore|heures|Stunden)", "hours"]
|
||||
- name: re_replace
|
||||
args: ["(?i)(gün|päev|dag|giorno|dzień|dia|den|день|zi|día|jour|Tag|ден|天)", " day"]
|
||||
args: ["(?i)(saat|tund|time|ora|godzina|hora|hodina|час|oră|heure|Stunde|uur|小时)", " hour"]
|
||||
- name: re_replace
|
||||
args: ["(?i)(päeva|dage|giorni|dni|dias|dny|дня|дней|zile|días|jours|Tagen|дни|dagen)", "days"]
|
||||
- name: re_replace
|
||||
args: ["(?i)(hafta|nädal|uge|settimana|tydzień|uke|semana|týden|неделю|săptămână|semaine|Woche|седмица|周)", " week"]
|
||||
args: ["(?i)(gün|päev|dag|giorno|dzień|dia|den|день|zi|día|jour|Tag|ден|天)", " day"]
|
||||
- name: re_replace
|
||||
args: ["(?i)(nädalat|uger|settimane|tygodnie|uker|semanas|týdny|недели|недель|săptămâni|semaines|Wochen|седмици|weken)", "weeks"]
|
||||
- name: re_replace
|
||||
args: ["(?i)(hafta|nädal|uge|settimana|tydzień|uke|semana|týden|неделю|săptămână|semaine|Woche|седмица|周)", " week"]
|
||||
- name: re_replace
|
||||
args: ["(?i) (ay)", "month"]
|
||||
- name: re_replace
|
||||
args: ["(?i)(kuu|måned|mese|miesiąc|mês|měsíc|месяц|lună|mes|mois|Monat|месец|maand|个月)", " month"]
|
||||
- name: re_replace
|
||||
args: ["(?i)(kuud|måneder|mesi|miesiące|meses|měsíce|месяца|месяцев|luni|meses|mois|Monaten|месеца|maanden)", "months"]
|
||||
- name: re_replace
|
||||
args: ["(?i)(kuu|måned|mese|miesiąc|mês|měsíc|месяц|lună|mes|Monat|месец|maand|个月)", " month"]
|
||||
- name: re_replace
|
||||
args: ["(?i)(aastat|anni|lata|anos|roky|года|ani|años|ans|Jahren|години)", " years"]
|
||||
- name: re_replace
|
||||
args: ["(?i)(yil|aasta|år|anno|rok|ano|год|año|Jahr|година|jaar|年)", " year"]
|
||||
- name: re_replace
|
||||
args: ["(?i) (an)", "year"]
|
||||
downloadvolumefactor:
|
||||
case:
|
||||
i[class*="fa-id-badge text-orange"]: 0 # 24 Hour FreeLeech From BON Store
|
||||
|
63
src/Jackett.Common/Definitions/cili180.yml
Normal file
63
src/Jackett.Common/Definitions/cili180.yml
Normal file
@@ -0,0 +1,63 @@
|
||||
---
|
||||
site: cili180
|
||||
name: Cili180
|
||||
description: "Cili180 is a Public BitTorrent DHT search engine."
|
||||
language: en-us
|
||||
type: public
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- http://www.cilijj.xyz/
|
||||
legacylinks:
|
||||
- http://www.cili180.com/
|
||||
|
||||
caps:
|
||||
categories:
|
||||
1: Other
|
||||
|
||||
modes:
|
||||
search: [q]
|
||||
tv-search: [q, season, ep]
|
||||
movie-search: [q]
|
||||
|
||||
settings: []
|
||||
|
||||
search:
|
||||
paths:
|
||||
- path: search/
|
||||
method: post
|
||||
followredirect: true
|
||||
inputs:
|
||||
keyword: "{{ if .Keywords }}{{ .Keywords }}{{else}}2019{{end}}"
|
||||
|
||||
rows:
|
||||
selector: div.list-area > dl.item
|
||||
filters:
|
||||
- name: andmatch
|
||||
|
||||
fields:
|
||||
category:
|
||||
text: 1
|
||||
title:
|
||||
selector: dt a
|
||||
details:
|
||||
selector: dt a
|
||||
attribute: href
|
||||
download:
|
||||
selector: a[href^="magnet:?xt="]
|
||||
attribute: href
|
||||
date:
|
||||
selector: dd.attr span:nth-child(1) b
|
||||
filters:
|
||||
- name: dateparse
|
||||
args: "2006-01-02"
|
||||
size:
|
||||
selector: dd.attr span:nth-child(2) b
|
||||
seeders:
|
||||
text: 1
|
||||
leechers:
|
||||
text: 1
|
||||
downloadvolumefactor:
|
||||
text: 0
|
||||
uploadvolumefactor:
|
||||
text: 1
|
||||
# engine n/a
|
138
src/Jackett.Common/Definitions/cinemamovies.yml
Normal file
138
src/Jackett.Common/Definitions/cinemamovies.yml
Normal file
@@ -0,0 +1,138 @@
|
||||
---
|
||||
site: cinemamovies
|
||||
name: CinemaMovies
|
||||
description: "CinemaMovies is a POLISH Private Torrent Tracker for MOVIES / TV / GENERAL"
|
||||
language: pl-pl
|
||||
type: private
|
||||
encoding: ISO-8859-2
|
||||
links:
|
||||
- https://cinemamovies.pl/
|
||||
|
||||
caps:
|
||||
categorymappings:
|
||||
- {id: 3, cat: Movies/BluRay, desc: "Filmy BD25/50_5/9"}
|
||||
- {id: 5, cat: Movies/3D, desc: "Filmy 3D"}
|
||||
- {id: 6, cat: Movies/DVD, desc: "Filmy DVD5/9"}
|
||||
- {id: 8, cat: Movies/HD, desc: "Filmy HD"}
|
||||
- {id: 11, cat: Movies/SD, desc: "Filmy SD"}
|
||||
- {id: 12, cat: Movies/Other, desc: "Filmy Inne"}
|
||||
- {id: 32, cat: Movies/UHD, desc: "Filmy UHD"}
|
||||
- {id: 2, cat: TV/Anime, desc: "Anime"}
|
||||
- {id: 2, cat: TV/Documentary, desc: "TV Dokumentalne"}
|
||||
- {id: 20, cat: TV, desc: "TV Paczki"}
|
||||
- {id: 22, cat: TV/Sport, desc: "TV Sport"}
|
||||
- {id: 24, cat: TV/HD, desc: "TV HD"}
|
||||
- {id: 25, cat: TV/SD, desc: "TV SD"}
|
||||
- {id: 1, cat: PC, desc: "Aplikacje"}
|
||||
- {id: 15, cat: PC/Games, desc: "Gry"}
|
||||
- {id: 16, cat: PC/Phone-Other, desc: "Mobile"}
|
||||
- {id: 17, cat: Other, desc: "Inne"}
|
||||
- {id: 19, cat: Audio, desc: "Muzyka"}
|
||||
- {id: 21, cat: Books, desc: "Book"}
|
||||
|
||||
modes:
|
||||
search: [q]
|
||||
tv-search: [q, season, ep]
|
||||
movie-search: [q]
|
||||
|
||||
settings:
|
||||
- name: cookie
|
||||
type: text
|
||||
label: Cookie
|
||||
- name: info
|
||||
type: info
|
||||
label: How to get the Cookie
|
||||
default: "<ol><li>Login to this tracker with 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>"
|
||||
- name: sort
|
||||
type: select
|
||||
label: Sort requested from site
|
||||
default: "2"
|
||||
options:
|
||||
"2": "created"
|
||||
"5": "seeders"
|
||||
"3": "size"
|
||||
"1": "title"
|
||||
- name: type
|
||||
type: select
|
||||
label: Order requested from site
|
||||
default: "desc"
|
||||
options:
|
||||
"desc": "desc"
|
||||
"asc": "asc"
|
||||
|
||||
login:
|
||||
method: cookie
|
||||
inputs:
|
||||
cookie: "{{ .Config.cookie }}"
|
||||
test:
|
||||
path: index.php
|
||||
selector: a[href^="/logout.php"]
|
||||
|
||||
search:
|
||||
paths:
|
||||
- path: browse.php
|
||||
inputs:
|
||||
$raw: "{{ range .Categories }}c{{.}}=1&{{end}}"
|
||||
search: "{{ .Keywords }}"
|
||||
# 0 onlyactive 1 all 4 requests 5 onlydead 6 polish 8 free 10 doubleup 11 premier 13 VOD
|
||||
incldead: 1
|
||||
# 0 title 1 descr
|
||||
blah: 0
|
||||
sort: "{{ .Config.sort }}"
|
||||
type: "{{ .Config.type }}"
|
||||
|
||||
rows:
|
||||
selector: table[width="100%"] > tbody > tr:has(a[href^="browse.php?cat="])
|
||||
|
||||
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^="download.php/"]
|
||||
attribute: href
|
||||
banner:
|
||||
selector: a[href^="details.php?id="]
|
||||
attribute: onmouseover
|
||||
filters:
|
||||
- name: regexp
|
||||
args: "src=(.+?) "
|
||||
description:
|
||||
optional: true
|
||||
selector: img[src="pic/Poland.png"]
|
||||
attribute: src
|
||||
filters:
|
||||
- name: replace
|
||||
args: ["pic/Poland.png", "Polish"]
|
||||
date:
|
||||
selector: td[width="66%"] > span > span
|
||||
filters:
|
||||
- name: append
|
||||
args: " +00:00"
|
||||
- name: dateparse
|
||||
args: "2006-01-02 15:04:05 -07:00"
|
||||
size:
|
||||
selector: td:nth-child(4)
|
||||
seeders:
|
||||
selector: a[href$="#seedy"]
|
||||
leechers:
|
||||
selector: a[href$="#leechy"]
|
||||
grabs:
|
||||
selector: td:last-child > small> span
|
||||
downloadvolumefactor:
|
||||
case:
|
||||
img[src="pic/free.png"]: 0
|
||||
"*": 1
|
||||
uploadvolumefactor:
|
||||
case:
|
||||
img[src="pic/double.png"]: 2
|
||||
"*": 1
|
||||
# engine n/a
|
@@ -28,7 +28,8 @@
|
||||
|
||||
download:
|
||||
selector: a[href^="download.php?id="]
|
||||
|
||||
attribute: href
|
||||
|
||||
search:
|
||||
paths:
|
||||
- path: torrents-search.php
|
||||
|
@@ -80,3 +80,4 @@
|
||||
text: 0
|
||||
uploadvolumefactor:
|
||||
text: 1
|
||||
# Drupal 7
|
||||
|
@@ -112,3 +112,4 @@
|
||||
text: 0
|
||||
uploadvolumefactor:
|
||||
text: 1
|
||||
# engine n/a
|
||||
|
@@ -120,3 +120,4 @@
|
||||
text: 0
|
||||
uploadvolumefactor:
|
||||
text: 1
|
||||
# engine n/a
|
||||
|
@@ -149,6 +149,7 @@
|
||||
|
||||
rows:
|
||||
selector: div.inf-table-row
|
||||
|
||||
fields:
|
||||
title:
|
||||
selector: div.list-name a.tlink
|
||||
@@ -199,3 +200,4 @@
|
||||
"*": 1
|
||||
uploadvolumefactor:
|
||||
text: 1
|
||||
# engine n/a
|
||||
|
@@ -1,7 +1,7 @@
|
||||
---
|
||||
site: crazyscorner
|
||||
name: Crazy's Corner
|
||||
description: "Crazy's Corner is a Private Torrent Tracker"
|
||||
description: "Crazy's Corner is a Private Torrent Tracker for MUSIC"
|
||||
language: en-us
|
||||
type: private
|
||||
encoding: UTF-8
|
||||
@@ -10,60 +10,45 @@
|
||||
|
||||
caps:
|
||||
categorymappings:
|
||||
- {id: 34, cat: Movies/3D, desc: "MOVIES 3D"}
|
||||
- {id: 52, cat: Movies/HD, desc: "MOVIES High Def Mkv/Mp4"}
|
||||
- {id: 70, cat: Movies, desc: "MOVIES Animation"}
|
||||
- {id: 97, cat: Movies, desc: "MOVIES DISNEY"}
|
||||
- {id: 112, cat: Movies, desc: "MOVIES itunes"}
|
||||
- {id: 78, cat: TV, desc: "MISC POD CASTS"}
|
||||
- {id: 99, cat: Movies, desc: "MOVIES Cam Ratio Free"}
|
||||
- {id: 11, cat: Movies/DVD, desc: "MOVIES DVD-R"}
|
||||
- {id: 35, cat: Movies/BluRay, desc: "MOVIES Blu-Ray"}
|
||||
- {id: 95, cat: Movies, desc: "MOVIES Classic picks"}
|
||||
- {id: 100, cat: Movies/SD, desc: "MOVIES XVD"}
|
||||
- {id: 105, cat: Movies/HD, desc: "MOVIES HD RIPS"}
|
||||
- {id: 108, cat: Movies, desc: "MOVIES Musical"}
|
||||
- {id: 107, cat: Movies, desc: "MOVIES Packs"}
|
||||
- {id: 36, cat: Movies/DVD, desc: "MOVIES DvD-Rips"}
|
||||
- {id: 37, cat: Movies, desc: "MOVIES Classic"}
|
||||
- {id: 38, cat: Movies, desc: "MOVIES Classic-Kids"}
|
||||
- {id: 47, cat: Movies/WEBDL, desc: "MOVIES Webrip/WEB-DL"}
|
||||
- {id: 39, cat: Movies, desc: "MOVIES Packs"}
|
||||
- {id: 5, cat: Movies, desc: "MOVIES Anime"}
|
||||
- {id: 32, cat: XXX, desc: "MOVIES Adult"}
|
||||
- {id: 33, cat: Movies/UHD, desc: "MOVIES 4K Ratio Free"}
|
||||
- {id: 4, cat: Movies, desc: "MOVIES Misc"}
|
||||
- {id: 79, cat: Audio/Audiobook, desc: "MISC AUDIO BOOKS"}
|
||||
- {id: 81, cat: Audio/Other, desc: "MISC RADIO SHOWS"}
|
||||
- {id: 43, cat: TV, desc: "TV Kids"}
|
||||
- {id: 48, cat: Movies, desc: "SPORTS Misc"}
|
||||
- {id: 110, cat: TV/Sport, desc: "MOVIES Christmas"}
|
||||
- {id: 44, cat: PC/ISO, desc: "GAMES Pc-Iso"}
|
||||
- {id: 45, cat: Console, desc: "GAMES All Console"}
|
||||
- {id: 41, cat: TV, desc: "TV Episodes"}
|
||||
- {id: 101, cat: TV, desc: "TV Soaps"}
|
||||
- {id: 104, cat: TV, desc: "TV MISC"}
|
||||
- {id: 103, cat: Audio, desc: "karaoke Misc"}
|
||||
- {id: 111, cat: Audio, desc: "MUSIC Christmas"}
|
||||
- {id: 42, cat: TV, desc: "VIP TV Packs"}
|
||||
- {id: 84, cat: PC, desc: "APPS MISC"}
|
||||
- {id: 2, cat: Audio, desc: "Music"}
|
||||
- {id: 30, cat: Audio, desc: "Music Packs"}
|
||||
- {id: 31, cat: Audio, desc: "Music Albums"}
|
||||
- {id: 3, cat: PC/Games, desc: "Games Misc"}
|
||||
- {id: 40, cat: TV, desc: "TV Single Seasons"}
|
||||
- {id: 7, cat: PC/0day, desc: "Apps Win"}
|
||||
- {id: 8, cat: PC, desc: "Apps Linux"}
|
||||
- {id: 9, cat: PC/Mac, desc: "Apps Mac"}
|
||||
- {id: 51, cat: Books/Ebook, desc: "E Books Food/Cook-Books"}
|
||||
- {id: 64, cat: Books/Ebook, desc: "E Books Book Packs"}
|
||||
- {id: 26, cat: Books/Ebook, desc: "E Books Magazines"}
|
||||
- {id: 29, cat: Books/Ebook, desc: "E Books Misc Books"}
|
||||
- {id: 1, cat: Audio, desc: "Alternative"}
|
||||
- {id: 2, cat: Audio, desc: " |-- "}
|
||||
- {id: 3, cat: Audio, desc: "Blues"}
|
||||
- {id: 35, cat: Audio, desc: "Christmas Music"}
|
||||
- {id: 4, cat: Audio, desc: "Classic Rock"}
|
||||
- {id: 6, cat: Audio, desc: "Country"}
|
||||
- {id: 7, cat: Audio, desc: "Dance"}
|
||||
- {id: 8, cat: Audio, desc: "Disco"}
|
||||
- {id: 9, cat: Audio, desc: "Electronic"}
|
||||
- {id: 10, cat: Audio, desc: "Folk"}
|
||||
- {id: 11, cat: Audio, desc: "Gospel"}
|
||||
- {id: 37, cat: Audio, desc: "HardCore"}
|
||||
- {id: 12, cat: Audio, desc: "Heavy-Metal"}
|
||||
- {id: 13, cat: Audio, desc: "Hip-Hop"}
|
||||
- {id: 14, cat: Audio, desc: "Jazz"}
|
||||
- {id: 15, cat: Audio, desc: "Karaoke"}
|
||||
- {id: 16, cat: Audio, desc: "Metal"}
|
||||
- {id: 34, cat: Audio, desc: "Misc Compilation Albums Packs"}
|
||||
- {id: 17, cat: Audio, desc: "Music Apps"}
|
||||
- {id: 18, cat: Audio, desc: "Music Video"}
|
||||
- {id: 19, cat: Audio, desc: "Opera"}
|
||||
- {id: 20, cat: Audio, desc: "Pop"}
|
||||
- {id: 21, cat: Audio, desc: "Punk"}
|
||||
- {id: 22, cat: Audio, desc: "Punk Pop"}
|
||||
- {id: 24, cat: Audio, desc: "R & B"}
|
||||
- {id: 23, cat: Audio, desc: "Rap"}
|
||||
- {id: 25, cat: Audio, desc: "Reggae"}
|
||||
- {id: 26, cat: Audio, desc: "Rock"}
|
||||
- {id: 27, cat: Audio, desc: "Rock-70s"}
|
||||
- {id: 28, cat: Audio, desc: "Rock-80s"}
|
||||
- {id: 29, cat: Audio, desc: "Soul"}
|
||||
- {id: 30, cat: Audio, desc: "Sound Tracks"}
|
||||
- {id: 31, cat: Audio, desc: "Techno"}
|
||||
- {id: 32, cat: Audio, desc: "Teen-Pop"}
|
||||
- {id: 33, cat: Audio, desc: "Trance"}
|
||||
|
||||
modes:
|
||||
search: [q]
|
||||
tv-search: [q, season, ep]
|
||||
movie-search: [q]
|
||||
music-search: [q, album, artist, label, year]
|
||||
|
||||
settings:
|
||||
- name: username
|
||||
@@ -75,12 +60,12 @@
|
||||
- name: sort
|
||||
type: select
|
||||
label: Sort requested from site
|
||||
default: "3"
|
||||
default: "added"
|
||||
options:
|
||||
"3": "created"
|
||||
"5": "seeders"
|
||||
"4": "size"
|
||||
"2": "title"
|
||||
"added": "created"
|
||||
"seeders": "seeders"
|
||||
"size": "size"
|
||||
"name": "title"
|
||||
- name: type
|
||||
type: select
|
||||
label: Order requested from site
|
||||
@@ -90,95 +75,90 @@
|
||||
"asc": "asc"
|
||||
|
||||
login:
|
||||
path: index.php?page=login
|
||||
path: takelogin.php
|
||||
method: post
|
||||
inputs:
|
||||
uid: "{{ .Config.username }}"
|
||||
pwd: "{{ .Config.password }}"
|
||||
username: "{{ .Config.username }}"
|
||||
password: "{{ .Config.password }}"
|
||||
submit: LOGIN
|
||||
error:
|
||||
- selector: tr td span[style="color:#FF0000;"]
|
||||
- selector: table:contains("ERROR")
|
||||
test:
|
||||
path: index.php
|
||||
selector: a[href="logout.php"]
|
||||
selector: a[href*="/logout.php?logouthash="]
|
||||
|
||||
download:
|
||||
before:
|
||||
path: takethanks.php
|
||||
method: post
|
||||
inputs:
|
||||
torrentid: "{{ .DownloadUri.Query.id }}"
|
||||
selector: a[href*="/download.php?id="]
|
||||
attribute: href
|
||||
|
||||
search:
|
||||
paths:
|
||||
# http://crazys-corner.info/index.php?page=torrents&search=captain&category=0&uploader=0&options=0&active=0&gold=0
|
||||
- path: index.php
|
||||
- path: browse.php
|
||||
method: post
|
||||
inputs:
|
||||
search: "{{ .Keywords }}"
|
||||
page: torrents
|
||||
category: "{{ range .Categories }}{{.}};{{end}}"
|
||||
uploader: 0
|
||||
# 0 filename 1 file&descr 2 descr
|
||||
options: 0
|
||||
# 0 all 1 active 2 deadonly
|
||||
active: 0
|
||||
# 0 all 1 classic 2 silver 3 gold 4 silver&gold
|
||||
gold: 0
|
||||
order: "{{ .Config.sort }}"
|
||||
by: "{{ .Config.type }}"
|
||||
do: search
|
||||
keywords: "{{if or (.Query.Album) (.Query.Artist) }}{{ or (.Query.Album) (.Query.Artist) }}{{else}}{{ .Keywords }}{{end}}"
|
||||
category: "{{ if .Categories }}{{ range .Categories }}{{.}};{{end}}{{else}}0{{end}}"
|
||||
# t_name t_description t_both t_uploader t_genre
|
||||
search_type: t_name
|
||||
include_dead_torrents: yes
|
||||
sort: "{{ .Config.sort }}"
|
||||
order: "{{ .Config.type }}"
|
||||
|
||||
rows:
|
||||
selector: table.lista tr:has(a[onmouseover][href^="index.php?page=torrent-details&id="])
|
||||
selector: table.sortable tr:has(a[href*="/download.php?id="])
|
||||
|
||||
fields:
|
||||
category:
|
||||
selector: a[href^="index.php?page=torrents&category="]
|
||||
selector: a[href*="/browse.php?category="]
|
||||
attribute: href
|
||||
filters:
|
||||
- name: querystring
|
||||
args: category
|
||||
title:
|
||||
selector: a[href^="index.php?page=torrent-details&id="]
|
||||
# abbreviated title
|
||||
selector: a[href*="/details.php?id="]
|
||||
title:
|
||||
selector: div.tooltip-content > div
|
||||
optional: true
|
||||
details:
|
||||
selector: a[href^="index.php?page=torrent-details&id="]
|
||||
selector: a[href*="/details.php?id="]
|
||||
attribute: href
|
||||
download:
|
||||
selector: a[href^="download.php?id="]
|
||||
selector: a[href*="/details.php?id="]
|
||||
attribute: href
|
||||
magnet:
|
||||
selector: a[href^="magnet:?xt="]
|
||||
attribute: href
|
||||
banner:
|
||||
selector: a[href^="index.php?page=torrent-details&id="]
|
||||
attribute: onmouseover
|
||||
filters:
|
||||
- name: regexp
|
||||
args: "src=(.+?) width"
|
||||
size:
|
||||
selector: a[href^="index.php?page=torrent-details&id="]
|
||||
attribute: onmouseover
|
||||
filters:
|
||||
- name: regexp
|
||||
args: "Size: (.+?)<"
|
||||
selector: img[src*="/torrents/images/"]
|
||||
attribute: src
|
||||
date:
|
||||
selector: a[href^="index.php?page=torrent-details&id="]
|
||||
attribute: onmouseover
|
||||
selector: td:nth-child(2)
|
||||
filters:
|
||||
- name: regexp
|
||||
args: "Added:(.+?)<"
|
||||
- name: timeago
|
||||
seeders:
|
||||
selector: a[title][href^="index.php?page=torrent-details&id="]
|
||||
attribute: onmouseover
|
||||
filters:
|
||||
- name: regexp
|
||||
args: "Seeders: (\\d+)<"
|
||||
leechers:
|
||||
selector: a[title][href^="index.php?page=torrent-details&id="]
|
||||
attribute: onmouseover
|
||||
filters:
|
||||
- name: regexp
|
||||
args: "Leechers: (\\d+)<"
|
||||
args: "(\\d{2}-\\d{2}-\\d{4} \\d{2}:\\d{2})"
|
||||
- name: dateparse
|
||||
args: "02-01-2006 15:04"
|
||||
size:
|
||||
selector: td:nth-last-child(5)
|
||||
grabs:
|
||||
selector: a[title][href^="index.php?page=torrent-details&id="]
|
||||
attribute: onmouseover
|
||||
filters:
|
||||
- name: regexp
|
||||
args: "Done: (\\d+)<"
|
||||
selector: td:nth-last-child(4)
|
||||
seeders:
|
||||
selector: td:nth-last-child(3)
|
||||
leechers:
|
||||
selector: td:nth-last-child(2)
|
||||
downloadvolumefactor:
|
||||
case:
|
||||
img[src="images/freeleech.gif"]: 0
|
||||
img[src="gold/gold.gif"]: 0
|
||||
img[src$="_flags/freedownload.gif"]: 0
|
||||
"*": 1
|
||||
uploadvolumefactor:
|
||||
case:
|
||||
img[src$="_flags/x2.gif"]: 2
|
||||
"*": 1
|
||||
# TS Special Edition v.7.5
|
||||
|
@@ -142,6 +142,7 @@
|
||||
to: "give"
|
||||
torrent: "{{ .DownloadUri.Query.id }}"
|
||||
selector: a:contains("Télécharger ce torrent")
|
||||
attribute: href
|
||||
|
||||
search:
|
||||
paths:
|
||||
|
@@ -112,6 +112,7 @@
|
||||
|
||||
rows:
|
||||
selector: tr:has(td.trowtorrent)
|
||||
|
||||
fields:
|
||||
category:
|
||||
selector: td:nth-of-type(1) a
|
||||
@@ -163,3 +164,4 @@
|
||||
"*": 1
|
||||
uploadvolumefactor:
|
||||
text: 1
|
||||
# U-232
|
||||
|
@@ -155,8 +155,7 @@
|
||||
leechers:
|
||||
selector: td:nth-child(8) span
|
||||
downloadvolumefactor:
|
||||
case:
|
||||
"*": "1"
|
||||
text: 1
|
||||
uploadvolumefactor:
|
||||
case:
|
||||
"*": "1"
|
||||
text: 1
|
||||
# engine n/a
|
||||
|
@@ -6,6 +6,8 @@
|
||||
type: private
|
||||
encoding: windows-1252
|
||||
links:
|
||||
- https://datascene.net/
|
||||
legacylinks:
|
||||
- http://datascene.net/
|
||||
|
||||
caps:
|
||||
@@ -75,11 +77,13 @@
|
||||
paths:
|
||||
- path: browse.php
|
||||
inputs:
|
||||
$raw: "{{range .Categories}}c{{.}}=1&{{end}}"
|
||||
$raw: "{{ range .Categories }}c{{.}}=1&{{end}}"
|
||||
search: "{{ .Keywords }}"
|
||||
incldead: 1
|
||||
|
||||
rows:
|
||||
selector: div.ncls > table > tbody > tr:has(a.tname)
|
||||
|
||||
fields:
|
||||
title:
|
||||
selector: a.tname
|
||||
@@ -123,8 +127,8 @@
|
||||
selector: td:nth-last-child(2)
|
||||
downloadvolumefactor:
|
||||
case:
|
||||
"a#free-btn": "0"
|
||||
"*": "1"
|
||||
"a#free-btn": 0
|
||||
"*": 1
|
||||
uploadvolumefactor:
|
||||
case:
|
||||
"*": "1"
|
||||
text: 1
|
||||
# engine n/a
|
||||
|
@@ -103,7 +103,7 @@
|
||||
selector: td:nth-child(8)
|
||||
filters:
|
||||
- name: regexp
|
||||
args: ([\d,]+)
|
||||
args: (\d+)
|
||||
seeders:
|
||||
selector: td:nth-child(9)
|
||||
leechers:
|
||||
@@ -117,3 +117,4 @@
|
||||
text: 1
|
||||
uploadvolumefactor:
|
||||
text: 1
|
||||
# engine n/a
|
||||
|
@@ -284,6 +284,7 @@
|
||||
|
||||
download:
|
||||
selector: a[href^="magnet:?xt="]
|
||||
attribute: href
|
||||
|
||||
search:
|
||||
paths:
|
||||
@@ -313,11 +314,14 @@
|
||||
- name: replace
|
||||
args: ["Added ", ""]
|
||||
- name: replace
|
||||
args: ["on ", ""]
|
||||
args: ["on ", ""]
|
||||
|
||||
fields:
|
||||
title:
|
||||
selector: a[href^="/files/details/"]
|
||||
title:
|
||||
selector: a[href^="/files/details/"]
|
||||
optional: true
|
||||
attribute: title
|
||||
category:
|
||||
selector: a[href*="&subcategory="]
|
||||
@@ -346,3 +350,4 @@
|
||||
text: 0
|
||||
uploadvolumefactor:
|
||||
text: 1
|
||||
# engine n/a
|
||||
|
@@ -133,29 +133,35 @@
|
||||
filters:
|
||||
# translations for Turkish|Estonian|Danish|Italian|Polish|Norwegian|Portuguese|Czech|Russian|Romanian|Spanish|French|German|Bulgarian|Dutch|Chinese
|
||||
- name: re_replace
|
||||
args: ["(?i)(önce|tagasi|geleden|fa|temu|siden|atrás|nazpět|назад|acum|hace|il y a|vor|преди|前)", " ago"]
|
||||
- name: re_replace
|
||||
args: ["(?i)(dakika|minut|minuto|minuta|minutt|минута|Minute|minuut|分钟)", " minute"]
|
||||
args: ["(?i)(önce|tagasi|geleden|fa|temu|siden|atrás|nazpět|назад|acum|în urmă|hace|il y a|vor|преди|前)", " ago"]
|
||||
- name: re_replace
|
||||
args: ["(?i)(minutit|minutter|minuti|minuty|minutos|минуты|минут|Minuten|минути|minuten)", "minutes"]
|
||||
- name: re_replace
|
||||
args: ["(?i)(saat|tund|time|ora|godzina|hora|hodina|час|oră|heure|Stunde|uur|小时)", " hour"]
|
||||
args: ["(?i)(dakika|minut|minuto|minuta|minutt|минута|Minute|minuut|分钟)", " minute"]
|
||||
- name: re_replace
|
||||
args: ["(?i)(tundi|timer|ore|godziny|horas|hodiny|hoden|часа|часов|ore|heures|Stunden)", "hours"]
|
||||
- name: re_replace
|
||||
args: ["(?i)(gün|päev|dag|giorno|dzień|dia|den|день|zi|día|jour|Tag|ден|天)", " day"]
|
||||
args: ["(?i)(saat|tund|time|ora|godzina|hora|hodina|час|oră|heure|Stunde|uur|小时)", " hour"]
|
||||
- name: re_replace
|
||||
args: ["(?i)(päeva|dage|giorni|dni|dias|dny|дня|дней|zile|días|jours|Tagen|дни|dagen)", "days"]
|
||||
- name: re_replace
|
||||
args: ["(?i)(hafta|nädal|uge|settimana|tydzień|uke|semana|týden|неделю|săptămână|semaine|Woche|седмица|周)", " week"]
|
||||
args: ["(?i)(gün|päev|dag|giorno|dzień|dia|den|день|zi|día|jour|Tag|ден|天)", " day"]
|
||||
- name: re_replace
|
||||
args: ["(?i)(nädalat|uger|settimane|tygodnie|uker|semanas|týdny|недели|недель|săptămâni|semaines|Wochen|седмици|weken)", "weeks"]
|
||||
- name: re_replace
|
||||
args: ["(?i)(hafta|nädal|uge|settimana|tydzień|uke|semana|týden|неделю|săptămână|semaine|Woche|седмица|周)", " week"]
|
||||
- name: re_replace
|
||||
args: ["(?i) (ay)", "month"]
|
||||
- name: re_replace
|
||||
args: ["(?i)(kuu|måned|mese|miesiąc|mês|měsíc|месяц|lună|mes|mois|Monat|месец|maand|个月)", " month"]
|
||||
- name: re_replace
|
||||
args: ["(?i)(kuud|måneder|mesi|miesiące|meses|měsíce|месяца|месяцев|luni|meses|mois|Monaten|месеца|maanden)", "months"]
|
||||
- name: re_replace
|
||||
args: ["(?i)(kuu|måned|mese|miesiąc|mês|měsíc|месяц|lună|mes|Monat|месец|maand|个月)", " month"]
|
||||
- name: re_replace
|
||||
args: ["(?i)(aastat|anni|lata|anos|roky|года|ani|años|ans|Jahren|години)", " years"]
|
||||
- name: re_replace
|
||||
args: ["(?i)(yil|aasta|år|anno|rok|ano|год|año|Jahr|година|jaar|年)", " year"]
|
||||
- name: re_replace
|
||||
args: ["(?i) (an)", "year"]
|
||||
downloadvolumefactor:
|
||||
case:
|
||||
i[class*="fa-id-badge text-orange"]: 0 # 24 Hour FreeLeech From BON Store
|
||||
|
@@ -80,6 +80,10 @@
|
||||
options:
|
||||
"2": "desc"
|
||||
"1": "asc"
|
||||
- name: info
|
||||
type: info
|
||||
label: Results Per Page
|
||||
default: For best results, change the <b>Torrents per page:</b> setting to <b>100</b> on your account profile.
|
||||
|
||||
login:
|
||||
method: cookie
|
||||
@@ -150,3 +154,4 @@
|
||||
img[src="images/4x.png"]: 4
|
||||
img[src="images/5x.png"]: 5
|
||||
"*": 1
|
||||
# xbtit customised
|
||||
|
@@ -75,6 +75,7 @@
|
||||
grabs:
|
||||
selector: td:nth-child(8)
|
||||
downloadvolumefactor:
|
||||
text: "0"
|
||||
text: 0
|
||||
uploadvolumefactor:
|
||||
text: "1"
|
||||
text: 1
|
||||
# tedmind 1.8.1
|
||||
|
@@ -135,6 +135,7 @@
|
||||
selector: table.ttable_headinner tr.t-row
|
||||
filters:
|
||||
- name: andmatch
|
||||
|
||||
fields:
|
||||
download:
|
||||
selector: a[href^="download.php?id="]
|
||||
@@ -164,5 +165,5 @@
|
||||
img[src="images/freeleech_star.gif"]: 0
|
||||
"*": 1
|
||||
uploadvolumefactor:
|
||||
case:
|
||||
"*": 1
|
||||
text: 1
|
||||
# TorrentTrader v2-svn
|
||||
|
@@ -140,6 +140,27 @@
|
||||
FRENCH : "FRENCH"
|
||||
MULTI.FRENCH : "MULTI.FRENCH"
|
||||
ENGLISH: "ENGLISH"
|
||||
- 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"
|
||||
- name: info
|
||||
type: info
|
||||
label: Results Per Page
|
||||
default: For best results, change the <b>Torrents per page:</b> setting to <b>100</b> on your account profile.
|
||||
|
||||
login:
|
||||
path: tracker/index.php?page=login
|
||||
method: post
|
||||
@@ -158,26 +179,30 @@
|
||||
download:
|
||||
before:
|
||||
path: tracker/thanks.php
|
||||
method: "post"
|
||||
method: post
|
||||
inputs:
|
||||
infohash: "{{ .DownloadUri.Query.id }}"
|
||||
thanks: "1"
|
||||
thanks: 1
|
||||
rndval: "1487013827343"
|
||||
selector: a[href^="download.php?id="]
|
||||
attribute: href
|
||||
|
||||
search:
|
||||
paths:
|
||||
- path: tracker/index.php
|
||||
inputs:
|
||||
page: "torrents"
|
||||
page: torrents
|
||||
search: "{{ .Keywords }}"
|
||||
category: "{{ range .Categories }}{{.}};{{end}}"
|
||||
options: "0"
|
||||
options: 0
|
||||
active: "{{ .Config.active }}"
|
||||
gold: "{{ .Config.gold }}"
|
||||
order: "{{ .Config.sort }}"
|
||||
by: "{{ .Config.type }}"
|
||||
|
||||
rows:
|
||||
selector: table > tbody > tr > td > table.lista > tbody > tr:has(td[onmouseover="this.className='post'"])
|
||||
|
||||
fields:
|
||||
title_phase1:
|
||||
selector: a[onmouseover][href^="index.php?page=torrent-details&id="]
|
||||
@@ -224,11 +249,15 @@
|
||||
args: ["---", "0"]
|
||||
size:
|
||||
selector: td:nth-last-of-type(4)
|
||||
filters:
|
||||
- name: replace
|
||||
args: [",", "."]
|
||||
downloadvolumefactor:
|
||||
case:
|
||||
img[src="images/freeleech.gif"]: "0"
|
||||
img[src="gold/gold.gif"]: "0"
|
||||
img[src="gold/slver.gif"]: "0.5"
|
||||
"*": "1"
|
||||
img[src="images/freeleech.gif"]: 0
|
||||
img[src="gold/gold.gif"]: 0
|
||||
img[src="gold/slver.gif"]: 0.5
|
||||
"*": 1
|
||||
uploadvolumefactor:
|
||||
text: "1"
|
||||
text: 1
|
||||
# xbtit dt fm v20.0
|
||||
|
@@ -140,29 +140,35 @@
|
||||
filters:
|
||||
# translations for Turkish|Estonian|Danish|Italian|Polish|Norwegian|Portuguese|Czech|Russian|Romanian|Spanish|French|German|Bulgarian|Dutch|Chinese
|
||||
- name: re_replace
|
||||
args: ["(?i)(önce|tagasi|geleden|fa|temu|siden|atrás|nazpět|назад|acum|hace|il y a|vor|преди|前)", " ago"]
|
||||
- name: re_replace
|
||||
args: ["(?i)(dakika|minut|minuto|minuta|minutt|минута|Minute|minuut|分钟)", " minute"]
|
||||
args: ["(?i)(önce|tagasi|geleden|fa|temu|siden|atrás|nazpět|назад|acum|în urmă|hace|il y a|vor|преди|前)", " ago"]
|
||||
- name: re_replace
|
||||
args: ["(?i)(minutit|minutter|minuti|minuty|minutos|минуты|минут|Minuten|минути|minuten)", "minutes"]
|
||||
- name: re_replace
|
||||
args: ["(?i)(saat|tund|time|ora|godzina|hora|hodina|час|oră|heure|Stunde|uur|小时)", " hour"]
|
||||
args: ["(?i)(dakika|minut|minuto|minuta|minutt|минута|Minute|minuut|分钟)", " minute"]
|
||||
- name: re_replace
|
||||
args: ["(?i)(tundi|timer|ore|godziny|horas|hodiny|hoden|часа|часов|ore|heures|Stunden)", "hours"]
|
||||
- name: re_replace
|
||||
args: ["(?i)(gün|päev|dag|giorno|dzień|dia|den|день|zi|día|jour|Tag|ден|天)", " day"]
|
||||
args: ["(?i)(saat|tund|time|ora|godzina|hora|hodina|час|oră|heure|Stunde|uur|小时)", " hour"]
|
||||
- name: re_replace
|
||||
args: ["(?i)(päeva|dage|giorni|dni|dias|dny|дня|дней|zile|días|jours|Tagen|дни|dagen)", "days"]
|
||||
- name: re_replace
|
||||
args: ["(?i)(hafta|nädal|uge|settimana|tydzień|uke|semana|týden|неделю|săptămână|semaine|Woche|седмица|周)", " week"]
|
||||
args: ["(?i)(gün|päev|dag|giorno|dzień|dia|den|день|zi|día|jour|Tag|ден|天)", " day"]
|
||||
- name: re_replace
|
||||
args: ["(?i)(nädalat|uger|settimane|tygodnie|uker|semanas|týdny|недели|недель|săptămâni|semaines|Wochen|седмици|weken)", "weeks"]
|
||||
- name: re_replace
|
||||
args: ["(?i)(hafta|nädal|uge|settimana|tydzień|uke|semana|týden|неделю|săptămână|semaine|Woche|седмица|周)", " week"]
|
||||
- name: re_replace
|
||||
args: ["(?i) (ay)", "month"]
|
||||
- name: re_replace
|
||||
args: ["(?i)(kuu|måned|mese|miesiąc|mês|měsíc|месяц|lună|mes|mois|Monat|месец|maand|个月)", " month"]
|
||||
- name: re_replace
|
||||
args: ["(?i)(kuud|måneder|mesi|miesiące|meses|měsíce|месяца|месяцев|luni|meses|mois|Monaten|месеца|maanden)", "months"]
|
||||
- name: re_replace
|
||||
args: ["(?i)(kuu|måned|mese|miesiąc|mês|měsíc|месяц|lună|mes|Monat|месец|maand|个月)", " month"]
|
||||
- name: re_replace
|
||||
args: ["(?i)(aastat|anni|lata|anos|roky|года|ani|años|ans|Jahren|години)", " years"]
|
||||
- name: re_replace
|
||||
args: ["(?i)(yil|aasta|år|anno|rok|ano|год|año|Jahr|година|jaar|年)", " year"]
|
||||
- name: re_replace
|
||||
args: ["(?i) (an)", "year"]
|
||||
downloadvolumefactor:
|
||||
case:
|
||||
i[class*="fa-id-badge text-orange"]: 0 # 24 Hour FreeLeech From BON Store
|
||||
|
@@ -80,6 +80,7 @@
|
||||
|
||||
download:
|
||||
selector: a[href^="download.php?id="]
|
||||
attribute: href
|
||||
|
||||
search:
|
||||
# https://dxp.ru/torrents.php?search=&sort=4&type=desc
|
||||
@@ -135,3 +136,4 @@
|
||||
"*": 0
|
||||
uploadvolumefactor:
|
||||
text: 1
|
||||
# engine n/a
|
||||
|
@@ -140,3 +140,4 @@
|
||||
"*": 1
|
||||
uploadvolumefactor:
|
||||
text: 1
|
||||
# engine n/a
|
||||
|
@@ -297,6 +297,7 @@
|
||||
|
||||
download:
|
||||
selector: a[href^="download.php?id="]
|
||||
attribute: href
|
||||
|
||||
search:
|
||||
paths:
|
||||
|
@@ -60,8 +60,9 @@
|
||||
paths:
|
||||
- path: torrents.php
|
||||
inputs:
|
||||
artistname: "{{ if .Query.Artist }}{{ .Query.Artist }}{{else}}{{end}}"
|
||||
groupname: "{{ if .Query.Artist }}{{else}}{{ .Keywords }}{{end}}"
|
||||
searchstr: "{{ .Keywords }}"
|
||||
artistname: "{{ .Query.Artist }}"
|
||||
groupname: "{{ .Query.Album }}"
|
||||
order_by: "{{ .Config.sort }}"
|
||||
order_way: "{{ .Config.type }}"
|
||||
|
||||
@@ -117,3 +118,4 @@
|
||||
case:
|
||||
strong.torrent_label[title*="Neutral"]: 0
|
||||
"*": 1
|
||||
# engine n/a
|
||||
|
140
src/Jackett.Common/Definitions/eggmeon.yml
Normal file
140
src/Jackett.Common/Definitions/eggmeon.yml
Normal file
@@ -0,0 +1,140 @@
|
||||
---
|
||||
site: eggmeon
|
||||
name: EggMeOn
|
||||
description: "EggMeOn is a Private Torrent Tracker for nostalgic TV / CONSOLE / PODCASTS"
|
||||
language: en-us
|
||||
type: private
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- https://www.eggmeon.xyz/
|
||||
|
||||
caps:
|
||||
categorymappings:
|
||||
- {id: 1, cat: TV, desc: "AdultSwim"}
|
||||
- {id: 2, cat: TV/Anime, desc: "Animation"}
|
||||
- {id: 14, cat: Audio, desc: "Audio"}
|
||||
- {id: 3, cat: TV, desc: "Cartoon Network"}
|
||||
- {id: 4, cat: TV, desc: "Comedy"}
|
||||
- {id: 5, cat: TV, desc: "Disney"}
|
||||
- {id: 6, cat: Console, desc: "Games"}
|
||||
- {id: 7, cat: TV, desc: "MST3K"}
|
||||
- {id: 8, cat: Audio/Video, desc: "MTV"}
|
||||
- {id: 9, cat: TV, desc: "Nickelodeon"}
|
||||
- {id: 10, cat: Movies, desc: "Other"}
|
||||
- {id: 13, cat: Audio/Other, desc: "Podcast"}
|
||||
- {id: 11, cat: Books, desc: "Publication"}
|
||||
- {id: 12, cat: Movies, desc: "Star Wars"}
|
||||
|
||||
modes:
|
||||
search: [q]
|
||||
tv-search: [q]
|
||||
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: "time"
|
||||
options:
|
||||
"time": "created"
|
||||
"seeders": "seeders"
|
||||
"size": "size"
|
||||
- name: type
|
||||
type: select
|
||||
label: Order requested from site
|
||||
default: "desc"
|
||||
options:
|
||||
"desc": "desc"
|
||||
"asc": "asc"
|
||||
|
||||
login:
|
||||
path: login
|
||||
method: form
|
||||
form: form[action="/login"]
|
||||
inputs:
|
||||
username: "{{ .Config.username }}"
|
||||
password: "{{ .Config.password }}"
|
||||
cinfo: "1536|864|24|-780"
|
||||
iplocked: 0
|
||||
keeploggedin: 1
|
||||
submit: login
|
||||
selectorinputs:
|
||||
token:
|
||||
selector: input[name="token"]
|
||||
attribute: value
|
||||
error:
|
||||
- selector: table#maincontent tr td div div#messagebarA
|
||||
|
||||
search:
|
||||
paths:
|
||||
- path: torrents.php
|
||||
inputs:
|
||||
$raw: "{{ range .Categories }}filter_cat[{{.}}]=1&{{end}}"
|
||||
order_by: "{{ .Config.sort }}"
|
||||
order_way: "{{ .Config.type }}"
|
||||
searchtext: ""
|
||||
action: advanced
|
||||
title: "{{ .Keywords }}"
|
||||
sizeall: ""
|
||||
sizetype: gb
|
||||
sizerange: 0.01
|
||||
filelist: ""
|
||||
taglist: ""
|
||||
autocomplete_toggle: 1
|
||||
|
||||
rows:
|
||||
selector: table#torrent_table tr:has(a[href^="torrents.php?action=download"])
|
||||
|
||||
fields:
|
||||
category:
|
||||
selector: a[href^="/torrents.php?filter_cat"]
|
||||
attribute: href
|
||||
filters:
|
||||
- name: regexp
|
||||
args: "(\\d+)]=1"
|
||||
title:
|
||||
selector: a[href^="/torrents.php?id="]
|
||||
details:
|
||||
selector: a[href^="/torrents.php?id="]
|
||||
attribute: href
|
||||
download:
|
||||
selector: a[href^="torrents.php?action=download"]
|
||||
attribute: href
|
||||
description:
|
||||
selector: div.tags
|
||||
banner:
|
||||
selector: td:nth-child(2) > script
|
||||
filters:
|
||||
- name: regexp
|
||||
args: "src=\\\\\"(.*?)\\\\\">"
|
||||
- name: re_replace
|
||||
args: ["\\\\(.)", "$1"]
|
||||
- name: replace
|
||||
args: ["/static/common/noartwork/noimage.png", ""]
|
||||
files:
|
||||
selector: td:nth-last-child(8)
|
||||
date:
|
||||
selector: td:nth-last-child(6)
|
||||
filters:
|
||||
- name: timeago
|
||||
size:
|
||||
selector: td:nth-last-child(5)
|
||||
grabs:
|
||||
selector: td:nth-last-child(4)
|
||||
seeders:
|
||||
selector: td:nth-last-child(3)
|
||||
leechers:
|
||||
selector: td:nth-last-child(2)
|
||||
downloadvolumefactor:
|
||||
case:
|
||||
"img[alt=\"Freeleech\"]": 0
|
||||
"*": 1
|
||||
uploadvolumefactor:
|
||||
text: 1
|
||||
# luminance
|
@@ -6,13 +6,15 @@
|
||||
type: public
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- https://www.elitetorrent.tv/
|
||||
- https://www.elitetorrent.bz/
|
||||
legacylinks:
|
||||
- https://www.elitetorrent.biz/
|
||||
- https://www.elitetorrent.io/
|
||||
- https://www.elitetorrent.one/
|
||||
- https://www.elitetorrent.is/
|
||||
- https://www.elitetorrent.nu/
|
||||
- https://www.elitetorrent.tv/
|
||||
- https://www.elitetorrent.li/
|
||||
|
||||
caps:
|
||||
categories:
|
||||
@@ -45,10 +47,12 @@
|
||||
inputs:
|
||||
s: "{{ .Keywords }}"
|
||||
$raw: "&x=0&y=0"
|
||||
|
||||
rows:
|
||||
selector: "#principal .miniboxs-ficha li"
|
||||
filters:
|
||||
- name: andmatch
|
||||
|
||||
fields:
|
||||
title:
|
||||
selector: .meta a
|
||||
@@ -87,10 +91,11 @@
|
||||
date:
|
||||
text: now
|
||||
seeders:
|
||||
text: "1"
|
||||
text: 1
|
||||
leechers:
|
||||
text: "1"
|
||||
text: 1
|
||||
downloadvolumefactor:
|
||||
text: "0"
|
||||
text: 0
|
||||
uploadvolumefactor:
|
||||
text: "1"
|
||||
text: 1
|
||||
# engine n/a
|
||||
|
@@ -85,14 +85,16 @@
|
||||
- path: torrents.php
|
||||
inputs:
|
||||
$raw: "{{range .Categories}}filter_cat[{{.}}]=1&{{end}}"
|
||||
title: "{{ .Query.Keywords }}"
|
||||
title: "{{ .Keywords }}"
|
||||
order_by: time
|
||||
order_way: desc
|
||||
action: basic
|
||||
searchsubmit: 1
|
||||
|
||||
rows:
|
||||
# exclude redbar torrents
|
||||
selector: table#torrent_table > tbody > tr[class^="torrent row"]
|
||||
|
||||
fields:
|
||||
download:
|
||||
selector: a[href^="/torrents.php?action=download&id="]
|
||||
@@ -106,7 +108,7 @@
|
||||
attribute: href
|
||||
filters:
|
||||
- name: regexp
|
||||
args: "\\[(\\d+?)\\]"
|
||||
args: "(\\d+)]=1"
|
||||
details:
|
||||
selector: a[href^="/torrents.php?id="]
|
||||
attribute: href
|
||||
@@ -141,8 +143,8 @@
|
||||
downloadvolumefactor:
|
||||
case:
|
||||
span.icon[title*="Freeleech"]: 0
|
||||
"img[alt=\"Freeleech\"]": "0"
|
||||
"*": "1"
|
||||
"img[alt=\"Freeleech\"]": 0
|
||||
"*": 1
|
||||
uploadvolumefactor:
|
||||
case:
|
||||
"*": "1"
|
||||
text: 1
|
||||
# luminance
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user