@ -165,196 +165,188 @@ namespace NzbDrone.Core.Indexers.Cardigann
}
else
{
try
IHtmlCollection < IElement > rowsDom ;
if ( request . SearchPath . Response ! = null & & request . SearchPath . Response . Type . Equals ( "xml" ) )
{
IHtmlCollection < IElement > rowsDom ;
var searchResultParser = new XmlParser ( ) ;
var searchResultDocument = searchResultParser . ParseDocument ( results ) ;
if ( request. SearchPath . Response ! = null & & request . SearchPath . Response . Type . Equals ( "xml" ) )
if ( search. Preprocessingfilters ! = null )
{
var searchResultParser = new XmlParser ( ) ;
var searchResultDocument = searchResultParser . ParseDocument ( results ) ;
if ( search . Preprocessingfilters ! = null )
{
results = ApplyFilters ( results , search . Preprocessingfilters , variables ) ;
searchResultDocument = searchResultParser . ParseDocument ( results ) ;
_logger . Trace ( string . Format ( "CardigannIndexer ({0}): result after preprocessingfilters: {1}" , _definition . Id , results ) ) ;
}
var rowsSelector = ApplyGoTemplateText ( search . Rows . Selector , variables ) ;
rowsDom = searchResultDocument . QuerySelectorAll ( rowsSelector ) ;
results = ApplyFilters ( results , search . Preprocessingfilters , variables ) ;
searchResultDocument = searchResultParser . ParseDocument ( results ) ;
_logger . Trace ( string . Format ( "CardigannIndexer ({0}): result after preprocessingfilters: {1}" , _definition . Id , results ) ) ;
}
else
{
var searchResultParser = new HtmlParser ( ) ;
var searchResultDocument = searchResultParser . ParseDocument ( results ) ;
if ( search . Preprocessingfilters ! = null )
{
results = ApplyFilters ( results , search . Preprocessingfilters , variables ) ;
searchResultDocument = searchResultParser . ParseDocument ( results ) ;
_logger . Trace ( string . Format ( "CardigannIndexer ({0}): result after preprocessingfilters: {1}" , _definition . Id , results ) ) ;
}
var rowsSelector = ApplyGoTemplateText ( search . Rows . Selector , variables ) ;
rowsDom = searchResultDocument . QuerySelectorAll ( rowsSelector ) ;
}
var rowsSelector = ApplyGoTemplateText ( search . Rows . Selector , variables ) ;
rowsDom = searchResultDocument . QuerySelectorAll ( rowsSelector ) ;
}
else
{
var searchResultParser = new HtmlParser ( ) ;
var searchResultDocument = searchResultParser . ParseDocument ( results ) ;
var rows = new List < IElement > ( ) ;
foreach ( var rowDom in rowsDom )
if ( search . Preprocessingfilters ! = null )
{
rows . Add ( rowDom ) ;
results = ApplyFilters ( results , search . Preprocessingfilters , variables ) ;
searchResultDocument = searchResultParser . ParseDocument ( results ) ;
_logger . Trace ( string . Format ( "CardigannIndexer ({0}): result after preprocessingfilters: {1}" , _definition . Id , results ) ) ;
}
// merge following rows for After selector
var after = search . Rows . After ;
if ( after > 0 )
var rowsSelector = ApplyGoTemplateText ( search . Rows . Selector , variables ) ;
rowsDom = searchResultDocument . QuerySelectorAll ( rowsSelector ) ;
}
var rows = new List < IElement > ( ) ;
foreach ( var rowDom in rowsDom )
{
rows . Add ( rowDom ) ;
}
// merge following rows for After selector
var after = search . Rows . After ;
if ( after > 0 )
{
for ( var i = 0 ; i < rows . Count ; i + = 1 )
{
for ( var i = 0 ; i < rows . Count ; i + = 1 )
var currentRow = rows [ i ] ;
for ( var j = 0 ; j < after ; j + = 1 )
{
var currentRow = rows [ i ] ;
for ( var j = 0 ; j < after ; j + = 1 )
var mergeRowIndex = i + j + 1 ;
var mergeRow = rows [ mergeRowIndex ] ;
var mergeNodes = new List < INode > ( ) ;
foreach ( var node in mergeRow . ChildNodes )
{
var mergeRowIndex = i + j + 1 ;
var mergeRow = rows [ mergeRowIndex ] ;
var mergeNodes = new List < INode > ( ) ;
foreach ( var node in mergeRow . ChildNodes )
{
mergeNodes . Add ( node ) ;
}
currentRow . Append ( mergeNodes . ToArray ( ) ) ;
mergeNodes . Add ( node ) ;
}
rows. RemoveRange ( i + 1 , after ) ;
currentRow . Append ( mergeNodes . ToArray ( ) ) ;
}
rows . RemoveRange ( i + 1 , after ) ;
}
}
foreach ( var row in rows )
foreach ( var row in rows )
{
try
{
try
var release = new TorrentInfo ( ) ;
// Parse fields
foreach ( var field in search . Fields )
{
var release = new TorrentInfo ( ) ;
var fieldParts = field . Key . Split ( '|' ) ;
var fieldName = fieldParts [ 0 ] ;
var fieldModifiers = new List < string > ( ) ;
for ( var i = 1 ; i < fieldParts . Length ; i + + )
{
fieldModifiers . Add ( fieldParts [ i ] ) ;
}
// Parse fields
foreach ( var field in search . Fields )
string value = null ;
var variablesKey = ".Result." + fieldName ;
var isOptional = OptionalFields . Contains ( field . Key ) | | fieldModifiers . Contains ( "optional" ) | | field . Value . Optional ;
try
{
var fieldParts = field . Key . Split ( '|' ) ;
var fieldName = fieldParts [ 0 ] ;
var fieldModifiers = new List < string > ( ) ;
for ( var i = 1 ; i < fieldParts . Length ; i + + )
value = HandleSelector ( field . Value , row , variables , ! isOptional ) ;
if ( isOptional & & string . IsNullOrWhiteSpace ( value ) )
{
fieldModifiers . Add ( fieldParts [ i ] ) ;
variables [ variablesKey ] = null ;
continue ;
}
string value = null ;
var variablesKey = ".Result." + fieldName ;
var isOptional = OptionalFields . Contains ( field . Key ) | | fieldModifiers . Contains ( "optional" ) | | field . Value . Optional ;
try
variables [ variablesKey ] = ParseFields ( value , fieldName , release , fieldModifiers , searchUrlUri ) ;
}
catch ( Exception ex )
{
if ( ! variables . ContainsKey ( variablesKey ) )
{
value = HandleSelector ( field . Value , row , variables , ! isOptional ) ;
if ( isOptional & & string . IsNullOrWhiteSpace ( value ) )
{
variables [ variablesKey ] = null ;
continue ;
}
variables [ variablesKey ] = ParseFields ( value , fieldName , release , fieldModifiers , searchUrlUri ) ;
variables [ variablesKey ] = null ;
}
catch ( Exception ex )
{
if ( ! variables . ContainsKey ( variablesKey ) )
{
variables [ variablesKey ] = null ;
}
if ( OptionalFields . Contains ( field . Key ) | | fieldModifiers . Contains ( "optional" ) | | field . Value . Optional )
{
variables [ variablesKey ] = null ;
continue ;
}
if ( OptionalFields . Contains ( field . Key ) | | fieldModifiers . Contains ( "optional" ) | | field . Value . Optional )
{
variables [ variablesKey ] = null ;
continue ;
}
if ( indexerLogging )
{
_logger . Trace ( "Error while parsing field={0}, selector={1}, value={2}: {3}" , field . Key , field . Value . Selector , value = = null ? "<null>" : value , ex . Message ) ;
}
if ( indexerLogging )
{
_logger . Trace ( "Error while parsing field={0}, selector={1}, value={2}: {3}" , field . Key , field . Value . Selector , value = = null ? "<null>" : value , ex . Message ) ;
}
}
}
var filters = search . Rows . Filters ;
var skipRelease = ParseRowFilters ( filters , release , variables , row . ToHtmlPretty ( ) ) ;
var filters = search . Rows . Filters ;
var skipRelease = ParseRowFilters ( filters , release , variables , row . ToHtmlPretty ( ) ) ;
if ( skipRelease )
{
continue ;
}
if ( skipRelease )
// if DateHeaders is set go through the previous rows and look for the header selector
var dateHeaders = _definition . Search . Rows . Dateheaders ;
if ( release . PublishDate = = DateTime . MinValue & & dateHeaders ! = null )
{
var prevRow = row . PreviousElementSibling ;
string value = null ;
if ( prevRow = = null )
{
continue ;
// continue with parent
var parent = row . ParentElement ;
if ( parent ! = null )
{
prevRow = parent . PreviousElementSibling ;
}
}
// if DateHeaders is set go through the previous rows and look for the header selector
var dateHeaders = _definition . Search . Rows . Dateheaders ;
if ( release . PublishDate = = DateTime . MinValue & & dateHeaders ! = null )
while ( prevRow ! = null )
{
var prevRow = row . PreviousElementSibling ;
string value = null ;
var curRow = prevRow ;
_logger . Debug ( prevRow . OuterHtml ) ;
try
{
value = HandleSelector ( dateHeaders , curRow ) ;
break ;
}
catch ( Exception )
{
// do nothing
}
prevRow = curRow . PreviousElementSibling ;
if ( prevRow = = null )
{
// continue with parent
var parent = row . ParentElement ;
var parent = cu rR ow. ParentElement ;
if ( parent ! = null )
{
prevRow = parent . PreviousElementSibling ;
}
}
}
while ( prevRow ! = null )
{
var curRow = prevRow ;
_logger . Debug ( prevRow . OuterHtml ) ;
try
{
value = HandleSelector ( dateHeaders , curRow ) ;
break ;
}
catch ( Exception )
{
// do nothing
}
prevRow = curRow . PreviousElementSibling ;
if ( prevRow = = null )
{
// continue with parent
var parent = curRow . ParentElement ;
if ( parent ! = null )
{
prevRow = parent . PreviousElementSibling ;
}
}
}
if ( value = = null & & dateHeaders . Optional = = false )
{
throw new CardigannException ( string . Format ( "No date header row found for {0}" , release . ToString ( ) ) ) ;
}
if ( value ! = null )
{
release . PublishDate = DateTimeUtil . FromUnknown ( value ) ;
}
if ( value = = null & & dateHeaders . Optional = = false )
{
throw new CardigannException ( string . Format ( "No date header row found for {0}" , release . ToString ( ) ) ) ;
}
releases . Add ( release ) ;
}
catch ( Exception ex )
{
_logger . Error ( ex , "CardigannIndexer ({0}): Error while parsing row '{1}':\n\n{2}" , _definition . Id , row . ToHtmlPretty ( ) ) ;
if ( value ! = null )
{
release . PublishDate = DateTimeUtil . FromUnknown ( value ) ;
}
}
releases . Add ( release ) ;
}
catch ( Exception ex )
{
_logger . Error ( ex , "CardigannIndexer ({0}): Error while parsing row '{1}':\n\n{2}" , _definition . Id , row . ToHtmlPretty ( ) ) ;
}
}
catch ( Exception )
{
// OnParseError(results, ex);
throw ;
}
}
@ -425,11 +417,7 @@ namespace NzbDrone.Core.Indexers.Cardigann
break ;
case "comments" :
var commentsUrl = ResolvePath ( value , searchUrlUri ) ;
if ( release . CommentUrl = = null )
{
release . CommentUrl = commentsUrl . AbsoluteUri ;
}
release . CommentUrl ? ? = commentsUrl . AbsoluteUri ;
value = commentsUrl . ToString ( ) ;
break ;
case "title" :
@ -554,38 +542,38 @@ namespace NzbDrone.Core.Indexers.Cardigann
value = release . ImdbId . ToString ( ) ;
break ;
case "tmdbid" :
var tmdbI DRegE x = new Regex ( @"(\d+)" , RegexOptions . Compiled ) ;
var tmdbI DMatch = tmdbIDRegE x. Match ( value ) ;
var tmdbI D = tmdbID Match. Groups [ 1 ] . Value ;
release . TmdbId = ( int ) ParseUtil . CoerceLong ( tmdbI D ) ;
var tmdbI dRege x = new Regex ( @"(\d+)" , RegexOptions . Compiled ) ;
var tmdbI dMatch = tmdbIdRege x. Match ( value ) ;
var tmdbI d = tmdbId Match. Groups [ 1 ] . Value ;
release . TmdbId = ( int ) ParseUtil . CoerceLong ( tmdbI d ) ;
value = release . TmdbId . ToString ( ) ;
break ;
case "rageid" :
var rageI DRegE x = new Regex ( @"(\d+)" , RegexOptions . Compiled ) ;
var rageI DMatch = rageIDRegE x. Match ( value ) ;
var rageI D = rageID Match. Groups [ 1 ] . Value ;
release . TvRageId = ( int ) ParseUtil . CoerceLong ( rageI D ) ;
var rageI dRege x = new Regex ( @"(\d+)" , RegexOptions . Compiled ) ;
var rageI dMatch = rageIdRege x. Match ( value ) ;
var rageI d = rageId Match. Groups [ 1 ] . Value ;
release . TvRageId = ( int ) ParseUtil . CoerceLong ( rageI d ) ;
value = release . TvRageId . ToString ( ) ;
break ;
case "traktid" :
var traktI DRegE x = new Regex ( @"(\d+)" , RegexOptions . Compiled ) ;
var traktI DMatch = traktIDRegE x. Match ( value ) ;
var traktI D = traktID Match. Groups [ 1 ] . Value ;
release . TraktId = ( int ) ParseUtil . CoerceLong ( traktI D ) ;
var traktI dRege x = new Regex ( @"(\d+)" , RegexOptions . Compiled ) ;
var traktI dMatch = traktIdRege x. Match ( value ) ;
var traktI d = traktId Match. Groups [ 1 ] . Value ;
release . TraktId = ( int ) ParseUtil . CoerceLong ( traktI d ) ;
value = release . TraktId . ToString ( ) ;
break ;
case "tvdbid" :
var tvdbIdReg E x = new Regex ( @"(\d+)" , RegexOptions . Compiled ) ;
var tvdbIdMatch = tvdbIdReg E x. Match ( value ) ;
var tvdbIdReg e x = new Regex ( @"(\d+)" , RegexOptions . Compiled ) ;
var tvdbIdMatch = tvdbIdReg e x. Match ( value ) ;
var tvdbId = tvdbIdMatch . Groups [ 1 ] . Value ;
release . TvdbId = ( int ) ParseUtil . CoerceLong ( tvdbId ) ;
value = release . TvdbId . ToString ( ) ;
break ;
case "doubanid" :
var doubanI DRegE x = new Regex ( @"(\d+)" , RegexOptions . Compiled ) ;
var doubanI DMatch = doubanIDRegE x. Match ( value ) ;
var doubanI D = doubanID Match. Groups [ 1 ] . Value ;
release . DoubanId = ( int ) ParseUtil . CoerceLong ( doubanI D ) ;
var doubanI dRege x = new Regex ( @"(\d+)" , RegexOptions . Compiled ) ;
var doubanI dMatch = doubanIdRege x. Match ( value ) ;
var doubanI d = doubanId Match. Groups [ 1 ] . Value ;
release . DoubanId = ( int ) ParseUtil . CoerceLong ( doubanI d ) ;
value = release . DoubanId . ToString ( ) ;
break ;
case "poster" :