@ -1,16 +1,14 @@
using System ;
using System.Collections.Generic ;
using System.Collections.Specialized ;
using System.Globalization ;
using System.Linq ;
using System.Net ;
using System.Net.Http ;
using System.Threading.Tasks ;
using AngleSharp.Html.Parser ;
using FluentValidation ;
using NLog ;
using NzbDrone.Common.Extensions ;
using NzbDrone.Common.Http ;
using NzbDrone.Core.Annotations ;
using NzbDrone.Core.Configuration ;
using NzbDrone.Core.Indexers.Exceptions ;
using NzbDrone.Core.Indexers.Settings ;
@ -18,21 +16,18 @@ using NzbDrone.Core.IndexerSearch.Definitions;
using NzbDrone.Core.Messaging.Events ;
using NzbDrone.Core.Parser ;
using NzbDrone.Core.Parser.Model ;
using NzbDrone.Core.ThingiProvider ;
using NzbDrone.Core.Validation ;
namespace NzbDrone.Core.Indexers.Definitions
{
public class ImmortalSeed : TorrentIndexerBase < UserPassTorrentBaseSettings >
{
public override string Name = > "ImmortalSeed" ;
public override string [ ] IndexerUrls = > new string [ ] { "https://immortalseed.me/" } ;
public override string [ ] IndexerUrls = > new [ ] { "https://immortalseed.me/" } ;
public override string Description = > "ImmortalSeed (iS) is a Private Torrent Tracker for MOVIES / TV / GENERAL" ;
private string LoginUrl = > Settings . BaseUrl + "takelogin.php" ;
public override DownloadProtocol Protocol = > DownloadProtocol . Torrent ;
public override IndexerPrivacy Privacy = > IndexerPrivacy . Private ;
public override IndexerCapabilities Capabilities = > SetCapabilities ( ) ;
private string LoginUrl = > Settings . BaseUrl + "takelogin.php" ;
public ImmortalSeed ( IIndexerHttpClient httpClient , IEventAggregator eventAggregator , IIndexerStatusService indexerStatusService , IConfigService configService , Logger logger )
: base ( httpClient , eventAggregator , indexerStatusService , configService , logger )
@ -41,7 +36,7 @@ namespace NzbDrone.Core.Indexers.Definitions
public override IIndexerRequestGenerator GetRequestGenerator ( )
{
return new ImmortalSeedRequestGenerator ( ) { Settings = Settings , Capabilities = Capabilities } ;
return new ImmortalSeedRequestGenerator { Settings = Settings , Capabilities = Capabilities } ;
}
public override IParseIndexerResponse GetParser ( )
@ -53,7 +48,8 @@ namespace NzbDrone.Core.Indexers.Definitions
{
var requestBuilder = new HttpRequestBuilder ( LoginUrl )
{
LogResponseContent = true
LogResponseContent = true ,
AllowAutoRedirect = true
} ;
requestBuilder . Method = HttpMethod . Post ;
@ -65,12 +61,12 @@ namespace NzbDrone.Core.Indexers.Definitions
var authLoginRequest = requestBuilder
. AddFormParameter ( "username" , Settings . Username )
. AddFormParameter ( "password" , Settings . Password )
. SetHeader ( "Content-Type" , " multipart/form-data ")
. SetHeader ( "Content-Type" , " application/x-www-form-urlencoded ")
. Build ( ) ;
var response = await ExecuteAuth ( authLoginRequest ) ;
if ( ! response . Content . Contains ( " You have successfully logged in ") )
if ( ! response . Content . Contains ( " logout.php ") )
{
throw new IndexerAuthException ( "ImmortalSeed Auth Failed" ) ;
}
@ -83,12 +79,7 @@ namespace NzbDrone.Core.Indexers.Definitions
protected override bool CheckIfLoginNeeded ( HttpResponse httpResponse )
{
if ( httpResponse . Content . Contains ( "You do not have permission to access this page." ) )
{
return true ;
}
return false ;
return httpResponse . Content . Contains ( "You do not have permission to access this page." ) ;
}
private IndexerCapabilities SetCapabilities ( )
@ -96,21 +87,21 @@ namespace NzbDrone.Core.Indexers.Definitions
var caps = new IndexerCapabilities
{
TvSearchParams = new List < TvSearchParam >
{
TvSearchParam . Q , TvSearchParam . Season , TvSearchParam . Ep
} ,
{
TvSearchParam . Q , TvSearchParam . Season , TvSearchParam . Ep
} ,
MovieSearchParams = new List < MovieSearchParam >
{
MovieSearchParam . Q
} ,
{
MovieSearchParam . Q
} ,
MusicSearchParams = new List < MusicSearchParam >
{
MusicSearchParam . Q
} ,
{
MusicSearchParam . Q
} ,
BookSearchParams = new List < BookSearchParam >
{
BookSearchParam . Q
}
{
BookSearchParam . Q
}
} ;
caps . Categories . AddCategoryMapping ( 3 , NewznabStandardCategory . Other , "Nuked" ) ;
@ -119,42 +110,45 @@ namespace NzbDrone.Core.Indexers.Definitions
caps . Categories . AddCategoryMapping ( 35 , NewznabStandardCategory . AudioAudiobook , "Audiobooks" ) ;
caps . Categories . AddCategoryMapping ( 31 , NewznabStandardCategory . TV , "Childrens/Cartoons" ) ;
caps . Categories . AddCategoryMapping ( 54 , NewznabStandardCategory . TVDocumentary , "Documentary - HD" ) ;
caps . Categories . AddCategoryMapping ( 41 , NewznabStandardCategory . BooksComics , "Comics" ) ;
caps . Categories . AddCategoryMapping ( 53 , NewznabStandardCategory . TVDocumentary , "Documentary - SD" ) ;
caps . Categories . AddCategoryMapping ( 22 , NewznabStandardCategory . BooksEBook , "Ebooks" ) ;
caps . Categories . AddCategoryMapping ( 41 , NewznabStandardCategory . BooksComics , "Ebooks -- Comics" ) ;
caps . Categories . AddCategoryMapping ( 46 , NewznabStandardCategory . BooksMags , "Ebooks -- Magazines" ) ;
caps . Categories . AddCategoryMapping ( 25 , NewznabStandardCategory . PCGames , "Games" ) ;
caps . Categories . AddCategoryMapping ( 29 , NewznabStandardCategory . ConsoleXBox , "Games Xbox" ) ;
caps . Categories . AddCategoryMapping ( 27 , NewznabStandardCategory . PCGames , "Games-PC Rips" ) ;
caps . Categories . AddCategoryMapping ( 28 , NewznabStandardCategory . ConsolePS4 , "Games-PSx" ) ;
caps . Categories . AddCategoryMapping ( 61 , NewznabStandardCategory . ConsoleNDS , "Games -- Nintendo" ) ;
caps . Categories . AddCategoryMapping ( 26 , NewznabStandardCategory . PCGames , "Games -- PC" ) ;
caps . Categories . AddCategoryMapping ( 28 , NewznabStandardCategory . ConsolePS3 , "Games -- Playstation" ) ;
caps . Categories . AddCategoryMapping ( 29 , NewznabStandardCategory . ConsoleXBox , "Games -- Xbox" ) ;
caps . Categories . AddCategoryMapping ( 49 , NewznabStandardCategory . PCMobileOther , "Mobile" ) ;
caps . Categories . AddCategoryMapping ( 51 , NewznabStandardCategory . PCMobileAndroid , "Mobile -- Android" ) ;
caps . Categories . AddCategoryMapping ( 50 , NewznabStandardCategory . PCMobileiOS , "Mobile -- IOS" ) ;
caps . Categories . AddCategoryMapping ( 52 , NewznabStandardCategory . PCMobileOther , "Mobile -- Windows" ) ;
caps . Categories . AddCategoryMapping ( 59 , NewznabStandardCategory . MoviesUHD , "Movies-4k" ) ;
caps . Categories . AddCategoryMapping ( 60 , NewznabStandardCategory . MoviesForeign , "Non-English 4k Movies" ) ;
caps . Categories . AddCategoryMapping ( 16 , NewznabStandardCategory . MoviesHD , "Movies HD" ) ;
caps . Categories . AddCategoryMapping ( 18 , NewznabStandardCategory . MoviesForeign , "Movies HD Non-English" ) ;
caps . Categories . AddCategoryMapping ( 17 , NewznabStandardCategory . MoviesSD , "TS/CAM/PPV" ) ;
caps . Categories . AddCategoryMapping ( 34 , NewznabStandardCategory . MoviesForeign , "Movies Low Def Non-English" ) ;
caps . Categories . AddCategoryMapping ( 60 , NewznabStandardCategory . MoviesForeign , "Movies-4k -- Non-English" ) ;
caps . Categories . AddCategoryMapping ( 16 , NewznabStandardCategory . MoviesHD , "Movies-HD" ) ;
caps . Categories . AddCategoryMapping ( 18 , NewznabStandardCategory . MoviesForeign , "Movies-HD -- Non-English" ) ;
caps . Categories . AddCategoryMapping ( 17 , NewznabStandardCategory . MoviesSD , "Movies-Low Def" ) ;
caps . Categories . AddCategoryMapping ( 34 , NewznabStandardCategory . MoviesForeign , "Movies-Low Def -- Non-English" ) ;
caps . Categories . AddCategoryMapping ( 62 , NewznabStandardCategory . Movies , "Movies-Packs" ) ;
caps . Categories . AddCategoryMapping ( 14 , NewznabStandardCategory . MoviesSD , "Movies-SD" ) ;
caps . Categories . AddCategoryMapping ( 33 , NewznabStandardCategory . MoviesForeign , "Movies SD Non-English") ;
caps . Categories . AddCategoryMapping ( 33 , NewznabStandardCategory . MoviesForeign , "Movies -SD -- Non-English") ;
caps . Categories . AddCategoryMapping ( 30 , NewznabStandardCategory . AudioOther , "Music" ) ;
caps . Categories . AddCategoryMapping ( 37 , NewznabStandardCategory . AudioLossless , " FLAC") ;
caps . Categories . AddCategoryMapping ( 36 , NewznabStandardCategory . AudioMP3 , "M P3") ;
caps . Categories . AddCategoryMapping ( 39 , NewznabStandardCategory . AudioOther , "Music Other") ;
caps . Categories . AddCategoryMapping ( 38 , NewznabStandardCategory . AudioVideo , "Music Video") ;
caps . Categories . AddCategoryMapping ( 37 , NewznabStandardCategory . AudioLossless , " Music -- FLAC") ;
caps . Categories . AddCategoryMapping ( 36 , NewznabStandardCategory . AudioMP3 , "M usic -- M P3") ;
caps . Categories . AddCategoryMapping ( 39 , NewznabStandardCategory . AudioOther , "Music -- Other") ;
caps . Categories . AddCategoryMapping ( 38 , NewznabStandardCategory . AudioVideo , "Music -- Video") ;
caps . Categories . AddCategoryMapping ( 45 , NewznabStandardCategory . Other , "Other" ) ;
caps . Categories . AddCategoryMapping ( 7 , NewznabStandardCategory . TVSport , "Sports Tv" ) ;
caps . Categories . AddCategoryMapping ( 44 , NewznabStandardCategory . TVSport , "Sports Fitness-Instructional") ;
caps . Categories . AddCategoryMapping ( 58 , NewznabStandardCategory . TVSport , " Olympics") ;
caps . Categories . AddCategoryMapping ( 44 , NewznabStandardCategory . TVSport , "Sports Tv -- Fitness-Instructional") ;
caps . Categories . AddCategoryMapping ( 58 , NewznabStandardCategory . TVSport , " Sports Tv -- Olympics") ;
caps . Categories . AddCategoryMapping ( 47 , NewznabStandardCategory . TVSD , "TV - 480p" ) ;
caps . Categories . AddCategoryMapping ( 64 , NewznabStandardCategory . TVUHD , "TV - 4K" ) ;
caps . Categories . AddCategoryMapping ( 8 , NewznabStandardCategory . TVHD , "TV - High Definition" ) ;
caps . Categories . AddCategoryMapping ( 48 , NewznabStandardCategory . TVSD , "TV - Standard Definition - x264" ) ;
caps . Categories . AddCategoryMapping ( 9 , NewznabStandardCategory . TVSD , "TV - Standard Definition - XviD" ) ;
caps . Categories . AddCategoryMapping ( 48 , NewznabStandardCategory . TVSD , "TV SD - x264" ) ;
caps . Categories . AddCategoryMapping ( 9 , NewznabStandardCategory . TVSD , "TV SD - XviD" ) ;
caps . Categories . AddCategoryMapping ( 63 , NewznabStandardCategory . TVUHD , "TV Season Packs - 4K" ) ;
caps . Categories . AddCategoryMapping ( 4 , NewznabStandardCategory . TVHD , "TV Season Packs - HD" ) ;
caps . Categories . AddCategoryMapping ( 6 , NewznabStandardCategory . TVSD , "TV Season Packs - SD" ) ;
caps . Categories . AddCategoryMapping ( 22 , NewznabStandardCategory . BooksEBook , "Ebooks" ) ;
caps . Categories . AddCategoryMapping ( 26 , NewznabStandardCategory . PCGames , "Games-PC ISO" ) ;
caps . Categories . AddCategoryMapping ( 46 , NewznabStandardCategory . BooksMags , "Magazines" ) ;
caps . Categories . AddCategoryMapping ( 50 , NewznabStandardCategory . PCMobileiOS , "IOS" ) ;
caps . Categories . AddCategoryMapping ( 51 , NewznabStandardCategory . PCMobileAndroid , "Android" ) ;
caps . Categories . AddCategoryMapping ( 52 , NewznabStandardCategory . PC0day , "Windows" ) ;
caps . Categories . AddCategoryMapping ( 53 , NewznabStandardCategory . TVDocumentary , "Documentary - SD" ) ;
return caps ;
}
@ -165,27 +159,33 @@ namespace NzbDrone.Core.Indexers.Definitions
public UserPassTorrentBaseSettings Settings { get ; set ; }
public IndexerCapabilities Capabilities { get ; set ; }
p ublic ImmortalSeedRequestGenerator ( )
p rivate IEnumerable < IndexerRequest > GetPagedRequests ( SearchCriteriaBase searchCriteria )
{
}
var parameters = new NameValueCollection ( ) ;
private IEnumerable < IndexerRequest > GetPagedRequests ( string term , int [ ] categories , string imdbId = null )
{
var searchUrl = Settings . BaseUrl + "browse.php?" ;
var term = searchCriteria . SanitizedSearchTerm ;
if ( term . IsNotNullOrWhiteSpace ( ) )
{
searchUrl + = string . Format ( "do=search&keywords={0}&search_type=t_name&category=0&include_dead_torrents=no" , WebUtility . UrlEncode ( term ) ) ;
parameters . Add ( "do" , "search" ) ;
parameters . Add ( "keywords" , term . Trim ( ) ) ;
parameters . Add ( "search_type" , "t_name" ) ;
parameters . Add ( "category" , "0" ) ;
parameters . Add ( "include_dead_torrents" , "no" ) ;
}
if ( categories ! = null & & categories . Length > 0 )
var queryCats = Capabilities . Categories . MapTorznabCapsToTrackers ( searchCriteria . Categories ) ;
if ( queryCats . Count > 0 )
{
if ( term . IsNotNullOrWhiteSpace ( ) )
{
searchUrl + = "&" ;
}
parameters . Add ( "selectedcats2" , string . Join ( "," , queryCats ) ) ;
}
searchUrl + = "selectedcats2=" + string . Join ( "," , Capabilities . Categories . MapTorznabCapsToTrackers ( categories ) ) ;
var searchUrl = Settings . BaseUrl + "browse.php" ;
if ( parameters . Count > 0 )
{
searchUrl + = $"?{parameters.GetQueryString()}" ;
}
var request = new IndexerRequest ( searchUrl , HttpAccept . Html ) ;
@ -196,8 +196,7 @@ namespace NzbDrone.Core.Indexers.Definitions
public IndexerPageableRequestChain GetSearchRequests ( MovieSearchCriteria searchCriteria )
{
var pageableRequests = new IndexerPageableRequestChain ( ) ;
pageableRequests . Add ( GetPagedRequests ( string . Format ( "{0}" , searchCriteria . SanitizedSearchTerm ) , searchCriteria . Categories , searchCriteria . FullImdbId ) ) ;
pageableRequests . Add ( GetPagedRequests ( searchCriteria ) ) ;
return pageableRequests ;
}
@ -205,8 +204,7 @@ namespace NzbDrone.Core.Indexers.Definitions
public IndexerPageableRequestChain GetSearchRequests ( MusicSearchCriteria searchCriteria )
{
var pageableRequests = new IndexerPageableRequestChain ( ) ;
pageableRequests . Add ( GetPagedRequests ( string . Format ( "{0}" , searchCriteria . SanitizedSearchTerm ) , searchCriteria . Categories ) ) ;
pageableRequests . Add ( GetPagedRequests ( searchCriteria ) ) ;
return pageableRequests ;
}
@ -214,8 +212,7 @@ namespace NzbDrone.Core.Indexers.Definitions
public IndexerPageableRequestChain GetSearchRequests ( TvSearchCriteria searchCriteria )
{
var pageableRequests = new IndexerPageableRequestChain ( ) ;
pageableRequests . Add ( GetPagedRequests ( string . Format ( "{0}" , searchCriteria . SanitizedTvSearchString ) , searchCriteria . Categories , searchCriteria . FullImdbId ) ) ;
pageableRequests . Add ( GetPagedRequests ( searchCriteria ) ) ;
return pageableRequests ;
}
@ -223,8 +220,7 @@ namespace NzbDrone.Core.Indexers.Definitions
public IndexerPageableRequestChain GetSearchRequests ( BookSearchCriteria searchCriteria )
{
var pageableRequests = new IndexerPageableRequestChain ( ) ;
pageableRequests . Add ( GetPagedRequests ( string . Format ( "{0}" , searchCriteria . SanitizedSearchTerm ) , searchCriteria . Categories ) ) ;
pageableRequests . Add ( GetPagedRequests ( searchCriteria ) ) ;
return pageableRequests ;
}
@ -232,8 +228,7 @@ namespace NzbDrone.Core.Indexers.Definitions
public IndexerPageableRequestChain GetSearchRequests ( BasicSearchCriteria searchCriteria )
{
var pageableRequests = new IndexerPageableRequestChain ( ) ;
pageableRequests . Add ( GetPagedRequests ( string . Format ( "{0}" , searchCriteria . SanitizedSearchTerm ) , searchCriteria . Categories ) ) ;
pageableRequests . Add ( GetPagedRequests ( searchCriteria ) ) ;
return pageableRequests ;
}