Compare commits

...

8 Commits

Author SHA1 Message Date
Garfield69
0cd46efe35 add extremlymtorrents a semi-private site. resolves #6668 2019-12-24 18:02:11 +13:00
Garfield69
1433ffcd13 rptorrents: fix sort is->id 2019-12-24 16:41:31 +13:00
Garfield69
450bc8b5ff add cinemamovies a Polish private site. resolves #6667 2019-12-24 15:54:24 +13:00
Garfield69
4eadff404a btdb: add seeders to config sort option 2019-12-24 07:13:44 +13:00
Garfield69
213141f55e btdb: add seeders/leechers drop grabs. resolves #6673 2019-12-24 06:35:03 +13:00
Cory
370f95f888 720pier: Fix login and search parsing (#6670) resolves #6368 2019-12-24 06:17:48 +13:00
Garfield69
7c8ad8ac41 torrentz2: fix categories 2019-12-23 19:21:47 +13:00
Garfield69
f7401d6344 Update README.md 2019-12-23 18:51:42 +13:00
7 changed files with 384 additions and 68 deletions

View File

@@ -127,6 +127,7 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
* Deildu
* DXP (Deaf Experts)
* EniaHD
* ExtremlymTorrents
* Film-Paleis
* Gay-Torrents.net
* Gay-Torrents.org
@@ -210,6 +211,7 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
* CHDBits
* ChannelX
* Cinemageddon
* CinemaMovies
* Cinematik
* CinemaZ (EuTorrents)
* Classix
@@ -410,7 +412,7 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
* ToTheGlory
* TranceTraffic
* Trezzor
* TurkTorrent (TT) [![(invite needed)][inviteneeded]](#)
* TurkTorrent (TT)
* TV Chaos UK (TVCUK)
* TV-Vault
* TVstore

View File

@@ -33,6 +33,7 @@
options:
"time": "created"
"length": "size"
"popular": "seeders"
search:
paths:
@@ -59,12 +60,10 @@
selector: div[class$="info"] span:nth-of-type(3)
filters:
- name: timeago
grabs:
selector: div[class$="info"] span:nth-of-type(4)
seeders:
text: 1
selector: div[class$="info"] span:nth-of-type(4)
leechers:
text: 1
selector: div[class$="info"] span:nth-of-type(5)
downloadvolumefactor:
text: 0
uploadvolumefactor:

View File

@@ -0,0 +1,137 @@
---
site: cinemamovies
name: CinemaMovies
description: "CinemaMovies is a POLISH Private Torrent Tracker for MOVIES / TV / GENERAL"
language: pl-pl
type: private
encoding: ISO-8859-2
links:
- https://cinemamovies.pl/
caps:
categorymappings:
- {id: 3, cat: Movies/BluRay, desc: "Filmy BD25/50_5/9"}
- {id: 5, cat: Movies/3D, desc: "Filmy 3D"}
- {id: 6, cat: Movies/DVD, desc: "Filmy DVD5/9"}
- {id: 8, cat: Movies/HD, desc: "Filmy HD"}
- {id: 11, cat: Movies/SD, desc: "Filmy SD"}
- {id: 12, cat: Movies/Other, desc: "Filmy Inne"}
- {id: 32, cat: Movies/UHD, desc: "Filmy UHD"}
- {id: 2, cat: TV/Anime, desc: "Anime"}
- {id: 2, cat: TV/Documentary, desc: "TV Dokumentalne"}
- {id: 20, cat: TV, desc: "TV Paczki"}
- {id: 22, cat: TV/Sport, desc: "TV Sport"}
- {id: 24, cat: TV/HD, desc: "TV HD"}
- {id: 25, cat: TV/SD, desc: "TV SD"}
- {id: 1, cat: PC, desc: "Aplikacje"}
- {id: 15, cat: PC/Games, desc: "Gry"}
- {id: 16, cat: PC/Phone-Other, desc: "Mobile"}
- {id: 17, cat: Other, desc: "Inne"}
- {id: 19, cat: Audio, desc: "Muzyka"}
- {id: 21, cat: Books, desc: "Book"}
modes:
search: [q]
tv-search: [q, season, ep]
movie-search: [q]
settings:
- name: cookie
type: text
label: Cookie
- name: info
type: info
label: How to get the Cookie
default: "<ol><li>Login to this tracker with your browser<li>Open the <b>DevTools</b> panel by pressing <b>F12</b><li>Select the <b>Network</b> tab<li>Click on the <b>Doc</b> button<li>Refresh the page by pressing <b>F5</b><li>Select the <b>Headers</b> tab<li>Find 'cookie:' in the <b>Request Headers</b> section<li>Copy & paste the whole cookie string to here.</ol>"
- name: sort
type: select
label: Sort requested from site
default: "2"
options:
"2": "created"
"5": "seeders"
"3": "size"
"1": "title"
- name: type
type: select
label: Order requested from site
default: "desc"
options:
"desc": "desc"
"asc": "asc"
login:
method: cookie
inputs:
cookie: "{{ .Config.cookie }}"
test:
path: index.php
selector: a[href^="/logout.php"]
search:
paths:
- path: browse.php
inputs:
$raw: "{{ range .Categories }}c{{.}}=1&{{end}}"
search: "{{ .Keywords }}"
# 0 onlyactive 1 all 4 requests 5 onlydead 6 polish 8 free 10 doubleup 11 premier 13 VOD
incldead: 1
# 0 title 1 descr
blah: 0
sort: "{{ .Config.sort }}"
type: "{{ .Config.type }}"
rows:
selector: table[width="100%"] > tbody > tr:has(a[href^="browse.php?cat="])
fields:
category:
selector: a[href^="browse.php?cat="]
attribute: href
filters:
- name: querystring
args: cat
title:
selector: a[href^="details.php?id="]
details:
selector: a[href^="details.php?id="]
attribute: href
download:
selector: a[href^="download.php/"]
attribute: href
banner:
selector: a[href^="details.php?id="]
attribute: onmouseover
filters:
- name: regexp
args: "src=(.+?) "
description:
optional: true
selector: img[src="pic/Poland.png"]
attribute: src
filters:
- name: replace
args: ["pic/Poland.png", "Polish"]
date:
selector: td[width="66%"] > span > span
filters:
- name: append
args: " +00:00"
- name: dateparse
args: "2006-01-02 15:04:05 -07:00"
size:
selector: td:nth-child(4)
seeders:
selector: a[href$="#seedy"]
leechers:
selector: a[href$="#leechy"]
grabs:
selector: td:last-child > small> span
downloadvolumefactor:
case:
img[src="pic/free.png"]: 0
"*": 1
uploadvolumefactor:
case:
img[src="pic/double.png"]: 2
"*": 1

View File

@@ -0,0 +1,168 @@
---
site: extremlymtorrents
name: ExtremlymTorrents
description: "ExtremlymTorrents is a Semi-Private tracker for MOVIES / TV / GENERAL"
language: en-us
type: semi-private
encoding: UTF-8
links:
- https://extremlymtorrents.ws/
caps:
categorymappings:
- {id: 22, cat: Movies/HD, desc: "720p HD"}
- {id: 15, cat: Movies/HD, desc: "1080p HD"}
- {id: 40, cat: Movies/UHD, desc: "4K UHD 2160p"}
- {id: 12, cat: Movies/BluRay, desc: "BluRay"}
- {id: 5, cat: Movies/DVD, desc: "DVDRip "}
- {id: 16, cat: Movies/3D, desc: "BluRay 3D"}
- {id: 13, cat: TV/HD, desc: "HDTV"}
- {id: 47, cat: XXX, desc: "Porn UHD 4K -[+18]- xXx"}
- {id: 11, cat: XXX, desc: "Porn -[+18]- xXx"}
- {id: 41, cat: TV, desc: "TVRip"}
- {id: 6, cat: Audio, desc: "Music Mp3 | FLAC"}
- {id: 9, cat: TV, desc: "Kidz | Cartoons"}
- {id: 8, cat: Books/Ebook, desc: "Comics | EBook"}
- {id: 10, cat: TV, desc: "TV Episode | Season Complete"}
- {id: 27, cat: Movies/DVD, desc: "DVD | PAL | NTSC"}
- {id: 25, cat: Movies/WEBDL, desc: "WEBRip | WEB-DL"}
- {id: 35, cat: Movies, desc: "BRRip | BDRip | HDRip"}
- {id: 3, cat: PC, desc: "Applications"}
- {id: 17, cat: Console/PSP, desc: "PSP | Playstation "}
- {id: 30, cat: TV/SD, desc: "PDTV | SDTV"}
- {id: 18, cat: Console/PS3, desc: "PS3 | Playstation 3 "}
- {id: 46, cat: Console/PS4, desc: "PS4 | PlayStation 4"}
- {id: 20, cat: PC/Phone-IOS, desc: "Iphone iOS"}
- {id: 19, cat: PC/Phone-Android, desc: "Android Apk"}
- {id: 21, cat: Movies, desc: "Pack"}
- {id: 49, cat: TV/UHD, desc: "TV UHD | 2160p | Episodes"}
- {id: 24, cat: Audio/Video, desc: "VideoClip"}
- {id: 26, cat: Console/Wii, desc: "Wii Games"}
- {id: 31, cat: TV/Documentary, desc: "DOC's"}
- {id: 36, cat: Movies, desc: "CAMRip | REC"}
- {id: 38, cat: Movies, desc: "TS: TeleSync | HD-TS"}
- {id: 48, cat: Audio/Video, desc: "4K | 2160p | Music Video"}
- {id: 28, cat: TV/Anime, desc: "Anime | Japanese"}
- {id: 43, cat: XXX, desc: "Hentai | Manga"}
- {id: 29, cat: PC/0day, desc: "Windows PC"}
- {id: 7, cat: PC/Mac, desc: "Mac"}
- {id: 23, cat: PC, desc: "Linux"}
- {id: 32, cat: PC/Phone-Other, desc: "GPS Navigation"}
- {id: 45, cat: Audio, desc: "Vinyl Rip"}
- {id: 2, cat: Console/Xbox 360, desc: "XBOX 360"}
- {id: 1, cat: PC/Games, desc: "Games PC"}
- {id: 14, cat: Other, desc: "Wallpapers"}
- {id: 44, cat: Movies, desc: "Bollywood"}
- {id: 42, cat: Other/Misc, desc: "X EXTERN ONLY MAGNET"}
- {id: 39, cat: TV/Sport, desc: "Sport TV"}
modes:
search: [q]
tv-search: [q, season, ep]
movie-search: [q]
settings:
- name: username
type: text
label: Username
- name: password
type: password
label: Password
- name: sort
type: select
label: Sort requested from site
default: "id"
options:
"id": "created"
"seeders": "seeders"
"size": "size"
"name": "title"
- name: type
type: select
label: Order requested from site
default: "desc"
options:
"desc": "desc"
"asc": "asc"
login:
path: account-login.php
method: post
inputs:
username: "{{ .Config.username }}"
password: "{{ .Config.password }}"
error:
- selector: span.titlebar:contains("Access Denied")
message:
selector: td.text
test:
path: index.php
selector: a[href="account-logout.php"]
search:
paths:
- path: torrents-search.php
inputs:
$raw: "{{ range .Categories }}c{{.}}=1&{{end}}"
search: "{{ .Keywords }}"
# 0 all 1 English 2 etc...
lang: 0
sort: "{{ .Config.sort }}"
order: "{{ .Config.type }}"
keywordsfilters:
- name: re_replace
args: ["(\\w+)", " +$1"] # prepend + to each word
rows:
selector: table.xtrz > tbody > tr[class^="ttable_col"]
fields:
category:
selector: a[href^="torrents.php?cat="]
attribute: href
filters:
- name: querystring
args: cat
language:
selector: td:nth-last-child(5)
description:
optional: true
selector: img[src="/images/vip-icon.png"]
attribute: src
filters:
- name: replace
args: ["/images/vip-icon.png", " VIP ONLY"]
title:
selector: a[href^="file.php?id="] b
filters:
- name: append
args: " {{ .Result.language }}{{ .Result.description }}"
details:
selector: a[href^="file.php?id="]
attribute: href
download:
selector: a[href^="download.php?id="]
attribute: href
banner:
selector: a[href^="file.php?id="]
attribute: onmouseover
filters:
- name: regexp
args: "src=(.+?) "
date:
selector: td:nth-last-child(1)
filters:
- name: dateparse
args: "02.01.200615:04:05"
leechers:
selector: td:nth-last-child(2)
seeders:
selector: td:nth-last-child(3)
size:
selector: td:nth-last-child(4)
downloadvolumefactor:
case:
img[src="/images/free.png"]: 0
"*": 1
uploadvolumefactor:
text: 1

View File

@@ -54,7 +54,7 @@
label: Sort requested from site
default: "id"
options:
"is": "created"
"id": "created"
"seeders": "seeders"
"size": "size"
"name": "title"

View File

@@ -40,6 +40,7 @@
"adult fisting": XXX
"adult hairy": XXX
"adult hentai": XXX
"adult interracial": XXX
"adult lesbian": XXX
"adult milf": XXX
"adult squirting": XXX
@@ -87,14 +88,6 @@
# andmatch filter removed, see #3737
fields:
category:
optional: true
selector: dt
remove: a
filters:
- name: re_replace
args: ["[^a-zA-Z\\s]+", ""]
- name: trim
title:
selector: dt a
details:
@@ -128,6 +121,14 @@
args: "magnet:?xt=urn:btih:"
- name: append
args: "&dn={{ .Result.magfile }}.torrent&tr=udp://tracker.coppersurfer.tk:6969&tr=udp://tracker.leechers-paradise.org:6969&tr=udp://tracker.opentrackr.org:1337"
category:
optional: true
selector: dt
remove: a
filters:
- name: re_replace
args: ["[^a-zA-Z0-9\\s]+", ""]
- name: trim
date:
selector: dd span:nth-child(2)
attribute: title

View File

@@ -1,10 +1,4 @@
using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using AngleSharp.Html.Parser;
using AngleSharp.Html.Parser;
using Jackett.Common.Models;
using Jackett.Common.Models.IndexerConfig;
using Jackett.Common.Services.Interfaces;
@@ -12,18 +6,24 @@ using Jackett.Common.Utils;
using Jackett.Common.Utils.Clients;
using Newtonsoft.Json.Linq;
using NLog;
using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Jackett.Common.Indexers
{
public class Pier720 : BaseWebIndexer
{
private string LoginUrl { get { return SiteLink + "ucp.php?mode=login"; } }
private string SearchUrl { get { return SiteLink + "search.php"; } }
private string LoginUrl => SiteLink + "ucp.php?mode=login";
private string SearchUrl => SiteLink + "search.php";
private new ConfigurationDataBasicLoginWithRSSAndDisplay configData
{
get { return (ConfigurationDataBasicLoginWithRSSAndDisplay)base.configData; }
set { base.configData = value; }
get => (ConfigurationDataBasicLoginWithRSSAndDisplay)base.configData;
set => base.configData = value;
}
public Pier720(IIndexerConfigurationService configService, WebClient wc, Logger l, IProtectionService ps)
@@ -40,7 +40,7 @@ namespace Jackett.Common.Indexers
Encoding = Encoding.UTF8;
Language = "ru-ru";
Type = "private";
AddCategoryMapping(32, TorznabCatType.TVSport, "Basketball");
AddCategoryMapping(34, TorznabCatType.TVSport, "Basketball - NBA");
AddCategoryMapping(87, TorznabCatType.TVSport, "Basketball - NBA Playoffs");
@@ -113,14 +113,20 @@ namespace Jackett.Common.Indexers
var pairs = new Dictionary<string, string>
{
{ "username", configData.Username.Value },
{ "password", configData.Password.Value },
{ "redirect", "/" },
{ "login", "Login" }
{"username", configData.Username.Value},
{"password", configData.Password.Value},
{"redirect", "/"},
{"login", "Login"},
{"autologin", "on"}
};
var htmlParser = new HtmlParser();
var loginDocument = htmlParser.ParseDocument((await RequestStringWithCookies(LoginUrl)).Content);
pairs["creation_time"] = loginDocument.GetElementsByName("creation_time")[0].GetAttribute("value");
pairs["form_token"] = loginDocument.GetElementsByName("form_token")[0].GetAttribute("value");
pairs["sid"] = loginDocument.GetElementsByName("sid")[0].GetAttribute("value");
var result = await RequestLoginAndFollowRedirect(LoginUrl, pairs, null, true, null, LoginUrl, true);
await ConfigureIfOK(result.Cookies, result.Content != null && result.Content.Contains("ucp.php?mode=logout&"), () =>
await ConfigureIfOK(result.Cookies, result.Content?.Contains("ucp.php?mode=logout&") == true, () =>
{
var errorMessage = result.Content;
throw new ExceptionWithConfigData(errorMessage, configData);
@@ -133,16 +139,18 @@ namespace Jackett.Common.Indexers
var releases = new List<ReleaseInfo>();
var searchString = query.GetQueryString();
WebClientStringResult results = null;
var queryCollection = new NameValueCollection();
var queryCollection = new NameValueCollection
{
{"st", "0"},
{"sd", "d"},
{"sk", "t"},
{"tracker_search", "torrent"},
{"t", "0"},
{"submit", "Search"},
{"sr", "topics"},
{"ot", "1" }
};
queryCollection.Add("st", "0");
queryCollection.Add("sd", "d");
queryCollection.Add("sk", "t");
queryCollection.Add("tracker_search", "torrent");
queryCollection.Add("t", "0");
queryCollection.Add("submit", "Search");
queryCollection.Add("sr", "topics");
//queryCollection.Add("sr", "posts");
//queryCollection.Add("ch", "99999");
@@ -150,7 +158,6 @@ namespace Jackett.Common.Indexers
if (string.IsNullOrWhiteSpace(searchString))
{
queryCollection.Add("search_id", "active_topics");
queryCollection.Add("ot", "1");
}
else // use the normal search
{
@@ -159,11 +166,10 @@ namespace Jackett.Common.Indexers
queryCollection.Add("sf", "titleonly");
queryCollection.Add("sr", "topics");
queryCollection.Add("pt", "t");
queryCollection.Add("ot", "1");
}
var searchUrl = SearchUrl + "?" + queryCollection.GetQueryString();
results = await RequestStringWithCookies(searchUrl);
var results = await RequestStringWithCookies(searchUrl);
if (!results.Content.Contains("ucp.php?mode=logout"))
{
await ApplyConfiguration(null);
@@ -171,47 +177,53 @@ namespace Jackett.Common.Indexers
}
try
{
string RowsSelector = "ul.topics > li.row";
const string rowsSelector = "ul.topics > li.row";
var ResultParser = new HtmlParser();
var SearchResultDocument = ResultParser.ParseDocument(results.Content);
var Rows = SearchResultDocument.QuerySelectorAll(RowsSelector);
foreach (var Row in Rows)
var resultParser = new HtmlParser();
var searchResultDocument = resultParser.ParseDocument(results.Content);
var rows = searchResultDocument.QuerySelectorAll(rowsSelector);
foreach (var row in rows)
{
try
{
var release = new ReleaseInfo();
{
var release = new ReleaseInfo
{
MinimumRatio = 1,
MinimumSeedTime = 0,
DownloadVolumeFactor = 1,
UploadVolumeFactor = 1,
Seeders = ParseUtil.CoerceInt(row.QuerySelector("span.seed").TextContent),
Grabs = ParseUtil.CoerceLong(row.QuerySelector("span.complet").TextContent),
};
release.Peers = ParseUtil.CoerceInt(row.QuerySelector("span.leech").TextContent) + release.Seeders;
release.MinimumRatio = 1;
release.MinimumSeedTime = 0;
var qDetailsLink = Row.QuerySelector("a.topictitle");
var qDetailsLink = row.QuerySelector("a.topictitle");
release.Title = qDetailsLink.TextContent;
release.Comments = new Uri(SiteLink + qDetailsLink.GetAttribute("href"));
release.Guid = release.Comments;
var detailsResult = await RequestStringWithCookies(SiteLink + qDetailsLink.GetAttribute("href"));
var DetailsResultDocument = ResultParser.ParseDocument(detailsResult.Content);
var qDownloadLink = DetailsResultDocument.QuerySelector("table.table2 > tbody > tr > td > a[href^=\"/download/torrent.php?id\"]");
var detailsResultDocument = resultParser.ParseDocument(detailsResult.Content);
var qDownloadLink = detailsResultDocument.QuerySelector("table.table2 > tbody > tr > td > a[href^=\"/download/torrent\"]");
release.Link = new Uri(SiteLink + qDownloadLink.GetAttribute("href").TrimStart('/'));
release.Seeders = ParseUtil.CoerceInt(Row.QuerySelector("span.seed").TextContent);
release.Peers = ParseUtil.CoerceInt(Row.QuerySelector("span.leech").TextContent) + release.Seeders;
release.Grabs = ParseUtil.CoerceLong(Row.QuerySelector("span.complet").TextContent);
var author = Row.QuerySelector("dd.lastpost > span");
var timestr = author.TextContent.Split('\n')[4].Trim();
var author = row.QuerySelector("dd.lastpost > span");
var timestr = author.TextContent.Split('\n')
.Where(str => !str.IsNullOrEmptyOrWhitespace()) //Filter blank lines
.Skip(1) //Skip author name
.FirstOrDefault()
.Trim();
release.PublishDate = DateTimeUtil.FromUnknown(timestr, "UK");
var forum = Row.QuerySelector("a[href^=\"./viewforum.php?f=\"]");
var forum = row.QuerySelector("a[href^=\"./viewforum.php?f=\"]");
var forumid = forum.GetAttribute("href").Split('=')[1];
release.Category = MapTrackerCatToNewznab(forumid);
var size = Row.QuerySelector("dl.row-item > dt > div.list-inner > div[style^=\"float:right\"]").TextContent;
var size = row.QuerySelector("dl.row-item > dt > div.list-inner > div[style^=\"float:right\"]").TextContent;
size = size.Replace("GiB", "GB");
size = size.Replace("MiB", "MB");
size = size.Replace("KiB", "KB");
@@ -222,14 +234,11 @@ namespace Jackett.Common.Indexers
release.Size = ReleaseInfo.GetBytes(size);
release.DownloadVolumeFactor = 1;
release.UploadVolumeFactor = 1;
releases.Add(release);
}
catch (Exception ex)
{
logger.Error(string.Format("{0}: Error while parsing row '{1}':\n\n{2}", ID, Row.OuterHtml, ex));
logger.Error($"{ID}: Error while parsing row '{row.OuterHtml}':\n\n{ex}");
}
}
}