Compare commits

...

421 Commits

Author SHA1 Message Date
Garfield69
f3c6acf634 katcrs: added public tracker KickAssTorrent clone. resolves #2828 2018-09-21 21:47:58 +12:00
Garfield69
ab810a20db torrentgalaxyorg: add this public tracker. resolves #3792 2018-09-21 17:36:40 +12:00
Garfield69
60f1be6f18 hd4free: correct cat7 2018-09-21 16:19:34 +12:00
Jonathan
ab6f7d5218 Update ethor.yml (#3834)
- Fix language vfq (French version with voice in Quebec) in sonarr. Sonarr tell episode is in english but episode is in french
- Fix some tv show have space between season number and episode number
2018-09-19 12:51:47 +12:00
Garfield69
67f50e88a3 IdopeClone: replacement clone of Idope which is gone. Resolves #3832 2018-09-19 12:34:03 +12:00
Garfield69
79a354c6d9 hdhome: standardise link and paths 2018-09-18 15:41:42 +12:00
Garfield69
ee20b141da hd4free: prevent updater blowing away new site indexer 2018-09-18 14:33:45 +12:00
HDVinnie
0c67c6322a (Add) hd4free.yml (#3830)
* (Add) hd4free.yml

* (Update) README
2018-09-18 14:31:32 +12:00
Garfield69
99ed3fbc2c horriblesubs: cosmetic change to description
the n-dash does not decoded
2018-09-18 06:52:50 +12:00
kaso17
ef92bf5342 torznab: add padding to imdb 2018-09-17 19:06:53 +02:00
kaso17
053d2be3f3 HorribleSubs: add legacy URL 2018-09-17 18:48:37 +02:00
kaso17
c155bf8c8c Myanonamouse: reset cookies on login 2018-09-17 17:59:21 +02:00
kaso17
e1232800c6 Merge branch 'master' of https://github.com/Jackett/Jackett 2018-09-17 16:43:24 +02:00
kaso17
7a2c0bf260 HTTPWebClient: improve mono relative redirect bug workaround 2018-09-17 16:43:09 +02:00
kevinpawsey
203b5d1e37 AudioBookBay: add indexer (#3820)
* Create audiobookbay.yml

Basics of scraping AudioBookBay.

Will only scrape the first page at the moment, but seems to work ok.

* Update README.md

Added AudioBookBay in Supported Public Trackers

* Update README.md
2018-09-17 16:29:57 +02:00
kaso17
1325fc6391 TorrentDay: update default URL 2018-09-17 15:50:30 +02:00
kaso17
1c3bc3cbf4 UI: fix imdb link generation 2018-09-17 15:39:42 +02:00
Garfield69
8509276972 arabafenice: they are forcing https 2018-09-17 09:17:34 +12:00
Garfield69
e7710489ca nyaa.si: incomplete CA chain from lets encrypt CA provider. #3730 2018-09-16 08:46:03 +12:00
Garfield69
f6a669ea46 yggtorrent: switch to using id for form 2018-09-16 08:20:24 +12:00
Garfield69
68ad01e346 cpabien: new domain www -> ww1 2018-09-16 07:59:21 +12:00
Garfield69
ffda2c8269 gktorrent: they are forcing https 2018-09-16 07:56:12 +12:00
Garfield69
896b2ab954 Merge branch 'master' of https://github.com/Jackett/Jackett 2018-09-15 21:56:01 +12:00
Garfield69
bbcec8103d HorribleSubs: provide missing data
for apps that use Jackett as a proxy, and rely ion the existence of category, size, etc, I've populated the returned results with the missing anime category, and default values for seeders, leechers, size, downloadvolumefactor, and uploadvolumefactor.
2018-09-15 21:55:54 +12:00
Lucas
8f0ba9cefe Update YGGtorrent url (#3803)
* Update YGGtorrent url

* Update yggtorrent.yml
2018-09-15 21:19:13 +12:00
flightlevel
cc3ebbe1ae Package update 2018-09-15 15:28:50 +10:00
Gerdus van Zyl
d88db81207 Horrible Subs native indexer (#3794)
* Initial Version

* Episode number filtering
2018-09-15 15:25:27 +10:00
flightlevel
9a15f1d1a3 Remove horriblesubs yaml file 2018-09-15 15:22:38 +10:00
flightlevel
4e5f091b6c Check for Mono legacy TLS 2018-09-15 15:20:31 +10:00
Garfield69
517f196d73 torrentkim: readme update 2018-09-15 11:37:35 +12:00
Garfield69
9461d2470a Merge branch 'master' of https://github.com/Jackett/Jackett 2018-09-15 11:33:48 +12:00
Garfield69
c9f874dc93 torrentkim: gone. resolves #3306 2018-09-15 11:33:22 +12:00
hallengreenn
53b6285810 Update Nordicbits - Add support for all themes (#3801)
Last commit of nordicbits.cs only supported the 'old' v2 theme.
With this new update, I have added support for the v3 theme but continue to keep the old support for v2 by looking after the .css file loaded and return the proper _fDom in FindTorrentRows...

I have also added a extended error msg, when torrents can't be found that it could be because of an unsupported theme.
2018-09-15 08:04:13 +12:00
Garfield69
5d4e0c41d6 torrentday: add additional alternate domains. resolves #3796 2018-09-15 07:51:34 +12:00
Garfield69
754337b58f yggtorrent: sort results by publish_date desc. resolves #3775 2018-09-09 11:07:39 +12:00
Garfield69
16f79085ad btdb: load seeders & leechers from popularity field. resolves #3765 2018-09-09 10:43:09 +12:00
hashworks
005539d30d Updated categories for TorrentSyndikat (#3758)
* Updated categories

A lot of categories got dropped, also there are some new categories.
Additionally I updated the namings.

* Fix TV series category names
2018-09-06 04:00:05 +12:00
kaso17
2d5a90ae31 BaseIndexer: add cloudflare ReCaptcha detection 2018-09-04 19:30:48 +02:00
kaso17
fc060d6468 BitHUmen: imporve download link handling 2018-09-04 15:49:12 +02:00
kaso17
d0937d3561 BeyondHD: no longer ratioless 2018-09-04 15:30:16 +02:00
kaso17
7b8de5e28d RuTracker: fix login 2018-09-04 15:25:44 +02:00
HDVinnie
790f5ddfad redtopia: add indexer (#3660) 2018-09-04 14:39:12 +02:00
Garfield69
760231be43 torrentz2: amendment to 9a071a3457
using title: without a query string causes 0 results which meant the
jackett dashboard TEST button failed.
now we only add title: if a query was supplied.
2018-09-04 07:58:34 +12:00
kaso17
837e74a743 Updater: cleanup 2018-09-03 17:23:18 +02:00
kaso17
630f613721 Updater: workaround for WaitForExit() 2018-09-03 17:10:43 +02:00
kaso17
aba9e6db47 Updater: try SIGTERM first 2018-09-03 16:35:56 +02:00
kaso17
88858022af TorrentDay: improve cookie handling 2018-09-03 15:32:16 +02:00
kaso17
852bb27de0 Merge branch 'master' of https://github.com/Jackett/Jackett 2018-09-03 15:12:58 +02:00
kaso17
9a071a3457 Torrentz2: improve search results 2018-09-03 15:12:48 +02:00
Zotan
db11db28e4 Update uhdbits.yml (#3740)
Fix error 'Invalid non-ASCII or control character in header: 0x0009' on download (Tab character, upstream bug in kestrel)
2018-09-03 19:33:34 +10:00
Garfield69
79a8ef957f torrentz2: restore categories in results 2018-09-02 19:23:36 +12:00
Garfield69
0e0dfe80a7 gktorrent: new domain (ww2.gktorrent.com) 2018-09-02 08:32:46 +12:00
flightlevel
c112aef644 Update ConsoleOptions
Use --version to get version info and --help for help
-v no longer attempts to load Jackett
https://github.com/Jackett/Jackett/issues/3720
2018-08-31 20:33:05 +10:00
flightlevel
2e30fe1899 IlCorsaroNero: Update thumbprint
https://github.com/Jackett/Jackett/issues/3718
2018-08-31 20:18:16 +10:00
flightlevel
6b3ffa22c9 Package update 2018-08-31 20:16:07 +10:00
flightlevel
9e78f46010 Move HttpWebClientNetCore to Jackett.Common 2018-08-31 20:04:36 +10:00
kaso17
50a09189e4 Update Linux/OSX build instructions 2018-08-30 18:51:05 +02:00
kaso17
fcda42b9f1 Update Windows build instructions 2018-08-30 18:49:54 +02:00
snamds
48f72a3096 Mejortorrent: query clone (#3710)
* Make ReleaseInflo class derivation friendly

* Mejortorrent was corrupting the currentQuery passed to indexers
2018-08-30 18:34:41 +02:00
flightlevel
e4e1ac2c18 SpeedCd: Update parsing 2018-08-29 20:26:48 +10:00
flightlevel
a719048f81 Update Torrent9 domain 2018-08-29 19:45:59 +10:00
flightlevel
8f1f41a4a1 Kestrel only requires 127.0.0.1 2018-08-29 19:28:45 +10:00
flightlevel
fffd53cc1f Don't remove appsettings.json 2018-08-29 19:26:24 +10:00
snamds
ae7c139452 Derivation plus Newpct minor changes (#3691)
* Make ReleaseInflo class derivation friendly

* Improve releaseinfo inheritance
Ensure provider order is respected
Some season numbers were not parsed in rss mode
Remove s00e00 from movies results
2018-08-29 19:21:07 +10:00
Hugues Granger
76a3e7cd85 Add Retroflix (#3701)
* Create retroflix.yml

* Update README.md

* Update retroflix.yml

* Update retroflix.yml

* Update retroflix.yml

* Update retroflix.yml

* Update retroflix.yml

* Update retroflix.yml

* Update retroflix.yml
2018-08-29 09:23:23 +12:00
Garfield69
20495ef32b btbit: provide default seeders and leeches as web site has none.
some clients require more than 0 seedres to select successfully.
2018-08-27 18:18:45 +12:00
Garfield69
41b91bb0c3 torrent9: domain changed to www.torrent9.rip 2018-08-27 15:51:31 +12:00
kaso17
6e59cc4c33 YGGtorrent: update Animation category mapping 2018-08-25 20:09:16 +02:00
kaso17
2aaed9b9e4 ImmortalSeed: add Movies-4k 2018-08-25 19:23:43 +02:00
kaso17
f7dc404eaf ImmortalSeed: update categories 2018-08-25 19:14:18 +02:00
kaso17
f3b9e70dde Revert "DanishBits: disable imdb support (#3682)"
This reverts commit 3e9006464d.
2018-08-25 18:54:23 +02:00
kaso17
d065f0abf4 CouchPotatoTracker: fix imdb search 2018-08-25 18:53:47 +02:00
kaso17
6e173558db SpeedCD: fix login 2018-08-25 18:49:04 +02:00
kaso17
f78434e758 Torrenting: fix definition 2018-08-25 18:45:58 +02:00
kaso17
ef5f2ccb89 GkTorrent: update domain 2018-08-25 18:39:50 +02:00
kaso17
f05db7f544 ExoticaZ: fix login 2018-08-25 18:37:40 +02:00
kaso17
12cc25bdb0 ExoticaZ: update definition 2018-08-25 18:35:24 +02:00
kaso17
5936defc06 RevolutionTT: add automatic relogin 2018-08-25 18:32:10 +02:00
Andreas Christensen
3e9006464d DanishBits: disable imdb support (#3682)
Added "TorznabCaps.SupportsImdbSearch = false;" on line 42 to disable parameter "imdbid" for indexer DanishBits.
2018-08-25 18:15:34 +02:00
Gabriele
f7bf8fba40 BigTower: add indexer (#3689) 2018-08-25 18:13:04 +02:00
Garfield69
6bbb80a54e yggtorrent: changed domain once again. #3670 2018-08-23 13:05:09 +12:00
kaso17
7889077498 README: update nginx reverse-proxy example 2018-08-22 18:18:00 +02:00
flightlevel
074f0da27f Revert "Jackett.Common: Use NETStandard"
This reverts commit d7c35b2fe4.
2018-08-21 21:21:29 +10:00
flightlevel
d7c35b2fe4 Jackett.Common: Use NETStandard 2018-08-21 20:59:48 +10:00
flightlevel
4d8b55a92f Replace install_service_macos
https://github.com/Jackett/Jackett/issues/3638
2018-08-21 20:52:12 +10:00
Garfield69
7387679a6f eltorrents -> extratorrentclone part 2 2018-08-21 10:50:12 +12:00
Garfield69
af93571568 eltorrents -> extratorrentclone 2018-08-21 10:43:49 +12:00
Garfield69
1e2ecfc0c5 limetorrents: domain changed to .info. resolves #3648 2018-08-20 07:42:42 +12:00
Garfield69
b98a1ff1f5 remove yifi (yifimovie.co) dead #3649 2018-08-20 07:12:47 +12:00
Jorman
6170ef09b4 Update il corsaronero (#3652)
Advanced search always performed
now works even if no categories are selected into a manual search
2018-08-19 20:25:35 +02:00
Jorman
15a1c6566f tntvillage: improve title generation (#3651)
A little update to make:
case insensitive the regex
change web-dlmux to web-dl, sonar don't like it so much, hope resolve a lot of manual import from this traker
2018-08-19 15:29:43 +02:00
Jorman
113b3dffff Readme: add Eltorrents (#3645) 2018-08-19 15:18:13 +02:00
Jorman
511ae721e2 add Eltorrents indexer (#3644)
* Eltorrent

A extratorrent replacement?
Who knows, only the time can ...

* Update eltorrents.yml
2018-08-19 15:17:49 +02:00
flightlevel
8ce3b35595 Updater: Remove unused legacy files 2018-08-18 18:22:28 +10:00
flightlevel
69cb493144 Reorganise solution 2018-08-18 18:15:45 +10:00
flightlevel
e850a5315a Package update 2018-08-18 18:08:14 +10:00
flightlevel
d054bfce87 Remove references to NET452, no longer supported 2018-08-18 17:37:46 +10:00
flightlevel
7a0bafe528 Remove Engine
Dead code since upgrade to Jackett.Server
2018-08-18 17:35:00 +10:00
flightlevel
81b40df6ee Remove Jackett Owin web server
Dead code since upgrade to Jackett.Server
2018-08-18 17:31:28 +10:00
flightlevel
795c896abe Tests: Remove dependency on Jackett.dll 2018-08-18 17:27:35 +10:00
flightlevel
524a0c7885 Remove IsRunningLegacyOwin check
Dead code since upgrade to Jackett.Server
2018-08-18 17:09:19 +10:00
flightlevel
0ddaa3bef4 Remove CurlSharp
Dead code since upgrade to Jackett.Server
2018-08-18 16:46:31 +10:00
flightlevel
e180b4bfc2 Remove references to CurlSharp
Dead code since upgrade to Jackett.Server
2018-08-18 16:44:58 +10:00
flightlevel
16c9e95ee2 Remove Jackett.Console
Dead code since upgrade to Jackett.Server
2018-08-18 16:17:58 +10:00
Garfield69
e5be938c54 limetorrents: domain change to .me fix #3627 2018-08-18 11:53:04 +12:00
Jorman
5f81fa51fc Ilcorsaroblu: Update (#3629)
Changed andmatch filter
All regex are case insensitive
Some minor fix
2018-08-18 11:42:12 +12:00
Jorman
70014485a0 Ilcorsaronero: Update (#3630)
Changed the andmatch filter
All regex are case insensitive
Now all the search are made with the site advanced search up to page 10
2018-08-18 11:41:18 +12:00
Jorman
6f1f3434cc Shareisland: Update (#3631)
Changed the andmatch filter
All regex are case insensitivi
A lot of categories changed (noticed for coincidence, during some test on regex)
Some minor fix
2018-08-18 11:40:23 +12:00
Jorman
6323dc022f Girotorrent: Update (#3628)
Changed the andmatch filter
All regex are case insensitive
Some minor fix
2018-08-18 11:38:02 +12:00
Lucas
522d7eeb4c Fix YGGtorrent URL (#3615) 2018-08-17 21:58:11 +10:00
koper89
6065e1c576 Add red star torrent. (#3616) 2018-08-17 21:57:51 +10:00
koper89
eff17d8fe2 Added 720pier.ru (#3620)
* Add 720pier

* - Added size and date parsing.

* - Added categories.
2018-08-17 21:57:04 +10:00
flightlevel
2307f6d2a5 SppedCd: Update TVSD 2018-08-16 19:50:30 +10:00
koper89
2e95240d34 Add BTGigs polish tracker. (#3607) 2018-08-16 19:43:34 +10:00
koper89
95df5228c6 Added HQSource polish tracker support (#3606) 2018-08-16 19:43:22 +10:00
flightlevel
bc104e356c Tidy up build script 2018-08-16 19:41:42 +10:00
kaso17
ad143ce94f reverse proxy: use X-Forwarded-Host 2018-08-15 09:00:54 +02:00
flightlevel
05520f23d1 Idope: Add legacy links 2018-08-14 20:18:50 +10:00
tvebax
1884073c21 Update idope.yml (#3592)
Domain name changed.

Ref:
$ dig idope.cc @8.8.8.8 +short
104.27.131.126
104.27.130.126

$ dig idope.se @8.8.8.8
<snip>
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;idope.se.			IN	A
<snip>

https://www.reddit.com/r/Piracy/comments/96ajed/whats_with_idope_these_days/e407w1z
2018-08-14 20:15:51 +10:00
flightlevel
7d759917e6 Package updates 2018-08-14 20:02:54 +10:00
flightlevel
eccf4dc22c Jackett service: remove unused references 2018-08-14 19:59:32 +10:00
flightlevel
a752a39230 Add ability to use appsettings.json
https://github.com/Jackett/Jackett/issues/3583
2018-08-14 19:58:11 +10:00
hallengreenn
34dd2981b3 Update Nordicbits.cs (#3580)
Added porn to list of categorys and fixed bluray remux catagoryID.
2018-08-13 20:00:47 +10:00
kaso17
0adb54f4b2 kestrel: attempt to fix XForwardedProto issues 2018-08-12 12:18:14 +02:00
hallengreenn
2e77226f0c Update nordicb.org - categoryList for search (#3568)
I made some copy-paste errors, while building the categoryList.
Because of this - the seach string for Apps & Ebooks won't be builded correctly.
Fixed
2018-08-12 16:50:43 +10:00
flightlevel
31ae08544f Remove System.Runtime.InteropServices.RuntimeInformation.dll from Mono build
https://github.com/Jackett/Jackett/issues/3547
2018-08-12 16:49:52 +10:00
Garfield69
3da6e4ca1b torrent9: domain change. fix #3569 2018-08-12 08:06:21 +12:00
halali
c4cd17ce2d Update cztorrent.yml (#3551)
* Update cztorrent.yml

* Update cztorrent.yml
2018-08-11 12:53:35 +10:00
hallengreenn
ee18368192 Add support for Nordicbits.org/nordicb.org (#3552)
* Create Nordicbits.cs

Add support for Nordicbits / DK Private Tracker

* Create ConfigurationDataNordicbits.cs

Create Nordicbits.cs

Add support for Nordicbits / DK Private Tracker

* Update README.md

Added a new tracker Nordicbits

* Update Nordicbits.cs

The self-tester didn't work, because of the trackers use of 'Today' and 'Yesterday' in releases. Where other releases are "MMM dd yyyy".
This is fixed now.

* Update Nordicbits.cs

Search string wasn't build proberly, due to the catagory of nordicbits.
The images, which we use to determin which catagory the release is from goes like this - 
cat=5
But when we need to search under that catagory and have more than one, it should go like this -
cats2[]=5

Changed the categorieslist, by using replace and changed the query string to match the original search string.

* Update Nordicbits.cs

Should solve the bug - The string was not recognized as a valid DateTime. There is an unknown word starting at index 0.

* Update Nordicbits.cs

Tracker don't support imdb, therefore problems with handling of couchpotato, radarr or similar.
Fixed by setting imdb to false;
2018-08-11 12:53:06 +10:00
kaso17
09a7950c1d x264: add Login Type note 2018-08-06 13:14:44 +02:00
Chris Johnson
847688bae8 Updated Readme to include linux Ansible installations (#3516)
Added reference to a RHEL and Ubuntu ansible galaxy role for installing via Ansible.
2018-08-05 18:48:18 +02:00
Jorman
7fde427731 girotorrent: Update regex for better title parsing... (#3529)
Italian release suck, you can find S01E01 or 01x01 or even S01 E01.
So removed S and E from search (this bring in extra results) then try to parse and reconstruct the results
Hope for now is enough to have a better search, at least on Italian tracker, for the external tracker (where are present Italian release too), only god can tell ... Sonarr will parse the result during a rss sync, but during a search I think no result will present ... There are 2 possible solution
1. Find and eliminate all release that don't respect the standard
2. Make Jackett / Sonarr / Radarr a little smartest and include a kind of regional substitution during a searching phase
2018-08-05 18:45:42 +02:00
Jorman
7319078a5d shareisland: Update regex for better title parsing... (#3530)
Italian release suck, you can find S01E01 or 01x01 or even S01 E01.
So removed S and E from search (this bring in extra results) then try to parse and reconstruct the results
Hope for now is enough to have a better search, at least on Italian tracker, for the external tracker (where are present Italian release too), only god can tell ... Sonarr will parse the result during a rss sync, but during a search I think no result will present ... There are 2 possible solution
1. Find and eliminate all release that don't respect the standard
2. Make Jackett / Sonarr / Radarr a little smartest and include a kind of regional substitution during a searching phase
2018-08-05 18:44:55 +02:00
Jorman
495afb91e9 ilcorsaroblu: Update regex for better title parsing... (#3532)
Italian release suck, you can find S01E01 or 01x01 or even S01 E01.
So removed S and E from search (this bring in extra results) then try to parse and reconstruct the results
Hope for now is enough to have a better search, at least on Italian tracker, for the external tracker (where are present Italian release too), only god can tell ... Sonarr will parse the result during a rss sync, but during a search I think no result will present ... There are 2 possible solution
1. Find and eliminate all release that don't respect the standard
2. Make Jackett / Sonarr / Radarr a little smartest and include a kind of regional substitution during a searching phase
2018-08-05 18:42:17 +02:00
Jorman
aa3fa8717f ilcorsaronero: Update regex for better title parsing... (#3531)
Italian release suck, you can find S01E01 or 01x01 or even S01 E01.
So removed S and E from search (this bring in extra results) then try to parse and reconstruct the results
Hope for now is enough to have a better search, at least on Italian tracker, for the external tracker (where are present Italian release too), only god can tell ... Sonarr will parse the result during a rss sync, but during a search I think no result will present ... There are 2 possible solution
1. Find and eliminate all release that don't respect the standard
2. Make Jackett / Sonarr / Radarr a little smartest and include a kind of regional substitution during a searching phase
2018-08-05 18:41:20 +02:00
flightlevel
052e382d93 Assign webroot for static files
Removes the need for PhysicalFileProvider
2018-08-05 15:31:54 +10:00
flightlevel
db39b6afd9 Prevent cookie expiring after 20 minutes, now sessional 2018-08-05 15:19:31 +10:00
HDVinnie
e05efaeb1d Update blutopia.yml (#3528)
- closes #3523
2018-08-05 15:15:54 +10:00
kaso17
b94501f054 adjust content root path (#3527) 2018-08-05 15:15:23 +10:00
flightlevel
f00d8e192a Set the content root to the application folder
https://github.com/Jackett/Jackett/issues/3522
2018-08-04 16:49:26 +10:00
eric@skrobs
9ca4600eab yggtorrent: fix URL (#3515)
Fix YGGTorrent url
2018-08-03 06:15:08 +02:00
flightlevel
5e8ebd8579 Build script: Use Kestrel web server on Mono 2018-07-31 20:19:25 +10:00
flightlevel
748881ef70 Kestrel: accept imdbid+q
Copy of 0d6830b0aa
2018-07-31 20:14:02 +10:00
kaso17
42e6600c6a NextTorrent: removed (dead) 2018-07-31 11:00:34 +02:00
kaso17
85d17a7763 RGU: update definition 2018-07-30 19:19:17 +02:00
kaso17
b1391b0523 ExoticaZ (Your Exotic Torrents): update definition 2018-07-30 19:07:16 +02:00
Jorman
8510a42d7a Il Corsaro Blu: Update definition (#3493)
Quick fix for parsing
2018-07-30 18:08:17 +02:00
kaso17
e61f6e78b3 EoT-Forum: removed (dead) 2018-07-30 18:06:57 +02:00
kaso17
176ba5a6db AST4u: fix definition 2018-07-30 18:02:54 +02:00
kaso17
ad3c56e83b .NETCore: fix manual search categories 2018-07-30 17:39:28 +02:00
kaso17
2495a2f64e manual search: fix IMDB parsing 2018-07-30 15:18:06 +02:00
kaso17
0d6830b0aa accept imdbid+q 2018-07-30 15:06:05 +02:00
kaso17
ef316590cb support multiple category mappings 2018-07-30 14:25:35 +02:00
kaso17
c3c25190a2 gay-torrents.org: fix and improve definition 2018-07-30 14:23:59 +02:00
kaso17
fc3d8d1aec Gazelle: fix free leech token usage for large torrents 2018-07-30 13:16:13 +02:00
kaso17
bbb7d1c3c7 Karagarga: fix date and uploadvolumefactor 2018-07-30 13:05:01 +02:00
kaso17
89dfac3009 GUI: fix DL/UL factor rounding 2018-07-30 13:02:09 +02:00
kaso17
9610965979 GAYtorrent.ru: fix date 2018-07-30 12:43:00 +02:00
kaso17
8b501403e1 gay-torrents.org: fix type 2018-07-30 12:42:30 +02:00
kaso17
3a88aeb649 Cinematik: fix grabs 2018-07-30 12:42:04 +02:00
kaso17
0a0ba2291b Karagarga: fix grabs 2018-07-30 12:14:46 +02:00
kaso17
2484e22da9 GAYtorrent.ru: fix files 2018-07-30 12:14:30 +02:00
kaso17
e8ca3e6b52 gay-torrents.org: add grabs 2018-07-30 12:14:13 +02:00
natalia2493
d5c7445919 Fix BTXpress (#3488)
Parse error fix and cleanup
2018-07-29 14:14:13 +10:00
flightlevel
72045404d4 Torrent9: Update url
Fixes: https://github.com/Jackett/Jackett/issues/3483
2018-07-28 13:12:05 +10:00
flightlevel
1a6e1a8c60 Yggtorrent: Add missing slash 2018-07-28 13:11:24 +10:00
flightlevel
540dc0fad4 Proxy password: Change type to password
Fixes https://github.com/Jackett/Jackett/issues/3485
2018-07-28 13:10:56 +10:00
flightlevel
1db3e93ce1 Allow cookie cross site as per legacy
https://github.com/Jackett/Jackett/issues/3440
2018-07-28 13:10:01 +10:00
kaso17
a5ec65bff3 README: add nginx reverse proxy config example 2018-07-27 18:08:42 +02:00
kaso17
c4e3aa8a64 add x-ite.me indexer
Thank you LA5T
2018-07-27 16:04:11 +02:00
kaso17
e3e183d86b Karagarga: improve definition
Thank you LA5T
2018-07-27 16:00:22 +02:00
kaso17
bfe892f2c8 GAYtorrent.ru: improve definition
Thank you LA5T
2018-07-27 15:55:19 +02:00
kaso17
b28116c10f gay-torrents.org: use username/password input names 2018-07-27 15:52:05 +02:00
kaso17
52c408fce7 Add gay-torrents.org indexer
Thank you LA5T
2018-07-27 15:49:27 +02:00
kaso17
a70997ad7f Cinematik: improve definition
Thank you @LA5T
2018-07-27 15:46:25 +02:00
kaso17
8840de316d Merge branch 'master' of https://github.com/Jackett/Jackett 2018-07-26 17:34:34 +02:00
kaso17
409483e680 Kapaki: add support for modern style 2018-07-26 17:34:24 +02:00
flightlevel
b19d690305 Jackett.Tray: Hide form 2018-07-26 22:07:04 +10:00
natalia2493
0fabaf2fe0 Update BTXpress (#3404)
- Removed IMDB Description as it is not needed
- Removed Audio Category
2018-07-26 20:49:19 +10:00
Jorman
3035d8b901 Domain changed (#3459) 2018-07-25 16:20:34 +12:00
betamax2021
f3d73b5661 Build From Source OSX (#3456)
* Update README.md

Added OS X steps to build from source

* Update README.md

Formating Fix
2018-07-23 21:16:49 +10:00
flightlevel
f335dbf7bc Jackett Tray: Hide from ALT + TAB
https://github.com/Jackett/Jackett/issues/1959
2018-07-22 22:03:04 +10:00
flightlevel
b5178dc7b8 YggTorrent; Update Url
Fixes https://github.com/Jackett/Jackett/issues/3229
2018-07-21 21:47:45 +10:00
flightlevel
ad09a4dd77 Limetorrent: Url update
Fixes https://github.com/Jackett/Jackett/issues/3431
2018-07-21 21:46:55 +10:00
flightlevel
da0ead13f4 MejorTorrent: Update Url
https://github.com/Jackett/Jackett/issues/1468
2018-07-19 20:48:56 +10:00
ATAlgaba
4b6a9376de Update anidex.yml (#3411)
Remove anidb id - sorting names was acting weird as episode numbers were mistaken with the anidb id
2018-07-17 19:45:49 +10:00
ATAlgaba
3eab605423 Update frozenlayer.yml (#3401)
* Update frozenlayer.yml

Better filtering for Absolute Episode Searching.

* Update frozenlayer.yml

Append Spanish language
2018-07-17 19:45:25 +10:00
flightlevel
7fc37f1156 IlCorsaroBlue: Incomplete CA Chain
#3395
2018-07-15 11:02:59 +10:00
flightlevel
9f03f8129a TorrentDay: Correct UHD movies
Fixes https://github.com/Jackett/Jackett/issues/3393
2018-07-14 14:45:40 +10:00
flightlevel
51aa6fdf13 Deprecate libcurl 2018-07-14 14:44:23 +10:00
flightlevel
f2f602dcc5 Mono 5.8 or greater is now required to start Jackett 2018-07-14 14:43:46 +10:00
flightlevel
a217381668 Fix blackhole decoding issue 2018-07-14 14:42:46 +10:00
flightlevel
4bd7befb50 Update to .NET Core 2.1.2 2018-07-13 22:18:11 +10:00
flightlevel
56074155e9 Reverse proxy support for Kestrel 2018-07-13 22:15:09 +10:00
flightlevel
86a5a9cd25 Bump build version 2018-07-12 21:29:44 +10:00
flightlevel
1792ed276e Remove Windows Owin from build 2018-07-12 21:16:38 +10:00
flightlevel
4d1e4b59c8 Update to .NET Core 2.1.1 2018-07-11 19:37:19 +10:00
kaso17
e1ff4b9e12 GkTorrent: update links 2018-07-10 18:44:30 +02:00
kaso17
86400e1b8a Racing4Everyone: fix definition 2018-07-10 18:41:08 +02:00
kaso17
b3d53d1c01 WorldOfP2P: fix login 2018-07-10 18:27:02 +02:00
kaso17
471d494b3b Blutopia: fix definition 2018-07-10 18:09:53 +02:00
flightlevel
6e7d983fc3 Add extra logging 2018-07-10 22:22:02 +10:00
flightlevel
fd1073d0b5 Package update 2018-07-09 21:05:15 +10:00
flightlevel
7815615112 BTXpress: Change music to Audio 2018-07-09 21:00:42 +10:00
flightlevel
a6d8e68ca9 Minor changes for OMDB update 2018-07-09 21:00:17 +10:00
natalia2493
9593ba2414 Update BTXpress (#3365)
* Add btxpress.yml

* Update README.md

* Delete btworld

BTWorld is now known as BTXpress

* Update BTXpress

There was a issue with the selectors which has been fixed

* Update BTXpress

td:nth-child selectors were giving errors.

* Update btxpress.yml
2018-07-09 20:41:56 +10:00
HDVinnie
8c95045a4a (Update) blutopia.yml (#3357)
- added new input field "description" which is used to be able to search into torrent descriptions and media info using keywords
- This doesn't fix #3355 . Im not sure what the issue is. Maybe @kaso17 can check it out. I believe you still have a account there. If not let me know.
2018-07-09 20:41:32 +10:00
Tanel Puhu
667317e513 let's format the Imdb (#3354) 2018-07-09 20:40:37 +10:00
Jay Otterbein
0026a4f26e Allow configuration of omdb url (#3353)
OMDB recently added a private.omdbapi.com domain for supporters and this option allows the user to customize it while also allowing that url to change more rapidly in the future
2018-07-09 20:37:24 +10:00
Ivan de la Beldad Fernandez
2fac90df9f feat(mejortorrent): improve movie search (#3352)
* feat(newpct): rename title to make them more standarized

* fix: add site link configurable

* feat: add tests if news are not available

Sometimes the web has no news, and even if the tv show searcher is
working it throws an error. This way it will check news, and, if not
available, will check some series to check aliveness.

* fix: remove apostrophes from search

closes #3315

* fix: initialize search term if it's null

* fix: add multiepisode parsing and minor improvements

Now a quality it's ensured
Now quality it's cleaned from brackets
Add dash as multiepisode separator

* refactor: move tv search to function and change site link

Sitelink is now a property class

* refactor: extract function to get series uris

* refactor: extract function to get releases from one uri

* feat: add fallback to shows starting with "the"

Whenever a shows doesn't return results and doesn't start with "the"
search one more time prepending "the".

The motivation of this is because of Sonarr sanitizes queries before
sending them to Jackett. This indexer needs the article but Sonarr
removes it before.

* fix(newpct): add missing guid based on link

That was causing missing files on applications consuming the newpct
indexer.

* feat(mejortorrent): add movie search

closes: #3310

* feat(mejortorrent): add parse and filter by year

* feat(mejortorrent): change movie search algorithm

Now movie search is based on longest word, then results are filtered
ignoring special characters.

* fix(mejortorrent): restore query so jackett log it correctly

* fix: add small year correction

Some movies are tagged with the year before or after, I think it's safe to
fix years with exactly the same name and only a year of difference.
2018-07-09 20:35:30 +10:00
flightlevel
424e7b773d Mono 5.8 in readme 2018-07-06 21:04:31 +10:00
ATAlgaba
d25506e595 frozenlayer: Parse seasons greater or equal than 10 (#3341)
* Parse seasons greater than 10

* Update frozenlayer.yml

change * to +
2018-07-06 11:36:02 +02:00
ATAlgaba
a83e90e9ce XbytesV2: replace file languages (#3340)
Replace Xbytes language tag to language name in English
2018-07-06 11:33:49 +02:00
natalia2493
ea93182d96 Add BTXpress (#3339)
* Add btxpress.yml

* Update README.md

* Delete btworld

BTWorld is now known as BTXpress
2018-07-06 11:31:19 +02:00
HDVinnie
d60ee24111 blutopia: remove imdb field (#3313)
This doesn't fix anything but the IMDB link is no longer available
2018-07-04 18:57:57 +02:00
Ivan de la Beldad Fernandez
40e5c999b3 mejortorrent: add parse and filter by year (#3336)
* mejortorrent: add parse and filter by year
2018-07-04 18:54:40 +02:00
kaso17
6175b805d2 update firefox cookie screenshot 2018-07-04 18:42:27 +02:00
kaso17
5b6ba8d75f add firefox cookie screenshot 2018-07-04 18:40:02 +02:00
kaso17
10b0f0b1ce add cookies-chrome screenshot 2018-07-04 18:11:42 +02:00
Ivan de la Beldad Fernandez
a81ef63075 mejortorrent: add movies search (#3334)
* feat(mejortorrent): add movie search

fixes #3310
2018-07-04 17:10:21 +02:00
kaso17
2dc5edbb55 Merge branch 'master' of https://github.com/Jackett/Jackett 2018-07-04 09:49:08 +02:00
kaso17
636be458a6 TehConnection.me: add indexer 2018-07-04 09:48:56 +02:00
kaso17
64283f137c Zooqle: add andmatch 2018-07-04 09:47:48 +02:00
kaso17
ec1c9a9461 Mega-Bliz: add andmatch 2018-07-04 09:47:33 +02:00
Ivan de la Beldad Fernandez
d9a806d236 newpct: add guid (#3329)
* fix(newpct): add missing guid based on link

That was causing missing files on applications consuming the newpct
indexer.
2018-07-03 16:17:16 +02:00
Ivan de la Beldad Fernandez
ebd294b602 feat(newpct): add fallback when no releases are found (#3328)
* refactor: move tv search to function and change site link

Sitelink is now a property class

* refactor: extract function to get series uris

* refactor: extract function to get releases from one uri

* feat: add fallback to shows starting with "the"

Whenever a shows doesn't return results and doesn't start with "the"
search one more time prepending "the".

The motivation of this is because of Sonarr sanitizes queries before
sending them to Jackett. This indexer needs the article but Sonarr
removes it before.
2018-07-03 14:29:06 +02:00
Ivan de la Beldad Fernandez
6081094b73 newpct: fix parser multi-episode and minor improvements (#3327)
* fix: add multiepisode parsing and minor improvements

Now a quality it's ensured
Now quality it's cleaned from brackets
Add dash as multiepisode separator

* fix: prevent an error if cannot guess serie name from title

* fix: now title is being extracted correctly
2018-07-03 11:01:08 +02:00
Ivan de la Beldad Fernandez
115dfd20e7 Mejortorrent: improvements (#3324)
* feat(newpct): rename title to make them more standarized

* fix: add site link configurable

* feat: add tests if news are not available

Sometimes the web has no news, and even if the tv show searcher is
working it throws an error. This way it will check news, and, if not
available, will check some series to check aliveness.

* fix: remove apostrophes from search

closes #3315

* fix: initialize search term if it's null
2018-07-02 19:10:31 +02:00
kaso17
038fe2866b Merge branch 'master' of https://github.com/Jackett/Jackett 2018-07-02 14:44:43 +02:00
kaso17
aec40373d3 New Real World: fix parser 2018-07-02 14:44:34 +02:00
flightlevel
c9b8d27139 Disable .NET Core builds for now 2018-07-02 22:37:48 +10:00
flightlevel
d0793ebcba Merge branch 'master' into dotnetcore 2018-07-02 21:11:13 +10:00
flightlevel
00e4e8109e Reserve all addresses for port 2018-07-02 21:09:42 +10:00
kaso17
bcc1dc1948 fix custom certificate validation handler (#3297)
* fix netcore custom certificate validator

* conditional HttpWebClientNetCore register

* deprecate IgnoreSslErrors option

* Use httpclient when running full framework
2018-07-02 13:05:24 +02:00
flightlevel
1e67996df0 Tidy up logging renderer 2018-07-02 21:03:03 +10:00
Ivan de la Beldad Fernandez
947bed0a46 feat(newpct): rename title to make them more standarized (#3321) 2018-07-02 12:56:53 +02:00
flightlevel
0dd9842e84 Update Tests to net461 2018-07-01 14:40:06 +10:00
flightlevel
42728e2694 Update installer so that it kills Jackett when uninstalling 2018-06-30 22:49:11 +10:00
Celedhrim
44d14dc19c downloadville: fix definition (#3308) 2018-06-29 17:34:21 +02:00
kaso17
2e95c491a1 Blutopia: fix for new layout 2018-06-29 17:33:21 +02:00
kaso17
acfc776462 Torrent9: update domain 2018-06-29 15:16:13 +02:00
kaso17
b6692a7dab LostFilm: fix date parsing 2018-06-29 15:16:04 +02:00
kaso17
34fc2a0d15 cpasbien: update domain 2018-06-29 14:49:26 +02:00
kaso17
07938dcef8 BJShare: enable tracker specific categories 2018-06-29 14:16:41 +02:00
kaso17
847c5dfdcb Frozen Layer: improve title parsing (#3301)
Thank you @IhToN
2018-06-29 14:01:37 +02:00
ATAlgaba
bd47603f0d xbytes2: fix downloadvolumefactor parsing
Update _downloadvolumefactor_ as now they are using .png files
2018-06-28 18:22:00 +02:00
kaso17
8b86146715 YGGtorrent: fix typo 2018-06-28 16:50:45 +02:00
kaso17
5343c9109b YGGtorrent: fix size and add grabs 2018-06-28 16:46:00 +02:00
kaso17
687acae90b Torrent.LT: replace dots 2018-06-28 16:30:57 +02:00
kaso17
871e540957 The New Retro: add support for PIN 2018-06-28 16:21:47 +02:00
Akuma737
b0ce0b5350 metaltracker: Use Artist instead of keyword (#3295)
use artist instead of keyword if artist is supplied to make it somewhat compatible with lidarr(by default supplies artist and album with empty keyword)
2018-06-27 16:31:36 +02:00
flightlevel
bc965b1a0c Merge branch 'master' into dotnetcore 2018-06-27 22:12:53 +10:00
flightlevel
89b60c4c15 Update README.md 2018-06-27 22:11:57 +10:00
flightlevel
47a84775c5 Launch tray icon when Windows service updates 2018-06-27 22:02:51 +10:00
kaso17
8de0b0cbad ProtectionService: fix empty password handling 2018-06-26 17:58:46 +02:00
kaso17
b95fbd76a7 Merge branch 'master' of https://github.com/Jackett/Jackett 2018-06-26 17:47:29 +02:00
kaso17
6b44cc9b74 fix migration logic 2018-06-26 17:47:19 +02:00
flightlevel
0612c70ca1 Mono 5.8 is the minimum required 2018-06-26 20:21:21 +10:00
flightlevel
060972475f Windows Tray/Serice update improvements 2018-06-26 19:44:12 +10:00
kaso17
28bbeec462 MyAnonamouse: improve re-login detection 2018-06-24 18:38:49 +02:00
flightlevel
099adadbdc Don't need to clean BuildOutput 2018-06-24 18:07:41 +10:00
flightlevel
43511c6ecb Merge branch 'master' into dotnetcore 2018-06-24 18:06:09 +10:00
flightlevel
aa3e9c6fde Updater: Add version element 2018-06-24 18:04:59 +10:00
flightlevel
e53cdcb909 Update build script for Kestrel builds 2018-06-24 12:13:33 +10:00
flightlevel
fd14ad3f93 Remove Jackett.Service.Windows from solution file 2018-06-24 12:06:28 +10:00
flightlevel
ca1af97e42 Remove Jackett.Service.Windows
No longer needed now that Jackett.Service covers both scenarios
2018-06-24 12:04:27 +10:00
flightlevel
4970219ea7 Remove call to PlatformAbstractions 2018-06-24 12:00:59 +10:00
flightlevel
54c5b66ecf Merge branch 'master' into dotnetcore 2018-06-24 11:43:02 +10:00
flightlevel
8ae09d453d Remove Microsoft.Extensions.PlatformAbstractions dependency
Was only needed for .NET Core 1
2018-06-24 11:38:57 +10:00
flightlevel
f2e7ec25c8 Update build in preparation for Kestrel builds 2018-06-24 11:32:22 +10:00
flightlevel
7f9fff4683 Jackett.Updater: Make compatible with both legacy & .NET Core 2018-06-24 11:31:08 +10:00
Jorman
13f2eea298 TNTVillage: Update for better regex expression (#3276)
This tracker always respect the format
SXXEYY so I cleaned up the code, I only updated the code adding a simple regex, just in case a rel with XXxYY came up!
2018-06-24 00:50:58 +02:00
kaso17
d6f5a1b242 Merge branch 'master' of https://github.com/Jackett/Jackett 2018-06-23 10:26:31 +02:00
kaso17
ab37f0c2c7 Fuzer: add invisible recaptcha detection 2018-06-23 10:26:02 +02:00
flightlevel
9710b37064 Merge branch 'master' into dotnetcore 2018-06-23 11:39:19 +10:00
flightlevel
54f7568111 InnoSetup: Make paths parameters 2018-06-23 11:38:32 +10:00
flightlevel
06758964c0 Jackett.Service: Make compatible with both legacy & .NET Core 2018-06-23 11:37:49 +10:00
flightlevel
b56552e0f4 Updater: Remove unused reference 2018-06-23 11:36:29 +10:00
kaso17
ef8653f7d2 AST4u: add support for alternative layout 2018-06-22 17:32:44 +02:00
Ivan de la Beldad Fernandez
d5a6987390 add mejortorrent indexer (#3268)
* feat: start mejortorrent indexer, create basic configuration

* feat: add basic tv show scraper for series search

* fix: add guid so more than one episode is returned

* feat: add date to episodes

* feat: add support for multi-episodes

* feat: add proper filtering

* fix: change filter when there is no season or no episode

* feat: implement tv show rss scraper with no links by the moment

* feat: finish tv-shows rss

* fix: prevent sdtv to be marked as hdtv

* docs: add mejortorrent indexer to readme

* add url encode

* fix encoding

Content seems to be UTF8

* add missing include

* fix my fixes

* fix encoding
2018-06-22 16:48:33 +02:00
kaso17
8fb92ca05c Cinemageddon: attempt to fix download 2018-06-22 16:16:26 +02:00
morpheus133
11c7015c17 NCore: fix title generation (#3270) 2018-06-22 16:12:22 +02:00
flightlevel
8bc5d813b7 Tray Icon fix log message 2018-06-22 22:49:17 +10:00
flightlevel
012f5f05cc Update Logging 2018-06-22 22:35:58 +10:00
flightlevel
cd65ec7a71 Merge branch 'master' into dotnetcore 2018-06-22 22:32:48 +10:00
flightlevel
45826df4fe Make Jackett Tray compatible with both legacy & .NET Core projects 2018-06-22 22:29:45 +10:00
flightlevel
0645bab613 .NET Core preparation: Access Windows service 2018-06-22 22:21:10 +10:00
Jorman
4e409dfb50 Update certificate (#3257) 2018-06-19 18:32:22 +10:00
Raffaele
52a39b7a71 Updated categories (#3254)
After the "reboot" of the tracker many categories have changed.
2018-06-19 18:31:51 +10:00
flightlevel
5278b9fb47 Log Asp.Net.Core web requests 2018-06-18 22:01:25 +10:00
flightlevel
1ecafe3667 ResultsController - get BlackHole from ServerConfig without engine 2018-06-18 21:54:39 +10:00
flightlevel
190a415907 Remove unused runtimeSettings parameter 2018-06-18 21:50:09 +10:00
flightlevel
ca609a9e62 Add Legacy routes rewrite 2018-06-18 21:48:45 +10:00
flightlevel
b72ade7b27 Add ListenPublic/Private overrides 2018-06-17 14:39:49 +10:00
flightlevel
e7098d01c5 CommandLineParser: Case insensitive 2018-06-17 14:12:52 +10:00
flightlevel
b04ee56612 Process settings before creating WebHost 2018-06-17 14:02:13 +10:00
flightlevel
72a18e9b73 Get startup configuration without using DI 2018-06-17 12:39:03 +10:00
flightlevel
6be64bbe36 Merge branch 'master' into dotnetcore 2018-06-17 11:49:51 +10:00
flightlevel
cf3848a54f .NET Core preparation: Access ServerConfig without using JackettModule 2018-06-17 11:48:59 +10:00
flightlevel
1a14e8dd4b improve BEncode error handling: Pull in changes from master
3468e7d404
2018-06-16 18:40:31 +10:00
flightlevel
a25eb7f951 Merge branch 'master' into dotnetcore 2018-06-16 18:36:54 +10:00
flightlevel
9437cd54d3 Setup logging before DI 2018-06-16 18:32:08 +10:00
flightlevel
be55c5e4a6 Restart WebHost after port change in UI 2018-06-16 18:06:14 +10:00
kaso17
f1d774aa07 Gazelle: don't use hardcoded encoding 2018-06-15 17:18:47 +02:00
kaso17
c109133fcc Redacted: fix download without FL tokens 2018-06-15 17:14:56 +02:00
kaso17
3538fdfaf7 Synthesiz3r: removed (dead) 2018-06-15 11:58:29 +02:00
kaso17
3468e7d404 improve BEncode error handling 2018-06-15 11:12:03 +02:00
kaso17
ec4afda184 Audiobook Torrents: improve compatibility 2018-06-15 10:44:26 +02:00
kaso17
67b1835264 Bit-City Reloaded: fix login 2018-06-15 10:30:43 +02:00
kaso17
aee64aa589 Shareisland: update URL 2018-06-14 19:28:51 +02:00
kaso17
687e6e237f TorrentWTF: removed (dead) 2018-06-14 19:28:36 +02:00
kaso17
b48dd5e930 cpasbien: URL update 2018-06-14 18:38:07 +02:00
kaso17
5ee6833610 NCore: fix else 2018-06-14 17:53:46 +02:00
morpheus133
c998ba3762 Additional fix for #1450 (#3227)
* Additional fix for #1450
Sonarr is search for a tilte if the result title is different it reject it.
So it is not enough that Jackett give the result it must give with the same language.

Workaround create a new title from the original one and from the title.
It also make some fine tunning:
if title not contains the language we add it from category

* Make decision safer
2018-06-14 17:44:22 +02:00
kaso17
2d4f7ab0e9 Waffles: fix category parsing 2018-06-14 17:39:16 +02:00
kaso17
676d03eb88 mono: redirect workaround 2018-06-14 17:28:57 +02:00
flightlevel
68351a480b Merge branch 'master' into dotnetcore 2018-06-14 19:29:02 +10:00
flightlevel
33e35f1bd3 Re-enable the updater 2018-06-14 19:21:31 +10:00
flightlevel
e82b54994e Update build for Mono 2018-06-14 19:18:17 +10:00
garfield69
6f7ecbfb7b Yggtorrent: domain changed, fixes #3228 2018-06-13 13:01:32 +12:00
Raphael Barreiros
c4aa49eb32 Update BJ-Share to new domain name (#3225)
* Update BJ-Share to new domain name

BJ-Share changed its domain from bj-share.me to bj-share.info

* Added LegacySiteLinks method
2018-06-13 07:44:42 +12:00
garfield69
32aae44ffc Btbit: fix slash in wrong place #3902 2018-06-13 07:04:35 +12:00
garfield69
7883534c5e Btbit: apply sort for all results #3209 2018-06-13 06:49:10 +12:00
kaso17
b58c9fb718 HDHome: try to fix search 2018-06-11 18:31:27 +02:00
kaso17
99d8f63f9e HDChina: try to fix search 2018-06-11 18:31:10 +02:00
la55u
635e8240d2 RevTT: added files count (#3213) 2018-06-11 17:36:29 +02:00
R91g
117a670aa3 Update readme (add HD-Spain tracker) (#3223)
Add new private tracker HD-Spain
2018-06-11 17:33:49 +02:00
R91g
f49c58a1fa HD-Spain: add indexer (#3222)
Add Spanish Private HD tracker https://www.hd-spain.com/
Based on Albvadi's code from HD-Spain forum all credit to him, I only added some changes for better search, ISO correct and spain flag detection
2018-06-11 17:33:26 +02:00
kaso17
2492f1b797 NCore: add comment 2018-06-11 17:31:46 +02:00
kaso17
d6781f67b2 NCore: improve search fix 2018-06-11 17:28:24 +02:00
morpheus133
2e0c22eb6d NCore: fix for #1450 (#3220)
Some workoround to "Ncore - not forward all search results to Sonarr, Radarr"
In case of TV shows if nothing is founded, retry the search without SxxExx after the show name.
This will list all torrent also if their title or description are changed.
Than add the result only if it contains the skipped SxxExx
2018-06-11 17:15:21 +02:00
flightlevel
211e152863 Merge branch 'master' into dotnetcore 2018-06-11 17:30:57 +10:00
flightlevel
f7bf4060ea Don't publish experimental artifacts 2018-06-11 17:21:34 +10:00
flightlevel
8c953bbf01 Avoid Engine for AspNetCore 2018-06-11 17:17:56 +10:00
aurelien
4e91761fdf Elite Tracker: Add HTTPS tracker option (#3217)
* Add option for Elite Tracker (FR) for download torrent using https for tracker URL.

* change return type.
clean code.

* use the SiteLink variable instead of hard coding
2018-06-11 06:42:21 +02:00
kaso17
53f8465e67 Demonoid: change to public 2018-06-10 15:55:51 +02:00
flightlevel
5818b914a3 Include Mono version check 2018-06-10 22:31:55 +10:00
flightlevel
0680d39d90 Torznab: Pull in improved error handling
7f163c3945
2018-06-10 21:56:45 +10:00
flightlevel
4ca6676be0 Blackhole: Pull in fix magnet links
f3290800d8
2018-06-10 21:54:12 +10:00
flightlevel
3d85e751b7 Rewrite rule: Handle no path after base path 2018-06-10 21:52:13 +10:00
flightlevel
965da06214 Merge branch 'master' into dotnetcore 2018-06-10 12:53:02 +10:00
flightlevel
e8bc2816ef Update migration logging 2018-06-10 12:51:34 +10:00
flightlevel
28ed7cc8a5 BJShare: Remove unused variable
Remove warning in build
2018-06-10 12:40:02 +10:00
flightlevel
089d9f2e3d Ignore launchSettings.json 2018-06-10 12:38:32 +10:00
flightlevel
9abce7a586 Update build script so that binaries get pushed 2018-06-10 12:34:37 +10:00
flightlevel
53162b4bd3 Add back Windows Service functionality 2018-06-10 12:33:16 +10:00
flightlevel
80d78a027b Copy ServiceConfigService over untouched 2018-06-10 12:29:07 +10:00
garfield69
b4eda2ed54 Ettv: sort by created for rss, test and no-keyword search #3209 2018-06-09 08:01:24 +12:00
garfield69
4d8d21a815 Btbit: sort by created for rss, test, and no-keyword searches #3209 2018-06-09 07:39:08 +12:00
kaso17
f3290800d8 bloackhole: fix magnet links 2018-06-08 16:04:54 +02:00
kaso17
22a858c076 SceneTime: fix search 2018-06-07 18:33:44 +02:00
kaso17
823419c032 Shareisland: fix legacylinks 2018-06-07 18:19:57 +02:00
Jorman
908d3f64f4 Added Audiobook category (#3203) 2018-06-06 12:44:49 +12:00
flightlevel
3843d68766 Merge branch 'master' into dotnetcore 2018-06-05 21:53:56 +10:00
flightlevel
4b599f391c Mono 5.8 is the minimum supported runtime
#3181 fix. Can get away without using RuntimeInformation and didn't
consider public trackers without a password
2018-06-05 21:47:20 +10:00
kaso17
6d8239caab Demonoid: improve download debugging 2018-06-05 13:34:54 +02:00
Jorman
dae37f273a ilcorsaroblu: Update url (#3202) 2018-06-05 13:21:37 +02:00
kaso17
1615bff2d0 handle RuntimeInformation exception 2018-06-05 13:14:32 +02:00
kaso17
b303befbb9 SceneTime: fix indexer 2018-06-05 13:09:07 +02:00
kaso17
e243c11cc0 update mono reference 2018-06-05 07:24:05 +02:00
Travis Boss
c860bca320 changed log button from btn-danger to btn-success, less scary (#3196) 2018-06-04 14:59:16 +12:00
flightlevel
a60c1fca36 .NET 4.6.1 or Mono 5.4 is now the minimum supported runtime 2018-06-03 21:27:47 +10:00
flightlevel
23f55ef33a Continue moving configuration across 2018-06-03 21:11:18 +10:00
la55u
5ad2c7a371 RevTT: Minor fixes (#3193)
* fixed RevTT pc/iso category

* added grabs count to RevTT
2018-06-03 01:11:42 +02:00
flightlevel
e4c729a588 Merge branch 'master' into dotnetcore 2018-06-02 17:45:27 +10:00
Jorman
3df0218347 Changed link after site fix (#3188) 2018-06-02 17:43:46 +10:00
flightlevel
601783aef6 .NET Core preparation 2 2018-06-02 17:42:01 +10:00
flightlevel
f09c5722be Update to .NET core 2.1 RTM and setup builds 2018-06-02 17:33:26 +10:00
flightlevel
e73ae99e38 Implement AspNetCore.DataProtection to replace DPAPI 2018-05-30 21:43:58 +10:00
flightlevel
10c5c99385 Merge branch 'master' into dotnetcore 2018-05-30 21:30:58 +10:00
flightlevel
ac5af81344 .NET Core preparation (#3177)
The DPAPI won't be present, will be using AspNetCore DataProtection
instead
2018-05-30 21:28:20 +10:00
Celedhrim
823563c84f downloadville: fix typo (#3175)
Fix typo if MULTI replacement is check
2018-05-29 22:07:31 +02:00
Celedhrim
47410c5eb6 yggtorrent: fix typo (#3174)
Fix typo if multi language replacement is activate
2018-05-29 22:07:05 +02:00
kaso17
af135f4ae9 Torrent9: update links 2018-05-29 14:41:08 +02:00
kaso17
3eeced3a04 Racing4Everyone: update links 2018-05-29 14:40:56 +02:00
kaso17
8ea99b548d PolishSource: add login detection 2018-05-29 14:09:47 +02:00
kaso17
ae73e8188d Torrent.LT: update categories
fixes #2279
2018-05-29 13:48:07 +02:00
kaso17
9c5cda72da Demonoid: fix download handling 2018-05-29 13:26:35 +02:00
Jonas Stendahl
fb1e24799d TorrentBytes: Don't use truncated release names (#3168) 2018-05-29 12:24:13 +02:00
bpikap
5721948434 torrent-turk: add indexer (#3161)
* Add tracker torrent-turk

* Add torrent-turk to readme
2018-05-29 12:23:39 +02:00
Jorman
d7b6f413be README: Update for Girotorrent (#3159)
Added new girotorrent
2018-05-29 12:23:01 +02:00
Jorman
959ec4667d Girotorrent:_ add indexer (#3158)
Italian Private Tracker
2018-05-29 12:22:45 +02:00
kaso17
20433db169 RevolutionTT: remove debug output 2018-05-24 16:28:14 +02:00
kaso17
54465798e9 GazelleGames: add relogin detection 2018-05-24 16:13:13 +02:00
kaso17
313147d224 Demonoid: add redirect error detection 2018-05-24 16:05:45 +02:00
kaso17
84bd947eca ICE Torrent: update definition 2018-05-24 16:05:23 +02:00
kaso17
366abc4431 Mega-Bliz: fix and improve definition 2018-05-24 15:45:23 +02:00
DarkSupremo
2f7fa2f063 Bjshare: fix broken regex (#3137) 2018-05-23 15:40:23 +02:00
Celedhrim
205f6cac12 Yggtorrent and downloadville: Better MULTI replace (#3135) 2018-05-23 14:11:22 +02:00
Jorman
f602b3db24 README: add Il Corsaro Blu (#3132)
Update file to adding new traker file
2018-05-23 14:10:34 +02:00
Jorman
0d72f1f228 add tracker Il Corsaro Blu (#3131) 2018-05-23 14:10:13 +02:00
kaso17
508125e68f RGU: fix AND search 2018-05-22 18:52:47 +02:00
kaso17
cfb714e13c TorrentSeeds: add andmatch 2018-05-22 18:30:49 +02:00
kaso17
b9dcfd1b02 Torlock: add andmatch 2018-05-22 18:30:29 +02:00
kaso17
a1b2dc67b8 Elit Tracker: add andmatch 2018-05-22 18:30:10 +02:00
Celedhrim
2207c5a961 yggtorrents and downloadville: support multi to french title rewriting (#3130) 2018-05-22 18:07:15 +02:00
kaso17
2caa09bb1e fix bee 2018-05-21 15:51:07 +02:00
kaso17
68906f6e40 readme: fix link 2018-05-21 12:26:02 +02:00
kaso17
2cf3cf15e3 README: add Roslyn note 2018-05-21 12:24:39 +02:00
Jorman
88202c1f7f Isohunt2: fix size parsing (#3127)
Sometimes when parsing, the size of the rel was not enough to have Gb instead Mb or Kb to Mb or whatever
So the size in row is for example 1.015.22 Mb (less than 1024)
So in this case the parser return error

I searched a way to replace this, I found a solution, hope that works in a log way
2018-05-20 21:08:22 +02:00
DarkSupremo
6293c787e7 Bj share: improve search results (#3126)
* Improved anime search and speed-share resolution detection

* - Code Refactored to new standards
- Removed publish date from search mode, since the tracker does not provide that information, it was based on the serie year (but it does provide it on last 24h page, that's still prssent)
- Code clean
- Added season to all animes but One Piece (every anime that i searched in this tracker have the correct season and episode numbering, except One Piece that have an incorrect season set and episode is in absolute format, its added automatically on every new release, so must be the source from where they get that info that is wrong, since its an popular show, added it as an workaround and explained on code as comment)
2018-05-20 21:07:00 +02:00
flightlevel
f67fda3bf4 Add detail to build steps and remove Bountysource 2018-05-20 21:56:50 +10:00
flightlevel
0a70f91bf1 Target full framework (Mono) as well for transition period 2018-05-20 21:51:52 +10:00
flightlevel
88945be5d7 Start configuration 2018-05-20 21:21:08 +10:00
kaso17
c81dd24fe7 RevolutionTT: add time debug output 2018-05-20 10:10:30 +02:00
kaso17
af94dd2757 TVChaosUK: fix parse error 2018-05-20 09:51:18 +02:00
kaso17
0a07738c5b HDME: fix passkey 2018-05-19 06:33:11 +02:00
kaso17
e05783a25a Cardigann: add support for .Config.sitelink 2018-05-19 06:32:16 +02:00
kaso17
27d4ab3967 TorrentBytes: support hidden userbars 2018-05-18 18:10:32 +02:00
flightlevel
5df131140f Upgrade to .NET Core 2.1 RC1 (ARM support) 2018-05-12 13:16:56 +10:00
flightlevel
8002483e68 Add response compression
Reduces dashboard load size from 677kb to 153kb
2018-05-12 12:51:46 +10:00
flightlevel
ce84264490 Add Authorization 2018-05-12 12:44:47 +10:00
flightlevel
615794a4bf Minor controller updates as the web app expects no content 2018-05-05 17:10:36 +10:00
flightlevel
5eed9d7038 Add middleware: Exception handling and rewrite/redirect 2018-05-05 17:08:46 +10:00
flightlevel
f162902b36 Refactor controllers for ASP.NET Core (Authentication disabled for now) 2018-05-01 22:55:09 +10:00
flightlevel
a752683965 Copy controllers untouced from Jackett project 2018-05-01 22:03:16 +10:00
flightlevel
683bd6e2d4 Add DI and Initialisation 2018-05-01 22:00:02 +10:00
flightlevel
13426fe7ec Refactor services for ASP.NET Core 2018-05-01 21:41:34 +10:00
flightlevel
d87d0f87b1 Add packages 2018-05-01 21:26:42 +10:00
flightlevel
85ec169755 Copy Services (except Windows Service) untouched from Jackett project 2018-05-01 21:17:59 +10:00
flightlevel
9cc40144a9 Add new DotNET Core API project Jackett.Server 2018-05-01 21:13:20 +10:00
249 changed files with 18941 additions and 24272 deletions

BIN
.github/cookies-chrome.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 480 KiB

BIN
.github/cookies-firefox.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 439 KiB

1
.gitignore vendored
View File

@@ -200,3 +200,4 @@ FakesAssemblies/
/TestResults
*.DS_Store
.idea/
launchSettings.json

View File

@@ -2,8 +2,8 @@
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!
#define MyAppName "Jackett"
#define MyAppVersion GetFileVersion("BuildOutput\FullFramework\Windows\Jackett\Jackett.Common.dll")
#define MyAppPublisher "Jackett Inc."
#define MyAppVersion GetFileVersion(MyFileForVersion)
#define MyAppPublisher "Jackett"
#define MyAppURL "https://github.com/Jackett/Jackett"
#define MyAppExeName "JackettTray.exe"
@@ -22,9 +22,11 @@ AppUpdatesURL={#MyAppURL}
DefaultDirName={pf}\{#MyAppName}
DefaultGroupName={#MyAppName}
DisableProgramGroupPage=yes
OutputBaseFilename=Jackett.Installer.Windows
SetupIconFile=src\Jackett.Console\jackett.ico
UninstallDisplayIcon={commonappdata}\Jackett\JackettConsole.exe
OutputBaseFilename={#MyOutputFilename}
SetupIconFile=src\Jackett.Tray\jackett.ico
UninstallDisplayIcon={commonappdata}\Jackett\{#MyAppExeName}
VersionInfoVersion={#MyAppVersion}
UninstallDisplayName={#MyAppName}
Compression=lzma
SolidCompression=yes
DisableDirPage=yes
@@ -37,9 +39,7 @@ Name: "windowsService"; Description: "Install as a Windows Service"
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked
[Files]
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
Source: "{#MySourceFolder}\*"; DestDir: "{commonappdata}\Jackett"; Flags: ignoreversion recursesubdirs createallsubdirs
; NOTE: Don't use "Flags: ignoreversion" on any shared system files
[Icons]
@@ -48,16 +48,15 @@ Name: "{group}\{cm:UninstallProgram,{#MyAppName}}"; Filename: "{uninstallexe}"
Name: "{commondesktop}\{#MyAppName}"; Filename: "{commonappdata}\Jackett\{#MyAppExeName}"; Tasks: desktopicon
[Run]
Filename: "{commonappdata}\Jackett\JackettConsole.exe"; Parameters: "--Uninstall"; Flags: waituntilterminated runhidden;
Filename: "{commonappdata}\Jackett\JackettConsole.exe"; Parameters: "--ReserveUrls"; Flags: waituntilterminated runhidden;
Filename: "{commonappdata}\Jackett\JackettConsole.exe"; Parameters: "--Install"; Flags: waituntilterminated runhidden; Tasks: windowsService
Filename: "{commonappdata}\Jackett\JackettConsole.exe"; Parameters: "--Start"; Flags: waituntilterminated runhidden; Tasks: windowsService
Filename: "{commonappdata}\Jackett\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent
[Run]
Filename: "{commonappdata}\Jackett\JackettConsole.exe"; Parameters: "--Uninstall"; Flags: waituntilterminated;
Filename: "{commonappdata}\Jackett\JackettConsole.exe"; Parameters: "--ReserveUrls"; Flags: waituntilterminated;
Filename: "{commonappdata}\Jackett\JackettConsole.exe"; Parameters: "--MigrateSettings"; Flags: waituntilterminated;
Filename: "{commonappdata}\Jackett\JackettConsole.exe"; Parameters: "--Install"; Flags: waituntilterminated; Tasks: windowsService
Filename: "{commonappdata}\Jackett\JackettConsole.exe"; Parameters: "--Start"; Flags: waituntilterminated; Tasks: windowsService
[UninstallRun]
Filename: "{commonappdata}\Jackett\JackettConsole.exe"; Parameters: "--Uninstall"; Flags: waituntilterminated skipifdoesntexist
Filename: "{commonappdata}\Jackett\JackettConsole.exe"; Parameters: "--Uninstall"; Flags: waituntilterminated skipifdoesntexist runhidden
Filename: "{sys}\taskkill.exe"; Parameters: "/f /im {#MyAppExeName}"; Flags: waituntilterminated skipifdoesntexist runhidden
Filename: "{sys}\taskkill.exe"; Parameters: "/f /im JackettConsole.exe"; Flags: waituntilterminated skipifdoesntexist runhidden

View File

@@ -2,7 +2,6 @@
[![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/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/)
@@ -17,32 +16,36 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
#### Supported Systems
* 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.
* Windows using .NET 4.6.1 or above [Download here](https://www.microsoft.com/net/framework/versions/net461).
* Linux and macOS using Mono 5.8 or above. [Download here](http://www.mono-project.com/download/).
### Supported Public Trackers
* 1337x
* Anidex
* Anime Tosho
* AniRena
* AudioBookBay
* btbit
* BTDB
* BT-Scene
* cpasbien
* ETTV
* ExtraTorrent.ag
* ExtraTorrentClone
* EZTV
* Frozen Layer
* GkTorrent
* Horrible Subs
* Idope
* IdopeClone
* Il Corsaro Nero <!-- maintained by bonny1992 -->
* Il Corsaro Blu
* Isohunt2
* KATcrs
* KickAssTorrent
* KickAssTorrent (thekat.se clone)
* LimeTorrents
* MagnetDL
* NextTorrent
* MejorTorrent <!-- maintained by ivandelabeldad -->
* Newpct (aka: tvsinpagar, descargas2020, torrentlocura, torrentrapid, etc)
* Nyaa.si
* Nyaa-Pantsu
@@ -57,11 +60,10 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
* Tokyo Toshokan
* Torlock
* Torrent Downloads
* TorrentGalaxy.org (TGx)
* Torrent9
* TorrentKim
* Torrentz2
* World Wide Torrents
* YIFY (YTS)
* YTS.ag
* Zooqle
@@ -70,6 +72,7 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
* CzTorrent
* Deildu
* Gay-Torrents.net
* Gay-Torrents.org
* Kinozal
* LostFilm.tv
* Mega-Bliz
@@ -89,6 +92,7 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
### Supported Private Trackers
* 2 Fast 4 You
* 3D Torrents
* 720pier
* Abnormal
* Acid-Lounge
* AlphaRatio
@@ -109,6 +113,7 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
* bB
* BeyondHD
* BIGTorrent
* BigTower
* Bit-City Reloaded
* BIT-HDTV
* Bithorlo
@@ -124,8 +129,9 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
* Brasil Tracker
* BroadcastTheNet
* BrokenStones
* BTGigs
* BTNext
* BTWorld
* BTXpress
* Carpathians
* CCFBits
* CGPeers
@@ -146,7 +152,6 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
* Elit Tracker
* Elite-Tracker
* Empornium
* EoT-Forum
* eStone
* Ethor.net (Thor's Land)
* FANO.IN
@@ -157,19 +162,22 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
* FunFile
* FunkyTorrents
* Fuzer
* GayTorrent.ru
* GAYtorrent.ru
* GazelleGames
* Gfxnews
* GFXPeers
* GigaTorrents
* GimmePeers <!-- maintained by jamesb2147 -->
* Girotottent
* GODS [![(invite needed)][inviteneeded]](#)
* Greek Team
* HacheDe
* Hardbay
* HD4Free (HD4)
* HD-Forever
* HD-Only
* HD-Space
* HD-Spain
* HD-Torrents
* HD-Bits.com
* HDBits
@@ -181,6 +189,7 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
* HDTorrents.it
* Hebits
* Hon3y HD
* HQSource
* Hyperay
* ICE Torrent
* I Love Classics
@@ -205,6 +214,7 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
* NCore
* Nebulance
* New Real World
* NordicBits
* Norbits <!-- added by DiseaseNO but no longer maintained? -->
* notwhat.cd
* Ourbits
@@ -221,6 +231,9 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
* PuntoTorrent
* Racing4Everyone (R4E)
* Redacted (PassTheHeadphones)
* Red Star Torrent
* Redtopia (RED)
* RetroFlix
* RevolutionTT
* RGU
* RoDVD
@@ -239,9 +252,9 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
* SportsCult
* SportHD
* Superbits
* Synthesiz3r
* Tasmanit
* TBPlus
* TehConnection.me
* TenYardTracker
* The Empire
* The Geeks
@@ -269,7 +282,7 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
* Torrents.Md
* TorrentSeeds
* Torrent-Syndikat
* TorrentWTF
* TOrrent-tuRK (TORK)
* TorViet
* ToTheGlory
* TranceTraffic
@@ -282,11 +295,12 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
* Waffles
* World-In-HD
* WorldOfP2P
* x-ite.me
* x264
* xBytesV2
* XSpeeds
* Xthor
* Your Exotic Torrents
* ExoticaZ (Your Exotic Torrents)
* Zamunda.net
* Zelka.org
@@ -317,7 +331,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.6](http://www.mono-project.com/download/#download-lin) or better (using the latest stable release for your distribution is recommended)
1. Install [Mono 5.8](http://www.mono-project.com/download/#download-lin) or better (using the latest stable release 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:
@@ -330,10 +344,18 @@ Detailed instructions for [Ubuntu 14.x](http://www.htpcguides.com/install-jacket
If you want to run it with a user without a /home directory you need to add `Environment=XDG_CONFIG_HOME=/path/to/folder` to your systemd file, this folder will be used to store your config files.
Mono must be compiled with the Roslyn compiler (default), using MCS will cause "An error has occurred." errors (See https://github.com/Jackett/Jackett/issues/2704).
### Installation on Linux via Ansible
On a RHEL/Centos 7 system: [linuxhq.jackett](https://galaxy.ansible.com/linuxhq/jackett)
On an Ubuntu 16 system: [chrisjohnson00.jackett](https://galaxy.ansible.com/chrisjohnson00/jackett)
## Installation on macOS
### Prerequisites
Install [Mono 4.6](http://www.mono-project.com/download/#download-mac) or better (using the latest pkg installer is recommended).
Install [Mono 5.8](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
@@ -366,6 +388,18 @@ Example config for apache:
</Location>
```
Example config for nginx:
```
location /jackett {
proxy_pass http://127.0.0.1:9117;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $http_host;
proxy_redirect off;
}
```
## Troubleshooting
* __Command line switches__
@@ -399,10 +433,29 @@ All contributions are welcome just send a pull request. Jackett's framework all
## Building from source
### Windows
* Open the Jackett solution in Visual Studio 2017
* Select Jackett.Console as startup project
* Install the .NET Core [SDK](https://www.microsoft.com/net/download/windows)
* Open the Jackett solution in Visual Studio 2017 (version 15.7 or above)
* Right click on the Jackett solution and click 'Rebuild Solution' to restore nuget packages
* Select Jackett.Server as startup project
* In the drop down menu of the run button select "Jackett.Server" instead of "IIS Express"
* Build/Start the project
### OSX
NOTE: msbuild is included in the mono release.
* Install Homebrew https://brew.sh
* open terminal
* brew install nuget mono
* git clone https://github.com/Jackett/Jackett.git
* cd Jackett/src
* nuget restore Jackett.sln
NOTE: if you get the error "NU1102: Unable to find package Microsoft.AspNetCore with version (>= 2.1.2)" while restoring packages, you'll need to install it manually.https://www.microsoft.com/net/download/thank-you/dotnet-sdk-2.1.302-macos-x64-installer then delete the entire project directory and restart from a new clone
* msbuild Jackett.Server/Jackett.Server.csproj /t:Build /p:Configuration=Debug
* curl -sS https://curl.haxx.se/ca/cacert.pem | cert-sync --user /dev/stdin
* mono Jackett.Server/bin/Debug/JackettServer.exe
### Linux
```bash
@@ -410,12 +463,12 @@ sudo apt install mono-complete nuget msbuild # install build tools (debian/ubunt
git clone https://github.com/Jackett/Jackett.git
cd Jackett/src
nuget restore Jackett.sln # prepare dependencies
msbuild Jackett.Console/Jackett.Console.csproj /t:Build /p:Configuration=Debug # compile
mono Jackett.Console/bin/Debug/JackettConsole.exe # run jackett
msbuild Jackett.Server/Jackett.Server.csproj /t:Build /p:Configuration=Debug # compile
mono Jackett.Server/bin/Debug/JackettServer.exe # run jackett
```
## Screenshots
![screenshot](https://i.imgur.com/0d1nl7g.png "screenshot")
[inviteneeded]: https://raw.githubusercontent.com/Jackett/Jackett/master/.github/label-inviteneeded.png
[inviteneeded]: https://raw.githubusercontent.com/Jackett/Jackett/master/.github/label-inviteneeded.png

View File

@@ -1,4 +1,4 @@
version: 0.8.{build}
version: 0.10.{build}
skip_tags: true
image: Visual Studio 2017
configuration: Release
@@ -27,6 +27,7 @@ deploy:
description: $(release_description)
auth_token:
secure: hOg+16YTIbq4kO9u4D1YVOTbWDqgCX6mAQYMbnmBBSw2CiUsZh7OKbupoUb3FtWa
artifact: /^(?:(?![Ee]xperimental).)*$/
draft: true
on:
branch: master

View File

@@ -6,7 +6,7 @@
//////////////////////////////////////////////////////////////////////
var target = Argument("target", "Default");
var configuration = Argument("configuration", "Release");
var configuration = Argument("configuration", "Debug");
//////////////////////////////////////////////////////////////////////
// PREPARATION
@@ -17,9 +17,6 @@ var workingDir = MakeAbsolute(Directory("./"));
var artifactsDirName = "Artifacts";
var testResultsDirName = "TestResults";
var windowsBuildFullFramework = "./BuildOutput/FullFramework/Windows";
var monoBuildFullFramework = "./BuildOutput/FullFramework/Mono";
//////////////////////////////////////////////////////////////////////
// TASKS
//////////////////////////////////////////////////////////////////////
@@ -36,8 +33,8 @@ Task("Clean")
.IsDependentOn("Info")
.Does(() =>
{
CleanDirectories("./src/**/obj" + configuration);
CleanDirectories("./src/**/bin" + configuration);
CleanDirectories("./src/**/obj");
CleanDirectories("./src/**/bin");
CleanDirectories("./BuildOutput");
CleanDirectories("./" + artifactsDirName);
CleanDirectories("./" + testResultsDirName);
@@ -45,22 +42,21 @@ Task("Clean")
Information("Clean completed");
});
Task("Restore-NuGet-Packages")
Task("Build-Full-Framework")
.IsDependentOn("Clean")
.Does(() =>
{
NuGetRestore("./src/Jackett.sln");
});
Task("Build")
.IsDependentOn("Restore-NuGet-Packages")
.Does(() =>
{
MSBuild("./src/Jackett.sln", settings => settings.SetConfiguration(configuration));
var buildSettings = new MSBuildSettings()
.SetConfiguration(configuration)
.UseToolVersion(MSBuildToolVersion.VS2017);
MSBuild("./src/Jackett.sln", buildSettings);
});
Task("Run-Unit-Tests")
.IsDependentOn("Build")
.IsDependentOn("Build-Full-Framework")
.Does(() =>
{
CreateDirectory("./" + testResultsDirName);
@@ -77,31 +73,8 @@ Task("Run-Unit-Tests")
}
});
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")
.IsDependentOn("Run-Unit-Tests")
.Does(() =>
{
if (IsRunningOnWindows())
@@ -115,49 +88,92 @@ Task("Check-Packaging-Platform")
}
});
Task("Package-Windows-Installer-Full-Framework")
Task("Package-Windows-Full-Framework")
.IsDependentOn("Check-Packaging-Platform")
.Does(() =>
{
InnoSetup("./Installer.iss", new InnoSetupSettings {
OutputDirectory = workingDir + "/" + artifactsDirName
});
string serverProjectPath = "./src/Jackett.Server/Jackett.Server.csproj";
string buildOutputPath = "./BuildOutput/Experimental/net461/win7-x86/Jackett";
DotNetCorePublish(serverProjectPath, "net461", "win7-x86");
CopyFiles("./src/Jackett.Service/bin/" + configuration + "/JackettService.*", buildOutputPath);
CopyFiles("./src/Jackett.Tray/bin/" + configuration + "/JackettTray.*", buildOutputPath);
CopyFiles("./src/Jackett.Updater/bin/" + configuration + "/net461" + "/JackettUpdater.*", buildOutputPath); //builds against multiple frameworks
Zip("./BuildOutput/Experimental/net461/win7-x86", $"./{artifactsDirName}/Jackett.Binaries.Windows.zip");
//InnoSetup
string sourceFolder = MakeAbsolute(Directory(buildOutputPath)).ToString();
InnoSetupSettings settings = new InnoSetupSettings();
settings.OutputDirectory = workingDir + "/" + artifactsDirName;
settings.Defines = new Dictionary<string, string>
{
{ "MyFileForVersion", sourceFolder + "/Jackett.Common.dll" },
{ "MySourceFolder", sourceFolder },
{ "MyOutputFilename", "Jackett.Installer.Windows" },
};
InnoSetup("./Installer.iss", settings);
});
Task("Package-Files-Full-Framework-Windows")
Task("Package-Mono-Full-Framework")
.IsDependentOn("Check-Packaging-Platform")
.Does(() =>
{
Zip(windowsBuildFullFramework, $"./{artifactsDirName}/Jackett.Binaries.Windows.zip");
Information(@"Full Framework Windows Binaries Zipping Completed");
});
string serverProjectPath = "./src/Jackett.Server/Jackett.Server.csproj";
string buildOutputPath = "./BuildOutput/Experimental/net461/linux-x64/Jackett";
Task("Package-Files-Full-Framework-Mono")
DotNetCorePublish(serverProjectPath, "net461", "linux-x64");
CopyFiles("./src/Jackett.Updater/bin/" + configuration + "/net461" + "/JackettUpdater.*", buildOutputPath); //builds against multiple frameworks
//There is an issue with Mono 5.8 (fixed in Mono 5.12) where its expecting to use its own patched version of System.Net.Http.dll, instead of the version supplied in folder
//https://github.com/dotnet/corefx/issues/19914
//https://bugzilla.xamarin.com/show_bug.cgi?id=60315
//The workaround is to delete System.Net.Http.dll and patch the .exe.config file
DeleteFile(buildOutputPath + "/System.Net.Http.dll");
var configFile = File(buildOutputPath + "/JackettConsole.exe.config");
XmlPoke(configFile, "configuration/runtime/*[name()='assemblyBinding']/*[name()='dependentAssembly']/*[name()='assemblyIdentity'][@name='System.Net.Http']/../*[name()='bindingRedirect']/@newVersion", "4.0.0.0");
//Mono on FreeBSD doesn't like the bundled System.Runtime.InteropServices.RuntimeInformation
//https://github.com/dotnet/corefx/issues/23989
//https://github.com/Jackett/Jackett/issues/3547
DeleteFile(buildOutputPath + "/System.Runtime.InteropServices.RuntimeInformation.dll");
Gzip("./BuildOutput/Experimental/net461/linux-x64", $"./{artifactsDirName}", "Jackett", "Jackett.Binaries.Mono.tar.gz");
});
Task("Experimental-DotNetCore")
.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;
string serverProjectPath = "./src/Jackett.Server/Jackett.Server.csproj";
DotNetCorePublish(serverProjectPath, "netcoreapp2.1", "win-x86");
DotNetCorePublish(serverProjectPath, "netcoreapp2.1", "linux-x64");
DotNetCorePublish(serverProjectPath, "netcoreapp2.1", "osx-x64");
RunCygwinCommand("Tar", tarArguments);
RunCygwinCommand("Gzip", gzipArguments);
MoveFile($"{monoBuildFullFramework}/{tarFileName}.gz", $"./{artifactsDirName}/{tarFileName}.gz");
Zip("./BuildOutput/Experimental/netcoreapp2.1/win-x86", $"./{artifactsDirName}/Experimental.netcoreapp.win-x86.zip");
Zip("./BuildOutput/Experimental/netcoreapp2.1/osx-x64", $"./{artifactsDirName}/Experimental.netcoreapp.osx-x64.zip");
Gzip("./BuildOutput/Experimental/netcoreapp2.1/linux-x64", $"./{artifactsDirName}", "Jackett", "Experimental.netcoreapp.linux-x64.tar.gz");
});
Task("Package-Full-Framework")
.IsDependentOn("Package-Windows-Installer-Full-Framework")
.IsDependentOn("Package-Files-Full-Framework-Windows")
.IsDependentOn("Package-Files-Full-Framework-Mono")
Task("Package")
.IsDependentOn("Package-Windows-Full-Framework")
.IsDependentOn("Package-Mono-Full-Framework")
//.IsDependentOn("Experimental-DotNetCore")
.Does(() =>
{
Information("Full Framwork Packaging Completed");
Information("Packaging completed");
});
Task("Appveyor-Push-Artifacts")
.IsDependentOn("Package-Full-Framework")
.IsDependentOn("Package")
.Does(() =>
{
if (AppVeyor.IsRunningOnAppVeyor)
@@ -263,10 +279,35 @@ private void RunCygwinCommand(string utility, string utilityArguments)
private string RelativeWinPathToCygPath(string relativePath)
{
var cygdriveBase = "/cygdrive/" + workingDir.ToString().Replace(":", "").Replace("\\", "/");
var cygPath = cygdriveBase + relativePath.Replace(".", "");
var cygPath = cygdriveBase + relativePath.TrimStart('.');
return cygPath;
}
private void Gzip(string sourceFolder, string outputDirectory, string tarCdirectoryOption, string outputFileName)
{
var cygSourcePath = RelativeWinPathToCygPath(sourceFolder);
var tarFileName = outputFileName.Remove(outputFileName.Length - 3, 3);
var tarArguments = @"-cvf " + cygSourcePath + "/" + tarFileName + " -C " + cygSourcePath + $" {tarCdirectoryOption} --mode ='755'";
var gzipArguments = @"-k " + cygSourcePath + "/" + tarFileName;
RunCygwinCommand("Tar", tarArguments);
RunCygwinCommand("Gzip", gzipArguments);
MoveFile($"{sourceFolder}/{tarFileName}.gz", $"{outputDirectory}/{tarFileName}.gz");
}
private void DotNetCorePublish(string projectPath, string framework, string runtime)
{
var settings = new DotNetCorePublishSettings
{
Framework = framework,
Runtime = runtime,
OutputDirectory = $"./BuildOutput/Experimental/{framework}/{runtime}/Jackett"
};
DotNetCorePublish(projectPath, settings);
}
//////////////////////////////////////////////////////////////////////
// TASK TARGETS
//////////////////////////////////////////////////////////////////////

View File

View File

@@ -1,244 +0,0 @@
using System;
using System.Runtime.InteropServices;
using CurlSharp.Enums;
namespace CurlSharp.Callbacks
{
/// <summary>
/// Called when cURL has debug information for the client.
/// </summary>
/// <remarks>
/// For usage, see the sample <c>Upload.cs</c>.
/// Arguments passed to the recipient include:
/// <list type="table">
/// <listheader>
/// <term>Argument</term>
/// <description>Description</description>
/// </listheader>
/// <item>
/// <term>infoType</term>
/// <description>
/// Type of debug information, see
/// <see cref="CurlInfoType" />.
/// </description>
/// </item>
/// <item>
/// <term>message</term>
/// <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, int size, Object extraData);
/// <summary>
/// Called when cURL has header data for the client.
/// </summary>
/// <remarks>
/// For usage, see the sample <c>Headers.cs</c>.
/// Arguments passed to the recipient include:
/// <list type="table">
/// <listheader>
/// <term>Argument</term>
/// <description>Description</description>
/// </listheader>
/// <item>
/// <term>buf</term>
/// <description>Header data from cURL to the client.</description>
/// </item>
/// <item>
/// <term>size</term>
/// <description>Size of a character, in bytes.</description>
/// </item>
/// <item>
/// <term>nmemb</term>
/// <description>Number of characters.</description>
/// </item>
/// <item>
/// <term>extraData</term>
/// <description>Client-provided extra data.</description>
/// </item>
/// </list>
/// Your implementation should return the number of bytes (not
/// characters) processed. Usually this is <c>size * nmemb</c>.
/// Return -1 to abort the transfer.
/// </remarks>
public delegate int CurlHeaderCallback(byte[] buf, int size, int nmemb, Object extraData);
/// <summary>
/// Called when cURL needs for the client to perform an
/// IOCTL operation. An example might be when an FTP
/// upload requires rewinding of the input file to deal
/// with a resend occasioned by an error.
/// </summary>
/// <remarks>
/// <list type="table">
/// <listheader>
/// <term>Argument</term>
/// <description>Description</description>
/// </listheader>
/// <item>
/// <term>cmd</term>
/// <description>
/// A <see cref="CurlIoCommand" />; for now, only
/// <c>RestartRead</c> should be passed.
/// </description>
/// </item>
/// <item>
/// <term>extraData</term>
/// <description>
/// Client-provided extra data; in the
/// case of an FTP upload, it might be a
/// <c>FileStream</c> object.
/// </description>
/// </item>
/// </list>
/// Your implementation should return a <see cref="CurlIoError" />,
/// which should be <see cref="CurlIoError.Ok" /> if everything
/// is okay.
/// </remarks>
public delegate CurlIoError CurlIoctlCallback(CurlIoCommand cmd, Object extraData);
/// <summary>
/// Called when cURL wants to report progress.
/// </summary>
/// <remarks>
/// For usage, see the sample <c>Upload.cs</c>.
/// Arguments passed to the recipient include:
/// <list type="table">
/// <listheader>
/// <term>Argument</term>
/// <description>Description</description>
/// </listheader>
/// <item>
/// <term>extraData</term>
/// <description>Client-provided extra data.</description>
/// </item>
/// <item>
/// <term>dlTotal</term>
/// <description>Number of bytes to download.</description>
/// </item>
/// <item>
/// <term>dlNow</term>
/// <description>Number of bytes downloaded so far.</description>
/// </item>
/// <item>
/// <term>ulTotal</term>
/// <description>Number of bytes to upload.</description>
/// </item>
/// <item>
/// <term>ulNow</term>
/// <description>Number of bytes uploaded so far.</description>
/// </item>
/// </list>
/// Your implementation should return 0 to continue, or a non-zero
/// value to abort the transfer.
/// </remarks>
public delegate int CurlProgressCallback(Object extraData, double dlTotal, double dlNow,
double ulTotal, double ulNow);
/// <summary>
/// Called when cURL wants to read data from the client.
/// </summary>
/// <remarks>
/// For usage, see the sample <c>Upload.cs</c>.
/// Arguments passed to the recipient include:
/// <list type="table">
/// <listheader>
/// <term>Argument</term>
/// <description>Description</description>
/// </listheader>
/// <item>
/// <term>buf</term>
/// <description>
/// Buffer into which your client should write data
/// for cURL.
/// </description>
/// </item>
/// <item>
/// <term>size</term>
/// <description>Size of a character, usually 1.</description>
/// </item>
/// <item>
/// <term>nmemb</term>
/// <description>Number of characters.</description>
/// </item>
/// <item>
/// <term>extraData</term>
/// <description>Client-provided extra data.</description>
/// </item>
/// </list>
/// Your implementation should return the number of bytes (not
/// characters) written to <c>buf</c>. Return 0 to abort the transfer.
/// </remarks>
public delegate int CurlReadCallback([Out] byte[] buf, int size, int nmemb, Object extraData);
/// <summary>
/// Called when cURL wants to report an Ssl event.
/// </summary>
/// <remarks>
/// For usage, see the sample <c>SSLGet.cs</c>.
/// Arguments passed to the recipient include:
/// <list type="table">
/// <listheader>
/// <term>Argument</term>
/// <description>Description</description>
/// </listheader>
/// <item>
/// <term>ctx</term>
/// <description>
/// An <see cref="CurlSslContext" /> object that wraps an
/// OpenSSL <c>SSL_CTX</c> pointer.
/// </description>
/// </item>
/// <item>
/// <term>extraData</term>
/// <description>Client-provided extra data.</description>
/// </item>
/// </list>
/// Your implementation should return a <see cref="CurlCode" />,
/// which should be <see cref="CurlCode.Ok" /> if everything
/// is okay.
/// </remarks>
public delegate CurlCode CurlSslContextCallback(CurlSslContext ctx, Object extraData);
/// <summary>
/// Called when cURL has data for the client.
/// </summary>
/// <remarks>
/// For usage, see the example <c>EasyGet.cs</c>.
/// Arguments passed to the delegate implementation include:
/// <list type="table">
/// <listheader>
/// <term>Argument</term>
/// <description>Description</description>
/// </listheader>
/// <item>
/// <term>buf</term>
/// <description>Data cURL is providing to the client.</description>
/// </item>
/// <item>
/// <term>size</term>
/// <description>Size of a character, usually 1.</description>
/// </item>
/// <item>
/// <term>nmemb</term>
/// <description>Number of characters.</description>
/// </item>
/// <item>
/// <term>extraData</term>
/// <description>Client-provided extra data.</description>
/// </item>
/// </list>
/// Your implementation should return the number of bytes (not
/// characters) processed. Return 0 to abort the transfer.
/// </remarks>
public delegate int CurlWriteCallback(byte[] buf, int size, int nmemb, Object extraData);
}

View File

@@ -1,76 +0,0 @@
using System;
using CurlSharp.Enums;
namespace CurlSharp.Callbacks
{
/// <summary>
/// Called when <c>cURL</c> wants to lock a shared resource.
/// </summary>
/// <remarks>
/// For a usage example, refer to the <c>ShareDemo.cs</c> sample.
/// Arguments passed to your delegate implementation include:
/// <list type="table">
/// <listheader>
/// <term>Argument</term>
/// <term>Description</term>
/// </listheader>
/// <item>
/// <term>data</term>
/// <term>
/// Type of data to lock; one of the values in the
/// <see cref="CurlLockData" /> enumeration.
/// </term>
/// </item>
/// <item>
/// <term>access</term>
/// <term>
/// Lock access requested; one of the values in the
/// <see cref="CurlLockAccess" /> enumeration.
/// </term>
/// </item>
/// <item>
/// <term>userData</term>
/// <term>
/// Client-provided data that is not touched internally by
/// <c>cURL</c>. This is set via
/// <see cref="CurlShareOption.UserData" /> when calling the
/// <see cref="CurlShare.SetOpt" /> member of the <see cref="CurlShare" />
/// class.
/// </term>
/// </item>
/// </list>
/// </remarks>
public delegate void CurlShareLockCallback(CurlLockData data, CurlLockAccess access, Object userData);
/// <summary>
/// Called when <c>cURL</c> wants to unlock a shared resource.
/// </summary>
/// <remarks>
/// For a usage example, refer to the <c>ShareDemo.cs</c> sample.
/// Arguments passed to your delegate implementation include:
/// <list type="table">
/// <listheader>
/// <term>Argument</term>
/// <term>Description</term>
/// </listheader>
/// <item>
/// <term>data</term>
/// <term>
/// Type of data to unlock; one of the values in the
/// <see cref="CurlLockData" /> enumeration.
/// </term>
/// </item>
/// <item>
/// <term>userData</term>
/// <term>
/// Client-provided data that is not touched internally by
/// <c>cURL</c>. This is set via
/// <see cref="CurlShareOption.UserData" /> when calling the
/// <see cref="CurlShare.SetOpt" /> member of the <see cref="CurlShare" />
/// class.
/// </term>
/// </item>
/// </list>
/// </remarks>
public delegate void CurlShareUnlockCallback(CurlLockData data, Object userData);
}

View File

@@ -1,129 +0,0 @@
/***************************************************************************
*
* CurlS#arp
*
* 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
* should have received as part of this distribution.
*
* You may opt to use, copy, modify, merge, publish, distribute and/or sell
* copies of this Software, and permit persons to whom the Software is
* furnished to do so, under the terms of the LICENSE file.
*
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
* ANY KIND, either express or implied.
*
**************************************************************************/
using System;
using System.Runtime.InteropServices;
using CurlSharp.Enums;
namespace CurlSharp
{
/// <summary>
/// Top-level class for initialization and cleanup.
/// </summary>
/// <remarks>
/// It also implements static methods for capabilities that don't
/// logically belong in a class.
/// </remarks>
public static class Curl
{
// for state management
private static CurlCode _initCode;
/// <summary>
/// Class constructor - initialize global status.
/// </summary>
static Curl()
{
_initCode = CurlCode.FailedInit;
}
// hidden instance stuff
/// <summary>
/// Get the underlying cURL version as a string, example "7.12.2".
/// </summary>
/// <exception cref="System.InvalidOperationException">
/// Thrown if cURL isn't properly initialized.
/// </exception>
public static string Version
{
get
{
EnsureCurl();
return Marshal.PtrToStringAnsi(NativeMethods.curl_version());
}
}
/// <summary>
/// Process-wide initialization -- call only once per process.
/// </summary>
/// <param name="flags">
/// An or'd combination of
/// <see cref="CurlInitFlag" /> members.
/// </param>
/// <returns>
/// A <see cref="CurlCode" />, hopefully
/// <c>CurlCode.Ok</c>.
/// </returns>
public static CurlCode GlobalInit(CurlInitFlag flags)
{
_initCode = NativeMethods.curl_global_init((int) flags);
#if USE_LIBCURLSHIM
if (_initCode == CurlCode.Ok)
NativeMethods.curl_shim_initialize();
#endif
return _initCode;
}
/// <summary>
/// Process-wide cleanup -- call just before exiting process.
/// </summary>
/// <remarks>
/// While it's not necessary that your program call this method
/// before exiting, doing so will prevent leaks of native cURL resources.
/// </remarks>
public static void GlobalCleanup()
{
if (_initCode == CurlCode.Ok)
{
#if USE_LIBCURLSHIM
NativeMethods.curl_shim_cleanup();
#endif
NativeMethods.curl_global_cleanup();
_initCode = CurlCode.FailedInit;
}
}
/// <summary>
/// Get a <see cref="CurlVersionInfoData" /> object.
/// </summary>
/// <param name="ver">
/// Specify a <see cref="CurlVersion" />, such as
/// <c>CurlVersion.Now</c>.
/// </param>
/// <returns>A <see cref="CurlVersionInfoData" /> object.</returns>
/// <exception cref="System.InvalidOperationException">
/// Thrown if cURL isn't properly initialized.
/// </exception>
public static CurlVersionInfoData GetVersionInfo(CurlVersion ver)
{
EnsureCurl();
return new CurlVersionInfoData(ver);
}
/// <summary>
/// Called by other classes to ensure valid cURL state.
/// </summary>
internal static void EnsureCurl()
{
if (_initCode != CurlCode.Ok)
throw new InvalidOperationException("cURL not initialized");
}
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -1,386 +0,0 @@
/***************************************************************************
*
* CurlS#arp
*
* 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
* should have received as part of this distribution.
*
* You may opt to use, copy, modify, merge, publish, distribute and/or sell
* copies of this Software, and permit persons to whom the Software is
* furnished to do so, under the terms of the LICENSE file.
*
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
* ANY KIND, either express or implied.
*
**************************************************************************/
using System;
using System.Runtime.InteropServices;
using CurlSharp.Enums;
namespace CurlSharp
{
/// <summary>
/// This trivial class wraps the internal <c>curl_forms</c> struct.
/// </summary>
public sealed class CurlForms
{
/// <summary>The <see cref="CurlFormOption" />.</summary>
public CurlFormOption Option;
/// <summary>Value for the option.</summary>
public object Value;
}
/// <summary>
/// Wraps a section of multipart form data to be submitted via the
/// <see cref="CurlOption.HttpPost" /> option in the
/// <see cref="CurlEasy.SetOpt" /> member of the <see cref="CurlEasy" /> class.
/// </summary>
public class CurlHttpMultiPartForm : IDisposable
{
// the two curlform pointers
private readonly IntPtr[] _pItems;
/// <summary>
/// Constructor
/// </summary>
/// <exception cref="System.InvalidOperationException">
/// This is thrown
/// if <see cref="Curl" /> hasn't bee properly initialized.
/// </exception>
public CurlHttpMultiPartForm()
{
Curl.EnsureCurl();
_pItems = new IntPtr[2];
_pItems[0] = IntPtr.Zero;
_pItems[1] = IntPtr.Zero;
}
/// <summary>
/// Free unmanaged resources.
/// </summary>
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
/// <summary>
/// Destructor
/// </summary>
~CurlHttpMultiPartForm()
{
Dispose(false);
}
// for CurlEasy.SetOpt()
internal IntPtr GetHandle() => _pItems[0];
/// <summary>
/// Add a multi-part form section.
/// </summary>
/// <param name="args">
/// Argument list, as described in the remarks.
/// </param>
/// <returns>
/// A <see cref="CurlFormCode" />, hopefully
/// <c>CurlFormCode.Ok</c>.
/// </returns>
/// <remarks>
/// This is definitely the workhorse method for this class. It
/// should be called in roughly the same manner as
/// <c>curl_formadd()</c>, except you would omit the first two
/// <c>struct curl_httppost**</c> arguments (<c>firstitem</c> and
/// <c>lastitem</c>), which are wrapped in this class. So you should
/// pass arguments in the following sequence:
/// <para>
/// <c>
/// CurlHttpMultiPartForm.AddSection(option1, value1, ..., optionX, valueX,
/// CurlFormOption.End)
/// </c>
/// ;
/// </para>
/// <para>
/// For a complete list of possible options, see the documentation for
/// the <see cref="CurlFormOption" /> enumeration.
/// </para>
/// <note>
/// The pointer options (<c>PtrName</c>, etc.) make an
/// internal copy of the passed <c>byte</c> array. Therefore, any
/// changes you make to the client copy of this array AFTER calling
/// this method, won't be reflected internally with <c>cURL</c>. The
/// purpose of providing the pointer options is to support the
/// posting of non-string binary data.
/// </note>
/// </remarks>
public CurlFormCode AddSection(params object[] args)
{
var nCount = args.Length;
var nRealCount = nCount;
var retCode = CurlFormCode.Ok;
CurlForms[] aForms = null;
// one arg or even number of args is an error
if ((nCount == 1) || (nCount%2 == 0))
return CurlFormCode.Incomplete;
// ensure the last argument is End
var iCode = (CurlFormOption)
Convert.ToInt32(args.GetValue(nCount - 1));
if (iCode != CurlFormOption.End)
return CurlFormCode.Incomplete;
// walk through any passed arrays to get the true number of
// items and ensure the child arrays are properly (and not
// prematurely) terminated with End
for (var i = 0; i < nCount; i += 2)
{
iCode = (CurlFormOption) Convert.ToInt32(args.GetValue(i));
switch (iCode)
{
case CurlFormOption.Array:
{
aForms = args.GetValue(i + 1) as CurlForms[];
if (aForms == null)
return CurlFormCode.Incomplete;
var nFormsCount = aForms.Length;
for (var j = 0; j < nFormsCount; j++)
{
var pcf = aForms.GetValue(j) as CurlForms;
if (pcf == null)
return CurlFormCode.Incomplete;
if (j == nFormsCount - 1)
{
if (pcf.Option != CurlFormOption.End)
return CurlFormCode.Incomplete;
}
else
{
if (pcf.Option == CurlFormOption.End)
return CurlFormCode.Incomplete;
}
}
// -2 accounts for the fact that we're a) not
// including the item with End and b) not
// including Array in what we pass to cURL
nRealCount += 2*(nFormsCount - 2);
break;
}
}
}
// allocate the IntPtr array for the data
var aPointers = new IntPtr[nRealCount];
for (var i = 0; i < nRealCount - 1; i++)
aPointers[i] = IntPtr.Zero;
aPointers[nRealCount - 1] = (IntPtr) CurlFormOption.End;
// now we go through the args
aForms = null;
var formArrayPos = 0;
var argArrayPos = 0;
var ptrArrayPos = 0;
object obj = null;
while ((retCode == CurlFormCode.Ok) &&
(ptrArrayPos < nRealCount))
{
if (aForms != null)
{
var pcf = aForms.GetValue(formArrayPos++)
as CurlForms;
if (pcf == null)
{
retCode = CurlFormCode.UnknownOption;
break;
}
iCode = pcf.Option;
obj = pcf.Value;
}
else
{
iCode = (CurlFormOption) Convert.ToInt32(
args.GetValue(argArrayPos++));
obj = iCode == CurlFormOption.End
? null
: args.GetValue(argArrayPos++);
}
switch (iCode)
{
// handle byte-array pointer-related items
case CurlFormOption.PtrName:
case CurlFormOption.PtrContents:
case CurlFormOption.BufferPtr:
{
var bytes = obj as byte[];
if (bytes == null)
retCode = CurlFormCode.UnknownOption;
else
{
var nLen = bytes.Length;
var ptr = Marshal.AllocHGlobal(nLen);
if (ptr != IntPtr.Zero)
{
aPointers[ptrArrayPos++] = (IntPtr) iCode;
// copy bytes to unmanaged buffer
for (var j = 0; j < nLen; j++)
Marshal.WriteByte(ptr, bytes[j]);
aPointers[ptrArrayPos++] = ptr;
}
else
retCode = CurlFormCode.Memory;
}
break;
}
// length values
case CurlFormOption.NameLength:
case CurlFormOption.ContentsLength:
case CurlFormOption.BufferLength:
aPointers[ptrArrayPos++] = (IntPtr) iCode;
aPointers[ptrArrayPos++] = (IntPtr)
Convert.ToInt32(obj);
break;
// strings
case CurlFormOption.CopyName:
case CurlFormOption.CopyContents:
case CurlFormOption.FileContent:
case CurlFormOption.File:
case CurlFormOption.ContentType:
case CurlFormOption.Filename:
case CurlFormOption.Buffer:
{
aPointers[ptrArrayPos++] = (IntPtr) iCode;
var s = obj as string;
if (s == null)
retCode = CurlFormCode.UnknownOption;
else
{
var p = Marshal.StringToHGlobalAnsi(s);
if (p != IntPtr.Zero)
aPointers[ptrArrayPos++] = p;
else
retCode = CurlFormCode.Memory;
}
break;
}
// array case: already handled
case CurlFormOption.Array:
if (aForms != null)
retCode = CurlFormCode.IllegalArray;
else
{
aForms = obj as CurlForms[];
if (aForms == null)
retCode = CurlFormCode.UnknownOption;
}
break;
// slist
case CurlFormOption.ContentHeader:
{
aPointers[ptrArrayPos++] = (IntPtr) iCode;
var s = obj as CurlSlist;
if (s == null)
retCode = CurlFormCode.UnknownOption;
else
aPointers[ptrArrayPos++] = s.Handle;
break;
}
// erroneous stuff
case CurlFormOption.Nothing:
retCode = CurlFormCode.Incomplete;
break;
// end
case CurlFormOption.End:
if (aForms != null) // end of form
{
aForms = null;
formArrayPos = 0;
}
else
aPointers[ptrArrayPos++] = (IntPtr) iCode;
break;
// default is unknown
default:
retCode = CurlFormCode.UnknownOption;
break;
}
}
// ensure we didn't come up short on parameters
if (ptrArrayPos != nRealCount)
retCode = CurlFormCode.Incomplete;
// if we're OK here, call into curl
if (retCode == CurlFormCode.Ok)
{
#if USE_LIBCURLSHIM
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]);
#endif
}
// unmarshal native allocations
for (var i = 0; i < nRealCount - 1; i += 2)
{
iCode = (CurlFormOption) (int) aPointers[i];
switch (iCode)
{
case CurlFormOption.CopyName:
case CurlFormOption.CopyContents:
case CurlFormOption.FileContent:
case CurlFormOption.File:
case CurlFormOption.ContentType:
case CurlFormOption.Filename:
case CurlFormOption.Buffer:
// byte buffer cases
case CurlFormOption.PtrName:
case CurlFormOption.PtrContents:
case CurlFormOption.BufferPtr:
{
if (aPointers[i + 1] != IntPtr.Zero)
Marshal.FreeHGlobal(aPointers[i + 1]);
break;
}
default:
break;
}
}
return retCode;
}
private void Dispose(bool disposing)
{
lock (this)
{
if (disposing)
{
// clean up managed objects
}
// clean up native objects
if (_pItems[0] != IntPtr.Zero)
NativeMethods.curl_formfree(_pItems[0]);
_pItems[0] = IntPtr.Zero;
_pItems[1] = IntPtr.Zero;
}
}
}
}

View File

@@ -1,304 +0,0 @@
/***************************************************************************
*
* CurlS#arp
*
* 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
* should have received as part of this distribution.
*
* You may opt to use, copy, modify, merge, publish, distribute and/or sell
* copies of this Software, and permit persons to whom the Software is
* furnished to do so, under the terms of the LICENSE file.
*
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
* ANY KIND, either express or implied.
*
**************************************************************************/
using System;
using System.Collections;
using System.Runtime.InteropServices;
using CurlSharp.Enums;
namespace CurlSharp
{
/// <summary>
/// Implements the <c>curl_multi_xxx</c> API.
/// </summary>
public class CurlMulti : IDisposable
{
// private members
private readonly Hashtable _htEasy;
private int _maxFd;
private CurlMultiInfo[] _multiInfo;
private bool _bGotMultiInfo;
#if USE_LIBCURLSHIM
private IntPtr _fdSets;
#else
private NativeMethods.fd_set _fd_read, _fd_write, _fd_except;
#endif
private IntPtr _pMulti;
private CurlPipelining _pipelining;
/// <summary>
/// Constructor
/// </summary>
/// <exception cref="System.InvalidOperationException">
/// This is thrown
/// if <see cref="Curl" /> hasn't bee properly initialized.
/// </exception>
/// <exception cref="System.NullReferenceException">
/// This is thrown if the native <c>CurlMulti</c> handle wasn't
/// created successfully.
/// </exception>
public CurlMulti()
{
Curl.EnsureCurl();
_pMulti = NativeMethods.curl_multi_init();
ensureHandle();
_maxFd = 0;
#if USE_LIBCURLSHIM
_fdSets = IntPtr.Zero;
_fdSets = NativeMethods.curl_shim_alloc_fd_sets();
#else
_fd_read = NativeMethods.fd_set.Create();
_fd_read = NativeMethods.fd_set.Create();
_fd_write = NativeMethods.fd_set.Create();
_fd_except = NativeMethods.fd_set.Create();
#endif
_multiInfo = null;
_bGotMultiInfo = false;
_htEasy = new Hashtable();
}
/// <summary>
/// Max file descriptor
/// </summary>
public int MaxFd => _maxFd;
/// <summary>
/// Cleanup unmanaged resources.
/// </summary>
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
/// <summary>
/// Destructor
/// </summary>
~CurlMulti()
{
Dispose(false);
}
private void Dispose(bool disposing)
{
lock (this)
{
// if (disposing) // managed member cleanup
// unmanaged cleanup
if (_pMulti != IntPtr.Zero)
{
NativeMethods.curl_multi_cleanup(_pMulti);
_pMulti = IntPtr.Zero;
}
#if USE_LIBCURLSHIM
if (_fdSets != IntPtr.Zero)
{
NativeMethods.curl_shim_free_fd_sets(_fdSets);
_fdSets = IntPtr.Zero;
}
#else
_fd_read.Cleanup();
_fd_write.Cleanup();
_fd_except.Cleanup();
#endif
}
}
private void ensureHandle()
{
if (_pMulti == IntPtr.Zero)
throw new NullReferenceException("No internal multi handle");
}
/// <summary>
/// Add an CurlEasy object.
/// </summary>
/// <param name="curlEasy">
/// <see cref="CurlEasy" /> object to add.
/// </param>
/// <returns>
/// A <see cref="CurlMultiCode" />, hopefully <c>CurlMultiCode.Ok</c>
/// </returns>
/// <exception cref="System.NullReferenceException">
/// This is thrown if the native <c>CurlMulti</c> handle wasn't
/// created successfully.
/// </exception>
public CurlMultiCode AddHandle(CurlEasy curlEasy)
{
ensureHandle();
var p = curlEasy.Handle;
_htEasy.Add(p, curlEasy);
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>
/// <param name="curlEasy">
/// <see cref="CurlEasy" /> object to remove.
/// </param>
/// <returns>
/// A <see cref="CurlMultiCode" />, hopefully <c>CurlMultiCode.Ok</c>
/// </returns>
/// <exception cref="System.NullReferenceException">
/// This is thrown if the native <c>CurlMulti</c> handle wasn't
/// created successfully.
/// </exception>
public CurlMultiCode RemoveHandle(CurlEasy curlEasy)
{
ensureHandle();
var p = curlEasy.Handle;
_htEasy.Remove(p);
return NativeMethods.curl_multi_remove_handle(_pMulti, curlEasy.Handle);
}
/// <summary>
/// Get a string description of an error code.
/// </summary>
/// <param name="errorNum">
/// The <see cref="CurlMultiCode" /> for which to obtain the error
/// string description.
/// </param>
/// <returns>The string description.</returns>
public string StrError(CurlMultiCode errorNum) => Marshal.PtrToStringAnsi(NativeMethods.curl_multi_strerror(errorNum));
/// <summary>
/// Read/write data to/from each CurlEasy object.
/// </summary>
/// <param name="runningObjects">
/// The number of <see cref="CurlEasy" /> objects still in process is
/// written by this function to this reference parameter.
/// </param>
/// <returns>
/// A <see cref="CurlMultiCode" />, hopefully <c>CurlMultiCode.Ok</c>
/// </returns>
/// <exception cref="System.NullReferenceException">
/// This is thrown if the native <c>CurlMulti</c> handle wasn't
/// created successfully.
/// </exception>
public CurlMultiCode Perform(ref int runningObjects)
{
ensureHandle();
return NativeMethods.curl_multi_perform(_pMulti, ref runningObjects);
}
/// <summary>
/// Set internal file desriptor information before calling Select.
/// </summary>
/// <returns>
/// A <see cref="CurlMultiCode" />, hopefully <c>CurlMultiCode.Ok</c>
/// </returns>
/// <exception cref="System.NullReferenceException">
/// This is thrown if the native <c>CurlMulti</c> handle wasn't
/// created successfully.
/// </exception>
public CurlMultiCode FdSet()
{
ensureHandle();
#if USE_LIBCURLSHIM
return NativeMethods.curl_shim_multi_fdset(_pMulti, _fdSets, ref _maxFd);
#else
NativeMethods.FD_ZERO(_fd_read);
NativeMethods.FD_ZERO(_fd_write);
NativeMethods.FD_ZERO(_fd_except);
return NativeMethods.curl_multi_fdset(_pMulti, ref _fd_read, ref _fd_write, ref _fd_except, ref _maxFd);
#endif
}
/// <summary>
/// Call <c>select()</c> on the CurlEasy objects.
/// </summary>
/// <param name="timeoutMillis">
/// The timeout for the internal <c>select()</c> call,
/// in milliseconds.
/// </param>
/// <returns>
/// Number or <see cref="CurlEasy" /> objects with pending reads.
/// </returns>
/// <exception cref="System.NullReferenceException">
/// This is thrown if the native <c>CurlMulti</c> handle wasn't
/// created successfully.
/// </exception>
public int Select(int timeoutMillis)
{
ensureHandle();
#if USE_LIBCURLSHIM
return NativeMethods.curl_shim_select(_maxFd + 1, _fdSets, timeoutMillis);
#else
var timeout = NativeMethods.timeval.Create(timeoutMillis);
return NativeMethods.select(_maxFd + 1, ref _fd_read, ref _fd_write, ref _fd_except, ref timeout);
//return NativeMethods.select2(_maxFd + 1, _fd_read, _fd_write, _fd_except, timeout);
#endif
}
/// <summary>
/// Obtain status information for a CurlMulti transfer. Requires
/// CurlSharp be compiled with the libcurlshim helper.
/// </summary>
/// <returns>
/// An array of <see cref="CurlMultiInfo" /> objects, one for each
/// <see cref="CurlEasy" /> object child.
/// </returns>
/// <exception cref="System.NullReferenceException">
/// This is thrown if the native <c>CurlMulti</c> handle wasn't
/// created successfully.
/// </exception>
public CurlMultiInfo[] InfoRead()
{
if (_bGotMultiInfo)
return _multiInfo;
#if USE_LIBCURLSHIM
var nMsgs = 0;
var pInfo = NativeMethods.curl_shim_multi_info_read(_pMulti, ref nMsgs);
if (pInfo != IntPtr.Zero)
{
_multiInfo = new CurlMultiInfo[nMsgs];
for (var i = 0; i < nMsgs; i++)
{
var msg = (CurlMessage) Marshal.ReadInt32(pInfo, i*12);
var pEasy = Marshal.ReadIntPtr(pInfo, i*12 + 4);
var code = (CurlCode) Marshal.ReadInt32(pInfo, i*12 + 8);
_multiInfo[i] = new CurlMultiInfo(msg, (CurlEasy) _htEasy[pEasy], code);
}
NativeMethods.curl_shim_multi_info_free(pInfo);
}
_bGotMultiInfo = true;
#else
_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

@@ -1,55 +0,0 @@
/***************************************************************************
*
* CurlS#arp
*
* 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
* should have received as part of this distribution.
*
* You may opt to use, copy, modify, merge, publish, distribute and/or sell
* copies of this Software, and permit persons to whom the Software is
* furnished to do so, under the terms of the LICENSE file.
*
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
* ANY KIND, either express or implied.
*
**************************************************************************/
using CurlSharp.Enums;
namespace CurlSharp
{
/// <summary>
/// Wraps the <c>cURL</c> struct <c>CURLMsg</c>. This class provides
/// status information following a <see cref="CurlMulti" /> transfer.
/// </summary>
public sealed class CurlMultiInfo
{
// private members
internal CurlMultiInfo(CurlMessage msg, CurlEasy curlEasy, CurlCode result)
{
Msg = msg;
CurlEasyHandle = curlEasy;
Result = result;
}
/// <summary>
/// Get the status code from the <see cref="CurlMessage" /> enumeration.
/// </summary>
public CurlMessage Msg { get; }
/// <summary>
/// Get the <see cref="CurlEasy" /> object for this child.
/// </summary>
public CurlEasy CurlEasyHandle { get; }
/// <summary>
/// Get the return code for the transfer, as a
/// <see cref="CurlCode" />.
/// </summary>
public CurlCode Result { get; }
}
}

View File

@@ -1,242 +0,0 @@
/***************************************************************************
*
* CurlS#arp
*
* Copyright (c) 2013 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
* should have received as part of this distribution.
*
* You may opt to use, copy, modify, merge, publish, distribute and/or sell
* copies of this Software, and permit persons to whom the Software is
* furnished to do so, under the terms of the LICENSE file.
*
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
* ANY KIND, either express or implied.
*
**************************************************************************/
using System;
using System.Runtime.InteropServices;
using CurlSharp.Callbacks;
using CurlSharp.Enums;
namespace CurlSharp
{
/// <summary>
/// This class provides an infrastructure for serializing access to data
/// shared by multiple <see cref="CurlEasy" /> objects, including cookie data
/// and Dns hosts. It implements the <c>curl_share_xxx</c> API.
/// </summary>
public class CurlShare : IDisposable
{
// private members
private GCHandle _hThis; // for handle extraction
#if USE_LIBCURLSHIM
private NativeMethods._ShimLockCallback _pDelLock; // lock delegate
private NativeMethods._ShimUnlockCallback _pDelUnlock; // unlock delegate
#endif
private IntPtr _pShare; // share handle
private IntPtr _ptrThis; // numeric handle
/// <summary>
/// Constructor
/// </summary>
/// <exception cref="System.InvalidOperationException">
/// This is thrown
/// if <see cref="Curl" /> hasn't bee properly initialized.
/// </exception>
/// <exception cref="System.NullReferenceException">
/// This is thrown if
/// the native <c>share</c> handle wasn't created successfully.
/// </exception>
public CurlShare()
{
Curl.EnsureCurl();
_pShare = NativeMethods.curl_share_init();
EnsureHandle();
LockFunction = null;
UnlockFunction = null;
UserData = null;
installDelegates();
}
public object UserData { get; set; }
public CurlShareUnlockCallback UnlockFunction { get; set; }
public CurlShareLockCallback LockFunction { get; set; }
public CurlLockData Share
{
set { setShareOption(CurlShareOption.Share, value); }
}
public CurlLockData Unshare
{
set { setShareOption(CurlShareOption.Unshare, value); }
}
public CurlShareCode LastErrorCode { get; private set; }
public string LastErrorDescription { get; private set; }
/// <summary>
/// Cleanup unmanaged resources.
/// </summary>
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
/// <summary>
/// Destructor
/// </summary>
~CurlShare()
{
Dispose(false);
}
/// <summary>
/// Set options for this object.
/// </summary>
/// <param name="option">
/// One of the values in the <see cref="CurlShareOption" />
/// enumeration.
/// </param>
/// <param name="parameter">
/// An appropriate object based on the value passed in the
/// <c>option</c> argument. See <see cref="CurlShareOption" />
/// for more information about the appropriate parameter type.
/// </param>
/// <returns>
/// A <see cref="CurlShareCode" />, hopefully
/// <c>CurlShareCode.Ok</c>.
/// </returns>
/// <exception cref="System.NullReferenceException">
/// This is thrown if
/// the native <c>share</c> handle wasn't created successfully.
/// </exception>
public CurlShareCode SetOpt(CurlShareOption option, object parameter)
{
EnsureHandle();
var retCode = CurlShareCode.Ok;
switch (option)
{
case CurlShareOption.LockFunction:
var lf = parameter as CurlShareLockCallback;
if (lf == null)
return CurlShareCode.BadOption;
LockFunction = lf;
break;
case CurlShareOption.UnlockFunction:
var ulf = parameter as CurlShareUnlockCallback;
if (ulf == null)
return CurlShareCode.BadOption;
UnlockFunction = ulf;
break;
case CurlShareOption.Share:
case CurlShareOption.Unshare:
{
var opt = (CurlLockData) Convert.ToInt32(parameter);
retCode = setShareOption(option, opt);
break;
}
case CurlShareOption.UserData:
UserData = parameter;
break;
default:
retCode = CurlShareCode.BadOption;
break;
}
return retCode;
}
private void setLastError(CurlShareCode code, CurlShareOption opt)
{
if ((LastErrorCode == CurlShareCode.Ok) && (code != CurlShareCode.Ok))
{
LastErrorCode = code;
LastErrorDescription = $"Error: {StrError(code)} setting option {opt}";
}
}
private CurlShareCode setShareOption(CurlShareOption option, CurlLockData value)
{
var retCode = (value != CurlLockData.Cookie) && (value != CurlLockData.Dns)
? CurlShareCode.BadOption
: NativeMethods.curl_share_setopt(_pShare, option, (IntPtr) value);
setLastError(retCode, option);
return retCode;
}
/// <summary>
/// Return a String description of an error code.
/// </summary>
/// <param name="errorNum">
/// The <see cref="CurlShareCode" /> for which to obtain the error
/// string description.
/// </param>
/// <returns>The string description.</returns>
public string StrError(CurlShareCode errorNum)
=> Marshal.PtrToStringAnsi(NativeMethods.curl_share_strerror(errorNum));
private void Dispose(bool disposing)
{
lock (this)
{
// if (disposing) cleanup managed objects
if (_pShare != IntPtr.Zero)
{
#if USE_LIBCURLSHIM
NativeMethods.curl_shim_cleanup_share_delegates(_pShare);
#endif
NativeMethods.curl_share_cleanup(_pShare);
_hThis.Free();
_ptrThis = IntPtr.Zero;
_pShare = IntPtr.Zero;
}
}
}
internal IntPtr GetHandle() => _pShare;
private void EnsureHandle()
{
if (_pShare == IntPtr.Zero)
throw new NullReferenceException("No internal share handle");
}
private void installDelegates()
{
_hThis = GCHandle.Alloc(this);
_ptrThis = (IntPtr) _hThis;
#if USE_LIBCURLSHIM
_pDelLock = LockDelegate;
_pDelUnlock = UnlockDelegate;
NativeMethods.curl_shim_install_share_delegates(_pShare, _ptrThis, _pDelLock, _pDelUnlock);
#endif
}
internal static void LockDelegate(int data, int access, IntPtr userPtr)
{
var gch = (GCHandle) userPtr;
var share = (CurlShare) gch.Target;
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;
share?.UnlockFunction?.Invoke((CurlLockData) data, share.UserData);
}
}
}

View File

@@ -1,12 +0,0 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>net452;netstandard2.0</TargetFrameworks>
</PropertyGroup>
<PropertyGroup>
<AllowUnsafeBlocks>True</AllowUnsafeBlocks>
<PackageId>CurlSharp</PackageId>
<GeneratePackageOnBuild>false</GeneratePackageOnBuild>
</PropertyGroup>
</Project>

View File

@@ -1,141 +0,0 @@
/***************************************************************************
*
* CurlS#arp
*
* 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
* should have received as part of this distribution.
*
* You may opt to use, copy, modify, merge, publish, distribute and/or sell
* copies of this Software, and permit persons to whom the Software is
* furnished to do so, under the terms of the LICENSE file.
*
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
* ANY KIND, either express or implied.
*
**************************************************************************/
using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using CurlSharp.Enums;
namespace CurlSharp
{
/// <summary>
/// This class wraps a linked list of strings used in <c>cURL</c>. Use it
/// to build string lists where they're required, such as when calling
/// <see cref="CurlEasy.SetOpt" /> with <see cref="CurlOption.Quote" />
/// as the option.
/// </summary>
public class CurlSlist : IDisposable
{
/// <summary>
/// Constructor
/// </summary>
/// <exception cref="System.InvalidOperationException">
/// This is thrown
/// if <see cref="Curl" /> hasn't bee properly initialized.
/// </exception>
public CurlSlist()
{
Curl.EnsureCurl();
Handle = IntPtr.Zero;
}
public CurlSlist(IntPtr handle)
{
Handle = handle;
}
/// <summary>
/// Read-only copy of the strings stored in the SList
/// </summary>
public List<string> Strings
{
get
{
if (Handle == IntPtr.Zero)
return null;
var strings = new List<string>();
#if !USE_LIBCURLSHIM
var slist = new curl_slist();
Marshal.PtrToStructure(Handle, slist);
while (true)
{
strings.Add(slist.data);
if (slist.next != IntPtr.Zero)
Marshal.PtrToStructure(slist.next, slist);
else
break;
}
#endif
return strings;
}
}
internal IntPtr Handle { get; private set; }
/// <summary>
/// Free all internal strings.
/// </summary>
public void Dispose()
{
GC.SuppressFinalize(this);
Dispose(true);
}
/// <summary>
/// Destructor
/// </summary>
~CurlSlist()
{
Dispose(false);
}
/// <summary>
/// Append a string to the list.
/// </summary>
/// <param name="str">The <c>string</c> to append.</param>
public void Append(string str)
{
#if USE_LIBCURLSHIM
Handle = NativeMethods.curl_shim_add_string_to_slist(Handle, str);
#else
Handle = NativeMethods.curl_slist_append(Handle, str);
#endif
}
private void Dispose(bool disposing)
{
lock (this)
{
if (Handle != IntPtr.Zero)
{
#if USE_LIBCURLSHIM
NativeMethods.curl_shim_free_slist(Handle);
#else
NativeMethods.curl_slist_free_all(Handle);
#endif
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

@@ -1,45 +0,0 @@
/***************************************************************************
*
* CurlS#arp
*
* 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
* should have received as part of this distribution.
*
* You may opt to use, copy, modify, merge, publish, distribute and/or sell
* copies of this Software, and permit persons to whom the Software is
* furnished to do so, under the terms of the LICENSE file.
*
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
* ANY KIND, either express or implied.
*
**************************************************************************/
using System;
using CurlSharp.Callbacks;
namespace CurlSharp
{
/// <summary>
/// An instance of this class is passed to the delegate
/// <see cref="CurlSslContextCallback" />, if it's implemented.
/// Within that delegate, the code will have to make native calls to
/// the <c>OpenSSL</c> library with the value returned from the
/// <see cref="CurlSslContext.Context" /> property cast to an
/// <c>SSL_CTX</c> pointer.
/// </summary>
public sealed class CurlSslContext
{
internal CurlSslContext(IntPtr pvContext)
{
Context = pvContext;
}
/// <summary>
/// Get the underlying OpenSSL context.
/// </summary>
public IntPtr Context { get; }
}
}

View File

@@ -1,207 +0,0 @@
/***************************************************************************
*
* CurlS#arp
*
* 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
* should have received as part of this distribution.
*
* You may opt to use, copy, modify, merge, publish, distribute and/or sell
* copies of this Software, and permit persons to whom the Software is
* furnished to do so, under the terms of the LICENSE file.
*
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
* ANY KIND, either express or implied.
*
**************************************************************************/
using System;
using CurlSharp.Enums;
namespace CurlSharp
{
/// <summary>
/// This class wraps a <c>curl_version_info_data</c> struct. An instance is
/// obtained by calling <see cref="Curl.GetVersionInfo" />.
/// </summary>
public sealed class CurlVersionInfoData
{
private const int OFFSET_AGE = 0;
private const int OFFSET_VERSION = 4;
private const int OFFSET_VERSION_NUM = 8;
private const int OFFSET_HOST = 12;
private const int OFFSET_FEATURES = 16;
private const int OFFSET_SSL_VERSION = 20;
private const int OFFSET_SSL_VERSION_NUM = 24;
private const int OFFSET_LIBZ_VERSION = 28;
private const int OFFSET_PROTOCOLS = 32;
private const int OFFSET_ARES_VERSION = 36;
private const int OFFSET_ARES_VERSION_NUM = 40;
private const int OFFSET_LIBIDN_VERSION = 44;
private readonly IntPtr m_pVersionInfoData;
internal CurlVersionInfoData(CurlVersion ver)
{
m_pVersionInfoData = NativeMethods.curl_version_info(ver);
}
#if USE_LIBCURLSHIM
/// <summary>
/// Age of this struct, depending on how recent the linked-in
/// <c>libcurl</c> is, as a <see cref="CurlVersion" />.
/// </summary>
public CurlVersion Age
{
get { return (CurlVersion) NativeMethods.curl_shim_get_version_int_value(m_pVersionInfoData, OFFSET_AGE); }
}
/// <summary>
/// Get the internal cURL version, as a <c>string</c>.
/// </summary>
public string Version
{
get
{
return Marshal.PtrToStringAnsi(
NativeMethods.curl_shim_get_version_char_ptr(m_pVersionInfoData, OFFSET_VERSION));
}
}
/// <summary>
/// Get the internal cURL version number, a A 24-bit number created
/// like this: [8 bits major number] | [8 bits minor number] | [8
/// bits patch number]. For example, Version 7.12.2 is <c>0x070C02</c>.
/// </summary>
public int VersionNum
{
get { return NativeMethods.curl_shim_get_version_int_value(m_pVersionInfoData, OFFSET_VERSION_NUM); }
}
/// <summary>
/// Get the host information on which the underlying cURL was built.
/// </summary>
public string Host
{
get
{
return
Marshal.PtrToStringAnsi(NativeMethods.curl_shim_get_version_char_ptr(m_pVersionInfoData, OFFSET_HOST));
}
}
/// <summary>
/// Get a bitmask of features, containing bits or'd from the
/// <see cref="CurlVersionFeatureBitmask" /> enumeration.
/// </summary>
public int Features
{
get { return NativeMethods.curl_shim_get_version_int_value(m_pVersionInfoData, OFFSET_FEATURES); }
}
/// <summary>
/// Get the Ssl version, if it's linked in.
/// </summary>
public string SslVersion
{
get
{
return
Marshal.PtrToStringAnsi(NativeMethods.curl_shim_get_version_char_ptr(m_pVersionInfoData,
OFFSET_SSL_VERSION));
}
}
/// <summary>
/// Get the Ssl version number, if Ssl is linked in.
/// </summary>
public int SSLVersionNum
{
get { return NativeMethods.curl_shim_get_version_int_value(m_pVersionInfoData, OFFSET_SSL_VERSION_NUM); }
}
/// <summary>
/// Get the libz version, if libz is linked in.
/// </summary>
public string LibZVersion
{
get
{
return
Marshal.PtrToStringAnsi(NativeMethods.curl_shim_get_version_char_ptr(m_pVersionInfoData,
OFFSET_LIBZ_VERSION));
}
}
/// <summary>
/// Get the names of the supported protocols.
/// </summary>
public string[] Protocols
{
get
{
var nProts = NativeMethods.curl_shim_get_number_of_protocols(
m_pVersionInfoData, OFFSET_PROTOCOLS);
var aProts = new String[nProts];
for (var i = 0; i < nProts; i++)
{
aProts[i] =
Marshal.PtrToStringAnsi(NativeMethods.curl_shim_get_protocol_string(m_pVersionInfoData,
OFFSET_PROTOCOLS, i));
}
return aProts;
}
}
/// <summary>
/// Get the ARes version, if ARes is linked in.
/// </summary>
public string ARes
{
get
{
if (Age > CurlVersion.First)
{
return
Marshal.PtrToStringAnsi(NativeMethods.curl_shim_get_version_char_ptr(m_pVersionInfoData,
OFFSET_ARES_VERSION));
}
return "n.a.";
}
}
/// <summary>
/// Get the ARes version number, if ARes is linked in.
/// </summary>
public int AResNum
{
get
{
if (Age > CurlVersion.First)
{
return NativeMethods.curl_shim_get_version_int_value(m_pVersionInfoData, OFFSET_ARES_VERSION_NUM);
}
return 0;
}
}
/// <summary>
/// Get the libidn version, if libidn is linked in.
/// </summary>
public string LibIdn
{
get
{
if (Age > CurlVersion.Second)
{
return
Marshal.PtrToStringAnsi(NativeMethods.curl_shim_get_version_char_ptr(m_pVersionInfoData,
OFFSET_LIBIDN_VERSION));
}
return "n.a.";
}
}
#endif
}
}

View File

@@ -1,46 +0,0 @@
namespace CurlSharp.Enums
{
/// <summary>
/// Contains values used to specify the order in which cached connections
/// are closed. One of these is passed as the
/// <see cref="CurlOption.ClosePolicy" /> option in a call
/// to <see cref="CurlEasy.SetOpt" />
/// </summary>
public enum CurlClosePolicy
{
/// <summary>
/// No close policy. Never use this.
/// </summary>
None = 0,
/// <summary>
/// Close the oldest cached connections first.
/// </summary>
Oldest = 1,
/// <summary>
/// Close the least recently used connections first.
/// </summary>
LeastRecentlyUsed = 2,
/// <summary>
/// Close the connections with the least traffic first.
/// </summary>
LeastTraffic = 3,
/// <summary>
/// Close the slowest connections first.
/// </summary>
Slowest = 4,
/// <summary>
/// Currently unimplemented.
/// </summary>
Callback = 5,
/// <summary>
/// End-of-enumeration marker; do not use in application code.
/// </summary>
Last = 6
};
}

View File

@@ -1,403 +0,0 @@
namespace CurlSharp.Enums
{
/// <summary>
/// Status code returned from <see cref="CurlEasy" /> functions.
/// </summary>
public enum CurlCode
{
/// <summary>
/// All fine. Proceed as usual.
/// </summary>
Ok = 0,
/// <summary>
/// Aborted by callback. An internal callback returned "abort"
/// to libcurl.
/// </summary>
AbortedByCallback = 42,
/// <summary>
/// Internal error. A function was called in a bad order.
/// </summary>
BadCallingOrder = 44,
/// <summary>
/// Unrecognized transfer encoding.
/// </summary>
BadContentEncoding = 61,
/// <summary>
/// Attempting FTP resume beyond file size.
/// </summary>
BadDownloadResume = 36,
/// <summary>
/// Internal error. A function was called with a bad parameter.
/// </summary>
BadFunctionArgument = 43,
/// <summary>
/// Bad password entered. An error was signaled when the password was
/// entered. This can also be the result of a "bad password" returned
/// from a specified password callback.
/// </summary>
BadPasswordEntered = 46,
/// <summary>
/// Failed to connect to host or proxy.
/// </summary>
CouldntConnect = 7,
/// <summary>
/// Couldn't resolve host. The given remote host was not resolved.
/// </summary>
CouldntResolveHost = 6,
/// <summary>
/// Couldn't resolve proxy. The given proxy host could not be resolved.
/// </summary>
CouldntResolveProxy = 5,
/// <summary>
/// Very early initialization code failed. This is likely to be an
/// internal error or problem.
/// </summary>
FailedInit = 2,
/// <summary>
/// Maximum file size exceeded.
/// </summary>
FilesizeExceeded = 63,
/// <summary>
/// A file given with FILE:// couldn't be opened. Most likely
/// because the file path doesn't identify an existing file. Did
/// you check file permissions?
/// </summary>
FileCouldntReadFile = 37,
/// <summary>
/// We were denied access when trying to login to an FTP server or
/// when trying to change working directory to the one given in the URL.
/// </summary>
FtpAccessDenied = 9,
/// <summary>
/// An internal failure to lookup the host used for the new
/// connection.
/// </summary>
FtpCantGetHost = 15,
/// <summary>
/// A bad return code on either PASV or EPSV was sent by the FTP
/// server, preventing libcurl from being able to continue.
/// </summary>
FtpCantReconnect = 16,
/// <summary>
/// The FTP SIZE command returned error. SIZE is not a kosher FTP
/// command, it is an extension and not all servers support it. This
/// is not a surprising error.
/// </summary>
FtpCouldntGetSize = 32,
/// <summary>
/// This was either a weird reply to a 'RETR' command or a zero byte
/// transfer complete.
/// </summary>
FtpCouldntRetrFile = 19,
/// <summary>
/// libcurl failed to set ASCII transfer type (TYPE A).
/// </summary>
FtpCouldntSetAscii = 29,
/// <summary>
/// Received an error when trying to set the transfer mode to binary.
/// </summary>
FtpCouldntSetBinary = 17,
/// <summary>
/// FTP couldn't STOR file. The server denied the STOR operation.
/// The error buffer usually contains the server's explanation to this.
/// </summary>
FtpCouldntStorFile = 25,
/// <summary>
/// The FTP REST command returned error. This should never happen
/// if the server is sane.
/// </summary>
FtpCouldntUseRest = 31,
/// <summary>
/// The FTP PORT command returned error. This mostly happen when
/// you haven't specified a good enough address for libcurl to use.
/// See <see cref="CurlOption.FtpPort" />.
/// </summary>
FtpPortFailed = 30,
/// <summary>
/// When sending custom "QUOTE" commands to the remote server, one
/// of the commands returned an error code that was 400 or higher.
/// </summary>
FtpQuoteError = 21,
/// <summary>
/// Requested FTP Ssl level failed.
/// </summary>
FtpSslFailed = 64,
/// <summary>
/// The FTP server rejected access to the server after the password
/// was sent to it. It might be because the username and/or the
/// password were incorrect or just that the server is not allowing
/// you access for the moment etc.
/// </summary>
FtpUserPasswordIncorrect = 10,
/// <summary>
/// FTP servers return a 227-line as a response to a PASV command.
/// If libcurl fails to parse that line, this return code is
/// passed back.
/// </summary>
FtpWeird227Format = 14,
/// <summary>
/// After having sent the FTP password to the server, libcurl expects
/// a proper reply. This error code indicates that an unexpected code
/// was returned.
/// </summary>
FtpWeirdPassReply = 11,
/// <summary>
/// libcurl failed to get a sensible result back from the server as
/// a response to either a PASV or a EPSV command. The server is flawed.
/// </summary>
FtpWeirdPasvReply = 13,
/// <summary>
/// After connecting to an FTP server, libcurl expects to get a
/// certain reply back. This error code implies that it got a strange
/// or bad reply. The given remote server is probably not an
/// OK FTP server.
/// </summary>
FtpWeirdServerReply = 8,
/// <summary>
/// After having sent user name to the FTP server, libcurl expects a
/// proper reply. This error code indicates that an unexpected code
/// was returned.
/// </summary>
FtpWeirdUserReply = 12,
/// <summary>
/// After a completed file transfer, the FTP server did not respond a
/// proper "transfer successful" code.
/// </summary>
FtpWriteError = 20,
/// <summary>
/// Function not found. A required LDAP function was not found.
/// </summary>
FunctionNotFound = 41,
/// <summary>
/// Nothing was returned from the server, and under the circumstances,
/// getting nothing is considered an error.
/// </summary>
GotNothing = 52,
/// <summary>
/// This is an odd error that mainly occurs due to internal confusion.
/// </summary>
HttpPostError = 34,
/// <summary>
/// The HTTP server does not support or accept range requests.
/// </summary>
HttpRangeError = 33,
/// <summary>
/// This is returned if <see cref="CurlOption.FailOnError" />
/// is set TRUE and the HTTP server returns an error code that
/// is >= 400.
/// </summary>
HttpReturnedError = 22,
/// <summary>
/// Interface error. A specified outgoing interface could not be
/// used. Set which interface to use for outgoing connections'
/// source IP address with <see cref="CurlOption.Interface" />.
/// </summary>
InterfaceFailed = 45,
/// <summary>
/// End-of-enumeration marker; do not use in client applications.
/// </summary>
Last = 67,
/// <summary>
/// LDAP cannot bind. LDAP bind operation failed.
/// </summary>
LdapCannotBind = 38,
/// <summary>
/// Invalid LDAP URL.
/// </summary>
LdapInvalidUrl = 62,
/// <summary>
/// LDAP search failed.
/// </summary>
LdapSearchFailed = 39,
/// <summary>
/// Library not found. The LDAP library was not found.
/// </summary>
LibraryNotFound = 40,
/// <summary>
/// Malformat user. User name badly specified. *Not currently used*
/// </summary>
MalformatUser = 24,
/// <summary>
/// This is not an error. This used to be another error code in an
/// old libcurl version and is currently unused.
/// </summary>
Obsolete = 50,
/// <summary>
/// Operation timeout. The specified time-out period was reached
/// according to the conditions.
/// </summary>
OperationTimeouted = 28,
/// <summary>
/// Out of memory. A memory allocation request failed. This is serious
/// badness and things are severely messed up if this ever occurs.
/// </summary>
OutOfMemory = 27,
/// <summary>
/// A file transfer was shorter or larger than expected. This
/// happens when the server first reports an expected transfer size,
/// and then delivers data that doesn't match the previously
/// given size.
/// </summary>
PartialFile = 18,
/// <summary>
/// There was a problem reading a local file or an error returned by
/// the read callback.
/// </summary>
ReadError = 26,
/// <summary>
/// Failure with receiving network data.
/// </summary>
RecvError = 56,
/// <summary>
/// Failed sending network data.
/// </summary>
SendError = 55,
/// <summary>
/// Sending the data requires a rewind that failed.
/// </summary>
SendFailRewind = 65,
/// <summary>
/// CurlShare is in use.
/// </summary>
ShareInUse = 57,
/// <summary>
/// Problem with the CA cert (path? access rights?)
/// </summary>
SslCaCert = 60,
/// <summary>
/// There's a problem with the local client certificate.
/// </summary>
SslCertProblem = 58,
/// <summary>
/// Couldn't use specified cipher.
/// </summary>
SslCipher = 59,
/// <summary>
/// A problem occurred somewhere in the Ssl/TLS handshake. You really
/// want to use the <see cref="CurlEasy.CurlDebugCallback" /> delegate and read
/// the message there as it pinpoints the problem slightly more. It
/// could be certificates (file formats, paths, permissions),
/// passwords, and others.
/// </summary>
SslConnectError = 35,
/// <summary>
/// Failed to initialize Ssl engine.
/// </summary>
SslEngineInitFailed = 66,
/// <summary>
/// The specified crypto engine wasn't found.
/// </summary>
SslEngineNotFound = 53,
/// <summary>
/// Failed setting the selected Ssl crypto engine as default!
/// </summary>
SslEngineSetFailed = 54,
/// <summary>
/// The remote server's Ssl certificate was deemed not OK.
/// </summary>
SslPeerCertificate = 51,
/// <summary>
/// A telnet option string was improperly formatted.
/// </summary>
TelnetOptionSyntax = 49,
/// <summary>
/// Too many redirects. When following redirects, libcurl hit the
/// maximum amount. Set your limit with
/// <see cref="CurlOption.MaxRedirs" />.
/// </summary>
TooManyRedirects = 47,
/// <summary>
/// An option set with <see cref="CurlOption.TelnetOptions" />
/// was not recognized/known. Refer to the appropriate documentation.
/// </summary>
UnknownTelnetOption = 48,
/// <summary>
/// The URL you passed to libcurl used a protocol that this libcurl
/// does not support. The support might be a compile-time option that
/// wasn't used, it can be a misspelled protocol string or just a
/// protocol libcurl has no code for.
/// </summary>
UnsupportedProtocol = 1,
/// <summary>
/// The URL was not properly formatted.
/// </summary>
UrlMalformat = 3,
/// <summary>
/// URL user malformatted. The user-part of the URL syntax was not
/// correct.
/// </summary>
UrlMalformatUser = 4,
/// <summary>
/// An error occurred when writing received data to a local file,
/// or an error was returned to libcurl from a write callback.
/// </summary>
WriteError = 23,
};
}

View File

@@ -1,76 +0,0 @@
/***************************************************************************
*
* Project: libcurl.NET
*
* Copyright (c) 2004, 2005 Jeff Phillips (jeff@jeffp.net)
*
* This software is licensed as described in the file LICENSE, which you
* should have received as part of this distribution.
*
* You may opt to use, copy, modify, merge, publish, distribute and/or sell
* copies of this Software, and permit persons to whom the Software is
* furnished to do so, under the terms of the LICENSE file.
*
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
* ANY KIND, either express or implied.
*
* $Id: Enums.cs,v 1.1 2005/02/17 22:47:25 jeffreyphillips Exp $
**************************************************************************/
namespace CurlSharp.Enums
{
/// <summary>
/// One of these is returned by <see cref="CurlHttpMultiPartForm.AddSection" />.
/// </summary>
public enum CurlFormCode
{
/// <summary>
/// The section was added properly.
/// </summary>
Ok = 0,
/// <summary>
/// Out-of-memory when adding the section.
/// </summary>
Memory = 1,
/// <summary>
/// Invalid attempt to add the same option more than once to a
/// section.
/// </summary>
OptionTwice = 2,
/// <summary>
/// Invalid attempt to pass a <c>null</c> string or byte array in
/// one of the arguments.
/// </summary>
Null = 3,
/// <summary>
/// Invalid attempt to pass an unrecognized option in one of the
/// arguments.
/// </summary>
UnknownOption = 4,
/// <summary>
/// Incomplete argument lists.
/// </summary>
Incomplete = 5,
/// <summary>
/// Invalid attempt to provide a nested <c>Array</c>.
/// </summary>
IllegalArray = 6,
/// <summary>
/// This will not be returned so long as HTTP is enabled, which
/// it always is in libcurl.NET.
/// </summary>
Disabled = 7,
/// <summary>
/// End-of-enumeration marker; do not use in application code.
/// </summary>
Last = 8
};
}

View File

@@ -1,142 +0,0 @@
namespace CurlSharp.Enums
{
/// <summary>
/// These are options available to build a multi-part form section
/// in a call to <see cref="CurlHttpMultiPartForm.AddSection" />
/// </summary>
public enum CurlFormOption
{
/// <summary>
/// Another possibility to send options to
/// <see cref="CurlHttpMultiPartForm.AddSection" /> is this option, that
/// passes a <see cref="CurlForms" /> array reference as its value.
/// Each <see cref="CurlForms" /> array element has a
/// <see cref="CurlFormOption" /> and a <c>string</c>. All available
/// options can be used in an array, except the <c>Array</c>
/// option itself! The last argument in such an array must always be
/// <c>End</c>.
/// </summary>
Array = 8,
/// <summary>
/// Followed by a <c>string</c>, tells libcurl that a buffer is to be
/// used to upload data instead of using a file.
/// </summary>
Buffer = 11,
/// <summary>
/// Followed by an <c>int</c> with the size of the
/// <c>BufferPtr</c> byte array, tells libcurl the length of
/// the data to upload.
/// </summary>
BufferLength = 13,
/// <summary>
/// Followed by a <c>byte[]</c> array, tells libcurl the address of
/// the buffer containing data to upload (as indicated with
/// <c>Buffer</c>). You must also use
/// <c>BufferLength</c> to set the length of the buffer area.
/// </summary>
BufferPtr = 12,
/// <summary>
/// Specifies extra headers for the form POST section. This takes an
/// <see cref="CurlSlist" /> prepared in the usual way using
/// <see cref="CurlSlist.Append" /> and appends the list of headers to
/// those libcurl automatically generates.
/// </summary>
ContentHeader = 15,
/// <summary>
/// Followed by an <c>int</c> setting the length of the contents.
/// </summary>
ContentsLength = 6,
/// <summary>
/// Followed by a <c>string</c> with a content-type will make cURL
/// use this given content-type for this file upload part, possibly
/// instead of an internally chosen one.
/// </summary>
ContentType = 14,
/// <summary>
/// Followed by a <c>string</c> is used for the contents of this part, the
/// actual data to send away. If you'd like it to contain zero bytes,
/// you need to set the length of the name with
/// <c>ContentsLength</c>.
/// </summary>
CopyContents = 4,
/// <summary>
/// Followed by a <c>string</c> used to set the name of this part.
/// If you'd like it to contain zero bytes, you need to set the
/// length of the name with <c>NameLength</c>.
/// </summary>
CopyName = 1,
/// <summary>
/// This should be the last argument to a call to
/// <see cref="CurlHttpMultiPartForm.AddSection" />.
/// </summary>
End = 17,
/// <summary>
/// Followed by a file name, makes this part a file upload part. It
/// sets the file name field to the actual file name used here,
/// it gets the contents of the file and passes as data and sets the
/// content-type if the given file match one of the new internally
/// known file extension. For <c>File</c> the user may send
/// one or more files in one part by providing multiple <c>File</c>
/// arguments each followed by the filename (and each <c>File</c>
/// is allowed to have a <c>ContentType</c>).
/// </summary>
File = 10,
/// <summary>
/// Followed by a file name, and does the file read: the contents
/// will be used in as data in this part.
/// </summary>
FileContent = 7,
/// <summary>
/// Followed by a <c>string</c> file name, will make libcurl use the
/// given name in the file upload part, instead of the actual file
/// name given to <c>File</c>.
/// </summary>
Filename = 16,
/// <summary>
/// Followed by an <c>int</c> setting the length of the name.
/// </summary>
NameLength = 3,
/// <summary>
/// Not used.
/// </summary>
Nothing = 0,
/// <summary>
/// No longer used.
/// </summary>
Obsolete = 9,
/// <summary>
/// No longer used.
/// </summary>
Obsolete2 = 18,
/// <summary>
/// Followed by a <c>byte[]</c> used for the contents of this part.
/// If you'd like it to contain zero bytes, you need to set the
/// length of the name with <c>ContentsLength</c>.
/// </summary>
PtrContents = 5,
/// <summary>
/// Followed by a <c>byte[]</c> used for the name of this part.
/// If you'd like it to contain zero bytes, you need to set the
/// length of the name with <c>NameLength</c>.
/// </summary>
PtrName = 2
};
}

View File

@@ -1,31 +0,0 @@
namespace CurlSharp.Enums
{
/// <summary>
/// This enumeration contains values used to specify the FTP Ssl
/// authorization level using the
/// <see cref="CurlOption.FtpSslAuth" /> option when calling
/// <see cref="CurlEasy.SetOpt" />
/// </summary>
public enum CurlFtpAuth
{
/// <summary>
/// Let <c>libcurl</c> decide on the authorization scheme.
/// </summary>
Default = 0,
/// <summary>
/// Use "AUTH Ssl".
/// </summary>
SSL = 1,
/// <summary>
/// Use "AUTH TLS".
/// </summary>
TLS = 2,
/// <summary>
/// End-of-enumeration marker. Do not use in a client application.
/// </summary>
Last = 3
};
}

View File

@@ -1,37 +0,0 @@
namespace CurlSharp.Enums
{
/// <summary>
/// This enumeration contains values used to specify the FTP Ssl level
/// using the <see cref="CurlOption.FtpSsl" /> option when calling
/// <see cref="CurlEasy.SetOpt" />
/// </summary>
public enum CurlFtpSsl
{
/// <summary>
/// Don't attempt to use Ssl.
/// </summary>
None = 0,
/// <summary>
/// Try using Ssl, proceed as normal otherwise.
/// </summary>
Try = 1,
/// <summary>
/// Require Ssl for the control connection or fail with
/// <see cref="CurlCode.FtpSslFailed" />.
/// </summary>
Control = 2,
/// <summary>
/// Require Ssl for all communication or fail with
/// <see cref="CurlCode.FtpSslFailed" />.
/// </summary>
All = 3,
/// <summary>
/// End-of-enumeration marker. Do not use in a client application.
/// </summary>
Last = 4
};
}

View File

@@ -1,65 +0,0 @@
namespace CurlSharp.Enums
{
/// <summary>
/// This enumeration contains values used to specify the HTTP authentication
/// when using the <see cref="CurlOption.HttpAuth" /> option when
/// calling <see cref="CurlEasy.SetOpt" />
/// </summary>
public enum CurlHttpAuth
{
/// <summary>
/// No authentication.
/// </summary>
None = 0,
/// <summary>
/// HTTP Basic authentication. This is the default choice, and the
/// only method that is in wide-spread use and supported virtually
/// everywhere. This is sending the user name and password over the
/// network in plain text, easily captured by others.
/// </summary>
Basic = 1,
/// <summary>
/// HTTP Digest authentication. Digest authentication is defined
/// in RFC2617 and is a more secure way to do authentication over
/// public networks than the regular old-fashioned Basic method.
/// </summary>
Digest = 2,
/// <summary>
/// HTTP GSS-Negotiate authentication. The GSS-Negotiate (also known
/// as plain "Negotiate") method was designed by Microsoft and is
/// used in their web applications. It is primarily meant as a
/// support for Kerberos5 authentication but may be also used along
/// with another authentication methods. For more information see IETF
/// draft draft-brezak-spnego-http-04.txt.
/// <note>
/// You need to use a version of libcurl.NET built with a suitable
/// GSS-API library for this to work. This is not currently standard.
/// </note>
/// </summary>
GssNegotiate = 4,
/// <summary>
/// HTTP Ntlm authentication. A proprietary protocol invented and
/// used by Microsoft. It uses a challenge-response and hash concept
/// similar to Digest, to prevent the password from being eavesdropped.
/// </summary>
Ntlm = 8,
/// <summary>
/// This is a convenience macro that sets all bits and thus makes
/// libcurl pick any it finds suitable. libcurl will automatically
/// select the one it finds most secure.
/// </summary>
Any = 15, // ~0
/// <summary>
/// This is a convenience macro that sets all bits except Basic
/// and thus makes libcurl pick any it finds suitable. libcurl
/// will automatically select the one it finds most secure.
/// </summary>
AnySafe = 14 // ~Basic
};
}

View File

@@ -1,46 +0,0 @@
namespace CurlSharp.Enums
{
/// <summary>
/// Contains values used to specify the HTTP version level when using
/// the <see cref="CurlOption.HttpVersion" /> option in a call
/// to <see cref="CurlEasy.SetOpt" />
/// </summary>
public enum CurlHttpVersion
{
/// <summary>
/// We don't care about what version the library uses. libcurl will
/// use whatever it thinks fit.
/// </summary>
None = 0,
/// <summary>
/// Enforce HTTP 1.0 requests.
/// </summary>
Http1_0 = 1,
/// <summary>
/// Enforce HTTP 1.1 requests.
/// </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 = 6
}
}

View File

@@ -1,222 +0,0 @@
namespace CurlSharp.Enums
{
/// <summary>
/// This enumeration is used to extract information associated with an
/// <see cref="CurlEasy" /> transfer. Specifically, a member of this
/// enumeration is passed as the first argument to
/// CurlEasy.GetInfo specifying the item to retrieve in the
/// second argument, which is a reference to an <c>int</c>, a
/// <c>double</c>, a <c>string</c>, a <c>DateTime</c> or an <c>object</c>.
/// </summary>
public enum CurlInfo
{
/// <summary>
/// The second argument receives the elapsed time, as a <c>double</c>,
/// in seconds, from the start until the connect to the remote host
/// (or proxy) was completed.
/// </summary>
ConnectTime = 0x300005,
/// <summary>
/// The second argument receives, as a <c>double</c>, the content-length
/// of the download. This is the value read from the Content-Length: field.
/// </summary>
ContentLengthDownload = 0x30000F,
/// <summary>
/// The second argument receives, as a <c>double</c>, the specified size
/// of the upload.
/// </summary>
ContentLengthUpload = 0x300010,
/// <summary>
/// The second argument receives, as a <c>string</c>, the content-type of
/// the downloaded object. This is the value read from the Content-Type:
/// field. If you get <c>null</c>, it means that the server didn't
/// send a valid Content-Type header or that the protocol used
/// doesn't support this.
/// </summary>
ContentType = 0x100012,
/// <summary>
/// The second argument receives, as a <c>string</c>, the last
/// used effective URL.
/// </summary>
EffectiveUrl = 0x100001,
/// <summary>
/// The second argument receives, as a <c>long</c>, the remote time
/// of the retrieved document. You should construct a <c>DateTime</c>
/// from this value, as shown in the <c>InfoDemo</c> sample. If you
/// get a date in the distant
/// past, it can be because of many reasons (unknown, the server
/// hides it or the server doesn't support the command that tells
/// document time etc) and the time of the document is unknown. Note
/// that you must tell the server to collect this information before
/// the transfer is made, by using the
/// <see cref="CurlOption.Filetime" /> option to
/// <see cref="CurlEasy.SetOpt" />. (Added in 7.5)
/// </summary>
Filetime = 0x20000E,
/// <summary>
/// The second argument receives an <c>int</c> specifying the total size
/// of all the headers received.
/// </summary>
HeaderSize = 0x20000B,
/// <summary>
/// The second argument receives, as an <c>int</c>, a bitmask indicating
/// the authentication method(s) available. The meaning of the bits is
/// explained in the documentation of
/// <see cref="CurlOption.HttpAuth" />. (Added in 7.10.8)
/// </summary>
HttpAuthAvail = 0x200017,
/// <summary>
/// The second argument receives an <c>int</c> indicating the numeric
/// connect code for the HTTP request.
/// </summary>
HttpConnectCode = 0x200016,
/// <summary>
/// End-of-enumeration marker; do not use in client applications.
/// </summary>
LastOne = 0x1C,
/// <summary>
/// The second argument receives, as a <c>double</c>, the time, in
/// seconds it took from the start until the name resolving was
/// completed.
/// </summary>
NameLookupTime = 0x300004,
/// <summary>
/// Never used.
/// </summary>
None = 0x0,
/// <summary>
/// The second argument receives an <c>int</c> indicating the
/// number of current connections. (Added in 7.13.0)
/// </summary>
NumConnects = 0x20001A,
/// <summary>
/// The second argument receives an <c>int</c> indicating the operating
/// system error number: <c>_errro</c> or <c>GetLastError()</c>,
/// depending on the platform. (Added in 7.12.2)
/// </summary>
OsErrno = 0x200019,
/// <summary>
/// The second argument receives, as a <c>double</c>, the time, in
/// seconds, it took from the start until the file transfer is just about
/// to begin. This includes all pre-transfer commands and negotiations
/// that are specific to the particular protocol(s) involved.
/// </summary>
PreTransferTime = 0x300006,
/// <summary>
/// The second argument receives a reference to the private data
/// associated with the <see cref="CurlEasy" /> object (set with the
/// <see cref="CurlOption.Private" /> option to
/// <see cref="CurlEasy.SetOpt" />. (Added in 7.10.3)
/// </summary>
Private = 0x100015,
/// <summary>
/// The second argument receives, as an <c>int</c>, a bitmask
/// indicating the authentication method(s) available for your
/// proxy authentication. This will be a bitmask of
/// <see cref="CurlHttpAuth" /> enumeration constants.
/// (Added in 7.10.8)
/// </summary>
ProxyAuthAvail = 0x200018,
/// <summary>
/// The second argument receives an <c>int</c> indicating the total
/// number of redirections that were actually followed. (Added in 7.9.7)
/// </summary>
RedirectCount = 0x200014,
/// <summary>
/// The second argument receives, as a <c>double</c>, the total time, in
/// seconds, for all redirection steps include name lookup, connect,
/// pretransfer and transfer before final transaction was started.
/// <c>RedirectTime</c> contains the complete execution
/// time for multiple redirections. (Added in 7.9.7)
/// </summary>
RedirectTime = 0x300013,
/// <summary>
/// The second argument receives an <c>int</c> containing the total size
/// of the issued requests. This is so far only for HTTP requests. Note
/// that this may be more than one request if
/// <see cref="CurlOption.FollowLocation" /> is <c>true</c>.
/// </summary>
RequestSize = 0x20000C,
/// <summary>
/// The second argument receives an <c>int</c> with the last received HTTP
/// or FTP code. This option was known as <c>CURLINFO_HTTP_CODE</c> in
/// libcurl 7.10.7 and earlier.
/// </summary>
ResponseCode = 0x200002,
/// <summary>
/// The second argument receives a <c>double</c> with the total amount of
/// bytes that were downloaded. The amount is only for the latest transfer
/// and will be reset again for each new transfer.
/// </summary>
SizeDownload = 0x300008,
/// <summary>
/// The second argument receives a <c>double</c> with the total amount
/// of bytes that were uploaded.
/// </summary>
SizeUpload = 0x300007,
/// <summary>
/// The second argument receives a <c>double</c> with the average
/// download speed that cURL measured for the complete download.
/// </summary>
SpeedDownload = 0x300009,
/// <summary>
/// The second argument receives a <c>double</c> with the average
/// upload speed that libcurl measured for the complete upload.
/// </summary>
SpeedUpload = 0x30000A,
/// <summary>
/// The second argument receives an <see cref="CurlSlist" /> containing
/// the names of the available Ssl engines.
/// </summary>
SslEngines = 0x40001B,
/// <summary>
/// The second argument receives an <c>int</c> with the result of
/// the certificate verification that was requested (using the
/// <see cref="CurlOption.SslVerifyPeer" /> option in
/// <see cref="CurlEasy.SetOpt" />.
/// </summary>
SslVerifyResult = 0x20000D,
/// <summary>
/// The second argument receives a <c>double</c> specifying the time,
/// in seconds, from the start until the first byte is just about to be
/// transferred. This includes <c>PreTransferTime</c> and
/// also the time the server needs to calculate the result.
/// </summary>
StartTransferTime = 0x300011,
/// <summary>
/// The second argument receives a <c>double</c> indicating the total transaction
/// time in seconds for the previous transfer. This time does not include
/// the connect time, so if you want the complete operation time,
/// you should add the <c>ConnectTime</c>.
/// </summary>
TotalTime = 0x300003,
};
}

View File

@@ -1,50 +0,0 @@
namespace CurlSharp.Enums
{
/// <summary>
/// A member of this enumeration is passed as the first parameter to the
/// <see cref="CurlEasy.CurlDebugCallback" /> delegate to which libcurl passes
/// debug messages.
/// </summary>
public enum CurlInfoType
{
/// <summary>
/// The data is informational text.
/// </summary>
Text = 0,
/// <summary>
/// The data is header (or header-like) data received from the peer.
/// </summary>
HeaderIn = 1,
/// <summary>
/// The data is header (or header-like) data sent to the peer.
/// </summary>
HeaderOut = 2,
/// <summary>
/// The data is protocol data received from the peer.
/// </summary>
DataIn = 3,
/// <summary>
/// The data is protocol data sent to the peer.
/// </summary>
DataOut = 4,
/// <summary>
/// The data is Ssl-related data sent to the peer.
/// </summary>
SslDataIn = 5,
/// <summary>
/// The data is Ssl-related data received from the peer.
/// </summary>
SslDataOut = 6,
/// <summary>
/// End of enumeration marker, don't use in a client application.
/// </summary>
End = 7
};
}

View File

@@ -1,34 +0,0 @@
namespace CurlSharp.Enums
{
/// <summary>
/// Contains values used to initialize libcurl internally. One of
/// these is passed in the call to <see cref="Curl.GlobalInit" />.
/// </summary>
public enum CurlInitFlag
{
/// <summary>
/// Initialise nothing extra. This sets no bit.
/// </summary>
Nothing = 0,
/// <summary>
/// Initialize Ssl.
/// </summary>
Ssl = 1,
/// <summary>
/// Initialize the Win32 socket libraries.
/// </summary>
Win32 = 2,
/// <summary>
/// Initialize everything possible. This sets all known bits.
/// </summary>
All = 3,
/// <summary>
/// Equivalent to <c>All</c>.
/// </summary>
Default = All
};
}

View File

@@ -1,27 +0,0 @@
namespace CurlSharp.Enums
{
/// <summary>
/// Your handler for the <see cref="CurlEasy.CurlIoctlCallback" />
/// delegate is passed one of these values as its first parameter.
/// Right now, the only supported value is
/// <code>RestartRead</code>.
/// </summary>
public enum CurlIoCommand
{
/// <summary>
/// No IOCTL operation; we should never see this.
/// </summary>
Nop = 0,
/// <summary>
/// When this is sent, your callback may need to, for example,
/// rewind a local file that is being sent via FTP.
/// </summary>
RestartRead = 1,
/// <summary>
/// End of enumeration marker, don't use in a client application.
/// </summary>
Last = 2
}
}

View File

@@ -1,30 +0,0 @@
namespace CurlSharp.Enums
{
/// <summary>
/// Your handler for the <see cref="CurlEasy.CurlIoctlCallback" /> delegate
/// should return a member of this enumeration.
/// </summary>
public enum CurlIoError
{
/// <summary>
/// Indicate that the callback processed everything okay.
/// </summary>
Ok = 0,
/// <summary>
/// Unknown command sent to callback. Right now, only
/// <code>RestartRead</code> is supported.
/// </summary>
UnknownCommand = 1,
/// <summary>
/// Indicate to libcurl that a restart failed.
/// </summary>
FailRestart = 2,
/// <summary>
/// End of enumeration marker, don't use in a client application.
/// </summary>
Last = 3
}
}

View File

@@ -1,26 +0,0 @@
namespace CurlSharp.Enums
{
/// <summary>
/// This enumeration contains values used to specify the IP resolution
/// method when using the <see cref="CurlOption.IpResolve" />
/// option in a call to <see cref="CurlEasy.SetOpt" />
/// </summary>
public enum CurlIpResolve
{
/// <summary>
/// Default, resolves addresses to all IP versions that your system
/// allows.
/// </summary>
Whatever = 0,
/// <summary>
/// Resolve to ipv4 addresses.
/// </summary>
V4 = 1,
/// <summary>
/// Resolve to ipv6 addresses.
/// </summary>
V6 = 2
};
}

View File

@@ -1,31 +0,0 @@
namespace CurlSharp.Enums
{
/// <summary>
/// Values containing the type of shared access requested when libcurl
/// calls the <see cref="CurlShare.CurlShareLockCallback" /> delegate.
/// </summary>
public enum CurlLockAccess
{
/// <summary>
/// Unspecified action; the delegate should never receive this.
/// </summary>
None = 0,
/// <summary>
/// The delegate receives this call when libcurl is requesting
/// read access to the shared resource.
/// </summary>
Shared = 1,
/// <summary>
/// The delegate receives this call when libcurl is requesting
/// write access to the shared resource.
/// </summary>
Single = 2,
/// <summary>
/// End-of-enumeration marker; do not use in application code.
/// </summary>
Last = 3
};
}

View File

@@ -1,48 +0,0 @@
namespace CurlSharp.Enums
{
/// <summary>
/// Members of this enumeration should be passed to
/// <see cref="CurlShare.SetOpt" /> when it is called with the
/// <c>CurlShare</c> or <c>Unshare</c> options
/// provided in the <see cref="CurlShareOption" /> enumeration.
/// </summary>
public enum CurlLockData
{
/// <summary>
/// Not used.
/// </summary>
None = 0,
/// <summary>
/// Used internally by libcurl.
/// </summary>
Share = 1,
/// <summary>
/// Cookie data will be shared across the <see cref="CurlEasy" /> objects
/// using this shared object.
/// </summary>
Cookie = 2,
/// <summary>
/// Cached Dns hosts will be shared across the <see cref="CurlEasy" />
/// objects using this shared object.
/// </summary>
Dns = 3,
/// <summary>
/// Not supported yet.
/// </summary>
SslSession = 4,
/// <summary>
/// Not supported yet.
/// </summary>
Connect = 5,
/// <summary>
/// End-of-enumeration marker; do not use in application code.
/// </summary>
Last = 6
};
}

View File

@@ -1,25 +0,0 @@
namespace CurlSharp.Enums
{
/// <summary>
/// The status code associated with an <see cref="CurlEasy" /> object in a
/// <see cref="CurlMulti" /> operation. One of these is returned in response
/// to reading the <see cref="CurlMultiInfo.Msg" /> property.
/// </summary>
public enum CurlMessage
{
/// <summary>
/// First entry in the enumeration, not used.
/// </summary>
None = 0,
/// <summary>
/// The associated <see cref="CurlEasy" /> object completed.
/// </summary>
Done = 1,
/// <summary>
/// End-of-enumeration marker, not used.
/// </summary>
Last = 2
};
}

View File

@@ -1,46 +0,0 @@
namespace CurlSharp.Enums
{
/// <summary>
/// Contains return codes for many of the functions in the
/// <see cref="CurlMulti" /> class.
/// </summary>
public enum CurlMultiCode
{
/// <summary>
/// You should call <see cref="CurlMulti.Perform" /> again before calling
/// <see cref="CurlMulti.Select" />.
/// </summary>
CallMultiPerform = -1,
/// <summary>
/// The function succeded.
/// </summary>
Ok = 0,
/// <summary>
/// The internal <see cref="CurlMulti" /> is bad.
/// </summary>
BadHandle = 1,
/// <summary>
/// One of the <see cref="CurlEasy" /> handles associated with the
/// <see cref="CurlMulti" /> object is bad.
/// </summary>
BadEasyHandle = 2,
/// <summary>
/// Out of memory. This is a severe problem.
/// </summary>
OutOfMemory = 3,
/// <summary>
/// Internal error deep within the libcurl library.
/// </summary>
InternalError = 4,
/// <summary>
/// End-of-enumeration marker, not used.
/// </summary>
Last = 5
};
}

View File

@@ -1,46 +0,0 @@
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
//
// Copyright (c) 2017, Dr. Masroor Ehsan. All rights reserved.
//
// $Id:$
//
// Last modified: 25.01.2017 1:29 AM
//
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
namespace CurlSharp.Enums
{
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

@@ -1,43 +0,0 @@
namespace CurlSharp.Enums
{
/// <summary>
/// Contains values used to specify the preference of libcurl between
/// using user names and passwords from your ~/.netrc file, relative to
/// user names and passwords in the URL supplied with
/// <see cref="CurlOption.Url" />. This is passed when using
/// the <see cref="CurlOption.Netrc" /> option in a call
/// to <see cref="CurlEasy.SetOpt" />
/// </summary>
public enum CurlNetrcOption
{
/// <summary>
/// The library will ignore the file and use only the information
/// in the URL. This is the default.
/// </summary>
Ignored = 0,
/// <summary>
/// The use of your ~/.netrc file is optional, and information in the
/// URL is to be preferred. The file will be scanned with the host
/// and user name (to find the password only) or with the host only,
/// to find the first user name and password after that machine,
/// which ever information is not specified in the URL.
/// <para>
/// Undefined values of the option will have this effect.
/// </para>
/// </summary>
Optional = 1,
/// <summary>
/// This value tells the library that use of the file is required,
/// to ignore the information in the URL, and to search the file
/// with the host only.
/// </summary>
Required = 2,
/// <summary>
/// Last entry in enumeration; do not use in application code.
/// </summary>
Last = 3
};
}

View File

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

File diff suppressed because it is too large Load Diff

View File

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

View File

@@ -1,27 +0,0 @@
namespace CurlSharp.Enums
{
/// <summary>
/// This enumeration contains values used to specify the proxy type when
/// using the <see cref="CurlOption.Proxy" /> option when calling
/// <see cref="CurlEasy.SetOpt" />
/// </summary>
public enum CurlProxyType
{
/// <summary>
/// Ordinary HTTP proxy.
/// </summary>
Http = 0,
/// <summary>
/// Use if the proxy supports SOCKS4 user authentication. If you're
/// unfamiliar with this, consult your network administrator.
/// </summary>
Socks4 = 4,
/// <summary>
/// Use if the proxy supports SOCKS5 user authentication. If you're
/// unfamiliar with this, consult your network administrator.
/// </summary>
Socks5 = 5
};
}

View File

@@ -1,40 +0,0 @@
namespace CurlSharp.Enums
{
/// <summary>
/// Contains return codes from many of the functions in the
/// <see cref="CurlShare" /> class.
/// </summary>
public enum CurlShareCode
{
/// <summary>
/// The function succeeded.
/// </summary>
Ok = 0,
/// <summary>
/// A bad option was passed to <see cref="CurlShare.SetOpt" />.
/// </summary>
BadOption = 1,
/// <summary>
/// An attempt was made to pass an option to
/// <see cref="CurlShare.SetOpt" /> while the CurlShare object is in use.
/// </summary>
InUse = 2,
/// <summary>
/// The <see cref="CurlShare" /> object's internal handle is invalid.
/// </summary>
Invalid = 3,
/// <summary>
/// Out of memory. This is a severe problem.
/// </summary>
NoMem = 4,
/// <summary>
/// End-of-enumeration marker; do not use in application code.
/// </summary>
Last = 5
};
}

View File

@@ -1,53 +0,0 @@
namespace CurlSharp.Enums
{
/// <summary>
/// A member of this enumeration is passed to the function
/// <see cref="CurlShare.SetOpt" /> to configure a <see cref="CurlShare" />
/// transfer.
/// </summary>
public enum CurlShareOption
{
/// <summary>
/// Start-of-enumeration; do not use in application code.
/// </summary>
None = 0,
/// <summary>
/// The parameter, which should be a member of the
/// <see cref="CurlLockData" /> enumeration, specifies a type of
/// data that should be shared.
/// </summary>
Share = 1,
/// <summary>
/// The parameter, which should be a member of the
/// <see cref="CurlLockData" /> enumeration, specifies a type of
/// data that should be unshared.
/// </summary>
Unshare = 2,
/// <summary>
/// The parameter should be a reference to a
/// <see cref="CurlShare.CurlShareLockCallback" /> delegate.
/// </summary>
LockFunction = 3,
/// <summary>
/// The parameter should be a reference to a
/// <see cref="CurlShare.CurlShareUnlockCallback" /> delegate.
/// </summary>
UnlockFunction = 4,
/// <summary>
/// The parameter allows you to specify an object reference that
/// will passed to the <see cref="CurlShare.CurlShareLockCallback" /> delegate and
/// the <see cref="CurlShare.CurlShareUnlockCallback" /> delegate.
/// </summary>
UserData = 5,
/// <summary>
/// End-of-enumeration; do not use in application code.
/// </summary>
Last = 6
};
}

View File

@@ -1,36 +0,0 @@
namespace CurlSharp.Enums
{
/// <summary>
/// Contains values used to specify the Ssl version level when using
/// the <see cref="CurlOption.SslVersion" /> option in a call
/// to <see cref="CurlEasy.SetOpt" />
/// </summary>
public enum CurlSslVersion
{
/// <summary>
/// Use whatever version the Ssl library selects.
/// </summary>
Default = 0,
/// <summary>
/// Use TLS version 1.
/// </summary>
Tlsv1 = 1,
/// <summary>
/// Use Ssl version 2. This is not a good option unless it's the
/// only version supported by the remote server.
/// </summary>
Sslv2 = 2,
/// <summary>
/// Use Ssl version 3. This is a preferred option.
/// </summary>
Sslv3 = 3,
/// <summary>
/// Last entry in enumeration; do not use in application code.
/// </summary>
Last = 4
};
}

View File

@@ -1,39 +0,0 @@
namespace CurlSharp.Enums
{
/// <summary>
/// Contains values used to specify the time condition when using
/// the <see cref="CurlOption.TimeCondition" /> option in a call
/// to <see cref="CurlEasy.SetOpt" />
/// </summary>
public enum CurlTimeCond
{
/// <summary>
/// Use no time condition.
/// </summary>
None = 0,
/// <summary>
/// The time condition is true if the resource has been modified
/// since the date/time passed in
/// <see cref="CurlOption.TimeValue" />.
/// </summary>
IfModSince = 1,
/// <summary>
/// True if the resource has not been modified since the date/time
/// passed in <see cref="CurlOption.TimeValue" />.
/// </summary>
IfUnmodSince = 2,
/// <summary>
/// True if the resource's last modification date/time equals that
/// passed in <see cref="CurlOption.TimeValue" />.
/// </summary>
LastMod = 3,
/// <summary>
/// Last entry in enumeration; do not use in application code.
/// </summary>
Last = 4
};
}

View File

@@ -1,34 +0,0 @@
namespace CurlSharp.Enums
{
/// <summary>
/// A member of this enumeration is passed to the function
/// <see cref="Curl.GetVersionInfo" />
/// </summary>
public enum CurlVersion
{
/// <summary>
/// Capabilities associated with the initial version of libcurl.
/// </summary>
First = 0,
/// <summary>
/// Capabilities associated with the second version of libcurl.
/// </summary>
Second = 1,
/// <summary>
/// Capabilities associated with the third version of libcurl.
/// </summary>
Third = 2,
/// <summary>
/// Same as <c>Third</c>.
/// </summary>
Now = Third,
/// <summary>
/// End-of-enumeration marker; do not use in application code.
/// </summary>
Last = 3
};
}

View File

@@ -1,71 +0,0 @@
namespace CurlSharp.Enums
{
/// <summary>
/// A bitmask of libcurl features OR'd together as the value of the
/// property <see cref="CurlVersionInfoData.Features" />. The feature
/// bits are summarized in the table below.
/// </summary>
public enum CurlVersionFeatureBitmask
{
/// <summary>
/// Supports Ipv6.
/// </summary>
Ipv6 = 0x01,
/// <summary>
/// Supports kerberos4 (when using FTP).
/// </summary>
Kerberos64 = 0x02,
/// <summary>
/// Supports Ssl (HTTPS/FTPS).
/// </summary>
Ssl = 0x04,
/// <summary>
/// Supports HTTP deflate using libz.
/// </summary>
LibZ = 0x08,
/// <summary>
/// Supports HTTP Ntlm (added in 7.10.6).
/// </summary>
Ntlm = 0x10,
/// <summary>
/// Supports HTTP GSS-Negotiate (added in 7.10.6).
/// </summary>
GssNegotiate = 0x20,
/// <summary>
/// libcurl was built with extra debug capabilities built-in. This
/// is mainly of interest for libcurl hackers. (added in 7.10.6)
/// </summary>
Debug = 0x40,
/// <summary>
/// libcurl was built with support for asynchronous name lookups,
/// which allows more exact timeouts (even on Windows) and less
/// blocking when using the multi interface. (added in 7.10.7)
/// </summary>
AsynchDns = 0x80,
/// <summary>
/// libcurl was built with support for Spnego authentication
/// (Simple and Protected GSS-API Negotiation Mechanism, defined
/// in RFC 2478.) (added in 7.10.8)
/// </summary>
Spnego = 0x100,
/// <summary>
/// libcurl was built with support for large files.
/// </summary>
LargeFile = 0x200,
/// <summary>
/// libcurl was built with support for IDNA, domain names with
/// international letters.
/// </summary>
Idn = 0x400
};
}

View File

@@ -1,29 +0,0 @@
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

@@ -1,619 +0,0 @@
/***************************************************************************
*
* CurlS#arp
*
* 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.
*
* You may opt to use, copy, modify, merge, publish, distribute and/or sell
* copies of this Software, and permit persons to whom the Software is
* furnished to do so, under the terms of the LICENSE file.
*
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
* ANY KIND, either express or implied.
*
**************************************************************************/
//#define USE_LIBCURLSHIM
using System;
using System.IO;
using System.Reflection;
using System.Runtime.InteropServices;
using CurlSharp.Enums;
namespace CurlSharp
{
/// <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";
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
}
[DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool SetDllDirectory(string lpPathName);
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);
}
}
#region curl_global_init
[DllImport(LIBCURL, CallingConvention = CallingConvention.Cdecl)]
public static extern CurlCode curl_global_init(int flags);
#endregion
#region curl_global_cleanup
[DllImport(LIBCURL, CallingConvention = CallingConvention.Cdecl)]
public static extern void curl_global_cleanup();
#endregion
#region curl_easy_escape
[DllImport(LIBCURL, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
public static extern IntPtr curl_easy_escape(IntPtr pEasy, string url, int length);
#endregion
#region curl_easy_unescape
[DllImport(LIBCURL, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
public static extern IntPtr curl_easy_unescape(IntPtr pEasy, string url, int inLength, out int outLength);
#endregion
#region curl_free
[DllImport(LIBCURL, CallingConvention = CallingConvention.Cdecl)]
public static extern void curl_free(IntPtr p);
#endregion
#region curl_version
[DllImport(LIBCURL, CallingConvention = CallingConvention.Cdecl)]
public static extern IntPtr curl_version();
#endregion
#region curl_version_info
[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(LIBCURLSHIM, CallingConvention = CallingConvention.Cdecl)]
public static extern void curl_shim_cleanup_delegates(IntPtr pThis);
[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(LIBCURLSHIM, CallingConvention = CallingConvention.Cdecl)]
public static extern void curl_shim_free_slist(IntPtr p);
[DllImport(LIBCURLSHIM, CallingConvention = CallingConvention.Cdecl)]
public static extern IntPtr curl_shim_alloc_fd_sets();
[DllImport(LIBCURLSHIM, CallingConvention = CallingConvention.Cdecl)]
public static extern void curl_shim_free_fd_sets(IntPtr fdsets);
[DllImport(LIBCURLSHIM, CallingConvention = CallingConvention.Cdecl)]
public static extern CurlMultiCode curl_shim_multi_fdset(IntPtr multi, IntPtr fdsets, ref int maxFD);
[DllImport(LIBCURLSHIM, CallingConvention = CallingConvention.Cdecl)]
public static extern int curl_shim_select(int maxFD, IntPtr fdsets, int milliseconds);
[DllImport(LIBCURLSHIM, CallingConvention = CallingConvention.Cdecl)]
public static extern IntPtr curl_shim_multi_info_read(IntPtr multi, ref int nMsgs);
[DllImport(LIBCURLSHIM, CallingConvention = CallingConvention.Cdecl)]
public static extern void curl_shim_multi_info_free(IntPtr multiInfo);
[DllImport(LIBCURLSHIM, CallingConvention = CallingConvention.Cdecl)]
public static extern int curl_shim_formadd(IntPtr[] ppForms, IntPtr[] pParams, int nParams);
[DllImport(LIBCURLSHIM, CallingConvention = CallingConvention.Cdecl)]
public static extern int curl_shim_install_share_delegates(
IntPtr pShare,
IntPtr pThis,
_ShimLockCallback pLock,
_ShimUnlockCallback pUnlock);
[DllImport(LIBCURLSHIM, CallingConvention = CallingConvention.Cdecl)]
public static extern void curl_shim_cleanup_share_delegates(IntPtr pShare);
[DllImport(LIBCURLSHIM, CallingConvention = CallingConvention.Cdecl)]
public static extern int curl_shim_get_version_int_value(IntPtr p, int offset);
[DllImport(LIBCURLSHIM, CallingConvention = CallingConvention.Cdecl)]
public static extern IntPtr curl_shim_get_version_char_ptr(IntPtr p, int offset);
[DllImport(LIBCURLSHIM, CallingConvention = CallingConvention.Cdecl)]
public static extern int curl_shim_get_number_of_protocols(IntPtr p, int offset);
[DllImport(LIBCURLSHIM, CallingConvention = CallingConvention.Cdecl)]
public static extern IntPtr curl_shim_get_protocol_string(IntPtr p, int offset, int index);
public delegate void _ShimLockCallback(int data, int access, IntPtr userPtr);
public delegate void _ShimUnlockCallback(int data, IntPtr userPtr);
public delegate int _ShimDebugCallback(CurlInfoType infoType, IntPtr msgBuf, int msgBufSize, IntPtr parm);
public delegate int _ShimHeaderCallback(IntPtr buf, int sz, int nmemb, IntPtr stream);
public delegate CurlIoError _ShimIoctlCallback(CurlIoCommand cmd, IntPtr parm);
public delegate int _ShimProgressCallback(
IntPtr parm,
double dlTotal,
double dlNow,
double ulTotal,
double ulNow);
public delegate int _ShimReadCallback(IntPtr buf, int sz, int nmemb, IntPtr parm);
public delegate int _ShimSslCtxCallback(IntPtr ctx, IntPtr parm);
public delegate int _ShimWriteCallback(IntPtr buf, int sz, int nmemb, IntPtr parm);
#endregion
#endif
}
}

View File

@@ -1,114 +0,0 @@
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

@@ -1,7 +0,0 @@
namespace CurlSharp
{
public class SSLFix
{
public const string CipherList = "rsa_aes_128_sha,ecdhe_rsa_aes_256_sha,ecdhe_ecdsa_aes_128_sha";
}
}

View File

@@ -87,6 +87,7 @@ function loadJackettSettings() {
$("#jackett-prerelease").attr('checked', data.prerelease);
$("#jackett-logging").attr('checked', data.logging);
$("#jackett-omdbkey").val(data.omdbkey);
$("#jackett-omdburl").val(data.omdburl);
var password = data.password;
$("#jackett-adminpwd").val(password);
if (password != null && password != '') {
@@ -730,16 +731,16 @@ function updateReleasesRow(row)
labels.empty();
if (IMDBId) {
labels.append('\n<a href="http://www.imdb.com/title/tt' + IMDBId + '/" class="label label-imdb" alt="IMDB" title="IMDB">IMDB</a>');
labels.append('\n<a href="http://www.imdb.com/title/tt' + ("000000" + IMDBId).slice(-7) + '/" class="label label-imdb" alt="IMDB" title="IMDB">IMDB</a>');
}
if (!isNaN(DownloadVolumeFactor)) {
if (DownloadVolumeFactor == 0) {
labels.append('\n<span class="label label-success">FREELEECH</span>');
} else if (DownloadVolumeFactor < 1) {
labels.append('\n<span class="label label-primary">' + DownloadVolumeFactor * 100 + '%DL</span>');
labels.append('\n<span class="label label-primary">' + (DownloadVolumeFactor * 100).toFixed(0) + '%DL</span>');
} else if (DownloadVolumeFactor > 1) {
labels.append('\n<span class="label label-danger">' + DownloadVolumeFactor * 100 + '%DL</span>');
labels.append('\n<span class="label label-danger">' + (DownloadVolumeFactor * 100).toFixed(0) + '%DL</span>');
}
}
@@ -747,7 +748,7 @@ function updateReleasesRow(row)
if (UploadVolumeFactor == 0) {
labels.append('\n<span class="label label-warning">NO UPLOAD</span>');
} else if (UploadVolumeFactor != 1) {
labels.append('\n<span class="label label-info">' + UploadVolumeFactor * 100 + '%UL</span>');
labels.append('\n<span class="label label-info">' + (UploadVolumeFactor * 100).toFixed(0) + '%UL</span>');
}
}
}
@@ -1150,6 +1151,7 @@ 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_omdb_url = $("#jackett-omdburl").val();
var jackett_proxy_url = $("#jackett-proxy-url").val();
var jackett_proxy_type = $("#jackett-proxy-type").val();
@@ -1166,6 +1168,7 @@ function bindUIButtons() {
logging: jackett_logging,
basepathoverride: jackett_basepathoverride,
omdbkey: jackett_omdb_key,
omdburl: jackett_omdb_url,
proxy_type: jackett_proxy_type,
proxy_url: jackett_proxy_url,
proxy_port: jackett_proxy_port,

View File

@@ -98,7 +98,7 @@
<button id="change-jackett-port" class="btn btn-primary btn-sm">
<i class="fa fa-wrench"></i> Apply server settings <span class="glyphicon glyphicon-ok-wrench" aria-hidden="true"></span>
</button>
<button id="view-jackett-logs" class="btn btn-danger btn-sm">
<button id="view-jackett-logs" class="btn btn-success btn-sm">
<i class="fa fa-rss"></i> View logs <span class="glyphicon glyphicon-ok-wrench" aria-hidden="true"></span>
</button>
<button id="trigger-updater" class="btn btn-warning btn-sm">
@@ -152,7 +152,7 @@
</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="">
<input id="jackett-proxy-password" class="form-control input-right" type="password" value="" placeholder="">
</div>
<div class="input-area">
@@ -177,6 +177,10 @@
<span class="input-header">OMDB API key: </span>
<input id="jackett-omdbkey" class="form-control input-right" type="text" value="" placeholder="">
</div>
<div class="input-area">
<span class="input-header">OMDB API Url: </span>
<input id="jackett-omdburl" class="form-control input-right" type="text" value="" placeholder="Blank for default">
</div>
<hr />
<div id="footer">
<a href="https://github.com/Jackett/Jackett" target="_blank" title="Jackett on GitHub">Jackett</a> Version <span id="app-version"></span>
@@ -659,6 +663,6 @@
</script>
<script type="text/javascript" src="../libs/api.js?changed=2017083001"></script>
<script type="text/javascript" src="../custom.js?changed=2017110603"></script>
<script type="text/javascript" src="../custom.js?changed=20180711"></script>
</body>
</html>

View File

@@ -1,282 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using CurlSharp;
using CurlSharp.Enums;
using Jackett.Common.Models.Config;
using Jackett.Common.Utils;
namespace Jackett.Common
{
public class CurlHelper
{
private static readonly object instance = new object();
public class CurlRequest
{
public string Url { get; private set; }
public string Cookies { get; private set; }
public string Referer { get; private set; }
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 CurlRequest(HttpMethod method, string url, string cookies = null, string referer = null, Dictionary<string, string> headers = null, string rawPOSTData = null)
{
Method = method;
Url = url.Replace(" ", "+"); // avoids bad request to cloudflare for urls containing a space followed by H (" H")
Cookies = cookies;
Referer = referer;
Headers = headers;
RawPOSTDdata = rawPOSTData;
}
}
public class CurlResponse
{
public List<string[]> HeaderList { get; private set; }
public byte[] Content { get; private set; }
public HttpStatusCode Status { get; private set; }
public string Cookies { set; get; }
public CurlResponse(List<string[]> headers, byte[] content, HttpStatusCode s, string cookies)
{
HeaderList = headers;
Content = content;
Status = s;
Cookies = cookies;
}
}
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, config);
return result;
}
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, config);
return result;
}
public static async Task<CurlResponse> PerformCurlAsync(CurlRequest curlRequest, ServerConfig config)
{
return await Task.Run(() => PerformCurl(curlRequest, config));
}
public delegate void ErrorMessage(string s);
public static ErrorMessage OnErrorMessage;
public static CurlResponse PerformCurl(CurlRequest curlRequest, ServerConfig config)
{
lock (instance)
{
var headerBuffers = new List<byte[]>();
var contentBuffers = new List<byte[]>();
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)
{
CurlSlist curlHeaders = new CurlSlist();
foreach (var header in curlRequest.Headers)
{
curlHeaders.Append(header.Key + ": " + header.Value);
}
easy.SetOpt(CurlOption.HttpHeader, curlHeaders);
}
easy.WriteFunction = (byte[] buf, int size, int nmemb, object data) =>
{
contentBuffers.Add(buf);
return size * nmemb;
};
easy.HeaderFunction = (byte[] buf, int size, int nmemb, object extraData) =>
{
headerBuffers.Add(buf);
return size * nmemb;
};
if (!string.IsNullOrEmpty(curlRequest.Cookies))
easy.Cookie = curlRequest.Cookies;
if (!string.IsNullOrEmpty(curlRequest.Referer))
easy.Referer = curlRequest.Referer;
if (curlRequest.Method == HttpMethod.Post)
{
if (!string.IsNullOrEmpty(curlRequest.RawPOSTDdata))
{
easy.Post = true;
easy.PostFields = curlRequest.RawPOSTDdata;
easy.PostFieldSize = Encoding.UTF8.GetByteCount(curlRequest.RawPOSTDdata);
}
else
{
easy.Post = true;
var postString = StringUtil.PostDataFromDict(curlRequest.PostData);
easy.PostFields = postString;
easy.PostFieldSize = Encoding.UTF8.GetByteCount(postString);
}
}
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
easy.SslCipherList = SSLFix.CipherList;
easy.FreshConnect = true;
easy.ForbidReuse = true;
}
if (config.RuntimeSettings.IgnoreSslErrors == true)
{
easy.SetOpt(CurlOption.SslVerifyhost, false);
easy.SetOpt(CurlOption.SslVerifyPeer, false);
}
var proxy = config.GetProxyUrl();
if (proxy != null)
{
easy.SetOpt(CurlOption.HttpProxyTunnel, 1);
easy.SetOpt(CurlOption.Proxy, proxy);
var authString = config.GetProxyAuthString();
if (authString != null)
{
easy.SetOpt(CurlOption.ProxyUserPwd, authString);
}
}
easy.Perform();
if (easy.LastErrorCode != CurlCode.Ok)
{
var message = "Error " + easy.LastErrorCode.ToString() + " " + easy.LastErrorDescription + " " + easy.ErrorBuffer;
if (null != OnErrorMessage)
OnErrorMessage(message);
else
Console.WriteLine(message);
}
}
var headerBytes = Combine(headerBuffers.ToArray());
var headerString = Encoding.UTF8.GetString(headerBytes);
if (config.GetProxyUrl() != null)
{
var firstcrlf = headerString.IndexOf("\r\n\r\n");
var secondcrlf = headerString.IndexOf("\r\n\r\n", firstcrlf + 1);
if (secondcrlf > 0)
{
headerString = headerString.Substring(firstcrlf + 4, secondcrlf - (firstcrlf));
}
}
var headerParts = headerString.Split(new char[] { '\n', '\r' }, StringSplitOptions.RemoveEmptyEntries);
var headers = new List<string[]>();
var headerCount = 0;
HttpStatusCode status = HttpStatusCode.NotImplemented;
var cookieBuilder = new StringBuilder();
var cookies = new List<Tuple<string, string>>();
foreach (var headerPart in headerParts)
{
if (headerCount == 0)
{
var split = headerPart.Split(' ');
if (split.Length < 2)
throw new Exception("HTTP Header missing");
var responseCode = int.Parse(headerPart.Split(' ')[1]);
status = (HttpStatusCode)responseCode;
}
else
{
var keyVal = headerPart.Split(new char[] { ':' }, 2);
if (keyVal.Length > 1)
{
var key = keyVal[0].ToLower().Trim();
var value = keyVal[1].Trim();
if (key == "set-cookie")
{
var nameSplit = value.IndexOf('=');
if (nameSplit > -1)
{
var cKey = value.Substring(0, nameSplit);
var cVal = value.Split(';')[0] + ";";
cookies.Add(new Tuple<string, string>(cKey, cVal));
}
}
else
{
headers.Add(new[] { key, value });
}
}
}
headerCount++;
}
foreach (var cookieGroup in cookies.GroupBy(c => c.Item1))
{
cookieBuilder.AppendFormat("{0} ", cookieGroup.Last().Item2);
}
// add some debug output to track down the problem causing people getting InternalServerError results
if (status == HttpStatusCode.NotImplemented || status == HttpStatusCode.InternalServerError)
{
try
{
OnErrorMessage("got NotImplemented/InternalServerError");
OnErrorMessage("request.Method: " + curlRequest.Method);
OnErrorMessage("request.Url: " + curlRequest.Url);
OnErrorMessage("request.Cookies: " + curlRequest.Cookies);
OnErrorMessage("request.Referer: " + curlRequest.Referer);
OnErrorMessage("request.RawPOSTDdata: " + curlRequest.RawPOSTDdata);
OnErrorMessage("cookies: " + cookieBuilder.ToString().Trim());
OnErrorMessage("headerString:\n" + headerString);
foreach (var headerPart in headerParts)
{
OnErrorMessage("headerParts: " + headerPart);
}
}
catch (Exception ex)
{
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;
}
}
public static byte[] Combine(params byte[][] arrays)
{
byte[] ret = new byte[arrays.Sum(x => x.Length)];
int offset = 0;
foreach (byte[] data in arrays)
{
Buffer.BlockCopy(data, 0, ret, offset, data.Length);
offset += data.Length;
}
return ret;
}
}
}

View File

@@ -1,7 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<dllmap dll="libcurl.dll" target="libcurl.so.4" />
<dllmap os="osx" dll="libcurl.dll" target="libcurl.4.dylib"/>
<!--<dllmap os="freebsd" dll="libcurl.dll" target="libcurl.so.4" />-->
<!--<dllmap os="solaris" dll="libcurl.dll" target="libcurl.so.4" />-->
</configuration>

View File

@@ -56,6 +56,9 @@
args: id
title:
selector: td:nth-child(3) > a.torrent > span.span-1440
filters:
- name: re_replace # remove anidb id from return string
args: ["(\\[[A-Z0-9]*\\])\\.", "."]
details:
selector: td:nth-child(3) > a.torrent
attribute: href

View File

@@ -6,6 +6,8 @@
type: private
encoding: UTF-8
links:
- https://www.arabafenice.me/
legacylinks:
- http://www.arabafenice.me/
caps:

View File

@@ -40,6 +40,18 @@
search: [q]
tv-search: [q, season, ep]
movie-search: [q]
settings:
- name: username
type: text
label: Username
- name: password
type: password
label: Password
- name: info
type: info
label: Results Per Page
default: For best results, change the 'Torrentliste' setting to "Platzsparendes Layout mit PopUp für zusätzliche Informationen" in your profile.
login:
path: takelogin.php
@@ -63,9 +75,13 @@
rows:
selector: table.tableinborder > tbody > tr:has(a[href^="details.php"])
fields:
fields: # note: two alternative layouts available
title:
selector: a[href^="details.php"]
title:
optional: true
selector: a[href^="details.php"][title]
attribute: title
category:
selector: a[href^="browse.php?cat="]
attribute: href
@@ -76,32 +92,34 @@
selector: a[href^="details.php"]
attribute: href
download:
selector: a[href^=" /gettorrent/ssl/"]
selector: a[href^=" /gettorrent/"]
attribute: href
files:
selector: td:nth-child(2) > table > tbody > tr:nth-child(2) > td:nth-child(1) > b:nth-child(2)
selector: td:nth-child(2) > table > tbody > tr:nth-child(2) > td:nth-child(1) > b:nth-child(2), a[href*="&filelist=1"]
grabs:
selector: td:nth-child(2) > table > tbody > tr:nth-child(2) > td:nth-child(3) > b:nth-child(1)
selector: td:nth-child(2) > table > tbody > tr:nth-child(2) > td:nth-child(3) > b:nth-child(1), a[href*="&tosnatchers=1"]
size:
selector: td:nth-child(2) > table > tbody > tr:nth-child(2) > td:nth-child(1) > b:nth-child(1)
selector: td:nth-child(2) > table > tbody > tr:nth-child(2) > td:nth-child(1) > b:nth-child(1), td:nth-child(7):has(br)
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)
selector: td:nth-child(2) > table > tbody > tr:nth-child(2) > td:nth-child(2) > b:nth-child(1), a[href*="&toseeders=1"]
leechers:
selector: td:nth-child(2) > table > tbody > tr:nth-child(2) > td:nth-child(2) > b:nth-child(3)
selector: td:nth-child(2) > table > tbody > tr:nth-child(2) > td:nth-child(2) > b:nth-child(3), a[href*="&todlers=1"]
date:
selector: td:nth-child(2) > table > tbody > tr:nth-child(2) > td:nth-child(5)
selector: td:nth-child(2) > table > tbody > tr:nth-child(2) > td:nth-child(5), td:nth-child(5):has(br)
filters:
- name: replace
args: [" ", ""]
- name: append
args: " +2:00"
- name: replace
args: ["\xA0", " "]
args: ["\xA0", ""]
- name: dateparse
args: "02.01.2006 15:04:05 -07:00"
args: "02.01.200615:04:05 -07:00"
downloadvolumefactor:
case:
img[src="/pic/free.gif"]: "0"

View File

@@ -0,0 +1,106 @@
---
site: audiobookbay
name: AudioBookBay
description: "AudioBook Bay (ABB) is a semi-private Torrent Tracker for AUDIOBOOKS"
language: en-us
type: semi-private
encoding: UTF-8
links:
- http://audiobookbay.nl/
- https://audiobookbay.la/
caps:
categorymappings:
- {id: Children, cat: Audio/Audiobook, desc: "Children"}
- {id: Teen & Young Adult, cat: Audio/Audiobook, desc: "Teen & Young Adult"}
- {id: Adults, cat: Audio/Audiobook, desc: "Adults"}
- {id: The Undead, cat: Audio/Audiobook, desc: "The Undead"}
- {id: Action, cat: Audio/Audiobook, desc: "Action"}
- {id: Adventure, cat: Audio/Audiobook, desc: "Adventure"}
- {id: Art, cat: Audio/Audiobook, desc: "Art"}
- {id: Autobiography & Biographies, cat: Audio/Audiobook, desc: "Autobiography & Biographies"}
- {id: Business, cat: Audio/Audiobook, desc: "Business"}
- {id: Computer, cat: Audio/Audiobook, desc: "Computer"}
- {id: Contemporary, cat: Audio/Audiobook, desc: "Contemporary"}
- {id: Crime, cat: Audio/Audiobook, desc: "Crime"}
- {id: Detective, cat: Audio/Audiobook, desc: "Detective"}
- {id: Doctor Who, cat: Audio/Audiobook, desc: "Doctor Who"}
- {id: Education, cat: Audio/Audiobook, desc: "Education"}
- {id: Fantasy, cat: Audio/Audiobook, desc: "Fantasy"}
- {id: General Fiction, cat: Audio/Audiobook, desc: "General Fiction"}
- {id: Historical Fiction, cat: Audio/Audiobook, desc: "Historical Fiction"}
- {id: History, cat: Audio/Audiobook, desc: "History"}
- {id: Horror, cat: Audio/Audiobook, desc: "Horror"}
- {id: Humor, cat: Audio/Audiobook, desc: "Humor"}
- {id: Lecture, cat: Audio/Audiobook, desc: "Lecture"}
- {id: LGBT, cat: Audio/Audiobook, desc: "LGBT"}
- {id: Literature, cat: Audio/Audiobook, desc: "Literature"}
- {id: LitRPG, cat: Audio/Audiobook, desc: "LitRPG"}
- {id: Misc. Non-fiction, cat: Audio/Audiobook, desc: "Misc. Non-fiction"}
- {id: Mystery, cat: Audio/Audiobook, desc: "Mystery"}
- {id: Myth Hunting, cat: Audio/Audiobook, desc: "Myth Hunting"}
- {id: Paranormal, cat: Audio/Audiobook, desc: "Paranormal"}
- {id: Plays & Theater, cat: Audio/Audiobook, desc: "Plays & Theater"}
- {id: Poetry, cat: Audio/Audiobook, desc: "Poetry"}
- {id: Political, cat: Audio/Audiobook, desc: "Political"}
- {id: Postapocalyptic, cat: Audio/Audiobook, desc: "Postapocalyptic"}
- {id: Radio Productions, cat: Audio/Audiobook, desc: "Radio Productions"}
- {id: Romance, cat: Audio/Audiobook, desc: "Romance"}
- {id: Sci-Fi, cat: Audio/Audiobook, desc: "Sci-Fi"}
- {id: Science, cat: Audio/Audiobook, desc: "Science"}
- {id: Self-help, cat: Audio/Audiobook, desc: "Self-help"}
- {id: SHTF, cat: Audio/Audiobook, desc: "SHTF"}
- {id: Spiritual & Religious, cat: Audio/Audiobook, desc: "Spiritual & Religious"}
- {id: Sports, cat: Audio/Audiobook, desc: "Sports"}
- {id: Suspense, cat: Audio/Audiobook, desc: "Suspense"}
- {id: Thriller, cat: Audio/Audiobook, desc: "Thriller"}
- {id: True Crime, cat: Audio/Audiobook, desc: "True Crime"}
- {id: Tutorial, cat: Audio/Audiobook, desc: "Tutorial"}
- {id: Westerns, cat: Audio/Audiobook, desc: "Westerns"}
- {id: Anthology, cat: Audio/Audiobook, desc: "Anthology"}
- {id: Bestsellers, cat: Audio/Audiobook, desc: "Bestsellers"}
- {id: Classic, cat: Audio/Audiobook, desc: "Classic"}
- {id: Documentary, cat: Audio/Audiobook, desc: "Documentary"}
- {id: Full Cast, cat: Audio/Audiobook, desc: "Full Cast"}
- {id: Libertarian, cat: Audio/Audiobook, desc: "Libertarian"}
- {id: Military, cat: Audio/Audiobook, desc: "Military"}
- {id: Novel, cat: Audio/Audiobook, desc: "Novel"}
- {id: Short Story, cat: Audio/Audiobook, desc: "Short Story"}
modes:
search: [s]
login:
path: https://audiobookbay.nl/member/login.php
form: form[action="https://audiobookbay.nl/member/login.php"]
method: post
form: form
inputs:
username: "{{ .Config.username }}"
password: "{{ .Config.password }}"
login: "Login"
error:
- selector: td.embedded:has(h2:contains("Invalid"))
test:
path: /member/users/
download:
selector: a[href^="/download?"]
attribute: href
search:
paths:
# show members page if no search parameters
- path: /
inputs:
"s": "{{ .Keywords }}"
rows:
selector: div.post
fields:
title:
selector: div.postTitle
details:
selector: div.postTitle
download:
selector: a[href^="/audio-books/"]
attribute: href

View File

@@ -72,7 +72,7 @@
rows:
selector: tr.browse_color, tr.freeleech_color, tr[id^="kdescr"]
after: 1
fields:
fields: # some users (rank specific?) have an extra column (td:nth-child(4)) with bookmark features
banner:
selector: a[href^="details.php?id="][onmouseover]
attribute: onmouseover
@@ -98,20 +98,20 @@
selector: a[href^="download.php"]
attribute: href
files:
selector: td:nth-child(4)
selector: a[href^="filelist.php"]
size:
selector: td:nth-child(7)
selector: td:nth-last-child(6)
grabs:
selector: td:nth-child(8)
selector: td:nth-last-child(5)
filters:
- name: regexp
args: ([\d,]+)
seeders:
selector: td:nth-child(9)
selector: td:nth-last-child(4)
leechers:
selector: td:nth-child(10)
selector: td:nth-last-child(3)
date:
selector: td:nth-child(6)
selector: td:nth-last-child(7)
downloadvolumefactor:
case:
"a.info > b:contains(\"[FREE]\")": "0"

View File

@@ -0,0 +1,161 @@
---
site: bigtower
name: BigTower
description: "Big Tower is an ITALIAN Private site for TV / MOVIES / GENERAL"
language: it-it
type: private
encoding: UTF-8
links:
- http://bigtower.info/
caps:
categorymappings:
# Movies
- {id: 91, cat: Movies/HD, desc: "DSS"}
- {id: 92, cat: Movies/HD, desc: "DSS 3D"}
- {id: 14, cat: Movies, desc: "Screener"}
- {id: 15, cat: Movies/SD, desc: "DVDRip"}
- {id: 16, cat: Movies/HD, desc: "BDRip"}
- {id: 17, cat: Movies/HD, desc: "HD 720p"}
- {id: 18, cat: Movies/HD, desc: "HD 1080p"}
- {id: 19, cat: Movies/HD, desc: "HD 3D"}
- {id: 83, cat: Movies/HD, desc: "4K (Ultra HD)"}
- {id: 89, cat: Movies/DVD, desc: "DVD 5"}
- {id: 90, cat: Movies/DVD, desc: "DVD 9"}
- {id: 37, cat: Movies, desc: "MP4"}
- {id: 61, cat: TV, desc: "TV Show"}
- {id: 78, cat: TV, desc: "Serie TV"}
- {id: 96, cat: TV/HD, desc: "Serie TV 720p"}
- {id: 97, cat: TV/HD, desc: "Serie TV 1080p"}
- {id: 98, cat: TV, desc: "Serie TV MP4"}
- {id: 24, cat: TV/Anime, desc: "Cartoni"}
- {id: 66, cat: TV/Anime, desc: "Anime"}
- {id: 71, cat: TV, desc: "SUB iTA"}
- {id: 75, cat: TV/Documentary, desc: "Documentari"}
- {id: 72, cat: TV/Sport, desc: "Sport"}
# GAMES
- {id: 28, cat: PC/Games, desc: "PC Games"}
- {id: 63, cat: Console/Xbox 360, desc: "XBOX 360"}
- {id: 64, cat: Console/PS3, desc: "PS3"}
- {id: 33, cat: Console/Wii, desc: "WII"}
- {id: 76, cat: Console/Other, desc: "PS2"}
- {id: 81, cat: Console/Xbox One, desc: "XBOX ONE"}
- {id: 84, cat: Console/PS4, desc: "PS4"}
# MUSIC
- {id: 35, cat: Audio, desc: "MP3"}
- {id: 67, cat: Audio, desc: "FLAC"}
# SOFTWARE
- {id: 52, cat: PC/ISO, desc: "Windows"}
- {id: 54, cat: PC/ISO, desc: "Mac"}
- {id: 69, cat: PC/ISO, desc: "Linux"}
# PHONE
- {id: 40, cat: PC/Phone-IOS, desc: "Android"}
- {id: 41, cat: PC/Phone-Android, desc: "Iphone"}
# OTHER
- {id: 44, cat: Other, desc: "Varie"}
- {id: 82, cat: Other, desc: "Music Video"}
- {id: 86, cat: Other, desc: "Navigatori"}
- {id: 95, cat: Other, desc: "Immagini"}
- {id: 99, cat: Other, desc: "AudioLibri"}
# EBOOK
- {id: 46, cat: Books, desc: "Ebook"}
- {id: 73, cat: Books/Comics, desc: "Fumetti"}
- {id: 74, cat: Books/Comics, desc: "Manga"}
- {id: 87, cat: Books, desc: "Giornali"}
modes:
search: [q]
tv-search: [q, season, ep]
movie-search: [q]
login:
path: index.php?page=login
method: post
inputs:
uid: "{{ .Config.username }}"
pwd: "{{ .Config.password }}"
error:
- selector: span:contains("Nome Utente non corretto")
test:
path: index.php
selector: a[href="logout.php"]
search:
paths:
- path: index.php
inputs:
search: "{{ .Keywords }}"
page: "torrents"
category: "{{range .Categories}}{{.}};{{end}}"
options: "0"
active: "0"
rows:
selector: table > tbody > tr > td > table.lista > tbody > tr:has(a[href^="index.php?page=torrent-details&id="])
fields:
download:
selector: a[href^="index.php?page=torrent-details&id="]
attribute: href
filters:
- name: replace
args: ["index.php?page=torrent-details&id=", "download.php?id="]
title:
selector: a[onmouseover][href^="index.php?page=torrent-details&id="]
banner:
selector: a[onmouseover][href^="index.php?page=torrent-details&id="]
attribute: onmouseover
filters:
- name: regexp
args: "src=(.*?) "
category:
selector: a[href^="index.php?page=torrents&category="]
attribute: href
filters:
- name: querystring
args: category
details:
selector: a[onmouseover][href^="index.php?page=torrent-details&id="]
attribute: href
size:
selector: td:nth-last-child(2)
date:
selector: td:nth-last-child(7)
filters:
- name: append
args: " +01:00"
- name: dateparse
args: "02/01/2006 -07:00"
grabs:
selector: td:nth-last-child(4)
filters:
- name: replace
args: ["---", "0"]
seeders:
selector: td:nth-last-child(6)
leechers:
selector: td:nth-last-child(5)
downloadvolumefactor:
case:
img[alt="Gold 100% Free"]: "0"
img[alt="Silver 50% Free"]: "0.5"
img[alt="Bronze 25% Free"]: "0.75"
"*": "1"
uploadvolumefactor:
case:
img[alt="2x Upload Multiplier"]: "2"
img[alt="3x Upload Multiplier"]: "3"
img[alt="4x Upload Multiplier"]: "4"
img[alt="5x Upload Multiplier"]: "5"
img[alt="6x Upload Multiplier"]: "6"
img[alt="7x Upload Multiplier"]: "7"
img[alt="8x Upload Multiplier"]: "8"
img[alt="9x Upload Multiplier"]: "9"
img[alt="10x Upload Multiplier"]: "10"
"*": "1"

View File

@@ -69,9 +69,18 @@
filters:
- name: andmatch
fields:
# download button can be disbled in the profile, use details link instead
# download:
# selector: a[href^="download.php/"]
# attribute: href
download:
selector: a[href^="download.php/"]
selector: a[href^="details.php?id="]
attribute: href
filters:
- name: replace
args: ["details.php?id=", "download.php/"]
- name: append
args: "/invalid.torrent"
title:
selector: a[href^="details.php?id="]
title:

View File

@@ -44,15 +44,8 @@
sorting: created_at
direction: desc
qty: 100
preprocessingfilters:
- name: jsonjoinarray
args: ["$.result", ""]
- name: prepend
args: "<table>"
- name: append
args: "</table>"
rows:
selector: tr
selector: table > tbody > tr
fields:
category:
selector: a[href*="/categories/"]
@@ -63,18 +56,11 @@
title:
selector: a.view-torrent
download:
selector: a[href*="/download_check/"]
selector: a[href*="/download/"]
attribute: href
filters:
- name: replace
args: ["/download_check/", "/download/"]
details:
selector: a.view-torrent
attribute: href
imdb:
optional: true
selector: a[href*="://www.imdb.com/title/"]
attribute: href
size:
selector: td:nth-child(5)
seeders:
@@ -88,12 +74,6 @@
args: ([\d\.]+)
date:
selector: time
attribute: datetime
filters:
- name: append
args: " +00:00"
- name: dateparse
args: "2006-01-02 15:04:05 -07:00"
downloadvolumefactor:
case:
"i[data-original-title=\"100% Free\"]": "0"

View File

@@ -28,7 +28,7 @@
search:
paths:
- path: "list/{{if .Keywords}}{{.Keywords}}{{else}}movie{{end}}.html"
- path: "list/{{if .Keywords}}{{.Keywords}}{{else}}movie{{end}}/1-1-0.html"
rows:
selector: .rs
fields:
@@ -53,6 +53,10 @@
selector: .sbar span:nth-of-type(5) b
grabs:
selector: .sbar span:nth-of-type(6) b
seeders:
text: "999"
leechers:
text: "999"
downloadvolumefactor:
text: "0"
uploadvolumefactor:

View File

@@ -63,9 +63,9 @@
grabs:
selector: div[class$="info"] span:nth-of-type(4)
seeders:
text: "999"
selector: div[class$="info"] span:nth-of-type(4)
leechers:
text: "999"
selector: div[class$="info"] span:nth-of-type(4)
downloadvolumefactor:
text: "0"
uploadvolumefactor:

View File

@@ -0,0 +1,117 @@
---
site: btgigs
name: BTGigs
description: "BTGigs (TG) is a POLISH Private Torrent Tracker for MOVIES / TV / GENERAL"
language: pl-pl
type: private
encoding: ISO-8859-2
links:
- https://btgigs.info/
caps:
categorymappings:
- {id: 36, cat: Audio/Audiobook, desc: "aBooki"}
- {id: 27, cat: TV/Anime, desc: "Anime"}
- {id: 1, cat: PC, desc: "Aplikacje PC"}
- {id: 10, cat: Books/EBook, desc: "eBooki"}
- {id: 34, cat: Movies/BluRay, desc: "Filmy/BR"}
- {id: 4, cat: Movies/SD, desc: "Filmy/DVD-R"}
- {id: 31, cat: Movies/HD, desc: "Filmy/HD Rip"}
- {id: 17, cat: Movies/Other, desc: "Filmy/Inne"}
- {id: 35, cat: Movies/UHD, desc: "Filmy/UHD"}
- {id: 20, cat: Movies/SD, desc: "Filmy/XviD"}
- {id: 21, cat: Console, desc: "Gry/konsole"}
- {id: 7, cat: PC/Games, desc: "Gry/PC ISO"}
- {id: 12, cat: PC/Games, desc: "Gry/PC Rips"}
- {id: 28, cat: Other, desc: "GSM/PDA"}
- {id: 19, cat: Audio/Video, desc: "Koncerty/Teledyski"}
- {id: 32, cat: Audio/Lossless, desc: "musicDVD/DTS/FLAC"}
- {id: 5, cat: Audio/MP3, desc: "Muzyka/MP3"}
- {id: 26, cat: Other, desc: "Rozne"}
- {id: 30, cat: TV/Sport, desc: "Sport"}
- {id: 6, cat: TV, desc: "TV/Seriale"}
- {id: 29, cat: PC, desc: "Witaminki"}
- {id: 9, cat: XXX, desc: "XXX"}
modes:
search: [q]
tv-search: [q, season, ep]
movie-search: [q]
login:
path: /takelogin__akcja.php
method: post
inputs:
username_dupa: "{{ .Config.username }}"
password__dupa: "{{ .Config.password }}"
error:
- selector: td.embedded:has(h2:contains("failed"))
- selector: td.embedded:has(h2:contains("Error"))aD
test:
selector: a[href^="logout.php"]
path: /browse.php
search:
paths:
- path: /browse.php
inputs:
$raw: "{{range .Categories}}c{{.}}=1&{{end}}"
search: "{{ .Query.Keywords }}"
incldead: 1
tyt: 0
lang: 0
subcat: 0
rows:
selector: table[border="1"][cellpadding=5] > tbody > tr:has(a[href^="details.php?id="])
fields:
title:
selector: a[href^="details.php?id="]
details:
selector: a[href^="details.php?id="]
attribute: href
category:
selector: a[href^="browse.php?cat="]
attribute: href
filters:
- name: querystring
args: cat
download:
selector: a[href^="download.php/"]
attribute: href
description:
optional: true
selector: img[src^="/pic/cat_pl/"]
attribute: src
filters:
- name: append
args: "Language: polish\n<br>"
- name: prepend
args: {{ .Result.description }}
imdb:
optional: true
selector: a[href^="http://www.imdb.com/title/tt"]
date:
selector: td:nth-child(5)
filters:
- name: append
args: " +00:00"
- name: dateparse
args: "2006-01-0215:04:05 -07:00"
grabs:
selector: td:nth-child(7)
filters:
- name: regexp
args: (\d+)
size:
selector: td:nth-child(6)
seeders:
selector: td:nth-child(8)
leechers:
selector: td:nth-child(9)
downloadvolumefactor:
case:
"img[src=\"pic/ico_disk1.png\"]": 0
"img[src=\"pic/ico_disk2.png\"]": 1
"*": 1
uploadvolumefactor:
text: "1"

View File

@@ -1,23 +1,17 @@
---
site: torrentwtf
name: Torrentwtf
description: "Torrentwtf is a Czech Private site for TV / MOVIES / GENERAL"
language: cs-cz
site: btxpress
name: BTXpress
description: "HD Tracker Movies/TV"
language: en-us
type: private
encoding: UTF-8
links:
- https://torrent.wtf/
- https://btxpress.org/
caps:
categorymappings:
- {id: 1, cat: Movies, desc: "Filmy"}
- {id: 2, cat: TV, desc: "Seriály"}
- {id: 3, cat: Audio, desc: "Hudba"}
- {id: 5, cat: PC/Games, desc: "Hry"}
- {id: 6, cat: Books, desc: "Knihy"}
- {id: 8, cat: PC, desc: "Software"}
- {id: 9, cat: XXX, desc: "xXx"}
- {id: 10, cat: Other, desc: "Ostatní"}
- {id: 1, cat: Movies, desc: "Movies"}
- {id: 2, cat: TV, desc: "TV"}
modes:
search: [q]
@@ -31,31 +25,26 @@
username: "{{ .Config.username }}"
password: "{{ .Config.password }}"
error:
- selector: table.main:contains("Tieto poverenia sa nezhodujú s našimi záznamami.")
- selector: table.main:contains("Login Failed!")
test:
path: /torrents
search:
paths:
- path: /filter
- path: /filterTorrents
inputs:
$raw: "{{range .Categories}}categories[]={{.}}&{{end}}"
search: "{{if .Query.IMDBID}}{{else}}{{ .Keywords }}{{end}}"
uploader: ""
imdb: "{{ .Query.IMDBIDShort }}"
tvdb: ""
tmdb: ""
mal: ""
sorting: created_at
direction: desc
qty: 100
preprocessingfilters:
- name: jsonjoinarray
args: ["$.result", ""]
- name: prepend
args: "<table>"
- name: append
args: "</table>"
rows:
selector: tr
selector: table > tbody > tr
fields:
category:
selector: a[href*="/categories/"]
@@ -65,41 +54,25 @@
args: "/categories/.*?\\.(\\d+)"
title:
selector: a.view-torrent
filters:
- name: re_replace
args: [".*? / ", ""]
download:
selector: a[href*="/download_check/"]
selector: a[href*="/download/"]
attribute: href
filters:
- name: replace
args: ["/download_check/", "/download/"]
details:
selector: a.view-torrent
attribute: href
imdb:
optional: true
selector: a[href*="://www.imdb.com/title/"]
attribute: href
size:
selector: td:nth-child(5)
selector: td:nth-child(4)
seeders:
selector: td:nth-child(7)
leechers:
selector: td:nth-child(8)
grabs:
selector: td:nth-child(6)
leechers:
selector: td:nth-child(7)
grabs:
selector: td:nth-child(5)
filters:
- name: regexp
args: ([\d\.]+)
date:
selector: time
attribute: datetime
filters:
- name: append
args: " +00:00"
- name: dateparse
args: "2006-01-02 15:04:05 -07:00"
downloadvolumefactor:
case:
"i[data-original-title=\"100% Free\"]": "0"
@@ -108,4 +81,4 @@
uploadvolumefactor:
case:
"i[data-original-title=\"Double upload\"]": "2"
"*": "1"
"*": "1"

View File

@@ -45,10 +45,7 @@
- selector: table:contains("Login failed!")
test:
path: index.php
download:
selector: a[href^="download.php?id="]
search:
paths:
- path: browse.php

View File

@@ -1,13 +1,39 @@
---
# Update by LA5T based on the orignial 'cinematik.yml'
# 29.07.2018 22:53 UTC+2
#
site: cinematik
name: Cinematik
description: "Non-Hollywood movie tracker"
description: "Tracker for non-hollywood movies."
language: en-us
type: private
encoding: UTF-8
links:
- https://www.cinematik.net
settings:
- name: username
type: text
label: Username
- name: password
type: password
label: Password
- name: incldead
type: select
label: Status
default: 1
options:
0: Active
1: "Active and Inactive"
2: Inactive
- name: srchdtls
type: checkbox
label: "Detailed search"
- name: info_results
type: info
label: "Search results"
default: "You can increase the number of search results in your profile.<br />Default is 15."
caps:
categorymappings:
- {id: 1, cat: Movies, desc: "Comedy"}
@@ -42,13 +68,15 @@
- selector: table:contains("Login failed!")
test:
path: my.php
search:
paths:
- path: browse.php
inputs:
$raw: "{{range .Categories}}filter_cat[{{.}}]=1&{{end}}"
$raw: "{{range .Categories}}c{{.}}=1&{{end}}"
search: "{{ .Query.Keywords }}"
incldead: "{{ .Config.incldead }}"
srchdtls: "{{ if .Config.srchdtls }}1{{ else }}0{{ end }}"
rows:
selector: table[border="1"] tr:not(:first-child)
fields:
@@ -82,11 +110,11 @@
selector: td:nth-child(11) div.addedtor
downloadvolumefactor:
case:
"img[title=\"Golden Torrent: No Download Stats are Recorded\"]": "0"
"img[title=\"Silver Torrent: Download Stats are 25% Recorded\"]": "0.25"
"img[title=\"Platinum Torrent: No Download Stats are Recorded, Upload Stats are Doubled!\"]": "0"
"*": "1"
"img[title=\"Golden Torrent: No Download Stats are Recorded\"]": 0
"img[title=\"Silver Torrent: Download Stats are 25% Recorded\"]": 0.25
"img[title=\"Platinum Torrent: No Download Stats are Recorded, Upload Stats are Doubled!\"]": 0
"*": 1
uploadvolumefactor:
case:
"img[title=\"Platinum Torrent: No Download Stats are Recorded, Upload Stats are Doubled!\"]": "2"
"*": "1"
"img[title=\"Platinum Torrent: No Download Stats are Recorded, Upload Stats are Doubled!\"]": 2
"*": 1

View File

@@ -6,8 +6,10 @@
type: public
encoding: UTF-8
links:
- http://www.cpabien.cm/
- https://ww1.cpabien.io/
legacylinks:
- http://www.cpasbiens.cc/
- http://www.cpabien.cm/
- http://cpabien.cm/
- http://cpasbiens1.com/
- http://cpabien.mx/
@@ -19,6 +21,7 @@
- http://cpabien.co/
- http://cpabien.la/
- http://cpabien.club/
- http://www.cpabien.io/
caps:
categorymappings:

View File

@@ -67,6 +67,14 @@
args: [".*? / ", ""]
- name: diacritics
args: replace
- name: replace
args: ["1080i", "1080p"]
- name: replace
args: ["720i", "720p"]
- name: replace
args: ["pLQ", "p"]
- name: replace
args: ["pHD", "p"]
- name: replace
args: ["serie", ""]
- name: replace

View File

@@ -128,7 +128,18 @@
"2" : "Argent (Silver)"
"3" : "Or (Gold)"
"4" : "Argent & Or (Both)"
- name: multilang
type: checkbox
label: Replace MULTI by another language in release name
default: false
- name: multilanguage
type: select
label: Replace MULTI by this language
default: FRENCH
options:
FRENCH : "FRENCH"
MULTI.FRENCH : "MULTI.FRENCH"
ENGLISH: "ENGLISH"
login:
path: tracker/index.php?page=login
method: post
@@ -168,8 +179,15 @@
rows:
selector: table > tbody > tr > td > table.lista > tbody > tr:has(td[onmouseover="this.className='post'"])
fields:
title:
title_phase1:
selector: a[onmouseover][href^="index.php?page=torrent-details&id="]
title_multilang:
text: "{{ .Result.title_phase1 }}"
filters:
- name: re_replace
args: ["[\\.\\s\\[\\-][Mm][Uu][Ll][Tt][Ii][\\.\\s\\]\\-]", ".{{ .Config.multilanguage }}."]
title:
text: "{{if .Config.multilang }}{{ .Result.title_multilang }}{{else}}{{ .Result.title_phase1 }}{{end}}"
details:
selector: a[onmouseover][href^="index.php?page=torrent-details&id="]
attribute: href
@@ -189,23 +207,23 @@
- name: querystring
args: "category"
date:
selector: td:nth-of-type(4)
selector: td:nth-of-type(5)
filters:
- name: append
args: " -04:00"
- name: dateparse
args: "02/01/2006 15:04:05 -07:00"
seeders:
selector: td:nth-of-type(6)
leechers:
selector: td:nth-of-type(7)
grabs:
leechers:
selector: td:nth-of-type(8)
grabs:
selector: td:nth-of-type(9)
filters:
- name: replace
args: ["---", "0"]
size:
selector: td:nth-of-type(10)
selector: td:nth-of-type(11)
downloadvolumefactor:
case:
img[src="images/freeleech.gif"]: "0"

View File

@@ -115,6 +115,8 @@
rows:
selector: table > tbody > tr:has(img[src*="/pic/categories/"])
filters:
- name: andmatch
fields:
title:
# using attribute title from td(3) because the text from td(2) a(2) can be abbreviated

View File

@@ -1,177 +0,0 @@
---
site: eotforum
name: EoT-Forum
description: "A German gerneral tracker"
language: de-de
type: private
encoding: windows-1252
links:
- https://eot-forum.net
caps:
categorymappings:
# Filme
- {id: 14, cat: Movies/SD, desc: "SD XviD"}
- {id: 15, cat: Movies/SD, desc: "SD x264"}
- {id: 16, cat: Movies/HD, desc: "HD"}
- {id: 68, cat: Movies/HD, desc: "UHD"}
- {id: 17, cat: Movies/3D, desc: "3D"}
- {id: 18, cat: Movies/DVD, desc: "DVD-R"}
- {id: 19, cat: Movies, desc: "Pack"}
- {id: 20, cat: Movies, desc: "International"}
- {id: 21, cat: XXX, desc: "XXX"}
# Serien/TV
- {id: 23, cat: TV/SD, desc: "SD XviD"}
- {id: 24, cat: TV/SD, desc: "SD x264"}
- {id: 25, cat: TV/HD, desc: "HD"}
- {id: 26, cat: TV/SD, desc: "DVD-R"}
- {id: 27, cat: TV, desc: "Pack"}
- {id: 28, cat: TV, desc: "International"}
- {id: 29, cat: TV/Sport, desc: "Sport"}
# Dokus
- {id: 31, cat: TV/Documentary, desc: "SD XviD"}
- {id: 32, cat: TV/Documentary, desc: "SD x264"}
- {id: 33, cat: TV/Documentary, desc: "HD"}
- {id: 34, cat: TV/Documentary, desc: "3D"}
- {id: 35, cat: TV/Documentary, desc: "Pack"}
- {id: 67, cat: TV/Documentary, desc: "DVD-R"}
- {id: 36, cat: TV/Documentary, desc: "International"}
# Audio
- {id: 38, cat: Audio, desc: "Charts"}
- {id: 39, cat: Audio/MP3, desc: "MP3"}
- {id: 40, cat: Audio/Lossless, desc: "Flac"}
- {id: 41, cat: Audio, desc: "Pack"}
- {id: 42, cat: Audio/Video, desc: "MusikVideo"}
- {id: 43, cat: Audio/Audiobook, desc: "Hörbücher"}
# Spiele
- {id: 45, cat: PC/Games, desc: "Windows"}
- {id: 46, cat: PC/Mac, desc: "MacOS"}
- {id: 47, cat: Console/PS4, desc: "Sony PS"}
- {id: 48, cat: Console/Xbox , desc: "Microsoft XBox"}
- {id: 49, cat: Console/NDS, desc: "Nintendo"}
- {id: 50, cat: PC/Games, desc: "Linux"}
- {id: 51, cat: Console, desc: "Andere"}
# Software
- {id: 53, cat: PC, desc: "Windows"}
- {id: 54, cat: PC/Mac, desc: "MacOS"}
- {id: 55, cat: PC, desc: "Linux"}
- {id: 56, cat: PC/Phone-Android, desc: "Android"}
- {id: 57, cat: PC/Phone-IOS, desc: "Apple IOS"}
- {id: 58, cat: PC/Phone-Other, desc: "Andere"}
# Sonstiges
- {id: 60, cat: Books, desc: "EBooks"}
- {id: 61, cat: Other, desc: "Bilder"}
- {id: 62, cat: TV/Anime, desc: "Anime"}
- {id: 63, cat: Other, desc: "MISC"}
- {id: 64, cat: XXX, desc: "XXX-Bilder/EBooks/Audio"}
# EOT-Specials
- {id: 66, cat: Other, desc: "Special"}
modes:
search: [q]
tv-search: [q, season, ep]
login:
path: index.php?page=login
method: post
inputs:
uid: "{{ .Config.username }}"
pwd: "{{ .Config.password }}"
rememberme: "forever"
submit: "Login"
error:
- selector: td.lista[align="center"][colspan="2"] > span
test:
path: index.php
selector: a[href^="logout.php"]
search:
paths:
- path: index.php
inputs:
page: "torrents"
search: "{{ .Query.Keywords }}"
options: "0"
active: "0"
gold: "0"
rows:
selector: table.lista > tbody > tr:has(a[href^="index.php?page=torrent-details&id="])
dateheaders:
selector: ":has(td.header > b)"
filters:
- name: replace
args: ["Torrents vom ", ""]
- name: replace
args: ["Januar", "January"]
- name: replace
args: ["Februar", "February"]
- name: replace
args: ["März", "March"]
- name: replace
args: ["Mai", "May"]
- name: replace
args: ["Juni", "June"]
- name: replace
args: ["Juli", "July"]
- name: replace
args: ["Oktober", "October"]
- name: replace
args: ["Dezember", "December"]
- name: dateparse
args: "02.January.2006"
fields:
download:
selector: a[href^="download.php?id="]
attribute: href
title:
selector: a[href^="index.php?page=torrent-details&id="]
attribute: title
filters:
- name: replace
args: ["Details anzeigen: ", ""]
category:
selector: a[href^="index.php?page=torrents&category="]
attribute: href
filters:
- name: querystring
args: category
comments:
selector: a[href*="#comments"]
attribute: href
size:
selector: td:nth-child(3)
grabs:
selector: td:nth-child(5)
filters:
- name: split
args: ["♦", 2]
- name: replace
args: ["---", "0"]
seeders:
selector: td:nth-child(5) > a:nth-child(1)
leechers:
selector: td:nth-child(5) > a:nth-child(2)
downloadvolumefactor:
case:
img[alt="gold"]: "0"
img[alt="silver"]: "0.5"
"*": "1"
uploadvolumefactor:
case:
img[alt="2x Upload Multiplier"]: "2"
img[alt="3x Upload Multiplier"]: "3"
img[alt="4x Upload Multiplier"]: "4"
img[alt="5x Upload Multiplier"]: "5"
img[alt="6x Upload Multiplier"]: "6"
img[alt="7x Upload Multiplier"]: "7"
img[alt="8x Upload Multiplier"]: "8"
img[alt="9x Upload Multiplier"]: "9"
img[alt="10x Upload Multiplier"]: "10"
"*": "1"

View File

@@ -1,4 +1,4 @@
---
---
site: ethor
name: Ethor.net (Thor's Land)
description: "A French gerneral tracker"
@@ -83,6 +83,15 @@
args: ["/details.php", "/download.php"]
title:
selector: a[href^="/details.php"]:has(b)
filters:
- name: replace
args: ["VFQ", "FRENCH"]
- name: replace
args: ["vfq", "FRENCH"]
- name: re_replace
args: ["S(\\d{2}) E(\\d{2})", "S$1E$2"]
- name: re_replace
args: ["S(\\d{1}) E(\\d{2})", "S0$1E$2"]
category:
selector: a[href^="/browse.php?cat="]
attribute: href

View File

@@ -69,6 +69,8 @@
inputs:
$raw: "{{range .Categories}}c{{.}}=1&{{end}}"
search: "{{ .Keywords }}"
sort: "id"
order: "desc"
incldead: "1"
keywordsfilters:
- name: replace
@@ -110,4 +112,4 @@
downloadvolumefactor:
text: "0"
uploadvolumefactor:
text: "1"
text: "1"

View File

@@ -0,0 +1,981 @@
---
site: extratorrentclone
name: ExtraTorrentClone
description: "ExtraTorrentClone is a Public tracker, a popular alternative to the original ET site, providing Movie / TV / General magnets"
language: en-us
type: public
encoding: UTF-8
links:
- https://geetorrent.com/
legacylinks:
- https://eltorrents.com/
caps:
categorymappings:
#Anime
- {id: 1, cat: TV/Anime, desc: "Anime"}
- {id: 963, cat: TV/Anime, desc: "Anime - Absolute Duo"}
- {id: 951, cat: TV/Anime, desc: "Anime - Akame ga Kill"}
- {id: 959, cat: TV/Anime, desc: "Anime - Aldnoah Zero"}
- {id: 99, cat: TV/Anime, desc: "Anime - Anime - Other"}
- {id: 86, cat: TV/Anime, desc: "Anime - Battle Programer Shirase"}
- {id: 87, cat: TV/Anime, desc: "Anime - Big O"}
- {id: 960, cat: TV/Anime, desc: "Anime - Binan Koukou Chikyuu Bouei-bu Love"}
- {id: 267, cat: TV/Anime, desc: "Anime - Bleach"}
- {id: 88, cat: TV/Anime, desc: "Anime - Cardcaptor Sakura"}
- {id: 89, cat: TV/Anime, desc: "Anime - Chobits"}
- {id: 142, cat: TV/Anime, desc: "Anime - Comics"}
- {id: 962, cat: TV/Anime, desc: "Anime - Death Parade"}
- {id: 151, cat: TV/Anime, desc: "Anime - Dragon ball"}
- {id: 90, cat: TV/Anime, desc: "Anime - Dragonball GT"}
- {id: 91, cat: TV/Anime, desc: "Anime - Dragonball Z"}
- {id: 156, cat: TV/Anime, desc: "Anime - DVD-R"}
- {id: 950, cat: TV/Anime, desc: "Anime - Fairy Tail"}
- {id: 92, cat: TV/Anime, desc: "Anime - Flame of Recca"}
- {id: 93, cat: TV/Anime, desc: "Anime - Full Metal Alchemist"}
- {id: 95, cat: TV/Anime, desc: "Anime - Ghost In The Shell SAC"}
- {id: 94, cat: TV/Anime, desc: "Anime - Gundam"}
- {id: 620, cat: TV/Anime, desc: "Anime - Hentai"}
- {id: 145, cat: TV/Anime, desc: "Anime - Hunter X Hunter"}
- {id: 949, cat: TV/Anime, desc: "Anime - Inou Battle wa Nichijou-kei no Naka de"}
- {id: 96, cat: TV/Anime, desc: "Anime - InuYasha"}
- {id: 524, cat: TV/Anime, desc: "Anime - Kiba"}
- {id: 97, cat: TV/Anime, desc: "Anime - Konkiki No Gash Bell"}
- {id: 961, cat: TV/Anime, desc: "Anime - Kuroko No Basuke"}
- {id: 98, cat: TV/Anime, desc: "Anime - Last Exile"}
- {id: 964, cat: TV/Anime, desc: "Anime - Log Horizon"}
- {id: 952, cat: TV/Anime, desc: "Anime - Nanatsu no Taizai"}
- {id: 101, cat: TV/Anime, desc: "Anime - Naruto"}
- {id: 508, cat: TV/Anime, desc: "Anime - One Piece"}
- {id: 100, cat: TV/Anime, desc: "Anime - Onegai Twins"}
- {id: 523, cat: TV/Anime, desc: "Anime - Ouran High School Host Club"}
- {id: 102, cat: TV/Anime, desc: "Anime - PlanetES"}
- {id: 146, cat: TV/Anime, desc: "Anime - Prince of Tennis"}
- {id: 103, cat: TV/Anime, desc: "Anime - Ranma 1/2"}
- {id: 104, cat: TV/Anime, desc: "Anime - Ruroni Kenshin"}
- {id: 105, cat: TV/Anime, desc: "Anime - Samurai Champloo"}
- {id: 107, cat: TV/Anime, desc: "Anime - Scrapped Princess"}
- {id: 997, cat: TV/Anime, desc: "Anime - Spider-man"}
- {id: 106, cat: TV/Anime, desc: "Anime - Stellvia of the Universe"}
- {id: 525, cat: TV/Anime, desc: "Anime - Strawberry Panic"}
- {id: 953, cat: TV/Anime, desc: "Anime - Sword Art Online II"}
- {id: 958, cat: TV/Anime, desc: "Anime - Tokyo Ghoul"}
#Audio
- {id: 5, cat: Audio, desc: "Music"}
- {id: 54, cat: Audio, desc: "Music - Alternative"}
- {id: 990, cat: Audio, desc: "Music - Ambient"}
- {id: 160, cat: Audio, desc: "Music - Anime"}
- {id: 55, cat: Audio, desc: "Music - Asian"}
- {id: 56, cat: Audio, desc: "Music - Blues"}
- {id: 809, cat: Audio, desc: "Music - Bollywood"}
- {id: 57, cat: Audio, desc: "Music - Christian"}
- {id: 58, cat: Audio, desc: "Music - Classic"}
- {id: 515, cat: Audio, desc: "Music - Compilation/Various Artists (VA)"}
- {id: 59, cat: Audio, desc: "Music - Country/Western"}
- {id: 971, cat: Audio, desc: "Music - Discography"}
- {id: 60, cat: Audio, desc: "Music - Drum N Bass"}
- {id: 61, cat: Audio, desc: "Music - Electronic"}
- {id: 850, cat: Audio, desc: "Music - FLAC"}
- {id: 519, cat: Audio, desc: "Music - Folk"}
- {id: 62, cat: Audio, desc: "Music - Game Music"}
- {id: 233, cat: Audio, desc: "Music - Gothic"}
- {id: 63, cat: Audio, desc: "Music - Hardcore"}
- {id: 78, cat: Audio, desc: "Music - HardHouse/Old School Radio Mixes"}
- {id: 512, cat: Audio, desc: "Music - Hardrock"}
- {id: 724, cat: Audio, desc: "Music - Hardstyle"}
- {id: 306, cat: Audio, desc: "Music - Heavy/Death Metal"}
- {id: 64, cat: Audio, desc: "Music - Hip Hop"}
- {id: 511, cat: Audio, desc: "Music - Indie/Britpop"}
- {id: 65, cat: Audio, desc: "Music - Industrial"}
- {id: 66, cat: Audio, desc: "Music - Jazz"}
- {id: 67, cat: Audio, desc: "Music - Karaoke"}
- {id: 521, cat: Audio, desc: "Music - Latin"}
- {id: 68, cat: Audio, desc: "Music - Metal"}
- {id: 526, cat: Audio, desc: "Music - Motown"}
- {id: 79, cat: Audio, desc: "Music - Music - Other"}
- {id: 69, cat: Audio, desc: "Music - Music Videos"}
- {id: 522, cat: Audio, desc: "Music - Non-English"}
- {id: 507, cat: Audio, desc: "Music - Now That's What I Call Music"}
- {id: 70, cat: Audio, desc: "Music - Pop"}
- {id: 852, cat: Audio, desc: "Music - Progressive"}
- {id: 71, cat: Audio, desc: "Music - Punk"}
- {id: 72, cat: Audio, desc: "Music - R&B"}
- {id: 851, cat: Audio, desc: "Music - Rai"}
- {id: 73, cat: Audio, desc: "Music - Rap"}
- {id: 74, cat: Audio, desc: "Music - Reggae"}
- {id: 75, cat: Audio, desc: "Music - Rock"}
- {id: 527, cat: Audio, desc: "Music - Rock 'n' Roll"}
- {id: 514, cat: Audio, desc: "Music - Singer Songwriter"}
- {id: 230, cat: Audio, desc: "Music - Ska"}
- {id: 505, cat: Audio, desc: "Music - Soul"}
- {id: 77, cat: Audio, desc: "Music - Soundtracks"}
- {id: 161, cat: Audio, desc: "Music - Techno"}
- {id: 420, cat: Audio, desc: "Music - Trance/House/Dance"}
- {id: 76, cat: Audio, desc: "Music - Unsigned/Amateur"}
- {id: 1002, cat: Audio, desc: "Music - AAC"}
- {id: 1003, cat: Audio, desc: "Music - Album"}
- {id: 1004, cat: Audio, desc: "Music - Box Set"}
- {id: 1005, cat: Audio, desc: "Music - Concerts"}
- {id: 1006, cat: Audio, desc: "Music - Discography"}
- {id: 1007, cat: Audio, desc: "Music - DVD"}
- {id: 1008, cat: Audio/Lossless, desc: "Music - Lossless"}
- {id: 1009, cat: Audio/MP3, desc: "Music - MP3"}
- {id: 1011, cat: Audio, desc: "Music - Radio"}
- {id: 1012, cat: Audio, desc: "Music - Single"}
#Movies
- {id: 4, cat: Movies, desc: "Movies"}
- {id: 419, cat: Movies, desc: "Movies - Action"}
- {id: 28, cat: Movies, desc: "Movies - Adventure"}
- {id: 29, cat: Movies, desc: "Movies - Animation"}
- {id: 30, cat: Movies, desc: "Movies - Asian"}
- {id: 32, cat: Movies, desc: "Movies - Automotive/Cars"}
- {id: 628, cat: Movies, desc: "Movies - Biography"}
- {id: 977, cat: Movies, desc: "Movies - Black and White"}
- {id: 558, cat: Movies, desc: "Movies - Bollywood/Desi"}
- {id: 976, cat: Movies, desc: "Movies - Classic"}
- {id: 33, cat: Movies, desc: "Movies - Comedy"}
- {id: 34, cat: Movies, desc: "Movies - Concerts"}
- {id: 600, cat: Movies, desc: "Movies - Crime"}
- {id: 35, cat: Movies, desc: "Movies - Documentary"}
- {id: 37, cat: Movies, desc: "Movies - Drama"}
- {id: 742, cat: Movies, desc: "Movies - Dubbed/Dual Audio"}
- {id: 36, cat: Movies, desc: "Movies - DVD/Film Extras"}
- {id: 149, cat: Movies, desc: "Movies - Family"}
- {id: 38, cat: Movies, desc: "Movies - Fantasy"}
- {id: 39, cat: Movies, desc: "Movies - Gore Flicks"}
- {id: 602, cat: Movies, desc: "Movies - History"}
- {id: 40, cat: Movies, desc: "Movies - Horror"}
- {id: 41, cat: Movies, desc: "Movies - Kids"}
- {id: 150, cat: Movies, desc: "Movies - KVCD"}
- {id: 974, cat: Movies, desc: "Movies - Lollywood"}
- {id: 42, cat: Movies, desc: "Movies - Martial Arts"}
- {id: 44, cat: Movies/Other, desc: "Movies - Other"}
- {id: 805, cat: Movies/3D, desc: "Movies - 3D"}
- {id: 975, cat: Movies/UHD, desc: "Movies - 4K"}
- {id: 947, cat: Movies, desc: "Movies - Musical"}
- {id: 43, cat: Movies, desc: "Movies - Mystery"}
- {id: 603, cat: Movies/Foreign, desc: "Movies - non English"}
- {id: 978, cat: Movies, desc: "Movies - Rarities"}
- {id: 45, cat: Movies, desc: "Movies - Romance"}
- {id: 46, cat: Movies, desc: "Movies - Samples/Trailers"}
- {id: 47, cat: Movies, desc: "Movies - Sci-Fi"}
- {id: 48, cat: Movies, desc: "Movies - Sports related"}
- {id: 779, cat: Movies, desc: "Movies - Stand-up comedy"}
- {id: 49, cat: Movies, desc: "Movies - Thriller"}
- {id: 671, cat: Movies, desc: "Movies - Travel"}
- {id: 307, cat: Movies, desc: "Movies - War"}
- {id: 601, cat: Movies, desc: "Movies - Western"}
- {id: 1024, cat: Movies, desc: "Movies - HEVC/x265"}
- {id: 1030, cat: Movies, desc: "Movies - Divx/Xvid"}
- {id: 1031, cat: Movies, desc: "Movies - h.264/x264"}
- {id: 1032, cat: Movies/HD, desc: "Movies - HD"}
- {id: 1033, cat: Movies, desc: "Movies - MP4"}
- {id: 1034, cat: Movies, desc: "Movies - SVCD/VCD"}
- {id: 1035, cat: Movies, desc: "Movies - YIFY"}
#TV
- {id: 8, cat: TV, desc: "TV"}
- {id: 986, cat: TV, desc: "TV - 12 Monkeys"}
- {id: 598, cat: TV, desc: "TV - 19-2"}
- {id: 795, cat: TV, desc: "TV - 2 Broke Girls"}
- {id: 435, cat: TV, desc: "TV - 24"}
- {id: 169, cat: TV, desc: "TV - 30 Days"}
- {id: 561, cat: TV, desc: "TV - 30 Rock"}
- {id: 274, cat: TV, desc: "TV - 60 Minutes"}
- {id: 862, cat: TV, desc: "TV - 666 Park Avenue"}
- {id: 273, cat: TV, desc: "TV - 'Allo 'Allo!"}
- {id: 310, cat: TV, desc: "TV - A-Team"}
- {id: 797, cat: TV, desc: "TV - About a Boy"}
- {id: 998, cat: TV, desc: "TV - Above Suspicion"}
- {id: 966, cat: TV, desc: "TV - Adam - E.V.A"}
- {id: 573, cat: TV, desc: "TV - Alaska State Troopers"}
- {id: 821, cat: TV, desc: "TV - Alcatraz"}
- {id: 118, cat: TV, desc: "TV - Alias"}
- {id: 810, cat: TV, desc: "TV - Almost Human"}
- {id: 771, cat: TV, desc: "TV - Alphas"}
- {id: 818, cat: TV, desc: "TV - American Chopper"}
- {id: 234, cat: TV, desc: "TV - American Dad"}
- {id: 194, cat: TV, desc: "TV - American Horror Story"}
- {id: 634, cat: TV, desc: "TV - American Idol"}
- {id: 674, cat: TV, desc: "TV - Americas Got Talent"}
- {id: 675, cat: TV, desc: "TV - Americas Next Top Model"}
- {id: 894, cat: TV, desc: "TV - Ancient Aliens"}
- {id: 170, cat: TV, desc: "TV - Angel"}
- {id: 911, cat: TV, desc: "TV - Anger Management"}
- {id: 659, cat: TV, desc: "TV - Archer"}
- {id: 275, cat: TV, desc: "TV - Arrested Development"}
- {id: 872, cat: TV, desc: "TV - Arrow"}
- {id: 984, cat: TV, desc: "TV - Ash vs Evil Dead"}
- {id: 171, cat: TV, desc: "TV - Attack Of The Show"}
- {id: 837, cat: TV, desc: "TV - Awake"}
- {id: 902, cat: TV, desc: "TV - Awkward"}
- {id: 916, cat: TV, desc: "TV - Baby Daddy"}
- {id: 165, cat: TV, desc: "TV - Babylon 5"}
- {id: 309, cat: TV, desc: "TV - Back In The Game"}
- {id: 460, cat: TV, desc: "TV - Band Of Brothers"}
- {id: 329, cat: TV, desc: "TV - Banshee"}
- {id: 891, cat: TV, desc: "TV - Bates Motel"}
- {id: 802, cat: TV, desc: "TV - Batman The Brave and The Bold"}
- {id: 163, cat: TV, desc: "TV - Battlestar Galactica"}
- {id: 794, cat: TV, desc: "TV - BBC"}
- {id: 886, cat: TV, desc: "TV - Beauty and the Beast"}
- {id: 172, cat: TV, desc: "TV - Beauty And The Geek"}
- {id: 782, cat: TV, desc: "TV - Beavis and Butt-Head"}
- {id: 584, cat: TV, desc: "TV - Being Erica"}
- {id: 669, cat: TV, desc: "TV - Being Human"}
- {id: 683, cat: TV, desc: "TV - Believe"}
- {id: 335, cat: TV, desc: "TV - Bellator FC"}
- {id: 979, cat: TV, desc: "TV - Better Call Saul"}
- {id: 173, cat: TV, desc: "TV - Big Brother"}
- {id: 666, cat: TV, desc: "TV - Big Love"}
- {id: 774, cat: TV, desc: "TV - Bigg Boss"}
- {id: 989, cat: TV, desc: "TV - Billions"}
- {id: 174, cat: TV, desc: "TV - Bitten"}
- {id: 396, cat: TV, desc: "TV - Black Sails"}
- {id: 981, cat: TV, desc: "TV - Blindspot"}
- {id: 717, cat: TV, desc: "TV - Blue Bloods"}
- {id: 754, cat: TV, desc: "TV - Boardwalk Empire"}
- {id: 709, cat: TV, desc: "TV - Bobs Burgers"}
- {id: 767, cat: TV, desc: "TV - Body of Proof"}
- {id: 175, cat: TV, desc: "TV - Bold and the beautiful"}
- {id: 969, cat: TV, desc: "TV - Bollywood TV Shows"}
- {id: 269, cat: TV, desc: "TV - Bones"}
- {id: 235, cat: TV, desc: "TV - Boston Legal"}
- {id: 676, cat: TV, desc: "TV - Breaking Bad"}
- {id: 707, cat: TV, desc: "TV - Breakout Kings"}
- {id: 409, cat: TV, desc: "TV - Brickleberry"}
- {id: 680, cat: TV, desc: "TV - Brooklyn Nine-Nine"}
- {id: 560, cat: TV, desc: "TV - Brothers And Sisters"}
- {id: 147, cat: TV, desc: "TV - Buffy"}
- {id: 677, cat: TV, desc: "TV - Burn Notice"}
- {id: 619, cat: TV, desc: "TV - Californication"}
- {id: 883, cat: TV, desc: "TV - Call of the Wildman"}
- {id: 719, cat: TV, desc: "TV - Camelot"}
- {id: 921, cat: TV, desc: "TV - Camp"}
- {id: 661, cat: TV, desc: "TV - Caprica"}
- {id: 928, cat: TV, desc: "TV - Capture"}
- {id: 128, cat: TV, desc: "TV - Carnivale"}
- {id: 736, cat: TV, desc: "TV - Cartoon"}
- {id: 658, cat: TV, desc: "TV - Castle"}
- {id: 941, cat: TV, desc: "TV - Cedar Cove"}
- {id: 846, cat: TV, desc: "TV - Celebrity Juice"}
- {id: 141, cat: TV, desc: "TV - Charmed"}
- {id: 900, cat: TV, desc: "TV - Chicago Fire"}
- {id: 324, cat: TV, desc: "TV - Chicago PD"}
- {id: 315, cat: TV, desc: "TV - Chopped"}
- {id: 184, cat: TV, desc: "TV - Chozen"}
- {id: 657, cat: TV, desc: "TV - Chuck"}
- {id: 133, cat: TV, desc: "TV - Cold Case"}
- {id: 629, cat: TV, desc: "TV - Community"}
- {id: 178, cat: TV, desc: "TV - Conan O'Brien"}
- {id: 946, cat: TV, desc: "TV - Constantine"}
- {id: 879, cat: TV, desc: "TV - Continuum"}
- {id: 861, cat: TV, desc: "TV - Copper"}
- {id: 322, cat: TV, desc: "TV - Cops"}
- {id: 186, cat: TV, desc: "TV - Cosmos A Space Time Odyssey"}
- {id: 670, cat: TV, desc: "TV - Cougar Town"}
- {id: 729, cat: TV, desc: "TV - Covert Affairs"}
- {id: 651, cat: TV, desc: "TV - Craig Ferguson"}
- {id: 280, cat: TV, desc: "TV - Criminal Minds"}
- {id: 788, cat: TV, desc: "TV - Crisis"}
- {id: 279, cat: TV, desc: "TV - Criss Angel BeLIEve"}
- {id: 323, cat: TV, desc: "TV - Crossing Jordan"}
- {id: 926, cat: TV, desc: "TV - Crossing Lines"}
- {id: 108, cat: TV, desc: "TV - CSI"}
- {id: 325, cat: TV, desc: "TV - Curb Your Enthusiasm"}
- {id: 882, cat: TV, desc: "TV - Da Vincis Demons"}
- {id: 282, cat: TV, desc: "TV - Dallas"}
- {id: 678, cat: TV, desc: "TV - Damages"}
- {id: 798, cat: TV, desc: "TV - Dancing with the Stars US"}
- {id: 652, cat: TV, desc: "TV - David Letterman"}
- {id: 994, cat: TV, desc: "TV - Days of Our Lives"}
- {id: 985, cat: TV, desc: "TV - DCs Legends of Tomorrow"}
- {id: 181, cat: TV, desc: "TV - Dead Like Me"}
- {id: 679, cat: TV, desc: "TV - Deadliest Catch"}
- {id: 182, cat: TV, desc: "TV - Deadwood"}
- {id: 890, cat: TV, desc: "TV - Defiance"}
- {id: 281, cat: TV, desc: "TV - Democracy Now!"}
- {id: 183, cat: TV, desc: "TV - Desperate Housewives"}
- {id: 939, cat: TV, desc: "TV - Devious Maids"}
- {id: 585, cat: TV, desc: "TV - Dexter"}
- {id: 644, cat: TV, desc: "TV - Dirty Jobs"}
- {id: 122, cat: TV, desc: "TV - Discovery Channel"}
- {id: 167, cat: TV, desc: "TV - Doctor Who"}
- {id: 968, cat: TV, desc: "TV - Documentary"}
- {id: 606, cat: TV, desc: "TV - Dollhouse"}
- {id: 839, cat: TV, desc: "TV - Dont Trust the Bitch in Apartment"}
- {id: 326, cat: TV, desc: "TV - Dr Who"}
- {id: 925, cat: TV, desc: "TV - Dracula"}
- {id: 328, cat: TV, desc: "TV - Drawn Together"}
- {id: 732, cat: TV, desc: "TV - Drop Dead"}
- {id: 820, cat: TV, desc: "TV - Eastbound and Down"}
- {id: 875, cat: TV, desc: "TV - Elementary"}
- {id: 283, cat: TV, desc: "TV - Ellen DeGeneres"}
- {id: 330, cat: TV, desc: "TV - Enlisted"}
- {id: 187, cat: TV, desc: "TV - Entourage"}
- {id: 270, cat: TV, desc: "TV - ER"}
- {id: 765, cat: TV, desc: "TV - Eureka"}
- {id: 238, cat: TV, desc: "TV - Everybody Loves Raymond"}
- {id: 571, cat: TV, desc: "TV - Extant"}
- {id: 840, cat: TV, desc: "TV - Fact or Faked Paranormal Files"}
- {id: 828, cat: TV, desc: "TV - Fairly Legeal"}
- {id: 876, cat: TV, desc: "TV - Faking It"}
- {id: 917, cat: TV, desc: "TV - Falling Skies"}
- {id: 188, cat: TV, desc: "TV - Family Guy"}
- {id: 855, cat: TV, desc: "TV - Family Tools"}
- {id: 411, cat: TV, desc: "TV - Fargo"}
- {id: 331, cat: TV, desc: "TV - Farscape"}
- {id: 983, cat: TV, desc: "TV - Fear the Walking Dead"}
- {id: 332, cat: TV, desc: "TV - Fifth Gear"}
- {id: 672, cat: TV, desc: "TV - Flashforward"}
- {id: 753, cat: TV, desc: "TV - Flashpoint"}
- {id: 831, cat: TV, desc: "TV - Foreign Series/Non English"}
- {id: 266, cat: TV, desc: "TV - Forever"}
- {id: 922, cat: TV, desc: "TV - Franklin and Bash"}
- {id: 140, cat: TV, desc: "TV - Friends"}
- {id: 612, cat: TV, desc: "TV - Fringe"}
- {id: 277, cat: TV, desc: "TV - From Dusk Till Dawn"}
- {id: 681, cat: TV, desc: "TV - Futurama"}
- {id: 728, cat: TV, desc: "TV - Game of Thrones"}
- {id: 334, cat: TV, desc: "TV - Gang Related"}
- {id: 996, cat: TV, desc: "TV - General Hospital"}
- {id: 954, cat: TV, desc: "TV - Geordie Shore"}
- {id: 574, cat: TV, desc: "TV - Ghost Adventures"}
- {id: 704, cat: TV, desc: "TV - Ghost Hunters"}
- {id: 642, cat: TV, desc: "TV - Ghost Mine"}
- {id: 338, cat: TV, desc: "TV - Ghost Whisperer"}
- {id: 284, cat: TV, desc: "TV - Gilmore Girls"}
- {id: 682, cat: TV, desc: "TV - Glee"}
- {id: 865, cat: TV, desc: "TV - Go On"}
- {id: 276, cat: TV, desc: "TV - Gold Rush"}
- {id: 339, cat: TV, desc: "TV - Good Eats"}
- {id: 599, cat: TV, desc: "TV - Gossip Girl"}
- {id: 580, cat: TV, desc: "TV - Gotham"}
- {id: 919, cat: TV, desc: "TV - Graceland"}
- {id: 955, cat: TV, desc: "TV - Gracepoint"}
- {id: 285, cat: TV, desc: "TV - Greys Anatomy"}
- {id: 819, cat: TV, desc: "TV - Grimm"}
- {id: 237, cat: TV, desc: "TV - Growing Up Fisher"}
- {id: 340, cat: TV, desc: "TV - Guiding Light"}
- {id: 866, cat: TV, desc: "TV - Guys With Kids"}
- {id: 880, cat: TV, desc: "TV - Hannibal"}
- {id: 813, cat: TV, desc: "TV - Happily Divorced"}
- {id: 769, cat: TV, desc: "TV - Happy Endings"}
- {id: 190, cat: TV, desc: "TV - Harald Schmidt"}
- {id: 713, cat: TV, desc: "TV - Harrys Law"}
- {id: 832, cat: TV, desc: "TV - Hart of Dixie"}
- {id: 341, cat: TV, desc: "TV - Haunted"}
- {id: 773, cat: TV, desc: "TV - Haven"}
- {id: 712, cat: TV, desc: "TV - Hawaii Five-0"}
- {id: 781, cat: TV, desc: "TV - Helix"}
- {id: 853, cat: TV, desc: "TV - Hell on Wheels"}
- {id: 191, cat: TV, desc: "TV - Hells Kitchen"}
- {id: 884, cat: TV, desc: "TV - Hemlock Grove"}
- {id: 342, cat: TV, desc: "TV - Hercules"}
- {id: 556, cat: TV, desc: "TV - Heroes"}
- {id: 343, cat: TV, desc: "TV - Hex"}
- {id: 192, cat: TV, desc: "TV - Hogans Heroes"}
- {id: 588, cat: TV, desc: "TV - Hollands Hoop"}
- {id: 755, cat: TV, desc: "TV - Homeland"}
- {id: 812, cat: TV, desc: "TV - Hostages"}
- {id: 684, cat: TV, desc: "TV - Hot in Cleveland"}
- {id: 286, cat: TV, desc: "TV - House"}
- {id: 913, cat: TV, desc: "TV - House Of Cards"}
- {id: 287, cat: TV, desc: "TV - How I Met Your Mother"}
- {id: 568, cat: TV, desc: "TV - How Its Made"}
- {id: 893, cat: TV, desc: "TV - How to Live with Your Parents"}
- {id: 288, cat: TV, desc: "TV - Howard Stern"}
- {id: 132, cat: TV, desc: "TV - Huff"}
- {id: 345, cat: TV, desc: "TV - Humor Amarillo"}
- {id: 756, cat: TV, desc: "TV - Hung"}
- {id: 637, cat: TV, desc: "TV - Hustle"}
- {id: 346, cat: TV, desc: "TV - In Justice"}
- {id: 685, cat: TV, desc: "TV - In Plain Sight"}
- {id: 582, cat: TV, desc: "TV - Ink Master"}
- {id: 347, cat: TV, desc: "TV - Inked"}
- {id: 965, cat: TV, desc: "TV - Inside MMA"}
- {id: 873, cat: TV, desc: "TV - Intelligence US"}
- {id: 240, cat: TV, desc: "TV - Into the West"}
- {id: 166, cat: TV, desc: "TV - Iron Chef"}
- {id: 289, cat: TV, desc: "TV - Invasion"}
- {id: 817, cat: TV, desc: "TV - Ironside"}
- {id: 772, cat: TV, desc: "TV - Its Always Sunny in Philadelphia"}
- {id: 988, cat: TV, desc: "TV - iZombie"}
- {id: 991, cat: TV, desc: "TV - Jane the Virgin"}
- {id: 290, cat: TV, desc: "TV - Jay Leno"}
- {id: 763, cat: TV, desc: "TV - Jersey Shore"}
- {id: 177, cat: TV, desc: "TV - Joe Rogan Questions Everything"}
- {id: 110, cat: TV, desc: "TV - Joey"}
- {id: 196, cat: TV, desc: "TV - Justice League Unlimited"}
- {id: 686, cat: TV, desc: "TV - Justified"}
- {id: 412, cat: TV, desc: "TV - kabachitare!"}
- {id: 738, cat: TV, desc: "TV - Killer Contact"}
- {id: 349, cat: TV, desc: "TV - Killer Instinct"}
- {id: 197, cat: TV, desc: "TV - Kim Possible"}
- {id: 741, cat: TV, desc: "TV - King"}
- {id: 933, cat: TV, desc: "TV - King and Maxwel"}
- {id: 350, cat: TV, desc: "TV - King Of The Hill"}
- {id: 351, cat: TV, desc: "TV - Kitchen Confidential"}
- {id: 790, cat: TV, desc: "TV - Kitchen Nightmares US"}
- {id: 348, cat: TV, desc: "TV - Kolchak The Night Stalker"}
- {id: 241, cat: TV, desc: "TV - Koot en Bie"}
- {id: 198, cat: TV, desc: "TV - Kung Fu"}
- {id: 199, cat: TV, desc: "TV - La Femme Nikita"}
- {id: 570, cat: TV, desc: "TV - LA Ink"}
- {id: 242, cat: TV, desc: "TV - Laguna Beach"}
- {id: 130, cat: TV, desc: "TV - Las Vegas"}
- {id: 843, cat: TV, desc: "TV - Last Man Standing"}
- {id: 867, cat: TV, desc: "TV - Last Resort"}
- {id: 200, cat: TV, desc: "TV - Late Night with Conan O'Brien"}
- {id: 115, cat: TV, desc: "TV - Law And Order"}
- {id: 591, cat: TV, desc: "TV - Law and Order UK"}
- {id: 243, cat: TV, desc: "TV - Le Cameleon"}
- {id: 578, cat: TV, desc: "TV - Legend of the Seeker"}
- {id: 590, cat: TV, desc: "TV - Legends"}
- {id: 898, cat: TV, desc: "TV - Legit"}
- {id: 638, cat: TV, desc: "TV - Level3"}
- {id: 656, cat: TV, desc: "TV - Leverage"}
- {id: 618, cat: TV, desc: "TV - Lie To Me"}
- {id: 650, cat: TV, desc: "TV - Life"}
- {id: 353, cat: TV, desc: "TV - Life on Mars"}
- {id: 716, cat: TV, desc: "TV - Lights Out"}
- {id: 244, cat: TV, desc: "TV - Line Of Fire"}
- {id: 504, cat: TV, desc: "TV - Little Britain"}
- {id: 665, cat: TV, desc: "TV - Little Mosque on the Prairie"}
- {id: 148, cat: TV, desc: "TV - Long Island Medium"}
- {id: 914, cat: TV, desc: "TV - Longmire"}
- {id: 354, cat: TV, desc: "TV - Los Serrano"}
- {id: 111, cat: TV, desc: "TV - Lost"}
- {id: 314, cat: TV, desc: "TV - Lost Girl"}
- {id: 858, cat: TV, desc: "TV - Louie"}
- {id: 726, cat: TV, desc: "TV - Love Bites"}
- {id: 937, cat: TV, desc: "TV - Low Winter Sun"}
- {id: 956, cat: TV, desc: "TV - Lucha Underground"}
- {id: 980, cat: TV, desc: "TV - Lucifer"}
- {id: 503, cat: TV, desc: "TV - Lucky Louie"}
- {id: 687, cat: TV, desc: "TV - Luther"}
- {id: 157, cat: TV, desc: "TV - MacGyver"}
- {id: 705, cat: TV, desc: "TV - Mad Love"}
- {id: 826, cat: TV, desc: "TV - Mad Men"}
- {id: 869, cat: TV, desc: "TV - Made in Jersey"}
- {id: 355, cat: TV, desc: "TV - MADtv"}
- {id: 871, cat: TV, desc: "TV - Major Crimes"}
- {id: 667, cat: TV, desc: "TV - Make It or Break It"}
- {id: 357, cat: TV, desc: "TV - Malcolm In The Middle"}
- {id: 662, cat: TV, desc: "TV - Man vs Wild"}
- {id: 759, cat: TV, desc: "TV - Marvels Agents of S.H.I.E.L.D"}
- {id: 910, cat: TV, desc: "TV - MasterChef US"}
- {id: 358, cat: TV, desc: "TV - Masters Of Horror"}
- {id: 824, cat: TV, desc: "TV - Masters of Sex"}
- {id: 291, cat: TV, desc: "TV - Medium"}
- {id: 617, cat: TV, desc: "TV - Melrose Place"}
- {id: 688, cat: TV, desc: "TV - Memphis Beat"}
- {id: 905, cat: TV, desc: "TV - Men at Work"}
- {id: 645, cat: TV, desc: "TV - Men of a Certain Age"}
- {id: 633, cat: TV, desc: "TV - Mercy"}
- {id: 579, cat: TV, desc: "TV - Merlin"}
- {id: 359, cat: TV, desc: "TV - Miami Ink"}
- {id: 825, cat: TV, desc: "TV - Midsomer Murders"}
- {id: 783, cat: TV, desc: "TV - Mike and Molly"}
- {id: 823, cat: TV, desc: "TV - Mind Games"}
- {id: 246, cat: TV, desc: "TV - Mind of Mencia"}
- {id: 313, cat: TV, desc: "TV - Misfits"}
- {id: 842, cat: TV, desc: "TV - Missing"}
- {id: 647, cat: TV, desc: "TV - Mistresses US"}
- {id: 179, cat: TV, desc: "TV - Mixology"}
- {id: 632, cat: TV, desc: "TV - Modern Family"}
- {id: 245, cat: TV, desc: "TV - Modern Marvels"}
- {id: 398, cat: TV, desc: "TV - Mom"}
- {id: 201, cat: TV, desc: "TV - Monk"}
- {id: 361, cat: TV, desc: "TV - Monty Pythons Flying Circus"}
- {id: 907, cat: TV, desc: "TV - Motive"}
- {id: 247, cat: TV, desc: "TV - Mr Bean"}
- {id: 992, cat: TV, desc: "TV - Mr. Robot"}
- {id: 356, cat: TV, desc: "TV - MST3K"}
- {id: 292, cat: TV, desc: "TV - My Favorite Martian"}
- {id: 792, cat: TV, desc: "TV - My Ghost Story"}
- {id: 999, cat: TV, desc: "TV - My Little Pony - Friendship is Magic"}
- {id: 362, cat: TV, desc: "TV - My Name Is Earl"}
- {id: 202, cat: TV, desc: "TV - My Restaurant Rules"}
- {id: 193, cat: TV, desc: "TV - Mythbusters"}
- {id: 940, cat: TV, desc: "TV - Naked And Afraid"}
- {id: 203, cat: TV, desc: "TV - NASA 50 Years Of Space Exploration"}
- {id: 899, cat: TV, desc: "TV - Nashville"}
- {id: 636, cat: TV, desc: "TV - National Geographic"}
- {id: 120, cat: TV, desc: "TV - NCIS"}
- {id: 920, cat: TV, desc: "TV - Necessary Roughness"}
- {id: 841, cat: TV, desc: "TV - New Girl"}
- {id: 957, cat: TV, desc: "TV - New Japan Pro Wrestling"}
- {id: 311, cat: TV, desc: "TV - NewGamePlus"}
- {id: 363, cat: TV, desc: "TV - Night Stalker"}
- {id: 722, cat: TV, desc: "TV - Nikita"}
- {id: 293, cat: TV, desc: "TV - Nip Tuck"}
- {id: 710, cat: TV, desc: "TV - No Ordinary Family"}
- {id: 294, cat: TV, desc: "TV - Numb3rs"}
- {id: 689, cat: TV, desc: "TV - Nurse Jackie"}
- {id: 703, cat: TV, desc: "TV - Off the Map"}
- {id: 833, cat: TV, desc: "TV - Once Upon a Time Once"}
- {id: 364, cat: TV, desc: "TV - One Tree Hill"}
- {id: 424, cat: TV, desc: "TV - Only Fools And Horses"}
- {id: 935, cat: TV, desc: "TV - Orange Is The New Black"}
- {id: 881, cat: TV, desc: "TV - Orphan Black"}
- {id: 113, cat: TV, desc: "TV - Other"}
- {id: 365, cat: TV, desc: "TV - Out of Practice S01E"}
- {id: 248, cat: TV, desc: "TV - Outer Limits"}
- {id: 646, cat: TV, desc: "TV - Outer Space Astronauts"}
- {id: 336, cat: TV, desc: "TV - Outlander"}
- {id: 723, cat: TV, desc: "TV - Outsourced"}
- {id: 249, cat: TV, desc: "TV - Over There"}
- {id: 757, cat: TV, desc: "TV - Pan Am"}
- {id: 640, cat: TV, desc: "TV - Paradox"}
- {id: 778, cat: TV, desc: "TV - Parenthood"}
- {id: 613, cat: TV, desc: "TV - Parks and Recreation"}
- {id: 250, cat: TV, desc: "TV - Passions"}
- {id: 414, cat: TV, desc: "TV - PBS NOW"}
- {id: 690, cat: TV, desc: "TV - Penn and Teller Bullshit"}
- {id: 945, cat: TV, desc: "TV - Penny Dreadful"}
- {id: 927, cat: TV, desc: "TV - Perception"}
- {id: 785, cat: TV, desc: "TV - Person of Interest"}
- {id: 366, cat: TV, desc: "TV - Phil of the Future"}
- {id: 204, cat: TV, desc: "TV - Pimp My Ride"}
- {id: 967, cat: TV, desc: "TV - Player Attack"}
- {id: 427, cat: TV, desc: "TV - Poker"}
- {id: 691, cat: TV, desc: "TV - Pretty Little Liars"}
- {id: 784, cat: TV, desc: "TV - Prime Suspect US"}
- {id: 734, cat: TV, desc: "TV - Primeval"}
- {id: 229, cat: TV, desc: "TV - Prison Break"}
- {id: 692, cat: TV, desc: "TV - Private Practice"}
- {id: 368, cat: TV, desc: "TV - Project Runway"}
- {id: 663, cat: TV, desc: "TV - Psych"}
- {id: 205, cat: TV, desc: "TV - Punkd"}
- {id: 803, cat: TV, desc: "TV - QI"}
- {id: 982, cat: TV, desc: "TV - Quantico"}
- {id: 251, cat: TV, desc: "TV - Quantum Leap"}
- {id: 993, cat: TV, desc: "TV - Queen of the South"}
- {id: 252, cat: TV, desc: "TV - Queer as Folk"}
- {id: 714, cat: TV, desc: "TV - Raising Hope"}
- {id: 317, cat: TV, desc: "TV - Ravenswood"}
- {id: 936, cat: TV, desc: "TV - Ray Donovan"}
- {id: 594, cat: TV, desc: "TV - Ray Mears Northern Wilderness"}
- {id: 822, cat: TV, desc: "TV - Real Time with Bill Maher"}
- {id: 369, cat: TV, desc: "TV - Reba"}
- {id: 885, cat: TV, desc: "TV - Rectify"}
- {id: 206, cat: TV, desc: "TV - Red Dwarf"}
- {id: 906, cat: TV, desc: "TV - Red Widow"}
- {id: 117, cat: TV, desc: "TV - ReGenesis"}
- {id: 854, cat: TV, desc: "TV - Reign"}
- {id: 370, cat: TV, desc: "TV - Related"}
- {id: 327, cat: TV, desc: "TV - Remedy"}
- {id: 253, cat: TV, desc: "TV - Remington Steele"}
- {id: 254, cat: TV, desc: "TV - Reno 911"}
- {id: 207, cat: TV, desc: "TV - Rescue Me"}
- {id: 576, cat: TV, desc: "TV - Resurrection"}
- {id: 295, cat: TV, desc: "TV - Reunion"}
- {id: 208, cat: TV, desc: "TV - Revelations"}
- {id: 760, cat: TV, desc: "TV - Revenge"}
- {id: 859, cat: TV, desc: "TV - Revolution"}
- {id: 312, cat: TV, desc: "TV - Rewind"}
- {id: 768, cat: TV, desc: "TV - Ringer"}
- {id: 604, cat: TV, desc: "TV - Rip Off Britain"}
- {id: 693, cat: TV, desc: "TV - River Monsters"}
- {id: 929, cat: TV, desc: "TV - Rizzoli and Isles"}
- {id: 209, cat: TV, desc: "TV - Robot Chicken"}
- {id: 888, cat: TV, desc: "TV - Rogue"}
- {id: 944, cat: TV, desc: "TV - ROH-Wrestling"}
- {id: 255, cat: TV, desc: "TV - Rome"}
- {id: 849, cat: TV, desc: "TV - Rookie Blue"}
- {id: 694, cat: TV, desc: "TV - Royal Pains"}
- {id: 695, cat: TV, desc: "TV - Rubicon"}
- {id: 807, cat: TV, desc: "TV - Rules of Engagement"}
- {id: 372, cat: TV, desc: "TV - Ruri no Shima"}
- {id: 892, cat: TV, desc: "TV - Rush"}
- {id: 555, cat: TV, desc: "TV - Russian TV programs"}
- {id: 789, cat: TV, desc: "TV - Salem"}
- {id: 605, cat: TV, desc: "TV - Sanctuary"}
- {id: 776, cat: TV, desc: "TV - Satisfaction US"}
- {id: 373, cat: TV, desc: "TV - Saturday Night Live"}
- {id: 915, cat: TV, desc: "TV - Save Me"}
- {id: 696, cat: TV, desc: "TV - Saving Grace"}
- {id: 931, cat: TV, desc: "TV - Saving Hope"}
- {id: 844, cat: TV, desc: "TV - Scandal"}
- {id: 344, cat: TV, desc: "TV - Scorpion"}
- {id: 987, cat: TV, desc: "TV - Scream"}
- {id: 138, cat: TV, desc: "TV - Scrubs"}
- {id: 304, cat: TV, desc: "TV - Sean Saves The World"}
- {id: 715, cat: TV, desc: "TV - Secret Diary Of A Call Girl"}
- {id: 210, cat: TV, desc: "TV - Seinfeld"}
- {id: 296, cat: TV, desc: "TV - Sex and The City"}
- {id: 708, cat: TV, desc: "TV - Shameless"}
- {id: 375, cat: TV, desc: "TV - Sin Rastro"}
- {id: 737, cat: TV, desc: "TV - Single Ladies"}
- {id: 211, cat: TV, desc: "TV - Six Feet Under"}
- {id: 697, cat: TV, desc: "TV - Skins"}
- {id: 376, cat: TV, desc: "TV - Sleeper Cell"}
- {id: 112, cat: TV, desc: "TV - Sleepy Hollow"}
- {id: 256, cat: TV, desc: "TV - Sliders"}
- {id: 137, cat: TV, desc: "TV - Smallville"}
- {id: 830, cat: TV, desc: "TV - Smash"}
- {id: 649, cat: TV, desc: "TV - So You Think You Can Dance"}
- {id: 569, cat: TV, desc: "TV - Sons of Anarchy"}
- {id: 815, cat: TV, desc: "TV - Sons of Guns"}
- {id: 212, cat: TV, desc: "TV - South Park"}
- {id: 718, cat: TV, desc: "TV - Southland"}
- {id: 257, cat: TV, desc: "TV - Space 1999"}
- {id: 297, cat: TV, desc: "TV - Space Above and Beyond"}
- {id: 631, cat: TV, desc: "TV - Spartacus"}
- {id: 845, cat: TV, desc: "TV - Spike TV"}
- {id: 607, cat: TV, desc: "TV - Spooks"}
- {id: 131, cat: TV, desc: "TV - Sports Illustrated"}
- {id: 159, cat: TV, desc: "TV - Sports related"}
- {id: 378, cat: TV, desc: "TV - Stacked"}
- {id: 379, cat: TV, desc: "TV - Star Trek"}
- {id: 563, cat: TV, desc: "TV - Star Wars The Clone Wars"}
- {id: 615, cat: TV, desc: "TV - Star-Crossed"}
- {id: 139, cat: TV, desc: "TV - Star-Trek Enterprise"}
- {id: 144, cat: TV, desc: "TV - Star-Trek The Next Generation"}
- {id: 380, cat: TV, desc: "TV - Stargate"}
- {id: 123, cat: TV, desc: "TV - Stargate Atlantis"}
- {id: 124, cat: TV, desc: "TV - StarGate SG1"}
- {id: 562, cat: TV, desc: "TV - Stargate Universe"}
- {id: 258, cat: TV, desc: "TV - Starved"}
- {id: 213, cat: TV, desc: "TV - Stella"}
- {id: 614, cat: TV, desc: "TV - Steven Seagal Lawman"}
- {id: 381, cat: TV, desc: "TV - Still Standing"}
- {id: 857, cat: TV, desc: "TV - Strike Back"}
- {id: 528, cat: TV, desc: "TV - Studio 60 on the Sunset Strip"}
- {id: 838, cat: TV, desc: "TV - Suburgatory"}
- {id: 761, cat: TV, desc: "TV - Suits"}
- {id: 214, cat: TV, desc: "TV - Summerland"}
- {id: 400, cat: TV, desc: "TV - Super Fun Night"}
- {id: 298, cat: TV, desc: "TV - Supernatural"}
- {id: 299, cat: TV, desc: "TV - Surface"}
- {id: 382, cat: TV, desc: "TV - Survivor"}
- {id: 215, cat: TV, desc: "TV - Survivors"}
- {id: 847, cat: TV, desc: "TV - Swamp People"}
- {id: 863, cat: TV, desc: "TV - Switched at Birth"}
- {id: 153, cat: TV, desc: "TV - Tattoo Nightmares"}
- {id: 217, cat: TV, desc: "TV - Teen Titans"}
- {id: 731, cat: TV, desc: "TV - Teen Wolf"}
- {id: 764, cat: TV, desc: "TV - Terra Nova"}
- {id: 119, cat: TV, desc: "TV - That 70s Show"}
- {id: 316, cat: TV, desc: "TV - The 100"}
- {id: 168, cat: TV, desc: "TV - The 4400"}
- {id: 300, cat: TV, desc: "TV - The Adventures of Sherlock Holmes"}
- {id: 185, cat: TV, desc: "TV - The After"}
- {id: 383, cat: TV, desc: "TV - The Amazing Race"}
- {id: 887, cat: TV, desc: "TV - The Americans"}
- {id: 301, cat: TV, desc: "TV - The Apprentice"}
- {id: 384, cat: TV, desc: "TV - The Bernie Mac Show"}
- {id: 583, cat: TV, desc: "TV - The Big Bang Theory"}
- {id: 829, cat: TV, desc: "TV - The Big C"}
- {id: 572, cat: TV, desc: "TV - The Biggest Loser"}
- {id: 581, cat: TV, desc: "TV - The Blacklist"}
- {id: 410, cat: TV, desc: "TV - The Boondocks"}
- {id: 608, cat: TV, desc: "TV - The Border"}
- {id: 775, cat: TV, desc: "TV - The Borgias"}
- {id: 923, cat: TV, desc: "TV - The Bridge US"}
- {id: 711, cat: TV, desc: "TV - The Cape"}
- {id: 730, cat: TV, desc: "TV - The Carrie Diaries"}
- {id: 586, cat: TV, desc: "TV - The Cleveland Show"}
- {id: 896, cat: TV, desc: "TV - The Client List"}
- {id: 218, cat: TV, desc: "TV - The Closer"}
- {id: 272, cat: TV, desc: "TV - The Colbert Report"}
- {id: 219, cat: TV, desc: "TV - The Comeback"}
- {id: 510, cat: TV, desc: "TV - The Contender"}
- {id: 758, cat: TV, desc: "TV - The Crazy Ones"}
- {id: 114, cat: TV, desc: "TV - The Daily Show"}
- {id: 856, cat: TV, desc: "TV - The Dead Files"}
- {id: 220, cat: TV, desc: "TV - The Dead Zone"}
- {id: 189, cat: TV, desc: "TV - The Divide"}
- {id: 386, cat: TV, desc: "TV - The Dog Whisperer"}
- {id: 702, cat: TV, desc: "TV - The Event"}
- {id: 610, cat: TV, desc: "TV - The F Word"}
- {id: 639, cat: TV, desc: "TV - The Family"}
- {id: 835, cat: TV, desc: "TV - The Finder"}
- {id: 834, cat: TV, desc: "TV - The Firm"}
- {id: 973, cat: TV, desc: "TV - The Flash"}
- {id: 877, cat: TV, desc: "TV - The Following"}
- {id: 635, cat: TV, desc: "TV - The Forgotten"}
- {id: 932, cat: TV, desc: "TV - The Fosters"}
- {id: 816, cat: TV, desc: "TV - The Game"}
- {id: 766, cat: TV, desc: "TV - The Gates"}
- {id: 259, cat: TV, desc: "TV - The Girls Next Door"}
- {id: 740, cat: TV, desc: "TV - The Glades"}
- {id: 587, cat: TV, desc: "TV - The Goldbergs"}
- {id: 648, cat: TV, desc: "TV - The Good Wife"}
- {id: 912, cat: TV, desc: "TV - The Goodwin Games"}
- {id: 278, cat: TV, desc: "TV - The Haunting Of"}
- {id: 903, cat: TV, desc: "TV - The Hero"}
- {id: 655, cat: TV, desc: "TV - The Hills"}
- {id: 221, cat: TV, desc: "TV - The Inside"}
- {id: 595, cat: TV, desc: "TV - The Jeff Dunham Show"}
- {id: 387, cat: TV, desc: "TV - The Jetsons"}
- {id: 827, cat: TV, desc: "TV - The Killing"}
- {id: 388, cat: TV, desc: "TV - The King Of Queens"}
- {id: 321, cat: TV, desc: "TV - The Knick"}
- {id: 271, cat: TV, desc: "TV - The L Word"}
- {id: 609, cat: TV, desc: "TV - The League"}
- {id: 897, cat: TV, desc: "TV - The Leftovers"}
- {id: 808, cat: TV, desc: "TV - The Life and Times of Tim"}
- {id: 924, cat: TV, desc: "TV - The Listener"}
- {id: 222, cat: TV, desc: "TV - The Lone Gunmen"}
- {id: 152, cat: TV, desc: "TV - The Lost World"}
- {id: 643, cat: TV, desc: "TV - The Mentalist"}
- {id: 878, cat: TV, desc: "TV - The Michael J Fox"}
- {id: 630, cat: TV, desc: "TV - The Middle"}
- {id: 405, cat: TV, desc: "TV - The Millers"}
- {id: 901, cat: TV, desc: "TV - The Mindy Project"}
- {id: 860, cat: TV, desc: "TV - The Mob Doctor"}
- {id: 870, cat: TV, desc: "TV - The Musketeers"}
- {id: 239, cat: TV, desc: "TV - The Mysteries Of Laura"}
- {id: 938, cat: TV, desc: "TV - The Newsroom"}
- {id: 109, cat: TV, desc: "TV - The O.C."}
- {id: 308, cat: TV, desc: "TV - The Office"}
- {id: 319, cat: TV, desc: "TV - The Originals"}
- {id: 392, cat: TV, desc: "TV - The Others"}
- {id: 390, cat: TV, desc: "TV - The O`Reilly Factor"}
- {id: 698, cat: TV, desc: "TV - The Pacific"}
- {id: 302, cat: TV, desc: "TV - The PJs"}
- {id: 567, cat: TV, desc: "TV - The Practice"}
- {id: 260, cat: TV, desc: "TV - The Real World"}
- {id: 176, cat: TV, desc: "TV - The Red Road"}
- {id: 597, cat: TV, desc: "TV - The Replacements"}
- {id: 664, cat: TV, desc: "TV - The Sci Fi Guys"}
- {id: 393, cat: TV, desc: "TV - The Secret Adventures of Jules Verne"}
- {id: 786, cat: TV, desc: "TV - The Secret Circle"}
- {id: 668, cat: TV, desc: "TV - The Secret Life of the American Teenager"}
- {id: 735, cat: TV, desc: "TV - The Shadow Line"}
- {id: 223, cat: TV, desc: "TV - The Shield"}
- {id: 125, cat: TV, desc: "TV - The Simpsons"}
- {id: 423, cat: TV, desc: "TV - The Sopranos"}
- {id: 333, cat: TV, desc: "TV - The Strain"}
- {id: 236, cat: TV, desc: "TV - The Tomorrow People US"}
- {id: 699, cat: TV, desc: "TV - The Tudors"}
- {id: 611, cat: TV, desc: "TV - The Ultimate Fighter"}
- {id: 320, cat: TV, desc: "TV - The Unexplained Files"}
- {id: 721, cat: TV, desc: "TV - The Vampire Diaries"}
- {id: 654, cat: TV, desc: "TV - The Venture Bros"}
- {id: 725, cat: TV, desc: "TV - The Voice"}
- {id: 720, cat: TV, desc: "TV - The Walking Dead"}
- {id: 394, cat: TV, desc: "TV - The War At Home"}
- {id: 116, cat: TV, desc: "TV - The West Wing"}
- {id: 577, cat: TV, desc: "TV - The X Factor"}
- {id: 425, cat: TV, desc: "TV - Thief"}
- {id: 268, cat: TV, desc: "TV - Threshold"}
- {id: 796, cat: TV, desc: "TV - Thundercats"}
- {id: 216, cat: TV, desc: "TV - TLC Connections"}
- {id: 904, cat: TV, desc: "TV - TNA-Wrestling"}
- {id: 399, cat: TV, desc: "TV - Tonight Show With Jay Leno"}
- {id: 616, cat: TV, desc: "TV - Top Chef"}
- {id: 224, cat: TV, desc: "TV - Top Gear"}
- {id: 942, cat: TV, desc: "TV - Top Shot"}
- {id: 762, cat: TV, desc: "TV - Torchwood"}
- {id: 836, cat: TV, desc: "TV - Touch"}
- {id: 225, cat: TV, desc: "TV - Trailer Park Boys"}
- {id: 1001, cat: TV, desc: "TV - Transformers Prime"}
- {id: 733, cat: TV, desc: "TV - Treme"}
- {id: 303, cat: TV, desc: "TV - Tripping the Rift"}
- {id: 787, cat: TV, desc: "TV - Trophy Wife"}
- {id: 565, cat: TV, desc: "TV - True Blood"}
- {id: 180, cat: TV, desc: "TV - True Detective"}
- {id: 727, cat: TV, desc: "TV - Turn"}
- {id: 261, cat: TV, desc: "TV - Twin Peaks"}
- {id: 930, cat: TV, desc: "TV - Twisted"}
- {id: 401, cat: TV, desc: "TV - Two And A Half Men"}
- {id: 337, cat: TV, desc: "TV - Tyrant"}
- {id: 793, cat: TV, desc: "TV - UFC"}
- {id: 814, cat: TV, desc: "TV - Ugly Americans"}
- {id: 559, cat: TV, desc: "TV - Ugly Betty"}
- {id: 155, cat: TV, desc: "TV - UK"}
- {id: 934, cat: TV, desc: "TV - Under the Dome"}
- {id: 791, cat: TV, desc: "TV - Underbelly"}
- {id: 706, cat: TV, desc: "TV - Undercover Boss"}
- {id: 777, cat: TV, desc: "TV - Unforgettable"}
- {id: 129, cat: TV, desc: "TV - Unscripted"}
- {id: 739, cat: TV, desc: "TV - Unsealed Alien Files"}
- {id: 226, cat: TV, desc: "TV - Unsolved Mysteries"}
- {id: 868, cat: TV, desc: "TV - Up All Night"}
- {id: 262, cat: TV, desc: "TV - Urgences"}
- {id: 566, cat: TV, desc: "TV - V"}
- {id: 895, cat: TV, desc: "TV - Veep"}
- {id: 864, cat: TV, desc: "TV - Vegas"}
- {id: 121, cat: TV, desc: "TV - Veronica Mars"}
- {id: 908, cat: TV, desc: "TV - Vice"}
- {id: 402, cat: TV, desc: "TV - Viewtiful Joe"}
- {id: 799, cat: TV, desc: "TV - Vikings"}
- {id: 227, cat: TV, desc: "TV - Viva La Bam"}
- {id: 263, cat: TV, desc: "TV - Wanted"}
- {id: 593, cat: TV, desc: "TV - Warehouse 13"}
- {id: 995, cat: TV, desc: "TV - Wayward Pines"}
- {id: 264, cat: TV, desc: "TV - Weeds"}
- {id: 404, cat: TV, desc: "TV - Weird U S"}
- {id: 909, cat: TV, desc: "TV - Wentworth"}
- {id: 596, cat: TV, desc: "TV - When Ghosts Attack"}
- {id: 575, cat: TV, desc: "TV - White Collar"}
- {id: 406, cat: TV, desc: "TV - Whose Line Is It Anyway"}
- {id: 918, cat: TV, desc: "TV - Wilfred US"}
- {id: 135, cat: TV, desc: "TV - Will And Grace"}
- {id: 673, cat: TV, desc: "TV - Witches of East End"}
- {id: 408, cat: TV, desc: "TV - Without A Trace"}
- {id: 800, cat: TV, desc: "TV - Workaholics"}
- {id: 127, cat: TV, desc: "TV - WWE - Wrestling"}
- {id: 228, cat: TV, desc: "TV - X Files"}
- {id: 770, cat: TV, desc: "TV - X-Men"}
- {id: 265, cat: TV, desc: "TV - Young and the Restless"}
- {id: 801, cat: TV, desc: "TV - Young Justice"}
- {id: 889, cat: TV, desc: "TV - Zero Hour US"}
- {id: 1025, cat: TV, desc: "TV - HEVC/x265"}
- {id: 1026, cat: TV, desc: "TV - Divx/Xvid"}
- {id: 1027, cat: TV, desc: "TV - DVD"}
- {id: 1028, cat: TV, desc: "TV/HD - HD"}
- {id: 1029, cat: TV, desc: "TV - SVCD/VCD"}
#Apps
- {id: 7, cat: PC, desc: "Software"}
- {id: 416, cat: PC/Phone-Other, desc: "Software - Mobile"}
- {id: 532, cat: PC, desc: "Software - KeyGen / Tools"}
- {id: 17, cat: PC, desc: "Software - Linux"}
- {id: 27, cat: PC/Mac, desc: "Software - Mac"}
- {id: 232, cat: PC/Phone-Other, desc: "Software - Mobile phones"}
- {id: 18, cat: PC, desc: "Software - Other operating systems"}
- {id: 19, cat: PC, desc: "Software - Palm, PocketPC and IPAQ"}
- {id: 20, cat: PC, desc: "Software - Windows - CD/DVD Tools"}
- {id: 25, cat: PC, desc: "Software - Windows - Other"}
- {id: 21, cat: PC, desc: "Software - Windows - Photo Editing"}
- {id: 22, cat: PC, desc: "Software - Windows - Security"}
- {id: 23, cat: PC, desc: "Software - Windows - Sound Editing"}
- {id: 24, cat: PC, desc: "Software - Windows - Video Apps"}
#Games
- {id: 3, cat: PC/Games, desc: "Games"}
- {id: 136, cat: PC/Games, desc: "Games - fixes/patches"}
- {id: 422, cat: PC/Games, desc: "Games - Other"}
- {id: 26, cat: PC/Games, desc: "Games - Mac"}
- {id: 231, cat: Console, desc: "Games - Mobile phones"}
- {id: 627, cat: Console/NDS, desc: "Games - Nintendo DS"}
- {id: 11, cat: Console, desc: "Games - PS 2"}
- {id: 700, cat: Console/PS3, desc: "Games - PS 3"}
- {id: 12, cat: Console, desc: "Games - PS X"}
- {id: 158, cat: Console/PSP, desc: "Games - PSP"}
- {id: 13, cat: Console, desc: "Games - ROMS/Retro"}
- {id: 15, cat: Console, desc: "Games - Sega Saturn"}
- {id: 14, cat: PC/Games, desc: "Games - Video Demonstrations"}
- {id: 701, cat: Console/Wii, desc: "Games -Wii"}
- {id: 421, cat: PC/Games, desc: "Games - Windows"}
- {id: 10, cat: PC/Games, desc: "Games - Windows Kids Games"}
- {id: 16, cat: Console/Xbox, desc: "Games - XBox"}
- {id: 1017, cat: Console, desc: "Games - PS 1"}
- {id: 1018, cat: Console/Xbox 360, desc: "Games - Xbox 360"}
- {id: 1014, cat: Console/3DS, desc: "Games - Nintendo 3DS"}
- {id: 1015, cat: Console, desc: "Games - Dreamcast"}
- {id: 1016, cat: Console, desc: "Games - GameCube"}
#XXX
- {id: 533, cat: XXX, desc: "XXX"}
- {id: 943, cat: XXX, desc: "XXX - Animation/Hentai"}
- {id: 553, cat: XXX/DVD, desc: "XXX - DVD"}
- {id: 536, cat: XXX, desc: "XXX - Games"}
- {id: 948, cat: XXX/x264, desc: "XXX - HD Video"}
- {id: 535, cat: XXX/Imageset, desc: "XXX - Pictures"}
- {id: 552, cat: XXX, desc: "XXX - Video"}
- {id: 804, cat: XXX, desc: "XXX - Video 3D"}
- {id: 970, cat: XXX, desc: "XXX - Virtual Reality"}
- {id: 806, cat: XXX, desc: "XXX - Wallpapers"}
#Books
- {id: 2, cat: Books, desc: "Books"}
- {id: 625, cat: Books, desc: "Books - Adventure"}
- {id: 51, cat: Books, desc: "Books - Audio books"}
- {id: 848, cat: Books/Comics, desc: "Books - Comics"}
- {id: 624, cat: Books, desc: "Books - Crime"}
- {id: 623, cat: Books, desc: "Books - Drama"}
- {id: 50, cat: Books/Ebook, desc: "Books - Ebooks"}
- {id: 621, cat: Books, desc: "Books - Educational"}
- {id: 622, cat: Books, desc: "Books - Horror"}
- {id: 465, cat: Books/Magazines, desc: "Books - Magazines"}
- {id: 1000, cat: Books, desc: "Books - Sexual Fitness and Education"}
- {id: 626, cat: Books, desc: "Books - True Stories"}
#Other
- {id: 6, cat: Other, desc: "Pictures"}
- {id: 9, cat: Other, desc: "Other"}
- {id: 53, cat: Other, desc: "Pictures - Other"}
- {id: 52, cat: Other, desc: "Wallpapers"}
- {id: 80, cat: Other, desc: "Other - Articles"}
- {id: 143, cat: Other, desc: "Other - Comics"}
- {id: 85, cat: Other, desc: "Other - Funny clips"}
- {id: 81, cat: Other, desc: "Other - Manuals"}
- {id: 83, cat: Other, desc: "Other - Other"}
- {id: 413, cat: Other, desc: "Other - Radio shows"}
- {id: 82, cat: Other, desc: "Other - Religion"}
- {id: 874, cat: Other, desc: "Other - Subtitles"}
- {id: 557, cat: Other, desc: "Other - Training "}
- {id: 1021, cat: Other, desc: "Other - Tutorials"}
- {id: 1022, cat: Other, desc: "Other - Sounds"}
- {id: 1023, cat: Other, desc: "Other - Nulled Scripts"}
#Mobile
- {id: 752, cat: PC/Phone-Other, desc: "Mobile - Games for Android"}
- {id: 746, cat: PC/Phone-Other, desc: "Mobile - Games for Apple iPod, iPod Touch, iPad, iPhone"}
- {id: 745, cat: PC/Phone-Other, desc: "Mobile - Games for Java"}
- {id: 744, cat: PC/Phone-Other, desc: "Mobile - Games for Symbian"}
- {id: 743, cat: PC/Phone-Other, desc: "Mobile - Games for Windows Mobile"}
- {id: 517, cat: PC/Phone-Other, desc: "Mobile - Music"}
- {id: 554, cat: PC/Phone-Other, desc: "Mobile - Other"}
- {id: 748, cat: PC/Phone-Other, desc: "Mobile - Software - Other"}
- {id: 972, cat: PC/Phone-Other, desc: "Mobile - Software for Android"}
- {id: 749, cat: PC/Phone-Other, desc: "Mobile - Software for Apple iPad, iPhone, iPod Touch"}
- {id: 747, cat: PC/Phone-Other, desc: "Mobile - Software for Windows Mobile"}
- {id: 428, cat: PC/Phone-Other, desc: "Mobile - Tv"}
- {id: 417, cat: PC/Phone-Other, desc: "Mobile - Video"}
- {id: 750, cat: PC/Phone-Other, desc: "Mobile - Video for Apple iPad, iPhone, iPod Touch"}
modes:
search: [q]
tv-search: [q, season, ep]
movie-search: [q]
settings: []
search:
paths:
- path: "{{if .Keywords}}search/?search={{ .Keywords}}{{else}}{{end}}"
rows:
selector: tr[class^="tlr"]
fields:
title:
selector: td.tli a
category:
selector: td a[href^="/category/"]
attribute: href
filters:
- name: split
args: ["/", 2]
details:
selector: td.tli a
attribute: href
download:
selector: td a[href^="magnet:?xt="]
attribute: href
date:
selector: td:nth-last-of-type(5)
filters:
- name: timeago
size:
selector: td:nth-last-of-type(4)
seeders:
text: 0
leechers:
text: 0
seeders:
optional: true
selector: td.sy
leechers:
optional: true
selector: td.ly
downloadvolumefactor:
text: "0"
uploadvolumefactor:
text: "1"

View File

@@ -47,11 +47,41 @@
paths:
- path: "{{ if .Keywords }}buscar/descargas/{{ .Config.category }}/{{ .Keywords }}?search=Buscar{{else}}descargas{{end}}"
- path: "{{ if .Keywords }}buscar/descargas/{{ .Config.category }}/{{ .Keywords }}?search=Buscar&page=2{{else}}descargas{{end}}"
keywordsfilters:
- name: re_replace #remove S/EXX from search string
args: ["(S1)", ""]
- name: re_replace #remove S/EXX from search string
args: ["(S2)", "segunda temporada"]
- name: re_replace #remove S/EXX from search string
args: ["(S3)", "tercera temporada"]
- name: re_replace #remove S/EXX from search string
args: ["E([0-9]+)", "$1"]
rows:
selector: table#descargas > tbody > tr:has(td:has(a[href^="magnet:?"]))
fields:
title:
selector: td.tit a
filters:
- name: re_replace
args: ["\\/", " "]
- name: re_replace
args: ["\\(", ""]
- name: re_replace
args: ["\\)", ""]
- name: re_replace
args: ["([A-z]*) temporada", ""]
- name: re_replace
args: ["S[pP]rimera", ""]
- name: re_replace
args: ["S[sS]egunda", ""]
- name: re_replace
args: ["S[tT]ercera", ""]
- name: re_replace
args: ["S([0-9]+) - Episodio ([0-9]+)", "$2"]
- name: re_replace
args: ["- Episodio ([0-9]*)", "$1"]
- name: append
args: " [spanish]"
details:
selector: td.tit a
attribute: href

View File

@@ -0,0 +1,151 @@
---
# By LA5T for https://gay-torrents.org (29.07.2018 22:55 UTC+2)
#
site: gay-torrentsorg
name: gay-torrents.org
description: "Tracker for GAY XXX, movies, TV, books and PC."
language: en-us
type: semi-private
encoding: UTF-8
links:
- https://gay-torrents.org
- https://gay-area.org/
settings:
- name: username
type: text
label: Username
- name: password
type: password
label: Password
- name: active
type: select
label: Status
default: 0
options:
0: "Active and Inactive"
1: Active
2: Inactive
- name: info_categories
type: info
label: "Hidden categories"
default: "Results for categories hidden in profile will not be visible."
- name: info_results
type: info
label: "Search results"
default: "You can increase the number of search results in your profile.<br />Default is 15."
caps:
categorymappings:
- {id: 15, cat: XXX, desc: "Amateur"}
- {id: 16, cat: XXX, desc: "Anal"}
- {id: 42, cat: XXX, desc: "Animation"}
- {id: 18, cat: XXX, desc: "Asian"}
- {id: 19, cat: XXX, desc: "Bareback"}
- {id: 20, cat: XXX, desc: "Bears"}
- {id: 22, cat: XXX, desc: "Bisexual"}
- {id: 21, cat: XXX, desc: "Black"}
- {id: 23, cat: XXX, desc: "Chubs"}
- {id: 25, cat: XXX, desc: "Cross Generation"}
- {id: 51, cat: XXX, desc: "Doctor/Medical"}
- {id: 27, cat: XXX, desc: "Fetish"}
- {id: 28, cat: XXX, desc: "Group Sex"}
- {id: 30, cat: XXX, desc: "Hunks"}
- {id: 52, cat: XXX, desc: "Interracial"}
- {id: 68, cat: XXX, desc: "Homo Erotic"}
- {id: 68, cat: Movies, desc: "Homo Erotic"}
- {id: 68, cat: TV, desc: "Homo Erotic"}
- {id: 68, cat: Other, desc: "Homo Erotic"}
- {id: 32, cat: XXX, desc: "Latino"}
- {id: 50, cat: XXX, desc: "Middle Eastern"}
- {id: 33, cat: XXX, desc: "Military"}
- {id: 34, cat: XXX, desc: "Oral-Sex"}
- {id: 40, cat: Other, desc: "Other"}
- {id: 35, cat: XXX, desc: "Solo"}
- {id: 36, cat: XXX, desc: "Transsexual"}
- {id: 37, cat: XXX, desc: "Twinks"}
- {id: 38, cat: XXX, desc: "Vintage"}
- {id: 39, cat: XXX, desc: "Wrestling"}
- {id: 17, cat: PC, desc: "Applications"}
- {id: 31, cat: XXX/Imageset, desc: "Images"}
- {id: 49, cat: Books, desc: "Books"}
- {id: 41, cat: Movies, desc: "Non-Porn"}
- {id: 41, cat: TV, desc: "Non-Porn"}
- {id: 41, cat: Other, desc: "Non-Porn"}
modes:
search: [q]
login:
method: post
path: login.php
inputs:
uid: "{{ .Config.username }}"
pwd: "{{ .Config.password }}"
error:
- selector: div.fixed_width:nth-child(4) > span:contains("Incorrect")
test:
path: usercp.php
search:
paths:
- path: torrents_beta.php
method: get
inputs:
$raw: "{{range .Categories}}category[]={{.}}&{{end}}"
search: "{{ .Query.Keywords }}"
active: "{{ .Config.active }}"
rows:
selector: div.torrent
fields:
title:
selector: div:nth-child(2) > div:nth-child(1) > a:nth-child(1)
category:
selector: a[href^="torrents_beta.php?category="]
attribute: href
filters:
- name: querystring
args: category
details:
selector: a[href^="details.php?id="]
attribute: href
banner:
optional: true
selector: a.screenshot
attribute: rel
grabs:
selector: div.downloadTimes
filters:
- name: replace
args: ["No downloads yet", "0"]
- name: regexp
args: ([\d,]+)
comments:
selector: a[href^="details.php?id="]
attribute: href
download:
selector: a[href^="download.php?id="]
attribute: href
size:
selector: div.size
seeders:
selector: div.downloadPeers div:nth-child(1) > a
leechers:
selector: div.downloadPeers > div:nth-child(2) > a
date:
selector: div.date
filters:
- name: re_replace
args: ["on (\\d{2}:\\d{2}) (\\d{2})-([a-zA-Z]{3})-(\\d{4})", "$2 $3 $4 $1"]
- name: append
args: " +01:00"
- name: dateparse
args: "02 Jan 2006 15:04 -07:00"
downloadvolumefactor:
case:
"div:nth-child(2) > div:nth-child(3) > a:contains(\"FREE!\")": 0
"div:nth-child(2) > div:nth-child(3) > a:contains(\"-50%\")": 0.5
"div:nth-child(2) > div:nth-child(3) > a:contains(\"-25%\")": 0.25
"*": 1
uploadvolumefactor:
case:
"*": 1

View File

@@ -1,52 +1,80 @@
---
# Update by LA5T based on the orignial 'gaytorrentru.yml'
# 29.07.2018 23:02 UTC+2
#
site: gaytorrentru
name: GayTorrent.ru
description: "World largest gay porn library for free with a stunning forum and 24/7 Chat"
name: GAYtorrent.ru
description: "World largest gay porn library for free with a stunning forum and 24/7 chat."
language: en-us
type: private
encoding: UTF-8
links:
- https://www.gaytorrent.ru/
settings:
- name: username
type: text
label: Username
- name: password
type: password
label: Password
- name: incldead
type: select
label: Status
default: 1
options:
0: Active
1: "Active and Inactive"
2: Inactive
- name: info
type: info
label: "Hidden categories"
default: "For results in the following categories you must edit your profile.<br />- Straight<br />- Bisexual<br />- Scat"
caps:
categorymappings:
- {id: 62 , cat: XXX , desc: "Amateur"}
- {id: 29 , cat: XXX , desc: "Anal"}
- {id: 46 , cat: XXX , desc: "Anime Games"}
- {id: 30 , cat: XXX , desc: "Asian"}
- {id: 43 , cat: XXX , desc: "Bareback"}
- {id: 19 , cat: XXX , desc: "BDSM"}
- {id: 17 , cat: XXX , desc: "Bears"}
- {id: 44 , cat: XXX , desc: "Black"}
- {id: 50 , cat: Books , desc: "Books & Magazines"}
- {id: 9 , cat: XXX , desc: "Chubbies"}
- {id: 7 , cat: XXX , desc: "Clips"}
- {id: 48 , cat: Books/Comics , desc: "Comic & Yaoi"}
- {id: 5 , cat: XXX , desc: "Daddies / Sons"}
- {id: 34 , cat: XXX , desc: "Fetish"}
- {id: 27 , cat: XXX , desc: "Grey / Older"}
- {id: 32 , cat: XXX , desc: "Group-Sex"}
- {id: 63 , cat: XXX , desc: "Homemade"}
- {id: 12 , cat: XXX , desc: "Hunks"}
- {id: 33 , cat: XXX , desc: "Images"}
- {id: 53 , cat: XXX , desc: "Interracial"}
- {id: 57 , cat: XXX , desc: "Jocks"}
- {id: 35 , cat: XXX , desc: "Latino"}
- {id: 36 , cat: XXX , desc: "Mature"}
- {id: 58 , cat: PC , desc: "Media Programs"}
- {id: 37 , cat: XXX , desc: "Member"}
- {id: 54 , cat: XXX , desc: "Middle Eastern"}
- {id: 38 , cat: XXX , desc: "Military"}
- {id: 39 , cat: XXX , desc: "Oral-Sex"}
- {id: 47 , cat: XXX , desc: "Shemale"}
- {id: 56 , cat: XXX , desc: "Softcore"}
- {id: 40 , cat: XXX , desc: "Solo"}
- {id: 45 , cat: Movies , desc: "Themed Movie"}
- {id: 1 , cat: TV , desc: "TV / Episodes"}
- {id: 41 , cat: XXX , desc: "Twinks"}
- {id: 42 , cat: XXX , desc: "Vintage"}
- {id: 51 , cat: XXX , desc: "Voyeur"}
- {id: 65 , cat: XXX , desc: "Wrestling and Sports"}
- {id: 28 , cat: XXX , desc: "Youngblood"}
- {id: 62, cat: XXX, desc: "Amateur"}
- {id: 29, cat: XXX, desc: "Anal"}
- {id: 46, cat: XXX, desc: "Anime Games"}
- {id: 30, cat: XXX, desc: "Asian"}
- {id: 43, cat: XXX, desc: "Bareback"}
- {id: 19, cat: XXX, desc: "BDSM"}
- {id: 17, cat: XXX, desc: "Bears"}
- {id: 44, cat: XXX, desc: "Black"}
- {id: 50, cat: Books, desc: "Books & Magazines"}
- {id: 9, cat: XXX, desc: "Chubbies"}
- {id: 7, cat: XXX, desc: "Clips"}
- {id: 48, cat: Books/Comics, desc: "Comic & Yaoi"}
- {id: 5, cat: XXX, desc: "Daddies / Sons"}
- {id: 34, cat: XXX, desc: "Fetish"}
- {id: 27, cat: XXX, desc: "Grey / Older"}
- {id: 32, cat: XXX, desc: "Group-Sex"}
- {id: 63, cat: XXX, desc: "Homemade"}
- {id: 12, cat: XXX, desc: "Hunks"}
- {id: 33, cat: XXX/Imageset, desc: "Images"}
- {id: 53, cat: XXX, desc: "Interracial"}
- {id: 57, cat: XXX, desc: "Jocks"}
- {id: 35, cat: XXX, desc: "Latino"}
- {id: 36, cat: XXX, desc: "Mature"}
- {id: 58, cat: PC, desc: "Media Programs"}
- {id: 37, cat: XXX, desc: "Member"}
- {id: 54, cat: XXX, desc: "Middle Eastern"}
- {id: 38, cat: XXX, desc: "Military"}
- {id: 39, cat: XXX, desc: "Oral-Sex"}
- {id: 47, cat: XXX, desc: "Shemale"}
- {id: 56, cat: XXX, desc: "Softcore"}
- {id: 40, cat: XXX, desc: "Solo"}
- {id: 45, cat: Movies, desc: "Themed Movie"}
- {id: 1, cat: TV, desc: "TV / Episodes"}
- {id: 41, cat: XXX, desc: "Twinks"}
- {id: 42, cat: XXX, desc: "Vintage"}
- {id: 51, cat: XXX, desc: "Voyeur"}
- {id: 65, cat: XXX, desc: "Wrestling and Sports"}
- {id: 28, cat: XXX, desc: "Youngblood"}
- {id: 59, cat: XXX, desc: "Bisexual"}
- {id: 61, cat: XXX, desc: "Straight older"}
- {id: 60, cat: XXX, desc: "Straight younger"}
- {id: 64, cat: XXX, desc: "Scat"}
modes:
search: [q]
@@ -65,7 +93,7 @@
inputs:
$raw: "{{range .Categories}}c{{.}}=1&{{end}}"
search: "{{ .Query.Keywords }}"
incldead: "0" # Searches only for alive torrents
incldead: "{{ .Config.incldead }}"
rows:
selector: table.browse_result > tbody > tr:has(a[href^="details.php?id="])
fields:
@@ -89,12 +117,12 @@
selector: .tfiles
filters:
- name: regexp
args: ([\d]+)
args: ([\d,]+)
size:
selector: .tsize
seeders:
optional: true
selector: a[href$="&toseeders=1"]
selector: a[href$="&toseeders=1"], span.red
leechers:
optional: true
selector: a[href$="&todlers=1"]
@@ -102,13 +130,13 @@
selector: .tadded
filters:
- name: re_replace
args: ["(\\d{4}-\\d{2}-\\d{2})(\\d{2}:\\d{2}:\\d{2})(.*)","$1 $2"]
args: ["(\\d{4}-\\d{2}-\\d{2})(\\d{2}:\\d{2}:\\d{2}).*", "$1 $2"]
- name: dateparse
args: "2006-01-02 15:04:05"
downloadvolumefactor:
case:
"td:nth-child(3) > div > nobr > font[color=\"yellow\"]": "0"
"*": "1"
"td:nth-child(3) > div > nobr > font[color=\"yellow\"]": 0
"*": 1
uploadvolumefactor:
case:
"*": "1"
"*": 1

View File

@@ -0,0 +1,195 @@
---
site: girotorrent
name: Girotorrent
description: "Girotorrent is an ITALIAN Private site for TV / MOVIES / GENERAL"
language: it-it
type: private
encoding: UTF-8
links:
- http://girotorrent.org/
caps:
categorymappings:
# LIBREDICOLA
- {id: 13, cat: Books, desc: "Giornali e Riviste"}
- {id: 15, cat: Books, desc: "Ebook"}
- {id: 16, cat: Books, desc: "Fumetti"}
- {id: 70, cat: Books, desc: "Manuali e Guide"}
- {id: 72, cat: Audio/Audiobook, desc: "Audiolibri"}
# CINEMA
- {id: 17, cat: Movies/Other, desc: "Movie Cam-Ts"}
- {id: 18, cat: Movies/Other, desc: "Movie Screener"}
- {id: 61, cat: Movies/Other, desc: "Movie R5-R6"}
- {id: 19, cat: Movies/Other, desc: "Movie DVDRip"}
- {id: 20, cat: Movies/Other, desc: "Movie BDRip"}
- {id: 60, cat: Movies/Other, desc: "Movie BluRay"}
- {id: 63, cat: Movies/Other, desc: "Movie WEBDLRip"}
# VIDEOTECA
- {id: 22, cat: Movies/SD, desc: "Movie BDRip"}
- {id: 23, cat: Movies/SD, desc: "Movie DvdRip"}
- {id: 23, cat: Movies/SD, desc: "Movie WEBRip"}
- {id: 24, cat: Movies/DVD, desc: "Movie DVD-R 5"}
- {id: 25, cat: Movies/DVD, desc: "Movie DVD-R 9"}
- {id: 26, cat: Movies/HD, desc: "Movie Blu-Ray HD"}
- {id: 27, cat: Movies/3D, desc: "Movie 3D-SBS"}
- {id: 96, cat: Movies/HD, desc: "Movie x265 HEVC"}
- {id: 28, cat: Movies/Foreign, desc: "Movie Subbet-ita"}
- {id: 73, cat: Movies/SD, desc: "Movie MP4"}
- {id: 29, cat: Movies/Foreign, desc: "Movie Ligua Originale"}
# ANIMAZIONE
- {id: 32, cat: TV/Anime, desc: "Anime Disney"}
- {id: 33, cat: TV/Anime, desc: "Anime"}
- {id: 34, cat: TV/Anime, desc: "Anime Altri Cartoni"}
# TELEVISIONE
- {id: 36, cat: TV, desc: "TV Serie TV"}
- {id: 77, cat: TV, desc: "TV Reality"}
- {id: 37, cat: TV, desc: "TV Film TV"}
- {id: 59, cat: TV, desc: "TV Sport"}
- {id: 38, cat: TV, desc: "TV Concerti-Spettacoli"}
- {id: 39, cat: TV, desc: "TV Teatro-Cabaret"}
- {id: 40, cat: TV/Documentary, desc: "Tv Documentario"}
# MUSICA
- {id: 42, cat: Audio, desc: "Musica CD Singoli"}
- {id: 43, cat: Audio, desc: "Musica Italiana"}
- {id: 44, cat: Audio, desc: "Musica Straniera"}
- {id: 45, cat: Audio, desc: "Musica Compilation"}
- {id: 46, cat: Audio, desc: "Musica Video Clip"}
- {id: 58, cat: Audio, desc: "Musica Discografie"}
# SALA GIOCHI
- {id: 47, cat: PC/Games, desc: "PC Games"}
- {id: 48, cat: PC/Games, desc: "PC Giochi PS2-PS3"}
- {id: 49, cat: PC/Games, desc: "PC Giochi Nintendo Wii"}
- {id: 50, cat: PC/Games, desc: "PC Giochi Xbox"}
- {id: 52, cat: PC/Games, desc: "PC Giochi DS-DS3"}
# SOFTWARE
- {id: 54, cat: PC, desc: "PC Programmi Windows"}
- {id: 55, cat: PC/Mac, desc: "PC Mac"}
- {id: 69, cat: PC, desc: "PC Portable"}
- {id: 56, cat: PC, desc: "PC Linux"}
# CELLULARI-PALMARI
- {id: 71, cat: PC/Phone-Android, desc: "Android APP"}
- {id: 74, cat: Other, desc: "Varie"}
- {id: 75, cat: Other, desc: "Immagini Wallpaper"}
modes:
search: [q]
tv-search: [q, season, ep]
movie-search: [q]
login:
path: /index.php?page=login
method: post
inputs:
uid: "{{ .Config.username }}"
pwd: "{{ .Config.password }}"
error:
- selector: div.error
test:
path: /index.php
selector: a[href="logout.php"]
download:
before:
path: "thanks.php"
method: "post"
inputs:
infohash: "{{ .DownloadUri.Query.id }}"
thanks: "1"
rndval: "1487013827343"
selector: a[href^="download.php?id="]
search:
paths:
- path: /index.php
inputs:
search: "{{ .Keywords }}"
category: "{{range .Categories}}{{.}};{{end}}"
page: "torrents"
active: 0
keywordsfilters:
- name: diacritics
args: replace
- name: re_replace # S01 to 1
args: ["(?i)\\bS0*(\\d+)\\b", "$1"]
- name: re_replace # S01E01 to 1 1
args: ["(?i)\\bS0*(\\d+)E0*(\\d+)\\b", "$1 $2"]
rows:
selector: div.b-content > table > tbody > tr > td > table.lista > tbody > tr:has(a[href^="index.php?page=torrent-details&id="])
filters:
- name: andmatch
fields:
download:
selector: a[href^="index.php?page=downloadcheck&id="]
attribute: href
title:
selector: a[onmouseover][href^="index.php?page=torrent-details&id="]
filters:
- name: re_replace # replace special characters with " " (space)
args: ["[^a-zA-Z0-9\\s]|\\.", " "]
- name: re_replace # replace multiple spaces
args: ["[ ]{2,}", " "]
# normalize to SXXEYY format
- name: re_replace # S01 E01 to S01E01
args: ["(?i)\\bS(\\d+)\\sE(\\d+)\\b", "S$1E$2"]
- name: re_replace # 01x01 to S01E01
args: ["(?i)(\\d{2})x(\\d+)", "S$1E$2"]
- name: re_replace # 1x01 to S01E01
args: ["(?i)\\b(\\d{1})x(\\d+)", "S0$1E$2"]
- name: re_replace # Stagione X --> S0X
args: ["(?i)\\bStagion[ei]\\s?(\\d{1})\\b|\\bSeason'?s?\\s?(\\d{1})\\b", "S0$1$2"]
- name: re_replace # Stagione XX --> SXX
args: ["(?i)\\bStagion[ei]\\s?(\\d{2,})\\b|\\bSeason'?s?\\s?(\\d{2,})\\b", "S$1$2"]
- name: re_replace # Episodio 4 to E4
args: ["(?i)\\b(?:[\\/\\|]?Episodio\\s?(\\d+)|Puntata\\s?(\\d+))", "E$1$2"]
- name: re_replace # Episodi 4 5 to E04-05
args: ["(?i)\\b(?:Puntate\\s*)(\\d+)\\s?(\\d+)", "E0$1-0$2"]
- name: re_replace # rimozioni varie
args: ["(?i)(Serie completa|Completat?a?|in pausa)", ""]
category:
selector: a[href^="index.php?page=torrents&category="]
attribute: href
filters:
- name: querystring
args: category
details:
selector: a[onmouseover][href^="index.php?page=torrent-details&id="]
attribute: href
banner:
optional: true
selector: a[onmouseover][href^="index.php?page=torrent-details&id="]
attribute: onmouseover
filters:
- name: regexp
args: "src=(.+?) "
size:
selector: td:nth-child(11)
date:
selector: td:nth-child(6)
filters:
- name: dateparse
args: "02/01/2006"
grabs:
selector: td:nth-child(9)
filters:
- name: replace
args: ["---", "0"]
seeders:
selector: td:nth-child(7)
leechers:
selector: td:nth-child(8)
downloadvolumefactor:
case:
img[alt="Free Leech"]: "0"
img[alt="Gold 100% Free"]: "0"
img[alt="Silver 50% Free"]: "0.5"
img[alt="Bronze 25% Free"]: "0.75"
"*": "1"
uploadvolumefactor:
text: "1"
uploadvolumefactor:
optional: true
selector: img[alt$="x Upload Multiplier"]
attribute: alt
filters:
- name: replace
args: ["x Upload Multiplier", ""]

View File

@@ -6,10 +6,14 @@
type: public
encoding: UTF-8
links:
- http://www.gktorrent.net/
- https://ww2.gktorrent.com/
legacylinks:
- https://www.gktorrent.org/
- http://www.gktorrent.net/
- https://www.gktorrent.com/ # they're forcing http
- http://www.gktorrent.com/
- http://ww1.gktorrent.com/
- http://ww2.gktorrent.com/ # they're forcing https
caps:
categorymappings:

View File

@@ -1,23 +1,29 @@
---
site: btworld
name: BTWorld
description: "HD Movie/TV Tracker"
site: hd4free
name: hd4free
description: "General Tracker Movies/TV/Apps/Games/Music/Books"
language: en-us
type: private
encoding: UTF-8
links:
- https://btworld.org/
- https://hd4.xyz/
caps:
categorymappings:
- {id: 1, cat: Movies, desc: "Movies"}
- {id: 2, cat: TV, desc: "TV"}
- {id: 3, cat: Audio, desc: "Music"}
- {id: 4, cat: Books, desc: "Books"}
- {id: 5, cat: PC/Mac, desc: "Apps"}
- {id: 6, cat: Other, desc: "Other"}
- {id: 7, cat: PC/Games, desc: "Games"}
modes:
search: [q]
tv-search: [q, season, ep, imdbid]
movie-search: [q, imdbid]
login:
path: /login
method: form
@@ -28,7 +34,7 @@
- selector: table.main:contains("Login Failed!")
test:
path: /torrents
search:
paths:
- path: /filterTorrents
@@ -43,15 +49,8 @@
sorting: created_at
direction: desc
qty: 100
preprocessingfilters:
- name: jsonjoinarray
args: ["$.result", ""]
- name: prepend
args: "<table>"
- name: append
args: "</table>"
rows:
selector: tr
selector: table > tbody > tr
fields:
category:
selector: a[href*="/categories/"]
@@ -62,18 +61,11 @@
title:
selector: a.view-torrent
download:
selector: a[href*="/download_check/"]
selector: a[href*="/download/"]
attribute: href
filters:
- name: replace
args: ["/download_check/", "/download/"]
details:
selector: a.view-torrent
attribute: href
imdb:
optional: true
selector: a[href*="://www.imdb.com/title/"]
attribute: href
size:
selector: td:nth-child(5)
seeders:
@@ -87,12 +79,6 @@
args: ([\d\.]+)
date:
selector: time
attribute: datetime
filters:
- name: append
args: " +00:00"
- name: dateparse
args: "2006-01-02 15:04:05 -07:00"
downloadvolumefactor:
case:
"i[data-original-title=\"100% Free\"]": "0"

View File

@@ -61,7 +61,6 @@
search:
paths:
- path: /torrents.php
method: post
inputs:
$raw: "{{range .Categories}}cat{{.}}=1&{{end}}"
search: "{{if .Query.IMDBID}}{{ .Query.IMDBID }}{{else}}{{ .Keywords }}{{end}}"

View File

@@ -6,7 +6,7 @@
type: private
encoding: UTF-8
links:
- https://hdhome.org
- https://hdhome.org/
caps:
categorymappings:
@@ -77,12 +77,11 @@
- selector: td.embedded:has(h2:contains("姿势不正确"))
- selector: td.embedded:has(h2:contains("失败"))
test:
path: /torrents.php
path: torrents.php
search:
paths:
- path: /torrents.php
method: post
- path: torrents.php
inputs:
$raw: "{{range .Categories}}cat{{.}}=1&{{end}}"
search: "{{if .Query.IMDBID}}{{ .Query.IMDBID }}{{else}}{{ .Keywords }}{{end}}"

View File

@@ -91,6 +91,11 @@
download:
selector: td:nth-child(11) > a
attribute: href
filters:
- name: prepend
args: "{{ .Config.sitelink }}"
- name: replace # https download links are redirected to http causing invalid cookies => invalid passkeys
args: ["https", "http"]
size:
selector: td:nth-child(6)
remove: br
@@ -103,3 +108,9 @@
selector: td:nth-child(8)
leechers:
selector: td:nth-child(9)
downloadvolumefactor:
case:
"font:contains(\"(FreeLeech)\")": "0"
"*": "1"
uploadvolumefactor:
text: "1"

View File

@@ -0,0 +1,142 @@
---
site: hdspain
name: HD-Spain
description: "HD-Spain is a SPANISH site for HD content"
language: es-es
type: private
encoding: ISO-8859-1
links:
- https://www.hd-spain.com/
caps:
categorymappings:
- {id: 1 , cat: Movies/HD, desc: "Películas"}
- {id: 5 , cat: Movies/HD, desc: "Pelíc. Anim."}
- {id: 4 , cat: TV/HD, desc: "Series"}
- {id: 3 , cat: TV/HD, desc: "Series Anim."}
- {id: 6 , cat: TV/Documentary, desc: "Documentales"}
- {id: 11, cat: TV/Sport, desc: "Deportes"}
- {id: 7 , cat: Audio/Video, desc: "Música/Espec."}
- {id: 9 , cat: TV/OTHER, desc: "Programas TV"}
- {id: 8 , cat: Audio/Lossless, desc: "Audios"}
- {id: 10, cat: XXX/x264, desc: "XXX"}
modes:
search: [q]
login:
path: index.php
method: form
inputs:
usuario: "{{ .Config.username }}"
contrasena: "{{ .Config.password }}"
error:
- selector: p.error
test:
path: index.php
selector: .tcabecera
search:
path: index.php
keywordsfilters:
- name: re_replace
args: ["S0?(\\d{1,2})E(\\d{1,2})", "$1x$2"]
inputs:
sec: listado
ord: 9
b: "{{ .Keywords }}"
ver: "0"
relanz: "0"
$raw: "{{range .Categories}}&cat[]={{.}}{{end}}"
rows:
selector: "table.listatorrents tr:not(:first-child)"
fields:
category:
selector: td.categorias a
attribute: href
filters:
- name: querystring
args: cat
title:
selector: td.titulo a[id]
filters:
- name: append
args: " [spanish]"
details:
selector: td.titulo a
attribute: href
size:
selector: td.tamano
seeders:
selector: td.usuarios.seeds a
leechers:
selector: td.usuarios.leechers a
grabs:
selector: td.usuarios.completados
date:
optional: true
selector: td.fecha
attribute: title
filters:
- name: replace
args: ["Lunes", "Monday"]
- name: replace
args: ["Martes", "Tuesday"]
- name: re_replace
args: ["Miércoles", "Wednesday"]
- name: replace
args: ["Jueves", "Thursday"]
- name: replace
args: ["Viernes", "Friday"]
- name: re_replace
args: ["Sábado", "Saturday"]
- name: replace
args: ["Domingo", "Sunday"]
- name: replace
args: ["Enero", "January"]
- name: replace
args: ["Febrero", "February"]
- name: replace
args: ["Marzo", "March"]
- name: replace
args: ["Abril", "April"]
- name: replace
args: ["Mayo", "May"]
- name: replace
args: ["Junio", "June"]
- name: replace
args: ["Julio", "July"]
- name: replace
args: ["Agosto", "August"]
- name: replace
args: ["Septiembre", "September"]
- name: replace
args: ["Octubre", "October"]
- name: replace
args: ["Noviembre", "November"]
- name: replace
args: ["Diciembre", "December"]
- name: dateparse
args: "Monday 2 January 2006, 15:04"
download:
selector: td.descargar a
attribute: href
downloadvolumefactor:
text: "1"
downloadvolumefactor:
optional: true
selector: td.descargar a b strong
filters:
- name: replace
args: [" X2", ""]
- name: replace
args: ["Freeleech", "0"]
uploadvolumefactor:
text: "1"
uploadvolumefactor:
optional: true
selector: td.descargar a b strong
filters:
- name: replace
args: ["Freeleech X2", "2"]

View File

@@ -1,66 +0,0 @@
---
site: horriblesubs
name: Horrible Subs
description: "Anime Sub Group - \"So bad yet so good\""
language: en-us
type: public
encoding: UTF-8
links:
- http://horriblesubs.info/
legacylinks:
- https://horriblesubs.info/
caps:
categories:
1: TV/Anime # Anime
modes:
search: [q]
tv-search: [q, season, ep]
settings:
- name: prepend-horriblesubs
type: checkbox
label: Prepend [Horriblesubs] to torrent title
search:
paths:
- path: "lib/{{if .Query.Keywords }}search.php{{else}}latest.php{{end}}"
inputs:
value: "{{ .Query.Keywords }}"
rows:
selector: "div.release-links"
dateheaders:
selector: table.release-info
filters:
- name: split
args: [" ", 0 ]
- name: replace
args: ["(", ""]
- name: replace
args: [")", ""]
- name: replace
args: ["/", "-"]
- name: dateparse
args: "01-02-06"
- name: dateparse
args: "01-02"
fields:
category:
text: "1"
title:
selector: table.release-table > tbody > tr > td.dl-label
filters:
- name: prepend
args: "{{if .Config.prepend-horriblesubs}}[Horriblesubs] {{else}}{{end}}"
details:
attribute: class
filters:
- name: replace
args: ["release-links", ""]
- name: re_replace
args: [" ?(\\S+?)-((?:s\\d-)?(?:\\d+v?\\d?-){0,2}\\d+p)", "http://horriblesubs.info/shows/$1#$2"]
download:
selector: table.release-table > tbody > tr > td.hs-magnet-link > span > a
attribute: href
size:
text: "500 MB"

View File

@@ -0,0 +1,130 @@
---
site: hqsource
name: HQSource
description: "HQSource (HQS) is a POLISH Private Torrent Tracker for MOVIES / TV / GENERAL"
language: pl-pl
type: private
encoding: ISO-8859-2
links:
- http://hqsource.org/
caps:
categorymappings:
- {id: 36, cat: Movies/3D, desc: "3D"}
- {id: 3, cat: Movies/UHD, desc: "4K/UHD"}
- {id: 2, cat: Movies/HD, desc: "BDRip"}
- {id: 1, cat: Movies/HD, desc: "BRRip"}
- {id: 49, cat: Movies/BluRay, desc: "BluRay"}
- {id: 8, cat: Movies/SD, desc: "DVD"}
- {id: 4, cat: TV/HD, desc: "HDTV"}
- {id: 7, cat: Movies/SD, desc: "HQDVDRip"}
- {id: 45, cat: Movies/HD, desc: "MKV"}
- {id: 11, cat: Audio, desc: "Music"}
- {id: 6, cat: Other, desc: "Special"}
- {id: 46, cat: PC, desc: "Tools"}
- {id: 9, cat: TV, desc: "TV-Series"}
- {id: 5, cat: Movies, desc: "WEB-DL"}
- {id: 35, cat: XXX, desc: "XXX"}
modes:
search: [q]
tv-search: [q, season, ep]
movie-search: [q]
settings:
- name: username
type: text
label: Username
- name: password
type: password
label: Password
- name: pin
type: text
label: Pin
login:
path: /takelogin.php
method: post
inputs:
username: "{{ .Config.username }}"
password: "{{ .Config.password }}"
pin: "{{ .Config.pin }}"
returnto: "/"
error:
- selector: td.embedded:has(h2:contains("failed"))
- selector: td.embedded:has(h2:contains("Error"))
test:
selector: a[href^="logout.php"]
path: /browse.php
search:
paths:
- path: /browse.php
inputs:
$raw: "{{range .Categories}}c{{.}}=1&{{end}}"
search: "{{ .Query.Keywords }}"
incldead: 1
polish: 0
blah: 0
rows:
selector: table#line > tbody > tr:has(a[href^="details.php?id="])
fields:
title:
selector: a[href^="details.php?id="]
details:
selector: a[href^="details.php?id="]
attribute: href
category:
selector: a[href^="browse.php?cat="]
attribute: href
filters:
- name: querystring
args: cat
download:
selector: a[href^="download.php/"]
attribute: href
description:
optional: true
selector: img[src="pic/pl.png"]
filters:
- name: append
args: "Language: polish\n<br>"
- name: prepend
args: {{ .Result.description }}
description:
optional: true
selector: img[src="pic/napisy.png"]
filters:
- name: append
args: "Subbed\n<br>"
- name: prepend
args: {{ .Result.description }}
imdb:
optional: true
selector: a[href^="http://www.imdb.com/title/tt"]
grabs:
selector: td:nth-child(6)
filters:
- name: regexp
args: (\d+)
size:
selector: td:nth-child(5)
date:
selector: tr, br
filters:
- name: append
args: " +00:00"
- name: dateparse
args: "2006-01-0215:04:05 -07:00"
seeders:
selector: td:nth-child(7)
leechers:
selector: td:nth-child(8)
downloadvolumefactor:
case:
"img[src=\"pic/download2.gif\"]": 0
"*": 1
uploadvolumefactor:
case:
"img[src=\"pic/double.png\"]": 2
"*": 1

View File

@@ -114,7 +114,7 @@
selector: td:has(a[href$="filelist=1#filelist"])
remove: a
date:
selector: td > font:contains("Added on")
selector: td > font:has(i.fa-clock-o)
remove: b
filters:
- name: replace

View File

@@ -1,18 +1,18 @@
---
site: idope
name: Idope
description: "iDope is a Public torrent search engine presenting direct magnet links"
site: idopeclone
name: IdopeClone
description: "This Clone of iDope is a Public torrent search engine"
language: en-us
type: public
encoding: UTF-8
links:
- https://idope.se/
- https://idope.top/
caps:
categorymappings:
- {id: 0, cat: Other, desc: "Others"}
- {id: 1, cat: Movies, desc: "Movies"}
- {id: 2, cat: Other, desc: "Video"}
- {id: 2, cat: Other, desc: "Videos"}
- {id: 3, cat: TV, desc: "TV"}
- {id: 4, cat: TV/Anime, desc: "Anime"}
- {id: 5, cat: XXX, desc: "XXX"}
@@ -37,33 +37,36 @@
search:
paths:
# present trending results if there are no search parms supplied
# sort torrent-list by age in descending order
- path: "{{if .Keywords}}torrent-list/{{ .Keywords}}?&o=-3&c={{range .Categories }}{{.}}{{end}}{{else}}browse.html{{end}}"
- path: "{{if .Keywords}}search/{{ .Keywords}}/{{else}}recent-torrents/{{end}}"
rows:
selector: div[class="resultdiv"]
filters:
- name: andmatch
fields:
title:
selector: div[class="resultdivtop"] a div[class="resultdivtopname"]
selector: div[class="resultdivtop"] div[class="resultdivtopname"]
details:
selector: div[class="resultdivbotton"] div[class="magneticdiv"] a
attribute: href
category:
optional: true
selector: div[class="resultdivbotton"] div[class="resultdivbottoncategory"]
selector: div[class="resultdivbotton"] div[class="resultdivbottoncategory"]
case:
":contains(\"Others\")": 0
":contains(\"Other\")": 0
":contains(\"Movies\")": 1
":contains(\"Video\")": 2
":contains(\"TV\")": 3
":contains(\"Anime\")": 4
":contains(\"xxx\")": 5
":contains(\"XXX\")": 5
":contains(\"Adult\")": 5
":contains(\"Music\")": 6
":contains(\"Games\")": 7
":contains(\"Apps\")": 8
":contains(\"Software\")": 8
":contains(\"Books\")": 9
details:
selector: div[class="resultdivtop"] a
attribute: href
download-itorrents:
selector: div[class="resultdivbotton"] div[id^="hideinfohash"]
selector: div[class="resultdivbotton"] div[class="resultseed"] div[class="resultdivbottonseed"]
filters:
- name: toupper
- name: prepend
@@ -78,7 +81,7 @@
- name: validfilename
- name: urlencode
magnet:
selector: div[class="resultdivbotton"] div[id^="hideinfohash"]
selector: div[class="resultdivbotton"] div[class="resultseed"] div[class="resultdivbottonseed"]
filters:
- name: prepend
args: "magnet:?xt=urn:btih:"
@@ -93,9 +96,9 @@
size:
selector: div[class="resultdivbotton"] div[class="resultlength"] div[class="resultdivbottonlength"]
seeders:
selector: div[class="resultdivbotton"] div[class="resultseed"] div[class="resultdivbottonseed"]
files:
selector: div[class="resultdivbotton"] div[class="resultfile"] div[class="resultdivbottonfiles"]
text: "999"
leechers:
text: "999"
downloadvolumefactor:
text: "0"
uploadvolumefactor:

View File

@@ -0,0 +1,161 @@
---
site: ilcorsaroblu
name: Il Corsaro Blu
description: "Il Corsaro Blu is an ITALIAN Public site for TV / MOVIES / GENERAL"
language: it-it
type: public
encoding: UTF-8
links:
- https://www.ilcorsaroblu.org/
legacylinks:
- http://ilcorsaroblu.org/
- https://www.ilcorsaroblu.info/
certificates:
- e6dd93ef71f96d04559e2bee8cc8e6fd74957730 # incomplete CA chain
caps:
categorymappings:
# Adult
- {id: 12, cat: XXX, desc: "Adult"}
# Applicazioni
- {id: 5, cat: PC/Phone-Android, desc: "Android"}
# Books
- {id: 6, cat: Books, desc: "Books"}
# Games
- {id: 3, cat: Other, desc: "Games"}
# Music
- {id: 2, cat: Audio, desc: "Music"}
# Movies
- {id: 17, cat: Movies/SD, desc: "Movie BDRip"}
- {id: 21, cat: Movies/Other, desc: "Movies - Films"}
- {id: 11, cat: Movies/DVD, desc: "DVD-R"}
- {id: 14, cat: Movies/HD, desc: "Movie 720p"}
- {id: 13, cat: Movies/HD, desc: "Movie 1080p"}
- {id: 15, cat: Movies/3D, desc: "Movie 3D"}
- {id: 24, cat: TV/OTHER, desc: "TV Show Standard"}
- {id: 19, cat: TV/HD, desc: "Tv Show 1080p"}
- {id: 20, cat: TV/HD, desc: "Tv Show 720"}
# Various
- {id: 4, cat: Other, desc: "Other"}
- {id: 7, cat: PC, desc: "Windows"}
- {id: 8, cat: Other, desc: "Linux"}
- {id: 9, cat: PC/Mac, desc: "Mac"}
- {id: 23, cat: Other, desc: "Archive"}
modes:
search: [q]
tv-search: [q, season, ep]
movie-search: [q]
settings: []
search:
paths:
- path: /index.php
keywordsfilters:
- name: diacritics
args: replace
- name: re_replace # S01 to 1
args: ["(?i)\\bS0*(\\d+)\\b", "$1"]
- name: re_replace # S01E01 to 1 1
args: ["(?i)\\bS0*(\\d+)E0*(\\d+)\\b", "$1 $2"]
inputs:
search: "{{ .Keywords }}"
category: "{{range .Categories}}{{.}};{{end}}"
page: torrents
active: 0
rows:
selector: div.b-content > table > tbody > tr > td > table.lista > tbody > tr:has(a[href^="index.php?page=torrents&category="])
filters:
- name: andmatch
fields:
title:
selector: td:nth-child(2) > a
filters:
- name: re_replace # replace special characters with " " (space)
args: ["[^a-zA-Z0-9\\s]|\\.", " "]
- name: re_replace # replace multiple spaces
args: ["[ ]{2,}", " "]
# normalize to SXXEYY format
- name: re_replace # S01 E01 to S01E01
args: ["(?i)\\bS(\\d+)\\sE(\\d+)\\b", "S$1E$2"]
- name: re_replace # 01x01 to S01E01
args: ["(?i)(\\d{2})x(\\d+)", "S$1E$2"]
- name: re_replace # 1x01 to S01E01
args: ["(?i)\\b(\\d{1})x(\\d+)", "S0$1E$2"]
- name: re_replace # Stagione X --> S0X
args: ["(?i)\\bStagion[ei]\\s?(\\d{1})\\b|\\bSeason'?s?\\s?(\\d{1})\\b", "S0$1$2"]
- name: re_replace # Stagione XX --> SXX
args: ["(?i)\\bStagion[ei]\\s?(\\d{2,})\\b|\\bSeason'?s?\\s?(\\d{2,})\\b", "S$1$2"]
- name: re_replace # Episodio 4 to E4
args: ["(?i)\\b(?:[\\/\\|]?Episodio\\s?(\\d+)|Puntata\\s?(\\d+))", "E$1$2"]
- name: re_replace # Episodi 4 5 to E04-05
args: ["(?i)\\b(?:Puntate\\s*)(\\d+)\\s?(\\d+)", "E0$1-0$2"]
- name: re_replace # rimozioni varie
args: ["(?i)(Serie completa|Completat?a?|in pausa)", ""]
download: # handle torrents with normal torrent file download
optional: true
selector: a[href^="download.php?id="]
attribute: href
filters:
- name: querystring
args: id
- name: toupper
- name: prepend
args: http://itorrents.org/torrent/
- name: append
args: ".torrent"
_magnetfilename: # convert title to valid magnet filename
text: "{{ .Result.title }}"
filters:
- name: validfilename
- name: urlencode
magnet: # generate magnet link from download link
optional: true
selector: a[href^="download.php?id="]
attribute: href
filters:
- name: querystring
args: id
- name: prepend
args: "magnet:?xt=urn:btih:"
- name: append
args: "&dn={{ .Result._magnetfilename }}.torrent"
- name: append # add some well known public trackers
args: "&tr=udp://tracker.openbittorrent.com:80/announce&tr=udp://tracker.opentrackr.org:1337/announce"
magnet: # in case a direct magnet link is provided use it
optional: true
selector: a[href^="magnet:?xt="]
attribute: href
category:
selector: a[href^="index.php?page=torrents&category="]
attribute: href
filters:
- name: querystring
args: category
details:
selector: td:nth-child(2) > a
attribute: href
banner:
optional: true
selector: td:nth-child(2) > a
attribute: onmouseover
filters:
- name: regexp
args: "src=(.+?) "
size:
selector: td:nth-child(10)
date:
selector: td:nth-child(6)
filters:
- name: dateparse
args: "02/01/2006"
grabs:
selector: td:nth-child(9)
filters:
- name: replace
args: ["---", "0"]
seeders:
selector: td:nth-child(7)
leechers:
selector: td:nth-child(8)

View File

@@ -9,17 +9,19 @@
- https://ilcorsaronero.info/
certificates:
- aa7c40aa360a1cec8a9687312fd50402b912e618 # incomplete CA chain
- 83174ec1f92fa13cdef9d51888ea1dfba2166e17 # incomplete CA chain
- c414bf4ad6c69841693c147849f4c314aa200bdf # incomplete CA chain
caps:
categorymappings:
- {id: 1, cat: Movies/HD, desc: "BDRiP"}
- {id: 2, cat: Audio, desc: "Music"}
- {id: 2, cat: PC/Games, desc: "Games"}
- {id: 5, cat: TV/Anime, desc: "Anime"}
- {id: 7, cat: PC/0day, desc: "App"}
- {id: 15, cat: TV, desc: "TV Series"}
- {id: 19, cat: Movies/SD, desc: "Screener"}
- {id: 20, cat: Movies/SD, desc: "Full DVD"}
- {id: 1, cat: Movies/HD, desc: "BDRiP", default: true}
- {id: 2, cat: Audio, desc: "Music", default: true}
- {id: 2, cat: PC/Games, desc: "Games", default: true}
- {id: 5, cat: TV/Anime, desc: "Anime", default: true}
- {id: 7, cat: PC/0day, desc: "App", default: true}
- {id: 15, cat: TV, desc: "TV Series", default: true}
- {id: 19, cat: Movies/SD, desc: "Screener", default: true}
- {id: 20, cat: Movies/SD, desc: "Full DVD", default: true}
modes:
search: [q]
@@ -30,32 +32,44 @@
- name: itorrents-links
type: checkbox
label: Add download links via itorrents.org
- name: advanced-search
type: checkbox
label: Use the advanced search of IlCorsaroNero (experimental)
# - name: advanced-search
# type: checkbox
# label: Use the advanced search of IlCorsaroNero (experimental)
search:
paths:
# https://ilcorsaronero.info/advsearch.php?&category=15&search=flash+4&&order=data&by=DESC&page=3
# {{range .Categories}}{{.}};{{end}}
##### Are the "not" and "and" functions implemented? Or am I doing it wrong?
# path: "{{if and .Query.Keywords .advanced-search}}adv/{{ .Query.Keywords}}.html
# {{else if and .Query.Keywords (not .advanced-search)}}argh.php?search={{ .Query.Keywords}}
# {{else}}/recenti
# {{end}}"
- path: "{{if .Keywords}}argh.php?search={{ .Keywords}}
{{else}}/recenti
{{end}}"
# - path: "{{if .Keywords}}argh.php?search={{ .Keywords}}
# {{else}}/recenti
# {{end}}"
- path: "{{if .Keywords}}advsearch.php?&category={{range .Categories}}{{.}};{{end}}&search={{ .Keywords}}&order=data&by=DESC&page=0{{else}}/recenti{{end}}"
- path: "{{if .Keywords}}advsearch.php?&category={{range .Categories}}{{.}};{{end}}&search={{ .Keywords}}&order=data&by=DESC&page=1{{else}}/recenti{{end}}"
- path: "{{if .Keywords}}advsearch.php?&category={{range .Categories}}{{.}};{{end}}&search={{ .Keywords}}&order=data&by=DESC&page=2{{else}}/recenti{{end}}"
- path: "{{if .Keywords}}advsearch.php?&category={{range .Categories}}{{.}};{{end}}&search={{ .Keywords}}&order=data&by=DESC&page=3{{else}}/recenti{{end}}"
- path: "{{if .Keywords}}advsearch.php?&category={{range .Categories}}{{.}};{{end}}&search={{ .Keywords}}&order=data&by=DESC&page=4{{else}}/recenti{{end}}"
- path: "{{if .Keywords}}advsearch.php?&category={{range .Categories}}{{.}};{{end}}&search={{ .Keywords}}&order=data&by=DESC&page=5{{else}}/recenti{{end}}"
- path: "{{if .Keywords}}advsearch.php?&category={{range .Categories}}{{.}};{{end}}&search={{ .Keywords}}&order=data&by=DESC&page=6{{else}}/recenti{{end}}"
- path: "{{if .Keywords}}advsearch.php?&category={{range .Categories}}{{.}};{{end}}&search={{ .Keywords}}&order=data&by=DESC&page=7{{else}}/recenti{{end}}"
- path: "{{if .Keywords}}advsearch.php?&category={{range .Categories}}{{.}};{{end}}&search={{ .Keywords}}&order=data&by=DESC&page=8{{else}}/recenti{{end}}"
- path: "{{if .Keywords}}advsearch.php?&category={{range .Categories}}{{.}};{{end}}&search={{ .Keywords}}&order=data&by=DESC&page=9{{else}}/recenti{{end}}"
keywordsfilters:
- name: re_replace
args: ["S[0-9]{2}([^E]|$)", ""] # remove season tag without episode (search doesn't support it)
- name: diacritics
args: replace
# most ITA TV torrents are in XXxYY format, so we search without S/E prefixes and filter later
- name: re_replace
args: ["S0?(\\d{1,2})", " $1 "]
- name: re_replace
args: ["E(\\d{2,3})", " $1 "]
- name: re_replace # S01 to 1
args: ["(?i)\\bS0*(\\d+)\\b", "$1"]
- name: re_replace # S01E01 to 1 1
args: ["(?i)\\bS0*(\\d+)E0*(\\d+)\\b", "$1 $2"]
rows:
selector: "tr.odd,tr.odd2"
filters:
- name: andmatch
fields:
title:
selector: td:nth-child(2) a.tab
@@ -64,32 +78,27 @@
- name: split
args: [ "/", -1 ]
- name: urldecode
- name: re_replace
args: [ "_+", " "]
- name: replace
args: [ ".", " "]
- name: re_replace
args: [ "\\s{2,}", " "]
- name: re_replace # replace special characters with " " (space)
args: ["[^a-zA-Z0-9\\s]|\\.", " "]
- name: re_replace # replace multiple spaces
args: ["[ ]{2,}", " "]
# normalize to SXXEYY format
- name: re_replace
args: ["(\\d{2})x(\\d{2})", "S$1E$2"]
- name: re_replace
args: ["(\\d{1})x(\\d{2})", "S0$1E$2"]
- name: re_replace #Stagione X --> S0X
args: ["Stagione (\\d{0,1}\\s)", "S0$1"]
- name: re_replace #Stagione XX --> SXX
args: ["Stagione (\\d{2}\\s)", "S$1"]
- name: re_replace #/ Episodio [YY-YY --> EYY-YY
args: ["(\\s\\/\\sEpisodio|\\s\\/\\sEpisodi|\\sEpisodio|\\s\\|\\sEpisodio|\\sEpisodi)\\s\\[", "E"]
- name: re_replace #/ Completa [episodi YY-YY --> EYY-YY
args: ["(\\s\\/\\sCompleta\\s\\[episodi\\s)", "E"]
- name: re_replace #remove di YY] | remove /YY]
args: ["(\\sdi\\s\\d{1,2}|\\/\\d{1,2})\\]", " "]
- name: re_replace #remove various
args: ["(Serie completa|Completa|\\[in pausa\\])", ""]
# fine prova
- name: re_replace #try to find multi episode
args: ["(S\\d{2}E\\d{2})\\s(\\d{2})", "$1-$2"]
- name: re_replace # S01 E01 to S01E01
args: ["(?i)\\bS(\\d+)\\sE(\\d+)\\b", "S$1E$2"]
- name: re_replace # 01x01 to S01E01
args: ["(?i)(\\d{2})x(\\d+)", "S$1E$2"]
- name: re_replace # 1x01 to S01E01
args: ["(?i)\\b(\\d{1})x(\\d+)", "S0$1E$2"]
- name: re_replace # Stagione X --> S0X
args: ["(?i)\\bStagion[ei]\\s?(\\d{1})\\b|\\bSeason'?s?\\s?(\\d{1})\\b", "S0$1$2"]
- name: re_replace # Stagione XX --> SXX
args: ["(?i)\\bStagion[ei]\\s?(\\d{2,})\\b|\\bSeason'?s?\\s?(\\d{2,})\\b", "S$1$2"]
- name: re_replace # Episodio 4 to E4
args: ["(?i)\\b(?:[\\/\\|]?Episodio\\s?(\\d+)|Puntata\\s?(\\d+))", "E$1$2"]
- name: re_replace # Episodi 4 5 to E04-05
args: ["(?i)\\b(?:Puntate\\s*)(\\d+)\\s?(\\d+)", "E0$1-0$2"]
- name: re_replace # rimozioni varie
args: ["(?i)(Serie completa|Completat?a?|in pausa)", ""]
category:
selector: td:nth-child(1) a
attribute: href

View File

@@ -77,6 +77,9 @@
attribute: href
size:
selector: td.size-row
filters:
- name: re_replace
args: ["(\\d+).(?=\\d{3}(\\D|$))", "$1"]
seeders:
selector: td.sn
date:
@@ -96,4 +99,4 @@
downloadvolumefactor:
text: "0"
uploadvolumefactor:
text: "1"
text: "1"

View File

@@ -84,11 +84,12 @@
selector: table#torrents_table_classic > tbody > tr:not(:first-child), div#content > div.torrent-box[id^="torrent_"]
filters:
- name: andmatch
# the tracker has two different styles (modern/classic) it should work with both
fields:
title:
selector: a[href*="?p=torrents&pid=10&action=details"]
category:
selector: div.category_image > a
selector: div.category_image > a, div.categoryImage > a
attribute: href
filters:
- name: querystring
@@ -117,6 +118,9 @@
downloadvolumefactor:
case:
"img[title=\"ΧΡΥΣΟ!\"]": "0"
"img[title=\"100% FREE!\"]": "0"
"img[title=\"Πολλαπλασιαστής Κατεβάσματος: 0.5\"]": "0.5"
"*": "1"
uploadvolumefactor:
case:

View File

@@ -1,7 +1,10 @@
---
# Update by LA5T based on the orignial 'karagarga.yml'
# 29.07.2018 23:15 UTC+2
#
site: karagarga
name: Karagarga
description: "Rare and obscure movie tracker"
description: "Tracker for non-hollywood, rare and obscure movies, music and literature."
language: en-us
type: private
encoding: UTF-8
@@ -11,6 +14,66 @@
caps:
categorymappings:
- {id: 1, cat: Movies, desc: "Movies"}
- {id: 2, cat: Audio, desc: "Music"}
- {id: 3, cat: Books, desc: "Literature"}
- {id: 4, cat: Movies, desc: "Action"}
- {id: 55, cat: Movies, desc: "Adventure"}
- {id: 5, cat: Movies, desc: "Animation"}
- {id: 6, cat: Movies, desc: "Arthouse"}
- {id: 7, cat: Movies, desc: "Asian"}
- {id: 43, cat: Movies, desc: "Camp"}
- {id: 8, cat: Movies, desc: "Classics"}
- {id: 9, cat: Movies, desc: "Comedy"}
- {id: 10, cat: Movies, desc: "Crime"}
- {id: 11, cat: Movies, desc: "Cult"}
- {id: 20, cat: Movies, desc: "Documentary"}
- {id: 12, cat: Movies, desc: "Drama"}
- {id: 44, cat: Movies, desc: "Epic"}
- {id: 13, cat: Movies, desc: "Erotica"}
- {id: 51, cat: Movies, desc: "Experimental"}
- {id: 47, cat: Movies, desc: "Exploitation"}
- {id: 14, cat: Movies, desc: "Fantasy"}
- {id: 15, cat: Movies, desc: "Film Noir"}
- {id: 53, cat: Movies, desc: "Giallo"}
- {id: 17, cat: Movies, desc: "Horror"}
- {id: 18, cat: Movies, desc: "Martial Arts"}
- {id: 19, cat: Movies, desc: "Musical"}
- {id: 54, cat: Movies, desc: "Mystery"}
- {id: 60, cat: Movies, desc: "Performance"}
- {id: 48, cat: Movies, desc: "Philosophy"}
- {id: 49, cat: Movies, desc: "Politics"}
- {id: 50, cat: Movies, desc: "Romance"}
- {id: 21, cat: Movies, desc: "Sci-Fi"}
- {id: 22, cat: Movies, desc: "Short"}
- {id: 23, cat: Movies, desc: "Silent"}
- {id: 24, cat: Movies, desc: "Thriller"}
- {id: 25, cat: Movies, desc: "TV"}
- {id: 56, cat: Movies, desc: "Video Art"}
- {id: 26, cat: Movies, desc: "War"}
- {id: 27, cat: Movies, desc: "Western"}
- {id: 800, cat: Audio, desc: "Blues"}
- {id: 31, cat: Audio, desc: "Classical"}
- {id: 600, cat: Audio, desc: "Country"}
- {id: 34, cat: Audio, desc: "Electronica"}
- {id: 63, cat: Audio, desc: "Exotica"}
- {id: 1000, cat: Audio, desc: "Experimental"}
- {id: 250, cat: Audio, desc: "Folk"}
- {id: 500, cat: Audio, desc: "Funk"}
- {id: 700, cat: Audio, desc: "Indie"}
- {id: 32, cat: Audio, desc: "Jazz"}
- {id: 1200, cat: Audio, desc: "Latin"}
- {id: 35, cat: Audio, desc: "Live"}
- {id: 900, cat: Audio, desc: "Metal"}
- {id: 62, cat: Audio, desc: "Punk & Hardcore"}
- {id: 52, cat: Audio, desc: "Rap & Hiphop"}
- {id: 5000, cat: Audio, desc: "Reggae"}
- {id: 36, cat: Audio, desc: "Rock"}
- {id: 400, cat: Audio, desc: "Soul"}
- {id: 33, cat: Audio, desc: "Soundtrack"}
- {id: 30, cat: Audio, desc: "World"}
- {id: 40, cat: Audio/Audiobook, desc: "Audiobooks"}
- {id: 41, cat: Books, desc: "Books"}
- {id: 42, cat: Books/Comics, desc: "Comics"}
modes:
search: [q]
@@ -33,15 +96,22 @@
search:
paths:
- path: browse.php
keywordsfilters:
- name: re_replace
args: ["(?<=^| )(?!-|\\+)[^ ]+(?= |$)", "+$&"]
inputs:
$raw: "{{range .Categories}}filter_cat[{{.}}]=1&{{end}}"
search: "\"{{ .Query.Keywords }}\""
search_type: "title"
$raw: "{{range .Categories}}genre={{.}}&{{end}}"
search: "{{ .Keywords }}"
search_type: title
rows:
selector: table#browse > tbody > tr:has(a[href^="browse.php?genre="])
fields:
category:
text: 1
selector: a[href^="browse.php?genre="]
attribute: href
filters:
- name: querystring
args: genre
title:
selector: td:nth-child(2) span
download:
@@ -69,15 +139,16 @@
date:
selector: td:nth-child(9)
filters:
- name: replace
args: ["'", ""]
- name: re_replace
args: ["[^a-zA-Z0-9]+", " "]
args: ["([a-zA-Z]+)\\s+(\\d{1,2})\\s+'(\\d{2})", "$2 $1 $3"]
- name: dateparse
args: "Jan 02 06"
args: "02 Jan 06"
downloadvolumefactor:
case:
"*": "1"
"*": 1
uploadvolumefactor:
case:
"*": "1"
":has(img[title^=HD]):has(img[title^=CURRENT])": 1.8
"img[title^=CURRENT]": 1.6
"img[title^=HD]": 1.3
"*": 1.1

View File

@@ -0,0 +1,70 @@
---
site: katcrs
name: KATcrs
description: "KATcrs is a Public KickAssTorrent clone for TV / MOVIES / GENERAL"
language: en-us
type: public
encoding: UTF-8
links:
- https://kickasskatcr.website/
caps:
categories:
movies: Movies
TV: TV
Video: TV/WEB-DL
Anime: TV/Anime
Music: Audio
Books: Books
Documentary: TV/Documentary
Games: Console
Apps: PC
Applications: PC
Other: Other
Othero: XXX
modes:
search: [q]
tv-search: [q, season, ep]
movie-search: [q]
settings: []
search:
paths:
- path: "{{ if .Keywords }}search/{{ .Keywords }}/{{else}}new/{{end}}"
rows:
selector: table.data tr.odd
fields:
category:
selector: span.uploader_block strong a
attribute: href
filters:
- name: trim
args: /
title:
selector: td:nth-child(1) div a.cellMainLink
attribute: title
details:
selector: td:nth-child(1) div a.cellMainLink
attribute: href
download:
selector: td:nth-child(1) div div a[data-download=""]
attribute: href
magnet:
selector: td:nth-child(1) div div a[data-nop=""]
attribute: href
size:
selector: td:nth-child(2)
date:
selector: td:nth-child(3)
filters:
- name: timeago
seeders:
selector: td:nth-child(4)
leechers:
selector: td:nth-child(5)
downloadvolumefactor:
text: "0"
uploadvolumefactor:
text: "1"

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