mirror of
https://github.com/Jackett/Jackett.git
synced 2025-09-17 01:14:12 +02:00
Compare commits
74 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
399119b2da | ||
![]() |
4a03e52cb4 | ||
![]() |
7bcd0b5b86 | ||
![]() |
9fd4bbae4f | ||
![]() |
6b536ce62f | ||
![]() |
d878c9e05e | ||
![]() |
cb8835b878 | ||
![]() |
e188454fec | ||
![]() |
ab9d8f6403 | ||
![]() |
ce15cb8bfe | ||
![]() |
9e7d1cc547 | ||
![]() |
7b2657870a | ||
![]() |
31df2c27dd | ||
![]() |
b64b3504ba | ||
![]() |
af6c732306 | ||
![]() |
8da6140753 | ||
![]() |
3c03494d85 | ||
![]() |
5af3eaa926 | ||
![]() |
f79608fe6c | ||
![]() |
316f4f2864 | ||
![]() |
71babe611a | ||
![]() |
25ddcb10bb | ||
![]() |
4c07918cd4 | ||
![]() |
88fc9123e7 | ||
![]() |
c38b668ea2 | ||
![]() |
ea1d86f107 | ||
![]() |
a96237b38b | ||
![]() |
5c9f652ef5 | ||
![]() |
8d72b9a395 | ||
![]() |
0c3e856086 | ||
![]() |
37216bd0a9 | ||
![]() |
f9ef3b836b | ||
![]() |
a0d0b2cb40 | ||
![]() |
590fd5139f | ||
![]() |
37ccdbb19d | ||
![]() |
cb02cac1e1 | ||
![]() |
ddb8095dd2 | ||
![]() |
23ee1145c5 | ||
![]() |
431570e696 | ||
![]() |
ebcb82ed80 | ||
![]() |
1352d1528a | ||
![]() |
822dc191dc | ||
![]() |
41bf6da9c6 | ||
![]() |
f3de97be61 | ||
![]() |
869efa32f4 | ||
![]() |
332a31afa2 | ||
![]() |
398601d0ef | ||
![]() |
a5c596c200 | ||
![]() |
9b3bdc9f36 | ||
![]() |
56433c5aa3 | ||
![]() |
b8a9eef6cf | ||
![]() |
75aef1b997 | ||
![]() |
af066426fd | ||
![]() |
3999e76ae8 | ||
![]() |
ef162f07e5 | ||
![]() |
7a9adc283b | ||
![]() |
7a5407d2c4 | ||
![]() |
eaf53e0f4c | ||
![]() |
81b1e64c9a | ||
![]() |
61d333cbc3 | ||
![]() |
2c1b6dbf9f | ||
![]() |
7644a5e3bd | ||
![]() |
7ef2faaf09 | ||
![]() |
de0dd2b035 | ||
![]() |
ccf0d546e9 | ||
![]() |
e56f5314b2 | ||
![]() |
64ac67f58b | ||
![]() |
6735ad030d | ||
![]() |
041115ff0e | ||
![]() |
d239197f0f | ||
![]() |
115e476196 | ||
![]() |
98439ea414 | ||
![]() |
4cf798b4b4 | ||
![]() |
806ed2d44e |
50
README.md
50
README.md
@@ -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
|
||||
|
||||
|
16
build.cake
16
build.cake
@@ -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");
|
||||
|
@@ -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}
|
||||
|
||||
|
@@ -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>
|
||||
|
@@ -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"]
|
||||
|
110
src/Jackett.Common/Definitions/asiancinema.yml
Normal file
110
src/Jackett.Common/Definitions/asiancinema.yml
Normal 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"
|
@@ -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"}
|
||||
|
@@ -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"
|
@@ -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"]
|
||||
|
@@ -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
|
||||
|
146
src/Jackett.Common/Definitions/desitorrents.yml
Normal file
146
src/Jackett.Common/Definitions/desitorrents.yml
Normal 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"
|
@@ -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:
|
||||
|
@@ -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:
|
||||
|
@@ -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"
|
||||
|
@@ -97,6 +97,7 @@
|
||||
selector: td.leecher_col
|
||||
downloadvolumefactor:
|
||||
case:
|
||||
"span.freeleech_slot": "0" # 24h freeelech slot
|
||||
"span.freeleech": "0"
|
||||
"*": "1"
|
||||
uploadvolumefactor:
|
||||
|
@@ -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"]
|
||||
|
109
src/Jackett.Common/Definitions/hush.yml
Normal file
109
src/Jackett.Common/Definitions/hush.yml
Normal 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
|
@@ -17,6 +17,7 @@
|
||||
- c414bf4ad6c69841693c147849f4c314aa200bdf # incomplete CA chain
|
||||
- 3a402766ce22fd1aa24bfc1a4fd47e9309eb8c98 # incomplete CA chain
|
||||
- 160f832730737a70264768ceddf3cd94bc51ffb7 # incomplete CA chain
|
||||
- a60e969b27965d4dc2ff45d50c20e2e872d4e9b9 # incomplete CA chain
|
||||
|
||||
caps:
|
||||
categorymappings:
|
||||
|
@@ -69,6 +69,8 @@
|
||||
filters:
|
||||
- name: replace
|
||||
args: [" ()", ""]
|
||||
- name: replace
|
||||
args: ["\t", ""]
|
||||
- name: replace
|
||||
args: [" / Freeleech!", ""]
|
||||
category:
|
||||
|
@@ -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
|
||||
|
@@ -6,6 +6,8 @@
|
||||
type: private
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- https://magico.one/
|
||||
legacylinks:
|
||||
- https://magico.info/
|
||||
|
||||
caps:
|
||||
|
@@ -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
|
||||
|
@@ -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"]
|
||||
|
@@ -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\.]+)
|
||||
|
@@ -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"]
|
||||
|
@@ -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:
|
||||
|
@@ -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"
|
@@ -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:
|
||||
|
@@ -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:
|
||||
|
@@ -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:
|
||||
|
@@ -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"
|
@@ -25,6 +25,7 @@
|
||||
- https://ygg.to/
|
||||
- https://www.ygg.to/
|
||||
- https://ww3.yggtorrent.gg/
|
||||
- https://www.yggtorrent.gg/
|
||||
|
||||
caps:
|
||||
categorymappings:
|
||||
|
@@ -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();
|
||||
|
@@ -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)
|
||||
|
@@ -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,
|
||||
|
@@ -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)
|
||||
{
|
||||
|
@@ -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);
|
||||
}
|
||||
}
|
||||
|
@@ -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();
|
||||
|
@@ -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,
|
||||
|
@@ -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)
|
||||
|
@@ -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");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -18,7 +18,7 @@ namespace Jackett.Common.Indexers
|
||||
logger: logger,
|
||||
protectionService: protectionService,
|
||||
webClient: webClient,
|
||||
supportsFreeleechTokens: true // not verified
|
||||
supportsFreeleechTokens: false // ratiofree
|
||||
)
|
||||
{
|
||||
Language = "fr-fr";
|
||||
|
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
@@ -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;
|
||||
|
@@ -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;
|
||||
}
|
||||
|
||||
|
168
src/Jackett.Common/Indexers/SceneHD.cs
Normal file
168
src/Jackett.Common/Indexers/SceneHD.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
@@ -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
|
||||
|
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -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;
|
||||
|
@@ -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))
|
||||
{
|
||||
|
@@ -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_\"]");
|
||||
|
@@ -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>
|
||||
|
@@ -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 };
|
||||
|
@@ -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;
|
||||
|
||||
|
@@ -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>
|
||||
|
@@ -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>
|
||||
|
@@ -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" />
|
||||
|
@@ -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>
|
||||
|
@@ -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)
|
||||
|
Reference in New Issue
Block a user