mirror of
https://github.com/Jackett/Jackett.git
synced 2025-09-10 05:43:17 +02:00
Compare commits
262 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
7b0adc7e45 | ||
![]() |
d27ab11d8c | ||
![]() |
5b6c9fee49 | ||
![]() |
594959c858 | ||
![]() |
5b570b5cec | ||
![]() |
875be5dde9 | ||
![]() |
ffd1600226 | ||
![]() |
07ef45b637 | ||
![]() |
24f7fa461d | ||
![]() |
8ebeb2bb17 | ||
![]() |
fe3fcda356 | ||
![]() |
b689b4581e | ||
![]() |
623da8f70d | ||
![]() |
6afaf39d5a | ||
![]() |
55bd19dc45 | ||
![]() |
0979b0c86d | ||
![]() |
f4c8677091 | ||
![]() |
1123e9d101 | ||
![]() |
9a39fcc310 | ||
![]() |
e8fc2c758f | ||
![]() |
b8cdf9f929 | ||
![]() |
89c860a16d | ||
![]() |
ee5255b24a | ||
![]() |
674e6e37ad | ||
![]() |
082e761d0d | ||
![]() |
6e8726c197 | ||
![]() |
3a8ed21d75 | ||
![]() |
eda0205dcd | ||
![]() |
bd250ff971 | ||
![]() |
1c63e9444d | ||
![]() |
57a5959751 | ||
![]() |
9e005c4c0b | ||
![]() |
c6d4746e85 | ||
![]() |
e9851a1dbc | ||
![]() |
96d23ca19a | ||
![]() |
733494a8a3 | ||
![]() |
ed763fe7e1 | ||
![]() |
1ef146eea4 | ||
![]() |
ed884f507d | ||
![]() |
ec6ed23ecc | ||
![]() |
9d5456e370 | ||
![]() |
ad08e28aa9 | ||
![]() |
34dcdd3332 | ||
![]() |
628944cb59 | ||
![]() |
08bc5cca75 | ||
![]() |
5c16161bfc | ||
![]() |
4eb7392678 | ||
![]() |
0448193ecd | ||
![]() |
dc27463826 | ||
![]() |
d3ef94c8db | ||
![]() |
74e3dec4ed | ||
![]() |
0b45557292 | ||
![]() |
0387de3c67 | ||
![]() |
6358e62741 | ||
![]() |
b012502f87 | ||
![]() |
608bb7d9e4 | ||
![]() |
5f4206608e | ||
![]() |
aef10d1246 | ||
![]() |
6fc972aa08 | ||
![]() |
271dcda7aa | ||
![]() |
94656892f8 | ||
![]() |
5fedb9c613 | ||
![]() |
538fa6a38d | ||
![]() |
4bd4d9cb0f | ||
![]() |
a353af2ee5 | ||
![]() |
565a368689 | ||
![]() |
972d4c9485 | ||
![]() |
45b77de6b2 | ||
![]() |
a27c641bcb | ||
![]() |
00cd1bd81c | ||
![]() |
80493b7fa1 | ||
![]() |
925471fa0c | ||
![]() |
9ae16dea57 | ||
![]() |
1aa3a256eb | ||
![]() |
89d12c6fa9 | ||
![]() |
ab6ca013d3 | ||
![]() |
20d6e3eb09 | ||
![]() |
37a50f8374 | ||
![]() |
fac07933a2 | ||
![]() |
8b77c6b483 | ||
![]() |
f1414eeeec | ||
![]() |
7a7bf83d98 | ||
![]() |
1d48eb2dd7 | ||
![]() |
e3956e123e | ||
![]() |
1cfe4f9226 | ||
![]() |
2cc601c5a9 | ||
![]() |
a69664428a | ||
![]() |
389daf9957 | ||
![]() |
93d200895b | ||
![]() |
43414bc9ed | ||
![]() |
e630390c3f | ||
![]() |
eb59c0bd51 | ||
![]() |
e743f8b3aa | ||
![]() |
6aaf12f1de | ||
![]() |
bd5e407b53 | ||
![]() |
c93d2821b1 | ||
![]() |
f65d2ba9e9 | ||
![]() |
0f5655ce0d | ||
![]() |
5484d05291 | ||
![]() |
fcc4168f54 | ||
![]() |
905a52a82b | ||
![]() |
86fd318211 | ||
![]() |
e66beb64f4 | ||
![]() |
4b507a3cbb | ||
![]() |
5033171c54 | ||
![]() |
8faf1c94dc | ||
![]() |
d05ad1ccb5 | ||
![]() |
9a1562ef8b | ||
![]() |
b5aee501e2 | ||
![]() |
dc9519c451 | ||
![]() |
692d006078 | ||
![]() |
7aac4fcfcb | ||
![]() |
81e5589707 | ||
![]() |
c36e3356e2 | ||
![]() |
d477f01f84 | ||
![]() |
d080c4a2ac | ||
![]() |
6252c73cf2 | ||
![]() |
3f9d182083 | ||
![]() |
0cabbd68c5 | ||
![]() |
c42027842b | ||
![]() |
66b433bde1 | ||
![]() |
ae303a5d4e | ||
![]() |
ca19d2219e | ||
![]() |
28a85d6426 | ||
![]() |
bd1d95ade5 | ||
![]() |
6634c5a036 | ||
![]() |
cc671dfab5 | ||
![]() |
dccdd89299 | ||
![]() |
c23370b5fc | ||
![]() |
d53a0ae4b9 | ||
![]() |
4e8c52e16a | ||
![]() |
eaae440c66 | ||
![]() |
c7e288a372 | ||
![]() |
a8375e8cfe | ||
![]() |
4ed5507e4d | ||
![]() |
682304d186 | ||
![]() |
1455a905f1 | ||
![]() |
64f066839d | ||
![]() |
cf676b4a3f | ||
![]() |
8bd74a2cc9 | ||
![]() |
77837b7483 | ||
![]() |
96e5e259e9 | ||
![]() |
6999410617 | ||
![]() |
e55e92f9ac | ||
![]() |
4710fa619c | ||
![]() |
61f9bec045 | ||
![]() |
318e8722db | ||
![]() |
86ce7ef1c8 | ||
![]() |
0997bf674a | ||
![]() |
c07c4f0682 | ||
![]() |
1563418d88 | ||
![]() |
771c0ac68c | ||
![]() |
143ffbf790 | ||
![]() |
a3f30a2dd9 | ||
![]() |
a9d3ae0107 | ||
![]() |
012f3d1bbc | ||
![]() |
9826e2c2af | ||
![]() |
a512ea37c3 | ||
![]() |
3aedbc7baf | ||
![]() |
b32257ae95 | ||
![]() |
6c1c4092bd | ||
![]() |
758138415e | ||
![]() |
b9a6c7c810 | ||
![]() |
dda62f1e18 | ||
![]() |
8fcb19e1ea | ||
![]() |
66e7ced25b | ||
![]() |
5f1848d1de | ||
![]() |
1f9c760246 | ||
![]() |
3f19e6becf | ||
![]() |
130c0bebbe | ||
![]() |
b944993733 | ||
![]() |
542f8d67e4 | ||
![]() |
35f9e0fbe0 | ||
![]() |
db669b31a1 | ||
![]() |
1b64476102 | ||
![]() |
5530fa1ca4 | ||
![]() |
1fb77a6334 | ||
![]() |
175249d6f0 | ||
![]() |
f59f73e228 | ||
![]() |
c1b2328bbf | ||
![]() |
a3c1f3eb52 | ||
![]() |
f238e78337 | ||
![]() |
fd8823f6bd | ||
![]() |
c14ee124f5 | ||
![]() |
f4d45517c5 | ||
![]() |
091cfbb310 | ||
![]() |
698050e86a | ||
![]() |
bb3faa3f62 | ||
![]() |
08a68e0116 | ||
![]() |
d22ef13fb2 | ||
![]() |
d5e2014233 | ||
![]() |
dd52a16bff | ||
![]() |
a697aba985 | ||
![]() |
1533ad1927 | ||
![]() |
348461ebfc | ||
![]() |
b83a984365 | ||
![]() |
b07d1a32ca | ||
![]() |
e3bb63aac4 | ||
![]() |
65fc651d88 | ||
![]() |
218e0c989c | ||
![]() |
6f252254e3 | ||
![]() |
977052dfd7 | ||
![]() |
b78d04c116 | ||
![]() |
63267b597e | ||
![]() |
544501d2a8 | ||
![]() |
169fda4dbb | ||
![]() |
d3d78d3662 | ||
![]() |
2d1175dcc1 | ||
![]() |
0a7f06de31 | ||
![]() |
9f3f11ac49 | ||
![]() |
49affa0555 | ||
![]() |
f5c482f939 | ||
![]() |
6c67b7a8de | ||
![]() |
368947a061 | ||
![]() |
f0138405a6 | ||
![]() |
8373ee3b0c | ||
![]() |
dfaf9dd3a6 | ||
![]() |
c1bde9b643 | ||
![]() |
d86c60ffef | ||
![]() |
e4cfedfcfb | ||
![]() |
d3161e7b75 | ||
![]() |
baf4730316 | ||
![]() |
a89b69e821 | ||
![]() |
4d48c1be44 | ||
![]() |
8056e47fef | ||
![]() |
63a3465aa6 | ||
![]() |
03bbafb0c9 | ||
![]() |
d8cbae68d5 | ||
![]() |
99c269c896 | ||
![]() |
b4075d1d35 | ||
![]() |
49eebc90e4 | ||
![]() |
68b25de828 | ||
![]() |
00104205c0 | ||
![]() |
28b53d8fb1 | ||
![]() |
8a94d689b8 | ||
![]() |
ad00e49fe2 | ||
![]() |
888361f46f | ||
![]() |
edc4c31fa6 | ||
![]() |
a1dde973fb | ||
![]() |
525f58eb1d | ||
![]() |
124fbf7c1b | ||
![]() |
b9b10e4e91 | ||
![]() |
427b556869 | ||
![]() |
04f9f2dfe7 | ||
![]() |
d8e7a63768 | ||
![]() |
2f694147a1 | ||
![]() |
c339d54aed | ||
![]() |
58974623de | ||
![]() |
889a8da4e5 | ||
![]() |
2f91d99e19 | ||
![]() |
65e93ce137 | ||
![]() |
0784e0784c | ||
![]() |
963616fe07 | ||
![]() |
e407067c8b | ||
![]() |
a8ba61fc9d | ||
![]() |
bbc360be00 | ||
![]() |
d82c11650c | ||
![]() |
6067a4ff73 | ||
![]() |
8c344b2917 | ||
![]() |
62769325b4 | ||
![]() |
a96b3841b0 | ||
![]() |
a3dcb0455a |
@@ -123,7 +123,7 @@ dotnet_style_prefer_compound_assignment=true:suggestion
|
||||
###############################
|
||||
# Style Definitions
|
||||
dotnet_naming_style.pascal_case_style.capitalization=pascal_case
|
||||
# Use PascalCase for constant fields
|
||||
# Use PascalCase for constant fields
|
||||
dotnet_naming_rule.constant_fields_should_be_pascal_case.severity=warning
|
||||
dotnet_naming_rule.constant_fields_should_be_pascal_case.symbols=constant_fields
|
||||
dotnet_naming_rule.constant_fields_should_be_pascal_case.style=pascal_case_style
|
||||
@@ -161,11 +161,11 @@ dotnet_naming_rule.asyncmethods_should_be_ends_with_async.style = ends_with_asyn
|
||||
|
||||
dotnet_naming_symbols.interface.applicable_kinds = interface
|
||||
dotnet_naming_symbols.interface.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
|
||||
dotnet_naming_symbols.interface.required_modifiers =
|
||||
dotnet_naming_symbols.interface.required_modifiers =
|
||||
|
||||
dotnet_naming_symbols.private_or_internal_field.applicable_kinds = field
|
||||
dotnet_naming_symbols.private_or_internal_field.applicable_accessibilities = internal, private, private_protected
|
||||
dotnet_naming_symbols.private_or_internal_field.required_modifiers =
|
||||
dotnet_naming_symbols.private_or_internal_field.required_modifiers =
|
||||
|
||||
dotnet_naming_symbols.private_or_internal_static_field.applicable_kinds = field
|
||||
dotnet_naming_symbols.private_or_internal_static_field.applicable_accessibilities = internal, private, private_protected
|
||||
@@ -173,11 +173,11 @@ dotnet_naming_symbols.private_or_internal_static_field.required_modifiers = stat
|
||||
|
||||
dotnet_naming_symbols.types.applicable_kinds = class, struct, interface, enum
|
||||
dotnet_naming_symbols.types.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
|
||||
dotnet_naming_symbols.types.required_modifiers =
|
||||
dotnet_naming_symbols.types.required_modifiers =
|
||||
|
||||
dotnet_naming_symbols.non_field_members.applicable_kinds = property, event, method
|
||||
dotnet_naming_symbols.non_field_members.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
|
||||
dotnet_naming_symbols.non_field_members.required_modifiers =
|
||||
dotnet_naming_symbols.non_field_members.required_modifiers =
|
||||
|
||||
dotnet_naming_symbols.asyncmethods.applicable_kinds = delegate, method, local_function
|
||||
dotnet_naming_symbols.asyncmethods.applicable_accessibilities = *
|
||||
@@ -185,29 +185,29 @@ 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.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.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.required_prefix = _
|
||||
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.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_prefix =
|
||||
dotnet_naming_style.ends_with_async.required_suffix = Async
|
||||
dotnet_naming_style.ends_with_async.word_separator =
|
||||
dotnet_naming_style.ends_with_async.word_separator =
|
||||
dotnet_naming_style.ends_with_async.capitalization = pascal_case
|
||||
|
||||
###############################
|
||||
|
4
.gitattributes
vendored
4
.gitattributes
vendored
@@ -1,15 +1,13 @@
|
||||
# Set the default behavior, in case people don't have core.autocrlf set.
|
||||
* text=auto
|
||||
* text eol=lf
|
||||
|
||||
# Explicitly declare text files you want to always be normalized and converted
|
||||
# to native line endings on checkout.
|
||||
|
||||
# Declare files that will always have LF line endings on checkout.
|
||||
*.yml text eol=lf
|
||||
*.sh text eol=lf
|
||||
|
||||
# Declare files that will always have CRLF line endings on checkout.
|
||||
*.cs text eol=crlf
|
||||
|
||||
# Denote all files that are truly binary and should not be modified.
|
||||
*.png binary
|
||||
|
3
.gitignore
vendored
3
.gitignore
vendored
@@ -195,9 +195,6 @@ FakesAssemblies/
|
||||
# Visual Studio 6 workspace options file
|
||||
*.opt
|
||||
/tools
|
||||
/BuildOutput
|
||||
/Artifacts
|
||||
/TestResults
|
||||
*.DS_Store
|
||||
.idea/
|
||||
launchSettings.json
|
||||
|
220
README.md
220
README.md
@@ -2,8 +2,7 @@
|
||||
|
||||
[](https://github.com/Jackett/Jackett/issues)
|
||||
[](https://github.com/Jackett/Jackett/pulls)
|
||||
[](https://ci.appveyor.com/project/Jackett/jackett)
|
||||
[](https://dev.azure.com/Jackett-project/Jackett/_build/latest?definitionId=1&branchName=master)
|
||||
[](https://dev.azure.com/jackett/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)
|
||||
@@ -19,7 +18,7 @@ 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)
|
||||
* Windows 7SP1 or greater using .NET 4.6.1 or above [Download here](https://dotnet.microsoft.com/download/dotnet-framework/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.13 or greater
|
||||
|
||||
@@ -27,6 +26,7 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
|
||||
|
||||
* 1337x
|
||||
* 7torrents
|
||||
* AcademicTorrents
|
||||
* ACG.RIP
|
||||
* ACGsou
|
||||
* Anidex
|
||||
@@ -37,9 +37,10 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
|
||||
* BigFANGroup
|
||||
* BitRu
|
||||
* BitTorrent.AM
|
||||
* BT.etree
|
||||
* BTDB
|
||||
* BTDIGG
|
||||
* BT.etree
|
||||
* BTeye
|
||||
* BTSOW
|
||||
* Cili180
|
||||
* ConCen
|
||||
@@ -48,11 +49,11 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
|
||||
* cpasbienClone
|
||||
* Demonoid
|
||||
* dmhy
|
||||
* ETTV
|
||||
* EliteTorrent.biz
|
||||
* EstrenosDTL
|
||||
* ExtraTorrent.cd
|
||||
* ETTV
|
||||
* EXT Torrents
|
||||
* ExtraTorrent.cd
|
||||
* EZTV
|
||||
* Filebase
|
||||
* FireBit
|
||||
@@ -64,16 +65,17 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
|
||||
* Horrible Subs
|
||||
* IBit
|
||||
* Idope
|
||||
* Il CorSaRo Blu
|
||||
* Il Corsaro Nero <!-- maintained by bonny1992 -->
|
||||
* Il Corsaro Blu
|
||||
* Internet Archive (archive.org)
|
||||
* Isohunt2
|
||||
* iTorrent
|
||||
* KickAssTorrent (KATcr)
|
||||
* KickAssTorrent (kat.li)
|
||||
* KickAssTorrent (KATcr)
|
||||
* Legit Torrents
|
||||
* LePorno
|
||||
* LimeTorrents
|
||||
* LinuxTracker
|
||||
* MacTorrents
|
||||
* Magnet4You
|
||||
* MagnetDL
|
||||
@@ -81,28 +83,37 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
|
||||
* Monova
|
||||
* MovCr
|
||||
* MoviesDVDR
|
||||
* MyPornClub
|
||||
* Newpct (aka: tvsinpagar, descargas2020, torrentlocura, torrentrapid, tumejortorrent, pctnew, etc)
|
||||
* Newstudio
|
||||
* Nitro
|
||||
* NNTT
|
||||
* NoName Club (NNM-Club)
|
||||
* Nyaa.si
|
||||
* Nyaa-Pantsu
|
||||
* Nyaa.si
|
||||
* OneJAV
|
||||
* OxTorrent
|
||||
* ParnuXi
|
||||
* PiratBit
|
||||
* Pirateiro
|
||||
* PornLeech
|
||||
* PornoLive
|
||||
* PornoRip
|
||||
* PornoTor
|
||||
* ProStyleX
|
||||
* Rapidzona
|
||||
* RARBG
|
||||
* Rus-media
|
||||
* RuTor
|
||||
* RuTracker.RU
|
||||
* Seedpeer
|
||||
* shokweb
|
||||
* ShowRSS
|
||||
* SkyTorrentsClone
|
||||
* SolidTorrents
|
||||
* sukebei.Nyaa.si
|
||||
* sosulki
|
||||
* sukebei-Pantsu
|
||||
* sukebei.Nyaa.si
|
||||
* TFile
|
||||
* The Pirate Bay (TPB)
|
||||
* Tokyo Tosho
|
||||
@@ -110,6 +121,8 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
|
||||
* Torlock
|
||||
* TOROS
|
||||
* Torrent Downloads (TD)
|
||||
* Torrent Oyun indir
|
||||
* torrent-pirat
|
||||
* Torrent4You
|
||||
* Torrent9
|
||||
* Torrent9Clone
|
||||
@@ -119,49 +132,57 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
|
||||
* TorrentKitty
|
||||
* TorrentParadise
|
||||
* TorrentProject2
|
||||
* TorrentRex
|
||||
* TorrentQuest
|
||||
* Torrents.csv
|
||||
* TorrentWal
|
||||
* Torrentv
|
||||
* TorrentView
|
||||
* Torrentz2
|
||||
* Underverse
|
||||
* UnionDHT
|
||||
* xxxtor
|
||||
* YourBittorrent
|
||||
* YTS.ag
|
||||
* zetorrents
|
||||
* Zooqle
|
||||
</details>
|
||||
|
||||
<details> <summary> <b> Supported Semi-Private Trackers </b> </summary>
|
||||
|
||||
* Alein
|
||||
* AlexFilm
|
||||
* AniDUB
|
||||
* ArenaBG
|
||||
* BaibaKo
|
||||
* BookTracker
|
||||
* CasStudioTV
|
||||
* Crazy's Corner
|
||||
* CzTorrent
|
||||
* Deildu
|
||||
* DXP (Deaf Experts)
|
||||
* Deildu
|
||||
* EniaHD
|
||||
* Erzsebet
|
||||
* ExKinoRay
|
||||
* ExtremlymTorrents
|
||||
* FilmsClub
|
||||
* Gay-Torrents.net
|
||||
* Gay-Torrents.org
|
||||
* HamsterStudio
|
||||
* HD Dolby
|
||||
* HamsterStudio
|
||||
* IV-Torrents
|
||||
* KinoNaVse100
|
||||
* Kinozal
|
||||
* Korsar
|
||||
* LostFilm.tv
|
||||
* MVGroup Forum
|
||||
* MVGroup Main
|
||||
* Marine Tracker
|
||||
* Metal Tracker
|
||||
* MuziekFrabriek
|
||||
* MVGroup Forum
|
||||
* MVGroup Main
|
||||
* NetHD (VietTorrent)
|
||||
* Pornolab
|
||||
* RiperAM
|
||||
* RockBox
|
||||
* Rustorka
|
||||
* RuTracker
|
||||
* Rustorka
|
||||
* Sharewood
|
||||
* SkTorrent
|
||||
* SoundPark
|
||||
@@ -183,6 +204,7 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
|
||||
* 4thD (4th Dimension)
|
||||
* 52PT
|
||||
* 720pier
|
||||
* AST4u
|
||||
* Abnormal
|
||||
* Acid Lounge (A-L)
|
||||
* Aftershock
|
||||
@@ -194,54 +216,56 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
|
||||
* Araba Fenice (Phoenix)
|
||||
* Asgaard (AG)
|
||||
* AsianCinema
|
||||
* AST4u
|
||||
* Audiobook Torrents (ABT)
|
||||
* AudioNews (AN)
|
||||
* Awesome-HD (AHD)
|
||||
* Audiobook Torrents (ABT)
|
||||
* Avistaz (AsiaTorrents)
|
||||
* Back-ups
|
||||
* BakaBT
|
||||
* BaconBits (bB)
|
||||
* BeiTai
|
||||
* BeyondHD (BHD)
|
||||
* Bibliotik
|
||||
* Awesome-HD (AHD)
|
||||
* BaibaKo
|
||||
* BIGTorrent
|
||||
* BigTower
|
||||
* Bit-City Reloaded
|
||||
* BIT-HDTV
|
||||
* BiT-TiTAN
|
||||
* Bithorlo (BHO)
|
||||
* BitHUmen
|
||||
* Bitspyder
|
||||
* BitTorrentFiles
|
||||
* BitTurk
|
||||
* BJ-Share (BJ)
|
||||
* BlueBird
|
||||
* Blutopia (BLU)
|
||||
* Brasil Tracker
|
||||
* BroadcastTheNet (BTN)
|
||||
* BroadCity
|
||||
* BRObits
|
||||
* BrokenStones
|
||||
* BTGigs (TG)
|
||||
* BTNext (BTNT)
|
||||
* BTSCHOOL
|
||||
* Carpathians
|
||||
* CartoonChaos (CC)
|
||||
* CasaTorrent
|
||||
* Back-ups
|
||||
* BaconBits (bB)
|
||||
* BakaBT
|
||||
* BeiTai
|
||||
* BeyondHD (BHD)
|
||||
* BiT-TiTAN
|
||||
* Bibliotik
|
||||
* BigTower
|
||||
* Bit-City Reloaded
|
||||
* BitHUmen
|
||||
* BitTorrentFiles
|
||||
* BitTurk
|
||||
* Bithorlo (BHO)
|
||||
* Bitspyder
|
||||
* BlueBird
|
||||
* Blutopia (BLU)
|
||||
* Boxing Torrents
|
||||
* Brasil Tracker
|
||||
* BroadCity
|
||||
* BroadcastTheNet (BTN)
|
||||
* BrokenStones
|
||||
* CCFBits
|
||||
* CGPeers
|
||||
* CHDBits
|
||||
* Carpathians
|
||||
* CartoonChaos (CC)
|
||||
* CasaTorrent
|
||||
* ChannelX
|
||||
* Cinemageddon
|
||||
* CinemaMovies
|
||||
* Cinematik
|
||||
* CinemaZ (EuTorrents)
|
||||
* Cinemageddon
|
||||
* Cinematik
|
||||
* Classix
|
||||
* Concertos
|
||||
* CrazyHD
|
||||
* CrazySpirits
|
||||
* CrnaBerza
|
||||
* DXDHD
|
||||
* DanishBits (DB)
|
||||
* Das Unerwartete
|
||||
* DataScene (DS)
|
||||
@@ -255,18 +279,16 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
|
||||
* DocumentaryTorrents (DT)
|
||||
* Downloadville
|
||||
* Dragonworld Reloaded
|
||||
* DXDHD
|
||||
* EbookParadijs
|
||||
* Ebooks-Shares
|
||||
* EfectoDoppler
|
||||
* EggMeOn
|
||||
* Elite-Tracker
|
||||
* Empornium (EMP)
|
||||
* eShareNet
|
||||
* eStone (XiDER, BeLoad)
|
||||
* Ethor.net (Thor's Land)
|
||||
* ExoticaZ (YourExotic)
|
||||
* ExtremeTorrents
|
||||
* FANO.IN
|
||||
* Fantastic Heaven
|
||||
* FeedUrNeed (FuN)
|
||||
* Femdomcult
|
||||
* FileList (FL)
|
||||
@@ -278,24 +300,22 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
|
||||
* FunFile (FF)
|
||||
* FunkyTorrents (FT)
|
||||
* Fuzer (FZ)
|
||||
* Galeriens (LaPauseTorrents)
|
||||
* GAYtorrent.ru
|
||||
* GFXPeers
|
||||
* Galeriens (LaPauseTorrents)
|
||||
* GazelleGames (GGn)
|
||||
* Generation-Free
|
||||
* GFXPeers
|
||||
* GigaTorrents
|
||||
* GimmePeers (formerly ILT) <!-- maintained by jamesb2147 -->
|
||||
* GimmePeers (formerly ILT)
|
||||
* GiroTorrent
|
||||
* Greek Legends
|
||||
* Greek Team
|
||||
* HacheDe
|
||||
* HD-Bits.com
|
||||
* HD-Forever (HDF)
|
||||
* HD-Olimpo
|
||||
* HD-Only (HDO)
|
||||
* HD-Space (HDS)
|
||||
* HD-Spain
|
||||
* HD-Torrents (HDT)
|
||||
* HD-Bits.com
|
||||
* HD4FANS
|
||||
* HDArea (HDA)
|
||||
* HDBits
|
||||
@@ -312,23 +332,25 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
|
||||
* HDTurk
|
||||
* HDU
|
||||
* HDZone
|
||||
* HQSource (HQS)
|
||||
* HacheDe
|
||||
* Hebits
|
||||
* Hon3y HD
|
||||
* HQSource (HQS)
|
||||
* HuSh
|
||||
* ICE Torrent
|
||||
* IPTorrents (IPT)
|
||||
* ImmortalSeed (iS)
|
||||
* Immortuos
|
||||
* inPeril
|
||||
* Insane Tracker
|
||||
* IPTorrents (IPT)
|
||||
* JPopsuki
|
||||
* Kapaki
|
||||
* Karagarga
|
||||
* LegacyHD (HD4Free)
|
||||
* LastFiles
|
||||
* Le Saloon
|
||||
* LeChaudron
|
||||
* LeagueHD
|
||||
* LearnFlakes
|
||||
* LegacyHD (HD4Free)
|
||||
* LibraNet (LN)
|
||||
* LinkoManija
|
||||
* LosslessClub
|
||||
@@ -336,11 +358,11 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
|
||||
* Magico (Trellas)
|
||||
* Majomparádé (TurkDepo)
|
||||
* MicroBit (µBit)
|
||||
* MMA-Torrents
|
||||
* MoeCat
|
||||
* Mononoké-BT
|
||||
* MoreThanTV (MTV)
|
||||
* MyAnonamouse (MAM)
|
||||
* myAmity
|
||||
* MySpleen
|
||||
* NBTorrents
|
||||
* NCore
|
||||
@@ -350,57 +372,54 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
|
||||
* New Real World
|
||||
* Norbits
|
||||
* NordicBits (NB)
|
||||
* NORDiCHD
|
||||
* Nostalgic (The Archive)
|
||||
* notwhat.cd
|
||||
* Nostalgic (The Archive / VHSTAPES)
|
||||
* OnlineSelfEducation
|
||||
* Orpheus
|
||||
* Ourbits (HDPter)
|
||||
* P2PBG
|
||||
* P2PElite
|
||||
* PT99
|
||||
* PTFiles (PTF)
|
||||
* PThome
|
||||
* PWTorrents (PWT)
|
||||
* Partis
|
||||
* PassThePopcorn (PTP)
|
||||
* Peers.FM
|
||||
* PiXELHD (PxHD)
|
||||
* PirateTheNet (PTN)
|
||||
* PixelCove (Ultimate Gamer)
|
||||
* PiXELHD (PxHD)
|
||||
* Pleasuredome
|
||||
* PolishSource (PS)
|
||||
* PolishTracker
|
||||
* Pornbay
|
||||
* PornBits (PB)
|
||||
* Pornbay
|
||||
* Pretome
|
||||
* PrivateHD (PHD)
|
||||
* ProAudioTorrents (PAT)
|
||||
* Psytorrents
|
||||
* PT99
|
||||
* PTFiles (PTF)
|
||||
* PThome
|
||||
* PuntoTorrent
|
||||
* PWTorrents (PWT)
|
||||
* R3V WTF!
|
||||
* RPTorrents
|
||||
* Racing4Everyone (R4E)
|
||||
* RacingForMe (RFM)
|
||||
* RainbowNation Sharing (RNS)
|
||||
* Redacted (PassTheHeadphones)
|
||||
* Red Star Torrent (RST)
|
||||
* Redacted (PassTheHeadphones)
|
||||
* RetroFlix
|
||||
* RevolutionTT
|
||||
* RoDVD (Cinefiles)
|
||||
* Romanian Metal Torrent (RMT)
|
||||
* RPTorrents
|
||||
* SDBits
|
||||
* SceneFZ
|
||||
* SceneHD
|
||||
* ScenePalace (SP)
|
||||
* SceneRush
|
||||
* SceneTime
|
||||
* SceneXpress
|
||||
* SDBits
|
||||
* Secret Cinema
|
||||
* SeedFile (SF)
|
||||
* Shareisland
|
||||
* ShareSpaceDB
|
||||
* ShareUniversity
|
||||
* Shareisland
|
||||
* Shazbat
|
||||
* Shellife (SL)
|
||||
* SiamBIT
|
||||
@@ -408,61 +427,63 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
|
||||
* SpaceTorrent
|
||||
* SpeedCD
|
||||
* SpeedTorrent Reloaded
|
||||
* Spirit of Revolution
|
||||
* SportHD
|
||||
* SportsCult
|
||||
* SpringSunday
|
||||
* SuperBits (SBS)
|
||||
* TEKNO3D
|
||||
* TLFBits
|
||||
* TOrrent-tuRK (TORK)
|
||||
* TTsWEB
|
||||
* TV Chaos UK (TVCUK)
|
||||
* TV-Vault
|
||||
* TVstore
|
||||
* TakeaByte
|
||||
* Tapochek
|
||||
* Tasmanit
|
||||
* TeamHD
|
||||
* TeamOS
|
||||
* TEKNO3D
|
||||
* TellyTorrent
|
||||
* TenYardTorrents (TYT)
|
||||
* TheAudioScene
|
||||
* TheEmpire (TE)
|
||||
* The Falling Angels (TFA)
|
||||
* The Geeks
|
||||
* The Horror Charnel (THC)
|
||||
* The New Retro
|
||||
* The Occult
|
||||
* The Place
|
||||
* The Resurrection
|
||||
* The Shinning (TsH)
|
||||
* The Show
|
||||
* The-Madhouse
|
||||
* The Vault
|
||||
* TLFBits
|
||||
* The-Madhouse
|
||||
* TheAudioScene
|
||||
* TheEmpire (TE)
|
||||
* ToTheGlory
|
||||
* Torrent Network (TN)
|
||||
* Torrent Sector Crew (TSC)
|
||||
* Torrent-Syndikat
|
||||
* Torrent.LT
|
||||
* TorrentBD
|
||||
* TorrentBytes (TBy)
|
||||
* TorrentCCF (TCCF)
|
||||
* TorrentDay (TD)
|
||||
* Torrentech (TTH)
|
||||
* TorrentFactory
|
||||
* TorrentHeaven
|
||||
* TorrentHR
|
||||
* Torrenting (TT)
|
||||
* Torrentland
|
||||
* TorrentHeaven
|
||||
* TorrentLeech (TL)
|
||||
* TorrentLeech.pl
|
||||
* TorrentSeeds (TS)
|
||||
* Torrent-Syndikat
|
||||
* TOrrent-tuRK (TORK)
|
||||
* Torrentech (TTH)
|
||||
* Torrenting (TT)
|
||||
* Torrentland
|
||||
* TotallyKids (TK)
|
||||
* ToTheGlory
|
||||
* TranceTraffic
|
||||
* Trezzor
|
||||
* TurkTorrent (TT)
|
||||
* TV Chaos UK (TVCUK)
|
||||
* TV-Vault
|
||||
* TVstore
|
||||
* Twilight Torrents
|
||||
* Twilights Zoom
|
||||
* u-torrents (SceneFZ)
|
||||
* U-Torrents
|
||||
* U2 (U2分享園@動漫花園)
|
||||
* UHDBits
|
||||
* UnionGang
|
||||
* UnlimitZ
|
||||
@@ -470,17 +491,22 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
|
||||
* WDT (Wrestling Desires Torrents / Ultimate Wrestling Torrents)
|
||||
* World-In-HD
|
||||
* World-of-Tomorrow
|
||||
* x-ite.me (XM)
|
||||
* xBytesV2
|
||||
* XSpeeds (XS)
|
||||
* XWTorrents (XWT)
|
||||
* XWT-Classics
|
||||
* XWTorrents (XWT)
|
||||
* Xthor
|
||||
* XtremeFile
|
||||
* XtreMeZone (MYXZ)
|
||||
* ExoticaZ (YourExotic)
|
||||
* XtremeFile
|
||||
* Zamunda.net
|
||||
* Zelka.org
|
||||
* eShareNet
|
||||
* eStone (XiDER, BeLoad)
|
||||
* inPeril
|
||||
* myAmity
|
||||
* notwhat.cd
|
||||
* u-torrents (SceneFZ)
|
||||
* x-ite.me (XM)
|
||||
* xBytesV2
|
||||
</details>
|
||||
|
||||
Trackers marked with [![(invite needed)][inviteneeded]](#) have no active maintainer and are missing features or are broken. If you have an invite for them please send it to garfieldsixtynine -at- gmail.com to get them fixed/improved.
|
||||
|
@@ -1,20 +1,20 @@
|
||||
author "sea3pea0"
|
||||
description "Upstart Script to run NzbDrone as a service on Ubuntu/Debian based systems, as well as others"
|
||||
|
||||
#Set username for the process. Should probably be what you use for logging in
|
||||
setuid {username to run jackett}
|
||||
setgid users
|
||||
|
||||
#This is the install directory. If you installed using a deb package or the NzbDrone Repository you do not need to change this
|
||||
|
||||
env DIR=/opt/Jackett
|
||||
env LD_LIBRARY_PATH=/usr/local/nzbdrone/lib
|
||||
|
||||
start on runlevel [2345]
|
||||
stop on runlevel [016]
|
||||
|
||||
respawn
|
||||
script
|
||||
chdir $DIR
|
||||
exec /volume1/@appstore/Mono/usr/bin/mono --debug JackettConsole.exe
|
||||
end script
|
||||
author "sea3pea0"
|
||||
description "Upstart Script to run NzbDrone as a service on Ubuntu/Debian based systems, as well as others"
|
||||
|
||||
#Set username for the process. Should probably be what you use for logging in
|
||||
setuid {username to run jackett}
|
||||
setgid users
|
||||
|
||||
#This is the install directory. If you installed using a deb package or the NzbDrone Repository you do not need to change this
|
||||
|
||||
env DIR=/opt/Jackett
|
||||
env LD_LIBRARY_PATH=/usr/local/nzbdrone/lib
|
||||
|
||||
start on runlevel [2345]
|
||||
stop on runlevel [016]
|
||||
|
||||
respawn
|
||||
script
|
||||
chdir $DIR
|
||||
exec /volume1/@appstore/Mono/usr/bin/mono --debug JackettConsole.exe
|
||||
end script
|
||||
|
@@ -1,12 +1,19 @@
|
||||
name: $(majorVersion).$(minorVersion).$(patchVersion)
|
||||
variables:
|
||||
majorVersion: 0
|
||||
minorVersion: 13
|
||||
minorVersion: 14
|
||||
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
|
||||
system.debug: true
|
||||
|
||||
pr:
|
||||
autoCancel: true
|
||||
|
||||
trigger:
|
||||
batch: true
|
||||
|
||||
stages:
|
||||
- stage: BuildJackett
|
||||
@@ -352,17 +359,40 @@ stages:
|
||||
patterns: '**/Jackett*'
|
||||
path: $(Build.ArtifactStagingDirectory)
|
||||
|
||||
- task: GitHubRelease@0
|
||||
- task: GitHubRelease@1
|
||||
displayName: Create Github release
|
||||
inputs:
|
||||
gitHubConnection: github.com_jackett
|
||||
repositoryName: '$(Build.Repository.Name)'
|
||||
action: create
|
||||
target: $(Build.SourceVersion)
|
||||
tagSource: manual
|
||||
tagSource: userSpecifiedTag
|
||||
tag: v$(Build.BuildNumber)
|
||||
title: v$(Build.BuildNumber)
|
||||
assets: $(Build.ArtifactStagingDirectory)/drop/*
|
||||
assetUploadMode: replace
|
||||
isDraft: true
|
||||
addChangeLog: true
|
||||
compareWith: lastNonDraftRelease
|
||||
|
||||
- task: PowerShell@2
|
||||
displayName: Ensure all artifacts are uploaded to Github
|
||||
inputs:
|
||||
targetType: inline
|
||||
script: |
|
||||
$json = Invoke-WebRequest 'https://dev.azure.com/jackett/jackett/_apis/build/builds/$(Build.BuildId)/logs?api-version=5.0' | ConvertFrom-Json
|
||||
$lastTwoLogUrls = $json.value[-1..-2].url
|
||||
foreach($logUrl in $lastTwoLogUrls)
|
||||
{
|
||||
Write-Output $logUrl
|
||||
$logText = Invoke-WebRequest $logUrl
|
||||
if ($logText -like '*Creating a release for tag:*')
|
||||
{
|
||||
$logInspect = ($logText -split "Creating a release for tag:")[-1]
|
||||
$successCount = (Select-String "Uploaded file successfully:" -InputObject $logInspect -AllMatches).Matches.Count
|
||||
$failureCount = (Select-String "Duplicate asset found:" -InputObject $logInspect -AllMatches).Matches.Count
|
||||
Write-Output "Success count is: $successCount and failure count is: $failureCount"
|
||||
if (($successCount -ne 7) -or ($failureCount -ne 0)) { Write-Host "##vso[task.complete result=Failed;]DONE" }
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -1,39 +1,66 @@
|
||||
#!/bin/bash
|
||||
|
||||
#Setting up colors
|
||||
# If you have problems installing Jackett, please open an issue on
|
||||
# https://github.com/Jackett/Jackett/issues
|
||||
|
||||
# Setting up colors
|
||||
BOLDRED="$(printf '\033[1;31m')"
|
||||
BOLDGREEN="$(printf '\033[1;32m')"
|
||||
NC="$(printf '\033[0m')" # No Color
|
||||
|
||||
# Stop and unload the service if it's running
|
||||
jackettservice="jackett.service"
|
||||
systemctl stop ${jackettservice}
|
||||
# Check if the install script is running as root
|
||||
if [ "$EUID" -ne 0 ]; then
|
||||
echo "${BOLDRED}ERROR${NC}: Please run this script as root"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Check if Jackett service is running
|
||||
JACKETT_SERVICE="jackett.service"
|
||||
echo "Checking if the service '${JACKETT_SERVICE}' is running ..."
|
||||
if systemctl is-active --quiet "${JACKETT_SERVICE}"; then
|
||||
echo "Service '${JACKETT_SERVICE}' is running"
|
||||
|
||||
# Stop and unload the service
|
||||
if systemctl stop "${JACKETT_SERVICE}"; then
|
||||
echo "Service '${JACKETT_SERVICE}' stopped"
|
||||
else
|
||||
echo "${BOLDRED}ERROR${NC}: The service '${JACKETT_SERVICE}' Can not be stopped"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
else
|
||||
echo "Service '${JACKETT_SERVICE}' is not running"
|
||||
fi
|
||||
|
||||
# Move working directory to Jackett's
|
||||
cd "$(dirname "$0")"
|
||||
JACKETT_DIR="$(dirname "$(readlink -f "$0")")"
|
||||
echo "Jackett will be installed in '${JACKETT_DIR}'"
|
||||
if ! cd "${JACKETT_DIR}"; then
|
||||
echo "${BOLDRED}ERROR${NC}: Can not cd into '${JACKETT_DIR}' folder"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Check if we're running from Jackett's directory
|
||||
if [ ! -f ./jackett ]; then
|
||||
echo "${BOLDRED}ERROR${NC}: Couldn't locate jackett. Is the script in the right directory?"
|
||||
echo "${BOLDRED}ERROR${NC}: Can not locate 'jackett' file in '${JACKETT_DIR}'."
|
||||
echo "Is the script in the right directory?"
|
||||
exit 1
|
||||
fi
|
||||
jackettdir="$(pwd)"
|
||||
|
||||
# Check if Jackett's owner is root
|
||||
jackettuser="$(stat -c "%U" ./jackett)"
|
||||
if [ "${jackettuser}" == "root" ]; then
|
||||
echo "${BOLDRED}ERROR${NC}: Jackett shouldn't run as root. Please, change the owner of the Jackett directory."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Check that no other service called Jackett is already running
|
||||
if [[ $(systemctl status ${jackettservice} | grep "active (running)") ]]; then
|
||||
echo "${BOLDRED}ERROR${NC}: Jackett already seems to be running as a service. Please stop it before running this script again."
|
||||
JACKETT_USER="$(stat -c "%U" ./jackett)"
|
||||
if [ "${JACKETT_USER}" == "root" ] || [ "${JACKETT_USER}" == "UNKNOWN" ] ; then
|
||||
echo "${BOLDRED}ERROR${NC}: The owner of Jackett directory is '${JACKETT_USER}'."
|
||||
echo "Please, change the owner with the command 'chown <user>:<user> -R \"${JACKETT_DIR}\"'"
|
||||
echo "The user <user> will be used to run Jackett."
|
||||
exit 1
|
||||
fi
|
||||
echo "Jackett will be executed with the user '${JACKETT_USER}'"
|
||||
|
||||
# Write the systemd service descriptor
|
||||
cat >"/etc/systemd/system/${jackettservice}" <<EOL
|
||||
JACKETT_SERVICE_PATH="/etc/systemd/system/${JACKETT_SERVICE}"
|
||||
echo "Creating Jackett unit file in '${JACKETT_SERVICE_PATH}' ..."
|
||||
cat > "${JACKETT_SERVICE_PATH}" <<EOL
|
||||
[Unit]
|
||||
Description=Jackett Daemon
|
||||
After=network.target
|
||||
@@ -43,35 +70,39 @@ SyslogIdentifier=jackett
|
||||
Restart=always
|
||||
RestartSec=5
|
||||
Type=simple
|
||||
User=${jackettuser}
|
||||
Group=${jackettuser}
|
||||
WorkingDirectory=${jackettdir}
|
||||
ExecStart=${jackettdir}/jackett_launcher.sh
|
||||
TimeoutStopSec=20
|
||||
User=${JACKETT_USER}
|
||||
Group=${JACKETT_USER}
|
||||
WorkingDirectory=${JACKETT_DIR}
|
||||
ExecStart=/bin/sh "${JACKETT_DIR}/jackett_launcher.sh"
|
||||
TimeoutStopSec=30
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
|
||||
EOL
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "${BOLDRED}ERROR${NC}: Can not create the file '${JACKETT_SERVICE_PATH}'"
|
||||
echo "The UnitPath of systemd changes from one distribution to another. You may have to edit the script and change the path manually."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "Installing Jackett service ..."
|
||||
# Reload systemd daemon
|
||||
systemctl daemon-reload
|
||||
if ! systemctl daemon-reload; then
|
||||
echo "${BOLDRED}ERROR${NC}: Can not reload systemd daemon"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Enable the service for following restarts
|
||||
systemctl enable ${jackettservice}
|
||||
if ! systemctl enable "${JACKETT_SERVICE}"; then
|
||||
echo "${BOLDRED}ERROR${NC}: Can not enable the service '${JACKETT_SERVICE}'"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Run the service
|
||||
systemctl start ${jackettservice}
|
||||
|
||||
# Check that it's running
|
||||
if [[ $(systemctl status ${jackettservice} | grep "active (running)") ]]; then
|
||||
echo "${BOLDGREEN}Agent successfully installed and launched!${NC}"
|
||||
if systemctl start "${JACKETT_SERVICE}"; then
|
||||
echo "${BOLDGREEN}Service successfully installed and launched!${NC}"
|
||||
else
|
||||
cat << EOL
|
||||
${BOLDRED}ERROR${NC}: Could not launch service. The installation might have failed.
|
||||
Please open an issue on https://github.com/Jackett/Jackett/issues and paste following information:
|
||||
Jackett directory: \`${jackettdir}\`
|
||||
Jackett user: \`${jackettuser}\`
|
||||
|
||||
EOL
|
||||
echo "${BOLDRED}ERROR${NC}: Can not start the service '${JACKETT_SERVICE}'"
|
||||
exit 1
|
||||
fi
|
||||
|
@@ -1,43 +1,75 @@
|
||||
#!/bin/bash
|
||||
|
||||
#Setting up colors
|
||||
# If you have problems installing Jackett, please open an issue on
|
||||
# https://github.com/Jackett/Jackett/issues
|
||||
|
||||
# Setting up colors
|
||||
BOLDRED="$(printf '\033[1;31m')"
|
||||
BOLDGREEN="$(printf '\033[1;32m')"
|
||||
NC="$(printf '\033[0m')" # No Color
|
||||
|
||||
# Stop and unload the service if it's running
|
||||
jackettservice="jackett.service"
|
||||
systemctl stop ${jackettservice}
|
||||
# Check if the install script is running as root
|
||||
if [ "$EUID" -ne 0 ]; then
|
||||
echo "${BOLDRED}ERROR${NC}: Please run this script as root"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Check if Jackett service is running
|
||||
JACKETT_SERVICE="jackett.service"
|
||||
echo "Checking if the service '${JACKETT_SERVICE}' is running ..."
|
||||
if systemctl is-active --quiet "${JACKETT_SERVICE}"; then
|
||||
echo "Service '${JACKETT_SERVICE}' is running"
|
||||
|
||||
# Stop and unload the service
|
||||
if systemctl stop "${JACKETT_SERVICE}"; then
|
||||
echo "Service '${JACKETT_SERVICE}' stopped"
|
||||
else
|
||||
echo "${BOLDRED}ERROR${NC}: The service '${JACKETT_SERVICE}' Can not be stopped"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
else
|
||||
echo "Service '${JACKETT_SERVICE}' is not running"
|
||||
fi
|
||||
|
||||
# Move working directory to Jackett's
|
||||
cd "$(dirname "$0")"
|
||||
JACKETT_DIR="$(dirname "$(readlink -f "$0")")"
|
||||
echo "Jackett will be installed in '${JACKETT_DIR}'"
|
||||
if ! cd "${JACKETT_DIR}"; then
|
||||
echo "${BOLDRED}ERROR${NC}: Can not cd into '${JACKETT_DIR}' folder"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Check if we're running from Jackett's directory
|
||||
if [ ! -f ./JackettConsole.exe ]; then
|
||||
echo "${BOLDRED}ERROR${NC}: Couldn't locate JackettConsole.exe. Is the script in the right directory?"
|
||||
echo "${BOLDRED}ERROR${NC}: Can not locate 'JackettConsole.exe' file in '${JACKETT_DIR}'."
|
||||
echo "Is the script in the right directory?"
|
||||
exit 1
|
||||
fi
|
||||
jackettdir="$(pwd)"
|
||||
|
||||
# Check if Jackett's owner is root
|
||||
jackettuser="$(stat -c "%U" ./JackettConsole.exe)"
|
||||
if [ "${jackettuser}" == "root" ]; then
|
||||
echo "${BOLDRED}ERROR${NC}: Jackett shouldn't run as root. Please, change the owner of the Jackett directory."
|
||||
JACKETT_USER="$(stat -c "%U" ./JackettConsole.exe)"
|
||||
if [ "${JACKETT_USER}" == "root" ] || [ "${JACKETT_USER}" == "UNKNOWN" ] ; then
|
||||
echo "${BOLDRED}ERROR${NC}: The owner of Jackett directory is '${JACKETT_USER}'."
|
||||
echo "Please, change the owner with the command 'chown <user>:<user> -R \"${JACKETT_DIR}\"'"
|
||||
echo "The user <user> will be used to run Jackett."
|
||||
exit 1
|
||||
fi
|
||||
echo "Jackett will be executed with the user '${JACKETT_USER}'"
|
||||
|
||||
# Check if mono is installed
|
||||
command -v mono >/dev/null 2>&1 || { echo >&2 "${BOLDRED}ERROR${NC}: Jackett requires Mono but it's not installed. Aborting."; exit 1; }
|
||||
monodir="$(dirname $(command -v mono))"
|
||||
|
||||
# Check that no other service called Jackett is already running
|
||||
if [[ $(systemctl status ${jackettservice} | grep "active (running)") ]]; then
|
||||
echo "${BOLDRED}ERROR${NC}: Jackett already seems to be running as a service. Please stop it before running this script again."
|
||||
# Check if Mono is installed
|
||||
echo "Checking if Mono is installed ..."
|
||||
if ! command -v mono > /dev/null; then
|
||||
echo "${BOLDRED}ERROR${NC}: Jackett requires Mono but it's not installed"
|
||||
exit 1
|
||||
fi
|
||||
MONO_DIR="$(dirname "$(command -v mono)")"
|
||||
echo "Mono is installed in '${MONO_DIR}'"
|
||||
|
||||
# Write the systemd service descriptor
|
||||
cat >"/etc/systemd/system/${jackettservice}" <<EOL
|
||||
JACKETT_SERVICE_PATH="/etc/systemd/system/${JACKETT_SERVICE}"
|
||||
echo "Creating Jackett unit file in '${JACKETT_SERVICE_PATH}' ..."
|
||||
cat > "${JACKETT_SERVICE_PATH}" <<EOL
|
||||
[Unit]
|
||||
Description=Jackett Daemon
|
||||
After=network.target
|
||||
@@ -47,36 +79,39 @@ SyslogIdentifier=jackett
|
||||
Restart=always
|
||||
RestartSec=5
|
||||
Type=simple
|
||||
User=${jackettuser}
|
||||
Group=${jackettuser}
|
||||
WorkingDirectory=${jackettdir}
|
||||
ExecStart=${monodir}/mono --debug ${jackettdir}/JackettConsole.exe --NoRestart
|
||||
TimeoutStopSec=20
|
||||
User=${JACKETT_USER}
|
||||
Group=${JACKETT_USER}
|
||||
WorkingDirectory=${JACKETT_DIR}
|
||||
ExecStart="${MONO_DIR}/mono" --debug "${JACKETT_DIR}/JackettConsole.exe" --NoRestart
|
||||
TimeoutStopSec=30
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
|
||||
EOL
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "${BOLDRED}ERROR${NC}: Can not create the file '${JACKETT_SERVICE_PATH}'"
|
||||
echo "The UnitPath of systemd changes from one distribution to another. You may have to edit the script and change the path manually."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "Installing Jackett service ..."
|
||||
# Reload systemd daemon
|
||||
systemctl daemon-reload
|
||||
if ! systemctl daemon-reload; then
|
||||
echo "${BOLDRED}ERROR${NC}: Can not reload systemd daemon"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Enable the service for following restarts
|
||||
systemctl enable ${jackettservice}
|
||||
if ! systemctl enable "${JACKETT_SERVICE}"; then
|
||||
echo "${BOLDRED}ERROR${NC}: Can not enable the service '${JACKETT_SERVICE}'"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Run the service
|
||||
systemctl start ${jackettservice}
|
||||
|
||||
# Check that it's running
|
||||
if [[ $(systemctl status ${jackettservice} | grep "active (running)") ]]; then
|
||||
echo "${BOLDGREEN}Agent successfully installed and launched!${NC}"
|
||||
if systemctl start "${JACKETT_SERVICE}"; then
|
||||
echo "${BOLDGREEN}Service successfully installed and launched!${NC}"
|
||||
else
|
||||
cat << EOL
|
||||
${BOLDRED}ERROR${NC}: Could not launch service. The installation might have failed.
|
||||
Please open an issue on https://github.com/Jackett/Jackett/issues and paste following information:
|
||||
Mono directory: \`${monodir}\`
|
||||
Jackett directory: \`${jackettdir}\`
|
||||
Jackett user: \`${jackettuser}\`
|
||||
|
||||
EOL
|
||||
echo "${BOLDRED}ERROR${NC}: Can not start the service '${JACKETT_SERVICE}'"
|
||||
exit 1
|
||||
fi
|
||||
|
@@ -7,12 +7,12 @@
|
||||
JACKETT_DIR="$(dirname "$(readlink -f "$0")")"
|
||||
|
||||
# Launch Jackett
|
||||
${JACKETT_DIR}/jackett --NoRestart
|
||||
"${JACKETT_DIR}/jackett" --NoRestart
|
||||
|
||||
# Get user running the service
|
||||
JACKETT_USER=$(whoami)
|
||||
|
||||
# Wait until the updater ends
|
||||
while pgrep -u ${JACKETT_USER} JackettUpdater > /dev/null; do
|
||||
while pgrep -u "${JACKETT_USER}" JackettUpdater > /dev/null; do
|
||||
sleep 1
|
||||
done
|
||||
|
@@ -9,6 +9,10 @@
|
||||
using System;
|
||||
using System.Text.RegularExpressions;
|
||||
|
||||
// ReSharper disable NotAccessedField.Global
|
||||
// ReSharper disable MemberCanBePrivate.Global
|
||||
// ReSharper disable UnusedMember.Global
|
||||
|
||||
namespace DateTimeRoutines
|
||||
{
|
||||
/// <summary>
|
||||
@@ -21,11 +25,11 @@ namespace DateTimeRoutines
|
||||
/// <summary>
|
||||
/// Amount of seconds elapsed between 1970-01-01 00:00:00 and the date-time.
|
||||
/// </summary>
|
||||
/// <param name="date_time">date-time</param>
|
||||
/// <param name="dateTime">date-time</param>
|
||||
/// <returns>seconds</returns>
|
||||
public static uint GetSecondsSinceUnixEpoch(this DateTime date_time)
|
||||
public static uint GetSecondsSinceUnixEpoch(this DateTime dateTime)
|
||||
{
|
||||
var t = date_time - new DateTime(1970, 1, 1);
|
||||
var t = dateTime - new DateTime(1970, 1, 1);
|
||||
var ss = (int)t.TotalSeconds;
|
||||
if (ss < 0)
|
||||
return 0;
|
||||
@@ -44,19 +48,19 @@ namespace DateTimeRoutines
|
||||
/// <summary>
|
||||
/// Index of first char of a date substring found in the string
|
||||
/// </summary>
|
||||
public readonly int IndexOfDate = -1;
|
||||
public readonly int IndexOfDate;
|
||||
/// <summary>
|
||||
/// Length a date substring found in the string
|
||||
/// </summary>
|
||||
public readonly int LengthOfDate = -1;
|
||||
public readonly int LengthOfDate;
|
||||
/// <summary>
|
||||
/// Index of first char of a time substring found in the string
|
||||
/// </summary>
|
||||
public readonly int IndexOfTime = -1;
|
||||
public readonly int IndexOfTime;
|
||||
/// <summary>
|
||||
/// Length of a time substring found in the string
|
||||
/// </summary>
|
||||
public readonly int LengthOfTime = -1;
|
||||
public readonly int LengthOfTime;
|
||||
/// <summary>
|
||||
/// DateTime found in the string
|
||||
/// </summary>
|
||||
@@ -82,45 +86,45 @@ namespace DateTimeRoutines
|
||||
/// </summary>
|
||||
public DateTime UtcDateTime;
|
||||
|
||||
internal ParsedDateTime(int index_of_date, int length_of_date, int index_of_time, int length_of_time, DateTime date_time)
|
||||
internal ParsedDateTime(int indexOfDate, int lengthOfDate, int indexOfTime, int lengthOfTime, DateTime dateTime)
|
||||
{
|
||||
IndexOfDate = index_of_date;
|
||||
LengthOfDate = length_of_date;
|
||||
IndexOfTime = index_of_time;
|
||||
LengthOfTime = length_of_time;
|
||||
DateTime = date_time;
|
||||
IsDateFound = index_of_date > -1;
|
||||
IsTimeFound = index_of_time > -1;
|
||||
IndexOfDate = indexOfDate;
|
||||
LengthOfDate = lengthOfDate;
|
||||
IndexOfTime = indexOfTime;
|
||||
LengthOfTime = lengthOfTime;
|
||||
DateTime = dateTime;
|
||||
IsDateFound = indexOfDate > -1;
|
||||
IsTimeFound = indexOfTime > -1;
|
||||
UtcOffset = new TimeSpan(25, 0, 0);
|
||||
IsUtcOffsetFound = false;
|
||||
UtcDateTime = new DateTime(1, 1, 1);
|
||||
}
|
||||
|
||||
internal ParsedDateTime(int index_of_date, int length_of_date, int index_of_time, int length_of_time, DateTime date_time, TimeSpan utc_offset)
|
||||
internal ParsedDateTime(int indexOfDate, int lengthOfDate, int indexOfTime, int lengthOfTime, DateTime dateTime, TimeSpan utcOffset)
|
||||
{
|
||||
IndexOfDate = index_of_date;
|
||||
LengthOfDate = length_of_date;
|
||||
IndexOfTime = index_of_time;
|
||||
LengthOfTime = length_of_time;
|
||||
DateTime = date_time;
|
||||
IsDateFound = index_of_date > -1;
|
||||
IsTimeFound = index_of_time > -1;
|
||||
UtcOffset = utc_offset;
|
||||
IsUtcOffsetFound = Math.Abs(utc_offset.TotalHours) < 12;
|
||||
IndexOfDate = indexOfDate;
|
||||
LengthOfDate = lengthOfDate;
|
||||
IndexOfTime = indexOfTime;
|
||||
LengthOfTime = lengthOfTime;
|
||||
DateTime = dateTime;
|
||||
IsDateFound = indexOfDate > -1;
|
||||
IsTimeFound = indexOfTime > -1;
|
||||
UtcOffset = utcOffset;
|
||||
IsUtcOffsetFound = Math.Abs(utcOffset.TotalHours) < 12;
|
||||
if (!IsUtcOffsetFound)
|
||||
UtcDateTime = new DateTime(1, 1, 1);
|
||||
else
|
||||
{
|
||||
if (index_of_date < 0)//to avoid negative date exception when date is undefined
|
||||
if (indexOfDate < 0)//to avoid negative date exception when date is undefined
|
||||
{
|
||||
var ts = date_time.TimeOfDay + utc_offset;
|
||||
var ts = dateTime.TimeOfDay + utcOffset;
|
||||
if (ts < new TimeSpan(0))
|
||||
UtcDateTime = new DateTime(1, 1, 2) + ts;
|
||||
else
|
||||
UtcDateTime = new DateTime(1, 1, 1) + ts;
|
||||
}
|
||||
else
|
||||
UtcDateTime = date_time + utc_offset;
|
||||
UtcDateTime = dateTime + utcOffset;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -129,7 +133,7 @@ namespace DateTimeRoutines
|
||||
/// Date that is accepted in the following cases:
|
||||
/// - no date was parsed by TryParseDateOrTime();
|
||||
/// - no year was found by TryParseDate();
|
||||
/// It is ignored if DefaultDateIsNow = true was set after DefaultDate
|
||||
/// It is ignored if DefaultDateIsNow = true was set after DefaultDate
|
||||
/// </summary>
|
||||
public static DateTime DefaultDate
|
||||
{
|
||||
@@ -138,13 +142,7 @@ namespace DateTimeRoutines
|
||||
_DefaultDate = value;
|
||||
DefaultDateIsNow = false;
|
||||
}
|
||||
get
|
||||
{
|
||||
if (DefaultDateIsNow)
|
||||
return DateTime.Now;
|
||||
else
|
||||
return _DefaultDate;
|
||||
}
|
||||
get => DefaultDateIsNow ? DateTime.Now : _DefaultDate;
|
||||
}
|
||||
|
||||
private static DateTime _DefaultDate = DateTime.Now;
|
||||
@@ -157,16 +155,17 @@ namespace DateTimeRoutines
|
||||
/// <summary>
|
||||
/// Defines default date-time format.
|
||||
/// </summary>
|
||||
[Flags]
|
||||
public enum DateTimeFormat
|
||||
{
|
||||
/// <summary>
|
||||
/// month number goes before day number
|
||||
/// </summary>
|
||||
USA_DATE,
|
||||
UsaDate,
|
||||
/// <summary>
|
||||
/// day number goes before month number
|
||||
/// </summary>
|
||||
UK_DATE,
|
||||
UkDate,
|
||||
///// <summary>
|
||||
///// time is specifed through AM or PM
|
||||
///// </summary>
|
||||
@@ -178,79 +177,79 @@ namespace DateTimeRoutines
|
||||
#region parsing derived methods for DateTime output
|
||||
|
||||
/// <summary>
|
||||
/// Tries to find date and time within the passed string and return it as DateTime structure.
|
||||
/// Tries to find date and time within the passed string and return it as DateTime structure.
|
||||
/// </summary>
|
||||
/// <param name="str">string that contains date and/or time</param>
|
||||
/// <param name="default_format">format to be used preferably in ambivalent instances</param>
|
||||
/// <param name="date_time">parsed date-time output</param>
|
||||
/// <param name="defaultFormat">format to be used preferably in ambivalent instances</param>
|
||||
/// <param name="dateTime">parsed date-time output</param>
|
||||
/// <returns>true if both date and time were found, else false</returns>
|
||||
public static bool TryParseDateTime(this string str, DateTimeFormat default_format, out DateTime date_time)
|
||||
public static bool TryParseDateTime(this string str, DateTimeFormat defaultFormat, out DateTime dateTime)
|
||||
{
|
||||
if (!TryParseDateTime(str, default_format, out ParsedDateTime parsed_date_time))
|
||||
if (!TryParseDateTime(str, defaultFormat, out ParsedDateTime parsedDateTime))
|
||||
{
|
||||
date_time = new DateTime(1, 1, 1);
|
||||
dateTime = new DateTime(1, 1, 1);
|
||||
return false;
|
||||
}
|
||||
date_time = parsed_date_time.DateTime;
|
||||
dateTime = parsedDateTime.DateTime;
|
||||
return true;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Tries to find date and/or time within the passed string and return it as DateTime structure.
|
||||
/// Tries to find date and/or time within the passed string and return it as DateTime structure.
|
||||
/// If only date was found, time in the returned DateTime is always 0:0:0.
|
||||
/// If only time was found, date in the returned DateTime is DefaultDate.
|
||||
/// </summary>
|
||||
/// <param name="str">string that contains date and(or) time</param>
|
||||
/// <param name="default_format">format to be used preferably in ambivalent instances</param>
|
||||
/// <param name="date_time">parsed date-time output</param>
|
||||
/// <param name="defaultFormat">format to be used preferably in ambivalent instances</param>
|
||||
/// <param name="dateTime">parsed date-time output</param>
|
||||
/// <returns>true if date and/or time was found, else false</returns>
|
||||
public static bool TryParseDateOrTime(this string str, DateTimeFormat default_format, out DateTime date_time)
|
||||
public static bool TryParseDateOrTime(this string str, DateTimeFormat defaultFormat, out DateTime dateTime)
|
||||
{
|
||||
if (!TryParseDateOrTime(str, default_format, out ParsedDateTime parsed_date_time))
|
||||
if (!TryParseDateOrTime(str, defaultFormat, out ParsedDateTime parsedDateTime))
|
||||
{
|
||||
date_time = new DateTime(1, 1, 1);
|
||||
dateTime = new DateTime(1, 1, 1);
|
||||
return false;
|
||||
}
|
||||
date_time = parsed_date_time.DateTime;
|
||||
dateTime = parsedDateTime.DateTime;
|
||||
return true;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Tries to find time within the passed string and return it as DateTime structure.
|
||||
/// Tries to find time within the passed string and return it as DateTime structure.
|
||||
/// It recognizes only time while ignoring date, so date in the returned DateTime is always 1/1/1.
|
||||
/// </summary>
|
||||
/// <param name="str">string that contains time</param>
|
||||
/// <param name="default_format">format to be used preferably in ambivalent instances</param>
|
||||
/// <param name="defaultFormat">format to be used preferably in ambivalent instances</param>
|
||||
/// <param name="time">parsed time output</param>
|
||||
/// <returns>true if time was found, else false</returns>
|
||||
public static bool TryParseTime(this string str, DateTimeFormat default_format, out DateTime time)
|
||||
public static bool TryParseTime(this string str, DateTimeFormat defaultFormat, out DateTime time)
|
||||
{
|
||||
if (!TryParseTime(str, default_format, out var parsed_time, null))
|
||||
if (!TryParseTime(str, defaultFormat, out var parsedTime, null))
|
||||
{
|
||||
time = new DateTime(1, 1, 1);
|
||||
return false;
|
||||
}
|
||||
time = parsed_time.DateTime;
|
||||
time = parsedTime.DateTime;
|
||||
return true;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Tries to find date within the passed string and return it as DateTime structure.
|
||||
/// Tries to find date within the passed string and return it as DateTime structure.
|
||||
/// It recognizes only date while ignoring time, so time in the returned DateTime is always 0:0:0.
|
||||
/// If year of the date was not found then it accepts the current year.
|
||||
/// If year of the date was not found then it accepts the current year.
|
||||
/// </summary>
|
||||
/// <param name="str">string that contains date</param>
|
||||
/// <param name="default_format">format to be used preferably in ambivalent instances</param>
|
||||
/// <param name="defaultFormat">format to be used preferably in ambivalent instances</param>
|
||||
/// <param name="date">parsed date output</param>
|
||||
/// <returns>true if date was found, else false</returns>
|
||||
public static bool TryParseDate(this string str, DateTimeFormat default_format, out DateTime date)
|
||||
public static bool TryParseDate(this string str, DateTimeFormat defaultFormat, out DateTime date)
|
||||
{
|
||||
if (!TryParseDate(str, default_format, out ParsedDateTime parsed_date))
|
||||
if (!TryParseDate(str, defaultFormat, out ParsedDateTime parsedDate))
|
||||
{
|
||||
date = new DateTime(1, 1, 1);
|
||||
return false;
|
||||
}
|
||||
date = parsed_date.DateTime;
|
||||
date = parsedDate.DateTime;
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -259,71 +258,69 @@ namespace DateTimeRoutines
|
||||
#region parsing derived methods for ParsedDateTime output
|
||||
|
||||
/// <summary>
|
||||
/// Tries to find date and time within the passed string and return it as ParsedDateTime object.
|
||||
/// Tries to find date and time within the passed string and return it as ParsedDateTime object.
|
||||
/// </summary>
|
||||
/// <param name="str">string that contains date-time</param>
|
||||
/// <param name="default_format">format to be used preferably in ambivalent instances</param>
|
||||
/// <param name="parsed_date_time">parsed date-time output</param>
|
||||
/// <param name="defaultFormat">format to be used preferably in ambivalent instances</param>
|
||||
/// <param name="parsedDateTime">parsed date-time output</param>
|
||||
/// <returns>true if both date and time were found, else false</returns>
|
||||
public static bool TryParseDateTime(this string str, DateTimeFormat default_format, out ParsedDateTime parsed_date_time)
|
||||
public static bool TryParseDateTime(this string str, DateTimeFormat defaultFormat, out ParsedDateTime parsedDateTime)
|
||||
{
|
||||
if (DateTimeRoutines.TryParseDateOrTime(str, default_format, out parsed_date_time)
|
||||
&& parsed_date_time.IsDateFound
|
||||
&& parsed_date_time.IsTimeFound
|
||||
if (TryParseDateOrTime(str, defaultFormat, out parsedDateTime)
|
||||
&& parsedDateTime.IsDateFound
|
||||
&& parsedDateTime.IsTimeFound
|
||||
)
|
||||
return true;
|
||||
|
||||
parsed_date_time = null;
|
||||
parsedDateTime = null;
|
||||
return false;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Tries to find time within the passed string and return it as ParsedDateTime object.
|
||||
/// Tries to find time within the passed string and return it as ParsedDateTime object.
|
||||
/// It recognizes only time while ignoring date, so date in the returned ParsedDateTime is always 1/1/1
|
||||
/// </summary>
|
||||
/// <param name="str">string that contains date-time</param>
|
||||
/// <param name="default_format">format to be used preferably in ambivalent instances</param>
|
||||
/// <param name="parsed_time">parsed date-time output</param>
|
||||
/// <param name="defaultFormat">format to be used preferably in ambivalent instances</param>
|
||||
/// <param name="parsedTime">parsed date-time output</param>
|
||||
/// <returns>true if time was found, else false</returns>
|
||||
public static bool TryParseTime(this string str, DateTimeFormat default_format, out ParsedDateTime parsed_time)
|
||||
{
|
||||
return TryParseTime(str, default_format, out parsed_time, null);
|
||||
}
|
||||
public static bool TryParseTime(this string str, DateTimeFormat defaultFormat, out ParsedDateTime parsedTime)
|
||||
=> TryParseTime(str, defaultFormat, out parsedTime, null);
|
||||
|
||||
/// <summary>
|
||||
/// Tries to find date and/or time within the passed string and return it as ParsedDateTime object.
|
||||
/// Tries to find date and/or time within the passed string and return it as ParsedDateTime object.
|
||||
/// If only date was found, time in the returned ParsedDateTime is always 0:0:0.
|
||||
/// If only time was found, date in the returned ParsedDateTime is DefaultDate.
|
||||
/// </summary>
|
||||
/// <param name="str">string that contains date-time</param>
|
||||
/// <param name="default_format">format to be used preferably in ambivalent instances</param>
|
||||
/// <param name="parsed_date_time">parsed date-time output</param>
|
||||
/// <param name="defaultFormat">format to be used preferably in ambivalent instances</param>
|
||||
/// <param name="parsedDateTime">parsed date-time output</param>
|
||||
/// <returns>true if date or time was found, else false</returns>
|
||||
public static bool TryParseDateOrTime(this string str, DateTimeFormat default_format, out ParsedDateTime parsed_date_time)
|
||||
public static bool TryParseDateOrTime(this string str, DateTimeFormat defaultFormat, out ParsedDateTime parsedDateTime)
|
||||
{
|
||||
parsed_date_time = null;
|
||||
parsedDateTime = null;
|
||||
|
||||
ParsedDateTime parsed_time;
|
||||
if (!TryParseDate(str, default_format, out
|
||||
ParsedDateTime parsed_date))
|
||||
ParsedDateTime parsedTime;
|
||||
if (!TryParseDate(str, defaultFormat, out
|
||||
ParsedDateTime parsedDate))
|
||||
{
|
||||
if (!TryParseTime(str, default_format, out parsed_time, null))
|
||||
if (!TryParseTime(str, defaultFormat, out parsedTime, null))
|
||||
return false;
|
||||
|
||||
var date_time = new DateTime(DefaultDate.Year, DefaultDate.Month, DefaultDate.Day, parsed_time.DateTime.Hour, parsed_time.DateTime.Minute, parsed_time.DateTime.Second);
|
||||
parsed_date_time = new ParsedDateTime(-1, -1, parsed_time.IndexOfTime, parsed_time.LengthOfTime, date_time, parsed_time.UtcOffset);
|
||||
var dateTime = new DateTime(DefaultDate.Year, DefaultDate.Month, DefaultDate.Day, parsedTime.DateTime.Hour, parsedTime.DateTime.Minute, parsedTime.DateTime.Second);
|
||||
parsedDateTime = new ParsedDateTime(-1, -1, parsedTime.IndexOfTime, parsedTime.LengthOfTime, dateTime, parsedTime.UtcOffset);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!TryParseTime(str, default_format, out parsed_time, parsed_date))
|
||||
if (!TryParseTime(str, defaultFormat, out parsedTime, parsedDate))
|
||||
{
|
||||
var date_time = new DateTime(parsed_date.DateTime.Year, parsed_date.DateTime.Month, parsed_date.DateTime.Day, 0, 0, 0);
|
||||
parsed_date_time = new ParsedDateTime(parsed_date.IndexOfDate, parsed_date.LengthOfDate, -1, -1, date_time);
|
||||
var dateTime = new DateTime(parsedDate.DateTime.Year, parsedDate.DateTime.Month, parsedDate.DateTime.Day, 0, 0, 0);
|
||||
parsedDateTime = new ParsedDateTime(parsedDate.IndexOfDate, parsedDate.LengthOfDate, -1, -1, dateTime);
|
||||
}
|
||||
else
|
||||
{
|
||||
var date_time = new DateTime(parsed_date.DateTime.Year, parsed_date.DateTime.Month, parsed_date.DateTime.Day, parsed_time.DateTime.Hour, parsed_time.DateTime.Minute, parsed_time.DateTime.Second);
|
||||
parsed_date_time = new ParsedDateTime(parsed_date.IndexOfDate, parsed_date.LengthOfDate, parsed_time.IndexOfTime, parsed_time.LengthOfTime, date_time, parsed_time.UtcOffset);
|
||||
var dateTime = new DateTime(parsedDate.DateTime.Year, parsedDate.DateTime.Month, parsedDate.DateTime.Day, parsedTime.DateTime.Hour, parsedTime.DateTime.Minute, parsedTime.DateTime.Second);
|
||||
parsedDateTime = new ParsedDateTime(parsedDate.IndexOfDate, parsedDate.LengthOfDate, parsedTime.IndexOfTime, parsedTime.LengthOfTime, dateTime, parsedTime.UtcOffset);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -339,42 +336,39 @@ namespace DateTimeRoutines
|
||||
/// It recognizes only time while ignoring date, so date in the returned ParsedDateTime is always 1/1/1
|
||||
/// </summary>
|
||||
/// <param name="str">string that contains date</param>
|
||||
/// <param name="default_format">format to be used preferably in ambivalent instances</param>
|
||||
/// <param name="parsed_time">parsed date-time output</param>
|
||||
/// <param name="parsed_date">ParsedDateTime object if the date was found within this string, else NULL</param>
|
||||
/// <param name="defaultFormat">format to be used preferably in ambivalent instances</param>
|
||||
/// <param name="parsedTime">parsed date-time output</param>
|
||||
/// <param name="parsedDate">ParsedDateTime object if the date was found within this string, else NULL</param>
|
||||
/// <returns>true if time was found, else false</returns>
|
||||
public static bool TryParseTime(this string str, DateTimeFormat default_format, out ParsedDateTime parsed_time, ParsedDateTime parsed_date)
|
||||
public static bool TryParseTime(this string str, DateTimeFormat defaultFormat, out ParsedDateTime parsedTime, ParsedDateTime parsedDate)
|
||||
{
|
||||
parsed_time = null;
|
||||
parsedTime = null;
|
||||
|
||||
string time_zone_r;
|
||||
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))?";
|
||||
var timeZoneR = defaultFormat == DateTimeFormat.UsaDate ?
|
||||
@"(?:\s*(?'time_zone'UTC|GMT|CST|EST))?" : @"(?:\s*(?'time_zone'UTC|GMT))?";
|
||||
|
||||
Match m;
|
||||
if (parsed_date != null && parsed_date.IndexOfDate > -1)
|
||||
if (parsedDate != null && parsedDate.IndexOfDate > -1)
|
||||
{//look around the found date
|
||||
//look for <date> hh:mm:ss <UTC offset>
|
||||
m = Regex.Match(str.Substring(parsed_date.IndexOfDate + parsed_date.LengthOfDate), @"(?<=^\s*,?\s+|^\s*at\s*|^\s*[T\-]\s*)(?'hour'\d{2})\s*:\s*(?'minute'\d{2})\s*:\s*(?'second'\d{2})\s+(?'offset_sign'[\+\-])(?'offset_hh'\d{2}):?(?'offset_mm'\d{2})(?=$|[^\d\w])", RegexOptions.Compiled);
|
||||
//look for <date> hh:mm:ss <UTC offset>
|
||||
m = Regex.Match(str.Substring(parsedDate.IndexOfDate + parsedDate.LengthOfDate), @"(?<=^\s*,?\s+|^\s*at\s*|^\s*[T\-]\s*)(?'hour'\d{2})\s*:\s*(?'minute'\d{2})\s*:\s*(?'second'\d{2})\s+(?'offset_sign'[\+\-])(?'offset_hh'\d{2}):?(?'offset_mm'\d{2})(?=$|[^\d\w])", RegexOptions.Compiled);
|
||||
if (!m.Success)
|
||||
//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);
|
||||
//look for <date> [h]h:mm[:ss] [PM/AM] [UTC/GMT]
|
||||
m = Regex.Match(str.Substring(parsedDate.IndexOfDate + parsedDate.LengthOfDate), @"(?<=^\s*,?\s+|^\s*at\s*|^\s*[T\-]\s*)(?'hour'\d{1,2})\s*:\s*(?'minute'\d{2})\s*(?::\s*(?'second'\d{2}))?(?:\s*(?'ampm'AM|am|PM|pm))?" + timeZoneR + @"(?=$|[^\d\w])", RegexOptions.Compiled);
|
||||
if (!m.Success)
|
||||
//look for [h]h:mm:ss [PM/AM] [UTC/GMT] <date>
|
||||
m = Regex.Match(str.Substring(0, parsed_date.IndexOfDate), @"(?<=^|[^\d])(?'hour'\d{1,2})\s*:\s*(?'minute'\d{2})\s*(?::\s*(?'second'\d{2}))?(?:\s*(?'ampm'AM|am|PM|pm))?" + time_zone_r + @"(?=$|[\s,]+)", RegexOptions.Compiled);
|
||||
m = Regex.Match(str.Substring(0, parsedDate.IndexOfDate), @"(?<=^|[^\d])(?'hour'\d{1,2})\s*:\s*(?'minute'\d{2})\s*(?::\s*(?'second'\d{2}))?(?:\s*(?'ampm'AM|am|PM|pm))?" + timeZoneR + @"(?=$|[\s,]+)", RegexOptions.Compiled);
|
||||
if (!m.Success)
|
||||
//look for [h]h:mm:ss [PM/AM] [UTC/GMT] within <date>
|
||||
m = Regex.Match(str.Substring(parsed_date.IndexOfDate, parsed_date.LengthOfDate), @"(?<=^|[^\d])(?'hour'\d{1,2})\s*:\s*(?'minute'\d{2})\s*(?::\s*(?'second'\d{2}))?(?:\s*(?'ampm'AM|am|PM|pm))?" + time_zone_r + @"(?=$|[\s,]+)", RegexOptions.Compiled);
|
||||
m = Regex.Match(str.Substring(parsedDate.IndexOfDate, parsedDate.LengthOfDate), @"(?<=^|[^\d])(?'hour'\d{1,2})\s*:\s*(?'minute'\d{2})\s*(?::\s*(?'second'\d{2}))?(?:\s*(?'ampm'AM|am|PM|pm))?" + timeZoneR + @"(?=$|[\s,]+)", RegexOptions.Compiled);
|
||||
}
|
||||
else//look anywhere within string
|
||||
{
|
||||
//look for hh:mm:ss <UTC offset>
|
||||
//look for hh:mm:ss <UTC offset>
|
||||
m = Regex.Match(str, @"(?<=^|\s+|\s*T\s*)(?'hour'\d{2})\s*:\s*(?'minute'\d{2})\s*:\s*(?'second'\d{2})\s+(?'offset_sign'[\+\-])(?'offset_hh'\d{2}):?(?'offset_mm'\d{2})?(?=$|[^\d\w])", RegexOptions.Compiled);
|
||||
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))?" + timeZoneR + @"(?=$|[^\d\w])", RegexOptions.Compiled);
|
||||
}
|
||||
|
||||
if (!m.Success)
|
||||
@@ -398,49 +392,49 @@ namespace DateTimeRoutines
|
||||
return false;
|
||||
}
|
||||
|
||||
if (string.Compare(m.Groups["ampm"].Value, "PM", true) == 0 && hour < 12)
|
||||
if ("PM".Equals(m.Groups["ampm"].Value, StringComparison.OrdinalIgnoreCase) && hour < 12)
|
||||
hour += 12;
|
||||
else if (string.Compare(m.Groups["ampm"].Value, "AM", true) == 0 && hour == 12)
|
||||
else if ("AM".Equals(m.Groups["ampm"].Value, StringComparison.OrdinalIgnoreCase) && hour == 12)
|
||||
hour -= 12;
|
||||
|
||||
var date_time = new DateTime(1, 1, 1, hour, minute, second);
|
||||
var dateTime = new DateTime(1, 1, 1, hour, minute, second);
|
||||
|
||||
if (m.Groups["offset_hh"].Success)
|
||||
{
|
||||
var offset_hh = int.Parse(m.Groups["offset_hh"].Value);
|
||||
var offset_mm = 0;
|
||||
var offsetHh = int.Parse(m.Groups["offset_hh"].Value);
|
||||
var offsetMm = 0;
|
||||
if (m.Groups["offset_mm"].Success)
|
||||
offset_mm = int.Parse(m.Groups["offset_mm"].Value);
|
||||
var utc_offset = new TimeSpan(offset_hh, offset_mm, 0);
|
||||
offsetMm = int.Parse(m.Groups["offset_mm"].Value);
|
||||
var utcOffset = new TimeSpan(offsetHh, offsetMm, 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);
|
||||
utcOffset = -utcOffset;
|
||||
parsedTime = new ParsedDateTime(-1, -1, m.Index, m.Length, dateTime, utcOffset);
|
||||
return true;
|
||||
}
|
||||
|
||||
if (m.Groups["time_zone"].Success)
|
||||
{
|
||||
TimeSpan utc_offset;
|
||||
TimeSpan utcOffset;
|
||||
switch (m.Groups["time_zone"].Value)
|
||||
{
|
||||
case "UTC":
|
||||
case "GMT":
|
||||
utc_offset = new TimeSpan(0, 0, 0);
|
||||
utcOffset = new TimeSpan(0, 0, 0);
|
||||
break;
|
||||
case "CST":
|
||||
utc_offset = new TimeSpan(-6, 0, 0);
|
||||
utcOffset = new TimeSpan(-6, 0, 0);
|
||||
break;
|
||||
case "EST":
|
||||
utc_offset = new TimeSpan(-5, 0, 0);
|
||||
utcOffset = new TimeSpan(-5, 0, 0);
|
||||
break;
|
||||
default:
|
||||
throw new Exception("Time zone: " + m.Groups["time_zone"].Value + " is not defined.");
|
||||
}
|
||||
parsed_time = new ParsedDateTime(-1, -1, m.Index, m.Length, date_time, utc_offset);
|
||||
parsedTime = new ParsedDateTime(-1, -1, m.Index, m.Length, dateTime, utcOffset);
|
||||
return true;
|
||||
}
|
||||
|
||||
parsed_time = new ParsedDateTime(-1, -1, m.Index, m.Length, date_time);
|
||||
parsedTime = new ParsedDateTime(-1, -1, m.Index, m.Length, dateTime);
|
||||
//}
|
||||
//catch(Exception e)
|
||||
//{
|
||||
@@ -450,17 +444,17 @@ namespace DateTimeRoutines
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Tries to find date within the passed string and return it as ParsedDateTime object.
|
||||
/// Tries to find date within the passed string and return it as ParsedDateTime object.
|
||||
/// It recognizes only date while ignoring time, so time in the returned ParsedDateTime is always 0:0:0.
|
||||
/// If year of the date was not found then it accepts the current year.
|
||||
/// If year of the date was not found then it accepts the current year.
|
||||
/// </summary>
|
||||
/// <param name="str">string that contains date</param>
|
||||
/// <param name="default_format">format to be used preferably in ambivalent instances</param>
|
||||
/// <param name="parsed_date">parsed date output</param>
|
||||
/// <param name="defaultFormat">format to be used preferably in ambivalent instances</param>
|
||||
/// <param name="parsedDate">parsed date output</param>
|
||||
/// <returns>true if date was found, else false</returns>
|
||||
public static bool TryParseDate(this string str, DateTimeFormat default_format, out ParsedDateTime parsed_date)
|
||||
public static bool TryParseDate(this string str, DateTimeFormat defaultFormat, out ParsedDateTime parsedDate)
|
||||
{
|
||||
parsed_date = null;
|
||||
parsedDate = null;
|
||||
|
||||
if (string.IsNullOrEmpty(str))
|
||||
return false;
|
||||
@@ -470,17 +464,17 @@ namespace DateTimeRoutines
|
||||
if (m.Success)
|
||||
{
|
||||
DateTime date;
|
||||
if ((default_format ^ DateTimeFormat.USA_DATE) == DateTimeFormat.USA_DATE)
|
||||
if ((defaultFormat ^ DateTimeFormat.UsaDate) == DateTimeFormat.UsaDate)
|
||||
{
|
||||
if (!convert_to_date(int.Parse(m.Groups["year"].Value), int.Parse(m.Groups["day"].Value), int.Parse(m.Groups["month"].Value), out date))
|
||||
if (!ConvertToDate(int.Parse(m.Groups["year"].Value), int.Parse(m.Groups["day"].Value), int.Parse(m.Groups["month"].Value), out date))
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!convert_to_date(int.Parse(m.Groups["year"].Value), int.Parse(m.Groups["month"].Value), int.Parse(m.Groups["day"].Value), out date))
|
||||
if (!ConvertToDate(int.Parse(m.Groups["year"].Value), int.Parse(m.Groups["month"].Value), int.Parse(m.Groups["day"].Value), out date))
|
||||
return false;
|
||||
}
|
||||
parsed_date = new ParsedDateTime(m.Index, m.Length, -1, -1, date);
|
||||
parsedDate = new ParsedDateTime(m.Index, m.Length, -1, -1, date);
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -488,9 +482,9 @@ namespace DateTimeRoutines
|
||||
m = Regex.Match(str, @"(?<=^|[^\d])(?'year'\d{2}|\d{4})\s*(?'separator'[\-])\s*(?'month'\d{1,2})\s*\'separator'+\s*(?'day'\d{1,2})(?=$|[^\d])", RegexOptions.Compiled | RegexOptions.IgnoreCase);
|
||||
if (m.Success)
|
||||
{
|
||||
if (!convert_to_date(int.Parse(m.Groups["year"].Value), int.Parse(m.Groups["month"].Value), int.Parse(m.Groups["day"].Value), out var date))
|
||||
if (!ConvertToDate(int.Parse(m.Groups["year"].Value), int.Parse(m.Groups["month"].Value), int.Parse(m.Groups["day"].Value), out var date))
|
||||
return false;
|
||||
parsed_date = new ParsedDateTime(m.Index, m.Length, -1, -1, date);
|
||||
parsedDate = new ParsedDateTime(m.Index, m.Length, -1, -1, date);
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -511,8 +505,8 @@ namespace DateTimeRoutines
|
||||
if (m.Success)
|
||||
{
|
||||
var month = -1;
|
||||
var index_of_date = m.Index;
|
||||
var length_of_date = m.Length;
|
||||
var indexOfDate = m.Index;
|
||||
var lengthOfDate = m.Length;
|
||||
|
||||
switch (m.Groups["month"].Value)
|
||||
{
|
||||
@@ -565,22 +559,19 @@ namespace DateTimeRoutines
|
||||
break;
|
||||
}
|
||||
|
||||
int year;
|
||||
if (!string.IsNullOrEmpty(m.Groups["year"].Value))
|
||||
year = int.Parse(m.Groups["year"].Value);
|
||||
else
|
||||
year = DefaultDate.Year;
|
||||
var year = !string.IsNullOrEmpty(m.Groups["year"].Value) ?
|
||||
int.Parse(m.Groups["year"].Value) : DefaultDate.Year;
|
||||
|
||||
if (!convert_to_date(year, month, int.Parse(m.Groups["day"].Value), out var date))
|
||||
if (!ConvertToDate(year, month, int.Parse(m.Groups["day"].Value), out var date))
|
||||
return false;
|
||||
parsed_date = new ParsedDateTime(index_of_date, length_of_date, -1, -1, date);
|
||||
parsedDate = new ParsedDateTime(indexOfDate, lengthOfDate, -1, -1, date);
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
private static bool convert_to_date(int year, int month, int day, out DateTime date)
|
||||
private static bool ConvertToDate(int year, int month, int day, out DateTime date)
|
||||
{
|
||||
if (year >= 100)
|
||||
{
|
||||
|
@@ -1,7 +1,10 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>netstandard2.0</TargetFramework>
|
||||
<LangVersion>8</LangVersion>
|
||||
<NoWarn />
|
||||
<TreatWarningsAsErrors>false</TreatWarningsAsErrors>
|
||||
<WarningsAsErrors />
|
||||
</PropertyGroup>
|
||||
|
||||
</Project>
|
||||
|
@@ -1,4 +1,4 @@
|
||||
function getUrlParams() {
|
||||
function getUrlParams() {
|
||||
var vars = [], hash;
|
||||
var hashes = window.location.href.slice(window.location.href.indexOf('?') + 1).split('&');
|
||||
for (var i = 0; i < hashes.length; i++) {
|
||||
@@ -7,4 +7,4 @@
|
||||
vars[hash[0]] = hash[1];
|
||||
}
|
||||
return vars;
|
||||
}
|
||||
}
|
||||
|
@@ -183,6 +183,12 @@ hr {
|
||||
border-bottom: 1px solid #ddd;
|
||||
}
|
||||
|
||||
.jackettlog-narrowcol {
|
||||
width: 1px;
|
||||
white-space: nowrap;
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
.jackettlogWarn {
|
||||
background-color: #FFFF8E !important;
|
||||
}
|
||||
@@ -210,11 +216,15 @@ pre {
|
||||
font-size: 13px;
|
||||
line-height: 1.42857143;
|
||||
color: #333;
|
||||
word-break: break-all;
|
||||
word-wrap: break-word;
|
||||
background-color: transparent;
|
||||
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 {
|
||||
|
@@ -241,9 +241,9 @@ function displayUnconfiguredIndexersList() {
|
||||
}).fail(function (data) {
|
||||
if(data.responseJSON.error !== undefined) {
|
||||
var indexEnd = 2048 - "https://github.com/Jackett/Jackett/issues/new?title=[".length - indexerId.length - "] ".length - " (Config)".length; // keep url <= 2k #5104
|
||||
doNotify("An error occured while configuring this indexer<br /><b>" + data.responseJSON.error.substring(0, indexEnd) + "</b><br /><i><a href=\"https://github.com/Jackett/Jackett/issues/new?title=[" + indexerId + "] " + data.responseJSON.error.substring(0, indexEnd) + " (Config)\" target=\"_blank\">Click here to open an issue on GitHub for this indexer.</a><i>", "danger", "glyphicon glyphicon-alert", false);
|
||||
doNotify("An error occurred while configuring this indexer<br /><b>" + data.responseJSON.error.substring(0, indexEnd) + "</b><br /><i><a href=\"https://github.com/Jackett/Jackett/issues/new?title=[" + indexerId + "] " + data.responseJSON.error.substring(0, indexEnd) + " (Config)\" target=\"_blank\">Click here to open an issue on GitHub for this indexer.</a><i>", "danger", "glyphicon glyphicon-alert", false);
|
||||
} else {
|
||||
doNotify("An error occured while configuring this indexer, is Jackett server running ?", "danger", "glyphicon glyphicon-alert");
|
||||
doNotify("An error occurred while configuring this indexer, is Jackett server running ?", "danger", "glyphicon glyphicon-alert");
|
||||
}
|
||||
});
|
||||
});
|
||||
|
@@ -175,6 +175,12 @@ hr {
|
||||
border-bottom: 1px solid #ddd;
|
||||
}
|
||||
|
||||
.jackettlog-narrowcol {
|
||||
width: 1px;
|
||||
white-space: nowrap;
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
.jackettlogWarn {
|
||||
background-color: #FFFF8E !important;
|
||||
}
|
||||
@@ -202,11 +208,15 @@ pre {
|
||||
font-size: 13px;
|
||||
line-height: 1.42857143;
|
||||
color: #333;
|
||||
word-break: break-all;
|
||||
word-wrap: break-word;
|
||||
background-color: transparent;
|
||||
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 {
|
||||
@@ -276,7 +286,7 @@ table td.fit{
|
||||
|
||||
.tooltip-inner img {
|
||||
max-width: 250px;
|
||||
height: auto;
|
||||
height: auto;
|
||||
}
|
||||
|
||||
.type-public {
|
||||
|
Binary file not shown.
Before Width: | Height: | Size: 361 KiB After Width: | Height: | Size: 101 KiB |
@@ -1,4 +1,4 @@
|
||||
<!DOCTYPE html>
|
||||
<!DOCTYPE html>
|
||||
|
||||
<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
@@ -34,8 +34,8 @@
|
||||
|
||||
<link rel="stylesheet" type="text/css" href="../bootstrap/bootstrap.min.css?changed=2017083001">
|
||||
<link rel="stylesheet" type="text/css" href="../animate.css?changed=2017083001">
|
||||
<link rel="stylesheet" type="text/css" href="../custom.css?changed=20200220" media="only screen and (min-device-width: 480px)">
|
||||
<link rel="stylesheet" type="text/css" href="../custom_mobile.css?changed=20200102" media="only screen and (max-device-width: 480px)">
|
||||
<link rel="stylesheet" type="text/css" href="../custom.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">
|
||||
@@ -616,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}}
|
||||
@@ -691,6 +691,6 @@
|
||||
</script>
|
||||
|
||||
<script type="text/javascript" src="../libs/api.js?changed=2017083001"></script>
|
||||
<script type="text/javascript" src="../custom.js?changed=20200222"></script>
|
||||
<script type="text/javascript" src="../custom.js?changed=20200301"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
@@ -86,4 +86,4 @@ var api = {
|
||||
success: callback
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -1,6 +1,6 @@
|
||||
Handlebars.registerHelper('ifCond', function (v1, v2, options) {
|
||||
Handlebars.registerHelper('ifCond', function (v1, v2, options) {
|
||||
if(v1 === v2) {
|
||||
return options.fn(this);
|
||||
}
|
||||
return options.inverse(this);
|
||||
});
|
||||
});
|
||||
|
@@ -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 });
|
||||
});
|
||||
});
|
||||
|
@@ -1,4 +1,4 @@
|
||||
<!DOCTYPE html>
|
||||
<!DOCTYPE html>
|
||||
|
||||
<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
@@ -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>
|
||||
|
@@ -1,4 +1,4 @@
|
||||
---
|
||||
---
|
||||
site: 0daykiev
|
||||
name: 0day.kiev
|
||||
description: "0day.kiev.ua is a RUSSIAN Private Torrent Tracker for MOVIES / TV / GENERAL"
|
||||
|
@@ -1,4 +1,4 @@
|
||||
---
|
||||
---
|
||||
site: 2fast4you
|
||||
name: 2 Fast 4 You
|
||||
description: "2 Fast 4 You is a FRENCH Private site for TV / MOVIES / GENERAL"
|
||||
|
@@ -6,7 +6,7 @@
|
||||
type: private
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- http://www.3dtorrents.org/
|
||||
- http://www.3dtorrents.org/ # site does not support https ERR_CONNECTION_CLOSED
|
||||
|
||||
caps:
|
||||
categorymappings:
|
||||
@@ -60,7 +60,7 @@
|
||||
- selector: span.errormsg
|
||||
test:
|
||||
path: index.php
|
||||
|
||||
|
||||
search:
|
||||
paths:
|
||||
- path: index.php
|
||||
|
@@ -1,4 +1,4 @@
|
||||
---
|
||||
---
|
||||
site: 3evils
|
||||
name: 3evils
|
||||
description: "3evils is a Private Torrent Tracker for MOVIES / TV / GENERAL"
|
||||
|
@@ -22,7 +22,7 @@
|
||||
- {id: 408, cat: Audio, desc: "HQ Audio/无损音乐"}
|
||||
|
||||
modes:
|
||||
search: [q]
|
||||
search: [q, imdbid]
|
||||
tv-search: [q, season, ep, imdbid]
|
||||
movie-search: [q, imdbid]
|
||||
|
||||
@@ -103,7 +103,7 @@
|
||||
args: cat
|
||||
details:
|
||||
selector: a[href^="details.php?id="]
|
||||
attribute: href
|
||||
attribute: href
|
||||
download:
|
||||
selector: a[href^="download.php?id="]
|
||||
attribute: href
|
||||
|
@@ -20,7 +20,7 @@
|
||||
settings:
|
||||
- name: info
|
||||
type: info
|
||||
default: 7torrents does not use categories. In your software Indexer settings, set the category to 100001.
|
||||
default: 7torrents does not use categories. In your software Indexer settings, set the category to 7000.
|
||||
- name: sort
|
||||
type: select
|
||||
label: Sort requested from site
|
||||
|
100
src/Jackett.Common/Definitions/academictorrents.yml
Normal file
100
src/Jackett.Common/Definitions/academictorrents.yml
Normal file
@@ -0,0 +1,100 @@
|
||||
---
|
||||
site: academictorrents
|
||||
name: AcademicTorrents
|
||||
description: "AcademicTorrents is a Public Community-Maintained Distributed Repository for datasets and scientific knowledge."
|
||||
language: en-us
|
||||
type: public
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- https://academictorrents.com/
|
||||
|
||||
caps:
|
||||
categorymappings:
|
||||
- {id: 5, cat: Books, desc: "Paper"}
|
||||
- {id: 6, cat: Other, desc: "Dataset"}
|
||||
- {id: 7, cat: TV/Documentary, desc: "Course"}
|
||||
|
||||
modes:
|
||||
search: [q]
|
||||
|
||||
settings:
|
||||
- name: sort
|
||||
type: select
|
||||
label: Sort requested from site
|
||||
default: "added"
|
||||
options:
|
||||
"added": "created"
|
||||
"seeders": "seeders"
|
||||
"size": "size"
|
||||
"name": "title"
|
||||
- name: type
|
||||
type: select
|
||||
label: Order requested from site
|
||||
default: "DESC"
|
||||
options:
|
||||
"DESC": "desc"
|
||||
"ASC": "asc"
|
||||
|
||||
search:
|
||||
# https://academictorrents.com/browse.php?search=&c5=1&c6=1&c7=1&sort_field=added&sort_dir=DESC
|
||||
paths:
|
||||
- path: browse.php
|
||||
- path: browse.php
|
||||
inputs:
|
||||
page: 1
|
||||
inputs:
|
||||
$raw: "{{ range .Categories }}c{{.}}=1&{{end}}"
|
||||
search: "{{ .Keywords }}"
|
||||
sort_field: "{{ .Config.sort }}"
|
||||
sort_dir: "{{ .Config.type }}"
|
||||
|
||||
rows:
|
||||
selector: table.table> tbody > tr:has(a[href^="/browse.php?cat="])
|
||||
filters:
|
||||
- name: andmatch
|
||||
|
||||
fields:
|
||||
category:
|
||||
selector: a[href^="/browse.php?cat="]
|
||||
attribute: href
|
||||
filters:
|
||||
- name: querystring
|
||||
args: cat
|
||||
title:
|
||||
selector: a[href^="/details/"]
|
||||
details:
|
||||
selector: a[href^="/details/"]
|
||||
attribute: href
|
||||
download:
|
||||
# /download/08078e0894099530913e9335bdbc804f42f6e872.torrent"
|
||||
selector: a[href^="/details/"]
|
||||
attribute: href
|
||||
filters:
|
||||
- name: replace
|
||||
args: ["/details/", "/download/"]
|
||||
- name: append
|
||||
args: ".torrent"
|
||||
date:
|
||||
selector: td:nth-child(4)
|
||||
filters:
|
||||
- name: dateparse
|
||||
args: "2006-01-02"
|
||||
size:
|
||||
selector: td:nth-child(5)
|
||||
grabs:
|
||||
selector: td:nth-child(6)
|
||||
seeders:
|
||||
text: 0
|
||||
seeders:
|
||||
selector: td:nth-child(7):not(:empty)
|
||||
optional: true
|
||||
filters:
|
||||
- name: replace
|
||||
args: ["+", ""]
|
||||
leechers:
|
||||
selector: td:nth-child(8)
|
||||
downloadvolumefactor:
|
||||
text: 0
|
||||
uploadvolumefactor:
|
||||
text: 1
|
||||
# engine n/a
|
@@ -1,4 +1,4 @@
|
||||
---
|
||||
---
|
||||
site: acidlounge
|
||||
name: Acid-Lounge
|
||||
description: "Acid Lounge (A-L) is a Private Torrent Tracker for 0DAY / GENERAL"
|
||||
|
@@ -1,4 +1,4 @@
|
||||
---
|
||||
---
|
||||
site: aftershock
|
||||
name: Aftershock
|
||||
description: "Aftershock is a HUNGARIAN Private Torrent Tracker for MOVIES / GENERAL"
|
||||
@@ -170,4 +170,4 @@
|
||||
case:
|
||||
span.icon_upload: 2
|
||||
"*": 1
|
||||
# XBT v3
|
||||
# XBT v3
|
||||
|
@@ -1,146 +0,0 @@
|
||||
---
|
||||
site: alein
|
||||
name: Alein
|
||||
description: "Alein is a BULGARIAN Semi-Private Torrent Tracker for MOVIES / TV / GENERAL"
|
||||
language: bg
|
||||
type: semi-private
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- http://alein.org/
|
||||
|
||||
caps:
|
||||
categorymappings:
|
||||
- {id: 1, cat: Movies/SD, desc: "Movies-XviD"}
|
||||
- {id: 15, cat: Movies/HD, desc: "Movies-x264"}
|
||||
- {id: 41, cat: Movies, desc: "Movies-BG"}
|
||||
- {id: 14, cat: Movies/HD, desc: "Movies-HD"}
|
||||
- {id: 48, cat: Movies/UHD, desc: "Movies-x265"}
|
||||
- {id: 39, cat: Movies/Foreign, desc: "Movies-XviD-Rus"}
|
||||
- {id: 40, cat: Movies/Foreign, desc: "Movies-x264-Rus"}
|
||||
- {id: 20, cat: Movies/Other, desc: "Movies-Animations"}
|
||||
- {id: 16, cat: Movies/3D, desc: "Movies-3D"}
|
||||
- {id: 5, cat: TV/Anime, desc: "Movies-Anime"}
|
||||
- {id: 21, cat: Movies/BluRay, desc: "Movies-Blu-ray"}
|
||||
- {id: 22, cat: TV/Documentary , desc: "Movies-Documentaries"}
|
||||
- {id: 11, cat: Movies/DVD, desc: "Movies-DVD-R"}
|
||||
- {id: 47, cat: TV/SD, desc: "TV-Episodes"}
|
||||
- {id: 46, cat: TV/HD, desc: "TV-Episodes-HD"}
|
||||
- {id: 3, cat: PC/ISO, desc: "Games-PC ISO"}
|
||||
- {id: 31, cat: Console/Xbox, desc: "Games-XBOX"}
|
||||
- {id: 33, cat: Console/PSP, desc: "Games-PS"}
|
||||
- {id: 2, cat: Audio/MP3, desc: "Music-MP3"}
|
||||
- {id: 50, cat: Audio/Lossless, desc: "Music-FLAC"}
|
||||
- {id: 18, cat: Audio/Video, desc: "Music-Video"}
|
||||
- {id: 9, cat: PC/0day, desc: "Software-Windows"}
|
||||
- {id: 8, cat: PC, desc: "Software-Linux"}
|
||||
- {id: 36, cat: Other, desc: "Trailer"}
|
||||
- {id: 34, cat: Other/Misc, desc: "Pictures"}
|
||||
- {id: 4, cat: Other, desc: "Other"}
|
||||
- {id: 6, cat: Books/Comics, desc: "Books-Comics"}
|
||||
- {id: 24, cat: PC/Phone-Other, desc: "Mobile-GSM"}
|
||||
- {id: 23, cat: TV/Sport, desc: "Sport"}
|
||||
|
||||
modes:
|
||||
search: [q]
|
||||
tv-search: [q, season, ep]
|
||||
movie-search: [q]
|
||||
|
||||
settings:
|
||||
- name: username
|
||||
type: text
|
||||
label: Username
|
||||
- name: password
|
||||
type: password
|
||||
label: Password
|
||||
- name: sort
|
||||
type: select
|
||||
label: Sort requested from site
|
||||
default: "3"
|
||||
options:
|
||||
"3": "created"
|
||||
"5": "seeders"
|
||||
"4": "size"
|
||||
"2": "title"
|
||||
- name: type
|
||||
type: select
|
||||
label: Order requested from site
|
||||
default: "2"
|
||||
options:
|
||||
"2": "desc"
|
||||
"1": "asc"
|
||||
|
||||
login:
|
||||
path: index.php?page=login
|
||||
method: form
|
||||
form: form[action*="/index.php?page=login"]
|
||||
inputs:
|
||||
uid: "{{ .Config.username }}"
|
||||
pwd: "{{ .Config.password }}"
|
||||
error:
|
||||
- selector: td.lista span[style="color:#FF0000;"]
|
||||
test:
|
||||
path: /
|
||||
selector: a[href="logout.php"]
|
||||
|
||||
search:
|
||||
paths:
|
||||
# http://alein.org/index.php?page=torrents&category=1;15;41;14;48;39;20;16;5;21;22;11&search=venom&active=1
|
||||
- path: index.php
|
||||
inputs:
|
||||
page: torrents
|
||||
category: "{{ range .Categories }}{{.}};{{end}}"
|
||||
search: "{{ .Keywords }}"
|
||||
# 0 all 1 active only 2 dead only
|
||||
active: 0
|
||||
order: "{{ .Config.sort }}"
|
||||
by: "{{ .Config.type }}"
|
||||
|
||||
rows:
|
||||
selector: tr.trclass:not(:has(td.lista-cat-rec))
|
||||
|
||||
fields:
|
||||
title:
|
||||
selector: td a[href*="id="]
|
||||
details:
|
||||
selector: td a[href*="id="]
|
||||
attribute: href
|
||||
category:
|
||||
selector: td a[href*="category="]
|
||||
attribute: href
|
||||
filters:
|
||||
- name: querystring
|
||||
args: category
|
||||
download:
|
||||
selector: td a[href*="id="]
|
||||
attribute: href
|
||||
filters:
|
||||
- name: querystring
|
||||
args: id
|
||||
- name: prepend
|
||||
args: "download.php?id="
|
||||
- name: append
|
||||
args: "&f={{ .Result.title }}.torrent"
|
||||
banner:
|
||||
selector: td a[href*="id="]
|
||||
attribute: onmouseover
|
||||
filters:
|
||||
- name: regexp
|
||||
args: "src=(.+?) width="
|
||||
size:
|
||||
selector: td:nth-child(6)
|
||||
seeders:
|
||||
selector: td:nth-child(7)
|
||||
leechers:
|
||||
selector: td:nth-child(8)
|
||||
grabs:
|
||||
selector: td:nth-child(9)
|
||||
date:
|
||||
selector: td:nth-child(5)
|
||||
filters:
|
||||
- name: dateparse
|
||||
args: "02/01/2006"
|
||||
downloadvolumefactor:
|
||||
text: 0
|
||||
uploadvolumefactor:
|
||||
text: 1
|
||||
# xbtit 2.3
|
@@ -1,4 +1,4 @@
|
||||
---
|
||||
---
|
||||
site: alexfilm
|
||||
name: AlexFilm
|
||||
description: "AlexFilm is a RUSSIAN Semi-Private Torrent Tracker for TV"
|
||||
|
@@ -158,8 +158,10 @@
|
||||
keywordsfilters:
|
||||
- name: re_replace
|
||||
args: ["([12][0-9]{3})", ""]
|
||||
|
||||
rows:
|
||||
selector: div#fancy-list-group ul.list-group li.list-group-item
|
||||
|
||||
fields:
|
||||
_quality:
|
||||
selector: div.list-group-item-content p.m-0 span.badge-primary:contains("1080p"), div.list-group-item-content p.m-0 span.badge-primary:contains("720p"), div.list-group-item-content p.m-0 span.badge-primary:contains("4k")
|
||||
@@ -196,69 +198,70 @@
|
||||
attribute: src
|
||||
case:
|
||||
# unfortunately the site does not have category numbers on the results page, just a .png which can apply to both movies and tv.
|
||||
# therefore I've order the list to favour movies,
|
||||
# therefore I've order the list to favour movies,
|
||||
# also, not all .png have been verified as the site has many empty categories. their image names have been extrapolated from the cat desc.
|
||||
"[src$=\"/XXXZ.png\"]": "74"
|
||||
"[src$=\"/Hentai.png\"]": "75"
|
||||
"[src$=\"/Anime.png\"]": "69"
|
||||
"[src$=\"/Windows.png\"]": "21"
|
||||
"[src$=\"/Mac.png\"]": "22"
|
||||
"[src$=\"/Android.png\"]": "23"
|
||||
"[src$=\"/Linux.png\"]": "25"
|
||||
"[src$=\"/iPhone.png\"]": "26"
|
||||
"[src$=\"/iPad.png\"]": "27"
|
||||
"[src$=\"/iPod.png\"]": "28"
|
||||
"[src$=\"/Cursos.png\"]": "71"
|
||||
"[src$=\"/Apostila.png\"]": "72"
|
||||
"[src$=\"/E-books.png\"]": "67"
|
||||
"[src$=\"/Revista.png\"]": "68"
|
||||
"[src$=\"/HQ.png\"]": "112"
|
||||
"[src$=\"/Filmes.png\"]": "119"
|
||||
"[src$=\"/Revistas-XXX.png\"]": "70"
|
||||
"[src$=\"/PS4.png\"]": "79"
|
||||
"[src$=\"/Jogos-PC.png\"]": "47"
|
||||
"[src$=\"/Emulador.png\"]": "61"
|
||||
"[src$=\"/Emulacao.png\"]": "109"
|
||||
"[src$=\"/Jogos-Mac.png\"]": "48"
|
||||
"[src$=\"/Jogos-PS1.png\"]": "49"
|
||||
"[src$=\"/Jogos-PS2.png\"]": "50"
|
||||
"[src$=\"/Jogos-PS3.png\"]": "51"
|
||||
"[src$=\"/Jogos-Dreamcast.png\"]": "52"
|
||||
"[src$=\"/Jogos-Xbox360.png\"]": "54"
|
||||
"[src$=\"/Jogos-Xbox.png\"]": "56"
|
||||
"[src$=\"/Jogos-Wii.png\"]": "55"
|
||||
"[src$=\"/Jogos-DS.png\"]": "58"
|
||||
"[src$=\"/jogosandroid.png\"]": "57"
|
||||
"[src$=\"/Jogos-PSP.png\"]": "82"
|
||||
"[src$=\"/Jogos-NS.png\"]": "110"
|
||||
"[src$=\"/Jogos-XboxOne.png\"]": "78"
|
||||
"[src$=\"/Axe.png\"]": "29"
|
||||
"[src$=\"/Funk.png\"]": "31"
|
||||
"[src$=\"/Pagode.png\"]": "32"
|
||||
"[src$=\"/HIP_HOP.png\"]": "33"
|
||||
"[src$=\"/Rap.png\"]": "34"
|
||||
"[src$=\"/Rock.png\"]": "36"
|
||||
"[src$=\"/Hard-Rock.png\"]": "37"
|
||||
"[src$=\"/Blues.png\"]": "38"
|
||||
"[src$=\"/Dance.png\"]": "39"
|
||||
"[src$=\"/Discografia.png\"]": "40"
|
||||
"[src$=\"/Erudita.png\"]": "41"
|
||||
"[src$=\"/Forro.png\"]": "42"
|
||||
"[src$=\"/Dubstep.png\"]": "43"
|
||||
"[src$=\"/Sertanejo.png\"]": "46"
|
||||
"[src$=\"/Samba.png\"]": "45"
|
||||
"[src$=\"/Musica-Outros.png\"]": "77"
|
||||
"[src$=\"/Reggae.png\"]": "76"
|
||||
"[src$=\"/Gospel.png\"]": "83"
|
||||
"[src$=\"/POP.png\"]": "115"
|
||||
"[src$=\"/MPB.png\"]": "114"
|
||||
"[src$=\"/OST.png\"]": "84"
|
||||
"[src$=\"/Seriados.png\"]": "120"
|
||||
"[src$=\"/Shows.png\"]": "65"
|
||||
"[src$=\"/Aberta.png\"]": "63"
|
||||
"[src$=\"/Esporte.png\"]": "62"
|
||||
"[src$=\"/Fechada.png\"]": "64"
|
||||
"[src$=\"/Videoaula.png\"]": "73"
|
||||
"[src$=\"/XXXZ.png\"]": 74
|
||||
"[src$=\"/Hentai.png\"]": 75
|
||||
"[src$=\"/Anime.png\"]": 69
|
||||
"[src$=\"/Windows.png\"]": 21
|
||||
"[src$=\"/Mac.png\"]": 22
|
||||
"[src$=\"/Android.png\"]": 23
|
||||
"[src$=\"/Linux.png\"]": 25
|
||||
"[src$=\"/iPhone.png\"]": 26
|
||||
"[src$=\"/iPad.png\"]": 27
|
||||
"[src$=\"/iPod.png\"]": 28
|
||||
"[src$=\"/Cursos.png\"]": 71
|
||||
"[src$=\"/Apostila.png\"]": 72
|
||||
"[src$=\"/E-books.png\"]": 67
|
||||
"[src$=\"/Revista.png\"]": 68
|
||||
"[src$=\"/HQ.png\"]": 112
|
||||
"[src$=\"/Filmes.png\"]": 119
|
||||
"[src$=\"/Revistas-XXX.png\"]": 70
|
||||
"[src$=\"/PS4.png\"]": 79
|
||||
"[src$=\"/Jogos-PC.png\"]": 47
|
||||
"[src$=\"/Emulador.png\"]": 61
|
||||
"[src$=\"/Emulacao.png\"]": 109
|
||||
"[src$=\"/Jogos-Mac.png\"]": 48
|
||||
"[src$=\"/Jogos-PS1.png\"]": 49
|
||||
"[src$=\"/Jogos-PS2.png\"]": 50
|
||||
"[src$=\"/Jogos-PS3.png\"]": 51
|
||||
"[src$=\"/Jogos-Dreamcast.png\"]": 52
|
||||
"[src$=\"/Jogos-Xbox360.png\"]": 54
|
||||
"[src$=\"/Jogos-Xbox.png\"]": 56
|
||||
"[src$=\"/Jogos-Wii.png\"]": 55
|
||||
"[src$=\"/Jogos-DS.png\"]": 58
|
||||
"[src$=\"/jogosandroid.png\"]": 57
|
||||
"[src$=\"/Jogos-PSP.png\"]": 82
|
||||
"[src$=\"/Jogos-NS.png\"]": 110
|
||||
"[src$=\"/Jogos-XboxOne.png\"]": 78
|
||||
"[src$=\"/Axe.png\"]": 29
|
||||
"[src$=\"/Funk.png\"]": 31
|
||||
"[src$=\"/Pagode.png\"]": 32
|
||||
"[src$=\"/HIP_HOP.png\"]": 33
|
||||
"[src$=\"/Rap.png\"]": 34
|
||||
"[src$=\"/Rock.png\"]": 36
|
||||
"[src$=\"/Hard-Rock.png\"]": 37
|
||||
"[src$=\"/Blues.png\"]": 38
|
||||
"[src$=\"/Dance.png\"]": 39
|
||||
"[src$=\"/Discografia.png\"]": 40
|
||||
"[src$=\"/Erudita.png\"]": 41
|
||||
"[src$=\"/Forro.png\"]": 42
|
||||
"[src$=\"/Dubstep.png\"]": 43
|
||||
"[src$=\"/Sertanejo.png\"]": 46
|
||||
"[src$=\"/Samba.png\"]": 45
|
||||
"[src$=\"/Musica-Outros.png\"]": 77
|
||||
"[src$=\"/Reggae.png\"]": 76
|
||||
"[src$=\"/Gospel.png\"]": 83
|
||||
"[src$=\"/POP.png\"]": 115
|
||||
"[src$=\"/MPB.png\"]": 114
|
||||
"[src$=\"/OST.png\"]": 84
|
||||
"[src$=\"/Seriados.png\"]": 120
|
||||
"[src$=\"/Shows.png\"]": 65
|
||||
"[src$=\"/Aberta.png\"]": 63
|
||||
"[src$=\"/Esporte.png\"]": 62
|
||||
"[src$=\"/Fechada.png\"]": 64
|
||||
"[src$=\"/Videoaula.png\"]": 73
|
||||
"*": 999
|
||||
date:
|
||||
text: now
|
||||
date:
|
||||
@@ -284,5 +287,5 @@
|
||||
"span.badge-success:contains(\"FREE\")": 0
|
||||
"*": 1
|
||||
uploadvolumefactor:
|
||||
case:
|
||||
"*": 1
|
||||
text: 1
|
||||
# engine n/a
|
||||
|
@@ -1,4 +1,4 @@
|
||||
---
|
||||
---
|
||||
site: arabafenice
|
||||
name: ArabaFenice
|
||||
description: "Araba Fenice (Phoenix) is an ITALIAN Private site for TV / MOVIES / GENERAL"
|
||||
@@ -65,7 +65,7 @@
|
||||
- {id: 32, cat: PC/Phone-Android, desc: "Android APP"}
|
||||
|
||||
modes:
|
||||
search: [q]
|
||||
search: [q, imdbid]
|
||||
tv-search: [q, season, ep, imdbid]
|
||||
movie-search: [q, imdbid]
|
||||
|
||||
|
@@ -1,4 +1,4 @@
|
||||
---
|
||||
---
|
||||
site: arenabg
|
||||
name: ArenaBG
|
||||
description: "ArenaBG is a BULGARIAN Semi-Private Torrent Tracker for 0DAY / GENERAL"
|
||||
|
@@ -1,4 +1,4 @@
|
||||
---
|
||||
---
|
||||
site: asgaard
|
||||
name: Asgaard
|
||||
description: "Asgaard (AG) is a NORDIC Private Torrent Tracker for MOVIES / TV / GENERAL"
|
||||
@@ -57,7 +57,7 @@
|
||||
- {id: 43, cat: Books/Technical, desc: "Books Education"}
|
||||
|
||||
modes:
|
||||
search: [q]
|
||||
search: [q, imdbid]
|
||||
tv-search: [q, season, ep, imdbid]
|
||||
movie-search: [q, imdbid]
|
||||
|
||||
@@ -104,7 +104,7 @@
|
||||
test:
|
||||
path: /
|
||||
selector: a[href$="/logout.php"]
|
||||
|
||||
|
||||
search:
|
||||
paths:
|
||||
# https://asgrd.org/browse.php?sns=&sna=&spf=&sr=&sg=&sys=&sye=&srs=&sre=&si=tt2401090&ss=&incldead=0&only_free=0&sort=4&type=desc
|
||||
@@ -178,6 +178,5 @@
|
||||
img[src="./images/gold.png"]: 0
|
||||
"*": 1
|
||||
uploadvolumefactor:
|
||||
case:
|
||||
"*": 1
|
||||
text: 1
|
||||
# Midgaard
|
||||
|
@@ -15,7 +15,7 @@
|
||||
- {id: 3, cat: Audio, desc: "Music"}
|
||||
|
||||
modes:
|
||||
search: [q]
|
||||
search: [q, imdbid]
|
||||
tv-search: [q, season, ep, imdbid]
|
||||
movie-search: [q, imdbid]
|
||||
|
||||
|
@@ -6,7 +6,7 @@
|
||||
type: public
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- http://audiobookbay.nl/
|
||||
- http://audiobookbay.nl/ # site forces http, does not support https
|
||||
legacylinks:
|
||||
- https://audiobookbay.la/
|
||||
|
||||
|
@@ -44,15 +44,27 @@
|
||||
modes:
|
||||
search: [q]
|
||||
|
||||
settings:
|
||||
- name: username
|
||||
type: text
|
||||
label: Username
|
||||
- name: password
|
||||
type: password
|
||||
label: Password
|
||||
- name: info_results
|
||||
type: info
|
||||
label: Search results
|
||||
default: "If you are getting the error <b>Login Failed, got redirected</b> then access the site with your browser and <b>mark as read</b> all PMs."
|
||||
|
||||
login:
|
||||
path: takelogin.php
|
||||
method: post
|
||||
inputs:
|
||||
username: "{{ .Config.username }}"
|
||||
password: "{{ .Config.password }}"
|
||||
use_ssl: "1"
|
||||
perm_ssl: "1"
|
||||
submitme: "X"
|
||||
use_ssl: 1
|
||||
perm_ssl: 1
|
||||
submitme: X
|
||||
error:
|
||||
- selector: td.embedded:has(h2:contains("Oops"))
|
||||
- selector: td.embedded:has(h2:contains("failed"))
|
||||
@@ -65,58 +77,38 @@
|
||||
inputs:
|
||||
$raw: "{{range .Categories}}c{{.}}=1&{{end}}"
|
||||
search: "{{ .Keywords }}"
|
||||
searchin: "title"
|
||||
incldead: "1"
|
||||
searchin: title
|
||||
incldead: 1
|
||||
|
||||
rows:
|
||||
selector: tr.browse_color, tr.freeleech_color, tr[id^="kdescr"]
|
||||
after: 1
|
||||
|
||||
fields: # some users (rank specific?) have an extra column (td:nth-child(4)) with bookmark features
|
||||
banner:
|
||||
selector: a[href^="details.php?id="][onmouseover]
|
||||
attribute: onmouseover
|
||||
filters:
|
||||
- name: regexp
|
||||
args: src=\'(.*?)\'
|
||||
title:
|
||||
selector: a[href^="details.php?id="][onmouseover]
|
||||
attribute: onmouseover
|
||||
filters:
|
||||
- name: regexp
|
||||
args: Tip\('<b>(.*?)</b>
|
||||
category:
|
||||
selector: a[href^="browse.php?cat="]
|
||||
attribute: href
|
||||
filters:
|
||||
- name: querystring
|
||||
args: cat
|
||||
title:
|
||||
selector: a[href^="details.php?id="][onmouseover]
|
||||
attribute: onmouseover
|
||||
filters:
|
||||
- name: regexp
|
||||
args: Tip\('<b>(.*?)</b>
|
||||
details:
|
||||
selector: a[href^="details.php?id="][onmouseover]
|
||||
attribute: href
|
||||
download:
|
||||
selector: a[href^="download.php"]
|
||||
attribute: href
|
||||
files:
|
||||
selector: a[href^="filelist.php"]
|
||||
size:
|
||||
selector: td:nth-last-child(6)
|
||||
grabs:
|
||||
selector: td:nth-last-child(5)
|
||||
banner:
|
||||
selector: a[href^="details.php?id="][onmouseover]
|
||||
attribute: onmouseover
|
||||
filters:
|
||||
- name: regexp
|
||||
args: ([\d,]+)
|
||||
seeders:
|
||||
selector: td:nth-last-child(4)
|
||||
leechers:
|
||||
selector: td:nth-last-child(3)
|
||||
date:
|
||||
selector: td:nth-last-child(7)
|
||||
downloadvolumefactor:
|
||||
case:
|
||||
"a.info > b:contains(\"[FREE]\")": "0"
|
||||
"*": "1"
|
||||
uploadvolumefactor:
|
||||
case:
|
||||
"*": "1"
|
||||
args: src=\'(.*?)\'
|
||||
description:
|
||||
selector: a[href^="details.php?id="][onmouseover]
|
||||
attribute: onmouseover
|
||||
@@ -130,7 +122,29 @@
|
||||
- name: prepend
|
||||
args: "{{ .Result.description }}<br>\n"
|
||||
description:
|
||||
selector: td[colspan=13]
|
||||
selector: td[colspan="13"]
|
||||
filters:
|
||||
- name: prepend
|
||||
args: "{{ .Result.description }}<br>\n"
|
||||
files:
|
||||
selector: td:nth-last-child(9)
|
||||
date:
|
||||
selector: td:nth-last-child(7)
|
||||
size:
|
||||
selector: td:nth-last-child(6)
|
||||
grabs:
|
||||
selector: td:nth-last-child(5)
|
||||
filters:
|
||||
- name: regexp
|
||||
args: (\d+)
|
||||
seeders:
|
||||
selector: td:nth-last-child(4)
|
||||
leechers:
|
||||
selector: td:nth-last-child(3)
|
||||
downloadvolumefactor:
|
||||
case:
|
||||
"a.info > b:contains(\"[FREE]\")": 0
|
||||
"*": 1
|
||||
uploadvolumefactor:
|
||||
text: 1
|
||||
# U-232 V4
|
||||
|
@@ -1,4 +1,4 @@
|
||||
---
|
||||
---
|
||||
site: audionews
|
||||
name: AudioNews
|
||||
description: "AudioNews (AN) is a Private Torrent Tracker for AUDIO SOFTWARE / SAMPLES / ETC"
|
||||
|
@@ -40,6 +40,10 @@
|
||||
options:
|
||||
"desc": "desc"
|
||||
"asc": "asc"
|
||||
- name: info_login
|
||||
type: info
|
||||
label: "Password Changes"
|
||||
default: "This site forces you to change your <b>Password</b> every <b>90 days</b>.<br/>If you get a <b>Login Failed, got redirected</b> error, then access the site with your browser and check if you need to change your password. Logout after saving, and update this config to login."
|
||||
|
||||
login:
|
||||
path: login.php
|
||||
@@ -65,7 +69,7 @@
|
||||
order_way: "{{ .Config.type }}"
|
||||
|
||||
rows:
|
||||
selector: table#torrent_table > tbody > tr.group, tr.torrent, tr.group_torrent:not(.edition_info)
|
||||
selector: table#torrent_table > tbody > tr.group, tr.torrent, tr.group_torrent:not(.edition_info)
|
||||
|
||||
fields:
|
||||
download:
|
||||
@@ -94,4 +98,4 @@
|
||||
"*": 1
|
||||
uploadvolumefactor:
|
||||
case:
|
||||
"*": 1
|
||||
"*": 1
|
||||
|
@@ -1,4 +1,4 @@
|
||||
site: backups
|
||||
site: backups
|
||||
name: Back-ups
|
||||
description: "Back-Ups is a Private Torrent Tracker for MOVIES / TV / GENERAL"
|
||||
language: en-us
|
||||
|
@@ -1,12 +1,12 @@
|
||||
---
|
||||
---
|
||||
site: baibako
|
||||
name: BaibaKo
|
||||
description: "BaibaKo is a RUSSIAN Semi-Private Torrent Tracker for TV"
|
||||
description: "BaibaKo is a RUSSIAN Private Torrent Tracker for TV"
|
||||
language: ru-ru
|
||||
type: semi-private
|
||||
type: private
|
||||
encoding: windows-1251
|
||||
links:
|
||||
- http://baibako.tv/
|
||||
- http://baibako.tv/ # site does not support https NET::ERR_CERT_AUTHORITY_INVALID
|
||||
|
||||
caps:
|
||||
categorymappings:
|
||||
|
@@ -21,7 +21,7 @@
|
||||
- {id: 408, cat: Audio, desc: "HQ Audio/无损音乐"}
|
||||
|
||||
modes:
|
||||
search: [q]
|
||||
search: [q, imdbid]
|
||||
tv-search: [q, season, ep, imdbid]
|
||||
movie-search: [q, imdbid]
|
||||
|
||||
@@ -96,7 +96,7 @@
|
||||
args: cat
|
||||
details:
|
||||
selector: a[href^="details.php?id="]
|
||||
attribute: href
|
||||
attribute: href
|
||||
download:
|
||||
selector: a[href^="download.php?id="]
|
||||
attribute: href
|
||||
@@ -148,4 +148,4 @@
|
||||
description:
|
||||
selector: td:nth-child(2)
|
||||
remove: a, img
|
||||
# NexusPHP Standard v1.5 Beta 4
|
||||
# NexusPHP Standard v1.5 Beta 4
|
||||
|
@@ -35,7 +35,7 @@
|
||||
- {id: 2, cat: TV, desc: "TV"}
|
||||
|
||||
modes:
|
||||
search: [q]
|
||||
search: [q, imdbid]
|
||||
tv-search: [q, season, ep, imdbid]
|
||||
movie-search: [q, imdbid]
|
||||
|
||||
@@ -50,8 +50,8 @@
|
||||
paths:
|
||||
- path: torrents
|
||||
inputs:
|
||||
$raw: "{{range .Categories}}categories[]={{.}}&{{end}}"
|
||||
search: "{{if .Query.IMDBID}}{{else}}{{ .Keywords }}{{end}}"
|
||||
$raw: "{{ range .Categories }}categories[]={{.}}&{{end}}"
|
||||
search: "{{ if .Query.IMDBID }}{{else}}{{ .Keywords }}{{end}}"
|
||||
description: ""
|
||||
uploader: ""
|
||||
imdb: "{{ .Query.IMDBIDShort }}"
|
||||
@@ -114,6 +114,5 @@
|
||||
i[data-original-title="75% Promo"]: 0.25
|
||||
"*": 1
|
||||
uploadvolumefactor:
|
||||
case:
|
||||
"*": 1
|
||||
# UNIT3D
|
||||
text: 1
|
||||
# UNIT3D
|
||||
|
@@ -14,7 +14,7 @@
|
||||
- {id: 2, cat: TV, desc: "TV"}
|
||||
|
||||
modes:
|
||||
search: [q]
|
||||
search: [q, imdbid]
|
||||
tv-search: [q, season, ep, imdbid]
|
||||
movie-search: [q, imdbid]
|
||||
|
||||
@@ -126,6 +126,5 @@
|
||||
i[data-original-title="75% Promo"]: 0.25
|
||||
"*": 1
|
||||
uploadvolumefactor:
|
||||
case:
|
||||
"*": 1
|
||||
# UNIT3D
|
||||
text: 1
|
||||
# UNIT3D
|
||||
|
@@ -1,4 +1,4 @@
|
||||
---
|
||||
---
|
||||
site: bigfangroup
|
||||
name: BigFANGroup
|
||||
description: "BigFANGroup is a RUSSIAN Public Torrent Tracker for MOVIES / TV"
|
||||
|
@@ -6,6 +6,8 @@
|
||||
type: private
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- https://www.bigtorrent.eu/
|
||||
legacylinks:
|
||||
- http://www.bigtorrent.eu/
|
||||
|
||||
caps:
|
||||
@@ -96,4 +98,4 @@
|
||||
"*": "1"
|
||||
uploadvolumefactor:
|
||||
case:
|
||||
"*": "1"
|
||||
"*": "1"
|
||||
|
@@ -6,14 +6,16 @@
|
||||
type: private
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- http://bigtower.info/
|
||||
- http://bigtower.info/ # site does not support https NET::ERR_CERT_DATE_INVALID
|
||||
legacylinks:
|
||||
- https://bigtower.info/
|
||||
|
||||
caps:
|
||||
categorymappings:
|
||||
|
||||
# Movies
|
||||
- {id: 11, cat: Movies/HD, desc: "DSS"}
|
||||
- {id: 1, cat: Movies, desc: "Screener"}
|
||||
- {id: 1, cat: Movies, desc: "Screener"}
|
||||
- {id: 2, cat: Movies, desc: "DVDRip & BDRip"}
|
||||
- {id: 3, cat: Movies/BluRay, desc: "Bluray 1080p & 720p"}
|
||||
- {id: 5, cat: Movies/UHD, desc: "Ultra HD 4K"}
|
||||
@@ -25,10 +27,10 @@
|
||||
|
||||
# MUSIC
|
||||
- {id: 8, cat: Audio, desc: "Musica"}
|
||||
|
||||
|
||||
# SOFTWARE
|
||||
- {id: 9, cat: PC/0day, desc: "Software"}
|
||||
|
||||
|
||||
# PHONE
|
||||
- {id: 12, cat: PC/Phone-Other, desc: "Applicazioni"}
|
||||
|
||||
|
@@ -1,4 +1,4 @@
|
||||
---
|
||||
---
|
||||
site: bit-titan
|
||||
name: BiT-TiTAN
|
||||
description: "BiT-TiTAN is a GERMAN Private Torrent Tracker for MOVIES / TV / GENERAL"
|
||||
|
@@ -1,4 +1,4 @@
|
||||
---
|
||||
---
|
||||
site: bithorlo
|
||||
name: Bithorlo
|
||||
description: "Bithorlo (BHO) is a HUNGARIAN Private Torrent Tracker for MOVIES / GENERAL"
|
||||
|
@@ -42,8 +42,8 @@
|
||||
- {id: 27, cat: Other, desc: "Klipek"}
|
||||
|
||||
modes:
|
||||
search: [q]
|
||||
tv-search: [q, season, ep]
|
||||
search: [q, imdbid]
|
||||
tv-search: [q, season, ep, imdbid]
|
||||
movie-search: [q, imdbid]
|
||||
|
||||
login:
|
||||
@@ -61,13 +61,15 @@
|
||||
paths:
|
||||
- path: browse.php
|
||||
inputs:
|
||||
$raw: "{{range .Categories}}c{{.}}=1&{{end}}"
|
||||
search: "{{if .Query.IMDBID}}{{ .Query.IMDBID }}{{else}}{{ .Query.Keywords }}{{end}}"
|
||||
$raw: "{{ range .Categories }}c{{.}}=1&{{end}}"
|
||||
search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{else}}{{ .Keywords }}{{end}}"
|
||||
incldead: 1
|
||||
|
||||
rows:
|
||||
selector: table#torrenttable > tbody > tr:has(a[href^="details.php?id="])
|
||||
filters:
|
||||
- name: andmatch
|
||||
|
||||
fields:
|
||||
# download button can be disbled in the profile, use details link instead
|
||||
# download:
|
||||
@@ -156,3 +158,4 @@
|
||||
args: ["tegnap", "yesterday"]
|
||||
description:
|
||||
selector: td:nth-child(2) > div
|
||||
# engine tbd
|
||||
|
@@ -6,7 +6,7 @@
|
||||
type: public
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- http://bitru.org/
|
||||
- http://bitru.org/ # site forces http, https is not supported
|
||||
|
||||
caps:
|
||||
categories:
|
||||
@@ -84,8 +84,8 @@
|
||||
- name: regexp
|
||||
args: "src=(.*?) "
|
||||
date:
|
||||
# Сегодня в 09:09 от
|
||||
# Вчера в 22:47 от
|
||||
# Сегодня в 09:09 от
|
||||
# Вчера в 22:47 от
|
||||
selector: td:nth-child(2) div.b-info div span:nth-child(2):contains("Сегодня"), td:nth-child(2) div.b-info div span:nth-child(2):contains("Вчера")
|
||||
optional: true
|
||||
filters:
|
||||
@@ -96,7 +96,7 @@
|
||||
- name: replace
|
||||
args: ["Вчера в", "Yesterday"]
|
||||
date:
|
||||
# 08 ноября 2019 в 23:53 от
|
||||
# 08 ноября 2019 в 23:53 от
|
||||
selector: td:nth-child(2) div.b-info div span:nth-child(2):not(:contains("Сегодня")):not(:contains("Вчера"))
|
||||
optional: true
|
||||
filters:
|
||||
@@ -134,7 +134,7 @@
|
||||
selector: td:nth-child(3)
|
||||
filters:
|
||||
- name: replace
|
||||
args: ["ТБ", "TB"]
|
||||
args: ["ТБ", "TB"]
|
||||
- name: replace
|
||||
args: ["ГБ", "GB"]
|
||||
- name: replace
|
||||
@@ -145,12 +145,12 @@
|
||||
selector: td:nth-child(4)
|
||||
filters:
|
||||
- name: replace
|
||||
args: ["?", "1"]
|
||||
args: ["?", "1"]
|
||||
leechers:
|
||||
selector: td:nth-child(5)
|
||||
selector: td:nth-child(5)
|
||||
filters:
|
||||
- name: replace
|
||||
args: ["?", "0"]
|
||||
args: ["?", "0"]
|
||||
downloadvolumefactor:
|
||||
text: 0
|
||||
uploadvolumefactor:
|
||||
|
@@ -6,8 +6,8 @@
|
||||
type: private
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- http://www.bitturk.net/
|
||||
|
||||
- http://www.bitturk.net/ # site does not support https ERR_CONNECTION_REFUSED
|
||||
|
||||
caps:
|
||||
categorymappings:
|
||||
- {id: 69, cat: Movies, desc: "BiTTuRK Altın"}
|
||||
@@ -20,6 +20,7 @@
|
||||
- {id: 67, cat: XXX, desc: "XxX"}
|
||||
- {id: 68, cat: Movies, desc: "Dual (TR-~)"}
|
||||
- {id: 58, cat: Movies, desc: "Film"}
|
||||
- {id: 72, cat: Movies, desc: "Belgesel"}
|
||||
- {id: 60, cat: Movies/3D, desc: "3D"}
|
||||
- {id: 45, cat: Movies, desc: "Eğitim / Prog "}
|
||||
- {id: 1, cat: Movies, desc: "Filmler"}
|
||||
@@ -52,12 +53,12 @@
|
||||
- {id: 50, cat: TV, desc: "Yab@ncı Dizi"}
|
||||
- {id: 51, cat: TV, desc: "Yerli Dizi"}
|
||||
- {id: 44, cat: Books, desc: "E-BooK"}
|
||||
|
||||
|
||||
modes:
|
||||
search: [q]
|
||||
tv-search: [q, season, ep]
|
||||
movie-search: [q]
|
||||
|
||||
|
||||
settings:
|
||||
- name: username
|
||||
type: text
|
||||
@@ -84,7 +85,7 @@
|
||||
options:
|
||||
"desc": "desc"
|
||||
"asc": "asc"
|
||||
|
||||
|
||||
login:
|
||||
path: ?p=home&pid=1
|
||||
method: form
|
||||
@@ -106,11 +107,11 @@
|
||||
test:
|
||||
path: ?p=home&pid=1
|
||||
selector: a[href*="/?p=logout&"]
|
||||
|
||||
|
||||
search:
|
||||
paths:
|
||||
- path: /
|
||||
keywordsfilters:
|
||||
keywordsfilters:
|
||||
- name: re_replace
|
||||
args: ["[^a-zA-Z0-9]+", "%25"]
|
||||
inputs:
|
||||
@@ -145,7 +146,7 @@
|
||||
attribute: href
|
||||
date:
|
||||
optional: true
|
||||
# Uploaded 30-01-2019 15:02 by
|
||||
# Uploaded 30-01-2019 15:02 by
|
||||
selector: td.torrent_name:not(:contains(" at "))
|
||||
filters:
|
||||
- name: regexp
|
||||
|
@@ -1,4 +1,4 @@
|
||||
---
|
||||
---
|
||||
site: bluebirdhd
|
||||
name: BlueBird
|
||||
description: "BlueBird is a RUSSIAN Private Torrent Tracker for HD MOVIES"
|
||||
|
@@ -13,9 +13,11 @@
|
||||
- {id: 1, cat: Movies, desc: "Movies"}
|
||||
- {id: 2, cat: TV, desc: "TV"}
|
||||
- {id: 3, cat: Movies, desc: "FANRES"}
|
||||
- {id: 6, cat: TV/Anime, desc: "Anime"}
|
||||
- {id: 7, cat: Movies/Other, desc: "Trailer"}
|
||||
|
||||
modes:
|
||||
search: [q]
|
||||
search: [q, imdbid]
|
||||
tv-search: [q, season, ep, imdbid]
|
||||
movie-search: [q, imdbid]
|
||||
|
||||
@@ -51,7 +53,7 @@
|
||||
test:
|
||||
path: /
|
||||
selector: a[href$="/logout"]
|
||||
|
||||
|
||||
ratio:
|
||||
path: /
|
||||
selector: li:has(i.fa-sync-alt)
|
||||
|
@@ -1,4 +1,4 @@
|
||||
---
|
||||
---
|
||||
site: booktracker
|
||||
name: BookTracker
|
||||
description: "BookTracker is a RUSSIAN Semi-Private Torrent Tracker for EBOOKS"
|
||||
|
133
src/Jackett.Common/Definitions/boxingtorrents.yml
Normal file
133
src/Jackett.Common/Definitions/boxingtorrents.yml
Normal file
@@ -0,0 +1,133 @@
|
||||
---
|
||||
site: boxingtorrents
|
||||
name: Boxing Torrents
|
||||
description: "Boxing Torrents is a Private Torrent Tracker for BOXING"
|
||||
language: en-us
|
||||
type: private
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- https://tc-boxing.com/
|
||||
|
||||
caps:
|
||||
categorymappings:
|
||||
- {id: 15, cat: TV/Sport, desc: "3D"}
|
||||
- {id: 9, cat: TV/Sport, desc: "Amateur - Full"}
|
||||
- {id: 16, cat: TV/Sport, desc: "Blu-ray"}
|
||||
- {id: 13, cat: TV/Sport, desc: "Career Set"}
|
||||
- {id: 8, cat: TV/Sport, desc: "DVD"}
|
||||
- {id: 10, cat: TV/Sport, desc: "Foreign - Excellent"}
|
||||
- {id: 11, cat: TV/Sport, desc: "Foreign - Fair"}
|
||||
- {id: 6, cat: TV/Sport, desc: "Foreign - Good"}
|
||||
- {id: 12, cat: TV/Sport, desc: "Foreign - Poor"}
|
||||
- {id: 1, cat: TV/Sport, desc: "Full - Excellent"}
|
||||
- {id: 3, cat: TV/Sport, desc: "Full - Fair"}
|
||||
- {id: 2, cat: TV/Sport, desc: "Full - Good"}
|
||||
- {id: 4, cat: TV/Sport, desc: "Full - Poor"}
|
||||
- {id: 14, cat: TV/Sport, desc: "HD"}
|
||||
- {id: 7, cat: TV/Sport, desc: "Misc"}
|
||||
|
||||
|
||||
modes:
|
||||
search: [q]
|
||||
tv-search: [q, season, ep]
|
||||
|
||||
settings:
|
||||
- name: username
|
||||
type: text
|
||||
label: Username
|
||||
- name: password
|
||||
type: password
|
||||
label: Password
|
||||
- name: sort
|
||||
type: select
|
||||
label: Sort requested from site
|
||||
default: "added"
|
||||
options:
|
||||
"added": "created"
|
||||
"seeders": "seeders"
|
||||
"size": "size"
|
||||
"name": "title"
|
||||
- name: type
|
||||
type: select
|
||||
label: Order requested from site
|
||||
default: "DESC"
|
||||
options:
|
||||
"DESC": "desc"
|
||||
"ASC": "asc"
|
||||
- name: info_download
|
||||
type: info
|
||||
label: "Download Restrictions"
|
||||
default: "You must have uploaded at least 10GB before you are able to access all torrent sizes. Until then, you are restricted to torrents no larger than 2.5GB."
|
||||
|
||||
login:
|
||||
path: takelogin.php
|
||||
method: post
|
||||
inputs:
|
||||
username: "{{ .Config.username }}"
|
||||
password: "{{ .Config.password }}"
|
||||
error:
|
||||
- selector: td.embedded:contains("Login failed!")
|
||||
test:
|
||||
path: browse.php
|
||||
selector: a[href="logout.php"]
|
||||
|
||||
download:
|
||||
selector: a[href^="download.php"]
|
||||
attribute: href
|
||||
|
||||
search:
|
||||
paths:
|
||||
# https://tc-boxing.com/browse.php?c16=1&c8=1&c14=1&incldead=1
|
||||
# https://tc-boxing.com/browse.php?search=tyson&cat=0&incldead=1
|
||||
- path: browse.php
|
||||
inputs:
|
||||
$raw: "{{ if .Categories }}{{ range .Categories }}c{{.}}=1&{{end}}{{else}}cat=0{{end}}"
|
||||
# 0 active 1 incldead 2 onlydead
|
||||
incldead: 1
|
||||
search: "{{ .Keywords }}"
|
||||
sort: "{{ .Config.sort }}"
|
||||
d: "{{ .Config.type }}"
|
||||
|
||||
rows:
|
||||
selector: table[border="1"][cellspacing="0"][cellpadding="5"] tr:has(a[href^="details.php?id="])
|
||||
|
||||
fields:
|
||||
category:
|
||||
selector: a[href^="browse.php?cat="]
|
||||
attribute: href
|
||||
filters:
|
||||
- name: querystring
|
||||
args: cat
|
||||
title:
|
||||
selector: a[href^="details.php?id="]
|
||||
details:
|
||||
selector: a[href^="details.php?id="]
|
||||
attribute: href
|
||||
download:
|
||||
selector: a[href^="details.php?id="]
|
||||
attribute: href
|
||||
files:
|
||||
selector: td:nth-last-child(8)
|
||||
date:
|
||||
selector: td:nth-last-child(6)
|
||||
filters:
|
||||
- name: dateparse
|
||||
args: "2006-01-0215:04:05"
|
||||
size:
|
||||
selector: td:nth-last-child(5)
|
||||
grabs:
|
||||
selector: td:nth-last-child(4)
|
||||
filters:
|
||||
- name: regexp
|
||||
args: (\d+)
|
||||
seeders:
|
||||
selector: td:nth-last-child(3)
|
||||
leechers:
|
||||
selector: td:nth-last-child(2)
|
||||
downloadvolumefactor:
|
||||
case:
|
||||
"b:contains(\"FreeLeech\")": 0
|
||||
"*": 1
|
||||
uploadvolumefactor:
|
||||
text: 1
|
||||
# engine n/a
|
@@ -6,6 +6,8 @@
|
||||
type: private
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- https://broadcity.in/
|
||||
legacylinks:
|
||||
- http://broadcity.in/
|
||||
|
||||
caps:
|
||||
|
@@ -15,7 +15,7 @@
|
||||
- {id: 410, cat: TV, desc: "TV Series/剧集"}
|
||||
|
||||
modes:
|
||||
search: [q]
|
||||
search: [q, imdbid]
|
||||
tv-search: [q, season, ep, imdbid]
|
||||
movie-search: [q, imdbid]
|
||||
|
||||
@@ -43,7 +43,7 @@
|
||||
options:
|
||||
"desc": "desc"
|
||||
"asc": "asc"
|
||||
|
||||
|
||||
login:
|
||||
method: cookie
|
||||
inputs:
|
||||
@@ -86,7 +86,7 @@
|
||||
args: cat
|
||||
details:
|
||||
selector: a[href^="details.php?id="]
|
||||
attribute: href
|
||||
attribute: href
|
||||
download:
|
||||
selector: a[href^="download.php?id="]
|
||||
attribute: href
|
||||
|
@@ -33,39 +33,59 @@
|
||||
options:
|
||||
"time": "created"
|
||||
"length": "size"
|
||||
"popular": "seeders"
|
||||
"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:
|
||||
# download can be missing despite icon being present. Fortunately the magnet is always there
|
||||
selector: a[href$=".torrent"]
|
||||
attribute: href
|
||||
optional: true
|
||||
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
|
||||
seeders:
|
||||
selector: div[class$="info"] span:nth-of-type(4)
|
||||
leechers:
|
||||
selector: div[class$="info"] span:nth-of-type(5)
|
||||
downloadvolumefactor:
|
||||
text: 0
|
||||
uploadvolumefactor:
|
||||
|
@@ -20,7 +20,7 @@
|
||||
settings:
|
||||
- name: info
|
||||
type: info
|
||||
default: BTDigg does not use categories. In your software Indexer settings, set the category to 100001.
|
||||
default: BTDigg does not use categories. In your software Indexer settings, set the category to 7000.
|
||||
- name: sort
|
||||
type: select
|
||||
label: Sort requested from site
|
||||
|
68
src/Jackett.Common/Definitions/bteye.yml
Normal file
68
src/Jackett.Common/Definitions/bteye.yml
Normal file
@@ -0,0 +1,68 @@
|
||||
---
|
||||
site: bteye
|
||||
name: BTeye
|
||||
description: "BTeye is a Public BitTorrent DHT search engine."
|
||||
language: en-us
|
||||
type: public
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- https://www.bteye.org/
|
||||
|
||||
caps:
|
||||
categories:
|
||||
1: Other
|
||||
|
||||
modes:
|
||||
search: [q]
|
||||
tv-search: [q, season, ep]
|
||||
movie-search: [q]
|
||||
|
||||
settings:
|
||||
- name: info
|
||||
type: info
|
||||
default: BTeye does not use categories. In your software Indexer settings, set the category to 7000.
|
||||
|
||||
download:
|
||||
selector: a[href^="magnet:?xt="]
|
||||
attribute: href
|
||||
|
||||
search:
|
||||
# https://www.bteye.org/q/2020
|
||||
paths:
|
||||
- path: "q/{{ if .Keywords }}{{ .Keywords }}{{else}}2020{{end}}"
|
||||
|
||||
rows:
|
||||
selector: div.plist
|
||||
filters:
|
||||
- name: andmatch
|
||||
|
||||
fields:
|
||||
category:
|
||||
text: 1
|
||||
title:
|
||||
selector: div.pname a
|
||||
attribute: title
|
||||
details:
|
||||
selector: div.pname a
|
||||
attribute: href
|
||||
download:
|
||||
selector: div.pname a
|
||||
attribute: href
|
||||
date:
|
||||
selector: div.plink b:nth-of-type(3)
|
||||
filters:
|
||||
- name: dateparse
|
||||
args: "2006-01-02"
|
||||
files:
|
||||
selector: div.plink b:nth-of-type(2)
|
||||
size:
|
||||
selector: div.plink b:nth-of-type(1)
|
||||
seeders:
|
||||
text: 1
|
||||
leechers:
|
||||
text: 1
|
||||
downloadvolumefactor:
|
||||
text: 0
|
||||
uploadvolumefactor:
|
||||
text: 1
|
||||
# engine n/a
|
@@ -1,4 +1,4 @@
|
||||
---
|
||||
---
|
||||
site: btnext
|
||||
name: BTNext
|
||||
description: "BTNext (BTNT) is a PORTUGUESE Private Torrent Tracker for 0DAY / GENERAL"
|
||||
@@ -6,8 +6,7 @@
|
||||
type: private
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- http://tracker.btnext.com/
|
||||
# note: the site forces http, https is not supported
|
||||
- http://tracker.btnext.com/ # site forces http, https is not supported
|
||||
|
||||
caps:
|
||||
categorymappings:
|
||||
@@ -149,7 +148,7 @@
|
||||
search:
|
||||
paths:
|
||||
- path: /
|
||||
keywordsfilters:
|
||||
keywordsfilters:
|
||||
- name: re_replace
|
||||
args: ["[^a-zA-Z0-9]+", "%25"]
|
||||
inputs:
|
||||
|
@@ -1,4 +1,4 @@
|
||||
---
|
||||
---
|
||||
site: btschool
|
||||
name: BTSCHOOL
|
||||
description: "BTSCHOOL is a CHINESE Private Torrent Tracker for MOVIES / TV / GENERAL"
|
||||
@@ -23,7 +23,7 @@
|
||||
- {id: 415, cat: Other, desc: "其他/Other"}
|
||||
|
||||
modes:
|
||||
search: [q]
|
||||
search: [q, imdbid]
|
||||
tv-search: [q, season, ep, imdbid]
|
||||
movie-search: [q, imdbid]
|
||||
|
||||
@@ -78,7 +78,7 @@
|
||||
attribute: title
|
||||
details:
|
||||
selector: a[title][href^="details.php?id="]
|
||||
attribute: href
|
||||
attribute: href
|
||||
download:
|
||||
selector: a[href^="download.php?id="]
|
||||
attribute: href
|
||||
|
@@ -6,9 +6,10 @@
|
||||
type: public
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- https://btio.pw/
|
||||
- https://btsow.club/
|
||||
legacylinks:
|
||||
- https://btos.pw/
|
||||
- https://btio.pw/
|
||||
|
||||
caps:
|
||||
categories:
|
||||
|
@@ -1,4 +1,4 @@
|
||||
---
|
||||
---
|
||||
site: carpathians
|
||||
name: Carpathians
|
||||
description: "Carpathians is a HUNGARIAN Private Torrent Tracker for 0DAY / GENERAL"
|
||||
|
@@ -1,4 +1,4 @@
|
||||
---
|
||||
---
|
||||
site: cartoonchaos
|
||||
name: CartoonChaos
|
||||
description: "CartoonChaos (CC) is a Private Torrent Tracker for ANIMATED MOVIES / TV"
|
||||
@@ -6,7 +6,7 @@
|
||||
type: private
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- http://www.cartoonchaos.org/
|
||||
- http://www.cartoonchaos.org/ # site does not support https NET::ERR_CERT_AUTHORITY_INVALID
|
||||
|
||||
settings:
|
||||
- name: username
|
||||
@@ -115,6 +115,14 @@
|
||||
args: [" http://anonym.to?javascript:popdetails('", ""]
|
||||
- name: replace
|
||||
args: ["');", ""]
|
||||
banner:
|
||||
selector: td a[href^="index.php?page=torrent-details"]
|
||||
attribute: onmouseover
|
||||
filters:
|
||||
- name: regexp
|
||||
args: "src=(.+?) width"
|
||||
- name: replace
|
||||
args: ["torrentimg/nocover.jpg", ""]
|
||||
size:
|
||||
selector: td:nth-child(10)
|
||||
# two flavours of dates
|
||||
@@ -146,4 +154,4 @@
|
||||
"*": 1
|
||||
uploadvolumefactor:
|
||||
text: 1
|
||||
# xbtit 2.0.0
|
||||
# xbtit 2.0.0
|
||||
|
@@ -1,4 +1,4 @@
|
||||
---
|
||||
---
|
||||
site: casatorrent
|
||||
name: Casa-Torrent
|
||||
description: "Casa-Torrent is a FRENCH Private Torrent Tracker for MOVIES / TV / GENERAL"
|
||||
|
@@ -1,4 +1,4 @@
|
||||
---
|
||||
---
|
||||
site: casstudiotv
|
||||
name: CasStudioTV
|
||||
description: "CasStudioTV is a RUSSIAN Semi-Private Torrent Tracker for TV"
|
||||
|
@@ -42,9 +42,33 @@
|
||||
- {id: 22, cat: Other, desc: "杂项"}
|
||||
|
||||
modes:
|
||||
search: [q]
|
||||
tv-search: [q, season, ep]
|
||||
movie-search: [q]
|
||||
search: [q, imdbid]
|
||||
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: "added"
|
||||
options:
|
||||
"added": "created"
|
||||
"seeders": "seeders"
|
||||
"size": "size"
|
||||
"name": "title"
|
||||
- name: type
|
||||
type: select
|
||||
label: Order requested from site
|
||||
default: "DESC"
|
||||
options:
|
||||
"DESC": "desc"
|
||||
"ASC": "asc"
|
||||
|
||||
login:
|
||||
path: takelogin.php
|
||||
@@ -60,13 +84,14 @@
|
||||
search:
|
||||
paths:
|
||||
- path: browse.php
|
||||
method: get
|
||||
inputs:
|
||||
$raw: "{{ range .Categories }}c{{.}}=1&{{end}}"
|
||||
search: "{{ .Keywords }}"
|
||||
search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{else}}{{ .Keywords }}{{end}}"
|
||||
# 0 active 1 incldead 2 deadonly
|
||||
incldead: 1
|
||||
sort: added
|
||||
d: DESC
|
||||
fullsearch: "{{ if .Query.IMDBID }}1{{else}}{{end}}"
|
||||
sort: "{{ .Config.sort }}"
|
||||
d: "{{ .Config.sort }}"
|
||||
|
||||
rows:
|
||||
selector: table[border="1"][cellpadding="5"] > tbody > tr:has(a[href^="details.php?id="])
|
||||
@@ -86,7 +111,7 @@
|
||||
args: cat
|
||||
details:
|
||||
selector: a[href^="details.php?id="]
|
||||
attribute: href
|
||||
attribute: href
|
||||
download:
|
||||
selector: a[href^="download.php/"]
|
||||
attribute: href
|
||||
@@ -122,7 +147,10 @@
|
||||
"*": 1
|
||||
uploadvolumefactor:
|
||||
case:
|
||||
"font:has([src=\"/pic/arrowup1.gif\"]):contains(\"1.5x\")": 1.5
|
||||
"font:has([src=\"/pic/arrowup1.gif\"]):contains(\"2x\")": 2
|
||||
"*": 1
|
||||
description:
|
||||
selector: td:nth-child(2) > table > tbody > tr:nth-child(2)
|
||||
remove: a, img
|
||||
# Discuz! 7.2
|
||||
|
@@ -18,7 +18,7 @@
|
||||
- {id: 4, cat: TV/Sport, desc: "Sports"}
|
||||
|
||||
modes:
|
||||
search: [q]
|
||||
search: [q, imdbid]
|
||||
tv-search: [q, season, ep, imdbid]
|
||||
movie-search: [q, imdbid]
|
||||
|
||||
@@ -85,8 +85,10 @@
|
||||
sort: "{{ .Config.sort }}"
|
||||
direction: "{{ .Config.type }}"
|
||||
qty: 100
|
||||
|
||||
rows:
|
||||
selector: table > tbody > tr
|
||||
|
||||
fields:
|
||||
category:
|
||||
selector: a[href*="/categories/"]
|
||||
|
@@ -6,9 +6,10 @@
|
||||
type: public
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- http://www.cilijj.xyz/
|
||||
- https://www.cilijj.xyz/
|
||||
legacylinks:
|
||||
- http://www.cili180.com/
|
||||
- http://www.cilijj.xyz/
|
||||
|
||||
caps:
|
||||
categories:
|
||||
|
@@ -6,6 +6,8 @@
|
||||
type: private
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- https://cinemageddon.net/
|
||||
legacylinks:
|
||||
- http://cinemageddon.net/
|
||||
|
||||
caps:
|
||||
@@ -45,7 +47,7 @@
|
||||
- selector: table:contains("Login failed!")
|
||||
test:
|
||||
path: index.php
|
||||
|
||||
|
||||
search:
|
||||
paths:
|
||||
- path: browse.php
|
||||
@@ -94,4 +96,4 @@
|
||||
"*": "1"
|
||||
uploadvolumefactor:
|
||||
case:
|
||||
"*": "1"
|
||||
"*": "1"
|
||||
|
@@ -117,4 +117,4 @@
|
||||
uploadvolumefactor:
|
||||
case:
|
||||
"img[title=\"Platinum Torrent: No Download Stats are Recorded, Upload Stats are Doubled!\"]": 2
|
||||
"*": 1
|
||||
"*": 1
|
||||
|
@@ -6,7 +6,7 @@
|
||||
type: private
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- http://classix-unlimited.co.uk/
|
||||
- http://classix-unlimited.co.uk/ # site does not support https ERR_CONNECTION_CLOSED
|
||||
|
||||
caps:
|
||||
categorymappings:
|
||||
@@ -63,4 +63,4 @@
|
||||
"*": "1"
|
||||
uploadvolumefactor:
|
||||
case:
|
||||
"*": "1"
|
||||
"*": "1"
|
||||
|
@@ -1,4 +1,4 @@
|
||||
---
|
||||
---
|
||||
site: cpasbien
|
||||
name: cpasbien
|
||||
description: "cpasbien is a FRENCH Public site for TV / MOVIES / GENERAL"
|
||||
@@ -7,7 +7,7 @@
|
||||
encoding: UTF-8
|
||||
followredirect: true
|
||||
links:
|
||||
- https://vww.cpasbien-fr.fr/
|
||||
- https://wvw.cpasbien-fr.fr/
|
||||
legacylinks:
|
||||
- http://www.cpasbiens.cc/
|
||||
- http://www.cpabien.cm/
|
||||
@@ -38,6 +38,7 @@
|
||||
- https://www.cpasbien.vg/
|
||||
- https://www.cpasbien.lol/
|
||||
- https://www.gktorrent.biz/
|
||||
- https://vww.cpasbien-fr.fr/
|
||||
|
||||
caps:
|
||||
categorymappings:
|
||||
|
@@ -1,4 +1,4 @@
|
||||
---
|
||||
---
|
||||
site: crazyscorner
|
||||
name: Crazy's Corner
|
||||
description: "Crazy's Corner is a Private Torrent Tracker for MUSIC"
|
||||
@@ -6,7 +6,7 @@
|
||||
type: private
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- http://crazys-corner.info/
|
||||
- http://crazys-corner.info/ # site does not support https ERR_CONNECTION_REFUSED
|
||||
|
||||
caps:
|
||||
categorymappings:
|
||||
@@ -132,9 +132,6 @@
|
||||
download:
|
||||
selector: a[href*="/details.php?id="]
|
||||
attribute: href
|
||||
magnet:
|
||||
selector: a[href^="magnet:?xt="]
|
||||
attribute: href
|
||||
banner:
|
||||
selector: img[src*="/torrents/images/"]
|
||||
attribute: src
|
||||
|
@@ -1,4 +1,4 @@
|
||||
---
|
||||
---
|
||||
site: crazyspirits
|
||||
name: CrazySpirits
|
||||
description: "Crazy Spirits is a FRENCH Private Torrent Tracker for MOVIES / TV / GENERAL"
|
||||
@@ -208,4 +208,4 @@
|
||||
uploadvolumefactor:
|
||||
case:
|
||||
"*": 1
|
||||
# TT3.0
|
||||
# TT3.0
|
||||
|
@@ -1,4 +1,4 @@
|
||||
---
|
||||
---
|
||||
site: crnaberza
|
||||
name: CrnaBerza
|
||||
description: "Crna Berza is a BALKAN Private Torrent Tracker for MOVIES / TV / GENERAL"
|
||||
|
@@ -1,4 +1,4 @@
|
||||
site: cztorrent
|
||||
site: cztorrent
|
||||
name: CzTorrent
|
||||
description: "CzTorrent is a Czech Semi-Private site for TV / MOVIES / GENERAL"
|
||||
language: cs-cz
|
||||
@@ -79,6 +79,10 @@
|
||||
|
||||
rows:
|
||||
selector: tr.torr_hover
|
||||
|
||||
keywordsfilters:
|
||||
- name: re_replace
|
||||
args: ["S[0-9]{2}([^E]|$)", ""] # remove season tag without episode (search doesn't support it)
|
||||
|
||||
fields:
|
||||
title:
|
||||
|
@@ -1,4 +1,4 @@
|
||||
---
|
||||
---
|
||||
site: datascene
|
||||
name: DataScene
|
||||
description: "DataScene (DS) is a ROMANIAN Private Torrent Tracker for MOVIES / TV / GENERAL"
|
||||
@@ -54,9 +54,33 @@
|
||||
- {id: 12, cat: XXX, desc: "XxX"}
|
||||
|
||||
modes:
|
||||
search: [q]
|
||||
movie-search: [q]
|
||||
tv-search: [q, season, ep]
|
||||
search: [q, imdbid]
|
||||
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
|
||||
@@ -68,7 +92,7 @@
|
||||
- selector: td.embedded:has(h2:contains("failed"))
|
||||
test:
|
||||
path: browse.php
|
||||
|
||||
|
||||
ratio:
|
||||
path: browse.php
|
||||
selector: font:contains("Ratio:") > span
|
||||
@@ -77,9 +101,14 @@
|
||||
paths:
|
||||
- path: browse.php
|
||||
inputs:
|
||||
$raw: "{{ range .Categories }}c{{.}}=1&{{end}}"
|
||||
search: "{{ .Keywords }}"
|
||||
incldead: 1
|
||||
$raw: "{{ if .Categories}}{{ range .Categories }}c{{.}}=1&{{end}}{{else}}cat=0{{end}}"
|
||||
search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{else}}{{ .Keywords }}{{end}}"
|
||||
# 1 active 2 incldead 3 onlydead 4 free
|
||||
incldead: 2
|
||||
# 0 name 1 genre 2 descr 3 imdb
|
||||
blah: "{{ if .Query.IMDBID }}3{{else}}0{{end}}"
|
||||
sort: "{{ .Config.sort }}"
|
||||
type: "{{ .Config.type }}"
|
||||
|
||||
rows:
|
||||
selector: div.ncls > table > tbody > tr:has(a.tname)
|
||||
|
@@ -17,7 +17,7 @@
|
||||
- {id: 5, cat: Console, desc: "Game"}
|
||||
|
||||
modes:
|
||||
search: [q]
|
||||
search: [q, imdbid]
|
||||
tv-search: [q, season, ep, imdbid]
|
||||
movie-search: [q, imdbid]
|
||||
|
||||
|
@@ -1,4 +1,4 @@
|
||||
---
|
||||
---
|
||||
site: divteam
|
||||
name: DivTeam
|
||||
description: "DivTeam is a SPANISH Private Torrent Tracker for MOVIES / GENERAL"
|
||||
|
@@ -1,4 +1,4 @@
|
||||
---
|
||||
---
|
||||
site: documentarytorrents
|
||||
name: DocumentaryTorrents
|
||||
description: "Documentary Torrents (DT) is a Private Torrent Tracker for E-LEARNING MOVIES / TV"
|
||||
@@ -88,7 +88,7 @@
|
||||
label: Sort requested from site
|
||||
default: "id"
|
||||
options:
|
||||
"is": "created"
|
||||
"id": "created"
|
||||
"seeders": "seeders"
|
||||
"size": "size"
|
||||
"name": "title"
|
||||
|
@@ -1,4 +1,4 @@
|
||||
---
|
||||
---
|
||||
site: downloadville
|
||||
name: Downloadville
|
||||
description: "Downloadville is a FRENCH Private Torrent Tracker for MOVIES / TV / GENERAL"
|
||||
@@ -34,6 +34,8 @@
|
||||
- {id: 40, cat: Movies, desc: "Films V.O. SD"}
|
||||
- {id: 41, cat: Movies, desc: "Films V.O. HD"}
|
||||
- {id: 42, cat: Movies, desc: "Films TV-Rip"}
|
||||
# 4K LIGHT
|
||||
- {id: 95, cat: Movies, desc: "4K LIGHT"}
|
||||
# Séries-Télé
|
||||
- {id: 16, cat: TV, desc: "Séries-Télé"}
|
||||
- {id: 17, cat: TV, desc: "Séries-Télé TV Pack SD"}
|
||||
@@ -138,7 +140,7 @@
|
||||
default: FRENCH
|
||||
options:
|
||||
FRENCH : "FRENCH"
|
||||
MULTI.FRENCH : "MULTI.FRENCH"
|
||||
MULTI.FRENCH : "MULTI.FRENCH"
|
||||
ENGLISH: "ENGLISH"
|
||||
- name: sort
|
||||
type: select
|
||||
@@ -169,7 +171,7 @@
|
||||
uid: "{{ .Config.uid }}"
|
||||
pwd: "{{ .Config.pwd }}"
|
||||
error:
|
||||
- selector: form[action="index.php?page=login&returnto=index.php"] table tr:nth-of-type(2) td
|
||||
- selector: form[action="index.php?page=login&returnto=index.php"] table tr:nth-of-type(2) td
|
||||
message:
|
||||
selector: form[action="index.php?page=login&returnto=index.php"] table tr:nth-of-type(2) td span
|
||||
test:
|
||||
@@ -190,6 +192,8 @@
|
||||
search:
|
||||
paths:
|
||||
- path: tracker/index.php
|
||||
headers:
|
||||
Referer: ["https://downloadville.net/tracker/index.php?page=torrents&search=fake_referer&active=0"]
|
||||
inputs:
|
||||
page: torrents
|
||||
search: "{{ .Keywords }}"
|
||||
@@ -210,7 +214,7 @@
|
||||
text: "{{ .Result.title_phase1 }}"
|
||||
filters:
|
||||
- name: re_replace
|
||||
args: ["[\\.\\s\\[\\-][Mm][Uu][Ll][Tt][Ii][\\.\\s\\]\\-]", ".{{ .Config.multilanguage }}."]
|
||||
args: ["[\\.\\s\\[\\-][Mm][Uu][Ll][Tt][Ii][\\.\\s\\]\\-]", ".{{ .Config.multilanguage }}."]
|
||||
title:
|
||||
text: "{{if .Config.multilang }}{{ .Result.title_multilang }}{{else}}{{ .Result.title_phase1 }}{{end}}"
|
||||
details:
|
||||
|
@@ -1,4 +1,4 @@
|
||||
---
|
||||
---
|
||||
site: dragonworldreloaded
|
||||
name: Dragonworld Reloaded
|
||||
description: "Dragonworld Reloaded is a GERMAN Private Torrent Tracker for MOVIES / TV / GENERAL"
|
||||
|
@@ -24,7 +24,7 @@
|
||||
- {id: 12, cat: TV/Anime, desc: "Anime-Movie"}
|
||||
|
||||
modes:
|
||||
search: [q]
|
||||
search: [q, imdbid]
|
||||
tv-search: [q, season, ep, imdbid]
|
||||
movie-search: [q, imdbid]
|
||||
|
||||
|
@@ -1,4 +1,4 @@
|
||||
---
|
||||
---
|
||||
site: ebookparadijs
|
||||
name: EbookParadijs
|
||||
description: "EbookParadijs is a DUTCH Private Tracker for EBOOKS"
|
||||
|
@@ -352,4 +352,4 @@
|
||||
"*": 1
|
||||
uploadvolumefactor:
|
||||
case:
|
||||
"*": 1
|
||||
"*": 1
|
||||
|
@@ -1,4 +1,4 @@
|
||||
---
|
||||
---
|
||||
site: efectodoppler
|
||||
name: Efecto Doppler
|
||||
description: "Efecto Doppler is a SPANISH Private Torrent Tracker for MUSIC"
|
||||
|
@@ -1,140 +0,0 @@
|
||||
---
|
||||
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,7 +6,7 @@
|
||||
type: public
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- https://www.elitetorrent.bz/
|
||||
- https://www.elitetorrent.nl/
|
||||
legacylinks:
|
||||
- https://www.elitetorrent.biz/
|
||||
- https://www.elitetorrent.io/
|
||||
@@ -15,6 +15,7 @@
|
||||
- https://www.elitetorrent.nu/
|
||||
- https://www.elitetorrent.tv/
|
||||
- https://www.elitetorrent.li/
|
||||
- https://www.elitetorrent.bz/
|
||||
|
||||
caps:
|
||||
categories:
|
||||
@@ -73,6 +74,9 @@
|
||||
download:
|
||||
selector: .meta a
|
||||
attribute: href
|
||||
banner:
|
||||
selector: .imagen img
|
||||
attribute: data-src
|
||||
category:
|
||||
selector: .meta a
|
||||
attribute: href
|
||||
|
@@ -1,4 +1,4 @@
|
||||
---
|
||||
---
|
||||
site: eniahd
|
||||
name: EniaHD
|
||||
description: "EniaHD is a RUSSIAN Semi-Private Torrent Tracker for MOVIES / TV"
|
||||
|
199
src/Jackett.Common/Definitions/erzsebet.yml
Normal file
199
src/Jackett.Common/Definitions/erzsebet.yml
Normal file
@@ -0,0 +1,199 @@
|
||||
---
|
||||
site: erzsebet
|
||||
name: Erzsebet
|
||||
description: "Erzsebet is a RUSSIAN Semi-Private Torrent Tracker for 3X"
|
||||
language: ru-ru
|
||||
type: semi-private
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- https://erzsebet.org/
|
||||
|
||||
caps:
|
||||
categorymappings:
|
||||
- {id: 9, cat: XXX, desc: "Feature, Vignettes, Classic / Фильмы с сюжетом и Классичес..."}
|
||||
- {id: 11, cat: XXX, desc: "Gonzo & All Sex / Гонзо-фильмы и Фильмы без сюжета"}
|
||||
- {id: 13, cat: XXX, desc: "All Girl & Solo / Лесбо-фильмы"}
|
||||
- {id: 12, cat: XXX, desc: "Ethnic-Themed / Этнические фильмы"}
|
||||
- {id: 176, cat: XXX, desc: "Mobile, Pocket РС & Phone / Фильмы для моби..."}
|
||||
- {id: 157, cat: XXX, desc: "Full Length Movies Packs / Паки фильмов"}
|
||||
- {id: 16, cat: XXX, desc: "Feature, Vignettes, Classic (HD) / Фильмы с сюжет..."}
|
||||
- {id: 18, cat: XXX, desc: "Gonzo & All Sex, All Girl & Solo, Ethnic-Themed..."}
|
||||
- {id: 180, cat: XXX, desc: "Full Length Movies (DVD) / Фильмы (DVD)"}
|
||||
- {id: 246, cat: XXX, desc: "Full Length Movies (Blu-Ray) / Фильмы (Blu-Ray)"}
|
||||
- {id: 48, cat: XXX, desc: "Clips (various) / Порно Разное"}
|
||||
- {id: 32, cat: XXX, desc: "SiteRip's & Movie Scenes / Сайтрипы и сцены ..."}
|
||||
- {id: 45, cat: XXX, desc: "SiteRip's & Movie Scenes (HD) / Сайтрипы и сцены..."}
|
||||
- {id: 177, cat: XXX, desc: "3D & Virtual Reality Videos (VR) / Видео в 3D и..."}
|
||||
- {id: 43, cat: XXX, desc: "Actresses Clips Packs / Паки по актрисам"}
|
||||
- {id: 39, cat: XXX, desc: "SiteRip's Packs / Паки сайтрипов"}
|
||||
- {id: 52, cat: XXX, desc: "Russian Clips (various) / Порно Разное с русскими актрисам..."}
|
||||
- {id: 53, cat: XXX, desc: "Russian SiteRip's & Movie Scenes / Сайтрип..."}
|
||||
- {id: 54, cat: XXX, desc: "Russian SiteRip's & Movie Scenes (HD) / Сайтрипы..."}
|
||||
- {id: 56, cat: XXX, desc: "Russian Full Length Movies / Русские полнометражные фильмы"}
|
||||
- {id: 50, cat: XXX, desc: "Russian Clips Packs / Паки русского и по русским актрисам"}
|
||||
- {id: 59, cat: XXX, desc: "Amateur Picture / Любительское фото"}
|
||||
- {id: 58, cat: XXX, desc: "Amateur Video & WebCams / Любительское видео"}
|
||||
- {id: 128, cat: XXX, desc: "Amateur Packs / Паки любительского"}
|
||||
- {id: 129, cat: XXX, desc: "Bukkake, Glory Hole, Cumshot Compilation, BlowGangBang ..."}
|
||||
- {id: 130, cat: XXX, desc: "Squirting & Lesbian Bukkake / Лесбо и соло сквиртинг"}
|
||||
- {id: 120, cat: XXX, desc: "Fisting, Dildo & Toys / Фистинг, фаллоимита..."}
|
||||
- {id: 131, cat: XXX, desc: "LegalPorno.com / Сайтрипы студии Legal Porno "}
|
||||
- {id: 64, cat: XXX, desc: "BDSM / БДСМ"}
|
||||
- {id: 65, cat: XXX, desc: "Fetish / Фетиш"}
|
||||
- {id: 66, cat: XXX, desc: "Peeing / Мочеиспускание"}
|
||||
- {id: 67, cat: XXX, desc: "Pregnant / Беременные"}
|
||||
- {id: 68, cat: XXX, desc: "Femdom & Strapon / Женское доминирование и страпон"}
|
||||
- {id: 71, cat: XXX, desc: "Kaviar Movies / Копрофилия"}
|
||||
- {id: 81, cat: XXX, desc: "Picture Gallery / Порнофотографии"}
|
||||
- {id: 80, cat: XXX, desc: "Misc & Special Interest Picture / Тематичес..."}
|
||||
- {id: 79, cat: XXX, desc: "Magazines, Comix & Artwork / Журналы, ком..."}
|
||||
- {id: 78, cat: XXX, desc: "Picture Packs / Паки фотографий"}
|
||||
- {id: 178, cat: XXX, desc: "Erotic Video Library / Эротические студии (видео)"}
|
||||
- {id: 85, cat: XXX, desc: "Adult Games / Порноигры"}
|
||||
- {id: 83, cat: XXX, desc: "Hentai, Manga & Cartoons / Хентай, Манга и Мультфильм..."}
|
||||
- {id: 89, cat: XXX, desc: "Japanese Porn / Японское порно"}
|
||||
- {id: 188, cat: XXX, desc: "Erotic Movies, Documentary & Reality / Эротически..."}
|
||||
- {id: 219, cat: XXX, desc: "Cinema / Зарубежный Кинематограф"}
|
||||
- {id: 218, cat: XXX, desc: "Cinema Series / Зарубежные сериалы"}
|
||||
- {id: 217, cat: XXX, desc: "Cinema (Russian) / Кинематограф СССР, России и бы..."}
|
||||
- {id: 216, cat: XXX, desc: "Russian Series / Русские сериалы"}
|
||||
- {id: 215, cat: XXX, desc: "Cartoons & Anime / Мультфильмы и Аниме"}
|
||||
- {id: 214, cat: XXX, desc: "Music (Audio) / Музыка (Аудио)"}
|
||||
- {id: 213, cat: XXX, desc: "Music (Video) / Музыка (Видео)"}
|
||||
- {id: 212, cat: XXX, desc: "Games / Игры"}
|
||||
- {id: 211, cat: XXX, desc: "Soft / Софт"}
|
||||
- {id: 210, cat: XXX, desc: "Various / Разное"}
|
||||
- {id: 205, cat: XXX, desc: "Shemale Transsexual / Транссексуалы"}
|
||||
- {id: 204, cat: XXX, desc: "Bisexual / Бисексуалы"}
|
||||
- {id: 206, cat: XXX, desc: "Gay Clips & Movie Scenes / Ролики, SiteRip'ы..."}
|
||||
- {id: 208, cat: XXX, desc: "Full Length Gay Movies / Полнометражные гей-фильмы"}
|
||||
- {id: 209, cat: XXX, desc: "Gay Magazines, Photo, Rest / Гей-журналы, фото, разное"}
|
||||
- {id: 125, cat: XXX, desc: "Archive / Архив"}
|
||||
|
||||
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: "1"
|
||||
options:
|
||||
"1": "created"
|
||||
"10": "seeders"
|
||||
"7": "size"
|
||||
"2": "title"
|
||||
- name: type
|
||||
type: select
|
||||
label: Order requested from site
|
||||
default: "2"
|
||||
options:
|
||||
"2": "desc"
|
||||
"1": "asc"
|
||||
|
||||
login:
|
||||
path: login.php
|
||||
method: form
|
||||
form: form[action="login.php"]
|
||||
inputs:
|
||||
login_username: "{{ .Config.username }}"
|
||||
login_password: "{{ .Config.password }}"
|
||||
autologin: 1
|
||||
error:
|
||||
- selector: table.error
|
||||
test:
|
||||
path: index.php
|
||||
selector: a[href="./login.php?logout=1"]
|
||||
|
||||
search:
|
||||
paths:
|
||||
- path: tracker.php
|
||||
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:
|
||||
$raw: "{{ if .Categories }}{{ range .Categories }}f[]={{.}}&{{end}}{{else}}f[]=-1{{end}}"
|
||||
prev_allw: 1
|
||||
prev_a: 0
|
||||
prev_dla: 0
|
||||
prev_dlc: 0
|
||||
prev_dld: 0
|
||||
prev_dlw: 0
|
||||
prev_my: 0
|
||||
prev_new: 0
|
||||
prev_sd: 0
|
||||
prev_da: 1
|
||||
prev_dc: 0
|
||||
prev_df: 1
|
||||
prev_ds: 0
|
||||
prev_tor_type: 0
|
||||
o: "{{ .Config.sort }}"
|
||||
s: "{{ .Config.type }}"
|
||||
# show category
|
||||
dc: 0
|
||||
# show forum
|
||||
df: 1
|
||||
# show author
|
||||
da: 1
|
||||
# show speed
|
||||
ds: 0
|
||||
# -1=all time
|
||||
tm: -1
|
||||
# seed not seen -1=disregard
|
||||
sns: -1
|
||||
# group releases -1=not selected
|
||||
srg: -1
|
||||
# title search
|
||||
nm: "{{ .Keywords }}"
|
||||
# find a username
|
||||
pn: ""
|
||||
# search by partial word
|
||||
allw: 0
|
||||
|
||||
rows:
|
||||
selector: tr[id^="tor_"]:has(a[href^="./dl.php?id="])
|
||||
|
||||
fields:
|
||||
category:
|
||||
selector: a.gen
|
||||
attribute: href
|
||||
filters:
|
||||
- name: querystring
|
||||
args: f
|
||||
title:
|
||||
selector: a.tLink
|
||||
details:
|
||||
selector: a.tLink
|
||||
attribute: href
|
||||
download:
|
||||
selector: a[href^="./dl.php?id="]
|
||||
attribute: href
|
||||
magnet:
|
||||
optional: true
|
||||
selector: a[href^="magnet:?xt="]
|
||||
attribute: href
|
||||
size:
|
||||
selector: td:nth-child(6) > u
|
||||
seeders:
|
||||
selector: td.seedmed > b
|
||||
leechers:
|
||||
selector: td.leechmed > b
|
||||
grabs:
|
||||
selector: td:nth-child(9)
|
||||
date:
|
||||
selector: td:last-child > u
|
||||
downloadvolumefactor:
|
||||
text: 1
|
||||
uploadvolumefactor:
|
||||
text: 1
|
||||
# TorrentPier
|
@@ -41,7 +41,7 @@
|
||||
- {id: 31, cat: TV, desc: "Subtitles - english subs"}
|
||||
|
||||
modes:
|
||||
search: [q]
|
||||
search: [q, imdbid]
|
||||
tv-search: [q, season, ep, imdbid]
|
||||
movie-search: [q, imdbid]
|
||||
|
||||
|
@@ -1,4 +1,4 @@
|
||||
---
|
||||
---
|
||||
site: estone
|
||||
name: eStone
|
||||
description: "eStone (XiDER, BeLoad) is a HUNGARIAN Private Torrent Tracker for 0DAY / GENERAL"
|
||||
@@ -6,7 +6,7 @@
|
||||
type: private
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- http://estone.cc/
|
||||
- http://estone.cc/ # site does not support https ERR_CONNECTION_REFUSED
|
||||
|
||||
caps:
|
||||
categorymappings:
|
||||
|
@@ -36,8 +36,8 @@
|
||||
- {id: 9, cat: XXX, desc: "XXX"}
|
||||
|
||||
modes:
|
||||
search: [q]
|
||||
tv-search: [q, season, ep]
|
||||
search: [q, imdbid]
|
||||
tv-search: [q, season, ep, imdbid]
|
||||
movie-search: [q, imdbid]
|
||||
|
||||
settings:
|
||||
@@ -57,9 +57,9 @@
|
||||
default: MULTI.FRENCH
|
||||
options:
|
||||
FRENCH : "FRENCH"
|
||||
MULTI.FRENCH : "MULTI.FRENCH"
|
||||
MULTI.FRENCH : "MULTI.FRENCH"
|
||||
ENGLISH: "ENGLISH"
|
||||
|
||||
|
||||
login:
|
||||
path: login3.php
|
||||
method: form
|
||||
@@ -85,15 +85,17 @@
|
||||
paths:
|
||||
- path: browse.php
|
||||
inputs:
|
||||
$raw: "{{range .Categories}}c{{.}}=1&{{end}}"
|
||||
search: "{{if .Query.IMDBID}}{{ .Query.IMDBID }}{{else}}{{ .Query.Keywords }}{{end}}"
|
||||
advcat: "0"
|
||||
incldead: "1"
|
||||
stype: "b"
|
||||
dp: "0"
|
||||
isUserClick: "0"
|
||||
$raw: "{{ range .Categories }}c{{.}}=1&{{end}}"
|
||||
search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{else}}{{ .Keywords }}{{end}}"
|
||||
advcat: 0
|
||||
incldead: 1
|
||||
stype: b
|
||||
dp: 0
|
||||
isUserClick: 0
|
||||
|
||||
rows:
|
||||
selector: p + table > tbody > tr:has(a[href^="/details.php"])
|
||||
|
||||
fields:
|
||||
download:
|
||||
selector: a[href^="/details.php"]:has(b)
|
||||
@@ -154,9 +156,9 @@
|
||||
args: "2006-01-0215:04:05 -07:00"
|
||||
downloadvolumefactor:
|
||||
case:
|
||||
"img[title^=\"Freeleech: \"]": "0"
|
||||
"img[title^=\"Half Freeleech: \"]": "0.5"
|
||||
"*": "1"
|
||||
"img[title^=\"Freeleech: \"]": 0
|
||||
"img[title^=\"Half Freeleech: \"]": 0.5
|
||||
"*": 1
|
||||
uploadvolumefactor:
|
||||
case:
|
||||
"*": "1"
|
||||
text: 1
|
||||
# engine tbd
|
||||
|
@@ -1,4 +1,4 @@
|
||||
---
|
||||
---
|
||||
site: ettv
|
||||
name: ETTV
|
||||
description: "ETTV is a Public torrent site for TV / MOVIES, home of the ETTV, ETHD and DTOne groups."
|
||||
|
186
src/Jackett.Common/Definitions/exkinoray.yml
Normal file
186
src/Jackett.Common/Definitions/exkinoray.yml
Normal file
@@ -0,0 +1,186 @@
|
||||
---
|
||||
site: exkinoray
|
||||
name: ExKinoRay
|
||||
description: "ExKinoRay is a RUSSIAN Semi-Private Torrent Tracker for MOVIES / TV"
|
||||
language: ru-ru
|
||||
type: semi-private
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- http://exkinoray.tv/ # site forces http, does not support https
|
||||
|
||||
caps:
|
||||
categorymappings:
|
||||
- {id: 92, cat: TV, desc: "Кино Сериал"}
|
||||
- {id: 46, cat: Movies, desc: "Кино Комедия"}
|
||||
- {id: 47, cat: Movies, desc: "Кино Боевик"}
|
||||
- {id: 48, cat: Movies, desc: "Кино Военный"}
|
||||
- {id: 49, cat: Movies, desc: "Кино Вестерн"}
|
||||
- {id: 50, cat: Movies, desc: "Кино Триллер"}
|
||||
- {id: 51, cat: Movies, desc: "Кино Детектив"}
|
||||
- {id: 52, cat: Movies, desc: "Кино Драма"}
|
||||
- {id: 53, cat: Movies, desc: "Кино Мелодрама"}
|
||||
- {id: 54, cat: Movies, desc: "Кино Индийское"}
|
||||
- {id: 55, cat: Movies, desc: "Кино Азиатское"}
|
||||
- {id: 59, cat: Movies, desc: "Кино Фантастика"}
|
||||
- {id: 60, cat: Movies, desc: "Кино Фэнтези"}
|
||||
- {id: 61, cat: Movies, desc: "Кино Ужас"}
|
||||
- {id: 62, cat: Movies, desc: "Кино Мистика"}
|
||||
- {id: 63, cat: Movies, desc: "Кино Приключения"}
|
||||
- {id: 64, cat: Movies, desc: "Кино Наше кино"}
|
||||
- {id: 65, cat: Movies, desc: "Кино Исторический"}
|
||||
- {id: 66, cat: TV/Documentary, desc: "Кино Документальный"}
|
||||
- {id: 67, cat: TV/Sport, desc: "Кино Спорт"}
|
||||
- {id: 68, cat: Movies, desc: "Кино Семейный"}
|
||||
- {id: 69, cat: Movies, desc: "Кино Детский"}
|
||||
- {id: 70, cat: Movies, desc: "Кино Классика"}
|
||||
- {id: 71, cat: Movies, desc: "Кино Концерт"}
|
||||
- {id: 72, cat: TV, desc: "Кино ТВ-шоу"}
|
||||
- {id: 73, cat: Movies, desc: "Кино Театр, опера"}
|
||||
- {id: 74, cat: Movies, desc: "Кино Мюзикл"}
|
||||
- {id: 75, cat: Movies, desc: "Кино Эротика"}
|
||||
- {id: 77, cat: TV, desc: "Мульт Буржуйский"}
|
||||
- {id: 78, cat: TV, desc: "Мульт Русский"}
|
||||
- {id: 79, cat: TV/Anime, desc: "Мульт Аниме"}
|
||||
- {id: 80, cat: Audio, desc: "Музыка Буржуйская"}
|
||||
- {id: 81, cat: Audio, desc: "Музыка Русская"}
|
||||
- {id: 82, cat: Audio, desc: "Музыка Сборники"}
|
||||
- {id: 83, cat: Audio/Audiobook, desc: "Другое Аудио книги"}
|
||||
- {id: 84, cat: Audio/Video, desc: "Другое Видеоклипы"}
|
||||
- {id: 85, cat: PC/Games, desc: "Другое Игры"}
|
||||
- {id: 86, cat: PC/0day, desc: "Другое Программы"}
|
||||
- {id: 87, cat: Console/Xbox, desc: "Другое XBox"}
|
||||
- {id: 88, cat: Console/PSP, desc: "Другое PSP"}
|
||||
- {id: 89, cat: Books/Magazines, desc: "Другое Журналы"}
|
||||
- {id: 90, cat: Other, desc: "Другое Графика"}
|
||||
- {id: 93, cat: Other, desc: "Другое Библиотека"}
|
||||
- {id: 94, cat: Console/PS3, desc: "Другое PS3"}
|
||||
|
||||
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: striprussian
|
||||
type: checkbox
|
||||
label: Strip Russian Letters
|
||||
default: false
|
||||
- name: sort
|
||||
type: select
|
||||
label: Sort requested from site
|
||||
default: "4"
|
||||
options:
|
||||
"4": "created"
|
||||
"7": "seeders"
|
||||
"5": "size"
|
||||
- name: type
|
||||
type: select
|
||||
label: Order requested from site
|
||||
default: "desc"
|
||||
options:
|
||||
"desc": "desc"
|
||||
"asc": "asc"
|
||||
- name: info_search
|
||||
type: info
|
||||
label: "Searching with Season / Episode (S01E01)"
|
||||
default: "The web site does support season/episode searching. To allow some results for Sonarr, these are stripped from the keywords."
|
||||
|
||||
login:
|
||||
path: takelogin.php
|
||||
method: post
|
||||
inputs:
|
||||
username: "{{ .Config.username }}"
|
||||
password: "{{ .Config.password }}"
|
||||
autologin: 1
|
||||
returnto: "index.php"
|
||||
error:
|
||||
- selector: td.embedded:contains("Ошибка входа")
|
||||
test:
|
||||
path: index.php
|
||||
selector: a[href="logout.php"]
|
||||
|
||||
search:
|
||||
paths:
|
||||
# http://exkinoray.tv/browse.php?search=&incldead=1&cat=0
|
||||
- path: browse.php
|
||||
keywordsfilters:
|
||||
# the site does not support season/episode searching in the title.
|
||||
- name: re_replace # strip S01
|
||||
args: ["(?i)\\bS0*(\\d+)\\b", ""]
|
||||
- name: re_replace # strip S01E01
|
||||
args: ["(?i)\\bS0*(\\d+)E0*(\\d+)\\b", ""]
|
||||
inputs:
|
||||
$raw: "{{ if .Categories }}{{ range .Categories }}c{{.}}=1&{{end}}{{else}}cat=0{{end}}"
|
||||
# 0 active 1 incldead 2 onlydead 4 noseeds (isn't this == onlydead?)
|
||||
incldead: 1
|
||||
search: "{{ .Keywords }}"
|
||||
sort: "{{ .Config.sort }}"
|
||||
type: "{{ .Config.type }}"
|
||||
|
||||
rows:
|
||||
selector: table.begins > tbody > tr:has(a[href^="details.php?id="])
|
||||
|
||||
fields:
|
||||
category:
|
||||
selector: a[href^="browse.php?cat="]
|
||||
attribute: href
|
||||
filters:
|
||||
- name: querystring
|
||||
args: cat
|
||||
title:
|
||||
selector: a[href^="details.php?id="]
|
||||
filters:
|
||||
# Женские секреты (1 сезон: 1-4 серии из 12) Жіночі секрети | 2020 | HDTVRip (720p)
|
||||
# Мандалорец (1 сезон: 1-8 серии из 8) | The Mandalorian | 2019 | WEB-DL (720p)
|
||||
# Война семей (1-14 серии из 20) | 2019 | WEB-DLRip (AVC)
|
||||
# normalize to SXXEYY format
|
||||
- name: replace
|
||||
args: [" | ", " "]
|
||||
- name: re_replace
|
||||
args: ["\\((\\d+)\\s+[Сс]езон:\\s+(?:(\\d+-*\\d*)\\s+[Сс]ери[ия]\\s+.*\\d+)\\)(.*)\\s([12][0-9]{3})\\s(.*)", "$3 - S$1E$2 - rus $5"]
|
||||
- name: re_replace
|
||||
args: ["\\((?:(\\d+-*\\d*)\\s+[Сс]ери[ия]\\s+.*\\d+)\\)(.*)\\s([12][0-9]{3})\\s(.*)", "$2 - S1E$1 - rus $4"]
|
||||
- name: re_replace
|
||||
args: ["(\\([А-Яа-яЁё\\W]+\\))|(^[А-Яа-яЁё\\W\\d]+\\/ )|([а-яА-ЯЁё \\-]+,+)|([а-яА-ЯЁё]+)", "{{ if .Config.striprussian }}{{ else }}$1$2$3$4{{ end }}"]
|
||||
- name: re_replace
|
||||
args: ["\\((\\d+p)\\)", "$1"]
|
||||
- name: re_replace
|
||||
args: [" - ", " "]
|
||||
- name: replace
|
||||
args: ["-Rip", "Rip"]
|
||||
- name: replace
|
||||
args: ["WEB-DL", "WEBDL"]
|
||||
- name: replace
|
||||
args: ["WEBDLRip", "WEBDL"]
|
||||
- name: replace
|
||||
args: ["HDTVRip", "HDTV"]
|
||||
details:
|
||||
selector: a[href^="details.php?id="]
|
||||
attribute: href
|
||||
download:
|
||||
selector: a[href^="download.php?id="]
|
||||
attribute: href
|
||||
date:
|
||||
selector: td:nth-child(2) i
|
||||
filters:
|
||||
- name: dateparse
|
||||
args: "2006-01-02 15:04:03"
|
||||
files:
|
||||
selector: td:nth-child(3)
|
||||
size:
|
||||
selector: td:nth-child(5)
|
||||
seeders:
|
||||
selector: td:nth-child(6)
|
||||
leechers:
|
||||
selector: td:nth-child(7)
|
||||
downloadvolumefactor:
|
||||
text: 0
|
||||
uploadvolumefactor:
|
||||
text: 1
|
||||
# engine n/a
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user