Compare commits

...

546 Commits

Author SHA1 Message Date
Kilay
60fb7bc3d5 GkTorrent: fix parser (#2551) 2018-02-06 17:00:48 +00:00
kaso17
ba59cbd1b3 add gazellegames 2018-02-06 17:40:39 +01:00
kaso17
a433eb564b Femdomcult: add indexer 2018-02-06 17:40:05 +01:00
kaso17
9215ae44ba update Sonarr or Radarr instructions 2018-02-06 14:38:39 +01:00
kaso17
ad4aa891cf improve erroe message 2018-02-06 14:29:32 +01:00
kaso17
1c03172211 Cardigann: fix relative download link handling 2018-02-06 14:02:11 +01:00
kaso17
92263c6e04 GazelleGames: cleanup 2018-02-05 19:17:52 +01:00
kaso17
0b208008cf Add GazelleGames indexer 2018-02-05 19:12:41 +01:00
kaso17
7db24cc4a0 OmdbResolver: fix encoding warning 2018-02-02 16:56:30 +01:00
kaso17
5558136b51 Il Corsaro Nero: update certificate 2018-02-02 16:09:21 +01:00
kaso17
d49666835f SceneFZ: parsing fixes 2018-02-02 16:00:53 +01:00
Albvadi
7f5612d0dc Adding spanish tracker Torrentland (#2531)
* Adding spanish tracker Torrentland

Create the definition for spanish tracker Torrentland

* Adding torrentland to the private trackers
2018-02-02 14:50:36 +00:00
Albvadi
7253a09531 Update puntotorrent.yml (#2530)
Remove optional grabs
2018-02-02 14:48:04 +00:00
kaso17
f56e53255e Merge branch 'master' of https://github.com/Jackett/Jackett 2018-02-01 18:13:52 +01:00
kaso17
27286a1b71 cpabien: update links
fixes #2529
2018-02-01 18:13:45 +01:00
Albvadi
a5d4fadca5 Corrections in Puntotorrent and HDCity (#2528)
* Update hdcity.yml

Corrected login path

* Update puntotorrent.yml

Make grabs optional for new torrents
2018-02-01 17:06:54 +00:00
kaso17
1165d5ff9c u-Torrent: remove (same as SzeneFZ now) 2018-02-01 15:47:37 +01:00
kaso17
c65a4dbe12 Merge branch 'master' of https://github.com/Jackett/Jackett 2018-02-01 14:02:08 +01:00
garfield69
c335ae6eb4 highlight versions 2018-02-01 17:57:58 +13:00
Garfield69
6ffb9dc9ef delete hachede-c #2521 2018-02-01 07:43:53 +13:00
Albvadi
08ce9b903b Update hachede.me (#2521)
* Update hachede.me

Union of both views (classic and modern) in a same definition.

* Delete hachede-c.yml

Remove definition for exclusive classic view
2018-02-01 07:40:24 +13:00
kaso17
156f6f6cce SceneFZ: fix login 2018-01-31 14:18:20 +01:00
kaso17
3f681060b2 Merge branch 'master' of https://github.com/Jackett/Jackett 2018-01-30 20:04:33 +01:00
kaso17
6a4a9a09f5 Kapaki: fix definition 2018-01-30 20:04:19 +01:00
Garfield69
6dae7cd11d YIFI: handle movies without torrents 2018-01-31 07:12:01 +13:00
Garfield69
85f522b055 nnm-club: domain change. for #2513 2018-01-31 07:05:39 +13:00
kaso17
5eb63005ad TorrentDay: cleanup 2018-01-30 14:41:09 +01:00
kaso17
2fb3d52b44 YTS: handle movies without torrents 2018-01-30 14:37:39 +01:00
kaso17
7c1fbdd44b TorrentDay: use new JSON API 2018-01-30 14:11:10 +01:00
Kilay
fdeacaa554 GkTorrent: fix class change in html (#2510) 2018-01-30 10:14:38 +00:00
Garfield69
d81b00616a ETTV: oops forgot to make change for UHD. #2509 2018-01-30 19:26:01 +13:00
Garfield69
2af5e0c37b ETTV: add all the missing categories. resolves #2509 2018-01-30 19:23:09 +13:00
Garfield69
7c657796aa ExtraTorrent-ag: add public tracker. resolves #2478 2018-01-30 16:05:13 +13:00
LuisMi
c8c62354f4 TBPlus: Add indexer (#2502) 2018-01-29 18:38:57 +00:00
rog0rr
62e9f712a0 TorrentDay: fix parser (#2501)
A few class renames and some element rearranging on the browse table has broken Jackett in the last few days - this fixes them
2018-01-29 18:38:19 +00:00
kaso17
c60ae71bd9 Revert "TorrentDay: update parser"
This reverts commit 52ff0a6a1d.
2018-01-29 19:37:20 +01:00
kaso17
99b27fa084 Merge branch 'master' of https://github.com/Jackett/Jackett 2018-01-29 19:35:25 +01:00
kaso17
52ff0a6a1d TorrentDay: update parser 2018-01-29 19:35:11 +01:00
Garfield69
2a224785c3 YIFY: add public yifymovie.co with UHD support. Resolves #2479 2018-01-26 14:34:00 +13:00
kaso17
54ee2a1e97 KickAssTorrent: add support for cookie configuration 2018-01-25 11:49:55 +01:00
kaso17
8eace1b1e9 GkTorrent: fix legacy links 2018-01-25 11:49:24 +01:00
Garfield69
eb658ab421 torrent9: fix download link. resolves #2470 2018-01-25 15:04:33 +13:00
Garfield69
53f33b0fc1 superbits: add cat24 film 4k. resolves #2476 2018-01-25 11:38:00 +13:00
kaso17
871966166b MyAnonamouse: add auto re-login 2018-01-24 13:09:35 +01:00
kaso17
69e71bbe87 fix serverURL 2018-01-24 13:03:39 +01:00
kaso17
ac9274c540 Fuzer: add support for IMDB search 2018-01-23 20:51:10 +01:00
kaso17
bcd9836088 Demonoid: handle new ad type 2018-01-23 20:44:44 +01:00
kaso17
4fef4f872e basepath: add support for /jackett base path redirection 2018-01-23 20:40:37 +01:00
kaso17
d578f585b3 Psytorrents: add supportsFreeleechTokens 2018-01-23 20:39:15 +01:00
kaso17
42b9e2a406 update apache example reverse proxy config 2018-01-23 20:22:38 +01:00
kaso17
de2f6eeabf Merge branch 'master' of https://github.com/Jackett/Jackett 2018-01-23 18:23:40 +01:00
kaso17
3fcaf3926a Revert "Psytorrents: removed (dead)"
This reverts commit f6e37d0b83.
2018-01-23 17:55:32 +01:00
Garfield69
b396818c52 bittorrentfiles: add description 2018-01-23 20:11:00 +13:00
kaso17
f89c9769be Cardigann: improve domain change error handling 2018-01-22 17:35:56 +01:00
kaso17
dd9a6c1c7b KickAssTorrent (thekat.nz): update legacylinks 2018-01-22 17:04:06 +01:00
kaso17
98b92ddc76 KickAssTorrent: fix definition 2018-01-22 16:56:11 +01:00
kaso17
8e9b144cff BrowserUtil: update ChromeUserAgent 2018-01-22 16:55:54 +01:00
kaso17
9cc4021cb3 Cinematik: fix download 2018-01-21 11:45:08 +01:00
Fippsy
c63c615dc3 BitTorrentFiles: Add indexer (#2444) 2018-01-21 10:01:19 +00:00
Garfield69
4055c205da hachede: modern and classic versions of the indexers for #2428 2018-01-21 08:45:42 +13:00
garfield69
dc892cd95b Rename hdcity to hdcity.yml 2018-01-19 07:29:15 +13:00
Albvadi
f609f1cc9c Add spanish tracker HDCity (#2434)
* Update README.md

Adding Puntotorrent forgotten from [this PR](https://github.com/Jackett/Jackett/pull/2433)

* Add definition for  HDCity

Add definition for spanish tracker HDCity

* Adding HDCity to the index
2018-01-19 07:17:35 +13:00
Garfield69
ebad07fde5 gktorrent: domain change. resolves #2440 2018-01-19 06:38:54 +13:00
kaso17
d44dc77511 PuntoTorrent: cleanup 2018-01-17 11:18:04 +01:00
Albvadi
2a9e0d4c73 Adding puntotorrent and details for HacheDe (#2433)
* Update hachede.yml

Adding details link

* Adding spanish tracker Puntotorrent

Adding spanish tracker Puntotorrent requested [here](https://github.com/Jackett/Jackett/issues/1468)
2018-01-17 10:13:04 +00:00
kaso17
6ecc500dde libcurl: add support for new cloudflare server type 2018-01-15 20:20:23 +01:00
kaso17
f452f20189 Shareisland: fix download link again 2018-01-15 20:11:58 +01:00
kaso17
f25719fd9e Fuzer: add support for invalid BannerUrls 2018-01-15 19:08:48 +01:00
Indrek Ardel
8f0c5e478e Update TorrentBytes category mappings (#2424)
* Update TorrentBytes category mappings

* Fix a typo
2018-01-15 08:47:21 +13:00
kaso17
bbcff986f9 enable useUnsafeHeaderParsing 2018-01-13 18:15:54 +01:00
kaso17
1bc3413660 TorrentHR: fix non empty search 2018-01-13 16:33:39 +01:00
demptheman
bd6f1ec538 Superbits: Fix bug if no torrents match search (#2403) 2018-01-13 15:21:02 +00:00
Garfield69
6c487e159b hachede: add description
and align code to standard layout
2018-01-12 08:52:55 +13:00
Albvadi
57f9be98b8 Adding spanish tracker HacheDe (#2402)
* New definition for HacheDe

Add definition for new spanish tracker: HacheDe

* Update README.md

Adding HacheDe

* Update hachede.yml

Remove strdump for debug purposes
2018-01-12 08:42:10 +13:00
kaso17
6a0bebad3b Merge branch 'master' of https://github.com/Jackett/Jackett 2018-01-10 19:07:27 +01:00
kaso17
4d7e170dcc SceneReactor: fix files selector 2018-01-10 19:07:19 +01:00
Garfield69
7dad79d5a5 infinityt: removed, its closed.
see https://opentrackers.org/infinity-t-has-shut-down/ for details.
2018-01-11 07:05:04 +13:00
kaso17
2a2298dcec Add SceneReactor indexer 2018-01-10 18:55:20 +01:00
kaso17
31118e222b ULTRAHDCLUB: removed (dead) 2018-01-10 18:20:52 +01:00
kaso17
8a02403f83 Cardigann: add support for text captcha 2018-01-10 18:20:11 +01:00
kaso17
26933d9286 Shareisland: try to fix title parsing 2018-01-10 16:38:19 +01:00
kaso17
a33c9eea0a PolishTracker: remove unused cats 2018-01-10 14:39:11 +01:00
plebann
93eae3fdbf PolishTracker: CategoryMapping update, Fix to allow search over multiple categories (#2395) 2018-01-10 13:37:01 +00:00
kaso17
becfabfc79 u-torrents: removed (same as Szene FZ now) 2018-01-10 14:19:35 +01:00
kaso17
946c8bd5bf SceneFZ: fix login and add u-torrents references 2018-01-10 14:16:28 +01:00
kaso17
5f01a62292 update dependencies 2018-01-10 14:15:53 +01:00
kaso17
739708edb4 DateTimeRoutines: use netstandardt2.0 2018-01-10 14:15:26 +01:00
kaso17
f21cb39d38 AutoMapper: update to 6.2.2 2018-01-10 11:59:57 +01:00
kaso17
05a9e96bbb CloudFlareUtilities: update to 1.0.0 2018-01-10 11:56:09 +01:00
kaso17
b639c27883 Merge branch 'master' of https://github.com/Jackett/Jackett 2018-01-09 16:39:42 +01:00
DarkSupremo
9e1bec1ea4 Speed-Share: Added resolution; removed year from title, since it was not reliable, and added few workarounds to improve the search on some shows; BJ-Share and Manicomio-Share, added few workarounds to improve search on few shows; PS: Still need find an reliable pattern to remove translated series name from Manicomio-Share, i just added an workaround to few shows for now (#2391) 2018-01-09 15:39:23 +00:00
kaso17
3c4ae55407 DanishBits: add blandet category 2018-01-09 16:13:15 +01:00
Garfield69
70ca19c6d9 mvgroup*: improvements to optional bbc title stripping
1. do not filter 'BBC ' from anywhere but the start of the title string
2. condense the two optional title blocks into a single title block
2018-01-09 07:40:13 +13:00
kaso17
92c11b8320 Shareisland: fix link 2018-01-08 12:04:23 +01:00
kaso17
7f59ae0b6f Merge branch 'master' of https://github.com/Jackett/Jackett 2018-01-08 11:52:34 +01:00
kaso17
232819b6bd Revert "Shareisland: update definition"
This reverts commit 78daa5012d.
2018-01-08 11:51:25 +01:00
Garfield69
29b83757e3 mvgroup*: option to strip BBC from front of titles. Resolves #2367 2018-01-06 19:11:30 +13:00
furryllama
efc4600918 Gimmepeers: Add missing categories (#2370) 2018-01-05 18:07:24 +00:00
kaso17
e92b87e4dd PiXELHD: fix error detection 2018-01-05 18:56:54 +01:00
kaso17
5ef4e2f0dd Frozen Layer: add exired certificate 2018-01-05 18:25:55 +01:00
kaso17
ae2264f344 Superbits: set GUID 2018-01-05 18:08:05 +01:00
kaso17
8c32b8ccb1 Empornium: fix login 2018-01-05 18:02:23 +01:00
kaso17
80fb235b06 UI: Don't send referrer 2018-01-05 17:55:51 +01:00
kaso17
f07e603826 Add Empornium 2018-01-05 17:55:39 +01:00
kaso17
bcdf1cc781 Add Empornium indexer 2018-01-05 17:55:32 +01:00
kaso17
e9bbaf7075 Updater: remove secretcinema.yml 2018-01-03 19:51:00 +01:00
BenJamin Morin
d71a8798dc GimmePeers: fix support for Top 20 list (#2360)
modified the ProcessPage Method to select the last table with the browsetable class attribute so that if the Top 20 table is visible it will be ignored and the master list is the only one that will display.  Works with Top 20 on and off.
2018-01-03 18:49:07 +00:00
kaso17
15a9eee66e Merge branch 'master' of https://github.com/Jackett/Jackett 2018-01-03 19:48:13 +01:00
kaso17
cacafcff58 Secret Cinema: migrate to gazelle base 2018-01-03 19:46:12 +01:00
kaso17
7193d6d28f GazelleTracker: add support for IMDB search 2018-01-03 19:33:30 +01:00
Andrew
ceaeb02105 Karagarga: Fix date (#2358) 2018-01-03 15:52:16 +13:00
kaso17
4942d429f0 RevolutionTT: use normal details link 2018-01-02 21:05:26 +01:00
kaso17
67093c96bc ETTV: update definition 2018-01-02 20:59:03 +01:00
kaso17
78daa5012d Shareisland: update definition 2018-01-02 20:47:12 +01:00
kaso17
748565b6dc SceneFZ: support new tracker software 2018-01-02 20:40:38 +01:00
kaso17
33581ce5b0 TorznabCats: fix all list 2018-01-02 20:39:44 +01:00
kaso17
7309e6a694 HDChina: update links 2018-01-02 20:22:16 +01:00
kaso17
61d1c02961 fix password resetting 2018-01-02 20:08:37 +01:00
kaso17
87584668dd HD-Torrents: use new UHD cats 2018-01-02 19:12:08 +01:00
kaso17
8773022f10 TorznabCats: add support for UHD cats 2018-01-02 19:11:53 +01:00
kaso17
1a803fb182 HD-Torrents: add UHD catgories 2018-01-02 19:00:32 +01:00
Ryan Lewon
e2b23b6ebc Updated iptorrents indexer column to add proper support for 4K(2160p) (#2344)
* Updated to add new 4K indexer column to add proper support for 4K(2160p)
from tracker.

* Changed MoviesSD to MoviesHD.
2018-01-01 06:39:56 +13:00
garfield69
a5f845625f Delete Hounddawgs.cs 2018-01-01 06:37:58 +13:00
Tobias Nordahl Kristensen
f949291cdc Hounddawgs removed (#2343)
http://infinity-t.org/ is the official "recommendation" as an replacement.
2018-01-01 06:33:44 +13:00
Garfield69
2ab1c3a63e waffles: fix dateparse 2017-12-29 14:52:06 +13:00
Garfield69
55805e251c ilcorsaronero: add missing categories 2017-12-29 08:49:09 +13:00
kaso17
844d2ba1ad HD4Free: add support for new software 2017-12-27 19:42:04 +01:00
kaso17
4059815811 ignore cloudflare ob cookies 2017-12-27 19:05:19 +01:00
kaso17
caac781651 Shareisland: update to new software/layout 2017-12-27 18:46:31 +01:00
kaso17
ff1e19dbc7 Merge branch 'master' of https://github.com/Jackett/Jackett 2017-12-27 17:46:13 +01:00
Andrey Dorokhov
95adced183 Fix a link to appveyor build status (#2330) 2017-12-27 16:45:01 +00:00
Garfield69
44dbdf2f10 limetorrents: make downloadlink optionally itorrent or magnet 2017-12-27 20:43:23 +13:00
DarkSupremo
68cbd6e6be Fix to BJ-Share and Speed-Share (#2321)
* Fixed anime search on BJShare, removing the season from search and changing the output from "Anime SXXEXX" to "Anime EXX".
Season had to be removed because the season numbering on anime is all wrong in this tracker.

* - Changed to change title based on search for category of every row in bj-share, instead of category of search
- Fixed title parse on B2S-Share and Speed-Share to animes (series not changed) from "Anime SXXEXX" to "Anime EXX"

* - Added anime title change on empty search as well - BJ-Share

* B2S-Share: Removed episode from search and added andmatch (episode search do not work with translated series name), changed title to return 'original name SXXEXX' instead of 'translated name SXXEXX (original name)', because Sonarr was not recognizing the serie (it will only apply to series and movies, animes does not have translated name)

* added few comments to the code

* Fixed year being added after season/episode, it will be added now between series name and season/episode (animes not included), eg: Serie 2017 S05E06

* Small bugfixes in regex
2017-12-26 17:02:43 +13:00
Garfield69
2e8196b753 kickasstorrent: oops #2280 2017-12-23 18:08:47 +13:00
Garfield69
cf9677ec38 kickasstorrent: katcr have updated their search engine #2280
however, their ddos protection still breaks jackett for now
2017-12-23 18:02:37 +13:00
kaso17
d7c25cb94b Dragonworld Reloaded: fix categories 2017-12-22 15:27:40 +01:00
kaso17
c08b4f4fcd Dragonworld Reloaded: add support for pin 2017-12-22 15:21:39 +01:00
Garfield69
dd8ecd1380 torrentbd: sitelink should be base only 2017-12-22 06:26:24 +13:00
Garfield69
e923be03cc sktorrent: sitelink should be base only 2017-12-22 06:25:15 +13:00
Garfield69
c040cf3a3a downloadville: sitelink should be base only 2017-12-22 06:23:11 +13:00
kaso17
5c0dadcb3a Torrent.LT: fix description 2017-12-20 18:54:37 +01:00
kaso17
6f7f50c82f add Torrent.LT indexer
Thank you @karkaaa
Fixes #2279
2017-12-20 18:51:55 +01:00
kaso17
8c90b8ed02 MagnetDL: fix default category on empty category search 2017-12-20 18:21:03 +01:00
kaso17
121c7bc686 Merge branch 'master' of https://github.com/Jackett/Jackett 2017-12-20 17:18:59 +01:00
kaso17
743de0fae7 TorrentNetwork: fix login 2017-12-20 17:18:36 +01:00
Garfield69
9b3b140fad worldwidetorrents: test using categories fix #2311 2017-12-20 07:32:10 +13:00
kaso17
ed41d383a3 HDSky: fix search 2017-12-18 19:02:58 +01:00
kaso17
4692cd60ee TorznabQuery: allow / character 2017-12-18 18:38:33 +01:00
kaso17
14d3a9eb0a Zooqle: fix search 2017-12-18 18:34:48 +01:00
kaso17
20b4d93686 Zooqle: improve search behaviour 2017-12-18 18:32:04 +01:00
kaso17
80960665ec 1337x: make download link configurable 2017-12-18 18:11:37 +01:00
kaso17
97a5d58f13 Cardigann: apply template engine to download/selector 2017-12-18 18:11:11 +01:00
Tadeo Kondrak
26258f2768 TorrentBytes is now a private tracker (#2301) 2017-12-18 08:26:35 +13:00
Garfield69
be2514f3c0 limetorrents: switch downloads from itorrents to magnet #2299 2017-12-18 06:46:15 +13:00
Garfield69
74535a54ee yggtorrent: back to original domain resolves #2283 2017-12-16 07:40:54 +13:00
hed0nist
fea5e454fc Update README.md (#2282) 2017-12-15 17:57:39 +00:00
hed0nist
a54c089e6d Create oxtorrent.yml (#2281) 2017-12-15 17:57:31 +00:00
Michael Mawhinney
dafe618494 thepiratebay: remove stale links. resolves #2277 (#2278)
* thepiratebay: remove stale links. resolves #2277

* thepiratebay: move stale links to legacylinks section. resolves #2277
2017-12-14 17:13:15 +13:00
Garfield69
cab46874f7 torrent9: domain change. fix #2273 2017-12-14 06:15:04 +13:00
kaso17
cce2cb01f9 Merge branch 'master' of https://github.com/Jackett/Jackett 2017-12-13 09:37:19 +01:00
kaso17
f31e0d1c13 WebClient delay: store time after the request
fix #2256
2017-12-13 09:37:09 +01:00
Garfield69
2c029f7532 isohunt2: add public search engine. resolves #2023 2017-12-13 16:19:41 +13:00
kaso17
e6f8109749 Cardigann: add support for download/filters 2017-12-12 16:01:26 +01:00
kaso17
b4f4ed5fe0 KickAssTorrent (thekat.nz): improve download filters 2017-12-12 16:00:08 +01:00
Garfield69
7fb6fd4fd9 kickasstorrent-kathow: fix #2269 bypass mylink.st on downloads 2017-12-12 20:13:22 +13:00
Garfield69
38384bd1df readme: enhance the enhanced logging instructions ;-) 2017-12-12 17:57:16 +13:00
Garfield69
3a5db7e813 kickasstorrent-kathow: fix #2255 new search path 2017-12-09 15:27:36 +13:00
kaso17
df068d6e4d ICE Torrent: add support for extra column
fixes #2243
2017-12-08 13:52:15 +01:00
kaso17
318cc86c6b YGGtorrent: fix login error detection 2017-12-07 23:34:27 +01:00
kaso17
2c83038ea8 Mono: check if the certificate store was initialized 2017-12-07 14:35:50 +01:00
kaso17
29f111aec4 GazelleTracker: add support for freeleech token usage 2017-12-05 16:44:47 +01:00
kaso17
6a24c55f06 Apollo: migrate to Gazelle base 2017-12-05 16:15:19 +01:00
kaso17
11ff114a61 Merge branch 'master' of https://github.com/Jackett/Jackett 2017-12-05 16:04:36 +01:00
kaso17
f7fb87f62b UI: fix category order 2017-12-05 15:40:13 +01:00
kaso17
3ba8dda800 UI: fix typo 2017-12-05 15:25:08 +01:00
kaso17
54c1acb669 UI: Add Copy RSS Feed button 2017-12-05 15:24:50 +01:00
Garfield69
ad5a949d60 cpabien: domain change fix #2231
switch to www.cpabien.cx
amend a couple css selectors
drop redundant size processing
tested with Jackett Dashboard and Sonarr
2017-12-05 10:56:34 +13:00
kaso17
6901b128d0 Xthor: use categories again 2017-12-04 21:38:21 +01:00
kaso17
aa002d1ee4 YGGtorrent: email login no longer supported 2017-12-04 19:29:14 +01:00
kaso17
a4edb62743 Xthor: disable categories 2017-12-04 18:00:37 +01:00
kaso17
eee8d1d8ff fix whitespaces 2017-12-04 13:37:00 +01:00
kaso17
2934bfb3e7 Add PIDFile CLI option 2017-12-04 12:20:22 +01:00
kaso17
105bd85441 PTFiles: fix support for users with wait time 2017-12-03 06:54:18 +01:00
kaso17
d49cb02d2f TorrentNetwork: improve passkey handling 2017-12-03 06:47:50 +01:00
kaso17
bc4bbbb7fb YGGtorrent: really fix download 2017-12-03 06:34:45 +01:00
kaso17
70a47c80b5 TorrentVault: removed (dead) 2017-12-02 05:09:55 +01:00
kaso17
ed8deaa1ba YGGtorrent: fix download link 2017-12-02 04:50:09 +01:00
kaso17
9b7dfdc01d add Bithorlo tracker 2017-12-01 15:27:07 +01:00
kaso17
f6e37d0b83 Psytorrents: removed (dead) 2017-12-01 14:15:54 +01:00
kaso17
4dc07fbc26 Add CCFBits trcker 2017-12-01 14:13:09 +01:00
kaso17
4d2adf4325 HttpWebClient2: implement AddTrustedCertificate() 2017-12-01 13:01:34 +01:00
kaso17
bed9b9d54b Speed.cd: fix login 2017-12-01 12:29:30 +01:00
kaso17
35191c913d update icon
Thank you @Giligilitelj
fix #1598
2017-12-01 10:46:01 +01:00
kaso17
4f93f1efc6 JackettTray: fix running detection 2017-12-01 10:39:50 +01:00
kaso17
0f5937b387 JackettTray: check if it's already running
fixes #2181
2017-12-01 10:28:19 +01:00
kaso17
4eda11f79e Xthor: detect API limit errors 2017-12-01 08:02:52 +01:00
kaso17
7f7496d64e YTS: cleanup 2017-12-01 07:53:16 +01:00
Garfield69
57aa438e64 yggtorrent: domain change. fix #2211 2017-12-01 16:20:14 +13:00
Garfield69
bffe1e3796 nyaasi: add additional categories 2017-12-01 10:58:25 +13:00
kaso17
acc8a24c21 Nyaa.si: add movies categories 2017-11-30 16:31:59 +01:00
kaso17
74cdd16bc6 Merge branch 'master' of https://github.com/Jackett/Jackett 2017-11-30 16:12:20 +01:00
kaso17
eed9745c67 DanishBits: add legacy site links 2017-11-30 16:12:10 +01:00
DarkSupremo
5fbe1ce66e B2S-Share: fix search and title output (#2206)
Removed episode from search and added andmatch (episode search do not work with translated series name), changed title to return 'original name SXXEXX' instead of 'translated name SXXEXX (original name)', because Sonarr was not recognizing the serie (it will only apply to series and movies, animes does not have translated name)

The only drawback is that it will not search for very older episodes (not on first page), but that can be softened increasing the results per page in user profile, but i consider it way better than before, many series was not returning anything, since they had an translated name on the tracker, and an search with episode would work only searching for translated name and episode.
2017-11-30 15:26:43 +01:00
Andy Simons
492816ab35 Fix: Downloading of torrent file don't follow redirect (#2196) 2017-11-30 12:11:42 +01:00
kaso17
16f255745f fix DataFolder command line option 2017-11-30 11:17:09 +01:00
kaso17
570553f7d6 YTS: various improvements 2017-11-29 19:32:21 +01:00
kaso17
254b918a08 Xthor: add LegacySiteLinks 2017-11-29 19:18:08 +01:00
kaso17
f49a960f5e YTS: add LegacySiteLinks 2017-11-29 19:13:52 +01:00
kaso17
b8507c71b6 ETTV: revert to old keywordsfilters
they fixed their search engine
2017-11-29 19:10:42 +01:00
Benjamin Staneck
e4698309a4 add a link to the Jackett project (#2204)
to the footer for easy access
2017-11-29 19:02:48 +01:00
Flip
20c57bcac6 update xthor tld (#2202) 2017-11-29 07:53:59 +13:00
Garfield69
36c5ec25ab thepiratebay: fix date parsing #2197
commit e5142d9b3f causing String was not
recognized as a valid DateTime.
2017-11-28 09:15:23 +13:00
halali
3d5c22b640 Trezzor: use full title (#2193) 2017-11-26 09:43:52 +01:00
Garfield69
4697e53d7c YTS: domain change. fix #2190 2017-11-26 06:23:38 +13:00
Garfield69
f7d5bc0ab5 ettv: fix #2187
drop sort by added and pre-search keyword filters to prevent
intereference with andmatch
Tested on Jackett Dashboard and Sonarr
2017-11-26 06:11:26 +13:00
kaso17
d7945eed8c ETTV: fix search 2017-11-25 12:50:43 +01:00
Garfield69
1d060af852 ETTV: force andmatch post-search to fix #2187 2017-11-25 06:44:10 +13:00
Garfield69
670141aef7 nnm-club: various improvements
add additional active categories
support multi-category search
downloads can be missing, prevent error
remove hardcoded full path to gifs, ensures domain independency
2017-11-24 10:50:11 +13:00
Andy Simons
93330fc56e NoName Club tracker (#2186)
* newstudio - new ru semi-private tracker
rutracker - add series parser
rutor - global search without category + series parser

* newstudio rus semi-private tracker

* 999 -> 99

* remove old definition

* - add newstudio tracker to the README
- newstudio def: remove reduntal inputs
- rutor def: revert setting usage into query

* nnm-club: new russian semi-private tracker
newstudo: fix quality naming

* readme

* fix quality naming

* seasons parsing fix

* fix
2017-11-24 07:20:12 +13:00
kaso17
72df2c1545 Fix HTTPS custom port handling 2017-11-22 11:20:00 +01:00
kaso17
fc3a1e21d3 macos install: make sure dir exists 2017-11-21 22:10:32 +01:00
kaso17
c20688837f PotatoFeed: default to -1 for leechers/seeders 2017-11-21 14:48:59 +01:00
Guizzoni
1db57a746b Update speed-share.yml (#2172)
Small fix, Jackett was trying to relogin every search.
2017-11-21 06:05:16 +13:00
DarkSupremo
d9178dd053 BJ-Share, B2S-Share and Speed-Share: fix Anime search (#2171)
* Fixed anime search on BJShare, removing the season from search and changing the output from "Anime SXXEXX" to "Anime EXX".
Season had to be removed because the season numbering on anime is all wrong in this tracker.

* - Changed to change title based on search for category of every row in bj-share, instead of category of search
- Fixed title parse on B2S-Share and Speed-Share to animes (series not changed) from "Anime SXXEXX" to "Anime EXX"

* - Added anime title change on empty search as well - BJ-Share
2017-11-20 15:27:25 +01:00
Garfield69
e163e6f8cf 1337x:: update categories 2017-11-20 20:54:49 +13:00
flightlevel
4b11007393 Assist Release Note Creation Attempt 2 (#2165)
Logic wasn't quite right for which commits to include
2017-11-19 18:37:47 +11:00
flightlevel
3929ff2662 Assist Release Note Creation (#2164)
Finds hash of the last tag and then uses the commit summary to assist in
release note creation
2017-11-19 17:19:49 +11:00
sbalke
76b088b5ec Changed torrentvault.yml action from advanced to basic. This fixed the search returning everything. (#2160) 2017-11-18 17:58:16 +13:00
kaso17
59388a8f80 allow proxy changes without restart 2017-11-17 16:46:58 +01:00
kaso17
01dec12909 TorrentSyndikat: fix (re)login issue 2017-11-17 15:01:25 +01:00
kaso17
dda27ef45f YGGtorrent: fix movies category 2017-11-17 14:14:40 +01:00
kaso17
968a7729c3 Fix SocksWebProxy race condition 2017-11-16 18:00:49 +01:00
kaso17
afe64a1b8f fix SocksWebProxy race condition 2017-11-16 16:51:34 +01:00
kaso17
83ab3c8b07 Shareisland: add error detection 2017-11-16 15:46:01 +01:00
kaso17
baf20927e4 ICE Torrent: update to new layout 2017-11-16 15:42:36 +01:00
Guizzoni
3a126f07c4 Login selector on b2s-share & speed-share (#2153)
* Update speed-share.yml

Added login selector to make sure we're logged in.

* Update b2s-share.yml

Added login selector to make sure we're logged in.
2017-11-16 14:26:27 +01:00
kaso17
c1e495b212 Hounddawgs: make grabs optional 2017-11-16 14:02:02 +01:00
kaso17
9a50a378cb Merge branch 'master' of https://github.com/Jackett/Jackett 2017-11-16 13:30:43 +01:00
Garfield69
4cf9dc6eb9 newstudio: various improvements
correct date parse
and add english date handling (for users that set english in profile)
add freeleech gold
add category in results for Sonarr
add banner
amend descritpion tag
2017-11-16 20:16:35 +13:00
Garfield69
86c5c61e84 rutor: correct date field 2017-11-16 19:53:05 +13:00
Garfield69
d12888f611 rutor: cosmetic clean up of yaml comments 2017-11-16 19:17:40 +13:00
Andy Simons
1c8bce2935 Trackers (#2151)
* newstudio - new ru semi-private tracker
rutracker - add series parser
rutor - global search without category + series parser

* newstudio rus semi-private tracker

* 999 -> 99

* remove old definition

* - add newstudio tracker to the README
- newstudio def: remove reduntal inputs
- rutor def: revert setting usage into query
2017-11-16 19:08:49 +13:00
Ellmout
075092857b ArcheTorrent - Better search v3 (#2150)
* ArcheTorrent - Better search

* ArcheTorrent - Better search v2

ArcheTorrent - Better search v2

* ArcheTorrent - Better search v3

ArcheTorrent - Better search v3
2017-11-16 07:01:32 +13:00
kaso17
dd09daf28f WebClient: improve logging 2017-11-15 19:00:27 +01:00
kaso17
798dc9bf4b UpdateService: add logging 2017-11-15 19:00:10 +01:00
kaso17
0a82f950c3 fix update process 2017-11-15 15:23:44 +01:00
kaso17
dc46dd48b1 cleanup 2017-11-14 20:43:42 +01:00
kaso17
280be17c3a use original exe filename 2017-11-14 20:31:27 +01:00
kaso17
fb6c7d2b64 Merge branch 'master' of https://github.com/Jackett/Jackett 2017-11-14 20:22:00 +01:00
kaso17
7b80d3c07e fix updater options 2017-11-14 20:21:40 +01:00
kaso17
b2a27591e6 fix NoRestart option 2017-11-14 20:21:31 +01:00
Guizzoni
fb63d22666 Update speed-share.yml (#2138)
Added proper tracker configuration instructions in an info box
2017-11-13 19:05:41 +01:00
kaso17
dcb171a655 The Place: enable andmatch filter 2017-11-13 18:11:19 +01:00
kaso17
b2bc982c1c The Empire: enable andmatch filter 2017-11-13 18:11:06 +01:00
kaso17
255a0f0ffa NetHD: enable andmatch filter 2017-11-13 18:10:55 +01:00
kaso17
80ea816bc7 hyperRay: enable andmatch filter 2017-11-13 18:10:46 +01:00
kaso17
b1371aae2b HDSky: enable andmatch filter 2017-11-13 18:10:35 +01:00
kaso17
c66984cd3b update readme 2017-11-13 17:35:01 +01:00
kaso17
27a455ad00 Merge branch 'master' of https://github.com/Jackett/Jackett 2017-11-13 16:55:12 +01:00
kaso17
69e7c7def3 clear cookies on unconfigure 2017-11-13 16:55:02 +01:00
kaso17
21882c81d8 PirateTheNet: improve login 2017-11-13 16:54:44 +01:00
Ellmout
47f53ab47f ArcheTorrent: improve search (#2119)
* ArcheTorrent - Better search

* ArcheTorrent - Better search v2

ArcheTorrent - Better search v2
2017-11-13 13:04:24 +01:00
kaso17
30ac099653 Reset SiteLink on unconfigure 2017-11-13 12:55:54 +01:00
kaso17
1a85927e44 PirateTheNet: add auo relogin support 2017-11-13 11:18:41 +01:00
ZackEndboss
b1d55fdf00 Update TorrentSyndikat.cs (#2128)
Add imdb support
2017-11-13 19:42:25 +11:00
Nathan Holland
1c62504b22 Remove Static Configuration Class and .NET Core Prep (#2122)
* Remove static configuration class that required prior knowledge of when it was initialised to dependency injected method that ensures all configuration has already occured.

* Specify a different log name for the updater, require a path when running the Jackett updater

* Update to all .NET Standard packages

* Explicitly specify the restore project style

* Move automapper out of the  DI framework and put crude detection to prevent it from initializing more than once.
2017-11-13 19:38:38 +11:00
Garfield69
fe504ed660 TPB: lowercase the search to allow proxies to work. fix #2120 2017-11-12 19:12:00 +13:00
flightlevel
9507369293 Cake build: Code tidy (#2121) 2017-11-12 11:01:05 +11:00
kaso17
84571f05fc The Place: update site links 2017-11-11 13:56:18 +01:00
flightlevel
a6ba9040d9 Use Cake to Build (#2113) 2017-11-11 17:14:14 +11:00
Nathan Holland
29e61feede Bugfixes (#2112)
* The module will need to be registered first thing in order to support commands such as --Help.

* Ignore mac directory attribute files

* Fix command line parameters not being correctly passed to the console
2017-11-11 16:21:26 +11:00
Garfield69
d055cf789f downloadville: add French Private site for Movies/TV/General. resolves #1565 2017-11-11 16:35:04 +13:00
Garfield69
15412c2508 elittracker: add Hungarian Private site 0day/general #1445 2017-11-11 07:32:09 +13:00
kaso17
c216727735 PassThePopcorn: make GUID uniq 2017-11-10 16:56:08 +01:00
kaso17
a38b13608e automapper: default to UTF8 encoding 2017-11-10 12:48:24 +01:00
kaso17
0b302915d6 Fix automapper encoding handling 2017-11-10 12:46:04 +01:00
kaso17
009cc28415 Torrent Downloads: use magnet links 2017-11-10 12:06:59 +01:00
kaso17
7007f2e650 ETTV: improve keywordsfilters 2017-11-10 11:30:11 +01:00
Garfield69
05b1895205 ettv: fix #2052 so that 'sortby added' returns proper results
the default search for ettv is to return 'any words' matched, which when
paired with 'sortby added' meant the top resutls were not useful.
now we prefix the keyworks with '+' and urlencodes them, ensuring that
'all words' matched is returned.
2017-11-10 09:50:30 +13:00
Garfield69
955aa2c9ec ettv: add description 2017-11-10 08:02:09 +13:00
kaso17
7b8f6ccd7f add ETTV 2017-11-09 13:28:44 +01:00
kaso17
a6b5401c0b add support for magnet file download links 2017-11-09 13:28:15 +01:00
kaso17
6d53e486c5 fix Content/Definition folder usage in Debug mode 2017-11-09 12:32:36 +01:00
kaso17
aa35280ca9 Shareisland: force HTTPS 2017-11-09 11:38:42 +01:00
kaso17
b5d846442d Fix tracing/logging options 2017-11-09 11:22:48 +01:00
kaso17
b040187c3f fix null pointer exception 2017-11-08 17:48:27 +01:00
kaso17
804dc12a47 BJShare: fix seeders/leechers 2017-11-08 17:33:40 +01:00
kaso17
5095c543d0 The Horror Charnel: improve rows selector 2017-11-08 16:41:50 +01:00
kaso17
3ae850e69b Cardigann: fix null pointer exception in if template 2017-11-08 16:18:28 +01:00
kaso17
4cd01433b7 fix null pointer 2017-11-08 16:06:13 +01:00
kaso17
06c47ec10a fix null pointer exception during startup 2017-11-08 16:03:38 +01:00
Nathan Holland
e90bf47d8a Move service config service back into shared .NET Framework Library (#2095) 2017-11-08 15:48:47 +01:00
Nathan Holland
52c0179e8e Feature/autofac tidyup (#2096)
* Move service config service back into shared .NET Framework Library

* Move Content files into shared folder. Make autoface load different assembilies depending on what framework is using it.

* Change my mind on what the shared module should be called. Common Module is too bland.

* DotNet4.SocksProxy is not yet publically .NET Standard. Revert to previous SocksWebProxy package.

* Check in unstaged change to test dependency injection setup.
2017-11-08 15:45:21 +01:00
flightlevel
2209ab226c Updater: Use Product Version (#2094) 2017-11-08 19:53:00 +11:00
Garfield69
ed0dbf4f18 docs: drop torrentproject 2017-11-08 08:11:11 +13:00
Garfield69
81b2eed342 torrentproject: removed to stop user confusion re: 403 forbidden
in the event it revives we can always add it back ;-)
2017-11-08 07:44:44 +13:00
kaso17
5a555427ee torznab: fix time format for pubDate default 2017-11-07 17:14:10 +01:00
kaso17
9c98465b21 EliteTracker: clear cookies on login 2017-11-07 16:17:07 +01:00
kaso17
8c053797ce WebClient: set Accept-Language if missing 2017-11-07 16:10:12 +01:00
kaso17
210085b854 Add Running Jackett behind a reverse proxy 2017-11-07 12:10:28 +01:00
Garfield69
e72298ad42 gfxnews: update categories, support milti-cat search #2036 2017-11-07 19:13:28 +13:00
Garfield69
3b447b697c yggtorrent: add all cats, fix rss, plus more. fix #2066 2017-11-07 17:21:13 +13:00
flightlevel
a3c685388e Move Definitions to Jackett.Common (#2085) 2017-11-07 11:42:18 +11:00
flightlevel
2363793d29 Remove unused ProxyType (#2084) 2017-11-07 11:34:33 +11:00
Alexander Chapliuk
969c365a64 LostFilm.tv: Perform logout before logging in to invalidate session and fix "error":1 response (#2083) 2017-11-07 11:16:05 +11:00
kaso17
1d1259e8eb MySpleen: fix search 2017-11-06 17:54:00 +01:00
kaso17
55ce1394c6 Cardigann template: add if support for collections 2017-11-06 17:16:29 +01:00
kaso17
8499d06a14 KickAssTorrent (thekat.nz): fix legacy link 2017-11-06 16:00:01 +01:00
kaso17
1739ac3935 TehConnection: removed (dead) 2017-11-06 15:26:51 +01:00
kaso17
1a802f3e32 Blu-bits: removed (dead) 2017-11-06 15:15:02 +01:00
kaso17
51d2c2148a DigitalHive: improve login error handling 2017-11-06 15:13:02 +01:00
kaso17
25d0ec6ddb BitHQ: removed (dead) 2017-11-06 15:12:42 +01:00
kaso17
b9d12aec9b Hyperay: add error detection 2017-11-06 15:04:19 +01:00
kaso17
44f241a4eb IndexerException: use GetBaseException for better error messages 2017-11-06 15:03:12 +01:00
kaso17
27e314088e AnimeBytes: add captcha support 2017-11-06 14:30:03 +01:00
kaso17
be2a041a71 AnimeBytes: add captcha support 2017-11-06 14:29:46 +01:00
flightlevel
38d5394a48 Bump Custom.js version (#2080)
Prevent browser using cached old version
2017-11-06 22:14:00 +11:00
Andy Simons
2b32fb358c Socks proxy support (#2058)
* socks proxy implementaion through SocksWebProxy package

* after merge fixes
2017-11-06 21:51:26 +11:00
flightlevel
7ce1c4acfb Appveyor: Patch Version (#2073)
-Patch csproj version in Appveyor build
-Rename Jacket.Common to Jackett.Common
-Remove build.bat (no longer used or maintained)
2017-11-05 21:53:43 +11:00
Nathan Holland
571c52a0f2 Feature/netcore preparation (#2072)
* Use platform detection that works on mono 4.6+

* Move to use package reference for restoring nuget packages.

* DateTimeRoutines does not have Nuget packages that support .NET Standard (and therefore .NET Core). We will have to include them for now until we can get rid of this dependency.

* Start spliting some interfaces into their own files - this will help by allowing us to split them out in the future into a seperate project so the actual implementations can stay within their respective architectures when required

* Move out common libraries

* Few more tidy up tasks to get things working with .NET Standard

* Restructure the solution layout

* Encoding work to reduce rework later on platforms without Windows codepages (or require compliance with RFC1345)

* Move folder structure around to have more natural layout of the solutions

* DI server configuration to get rid of "temporary" hack and dependency circle for serverservice

* Make all encoding consistent to match the expected encoding casing for earlier versions of mono.
2017-11-05 20:42:03 +11:00
Garfield69
47a2ffa313 kickasstorrent-kathow: domain change .se -> .nz fix #2065 2017-11-04 12:37:46 +13:00
Garfield69
1026d0a290 frozenlayer: add SPANISH Public ANIME site for #1556 2017-11-04 12:23:08 +13:00
Garfield69
f02dad054b torrent9: fix #2057
drop sort by seeds as site's page is broken
add category to results
add category filter in settings because site does not support multi-cats
add date now to prevent ugly' 2017y ago'
2017-11-02 14:47:56 +13:00
Nathan Holland
36bd2c032f Use platform detection that works on mono 4.6+ (#2055) 2017-11-01 21:37:51 +11:00
flightlevel
5c35ada012 Use BencondNET instead of MonoTorrent (#2048) 2017-11-01 12:42:26 +11:00
Garfield69
e0833ba719 bt-scene: add Public site for MOVIES/TV/GENERAL resolves #2038 2017-11-01 12:42:20 +13:00
Garfield69
7039bbdb51 t411v2: gone. redirects to yggtorrent.com fix #2040 2017-11-01 10:05:54 +13:00
Garfield69
bc4d69ffd8 yfftorrent: fix TEST for #2051 2017-11-01 08:38:13 +13:00
flightlevel
a319838029 Bump Custom.js version (#2046)
Prevents cache using old version
2017-10-31 20:54:00 +11:00
Andy Simons
570ea5bb51 UI proxy settings (#2043) 2017-10-31 20:45:30 +11:00
Guizzoni
7638d9bc39 Update manicomioshare.yml (#2045)
This update (hopefully) fixes relogin detection.
2017-10-31 06:56:47 +13:00
Alexander Chapliuk
46c993d608 Update LostFilm.tv indexer (#2030)
* LostFilm.tv: Fix language and quality in release titles

* LostFilm.tv: Snatch Season Packs if they are available

* LostFilm.tv: Fix searching for series with special characters in title

* LostFilm.tv: Parse episode details on episode page, not on Discovery page

* LostFilm.tv: Don't snatch separate episodes if season pack was requested but not found

* LostFilm.tv: Repace logger.Info with logger.Debug to keep logs free of spam
2017-10-30 21:56:01 +11:00
Nathan Holland
0838174622 Update requirements for Jackett (#2037) 2017-10-30 21:41:10 +11:00
Garfield69
75849ecceb docs: add gfxnews 2017-10-30 16:30:25 +13:00
Garfield69
9139e64762 gfxnews: add Private tracker GRAPHICS SOFTWARE/TUTORIALS #1445 2017-10-30 16:28:23 +13:00
Garfield69
4d9ca394f4 kinozal: multi cat is not supported. 2017-10-30 16:26:14 +13:00
Garfield69
1c88cf96df skytorrents: handle the two different date schemes 2017-10-30 09:57:56 +13:00
Nathan Holland
8a6b9d4de7 Feature/netcore preparation (#2035)
* Move to use package reference for restoring nuget packages.

* Return a task result for this async method.

* Update to a supported version of the .NET Framework. This also has the side effect of allowing us to automatically generate our binding redirects on build.

* Set the solution to target VS2017

* Update test solution csproj file to support being built through MSBuild 15

* Move to use package reference for restoring nuget packages.

* Return a task result for this async method.

* Update to a supported version of the .NET Framework. This also has the side effect of allowing us to automatically generate our binding redirects on build.

* Set the solution to target VS2017

* Update test solution csproj file to support being built through MSBuild 15

* DateTimeRoutines does not have Nuget packages that support .NET Standard (and therefore .NET Core). We will have to include them for now until we can get rid of this dependency.

* Move the interfaces into their own files. This will be useful when we share them between the .NET Core and .NET Framework WebAPI

* Stage services that need to point to the new interface namespace.

* Update CurlSharp to fix memory leak issue and support better runtime compatibility with OSX and Linux

* Start spliting some interfaces into their own files - this will help by allowing us to split them out in the future into a seperate project so the actual implementations can stay within their respective architectures when required
2017-10-29 21:19:09 +11:00
Nathan Holland
7829643104 Feature/package reference restore (#2025)
* Move to use package reference for restoring nuget packages.

* Return a task result for this async method.

* Update to a supported version of the .NET Framework. This also has the side effect of allowing us to automatically generate our binding redirects on build.

* Set the solution to target VS2017

* Update test solution csproj file to support being built through MSBuild 15

* Move to use package reference for restoring nuget packages.

* Return a task result for this async method.

* Update to a supported version of the .NET Framework. This also has the side effect of allowing us to automatically generate our binding redirects on build.

* Set the solution to target VS2017

* Update test solution csproj file to support being built through MSBuild 15
2017-10-29 19:42:25 +11:00
flightlevel
84ccd323e0 Code Tidy: Indexers P to Z (#2033) 2017-10-29 17:50:47 +11:00
flightlevel
e93d8f0f7c Code Tidy: Indexers A to N (#2032)
* Code Tidy: Indexers A-B

* Code Tidy: Indexers C to H

* Code Tidy: Indexers I-N
2017-10-29 17:21:18 +11:00
flightlevel
132a04d9b9 Use MSBuild and appveyor.yml (#2031) 2017-10-29 12:13:04 +11:00
Garfield69
332a434499 t411v2: fix search row header. Fix #2028 2017-10-29 12:58:44 +13:00
Garfield69
4dc8055830 cpabien: domain change yet again. fix #2029 2017-10-29 11:45:28 +13:00
Garfield69
ea7421ea93 rutor: add this Russian Public site for TV/MOVIES/GENERAL #1445 2017-10-29 10:49:49 +13:00
Garfield69
959f66ad78 megabliz: add Semi-Private site for MOVIES/TV/GENERAL. #1445 2017-10-28 18:08:18 +13:00
Garfield69
f9d128994d kinozal: add Russian semi-private MOVIE/TV/MUSIC tracker. resolves #351 2017-10-27 09:14:50 +13:00
Andrew
9bf7d5b92a Added BitMe tracker (#2014)
fix #1977
2017-10-26 10:17:42 +02:00
Garfield69
445f19dcd2 mvgroup: site does not provide size, but Sonarr requires it.
so we default to 500 MB to satisfy it.
2017-10-26 17:21:25 +13:00
kaso17
ccffdaa5ee PirateTheNet: fix category handling 2017-10-25 18:19:13 +02:00
kaso17
804c771cbe AlphaRatio: use gazelle base and update categories 2017-10-25 17:46:23 +02:00
kaso17
0ab6734dec BaseIndexer: Update cookies in RequestBytesWithCookies() 2017-10-25 17:20:39 +02:00
kaso17
23ae126026 Rarbg: retry on invalid token 2017-10-25 16:14:06 +02:00
kaso17
963b7aa78f Merge branch 'master' of https://github.com/Jackett/Jackett.git 2017-10-25 16:03:16 +02:00
kaso17
3eb7534ddd disable recaptcha support 2017-10-25 16:03:09 +02:00
Guizzoni
8dad840f3f Update speed-share.yml (#2013)
Added missing categories, release date, release type. 
Fixed some errors, and removed some useless strings.

Unfortunately the indexer shows non scene resolutions like "848x480; 1920 x 960" and i wan't able to translate that to "480p; 720p" because there are so many different resolutions. If someone could help me with that, i'd be glad.
2017-10-25 15:40:56 +02:00
Garfield69
be128ed1d5 mvgroup: tweak cateory and subtitles default 2017-10-25 08:14:31 +13:00
Garfield69
fb904840b8 mvgroup: new trackers for the Main and Forum versions of the site. Completes #315 2017-10-25 08:01:28 +13:00
kaso17
b4e81301a3 Fuzer: use browse.php 2017-10-24 18:30:09 +02:00
kaso17
0ada1871ba Blutopia: add global freeleech support 2017-10-24 12:24:36 +02:00
kaso17
6200eba45d Cardigann: move preprocessingfilters after re-login check 2017-10-24 11:51:54 +02:00
kaso17
7f7c6eb1c4 Merge branch 'master' of https://github.com/Jackett/Jackett.git 2017-10-24 11:15:52 +02:00
kaso17
92fb27e188 Cardigann: fix re_replace regex 2017-10-24 11:15:46 +02:00
Garfield69
82eebf82d3 btdb: fetch up to 100 results instead of just 10. Fix #1999 2017-10-24 20:32:54 +13:00
Garfield69
5607458f60 t411v2: fetch up to 100 results instead of just 20. Fix #1944 2017-10-24 20:16:53 +13:00
Guizzoni
16654d46df Add Speed-Share indexer (#2005)
fix #1699
2017-10-24 08:47:21 +02:00
Garfield69
c8bfd73c8d yaml definitons: use of single search path is deprecated
this goes double for associated method!
and brings everything into line with current wiki docs
2017-10-24 06:55:22 +13:00
kaso17
e6a2646a98 BitMeTV: use and filter 2017-10-23 18:10:19 +02:00
kaso17
6dc12f0d3c Torznab: add audio-search cap 2017-10-23 18:02:53 +02:00
kaso17
0846ca40cd PTFiles: adjust rows selector
fix #1844
2017-10-23 17:47:58 +02:00
kaso17
dae55ad500 The Empire: fix download link
fix #1997
2017-10-23 17:08:35 +02:00
Andrew
5e361c2087 uhdbits: fix date (#2000) 2017-10-23 16:51:02 +02:00
Brian Hardisty
3d7ecd197b BeyondHD: Add new FraMeSToR 4K REMUX category (#2001) 2017-10-23 16:49:47 +02:00
Frederik Nielsen
c0524db98d Hounddawgs: Fix grabs/seeders/peers (#1993) 2017-10-23 08:03:37 +02:00
Garfield69
fa8021c048 metaltracker: source cosmetic alignment 2017-10-23 07:15:44 +13:00
Garfield69
246a761eb7 cpabien: add date 2017-10-23 07:15:04 +13:00
Garfield69
28260afdd9 nexttorrent: new domain fix #1996 2017-10-23 07:14:35 +13:00
Garfield69
4c42995ebc anirena: fix #1990
Add a few missing categories
handle TEST correctly
prevent row selector false hits
add date as now instead of 2017y ago
add category selector for results
2017-10-22 15:47:04 +13:00
Garfield69
bdc2843b40 metaltracker: add semi-private heavy metal music tracker #282
this definition is for the english version of the site
2017-10-22 08:44:22 +13:00
Ellmout
6e61f38644 Convert ArcheTorrent from C# to Definition file (#1987)
* Merge ArcheTorrent from C# to Definition files

* Merge ArcheTorrent from C# to Definition files (forgot csproj file)
2017-10-21 11:05:08 +02:00
Andrew
8ff186d716 torviet: fix including dead (#1989) 2017-10-21 11:03:51 +02:00
kaso17
c58b9d58a9 Xthor: enable tracker specific categories 2017-10-19 16:54:15 +02:00
kaso17
1603516666 CardigannIndexer: add support for music-search 2017-10-19 16:46:34 +02:00
kaso17
46e841fc13 SceneTime: update categories 2017-10-19 16:45:07 +02:00
kaso17
d4ff5d3022 cpasbien: update site links 2017-10-19 16:26:29 +02:00
kaso17
935416cf0d fix music-search supportedParams 2017-10-18 18:42:00 +02:00
kaso17
7ca75f51e3 enable album music search 2017-10-18 18:34:46 +02:00
kaso17
9b592259aa notwhat.cd: enable music-search 2017-10-18 18:31:27 +02:00
kaso17
281678892d Redacted: enable music-search 2017-10-18 18:31:14 +02:00
kaso17
9aace8ae16 Synthesiz3r: enable music-search 2017-10-18 18:31:02 +02:00
kaso17
adcfade7f2 Torznab: add support for music-search 2017-10-18 18:30:41 +02:00
Tobias Nordahl Kristensen
d0d51a907e Hounddawgs: Fix category 89 & 91 (#1981)
Both is DK Movies (HD&SD) and _not_ TV-content.
2017-10-18 12:25:06 +02:00
Max Maton
0a4e003bde Secret Cinama: Fix search (#1979)
* Fix Secret Cinama searching

* Update secretcinema.yml
2017-10-18 11:14:36 +02:00
kaso17
7230507f5a AnimeBytes: improve Audio category matching 2017-10-18 11:00:47 +02:00
kaso17
07744ab88f AnimeBytes: add Forbidden error handling 2017-10-18 10:46:38 +02:00
kaso17
a8f80ca60e Revert "HttpWebClient: Add certificate whitelist warnning"
This reverts commit b9d3592f3a.
2017-10-17 19:11:32 +02:00
kaso17
3011f22101 MoreThanTV: add season filtering 2017-10-17 19:10:53 +02:00
kaso17
f3098bd6d9 Blutopia: fix timezone parsing 2017-10-17 18:41:01 +02:00
kaso17
b9d3592f3a HttpWebClient: Add certificate whitelist warnning 2017-10-17 18:38:35 +02:00
kaso17
f299cf3ac3 Il Corsaro Nero: update certificate 2017-10-17 18:26:32 +02:00
kaso17
48118d5691 Blutopia: fix definition 2017-10-17 18:23:32 +02:00
kaso17
5d6b71b7a7 Cardigann: add Preprocessing Filters 2017-10-17 18:23:13 +02:00
kaso17
e5982b49a2 GkTorrent: update links 2017-10-17 13:09:02 +02:00
kaso17
bb80da9b19 AnimeBytes: fix parse error on empts tag list 2017-10-17 12:49:54 +02:00
kaso17
d027901257 ShowRSS: default to HTTPS 2017-10-17 12:30:04 +02:00
alimnette
8b8629ef19 T411v2: Fix Greys Anatomy search (#1962)
Fixes #1963
2017-10-17 12:22:10 +02:00
Alexander Chapliuk
3cdab54f5c Add LostFilm.tv indexer (#1975)
Fixes #1922
2017-10-17 12:19:03 +02:00
kaso17
d0342019bc FileList: update categories 2017-10-17 12:08:52 +02:00
kaso17
3c61cb6f06 Xtreme Zone: update paths 2017-10-17 11:56:22 +02:00
kaso17
3863008846 M-Team - TP: add support for adult torrents 2017-10-17 11:49:57 +02:00
kaso17
22ca2d9552 Merge branch 'master' of https://github.com/Jackett/Jackett.git 2017-10-17 11:15:32 +02:00
kaso17
e6029c41a7 Manual search: strip leading zeroes from episode 2017-10-17 11:15:28 +02:00
kaso17
63cf687f02 Animebytes: add AddSynonyms and FilterSeasonEpisode options 2017-10-17 11:15:09 +02:00
Jelle
d30bde715c Added the aggregate indexer to be retrievable from IndexerManagerService.GetWebIndexer() (#1969) 2017-10-16 18:22:16 +02:00
Garfield69
12b9d6ca7d btbit: add the English version of this public. resolves #1934 2017-10-16 17:59:56 +13:00
alimnette
0933d913dc Update t411v2.yml (#1949)
Fix Grey's Anatomy results
2017-10-11 07:48:08 +02:00
Garfield69
8aa82a22f4 nexttorrent: moved domain to www.nextorrent.cc #1950 2017-10-11 13:00:33 +13:00
Garfield69
91817a10ff torrent9: moved domain ... again! #1950 2017-10-11 12:51:40 +13:00
Garfield69
8f10d27d0f docs: add DuckieTV to the list of apps that support connecting to Jackett 2017-10-10 15:23:41 +13:00
Garfield69
49a7c8df7a gktorrent: fix #1941
the dashboard test requires just the base path.
categories matching requires french keywords
the site does not supply a release date, so lets default to now,
otherwise we get ugly "2017y old" in dashboard results.
2017-10-09 13:36:09 +13:00
garfield69
34780f91be cpabien: switch to .org domain fix #1933 (#1937)
this avoids redirection by .cc domain
add .cc as legacylink
also add original .co as legacylink
2017-10-09 10:36:07 +13:00
garfield69
851a4d30e1 DanishBits: add Passkey info to hopefully prevent #1892 #1873 #1850 (#1925)
* DanishBits: add Passkey info to hopefully prevent #1892 #1873 #1850

**WARNING** this is a completely untested code change, as I don't have VS or a c# compiler.      
I simply made my best guess based on similar code I found in TorrentBytes.cs
Please review carefully, and hopefully I haven't left anything out ;-)
If you don't want me to make future changes like this without the required tools, then please let me know. Thanks.

* Update DanishBits.cs

* Update DanishBits.cs

* Update DanishBits.cs

* Update DanishBits.cs

* Update DanishBits.cs

* Update DanishBits.cs

* Update ConfigurationDataUserPasskey.cs

add display item instructions

* Update DanishBits.cs

switch to ConfigurationDataUserPasskey
and drop unused using statements

* Update CouchPotatoTracker.cs

add ConfigurationDataUserPasskey ConfigData1

* Update CouchPotatoTracker.cs

fix optional configData parm override

* revert

oops no, that wipes preloaded data :(

* Update CouchPotatoTracker.cs

add configurationDataUserPasskey as parameter
2017-10-06 10:36:04 +02:00
garfield69
2ab6d13493 Descriptions3 (#1923)
* AnimeTosho: add description

* worldwidetorrents: add description

* 2fast4you: add description

* 7tor: add description

* arabafenice: add description

* ast4u: add description

* b2s-share: add description

* bithumen: add description

* bitspyder: add description

* BrokenStones: add description

* cpasbien: add description

* CzTorrent: add description

* Deildu: add description

* diablotorrent: add description

* gigatorrents: add description

* gktorrent: add description

* gktorrent: amend description

* gods: add description

* greekteam: add description

* hdtorrentsit: add description

* ilcorsaronero: add description

* kickasstorrent-kathow: add description

* linkomanija: add description

* losslessclub: add description

* manicomioshare: add description

* nexttorrent: add description

* Norbits: amend description

* nyaa-pantsu: add description

* nyoo: add description

* PassThePopcorn: amend description

* PolishTracker: add description

* ptfiles: add description

* t411v2: add description

* tntvillage: add description

* TorrentNetwork: add description

* torrent9: add description

* TorrentDay: amend description

* torrentsmd: add description

* trancetraffic: add descrption

* trezzor: add description
2017-10-04 07:05:10 +02:00
kaso17
fd79b317ea Rarbg: adjust delay 2017-10-03 15:32:44 +02:00
kaso17
0e0d53fa00 IWebClient: fix DelayRequest 2017-10-03 15:32:34 +02:00
kaso17
034edbd32a DanishBits: fix download 2017-10-03 14:23:31 +02:00
kaso17
ecc438b21e Isohunt: remove (dead) 2017-10-03 14:04:29 +02:00
kaso17
d2d3dfbe77 MoreThanTV: improve search results 2017-10-03 13:03:25 +02:00
garfield69
addd6ae226 btdb: fix #1900 add support for Sonarr and Radarr (#1921)
the btdb site does not use categories and supplies magnets for all sorts of content.
So the btdb definition now always returns category `100001 Other` for all search results.
Added info in settings to provide instructions on setting up btdb on Sonarr and Radarr.
Tested on Jackett Dashboard, Sonarr and Radarr.
2017-10-03 12:53:48 +02:00
garfield69
5818548dbf kickasstorrent: fix #1852 (#1920)
fix so it passes the Sonarr test.
add description.
Tested on Jackett Dashboard and Sonarr
2017-10-03 12:50:46 +02:00
Wyall
38e039ac34 Update TransmitheNet.cs (#1919)
TTN -> NBL as it's called nebulance
2017-10-03 12:48:50 +02:00
EffeF
4c3f45fd8c hdtorrentsit: fix #1294 (#1918)
* Update hdtorrentsit.yml

* Update hdtorrentsit.yml
2017-10-03 12:48:31 +02:00
garfield69
1b7e8a9edf Descriptions2 (#1916)
* asiandvdclub: add description

* bb: amend description

* fanoin: add description

* freedomhd: add description

* fullmixmusic: add description

* gormogon: add description

* icetorrent: add description

* majomparade: add description

* mononokebt: add description

* PiXELHD: add description

* rodvd: add description

* tasmanit: add description

* thetorrents: add description

* torrenthr: add description

* utorrents: add description

* zamundanet: add description

* zelkaorg: add description

* ztracker: add description

* 1337x: add description

* BroadcastTheNet: add description

* torrenting: add description

* gfxpeers: add description

* torlock: add description

* aniRena: add description

* 1337x: amend description

* anidex: amend description

* aniRena: amend description

* btdb: add description

* Demonoid: add description

* eztv: add description

* idope: add description

* limetorrents: add description

* thepiratebay: add description

* nyaasi: add description

* magnetdl: add description

* RARBG: add description

* RuTracker: add description

* skytorrents: add description

* torrentdownloads: add description

* torrentz2: add description

* YTS: add description

* zooqle: add description
2017-10-03 12:47:02 +02:00
kaso17
af4df90832 fix typo 2017-10-01 15:01:24 +02:00
kaso17
c99fdfe641 Merge branch 'master' of https://github.com/Jackett/Jackett.git 2017-10-01 14:27:37 +02:00
kaso17
211e80cb17 TV Chaos: update categories 2017-10-01 14:27:30 +02:00
garfield69
d687dfc3e1 hyperay: update link and add description (#1912)
hyperay switched domains in feb '17
source: opentrackers.org
2017-10-01 11:28:52 +02:00
garfield69
1ea5b21956 Display a description on Indexer Setup panel (#1911)
* custom.js: add description alert to Indexer Setup panel

* index.html: add description to Indexer Setup panel

* Update index.html
2017-10-01 11:28:10 +02:00
Matthew Banning
aff3af0214 RARBG: Adding 4k categories (#1910)
* Add 4k Movie and TV categories for RARBG

Currently it does not look like torrentapi.org indexes the 4k movie categories but I've added them anyway in case they get added in the future.
Also, torrentapi.org returns "Movies/TV-UHD-episodes" for RARBG's 4k TV category. This may be due to RARBG's top100 page.

* Update Rarbg.cs
2017-10-01 11:26:52 +02:00
garfield69
f9b2875470 add Descriptions (#1909)
* HDForever: add description

* superbits: add description

* czteam: add description

* xspeeds: amend description

* Synthesiz3r: add description

* TorrentVault: add description

* insanetracker: add description

* yggtorrent: add description

* ImmortalSeed: amend description

* polishsource: add description

* btnext: add description

* hon3yhd: add description

* hdhome: add description

* ultrahdclub: add description

* speedtorrentreloaded: add description

* hdme: add description

* magico: add description

* ourbits: add description

* audiobooktorrents: add description

* ultimategamerclub: add description

* dragonworldreloaded: add description

* dreamteam: add description

* Psytorrents: add description

* funkytorrents: add description

* rockhardlossless: add description

* bluebirdhd: add description

* Hardbay: add description

* shellife: add description

* aox: add description

* acidlounge: add description

* infinityt: add description

* jpopsuki: add description

* bithq: add description

* HD-Only: add description

* torrentccf: add description

* xtremezone: add description

* sktorrent: add description

* Torrentech: add description

* passionetorrent: add description

* kapaki: add description

* carpathians: add description

* estone: add description

* datascene: add description

* myspleen: add description

* torviet: add description

* backups: add description

* CGPeers: add description

* inperil: add description
2017-10-01 11:26:07 +02:00
garfield69
606c82921b add EliteHD (#1908)
* Create elitehd.yml

* docs: add EliteHD

* elitehd: add description
2017-10-01 11:25:22 +02:00
nenladar
4463fc0550 TorrentLeech: Add the new 4K category (#1899)
* Add the new 4K category for TorrentLeech

TorrentLeech renamed the existing 4k category and added a new "Real 4K UltraHD HDR" category. This PR adds the new category (but leaves the old one too).

* Update TorrentLeech.cs
2017-09-29 17:21:32 +02:00
garfield69
2bdb1ee0ff btdb: add default categories (#1886) 2017-09-23 14:02:49 +02:00
garfield69
2af27c0a87 zooqle: seeders and leechers can be missing. (#1885) 2017-09-23 14:02:35 +02:00
garfield69
db9fb73b4d anidex: fix #1817 settings' category id causing no results (#1880) 2017-09-22 08:06:22 +02:00
garfield69
aee64183fc rapidetracker: cleanup after removal. closes #1870 (#1874) 2017-09-22 08:04:52 +02:00
garfield69
9cabf72829 add BTDB public tracker. Closes #1564 (#1868)
* docs: add BTDB public tracker. Closes #1564

* Create btdb.yml
2017-09-22 08:04:41 +02:00
garfield69
ec7a2d049c zooqle: fix seeders and leechers (#1867) 2017-09-22 08:04:10 +02:00
garfield69
11ebe34f55 add MagnetDL public tracker. closes #1069 (#1865)
* docs: add MagnetDL public tracker. closes #1069

* Create magnetdl.yml

* magnetdl: ensure keywords are in lower case

* docs: oops, m before n
2017-09-22 08:03:55 +02:00
garfield69
db476951fe add World Wide Torrents public tracker. closes #1439 (#1863)
* Create worldwidetorrents.yml

* docs: add World Wide Torrents public tracker. Closes #1439

* worldwidetorrents: prevent errors.

the scripts were causing false hits for the row selector.

* docs: oops put wwt in correct section
2017-09-22 08:03:09 +02:00
garfield69
a49e0d5667 idope: add info to itorrents settings and default to enabled. (#1862) 2017-09-22 08:02:37 +02:00
halali
605c6bcada Trezzor: Convert to cardigan (#1860)
* Convert Trezzor to cardigan

* Change encoding
2017-09-22 08:02:03 +02:00
kaso17
9c2e5b4219 Hon3y HD: improve search query
fixes #1859
2017-09-20 13:17:09 +02:00
kaso17
2e1ce6f202 M-Team - TP: add support for IMDB tooltip handling 2017-09-20 11:39:15 +02:00
kaso17
650435aaef Cardigann: add support for info setting 2017-09-20 11:38:50 +02:00
kaso17
f2248200af Merge branch 'master' of https://github.com/Jackett/Jackett.git 2017-09-19 17:34:06 +02:00
kaso17
6a9777895c TenYardTracker: update default link
fixes #1846
2017-09-19 17:33:58 +02:00
kaso17
47a8c977d9 torznab: include proper torznab category attributes 2017-09-19 17:32:30 +02:00
garfield69
b138e243ee add Idope public tracker. closes #1386 (#1857)
* docs: add Idope public tracker

* Create idope.yml
2017-09-19 12:27:54 +02:00
kaso17
fbab796e76 Ethor.net: add login error detection 2017-09-19 11:38:06 +02:00
kaso17
8126fc3c85 DanishBits: use wildcard search 2017-09-19 11:32:12 +02:00
kaso17
27a7b2d711 TorrentVault: fix category selector
fixes #1853
2017-09-19 11:09:24 +02:00
kaso17
86ecacffcb log request exceptions 2017-09-19 11:02:00 +02:00
kaso17
8b5d3d0170 Bitspyder: fix grabs parsing for alternative style 2017-09-18 11:26:24 +02:00
kaso17
4c3cb9f295 Merge branch 'master' of https://github.com/Jackett/Jackett.git 2017-09-17 16:38:32 +02:00
kaso17
c9f945a08e Torrent9: update site link 2017-09-17 16:38:25 +02:00
garfield69
46c6bd74a2 zooqle: add categories and fix a few bugs (#1834)
dummy commit, already applied via #1837
2017-09-17 16:35:03 +02:00
kaso17
61e2add89a 1337x: optional category and conditional date parsing 2017-09-17 16:32:05 +02:00
garfield69
24fe395cf0 add 1337x public tracker. Closes #1384 (#1837)
* zooqle: add categories and fix a few bugs

* docs: add 1337x public tracker

* create 1337x public tracker. closes #1384
2017-09-17 15:17:07 +02:00
Nottt
aab8968a14 Update README.md (#1841) 2017-09-17 15:05:42 +02:00
kaso17
de98438102 update readme 2017-09-17 15:02:03 +02:00
kaso17
108213f098 DanishBits: use couchpotato API 2017-09-15 18:57:43 +02:00
kaso17
861271ac04 TorznabQuery: allow % in search term 2017-09-15 18:54:33 +02:00
kaso17
b378f74202 zetorrents: remove 2017-09-15 17:08:33 +02:00
kaso17
866e1df174 Add GkTorrent tracker 2017-09-15 17:05:55 +02:00
kaso17
0bb231eeca Back-ups: minor changes 2017-09-15 08:20:57 +02:00
halali
fb5c82ff85 Add Back-ups and SkTorrent trackers (#1830)
* Fix Date and inprove seasson searching for CzTorrent

* Update title filter

* Add Back-ups and SkTorrent

* Update reabme

* Update backups.yml
2017-09-15 08:15:40 +02:00
garfield69
d9f57b4e13 Definitions: replace deprecated optional (#1827)
* bithumen: replace deprecated use of optional

* bitspyder: replace deprecated use of optional

* chdbits: replace deprecated use of optional

* diablotorrent: replace deprecated use of optional

* eztv: replace deprecated use of optional

* funkytorrents: replace deprecated use of optional

* hon3yhd: replace deprecated use of optional

* insanetracker: replace deprecated use of optional

* kapaki: replace deprecated use of optional

* limetorrents: replace deprecated use of optional

* linkomanija: replace deprecated use of optional

* losslessclub: replace deprecated use of optional

* magico: replace deprecated use of optional

* majomparade: replace deprecated use of optional

* ourbits: replace deprecated use of optional

* polishsource: replace deprecated use of optional

* rodvd: replace deprecated use of optional

* torrentccf: replace deprecated use of optional

* torrenthr: replace deprecated use of optional

* torrentproject: replace deprecated use of optional

* torrentz2: replace deprecated use of optional

* oops

* Update bitspyder.yml

* Update insanetracker.yml

* Update kapaki.yml

* Update magico.yml

* Update polishsource.yml

* Update torrenthr.yml

* Update polishsource.yml
2017-09-15 08:14:46 +02:00
garfield69
4676972493 add Zooqle tracker (#1826)
fix #1185
2017-09-15 08:01:10 +02:00
kaso17
1d3ac34011 add innerstacktrace on request exception 2017-09-14 15:01:01 +02:00
kaso17
634a860f5c DigitalHive: Captcha is optional now 2017-09-14 15:00:33 +02:00
kaso17
eb00665df1 Hounddawgs: fix bannerUri usage 2017-09-13 12:53:38 +02:00
kaso17
5e77d27021 ArcheTorrent: improve parsing 2017-09-13 12:50:21 +02:00
Malte Baden Hansen
8fec3ede4e Hounddawgs: fix wrong image path causing torrent parsing to fail. (#1808)
* Wrapped item parsing in try catch / one erranious torrent should not fuck up the entire parsing.
Changed Uri creation to use TryCreate, to harden against invalid image paths.

* Woops, can't use new C# features...
2017-09-13 12:06:44 +02:00
kaso17
ae6d5ccfc6 ResultsController: fix request exception handling 2017-09-13 12:01:07 +02:00
kaso17
e309d96c51 Hounddawgs: handle invalid BannerUrls 2017-09-13 11:56:05 +02:00
kaso17
2a3b42f83a BaseIndexer: include original stack trace in OnParseError exceptions 2017-09-13 11:49:24 +02:00
kaso17
4819a3c8ed Continue loading cardigann definition in case of an error 2017-09-13 11:33:17 +02:00
halali
34d091942a CzTorrent : Fix Date and improve season searching (#1812)
* Fix Date and inprove seasson searching for CzTorrent

* Update title filter
2017-09-13 11:19:01 +02:00
kaso17
ee2abe6751 TorrentVault: fix date format 2017-09-13 11:15:24 +02:00
kaso17
27f0448caf TorrentVault: add certificate 2017-09-13 11:14:26 +02:00
kaso17
6493037251 UpdateService: always print current/latest version 2017-09-13 10:35:51 +02:00
kaso17
0cd11e1882 Improve error handling if the tracker is down 2017-09-13 09:57:39 +02:00
kaso17
cfdafa01c9 Torlock: fix date parsing 2017-09-13 09:29:30 +02:00
kaso17
e3852bcb1b Merge branch 'master' of https://github.com/Jackett/Jackett.git 2017-09-13 09:13:58 +02:00
kaso17
e33e95c1b2 The Empire: update site link 2017-09-13 09:13:49 +02:00
garfield69
3d0e777d22 SceneAccess: remove (shutdown) (#1818)
* docs: delete sceneAccess

* Delete SceneAccess.cs

* cleanup for Indexers/SceneAccess.cs

* remove SceneAccess.cs

* revert, as SceneAccess is not a yml definition but a cs indexer
2017-09-13 09:00:54 +02:00
kaso17
aeb3d49c06 fix Definitions include 2017-09-11 15:16:16 +02:00
kaso17
c2cf5adeb2 PolishTracker: update for new reaper engine 2017-09-11 15:10:54 +02:00
kaso17
40ab7280ca add TorrentVault tracker 2017-09-11 12:39:22 +02:00
kaso17
0c37a191fd added Synthesiz3r tracker 2017-09-11 12:02:45 +02:00
kaso17
19547bc58f AnimeBytes: remove useless request 2017-09-11 11:39:47 +02:00
adamwinn
bcbe18214b Karagarga: Fix parsing (#1798) 2017-09-11 11:03:57 +02:00
Alan Gregory
eb60a6854c manicomioshare: Fixed "Unknown series" on sonarr (#1802)
* Fixed "Unknown series on sonarr"

* Changed whitespace to E
2017-09-11 11:03:22 +02:00
adamwinn
11406697be Secret Cinema: change definition to match new site (#1803) 2017-09-11 11:02:39 +02:00
kaso17
b2b576a72d SpeedCD: fix row selector 2017-09-11 10:50:23 +02:00
kaso17
e537e4976e Dream Team: fix definition 2017-09-11 10:33:18 +02:00
kaso17
490254d16b Revert "Dream Team: remove (dead)"
This reverts commit a5cc7d973f.
2017-09-11 10:26:11 +02:00
kaso17
a5cc7d973f Dream Team: remove (dead) 2017-09-09 14:36:47 +02:00
kaso17
3e000453a5 add error message 2017-09-08 19:05:10 +02:00
kaso17
8f090fabef UI: revert target blank change 2017-09-08 19:02:53 +02:00
kaso17
91eb4c37cb TNTVillage: remove diacritics 2017-09-08 19:01:36 +02:00
kaso17
da43f17558 Cardigann: add diacritics filter 2017-09-08 19:00:25 +02:00
kaso17
3b3c3b0947 EliteTracker: update categories 2017-09-08 18:04:28 +02:00
kaso17
06e386c253 readme: update CA certificates error 2017-09-08 17:47:50 +02:00
thebluepotato
a2ae2d3384 Enhance the service installation on MacOS (#1793)
* Make the script self-executing

* Update script with colors

Since it’s self-executing, at least the output is more visible

* Changes to README

* Update Jackett.Console.csproj

* Clarify README
2017-09-08 17:12:47 +02:00
thebluepotato
3532a73d59 UI: Change the type locks to labels (#1773)
* Changing the locks

* Changing the locks to labels

* Update index.html

update chagned param

* whitespaces
2017-09-08 09:06:06 +02:00
thebluepotato
b7daffea87 Enhance the macOS install script (#1786)
Fixes #1784
2017-09-08 09:04:41 +02:00
kaso17
e7b9f8c5ec HDTorrents: fix parsing 2017-09-05 18:37:25 +02:00
garfield69
9ada58a6e3 HDClub: remove (#1772)
* drop HDClub

* delete hdclub

* Delete hdclub.yml
2017-09-03 12:16:37 +02:00
kaso17
c8d974cf52 Add AST4u tracker 2017-09-03 10:03:38 +02:00
kaso17
c544de8fed Demonoid: add recaptcha support 2017-09-02 14:40:29 +02:00
kaso17
93ec102a86 7Tor: add automatic relogin 2017-09-01 18:17:14 +02:00
kaso17
92bda2b09b Anidex: fix definition 2017-09-01 18:08:47 +02:00
kaso17
1cd0358531 SceneTime: make category optional 2017-09-01 17:46:24 +02:00
kaso17
222fec2fd0 whitespace fixes 2017-09-01 17:32:20 +02:00
kaso17
3790cbb894 Add support for X-Forwarded-Proto/Front-End-Https headers 2017-09-01 17:28:56 +02:00
kaso17
05d5798046 Add root privileges notice 2017-08-31 17:48:49 +02:00
kaso17
9e9deb17c7 attempt to fix caching related issues 2017-08-31 12:21:59 +02:00
kaso17
2aedc4f335 IPTorrents: fix AlternativeSiteLinks 2017-08-31 12:14:31 +02:00
kaso17
dfa708e355 IPTorrents: update Alternative Site Links 2017-08-31 11:13:09 +02:00
kaso17
6d1997ef96 UI: Improve Alternative Site Link selection 2017-08-31 11:12:50 +02:00
kaso17
db479d8de8 fix AlternativeSiteLinks 2017-08-31 10:50:47 +02:00
kaso17
741e6407ce FullMixMusic: update URL 2017-08-31 10:50:12 +02:00
kaso17
141f3e57e5 Introduce LegacySiteLinks to automatically update to new SiteLinks 2017-08-30 18:46:36 +02:00
kaso17
00027a41c1 manual search: add multiselect support for tracker/category dropdowns 2017-08-30 17:40:32 +02:00
kaso17
e754d3da9f Merge branch 'master' of https://github.com/Jackett/Jackett.git 2017-08-30 13:52:37 +02:00
kaso17
bf54a2f171 manual search: fix selected indexer log output 2017-08-30 13:52:31 +02:00
garfield69
7b7d0082b6 Docs: refresh public, semi-private, private lists (#1754) 2017-08-30 11:54:56 +02:00
kaso17
3614b1b3da Merge branch 'master' of https://github.com/Jackett/Jackett.git 2017-08-30 11:54:06 +02:00
kaso17
39b0670a29 UI: adjust base path override placeholder 2017-08-30 11:52:27 +02:00
kaso17
1689c46c91 ServerConfiguration: add basePathOverride validation/normalization 2017-08-30 11:51:25 +02:00
kaso17
0143bdfe14 UI: fix updateServerConfig error handling 2017-08-30 11:50:11 +02:00
garfield69
93a9568a77 docs: T411v2 is now public as per #1740 (#1752) 2017-08-29 21:23:53 +02:00
Jonas Stendahl
40079b0365 SceneAccess: site is now permanently free-leech (#1749) 2017-08-29 18:50:25 +02:00
kaso17
168f04e786 SanitizedSearchTerm: allow + 2017-08-29 17:34:38 +02:00
563 changed files with 20730 additions and 10813 deletions

View File

@@ -3,7 +3,7 @@
Provide a description of the feature request or bug, the more details the better.
If you are experiencing an issue with a tracker, a **full log must be included**. Instructions for obtaining logs are here: https://github.com/Jackett/Jackett#troubleshooting
Jackett version:
Mono version (if not using Windows):
**Jackett version**:
**Mono version** (if not using Windows):
-------------------------------

100
.github/appveyor.yml vendored
View File

@@ -1,100 +0,0 @@
version: 0.7.{build}
skip_tags: true
image: Visual Studio 2015
configuration: Release
assembly_info:
patch: true
file: '**\AssemblyInfo.*'
assembly_version: '{version}'
assembly_file_version: '{version}'
assembly_informational_version: '{version}'
install:
- cmd: choco install InnoSetup
before_build:
- cmd: nuget restore src\Jackett.sln
build:
verbosity: minimal
after_build:
- cmd: >-
xcopy src\Jackett.Console\bin\Release build.windows\ /e /y
copy /Y src\Jackett.Service\bin\Release\JackettService.exe* %APPVEYOR_BUILD_FOLDER%\build.windows\
copy /Y src\Jackett.Tray\bin\Release\JackettTray.exe* %APPVEYOR_BUILD_FOLDER%\build.windows\
copy /Y src\Jackett.Updater\bin\Release\JackettUpdater.exe* %APPVEYOR_BUILD_FOLDER%\build.windows\
copy /Y LICENSE build.windows\LICENSE
copy /Y README.md build.windows\README.md
xcopy build.windows WindowsBuild\Jackett\ /e /y
msbuild src\Jackett.sln /t:Clean /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll"
"C:\Program Files (x86)\Mono\bin\xbuild.bat" src\Jackett.sln /t:Build /p:Configuration=Release /verbosity:minimal /tv:12.0
xcopy src\Jackett.Console\bin\Release build.mono\ /e /y
copy /Y src\Jackett.Service\bin\Release\JackettService.exe* %APPVEYOR_BUILD_FOLDER%\build.mono\
copy /Y src\Jackett.Tray\bin\Release\JackettTray.exe* %APPVEYOR_BUILD_FOLDER%\build.mono\
copy /Y src\Jackett.Updater\bin\Release\JackettUpdater.exe* %APPVEYOR_BUILD_FOLDER%\build.mono\
copy /Y LICENSE build.mono\LICENSE
copy /Y README.md build.mono\README.md
copy /Y Upstart.config build.mono\Upstart.config
xcopy build.mono MonoBuild\Jackett\ /e /y
"C:\Program Files (x86)\Inno Setup 5\ISCC.exe" Installer.iss
RENAME Output\setup.exe Jackett.Installer.Windows.exe
MOVE Output\Jackett.Installer.Windows.exe %APPVEYOR_BUILD_FOLDER%
cd WindowsBuild
7z a -tzip -r "%APPVEYOR_BUILD_FOLDER%\Jackett.Binaries.Windows.zip" "Jackett\"
cd %APPVEYOR_BUILD_FOLDER%
cd MonoBuild
7z a -ttar "%APPVEYOR_BUILD_FOLDER%\Jackett.Binaries.Mono.tar" "Jackett\"
cd %APPVEYOR_BUILD_FOLDER%
7z a -tgzip "Jackett.Binaries.Mono.tar.gz" "Jackett.Binaries.Mono.tar"
appveyor PushArtifact Jackett.Installer.Windows.exe
appveyor PushArtifact Jackett.Binaries.Windows.zip
appveyor PushArtifact Jackett.Binaries.Mono.tar.gz
deploy:
- provider: GitHub
tag: v$(appveyor_build_version)
auth_token:
secure: hOg+16YTIbq4kO9u4D1YVOTbWDqgCX6mAQYMbnmBBSw2CiUsZh7OKbupoUb3FtWa
draft: true
on:
branch: master
notifications:
- provider: GitHubPullRequest
auth_token:
secure: k6ZZACPbKcvAFiXe/uOmY6Ofs4aw2rgKEWMNA8EilQpdJ6o7ef31we4DPn3SXZzx
on_build_success: true
on_build_failure: true
on_build_status_changed: true

8
.gitignore vendored
View File

@@ -194,6 +194,8 @@ FakesAssemblies/
# Visual Studio 6 workspace options file
*.opt
/Build.mono
/Build.windows
/Output
/tools
/BuildOutput
/Artifacts
/TestResults
*.DS_Store

View File

@@ -1,37 +0,0 @@
rmdir /s /q build.windows
rmdir /s /q build.mono
rmdir /s /q Output
cd src
Msbuild Jackett.sln /t:Clean,Build /p:Configuration=Release /verbosity:minimal
cd ..
xcopy src\Jackett.Console\bin\Release build.windows\ /e /y
copy /Y src\Jackett.Service\bin\Release\JackettService.exe build.windows\JackettService.exe
copy /Y src\Jackett.Service\bin\Release\JackettService.exe.config build.windows\JackettService.exe.config
copy /Y src\Jackett.Tray\bin\Release\JackettTray.exe build.windows\JackettTray.exe
copy /Y src\Jackett.Tray\bin\Release\JackettTray.exe.config build.windows\JackettTray.exe.config
copy /Y src\Jackett.Updater\bin\Release\JackettUpdater.exe build.windows\JackettUpdater.exe
copy /Y src\Jackett.Updater\bin\Release\JackettUpdater.exe.config build.windows\JackettUpdater.exe.config
copy /Y LICENSE build.windows\LICENSE
copy /Y README.md build.windows\README.md
cd src
Msbuild Jackett.sln /t:Clean
call "C:\Program Files (x86)\Mono\bin\xbuild.bat" Jackett.sln /t:Build /p:Configuration=Release /verbosity:minimal
cd ..
xcopy src\Jackett.Console\bin\Release build.mono\ /e /y
copy /Y src\Jackett.Service\bin\Release\JackettService.exe build.mono\JackettService.exe
copy /Y src\Jackett.Service\bin\Release\JackettService.exe.config build.mono\JackettService.exe.config
copy /Y src\Jackett.Tray\bin\Release\JackettTray.exe build.mono\JackettTray.exe
copy /Y src\Jackett.Tray\bin\Release\JackettTray.exe.config build.mono\JackettTray.exe.config
copy /Y src\Jackett.Updater\bin\Release\JackettUpdater.exe build.mono\JackettUpdater.exe
copy /Y src\Jackett.Updater\bin\Release\JackettUpdater.exe.config build.mono\JackettUpdater.exe.config
copy /Y LICENSE build.mono\LICENSE
copy /Y README.md build.mono\README.md
copy /Y Upstart.config build.mono\Upstart.config
iscc Installer.iss

View File

@@ -2,7 +2,7 @@
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!
#define MyAppName "Jackett"
#define MyAppVersion GetFileVersion("build.windows/Jackett.dll")
#define MyAppVersion GetFileVersion("BuildOutput\FullFramework\Windows\Jackett\Jackett.Common.dll")
#define MyAppPublisher "Jackett Inc."
#define MyAppURL "https://github.com/Jackett/Jackett"
#define MyAppExeName "JackettTray.exe"
@@ -22,7 +22,7 @@ AppUpdatesURL={#MyAppURL}
DefaultDirName={pf}\{#MyAppName}
DefaultGroupName={#MyAppName}
DisableProgramGroupPage=yes
OutputBaseFilename=setup
OutputBaseFilename=Jackett.Installer.Windows
SetupIconFile=src\Jackett.Console\jackett.ico
UninstallDisplayIcon={commonappdata}\Jackett\JackettConsole.exe
Compression=lzma
@@ -37,9 +37,9 @@ Name: "windowsService"; Description: "Install as a Windows Service"
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked
[Files]
Source: "build.windows\JackettTray.exe"; DestDir: "{commonappdata}\Jackett"; Flags: ignoreversion
Source: "build.windows\JackettUpdater.exe"; DestDir: "{commonappdata}\Jackett"; Flags: ignoreversion
Source: "build.windows\*"; DestDir: "{commonappdata}\Jackett"; Flags: ignoreversion recursesubdirs createallsubdirs
Source: "BuildOutput\FullFramework\Windows\Jackett\JackettTray.exe"; DestDir: "{commonappdata}\Jackett"; Flags: ignoreversion
Source: "BuildOutput\FullFramework\Windows\Jackett\JackettUpdater.exe"; DestDir: "{commonappdata}\Jackett"; Flags: ignoreversion
Source: "BuildOutput\FullFramework\Windows\Jackett\*"; DestDir: "{commonappdata}\Jackett"; Flags: ignoreversion recursesubdirs createallsubdirs
; NOTE: Don't use "Flags: ignoreversion" on any shared system files
[Icons]

143
README.md
View File

@@ -3,40 +3,52 @@
[![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)
[![Bountysource](https://img.shields.io/bountysource/team/jackett/activity.svg?style=flat-square)](https://www.bountysource.com/teams/jackett)
[![Build status](https://ci.appveyor.com/api/projects/status/gaybh5mvyx418nsp/branch/master?svg=true)](https://ci.appveyor.com/project/camjac251/jackett)
[![Build status](https://ci.appveyor.com/api/projects/status/gaybh5mvyx418nsp/branch/master?svg=true)](https://ci.appveyor.com/project/Jackett/jackett)
[![Github Releases](https://img.shields.io/github/downloads/Jackett/Jackett/total.svg?maxAge=60&style=flat-square)](https://github.com/Jackett/Jackett/releases/latest)
[![Docker Pulls](https://img.shields.io/docker/pulls/linuxserver/jackett.svg?maxAge=60&style=flat-square)](https://hub.docker.com/r/linuxserver/jackett/)
[![Discord](https://img.shields.io/badge/discord-chat-7289DA.svg?maxAge=60&style=flat-square)](https://discord.gg/J865QuA)
This project is a new fork and is recruiting development help. If you are able to help out please contact us.
Jackett works as a proxy server: it translates queries from apps ([Sonarr](https://github.com/Sonarr/Sonarr), [Radarr](https://github.com/Radarr/Radarr), [SickRage](https://sickrage.github.io/), [CouchPotato](https://couchpota.to/), [Mylar](https://github.com/evilhero/mylar), etc) into tracker-site-specific http queries, parses the html response, then sends results back to the requesting software. This allows for getting recent uploads (like RSS) and performing searches. Jackett is a single repository of maintained indexer scraping & translation logic - removing the burden from other apps.
Jackett works as a proxy server: it translates queries from apps ([Sonarr](https://github.com/Sonarr/Sonarr), [Radarr](https://github.com/Radarr/Radarr), [SickRage](https://sickrage.github.io/), [CouchPotato](https://couchpota.to/), [Mylar](https://github.com/evilhero/mylar), [DuckieTV](https://github.com/SchizoDuckie/DuckieTV), etc) into tracker-site-specific http queries, parses the html response, then sends results back to the requesting software. This allows for getting recent uploads (like RSS) and performing searches. Jackett is a single repository of maintained indexer scraping & translation logic - removing the burden from other apps.
Developer note: The software implements the [Torznab](https://github.com/Sonarr/Sonarr/wiki/Implementing-a-Torznab-indexer) (with [nZEDb](https://github.com/nZEDb/nZEDb/blob/dev/docs/newznab_api_specification.txt) category numbering) and [TorrentPotato](https://github.com/RuudBurger/CouchPotatoServer/wiki/Couchpotato-torrent-provider) APIs.
#### Supported Systems
* Windows using .NET 4.5
* Linux and macOS using Mono 4 (mono 3 is no longer supported).
* Windows using .NET 4.5.2 [Download here](https://www.microsoft.com/net/framework/versions/net452).
* Linux and macOS using Mono 4.6.0 and above. [Download here](http://www.mono-project.com/download/). Earlier versions of mono may work but some trackers may fail to negotiate SSL correctly, and others may cause Jackett to crash when used.
### Supported Public Trackers
* 1337x
* Anidex
* Anime Tosho
* AniRena
* btbit
* BTDB
* BT-Scene
* cpasbien
* ETTV
* ExtraTorrent.ag
* EZTV
* Gay-Torrents.net
* Frozen Layer
* GkTorrent
* Horrible Subs
* Idope
* Il Corsaro Nero <!-- maintained by bonny1992 -->
* Isohunt
* Isohunt2
* KickAssTorrent
* KickAssTorrent (thekat.se clone)
* LimeTorrents
* MagnetDL
* NextTorrent
* Nyaa.si
* Nyaa-Pantsu
* Nyoo
* OxTorrent
* RARBG
* RuTor
* ShowRSS
* Sky torrents
* The Pirate Bay
@@ -44,14 +56,36 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
* Tokyo Toshokan
* Torlock
* Torrent Downloads
* TorrentProject
* Torrent9
* Torrentz2
* zetorrents
* World Wide Torrents
* YIFY (YTS)
* YTS.ag
* Zooqle
### Supported Semi-Private Trackers
* 7tor
* CzTorrent
* Deildu
* Gay-Torrents.net
* Kinozal
* LostFilm.tv
* Mega-Bliz
* Metal Tracker
* MVGroup Forum
* MVGroup Main
* Newstudio
* NetHD
* NoName Club
* RuTracker
* SkTorrent
* Xtreme Zone
* YggTorrent
* Ztracker
### Supported Private Trackers
* 2 Fast 4 You
* 3D Torrents
* 7tor
* Abnormal
* Acid-Lounge
* AlphaRatio
@@ -63,82 +97,96 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
* ArabaFenice
* Arche Torrent
* AsianDVDClub
* AST4u
* Audiobook Torrents
* Awesome-HD
* Avistaz
* B2S-Share
* Back-ups
* BakaBT [![(invite needed)][inviteneeded]](#)
* bB
* BeyondHD
* BIGTorrent
* Bit-City Reloaded
* BIT-HDTV
* BitHQ
* Bithorlo
* BitHUmen
* BitMe
* BitMeTV
* BitSoup [![(invite needed)][inviteneeded]](#)
* Bitspyder
* Blu-bits
* BitTorrentFiles
* BJ-Share
* BlueBird
* Blutopia
* BroadcastTheNet
* BrokenStones
* BTNext
* Carpathians
* CCFBits
* CGPeers
* CHDBits
* Cinematik
* Cinemageddon
* CinemaZ
* Classix
* CZTeam
* CzTorrent
* DanishBits
* DataScene
* Deildu
* Demonoid
* Diablo Torrent
* DigitalHive
* Downloadville
* Dragonworld Reloaded
* Dream Team
* EliteHD [![(invite needed)][inviteneeded]](#)
* Elit Tracker
* Elite-Tracker
* Empornium
* EoT-Forum
* eStone
* Ethor.net (Thor's Land)
* FANO.IN
* FileList
* Femdomcult
* Freedom-HD
* FullMixMusic
* FunFile
* FunkyTorrents
* Fuzer
* GayTorrent.ru
* GazelleGames
* GFTracker
* Gfxnews
* GFXPeers
* Ghost City
* GigaTorrents [![(invite needed)][inviteneeded]](#)
* GigaTorrents
* GimmePeers <!-- maintained by jamesb2147 -->
* GODS [![(invite needed)][inviteneeded]](#)
* Gormogon
* Greek Team
* HacheDe
* Hardbay
* HD-Forever
* HD-Only
* HD-Space
* HD-Torrents
* HD-Bits.com
* HD4Free
* HDBits
* HDChina
* HDClub
* HDCity
* HDHome
* HDME
* HDSky
* HDTorrents.it
* Hebits
* Hon3y HD
* Hounddawgs
* House-of-Torrents
* Hyperay
* ICE Torrent
* I Love Classics
* Immortalseed
* Infinity-T
* inPeril
* Insane Tracker
* IPTorrents
@@ -158,10 +206,8 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
* MySpleen
* NCore
* Nebulance
* NetHD
* New Real World
* NextGen
* Norbits [![(invite needed)][inviteneeded]](#) <!-- added by DiseaseNO but no longer maintained? -->
* Norbits <!-- added by DiseaseNO but no longer maintained? -->
* notwhat.cd
* Ourbits
* Passione Torrent <!-- maintained by bonny1992 -->
@@ -174,13 +220,13 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
* PrivateHD
* Psytorrents
* PTFiles
* PuntoTorrent
* Redacted (PassTheHeadphones)
* RevolutionTT
* Rockhard Lossless
* RoDVD
* RuTracker
* SceneAccess
* SceneFZ
* SceneReactor
* SceneTime
* SDBits
* Secret Cinema
@@ -188,12 +234,15 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
* ShareSpaceDB
* Shazbat
* Shellife
* Speed-Share
* SpeedCD
* SpeedTorrent Reloaded
* SportsCult
* SportHD
* Superbits
* Synthesiz3r
* Tasmanit
* TBPlus
* The Empire
* The Geeks
* The Horror Charnel
@@ -204,42 +253,39 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
* The Show
* The Vault
* The-Torrents
* TehConnection
* TenYardTracker
* Torrent Network
* Torrent Sector Crew
* Torrent9
* Torrent.LT
* TorrentBD
* TorrentBytes
* TorrentCCF [![(invite needed)][inviteneeded]](#)
* TorrentDay
* Torrentech
* TorrentHeaven
* TorrentHR
* Torrenting
* Torrentland
* TorrentLeech
* Torrents.Md
* Torrent-Syndikat
* TorViet
* ToTheGlory
* TranceTraffic
* Trezzor
* TV Chaos UK
* TV-Vault
* T411 v2
* u-Torrent
* u-torrents (SceneFZ)
* UHDBits
* Ultimate Gamer Club
* ULTRAHDCLUB
* Waffles
* World-In-HD
* WorldOfP2P
* x264
* XSpeeds
* Xthor
* Xtreme Zone
* YggTorrent
* Zamunda.net
* Zelka.org
* Ztracker
Trackers marked with [![(invite needed)][inviteneeded]](#) have no active maintainer and are missing features or are broken. If you have an invite for them please send it to kaso1717 -at- gmail.com to get them fixed/improved.
@@ -261,7 +307,7 @@ When installed as a service the tray icon acts as a way to open/start/stop Jacke
Jackett can also be run from the command line if you would like to see log messages (Ensure the server isn't already running from the tray/service). This can be done by using "JackettConsole.exe" (for Command Prompt), found in the Jackett data folder: "%ProgramData%\Jackett".
## Installation on Linux
1. Install [Mono 4](http://www.mono-project.com/download/#download-lin) or better (version 4.8 is recommended)
1. Install [Mono 4.6](http://www.mono-project.com/download/#download-lin) or better (using the latest stable release for your distribution is recommended)
* Follow the instructions on the mono website and install the `mono-devel` and the `ca-certificates-mono` packages.
* On Red Hat/CentOS/openSUSE/Fedora the `mono-locale-extras` package is also required.
2. Install libcurl:
@@ -272,16 +318,19 @@ Jackett can also be run from the command line if you would like to see log messa
Detailed instructions for [Ubuntu 14.x](http://www.htpcguides.com/install-jackett-on-ubuntu-14-x-for-custom-torrents-in-sonarr/) and [Ubuntu 15.x](http://www.htpcguides.com/install-jackett-ubuntu-15-x-for-custom-torrents-in-sonarr/)
If you want to run it with a user without a /home directory you need to add `Environment=XDG_CONFIG_HOME=/path/to/folder` to your systemd file, this folder will be used to store your config files.
## Installation on macOS
### Prerequisites
Install [Mono 4](http://www.mono-project.com/download/#download-mac) or better (version 4.8 is recommended).
Install [Mono 4.6](http://www.mono-project.com/download/#download-mac) or better (using the latest pkg installer is recommended).
* Setup ssl support by running `curl -sS https://curl.haxx.se/ca/cacert.pem | cert-sync --user /dev/stdin`
### Install as service
1. Download and extract the latest `Jackett.Binaries.Mono.tar.gz` release from the [releases page](https://github.com/Jackett/Jackett/releases).
2. In Terminal, run the install script from the extracted directory using `./install_service_macos.sh`
2. Open the extracted folder and double-click on `install_service_macos`.
3. If the installation was a success, you can close the Terminal window.
The service will start on each logon. You can always stop it by running `launchctl unload ~/Library/LaunchAgents/org.user.Jackett.plist` from Terminal. You can start it again it using `launchctl load ~/Library/LaunchAgents/org.user.Jackett.plist`.
Logs are stored as usual under `~/.config/Jackett/log.txt`.
@@ -294,24 +343,35 @@ Detailed instructions are available at [LinuxServer.io Jackett Docker](https://h
## Installation on Synology
Jackett is available as beta package from [SynoCommunity](https://synocommunity.com/)
## Running Jackett behind a reverse proxy
When running jackett behind a reverse proxy make sure that the original hostname of the request is passed to Jackett. If HTTPS is used also set the X-Forwarded-Proto header to "https". Don't forget to adjust the "Base Path Override" Jackett option accordingly.
Example config for apache:
```
<Location /jackett>
ProxyPreserveHost On
RequestHeader set X-Forwarded-Proto expr=%{REQUEST_SCHEME}
ProxyPass http://127.0.0.1:9117
ProxyPassReverse http://127.0.0.1:9117
</Location>
```
## Troubleshooting
* __Command line switches__
You can pass various options when running via the command line, see --help for details.
* __Unable to connect to trackers with invalid SSL certificates__
* __Error "The underlying connection was closed: Could not establish trust relationship for the SSL/TLS secure channel."__
If you're using mono this is often caused by missing ca-certificates.
This is often caused by missing CA certificates.
Try reimporting the certificates in this case:
- On Linux: `wget -O - https://curl.haxx.se/ca/cacert.pem | cert-sync /dev/stdin`
- On Linux (as user root): `wget -O - https://curl.haxx.se/ca/cacert.pem | cert-sync /dev/stdin`
- On macOS: `curl -sS https://curl.haxx.se/ca/cacert.pem | cert-sync --user /dev/stdin`
As a option of last resort you can disable certificate validation using the `--IgnoreSslErrors true` option but it's not recommended to use it as it enables Man-in-the-middle attacks on your connections.
* __Enable logging__
You can get additional logging with the command line switches `-t -l` or by enabling `Enhanced logging` via the web interface.
You can get additional logging with the command line switches `-t -l` or by enabling `Enhanced logging` via the web interface (followed by clicking on the `Apply Server Settings` button).
Please post logs if you are unable to resolve your issue with these switches ensuring to remove your username/password/cookies.
The logfiles (log.txt/updater.txt) are stored in `%ProgramData%\Jackett` on Windows and `~/.config/Jackett/` on Linux/macOS.
@@ -319,8 +379,7 @@ Jackett is available as beta package from [SynoCommunity](https://synocommunity.
Please supply as much information about the problem you are experiencing as possible. Your issue has a much greater chance of being resolved if logs are supplied so that we can see what is going on. Creating an issue with '### isn't working' doesn't help anyone to fix the problem.
## Contributing
All contributions are welcome just send a pull request. Jackett's framework allows our team (and any other volunteering dev) to implement new trackers in an hour or two. If you'd like support for a new tracker but are not a developer then feel free to leave a request on the [issues page](https://github.com/Jackett/Jackett/issues). It is recommended to use Visual studio 2015 when making code changes in this project.
All contributions are welcome just send a pull request. Jackett's framework allows our team (and any other volunteering dev) to implement new trackers in an hour or two. If you'd like support for a new tracker but are not a developer then feel free to leave a request on the [issues page](https://github.com/Jackett/Jackett/issues). It is recommended to use Visual Studio 2017 when making code changes in this project. You can download the community version for free [here](https://www.visualstudio.com/downloads/).
## Screenshots

39
appveyor.yml Normal file
View File

@@ -0,0 +1,39 @@
version: 0.8.{build}
skip_tags: true
image: Visual Studio 2017
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
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
draft: 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

286
build.cake Normal file
View File

@@ -0,0 +1,286 @@
#tool nuget:?package=NUnit.ConsoleRunner
#addin nuget:?package=Cake.FileHelpers
#addin nuget:?package=Cake.Git
//////////////////////////////////////////////////////////////////////
// ARGUMENTS
//////////////////////////////////////////////////////////////////////
var target = Argument("target", "Default");
var configuration = Argument("configuration", "Release");
//////////////////////////////////////////////////////////////////////
// PREPARATION
//////////////////////////////////////////////////////////////////////
// Define directories.
var workingDir = MakeAbsolute(Directory("./"));
var artifactsDirName = "Artifacts";
var testResultsDirName = "TestResults";
var windowsBuildFullFramework = "./BuildOutput/FullFramework/Windows";
var monoBuildFullFramework = "./BuildOutput/FullFramework/Mono";
//////////////////////////////////////////////////////////////////////
// TASKS
//////////////////////////////////////////////////////////////////////
Task("Info")
.Does(() =>
{
Information(@"Jackett Cake build script starting...");
Information(@"Requires InnoSetup and C:\cygwin to be present for packaging (Pre-installed on AppVeyor)");
Information(@"Working directory is: " + workingDir);
});
Task("Clean")
.IsDependentOn("Info")
.Does(() =>
{
CleanDirectories("./src/**/obj" + configuration);
CleanDirectories("./src/**/bin" + configuration);
CleanDirectories("./BuildOutput");
CleanDirectories("./" + artifactsDirName);
CleanDirectories("./" + testResultsDirName);
Information("Clean completed");
});
Task("Restore-NuGet-Packages")
.IsDependentOn("Clean")
.Does(() =>
{
NuGetRestore("./src/Jackett.sln");
});
Task("Build")
.IsDependentOn("Restore-NuGet-Packages")
.Does(() =>
{
MSBuild("./src/Jackett.sln", settings => settings.SetConfiguration(configuration));
});
Task("Run-Unit-Tests")
.IsDependentOn("Build")
.Does(() =>
{
CreateDirectory("./" + testResultsDirName);
var resultsFile = $"./{testResultsDirName}/JackettTestResult.xml";
NUnit3("./src/**/bin/" + configuration + "/**/*.Test.dll", new NUnit3Settings
{
Results = new[] { new NUnit3Result { FileName = resultsFile } }
});
if(AppVeyor.IsRunningOnAppVeyor)
{
AppVeyor.UploadTestResults(resultsFile, AppVeyorTestResultsType.NUnit3);
}
});
Task("Copy-Files-Full-Framework")
.IsDependentOn("Run-Unit-Tests")
.Does(() =>
{
var windowsOutput = windowsBuildFullFramework + "/Jackett";
CopyDirectory("./src/Jackett.Console/bin/" + configuration, windowsOutput);
CopyFiles("./src/Jackett.Service/bin/" + configuration + "/JackettService.*", windowsOutput);
CopyFiles("./src/Jackett.Tray/bin/" + configuration + "/JackettTray.*", windowsOutput);
CopyFiles("./src/Jackett.Updater/bin/" + configuration + "/JackettUpdater.*", windowsOutput);
CopyFiles("./Upstart.config", windowsOutput);
CopyFiles("./LICENSE", windowsOutput);
CopyFiles("./README.md", windowsOutput);
var monoOutput = monoBuildFullFramework + "/Jackett";
CopyDirectory(windowsBuildFullFramework, monoBuildFullFramework);
DeleteFiles(monoOutput + "/JackettService.*");
DeleteFiles(monoOutput + "/JackettTray.*");
Information("Full framework file copy completed");
});
Task("Check-Packaging-Platform")
.IsDependentOn("Copy-Files-Full-Framework")
.Does(() =>
{
if (IsRunningOnWindows())
{
CreateDirectory("./" + artifactsDirName);
Information("Platform is Windows");
}
else
{
throw new Exception("Packaging is currently only implemented for a Windows environment");
}
});
Task("Package-Windows-Installer-Full-Framework")
.IsDependentOn("Check-Packaging-Platform")
.Does(() =>
{
InnoSetup("./Installer.iss", new InnoSetupSettings {
OutputDirectory = workingDir + "/" + artifactsDirName
});
});
Task("Package-Files-Full-Framework-Windows")
.IsDependentOn("Check-Packaging-Platform")
.Does(() =>
{
Zip(windowsBuildFullFramework, $"./{artifactsDirName}/Jackett.Binaries.Windows.zip");
Information(@"Full Framework Windows Binaries Zipping Completed");
});
Task("Package-Files-Full-Framework-Mono")
.IsDependentOn("Check-Packaging-Platform")
.Does(() =>
{
var cygMonoBuildPath = RelativeWinPathToCygPath(monoBuildFullFramework);
var tarFileName = "Jackett.Binaries.Mono.tar";
var tarArguments = @"-cvf " + cygMonoBuildPath + "/" + tarFileName + " -C " + cygMonoBuildPath + " Jackett --mode ='755'";
var gzipArguments = @"-k " + cygMonoBuildPath + "/" + tarFileName;
RunCygwinCommand("Tar", tarArguments);
RunCygwinCommand("Gzip", gzipArguments);
MoveFile($"{monoBuildFullFramework}/{tarFileName}.gz", $"./{artifactsDirName}/{tarFileName}.gz");
});
Task("Package-Full-Framework")
.IsDependentOn("Package-Windows-Installer-Full-Framework")
.IsDependentOn("Package-Files-Full-Framework-Windows")
.IsDependentOn("Package-Files-Full-Framework-Mono")
.Does(() =>
{
Information("Full Framwork Packaging Completed");
});
Task("Appveyor-Push-Artifacts")
.IsDependentOn("Package-Full-Framework")
.Does(() =>
{
if (AppVeyor.IsRunningOnAppVeyor)
{
foreach (var file in GetFiles(workingDir + $"/{artifactsDirName}/*"))
{
AppVeyor.UploadArtifact(file.FullPath);
}
}
else
{
Information(@"Skipping as not running in AppVeyor Environment");
}
});
Task("Potential-Release-Notes")
.IsDependentOn("Appveyor-Push-Artifacts")
.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);
FileAppendLines(workingDir + "\\BuildOutput\\ReleaseNotes.txt", notesList.ToArray());
}
else
{
Information($"No commit messages found to create release notes");
}
});
private void RunCygwinCommand(string utility, string utilityArguments)
{
var cygwinDir = @"C:\cygwin\bin\";
var utilityProcess = cygwinDir + utility + ".exe";
Information("CygWin Utility: " + utility);
Information("CygWin Directory: " + cygwinDir);
Information("Utility Location: " + utilityProcess);
Information("Utility Arguments: " + utilityArguments);
IEnumerable<string> redirectedStandardOutput;
IEnumerable<string> redirectedErrorOutput;
var exitCodeWithArgument =
StartProcess(
utilityProcess,
new ProcessSettings {
Arguments = utilityArguments,
WorkingDirectory = cygwinDir,
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 RelativeWinPathToCygPath(string relativePath)
{
var cygdriveBase = "/cygdrive/" + workingDir.ToString().Replace(":", "").Replace("\\", "/");
var cygPath = cygdriveBase + relativePath.Replace(".", "");
return cygPath;
}
//////////////////////////////////////////////////////////////////////
// TASK TARGETS
//////////////////////////////////////////////////////////////////////
Task("Default")
.IsDependentOn("Potential-Release-Notes")
.Does(() =>
{
Information("Default Task Completed");
});
//////////////////////////////////////////////////////////////////////
// EXECUTION
//////////////////////////////////////////////////////////////////////
RunTarget(target);

234
build.ps1 Normal file
View File

@@ -0,0 +1,234 @@
##########################################################################
# 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 Experimental
Uses the nightly builds of the Roslyn script engine.
.PARAMETER Mono
Uses the Mono Compiler rather than the Roslyn script engine.
.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]$Experimental,
[switch]$Mono,
[switch]$SkipToolPackageRestore,
[Parameter(Position=0,Mandatory=$false,ValueFromRemainingArguments=$true)]
[string[]]$ScriptArgs
)
[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..."
Remove-Item * -Recurse -Exclude packages.config,nuget.exe
}
Write-Verbose -Message "Restoring tools from NuGet..."
$NuGetOutput = Invoke-Expression "&`"$NUGET_EXE`" install -ExcludeVersion -OutputDirectory `"$TOOLS_DIR`""
if ($LASTEXITCODE -ne 0) {
Throw "An error occured 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 occured 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 occured 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" }
if ($Experimental) { $cakeArguments += "-experimental" }
if ($Mono) { $cakeArguments += "-mono" }
$cakeArguments += $ScriptArgs
# Start Cake
Write-Host "Running build script..."
&$CAKE_EXE $cakeArguments
exit $LASTEXITCODE

View File

@@ -26,12 +26,16 @@ namespace CurlSharp
/// <description>Debug information as a string.</description>
/// </item>
/// <item>
/// <term>size</term>
/// <description>The size in bytes.</description>
/// </item>
/// <item>
/// <term>extraData</term>
/// <description>Client-provided extra data.</description>
/// </item>
/// </list>
/// </remarks>
public delegate void CurlDebugCallback(CurlInfoType infoType, String message, Object extraData);
public delegate void CurlDebugCallback(CurlInfoType infoType, String message, int size, Object extraData);
/// <summary>
/// Called when cURL has header data for the client.

View File

@@ -2,7 +2,7 @@
*
* CurlS#arp
*
* Copyright (c) 2013 Dr. Masroor Ehsan (masroore@gmail.com)
* Copyright (c) 2013-2017 Dr. Masroor Ehsan (masroore@gmail.com)
* Portions copyright (c) 2004, 2005 Jeff Phillips (jeff@jeffp.net)
*
* This software is licensed as described in the file LICENSE, which you
@@ -72,7 +72,7 @@ namespace CurlSharp
/// </returns>
public static CurlCode GlobalInit(CurlInitFlag flags)
{
_initCode = NativeMethods.curl_global_init((int)flags);
_initCode = NativeMethods.curl_global_init((int) flags);
#if USE_LIBCURLSHIM
if (_initCode == CurlCode.Ok)
NativeMethods.curl_shim_initialize();
@@ -99,48 +99,6 @@ namespace CurlSharp
}
}
/// <summary>
/// URL encode a String.
/// </summary>
/// <param name="url">The string to URL encode.</param>
/// <param name="length">
/// Input string length;
/// use 0 for cURL to determine.
/// </param>
/// <returns>A new URL encoded string.</returns>
/// <exception cref="System.InvalidOperationException">
/// Thrown if cURL isn't properly initialized.
/// </exception>
public static string Escape(string url, int length)
{
EnsureCurl();
var p = NativeMethods.curl_escape(url, length);
var s = Marshal.PtrToStringAnsi(p);
NativeMethods.curl_free(p);
return s;
}
/// <summary>
/// URL decode a String.
/// </summary>
/// <param name="url">The string to URL decode.</param>
/// <param name="length">
/// Input string length;
/// use 0 for cURL to determine.
/// </param>
/// <returns>A new URL decoded string.</returns>
/// <exception cref="System.InvalidOperationException">
/// Thrown if cURL isn't properly initialized.
/// </exception>
public static string Unescape(string url, int length)
{
EnsureCurl();
var p = NativeMethods.curl_unescape(url, length);
var s = Marshal.PtrToStringAnsi(p);
NativeMethods.curl_free(p);
return s;
}
/// <summary>
/// Get a <see cref="CurlVersionInfoData" /> object.
/// </summary>

View File

@@ -2,7 +2,7 @@
*
* CurlS#arp
*
* Copyright (c) 2014 Dr. Masroor Ehsan (masroore@gmail.com)
* Copyright (c) 2013-2017 Dr. Masroor Ehsan (masroore@gmail.com)
* Portions copyright (c) 2004, 2005 Jeff Phillips (jeff@jeffp.net)
*
* This software is licensed as described in the file LICENSE, which you
@@ -56,7 +56,7 @@ namespace CurlSharp
private bool _cookieSession;
private CurlShare _curlShare;
private string _customRequest;
private Object _debugData;
private object _debugData;
private int _dnsCacheTimeout;
private bool _dnsUseGlobalCache;
private string _egdSocket;
@@ -79,7 +79,7 @@ namespace CurlSharp
private bool _ftpUseEprt;
private bool _ftpUseEpsv;
private GCHandle _hThis;
private Object _headerData;
private object _headerData;
private CurlHttpAuth _httpAuth;
private bool _httpGet;
private CurlHttpMultiPartForm _httpMultiPartForm;
@@ -88,10 +88,8 @@ namespace CurlSharp
private bool _ignoreContentLength;
private long _infileSize;
private string _interface;
private Object _ioctlData;
private object _ioctlData;
private string _krb4Level;
private CurlCode _lastErrorCode;
private string _lastErrorDescription;
private int _lowSpeedLimit;
private int _lowSpeedTime;
private int _maxConnects;
@@ -118,6 +116,7 @@ namespace CurlSharp
private NativeMethods._CurlDebugCallback _pcbDebug;
private NativeMethods._CurlIoctlCallback _pcbIoctl;
private NativeMethods._CurlProgressCallback _pcbProgress;
private NativeMethods._CurlSslCtxCallback _pcbSslCtx;
#endif
private CurlDebugCallback _pfCurlDebug;
private CurlHeaderCallback _pfCurlHeader;
@@ -130,27 +129,27 @@ namespace CurlSharp
private bool _post;
private int _postFieldSize;
private string _postFields;
private Object _privateData;
private Object _progressData;
private object _progressData;
private string _proxy;
private int _proxyPort;
private string _proxyUserPwd;
private bool _put;
private string _randomFile;
private string _range;
private Object _readData;
private object _readData;
private string _referer;
private int _resumeFrom;
private string _sourceUrl;
private string _sslCert;
private string _sslCertPasswd;
private string _sslCipherList;
private Object _sslContextData;
private object _sslContextData;
private string _sslEngine;
private bool _sslEngineDefault;
private string _sslKey;
private string _sslKeyPasswd;
private bool _sslVerifyPeer;
private bool _sslVerifyHost;
private bool _tcpNoDelay;
private int _timeValue;
private int _timeout;
@@ -161,7 +160,7 @@ namespace CurlSharp
private string _userAgent;
private string _userPwd;
private bool _verbose;
private Object _writeData;
private object _writeData;
private string _writeInfo;
/// <summary>
@@ -180,6 +179,7 @@ namespace CurlSharp
Curl.EnsureCurl();
_pCurl = NativeMethods.curl_easy_init();
ensureHandle();
NativeMethods.curl_easy_setopt(_pCurl, CurlOption.NoSignal, 1L);
NativeMethods.curl_easy_setopt(_pCurl, CurlOption.NoProgress, IntPtr.Zero);
#if USE_LIBCURLSHIM
_pMyStrings = NativeMethods.curl_shim_alloc_strings();
@@ -199,11 +199,7 @@ namespace CurlSharp
installDelegates();
}
public object Private
{
get { return _privateData; }
set { _privateData = value; }
}
public object Private { get; set; }
public object WriteData
{
@@ -227,6 +223,8 @@ namespace CurlSharp
/// <returns></returns>
private CurlCode setWriteData(object data)
{
freeHandle(ref _curlWriteData);
_curlWriteData = getHandle(data);
return setCurlOpt(_curlWriteData, CurlOption.WriteData);
}
@@ -292,6 +290,18 @@ namespace CurlSharp
return setCurlOpt(_curlDebugData, CurlOption.DebugData);
}
private IntPtr _curlSslCtxData = IntPtr.Zero;
/// <summary>
/// Object to pass to OnSslCtxCallback.
/// </summary>
/// <param name="data"></param>
/// <returns></returns>
private CurlCode setSslCtxData(object data)
{
_curlSslCtxData = getHandle(data);
return setCurlOpt(_curlSslCtxData, CurlOption.SslCtxData);
}
private IntPtr _curlIoctlData = IntPtr.Zero;
@@ -355,6 +365,17 @@ namespace CurlSharp
}
}
public object SslCtxData
{
get { return _sslContextData; }
set
{
_sslContextData = value;
#if !USE_LIBCURLSHIM
setSslCtxData(value);
#endif
}
}
public object IoctlData
{
@@ -426,7 +447,7 @@ namespace CurlSharp
_ftpAuth = value;
var l = Convert.ToInt32(value);
setLastError(NativeMethods.curl_easy_setopt(_pCurl, CurlOption.FtpSslAuth, (IntPtr) l),
CurlOption.FtpSslAuth);
CurlOption.FtpSslAuth);
}
}
@@ -438,7 +459,7 @@ namespace CurlSharp
_httpVersion = value;
var l = Convert.ToInt32(value);
setLastError(NativeMethods.curl_easy_setopt(_pCurl, CurlOption.HttpVersion, (IntPtr) l),
CurlOption.HttpVersion);
CurlOption.HttpVersion);
}
}
@@ -450,7 +471,7 @@ namespace CurlSharp
_httpAuth = value;
var l = Convert.ToInt32(value);
setLastError(NativeMethods.curl_easy_setopt(_pCurl, CurlOption.HttpAuth, (IntPtr) l),
CurlOption.HttpAuth);
CurlOption.HttpAuth);
}
}
@@ -462,7 +483,7 @@ namespace CurlSharp
_ftpSsl = value;
var l = Convert.ToInt32(value);
setLastError(NativeMethods.curl_easy_setopt(_pCurl, CurlOption.FtpSsl, (IntPtr) l),
CurlOption.FtpSsl);
CurlOption.FtpSsl);
}
}
@@ -474,7 +495,7 @@ namespace CurlSharp
_closePolicy = value;
var l = Convert.ToInt32(value);
setLastError(NativeMethods.curl_easy_setopt(_pCurl, CurlOption.ClosePolicy, (IntPtr) l),
CurlOption.ClosePolicy);
CurlOption.ClosePolicy);
}
}
@@ -514,12 +535,14 @@ namespace CurlSharp
set { setFunctionOptions(CurlOption.IoctlFunction, value); }
}
public string LastErrorDescription
public CurlSslContextCallback SslContextFunction
{
get { return _lastErrorDescription; }
get { return _pfCurlSslContext; }
set { setFunctionOptions(CurlOption.SslCtxFunction, value); }
}
public string LastErrorDescription { get; private set; }
public bool NoProgress
{
get { return _noProgress; }
@@ -592,6 +615,12 @@ namespace CurlSharp
set { setBoolOption(CurlOption.SslVerifyPeer, ref _sslVerifyPeer, value); }
}
public bool SslVerifyhost
{
get { return _sslVerifyHost; }
set { setBoolOption(CurlOption.SslVerifyhost, ref _sslVerifyHost, value); }
}
public bool FreshConnect
{
get { return _freshConnect; }
@@ -1106,10 +1135,7 @@ namespace CurlSharp
get { return getSlistInfo(CurlInfo.SslEngines); }
}
public CurlCode LastErrorCode
{
get { return _lastErrorCode; }
}
public CurlCode LastErrorCode { get; private set; }
/// <summary>
/// Cleanup unmanaged resources.
@@ -1122,7 +1148,7 @@ namespace CurlSharp
private void resetPrivateVariables()
{
_privateData = null;
Private = null;
_pfCurlWrite = null;
_writeData = null;
@@ -1179,10 +1205,10 @@ namespace CurlSharp
/// </summary>
private void setLastError(CurlCode code, CurlOption opt)
{
if (LastErrorCode == CurlCode.Ok && code != CurlCode.Ok)
if ((LastErrorCode == CurlCode.Ok) && (code != CurlCode.Ok))
{
_lastErrorCode = code;
_lastErrorDescription = string.Format("Error: {0} setting option {1}", StrError(code), opt);
LastErrorCode = code;
LastErrorDescription = string.Format("Error: {0} setting option {1}", StrError(code), opt);
}
}
@@ -1191,10 +1217,10 @@ namespace CurlSharp
/// </summary>
private void setLastError(CurlCode code, CurlInfo info)
{
if (LastErrorCode == CurlCode.Ok && code != CurlCode.Ok)
if ((LastErrorCode == CurlCode.Ok) && (code != CurlCode.Ok))
{
_lastErrorCode = code;
_lastErrorDescription = string.Format("Error: {0} getting info {1}", StrError(code), info);
LastErrorCode = code;
LastErrorDescription = string.Format("Error: {0} getting info {1}", StrError(code), info);
}
}
@@ -1233,6 +1259,7 @@ namespace CurlSharp
freeHandle(ref _curlProgressData);
freeHandle(ref _curlHeaderData);
freeHandle(ref _curlIoctlData);
freeHandle(ref _curlSslCtxData);
#endif
NativeMethods.curl_easy_cleanup(_pCurl);
@@ -1293,6 +1320,12 @@ namespace CurlSharp
private void setStringOption(CurlOption option, out string field, string value)
{
// all string options are copied by the library, the only exception to this rule is PostFields option
if (option == CurlOption.PostFields)
option = CurlOption.CopyPostFields;
if ((option == CurlOption.CopyPostFields) && (PostFieldSize == 0))
PostFieldSize = System.Text.Encoding.UTF8.GetByteCount(value);
setStringOption(option, value);
field = value;
}
@@ -1313,7 +1346,13 @@ namespace CurlSharp
#else
// convert the string to a null-terminated one
var buffer = System.Text.Encoding.UTF8.GetBytes(value + "\0");
setLastError(NativeMethods.curl_easy_setopt(_pCurl, option, buffer), option);
unsafe
{
fixed (byte* bufPtr = &buffer[0])
{
setLastError(NativeMethods.curl_easy_setopt(_pCurl, option, buffer), option);
}
}
#endif
}
}
@@ -1337,7 +1376,7 @@ namespace CurlSharp
/// <see cref="CurlCode.BadFunctionArgument" />
/// will be returned if the type of value of <c>parameter</c> is invalid.
/// </returns>
public CurlCode SetOpt(CurlOption option, Object parameter)
public CurlCode SetOpt(CurlOption option, object parameter)
{
ensureHandle();
var retCode = CurlCode.Ok;
@@ -1346,10 +1385,8 @@ namespace CurlSharp
if ((int) option < CURLOPTTYPE_OBJECTPOINT)
{
var i = 0;
if (option == CurlOption.DnsUseGlobalCache || option == CurlOption.SourcePort)
{
if ((option == CurlOption.DnsUseGlobalCache) || (option == CurlOption.SourcePort))
return CurlCode.BadFunctionArgument;
}
if (option == CurlOption.TimeValue)
{
@@ -1365,17 +1402,17 @@ namespace CurlSharp
retCode = NativeMethods.curl_easy_setopt(_pCurl, option, (IntPtr) i);
}
// object cases: the majority
// object cases: the majority
else if ((int) option < CURLOPTTYPE_FUNCTIONPOINT)
{
return setObjectOptions(option, parameter);
}
// FUNCTIONPOINT args, for delegates
// FUNCTIONPOINT args, for delegates
else if ((int) option < CURLOPTTYPE_OFF_T)
{
return setFunctionOptions(option, parameter);
}
// otherwise, it's one of those 64-bit off_t guys!
// otherwise, it's one of those 64-bit off_t guys!
else
{
var i = Convert.ToInt64(parameter);
@@ -1390,9 +1427,9 @@ namespace CurlSharp
var retCode = CurlCode.Ok;
switch (option)
{
// various data items
// various data items
case CurlOption.Private:
_privateData = parameter;
Private = parameter;
break;
case CurlOption.WriteData:
_writeData = parameter;
@@ -1409,12 +1446,15 @@ namespace CurlSharp
case CurlOption.HeaderData:
_headerData = parameter;
break;
case CurlOption.SslCtxData:
_sslContextData = parameter;
break;
case CurlOption.IoctlData:
_ioctlData = parameter;
break;
// items that can't be set externally or
// obsolete items
// items that can't be set externally or
// obsolete items
case CurlOption.ErrorBuffer:
case CurlOption.Stderr:
case CurlOption.SourceHost:
@@ -1422,7 +1462,7 @@ namespace CurlSharp
case CurlOption.PasvHost:
return CurlCode.BadFunctionArgument;
// singular case for share
// singular case for share
case CurlOption.Share:
{
_curlShare = parameter as CurlShare;
@@ -1430,7 +1470,7 @@ namespace CurlSharp
break;
}
// multipart HTTP post
// multipart HTTP post
case CurlOption.HttpPost:
{
_httpMultiPartForm = parameter as CurlHttpMultiPartForm;
@@ -1438,7 +1478,7 @@ namespace CurlSharp
break;
}
// items curl wants as a curl_slist
// items curl wants as a curl_slist
case CurlOption.HttpHeader:
case CurlOption.Prequote:
case CurlOption.Quote:
@@ -1452,12 +1492,12 @@ namespace CurlSharp
break;
}
// string items
// string items
default:
{
var s = parameter as string;
setStringOption(option, s);
retCode = _lastErrorCode;
retCode = LastErrorCode;
break;
}
}
@@ -1560,6 +1600,14 @@ namespace CurlSharp
break;
}
case CurlOption.SslCtxFunction:
{
var sf = pfn as CurlSslContextCallback;
if (sf == null)
return CurlCode.BadFunctionArgument;
_pfCurlSslContext = sf;
break;
}
case CurlOption.IoctlFunction:
{
@@ -1590,7 +1638,13 @@ namespace CurlSharp
public CurlCode Perform()
{
ensureHandle();
return NativeMethods.curl_easy_perform(_pCurl);
var nativeRet = NativeMethods.curl_easy_perform(_pCurl);
#if !USE_LIBCURLSHIM
freeHandle(ref _curlWriteData);
#endif
return nativeRet;
}
/// <summary>
@@ -1606,12 +1660,60 @@ namespace CurlSharp
return new CurlEasy(this);
}
/// <summary>
/// URL encode a String.
/// </summary>
/// <param name="url">The string to URL encode.</param>
/// <param name="length">
/// Input string length;
/// use 0 for cURL to determine.
/// </param>
/// <returns>A new URL encoded string.</returns>
/// <exception cref="NullReferenceException">
/// This is thrown if
/// the native <c>CURL*</c> handle wasn't created successfully.
/// </exception>
public string Escape(string url)
{
ensureHandle();
var length = System.Text.Encoding.ASCII.GetBytes(url).Length;
var p = NativeMethods.curl_easy_escape(_pCurl, url, length);
var s = Marshal.PtrToStringAnsi(p);
NativeMethods.curl_free(p);
return s;
}
/// <summary>
/// URL decode a String.
/// </summary>
/// <param name="url">The string to URL decode.</param>
/// <param name="length">
/// Input string length;
/// use 0 for cURL to determine.
/// </param>
/// <returns>A new URL decoded string.</returns>
/// <exception cref="NullReferenceException">
/// This is thrown if
/// the native <c>CURL*</c> handle wasn't created successfully.
/// </exception>
public string Unescape(string url)
{
ensureHandle();
var length = System.Text.Encoding.ASCII.GetBytes(url).Length;
var p = NativeMethods.curl_easy_unescape(_pCurl, url, length, out int outLength);
var s = Marshal.PtrToStringAnsi(p, outLength);
NativeMethods.curl_free(p);
return s;
}
/// <summary>
/// Get a string description of an error code.
/// </summary>
/// <param name="code">Error code.</param>
/// <returns>String description of the error code.</returns>
public String StrError(CurlCode code)
public string StrError(CurlCode code)
{
return Marshal.PtrToStringAnsi(NativeMethods.curl_easy_strerror(code));
}
@@ -1635,7 +1737,7 @@ namespace CurlSharp
/// This is thrown if
/// the native <c>CURL*</c> handle wasn't created successfully.
/// </exception>
public CurlCode GetInfo(CurlInfo info, ref Object objInfo)
public CurlCode GetInfo(CurlInfo info, ref object objInfo)
{
ensureHandle();
var retCode = CurlCode.Ok;
@@ -1651,7 +1753,7 @@ namespace CurlSharp
// private data
if (info == CurlInfo.Private)
{
objInfo = _privateData;
objInfo = Private;
return retCode;
}
@@ -1681,7 +1783,7 @@ namespace CurlSharp
{
ensureHandle();
// ensure it's an integral type
if ((int) info < CURLINFO_LONG || (int) info >= CURLINFO_DOUBLE)
if (((int) info < CURLINFO_LONG) || ((int) info >= CURLINFO_DOUBLE))
{
setLastError(CurlCode.BadFunctionArgument, info);
return -1;
@@ -1779,7 +1881,7 @@ namespace CurlSharp
var retCode = CurlCode.Ok;
var ptr = IntPtr.Zero;
if ((int) info < CURLINFO_STRING || (int) info >= CURLINFO_LONG)
if (((int) info < CURLINFO_STRING) || ((int) info >= CURLINFO_LONG))
return CurlCode.BadFunctionArgument;
retCode = NativeMethods.curl_easy_getinfo(_pCurl, info, ref ptr);
if (retCode == CurlCode.Ok)
@@ -1839,7 +1941,7 @@ namespace CurlSharp
var ptr = IntPtr.Zero;
// ensure it's an integral type
if ((int) info < CURLINFO_LONG || (int) info >= CURLINFO_DOUBLE)
if (((int) info < CURLINFO_LONG) || ((int) info >= CURLINFO_DOUBLE))
return CurlCode.BadFunctionArgument;
retCode = NativeMethods.curl_easy_getinfo(_pCurl, info, ref ptr);
@@ -1876,10 +1978,8 @@ namespace CurlSharp
retCode = NativeMethods.curl_easy_getinfo(_pCurl, info, ref ptr);
if (retCode == CurlCode.Ok)
{
if ((int) ptr < 0)
dt = new DateTime(0);
}
return retCode;
}
@@ -1908,34 +2008,38 @@ namespace CurlSharp
_pcbProgress = _curlProgressCallback;
_pcbDebug = _curlDebugCallback;
_pcbHeader = _curlHeaderCallback;
_pcbSslCtx = _curlSslCtxCallback;
_pcbIoctl = _curlIoctlCallback;
setLastError(NativeMethods.curl_easy_setopt_cb(_pCurl, CurlOption.WriteFunction, _pcbWrite),
CurlOption.WriteFunction);
setLastError(NativeMethods.curl_easy_setopt_cb(_pCurl, CurlOption.ReadFunction, _pcbRead),
CurlOption.ReadFunction);
setLastError(NativeMethods.curl_easy_setopt_cb(_pCurl, CurlOption.ProgressFunction, _pcbProgress),
CurlOption.ProgressFunction);
setLastError(NativeMethods.curl_easy_setopt_cb(_pCurl, CurlOption.HeaderFunction, _pcbHeader),
CurlOption.HeaderFunction);
setLastError(NativeMethods.curl_easy_setopt_cb(_pCurl, CurlOption.DebugFunction, _pcbDebug),
CurlOption.DebugFunction);
setLastError(NativeMethods.curl_easy_setopt_cb(_pCurl, CurlOption.IoctlFunction, _pcbIoctl),
CurlOption.IoctlFunction);
setLastError(NativeMethods.curl_easy_setopt(_pCurl, CurlOption.WriteFunction, _pcbWrite),
CurlOption.WriteFunction);
setLastError(NativeMethods.curl_easy_setopt(_pCurl, CurlOption.ReadFunction, _pcbRead),
CurlOption.ReadFunction);
setLastError(NativeMethods.curl_easy_setopt(_pCurl, CurlOption.ProgressFunction, _pcbProgress),
CurlOption.ProgressFunction);
setLastError(NativeMethods.curl_easy_setopt(_pCurl, CurlOption.HeaderFunction, _pcbHeader),
CurlOption.HeaderFunction);
setLastError(NativeMethods.curl_easy_setopt(_pCurl, CurlOption.DebugFunction, _pcbDebug),
CurlOption.DebugFunction);
setLastError(NativeMethods.curl_easy_setopt(_pCurl, CurlOption.SslCtxFunction, _pcbSslCtx),
CurlOption.SslCtxFunction);
setLastError(NativeMethods.curl_easy_setopt(_pCurl, CurlOption.IoctlFunction, _pcbIoctl),
CurlOption.IoctlFunction);
setLastError(NativeMethods.curl_easy_setopt(_pCurl, CurlOption.NoProgress, (IntPtr) 0),
CurlOption.NoProgress);
CurlOption.NoProgress);
setWriteData(null);
setReadData(null);
setHeaderData(null);
setProgressData(null);
setDebugData(null);
setSslCtxData(null);
setIoctlData(null);
#endif
}
#if USE_LIBCURLSHIM
// called by libcurlshim
// called by libcurlshim
private static int _shimWriteCallback(IntPtr buf, int sz, int nmemb, IntPtr parm)
{
var bytes = sz*nmemb;
@@ -1958,9 +2062,7 @@ namespace CurlSharp
var b = new byte[bytes];
var gch = (GCHandle) parm;
var curlEasy = (CurlEasy) gch.Target;
if (curlEasy == null)
return 0;
if (curlEasy._pfCurlRead == null)
if (curlEasy?._pfCurlRead == null)
return 0;
var nRead = curlEasy._pfCurlRead(b, sz, nmemb, curlEasy._readData);
if (nRead > 0)
@@ -1976,9 +2078,7 @@ namespace CurlSharp
{
var gch = (GCHandle) parm;
var curlEasy = (CurlEasy) gch.Target;
if (curlEasy == null)
return 0;
if (curlEasy._pfCurlProgress == null)
if (curlEasy?._pfCurlProgress == null)
return 0;
var nprog = curlEasy._pfCurlProgress(curlEasy._progressData, dlTotal, dlNow, ulTotal, ulNow);
return nprog;
@@ -1989,12 +2089,10 @@ namespace CurlSharp
{
var gch = (GCHandle) parm;
var curlEasy = (CurlEasy) gch.Target;
if (curlEasy == null)
return 0;
if (curlEasy._pfCurlDebug == null)
if (curlEasy?._pfCurlDebug == null)
return 0;
var message = Marshal.PtrToStringAnsi(msgBuf, msgBufSize);
curlEasy._pfCurlDebug(infoType, message, curlEasy._debugData);
curlEasy._pfCurlDebug(infoType, message, msgBufSize, curlEasy._debugData);
return 0;
}
@@ -2079,7 +2177,7 @@ namespace CurlSharp
if (_pfCurlDebug != null)
{
var userdata = getObject(pUserData);
_pfCurlDebug(infoType, message, userdata);
_pfCurlDebug(infoType, message, size, userdata);
}
return 0;
}
@@ -2107,7 +2205,7 @@ namespace CurlSharp
private CurlIoError _curlIoctlCallback(CurlIoCommand cmd, IntPtr parm)
{
if (_pfCurlIoctl == null || _ioctlData == null)
if ((_pfCurlIoctl == null) || (_ioctlData == null))
return CurlIoError.UnknownCommand;
return _pfCurlIoctl(cmd, _ioctlData);
}

View File

@@ -2,7 +2,7 @@
*
* CurlS#arp
*
* Copyright (c) 2014 Dr. Masroor Ehsan (masroore@gmail.com)
* Copyright (c) 2013-2017 Dr. Masroor Ehsan (masroore@gmail.com)
* Portions copyright (c) 2004, 2005 Jeff Phillips (jeff@jeffp.net)
*
* This software is licensed as described in the file LICENSE, which you
@@ -31,7 +31,7 @@ namespace CurlSharp
public CurlFormOption Option;
/// <summary>Value for the option.</summary>
public Object Value;
public object Value;
}
/// <summary>
@@ -77,10 +77,7 @@ namespace CurlSharp
}
// for CurlEasy.SetOpt()
internal IntPtr GetHandle()
{
return _pItems[0];
}
internal IntPtr GetHandle() => _pItems[0];
/// <summary>
/// Add a multi-part form section.
@@ -186,7 +183,7 @@ namespace CurlSharp
var formArrayPos = 0;
var argArrayPos = 0;
var ptrArrayPos = 0;
Object obj = null;
object obj = null;
while ((retCode == CurlFormCode.Ok) &&
(ptrArrayPos < nRealCount))
@@ -207,14 +204,14 @@ namespace CurlSharp
{
iCode = (CurlFormOption) Convert.ToInt32(
args.GetValue(argArrayPos++));
obj = (iCode == CurlFormOption.End)
obj = iCode == CurlFormOption.End
? null
: args.GetValue(argArrayPos++);
}
switch (iCode)
{
// handle byte-array pointer-related items
// handle byte-array pointer-related items
case CurlFormOption.PtrName:
case CurlFormOption.PtrContents:
case CurlFormOption.BufferPtr:
@@ -240,7 +237,7 @@ namespace CurlSharp
break;
}
// length values
// length values
case CurlFormOption.NameLength:
case CurlFormOption.ContentsLength:
case CurlFormOption.BufferLength:
@@ -249,7 +246,7 @@ namespace CurlSharp
Convert.ToInt32(obj);
break;
// strings
// strings
case CurlFormOption.CopyName:
case CurlFormOption.CopyContents:
case CurlFormOption.FileContent:
@@ -259,7 +256,7 @@ namespace CurlSharp
case CurlFormOption.Buffer:
{
aPointers[ptrArrayPos++] = (IntPtr) iCode;
var s = obj as String;
var s = obj as string;
if (s == null)
retCode = CurlFormCode.UnknownOption;
else
@@ -273,7 +270,7 @@ namespace CurlSharp
break;
}
// array case: already handled
// array case: already handled
case CurlFormOption.Array:
if (aForms != null)
retCode = CurlFormCode.IllegalArray;
@@ -285,7 +282,7 @@ namespace CurlSharp
}
break;
// slist
// slist
case CurlFormOption.ContentHeader:
{
aPointers[ptrArrayPos++] = (IntPtr) iCode;
@@ -297,12 +294,12 @@ namespace CurlSharp
break;
}
// erroneous stuff
// erroneous stuff
case CurlFormOption.Nothing:
retCode = CurlFormCode.Incomplete;
break;
// end
// end
case CurlFormOption.End:
if (aForms != null) // end of form
{
@@ -313,7 +310,7 @@ namespace CurlSharp
aPointers[ptrArrayPos++] = (IntPtr) iCode;
break;
// default is unknown
// default is unknown
default:
retCode = CurlFormCode.UnknownOption;
break;
@@ -331,9 +328,9 @@ namespace CurlSharp
retCode = (CurlFormCode) NativeMethods.curl_shim_formadd(_pItems, aPointers, nRealCount);
#else
retCode = (CurlFormCode) NativeMethods.curl_formadd(ref _pItems[0], ref _pItems[1],
(int) aPointers[0], aPointers[1],
(int) aPointers[2], aPointers[3],
(int) aPointers[4]);
(int) aPointers[0], aPointers[1],
(int) aPointers[2], aPointers[3],
(int) aPointers[4]);
#endif
}
@@ -350,7 +347,7 @@ namespace CurlSharp
case CurlFormOption.ContentType:
case CurlFormOption.Filename:
case CurlFormOption.Buffer:
// byte buffer cases
// byte buffer cases
case CurlFormOption.PtrName:
case CurlFormOption.PtrContents:
case CurlFormOption.BufferPtr:

View File

@@ -2,7 +2,7 @@
*
* CurlS#arp
*
* Copyright (c) 2014 Dr. Masroor Ehsan (masroore@gmail.com)
* Copyright (c) 2013-2017 Dr. Masroor Ehsan (masroore@gmail.com)
* Portions copyright (c) 2004, 2005 Jeff Phillips (jeff@jeffp.net)
*
* This software is licensed as described in the file LICENSE, which you
@@ -39,6 +39,7 @@ namespace CurlSharp
private NativeMethods.fd_set _fd_read, _fd_write, _fd_except;
#endif
private IntPtr _pMulti;
private CurlPipelining _pipelining;
/// <summary>
/// Constructor
@@ -74,10 +75,7 @@ namespace CurlSharp
/// <summary>
/// Max file descriptor
/// </summary>
public int MaxFd
{
get { return _maxFd; }
}
public int MaxFd => _maxFd;
/// <summary>
/// Cleanup unmanaged resources.
@@ -149,6 +147,17 @@ namespace CurlSharp
return NativeMethods.curl_multi_add_handle(_pMulti, p);
}
public CurlPipelining Pipelining
{
get { return _pipelining; }
set
{
ensureHandle();
_pipelining = value;
NativeMethods.curl_multi_setopt(_pMulti, CurlMultiOption.Pipelining, (long) value);
}
}
/// <summary>
/// Remove an CurlEasy object.
/// </summary>
@@ -178,10 +187,7 @@ namespace CurlSharp
/// string description.
/// </param>
/// <returns>The string description.</returns>
public String StrError(CurlMultiCode errorNum)
{
return Marshal.PtrToStringAnsi(NativeMethods.curl_multi_strerror(errorNum));
}
public string StrError(CurlMultiCode errorNum) => Marshal.PtrToStringAnsi(NativeMethods.curl_multi_strerror(errorNum));
/// <summary>
/// Read/write data to/from each CurlEasy object.
@@ -269,8 +275,6 @@ namespace CurlSharp
if (_bGotMultiInfo)
return _multiInfo;
_bGotMultiInfo = true;
#if USE_LIBCURLSHIM
var nMsgs = 0;
var pInfo = NativeMethods.curl_shim_multi_info_read(_pMulti, ref nMsgs);
@@ -286,17 +290,14 @@ namespace CurlSharp
}
NativeMethods.curl_shim_multi_info_free(pInfo);
}
return _multiInfo;
_bGotMultiInfo = true;
#else
throw new NotImplementedException(
"Sorry, CurlMulti.InfoRead is not implemented on this system."
);
_multiInfo = null;
throw new NotImplementedException("CurlMulti.InfoRead()");
#endif
#pragma warning disable CS0162 // Unreachable code detected when not compiling with the shim
return _multiInfo;
#pragma warning restore CS0162 // Unreachable code detected when not compiling with the shim
}
}
}
}

View File

@@ -2,7 +2,7 @@
*
* CurlS#arp
*
* Copyright (c) 2013 Dr. Masroor Ehsan (masroore@gmail.com)
* Copyright (c) 2013-2017 Dr. Masroor Ehsan (masroore@gmail.com)
* Portions copyright (c) 2004, 2005 Jeff Phillips (jeff@jeffp.net)
*
* This software is licensed as described in the file LICENSE, which you
@@ -26,40 +26,28 @@ namespace CurlSharp
public sealed class CurlMultiInfo
{
// private members
private readonly CurlEasy _mCurlEasy;
private readonly CurlMessage _msg;
private readonly CurlCode _result;
internal CurlMultiInfo(CurlMessage msg, CurlEasy curlEasy, CurlCode result)
{
_msg = msg;
_mCurlEasy = curlEasy;
_result = result;
Msg = msg;
CurlEasyHandle = curlEasy;
Result = result;
}
/// <summary>
/// Get the status code from the <see cref="CurlMessage" /> enumeration.
/// </summary>
public CurlMessage Msg
{
get { return _msg; }
}
public CurlMessage Msg { get; }
/// <summary>
/// Get the <see cref="CurlEasy" /> object for this child.
/// </summary>
public CurlEasy CurlEasyHandle
{
get { return _mCurlEasy; }
}
public CurlEasy CurlEasyHandle { get; }
/// <summary>
/// Get the return code for the transfer, as a
/// <see cref="CurlCode" />.
/// </summary>
public CurlCode Result
{
get { return _result; }
}
public CurlCode Result { get; }
}
}

View File

@@ -31,17 +31,12 @@ namespace CurlSharp
{
// private members
private GCHandle _hThis; // for handle extraction
private CurlShareCode _lastErrorCode;
private string _lastErrorDescription;
#if USE_LIBCURLSHIM
private NativeMethods._ShimLockCallback _pDelLock; // lock delegate
private NativeMethods._ShimUnlockCallback _pDelUnlock; // unlock delegate
#endif
private IntPtr _pShare; // share handle
private CurlShareLockCallback _pfLock; // client lock delegate
private CurlShareUnlockCallback _pfUnlock; // client unlock delegate
private IntPtr _ptrThis; // numeric handle
private Object _userData; // user data for delegates
/// <summary>
/// Constructor
@@ -65,23 +60,11 @@ namespace CurlSharp
installDelegates();
}
public object UserData
{
get { return _userData; }
set { _userData = value; }
}
public object UserData { get; set; }
public CurlShareUnlockCallback UnlockFunction
{
get { return _pfUnlock; }
set { _pfUnlock = value; }
}
public CurlShareUnlockCallback UnlockFunction { get; set; }
public CurlShareLockCallback LockFunction
{
get { return _pfLock; }
set { _pfLock = value; }
}
public CurlShareLockCallback LockFunction { get; set; }
public CurlLockData Share
{
@@ -93,15 +76,9 @@ namespace CurlSharp
set { setShareOption(CurlShareOption.Unshare, value); }
}
public CurlShareCode LastErrorCode
{
get { return _lastErrorCode; }
}
public CurlShareCode LastErrorCode { get; private set; }
public string LastErrorDescription
{
get { return _lastErrorDescription; }
}
public string LastErrorDescription { get; private set; }
/// <summary>
/// Cleanup unmanaged resources.
@@ -140,7 +117,7 @@ namespace CurlSharp
/// This is thrown if
/// the native <c>share</c> handle wasn't created successfully.
/// </exception>
public CurlShareCode SetOpt(CurlShareOption option, Object parameter)
public CurlShareCode SetOpt(CurlShareOption option, object parameter)
{
EnsureHandle();
var retCode = CurlShareCode.Ok;
@@ -151,14 +128,14 @@ namespace CurlSharp
var lf = parameter as CurlShareLockCallback;
if (lf == null)
return CurlShareCode.BadOption;
_pfLock = lf;
LockFunction = lf;
break;
case CurlShareOption.UnlockFunction:
var ulf = parameter as CurlShareUnlockCallback;
if (ulf == null)
return CurlShareCode.BadOption;
_pfUnlock = ulf;
UnlockFunction = ulf;
break;
case CurlShareOption.Share:
@@ -170,7 +147,7 @@ namespace CurlSharp
}
case CurlShareOption.UserData:
_userData = parameter;
UserData = parameter;
break;
default:
@@ -182,10 +159,10 @@ namespace CurlSharp
private void setLastError(CurlShareCode code, CurlShareOption opt)
{
if (_lastErrorCode == CurlShareCode.Ok && code != CurlShareCode.Ok)
if ((LastErrorCode == CurlShareCode.Ok) && (code != CurlShareCode.Ok))
{
_lastErrorCode = code;
_lastErrorDescription = string.Format("Error: {0} setting option {1}", StrError(code), opt);
LastErrorCode = code;
LastErrorDescription = $"Error: {StrError(code)} setting option {opt}";
}
}
@@ -206,10 +183,8 @@ namespace CurlSharp
/// string description.
/// </param>
/// <returns>The string description.</returns>
public String StrError(CurlShareCode errorNum)
{
return Marshal.PtrToStringAnsi(NativeMethods.curl_share_strerror(errorNum));
}
public string StrError(CurlShareCode errorNum)
=> Marshal.PtrToStringAnsi(NativeMethods.curl_share_strerror(errorNum));
private void Dispose(bool disposing)
{
@@ -229,10 +204,7 @@ namespace CurlSharp
}
}
internal IntPtr GetHandle()
{
return _pShare;
}
internal IntPtr GetHandle() => _pShare;
private void EnsureHandle()
{
@@ -243,7 +215,7 @@ namespace CurlSharp
private void installDelegates()
{
_hThis = GCHandle.Alloc(this);
_ptrThis = (IntPtr)_hThis;
_ptrThis = (IntPtr) _hThis;
#if USE_LIBCURLSHIM
_pDelLock = LockDelegate;
_pDelUnlock = UnlockDelegate;
@@ -255,22 +227,14 @@ namespace CurlSharp
{
var gch = (GCHandle) userPtr;
var share = (CurlShare) gch.Target;
if (share == null)
return;
if (share.LockFunction == null)
return;
share.LockFunction((CurlLockData) data, (CurlLockAccess) access, share.UserData);
share?.LockFunction?.Invoke((CurlLockData) data, (CurlLockAccess) access, share.UserData);
}
internal static void UnlockDelegate(int data, IntPtr userPtr)
{
var gch = (GCHandle) userPtr;
var share = (CurlShare) gch.Target;
if (share == null)
return;
if (share.UnlockFunction == null)
return;
share.UnlockFunction((CurlLockData) data, share.UserData);
share?.UnlockFunction?.Invoke((CurlLockData) data, share.UserData);
}
}
}

View File

@@ -1,109 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{74420A79-CC16-442C-8B1E-7C1B913844F0}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>CurlSharp</RootNamespace>
<AssemblyName>CurlSharp</AssemblyName>
<FileAlignment>512</FileAlignment>
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
<TargetFrameworkProfile />
<TargetFrameworks>net452;netstandard2.0</TargetFrameworks>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug</OutputPath>
<DefineConstants>DEBUG</DefineConstants>
<WarningLevel>4</WarningLevel>
<ConsolePause>false</ConsolePause>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<Prefer32Bit>false</Prefer32Bit>
<PropertyGroup>
<AllowUnsafeBlocks>True</AllowUnsafeBlocks>
<PackageId>CurlSharp</PackageId>
<GeneratePackageOnBuild>false</GeneratePackageOnBuild>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>full</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release</OutputPath>
<WarningLevel>4</WarningLevel>
<ConsolePause>false</ConsolePause>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<DefineConstants>
</DefineConstants>
<Prefer32Bit>false</Prefer32Bit>
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
</ItemGroup>
<ItemGroup>
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Curl.cs" />
<Compile Include="CurlEasy.cs" />
<Compile Include="CurlHttpMultiPartForm.cs" />
<Compile Include="CurlMulti.cs" />
<Compile Include="CurlMultiInfo.cs" />
<Compile Include="CurlShare.cs" />
<Compile Include="CurlSlist.cs" />
<Compile Include="CurlSslContext.cs" />
<Compile Include="CurlVersionInfoData.cs" />
<Compile Include="NativeMethods.cs" />
<Compile Include="Enums\CurlClosePolicy.cs" />
<Compile Include="Enums\CurlCode.cs" />
<Compile Include="Enums\CurlFormCode.cs" />
<Compile Include="Enums\CurlFormOption.cs" />
<Compile Include="Enums\CurlFtpAuth.cs" />
<Compile Include="Enums\CurlFtpSsl.cs" />
<Compile Include="Enums\CurlHttpAuth.cs" />
<Compile Include="Enums\CurlHttpVersion.cs" />
<Compile Include="Enums\CurlInfo.cs" />
<Compile Include="Enums\CurlInfoType.cs" />
<Compile Include="Enums\CurlInitFlag.cs" />
<Compile Include="Enums\CurlIoCommand.cs" />
<Compile Include="Enums\CurlIoError.cs" />
<Compile Include="Enums\CurlIpResolve.cs" />
<Compile Include="Enums\CurlLockAccess.cs" />
<Compile Include="Enums\CurlLockData.cs" />
<Compile Include="Enums\CurlMessage.cs" />
<Compile Include="Enums\CurlMultiCode.cs" />
<Compile Include="Enums\CurlNetrcOption.cs" />
<Compile Include="Enums\CurlOption.cs" />
<Compile Include="Enums\CurlProxyType.cs" />
<Compile Include="Enums\CurlShareCode.cs" />
<Compile Include="Enums\CurlShareOption.cs" />
<Compile Include="Enums\CurlSslVersion.cs" />
<Compile Include="Enums\CurlTimeCond.cs" />
<Compile Include="Enums\CurlVersion.cs" />
<Compile Include="Enums\CurlVersionFeatureBitmask.cs" />
<Compile Include="Callbacks\CurlEasyCallbacks.cs" />
<Compile Include="Callbacks\CurlShareCallbacks.cs" />
<Compile Include="SSLFix.cs" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
<ItemGroup />
<ProjectExtensions>
<MonoDevelop>
<Properties>
<Policies>
<TextStylePolicy TabWidth="4" IndentWidth="4" RemoveTrailingWhitespace="True" NoTabsAfterNonTabs="False" EolMarker="Native" FileWidth="80" TabsToSpaces="True" scope="text/x-csharp">
<inheritsSet />
<inheritsScope />
</TextStylePolicy>
<CSharpFormattingPolicy IndentBlock="True" IndentBraces="False" IndentSwitchSection="False" IndentSwitchCaseSection="True" LabelPositioning="OneLess" NewLinesForBracesInTypes="True" NewLinesForBracesInMethods="True" NewLinesForBracesInProperties="False" NewLinesForBracesInAccessors="False" NewLinesForBracesInAnonymousMethods="False" NewLinesForBracesInControlBlocks="False" NewLinesForBracesInAnonymousTypes="False" NewLinesForBracesInObjectCollectionArrayInitializers="False" NewLinesForBracesInLambdaExpressionBody="False" NewLineForElse="False" NewLineForCatch="False" NewLineForFinally="False" NewLineForMembersInObjectInit="False" NewLineForMembersInAnonymousTypes="False" NewLineForClausesInQuery="False" SpacingAfterMethodDeclarationName="True" SpaceWithinMethodDeclarationParenthesis="False" SpaceBetweenEmptyMethodDeclarationParentheses="False" SpaceAfterMethodCallName="True" SpaceWithinMethodCallParentheses="False" SpaceBetweenEmptyMethodCallParentheses="False" SpaceAfterControlFlowStatementKeyword="True" SpaceWithinExpressionParentheses="False" SpaceWithinCastParentheses="False" SpaceWithinOtherParentheses="False" SpaceAfterCast="False" SpacesIgnoreAroundVariableDeclaration="False" SpaceBeforeOpenSquareBracket="True" SpaceBetweenEmptySquareBrackets="False" SpaceWithinSquareBrackets="False" SpaceAfterColonInBaseTypeDeclaration="True" SpaceAfterComma="True" SpaceAfterDot="False" SpaceAfterSemicolonsInForStatement="True" SpaceBeforeColonInBaseTypeDeclaration="True" SpaceBeforeComma="False" SpaceBeforeDot="False" SpaceBeforeSemicolonsInForStatement="False" SpacingAroundBinaryOperator="Single" WrappingPreserveSingleLine="True" WrappingKeepStatementsOnSingleLine="True" PlaceSystemDirectiveFirst="True" scope="text/x-csharp">
<inheritsSet />
<inheritsScope />
</CSharpFormattingPolicy>
</Policies>
</Properties>
</MonoDevelop>
</ProjectExtensions>
</Project>

View File

@@ -2,7 +2,7 @@
*
* CurlS#arp
*
* Copyright (c) 2013 Dr. Masroor Ehsan (masroore@gmail.com)
* Copyright (c) 2013-2017 Dr. Masroor Ehsan (masroore@gmail.com)
* Portions copyright (c) 2004, 2005 Jeff Phillips (jeff@jeffp.net)
*
* This software is licensed as described in the file LICENSE, which you
@@ -31,19 +31,6 @@ namespace CurlSharp
/// </summary>
public class CurlSlist : IDisposable
{
#if !USE_LIBCURLSHIM
[StructLayout(LayoutKind.Sequential)]
private class curl_slist
{
/// char*
[MarshalAs(UnmanagedType.LPStr)] public string data;
/// curl_slist*
public IntPtr next;
}
#endif
private IntPtr _handle;
/// <summary>
/// Constructor
/// </summary>
@@ -54,12 +41,12 @@ namespace CurlSharp
public CurlSlist()
{
Curl.EnsureCurl();
_handle = IntPtr.Zero;
Handle = IntPtr.Zero;
}
public CurlSlist(IntPtr handle)
{
_handle = handle;
Handle = handle;
}
/// <summary>
@@ -69,13 +56,13 @@ namespace CurlSharp
{
get
{
if (_handle == IntPtr.Zero)
if (Handle == IntPtr.Zero)
return null;
var strings = new List<string>();
#if !USE_LIBCURLSHIM
var slist = new curl_slist();
Marshal.PtrToStructure(_handle, slist);
Marshal.PtrToStructure(Handle, slist);
while (true)
{
@@ -90,6 +77,17 @@ namespace CurlSharp
}
}
internal IntPtr Handle { get; private set; }
/// <summary>
/// Free all internal strings.
/// </summary>
public void Dispose()
{
GC.SuppressFinalize(this);
Dispose(true);
}
/// <summary>
/// Destructor
/// </summary>
@@ -105,40 +103,38 @@ namespace CurlSharp
public void Append(string str)
{
#if USE_LIBCURLSHIM
_handle = NativeMethods.curl_shim_add_string_to_slist(_handle, str);
Handle = NativeMethods.curl_shim_add_string_to_slist(Handle, str);
#else
_handle = NativeMethods.curl_slist_append(_handle, str);
Handle = NativeMethods.curl_slist_append(Handle, str);
#endif
}
/// <summary>
/// Free all internal strings.
/// </summary>
public void Dispose()
{
GC.SuppressFinalize(this);
Dispose(true);
}
internal IntPtr Handle
{
get { return _handle; }
}
private void Dispose(bool disposing)
{
lock (this)
{
if (_handle != IntPtr.Zero)
if (Handle != IntPtr.Zero)
{
#if USE_LIBCURLSHIM
NativeMethods.curl_shim_free_slist(_handle);
NativeMethods.curl_shim_free_slist(Handle);
#else
NativeMethods.curl_slist_free_all(_handle);
NativeMethods.curl_slist_free_all(Handle);
#endif
_handle = IntPtr.Zero;
Handle = IntPtr.Zero;
}
}
}
#if !USE_LIBCURLSHIM
[StructLayout(LayoutKind.Sequential)]
private class curl_slist
{
/// char*
[MarshalAs(UnmanagedType.LPStr)] public string data;
/// curl_slist*
public IntPtr next;
}
#endif
}
}

View File

@@ -2,7 +2,7 @@
*
* CurlS#arp
*
* Copyright (c) 2013 Dr. Masroor Ehsan (masroore@gmail.com)
* Copyright (c) 2013-2017 Dr. Masroor Ehsan (masroore@gmail.com)
* Portions copyright (c) 2004, 2005 Jeff Phillips (jeff@jeffp.net)
*
* This software is licensed as described in the file LICENSE, which you
@@ -31,19 +31,14 @@ namespace CurlSharp
/// </summary>
public sealed class CurlSslContext
{
private readonly IntPtr _pvContext;
internal CurlSslContext(IntPtr pvContext)
{
_pvContext = pvContext;
Context = pvContext;
}
/// <summary>
/// Get the underlying OpenSSL context.
/// </summary>
public IntPtr Context
{
get { return _pvContext; }
}
public IntPtr Context { get; }
}
}

View File

@@ -2,7 +2,7 @@
*
* CurlS#arp
*
* Copyright (c) 2013 Dr. Masroor Ehsan (masroore@gmail.com)
* Copyright (c) 2013-2017 Dr. Masroor Ehsan (masroore@gmail.com)
* Portions copyright (c) 2004, 2005 Jeff Phillips (jeff@jeffp.net)
*
* This software is licensed as described in the file LICENSE, which you

View File

@@ -23,9 +23,24 @@ namespace CurlSharp
/// </summary>
Http1_1 = 2,
/// <summary>
/// Enforce HTTP 2 requests.
/// </summary>
Http2_0 = 3,
/// <summary>
/// Enforce version 2 for HTTPS, version 1.1 for HTTP.
/// </summary>
Http2_Tls = 4,
/// <summary>
/// Enforce HTTP 2 without HTTP/1.1 upgrade.
/// </summary>
Http2_PriorKnowledge = 5,
/// <summary>
/// Last entry in enumeration; do not use in application code.
/// </summary>
Last = 3
};
Last = 6
}
}

View File

@@ -0,0 +1,46 @@
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
//
// Copyright (c) 2017, Dr. Masroor Ehsan. All rights reserved.
//
// $Id:$
//
// Last modified: 25.01.2017 1:29 AM
//
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
namespace CurlSharp
{
public enum CurlMultiOption
{
/* This is the socket callback function pointer */
SocketFunction = CurlOptType.FunctionPoint + 1,
/* This is the argument passed to the socket callback */
SocketData = CurlOptType.ObjectPoint + 2,
/* set to 1 to enable pipelining for this multi handle */
Pipelining = CurlOptType.Long + 3,
/* This is the timer callback function pointer */
TimerFunction = CurlOptType.FunctionPoint + 4,
/* This is the argument passed to the timer callback */
TimerDate = CurlOptType.ObjectPoint + 5,
/* maximum number of entries in the connection cache */
MaxConnects = CurlOptType.Long + 6,
/* maximum number of (pipelining) connections to one host */
MaxHostConnections = CurlOptType.Long + 7,
/* maximum number of requests in a pipeline */
MaxPipelineLength = CurlOptType.Long + 8,
/* a connection with a content-length longer than this will not be considered for pipelining */
ContentLengthPenaltySize = CurlOptType.Offset + 9,
/* a connection with a chunk length longer than this will not be considered for pipelining */
ChunkLengthPenaltySize = CurlOptType.Offset + 10,
/* a list of site names(+port) that are blacklisted from pipelining */
PipeliningSiteBlackList = CurlOptType.ObjectPoint + 11,
/* a list of server types that are blacklisted from pipelining */
PipeliningServerBlackList = CurlOptType.ObjectPoint + 12,
/* maximum number of open connections in total */
MaxTotalConnections = CurlOptType.Long + 13,
/* This is the server push callback function pointer */
PushFunction = CurlOptType.FunctionPoint + 14,
/* This is the argument passed to the server push callback */
PushData = CurlOptType.ObjectPoint + 15
}
}

View File

@@ -0,0 +1,21 @@
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
//
// Copyright (c) 2017, Dr. Masroor Ehsan. All rights reserved.
//
// $Id:$
//
// Last modified: 25.01.2017 1:31 AM
//
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
namespace CurlSharp
{
public enum CurlOptType
{
Long = 0,
ObjectPoint = 10000,
StringPoint = 10000,
FunctionPoint = 20000,
Offset = 30000
}
}

View File

@@ -1075,6 +1075,32 @@ namespace CurlSharp
/// </summary>
SslCipherList = 10083,
/// <summary>
/// Object reference to pass to the ssl context delegate set by the option
/// <c>SslCtxFunction</c>, this is the pointer you'll get as the
/// second parameter, otherwise <c>null</c>. (Added in 7.11.0)
/// </summary>
SslCtxData = 10109,
/// <summary>
/// Reference to an <see cref="CurlEasy.CurlSslContextCallback" /> delegate.
/// This delegate gets called by libcurl just before the initialization of
/// an Ssl connection after having processed all other Ssl related options
/// to give a last chance to an application to modify the behaviour of
/// openssl's ssl initialization. The <see cref="CurlSslContext" /> parameter
/// wraps a pointer to an openssl SSL_CTX. If an error is returned no attempt
/// to establish a connection is made and the perform operation will return
/// the error code from this callback function. Set the parm argument with
/// the <c>SslCtxData</c> option. This option was introduced
/// in 7.11.0.
/// <note>
/// To use this properly, a non-trivial amount of knowledge of the openssl
/// libraries is necessary. Using this function allows for example to use
/// openssl callbacks to add additional validation code for certificates,
/// and even to change the actual URI of an HTTPS request.
/// </note>
/// </summary>
SslCtxFunction = 20108,
/// <summary>
/// Pass an <c>int</c>. Set if we should verify the common name from the

View File

@@ -0,0 +1,21 @@
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
//
// Copyright (c) 2017, Dr. Masroor Ehsan. All rights reserved.
//
// $Id:$
//
// Last modified: 25.01.2017 1:23 AM
//
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
namespace CurlSharp
{
/* bitmask bits for CURLMOPT_PIPELINING */
public enum CurlPipelining : long
{
Nothing = 0,
Http1 = 1,
Multiplex = 2
}
}

29
src/CurlSharp/LICENSE Normal file
View File

@@ -0,0 +1,29 @@
Copyright (c) 2013, Masroor Ehsan Choudhury
All rights reserved.
Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright notice, this
list of conditions and the following disclaimer in the documentation and/or
other materials provided with the distribution.
* Neither the name of the {organization} nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
https://github.com/masroore/CurlSharp

View File

@@ -2,8 +2,9 @@
*
* CurlS#arp
*
* Copyright (c) 2014 Dr. Masroor Ehsan (masroore@gmail.com)
* Copyright (c) 2013-2017 Dr. Masroor Ehsan (masroore@gmail.com)
* Portions copyright (c) 2004, 2005 Jeff Phillips (jeff@jeffp.net)
* Portions copyright (c) 2017 Katelyn Gigante (https://github.com/silasary)
*
* This software is licensed as described in the file LICENSE, which you
* should have received as part of this distribution.
@@ -20,383 +21,598 @@
//#define USE_LIBCURLSHIM
using System;
using System.IO;
using System.Reflection;
using System.Runtime.InteropServices;
namespace CurlSharp
{
/// <summary>
/// P/Invoke signatures.
/// </summary>
internal static unsafe class NativeMethods
{
#if WIN64
private const string CURL_LIB = "libcurl64.dll";
/// <summary>
/// P/Invoke signatures.
/// </summary>
internal static unsafe class NativeMethods
{
private const string LIBCURL = "libcurl";
private const string LIBCURLSHIM = "libcurlshim";
private const string LIBC_LINUX = "libc";
#if USE_LIBCURLSHIM
private const string CURLSHIM_LIB = "libcurlshim64.dll";
#endif
#else
#if LINUX
private const string CURL_LIB = "libcurl";
#else
private const string CURL_LIB = "libcurl.dll";
#if USE_LIBCURLSHIM
private const string CURLSHIM_LIB = "libcurlshim.dll";
#endif
#endif
#endif
#if !USE_LIBCURLSHIM
#if LINUX
private const string WINSOCK_LIB = "libc";
#else
private const string WINSOCK_LIB = "ws2_32.dll";
private const string LIB_DIR_WIN64 = "amd64";
private const string LIB_DIR_WIN32 = "i386";
static NativeMethods()
{
if (Environment.OSVersion.Platform == PlatformID.Win32NT)
{
if (Environment.Is64BitOperatingSystem)
{
SetDllDirectory(Path.Combine(AssemblyDirectory, LIB_DIR_WIN64));
}
else
{
SetDllDirectory(Path.Combine(AssemblyDirectory, LIB_DIR_WIN32));
}
}
#if USE_LIBCURLSHIM
if (!RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
throw new InvalidOperationException("Can not run on other platform than Win NET");
#endif
#endif
}
// internal delegates from cURL
[DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool SetDllDirectory(string lpPathName);
// libcurl imports
[DllImport (CURL_LIB, CallingConvention = CallingConvention.Cdecl)]
internal static extern CurlCode curl_global_init (int flags);
private static string AssemblyDirectory
{
get
{
var codeBase = typeof(NativeMethods).GetTypeInfo().Assembly.CodeBase;
var uri = new UriBuilder(codeBase);
var path = Uri.UnescapeDataString(uri.Path);
return Path.GetDirectoryName(path);
}
}
[DllImport (CURL_LIB, CallingConvention = CallingConvention.Cdecl)]
internal static extern void curl_global_cleanup ();
#region curl_global_init
[DllImport (CURL_LIB, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
internal static extern IntPtr curl_escape (String url, int length);
[DllImport(LIBCURL, CallingConvention = CallingConvention.Cdecl)]
public static extern CurlCode curl_global_init(int flags);
[DllImport (CURL_LIB, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
internal static extern IntPtr curl_unescape (String url, int length);
#endregion
[DllImport (CURL_LIB, CallingConvention = CallingConvention.Cdecl)]
internal static extern void curl_free (IntPtr p);
#region curl_global_cleanup
[DllImport (CURL_LIB, CallingConvention = CallingConvention.Cdecl)]
internal static extern IntPtr curl_version ();
[DllImport(LIBCURL, CallingConvention = CallingConvention.Cdecl)]
public static extern void curl_global_cleanup();
[DllImport (CURL_LIB, CallingConvention = CallingConvention.Cdecl)]
internal static extern IntPtr curl_easy_init ();
#endregion
[DllImport (CURL_LIB, CallingConvention = CallingConvention.Cdecl)]
internal static extern void curl_easy_cleanup (IntPtr pCurl);
#region curl_easy_escape
[UnmanagedFunctionPointer (CallingConvention.Cdecl)]
internal delegate int _CurlGenericCallback (IntPtr ptr, int sz, int nmemb, IntPtr userdata);
[UnmanagedFunctionPointer (CallingConvention.Cdecl)]
internal delegate int _CurlProgressCallback (
IntPtr extraData, double dlTotal, double dlNow, double ulTotal, double ulNow);
[UnmanagedFunctionPointer (CallingConvention.Cdecl)]
internal delegate int _CurlDebugCallback (
IntPtr ptrCurl, CurlInfoType infoType, string message, int size, IntPtr ptrUserData);
[UnmanagedFunctionPointer (CallingConvention.Cdecl)]
internal delegate int _CurlSslCtxCallback (IntPtr ctx, IntPtr parm);
[UnmanagedFunctionPointer (CallingConvention.Cdecl)]
internal delegate CurlIoError _CurlIoctlCallback (CurlIoCommand cmd, IntPtr parm);
// curl_easy_setopt() overloads
[DllImport (CURL_LIB, CallingConvention = CallingConvention.Cdecl)]
internal static extern CurlCode curl_easy_setopt (IntPtr pCurl, CurlOption opt, IntPtr parm);
[DllImport (CURL_LIB, CallingConvention = CallingConvention.Cdecl)]
internal static extern CurlCode curl_easy_setopt (IntPtr pCurl, CurlOption opt, string parm);
[DllImport (CURL_LIB, CallingConvention = CallingConvention.Cdecl)]
internal static extern CurlCode curl_easy_setopt (IntPtr pCurl, CurlOption opt, byte[] parm);
[DllImport (CURL_LIB, CallingConvention = CallingConvention.Cdecl)]
internal static extern CurlCode curl_easy_setopt (IntPtr pCurl, CurlOption opt, long parm);
[DllImport (CURL_LIB, CallingConvention = CallingConvention.Cdecl)]
internal static extern CurlCode curl_easy_setopt (IntPtr pCurl, CurlOption opt, bool parm);
[DllImport (CURL_LIB, CallingConvention = CallingConvention.Cdecl, EntryPoint = "curl_easy_setopt")]
internal static extern CurlCode curl_easy_setopt_cb (IntPtr pCurl, CurlOption opt, _CurlGenericCallback parm);
[DllImport (CURL_LIB, CallingConvention = CallingConvention.Cdecl, EntryPoint = "curl_easy_setopt")]
internal static extern CurlCode curl_easy_setopt_cb (IntPtr pCurl, CurlOption opt, _CurlProgressCallback parm);
[DllImport (CURL_LIB, CallingConvention = CallingConvention.Cdecl, EntryPoint = "curl_easy_setopt")]
internal static extern CurlCode curl_easy_setopt_cb (IntPtr pCurl, CurlOption opt, _CurlDebugCallback parm);
[DllImport (CURL_LIB, CallingConvention = CallingConvention.Cdecl, EntryPoint = "curl_easy_setopt")]
internal static extern CurlCode curl_easy_setopt_cb (IntPtr pCurl, CurlOption opt, _CurlSslCtxCallback parm);
[DllImport (CURL_LIB, CallingConvention = CallingConvention.Cdecl, EntryPoint = "curl_easy_setopt")]
internal static extern CurlCode curl_easy_setopt_cb (IntPtr pCurl, CurlOption opt, _CurlIoctlCallback parm);
#if !USE_LIBCURLSHIM
[DllImport (CURL_LIB, CallingConvention = CallingConvention.Cdecl)]
internal static extern CurlMultiCode curl_multi_fdset (IntPtr pmulti,
[In, Out] ref fd_set read_fd_set,
[In, Out] ref fd_set write_fd_set,
[In, Out] ref fd_set exc_fd_set,
[In, Out] ref int max_fd);
[StructLayout (LayoutKind.Sequential)]
internal struct fd_set
{
internal uint fd_count;
//[MarshalAs(UnmanagedType.ByValArray, SizeConst = FD_SETSIZE)] internal IntPtr[] fd_array;
internal fixed uint fd_array[FD_SETSIZE];
[DllImport(LIBCURL, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
public static extern IntPtr curl_easy_escape(IntPtr pEasy, string url, int length);
internal const int FD_SETSIZE = 64;
#endregion
internal void Cleanup ()
{
//fd_array = null;
}
#region curl_easy_unescape
internal static fd_set Create ()
{
return new fd_set {
//fd_array = new IntPtr[FD_SETSIZE],
fd_count = 0
};
}
internal static fd_set Create (IntPtr socket)
{
var handle = Create ();
handle.fd_count = 1;
handle.fd_array [0] = (uint)socket;
return handle;
}
}
internal static void FD_ZERO (fd_set fds)
{
for (var i = 0; i < fd_set.FD_SETSIZE; i++) {
//fds.fd_array[i] = (IntPtr) 0;
fds.fd_array [i] = 0;
}
fds.fd_count = 0;
}
[StructLayout (LayoutKind.Sequential)]
internal struct timeval
{
/// <summary>
/// Time interval, in seconds.
/// </summary>
internal int tv_sec;
/// <summary>
/// Time interval, in microseconds.
/// </summary>
internal int tv_usec;
internal static timeval Create (int milliseconds)
{
return new timeval {
tv_sec = milliseconds / 1000,
tv_usec = (milliseconds % 1000) * 1000
};
}
};
[DllImport (WINSOCK_LIB, EntryPoint = "select")]
internal static extern int select (
int nfds, // number of sockets, (ignored in winsock)
[In, Out] ref fd_set readfds, // read sockets to watch
[In, Out] ref fd_set writefds, // write sockets to watch
[In, Out] ref fd_set exceptfds, // error sockets to watch
ref timeval timeout);
//[DllImport(WINSOCK_LIB, EntryPoint = "select")]
//internal static extern int select(int ndfs, fd_set* readfds, fd_set* writefds, fd_set* exceptfds, timeval* timeout);
#endif
[DllImport (CURL_LIB, CallingConvention = CallingConvention.Cdecl)]
internal static extern CurlCode curl_easy_perform (IntPtr pCurl);
[DllImport (CURL_LIB, CallingConvention = CallingConvention.Cdecl)]
internal static extern IntPtr curl_easy_duphandle (IntPtr pCurl);
[DllImport (CURL_LIB, CallingConvention = CallingConvention.Cdecl)]
internal static extern IntPtr curl_easy_strerror (CurlCode err);
[DllImport (CURL_LIB, CallingConvention = CallingConvention.Cdecl)]
internal static extern CurlCode curl_easy_getinfo (IntPtr pCurl, CurlInfo info, ref IntPtr pInfo);
[DllImport (CURL_LIB, CallingConvention = CallingConvention.Cdecl)]
internal static extern CurlCode curl_easy_getinfo (IntPtr pCurl, CurlInfo info, ref double dblVal);
[DllImport (CURL_LIB, CallingConvention = CallingConvention.Cdecl)]
internal static extern void curl_easy_reset (IntPtr pCurl);
[DllImport (CURL_LIB, CallingConvention = CallingConvention.Cdecl)]
internal static extern IntPtr curl_multi_init ();
[DllImport (CURL_LIB, CallingConvention = CallingConvention.Cdecl)]
internal static extern CurlMultiCode curl_multi_cleanup (IntPtr pmulti);
[DllImport (CURL_LIB, CallingConvention = CallingConvention.Cdecl)]
internal static extern CurlMultiCode curl_multi_add_handle (IntPtr pmulti, IntPtr peasy);
[DllImport (CURL_LIB, CallingConvention = CallingConvention.Cdecl)]
internal static extern CurlMultiCode curl_multi_remove_handle (IntPtr pmulti, IntPtr peasy);
[DllImport (CURL_LIB, CallingConvention = CallingConvention.Cdecl)]
internal static extern IntPtr curl_multi_strerror (CurlMultiCode errorNum);
[DllImport (CURL_LIB, CallingConvention = CallingConvention.Cdecl)]
internal static extern CurlMultiCode curl_multi_perform (IntPtr pmulti, ref int runningHandles);
[DllImport (CURL_LIB, CallingConvention = CallingConvention.Cdecl)]
internal static extern void curl_formfree (IntPtr pForm);
#if !USE_LIBCURLSHIM
[DllImport (CURL_LIB, CallingConvention = CallingConvention.Cdecl)]
internal static extern int curl_formadd (ref IntPtr pHttppost, ref IntPtr pLastPost,
int codeFirst, IntPtr bufFirst,
int codeNext, IntPtr bufNext,
int codeLast);
#endif
[DllImport (CURL_LIB, CallingConvention = CallingConvention.Cdecl)]
internal static extern IntPtr curl_share_init ();
[DllImport (CURL_LIB, CallingConvention = CallingConvention.Cdecl)]
internal static extern CurlShareCode curl_share_cleanup (IntPtr pShare);
[DllImport (CURL_LIB, CallingConvention = CallingConvention.Cdecl)]
internal static extern IntPtr curl_share_strerror (CurlShareCode errorCode);
[DllImport (CURL_LIB, CallingConvention = CallingConvention.Cdecl)]
internal static extern CurlShareCode curl_share_setopt (IntPtr pShare, CurlShareOption optCode, IntPtr option);
[DllImport (CURL_LIB, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
internal static extern IntPtr curl_slist_append (IntPtr slist, string data);
[DllImport (CURL_LIB, CallingConvention = CallingConvention.Cdecl)]
internal static extern CurlShareCode curl_slist_free_all (IntPtr pList);
[DllImport(LIBCURL, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
public static extern IntPtr curl_easy_unescape(IntPtr pEasy, string url, int inLength, out int outLength);
[DllImport (CURL_LIB, CallingConvention = CallingConvention.Cdecl)]
internal static extern IntPtr curl_version_info (CurlVersion ver);
#endregion
#if USE_LIBCURLSHIM
// libcurlshim imports
[DllImport(CURLSHIM_LIB, CallingConvention = CallingConvention.Cdecl)]
internal static extern void curl_shim_initialize();
#region curl_free
[DllImport(CURLSHIM_LIB, CallingConvention = CallingConvention.Cdecl)]
internal static extern void curl_shim_cleanup();
[DllImport(LIBCURL, CallingConvention = CallingConvention.Cdecl)]
public static extern void curl_free(IntPtr p);
[DllImport(CURLSHIM_LIB, CallingConvention = CallingConvention.Cdecl)]
internal static extern IntPtr curl_shim_alloc_strings();
#endregion
[DllImport(CURLSHIM_LIB, CallingConvention = CallingConvention.Cdecl,
CharSet = CharSet.Ansi)]
internal static extern IntPtr curl_shim_add_string_to_slist(
IntPtr pStrings, String str);
#region curl_version
[DllImport(CURLSHIM_LIB, CallingConvention = CallingConvention.Cdecl,
CharSet = CharSet.Ansi)]
internal static extern IntPtr curl_shim_get_string_from_slist(
IntPtr pSlist, ref IntPtr pStr);
[DllImport(LIBCURL, CallingConvention = CallingConvention.Cdecl)]
public static extern IntPtr curl_version();
[DllImport(CURLSHIM_LIB, CallingConvention = CallingConvention.Cdecl,
CharSet = CharSet.Ansi)]
internal static extern IntPtr curl_shim_add_string(IntPtr pStrings, String str);
#endregion
[DllImport(CURLSHIM_LIB, CallingConvention = CallingConvention.Cdecl)]
internal static extern void curl_shim_free_strings(IntPtr pStrings);
#region curl_version_info
[DllImport(CURLSHIM_LIB, CallingConvention = CallingConvention.Cdecl)]
internal static extern int curl_shim_install_delegates(IntPtr pCurl, IntPtr pThis,
_ShimWriteCallback pWrite, _ShimReadCallback pRead,
_ShimProgressCallback pProgress, _ShimDebugCallback pDebug,
_ShimHeaderCallback pHeader, _ShimSslCtxCallback pCtx,
[DllImport(LIBCURL, CallingConvention = CallingConvention.Cdecl)]
public static extern IntPtr curl_version_info(CurlVersion ver);
#endregion
#region curl_easy_init
[DllImport(LIBCURL, CallingConvention = CallingConvention.Cdecl)]
public static extern IntPtr curl_easy_init();
#endregion
#region curl_easy_cleanup
[DllImport(LIBCURL, CallingConvention = CallingConvention.Cdecl)]
public static extern void curl_easy_cleanup(IntPtr pCurl);
#endregion
#region curl_easy_setopt
#region Delegates
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate int _CurlGenericCallback(IntPtr ptr, int sz, int nmemb, IntPtr userdata);
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate int _CurlProgressCallback(
IntPtr extraData,
double dlTotal,
double dlNow,
double ulTotal,
double ulNow);
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate int _CurlDebugCallback(
IntPtr ptrCurl,
CurlInfoType infoType,
string message,
int size,
IntPtr ptrUserData);
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate int _CurlSslCtxCallback(IntPtr ctx, IntPtr parm);
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate CurlIoError _CurlIoctlCallback(CurlIoCommand cmd, IntPtr parm);
#endregion
[DllImport(LIBCURL, CallingConvention = CallingConvention.Cdecl)]
public static extern CurlCode curl_easy_setopt(IntPtr pCurl, CurlOption opt, IntPtr parm);
[DllImport(LIBCURL, CallingConvention = CallingConvention.Cdecl)]
public static extern CurlCode curl_easy_setopt(IntPtr pCurl, CurlOption opt, string parm);
[DllImport(LIBCURL, CallingConvention = CallingConvention.Cdecl)]
public static extern CurlCode curl_easy_setopt(IntPtr pCurl, CurlOption opt, byte[] parm);
[DllImport(LIBCURL, CallingConvention = CallingConvention.Cdecl)]
public static extern CurlCode curl_easy_setopt(IntPtr pCurl, CurlOption opt, long parm);
[DllImport(LIBCURL, CallingConvention = CallingConvention.Cdecl)]
public static extern CurlCode curl_easy_setopt(IntPtr pCurl, CurlOption opt, bool parm);
[DllImport(LIBCURL, CallingConvention = CallingConvention.Cdecl)]
public static extern CurlCode curl_easy_setopt(IntPtr pCurl, CurlOption opt, _CurlGenericCallback parm);
[DllImport(LIBCURL, CallingConvention = CallingConvention.Cdecl)]
public static extern CurlCode curl_easy_setopt(IntPtr pCurl, CurlOption opt, _CurlProgressCallback parm);
[DllImport(LIBCURL, CallingConvention = CallingConvention.Cdecl)]
public static extern CurlCode curl_easy_setopt(IntPtr pCurl, CurlOption opt, _CurlDebugCallback parm);
[DllImport(LIBCURL, CallingConvention = CallingConvention.Cdecl)]
public static extern CurlCode curl_easy_setopt(IntPtr pCurl, CurlOption opt, _CurlSslCtxCallback parm);
[DllImport(LIBCURL, CallingConvention = CallingConvention.Cdecl)]
public static extern CurlCode curl_easy_setopt(IntPtr pCurl, CurlOption opt, _CurlIoctlCallback parm);
#endregion
#region curl_easy_perform
[DllImport(LIBCURL, CallingConvention = CallingConvention.Cdecl)]
public static extern CurlCode curl_easy_perform(IntPtr pCurl);
#endregion
#region curl_easy_duphandle
[DllImport(LIBCURL, CallingConvention = CallingConvention.Cdecl)]
public static extern IntPtr curl_easy_duphandle(IntPtr pCurl);
#endregion
#region curl_easy_strerror
[DllImport(LIBCURL, CallingConvention = CallingConvention.Cdecl)]
public static extern IntPtr curl_easy_strerror(CurlCode err);
#endregion
#region curl_easy_getinfo
[DllImport(LIBCURL, CallingConvention = CallingConvention.Cdecl)]
public static extern CurlCode curl_easy_getinfo(IntPtr pCurl, CurlInfo info, ref IntPtr pInfo);
[DllImport(LIBCURL, CallingConvention = CallingConvention.Cdecl)]
public static extern CurlCode curl_easy_getinfo(IntPtr pCurl, CurlInfo info, ref double dblVal);
#endregion
#region curl_easy_reset
[DllImport(LIBCURL, CallingConvention = CallingConvention.Cdecl)]
public static extern void curl_easy_reset(IntPtr pCurl);
#endregion
#region curl_multi_init
[DllImport(LIBCURL, CallingConvention = CallingConvention.Cdecl)]
public static extern IntPtr curl_multi_init();
#endregion
#region curl_multi_cleanup
[DllImport(LIBCURL, CallingConvention = CallingConvention.Cdecl)]
public static extern CurlMultiCode curl_multi_cleanup(IntPtr pmulti);
#endregion
#region curl_multi_add_handle
[DllImport(LIBCURL, CallingConvention = CallingConvention.Cdecl)]
public static extern CurlMultiCode curl_multi_add_handle(IntPtr pmulti, IntPtr peasy);
#endregion
#region curl_multi_remove_handle
[DllImport(LIBCURL, CallingConvention = CallingConvention.Cdecl)]
public static extern CurlMultiCode curl_multi_remove_handle(IntPtr pmulti, IntPtr peasy);
#endregion
#region curl_multi_setopt
[DllImport(LIBCURL, CallingConvention = CallingConvention.Cdecl)]
public static extern CurlMultiCode curl_multi_setopt(IntPtr pmulti, CurlMultiOption opt, bool parm);
[DllImport(LIBCURL, CallingConvention = CallingConvention.Cdecl)]
public static extern CurlMultiCode curl_multi_setopt(IntPtr pmulti, CurlMultiOption opt, long parm);
#endregion
#region curl_multi_strerror
[DllImport(LIBCURL, CallingConvention = CallingConvention.Cdecl)]
public static extern IntPtr curl_multi_strerror(CurlMultiCode errorNum);
#endregion
#region curl_multi_perform
[DllImport(LIBCURL, CallingConvention = CallingConvention.Cdecl)]
public static extern CurlMultiCode curl_multi_perform(IntPtr pmulti, ref int runningHandles);
#endregion
#if !USE_LIBCURLSHIM
#region curl_multi_fdset
[DllImport(LIBCURL, CallingConvention = CallingConvention.Cdecl)]
public static extern CurlMultiCode curl_multi_fdset(IntPtr pmulti,
[In] [Out] ref fd_set read_fd_set,
[In] [Out] ref fd_set write_fd_set,
[In] [Out] ref fd_set exc_fd_set,
[In] [Out] ref int max_fd);
[StructLayout(LayoutKind.Sequential)]
public struct fd_set
{
public uint fd_count;
// [MarshalAs(UnmanagedType.ByValArray, SizeConst = FD_SETSIZE)] public IntPtr[] fd_array;
public fixed uint fd_array[FD_SETSIZE];
public const int FD_SETSIZE = 64;
public void Cleanup()
{
// fd_array = null;
}
public static fd_set Create()
{
return new fd_set
{
// fd_array = new IntPtr[FD_SETSIZE],
fd_count = 0
};
}
public static fd_set Create(IntPtr socket)
{
var handle = Create();
handle.fd_count = 1;
handle.fd_array[0] = (uint)socket;
return handle;
}
}
public static void FD_ZERO(fd_set fds)
{
for (var i = 0; i < fd_set.FD_SETSIZE; i++)
{
fds.fd_array[i] = 0;
}
fds.fd_count = 0;
}
#endregion
#region select
[StructLayout(LayoutKind.Sequential)]
public struct timeval
{
/// <summary>
/// Time interval, in seconds.
/// </summary>
public int tv_sec;
/// <summary>
/// Time interval, in microseconds.
/// </summary>
public int tv_usec;
public static timeval Create(int milliseconds)
{
return new timeval
{
tv_sec = milliseconds / 1000,
tv_usec = milliseconds % 1000 * 1000
};
}
}
[DllImport(LIBC_LINUX, EntryPoint = "select")]
private static extern int select_unix(
int nfds, // number of sockets, (ignored in winsock)
[In] [Out] ref fd_set readfds, // read sockets to watch
[In] [Out] ref fd_set writefds, // write sockets to watch
[In] [Out] ref fd_set exceptfds, // error sockets to watch
ref timeval timeout);
[DllImport(WINSOCK_LIB, EntryPoint = "select")]
private static extern int select_win(
int nfds, // number of sockets, (ignored in winsock)
[In] [Out] ref fd_set readfds, // read sockets to watch
[In] [Out] ref fd_set writefds, // write sockets to watch
[In] [Out] ref fd_set exceptfds, // error sockets to watch
ref timeval timeout);
public static int select(
int nfds, // number of sockets, (ignored in winsock)
[In] [Out] ref fd_set readfds, // read sockets to watch
[In] [Out] ref fd_set writefds, // write sockets to watch
[In] [Out] ref fd_set exceptfds, // error sockets to watch
ref timeval timeout)
{
int result;
if (Environment.OSVersion.Platform == PlatformID.Win32NT)
{
result = select_win(
nfds, // number of sockets, (ignored in winsock)
ref readfds, // read sockets to watch
ref writefds, // write sockets to watch
ref exceptfds, // error sockets to watch
ref timeout);
}
else
{
result = select_unix(
nfds, // number of sockets, (ignored in winsock)
ref readfds, // read sockets to watch
ref writefds, // write sockets to watch
ref exceptfds, // error sockets to watch
ref timeout);
}
return result;
}
#endregion
#endif
#region curl_share_init
[DllImport(LIBCURL, CallingConvention = CallingConvention.Cdecl)]
public static extern IntPtr curl_share_init();
#endregion
#region curl_share_cleanup
[DllImport(LIBCURL, CallingConvention = CallingConvention.Cdecl)]
public static extern CurlShareCode curl_share_cleanup(IntPtr pShare);
#endregion
#region curl_share_strerror
[DllImport(LIBCURL, CallingConvention = CallingConvention.Cdecl)]
public static extern IntPtr curl_share_strerror(CurlShareCode errorCode);
#endregion
#region curl_share_setopt
[DllImport(LIBCURL, CallingConvention = CallingConvention.Cdecl)]
public static extern CurlShareCode curl_share_setopt(
IntPtr pShare,
CurlShareOption optCode,
IntPtr option);
#endregion
#region curl_formadd
#if !USE_LIBCURLSHIM
[DllImport(LIBCURL, CallingConvention = CallingConvention.Cdecl)]
public static extern int curl_formadd(ref IntPtr pHttppost, ref IntPtr pLastPost,
int codeFirst, IntPtr bufFirst,
int codeNext, IntPtr bufNext,
int codeLast);
#endif
#endregion
#region curl_formfree
[DllImport(LIBCURL, CallingConvention = CallingConvention.Cdecl)]
public static extern void curl_formfree(IntPtr pForm);
#endregion
#region curl_slist_append
[DllImport(LIBCURL, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
public static extern IntPtr curl_slist_append(IntPtr slist, string data);
#endregion
#region curl_slist_free_all
[DllImport(LIBCURL, CallingConvention = CallingConvention.Cdecl)]
public static extern void curl_slist_free_all(IntPtr pList);
#endregion
#if USE_LIBCURLSHIM
#region libcurlshim imports
[DllImport(LIBCURLSHIM, CallingConvention = CallingConvention.Cdecl)]
public static extern void curl_shim_initialize();
[DllImport(LIBCURLSHIM, CallingConvention = CallingConvention.Cdecl)]
public static extern void curl_shim_cleanup();
[DllImport(LIBCURLSHIM, CallingConvention = CallingConvention.Cdecl)]
public static extern IntPtr curl_shim_alloc_strings();
[DllImport(LIBCURLSHIM, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
public static extern IntPtr curl_shim_add_string_to_slist(IntPtr pStrings, string str);
[DllImport(LIBCURLSHIM, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
public static extern IntPtr curl_shim_get_string_from_slist(IntPtr pSlist, ref IntPtr pStr);
[DllImport(LIBCURLSHIM, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
public static extern IntPtr curl_shim_add_string(IntPtr pStrings, string str);
[DllImport(LIBCURLSHIM, CallingConvention = CallingConvention.Cdecl)]
public static extern void curl_shim_free_strings(IntPtr pStrings);
[DllImport(LIBCURLSHIM, CallingConvention = CallingConvention.Cdecl)]
public static extern int curl_shim_install_delegates(
IntPtr pCurl,
IntPtr pThis,
_ShimWriteCallback pWrite,
_ShimReadCallback pRead,
_ShimProgressCallback pProgress,
_ShimDebugCallback pDebug,
_ShimHeaderCallback pHeader,
_ShimSslCtxCallback pCtx,
_ShimIoctlCallback pIoctl);
[DllImport(CURLSHIM_LIB, CallingConvention = CallingConvention.Cdecl)]
internal static extern void curl_shim_cleanup_delegates(IntPtr pThis);
[DllImport(LIBCURLSHIM, CallingConvention = CallingConvention.Cdecl)]
public static extern void curl_shim_cleanup_delegates(IntPtr pThis);
[DllImport(CURLSHIM_LIB, CallingConvention = CallingConvention.Cdecl)]
internal static extern void curl_shim_get_file_time(int unixTime,
ref int yy, ref int mm, ref int dd, ref int hh, ref int mn, ref int ss);
[DllImport(LIBCURLSHIM, CallingConvention = CallingConvention.Cdecl)]
public static extern void curl_shim_get_file_time(
int unixTime,
ref int yy,
ref int mm,
ref int dd,
ref int hh,
ref int mn,
ref int ss);
[DllImport(CURLSHIM_LIB, CallingConvention = CallingConvention.Cdecl)]
internal static extern void curl_shim_free_slist(IntPtr p);
[DllImport(LIBCURLSHIM, CallingConvention = CallingConvention.Cdecl)]
public static extern void curl_shim_free_slist(IntPtr p);
[DllImport(CURLSHIM_LIB, CallingConvention = CallingConvention.Cdecl)]
internal static extern IntPtr curl_shim_alloc_fd_sets();
[DllImport(LIBCURLSHIM, CallingConvention = CallingConvention.Cdecl)]
public static extern IntPtr curl_shim_alloc_fd_sets();
[DllImport(CURLSHIM_LIB, CallingConvention = CallingConvention.Cdecl)]
internal static extern void curl_shim_free_fd_sets(IntPtr fdsets);
[DllImport(LIBCURLSHIM, CallingConvention = CallingConvention.Cdecl)]
public static extern void curl_shim_free_fd_sets(IntPtr fdsets);
[DllImport(CURLSHIM_LIB, CallingConvention = CallingConvention.Cdecl)]
internal static extern CurlMultiCode curl_shim_multi_fdset(IntPtr multi,
IntPtr fdsets, ref int maxFD);
[DllImport(LIBCURLSHIM, CallingConvention = CallingConvention.Cdecl)]
public static extern CurlMultiCode curl_shim_multi_fdset(IntPtr multi, IntPtr fdsets, ref int maxFD);
[DllImport(CURLSHIM_LIB, CallingConvention = CallingConvention.Cdecl)]
internal static extern int curl_shim_select(int maxFD, IntPtr fdsets,
int milliseconds);
[DllImport(LIBCURLSHIM, CallingConvention = CallingConvention.Cdecl)]
public static extern int curl_shim_select(int maxFD, IntPtr fdsets, int milliseconds);
[DllImport(CURLSHIM_LIB, CallingConvention = CallingConvention.Cdecl)]
internal static extern IntPtr curl_shim_multi_info_read(IntPtr multi,
ref int nMsgs);
[DllImport(LIBCURLSHIM, CallingConvention = CallingConvention.Cdecl)]
public static extern IntPtr curl_shim_multi_info_read(IntPtr multi, ref int nMsgs);
[DllImport(CURLSHIM_LIB, CallingConvention = CallingConvention.Cdecl)]
internal static extern void curl_shim_multi_info_free(IntPtr multiInfo);
[DllImport(LIBCURLSHIM, CallingConvention = CallingConvention.Cdecl)]
public static extern void curl_shim_multi_info_free(IntPtr multiInfo);
[DllImport(CURLSHIM_LIB, CallingConvention = CallingConvention.Cdecl)]
internal static extern int curl_shim_formadd(IntPtr[] ppForms, IntPtr[] pParams, int nParams);
[DllImport(LIBCURLSHIM, CallingConvention = CallingConvention.Cdecl)]
public static extern int curl_shim_formadd(IntPtr[] ppForms, IntPtr[] pParams, int nParams);
[DllImport(CURLSHIM_LIB, CallingConvention = CallingConvention.Cdecl)]
internal static extern int curl_shim_install_share_delegates(IntPtr pShare,
IntPtr pThis, _ShimLockCallback pLock, _ShimUnlockCallback pUnlock);
[DllImport(LIBCURLSHIM, CallingConvention = CallingConvention.Cdecl)]
public static extern int curl_shim_install_share_delegates(
IntPtr pShare,
IntPtr pThis,
_ShimLockCallback pLock,
_ShimUnlockCallback pUnlock);
[DllImport(CURLSHIM_LIB, CallingConvention = CallingConvention.Cdecl)]
internal static extern void curl_shim_cleanup_share_delegates(IntPtr pShare);
[DllImport(LIBCURLSHIM, CallingConvention = CallingConvention.Cdecl)]
public static extern void curl_shim_cleanup_share_delegates(IntPtr pShare);
[DllImport(CURLSHIM_LIB, CallingConvention = CallingConvention.Cdecl)]
internal static extern int curl_shim_get_version_int_value(IntPtr p, int offset);
[DllImport(LIBCURLSHIM, CallingConvention = CallingConvention.Cdecl)]
public static extern int curl_shim_get_version_int_value(IntPtr p, int offset);
[DllImport(CURLSHIM_LIB, CallingConvention = CallingConvention.Cdecl)]
internal static extern IntPtr curl_shim_get_version_char_ptr(IntPtr p, int offset);
[DllImport(LIBCURLSHIM, CallingConvention = CallingConvention.Cdecl)]
public static extern IntPtr curl_shim_get_version_char_ptr(IntPtr p, int offset);
[DllImport(CURLSHIM_LIB, CallingConvention = CallingConvention.Cdecl)]
internal static extern int curl_shim_get_number_of_protocols(IntPtr p, int offset);
[DllImport(LIBCURLSHIM, CallingConvention = CallingConvention.Cdecl)]
public static extern int curl_shim_get_number_of_protocols(IntPtr p, int offset);
[DllImport(CURLSHIM_LIB, CallingConvention = CallingConvention.Cdecl)]
internal static extern IntPtr curl_shim_get_protocol_string(IntPtr p, int offset, int index);
[DllImport(LIBCURLSHIM, CallingConvention = CallingConvention.Cdecl)]
public static extern IntPtr curl_shim_get_protocol_string(IntPtr p, int offset, int index);
internal delegate void _ShimLockCallback(int data, int access, IntPtr userPtr);
public delegate void _ShimLockCallback(int data, int access, IntPtr userPtr);
internal delegate void _ShimUnlockCallback(int data, IntPtr userPtr);
public delegate void _ShimUnlockCallback(int data, IntPtr userPtr);
internal delegate int _ShimDebugCallback(CurlInfoType infoType, IntPtr msgBuf, int msgBufSize, IntPtr parm);
public delegate int _ShimDebugCallback(CurlInfoType infoType, IntPtr msgBuf, int msgBufSize, IntPtr parm);
internal delegate int _ShimHeaderCallback(IntPtr buf, int sz, int nmemb, IntPtr stream);
public delegate int _ShimHeaderCallback(IntPtr buf, int sz, int nmemb, IntPtr stream);
internal delegate CurlIoError _ShimIoctlCallback(CurlIoCommand cmd, IntPtr parm);
public delegate CurlIoError _ShimIoctlCallback(CurlIoCommand cmd, IntPtr parm);
internal delegate int _ShimProgressCallback(IntPtr parm, double dlTotal, double dlNow, double ulTotal, double ulNow);
public delegate int _ShimProgressCallback(
IntPtr parm,
double dlTotal,
double dlNow,
double ulTotal,
double ulNow);
internal delegate int _ShimReadCallback(IntPtr buf, int sz, int nmemb, IntPtr parm);
public delegate int _ShimReadCallback(IntPtr buf, int sz, int nmemb, IntPtr parm);
internal delegate int _ShimSslCtxCallback(IntPtr ctx, IntPtr parm);
public delegate int _ShimSslCtxCallback(IntPtr ctx, IntPtr parm);
public delegate int _ShimWriteCallback(IntPtr buf, int sz, int nmemb, IntPtr parm);
#endregion
internal delegate int _ShimWriteCallback(IntPtr buf, int sz, int nmemb, IntPtr parm);
#endif
}
}
}

View File

@@ -1,22 +0,0 @@
using System.Reflection;
using System.Runtime.CompilerServices;
// Information about this assembly is defined by the following attributes.
// Change them to the values specific to your project.
[assembly: AssemblyTitle ("CurlSharp")]
[assembly: AssemblyDescription ("")]
[assembly: AssemblyConfiguration ("")]
[assembly: AssemblyCompany ("")]
[assembly: AssemblyProduct ("")]
[assembly: AssemblyCopyright ("max")]
[assembly: AssemblyTrademark ("")]
[assembly: AssemblyCulture ("")]
// The assembly version has the format "{Major}.{Minor}.{Build}.{Revision}".
// The form "{Major}.{Minor}.*" will automatically update the build and revision,
// and "{Major}.{Minor}.{Build}.*" will update just the revision.
[assembly: AssemblyVersion ("1.0.*")]
// The following attributes are used to specify the signing key for the assembly,
// if desired. See the Mono documentation for more information about signing.
//[assembly: AssemblyDelaySign(false)]
//[assembly: AssemblyKeyFile("")]

114
src/CurlSharp/README.md Normal file
View File

@@ -0,0 +1,114 @@
CurlSharp
=========
CurlSharp is a .Net binding and object-oriented wrapper for [libcurl](http://curl.haxx.se/libcurl/).
libcurl is a web-client library that can provide cross-platform .Net applications with an easy way to implement such things as:
- HTTP ( GET / HEAD / PUT / POST / multi-part / form-data )
- FTP ( upload / download / list / 3rd-party )
- HTTPS, FTPS, SSL, TLS ( via OpenSSL or GnuTLS )
- Proxies, proxy tunneling, cookies, user+password authentication.
- File transfer resume, byte ranges, multiple asynchronous transfers.
- and much more...
CurlSharp provides simple get/set properties for libcurl's options and information functions, event-based hooks to libcurl's I/O, status, and progress callbacks, and wraps the c-style file I/O behind simple filename properties. The `CurlEasy` class contains has more than 100 different properties and methods to handle a wide variety of URL transfer requirements. While this may seem overwhelming at first glance, the good news is you will probably need only a tiny subset of these for most situations.
The CurlSharp library consists of these parts:
- Pure C# P/Invoke bindings to the libcurl API.
- Optional libcurlshim helper DLL [WIN32].
- The `CurlEasy` class which provides a wrapper around a `curl_easy` session.
- The `CurlMulti` class, which serves as a container for multiple CurlEasy objects, and provides a wrapper around a `curl_multi` session.
- The `CurlShare` class which provides an infrastructure for serializing access to data shared by multiple `CurlEasy` objects, including cookie data and DNS hosts. It implements the `curl_share_xxx` API.
- The `CurlHttpMultiPartForm` to easily construct multi-part forms.
- The `CurlSlist` class which wraps a linked list of strings used in cURL.
CurlSharp is available for these platforms:
- [Stable] Windows 32-bit
- [Experimental] Win64 port
- [Experimental] Mono Linux & OS X support
#### Examples ####
A simple HTTP download program...
```c#
using System;
using CurlSharp;
internal class EasyGet
{
public static void Main(String[] args)
{
Curl.GlobalInit(CurlInitFlag.All);
try
{
using (var easy = new CurlEasy())
{
easy.Url = "http://www.google.com/";
easy.WriteFunction = OnWriteData;
easy.Perform();
}
}
finally
{
Curl.GlobalCleanup();
}
}
public static Int32 OnWriteData(byte[] buf, Int32 size, Int32 nmemb, object data)
{
Console.Write(Encoding.UTF8.GetString(buf));
return size*nmemb;
}
}
```
Simple HTTP Post example:
```c#
using (var easy = new CurlEasy())
{
easy.Url = "http://hostname/testpost.php";
easy.Post = true;
var postData = "parm1=12345&parm2=Hello+world%21";
easy.PostFields = postData;
easy.PostFieldSize = postData.Length;
easy.Perform();
}
```
HTTP/2.0 download:
```c#
using (var easy = new CurlEasy())
{
easy.Url = "https://google.com/";
easy.WriteFunction = OnWriteData;
// HTTP/2 please
easy.HttpVersion = CurlHttpVersion.Http2_0;
// skip SSL verification during debugging
easy.SslVerifyPeer = false;
easy.SslVerifyhost = false;
easy.Perform();
}
```
More samples are included in the Samples folder.
#### Credits ####
CurlSharp Written by Dr. Masroor Ehsan.
CurlSharp is based on original code by Jeff Phillips [libcurl.NET](http://sourceforge.net/projects/libcurl-net/). Original code has been modified and greatly enhanced.
----------
CurlSharp Copyright © 2013-17 Dr. Masroor Ehsan

View File

@@ -0,0 +1,621 @@
//********************************************************************************************
//Author: Sergey Stoyan, CliverSoft.com
// http://cliversoft.com
// stoyan@cliversoft.com
// sergey.stoyan@gmail.com
// 27 February 2007
//********************************************************************************************
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Text.RegularExpressions;
using System.Threading;
using System.Collections;
namespace Cliver
{
/// <summary>
/// Miscellaneous and parsing methods for DateTime
/// </summary>
public static class DateTimeRoutines
{
#region miscellaneous methods
/// <summary>
/// Amount of seconds elapsed between 1970-01-01 00:00:00 and the date-time.
/// </summary>
/// <param name="date_time">date-time</param>
/// <returns>seconds</returns>
public static uint GetSecondsSinceUnixEpoch(this DateTime date_time)
{
TimeSpan t = date_time - new DateTime(1970, 1, 1);
int ss = (int)t.TotalSeconds;
if (ss < 0)
return 0;
return (uint)ss;
}
#endregion
#region parsing definitions
/// <summary>
/// Defines a substring where date-time was found and result of conversion
/// </summary>
public class ParsedDateTime
{
/// <summary>
/// Index of first char of a date substring found in the string
/// </summary>
readonly public int IndexOfDate = -1;
/// <summary>
/// Length a date substring found in the string
/// </summary>
readonly public int LengthOfDate = -1;
/// <summary>
/// Index of first char of a time substring found in the string
/// </summary>
readonly public int IndexOfTime = -1;
/// <summary>
/// Length of a time substring found in the string
/// </summary>
readonly public int LengthOfTime = -1;
/// <summary>
/// DateTime found in the string
/// </summary>
readonly public DateTime DateTime;
/// <summary>
/// True if a date was found within the string
/// </summary>
readonly public bool IsDateFound;
/// <summary>
/// True if a time was found within the string
/// </summary>
readonly public bool IsTimeFound;
/// <summary>
/// UTC offset if it was found within the string
/// </summary>
readonly public TimeSpan UtcOffset;
/// <summary>
/// True if UTC offset was found in the string
/// </summary>
readonly public bool IsUtcOffsetFound;
/// <summary>
/// Utc gotten from DateTime if IsUtcOffsetFound is True
/// </summary>
public DateTime UtcDateTime;
internal ParsedDateTime(int index_of_date, int length_of_date, int index_of_time, int length_of_time, DateTime date_time)
{
IndexOfDate = index_of_date;
LengthOfDate = length_of_date;
IndexOfTime = index_of_time;
LengthOfTime = length_of_time;
DateTime = date_time;
IsDateFound = index_of_date > -1;
IsTimeFound = index_of_time > -1;
UtcOffset = new TimeSpan(25, 0, 0);
IsUtcOffsetFound = false;
UtcDateTime = new DateTime(1, 1, 1);
}
internal ParsedDateTime(int index_of_date, int length_of_date, int index_of_time, int length_of_time, DateTime date_time, TimeSpan utc_offset)
{
IndexOfDate = index_of_date;
LengthOfDate = length_of_date;
IndexOfTime = index_of_time;
LengthOfTime = length_of_time;
DateTime = date_time;
IsDateFound = index_of_date > -1;
IsTimeFound = index_of_time > -1;
UtcOffset = utc_offset;
IsUtcOffsetFound = Math.Abs(utc_offset.TotalHours) < 12;
if (!IsUtcOffsetFound)
UtcDateTime = new DateTime(1, 1, 1);
else
{
if (index_of_date < 0)//to avoid negative date exception when date is undefined
{
TimeSpan ts = date_time.TimeOfDay + utc_offset;
if (ts < new TimeSpan(0))
UtcDateTime = new DateTime(1, 1, 2) + ts;
else
UtcDateTime = new DateTime(1, 1, 1) + ts;
}
else
UtcDateTime = date_time + utc_offset;
}
}
}
/// <summary>
/// Date that is accepted in the following cases:
/// - no date was parsed by TryParseDateOrTime();
/// - no year was found by TryParseDate();
/// It is ignored if DefaultDateIsNow = true was set after DefaultDate
/// </summary>
public static DateTime DefaultDate
{
set
{
_DefaultDate = value;
DefaultDateIsNow = false;
}
get
{
if (DefaultDateIsNow)
return DateTime.Now;
else
return _DefaultDate;
}
}
static DateTime _DefaultDate = DateTime.Now;
/// <summary>
/// If true then DefaultDate property is ignored and DefaultDate is always DateTime.Now
/// </summary>
public static bool DefaultDateIsNow = true;
/// <summary>
/// Defines default date-time format.
/// </summary>
public enum DateTimeFormat
{
/// <summary>
/// month number goes before day number
/// </summary>
USA_DATE,
/// <summary>
/// day number goes before month number
/// </summary>
UK_DATE,
///// <summary>
///// time is specifed through AM or PM
///// </summary>
//USA_TIME,
}
#endregion
#region parsing derived methods for DateTime output
/// <summary>
/// Tries to find date and time within the passed string and return it as DateTime structure.
/// </summary>
/// <param name="str">string that contains date and/or time</param>
/// <param name="default_format">format to be used preferably in ambivalent instances</param>
/// <param name="date_time">parsed date-time output</param>
/// <returns>true if both date and time were found, else false</returns>
static public bool TryParseDateTime(this string str, DateTimeFormat default_format, out DateTime date_time)
{
ParsedDateTime parsed_date_time;
if (!TryParseDateTime(str, default_format, out parsed_date_time))
{
date_time = new DateTime(1, 1, 1);
return false;
}
date_time = parsed_date_time.DateTime;
return true;
}
/// <summary>
/// Tries to find date and/or time within the passed string and return it as DateTime structure.
/// If only date was found, time in the returned DateTime is always 0:0:0.
/// If only time was found, date in the returned DateTime is DefaultDate.
/// </summary>
/// <param name="str">string that contains date and(or) time</param>
/// <param name="default_format">format to be used preferably in ambivalent instances</param>
/// <param name="date_time">parsed date-time output</param>
/// <returns>true if date and/or time was found, else false</returns>
static public bool TryParseDateOrTime(this string str, DateTimeFormat default_format, out DateTime date_time)
{
ParsedDateTime parsed_date_time;
if (!TryParseDateOrTime(str, default_format, out parsed_date_time))
{
date_time = new DateTime(1, 1, 1);
return false;
}
date_time = parsed_date_time.DateTime;
return true;
}
/// <summary>
/// Tries to find time within the passed string and return it as DateTime structure.
/// It recognizes only time while ignoring date, so date in the returned DateTime is always 1/1/1.
/// </summary>
/// <param name="str">string that contains time</param>
/// <param name="default_format">format to be used preferably in ambivalent instances</param>
/// <param name="time">parsed time output</param>
/// <returns>true if time was found, else false</returns>
public static bool TryParseTime(this string str, DateTimeFormat default_format, out DateTime time)
{
ParsedDateTime parsed_time;
if (!TryParseTime(str, default_format, out parsed_time, null))
{
time = new DateTime(1, 1, 1);
return false;
}
time = parsed_time.DateTime;
return true;
}
/// <summary>
/// Tries to find date within the passed string and return it as DateTime structure.
/// It recognizes only date while ignoring time, so time in the returned DateTime is always 0:0:0.
/// If year of the date was not found then it accepts the current year.
/// </summary>
/// <param name="str">string that contains date</param>
/// <param name="default_format">format to be used preferably in ambivalent instances</param>
/// <param name="date">parsed date output</param>
/// <returns>true if date was found, else false</returns>
static public bool TryParseDate(this string str, DateTimeFormat default_format, out DateTime date)
{
ParsedDateTime parsed_date;
if (!TryParseDate(str, default_format, out parsed_date))
{
date = new DateTime(1, 1, 1);
return false;
}
date = parsed_date.DateTime;
return true;
}
#endregion
#region parsing derived methods for ParsedDateTime output
/// <summary>
/// Tries to find date and time within the passed string and return it as ParsedDateTime object.
/// </summary>
/// <param name="str">string that contains date-time</param>
/// <param name="default_format">format to be used preferably in ambivalent instances</param>
/// <param name="parsed_date_time">parsed date-time output</param>
/// <returns>true if both date and time were found, else false</returns>
static public bool TryParseDateTime(this string str, DateTimeFormat default_format, out ParsedDateTime parsed_date_time)
{
if (DateTimeRoutines.TryParseDateOrTime(str, default_format, out parsed_date_time)
&& parsed_date_time.IsDateFound
&& parsed_date_time.IsTimeFound
)
return true;
parsed_date_time = null;
return false;
}
/// <summary>
/// Tries to find time within the passed string and return it as ParsedDateTime object.
/// It recognizes only time while ignoring date, so date in the returned ParsedDateTime is always 1/1/1
/// </summary>
/// <param name="str">string that contains date-time</param>
/// <param name="default_format">format to be used preferably in ambivalent instances</param>
/// <param name="parsed_time">parsed date-time output</param>
/// <returns>true if time was found, else false</returns>
static public bool TryParseTime(this string str, DateTimeFormat default_format, out ParsedDateTime parsed_time)
{
return TryParseTime(str, default_format, out parsed_time, null);
}
/// <summary>
/// Tries to find date and/or time within the passed string and return it as ParsedDateTime object.
/// If only date was found, time in the returned ParsedDateTime is always 0:0:0.
/// If only time was found, date in the returned ParsedDateTime is DefaultDate.
/// </summary>
/// <param name="str">string that contains date-time</param>
/// <param name="default_format">format to be used preferably in ambivalent instances</param>
/// <param name="parsed_date_time">parsed date-time output</param>
/// <returns>true if date or time was found, else false</returns>
static public bool TryParseDateOrTime(this string str, DateTimeFormat default_format, out ParsedDateTime parsed_date_time)
{
parsed_date_time = null;
ParsedDateTime parsed_date;
ParsedDateTime parsed_time;
if (!TryParseDate(str, default_format, out parsed_date))
{
if (!TryParseTime(str, default_format, out parsed_time, null))
return false;
DateTime date_time = new DateTime(DefaultDate.Year, DefaultDate.Month, DefaultDate.Day, parsed_time.DateTime.Hour, parsed_time.DateTime.Minute, parsed_time.DateTime.Second);
parsed_date_time = new ParsedDateTime(-1, -1, parsed_time.IndexOfTime, parsed_time.LengthOfTime, date_time, parsed_time.UtcOffset);
}
else
{
if (!TryParseTime(str, default_format, out parsed_time, parsed_date))
{
DateTime date_time = new DateTime(parsed_date.DateTime.Year, parsed_date.DateTime.Month, parsed_date.DateTime.Day, 0, 0, 0);
parsed_date_time = new ParsedDateTime(parsed_date.IndexOfDate, parsed_date.LengthOfDate, -1, -1, date_time);
}
else
{
DateTime date_time = new DateTime(parsed_date.DateTime.Year, parsed_date.DateTime.Month, parsed_date.DateTime.Day, parsed_time.DateTime.Hour, parsed_time.DateTime.Minute, parsed_time.DateTime.Second);
parsed_date_time = new ParsedDateTime(parsed_date.IndexOfDate, parsed_date.LengthOfDate, parsed_time.IndexOfTime, parsed_time.LengthOfTime, date_time, parsed_time.UtcOffset);
}
}
return true;
}
#endregion
#region parsing base methods
/// <summary>
/// Tries to find time within the passed string (relatively to the passed parsed_date if any) and return it as ParsedDateTime object.
/// It recognizes only time while ignoring date, so date in the returned ParsedDateTime is always 1/1/1
/// </summary>
/// <param name="str">string that contains date</param>
/// <param name="default_format">format to be used preferably in ambivalent instances</param>
/// <param name="parsed_time">parsed date-time output</param>
/// <param name="parsed_date">ParsedDateTime object if the date was found within this string, else NULL</param>
/// <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)
{
parsed_time = null;
string time_zone_r;
if(default_format == DateTimeFormat.USA_DATE)
time_zone_r = @"(?:\s*(?'time_zone'UTC|GMT|CST|EST))?";
else
time_zone_r = @"(?:\s*(?'time_zone'UTC|GMT))?";
Match m;
if (parsed_date != null && parsed_date.IndexOfDate > -1)
{//look around the found date
//look for <date> hh:mm:ss <UTC offset>
m = Regex.Match(str.Substring(parsed_date.IndexOfDate + parsed_date.LengthOfDate), @"(?<=^\s*,?\s+|^\s*at\s*|^\s*[T\-]\s*)(?'hour'\d{2})\s*:\s*(?'minute'\d{2})\s*:\s*(?'second'\d{2})\s+(?'offset_sign'[\+\-])(?'offset_hh'\d{2}):?(?'offset_mm'\d{2})(?=$|[^\d\w])", RegexOptions.Compiled);
if (!m.Success)
//look for <date> [h]h:mm[:ss] [PM/AM] [UTC/GMT]
m = Regex.Match(str.Substring(parsed_date.IndexOfDate + parsed_date.LengthOfDate), @"(?<=^\s*,?\s+|^\s*at\s*|^\s*[T\-]\s*)(?'hour'\d{1,2})\s*:\s*(?'minute'\d{2})\s*(?::\s*(?'second'\d{2}))?(?:\s*(?'ampm'AM|am|PM|pm))?"+time_zone_r+@"(?=$|[^\d\w])", RegexOptions.Compiled);
if (!m.Success)
//look for [h]h:mm:ss [PM/AM] [UTC/GMT] <date>
m = Regex.Match(str.Substring(0, parsed_date.IndexOfDate), @"(?<=^|[^\d])(?'hour'\d{1,2})\s*:\s*(?'minute'\d{2})\s*(?::\s*(?'second'\d{2}))?(?:\s*(?'ampm'AM|am|PM|pm))?"+time_zone_r+@"(?=$|[\s,]+)", RegexOptions.Compiled);
if (!m.Success)
//look for [h]h:mm:ss [PM/AM] [UTC/GMT] within <date>
m = Regex.Match(str.Substring(parsed_date.IndexOfDate, parsed_date.LengthOfDate), @"(?<=^|[^\d])(?'hour'\d{1,2})\s*:\s*(?'minute'\d{2})\s*(?::\s*(?'second'\d{2}))?(?:\s*(?'ampm'AM|am|PM|pm))?"+time_zone_r+@"(?=$|[\s,]+)", RegexOptions.Compiled);
}
else//look anywhere within string
{
//look for hh:mm:ss <UTC offset>
m = Regex.Match(str, @"(?<=^|\s+|\s*T\s*)(?'hour'\d{2})\s*:\s*(?'minute'\d{2})\s*:\s*(?'second'\d{2})\s+(?'offset_sign'[\+\-])(?'offset_hh'\d{2}):?(?'offset_mm'\d{2})?(?=$|[^\d\w])", RegexOptions.Compiled);
if (!m.Success)
//look for [h]h:mm[:ss] [PM/AM] [UTC/GMT]
m = Regex.Match(str, @"(?<=^|\s+|\s*T\s*)(?'hour'\d{1,2})\s*:\s*(?'minute'\d{2})\s*(?::\s*(?'second'\d{2}))?(?:\s*(?'ampm'AM|am|PM|pm))?"+time_zone_r+@"(?=$|[^\d\w])", RegexOptions.Compiled);
}
if (!m.Success)
return false;
//try
//{
int hour = int.Parse(m.Groups["hour"].Value);
if (hour < 0 || hour > 23)
return false;
int minute = int.Parse(m.Groups["minute"].Value);
if (minute < 0 || minute > 59)
return false;
int second = 0;
if (!string.IsNullOrEmpty(m.Groups["second"].Value))
{
second = int.Parse(m.Groups["second"].Value);
if (second < 0 || second > 59)
return false;
}
if (string.Compare(m.Groups["ampm"].Value, "PM", true) == 0 && hour < 12)
hour += 12;
else if (string.Compare(m.Groups["ampm"].Value, "AM", true) == 0 && hour == 12)
hour -= 12;
DateTime date_time = new DateTime(1, 1, 1, hour, minute, second);
if (m.Groups["offset_hh"].Success)
{
int offset_hh = int.Parse(m.Groups["offset_hh"].Value);
int offset_mm = 0;
if (m.Groups["offset_mm"].Success)
offset_mm = int.Parse(m.Groups["offset_mm"].Value);
TimeSpan utc_offset = new TimeSpan(offset_hh, offset_mm, 0);
if (m.Groups["offset_sign"].Value == "-")
utc_offset = -utc_offset;
parsed_time = new ParsedDateTime(-1, -1, m.Index, m.Length, date_time, utc_offset);
return true;
}
if (m.Groups["time_zone"].Success)
{
TimeSpan utc_offset;
switch (m.Groups["time_zone"].Value)
{
case "UTC":
case "GMT":
utc_offset = new TimeSpan(0, 0, 0);
break;
case "CST":
utc_offset = new TimeSpan(-6, 0, 0);
break;
case "EST":
utc_offset = new TimeSpan(-5, 0, 0);
break;
default:
throw new Exception("Time zone: " + m.Groups["time_zone"].Value + " is not defined.");
}
parsed_time = new ParsedDateTime(-1, -1, m.Index, m.Length, date_time, utc_offset);
return true;
}
parsed_time = new ParsedDateTime(-1, -1, m.Index, m.Length, date_time);
//}
//catch(Exception e)
//{
// return false;
//}
return true;
}
/// <summary>
/// Tries to find date within the passed string and return it as ParsedDateTime object.
/// It recognizes only date while ignoring time, so time in the returned ParsedDateTime is always 0:0:0.
/// If year of the date was not found then it accepts the current year.
/// </summary>
/// <param name="str">string that contains date</param>
/// <param name="default_format">format to be used preferably in ambivalent instances</param>
/// <param name="parsed_date">parsed date output</param>
/// <returns>true if date was found, else false</returns>
static public bool TryParseDate(this string str, DateTimeFormat default_format, out ParsedDateTime parsed_date)
{
parsed_date = null;
if (string.IsNullOrEmpty(str))
return false;
//look for dd/mm/yy
Match m = Regex.Match(str, @"(?<=^|[^\d])(?'day'\d{1,2})\s*(?'separator'[\\/\.])+\s*(?'month'\d{1,2})\s*\'separator'+\s*(?'year'\d{2}|\d{4})(?=$|[^\d])", RegexOptions.Compiled | RegexOptions.IgnoreCase);
if (m.Success)
{
DateTime date;
if ((default_format ^ DateTimeFormat.USA_DATE) == DateTimeFormat.USA_DATE)
{
if (!convert_to_date(int.Parse(m.Groups["year"].Value), int.Parse(m.Groups["day"].Value), int.Parse(m.Groups["month"].Value), out date))
return false;
}
else
{
if (!convert_to_date(int.Parse(m.Groups["year"].Value), int.Parse(m.Groups["month"].Value), int.Parse(m.Groups["day"].Value), out date))
return false;
}
parsed_date = new ParsedDateTime(m.Index, m.Length, -1, -1, date);
return true;
}
//look for [yy]yy-mm-dd
m = Regex.Match(str, @"(?<=^|[^\d])(?'year'\d{2}|\d{4})\s*(?'separator'[\-])\s*(?'month'\d{1,2})\s*\'separator'+\s*(?'day'\d{1,2})(?=$|[^\d])", RegexOptions.Compiled | RegexOptions.IgnoreCase);
if (m.Success)
{
DateTime date;
if (!convert_to_date(int.Parse(m.Groups["year"].Value), int.Parse(m.Groups["month"].Value), int.Parse(m.Groups["day"].Value), out date))
return false;
parsed_date = new ParsedDateTime(m.Index, m.Length, -1, -1, date);
return true;
}
//look for month dd yyyy
m = Regex.Match(str, @"(?:^|[^\d\w])(?'month'Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)[uarychilestmbro]*\s+(?'day'\d{1,2})(?:-?st|-?th|-?rd|-?nd)?\s*,?\s*(?'year'\d{4})(?=$|[^\d\w])", RegexOptions.Compiled | RegexOptions.IgnoreCase);
if (!m.Success)
//look for dd month [yy]yy
m = Regex.Match(str, @"(?:^|[^\d\w:])(?'day'\d{1,2})(?:-?st\s+|-?th\s+|-?rd\s+|-?nd\s+|-|\s+)(?'month'Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)[uarychilestmbro]*(?:\s*,?\s*|-)'?(?'year'\d{2}|\d{4})(?=$|[^\d\w])", RegexOptions.Compiled | RegexOptions.IgnoreCase);
if (!m.Success)
//look for yyyy month dd
m = Regex.Match(str, @"(?:^|[^\d\w])(?'year'\d{4})\s+(?'month'Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)[uarychilestmbro]*\s+(?'day'\d{1,2})(?:-?st|-?th|-?rd|-?nd)?(?=$|[^\d\w])", RegexOptions.Compiled | RegexOptions.IgnoreCase);
if (!m.Success)
//look for month dd hh:mm:ss MDT|UTC yyyy
m = Regex.Match(str, @"(?:^|[^\d\w])(?'month'Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)[uarychilestmbro]*\s+(?'day'\d{1,2})\s+\d{2}\:\d{2}\:\d{2}\s+(?:MDT|UTC)\s+(?'year'\d{4})(?=$|[^\d\w])", RegexOptions.Compiled | RegexOptions.IgnoreCase);
if (!m.Success)
//look for month dd [yyyy]
m = Regex.Match(str, @"(?:^|[^\d\w])(?'month'Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)[uarychilestmbro]*\s+(?'day'\d{1,2})(?:-?st|-?th|-?rd|-?nd)?(?:\s*,?\s*(?'year'\d{4}))?(?=$|[^\d\w])", RegexOptions.Compiled | RegexOptions.IgnoreCase);
if (m.Success)
{
int month = -1;
int index_of_date = m.Index;
int length_of_date = m.Length;
switch (m.Groups["month"].Value)
{
case "Jan":
case "JAN":
month = 1;
break;
case "Feb":
case "FEB":
month = 2;
break;
case "Mar":
case "MAR":
month = 3;
break;
case "Apr":
case "APR":
month = 4;
break;
case "May":
case "MAY":
month = 5;
break;
case "Jun":
case "JUN":
month = 6;
break;
case "Jul":
month = 7;
break;
case "Aug":
case "AUG":
month = 8;
break;
case "Sep":
case "SEP":
month = 9;
break;
case "Oct":
case "OCT":
month = 10;
break;
case "Nov":
case "NOV":
month = 11;
break;
case "Dec":
case "DEC":
month = 12;
break;
}
int year;
if (!string.IsNullOrEmpty(m.Groups["year"].Value))
year = int.Parse(m.Groups["year"].Value);
else
year = DefaultDate.Year;
DateTime date;
if (!convert_to_date(year, month, int.Parse(m.Groups["day"].Value), out date))
return false;
parsed_date = new ParsedDateTime(index_of_date, length_of_date, -1, -1, date);
return true;
}
return false;
}
static bool convert_to_date(int year, int month, int day, out DateTime date)
{
if (year >= 100)
{
if (year < 1000)
{
date = new DateTime(1, 1, 1);
return false;
}
}
else
if (year > 30)
year += 1900;
else
year += 2000;
try
{
date = new DateTime(year, month, day);
}
catch
{
date = new DateTime(1, 1, 1);
return false;
}
return true;
}
#endregion
}
}

View File

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

View File

Before

Width:  |  Height:  |  Size: 6.1 KiB

After

Width:  |  Height:  |  Size: 6.1 KiB

View File

Before

Width:  |  Height:  |  Size: 6.5 KiB

After

Width:  |  Height:  |  Size: 6.5 KiB

View File

Before

Width:  |  Height:  |  Size: 8.8 KiB

After

Width:  |  Height:  |  Size: 8.8 KiB

View File

Before

Width:  |  Height:  |  Size: 9.6 KiB

After

Width:  |  Height:  |  Size: 9.6 KiB

View File

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

View File

Before

Width:  |  Height:  |  Size: 2.2 KiB

After

Width:  |  Height:  |  Size: 2.2 KiB

View File

Before

Width:  |  Height:  |  Size: 3.1 KiB

After

Width:  |  Height:  |  Size: 3.1 KiB

View File

Before

Width:  |  Height:  |  Size: 3.3 KiB

After

Width:  |  Height:  |  Size: 3.3 KiB

View File

Before

Width:  |  Height:  |  Size: 2.2 KiB

After

Width:  |  Height:  |  Size: 2.2 KiB

View File

Before

Width:  |  Height:  |  Size: 19 KiB

After

Width:  |  Height:  |  Size: 19 KiB

View File

Before

Width:  |  Height:  |  Size: 8.2 KiB

After

Width:  |  Height:  |  Size: 8.2 KiB

View File

Before

Width:  |  Height:  |  Size: 60 KiB

After

Width:  |  Height:  |  Size: 60 KiB

View File

@@ -0,0 +1 @@
span.multiselect-native-select{position:relative}span.multiselect-native-select select{border:0!important;clip:rect(0 0 0 0)!important;height:1px!important;margin:-1px -1px -1px -3px!important;overflow:hidden!important;padding:0!important;position:absolute!important;width:1px!important;left:50%;top:30px}.multiselect-container{position:absolute;list-style-type:none;margin:0;padding:0}.multiselect-container .input-group{margin:5px}.multiselect-container>li{padding:0}.multiselect-container>li>a.multiselect-all label{font-weight:700}.multiselect-container>li.multiselect-group label{margin:0;padding:3px 20px 3px 20px;height:100%;font-weight:700}.multiselect-container>li.multiselect-group-clickable label{cursor:pointer}.multiselect-container>li>a{padding:0}.multiselect-container>li>a>label{margin:0;height:100%;cursor:pointer;font-weight:400;padding:3px 20px 3px 40px}.multiselect-container>li>a>label.radio,.multiselect-container>li>a>label.checkbox{margin:0}.multiselect-container>li>a>label>input[type=checkbox]{margin-bottom:5px}.btn-group>.btn-group:nth-child(2)>.multiselect.btn{border-top-left-radius:4px;border-bottom-left-radius:4px}.form-inline .multiselect-container label.checkbox,.form-inline .multiselect-container label.radio{padding:3px 20px 3px 40px}.form-inline .multiselect-container li a label.checkbox input[type=checkbox],.form-inline .multiselect-container li a label.radio input[type=radio]{margin-left:-20px;margin-right:0}

View File

@@ -1,275 +1,275 @@
body {
background-image: url("binding_dark.png");
background-repeat: repeat;
}
#page {
border-radius: 6px;
background-color: white;
max-width: 900px;
margin: 0 auto;
margin-top: 30px;
padding: 20px;
margin-bottom: 100px;
}
.container-fluid {
}
#templates {
display: none;
}
#indexers {
text-align: center;
margin-top: 30px;
}
.indexer-table {
text-align: left;
}
.test-success {
color: #449d44;
}
.test-error {
color: #c9302c;
}
.test-inprogress {
color: #286090;
}
.indexer-buttons {
text-align: center;
}
.indexer-buttons > .btn {
margin-bottom: 2px;
}
.indexer-button-test {
width: 60px;
}
.setup-item-inputstring {
max-width: 255px;
}
.setup-item-inputbool input {
max-width: 100px;
height: 20px;
}
.setup-item-inputselect {
max-width: 255px;
}
[data-type=hiddendata]{
display: none;
}
.spinner {
-webkit-animation: spin 2s infinite linear;
-moz-animation: spin 2s infinite linear;
-o-animation: spin 2s infinite linear;
animation: spin 2s infinite linear;
}
@-moz-keyframes spin {
from {
-moz-transform: rotate(0deg);
}
to {
-moz-transform: rotate(360deg);
}
}
@-webkit-keyframes spin {
from {
-webkit-transform: rotate(0deg);
}
to {
-webkit-transform: rotate(360deg);
}
}
@keyframes spin {
from {
transform: rotate(0deg);
}
to {
transform: rotate(360deg);
}
}
#setup-indexer-go {
width: 70px;
}
hr {
border-top-color: #cdcdcd;
}
.input-area {
margin: 4px 0px;
}
.input-area > * {
vertical-align: middle;
}
.input-area > p {
margin-top: 10px;
}
.input-header {
font-size: 18px;
width: 160px;
display: inline-block;
}
.input-right {
width: 300px;
display: inline-block;
font-family: monospace;
}
#sonarr-warning {
display: none;
}
#logo {
max-width: 50px;
}
#header-title {
font-size: 34px;
vertical-align: middle;
padding-left: 15px;
}
#footer {
color: #444444;
margin: 0 auto;
margin-top: 10px;
text-align: center;
}
#jackett-allowext, #jackett-allowupdate, #jackett-logging, #jackett-prerelease {
width: 25px;
}
.modal-fillwidth {
width: 1200px;
min-width:80%;
}
.indexer-caps {
padding: 0px 15px 15px 15px;
border-top: 1px solid #e5e5e5;
}
.indexer-caps table {
border-bottom: 1px solid #ddd;
}
.jackettlogWarn {
background-color: #FFFF8E !important;
}
.jackettlogError {
background-color: #FF6060 !important;
}
.jackettdownloaded {
color: blueviolet;
}
.jacketdownloadlocal {
padding-left: 10px;
}
.downloadcolumn {
text-align:center;
}
pre {
display: block;
padding: 3px;
margin: 0 0 0px;
font-size: 13px;
line-height: 1.42857143;
color: #333;
word-break: break-all;
word-wrap: break-word;
background-color: transparent;
border: 0px;
border-radius: 0px;
}
.modal-open .modal {
overflow-x: auto; /* Model can be bigger than the screen on mobiles */
}
.dataTables_filter input {
width: 400px
}
#unconfigured-indexers-template {
display: none;
}
.jackett-apikey{
margin-top: 10px;
}
.jackett-apikey .input-header{
width: 80px;
}
.setup-item-displayinfo:empty {
display: none;
}
table td.fit{
white-space: nowrap;
width: 1%;
}
.label-imdb {
background-color: #d0ab44;
}
.tooltip-inner {
max-width: 500px !important;
}
.tooltip-inner img {
max-width: 250px;
height: auto;
}
.type-public {
color: #449d44
}
.type-private {
color: #c9302c
}
.type-semi-private {
color: #ec971f
}
.dataTables_deadfilter {
float: right;
text-align: right;
margin-right: 1em;
}
input#searchquery{
width:400px;
}
body {
background-image: url("binding_dark.png");
background-repeat: repeat;
}
#page {
border-radius: 6px;
background-color: white;
max-width: 900px;
margin: 0 auto;
margin-top: 30px;
padding: 20px;
margin-bottom: 100px;
}
.container-fluid {
}
#templates {
display: none;
}
#indexers {
text-align: center;
margin-top: 30px;
}
.indexer-table {
text-align: left;
}
.test-success {
color: #449d44;
}
.test-error {
color: #c9302c;
}
.test-inprogress {
color: #286090;
}
.indexer-buttons {
text-align: center;
}
.indexer-buttons > .btn {
margin-bottom: 2px;
}
.indexer-button-test {
width: 60px;
}
.setup-item-inputstring {
max-width: 255px;
}
.setup-item-inputbool input {
max-width: 100px;
height: 20px;
}
.setup-item-inputselect {
max-width: 255px;
}
[data-type=hiddendata]{
display: none;
}
.spinner {
-webkit-animation: spin 2s infinite linear;
-moz-animation: spin 2s infinite linear;
-o-animation: spin 2s infinite linear;
animation: spin 2s infinite linear;
}
@-moz-keyframes spin {
from {
-moz-transform: rotate(0deg);
}
to {
-moz-transform: rotate(360deg);
}
}
@-webkit-keyframes spin {
from {
-webkit-transform: rotate(0deg);
}
to {
-webkit-transform: rotate(360deg);
}
}
@keyframes spin {
from {
transform: rotate(0deg);
}
to {
transform: rotate(360deg);
}
}
#setup-indexer-go {
width: 70px;
}
hr {
border-top-color: #cdcdcd;
}
.input-area {
margin: 4px 0px;
}
.input-area > * {
vertical-align: middle;
}
.input-area > p {
margin-top: 10px;
}
.input-header {
font-size: 18px;
width: 160px;
display: inline-block;
}
.input-right {
width: 300px;
display: inline-block;
font-family: monospace;
}
#sonarr-warning {
display: none;
}
#logo {
max-width: 50px;
}
#header-title {
font-size: 34px;
vertical-align: middle;
padding-left: 15px;
}
#footer {
color: #444444;
margin: 0 auto;
margin-top: 10px;
text-align: center;
}
#jackett-allowext, #jackett-allowupdate, #jackett-logging, #jackett-prerelease {
width: 25px;
}
.modal-fillwidth {
width: 1200px;
min-width:80%;
}
.indexer-caps {
padding: 0px 15px 15px 15px;
border-top: 1px solid #e5e5e5;
}
.indexer-caps table {
border-bottom: 1px solid #ddd;
}
.jackettlogWarn {
background-color: #FFFF8E !important;
}
.jackettlogError {
background-color: #FF6060 !important;
}
.jackettdownloaded {
color: blueviolet;
}
.jacketdownloadlocal {
padding-left: 10px;
}
.downloadcolumn {
text-align:center;
}
pre {
display: block;
padding: 3px;
margin: 0 0 0px;
font-size: 13px;
line-height: 1.42857143;
color: #333;
word-break: break-all;
word-wrap: break-word;
background-color: transparent;
border: 0px;
border-radius: 0px;
}
.modal-open .modal {
overflow-x: auto; /* Model can be bigger than the screen on mobiles */
}
.dataTables_filter input {
width: 400px
}
#unconfigured-indexers-template {
display: none;
}
.jackett-apikey{
margin-top: 10px;
}
.jackett-apikey .input-header{
width: 80px;
}
.setup-item-displayinfo:empty {
display: none;
}
table td.fit{
white-space: nowrap;
width: 1%;
}
.label-imdb {
background-color: #d0ab44;
}
.tooltip-inner {
max-width: 500px !important;
}
.tooltip-inner img {
max-width: 250px;
height: auto;
}
.type-public {
color: #449d44
}
.type-private {
color: #c9302c
}
.type-semi-private {
color: #ec971f
}
.dataTables_deadfilter {
float: right;
text-align: right;
margin-right: 1em;
}
input#searchquery{
width:400px;
}

View File

@@ -24,7 +24,8 @@ $.fn.focusWithoutScrolling = function () {
$(document).ready(function () {
$.ajaxSetup({ cache: false });
window.jackettIsLocal = window.location.hostname === '127.0.0.1';
//window.jackettIsLocal = window.location.hostname === '127.0.0.1';
window.jackettIsLocal = false; // reCaptcha can't be solved via 127.0.0.1 anymore. This loophold was fixed by google around 2.10.2017
Handlebars.registerHelper('if_eq', function(a, b, opts) {
if (a == b)
@@ -65,6 +66,13 @@ function loadJackettSettings() {
$(".api-key-text").text(data.api_key);
$("#app-version").html(data.app_version);
$("#jackett-port").val(data.port);
$("#jackett-proxy-type").val(data.proxy_type);
$("#jackett-proxy-url").val(data.proxy_url);
$("#jackett-proxy-port").val(data.proxy_port);
$("#jackett-proxy-username").val(data.proxy_username);
$("#jackett-proxy-password").val(data.proxy_password);
$("#jackett-basepathoverride").val(data.basepathoverride);
basePath = data.basepathoverride;
if (basePath === null || basePath === undefined) {
@@ -102,6 +110,7 @@ function reloadIndexers() {
unconfiguredIndexers = [];
for (var i = 0; i < data.length; i++) {
var item = data[i];
item.rss_host = resolveUrl(basePath + "/api/v2.0/indexers/" + item.id + "/results/torznab/api?apikey=" + api.key + "&t=search&cat=&q=");
item.torznab_host = resolveUrl(basePath + "/api/v2.0/indexers/" + item.id + "/results/torznab/");
item.potato_host = resolveUrl(basePath + "/api/v2.0/indexers/" + item.id + "/results/potato/");
@@ -111,16 +120,16 @@ function reloadIndexers() {
item.state = "success";
if (item.type == "public") {
item.type_icon_content = "🔓\uFE0E";
item.type_label = "success";
}
else if (item.type == "private") {
item.type_icon_content = "🔐\uFE0E";
item.type_label = "danger";
}
else if (item.type == "semi-private") {
item.type_icon_content = "🔒\uFE0E";
item.type_label = "warning";
}
else {
item.type_icon_content = "";
item.type_label = "default";
}
var main_cats_list = item.caps.filter(function(c) {
@@ -187,7 +196,7 @@ function displayUnconfiguredIndexersList() {
var indexer = unconfiguredIndexers[i];
$(btn).click(function () {
$('#select-indexer-modal').modal('hide').on('hidden.bs.modal', function (e) {
displayIndexerSetup(indexer.id, indexer.name, indexer.caps, indexer.link, indexer.alternativesitelinks);
displayIndexerSetup(indexer.id, indexer.name, indexer.caps, indexer.link, indexer.alternativesitelinks, indexer.description);
});
});
});
@@ -378,7 +387,7 @@ function prepareSetupButtons(element) {
element.find('.indexer-setup').each(function (i, btn) {
var indexer = configuredIndexers[i];
$(btn).click(function () {
displayIndexerSetup(indexer.id, indexer.name, indexer.caps, indexer.link, indexer.alternativesitelinks);
displayIndexerSetup(indexer.id, indexer.name, indexer.caps, indexer.link, indexer.alternativesitelinks, indexer.description);
});
});
}
@@ -456,14 +465,14 @@ function prepareTestButtons(element) {
});
}
function displayIndexerSetup(id, name, caps, link, alternativesitelinks) {
function displayIndexerSetup(id, name, caps, link, alternativesitelinks, description) {
api.getIndexerConfig(id, function (data) {
if (data.result !== undefined && data.result == "error") {
doNotify("Error: " + data.error, "danger", "glyphicon glyphicon-alert");
return;
}
populateSetupForm(id, name, data, caps, link, alternativesitelinks);
populateSetupForm(id, name, data, caps, link, alternativesitelinks, description);
}).fail(function () {
doNotify("Request to Jackett server failed", "danger", "glyphicon glyphicon-alert");
});
@@ -539,9 +548,9 @@ function populateConfigItems(configForm, config) {
}
}
function newConfigModal(title, config, caps, link, alternativesitelinks) {
function newConfigModal(title, config, caps, link, alternativesitelinks, description) {
var configTemplate = Handlebars.compile($("#jackett-config-setup-modal").html());
var configForm = $(configTemplate({ title: title, caps: caps, link:link }));
var configForm = $(configTemplate({ title: title, caps: caps, link: link, description: description }));
$("#modals").append(configForm);
populateConfigItems(configForm, config);
@@ -549,6 +558,10 @@ function newConfigModal(title, config, caps, link, alternativesitelinks) {
var AlternativeSiteLinksTemplate = Handlebars.compile($("#setup-item-alternativesitelinks").html());
var template = $(AlternativeSiteLinksTemplate({ "alternativesitelinks": alternativesitelinks }));
configForm.find("div[data-id='sitelink']").after(template);
template.find("a.alternativesitelink").click(function (a) {
$("div[data-id='sitelink'] input").val(this.href);
return false;
});
}
return configForm;
@@ -598,8 +611,8 @@ function getConfigModalJson(configForm) {
return configJson;
}
function populateSetupForm(indexerId, name, config, caps, link, alternativesitelinks) {
var configForm = newConfigModal(name, config, caps, link, alternativesitelinks);
function populateSetupForm(indexerId, name, config, caps, link, alternativesitelinks, description) {
var configForm = newConfigModal(name, config, caps, link, alternativesitelinks, description);
var $goButton = configForm.find(".setup-indexer-go");
$goButton.click(function () {
var data = getConfigModalJson(configForm);
@@ -724,6 +737,9 @@ function updateReleasesRow(row)
}
function showSearch(selectedIndexer, query, category) {
var selectedIndexers = []
if (selectedIndexer)
selectedIndexers = selectedIndexer.split(",");
$('#select-indexer-modal').remove();
var releaseTemplate = Handlebars.compile($("#jackett-search").html());
var releaseDialog = $(releaseTemplate({
@@ -741,28 +757,30 @@ function showSearch(selectedIndexer, query, category) {
window.location.hash = '';
}) ;
var setCategories = function (tracker, items) {
var setCategories = function (trackers, items) {
var cats = {};
for (var i = 0; i < items.length; i++) {
if (items[i].configured === true && (items[i].id === tracker || tracker === '')) {
indexers["'" + items[i].id + "'"] = items[i].name;
for (var prop in items[i].caps) {
if (prop < 100000 || tracker)
cats[prop] = items[i].caps[prop];
if (trackers.length == 0 || $.inArray(items[i].id, trackers) !== -1) {
for (var j in items[i].caps) {
var cat = items[i].caps[j]
if (cat.ID < 100000 || trackers.length == 1)
cats[cat.ID] = cat.Name;
}
}
}
var select = $('#searchCategory');
select.html("<option value=''>-- All --</option>");
$.each(cats, function (index, value) {
select.append($("<option></option>")
.attr("value", value["ID"]).text(value["ID"] + ' (' + value["Name"] + ')'));
var selected = select.val();
var options = []
$.each(cats, function (ID, Name) {
options.push({ label: ID + ' (' + Name + ')', value: ID });
});
select.multiselect('dataprovider', options);
select.val(selected).multiselect("refresh");
};
$('#searchTracker').change(jQuery.proxy(function () {
var trackerId = $('#searchTracker').val();
setCategories(trackerId, this.items);
var trackerIds = $('#searchTracker').val();
setCategories(trackerIds, this.items);
}, { items: configuredIndexers }));
var queryField = document.getElementById("searchquery");
@@ -783,18 +801,16 @@ function showSearch(selectedIndexer, query, category) {
var queryObj = {
Query: searchString,
Category: releaseDialog.find('#searchCategory').val(),
Tracker: releaseDialog.find('#searchTracker').val().replace("'", "").replace("'", ""),
Tracker: releaseDialog.find('#searchTracker').val()
};
window.location.hash = $.param({ search: queryObj.Query, tracker: queryObj.Tracker, category: queryObj.Category});
window.location.hash = $.param({ search: queryObj.Query, tracker: queryObj.Tracker.join(","), category: queryObj.Category.join(",") });
$('#jackett-search-perform').html($('#spinner').html());
$('#searchResults div.dataTables_filter input').val("");
clearSearchResultTable($('#searchResults'));
var trackerId = queryObj.Tracker;
if (trackerId == null || trackerId == "")
trackerId = "all";
var trackerId = "all";
api.resultsForIndexer(trackerId, queryObj, function (data) {
for (var i = 0; i < data.Results.length; i++) {
var item = data.Results[i];
@@ -814,18 +830,36 @@ function showSearch(selectedIndexer, query, category) {
});
var searchTracker = releaseDialog.find("#searchTracker");
if (selectedIndexer)
searchTracker.val(selectedIndexer);
var searchCategory = releaseDialog.find('#searchCategory')
searchCategory.multiselect({
maxHeight: 400,
enableFiltering: true,
includeSelectAllOption: true,
enableCaseInsensitiveFiltering: true,
nonSelectedText: 'Any'
});
if (selectedIndexers)
searchTracker.val(selectedIndexers);
searchTracker.trigger("change");
updateSearchResultTable($('#searchResults'), []);
clearSearchResultTable($('#searchResults'));
releaseDialog.modal("show");
searchTracker.multiselect({
maxHeight: 400,
enableFiltering: true,
includeSelectAllOption: true,
enableCaseInsensitiveFiltering: true,
nonSelectedText: 'All'
});
if (category !== undefined) {
$('#searchCategory').val(category);
searchCategory.val(category.split(","));
searchCategory.multiselect("refresh");
}
releaseDialog.modal("show");
if (query !== undefined) {
queryField.value = query;
searchButton.click();
@@ -1100,6 +1134,13 @@ function bindUIButtons() {
var jackett_prerelease = $("#jackett-prerelease").is(':checked');
var jackett_logging = $("#jackett-logging").is(':checked');
var jackett_omdb_key = $("#jackett-omdbkey").val();
var jackett_proxy_url = $("#jackett-proxy-url").val();
var jackett_proxy_type = $("#jackett-proxy-type").val();
var jackett_proxy_port = $("#jackett-proxy-port").val();
var jackett_proxy_username = $("#jackett-proxy-username").val();
var jackett_proxy_password = $("#jackett-proxy-password").val();
var jsonObject = {
port: jackett_port,
external: jackett_external,
@@ -1108,20 +1149,25 @@ function bindUIButtons() {
blackholedir: $("#jackett-savedir").val(),
logging: jackett_logging,
basepathoverride: jackett_basepathoverride,
omdbkey: jackett_omdb_key
omdbkey: jackett_omdb_key,
proxy_type: jackett_proxy_type,
proxy_url: jackett_proxy_url,
proxy_port: jackett_proxy_port,
proxy_username: jackett_proxy_username,
proxy_password: jackett_proxy_password
};
api.updateServerConfig(jsonObject, function (data) {
if (data !== undefined && data.result == "error") {
doNotify("Error: " + data.error, "danger", "glyphicon glyphicon-alert");
doNotify("Redirecting you to complete configuration update..", "success", "glyphicon glyphicon-ok");
window.setTimeout(function () {
window.location.reload(true);
}, 3000);
}).fail(function (data) {
if (data.responseJSON !== undefined && data.responseJSON.result == "error") {
doNotify("Error: " + data.responseJSON.error, "danger", "glyphicon glyphicon-alert");
return;
} else {
doNotify("Redirecting you to complete configuration update..", "success", "glyphicon glyphicon-ok");
window.setTimeout(function () {
window.location.reload(true);
}, 3000);
doNotify("Request to Jackett server failed", "danger", "glyphicon glyphicon-alert");
}
}).fail(function () {
doNotify("Request to Jackett server failed", "danger", "glyphicon glyphicon-alert");
});
});

View File

Before

Width:  |  Height:  |  Size: 361 KiB

After

Width:  |  Height:  |  Size: 361 KiB

View File

Before

Width:  |  Height:  |  Size: 306 KiB

After

Width:  |  Height:  |  Size: 306 KiB

View File

Before

Width:  |  Height:  |  Size: 106 KiB

After

Width:  |  Height:  |  Size: 106 KiB

View File

Before

Width:  |  Height:  |  Size: 160 B

After

Width:  |  Height:  |  Size: 160 B

View File

Before

Width:  |  Height:  |  Size: 148 B

After

Width:  |  Height:  |  Size: 148 B

View File

Before

Width:  |  Height:  |  Size: 201 B

After

Width:  |  Height:  |  Size: 201 B

View File

Before

Width:  |  Height:  |  Size: 158 B

After

Width:  |  Height:  |  Size: 158 B

View File

Before

Width:  |  Height:  |  Size: 146 B

After

Width:  |  Height:  |  Size: 146 B

View File

@@ -7,6 +7,7 @@
<meta name="mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta charset="utf-8" />
<meta name="referrer" content="no-referrer" /> <!-- Don't send referrer when loading third party ressources (E.g. Empornium banner images won't load) -->
<link rel="apple-touch-icon" href="../apple-touch-icon.png" />
<link rel="apple-touch-icon" sizes="57x57" href="../apple-touch-icon-57x57.png" />
<link rel="apple-touch-icon" sizes="72x72" href="../apple-touch-icon-72x72.png" />
@@ -19,25 +20,25 @@
<link rel="mask-icon" href="jackett_medium.png" color="#35c5f4">
<link rel="icon" type="image/ico" href="../favicon.ico" />
<link rel='shortcut icon' type='image/x-icon' href='../favicon.ico' />
<script src="../libs/filesize.min.js"></script>
<script src="../libs/jquery.min.js"></script>
<script type="text/javascript" charset="utf8" src="../libs/jquery.dataTables.min.js"></script>
<script type="text/javascript" src="../libs/filesize.min.js?changed=2017083001"></script>
<script type="text/javascript" src="../libs/jquery.min.js?changed=2017083001"></script>
<script type="text/javascript" src="../libs/jquery.dataTables.min.js?changed=2017083001" charset="utf8"></script>
<script type="text/javascript" src="../libs/handlebars.min.js?changed=2017083001"></script>
<script type="text/javascript" src="../libs/moment.min.js?changed=2017083001"></script>
<script type="text/javascript" src="../libs/handlebarsmoment.js?changed=2017083001"></script>
<script type="text/javascript" src="../libs/handlebarsextend.js?changed=2017083001"></script>
<script type="text/javascript" src="../bootstrap/bootstrap.min.js?changed=2017083001"></script>
<script type="text/javascript" src="../libs/bootstrap-notify.js?changed=2017083001"></script>
<script type="text/javascript" src="../libs/bootstrap-multiselect.js?changed=2017083001"></script>
<script type="text/javascript" src="https://www.google.com/recaptcha/api.js?render=explicit" async defer></script>
<script src="../libs/handlebars.min.js"></script>
<script src="../libs/moment.min.js"></script>
<script src="../libs/handlebarsmoment.js"></script>
<script src="../libs/handlebarsextend.js"></script>
<script src="../bootstrap/bootstrap.min.js"></script>
<script src="../libs/bootstrap-notify.js"></script>
<script src="https://www.google.com/recaptcha/api.js?render=explicit" async defer></script>
<link href="../bootstrap/bootstrap.min.css" rel="stylesheet">
<link href="../animate.css" rel="stylesheet">
<link rel="stylesheet" href="../custom.css" media="only screen and (min-device-width: 480px)">
<link rel="stylesheet" href="../custom_mobile.css" media="only screen and (max-device-width: 480px)">
<link href="../css/jquery.dataTables.min.css" rel="stylesheet" type="text/css">
<link rel="stylesheet" href="../css/font-awesome.min.css">
<link rel="stylesheet" type="text/css" href="../bootstrap/bootstrap.min.css?changed=2017083001">
<link rel="stylesheet" type="text/css" href="../animate.css?changed=2017083001">
<link rel="stylesheet" type="text/css" href="../custom.css?changed=2017083001" media="only screen and (min-device-width: 480px)">
<link rel="stylesheet" type="text/css" href="../custom_mobile.css?changed=2017083001" media="only screen and (max-device-width: 480px)">
<link rel="stylesheet" type="text/css" href="../css/jquery.dataTables.min.css?changed=2017083001">
<link rel="stylesheet" type="text/css" href="../css/bootstrap-multiselect.css?changed=2017083001" />
<link rel="stylesheet" type="text/css" href="../css/font-awesome.min.css?changed=2017083001">
<title>Jackett</title>
</head>
<body>
@@ -74,15 +75,21 @@
<li>Go to <b>Settings > Indexers > Add > Torznab > Custom</b>.</li>
<li>Click on the indexers corresponding <button type="button" class="btn btn-xs btn-info">Copy Torznab Feed</button> button and paste it into the Sonarr/Radarr <b>URL</b> field.</li>
<li>For the <b>API key</b> use <b class="api-key-text"></b>.</li>
<li>Configure the correct category IDs via the <b>(Anime) Categories</b> options. See the Jackett indexer configuration for a list of supported categories.</li>
</ol>
<h4>Adding a Jackett indexer in CouchPotato</h4>
<ol>
<li>Go to <b>Settings > Searchers</b>.</li>
<li>Enable <b>TorrentPotato</b>.
<li>Click on the indexers corresponding <button type="button" class="btn btn-xs btn-info">Copy Potato Feed</button> button and past it into the CouchPotato <b>host</b> field.</li>
<li>Click on the indexers corresponding <button type="button" class="btn btn-xs btn-info">Copy Potato Feed</button> button and paste it into the CouchPotato <b>host</b> field.</li>
<li>For the <b>Passkey</b> use <b class="api-key-text"></b>. Leave the <b>username</b> field blank.</li>
</ol>
<h4>Adding a Jackett indexer to RSS clients (RSS feed)</h4>
<ol>
<li>Click on the indexers corresponding <button type="button" class="btn btn-xs btn-info">Copy RSS Feed</button> button and paste it into the URL field of the RSS client.</li>
<li>You can adjust the <b>q</b> (search string) and <b>cat</b> (categories) arguments accordingly.
E.g. <b>...&cat=2030,2040&q=big+buck+bunny</b> will search for "big buck bunny" in the Movies/SD (2030) and Movies/HD (2040) categories (See the indexer configuration for available categories).</li>
</ol>
</div>
<hr />
<h3>Jackett Configuration</h3>
@@ -112,7 +119,7 @@
</div>
<div class="input-area">
<span class="input-header">Base Path Override: </span>
<input id="jackett-basepathoverride" class="form-control input-right" type="text" value="" placeholder="/jackett/">
<input id="jackett-basepathoverride" class="form-control input-right" type="text" value="" placeholder="/jackett">
</div>
<div class="input-area">
<span class="input-header">Server port: </span>
@@ -122,6 +129,32 @@
<span class="input-header">Manual download blackhole directory: </span>
<input id="jackett-savedir" class="form-control input-right" type="text" value="" placeholder="c:\torrents\">
</div>
<div class="input-area">
<span class="input-header">Proxy type: </span>
<select id="jackett-proxy-type" class="form-control input-right">
<option value="0">http</option>
<option value="1">socks4</option>
<option value="2">socks5</option>
</select>
</div>
<div class="input-area">
<span class="input-header">Proxy url: </span>
<input id="jackett-proxy-url" class="form-control input-right" type="text" value="" placeholder="Blank to disable">
</div>
<div class="input-area">
<span class="input-header">Proxy port: </span>
<input id="jackett-proxy-port" class="form-control input-right" type="text" value="" placeholder="">
</div>
<div class="input-area">
<span class="input-header">Proxy username: </span>
<input id="jackett-proxy-username" class="form-control input-right" type="text" value="" placeholder="">
</div>
<div class="input-area">
<span class="input-header">Proxy password: </span>
<input id="jackett-proxy-password" class="form-control input-right" type="text" value="" placeholder="">
</div>
<div class="input-area">
<span class="input-header">External access: </span>
<input id="jackett-allowext" class="form-control input-right" type="checkbox" />
@@ -146,7 +179,7 @@
</div>
<hr />
<div id="footer">
Jackett Version <span id="app-version"></span>
<a href="https://github.com/Jackett/Jackett" target="_blank" title="Jackett on GitHub">Jackett</a> Version <span id="app-version"></span>
</div>
</div>
@@ -154,7 +187,7 @@
<script id="setup-item-nonlocalrecaptcha" type="text/x-handlebars-template">
<div class="setup-item-recaptcha">
<p>This site requires you to enter a ReCaptcha however this only works when accessing Jackett via 127.0.0.1 (localhost doesn't work). If you cannot access Jackett using that hostname then alternatively you can enter the cookie for the site manually. <a href="https://github.com/Jackett/Jackett/wiki/Finding-cookies" target="_blank">See here</a> on how get the cookies.</p>
<p>This site requires you to solve a ReCaptcha. It's no longer possible to solve the captcha in Jackett. Please enter the cookie for the site manually. <a href="https://github.com/Jackett/Jackett/wiki/Finding-cookies" target="_blank">See here</a> on how get the cookies.</p>
<div class="setup-item-label">Full cookie header</div>
<input class="form-control" type="text" value="" />
</div>
@@ -213,12 +246,13 @@
</script>
<script id="setup-item-alternativesitelinks" type="text/x-handlebars-template">
<div class="setup-item-alternativesitelinks alert alert-info" role="alert">
This indexer has multiple known URLs which you can change above:
This indexer has multiple known URLs:
<ul>
{{#each alternativesitelinks}}
<li>{{this}}</li>
<li><a target="_blank" href="{{this}}" class="alternativesitelink">{{this}}</a></li>
{{/each}}
</ul>
Click on an URL to copy it to the Site Link field.
</div>
</script>
@@ -235,9 +269,10 @@
<tbody>
{{#each indexers}}
<tr class="configured-indexer-row">
<td><a target="_blank" href="{{site_link}}" title="{{description}}">{{name}}</a> <span title="{{type}}" class="type-{{type}}">{{type_icon_content}}</span></td>
<td><a target="_blank" href="{{site_link}}" title="{{description}}">{{name}}</a> <span title="{{type}}" class="label label-{{type_label}}" style="text-transform: capitalize;">{{type}}</span></td>
<td class="fit">
<div class="indexer-buttons">
<a href="{{rss_host}}" title="{{rss_host}}" role="button" class="indexer-button-copy btn btn-xs btn-info">Copy RSS Feed</i></a>
<a href="{{torznab_host}}" title="{{torznab_host}}" role="button" class="indexer-button-copy btn btn-xs btn-info">Copy Torznab Feed</a>
<a href="{{potato_host}}" title="{{potato_host}}" role="button" class="indexer-button-copy btn btn-xs btn-info{{#unless potatoenabled}} disabled{{/unless}}">Copy Potato Feed</a>
@@ -286,7 +321,7 @@
<tr class="unconfigured-indexer-row">
<td><a target="_blank" href="{{site_link}}" title="{{description}}">{{name}}</a></td>
<td>{{mains_cats}}</td>
<td class="fit"><span title="{{type}}" class="type-{{type}}">{{type_icon_content}}</span></td>
<td class="fit"><span title="{{type}}" class="label label-{{type_label}}" style="text-transform: capitalize;">{{type}}</span></td>
<td>{{type}}</td>
<td class="fit">{{language}}</td>
<td class="fit">
@@ -419,14 +454,13 @@
<label for="text">Query</label>
<input type="text" name="query" id="searchquery" />
<label for="tracker">Tracker</label>
<select name="tracker" id="searchTracker">
<option value="">-- All --</option>
<select name="tracker" id="searchTracker" multiple="multiple">
{{#each indexers}}
<option value="{{id}}">{{name}}</option>
<option value="{{id}}" selected>{{name}}</option>
{{/each}}
</select>
<label for="category">Category</label>
<select name="category" id="searchCategory"></select>
<select name="category" id="searchCategory" multiple="multiple"></select>
<button id="jackett-search-perform" class="btn btn-success btn-sm"><span class="fa fa-search"></span></button>
<div id="searchResults"></div>
</div>
@@ -440,14 +474,14 @@
<script id="jackett-search-results" type="text/x-handlebars-template">
<hr />
<p>Your search was done using:
{{#each Indexers}}{{Name}}
{{#if Error}}
<p>Your search was done using:
{{#each Indexers}}{{Name}}
{{#if Error}}
(<span title="{{Error}}"><b>Error</b></span>)
{{else}}
({{Results}})
{{/if}}
, {{/each}}
{{else}}
({{Results}})
{{/if}}
, {{/each}}
</p>
<table id="jackett-search-results-datatable" class="dataTable compact cell-border hover stripe">
<thead>
@@ -581,6 +615,9 @@
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
<h4 class="modal-title">{{title}} - <a target="_blank" href="{{link}}">{{link}}</a></h4>
{{#if description}}
<div class="alert alert-info">{{description}}</div>
{{/if}}
</div>
<div class="modal-body">
<form class="config-setup-form"></form>
@@ -621,7 +658,7 @@
<span class="fa fa-search"></span>
</script>
<script src="../libs/api.js"></script>
<script src="../custom.js"></script>
<script type="text/javascript" src="../libs/api.js?changed=2017083001"></script>
<script type="text/javascript" src="../custom.js?changed=2017110602"></script>
</body>
</html>

View File

Before

Width:  |  Height:  |  Size: 3.6 KiB

After

Width:  |  Height:  |  Size: 3.6 KiB

File diff suppressed because it is too large Load Diff

View File

@@ -1,6 +1,6 @@
/*
2015 Jason Mulligan
@version 3.1.2
*/
"use strict"; !function (a) { var b = /b$/, c = { bits: ["B", "kb", "Mb", "Gb", "Tb", "Pb", "Eb", "Zb", "Yb"], bytes: ["B", "kB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"] }, d = function (a) { var d = void 0 === arguments[1] ? {} : arguments[1], e = [], f = !1, g = 0, h = void 0, i = void 0, j = void 0, k = void 0, l = void 0, m = void 0, n = void 0, o = void 0, p = void 0, q = void 0, r = void 0; if (isNaN(a)) throw new Error("Invalid arguments"); return j = d.bits === !0, p = d.unix === !0, i = void 0 !== d.base ? d.base : 2, o = void 0 !== d.round ? d.round : p ? 1 : 2, q = void 0 !== d.spacer ? d.spacer : p ? "" : " ", r = void 0 !== d.suffixes ? d.suffixes : {}, n = void 0 !== d.output ? d.output : "string", h = void 0 !== d.exponent ? d.exponent : -1, m = Number(a), l = 0 > m, k = i > 2 ? 1e3 : 1024, l && (m = -m), 0 === m ? (e[0] = 0, e[1] = p ? "" : "B") : ((-1 === h || isNaN(h)) && (h = Math.floor(Math.log(m) / Math.log(k))), h > 8 && (g = 1e3 * g * (h - 8), h = 8), g = 2 === i ? m / Math.pow(2, 10 * h) : m / Math.pow(1e3, h), j && (g = 8 * g, g > k && (g /= k, h++)), e[0] = Number(g.toFixed(h > 0 ? o : 0)), e[1] = c[j ? "bits" : "bytes"][h], !f && p && (j && b.test(e[1]) && (e[1] = e[1].toLowerCase()), e[1] = e[1].charAt(0), "B" === e[1] ? (e[0] = Math.floor(e[0]), e[1] = "") : j || "k" !== e[1] || (e[1] = "K"))), l && (e[0] = -e[0]), e[1] = r[e[1]] || e[1], "array" === n ? e : "exponent" === n ? h : "object" === n ? { value: e[0], suffix: e[1] } : e.join(q) }; "undefined" != typeof exports ? module.exports = d : "function" == typeof define ? define(function () { return d }) : a.filesize = d }("undefined" != typeof global ? global : window);
/*
2015 Jason Mulligan
@version 3.1.2
*/
"use strict"; !function (a) { var b = /b$/, c = { bits: ["B", "kb", "Mb", "Gb", "Tb", "Pb", "Eb", "Zb", "Yb"], bytes: ["B", "kB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"] }, d = function (a) { var d = void 0 === arguments[1] ? {} : arguments[1], e = [], f = !1, g = 0, h = void 0, i = void 0, j = void 0, k = void 0, l = void 0, m = void 0, n = void 0, o = void 0, p = void 0, q = void 0, r = void 0; if (isNaN(a)) throw new Error("Invalid arguments"); return j = d.bits === !0, p = d.unix === !0, i = void 0 !== d.base ? d.base : 2, o = void 0 !== d.round ? d.round : p ? 1 : 2, q = void 0 !== d.spacer ? d.spacer : p ? "" : " ", r = void 0 !== d.suffixes ? d.suffixes : {}, n = void 0 !== d.output ? d.output : "string", h = void 0 !== d.exponent ? d.exponent : -1, m = Number(a), l = 0 > m, k = i > 2 ? 1e3 : 1024, l && (m = -m), 0 === m ? (e[0] = 0, e[1] = p ? "" : "B") : ((-1 === h || isNaN(h)) && (h = Math.floor(Math.log(m) / Math.log(k))), h > 8 && (g = 1e3 * g * (h - 8), h = 8), g = 2 === i ? m / Math.pow(2, 10 * h) : m / Math.pow(1e3, h), j && (g = 8 * g, g > k && (g /= k, h++)), e[0] = Number(g.toFixed(h > 0 ? o : 0)), e[1] = c[j ? "bits" : "bytes"][h], !f && p && (j && b.test(e[1]) && (e[1] = e[1].toLowerCase()), e[1] = e[1].charAt(0), "B" === e[1] ? (e[0] = Math.floor(e[0]), e[1] = "") : j || "k" !== e[1] || (e[1] = "K"))), l && (e[0] = -e[0]), e[1] = r[e[1]] || e[1], "array" === n ? e : "exponent" === n ? h : "object" === n ? { value: e[0], suffix: e[1] } : e.join(q) }; "undefined" != typeof exports ? module.exports = d : "function" == typeof define ? define(function () { return d }) : a.filesize = d }("undefined" != typeof global ? global : window);
//# sourceMappingURL=filesize.min.js.map

View File

@@ -1,37 +1,37 @@

Handlebars.registerHelper('dateFormat', function (context, block) {
if (window.moment) {
var f = block.hash.format || "MMM DD, YYYY hh:mm:ss A";
return moment(context).format(f); //had to remove Date(context)
} else {
return context; // moment plugin not available. return data as is.
};
});
Handlebars.registerHelper('jacketTimespan', function (context, block) {
var now = moment();
var from = moment(context);
var timeSpan = moment.duration(now.diff(from));
var minutes = timeSpan.asMinutes();
if (minutes < 120) {
return Math.round(minutes) + 'm ago';
}
var hours = timeSpan.asHours();
if (hours < 48) {
return Math.round(hours) + 'h ago';
}
var days = timeSpan.asDays();
if (days < 365) {
return Math.round(days) + 'd ago';
}
var years = timeSpan.asYears();
return Math.round(years) + 'y ago';
});
Handlebars.registerHelper('jacketSize', function (context, block) {
return filesize(context, { round: 1 });

Handlebars.registerHelper('dateFormat', function (context, block) {
if (window.moment) {
var f = block.hash.format || "MMM DD, YYYY hh:mm:ss A";
return moment(context).format(f); //had to remove Date(context)
} else {
return context; // moment plugin not available. return data as is.
};
});
Handlebars.registerHelper('jacketTimespan', function (context, block) {
var now = moment();
var from = moment(context);
var timeSpan = moment.duration(now.diff(from));
var minutes = timeSpan.asMinutes();
if (minutes < 120) {
return Math.round(minutes) + 'm ago';
}
var hours = timeSpan.asHours();
if (hours < 48) {
return Math.round(hours) + 'h ago';
}
var days = timeSpan.asDays();
if (days < 365) {
return Math.round(days) + 'd ago';
}
var years = timeSpan.asYears();
return Math.round(years) + 'y ago';
});
Handlebars.registerHelper('jacketSize', function (context, block) {
return filesize(context, { round: 1 });
});

View File

@@ -10,6 +10,8 @@ using System.Net.Http.Headers;
using Jackett.Utils;
using System.Net;
using System.Threading;
using Jacket.Common;
using Jackett.Models.Config;
namespace Jackett
{
@@ -25,7 +27,7 @@ namespace Jackett
public HttpMethod Method { get; private set; }
public IEnumerable<KeyValuePair<string, string>> PostData { get; set; }
public Dictionary<string, string> Headers { get; set; }
public string RawPOSTDdata { get; set;}
public string RawPOSTDdata { get; set; }
public CurlRequest(HttpMethod method, string url, string cookies = null, string referer = null, Dictionary<string, string> headers = null, string rawPOSTData = null)
{
@@ -54,31 +56,31 @@ namespace Jackett
}
}
public static async Task<CurlResponse> GetAsync(string url, string cookies = null, string referer = null, Dictionary<string, string> headers = null)
public static async Task<CurlResponse> GetAsync(string url, ServerConfig config, string cookies = null, string referer = null, Dictionary<string, string> headers = null)
{
var curlRequest = new CurlRequest(HttpMethod.Get, url, cookies, referer, headers);
var result = await PerformCurlAsync(curlRequest);
var result = await PerformCurlAsync(curlRequest, config);
return result;
}
public static async Task<CurlResponse> PostAsync(string url, IEnumerable<KeyValuePair<string, string>> formData, string cookies = null, string referer = null, Dictionary<string, string> headers = null, string rawPostData =null)
public static async Task<CurlResponse> PostAsync(string url, ServerConfig config, IEnumerable<KeyValuePair<string, string>> formData, string cookies = null, string referer = null, Dictionary<string, string> headers = null, string rawPostData = null)
{
var curlRequest = new CurlRequest(HttpMethod.Post, url, cookies, referer, headers);
curlRequest.PostData = formData;
curlRequest.RawPOSTDdata = rawPostData;
var result = await PerformCurlAsync(curlRequest);
var result = await PerformCurlAsync(curlRequest, config);
return result;
}
public static async Task<CurlResponse> PerformCurlAsync(CurlRequest curlRequest)
public static async Task<CurlResponse> PerformCurlAsync(CurlRequest curlRequest, ServerConfig config)
{
return await Task.Run(() => PerformCurl(curlRequest));
return await Task.Run(() => PerformCurl(curlRequest, config));
}
public delegate void ErrorMessage(string s);
public static ErrorMessage OnErrorMessage;
public static CurlResponse PerformCurl(CurlRequest curlRequest)
public static CurlResponse PerformCurl(CurlRequest curlRequest, ServerConfig config)
{
lock (instance)
{
@@ -87,13 +89,12 @@ namespace Jackett
using (var easy = new CurlEasy())
{
easy.Url = curlRequest.Url;
easy.BufferSize = 64 * 1024;
easy.UserAgent = BrowserUtil.ChromeUserAgent;
easy.FollowLocation = false;
easy.ConnectTimeout = 20;
if(curlRequest.Headers != null)
if (curlRequest.Headers != null)
{
CurlSlist curlHeaders = new CurlSlist();
foreach (var header in curlRequest.Headers)
@@ -138,7 +139,7 @@ namespace Jackett
}
}
if (Startup.DoSSLFix == true)
if (config.RuntimeSettings.DoSSLFix == true)
{
// http://stackoverflow.com/questions/31107851/how-to-fix-curl-35-cannot-communicate-securely-with-peer-no-common-encryptio
// https://git.fedorahosted.org/cgit/mod_nss.git/plain/docs/mod_nss.html
@@ -147,16 +148,23 @@ namespace Jackett
easy.ForbidReuse = true;
}
if (Startup.IgnoreSslErrors == true)
if (config.RuntimeSettings.IgnoreSslErrors == true)
{
easy.SetOpt(CurlOption.SslVerifyhost, false);
easy.SetOpt(CurlOption.SslVerifyPeer, false);
}
if (Startup.ProxyConnection != null)
var proxy = config.GetProxyUrl();
if (proxy != null)
{
easy.SetOpt(CurlOption.HttpProxyTunnel, 1);
easy.SetOpt(CurlOption.Proxy, Startup.ProxyConnection);
easy.SetOpt(CurlOption.Proxy, proxy);
var authString = config.GetProxyAuthString();
if (authString != null)
{
easy.SetOpt(CurlOption.ProxyUserPwd, authString);
}
}
easy.Perform();
@@ -173,7 +181,7 @@ namespace Jackett
var headerBytes = Combine(headerBuffers.ToArray());
var headerString = Encoding.UTF8.GetString(headerBytes);
if (Startup.ProxyConnection != null)
if (config.GetProxyUrl() != null)
{
var firstcrlf = headerString.IndexOf("\r\n\r\n");
var secondcrlf = headerString.IndexOf("\r\n\r\n", firstcrlf + 1);
@@ -209,7 +217,8 @@ namespace Jackett
if (key == "set-cookie")
{
var nameSplit = value.IndexOf('=');
if (nameSplit > -1) {
if (nameSplit > -1)
{
var cKey = value.Substring(0, nameSplit);
var cVal = value.Split(';')[0] + ";";
cookies.Add(new Tuple<string, string>(cKey, cVal));
@@ -241,12 +250,12 @@ namespace Jackett
OnErrorMessage("request.Cookies: " + curlRequest.Cookies);
OnErrorMessage("request.Referer: " + curlRequest.Referer);
OnErrorMessage("request.RawPOSTDdata: " + curlRequest.RawPOSTDdata);
OnErrorMessage("cookies: "+ cookieBuilder.ToString().Trim());
OnErrorMessage("cookies: " + cookieBuilder.ToString().Trim());
OnErrorMessage("headerString:\n" + headerString);
foreach (var headerPart in headerParts)
{
OnErrorMessage("headerParts: "+headerPart);
OnErrorMessage("headerParts: " + headerPart);
}
}
catch (Exception ex)
@@ -254,7 +263,7 @@ namespace Jackett
OnErrorMessage(string.Format("CurlHelper: error while handling NotImplemented/InternalServerError:\n{0}", ex));
}
}
var contentBytes = Combine(contentBuffers.ToArray());
var curlResponse = new CurlResponse(headers, contentBytes, status, cookieBuilder.ToString().Trim());
return curlResponse;

View File

@@ -0,0 +1,192 @@
---
site: 1337x
name: 1337x
description: "1337X is a Public torrent site that offers verified torrent downloads"
language: en-us
type: public
encoding: UTF-8
links:
- https://1337x.to
caps:
categorymappings:
#Anime
- {id: 28, cat: TV/Anime, desc: "Anime/Anime"}
- {id: 78, cat: TV/Anime, desc: "Anime/Dual Audio"}
- {id: 79, cat: TV/Anime, desc: "Anime/Dubbed"}
- {id: 80, cat: TV/Anime, desc: "Anime/Subbed"}
- {id: 81, cat: TV/Anime, desc: "Anime/Raw"}
#Audio
- {id: 22, cat: Audio/MP3, desc: "Music/MP3"}
- {id: 23, cat: Audio/Lossless, desc: "Music/Lossless"}
- {id: 24, cat: Audio, desc: "Music/DVD"}
- {id: 25, cat: Audio/Video, desc: "Music/Video"}
- {id: 26, cat: Audio, desc: "Music/Radio"}
- {id: 27, cat: Audio/Other, desc: "Music/Other"}
- {id: 53, cat: Audio, desc: "Music/Album"}
- {id: 58, cat: Audio, desc: "Music/Box set"}
- {id: 59, cat: Audio, desc: "Music/Discography"}
- {id: 60, cat: Audio, desc: "Music/Single"}
- {id: 68, cat: Audio, desc: "Music/Concerts"}
- {id: 69, cat: Audio, desc: "Music/AAC"}
#Movies
- {id: 1, cat: Movies/DVD, desc: "Movies/DVD"}
- {id: 2, cat: Movies/SD, desc: "Movies/Divx/Xvid"}
- {id: 3, cat: Movies, desc: "Movies/SVCD/VCD"}
- {id: 4, cat: Movies/Foreign, desc: "Movies/Dubs/Dual Audio"}
- {id: 9, cat: Movies, desc: "Documentaries/Documentary"}
- {id: 42, cat: Movies/HD, desc: "Movies/HD"}
- {id: 54, cat: Movies, desc: "Movies/h.264/x264"}
- {id: 55, cat: Movies, desc: "Movies/Mp4"}
- {id: 66, cat: Movies/3D, desc: "Movies/3D"}
- {id: 70, cat: Movies, desc: "Movies/HEVC/x265"}
- {id: 73, cat: Movies, desc: "Movies/Bollywood"}
- {id: 76, cat: Movies, desc: "Movies/UHD"}
#TV
- {id: 5, cat: TV, desc: "TV/DVD"}
- {id: 6, cat: TV, desc: "TV/Divx/Xvid"}
- {id: 7, cat: TV, desc: "TV/SVCD/VCD"}
- {id: 41, cat: TV/HD, desc: "TV/HD"}
- {id: 71, cat: TV, desc: "TV/HEVC/x265"}
- {id: 74, cat: TV, desc: "TV/Cartoons"}
- {id: 75, cat: TV/SD, desc: "TV/SD"}
#Apps
- {id: 18, cat: PC, desc: "Apps/PC Software"}
- {id: 19, cat: PC/Mac, desc: "Apps/Mac"}
- {id: 20, cat: PC, desc: "Apps/Linux"}
- {id: 21, cat: PC, desc: "Apps/Other"}
- {id: 56, cat: PC/Phone-Android, desc: "Apps/Android"}
- {id: 57, cat: PC/Phone-IOS, desc: "Apps/iOS"}
#Games
- {id: 10, cat: PC/Games, desc: "Games/PC Game"}
- {id: 11, cat: Console/Other, desc: "Games/PS2"}
- {id: 12, cat: Console/PSP, desc: "Games/PSP"}
- {id: 13, cat: Console/Xbox, desc: "Games/Xbox"}
- {id: 14, cat: Console/Xbox 360, desc: "Games/Xbox360"}
- {id: 15, cat: Console/Other, desc: "Games/PS1"}
- {id: 16, cat: Console/Other, desc: "Games/Dreamcast"}
- {id: 17, cat: PC/Phone-Other, desc: "Games/Other"}
- {id: 43, cat: Console/PS3, desc: "Games/PS3"}
- {id: 44, cat: Console/Wii, desc: "Games/Wii"}
- {id: 45, cat: Console/NDS, desc: "Games/DS"}
- {id: 46, cat: Console, desc: "Games/GameCube"}
- {id: 72, cat: Console/3DS, desc: "Games/3DS"}
- {id: 77, cat: Console/PS4, desc: "Games/PS4"}
- {id: 82, cat: Console/Other, desc: "Games/Switch"}
#XXX
- {id: 48, cat: XXX/DVD, desc: "XXX/Video"}
- {id: 49, cat: XXX/Imageset, desc: "XXX/Picture"}
- {id: 50, cat: XXX, desc: "XXX/Magazine"}
- {id: 51, cat: XXX, desc: "XXX/Hentai"}
- {id: 67, cat: XXX, desc: "XXX/Games"}
#Other
- {id: 33, cat: Other, desc: "Other/Emulation"}
- {id: 34, cat: Books, desc: "Other/Tutorial"}
- {id: 35, cat: Other, desc: "Other/Sounds"}
- {id: 36, cat: Books/Ebook, desc: "Other/E-books"}
- {id: 37, cat: Other, desc: "Other/Images"}
- {id: 38, cat: Other, desc: "Other/Mobile Phone"}
- {id: 39, cat: Books/Comics, desc: "Other/Comics"}
- {id: 40, cat: Other/Misc, desc: "Other/Other"}
- {id: 47, cat: Other, desc: "Other/Nulled Script"}
- {id: 52, cat: Audio/Audiobook, desc: "Other/Audiobook"}
modes:
search: [q]
tv-search: [q, season, ep]
movie-search: [q]
settings:
- name: downloadlink
type: select
label: Download link
default: "magnet:"
options:
"http://itorrents.org/" : "iTorrents.org"
"magnet:": "magnet"
download:
# the .torrent url is on the on the details page
selector: ul li a[href^="{{ .Config.downloadlink }}"]
search:
paths:
# present trending results if there are no search parms supplied
- path: "{{if .Keywords}}/search/{{ .Keywords}}/1/{{else}}/trending{{end}}"
rows:
selector: tr:has(a[href^="/torrent/"])
fields:
title:
selector: td[class^="coll-1"] a[href^="/torrent/"]
category:
optional: true
selector: td[class^="coll-1"] a[href^="/sub/"]
attribute: href
filters:
# extract the third part
- name: split
args: ["/", 2]
details:
selector: td[class^="coll-1"] a[href^="/torrent/"]
attribute: href
download:
# .torrent link is on the details page
selector: td[class^="coll-1"] a[href^="/torrent/"]
attribute: href
# dates come in three flavours:
date:
# (within this year) 7am Sep. 14th
optional: true
selector: td[class^="coll-date"]:not(:contains(":")):not(:contains("'"))
filters:
- name: replace
args: ["st", ""]
- name: replace
args: ["nd", ""]
- name: replace
args: ["rd", ""]
- name: replace
args: ["th", ""]
- name: dateparse
args: "3pm Jan. 2"
date:
# (more than a year ago) Apr. 18th '11
optional: true
selector: td[class^="coll-date"]:contains("'")
filters:
- name: replace
args: ["'", ""]
- name: replace
args: ["st", ""]
- name: replace
args: ["nd", ""]
- name: replace
args: ["rd", ""]
- name: replace
args: ["th", ""]
- name: dateparse
args: "Jan. 2 06"
date:
# # (today) 12:25am
optional: true
selector: td[class^="coll-date"]:contains(":")
filters:
- name: dateparse
args: "3:04pm"
size:
selector: td[class^="coll-4"]
seeders:
selector: td[class^="coll-2"]
leechers:
selector: td[class^="coll-3"]
downloadvolumefactor:
text: "0"
uploadvolumefactor:
text: "1"

View File

@@ -1,6 +1,7 @@
---
site: 2fast4you
name: 2 Fast 4 You
description: "2 Fast 4 You is a FRENCH Private site for TV / MOVIES / GENERAL"
language: fr-fr
type: private
encoding: UTF-8
@@ -95,7 +96,8 @@
path: torrents-search.php
search:
path: torrents-search.php
paths:
- path: torrents-search.php
inputs:
$raw: "{{range .Categories}}c{{.}}=1&{{end}}"
search: "{{ .Query.Keywords }}"
@@ -139,4 +141,4 @@
"*": "1"
uploadvolumefactor:
case:
"*": "1"
"*": "1"

View File

@@ -42,7 +42,7 @@
pwd: "{{ .Config.password }}"
captcha:
type: image
image: img.captcha
selector: img.captcha
input: private_key
error:
- selector: span.errormsg
@@ -53,7 +53,8 @@
selector: a[href^="download.php?id="]
search:
path: index.php
paths:
- path: index.php
inputs:
$raw: "{{range .Categories}}filter_cat[{{.}}]=1&{{end}}"
search: "{{ .Query.Keywords }}"

View File

@@ -0,0 +1,171 @@
---
site: Bittorrentfiles
name: Bittorrentfiles
description: "Bittorrentfiles is a Private GERMAN tracker"
language: de-de
type: private
encoding: UTF-8
links:
- https://www.Bittorrentfiles.me/
caps:
categorymappings:
# Movie
- {id: 48, cat: Movies/HD, desc: "1080p"}
- {id: 31, cat: Movies/3D, desc: "3D"}
- {id: 21, cat: Movies/HD, desc: "720p"}
- {id: 28, cat: Movies/SD, desc: "AVI"}
- {id: 20, cat: Movies/DVD, desc: "DVD-R"}
- {id: 40, cat: Movies/HD, desc: "h264/x264"}
- {id: 30, cat: Movies/HD, desc: "HD/BD"}
- {id: 49, cat: Movies/Foreign, desc: "International"}
- {id: 78, cat: Movies/HD, desc: "UHD"}
# Serien
- {id: 79, cat: TV/HD, desc: "Staffeln HD"}
- {id: 56, cat: TV/SD, desc: "Staffeln SD"}
- {id: 54, cat: TV/HD, desc: "Folgen HD"}
- {id: 80, cat: TV/HD, desc: "Folgen HD/BD"}
- {id: 7, cat: TV/SD, desc: "Folgen SD"}
- {id: 55, cat: TV/Foreign, desc: "International"}
# Doku
- {id: 64, cat: TV/Documentary, desc: "HD"}
- {id: 36, cat: TV/Documentary, desc: "SD"}
- {id: 81, cat: TV/Documentary, desc: "3D"}
- {id: 82, cat: TV/Documentary, desc: "Packs"}
# Spiele
- {id: 4, cat: PC/Games, desc: "Windows"}
- {id: 72, cat: Console/XBox360, desc: "XBOX 360"}
- {id: 44, cat: Console/XBoxOne, desc: "XBOX One"}
- {id: 43, cat: Console/Wii, desc: "Wii"}
- {id: 69, cat: Console, desc: "PS2"}
- {id: 70, cat: Console/PS3, desc: "PS3"}
- {id: 70, cat: Console/PS4, desc: "PS4"}
- {id: 70, cat: Console/PSP, desc: "PSP"}
- {id: 42, cat: Console/Other, desc: "Misc"}
# Musik
- {id: 66, cat: Audio, desc: "Alben"}
- {id: 75, cat: Audio, desc: "Singles"}
- {id: 50, cat: Audio, desc: "Charts"}
- {id: 52, cat: Audio, desc: "Packs"}
- {id: 53, cat: Audio/Video, desc: "Video"}
- {id: 61, cat: Audio/Video, desc: "DVD-R"}
- {id: 83, cat: Audio, desc: "Flac"}
- {id: 68, cat: Audio, desc: "Live"}
- {id: 6, cat: Audio, desc: "Misc"}
- {id: 51, cat: Audio, desc: "OST"}
- {id: 67, cat: Audio, desc: "Sampler"}
# App
- {id: 22, cat: PC/0day, desc: "Windows"}
- {id: 62, cat: PC/Mac, desc: "Mac OS"}
- {id: 63, cat: PC/0day, desc: "Linux"}
- {id: 34, cat: PC, desc: "Andere"}
# Sport
- {id: 74, cat: TV/Sport, desc: "HD"}
- {id: 39, cat: TV/Sport, desc: "SD"}
# Sonstiges
- {id: 41, cat: Books/Comics, desc: "A-Book"}
- {id: 33, cat: TV/Anime, desc: "Anime"}
- {id: 35, cat: Books, desc: "e-Book"}
- {id: 65, cat: Other, desc: "E-Learning"}
- {id: 65, cat: PC, desc: "Mobile"}
- {id: 9, cat: Other, desc: "Other"}
#XXX
- {id: 58, cat: Books/Comics, desc: "HD"}
- {id: 33, cat: XXX, desc: "Hentai"}
- {id: 35, cat: XXX/Other, desc: "Other"}
- {id: 65, cat: XXX/Packs, desc: "Pack"}
- {id: 65, cat: XXX, desc: "SD"}
modes:
search: [q]
tv-search: [q, season, ep]
settings:
- name: user
type: text
label: Username
- name: pass
type: password
label: Password
login:
path: signin.php
method: form
form: form
inputs:
user: "{{ .Config.user }}"
pass: "{{ .Config.pass }}"
error:
- selector: .error
test:
path: browse.php
search:
path: browse.php
inputs:
$raw: "{{range .Categories}}c{{.}}=1&{{end}}"
search: "{{ .Query.Keywords }}"
incldead: "1"
rows:
selector: table.tableinborder > tbody > tr:has(a[href^="details.php"])
fields:
title:
selector: a[href^="details.php"]
attribute: title
category:
selector: a[href^="/browse.php?cat="]
attribute: href
filters:
- name: querystring
args: cat
details:
selector: a[href^="details.php"]
attribute: href
download:
selector: a[href^="/download.php"]
attribute: href
files:
selector: td:nth-child(2) > table > tbody > tr:nth-child(2) > td:nth-child(5) > a
grabs:
selector: td:nth-child(2) > table > tbody > tr:nth-child(2) > td:nth-child(2)
size:
selector: td:nth-child(2) > table > tbody > tr:nth-child(2) > td:nth-child(6)
filters:
- name: replace
args: [".", ""]
- name: replace
args: [",", "."]
seeders:
selector: td:nth-child(2) > table > tbody > tr:nth-child(2) > td:nth-child(2)
leechers:
selector: td:nth-child(2) > table > tbody > tr:nth-child(2) > td:nth-child(3)
date:
selector: td:nth-child(2) > table > tbody > tr:nth-child(2) > td:nth-child(10)
filters:
- name: split
args: ["by", 0]
- name: replace
args: ["Heute", "Today"]
- name: replace
args: ["Gestern", "Yesterday"]
- name: dateparse
args: "02.01.2006 15:04:05"
downloadvolumefactor:
case:
img[alt="OU"]: "0"
img[alt="D/2"]: "0.5"
"*": "1"
uploadvolumefactor:
case:
img[alt="2xU"]: "2"
"*": "1"

View File

@@ -1,6 +1,7 @@
---
site: acidlounge
name: Acid-Lounge
description: "Acid Lounge (A-L) is a Private Torrent Tracker for 0DAY / GENERAL"
language: en-us
type: private
encoding: UTF-8
@@ -64,7 +65,7 @@
form: form#login
captcha:
type: image
image: img[alt="Security code"]
selector: img[alt="Security code"]
input: code
inputs:
username: "{{ .Config.username }}"

View File

@@ -1,7 +1,7 @@
---
---
site: anidex
name: Anidex
description: "Anidex is a torrent tracker and indexer, primarily for English fansub groups of anime"
description: "Anidex is a Public torrent tracker and indexer, primarily for English fansub groups of anime"
language: en-us
encoding: UTF-8
type: public
@@ -34,42 +34,23 @@
- name: cat-id
type: text
label: Category Id
- name: lang-id
type: text
label: Language Id
- name: info
type: info
label: Category Id Note
default: "You can filter your searches by using any of the following category numbers (comma delimited):<br>1 :Anime - Sub<br>2 :Anime - Raw<br>3 :Anime - Dub<br>4 :LA - Sub<br>5 :LA - Raw<br>6 :Light Novel<br>7 :Manga - TLed<br>8 :Manga - Raw<br>9 :♫ - Lossy<br>10 :♫ - Lossless<br>11 :♫ - Video<br>12 :Games<br>13 :Applications<br>14 :Pictures<br>15 :Adult Video<br>16 :Other"
search:
path: "ajax/page.ajax.php"
headers:
x-requested-with: ["XMLHttpRequest"]
inputs:
page: "torrents"
filename: "{{ .Query.Keywords }}"
category: "{{ .Config.cat-id }}"
lang_id: "{{ .Config.lang-id }}"
paths:
- path: "?{{if .Config.cat-id}}id={{.Config.cat-id }}&{{else}}{{end}}q={{if .Keywords}}{{.Keywords}}{{else}}{{end}}"
rows:
selector: div.table-responsive > table > tbody > tr
fields:
category:
selector: td:nth-child(1) > div
case:
":contains(\"Anime - Sub\")": 1
":contains(\"Anime - Raw\")": 2
":contains(\"Anime - Dub\")": 3
":contains(\"LA - Sub\")": 4
":contains(\"LA - Raw\")": 5
":contains(\"Light Novel\")": 6
":contains(\"Manga - TLed\")": 7
":contains(\"Manga - Raw\")": 8
":contains(\"♫ - Lossy\")": 9
":contains(\"♫ - Lossless\")": 10
":contains(\"♫ - Video\")": 11
":contains(\"Games\")": 12
":contains(\"Applications\")": 13
":contains(\"Pictures\")": 14
":contains(\"Adult Video\")": 15
":contains(\"Other\")": 16
"*": 0 # some old torrents don't have a category
selector: a[href^="/?id="]
attribute: href
filters:
- name: querystring
args: id
title:
selector: td:nth-child(3) > a.torrent > span.span-1440
details:
@@ -78,6 +59,9 @@
download:
selector: td:nth-child(5) > a
attribute: href
magnet:
selector: a[href^="magnet:?"]
attribute: href
size:
selector: td:nth-child(7)
date:
@@ -92,3 +76,9 @@
selector: td:nth-child(9)
leechers:
selector: td:nth-child(10)
grabs:
selector: td:nth-child(11)
downloadvolumefactor:
text: "0"
uploadvolumefactor:
text: "1"

View File

@@ -0,0 +1,78 @@
---
site: aniRena
name: AniRena
description: "AniRena is a Public torrent tracker for the latest anime and Japanese related torrents"
language: en-us
type: public
encoding: UTF-8
links:
- https://www.anirena.com/
settings: []
caps:
categorymappings:
# Anime
- {id: 1, cat: TV/Anime, desc: "Raw Animes"}
- {id: 2, cat: TV/Anime, desc: "Anime"}
- {id: 3, cat: TV/Anime, desc: "Hentai"}
- {id: 4, cat: TV/Anime, desc: "Drama"}
- {id: 9, cat: TV/Anime, desc: "Anime Music Videos"}
- {id: 10, cat: TV/Anime, desc: "Non-English"}
# Software
- {id: 5, cat: PC/ISO, desc: "DVD/ISO"}
- {id: 6, cat: PC, desc: "Hentai-Game"}
# Literature
- {id: 7, cat: Books, desc: "Manga"}
# Audio
- {id: 8, cat: Audio, desc: "Audio"}
# Other
- {id: 11, cat: Other, desc: "Other"}
modes:
search: [q]
tv-search: [q, season, ep]
search:
paths:
- path: "/{{if .Keywords}}?s={{ .Keywords}}{{else}}{{end}}"
rows:
selector: table tbody tr:has(td.torrents_small_type_data1)
fields:
title:
selector: .torrents_small_info_data1 div
download:
selector: .torrents_small_info_data2 a[title="Download Torrent"]
attribute: href
magnet:
selector: .torrents_small_info_data2 a[title="Magnet Link"]
attribute: href
date:
text: now
size:
selector: .torrents_small_size_data1
seeders:
selector: .torrents_small_seeders_data1 b big
leechers:
selector: .torrents_small_leechers_data1 b big
grabs:
selector: .torrents_small_downloads_data1
category:
selector: .torrents_small_type_data1 img
attribute: src
case:
"[src=\"./styles/tracker/imageset/cat_raw_small.png\"]": "1"
"[src=\"./styles/tracker/imageset/cat_anime_small.png\"]": "2"
"[src=\"./styles/tracker/imageset/cat_hentai_small.png\"]": "3"
"[src=\"./styles/tracker/imageset/cat_drama_small.png\"]": "4"
"[src=\"./styles/tracker/imageset/cat_dvd_small.png\"]": "5"
"[src=\"./styles/tracker/imageset/cat_hgame2_small.png\"]": "6"
"[src=\"./styles/tracker/imageset/cat_manga_small.png\"]": "7"
"[src=\"./styles/tracker/imageset/cat_music_small.png\"]": "8"
"[src=\"./styles/tracker/imageset/cat_musicvid_small.png\"]": "9"
"[src=\"./styles/tracker/imageset/cat_noneng_small.png\"]": "10"
"[src=\"./styles/tracker/imageset/cat_other_small.png\"]": "11"
downloadvolumefactor:
text: "0"
uploadvolumefactor:
text: "1"

View File

@@ -1,6 +1,7 @@
---
site: aox
name: AOX
description: "AOX (Chippu) is a Private Torrent Tracker for ASIAN MOVIES / TV"
language: en-us
type: private
encoding: UTF-8
@@ -54,7 +55,8 @@
selector: a[href^="download.php?id="]
search:
path: index.php
paths:
- path: index.php
inputs:
search: "{{ .Query.Keywords }}"
page: "torrents"
@@ -121,4 +123,4 @@
- name: prepend
args: "<br>Language: "

View File

@@ -1,6 +1,7 @@
---
site: arabafenice
name: ArabaFenice
description: "Araba Fenice (Phoenix) is an ITALIAN Private site for TV / MOVIES / GENERAL"
language: it-it
type: private
encoding: UTF-8
@@ -96,7 +97,8 @@
selector: a[href^="download.php?id="]
search:
path: index.php
paths:
- path: index.php
inputs:
search: "{{if .Query.IMDBID}}{{ .Query.IMDBIDShort }}{{else}}{{ .Keywords }}{{end}}"
page: "torrents"

View File

@@ -0,0 +1,143 @@
---
site: archetorrent
name: ArcheTorrent
description: "ArcheTorrent is a FRENCH Private Torrent Tracker"
language: fr-fr
type: private
encoding: UTF-8
links:
- https://archetorrent.com
caps:
categorymappings:
- {id: 18, cat: PC, desc: "Applications: PC"}
- {id: 19, cat: PC/Mac, desc: "Applications: Mac"}
- {id: 54, cat: PC, desc: "Applications: linux"}
- {id: 56, cat: XXX/Other, desc: "Autres: ebook xxx"}
- {id: 36, cat: Books, desc: "Autres: E-Books"}
- {id: 37, cat: Other, desc: "Autres: Images"}
- {id: 38, cat: PC/Phone-Other, desc: "Autres: Telephone-mobile"}
- {id: 47, cat: Movies, desc: "Films: Animé"}
- {id: 1, cat: Movies/DVD, desc: "Films: DVD"}
- {id: 2, cat: Movies/SD, desc: "Films: Dvdrip"}
- {id: 68, cat: Movies, desc: "Films: TAT Releases"}
- {id: 70, cat: Movies/HD, desc: "Films: UHD 4K"}
- {id: 69, cat: Movies, desc: "Films: Retro"}
- {id: 3, cat: Movies/HD, desc: "Films: HD1080"}
- {id: 42, cat: Movies/HD, desc: "Films: HD720"}
- {id: 4, cat: Movies, desc: "Films: Cam/Ts"}
- {id: 22, cat: Movies/BluRay, desc: "Films: bluray"}
- {id: 23, cat: Movies/3D, desc: "Films: 3D"}
- {id: 24, cat: Movies/Foreign, desc: "Films: VOSTFR"}
- {id: 25, cat: XXX, desc: "Films: Adulte"}
- {id: 48, cat: TV/Documentary, desc: "Films: Documentaire"}
- {id: 49, cat: Movies/Other, desc: "Films: Spectacle"}
- {id: 51, cat: Movies/SD, desc: "Films: R5"}
- {id: 52, cat: Movies/SD, desc: "Films: bdrip"}
- {id: 53, cat: Movies/SD, desc: "Films: brrip"}
- {id: 55, cat: Movies/DVD, desc: "Films: dvd-pack"}
- {id: 57, cat: Movies, desc: "Films: manga"}
- {id: 59, cat: Movies/WEBDL, desc: "Films: Webrip"}
- {id: 63, cat: Movies/SD, desc: "Films: M-HD"}
- {id: 10, cat: PC/Games, desc: "Jeux: PC"}
- {id: 11, cat: Console/Other, desc: "Jeux: PS2"}
- {id: 43, cat: Console/PS3, desc: "Jeux: PS3"}
- {id: 12, cat: Console/PSP, desc: "Jeux: PSP"}
- {id: 14, cat: Console/Xbox 360, desc: "Jeux: Xbox360"}
- {id: 44, cat: Console/Wii, desc: "Jeux: Wii"}
- {id: 45, cat: Console/NDS, desc: "Jeux: DS"}
- {id: 27, cat: Audio/Video, desc: "Musique: Clip Video"}
- {id: 62, cat: TV/SD, desc: "Serie tv: TV BDRip"}
- {id: 5, cat: TV/SD, desc: "Serie tv: Dvdrip"}
- {id: 41, cat: TV/HD, desc: "Serie tv: Hd"}
- {id: 60, cat: TV/SD, desc: "Serie tv: pack série tv"}
- {id: 64, cat: TV/FOREIGN, desc: "Serie tv: vostfr"}
- {id: 65, cat: TV/HD, desc: "Serie tv: Série tv 720P"}
- {id: 66, cat: TV/HD, desc: "Serie tv: Série tv 1080P"}
- {id: 67, cat: TV/HD, desc: "Serie tv: Série tv PackHD"}
- {id: 73, cat: TV/Anime, desc: "Serie tv: Anime "}
- {id: 72, cat: TV/Sport, desc: "Sport: sport"}
- {id: 61, cat: TV/SD, desc: "Tv: DVDRip"}
modes:
search: [q]
tv-search: [q, season, ep]
login:
path: account-login.php
method: post
inputs:
username: "{{ .Config.username }}"
password: "{{ .Config.password }}"
error:
- selector: form:contains("Erreur")
message:
selector: form
remove: table
test:
path: torrents-search.php
search:
keywordsfilters:
- name: replace
args: ["-", " "] # remove special search character (negative search)
- name: replace
args: ["+", " "] # remove special search character (positive search)
- name: re_replace
args: ["(\\w+)", " +$1"] # prepend + to each word
paths:
- path: torrents-search.php
inputs:
$raw: "{{range .Categories}}c{{.}}=1&{{end}}"
search: "{{ .Keywords }}"
incldead: "1"
rows:
selector: table.ttable_headinner > tbody > tr[class^="t-row"]
fields:
download:
selector: a[href^="torrents-details.php?id="]
attribute: href
filters:
- name: replace
args: ["torrents-details.php", "download.php"]
date:
selector: td:nth-child(2) a
attribute: onmouseover
filters:
- name: regexp
args: "Poster le: </b>(.*?)<br />"
- name: dateparse
args: "02-01-2006"
title:
selector: a[href^="torrents-details.php?id="]
filters:
- name: replace
args: [" - (Nouveau!)", ""]
category:
selector: a[href^="torrents.php?cat="]
attribute: href
filters:
- name: querystring
args: cat
details:
selector: a[href^="torrents-details.php?id="]
attribute: href
banner:
selector: img.rounded-img
attribute: src
size:
selector: td:nth-child(5)
grabs:
selector: td:nth-child(8) font b
seeders:
selector: td:nth-child(6) font b
leechers:
selector: td:nth-child(7) font b
downloadvolumefactor:
case:
img[title="freeleech"]: "0"
"*": "1"
uploadvolumefactor:
case:
"*": "1"

View File

@@ -1,6 +1,7 @@
---
site: asiandvdclub
name: AsianDVDClub
description: "AsianDVDClub is an ASIAN Private Torrent Tracker for HD MOVIES / TV"
language: en-us
type: private
encoding: UTF-8
@@ -44,7 +45,8 @@
path: browse.php
search:
path: browse.php
paths:
- path: browse.php
keywordsfilters:
- name: replace
args: ["-", " "]

View File

@@ -0,0 +1,111 @@
---
site: ast4u
name: AST4u
description: "AST4u is a GERMAN Private site for TV / MOVIES / ANIME / HENTAI"
language: de-de
type: private
encoding: iso-8859-1
links:
- https://www.ast4u.me/
caps:
categorymappings:
- {id: 35, cat: TV/Anime, desc: "Anime Movie"}
- {id: 36, cat: TV/Anime, desc: "Anime Serie"}
- {id: 37, cat: Audio/Foreign, desc: "Anime Musik"}
- {id: 41, cat: Books, desc: "Anime Pic & Manga"}
- {id: 42, cat: XXX, desc: "Hentai Movie & OVA"}
- {id: 43, cat: XXX, desc: "Hentai Serie"}
- {id: 44, cat: PC, desc: "Hentai Game"}
- {id: 45, cat: Movies, desc: "Cartoon Movie"}
- {id: 46, cat: TV, desc: "Cartoon Serie"}
- {id: 47, cat: TV, desc: "TV-Serie"}
- {id: 49, cat: TV/Documentary, desc: "Sonstiges Doku"}
- {id: 50, cat: Audio, desc: "Sonstiges Soundtrack"}
- {id: 52, cat: Movies/HD, desc: "Movie HD"}
- {id: 53, cat: Other, desc: "Sonstiges"}
- {id: 55, cat: Movies/Foreign, desc: "Movie Asia & MartialArts"}
- {id: 56, cat: TV/Anime, desc: "Anime OVA"}
- {id: 58, cat: Movies, desc: "Movie"}
- {id: 59, cat: Audio/Audiobook, desc: "Sonstiges Hoerspiele"}
- {id: 62, cat: Console, desc: "Sonstiges Game"}
- {id: 65, cat: Movies/BluRay, desc: "Movie BluRay"}
- {id: 66, cat: TV, desc: "TV-Serie BluRay"}
- {id: 67, cat: TV/HD, desc: "TV-Serie HD"}
- {id: 68, cat: TV/Anime, desc: "Anime Movie HD & BD"}
- {id: 69, cat: TV/Anime, desc: "Anime OVA HD & BD"}
- {id: 70, cat: TV/Anime, desc: "Anime Serie HD & BD"}
modes:
search: [q]
tv-search: [q, season, ep]
movie-search: [q]
login:
path: takelogin.php
method: post
inputs:
username: "{{ .Config.username }}"
password: "{{ .Config.password }}"
returnto: "/index.php"
test:
path: browse.php
search:
paths:
- path: browse.php
inputs:
$raw: "{{range .Categories}}c{{.}}=1&{{end}}"
search: "{{ .Query.Keywords }}"
incldead: "0"
orderby: "added"
sort: "desc"
rows:
selector: table.tableinborder > tbody > tr:has(a[href^="details.php"])
fields:
title:
selector: a[href^="details.php"]
category:
selector: a[href^="browse.php?cat="]
attribute: href
filters:
- name: querystring
args: cat
details:
selector: a[href^="details.php"]
attribute: href
download:
selector: a[href^=" /gettorrent/ssl/"]
attribute: href
files:
selector: td:nth-child(2) > table > tbody > tr:nth-child(2) > td:nth-child(1) > b:nth-child(2)
grabs:
selector: td:nth-child(2) > table > tbody > tr:nth-child(2) > td:nth-child(3) > b:nth-child(1)
size:
selector: td:nth-child(2) > table > tbody > tr:nth-child(2) > td:nth-child(1) > b:nth-child(1)
filters:
- name: replace
args: [".", ""]
- name: replace
args: [",", "."]
seeders:
selector: td:nth-child(2) > table > tbody > tr:nth-child(2) > td:nth-child(2) > b:nth-child(1)
leechers:
selector: td:nth-child(2) > table > tbody > tr:nth-child(2) > td:nth-child(2) > b:nth-child(3)
date:
selector: td:nth-child(2) > table > tbody > tr:nth-child(2) > td:nth-child(5)
filters:
- name: append
args: " +2:00"
- name: replace
args: ["\xA0", " "]
- name: dateparse
args: "02.01.2006 15:04:05 -07:00"
downloadvolumefactor:
case:
img[src="/pic/free.gif"]: "0"
"*": "1"
uploadvolumefactor:
case:
"*": "1"

View File

@@ -1,6 +1,7 @@
---
site: audiobooktorrents
name: Audiobook Torrents
description: "Audiobook Torrents (ABT) is a Private Torrent Tracker for AUDIOBOOKS"
language: en-us
type: private
encoding: UTF-8
@@ -61,7 +62,8 @@
path: /browse.php
search:
path: /browse.php
paths:
- path: /browse.php
inputs:
$raw: "{{range .Categories}}c{{.}}=1&{{end}}"
search: "{{ .Keywords }}"
@@ -133,4 +135,4 @@
selector: td[colspan=13]
filters:
- name: prepend
args: "{{ .Result.description }}<br>\n"
args: "{{ .Result.description }}<br>\n"

View File

@@ -29,7 +29,8 @@
path: index.php
search:
path: torrents.php
paths:
- path: torrents.php
inputs:
$raw: "{{range .Categories}}filter_cat[{{.}}]=1&{{end}}"
searchstr: "{{ .Query.Keywords }}"

View File

@@ -1,6 +1,7 @@
---
site: b2s-share
name: B2S-Share
description: "B2S-Share is a Brazilian Private site for TV / MOVIES / GENERAL"
language: pt-br
type: private
encoding: iso-8859-1
@@ -211,22 +212,43 @@
password: "{{ .Config.password }}"
test:
path: torrents.php
selector: div:has(a[href*="account-logout.php"])
search:
path: torrents-search.php
paths:
- path: torrents-search.php
keywordsfilters:
- name: re_replace
args: ["[Ss][0-9]{2}[Ee][0-9]{2,3}", ""] # remove season and episode from search
- name: re_replace
args: ["[^a-zA-Z0-9]+", "%"]
inputs:
search: "{{ .Keywords }}"
rows:
selector: table[class^="ttable_headinner"] > tbody > tr:has(a[href^="torrents-details.php?id="])
filters:
- name: andmatch
fields:
details:
selector: a[href^="torrents-details.php?id="]
attribute: href
title:
is_anime:
optional: true
selector: a[href^="torrents.php?cat=11"]
attribute: href
title_anime:
selector: a[href^="torrents-details.php?id="]
filters:
- name: re_replace
args: ["(Ep[\\.]?[ ]?)|([S]\\d\\d[Ee])", "E"]
title_normal:
selector: a[href^="torrents-details.php?id="]
filters:
- name: re_replace
args: ["^(.*)[ ]([Ss][0-9]{2}[Ee][0-9]{2,3}).*(?:(?:\\((.*?)\\)))(.*$)", "$3 $2 $4"] # Convert series title from "Translated Name SXXEXX (Original Name) [Other stuffs]" to "Original Name SXXEXX [Other stuffs]"
- name: re_replace
args: ["^(.*)[ ].*(?:(?:\\((.*?)\\)))(.*$)", "$2 $3"] # Convert movies title from "Translated Name (Original Name) [Other stuffs]" to "Original Name [Other stuffs]"
title:
text: "{{if .Result.is_anime }}{{ .Result.title_anime }}{{else}}{{ .Result.title_normal }}{{end}}"
download:
selector: a[href^="torrents-details.php?id="]
attribute: href

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