Compare commits

...

74 Commits

Author SHA1 Message Date
mrhydejc
399119b2da Xthor: Add an option to search for anime on (#4434) 2019-01-11 12:45:54 +01:00
kaso17
4a03e52cb4 HDOnly: disable freeleech tokens 2019-01-11 12:44:38 +01:00
kaso17
7bcd0b5b86 Merge branch 'master' of https://github.com/Jackett/Jackett 2019-01-10 16:00:16 +01:00
kaso17
9fd4bbae4f YGGtorrent: update legacy URLs 2019-01-10 16:00:07 +01:00
Mystere98
6b536ce62f Xthor: Update Cats (#4430) 2019-01-10 15:54:28 +01:00
CodeMonkey
d878c9e05e HorribleSubs: Fix the Indexer (#4429)
- Now returns batches in results along with individual episodes
- Now returns all episodes for a show instead of just the first page
- No longer makes a bunch of unnecessary API calls (faster results)
2019-01-10 15:53:55 +01:00
snamds
cb8835b878 Newpct: fix Nan size parse (#4428) 2019-01-10 15:53:15 +01:00
flightlevel
e188454fec Use NETStandard for Jackett.Common 2019-01-10 20:22:15 +11:00
flightlevel
ab9d8f6403 Package update 2019-01-10 20:12:57 +11:00
kaso17
ce15cb8bfe TVChaosUK: download relogin 2019-01-09 20:40:50 +01:00
kaso17
9e7d1cc547 Torrent9: update urls 2019-01-09 20:20:25 +01:00
kaso17
7b2657870a BeyondHD: support highligh releases 2019-01-09 20:11:03 +01:00
kaso17
31df2c27dd Greek Team: try to fix definition 2019-01-09 20:01:10 +01:00
kaso17
b64b3504ba EZTV: avoid error 2019-01-09 19:54:53 +01:00
Mariano Gonzalez
af6c732306 Enabled systemd jackett service (#4404) 2019-01-09 19:40:16 +01:00
Kilian Cavalotti
8da6140753 Add HuSh tracker (#4409)
* Create hush.yml

Add HuSh tracker

* Update README.md

Add HuSh tracker
2019-01-09 19:39:55 +01:00
Guillaume Liautard
3c03494d85 jpopsuki: fixed an issue with tabulations in title (#4413) 2019-01-09 19:39:29 +01:00
kaso17
5af3eaa926 TorrentDay: fix download 2019-01-09 19:38:43 +01:00
Garfield69
f79608fe6c torrent9clone: back to .ch #4196 2019-01-06 13:03:21 +13:00
kaso17
316f4f2864 Merge branch 'master' of https://github.com/Jackett/Jackett 2019-01-02 13:42:44 +01:00
kaso17
71babe611a GazelleGames: update categories 2019-01-02 13:42:33 +01:00
kaso17
25ddcb10bb Update README.md 2019-01-02 13:14:04 +01:00
Scott Cooper
4c07918cd4 fix audiobookbay categorymappings id type (#4384) 2019-01-02 13:00:01 +01:00
Scott Cooper
88fc9123e7 args field takes a string (#4385) 2019-01-02 12:59:06 +01:00
kaso17
c38b668ea2 Majomparádé: fix definition 2019-01-01 16:54:55 +01:00
hallengreenn
ea1d86f107 Nordicbits - Add support for christmas theme (#4380)
Better late than never.
All themes are now supported.
2018-12-31 12:51:47 +13:00
Aurimas Navardauskas
a96237b38b Update linkomanija.yml (#4377)
It is Lithuanian tracker not Italian, that is often confused because of the .LT versus .IT domain names, however not sure how it happened here.
2018-12-30 18:51:48 +11:00
Garfield69
5c9f652ef5 gktorrent: back to .net domain 2018-12-30 08:26:29 +13:00
Garfield69
8d72b9a395 readme: AsianCinema is private 2018-12-30 07:59:22 +13:00
HDVinnie
0c3e856086 add AsianCinema (#4374)
* (Add) asiancinema.yml

* (Update) README.md

* Update README.md

* Update asiancinema.yml
2018-12-29 17:41:49 +01:00
kaso17
37216bd0a9 bakabt: remove invite needed note 2018-12-28 18:25:32 +01:00
kaso17
f9ef3b836b BakaBT: more fixes 2018-12-28 18:19:27 +01:00
kaso17
a0d0b2cb40 BakaBT: various improvements 2018-12-28 18:09:59 +01:00
kaso17
590fd5139f SceneHD: use API 2018-12-28 17:52:32 +01:00
kaso17
37ccdbb19d Torrents.Md: removed (closed) 2018-12-28 16:16:18 +01:00
kaso17
cb02cac1e1 RoDVD: fix definition 2018-12-28 16:11:49 +01:00
kaso17
ddb8095dd2 Racing4Everyone: fix definition 2018-12-28 16:11:37 +01:00
kaso17
23ee1145c5 Fuzer: update links 2018-12-28 15:47:05 +01:00
kaso17
431570e696 Anthelion: shorten name 2018-12-28 12:14:16 +01:00
kaso17
ebcb82ed80 HDForever: disable category filtering 2018-12-28 12:07:29 +01:00
kaso17
1352d1528a Magico: update links 2018-12-28 11:08:57 +01:00
kaso17
822dc191dc The Shinning: add support for alternative layout
Thank you @s0mm3rb
2018-12-28 11:03:21 +01:00
Garfield69
41bf6da9c6 cpabien: new domain 2018-12-28 16:56:50 +13:00
kaso17
f3de97be61 SceneHD: use cookie auth 2018-12-27 17:59:16 +01:00
garfield69
869efa32f4 readme: update osx build instructions 2018-12-26 16:37:03 +13:00
Garfield69
332a31afa2 cpabien: back to .bz domain 2018-12-26 07:17:54 +13:00
kaso17
398601d0ef Merge branch 'master' of https://github.com/Jackett/Jackett 2018-12-24 14:13:47 +01:00
kaso17
a5c596c200 HDCenter: add FL slot detection 2018-12-24 14:13:37 +01:00
kaso17
9b3bdc9f36 README: hide linux mono instructions 2018-12-24 13:57:33 +01:00
kaso17
56433c5aa3 README: update linux build instructions 2018-12-24 13:48:40 +01:00
m3ntalsp00n
b8a9eef6cf Add desitorrents to available indexers (#4354)
* Add desitorrents to available indexers

* Update README.md

* Update desitorrents.yml
2018-12-23 19:09:20 +01:00
Garfield69
75aef1b997 gktorrent back to .me domain 2018-12-24 06:35:24 +13:00
flightlevel
af066426fd DateTimeRoutines as only NETStandard 2018-12-23 22:19:15 +11:00
flightlevel
3999e76ae8 Build .NET Core 2018-12-23 22:12:19 +11:00
flightlevel
ef162f07e5 Ignore NU1605 2018-12-23 22:11:47 +11:00
flightlevel
7a9adc283b Update to .NET Core 2.2 2018-12-23 21:54:02 +11:00
flightlevel
7a5407d2c4 Revert "Package update"
This reverts commit eaf53e0f4c.
2018-12-23 21:25:13 +11:00
flightlevel
eaf53e0f4c Package update 2018-12-23 21:16:09 +11:00
flightlevel
81b1e64c9a Add ARM32 builds 2018-12-23 21:03:45 +11:00
flightlevel
61d333cbc3 Don't check for updates if running .NET Core 2018-12-23 21:03:09 +11:00
Garfield69
2c1b6dbf9f gktorrent: back to .org domain 2018-12-23 08:01:52 +13:00
kaso17
7644a5e3bd SpeedCD: fix login 2018-12-21 18:25:24 +01:00
kaso17
7ef2faaf09 Merge branch 'master' of https://github.com/Jackett/Jackett 2018-12-21 18:12:54 +01:00
kaso17
de0dd2b035 include install_service_systemd.sh 2018-12-21 18:12:47 +01:00
Garfield69
ccf0d546e9 gktorrent: new domain 2018-12-21 12:16:44 +13:00
Garfield69
e56f5314b2 cpabien: new domain 2018-12-21 12:14:04 +13:00
kaso17
64ac67f58b BJShare: improve search 2018-12-20 15:57:41 +01:00
kaso17
6735ad030d RuTracker: fix captcha detection 2018-12-20 15:09:48 +01:00
kaso17
041115ff0e 1337x: sort results 2018-12-20 15:01:49 +01:00
kaso17
d239197f0f AlphaRatio: update categories 2018-12-20 14:39:45 +01:00
Garfield69
115e476196 AlphaRatio add UHD cats fix #4333 2018-12-19 08:04:48 +13:00
Garfield69
98439ea414 btdb: gone 2018-12-19 07:06:21 +13:00
Garfield69
4cf798b4b4 incorsaronero: update for new incomplete CA fix #4332 2018-12-18 14:17:50 +13:00
Garfield69
806ed2d44e cpabien: back to .cx 2018-12-18 07:26:55 +13:00
59 changed files with 965 additions and 572 deletions

View File

@@ -27,7 +27,6 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
* AudioBookBay
* BTstor.net
* btbit
* BTDB
* cpasbien
* ETTV
* EliteTorrent.biz
@@ -105,10 +104,11 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
* AlphaRatio (AR)
* AnimeBytes
* AnimeTorrents (AnT)
* Anthelion (was TehConnection.me)
* Anthelion
* AOX
* ArabaFenice
* Arche Torrent
* AsianCinema
* AsianDVDClub
* AST4u
* Audiobook Torrents
@@ -116,7 +116,7 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
* Avistaz (AsiaTorrents)
* B2S-Share
* Back-ups
* BakaBT [![(invite needed)][inviteneeded]](#)
* BakaBT
* bB
* BeyondHD (BHD)
* BIGTorrent
@@ -149,6 +149,7 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
* Classix
* DanishBits
* DataScene
* DesiTorrents
* Diablo Torrent
* DigitalHive
* Downloadville
@@ -197,6 +198,7 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
* Hebits
* Hon3y HD
* HQSource
* HuSh
* Hyperay
* ICE Torrent
* I Love Classics
@@ -289,7 +291,6 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
* Torrenting
* Torrentland
* TorrentLeech (TL)
* Torrents.Md
* TorrentSeeds (TS)
* Torrent-Syndikat
* TOrrent-tuRK (TORK)
@@ -320,6 +321,14 @@ Trackers marked with [![(invite needed)][inviteneeded]](#) have no active maint
A special "all" indexer is available at `/api/v2.0/indexers/all/results/torznab/api`.
It will query all configured indexers and return the combined results.
If your client supports multiple feeds it's recommended to add each indexer directly instead of using the all indexer.
Using the all indexer has no advantages (besides reduced management overhead), only disadvantages:
* you loose control over indexer specific settings (categories, search modes, etc.)
* mixing search modes (IMDB, query, etc.) might cause low quality results
* indexer specific categories (>= 100000) can't be used.
* slow indexers will slow down the overall result
* total results are limited to 1000
To get all Jackett indexers including their capabilities you can use `t=indexers` on the all indexer. To get only configured/unconfigured indexers you can also add `configured=true/false` as query parameter.
## Installation on Windows
@@ -458,31 +467,38 @@ All contributions are welcome just send a pull request. Jackett's framework all
* 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
```bash
# manually install osx dotnet via:
https://dotnet.microsoft.com/download?initial-os=macos
# then:
git clone https://github.com/Jackett/Jackett.git
cd Jackett/src
# dotnet core version
dotnet publish Jackett.Server -f netcoreapp2.2 --self-contained -r osx-x64 -c Debug # takes care of everything
./Jackett.Server/bin/Debug/netcoreapp2.2/osx-x64/JackettConsole # run jackett
```
### Linux
```bash
sudo apt install mono-complete nuget msbuild # install build tools (debian/ubuntu)
sudo apt install mono-complete nuget msbuild dotnet-sdk-2.2 # install build tools (debian/ubuntu)
git clone https://github.com/Jackett/Jackett.git
cd Jackett/src
# dotnet core version
dotnet publish Jackett.Server -f netcoreapp2.2 --self-contained -r linux-x64 -c Debug # takes care of everything
./Jackett.Server/bin/Debug/netcoreapp2.2/linux-x64/JackettConsole # run jackett
```
<!--
# mono version (currently broken)
nuget restore Jackett.sln # prepare dependencies
msbuild Jackett.Server/Jackett.Server.csproj /t:Build /p:Configuration=Debug # compile
mono Jackett.Server/bin/Debug/JackettServer.exe # run jackett
```
-->
## Screenshots

View File

@@ -154,19 +154,21 @@ Task("Experimental-DotNetCore")
{
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");
DotNetCorePublish(serverProjectPath, "netcoreapp2.2", "win-x86");
DotNetCorePublish(serverProjectPath, "netcoreapp2.2", "osx-x64");
DotNetCorePublish(serverProjectPath, "netcoreapp2.2", "linux-x64");
DotNetCorePublish(serverProjectPath, "netcoreapp2.2", "linux-arm");
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");
Zip("./BuildOutput/Experimental/netcoreapp2.2/win-x86", $"./{artifactsDirName}/Experimental.netcoreapp.win-x86.zip");
Zip("./BuildOutput/Experimental/netcoreapp2.2/osx-x64", $"./{artifactsDirName}/Experimental.netcoreapp.osx-x64.zip");
Gzip("./BuildOutput/Experimental/netcoreapp2.2/linux-x64", $"./{artifactsDirName}", "Jackett", "Experimental.netcoreapp.linux-x64.tar.gz");
Gzip("./BuildOutput/Experimental/netcoreapp2.2/linux-arm", $"./{artifactsDirName}", "Jackett", "Experimental.netcoreapp.linux-arm.tar.gz");
});
Task("Package")
.IsDependentOn("Package-Windows-Full-Framework")
.IsDependentOn("Package-Mono-Full-Framework")
//.IsDependentOn("Experimental-DotNetCore")
.IsDependentOn("Experimental-DotNetCore")
.Does(() =>
{
Information("Packaging completed");

View File

@@ -61,6 +61,9 @@ EOL
# Reload systemd daemon
systemctl daemon-reload
# Enable the service for following restarts
systemctl enable ${jackettservice}
# Run the service
systemctl start ${jackettservice}

View File

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

View File

@@ -119,11 +119,11 @@
search:
paths:
# present trending results if there are no search parms supplied
- path: "{{if .Keywords}}/search/{{ .Keywords}}/1/{{else}}/trending{{end}}"
- path: "{{if .Keywords}}/search/{{ .Keywords}}/2/{{else}}{{end}}"
- path: "{{if .Keywords}}/search/{{ .Keywords}}/3/{{else}}{{end}}"
- path: "{{if .Keywords}}/search/{{ .Keywords}}/4/{{else}}{{end}}"
- path: "{{if .Keywords}}/search/{{ .Keywords}}/5/{{else}}{{end}}"
- path: "{{if .Keywords}}/sort-search/{{ .Keywords}}/time/desc/1/{{else}}/trending{{end}}"
- path: "{{if .Keywords}}/sort-search/{{ .Keywords}}/time/desc/2/{{else}}{{end}}"
- path: "{{if .Keywords}}/sort-search/{{ .Keywords}}/time/desc/3/{{else}}{{end}}"
- path: "{{if .Keywords}}/sort-search/{{ .Keywords}}/time/desc/4/{{else}}{{end}}"
- path: "{{if .Keywords}}/sort-search/{{ .Keywords}}/time/desc/5/{{else}}{{end}}"
keywordsfilters:
- name: replace # use this as a workaround till #893 is implemented
args: ["Greys Anatomy", "Grey's Anatomy"]

View File

@@ -0,0 +1,110 @@
---
site: asiancinema
name: AsianCinema
description: "Tracker Movies/TV/Music"
language: en-us
type: private
encoding: UTF-8
links:
- https://asiancinema.me/
caps:
categorymappings:
- {id: 1, cat: Movies, desc: "Movies"}
- {id: 2, cat: TV, desc: "TV"}
- {id: 3, cat: Audio, desc: "Music"}
modes:
search: [q]
tv-search: [q, season, ep, imdbid]
movie-search: [q, imdbid]
login:
path: /login
method: form
inputs:
username: "{{ .Config.username }}"
password: "{{ .Config.password }}"
error:
- selector: form[action*="/login"] .text-red
test:
path: /torrents
search:
paths:
- 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
rows:
selector: table > tbody > tr
fields:
category:
selector: a[href*="/categories/"]
attribute: href
filters:
- name: regexp
args: "/categories/.*?\\.(\\d+)"
title:
selector: a.view-torrent
download:
selector: a[href*="/download/"]
attribute: href
details:
selector: a.view-torrent
attribute: href
size:
selector: td:nth-child(5)
seeders:
selector: td:nth-child(7)
leechers:
selector: td:nth-child(8)
grabs:
selector: td:nth-child(6)
filters:
- name: regexp
args: ([\d\.]+)
date:
selector: time
filters:
# translations for Turkish|Estonian|Danish|Italian|Polish|Norwegian|Portoguese|Czech|Russian|Romanian|Spanish|French|German|Bulgarian|Dutch
- name: re_replace
args: ["(önce|tagasi|geleden|fa|temu|siden|atrás|nazpět|назад|acum|hace|il y a|vor|преди)", "ago"]
- name: re_replace
args: ["(dakika|minut|minuto|minuta|minutt|минута|Minute|minuut)", "minute"]
- name: re_replace
args: ["(dakika|minutit|minutter|minuti|minuty|minutos|минуты|минут|Minuten|минути|minuten)", "minutes"]
- name: re_replace
args: ["(saat|tund|time|ora|godzina|hora|hodina|час|oră|heure|Stunde|uur)", "hour"]
- name: re_replace
args: ["(saat|tundi|timer|ore|godziny|horas|hodiny|hoden|часа|часов|ore|heures|Stunden)", "hours"]
- name: re_replace
args: ["(gün|päev|dag|giorno|dzień|dia|den|день|zi|día|jour|Tag|ден)", "day"]
- name: re_replace
args: ["(gün|päeva|dage|giorni|dni|dias|dny|дня|дней|zile|días|jours|Tagen|дни|dagen)", "days"]
- name: re_replace
args: ["(hafta|nädal|uge|settimana|tydzień|uke|semana|týden|неделю|săptămână|semaine|Woche|седмица)", "week"]
- name: re_replace
args: ["(hafta|nädalat|uger|settimane|tygodnie|uker|semanas|týdny|недели|недель|săptămâni|semaines|Wochen|седмици|weken)", "weeks"]
- name: re_replace
args: ["(ay|kuu|måned|mese|miesiąc|mês|měsíc|месяц|lună|mes|mois|Monat|месец|maand)", "month"]
- name: re_replace
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=\"Global FreeLeech\"]": "0" # Global Freeleech
"*": "1"
uploadvolumefactor:
case:
"i[data-original-title=\"Double upload\"]": "2" # Single Torrent Double Upload
"i[data-original-title=\"Double Upload\"]": "2" # Global Double Upload
"*": "1"

View File

@@ -54,7 +54,7 @@
- {id: Sports, cat: Audio/Audiobook, desc: "Sports"}
- {id: Suspense, cat: Audio/Audiobook, desc: "Suspense"}
- {id: Thriller, cat: Audio/Audiobook, desc: "Thriller"}
- {id: True, cat: Audio/Audiobook, desc: "True Crime"}
- {id: "True", 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"}

View File

@@ -1,74 +0,0 @@
---
site: btdb
name: BTDB
description: "BTDB is a Public BitTorrent DHT search engine. Torrents can be downloaded via magnet links"
language: en-us
type: public
encoding: UTF-8
links:
- https://btdb.unblocked.app/
legacylinks:
- https://btdb.to/
caps:
categorymappings:
- {id: 1, cat: Other, desc: "Other"}
modes:
search: [q]
tv-search: [q, season, ep]
movie-search: [q]
settings:
- name: info
type: info
label: Category for Sonarr and Radarr
default: BTDB does not use categories. In your Sonarr or Radarr Torznab Indexer settings, set the category to 100001.
search:
paths:
- path: "{{if .Keywords}}q/{{ .Keywords}}/?sort=time{{else}}q/test/{{end}}"
- path: "{{if .Keywords}}q/{{ .Keywords}}/2?sort=time{{else}}{{end}}"
- path: "{{if .Keywords}}q/{{ .Keywords}}/3?sort=time{{else}}{{end}}"
- path: "{{if .Keywords}}q/{{ .Keywords}}/4?sort=time{{else}}{{end}}"
- path: "{{if .Keywords}}q/{{ .Keywords}}/5?sort=time{{else}}{{end}}"
- path: "{{if .Keywords}}q/{{ .Keywords}}/6?sort=time{{else}}{{end}}"
- path: "{{if .Keywords}}q/{{ .Keywords}}/7?sort=time{{else}}{{end}}"
- path: "{{if .Keywords}}q/{{ .Keywords}}/8?sort=time{{else}}{{end}}"
- path: "{{if .Keywords}}q/{{ .Keywords}}/9?sort=time{{else}}{{end}}"
- path: "{{if .Keywords}}q/{{ .Keywords}}/10?sort=time{{else}}{{end}}"
rows:
selector: li[class$="item"]
filters:
- name: andmatch
fields:
title:
selector: h2[class$="title"] a[href^="/torrent/"]
attribute: title
category:
text: "1"
details:
selector: h2[class$="title"] a[href^="/torrent/"]
attribute: href
magnet:
selector: div[class$="info"] a[href^="magnet:"]
attribute: href
size:
selector: div[class$="info"] span:nth-of-type(1)
files:
selector: div[class$="info"] span:nth-of-type(2)
date:
selector: div[class$="info"] span:nth-of-type(3)
filters:
- name: dateparse
args: "2006-01-02 15:04:05"
grabs:
selector: div[class$="info"] span:nth-of-type(4)
seeders:
selector: div[class$="info"] span:nth-of-type(4)
leechers:
selector: div[class$="info"] span:nth-of-type(4)
downloadvolumefactor:
text: "0"
uploadvolumefactor:
text: "1"

View File

@@ -86,7 +86,7 @@
- name: append
args: "Language: polish\n<br>"
- name: prepend
args: {{ .Result.description }}
args: "{{ .Result.description }}"
imdb:
optional: true
selector: a[href^="http://www.imdb.com/title/tt"]

View File

@@ -7,16 +7,14 @@
encoding: UTF-8
followredirect: true
links:
- https://www.cpasbien.blue/
- https://www.cpabien.link/
legacylinks:
- http://www.cpasbiens.cc/
- http://www.cpabien.cm/
- http://cpabien.cm/
- http://cpasbiens1.com/
- http://cpabien.mx/
- https://www.cpabien.bz/
- http://www.cpabien.bz/
- http://www.cpabien.cx/
- http://cpabien.org/
- http://cpabien.cc/
- http://cpabien.co/
@@ -26,9 +24,14 @@
- https://ww1.cpabien.io/
- https://wvw.cpabien.cm/
- https://www.cpabien.io/
- https://www.cpabien.cx/
- https://www.cpabien9.net/
- https://wwv.cpabien.cm/
- http://www.cpabien.cx/
- https://www.cpasbien.blue/
- https://www.cpabien.cx/
- https://www.cpasbien.re/
- http://www.cpasbien.io/
- https://www.cpabien.bz/
caps:
categorymappings:
@@ -42,13 +45,16 @@
settings: []
download:
selector: div.btn-download a
selector: div#telecharger a
attribute: href
search:
paths:
- path: "{{ if .Keywords }}recherche/{{ .Keywords }}{{else}}derniers/{{end}}"
- path: search.php
method: post
inputs:
t: "{{ .Keywords }}"
rows:
selector: table.table-corps tbody tr td
selector: div.ligne1, div.ligne2
fields:
site_date:
selector: a

View File

@@ -0,0 +1,146 @@
---
site: desitorrents
name: DesiTorrents
description: "Desitorrents is a Private Torrent Tracker for BOLLYWOOD / TOLLYWOOD / GENERAL"
language: en-US
type: private
encoding: UTF-8
links:
- https://desitorrents.tv/
caps:
categorymappings:
# movies
- {id: 47, cat: Movies, desc: "Movies/Bollywood"}
- {id: 48, cat: Movies, desc: "Movies/Bengali"}
- {id: 49, cat: Movies, desc: "Movies/Tamil"}
- {id: 51, cat: Movies, desc: "Movies/Punjabi"}
- {id: 52, cat: Movies, desc: "Movies/Marathi"}
- {id: 53, cat: Movies, desc: "Movies/Malayalam"}
- {id: 54, cat: Movies, desc: "Movies/Kannada"}
- {id: 55, cat: Movies, desc: "Movies/Gujarati"}
- {id: 56, cat: Movies, desc: "Movies/Foreign"}
- {id: 57, cat: Movies, desc: "Movies/Lollywood"}
- {id: 58, cat: Movies, desc: "Movies/Hollywood"}
- {id: 103, cat: Movies, desc: "Movies/Telugu"}
- {id: 104, cat: Movies, desc: "Movies/South Dubbed"}
- {id: 110, cat: Movies, desc: "Movies/Documentary"}
- {id: 117, cat: Movies, desc: "Movies/Bhojpuri"}
- {id: 124, cat: Movies, desc: "Movies/Movie Packs"}
- {id: 128, cat: Movies, desc: "Movies/Dubbed Audio"}
- {id: 129, cat: Movies, desc: "Movies/Animated"}
# tv shows
- {id: 59, cat: TV, desc: "TV/Colors"}
- {id: 60, cat: TV, desc: "TV/Sony"}
- {id: 61, cat: TV, desc: "TV/& TV"}
- {id: 62, cat: TV, desc: "TV/Starplus"}
- {id: 63, cat: TV, desc: "TV/ZeeTV"}
- {id: 97, cat: TV, desc: "TV/Life Ok"}
- {id: 98, cat: TV, desc: "TV/Docu"}
- {id: 101, cat: TV/Sport, desc: "TV/Sports"}
- {id: 102, cat: TV/Other, desc: "TV/Others"}
- {id: 113, cat: TV, desc: "TV/Pak Drama"}
- {id: 125, cat: TV, desc: "TV/TV Packs"}
- {id: 130, cat: TV, desc: "TV/Star Bharat"}
- {id: 132, cat: TV, desc: "TV/SAB TV"}
# music
- {id: 67, cat: Audio/Video, desc: "Music Video"}
- {id: 68, cat: Audio, desc: "Hindi Soundtrack"}
- {id: 70, cat: Audio, desc: "Remix"}
- {id: 71, cat: Audio, desc: "Ghazal"}
- {id: 72, cat: Audio, desc: "Instrumental"}
- {id: 105, cat: Audio, desc: "Telugu Music"}
- {id: 106, cat: Audio, desc: "Tmil Music"}
- {id: 107, cat: Audio, desc: "Punjabi Music"}
- {id: 108, cat: Audio, desc: "Gujarati Music"}
- {id: 109, cat: Audio, desc: "Compilations"}
- {id: 118, cat: Audio, desc: "Kannada Music"}
- {id: 126, cat: Audio, desc: "Marathi"}
- {id: 127, cat: Audio, desc: "Lollywood"}
- {id: 131, cat: Audio, desc: "Classical"}
# games
- {id: 78, cat: PC/Games, desc: "PC"}
- {id: 79, cat: PC/Games, desc: "Mac"}
- {id: 80, cat: PC/Games, desc: "IOS"}
- {id: 81, cat: PC/Games, desc: "Android"}
- {id: 83, cat: PC/Games, desc: "XBOX"}
- {id: 86, cat: PC/Games, desc: "Playstation"}
# XXX
- {id: 89, cat: XXX, desc: "Adult Videos"}
- {id: 90, cat: XXX, desc: "Adult Pics"}
modes:
search: [q]
settings:
- name: username
type: text
label: Username
- name: password
type: password
label: Password
login:
path: /login.php?from=index1
method: post
inputs:
action: "login"
username: "{{ .Config.username }}"
password: "{{ .Config.password }}"
error:
- selector: ":contains(\"-WARNING-\")"
test:
path: ajax.php
search:
paths:
- path: ajax.php?action=search_torrent_cats
method: post
inputs:
search_string: "{{ .Keywords }}"
selected_sorting: "relevance"
selected_group: ""
search_username: ""
selected_sub[]: "{{join .Categories \",\"}}"
error:
- selector: ":contains(\"Something was wrong with your request\")"
preprocessingfilters:
- name: replace
args: ["{\"torrent_html\":\"", ""]
- name: replace
args: ["\\", ""]
- name: re_replace
args: ["\",\"paging.*", ""]
- name: prepend
args: "<table>"
- name: append
args: "</table>"
rows:
selector: table > tbody > tr
fields:
title:
selector: th:nth-child(2) > a[href]
details:
selector: th:nth-child(2) > a[href]
attribute: href
files:
selector: th:nth-child(8)
# no standard for categories yet :(
download:
selector: th:nth-child(5) > a[href]
attribute: href
filters:
- name: prepend
args: "{{ .Config.sitelink }}"
grabs:
selector: th:nth-child(11)
size:
selector: th:nth-child(7)
seeders:
selector: th:nth-child(9)
leechers:
selector: th:nth-child(10)
downloadvolumefactor:
text: "0"
uploadvolumefactor:
text: "1"

View File

@@ -28,7 +28,7 @@
- name: re_replace
args: ["S[0-9]{2}([^E]|$)", ""] # remove season tag without episode (search doesn't support it)
rows:
selector: "table.forum_header_border tr[name='hover'].forum_header_border"
selector: "table.forum_header_border tr[name='hover'].forum_header_border:has(a.magnet)" # some torrents don't have any download links, skip them
filters:
- name: andmatch
fields:

View File

@@ -7,9 +7,8 @@
encoding: UTF-8
followredirect: true
links:
- https://www.gktorrent.co/
- https://www.gktorrent.net/
legacylinks:
- https://www.gktorrent.org/
- https://www.gktorrent.com/
- http://www.gktorrent.com/
- http://ww1.gktorrent.com/
@@ -17,11 +16,13 @@
- https://ww2.gktorrent.com/
- https://ww3.gktorrent.com/
- http://www.gktorrent.net/
- https://www.gktorrent.net/
- https://ww4.gktorrent.com/
- https://www.gktorrent.me/
- http://www.gktorrent.co/
- https://www.gktorrent.co/
- https://www.gktorrent.ws/
- https://www.gktorrent.org/
- https://www.gktorrent.me/
- https://www.rantop.org/
caps:
categorymappings:
- {id: movies, cat: Movies, desc: "Movies"}
@@ -40,7 +41,7 @@
settings: []
download:
selector: a[href^="/get_torrent/"]
selector: a[href*="/get_torrent/"]
search:
paths:

View File

@@ -121,20 +121,20 @@
download:
text: "download2.php?torrent={{ .Result._id }}"
size:
selector: td:nth-last-child(4)
selector: td:nth-last-child(3)
date:
selector: td:nth-last-child(6) > nobr
selector: td:nth-last-child(5) > nobr
filters:
- name: append
args: " +02:00"
- name: dateparse
args: "2006-01-0215:04:05 -07:00"
files:
selector: td:nth-last-child(7)
selector: td:nth-last-child(6)
seeders:
selector: td:nth-last-child(3)
leechers:
selector: td:nth-last-child(2)
leechers:
selector: td:nth-last-child(1)
downloadvolumefactor:
case:
"img[src=\"pic/free.png\"]": "0"

View File

@@ -97,6 +97,7 @@
selector: td.leecher_col
downloadvolumefactor:
case:
"span.freeleech_slot": "0" # 24h freeelech slot
"span.freeleech": "0"
"*": "1"
uploadvolumefactor:

View File

@@ -90,7 +90,7 @@
- name: append
args: "Language: polish\n<br>"
- name: prepend
args: {{ .Result.description }}
args: "{{ .Result.description }}"
description:
optional: true
selector: img[src="pic/napisy.png"]
@@ -98,7 +98,7 @@
- name: append
args: "Subbed\n<br>"
- name: prepend
args: {{ .Result.description }}
args: "{{ .Result.description }}"
imdb:
optional: true
selector: a[href^="http://www.imdb.com/title/tt"]

View File

@@ -0,0 +1,109 @@
---
site: hush
name: HuSh
description: "HuSh is a community-built Movie/TV/FANRES database."
language: fr-fr
type: private
encoding: UTF-8
links:
- https://team-hush.org/
caps:
categorymappings:
- {id: 1, cat: Movies, desc: "Movies"}
- {id: 2, cat: TV, desc: "TV"}
- {id: 3, cat: Movies, desc: "FANRES"}
modes:
search: [q]
tv-search: [q, season, ep, imdbid]
movie-search: [q, imdbid]
login:
path: /login
method: form
inputs:
username: "{{ .Config.username }}"
password: "{{ .Config.password }}"
error:
- selector: form[action*="/login"] .text-red
test:
path: /torrents
search:
paths:
- 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
rows:
selector: table > tbody > tr
fields:
category:
selector: a[href*="/categories/"]
attribute: href
filters:
- name: regexp
args: "/categories/.*?\\.(\\d+)"
title:
selector: a.view-torrent
download:
selector: a[href*="/download/"]
attribute: href
details:
selector: a.view-torrent
attribute: href
size:
selector: td:nth-child(5)
seeders:
selector: td:nth-child(7)
leechers:
selector: td:nth-child(8)
grabs:
selector: td:nth-child(6)
filters:
- name: regexp
args: ([\d\.]+)
date:
selector: time
filters:
# translations for Turkish|Estonian|Danish|Italian|Polish|Norwegian|Portoguese|Czech|Russian|Romanian|Spanish|French|German|Bulgarian|Dutch
- name: re_replace
args: ["(önce|tagasi|geleden|fa|temu|siden|atrás|nazpět|назад|acum|hace|il y a|vor|преди)", "ago"]
- name: re_replace
args: ["(dakika|minut|minuto|minuta|minutt|минута|Minute|minuut)", "minute"]
- name: re_replace
args: ["(dakika|minutit|minutter|minuti|minuty|minutos|минуты|минут|Minuten|минути|minuten)", "minutes"]
- name: re_replace
args: ["(saat|tund|time|ora|godzina|hora|hodina|час|oră|heure|Stunde|uur)", "hour"]
- name: re_replace
args: ["(saat|tundi|timer|ore|godziny|horas|hodiny|hoden|часа|часов|ore|heures|Stunden)", "hours"]
- name: re_replace
args: ["(gün|päev|dag|giorno|dzień|dia|den|день|zi|día|jour|Tag|ден)", "day"]
- name: re_replace
args: ["(gün|päeva|dage|giorni|dni|dias|dny|дня|дней|zile|días|jours|Tagen|дни|dagen)", "days"]
- name: re_replace
args: ["(hafta|nädal|uge|settimana|tydzień|uke|semana|týden|неделю|săptămână|semaine|Woche|седмица)", "week"]
- name: re_replace
args: ["(hafta|nädalat|uger|settimane|tygodnie|uker|semanas|týdny|недели|недель|săptămâni|semaines|Wochen|седмици|weken)", "weeks"]
- name: re_replace
args: ["(ay|kuu|måned|mese|miesiąc|mês|měsíc|месяц|lună|mes|mois|Monat|месец|maand)", "month"]
- name: re_replace
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=\"Global FreeLeech\"]": "0" # Global Freeleech
"*": "1"
uploadvolumefactor:
case:
"i[data-original-title=\"Double upload\"]": "2" # Single Torrent Double Upload
"i[data-original-title=\"Double Upload\"]": "2" # Global Double Upload

View File

@@ -17,6 +17,7 @@
- c414bf4ad6c69841693c147849f4c314aa200bdf # incomplete CA chain
- 3a402766ce22fd1aa24bfc1a4fd47e9309eb8c98 # incomplete CA chain
- 160f832730737a70264768ceddf3cd94bc51ffb7 # incomplete CA chain
- a60e969b27965d4dc2ff45d50c20e2e872d4e9b9 # incomplete CA chain
caps:
categorymappings:

View File

@@ -69,6 +69,8 @@
filters:
- name: replace
args: [" ()", ""]
- name: replace
args: ["\t", ""]
- name: replace
args: [" / Freeleech!", ""]
category:

View File

@@ -1,7 +1,7 @@
---
site: linkomanija
name: LinkoManija
description: "LinkoManija is an ITALIAN Private site for TV / MOVIES / GENERAL"
description: "LinkoManija is an LITHUANIAN Private site for TV / MOVIES / GENERAL"
language: lt-lt
type: private
encoding: UTF-8

View File

@@ -6,6 +6,8 @@
type: private
encoding: UTF-8
links:
- https://magico.one/
legacylinks:
- https://magico.info/
caps:

View File

@@ -96,11 +96,13 @@
title:
selector: a[href^="details.php?id="] > b
attribute: title
title:
selector: a[href^="details.php?id="] > b[title*="Torrent neve:"]
optional: true
attribute: title
filters:
- name: re_replace
args: ["^Torrent neve: ", ""]
- name: re_replace
args: ["<br />.*", ""]
- name: regexp
args: "Torrent neve: (.*?)<"
description:
selector: a[href^="details.php?id="] > b
attribute: title
@@ -122,7 +124,7 @@
attribute: href
banner:
optional: true
selector: img[src="pic/borito.png"]
selector: img[src="pic/borito.png"], a[href^="details.php?id="] > b[title*="Torrent neve:"]
attribute: title
filters:
- name: regexp

View File

@@ -90,7 +90,7 @@
- name: append
args: "Language: polish\n<br>"
- name: prepend
args: {{ .Result.description }}
args: "{{ .Result.description }}"
description:
optional: true
selector: img[src="pic/napisy.png"]
@@ -98,7 +98,7 @@
- name: append
args: "Subbed\n<br>"
- name: prepend
args: {{ .Result.description }}
args: "{{ .Result.description }}"
imdb:
optional: true
selector: a[href^="http://www.imdb.com/title/tt"]

View File

@@ -72,13 +72,13 @@
selector: a.view-torrent
attribute: href
size:
selector: td:nth-child(4)
seeders:
selector: td:nth-child(6)
leechers:
selector: td:nth-child(7)
grabs:
selector: td:nth-child(5)
seeders:
selector: td:nth-child(7)
leechers:
selector: td:nth-child(8)
grabs:
selector: td:nth-child(6)
filters:
- name: regexp
args: ([\d\.]+)

View File

@@ -85,7 +85,7 @@
- name: append
args: "Language: polish\n<br>"
- name: prepend
args: {{ .Result.description }}
args: "{{ .Result.description }}"
imdb:
optional: true
selector: a[href^="http://www.imdb.com/title/tt"]

View File

@@ -107,7 +107,7 @@
selector: a[href*="http://www.imdb.com/title/tt"]
attribute: href
size:
selector: td:nth-child(6)
selector: td:nth-child(4)
seeders:
text: 9999
leechers:

View File

@@ -1,111 +0,0 @@
---
site: scenehd
name: SceneHD
description: "SceneHD is Private site for HD TV / MOVIES"
language: en-us
type: private
encoding: UTF-8
links:
- https://scenehd.org/
certificates:
- 81cc4e41b6f8ff656ca0e2396ee6d63383198bf1 # self signed
caps:
categorymappings:
- {id: 2, cat: Movies/UHD, desc: "Movie/2160"}
- {id: 1, cat: Movies/HD, desc: "Movie/1080"}
- {id: 4, cat: Movies/HD, desc: "Movie/720"}
- {id: 8, cat: Movies/Bluray, desc: "Movie/BD5/9"}
- {id: 6, cat: TV/UHD, desc: "TV/2160"}
- {id: 5, cat: TV/HD, desc: "TV/1080"}
- {id: 7, cat: TV/HD, desc: "TV/720"}
- {id: 22, cat: Movies/Bluray, desc: "Bluray/Complete"}
- {id: 10, cat: XXX, desc: "XXX"}
- {id: 16, cat: Movies/Other, desc: "Subpacks"}
- {id: 13, cat: Audio/Video, desc: "MVID"}
- {id: 9, cat: Other, desc: "Other"}
modes:
search: [q]
movie-search: [q, imdbid]
tv-search: [q, season, ep, imdbid]
login:
path: login.php
method: form
form: form#loginform
inputs:
username: "{{ .Config.username }}"
password: "{{ .Config.password }}"
error:
- selector: body:contains("Your username or password was incorrect.")
test:
path: browse.php
search:
paths:
- path: browse.php
inputs:
$raw: "{{range .Categories}}categories[{{.}}]=1&{{end}}"
search: "{{if .Query.IMDBID}}{{else}}{{ .Keywords }}{{end}}"
imdb: "{{if .Query.IMDBID}}{{ .Query.IMDBIDShort }}{{else}}{{end}}"
rows:
selector: table.browse > tbody > tr
fields:
download:
selector: td.browse_dl > a
attribute: href
title:
selector: td.browse_name > a[href^="details.php?id="]
category:
selector: td.browse_cat a
attribute: href
filters:
- name: querystring
args: cat
imdb:
selector: td.browse_imdb > a.catlink
optional: true
attribute: href
details:
selector: td.browse_name > a[href^="details.php?id="]
attribute: href
files:
selector: a[href*="&filelist"]
filters:
- name: replace
args: ["Files", ""]
size:
selector: td.browse_centernowrap:has(a[href*="&filelist"])
remove: small
date:
selector: td:nth-child(8)
filters:
- name: append
args: " +0200"
- name: dateparse
args: "2006-01-0215:04:05 -0700"
grabs:
selector: td:nth-child(9)
filters:
- name: regexp
args: ([\d,]+)
seeders:
selector: td:nth-child(10)
filters:
- name: split
args: ["/", 0]
leechers: # some torrents have extra partial seeders: 18 / 0 (3)
selector: td:nth-child(10)
filters:
- name: split
args: ["/", 1]
- name: split
args: [" ", 0]
downloadvolumefactor:
case:
a.freetorrent: "0"
"*": "1"
uploadvolumefactor:
case:
"*": "1"

View File

@@ -107,7 +107,8 @@
orderby: "added"
sort: "desc"
rows:
selector: table.main > tbody > tr:contains("Alle Torrents") + tr > td > table.tableinborder > tbody > tr
# correct selector depends on the "Empfohlene Torrents in der Liste anzeigen" profile option
selector: table.main > tbody > tr:contains("Alle Torrents") + tr > td > table.tableinborder > tbody > tr, div.bro_torr_wrap:not(:contains("Alle Torrents")) > table.tableinborder > tbody > tr
filters:
- name: andmatch
fields:

View File

@@ -7,7 +7,7 @@
encoding: UTF-8
followredirect: true
links:
- https://ww1.torrent9.ph/
- https://www.torrent9.uno/
legacylinks:
- http://www.torrent9.ec/
- http://www.torrent9.red/
@@ -20,6 +20,8 @@
- https://ww2.torrent9.blue/
- https://www.torrent9.rip/
- https://www.torrent9.ph/
- https://ww1.torrent9.ph/
- https://torrent9.ga/
caps:
categorymappings:

View File

@@ -1,14 +1,14 @@
---
site: torrent9clone
name: Torrent9 clone (torrents9.pw)
name: Torrent9 clone (torrent9.ch)
description: "Torrent9 is a FRENCH Public site for TV / MOVIES / GENERAL"
language: fr-fr
type: public
encoding: UTF-8
links:
- https://www.torrents9.pw/
legacylinks:
- https://www.torrent9.ch/
legacylinks:
- https://www.torrents9.pw/
caps:
categorymappings:

View File

@@ -1,96 +0,0 @@
---
site: torrentsmd
name: Torrents.Md
description: "Torrents.Md is a Moldovan Private site for TV / MOVIES / GENERAL"
language: ru-mo
type: private
encoding: UTF-8
links:
- https://torrentsmd.com/
caps:
categorymappings:
- {id: 1, cat: Movies, desc: "Filme"}
- {id: 2, cat: Audio, desc: "Muzică"}
- {id: 3, cat: PC, desc: "Software"}
- {id: 4, cat: Console, desc: "Jocuri"}
- {id: 5, cat: TV, desc: "Tv"}
- {id: 7, cat: Other, desc: "Alte"}
- {id: 8, cat: Books, desc: "Cărţi"}
- {id: 9, cat: Audio/Video, desc: "Muzică video"}
- {id: 10, cat: TV/Anime, desc: "Anime"}
- {id: 11, cat: Movies, desc: "Filme animate"}
- {id: 12, cat: Movies/DVD, desc: "DVD"}
- {id: 13, cat: Movies, desc: "Filme documentare"}
- {id: 14, cat: Audio/Audiobook, desc: "Cărţi audio"}
- {id: 15, cat: Other, desc: "Lecţii video"}
- {id: 16, cat: Other, desc: "Fotografii"}
- {id: 17, cat: TV/Sport, desc: "Sport"}
- {id: 18, cat: TV/HD, desc: "HDTV"}
modes:
search: [q]
tv-search: [q, season, ep]
login:
path: login.php
method: form
form: form
inputs:
username: "{{ .Config.username }}"
password: "{{ .Config.password }}"
error:
- selector: td.embedded:has(h2:contains("eşuată"))
test:
path: browse.php
search:
paths:
- path: "{{if .Query.Keywords}}search.php{{else}}browse.php{{end}}"
inputs:
search_str: "{{ .Query.Keywords }}"
rows:
selector: table.tableTorrents > 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^="/details.php?id="]
attribute: href
filters:
- name: replace
args: ["/details.php", "/download.php"]
files:
selector: td:nth-child(3)
date:
selector: td:nth-child(5)
filters:
- name: replace
args: ["ore", "hours ago"]
- name: replace
args: ["minute", "minutes ago"]
- name: dateparse
args: "01-02 2006"
- name: dateparse
args: "01-02"
size:
selector: td:nth-child(6)
seeders:
selector: td:nth-child(7)
leechers:
selector: td:nth-child(8)
downloadvolumefactor:
case:
"*": "1"
uploadvolumefactor:
case:
"*": "1"

View File

@@ -25,6 +25,7 @@
- https://ygg.to/
- https://www.ygg.to/
- https://ww3.yggtorrent.gg/
- https://www.yggtorrent.gg/
caps:
categorymappings:

View File

@@ -23,6 +23,7 @@ namespace Jackett.Common.Indexers.Abstract
protected string DownloadUrl { get { return SiteLink + "torrents.php?action=download&usetoken=" + (useTokens ? "1" : "0") + "&id="; } }
protected string DetailsUrl { get { return SiteLink + "torrents.php?torrentid="; } }
protected bool supportsFreeleechTokens;
protected bool supportsCategories = true; // set to false if the tracker doesn't include the categories in the API search results
protected bool useTokens = false;
new ConfigurationDataBasicLogin configData
@@ -108,7 +109,7 @@ namespace Jackett.Common.Indexers.Abstract
queryCollection.Add("order_by", "time");
queryCollection.Add("order_way", "desc");
if (!string.IsNullOrWhiteSpace(query.ImdbID))
{
queryCollection.Add("cataloguenumber", query.ImdbID);
@@ -130,9 +131,12 @@ namespace Jackett.Common.Indexers.Abstract
if (query.Album != null)
queryCollection.Add("groupname", query.Album);
foreach (var cat in MapTorznabCapsToTrackers(query))
if (supportsCategories)
{
queryCollection.Add("filter_cat[" + cat + "]", "1");
foreach (var cat in MapTorznabCapsToTrackers(query))
{
queryCollection.Add("filter_cat[" + cat + "]", "1");
}
}
searchUrl += "?" + queryCollection.GetQueryString();

View File

@@ -24,28 +24,34 @@ namespace Jackett.Common.Indexers
AddCategoryMapping(1, TorznabCatType.TVSD, "TvSD");
AddCategoryMapping(2, TorznabCatType.TVHD, "TvHD");
AddCategoryMapping(3, TorznabCatType.TVSD, "TvDVDRip");
AddCategoryMapping(4, TorznabCatType.TVSD, "TvPackSD");
AddCategoryMapping(5, TorznabCatType.TVHD, "TvPackHD");
AddCategoryMapping(6, TorznabCatType.MoviesSD, "MovieSD");
AddCategoryMapping(7, TorznabCatType.MoviesHD, "MovieHD");
AddCategoryMapping(8, TorznabCatType.MoviesSD, "MoviePackSD");
AddCategoryMapping(9, TorznabCatType.MoviesHD, "MoviePackHD");
AddCategoryMapping(10, TorznabCatType.XXX, "MovieXXX");
AddCategoryMapping(11, TorznabCatType.AudioVideo, "MviD");
AddCategoryMapping(12, TorznabCatType.PCGames, "GamesPC");
AddCategoryMapping(13, TorznabCatType.ConsoleXbox, "GamesxBox");
AddCategoryMapping(14, TorznabCatType.ConsolePS3, "GamesPS3");
AddCategoryMapping(15, TorznabCatType.ConsoleWii, "GamesWii");
AddCategoryMapping(16, TorznabCatType.PC0day, "AppsPC");
AddCategoryMapping(17, TorznabCatType.PCMac, "AppsMAC");
AddCategoryMapping(18, TorznabCatType.PC0day, "AppsLinux");
AddCategoryMapping(19, TorznabCatType.PCPhoneOther, "AppsMobile");
AddCategoryMapping(20, TorznabCatType.XXX, "0dayXXX");
AddCategoryMapping(21, TorznabCatType.Books, "eBook");
AddCategoryMapping(22, TorznabCatType.AudioAudiobook, "AudioBook");
AddCategoryMapping(23, TorznabCatType.AudioOther, "Music");
AddCategoryMapping(24, TorznabCatType.Other, "Misc");
AddCategoryMapping(3, TorznabCatType.TVUHD, "TvUHD");
AddCategoryMapping(4, TorznabCatType.TVSD, "TvDVDRip");
AddCategoryMapping(5, TorznabCatType.TVSD, "TvPackSD");
AddCategoryMapping(6, TorznabCatType.TVHD, "TvPackHD");
AddCategoryMapping(7, TorznabCatType.TVUHD, "TvPackUHD");
AddCategoryMapping(8, TorznabCatType.MoviesSD, "MovieSD");
AddCategoryMapping(9, TorznabCatType.MoviesHD, "MovieHD");
AddCategoryMapping(10, TorznabCatType.MoviesUHD, "MovieUHD");
AddCategoryMapping(11, TorznabCatType.MoviesSD, "MoviePackSD");
AddCategoryMapping(12, TorznabCatType.MoviesHD, "MoviePackHD");
AddCategoryMapping(13, TorznabCatType.MoviesUHD, "MoviePackUHD");
AddCategoryMapping(14, TorznabCatType.XXX, "MovieXXX");
AddCategoryMapping(15, TorznabCatType.MoviesBluRay, "Bluray");
AddCategoryMapping(16, TorznabCatType.TVAnime, "AnimeSD");
AddCategoryMapping(17, TorznabCatType.TVAnime, "AnimeHD");
AddCategoryMapping(18, TorznabCatType.PCGames, "GamesPC");
AddCategoryMapping(19, TorznabCatType.ConsoleXbox, "GamesxBox");
AddCategoryMapping(20, TorznabCatType.ConsolePS4, "GamesPS");
AddCategoryMapping(21, TorznabCatType.ConsoleWii, "GamesNin");
AddCategoryMapping(22, TorznabCatType.PC0day, "AppsWindows");
AddCategoryMapping(23, TorznabCatType.PCMac, "AppsMAC");
AddCategoryMapping(24, TorznabCatType.PC0day, "AppsLinux");
AddCategoryMapping(25, TorznabCatType.PCPhoneOther, "AppsMobile");
AddCategoryMapping(26, TorznabCatType.XXX, "0dayXXX");
AddCategoryMapping(27, TorznabCatType.Books, "eBook");
AddCategoryMapping(28, TorznabCatType.AudioAudiobook, "AudioBook");
AddCategoryMapping(29, TorznabCatType.AudioOther, "Music");
AddCategoryMapping(30, TorznabCatType.Other, "Misc");
}
protected override string GetSearchTerm(TorznabQuery query)

View File

@@ -14,7 +14,7 @@ namespace Jackett.Common.Indexers
};
public TehConnectionMe(IIndexerConfigurationService configService, WebClient webClient, Logger logger, IProtectionService protectionService)
: base(name: "Anthelion (TehConnection.me)",
: base(name: "Anthelion", // old name: TehConnection.me
desc: "A movies tracker",
link: "https://anthelion.me/",
configService: configService,

View File

@@ -26,8 +26,9 @@ namespace Jackett.Common.Indexers
private readonly char[] _digits = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };
private readonly Dictionary<string, string> _commonSearchTerms = new Dictionary<string, string>
{
{ "agents of shield", "Agents of S.H.I.E.L.D."}
};
{ "agents of shield", "Agents of S.H.I.E.L.D."},
{ "greys anatomy", "grey's anatomy"},
};
public override string[] LegacySiteLinks { get; protected set; } = new string[] {
"https://bj-share.me/"
@@ -104,7 +105,8 @@ namespace Jackett.Common.Indexers
{
// Search does not support searching with episode numbers so strip it if we have one
// Ww AND filter the result later to archive the proper result
return isAnime ? term.TrimEnd(_digits) : Regex.Replace(term, @"[S|E]\d\d", string.Empty).Trim();
term = Regex.Replace(term, @"[S|E]\d\d", string.Empty).Trim();
return isAnime ? term.TrimEnd(_digits) : term;
}
private static string FixAbsoluteNumbering(string title)
@@ -126,8 +128,13 @@ namespace Jackett.Common.Indexers
protected override async Task<IEnumerable<ReleaseInfo>> PerformQuery(TorznabQuery query)
{
query = query.Clone(); // avoid modifing the original query
var releases = new List<ReleaseInfo>();
// if the search string is empty use the "last 24h torrents" view
if (string.IsNullOrWhiteSpace(query.SearchTerm) && !query.IsImdbQuery)
{

View File

@@ -16,7 +16,7 @@ namespace Jackett.Common.Indexers
{
public class BakaBT : BaseWebIndexer
{
public string SearchUrl { get { return SiteLink + "browse.php?only=0&incomplete=1&lossless=1&hd=1&multiaudio=1&bonus=1&reorder=1&q="; } }
public string SearchUrl { get { return SiteLink + "browse.php?only=0&hentai=1&incomplete=1&lossless=1&hd=1&multiaudio=1&bonus=1&reorder=1&q="; } }
public string LoginUrl { get { return SiteLink + "login.php"; } }
public string id = "bakabt";
@@ -133,12 +133,16 @@ namespace Jackett.Common.Indexers
release.Title = release.Title.Substring(0, insertPoint) + "Season 1 " + release.Title.Substring(insertPoint);
}
release.Description = release.Title;
release.Category = new List<int>() { TorznabCatType.TVAnime.ID };
release.Description = qRow.Find("span.tags").Text();
release.Guid = new Uri(SiteLink + qTitleLink.Attr("href"));
release.Comments = release.Guid;
release.Link = new Uri(SiteLink + qRow.Find(".peers a").First().Attr("href"));
var grabs = qRow.Find(".peers").Get(0).FirstChild.NodeValue.TrimEnd().TrimEnd('/').TrimEnd();
grabs = grabs.Replace("k", "000");
release.Grabs = int.Parse(grabs);
release.Seeders = int.Parse(qRow.Find(".peers a").Get(0).InnerText);
release.Peers = release.Seeders + int.Parse(qRow.Find(".peers a").Get(1).InnerText);
@@ -165,6 +169,13 @@ namespace Jackett.Common.Indexers
release.PublishDate = DateTime.ParseExact(dateStr, "dd MMM yy", CultureInfo.InvariantCulture);
}
if (qRow.Find("span.freeleech").Length > 0)
release.DownloadVolumeFactor = 0;
else
release.DownloadVolumeFactor = 1;
release.UploadVolumeFactor = 1;
releases.Add(release);
}
}

View File

@@ -126,7 +126,7 @@ namespace Jackett.Common.Indexers
try
{
CQ dom = results.Content;
var rows = dom["table.torrenttable > tbody > tr.browse_color"];
var rows = dom["table.torrenttable > tbody > tr.browse_color, table.torrenttable > tbody > tr.highlight"];
foreach (var row in rows)
{
var release = new ReleaseInfo();

View File

@@ -19,6 +19,10 @@ namespace Jackett.Common.Indexers
{
public class Fuzer : BaseWebIndexer
{
public override string[] LegacySiteLinks { get; protected set; } = new string[] {
"https://fuzer.me/",
};
private string SearchUrl { get { return SiteLink + "browse.php"; } }
private string LoginUrl { get { return SiteLink + "login.php"; } }
private const int MAXPAGES = 3;
@@ -32,7 +36,7 @@ namespace Jackett.Common.Indexers
public Fuzer(IIndexerConfigurationService configService, Utils.Clients.WebClient w, Logger l, IProtectionService ps)
: base(name: "Fuzer",
description: "Fuzer is a private torrent website with israeli torrents.",
link: "https://fuzer.me/",
link: "https://www.fuzer.me/",
configService: configService,
client: w,
logger: l,

View File

@@ -167,6 +167,10 @@ namespace Jackett.Common.Indexers
AddCategoryMapping("Watara Supervision", TorznabCatType.ConsoleOther, "Watara Supervision");
AddCategoryMapping("Retro - Other", TorznabCatType.ConsoleOther, "Retro - Other");
// special categories (real categories/not platforms)
AddCategoryMapping("OST", TorznabCatType.AudioOther, "OST");
AddCategoryMapping("Applications", TorznabCatType.PC0day, "Applications");
AddCategoryMapping("E-Books", TorznabCatType.BooksEbook, "E-Books");
}
public override async Task<IndexerConfigurationStatus> ApplyConfiguration(JToken configJson)

View File

@@ -22,7 +22,8 @@ namespace Jackett.Common.Indexers
Language = "fr-fr";
Type = "private";
AddCategoryMapping(1, TorznabCatType.MoviesHD, "Movies/HD");
this.supportsCategories = false; // they have categories but the API never returns the category, always default to Movie
AddCategoryMapping(1, TorznabCatType.MoviesHD, "Movie");
}
}
}

View File

@@ -18,7 +18,7 @@ namespace Jackett.Common.Indexers
logger: logger,
protectionService: protectionService,
webClient: webClient,
supportsFreeleechTokens: true // not verified
supportsFreeleechTokens: false // ratiofree
)
{
Language = "fr-fr";

View File

@@ -46,7 +46,7 @@ namespace Jackett.Common.Indexers
configData.LoadValuesFromJson(configJson);
var releases = await PerformQuery(new TorznabQuery());
await ConfigureIfOK(string.Empty, releases.Count() > 0, () =>
await ConfigureIfOK(string.Empty, releases.Any(), () =>
{
throw new Exception("Could not find releases from this URL");
});
@@ -56,10 +56,57 @@ namespace Jackett.Common.Indexers
protected override async Task<IEnumerable<ReleaseInfo>> PerformQuery(TorznabQuery query)
{
return await PerformQuery(query, 0);
var ResultParser = new HtmlParser();
var releases = new List<ReleaseInfo>();
var searchString = query.GetQueryString();
var queryCollection = new NameValueCollection();
if (string.IsNullOrWhiteSpace(searchString))
{
return await PerformLatestQuery(query);
}
else
{
queryCollection.Add("method", "search");
searchString = searchString.Replace("'", ""); // ignore ' (e.g. search for america's Next Top Model)
queryCollection.Add("value", searchString);
}
var searchUrl = ApiEndpoint + "?" + queryCollection.GetQueryString();
var response = await RequestStringWithCookiesAndRetry(searchUrl, string.Empty);
try
{
if (response.Content.Contains("Nothing was found"))
{
return releases.ToArray();
}
var dom = ResultParser.Parse(response.Content);
var resultLinks = dom.QuerySelectorAll("ul > li > a");
var uniqueShowLinks = new HashSet<string>();
foreach (var resultLink in resultLinks)
{
var href = SiteLink + resultLink.Attributes["href"].Value.Substring(1); // = https://horriblesubs.info/shows/boruto-naruto-next-generations#71
var showUrl = href.Substring(0, href.LastIndexOf("#"));
uniqueShowLinks.Add(showUrl);
}
foreach (var showLink in uniqueShowLinks)
{
var showReleases = await GetReleases(showLink, latestOnly: false);
releases.AddRange(showReleases);
}
}
catch (Exception ex)
{
OnParseError(response.Content, ex);
}
return releases;
}
private async Task<IEnumerable<ReleaseInfo>> PerformLatestQuery(TorznabQuery query, int attempts)
private async Task<IEnumerable<ReleaseInfo>> PerformLatestQuery(TorznabQuery query)
{
var ResultParser = new HtmlParser();
var releases = new List<ReleaseInfo>();
@@ -80,13 +127,14 @@ namespace Jackett.Common.Indexers
var dom = ResultParser.Parse(response.Content);
var latestresults = dom.QuerySelectorAll("ul > li > a");
foreach (var row in latestresults)
foreach (var resultLink in latestresults)
{
var href = SiteLink + row.Attributes["href"].Value.Substring(1);
var showrels = await GetRelease(href);
releases.AddRange(showrels);
var href = SiteLink + resultLink.Attributes["href"].Value.Substring(1); // = https://horriblesubs.info/shows/boruto-naruto-next-generations#71
var episodeNumber = href.Substring(href.LastIndexOf("#") + 1); // = 71
var showUrl = href.Substring(0, href.LastIndexOf("#"));
var showReleases = await GetReleases(showUrl, latestOnly: true, titleContains: episodeNumber);
releases.AddRange(showReleases);
}
}
catch (Exception ex)
{
@@ -96,15 +144,12 @@ namespace Jackett.Common.Indexers
return releases;
}
private async Task<IEnumerable<ReleaseInfo>> GetRelease(string ResultURL)
private async Task<IEnumerable<ReleaseInfo>> GetReleases(string ResultURL, bool latestOnly, string titleContains = null)
{
var releases = new List<ReleaseInfo>();
var ResultParser = new HtmlParser();
try
{
var episodeno = ResultURL.Substring(ResultURL.LastIndexOf("#") + 1); // = 71
ResultURL = ResultURL.Replace("#" + episodeno, ""); // = https://horriblesubs.info/shows/boruto-naruto-next-generations
var showPageResponse = await RequestStringWithCookiesAndRetry(ResultURL, string.Empty);
await FollowIfRedirect(showPageResponse);
@@ -116,12 +161,28 @@ namespace Jackett.Common.Indexers
int ShowID = int.Parse(match.Groups[2].Value);
string showAPIURL = ApiEndpoint + "?method=getshows&type=show&showid=" + ShowID; //https://horriblesubs.info/api.php?method=getshows&type=show&showid=869
var showAPIResponse = await RequestStringWithCookiesAndRetry(showAPIURL, string.Empty);
var apiUrls = new string[] {
ApiEndpoint + "?method=getshows&type=batch&showid=" + ShowID, //https://horriblesubs.info/api.php?method=getshows&type=batch&showid=1194
ApiEndpoint + "?method=getshows&type=show&showid=" + ShowID //https://horriblesubs.info/api.php?method=getshows&type=show&showid=869
};
var releaserows = new List<AngleSharp.Dom.IElement>();
foreach (string apiUrl in apiUrls)
{
int nextId = 0;
while(true)
{
var showAPIResponse = await RequestStringWithCookiesAndRetry(apiUrl + "&nextid=" + nextId, string.Empty);
var showAPIdom = ResultParser.Parse(showAPIResponse.Content);
var releaseRowResults = showAPIdom.QuerySelectorAll("div.rls-info-container");
releaserows.AddRange(releaseRowResults);
nextId++;
var showAPIdom = ResultParser.Parse(showAPIResponse.Content);
var releaserows = showAPIdom.QuerySelectorAll("div.rls-info-container");
if (releaseRowResults.Length == 0 || latestOnly) {
break;
}
}
}
foreach (var releaserow in releaserows)
{
@@ -130,14 +191,14 @@ namespace Jackett.Common.Indexers
title = title.Replace("SD720p1080p", "");
title = title.Replace(dateStr, "");
if (title.Contains(episodeno) == false)
if (!string.IsNullOrWhiteSpace(titleContains) && !title.Contains(titleContains))
{
continue;
}
// Ensure fansub group name is present in the title
// This is needed for things like configuring tag restrictions in Sonarr
if (title.Contains("[HorribleSubs]") == false)
if (!title.Contains("[HorribleSubs]"))
{
title = "[HorribleSubs] " + title;
}
@@ -175,6 +236,7 @@ namespace Jackett.Common.Indexers
if (p480.QuerySelector(".hs-torrent-link > a") != null)
{
release.Link = new Uri(p480.QuerySelector(".hs-torrent-link > a").GetAttribute("href"));
release.Comments = new Uri(release.Link.AbsoluteUri.Replace("/torrent", string.Empty));
release.Guid = release.Link;
}
if (p480.QuerySelector(".hs-magnet-link > a") != null)
@@ -204,6 +266,7 @@ namespace Jackett.Common.Indexers
if (p720.QuerySelector(".hs-torrent-link > a") != null)
{
release.Link = new Uri(p720.QuerySelector(".hs-torrent-link > a").GetAttribute("href"));
release.Comments = new Uri(release.Link.AbsoluteUri.Replace("/torrent", string.Empty));
release.Guid = release.Link;
}
if (p720.QuerySelector(".hs-magnet-link > a") != null)
@@ -233,6 +296,7 @@ namespace Jackett.Common.Indexers
if (p1080.QuerySelector(".hs-torrent-link > a") != null)
{
release.Link = new Uri(p1080.QuerySelector(".hs-torrent-link > a").GetAttribute("href"));
release.Comments = new Uri(release.Link.AbsoluteUri.Replace("/torrent", string.Empty));
release.Guid = release.Link;
}
if (p1080.QuerySelector(".hs-magnet-link > a") != null)
@@ -250,55 +314,5 @@ namespace Jackett.Common.Indexers
}
return releases;
}
public async Task<IEnumerable<ReleaseInfo>> PerformQuery(TorznabQuery query, int attempts)
{
var ResultParser = new HtmlParser();
var releases = new List<ReleaseInfo>();
var searchString = query.GetQueryString();
var queryCollection = new NameValueCollection();
if (string.IsNullOrWhiteSpace(searchString))
{
return await PerformLatestQuery(query, attempts);
}
else
{
queryCollection.Add("method", "search");
searchString = searchString.Replace("'", ""); // ignore ' (e.g. search for america's Next Top Model)
queryCollection.Add("value", searchString);
}
var searchUrl = ApiEndpoint + "?" + queryCollection.GetQueryString();
var response = await RequestStringWithCookiesAndRetry(searchUrl, string.Empty);
try
{
if (response.Content.Contains("Nothing was found"))
{
return releases.ToArray();
}
var dom = ResultParser.Parse(response.Content);
var showlinks = dom.QuerySelectorAll("ul > li > a");
foreach (var showlink in showlinks)
{
var href = SiteLink + showlink.Attributes["href"].Value.Substring(1); // = https://horriblesubs.info/shows/boruto-naruto-next-generations#71
var showrels = await GetRelease(href);
releases.AddRange(showrels);
}
}
catch (Exception ex)
{
OnParseError(response.Content, ex);
}
return releases;
}
}
}

View File

@@ -543,8 +543,15 @@ namespace Jackett.Common.Indexers
var pubDateText = span[1].TextContent.Trim();
var sizeText = span[2].TextContent.Trim();
long size = ReleaseInfo.GetBytes(sizeText);
DateTime publishDate = DateTime.ParseExact(pubDateText, "dd-MM-yyyy", null);
long size = 0;
try
{
size = ReleaseInfo.GetBytes(sizeText);
} catch
{
}
DateTime publishDate;
DateTime.TryParseExact(pubDateText, "dd-MM-yyyy", null, DateTimeStyles.None, out publishDate);
var div = row.QuerySelector("div");
@@ -654,7 +661,8 @@ namespace Jackett.Common.Indexers
result.Category = new List<int> { TorznabCatType.Movies.ID };
}
result.Size = size;
if (size > 0)
result.Size = size;
result.Link = new Uri(detailsUrl);
result.Guid = result.Link;
result.PublishDate = publishDate;

View File

@@ -679,13 +679,21 @@ namespace Jackett.Common.Indexers
private CQ FindTorrentRows()
{
var defaultTheme = new[] { "/templates/1/", "/templates/2/", "/templates/3/", "/templates/4/", "/templates/5/", "/templates/6/", "/templates/11/", "/templates/12/" };
var oldV2 = new[] { "/templates/7/", "/templates/8/", "/templates/9/", "/templates/10/", "/templates/14/" };
var oldV2 = new[] { "/templates/7/", "/templates/8/", "/templates/9/", "/templates/10/" };
var xmas = new[] { "/templates/14/" };
if (xmas.Any(_fDom.Document.Body.InnerHTML.Contains))
{
// Return all occurencis of torrents found
// $('#base_around > table.mainouter > tbody > tr > td.outer > div.article > table > tbody:not(:first) > tr')
return _fDom["#base_around > table.mainouter > tbody > tr > td.outer > div.article > table > tbody:not(:first) > tr"];
}
// template 7 contains a reference to template 2 (logout button), so check for oldV2 first
if (oldV2.Any(_fDom.Document.Body.InnerHTML.Contains))
{
// Return all occurencis of torrents found
// $('#base_content > table.mainouter > tbody > tr > td.outer > div.article > table > tbody')
// $('#base_content > table.mainouter > tbody > tr > td.outer > div.article > table > tbody > tr:not(:first)')
return _fDom["# base_content > table.mainouter > tbody > tr > td.outer > div.article > table > tbody > tr:not(:first)"];
}
@@ -695,7 +703,6 @@ namespace Jackett.Common.Indexers
// $('#base_content2 > div.article > table > tbody:not(:first) > tr')
return _fDom["# base_content2 > div.article > table > tbody:not(:first) > tr"];
}
return _fDom;
}

View File

@@ -0,0 +1,168 @@
using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Jackett.Common.Models;
using Jackett.Common.Models.IndexerConfig;
using Jackett.Common.Services.Interfaces;
using Jackett.Common.Utils;
using Jackett.Common.Utils.Clients;
using Newtonsoft.Json.Linq;
using NLog;
namespace Jackett.Common.Indexers
{
public class SceneHD : BaseWebIndexer
{
private string SearchUrl { get { return SiteLink + "browse.php"; } }
private new ConfigurationDataCookie configData
{
get { return (ConfigurationDataCookie)base.configData; }
set { base.configData = value; }
}
public SceneHD(IIndexerConfigurationService configService, WebClient c, Logger l, IProtectionService ps)
: base(name: "SceneHD",
description: "SceneHD is Private site for HD TV / MOVIES",
link: "https://scenehd.org/",
configService: configService,
caps: new TorznabCapabilities(),
client: c,
logger: l,
p: ps,
configData: new ConfigurationDataCookie())
{
Encoding = Encoding.UTF8;
Language = "en-us";
Type = "private";
TorznabCaps.SupportsImdbSearch = true;
webclient.EmulateBrowser = false;
webclient.AddTrustedCertificate(new Uri(SiteLink).Host, "81CC4E41B6F8FF656CA0E2396EE6D63383198BF1");
AddCategoryMapping(2, TorznabCatType.MoviesUHD, "Movie/2160");
AddCategoryMapping(1, TorznabCatType.MoviesHD, "Movie/1080");
AddCategoryMapping(4, TorznabCatType.MoviesHD, "Movie/720");
AddCategoryMapping(8, TorznabCatType.MoviesBluRay, "Movie/BD5/9");
AddCategoryMapping(6, TorznabCatType.TVUHD, "TV/2160");
AddCategoryMapping(5, TorznabCatType.TVHD, "TV/1080");
AddCategoryMapping(7, TorznabCatType.TVHD, "TV/720");
AddCategoryMapping(22, TorznabCatType.MoviesBluRay, "Bluray/Complete");
AddCategoryMapping(10, TorznabCatType.XXX, "XXX");
AddCategoryMapping(16, TorznabCatType.MoviesOther, "Subpacks");
AddCategoryMapping(13, TorznabCatType.AudioVideo, "MVID");
AddCategoryMapping(9, TorznabCatType.Other, "Other");
}
public override async Task<IndexerConfigurationStatus> ApplyConfiguration(JToken configJson)
{
LoadValuesFromJson(configJson);
// TODO: implement captcha
CookieHeader = configData.Cookie.Value;
try
{
var results = await PerformQuery(new TorznabQuery());
if (results.Count() == 0)
{
throw new Exception("Your cookie did not work");
}
IsConfigured = true;
SaveConfig();
return IndexerConfigurationStatus.Completed;
}
catch (Exception e)
{
IsConfigured = false;
throw new Exception("Your cookie did not work: " + e.Message);
}
}
protected override async Task<IEnumerable<ReleaseInfo>> PerformQuery(TorznabQuery query)
{
TimeZoneInfo.TransitionTime startTransition = TimeZoneInfo.TransitionTime.CreateFloatingDateRule(new DateTime(1, 1, 1, 3, 0, 0), 3, 5, DayOfWeek.Sunday);
TimeZoneInfo.TransitionTime endTransition = TimeZoneInfo.TransitionTime.CreateFloatingDateRule(new DateTime(1, 1, 1, 4, 0, 0), 10, 5, DayOfWeek.Sunday);
TimeSpan delta = new TimeSpan(1, 0, 0);
TimeZoneInfo.AdjustmentRule adjustment = TimeZoneInfo.AdjustmentRule.CreateAdjustmentRule(new DateTime(1999, 10, 1), DateTime.MaxValue.Date, delta, startTransition, endTransition);
TimeZoneInfo.AdjustmentRule[] adjustments = { adjustment };
TimeZoneInfo Tz = TimeZoneInfo.CreateCustomTimeZone("custom", new TimeSpan(1, 0, 0), "custom", "custom", "custom", adjustments);
var releases = new List<ReleaseInfo>();
NameValueCollection qParams = new NameValueCollection();
qParams.Add("api", "");
if(query.ImdbIDShort != null)
qParams.Add("imdb", query.ImdbIDShort);
else
qParams.Add("search", query.SearchTerm);
foreach (var cat in MapTorznabCapsToTrackers(query))
{
qParams.Add("categories["+cat+"]", "1");
}
string urlSearch = SearchUrl;
urlSearch += "?" + qParams.GetQueryString();
var response = await RequestStringWithCookiesAndRetry(urlSearch);
if (response.IsRedirect)
throw new Exception("not logged in");
try
{
var jsonContent = JArray.Parse(response.Content);
var sitelink = new Uri(SiteLink);
foreach (var item in jsonContent)
{
var release = new ReleaseInfo();
var id = item.Value<long>("id");
release.Title = item.Value<string>("name");
var imdbid = item.Value<string>("imdbid");
if (!string.IsNullOrEmpty(imdbid))
release.Imdb = long.Parse(imdbid);
var category = item.Value<string>("category");
release.Category = MapTrackerCatToNewznab(category);
release.Link = new Uri(sitelink, "/download.php?id=" + id);
release.Comments = new Uri(sitelink, "/details.php?id=" + id);
release.Guid = release.Comments;
var dateStr = item.Value<string>("added");
var dateTime = DateTime.SpecifyKind(DateTime.ParseExact(dateStr, "yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture), DateTimeKind.Unspecified);
var pubDateUtc = TimeZoneInfo.ConvertTimeToUtc(dateTime, Tz);
release.PublishDate = pubDateUtc;
release.Grabs = item.Value<long>("times_completed");
release.Files = item.Value<long>("numfiles");
release.Seeders = item.Value<int>("seeders");
release.Peers = item.Value<int>("leechers") + release.Seeders;
var size = item.Value<string>("size");
release.Size = ReleaseInfo.GetBytes(size);
var is_freeleech = item.Value<int>("is_freeleech");
if (is_freeleech == 1)
release.DownloadVolumeFactor = 0;
else
release.DownloadVolumeFactor = 1;
release.UploadVolumeFactor = 1;
releases.Add(release);
}
}
catch (Exception ex)
{
OnParseError(response.Content, ex);
}
return releases;
}
}
}

View File

@@ -18,7 +18,7 @@ namespace Jackett.Common.Indexers
{
public class SpeedCD : BaseWebIndexer
{
private string LoginUrl { get { return SiteLink + "take.login.php"; } }
private string LoginUrl { get { return SiteLink + "takelogin.php"; } }
private string SearchUrl { get { return SiteLink + "browse.php"; } }
private new ConfigurationDataBasicLogin configData

View File

@@ -215,7 +215,7 @@ namespace Jackett.Common.Indexers
var infoMatch = Regex.Match(description, @"Category:\W(?<cat>.*)\W\/\WSeeders:\W(?<seeders>[\d,]*)\W\/\WLeechers:\W(?<leechers>[\d,]*)\W\/\WSize:\W(?<size>[\d\.]*\W\S*)\W\/\WSnatched:\W(?<snatched>[\d,]*) x times");
if (!infoMatch.Success)
throw new Exception(string.Format("Unable to find info in {0}: ", description));
var release = new ReleaseInfo()
{
Title = title,
@@ -324,5 +324,17 @@ namespace Jackett.Common.Indexers
return releases;
}
public override async Task<byte[]> Download(Uri link)
{
var response = await base.Download(link);
if (response.Length >= 1 && response[0] == '<') // issue #4395
{
// relogin
await ApplyConfiguration(null);
response = await base.Download(link);
}
return response;
}
}
}

View File

@@ -238,7 +238,7 @@ namespace Jackett.Common.Indexers
var torrentID = (long)torrent.t;
release.Comments = new Uri(SiteLink + "details.php?id=" + torrentID);
release.Guid = release.Comments;
release.Link = new Uri(SiteLink + "download.php/" + torrentID + "/dummy.torrent");
release.Link = new Uri(SiteLink + "download.php/" + torrentID + "/"+ torrentID + ".torrent");
release.PublishDate = DateTimeUtil.UnixTimestampToDateTime((long)torrent.ctime).ToLocalTime();
release.Size = (long)torrent.size;

View File

@@ -6,6 +6,7 @@ using System.Linq;
using System.Net;
using System.Reflection;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using Jackett.Common.Models;
using Jackett.Common.Models.IndexerConfig.Bespoke;
@@ -31,6 +32,7 @@ namespace Jackett.Common.Indexers
private string TorrentCommentUrl => TorrentDescriptionUrl;
private string TorrentDescriptionUrl => SiteLink + "details.php?id={id}";
private bool EnhancedAnime => ConfigData.EnhancedAnime.Value;
private bool DevMode => ConfigData.DevMode.Value;
private bool CacheMode => ConfigData.HardDriveCache.Value;
private static string Directory => Path.Combine(Path.GetTempPath(), Assembly.GetExecutingAssembly().GetName().Name.ToLower(), MethodBase.GetCurrentMethod().DeclaringType?.Name.ToLower());
@@ -58,63 +60,73 @@ namespace Jackett.Common.Indexers
TorznabCaps.Categories.Clear();
// Movies
AddCategoryMapping(6, TorznabCatType.MoviesSD, "XVID");
AddCategoryMapping(7, TorznabCatType.MoviesSD, "X264");
AddCategoryMapping(95, TorznabCatType.MoviesSD, "WEBRIP");
AddCategoryMapping(5, TorznabCatType.MoviesHD, "HD 720P");
AddCategoryMapping(4, TorznabCatType.MoviesHD, "HD 1080P X264");
AddCategoryMapping(100, TorznabCatType.MoviesHD, "HD 1080P X265");
AddCategoryMapping(94, TorznabCatType.MoviesHD, "WEBDL");
AddCategoryMapping(107, TorznabCatType.MoviesHD, "4K");
AddCategoryMapping(1, TorznabCatType.MoviesBluRay, "FULL BLURAY");
AddCategoryMapping(2, TorznabCatType.MoviesBluRay, "BLURAY REMUX");
AddCategoryMapping(3, TorznabCatType.MoviesBluRay, "FULL BLURAY 3D");
AddCategoryMapping(8, TorznabCatType.MoviesDVD, "FULL DVD");
AddCategoryMapping(9, TorznabCatType.MoviesOther, "VOSTFR");
AddCategoryMapping(36, TorznabCatType.XXX, "XXX");
AddCategoryMapping(118, TorznabCatType.MoviesBluRay, "UHD FULL BLURAY");
AddCategoryMapping(119, TorznabCatType.MoviesBluRay, "UHD BLURAY REMUX");
AddCategoryMapping(107, TorznabCatType.MoviesUHD, "UHD 2160P X265");
AddCategoryMapping(1, TorznabCatType.MoviesBluRay, "FULL BLURAY");
AddCategoryMapping(2, TorznabCatType.MoviesBluRay, "BLURAY REMUX");
AddCategoryMapping(100, TorznabCatType.MoviesHD, "HD 1080P X265");
AddCategoryMapping(4, TorznabCatType.MoviesHD, "HD 1080P X264");
AddCategoryMapping(5, TorznabCatType.MoviesHD, "HD 720P X264");
AddCategoryMapping(7, TorznabCatType.MoviesSD, "SD X264");
AddCategoryMapping(8, TorznabCatType.MoviesDVD, "FULL DVD");
AddCategoryMapping(3, TorznabCatType.Movies3D, "3D");
AddCategoryMapping(6, TorznabCatType.MoviesSD, "XVID");
AddCategoryMapping(122, TorznabCatType.MoviesHD, "HDTV");
AddCategoryMapping(94, TorznabCatType.MoviesWEBDL, "WEBDL");
AddCategoryMapping(95, TorznabCatType.MoviesWEBDL, "WEBRIP");
AddCategoryMapping(12, TorznabCatType.TVDocumentary, "DOCS");
AddCategoryMapping(33, TorznabCatType.MoviesOther, "SPECTACLE");
AddCategoryMapping(31, TorznabCatType.MoviesOther, "ANIMATION");
AddCategoryMapping(9, TorznabCatType.MoviesOther, "VOSTFR");
// Series
AddCategoryMapping(14, TorznabCatType.TVSD, "SD VF");
AddCategoryMapping(16, TorznabCatType.TVSD, "SD VF VOSTFR");
AddCategoryMapping(15, TorznabCatType.TVHD, "HD VF");
AddCategoryMapping(17, TorznabCatType.TVHD, "HD VF VOSTFR");
AddCategoryMapping(13, TorznabCatType.TVOTHER, "PACK");
AddCategoryMapping(98, TorznabCatType.TVOTHER, "PACK VOSTFR HD");
AddCategoryMapping(16, TorznabCatType.TVOTHER, "PACK VOSTFR SD");
AddCategoryMapping(30, TorznabCatType.TVOTHER, "EMISSIONS");
AddCategoryMapping(34, TorznabCatType.TVOTHER, "EMISSIONS");
AddCategoryMapping(33, TorznabCatType.TVOTHER, "SHOWS");
// Anime
AddCategoryMapping(31, TorznabCatType.TVAnime, "MOVIES ANIME");
AddCategoryMapping(32, TorznabCatType.TVAnime, "SERIES ANIME");
AddCategoryMapping(110, TorznabCatType.TVAnime, "ANIME VOSTFR");
AddCategoryMapping(101, TorznabCatType.TVAnime, "PACK ANIME");
// Documentaries
AddCategoryMapping(12, TorznabCatType.TVDocumentary, "DOCS");
AddCategoryMapping(104, TorznabCatType.TVOTHER, "BLURAY");
AddCategoryMapping(13, TorznabCatType.TVOTHER, "PACK VF");
AddCategoryMapping(15, TorznabCatType.TVHD, "HD VF");
AddCategoryMapping(14, TorznabCatType.TVSD, "SD VF");
AddCategoryMapping(98, TorznabCatType.TVOTHER, "PACK VOSTFR");
AddCategoryMapping(17, TorznabCatType.TVHD, "HD VF VOSTFR");
AddCategoryMapping(16, TorznabCatType.TVSD, "SD VF VOSTFR");
AddCategoryMapping(101, TorznabCatType.TVAnime, "PACK ANIME");
AddCategoryMapping(32, TorznabCatType.TVAnime, "ANIME VF");
AddCategoryMapping(110, TorznabCatType.TVAnime, "ANIME VOSTFR");
AddCategoryMapping(123, TorznabCatType.TVOTHER, "ANIMATION");
AddCategoryMapping(109, TorznabCatType.TVDocumentary, "DOCS");
AddCategoryMapping(30, TorznabCatType.TVOTHER, "EMISSIONS");
AddCategoryMapping(34, TorznabCatType.TVOTHER, "SPORT");
// Music
AddCategoryMapping(20, TorznabCatType.AudioVideo, "CONCERT");
AddCategoryMapping(20, TorznabCatType.AudioVideo, "CONCERT");
// Books
AddCategoryMapping(24, TorznabCatType.BooksEbook, "ENOOKS NOVEL");
AddCategoryMapping(96, TorznabCatType.BooksMagazines, "EBOOKS MAGAZINES");
AddCategoryMapping(116, TorznabCatType.BooksEbook, "EBOOKS NOVEL JUNIOR");
AddCategoryMapping(99, TorznabCatType.BooksOther, "EBOOKS BD");
AddCategoryMapping(102, TorznabCatType.BooksComics, "EBOOKS COMICS");
AddCategoryMapping(103, TorznabCatType.BooksOther, "EBOOKS MANGA");
// Other
AddCategoryMapping(21, TorznabCatType.PC, "PC");
AddCategoryMapping(22, TorznabCatType.PCMac, "PC");
AddCategoryMapping(25, TorznabCatType.PCGames, "GAMES");
AddCategoryMapping(26, TorznabCatType.ConsoleXbox360, "GAMES");
AddCategoryMapping(28, TorznabCatType.ConsoleWii, "GAMES");
AddCategoryMapping(27, TorznabCatType.ConsolePS3, "GAMES");
AddCategoryMapping(29, TorznabCatType.ConsoleNDS, "GAMES");
AddCategoryMapping(24, TorznabCatType.BooksEbook, "EBOOKS");
AddCategoryMapping(96, TorznabCatType.BooksEbook, "EBOOKS MAGAZINES");
AddCategoryMapping(99, TorznabCatType.BooksEbook, "EBOOKS ANIME");
AddCategoryMapping(23, TorznabCatType.PCPhoneAndroid, "ANDROID");
// SOFTWARE
AddCategoryMapping(25, TorznabCatType.PCGames, "PC GAMES");
AddCategoryMapping(27, TorznabCatType.ConsolePS3, "PS GAMES");
AddCategoryMapping(111, TorznabCatType.PCMac, "MAC GAMES");
AddCategoryMapping(112, TorznabCatType.PC, "LINUX GAMES");
AddCategoryMapping(26, TorznabCatType.ConsoleXbox360, "XBOX GAMES");
AddCategoryMapping(28, TorznabCatType.ConsoleWii, "WII GAMES");
AddCategoryMapping(29, TorznabCatType.ConsoleNDS, "NDS GAMES");
AddCategoryMapping(117, TorznabCatType.PC, "ROM");
AddCategoryMapping(21, TorznabCatType.PC, "PC SOFTWARE");
AddCategoryMapping(22, TorznabCatType.PCMac, "MAC SOFTWARE");
AddCategoryMapping(23, TorznabCatType.PCPhoneAndroid, "ANDROID");
AddCategoryMapping(36, TorznabCatType.XXX, "XxX / Films");
AddCategoryMapping(105, TorznabCatType.XXX, "XxX / Séries");
AddCategoryMapping(114, TorznabCatType.XXX, "XxX / Lesbiennes ");
AddCategoryMapping(115, TorznabCatType.XXX, "XxX / Gays");
AddCategoryMapping(113, TorznabCatType.XXX, "XxX / Hentai");
// XxX
AddCategoryMapping(36, TorznabCatType.XXX, "XxX / Films");
AddCategoryMapping(105, TorznabCatType.XXX, "XxX / Séries");
AddCategoryMapping(114, TorznabCatType.XXX, "XxX / Lesbiennes");
AddCategoryMapping(115, TorznabCatType.XXX, "XxX / Gays");
AddCategoryMapping(113, TorznabCatType.XXX, "XxX / Hentai");
AddCategoryMapping(120, TorznabCatType.XXX, "XxX / Magazines");
}
/// <summary>
@@ -168,6 +180,12 @@ namespace Jackett.Common.Indexers
searchTerm = searchTerm.Trim();
searchTerm = searchTerm.ToLower();
if (EnhancedAnime && query.HasSpecifiedCategories && query.Categories.Contains(TorznabCatType.TVAnime.ID))
{
System.Text.RegularExpressions.Regex regex = new Regex(" ([0-9]+)");
searchTerm = regex.Replace(searchTerm, " E$1");
}
// Check cache first so we don't query the server (if search term used or not in dev mode)
if (!DevMode && !string.IsNullOrEmpty(searchTerm))
{

View File

@@ -1440,13 +1440,14 @@ namespace Jackett.Common.Indexers
public override async Task<ConfigurationData> GetConfigurationForSetup()
{
configData.CookieHeader.Value = null;
var response = await RequestStringWithCookies(LoginUrl);
var LoginResultParser = new HtmlParser();
var LoginResultDocument = LoginResultParser.Parse(response.Content);
var captchaimg = LoginResultDocument.QuerySelector("img[src^=\"//static.t-ru.org/captcha/\"]");
var captchaimg = LoginResultDocument.QuerySelector("img[src^=\"https://static.t-ru.org/captcha/\"]");
if (captchaimg != null)
{
var captchaImage = await RequestBytesWithCookies("https:" + captchaimg.GetAttribute("src"));
var captchaImage = await RequestBytesWithCookies(captchaimg.GetAttribute("src"));
configData.CaptchaImage.Value = captchaImage.Content;
var codefield = LoginResultDocument.QuerySelector("input[name^=\"cap_code_\"]");

View File

@@ -1,39 +1,29 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>netstandard2.0;net461</TargetFrameworks>
<TargetFrameworks>netstandard2.0</TargetFrameworks>
<Version>0.0.0</Version>
<NoWarn>NU1605</NoWarn>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="AngleSharp" Version="0.9.10" />
<PackageReference Include="AngleSharp" Version="0.9.11" />
<PackageReference Include="Autofac" Version="4.8.1" />
<PackageReference Include="AutoMapper" Version="7.0.1" />
<PackageReference Include="AutoMapper" Version="8.0.0" />
<PackageReference Include="BencodeNET" Version="2.2.24" />
<PackageReference Include="CloudFlareUtilities" Version="1.2.0" />
<PackageReference Include="CommandLineParser" Version="2.3.0" />
<PackageReference Include="CommandLineParser" Version="2.4.3" />
<PackageReference Include="CsQuery.NETStandard" Version="1.3.6.1" />
<PackageReference Include="DotNet4.SocksProxy" Version="1.4.0.1" />
<PackageReference Include="Microsoft.AspNetCore.WebUtilities" Version="2.2.0" />
<PackageReference Include="Microsoft.CSharp" Version="4.5.0" />
<PackageReference Include="MimeMapping" Version="1.0.1.12" />
<PackageReference Include="Newtonsoft.Json" Version="11.0.2" />
<PackageReference Include="NLog" Version="4.5.9" />
<PackageReference Include="SharpZipLib" Version="1.0.0" />
<PackageReference Include="YamlDotNet" Version="5.0.1" />
</ItemGroup>
<!-- Conditionally obtain references for the .NET Full framework target -->
<ItemGroup Condition="'$(TargetFramework)' != 'netstandard2.0'">
<PackageReference Include="CsQuery" Version="1.3.5-beta5" />
<PackageReference Include="Microsoft.AspNetCore.WebUtilities" Version="1.1.2" />
<Reference Include="System.ServiceProcess" />
</ItemGroup>
<!-- Conditionally obtain references for the .NETStandard target -->
<ItemGroup Condition="'$(TargetFramework)' == 'netstandard2.0'">
<PackageReference Include="CsQuery.NETStandard" Version="1.3.6.1" />
<PackageReference Include="Newtonsoft.Json" Version="12.0.1" />
<PackageReference Include="NLog" Version="4.5.11" />
<PackageReference Include="SharpZipLib" Version="1.1.0" />
<PackageReference Include="System.IO.FileSystem.AccessControl" Version="4.5.0" />
<PackageReference Include="Microsoft.AspNetCore.WebUtilities" Version="2.1.1" />
<PackageReference Include="System.ServiceProcess.ServiceController" Version="4.5.0" />
<PackageReference Include="YamlDotNet" Version="5.3.0" />
</ItemGroup>
<ItemGroup>

View File

@@ -6,6 +6,7 @@
public StringItem PassKey { get; set; }
public DisplayItem PagesWarning { get; private set; }
public BoolItem Freeleech { get; private set; }
public BoolItem EnhancedAnime { get; private set; }
public DisplayItem DevWarning { get; private set; }
public BoolItem DevMode { get; private set; }
public BoolItem HardDriveCache { get; private set; }
@@ -16,8 +17,9 @@
{
CredentialsWarning = new DisplayItem("<b>Credentials Configuration</b> (<i>Private Tracker</i>),<br /><br /> <ul><li><b>PassKey</b> is your private key on your account</li></ul>") { Name = "Credentials" };
PassKey = new StringItem { Name = "PassKey", Value = "" };
PagesWarning = new DisplayItem("<b>Preferences Configuration</b> (<i>Tweak your search settings</i>),<br /><br /> <ul><li><b>Freeleech Only</b> let you search <u>only</u> for torrents which are marked Freeleech.</li></ul>") { Name = "Preferences" };
PagesWarning = new DisplayItem("<b>Preferences Configuration</b> (<i>Tweak your search settings</i>),<br /><br /> <ul><li><b>Freeleech Only</b> let you search <u>only</u> for torrents which are marked Freeleech.</li><li><b>Enhanced anime search</b>, Enhance sonarr compatibility with Xthor. Only effective on requests with the <u>TVAnime Torznab category</u>.</li></ul>") { Name = "Preferences" };
Freeleech = new BoolItem() { Name = "Freeleech Only (Optional)", Value = false };
EnhancedAnime = new BoolItem() { Name = "Enhanced anime search", Value = false };
DevWarning = new DisplayItem("<b>Development Facility</b> (<i>For Developers ONLY</i>),<br /><br /> <ul><li>By enabling development mode, <b>Jackett will bypass his cache</b> and will <u>output debug messages to console</u> instead of his log file.</li><li>By enabling Hard Drive Cache, <b>This provider</b> will <u>save each query answers from tracker</u> in temp directory, in fact this reduce drastically HTTP requests when building a provider at parsing step for example. So, <b> Jackett will search for a cached query answer on hard drive before executing query on tracker side !</b> <i>DEV MODE must be enabled to use it !</li></ul>") { Name = "Development" };
DevMode = new BoolItem { Name = "Enable DEV MODE (Developers ONLY)", Value = false };
HardDriveCache = new BoolItem { Name = "Enable HARD DRIVE CACHE (Developers ONLY)", Value = false };

View File

@@ -88,6 +88,11 @@ namespace Jackett.Common.Services
logger.Info($"Skipping update check as it is disabled.");
return;
}
if (DotNetCoreUtil.IsRunningOnDotNetCore)
{
logger.Info($"Skipping update check as running Jackett on .NET Core is still in preview. Updates must be performed manually at this time.");
return;
}
forceupdatecheck = true;

View File

@@ -1,42 +1,43 @@
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFrameworks>netcoreapp2.1;net461</TargetFrameworks>
<TargetFrameworks>netcoreapp2.2;net461</TargetFrameworks>
<ApplicationIcon>jackett.ico</ApplicationIcon>
<AssemblyName>JackettConsole</AssemblyName>
<OutputType>Exe</OutputType>
<NoWarn>NU1605</NoWarn>
</PropertyGroup>
<PropertyGroup Condition="'$(TargetFramework)' == 'netcoreapp2.1'">
<RuntimeIdentifiers>win-x86;linux-x64;osx-x64</RuntimeIdentifiers>
<PropertyGroup Condition="'$(TargetFramework)' == 'netcoreapp2.2'">
<RuntimeIdentifiers>win-x86;osx-x64;linux-x64;linux-arm</RuntimeIdentifiers>
</PropertyGroup>
<PropertyGroup Condition="'$(TargetFramework)' == 'net461'">
<RuntimeIdentifiers>win7-x86;linux-x64</RuntimeIdentifiers>
</PropertyGroup>
<!-- Conditionally obtain references for the .NET Core App 2.1 target -->
<ItemGroup Condition=" '$(TargetFramework)' == 'netcoreapp2.1' ">
<!-- Conditionally obtain references for the .NET Core App 2.2 target -->
<ItemGroup Condition=" '$(TargetFramework)' == 'netcoreapp2.2' ">
<PackageReference Include="System.Security.Cryptography.ProtectedData" Version="4.5.0" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Autofac" Version="4.8.1" />
<PackageReference Include="Autofac.Extensions.DependencyInjection" Version="4.3.0" />
<PackageReference Include="AutoMapper" Version="7.0.1" />
<PackageReference Include="CommandLineParser" Version="2.3.0" />
<PackageReference Include="Microsoft.AspNetCore" Version="2.1.3" />
<PackageReference Include="Microsoft.AspNetCore.Authentication" Version="2.1.2" />
<PackageReference Include="Microsoft.AspNetCore.Authentication.Cookies" Version="2.1.2" />
<PackageReference Include="Microsoft.AspNetCore.Mvc" Version="2.1.2" />
<PackageReference Include="Microsoft.AspNetCore.ResponseCompression" Version="2.1.1" />
<PackageReference Include="Microsoft.AspNetCore.Rewrite" Version="2.1.1" />
<PackageReference Include="Microsoft.AspNetCore.StaticFiles" Version="2.1.1" />
<PackageReference Include="Microsoft.Extensions.Configuration" Version="2.1.1" />
<PackageReference Include="NLog" Version="4.5.9" />
<PackageReference Include="NLog.Web.AspNetCore" Version="4.6.0" />
<PackageReference Include="Autofac.Extensions.DependencyInjection" Version="4.3.1" />
<PackageReference Include="AutoMapper" Version="8.0.0" />
<PackageReference Include="CommandLineParser" Version="2.4.3" />
<PackageReference Include="Microsoft.AspNetCore" Version="2.2.0" />
<PackageReference Include="Microsoft.AspNetCore.Authentication" Version="2.2.0" />
<PackageReference Include="Microsoft.AspNetCore.Authentication.Cookies" Version="2.2.0" />
<PackageReference Include="Microsoft.AspNetCore.Mvc" Version="2.2.0" />
<PackageReference Include="Microsoft.AspNetCore.ResponseCompression" Version="2.2.0" />
<PackageReference Include="Microsoft.AspNetCore.Rewrite" Version="2.2.0" />
<PackageReference Include="Microsoft.AspNetCore.StaticFiles" Version="2.2.0" />
<PackageReference Include="Microsoft.Extensions.Configuration" Version="2.2.0" />
<PackageReference Include="NLog" Version="4.5.11" />
<PackageReference Include="NLog.Web.AspNetCore" Version="4.7.1" />
<PackageReference Include="System.ServiceProcess.ServiceController" Version="4.5.0" />
<PackageReference Include="System.Text.Encoding.CodePages" Version="4.5.0" />
<PackageReference Include="System.Text.Encoding.CodePages" Version="4.5.1" />
</ItemGroup>
<ItemGroup>
@@ -56,6 +57,9 @@
<Content Include="..\..\install_service_macos" Visible="false">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="..\..\install_service_systemd.sh" Visible="false">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
</ItemGroup>
</Project>

View File

@@ -22,14 +22,14 @@
<ItemGroup>
<PackageReference Include="Autofac" Version="4.8.1" />
<PackageReference Include="FluentAssertions" Version="5.4.2" />
<PackageReference Include="Microsoft.AspNetCore.DataProtection" Version="2.1.1" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.8.0" />
<PackageReference Include="MSTest.TestAdapter" Version="1.3.2" />
<PackageReference Include="MSTest.TestFramework" Version="1.3.2" />
<PackageReference Include="NUnit" Version="3.10.1" />
<PackageReference Include="FluentAssertions" Version="5.5.3" />
<PackageReference Include="Microsoft.AspNetCore.DataProtection" Version="2.2.0" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.9.0" />
<PackageReference Include="MSTest.TestAdapter" Version="1.4.0" />
<PackageReference Include="MSTest.TestFramework" Version="1.4.0" />
<PackageReference Include="NUnit" Version="3.11.0" />
<PackageReference Include="NUnit.ConsoleRunner" Version="3.9.0" />
<PackageReference Include="NUnit3TestAdapter" Version="3.10.0" />
<PackageReference Include="NUnit3TestAdapter" Version="3.12.0" />
</ItemGroup>
<ItemGroup>

View File

@@ -110,7 +110,7 @@
</ItemGroup>
<ItemGroup>
<PackageReference Include="CommandLineParser">
<Version>2.3.0</Version>
<Version>2.4.3</Version>
</PackageReference>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />

View File

@@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>net461;netcoreapp2.1</TargetFrameworks>
<TargetFrameworks>net461;netcoreapp2.2</TargetFrameworks>
<ApplicationIcon>jackett.ico</ApplicationIcon>
<AssemblyName>JackettUpdater</AssemblyName>
<OutputType>Exe</OutputType>

View File

@@ -256,6 +256,8 @@ namespace Jackett.Updater
"Definitions/torrentwtf.yml",
"Definitions/eotforum.yml",
"Definitions/nexttorrent.yml",
"Definitions/torrentsmd.yml",
"Definitions/scenehd.yml", // migrated to C# (use JSON API)
"appsettings.Development.json",
"CurlSharp.dll",
"CurlSharp.pdb",
@@ -277,6 +279,7 @@ namespace Jackett.Updater
"Definitions/idope.yml",
"Definitions/bt-scene.yml",
"Definitions/extratorrentclone.yml",
"Definitions/btdb.yml",
};
foreach (var oldFile in oldFiles)