Compare commits

..

22 Commits

Author SHA1 Message Date
Garfield69
363d08634a puntotorrent: update categories. resolves #5042 2019-04-08 10:59:12 +12:00
Garfield69
2b503e01a1 amigosshare: adjustments resolves #5004
add banner
fix a category
2019-04-07 16:41:27 +12:00
Garfield69
a838dbcb6c xktorrent: categories
and other assorted selectors
2019-04-07 09:53:51 +12:00
Garfield69
16f96e0419 avg: update category selector
and date processing
2019-04-07 08:44:33 +12:00
Garfield69
5fe974afad asiancinema: updates for unit3d 1.9.2 2019-04-07 08:26:05 +12:00
Garfield69
593bbb37d3 dxdhd: updates for unti3d 1.9.2
plus add / amend categories
2019-04-07 08:11:27 +12:00
ThomasClemenceau
c9fbc7268b cpasbien, cpasbienclone, gktorrent, torrent9, torrent9clone: fix title with MULTI language. (#5031)
The MULTI was before the year so it was not supported by Radarr,Couchpotato etc..
2019-04-06 10:43:51 +13:00
Garfield69
a32ad215cd add SoundPark a semi-private russian site for music. #5022
downloading is untested.
the site has an aggressive advert method and the dl link is only available ad-free to members or vip
a newbie like me has to wait 1 week before becoming a member
meanwhile the dl link redirects to ads randomly :-(
2019-04-06 10:06:35 +13:00
Garfield69
34509d284f torrent9clone: new domain wwv.*.vg 2019-04-06 08:48:45 +13:00
Garfield69
2ca7975d3d cpasbien, cpasbienclone, gktorrent, torrent9, torrent9clone: fix title. resolves #5027 2019-04-06 07:52:28 +13:00
Garfield69
e8dbaa4a8e lesaloon: add capcha. resolves #5026 2019-04-05 15:59:40 +13:00
Garfield69
a6fd4c3da1 cpasbeinclone: update for recent html changes 2019-04-04 09:44:21 +13:00
Garfield69
1b3365d8ad spacetorrent: drop redundant French date replacements 2019-04-04 09:17:45 +13:00
Garfield69
a822b3c4f4 tigers-dl: support multi languages for dates
and date selector
and fix grabs when ---
2019-04-04 08:59:26 +13:00
Garfield69
ff663cc202 arenabg: download link for .torrent has changed. #5013 2019-04-03 08:12:03 +13:00
kaso17
4c3dbb4746 TCCF: remove inv flag 2019-04-02 16:55:39 +02:00
kaso17
a4ba0d21d9 HTTPClients: avoid Exception User-Unhandled notices 2019-04-02 15:39:14 +02:00
Garfield69
859da99442 yggtorrent: optionally disable sonarrv3hack. resolves #4987 2019-04-02 11:21:49 +13:00
Garfield69
1cbeb74c8e sharewood: correct results sort. resolves #5006 2019-04-02 08:05:40 +13:00
Garfield69
4ae705eb15 elitetorrentbiz: new domain .io resolves #5008 2019-04-02 07:18:46 +13:00
flightlevel
b469c2e764 Fix proxy javascript error 2019-04-01 19:40:35 +11:00
flightlevel
2712ff432b Revert "Revert "Revert "Revert "Add proxy warning to dashboard""""
This reverts commit 5d21a69b07.
2019-04-01 19:24:49 +11:00
27 changed files with 521 additions and 286 deletions

View File

@@ -107,6 +107,7 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
* RuTracker
* Sharewood
* SkTorrent
* SoundPark
* Union Fansub
* Vanila
* XtreMeZone (MYXZ)
@@ -336,7 +337,7 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
* Torrent.LT
* TorrentBD
* TorrentBytes (TBy)
* TorrentCCF (TCCF) [![(invite needed)][inviteneeded]](#)
* TorrentCCF (TCCF)
* TorrentDay (TD)
* Torrentech (TTH)
* TorrentHeaven

View File

@@ -270,6 +270,11 @@ table td.fit{
text-align: right;
margin-right: 1em;
}
input#searchquery{
input#searchquery {
width:400px;
}
#proxy-warning {
color: red;
}

View File

@@ -100,6 +100,7 @@ function loadJackettSettings() {
})
reloadIndexers();
proxyWarning(data.proxy_url);
});
}
@@ -1221,4 +1222,18 @@ function bindUIButtons() {
doNotify("Request to Jackett server failed", "danger", "glyphicon glyphicon-alert");
});
});
$('#jackett-proxy-url').on('input', function () {
proxyWarning($(this).val());
});
}
function proxyWarning(input) {
if (input != null && input.trim() !== "") {
$('#proxy-warning').show();
}
else
{
$('#proxy-warning').hide();
}
}

View File

@@ -281,6 +281,10 @@ div#jackett-releases-datatable_wrapper {
width: 100%;
overflow-x: scroll;
}
input#searchquery{
input#searchquery {
width:50%;
}
#proxy-warning {
color: red;
}

View File

@@ -34,8 +34,8 @@
<link rel="stylesheet" type="text/css" href="../bootstrap/bootstrap.min.css?changed=2017083001">
<link rel="stylesheet" type="text/css" href="../animate.css?changed=2017083001">
<link rel="stylesheet" type="text/css" href="../custom.css?changed=2017083001" media="only screen and (min-device-width: 480px)">
<link rel="stylesheet" type="text/css" href="../custom_mobile.css?changed=2017083001" media="only screen and (max-device-width: 480px)">
<link rel="stylesheet" type="text/css" href="../custom.css?changed=20190401" media="only screen and (min-device-width: 480px)">
<link rel="stylesheet" type="text/css" href="../custom_mobile.css?changed=20190401" media="only screen and (max-device-width: 480px)">
<link rel="stylesheet" type="text/css" href="../css/jquery.dataTables.min.css?changed=2017083001">
<link rel="stylesheet" type="text/css" href="../css/bootstrap-multiselect.css?changed=2017083001" />
<link rel="stylesheet" type="text/css" href="../css/font-awesome.min.css?changed=2017083001">
@@ -87,8 +87,10 @@
<h4>Adding a Jackett indexer to RSS clients (RSS feed)</h4>
<ol>
<li>Click on the indexers corresponding <button type="button" class="btn btn-xs btn-info">Copy RSS Feed</button> button and paste it into the URL field of the RSS client.</li>
<li>You can adjust the <b>q</b> (search string) and <b>cat</b> (categories) arguments accordingly.
E.g. <b>...&cat=2030,2040&q=big+buck+bunny</b> will search for "big buck bunny" in the Movies/SD (2030) and Movies/HD (2040) categories (See the indexer configuration for available categories).</li>
<li>
You can adjust the <b>q</b> (search string) and <b>cat</b> (categories) arguments accordingly.
E.g. <b>...&cat=2030,2040&q=big+buck+bunny</b> will search for "big buck bunny" in the Movies/SD (2030) and Movies/HD (2040) categories (See the indexer configuration for available categories).
</li>
</ol>
</div>
<hr />
@@ -138,6 +140,12 @@
<option value="2">socks5</option>
</select>
</div>
<div id="proxy-warning" hidden>
<span>
WARNING: The proxy option is unstable and potentially leaks requests. If no fix from the community is forthcoming
in the next few months, the proxy option will be removed from Jackett. Recommendation is to use a VPN.
</span>
</div>
<div class="input-area">
<span class="input-header">Proxy url: </span>
<input id="jackett-proxy-url" class="form-control input-right" type="text" value="" placeholder="Blank to disable">
@@ -663,6 +671,6 @@
</script>
<script type="text/javascript" src="../libs/api.js?changed=2017083001"></script>
<script type="text/javascript" src="../custom.js?changed=20180711"></script>
<script type="text/javascript" src="../custom.js?changed=20190401"></script>
</body>
</html>

View File

@@ -60,7 +60,7 @@
- {id: 2, cat: Movies, desc: "Filmes: Terror"}
- {id: 1, cat: Movies, desc: "Filmes: Ação"}
- {id: 80, cat: Movies, desc: "Filmes: Aventura"}
- {id: 70, cat: Other, desc: "Fotos: XXX"}
- {id: 70, cat: XXX, desc: "Fotos: XXX"}
- {id: 79, cat: Console/PS4, desc: "Jogos: Ps4"}
- {id: 47, cat: PC/Games, desc: "Jogos: Pc"}
- {id: 61, cat: Console, desc: "Jogos: Emuladores e Roms"}
@@ -142,18 +142,18 @@
error:
- selector: div.alert-error
test:
path: index.php
# selector: a[href="account-logout.php"]
path: torrents-search.php
selector: a[href="account-logout.php"]
ratio:
path: index.php
path: torrents-search.php
selector: li:contains("Ratio:") a b
search:
paths:
# http://amigos-share.club/torrents-search.php?search=&c1=1&c19=1&c36=1&incldead=0&freeleech=0&lang=0sort=id&order=desc&page=1
- path: torrents-search.php
# site displays just 21 results, no profile options found to change this, so we attempt to fetch 5 pages
# site displays just 9 results, no profile options found to change this, so we attempt to fetch 5 pages
- path: torrents-search.php
inputs:
page: 1
@@ -185,6 +185,12 @@
download:
selector: a[href^="download.php?id="]
attribute: href
banner:
selector: a[href^="torrents-details.php?id="]
attribute: title
filters:
- name: regexp
args: "src=\"(.*?)\""
category:
selector: td:first-child img
attribute: src
@@ -207,7 +213,7 @@
"[src$=\"/E-books.png\"]": "67"
"[src$=\"/Revista.png\"]": "68"
"[src$=\"/Aventura.png\"]": "80"
"[src$=\"/XXX.png\"]": "70"
"[src$=\"/Revistas-XXX.png\"]": "70"
"[src$=\"/Jogos-Ps4.png\"]": "79"
"[src$=\"/Jogos-PC.png\"]": "47"
"[src$=\"/Jogos-EmuladoreseRoms.png\"]": "61"

View File

@@ -78,10 +78,10 @@
- name: downloadlink
type: select
label: Download link
default: "magnet:"
default: "magnet:?xt="
options:
"/download/" : ".torrent"
"magnet:": "magnet"
"/get/key:" : ".torrent"
"magnet:?xt=": "magnet"
login:
path: /
@@ -100,7 +100,7 @@
selector: a[href="/users/logout/"]
download:
selector: a[href^="{{ .Config.downloadlink }}"]
selector: a[href*="{{ .Config.downloadlink }}"]
search:
paths:

View File

@@ -25,10 +25,19 @@
inputs:
username: "{{ .Config.username }}"
password: "{{ .Config.password }}"
remember: 1
error:
- selector: form[action*="/login"] .text-red
- selector: div.has-error
test:
path: torrents
selector: a[href$="/logout"]
ratio:
path: torrents
selector: li:has(i.fa-sync-alt)
filters:
- name: regexp
args: "Ratio : (\\d+)"
search:
paths:
@@ -36,23 +45,24 @@
inputs:
$raw: "{{range .Categories}}categories[]={{.}}&{{end}}"
search: "{{if .Query.IMDBID}}{{else}}{{ .Keywords }}{{end}}"
description: ""
uploader: ""
imdb: "{{ .Query.IMDBIDShort }}"
tvdb: ""
tmdb: ""
mal: ""
sorting: created_at
direction: desc
sort: "created_at"
direction: "desc"
qty: 100
rows:
selector: table > tbody > tr
fields:
category:
selector: a[href*="/category/"]
selector: a[href*="/categories/"]
attribute: href
filters:
- name: regexp
args: "/category/.*?\\.(\\d+)"
args: "/categories/.*?\\.(\\d+)"
title:
selector: a.view-torrent
download:
@@ -61,17 +71,28 @@
details:
selector: a.view-torrent
attribute: href
banner:
optional: true
selector: div.torrent-poster img
attribute: src
filters:
- name: replace
args: ["https://via.placeholder.com/600x900", ""]
size:
selector: td:nth-child(5)
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(8)
filters:
- name: regexp
args: ([\d\.]+)
imdb:
optional: true
selector: a[href*="www.imdb.com/title/tt"]
attribute: href
date:
selector: time
filters:
@@ -100,12 +121,17 @@
args: [" (ay|kuud|måneder|mesi|miesiące|meses|měsíce|месяца|месяцев|luni|meses|mois|Monaten|месеца|maanden)", "months"]
downloadvolumefactor:
case:
"i[data-original-title=\"100% Free\"]": "0" # Single Torrent Freeleech
"i[data-original-title=\"Personal Freeleech\"]": "0" # 24 Hour FreeLeech From BON Store
"i[data-original-title=\"Special Freeleech\"]": "0" # Special FreeLeech For Certain User Groups
"i[data-original-title=\"Freeleech Token\"]": "0" # Freeleech From Token
"i[data-original-title=\"Global FreeLeech\"]": "0" # Global Freeleech
"i[data-original-title=\"Freeleech\"]": "0" # Freeleech
"i[data-original-title=\"Featured\"]": "0" # Featured Torrent
"*": "1"
uploadvolumefactor:
case:
"i[data-original-title=\"Double upload\"]": "2" # Single Torrent Double Upload
"i[data-original-title=\"Double Upload\"]": "2" # Global Double Upload
"i[data-original-title=\"Double Upload\"]": "2" # Single Torrent Double Upload
"i[data-original-title=\"Global Double Upload\"]": "2" # Global Double Upload
"i[data-original-title=\"Featured\"]": "2" # Featured Torrent
"*": "1"
# UNIT3D
# UNIT3D 1.9.2

View File

@@ -240,8 +240,8 @@
selector: td a.gen
attribute: href
filters:
- name: querystring
args: f
- name: regexp
args: "=(\\d+)\\."
size:
selector: td a.tr-dl
seeders:
@@ -258,74 +258,35 @@
grabs:
optional: true
selector: td[title^="Replies"]
# date for English
# date for English, Russian, Ukrainian
date:
selector: td[title="Added"] p:last-of-type
optional: true
filters:
- name: dateparse
args: "2-01-06"
# date for Russian
date:
selector: td[title="Добавлен"] p:last-of-type
optional: true
selector: td[title="Added"] p:last-of-type, td[title="Добавлен"] p:last-of-type, td[title="Додано"] p:last-of-type
filters:
# replace month abbreviations
- name: replace
args: ["Янв", "Jan"]
- name: replace
args: ["Фев", "Feb"]
- name: replace
args: ["Мар", "Mar"]
- name: replace
args: ["Апр", "Apr"]
- name: replace
args: ["Май", "May"]
- name: replace
args: ["Июн", "Jun"]
- name: replace
args: ["Июл", "Jul"]
- name: replace
args: ["Авг", "Aug"]
- name: replace
args: ["Сен", "Sep"]
- name: replace
args: ["Окт", "Oct"]
- name: replace
args: ["Ноя", "Nov"]
- name: replace
args: ["Дек", "Dec"]
- name: dateparse
args: "2-Jan-06"
# date for Ukrainian
date:
selector: td[title="Додано"] p:last-of-type
optional: true
filters:
- name: replace
args: ["Січ", "Jan"]
- name: replace
args: ["Лют", "Feb"]
- name: replace
args: ["Бер", "Mar"]
- name: replace
args: ["Кві", "Apr"]
- name: replace
args: ["Травень", "May"]
- name: replace
args: ["Чер", "Jun"]
- name: replace
args: ["Лип", "Jul"]
- name: replace
args: ["Сер", "Aug"]
- name: replace
args: ["Вер", "Sep"]
- name: replace
args: ["Жов", "Oct"]
- name: replace
args: ["Лис", "Nov"]
- name: replace
args: ["Грудень", "Dec"]
- name: re_replace
args: ["Янв|Січ", "Jan"]
- name: re_replace
args: ["Фев|Лют", "Feb"]
- name: re_replace
args: ["Мар|Бер", "Mar"]
- name: re_replace
args: ["Апр|Кві", "Apr"]
- name: re_replace
args: ["Май|Травень", "May"]
- name: re_replace
args: ["Июн|Чер", "Jun"]
- name: re_replace
args: ["Июл|Лип", "Jul"]
- name: re_replace
args: ["Авг|Сер", "Aug"]
- name: re_replace
args: ["Сен|Вер", "Sep"]
- name: re_replace
args: ["Окт|Жов", "Oct"]
- name: re_replace
args: ["Ноя|Лис", "Nov"]
- name: re_replace
args: ["Дек|Грудень", "Dec"]
- name: dateparse
args: "2-Jan-06"
downloadvolumefactor:

View File

@@ -67,7 +67,9 @@
filters:
# now we put the date at the right place according scene naming rules using .Result.site_date
- name: replace
args: ["FRENCH", "{{ .Result.site_date }} FRENCH"]
args: [" FRENCH", " {{ .Result.site_date }} FRENCH"]
- name: replace
args: ["MULTI", "{{ .Result.site_date }} MULTI"]
- name: replace
args: ["TRUEFRENCH", "{{ .Result.site_date }} TRUEFRENCH"]
- name: replace

View File

@@ -16,21 +16,28 @@
categorymappings:
- {id: films, cat: Movies, desc: "Movies"}
- {id: series, cat: TV, desc: "TV"}
- {id: musique, cat: Audio, desc: "Music"}
- {id: ebook, cat: Books, desc: "Ebook"}
- {id: logiciels, cat: PC, desc: "Software"}
- {id: jeux-pc, cat: PC/Games, desc: "PC Games"}
- {id: jeux-consoles, cat: Console, desc: "Console Games"}
modes:
search: [q]
tv-search: [q, season, ep]
movie-search: [q]
settings: []
download:
selector: div#btn-download a
selector: div.btn-download a
attribute: href
search:
paths:
- path: "{{if .Keywords}}recherche/{{.Keywords}}{{else}}{{end}}"
rows:
selector: div#gauche > table > tbody > tr:has(a)
selector: table.table-corps > tbody > tr:has(a)
fields:
site_date:
selector: a
@@ -43,7 +50,9 @@
filters:
# now we put the date at the right place according scene naming rules using .Result.site_date
- name: replace
args: ["FRENCH", "{{ .Result.site_date }} FRENCH"]
args: [" FRENCH", " {{ .Result.site_date }} FRENCH"]
- name: replace
args: ["MULTI", "{{ .Result.site_date }} MULTI"]
- name: replace
args: ["TRUEFRENCH", "{{ .Result.site_date }} TRUEFRENCH"]
- name: replace
@@ -61,21 +70,21 @@
selector: div.poid
filters:
- name: re_replace
args: [ "\\.(\\d) Ko", "$1X00"]
args: [ "\\.(\\d)Ko", "$1X00"]
- name: re_replace
args: [ " Ko", "000"]
args: [ "Ko", "000"]
- name: re_replace
args: [ "\\.(\\d) Mo", "$1X00000"]
args: [ "\\.(\\d)Mo", "$1X00000"]
- name: re_replace
args: [ " Mo", "000000"]
args: [ "Mo", "000000"]
- name: re_replace
args: [ "\\.(\\d) Go", "$1X00000000"]
args: [ "\\.(\\d)Go", "$1X00000000"]
- name: re_replace
args: [ " Go", "000000000"]
args: [ "Go", "000000000"]
- name: re_replace
args: [ "\\.(\\d) To", "$1X00000000000"]
args: [ "\\.(\\d)To", "$1X00000000000"]
- name: re_replace
args: [ " To", "000000000000"]
args: [ "To", "000000000000"]
- name: replace
args: [ "X", "" ]
date:

View File

@@ -15,10 +15,11 @@
- {id: 3, cat: Audio, desc: "Music"}
- {id: 4, cat: TV/Anime, desc: "Anime"}
- {id: 5, cat: PC/0day, desc: "Apps"}
- {id: 6, cat: Books, desc: "Books"}
- {id: 6, cat: Books, desc: "eBooks"}
- {id: 7, cat: PC/Games, desc: "Games"}
- {id: 8, cat: TV/Sport, desc: "Sports"}
- {id: 9, cat: Other, desc: "Other"}
- {id: 9, cat: Other, desc: "Others"}
- {id: 10, cat: XXX, desc: "XXX"}
modes:
search: [q]
@@ -31,10 +32,19 @@
inputs:
username: "{{ .Config.username }}"
password: "{{ .Config.password }}"
remember: 1
error:
- selector: table.main:contains("Login Failed!")
- selector: div.has-error
test:
path: torrents
selector: a[href$="/logout"]
ratio:
path: torrents
selector: li:has(i.fa-sync-alt)
filters:
- name: regexp
args: "Ratio : (\\d+)"
search:
paths:
@@ -42,13 +52,14 @@
inputs:
$raw: "{{range .Categories}}categories[]={{.}}&{{end}}"
search: "{{if .Query.IMDBID}}{{else}}{{ .Keywords }}{{end}}"
description: ""
uploader: ""
imdb: "{{ .Query.IMDBIDShort }}"
tvdb: ""
tmdb: ""
mal: ""
sorting: created_at
direction: desc
sort: "created_at"
direction: "desc"
qty: 100
rows:
selector: table > tbody > tr
@@ -67,17 +78,28 @@
details:
selector: a.view-torrent
attribute: href
banner:
optional: true
selector: div.torrent-poster img
attribute: src
filters:
- name: replace
args: ["https://via.placeholder.com/600x900", ""]
size:
selector: td:nth-child(5)
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(8)
filters:
- name: regexp
args: ([\d\.]+)
imdb:
optional: true
selector: a[href*="www.imdb.com/title/tt"]
attribute: href
date:
selector: time
filters:
@@ -106,12 +128,17 @@
args: [" (ay|kuud|måneder|mesi|miesiące|meses|měsíce|месяца|месяцев|luni|meses|mois|Monaten|месеца|maanden)", "months"]
downloadvolumefactor:
case:
"i[data-original-title=\"100% Free\"]": "0" # Single Torrent Freeleech
"i[data-original-title=\"Personal Freeleech\"]": "0" # 24 Hour FreeLeech From BON Store
"i[data-original-title=\"Special Freeleech\"]": "0" # Special FreeLeech For Certain User Groups
"i[data-original-title=\"Freeleech Token\"]": "0" # Freeleech From Token
"i[data-original-title=\"Global FreeLeech\"]": "0" # Global Freeleech
"i[data-original-title=\"Freeleech\"]": "0" # Freeleech
"i[data-original-title=\"Featured\"]": "0" # Featured Torrent
"*": "1"
uploadvolumefactor:
case:
"i[data-original-title=\"Double upload\"]": "2" # Single Torrent Double Upload
"i[data-original-title=\"Double Upload\"]": "2" # Global Double Upload
"i[data-original-title=\"Double Upload\"]": "2" # Single Torrent Double Upload
"i[data-original-title=\"Global Double Upload\"]": "2" # Global Double Upload
"i[data-original-title=\"Featured\"]": "2" # Featured Torrent
"*": "1"
# UNIT3D
# UNIT3D 1.9.2

View File

@@ -6,6 +6,8 @@
type: public
encoding: UTF-8
links:
- https://www.elitetorrent.io/
legacylinks:
- https://www.elitetorrent.biz/
caps:

View File

@@ -63,7 +63,9 @@
filters:
# now we put the date at the right place according scene naming rules using .Result.site_date
- name: replace
args: ["FRENCH", "{{ .Result.site_date }} FRENCH"]
args: [" FRENCH", " {{ .Result.site_date }} FRENCH"]
- name: replace
args: ["MULTI", "{{ .Result.site_date }} MULTI"]
- name: replace
args: ["TRUEFRENCH", "{{ .Result.site_date }} TRUEFRENCH"]
- name: replace

View File

@@ -86,6 +86,10 @@
inputs:
uid: "{{ .Config.username }}"
pwd: "{{ .Config.password }}"
captcha:
type: image
selector: img[src^="access_code/"]
input: private_key
error:
- selector: tr td span[style="color:#FF0000;"]
test:

View File

@@ -12,55 +12,55 @@
categorymappings:
- {id: 17, cat: Movies/Other, desc: "VCD/SVCD - SVCD/VCD"}
- {id: 78, cat: Movies/Other, desc: "VCD/SVCD - Estrenos VCD/SVCD"}
- {id: 14, cat: Movies/SD, desc: "XVID - Series"}
- {id: 45, cat: Movies/SD, desc: "XVID - Animación"}
- {id: 46, cat: Movies/SD, desc: "XVID - Deportes"}
- {id: 47, cat: Movies/SD, desc: "XVID - Documentales"}
- {id: 14, cat: TV/SD, desc: "XVID - Series"}
- {id: 45, cat: TV/Anime, desc: "XVID - Animación"}
- {id: 46, cat: TV/Sport, desc: "XVID - Deportes"}
- {id: 47, cat: TV/Documentary, desc: "XVID - Documentales"}
- {id: 33, cat: Movies/SD, desc: "XVID - Estrenos"}
- {id: 48, cat: Movies/SD, desc: "XVID - Películas"}
- {id: 114, cat: Movies/SD, desc: "XVID - Estrenos BajaCalidad"}
- {id: 12, cat: Movies/SD, desc: "XVID - Adulto (+18)"}
- {id: 51, cat: Movies/SD, desc: "XVID - Música"}
- {id: 37, cat: Movies/DVD, desc: "DVD - Animación"}
- {id: 38, cat: Movies/DVD, desc: "DVD - Deportes"}
- {id: 39, cat: Movies/DVD, desc: "DVD - Documentales"}
- {id: 12, cat: XXX/XviD, desc: "XVID - Adulto (+18)"}
- {id: 51, cat: Audio/Video, desc: "XVID - Música"}
- {id: 37, cat: TV/Anime, desc: "DVD - Animación"}
- {id: 38, cat: TV/Sport, desc: "DVD - Deportes"}
- {id: 39, cat: TV/Documentary, desc: "DVD - Documentales"}
- {id: 40, cat: Movies/DVD, desc: "DVD - Películas"}
- {id: 41, cat: Movies/DVD, desc: "DVD - Series"}
- {id: 42, cat: Movies/DVD, desc: "DVD - Adulto (+18)"}
- {id: 43, cat: Movies/DVD, desc: "DVD - Música"}
- {id: 106, cat: Movies/HD, desc: "HDRip - Animación"}
- {id: 107, cat: Movies/HD, desc: "HDRip - Deportes"}
- {id: 108, cat: Movies/HD, desc: "HDRip - Documentales"}
- {id: 41, cat: TV/SD, desc: "DVD - Series"}
- {id: 42, cat: XXX/DVD, desc: "DVD - Adulto (+18)"}
- {id: 43, cat: Audio/Video, desc: "DVD - Música"}
- {id: 106, cat: TV/Anime, desc: "HDRip - Animación"}
- {id: 107, cat: TV/Sport, desc: "HDRip - Deportes"}
- {id: 108, cat: TV/Documentary, desc: "HDRip - Documentales"}
- {id: 109, cat: Movies/HD, desc: "HDRip - Películas"}
- {id: 110, cat: Movies/HD, desc: "HDRip - Series"}
- {id: 112, cat: Movies/HD, desc: "HDRip - Adulto (+18)"}
- {id: 111, cat: Movies/HD, desc: "HDRip - Música"}
- {id: 117, cat: Movies/3D, desc: "3D - Animación"}
- {id: 118, cat: Movies/3D, desc: "3D - Deportes"}
- {id: 119, cat: Movies/3D, desc: "3D - Documentales"}
- {id: 110, cat: TV/HD, desc: "HDRip - Series"}
- {id: 112, cat: XXX/x264, desc: "HDRip - Adulto (+18)"}
- {id: 111, cat: Audio/Video, desc: "HDRip - Música"}
- {id: 117, cat: TV/Anime, desc: "3D - Animación"}
- {id: 118, cat: TV/Sport, desc: "3D - Deportes"}
- {id: 119, cat: TV/Documentary, desc: "3D - Documentales"}
- {id: 120, cat: Movies/3D, desc: "3D - Películas"}
- {id: 121, cat: Movies/3D, desc: "3D - Adulto (+18)"}
- {id: 126, cat: Movies/HD, desc: "Micro HD - Animación"}
- {id: 127, cat: Movies/HD, desc: "Micro HD - Deportes"}
- {id: 128, cat: Movies/HD, desc: "Micro HD - Documentales"}
- {id: 121, cat: XXX, desc: "3D - Adulto (+18)"}
- {id: 126, cat: TV/Anime, desc: "Micro HD - Animación"}
- {id: 127, cat: TV/Sport, desc: "Micro HD - Deportes"}
- {id: 128, cat: TV/Documentary, desc: "Micro HD - Documentales"}
- {id: 57, cat: Movies/HD, desc: "Micro HD - Películas"}
- {id: 124, cat: Movies/HD, desc: "Micro HD - Series"}
- {id: 129, cat: Movies/HD, desc: "Micro HD - Adulto"}
- {id: 130, cat: Movies/HD, desc: "Micro HD - Música"}
- {id: 53, cat: Movies/HD, desc: "HD - Animación"}
- {id: 54, cat: Movies/HD, desc: "HD - Deportes"}
- {id: 55, cat: Movies/HD, desc: "HD - Documentales"}
- {id: 124, cat: TV/HD, desc: "Micro HD - Series"}
- {id: 129, cat: XXX/x264, desc: "Micro HD - Adulto"}
- {id: 130, cat: Audio/Video, desc: "Micro HD - Música"}
- {id: 53, cat: TV/Anime, desc: "HD - Animación"}
- {id: 54, cat: TV/Sport, desc: "HD - Deportes"}
- {id: 55, cat: TV/Documentary, desc: "HD - Documentales"}
- {id: 56, cat: Movies/HD, desc: "HD - BDrip/BDremux/FullBD"}
- {id: 58, cat: Movies/HD, desc: "HD - WEB-DL/Line Dubbed"}
- {id: 59, cat: Movies/HD, desc: "HD - Series"}
- {id: 63, cat: Movies/HD, desc: "HD - Adulto (+18)"}
- {id: 61, cat: Movies/HD, desc: "HD - Música"}
- {id: 136, cat: Movies/UHD, desc: "UHD - Animación"}
- {id: 137, cat: Movies/UHD, desc: "UHD - Deportes"}
- {id: 138, cat: Movies/UHD, desc: "UHD - Documentales"}
- {id: 59, cat: TV/HD, desc: "HD - Series"}
- {id: 63, cat: XXX/x264, desc: "HD - Adulto (+18)"}
- {id: 61, cat: Audio/Video, desc: "HD - Música"}
- {id: 136, cat: TV/Anime, desc: "UHD - Animación"}
- {id: 137, cat: TV/Sport, desc: "UHD - Deportes"}
- {id: 138, cat: TV/Documentary, desc: "UHD - Documentales"}
- {id: 139, cat: Movies/UHD, desc: "UHD - Películas"}
- {id: 140, cat: Movies/UHD, desc: "UHD - Series"}
- {id: 141, cat: Movies/UHD, desc: "UHD - Adulto (+18)"}
- {id: 140, cat: TV/UHD, desc: "UHD - Series"}
- {id: 141, cat: XXX/x264, desc: "UHD - Adulto (+18)"}
- {id: 69, cat: Audio/MP3, desc: "MP3"}
- {id: 70, cat: Audio/Lossless, desc: "FLAC"}
- {id: 71, cat: Audio/Other, desc: "Otros Formatos"}

View File

@@ -53,8 +53,9 @@
- path: filterTorrents
inputs:
search: "{{ .Keywords }}"
description: ""
uploader: ""
sort: created_at
sorting: created_at
direction: desc
qty: 100
rows:

View File

@@ -0,0 +1,129 @@
---
site: soundpark
name: SoundPark
description: "SoundPark Semi-Private RUSSIAN site dedicated to MUSIC."
language: ru-RU
type: semi-private
encoding: UTF-8
links:
- https://soundpark-club.com/
- https://soundpark-club.casa/
caps:
categories:
"Music": Audio
modes:
search: [q]
login:
path: login
method: form
form: form[action="/login"]
inputs:
username: "{{ .Config.username }}"
password: "{{ .Config.password }}"
returnto: ""
error:
- selector: div.stdmsg_text
test:
path: /
selector: a[href="/logout"]
download:
selector: a[href^="/album/download-torrent/"]
search:
paths:
- path: "{{if .Keywords}}search{{else}}music{{end}}"
inputs:
q: "{{ .Keywords }}"
num: 50
rows:
# first selector is for the music page (recent uploads) and the second selector is for the search page
selector: div[itemscope] > table.browse_albums, div.div-rellist
fields:
title:
selector: tr:nth-child(1) td:nth-child(1) h2 a, div h3 a
details:
selector: tr:nth-child(1) td:nth-child(1) h2 a, div h3 a
attribute: href
category:
text: "Music"
banner:
selector: tr:nth-child(2) td:nth-child(1) a img, div i img
attribute: src
optional: true
download:
selector: tr:nth-child(1) td:nth-child(1) h2 a, div h3 a
attribute: href
# dates come in two flavours:
# Russian, Spanish and English supported
date:
# fix for spanish yesterday, the time is not present
text: now
date:
# Today at 22:28:10
# Yesterday at 10:18:40
# Вчера в 10:18:40
# Hoy a las 07:33:17
selector: tr:nth-child(1) > td:nth-child(2) > div.details > span:nth-child(1):contains(":"), div > span.edit:contains(":")
optional: true
filters:
- name: replace
args: [" at ", " "]
- name: re_replace
args: ["Ayer a las|Вчера в", "Yesterday"]
- name: re_replace
args: ["Hoy a las|Сегодня в", "Today"]
date:
# 3 april 2019
selector: tr:nth-child(1) > td:nth-child(2) > div.details > span:nth-child(1):not(:contains(":")), div > span.edit:not(:contains(":"))
optional: true
filters:
- name: re_replace
args: ["enero|января", "January"]
- name: re_replace
args: ["febrero|февраля", "February"]
- name: re_replace
args: ["marzo|марта ", "March"]
- name: re_replace
args: ["abril|апреля", "April"]
- name: re_replace
args: ["mayo|мая", "May"]
- name: re_replace
args: ["junio|июня", "June"]
- name: re_replace
args: ["julio|июля", "July"]
- name: re_replace
args: ["agosto|августа", "August"]
- name: re_replace
args: ["septiembre|сентября", "September"]
- name: re_replace
args: ["octubre|октября", "October"]
- name: re_replace
args: ["noviembre|ноября", "November"]
- name: re_replace
args: ["diciembre|декабря", "December"]
- name: dateparse
args: "2 January 2006"
size:
# search page does not have size.
text: "500 MB"
size:
# but today's page can, if the content fixed-length string contains a title that is not too long.
selector: tr:nth-child(2) td.descr meta
attribute: content
optional: true
filters:
- name: regexp
args: "Size: (.*?),"
seeders:
text: 1
leechers:
text: 1
downloadvolumefactor:
text: 1
uploadvolumefactor:
text: 1

View File

@@ -67,24 +67,16 @@
date:
selector: td:nth-child(4)
filters:
- name: replace
args: ["heures", "hours"]
- name: replace
args: ["heure", "hour"]
- name: replace
args: ["jours", "days"]
- name: replace
args: ["jour", "day"]
- name: replace
args: ["semaines", "weeks"]
- name: replace
args: ["semaine", "week"]
- name: replace
args: ["mois", "months"]
args: ["moi", "month"]
- name: replace
args: ["ans", "years"]
- name: replace
args: ["an", "year"]
args: [" an", " year"]
- name: append
args: " ago"
size:

View File

@@ -158,11 +158,36 @@
selector: td:nth-child(7)
grabs:
selector: td:nth-child(8)
date:
selector: td:nth-child(9) img
attribute: alt
filters:
- name: timeago
- name: replace
args: ["---", "0"]
date:
selector: td:nth-child(9)
filters:
filters:
# translations for Turkish|Estonian|Danish|Italian|Polish|Norwegian|Portoguese|Czech|Russian|Romanian|Spanish|French|German|Bulgarian|Dutch
- name: re_replace
args: ["(?i)(dakika|minut|minuto|minuta|minutt|минута|Minute|minuut)", "minute"]
- name: re_replace
args: ["(?i)(dakika|minutit|minutter|minuti|minuty|minutos|минуты|минут|Minuten|минути|minuten)", "minutes"]
- name: re_replace
args: ["(?i)(saat|tund|time|ora|godzina|hora|hodina|час|oră|heure|Stunde|uur)", "hour"]
- name: re_replace
args: ["(?i)(saat|tundi|timer|ore|godziny|horas|hodiny|hoden|часа|часов|ore|heures|Stunden)", "hours"]
- name: re_replace
args: ["(?i)(gün|päev|dag|giorno|dzień|dia|den|день|zi|día|jour|Tag|ден)", "day"]
- name: re_replace
args: ["(?i)(gün|päeva|dage|giorni|dni|dias|dny|дня|дней|zile|días|jours|Tagen|дни|dagen)", "days"]
- name: re_replace
args: ["(?i)(hafta|nädal|uge|settimana|tydzień|uke|semana|týden|неделю|săptămână|semaine|Woche|седмица)", "week"]
- name: re_replace
args: ["(?i)(hafta|nädalat|uger|settimane|tygodnie|uker|semanas|týdny|недели|недель|săptămâni|semaines|Wochen|седмици|weken)", "weeks"]
- name: re_replace
args: ["(?i) (ay|kuu|måned|mese|miesiąc|mês|měsíc|месяц|lună|mes|mois|Monat|месец|maand)", "month"]
- name: re_replace
args: ["(?i) (ay|kuud|måneder|mesi|miesiące|meses|měsíce|месяца|месяцев|luni|meses|mois|Monaten|месеца|maanden)", "months"]
- name: append
args: " ago"
downloadvolumefactor:
text: "1"
uploadvolumefactor:

View File

@@ -63,7 +63,9 @@
filters:
# now we put the date at the right place according scene naming rules using .Result.site_date
- name: replace
args: ["FRENCH", "{{ .Result.site_date }} FRENCH"]
args: [" FRENCH", " {{ .Result.site_date }} FRENCH"]
- name: replace
args: ["MULTI", "{{ .Result.site_date }} MULTI"]
- name: replace
args: ["TRUEFRENCH", "{{ .Result.site_date }} TRUEFRENCH"]
- name: replace

View File

@@ -7,11 +7,12 @@
encoding: UTF-8
followredirect: true
links:
- https://www2.torrent9.ch/
- https://wwv.torrent9.vg/
legacylinks:
- https://www.torrents9.pw/
- https://www.torrent9.ch/
- https://www1.torrent9.ch/
- https://www2.torrent9.ch/
caps:
categorymappings:
@@ -72,7 +73,9 @@
filters:
# now we put the date at the right place according scene naming rules using .Result.site_date
- name: replace
args: ["FRENCH", "{{ .Result.site_date }} FRENCH"]
args: [" FRENCH", " {{ .Result.site_date }} FRENCH"]
- name: replace
args: ["MULTI", "{{ .Result.site_date }} MULTI"]
- name: replace
args: ["TRUEFRENCH", "{{ .Result.site_date }} TRUEFRENCH"]
- name: replace

View File

@@ -12,23 +12,20 @@
categorymappings:
- {id: 1, cat: Movies, desc: "Film"}
- {id: 2, cat: TV, desc: "Série"}
- {id: 3, cat: TV/Anime, desc: "Film d'Animation"}
- {id: 5, cat: TV/Sport, desc: "Sport"}
- {id: 3, cat: TV/Anime, desc: "Animés"}
- {id: 5, cat: Audio, desc: "Audios"}
- {id: 6, cat: TV/Documentary, desc: "Documentaire"}
- {id: 7, cat: Audio, desc: "Musique"}
- {id: 8, cat: Audio/Other, desc: "Podcast Audio"}
- {id: 7, cat: Other, desc: "Formations"}
- {id: 13, cat: Books/Ebook, desc: "eBooks"}
- {id: 14, cat: TV, desc: "Spectacle"}
- {id: 14, cat: Console, desc: "Jeux"}
- {id: 15, cat: Audio/Video, desc: "Concert"}
- {id: 18, cat: TV/Anime, desc: "Manga"}
- {id: 19, cat: Books/Comics, desc: "Comics"}
- {id: 20, cat: Books/Comics, desc: "Bande dessinée"}
- {id: 22, cat: Console, desc: "Jeux"}
- {id: 25, cat: PC, desc: "Logiciels"}
- {id: 27, cat: TV, desc: "Spectacles"}
modes:
search: [q]
tv-search: [q, season, ep, imdbid]
movie-search: [q, imdbid]
tv-search: [q, season, ep]
movie-search: [q]
login:
path: login
@@ -37,18 +34,14 @@
username: "{{ .Config.username }}"
password: "{{ .Config.password }}"
remember: 1
selectorinputs:
_token:
selector: meta[name="csrf-token"]
attribute: content
error:
- selector: form[action$="/login"] span strong
test:
path: /
path: torrents
selector: a[href$="/logout"]
ratio:
path: /
path: torrents
selector: span:has(i.fa-sync-alt)
filters:
- name: regexp
@@ -59,14 +52,11 @@
- path: filterTorrents
inputs:
$raw: "{{range .Categories}}categories[]={{.}}&{{end}}"
search: "{{if .Query.IMDBID}}{{else}}{{ .Keywords }}{{end}}"
search: "{{ .Keywords }}"
description: ""
uploader: ""
imdb: "{{ .Query.IMDBIDShort }}"
tvdb: ""
tmdb: ""
mal: ""
sorting: created_at
direction: desc
sort: "created_at"
direction: "desc"
qty: 100
rows:
selector: table > tbody > tr
@@ -85,21 +75,17 @@
details:
selector: a.view-torrent
attribute: href
imdb:
selector: a[href^="https://www.imdb.com/title/"]
attribute: href
optional: true
size:
selector: td:nth-child(5)
seeders:
selector: td:nth-child(7)
leechers:
selector: td:nth-child(8)
selector: td:nth-child(4)
grabs:
selector: td:nth-child(6)
selector: td:nth-child(5)
filters:
- name: regexp
args: ([\d\.]+)
seeders:
selector: td:nth-child(6)
leechers:
selector: td:nth-child(7)
date:
selector: time
filters:
@@ -117,12 +103,13 @@
args: " ago"
downloadvolumefactor:
case:
"i[data-original-title=\"100% Free\"]": "0" # Single Torrent Freeleech
"i[data-original-title=\"Freeleech\"]": "0" # Single Torrent Freeleech
"i[data-original-title=\"Global freeleech\"]": "0" # Global Freeleech
"*": "1"
uploadvolumefactor:
case:
"i[data-original-title=\"Global freeleech\"]": "2" # Global Freeleech
"i[data-original-title=\"Double upload\"]": "2" # Single Torrent Double Upload
"i[data-original-title=\"Double Upload\"]": "2" # Global Double Upload
"*": "1"
# UNIT3D
# UNIT3D 1.?

View File

@@ -139,6 +139,10 @@
type: checkbox
label: Enhance sonarr compatibility with anime by renaming episode (xxx to exxx). Works only if episode is at the end of the query. Can disturb movies search. (back to the future 3 -> back to the future e3)
default: false
- name: sonarrv3hack
type: checkbox
label: "Enable Full season search hack: Sonarrv3 send 'Series Name SXX' but it won't match 'Series Name - Saison 01' for example so we remove the 'SXX' ==> 'Series Name'"
default: true
login:
method: form
@@ -159,7 +163,7 @@
keywordsfilters:
# Full season seach hack: Sonarrv3 send 'Series Name SXX' but it won't match 'Series Name - Saison 01' for example so we remove the 'SXX' ==> 'Series Name'
- name: re_replace
args: ["(.*)[sS](\\d{1,4})$", "$1"]
args: ["(.*)[sS](\\d{1,4})$", "{{ if .Config.sonarrv3hack }}$1{{else}}$1S$2{{end}}"]
- name: replace
args: ["\"", ""]
- name: trim

View File

@@ -14,6 +14,7 @@ using Jackett.Common.Models.Config;
using Jackett.Common.Services.Interfaces;
using NLog;
using Jackett.Common.Helpers;
using System.Diagnostics;
namespace Jackett.Common.Utils.Clients
{
@@ -23,6 +24,34 @@ namespace Jackett.Common.Utils.Clients
static protected string webProxyUrl;
static protected IWebProxy webProxy;
[DebuggerNonUserCode] // avoid "Exception User-Unhandled" Visual Studio messages
static public bool ValidateCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
if (sender.GetType() != typeof(HttpWebRequest))
return sslPolicyErrors == SslPolicyErrors.None;
var request = (HttpWebRequest)sender;
var hash = certificate.GetCertHashString();
ICollection<string> hosts;
trustedCertificates.TryGetValue(hash, out hosts);
if (hosts != null)
{
if (hosts.Contains(request.Host))
return true;
}
if (sslPolicyErrors != SslPolicyErrors.None)
{
// Throw exception with certificate details, this will cause a "Exception User-Unhandled" when running it in the Visual Studio debugger.
// The certificate is only available inside this function, so we can't catch it at the calling method.
throw new Exception("certificate validation failed: " + certificate.ToString());
}
return sslPolicyErrors == SslPolicyErrors.None;
}
static public void InitProxy(ServerConfig serverConfig)
{
// dispose old SocksWebProxy
@@ -100,30 +129,7 @@ namespace Jackett.Common.Utils.Clients
}
// custom handler for our own internal certificates
ServicePointManager.ServerCertificateValidationCallback += delegate (object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
if (sender.GetType() != typeof(HttpWebRequest))
return sslPolicyErrors == SslPolicyErrors.None;
var request = (HttpWebRequest)sender;
var hash = certificate.GetCertHashString();
ICollection<string> hosts;
trustedCertificates.TryGetValue(hash, out hosts);
if (hosts != null)
{
if (hosts.Contains(request.Host))
return true;
}
if (sslPolicyErrors != SslPolicyErrors.None)
{
throw new Exception("certificate validation failed: " + certificate.ToString());
}
return sslPolicyErrors == SslPolicyErrors.None;
};
ServicePointManager.ServerCertificateValidationCallback += ValidateCertificate;
}
override protected async Task<WebClientByteResult> Run(WebRequest webRequest)

View File

@@ -14,6 +14,7 @@ using Jackett.Common.Models.Config;
using Jackett.Common.Services.Interfaces;
using NLog;
using Jackett.Common.Helpers;
using System.Diagnostics;
namespace Jackett.Common.Utils.Clients
{
@@ -30,6 +31,34 @@ namespace Jackett.Common.Utils.Clients
static protected string webProxyUrl;
static protected IWebProxy webProxy;
[DebuggerNonUserCode] // avoid "Exception User-Unhandled" Visual Studio messages
static public bool ValidateCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
if (sender.GetType() != typeof(HttpWebRequest))
return sslPolicyErrors == SslPolicyErrors.None;
var request = (HttpWebRequest)sender;
var hash = certificate.GetCertHashString();
ICollection<string> hosts;
trustedCertificates.TryGetValue(hash, out hosts);
if (hosts != null)
{
if (hosts.Contains(request.Host))
return true;
}
if (sslPolicyErrors != SslPolicyErrors.None)
{
// Throw exception with certificate details, this will cause a "Exception User-Unhandled" when running it in the Visual Studio debugger.
// The certificate is only available inside this function, so we can't catch it at the calling method.
throw new Exception("certificate validation failed: " + certificate.ToString());
}
return sslPolicyErrors == SslPolicyErrors.None;
}
static public void InitProxy(ServerConfig serverConfig)
{
// dispose old SocksWebProxy
@@ -134,30 +163,7 @@ namespace Jackett.Common.Utils.Clients
ServicePointManager.SecurityProtocol = (SecurityProtocolType)192 | (SecurityProtocolType)768 | (SecurityProtocolType)3072;
// custom handler for our own internal certificates
ServicePointManager.ServerCertificateValidationCallback += delegate (object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
if (sender.GetType() != typeof(HttpWebRequest))
return sslPolicyErrors == SslPolicyErrors.None;
var request = (HttpWebRequest)sender;
var hash = certificate.GetCertHashString();
ICollection<string> hosts;
trustedCertificates.TryGetValue(hash, out hosts);
if (hosts != null)
{
if (hosts.Contains(request.Host))
return true;
}
if (sslPolicyErrors != SslPolicyErrors.None)
{
throw new Exception("certificate validation failed: " + certificate.ToString());
}
return sslPolicyErrors == SslPolicyErrors.None;
};
ServicePointManager.ServerCertificateValidationCallback += ValidateCertificate;
}
override protected async Task<WebClientByteResult> Run(WebRequest webRequest)

View File

@@ -14,6 +14,7 @@ using Jackett.Common.Models.Config;
using Jackett.Common.Services.Interfaces;
using NLog;
using Jackett.Common.Helpers;
using System.Diagnostics;
namespace Jackett.Common.Utils.Clients
{
@@ -24,6 +25,32 @@ namespace Jackett.Common.Utils.Clients
static protected string webProxyUrl;
static protected IWebProxy webProxy;
[DebuggerNonUserCode] // avoid "Exception User-Unhandled" Visual Studio messages
static public bool ValidateCertificate(HttpRequestMessage request, X509Certificate2 certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
{
var hash = certificate.GetCertHashString();
ICollection<string> hosts;
trustedCertificates.TryGetValue(hash, out hosts);
if (hosts != null)
{
if (hosts.Contains(request.RequestUri.Host))
return true;
}
if (sslPolicyErrors != SslPolicyErrors.None)
{
// Throw exception with certificate details, this will cause a "Exception User-Unhandled" when running it in the Visual Studio debugger.
// The certificate is only available inside this function, so we can't catch it at the calling method.
throw new Exception("certificate validation failed: " + certificate.ToString());
}
return sslPolicyErrors == SslPolicyErrors.None;
}
}
static public void InitProxy(ServerConfig serverConfig)
{
// dispose old SocksWebProxy
@@ -137,26 +164,7 @@ namespace Jackett.Common.Utils.Clients
})
{
// custom certificate validation handler (netcore version)
clientHandlr.ServerCertificateCustomValidationCallback = (request, certificate, chain, sslPolicyErrors) =>
{
var hash = certificate.GetCertHashString();
ICollection<string> hosts;
trustedCertificates.TryGetValue(hash, out hosts);
if (hosts != null)
{
if (hosts.Contains(request.RequestUri.Host))
return true;
}
if (sslPolicyErrors != SslPolicyErrors.None)
{
throw new Exception("certificate validation failed: " + certificate.ToString());
}
return sslPolicyErrors == SslPolicyErrors.None;
};
clientHandlr.ServerCertificateCustomValidationCallback = ValidateCertificate;
clearanceHandlr.InnerHandler = clientHandlr;
using (var client = new HttpClient(clearanceHandlr))