mirror of
https://github.com/Jackett/Jackett.git
synced 2025-12-25 07:14:11 +01:00
Compare commits
22 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
65aaaa3d77 | ||
|
|
c2b2c94e1b | ||
|
|
e8465f23b9 | ||
|
|
09d37ab232 | ||
|
|
f413355610 | ||
|
|
5a97cd7dd2 | ||
|
|
7b354d1582 | ||
|
|
b964a33ae2 | ||
|
|
dfa513da24 | ||
|
|
dcee9128f9 | ||
|
|
30a8e1b4c5 | ||
|
|
a5e2e6ef60 | ||
|
|
772709d46c | ||
|
|
71f60c612a | ||
|
|
e6834990ec | ||
|
|
17d7ed5a2b | ||
|
|
10bf70c663 | ||
|
|
8c14820a38 | ||
|
|
63772f289d | ||
|
|
8d5aec030c | ||
|
|
280547ad01 | ||
|
|
d01d57037e |
6
.github/duplicate_issue.md
vendored
6
.github/duplicate_issue.md
vendored
@@ -1,7 +1,7 @@
|
||||
Duplicate of #{{ firstIssueWithTitle }}
|
||||
Duplicate of #{{ chosenIssue.number }}
|
||||
|
||||
Hi @{{ payload.sender.login }},
|
||||
|
||||
This issue looks similar to #{{ firstIssueWithTitle }}.
|
||||
This issue looks similar to #{{ chosenIssue.number }}.
|
||||
|
||||
To prevent issue tracker clutter, this issue will now be closed. If you feel this issue isn't a duplicate of #{{ firstIssueWithTitle }}, then feel free to re-open this issue.
|
||||
To prevent issue tracker clutter, this issue will now be closed. If you feel this issue isn't a duplicate of #{{ chosenIssue.number }}, then feel free to post a comment on this issue stating why it's not a duplicate. Your comment will automatically re-open this issue.
|
||||
|
||||
2
.github/no_information_provided.md
vendored
2
.github/no_information_provided.md
vendored
@@ -1,6 +1,6 @@
|
||||
Hi @{{ payload.sender.login }},
|
||||
|
||||
You've created an issue, but haven't provided any details to allow the community to assist you. To prevent issue tracker clutter, this issue will now be closed. Please provide the information needed below and then re-open the issue.
|
||||
You've created an issue, but haven't provided any details to allow the community to assist you. To prevent issue tracker clutter, this issue will now be closed. Please provide the information needed below and your comment will automatically re-open this issue.
|
||||
|
||||
Provide a description of the feature request or bug, the more details the better.
|
||||
If you are experiencing an issue with a tracker, a **full enhanced log must be included**. Instructions for obtaining logs are here: https://github.com/Jackett/Jackett#troubleshooting
|
||||
|
||||
3
.github/no_response.md
vendored
Normal file
3
.github/no_response.md
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
Hi @{{ payload.data.user.login }},
|
||||
|
||||
No response has been received for {{ days }} days. To prevent issue tracker clutter, this issue will now be closed. To re-open the issue, please provide the information requested and the issue will automatically re-open.
|
||||
7
.github/pull_request_readme.md
vendored
Normal file
7
.github/pull_request_readme.md
vendored
Normal file
@@ -0,0 +1,7 @@
|
||||
Hi @{{ payload.pull_request.user.login }},
|
||||
|
||||
Thanks for your contribution to Jackett!
|
||||
|
||||
If you are adding a new indexer, please ensure that you've added it to the readme as well
|
||||
|
||||
A human will be along soon to review
|
||||
1
.gitignore
vendored
1
.gitignore
vendored
@@ -199,3 +199,4 @@ FakesAssemblies/
|
||||
/Artifacts
|
||||
/TestResults
|
||||
*.DS_Store
|
||||
.idea/
|
||||
|
||||
10
README.md
10
README.md
@@ -91,7 +91,6 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
|
||||
* Abnormal
|
||||
* Acid-Lounge
|
||||
* AlphaRatio
|
||||
* Andraste
|
||||
* AnimeBytes
|
||||
* AnimeTorrents
|
||||
* AOX
|
||||
@@ -158,7 +157,6 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
|
||||
* Fuzer
|
||||
* GayTorrent.ru
|
||||
* GazelleGames
|
||||
* GFTracker
|
||||
* Gfxnews
|
||||
* GFXPeers
|
||||
* GigaTorrents
|
||||
@@ -219,6 +217,7 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
|
||||
* Psytorrents
|
||||
* PTFiles
|
||||
* PuntoTorrent
|
||||
* Racing4Everyone (R4E)
|
||||
* Redacted (PassTheHeadphones)
|
||||
* RevolutionTT
|
||||
* RoDVD
|
||||
@@ -291,6 +290,13 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
|
||||
|
||||
Trackers marked with [![(invite needed)][inviteneeded]](#) have no active maintainer and are missing features or are broken. If you have an invite for them please send it to kaso1717 -at- gmail.com to get them fixed/improved.
|
||||
|
||||
### Aggregate indexers
|
||||
|
||||
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.
|
||||
|
||||
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
|
||||
|
||||
We recommend you install Jackett as a Windows service using the supplied installer. You may also download the zipped version if you would like to configure everything manually.
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
---
|
||||
---
|
||||
site: Bittorrentfiles
|
||||
name: Bittorrentfiles
|
||||
description: "Bittorrentfiles is a Private GERMAN tracker"
|
||||
@@ -135,22 +135,22 @@
|
||||
selector: a[href^="/download.php"]
|
||||
attribute: href
|
||||
files:
|
||||
selector: td:nth-child(2) > table > tbody > tr:nth-child(2) > td:nth-child(5) > a
|
||||
selector: td:nth-child(7)
|
||||
grabs:
|
||||
selector: td:nth-child(2) > table > tbody > tr:nth-child(2) > td:nth-child(2)
|
||||
selector: td:nth-child(6)
|
||||
size:
|
||||
selector: td:nth-child(2) > table > tbody > tr:nth-child(2) > td:nth-child(6)
|
||||
selector: td:nth-child(8)
|
||||
filters:
|
||||
- name: replace
|
||||
args: [".", ""]
|
||||
- name: replace
|
||||
args: [",", "."]
|
||||
seeders:
|
||||
selector: td:nth-child(2) > table > tbody > tr:nth-child(2) > td:nth-child(2)
|
||||
selector: td:nth-child(3) > a
|
||||
leechers:
|
||||
selector: td:nth-child(2) > table > tbody > tr:nth-child(2) > td:nth-child(3)
|
||||
selector: td:nth-child(4)
|
||||
date:
|
||||
selector: td:nth-child(2) > table > tbody > tr:nth-child(2) > td:nth-child(10)
|
||||
selector: td:nth-child(9)
|
||||
filters:
|
||||
- name: split
|
||||
args: ["by", 0]
|
||||
@@ -168,4 +168,4 @@
|
||||
uploadvolumefactor:
|
||||
case:
|
||||
img[alt="2xU"]: "2"
|
||||
"*": "1"
|
||||
"*": "1"
|
||||
|
||||
@@ -6,8 +6,9 @@
|
||||
type: public
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- http://www.nextorrent.site/
|
||||
- https://www.nextorrent.site/
|
||||
legacylinks:
|
||||
- http://www.nextorrent.site/
|
||||
- http://www.nextorrent.bz/
|
||||
- http://www.nextorrent.pro/
|
||||
- https://www.nextorrent.cc/
|
||||
|
||||
@@ -113,3 +113,7 @@
|
||||
filters:
|
||||
- name: replace
|
||||
args: ["Unknown", "0"]
|
||||
downloadvolumefactor:
|
||||
text: "0"
|
||||
uploadvolumefactor:
|
||||
text: "1"
|
||||
|
||||
@@ -122,3 +122,7 @@
|
||||
selector: td:nth-child(7)
|
||||
grabs:
|
||||
selector: td:nth-child(8)
|
||||
downloadvolumefactor:
|
||||
text: "0"
|
||||
uploadvolumefactor:
|
||||
text: "1"
|
||||
|
||||
109
src/Jackett.Common/Definitions/racing4everyone.yml
Normal file
109
src/Jackett.Common/Definitions/racing4everyone.yml
Normal file
@@ -0,0 +1,109 @@
|
||||
---
|
||||
site: racing4everyone
|
||||
name: Racing4Everyone (R4E)
|
||||
description: "Private Torrent Tracker for RACING"
|
||||
language: en-us
|
||||
type: private
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- https://racing4everyone.jp/
|
||||
|
||||
caps:
|
||||
categorymappings:
|
||||
- {id: 1, cat: TV/Sport, desc: "BTCC"}
|
||||
- {id: 3, cat: TV/Sport, desc: "DTM"}
|
||||
- {id: 4, cat: TV/Sport, desc: "Formula 1 2018"}
|
||||
- {id: 6, cat: TV/Sport, desc: "Formula 1 2017-1950 (HD)"}
|
||||
- {id: 21, cat: TV/Sport, desc: "Formula 1 2017-1950 (SD)"}
|
||||
- {id: 22, cat: TV/Sport, desc: "Formula 2"}
|
||||
- {id: 23, cat: TV/Sport, desc: "Formula E"}
|
||||
- {id: 24, cat: TV/Sport, desc: "Misc"}
|
||||
- {id: 25, cat: TV/Sport, desc: "Motorbikes"}
|
||||
- {id: 26, cat: TV/Sport, desc: "MotoGP/2/3"}
|
||||
- {id: 31, cat: TV/Sport, desc: "Nascar"}
|
||||
- {id: 32, cat: TV/Sport, desc: "Stockcars"}
|
||||
- {id: 33, cat: TV/Sport, desc: "Touring Cars"}
|
||||
- {id: 50, cat: TV/Sport, desc: "WRC"}
|
||||
- {id: 53, cat: TV/Sport, desc: "Open-Wheelers"}
|
||||
- {id: 54, cat: TV/Sport, desc: "Documentaries/Movies"}
|
||||
- {id: 55, cat: TV/Sport, desc: "Season Reviews"}
|
||||
|
||||
modes:
|
||||
search: [q]
|
||||
|
||||
login:
|
||||
path: /login
|
||||
method: form
|
||||
inputs:
|
||||
username: "{{ .Config.username }}"
|
||||
password: "{{ .Config.password }}"
|
||||
error:
|
||||
- selector: table.main:contains("Login Failed!")
|
||||
test:
|
||||
path: /torrents
|
||||
|
||||
search:
|
||||
paths:
|
||||
- path: /filterTorrents
|
||||
inputs:
|
||||
$raw: "{{range .Categories}}categories[]={{.}}&{{end}}"
|
||||
search: "{{ .Keywords }}"
|
||||
uploader: ""
|
||||
sorting: created_at
|
||||
direction: desc
|
||||
qty: 100
|
||||
preprocessingfilters:
|
||||
- name: jsonjoinarray
|
||||
args: ["$.result", ""]
|
||||
- name: prepend
|
||||
args: "<table>"
|
||||
- name: append
|
||||
args: "</table>"
|
||||
rows:
|
||||
selector: 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_check/"]
|
||||
attribute: href
|
||||
filters:
|
||||
- name: replace
|
||||
args: ["/download_check/", "/download/"]
|
||||
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
|
||||
attribute: datetime
|
||||
filters:
|
||||
- name: append
|
||||
args: " +00:00"
|
||||
- name: dateparse
|
||||
args: "2006-01-02 15:04:05 -07:00"
|
||||
downloadvolumefactor:
|
||||
case:
|
||||
"i[data-original-title=\"100% Free\"]": "0"
|
||||
"i[data-original-title=\"Global FreeLeech\"]": "0"
|
||||
"*": "1"
|
||||
uploadvolumefactor:
|
||||
case:
|
||||
"i[data-original-title=\"Double upload\"]": "2"
|
||||
"*": "1"
|
||||
@@ -99,3 +99,7 @@
|
||||
filters:
|
||||
- name: replace
|
||||
args: ["Unknown", "0"]
|
||||
downloadvolumefactor:
|
||||
text: "0"
|
||||
uploadvolumefactor:
|
||||
text: "1"
|
||||
|
||||
@@ -92,3 +92,7 @@
|
||||
selector: td:nth-child(7)
|
||||
grabs:
|
||||
selector: td:nth-child(8)
|
||||
downloadvolumefactor:
|
||||
text: "0"
|
||||
uploadvolumefactor:
|
||||
text: "1"
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
caps:
|
||||
categorymappings:
|
||||
#Audio
|
||||
- {id: 100, cat: Audio, desc: "Audio", default: true}
|
||||
- {id: 101, cat: Audio, desc: "Music", default: true}
|
||||
- {id: 102, cat: Audio/Audiobook, desc: "Audio books", default: true}
|
||||
- {id: 103, cat: Audio, desc: "Sound clips", default: true}
|
||||
@@ -21,6 +22,7 @@
|
||||
- {id: 199, cat: Audio/Other, desc: "Audio Other", default: true}
|
||||
|
||||
#Video
|
||||
- {id: 200, cat: Movies, desc: "Video", default: true}
|
||||
- {id: 201, cat: Movies, desc: "Movies", default: true}
|
||||
- {id: 202, cat: Movies/DVD, desc: "Movies DVDR", default: true}
|
||||
- {id: 203, cat: Audio/Video, desc: "Music videos", default: true}
|
||||
@@ -33,6 +35,7 @@
|
||||
- {id: 299, cat: Movies/Other, desc: "Video Other", default: true}
|
||||
|
||||
#Applications
|
||||
- {id: 300, cat: PC, desc: "Applications", default: true}
|
||||
- {id: 301, cat: PC, desc: "Windows", default: true}
|
||||
- {id: 302, cat: PC/Mac, desc: "Mac", default: true}
|
||||
- {id: 303, cat: PC, desc: "UNIX", default: true}
|
||||
@@ -42,6 +45,7 @@
|
||||
- {id: 399, cat: PC, desc: "Other OS", default: true}
|
||||
|
||||
#Games
|
||||
- {id: 401, cat: Console, desc: "Games", default: true}
|
||||
- {id: 401, cat: PC/Games, desc: "PC", default: true}
|
||||
- {id: 402, cat: PC/Mac, desc: "Mac", default: true}
|
||||
- {id: 403, cat: Console/PS4, desc: "PSx", default: true}
|
||||
@@ -53,6 +57,7 @@
|
||||
- {id: 499, cat: Console/Other, desc: "Games Other", default: true}
|
||||
|
||||
#Porn
|
||||
- {id: 500, cat: XXX, desc: "Porn", default: true}
|
||||
- {id: 501, cat: XXX, desc: "Movies", default: true}
|
||||
- {id: 502, cat: XXX/DVD, desc: "Movies DVDR", default: true}
|
||||
- {id: 503, cat: XXX/Imageset, desc: "Pictures", default: true}
|
||||
@@ -62,6 +67,7 @@
|
||||
- {id: 599, cat: XXX/Other, desc: "Porn Other", default: true}
|
||||
|
||||
#Other
|
||||
- {id: 600, cat: Other, desc: "Other", default: true}
|
||||
- {id: 601, cat: Books, desc: "E-books", default: true}
|
||||
- {id: 602, cat: Books/Comics, desc: "Comics", default: true}
|
||||
- {id: 603, cat: Books, desc: "Pictures", default: true}
|
||||
@@ -72,11 +78,19 @@
|
||||
modes:
|
||||
tv-search: [q, season, ep]
|
||||
|
||||
settings: []
|
||||
settings:
|
||||
- name: order
|
||||
type: select
|
||||
label: Order results
|
||||
default: "99"
|
||||
options:
|
||||
"99": "Default"
|
||||
"8": "Seeders"
|
||||
"3": "Time"
|
||||
|
||||
search:
|
||||
paths:
|
||||
- path: "{{if .Query.Keywords}}/search/{{ .Keywords}}/0/99/{{join .Categories \",\"}}{{else}}/recent{{end}}"
|
||||
- path: "{{if .Query.Keywords}}/search/{{ .Keywords}}/0/{{ .Config.order }}/{{join .Categories \",\"}}{{else}}/recent{{end}}"
|
||||
keywordsfilters:
|
||||
# currently, the only uploader for General Hospital puts a space between season and episode
|
||||
# this filter searches both formats, so "General Hospital S01E02" becomes "General Hospital S01E02 | (S01 E02)"
|
||||
@@ -86,7 +100,13 @@
|
||||
rows:
|
||||
selector: "#searchResult tbody tr:has(td.vertTh)"
|
||||
fields:
|
||||
category:
|
||||
category: # parent category
|
||||
selector: td:nth-child(1) a:first-child
|
||||
attribute: href
|
||||
filters:
|
||||
- name: split
|
||||
args: [ "/", -1 ]
|
||||
category: # sub category
|
||||
selector: td:nth-child(1) a:last-child
|
||||
attribute: href
|
||||
filters:
|
||||
|
||||
@@ -1,211 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.Specialized;
|
||||
using System.Globalization;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using CsQuery;
|
||||
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 Andraste : BaseWebIndexer
|
||||
{
|
||||
private string LoginUrl { get { return SiteLink + "takelogin.php"; } }
|
||||
private string BrowseUrl { get { return SiteLink + "browse.php"; } }
|
||||
|
||||
private new ConfigurationDataBasicLoginWithRSSAndDisplay configData
|
||||
{
|
||||
get { return (ConfigurationDataBasicLoginWithRSSAndDisplay)base.configData; }
|
||||
set { base.configData = value; }
|
||||
}
|
||||
|
||||
public Andraste(IIndexerConfigurationService configService, WebClient wc, Logger l, IProtectionService ps)
|
||||
: base(name: "Andraste",
|
||||
description: "A German general tracker.",
|
||||
link: "https://andraste.io/",
|
||||
caps: TorznabUtil.CreateDefaultTorznabTVCaps(),
|
||||
configService: configService,
|
||||
client: wc,
|
||||
logger: l,
|
||||
p: ps,
|
||||
configData: new ConfigurationDataBasicLoginWithRSSAndDisplay())
|
||||
{
|
||||
Encoding = Encoding.GetEncoding("iso-8859-1");
|
||||
Language = "de-de";
|
||||
Type = "private";
|
||||
|
||||
AddCategoryMapping(9, TorznabCatType.Other); // Anderes
|
||||
AddCategoryMapping(23, TorznabCatType.TVAnime); // Animation - Film &; Serie
|
||||
AddCategoryMapping(1, TorznabCatType.PC); // Appz
|
||||
AddCategoryMapping(52, TorznabCatType.Other); // Botuploads
|
||||
AddCategoryMapping(25, TorznabCatType.TVDocumentary); // Doku - Alle Formate
|
||||
AddCategoryMapping(27, TorznabCatType.Books); // E-Books
|
||||
AddCategoryMapping(51, TorznabCatType.Movies3D); // Film/3D
|
||||
AddCategoryMapping(20, TorznabCatType.MoviesDVD); // Film/DVDr
|
||||
AddCategoryMapping(37, TorznabCatType.MoviesHD); // Film/HD 1080p++
|
||||
AddCategoryMapping(38, TorznabCatType.MoviesSD); // Film/HD 720p
|
||||
AddCategoryMapping(36, TorznabCatType.Movies); // Film/im Kino
|
||||
AddCategoryMapping(19, TorznabCatType.Movies); // Film/XviD,DivX,x264
|
||||
AddCategoryMapping(4, TorznabCatType.PCGames); // Games/PC
|
||||
AddCategoryMapping(12, TorznabCatType.ConsolePS4); // Games/Playstation
|
||||
AddCategoryMapping(22, TorznabCatType.ConsoleWii); // Games/Wii & DS
|
||||
AddCategoryMapping(21, TorznabCatType.ConsoleXbox); // Games/Xbox & 360
|
||||
AddCategoryMapping(48, TorznabCatType.PCPhoneAndroid); // Handy & PDA/Android
|
||||
AddCategoryMapping(47, TorznabCatType.PCPhoneIOS); // Handy & PDA/iOS
|
||||
AddCategoryMapping(44, TorznabCatType.PCMac); // Macintosh
|
||||
AddCategoryMapping(41, TorznabCatType.Other); // MegaPack
|
||||
AddCategoryMapping(24, TorznabCatType.AudioAudiobook); // Musik/Hörbuch & Hörspiel
|
||||
AddCategoryMapping(46, TorznabCatType.Audio); // Musik/HQ 320++
|
||||
AddCategoryMapping(6, TorznabCatType.Audio); // Musik/Musik
|
||||
AddCategoryMapping(26, TorznabCatType.AudioVideo); // Musik/Musikvideos
|
||||
AddCategoryMapping(29, TorznabCatType.TVSD); // Serien/DVDr
|
||||
AddCategoryMapping(35, TorznabCatType.TVHD); // Serien/HD 720p++
|
||||
AddCategoryMapping(7, TorznabCatType.TV); // Serien/XviD,DivX,x264
|
||||
AddCategoryMapping(45, TorznabCatType.TV); // Shows
|
||||
AddCategoryMapping(40, TorznabCatType.TVSport); // Sport
|
||||
AddCategoryMapping(32, TorznabCatType.XXX); // XXX
|
||||
}
|
||||
|
||||
public override async Task<IndexerConfigurationStatus> ApplyConfiguration(JToken configJson)
|
||||
{
|
||||
LoadValuesFromJson(configJson);
|
||||
|
||||
var pairs = new Dictionary<string, string>
|
||||
{
|
||||
{ "username", configData.Username.Value },
|
||||
{ "password", configData.Password.Value }
|
||||
};
|
||||
|
||||
var result = await RequestLoginAndFollowRedirect(LoginUrl, pairs, null, true, null, LoginUrl, true);
|
||||
await ConfigureIfOK(result.Cookies, result.Content != null && result.Content.Contains("logout.php"), () =>
|
||||
{
|
||||
CQ dom = result.Content;
|
||||
var errorMessage = dom["table.tableinborder"].Html();
|
||||
errorMessage = result.Content;
|
||||
throw new ExceptionWithConfigData(errorMessage, configData);
|
||||
});
|
||||
return IndexerConfigurationStatus.RequiresTesting;
|
||||
}
|
||||
|
||||
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 germanyTz = TimeZoneInfo.CreateCustomTimeZone("W. Europe Standard Time", new TimeSpan(1, 0, 0), "(GMT+01:00) W. Europe Standard Time", "W. Europe Standard Time", "W. Europe DST Time", adjustments);
|
||||
|
||||
var releases = new List<ReleaseInfo>();
|
||||
|
||||
var searchString = query.GetQueryString();
|
||||
var searchUrl = BrowseUrl;
|
||||
var queryCollection = new NameValueCollection();
|
||||
queryCollection.Add("showsearch", "1");
|
||||
queryCollection.Add("incldead", "1");
|
||||
queryCollection.Add("orderby", "added");
|
||||
queryCollection.Add("sort", "desc");
|
||||
|
||||
if (!string.IsNullOrWhiteSpace(searchString))
|
||||
{
|
||||
queryCollection.Add("search", searchString);
|
||||
}
|
||||
|
||||
foreach (var cat in MapTorznabCapsToTrackers(query))
|
||||
{
|
||||
queryCollection.Add("c" + cat, "1");
|
||||
}
|
||||
searchUrl += "?" + queryCollection.GetQueryString();
|
||||
|
||||
var response = await RequestStringWithCookies(searchUrl);
|
||||
var results = response.Content;
|
||||
try
|
||||
{
|
||||
CQ dom = results;
|
||||
var globalFreeleech = dom.Find("div > img[alt=\"Only Upload\"][title^=\"ONLY UPLOAD \"]").Any();
|
||||
var rows = dom["table.tableinborder > tbody > tr:has(td.tableb)"];
|
||||
|
||||
foreach (var row in rows)
|
||||
{
|
||||
var release = new ReleaseInfo();
|
||||
var qRow = row.Cq();
|
||||
|
||||
var qDetailsLink = qRow.Find("a[href^=details.php?id=]").First();
|
||||
release.Title = qDetailsLink.Attr("title");
|
||||
|
||||
if (!query.MatchQueryStringAND(release.Title))
|
||||
continue;
|
||||
|
||||
var qCatLink = qRow.Find("a[href^=browse.php?cat=]").First();
|
||||
var qDLLink = qRow.Find("a[href^=download.php?torrent=]").First();
|
||||
var qSeeders = qRow.Find("span:contains(Seeder) > b:eq(0)");
|
||||
var qLeechers = qRow.Find("span:contains(Seeder) > b:eq(1)");
|
||||
var qDateStr = qRow.Find("td > table > tbody > tr > td:eq(7)").First();
|
||||
var qSize = qRow.Find("span:contains(Volumen) > b:eq(0)").First();
|
||||
var qOnlyUpload = qRow.Find("img[title=OnlyUpload]");
|
||||
|
||||
if (qOnlyUpload.Any())
|
||||
{
|
||||
release.MinimumRatio = 2;
|
||||
release.MinimumSeedTime = 144 * 60 * 60;
|
||||
}
|
||||
else
|
||||
{
|
||||
release.MinimumRatio = 1;
|
||||
release.MinimumSeedTime = 72 * 60 * 60;
|
||||
}
|
||||
|
||||
var catStr = qCatLink.Attr("href").Split('=')[1];
|
||||
release.Category = MapTrackerCatToNewznab(catStr);
|
||||
|
||||
release.Link = new Uri(SiteLink + qDLLink.Attr("href"));
|
||||
release.Comments = new Uri(SiteLink + qDetailsLink.Attr("href"));
|
||||
release.Guid = release.Link;
|
||||
|
||||
var sizeStr = qSize.Text();
|
||||
release.Size = ReleaseInfo.GetBytes(sizeStr);
|
||||
|
||||
release.Seeders = ParseUtil.CoerceInt(qSeeders.Text());
|
||||
release.Peers = ParseUtil.CoerceInt(qLeechers.Text()) + release.Seeders;
|
||||
|
||||
var dateStr = qDateStr.Text().Trim().Replace('\xA0', ' ');
|
||||
DateTime dateGerman = DateTime.SpecifyKind(DateTime.ParseExact(dateStr, "dd.MM.yyyy HH:mm", CultureInfo.InvariantCulture), DateTimeKind.Unspecified);
|
||||
|
||||
DateTime pubDateUtc = TimeZoneInfo.ConvertTimeToUtc(dateGerman, germanyTz);
|
||||
release.PublishDate = pubDateUtc.ToLocalTime();
|
||||
|
||||
var files = qRow.Find("a[href*=\"&filelist=1\"] ~ font ~ b").Text();
|
||||
release.Files = ParseUtil.CoerceInt(files);
|
||||
|
||||
var grabs = qRow.Find("a[href*=\"&tosnatchers=1\"] ~ font ~ b").Text();
|
||||
release.Grabs = ParseUtil.CoerceInt(grabs);
|
||||
|
||||
if (globalFreeleech)
|
||||
release.DownloadVolumeFactor = 0;
|
||||
else if (qRow.Find("img[alt=\"OU\"]").Length >= 1)
|
||||
release.DownloadVolumeFactor = 0;
|
||||
else
|
||||
release.DownloadVolumeFactor = 1;
|
||||
|
||||
release.UploadVolumeFactor = 1;
|
||||
|
||||
releases.Add(release);
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
OnParseError(results, ex);
|
||||
}
|
||||
|
||||
return releases;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -175,7 +175,7 @@ namespace Jackett.Common.Indexers
|
||||
var Quality = qQuality.TextContent;
|
||||
if (Quality == "Full HD")
|
||||
release.Title += " 1080p";
|
||||
else if(Quality == "Full HD")
|
||||
else if(Quality == "HD")
|
||||
release.Title += " 720p";
|
||||
|
||||
release.Category = MapTrackerCatToNewznab(catStr);
|
||||
|
||||
@@ -1347,7 +1347,19 @@ namespace Jackett.Common.Indexers
|
||||
value = release.Description;
|
||||
break;
|
||||
case "category":
|
||||
release.Category = MapTrackerCatToNewznab(value);
|
||||
var cats = MapTrackerCatToNewznab(value);
|
||||
if (release.Category == null)
|
||||
{
|
||||
release.Category = cats;
|
||||
}
|
||||
else
|
||||
{
|
||||
foreach (var cat in cats)
|
||||
{
|
||||
if (!release.Category.Contains(cat))
|
||||
release.Category.Add(cat);
|
||||
}
|
||||
}
|
||||
value = release.Category.ToString();
|
||||
break;
|
||||
case "size":
|
||||
|
||||
@@ -19,6 +19,10 @@ namespace Jackett.Common.Indexers
|
||||
{
|
||||
public class FileList : BaseWebIndexer
|
||||
{
|
||||
public override string[] LegacySiteLinks { get; protected set; } = new string[] {
|
||||
"http://filelist.ro/",
|
||||
};
|
||||
|
||||
private string LoginUrl { get { return SiteLink + "takelogin.php"; } }
|
||||
private string BrowseUrl { get { return SiteLink + "browse.php"; } }
|
||||
|
||||
@@ -31,7 +35,7 @@ namespace Jackett.Common.Indexers
|
||||
public FileList(IIndexerConfigurationService configService, WebClient wc, Logger l, IProtectionService ps)
|
||||
: base(name: "FileList",
|
||||
description: "The best Romanian site.",
|
||||
link: "http://filelist.ro/",
|
||||
link: "https://filelist.ro/",
|
||||
caps: TorznabUtil.CreateDefaultTorznabTVCaps(),
|
||||
configService: configService,
|
||||
client: wc,
|
||||
|
||||
@@ -1,245 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.Specialized;
|
||||
using System.Globalization;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using CsQuery;
|
||||
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
|
||||
{
|
||||
//
|
||||
// Quick and dirty indexer for GFTracker.
|
||||
//
|
||||
public class GFTracker : BaseWebIndexer
|
||||
{
|
||||
private string StartPageUrl { get { return SiteLink + "login.php?returnto=%2F"; } }
|
||||
private string LoginUrl { get { return SiteLink + "loginsite.php"; } }
|
||||
private string SearchUrl { get { return SiteLink + "browse.php"; } }
|
||||
|
||||
private new ConfigurationDataRecaptchaLogin configData
|
||||
{
|
||||
get { return (ConfigurationDataRecaptchaLogin)base.configData; }
|
||||
set { base.configData = value; }
|
||||
}
|
||||
|
||||
public GFTracker(IIndexerConfigurationService configService, WebClient w, Logger l, IProtectionService ps)
|
||||
: base(name: "GFTracker",
|
||||
description: "Home of user happiness",
|
||||
link: "https://www.thegft.org/",
|
||||
caps: TorznabUtil.CreateDefaultTorznabTVCaps(),
|
||||
configService: configService,
|
||||
client: w,
|
||||
logger: l,
|
||||
p: ps,
|
||||
configData: new ConfigurationDataRecaptchaLogin())
|
||||
{
|
||||
Encoding = Encoding.UTF8;
|
||||
Language = "en-us";
|
||||
Type = "private";
|
||||
|
||||
AddCategoryMapping(2, TorznabCatType.PC0day, "0DAY");
|
||||
AddCategoryMapping(16, TorznabCatType.TVAnime, "Anime");
|
||||
AddCategoryMapping(1, TorznabCatType.PC0day, "APPS");
|
||||
AddCategoryMapping(9, TorznabCatType.Other, "E-Learning");
|
||||
AddCategoryMapping(35, TorznabCatType.TVFOREIGN, "Foreign");
|
||||
AddCategoryMapping(32, TorznabCatType.ConsoleNDS, "Games/NDS");
|
||||
AddCategoryMapping(6, TorznabCatType.PCGames, "Games/PC");
|
||||
AddCategoryMapping(36, TorznabCatType.ConsolePS4, "Games/Playstation");
|
||||
AddCategoryMapping(29, TorznabCatType.ConsolePSP, "Games/PSP");
|
||||
AddCategoryMapping(23, TorznabCatType.ConsoleWii, "Games/WII");
|
||||
AddCategoryMapping(12, TorznabCatType.ConsoleXbox, "Games/XBOX");
|
||||
AddCategoryMapping(11, TorznabCatType.Other, "Misc");
|
||||
AddCategoryMapping(48, TorznabCatType.MoviesBluRay, "Movies/BLURAY");
|
||||
AddCategoryMapping(8, TorznabCatType.MoviesDVD, "Movies/DVDR");
|
||||
AddCategoryMapping(18, TorznabCatType.MoviesHD, "Movies/X264-HD");
|
||||
AddCategoryMapping(49, TorznabCatType.MoviesSD, "Movies/X264-SD");
|
||||
AddCategoryMapping(7, TorznabCatType.MoviesSD, "Movies/XVID");
|
||||
AddCategoryMapping(38, TorznabCatType.AudioOther, "Music/DVDR");
|
||||
AddCategoryMapping(46, TorznabCatType.AudioLossless, "Music/FLAC");
|
||||
AddCategoryMapping(5, TorznabCatType.AudioMP3, "Music/MP3");
|
||||
AddCategoryMapping(13, TorznabCatType.AudioVideo, "Music/Vids");
|
||||
AddCategoryMapping(26, TorznabCatType.TVHD, "TV/BLURAY");
|
||||
AddCategoryMapping(37, TorznabCatType.TVSD, "TV/DVDR");
|
||||
AddCategoryMapping(19, TorznabCatType.TVSD, "TV/DVDRIP");
|
||||
AddCategoryMapping(47, TorznabCatType.TVSD, "TV/SD");
|
||||
AddCategoryMapping(17, TorznabCatType.TVHD, "TV/X264");
|
||||
AddCategoryMapping(4, TorznabCatType.TVSD, "TV/XVID");
|
||||
AddCategoryMapping(22, TorznabCatType.XXX, "XXX/0DAY");
|
||||
AddCategoryMapping(25, TorznabCatType.XXXDVD, "XXX/DVDR");
|
||||
AddCategoryMapping(20, TorznabCatType.XXX, "XXX/HD");
|
||||
AddCategoryMapping(3, TorznabCatType.XXXXviD, "XXX/XVID");
|
||||
}
|
||||
|
||||
public override async Task<ConfigurationData> GetConfigurationForSetup()
|
||||
{
|
||||
var loginPage = await RequestStringWithCookies(StartPageUrl, string.Empty);
|
||||
CQ cq = loginPage.Content;
|
||||
var result = this.configData;
|
||||
CQ recaptcha = cq.Find(".g-recaptcha").Attr("data-sitekey");
|
||||
if (recaptcha.Length != 0) // recaptcha not always present in login form, perhaps based on cloudflare uid or just phase of the moon
|
||||
{
|
||||
result.CookieHeader.Value = loginPage.Cookies;
|
||||
result.Captcha.SiteKey = cq.Find(".g-recaptcha").Attr("data-sitekey");
|
||||
result.Captcha.Version = "2";
|
||||
return result;
|
||||
}
|
||||
else
|
||||
{
|
||||
var stdResult = new ConfigurationDataBasicLogin();
|
||||
stdResult.SiteLink.Value = configData.SiteLink.Value;
|
||||
stdResult.Username.Value = configData.Username.Value;
|
||||
stdResult.Password.Value = configData.Password.Value;
|
||||
stdResult.CookieHeader.Value = loginPage.Cookies;
|
||||
return stdResult;
|
||||
}
|
||||
}
|
||||
|
||||
public override async Task<IndexerConfigurationStatus> ApplyConfiguration(JToken configJson)
|
||||
{
|
||||
LoadValuesFromJson(configJson);
|
||||
var pairs = new Dictionary<string, string> {
|
||||
{ "username", configData.Username.Value },
|
||||
{ "password", configData.Password.Value },
|
||||
{ "g-recaptcha-response", configData.Captcha.Value }
|
||||
};
|
||||
|
||||
if (!string.IsNullOrWhiteSpace(configData.Captcha.Cookie))
|
||||
{
|
||||
CookieHeader = configData.Captcha.Cookie;
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
var response = await RequestLoginAndFollowRedirect(LoginUrl, pairs, configData.CookieHeader.Value, true, SearchUrl, StartPageUrl);
|
||||
UpdateCookieHeader(response.Cookies);
|
||||
UpdateCookieHeader("mybbuser=;"); // add dummy cookie, otherwise we get logged out after each request
|
||||
|
||||
await ConfigureIfOK(configData.CookieHeader.Value, response.Content != null && response.Content.Contains("logout.php"), () =>
|
||||
{
|
||||
CQ dom = response.Content;
|
||||
var messageEl = dom["div:has(h2)"].Last();
|
||||
messageEl.Children("a").Remove();
|
||||
messageEl.Children("style").Remove();
|
||||
var errorMessage = messageEl.Text().Trim();
|
||||
IsConfigured = false;
|
||||
throw new ExceptionWithConfigData(errorMessage, configData);
|
||||
});
|
||||
return IndexerConfigurationStatus.RequiresTesting;
|
||||
}
|
||||
|
||||
protected override async Task<IEnumerable<ReleaseInfo>> PerformQuery(TorznabQuery query)
|
||||
{
|
||||
var releases = new List<ReleaseInfo>();
|
||||
var searchString = query.GetQueryString();
|
||||
|
||||
// search in normal + gems view
|
||||
foreach (var view in new string[] { "0", "1" })
|
||||
{
|
||||
var queryCollection = new NameValueCollection();
|
||||
|
||||
queryCollection.Add("view", view);
|
||||
queryCollection.Add("searchtype", "1");
|
||||
queryCollection.Add("incldead", "1");
|
||||
if (!string.IsNullOrWhiteSpace(searchString))
|
||||
{
|
||||
queryCollection.Add("search", searchString);
|
||||
}
|
||||
|
||||
foreach (var cat in MapTorznabCapsToTrackers(query))
|
||||
{
|
||||
queryCollection.Add(string.Format("c{0}", cat), "1");
|
||||
}
|
||||
|
||||
var searchUrl = SearchUrl + "?" + queryCollection.GetQueryString();
|
||||
|
||||
var results = await RequestStringWithCookiesAndRetry(searchUrl);
|
||||
if (results.IsRedirect)
|
||||
{
|
||||
// re-login
|
||||
await ApplyConfiguration(null);
|
||||
results = await RequestStringWithCookiesAndRetry(searchUrl);
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
CQ dom = results.Content;
|
||||
var rows = dom["#torrentBrowse > table > tbody > tr"];
|
||||
foreach (var row in rows.Skip(1))
|
||||
{
|
||||
var release = new ReleaseInfo();
|
||||
CQ qRow = row.Cq();
|
||||
|
||||
release.MinimumRatio = 0;
|
||||
release.MinimumSeedTime = 2 * 24 * 60 * 60;
|
||||
|
||||
var qLink = qRow.Find("a[title][href^=\"details.php?id=\"]");
|
||||
release.Title = qLink.Attr("title");
|
||||
release.Guid = new Uri(SiteLink + qLink.Attr("href").TrimStart('/'));
|
||||
release.Comments = release.Guid;
|
||||
|
||||
qLink = qRow.Children().ElementAt(3).Cq().Children("a").First();
|
||||
release.Link = new Uri(string.Format("{0}{1}", SiteLink, qLink.Attr("href")));
|
||||
|
||||
var catUrl = qRow.Children().ElementAt(0).FirstElementChild.Cq().Attr("href");
|
||||
var catNum = catUrl.Split(new char[] { '=', '&' })[2].Replace("c", "");
|
||||
release.Category = MapTrackerCatToNewznab(catNum);
|
||||
|
||||
var dateString = qRow.Children().ElementAt(6).Cq().Text().Trim();
|
||||
if (dateString.Contains("ago"))
|
||||
release.PublishDate = DateTimeUtil.FromTimeAgo(dateString);
|
||||
else
|
||||
release.PublishDate = DateTime.ParseExact(dateString, "yyyy-MM-ddHH:mm:ss", CultureInfo.InvariantCulture);
|
||||
|
||||
var sizeStr = qRow.Children().ElementAt(7).Cq().Text().Split(new char[] { '/' })[0];
|
||||
release.Size = ReleaseInfo.GetBytes(sizeStr);
|
||||
|
||||
release.Seeders = ParseUtil.CoerceInt(qRow.Children().ElementAt(8).Cq().Text().Split(new char[] { '/' })[0].Trim());
|
||||
release.Peers = ParseUtil.CoerceInt(qRow.Children().ElementAt(8).Cq().Text().Split(new char[] { '/' })[1].Trim()) + release.Seeders;
|
||||
release.Files = ParseUtil.CoerceLong(qRow.Find("td:nth-child(5)").Text());
|
||||
release.Grabs = ParseUtil.CoerceLong(qRow.Find("a[href^=\"snatches.php?id=\"]").Text().Split(' ')[0]);
|
||||
|
||||
release.DownloadVolumeFactor = 0;
|
||||
release.UploadVolumeFactor = 1;
|
||||
|
||||
var desc = qRow.Find("td:nth-child(2)");
|
||||
desc.Find("a").Remove();
|
||||
desc.Find("small").Remove(); // Remove release name (if enabled in the user cp)
|
||||
release.Description = desc.Text().Trim(new char[] { '-', ' ' });
|
||||
|
||||
releases.Add(release);
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
OnParseError(results.Content, ex);
|
||||
}
|
||||
}
|
||||
|
||||
return releases;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -213,7 +213,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,
|
||||
@@ -279,7 +279,15 @@ namespace Jackett.Common.Indexers
|
||||
release.Guid = new Uri(qRow.Find("td:eq(2) a").Attr("href"));
|
||||
release.Link = release.Guid;
|
||||
release.Comments = new Uri(qRow.Find("td:eq(1) .tooltip-target a").Attr("href"));
|
||||
release.PublishDate = DateTime.ParseExact(qRow.Find("td:eq(1) div").Last().Text().Trim(), "dd-MM-yyyy H:mm", CultureInfo.InvariantCulture); //08-08-2015 12:51
|
||||
var qDate = qRow.Find("td:eq(1) div").Last();
|
||||
var date = qDate.Text().Trim();
|
||||
if (date.StartsWith("Pre Release Time:")) // in some cases the pre time is shown
|
||||
{
|
||||
date = date.Replace("Pre Release Time:", "");
|
||||
date = date.Split(new string[] { "Uploaded:" }, StringSplitOptions.None)[0];
|
||||
date = date.Trim();
|
||||
}
|
||||
release.PublishDate = DateTime.ParseExact(date, "dd-MM-yyyy H:mm", CultureInfo.InvariantCulture); //08-08-2015 12:51
|
||||
release.Seeders = ParseUtil.CoerceInt(qRow.Find("td:eq(6)").Text());
|
||||
release.Peers = release.Seeders + ParseUtil.CoerceInt(qRow.Find("td:eq(7)").Text().Trim());
|
||||
release.Size = ReleaseInfo.GetBytes(qRow.Find("td:eq(4)").Text().Trim());
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Globalization;
|
||||
using System.Linq;
|
||||
using System.Net;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
@@ -10,9 +9,9 @@ using Jackett.Common.Models;
|
||||
using Jackett.Common.Models.IndexerConfig;
|
||||
using Jackett.Common.Services.Interfaces;
|
||||
using Jackett.Common.Utils;
|
||||
using Newtonsoft.Json;
|
||||
using Newtonsoft.Json.Linq;
|
||||
using NLog;
|
||||
using Newtonsoft.Json;
|
||||
|
||||
namespace Jackett.Common.Indexers
|
||||
{
|
||||
@@ -174,7 +173,7 @@ namespace Jackett.Common.Indexers
|
||||
|
||||
release.Link = new Uri(SiteLink + "download/" + torrent.fid + "/" + torrent.filename);
|
||||
|
||||
release.PublishDate = DateTimeUtil.UnixTimestampToDateTime(ParseUtil.CoerceLong(torrent.addedTimestamp.ToString()));
|
||||
release.PublishDate = DateTime.ParseExact(torrent.addedTimestamp.ToString(), "yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture, DateTimeStyles.AssumeLocal);
|
||||
|
||||
release.Size = (long)torrent.size;
|
||||
|
||||
|
||||
@@ -164,7 +164,8 @@ namespace Jackett.Common.Indexers
|
||||
protected override async Task<IEnumerable<ReleaseInfo>> PerformQuery(TorznabQuery query)
|
||||
{
|
||||
var releases = new List<ReleaseInfo>();
|
||||
var searchTerm = query.GetQueryString();
|
||||
var searchTerm = query.GetEpisodeSearchString() + " " + query.SanitizedSearchTerm; // use episode search string first, see issue #1202
|
||||
searchTerm = searchTerm.Trim();
|
||||
searchTerm = searchTerm.ToLower();
|
||||
|
||||
// Check cache first so we don't query the server (if search term used or not in dev mode)
|
||||
|
||||
@@ -21,6 +21,7 @@ namespace Jackett.Common.Models.DTO
|
||||
public string track { get; set; }
|
||||
public string year { get; set; }
|
||||
public string genre { get; set; }
|
||||
public string configured { get; set; }
|
||||
|
||||
public static TorznabQuery ToTorznabQuery(TorznabRequest request)
|
||||
{
|
||||
|
||||
@@ -258,11 +258,16 @@ namespace Jackett.Controllers
|
||||
return GetErrorXML(203, "Function Not Available: this isn't a meta indexer");
|
||||
}
|
||||
var CurrentBaseMetaIndexer = (BaseMetaIndexer)CurrentIndexer;
|
||||
var indexers = CurrentBaseMetaIndexer.Indexers;
|
||||
if (string.Equals(request.configured, "true", StringComparison.InvariantCultureIgnoreCase))
|
||||
indexers = indexers.Where(i => i.IsConfigured);
|
||||
else if (string.Equals(request.configured, "false", StringComparison.InvariantCultureIgnoreCase))
|
||||
indexers = indexers.Where(i => !i.IsConfigured);
|
||||
|
||||
var xdoc = new XDocument(
|
||||
new XDeclaration("1.0", "UTF-8", null),
|
||||
new XElement("indexers",
|
||||
from i in CurrentBaseMetaIndexer.Indexers
|
||||
from i in indexers
|
||||
select new XElement("indexer",
|
||||
new XAttribute("id", i.ID),
|
||||
new XAttribute("configured", i.IsConfigured),
|
||||
|
||||
Reference in New Issue
Block a user