Compare commits

...

366 Commits

Author SHA1 Message Date
Garfield69
2f91d99e19 icetorrent: fix login. resolves #7321
update categories
fix imdb selector
fix files selector
2020-02-25 20:00:02 +13:00
Garfield69
65e93ce137 azure-pipeline: add replace for GitHub release attachements upload. 2020-02-25 18:51:27 +13:00
Jorman
0784e0784c btdb: fetch up to 100 rows (#7319) 2020-02-25 18:23:54 +13:00
Diego Heras
963616fe07 Revert "webui: reduce favicon.ico size. removed 256px, 128px, 64px icons (#7307)" (#7315)
This reverts commit d82c11650c.
2020-02-25 08:18:33 +13:00
Garfield69
e407067c8b add bteye a public dht crawler. resolves #7247 2020-02-25 08:13:00 +13:00
tide4cw
a8ba61fc9d Add torrentview a Korean public site. (#7313) 2020-02-24 20:05:57 +13:00
Garfield69
bbc360be00 add erzsebet a semi-rpivate Russian 3x site. resolves #7252 2020-02-24 17:48:07 +13:00
Diego Heras
d82c11650c webui: reduce favicon.ico size. removed 256px, 128px, 64px icons (#7307) 2020-02-24 09:42:27 +13:00
Diego Heras
6067a4ff73 core: add logger trace with proxy information (#7306) 2020-02-24 09:39:49 +13:00
Diego Heras
8c344b2917 core: reduce log traces in info level. add start/stop log traces (#7305) 2020-02-24 09:38:59 +13:00
Diego Heras
62769325b4 core: increase log size to 2 MB (#7303) 2020-02-24 09:33:51 +13:00
Diego Heras
a96b3841b0 webui: improve server logs modal (#7302) 2020-02-24 09:31:01 +13:00
Garfield69
a3dcb0455a btdb: new layout. resolves #7308 2020-02-24 09:27:15 +13:00
Diego Heras
5d808e006d webui: fix search encode in url hash. resolves #7265 (#7299) 2020-02-23 16:30:57 +13:00
fnk93
694c39503b The Resurrection: Fix multiple logins (#7298) 2020-02-23 08:44:41 +13:00
Diego Heras
12b2de2725 iptorrents: remove login with user/pass. resolves #7063 resolves #6850 resolves #6485 resolves #6402 resolves #4624 (#7294) 2020-02-23 08:34:14 +13:00
Diego Heras
d806bb18a2 core: improve cookie configuration help (#7293) 2020-02-23 08:31:38 +13:00
Sen Jiang
5a02bb9c27 btschool: use cookie (#7290)
Got all kinds of error using username and password
2020-02-23 08:29:00 +13:00
Garfield69
a3dc1b295b bitspyder: fix login. resolves #7287
also add sort options in config
2020-02-22 13:36:28 +13:00
Garfield69
471ab7f204 btnext: add info note about classic theme. #7208
also add sort options to the config.
and update the categories.
add movie-search.
2020-02-22 11:06:13 +13:00
Garfield69
bdcdd78cee torrent9clone: new domain .pl resolves #7282 2020-02-22 10:33:07 +13:00
junglebus
966c64c48e No longer manually install ChromeDriver (#7271) 2020-02-22 08:03:15 +13:00
Patrick Koenig
d5724f2f63 Change cookie SameSite from None to Lax (#7269) 2020-02-22 08:02:28 +13:00
Garfield69
3ecdbfe7f4 gay-torrentsorg: now private again. resolves #7268 2020-02-21 12:55:10 +13:00
Garfield69
b1ad8ed0bf hddolby: is now private. resolves #7267 2020-02-21 12:48:57 +13:00
junglebus
3a35e4e40a Windows service and Tray: NET Core only (#7258)
We no longer need to support NET461 for Tray and Windows service since these are for Windows users only
2020-02-21 08:55:45 +13:00
junglebus
0d58b2d63f Don't check cert store on Mono 6 (#7260) resolves #7223 2020-02-21 07:55:46 +13:00
junglebus
3c596c978c Stop building on Appveyor (#7259)
Now that we are successfully building and releasing on Azure Pipelines, there is no need to build on Appveyor as well
2020-02-21 07:06:12 +13:00
Garfield69
cc2a69cc77 film-paleis: gone private #7254
also requires thanks before download
2020-02-20 21:07:16 +13:00
Garfield69
7627671900 torrentcsv: fix empty search error. resolves #7255 2020-02-20 17:28:27 +13:00
Garfield69
4a4af3d8c8 r4e: update for unit3d 2.2.7 resolves #7257
plus add new categories
add posters
2020-02-20 17:01:55 +13:00
Jonas Stendahl
950d38a651 Add codec and medium filters to HDBits API (#7209)
* Add codec and medium filters to HDBits API

* Add checkboxes support to CardigannIndexer

* Expose multi-select as template variable

* update datestamp to force cache refresh

Co-authored-by: garfield69 <garfield69@outlook.com>
2020-02-20 09:23:55 +13:00
Garfield69
49d4c3248c remove vanila, now using mediaget client. #4003 2020-02-20 07:33:09 +13:00
Garfield69
3da168ef6c prostylex: now semi-private. resolves #7248 2020-02-20 07:23:28 +13:00
Garfield69
d4da96559f moviesdvdr: new domain .co. #7244 2020-02-19 07:40:41 +13:00
Garfield69
084c89d9db prostylex: prevent task cancelled by using cookie. 2020-02-18 14:03:19 +13:00
Jonas Stendahl
6a913f79d4 TorrentLeech: Add support for IMDb search (#7235) 2020-02-18 10:29:32 +13:00
fnk93
938c1f1de0 The Resurrection: Changed parameter name for categories (#7234) 2020-02-18 06:23:12 +13:00
Garfield69
480f2ebfeb hdtorrentsit: switch to https #7221 2020-02-17 21:49:48 +13:00
Garfield69
b32869badd greekteam: switch to https: #7221 2020-02-17 21:04:45 +13:00
Garfield69
f2c6eadb89 add pornleech a public 3x site. resolves #7227 2020-02-16 15:21:14 +13:00
Garfield69
1f79f4a165 femdomcult: add missing cats.
dd config sort option
2020-02-16 09:40:16 +13:00
Garfield69
fa917dd66c switch to https assorted indexers. #7221 2020-02-16 06:51:41 +13:00
Garfield69
dcd10211e2 engine tag luminance. #6822 2020-02-15 18:25:37 +13:00
Garfield69
3271efe478 add eggmeon a private site. resolves #7133 2020-02-15 18:24:38 +13:00
Garfield69
c3ea12694c datascene: site forcing https 2020-02-15 16:17:49 +13:00
fnk93
1375b62cf9 TFA: Remove leading [Release Group] / [Req] combination from title (#7217) 2020-02-15 15:25:28 +13:00
junglebus
8a9e29a2ac Use ComImport to create shortcut (#7218)
* Use ComImport to create shortcut

Using the url shortcut wasn't reliable
2020-02-15 12:04:33 +11:00
Garfield69
ccaa0c5255 elitetorrent.biz: new domain .bz resolves #7215 2020-02-15 10:29:09 +13:00
Garfield69
e2b2346eb2 film-paleis: fix login error detection. resolves #7216 2020-02-15 10:25:58 +13:00
fnk93
a82c3cf963 TFA: Fix if enabled download via HTTPS (#7214) 2020-02-15 09:51:07 +13:00
Garfield69
cab1184f13 engine tags: resolves #6822 2020-02-15 09:48:27 +13:00
Lukas Loibnegger
46f03dbb6d newrealworld: Fix parsing (#7212) resolves #7195 2020-02-15 07:08:54 +13:00
Garfield69
196ca5e83d Merge branch 'master' of https://github.com/Jackett/Jackett 2020-02-15 07:05:36 +13:00
Garfield69
3e89a2f364 ibit: change sort options. resolves #7180 2020-02-15 07:05:32 +13:00
garfield69
3ab620af28 Immortuos: auto switch sitelink. #7206 2020-02-15 03:59:43 +13:00
Garfield69
3d8a761524 add badasstorrents a public site. resolves #7196 2020-02-14 17:38:49 +13:00
Garfield69
848ec59b18 add tfa a privat eGerman site. resolves #7072 2020-02-14 16:04:27 +13:00
Garfield69
e409179b74 pirateiro: set language to en-us #7070 2020-02-14 07:16:17 +13:00
Garfield69
e977ba521c add p2pelite a private ebook tracker. resolves #7126 2020-02-13 19:37:15 +13:00
Garfield69
a193bfe3e7 add magnet4you a public magnet search engine. resolves #7115 2020-02-13 17:10:33 +13:00
Garfield69
1bf05e3934 add 7torrents a public dht crawler. resolves #7098 2020-02-13 16:45:08 +13:00
Garfield69
2f724b4de0 add twilightszoom a private music site. resolves #7080 2020-02-13 16:03:20 +13:00
Garfield69
585147d43c scenepalace: fix date and banners. 2020-02-13 16:02:35 +13:00
Garfield69
19043ea2b3 add torrent4you a public site. resolves #7071 2020-02-13 11:31:22 +13:00
Garfield69
332c4eea73 add pirateiro a Spanish Public site. resolves #7070 2020-02-13 09:26:46 +13:00
Garfield69
f8e5d67049 add korsar a semi-private Russian site. resolves #7052 2020-02-12 20:24:06 +13:00
fnk93
283429f125 Immortuos: new domain (#7189) resolves #7177 2020-02-12 12:04:07 +13:00
fnk93
32207cf1a4 The Resurrection: Add download volume, upload volume and min seed time (#7188) 2020-02-12 09:28:34 +13:00
Anthony Snavely
cf06cd3541 redacted, orpheus: Add session cookie workaround for 2FA users (#7187) resolves #5912 2020-02-12 08:40:41 +13:00
garfield69
afd9566388 Update CONTRIBUTING.md 2020-02-11 22:31:29 +13:00
garfield69
c976ab8d9a Update no_information_provided.md 2020-02-11 17:57:47 +13:00
garfield69
fbecbea7be Update ISSUE_TEMPLATE.md
add proxy question.
2020-02-11 17:33:52 +13:00
Garfield69
438714a527 add WDT a private site. resolves #7033 2020-02-11 16:21:45 +13:00
Cory
348dddfbee core: Apply declarations styles (#7166) 2020-02-11 11:16:19 +13:00
Diego Heras
e13cee2e95 doc: new jackett screenshot (#7173) 2020-02-11 11:15:45 +13:00
Garfield69
5c0f028cca add hddisk a private Chinese site. resolves #7018 2020-02-11 10:38:12 +13:00
fnk93
58b6272e1e The Resurrection: fix downloading .torrent (#7178) 2020-02-11 07:40:34 +13:00
Yuri Moens
2ed11bd562 orpheus: fix free leech token option breaking the tracker (#7179) resolves #7136 2020-02-11 07:33:10 +13:00
Garfield69
5326d6b33f snowpt: correct language. #7017 2020-02-10 19:17:07 +13:00
Garfield69
6748738db3 add snowpt a private Chinese Anime site. resolves #7017 2020-02-10 19:14:12 +13:00
Cory
9efe27ca7a avistaz, privatehd, cinemaz: Remove string sanitising from search query (#7175) resolves #7167 2020-02-10 18:29:39 +13:00
fnk93
c0d7a85db3 Add the resurrection a private German site (#7174) 2020-02-10 13:12:00 +13:00
Diego Heras
cba78c299b internetarchive: fix array category (#7158)
* internetarchive: fix array category

* requested changes
2020-02-10 09:07:05 +13:00
Garfield69
f8048c7572 xwtorrents: windows-1252 encoding. resolves #6370 2020-02-10 07:57:12 +13:00
Diego Heras
3ee947c8a1 torrentfactory: add new private tracker. resolves #6740 (#7153) 2020-02-10 07:11:23 +13:00
Cory
98541ac6f8 core: Sort and remove usings (#7159) 2020-02-10 07:08:34 +13:00
Garfield69
c08f511d1e mactorrents: fix catalog processing. resolves #7157 2020-02-09 16:51:38 +13:00
Garfield69
53e2527c72 audiobookbay: fix size processing. resolves #7156 2020-02-09 16:13:46 +13:00
Diego Heras
e2310ea70b anidex: rewrite in C# to bypass DDOS. resolves #7036 resolves #6834 (#7142)
* Replace Cardigann Anidex indexer for C# impelementation

Add bypass for DDOS Guard

* Improve error messages from type conversions

* Add missing cookie check

* Fix index out of range exception

* Change error handling to only warn about DDoS bypass exceptions

This is so that searches will still be attempted if there are issues with the DDoS protection (e.g. if it is removed).

* Improve error handling and clean up code

* pending changes
2020-02-09 15:43:32 +13:00
Cory
c12da520a4 Run dotnet format on solution (#7145) 2020-02-09 15:35:16 +13:00
Garfield69
2fe1e03da9 torlock: correct date processing. 2020-02-09 09:50:10 +13:00
Garfield69
7543b9ef35 gamestorrents: size can be undefined. resolves #7144 2020-02-09 09:12:06 +13:00
junglebus
4809ee1383 Use latest 3.1 SDK (#7141) 2020-02-08 20:49:36 +11:00
junglebus
2d56ce11b7 GetExecutingAssembly points to the DLL on .NET Core not the exe (#7140) 2020-02-08 20:38:07 +11:00
Garfield69
af6c7b530b channelx: new domain .xyz 2020-02-08 20:36:19 +13:00
Diego Heras
cee7ceb1f6 iptorrents: show bad cookie error. resolves #5164 (#7137) 2020-02-08 19:11:11 +13:00
Diego Heras
f770596354 core: fix form encoding. resolves #4346 resolves #3061 (#6994) 2020-02-08 19:03:03 +13:00
Diego Heras
77a2264164 newpct: remove deleted torrents. resolves #7074 (#7135) 2020-02-08 14:49:33 +13:00
Diego Heras
48a9765c48 iptorrents: cosmetic code changes (#7134) 2020-02-08 14:47:17 +13:00
Garfield69
e5784503b5 add leaguehd a Chinese Private site. resolves #7016 2020-02-08 08:43:29 +13:00
Garfield69
9693a9890f add hdtime a Chinese Private site. resolves #7015 2020-02-07 21:41:32 +13:00
Garfield69
0593f30115 add torrentleech.pl a privat ePolish site. resolves #7014 2020-02-07 18:18:52 +13:00
Garfield69
9e37ef0c02 torrentproject2: seeders can be n/a 2020-02-07 14:53:09 +13:00
Garfield69
c22b2b3ea6 torrentproject2: leechers can be n/a resolves #7124 2020-02-07 14:51:58 +13:00
Garfield69
24c907961c microbit: correct cat11 2020-02-07 14:51:04 +13:00
Diego Heras
35b606805f internetarchive: fix array title (#7125) 2020-02-07 12:17:58 +13:00
Garfield69
f8f0c5d907 add microbit, a Hundarian private site. resolves #7007 2020-02-07 08:46:38 +13:00
Jonas Dellinger
1715f0fda4 core: API - "configured" parameter (#7120)
Add support for a "configured" parameter in the API 2.0. Only return configured indexers if true.
2020-02-07 07:22:46 +13:00
garfield69
054e0e6440 Update no_information_provided.md 2020-02-07 07:20:24 +13:00
Garfield69
1a0b62540e downloadville: fix size. resolves #7121 2020-02-07 07:14:23 +13:00
Garfield69
5fbc92682a Merge branch 'master' of https://github.com/Jackett/Jackett 2020-02-07 06:37:05 +13:00
Garfield69
5be778c28c tazmania-den: gone. removed. #5713 2020-02-07 06:37:00 +13:00
junglebus
acb2cef2b4 Look in drop folder for artifacts 2020-02-06 20:58:40 +11:00
junglebus
1a85cb3e22 Add Azure-Pipelines build status badge (#7119) 2020-02-06 20:49:19 +11:00
junglebus
614372a272 Update azure-pipelines.yml 2020-02-06 20:32:56 +11:00
junglebus
234433ba8a Update azure-pipelines.yml for Azure Pipelines 2020-02-06 19:58:11 +11:00
junglebus
d124fa9cde Update GitHub Connection 2020-02-06 19:27:15 +11:00
Cory
4d05ab3fbc Add code style guide and update documentation to reflect changes (#7045) 2020-02-06 19:39:44 +13:00
junglebus
43ddc7a854 Add Azure Pipelines support (#7024)
* Add Azure Pipelines support

* Move to correct folder

* Make display names clearer
2020-02-06 18:35:47 +13:00
Diego Heras
5bb163d521 core: show configuration dialog when GetConfigurationForSetup fails (#7104) 2020-02-06 17:01:46 +13:00
Garfield69
056f683de3 myAmity: fix title. resolves #7100
also add anime, movies/uhd and tv/sport categories
2020-02-06 16:38:43 +13:00
Garfield69
a164cfe010 twilight: add freeleech-with-expiry-date. resolves #7116 2020-02-06 15:44:37 +13:00
Diego Heras
6b51888919 divxtotal: fix error when the search has exactly 15 results (#7105) 2020-02-06 15:28:19 +13:00
feffe
daa1149bd3 AnimeBytes: fix RAW tag setting (#7066) resolves #7027 2020-02-06 15:27:26 +13:00
junglebus
b9dbba280b core: Add artifact name for Windows .NET Core (#7028) 2020-02-06 15:22:54 +13:00
junglebus
b6e8f7261e core: Add Integration Tests (#7023)
Add some basic integration tests for Jackett
2020-02-06 15:22:11 +13:00
junglebus
67750982bc core: Allow unit tests to run in non-Windows environments (#7022) 2020-02-06 15:21:48 +13:00
Jonas Dellinger
163b162b2d torrentz2: Fix sorting of torrents (#7114) 2020-02-06 15:21:08 +13:00
Garfield69
9f03831321 glodls: handle missing category. resolves #7113 2020-02-06 15:19:38 +13:00
Garfield69
48d793fcd2 ibit: handle missing size. resolves #7111 2020-02-06 13:39:43 +13:00
Garfield69
574bd29108 attv: handle missing category. resolves #7110 2020-02-06 10:07:03 +13:00
Garfield69
e215870735 extratorrent: handle missing category or no-hits. resolves #7108
also handle some date exceptions.
2020-02-06 09:53:39 +13:00
Garfield69
f718052e4a ettv: handle size=N/A resolves #7107 2020-02-06 09:14:45 +13:00
Garfield69
c1e71a9df2 piratbit: fix title. resolves #7106 2020-02-06 09:08:09 +13:00
Garfield69
d031371083 torrentlt: use cookie method. resolves #7051 2020-02-06 08:22:51 +13:00
Garfield69
dbb3234bf1 yggtorrent: new domain .se #7095 2020-02-05 17:25:23 +13:00
Garfield69
9157294dc0 oxtorrent: handle not-found result. resolves #7093 2020-02-05 13:08:43 +13:00
Garfield69
6f8afcf584 extratorrent: resolves #7068 2020-02-05 12:43:13 +13:00
Garfield69
7b57510507 btsow: new domain btio.pw resolves #7092 2020-02-05 12:41:27 +13:00
Garfield69
42ec8b63a3 index.html: update changed stamps for #7037 to flush cache 2020-02-02 08:21:26 +13:00
Justinas
a43522e4db torrentlt: add missing categories (#7041) 2020-02-02 08:12:37 +13:00
Diego Heras
694c61990d mejortorrent: rewrite from scratch. sonarr & raddar support. resolves #6988 resolves #5587 resolves #3754 resolves #3869 (#7026) 2020-02-02 07:39:19 +13:00
Diego Heras
f488cab31b webui: improve search filter and pagination style (#7037) 2020-02-02 07:35:37 +13:00
Diego Heras
72ff71de9a webui: add copied to clipboard notification (#7038) 2020-02-02 07:35:20 +13:00
Diego Heras
41beca0afc internetarchive: add new public tracker. resolves #3603 (#7042) 2020-02-02 07:32:00 +13:00
feffe
be7bd4ea22 AnimeBytes: Fix synonym setting AB (#7056) #7027 2020-02-02 07:31:04 +13:00
Diego Heras
8744fd3fa1 core: fix blackhole download for relative uris. resolves #5935 (#7057) 2020-02-02 07:29:17 +13:00
Garfield69
7d87b3287b hdtorrentsit: add info note about IP filter. #7053 2020-02-02 07:22:20 +13:00
Garfield69
6752eb6321 YTS: new domain .mx #7062 2020-02-02 07:20:51 +13:00
Garfield69
36f91abc35 rutracker: add captcha info to config. https://github.com/Jackett/Jackett/pull/6994#issuecomment-577585897 2020-01-26 10:18:25 +13:00
Garfield69
6fc1992851 gktorrent: new domain .io #7071 2020-01-26 08:30:40 +13:00
Garfield69
fadaa9eb7a BakaBT: add config note about adult-content settings. #7013 2020-01-25 19:47:37 +13:00
Marcelo Castagna
cd239498c0 tray: cleanup code (#7011) 2020-01-25 13:39:08 +13:00
Garfield69
b0e5c2e7a9 YTS: add support for 2160p tagging. resolves #7010 2020-01-25 13:38:20 +13:00
Garfield69
7200ba9660 torrentday: re-instate tday.love as primary domain. resolves #6998 2020-01-23 07:03:55 +13:00
junglebus
620a09858c Make tests run on .NET Core as well (#6997)
* Make tests run on .NET Core as well

* Only run net461 tests against full framework build

* Add support for running full framework tests on linux
2020-01-23 06:42:23 +13:00
Garfield69
5bd4f7c364 engine tags. #6822 2020-01-21 19:00:36 +13:00
Garfield69
bf7f5d4fd8 themoviecave. gone. removed. #5710 2020-01-21 18:44:58 +13:00
Diego Heras
40a0cc70bf rarbg: add sort configuration. resolves #6949 (#6989) 2020-01-21 15:25:19 +13:00
Garfield69
65ac2c8339 estrenosdtl: size can be missing. resolves #6985 2020-01-21 10:33:22 +13:00
Garfield69
b58d1d6bea torrentwal: back to old domain. resolves #6986 2020-01-21 10:22:57 +13:00
Jonas Stendahl
b60c6d132c HDBits with passkey login and assorted improvements. (#6980) 2020-01-21 10:15:22 +13:00
junglebus
67491cb4f6 Make Tray compatible with .NET Core (#6983)
By default .NET Core sets UseShellExecute to false due to being cross platform
2020-01-21 06:23:47 +13:00
Alexander Chapliuk
860168fe44 LostFilm: improvements. (#6981) resolves #6801 resolves #6945 resolves #2631 2020-01-20 12:09:10 +13:00
Garfield69
ad24dd4600 engine tags. #6822 2020-01-20 09:51:48 +13:00
Garfield69
dc0e37f3dc engine tags. #6822 2020-01-20 08:36:57 +13:00
vinanrra
dc7c84bec8 nyaasi: add [Spanish] at end of [PuyaSubs!] releases (#6979) 2020-01-20 06:53:55 +13:00
junglebus
e695f90c80 Remove COM reference for .NET Core (#6975)
* Remove COM reference for .NET Core

Removing only COM reference to get closer to having Jackett to run on .NET Core for Windows

* Handle resources

https://github.com/microsoft/msbuild/issues/4704

* Remove GenerateResourceUsePreserializedResources

* Remove System.Resources.Extensions
2020-01-20 06:50:12 +13:00
Garfield69
fe3ca03847 engine tags. #6822 2020-01-19 19:13:07 +13:00
Scott Cooper
962b29825b cili180: add missing links (#6974) 2020-01-19 12:30:58 +13:00
Garfield69
fa1cedb49d engine tags. #6822 2020-01-19 10:05:52 +13:00
Scott Cooper
7b7f600794 anirena: fix hentai category matching (#6971) 2020-01-19 08:38:25 +13:00
Garfield69
370a70ba26 engine tags. #6822 2020-01-18 18:26:04 +13:00
Garfield69
5a13b1253d engine tags. #6822 2020-01-18 11:20:53 +13:00
Garfield69
eba53cc4be crazycorner: support for new engine. 2020-01-18 10:25:05 +13:00
Garfield69
1dc3c98da8 engine tags. #6822 2020-01-18 07:52:11 +13:00
dimqua
c3f24eb788 casstudio: fix language code (#6969) 2020-01-18 07:28:28 +13:00
vinanrra
760c663259 torrentland: add language tags to titles (#6968)
Fixed the problem identifing results always as English now they will be identified as Spanish or English depending of title..
2020-01-18 07:26:35 +13:00
Garfield69
e3f44dbbce engine tags #6822 2020-01-17 09:27:12 +13:00
Garfield69
45c204e37b cili180: expired domain 2020-01-17 09:09:18 +13:00
Garfield69
752403fff1 girotorrent: layout changes. resolves #6966 2020-01-17 07:58:43 +13:00
Garfield69
6d78a8c218 nostalgic: new domain vhstapes.org 2020-01-17 07:35:21 +13:00
Garfield69
c25726dcd0 engine tags. #6822 2020-01-16 17:33:16 +13:00
Garfield69
8402275093 audionookbay: switch to public. resolves #6958
build magnet from infohash instead of using the download link (which required an a/c)
2020-01-16 16:58:44 +13:00
Garfield69
5a27395553 add brobits a Chinese private site. resolves #6956 2020-01-16 09:22:22 +13:00
Garfield69
837656ce3d nexusphp tags. #6822 2020-01-16 08:26:44 +13:00
Garfield69
a092a931a5 engine tags #6822 2020-01-15 19:32:25 +13:00
Garfield69
2368e2631b girotorrent: results layout changes. resolves #6946 2020-01-15 08:00:40 +13:00
Garfield69
ff1d818d5f bibliotik: drop files. resolves #6940 resolves #1443 2020-01-14 10:04:00 +13:00
Garfield69
2f8a093962 blutopia: switch to cookie login. resolves #6941 2020-01-14 08:33:36 +13:00
Garfield69
1ac309d513 casatorrent: prefix a plus to keywords. resolves #5078 2020-01-13 16:14:25 +13:00
Garfield69
1344499534 add rustorka a Russian semi-private site. resolves #6899 2020-01-13 09:57:10 +13:00
Diego Heras
7a1c8f9419 core: add rss url decode in download controller. resolves #4617 #6589 #4760 #6397 #5752 (#6936) 2020-01-13 07:14:36 +13:00
Diego Heras
92556a56c6 puntotorrent: fix new episode format and details link. resolves #6910 (#6935) 2020-01-13 07:14:06 +13:00
Diego Heras
5d4b252c32 estrenosdtl: fix old download links. resolves #6924 (#6934) 2020-01-13 07:10:27 +13:00
Garfield69
a39711d619 bit-titan: fx search. resolves #6932 2020-01-12 17:40:32 +13:00
Diego Heras
3d5c32b63a newpct: fix download link and remove duplicate episodes (#6933) 2020-01-12 16:25:26 +13:00
Diego Heras
f0d05b5a56 nitro: fix download link. resolves #6926 (#6931) 2020-01-12 16:23:53 +13:00
Garfield69
d460369545 efectodoppler: fix search. resolves #6929 2020-01-12 16:00:21 +13:00
Garfield69
5e8493bc9a xbytes2: grabs can be missing. resolves #6928 2020-01-12 11:46:31 +13:00
Garfield69
2513f7a473 torrentproject2: fix download. resolves #6927 2020-01-12 11:37:27 +13:00
Garfield69
11ad12abbe leporno: fix download. resolves #6925 2020-01-12 11:05:21 +13:00
Diego Heras
26564cdfbd set default value for MinimumRatio / MinimumSeedTime. resolves #6811 (#6921) 2020-01-12 07:07:19 +13:00
junglebus
748e1c4f2e No need to install Tar now (#6919)
Latest version of msys2 includes tar, so no need to manually install it
2020-01-12 07:05:13 +13:00
junglebus
dc87b36ae0 Package update (#6916)
4 packages updated -> Jackett is now using the latest version of all packages except for AutoMapper -> Will have a go at that another day -> There is a few changes needed

-Minor code changes made to support newer version of YamlDotNet and BencodeNET
-Logic update for AssemblyName as I've been experiencing restore 'weirdness'  https://stackoverflow.com/questions/208084/how-to-use-a-different-assembly-name-for-different-configurations
2020-01-12 07:04:24 +13:00
junglebus
17db2b5df3 Upgrade Tray and Service to use the newer csproj format (#6879)
https://natemcmaster.com/blog/2017/03/09/vs2015-to-vs2017-upgrade/

This change brings the remaining two projects (Tray and Service) onto the new csproj format. Along with making them simpler and cleaner, its a needed step to get Windows users onto .NET Core

Again, been a careful as possible, so hopefully nothing breaks. Would recommend merging this after .NET Core 3.1 commit gets released and a beta release for this as well
2020-01-12 07:04:04 +13:00
Diego Heras
584ea4cf01 divxtotal: add support for sonarr / radarr. resolves #6869 (#6911) 2020-01-11 20:48:12 +13:00
Diego Heras
2d9a6803c6 divxtotal: fix search with 0 results (#6908) 2020-01-11 20:08:18 +13:00
Diego Heras
6e8ff3fa08 bakabt: re-login when cookie expires. resolves #5486 (#6907) 2020-01-11 20:07:10 +13:00
Garfield69
ab2e41df75 add ibit a public magnet search engine. resolves #6772 2020-01-11 19:33:49 +13:00
Diego Heras
9413006524 cardigann: add attribute for download selector (#6891) 2020-01-11 17:52:11 +13:00
RicardoVelaC
74dcf37352 Hachede: Update categories (#6906) 2020-01-11 10:19:22 +13:00
Garfield69
c08e7ee827 pornbits: new domain .net. resolves #6905 2020-01-11 10:17:45 +13:00
Garfield69
a11f811c20 elitetorrent: new domain .li resolves #6904 2020-01-11 10:06:32 +13:00
Garfield69
77a1ce1670 ettv: drop torrent from end of titles. resolves #6903 2020-01-11 10:00:41 +13:00
Garfield69
4f7f495200 btnext: trap english no-resutls erorr. resolves #6897 2020-01-11 09:49:37 +13:00
Garfield69
835681fcfc thetorrents: merged with datascene. removed. resolves #6898 2020-01-11 09:24:39 +13:00
Garfield69
1ca8b1e8a4 animetosho: remove redundant / from url 2020-01-10 19:57:00 +13:00
Garfield69
02fc8cee0e torrentcsv: keyword-less search fix. resolves #6896
the anything mask has changed from * to %
2020-01-10 19:11:26 +13:00
junglebus
5405405d1a Crazyscorner: Fix error when starting Jackett (#6894) 2020-01-10 18:05:51 +13:00
Garfield69
953f9c7709 tfile: config option download magnet/.torrent. resolves #6870 2020-01-10 18:02:41 +13:00
Diego Heras
38efce8f2f hachede: fix date parsing. resolves #6884 (#6893) 2020-01-10 17:38:32 +13:00
Garfield69
85b5a1a1da add feedurneed a private site. resolves #6872 2020-01-10 17:32:15 +13:00
Garfield69
3ccd8b148e redstartorrent: fix login error selector 2020-01-10 08:27:53 +13:00
Garfield69
138297718d tsue tag #6822 2020-01-10 08:13:20 +13:00
Garfield69
eff0d3e332 torrentday. fix 7d073af14f #6880 2020-01-10 07:51:50 +13:00
Garfield69
0730b0bc64 add scenexpress a movies site. resolves #6859 # 2020-01-10 07:46:05 +13:00
junglebus
f14cdd4828 Fix InnoSetup warning (#6881)
This is to fix the InnoSetup warning during the build "Warning: Constant "pf" has been renamed. Use "commonpf" instead or consider using its "auto" form."

https://jrsoftware.github.io/issrc/whatsnew.htm

Unsure why DefaultDirName was "Program Files", but have updated it to ProgramData as per all other locations in the installer script
2020-01-10 07:18:27 +13:00
junglebus
e4a511347c Minor csproj tidy up (#6878) 2020-01-10 07:18:08 +13:00
junglebus
c2588d619f VS 16.4 required for .NET Core 3.1 (#6877) 2020-01-10 07:17:54 +13:00
Garfield69
7d073af14f torrentday: drop tday.love domain. resolves #6880 2020-01-10 07:08:07 +13:00
Garfield69
0605b66b67 tag TSUE engine. #6822 2020-01-09 19:16:03 +13:00
morpheus133
a89c7dedeb ImdbTVSearchSupport added for c# based indexers (#5791) 2020-01-09 16:32:02 +13:00
Diego Heras
9565469559 core: fix fuzzytime parser regression #6845. resolves #6861 (#6871) 2020-01-09 15:19:37 +13:00
Garfield69
dcda239b3f xbtit tags #6821
add xbtit engine tag
add config sort options if aplicable
add torrent per page info
2020-01-09 10:04:03 +13:00
Garfield69
7b8f2d4dab passionetorrent: gone. removed. #1147 2020-01-09 08:44:53 +13:00
Garfield69
003d37ab27 tfile: exclude torrents without size. #6870
because they will not have a download selector in the torrent details page.
2020-01-09 08:34:42 +13:00
Garfield69
32ea40cf82 xbytes2: tag xbtit engine #6821
aff torrent per page info
add sort config option
2020-01-09 08:08:15 +13:00
junglebus
d4f873e46f Update to .NET Core 3.1 (#6857)
Minor update from .NET Core 3.0. .NET Core 3.1 is the LTS version
2020-01-08 20:51:00 +13:00
Garfield69
5b91445d59 tag xbtit #6821 2020-01-08 20:46:38 +13:00
Garfield69
797cdb5b0b puntotorrent: add config sort options #6821
add xbtit tag
add torrent per page info
2020-01-08 20:26:20 +13:00
Garfield69
fdc4db3a5d torrentland: add config sort options. #6821
xbtit tag
torrent per page info
2020-01-08 20:15:39 +13:00
Garfield69
79aa770a9b crazycorner: correct sort 2020-01-08 19:32:20 +13:00
Garfield69
54cc92a6a1 crazycorner: music only. resolves #6860
add info for torrent per page
add music-search for lidarr
add xbtit tag
add thankyou for download (new requirement)
2020-01-08 19:03:23 +13:00
Garfield69
fb1683e8fa add the-madhouse a private site. #6860 2020-01-08 17:17:17 +13:00
Garfield69
6f4ae67fb2 demonoid: temp circumvention for #6861 2020-01-08 13:03:37 +13:00
Garfield69
2ee2dfc608 demonoid: correctly remove on from dateheaders. 2020-01-08 12:40:13 +13:00
Garfield69
6e9c312679 elitetracker: add vostfr to English replacement config option. resolves #6855 2020-01-07 21:05:03 +13:00
Garfield69
0beb82bbd6 add cili180 a DHT tracker. resolves #6795 2020-01-07 19:36:02 +13:00
Garfield69
76c9000393 gktorrent, oxtorrent: add config download optoin. resolves #6848 2020-01-07 15:05:42 +13:00
Diego Heras
9aedb34dc9 divxtotal: add new public spanish tracker. resolves #1293 (#6851) 2020-01-07 11:41:51 +13:00
Mário Franco
9ea09c4498 sounpark: fix download (#6844)
I'm getting this errors when downloading:
```
Error downloading soundpark https://sound-park.world/album/torrent-XXX
CardigannIndexer (soundpark): Download selector a[href^="/album/download-torrent/"] didn't match
```
2020-01-07 07:51:41 +13:00
Garfield69
96f74ee15a hachede: fix date parsing #6832
also add config sort options
2020-01-07 07:28:35 +13:00
Diego Heras
eb36aca641 vizuk: cosmetic change (#6846) 2020-01-07 06:38:33 +13:00
Diego Heras
603001a75c core: improve fuzzytime date parser to handle week days. resolves #6832 (#6845)
Previous version works well with dates like "Yesterday 15:30" or "Today 15:30"
Now it can handle "Monday 15:30" as well (means last Monday at 15:30 h)
2020-01-07 06:34:57 +13:00
Diego Heras
ab55c6af7c adds HD-Olimpo, private Spanish tracker. resolves #5142 (#6828) 2020-01-07 06:32:40 +13:00
Garfield69
ee37d5b8f0 1337x: add lidarr support. resolves #6841 2020-01-06 20:43:39 +13:00
Garfield69
3ccefe33b3 add torrentkitty a public magnet tracker. resolves #6833 2020-01-06 18:54:39 +13:00
takosine
48515cf3b9 Add bibliotik a private book tracker. resolves #1443 (#6840) 2020-01-06 17:24:15 +13:00
Garfield69
b891b24e26 vizuk: fix date. also allow English language. resolves #6832 2020-01-06 17:07:36 +13:00
Mário Franco
424370a1c3 Added Cardigann support for functions "and" and "or" in templates (#6787) resolves #6780
Fix soundpark search for lidarr
2020-01-06 15:13:21 +13:00
HDVinnie
e230fe25c0 legacyhd: fix a couple categories. (#6839) resolves #6837 2020-01-06 09:47:03 +13:00
takosine
b70f38b8ff PassThePopcorn: change login to support 2fa (#6823) resolves #6649 2020-01-06 09:43:54 +13:00
Garfield69
d8361f3486 extratorrent.ag: search engine on site broken for over a month. removed. resolves #6742 2020-01-06 08:50:51 +13:00
Garfield69
1188ad0a67 add extratorrent.cd a public site. #6742 2020-01-06 08:49:02 +13:00
Cory
391a4f8fec corsaro.red: fix bug in category searches (#6807) resolves #6307 2020-01-06 06:43:41 +13:00
Diego Heras
3534cfd3eb core: add downloading release message (#6826) 2020-01-05 19:51:39 +13:00
Diego Heras
45b205ddc3 core: security fix, authorization first in download / blackhole links (#6825) 2020-01-05 19:41:01 +13:00
Diego Heras
7e93a86ae0 core: fix magnet link encoding. resolves #5372 #4761 (#6824) 2020-01-05 19:31:32 +13:00
IIIspaceIII
9060d8acca filelist: fix login (#6827) resolves #6782 2020-01-05 19:12:19 +13:00
Garfield69
2dcf151396 vizuk: add missing categories
and config sort options
2020-01-05 15:35:14 +13:00
HDVinnie
1e84213f1a Add legacyhd, a private site. formerly HD4Free. (#6820) 2020-01-05 11:56:28 +13:00
Garfield69
6c1044e88c vizuk: ignore expired certificate. resolves #6810
also minor code tidyup
2020-01-05 08:31:29 +13:00
Diego Heras
727e33675c newpct: remove two compilation warnings (#6819) 2020-01-05 08:16:28 +13:00
Diego Heras
22f5b59393 solidtorrents: rewrite in c#. resolves #6681 (#6817) 2020-01-05 08:11:13 +13:00
Cory
e7a48c4234 Fix file location bug in paths with spaces during updates (#6814) resolves #6671 2020-01-05 07:49:53 +13:00
snamds
a865a697fa Newpct - Sites adjustment (#6812) 2020-01-05 07:47:31 +13:00
Diego Heras
ca8fbd081d mejortorrent: fix download urls and grabs. resolves #6449 (#6565) 2020-01-05 07:42:25 +13:00
Garfield69
0046fb2a13 hdreactor: fix search query. resolves #6806 2020-01-04 19:52:30 +13:00
Garfield69
cd39b17307 torrentdownload: refresh categories resolves #6805
change the category selector.
2020-01-04 19:30:01 +13:00
Garfield69
7e9aed1154 eztv: fix ulvf. resolves #6804 2020-01-04 18:51:55 +13:00
Garfield69
de3894e3dc firebit: improve category selection. resolves #6803 2020-01-04 18:30:15 +13:00
Garfield69
fca687a5c4 nyaasi: .torrent links can be missing. resolves #6802 2020-01-04 17:40:44 +13:00
Garfield69
1a8445dc6f acgrip: ignore expired certificate. 2020-01-04 15:21:45 +13:00
Garfield69
429e58c16e hone3hd.net: site broken for over a month. removed. resolves #5525 2020-01-04 12:45:30 +13:00
Garfield69
9220efcc18 update date translations for unit3d indexers. resolves #6786 2020-01-04 09:53:04 +13:00
Garfield69
b8ce4784eb seedfile: date translations 2020-01-04 09:44:25 +13:00
Garfield69
3e04d8ad92 Update README.md 2020-01-04 08:16:36 +13:00
Garfield69
976cfe9182 demonoid: public. resolves #6790 resolves #6716 2020-01-04 06:58:51 +13:00
Garfield69
38edc02df5 Revert "demonoid: switch to private mode. resolves #6716"
This reverts commit 8ced18b4c7.
2020-01-04 06:54:45 +13:00
dlmiheev
93aa1dd759 RuTracker: update existing category, add new one (#6785) 2020-01-04 06:50:08 +13:00
junglebus
201b6997ee readme: .NET Core 3 requires macOS 10.13 or greater (#6784)
https://github.com/dotnet/core/blob/master/release-notes/3.0/3.0-supported-os.md

https://github.com/Jackett/Jackett/issues/6769
2020-01-04 06:49:45 +13:00
ERR1R
8b34e80d5b digitalcore: Cookie workaround because captcha (#6779) resolves #6770
dc added a captcha system.. cookie workaround!
2020-01-04 06:49:08 +13:00
Garfield69
e098943b69 add tlfbits a Chinese private site. resolves #6765 2020-01-03 19:12:13 +13:00
Garfield69
c2174dfdb2 scenehd: ignore the new invalid certificate. resolves #6778 2020-01-03 17:01:59 +13:00
Garfield69
dc07c27531 add moecat a Chinese privat esite. resolves #6767 2020-01-02 17:23:05 +13:00
Garfield69
638586c36d torrentbd: new domain .net and support new engine. resolves #6761
refresh categories
new layout selectors
2020-01-02 16:12:26 +13:00
Garfield69
1f7403f6a5 girotorrent: add new categories
add config sort options
2020-01-02 08:26:57 +13:00
Garfield69
a3cb9ad079 add beitai a Chinese private site. resolves #6764 2020-01-01 20:28:29 +13:00
Garfield69
36a5895664 add 52pt a Chinese private site. resolves #6763 2020-01-01 19:53:36 +13:00
Garfield69
5b45cb438a torrentccf: add login captcha error trap 2020-01-01 19:17:58 +13:00
Garfield69
123a56f577 torrentccf: add config sort options
also handle both date types
2020-01-01 17:12:16 +13:00
Garfield69
6df77c762e Update README.md 2020-01-01 13:16:28 +13:00
Garfield69
51e556b369 add onlineselfeducation a private e-learning site. resolves #6759 2020-01-01 12:30:35 +13:00
Garfield69
aad9c3a9ec mteamtp2fa: cookie login for 2fa. resolves #6741 2019-12-31 18:23:11 +13:00
Garfield69
be329e0bbc bit-titan: new Search Engine. resolves #6748
new layout selectors
2019-12-31 16:15:10 +13:00
Benjamin Hesse
6cb77ab427 speedtorrent reloaded: removed .tableinborder from row selector (#6751) 2019-12-31 14:14:24 +13:00
Garfield69
d91c4891d8 add brasiltracker a Private Brazilian site. resolves #6745 2019-12-30 17:35:37 +13:00
Garfield69
72ab0e4a9f polishsource: add uhd category
delete 3d,dvd,bluray
add config sort options
2019-12-30 13:20:08 +13:00
Garfield69
8ced18b4c7 demonoid: switch to private mode. resolves #6716 2019-12-30 07:27:54 +13:00
thebluepotato
c3f4d9cc53 magnetdl: fix incorrect legacylink. (#6739) 2019-12-30 06:50:18 +13:00
Garfield69
9437d24f45 pornbits: more row selectors 2019-12-30 06:29:22 +13:00
Garfield69
352690e1cd add pornbits a private 3x site. resolves #6710 2019-12-29 22:31:53 +13:00
Garfield69
e217a97e23 totallykids: fix 0 results. resolves #6733 2019-12-29 20:32:02 +13:00
Garfield69
10353c7406 totallykids: add xBtit_Default style notice to config. resolves #6730
also add sort options
2019-12-29 12:22:34 +13:00
Garfield69
ee5686c5d6 piratbit: andmatch. #6719 2019-12-29 12:03:34 +13:00
Garfield69
d671a3dfba loporno: andmatch. #6719 2019-12-29 11:48:12 +13:00
Garfield69
9a876b7dc7 moviesdvdr: andmatch. #6719 2019-12-29 11:40:17 +13:00
Garfield69
00f4cfa50f estrenosdtl: andmatch. #6719 2019-12-29 11:37:09 +13:00
Garfield69
9cf7811a8e gamestorrent: andmatch. #6719 2019-12-29 11:32:38 +13:00
Garfield69
458a797fb8 torlock: handle today/yesterday dates. resolves #6728 2019-12-29 11:26:44 +13:00
Garfield69
c13653f3b9 oxtorrent: add new category xxx. resolves #6714 2019-12-29 10:32:38 +13:00
Garfield69
f9f7978a07 gktorrent: add new category xxx. resolves #6712 2019-12-29 10:27:01 +13:00
Garfield69
a2d3811736 torrentland: refine row selection to prevent errors. resolves #6711 2019-12-29 10:21:10 +13:00
Garfield69
583d575a77 btsow: new title selector. resolves #6720 2019-12-29 10:01:13 +13:00
Garfield69
e47c59eca3 idope: fetch 2 pages to bump total to 20 results. resolves #6722 2019-12-29 08:28:33 +13:00
Garfield69
74e0d12a72 finvip: add style notice to config. #6723 2019-12-29 07:58:30 +13:00
Garfield69
788fef5ce6 galeriens: new domain .com 2019-12-28 17:20:56 +13:00
Garfield69
a3f5ef6acf katli: new domain kickass.ws 2019-12-28 17:06:12 +13:00
Garfield69
2bc130a93a torrentwal: new domain *2.com 2019-12-28 17:02:01 +13:00
Garfield69
897ebe4b14 add nordichd a private site. resolves #6708 2019-12-28 16:57:58 +13:00
Garfield69
c9537128dd add extremetorrents a private Dutch site. resolves #5057 2019-12-28 10:10:56 +13:00
Uilton Oliveira
f0b46a1873 BJShare: Improve search result compatibility with Sonarr on few more TV Shows / Animes (#6692) 2019-12-28 09:04:43 +13:00
Garfield69
7291efebae add finvip a Finnish Private site. resolves #6675 2019-12-25 11:35:42 +13:00
Garfield69
3851d8352e add filebase a Russian Public site. resolves #6669 2019-12-25 08:57:35 +13:00
Garfield69
0cd46efe35 add extremlymtorrents a semi-private site. resolves #6668 2019-12-24 18:02:11 +13:00
Garfield69
1433ffcd13 rptorrents: fix sort is->id 2019-12-24 16:41:31 +13:00
Garfield69
450bc8b5ff add cinemamovies a Polish private site. resolves #6667 2019-12-24 15:54:24 +13:00
Garfield69
4eadff404a btdb: add seeders to config sort option 2019-12-24 07:13:44 +13:00
Garfield69
213141f55e btdb: add seeders/leechers drop grabs. resolves #6673 2019-12-24 06:35:03 +13:00
Cory
370f95f888 720pier: Fix login and search parsing (#6670) resolves #6368 2019-12-24 06:17:48 +13:00
Garfield69
7c8ad8ac41 torrentz2: fix categories 2019-12-23 19:21:47 +13:00
Garfield69
f7401d6344 Update README.md 2019-12-23 18:51:42 +13:00
Garfield69
e85ffec947 elite-tracker: add multi config option. resolves #5064
add cat 97
fix category selector
fix longtitle processing
2019-12-23 10:01:32 +13:00
Jonas Stendahl
cf1f70d581 TorrentBytes: Remove trailing whitespace (#6663) 2019-12-23 06:58:01 +13:00
Garfield69
e0161487fd add broadcity a Turkish private site. resolves #6662 2019-12-22 10:58:30 +13:00
Garfield69
92946670b6 ztracker: size can be mising
add config sort options
2019-12-22 10:23:44 +13:00
Garfield69
4f2ef558ad zooqle: add config sort options 2019-12-22 10:04:49 +13:00
Garfield69
9b0c4c8ed2 yggtorrent: add config sort options 2019-12-22 09:51:15 +13:00
Garfield69
7ae1b57ddd xtremefile: add config sort option 2019-12-22 09:17:54 +13:00
Garfield69
246bf48aba vanila: add config sort options
add login remember and hidepresence
2019-12-22 08:59:45 +13:00
Garfield69
41cbbe5818 unlimitz: add config sort options 2019-12-22 08:45:19 +13:00
Garfield69
66964f9b58 inionfansub: add config sort options 2019-12-22 08:27:24 +13:00
Garfield69
c2123de964 add netcosmo an Italian private site. resolves #6657 2019-12-22 06:57:50 +13:00
Garfield69
b81147812c twilight: add config sort optoins 2019-12-21 20:19:11 +13:00
Garfield69
27a8b8dda4 turktorrent" refresh categories
add config sort option
2019-12-21 20:10:13 +13:00
Garfield69
bc88f98cf4 tribalmixes: add config sort options 2019-12-21 19:46:56 +13:00
Garfield69
af32e419ae torrentz2: update categories
add config sort options
2019-12-21 19:31:40 +13:00
Garfield69
c68d0f27b8 torrentslocal: add config sort options 2019-12-21 17:40:44 +13:00
Garfield69
593680f8d3 torrentquest: return movies and tv when using the TEST button. (sonarr radarr support)
add config sort options
2019-12-21 16:58:35 +13:00
Garfield69
0b59811c77 torrentproject2: add config sort option 2019-12-21 16:17:20 +13:00
Garfield69
c836fa7a74 torrentland: refresh cats 2019-12-21 16:04:40 +13:00
Garfield69
172f71de81 torrentgalaxy: add config sort options 2019-12-21 15:48:56 +13:00
Garfield69
3d582fe851 torrentdownload: add config sort option 2019-12-21 15:36:41 +13:00
Garfield69
8f18304257 torrent-turk: refresh categories
add config sort options
2019-12-21 15:24:58 +13:00
583 changed files with 18194 additions and 8915 deletions

295
.editorconfig Normal file
View File

@@ -0,0 +1,295 @@
root=true
# To learn more about .editorconfig see https://aka.ms/editorconfigdocs
# With more recent updates Visual Studio 2017 supports EditorConfig files out of the box
# Visual Studio Code needs an extension: https://github.com/editorconfig/editorconfig-vscode
# For emacs, vim, np++ and other editors, see here: https://github.com/editorconfig
###############################
# Core EditorConfig Options #
###############################
# All files
[*]
indent_style=space
insert_final_newline=true
charset=utf-8
end_of_line=lf
trim_trailing_whitespace=true
# Microsoft .NET properties
csharp_new_line_before_members_in_object_initializers=true
csharp_space_after_cast=false
csharp_style_var_elsewhere=true:suggestion
csharp_style_var_for_built_in_types=true:suggestion
csharp_style_var_when_type_is_apparent=true:suggestion
dotnet_style_parentheses_in_arithmetic_binary_operators=never_if_unnecessary:none
dotnet_style_parentheses_in_other_binary_operators=never_if_unnecessary:none
dotnet_style_parentheses_in_relational_binary_operators=never_if_unnecessary:none
# ReSharper properties
resharper_align_linq_query=true
resharper_align_multiline_argument=true
resharper_align_multiline_calls_chain=true
resharper_align_multiline_extends_list=true
resharper_align_multiline_for_stmt=true
resharper_align_tuple_components=true
resharper_csharp_alignment_tab_fill_style=optimal_fill
resharper_csharp_align_multiline_parameter=true
resharper_csharp_align_multiple_declaration=true
resharper_csharp_indent_pars=outside
resharper_csharp_keep_blank_lines_in_code=0
resharper_csharp_keep_blank_lines_in_declarations=1
resharper_csharp_max_line_length=125
resharper_csharp_stick_comment=false
resharper_csharp_wrap_after_invocation_lpar=true
resharper_force_attribute_style=join
resharper_indent_invocation_pars=outside
resharper_indent_method_decl_pars=outside
resharper_indent_preprocessor_region=no_indent
resharper_indent_statement_pars=outside
resharper_indent_typearg_angles=outside
resharper_indent_typeparam_angles=outside
resharper_keep_existing_embedded_arrangement=false
resharper_keep_existing_expr_member_arrangement=false
resharper_keep_existing_invocation_parens_arrangement=false
resharper_keep_existing_linebreaks=false
resharper_keep_existing_switch_expression_arrangement=false
resharper_place_attribute_on_same_line=false
resharper_place_expr_accessor_on_single_line=true
resharper_place_expr_method_on_single_line=true
resharper_place_expr_property_on_single_line=true
resharper_place_simple_embedded_statement_on_same_line=false
resharper_space_within_empty_braces=false
resharper_wrap_array_initializer_style=chop_always
resharper_wrap_before_extends_colon=true
resharper_wrap_before_type_parameter_langle=true
resharper_wrap_multiple_type_parameter_constraints_style=wrap_if_long
resharper_wrap_object_and_collection_initializer_style=chop_always
# ReSharper inspection severities
resharper_arrange_attributes_highlighting=suggestion
resharper_arrange_redundant_parentheses_highlighting=suggestion
resharper_enforce_if_statement_braces_highlighting=suggestion
# Xml project files
[*.{csproj,vbproj,vcxproj,vcxproj.filters,proj,projitems,shproj}]
indent_size=2
# JavaScript/HTML
[*.{js,ts,json,html,cshtml}]
indent_size=2
# Code files
[*.{cs,csx,vb,vbx}]
indent_size=4
###############################
# .NET Coding Conventions #
###############################
[*.{cs,vb}]
# Organize usings
dotnet_sort_system_directives_first=true
# this. preferences
dotnet_style_qualification_for_field=false:suggestion
dotnet_style_qualification_for_property=false:suggestion
dotnet_style_qualification_for_method=false:suggestion
dotnet_style_qualification_for_event=false:suggestion
# Language keywords vs BCL types preferences
dotnet_style_predefined_type_for_locals_parameters_members=true:warning
dotnet_style_predefined_type_for_member_access=true:suggestion
# Parentheses preferences
dotnet_style_parentheses_in_arithmetic_binary_operators=always_for_clarity:silent
dotnet_style_parentheses_in_relational_binary_operators=always_for_clarity:silent
dotnet_style_parentheses_in_other_binary_operators=always_for_clarity:silent
dotnet_style_parentheses_in_other_operators=never_if_unnecessary:silent
# Modifier preferences
dotnet_style_require_accessibility_modifiers=for_non_interface_members:silent
dotnet_style_readonly_field=true:suggestion
# Expression-level preferences
dotnet_style_object_initializer=true:warning
dotnet_style_collection_initializer=true:warning
dotnet_style_explicit_tuple_names=true:suggestion
dotnet_style_null_propagation=true:suggestion
dotnet_style_coalesce_expression=true:suggestion
dotnet_style_prefer_is_null_check_over_reference_equality_method=true:suggestion
dotnet_style_prefer_inferred_tuple_names=true:suggestion
dotnet_style_prefer_inferred_anonymous_type_member_names=true:suggestion
dotnet_style_prefer_auto_properties=true:suggestion
dotnet_style_prefer_conditional_expression_over_assignment=true:suggestion
dotnet_style_prefer_conditional_expression_over_return=true:suggestion
dotnet_style_prefer_compound_assignment=true:suggestion
###############################
# Naming Conventions #
###############################
# Style Definitions
dotnet_naming_style.pascal_case_style.capitalization=pascal_case
# Use PascalCase for constant fields
dotnet_naming_rule.constant_fields_should_be_pascal_case.severity=warning
dotnet_naming_rule.constant_fields_should_be_pascal_case.symbols=constant_fields
dotnet_naming_rule.constant_fields_should_be_pascal_case.style=pascal_case_style
dotnet_naming_symbols.constant_fields.applicable_kinds=field
dotnet_naming_symbols.constant_fields.applicable_accessibilities=*
dotnet_naming_symbols.constant_fields.required_modifiers=const
# Naming rules
dotnet_naming_rule.interface_should_be_begins_with_i.severity = warning
dotnet_naming_rule.interface_should_be_begins_with_i.symbols = interface
dotnet_naming_rule.interface_should_be_begins_with_i.style = begins_with_i
dotnet_naming_rule.types_should_be_pascal_case.severity = warning
dotnet_naming_rule.types_should_be_pascal_case.symbols = types
dotnet_naming_rule.types_should_be_pascal_case.style = pascal_case
dotnet_naming_rule.non_field_members_should_be_pascal_case.severity = warning
dotnet_naming_rule.non_field_members_should_be_pascal_case.symbols = non_field_members
dotnet_naming_rule.non_field_members_should_be_pascal_case.style = pascal_case
dotnet_naming_rule.private_or_internal_static_field_should_be_private_or_internal_static_with_prefix.severity = warning
dotnet_naming_rule.private_or_internal_static_field_should_be_private_or_internal_static_with_prefix.symbols = private_or_internal_static_field
dotnet_naming_rule.private_or_internal_static_field_should_be_private_or_internal_static_with_prefix.style = private_or_internal_static_with_prefix
dotnet_naming_rule.private_or_internal_field_should_be_private_prefix.severity = warning
dotnet_naming_rule.private_or_internal_field_should_be_private_prefix.symbols = private_or_internal_field
dotnet_naming_rule.private_or_internal_field_should_be_private_prefix.style = private_prefix
dotnet_naming_rule.asyncmethods_should_be_ends_with_async.severity = warning
dotnet_naming_rule.asyncmethods_should_be_ends_with_async.symbols = asyncmethods
dotnet_naming_rule.asyncmethods_should_be_ends_with_async.style = ends_with_async
# Symbol specifications
dotnet_naming_symbols.interface.applicable_kinds = interface
dotnet_naming_symbols.interface.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
dotnet_naming_symbols.interface.required_modifiers =
dotnet_naming_symbols.private_or_internal_field.applicable_kinds = field
dotnet_naming_symbols.private_or_internal_field.applicable_accessibilities = internal, private, private_protected
dotnet_naming_symbols.private_or_internal_field.required_modifiers =
dotnet_naming_symbols.private_or_internal_static_field.applicable_kinds = field
dotnet_naming_symbols.private_or_internal_static_field.applicable_accessibilities = internal, private, private_protected
dotnet_naming_symbols.private_or_internal_static_field.required_modifiers = static
dotnet_naming_symbols.types.applicable_kinds = class, struct, interface, enum
dotnet_naming_symbols.types.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
dotnet_naming_symbols.types.required_modifiers =
dotnet_naming_symbols.non_field_members.applicable_kinds = property, event, method
dotnet_naming_symbols.non_field_members.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
dotnet_naming_symbols.non_field_members.required_modifiers =
dotnet_naming_symbols.asyncmethods.applicable_kinds = delegate, method, local_function
dotnet_naming_symbols.asyncmethods.applicable_accessibilities = *
dotnet_naming_symbols.asyncmethods.required_modifiers = async
# Naming styles
dotnet_naming_style.pascal_case.required_prefix =
dotnet_naming_style.pascal_case.required_suffix =
dotnet_naming_style.pascal_case.word_separator =
dotnet_naming_style.pascal_case.capitalization = pascal_case
dotnet_naming_style.begins_with_i.required_prefix = I
dotnet_naming_style.begins_with_i.required_suffix =
dotnet_naming_style.begins_with_i.word_separator =
dotnet_naming_style.begins_with_i.capitalization = pascal_case
dotnet_naming_style.private_or_internal_static_with_prefix.required_prefix = s_
dotnet_naming_style.private_or_internal_static_with_prefix.required_suffix =
dotnet_naming_style.private_or_internal_static_with_prefix.word_separator =
dotnet_naming_style.private_or_internal_static_with_prefix.capitalization = pascal_case
dotnet_naming_style.private_prefix.required_prefix = _
dotnet_naming_style.private_prefix.required_suffix =
dotnet_naming_style.private_prefix.word_separator =
dotnet_naming_style.private_prefix.capitalization = camel_case
dotnet_naming_style.ends_with_async.required_prefix =
dotnet_naming_style.ends_with_async.required_suffix = Async
dotnet_naming_style.ends_with_async.word_separator =
dotnet_naming_style.ends_with_async.capitalization = pascal_case
###############################
# C# Coding Conventions #
###############################
[*.cs]
# var preferences
csharp_style_var_for_built_in_types=true:suggestion
csharp_style_var_when_type_is_apparent=true:suggestion
csharp_style_var_elsewhere=true:suggestion
# Expression-bodied members
csharp_style_expression_bodied_methods=when_on_single_line:suggestion
csharp_style_expression_bodied_constructors=when_on_single_line:suggestion
csharp_style_expression_bodied_operators=when_on_single_line:suggestion
csharp_style_expression_bodied_properties=true:suggestion
csharp_style_expression_bodied_indexers=true:suggestion
csharp_style_expression_bodied_accessors=true:suggestion
csharp_style_expression_bodied_lambdas=true:suggestion
csharp_style_expression_bodied_local_functions=true:suggestion
# Pattern matching preferences
csharp_style_pattern_matching_over_is_with_cast_check=true:suggestion
csharp_style_pattern_matching_over_as_with_null_check=true:suggestion
# Null-checking preferences
csharp_style_throw_expression=true:warning
csharp_style_conditional_delegate_call=true:warning
# Modifier preferences
csharp_preferred_modifier_order=public,private,protected,internal,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,volatile,async:suggestion
# Expression-level preferences
csharp_prefer_braces=false:suggestion
csharp_style_deconstructed_variable_declaration=true:suggestion
csharp_prefer_simple_default_expression=true:warning
csharp_style_pattern_local_over_anonymous_function=true:suggestion
csharp_style_inlined_variable_declaration=true:suggestion
# Prefer C# 8.0 Indexing Features
csharp_style_prefer_index_operator=true:suggestion
csharp_style_prefer_range_operator=true:suggestion
csharp_style_deconstructed_variable_declaration=true:suggestion
csharp_style_pattern_local_over_anonymous_function=true:suggestion
csharp_using_directive_placement=outside_namespace:suggestion
csharp_prefer_static_local_function=true:suggestion
csharp_prefer_simple_using_statement=true:suggestion
csharp_style_prefer_switch_expression=true:suggestion
###############################
# C# Formatting Rules #
###############################
# New line preferences
csharp_new_line_before_open_brace=all
csharp_new_line_before_else=true
csharp_new_line_before_catch=true
csharp_new_line_before_finally=true
csharp_new_line_before_members_in_object_initializers=true
csharp_new_line_before_members_in_anonymous_types=true
csharp_new_line_between_query_expression_clauses=true
# Indentation preferences
csharp_indent_case_contents=true
csharp_indent_switch_labels=true
csharp_indent_labels=flush_left
csharp_indent_block_contents=true
csharp_indent_braces=false
csharp_indent_case_contents_when_block=true
# Space preferences
csharp_space_after_cast=false
csharp_space_after_keywords_in_control_flow_statements=true
csharp_space_between_method_call_parameter_list_parentheses=false
csharp_space_between_method_declaration_parameter_list_parentheses=false
csharp_space_between_parentheses=false
csharp_space_before_colon_in_inheritance_clause=true
csharp_space_after_colon_in_inheritance_clause=true
csharp_space_around_binary_operators=before_and_after
csharp_space_between_method_declaration_empty_parameter_list_parentheses=false
csharp_space_between_method_call_name_and_opening_parenthesis=false
csharp_space_between_method_call_empty_parameter_list_parentheses=false
# Wrapping preferences
csharp_preserve_single_line_statements=false
csharp_preserve_single_line_blocks=true
###############################
# VB Coding Conventions #
###############################
[*.vb]
# Modifier preferences
visual_basic_preferred_modifier_order=Partial,Default,Private,Protected,Public,Friend,NotOverridable,Overridable,MustOverride,Overloads,Overrides,MustInherit,NotInheritable,Static,Shared,Shadows,ReadOnly,WriteOnly,Dim,Const,WithEvents,Widening,Narrowing,Custom,Async:suggestion

View File

@@ -1,13 +1,33 @@
**Please use the search bar** at the top of the page and make sure you are not creating an already submitted issue. Duplicating issues makes it more difficult for everyone to follow. Your issue may have already been solved in the past as well.
**Please use the search bar** at the top of the page and make sure you are not creating an already submitted issue.
Check closed issues as well, because your issue may have already been fixed.
Provide a description of the feature request or bug, the more details the better.
Please read our [Contributing Guidelines](https://github.com/Jackett/Jackett/blob/master/CONTRIBUTING.md) before submitting your issue to ensure a prompt response to your bug.
If you are experiencing an issue with a tracker, then:
1. Use your browser to check you can access the site directly, and if a login is required, check you can login and that you do not have any outstanding account issues.
2. If you haven't already, try upgrading to the latest version of Jackett, your issue may have already been resolved.
3. If it is still not working for you, then a **full enhanced log must be included**. Instructions for obtaining logs are here: https://github.com/Jackett/Jackett#troubleshooting
### Environment
(At the bottom of your Jackett Dashboard page) **Jackett version**:
(if you installed using Jackett.Binaries.Mono.tar.gz) **Mono version**:
**OS**:
-------------------------------
**.Net Runtime**: [.Net-Core/.Net-Framework/Mono]
**.Net Version**:
**Jackett Version**:
**Last Working Jackett Version**:
**Are you using a proxy or VPN?** [yes/no]
### Description
[List steps to reproduce the error and details on what happens and what you expected to happen]
### Logged Error Messages
[Place any relevant error messages you noticed from the logs here.]
[Make sure you attach the full logs with your personal information removed in case we need more information]
### Screenshots
[Place any screenshots of the issue here if needed]

BIN
.github/jackett-screenshot1.png vendored Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 202 KiB

BIN
.github/jackett-screenshot2.png vendored Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

BIN
.github/jackett-screenshot3.png vendored Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 135 KiB

View File

@@ -2,8 +2,31 @@ Hi @{{ payload.sender.login }},
You've created an issue, but haven't provided any details to allow the community to assist you. To prevent issue tracker clutter, this issue will now be closed. Please provide the information needed below and your comment will automatically re-open this issue.
Provide a description of the feature request or bug, the more details the better.
If you are experiencing an issue with a tracker, a **full enhanced log must be included**. Instructions for obtaining logs are here: https://github.com/Jackett/Jackett#troubleshooting
### Environment
(At the bottom of your Jackett Dashboard page) **Jackett version**:
(if you installed using Jackett.Binaries.Mono.tar.gz) **Mono version**:
**OS**:
**.Net Runtime**: [.Net-Core/.Net-Framework/Mono]
**.Net Version**:
**Jackett Version**:
**Last Working Jackett Version**:
**Are you using a proxy or VPN?** [yes/no]
### Description
[List steps to reproduce the error and details on what happens and what you expected to happen]
### Logged Error Messages
[Place any relevant error messages you noticed from the logs here.]
[Make sure you attach the full logs with your personal information removed in case we need more information]
### Screenshots
[Place any screenshots of the issue here if needed]

200
CONTRIBUTING.md Normal file
View File

@@ -0,0 +1,200 @@
# Contributing to Jackett
So, you've decided you want to help make Jackett a better program for everyone. Not everyone chooses to help, so we thank you for your decision.
In order to help us make the most of your contribution please take the time to read these contributing guidelines.
These are just guidelines, not hard rules. Use your best judgment, and feel free to propose changes to this document in a pull request.
## Ways you can help
- [Getting Started](#getting-started)
- [Troubleshooting](#troubleshooting)
- [Reporting a bug](#reporting-a-bug)
- [Adding a new tracker](#adding-a-new-tracker)
- [Contributing Code](#contributing-code)
- [Setting up your environment](#setting-up-your-environment)
- [Coding style](#coding-style)
- [Getting your code accepted & pull requests](#pull-requests)
# Getting Started
Now that you've decided you want to help us make Jackett a better program the big question is: Where do you start?
Why right here of course. You can help in several ways, from finding and reporting bugs, to adding new trackers,
to fixing bugs in the program code itself. Below, we outline the steps needed to file your first bug report.
## Troubleshooting
Before you submit a bug report, it's important to make sure it's not already a known issue,
and to make sure it's a bug we can find and fix quickly.
These troubleshooting tips will help make sure your bug report is high quality and can be fixed quickly.
**Update your Jackett to the latest version**
Before you submit a bug-report or do any other troubleshooting, make sure your Jackett is the latest release version.
We are releasing bug fixes almost daily, so your issue may have been fixed already.
Bugs that are submitted without being on the latest version may be closed.
**Error "An error occurred while sending the request: Error: TrustFailure (A call to SSPI failed, see inner exception.)"**
This is often caused by missing CA certificates.
Try reimporting the certificates in this case:
- On Linux (as user root): `wget -O - https://curl.haxx.se/ca/cacert.pem | cert-sync /dev/stdin`
- On macOS: `curl -sS https://curl.haxx.se/ca/cacert.pem | cert-sync --user /dev/stdin`
**Tracker isn't working**
If you are experiencing an issue with a tracker, then:
- Use your browser to check you can access the site directly, and if a login is required,
check you can login and that you do not have any outstanding account issues.
- If you haven't already, try upgrading to the latest version of Jackett.
- If it is still not working for you, then a **full enhanced log must be included**.
**Enable enhanced logging**
- You can get *enhanced* logging with the command line switches `-t -l` or by enabling `Enhanced logging` via the web interface
(followed by clicking on the `Apply Server Settings` button).
- These enhanced logs are necessary for us to quickly track down your bug and get a fix implemented in code.
- Make sure you remove your username/password/cookies from the log files before submitting them with your issue.
- The logfiles (log.txt/updater.txt) are stored on Windows in `%ProgramData%\Jackett`, on Linux/macOS in `~/.config/Jackett/`,
and on FreeBSD in `/usr/local/jackett`.
## Reporting a Bug
Once you have your enhanced logs and you are still unable to resolve your issue yourself, now it's time to prepare to submit a bug report!
Before you submit your report, make sure you've searched open *and* closed bugs to see if someone's already informed us of your issue.
If your search doesn't help you fix your issue and you can't find a similar bug already listed, then you get to make a new issue.
Your issue should have the following information.
- **Descriptive Title** - The title of your bug should include keywords and a descriptive summary of what you're experiencing
to help others avoid duplicating your bug report
- Keywords in the title should be as follows:
- Tracker bugs should start with the tracker in brackets e.g. [**AnimeBytes**]
- Feature requests should start with [**REQ**]
- New trackers should begin with [**New**] and the tracker type [**Public**/**Private**/**Semi-Private**] e.g. **[New][Public] ThePirateBay**
- **Environment Details** - These are things like your OS version, Jackett type and version, mono/.Net-core/framework version(s).
These are asked for by the issue template when you create a new issue on GitHub.
- **Steps** to cause the problem, if applicable. These should be specific and repeatable.
- **What happens** when you take the steps and **what you expected to happen**
- **Error messages** and/or screenshots of the issue.
- The **last working version** if it's applicable. Tracker issues normally don't need this information.
- An attached copy of your **enhanced logs**. Don't forget to remove usernames/passwords/API-keys from the logs.
We'll be working on making sure these are automatically censored in the future.
- Any other **relevant details** you can think of. The more information we have, the quicker we can solve the problem.
## Adding a New Tracker
Jackett's framework typically allows our team and volunteering developers to implement new trackers in a couple of hours
Depending on logic complexity, there are two common ways new trackers are implemented:
1. simple [definitions](http://github.com/Jackett/Jackett/tree/master/src/Jackett.Common/Definitions) (.yml / YAML)
2. advanced (native) [indexers](http://github.com/Jackett/Jackett/tree/master/src/Jackett.Common/Indexers) (.cs / C#)
Read more about the [simple definition format](https://github.com/Jackett/Jackett/wiki/Definition-format).
# Contributing Code
While reporting the bugs is super helpful since you can't fix bugs you don't know about, they don't get fixed unless someone goes in and fixes them.
Luckily, you're a developer who wants to help us do just that. Thanks!
We really need more developers working on Jackett, no matter their skill level or walk of life.
We've developed the guide below to make sure we're all on the same page because this makes reading and fixing code much simpler, faster, and less bug-prone.
## Setting up your environment
The following guide assumes you've never worked with a Visual Studio project with GitHub before.
This will give you the minimum necessary tools to get started. There are plenty of optional tools that may help you, but we won't cover those here.
- The guide is currently only geared towards developing on Windows using Visual Studio Community 2019.
If you use something else, please add it here for others.
<details open=true> <summary> Windows </summary>
<details open=true> <summary> Visual Studio 2019 </summary>
- Install [Visual Studio Community 2019](http://visualstudio.com) for free.
- About 2GB download. 8GB installed.
- Make sure it includes the following Workloads/Components:
- .Net Desktop Development
- .Net Core Cross-Platform Development
- GitHub extension for Visual Studio
- [Connect and synchronize your forked repository to Visual Studio](https://doc.fireflymigration.com/working-with-github-fork-in-visual-studio.html)
- Open `Tools -> NuGet Package Manager -> Package Manager Console`
- From the PMC, run `dotnet tool install -g dotnet-format` and `dotnet restore`
- Run `Build -> Rebuild Solution` to restore NuGet packages
- Ensure `Jackett.Server` is the Startup Project (instead of `Jackett.Service`), and the Run Target (instead of `IIS Express`)
</details>
</details>
## Coding Style
Now that you're ready to code, it's time to teach you our style guidelines. This style guide helps our code stay readable and bug-free.
You can see the full details in the [Editor Config](.editorconfig) file.
Running `dotnet format` from the Package Manager Console will apply the style guide to the solution and is required before any pull request will be accepted.
- Whitespace
- Indenting is done with 4 spaces
- No whitespace at the end of lines
- All files have a final newline
- Unix style new lines for committed code
- Spaces around all non-unary operators
- Braces
- Opening brace on its own line
- Single line statements do not use braces
- If any part of an `if ... else if ... else` block needs braces, all blocks will use braces
- Naming
- `interface` names begin with I and are `PascalCase`
- `private` variables begin with _ and are `camelCase`
- `private static` variables begin with s_ and are `camelCase`
- local variables are `camelCase`
- `async` function names end with Async
- all others are `PascalCase`
- Others
- Prefer `var` for declarations
- Prefer modern language enhancements (C#7, C#8 features)
- switch expressions
- range operator
- using statements
- `default` over `default(T)`
- Prefer conditional access `?.` and null coalescing `??` over null checks
- Prefer pattern matching
- Prefer expression bodies
- Avoid `this` qualifier
- `using` statements go outside namespace declaration and are sorted:
- `using System`
- `using System.*` alphabetically
- all others alphabetically
- Prefer explicit variable modifiers: `private`, `public`, `protected`
- Prefer `readonly` and `const` variables when appropriate
## Pull Requests
At this point, you've found the bug, fixed it, tested that the bug is gone, and you haven't broken anything else in the process.
Now it's time to share your code with everyone else so we can all enjoy a better version of the program.
Here's what you need to do to give your pull request the best chance at a timely review and maximize that it will be accepted.
- Make sure your code follows GitHub and Jackett's standards and practices.
- Your changes should be made in a new branch based on `master` not directly on your `master` branch
- Your commit messages should start with a capital letter, be in the singular imperative voice, and do not end with punctuation marks, e.g.:
- Fix login handling for xxx tracker
- Add feature yyy
- Remove dead tracker fff
- Run `dotnet format` from the Package Manager Console (found in `Tools -> NuGet Package Manager` or `View -> Other Windows`)
- If your branch falls out of sync and has merge conflicts with the Jackett official `master`
[rebase](https://mohitgoyal.co/2018/04/18/working-with-git-and-visual-studio-use-git-rebase-inside-visual-studio/) your fix before submission.
- If you deleted, moved, or renamed any files/folders, be sure to add the old file/folder path to the appropriate array in `Jacket.Updater/Program.cs`
- If you added or renamed a tracker, update the README to include the new name
- [Squash your local commits](https://github.com/spottedmahn/my-blog/issues/26)
- Push your commit branch to your fork on GitHub.
- Create your Pull Request
- You can do this from the GitHub website or from the GitHub window in Visual Studio.
- Give your Pull Request a descriptive title
- Include keywords like `[New Tracker]` or `[Feature]` at the beginning of the title
- Include any open tickets this Pull Request should fix in the description. **Do not** put ticket numbers in the title.
We will be by when we can to review your Pull Request.

View File

@@ -19,7 +19,7 @@ AppPublisher={#MyAppPublisher}
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}
DefaultDirName={pf}\{#MyAppName}
DefaultDirName={commonappdata}\{#MyAppName}
DefaultGroupName={#MyAppName}
DisableProgramGroupPage=yes
OutputBaseFilename={#MyOutputFilename}

220
README.md
View File

@@ -3,13 +3,16 @@
[![GitHub issues](https://img.shields.io/github/issues/Jackett/Jackett.svg?maxAge=60&style=flat-square)](https://github.com/Jackett/Jackett/issues)
[![GitHub pull requests](https://img.shields.io/github/issues-pr/Jackett/Jackett.svg?maxAge=60&style=flat-square)](https://github.com/Jackett/Jackett/pulls)
[![Build status](https://ci.appveyor.com/api/projects/status/gaybh5mvyx418nsp/branch/master?svg=true)](https://ci.appveyor.com/project/Jackett/jackett)
[![Github Releases](https://img.shields.io/github/downloads/Jackett/Jackett/total.svg?maxAge=60&style=flat-square)](https://github.com/Jackett/Jackett/releases/latest)
[![Build Status](https://dev.azure.com/Jackett-project/Jackett/_apis/build/status/Jackett.Jackett?branchName=master)](https://dev.azure.com/Jackett-project/Jackett/_build/latest?definitionId=1&branchName=master)
[![GitHub Releases](https://img.shields.io/github/downloads/Jackett/Jackett/total.svg?maxAge=60&style=flat-square)](https://github.com/Jackett/Jackett/releases/latest)
[![Docker Pulls](https://img.shields.io/docker/pulls/linuxserver/jackett.svg?maxAge=60&style=flat-square)](https://hub.docker.com/r/linuxserver/jackett/)
[![Discord](https://img.shields.io/badge/discord-chat-7289DA.svg?maxAge=60&style=flat-square)](https://discord.gg/J865QuA)
This project is a new fork and is recruiting development help. If you are able to help out please contact us.
Jackett works as a proxy server: it translates queries from apps ([Sonarr](https://github.com/Sonarr/Sonarr), [Radarr](https://github.com/Radarr/Radarr), [SickRage](https://sickrage.github.io/), [CouchPotato](https://couchpota.to/), [Mylar](https://github.com/evilhero/mylar), [Lidarr](https://github.com/lidarr/lidarr), [DuckieTV](https://github.com/SchizoDuckie/DuckieTV), [qBittorrent](https://www.qbittorrent.org/), [Nefarious](https://github.com/lardbit/nefarious) etc) into tracker-site-specific http queries, parses the html response, then sends results back to the requesting software. This allows for getting recent uploads (like RSS) and performing searches. Jackett is a single repository of maintained indexer scraping & translation logic - removing the burden from other apps.
Please see our [troubleshooting and contributing guidelines](CONTRIBUTING.md) before submitting any issues or pull requests
Jackett works as a proxy server: it translates queries from apps ([Sonarr](https://github.com/Sonarr/Sonarr), [Radarr](https://github.com/Radarr/Radarr), [SickRage](https://sickrage.github.io/), [CouchPotato](https://couchpota.to/), [Mylar](https://github.com/evilhero/mylar), [Lidarr](https://github.com/lidarr/lidarr), [DuckieTV](https://github.com/SchizoDuckie/DuckieTV), [qBittorrent](https://www.qbittorrent.org/), [Nefarious](https://github.com/lardbit/nefarious) etc.) into tracker-site-specific http queries, parses the html response, then sends results back to the requesting software. This allows for getting recent uploads (like RSS) and performing searches. Jackett is a single repository of maintained indexer scraping & translation logic - removing the burden from other apps.
Developer note: The software implements the [Torznab](https://github.com/Sonarr/Sonarr/wiki/Implementing-a-Torznab-indexer) (with [nZEDb](https://github.com/nZEDb/nZEDb/blob/dev/docs/newznab_api_specification.txt) category numbering) and [TorrentPotato](https://github.com/RuudBurger/CouchPotatoServer/wiki/Couchpotato-torrent-provider) APIs.
@@ -18,23 +21,28 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
#### Supported Systems
* Windows 7SP1 or greater using .NET 4.6.1 or above [Download here](https://www.microsoft.com/net/framework/versions/net461)
* Linux [supported operating systems here](https://github.com/dotnet/core/blob/master/release-notes/2.1/2.1-supported-os.md#linux)
* macOS 10.12 or greater
* macOS 10.13 or greater
<details> <summary> <b> Supported Public Trackers </b> </summary>
### Supported Public Trackers
* 1337x
* 7torrents
* ACG.RIP
* ACGsou
* Anidex
* Anime Tosho
* AniRena
* AudioBook Bay (ABB)
* Badass Torrents
* BigFANGroup
* BitRu
* BitTorrent.AM
* BTDB
* BTDIGG
* BTeye
* BT.etree
* BTSOW
* Cili180
* ConCen
* Corsaro.red
* cpasbien
@@ -44,20 +52,22 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
* ETTV
* EliteTorrent.biz
* EstrenosDTL
* ExtraTorrent.ag
* ExtraTorrent.cd
* EXT Torrents
* EZTV
* Filebase
* FireBit
* Frozen Layer
* GamesTorrents
* GkTorrent
* GloDLS
* HDReactor
* Hon3yHD.net
* Horrible Subs
* IBit
* Idope
* Il Corsaro Nero <!-- maintained by bonny1992 -->
* Il Corsaro Blu
* Internet Archive (archive.org)
* Isohunt2
* iTorrent
* KickAssTorrent (KATcr)
@@ -66,6 +76,7 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
* LePorno
* LimeTorrents
* MacTorrents
* Magnet4You
* MagnetDL
* MejorTorrent <!-- maintained by ivandelabeldad -->
* Monova
@@ -80,6 +91,8 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
* Nyaa-Pantsu
* OxTorrent
* PiratBit
* Pirateiro
* PornLeech
* ProStyleX
* RARBG
* Rus-media
@@ -98,23 +111,28 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
* Torlock
* TOROS
* Torrent Downloads (TD)
* Torrent4You
* Torrent9
* Torrent9Clone
* TorrentDownload
* TorrentFunk
* TorrentGalaxy (TGx)
* TorrentKitty
* TorrentParadise
* TorrentProject2
* TorrentQuest
* Torrents.csv
* TorrentView
* TorrentWal
* Torrentz2
* Underverse
* YourBittorrent
* YTS.ag
* Zooqle
</details>
<details> <summary> <b> Supported Semi-Private Trackers </b> </summary>
### Supported Semi-Private Trackers
* Alein
* AlexFilm
* AniDUB
@@ -127,12 +145,14 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
* Deildu
* DXP (Deaf Experts)
* EniaHD
* Film-Paleis
* Erzsebet
* ExtremlymTorrents
* Gay-Torrents.net
* Gay-Torrents.org
* HamsterStudio
* HD Dolby
* Kinozal
* Korsar
* LostFilm.tv
* Marine Tracker
* Metal Tracker
@@ -143,6 +163,7 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
* Pornolab
* RiperAM
* RockBox
* Rustorka
* RuTracker
* Sharewood
* SkTorrent
@@ -152,16 +173,18 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
* Torrents-Local
* TribalMixes
* Union Fansub
* Vanila
* YggTorrent (YGG)
* Ztracker
</details>
<details> <summary> <b> Supported Private Trackers </b> </summary>
### Supported Private Trackers
* 0day.kiev
* 2 Fast 4 You
* 3D Torrents (3DT)
* 3D Torrents (3DT)
* 3evils
* 4thD (4th Dimension)
* 52PT
* 720pier
* Abnormal
* Acid Lounge (A-L)
@@ -182,7 +205,9 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
* Back-ups
* BakaBT
* BaconBits (bB)
* BeiTai
* BeyondHD (BHD)
* Bibliotik
* BIGTorrent
* BigTower
* Bit-City Reloaded
@@ -196,7 +221,10 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
* BJ-Share (BJ)
* BlueBird
* Blutopia (BLU)
* Brasil Tracker
* BroadcastTheNet (BTN)
* BroadCity
* BRObits
* BrokenStones
* BTGigs (TG)
* BTNext (BTNT)
@@ -209,6 +237,7 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
* CHDBits
* ChannelX
* Cinemageddon
* CinemaMovies
* Cinematik
* CinemaZ (EuTorrents)
* Classix
@@ -225,6 +254,7 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
* DigitalCore
* DigitalHive
* DivTeam
* DivxTotal
* DocumentaryTorrents (DT)
* Downloadville
* Dragonworld Reloaded
@@ -232,14 +262,19 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
* EbookParadijs
* Ebooks-Shares
* EfectoDoppler
* EggMeOn
* Elite-Tracker
* Empornium (EMP)
* eShareNet
* eStone (XiDER, BeLoad)
* Ethor.net (Thor's Land)
* ExtremeTorrents
* FANO.IN
* FileList (FL)
* FeedUrNeed (FuN)
* Femdomcult
* FileList (FL)
* Film-Paleis
* FinVip
* FocusX
* FreeTorrent
* FullMixMusic
@@ -258,6 +293,7 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
* Greek Team
* HacheDe
* HD-Forever (HDF)
* HD-Olimpo
* HD-Only (HDO)
* HD-Space (HDS)
* HD-Spain
@@ -269,10 +305,12 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
* HDCenter
* HDChina (HDWing)
* HDCity
* HDDisk (HDD)
* HDHome (HDBigger)
* HDME
* HDRoute
* HDSky
* HDTime
* HDTorrents.it
* HDTurk
* HDU
@@ -280,7 +318,7 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
* Hebits
* Hon3y HD
* HQSource (HQS)
* HuSh
* HuSh
* ICE Torrent
* ImmortalSeed (iS)
* Immortuos
@@ -290,7 +328,9 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
* JPopsuki
* Kapaki
* Karagarga
* LegacyHD (HD4Free)
* Le Saloon
* LeagueHD
* LearnFlakes
* LibraNet (LN)
* LinkoManija
@@ -298,6 +338,8 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
* M-Team TP (MTTP)
* Magico (Trellas)
* Majomparádé (TurkDepo)
* MicroBit (µBit)
* MoeCat
* Mononoké-BT
* MoreThanTV (MTV)
* MyAnonamouse (MAM)
@@ -306,17 +348,20 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
* NBTorrents
* NCore
* Nebulance (NBL) (TransmiTheNet)
* NetCosmo
* NetLab
* New Real World
* Norbits
* NordicBits (NB)
* NORDiCHD
* Nostalgic (The Archive)
* notwhat.cd
* OnlineSelfEducation
* Orpheus
* Ourbits (HDPter)
* P2PBG
* P2PElite
* Partis
* Passione Torrent <!-- maintained by bonny1992 -->
* PassThePopcorn (PTP)
* Peers.FM
* PirateTheNet (PTN)
@@ -326,6 +371,7 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
* PolishSource (PS)
* PolishTracker
* Pornbay
* PornBits (PB)
* Pretome
* PrivateHD (PHD)
* ProAudioTorrents (PAT)
@@ -351,6 +397,7 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
* ScenePalace (SP)
* SceneRush
* SceneTime
* SceneXpress
* SDBits
* Secret Cinema
* SeedFile (SF)
@@ -360,6 +407,7 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
* Shazbat
* Shellife (SL)
* SiamBIT
* SnowPT (SSPT)
* SpaceTorrent
* SpeedCD
* SpeedTorrent Reloaded
@@ -370,7 +418,6 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
* TakeaByte
* Tapochek
* Tasmanit
* Tazmania-Den
* TeamHD
* TeamOS
* TEKNO3D
@@ -378,16 +425,18 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
* TenYardTorrents (TYT)
* TheAudioScene
* TheEmpire (TE)
* The Falling Angels (TFA)
* The Geeks
* The Horror Charnel (THC)
* The Movie Cave
* The New Retro
* The Occult
* The Place
* The Resurrection
* The Shinning (TsH)
* The Show
* The-Torrents
* The-Madhouse
* The Vault
* TLFBits
* Torrent Network (TN)
* Torrent Sector Crew (TSC)
* Torrent.LT
@@ -396,11 +445,13 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
* TorrentCCF (TCCF)
* TorrentDay (TD)
* Torrentech (TTH)
* TorrentFactory
* TorrentHeaven
* TorrentHR
* Torrenting (TT)
* Torrentland
* TorrentLeech (TL)
* TorrentLeech.pl
* TorrentSeeds (TS)
* Torrent-Syndikat
* TOrrent-tuRK (TORK)
@@ -408,16 +459,18 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
* ToTheGlory
* TranceTraffic
* Trezzor
* TurkTorrent (TT) [![(invite needed)][inviteneeded]](#)
* TurkTorrent (TT)
* TV Chaos UK (TVCUK)
* TV-Vault
* TVstore
* Twilight Torrents
* Twilights Zoom
* u-torrents (SceneFZ)
* UHDBits
* UnionGang
* UnlimitZ
* Vizuk
* WDT (Wrestling Desires Torrents / Ultimate Wrestling Torrents)
* World-In-HD
* World-of-Tomorrow
* x-ite.me (XM)
@@ -431,8 +484,9 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
* ExoticaZ (YourExotic)
* Zamunda.net
* Zelka.org
</details>
Trackers marked with [![(invite needed)][inviteneeded]](#) have no active maintainer and are missing features or are broken. If you have an invite for them please send it to kaso1717 -at- gmail.com to get them fixed/improved.
Trackers marked with [![(invite needed)][inviteneeded]](#) have no active maintainer and are missing features or are broken. If you have an invite for them please send it to garfieldsixtynine -at- gmail.com to get them fixed/improved.
### Aggregate indexers
@@ -442,12 +496,12 @@ It will query all configured indexers and return the combined results.
If your client supports multiple feeds it's recommended to add each indexer directly instead of using the all indexer.
Using the all indexer has no advantages (besides reduced management overhead), only disadvantages:
* you lose control over indexer specific settings (categories, search modes, etc.)
* mixing search modes (IMDB, query, etc.) might cause low quality results
* mixing search modes (IMDB, query, etc.) might cause low-quality results
* indexer specific categories (>= 100000) can't be used.
* slow indexers will slow down the overall result
* total results are limited to 1000
To get all Jackett indexers including their capabilities you can use `t=indexers` on the all indexer. To get only configured/unconfigured indexers you can also add `configured=true/false` as query parameter.
To get all Jackett indexers including their capabilities you can use `t=indexers` on the all indexer. To get only configured/unconfigured indexers you can also add `configured=true/false` as a query parameter.
## Installation on Windows
@@ -459,7 +513,7 @@ To get started with using the installer for Jackett, follow the steps below:
2. When prompted if you would like this app to make changes to your computer, select "yes".
3. If you would like to install Jackett as a Windows Service, make sure the "Install as Windows Service" checkbox is filled.
4. Once the installation has finished, check the "Launch Jackett" box to get started.
5. Navigate your web browser to: http://127.0.0.1:9117
5. Navigate your web browser to http://127.0.0.1:9117
6. You're now ready to begin adding your trackers and using Jackett.
When installed as a service the tray icon acts as a way to open/start/stop Jackett. If you opted to not install it as a service then Jackett will run its web server from the tray tool.
@@ -468,7 +522,7 @@ Jackett can also be run from the command line if you would like to see log messa
## Install on Linux (AMDx64)
On most operating systems all the required dependencies will already be present. In case they are not, you can refer to this page https://github.com/dotnet/core/blob/master/Documentation/linux-prereqs.md
On most operating systems all the required dependencies will already be present. In case they are not, you can refer to this page https://github.com/dotnet/core/blob/master/Documentation/linux-prereqs.md
### Install as service
1. Download and extract the latest `Jackett.Binaries.LinuxAMDx64.tar.gz` release from the [releases page](https://github.com/Jackett/Jackett/releases)
@@ -478,21 +532,21 @@ On most operating systems all the required dependencies will already be present.
Download and extract the latest `Jackett.Binaries.LinuxAMDx64.tar.gz` release from the [releases page](https://github.com/Jackett/Jackett/releases), open a Terminal, cd to the jackett folder and run Jackett with the command `./jackett`
### home directory
If you want to run it with a user without a /home directory you need to add `Environment=XDG_CONFIG_HOME=/path/to/folder` to your systemd file, this folder will be used to store your config files.
If you want to run it with a user without a /home directory you need to add `Environment=XDG_CONFIG_HOME=/path/to/folder` to your systemd file, this folder will be used to store your config files.
## Install on Linux (ARMv7 or above)
On most operating systems all the required dependencies will already be present. In case they are not, you can refer to this page https://github.com/dotnet/core/blob/master/Documentation/linux-prereqs.md
On most operating systems all the required dependencies will already be present. In case they are not, you can refer to this page https://github.com/dotnet/core/blob/master/Documentation/linux-prereqs.md
### Install as service
1. Download and extract the latest `Jackett.Binaries.LinuxARM32.tar.gz` or `Jackett.Binaries.LinuxARM64.tar.gz` (32 bit is the most common on ARM) release from the [releases page](https://github.com/Jackett/Jackett/releases)
1. Download and extract the latest `Jackett.Binaries.LinuxARM32.tar.gz` or `Jackett.Binaries.LinuxARM64.tar.gz` (32 bit is the most common on ARM) release from the [releases page](https://github.com/Jackett/Jackett/releases)
2. To install Jackett as a service, open a Terminal, cd to the jackett folder and run `sudo ./install_service_systemd.sh` You need root permissions to install the service. The service will start on each logon. You can always stop it by running `systemctl stop jackett.service` from Terminal. You can start it again it using `systemctl start jackett.service`. Logs are stored as usual under `~/.config/Jackett/log.txt` and also in `journalctl -u jackett.service`.
### Run without installing as a service
Download and extract the latest `Jackett.Binaries.LinuxARM32.tar.gz` or `Jackett.Binaries.LinuxARM64.tar.gz` (32 bit is the most common on ARM) release from the [releases page](https://github.com/Jackett/Jackett/releases), open a Terminal, cd to the jackett folder and run Jackett with the command `./jackett`
### home directory
If you want to run it with a user without a /home directory you need to add `Environment=XDG_CONFIG_HOME=/path/to/folder` to your systemd file, this folder will be used to store your config files.
If you want to run it with a user without a /home directory you need to add `Environment=XDG_CONFIG_HOME=/path/to/folder` to your systemd file, this folder will be used to store your config files.
## Installation on Linux (ARMv6 or below)
@@ -500,13 +554,13 @@ If you want to run it with a user without a /home directory you need to add `Env
* Follow the instructions on the mono website and install the `mono-devel` and the `ca-certificates-mono` packages.
* On Red Hat/CentOS/openSUSE/Fedora the `mono-locale-extras` package is also required.
2. Install libcurl:
* Debian/Ubunutu: `apt-get install libcurl4-openssl-dev`
* Debian/Ubuntu: `apt-get install libcurl4-openssl-dev`
* Redhat/Fedora: `yum install libcurl-devel`
* For other distros see the [Curl docs](http://curl.haxx.se/dlwiz/?type=devel).
3. Download and extract the latest `Jackett.Binaries.Mono.tar.gz` release from the [releases page](https://github.com/Jackett/Jackett/releases) and run Jackett using mono with the command `mono --debug JackettConsole.exe`.
4. (Optional) To install Jackett as a service, open the Terminal and run `sudo ./install_service_systemd_mono.sh` You need root permissions to install the service. The service will start on each logon. You can always stop it by running `systemctl stop jackett.service` from Terminal. You can start it again it using `systemctl start jackett.service`. Logs are stored as usual under `~/.config/Jackett/log.txt` and also in `journalctl -u jackett.service`.
If you want to run it with a user without a /home directory you need to add `Environment=XDG_CONFIG_HOME=/path/to/folder` to your systemd file, this folder will be used to store your config files.
If you want to run it with a user without a /home directory you need to add `Environment=XDG_CONFIG_HOME=/path/to/folder` to your systemd file, this folder will be used to store your config files.
Mono must be compiled with the Roslyn compiler (default), using MCS will cause "An error has occurred." errors (See https://github.com/Jackett/Jackett/issues/2704).
@@ -521,7 +575,7 @@ On an Ubuntu 16 system: [chrisjohnson00.jackett](https://galaxy.ansible.com/chri
## Installation on macOS
### Prerequisites
macOS 10.12 or greater
macOS 10.13 or greater
### Install as service
1. Download and extract the latest `Jackett.Binaries.macOS.tar.gz` release from the [releases page](https://github.com/Jackett/Jackett/releases).
@@ -536,11 +590,11 @@ Download and extract the latest `Jackett.Binaries.macOS.tar.gz` release from the
## Installation using Docker
Detailed instructions are available at [LinuxServer.io Jackett Docker](https://hub.docker.com/r/linuxserver/jackett/). The Jackett Docker is highly recommended, especially if you are having Mono stability issues or having issues running Mono on your system eg. QNAP, Synology. Thanks to [LinuxServer.io](https://linuxserver.io)
Detailed instructions are available at [LinuxServer.io Jackett Docker](https://hub.docker.com/r/linuxserver/jackett/). The Jackett Docker is highly recommended, especially if you are having Mono stability issues or having issues running Mono on your system e.g. QNAP, Synology. Thanks to [LinuxServer.io](https://linuxserver.io)
## Installation on Synology
Jackett is available as beta package from [SynoCommunity](https://synocommunity.com/)
Jackett is available as a beta package from [SynoCommunity](https://synocommunity.com/)
## Running Jackett behind a reverse proxy
@@ -556,7 +610,7 @@ Example config for apache:
</Location>
```
Example config for nginx:
Example config for Nginx:
```
location /jackett {
proxy_pass http://127.0.0.1:9117;
@@ -568,91 +622,105 @@ location /jackett {
}
```
## Troubleshooting
* __Command line switches__
You can pass various options when running via the command line, see --help for details.
* __Error "An error occurred while sending the request: Error: TrustFailure (A call to SSPI failed, see inner exception.)"__
This is often caused by missing CA certificates.
Try reimporting the certificates in this case:
- On Linux (as user root): `wget -O - https://curl.haxx.se/ca/cacert.pem | cert-sync /dev/stdin`
- On macOS: `curl -sS https://curl.haxx.se/ca/cacert.pem | cert-sync --user /dev/stdin`
* __Enable enhanced logging__
You can get *enhanced* logging with the command line switches `-t -l` or by enabling `Enhanced logging` via the web interface (followed by clicking on the `Apply Server Settings` button).
Please post logs if you are unable to resolve your issue with these switches ensuring to remove your username/password/cookies.
The logfiles (log.txt/updater.txt) are stored in `%ProgramData%\Jackett` on Windows and `~/.config/Jackett/` on Linux/macOS.
## Configuring OMDb
This feature is used as a fallback (when using the aggregate Indexer) to get the movie/series title if only the IMDB ID is provided in the request.
To use it, please just request a free API key on [OMDb](http://www.omdbapi.com/apikey.aspx) (1,000 daily requests limit) and paste the key in Jackett
## Creating an issue
Please supply as much information about the problem you are experiencing as possible. Your issue has a much greater chance of being resolved if logs are supplied so that we can see what is going on. Creating an issue with '### isn't working' doesn't help anyone to fix the problem.
## Command line switches
## Contributing
You can pass various options when running via the command line:
Jackett's framework typically allows our team and volunteering developers to implement new trackers in a couple of hours
<details> <summary> Command Line Switches </summary>
Depending on logic complexity, there are two common ways new trackers are implemented:
- `-i, --Install` Install Jackett windows service (Must be admin)
- `-s, --Start` Start the Jacket Windows service (Must be admin)
- `-k, --Stop` Stop the Jacket Windows service (Must be admin)
- `-u, --Uninstall` Uninstall Jackett windows service (Must be admin).
1. simple [definitions](http://github.com/Jackett/Jackett/tree/master/src/Jackett.Common/Definitions) (.yml / YAML), and;
2. advanced (native) [indexers](http://github.com/Jackett/Jackett/tree/master/src/Jackett.Common/Indexers) (.cs / C#)
- `-r, --ReserveUrls` (Re)Register windows port reservations (Required for
listening on all interfaces).
Read more about the [simple definition format](https://github.com/Jackett/Jackett/wiki/Definition-format).
- `-l, --Logging` Log all requests/responses to Jackett
If you are a developer then it's recommended to download the free community version of [Visual Studio](http://visualstudio.com)
- `-t, --Tracing` Enable tracing
If you are not a developer and would like a (new) tracker supported then feel free to leave an [issue](https://github.com/Jackett/Jackett/issues) request.
- `-c, --UseClient` Override web client selection.
[automatic(Default)/httpclient/httpclient2]
All contributions are welcome just send a pull request.
- `-j, --ProxyConnection` use proxy - e.g. 127.0.0.1:8888
- `-x, --ListenPublic` Listen publicly
- `-z, --ListenPrivate` Only allow local access
- `-p, --Port` Web server port
- `-m, --MigrateSettings` Migrate settings manually (Must be an admin on Windows)
- `-n, --IgnoreSslErrors` [true/false] Ignores invalid SSL certificates
- `-d, --DataFolder` Specify the location of the data folder (Must be an admin on Windows)
- e.g. --DataFolder="D:\Your Data\Jackett\".
- Don't use this on Unix (mono) systems. On Unix just adjust the HOME directory of the user to the datadir or set the XDG_CONFIG_HOME environment variable.
- `--NoRestart` Don't restart after update
- `--PIDFile` Specify the location of PID file
- `--NoUpdates` Disable automatic updates
- `--help` Display this help screen.
- `--version` Display version information.
</details>
## Building from source
### Windows
* Install the .NET Core [SDK](https://www.microsoft.com/net/download/windows)
* Clone Jackett
* Open Powershell and from the `src` directory, run `dotnet restore`
* Open the Jackett solution in Visual Studio 2019 (version 16.3 or above)
* Right click on the Jackett solution and click 'Rebuild Solution' to restore nuget packages
* Select Jackett.Server as startup project
* In the drop down menu of the run button select "Jackett.Server" instead of "IIS Express"
* Open PowerShell and from the `src` directory, run `dotnet restore`
* Open the Jackett solution in Visual Studio 2019 (version 16.4 or above)
* Right-click on the Jackett solution and click 'Rebuild Solution' to restore NuGet packages
* Select Jackett.Server as the startup project
* In the drop-down menu of the run button select "Jackett.Server" instead of "IIS Express"
* Build/Start the project
### OSX
```bash
# manually install osx dotnet via:
# manually install osx dotnet via:
https://dotnet.microsoft.com/download?initial-os=macos
# then:
# then:
git clone https://github.com/Jackett/Jackett.git
cd Jackett/src
# dotnet core version
dotnet publish Jackett.Server -f netcoreapp3.0 --self-contained -r osx-x64 -c Debug # takes care of everything
./Jackett.Server/bin/Debug/netcoreapp3.0/osx-x64/jackett # run jackett
dotnet publish Jackett.Server -f netcoreapp3.1 --self-contained -r osx-x64 -c Debug # takes care of everything
./Jackett.Server/bin/Debug/netcoreapp3.1/osx-x64/jackett # run jackett
```
### Linux
```bash
sudo apt install mono-complete nuget msbuild dotnet-sdk-3.0 # install build tools (debian/ubuntu)
sudo apt install mono-complete nuget msbuild dotnet-sdk-3.1 # install build tools (Debian/ubuntu)
git clone https://github.com/Jackett/Jackett.git
cd Jackett/src
# dotnet core version
dotnet publish Jackett.Server -f netcoreapp3.0 --self-contained -r linux-x64 -c Debug # takes care of everything
./Jackett.Server/bin/Debug/netcoreapp3.0/linux-x64/jackett # run jackett
dotnet publish Jackett.Server -f netcoreapp3.1 --self-contained -r linux-x64 -c Debug # takes care of everything
./Jackett.Server/bin/Debug/netcoreapp3.1/linux-x64/jackett # run jackett
```
## Screenshots
![screenshot](https://i.imgur.com/0d1nl7g.png "screenshot")
![screenshot](https://raw.githubusercontent.com/Jackett/Jackett/master/.github/jackett-screenshot1.png)
![screenshot](https://raw.githubusercontent.com/Jackett/Jackett/master/.github/jackett-screenshot2.png)
![screenshot](https://raw.githubusercontent.com/Jackett/Jackett/master/.github/jackett-screenshot3.png)
[inviteneeded]: https://raw.githubusercontent.com/Jackett/Jackett/master/.github/label-inviteneeded.png

View File

@@ -1,46 +0,0 @@
version: 0.12.{build}
skip_tags: true
image:
- Ubuntu
- Visual Studio 2019
environment:
APPVEYOR_YML_DISABLE_PS_LINUX: true
configuration: Release
assembly_info:
patch: true
file: '**\AssemblyInfo.*'
assembly_version: '{version}'
assembly_file_version: '{version}'
assembly_informational_version: '{version}'
dotnet_csproj:
patch: true
file: '**\*.csproj'
version: '{version}'
package_version: '{version}'
assembly_version: '{version}'
file_version: '{version}'
informational_version: '{version}'
build_script:
- ps: .\build.ps1 --target=Windows-Appveyor
- sh: ./build.sh --target=Linux
test: off
before_deploy:
- ps: ${env:release_description} = ( Get-Content -LiteralPath BuildOutput/ReleaseNotes.txt -Encoding UTF8 ) -join "`n";
deploy:
- provider: GitHub
tag: v$(APPVEYOR_BUILD_VERSION)
description: $(release_description)
auth_token:
secure: hOg+16YTIbq4kO9u4D1YVOTbWDqgCX6mAQYMbnmBBSw2CiUsZh7OKbupoUb3FtWa
artifact: /^(?:(?![Ee]xperimental).)*$/
draft: true
force_update: true
on:
branch: master
notifications:
- provider: Webhook
url: https://skyhook.glitch.me/api/webhooks/346588605843767297/_VWi5abKliaWsBmQO7AX69tD28FhqSLjKyLBwkSwwT13uyWJQHx5TSWK_iAs-0RzmyvZ/appveyor
method: POST
on_build_success: true
on_build_failure: true
on_build_status_changed: true

369
azure-pipelines.yml Normal file
View File

@@ -0,0 +1,369 @@
name: $(majorVersion).$(minorVersion).$(patchVersion)
variables:
majorVersion: 0
minorVersion: 13
patchVersion: $[counter(variables['minorVersion'], 1)] #this will reset when we bump minor
jackettVersion: $(majorVersion).$(minorVersion).$(patchVersion)
buildConfiguration: Release
netCoreFramework: netcoreapp3.1
netCoreSdkVersion: 3.1.x
stages:
- stage: BuildJackett
displayName: Create Binaries
jobs:
- job: Build
workspace:
clean: all
strategy:
matrix:
Mono:
buildDescription: Mono
imageName: ubuntu-latest
framework: net461
runtime: linux-x64
archiveType: tar
artifactName: Jackett.Binaries.Mono.tar.gz
Windows:
buildDescription: Windows
imageName: windows-latest
framework: $(netCoreFramework)
runtime: win-x86
archiveType: zip
artifactName: Jackett.Binaries.Windows.zip
macOS:
buildDescription: macOS
imageName: macOS-latest
framework: $(netCoreFramework)
runtime: osx-x64
archiveType: tar
artifactName: Jackett.Binaries.macOS.tar.gz
LinuxAmdx64:
buildDescription: Linux AMD x64
imageName: ubuntu-latest
framework: $(netCoreFramework)
runtime: linux-x64
archiveType: tar
artifactName: Jackett.Binaries.LinuxAMDx64.tar.gz
LinuxARM32:
buildDescription: Linux ARM32
imageName: ubuntu-latest
framework: $(netCoreFramework)
runtime: linux-arm
archiveType: tar
artifactName: Jackett.Binaries.LinuxARM32.tar.gz
LinuxARM64:
buildDescription: Linux ARM64
imageName: ubuntu-latest
framework: $(netCoreFramework)
runtime: linux-arm64
archiveType: tar
artifactName: Jackett.Binaries.LinuxARM64.tar.gz
pool:
vmImage: $(imageName)
displayName: ${{ variables.buildDescription }}
steps:
- checkout: self
- task: UseDotNet@2
displayName: Install .NET Core SDK
inputs:
packageType: sdk
version: $(netCoreSdkVersion)
installationPath: $(Agent.ToolsDirectory)/dotnet
- task: DotNetCoreCLI@2
displayName: Build Jackett Server
inputs:
command: publish
projects: 'src/Jackett.Server/Jackett.Server.csproj'
publishWebProjects: false
zipAfterPublish: false
arguments: '--configuration $(buildConfiguration) --runtime $(runtime) --framework $(framework) --output $(Build.BinariesDirectory) /p:AssemblyVersion=$(jackettVersion) /p:FileVersion=$(jackettVersion) /p:InformationalVersion=$(jackettVersion) /p:Version=$(jackettVersion)'
- task: DotNetCoreCLI@2
displayName: Build Jackett Updater
inputs:
command: publish
projects: 'src/Jackett.Updater/Jackett.Updater.csproj'
publishWebProjects: false
zipAfterPublish: false
arguments: '--configuration $(buildConfiguration) --runtime $(runtime) --framework $(framework) --output $(Build.BinariesDirectory) /p:AssemblyVersion=$(jackettVersion) /p:FileVersion=$(jackettVersion) /p:InformationalVersion=$(jackettVersion) /p:Version=$(jackettVersion)'
- task: DotNetCoreCLI@2
displayName: Build Jackett Tray (Windows only)
condition: and(succeeded(), startsWith(variables['runtime'], 'win'))
inputs:
command: publish
projects: 'src/Jackett.Tray/Jackett.Tray.csproj'
publishWebProjects: false
zipAfterPublish: false
arguments: '--configuration $(buildConfiguration) --runtime $(runtime) --framework $(framework) --output $(Build.BinariesDirectory) /p:AssemblyVersion=$(jackettVersion) /p:FileVersion=$(jackettVersion) /p:InformationalVersion=$(jackettVersion) /p:Version=$(jackettVersion)'
- task: DotNetCoreCLI@2
displayName: Build Jackett Service (Windows only)
condition: and(succeeded(), startsWith(variables['runtime'], 'win'))
inputs:
command: publish
projects: 'src/Jackett.Service/Jackett.Service.csproj'
publishWebProjects: false
zipAfterPublish: false
arguments: '--configuration $(buildConfiguration) --runtime $(runtime) --framework $(framework) --output $(Build.BinariesDirectory) /p:AssemblyVersion=$(jackettVersion) /p:FileVersion=$(jackettVersion) /p:InformationalVersion=$(jackettVersion) /p:Version=$(jackettVersion)'
- task: CopyFiles@2
displayName: Copy Jackett Server
inputs:
SourceFolder: $(Build.BinariesDirectory)/Jackett.Server
contents: '**'
targetFolder: $(Build.BinariesDirectory)/Jackett
- task: CopyFiles@2
displayName: Copy Jackett Updater
inputs:
SourceFolder: $(Build.BinariesDirectory)/Jackett.Updater
contents: JackettUpdater*
targetFolder: $(Build.BinariesDirectory)/Jackett
- task: CopyFiles@2
displayName: Copy Jackett Tray (Windows only)
condition: and(succeeded(), startsWith(variables['runtime'], 'win'))
inputs:
SourceFolder: $(Build.BinariesDirectory)/Jackett.Tray
contents: |
System.Drawing.dll
System.Security.Cryptography.ProtectedData.dll
WindowsBase.dll
targetFolder: $(Build.BinariesDirectory)/Jackett
overWrite: true
- task: CopyFiles@2
displayName: Copy Jackett Tray Part 2 (Windows only)
condition: and(succeeded(), startsWith(variables['runtime'], 'win'))
inputs:
SourceFolder: $(Build.BinariesDirectory)/Jackett.Tray
contents: '*'
targetFolder: $(Build.BinariesDirectory)/Jackett
overWrite: false
- task: CopyFiles@2
displayName: Copy Jackett Service (Windows only)
condition: and(succeeded(), startsWith(variables['runtime'], 'win'))
inputs:
SourceFolder: $(Build.BinariesDirectory)/Jackett.Service
contents: JackettService*
targetFolder: $(Build.BinariesDirectory)/Jackett
- task: CopyFiles@2
displayName: Copy Mono Specific Scripts
condition: and(succeeded(), startsWith(variables['buildDescription'], 'Mono'))
inputs:
SourceFolder: $(Build.SourcesDirectory)
contents: |
install_service_systemd_mono.sh
Upstart.config
targetFolder: $(Build.BinariesDirectory)/Jackett
- task: CopyFiles@2
displayName: Copy macOS Specific Scripts
condition: and(succeeded(), startsWith(variables['buildDescription'], 'macOS'))
inputs:
SourceFolder: $(Build.SourcesDirectory)
contents: install_service_macos
targetFolder: $(Build.BinariesDirectory)/Jackett
- task: CopyFiles@2
displayName: Copy Linux Specific Scripts
condition: and(succeeded(), startsWith(variables['buildDescription'], 'Linux'))
inputs:
SourceFolder: $(Build.SourcesDirectory)
contents: |
install_service_systemd.sh
jackett_launcher.sh
targetFolder: $(Build.BinariesDirectory)/Jackett
#There is an issue with Mono 5.8 (fixed in Mono 5.12) where its expecting to use its own patched version of System.Net.Http.dll, instead of the version supplied in folder
#https://github.com/dotnet/corefx/issues/19914
#https://bugzilla.xamarin.com/show_bug.cgi?id=60315
#The workaround is to delete System.Net.Http.dll and patch the .exe.config file
#Mono on FreeBSD doesn't like the bundled System.Runtime.InteropServices.RuntimeInformation -> Delete it
#https://github.com/dotnet/corefx/issues/23989
#https://github.com/Jackett/Jackett/issues/3547
- task: PowerShell@2
displayName: Patch Mono Build (Mono only)
condition: and(succeeded(), startsWith(variables['buildDescription'], 'Mono'))
inputs:
workingDirectory: $(Build.BinariesDirectory)/Jackett
targetType: inline
script: |
$file = '$(Build.BinariesDirectory)/Jackett/JackettConsole.exe.config'
$xml = [xml] (Get-Content $file)
$newVersion = $xml.SelectSingleNode("configuration/runtime/*[name()='assemblyBinding']/*[name()='dependentAssembly']/*[name()='assemblyIdentity'][@name='System.Net.Http']/../*[name()='bindingRedirect']/@newVersion")
$newVersion.Value = '4.0.0.0'
$xml.Save($file)
Remove-Item '$(Build.BinariesDirectory)/Jackett/System.Net.Http.dll'
Remove-Item '$(Build.BinariesDirectory)/Jackett/System.Runtime.InteropServices.RuntimeInformation.dll'
- task: Bash@3
displayName: Set Folder and File Permissions (Mono, Linux and macOS)
condition: and(succeeded(), not(startsWith(variables['runtime'], 'win')))
inputs:
workingDirectory: $(Build.BinariesDirectory)/Jackett
targetType: inline
script: |
chmod 755 $(find "$(Build.BinariesDirectory)"/Jackett -type d)
chmod 644 $(find "$(Build.BinariesDirectory)"/Jackett -type f)
chmod 755 jackett
chmod 755 JackettUpdater
if [ -f install_service_systemd_mono.sh ]; then chmod 755 install_service_systemd_mono.sh; fi
if [ -f install_service_macos ]; then chmod 755 install_service_macos; fi
if [ -f install_service_systemd.sh ]; then chmod 755 install_service_systemd.sh; fi
if [ -f jackett_launcher.sh ]; then chmod 755 jackett_launcher.sh; fi
- task: ArchiveFiles@2
displayName: Compress Binaries
inputs:
rootFolderOrFile: $(Build.BinariesDirectory)/Jackett
includeRootFolder: true
archiveType: '$(archiveType)'
tarCompression: gz
archiveFile: '$(Build.ArtifactStagingDirectory)/$(artifactName)'
- task: CmdLine@2
displayName: Create Jackett Installer (Windows only)
condition: and(succeeded(), startsWith(variables['runtime'], 'win'))
inputs:
script: >
iscc.exe $(Build.SourcesDirectory)/Installer.iss
/O"$(Build.ArtifactStagingDirectory)"
/DMyFileForVersion=$(Build.BinariesDirectory)/Jackett/Jackett.Common.dll
/DMySourceFolder=$(Build.BinariesDirectory)/Jackett
/DMyOutputFilename=Jackett.Installer.Windows
- task: PublishBuildArtifacts@1
inputs:
pathtoPublish: '$(Build.ArtifactStagingDirectory)'
- task: DotNetCoreCLI@2
displayName: Unit Tests (Windows only)
condition: and(succeeded(), startsWith(variables['runtime'], 'win'))
inputs:
command: test
projects: '**/*.Test*/*.csproj'
arguments: '--configuration $(buildConfiguration) --framework $(framework)'
- task: DotNetCoreCLI@2
displayName: Unit Tests (Mono, Linux and macOS)
condition: and(succeeded(), not(startsWith(variables['runtime'], 'win')))
inputs:
command: test
projects: '**/*.Test*/*.csproj'
arguments: '--configuration $(buildConfiguration) --framework $(framework) --runtime $(runtime)'
- stage: Integration
displayName: Integration Tests
dependsOn: BuildJackett
jobs:
- job: Selenium
workspace:
clean: all
strategy:
matrix:
Mono:
buildDescription: Mono
imageName: ubuntu-latest
artifactName: Jackett.Binaries.Mono.tar.gz
Windows:
buildDescription: Windows
imageName: windows-latest
artifactName: Jackett.Binaries.Windows.zip
# Enable once ChromeDriver is deployed to macOS image https://github.com/actions/virtual-environments/issues/7
# macOS:
# buildDescription: macOS
# imageName: macOS-latest
# artifactName: Jackett.Binaries.macOS.tar.gz
LinuxAmdx64:
buildDescription: Linux AMD x64
imageName: ubuntu-latest
artifactName: Jackett.Binaries.LinuxAMDx64.tar.gz
pool:
vmImage: $(imageName)
displayName: ${{ variables.buildDescription }}
steps:
- checkout: self
- task: DownloadPipelineArtifact@2
displayName: Download artifacts for integration tests
inputs:
patterns: '**/Jackett*'
path: $(Build.ArtifactStagingDirectory)
- task: PowerShell@2
displayName: Install Jackett (Windows only)
condition: and(succeeded(), eq(variables['buildDescription'], 'Windows'))
inputs:
workingDirectory: $(Build.ArtifactStagingDirectory)/drop
targetType: inline
script: |
Start-Process ./Jackett.Installer.Windows.exe /silent -NoNewWindow -Wait
- task: Bash@3
displayName: Install Jackett (Mono, Linux and macOS)
condition: and(succeeded(), ne(variables['buildDescription'], 'Windows'))
inputs:
workingDirectory: $(Build.ArtifactStagingDirectory)/drop
targetType: inline
script: |
tar xzf "$(artifactName)"
cd Jackett
if [[ "$(artifactName)" == *"Mono"* ]]; then mono --version; fi
if [[ "$(artifactName)" == *"Mono"* ]]; then sudo ./install_service_systemd_mono.sh; fi
if [[ "$(artifactName)" == *"macOS"* ]]; then sudo ./install_service_macos; fi
if [[ "$(artifactName)" == *"LinuxAMDx64"* ]]; then sudo ./install_service_systemd.sh; fi
- task: UseDotNet@2
displayName: Install .NET Core SDK
inputs:
packageType: sdk
version: $(netCoreSdkVersion)
installationPath: $(Agent.ToolsDirectory)/dotnet
- task: DotNetCoreCLI@2
displayName: Run Integration Tests
inputs:
command: test
projects: '**/*IntegrationTest*/*.csproj'
- stage: PublishGithub
displayName: Publish to Github
dependsOn: Integration
condition: and(succeeded(), ne(variables['Build.Reason'], 'PullRequest'), eq(variables['Build.SourceBranch'], 'refs/heads/master'))
jobs:
- job: Publish
workspace:
clean: all
steps:
- checkout: self
- task: DownloadPipelineArtifact@2
displayName: Download Artifacts for Publish
inputs:
patterns: '**/Jackett*'
path: $(Build.ArtifactStagingDirectory)
- task: GitHubRelease@0
displayName: Create Github release
inputs:
gitHubConnection: github.com_jackett
repositoryName: '$(Build.Repository.Name)'
action: create
target: $(Build.SourceVersion)
tagSource: manual
tag: v$(Build.BuildNumber)
title: v$(Build.BuildNumber)
assets: $(Build.ArtifactStagingDirectory)/drop/*
assetUploadMode: replace
isDraft: true
addChangeLog: true
compareWith: lastNonDraftRelease

View File

@@ -1,522 +0,0 @@
#tool nuget:?package=NUnit.ConsoleRunner
#addin nuget:?package=Cake.Git
//////////////////////////////////////////////////////////////////////
// ARGUMENTS
//////////////////////////////////////////////////////////////////////
var target = Argument("target", "Default");
var configuration = Argument("configuration", "Debug");
//////////////////////////////////////////////////////////////////////
// PREPARATION
//////////////////////////////////////////////////////////////////////
// Define directories.
var workingDir = MakeAbsolute(Directory("./"));
string artifactsDirName = "Artifacts";
string testResultsDirName = "TestResults";
string netCoreFramework = "netcoreapp3.0";
string serverProjectPath = "./src/Jackett.Server/Jackett.Server.csproj";
string updaterProjectPath = "./src/Jackett.Updater/Jackett.Updater.csproj";
//////////////////////////////////////////////////////////////////////
// TASKS
//////////////////////////////////////////////////////////////////////
Task("Info")
.Does(() =>
{
Information(@"Jackett Cake build script starting...");
Information(@"Requires InnoSetup and C:\msys64 to be present for packaging (Pre-installed on AppVeyor) on Windows");
Information(@"Working directory is: " + workingDir);
if (IsRunningOnWindows())
{
Information("Platform is Windows");
}
else
{
Information("Platform is Linux, Windows builds will be skipped");
}
});
Task("Clean")
.IsDependentOn("Info")
.Does(() =>
{
CleanDirectories("./src/**/obj");
CleanDirectories("./src/**/bin");
CleanDirectories("./BuildOutput");
CleanDirectories("./" + artifactsDirName);
CleanDirectories("./" + testResultsDirName);
CreateDirectory("./" + artifactsDirName);
Information("Clean completed");
});
Task("Build-Full-Framework")
.IsDependentOn("Clean")
.Does(() =>
{
NuGetRestore("./src/Jackett.sln");
var buildSettings = new MSBuildSettings()
.SetConfiguration(configuration)
.UseToolVersion(MSBuildToolVersion.VS2019);
MSBuild("./src/Jackett.sln", buildSettings);
});
Task("Run-Unit-Tests")
.IsDependentOn("Build-Full-Framework")
.Does(() =>
{
CreateDirectory("./" + testResultsDirName);
var resultsFile = $"./{testResultsDirName}/JackettTestResult.xml";
NUnit3("./src/**/bin/" + configuration + "/**/*.Test.dll", new NUnit3Settings
{
Results = new[] { new NUnit3Result { FileName = resultsFile } }
});
if (AppVeyor.IsRunningOnAppVeyor && IsRunningOnWindows())
{
AppVeyor.UploadTestResults(resultsFile, AppVeyorTestResultsType.NUnit3);
}
});
Task("Package-Windows-Full-Framework")
.IsDependentOn("Run-Unit-Tests")
.Does(() =>
{
string buildOutputPath = "./BuildOutput/net461/win7-x86/Jackett";
DotNetCorePublish(serverProjectPath, "net461", "win7-x86", buildOutputPath);
CopyFiles("./src/Jackett.Service/bin/" + configuration + "/JackettService.*", buildOutputPath);
CopyFiles("./src/Jackett.Tray/bin/" + configuration + "/JackettTray.*", buildOutputPath);
CopyFiles("./src/Jackett.Updater/bin/" + configuration + "/net461" + "/JackettUpdater.*", buildOutputPath); //builds against multiple frameworks
Zip("./BuildOutput/net461/win7-x86", $"./{artifactsDirName}/Jackett.Binaries.Windows.zip");
//InnoSetup
string sourceFolder = MakeAbsolute(Directory(buildOutputPath)).ToString();
InnoSetupSettings settings = new InnoSetupSettings();
settings.OutputDirectory = workingDir + "/" + artifactsDirName;
//Can remove below line once Cake is updated for InnoSetup 6 - https://github.com/cake-build/cake/pull/2565
settings.ToolPath = @"C:\Program Files (x86)\Inno Setup 6\ISCC.exe";
settings.Defines = new Dictionary<string, string>
{
{ "MyFileForVersion", sourceFolder + "/Jackett.Common.dll" },
{ "MySourceFolder", sourceFolder },
{ "MyOutputFilename", "Jackett.Installer.Windows" },
};
InnoSetup("./Installer.iss", settings);
});
Task("Package-Mono-Full-Framework")
.IsDependentOn("Run-Unit-Tests")
.Does(() =>
{
string buildOutputPath = "./BuildOutput/net461/linux-x64/Jackett";
DotNetCorePublish(serverProjectPath, "net461", "linux-x64", buildOutputPath);
CopyFiles("./src/Jackett.Updater/bin/" + configuration + "/net461" + "/JackettUpdater.*", buildOutputPath); //builds against multiple frameworks
CopyFileToDirectory("./install_service_systemd_mono.sh", buildOutputPath);
CopyFileToDirectory("./Upstart.config", buildOutputPath);
//There is an issue with Mono 5.8 (fixed in Mono 5.12) where its expecting to use its own patched version of System.Net.Http.dll, instead of the version supplied in folder
//https://github.com/dotnet/corefx/issues/19914
//https://bugzilla.xamarin.com/show_bug.cgi?id=60315
//The workaround is to delete System.Net.Http.dll and patch the .exe.config file
DeleteFile(buildOutputPath + "/System.Net.Http.dll");
var configFile = File(buildOutputPath + "/JackettConsole.exe.config");
XmlPoke(configFile, "configuration/runtime/*[name()='assemblyBinding']/*[name()='dependentAssembly']/*[name()='assemblyIdentity'][@name='System.Net.Http']/../*[name()='bindingRedirect']/@newVersion", "4.0.0.0");
//Mono on FreeBSD doesn't like the bundled System.Runtime.InteropServices.RuntimeInformation
//https://github.com/dotnet/corefx/issues/23989
//https://github.com/Jackett/Jackett/issues/3547
DeleteFile(buildOutputPath + "/System.Runtime.InteropServices.RuntimeInformation.dll");
InstallMsysTar();
Gzip("./BuildOutput/net461/linux-x64", $"./{artifactsDirName}", "Jackett", "Jackett.Binaries.Mono.tar.gz");
});
Task("Package-DotNetCore-macOS")
.IsDependentOn("Clean")
.Does(() =>
{
string runtimeId = "osx-x64";
string buildOutputPath = $"./BuildOutput/{netCoreFramework}/{runtimeId}/Jackett";
string updaterOutputPath = buildOutputPath + "/Updater";
DotNetCorePublish(serverProjectPath, netCoreFramework, runtimeId, buildOutputPath);
DotNetCorePublish(updaterProjectPath, netCoreFramework, runtimeId, updaterOutputPath);
CopyFiles(updaterOutputPath + "/JackettUpdater*", buildOutputPath);
DeleteDirectory(updaterOutputPath, new DeleteDirectorySettings {Recursive = true, Force = true});
CopyFileToDirectory("./install_service_macos", buildOutputPath);
Gzip($"./BuildOutput/{netCoreFramework}/{runtimeId}", $"./{artifactsDirName}", "Jackett", "Jackett.Binaries.macOS.tar.gz");
});
Task("Package-DotNetCore-LinuxAMDx64")
.IsDependentOn("Clean")
.Does(() =>
{
string runtimeId = "linux-x64";
string buildOutputPath = $"./BuildOutput/{netCoreFramework}/{runtimeId}/Jackett";
string updaterOutputPath = buildOutputPath + "/Updater";
DotNetCorePublish(serverProjectPath, netCoreFramework, runtimeId, buildOutputPath);
DotNetCorePublish(updaterProjectPath, netCoreFramework, runtimeId, updaterOutputPath);
CopyFiles(updaterOutputPath + "/JackettUpdater*", buildOutputPath);
DeleteDirectory(updaterOutputPath, new DeleteDirectorySettings {Recursive = true, Force = true});
CopyFileToDirectory("./install_service_systemd.sh", buildOutputPath);
CopyFileToDirectory("./jackett_launcher.sh", buildOutputPath);
Gzip($"./BuildOutput/{netCoreFramework}/{runtimeId}", $"./{artifactsDirName}", "Jackett", "Jackett.Binaries.LinuxAMDx64.tar.gz");
});
Task("Package-DotNetCore-LinuxARM32")
.IsDependentOn("Clean")
.Does(() =>
{
string runtimeId = "linux-arm";
string buildOutputPath = $"./BuildOutput/{netCoreFramework}/{runtimeId}/Jackett";
string updaterOutputPath = buildOutputPath + "/Updater";
DotNetCorePublish(serverProjectPath, netCoreFramework, runtimeId, buildOutputPath);
DotNetCorePublish(updaterProjectPath, netCoreFramework, runtimeId, updaterOutputPath);
CopyFiles(updaterOutputPath + "/JackettUpdater*", buildOutputPath);
DeleteDirectory(updaterOutputPath, new DeleteDirectorySettings {Recursive = true, Force = true});
CopyFileToDirectory("./install_service_systemd.sh", buildOutputPath);
CopyFileToDirectory("./jackett_launcher.sh", buildOutputPath);
Gzip($"./BuildOutput/{netCoreFramework}/{runtimeId}", $"./{artifactsDirName}", "Jackett", "Jackett.Binaries.LinuxARM32.tar.gz");
});
Task("Package-DotNetCore-LinuxARM64")
.IsDependentOn("Clean")
.Does(() =>
{
string runtimeId = "linux-arm64";
string buildOutputPath = $"./BuildOutput/{netCoreFramework}/{runtimeId}/Jackett";
string updaterOutputPath = buildOutputPath + "/Updater";
DotNetCorePublish(serverProjectPath, netCoreFramework, runtimeId, buildOutputPath);
DotNetCorePublish(updaterProjectPath, netCoreFramework, runtimeId, updaterOutputPath);
CopyFiles(updaterOutputPath + "/JackettUpdater*", buildOutputPath);
DeleteDirectory(updaterOutputPath, new DeleteDirectorySettings {Recursive = true, Force = true});
CopyFileToDirectory("./install_service_systemd.sh", buildOutputPath);
CopyFileToDirectory("./jackett_launcher.sh", buildOutputPath);
Gzip($"./BuildOutput/{netCoreFramework}/{runtimeId}", $"./{artifactsDirName}", "Jackett", "Jackett.Binaries.LinuxARM64.tar.gz");
});
Task("Appveyor-Push-Artifacts")
.IsDependentOn("Clean")
.Does(() =>
{
if (AppVeyor.IsRunningOnAppVeyor)
{
foreach (var file in GetFiles(workingDir + $"/{artifactsDirName}/*"))
{
AppVeyor.UploadArtifact(file.FullPath);
}
}
else
{
Information(@"Skipping artifact push as not running in AppVeyor Windows Environment");
}
});
Task("Release-Notes")
.IsDependentOn("Clean")
.Does(() =>
{
string latestTag = GitDescribe(".", false, GitDescribeStrategy.Tags, 0);
Information($"Latest tag is: {latestTag}" + Environment.NewLine);
List<GitCommit> relevantCommits = new List<GitCommit>();
var commitCollection = GitLog("./", 50);
foreach(GitCommit commit in commitCollection)
{
var commitTag = GitDescribe(".", commit.Sha, false, GitDescribeStrategy.Tags, 0);
if (commitTag == latestTag)
{
relevantCommits.Add(commit);
}
else
{
break;
}
}
relevantCommits = relevantCommits.AsEnumerable().Reverse().Skip(1).ToList();
if (relevantCommits.Count() > 0)
{
List<string> notesList = new List<string>();
foreach(GitCommit commit in relevantCommits)
{
notesList.Add($"{commit.MessageShort} (Thank you @{commit.Author.Name})");
}
string buildNote = String.Join(Environment.NewLine, notesList);
Information(buildNote);
System.IO.File.WriteAllLines(workingDir + "/BuildOutput/ReleaseNotes.txt", notesList.ToArray());
}
else
{
Information($"No commit messages found to create release notes");
}
});
Task("Windows-Environment-Dev")
.IsDependentOn("Package-Windows-Full-Framework")
.IsDependentOn("Package-Mono-Full-Framework")
.IsDependentOn("Package-DotNetCore-macOS")
.IsDependentOn("Package-DotNetCore-LinuxAMDx64")
.IsDependentOn("Package-DotNetCore-LinuxARM32")
.IsDependentOn("Package-DotNetCore-LinuxARM64")
.IsDependentOn("Appveyor-Push-Artifacts")
.IsDependentOn("Release-Notes")
.Does(() =>
{
Information("Windows-Environment Task Completed");
});
Task("Windows-Environment-Appveyor")
.IsDependentOn("Package-Windows-Full-Framework")
.IsDependentOn("Package-Mono-Full-Framework")
.IsDependentOn("Appveyor-Push-Artifacts")
.IsDependentOn("Release-Notes")
.Does(() =>
{
Information("Windows-Environment Task Completed");
});
Task("Linux-Environment")
.IsDependentOn("Package-DotNetCore-macOS")
.IsDependentOn("Package-DotNetCore-LinuxAMDx64")
.IsDependentOn("Package-DotNetCore-LinuxARM32")
.IsDependentOn("Package-DotNetCore-LinuxARM64")
.IsDependentOn("Appveyor-Push-Artifacts")
.IsDependentOn("Release-Notes")
.Does(() =>
{
Information("Linux-Environment Task Completed");
});
private void RunMsysCommand(string utility, string utilityArguments)
{
var msysDir = @"C:\msys64\usr\bin\";
var utilityProcess = msysDir + utility + ".exe";
Information("MSYS2 Utility: " + utility);
Information("MSYS2 Directory: " + msysDir);
Information("Utility Location: " + utilityProcess);
Information("Utility Arguments: " + utilityArguments);
IEnumerable<string> redirectedStandardOutput;
IEnumerable<string> redirectedErrorOutput;
var exitCodeWithArgument =
StartProcess(
utilityProcess,
new ProcessSettings {
Arguments = utilityArguments,
WorkingDirectory = msysDir,
RedirectStandardOutput = true
},
out redirectedStandardOutput,
out redirectedErrorOutput
);
Information(utility + " output:" + Environment.NewLine + string.Join(Environment.NewLine, redirectedStandardOutput.ToArray()));
// Throw exception if anything was written to the standard error.
if (redirectedErrorOutput != null && redirectedErrorOutput.Any())
{
throw new Exception(
string.Format(
utility + " Errors ocurred: {0}",
string.Join(", ", redirectedErrorOutput)));
}
Information(utility + " Exit code: {0}", exitCodeWithArgument);
}
private string RelativeWinPathToFullPath(string relativePath)
{
return (workingDir + relativePath.TrimStart('.'));
}
private void RunLinuxCommand(string file, string arg)
{
var startInfo = new System.Diagnostics.ProcessStartInfo()
{
Arguments = arg,
FileName = file,
UseShellExecute = true
};
var process = System.Diagnostics.Process.Start(startInfo);
process.WaitForExit();
}
private void Gzip(string sourceFolder, string outputDirectory, string tarCdirectoryOption, string outputFileName)
{
var tarFileName = outputFileName.Remove(outputFileName.Length - 3, 3);
if (IsRunningOnWindows())
{
var fullSourcePath = RelativeWinPathToFullPath(sourceFolder);
var tarArguments = @"--force-local -cvf " + fullSourcePath + "/" + tarFileName + " -C " + fullSourcePath + $" {tarCdirectoryOption} --mode ='755'";
var gzipArguments = @"-k " + fullSourcePath + "/" + tarFileName;
RunMsysCommand("tar", tarArguments);
RunMsysCommand("gzip", gzipArguments);
MoveFile($"{sourceFolder}/{tarFileName}.gz", $"{outputDirectory}/{tarFileName}.gz");
}
else
{
RunLinuxCommand("find", MakeAbsolute(Directory(sourceFolder)) + @" -type d -exec chmod 755 {} \;");
RunLinuxCommand("find", MakeAbsolute(Directory(sourceFolder)) + @" -type f -exec chmod 644 {} \;");
RunLinuxCommand("chmod", $"755 {MakeAbsolute(Directory(sourceFolder))}/Jackett/jackett");
RunLinuxCommand("chmod", $"755 {MakeAbsolute(Directory(sourceFolder))}/Jackett/JackettUpdater");
string macOsServiceScript = MakeAbsolute(Directory(sourceFolder)) + "/Jackett/install_service_macos";
if (FileExists(macOsServiceScript))
{
RunLinuxCommand("chmod", $"755 {macOsServiceScript}");
}
string systemdMonoScript = MakeAbsolute(Directory(sourceFolder)) + "/Jackett/install_service_systemd_mono.sh";
if (FileExists(systemdMonoScript))
{
RunLinuxCommand("chmod", $"755 {systemdMonoScript}");
}
string systemdScript = MakeAbsolute(Directory(sourceFolder)) + "/Jackett/install_service_systemd.sh";
if (FileExists(systemdScript))
{
RunLinuxCommand("chmod", $"755 {systemdScript}");
}
string launcherScript = MakeAbsolute(Directory(sourceFolder)) + "/Jackett/jackett_launcher.sh";
if (FileExists(launcherScript))
{
RunLinuxCommand("chmod", $"755 {launcherScript}");
}
RunLinuxCommand("tar", $"-C {sourceFolder} -zcvf {outputDirectory}/{tarFileName}.gz {tarCdirectoryOption}");
}
}
private void InstallMsysTar()
{
//Gzip is included by default with MSYS2, but not tar. Use the package manager to install tar
var startInfo = new System.Diagnostics.ProcessStartInfo()
{
Arguments = "-S --noconfirm tar",
FileName = @"C:\msys64\usr\bin\pacman.exe",
UseShellExecute = false
};
var process = System.Diagnostics.Process.Start(startInfo);
process.WaitForExit();
if (FileExists(@"C:\msys64\usr\bin\tar.exe") && FileExists(@"C:\msys64\usr\bin\gzip.exe"))
{
Information("tar.exe and gzip.exe were found");
}
else
{
throw new Exception("tar.exe and gzip.exe were NOT found");
}
}
private void DotNetCorePublish(string projectPath, string framework, string runtime, string outputPath)
{
bool publishSingleFile = false;
if (publishSingleFile && framework != "net461")
{
var settings = new DotNetCorePublishSettings
{
Framework = framework,
Runtime = runtime,
OutputDirectory = outputPath,
ArgumentCustomization = args=>args.Append("/p:PublishSingleFile=true")
};
DotNetCorePublish(projectPath, settings);
}
else
{
var settings = new DotNetCorePublishSettings
{
Framework = framework,
Runtime = runtime,
OutputDirectory = outputPath
};
DotNetCorePublish(projectPath, settings);
}
}
//////////////////////////////////////////////////////////////////////
// TASK TARGETS
//////////////////////////////////////////////////////////////////////
Task("Default")
.IsDependentOn("Windows-Environment-Dev")
.Does(() =>
{
Information("Default Task Completed");
});
Task("Windows-Appveyor")
.IsDependentOn("Windows-Environment-Appveyor")
.Does(() =>
{
Information("Windows Appveyor Task Completed");
});
Task("Linux")
.IsDependentOn("Linux-Environment")
.Does(() =>
{
Information("Linux Task Completed");
});
//////////////////////////////////////////////////////////////////////
// EXECUTION
//////////////////////////////////////////////////////////////////////
RunTarget(target);

242
build.ps1
View File

@@ -1,242 +0,0 @@
##########################################################################
# This is the Cake bootstrapper script for PowerShell.
# This file was downloaded from https://github.com/cake-build/resources
# Feel free to change this file to fit your needs.
##########################################################################
<#
.SYNOPSIS
This is a Powershell script to bootstrap a Cake build.
.DESCRIPTION
This Powershell script will download NuGet if missing, restore NuGet tools (including Cake)
and execute your Cake build script with the parameters you provide.
.PARAMETER Script
The build script to execute.
.PARAMETER Target
The build script target to run.
.PARAMETER Configuration
The build configuration to use.
.PARAMETER Verbosity
Specifies the amount of information to be displayed.
.PARAMETER ShowDescription
Shows description about tasks.
.PARAMETER DryRun
Performs a dry run.
.PARAMETER SkipToolPackageRestore
Skips restoring of packages.
.PARAMETER ScriptArgs
Remaining arguments are added here.
.LINK
https://cakebuild.net
#>
[CmdletBinding()]
Param(
[string]$Script = "build.cake",
[string]$Target,
[string]$Configuration,
[ValidateSet("Quiet", "Minimal", "Normal", "Verbose", "Diagnostic")]
[string]$Verbosity,
[switch]$ShowDescription,
[Alias("WhatIf", "Noop")]
[switch]$DryRun,
[switch]$SkipToolPackageRestore,
[Parameter(Position=0,Mandatory=$false,ValueFromRemainingArguments=$true)]
[string[]]$ScriptArgs
)
# Attempt to set highest encryption available for SecurityProtocol.
# PowerShell will not set this by default (until maybe .NET 4.6.x). This
# will typically produce a message for PowerShell v2 (just an info
# message though)
try {
# Set TLS 1.2 (3072), then TLS 1.1 (768), then TLS 1.0 (192), finally SSL 3.0 (48)
# Use integers because the enumeration values for TLS 1.2 and TLS 1.1 won't
# exist in .NET 4.0, even though they are addressable if .NET 4.5+ is
# installed (.NET 4.5 is an in-place upgrade).
[System.Net.ServicePointManager]::SecurityProtocol = 3072 -bor 768 -bor 192 -bor 48
} catch {
Write-Output 'Unable to set PowerShell to use TLS 1.2 and TLS 1.1 due to old .NET Framework installed. If you see underlying connection closed or trust errors, you may need to upgrade to .NET Framework 4.5+ and PowerShell v3'
}
[Reflection.Assembly]::LoadWithPartialName("System.Security") | Out-Null
function MD5HashFile([string] $filePath)
{
if ([string]::IsNullOrEmpty($filePath) -or !(Test-Path $filePath -PathType Leaf))
{
return $null
}
[System.IO.Stream] $file = $null;
[System.Security.Cryptography.MD5] $md5 = $null;
try
{
$md5 = [System.Security.Cryptography.MD5]::Create()
$file = [System.IO.File]::OpenRead($filePath)
return [System.BitConverter]::ToString($md5.ComputeHash($file))
}
finally
{
if ($file -ne $null)
{
$file.Dispose()
}
}
}
function GetProxyEnabledWebClient
{
$wc = New-Object System.Net.WebClient
$proxy = [System.Net.WebRequest]::GetSystemWebProxy()
$proxy.Credentials = [System.Net.CredentialCache]::DefaultCredentials
$wc.Proxy = $proxy
return $wc
}
Write-Host "Preparing to run build script..."
if(!$PSScriptRoot){
$PSScriptRoot = Split-Path $MyInvocation.MyCommand.Path -Parent
}
$TOOLS_DIR = Join-Path $PSScriptRoot "tools"
$ADDINS_DIR = Join-Path $TOOLS_DIR "Addins"
$MODULES_DIR = Join-Path $TOOLS_DIR "Modules"
$NUGET_EXE = Join-Path $TOOLS_DIR "nuget.exe"
$CAKE_EXE = Join-Path $TOOLS_DIR "Cake/Cake.exe"
$NUGET_URL = "https://dist.nuget.org/win-x86-commandline/latest/nuget.exe"
$PACKAGES_CONFIG = Join-Path $TOOLS_DIR "packages.config"
$PACKAGES_CONFIG_MD5 = Join-Path $TOOLS_DIR "packages.config.md5sum"
$ADDINS_PACKAGES_CONFIG = Join-Path $ADDINS_DIR "packages.config"
$MODULES_PACKAGES_CONFIG = Join-Path $MODULES_DIR "packages.config"
# Make sure tools folder exists
if ((Test-Path $PSScriptRoot) -and !(Test-Path $TOOLS_DIR)) {
Write-Verbose -Message "Creating tools directory..."
New-Item -Path $TOOLS_DIR -Type directory | out-null
}
# Make sure that packages.config exist.
if (!(Test-Path $PACKAGES_CONFIG)) {
Write-Verbose -Message "Downloading packages.config..."
try {
$wc = GetProxyEnabledWebClient
$wc.DownloadFile("https://cakebuild.net/download/bootstrapper/packages", $PACKAGES_CONFIG)
} catch {
Throw "Could not download packages.config."
}
}
# Try find NuGet.exe in path if not exists
if (!(Test-Path $NUGET_EXE)) {
Write-Verbose -Message "Trying to find nuget.exe in PATH..."
$existingPaths = $Env:Path -Split ';' | Where-Object { (![string]::IsNullOrEmpty($_)) -and (Test-Path $_ -PathType Container) }
$NUGET_EXE_IN_PATH = Get-ChildItem -Path $existingPaths -Filter "nuget.exe" | Select -First 1
if ($NUGET_EXE_IN_PATH -ne $null -and (Test-Path $NUGET_EXE_IN_PATH.FullName)) {
Write-Verbose -Message "Found in PATH at $($NUGET_EXE_IN_PATH.FullName)."
$NUGET_EXE = $NUGET_EXE_IN_PATH.FullName
}
}
# Try download NuGet.exe if not exists
if (!(Test-Path $NUGET_EXE)) {
Write-Verbose -Message "Downloading NuGet.exe..."
try {
$wc = GetProxyEnabledWebClient
$wc.DownloadFile($NUGET_URL, $NUGET_EXE)
} catch {
Throw "Could not download NuGet.exe."
}
}
# Save nuget.exe path to environment to be available to child processed
$ENV:NUGET_EXE = $NUGET_EXE
# Restore tools from NuGet?
if(-Not $SkipToolPackageRestore.IsPresent) {
Push-Location
Set-Location $TOOLS_DIR
# Check for changes in packages.config and remove installed tools if true.
[string] $md5Hash = MD5HashFile($PACKAGES_CONFIG)
if((!(Test-Path $PACKAGES_CONFIG_MD5)) -Or
($md5Hash -ne (Get-Content $PACKAGES_CONFIG_MD5 ))) {
Write-Verbose -Message "Missing or changed package.config hash..."
Get-ChildItem -Exclude packages.config,nuget.exe,Cake.Bakery |
Remove-Item -Recurse
}
Write-Verbose -Message "Restoring tools from NuGet..."
$NuGetOutput = Invoke-Expression "&`"$NUGET_EXE`" install -ExcludeVersion -OutputDirectory `"$TOOLS_DIR`""
if ($LASTEXITCODE -ne 0) {
Throw "An error occurred while restoring NuGet tools."
}
else
{
$md5Hash | Out-File $PACKAGES_CONFIG_MD5 -Encoding "ASCII"
}
Write-Verbose -Message ($NuGetOutput | out-string)
Pop-Location
}
# Restore addins from NuGet
if (Test-Path $ADDINS_PACKAGES_CONFIG) {
Push-Location
Set-Location $ADDINS_DIR
Write-Verbose -Message "Restoring addins from NuGet..."
$NuGetOutput = Invoke-Expression "&`"$NUGET_EXE`" install -ExcludeVersion -OutputDirectory `"$ADDINS_DIR`""
if ($LASTEXITCODE -ne 0) {
Throw "An error occurred while restoring NuGet addins."
}
Write-Verbose -Message ($NuGetOutput | out-string)
Pop-Location
}
# Restore modules from NuGet
if (Test-Path $MODULES_PACKAGES_CONFIG) {
Push-Location
Set-Location $MODULES_DIR
Write-Verbose -Message "Restoring modules from NuGet..."
$NuGetOutput = Invoke-Expression "&`"$NUGET_EXE`" install -ExcludeVersion -OutputDirectory `"$MODULES_DIR`""
if ($LASTEXITCODE -ne 0) {
Throw "An error occurred while restoring NuGet modules."
}
Write-Verbose -Message ($NuGetOutput | out-string)
Pop-Location
}
# Make sure that Cake has been installed.
if (!(Test-Path $CAKE_EXE)) {
Throw "Could not find Cake.exe at $CAKE_EXE"
}
# Build Cake arguments
$cakeArguments = @("$Script");
if ($Target) { $cakeArguments += "-target=$Target" }
if ($Configuration) { $cakeArguments += "-configuration=$Configuration" }
if ($Verbosity) { $cakeArguments += "-verbosity=$Verbosity" }
if ($ShowDescription) { $cakeArguments += "-showdescription" }
if ($DryRun) { $cakeArguments += "-dryrun" }
$cakeArguments += $ScriptArgs
# Start Cake
Write-Host "Running build script..."
&$CAKE_EXE $cakeArguments
exit $LASTEXITCODE

117
build.sh
View File

@@ -1,117 +0,0 @@
#!/usr/bin/env bash
##########################################################################
# This is the Cake bootstrapper script for Linux and OS X.
# This file was downloaded from https://github.com/cake-build/resources
# Feel free to change this file to fit your needs.
##########################################################################
# Define directories.
SCRIPT_DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )
TOOLS_DIR=$SCRIPT_DIR/tools
ADDINS_DIR=$TOOLS_DIR/Addins
MODULES_DIR=$TOOLS_DIR/Modules
NUGET_EXE=$TOOLS_DIR/nuget.exe
CAKE_EXE=$TOOLS_DIR/Cake/Cake.exe
PACKAGES_CONFIG=$TOOLS_DIR/packages.config
PACKAGES_CONFIG_MD5=$TOOLS_DIR/packages.config.md5sum
ADDINS_PACKAGES_CONFIG=$ADDINS_DIR/packages.config
MODULES_PACKAGES_CONFIG=$MODULES_DIR/packages.config
# Define md5sum or md5 depending on Linux/OSX
MD5_EXE=
if [[ "$(uname -s)" == "Darwin" ]]; then
MD5_EXE="md5 -r"
else
MD5_EXE="md5sum"
fi
# Define default arguments.
SCRIPT="build.cake"
CAKE_ARGUMENTS=()
# Parse arguments.
for i in "$@"; do
case $1 in
-s|--script) SCRIPT="$2"; shift ;;
--) shift; CAKE_ARGUMENTS+=("$@"); break ;;
*) CAKE_ARGUMENTS+=("$1") ;;
esac
shift
done
# Make sure the tools folder exist.
if [ ! -d "$TOOLS_DIR" ]; then
mkdir "$TOOLS_DIR"
fi
# Make sure that packages.config exist.
if [ ! -f "$TOOLS_DIR/packages.config" ]; then
echo "Downloading packages.config..."
curl -Lsfo "$TOOLS_DIR/packages.config" https://cakebuild.net/download/bootstrapper/packages
if [ $? -ne 0 ]; then
echo "An error occurred while downloading packages.config."
exit 1
fi
fi
# Download NuGet if it does not exist.
if [ ! -f "$NUGET_EXE" ]; then
echo "Downloading NuGet..."
curl -Lsfo "$NUGET_EXE" https://dist.nuget.org/win-x86-commandline/latest/nuget.exe
if [ $? -ne 0 ]; then
echo "An error occurred while downloading nuget.exe."
exit 1
fi
fi
# Restore tools from NuGet.
pushd "$TOOLS_DIR" >/dev/null
if [ ! -f "$PACKAGES_CONFIG_MD5" ] || [ "$( cat "$PACKAGES_CONFIG_MD5" | sed 's/\r$//' )" != "$( $MD5_EXE "$PACKAGES_CONFIG" | awk '{ print $1 }' )" ]; then
find . -type d ! -name . ! -name 'Cake.Bakery' | xargs rm -rf
fi
mono "$NUGET_EXE" install -ExcludeVersion
if [ $? -ne 0 ]; then
echo "Could not restore NuGet tools."
exit 1
fi
$MD5_EXE "$PACKAGES_CONFIG" | awk '{ print $1 }' >| "$PACKAGES_CONFIG_MD5"
popd >/dev/null
# Restore addins from NuGet.
if [ -f "$ADDINS_PACKAGES_CONFIG" ]; then
pushd "$ADDINS_DIR" >/dev/null
mono "$NUGET_EXE" install -ExcludeVersion
if [ $? -ne 0 ]; then
echo "Could not restore NuGet addins."
exit 1
fi
popd >/dev/null
fi
# Restore modules from NuGet.
if [ -f "$MODULES_PACKAGES_CONFIG" ]; then
pushd "$MODULES_DIR" >/dev/null
mono "$NUGET_EXE" install -ExcludeVersion
if [ $? -ne 0 ]; then
echo "Could not restore NuGet modules."
exit 1
fi
popd >/dev/null
fi
# Make sure that Cake has been installed.
if [ ! -f "$CAKE_EXE" ]; then
echo "Could not find Cake.exe at '$CAKE_EXE'."
exit 1
fi
# Start Cake
exec mono "$CAKE_EXE" $SCRIPT "${CAKE_ARGUMENTS[@]}"

View File

@@ -25,8 +25,8 @@ namespace DateTimeRoutines
/// <returns>seconds</returns>
public static uint GetSecondsSinceUnixEpoch(this DateTime date_time)
{
TimeSpan t = date_time - new DateTime(1970, 1, 1);
int ss = (int)t.TotalSeconds;
var t = date_time - new DateTime(1970, 1, 1);
var ss = (int)t.TotalSeconds;
if (ss < 0)
return 0;
return (uint)ss;
@@ -44,39 +44,39 @@ namespace DateTimeRoutines
/// <summary>
/// Index of first char of a date substring found in the string
/// </summary>
readonly public int IndexOfDate = -1;
public readonly int IndexOfDate = -1;
/// <summary>
/// Length a date substring found in the string
/// </summary>
readonly public int LengthOfDate = -1;
public readonly int LengthOfDate = -1;
/// <summary>
/// Index of first char of a time substring found in the string
/// </summary>
readonly public int IndexOfTime = -1;
public readonly int IndexOfTime = -1;
/// <summary>
/// Length of a time substring found in the string
/// </summary>
readonly public int LengthOfTime = -1;
public readonly int LengthOfTime = -1;
/// <summary>
/// DateTime found in the string
/// </summary>
readonly public DateTime DateTime;
public readonly DateTime DateTime;
/// <summary>
/// True if a date was found within the string
/// </summary>
readonly public bool IsDateFound;
public readonly bool IsDateFound;
/// <summary>
/// True if a time was found within the string
/// </summary>
readonly public bool IsTimeFound;
public readonly bool IsTimeFound;
/// <summary>
/// UTC offset if it was found within the string
/// </summary>
readonly public TimeSpan UtcOffset;
public readonly TimeSpan UtcOffset;
/// <summary>
/// True if UTC offset was found in the string
/// </summary>
readonly public bool IsUtcOffsetFound;
public readonly bool IsUtcOffsetFound;
/// <summary>
/// Utc gotten from DateTime if IsUtcOffsetFound is True
/// </summary>
@@ -113,7 +113,7 @@ namespace DateTimeRoutines
{
if (index_of_date < 0)//to avoid negative date exception when date is undefined
{
TimeSpan ts = date_time.TimeOfDay + utc_offset;
var ts = date_time.TimeOfDay + utc_offset;
if (ts < new TimeSpan(0))
UtcDateTime = new DateTime(1, 1, 2) + ts;
else
@@ -146,7 +146,8 @@ namespace DateTimeRoutines
return _DefaultDate;
}
}
static DateTime _DefaultDate = DateTime.Now;
private static DateTime _DefaultDate = DateTime.Now;
/// <summary>
/// If true then DefaultDate property is ignored and DefaultDate is always DateTime.Now
@@ -183,10 +184,9 @@ namespace DateTimeRoutines
/// <param name="default_format">format to be used preferably in ambivalent instances</param>
/// <param name="date_time">parsed date-time output</param>
/// <returns>true if both date and time were found, else false</returns>
static public bool TryParseDateTime(this string str, DateTimeFormat default_format, out DateTime date_time)
public static bool TryParseDateTime(this string str, DateTimeFormat default_format, out DateTime date_time)
{
ParsedDateTime parsed_date_time;
if (!TryParseDateTime(str, default_format, out parsed_date_time))
if (!TryParseDateTime(str, default_format, out ParsedDateTime parsed_date_time))
{
date_time = new DateTime(1, 1, 1);
return false;
@@ -204,10 +204,9 @@ namespace DateTimeRoutines
/// <param name="default_format">format to be used preferably in ambivalent instances</param>
/// <param name="date_time">parsed date-time output</param>
/// <returns>true if date and/or time was found, else false</returns>
static public bool TryParseDateOrTime(this string str, DateTimeFormat default_format, out DateTime date_time)
public static bool TryParseDateOrTime(this string str, DateTimeFormat default_format, out DateTime date_time)
{
ParsedDateTime parsed_date_time;
if (!TryParseDateOrTime(str, default_format, out parsed_date_time))
if (!TryParseDateOrTime(str, default_format, out ParsedDateTime parsed_date_time))
{
date_time = new DateTime(1, 1, 1);
return false;
@@ -226,8 +225,7 @@ namespace DateTimeRoutines
/// <returns>true if time was found, else false</returns>
public static bool TryParseTime(this string str, DateTimeFormat default_format, out DateTime time)
{
ParsedDateTime parsed_time;
if (!TryParseTime(str, default_format, out parsed_time, null))
if (!TryParseTime(str, default_format, out var parsed_time, null))
{
time = new DateTime(1, 1, 1);
return false;
@@ -245,10 +243,9 @@ namespace DateTimeRoutines
/// <param name="default_format">format to be used preferably in ambivalent instances</param>
/// <param name="date">parsed date output</param>
/// <returns>true if date was found, else false</returns>
static public bool TryParseDate(this string str, DateTimeFormat default_format, out DateTime date)
public static bool TryParseDate(this string str, DateTimeFormat default_format, out DateTime date)
{
ParsedDateTime parsed_date;
if (!TryParseDate(str, default_format, out parsed_date))
if (!TryParseDate(str, default_format, out ParsedDateTime parsed_date))
{
date = new DateTime(1, 1, 1);
return false;
@@ -268,7 +265,7 @@ namespace DateTimeRoutines
/// <param name="default_format">format to be used preferably in ambivalent instances</param>
/// <param name="parsed_date_time">parsed date-time output</param>
/// <returns>true if both date and time were found, else false</returns>
static public bool TryParseDateTime(this string str, DateTimeFormat default_format, out ParsedDateTime parsed_date_time)
public static bool TryParseDateTime(this string str, DateTimeFormat default_format, out ParsedDateTime parsed_date_time)
{
if (DateTimeRoutines.TryParseDateOrTime(str, default_format, out parsed_date_time)
&& parsed_date_time.IsDateFound
@@ -288,7 +285,7 @@ namespace DateTimeRoutines
/// <param name="default_format">format to be used preferably in ambivalent instances</param>
/// <param name="parsed_time">parsed date-time output</param>
/// <returns>true if time was found, else false</returns>
static public bool TryParseTime(this string str, DateTimeFormat default_format, out ParsedDateTime parsed_time)
public static bool TryParseTime(this string str, DateTimeFormat default_format, out ParsedDateTime parsed_time)
{
return TryParseTime(str, default_format, out parsed_time, null);
}
@@ -302,30 +299,30 @@ namespace DateTimeRoutines
/// <param name="default_format">format to be used preferably in ambivalent instances</param>
/// <param name="parsed_date_time">parsed date-time output</param>
/// <returns>true if date or time was found, else false</returns>
static public bool TryParseDateOrTime(this string str, DateTimeFormat default_format, out ParsedDateTime parsed_date_time)
public static bool TryParseDateOrTime(this string str, DateTimeFormat default_format, out ParsedDateTime parsed_date_time)
{
parsed_date_time = null;
ParsedDateTime parsed_date;
ParsedDateTime parsed_time;
if (!TryParseDate(str, default_format, out parsed_date))
if (!TryParseDate(str, default_format, out
ParsedDateTime parsed_date))
{
if (!TryParseTime(str, default_format, out parsed_time, null))
return false;
DateTime date_time = new DateTime(DefaultDate.Year, DefaultDate.Month, DefaultDate.Day, parsed_time.DateTime.Hour, parsed_time.DateTime.Minute, parsed_time.DateTime.Second);
var date_time = new DateTime(DefaultDate.Year, DefaultDate.Month, DefaultDate.Day, parsed_time.DateTime.Hour, parsed_time.DateTime.Minute, parsed_time.DateTime.Second);
parsed_date_time = new ParsedDateTime(-1, -1, parsed_time.IndexOfTime, parsed_time.LengthOfTime, date_time, parsed_time.UtcOffset);
}
else
{
if (!TryParseTime(str, default_format, out parsed_time, parsed_date))
{
DateTime date_time = new DateTime(parsed_date.DateTime.Year, parsed_date.DateTime.Month, parsed_date.DateTime.Day, 0, 0, 0);
var date_time = new DateTime(parsed_date.DateTime.Year, parsed_date.DateTime.Month, parsed_date.DateTime.Day, 0, 0, 0);
parsed_date_time = new ParsedDateTime(parsed_date.IndexOfDate, parsed_date.LengthOfDate, -1, -1, date_time);
}
else
{
DateTime date_time = new DateTime(parsed_date.DateTime.Year, parsed_date.DateTime.Month, parsed_date.DateTime.Day, parsed_time.DateTime.Hour, parsed_time.DateTime.Minute, parsed_time.DateTime.Second);
var date_time = new DateTime(parsed_date.DateTime.Year, parsed_date.DateTime.Month, parsed_date.DateTime.Day, parsed_time.DateTime.Hour, parsed_time.DateTime.Minute, parsed_time.DateTime.Second);
parsed_date_time = new ParsedDateTime(parsed_date.IndexOfDate, parsed_date.LengthOfDate, parsed_time.IndexOfTime, parsed_time.LengthOfTime, date_time, parsed_time.UtcOffset);
}
}
@@ -351,7 +348,7 @@ namespace DateTimeRoutines
parsed_time = null;
string time_zone_r;
if(default_format == DateTimeFormat.USA_DATE)
if (default_format == DateTimeFormat.USA_DATE)
time_zone_r = @"(?:\s*(?'time_zone'UTC|GMT|CST|EST))?";
else
time_zone_r = @"(?:\s*(?'time_zone'UTC|GMT))?";
@@ -363,13 +360,13 @@ namespace DateTimeRoutines
m = Regex.Match(str.Substring(parsed_date.IndexOfDate + parsed_date.LengthOfDate), @"(?<=^\s*,?\s+|^\s*at\s*|^\s*[T\-]\s*)(?'hour'\d{2})\s*:\s*(?'minute'\d{2})\s*:\s*(?'second'\d{2})\s+(?'offset_sign'[\+\-])(?'offset_hh'\d{2}):?(?'offset_mm'\d{2})(?=$|[^\d\w])", RegexOptions.Compiled);
if (!m.Success)
//look for <date> [h]h:mm[:ss] [PM/AM] [UTC/GMT]
m = Regex.Match(str.Substring(parsed_date.IndexOfDate + parsed_date.LengthOfDate), @"(?<=^\s*,?\s+|^\s*at\s*|^\s*[T\-]\s*)(?'hour'\d{1,2})\s*:\s*(?'minute'\d{2})\s*(?::\s*(?'second'\d{2}))?(?:\s*(?'ampm'AM|am|PM|pm))?"+time_zone_r+@"(?=$|[^\d\w])", RegexOptions.Compiled);
m = Regex.Match(str.Substring(parsed_date.IndexOfDate + parsed_date.LengthOfDate), @"(?<=^\s*,?\s+|^\s*at\s*|^\s*[T\-]\s*)(?'hour'\d{1,2})\s*:\s*(?'minute'\d{2})\s*(?::\s*(?'second'\d{2}))?(?:\s*(?'ampm'AM|am|PM|pm))?" + time_zone_r + @"(?=$|[^\d\w])", RegexOptions.Compiled);
if (!m.Success)
//look for [h]h:mm:ss [PM/AM] [UTC/GMT] <date>
m = Regex.Match(str.Substring(0, parsed_date.IndexOfDate), @"(?<=^|[^\d])(?'hour'\d{1,2})\s*:\s*(?'minute'\d{2})\s*(?::\s*(?'second'\d{2}))?(?:\s*(?'ampm'AM|am|PM|pm))?"+time_zone_r+@"(?=$|[\s,]+)", RegexOptions.Compiled);
m = Regex.Match(str.Substring(0, parsed_date.IndexOfDate), @"(?<=^|[^\d])(?'hour'\d{1,2})\s*:\s*(?'minute'\d{2})\s*(?::\s*(?'second'\d{2}))?(?:\s*(?'ampm'AM|am|PM|pm))?" + time_zone_r + @"(?=$|[\s,]+)", RegexOptions.Compiled);
if (!m.Success)
//look for [h]h:mm:ss [PM/AM] [UTC/GMT] within <date>
m = Regex.Match(str.Substring(parsed_date.IndexOfDate, parsed_date.LengthOfDate), @"(?<=^|[^\d])(?'hour'\d{1,2})\s*:\s*(?'minute'\d{2})\s*(?::\s*(?'second'\d{2}))?(?:\s*(?'ampm'AM|am|PM|pm))?"+time_zone_r+@"(?=$|[\s,]+)", RegexOptions.Compiled);
m = Regex.Match(str.Substring(parsed_date.IndexOfDate, parsed_date.LengthOfDate), @"(?<=^|[^\d])(?'hour'\d{1,2})\s*:\s*(?'minute'\d{2})\s*(?::\s*(?'second'\d{2}))?(?:\s*(?'ampm'AM|am|PM|pm))?" + time_zone_r + @"(?=$|[\s,]+)", RegexOptions.Compiled);
}
else//look anywhere within string
{
@@ -377,7 +374,7 @@ namespace DateTimeRoutines
m = Regex.Match(str, @"(?<=^|\s+|\s*T\s*)(?'hour'\d{2})\s*:\s*(?'minute'\d{2})\s*:\s*(?'second'\d{2})\s+(?'offset_sign'[\+\-])(?'offset_hh'\d{2}):?(?'offset_mm'\d{2})?(?=$|[^\d\w])", RegexOptions.Compiled);
if (!m.Success)
//look for [h]h:mm[:ss] [PM/AM] [UTC/GMT]
m = Regex.Match(str, @"(?<=^|\s+|\s*T\s*)(?'hour'\d{1,2})\s*:\s*(?'minute'\d{2})\s*(?::\s*(?'second'\d{2}))?(?:\s*(?'ampm'AM|am|PM|pm))?"+time_zone_r+@"(?=$|[^\d\w])", RegexOptions.Compiled);
m = Regex.Match(str, @"(?<=^|\s+|\s*T\s*)(?'hour'\d{1,2})\s*:\s*(?'minute'\d{2})\s*(?::\s*(?'second'\d{2}))?(?:\s*(?'ampm'AM|am|PM|pm))?" + time_zone_r + @"(?=$|[^\d\w])", RegexOptions.Compiled);
}
if (!m.Success)
@@ -385,15 +382,15 @@ namespace DateTimeRoutines
//try
//{
int hour = int.Parse(m.Groups["hour"].Value);
var hour = int.Parse(m.Groups["hour"].Value);
if (hour < 0 || hour > 23)
return false;
int minute = int.Parse(m.Groups["minute"].Value);
var minute = int.Parse(m.Groups["minute"].Value);
if (minute < 0 || minute > 59)
return false;
int second = 0;
var second = 0;
if (!string.IsNullOrEmpty(m.Groups["second"].Value))
{
second = int.Parse(m.Groups["second"].Value);
@@ -406,15 +403,15 @@ namespace DateTimeRoutines
else if (string.Compare(m.Groups["ampm"].Value, "AM", true) == 0 && hour == 12)
hour -= 12;
DateTime date_time = new DateTime(1, 1, 1, hour, minute, second);
var date_time = new DateTime(1, 1, 1, hour, minute, second);
if (m.Groups["offset_hh"].Success)
{
int offset_hh = int.Parse(m.Groups["offset_hh"].Value);
int offset_mm = 0;
var offset_hh = int.Parse(m.Groups["offset_hh"].Value);
var offset_mm = 0;
if (m.Groups["offset_mm"].Success)
offset_mm = int.Parse(m.Groups["offset_mm"].Value);
TimeSpan utc_offset = new TimeSpan(offset_hh, offset_mm, 0);
var utc_offset = new TimeSpan(offset_hh, offset_mm, 0);
if (m.Groups["offset_sign"].Value == "-")
utc_offset = -utc_offset;
parsed_time = new ParsedDateTime(-1, -1, m.Index, m.Length, date_time, utc_offset);
@@ -428,7 +425,7 @@ namespace DateTimeRoutines
{
case "UTC":
case "GMT":
utc_offset = new TimeSpan(0, 0, 0);
utc_offset = new TimeSpan(0, 0, 0);
break;
case "CST":
utc_offset = new TimeSpan(-6, 0, 0);
@@ -461,7 +458,7 @@ namespace DateTimeRoutines
/// <param name="default_format">format to be used preferably in ambivalent instances</param>
/// <param name="parsed_date">parsed date output</param>
/// <returns>true if date was found, else false</returns>
static public bool TryParseDate(this string str, DateTimeFormat default_format, out ParsedDateTime parsed_date)
public static bool TryParseDate(this string str, DateTimeFormat default_format, out ParsedDateTime parsed_date)
{
parsed_date = null;
@@ -469,7 +466,7 @@ namespace DateTimeRoutines
return false;
//look for dd/mm/yy
Match m = Regex.Match(str, @"(?<=^|[^\d])(?'day'\d{1,2})\s*(?'separator'[\\/\.])+\s*(?'month'\d{1,2})\s*\'separator'+\s*(?'year'\d{2}|\d{4})(?=$|[^\d])", RegexOptions.Compiled | RegexOptions.IgnoreCase);
var m = Regex.Match(str, @"(?<=^|[^\d])(?'day'\d{1,2})\s*(?'separator'[\\/\.])+\s*(?'month'\d{1,2})\s*\'separator'+\s*(?'year'\d{2}|\d{4})(?=$|[^\d])", RegexOptions.Compiled | RegexOptions.IgnoreCase);
if (m.Success)
{
DateTime date;
@@ -491,8 +488,7 @@ namespace DateTimeRoutines
m = Regex.Match(str, @"(?<=^|[^\d])(?'year'\d{2}|\d{4})\s*(?'separator'[\-])\s*(?'month'\d{1,2})\s*\'separator'+\s*(?'day'\d{1,2})(?=$|[^\d])", RegexOptions.Compiled | RegexOptions.IgnoreCase);
if (m.Success)
{
DateTime date;
if (!convert_to_date(int.Parse(m.Groups["year"].Value), int.Parse(m.Groups["month"].Value), int.Parse(m.Groups["day"].Value), out date))
if (!convert_to_date(int.Parse(m.Groups["year"].Value), int.Parse(m.Groups["month"].Value), int.Parse(m.Groups["day"].Value), out var date))
return false;
parsed_date = new ParsedDateTime(m.Index, m.Length, -1, -1, date);
return true;
@@ -514,9 +510,9 @@ namespace DateTimeRoutines
m = Regex.Match(str, @"(?:^|[^\d\w])(?'month'Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)[uarychilestmbro]*\s+(?'day'\d{1,2})(?:-?st|-?th|-?rd|-?nd)?(?:\s*,?\s*(?'year'\d{4}))?(?=$|[^\d\w])", RegexOptions.Compiled | RegexOptions.IgnoreCase);
if (m.Success)
{
int month = -1;
int index_of_date = m.Index;
int length_of_date = m.Length;
var month = -1;
var index_of_date = m.Index;
var length_of_date = m.Length;
switch (m.Groups["month"].Value)
{
@@ -575,8 +571,7 @@ namespace DateTimeRoutines
else
year = DefaultDate.Year;
DateTime date;
if (!convert_to_date(year, month, int.Parse(m.Groups["day"].Value), out date))
if (!convert_to_date(year, month, int.Parse(m.Groups["day"].Value), out var date))
return false;
parsed_date = new ParsedDateTime(index_of_date, length_of_date, -1, -1, date);
return true;
@@ -585,7 +580,7 @@ namespace DateTimeRoutines
return false;
}
static bool convert_to_date(int year, int month, int day, out DateTime date)
private static bool convert_to_date(int year, int month, int day, out DateTime date)
{
if (year >= 100)
{
@@ -597,9 +592,9 @@ namespace DateTimeRoutines
}
else
if (year > 30)
year += 1900;
else
year += 2000;
year += 1900;
else
year += 2000;
try
{
@@ -615,4 +610,4 @@ namespace DateTimeRoutines
#endregion
}
}
}

View File

@@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>netstandard2.0</TargetFrameworks>
<TargetFramework>netstandard2.0</TargetFramework>
</PropertyGroup>
</Project>

View File

@@ -7,10 +7,8 @@ body {
border-radius: 6px;
background-color: white;
max-width: 900px;
margin: 0 auto;
margin-top: 30px;
padding: 20px;
margin-bottom: 100px;
margin: 30px auto 100px;
}
.container-fluid {
@@ -22,7 +20,7 @@ body {
#indexers {
text-align: center;
margin-top: 30px;
margin-top: 20px;
}
.indexer-table {
@@ -57,6 +55,14 @@ body {
max-width: 255px;
}
.setup-item-inputcheckbox label {
padding: 0 1.5em;
}
.setup-item-inputcheckbox input {
height: 20px;
}
.setup-item-inputbool input {
max-width: 100px;
height: 20px;
@@ -116,7 +122,7 @@ hr {
}
.input-area {
margin: 4px 0px;
margin: 4px 0;
}
.input-area > * {
@@ -155,8 +161,7 @@ hr {
#footer {
color: #444444;
margin: 0 auto;
margin-top: 10px;
margin: 10px auto 0;
text-align: center;
}
@@ -170,7 +175,7 @@ hr {
}
.indexer-caps {
padding: 0px 15px 15px 15px;
padding: 0 15px 15px 15px;
border-top: 1px solid #e5e5e5;
}
@@ -178,6 +183,12 @@ hr {
border-bottom: 1px solid #ddd;
}
.jackettlog-narrowcol {
width: 1px;
white-space: nowrap;
vertical-align: top;
}
.jackettlogWarn {
background-color: #FFFF8E !important;
}
@@ -201,23 +212,57 @@ hr {
pre {
display: block;
padding: 3px;
margin: 0 0 0px;
margin: 0 0 0;
font-size: 13px;
line-height: 1.42857143;
color: #333;
word-break: break-all;
word-wrap: break-word;
background-color: transparent;
border: 0px;
border-radius: 0px;
border: 0;
border-radius: 0;
word-break: normal;
white-space: pre-wrap; /* Since CSS 2.1 */
white-space: -moz-pre-wrap; /* Mozilla, since 1999 */
white-space: -pre-wrap; /* Opera 4-6 */
white-space: -o-pre-wrap; /* Opera 7 */
word-wrap: break-word; /* Internet Explorer 5.5+ */
}
.modal-open .modal {
overflow-x: auto; /* Model can be bigger than the screen on mobiles */
}
.dataTables_length {
white-space: nowrap;
}
.dataTables_length select, .dataTables_filter input, .dataTable.compact tfoot td select {
display: inline-block;
height: 26px;
padding: 0 8px;
background-color: #fff;
border: 1px solid #ccc;
border-radius: 4px;
}
.dataTables_length select {
width: inherit;
}
.dataTables_filter input {
width: 400px
width: 400px;
}
.dataTable.compact tfoot td {
padding: 4px 0;
}
.dataTable.compact tfoot td select {
height: 26px;
padding: 0;
}
.dataTables_wrapper .dataTables_paginate .paginate_button {
padding: 3px 9px !important;
}
#unconfigured-indexers-template {
@@ -250,7 +295,7 @@ table td.fit{
.tooltip-inner img {
max-width: 250px;
height: auto;
height: auto;
}
.type-public {
@@ -272,7 +317,8 @@ table td.fit{
}
input#searchquery {
width:400px;
width: 400px;
display: inline-block;
}
#proxy-warning {

View File

@@ -32,7 +32,15 @@ $(document).ready(function () {
return opts.fn(this);
else
return opts.inverse(this);
});
});
Handlebars.registerHelper('if_in', function(elem, list, opts) {
if(list.indexOf(elem) > -1) {
return opts.fn(this);
}
return opts.inverse(this);
});
var index = window.location.pathname.indexOf("/UI");
var pathPrefix = window.location.pathname.substr(0, index);
@@ -43,7 +51,12 @@ $(document).ready(function () {
});
function openSearchIfNecessary() {
const hashArgs = location.hash.substring(1).split('&').reduce((prev, item) => Object.assign({ [item.split('=')[0]]: (item.split('=').length < 2 ? undefined : decodeURIComponent(item.split('=')[1])) }, prev), {});
const hashArgs = location.hash.substring(1).split('&').reduce((prev, item) =>
Object.assign({
[item.split('=')[0]]: (item.split('=').length < 2 ?
undefined :
decodeURIComponent(item.split('=')[1].replace(/\+/g,'%20')))
}, prev), {});
if ("search" in hashArgs) {
showSearch(hashArgs.tracker, hashArgs.search, hashArgs.category);
}
@@ -333,6 +346,7 @@ function copyToClipboard(text) {
var succeed;
try {
succeed = document.execCommand("copy");
doNotify("Copied to clipboard!", "success", "glyphicon glyphicon-ok");
} catch (e) {
succeed = false;
}
@@ -607,6 +621,11 @@ function getConfigModalJson(configForm) {
case "inputbool":
itemEntry.value = $el.find(".setup-item-inputbool input").is(":checked");
break;
case "inputcheckbox":
itemEntry.values = [];
$el.find(".setup-item-inputcheckbox input:checked").each(function () {
itemEntry.values.push($(this).val());
});
case "inputselect":
itemEntry.value = $el.find(".setup-item-inputselect select").val();
break;
@@ -761,7 +780,7 @@ function updateReleasesRow(row)
}
function showSearch(selectedIndexer, query, category) {
var selectedIndexers = []
var selectedIndexers = [];
if (selectedIndexer)
selectedIndexers = selectedIndexer.split(",");
$('#select-indexer-modal').remove();
@@ -828,7 +847,11 @@ function showSearch(selectedIndexer, query, category) {
Tracker: releaseDialog.find('#searchTracker').val()
};
window.location.hash = $.param({ search: queryObj.Query, tracker: queryObj.Tracker.join(","), category: queryObj.Category.join(",") });
window.location.hash = Object.entries({
search: encodeURIComponent(queryObj.Query).replace(/%20/g,'+'),
tracker: queryObj.Tracker.join(","),
category: queryObj.Category.join(",")
}).map(([k, v], i) => k + '=' + v).join('&');
$('#jackett-search-perform').html($('#spinner').html());
$('#searchResults div.dataTables_filter input').val("");
@@ -876,7 +899,7 @@ function showSearch(selectedIndexer, query, category) {
enableCaseInsensitiveFiltering: true,
nonSelectedText: 'All'
});
if (category !== undefined) {
searchCategory.val(category.split(","));
@@ -955,22 +978,22 @@ function updateSearchResultTable(element, results) {
"searchable": false,
"type": 'num'
},
{
"targets": 5,
"visible": true,
"searchable": false,
"iDataSort": 4
}
{
"targets": 5,
"visible": true,
"searchable": false,
"iDataSort": 4
}
],
fnPreDrawCallback: function () {
var table = this;
var deadfilterdiv = element.find(".dataTables_deadfilter");
var deadfiltercheckbox = deadfilterdiv.find("input");
if (!deadfiltercheckbox.length) {
deadfilterlabel = $('<label><input type="checkbox" id="jackett-search-results-datatable_deadfilter_checkbox" value="1">Show dead torrents</label>'
deadfilterlabel = $('<label><input type="checkbox" id="jackett-search-results-datatable_deadfilter_checkbox" value="1"> Show dead torrents</label>'
);
deadfilterdiv.append(deadfilterlabel);
deadfiltercheckbox = deadfilterlabel.find("input")
deadfiltercheckbox = deadfilterlabel.find("input");
deadfiltercheckbox.on("change", function () {
settings.deadfilter = this.checked;
table.api().draw();
@@ -1154,8 +1177,8 @@ function bindUIButtons() {
var jackett_port = Number($("#jackett-port").val());
var jackett_basepathoverride = $("#jackett-basepathoverride").val();
var jackett_external = $("#jackett-allowext").is(':checked');
var jackett_update = $("#jackett-allowupdate").is(':checked');
var jackett_prerelease = $("#jackett-prerelease").is(':checked');
var jackett_update = $("#jackett-allowupdate").is(':checked');
var jackett_prerelease = $("#jackett-prerelease").is(':checked');
var jackett_logging = $("#jackett-logging").is(':checked');
var jackett_omdb_key = $("#jackett-omdbkey").val();
var jackett_omdb_url = $("#jackett-omdburl").val();

View File

@@ -7,10 +7,8 @@ body {
border-radius: 6px;
background-color: white;
max-width: 900px;
margin: 0 auto;
margin-top: 30px;
padding: 20px;
margin-bottom: 30px;
margin: 30px auto;
}
.container-fluid {
@@ -22,7 +20,7 @@ body {
#indexers {
text-align: center;
margin-top: 30px;
margin-top: 20px;
}
.indexer-table {
@@ -116,7 +114,7 @@ hr {
}
.input-area {
margin: 4px 0px;
margin: 4px 0;
}
.input-area > * {
@@ -155,8 +153,7 @@ hr {
#footer {
color: #444444;
margin: 0 auto;
margin-top: 10px;
margin: 10px auto 0;
text-align: center;
}
@@ -170,7 +167,7 @@ hr {
}
.indexer-caps {
padding: 0px 15px 15px 15px;
padding: 0 15px 15px 15px;
border-top: 1px solid #e5e5e5;
}
@@ -178,6 +175,12 @@ hr {
border-bottom: 1px solid #ddd;
}
.jackettlog-narrowcol {
width: 1px;
white-space: nowrap;
vertical-align: top;
}
.jackettlogWarn {
background-color: #FFFF8E !important;
}
@@ -201,23 +204,57 @@ hr {
pre {
display: block;
padding: 3px;
margin: 0 0 0px;
margin: 0 0 0;
font-size: 13px;
line-height: 1.42857143;
color: #333;
word-break: break-all;
word-wrap: break-word;
background-color: transparent;
border: 0px;
border-radius: 0px;
border: 0;
border-radius: 0;
word-break: normal;
white-space: pre-wrap; /* Since CSS 2.1 */
white-space: -moz-pre-wrap; /* Mozilla, since 1999 */
white-space: -pre-wrap; /* Opera 4-6 */
white-space: -o-pre-wrap; /* Opera 7 */
word-wrap: break-word; /* Internet Explorer 5.5+ */
}
.modal-open .modal {
overflow-x: auto; /* Model can be bigger than the screen on mobiles */
}
.dataTables_length {
white-space: nowrap;
}
.dataTables_length select, .dataTables_filter input, .dataTable.compact tfoot td select {
display: inline-block;
height: 26px;
padding: 0 8px;
background-color: #fff;
border: 1px solid #ccc;
border-radius: 4px;
}
.dataTables_length select {
width: inherit;
}
.dataTables_filter input {
width: 75%
width: 75%;
}
.dataTable.compact tfoot td {
padding: 4px 0;
}
.dataTable.compact tfoot td select {
height: 26px;
padding: 0;
}
.dataTables_wrapper .dataTables_paginate .paginate_button {
padding: 3px 9px !important;
}
#unconfigured-indexers-template {
@@ -249,7 +286,7 @@ table td.fit{
.tooltip-inner img {
max-width: 250px;
height: auto;
height: auto;
}
.type-public {
@@ -282,7 +319,8 @@ div#jackett-releases-datatable_wrapper {
overflow-x: scroll;
}
input#searchquery {
width:50%;
width: 50%;
display: inline-block;
}
#proxy-warning {

View File

@@ -34,8 +34,8 @@
<link rel="stylesheet" type="text/css" href="../bootstrap/bootstrap.min.css?changed=2017083001">
<link rel="stylesheet" type="text/css" href="../animate.css?changed=2017083001">
<link rel="stylesheet" type="text/css" href="../custom.css?changed=20190401" media="only screen and (min-device-width: 480px)">
<link rel="stylesheet" type="text/css" href="../custom_mobile.css?changed=20190401" media="only screen and (max-device-width: 480px)">
<link rel="stylesheet" type="text/css" href="../custom.css?changed=20200223" media="only screen and (min-device-width: 480px)">
<link rel="stylesheet" type="text/css" href="../custom_mobile.css?changed=20200223" media="only screen and (max-device-width: 480px)">
<link rel="stylesheet" type="text/css" href="../css/jquery.dataTables.min.css?changed=2017083001">
<link rel="stylesheet" type="text/css" href="../css/bootstrap-multiselect.css?changed=2017083001" />
<link rel="stylesheet" type="text/css" href="../css/font-awesome.min.css?changed=2017083001">
@@ -52,11 +52,11 @@
</div>
<hr />
<div id="can-upgrade-from-mono" hidden class="alert alert-info" role="alert">
<div id="can-upgrade-from-mono" hidden class="alert alert-info" role="alert">
<strong>Standalone version of Jackett is now available - Mono not required</strong> <br>
To upgrade to the standalone version of Jackett, <a href="https://github.com/Jackett/Jackett#install-on-linux-amdx64" target="_blank" class="alert-link">click here</a> for install instructions.
Upgrading is straight forward, simply install the standalone version and your indexers/configuration will carry over.
Benefits include: increased performance, improved stability and no dependency on Mono.
To upgrade to the standalone version of Jackett, <a href="https://github.com/Jackett/Jackett#install-on-linux-amdx64" target="_blank" class="alert-link">click here</a> for install instructions.
Upgrading is straight forward, simply install the standalone version and your indexers/configuration will carry over.
Benefits include: increased performance, improved stability and no dependency on Mono.
</div>
<div class="pull-right">
@@ -235,6 +235,19 @@
{{/if}}
</div>
</script>
<script id="setup-item-inputcheckbox" type="text/x-handlebars-template">
<div class="setup-item-inputcheckbox">
{{#each options}}
<div class="checkbox"><label>
{{#if_in @key ../values}}
<input type="checkbox" data-id="{{../../id}}" class="form-control" value="{{@key}}" checked />
{{else}}
<input type="checkbox" data-id="{{../../id}}" class="form-control" value="{{@key}}" />
{{/if_in}}
{{this}}</label></div>
{{/each}}
</div>
</script>
<script id="setup-item-inputselect" type="text/x-handlebars-template">
<div class="setup-item-inputselect">
<select class="form-control" data-id="{{id}}">
@@ -471,7 +484,7 @@
<div class="modal-body">
<p>You can search all configured indexers from this screen.</p>
<label for="text">Query</label>
<input type="text" name="query" id="searchquery" />
<input class="form-control" type="text" name="query" id="searchquery" />
<label for="tracker">Tracker</label>
<select name="tracker" id="searchTracker" multiple="multiple">
{{#each indexers}}
@@ -603,16 +616,16 @@
<table class="dataTable compact cell-border hover stripe">
<thead>
<tr>
<th style="width: 200px">When</th>
<th style="width: 80px">Level</th>
<th>Date</th>
<th>Level</th>
<th>Message</th>
</tr>
</thead>
<tbody>
{{#each logs}}
<tr class="jackettlog{{Level}}">
<td>{{dateFormat When}}</td>
<td>{{Level}}</td>
<td class="jackettlog-narrowcol">{{dateFormat When}}</td>
<td class="jackettlog-narrowcol">{{Level}}</td>
<td><pre>{{Message}}</pre></td>
</tr>
{{/each}}
@@ -678,6 +691,6 @@
</script>
<script type="text/javascript" src="../libs/api.js?changed=2017083001"></script>
<script type="text/javascript" src="../custom.js?changed=20190427"></script>
<script type="text/javascript" src="../custom.js?changed=20200222"></script>
</body>
</html>

View File

@@ -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 });
});
});

View File

@@ -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>

View File

@@ -67,7 +67,6 @@
"desc": "desc"
"asc": "asc"
login:
path: takelogin.php
method: post
@@ -183,3 +182,4 @@
"*": 1
uploadvolumefactor:
text: 1
# engine n/a

View File

@@ -109,6 +109,7 @@
search: [q]
tv-search: [q, season, ep]
movie-search: [q]
music-search: [q, album, artist, label, year]
settings:
- name: downloadlink
@@ -139,24 +140,21 @@
download:
# the .torrent url is on the on the details page
selector: ul li a[href^="{{ .Config.downloadlink }}"]
filters:
- name: replace # temp fix for #5372
args: ["%E2%AD%90", ""]
attribute: href
search:
paths:
# present first page of movies and tv results if there are no search parms supplied
- path: "{{if .Keywords}}sort-search/{{ .Keywords}}/{{ .Config.sort }}/{{ .Config.type }}/1/{{else}}cat/Movies/{{ .Config.sort }}/{{ .Config.type }}/1/{{end}}"
- path: "{{if .Keywords}}{{else}}cat/TV/{{ .Config.sort }}/{{ .Config.type }}/1/{{end}}"
- path: "{{if .Keywords}}sort-search/{{ .Keywords}}/{{ .Config.sort }}/{{ .Config.type }}/2/{{else}}{{end}}"
- path: "{{if .Keywords}}sort-search/{{ .Keywords}}/{{ .Config.sort }}/{{ .Config.type }}/3/{{else}}{{end}}"
- path: "{{if .Keywords}}sort-search/{{ .Keywords}}/{{ .Config.sort }}/{{ .Config.type }}/4/{{else}}{{end}}"
- path: "{{if .Keywords}}sort-search/{{ .Keywords}}/{{ .Config.sort }}/{{ .Config.type }}/5/{{else}}{{end}}"
# present first page of movies tv and music results if there are no search parms supplied (20 hits per page)
- path: "{{if or (.Query.Album) (.Query.Artist) (.Keywords) }}sort-search{{else}}cat/Movies{{end}}{{if or (.Query.Album) (.Query.Artist) }}/{{ or (.Query.Album) (.Query.Artist) }}{{else}}/{{ .Keywords }}{{end}}{{if or (.Query.Album) (.Query.Artist) (.Keywords) }}/{{else}}{{end}}{{ .Config.sort }}/{{ .Config.type }}/1/"
- path: "{{if or (.Query.Album) (.Query.Artist) (.Keywords) }}sort-search{{else}}cat/TV{{end}}{{if or (.Query.Album) (.Query.Artist) }}/{{ or (.Query.Album) (.Query.Artist) }}{{else}}/{{ .Keywords }}{{end}}{{if or (.Query.Album) (.Query.Artist) (.Keywords) }}/{{else}}{{end}}{{ .Config.sort }}/{{ .Config.type }}/{{if or (.Query.Album) (.Query.Artist) (.Keywords) }}2{{else}}1{{end}}/"
- path: "{{if or (.Query.Album) (.Query.Artist) (.Keywords) }}sort-search{{else}}cat/Music{{end}}{{if or (.Query.Album) (.Query.Artist) }}/{{ or (.Query.Album) (.Query.Artist) }}{{else}}/{{ .Keywords }}{{end}}{{if or (.Query.Album) (.Query.Artist) (.Keywords) }}/{{else}}{{end}}{{ .Config.sort }}/{{ .Config.type }}/{{if or (.Query.Album) (.Query.Artist) (.Keywords) }}3{{else}}1{{end}}/"
keywordsfilters:
- name: replace # use this as a workaround till #893 is implemented
args: ["Greys Anatomy", "Grey's Anatomy"]
rows:
selector: tr:has(a[href^="/torrent/"])
fields:
title:
selector: td[class^="coll-1"] a[href^="/torrent/"]
@@ -230,3 +228,4 @@
text: 0
uploadvolumefactor:
text: 1
# engine n/a

View File

@@ -140,6 +140,7 @@
rows:
selector: table.ttable_headinner > tbody > tr[class^="t-row"]
fields:
category:
selector: a[href^="torrents.php?cat="]
@@ -179,3 +180,4 @@
uploadvolumefactor:
case:
"*": 1
# engine n/a

View File

@@ -33,6 +33,18 @@
modes:
search: [q]
settings:
- name: username
type: text
label: Username
- name: password
type: password
label: Password
- name: info
type: info
label: Results Per Page
default: For best results, change the <b>Torrents per page:</b> setting to <b>100</b> on your account profile.
login:
path: index.php?page=login&amp;returnto=index.php
method: form
@@ -53,14 +65,16 @@
paths:
- path: index.php
inputs:
$raw: "{{range .Categories}}filter_cat[{{.}}]=1&{{end}}"
search: "{{ .Query.Keywords }}"
$raw: "{{ range .Categories }}filter_cat[{{.}}]=1&{{end}}"
search: "{{ .Keywords }}"
page: torrents
category: 0
3dformat: 0
active: 1
rows:
selector: table[cellspacing!="1"].lista > tbody > tr:has(a[href^="index.php?page=torrents&category="])
fields:
category:
selector: a[href^="index.php?page=torrents&category="]
@@ -93,8 +107,9 @@
args: "02/01/2006"
downloadvolumefactor:
case:
img[title^="You get 50% off download count on this torrent"]: "0.5"
"*": "1"
img[title^="You get 50% off download count on this torrent"]: 0.5
"*": 1
uploadvolumefactor:
case:
"*": "1"
"*": 1
# xbtit

View File

@@ -87,6 +87,7 @@
selector: table.responsive-card-table tr:has(td[data-label])
filters:
- name: andmatch
fields:
category:
selector: td[data-label="Type"] a
@@ -149,4 +150,5 @@
"*": 1
uploadvolumefactor:
case:
"*": 1
"*": 1
# U-232 V5

View File

@@ -141,3 +141,4 @@
uploadvolumefactor:
case:
"*": 1
# Engine n/a

View File

@@ -0,0 +1,158 @@
---
site: 52pt
name: 52PT
description: "52PT is a CHINESE Private Torrent Tracker for HD MOVIES / TV"
language: zh-cn
type: private
encoding: UTF-8
links:
- https://52pt.site/
caps:
categorymappings:
- {id: 401, cat: Movies, desc: "Movies/电影"}
- {id: 404, cat: TV/Documentary, desc: "Documentaries/纪录片"}
- {id: 405, cat: TV/Anime, desc: "Animations/动漫"}
- {id: 402, cat: TV, desc: "TV Series/剧集"}
- {id: 403, cat: TV, desc: "TV Shows/综艺"}
- {id: 406, cat: Audio/Video, desc: "MusicVideo/音乐MV"}
- {id: 407, cat: TV/Sport, desc: "Sports/运体"}
- {id: 409, cat: Other, desc: "Misc/其他"}
- {id: 410, cat: Other, desc: "Opera/戏曲 曲艺"}
- {id: 408, cat: Audio, desc: "HQ Audio/无损音乐"}
modes:
search: [q]
tv-search: [q, season, ep, imdbid]
movie-search: [q, imdbid]
settings:
- name: username
type: text
label: Username
- name: password
type: password
label: Password
- name: sort
type: select
label: Sort requested from site
default: "4"
options:
"4": "created"
"7": "seeders"
"5": "size"
"1": "title"
- name: type
type: select
label: Order requested from site
default: "desc"
options:
"desc": "desc"
"asc": "asc"
login:
path: login.php
method: form
form: form[action="takelogin.php"]
captcha:
type: image
selector: img[alt="CAPTCHA"]
input: imagestring
inputs:
username: "{{ .Config.username }}"
password: "{{ .Config.password }}"
error:
- selector: td.embedded:has(h2:contains("失败"))
- selector: td.embedded:has(h2:contains("登录失败"))
test:
path: index.php
selector: a[href*="logout.php"]
search:
paths:
- path: torrents.php
inputs:
$raw: "{{ range .Categories }}cat{{.}}=1&{{end}}"
search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{else}}{{ .Keywords }}{{end}}"
# 0 incldead 1 active 2 dead
incldead: 0
# 0 all 1 normal 2 free 3 2x 4 2xfree 5 50% 6 2x50% 7 30%
spstate: 0
# 0 title 1 descr 3 uploaded 4 imdburl
search_area: "{{ if .Query.IMDBID }}4{{else}}0{{end}}"
# 0 AND 1 OR 2 exact
search_mode: 0
sort: "{{ .Config.sort }}"
type: "{{ .Config.type }}"
rows:
selector: table.torrents > tbody > tr:has(table.torrentname)
fields:
title:
selector: a[href^="details.php?id="]
title:
optional: true
selector: a[title][href^="details.php?id="]
attribute: title
category:
selector: a[href^="?cat="]
attribute: href
filters:
- name: querystring
args: cat
details:
selector: a[href^="details.php?id="]
attribute: href
download:
selector: a[href^="download.php?id="]
attribute: href
imdb:
optional: true
selector: div.imdb_100 > a
attribute: href
date:
# time type: time elapsed (default)
selector: td:nth-child(4) > span[title]
attribute: title
optional: true
filters:
- name: append
args: " +08:00"
- name: dateparse
args: "2006-01-02 15:04:05 -07:00"
date:
# time added
selector: td:nth-child(4):not(:has(span))
optional: true
filters:
- name: append
args: " +08:00"
- name: dateparse
args: "2006-01-0215:04:05 -07:00"
size:
selector: td:nth-child(5)
seeders:
selector: td:nth-child(6)
leechers:
selector: td:nth-child(7)
grabs:
selector: td:nth-child(8)
downloadvolumefactor:
case:
img.pro_free: 0
img.pro_free2up: 0
img.pro_50pctdown: 0.5
img.pro_50pctdown2up: 0.5
img.pro_30pctdown: 0.3
"*": 1
uploadvolumefactor:
case:
img.pro_50pctdown2up: 2
img.pro_free2up: 2
img.pro_2up: 2
"*": 1
description:
selector: td:nth-child(2)
remove: a, img
# NexusPHP Standard v1.5 Beta 4

View File

@@ -0,0 +1,77 @@
---
site: 7torrents
name: 7torrents
description: "7torrents is a Public BitTorrent DHT search engine."
language: en-us
type: public
encoding: UTF-8
links:
- https://www.7torrents.cc/
caps:
categories:
1: Other
modes:
search: [q]
tv-search: [q, season, ep]
movie-search: [q]
settings:
- name: info
type: info
default: 7torrents does not use categories. In your software Indexer settings, set the category to 100001.
- name: sort
type: select
label: Sort requested from site
default: "created"
options:
"created": "created"
"length": "size"
"seeders": "seeders"
search:
# https://www.7torrents.cc/search?query=2020&sort=created
paths:
- path: search
inputs:
query: "{{ if .Keywords }}{{ .Keywords }}{{else}}2020{{end}}"
sort: "{{ .Config.sort }}"
rows:
selector: div.media
fields:
category:
text: 1
title:
selector: div.media
attribute: data-name
details:
selector: div.media h5 a
attribute: href
download:
selector: div.media-right a[href*="/torrent/"]
attribute: href
magnet:
selector: a[href^="magnet:?xt="]
attribute: href
date:
selector: div.media
attribute: data-added
filters:
- name: timeago
size:
selector: div.media
attribute: data-size
seeders:
selector: div.media
attribute: data-seeders
leechers:
selector: div.media
attribute: data-leechers
downloadvolumefactor:
text: 0
uploadvolumefactor:
text: 1
# engine n/a

View File

@@ -150,6 +150,7 @@
rows:
selector: table.tableinborder > tbody > tr:has(a[href^="details.php"])
fields:
title:
selector: a[href^="details.php"]
@@ -225,3 +226,4 @@
case:
img[alt="2xU"]: 2
"*": 1
# engine n/a

View File

@@ -8,13 +8,15 @@
encoding: UTF-8
links:
- https://acg.rip/
certificates:
- bfd88de41aeeda5c9d98d5e081e8c4ec40204b6b # expired 4 jan 20
caps:
categories:
1: TV
modes:
tv-search: [q, season, ep]
search: [q]
tv-search: [q, season, ep]
settings: []
@@ -22,9 +24,11 @@
paths:
- path: /
inputs:
term: "{{ .Query.Keywords }}"
term: "{{ .Keywords }}"
rows:
selector: tbody tr
fields:
title:
selector: td.title > span.title a
@@ -50,6 +54,7 @@
filters:
- name: fuzzytime
downloadvolumefactor:
text: "0"
text: 0
uploadvolumefactor:
text: "1"
text: 1
# engine n/a

View File

@@ -38,14 +38,17 @@
download:
selector: a[href^="magnet:?xt="]
attribute: href
search:
paths:
# https://www.acgsou.com/1.html
# https://www.acgsou.com/search.php?keyword=test
- path: "{{ if .Keywords }}search.php?keyword={{ .Keywords }}{{else}}1.html{{end}}"
rows:
selector: table tbody tr[class^="alt"]:has(td:nth-child(3) a)
fields:
date:
selector: td:nth-child(1):contains("昨天")
@@ -86,6 +89,7 @@
leechers:
text: 1
downloadvolumefactor:
text: "0"
text: 0
uploadvolumefactor:
text: "1"
text: 1
# BTMaster 2.1.1

View File

@@ -102,7 +102,7 @@
paths:
- path: browse.php
inputs:
$raw: "{{range .Categories}}c{{.}}=1&{{end}}"
$raw: "{{ range .Categories }}c{{.}}=1&{{end}}"
search: "{{ .Keywords }}"
incldead: 1
sort: "{{ .Config.sort }}"
@@ -164,9 +164,10 @@
args: "2006-01-02 15:04:05"
downloadvolumefactor:
case:
span.icon_gift: "0"
"*": "1"
span.icon_gift: 0
"*": 1
uploadvolumefactor:
case:
span.icon_upload: "2"
"*": "1"
span.icon_upload: 2
"*": 1
# XBT v3

View File

@@ -97,6 +97,7 @@
rows:
selector: tr.trclass:not(:has(td.lista-cat-rec))
fields:
title:
selector: td a[href*="id="]
@@ -142,4 +143,4 @@
text: 0
uploadvolumefactor:
text: 1
# xbtit 2.3

View File

@@ -107,6 +107,7 @@
rows:
selector: tr[id^="tor_"]
fields:
title:
selector: td a.tLink
@@ -147,9 +148,10 @@
selector: td:nth-child(6) span:nth-last-child(1)
downloadvolumefactor:
case:
img[src="./styles/images/tor_gold.gif"]: "0"
img[src="./styles/images/tor_silver.gif"]: "0.5"
"*": "1"
img[src="./styles/images/tor_gold.gif"]: 0
img[src="./styles/images/tor_silver.gif"]: 0.5
"*": 1
uploadvolumefactor:
case:
"*": "1"
"*": 1
# engine n/a

View File

@@ -1,107 +0,0 @@
---
site: anidex
name: Anidex
description: "Anidex is a Public torrent tracker and indexer, primarily for English fansub groups of anime"
language: en-us
encoding: UTF-8
type: public
links:
- https://anidex.info/
caps:
categorymappings:
- {id: 1, cat: TV/Anime, desc: "Anime - Sub"}
- {id: 2, cat: TV/Anime, desc: "Anime - Raw"}
- {id: 3, cat: TV/Anime, desc: "Anime - Dub"}
- {id: 4, cat: TV/Anime, desc: "LA - Sub"}
- {id: 5, cat: TV/Anime, desc: "LA - Raw"}
- {id: 6, cat: TV/Anime, desc: "Light Novel"}
- {id: 7, cat: TV/Anime, desc: "Manga - TLed"}
- {id: 8, cat: TV/Anime, desc: "Manga - Raw"}
- {id: 9, cat: TV/Anime, desc: "♫ - Lossy"}
- {id: 10, cat: TV/Anime, desc: "♫ - Lossless"}
- {id: 11, cat: TV/Anime, desc: "♫ - Video"}
- {id: 12, cat: TV/Anime, desc: "Games"}
- {id: 13, cat: TV/Anime, desc: "Applications"}
- {id: 14, cat: TV/Anime, desc: "Pictures"}
- {id: 15, cat: TV/Anime, desc: "Adult Video"}
- {id: 16, cat: TV/Anime, desc: "Other"}
modes:
search: [q]
tv-search: [q, season, ep]
settings:
- name: lang-id
type: text
label: Language ID
- name: info
type: info
label: Language ID Note
default: "You can filter your searches using any of the following language ID (comma delimited):<br>19 :Arabic<br>22 :Bengali<br>14 :Bulgarian<br>21 :Chinese (Simplified)<br>24 :Czech<br>20 :Danish<br>5 :Dutch<br>1 :English<br>11 :Finnish<br>10 :French<br>8 :German<br>13 :Greek<br>9 :Hungarian<br>27 :Indonesian<br>6 :Italian<br>2 :Japanese<br>28 :Korean<br>31 :Malaysian<br>25 :Mongolian<br>30 :Persian<br>3 :Polish<br>16 :Portuguese (Brazil)<br>17 :Portuguese (Portugal)<br>23 :Romanian<br>7 :Russian<br>4 :Serbo-Croatian<br>29 :Spanish (LATAM)<br>15 :Spanish (Spain)<br>18 :Swedish<br>26 :Turkish<br>12 :Vietnamese"
- name: sort
type: select
label: Sort requested from site
default: "upload_timestamp"
options:
"upload_timestamp": "created"
"seeders": "seeders"
"size": "size"
"filename": "title"
- name: type
type: select
label: Order requested from site
default: "desc"
options:
"desc": "desc"
"asc": "asc"
search:
paths:
# https://anidex.info/?page=search&id=1,2,3&lang_id=5,1,10&group_id=0&q=rinshi
- path: "?page=search&id={{ if .Categories }}{{ range .Categories }},{{.}}{{end}}{{else}}0{{end}}{{ if .Config.lang-id }}&lang_id={{ .Config.lang-id }}{{else}}{{end}}&group_id=0&q={{ if .Keywords }}{{ .Keywords }}{{else}}{{end}}&s={{ .Config.sort }}&o={{ .Config.type }}"
rows:
selector: div.table-responsive > table > tbody > tr
fields:
category:
selector: a[href^="/?id="]
attribute: href
filters:
- name: querystring
args: id
title:
selector: td:nth-child(3) > a.torrent > span.span-1440
filters:
- name: re_replace # remove anidb id from return string
args: ["(\\[[A-Z0-9]*\\])\\.", "."]
details:
selector: td:nth-child(3) > a.torrent
attribute: href
download:
selector: td:nth-child(5) > a
attribute: href
magnet:
selector: a[href^="magnet:?"]
attribute: href
size:
selector: td:nth-child(7)
date:
selector: td:nth-child(8)
attribute: title
filters:
- name: replace
args: ["UTC", "+00:00"]
- name: dateparse
args: "2006-01-02 15:04:05 -07:00"
seeders:
selector: td:nth-child(9)
leechers:
selector: td:nth-child(10)
grabs:
selector: td:nth-child(11)
downloadvolumefactor:
text: 0
uploadvolumefactor:
text: 1

View File

@@ -36,8 +36,10 @@
search:
paths:
- path: "{{if .Keywords}}?s={{ .Keywords}}{{else}}{{end}}"
rows:
selector: table tbody tr:has(td.torrents_small_type_data1)
fields:
title:
selector: .torrents_small_info_data1 div
@@ -61,18 +63,19 @@
selector: .torrents_small_type_data1 img
attribute: src
case:
"[src=\"./styles/tracker/imageset/cat_raw_small.png\"]": "1"
"[src=\"./styles/tracker/imageset/cat_anime_small.png\"]": "2"
"[src=\"./styles/tracker/imageset/cat_hentai_small.png\"]": "3"
"[src=\"./styles/tracker/imageset/cat_drama_small.png\"]": "4"
"[src=\"./styles/tracker/imageset/cat_dvd_small.png\"]": "5"
"[src=\"./styles/tracker/imageset/cat_hgame2_small.png\"]": "6"
"[src=\"./styles/tracker/imageset/cat_manga_small.png\"]": "7"
"[src=\"./styles/tracker/imageset/cat_music_small.png\"]": "8"
"[src=\"./styles/tracker/imageset/cat_musicvid_small.png\"]": "9"
"[src=\"./styles/tracker/imageset/cat_noneng_small.png\"]": "10"
"[src=\"./styles/tracker/imageset/cat_other_small.png\"]": "11"
"[src=\"./styles/tracker/imageset/cat_raw_small.png\"]": 1
"[src=\"./styles/tracker/imageset/cat_anime_small.png\"]": 2
"[src=\"./styles/tracker/imageset/cat_hentai_small.png\"]": 3
"[src=\"./styles/tracker/imageset/cat_drama_small.png\"]": 4
"[src=\"./styles/tracker/imageset/cat_dvd_small.png\"]": 5
"[src=\"./styles/tracker/imageset/cat_hgame2_small.png\"]": 6
"[src=\"./styles/tracker/imageset/cat_manga_small.png\"]": 7
"[src=\"./styles/tracker/imageset/cat_music_small.png\"]": 8
"[src=\"./styles/tracker/imageset/cat_musicvid_small.png\"]": 9
"[src=\"./styles/tracker/imageset/cat_noneng_small.png\"]": 10
"[src=\"./styles/tracker/imageset/cat_other_small.png\"]": 11
downloadvolumefactor:
text: "0"
text: 0
uploadvolumefactor:
text: "1"
text: 1
# engine n/a

View File

@@ -69,6 +69,34 @@
tv-search: [q, season, ep, imdbid]
movie-search: [q, imdbid]
settings:
- name: username
type: text
label: Username
- name: password
type: password
label: Password
- name: sort
type: select
label: Sort requested from site
default: "3"
options:
"3": "created"
"5": "seeders"
"4": "size"
"2": "title"
- name: type
type: select
label: Order requested from site
default: "2"
options:
"2": "desc"
"1": "asc"
- name: info
type: info
label: Results Per Page
default: For best results, change the <b>Torrents per page:</b> setting to <b>100</b> on your account profile.
login:
path: index.php?page=login
method: post
@@ -91,12 +119,13 @@
download:
before:
path: thanks.php
method: "post"
method: post
inputs:
infohash: "{{ .DownloadUri.Query.id }}"
thanks: "1"
thanks: 1
rndval: "1487013827343"
selector: a[href^="download.php?id="]
attribute: href
search:
paths:
@@ -110,12 +139,16 @@
args: ["(?i)\\bS0*(\\d+)E0*(\\d+)\\b", "$1 $2"]
inputs:
search: "{{if .Query.IMDBID}}{{ .Query.IMDBIDShort }}{{else}}{{ .Keywords }}{{end}}"
page: "torrents"
category: "{{range .Categories}}{{.}};{{end}}"
page: torrents
category: "{{ range .Categories }}{{.}};{{end}}"
options: "{{ if .Query.IMDBID }}4{{else}}0{{end}}"
active: "0"
active: 0
order: "{{ .Config.sort }}"
by: "{{ .Config.type }}"
rows:
selector: table > tbody > tr > td > table.lista > tbody > tr:has(a[href^="index.php?page=torrent-details&id="])
fields:
download:
selector: a[href^="index.php?page=downloadcheck&id="]
@@ -172,19 +205,20 @@
selector: td:nth-last-child(7)
downloadvolumefactor:
case:
img[alt="Gold 100% Free"]: "0"
img[alt="Silver 50% Free"]: "0.5"
img[alt="Bronze 25% Free"]: "0.75"
"*": "1"
img[alt="Gold 100% Free"]: 0
img[alt="Silver 50% Free"]: 0.5
img[alt="Bronze 25% Free"]: 0.75
"*": 1
uploadvolumefactor:
case:
img[alt="2x Upload Multiplier"]: "2"
img[alt="3x Upload Multiplier"]: "3"
img[alt="4x Upload Multiplier"]: "4"
img[alt="5x Upload Multiplier"]: "5"
img[alt="6x Upload Multiplier"]: "6"
img[alt="7x Upload Multiplier"]: "7"
img[alt="8x Upload Multiplier"]: "8"
img[alt="9x Upload Multiplier"]: "9"
img[alt="10x Upload Multiplier"]: "10"
"*": "1"
img[alt="2x Upload Multiplier"]: 2
img[alt="3x Upload Multiplier"]: 3
img[alt="4x Upload Multiplier"]: 4
img[alt="5x Upload Multiplier"]: 5
img[alt="6x Upload Multiplier"]: 6
img[alt="7x Upload Multiplier"]: 7
img[alt="8x Upload Multiplier"]: 8
img[alt="9x Upload Multiplier"]: 9
img[alt="10x Upload Multiplier"]: 10
"*": 1
# xbtitFM v1.16

View File

@@ -102,6 +102,7 @@
download:
selector: a[href*="{{ .Config.downloadlink }}"]
attribute: href
search:
paths:
@@ -118,6 +119,7 @@
rows:
selector: tr:has(td.category)
fields:
title:
# use the second div for full title
@@ -177,3 +179,4 @@
text: 0
uploadvolumefactor:
text: 1
# engine n/a

View File

@@ -133,6 +133,7 @@
selector: table.table-striped > tbody > tr:has(a[href*="details.php?id="])
filters:
- name: andmatch
fields:
title:
selector: div.torrent-name
@@ -179,3 +180,4 @@
uploadvolumefactor:
case:
"*": 1
# Midgaard

View File

@@ -67,6 +67,7 @@
download:
selector: a[href*="/download/"]
attribute: href
search:
paths:
@@ -133,29 +134,35 @@
filters:
# translations for Turkish|Estonian|Danish|Italian|Polish|Norwegian|Portuguese|Czech|Russian|Romanian|Spanish|French|German|Bulgarian|Dutch|Chinese
- name: re_replace
args: ["(?i)(önce|tagasi|geleden|fa|temu|siden|atrás|nazpět|назад|acum|hace|il y a|vor|преди|前)", " ago"]
- name: re_replace
args: ["(?i)(dakika|minut|minuto|minuta|minutt|минута|Minute|minuut|分钟)", " minute"]
args: ["(?i)(önce|tagasi|geleden|fa|temu|siden|atrás|nazpět|назад|acum|în urmă|hace|il y a|vor|преди|前)", " ago"]
- name: re_replace
args: ["(?i)(minutit|minutter|minuti|minuty|minutos|минуты|минут|Minuten|минути|minuten)", "minutes"]
- name: re_replace
args: ["(?i)(saat|tund|time|ora|godzina|hora|hodina|час|oră|heure|Stunde|uur|小时)", " hour"]
args: ["(?i)(dakika|minut|minuto|minuta|minutt|минута|Minute|minuut|分钟)", " minute"]
- name: re_replace
args: ["(?i)(tundi|timer|ore|godziny|horas|hodiny|hoden|часа|часов|ore|heures|Stunden)", "hours"]
- name: re_replace
args: ["(?i)(gün|päev|dag|giorno|dzień|dia|den|день|zi|día|jour|Tag|ден|天)", " day"]
args: ["(?i)(saat|tund|time|ora|godzina|hora|hodina|час|oră|heure|Stunde|uur|小时)", " hour"]
- name: re_replace
args: ["(?i)(päeva|dage|giorni|dni|dias|dny|дня|дней|zile|días|jours|Tagen|дни|dagen)", "days"]
- name: re_replace
args: ["(?i)(hafta|nädal|uge|settimana|tydzień|uke|semana|týden|неделю|săptămână|semaine|Woche|седмица|周)", " week"]
args: ["(?i)(gün|päev|dag|giorno|dzień|dia|den|день|zi|día|jour|Tag|ден|天)", " day"]
- name: re_replace
args: ["(?i)(nädalat|uger|settimane|tygodnie|uker|semanas|týdny|недели|недель|săptămâni|semaines|Wochen|седмици|weken)", "weeks"]
- name: re_replace
args: ["(?i)(hafta|nädal|uge|settimana|tydzień|uke|semana|týden|неделю|săptămână|semaine|Woche|седмица|周)", " week"]
- name: re_replace
args: ["(?i) (ay)", "month"]
- name: re_replace
args: ["(?i)(kuu|måned|mese|miesiąc|mês|měsíc|месяц|lună|mes|mois|Monat|месец|maand|个月)", " month"]
- name: re_replace
args: ["(?i)(kuud|måneder|mesi|miesiące|meses|měsíce|месяца|месяцев|luni|meses|mois|Monaten|месеца|maanden)", "months"]
- name: re_replace
args: ["(?i)(kuu|måned|mese|miesiąc|mês|měsíc|месяц|lună|mes|Monat|месец|maand|个月)", " month"]
- name: re_replace
args: ["(?i)(aastat|anni|lata|anos|roky|года|ani|años|ans|Jahren|години)", " years"]
- name: re_replace
args: ["(?i)(yil|aasta|år|anno|rok|ano|год|año|Jahr|година|jaar|年)", " year"]
- name: re_replace
args: ["(?i) (an)", "year"]
downloadvolumefactor:
case:
i[class*="fa-id-badge text-orange"]: 0 # 24 Hour FreeLeech From BON Store

View File

@@ -1,11 +1,10 @@
---
site: audiobookbay
name: AudioBookBay
description: "AudioBook Bay (ABB) is a semi-private Torrent Tracker for AUDIOBOOKS"
description: "AudioBook Bay (ABB) is a public Torrent Tracker for AUDIOBOOKS"
language: en-us
type: semi-private
type: public
encoding: UTF-8
followredirect: true
links:
- http://audiobookbay.nl/
legacylinks:
@@ -75,41 +74,30 @@
modes:
search: [q]
login:
path: https://audiobookbay.nl/member/login.php
form: form[action$="/member/login.php"]
method: post
form: form
inputs:
username: "{{ .Config.username }}"
password: "{{ .Config.password }}"
error:
- selector: div.warning
test:
path: http://audiobookbay.nl/member/users/
selector: a[href="/member/logout"]
settings: []
download:
method: get
before:
path: https://audiobookbay.nl/member/login.php
method: "post"
inputs:
username: "{{ .Config.username }}"
password: "{{ .Config.password }}"
selector: td:contains("Info Hash:") ~ td
filters:
- name: prepend
args: "magnet:?xt=urn:btih:"
- name: append
args: "&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969%2Fannounce&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969%2Fannounce&tr=udp%3A%2F%2Fopen.stealth.si%3A80%2Fannounce&tr=udp%3A%2F%2Fexodus.desync.com%3A6969&tr=udp%3A%2F%2Fp4p.arenabg.com%3A1337%2Fannounce&tr=udp%3A%2F%2Fexplodie.org%3A6969%2Fannounce&tr=udp%3A%2F%2Ftracker.opentrackr.org%3A1337%2Fannounce&tr=udp%3A%2F%2Ftracker.tiny-vps.com%3A6969%2Fannounce&tr=udp%3A%2F%2Fopen.demonii.si%3A1337%2Fannounce&tr=udp%3A%2F%2Ftracker.torrent.eu.org%3A451%2Fannounce&tr=udp%3A%2F%2Ftracker.pirateparty.gr%3A6969%2Fannounce&tr=udp%3A%2F%2Fipv4.tracker.harry.lu%3A80%2Fannounce&tr=udp%3A%2F%2Ftracker.cyberia.is%3A6969%2Fannounce&tr=udp%3A%2F%2F9.rarbg.to%3A2710%2Fannounce&tr=udp%3A%2F%2Fdenis.stalker.upeer.me%3A6969%2Fannounce"
search:
paths:
# with just 7 results per page, try to grab up to 35 results
# http://audiobookbay.nl/?s=teeth
# http://audiobookbay.nl/page/2/?s=teeth
- path: "{{if .Keywords}}/?s={{ .Keywords}}{{else}}/{{end}}"
- path: "{{if .Keywords}}/page/2/?s={{ .Keywords}}{{else}}{{end}}"
- path: "{{if .Keywords}}/page/3/?s={{ .Keywords}}{{else}}{{end}}"
- path: "{{if .Keywords}}/page/4/?s={{ .Keywords}}{{else}}{{end}}"
- path: "{{if .Keywords}}/page/5/?s={{ .Keywords}}{{else}}{{end}}"
- path: "{{ if .Keywords }}/?s={{ .Keywords }}{{else}}/{{end}}"
- path: "{{ if .Keywords }}/page/2/?s={{ .Keywords }}{{else}}{{end}}"
- path: "{{ if .Keywords }}/page/3/?s={{ .Keywords }}{{else}}{{end}}"
- path: "{{ if .Keywords }}/page/4/?s={{ .Keywords }}{{else}}{{end}}"
- path: "{{ if .Keywords }}/page/5/?s={{ .Keywords }}{{else}}{{end}}"
rows:
selector: div.post:has(div[class="postTitle"])
fields:
title:
selector: div.postTitle
@@ -117,11 +105,8 @@
selector: div.postTitle h2 a
attribute: href
download:
selector: a[href^="/dl-now?f="]
selector: div.postTitle h2 a
attribute: href
filters:
- name: replace
args: ["/dl-now?f=", "/download?f="]
banner:
optional: true
selector: img
@@ -142,7 +127,13 @@
selector: div.postContent p:contains("File Size:")
filters:
- name: regexp
args: "File Size: (.+?)s"
args: "File Size: (.+?)$"
- name: replace
args: ["MBs", "MB"]
- name: replace
args: ["GBs", "GB"]
- name: replace
args: ["KBs", "KB"]
seeders:
text: 1
leechers:
@@ -151,3 +142,4 @@
text: 0
uploadvolumefactor:
text: 1
# engine n/a

View File

@@ -269,6 +269,7 @@
filters:
- name: dateparse
args: "01-02-2006"
fields:
title:
selector: td a[href*="/viewtopic.php?t="]
@@ -299,17 +300,17 @@
optional: true
selector: td:contains(\00a0B)
seeders:
text: "0"
text: 0
seeders:
optional: true
selector: td[title="Seeders"]
leechers:
text: "0"
text: 0
leechers:
optional: true
selector: td[title="Leechers"]
grabs:
text: "0"
text: 0
grabs:
optional: true
selector: td[title^="Replies:"]
@@ -317,3 +318,4 @@
text: 1
uploadvolumefactor:
text: 1
# engine n/a

View File

@@ -0,0 +1,73 @@
---
site: badasstorrents
name: Badass Torrents
description: "Badass Torrents is a Public torrent site for MOVIES / TV / GENERAL"
language: en-us
type: public
encoding: UTF-8
links:
- https://badasstorrents.com/
caps:
categories:
"Anime": TV/Anime
"apps": PC
"Books": Books
"Games": PC/Games
"Movies": Movies
"Music": Audio
"Other": Other
"TV": TV
"XXX": XXX
modes:
search: [q]
tv-search: [q, season, ep]
movie-search: [q]
settings:
- name: downloadlink
type: select
label: Download link
default: "magnet:?xt="
options:
"/download/" : ".torrent"
"magnet:?xt=": "magnet"
download:
selector: a[href*="{{ .Config.downloadlink }}"]
attribute: href
search:
paths:
- path: "torrents/search/{{ .Keywords }}"
rows:
selector: table.table-hover > tbody > tr:has(a[href*="/torrent/"])
fields:
category:
selector: a[href*="/cat/"]
title:
selector: a[href*="/torrent/"]
details:
selector: a[href*="/torrent/"]
attribute: href
download:
selector: a[href*="/torrent/"]
attribute: href
date:
selector: td:nth-child(3)
filters:
- name: timeago
size:
selector: td:nth-child(4)
seeders:
selector: td:nth-child(5)
leechers:
selector: td:nth-child(6)
downloadvolumefactor:
text: 0
uploadvolumefactor:
text: 1
# engine n/a

View File

@@ -167,3 +167,4 @@
uploadvolumefactor:
case:
"*": 1
# engine n/a

View File

@@ -0,0 +1,151 @@
---
site: beitai
name: BeiTai
description: "BeiTai is a CHINESE Private Torrent Tracker for HD MOVIES / TV"
language: zh-cn
type: private
encoding: UTF-8
links:
- https://www.beitai.pt/
caps:
categorymappings:
- {id: 401, cat: Movies, desc: "Movies/电影"}
- {id: 404, cat: TV/Documentary, desc: "Documentaries/纪录片"}
- {id: 405, cat: TV/Anime, desc: "Animations/动漫"}
- {id: 402, cat: TV, desc: "TV Series/剧集"}
- {id: 403, cat: TV, desc: "TV Shows/综艺"}
- {id: 406, cat: Audio/Video, desc: "MusicVideo/音乐MV"}
- {id: 407, cat: TV/Sport, desc: "Sports/运体"}
- {id: 409, cat: Other, desc: "Misc/其他"}
- {id: 408, cat: Audio, desc: "HQ Audio/无损音乐"}
modes:
search: [q]
tv-search: [q, season, ep, imdbid]
movie-search: [q, imdbid]
settings:
- name: username
type: text
label: Username
- name: password
type: password
label: Password
- name: sort
type: select
label: Sort requested from site
default: "4"
options:
"4": "created"
"7": "seeders"
"5": "size"
"1": "title"
- name: type
type: select
label: Order requested from site
default: "desc"
options:
"desc": "desc"
"asc": "asc"
login:
path: takelogin.php
method: post
inputs:
username: "{{ .Config.username }}"
password: "{{ .Config.password }}"
error:
- selector: td.embedded:has(h2:contains("登录失败"))
test:
path: index.php
selector: a[href="logout.php"]
search:
paths:
- path: torrents.php
inputs:
$raw: "{{ range .Categories }}cat{{.}}=1&{{end}}"
search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{else}}{{ .Keywords }}{{end}}"
# 0 incldead 1 active 2 dead
incldead: 0
# 0 all 1 normal 2 free 3 2x 4 2xfree 5 50% 6 2x50% 7 30%
spstate: 0
# 0 title 1 descr 3 uploaded 4 imdburl
search_area: "{{ if .Query.IMDBID }}4{{else}}0{{end}}"
# 0 AND 1 OR 2 exact
search_mode: 0
sort: "{{ .Config.sort }}"
type: "{{ .Config.type }}"
rows:
selector: table.torrents > tbody > tr:has(table.torrentname)
fields:
title:
selector: a[href^="details.php?id="]
title:
optional: true
selector: a[title][href^="details.php?id="]
attribute: title
category:
selector: a[href^="?cat="]
attribute: href
filters:
- name: querystring
args: cat
details:
selector: a[href^="details.php?id="]
attribute: href
download:
selector: a[href^="download.php?id="]
attribute: href
imdb:
optional: true
selector: div.imdb_100 > a
attribute: href
date:
# time type: time elapsed (default)
selector: td:nth-child(4) > span[title]
attribute: title
optional: true
filters:
- name: append
args: " +08:00"
- name: dateparse
args: "2006-01-02 15:04:05 -07:00"
date:
# time added
selector: td:nth-child(4):not(:has(span))
optional: true
filters:
- name: append
args: " +08:00"
- name: dateparse
args: "2006-01-0215:04:05 -07:00"
size:
selector: td:nth-child(5)
seeders:
selector: td:nth-child(6)
leechers:
selector: td:nth-child(7)
grabs:
selector: td:nth-child(8)
downloadvolumefactor:
case:
img.pro_free: 0
img.pro_free2up: 0
img.pro_50pctdown: 0.5
img.pro_50pctdown2up: 0.5
img.pro_30pctdown: 0.3
"*": 1
uploadvolumefactor:
case:
img.pro_50pctdown2up: 2
img.pro_free2up: 2
img.pro_2up: 2
"*": 1
description:
selector: td:nth-child(2)
remove: a, img
# NexusPHP Standard v1.5 Beta 4

View File

@@ -0,0 +1,143 @@
---
site: bibliotik
name: Bibliotik
description: "Bibliotik is a private site for eBooks and audiobooks"
language: en-US
type: private
encoding: UTF-8
links:
- https://bibliotik.me/
caps:
categorymappings:
- { id: 1, cat: PC, desc: "Applications" }
- { id: 3, cat: Audio/Audiobook, desc: "Audiobooks" }
- { id: 4, cat: Books/Comics, desc: "Comics" }
- { id: 5, cat: Books/Ebook, desc: "eBooks" }
- { id: 7, cat: Books/Magazines, desc: "Magazines" }
modes:
search: [q]
settings:
- name: username
type: text
label: Username
- name: password
type: password
label: Password
- name: orderby
type: select
label: Sort requested from site
default: "relevance"
options:
"relevance": "relevance"
"year": "year"
"size": "size"
"duration": "duration"
"added": "added"
"leechers": "leechers"
"seeders": "seeders"
"snatches": "snatches"
"comments": "comments"
"files": "files"
- name: order
type: select
label: Order requested from site
default: "desc"
options:
"desc": "desc"
"asc": "asc"
login:
path: /
method: form
form: form#loginform
submitpath: /
inputs:
action: login
username: "{{ .Config.username }}"
password: "{{ .Config.password }}"
keeploggedin: 1
error:
- selector: center:first-of-type
test:
path: torrents/
selector: div#pre_header
search:
paths:
- path: torrents/
inputs:
search: "{{ .Keywords }}"
$raw: "{{ range .Categories }}cat[]={{.}}&{{end}}"
orderby: "{{ .Config.orderby }}"
order: "{{ .Config.order }}"
rows:
selector: table#torrents_table > tbody > tr:has(.title)
fields:
category:
selector: td:first-child
case:
div[title="Applications"]: 1
div[title="Audiobooks"]: 3
div[title="Comics"]: 4
div[title="Ebooks"]: 5
div[title="Magazines"]: 7
_year:
selector: .torYear
optional: true
_filetype:
selector: .torFormat
optional: true
title:
selector: .title a
filters:
- name: append
args: "{{ if .Result._year }} {{ .Result._year }}{{else}}{{end}}{{ if .Result._filetype }} {{ .Result._filetype }}{{else}}{{end}}"
details:
selector: .title a
attribute: href
date:
optional: true
selector: .t_files_size_added time
filters:
- name: timeago
download:
selector: a[title="Download"]
attribute: href
# files:
# selector: .t_files_size_added
# filters:
# - name: regexp
# args: "^\\s*(\\d+)\\s*file"
size:
selector: .t_files_size_added
filters:
- name: split
args: [",", 1]
- name: trim
seeders:
text: 0
seeders:
optional: true
selector: .seeders
leechers:
text: 0
leechers:
optional: true
selector: .leechers
grabs:
text: 0
grabs:
optional: true
selector: .snatches
downloadvolumefactor:
case:
"*": 1
uploadvolumefactor:
case:
"*": 1
# engine tbc

View File

@@ -62,8 +62,6 @@
modes:
search: [q]
# seems that site does not support season/episode searching
# tv-search: [q, season, ep]
movie-search: [q]
settings:
@@ -93,17 +91,7 @@
#
paths:
- path: browse.php
# cant get season/episode search working on this site
# keywordsfilters:
# - name: diacritics
# args: replace
# - name: re_replace # S01 to Сезон 1
# args: ["(?i)\\bS0*(\\d+)\\b", ", Сезон $1"]
# - name: re_replace # S01E01 to Сезон 1 Серия 1
# args: ["(?i)\\bS0*(\\d+)E0*(\\d+)\\b", ", Сезон $1, Серия $2"]
inputs:
# multi category filters not supported
# $raw: "{{range .Categories}}c{{.}}=1&{{end}}"
search: "{{ .Keywords }}"
cat: 0
# 0 active 1 incldead 2 onlydead 3 gold 4 noseed 5 silver 7 BFG
@@ -202,3 +190,4 @@
"*": 1
uploadvolumefactor:
text: 1
# engine n/a

View File

@@ -55,7 +55,8 @@
download:
selector: a[href^="download.php?id="]
attribute: href
search:
paths:
- path: browse.php

View File

@@ -54,6 +54,10 @@
type: checkbox
label: Show donor torrent? (Enable if you're a donor)
default: false
- name: info
type: info
label: Results Per Page
default: For best results, change the <b>Torrents per page:</b> setting to <b>100</b> on your account profile.
login:
path: index.php?page=login
@@ -72,12 +76,14 @@
- path: index.php
inputs:
search: "{{ .Keywords }}"
page: "torrents"
category: "{{range .Categories}}{{.}};{{end}}"
options: "0"
active: "0"
page: torrents
category: "{{ range .Categories }}{{.}};{{end}}"
options: 0
active: 0
rows:
selector: table > tbody > tr > td > table.lista > tbody > tr:has(a[href^="index.php?page=torrent-details&id="]){{if .Config.donor }}{{else}}:not(:has(img[src*="keditbookmarks.png"])){{end}}
fields:
download:
selector: a[href^="index.php?page=torrent-details&id="]
@@ -125,19 +131,20 @@
selector: td:nth-last-child(6)
downloadvolumefactor:
case:
img[alt="Gold 100% Free"]: "0"
img[alt="Silver 50% Free"]: "0.5"
img[alt="Bronze 25% Free"]: "0.75"
"*": "1"
img[alt="Gold 100% Free"]: 0
img[alt="Silver 50% Free"]: 0.5
img[alt="Bronze 25% Free"]: 0.75
"*": 1
uploadvolumefactor:
case:
img[alt="2x Upload Multiplier"]: "2"
img[alt="3x Upload Multiplier"]: "3"
img[alt="4x Upload Multiplier"]: "4"
img[alt="5x Upload Multiplier"]: "5"
img[alt="6x Upload Multiplier"]: "6"
img[alt="7x Upload Multiplier"]: "7"
img[alt="8x Upload Multiplier"]: "8"
img[alt="9x Upload Multiplier"]: "9"
img[alt="10x Upload Multiplier"]: "10"
"*": "1"
img[alt="2x Upload Multiplier"]: 2
img[alt="3x Upload Multiplier"]: 3
img[alt="4x Upload Multiplier"]: 4
img[alt="5x Upload Multiplier"]: 5
img[alt="6x Upload Multiplier"]: 6
img[alt="7x Upload Multiplier"]: 7
img[alt="8x Upload Multiplier"]: 8
img[alt="9x Upload Multiplier"]: 9
img[alt="10x Upload Multiplier"]: 10
"*": 1
# xbtitFM v3.0.00

View File

@@ -20,7 +20,7 @@
- {id: 1080, cat: Movies/DVD, desc: "Movies DVD"}
- {id: 1090, cat: Movies/BluRay, desc: "Movies BluRay"}
- {id: 1100, cat: Movies/DVD, desc: "Movies HD2DVD"}
- {id: 1110, cat: Movies/Foreign, desc: "Movies nternational"}
- {id: 1110, cat: Movies/Foreign, desc: "Movies International"}
- {id: 1120, cat: Movies/HD, desc: "Movies HD Packs"}
- {id: 1130, cat: Movies/SD, desc: "Movies SD Packs"}
- {id: 2010, cat: TV/UHD, desc: "TV 2160p"}
@@ -55,6 +55,7 @@
- {id: 5060, cat: XXX, desc: "XXX XviD"}
- {id: 5070, cat: XXX, desc: "XXX HD Packs"}
- {id: 5080, cat: XXX, desc: "XXX SD Packs"}
- {id: 5090, cat: XXX, desc: "XXX Sonstiges"}
- {id: 6010, cat: PC/Games, desc: "Games Windows"}
- {id: 6020, cat: Console, desc: "Games Linux"}
- {id: 6030, cat: PC/Mac, desc: "Games MacOS"}
@@ -101,19 +102,19 @@
- name: sort
type: select
label: Sort requested from site
default: "added"
default: "1"
options:
"added": "created"
"seeds": "seeders"
"size": "size"
"name": "title"
"1": "created"
"8": "seeders"
"6": "size"
"2": "title"
- name: type
type: select
label: Order requested from site
default: "desc"
default: "1"
options:
"desc": "desc"
"asc": "asc"
"1": "desc"
"2": "asc"
login:
path: login.php
@@ -146,44 +147,46 @@
paths:
- path: browse.php
inputs:
$raw: "{{range .Categories}}c{{.}}=1&{{end}}"
search: "{{ .Keywords }}"
# seachin 0=name 1=descr 2=both
blah: 0
# include dead 0=active 1=all 2=dead
incldead: 1
orderby: "{{ .Config.sort }}"
sort: "{{ .Config.type }}"
showsearch: 0
suchfeld: 2
alleanzeigen: 1
$raw: "{{ range .Categories }}kategorie[]={{.}}&{{end}}"
suche: "{{ .Keywords }}"
# searchin 1 name 2 descr 3 both
durchsuche: 1
# includedead 1 active 2 all 3 dead 4 highlight 5 bookmark 6 onlyups 7 freeleech 8 multi2 9 multi5 10 multi10 11 25%dl 12 50%dl 13 75%dl
suchein: 2
# cat 1 all 1000 film 2000 tv 3000 docs 4000 sport 5000 xxx 6000 games 7000 apps 8000 music 9000 other
sucheaus: 1
sortierenach: "{{ .Config.sort }}"
sortierung: "{{ .Config.type }}"
rows:
selector: table.tableinborder[border="0"][cellspacing="0"][cellpadding="0"] tr
fields:
category:
selector: td.tableb a
selector: a.bt-cat
attribute: href
filters:
- name: querystring
args: cat
- name: regexp
args: (\d+)$
title:
selector: div a.tor-name
selector: a.tor-name
details:
selector: div a.tor-name
selector: a.tor-name
attribute: href
download:
selector: div a.tor-name
selector: div.tor-metadl a
attribute: href
filters:
- name: replace
args: ["details.php?id=", "download.php?torrent="]
banner:
selector: div[id^="details-"] img
attribute: src
seeders:
selector: div.tor-sl b
selector: div.tor-seeder
leechers:
selector: div.tor-sl b:last-of-type
selector: div.tor-leecher
grabs:
selector: div.tor-snatcher
# 2 flavours of dates
date:
# Heute 13:30:04
@@ -196,12 +199,12 @@
- name: replace
args: ["Gestern", "Yesterday"]
date:
# 30.02.2018&nbsp;23:12:50
# &nbsp;&nbsp;27.05.2019 <b>12:52:11</b>
selector: div.tor-date:contains(".")
optional: true
filters:
- name: replace
args: ["\u00a0", " "]
args: ["\u00a0", ""]
- name: dateparse
args: "02.01.2006 15:04:05"
size:
@@ -211,21 +214,16 @@
args: [".", ""]
- name: replace
args: [",", "."]
grabs:
selector: div.tor-take
filters:
- name: regexp
args: (\d+)
downloadvolumefactor:
case:
img[src="pic/new_details/25k.png"]: 0.25
img[src="pic/new_details/50k.png"]: 0.5
img[src="pic/new_details/75k.png"]: 0.75
img[src="pic/ou_new.png"]: 0
font.ou: 0 # only upload is counted
font.fl: 0 # freeleech neither dl or ul is counted
"*": 1
uploadvolumefactor:
case:
img[src="pic/sc-dark/multi2.jpg"]: 2
img[src="pic/sc-dark/multi5.jpg"]: 5
img[src="pic/sc-dark/multi10.jpg"]: 10
"font.mu:contains(\"2x\")": 2
"font.mu:contains(\"5x\")": 5
"font.mu:contains(\"10x\")": 10
font.fl: 0 # freeleech neither dl or ul is counted
"*": 1
# engine n/a

View File

@@ -133,10 +133,11 @@
selector: "a[style=\"font-size: 8pt;cursor: pointer;\"][title]"
downloadvolumefactor:
case:
img[title="Ingyenes letöltés"]: "0"
"*": "1"
img[title="Ingyenes letöltés"]: 0
"*": 1
uploadvolumefactor:
selector: span:contains("Feltöltési szorzó")
filters:
- name: replace
args: ["Feltöltési szorzó × ", ""]
# engine n/a

View File

@@ -51,6 +51,7 @@
rows:
selector: table.browse-list > tbody > tr
fields:
category:
selector: td:nth-child(1) a
@@ -154,3 +155,4 @@
text: 0
uploadvolumefactor:
text: 1
# engine n/a

View File

@@ -6,6 +6,8 @@
type: private
encoding: windows-1252
links:
- https://bitspyder.net/
legacylinks:
- http://bitspyder.net/
caps:
@@ -47,9 +49,34 @@
modes:
search: [q]
settings:
- name: username
type: text
label: Username
- name: password
type: password
label: Password
- name: sort
type: select
label: Sort requested from site
default: "8"
options:
"8": "created"
"6": "seeders"
"4": "size"
"1": "title"
- name: type
type: select
label: Order requested from site
default: "desc"
options:
"desc": "desc"
"asc": "asc"
login:
path: processf.php
method: post
path: login.php
method: form
form: form
inputs:
username: "{{ .Config.username }}"
password: "{{ .Config.password }}"
@@ -61,17 +88,20 @@
search:
paths:
- path: browse.php
method: post
inputs:
search: "{{ .Keywords }}"
# 0 active 1 incldead 2 onlydead
incldead: 1
# 0 title 1 default
scope: 1
sort: "{{ .Config.sort }}"
type: "{{ .Config.type }}"
rows:
selector: table > tbody > tr[class]
filters:
- name: andmatch
fields:
# there are two styles, we support both
title:
@@ -101,7 +131,7 @@
selector: td.rowcol:nth-child(7):has(br), td.clear:nth-child(4)
filters:
- name: regexp
args: ([\d,]+)
args: (\d+)
seeders:
selector: td.rowcol:nth-last-child(3)
leechers:
@@ -138,3 +168,4 @@
description:
optional: true
selector: font[color="#990000"]
# custom v4

View File

@@ -41,10 +41,11 @@
download:
selector: a[ href^="magnet:?xt="]
attribute: href
search:
paths:
- path: "{{if .Keywords}}search.php?kwds={{ .Keywords}}&ord={{ .Config.sort }}&cat=100{{else}}/{{end}}"
- path: "{{ if .Keywords }}search.php?kwds={{ .Keywords }}&ord={{ .Config.sort }}&cat=100{{else}}/{{end}}"
rows:
selector: table.torrentsTable:has(tr.r) tbody tr.r
fields:
@@ -79,3 +80,4 @@
text: 0
uploadvolumefactor:
text: 1
# engine n/a

View File

@@ -91,7 +91,7 @@
form: form#loginbox_form
submitpath: ajax/login.php
inputs:
action: "login"
action: login
loginbox_membername: "{{ .Config.username }}"
loginbox_password: "{{ .Config.password }}"
loginbox_remember: 1
@@ -124,8 +124,10 @@
"sortOptions[sortOrder]": "{{ .Config.type }}"
error:
- selector: div.error:not(:contains("Gösterilecek sonuç bulunamadı."))
rows:
selector: table#torrents_table_classic tr:has(td.torrent_name)
fields:
title:
selector: a[href*="?p=torrents&pid=10&action=details"]
@@ -181,3 +183,4 @@
case:
"img[src$=\"/torrent_multiple_upload.png\"]": 2
"*": 1
# TSUE 2.2

View File

@@ -20,12 +20,13 @@
movie-search: [q, imdbid]
settings:
- name: username
- name: cookie
type: text
label: Username
- name: password
type: password
label: Password
label: Cookie
- name: info
type: info
label: How to get the Cookie
default: "<ol><li>Login to this tracker with your browser<li>Open the <b>DevTools</b> panel by pressing <b>F12</b><li>Select the <b>Network</b> tab<li>Click on the <b>Doc</b> button<li>Refresh the page by pressing <b>F5</b><li>Select the <b>Headers</b> tab<li>Find 'cookie:' in the <b>Request Headers</b> section<li>Copy & paste the whole cookie string to here.</ol>"
- name: sort
type: select
label: Sort requested from site
@@ -44,16 +45,9 @@
"asc": "asc"
login:
path: login
method: form
method: cookie
inputs:
username: "{{ .Config.username }}"
password: "{{ .Config.password }}"
remember: on
error:
- selector: script[nonce]:contains("Error")
message:
selector: script[nonce]:contains("Error")
cookie: "{{ .Config.cookie }}"
test:
path: /
selector: a[href$="/logout"]
@@ -131,29 +125,35 @@
filters:
# translations for Turkish|Estonian|Danish|Italian|Polish|Norwegian|Portuguese|Czech|Russian|Romanian|Spanish|French|German|Bulgarian|Dutch|Chinese
- name: re_replace
args: ["(?i)(önce|tagasi|geleden|fa|temu|siden|atrás|nazpět|назад|acum|hace|il y a|vor|преди|前)", " ago"]
- name: re_replace
args: ["(?i)(dakika|minut|minuto|minuta|minutt|минута|Minute|minuut|分钟)", " minute"]
args: ["(?i)(önce|tagasi|geleden|fa|temu|siden|atrás|nazpět|назад|acum|în urmă|hace|il y a|vor|преди|前)", " ago"]
- name: re_replace
args: ["(?i)(minutit|minutter|minuti|minuty|minutos|минуты|минут|Minuten|минути|minuten)", "minutes"]
- name: re_replace
args: ["(?i)(saat|tund|time|ora|godzina|hora|hodina|час|oră|heure|Stunde|uur|小时)", " hour"]
args: ["(?i)(dakika|minut|minuto|minuta|minutt|минута|Minute|minuut|分钟)", " minute"]
- name: re_replace
args: ["(?i)(tundi|timer|ore|godziny|horas|hodiny|hoden|часа|часов|ore|heures|Stunden)", "hours"]
- name: re_replace
args: ["(?i)(gün|päev|dag|giorno|dzień|dia|den|день|zi|día|jour|Tag|ден|天)", " day"]
args: ["(?i)(saat|tund|time|ora|godzina|hora|hodina|час|oră|heure|Stunde|uur|小时)", " hour"]
- name: re_replace
args: ["(?i)(päeva|dage|giorni|dni|dias|dny|дня|дней|zile|días|jours|Tagen|дни|dagen)", "days"]
- name: re_replace
args: ["(?i)(hafta|nädal|uge|settimana|tydzień|uke|semana|týden|неделю|săptămână|semaine|Woche|седмица|周)", " week"]
args: ["(?i)(gün|päev|dag|giorno|dzień|dia|den|день|zi|día|jour|Tag|ден|天)", " day"]
- name: re_replace
args: ["(?i)(nädalat|uger|settimane|tygodnie|uker|semanas|týdny|недели|недель|săptămâni|semaines|Wochen|седмици|weken)", "weeks"]
- name: re_replace
args: ["(?i)(hafta|nädal|uge|settimana|tydzień|uke|semana|týden|неделю|săptămână|semaine|Woche|седмица|周)", " week"]
- name: re_replace
args: ["(?i) (ay)", "month"]
- name: re_replace
args: ["(?i)(kuu|måned|mese|miesiąc|mês|měsíc|месяц|lună|mes|mois|Monat|месец|maand|个月)", " month"]
- name: re_replace
args: ["(?i)(kuud|måneder|mesi|miesiące|meses|měsíce|месяца|месяцев|luni|meses|mois|Monaten|месеца|maanden)", "months"]
- name: re_replace
args: ["(?i)(kuu|måned|mese|miesiąc|mês|měsíc|месяц|lună|mes|Monat|месец|maand|个月)", " month"]
- name: re_replace
args: ["(?i)(aastat|anni|lata|anos|roky|года|ani|años|ans|Jahren|години)", " years"]
- name: re_replace
args: ["(?i)(yil|aasta|år|anno|rok|ano|год|año|Jahr|година|jaar|年)", " year"]
- name: re_replace
args: ["(?i) (an)", "year"]
downloadvolumefactor:
case:
i[class*="fa-id-badge text-orange"]: 0 # 24 Hour FreeLeech From BON Store
@@ -170,4 +170,4 @@
i[class*="fa-globe text-green"]: 2 # Global Double Upload
i[class*="fa-certificate text-pink"]: 2 # Featured Torrent
"*": 1
# UNIT3D 2.2.7
# UNIT3D 2.3.0

View File

@@ -96,3 +96,4 @@
text: 1
uploadvolumefactor:
text: 1
# TorrentPier

View File

@@ -0,0 +1,118 @@
---
site: brasiltracker
name: BrasilTracker
description: "BrasilTracker is a BRAZILIAN Private Torrent Tracker for MOVIES / TV / GENERAL"
language: en-us
encoding: UTF-8
type: private
links:
- https://brasiltracker.org/
caps:
categorymappings:
- {id: 1, cat: Other, desc: "Filmes/Series/Música"}
modes:
search: [q]
tv-search: [q, season, ep]
movie-search: [q]
settings:
- name: username
type: text
label: Username
- name: password
type: password
label: Password
- name: sort
type: select
label: Sort requested from site
default: "time"
options:
"time": "created"
"seeders": "seeders"
"size": "size"
- name: type
type: select
label: Order requested from site
default: "desc"
options:
"desc": "desc"
"asc": "asc"
- name: info_results
type: info
label: "Search results"
default: "This indexer does not support <b>Torrent Groups</b><br />Un-tick the <b>Torrent grouping</b><i> (Habilitar Grupo de Torrents)</i> checkbox in your <b>Configurações</b>."
- name: info_categories
type: info
label: "About categories"
default: "BrasilTracker does not show <b>Categories</b> in its Search Results.<br />To use this indexer with Sonarr/Radarr set your indexer category to <b>7000</b>."
login:
path: login.php
method: form
form: form#loginform
inputs:
username: "{{ .Config.username }}"
password: "{{ .Config.password }}"
keeplogged: 1
error:
- selector: form#loginform:contains("incorretos")
test:
path: index.php
selector: a[href^="logout.php?auth="]
search:
paths:
- path: torrents.php
inputs:
# torrents.php?searchstr=mandalorain&order_by=size&order_way=desc&action=basic&searchsubmit=1
searchstr: "{{ .Keywords }}"
order_by: "{{ .Config.sort }}"
order_way: "{{ .Config.type }}"
action: basic
searchsubmit: 1
rows:
selector: table#torrent_table > tbody > tr.torrent
fields:
category:
text: 1
title:
selector: a[href^="torrents.php?id="]
details:
selector: a[href^="torrents.php?id="]
attribute: href
download:
selector: a[href^="torrents.php?action=download&id="]
attribute: href
description:
selector: div.tags
banner:
selector: img[alt="Cover"]
attribute: src
files:
selector: td:nth-child(3)
date:
selector: span.time
attribute: title
filters:
- name: dateparse
args: "Jan 2 2006, 15:04"
size:
selector: td:nth-child(5)
grabs:
selector: td:nth-child(6)
seeders:
selector: td:nth-child(7)
leechers:
selector: td:nth-child(8)
downloadvolumefactor:
case:
strong.tl_free: 0
"*": 1
uploadvolumefactor:
case:
"*": 1
# engine n/a

View File

@@ -0,0 +1,145 @@
---
site: broadcity
name: BroadCity
description: "BroadCity is a TURKISH Private Torrent Tracker for MOVIES and TV"
language: tr
type: private
encoding: UTF-8
links:
- http://broadcity.in/
caps:
categorymappings:
- {id: 1, cat: Movies/UHD, desc: "UHD"}
- {id: 2, cat: Movies/HD, desc: "BluRay"}
- {id: 8, cat: Movies/HD, desc: "TV"}
- {id: 6, cat: Movies/HD, desc: "WEB-DL"}
- {id: 16, cat: Movies/HD, desc: "WEBRip"}
- {id: 3, cat: Movies/HD, desc: "Movies HD"}
- {id: 25, cat: Movies/3D, desc: "Movies 3D"}
- {id: 4, cat: Movies/HD, desc: "BluRay"}
- {id: 7, cat: Movies/HD, desc: "TV"}
- {id: 5, cat: Movies/HD, desc: "WEB-DL"}
- {id: 14, cat: Movies/HD, desc: "WEBRip"}
- {id: 27, cat: Movies/HD, desc: "LORD Rips"}
- {id: 9, cat: Movies/SD, desc: "SD"}
- {id: 23, cat: Movies/SD, desc: "BluRay"}
- {id: 10, cat: Movies/SD, desc: "DVD"}
- {id: 12, cat: Movies/SD, desc: "TV"}
- {id: 13, cat: Movies/SD, desc: "WEB-DL"}
- {id: 15, cat: Movies/SD, desc: "WEBRip"}
- {id: 17, cat: TV, desc: "TV"}
- {id: 26, cat: TV/Other, desc: "TV Program"}
- {id: 19, cat: TV, desc: "Yabanci Dizi"}
- {id: 18, cat: TV, desc: "Yerli Dizi"}
- {id: 20, cat: Movies/HD, desc: "VIP"}
modes:
search: [q]
tv-search: [q, season, ep]
movie-search: [q]
settings:
- name: username
type: text
label: Username
- name: password
type: password
label: Password
- name: info
type: info
label: Captcha Text Note
default: The <i>Captcha Text</i> code is <b>case sensitive</b>.
login:
path: login.php
method: form
form: form[action$="takelogin.php"]
inputs:
username: "{{ .Config.username }}"
password: "{{ .Config.password }}"
captcha:
type: image
selector: img#regimage
input: imagestring
error:
- selector: table:contains("Bir Hata oluştu!")
- selector: table:contains("Bir Hata Oluştu!")
- selector: table:contains("Login Giriş Kilitlendi!")
test:
path: index.php
selector: a[href*="/logout.php?logouthash="]
ratio:
path: index.php
selector: div#top div:nth-child(2) span:nth-child(2)
filters:
- name: regexp
args: "Ratio: (.+?) Bonus:"
search:
paths:
- path: browse.php
keywordsfilters:
- name: re_replace # E01 to BL01
args: ["(?i)\\bE(\\d+)\\b", "E$1"]
inputs:
# does not support multi categories so defaulting to ALL
do: search
keywords: "{{ .Keywords }}"
category: 0
search_type: t_name
include_dead_torrents: yes
rows:
selector: table#sortabletable tbody tr:has(div[id^="port-target-"])
fields:
title:
selector: div[id^="port-target-"] a
filters:
- name: re_replace # BL01 to E01
args: ["(?i)\\bBL(\\d+)\\b", " E$1 "]
details:
selector: div[id^="port-target-"] a
attribute: href
category:
selector: a[href*="browse.php?category="]
attribute: href
filters:
- name: querystring
args: category
banner:
selector: div[id^="port-content-"] img
attribute: src
date:
selector: td:nth-child(2)
filters:
- name: regexp
args: (\d{2}-\d{2}-\d{4} \d{2}:\d{2})
filters:
- name: dateparse
args: "02-01-2006 15:04"
download:
selector: a[href*="download.php?id="]
attribute: href
comments:
selector: td:nth-child(4) a
attribute: href
size:
selector: td:nth-child(5)
grabs:
selector: td:nth-child(6)
seeders:
selector: td:nth-child(7)
leechers:
selector: td:nth-child(8)
downloadvolumefactor:
case:
img[src$="/freedownload.gif"]: 0
img[src$="/silverdownload.gif"]: 0.5
"*": 1
uploadvolumefactor:
case:
img[src$="/x2.gif"]: 2
"*": 1

View File

@@ -0,0 +1,141 @@
---
site: brobits
name: BRObits
description: "BRObits is a CHINESE Private Torrent Tracker for HD MOVIES / TV"
language: zh-cn
type: private
encoding: UTF-8
links:
- https://brobits.cc/
caps:
categorymappings:
- {id: 401, cat: Movies, desc: "Movies/电影"}
- {id: 404, cat: TV/Documentary, desc: "Documentaries/纪录片"}
- {id: 410, cat: TV, desc: "TV Series/剧集"}
modes:
search: [q]
tv-search: [q, season, ep, imdbid]
movie-search: [q, imdbid]
settings:
- name: cookie
type: text
label: Cookie
- name: info
type: info
label: How to get the Cookie
default: "<ol><li>Login to this tracker in your browser<li>Open the <b>DevTools</b> panel by pressing <b>F12</b><li>Select the <b>Network</b> tab<li>Click on the <b>Doc</b> button<li>Refresh the page by pressing <b>F5</b><li>Select the <b>Headers</b> tab<li>Find 'cookie:' in the <b>Request Headers</b> section<li>Copy & paste the whole cookie string to here</ol>"
- name: sort
type: select
label: Sort requested from site
default: "4"
options:
"4": "created"
"7": "seeders"
"5": "size"
"1": "title"
- name: type
type: select
label: Order requested from site
default: "desc"
options:
"desc": "desc"
"asc": "asc"
login:
method: cookie
inputs:
cookie: "{{ .Config.cookie }}"
test:
path: index.php
search:
paths:
- path: torrents.php
inputs:
$raw: "{{ range .Categories }}cat{{.}}=1&{{end}}"
search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{else}}{{ .Keywords }}{{end}}"
# 0 incldead 1 active 2 dead
incldead: 0
# 0 all 1 normal 2 free 3 2x 4 2xfree 5 50% 6 2x50% 7 30%
spstate: 0
# 0 title 1 descr 3 uploader 4 imdburl
search_area: "{{ if .Query.IMDBID }}4{{else}}0{{end}}"
# 0 AND 1 OR 2 exact
search_mode: 0
sort: "{{ .Config.sort }}"
type: "{{ .Config.type }}"
rows:
selector: table.torrents > tbody > tr:has(table.torrentname)
fields:
title:
selector: a[href^="details.php?id="]
title:
optional: true
selector: a[title][href^="details.php?id="]
attribute: title
category:
selector: a[href^="?cat="]
attribute: href
filters:
- name: querystring
args: cat
details:
selector: a[href^="details.php?id="]
attribute: href
download:
selector: a[href^="download.php?id="]
attribute: href
imdb:
optional: true
selector: div.imdb_100 > a
attribute: href
date:
# time type: time elapsed (default)
selector: td:nth-child(4) > span[title]
attribute: title
optional: true
filters:
- name: append
args: " +08:00"
- name: dateparse
args: "2006-01-02 15:04:05 -07:00"
date:
# time added
selector: td:nth-child(4):not(:has(span))
optional: true
filters:
- name: append
args: " +08:00"
- name: dateparse
args: "2006-01-0215:04:05 -07:00"
size:
selector: td:nth-child(5)
seeders:
selector: td:nth-child(6)
leechers:
selector: td:nth-child(7)
grabs:
selector: td:nth-child(8)
downloadvolumefactor:
case:
img.pro_free: 0
img.pro_free2up: 0
img.pro_50pctdown: 0.5
img.pro_50pctdown2up: 0.5
img.pro_30pctdown: 0.3
"*": 1
uploadvolumefactor:
case:
img.pro_50pctdown2up: 2
img.pro_free2up: 2
img.pro_2up: 2
"*": 1
description:
selector: td:nth-child(2)
remove: a, img
# NexusPHP Standard v1.5 Beta 4

View File

@@ -33,39 +33,59 @@
options:
"time": "created"
"length": "size"
"seeders": "seeders"
search:
paths:
- path: "{{ if .Keywords }}?s={{ .Keywords }}&sort={{ .Config.sort }}{{else}}recent?sort={{ .Config.sort }}{{end}}"
- path: "{{ if .Keywords }}search/{{ .Keywords }}/{{else}}recent{{end}}?sort={{ .Config.sort }}"
- path: "{{ if .Keywords }}search/{{ .Keywords }}/{{else}}recent{{end}}?sort={{ .Config.sort }}&page=2"
- path: "{{ if .Keywords }}search/{{ .Keywords }}/{{else}}recent{{end}}?sort={{ .Config.sort }}&page=3"
- path: "{{ if .Keywords }}search/{{ .Keywords }}/{{else}}recent{{end}}?sort={{ .Config.sort }}&page=4"
- path: "{{ if .Keywords }}search/{{ .Keywords }}/{{else}}recent{{end}}?sort={{ .Config.sort }}&page=5"
rows:
selector: li[class$="item"]
selector: div.media
fields:
title:
selector: h2[class$="title"] a[href*="/torrent/"]
attribute: title
category:
text: 1
title:
selector: a[href^="/torrent/"]
details:
selector: h2[class$="title"] a[href*="/torrent/"]
selector: a[href^="/torrent/"]
attribute: href
download:
selector: a[href$=".torrent"]
attribute: href
magnet:
selector: div[class$="info"] a[href^="magnet:?xt="]
selector: a[href^="magnet:?xt="]
attribute: href
banner:
selector: a.img-thumbnail img
attribute: src
filters:
- name: replace
args: ["https://btdb.io/assets/img/placeholder.png", ""]
size:
selector: div[class$="info"] span:nth-of-type(1)
selector: small:nth-of-type(1) strong
files:
selector: div[class$="info"] span:nth-of-type(2)
selector: small:nth-of-type(2) strong
seeders:
selector: small:nth-of-type(3) strong
filters:
- name: replace
args: [",", ""]
leechers:
selector: small:nth-of-type(4) strong
filters:
- name: replace
args: [",", ""]
date:
selector: div[class$="info"] span:nth-of-type(3)
selector: small:nth-of-type(5) strong
filters:
- name: timeago
grabs:
selector: div[class$="info"] span:nth-of-type(4)
seeders:
text: 1
leechers:
text: 1
downloadvolumefactor:
text: 0
uploadvolumefactor:
text: 1
# engine n/a

View File

@@ -74,4 +74,5 @@
downloadvolumefactor:
text: 0
uploadvolumefactor:
text: 1
text: 1
# dhtcrawler2

View File

@@ -6,6 +6,8 @@
type: public
encoding: UTF-8
links:
- https://bt.etree.org/
legacylinks:
- http://bt.etree.org/
caps:
@@ -76,3 +78,4 @@
text: 0
uploadvolumefactor:
text: 1
# engine n/a

View File

@@ -0,0 +1,68 @@
---
site: bteye
name: BTeye
description: "BTeye is a Public BitTorrent DHT search engine."
language: en-us
type: public
encoding: UTF-8
links:
- https://www.bteye.org/
caps:
categories:
1: Other
modes:
search: [q]
tv-search: [q, season, ep]
movie-search: [q]
settings:
- name: info
type: info
default: BTeye does not use categories. In your software Indexer settings, set the category to 100001.
download:
selector: a[href^="magnet:?xt="]
attribute: href
search:
# https://www.bteye.org/q/2020
paths:
- path: "q/{{ if .Keywords }}{{ .Keywords }}{{else}}2020{{end}}"
rows:
selector: div.plist
filters:
- name: andmatch
fields:
category:
text: 1
title:
selector: div.pname a
attribute: title
details:
selector: div.pname a
attribute: href
download:
selector: div.pname a
attribute: href
date:
selector: div.plink b:nth-of-type(3)
filters:
- name: dateparse
args: "2006-01-02"
files:
selector: div.plink b:nth-of-type(2)
size:
selector: div.plink b:nth-of-type(1)
seeders:
text: 1
leechers:
text: 1
downloadvolumefactor:
text: 0
uploadvolumefactor:
text: 1
# engine n/a

View File

@@ -7,6 +7,7 @@
encoding: UTF-8
links:
- http://tracker.btnext.com/
# note: the site forces http, https is not supported
caps:
categorymappings:
@@ -15,67 +16,76 @@
- {id: 89, cat: Console, desc: "Games"}
- {id: 87, cat: TV, desc: "Series"}
- {id: 93, cat: Audio, desc: "Musica"}
- {id: 108, cat: Movies, desc: "ViP"}
- {id: 1, cat: Movies, desc: "Movies"}
- {id: 70, cat: Movies/3D, desc: "3D"}
- {id: 71, cat: Movies/Sd, desc: "480p"}
- {id: 72, cat: Movies/BluRay, desc: "BD-R"}
- {id: 31, cat: Movies/HD, desc: "BDRIP/BRRip"}
- {id: 16, cat: Movies/SD, desc: "CAM"}
- {id: 74, cat: Movies/DVD, desc: "DvD-R"}
- {id: 17, cat: Movies/HD, desc: "HD"}
- {id: 91, cat: Movies/Other, desc: "Kids"}
- {id: 76, cat: Movies, desc: "Packs"}
- {id: 77, cat: Movies/WEBDL, desc: "WEB-DL"}
- {id: 14, cat: Movies/SD, desc: "DVDRip/XViD"}
- {id: 85, cat: Movies/DVD, desc: "Custom-DVDR"}
- {id: 96, cat: Movies/HD, desc: "4K"}
- {id: 6, cat: PC, desc: "Applications"}
- {id: 18, cat: PC/ISO, desc: "PC Applications"}
- {id: 19, cat: PC/Mac, desc: "Macintosh Applications"}
- {id: 34, cat: PC/ISO, desc: "Linux Applications"}
- {id: 7, cat: Audio, desc: "Music"}
- {id: 20, cat: Audio/Video, desc: "MVideo"}
- {id: 21, cat: Audio/MP3, desc: "Mp3"}
- {id: 33, cat: Audio/Other, desc: "Mp4"}
- {id: 32, cat: Audio/Lossless, desc: "FLAC"}
- {id: 2, cat: Console, desc: "Games"}
- {id: 78, cat: PC/Games, desc: "Linux"}
- {id: 79, cat: PC/Mac, desc: "MacOSX"}
- {id: 28, cat: Console/NDS, desc: "Nintendo DS"}
- {id: 27, cat: PC/Games, desc: "PC/Windows"}
- {id: 80, cat: Console/PS3, desc: "PS2"}
- {id: 81, cat: Console/PS3, desc: "PS3"}
- {id: 82, cat: Console/PS4, desc: "PS4"}
- {id: 83, cat: Console/PSP, desc: "PSP"}
- {id: 95, cat: Console/PSVita, desc: "PSVITA"}
- {id: 4, cat: Console/Wii, desc: "Wii"}
- {id: 26, cat: Console/Xbox360, desc: "XBOX360"}
- {id: 84, cat: Console/Xbox, desc: "XONE"}
- {id: 70, cat: Movies/3D, desc: "Movies 3D"}
- {id: 71, cat: Movies/SD, desc: "Movies 480p"}
- {id: 72, cat: Movies/BluRay, desc: "Movies BD-R"}
- {id: 31, cat: Movies/HD, desc: "Movies BDRIP/BRRip"}
- {id: 16, cat: Movies/SD, desc: "Movies CAM"}
- {id: 74, cat: Movies/DVD, desc: "Movies DvD-R"}
- {id: 76, cat: Movies, desc: "Movies Packs"}
- {id: 91, cat: Movies/Other, desc: "Movies Kids"}
- {id: 77, cat: Movies/WEBDL, desc: "Movies WEB-DL"}
- {id: 85, cat: Movies/DVD, desc: "Movies Custom-DVDR"}
- {id: 14, cat: Movies/SD, desc: "Movies DVDRip/XViD"}
- {id: 98, cat: Movies/Other, desc: "Movies Juvenil"}
- {id: 104, cat: Movies/UHD, desc: "Movies Bluray-UHD"}
- {id: 102, cat: Movies/HD, desc: "Movies HD-720p"}
- {id: 101, cat: Movies/HD, desc: "Movies HD-1080p"}
- {id: 103, cat: Movies/UHD, desc: "Movies HD-2160p"}
- {id: 42, cat: TV, desc: "TV Series"}
- {id: 45, cat: TV/Documentary, desc: "Documentaries"}
- {id: 46, cat: TV/Sport, desc: "Sports"}
- {id: 47, cat: TV/HD, desc: "TV-Bluray"}
- {id: 48, cat: TV/SD, desc: "TV-Dvd-R"}
- {id: 49, cat: TV/SD, desc: "TV-DVDRiP"}
- {id: 50, cat: TV, desc: "TV-Packs"}
- {id: 92, cat: TV/Anime, desc: "TV-Kids"}
- {id: 52, cat: TV/SD, desc: "TV-SDx264"}
- {id: 53, cat: TV/WEB-DL, desc: "TV-WEB-DL"}
- {id: 55, cat: TV/HD, desc: "TV-X264"}
- {id: 47, cat: TV/HD, desc: "TV Bluray"}
- {id: 48, cat: TV/SD, desc: "TV Dvd-R"}
- {id: 49, cat: TV/SD, desc: "TV DVDRiP"}
- {id: 50, cat: TV, desc: "TV Packs"}
- {id: 92, cat: TV, desc: "TV Kids"}
- {id: 112, cat: TV, desc: "TV Juvenil"}
- {id: 52, cat: TV/SD, desc: "TV SDx264"}
- {id: 53, cat: TV/WEB-DL, desc: "TV WEB-DL"}
- {id: 55, cat: TV/HD, desc: "TV X264"}
- {id: 56, cat: TV/SD, desc: "TV-XViD"}
- {id: 44, cat: TV, desc: "Miscellaneous"}
- {id: 51, cat: TV/Anime, desc: "Anime"}
- {id: 54, cat: Audio/Audiobook, desc: "Audiobook"}
- {id: 57, cat: Books, desc: "E-Books"}
- {id: 58, cat: Books/Comics, desc: "Comics"}
- {id: 59, cat: Books, desc: "Educational"}
- {id: 60, cat: Books, desc: "Magazines/Journals"}
- {id: 7, cat: Audio, desc: "Music"}
- {id: 20, cat: Audio/Video, desc: "Music MVideo"}
- {id: 21, cat: Audio/MP3, desc: "Music MP3"}
- {id: 33, cat: Audio/Other, desc: "Music MP4"}
- {id: 32, cat: Audio/Lossless, desc: "Music FLAC"}
- {id: 2, cat: Console, desc: "Games"}
- {id: 78, cat: PC/Games, desc: "Games Linux"}
- {id: 79, cat: PC/Mac, desc: "Games MacOSX"}
- {id: 28, cat: Console/NDS, desc: "Games Nintendo DS"}
- {id: 27, cat: PC/Games, desc: "Games PC/Windows"}
- {id: 80, cat: Console/PS3, desc: "Games PS2"}
- {id: 81, cat: Console/PS3, desc: "Games PS3"}
- {id: 82, cat: Console/PS4, desc: "Games PS4"}
- {id: 83, cat: Console/PSP, desc: "Games PSP"}
- {id: 95, cat: Console/PSVita, desc: "Games PSVITA"}
- {id: 4, cat: Console/Wii, desc: "Games Wii"}
- {id: 26, cat: Console/Xbox360, desc: "Games XBOX360"}
- {id: 84, cat: Console/Xbox, desc: "Games XONE"}
- {id: 6, cat: PC, desc: "Applications"}
- {id: 18, cat: PC/ISO, desc: "Applications PC"}
- {id: 19, cat: PC/Mac, desc: "Applications Macintosh"}
- {id: 34, cat: PC/ISO, desc: "Applications Linux"}
- {id: 44, cat: Other, desc: "Miscellaneous"}
- {id: 54, cat: Audio/Audiobook, desc: "Books Audiobook"}
- {id: 57, cat: Books, desc: "Books E-Books"}
- {id: 58, cat: Books/Comics, desc: "Books Comics"}
- {id: 59, cat: Books, desc: "Books Educational"}
- {id: 60, cat: Books, desc: "Books Magazines/Journals"}
- {id: 61, cat: Other, desc: "Pics/Wallpapers"}
- {id: 62, cat: PC/Phone-Android, desc: "Android"}
- {id: 63, cat: PC/Phone-IOS, desc: "iOS"}
- {id: 66, cat: PC/Phone-Other, desc: "WindowsPhone"}
- {id: 90, cat: Other, desc: "GPS"}
- {id: 68, cat: Other, desc: "Others"}
- {id: 100, cat: Other, desc: "Revistas"}
- {id: 109, cat: TV/Anime, desc: "Anime"}
- {id: 51, cat: TV/Anime, desc: "Anime Filmes"}
- {id: 99, cat: TV/Anime, desc: "Anime Hentai"}
- {id: 110, cat: TV/Anime, desc: "Anime TV Séries"}
- {id: 41, cat: XXX, desc: "XXX"}
- {id: 64, cat: XXX, desc: "XXX-Magazines"}
- {id: 65, cat: XXX, desc: "XXX-Movies"}
@@ -85,6 +95,34 @@
modes:
search: [q]
tv-search: [q, season, ep]
movie-search: [q]
settings:
- name: username
type: text
label: Username
- name: password
type: password
label: Password
- name: info
type: info
label: Layout
default: "<ol><li>Only the English Classic profile is supported.<li>Make sure to set the <b>Torrent Listing (Lista de Torrents)</b> option in your profile to <b>Classic (Clássico)</b><li>Using the <i>Moderna</i> theme will prevent results.</ol>"
- name: sort
type: select
label: Sort requested from site
default: "added"
options:
"added": "created"
"seeders": "seeders"
"size": "size"
- name: type
type: select
label: Order requested from site
default: "desc"
options:
"desc": "desc"
"asc": "asc"
login:
path: ?p=home&pid=1
@@ -92,7 +130,7 @@
form: form#loginbox_form
submitpath: /ajax/login.php
inputs:
action: "login"
action: login
loginbox_membername: "{{ .Config.username }}"
loginbox_password: "{{ .Config.password }}"
loginbox_remember: 1
@@ -115,16 +153,20 @@
- name: re_replace
args: ["[^a-zA-Z0-9]+", "%25"]
inputs:
p: "torrents"
pid: "32"
$raw: "{{range .Categories}}cid[]={{.}}&{{end}}"
p: torrents
pid: 32
$raw: "{{ range .Categories }}cid[]={{.}}&{{end}}"
keywords: "{{ .Keywords }}"
search_type: "name"
searchin: "title"
search_type: name
searchin: title
"sortOptions[sortBy]": "{{ .Config.sort }}"
"sortOptions[sortOrder]": "{{ .Config.type }}"
error:
- selector: div.error:not(:contains("Não existem resultados encontrados."))
- selector: div.error:not(:contains("Não existem resultados encontrados.")):not(:contains("There are no results found."))
rows:
selector: table#torrents_table_classic > tbody > tr:has(td.torrent_name)
fields:
title:
selector: a[href*="?p=torrents&pid=10&action=details"]
@@ -154,11 +196,11 @@
attribute: href
downloadvolumefactor:
case:
"img[title=\"FREE!\"]": "0"
"*": "1"
"img[title=\"FREE!\"]": 0
"*": 1
uploadvolumefactor:
case:
"*": "1"
"*": 1
date:
selector: td.torrent_name > abbr.timeago
optional: true
@@ -194,3 +236,4 @@
args: ["Domingo", "Sunday"]
- name: dateparse
args: "02-01-2006 15:04"
# TSUE 2.2

View File

@@ -27,30 +27,29 @@
tv-search: [q, season, ep, imdbid]
movie-search: [q, imdbid]
settings:
- name: cookie
type: text
label: Cookie
- name: info
type: info
label: How to get the Cookie
default: "<ol><li>Login to this tracker in your browser<li>Open the <b>DevTools</b> panel by pressing <b>F12</b><li>Select the <b>Network</b> tab<li>Click on the <b>Doc</b> button<li>Refresh the page by pressing <b>F5</b><li>Select the <b>Headers</b> tab<li>Find 'cookie:' in the <b>Request Headers</b> section<li>Copy & paste the whole cookie string to here</ol>"
login:
path: login.php
method: form
form: form[action="takelogin.php"]
captcha:
type: image
selector: img[alt="CAPTCHA"]
input: imagestring
method: cookie
inputs:
username: "{{ .Config.username }}"
password: "{{ .Config.password }}"
error:
- selector: td.embedded:has(h2:contains("登錄失敗"))
- selector: td.embedded:has(h2:contains("失败"))
cookie: "{{ .Config.cookie }}"
test:
path: index.php
selector: a[href="logout.php"]
search:
paths:
- path: torrents.php
inputs:
$raw: "{{range .Categories}}cat{{.}}=1&{{end}}"
search: "{{if .Query.IMDBID}}{{ .Query.IMDBID }}{{else}}{{ .Keywords }}{{end}}"
$raw: "{{ range .Categories }}cat{{.}}=1&{{end}}"
search: "{{if .Query.IMDBID }}{{ .Query.IMDBID }}{{else}}{{ .Keywords }}{{end}}"
# 0 incldead 1 active 2 justdead
incldead: 0
# promotion: 0 all 1 normal 2 free 3 2x 4 2xfree 5 50% 6 2x 50% 7 30%
@@ -63,8 +62,10 @@
search_mode: 0
sort: 4
type: desc
rows:
selector: table.torrents > tbody > tr:has(table.torrentname)
fields:
category:
selector: a[href^="?cat="]
@@ -99,19 +100,19 @@
selector: td.rowfollow:nth-child(8)
downloadvolumefactor:
case:
img.pro_free: "0"
img.pro_free2up: "0"
img.pro_50pctdown: "0.5"
img.pro_50pctdown2up: "0.5"
img.pro_30pctdown: "0.3"
"*": "1"
img.pro_free: 0
img.pro_free2up: 0
img.pro_50pctdown: 0.5
img.pro_50pctdown2up: 0.5
img.pro_30pctdown: 0.3
"*": 1
uploadvolumefactor:
case:
img.pro_50pctdown2up: "2"
img.pro_free2up: "2"
img.pro_2up: "2"
"*": "1"
img.pro_50pctdown2up: 2
img.pro_free2up: 2
img.pro_2up: 2
"*": 1
description:
selector: td:nth-child(2)
remove: a, img
# NexusPHP
# NexusPHP Standard v1.5 Beta 4

View File

@@ -6,6 +6,8 @@
type: public
encoding: UTF-8
links:
- https://btio.pw/
legacylinks:
- https://btos.pw/
caps:
@@ -21,9 +23,11 @@
download:
selector: a#magnetOpen
attribute: href
search:
paths:
- path: "search/{{if .Keywords}}{{ .Keywords}}{{else}}2019{{end}}"
- path: "search/{{ if .Keywords }}{{ .Keywords }}{{else}}2019{{end}}"
rows:
selector: div.row:has(a[href*="/detail/hash/"])
fields:
@@ -31,6 +35,7 @@
text: other
title:
selector: a[href*="/detail/hash/"]
attribute: title
details:
selector: a[href*="/detail/hash/"]
attribute: href
@@ -52,3 +57,4 @@
text: 0
uploadvolumefactor:
text: 1
# engine n/a

View File

@@ -146,3 +146,4 @@
"*": 1
uploadvolumefactor:
text: 1
# xbtit 2.0.0

View File

@@ -120,9 +120,13 @@
lang: 0
sort: "{{ .Config.sort }}"
order: "{{ .Config.type }}"
keywordsfilters:
- name: re_replace
args: ["(\\w+)", " +$1"] # prepend + to each word
rows:
selector: table.ttable_headinner > tbody > tr.t-row
fields:
title:
selector: a[href^="torrents-details.php?id="] b
@@ -167,4 +171,5 @@
"*": 1
uploadvolumefactor:
case:
"*": 1
"*": 1
# engine n/a

View File

@@ -2,7 +2,7 @@
site: casstudiotv
name: CasStudioTV
description: "CasStudioTV is a RUSSIAN Semi-Private Torrent Tracker for TV"
language: ru
language: ru-ru
type: semi-private
encoding: UTF-8
links:
@@ -267,9 +267,6 @@
path: /
selector: :has(a[href^="./ucp.php?mode=logout&sid="])
# download:
# selector: a[href^="./download/file.php?id="]:not(img)
search:
paths:
#https://casstudio.tv/search.php?tracker_search=torrent&keywords=star&terms=all&author=&sc=1&sf=titleonly&sr=topics&sk=t&sd=d&st=0&ch=300&t=0&submit=Search
@@ -362,3 +359,4 @@
text: 1
uploadvolumefactor:
text: 1
# phpBB

View File

@@ -6,6 +6,8 @@
type: private
encoding: UTF-8
links:
- https://channelx.xyz/
legacylinks:
- https://channelx.online/
caps:
@@ -130,29 +132,35 @@
filters:
# translations for Turkish|Estonian|Danish|Italian|Polish|Norwegian|Portuguese|Czech|Russian|Romanian|Spanish|French|German|Bulgarian|Dutch|Chinese
- name: re_replace
args: ["(?i)(önce|tagasi|geleden|fa|temu|siden|atrás|nazpět|назад|acum|hace|il y a|vor|преди|前)", " ago"]
- name: re_replace
args: ["(?i)(dakika|minut|minuto|minuta|minutt|минута|Minute|minuut|分钟)", " minute"]
args: ["(?i)(önce|tagasi|geleden|fa|temu|siden|atrás|nazpět|назад|acum|în urmă|hace|il y a|vor|преди|前)", " ago"]
- name: re_replace
args: ["(?i)(minutit|minutter|minuti|minuty|minutos|минуты|минут|Minuten|минути|minuten)", "minutes"]
- name: re_replace
args: ["(?i)(saat|tund|time|ora|godzina|hora|hodina|час|oră|heure|Stunde|uur|小时)", " hour"]
args: ["(?i)(dakika|minut|minuto|minuta|minutt|минута|Minute|minuut|分钟)", " minute"]
- name: re_replace
args: ["(?i)(tundi|timer|ore|godziny|horas|hodiny|hoden|часа|часов|ore|heures|Stunden)", "hours"]
- name: re_replace
args: ["(?i)(gün|päev|dag|giorno|dzień|dia|den|день|zi|día|jour|Tag|ден|天)", " day"]
args: ["(?i)(saat|tund|time|ora|godzina|hora|hodina|час|oră|heure|Stunde|uur|小时)", " hour"]
- name: re_replace
args: ["(?i)(päeva|dage|giorni|dni|dias|dny|дня|дней|zile|días|jours|Tagen|дни|dagen)", "days"]
- name: re_replace
args: ["(?i)(hafta|nädal|uge|settimana|tydzień|uke|semana|týden|неделю|săptămână|semaine|Woche|седмица|周)", " week"]
args: ["(?i)(gün|päev|dag|giorno|dzień|dia|den|день|zi|día|jour|Tag|ден|天)", " day"]
- name: re_replace
args: ["(?i)(nädalat|uger|settimane|tygodnie|uker|semanas|týdny|недели|недель|săptămâni|semaines|Wochen|седмици|weken)", "weeks"]
- name: re_replace
args: ["(?i)(hafta|nädal|uge|settimana|tydzień|uke|semana|týden|неделю|săptămână|semaine|Woche|седмица|周)", " week"]
- name: re_replace
args: ["(?i) (ay)", "month"]
- name: re_replace
args: ["(?i)(kuu|måned|mese|miesiąc|mês|měsíc|месяц|lună|mes|mois|Monat|месец|maand|个月)", " month"]
- name: re_replace
args: ["(?i)(kuud|måneder|mesi|miesiące|meses|měsíce|месяца|месяцев|luni|meses|mois|Monaten|месеца|maanden)", "months"]
- name: re_replace
args: ["(?i)(kuu|måned|mese|miesiąc|mês|měsíc|месяц|lună|mes|Monat|месец|maand|个月)", " month"]
- name: re_replace
args: ["(?i)(aastat|anni|lata|anos|roky|года|ani|años|ans|Jahren|години)", " years"]
- name: re_replace
args: ["(?i)(yil|aasta|år|anno|rok|ano|год|año|Jahr|година|jaar|年)", " year"]
- name: re_replace
args: ["(?i) (an)", "year"]
downloadvolumefactor:
case:
i[class*="fa-id-badge text-orange"]: 0 # 24 Hour FreeLeech From BON Store

View File

@@ -0,0 +1,63 @@
---
site: cili180
name: Cili180
description: "Cili180 is a Public BitTorrent DHT search engine."
language: en-us
type: public
encoding: UTF-8
links:
- http://www.cilijj.xyz/
legacylinks:
- http://www.cili180.com/
caps:
categories:
1: Other
modes:
search: [q]
tv-search: [q, season, ep]
movie-search: [q]
settings: []
search:
paths:
- path: search/
method: post
followredirect: true
inputs:
keyword: "{{ if .Keywords }}{{ .Keywords }}{{else}}2019{{end}}"
rows:
selector: div.list-area > dl.item
filters:
- name: andmatch
fields:
category:
text: 1
title:
selector: dt a
details:
selector: dt a
attribute: href
download:
selector: a[href^="magnet:?xt="]
attribute: href
date:
selector: dd.attr span:nth-child(1) b
filters:
- name: dateparse
args: "2006-01-02"
size:
selector: dd.attr span:nth-child(2) b
seeders:
text: 1
leechers:
text: 1
downloadvolumefactor:
text: 0
uploadvolumefactor:
text: 1
# engine n/a

View File

@@ -0,0 +1,138 @@
---
site: cinemamovies
name: CinemaMovies
description: "CinemaMovies is a POLISH Private Torrent Tracker for MOVIES / TV / GENERAL"
language: pl-pl
type: private
encoding: ISO-8859-2
links:
- https://cinemamovies.pl/
caps:
categorymappings:
- {id: 3, cat: Movies/BluRay, desc: "Filmy BD25/50_5/9"}
- {id: 5, cat: Movies/3D, desc: "Filmy 3D"}
- {id: 6, cat: Movies/DVD, desc: "Filmy DVD5/9"}
- {id: 8, cat: Movies/HD, desc: "Filmy HD"}
- {id: 11, cat: Movies/SD, desc: "Filmy SD"}
- {id: 12, cat: Movies/Other, desc: "Filmy Inne"}
- {id: 32, cat: Movies/UHD, desc: "Filmy UHD"}
- {id: 2, cat: TV/Anime, desc: "Anime"}
- {id: 2, cat: TV/Documentary, desc: "TV Dokumentalne"}
- {id: 20, cat: TV, desc: "TV Paczki"}
- {id: 22, cat: TV/Sport, desc: "TV Sport"}
- {id: 24, cat: TV/HD, desc: "TV HD"}
- {id: 25, cat: TV/SD, desc: "TV SD"}
- {id: 1, cat: PC, desc: "Aplikacje"}
- {id: 15, cat: PC/Games, desc: "Gry"}
- {id: 16, cat: PC/Phone-Other, desc: "Mobile"}
- {id: 17, cat: Other, desc: "Inne"}
- {id: 19, cat: Audio, desc: "Muzyka"}
- {id: 21, cat: Books, desc: "Book"}
modes:
search: [q]
tv-search: [q, season, ep]
movie-search: [q]
settings:
- name: cookie
type: text
label: Cookie
- name: info
type: info
label: How to get the Cookie
default: "<ol><li>Login to this tracker with your browser<li>Open the <b>DevTools</b> panel by pressing <b>F12</b><li>Select the <b>Network</b> tab<li>Click on the <b>Doc</b> button<li>Refresh the page by pressing <b>F5</b><li>Select the <b>Headers</b> tab<li>Find 'cookie:' in the <b>Request Headers</b> section<li>Copy & paste the whole cookie string to here.</ol>"
- name: sort
type: select
label: Sort requested from site
default: "2"
options:
"2": "created"
"5": "seeders"
"3": "size"
"1": "title"
- name: type
type: select
label: Order requested from site
default: "desc"
options:
"desc": "desc"
"asc": "asc"
login:
method: cookie
inputs:
cookie: "{{ .Config.cookie }}"
test:
path: index.php
selector: a[href^="/logout.php"]
search:
paths:
- path: browse.php
inputs:
$raw: "{{ range .Categories }}c{{.}}=1&{{end}}"
search: "{{ .Keywords }}"
# 0 onlyactive 1 all 4 requests 5 onlydead 6 polish 8 free 10 doubleup 11 premier 13 VOD
incldead: 1
# 0 title 1 descr
blah: 0
sort: "{{ .Config.sort }}"
type: "{{ .Config.type }}"
rows:
selector: table[width="100%"] > tbody > tr:has(a[href^="browse.php?cat="])
fields:
category:
selector: a[href^="browse.php?cat="]
attribute: href
filters:
- name: querystring
args: cat
title:
selector: a[href^="details.php?id="]
details:
selector: a[href^="details.php?id="]
attribute: href
download:
selector: a[href^="download.php/"]
attribute: href
banner:
selector: a[href^="details.php?id="]
attribute: onmouseover
filters:
- name: regexp
args: "src=(.+?) "
description:
optional: true
selector: img[src="pic/Poland.png"]
attribute: src
filters:
- name: replace
args: ["pic/Poland.png", "Polish"]
date:
selector: td[width="66%"] > span > span
filters:
- name: append
args: " +00:00"
- name: dateparse
args: "2006-01-02 15:04:05 -07:00"
size:
selector: td:nth-child(4)
seeders:
selector: a[href$="#seedy"]
leechers:
selector: a[href$="#leechy"]
grabs:
selector: td:last-child > small> span
downloadvolumefactor:
case:
img[src="pic/free.png"]: 0
"*": 1
uploadvolumefactor:
case:
img[src="pic/double.png"]: 2
"*": 1
# engine n/a

View File

@@ -28,7 +28,8 @@
download:
selector: a[href^="download.php?id="]
attribute: href
search:
paths:
- path: torrents-search.php

View File

@@ -80,3 +80,4 @@
text: 0
uploadvolumefactor:
text: 1
# Drupal 7

View File

@@ -112,3 +112,4 @@
text: 0
uploadvolumefactor:
text: 1
# engine n/a

View File

@@ -120,3 +120,4 @@
text: 0
uploadvolumefactor:
text: 1
# engine n/a

View File

@@ -149,6 +149,7 @@
rows:
selector: div.inf-table-row
fields:
title:
selector: div.list-name a.tlink
@@ -199,3 +200,4 @@
"*": 1
uploadvolumefactor:
text: 1
# engine n/a

View File

@@ -1,7 +1,7 @@
---
site: crazyscorner
name: Crazy's Corner
description: "Crazy's Corner is a Private Torrent Tracker"
description: "Crazy's Corner is a Private Torrent Tracker for MUSIC"
language: en-us
type: private
encoding: UTF-8
@@ -10,60 +10,45 @@
caps:
categorymappings:
- {id: 34, cat: Movies/3D, desc: "MOVIES 3D"}
- {id: 52, cat: Movies/HD, desc: "MOVIES High Def Mkv/Mp4"}
- {id: 70, cat: Movies, desc: "MOVIES Animation"}
- {id: 97, cat: Movies, desc: "MOVIES DISNEY"}
- {id: 112, cat: Movies, desc: "MOVIES itunes"}
- {id: 78, cat: TV, desc: "MISC POD CASTS"}
- {id: 99, cat: Movies, desc: "MOVIES Cam Ratio Free"}
- {id: 11, cat: Movies/DVD, desc: "MOVIES DVD-R"}
- {id: 35, cat: Movies/BluRay, desc: "MOVIES Blu-Ray"}
- {id: 95, cat: Movies, desc: "MOVIES Classic picks"}
- {id: 100, cat: Movies/SD, desc: "MOVIES XVD"}
- {id: 105, cat: Movies/HD, desc: "MOVIES HD RIPS"}
- {id: 108, cat: Movies, desc: "MOVIES Musical"}
- {id: 107, cat: Movies, desc: "MOVIES Packs"}
- {id: 36, cat: Movies/DVD, desc: "MOVIES DvD-Rips"}
- {id: 37, cat: Movies, desc: "MOVIES Classic"}
- {id: 38, cat: Movies, desc: "MOVIES Classic-Kids"}
- {id: 47, cat: Movies/WEBDL, desc: "MOVIES Webrip/WEB-DL"}
- {id: 39, cat: Movies, desc: "MOVIES Packs"}
- {id: 5, cat: Movies, desc: "MOVIES Anime"}
- {id: 32, cat: XXX, desc: "MOVIES Adult"}
- {id: 33, cat: Movies/UHD, desc: "MOVIES 4K Ratio Free"}
- {id: 4, cat: Movies, desc: "MOVIES Misc"}
- {id: 79, cat: Audio/Audiobook, desc: "MISC AUDIO BOOKS"}
- {id: 81, cat: Audio/Other, desc: "MISC RADIO SHOWS"}
- {id: 43, cat: TV, desc: "TV Kids"}
- {id: 48, cat: Movies, desc: "SPORTS Misc"}
- {id: 110, cat: TV/Sport, desc: "MOVIES Christmas"}
- {id: 44, cat: PC/ISO, desc: "GAMES Pc-Iso"}
- {id: 45, cat: Console, desc: "GAMES All Console"}
- {id: 41, cat: TV, desc: "TV Episodes"}
- {id: 101, cat: TV, desc: "TV Soaps"}
- {id: 104, cat: TV, desc: "TV MISC"}
- {id: 103, cat: Audio, desc: "karaoke Misc"}
- {id: 111, cat: Audio, desc: "MUSIC Christmas"}
- {id: 42, cat: TV, desc: "VIP TV Packs"}
- {id: 84, cat: PC, desc: "APPS MISC"}
- {id: 2, cat: Audio, desc: "Music"}
- {id: 30, cat: Audio, desc: "Music Packs"}
- {id: 31, cat: Audio, desc: "Music Albums"}
- {id: 3, cat: PC/Games, desc: "Games Misc"}
- {id: 40, cat: TV, desc: "TV Single Seasons"}
- {id: 7, cat: PC/0day, desc: "Apps Win"}
- {id: 8, cat: PC, desc: "Apps Linux"}
- {id: 9, cat: PC/Mac, desc: "Apps Mac"}
- {id: 51, cat: Books/Ebook, desc: "E Books Food/Cook-Books"}
- {id: 64, cat: Books/Ebook, desc: "E Books Book Packs"}
- {id: 26, cat: Books/Ebook, desc: "E Books Magazines"}
- {id: 29, cat: Books/Ebook, desc: "E Books Misc Books"}
- {id: 1, cat: Audio, desc: "Alternative"}
- {id: 2, cat: Audio, desc: " |-- "}
- {id: 3, cat: Audio, desc: "Blues"}
- {id: 35, cat: Audio, desc: "Christmas Music"}
- {id: 4, cat: Audio, desc: "Classic Rock"}
- {id: 6, cat: Audio, desc: "Country"}
- {id: 7, cat: Audio, desc: "Dance"}
- {id: 8, cat: Audio, desc: "Disco"}
- {id: 9, cat: Audio, desc: "Electronic"}
- {id: 10, cat: Audio, desc: "Folk"}
- {id: 11, cat: Audio, desc: "Gospel"}
- {id: 37, cat: Audio, desc: "HardCore"}
- {id: 12, cat: Audio, desc: "Heavy-Metal"}
- {id: 13, cat: Audio, desc: "Hip-Hop"}
- {id: 14, cat: Audio, desc: "Jazz"}
- {id: 15, cat: Audio, desc: "Karaoke"}
- {id: 16, cat: Audio, desc: "Metal"}
- {id: 34, cat: Audio, desc: "Misc Compilation Albums Packs"}
- {id: 17, cat: Audio, desc: "Music Apps"}
- {id: 18, cat: Audio, desc: "Music Video"}
- {id: 19, cat: Audio, desc: "Opera"}
- {id: 20, cat: Audio, desc: "Pop"}
- {id: 21, cat: Audio, desc: "Punk"}
- {id: 22, cat: Audio, desc: "Punk Pop"}
- {id: 24, cat: Audio, desc: "R & B"}
- {id: 23, cat: Audio, desc: "Rap"}
- {id: 25, cat: Audio, desc: "Reggae"}
- {id: 26, cat: Audio, desc: "Rock"}
- {id: 27, cat: Audio, desc: "Rock-70s"}
- {id: 28, cat: Audio, desc: "Rock-80s"}
- {id: 29, cat: Audio, desc: "Soul"}
- {id: 30, cat: Audio, desc: "Sound Tracks"}
- {id: 31, cat: Audio, desc: "Techno"}
- {id: 32, cat: Audio, desc: "Teen-Pop"}
- {id: 33, cat: Audio, desc: "Trance"}
modes:
search: [q]
tv-search: [q, season, ep]
movie-search: [q]
music-search: [q, album, artist, label, year]
settings:
- name: username
@@ -75,12 +60,12 @@
- name: sort
type: select
label: Sort requested from site
default: "3"
default: "added"
options:
"3": "created"
"5": "seeders"
"4": "size"
"2": "title"
"added": "created"
"seeders": "seeders"
"size": "size"
"name": "title"
- name: type
type: select
label: Order requested from site
@@ -90,95 +75,90 @@
"asc": "asc"
login:
path: index.php?page=login
path: takelogin.php
method: post
inputs:
uid: "{{ .Config.username }}"
pwd: "{{ .Config.password }}"
username: "{{ .Config.username }}"
password: "{{ .Config.password }}"
submit: LOGIN
error:
- selector: tr td span[style="color:#FF0000;"]
- selector: table:contains("ERROR")
test:
path: index.php
selector: a[href="logout.php"]
selector: a[href*="/logout.php?logouthash="]
download:
before:
path: takethanks.php
method: post
inputs:
torrentid: "{{ .DownloadUri.Query.id }}"
selector: a[href*="/download.php?id="]
attribute: href
search:
paths:
# http://crazys-corner.info/index.php?page=torrents&search=captain&category=0&uploader=0&options=0&active=0&gold=0
- path: index.php
- path: browse.php
method: post
inputs:
search: "{{ .Keywords }}"
page: torrents
category: "{{ range .Categories }}{{.}};{{end}}"
uploader: 0
# 0 filename 1 file&descr 2 descr
options: 0
# 0 all 1 active 2 deadonly
active: 0
# 0 all 1 classic 2 silver 3 gold 4 silver&gold
gold: 0
order: "{{ .Config.sort }}"
by: "{{ .Config.type }}"
do: search
keywords: "{{if or (.Query.Album) (.Query.Artist) }}{{ or (.Query.Album) (.Query.Artist) }}{{else}}{{ .Keywords }}{{end}}"
category: "{{ if .Categories }}{{ range .Categories }}{{.}};{{end}}{{else}}0{{end}}"
# t_name t_description t_both t_uploader t_genre
search_type: t_name
include_dead_torrents: yes
sort: "{{ .Config.sort }}"
order: "{{ .Config.type }}"
rows:
selector: table.lista tr:has(a[onmouseover][href^="index.php?page=torrent-details&id="])
selector: table.sortable tr:has(a[href*="/download.php?id="])
fields:
category:
selector: a[href^="index.php?page=torrents&category="]
selector: a[href*="/browse.php?category="]
attribute: href
filters:
- name: querystring
args: category
title:
selector: a[href^="index.php?page=torrent-details&id="]
# abbreviated title
selector: a[href*="/details.php?id="]
title:
selector: div.tooltip-content > div
optional: true
details:
selector: a[href^="index.php?page=torrent-details&id="]
selector: a[href*="/details.php?id="]
attribute: href
download:
selector: a[href^="download.php?id="]
selector: a[href*="/details.php?id="]
attribute: href
magnet:
selector: a[href^="magnet:?xt="]
attribute: href
banner:
selector: a[href^="index.php?page=torrent-details&id="]
attribute: onmouseover
filters:
- name: regexp
args: "src=(.+?) width"
size:
selector: a[href^="index.php?page=torrent-details&id="]
attribute: onmouseover
filters:
- name: regexp
args: "Size: (.+?)<"
selector: img[src*="/torrents/images/"]
attribute: src
date:
selector: a[href^="index.php?page=torrent-details&id="]
attribute: onmouseover
selector: td:nth-child(2)
filters:
- name: regexp
args: "Added:(.+?)<"
- name: timeago
seeders:
selector: a[title][href^="index.php?page=torrent-details&id="]
attribute: onmouseover
filters:
- name: regexp
args: "Seeders: (\\d+)<"
leechers:
selector: a[title][href^="index.php?page=torrent-details&id="]
attribute: onmouseover
filters:
- name: regexp
args: "Leechers: (\\d+)<"
args: "(\\d{2}-\\d{2}-\\d{4} \\d{2}:\\d{2})"
- name: dateparse
args: "02-01-2006 15:04"
size:
selector: td:nth-last-child(5)
grabs:
selector: a[title][href^="index.php?page=torrent-details&id="]
attribute: onmouseover
filters:
- name: regexp
args: "Done: (\\d+)<"
selector: td:nth-last-child(4)
seeders:
selector: td:nth-last-child(3)
leechers:
selector: td:nth-last-child(2)
downloadvolumefactor:
case:
img[src="images/freeleech.gif"]: 0
img[src="gold/gold.gif"]: 0
img[src$="_flags/freedownload.gif"]: 0
"*": 1
uploadvolumefactor:
case:
img[src$="_flags/x2.gif"]: 2
"*": 1
# TS Special Edition v.7.5

View File

@@ -142,6 +142,7 @@
to: "give"
torrent: "{{ .DownloadUri.Query.id }}"
selector: a:contains("Télécharger ce torrent")
attribute: href
search:
paths:

View File

@@ -112,6 +112,7 @@
rows:
selector: tr:has(td.trowtorrent)
fields:
category:
selector: td:nth-of-type(1) a
@@ -163,3 +164,4 @@
"*": 1
uploadvolumefactor:
text: 1
# U-232

View File

@@ -155,8 +155,7 @@
leechers:
selector: td:nth-child(8) span
downloadvolumefactor:
case:
"*": "1"
text: 1
uploadvolumefactor:
case:
"*": "1"
text: 1
# engine n/a

View File

@@ -6,6 +6,8 @@
type: private
encoding: windows-1252
links:
- https://datascene.net/
legacylinks:
- http://datascene.net/
caps:
@@ -75,11 +77,13 @@
paths:
- path: browse.php
inputs:
$raw: "{{range .Categories}}c{{.}}=1&{{end}}"
$raw: "{{ range .Categories }}c{{.}}=1&{{end}}"
search: "{{ .Keywords }}"
incldead: 1
rows:
selector: div.ncls > table > tbody > tr:has(a.tname)
fields:
title:
selector: a.tname
@@ -123,8 +127,8 @@
selector: td:nth-last-child(2)
downloadvolumefactor:
case:
"a#free-btn": "0"
"*": "1"
"a#free-btn": 0
"*": 1
uploadvolumefactor:
case:
"*": "1"
text: 1
# engine n/a

View File

@@ -103,7 +103,7 @@
selector: td:nth-child(8)
filters:
- name: regexp
args: ([\d,]+)
args: (\d+)
seeders:
selector: td:nth-child(9)
leechers:
@@ -117,3 +117,4 @@
text: 1
uploadvolumefactor:
text: 1
# engine n/a

View File

@@ -284,6 +284,7 @@
download:
selector: a[href^="magnet:?xt="]
attribute: href
search:
paths:
@@ -313,11 +314,14 @@
- name: replace
args: ["Added ", ""]
- name: replace
args: ["on ", ""]
args: ["on ", ""]
fields:
title:
selector: a[href^="/files/details/"]
title:
selector: a[href^="/files/details/"]
optional: true
attribute: title
category:
selector: a[href*="&subcategory="]
@@ -346,3 +350,4 @@
text: 0
uploadvolumefactor:
text: 1
# engine n/a

View File

@@ -133,29 +133,35 @@
filters:
# translations for Turkish|Estonian|Danish|Italian|Polish|Norwegian|Portuguese|Czech|Russian|Romanian|Spanish|French|German|Bulgarian|Dutch|Chinese
- name: re_replace
args: ["(?i)(önce|tagasi|geleden|fa|temu|siden|atrás|nazpět|назад|acum|hace|il y a|vor|преди|前)", " ago"]
- name: re_replace
args: ["(?i)(dakika|minut|minuto|minuta|minutt|минута|Minute|minuut|分钟)", " minute"]
args: ["(?i)(önce|tagasi|geleden|fa|temu|siden|atrás|nazpět|назад|acum|în urmă|hace|il y a|vor|преди|前)", " ago"]
- name: re_replace
args: ["(?i)(minutit|minutter|minuti|minuty|minutos|минуты|минут|Minuten|минути|minuten)", "minutes"]
- name: re_replace
args: ["(?i)(saat|tund|time|ora|godzina|hora|hodina|час|oră|heure|Stunde|uur|小时)", " hour"]
args: ["(?i)(dakika|minut|minuto|minuta|minutt|минута|Minute|minuut|分钟)", " minute"]
- name: re_replace
args: ["(?i)(tundi|timer|ore|godziny|horas|hodiny|hoden|часа|часов|ore|heures|Stunden)", "hours"]
- name: re_replace
args: ["(?i)(gün|päev|dag|giorno|dzień|dia|den|день|zi|día|jour|Tag|ден|天)", " day"]
args: ["(?i)(saat|tund|time|ora|godzina|hora|hodina|час|oră|heure|Stunde|uur|小时)", " hour"]
- name: re_replace
args: ["(?i)(päeva|dage|giorni|dni|dias|dny|дня|дней|zile|días|jours|Tagen|дни|dagen)", "days"]
- name: re_replace
args: ["(?i)(hafta|nädal|uge|settimana|tydzień|uke|semana|týden|неделю|săptămână|semaine|Woche|седмица|周)", " week"]
args: ["(?i)(gün|päev|dag|giorno|dzień|dia|den|день|zi|día|jour|Tag|ден|天)", " day"]
- name: re_replace
args: ["(?i)(nädalat|uger|settimane|tygodnie|uker|semanas|týdny|недели|недель|săptămâni|semaines|Wochen|седмици|weken)", "weeks"]
- name: re_replace
args: ["(?i)(hafta|nädal|uge|settimana|tydzień|uke|semana|týden|неделю|săptămână|semaine|Woche|седмица|周)", " week"]
- name: re_replace
args: ["(?i) (ay)", "month"]
- name: re_replace
args: ["(?i)(kuu|måned|mese|miesiąc|mês|měsíc|месяц|lună|mes|mois|Monat|месец|maand|个月)", " month"]
- name: re_replace
args: ["(?i)(kuud|måneder|mesi|miesiące|meses|měsíce|месяца|месяцев|luni|meses|mois|Monaten|месеца|maanden)", "months"]
- name: re_replace
args: ["(?i)(kuu|måned|mese|miesiąc|mês|měsíc|месяц|lună|mes|Monat|месец|maand|个月)", " month"]
- name: re_replace
args: ["(?i)(aastat|anni|lata|anos|roky|года|ani|años|ans|Jahren|години)", " years"]
- name: re_replace
args: ["(?i)(yil|aasta|år|anno|rok|ano|год|año|Jahr|година|jaar|年)", " year"]
- name: re_replace
args: ["(?i) (an)", "year"]
downloadvolumefactor:
case:
i[class*="fa-id-badge text-orange"]: 0 # 24 Hour FreeLeech From BON Store

View File

@@ -80,6 +80,10 @@
options:
"2": "desc"
"1": "asc"
- name: info
type: info
label: Results Per Page
default: For best results, change the <b>Torrents per page:</b> setting to <b>100</b> on your account profile.
login:
method: cookie
@@ -150,3 +154,4 @@
img[src="images/4x.png"]: 4
img[src="images/5x.png"]: 5
"*": 1
# xbtit customised

View File

@@ -75,6 +75,7 @@
grabs:
selector: td:nth-child(8)
downloadvolumefactor:
text: "0"
text: 0
uploadvolumefactor:
text: "1"
text: 1
# tedmind 1.8.1

View File

@@ -135,6 +135,7 @@
selector: table.ttable_headinner tr.t-row
filters:
- name: andmatch
fields:
download:
selector: a[href^="download.php?id="]
@@ -164,5 +165,5 @@
img[src="images/freeleech_star.gif"]: 0
"*": 1
uploadvolumefactor:
case:
"*": 1
text: 1
# TorrentTrader v2-svn

View File

@@ -140,6 +140,27 @@
FRENCH : "FRENCH"
MULTI.FRENCH : "MULTI.FRENCH"
ENGLISH: "ENGLISH"
- name: sort
type: select
label: Sort requested from site
default: "3"
options:
"3": "created"
"5": "seeders"
"4": "size"
"2": "title"
- name: type
type: select
label: Order requested from site
default: "2"
options:
"2": "desc"
"1": "asc"
- name: info
type: info
label: Results Per Page
default: For best results, change the <b>Torrents per page:</b> setting to <b>100</b> on your account profile.
login:
path: tracker/index.php?page=login
method: post
@@ -158,26 +179,30 @@
download:
before:
path: tracker/thanks.php
method: "post"
method: post
inputs:
infohash: "{{ .DownloadUri.Query.id }}"
thanks: "1"
thanks: 1
rndval: "1487013827343"
selector: a[href^="download.php?id="]
attribute: href
search:
paths:
- path: tracker/index.php
inputs:
page: "torrents"
page: torrents
search: "{{ .Keywords }}"
category: "{{ range .Categories }}{{.}};{{end}}"
options: "0"
options: 0
active: "{{ .Config.active }}"
gold: "{{ .Config.gold }}"
order: "{{ .Config.sort }}"
by: "{{ .Config.type }}"
rows:
selector: table > tbody > tr > td > table.lista > tbody > tr:has(td[onmouseover="this.className='post'"])
fields:
title_phase1:
selector: a[onmouseover][href^="index.php?page=torrent-details&id="]
@@ -224,11 +249,15 @@
args: ["---", "0"]
size:
selector: td:nth-last-of-type(4)
filters:
- name: replace
args: [",", "."]
downloadvolumefactor:
case:
img[src="images/freeleech.gif"]: "0"
img[src="gold/gold.gif"]: "0"
img[src="gold/slver.gif"]: "0.5"
"*": "1"
img[src="images/freeleech.gif"]: 0
img[src="gold/gold.gif"]: 0
img[src="gold/slver.gif"]: 0.5
"*": 1
uploadvolumefactor:
text: "1"
text: 1
# xbtit dt fm v20.0

View File

@@ -140,29 +140,35 @@
filters:
# translations for Turkish|Estonian|Danish|Italian|Polish|Norwegian|Portuguese|Czech|Russian|Romanian|Spanish|French|German|Bulgarian|Dutch|Chinese
- name: re_replace
args: ["(?i)(önce|tagasi|geleden|fa|temu|siden|atrás|nazpět|назад|acum|hace|il y a|vor|преди|前)", " ago"]
- name: re_replace
args: ["(?i)(dakika|minut|minuto|minuta|minutt|минута|Minute|minuut|分钟)", " minute"]
args: ["(?i)(önce|tagasi|geleden|fa|temu|siden|atrás|nazpět|назад|acum|în urmă|hace|il y a|vor|преди|前)", " ago"]
- name: re_replace
args: ["(?i)(minutit|minutter|minuti|minuty|minutos|минуты|минут|Minuten|минути|minuten)", "minutes"]
- name: re_replace
args: ["(?i)(saat|tund|time|ora|godzina|hora|hodina|час|oră|heure|Stunde|uur|小时)", " hour"]
args: ["(?i)(dakika|minut|minuto|minuta|minutt|минута|Minute|minuut|分钟)", " minute"]
- name: re_replace
args: ["(?i)(tundi|timer|ore|godziny|horas|hodiny|hoden|часа|часов|ore|heures|Stunden)", "hours"]
- name: re_replace
args: ["(?i)(gün|päev|dag|giorno|dzień|dia|den|день|zi|día|jour|Tag|ден|天)", " day"]
args: ["(?i)(saat|tund|time|ora|godzina|hora|hodina|час|oră|heure|Stunde|uur|小时)", " hour"]
- name: re_replace
args: ["(?i)(päeva|dage|giorni|dni|dias|dny|дня|дней|zile|días|jours|Tagen|дни|dagen)", "days"]
- name: re_replace
args: ["(?i)(hafta|nädal|uge|settimana|tydzień|uke|semana|týden|неделю|săptămână|semaine|Woche|седмица|周)", " week"]
args: ["(?i)(gün|päev|dag|giorno|dzień|dia|den|день|zi|día|jour|Tag|ден|天)", " day"]
- name: re_replace
args: ["(?i)(nädalat|uger|settimane|tygodnie|uker|semanas|týdny|недели|недель|săptămâni|semaines|Wochen|седмици|weken)", "weeks"]
- name: re_replace
args: ["(?i)(hafta|nädal|uge|settimana|tydzień|uke|semana|týden|неделю|săptămână|semaine|Woche|седмица|周)", " week"]
- name: re_replace
args: ["(?i) (ay)", "month"]
- name: re_replace
args: ["(?i)(kuu|måned|mese|miesiąc|mês|měsíc|месяц|lună|mes|mois|Monat|месец|maand|个月)", " month"]
- name: re_replace
args: ["(?i)(kuud|måneder|mesi|miesiące|meses|měsíce|месяца|месяцев|luni|meses|mois|Monaten|месеца|maanden)", "months"]
- name: re_replace
args: ["(?i)(kuu|måned|mese|miesiąc|mês|měsíc|месяц|lună|mes|Monat|месец|maand|个月)", " month"]
- name: re_replace
args: ["(?i)(aastat|anni|lata|anos|roky|года|ani|años|ans|Jahren|години)", " years"]
- name: re_replace
args: ["(?i)(yil|aasta|år|anno|rok|ano|год|año|Jahr|година|jaar|年)", " year"]
- name: re_replace
args: ["(?i) (an)", "year"]
downloadvolumefactor:
case:
i[class*="fa-id-badge text-orange"]: 0 # 24 Hour FreeLeech From BON Store

View File

@@ -80,6 +80,7 @@
download:
selector: a[href^="download.php?id="]
attribute: href
search:
# https://dxp.ru/torrents.php?search=&sort=4&type=desc
@@ -135,3 +136,4 @@
"*": 0
uploadvolumefactor:
text: 1
# engine n/a

View File

@@ -140,3 +140,4 @@
"*": 1
uploadvolumefactor:
text: 1
# engine n/a

View File

@@ -297,6 +297,7 @@
download:
selector: a[href^="download.php?id="]
attribute: href
search:
paths:

View File

@@ -60,8 +60,9 @@
paths:
- path: torrents.php
inputs:
artistname: "{{ if .Query.Artist }}{{ .Query.Artist }}{{else}}{{end}}"
groupname: "{{ if .Query.Artist }}{{else}}{{ .Keywords }}{{end}}"
searchstr: "{{ .Keywords }}"
artistname: "{{ .Query.Artist }}"
groupname: "{{ .Query.Album }}"
order_by: "{{ .Config.sort }}"
order_way: "{{ .Config.type }}"
@@ -117,3 +118,4 @@
case:
strong.torrent_label[title*="Neutral"]: 0
"*": 1
# engine n/a

View File

@@ -0,0 +1,140 @@
---
site: eggmeon
name: EggMeOn
description: "EggMeOn is a Private Torrent Tracker for nostalgic TV / CONSOLE / PODCASTS"
language: en-us
type: private
encoding: UTF-8
links:
- https://www.eggmeon.xyz/
caps:
categorymappings:
- {id: 1, cat: TV, desc: "AdultSwim"}
- {id: 2, cat: TV/Anime, desc: "Animation"}
- {id: 14, cat: Audio, desc: "Audio"}
- {id: 3, cat: TV, desc: "Cartoon Network"}
- {id: 4, cat: TV, desc: "Comedy"}
- {id: 5, cat: TV, desc: "Disney"}
- {id: 6, cat: Console, desc: "Games"}
- {id: 7, cat: TV, desc: "MST3K"}
- {id: 8, cat: Audio/Video, desc: "MTV"}
- {id: 9, cat: TV, desc: "Nickelodeon"}
- {id: 10, cat: Movies, desc: "Other"}
- {id: 13, cat: Audio/Other, desc: "Podcast"}
- {id: 11, cat: Books, desc: "Publication"}
- {id: 12, cat: Movies, desc: "Star Wars"}
modes:
search: [q]
tv-search: [q]
movie-search: [q]
settings:
- name: username
type: text
label: Username
- name: password
type: password
label: Password
- name: sort
type: select
label: Sort requested from site
default: "time"
options:
"time": "created"
"seeders": "seeders"
"size": "size"
- name: type
type: select
label: Order requested from site
default: "desc"
options:
"desc": "desc"
"asc": "asc"
login:
path: login
method: form
form: form[action="/login"]
inputs:
username: "{{ .Config.username }}"
password: "{{ .Config.password }}"
cinfo: "1536|864|24|-780"
iplocked: 0
keeploggedin: 1
submit: login
selectorinputs:
token:
selector: input[name="token"]
attribute: value
error:
- selector: table#maincontent tr td div div#messagebarA
search:
paths:
- path: torrents.php
inputs:
$raw: "{{ range .Categories }}filter_cat[{{.}}]=1&{{end}}"
order_by: "{{ .Config.sort }}"
order_way: "{{ .Config.type }}"
searchtext: ""
action: advanced
title: "{{ .Keywords }}"
sizeall: ""
sizetype: gb
sizerange: 0.01
filelist: ""
taglist: ""
autocomplete_toggle: 1
rows:
selector: table#torrent_table tr:has(a[href^="torrents.php?action=download"])
fields:
category:
selector: a[href^="/torrents.php?filter_cat"]
attribute: href
filters:
- name: regexp
args: "(\\d+)]=1"
title:
selector: a[href^="/torrents.php?id="]
details:
selector: a[href^="/torrents.php?id="]
attribute: href
download:
selector: a[href^="torrents.php?action=download"]
attribute: href
description:
selector: div.tags
banner:
selector: td:nth-child(2) > script
filters:
- name: regexp
args: "src=\\\\\"(.*?)\\\\\">"
- name: re_replace
args: ["\\\\(.)", "$1"]
- name: replace
args: ["/static/common/noartwork/noimage.png", ""]
files:
selector: td:nth-last-child(8)
date:
selector: td:nth-last-child(6)
filters:
- name: timeago
size:
selector: td:nth-last-child(5)
grabs:
selector: td:nth-last-child(4)
seeders:
selector: td:nth-last-child(3)
leechers:
selector: td:nth-last-child(2)
downloadvolumefactor:
case:
"img[alt=\"Freeleech\"]": 0
"*": 1
uploadvolumefactor:
text: 1
# luminance

View File

@@ -6,13 +6,15 @@
type: public
encoding: UTF-8
links:
- https://www.elitetorrent.tv/
- https://www.elitetorrent.bz/
legacylinks:
- https://www.elitetorrent.biz/
- https://www.elitetorrent.io/
- https://www.elitetorrent.one/
- https://www.elitetorrent.is/
- https://www.elitetorrent.nu/
- https://www.elitetorrent.tv/
- https://www.elitetorrent.li/
caps:
categories:
@@ -45,10 +47,12 @@
inputs:
s: "{{ .Keywords }}"
$raw: "&x=0&y=0"
rows:
selector: "#principal .miniboxs-ficha li"
filters:
- name: andmatch
fields:
title:
selector: .meta a
@@ -87,10 +91,11 @@
date:
text: now
seeders:
text: "1"
text: 1
leechers:
text: "1"
text: 1
downloadvolumefactor:
text: "0"
text: 0
uploadvolumefactor:
text: "1"
text: 1
# engine n/a

View File

@@ -85,14 +85,16 @@
- path: torrents.php
inputs:
$raw: "{{range .Categories}}filter_cat[{{.}}]=1&{{end}}"
title: "{{ .Query.Keywords }}"
title: "{{ .Keywords }}"
order_by: time
order_way: desc
action: basic
searchsubmit: 1
rows:
# exclude redbar torrents
selector: table#torrent_table > tbody > tr[class^="torrent row"]
fields:
download:
selector: a[href^="/torrents.php?action=download&id="]
@@ -106,7 +108,7 @@
attribute: href
filters:
- name: regexp
args: "\\[(\\d+?)\\]"
args: "(\\d+)]=1"
details:
selector: a[href^="/torrents.php?id="]
attribute: href
@@ -141,8 +143,8 @@
downloadvolumefactor:
case:
span.icon[title*="Freeleech"]: 0
"img[alt=\"Freeleech\"]": "0"
"*": "1"
"img[alt=\"Freeleech\"]": 0
"*": 1
uploadvolumefactor:
case:
"*": "1"
text: 1
# luminance

Some files were not shown because too many files have changed in this diff Show More