Compare commits

..

352 Commits

Author SHA1 Message Date
Garfield69
401c3a3f41 readme: update linux .net core supported OS link for 3.1 2020-03-21 18:27:40 +13:00
Garfield69
6f854d0d99 add unblockit proxy for assorted public trackers. 2020-03-21 18:27:03 +13:00
ilike2burnthing
7c33c536bc 1337x: update the 1337x Proxy domain. (#7759)
and add a followredirect.
2020-03-21 17:21:51 +13:00
Cory
3d6da64973 DigitalHive: Fix error in configure script. Resolves #7755 (#7757) 2020-03-21 13:17:54 +13:00
Diego Heras
be8dfd7ad6 redacted: fix double login in gazelle trackers. resolves #6461 (#7756) 2020-03-21 13:17:25 +13:00
josdion
60da4948fa Zelka.org: Improve torrent names (#7750)
update categories
add freeleech DLVF
remove hard-coded sitelink from selectors
2020-03-21 13:16:51 +13:00
Cory
b2040d3a5b hd-torrents: Add global freeleech check. resolves #7734 (#7751) 2020-03-21 10:58:31 +13:00
Garfield69
869b09f574 microbit: add imdbid search support. #4859 2020-03-21 09:50:06 +13:00
Garfield69
aac2e42f9e thepiratebay: add tpb.bike as an alternate sitelink #7256
its an unofficial proxy but it works with the indexer
2020-03-21 06:57:14 +13:00
Garfield69
2ad340f1bc downloadville: fix cat 27 caused by da7589838f 2020-03-21 06:38:47 +13:00
Garfield69
943ddba22b worldoftomorrow: fix cat 95 2020-03-20 20:23:02 +13:00
Garfield69
79fa4da2bf arabafenice: fix cats 47 and 40 2020-03-20 20:22:12 +13:00
Garfield69
da7589838f downloadville: update categories 2020-03-20 20:20:03 +13:00
Garfield69
2a4be14998 1337x: fix cats 54, 70, 76 2020-03-20 20:13:16 +13:00
Garfield69
c81a2163ce sktorrent: fix cat 43 2020-03-20 20:09:13 +13:00
Garfield69
d3ada91c3a hdreactor: fix cat 5006 2020-03-20 20:08:10 +13:00
Garfield69
653dcca2af worldoftomorrow: fix cat 89 2020-03-20 20:06:41 +13:00
Garfield69
c2a24cae22 hdme: fix cat 57 2020-03-20 20:05:32 +13:00
Garfield69
babd49c082 torrent-explosive: fix cat 258 2020-03-20 20:02:15 +13:00
Garfield69
1007366471 torrentsectorcrew: fix cat 121 and 124 2020-03-20 20:00:40 +13:00
Garfield69
e747d4e2fa hachede: fix cat 125 2020-03-20 19:58:00 +13:00
Garfield69
efab277714 generationfree: fix cat 1 and 130 2020-03-20 19:56:38 +13:00
Garfield69
7f8cfa7eca insanetracker: update categories
add config sort options
add includedead
fix grabs > 999
description is optional
add engine tag
2020-03-20 19:40:09 +13:00
Garfield69
6abc8adcd1 horrorsite: update engine tag 2020-03-20 16:54:52 +13:00
Garfield69
8e1d171937 girotorrent: update categories 2020-03-20 16:54:26 +13:00
Garfield69
9f433dd0de generationfree: update categories 2020-03-20 16:53:50 +13:00
Garfield69
65da3e83af add horrorsite a Hungarian private tracker. resolves #7736 2020-03-20 13:04:47 +13:00
Garfield69
21250c275f galeriens: 2020-03-20 12:38:21 +13:00
Garfield69
e612c111c6 bithorlo: add cookie alert 2020-03-20 12:38:02 +13:00
Garfield69
e24c95d4e2 Revert "baibako: switch to private."
This reverts commit 6e8726c197.
2020-03-20 07:09:41 +13:00
Garfield69
2920caf7c0 film-paleis: add imdbid search. #4859
also add banner
add freeleech DLVF
2020-03-19 21:01:50 +13:00
Garfield69
f73a047ed9 extremetorrents: update categories 2020-03-19 18:52:01 +13:00
Garfield69
313ade66f4 btnext: add imdbid search. #4859
also update categories
add info about uread mail
add imdb link in results
fix date parsing
2020-03-19 15:51:56 +13:00
Garfield69
392a0d7b7e cardigannindexer: add optional arg to strdump
when you are using multiple strdumps it is useful to tag them with an unique eyecatcher so you can tell them apart in the enhanced log.
2020-03-19 09:09:58 +13:00
Garfield69
324afbcd0f fanoin: add imdbid search. #4859
also add config sort options
add uhd category
add movie-search
fix date selectors
no engine tag
2020-03-19 06:39:08 +13:00
Garfield69
7f003427fd carpathians: add imdbid search. #4859
also add config sort options
add x4 ULVF
add engine tag
2020-03-19 05:55:36 +13:00
Cory
a89246c9a7 core: improve date parsing for today/yesterday/tomorrow. resolves #7701 (#7704) 2020-03-18 21:11:48 +13:00
ende124
69b01c34f8 norbits: Add fullsearch option (#7710) 2020-03-18 20:50:13 +13:00
Garfield69
a41bf6ebe4 polishsource: add imdbid search. #4859 2020-03-18 19:57:58 +13:00
Garfield69
5bf224d84d torrentview: new domain *6.net 2020-03-18 17:44:17 +13:00
Garfield69
03af2a6d1d torrent-turk: add info about unread PM 2020-03-18 17:43:51 +13:00
Garfield69
aee7bba3ce estone: update search terms 2020-03-17 20:15:30 +13:00
Garfield69
29b1304967 downloadville: 2020-03-17 18:25:16 +13:00
Garfield69
81029b3019 documentarytorrents: update modes. 2020-03-17 18:10:32 +13:00
Garfield69
62caeb3f4d divteam: update categories 2020-03-17 17:58:53 +13:00
Garfield69
fba3e1922f deildu: add imdbid search. #4859 2020-03-17 16:46:46 +13:00
Garfield69
0aacf6344d cztorrent: update categories 2020-03-17 16:24:59 +13:00
Garfield69
9d3d8ea18d crnaberza: fix title search. 2020-03-17 16:10:01 +13:00
Garfield69
4da3921e21 crazyspirit: update cats 2020-03-17 13:06:58 +13:00
Diego Heras
fed41d5b68 epublibre: add server overloaded message (#7697) 2020-03-16 21:48:14 +01:00
Garfield69
15841e26a8 cinemamovies: add imdb search. #4859 2020-03-17 09:03:18 +13:00
Garfield69
22a5f46276 totallykids: add imdb search. #4859 2020-03-16 17:58:39 +13:00
Garfield69
eb5642f293 ptfiles: add imdb search. #4859
add config sort options
add UHD cat
add engine tag
remove obsolete search terms
2020-03-16 17:36:21 +13:00
Garfield69
98297b2d85 torrentleech-pl: add imdb search. #4859 2020-03-16 17:10:25 +13:00
Diego Heras
d900ac065f webui: save search sorting and number of entries indefinitely. resolves #4558 (#7686) 2020-03-16 12:59:49 +13:00
Cory
469620d88b gimme-peers: fix parse error on zero results resolves #7678 (#7683) 2020-03-16 00:21:00 +01:00
Diego Heras
461594e336 elitetracker: fix parsing error. resolves #7675 (#7684) 2020-03-15 17:26:18 -05:00
Cory
63f1870319 bithdtv: implement category searching. resolves #7577 resolves #7596 (#7663)
* Implement category searching. Fixes #7577

* Check if no results Resolves #7596
2020-03-15 22:49:31 +01:00
Cory
ba9710cd7c hdspace: add imdb search support (#7665) 2020-03-15 22:38:54 +01:00
Garfield69
44c814417c ztracker: add imdb search. #4859
add silver DLVF
correct a couple cats
2020-03-16 09:15:32 +13:00
Diego Heras
d1290fc226 epublibre: add new spanish public tracker. resolves #6309 (#7669) 2020-03-15 18:42:14 +01:00
junglebus
fa88fa8af8 Readme: Full framework now no longer needed (#7667)
Since we are now running self contained .NET Core, no .NET is required on the host system
2020-03-16 06:24:36 +13:00
Diego Heras
318b3667ff core: add more binary formats in .gitattributes (#7670) 2020-03-16 06:23:28 +13:00
Garfield69
7b0adc7e45 torrentwal: gone. removed. resolves #7286 2020-03-15 16:35:05 +13:00
Diego Heras
d27ab11d8c elitetracker: add imdb search and fix categories (#7657) 2020-03-15 00:18:42 +01:00
Cory
5b6c9fee49 Fix proxy in all cases (#7631) resolves #7411
Co-authored-by: Diego Heras <ngosang@hotmail.es>
2020-03-14 17:53:16 -05:00
Garfield69
594959c858 torrent.lt: add config sort options
add movie-search
add freeleech
2020-03-15 11:08:20 +13:00
Garfield69
5b570b5cec torrentland: fix ULVF 2020-03-15 11:07:10 +13:00
Garfield69
875be5dde9 spiritofrevolution: fix imdbsearch. #4859 2020-03-15 08:59:11 +13:00
Garfield69
ffd1600226 bitturk, blutopia: update categories 2020-03-15 08:58:39 +13:00
Garfield69
07ef45b637 datascene: add imdb search support. #4859
also add config sort options
incldead
2020-03-15 08:58:02 +13:00
Cory
24f7fa461d bithdtv: improve imdb search. resolves #7596 (#7629) 2020-03-14 19:16:03 +01:00
Garfield69
8ebeb2bb17 icetorrent: fix imdbid searches. resolves #7651
also drop searching with both browse and browseadult
now use one or the other via config checkbox.
2020-03-15 06:33:08 +13:00
Diego Heras
fe3fcda356 style: improve date utils code style (#7632) 2020-03-15 05:05:10 +13:00
Diego Heras
b689b4581e funfile: fix parsing error. resolves #7633 (#7639) 2020-03-15 05:04:05 +13:00
Garfield69
623da8f70d readme: update net461 link 2020-03-14 21:30:06 +13:00
Garfield69
6afaf39d5a .gitattributes default eol=lf for all text source
used mainly by my win10 desktop github, it would pop up a warning that lf was going to be converting LF to CRLF
https://github.com/desktop/desktop/issues/3841 provided this solve
2020-03-14 21:29:43 +13:00
Garfield69
55bd19dc45 moecat: add 2FA to config. resollves #7644 2020-03-14 19:40:47 +13:00
junglebus
0979b0c86d Pipeline: Get text after list of commits #3 2020-03-14 17:20:38 +11:00
junglebus
f4c8677091 Fix Pipeline: Get text after list of commits 2020-03-14 16:57:34 +11:00
junglebus
1123e9d101 Pipeline: Get text after list of commits 2020-03-14 16:43:40 +11:00
junglebus
9a39fcc310 Test build from master 2020-03-14 16:18:44 +11:00
junglebus
e8fc2c758f Update build triggers 2020-03-14 15:57:57 +11:00
junglebus
b8cdf9f929 No longer needed now that Cake is not used 2020-03-14 15:45:54 +11:00
junglebus
89c860a16d Update for GitHubRelease@1 2020-03-14 15:21:54 +11:00
junglebus
ee5255b24a Update README.md 2020-03-14 15:10:51 +11:00
junglebus
674e6e37ad Update pipeline for new Azure organization 2020-03-14 15:05:49 +11:00
Garfield69
082e761d0d add * Torrent Oyun indir a public Turkish games site. resolves #7636 2020-03-14 07:16:11 +13:00
Garfield69
6e8726c197 baibako: switch to private. 2020-03-14 05:39:25 +13:00
Garfield69
3a8ed21d75 amigosshare: handle missing cat 2020-03-13 20:23:49 +13:00
Garfield69
eda0205dcd add u-torrents a private Romanian site. resolves #7626 2020-03-13 06:54:35 +13:00
Garfield69
bd250ff971 add lastfiles a Romanian privat esite. resolves #7580 2020-03-12 21:20:55 +13:00
Garfield69
1c63e9444d zetorrents: refining title. #7574 2020-03-12 19:18:24 +13:00
Garfield69
57a5959751 add zetorrents a public french site. resolves #7574 2020-03-12 18:18:59 +13:00
Garfield69
9e005c4c0b Merge branch 'master' of https://github.com/Jackett/Jackett 2020-03-12 18:14:49 +13:00
Garfield69
c6d4746e85 assorted public trackers: info about cat 100001 -> 7000 2020-03-12 18:14:41 +13:00
Diego Heras
e9851a1dbc funfile: handle disabled download links. resolves #7436 (#7620) 2020-03-12 17:34:07 +13:00
Garfield69
96d23ca19a add torrentv a public movie site. resolves #7575 2020-03-12 17:31:03 +13:00
Garfield69
733494a8a3 scenefz: update for new engine. resolves #7625 2020-03-12 15:25:00 +13:00
Garfield69
ed763fe7e1 scenefz: domain change. #7625 2020-03-12 12:36:52 +13:00
Garfield69
1ef146eea4 add rapidzona a Russian public 3x site. resolves #7561 2020-03-12 09:15:48 +13:00
Diego Heras
ed884f507d puntotorrent: fix missing categories. resolves #7592 (#7623) 2020-03-12 08:53:25 +13:00
fnk93
ec6ed23ecc torrentseeds: fix re-login and add imdb id (#7611) 2020-03-11 19:34:02 +01:00
Garfield69
9d5456e370 add torrent-pirat a public Russian 3x site. resolves #7560 2020-03-12 06:03:28 +13:00
Garfield69
ad08e28aa9 add sosulki a public Russian 3X site. resolves #7559 2020-03-11 20:48:38 +13:00
Diego Heras
34dcdd3332 core: add trace running in docker (#7565) 2020-03-11 19:02:55 +13:00
Cory
628944cb59 TorrentHeaven: Update with user provided HTML. Resolves #7586 (related to #7387) (#7616) 2020-03-11 18:20:53 +13:00
Diego Heras
08bc5cca75 shazbat: fix parser. resolves #7604 (#7619) 2020-03-11 17:58:45 +13:00
Diego Heras
5c16161bfc morethantv: add banner and description. resolves #7594 (#7621) 2020-03-11 12:53:12 +13:00
Diego Heras
4eb7392678 core: improve linux install scripts. resolves #5533 #6098 #5407 (#7614) 2020-03-10 21:49:26 +01:00
halali
0448193ecd cztorrent: Fix for Sonarr Season pack search (#7607) 2020-03-11 08:41:11 +13:00
Garfield69
dc27463826 lesaloon: revert https switching. #7221 2020-03-11 07:53:07 +13:00
Celedhrim
d3ef94c8db Downloadville: add a fake referer in search (#7609) resolves #7514 2020-03-11 07:26:45 +13:00
cadatoiva
74e3dec4ed Revert "Update TorrentHeaven with user provided html. Resolves #7586"
This reverts commit 0b45557292.
2020-03-10 12:05:57 -05:00
cadatoiva
0b45557292 Update TorrentHeaven with user provided html. Resolves #7586 2020-03-10 12:02:03 -05:00
halali
0387de3c67 trezzor: Fix some selectors in search page (#7608) 2020-03-10 21:56:54 +13:00
Garfield69
6358e62741 awsomehd: add info about 90 day mandatory password change 2020-03-10 21:42:23 +13:00
Garfield69
b012502f87 rns: add info about unread PM preventing searches. 2020-03-10 21:41:29 +13:00
Garfield69
608bb7d9e4 sdbits: switch to https: resolves #7221 2020-03-10 20:43:17 +13:00
fnk93
5f4206608e TorrentSeeds: Convert to csharp (#7603) 2020-03-10 20:11:35 +13:00
Garfield69
aef10d1246 eggmeon: gone. removed. resolves #7133 2020-03-10 20:07:03 +13:00
Garfield69
6fc972aa08 onejav: description can be missing. resovles #7602 2020-03-10 19:22:41 +13:00
Garfield69
271dcda7aa cartoonchaos: add posters. resolves #7598 2020-03-10 18:20:21 +13:00
Garfield69
94656892f8 totallykids: add posters. resolves #7589 2020-03-10 18:10:18 +13:00
Diego Heras
5fedb9c613 moviesdvdr: fix banner and size (#7599) 2020-03-10 16:04:04 +13:00
snamds
538fa6a38d Newpct: optionally remove year from movies (#7597) 2020-03-10 15:53:57 +13:00
Garfield69
4bd4d9cb0f add imdbid to modes for any yaml that supports .Query.IMDBID 2020-03-10 15:35:59 +13:00
RicardoVelaC
a353af2ee5 vizuk: Update categories (#7605) resolves #7588 2020-03-10 14:34:27 +13:00
Garfield69
565a368689 hdarea: fix imdb lookup. resolves #7368 2020-03-10 14:23:14 +13:00
Garfield69
972d4c9485 bittower: revert back to http. #7221 2020-03-10 10:25:45 +13:00
Garfield69
45b77de6b2 torrentland: add UHD categories. resolves #7591 2020-03-10 07:42:24 +13:00
Garfield69
a27c641bcb torrentleech: update categories. resolves #7590 2020-03-10 06:52:40 +13:00
Garfield69
00cd1bd81c xbytes2: update categories. resolves #7587 2020-03-10 05:30:37 +13:00
Garfield69
80493b7fa1 add ParnuXi a Russian Public 3x site. resolves #7558 2020-03-09 20:11:02 +13:00
Garfield69
925471fa0c add pornolive a Russian Public 3x site. resolves #7557 2020-03-09 18:22:17 +13:00
Garfield69
9ae16dea57 add iv-torrents a Russian semi-private site. resolves #7556 2020-03-09 17:19:53 +13:00
Garfield69
1aa3a256eb add rutracker-ru a Russian Puiblic site. resolves #7526 2020-03-09 15:51:25 +13:00
Garfield69
89d12c6fa9 zelka: add info note about bulgarian ip filter 2020-03-09 11:31:36 +13:00
Garfield69
ab6ca013d3 yaml: switch from http to https #7221 2020-03-09 11:31:04 +13:00
Garfield69
20d6e3eb09 yaml: add note about sites not supporting https 2020-03-09 11:28:43 +13:00
Garfield69
37a50f8374 pleasuredome: fix details selector
also switch to https
2020-03-09 10:57:01 +13:00
Diego Heras
fac07933a2 solidtorrents: remove retries (#7584) 2020-03-08 22:26:50 +01:00
Garfield69
8b77c6b483 greeklegends: gone. removed. resolves #6369 2020-03-09 08:21:26 +13:00
Garfield69
f1414eeeec alein: gone. removed. resolves #4021 2020-03-09 08:14:16 +13:00
jshessen
7a7bf83d98 add MMA-Torrents, a private site. (#7567) 2020-03-09 07:05:38 +13:00
Diego Heras
1d48eb2dd7 avistaz, cinemaz, privatehd: add imdb search and banner (#7579) 2020-03-08 16:28:43 +01:00
Diego Heras
e3956e123e bakabt: fix optional tag. resolves #7571 #7420 (#7578) 2020-03-08 14:50:38 +01:00
Diego Heras
1cfe4f9226 bithdtv: add imdb search (#7576) 2020-03-08 14:12:08 +01:00
Diego Heras
2cc601c5a9 piratethenet: add imdb search and fix categories. resolves #7381 (#7562) 2020-03-08 12:45:10 +01:00
Diego Heras
a69664428a morethantv: add imdb search and others category (#7553) 2020-03-08 12:32:37 +01:00
Diego Heras
389daf9957 hdolimpo: add banner image (#7568) 2020-03-08 12:31:58 +01:00
Garfield69
93d200895b cartookchaos, totallykids: note https unsupported 2020-03-08 21:06:39 +13:00
Garfield69
43414bc9ed cartoonchaos: switch to https albeit with invalid ca 2020-03-08 20:54:49 +13:00
Garfield69
e630390c3f rustorka: note https unsupported 2020-03-08 20:54:08 +13:00
Diego Heras
eb59c0bd51 nostalgic: add vhstapes in the name (#7563) 2020-03-08 16:16:44 +13:00
Diego Heras
e743f8b3aa elitetorrent: add banner image (#7569) 2020-03-08 16:06:56 +13:00
Garfield69
6aaf12f1de documentarytorrents: fix typo in config sort options 2020-03-08 15:40:23 +13:00
Garfield69
bd5e407b53 galeriens: switch to cookie method. resolves #7544 2020-03-08 08:13:11 +13:00
Garfield69
c93d2821b1 torrentview: new domain *5.net resolves #7548 2020-03-08 07:56:21 +13:00
Garfield69
f65d2ba9e9 cpabien: new domain wvw. resolves #7547 2020-03-08 07:55:53 +13:00
Diego Heras
0f5655ce0d core: fix CloudflareSolverRe library. Resolves #7397 (#7546) 2020-03-08 07:21:23 +13:00
Garfield69
5484d05291 bigtower, hqsource, inperil: switch to https. #7221 2020-03-08 07:07:39 +13:00
Garfield69
fcc4168f54 xtremezone: add imdb to results. #4859 2020-03-08 07:04:04 +13:00
Garfield69
905a52a82b pornorip: andmatch 2020-03-07 17:47:28 +13:00
Garfield69
86fd318211 add pornorip a 3x site. resolves #7524 2020-03-07 17:43:33 +13:00
Garfield69
e66beb64f4 add pornotor a 3x site. resolves #7523 2020-03-07 16:20:03 +13:00
Garfield69
4b507a3cbb add torrentrex a public search engine. resolves #7515 2020-03-07 15:09:10 +13:00
junglebus
5033171c54 azure-pipeline: Add debug logging (#7541)
Hopefully will help with github publish failures, quite a few debug statements there...
https://github.com/microsoft/azure-pipelines-tasks/blob/master/Tasks/GitHubReleaseV0/operations/Action.ts
2020-03-07 14:51:06 +13:00
Garfield69
8faf1c94dc ccfbits: add imdb support. #4859
also add config sort options
update ULVF
add engine tag
2020-03-07 12:55:48 +13:00
Garfield69
d05ad1ccb5 ilcorsaroblu: now semi-private resolves #7528 2020-03-07 09:54:41 +13:00
Cory
9a1562ef8b readme: Sort trackers alphabetically (#7537) 2020-03-07 09:53:34 +13:00
Garfield69
b5aee501e2 legittorrents: add missing sort 2020-03-07 09:49:09 +13:00
Cory
dc9519c451 XtremeZone: add imdb search support (#7536) resolves #7520 2020-03-07 07:41:31 +13:00
fnk93
692d006078 Torrent-Explosiv: Remove [Group Tag] in title (#7532) 2020-03-07 07:35:33 +13:00
Cory
7aac4fcfcb TorrentBytes: fix title bug (#7529) resolves #7527 2020-03-07 07:35:10 +13:00
Garfield69
81e5589707 filmsclub: optional (TVShows) label for tv titles. #7289 2020-03-06 20:51:46 +13:00
Cory
c36e3356e2 PassThePopcorn: Fix Freeleech check (#7522) resolves #6951 2020-03-06 19:03:42 +13:00
fnk93
d477f01f84 Speedtorrent Reloaded: Update to new tracker source (#7519) resolves #7517 2020-03-06 17:25:28 +13:00
Cory
d080c4a2ac Fuzer: Fix parse error (#7521) resolves #7502 2020-03-06 17:21:28 +13:00
Garfield69
6252c73cf2 xtremezone: new layout et.al. resolves #7520
also add missing cats
add config sort options
add imdb support #4859
2020-03-06 17:13:31 +13:00
Cory
3f9d182083 core: Remove warning suppression (#7513) 2020-03-06 14:57:59 +13:00
Garfield69
0cabbd68c5 spiritofevolution: fix login. resolves #7512 2020-03-06 14:35:03 +13:00
Garfield69
c42027842b downloadville: add cat 95 2020-03-06 14:34:18 +13:00
Garfield69
66b433bde1 torrentdownloads: drop .me domain 2020-03-05 20:01:01 +13:00
garfield69
ae303a5d4e Fix parse errors in Fuzer and Hebits (#7506) resolves #7502 2020-03-05 19:45:27 +13:00
Garfield69
ca19d2219e pornolab: add new categories 2020-03-05 19:44:22 +13:00
Garfield69
28a85d6426 add spiritofrevolution a Private German site. resolves #7503 2020-03-05 17:37:08 +13:00
Garfield69
bd1d95ade5 filmsclub: massage TV titles for sonarr. #7289 2020-03-05 13:32:31 +13:00
Garfield69
6634c5a036 ilcorsaronero: new domain .pw 2020-03-05 12:58:06 +13:00
Garfield69
cc671dfab5 btdb: download can be missing. resolves #7508 2020-03-05 12:53:32 +13:00
Garfield69
dccdd89299 cinemageddon: switch to https #7221 2020-03-05 12:12:00 +13:00
Garfield69
c23370b5fc limetorrents: drop .zone as an alternate domain. #7496 2020-03-05 09:08:28 +13:00
garfield69
d53a0ae4b9 Fix parse errors with Shazbat (#7493) resolves #7492 2020-03-05 08:00:06 +13:00
Garfield69
4e8c52e16a uniondht: fix typo category wiiware #7409 2020-03-05 07:38:45 +13:00
Garfield69
eaae440c66 add xxxtor a Russian public 3x site. resolves #7471 2020-03-05 07:06:22 +13:00
Garfield69
c7e288a372 add KinoNaVse100 a Russian Semi-rpivate site. resolves #7425 2020-03-04 19:19:40 +13:00
Garfield69
a8375e8cfe add uniondht a Public Russian site. resolves #7409 2020-03-04 16:00:12 +13:00
Garfield69
4ed5507e4d audiobooktorrents: add info about unread PM. resolves #7422
fix files selector
add engine tag
2020-03-04 11:01:00 +13:00
Diego Heras
682304d186 animetosho: change feed url. resolves #7456 (#7487) 2020-03-04 10:06:02 +13:00
Garfield69
1455a905f1 elitetorrent-biz: new domain .nl resolves #7486 2020-03-04 09:38:25 +13:00
Diego Heras
64f066839d TorrentSyndikat: fix error caused by #7386 Resolves #7481 (#7485) 2020-03-04 09:35:13 +13:00
Diego Heras
cf676b4a3f SceneTime: fix error caused by #7394 Resolves #7475 (#7484) 2020-03-04 09:16:11 +13:00
Diego Heras
8bd74a2cc9 Filelist: fix error caused by #7360 and added grabs. Resolves #7474 (#7483) 2020-03-04 09:15:07 +13:00
Garfield69
77837b7483 filmclub: optional config to strip year from title. #7289 2020-03-04 08:40:52 +13:00
Garfield69
96e5e259e9 lechaudron: fix download link. #5559 2020-03-04 07:29:56 +13:00
Diego Heras
6999410617 core: fix file permissions (#7479) 2020-03-03 10:29:01 -06:00
Diego Heras
e55e92f9ac Core: Fix line endings to match style guide(#7476) 2020-03-03 10:28:26 -06:00
Garfield69
4710fa619c add linuxtracker a public repo for linux iso. resolves #7407 2020-03-03 16:41:11 +13:00
Diego Heras
61f9bec045 FunFile: fix error caused by #7369 Resolves #7451 (#7472) 2020-03-03 11:24:37 +13:00
Garfield69
318e8722db restore lechaudron, its back. resolves #5559 2020-03-03 11:19:32 +13:00
Diego Heras
86ce7ef1c8 Bit-City: fix error caused by #7357 Resolves #7459 (#7468) 2020-03-03 10:47:08 +13:00
Diego Heras
0997bf674a ImmortalSeed: fix error caused by #7375 Resolves #7461 (#7464) 2020-03-03 10:45:26 +13:00
Diego Heras
c07c4f0682 Ncore: fix error caused by #7378 Resolves #7444 (#7470) 2020-03-03 10:34:46 +13:00
Cory
1563418d88 Gimmepeers: Fix invalid CSS selector caused by #7371 (#7460) resolves #7457 2020-03-03 08:09:12 +13:00
fnk93
771c0ac68c Add Fantastic Heaven a German private site. (#7449) 2020-03-03 07:54:40 +13:00
Diego Heras
143ffbf790 HD-Torrents: fix error caused by #7373 Resolves #7426 (#7458) 2020-03-03 07:46:19 +13:00
Garfield69
a3f30a2dd9 newrealworld: fix parse errors caused by #7393 2020-03-02 20:54:41 +13:00
Garfield69
a9d3ae0107 torrentbytes: fix possible parse error caused by #7388 2020-03-02 20:49:59 +13:00
Garfield69
012f3d1bbc torrentheaven: fix parse errors caused by #7387 2020-03-02 20:45:31 +13:00
Garfield69
9826e2c2af myamity: fix parse errors caused by #7377 2020-03-02 20:40:09 +13:00
Garfield69
a512ea37c3 hdtorrents: imdb can be missing. fix #7373 2020-03-02 20:33:21 +13:00
Cory
3aedbc7baf Ncore: Fix parse errors caused by #7378 Resolves #7444 (#7445) 2020-03-02 18:46:08 +13:00
Garfield69
b32257ae95 add academictorrents a public site. resolves #7405 2020-03-02 18:15:35 +13:00
Cory
6c1c4092bd Fix null reference after conversion to AngleSharp (#7443) resolves #7442 2020-03-02 15:20:13 +13:00
Diego Heras
758138415e funfile: fix error caused by #7369 Resolves #7436 (#7440) 2020-03-02 12:28:45 +13:00
fnk93
b9a6c7c810 The Resurrection: Tracker closed down (#7439) #7174 2020-03-02 09:54:09 +13:00
Garfield69
dda62f1e18 add onejav a public Asian 3x site. resolves #7345 2020-03-02 09:43:40 +13:00
Garfield69
8fcb19e1ea nordichd: gome. removed. resolves #6708 2020-03-02 08:36:50 +13:00
Garfield69
66e7ced25b scenexpress: gone. removed. resolves #6859 2020-03-02 08:34:53 +13:00
Diego Heras
5f1848d1de bakabt: fix error caused by #7355 Resolves #7420 (#7434) 2020-03-02 08:05:44 +13:00
Christian Franchin
1f9c760246 bjshare: multiple improvements (#7432)
Add details to release when its from the last 24h list;
change cat4 to PCGames;
Changed category parsing on 24h list;
Added parsing from 4K to 2160p
2020-03-02 08:05:17 +13:00
Diego Heras
3f19e6becf ncore: fix error caused by #7378 Resolves #7430 (#7431) 2020-03-02 08:02:25 +13:00
Diego Heras
130c0bebbe divxtotal: fix download links and row parsing (#7423) 2020-03-02 08:01:59 +13:00
Diego Heras
b944993733 Remove CsQuery and use AngleSharp instead. Closes #7292 (#7404) 2020-03-02 07:58:14 +13:00
Garfield69
542f8d67e4 torrentleech-pl: andmatch resolves #7424 2020-03-02 07:49:31 +13:00
Diego Heras
35f9e0fbe0 Convert Nordicbits to AngleSharp (#7401) 2020-03-01 19:45:17 +13:00
Diego Heras
db669b31a1 Convert Nordbits to AngleSharp (#7402) 2020-03-01 19:16:15 +13:00
Garfield69
1b64476102 icetorrent: site's hrefs now prefixed with / 2020-03-01 17:22:21 +13:00
Garfield69
5530fa1ca4 crazycorner: magnets no longer available on primary results page. 2020-03-01 17:05:28 +13:00
junglebus
1fb77a6334 Package update (#7413)
All packages except Automapper are now on latest versions
2020-03-01 15:58:46 +13:00
Garfield69
175249d6f0 custom.js: occured -> occurred #7414 2020-03-01 15:52:32 +13:00
Garfield69
f59f73e228 mypornclub: handle date "last year" "last month" 2020-03-01 15:29:44 +13:00
Diego Heras
c1b2328bbf Convert Abnormal to AngleSharp (#7403) 2020-03-01 14:46:34 +13:00
ilike2burnthing
a3c1f3eb52 BTSOW: New Domain btsow.club (#7410) resolves #7280 2020-03-01 12:34:27 +13:00
Cory
f238e78337 Convert Shazbat to AngleSharp (#7400) 2020-03-01 12:27:09 +13:00
Cory
fd8823f6bd Convert XSpeeds to AngleSharp (#7398) 2020-03-01 12:26:46 +13:00
Diego Heras
c14ee124f5 Convert SceneTime to AngleSharp (#7394) 2020-03-01 12:07:41 +13:00
Diego Heras
f4d45517c5 Convert NewRealWorld to AngleSharp (#7393) 2020-03-01 12:07:18 +13:00
Diego Heras
091cfbb310 Convert Pretome to AngleSharp (#7392) 2020-03-01 12:06:58 +13:00
Diego Heras
698050e86a Convert RevolutionTT to AngleSharp (#7391) 2020-03-01 09:38:53 +13:00
Diego Heras
bb3faa3f62 Convert Partis to AngleSharp (#7390) 2020-03-01 09:30:07 +13:00
Diego Heras
08a68e0116 Convert SpeedCD to AngleSharp (#7389) 2020-03-01 09:29:51 +13:00
Diego Heras
d22ef13fb2 Convert TorrentBytes to AngleSharp (#7388) 2020-03-01 09:29:35 +13:00
Diego Heras
d5e2014233 Convert TorrentSyndikat to AngleSharp (#7386) 2020-03-01 08:43:12 +13:00
Diego Heras
dd52a16bff Convert TorrentHaven to AngleSharp (#7387) 2020-03-01 08:42:31 +13:00
Diego Heras
a697aba985 Convert TVStore to AngleSharp (#7385) 2020-03-01 08:42:11 +13:00
Diego Heras
1533ad1927 Convert TorrentLeech to AngleSharp (#7384) 2020-03-01 08:23:09 +13:00
Diego Heras
348461ebfc Convert TorrentDay to AngleSharp (#7383) 2020-03-01 08:22:29 +13:00
Diego Heras
b83a984365 Convert PirateTheNet to AngleSharp (#7382) 2020-03-01 08:20:15 +13:00
junglebus
b07d1a32ca readme: Remove appveyor badge (#7380) 2020-03-01 08:09:55 +13:00
Cory
e3bb63aac4 Convert NCore to AngleSharp (#7378) 2020-03-01 08:03:51 +13:00
Cory
65fc651d88 Convert myAmity to AngleSharp (#7377) 2020-03-01 08:03:13 +13:00
Cory
218e0c989c Convert MoreThanTV to AngleSharp (#7376) 2020-03-01 07:53:36 +13:00
Cory
6f252254e3 Convert ImmortalSeed to AngleSharp (#7375) 2020-03-01 07:53:04 +13:00
Cory
977052dfd7 Convert Hebits to AngleSharp (#7374) 2020-03-01 07:52:35 +13:00
Cory
b78d04c116 Convert HDTorrents to AngleSharp (#7373) 2020-03-01 07:36:37 +13:00
Cory
63267b597e Convert HDOlimpo to AngleSharp (#7372) 2020-03-01 07:35:15 +13:00
Cory
544501d2a8 Convert GimmePeers to AngleSharp (#7371) 2020-03-01 07:33:30 +13:00
Cory
169fda4dbb Convert Fuzer to AngleSharp (#7370) 2020-03-01 07:32:35 +13:00
Cory
d3d78d3662 Convert FunFile to AngleSharp (#7369) 2020-03-01 07:31:54 +13:00
garfield69
2d1175dcc1 azure-pipelines: drop assetUploadMode 2020-03-01 07:30:54 +13:00
Garfield69
0a7f06de31 hdarea: use imdbidShort. resolves #7368 2020-03-01 07:21:17 +13:00
junglebus
9f3f11ac49 Fail build if all artifacts aren't uploaded to Github 2020-02-29 21:36:09 +11:00
junglebus
49affa0555 Revert pipeline log changes 2020-02-29 20:46:46 +11:00
junglebus
f5c482f939 Try and read pipeline logs 2020-02-29 20:31:59 +11:00
junglebus
6c67b7a8de Try and find azure logs 2020-02-29 20:11:15 +11:00
junglebus
368947a061 Try and find pipeline logs 2020-02-29 20:00:24 +11:00
junglebus
f0138405a6 Try and Find log files 2020-02-29 19:46:05 +11:00
Garfield69
8373ee3b0c add mypornclub a public 3x site. resolves #7344 2020-02-29 19:44:00 +13:00
Garfield69
dfaf9dd3a6 filebase: drop debug, comment http only. 2020-02-29 19:24:05 +13:00
Garfield69
c1bde9b643 torrentleech: download_multiplier can be null. #7367 2020-02-29 17:00:01 +13:00
Garfield69
d86c60ffef hdarea: fix login error trap. #7368
update indexer for nexusphp 1.5b4
add config sort options
add uhd movie category
add imdb support
2020-02-29 16:07:08 +13:00
Garfield69
e4cfedfcfb torrentview: new domain *4.net resolves #7365 2020-02-29 12:21:28 +13:00
Garfield69
d3161e7b75 magnet4you, torrent4you: handle xK seelders and leechers. resolves #7364 2020-02-29 12:19:11 +13:00
garfield69
baf4730316 Update azure-pipelines.yml
the azure assetuploadmode=replace routine is missing a retry-upload-after-delete so ends up just removing the conflict but not uploading a replacement, bah!
lets try the the delete option which should clear any attachments prior to starting the first upload.
2020-02-29 11:43:40 +13:00
Diego Heras
a89b69e821 Convert IPTorrents to AngleSharp (#7363) #7292 2020-02-29 11:33:21 +13:00
Cory
4d48c1be44 Convert BB to AngleSharp (#7356) #7292 2020-02-29 11:32:43 +13:00
Cory
8056e47fef Convert HD-Space from csQuery to AngleSharp (#7352) #7292 2020-02-29 11:32:02 +13:00
Cory
63a3465aa6 Convert BitHdtv to AngleSharp (#7358) #7292 2020-02-29 10:42:08 +13:00
Cory
03bbafb0c9 Convert DigitalHive to AngleSharp (#7359) #7292 2020-02-29 10:40:27 +13:00
Cory
d8cbae68d5 Convert FileList to Angle Sharp (#7360) #7292 2020-02-29 10:25:23 +13:00
Cory
99c269c896 Convert BitCityReloaded to AngleSharp (#7357) #7292 2020-02-29 10:24:26 +13:00
Cory
b4075d1d35 Convert BakaBT to AngleSharp (#7355) #7292 2020-02-29 10:23:24 +13:00
Cory
49eebc90e4 Convert AnimeTorrents to AngleSharp (#7354) #7292 2020-02-29 10:22:13 +13:00
Cory
68b25de828 Convert Abstract/AvistazTracker to AngleSharp (#7353) #7292 2020-02-29 10:20:47 +13:00
Garfield69
00104205c0 add U2 (U2分享園@動漫花園) a Private Chinese Anime site. resolves #7337 2020-02-29 10:01:24 +13:00
Garfield69
28b53d8fb1 add boxingtorrents a Private site for boxing. resolves #7323 2020-02-28 19:13:21 +13:00
Garfield69
8a94d689b8 add exkinoray a Russian semi-private site. resolves #7318 2020-02-28 16:46:50 +13:00
gwenvador
ad00e49fe2 generationfree: new login (again!) (#7350) #7341 2020-02-28 16:39:19 +13:00
gwenvador
888361f46f Update generationfree.yml (#7347)
Change login username to correct value
2020-02-27 09:19:09 -06:00
Garfield69
edc4c31fa6 add ttsweb a private site. resolves #7301 2020-02-27 18:40:38 +13:00
Garfield69
a1dde973fb generationfree: site's login has changed. resolves #7341 2020-02-27 16:37:32 +13:00
Garfield69
525f58eb1d xwtorrents: Site's login has changed. resolves #7339 2020-02-27 16:37:07 +13:00
Sen Jiang
124fbf7c1b webui: Optimize favicon.ico with leanify (#7334)
leanify -i 1000 favicon.ico
variation on #7307
2020-02-27 07:30:21 +13:00
Cory
b9b10e4e91 core: Fix IsEmptyOrNull to return true when IsNull (#7338) resolves #7333 2020-02-27 07:24:36 +13:00
Garfield69
427b556869 btdb: fix title / details selector. resolves #7335 2020-02-27 07:22:04 +13:00
Garfield69
04f9f2dfe7 newstudio: fix SxxExx processing. resolves #7331 2020-02-26 20:51:52 +13:00
Garfield69
d8e7a63768 add filmsclub a Russian semi-private site. resolves #7289 2020-02-26 19:10:41 +13:00
Diego Heras
2f694147a1 lostfilm: Remove CsQuery and use AngleSharp instead #7292 (#7328)
also add missing torznab fields not available from results
2020-02-26 09:04:36 +13:00
Diego Heras
c339d54aed core: fix compilation warning (#7329) 2020-02-26 08:48:27 +13:00
Garfield69
58974623de tvchaosuk: update for unit3d 2.2.7 resolves #7327 2020-02-26 08:01:24 +13:00
Cory
889a8da4e5 Convert functions and properties to expression bodies when able (#7312)
Convert functions and properties to expression bodies when able
2020-02-25 10:08:03 -06:00
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
513 changed files with 13351 additions and 9668 deletions

View File

@@ -123,7 +123,7 @@ dotnet_style_prefer_compound_assignment=true:suggestion
############################### ###############################
# Style Definitions # Style Definitions
dotnet_naming_style.pascal_case_style.capitalization=pascal_case dotnet_naming_style.pascal_case_style.capitalization=pascal_case
# Use PascalCase for constant fields # Use PascalCase for constant fields
dotnet_naming_rule.constant_fields_should_be_pascal_case.severity=warning dotnet_naming_rule.constant_fields_should_be_pascal_case.severity=warning
dotnet_naming_rule.constant_fields_should_be_pascal_case.symbols=constant_fields dotnet_naming_rule.constant_fields_should_be_pascal_case.symbols=constant_fields
dotnet_naming_rule.constant_fields_should_be_pascal_case.style=pascal_case_style dotnet_naming_rule.constant_fields_should_be_pascal_case.style=pascal_case_style
@@ -161,11 +161,11 @@ dotnet_naming_rule.asyncmethods_should_be_ends_with_async.style = ends_with_asyn
dotnet_naming_symbols.interface.applicable_kinds = interface dotnet_naming_symbols.interface.applicable_kinds = interface
dotnet_naming_symbols.interface.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected dotnet_naming_symbols.interface.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
dotnet_naming_symbols.interface.required_modifiers = dotnet_naming_symbols.interface.required_modifiers =
dotnet_naming_symbols.private_or_internal_field.applicable_kinds = field dotnet_naming_symbols.private_or_internal_field.applicable_kinds = field
dotnet_naming_symbols.private_or_internal_field.applicable_accessibilities = internal, private, private_protected dotnet_naming_symbols.private_or_internal_field.applicable_accessibilities = internal, private, private_protected
dotnet_naming_symbols.private_or_internal_field.required_modifiers = dotnet_naming_symbols.private_or_internal_field.required_modifiers =
dotnet_naming_symbols.private_or_internal_static_field.applicable_kinds = field dotnet_naming_symbols.private_or_internal_static_field.applicable_kinds = field
dotnet_naming_symbols.private_or_internal_static_field.applicable_accessibilities = internal, private, private_protected dotnet_naming_symbols.private_or_internal_static_field.applicable_accessibilities = internal, private, private_protected
@@ -173,11 +173,11 @@ dotnet_naming_symbols.private_or_internal_static_field.required_modifiers = stat
dotnet_naming_symbols.types.applicable_kinds = class, struct, interface, enum dotnet_naming_symbols.types.applicable_kinds = class, struct, interface, enum
dotnet_naming_symbols.types.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected dotnet_naming_symbols.types.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
dotnet_naming_symbols.types.required_modifiers = dotnet_naming_symbols.types.required_modifiers =
dotnet_naming_symbols.non_field_members.applicable_kinds = property, event, method dotnet_naming_symbols.non_field_members.applicable_kinds = property, event, method
dotnet_naming_symbols.non_field_members.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected dotnet_naming_symbols.non_field_members.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
dotnet_naming_symbols.non_field_members.required_modifiers = dotnet_naming_symbols.non_field_members.required_modifiers =
dotnet_naming_symbols.asyncmethods.applicable_kinds = delegate, method, local_function dotnet_naming_symbols.asyncmethods.applicable_kinds = delegate, method, local_function
dotnet_naming_symbols.asyncmethods.applicable_accessibilities = * dotnet_naming_symbols.asyncmethods.applicable_accessibilities = *
@@ -185,29 +185,29 @@ dotnet_naming_symbols.asyncmethods.required_modifiers = async
# Naming styles # Naming styles
dotnet_naming_style.pascal_case.required_prefix = dotnet_naming_style.pascal_case.required_prefix =
dotnet_naming_style.pascal_case.required_suffix = dotnet_naming_style.pascal_case.required_suffix =
dotnet_naming_style.pascal_case.word_separator = dotnet_naming_style.pascal_case.word_separator =
dotnet_naming_style.pascal_case.capitalization = pascal_case dotnet_naming_style.pascal_case.capitalization = pascal_case
dotnet_naming_style.begins_with_i.required_prefix = I dotnet_naming_style.begins_with_i.required_prefix = I
dotnet_naming_style.begins_with_i.required_suffix = dotnet_naming_style.begins_with_i.required_suffix =
dotnet_naming_style.begins_with_i.word_separator = dotnet_naming_style.begins_with_i.word_separator =
dotnet_naming_style.begins_with_i.capitalization = pascal_case dotnet_naming_style.begins_with_i.capitalization = pascal_case
dotnet_naming_style.private_or_internal_static_with_prefix.required_prefix = s_ dotnet_naming_style.private_or_internal_static_with_prefix.required_prefix = _
dotnet_naming_style.private_or_internal_static_with_prefix.required_suffix = dotnet_naming_style.private_or_internal_static_with_prefix.required_suffix =
dotnet_naming_style.private_or_internal_static_with_prefix.word_separator = dotnet_naming_style.private_or_internal_static_with_prefix.word_separator =
dotnet_naming_style.private_or_internal_static_with_prefix.capitalization = pascal_case dotnet_naming_style.private_or_internal_static_with_prefix.capitalization = pascal_case
dotnet_naming_style.private_prefix.required_prefix = _ dotnet_naming_style.private_prefix.required_prefix = _
dotnet_naming_style.private_prefix.required_suffix = dotnet_naming_style.private_prefix.required_suffix =
dotnet_naming_style.private_prefix.word_separator = dotnet_naming_style.private_prefix.word_separator =
dotnet_naming_style.private_prefix.capitalization = camel_case dotnet_naming_style.private_prefix.capitalization = camel_case
dotnet_naming_style.ends_with_async.required_prefix = dotnet_naming_style.ends_with_async.required_prefix =
dotnet_naming_style.ends_with_async.required_suffix = Async dotnet_naming_style.ends_with_async.required_suffix = Async
dotnet_naming_style.ends_with_async.word_separator = dotnet_naming_style.ends_with_async.word_separator =
dotnet_naming_style.ends_with_async.capitalization = pascal_case dotnet_naming_style.ends_with_async.capitalization = pascal_case
############################### ###############################

19
.gitattributes vendored
View File

@@ -1,16 +1,13 @@
# Set the default behavior, in case people don't have core.autocrlf set. # Set the default behavior, in case people don't have core.autocrlf set.
* text=auto * text=auto
* text eol=lf
# Explicitly declare text files you want to always be normalized and converted
# to native line endings on checkout.
# Declare files that will always have LF line endings on checkout.
*.yml text eol=lf
*.sh text eol=lf
# Declare files that will always have CRLF line endings on checkout.
*.cs text eol=crlf
# Denote all files that are truly binary and should not be modified. # Denote all files that are truly binary and should not be modified.
*.png binary *.eot binary
*.ico binary
*.jpg binary *.jpg binary
*.otf binary
*.png binary
*.ttf binary
*.woff binary
*.woff2 binary

3
.gitignore vendored
View File

@@ -195,9 +195,6 @@ FakesAssemblies/
# Visual Studio 6 workspace options file # Visual Studio 6 workspace options file
*.opt *.opt
/tools /tools
/BuildOutput
/Artifacts
/TestResults
*.DS_Store *.DS_Store
.idea/ .idea/
launchSettings.json launchSettings.json

225
README.md
View File

@@ -2,8 +2,7 @@
[![GitHub issues](https://img.shields.io/github/issues/Jackett/Jackett.svg?maxAge=60&style=flat-square)](https://github.com/Jackett/Jackett/issues) [![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) [![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) [![Build Status](https://dev.azure.com/Jackett-project/Jackett/_apis/build/status/Jackett.Jackett?branchName=master)](https://dev.azure.com/jackett/jackett/_build/latest?definitionId=1&branchName=master)
[![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) [![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/) [![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) [![Discord](https://img.shields.io/badge/discord-chat-7289DA.svg?maxAge=60&style=flat-square)](https://discord.gg/J865QuA)
@@ -19,14 +18,15 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
#### Supported Systems #### Supported Systems
* Windows 7SP1 or greater using .NET 4.6.1 or above [Download here](https://www.microsoft.com/net/framework/versions/net461) * Windows 7SP1 or greater
* Linux [supported operating systems here](https://github.com/dotnet/core/blob/master/release-notes/2.1/2.1-supported-os.md#linux) * Linux [supported operating systems here](https://github.com/dotnet/core/blob/master/release-notes/3.1/3.1-supported-os.md#linux)
* macOS 10.13 or greater * macOS 10.13 or greater
<details> <summary> <b> Supported Public Trackers </b> </summary> <details> <summary> <b> Supported Public Trackers </b> </summary>
* 1337x * 1337x
* 7torrents * 7torrents
* AcademicTorrents
* ACG.RIP * ACG.RIP
* ACGsou * ACGsou
* Anidex * Anidex
@@ -37,9 +37,10 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
* BigFANGroup * BigFANGroup
* BitRu * BitRu
* BitTorrent.AM * BitTorrent.AM
* BT.etree
* BTDB * BTDB
* BTDIGG * BTDIGG
* BT.etree * BTeye
* BTSOW * BTSOW
* Cili180 * Cili180
* ConCen * ConCen
@@ -48,11 +49,11 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
* cpasbienClone * cpasbienClone
* Demonoid * Demonoid
* dmhy * dmhy
* ETTV
* EliteTorrent.biz * EliteTorrent.biz
* EstrenosDTL * EstrenosDTL
* ExtraTorrent.cd * ETTV
* EXT Torrents * EXT Torrents
* ExtraTorrent.cd
* EZTV * EZTV
* Filebase * Filebase
* FireBit * FireBit
@@ -64,16 +65,17 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
* Horrible Subs * Horrible Subs
* IBit * IBit
* Idope * Idope
* Il CorSaRo Blu
* Il Corsaro Nero <!-- maintained by bonny1992 --> * Il Corsaro Nero <!-- maintained by bonny1992 -->
* Il Corsaro Blu
* Internet Archive (archive.org) * Internet Archive (archive.org)
* Isohunt2 * Isohunt2
* iTorrent * iTorrent
* KickAssTorrent (KATcr)
* KickAssTorrent (kat.li) * KickAssTorrent (kat.li)
* KickAssTorrent (KATcr)
* Legit Torrents * Legit Torrents
* LePorno * LePorno
* LimeTorrents * LimeTorrents
* LinuxTracker
* MacTorrents * MacTorrents
* Magnet4You * Magnet4You
* MagnetDL * MagnetDL
@@ -81,28 +83,37 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
* Monova * Monova
* MovCr * MovCr
* MoviesDVDR * MoviesDVDR
* MyPornClub
* Newpct (aka: tvsinpagar, descargas2020, torrentlocura, torrentrapid, tumejortorrent, pctnew, etc) * Newpct (aka: tvsinpagar, descargas2020, torrentlocura, torrentrapid, tumejortorrent, pctnew, etc)
* Newstudio * Newstudio
* Nitro * Nitro
* NNTT * NNTT
* NoName Club (NNM-Club) * NoName Club (NNM-Club)
* Nyaa.si
* Nyaa-Pantsu * Nyaa-Pantsu
* Nyaa.si
* OneJAV
* OxTorrent * OxTorrent
* ParnuXi
* PiratBit * PiratBit
* Pirateiro * Pirateiro
* PornLeech * PornLeech
* PornoLive
* PornoRip
* PornoTor
* ProStyleX * ProStyleX
* Rapidzona
* RARBG * RARBG
* Rus-media * Rus-media
* RuTor * RuTor
* RuTracker.RU
* Seedpeer * Seedpeer
* shokweb * shokweb
* ShowRSS * ShowRSS
* SkyTorrentsClone * SkyTorrentsClone
* SolidTorrents * SolidTorrents
* sukebei.Nyaa.si * sosulki
* sukebei-Pantsu * sukebei-Pantsu
* sukebei.Nyaa.si
* TFile * TFile
* The Pirate Bay (TPB) * The Pirate Bay (TPB)
* Tokyo Tosho * Tokyo Tosho
@@ -110,6 +121,8 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
* Torlock * Torlock
* TOROS * TOROS
* Torrent Downloads (TD) * Torrent Downloads (TD)
* Torrent Oyun indir
* torrent-pirat
* Torrent4You * Torrent4You
* Torrent9 * Torrent9
* Torrent9Clone * Torrent9Clone
@@ -119,19 +132,23 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
* TorrentKitty * TorrentKitty
* TorrentParadise * TorrentParadise
* TorrentProject2 * TorrentProject2
* TorrentRex
* TorrentQuest * TorrentQuest
* Torrents.csv * Torrents.csv
* TorrentWal * Torrentv
* TorrentView
* Torrentz2 * Torrentz2
* Underverse * Underverse
* UnionDHT
* xxxtor
* YourBittorrent * YourBittorrent
* YTS.ag * YTS.ag
* zetorrents
* Zooqle * Zooqle
</details> </details>
<details> <summary> <b> Supported Semi-Private Trackers </b> </summary> <details> <summary> <b> Supported Semi-Private Trackers </b> </summary>
* Alein
* AlexFilm * AlexFilm
* AniDUB * AniDUB
* ArenaBG * ArenaBG
@@ -140,29 +157,33 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
* CasStudioTV * CasStudioTV
* Crazy's Corner * Crazy's Corner
* CzTorrent * CzTorrent
* Deildu
* DXP (Deaf Experts) * DXP (Deaf Experts)
* Deildu
* EniaHD * EniaHD
* Erzsebet
* ExKinoRay
* ExtremlymTorrents * ExtremlymTorrents
* Film-Paleis * FilmsClub
* Gay-Torrents.net * Gay-Torrents.net
* Gay-Torrents.org * Gay-Torrents.org
* HamsterStudio
* HD Dolby * HD Dolby
* HamsterStudio
* IV-Torrents
* KinoNaVse100
* Kinozal * Kinozal
* Korsar * Korsar
* LostFilm.tv * LostFilm.tv
* MVGroup Forum
* MVGroup Main
* Marine Tracker * Marine Tracker
* Metal Tracker * Metal Tracker
* MuziekFrabriek * MuziekFrabriek
* MVGroup Forum
* MVGroup Main
* NetHD (VietTorrent) * NetHD (VietTorrent)
* Pornolab * Pornolab
* RiperAM * RiperAM
* RockBox * RockBox
* Rustorka
* RuTracker * RuTracker
* Rustorka
* Sharewood * Sharewood
* SkTorrent * SkTorrent
* SoundPark * SoundPark
@@ -171,7 +192,6 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
* Torrents-Local * Torrents-Local
* TribalMixes * TribalMixes
* Union Fansub * Union Fansub
* Vanila
* YggTorrent (YGG) * YggTorrent (YGG)
* Ztracker * Ztracker
</details> </details>
@@ -185,6 +205,7 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
* 4thD (4th Dimension) * 4thD (4th Dimension)
* 52PT * 52PT
* 720pier * 720pier
* AST4u
* Abnormal * Abnormal
* Acid Lounge (A-L) * Acid Lounge (A-L)
* Aftershock * Aftershock
@@ -196,54 +217,55 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
* Araba Fenice (Phoenix) * Araba Fenice (Phoenix)
* Asgaard (AG) * Asgaard (AG)
* AsianCinema * AsianCinema
* AST4u
* Audiobook Torrents (ABT)
* AudioNews (AN) * AudioNews (AN)
* Awesome-HD (AHD) * Audiobook Torrents (ABT)
* Avistaz (AsiaTorrents) * Avistaz (AsiaTorrents)
* Back-ups * Awesome-HD (AHD)
* BakaBT
* BaconBits (bB)
* BeiTai
* BeyondHD (BHD)
* Bibliotik
* BIGTorrent * BIGTorrent
* BigTower
* Bit-City Reloaded
* BIT-HDTV * BIT-HDTV
* BiT-TiTAN
* Bithorlo (BHO)
* BitHUmen
* Bitspyder
* BitTorrentFiles
* BitTurk
* BJ-Share (BJ) * BJ-Share (BJ)
* BlueBird
* Blutopia (BLU)
* Brasil Tracker
* BroadcastTheNet (BTN)
* BroadCity
* BRObits * BRObits
* BrokenStones
* BTGigs (TG) * BTGigs (TG)
* BTNext (BTNT) * BTNext (BTNT)
* BTSCHOOL * BTSCHOOL
* Carpathians * Back-ups
* CartoonChaos (CC) * BaconBits (bB)
* CasaTorrent * BakaBT
* BeiTai
* BeyondHD (BHD)
* BiT-TiTAN
* Bibliotik
* BigTower
* Bit-City Reloaded
* BitHUmen
* BitTorrentFiles
* BitTurk
* Bithorlo (BHO)
* Bitspyder
* BlueBird
* Blutopia (BLU)
* Boxing Torrents
* Brasil Tracker
* BroadCity
* BroadcastTheNet (BTN)
* BrokenStones
* CCFBits * CCFBits
* CGPeers * CGPeers
* CHDBits * CHDBits
* Carpathians
* CartoonChaos (CC)
* CasaTorrent
* ChannelX * ChannelX
* Cinemageddon
* CinemaMovies * CinemaMovies
* Cinematik
* CinemaZ (EuTorrents) * CinemaZ (EuTorrents)
* Cinemageddon
* Cinematik
* Classix * Classix
* Concertos * Concertos
* CrazyHD * CrazyHD
* CrazySpirits * CrazySpirits
* CrnaBerza * CrnaBerza
* DXDHD
* DanishBits (DB) * DanishBits (DB)
* Das Unerwartete * Das Unerwartete
* DataScene (DS) * DataScene (DS)
@@ -257,21 +279,21 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
* DocumentaryTorrents (DT) * DocumentaryTorrents (DT)
* Downloadville * Downloadville
* Dragonworld Reloaded * Dragonworld Reloaded
* DXDHD
* EbookParadijs * EbookParadijs
* Ebooks-Shares * Ebooks-Shares
* EfectoDoppler * EfectoDoppler
* EggMeOn
* Elite-Tracker * Elite-Tracker
* Empornium (EMP) * Empornium (EMP)
* eShareNet * EpubLibre
* eStone (XiDER, BeLoad)
* Ethor.net (Thor's Land) * Ethor.net (Thor's Land)
* ExoticaZ (YourExotic)
* ExtremeTorrents * ExtremeTorrents
* FANO.IN * FANO.IN
* Fantastic Heaven
* FeedUrNeed (FuN) * FeedUrNeed (FuN)
* Femdomcult * Femdomcult
* FileList (FL) * FileList (FL)
* Film-Paleis
* FinVip * FinVip
* FocusX * FocusX
* FreeTorrent * FreeTorrent
@@ -279,24 +301,22 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
* FunFile (FF) * FunFile (FF)
* FunkyTorrents (FT) * FunkyTorrents (FT)
* Fuzer (FZ) * Fuzer (FZ)
* Galeriens (LaPauseTorrents)
* GAYtorrent.ru * GAYtorrent.ru
* GFXPeers
* Galeriens (LaPauseTorrents)
* GazelleGames (GGn) * GazelleGames (GGn)
* Generation-Free * Generation-Free
* GFXPeers
* GigaTorrents * GigaTorrents
* GimmePeers (formerly ILT) <!-- maintained by jamesb2147 --> * GimmePeers (formerly ILT)
* GiroTorrent * GiroTorrent
* Greek Legends
* Greek Team * Greek Team
* HacheDe * HD-Bits.com
* HD-Forever (HDF) * HD-Forever (HDF)
* HD-Olimpo * HD-Olimpo
* HD-Only (HDO) * HD-Only (HDO)
* HD-Space (HDS) * HD-Space (HDS)
* HD-Spain * HD-Spain
* HD-Torrents (HDT) * HD-Torrents (HDT)
* HD-Bits.com
* HD4FANS * HD4FANS
* HDArea (HDA) * HDArea (HDA)
* HDBits * HDBits
@@ -313,23 +333,26 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
* HDTurk * HDTurk
* HDU * HDU
* HDZone * HDZone
* HQSource (HQS)
* HacheDe
* Hebits * Hebits
* Hon3y HD * Hon3y HD
* HQSource (HQS) * Horror Site
* HuSh * HuSh
* ICE Torrent * ICE Torrent
* IPTorrents (IPT)
* ImmortalSeed (iS) * ImmortalSeed (iS)
* Immortuos * Immortuos
* inPeril
* Insane Tracker * Insane Tracker
* IPTorrents (IPT)
* JPopsuki * JPopsuki
* Kapaki * Kapaki
* Karagarga * Karagarga
* LegacyHD (HD4Free) * LastFiles
* Le Saloon * Le Saloon
* LeChaudron
* LeagueHD * LeagueHD
* LearnFlakes * LearnFlakes
* LegacyHD (HD4Free)
* LibraNet (LN) * LibraNet (LN)
* LinkoManija * LinkoManija
* LosslessClub * LosslessClub
@@ -337,11 +360,11 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
* Magico (Trellas) * Magico (Trellas)
* Majomparádé (TurkDepo) * Majomparádé (TurkDepo)
* MicroBit (µBit) * MicroBit (µBit)
* MMA-Torrents
* MoeCat * MoeCat
* Mononoké-BT * Mononoké-BT
* MoreThanTV (MTV) * MoreThanTV (MTV)
* MyAnonamouse (MAM) * MyAnonamouse (MAM)
* myAmity
* MySpleen * MySpleen
* NBTorrents * NBTorrents
* NCore * NCore
@@ -351,57 +374,54 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
* New Real World * New Real World
* Norbits * Norbits
* NordicBits (NB) * NordicBits (NB)
* NORDiCHD * Nostalgic (The Archive / VHSTAPES)
* Nostalgic (The Archive)
* notwhat.cd
* OnlineSelfEducation * OnlineSelfEducation
* Orpheus * Orpheus
* Ourbits (HDPter) * Ourbits (HDPter)
* P2PBG * P2PBG
* P2PElite * P2PElite
* PT99
* PTFiles (PTF)
* PThome
* PWTorrents (PWT)
* Partis * Partis
* PassThePopcorn (PTP) * PassThePopcorn (PTP)
* Peers.FM * Peers.FM
* PiXELHD (PxHD)
* PirateTheNet (PTN) * PirateTheNet (PTN)
* PixelCove (Ultimate Gamer) * PixelCove (Ultimate Gamer)
* PiXELHD (PxHD)
* Pleasuredome * Pleasuredome
* PolishSource (PS) * PolishSource (PS)
* PolishTracker * PolishTracker
* Pornbay
* PornBits (PB) * PornBits (PB)
* Pornbay
* Pretome * Pretome
* PrivateHD (PHD) * PrivateHD (PHD)
* ProAudioTorrents (PAT) * ProAudioTorrents (PAT)
* Psytorrents * Psytorrents
* PT99
* PTFiles (PTF)
* PThome
* PuntoTorrent * PuntoTorrent
* PWTorrents (PWT)
* R3V WTF! * R3V WTF!
* RPTorrents
* Racing4Everyone (R4E) * Racing4Everyone (R4E)
* RacingForMe (RFM) * RacingForMe (RFM)
* RainbowNation Sharing (RNS) * RainbowNation Sharing (RNS)
* Redacted (PassTheHeadphones)
* Red Star Torrent (RST) * Red Star Torrent (RST)
* Redacted (PassTheHeadphones)
* RetroFlix * RetroFlix
* RevolutionTT * RevolutionTT
* RoDVD (Cinefiles) * RoDVD (Cinefiles)
* Romanian Metal Torrent (RMT) * Romanian Metal Torrent (RMT)
* RPTorrents * SDBits
* SceneFZ * SceneFZ
* SceneHD * SceneHD
* ScenePalace (SP) * ScenePalace (SP)
* SceneRush * SceneRush
* SceneTime * SceneTime
* SceneXpress
* SDBits
* Secret Cinema * Secret Cinema
* SeedFile (SF) * SeedFile (SF)
* Shareisland
* ShareSpaceDB * ShareSpaceDB
* ShareUniversity * ShareUniversity
* Shareisland
* Shazbat * Shazbat
* Shellife (SL) * Shellife (SL)
* SiamBIT * SiamBIT
@@ -409,61 +429,63 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
* SpaceTorrent * SpaceTorrent
* SpeedCD * SpeedCD
* SpeedTorrent Reloaded * SpeedTorrent Reloaded
* Spirit of Revolution
* SportHD * SportHD
* SportsCult * SportsCult
* SpringSunday * SpringSunday
* SuperBits (SBS) * SuperBits (SBS)
* TEKNO3D
* TLFBits
* TOrrent-tuRK (TORK)
* TTsWEB
* TV Chaos UK (TVCUK)
* TV-Vault
* TVstore
* TakeaByte * TakeaByte
* Tapochek * Tapochek
* Tasmanit * Tasmanit
* TeamHD * TeamHD
* TeamOS * TeamOS
* TEKNO3D
* TellyTorrent * TellyTorrent
* TenYardTorrents (TYT) * TenYardTorrents (TYT)
* TheAudioScene
* TheEmpire (TE)
* The Falling Angels (TFA) * The Falling Angels (TFA)
* The Geeks * The Geeks
* The Horror Charnel (THC) * The Horror Charnel (THC)
* The New Retro * The New Retro
* The Occult * The Occult
* The Place * The Place
* The Resurrection
* The Shinning (TsH) * The Shinning (TsH)
* The Show * The Show
* The-Madhouse
* The Vault * The Vault
* TLFBits * The-Madhouse
* TheAudioScene
* TheEmpire (TE)
* ToTheGlory
* Torrent Network (TN) * Torrent Network (TN)
* Torrent Sector Crew (TSC) * Torrent Sector Crew (TSC)
* Torrent-Syndikat
* Torrent.LT * Torrent.LT
* TorrentBD * TorrentBD
* TorrentBytes (TBy) * TorrentBytes (TBy)
* TorrentCCF (TCCF) * TorrentCCF (TCCF)
* TorrentDay (TD) * TorrentDay (TD)
* Torrentech (TTH)
* TorrentFactory * TorrentFactory
* TorrentHeaven
* TorrentHR * TorrentHR
* Torrenting (TT) * TorrentHeaven
* Torrentland
* TorrentLeech (TL) * TorrentLeech (TL)
* TorrentLeech.pl * TorrentLeech.pl
* TorrentSeeds (TS) * TorrentSeeds (TS)
* Torrent-Syndikat * Torrentech (TTH)
* TOrrent-tuRK (TORK) * Torrenting (TT)
* Torrentland
* TotallyKids (TK) * TotallyKids (TK)
* ToTheGlory
* TranceTraffic * TranceTraffic
* Trezzor * Trezzor
* TurkTorrent (TT) * TurkTorrent (TT)
* TV Chaos UK (TVCUK)
* TV-Vault
* TVstore
* Twilight Torrents * Twilight Torrents
* Twilights Zoom * Twilights Zoom
* u-torrents (SceneFZ) * U-Torrents
* U2 (U2分享園@動漫花園)
* UHDBits * UHDBits
* UnionGang * UnionGang
* UnlimitZ * UnlimitZ
@@ -471,17 +493,22 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
* WDT (Wrestling Desires Torrents / Ultimate Wrestling Torrents) * WDT (Wrestling Desires Torrents / Ultimate Wrestling Torrents)
* World-In-HD * World-In-HD
* World-of-Tomorrow * World-of-Tomorrow
* x-ite.me (XM)
* xBytesV2
* XSpeeds (XS) * XSpeeds (XS)
* XWTorrents (XWT)
* XWT-Classics * XWT-Classics
* XWTorrents (XWT)
* Xthor * Xthor
* XtremeFile
* XtreMeZone (MYXZ) * XtreMeZone (MYXZ)
* ExoticaZ (YourExotic) * XtremeFile
* Zamunda.net * Zamunda.net
* Zelka.org * Zelka.org
* eShareNet
* eStone (XiDER, BeLoad)
* inPeril
* myAmity
* notwhat.cd
* u-torrents (SceneFZ)
* x-ite.me (XM)
* xBytesV2
</details> </details>
Trackers marked with [![(invite needed)][inviteneeded]](#) have no active maintainer and are missing features or are broken. If you have an invite for them please send it to garfieldsixtynine -at- gmail.com to get them fixed/improved. Trackers marked with [![(invite needed)][inviteneeded]](#) have no active maintainer and are missing features or are broken. If you have an invite for them please send it to garfieldsixtynine -at- gmail.com to get them fixed/improved.

View File

@@ -1,20 +1,20 @@
author "sea3pea0" author "sea3pea0"
description "Upstart Script to run NzbDrone as a service on Ubuntu/Debian based systems, as well as others" description "Upstart Script to run NzbDrone as a service on Ubuntu/Debian based systems, as well as others"
#Set username for the process. Should probably be what you use for logging in #Set username for the process. Should probably be what you use for logging in
setuid {username to run jackett} setuid {username to run jackett}
setgid users setgid users
#This is the install directory. If you installed using a deb package or the NzbDrone Repository you do not need to change this #This is the install directory. If you installed using a deb package or the NzbDrone Repository you do not need to change this
env DIR=/opt/Jackett env DIR=/opt/Jackett
env LD_LIBRARY_PATH=/usr/local/nzbdrone/lib env LD_LIBRARY_PATH=/usr/local/nzbdrone/lib
start on runlevel [2345] start on runlevel [2345]
stop on runlevel [016] stop on runlevel [016]
respawn respawn
script script
chdir $DIR chdir $DIR
exec /volume1/@appstore/Mono/usr/bin/mono --debug JackettConsole.exe exec /volume1/@appstore/Mono/usr/bin/mono --debug JackettConsole.exe
end script end script

View File

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

View File

@@ -1,12 +1,19 @@
name: $(majorVersion).$(minorVersion).$(patchVersion) name: $(majorVersion).$(minorVersion).$(patchVersion)
variables: variables:
majorVersion: 0 majorVersion: 0
minorVersion: 13 minorVersion: 14
patchVersion: $[counter(variables['minorVersion'], 1)] #this will reset when we bump minor patchVersion: $[counter(variables['minorVersion'], 1)] #this will reset when we bump minor
jackettVersion: $(majorVersion).$(minorVersion).$(patchVersion) jackettVersion: $(majorVersion).$(minorVersion).$(patchVersion)
buildConfiguration: Release buildConfiguration: Release
netCoreFramework: netcoreapp3.1 netCoreFramework: netcoreapp3.1
netCoreSdkVersion: 3.1.x netCoreSdkVersion: 3.1.x
system.debug: true
pr:
autoCancel: true
trigger:
batch: true
stages: stages:
- stage: BuildJackett - stage: BuildJackett
@@ -321,24 +328,6 @@ stages:
if [[ "$(artifactName)" == *"macOS"* ]]; then sudo ./install_service_macos; fi if [[ "$(artifactName)" == *"macOS"* ]]; then sudo ./install_service_macos; fi
if [[ "$(artifactName)" == *"LinuxAMDx64"* ]]; then sudo ./install_service_systemd.sh; fi if [[ "$(artifactName)" == *"LinuxAMDx64"* ]]; then sudo ./install_service_systemd.sh; fi
#Remove this task once ChromeDriver is deployed to Ubuntu image https://github.com/actions/virtual-environments/issues/9
- task: Bash@3
displayName: Install ChromeDriver (Linux and Mono)
condition: and(succeeded(), eq(variables['imageName'], 'ubuntu-latest'))
inputs:
targetType: inline
script: |
CHROME_VERSION=$(google-chrome --version | cut -f 3 -d ' ' | cut -d '.' -f 1) \
&& CHROMEDRIVER_RELEASE=$(curl --location --fail --retry 3 http://chromedriver.storage.googleapis.com/LATEST_RELEASE_${CHROME_VERSION}) \
&& curl --silent --show-error --location --fail --retry 3 --output /tmp/chromedriver_linux64.zip "http://chromedriver.storage.googleapis.com/$CHROMEDRIVER_RELEASE/chromedriver_linux64.zip" \
&& cd /tmp \
&& unzip chromedriver_linux64.zip \
&& rm -rf chromedriver_linux64.zip \
&& sudo mv chromedriver /usr/local/bin/chromedriver \
&& sudo chmod +x /usr/local/bin/chromedriver \
&& chromedriver --version
echo "##vso[task.setvariable variable=CHROMEWEBDRIVER]/usr/local/bin"
- task: UseDotNet@2 - task: UseDotNet@2
displayName: Install .NET Core SDK displayName: Install .NET Core SDK
inputs: inputs:
@@ -370,17 +359,40 @@ stages:
patterns: '**/Jackett*' patterns: '**/Jackett*'
path: $(Build.ArtifactStagingDirectory) path: $(Build.ArtifactStagingDirectory)
- task: GitHubRelease@0 - task: GitHubRelease@1
displayName: Create Github release displayName: Create Github release
inputs: inputs:
gitHubConnection: github.com_jackett gitHubConnection: github.com_jackett
repositoryName: '$(Build.Repository.Name)' repositoryName: '$(Build.Repository.Name)'
action: create action: create
target: $(Build.SourceVersion) target: $(Build.SourceVersion)
tagSource: manual tagSource: userSpecifiedTag
tag: v$(Build.BuildNumber) tag: v$(Build.BuildNumber)
title: v$(Build.BuildNumber) title: v$(Build.BuildNumber)
assets: $(Build.ArtifactStagingDirectory)/drop/* assets: $(Build.ArtifactStagingDirectory)/drop/*
assetUploadMode: replace
isDraft: true isDraft: true
addChangeLog: true addChangeLog: true
compareWith: lastNonDraftRelease compareWith: lastNonDraftRelease
- task: PowerShell@2
displayName: Ensure all artifacts are uploaded to Github
inputs:
targetType: inline
script: |
$json = Invoke-WebRequest 'https://dev.azure.com/jackett/jackett/_apis/build/builds/$(Build.BuildId)/logs?api-version=5.0' | ConvertFrom-Json
$lastTwoLogUrls = $json.value[-1..-2].url
foreach($logUrl in $lastTwoLogUrls)
{
Write-Output $logUrl
$logText = Invoke-WebRequest $logUrl
if ($logText -like '*Creating a release for tag:*')
{
$logInspect = ($logText -split "Creating a release for tag:")[-1]
$successCount = (Select-String "Uploaded file successfully:" -InputObject $logInspect -AllMatches).Matches.Count
$failureCount = (Select-String "Duplicate asset found:" -InputObject $logInspect -AllMatches).Matches.Count
Write-Output "Success count is: $successCount and failure count is: $failureCount"
if (($successCount -ne 7) -or ($failureCount -ne 0)) { Write-Host "##vso[task.complete result=Failed;]DONE" }
}
}

View File

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

242
build.ps1
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

@@ -1,39 +1,66 @@
#!/bin/bash #!/bin/bash
#Setting up colors # If you have problems installing Jackett, please open an issue on
# https://github.com/Jackett/Jackett/issues
# Setting up colors
BOLDRED="$(printf '\033[1;31m')" BOLDRED="$(printf '\033[1;31m')"
BOLDGREEN="$(printf '\033[1;32m')" BOLDGREEN="$(printf '\033[1;32m')"
NC="$(printf '\033[0m')" # No Color NC="$(printf '\033[0m')" # No Color
# Stop and unload the service if it's running # Check if the install script is running as root
jackettservice="jackett.service" if [ "$EUID" -ne 0 ]; then
systemctl stop ${jackettservice} echo "${BOLDRED}ERROR${NC}: Please run this script as root"
exit 1
fi
# Check if Jackett service is running
JACKETT_SERVICE="jackett.service"
echo "Checking if the service '${JACKETT_SERVICE}' is running ..."
if systemctl is-active --quiet "${JACKETT_SERVICE}"; then
echo "Service '${JACKETT_SERVICE}' is running"
# Stop and unload the service
if systemctl stop "${JACKETT_SERVICE}"; then
echo "Service '${JACKETT_SERVICE}' stopped"
else
echo "${BOLDRED}ERROR${NC}: The service '${JACKETT_SERVICE}' Can not be stopped"
exit 1
fi
else
echo "Service '${JACKETT_SERVICE}' is not running"
fi
# Move working directory to Jackett's # Move working directory to Jackett's
cd "$(dirname "$0")" JACKETT_DIR="$(dirname "$(readlink -f "$0")")"
echo "Jackett will be installed in '${JACKETT_DIR}'"
if ! cd "${JACKETT_DIR}"; then
echo "${BOLDRED}ERROR${NC}: Can not cd into '${JACKETT_DIR}' folder"
exit 1
fi
# Check if we're running from Jackett's directory # Check if we're running from Jackett's directory
if [ ! -f ./jackett ]; then if [ ! -f ./jackett ]; then
echo "${BOLDRED}ERROR${NC}: Couldn't locate jackett. Is the script in the right directory?" echo "${BOLDRED}ERROR${NC}: Can not locate 'jackett' file in '${JACKETT_DIR}'."
echo "Is the script in the right directory?"
exit 1 exit 1
fi fi
jackettdir="$(pwd)"
# Check if Jackett's owner is root # Check if Jackett's owner is root
jackettuser="$(stat -c "%U" ./jackett)" JACKETT_USER="$(stat -c "%U" ./jackett)"
if [ "${jackettuser}" == "root" ]; then if [ "${JACKETT_USER}" == "root" ] || [ "${JACKETT_USER}" == "UNKNOWN" ] ; then
echo "${BOLDRED}ERROR${NC}: Jackett shouldn't run as root. Please, change the owner of the Jackett directory." echo "${BOLDRED}ERROR${NC}: The owner of Jackett directory is '${JACKETT_USER}'."
exit 1 echo "Please, change the owner with the command 'chown <user>:<user> -R \"${JACKETT_DIR}\"'"
fi echo "The user <user> will be used to run Jackett."
# Check that no other service called Jackett is already running
if [[ $(systemctl status ${jackettservice} | grep "active (running)") ]]; then
echo "${BOLDRED}ERROR${NC}: Jackett already seems to be running as a service. Please stop it before running this script again."
exit 1 exit 1
fi fi
echo "Jackett will be executed with the user '${JACKETT_USER}'"
# Write the systemd service descriptor # Write the systemd service descriptor
cat >"/etc/systemd/system/${jackettservice}" <<EOL JACKETT_SERVICE_PATH="/etc/systemd/system/${JACKETT_SERVICE}"
echo "Creating Jackett unit file in '${JACKETT_SERVICE_PATH}' ..."
cat > "${JACKETT_SERVICE_PATH}" <<EOL
[Unit] [Unit]
Description=Jackett Daemon Description=Jackett Daemon
After=network.target After=network.target
@@ -43,35 +70,39 @@ SyslogIdentifier=jackett
Restart=always Restart=always
RestartSec=5 RestartSec=5
Type=simple Type=simple
User=${jackettuser} User=${JACKETT_USER}
Group=${jackettuser} Group=${JACKETT_USER}
WorkingDirectory=${jackettdir} WorkingDirectory=${JACKETT_DIR}
ExecStart=${jackettdir}/jackett_launcher.sh ExecStart=/bin/sh "${JACKETT_DIR}/jackett_launcher.sh"
TimeoutStopSec=20 TimeoutStopSec=30
[Install] [Install]
WantedBy=multi-user.target WantedBy=multi-user.target
EOL EOL
if [ $? -ne 0 ]; then
echo "${BOLDRED}ERROR${NC}: Can not create the file '${JACKETT_SERVICE_PATH}'"
echo "The UnitPath of systemd changes from one distribution to another. You may have to edit the script and change the path manually."
exit 1
fi
echo "Installing Jackett service ..."
# Reload systemd daemon # Reload systemd daemon
systemctl daemon-reload if ! systemctl daemon-reload; then
echo "${BOLDRED}ERROR${NC}: Can not reload systemd daemon"
exit 1
fi
# Enable the service for following restarts # Enable the service for following restarts
systemctl enable ${jackettservice} if ! systemctl enable "${JACKETT_SERVICE}"; then
echo "${BOLDRED}ERROR${NC}: Can not enable the service '${JACKETT_SERVICE}'"
exit 1
fi
# Run the service # Run the service
systemctl start ${jackettservice} if systemctl start "${JACKETT_SERVICE}"; then
echo "${BOLDGREEN}Service successfully installed and launched!${NC}"
# Check that it's running
if [[ $(systemctl status ${jackettservice} | grep "active (running)") ]]; then
echo "${BOLDGREEN}Agent successfully installed and launched!${NC}"
else else
cat << EOL echo "${BOLDRED}ERROR${NC}: Can not start the service '${JACKETT_SERVICE}'"
${BOLDRED}ERROR${NC}: Could not launch service. The installation might have failed. exit 1
Please open an issue on https://github.com/Jackett/Jackett/issues and paste following information:
Jackett directory: \`${jackettdir}\`
Jackett user: \`${jackettuser}\`
EOL
fi fi

View File

@@ -1,43 +1,75 @@
#!/bin/bash #!/bin/bash
#Setting up colors # If you have problems installing Jackett, please open an issue on
# https://github.com/Jackett/Jackett/issues
# Setting up colors
BOLDRED="$(printf '\033[1;31m')" BOLDRED="$(printf '\033[1;31m')"
BOLDGREEN="$(printf '\033[1;32m')" BOLDGREEN="$(printf '\033[1;32m')"
NC="$(printf '\033[0m')" # No Color NC="$(printf '\033[0m')" # No Color
# Stop and unload the service if it's running # Check if the install script is running as root
jackettservice="jackett.service" if [ "$EUID" -ne 0 ]; then
systemctl stop ${jackettservice} echo "${BOLDRED}ERROR${NC}: Please run this script as root"
exit 1
fi
# Check if Jackett service is running
JACKETT_SERVICE="jackett.service"
echo "Checking if the service '${JACKETT_SERVICE}' is running ..."
if systemctl is-active --quiet "${JACKETT_SERVICE}"; then
echo "Service '${JACKETT_SERVICE}' is running"
# Stop and unload the service
if systemctl stop "${JACKETT_SERVICE}"; then
echo "Service '${JACKETT_SERVICE}' stopped"
else
echo "${BOLDRED}ERROR${NC}: The service '${JACKETT_SERVICE}' Can not be stopped"
exit 1
fi
else
echo "Service '${JACKETT_SERVICE}' is not running"
fi
# Move working directory to Jackett's # Move working directory to Jackett's
cd "$(dirname "$0")" JACKETT_DIR="$(dirname "$(readlink -f "$0")")"
echo "Jackett will be installed in '${JACKETT_DIR}'"
if ! cd "${JACKETT_DIR}"; then
echo "${BOLDRED}ERROR${NC}: Can not cd into '${JACKETT_DIR}' folder"
exit 1
fi
# Check if we're running from Jackett's directory # Check if we're running from Jackett's directory
if [ ! -f ./JackettConsole.exe ]; then if [ ! -f ./JackettConsole.exe ]; then
echo "${BOLDRED}ERROR${NC}: Couldn't locate JackettConsole.exe. Is the script in the right directory?" echo "${BOLDRED}ERROR${NC}: Can not locate 'JackettConsole.exe' file in '${JACKETT_DIR}'."
echo "Is the script in the right directory?"
exit 1 exit 1
fi fi
jackettdir="$(pwd)"
# Check if Jackett's owner is root # Check if Jackett's owner is root
jackettuser="$(stat -c "%U" ./JackettConsole.exe)" JACKETT_USER="$(stat -c "%U" ./JackettConsole.exe)"
if [ "${jackettuser}" == "root" ]; then if [ "${JACKETT_USER}" == "root" ] || [ "${JACKETT_USER}" == "UNKNOWN" ] ; then
echo "${BOLDRED}ERROR${NC}: Jackett shouldn't run as root. Please, change the owner of the Jackett directory." echo "${BOLDRED}ERROR${NC}: The owner of Jackett directory is '${JACKETT_USER}'."
echo "Please, change the owner with the command 'chown <user>:<user> -R \"${JACKETT_DIR}\"'"
echo "The user <user> will be used to run Jackett."
exit 1 exit 1
fi fi
echo "Jackett will be executed with the user '${JACKETT_USER}'"
# Check if mono is installed # Check if Mono is installed
command -v mono >/dev/null 2>&1 || { echo >&2 "${BOLDRED}ERROR${NC}: Jackett requires Mono but it's not installed. Aborting."; exit 1; } echo "Checking if Mono is installed ..."
monodir="$(dirname $(command -v mono))" if ! command -v mono > /dev/null; then
echo "${BOLDRED}ERROR${NC}: Jackett requires Mono but it's not installed"
# Check that no other service called Jackett is already running
if [[ $(systemctl status ${jackettservice} | grep "active (running)") ]]; then
echo "${BOLDRED}ERROR${NC}: Jackett already seems to be running as a service. Please stop it before running this script again."
exit 1 exit 1
fi fi
MONO_DIR="$(dirname "$(command -v mono)")"
echo "Mono is installed in '${MONO_DIR}'"
# Write the systemd service descriptor # Write the systemd service descriptor
cat >"/etc/systemd/system/${jackettservice}" <<EOL JACKETT_SERVICE_PATH="/etc/systemd/system/${JACKETT_SERVICE}"
echo "Creating Jackett unit file in '${JACKETT_SERVICE_PATH}' ..."
cat > "${JACKETT_SERVICE_PATH}" <<EOL
[Unit] [Unit]
Description=Jackett Daemon Description=Jackett Daemon
After=network.target After=network.target
@@ -47,36 +79,39 @@ SyslogIdentifier=jackett
Restart=always Restart=always
RestartSec=5 RestartSec=5
Type=simple Type=simple
User=${jackettuser} User=${JACKETT_USER}
Group=${jackettuser} Group=${JACKETT_USER}
WorkingDirectory=${jackettdir} WorkingDirectory=${JACKETT_DIR}
ExecStart=${monodir}/mono --debug ${jackettdir}/JackettConsole.exe --NoRestart ExecStart="${MONO_DIR}/mono" --debug "${JACKETT_DIR}/JackettConsole.exe" --NoRestart
TimeoutStopSec=20 TimeoutStopSec=30
[Install] [Install]
WantedBy=multi-user.target WantedBy=multi-user.target
EOL EOL
if [ $? -ne 0 ]; then
echo "${BOLDRED}ERROR${NC}: Can not create the file '${JACKETT_SERVICE_PATH}'"
echo "The UnitPath of systemd changes from one distribution to another. You may have to edit the script and change the path manually."
exit 1
fi
echo "Installing Jackett service ..."
# Reload systemd daemon # Reload systemd daemon
systemctl daemon-reload if ! systemctl daemon-reload; then
echo "${BOLDRED}ERROR${NC}: Can not reload systemd daemon"
exit 1
fi
# Enable the service for following restarts # Enable the service for following restarts
systemctl enable ${jackettservice} if ! systemctl enable "${JACKETT_SERVICE}"; then
echo "${BOLDRED}ERROR${NC}: Can not enable the service '${JACKETT_SERVICE}'"
exit 1
fi
# Run the service # Run the service
systemctl start ${jackettservice} if systemctl start "${JACKETT_SERVICE}"; then
echo "${BOLDGREEN}Service successfully installed and launched!${NC}"
# Check that it's running
if [[ $(systemctl status ${jackettservice} | grep "active (running)") ]]; then
echo "${BOLDGREEN}Agent successfully installed and launched!${NC}"
else else
cat << EOL echo "${BOLDRED}ERROR${NC}: Can not start the service '${JACKETT_SERVICE}'"
${BOLDRED}ERROR${NC}: Could not launch service. The installation might have failed. exit 1
Please open an issue on https://github.com/Jackett/Jackett/issues and paste following information:
Mono directory: \`${monodir}\`
Jackett directory: \`${jackettdir}\`
Jackett user: \`${jackettuser}\`
EOL
fi fi

View File

@@ -7,12 +7,12 @@
JACKETT_DIR="$(dirname "$(readlink -f "$0")")" JACKETT_DIR="$(dirname "$(readlink -f "$0")")"
# Launch Jackett # Launch Jackett
${JACKETT_DIR}/jackett --NoRestart "${JACKETT_DIR}/jackett" --NoRestart
# Get user running the service # Get user running the service
JACKETT_USER=$(whoami) JACKETT_USER=$(whoami)
# Wait until the updater ends # Wait until the updater ends
while pgrep -u ${JACKETT_USER} JackettUpdater > /dev/null; do while pgrep -u "${JACKETT_USER}" JackettUpdater > /dev/null; do
sleep 1 sleep 1
done done

View File

@@ -9,6 +9,10 @@
using System; using System;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
// ReSharper disable NotAccessedField.Global
// ReSharper disable MemberCanBePrivate.Global
// ReSharper disable UnusedMember.Global
namespace DateTimeRoutines namespace DateTimeRoutines
{ {
/// <summary> /// <summary>
@@ -21,11 +25,11 @@ namespace DateTimeRoutines
/// <summary> /// <summary>
/// Amount of seconds elapsed between 1970-01-01 00:00:00 and the date-time. /// Amount of seconds elapsed between 1970-01-01 00:00:00 and the date-time.
/// </summary> /// </summary>
/// <param name="date_time">date-time</param> /// <param name="dateTime">date-time</param>
/// <returns>seconds</returns> /// <returns>seconds</returns>
public static uint GetSecondsSinceUnixEpoch(this DateTime date_time) public static uint GetSecondsSinceUnixEpoch(this DateTime dateTime)
{ {
var t = date_time - new DateTime(1970, 1, 1); var t = dateTime - new DateTime(1970, 1, 1);
var ss = (int)t.TotalSeconds; var ss = (int)t.TotalSeconds;
if (ss < 0) if (ss < 0)
return 0; return 0;
@@ -44,19 +48,19 @@ namespace DateTimeRoutines
/// <summary> /// <summary>
/// Index of first char of a date substring found in the string /// Index of first char of a date substring found in the string
/// </summary> /// </summary>
public readonly int IndexOfDate = -1; public readonly int IndexOfDate;
/// <summary> /// <summary>
/// Length a date substring found in the string /// Length a date substring found in the string
/// </summary> /// </summary>
public readonly int LengthOfDate = -1; public readonly int LengthOfDate;
/// <summary> /// <summary>
/// Index of first char of a time substring found in the string /// Index of first char of a time substring found in the string
/// </summary> /// </summary>
public readonly int IndexOfTime = -1; public readonly int IndexOfTime;
/// <summary> /// <summary>
/// Length of a time substring found in the string /// Length of a time substring found in the string
/// </summary> /// </summary>
public readonly int LengthOfTime = -1; public readonly int LengthOfTime;
/// <summary> /// <summary>
/// DateTime found in the string /// DateTime found in the string
/// </summary> /// </summary>
@@ -82,45 +86,45 @@ namespace DateTimeRoutines
/// </summary> /// </summary>
public DateTime UtcDateTime; public DateTime UtcDateTime;
internal ParsedDateTime(int index_of_date, int length_of_date, int index_of_time, int length_of_time, DateTime date_time) internal ParsedDateTime(int indexOfDate, int lengthOfDate, int indexOfTime, int lengthOfTime, DateTime dateTime)
{ {
IndexOfDate = index_of_date; IndexOfDate = indexOfDate;
LengthOfDate = length_of_date; LengthOfDate = lengthOfDate;
IndexOfTime = index_of_time; IndexOfTime = indexOfTime;
LengthOfTime = length_of_time; LengthOfTime = lengthOfTime;
DateTime = date_time; DateTime = dateTime;
IsDateFound = index_of_date > -1; IsDateFound = indexOfDate > -1;
IsTimeFound = index_of_time > -1; IsTimeFound = indexOfTime > -1;
UtcOffset = new TimeSpan(25, 0, 0); UtcOffset = new TimeSpan(25, 0, 0);
IsUtcOffsetFound = false; IsUtcOffsetFound = false;
UtcDateTime = new DateTime(1, 1, 1); UtcDateTime = new DateTime(1, 1, 1);
} }
internal ParsedDateTime(int index_of_date, int length_of_date, int index_of_time, int length_of_time, DateTime date_time, TimeSpan utc_offset) internal ParsedDateTime(int indexOfDate, int lengthOfDate, int indexOfTime, int lengthOfTime, DateTime dateTime, TimeSpan utcOffset)
{ {
IndexOfDate = index_of_date; IndexOfDate = indexOfDate;
LengthOfDate = length_of_date; LengthOfDate = lengthOfDate;
IndexOfTime = index_of_time; IndexOfTime = indexOfTime;
LengthOfTime = length_of_time; LengthOfTime = lengthOfTime;
DateTime = date_time; DateTime = dateTime;
IsDateFound = index_of_date > -1; IsDateFound = indexOfDate > -1;
IsTimeFound = index_of_time > -1; IsTimeFound = indexOfTime > -1;
UtcOffset = utc_offset; UtcOffset = utcOffset;
IsUtcOffsetFound = Math.Abs(utc_offset.TotalHours) < 12; IsUtcOffsetFound = Math.Abs(utcOffset.TotalHours) < 12;
if (!IsUtcOffsetFound) if (!IsUtcOffsetFound)
UtcDateTime = new DateTime(1, 1, 1); UtcDateTime = new DateTime(1, 1, 1);
else else
{ {
if (index_of_date < 0)//to avoid negative date exception when date is undefined if (indexOfDate < 0)//to avoid negative date exception when date is undefined
{ {
var ts = date_time.TimeOfDay + utc_offset; var ts = dateTime.TimeOfDay + utcOffset;
if (ts < new TimeSpan(0)) if (ts < new TimeSpan(0))
UtcDateTime = new DateTime(1, 1, 2) + ts; UtcDateTime = new DateTime(1, 1, 2) + ts;
else else
UtcDateTime = new DateTime(1, 1, 1) + ts; UtcDateTime = new DateTime(1, 1, 1) + ts;
} }
else else
UtcDateTime = date_time + utc_offset; UtcDateTime = dateTime + utcOffset;
} }
} }
} }
@@ -129,7 +133,7 @@ namespace DateTimeRoutines
/// Date that is accepted in the following cases: /// Date that is accepted in the following cases:
/// - no date was parsed by TryParseDateOrTime(); /// - no date was parsed by TryParseDateOrTime();
/// - no year was found by TryParseDate(); /// - no year was found by TryParseDate();
/// It is ignored if DefaultDateIsNow = true was set after DefaultDate /// It is ignored if DefaultDateIsNow = true was set after DefaultDate
/// </summary> /// </summary>
public static DateTime DefaultDate public static DateTime DefaultDate
{ {
@@ -138,13 +142,7 @@ namespace DateTimeRoutines
_DefaultDate = value; _DefaultDate = value;
DefaultDateIsNow = false; DefaultDateIsNow = false;
} }
get get => DefaultDateIsNow ? DateTime.Now : _DefaultDate;
{
if (DefaultDateIsNow)
return DateTime.Now;
else
return _DefaultDate;
}
} }
private static DateTime _DefaultDate = DateTime.Now; private static DateTime _DefaultDate = DateTime.Now;
@@ -157,16 +155,17 @@ namespace DateTimeRoutines
/// <summary> /// <summary>
/// Defines default date-time format. /// Defines default date-time format.
/// </summary> /// </summary>
[Flags]
public enum DateTimeFormat public enum DateTimeFormat
{ {
/// <summary> /// <summary>
/// month number goes before day number /// month number goes before day number
/// </summary> /// </summary>
USA_DATE, UsaDate,
/// <summary> /// <summary>
/// day number goes before month number /// day number goes before month number
/// </summary> /// </summary>
UK_DATE, UkDate,
///// <summary> ///// <summary>
///// time is specifed through AM or PM ///// time is specifed through AM or PM
///// </summary> ///// </summary>
@@ -178,79 +177,79 @@ namespace DateTimeRoutines
#region parsing derived methods for DateTime output #region parsing derived methods for DateTime output
/// <summary> /// <summary>
/// Tries to find date and time within the passed string and return it as DateTime structure. /// Tries to find date and time within the passed string and return it as DateTime structure.
/// </summary> /// </summary>
/// <param name="str">string that contains date and/or time</param> /// <param name="str">string that contains date and/or time</param>
/// <param name="default_format">format to be used preferably in ambivalent instances</param> /// <param name="defaultFormat">format to be used preferably in ambivalent instances</param>
/// <param name="date_time">parsed date-time output</param> /// <param name="dateTime">parsed date-time output</param>
/// <returns>true if both date and time were found, else false</returns> /// <returns>true if both date and time were found, else false</returns>
public static bool TryParseDateTime(this string str, DateTimeFormat default_format, out DateTime date_time) public static bool TryParseDateTime(this string str, DateTimeFormat defaultFormat, out DateTime dateTime)
{ {
if (!TryParseDateTime(str, default_format, out ParsedDateTime parsed_date_time)) if (!TryParseDateTime(str, defaultFormat, out ParsedDateTime parsedDateTime))
{ {
date_time = new DateTime(1, 1, 1); dateTime = new DateTime(1, 1, 1);
return false; return false;
} }
date_time = parsed_date_time.DateTime; dateTime = parsedDateTime.DateTime;
return true; return true;
} }
/// <summary> /// <summary>
/// Tries to find date and/or time within the passed string and return it as DateTime structure. /// Tries to find date and/or time within the passed string and return it as DateTime structure.
/// If only date was found, time in the returned DateTime is always 0:0:0. /// If only date was found, time in the returned DateTime is always 0:0:0.
/// If only time was found, date in the returned DateTime is DefaultDate. /// If only time was found, date in the returned DateTime is DefaultDate.
/// </summary> /// </summary>
/// <param name="str">string that contains date and(or) time</param> /// <param name="str">string that contains date and(or) time</param>
/// <param name="default_format">format to be used preferably in ambivalent instances</param> /// <param name="defaultFormat">format to be used preferably in ambivalent instances</param>
/// <param name="date_time">parsed date-time output</param> /// <param name="dateTime">parsed date-time output</param>
/// <returns>true if date and/or time was found, else false</returns> /// <returns>true if date and/or time was found, else false</returns>
public static bool TryParseDateOrTime(this string str, DateTimeFormat default_format, out DateTime date_time) public static bool TryParseDateOrTime(this string str, DateTimeFormat defaultFormat, out DateTime dateTime)
{ {
if (!TryParseDateOrTime(str, default_format, out ParsedDateTime parsed_date_time)) if (!TryParseDateOrTime(str, defaultFormat, out ParsedDateTime parsedDateTime))
{ {
date_time = new DateTime(1, 1, 1); dateTime = new DateTime(1, 1, 1);
return false; return false;
} }
date_time = parsed_date_time.DateTime; dateTime = parsedDateTime.DateTime;
return true; return true;
} }
/// <summary> /// <summary>
/// Tries to find time within the passed string and return it as DateTime structure. /// Tries to find time within the passed string and return it as DateTime structure.
/// It recognizes only time while ignoring date, so date in the returned DateTime is always 1/1/1. /// It recognizes only time while ignoring date, so date in the returned DateTime is always 1/1/1.
/// </summary> /// </summary>
/// <param name="str">string that contains time</param> /// <param name="str">string that contains time</param>
/// <param name="default_format">format to be used preferably in ambivalent instances</param> /// <param name="defaultFormat">format to be used preferably in ambivalent instances</param>
/// <param name="time">parsed time output</param> /// <param name="time">parsed time output</param>
/// <returns>true if time was found, else false</returns> /// <returns>true if time was found, else false</returns>
public static bool TryParseTime(this string str, DateTimeFormat default_format, out DateTime time) public static bool TryParseTime(this string str, DateTimeFormat defaultFormat, out DateTime time)
{ {
if (!TryParseTime(str, default_format, out var parsed_time, null)) if (!TryParseTime(str, defaultFormat, out var parsedTime, null))
{ {
time = new DateTime(1, 1, 1); time = new DateTime(1, 1, 1);
return false; return false;
} }
time = parsed_time.DateTime; time = parsedTime.DateTime;
return true; return true;
} }
/// <summary> /// <summary>
/// Tries to find date within the passed string and return it as DateTime structure. /// Tries to find date within the passed string and return it as DateTime structure.
/// It recognizes only date while ignoring time, so time in the returned DateTime is always 0:0:0. /// It recognizes only date while ignoring time, so time in the returned DateTime is always 0:0:0.
/// If year of the date was not found then it accepts the current year. /// If year of the date was not found then it accepts the current year.
/// </summary> /// </summary>
/// <param name="str">string that contains date</param> /// <param name="str">string that contains date</param>
/// <param name="default_format">format to be used preferably in ambivalent instances</param> /// <param name="defaultFormat">format to be used preferably in ambivalent instances</param>
/// <param name="date">parsed date output</param> /// <param name="date">parsed date output</param>
/// <returns>true if date was found, else false</returns> /// <returns>true if date was found, else false</returns>
public static bool TryParseDate(this string str, DateTimeFormat default_format, out DateTime date) public static bool TryParseDate(this string str, DateTimeFormat defaultFormat, out DateTime date)
{ {
if (!TryParseDate(str, default_format, out ParsedDateTime parsed_date)) if (!TryParseDate(str, defaultFormat, out ParsedDateTime parsedDate))
{ {
date = new DateTime(1, 1, 1); date = new DateTime(1, 1, 1);
return false; return false;
} }
date = parsed_date.DateTime; date = parsedDate.DateTime;
return true; return true;
} }
@@ -259,71 +258,69 @@ namespace DateTimeRoutines
#region parsing derived methods for ParsedDateTime output #region parsing derived methods for ParsedDateTime output
/// <summary> /// <summary>
/// Tries to find date and time within the passed string and return it as ParsedDateTime object. /// Tries to find date and time within the passed string and return it as ParsedDateTime object.
/// </summary> /// </summary>
/// <param name="str">string that contains date-time</param> /// <param name="str">string that contains date-time</param>
/// <param name="default_format">format to be used preferably in ambivalent instances</param> /// <param name="defaultFormat">format to be used preferably in ambivalent instances</param>
/// <param name="parsed_date_time">parsed date-time output</param> /// <param name="parsedDateTime">parsed date-time output</param>
/// <returns>true if both date and time were found, else false</returns> /// <returns>true if both date and time were found, else false</returns>
public static bool TryParseDateTime(this string str, DateTimeFormat default_format, out ParsedDateTime parsed_date_time) public static bool TryParseDateTime(this string str, DateTimeFormat defaultFormat, out ParsedDateTime parsedDateTime)
{ {
if (DateTimeRoutines.TryParseDateOrTime(str, default_format, out parsed_date_time) if (TryParseDateOrTime(str, defaultFormat, out parsedDateTime)
&& parsed_date_time.IsDateFound && parsedDateTime.IsDateFound
&& parsed_date_time.IsTimeFound && parsedDateTime.IsTimeFound
) )
return true; return true;
parsed_date_time = null; parsedDateTime = null;
return false; return false;
} }
/// <summary> /// <summary>
/// Tries to find time within the passed string and return it as ParsedDateTime object. /// Tries to find time within the passed string and return it as ParsedDateTime object.
/// It recognizes only time while ignoring date, so date in the returned ParsedDateTime is always 1/1/1 /// It recognizes only time while ignoring date, so date in the returned ParsedDateTime is always 1/1/1
/// </summary> /// </summary>
/// <param name="str">string that contains date-time</param> /// <param name="str">string that contains date-time</param>
/// <param name="default_format">format to be used preferably in ambivalent instances</param> /// <param name="defaultFormat">format to be used preferably in ambivalent instances</param>
/// <param name="parsed_time">parsed date-time output</param> /// <param name="parsedTime">parsed date-time output</param>
/// <returns>true if time was found, else false</returns> /// <returns>true if time was found, else false</returns>
public static bool TryParseTime(this string str, DateTimeFormat default_format, out ParsedDateTime parsed_time) public static bool TryParseTime(this string str, DateTimeFormat defaultFormat, out ParsedDateTime parsedTime)
{ => TryParseTime(str, defaultFormat, out parsedTime, null);
return TryParseTime(str, default_format, out parsed_time, null);
}
/// <summary> /// <summary>
/// Tries to find date and/or time within the passed string and return it as ParsedDateTime object. /// Tries to find date and/or time within the passed string and return it as ParsedDateTime object.
/// If only date was found, time in the returned ParsedDateTime is always 0:0:0. /// If only date was found, time in the returned ParsedDateTime is always 0:0:0.
/// If only time was found, date in the returned ParsedDateTime is DefaultDate. /// If only time was found, date in the returned ParsedDateTime is DefaultDate.
/// </summary> /// </summary>
/// <param name="str">string that contains date-time</param> /// <param name="str">string that contains date-time</param>
/// <param name="default_format">format to be used preferably in ambivalent instances</param> /// <param name="defaultFormat">format to be used preferably in ambivalent instances</param>
/// <param name="parsed_date_time">parsed date-time output</param> /// <param name="parsedDateTime">parsed date-time output</param>
/// <returns>true if date or time was found, else false</returns> /// <returns>true if date or time was found, else false</returns>
public static bool TryParseDateOrTime(this string str, DateTimeFormat default_format, out ParsedDateTime parsed_date_time) public static bool TryParseDateOrTime(this string str, DateTimeFormat defaultFormat, out ParsedDateTime parsedDateTime)
{ {
parsed_date_time = null; parsedDateTime = null;
ParsedDateTime parsed_time; ParsedDateTime parsedTime;
if (!TryParseDate(str, default_format, out if (!TryParseDate(str, defaultFormat, out
ParsedDateTime parsed_date)) ParsedDateTime parsedDate))
{ {
if (!TryParseTime(str, default_format, out parsed_time, null)) if (!TryParseTime(str, defaultFormat, out parsedTime, null))
return false; return false;
var date_time = new DateTime(DefaultDate.Year, DefaultDate.Month, DefaultDate.Day, parsed_time.DateTime.Hour, parsed_time.DateTime.Minute, parsed_time.DateTime.Second); var dateTime = new DateTime(DefaultDate.Year, DefaultDate.Month, DefaultDate.Day, parsedTime.DateTime.Hour, parsedTime.DateTime.Minute, parsedTime.DateTime.Second);
parsed_date_time = new ParsedDateTime(-1, -1, parsed_time.IndexOfTime, parsed_time.LengthOfTime, date_time, parsed_time.UtcOffset); parsedDateTime = new ParsedDateTime(-1, -1, parsedTime.IndexOfTime, parsedTime.LengthOfTime, dateTime, parsedTime.UtcOffset);
} }
else else
{ {
if (!TryParseTime(str, default_format, out parsed_time, parsed_date)) if (!TryParseTime(str, defaultFormat, out parsedTime, parsedDate))
{ {
var date_time = new DateTime(parsed_date.DateTime.Year, parsed_date.DateTime.Month, parsed_date.DateTime.Day, 0, 0, 0); var dateTime = new DateTime(parsedDate.DateTime.Year, parsedDate.DateTime.Month, parsedDate.DateTime.Day, 0, 0, 0);
parsed_date_time = new ParsedDateTime(parsed_date.IndexOfDate, parsed_date.LengthOfDate, -1, -1, date_time); parsedDateTime = new ParsedDateTime(parsedDate.IndexOfDate, parsedDate.LengthOfDate, -1, -1, dateTime);
} }
else else
{ {
var date_time = new DateTime(parsed_date.DateTime.Year, parsed_date.DateTime.Month, parsed_date.DateTime.Day, parsed_time.DateTime.Hour, parsed_time.DateTime.Minute, parsed_time.DateTime.Second); var dateTime = new DateTime(parsedDate.DateTime.Year, parsedDate.DateTime.Month, parsedDate.DateTime.Day, parsedTime.DateTime.Hour, parsedTime.DateTime.Minute, parsedTime.DateTime.Second);
parsed_date_time = new ParsedDateTime(parsed_date.IndexOfDate, parsed_date.LengthOfDate, parsed_time.IndexOfTime, parsed_time.LengthOfTime, date_time, parsed_time.UtcOffset); parsedDateTime = new ParsedDateTime(parsedDate.IndexOfDate, parsedDate.LengthOfDate, parsedTime.IndexOfTime, parsedTime.LengthOfTime, dateTime, parsedTime.UtcOffset);
} }
} }
@@ -339,42 +336,39 @@ namespace DateTimeRoutines
/// It recognizes only time while ignoring date, so date in the returned ParsedDateTime is always 1/1/1 /// It recognizes only time while ignoring date, so date in the returned ParsedDateTime is always 1/1/1
/// </summary> /// </summary>
/// <param name="str">string that contains date</param> /// <param name="str">string that contains date</param>
/// <param name="default_format">format to be used preferably in ambivalent instances</param> /// <param name="defaultFormat">format to be used preferably in ambivalent instances</param>
/// <param name="parsed_time">parsed date-time output</param> /// <param name="parsedTime">parsed date-time output</param>
/// <param name="parsed_date">ParsedDateTime object if the date was found within this string, else NULL</param> /// <param name="parsedDate">ParsedDateTime object if the date was found within this string, else NULL</param>
/// <returns>true if time was found, else false</returns> /// <returns>true if time was found, else false</returns>
public static bool TryParseTime(this string str, DateTimeFormat default_format, out ParsedDateTime parsed_time, ParsedDateTime parsed_date) public static bool TryParseTime(this string str, DateTimeFormat defaultFormat, out ParsedDateTime parsedTime, ParsedDateTime parsedDate)
{ {
parsed_time = null; parsedTime = null;
string time_zone_r; var timeZoneR = defaultFormat == DateTimeFormat.UsaDate ?
if (default_format == DateTimeFormat.USA_DATE) @"(?:\s*(?'time_zone'UTC|GMT|CST|EST))?" : @"(?:\s*(?'time_zone'UTC|GMT))?";
time_zone_r = @"(?:\s*(?'time_zone'UTC|GMT|CST|EST))?";
else
time_zone_r = @"(?:\s*(?'time_zone'UTC|GMT))?";
Match m; Match m;
if (parsed_date != null && parsed_date.IndexOfDate > -1) if (parsedDate != null && parsedDate.IndexOfDate > -1)
{//look around the found date {//look around the found date
//look for <date> hh:mm:ss <UTC offset> //look for <date> hh:mm:ss <UTC offset>
m = Regex.Match(str.Substring(parsed_date.IndexOfDate + parsed_date.LengthOfDate), @"(?<=^\s*,?\s+|^\s*at\s*|^\s*[T\-]\s*)(?'hour'\d{2})\s*:\s*(?'minute'\d{2})\s*:\s*(?'second'\d{2})\s+(?'offset_sign'[\+\-])(?'offset_hh'\d{2}):?(?'offset_mm'\d{2})(?=$|[^\d\w])", RegexOptions.Compiled); m = Regex.Match(str.Substring(parsedDate.IndexOfDate + parsedDate.LengthOfDate), @"(?<=^\s*,?\s+|^\s*at\s*|^\s*[T\-]\s*)(?'hour'\d{2})\s*:\s*(?'minute'\d{2})\s*:\s*(?'second'\d{2})\s+(?'offset_sign'[\+\-])(?'offset_hh'\d{2}):?(?'offset_mm'\d{2})(?=$|[^\d\w])", RegexOptions.Compiled);
if (!m.Success) if (!m.Success)
//look for <date> [h]h:mm[:ss] [PM/AM] [UTC/GMT] //look for <date> [h]h:mm[:ss] [PM/AM] [UTC/GMT]
m = Regex.Match(str.Substring(parsed_date.IndexOfDate + parsed_date.LengthOfDate), @"(?<=^\s*,?\s+|^\s*at\s*|^\s*[T\-]\s*)(?'hour'\d{1,2})\s*:\s*(?'minute'\d{2})\s*(?::\s*(?'second'\d{2}))?(?:\s*(?'ampm'AM|am|PM|pm))?" + time_zone_r + @"(?=$|[^\d\w])", RegexOptions.Compiled); m = Regex.Match(str.Substring(parsedDate.IndexOfDate + parsedDate.LengthOfDate), @"(?<=^\s*,?\s+|^\s*at\s*|^\s*[T\-]\s*)(?'hour'\d{1,2})\s*:\s*(?'minute'\d{2})\s*(?::\s*(?'second'\d{2}))?(?:\s*(?'ampm'AM|am|PM|pm))?" + timeZoneR + @"(?=$|[^\d\w])", RegexOptions.Compiled);
if (!m.Success) if (!m.Success)
//look for [h]h:mm:ss [PM/AM] [UTC/GMT] <date> //look for [h]h:mm:ss [PM/AM] [UTC/GMT] <date>
m = Regex.Match(str.Substring(0, parsed_date.IndexOfDate), @"(?<=^|[^\d])(?'hour'\d{1,2})\s*:\s*(?'minute'\d{2})\s*(?::\s*(?'second'\d{2}))?(?:\s*(?'ampm'AM|am|PM|pm))?" + time_zone_r + @"(?=$|[\s,]+)", RegexOptions.Compiled); m = Regex.Match(str.Substring(0, parsedDate.IndexOfDate), @"(?<=^|[^\d])(?'hour'\d{1,2})\s*:\s*(?'minute'\d{2})\s*(?::\s*(?'second'\d{2}))?(?:\s*(?'ampm'AM|am|PM|pm))?" + timeZoneR + @"(?=$|[\s,]+)", RegexOptions.Compiled);
if (!m.Success) if (!m.Success)
//look for [h]h:mm:ss [PM/AM] [UTC/GMT] within <date> //look for [h]h:mm:ss [PM/AM] [UTC/GMT] within <date>
m = Regex.Match(str.Substring(parsed_date.IndexOfDate, parsed_date.LengthOfDate), @"(?<=^|[^\d])(?'hour'\d{1,2})\s*:\s*(?'minute'\d{2})\s*(?::\s*(?'second'\d{2}))?(?:\s*(?'ampm'AM|am|PM|pm))?" + time_zone_r + @"(?=$|[\s,]+)", RegexOptions.Compiled); m = Regex.Match(str.Substring(parsedDate.IndexOfDate, parsedDate.LengthOfDate), @"(?<=^|[^\d])(?'hour'\d{1,2})\s*:\s*(?'minute'\d{2})\s*(?::\s*(?'second'\d{2}))?(?:\s*(?'ampm'AM|am|PM|pm))?" + timeZoneR + @"(?=$|[\s,]+)", RegexOptions.Compiled);
} }
else//look anywhere within string else//look anywhere within string
{ {
//look for hh:mm:ss <UTC offset> //look for hh:mm:ss <UTC offset>
m = Regex.Match(str, @"(?<=^|\s+|\s*T\s*)(?'hour'\d{2})\s*:\s*(?'minute'\d{2})\s*:\s*(?'second'\d{2})\s+(?'offset_sign'[\+\-])(?'offset_hh'\d{2}):?(?'offset_mm'\d{2})?(?=$|[^\d\w])", RegexOptions.Compiled); m = Regex.Match(str, @"(?<=^|\s+|\s*T\s*)(?'hour'\d{2})\s*:\s*(?'minute'\d{2})\s*:\s*(?'second'\d{2})\s+(?'offset_sign'[\+\-])(?'offset_hh'\d{2}):?(?'offset_mm'\d{2})?(?=$|[^\d\w])", RegexOptions.Compiled);
if (!m.Success) if (!m.Success)
//look for [h]h:mm[:ss] [PM/AM] [UTC/GMT] //look for [h]h:mm[:ss] [PM/AM] [UTC/GMT]
m = Regex.Match(str, @"(?<=^|\s+|\s*T\s*)(?'hour'\d{1,2})\s*:\s*(?'minute'\d{2})\s*(?::\s*(?'second'\d{2}))?(?:\s*(?'ampm'AM|am|PM|pm))?" + time_zone_r + @"(?=$|[^\d\w])", RegexOptions.Compiled); m = Regex.Match(str, @"(?<=^|\s+|\s*T\s*)(?'hour'\d{1,2})\s*:\s*(?'minute'\d{2})\s*(?::\s*(?'second'\d{2}))?(?:\s*(?'ampm'AM|am|PM|pm))?" + timeZoneR + @"(?=$|[^\d\w])", RegexOptions.Compiled);
} }
if (!m.Success) if (!m.Success)
@@ -398,49 +392,49 @@ namespace DateTimeRoutines
return false; return false;
} }
if (string.Compare(m.Groups["ampm"].Value, "PM", true) == 0 && hour < 12) if ("PM".Equals(m.Groups["ampm"].Value, StringComparison.OrdinalIgnoreCase) && hour < 12)
hour += 12; hour += 12;
else if (string.Compare(m.Groups["ampm"].Value, "AM", true) == 0 && hour == 12) else if ("AM".Equals(m.Groups["ampm"].Value, StringComparison.OrdinalIgnoreCase) && hour == 12)
hour -= 12; hour -= 12;
var date_time = new DateTime(1, 1, 1, hour, minute, second); var dateTime = new DateTime(1, 1, 1, hour, minute, second);
if (m.Groups["offset_hh"].Success) if (m.Groups["offset_hh"].Success)
{ {
var offset_hh = int.Parse(m.Groups["offset_hh"].Value); var offsetHh = int.Parse(m.Groups["offset_hh"].Value);
var offset_mm = 0; var offsetMm = 0;
if (m.Groups["offset_mm"].Success) if (m.Groups["offset_mm"].Success)
offset_mm = int.Parse(m.Groups["offset_mm"].Value); offsetMm = int.Parse(m.Groups["offset_mm"].Value);
var utc_offset = new TimeSpan(offset_hh, offset_mm, 0); var utcOffset = new TimeSpan(offsetHh, offsetMm, 0);
if (m.Groups["offset_sign"].Value == "-") if (m.Groups["offset_sign"].Value == "-")
utc_offset = -utc_offset; utcOffset = -utcOffset;
parsed_time = new ParsedDateTime(-1, -1, m.Index, m.Length, date_time, utc_offset); parsedTime = new ParsedDateTime(-1, -1, m.Index, m.Length, dateTime, utcOffset);
return true; return true;
} }
if (m.Groups["time_zone"].Success) if (m.Groups["time_zone"].Success)
{ {
TimeSpan utc_offset; TimeSpan utcOffset;
switch (m.Groups["time_zone"].Value) switch (m.Groups["time_zone"].Value)
{ {
case "UTC": case "UTC":
case "GMT": case "GMT":
utc_offset = new TimeSpan(0, 0, 0); utcOffset = new TimeSpan(0, 0, 0);
break; break;
case "CST": case "CST":
utc_offset = new TimeSpan(-6, 0, 0); utcOffset = new TimeSpan(-6, 0, 0);
break; break;
case "EST": case "EST":
utc_offset = new TimeSpan(-5, 0, 0); utcOffset = new TimeSpan(-5, 0, 0);
break; break;
default: default:
throw new Exception("Time zone: " + m.Groups["time_zone"].Value + " is not defined."); throw new Exception("Time zone: " + m.Groups["time_zone"].Value + " is not defined.");
} }
parsed_time = new ParsedDateTime(-1, -1, m.Index, m.Length, date_time, utc_offset); parsedTime = new ParsedDateTime(-1, -1, m.Index, m.Length, dateTime, utcOffset);
return true; return true;
} }
parsed_time = new ParsedDateTime(-1, -1, m.Index, m.Length, date_time); parsedTime = new ParsedDateTime(-1, -1, m.Index, m.Length, dateTime);
//} //}
//catch(Exception e) //catch(Exception e)
//{ //{
@@ -450,17 +444,17 @@ namespace DateTimeRoutines
} }
/// <summary> /// <summary>
/// Tries to find date within the passed string and return it as ParsedDateTime object. /// Tries to find date within the passed string and return it as ParsedDateTime object.
/// It recognizes only date while ignoring time, so time in the returned ParsedDateTime is always 0:0:0. /// It recognizes only date while ignoring time, so time in the returned ParsedDateTime is always 0:0:0.
/// If year of the date was not found then it accepts the current year. /// If year of the date was not found then it accepts the current year.
/// </summary> /// </summary>
/// <param name="str">string that contains date</param> /// <param name="str">string that contains date</param>
/// <param name="default_format">format to be used preferably in ambivalent instances</param> /// <param name="defaultFormat">format to be used preferably in ambivalent instances</param>
/// <param name="parsed_date">parsed date output</param> /// <param name="parsedDate">parsed date output</param>
/// <returns>true if date was found, else false</returns> /// <returns>true if date was found, else false</returns>
public static bool TryParseDate(this string str, DateTimeFormat default_format, out ParsedDateTime parsed_date) public static bool TryParseDate(this string str, DateTimeFormat defaultFormat, out ParsedDateTime parsedDate)
{ {
parsed_date = null; parsedDate = null;
if (string.IsNullOrEmpty(str)) if (string.IsNullOrEmpty(str))
return false; return false;
@@ -470,17 +464,17 @@ namespace DateTimeRoutines
if (m.Success) if (m.Success)
{ {
DateTime date; DateTime date;
if ((default_format ^ DateTimeFormat.USA_DATE) == DateTimeFormat.USA_DATE) if ((defaultFormat ^ DateTimeFormat.UsaDate) == DateTimeFormat.UsaDate)
{ {
if (!convert_to_date(int.Parse(m.Groups["year"].Value), int.Parse(m.Groups["day"].Value), int.Parse(m.Groups["month"].Value), out date)) if (!ConvertToDate(int.Parse(m.Groups["year"].Value), int.Parse(m.Groups["day"].Value), int.Parse(m.Groups["month"].Value), out date))
return false; return false;
} }
else else
{ {
if (!convert_to_date(int.Parse(m.Groups["year"].Value), int.Parse(m.Groups["month"].Value), int.Parse(m.Groups["day"].Value), out date)) if (!ConvertToDate(int.Parse(m.Groups["year"].Value), int.Parse(m.Groups["month"].Value), int.Parse(m.Groups["day"].Value), out date))
return false; return false;
} }
parsed_date = new ParsedDateTime(m.Index, m.Length, -1, -1, date); parsedDate = new ParsedDateTime(m.Index, m.Length, -1, -1, date);
return true; return true;
} }
@@ -488,9 +482,9 @@ namespace DateTimeRoutines
m = Regex.Match(str, @"(?<=^|[^\d])(?'year'\d{2}|\d{4})\s*(?'separator'[\-])\s*(?'month'\d{1,2})\s*\'separator'+\s*(?'day'\d{1,2})(?=$|[^\d])", RegexOptions.Compiled | RegexOptions.IgnoreCase); m = Regex.Match(str, @"(?<=^|[^\d])(?'year'\d{2}|\d{4})\s*(?'separator'[\-])\s*(?'month'\d{1,2})\s*\'separator'+\s*(?'day'\d{1,2})(?=$|[^\d])", RegexOptions.Compiled | RegexOptions.IgnoreCase);
if (m.Success) if (m.Success)
{ {
if (!convert_to_date(int.Parse(m.Groups["year"].Value), int.Parse(m.Groups["month"].Value), int.Parse(m.Groups["day"].Value), out var date)) if (!ConvertToDate(int.Parse(m.Groups["year"].Value), int.Parse(m.Groups["month"].Value), int.Parse(m.Groups["day"].Value), out var date))
return false; return false;
parsed_date = new ParsedDateTime(m.Index, m.Length, -1, -1, date); parsedDate = new ParsedDateTime(m.Index, m.Length, -1, -1, date);
return true; return true;
} }
@@ -511,8 +505,8 @@ namespace DateTimeRoutines
if (m.Success) if (m.Success)
{ {
var month = -1; var month = -1;
var index_of_date = m.Index; var indexOfDate = m.Index;
var length_of_date = m.Length; var lengthOfDate = m.Length;
switch (m.Groups["month"].Value) switch (m.Groups["month"].Value)
{ {
@@ -565,22 +559,19 @@ namespace DateTimeRoutines
break; break;
} }
int year; var year = !string.IsNullOrEmpty(m.Groups["year"].Value) ?
if (!string.IsNullOrEmpty(m.Groups["year"].Value)) int.Parse(m.Groups["year"].Value) : DefaultDate.Year;
year = int.Parse(m.Groups["year"].Value);
else
year = DefaultDate.Year;
if (!convert_to_date(year, month, int.Parse(m.Groups["day"].Value), out var date)) if (!ConvertToDate(year, month, int.Parse(m.Groups["day"].Value), out var date))
return false; return false;
parsed_date = new ParsedDateTime(index_of_date, length_of_date, -1, -1, date); parsedDate = new ParsedDateTime(indexOfDate, lengthOfDate, -1, -1, date);
return true; return true;
} }
return false; return false;
} }
private static bool convert_to_date(int year, int month, int day, out DateTime date) private static bool ConvertToDate(int year, int month, int day, out DateTime date)
{ {
if (year >= 100) if (year >= 100)
{ {

View File

@@ -1,7 +1,10 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework> <TargetFramework>netstandard2.0</TargetFramework>
<LangVersion>8</LangVersion>
<NoWarn />
<TreatWarningsAsErrors>false</TreatWarningsAsErrors>
<WarningsAsErrors />
</PropertyGroup> </PropertyGroup>
</Project> </Project>

View File

@@ -1,4 +1,4 @@
function getUrlParams() { function getUrlParams() {
var vars = [], hash; var vars = [], hash;
var hashes = window.location.href.slice(window.location.href.indexOf('?') + 1).split('&'); var hashes = window.location.href.slice(window.location.href.indexOf('?') + 1).split('&');
for (var i = 0; i < hashes.length; i++) { for (var i = 0; i < hashes.length; i++) {
@@ -7,4 +7,4 @@
vars[hash[0]] = hash[1]; vars[hash[0]] = hash[1];
} }
return vars; return vars;
} }

View File

@@ -55,6 +55,14 @@ body {
max-width: 255px; max-width: 255px;
} }
.setup-item-inputcheckbox label {
padding: 0 1.5em;
}
.setup-item-inputcheckbox input {
height: 20px;
}
.setup-item-inputbool input { .setup-item-inputbool input {
max-width: 100px; max-width: 100px;
height: 20px; height: 20px;
@@ -175,6 +183,12 @@ hr {
border-bottom: 1px solid #ddd; border-bottom: 1px solid #ddd;
} }
.jackettlog-narrowcol {
width: 1px;
white-space: nowrap;
vertical-align: top;
}
.jackettlogWarn { .jackettlogWarn {
background-color: #FFFF8E !important; background-color: #FFFF8E !important;
} }
@@ -202,11 +216,15 @@ pre {
font-size: 13px; font-size: 13px;
line-height: 1.42857143; line-height: 1.42857143;
color: #333; color: #333;
word-break: break-all;
word-wrap: break-word;
background-color: transparent; background-color: transparent;
border: 0; border: 0;
border-radius: 0; border-radius: 0;
word-break: normal;
white-space: pre-wrap; /* Since CSS 2.1 */
white-space: -moz-pre-wrap; /* Mozilla, since 1999 */
white-space: -pre-wrap; /* Opera 4-6 */
white-space: -o-pre-wrap; /* Opera 7 */
word-wrap: break-word; /* Internet Explorer 5.5+ */
} }
.modal-open .modal { .modal-open .modal {
@@ -277,7 +295,7 @@ table td.fit{
.tooltip-inner img { .tooltip-inner img {
max-width: 250px; max-width: 250px;
height: auto; height: auto;
} }
.type-public { .type-public {

View File

@@ -32,7 +32,15 @@ $(document).ready(function () {
return opts.fn(this); return opts.fn(this);
else else
return opts.inverse(this); return opts.inverse(this);
}); });
Handlebars.registerHelper('if_in', function(elem, list, opts) {
if(list.indexOf(elem) > -1) {
return opts.fn(this);
}
return opts.inverse(this);
});
var index = window.location.pathname.indexOf("/UI"); var index = window.location.pathname.indexOf("/UI");
var pathPrefix = window.location.pathname.substr(0, index); var pathPrefix = window.location.pathname.substr(0, index);
@@ -43,7 +51,12 @@ $(document).ready(function () {
}); });
function openSearchIfNecessary() { function openSearchIfNecessary() {
const hashArgs = location.hash.substring(1).split('&').reduce((prev, item) => Object.assign({ [item.split('=')[0]]: (item.split('=').length < 2 ? undefined : decodeURIComponent(item.split('=')[1])) }, prev), {}); const hashArgs = location.hash.substring(1).split('&').reduce((prev, item) =>
Object.assign({
[item.split('=')[0]]: (item.split('=').length < 2 ?
undefined :
decodeURIComponent(item.split('=')[1].replace(/\+/g,'%20')))
}, prev), {});
if ("search" in hashArgs) { if ("search" in hashArgs) {
showSearch(hashArgs.tracker, hashArgs.search, hashArgs.category); showSearch(hashArgs.tracker, hashArgs.search, hashArgs.category);
} }
@@ -169,6 +182,7 @@ function displayConfiguredIndexersList(indexers) {
indexersTable.find("table").dataTable( indexersTable.find("table").dataTable(
{ {
"stateSave": true, "stateSave": true,
"stateDuration": 0,
"pageLength": -1, "pageLength": -1,
"lengthMenu": [[10, 20, 50, 100, 250, 500, -1], [10, 20, 50, 100, 250, 500, "All"]], "lengthMenu": [[10, 20, 50, 100, 250, 500, -1], [10, 20, 50, 100, 250, 500, "All"]],
"order": [[0, "asc"]], "order": [[0, "asc"]],
@@ -228,9 +242,9 @@ function displayUnconfiguredIndexersList() {
}).fail(function (data) { }).fail(function (data) {
if(data.responseJSON.error !== undefined) { if(data.responseJSON.error !== undefined) {
var indexEnd = 2048 - "https://github.com/Jackett/Jackett/issues/new?title=[".length - indexerId.length - "] ".length - " (Config)".length; // keep url <= 2k #5104 var indexEnd = 2048 - "https://github.com/Jackett/Jackett/issues/new?title=[".length - indexerId.length - "] ".length - " (Config)".length; // keep url <= 2k #5104
doNotify("An error occured while configuring this indexer<br /><b>" + data.responseJSON.error.substring(0, indexEnd) + "</b><br /><i><a href=\"https://github.com/Jackett/Jackett/issues/new?title=[" + indexerId + "] " + data.responseJSON.error.substring(0, indexEnd) + " (Config)\" target=\"_blank\">Click here to open an issue on GitHub for this indexer.</a><i>", "danger", "glyphicon glyphicon-alert", false); doNotify("An error occurred while configuring this indexer<br /><b>" + data.responseJSON.error.substring(0, indexEnd) + "</b><br /><i><a href=\"https://github.com/Jackett/Jackett/issues/new?title=[" + indexerId + "] " + data.responseJSON.error.substring(0, indexEnd) + " (Config)\" target=\"_blank\">Click here to open an issue on GitHub for this indexer.</a><i>", "danger", "glyphicon glyphicon-alert", false);
} else { } else {
doNotify("An error occured while configuring this indexer, is Jackett server running ?", "danger", "glyphicon glyphicon-alert"); doNotify("An error occurred while configuring this indexer, is Jackett server running ?", "danger", "glyphicon glyphicon-alert");
} }
}); });
}); });
@@ -240,6 +254,7 @@ function displayUnconfiguredIndexersList() {
indexersTable.find("table").DataTable( indexersTable.find("table").DataTable(
{ {
"stateSave": true, "stateSave": true,
"stateDuration": 0,
"fnStateSaveParams": function (oSettings, sValue) { "fnStateSaveParams": function (oSettings, sValue) {
sValue.search.search = ""; // don't save the search filter content sValue.search.search = ""; // don't save the search filter content
return sValue; return sValue;
@@ -608,6 +623,11 @@ function getConfigModalJson(configForm) {
case "inputbool": case "inputbool":
itemEntry.value = $el.find(".setup-item-inputbool input").is(":checked"); itemEntry.value = $el.find(".setup-item-inputbool input").is(":checked");
break; break;
case "inputcheckbox":
itemEntry.values = [];
$el.find(".setup-item-inputcheckbox input:checked").each(function () {
itemEntry.values.push($(this).val());
});
case "inputselect": case "inputselect":
itemEntry.value = $el.find(".setup-item-inputselect select").val(); itemEntry.value = $el.find(".setup-item-inputselect select").val();
break; break;
@@ -762,7 +782,7 @@ function updateReleasesRow(row)
} }
function showSearch(selectedIndexer, query, category) { function showSearch(selectedIndexer, query, category) {
var selectedIndexers = [] var selectedIndexers = [];
if (selectedIndexer) if (selectedIndexer)
selectedIndexers = selectedIndexer.split(","); selectedIndexers = selectedIndexer.split(",");
$('#select-indexer-modal').remove(); $('#select-indexer-modal').remove();
@@ -829,7 +849,11 @@ function showSearch(selectedIndexer, query, category) {
Tracker: releaseDialog.find('#searchTracker').val() Tracker: releaseDialog.find('#searchTracker').val()
}; };
window.location.hash = $.param({ search: queryObj.Query, tracker: queryObj.Tracker.join(","), category: queryObj.Category.join(",") }); window.location.hash = Object.entries({
search: encodeURIComponent(queryObj.Query).replace(/%20/g,'+'),
tracker: queryObj.Tracker.join(","),
category: queryObj.Category.join(",")
}).map(([k, v], i) => k + '=' + v).join('&');
$('#jackett-search-perform').html($('#spinner').html()); $('#jackett-search-perform').html($('#spinner').html());
$('#searchResults div.dataTables_filter input').val(""); $('#searchResults div.dataTables_filter input').val("");
@@ -877,7 +901,7 @@ function showSearch(selectedIndexer, query, category) {
enableCaseInsensitiveFiltering: true, enableCaseInsensitiveFiltering: true,
nonSelectedText: 'All' nonSelectedText: 'All'
}); });
if (category !== undefined) { if (category !== undefined) {
searchCategory.val(category.split(",")); searchCategory.val(category.split(","));
@@ -933,6 +957,7 @@ function updateSearchResultTable(element, results) {
"dom": "lfr<\"dataTables_deadfilter\">tip", "dom": "lfr<\"dataTables_deadfilter\">tip",
"stateSave": true, "stateSave": true,
"stateDuration": 0,
"bAutoWidth": false, "bAutoWidth": false,
"pageLength": 20, "pageLength": 20,
"lengthMenu": [[10, 20, 50, 100, 250, 500, -1], [10, 20, 50, 100, 250, 500, "All"]], "lengthMenu": [[10, 20, 50, 100, 250, 500, -1], [10, 20, 50, 100, 250, 500, "All"]],
@@ -1060,6 +1085,7 @@ function bindUIButtons() {
table.DataTable( table.DataTable(
{ {
"stateSave": true, "stateSave": true,
"stateDuration": 0,
"bAutoWidth": false, "bAutoWidth": false,
"pageLength": 20, "pageLength": 20,
"lengthMenu": [[10, 20, 50, -1], [10, 20, 50, "All"]], "lengthMenu": [[10, 20, 50, -1], [10, 20, 50, "All"]],
@@ -1155,8 +1181,8 @@ function bindUIButtons() {
var jackett_port = Number($("#jackett-port").val()); var jackett_port = Number($("#jackett-port").val());
var jackett_basepathoverride = $("#jackett-basepathoverride").val(); var jackett_basepathoverride = $("#jackett-basepathoverride").val();
var jackett_external = $("#jackett-allowext").is(':checked'); var jackett_external = $("#jackett-allowext").is(':checked');
var jackett_update = $("#jackett-allowupdate").is(':checked'); var jackett_update = $("#jackett-allowupdate").is(':checked');
var jackett_prerelease = $("#jackett-prerelease").is(':checked'); var jackett_prerelease = $("#jackett-prerelease").is(':checked');
var jackett_logging = $("#jackett-logging").is(':checked'); var jackett_logging = $("#jackett-logging").is(':checked');
var jackett_omdb_key = $("#jackett-omdbkey").val(); var jackett_omdb_key = $("#jackett-omdbkey").val();
var jackett_omdb_url = $("#jackett-omdburl").val(); var jackett_omdb_url = $("#jackett-omdburl").val();

View File

@@ -175,6 +175,12 @@ hr {
border-bottom: 1px solid #ddd; border-bottom: 1px solid #ddd;
} }
.jackettlog-narrowcol {
width: 1px;
white-space: nowrap;
vertical-align: top;
}
.jackettlogWarn { .jackettlogWarn {
background-color: #FFFF8E !important; background-color: #FFFF8E !important;
} }
@@ -202,11 +208,15 @@ pre {
font-size: 13px; font-size: 13px;
line-height: 1.42857143; line-height: 1.42857143;
color: #333; color: #333;
word-break: break-all;
word-wrap: break-word;
background-color: transparent; background-color: transparent;
border: 0; border: 0;
border-radius: 0; border-radius: 0;
word-break: normal;
white-space: pre-wrap; /* Since CSS 2.1 */
white-space: -moz-pre-wrap; /* Mozilla, since 1999 */
white-space: -pre-wrap; /* Opera 4-6 */
white-space: -o-pre-wrap; /* Opera 7 */
word-wrap: break-word; /* Internet Explorer 5.5+ */
} }
.modal-open .modal { .modal-open .modal {
@@ -276,7 +286,7 @@ table td.fit{
.tooltip-inner img { .tooltip-inner img {
max-width: 250px; max-width: 250px;
height: auto; height: auto;
} }
.type-public { .type-public {

Binary file not shown.

Before

Width:  |  Height:  |  Size: 361 KiB

After

Width:  |  Height:  |  Size: 101 KiB

View File

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

View File

@@ -86,4 +86,4 @@ var api = {
success: callback success: callback
}); });
} }
} }

View File

@@ -1,6 +1,6 @@
Handlebars.registerHelper('ifCond', function (v1, v2, options) { Handlebars.registerHelper('ifCond', function (v1, v2, options) {
if(v1 === v2) { if(v1 === v2) {
return options.fn(this); return options.fn(this);
} }
return options.inverse(this); return options.inverse(this);
}); });

View File

@@ -1,11 +1,11 @@

Handlebars.registerHelper('dateFormat', function (context, block) { Handlebars.registerHelper('dateFormat', function (context, block) {
if (window.moment) { if (window.moment) {
var f = block.hash.format || "MMM DD, YYYY hh:mm:ss A"; var f = block.hash.format || "YYYY-MM-DD HH:mm:ss";
return moment(context).format(f); //had to remove Date(context) return moment(context).format(f); //had to remove Date(context)
} else { } else {
return context; // moment plugin not available. return data as is. return context; // moment plugin not available. return data as is.
}; }
}); });
Handlebars.registerHelper('jacketTimespan', function (context, block) { Handlebars.registerHelper('jacketTimespan', function (context, block) {
@@ -22,7 +22,7 @@ Handlebars.registerHelper('jacketTimespan', function (context, block) {
if (hours < 48) { if (hours < 48) {
return Math.round(hours) + 'h ago'; return Math.round(hours) + 'h ago';
} }
var days = timeSpan.asDays(); var days = timeSpan.asDays();
if (days < 365) { if (days < 365) {
return Math.round(days) + 'd ago'; return Math.round(days) + 'd ago';
@@ -34,4 +34,4 @@ Handlebars.registerHelper('jacketTimespan', function (context, block) {
Handlebars.registerHelper('jacketSize', function (context, block) { Handlebars.registerHelper('jacketSize', function (context, block) {
return filesize(context, { round: 1 }); return filesize(context, { round: 1 });
}); });

View File

@@ -1,4 +1,4 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/xhtml"> <html lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head> <head>
@@ -16,7 +16,7 @@
<link href="../bootstrap/bootstrap.min.css" rel="stylesheet"> <link href="../bootstrap/bootstrap.min.css" rel="stylesheet">
<link href="../animate.css" rel="stylesheet"> <link href="../animate.css" rel="stylesheet">
<link href="../custom.css" rel="stylesheet"> <link href="../custom.css?changed=20200223" rel="stylesheet">
<title>Jackett</title> <title>Jackett</title>
</head> </head>

View File

@@ -1,4 +1,4 @@
--- ---
site: 0daykiev site: 0daykiev
name: 0day.kiev name: 0day.kiev
description: "0day.kiev.ua is a RUSSIAN Private Torrent Tracker for MOVIES / TV / GENERAL" description: "0day.kiev.ua is a RUSSIAN Private Torrent Tracker for MOVIES / TV / GENERAL"

View File

@@ -5,6 +5,7 @@
language: en-us language: en-us
type: public type: public
encoding: UTF-8 encoding: UTF-8
followredirect: true
links: links:
- https://1337x.to/ - https://1337x.to/
- https://1337x.gd/ - https://1337x.gd/
@@ -13,6 +14,8 @@
- https://x1337x.ws/ - https://x1337x.ws/
- https://x1337x.eu/ - https://x1337x.eu/
- https://x1337x.se/ - https://x1337x.se/
- https://1337x.unblockit.pro/
legacylinks:
- https://1337x.unblocked.earth/ - https://1337x.unblocked.earth/
caps: caps:
@@ -44,12 +47,12 @@
- {id: 3, cat: Movies, desc: "Movies/SVCD/VCD"} - {id: 3, cat: Movies, desc: "Movies/SVCD/VCD"}
- {id: 4, cat: Movies/Foreign, desc: "Movies/Dubs/Dual Audio"} - {id: 4, cat: Movies/Foreign, desc: "Movies/Dubs/Dual Audio"}
- {id: 42, cat: Movies/HD, desc: "Movies/HD"} - {id: 42, cat: Movies/HD, desc: "Movies/HD"}
- {id: 54, cat: Movies, desc: "Movies/h.264/x264"} - {id: 54, cat: Movies/HD, desc: "Movies/h.264/x264"}
- {id: 55, cat: Movies, desc: "Movies/Mp4"} - {id: 55, cat: Movies, desc: "Movies/Mp4"}
- {id: 66, cat: Movies/3D, desc: "Movies/3D"} - {id: 66, cat: Movies/3D, desc: "Movies/3D"}
- {id: 70, cat: Movies, desc: "Movies/HEVC/x265"} - {id: 70, cat: Movies/HD, desc: "Movies/HEVC/x265"}
- {id: 73, cat: Movies, desc: "Movies/Bollywood"} - {id: 73, cat: Movies, desc: "Movies/Bollywood"}
- {id: 76, cat: Movies, desc: "Movies/UHD"} - {id: 76, cat: Movies/UHD, desc: "Movies/UHD"}
#TV #TV
- {id: 5, cat: TV, desc: "TV/DVD"} - {id: 5, cat: TV, desc: "TV/DVD"}
@@ -138,7 +141,7 @@
"asc": "asc" "asc": "asc"
download: download:
# the .torrent url is on the on the details page # the .torrent url is on the on the details page
selector: ul li a[href^="{{ .Config.downloadlink }}"] selector: ul li a[href^="{{ .Config.downloadlink }}"]
attribute: href attribute: href
@@ -148,7 +151,7 @@
- path: "{{if or (.Query.Album) (.Query.Artist) (.Keywords) }}sort-search{{else}}cat/Movies{{end}}{{if or (.Query.Album) (.Query.Artist) }}/{{ or (.Query.Album) (.Query.Artist) }}{{else}}/{{ .Keywords }}{{end}}{{if or (.Query.Album) (.Query.Artist) (.Keywords) }}/{{else}}{{end}}{{ .Config.sort }}/{{ .Config.type }}/1/" - path: "{{if or (.Query.Album) (.Query.Artist) (.Keywords) }}sort-search{{else}}cat/Movies{{end}}{{if or (.Query.Album) (.Query.Artist) }}/{{ or (.Query.Album) (.Query.Artist) }}{{else}}/{{ .Keywords }}{{end}}{{if or (.Query.Album) (.Query.Artist) (.Keywords) }}/{{else}}{{end}}{{ .Config.sort }}/{{ .Config.type }}/1/"
- path: "{{if or (.Query.Album) (.Query.Artist) (.Keywords) }}sort-search{{else}}cat/TV{{end}}{{if or (.Query.Album) (.Query.Artist) }}/{{ or (.Query.Album) (.Query.Artist) }}{{else}}/{{ .Keywords }}{{end}}{{if or (.Query.Album) (.Query.Artist) (.Keywords) }}/{{else}}{{end}}{{ .Config.sort }}/{{ .Config.type }}/{{if or (.Query.Album) (.Query.Artist) (.Keywords) }}2{{else}}1{{end}}/" - path: "{{if or (.Query.Album) (.Query.Artist) (.Keywords) }}sort-search{{else}}cat/TV{{end}}{{if or (.Query.Album) (.Query.Artist) }}/{{ or (.Query.Album) (.Query.Artist) }}{{else}}/{{ .Keywords }}{{end}}{{if or (.Query.Album) (.Query.Artist) (.Keywords) }}/{{else}}{{end}}{{ .Config.sort }}/{{ .Config.type }}/{{if or (.Query.Album) (.Query.Artist) (.Keywords) }}2{{else}}1{{end}}/"
- path: "{{if or (.Query.Album) (.Query.Artist) (.Keywords) }}sort-search{{else}}cat/Music{{end}}{{if or (.Query.Album) (.Query.Artist) }}/{{ or (.Query.Album) (.Query.Artist) }}{{else}}/{{ .Keywords }}{{end}}{{if or (.Query.Album) (.Query.Artist) (.Keywords) }}/{{else}}{{end}}{{ .Config.sort }}/{{ .Config.type }}/{{if or (.Query.Album) (.Query.Artist) (.Keywords) }}3{{else}}1{{end}}/" - path: "{{if or (.Query.Album) (.Query.Artist) (.Keywords) }}sort-search{{else}}cat/Music{{end}}{{if or (.Query.Album) (.Query.Artist) }}/{{ or (.Query.Album) (.Query.Artist) }}{{else}}/{{ .Keywords }}{{end}}{{if or (.Query.Album) (.Query.Artist) (.Keywords) }}/{{else}}{{end}}{{ .Config.sort }}/{{ .Config.type }}/{{if or (.Query.Album) (.Query.Artist) (.Keywords) }}3{{else}}1{{end}}/"
keywordsfilters: keywordsfilters:
- name: replace # use this as a workaround till #893 is implemented - name: replace # use this as a workaround till #893 is implemented
args: ["Greys Anatomy", "Grey's Anatomy"] args: ["Greys Anatomy", "Grey's Anatomy"]

View File

@@ -1,4 +1,4 @@
--- ---
site: 2fast4you site: 2fast4you
name: 2 Fast 4 You name: 2 Fast 4 You
description: "2 Fast 4 You is a FRENCH Private site for TV / MOVIES / GENERAL" description: "2 Fast 4 You is a FRENCH Private site for TV / MOVIES / GENERAL"

View File

@@ -6,7 +6,7 @@
type: private type: private
encoding: UTF-8 encoding: UTF-8
links: links:
- http://www.3dtorrents.org/ - http://www.3dtorrents.org/ # site does not support https ERR_CONNECTION_CLOSED
caps: caps:
categorymappings: categorymappings:
@@ -60,7 +60,7 @@
- selector: span.errormsg - selector: span.errormsg
test: test:
path: index.php path: index.php
search: search:
paths: paths:
- path: index.php - path: index.php

View File

@@ -1,4 +1,4 @@
--- ---
site: 3evils site: 3evils
name: 3evils name: 3evils
description: "3evils is a Private Torrent Tracker for MOVIES / TV / GENERAL" description: "3evils is a Private Torrent Tracker for MOVIES / TV / GENERAL"

View File

@@ -22,7 +22,7 @@
- {id: 408, cat: Audio, desc: "HQ Audio/无损音乐"} - {id: 408, cat: Audio, desc: "HQ Audio/无损音乐"}
modes: modes:
search: [q] search: [q, imdbid]
tv-search: [q, season, ep, imdbid] tv-search: [q, season, ep, imdbid]
movie-search: [q, imdbid] movie-search: [q, imdbid]
@@ -103,7 +103,7 @@
args: cat args: cat
details: details:
selector: a[href^="details.php?id="] selector: a[href^="details.php?id="]
attribute: href attribute: href
download: download:
selector: a[href^="download.php?id="] selector: a[href^="download.php?id="]
attribute: href attribute: href

View File

@@ -20,7 +20,7 @@
settings: settings:
- name: info - name: info
type: info type: info
default: 7torrents does not use categories. In your software Indexer settings, set the category to 100001. default: 7torrents does not use categories. In your software Indexer settings, set the category to 7000.
- name: sort - name: sort
type: select type: select
label: Sort requested from site label: Sort requested from site

View File

@@ -0,0 +1,100 @@
---
site: academictorrents
name: AcademicTorrents
description: "AcademicTorrents is a Public Community-Maintained Distributed Repository for datasets and scientific knowledge."
language: en-us
type: public
encoding: UTF-8
links:
- https://academictorrents.com/
caps:
categorymappings:
- {id: 5, cat: Books, desc: "Paper"}
- {id: 6, cat: Other, desc: "Dataset"}
- {id: 7, cat: TV/Documentary, desc: "Course"}
modes:
search: [q]
settings:
- name: sort
type: select
label: Sort requested from site
default: "added"
options:
"added": "created"
"seeders": "seeders"
"size": "size"
"name": "title"
- name: type
type: select
label: Order requested from site
default: "DESC"
options:
"DESC": "desc"
"ASC": "asc"
search:
# https://academictorrents.com/browse.php?search=&c5=1&c6=1&c7=1&sort_field=added&sort_dir=DESC
paths:
- path: browse.php
- path: browse.php
inputs:
page: 1
inputs:
$raw: "{{ range .Categories }}c{{.}}=1&{{end}}"
search: "{{ .Keywords }}"
sort_field: "{{ .Config.sort }}"
sort_dir: "{{ .Config.type }}"
rows:
selector: table.table> tbody > tr:has(a[href^="/browse.php?cat="])
filters:
- name: andmatch
fields:
category:
selector: a[href^="/browse.php?cat="]
attribute: href
filters:
- name: querystring
args: cat
title:
selector: a[href^="/details/"]
details:
selector: a[href^="/details/"]
attribute: href
download:
# /download/08078e0894099530913e9335bdbc804f42f6e872.torrent"
selector: a[href^="/details/"]
attribute: href
filters:
- name: replace
args: ["/details/", "/download/"]
- name: append
args: ".torrent"
date:
selector: td:nth-child(4)
filters:
- name: dateparse
args: "2006-01-02"
size:
selector: td:nth-child(5)
grabs:
selector: td:nth-child(6)
seeders:
text: 0
seeders:
selector: td:nth-child(7):not(:empty)
optional: true
filters:
- name: replace
args: ["+", ""]
leechers:
selector: td:nth-child(8)
downloadvolumefactor:
text: 0
uploadvolumefactor:
text: 1
# engine n/a

View File

@@ -1,4 +1,4 @@
--- ---
site: acidlounge site: acidlounge
name: Acid-Lounge name: Acid-Lounge
description: "Acid Lounge (A-L) is a Private Torrent Tracker for 0DAY / GENERAL" description: "Acid Lounge (A-L) is a Private Torrent Tracker for 0DAY / GENERAL"

View File

@@ -1,4 +1,4 @@
--- ---
site: aftershock site: aftershock
name: Aftershock name: Aftershock
description: "Aftershock is a HUNGARIAN Private Torrent Tracker for MOVIES / GENERAL" description: "Aftershock is a HUNGARIAN Private Torrent Tracker for MOVIES / GENERAL"
@@ -170,4 +170,4 @@
case: case:
span.icon_upload: 2 span.icon_upload: 2
"*": 1 "*": 1
# XBT v3 # XBT v3

View File

@@ -1,146 +0,0 @@
---
site: alein
name: Alein
description: "Alein is a BULGARIAN Semi-Private Torrent Tracker for MOVIES / TV / GENERAL"
language: bg
type: semi-private
encoding: UTF-8
links:
- http://alein.org/
caps:
categorymappings:
- {id: 1, cat: Movies/SD, desc: "Movies-XviD"}
- {id: 15, cat: Movies/HD, desc: "Movies-x264"}
- {id: 41, cat: Movies, desc: "Movies-BG"}
- {id: 14, cat: Movies/HD, desc: "Movies-HD"}
- {id: 48, cat: Movies/UHD, desc: "Movies-x265"}
- {id: 39, cat: Movies/Foreign, desc: "Movies-XviD-Rus"}
- {id: 40, cat: Movies/Foreign, desc: "Movies-x264-Rus"}
- {id: 20, cat: Movies/Other, desc: "Movies-Animations"}
- {id: 16, cat: Movies/3D, desc: "Movies-3D"}
- {id: 5, cat: TV/Anime, desc: "Movies-Anime"}
- {id: 21, cat: Movies/BluRay, desc: "Movies-Blu-ray"}
- {id: 22, cat: TV/Documentary , desc: "Movies-Documentaries"}
- {id: 11, cat: Movies/DVD, desc: "Movies-DVD-R"}
- {id: 47, cat: TV/SD, desc: "TV-Episodes"}
- {id: 46, cat: TV/HD, desc: "TV-Episodes-HD"}
- {id: 3, cat: PC/ISO, desc: "Games-PC ISO"}
- {id: 31, cat: Console/Xbox, desc: "Games-XBOX"}
- {id: 33, cat: Console/PSP, desc: "Games-PS"}
- {id: 2, cat: Audio/MP3, desc: "Music-MP3"}
- {id: 50, cat: Audio/Lossless, desc: "Music-FLAC"}
- {id: 18, cat: Audio/Video, desc: "Music-Video"}
- {id: 9, cat: PC/0day, desc: "Software-Windows"}
- {id: 8, cat: PC, desc: "Software-Linux"}
- {id: 36, cat: Other, desc: "Trailer"}
- {id: 34, cat: Other/Misc, desc: "Pictures"}
- {id: 4, cat: Other, desc: "Other"}
- {id: 6, cat: Books/Comics, desc: "Books-Comics"}
- {id: 24, cat: PC/Phone-Other, desc: "Mobile-GSM"}
- {id: 23, cat: TV/Sport, desc: "Sport"}
modes:
search: [q]
tv-search: [q, season, ep]
movie-search: [q]
settings:
- name: username
type: text
label: Username
- name: password
type: password
label: Password
- name: sort
type: select
label: Sort requested from site
default: "3"
options:
"3": "created"
"5": "seeders"
"4": "size"
"2": "title"
- name: type
type: select
label: Order requested from site
default: "2"
options:
"2": "desc"
"1": "asc"
login:
path: index.php?page=login
method: form
form: form[action*="/index.php?page=login"]
inputs:
uid: "{{ .Config.username }}"
pwd: "{{ .Config.password }}"
error:
- selector: td.lista span[style="color:#FF0000;"]
test:
path: /
selector: a[href="logout.php"]
search:
paths:
# http://alein.org/index.php?page=torrents&category=1;15;41;14;48;39;20;16;5;21;22;11&search=venom&active=1
- path: index.php
inputs:
page: torrents
category: "{{ range .Categories }}{{.}};{{end}}"
search: "{{ .Keywords }}"
# 0 all 1 active only 2 dead only
active: 0
order: "{{ .Config.sort }}"
by: "{{ .Config.type }}"
rows:
selector: tr.trclass:not(:has(td.lista-cat-rec))
fields:
title:
selector: td a[href*="id="]
details:
selector: td a[href*="id="]
attribute: href
category:
selector: td a[href*="category="]
attribute: href
filters:
- name: querystring
args: category
download:
selector: td a[href*="id="]
attribute: href
filters:
- name: querystring
args: id
- name: prepend
args: "download.php?id="
- name: append
args: "&f={{ .Result.title }}.torrent"
banner:
selector: td a[href*="id="]
attribute: onmouseover
filters:
- name: regexp
args: "src=(.+?) width="
size:
selector: td:nth-child(6)
seeders:
selector: td:nth-child(7)
leechers:
selector: td:nth-child(8)
grabs:
selector: td:nth-child(9)
date:
selector: td:nth-child(5)
filters:
- name: dateparse
args: "02/01/2006"
downloadvolumefactor:
text: 0
uploadvolumefactor:
text: 1
# xbtit 2.3

View File

@@ -1,4 +1,4 @@
--- ---
site: alexfilm site: alexfilm
name: AlexFilm name: AlexFilm
description: "AlexFilm is a RUSSIAN Semi-Private Torrent Tracker for TV" description: "AlexFilm is a RUSSIAN Semi-Private Torrent Tracker for TV"

View File

@@ -158,8 +158,10 @@
keywordsfilters: keywordsfilters:
- name: re_replace - name: re_replace
args: ["([12][0-9]{3})", ""] args: ["([12][0-9]{3})", ""]
rows: rows:
selector: div#fancy-list-group ul.list-group li.list-group-item selector: div#fancy-list-group ul.list-group li.list-group-item
fields: fields:
_quality: _quality:
selector: div.list-group-item-content p.m-0 span.badge-primary:contains("1080p"), div.list-group-item-content p.m-0 span.badge-primary:contains("720p"), div.list-group-item-content p.m-0 span.badge-primary:contains("4k") selector: div.list-group-item-content p.m-0 span.badge-primary:contains("1080p"), div.list-group-item-content p.m-0 span.badge-primary:contains("720p"), div.list-group-item-content p.m-0 span.badge-primary:contains("4k")
@@ -196,69 +198,70 @@
attribute: src attribute: src
case: case:
# unfortunately the site does not have category numbers on the results page, just a .png which can apply to both movies and tv. # unfortunately the site does not have category numbers on the results page, just a .png which can apply to both movies and tv.
# therefore I've order the list to favour movies, # therefore I've order the list to favour movies,
# also, not all .png have been verified as the site has many empty categories. their image names have been extrapolated from the cat desc. # also, not all .png have been verified as the site has many empty categories. their image names have been extrapolated from the cat desc.
"[src$=\"/XXXZ.png\"]": "74" "[src$=\"/XXXZ.png\"]": 74
"[src$=\"/Hentai.png\"]": "75" "[src$=\"/Hentai.png\"]": 75
"[src$=\"/Anime.png\"]": "69" "[src$=\"/Anime.png\"]": 69
"[src$=\"/Windows.png\"]": "21" "[src$=\"/Windows.png\"]": 21
"[src$=\"/Mac.png\"]": "22" "[src$=\"/Mac.png\"]": 22
"[src$=\"/Android.png\"]": "23" "[src$=\"/Android.png\"]": 23
"[src$=\"/Linux.png\"]": "25" "[src$=\"/Linux.png\"]": 25
"[src$=\"/iPhone.png\"]": "26" "[src$=\"/iPhone.png\"]": 26
"[src$=\"/iPad.png\"]": "27" "[src$=\"/iPad.png\"]": 27
"[src$=\"/iPod.png\"]": "28" "[src$=\"/iPod.png\"]": 28
"[src$=\"/Cursos.png\"]": "71" "[src$=\"/Cursos.png\"]": 71
"[src$=\"/Apostila.png\"]": "72" "[src$=\"/Apostila.png\"]": 72
"[src$=\"/E-books.png\"]": "67" "[src$=\"/E-books.png\"]": 67
"[src$=\"/Revista.png\"]": "68" "[src$=\"/Revista.png\"]": 68
"[src$=\"/HQ.png\"]": "112" "[src$=\"/HQ.png\"]": 112
"[src$=\"/Filmes.png\"]": "119" "[src$=\"/Filmes.png\"]": 119
"[src$=\"/Revistas-XXX.png\"]": "70" "[src$=\"/Revistas-XXX.png\"]": 70
"[src$=\"/PS4.png\"]": "79" "[src$=\"/PS4.png\"]": 79
"[src$=\"/Jogos-PC.png\"]": "47" "[src$=\"/Jogos-PC.png\"]": 47
"[src$=\"/Emulador.png\"]": "61" "[src$=\"/Emulador.png\"]": 61
"[src$=\"/Emulacao.png\"]": "109" "[src$=\"/Emulacao.png\"]": 109
"[src$=\"/Jogos-Mac.png\"]": "48" "[src$=\"/Jogos-Mac.png\"]": 48
"[src$=\"/Jogos-PS1.png\"]": "49" "[src$=\"/Jogos-PS1.png\"]": 49
"[src$=\"/Jogos-PS2.png\"]": "50" "[src$=\"/Jogos-PS2.png\"]": 50
"[src$=\"/Jogos-PS3.png\"]": "51" "[src$=\"/Jogos-PS3.png\"]": 51
"[src$=\"/Jogos-Dreamcast.png\"]": "52" "[src$=\"/Jogos-Dreamcast.png\"]": 52
"[src$=\"/Jogos-Xbox360.png\"]": "54" "[src$=\"/Jogos-Xbox360.png\"]": 54
"[src$=\"/Jogos-Xbox.png\"]": "56" "[src$=\"/Jogos-Xbox.png\"]": 56
"[src$=\"/Jogos-Wii.png\"]": "55" "[src$=\"/Jogos-Wii.png\"]": 55
"[src$=\"/Jogos-DS.png\"]": "58" "[src$=\"/Jogos-DS.png\"]": 58
"[src$=\"/jogosandroid.png\"]": "57" "[src$=\"/jogosandroid.png\"]": 57
"[src$=\"/Jogos-PSP.png\"]": "82" "[src$=\"/Jogos-PSP.png\"]": 82
"[src$=\"/Jogos-NS.png\"]": "110" "[src$=\"/Jogos-NS.png\"]": 110
"[src$=\"/Jogos-XboxOne.png\"]": "78" "[src$=\"/Jogos-XboxOne.png\"]": 78
"[src$=\"/Axe.png\"]": "29" "[src$=\"/Axe.png\"]": 29
"[src$=\"/Funk.png\"]": "31" "[src$=\"/Funk.png\"]": 31
"[src$=\"/Pagode.png\"]": "32" "[src$=\"/Pagode.png\"]": 32
"[src$=\"/HIP_HOP.png\"]": "33" "[src$=\"/HIP_HOP.png\"]": 33
"[src$=\"/Rap.png\"]": "34" "[src$=\"/Rap.png\"]": 34
"[src$=\"/Rock.png\"]": "36" "[src$=\"/Rock.png\"]": 36
"[src$=\"/Hard-Rock.png\"]": "37" "[src$=\"/Hard-Rock.png\"]": 37
"[src$=\"/Blues.png\"]": "38" "[src$=\"/Blues.png\"]": 38
"[src$=\"/Dance.png\"]": "39" "[src$=\"/Dance.png\"]": 39
"[src$=\"/Discografia.png\"]": "40" "[src$=\"/Discografia.png\"]": 40
"[src$=\"/Erudita.png\"]": "41" "[src$=\"/Erudita.png\"]": 41
"[src$=\"/Forro.png\"]": "42" "[src$=\"/Forro.png\"]": 42
"[src$=\"/Dubstep.png\"]": "43" "[src$=\"/Dubstep.png\"]": 43
"[src$=\"/Sertanejo.png\"]": "46" "[src$=\"/Sertanejo.png\"]": 46
"[src$=\"/Samba.png\"]": "45" "[src$=\"/Samba.png\"]": 45
"[src$=\"/Musica-Outros.png\"]": "77" "[src$=\"/Musica-Outros.png\"]": 77
"[src$=\"/Reggae.png\"]": "76" "[src$=\"/Reggae.png\"]": 76
"[src$=\"/Gospel.png\"]": "83" "[src$=\"/Gospel.png\"]": 83
"[src$=\"/POP.png\"]": "115" "[src$=\"/POP.png\"]": 115
"[src$=\"/MPB.png\"]": "114" "[src$=\"/MPB.png\"]": 114
"[src$=\"/OST.png\"]": "84" "[src$=\"/OST.png\"]": 84
"[src$=\"/Seriados.png\"]": "120" "[src$=\"/Seriados.png\"]": 120
"[src$=\"/Shows.png\"]": "65" "[src$=\"/Shows.png\"]": 65
"[src$=\"/Aberta.png\"]": "63" "[src$=\"/Aberta.png\"]": 63
"[src$=\"/Esporte.png\"]": "62" "[src$=\"/Esporte.png\"]": 62
"[src$=\"/Fechada.png\"]": "64" "[src$=\"/Fechada.png\"]": 64
"[src$=\"/Videoaula.png\"]": "73" "[src$=\"/Videoaula.png\"]": 73
"*": 999
date: date:
text: now text: now
date: date:
@@ -284,5 +287,5 @@
"span.badge-success:contains(\"FREE\")": 0 "span.badge-success:contains(\"FREE\")": 0
"*": 1 "*": 1
uploadvolumefactor: uploadvolumefactor:
case: text: 1
"*": 1 # engine n/a

View File

@@ -1,4 +1,4 @@
--- ---
site: arabafenice site: arabafenice
name: ArabaFenice name: ArabaFenice
description: "Araba Fenice (Phoenix) is an ITALIAN Private site for TV / MOVIES / GENERAL" description: "Araba Fenice (Phoenix) is an ITALIAN Private site for TV / MOVIES / GENERAL"
@@ -14,7 +14,7 @@
categorymappings: categorymappings:
# HRS # HRS
- {id: 34, cat: Movies/HD, desc: "1080p HRS x264"} - {id: 34, cat: Movies/HD, desc: "1080p HRS x264"}
- {id: 47, cat: Movies/HD, desc: "2160p 4k UltraHD HRS"} - {id: 47, cat: Movies/UHD, desc: "2160p 4k UltraHD HRS"}
- {id: 35, cat: TV, desc: "Serie TV HRS"} - {id: 35, cat: TV, desc: "Serie TV HRS"}
- {id: 36, cat: Movies/SD, desc: "DVDRip HRS"} - {id: 36, cat: Movies/SD, desc: "DVDRip HRS"}
- {id: 41, cat: Movies/SD, desc: "BDRip 576p HRS"} - {id: 41, cat: Movies/SD, desc: "BDRip 576p HRS"}
@@ -38,7 +38,7 @@
- {id: 42, cat: TV, desc: "Serie Tv Sub Ita"} - {id: 42, cat: TV, desc: "Serie Tv Sub Ita"}
- {id: 15, cat: TV/Documentary, desc: "documentaries"} - {id: 15, cat: TV/Documentary, desc: "documentaries"}
- {id: 33, cat: TV, desc: "mp4"} - {id: 33, cat: TV, desc: "mp4"}
- {id: 40, cat: TV/HD, desc: "2160p 4K UltraHD"} - {id: 40, cat: TV/UHD, desc: "2160p 4K UltraHD"}
- {id: 38, cat: XXX, desc: "xXx"} - {id: 38, cat: XXX, desc: "xXx"}
- {id: 43, cat: Other, desc: "Arabic for social"} - {id: 43, cat: Other, desc: "Arabic for social"}
@@ -65,7 +65,7 @@
- {id: 32, cat: PC/Phone-Android, desc: "Android APP"} - {id: 32, cat: PC/Phone-Android, desc: "Android APP"}
modes: modes:
search: [q] search: [q, imdbid]
tv-search: [q, season, ep, imdbid] tv-search: [q, season, ep, imdbid]
movie-search: [q, imdbid] movie-search: [q, imdbid]

View File

@@ -1,4 +1,4 @@
--- ---
site: arenabg site: arenabg
name: ArenaBG name: ArenaBG
description: "ArenaBG is a BULGARIAN Semi-Private Torrent Tracker for 0DAY / GENERAL" description: "ArenaBG is a BULGARIAN Semi-Private Torrent Tracker for 0DAY / GENERAL"

View File

@@ -1,4 +1,4 @@
--- ---
site: asgaard site: asgaard
name: Asgaard name: Asgaard
description: "Asgaard (AG) is a NORDIC Private Torrent Tracker for MOVIES / TV / GENERAL" description: "Asgaard (AG) is a NORDIC Private Torrent Tracker for MOVIES / TV / GENERAL"
@@ -57,7 +57,7 @@
- {id: 43, cat: Books/Technical, desc: "Books Education"} - {id: 43, cat: Books/Technical, desc: "Books Education"}
modes: modes:
search: [q] search: [q, imdbid]
tv-search: [q, season, ep, imdbid] tv-search: [q, season, ep, imdbid]
movie-search: [q, imdbid] movie-search: [q, imdbid]
@@ -104,7 +104,7 @@
test: test:
path: / path: /
selector: a[href$="/logout.php"] selector: a[href$="/logout.php"]
search: search:
paths: paths:
# https://asgrd.org/browse.php?sns=&sna=&spf=&sr=&sg=&sys=&sye=&srs=&sre=&si=tt2401090&ss=&incldead=0&only_free=0&sort=4&type=desc # https://asgrd.org/browse.php?sns=&sna=&spf=&sr=&sg=&sys=&sye=&srs=&sre=&si=tt2401090&ss=&incldead=0&only_free=0&sort=4&type=desc
@@ -178,6 +178,5 @@
img[src="./images/gold.png"]: 0 img[src="./images/gold.png"]: 0
"*": 1 "*": 1
uploadvolumefactor: uploadvolumefactor:
case: text: 1
"*": 1
# Midgaard # Midgaard

View File

@@ -15,7 +15,7 @@
- {id: 3, cat: Audio, desc: "Music"} - {id: 3, cat: Audio, desc: "Music"}
modes: modes:
search: [q] search: [q, imdbid]
tv-search: [q, season, ep, imdbid] tv-search: [q, season, ep, imdbid]
movie-search: [q, imdbid] movie-search: [q, imdbid]

View File

@@ -6,7 +6,7 @@
type: public type: public
encoding: UTF-8 encoding: UTF-8
links: links:
- http://audiobookbay.nl/ - http://audiobookbay.nl/ # site forces http, does not support https
legacylinks: legacylinks:
- https://audiobookbay.la/ - https://audiobookbay.la/

View File

@@ -44,15 +44,27 @@
modes: modes:
search: [q] search: [q]
settings:
- name: username
type: text
label: Username
- name: password
type: password
label: Password
- name: info_results
type: info
label: Search results
default: "If you are getting the error <b>Login Failed, got redirected</b> then access the site with your browser and <b>mark as read</b> all PMs."
login: login:
path: takelogin.php path: takelogin.php
method: post method: post
inputs: inputs:
username: "{{ .Config.username }}" username: "{{ .Config.username }}"
password: "{{ .Config.password }}" password: "{{ .Config.password }}"
use_ssl: "1" use_ssl: 1
perm_ssl: "1" perm_ssl: 1
submitme: "X" submitme: X
error: error:
- selector: td.embedded:has(h2:contains("Oops")) - selector: td.embedded:has(h2:contains("Oops"))
- selector: td.embedded:has(h2:contains("failed")) - selector: td.embedded:has(h2:contains("failed"))
@@ -65,58 +77,38 @@
inputs: inputs:
$raw: "{{range .Categories}}c{{.}}=1&{{end}}" $raw: "{{range .Categories}}c{{.}}=1&{{end}}"
search: "{{ .Keywords }}" search: "{{ .Keywords }}"
searchin: "title" searchin: title
incldead: "1" incldead: 1
rows: rows:
selector: tr.browse_color, tr.freeleech_color, tr[id^="kdescr"] selector: tr.browse_color, tr.freeleech_color, tr[id^="kdescr"]
after: 1 after: 1
fields: # some users (rank specific?) have an extra column (td:nth-child(4)) with bookmark features fields: # some users (rank specific?) have an extra column (td:nth-child(4)) with bookmark features
banner:
selector: a[href^="details.php?id="][onmouseover]
attribute: onmouseover
filters:
- name: regexp
args: src=\'(.*?)\'
title:
selector: a[href^="details.php?id="][onmouseover]
attribute: onmouseover
filters:
- name: regexp
args: Tip\('<b>(.*?)</b>
category: category:
selector: a[href^="browse.php?cat="] selector: a[href^="browse.php?cat="]
attribute: href attribute: href
filters: filters:
- name: querystring - name: querystring
args: cat args: cat
title:
selector: a[href^="details.php?id="][onmouseover]
attribute: onmouseover
filters:
- name: regexp
args: Tip\('<b>(.*?)</b>
details: details:
selector: a[href^="details.php?id="][onmouseover] selector: a[href^="details.php?id="][onmouseover]
attribute: href attribute: href
download: download:
selector: a[href^="download.php"] selector: a[href^="download.php"]
attribute: href attribute: href
files: banner:
selector: a[href^="filelist.php"] selector: a[href^="details.php?id="][onmouseover]
size: attribute: onmouseover
selector: td:nth-last-child(6)
grabs:
selector: td:nth-last-child(5)
filters: filters:
- name: regexp - name: regexp
args: ([\d,]+) args: src=\'(.*?)\'
seeders:
selector: td:nth-last-child(4)
leechers:
selector: td:nth-last-child(3)
date:
selector: td:nth-last-child(7)
downloadvolumefactor:
case:
"a.info > b:contains(\"[FREE]\")": "0"
"*": "1"
uploadvolumefactor:
case:
"*": "1"
description: description:
selector: a[href^="details.php?id="][onmouseover] selector: a[href^="details.php?id="][onmouseover]
attribute: onmouseover attribute: onmouseover
@@ -130,7 +122,29 @@
- name: prepend - name: prepend
args: "{{ .Result.description }}<br>\n" args: "{{ .Result.description }}<br>\n"
description: description:
selector: td[colspan=13] selector: td[colspan="13"]
filters: filters:
- name: prepend - name: prepend
args: "{{ .Result.description }}<br>\n" args: "{{ .Result.description }}<br>\n"
files:
selector: td:nth-last-child(9)
date:
selector: td:nth-last-child(7)
size:
selector: td:nth-last-child(6)
grabs:
selector: td:nth-last-child(5)
filters:
- name: regexp
args: (\d+)
seeders:
selector: td:nth-last-child(4)
leechers:
selector: td:nth-last-child(3)
downloadvolumefactor:
case:
"a.info > b:contains(\"[FREE]\")": 0
"*": 1
uploadvolumefactor:
text: 1
# U-232 V4

View File

@@ -1,4 +1,4 @@
--- ---
site: audionews site: audionews
name: AudioNews name: AudioNews
description: "AudioNews (AN) is a Private Torrent Tracker for AUDIO SOFTWARE / SAMPLES / ETC" description: "AudioNews (AN) is a Private Torrent Tracker for AUDIO SOFTWARE / SAMPLES / ETC"

View File

@@ -40,6 +40,10 @@
options: options:
"desc": "desc" "desc": "desc"
"asc": "asc" "asc": "asc"
- name: info_login
type: info
label: "Password Changes"
default: "This site forces you to change your <b>Password</b> every <b>90 days</b>.<br/>If you get a <b>Login Failed, got redirected</b> error, then access the site with your browser and check if you need to change your password. Logout after saving, and update this config to login."
login: login:
path: login.php path: login.php
@@ -65,7 +69,7 @@
order_way: "{{ .Config.type }}" order_way: "{{ .Config.type }}"
rows: rows:
selector: table#torrent_table > tbody > tr.group, tr.torrent, tr.group_torrent:not(.edition_info) selector: table#torrent_table > tbody > tr.group, tr.torrent, tr.group_torrent:not(.edition_info)
fields: fields:
download: download:
@@ -94,4 +98,4 @@
"*": 1 "*": 1
uploadvolumefactor: uploadvolumefactor:
case: case:
"*": 1 "*": 1

View File

@@ -1,4 +1,4 @@
 site: backups site: backups
name: Back-ups name: Back-ups
description: "Back-Ups is a Private Torrent Tracker for MOVIES / TV / GENERAL" description: "Back-Ups is a Private Torrent Tracker for MOVIES / TV / GENERAL"
language: en-us language: en-us

View File

@@ -1,4 +1,4 @@
--- ---
site: baibako site: baibako
name: BaibaKo name: BaibaKo
description: "BaibaKo is a RUSSIAN Semi-Private Torrent Tracker for TV" description: "BaibaKo is a RUSSIAN Semi-Private Torrent Tracker for TV"
@@ -6,7 +6,7 @@
type: semi-private type: semi-private
encoding: windows-1251 encoding: windows-1251
links: links:
- http://baibako.tv/ - http://baibako.tv/ # site does not support https NET::ERR_CERT_AUTHORITY_INVALID
caps: caps:
categorymappings: categorymappings:

View File

@@ -21,7 +21,7 @@
- {id: 408, cat: Audio, desc: "HQ Audio/无损音乐"} - {id: 408, cat: Audio, desc: "HQ Audio/无损音乐"}
modes: modes:
search: [q] search: [q, imdbid]
tv-search: [q, season, ep, imdbid] tv-search: [q, season, ep, imdbid]
movie-search: [q, imdbid] movie-search: [q, imdbid]
@@ -96,7 +96,7 @@
args: cat args: cat
details: details:
selector: a[href^="details.php?id="] selector: a[href^="details.php?id="]
attribute: href attribute: href
download: download:
selector: a[href^="download.php?id="] selector: a[href^="download.php?id="]
attribute: href attribute: href
@@ -148,4 +148,4 @@
description: description:
selector: td:nth-child(2) selector: td:nth-child(2)
remove: a, img remove: a, img
# NexusPHP Standard v1.5 Beta 4 # NexusPHP Standard v1.5 Beta 4

View File

@@ -35,7 +35,7 @@
- {id: 2, cat: TV, desc: "TV"} - {id: 2, cat: TV, desc: "TV"}
modes: modes:
search: [q] search: [q, imdbid]
tv-search: [q, season, ep, imdbid] tv-search: [q, season, ep, imdbid]
movie-search: [q, imdbid] movie-search: [q, imdbid]
@@ -50,8 +50,8 @@
paths: paths:
- path: torrents - path: torrents
inputs: inputs:
$raw: "{{range .Categories}}categories[]={{.}}&{{end}}" $raw: "{{ range .Categories }}categories[]={{.}}&{{end}}"
search: "{{if .Query.IMDBID}}{{else}}{{ .Keywords }}{{end}}" search: "{{ if .Query.IMDBID }}{{else}}{{ .Keywords }}{{end}}"
description: "" description: ""
uploader: "" uploader: ""
imdb: "{{ .Query.IMDBIDShort }}" imdb: "{{ .Query.IMDBIDShort }}"
@@ -114,6 +114,5 @@
i[data-original-title="75% Promo"]: 0.25 i[data-original-title="75% Promo"]: 0.25
"*": 1 "*": 1
uploadvolumefactor: uploadvolumefactor:
case: text: 1
"*": 1 # UNIT3D
# UNIT3D

View File

@@ -14,7 +14,7 @@
- {id: 2, cat: TV, desc: "TV"} - {id: 2, cat: TV, desc: "TV"}
modes: modes:
search: [q] search: [q, imdbid]
tv-search: [q, season, ep, imdbid] tv-search: [q, season, ep, imdbid]
movie-search: [q, imdbid] movie-search: [q, imdbid]
@@ -126,6 +126,5 @@
i[data-original-title="75% Promo"]: 0.25 i[data-original-title="75% Promo"]: 0.25
"*": 1 "*": 1
uploadvolumefactor: uploadvolumefactor:
case: text: 1
"*": 1 # UNIT3D
# UNIT3D

View File

@@ -1,4 +1,4 @@
--- ---
site: bigfangroup site: bigfangroup
name: BigFANGroup name: BigFANGroup
description: "BigFANGroup is a RUSSIAN Public Torrent Tracker for MOVIES / TV" description: "BigFANGroup is a RUSSIAN Public Torrent Tracker for MOVIES / TV"

View File

@@ -6,6 +6,8 @@
type: private type: private
encoding: UTF-8 encoding: UTF-8
links: links:
- https://www.bigtorrent.eu/
legacylinks:
- http://www.bigtorrent.eu/ - http://www.bigtorrent.eu/
caps: caps:
@@ -96,4 +98,4 @@
"*": "1" "*": "1"
uploadvolumefactor: uploadvolumefactor:
case: case:
"*": "1" "*": "1"

View File

@@ -6,14 +6,16 @@
type: private type: private
encoding: UTF-8 encoding: UTF-8
links: links:
- http://bigtower.info/ - http://bigtower.info/ # site does not support https NET::ERR_CERT_DATE_INVALID
legacylinks:
- https://bigtower.info/
caps: caps:
categorymappings: categorymappings:
# Movies # Movies
- {id: 11, cat: Movies/HD, desc: "DSS"} - {id: 11, cat: Movies/HD, desc: "DSS"}
- {id: 1, cat: Movies, desc: "Screener"} - {id: 1, cat: Movies, desc: "Screener"}
- {id: 2, cat: Movies, desc: "DVDRip & BDRip"} - {id: 2, cat: Movies, desc: "DVDRip & BDRip"}
- {id: 3, cat: Movies/BluRay, desc: "Bluray 1080p & 720p"} - {id: 3, cat: Movies/BluRay, desc: "Bluray 1080p & 720p"}
- {id: 5, cat: Movies/UHD, desc: "Ultra HD 4K"} - {id: 5, cat: Movies/UHD, desc: "Ultra HD 4K"}
@@ -25,10 +27,10 @@
# MUSIC # MUSIC
- {id: 8, cat: Audio, desc: "Musica"} - {id: 8, cat: Audio, desc: "Musica"}
# SOFTWARE # SOFTWARE
- {id: 9, cat: PC/0day, desc: "Software"} - {id: 9, cat: PC/0day, desc: "Software"}
# PHONE # PHONE
- {id: 12, cat: PC/Phone-Other, desc: "Applicazioni"} - {id: 12, cat: PC/Phone-Other, desc: "Applicazioni"}

View File

@@ -1,4 +1,4 @@
--- ---
site: bit-titan site: bit-titan
name: BiT-TiTAN name: BiT-TiTAN
description: "BiT-TiTAN is a GERMAN Private Torrent Tracker for MOVIES / TV / GENERAL" description: "BiT-TiTAN is a GERMAN Private Torrent Tracker for MOVIES / TV / GENERAL"

View File

@@ -1,4 +1,4 @@
--- ---
site: bithorlo site: bithorlo
name: Bithorlo name: Bithorlo
description: "Bithorlo (BHO) is a HUNGARIAN Private Torrent Tracker for MOVIES / GENERAL" description: "Bithorlo (BHO) is a HUNGARIAN Private Torrent Tracker for MOVIES / GENERAL"
@@ -56,6 +56,10 @@
movie-search: [q] movie-search: [q]
settings: settings:
- name: info_alert
type: info
label: Alert about Cookie
default: "If during your cookie save you get the following error:</br><b>The 'Value'='xzlogin,xzrecover,xzsignup' part of the cookie is invalid.</b></br>Then remove <b>acopendivids=xzlogin,xzrecover,xzsignup; </b> from the cookie string before proceeding to save."
- name: cookie - name: cookie
type: text type: text
label: Cookie label: Cookie

View File

@@ -42,8 +42,8 @@
- {id: 27, cat: Other, desc: "Klipek"} - {id: 27, cat: Other, desc: "Klipek"}
modes: modes:
search: [q] search: [q, imdbid]
tv-search: [q, season, ep] tv-search: [q, season, ep, imdbid]
movie-search: [q, imdbid] movie-search: [q, imdbid]
login: login:
@@ -61,13 +61,15 @@
paths: paths:
- path: browse.php - path: browse.php
inputs: inputs:
$raw: "{{range .Categories}}c{{.}}=1&{{end}}" $raw: "{{ range .Categories }}c{{.}}=1&{{end}}"
search: "{{if .Query.IMDBID}}{{ .Query.IMDBID }}{{else}}{{ .Query.Keywords }}{{end}}" search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{else}}{{ .Keywords }}{{end}}"
incldead: 1 incldead: 1
rows: rows:
selector: table#torrenttable > tbody > tr:has(a[href^="details.php?id="]) selector: table#torrenttable > tbody > tr:has(a[href^="details.php?id="])
filters: filters:
- name: andmatch - name: andmatch
fields: fields:
# download button can be disbled in the profile, use details link instead # download button can be disbled in the profile, use details link instead
# download: # download:
@@ -156,3 +158,4 @@
args: ["tegnap", "yesterday"] args: ["tegnap", "yesterday"]
description: description:
selector: td:nth-child(2) > div selector: td:nth-child(2) > div
# engine tbd

View File

@@ -6,7 +6,7 @@
type: public type: public
encoding: UTF-8 encoding: UTF-8
links: links:
- http://bitru.org/ - http://bitru.org/ # site forces http, https is not supported
caps: caps:
categories: categories:
@@ -84,8 +84,8 @@
- name: regexp - name: regexp
args: "src=(.*?) " args: "src=(.*?) "
date: date:
# Сегодня в 09:09 от # Сегодня в 09:09 от
# Вчера в 22:47 от # Вчера в 22:47 от
selector: td:nth-child(2) div.b-info div span:nth-child(2):contains("Сегодня"), td:nth-child(2) div.b-info div span:nth-child(2):contains("Вчера") selector: td:nth-child(2) div.b-info div span:nth-child(2):contains("Сегодня"), td:nth-child(2) div.b-info div span:nth-child(2):contains("Вчера")
optional: true optional: true
filters: filters:
@@ -96,7 +96,7 @@
- name: replace - name: replace
args: ["Вчера в", "Yesterday"] args: ["Вчера в", "Yesterday"]
date: date:
# 08 ноября 2019 в 23:53 от # 08 ноября 2019 в 23:53 от
selector: td:nth-child(2) div.b-info div span:nth-child(2):not(:contains("Сегодня")):not(:contains("Вчера")) selector: td:nth-child(2) div.b-info div span:nth-child(2):not(:contains("Сегодня")):not(:contains("Вчера"))
optional: true optional: true
filters: filters:
@@ -134,7 +134,7 @@
selector: td:nth-child(3) selector: td:nth-child(3)
filters: filters:
- name: replace - name: replace
args: ["ТБ", "TB"] args: ["ТБ", "TB"]
- name: replace - name: replace
args: ["ГБ", "GB"] args: ["ГБ", "GB"]
- name: replace - name: replace
@@ -145,12 +145,12 @@
selector: td:nth-child(4) selector: td:nth-child(4)
filters: filters:
- name: replace - name: replace
args: ["?", "1"] args: ["?", "1"]
leechers: leechers:
selector: td:nth-child(5) selector: td:nth-child(5)
filters: filters:
- name: replace - name: replace
args: ["?", "0"] args: ["?", "0"]
downloadvolumefactor: downloadvolumefactor:
text: 0 text: 0
uploadvolumefactor: uploadvolumefactor:

View File

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

View File

@@ -6,8 +6,8 @@
type: private type: private
encoding: UTF-8 encoding: UTF-8
links: links:
- http://www.bitturk.net/ - http://www.bitturk.net/ # site does not support https ERR_CONNECTION_REFUSED
caps: caps:
categorymappings: categorymappings:
- {id: 69, cat: Movies, desc: "BiTTuRK Altın"} - {id: 69, cat: Movies, desc: "BiTTuRK Altın"}
@@ -20,6 +20,7 @@
- {id: 67, cat: XXX, desc: "XxX"} - {id: 67, cat: XXX, desc: "XxX"}
- {id: 68, cat: Movies, desc: "Dual (TR-~)"} - {id: 68, cat: Movies, desc: "Dual (TR-~)"}
- {id: 58, cat: Movies, desc: "Film"} - {id: 58, cat: Movies, desc: "Film"}
- {id: 72, cat: Movies, desc: "Belgesel"}
- {id: 60, cat: Movies/3D, desc: "3D"} - {id: 60, cat: Movies/3D, desc: "3D"}
- {id: 45, cat: Movies, desc: "Eğitim / Prog "} - {id: 45, cat: Movies, desc: "Eğitim / Prog "}
- {id: 1, cat: Movies, desc: "Filmler"} - {id: 1, cat: Movies, desc: "Filmler"}
@@ -52,12 +53,12 @@
- {id: 50, cat: TV, desc: "Yab@ncı Dizi"} - {id: 50, cat: TV, desc: "Yab@ncı Dizi"}
- {id: 51, cat: TV, desc: "Yerli Dizi"} - {id: 51, cat: TV, desc: "Yerli Dizi"}
- {id: 44, cat: Books, desc: "E-BooK"} - {id: 44, cat: Books, desc: "E-BooK"}
modes: modes:
search: [q] search: [q]
tv-search: [q, season, ep] tv-search: [q, season, ep]
movie-search: [q] movie-search: [q]
settings: settings:
- name: username - name: username
type: text type: text
@@ -84,7 +85,7 @@
options: options:
"desc": "desc" "desc": "desc"
"asc": "asc" "asc": "asc"
login: login:
path: ?p=home&pid=1 path: ?p=home&pid=1
method: form method: form
@@ -106,11 +107,11 @@
test: test:
path: ?p=home&pid=1 path: ?p=home&pid=1
selector: a[href*="/?p=logout&"] selector: a[href*="/?p=logout&"]
search: search:
paths: paths:
- path: / - path: /
keywordsfilters: keywordsfilters:
- name: re_replace - name: re_replace
args: ["[^a-zA-Z0-9]+", "%25"] args: ["[^a-zA-Z0-9]+", "%25"]
inputs: inputs:
@@ -145,7 +146,7 @@
attribute: href attribute: href
date: date:
optional: true optional: true
# Uploaded 30-01-2019 15:02 by # Uploaded 30-01-2019 15:02 by
selector: td.torrent_name:not(:contains(" at ")) selector: td.torrent_name:not(:contains(" at "))
filters: filters:
- name: regexp - name: regexp

View File

@@ -1,4 +1,4 @@
--- ---
site: bluebirdhd site: bluebirdhd
name: BlueBird name: BlueBird
description: "BlueBird is a RUSSIAN Private Torrent Tracker for HD MOVIES" description: "BlueBird is a RUSSIAN Private Torrent Tracker for HD MOVIES"

View File

@@ -13,9 +13,11 @@
- {id: 1, cat: Movies, desc: "Movies"} - {id: 1, cat: Movies, desc: "Movies"}
- {id: 2, cat: TV, desc: "TV"} - {id: 2, cat: TV, desc: "TV"}
- {id: 3, cat: Movies, desc: "FANRES"} - {id: 3, cat: Movies, desc: "FANRES"}
- {id: 6, cat: TV/Anime, desc: "Anime"}
- {id: 7, cat: Movies/Other, desc: "Trailer"}
modes: modes:
search: [q] search: [q, imdbid]
tv-search: [q, season, ep, imdbid] tv-search: [q, season, ep, imdbid]
movie-search: [q, imdbid] movie-search: [q, imdbid]
@@ -51,7 +53,7 @@
test: test:
path: / path: /
selector: a[href$="/logout"] selector: a[href$="/logout"]
ratio: ratio:
path: / path: /
selector: li:has(i.fa-sync-alt) selector: li:has(i.fa-sync-alt)

View File

@@ -1,4 +1,4 @@
--- ---
site: booktracker site: booktracker
name: BookTracker name: BookTracker
description: "BookTracker is a RUSSIAN Semi-Private Torrent Tracker for EBOOKS" description: "BookTracker is a RUSSIAN Semi-Private Torrent Tracker for EBOOKS"

View File

@@ -0,0 +1,133 @@
---
site: boxingtorrents
name: Boxing Torrents
description: "Boxing Torrents is a Private Torrent Tracker for BOXING"
language: en-us
type: private
encoding: UTF-8
links:
- https://tc-boxing.com/
caps:
categorymappings:
- {id: 15, cat: TV/Sport, desc: "3D"}
- {id: 9, cat: TV/Sport, desc: "Amateur - Full"}
- {id: 16, cat: TV/Sport, desc: "Blu-ray"}
- {id: 13, cat: TV/Sport, desc: "Career Set"}
- {id: 8, cat: TV/Sport, desc: "DVD"}
- {id: 10, cat: TV/Sport, desc: "Foreign - Excellent"}
- {id: 11, cat: TV/Sport, desc: "Foreign - Fair"}
- {id: 6, cat: TV/Sport, desc: "Foreign - Good"}
- {id: 12, cat: TV/Sport, desc: "Foreign - Poor"}
- {id: 1, cat: TV/Sport, desc: "Full - Excellent"}
- {id: 3, cat: TV/Sport, desc: "Full - Fair"}
- {id: 2, cat: TV/Sport, desc: "Full - Good"}
- {id: 4, cat: TV/Sport, desc: "Full - Poor"}
- {id: 14, cat: TV/Sport, desc: "HD"}
- {id: 7, cat: TV/Sport, desc: "Misc"}
modes:
search: [q]
tv-search: [q, season, ep]
settings:
- name: username
type: text
label: Username
- name: password
type: password
label: Password
- name: sort
type: select
label: Sort requested from site
default: "added"
options:
"added": "created"
"seeders": "seeders"
"size": "size"
"name": "title"
- name: type
type: select
label: Order requested from site
default: "DESC"
options:
"DESC": "desc"
"ASC": "asc"
- name: info_download
type: info
label: "Download Restrictions"
default: "You must have uploaded at least 10GB before you are able to access all torrent sizes. Until then, you are restricted to torrents no larger than 2.5GB."
login:
path: takelogin.php
method: post
inputs:
username: "{{ .Config.username }}"
password: "{{ .Config.password }}"
error:
- selector: td.embedded:contains("Login failed!")
test:
path: browse.php
selector: a[href="logout.php"]
download:
selector: a[href^="download.php"]
attribute: href
search:
paths:
# https://tc-boxing.com/browse.php?c16=1&c8=1&c14=1&incldead=1
# https://tc-boxing.com/browse.php?search=tyson&cat=0&incldead=1
- path: browse.php
inputs:
$raw: "{{ if .Categories }}{{ range .Categories }}c{{.}}=1&{{end}}{{else}}cat=0{{end}}"
# 0 active 1 incldead 2 onlydead
incldead: 1
search: "{{ .Keywords }}"
sort: "{{ .Config.sort }}"
d: "{{ .Config.type }}"
rows:
selector: table[border="1"][cellspacing="0"][cellpadding="5"] tr:has(a[href^="details.php?id="])
fields:
category:
selector: a[href^="browse.php?cat="]
attribute: href
filters:
- name: querystring
args: cat
title:
selector: a[href^="details.php?id="]
details:
selector: a[href^="details.php?id="]
attribute: href
download:
selector: a[href^="details.php?id="]
attribute: href
files:
selector: td:nth-last-child(8)
date:
selector: td:nth-last-child(6)
filters:
- name: dateparse
args: "2006-01-0215:04:05"
size:
selector: td:nth-last-child(5)
grabs:
selector: td:nth-last-child(4)
filters:
- name: regexp
args: (\d+)
seeders:
selector: td:nth-last-child(3)
leechers:
selector: td:nth-last-child(2)
downloadvolumefactor:
case:
"b:contains(\"FreeLeech\")": 0
"*": 1
uploadvolumefactor:
text: 1
# engine n/a

View File

@@ -6,6 +6,8 @@
type: private type: private
encoding: UTF-8 encoding: UTF-8
links: links:
- https://broadcity.in/
legacylinks:
- http://broadcity.in/ - http://broadcity.in/
caps: caps:

View File

@@ -15,7 +15,7 @@
- {id: 410, cat: TV, desc: "TV Series/剧集"} - {id: 410, cat: TV, desc: "TV Series/剧集"}
modes: modes:
search: [q] search: [q, imdbid]
tv-search: [q, season, ep, imdbid] tv-search: [q, season, ep, imdbid]
movie-search: [q, imdbid] movie-search: [q, imdbid]
@@ -43,7 +43,7 @@
options: options:
"desc": "desc" "desc": "desc"
"asc": "asc" "asc": "asc"
login: login:
method: cookie method: cookie
inputs: inputs:
@@ -86,7 +86,7 @@
args: cat args: cat
details: details:
selector: a[href^="details.php?id="] selector: a[href^="details.php?id="]
attribute: href attribute: href
download: download:
selector: a[href^="download.php?id="] selector: a[href^="download.php?id="]
attribute: href attribute: href

View File

@@ -5,12 +5,14 @@
language: en-us language: en-us
type: public type: public
encoding: UTF-8 encoding: UTF-8
followredirect: true
links: links:
- https://btdb.io/ - https://btdb.io/
legacylinks: legacylinks:
- https://btdb.to/ - https://btdb.to/
- https://btdb.unblocked.app/ - https://btdb.unblocked.app/
- https://btdb.eu/ - https://btdb.eu/
- https://btdb.unblockit.pro/
caps: caps:
categorymappings: categorymappings:
@@ -33,39 +35,59 @@
options: options:
"time": "created" "time": "created"
"length": "size" "length": "size"
"popular": "seeders" "seeders": "seeders"
search: search:
paths: paths:
- path: "{{ if .Keywords }}?s={{ .Keywords }}&sort={{ .Config.sort }}{{else}}recent?sort={{ .Config.sort }}{{end}}" - path: "{{ if .Keywords }}search/{{ .Keywords }}/{{else}}recent{{end}}?sort={{ .Config.sort }}"
- path: "{{ if .Keywords }}search/{{ .Keywords }}/{{else}}recent{{end}}?sort={{ .Config.sort }}&page=2"
- path: "{{ if .Keywords }}search/{{ .Keywords }}/{{else}}recent{{end}}?sort={{ .Config.sort }}&page=3"
- path: "{{ if .Keywords }}search/{{ .Keywords }}/{{else}}recent{{end}}?sort={{ .Config.sort }}&page=4"
- path: "{{ if .Keywords }}search/{{ .Keywords }}/{{else}}recent{{end}}?sort={{ .Config.sort }}&page=5"
rows: rows:
selector: li[class$="item"] selector: div.media
fields: fields:
title:
selector: h2[class$="title"] a[href*="/torrent/"]
attribute: title
category: category:
text: 1 text: 1
title:
selector: a[href*="/torrent/"]
details: details:
selector: h2[class$="title"] a[href*="/torrent/"] selector: a[href*="/torrent/"]
attribute: href attribute: href
download:
# download can be missing despite icon being present. Fortunately the magnet is always there
selector: a[href$=".torrent"]
attribute: href
optional: true
magnet: magnet:
selector: div[class$="info"] a[href^="magnet:?xt="] selector: a[href^="magnet:?xt="]
attribute: href attribute: href
banner:
selector: a.img-thumbnail img
attribute: src
filters:
- name: replace
args: ["https://btdb.io/assets/img/placeholder.png", ""]
size: size:
selector: div[class$="info"] span:nth-of-type(1) selector: small:nth-of-type(1) strong
files: files:
selector: div[class$="info"] span:nth-of-type(2) selector: small:nth-of-type(2) strong
seeders:
selector: small:nth-of-type(3) strong
filters:
- name: replace
args: [",", ""]
leechers:
selector: small:nth-of-type(4) strong
filters:
- name: replace
args: [",", ""]
date: date:
selector: div[class$="info"] span:nth-of-type(3) selector: small:nth-of-type(5) strong
filters: filters:
- name: timeago - name: timeago
seeders:
selector: div[class$="info"] span:nth-of-type(4)
leechers:
selector: div[class$="info"] span:nth-of-type(5)
downloadvolumefactor: downloadvolumefactor:
text: 0 text: 0
uploadvolumefactor: uploadvolumefactor:

View File

@@ -20,7 +20,7 @@
settings: settings:
- name: info - name: info
type: info type: info
default: BTDigg does not use categories. In your software Indexer settings, set the category to 100001. default: BTDigg does not use categories. In your software Indexer settings, set the category to 7000.
- name: sort - name: sort
type: select type: select
label: Sort requested from site label: Sort requested from site

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 7000.
download:
selector: a[href^="magnet:?xt="]
attribute: href
search:
# https://www.bteye.org/q/2020
paths:
- path: "q/{{ if .Keywords }}{{ .Keywords }}{{else}}2020{{end}}"
rows:
selector: div.plist
filters:
- name: andmatch
fields:
category:
text: 1
title:
selector: div.pname a
attribute: title
details:
selector: div.pname a
attribute: href
download:
selector: div.pname a
attribute: href
date:
selector: div.plink b:nth-of-type(3)
filters:
- name: dateparse
args: "2006-01-02"
files:
selector: div.plink b:nth-of-type(2)
size:
selector: div.plink b:nth-of-type(1)
seeders:
text: 1
leechers:
text: 1
downloadvolumefactor:
text: 0
uploadvolumefactor:
text: 1
# engine n/a

View File

@@ -1,4 +1,4 @@
--- ---
site: btnext site: btnext
name: BTNext name: BTNext
description: "BTNext (BTNT) is a PORTUGUESE Private Torrent Tracker for 0DAY / GENERAL" description: "BTNext (BTNT) is a PORTUGUESE Private Torrent Tracker for 0DAY / GENERAL"
@@ -6,7 +6,7 @@
type: private type: private
encoding: UTF-8 encoding: UTF-8
links: links:
- http://tracker.btnext.com/ - http://tracker.btnext.com/ # site forces http, https is not supported
caps: caps:
categorymappings: categorymappings:
@@ -15,67 +15,80 @@
- {id: 89, cat: Console, desc: "Games"} - {id: 89, cat: Console, desc: "Games"}
- {id: 87, cat: TV, desc: "Series"} - {id: 87, cat: TV, desc: "Series"}
- {id: 93, cat: Audio, desc: "Musica"} - {id: 93, cat: Audio, desc: "Musica"}
- {id: 108, cat: Movies, desc: "ViP"}
- {id: 1, cat: Movies, desc: "Movies"} - {id: 1, cat: Movies, desc: "Movies"}
- {id: 70, cat: Movies/3D, desc: "3D"} - {id: 70, cat: Movies/3D, desc: "Movies 3D"}
- {id: 71, cat: Movies/Sd, desc: "480p"} - {id: 71, cat: Movies/SD, desc: "Movies 480p"}
- {id: 72, cat: Movies/BluRay, desc: "BD-R"} - {id: 72, cat: Movies/BluRay, desc: "Movies BD-R"}
- {id: 31, cat: Movies/HD, desc: "BDRIP/BRRip"} - {id: 31, cat: Movies/HD, desc: "Movies BDRIP/BRRip"}
- {id: 16, cat: Movies/SD, desc: "CAM"} - {id: 16, cat: Movies/SD, desc: "Movies CAM"}
- {id: 74, cat: Movies/DVD, desc: "DvD-R"} - {id: 74, cat: Movies/DVD, desc: "Movies DvD-R"}
- {id: 17, cat: Movies/HD, desc: "HD"} - {id: 76, cat: Movies, desc: "Movies Packs"}
- {id: 91, cat: Movies/Other, desc: "Kids"} - {id: 115, cat: Movies/Other, desc: "Movies Kids"}
- {id: 76, cat: Movies, desc: "Packs"} - {id: 91, cat: Movies/Other, desc: "Movies Kids Inglês"}
- {id: 77, cat: Movies/WEBDL, desc: "WEB-DL"} - {id: 113, cat: Movies/Other, desc: "Movies Kids PT-BR"}
- {id: 14, cat: Movies/SD, desc: "DVDRip/XViD"} - {id: 114, cat: Movies/Other, desc: "Movies Kids PT-PT"}
- {id: 85, cat: Movies/DVD, desc: "Custom-DVDR"} - {id: 77, cat: Movies/WEBDL, desc: "Movies WEB-DL"}
- {id: 96, cat: Movies/HD, desc: "4K"} - {id: 85, cat: Movies/DVD, desc: "Movies Custom-DVDR"}
- {id: 6, cat: PC, desc: "Applications"} - {id: 14, cat: Movies/SD, desc: "Movies DVDRip/XViD"}
- {id: 18, cat: PC/ISO, desc: "PC Applications"} - {id: 98, cat: Movies/Other, desc: "Movies Juvenil"}
- {id: 19, cat: PC/Mac, desc: "Macintosh Applications"} - {id: 104, cat: Movies/UHD, desc: "Movies Bluray-UHD"}
- {id: 34, cat: PC/ISO, desc: "Linux Applications"} - {id: 102, cat: Movies/HD, desc: "Movies HD-720p"}
- {id: 7, cat: Audio, desc: "Music"} - {id: 101, cat: Movies/HD, desc: "Movies HD-1080p"}
- {id: 20, cat: Audio/Video, desc: "MVideo"} - {id: 103, cat: Movies/UHD, desc: "Movies HD-2160p"}
- {id: 21, cat: Audio/MP3, desc: "Mp3"}
- {id: 33, cat: Audio/Other, desc: "Mp4"}
- {id: 32, cat: Audio/Lossless, desc: "FLAC"}
- {id: 2, cat: Console, desc: "Games"}
- {id: 78, cat: PC/Games, desc: "Linux"}
- {id: 79, cat: PC/Mac, desc: "MacOSX"}
- {id: 28, cat: Console/NDS, desc: "Nintendo DS"}
- {id: 27, cat: PC/Games, desc: "PC/Windows"}
- {id: 80, cat: Console/PS3, desc: "PS2"}
- {id: 81, cat: Console/PS3, desc: "PS3"}
- {id: 82, cat: Console/PS4, desc: "PS4"}
- {id: 83, cat: Console/PSP, desc: "PSP"}
- {id: 95, cat: Console/PSVita, desc: "PSVITA"}
- {id: 4, cat: Console/Wii, desc: "Wii"}
- {id: 26, cat: Console/Xbox360, desc: "XBOX360"}
- {id: 84, cat: Console/Xbox, desc: "XONE"}
- {id: 42, cat: TV, desc: "TV Series"} - {id: 42, cat: TV, desc: "TV Series"}
- {id: 45, cat: TV/Documentary, desc: "Documentaries"} - {id: 45, cat: TV/Documentary, desc: "Documentaries"}
- {id: 46, cat: TV/Sport, desc: "Sports"} - {id: 46, cat: TV/Sport, desc: "Sports"}
- {id: 47, cat: TV/HD, desc: "TV-Bluray"} - {id: 47, cat: TV/HD, desc: "TV Bluray"}
- {id: 48, cat: TV/SD, desc: "TV-Dvd-R"} - {id: 48, cat: TV/SD, desc: "TV Dvd-R"}
- {id: 49, cat: TV/SD, desc: "TV-DVDRiP"} - {id: 49, cat: TV/SD, desc: "TV DVDRiP"}
- {id: 50, cat: TV, desc: "TV-Packs"} - {id: 50, cat: TV, desc: "TV Packs"}
- {id: 92, cat: TV/Anime, desc: "TV-Kids"} - {id: 92, cat: TV, desc: "TV Kids"}
- {id: 52, cat: TV/SD, desc: "TV-SDx264"} - {id: 112, cat: TV, desc: "TV Juvenil"}
- {id: 53, cat: TV/WEB-DL, desc: "TV-WEB-DL"} - {id: 52, cat: TV/SD, desc: "TV SDx264"}
- {id: 55, cat: TV/HD, desc: "TV-X264"} - {id: 53, cat: TV/WEB-DL, desc: "TV WEB-DL"}
- {id: 55, cat: TV/HD, desc: "TV X264"}
- {id: 56, cat: TV/SD, desc: "TV-XViD"} - {id: 56, cat: TV/SD, desc: "TV-XViD"}
- {id: 44, cat: TV, desc: "Miscellaneous"} - {id: 7, cat: Audio, desc: "Music"}
- {id: 51, cat: TV/Anime, desc: "Anime"} - {id: 20, cat: Audio/Video, desc: "Music MVideo"}
- {id: 54, cat: Audio/Audiobook, desc: "Audiobook"} - {id: 21, cat: Audio/MP3, desc: "Music MP3"}
- {id: 57, cat: Books, desc: "E-Books"} - {id: 33, cat: Audio/Video, desc: "Music MP4"}
- {id: 58, cat: Books/Comics, desc: "Comics"} - {id: 32, cat: Audio/Lossless, desc: "Music FLAC"}
- {id: 59, cat: Books, desc: "Educational"} - {id: 2, cat: Console, desc: "Games"}
- {id: 60, cat: Books, desc: "Magazines/Journals"} - {id: 78, cat: PC/Games, desc: "Games Linux"}
- {id: 79, cat: PC/Mac, desc: "Games MacOSX"}
- {id: 28, cat: Console/NDS, desc: "Games Nintendo DS"}
- {id: 27, cat: PC/Games, desc: "Games PC/Windows"}
- {id: 111, cat: Console, desc: "Games Nintendo Sw"}
- {id: 80, cat: Console/PS3, desc: "Games PS2"}
- {id: 81, cat: Console/PS3, desc: "Games PS3"}
- {id: 82, cat: Console/PS4, desc: "Games PS4"}
- {id: 83, cat: Console/PSP, desc: "Games PSP"}
- {id: 95, cat: Console/PSVita, desc: "Games PSVITA"}
- {id: 4, cat: Console/Wii, desc: "Games Wii"}
- {id: 26, cat: Console/Xbox360, desc: "Games XBOX360"}
- {id: 84, cat: Console/Xbox, desc: "Games XONE"}
- {id: 6, cat: PC, desc: "Applications"}
- {id: 18, cat: PC/ISO, desc: "Applications PC"}
- {id: 19, cat: PC/Mac, desc: "Applications Macintosh"}
- {id: 34, cat: PC/ISO, desc: "Applications Linux"}
- {id: 44, cat: Other, desc: "Miscellaneous"}
- {id: 54, cat: Audio/Audiobook, desc: "Books Audiobook"}
- {id: 57, cat: Books/Ebook, desc: "Books E-Books"}
- {id: 58, cat: Books/Comics, desc: "Books Comics"}
- {id: 59, cat: Books, desc: "Books Educational"}
- {id: 60, cat: Books/Magazines, desc: "Books Magazines/Journals"}
- {id: 61, cat: Other, desc: "Pics/Wallpapers"} - {id: 61, cat: Other, desc: "Pics/Wallpapers"}
- {id: 62, cat: PC/Phone-Android, desc: "Android"} - {id: 62, cat: PC/Phone-Android, desc: "Android"}
- {id: 63, cat: PC/Phone-IOS, desc: "iOS"} - {id: 63, cat: PC/Phone-IOS, desc: "iOS"}
- {id: 66, cat: PC/Phone-Other, desc: "WindowsPhone"} - {id: 66, cat: PC/Phone-Other, desc: "WindowsPhone"}
- {id: 90, cat: Other, desc: "GPS"} - {id: 90, cat: Other, desc: "GPS"}
- {id: 68, cat: Other, desc: "Others"} - {id: 68, cat: Other, desc: "Others"}
- {id: 100, cat: Other, desc: "Revistas"}
- {id: 109, cat: TV/Anime, desc: "Anime"}
- {id: 51, cat: TV/Anime, desc: "Anime Filmes"}
- {id: 99, cat: TV/Anime, desc: "Anime Hentai"}
- {id: 110, cat: TV/Anime, desc: "Anime TV Séries"}
- {id: 41, cat: XXX, desc: "XXX"} - {id: 41, cat: XXX, desc: "XXX"}
- {id: 64, cat: XXX, desc: "XXX-Magazines"} - {id: 64, cat: XXX, desc: "XXX-Magazines"}
- {id: 65, cat: XXX, desc: "XXX-Movies"} - {id: 65, cat: XXX, desc: "XXX-Movies"}
@@ -83,8 +96,40 @@
- {id: 69, cat: XXX/Imageset, desc: "XXX-Pics/Wallpapers"} - {id: 69, cat: XXX/Imageset, desc: "XXX-Pics/Wallpapers"}
modes: modes:
search: [q] search: [q, imdbid]
tv-search: [q, season, ep] tv-search: [q, season, ep, imdbid]
movie-search: [q, imdbid]
settings:
- name: username
type: text
label: Username
- name: password
type: password
label: Password
- name: info
type: info
label: Layout
default: "<ol><li>Only the English Classic profile is supported.<li>Make sure to set the <b>Torrent Listing (Lista de Torrents)</b> option in your profile to <b>Classic (Clássico)</b><li>Using the <i>Moderna</i> theme will prevent results.</ol>"
- name: sort
type: select
label: Sort requested from site
default: "added"
options:
"added": "created"
"seeders": "seeders"
"size": "size"
- name: type
type: select
label: Order requested from site
default: "desc"
options:
"desc": "desc"
"asc": "asc"
- name: info_results
type: info
label: Search results
default: "If you get 0 results check the log for error: <b>An error has occured!You can't view this page unless you read all your unread messages</b>, then access the site with your browser and <b>mark as read</b> all PMs."
login: login:
path: ?p=home&pid=1 path: ?p=home&pid=1
@@ -92,7 +137,7 @@
form: form#loginbox_form form: form#loginbox_form
submitpath: /ajax/login.php submitpath: /ajax/login.php
inputs: inputs:
action: "login" action: login
loginbox_membername: "{{ .Config.username }}" loginbox_membername: "{{ .Config.username }}"
loginbox_password: "{{ .Config.password }}" loginbox_password: "{{ .Config.password }}"
loginbox_remember: 1 loginbox_remember: 1
@@ -111,16 +156,18 @@
search: search:
paths: paths:
- path: / - path: /
keywordsfilters: keywordsfilters:
- name: re_replace - name: re_replace
args: ["[^a-zA-Z0-9]+", "%25"] args: ["[^a-zA-Z0-9]+", "%25"]
inputs: inputs:
p: torrents p: torrents
pid: 32 pid: 32
$raw: "{{ range .Categories }}cid[]={{.}}&{{end}}" $raw: "{{ range .Categories }}cid[]={{.}}&{{end}}"
keywords: "{{ .Keywords }}" keywords: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{else}}{{ .Keywords }}{{end}}"
search_type: name # name , description , both , uploader
searchin: title search_type: "{{ if .Query.IMDBID }}description{{else}}name{{end}}"
"sortOptions[sortBy]": "{{ .Config.sort }}"
"sortOptions[sortOrder]": "{{ .Config.type }}"
error: error:
- selector: div.error:not(:contains("Não existem resultados encontrados.")):not(:contains("There are no results found.")) - selector: div.error:not(:contains("Não existem resultados encontrados.")):not(:contains("There are no results found."))
@@ -154,28 +201,62 @@
selector: a[rel="fancybox"] selector: a[rel="fancybox"]
optional: true optional: true
attribute: href attribute: href
imdb:
# a href="http://tracker.btnext.com/data/torrents/imdb/tt0249677.jpg"
optional: true
selector: a[href*="/imdb/tt"]
attribute: href
filters:
- name: regexp
args: "imdb/(.+?).jpg"
- name: prepend
args: "https://www.imdb.com/title/"
downloadvolumefactor: downloadvolumefactor:
case: case:
"img[title=\"FREE!\"]": 0 "img[title=\"FREE!\"]": 0
"*": 1 "*": 1
uploadvolumefactor: uploadvolumefactor:
case: text: 1
"*": 1
date: date:
selector: td.torrent_name > abbr.timeago selector: td.torrent_name > abbr.timeago
optional: true optional: true
attribute: data-time attribute: data-time
date: date:
selector: td.torrent_name:not(:has(abbr.timeago)) selector: td.torrent_name:not(:has(abbr.timeago)):not(:contains("day")):not(:contains("Domingo")):not(:contains("Sábado")):not(:contains("Sexta")):not(:contains("Quinta")):not(:contains("Quarta")):not(:contains("Terça")):not(:contains("Segunda")):not(:contains("ontem")):not(:contains("Hoje"))
optional: true optional: true
remove: span, a, br remove: span, a, br
filters: filters:
- name: replace - name: replace
args: ["Enviado ", ""] # Uploaded args: ["Enviado ", ""] # Uploaded
- name: replace
args: ["Uploaded ", ""]
- name: replace - name: replace
args: [" por", ""] # by args: [" por", ""] # by
- name: replace
args: [" by", ""]
- name: replace - name: replace
args: ["às ", ""] # at args: ["às ", ""] # at
- name: replace
args: ["at ", ""]
- name: dateparse
args: "02-01-2006 15:04"
date:
selector: td.torrent_name:not(:has(abbr.timeago)):contains("day"), td.torrent_name:not(:has(abbr.timeago)):contains("Domingo"), td.torrent_name:not(:has(abbr.timeago)):contains("Sábado"), td.torrent_name:not(:has(abbr.timeago)):contains("Quinta"), td.torrent_name:not(:has(abbr.timeago)):contains("Sexta"), td.torrent_name:not(:has(abbr.timeago)):contains("Quarta"), td.torrent_name:not(:has(abbr.timeago)):contains("Terça"), td.torrent_name:not(:has(abbr.timeago)):contains("Segunda"), td.torrent_name:not(:has(abbr.timeago)):contains("ontem"), td.torrent_name:not(:has(abbr.timeago)):contains("Hoje")
optional: true
remove: span, a, br
filters:
- name: replace
args: ["Enviado ", ""] # Uploaded
- name: replace
args: ["Uploaded ", ""]
- name: replace
args: [" por", ""] # by
- name: replace
args: [" by", ""]
- name: replace
args: ["às ", ""] # at
- name: replace
args: ["at ", ""]
- name: replace - name: replace
args: ["Hoje", "Today"] args: ["Hoje", "Today"]
- name: replace - name: replace
@@ -194,6 +275,5 @@
args: ["Sábado", "Saturday"] args: ["Sábado", "Saturday"]
- name: replace - name: replace
args: ["Domingo", "Sunday"] args: ["Domingo", "Sunday"]
- name: dateparse - name: fuzzytime
args: "02-01-2006 15:04"
# TSUE 2.2 # TSUE 2.2

View File

@@ -1,4 +1,4 @@
--- ---
site: btschool site: btschool
name: BTSCHOOL name: BTSCHOOL
description: "BTSCHOOL is a CHINESE Private Torrent Tracker for MOVIES / TV / GENERAL" description: "BTSCHOOL is a CHINESE Private Torrent Tracker for MOVIES / TV / GENERAL"
@@ -23,28 +23,27 @@
- {id: 415, cat: Other, desc: "其他/Other"} - {id: 415, cat: Other, desc: "其他/Other"}
modes: modes:
search: [q] search: [q, imdbid]
tv-search: [q, season, ep, imdbid] tv-search: [q, season, ep, imdbid]
movie-search: [q, imdbid] movie-search: [q, imdbid]
settings:
- name: cookie
type: text
label: Cookie
- name: info
type: info
label: How to get the Cookie
default: "<ol><li>Login to this tracker in your browser<li>Open the <b>DevTools</b> panel by pressing <b>F12</b><li>Select the <b>Network</b> tab<li>Click on the <b>Doc</b> button<li>Refresh the page by pressing <b>F5</b><li>Select the <b>Headers</b> tab<li>Find 'cookie:' in the <b>Request Headers</b> section<li>Copy & paste the whole cookie string to here</ol>"
login: login:
path: login.php method: cookie
method: form
form: form[action="takelogin.php"]
captcha:
type: image
selector: img[alt="CAPTCHA"]
input: imagestring
inputs: inputs:
username: "{{ .Config.username }}" cookie: "{{ .Config.cookie }}"
password: "{{ .Config.password }}"
error:
- selector: td.embedded:has(h2:contains("登錄失敗"))
- selector: td.embedded:has(h2:contains("失败"))
test: test:
path: index.php path: index.php
selector: a[href="logout.php"] selector: a[href="logout.php"]
search: search:
paths: paths:
- path: torrents.php - path: torrents.php
@@ -79,7 +78,7 @@
attribute: title attribute: title
details: details:
selector: a[title][href^="details.php?id="] selector: a[title][href^="details.php?id="]
attribute: href attribute: href
download: download:
selector: a[href^="download.php?id="] selector: a[href^="download.php?id="]
attribute: href attribute: href

View File

@@ -6,9 +6,10 @@
type: public type: public
encoding: UTF-8 encoding: UTF-8
links: links:
- https://btio.pw/ - https://btsow.club/
legacylinks: legacylinks:
- https://btos.pw/ - https://btos.pw/
- https://btio.pw/
caps: caps:
categories: categories:

View File

@@ -1,4 +1,4 @@
--- ---
site: carpathians site: carpathians
name: Carpathians name: Carpathians
description: "Carpathians is a HUNGARIAN Private Torrent Tracker for 0DAY / GENERAL" description: "Carpathians is a HUNGARIAN Private Torrent Tracker for 0DAY / GENERAL"
@@ -38,9 +38,33 @@
- {id: 110, cat: XXX, desc: "XXX"} - {id: 110, cat: XXX, desc: "XXX"}
modes: modes:
search: [q] search: [q, imdbid]
tv-search: [q, season, ep] tv-search: [q, season, ep, imdbid]
movie-search: [q] movie-search: [q, imdbid]
settings:
- name: username
type: text
label: Username
- name: password
type: password
label: Password
- name: sort
type: select
label: Sort requested from site
default: "5"
options:
"5": "created"
"8": "seeders"
"6": "size"
"2": "title"
- name: type
type: select
label: Order requested from site
default: "desc"
options:
"desc": "desc"
"asc": "asc"
login: login:
path: takelogin.php path: takelogin.php
@@ -55,13 +79,18 @@
paths: paths:
- path: browse.php - path: browse.php
inputs: inputs:
$raw: "{{range .Categories}}c{{.}}=1&{{end}}" $raw: "{{ range .Categories }}c{{.}}=1&{{end}}"
search: "{{ .Keywords }}" search: "{{ if .Query.IMDBID }}https://www.imdb.com/title/{{ .Query.IMDBID }}{{else}}{{ .Keywords }}{{end}}"
# 0 both 1 only active 2 only dead
incldead: 0 incldead: 0
onlyname: 1 onlyname: 1
onlyname2: true onlyname2: true
sort: "{{ .Config.sort }}"
type: "{{ .Config.type }}"
rows: rows:
selector: table[id!="torrent_ajanlo"] > tbody > tr[id] selector: table[id!="torrent_ajanlo"] > tbody > tr[id]
fields: fields:
download: download:
selector: a[href^="download.php/"] selector: a[href^="download.php/"]
@@ -84,7 +113,7 @@
selector: a[id][href^="details.php?"] selector: a[id][href^="details.php?"]
attribute: href attribute: href
imdb: imdb:
selector: a[href*="https://www.imdb.com/title/"] selector: a[href*="www.imdb.com/title/tt"]
optional: true optional: true
attribute: href attribute: href
banner: banner:
@@ -99,7 +128,7 @@
selector: td:nth-child(7) selector: td:nth-child(7)
filters: filters:
- name: regexp - name: regexp
args: ([\d\.]+) args: (\d+)
seeders: seeders:
selector: td:nth-child(8) selector: td:nth-child(8)
leechers: leechers:
@@ -123,9 +152,10 @@
args: ["hete", "week"] args: ["hete", "week"]
- name: timeago - name: timeago
downloadvolumefactor: downloadvolumefactor:
case: text: 1
"*": "1"
uploadvolumefactor: uploadvolumefactor:
case: case:
img[src="pic/double.png"]: "2" img[src="pic/double.png"]: 2
"*": "1" img[src="pic/doubledouble2.png"]: 4
"*": 1
# TBDev & XBTT

View File

@@ -1,4 +1,4 @@
--- ---
site: cartoonchaos site: cartoonchaos
name: CartoonChaos name: CartoonChaos
description: "CartoonChaos (CC) is a Private Torrent Tracker for ANIMATED MOVIES / TV" description: "CartoonChaos (CC) is a Private Torrent Tracker for ANIMATED MOVIES / TV"
@@ -6,7 +6,7 @@
type: private type: private
encoding: UTF-8 encoding: UTF-8
links: links:
- http://www.cartoonchaos.org/ - http://www.cartoonchaos.org/ # site does not support https NET::ERR_CERT_AUTHORITY_INVALID
settings: settings:
- name: username - name: username
@@ -59,6 +59,7 @@
search: [q, imdbid] search: [q, imdbid]
tv-search: [q, season, ep, imdbid] tv-search: [q, season, ep, imdbid]
movie-search: [q, imdbid] movie-search: [q, imdbid]
music-search: [q]
login: login:
path: index.php?page=login path: index.php?page=login
@@ -81,8 +82,9 @@
page: torrents page: torrents
search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{else}}{{ .Keywords }}{{end}}" search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{else}}{{ .Keywords }}{{end}}"
category: "{{ if .Categories }}{{ range .Categories }}{{.}};{{end}}{{else}}0{{end}}" category: "{{ if .Categories }}{{ range .Categories }}{{.}};{{end}}{{else}}0{{end}}"
# options: 0=title, 1=title&descr, 2=descr # 0=title, 1=title&descr, 2=descr
options: "{{ if .Query.IMDBID }}1{{else}}0{{end}}" options: "{{ if .Query.IMDBID }}2{{else}}0{{end}}"
# 0 all 1 activeonly 2 deadonly
active: 0 active: 0
order: "{{ .Config.sort }}" order: "{{ .Config.sort }}"
by: "{{ .Config.type }}" by: "{{ .Config.type }}"
@@ -115,6 +117,14 @@
args: [" http://anonym.to?javascript:popdetails('", ""] args: [" http://anonym.to?javascript:popdetails('", ""]
- name: replace - name: replace
args: ["');", ""] args: ["');", ""]
banner:
selector: td a[href^="index.php?page=torrent-details"]
attribute: onmouseover
filters:
- name: regexp
args: "src=(.+?) width"
- name: replace
args: ["torrentimg/nocover.jpg", ""]
size: size:
selector: td:nth-child(10) selector: td:nth-child(10)
# two flavours of dates # two flavours of dates
@@ -146,4 +156,4 @@
"*": 1 "*": 1
uploadvolumefactor: uploadvolumefactor:
text: 1 text: 1
# xbtit 2.0.0 # xbtit 2.0.0

View File

@@ -1,4 +1,4 @@
--- ---
site: casatorrent site: casatorrent
name: Casa-Torrent name: Casa-Torrent
description: "Casa-Torrent is a FRENCH Private Torrent Tracker for MOVIES / TV / GENERAL" description: "Casa-Torrent is a FRENCH Private Torrent Tracker for MOVIES / TV / GENERAL"

View File

@@ -1,4 +1,4 @@
--- ---
site: casstudiotv site: casstudiotv
name: CasStudioTV name: CasStudioTV
description: "CasStudioTV is a RUSSIAN Semi-Private Torrent Tracker for TV" description: "CasStudioTV is a RUSSIAN Semi-Private Torrent Tracker for TV"

View File

@@ -42,9 +42,33 @@
- {id: 22, cat: Other, desc: "杂项"} - {id: 22, cat: Other, desc: "杂项"}
modes: modes:
search: [q] search: [q, imdbid]
tv-search: [q, season, ep] tv-search: [q, season, ep, imdbid]
movie-search: [q] movie-search: [q, imdbid]
settings:
- name: username
type: text
label: Username
- name: password
type: password
label: Password
- name: sort
type: select
label: Sort requested from site
default: "added"
options:
"added": "created"
"seeders": "seeders"
"size": "size"
"name": "title"
- name: type
type: select
label: Order requested from site
default: "DESC"
options:
"DESC": "desc"
"ASC": "asc"
login: login:
path: takelogin.php path: takelogin.php
@@ -60,13 +84,14 @@
search: search:
paths: paths:
- path: browse.php - path: browse.php
method: get
inputs: inputs:
$raw: "{{ range .Categories }}c{{.}}=1&{{end}}" $raw: "{{ range .Categories }}c{{.}}=1&{{end}}"
search: "{{ .Keywords }}" search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{else}}{{ .Keywords }}{{end}}"
# 0 active 1 incldead 2 deadonly
incldead: 1 incldead: 1
sort: added fullsearch: "{{ if .Query.IMDBID }}1{{else}}{{end}}"
d: DESC sort: "{{ .Config.sort }}"
d: "{{ .Config.sort }}"
rows: rows:
selector: table[border="1"][cellpadding="5"] > tbody > tr:has(a[href^="details.php?id="]) selector: table[border="1"][cellpadding="5"] > tbody > tr:has(a[href^="details.php?id="])
@@ -86,7 +111,7 @@
args: cat args: cat
details: details:
selector: a[href^="details.php?id="] selector: a[href^="details.php?id="]
attribute: href attribute: href
download: download:
selector: a[href^="download.php/"] selector: a[href^="download.php/"]
attribute: href attribute: href
@@ -122,7 +147,10 @@
"*": 1 "*": 1
uploadvolumefactor: uploadvolumefactor:
case: case:
"font:has([src=\"/pic/arrowup1.gif\"]):contains(\"1.5x\")": 1.5
"font:has([src=\"/pic/arrowup1.gif\"]):contains(\"2x\")": 2
"*": 1 "*": 1
description: description:
selector: td:nth-child(2) > table > tbody > tr:nth-child(2) selector: td:nth-child(2) > table > tbody > tr:nth-child(2)
remove: a, img remove: a, img
# Discuz! 7.2

View File

@@ -18,7 +18,7 @@
- {id: 4, cat: TV/Sport, desc: "Sports"} - {id: 4, cat: TV/Sport, desc: "Sports"}
modes: modes:
search: [q] search: [q, imdbid]
tv-search: [q, season, ep, imdbid] tv-search: [q, season, ep, imdbid]
movie-search: [q, imdbid] movie-search: [q, imdbid]
@@ -85,8 +85,10 @@
sort: "{{ .Config.sort }}" sort: "{{ .Config.sort }}"
direction: "{{ .Config.type }}" direction: "{{ .Config.type }}"
qty: 100 qty: 100
rows: rows:
selector: table > tbody > tr selector: table > tbody > tr
fields: fields:
category: category:
selector: a[href*="/categories/"] selector: a[href*="/categories/"]

View File

@@ -6,9 +6,10 @@
type: public type: public
encoding: UTF-8 encoding: UTF-8
links: links:
- http://www.cilijj.xyz/ - https://www.cilijj.xyz/
legacylinks: legacylinks:
- http://www.cili180.com/ - http://www.cili180.com/
- http://www.cilijj.xyz/
caps: caps:
categories: categories:

View File

@@ -6,6 +6,8 @@
type: private type: private
encoding: UTF-8 encoding: UTF-8
links: links:
- https://cinemageddon.net/
legacylinks:
- http://cinemageddon.net/ - http://cinemageddon.net/
caps: caps:
@@ -45,7 +47,7 @@
- selector: table:contains("Login failed!") - selector: table:contains("Login failed!")
test: test:
path: index.php path: index.php
search: search:
paths: paths:
- path: browse.php - path: browse.php
@@ -94,4 +96,4 @@
"*": "1" "*": "1"
uploadvolumefactor: uploadvolumefactor:
case: case:
"*": "1" "*": "1"

View File

@@ -31,9 +31,9 @@
- {id: 21, cat: Books, desc: "Book"} - {id: 21, cat: Books, desc: "Book"}
modes: modes:
search: [q] search: [q, imdbid]
tv-search: [q, season, ep] tv-search: [q, season, ep, imdbid]
movie-search: [q] movie-search: [q, imdbid]
settings: settings:
- name: cookie - name: cookie
@@ -67,17 +67,19 @@
test: test:
path: index.php path: index.php
selector: a[href^="/logout.php"] selector: a[href^="/logout.php"]
search: search:
paths: paths:
- path: browse.php - path: browse.php
inputs: inputs:
$raw: "{{ range .Categories }}c{{.}}=1&{{end}}" $raw: "{{ range .Categories }}c{{.}}=1&{{end}}"
search: "{{ .Keywords }}" search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{else}}{{ .Keywords }}{{end}}"
# 0 onlyactive 1 all 4 requests 5 onlydead 6 polish 8 free 10 doubleup 11 premier 13 VOD # 0 onlyactive 1 all 4 requests 5 onlydead 6 polish 8 free 10 doubleup 11 premier 13 VOD
incldead: 1 incldead: 1
# 0 title 1 descr # 0 title 1 descr
blah: 0 blah: "{{ if .Query.IMDBID }}1{{else}}0{{end}}"
gatunek: 0
quality: none
sort: "{{ .Config.sort }}" sort: "{{ .Config.sort }}"
type: "{{ .Config.type }}" type: "{{ .Config.type }}"
@@ -98,13 +100,17 @@
attribute: href attribute: href
download: download:
selector: a[href^="download.php/"] selector: a[href^="download.php/"]
attribute: href attribute: href
banner: banner:
selector: a[href^="details.php?id="] selector: a[href^="details.php?id="]
attribute: onmouseover attribute: onmouseover
filters: filters:
- name: regexp - name: regexp
args: "src=(.+?) " args: "src=(.+?) "
imdb:
optional: true
selector: a[href*="www.imdb.com/title/tt"]
attribute: href
description: description:
optional: true optional: true
selector: img[src="pic/Poland.png"] selector: img[src="pic/Poland.png"]

View File

@@ -117,4 +117,4 @@
uploadvolumefactor: uploadvolumefactor:
case: case:
"img[title=\"Platinum Torrent: No Download Stats are Recorded, Upload Stats are Doubled!\"]": 2 "img[title=\"Platinum Torrent: No Download Stats are Recorded, Upload Stats are Doubled!\"]": 2
"*": 1 "*": 1

View File

@@ -6,7 +6,7 @@
type: private type: private
encoding: UTF-8 encoding: UTF-8
links: links:
- http://classix-unlimited.co.uk/ - http://classix-unlimited.co.uk/ # site does not support https ERR_CONNECTION_CLOSED
caps: caps:
categorymappings: categorymappings:
@@ -63,4 +63,4 @@
"*": "1" "*": "1"
uploadvolumefactor: uploadvolumefactor:
case: case:
"*": "1" "*": "1"

View File

@@ -1,4 +1,4 @@
--- ---
site: cpasbien site: cpasbien
name: cpasbien name: cpasbien
description: "cpasbien is a FRENCH Public site for TV / MOVIES / GENERAL" description: "cpasbien is a FRENCH Public site for TV / MOVIES / GENERAL"
@@ -7,7 +7,7 @@
encoding: UTF-8 encoding: UTF-8
followredirect: true followredirect: true
links: links:
- https://vww.cpasbien-fr.fr/ - https://wvw.cpasbien-fr.fr/
legacylinks: legacylinks:
- http://www.cpasbiens.cc/ - http://www.cpasbiens.cc/
- http://www.cpabien.cm/ - http://www.cpabien.cm/
@@ -38,6 +38,7 @@
- https://www.cpasbien.vg/ - https://www.cpasbien.vg/
- https://www.cpasbien.lol/ - https://www.cpasbien.lol/
- https://www.gktorrent.biz/ - https://www.gktorrent.biz/
- https://vww.cpasbien-fr.fr/
caps: caps:
categorymappings: categorymappings:

View File

@@ -1,4 +1,4 @@
--- ---
site: crazyscorner site: crazyscorner
name: Crazy's Corner name: Crazy's Corner
description: "Crazy's Corner is a Private Torrent Tracker for MUSIC" description: "Crazy's Corner is a Private Torrent Tracker for MUSIC"
@@ -6,7 +6,7 @@
type: private type: private
encoding: UTF-8 encoding: UTF-8
links: links:
- http://crazys-corner.info/ - http://crazys-corner.info/ # site does not support https ERR_CONNECTION_REFUSED
caps: caps:
categorymappings: categorymappings:
@@ -132,9 +132,6 @@
download: download:
selector: a[href*="/details.php?id="] selector: a[href*="/details.php?id="]
attribute: href attribute: href
magnet:
selector: a[href^="magnet:?xt="]
attribute: href
banner: banner:
selector: img[src*="/torrents/images/"] selector: img[src*="/torrents/images/"]
attribute: src attribute: src

View File

@@ -1,4 +1,4 @@
--- ---
site: crazyspirits site: crazyspirits
name: CrazySpirits name: CrazySpirits
description: "Crazy Spirits is a FRENCH Private Torrent Tracker for MOVIES / TV / GENERAL" description: "Crazy Spirits is a FRENCH Private Torrent Tracker for MOVIES / TV / GENERAL"
@@ -12,20 +12,21 @@
categorymappings: categorymappings:
# Documentaire # Documentaire
- {id: 96, cat: TV/Documentary, desc: "Docus TV"} - {id: 96, cat: TV/Documentary, desc: "Docus TV"}
- {id: 124, cat: TV/Documentary, desc: "Docus Formation Video"}
# Films # Films
- {id: 49, cat: Movies/3D, desc: "Films 3D"} - {id: 49, cat: Movies/3D, desc: "Films 3D"}
- {id: 1, cat: XXX, desc: "3X"} - {id: 1, cat: XXX, desc: "3X"}
- {id: 48, cat: XXX, desc: "3X HD1080p"} - {id: 48, cat: XXX, desc: "3X HD1080p"}
- {id: 47, cat: XXX, desc: "3X HD720p"} - {id: 47, cat: XXX, desc: "3X HD720p"}
- {id: 50, cat: Movies/UHD, desc: "Films 4K"} - {id: 50, cat: Movies/UHD, desc: "Films 4K"}
- {id: 51, cat: Movies/UHD, desc: "Films 4K UHDTV"} - {id: 51, cat: TV/UHD, desc: "Films 4K UHDTV"}
- {id: 57, cat: Movies/BluRay, desc: "Films BDRip"} - {id: 57, cat: Movies/BluRay, desc: "Films BDRip"}
- {id: 56, cat: Movies/BluRay, desc: "Films Blu-Ray"} - {id: 56, cat: Movies/BluRay, desc: "Films Blu-Ray"}
- {id: 58, cat: Movies/BluRay, desc: "Films BRRip"} - {id: 58, cat: Movies/BluRay, desc: "Films BRRip"}
- {id: 66, cat: Movies, desc: "Films CamTS"} - {id: 66, cat: Movies, desc: "Films CamTS"}
- {id: 59, cat: Movies/DVD, desc: "Films DVDR"} - {id: 59, cat: Movies/DVD, desc: "Films DVDR"}
- {id: 60, cat: Movies/DVD, desc: "Films DVDRip"} - {id: 60, cat: Movies/DVD, desc: "Films DVDRip"}
- {id: 98, cat: Movies, desc: "Films Film Animées"} - {id: 98, cat: TV/Anime, desc: "Films Film Animées"}
- {id: 65, cat: Movies, desc: "Films FSCR"} - {id: 65, cat: Movies, desc: "Films FSCR"}
- {id: 52, cat: Movies/HD, desc: "Films HD 720p"} - {id: 52, cat: Movies/HD, desc: "Films HD 720p"}
- {id: 53, cat: Movies/HD, desc: "Films HD1080p"} - {id: 53, cat: Movies/HD, desc: "Films HD1080p"}
@@ -124,7 +125,7 @@
options: options:
"desc": "desc" "desc": "desc"
"asc": "asc" "asc": "asc"
login: login:
method: cookie method: cookie
inputs: inputs:
@@ -149,13 +150,17 @@
# http://crazyspirits.com/torrents-search.php?c101=1&c102=1&c103=1&c104=1&c105=1&c106=1&search=&cat=0&incldead=0&freeleech=0&lang=0 # http://crazyspirits.com/torrents-search.php?c101=1&c102=1&c103=1&c104=1&c105=1&c106=1&search=&cat=0&incldead=0&freeleech=0&lang=0
- path: torrents-search.php - path: torrents-search.php
inputs: inputs:
$raw: "{{range .Categories}}c{{.}}=1&{{end}}" $raw: "{{ range .Categories }}c{{.}}=1&{{end}}"
search: "{{ .Keywords }}" search: "{{ .Keywords }}"
# 0 active 1 incldead 2 onlydead
incldead: 1 incldead: 1
# 0 all 1 inclfree 2 onlyfree
freeleech: 0 freeleech: 0
# 0 all 1 french 2 english etc
lang: 0 lang: 0
sort: "{{ .Config.sort }}" sort: "{{ .Config.sort }}"
order: "{{ .Config.type }}" order: "{{ .Config.type }}"
# imdb search not supported and imdb links not in results.
rows: rows:
selector: table.border_table > tbody > tr.t-row selector: table.border_table > tbody > tr.t-row
@@ -192,13 +197,13 @@
attribute: onmouseover attribute: onmouseover
filters: filters:
- name: regexp - name: regexp
args: "Taille : </b>(.*?)<br" args: "Taille : </b>(.*?)<br"
date: date:
selector: a[onmouseover][href^="torrents-details.php?id="] selector: a[onmouseover][href^="torrents-details.php?id="]
attribute: onmouseover attribute: onmouseover
filters: filters:
- name: regexp - name: regexp
args: " Le : </b>(.*?)<br" args: " Le : </b>(.*?)<br"
- name: dateparse - name: dateparse
args: "02-01-2006" args: "02-01-2006"
downloadvolumefactor: downloadvolumefactor:
@@ -206,6 +211,5 @@
img[src="images/Torrents/free.png"]: 0 img[src="images/Torrents/free.png"]: 0
"*": 1 "*": 1
uploadvolumefactor: uploadvolumefactor:
case: text: 1
"*": 1 # TT3.0
# TT3.0

View File

@@ -1,4 +1,4 @@
--- ---
site: crnaberza site: crnaberza
name: CrnaBerza name: CrnaBerza
description: "Crna Berza is a BALKAN Private Torrent Tracker for MOVIES / TV / GENERAL" description: "Crna Berza is a BALKAN Private Torrent Tracker for MOVIES / TV / GENERAL"
@@ -100,15 +100,17 @@
search: search:
paths: paths:
# http://www.crnaberza.com/browse.php?c52=1&c20=1&c34=1&incldead=1&search=star+trek # http://www.crnaberza.com/browse.php?c52=1&c20=1&c34=1&incldead=1&search=star+trek
- path: browse.php - path: browse.php
inputs: inputs:
$raw: "{{ range .Categories }}c{{.}}=1&{{end}}" $raw: "{{ range .Categories }}c{{.}}=1&{{end}}"
search: "{{ .Keywords }}" search: "{{ .Keywords }}"
searchin: title # 0 title 1 descr 2 both
blah: 0
# 0 active 1 incldead 2 onlydead # 0 active 1 incldead 2 onlydead
incldead: 1 incldead: 1
sort: "{{ .Config.sort }}" sort: "{{ .Config.sort }}"
type: "{{ .Config.type }}" type: "{{ .Config.type }}"
# does not support searching imdbid and does not return imdb links
rows: rows:
selector: tr:has(td.trowtorrent) selector: tr:has(td.trowtorrent)

View File

@@ -1,4 +1,4 @@
 site: cztorrent site: cztorrent
name: CzTorrent name: CzTorrent
description: "CzTorrent is a Czech Semi-Private site for TV / MOVIES / GENERAL" description: "CzTorrent is a Czech Semi-Private site for TV / MOVIES / GENERAL"
language: cs-cz language: cs-cz
@@ -22,7 +22,7 @@
- {id: 38, cat: Movies/HD, desc: "HD-LQ"} - {id: 38, cat: Movies/HD, desc: "HD-LQ"}
- {id: 3, cat: PC/Games, desc: "Hry"} - {id: 3, cat: PC/Games, desc: "Hry"}
- {id: 2, cat: Audio, desc: "Hudba"} - {id: 2, cat: Audio, desc: "Hudba"}
- {id: 34, cat: Audio/Video, desc: "Hudba DVD/HD"} - {id: 34, cat: Audio/Video, desc: "Hudební video"}
- {id: 6, cat: Books, desc: "Knihy"} - {id: 6, cat: Books, desc: "Knihy"}
- {id: 13, cat: Console, desc: "Konzole"} - {id: 13, cat: Console, desc: "Konzole"}
- {id: 32, cat: Audio, desc: "Mluvené slovo"} - {id: 32, cat: Audio, desc: "Mluvené slovo"}
@@ -30,7 +30,6 @@
- {id: 4, cat: Other, desc: "Ostatní"} - {id: 4, cat: Other, desc: "Ostatní"}
- {id: 25, cat: TV, desc: "Seriály"} - {id: 25, cat: TV, desc: "Seriály"}
- {id: 29, cat: Audio, desc: "Soundtrack"} - {id: 29, cat: Audio, desc: "Soundtrack"}
- {id: 19, cat: Audio/Video, desc: "Videoklipy"}
- {id: 24, cat: XXX, desc: "xXx"} - {id: 24, cat: XXX, desc: "xXx"}
modes: modes:
@@ -74,12 +73,18 @@
inputs: inputs:
$raw: "{{ range .Categories }}c{{.}}=1&{{end}}" $raw: "{{ range .Categories }}c{{.}}=1&{{end}}"
s: "{{ .Keywords }}" s: "{{ .Keywords }}"
# 0 approved 1 all 2 not approved
t: 1 t: 1
o: "{{ .Config.sort }}" o: "{{ .Config.sort }}"
# does not support imdbid search and does not return imdb links
rows: rows:
selector: tr.torr_hover selector: tr.torr_hover
keywordsfilters:
- name: re_replace
args: ["S[0-9]{2}([^E]|$)", ""] # remove season tag without episode (search doesn't support it)
fields: fields:
title: title:
selector: td.detaily a selector: td.detaily a
@@ -89,17 +94,17 @@
- name: diacritics - name: diacritics
args: replace args: replace
- name: replace - name: replace
args: ["1080i", "1080p"] args: ["1080i", "1080p"]
- name: replace - name: replace
args: ["720i", "720p"] args: ["720i", "720p"]
- name: replace - name: replace
args: ["pLQ", "p"] args: ["pLQ", "p"]
- name: replace - name: replace
args: ["pHD", "p"] args: ["pHD", "p"]
- name: replace - name: replace
args: ["serie", ""] args: ["serie", ""]
- name: replace - name: replace
args: ["Serie", ""] args: ["Serie", ""]
- name: re_replace - name: re_replace
args: ["(\\d{2})\\.", "S$1"] args: ["(\\d{2})\\.", "S$1"]
- name: re_replace - name: re_replace
@@ -148,7 +153,7 @@
args: [ "|", 2 ] args: [ "|", 2 ]
- name: append - name: append
args: " +02:00" args: " +02:00"
- name: dateparse - name: dateparse
args: "2.1.2006 15:04 -07:00" args: "2.1.2006 15:04 -07:00"
seeders: seeders:
selector: td:nth-child(7) span selector: td:nth-child(7) span

View File

@@ -1,4 +1,4 @@
--- ---
site: datascene site: datascene
name: DataScene name: DataScene
description: "DataScene (DS) is a ROMANIAN Private Torrent Tracker for MOVIES / TV / GENERAL" description: "DataScene (DS) is a ROMANIAN Private Torrent Tracker for MOVIES / TV / GENERAL"
@@ -54,9 +54,33 @@
- {id: 12, cat: XXX, desc: "XxX"} - {id: 12, cat: XXX, desc: "XxX"}
modes: modes:
search: [q] search: [q, imdbid]
movie-search: [q] tv-search: [q, season, ep, imdbid]
tv-search: [q, season, ep] movie-search: [q, imdbid]
settings:
- name: username
type: text
label: Username
- name: password
type: password
label: Password
- name: sort
type: select
label: Sort requested from site
default: "4"
options:
"4": "created"
"7": "seeders"
"5": "size"
"1": "title"
- name: type
type: select
label: Order requested from site
default: "desc"
options:
"desc": "desc"
"asc": "asc"
login: login:
path: takelogin.php path: takelogin.php
@@ -68,7 +92,7 @@
- selector: td.embedded:has(h2:contains("failed")) - selector: td.embedded:has(h2:contains("failed"))
test: test:
path: browse.php path: browse.php
ratio: ratio:
path: browse.php path: browse.php
selector: font:contains("Ratio:") > span selector: font:contains("Ratio:") > span
@@ -77,9 +101,14 @@
paths: paths:
- path: browse.php - path: browse.php
inputs: inputs:
$raw: "{{ range .Categories }}c{{.}}=1&{{end}}" $raw: "{{ if .Categories}}{{ range .Categories }}c{{.}}=1&{{end}}{{else}}cat=0{{end}}"
search: "{{ .Keywords }}" search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{else}}{{ .Keywords }}{{end}}"
incldead: 1 # 1 active 2 incldead 3 onlydead 4 free
incldead: 2
# 0 name 1 genre 2 descr 3 imdb
blah: "{{ if .Query.IMDBID }}3{{else}}0{{end}}"
sort: "{{ .Config.sort }}"
type: "{{ .Config.type }}"
rows: rows:
selector: div.ncls > table > tbody > tr:has(a.tname) selector: div.ncls > table > tbody > tr:has(a.tname)

View File

@@ -26,9 +26,9 @@
- {id: 8, cat: TV, desc: "TV shows"} - {id: 8, cat: TV, desc: "TV shows"}
modes: modes:
search: [q] search: [q, imdbid]
tv-search: [q, season, ep] tv-search: [q, season, ep, imdbid]
movie-search: [q] movie-search: [q, imdbid]
settings: settings:
- name: username - name: username
@@ -69,10 +69,14 @@
- path: browse.php - path: browse.php
inputs: inputs:
$raw: "{{ range .Categories }}c{{.}}=1&{{end}}" $raw: "{{ range .Categories }}c{{.}}=1&{{end}}"
search: "{{ .Keywords }}" search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{else}}{{ .Keywords }}{{end}}"
# active 1 incldead 2 onlydead
incldead: 1 incldead: 1
# 1 = look in description
Lysing: "{{ if .Query.IMDBID }}1{{else}}{{end}}"
sort: "{{ .Config.sort }}" sort: "{{ .Config.sort }}"
type: "{{ .Config.type }}" type: "{{ .Config.type }}"
# does not return imdb links
rows: rows:
selector: table[class="torrentlist"] > tbody > tr:has(a[href*="details.php?id="]) selector: table[class="torrentlist"] > tbody > tr:has(a[href*="details.php?id="])

View File

@@ -5,8 +5,10 @@
language: en-us language: en-us
type: public type: public
encoding: UTF-8 encoding: UTF-8
followredirect: true
links: links:
- https://www.demonoid.is/ - https://www.demonoid.is/
- https://demonoid.unblockit.pro/
legacylinks: legacylinks:
- https://www.dnoid.to/ - https://www.dnoid.to/

View File

@@ -17,7 +17,7 @@
- {id: 5, cat: Console, desc: "Game"} - {id: 5, cat: Console, desc: "Game"}
modes: modes:
search: [q] search: [q, imdbid]
tv-search: [q, season, ep, imdbid] tv-search: [q, season, ep, imdbid]
movie-search: [q, imdbid] movie-search: [q, imdbid]

View File

@@ -1,4 +1,4 @@
--- ---
site: divteam site: divteam
name: DivTeam name: DivTeam
description: "DivTeam is a SPANISH Private Torrent Tracker for MOVIES / GENERAL" description: "DivTeam is a SPANISH Private Torrent Tracker for MOVIES / GENERAL"
@@ -12,7 +12,7 @@
categorymappings: categorymappings:
- {id: 60, cat: Movies/HD, desc: "MicroHD 720p"} - {id: 60, cat: Movies/HD, desc: "MicroHD 720p"}
- {id: 77, cat: Movies/HD, desc: "MicroHD 1080p"} - {id: 77, cat: Movies/HD, desc: "MicroHD 1080p"}
- {id: 78, cat: Movies/HD, desc: "MicroHD 4k"} - {id: 78, cat: Movies/HD, desc: "MicroHD 4K"}
- {id: 64, cat: TV/HD, desc: "Pack Series"} - {id: 64, cat: TV/HD, desc: "Pack Series"}
- {id: 65, cat: TV/HD, desc: "Pack Series VOSE"} - {id: 65, cat: TV/HD, desc: "Pack Series VOSE"}
- {id: 80, cat: Movies/BluRay, desc: "BDRip X265 1080p"} - {id: 80, cat: Movies/BluRay, desc: "BDRip X265 1080p"}
@@ -43,13 +43,13 @@
- {id: 48, cat: Movies/BluRay, desc: "BR-Rip/HD-Rip"} - {id: 48, cat: Movies/BluRay, desc: "BR-Rip/HD-Rip"}
- {id: 17, cat: Movies/BluRay, desc: "BD-Rip"} - {id: 17, cat: Movies/BluRay, desc: "BD-Rip"}
- {id: 5, cat: TV/Anime, desc: "Anime"} - {id: 5, cat: TV/Anime, desc: "Anime"}
- {id: 34, cat: PC/Games, desc: "Juegos Pc"} - {id: 34, cat: PC/Games, desc: "Juegos PC"}
- {id: 7, cat: PC/0day, desc: "Software Pc"} - {id: 7, cat: PC/0day, desc: "Software PC"}
- {id: 35, cat: Console, desc: "Juegos Sony"} - {id: 35, cat: Console, desc: "Juegos Sony"}
- {id: 36, cat: PC/Games, desc: "Juegos Microsoft"} - {id: 36, cat: PC/Games, desc: "Juegos Microsoft"}
- {id: 37, cat: Console/NDS, desc: "Juegos Nintendo"} - {id: 37, cat: Console/NDS, desc: "Juegos Nintendo"}
- {id: 45, cat: Audio/MP3, desc: "Music MP3"} - {id: 45, cat: Audio/MP3, desc: "Music MP3"}
- {id: 44, cat: Audio/Lossless, desc: "Music flac"} - {id: 44, cat: Audio/Lossless, desc: "Music FLAC"}
modes: modes:
search: [q] search: [q]
@@ -84,7 +84,7 @@
type: info type: info
label: Results Per Page label: Results Per Page
default: For best results, change the <b>Torrents per page:</b> setting to <b>100</b> on your account profile. default: For best results, change the <b>Torrents per page:</b> setting to <b>100</b> on your account profile.
login: login:
method: cookie method: cookie
inputs: inputs:
@@ -99,11 +99,14 @@
inputs: inputs:
page: "torrents" page: "torrents"
category: "{{ range .Categories }}{{.}};{{end}}" category: "{{ range .Categories }}{{.}};{{end}}"
search: "{{ if .Keywords }}{{ .Keywords }}{{else}}{{end}}" search: "{{ .Keywords }}"
# 0 all 1 activeonly 2 deadonly
active: 0 active: 0
# 0 title 1 title&desc 2 descr 3 uploaders 5 gold 6 silver 9 2x 10 3x 11 4x
options: 0 options: 0
order: "{{ .Config.sort }}" order: "{{ .Config.sort }}"
by: "{{ .Config.type }}" by: "{{ .Config.type }}"
# does not support imdbid search and does not supply imdb link in results.
rows: rows:
selector: table.table.table-bordered > tbody > tr:has(a[href^="download.php?id="]) selector: table.table.table-bordered > tbody > tr:has(a[href^="download.php?id="])

View File

@@ -1,4 +1,4 @@
--- ---
site: documentarytorrents site: documentarytorrents
name: DocumentaryTorrents name: DocumentaryTorrents
description: "Documentary Torrents (DT) is a Private Torrent Tracker for E-LEARNING MOVIES / TV" description: "Documentary Torrents (DT) is a Private Torrent Tracker for E-LEARNING MOVIES / TV"
@@ -74,7 +74,8 @@
modes: modes:
search: [q] search: [q]
tv-search: [q, season, ep] tv-search: [q]
movie-search: [q]
settings: settings:
- name: username - name: username
@@ -88,7 +89,7 @@
label: Sort requested from site label: Sort requested from site
default: "id" default: "id"
options: options:
"is": "created" "id": "created"
"seeders": "seeders" "seeders": "seeders"
"size": "size" "size": "size"
"name": "title" "name": "title"
@@ -125,11 +126,15 @@
$raw: "{{ range .Categories }}c{{.}}=1&{{end}}" $raw: "{{ range .Categories }}c{{.}}=1&{{end}}"
search: "{{ .Keywords }}" search: "{{ .Keywords }}"
cat: 0 cat: 0
# 0 active 1 incldead 2 onlydead
incldead: 1 incldead: 1
# 0 all 1 notfree 2 onlyfree
freeleech: 0 freeleech: 0
# 0 all 1 english 2 french etc
lang: 0 lang: 0
sort: "{{ .Config.sort }}" sort: "{{ .Config.sort }}"
order: "{{ .Config.type }}" order: "{{ .Config.type }}"
# does not support imdbid search and does not return imdb link in results
rows: rows:
selector: table.ttable_headinner tr.t-row selector: table.ttable_headinner tr.t-row

View File

@@ -1,4 +1,4 @@
--- ---
site: downloadville site: downloadville
name: Downloadville name: Downloadville
description: "Downloadville is a FRENCH Private Torrent Tracker for MOVIES / TV / GENERAL" description: "Downloadville is a FRENCH Private Torrent Tracker for MOVIES / TV / GENERAL"
@@ -14,68 +14,70 @@
categorymappings: categorymappings:
# Films # Films
- {id: 1, cat: Movies, desc: "Films"} - {id: 1, cat: Movies, desc: "Films"}
- {id: 13, cat: Movies, desc: "Films BD-Rip / BRRip"} - {id: 13, cat: Movies/BluRay, desc: "Films BD-Rip / BRRip"}
- {id: 15, cat: Movies, desc: "Films DVD-Rip"} - {id: 15, cat: Movies/DVD, desc: "Films DVD-Rip"}
- {id: 18, cat: Movies, desc: "Films HD 720p"} - {id: 18, cat: Movies/HD, desc: "Films HD 720p"}
- {id: 19, cat: Movies, desc: "Films WEB-DL / WEB-Rip"} - {id: 19, cat: Movies/WEBDL, desc: "Films WEB-DL / WEB-Rip"}
- {id: 20, cat: Movies, desc: "Films HD 1080p"} - {id: 20, cat: Movies/HD, desc: "Films HD 1080p"}
- {id: 26, cat: Movies, desc: "Films mHD 720p"} - {id: 26, cat: Movies/HD, desc: "Films mHD 720p"}
- {id: 27, cat: Movies, desc: "Films mHD 1080p"} - {id: 27, cat: Movies/HD, desc: "Films mHD 1080p"}
- {id: 28, cat: Movies, desc: "Films x265"} - {id: 28, cat: Movies/HD, desc: "Films x265"}
- {id: 30, cat: Movies, desc: "Films Blu-Ray (complet)"} - {id: 30, cat: Movies/BluRay, desc: "Films Blu-Ray (complet)"}
- {id: 31, cat: Movies, desc: "Films 3D"} - {id: 31, cat: Movies/3D, desc: "Films 3D"}
- {id: 32, cat: Movies, desc: "Films 4K UHD"} - {id: 32, cat: Movies/UHD, desc: "Films 4K UHD"}
- {id: 33, cat: Movies, desc: "Films Québécois SD"} - {id: 33, cat: Movies/SD, desc: "Films Québécois SD"}
- {id: 34, cat: Movies, desc: "Films Québécois HD"} - {id: 34, cat: Movies/HD, desc: "Films Québécois HD"}
- {id: 35, cat: Movies, desc: "Films Québécois DVD-R"} - {id: 35, cat: Movies/DVD, desc: "Films Québécois DVD-R"}
- {id: 37, cat: Movies, desc: "Films DVD-R"} - {id: 37, cat: Movies/DVD, desc: "Films DVD-R"}
- {id: 38, cat: Movies, desc: "Films V.O.S.T. SD"} - {id: 38, cat: Movies/SD, desc: "Films V.O.S.T. SD"}
- {id: 39, cat: Movies, desc: "Films V.O.S.T. HD"} - {id: 39, cat: MovieS/HD, desc: "Films V.O.S.T. HD"}
- {id: 40, cat: Movies, desc: "Films V.O. SD"} - {id: 40, cat: Movies/SD, desc: "Films V.O. SD"}
- {id: 41, cat: Movies, desc: "Films V.O. HD"} - {id: 41, cat: Movies/HD, desc: "Films V.O. HD"}
- {id: 42, cat: Movies, desc: "Films TV-Rip"} - {id: 42, cat: Movies, desc: "Films TV-Rip"}
# 4K LIGHT
- {id: 95, cat: Movies, desc: "4K LIGHT"}
# Séries-Télé # Séries-Télé
- {id: 16, cat: TV, desc: "Séries-Télé"} - {id: 16, cat: TV, desc: "Séries-Télé"}
- {id: 17, cat: TV, desc: "Séries-Télé TV Pack SD"} - {id: 17, cat: TV/SD, desc: "Séries-Télé TV Pack SD"}
- {id: 21, cat: TV, desc: "Séries-Télé SD"} - {id: 21, cat: TV/SD, desc: "Séries-Télé SD"}
- {id: 22, cat: TV, desc: "Séries-Télé HD"} - {id: 22, cat: TV/HD, desc: "Séries-Télé HD"}
- {id: 23, cat: TV, desc: "Séries-Télé TV Pack HD"} - {id: 23, cat: TV/HD, desc: "Séries-Télé TV Pack HD"}
- {id: 45, cat: TV, desc: "Séries-Télé Québécois SD"} - {id: 45, cat: TV/SD, desc: "Séries-Télé Québécois SD"}
- {id: 46, cat: TV, desc: "Séries-Télé Québécois HD"} - {id: 46, cat: TV/HD, desc: "Séries-Télé Québécois HD"}
- {id: 47, cat: TV, desc: "Séries-Télé V.O.S.T. SD"} - {id: 47, cat: TV/SD, desc: "Séries-Télé V.O.S.T. SD"}
- {id: 48, cat: TV, desc: "Séries-TéléV.O.S.T. HD"} - {id: 48, cat: TV/HD, desc: "Séries-TéléV.O.S.T. HD"}
- {id: 49, cat: TV, desc: "Séries-Télé Émissions TV SD"} - {id: 49, cat: TV/SD, desc: "Séries-Télé Émissions TV SD"}
- {id: 50, cat: TV, desc: "Séries-Télé Émissions TV HD"} - {id: 50, cat: TV/HD, desc: "Séries-Télé Émissions TV HD"}
- {id: 51, cat: TV, desc: "Séries-Télé Blu-Ray"} - {id: 51, cat: TV, desc: "Séries-Télé Blu-Ray"}
- {id: 52, cat: TV, desc: "Séries-Télé DVD-R"} - {id: 52, cat: TV, desc: "Séries-Télé DVD-R"}
- {id: 94, cat: TV, desc: "Séries-Télé x265 - TV"} - {id: 94, cat: TV/HD, desc: "Séries-Télé x265 - TV"}
# Musique # Musique
- {id: 2, cat: Audio, desc: "Musique"} - {id: 2, cat: Audio, desc: "Musique"}
- {id: 54, cat: Audio, desc: "Musique MP3"} - {id: 54, cat: Audio/MP3, desc: "Musique MP3"}
- {id: 55, cat: Audio, desc: "Musique FLAC"} - {id: 55, cat: Audio/Lossless, desc: "Musique FLAC"}
- {id: 56, cat: Audio, desc: "Musique DSD"} - {id: 56, cat: Audio, desc: "Musique DSD"}
- {id: 57, cat: Audio, desc: "Musique Karaoke"} - {id: 57, cat: Audio, desc: "Musique Karaoke"}
- {id: 58, cat: Audio, desc: "Musique Autres"} - {id: 58, cat: Audio, desc: "Musique Autres"}
# Jeux # Jeux
- {id: 3, cat: PC/Games, desc: "Jeux"} - {id: 3, cat: PC/Games, desc: "Jeux"}
- {id: 59, cat: PC/Games, desc: "Jeux PC"} - {id: 59, cat: PC/Games, desc: "Jeux PC"}
- {id: 60, cat: PC/Games, desc: "Jeux Consoles"} - {id: 60, cat: Console, desc: "Jeux Consoles"}
- {id: 84, cat: PC/Games, desc: "Jeux Android"} - {id: 84, cat: PC/Games, desc: "Jeux Android"}
# Livres # Livres
- {id: 6, cat: Books, desc: "Livres"} - {id: 6, cat: Books, desc: "Livres"}
- {id: 61, cat: Books, desc: "Livres epub"} - {id: 61, cat: Books/Ebook, desc: "Livres epub"}
- {id: 62, cat: Books, desc: "Livres pdf"} - {id: 62, cat: Books, desc: "Livres pdf"}
- {id: 63, cat: Books, desc: "Livres Journaux"} - {id: 63, cat: Books, desc: "Livres Journaux"}
- {id: 64, cat: Books, desc: "Livres Magazines"} - {id: 64, cat: Books/Magazines, desc: "Livres Magazines"}
- {id: 65, cat: Books, desc: "Livres Bandes Dessinées"} - {id: 65, cat: Books, desc: "Livres Bandes Dessinées"}
- {id: 66, cat: Books, desc: "Livres Multi-Format"} - {id: 66, cat: Books, desc: "Livres Multi-Format"}
- {id: 85, cat: Books, desc: "Livres Audio"} - {id: 85, cat: Audio/Audiobook, desc: "Livres Audio"}
# Logiciels # Logiciels
- {id: 67, cat: PC, desc: "Logiciels"} - {id: 67, cat: PC, desc: "Logiciels"}
- {id: 68, cat: PC, desc: "Logiciels Windows"} - {id: 68, cat: PC/0day, desc: "Logiciels Windows"}
- {id: 69, cat: PC, desc: "Logiciels Mac"} - {id: 69, cat: PC/Mac, desc: "Logiciels Mac"}
- {id: 86, cat: PC, desc: "Logiciels Linux"} - {id: 86, cat: PC, desc: "Logiciels Linux"}
- {id: 87, cat: PC, desc: "Logiciels Android"} - {id: 87, cat: PC/Phone-Android, desc: "Logiciels Android"}
# Spectacles # Spectacles
- {id: 70, cat: TV/Other, desc: "Spectacles"} - {id: 70, cat: TV/Other, desc: "Spectacles"}
- {id: 71, cat: TV/Other, desc: "Spectacles Humour"} - {id: 71, cat: TV/Other, desc: "Spectacles Humour"}
@@ -138,7 +140,7 @@
default: FRENCH default: FRENCH
options: options:
FRENCH : "FRENCH" FRENCH : "FRENCH"
MULTI.FRENCH : "MULTI.FRENCH" MULTI.FRENCH : "MULTI.FRENCH"
ENGLISH: "ENGLISH" ENGLISH: "ENGLISH"
- name: sort - name: sort
type: select type: select
@@ -169,7 +171,7 @@
uid: "{{ .Config.uid }}" uid: "{{ .Config.uid }}"
pwd: "{{ .Config.pwd }}" pwd: "{{ .Config.pwd }}"
error: error:
- selector: form[action="index.php?page=login&returnto=index.php"] table tr:nth-of-type(2) td - selector: form[action="index.php?page=login&returnto=index.php"] table tr:nth-of-type(2) td
message: message:
selector: form[action="index.php?page=login&returnto=index.php"] table tr:nth-of-type(2) td span selector: form[action="index.php?page=login&returnto=index.php"] table tr:nth-of-type(2) td span
test: test:
@@ -190,15 +192,19 @@
search: search:
paths: paths:
- path: tracker/index.php - path: tracker/index.php
headers:
Referer: ["https://downloadville.net/tracker/index.php?page=torrents&search=fake_referer&active=0"]
inputs: inputs:
page: torrents page: torrents
search: "{{ .Keywords }}" search: "{{ .Keywords }}"
category: "{{ range .Categories }}{{.}};{{end}}" category: "{{ range .Categories }}{{.}};{{end}}"
# 0 title 1 title&descr 2 descr
options: 0 options: 0
active: "{{ .Config.active }}" active: "{{ .Config.active }}"
gold: "{{ .Config.gold }}" gold: "{{ .Config.gold }}"
order: "{{ .Config.sort }}" order: "{{ .Config.sort }}"
by: "{{ .Config.type }}" by: "{{ .Config.type }}"
# does not support imdbid search and does not ruturn imdb link in results
rows: rows:
selector: table > tbody > tr > td > table.lista > tbody > tr:has(td[onmouseover="this.className='post'"]) selector: table > tbody > tr > td > table.lista > tbody > tr:has(td[onmouseover="this.className='post'"])
@@ -210,7 +216,7 @@
text: "{{ .Result.title_phase1 }}" text: "{{ .Result.title_phase1 }}"
filters: filters:
- name: re_replace - name: re_replace
args: ["[\\.\\s\\[\\-][Mm][Uu][Ll][Tt][Ii][\\.\\s\\]\\-]", ".{{ .Config.multilanguage }}."] args: ["[\\.\\s\\[\\-][Mm][Uu][Ll][Tt][Ii][\\.\\s\\]\\-]", ".{{ .Config.multilanguage }}."]
title: title:
text: "{{if .Config.multilang }}{{ .Result.title_multilang }}{{else}}{{ .Result.title_phase1 }}{{end}}" text: "{{if .Config.multilang }}{{ .Result.title_multilang }}{{else}}{{ .Result.title_phase1 }}{{end}}"
details: details:

View File

@@ -1,4 +1,4 @@
--- ---
site: dragonworldreloaded site: dragonworldreloaded
name: Dragonworld Reloaded name: Dragonworld Reloaded
description: "Dragonworld Reloaded is a GERMAN Private Torrent Tracker for MOVIES / TV / GENERAL" description: "Dragonworld Reloaded is a GERMAN Private Torrent Tracker for MOVIES / TV / GENERAL"

View File

@@ -24,7 +24,7 @@
- {id: 12, cat: TV/Anime, desc: "Anime-Movie"} - {id: 12, cat: TV/Anime, desc: "Anime-Movie"}
modes: modes:
search: [q] search: [q, imdbid]
tv-search: [q, season, ep, imdbid] tv-search: [q, season, ep, imdbid]
movie-search: [q, imdbid] movie-search: [q, imdbid]

View File

@@ -1,4 +1,4 @@
--- ---
site: ebookparadijs site: ebookparadijs
name: EbookParadijs name: EbookParadijs
description: "EbookParadijs is a DUTCH Private Tracker for EBOOKS" description: "EbookParadijs is a DUTCH Private Tracker for EBOOKS"

View File

@@ -352,4 +352,4 @@
"*": 1 "*": 1
uploadvolumefactor: uploadvolumefactor:
case: case:
"*": 1 "*": 1

View File

@@ -1,4 +1,4 @@
--- ---
site: efectodoppler site: efectodoppler
name: Efecto Doppler name: Efecto Doppler
description: "Efecto Doppler is a SPANISH Private Torrent Tracker for MUSIC" description: "Efecto Doppler is a SPANISH Private Torrent Tracker for MUSIC"

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