Compare commits

..

22 Commits

Author SHA1 Message Date
kaso17
65aaaa3d77 Racing4Everyone: fix categories 2018-04-13 18:07:00 +02:00
HDVinnie
c2b2c94e1b Racing4Everyone: add definition (#2965)
* (Create) racing4everyone.yml

- I have yet to test this. If anyone is willing to please do. Currently is open reg for 3 more days.

* (Update) Add R4E to README

- added racing4everyone (R4E)
2018-04-13 14:48:33 +00:00
Harald Weber
e8465f23b9 Bittorrentfiles: Fixed indexer (#2964) 2018-04-12 10:49:50 +00:00
kaso17
09d37ab232 GFTracker: removed (dead) 2018-04-11 18:45:30 +02:00
kaso17
f413355610 NextTorrent: update site link 2018-04-11 18:43:25 +02:00
kaso17
5a97cd7dd2 Andraste: removed (dead) 2018-04-11 18:39:24 +02:00
kaso17
7b354d1582 TVChaosUK: add support for pre times 2018-04-11 18:36:22 +02:00
kaso17
b964a33ae2 Xthor: use episode search string first (3) 2018-04-11 18:15:15 +02:00
kaso17
dfa513da24 Xthor: use episode search string first (2) 2018-04-11 18:14:25 +02:00
kaso17
dcee9128f9 Xthor: search for 2018-04-11 18:12:06 +02:00
kaso17
30a8e1b4c5 FileList: update sitelink 2018-04-11 18:06:18 +02:00
kaso17
a5e2e6ef60 The Pirate Bay: add parent + sub category 2018-04-10 14:49:19 +02:00
kaso17
772709d46c Cardigann: add support for multiple category blocks 2018-04-10 14:48:46 +02:00
kaso17
71f60c612a Merge branch 'master' of https://github.com/Jackett/Jackett 2018-04-09 19:34:16 +02:00
kaso17
e6834990ec The Pirate Bay: fix categories and add order option 2018-04-09 19:33:34 +02:00
flightlevel
17d7ed5a2b TorrentLeech: Update DateTime parsing (#2935) 2018-04-09 19:36:20 +10:00
flightlevel
10bf70c663 Add no reponse and pull request templates 2018-04-08 12:43:55 +10:00
Kevin Richter
8c14820a38 Add download/upload factor to nyaa trackers (#2924)
* Add download/upload factors for nyaa trackers

* Add Intelij to Ignore
2018-04-08 06:45:36 +12:00
kaso17
63772f289d add aggregate indexers 2018-04-07 18:48:13 +02:00
kaso17
8d5aec030c Merge branch 'master' of https://github.com/Jackett/Jackett 2018-04-07 17:55:08 +02:00
kaso17
280547ad01 add configured option for t=indexers 2018-04-07 17:54:42 +02:00
Garfield69
d01d57037e bjshare: correction to 5bfe0179b2 for quality parsing. 2018-04-07 06:57:16 +12:00
24 changed files with 221 additions and 484 deletions

View File

@@ -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.

View File

@@ -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
View 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
View 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
View File

@@ -199,3 +199,4 @@ FakesAssemblies/
/Artifacts
/TestResults
*.DS_Store
.idea/

View File

@@ -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.

View File

@@ -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"

View File

@@ -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/

View File

@@ -113,3 +113,7 @@
filters:
- name: replace
args: ["Unknown", "0"]
downloadvolumefactor:
text: "0"
uploadvolumefactor:
text: "1"

View File

@@ -122,3 +122,7 @@
selector: td:nth-child(7)
grabs:
selector: td:nth-child(8)
downloadvolumefactor:
text: "0"
uploadvolumefactor:
text: "1"

View 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"

View File

@@ -99,3 +99,7 @@
filters:
- name: replace
args: ["Unknown", "0"]
downloadvolumefactor:
text: "0"
uploadvolumefactor:
text: "1"

View File

@@ -92,3 +92,7 @@
selector: td:nth-child(7)
grabs:
selector: td:nth-child(8)
downloadvolumefactor:
text: "0"
uploadvolumefactor:
text: "1"

View File

@@ -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:

View File

@@ -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;
}
}
}

View File

@@ -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);

View File

@@ -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":

View File

@@ -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,

View File

@@ -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;
}
}
}

View File

@@ -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());

View File

@@ -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;

View File

@@ -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)

View File

@@ -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)
{

View File

@@ -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),