2020-02-09 02:35:16 +00:00
using System ;
2015-04-16 01:16:16 +00:00
using System.Collections.Generic ;
2015-07-29 19:30:28 +00:00
using System.Collections.Specialized ;
2020-05-03 23:35:52 +00:00
using System.Diagnostics.CodeAnalysis ;
2015-04-16 01:16:16 +00:00
using System.Linq ;
using System.Text ;
using System.Threading.Tasks ;
2020-02-28 22:33:21 +00:00
using AngleSharp.Html.Parser ;
2018-03-10 08:05:56 +00:00
using Jackett.Common.Models ;
using Jackett.Common.Models.IndexerConfig ;
using Jackett.Common.Services.Interfaces ;
using Jackett.Common.Utils ;
2020-06-11 15:09:27 +00:00
using Jackett.Common.Utils.Clients ;
2017-10-29 06:21:18 +00:00
using Newtonsoft.Json.Linq ;
using NLog ;
2021-01-31 11:46:23 +00:00
using static Jackett . Common . Models . IndexerConfig . ConfigurationData ;
2015-04-16 01:16:16 +00:00
2018-03-10 08:05:56 +00:00
namespace Jackett.Common.Indexers
2015-04-16 01:16:16 +00:00
{
2020-05-03 23:35:52 +00:00
[ExcludeFromCodeCoverage]
2017-07-10 20:58:44 +00:00
public class IPTorrents : BaseWebIndexer
2015-05-04 04:12:14 +00:00
{
2020-04-04 20:34:19 +00:00
private string SearchUrl = > SiteLink + "t" ;
2017-10-29 06:21:18 +00:00
2020-02-08 01:47:17 +00:00
public override string [ ] AlternativeSiteLinks { get ; protected set ; } = {
2017-08-31 09:13:09 +00:00
"https://iptorrents.com/" ,
2019-02-03 05:53:09 +00:00
"https://www.iptorrents.com/" ,
2021-01-12 11:13:00 +00:00
"https://iptorrents.me/" ,
2017-08-31 09:13:09 +00:00
"https://nemo.iptorrents.com/" ,
2020-02-08 01:47:17 +00:00
"https://ipt.getcrazy.me/" ,
"https://ipt.findnemo.net/" ,
"https://ipt.beelyrics.net/" ,
"https://ipt.venom.global/" ,
"https://ipt.workisboring.net/" ,
"https://ipt.lol/" ,
"https://ipt.cool/" ,
2020-05-15 21:06:58 +00:00
"https://ipt.world/"
} ;
public override string [ ] LegacySiteLinks { get ; protected set ; } = {
"https://ipt-update.com/" ,
"http://ipt.read-books.org/" ,
"http://alien.eating-organic.net/" ,
"http://kong.net-freaks.com/" ,
"http://ghost.cable-modem.org/" ,
"http://logan.unusualperson.com/" ,
2020-09-12 22:52:50 +00:00
"https://ipt.rocks/" ,
2021-01-12 11:13:00 +00:00
"http://baywatch.workisboring.com/" ,
"https://iptorrents.eu/"
2017-08-31 09:13:09 +00:00
} ;
2015-07-22 22:00:52 +00:00
2020-04-04 20:34:19 +00:00
private new ConfigurationDataCookie configData = > ( ConfigurationDataCookie ) base . configData ;
2015-08-03 21:38:45 +00:00
2020-12-11 22:14:21 +00:00
public IPTorrents ( IIndexerConfigurationService configService , WebClient wc , Logger l , IProtectionService ps ,
ICacheService cs )
2020-05-11 19:59:28 +00:00
: base ( id : "iptorrents" ,
name : "IPTorrents" ,
2020-04-04 20:34:19 +00:00
description : "Always a step ahead." ,
link : "https://iptorrents.com/" ,
caps : new TorznabCapabilities
{
2020-10-18 20:47:36 +00:00
TvSearchParams = new List < TvSearchParam >
{
TvSearchParam . Q , TvSearchParam . Season , TvSearchParam . Ep , TvSearchParam . ImdbId
} ,
MovieSearchParams = new List < MovieSearchParam >
{
MovieSearchParam . Q , MovieSearchParam . ImdbId
2020-10-20 00:38:27 +00:00
} ,
MusicSearchParams = new List < MusicSearchParam >
{
MusicSearchParam . Q
} ,
BookSearchParams = new List < BookSearchParam >
{
BookSearchParam . Q
2020-10-18 20:47:36 +00:00
}
2020-04-04 20:34:19 +00:00
} ,
configService : configService ,
client : wc ,
logger : l ,
p : ps ,
2020-12-11 22:14:21 +00:00
cacheService : cs ,
2020-11-01 16:42:04 +00:00
configData : new ConfigurationDataCookie ( "For best results, change the 'Torrents per page' option to 100 and check the 'Torrents - Show files count' option in the website Settings." ) )
2015-05-04 04:12:14 +00:00
{
2017-11-05 09:42:03 +00:00
Encoding = Encoding . UTF8 ;
2016-12-09 17:20:58 +00:00
Language = "en-us" ;
2017-01-27 15:57:32 +00:00
Type = "private" ;
2016-12-06 13:56:47 +00:00
2021-03-16 23:29:26 +00:00
configData . AddDynamic ( "freeleech" , new BoolConfigurationItem ( "Search freeleech only" ) { Value = false } ) ;
2021-01-31 11:46:23 +00:00
2017-04-15 08:45:10 +00:00
AddCategoryMapping ( 72 , TorznabCatType . Movies , "Movies" ) ;
AddCategoryMapping ( 87 , TorznabCatType . Movies3D , "Movie/3D" ) ;
AddCategoryMapping ( 77 , TorznabCatType . MoviesSD , "Movie/480p" ) ;
2020-04-04 20:34:19 +00:00
AddCategoryMapping ( 101 , TorznabCatType . MoviesUHD , "Movie/4K" ) ;
2017-04-20 08:21:14 +00:00
AddCategoryMapping ( 89 , TorznabCatType . MoviesHD , "Movie/BD-R" ) ;
2017-04-15 08:45:10 +00:00
AddCategoryMapping ( 90 , TorznabCatType . MoviesSD , "Movie/BD-Rip" ) ;
AddCategoryMapping ( 96 , TorznabCatType . MoviesSD , "Movie/Cam" ) ;
AddCategoryMapping ( 6 , TorznabCatType . MoviesDVD , "Movie/DVD-R" ) ;
AddCategoryMapping ( 48 , TorznabCatType . MoviesBluRay , "Movie/HD/Bluray" ) ;
AddCategoryMapping ( 54 , TorznabCatType . Movies , "Movie/Kids" ) ;
AddCategoryMapping ( 62 , TorznabCatType . MoviesSD , "Movie/MP4" ) ;
AddCategoryMapping ( 38 , TorznabCatType . MoviesForeign , "Movie/Non-English" ) ;
AddCategoryMapping ( 68 , TorznabCatType . Movies , "Movie/Packs" ) ;
AddCategoryMapping ( 20 , TorznabCatType . MoviesHD , "Movie/Web-DL" ) ;
AddCategoryMapping ( 7 , TorznabCatType . MoviesSD , "Movie/Xvid" ) ;
AddCategoryMapping ( 100 , TorznabCatType . Movies , "Movie/x265" ) ;
AddCategoryMapping ( 73 , TorznabCatType . TV , "TV" ) ;
2020-11-06 03:09:57 +00:00
AddCategoryMapping ( 26 , TorznabCatType . TVDocumentary , "TV/Documentaries" ) ;
2017-04-15 08:45:10 +00:00
AddCategoryMapping ( 55 , TorznabCatType . TVSport , "Sports" ) ;
AddCategoryMapping ( 78 , TorznabCatType . TVSD , "TV/480p" ) ;
AddCategoryMapping ( 23 , TorznabCatType . TVHD , "TV/BD" ) ;
AddCategoryMapping ( 24 , TorznabCatType . TVSD , "TV/DVD-R" ) ;
AddCategoryMapping ( 25 , TorznabCatType . TVSD , "TV/DVD-Rip" ) ;
AddCategoryMapping ( 66 , TorznabCatType . TVSD , "TV/Mobile" ) ;
2020-10-28 19:00:48 +00:00
AddCategoryMapping ( 82 , TorznabCatType . TVForeign , "TV/Non-English" ) ;
2017-04-15 08:45:10 +00:00
AddCategoryMapping ( 65 , TorznabCatType . TV , "TV/Packs" ) ;
2020-10-28 19:00:48 +00:00
AddCategoryMapping ( 83 , TorznabCatType . TVForeign , "TV/Packs/Non-English" ) ;
2017-04-15 08:45:10 +00:00
AddCategoryMapping ( 79 , TorznabCatType . TVSD , "TV/SD/x264" ) ;
AddCategoryMapping ( 22 , TorznabCatType . TVWEBDL , "TV/Web-DL" ) ;
AddCategoryMapping ( 5 , TorznabCatType . TVHD , "TV/x264" ) ;
AddCategoryMapping ( 99 , TorznabCatType . TVHD , "TV/x265" ) ;
AddCategoryMapping ( 4 , TorznabCatType . TVSD , "TV/Xvid" ) ;
AddCategoryMapping ( 74 , TorznabCatType . Console , "Games" ) ;
AddCategoryMapping ( 2 , TorznabCatType . ConsoleOther , "Games/Mixed" ) ;
AddCategoryMapping ( 47 , TorznabCatType . ConsoleNDS , "Games/Nintendo DS" ) ;
AddCategoryMapping ( 43 , TorznabCatType . PCISO , "Games/PC-ISO" ) ;
AddCategoryMapping ( 45 , TorznabCatType . PCGames , "Games/PC-Rip" ) ;
AddCategoryMapping ( 71 , TorznabCatType . ConsolePS3 , "Games/PS3" ) ;
AddCategoryMapping ( 50 , TorznabCatType . ConsoleWii , "Games/Wii" ) ;
2020-10-28 19:00:48 +00:00
AddCategoryMapping ( 44 , TorznabCatType . ConsoleXBox360 , "Games/Xbox-360" ) ;
2017-04-15 08:45:10 +00:00
AddCategoryMapping ( 75 , TorznabCatType . Audio , "Music" ) ;
AddCategoryMapping ( 3 , TorznabCatType . AudioMP3 , "Music/Audio" ) ;
AddCategoryMapping ( 80 , TorznabCatType . AudioLossless , "Music/Flac" ) ;
AddCategoryMapping ( 93 , TorznabCatType . Audio , "Music/Packs" ) ;
AddCategoryMapping ( 37 , TorznabCatType . AudioVideo , "Music/Video" ) ;
AddCategoryMapping ( 21 , TorznabCatType . AudioVideo , "Podcast" ) ;
2020-11-06 03:09:57 +00:00
AddCategoryMapping ( 76 , TorznabCatType . Other , "Other/Miscellaneous" ) ;
2017-04-15 08:45:10 +00:00
AddCategoryMapping ( 60 , TorznabCatType . TVAnime , "Anime" ) ;
AddCategoryMapping ( 1 , TorznabCatType . PC0day , "Appz" ) ;
AddCategoryMapping ( 86 , TorznabCatType . PC0day , "Appz/Non-English" ) ;
AddCategoryMapping ( 64 , TorznabCatType . AudioAudiobook , "AudioBook" ) ;
AddCategoryMapping ( 35 , TorznabCatType . Books , "Books" ) ;
2020-11-06 03:09:57 +00:00
AddCategoryMapping ( 94 , TorznabCatType . BooksComics , "Books/Comics" ) ;
AddCategoryMapping ( 95 , TorznabCatType . BooksOther , "Books/Educational" ) ;
AddCategoryMapping ( 98 , TorznabCatType . Other , "Other/Fonts" ) ;
AddCategoryMapping ( 69 , TorznabCatType . PCMac , "Appz/Mac" ) ;
AddCategoryMapping ( 92 , TorznabCatType . BooksMags , "Books/Magazines & Newspapers" ) ;
AddCategoryMapping ( 58 , TorznabCatType . PCMobileOther , "Appz/Mobile" ) ;
AddCategoryMapping ( 36 , TorznabCatType . Other , "Other/Pics/Wallpapers" ) ;
2017-04-15 08:45:10 +00:00
AddCategoryMapping ( 88 , TorznabCatType . XXX , "XXX" ) ;
AddCategoryMapping ( 85 , TorznabCatType . XXXOther , "XXX/Magazines" ) ;
AddCategoryMapping ( 8 , TorznabCatType . XXX , "XXX/Movie" ) ;
AddCategoryMapping ( 81 , TorznabCatType . XXX , "XXX/Movie/0Day" ) ;
2020-10-28 19:00:48 +00:00
AddCategoryMapping ( 91 , TorznabCatType . XXXPack , "XXX/Packs" ) ;
AddCategoryMapping ( 84 , TorznabCatType . XXXImageSet , "XXX/Pics/Wallpapers" ) ;
2015-05-04 04:12:14 +00:00
}
2015-04-23 06:44:21 +00:00
2017-06-28 05:31:38 +00:00
public override async Task < IndexerConfigurationStatus > ApplyConfiguration ( JToken configJson )
2015-05-04 04:12:14 +00:00
{
2017-01-02 20:39:28 +00:00
LoadValuesFromJson ( configJson ) ;
2016-11-05 18:25:38 +00:00
2020-02-22 19:34:14 +00:00
CookieHeader = configData . Cookie . Value ;
try
2016-11-05 18:25:38 +00:00
{
2020-02-22 19:34:14 +00:00
var results = await PerformQuery ( new TorznabQuery ( ) ) ;
if ( ! results . Any ( ) )
2020-04-26 18:18:40 +00:00
throw new Exception ( "Found 0 results in the tracker" ) ;
2016-11-05 18:25:38 +00:00
2020-02-22 19:34:14 +00:00
IsConfigured = true ;
SaveConfig ( ) ;
return IndexerConfigurationStatus . Completed ;
}
catch ( Exception e )
2015-07-22 22:00:52 +00:00
{
2020-02-22 19:34:14 +00:00
IsConfigured = false ;
throw new Exception ( "Your cookie did not work: " + e . Message ) ;
}
2015-05-04 04:12:14 +00:00
}
2017-07-03 05:15:47 +00:00
protected override async Task < IEnumerable < ReleaseInfo > > PerformQuery ( TorznabQuery query )
2015-05-04 04:12:14 +00:00
{
2015-07-19 17:18:54 +00:00
var releases = new List < ReleaseInfo > ( ) ;
2015-07-29 19:30:28 +00:00
2020-04-04 20:34:19 +00:00
var qc = new NameValueCollection ( ) ;
2015-07-29 19:30:28 +00:00
2020-04-04 20:34:19 +00:00
if ( query . IsImdbQuery )
qc . Add ( "q" , query . ImdbID ) ;
else if ( ! string . IsNullOrWhiteSpace ( query . GetQueryString ( ) ) )
qc . Add ( "q" , query . GetQueryString ( ) ) ;
2015-07-29 19:30:28 +00:00
2020-04-04 20:34:19 +00:00
foreach ( var cat in MapTorznabCapsToTrackers ( query ) )
qc . Add ( cat , string . Empty ) ;
2015-08-03 21:38:45 +00:00
2021-03-16 23:29:26 +00:00
if ( ( ( BoolConfigurationItem ) configData . GetDynamic ( "freeleech" ) ) . Value )
2021-01-31 11:46:23 +00:00
qc . Add ( "free" , "on" ) ;
2020-04-04 20:34:19 +00:00
var searchUrl = SearchUrl + "?" + qc . GetQueryString ( ) ;
2020-06-11 15:09:27 +00:00
var response = await RequestWithCookiesAndRetryAsync ( searchUrl , referer : SearchUrl ) ;
2020-06-09 17:36:57 +00:00
var results = response . ContentString ;
2018-12-02 09:33:18 +00:00
2020-02-08 06:11:11 +00:00
if ( results = = null | | ! results . Contains ( "/lout.php" ) )
throw new Exception ( "The user is not logged in. It is possible that the cookie has expired or you made a mistake when copying it. Please check the settings." ) ;
2018-12-15 09:23:41 +00:00
if ( string . IsNullOrWhiteSpace ( query . ImdbID ) & & string . IsNullOrWhiteSpace ( query . SearchTerm ) & & results . Contains ( "No Torrents Found!" ) )
2018-12-02 09:33:18 +00:00
throw new Exception ( "Got No Torrents Found! Make sure your IPTorrents profile config contain proper default category settings." ) ;
2015-07-18 20:35:02 +00:00
try
{
2020-04-04 20:34:19 +00:00
var parser = new HtmlParser ( ) ;
var doc = parser . ParseDocument ( results ) ;
2015-05-04 04:12:14 +00:00
2020-04-04 20:34:19 +00:00
var rows = doc . QuerySelectorAll ( "table[id='torrents'] > tbody > tr" ) ;
2020-11-01 12:41:52 +00:00
foreach ( var row in rows )
2015-05-04 04:12:14 +00:00
{
2020-11-01 06:11:52 +00:00
var qTitleLink = row . QuerySelector ( "a.hv" ) ;
2020-04-07 14:50:04 +00:00
if ( qTitleLink = = null ) // no results
continue ;
2020-02-09 02:35:16 +00:00
// drop invalid char that seems to have cropped up in some titles. #6582
2020-04-04 20:34:19 +00:00
var title = qTitleLink . TextContent . Trim ( ) . Replace ( "\u000f" , "" ) ;
2020-11-08 02:11:27 +00:00
var details = new Uri ( SiteLink + qTitleLink . GetAttribute ( "href" ) . TrimStart ( '/' ) ) ;
2015-07-18 20:35:02 +00:00
2020-02-28 22:33:21 +00:00
var qLink = row . QuerySelector ( "a[href^=\"/download.php/\"]" ) ;
2020-04-04 20:34:19 +00:00
var link = new Uri ( SiteLink + qLink . GetAttribute ( "href" ) . TrimStart ( '/' ) ) ;
2015-07-18 20:35:02 +00:00
2020-11-01 06:11:52 +00:00
var descrSplit = row . QuerySelector ( "div.sub" ) . TextContent . Split ( '|' ) ;
2021-05-16 18:13:54 +00:00
var dateSplit = descrSplit . Last ( ) . Split ( new [ ] { " by " } , StringSplitOptions . None ) ;
2020-11-01 12:41:52 +00:00
var publishDate = DateTimeUtil . FromTimeAgo ( dateSplit . First ( ) ) ;
2020-04-04 20:34:19 +00:00
var description = descrSplit . Length > 1 ? "Tags: " + descrSplit . First ( ) . Trim ( ) : "" ;
2020-11-01 12:41:52 +00:00
description + = dateSplit . Length > 1 ? " Uploaded by: " + dateSplit . Last ( ) . Trim ( ) : "" ;
2015-07-18 20:35:02 +00:00
2020-02-28 22:33:21 +00:00
var catIcon = row . QuerySelector ( "td:nth-of-type(1) a" ) ;
2020-04-04 20:34:19 +00:00
if ( catIcon = = null )
// Torrents - Category column == Text or Code
// release.Category = MapTrackerCatDescToNewznab(row.Cq().Find("td:eq(0)").Text()); // Works for "Text" but only contains the parent category
throw new Exception ( "Please, change the 'Torrents - Category column' option to 'Icons' in the website Settings. Wait a minute (cache) and then try again." ) ;
// Torrents - Category column == Icons
var cat = MapTrackerCatToNewznab ( catIcon . GetAttribute ( "href" ) . Substring ( 1 ) ) ;
var size = ReleaseInfo . GetBytes ( row . Children [ 5 ] . TextContent ) ;
2020-11-01 16:42:04 +00:00
var colIndex = 6 ;
int? files = null ;
if ( row . Children . Length = = 10 ) // files column is enabled in the site settings
{
files = ParseUtil . CoerceInt ( row . Children [ colIndex ] . TextContent . Replace ( "Go to files" , "" ) ) ;
colIndex + + ;
}
var grabs = ParseUtil . CoerceInt ( row . Children [ colIndex + + ] . TextContent ) ;
var seeders = ParseUtil . CoerceInt ( row . Children [ colIndex + + ] . TextContent ) ;
var leechers = ParseUtil . CoerceInt ( row . Children [ colIndex ] . TextContent ) ;
2020-11-01 06:11:52 +00:00
var dlVolumeFactor = row . QuerySelector ( "span.free" ) ! = null ? 0 : 1 ;
2020-04-04 20:34:19 +00:00
var release = new ReleaseInfo
{
Title = title ,
2020-11-08 02:11:27 +00:00
Details = details ,
Guid = details ,
2020-04-04 20:34:19 +00:00
Link = link ,
PublishDate = publishDate ,
Category = cat ,
Description = description ,
Size = size ,
2020-11-01 16:42:04 +00:00
Files = files ,
2020-04-04 20:34:19 +00:00
Grabs = grabs ,
Seeders = seeders ,
Peers = seeders + leechers ,
DownloadVolumeFactor = dlVolumeFactor ,
UploadVolumeFactor = 1 ,
MinimumRatio = 1 ,
MinimumSeedTime = 1209600 // 336 hours
} ;
2016-10-27 07:35:31 +00:00
2015-07-18 20:35:02 +00:00
releases . Add ( release ) ;
2015-05-04 04:12:14 +00:00
}
2015-07-18 20:35:02 +00:00
}
catch ( Exception ex )
{
2015-07-19 17:18:54 +00:00
OnParseError ( results , ex ) ;
2015-05-04 04:12:14 +00:00
}
2015-07-28 23:10:04 +00:00
return releases ;
2015-05-04 04:12:14 +00:00
}
}
2015-04-16 01:16:16 +00:00
}