2020-01-03 12:49:24 +00:00
using System ;
2018-02-06 23:08:36 +00:00
using System.Collections.Generic ;
using System.Linq ;
using System.Threading.Tasks ;
using NLog ;
2023-08-22 03:02:16 +00:00
using NzbDrone.Common.TPL ;
2020-01-03 12:49:24 +00:00
using NzbDrone.Core.Parser.Model ;
2018-02-06 23:08:36 +00:00
namespace NzbDrone.Core.ImportLists
{
public interface IFetchAndParseImportList
{
List < ImportListItemInfo > Fetch ( ) ;
2018-05-10 23:06:02 +00:00
List < ImportListItemInfo > FetchSingleList ( ImportListDefinition definition ) ;
2018-02-06 23:08:36 +00:00
}
public class FetchAndParseImportListService : IFetchAndParseImportList
{
private readonly IImportListFactory _importListFactory ;
2022-12-08 03:09:42 +00:00
private readonly IImportListStatusService _importListStatusService ;
2018-02-06 23:08:36 +00:00
private readonly Logger _logger ;
2022-12-08 03:09:42 +00:00
public FetchAndParseImportListService ( IImportListFactory importListFactory , IImportListStatusService importListStatusService , Logger logger )
2018-02-06 23:08:36 +00:00
{
_importListFactory = importListFactory ;
2022-12-08 03:09:42 +00:00
_importListStatusService = importListStatusService ;
2018-02-06 23:08:36 +00:00
_logger = logger ;
}
public List < ImportListItemInfo > Fetch ( )
{
var result = new List < ImportListItemInfo > ( ) ;
var importLists = _importListFactory . AutomaticAddEnabled ( ) ;
if ( ! importLists . Any ( ) )
{
2020-11-23 09:35:07 +00:00
_logger . Debug ( "No enabled import lists, skipping." ) ;
2018-02-06 23:08:36 +00:00
return result ;
}
_logger . Debug ( "Available import lists {0}" , importLists . Count ) ;
2023-08-22 03:02:16 +00:00
var taskList = new List < Task > ( ) ;
var taskFactory = new TaskFactory ( TaskCreationOptions . LongRunning , TaskContinuationOptions . None ) ;
foreach ( var importList in importLists )
2018-02-06 23:08:36 +00:00
{
var importListLocal = importList ;
2022-12-08 03:09:42 +00:00
var importListStatus = _importListStatusService . GetLastSyncListInfo ( importListLocal . Definition . Id ) ;
2023-07-11 05:04:26 +00:00
if ( importListStatus . HasValue )
2022-12-08 03:09:42 +00:00
{
2023-07-11 05:04:26 +00:00
var importListNextSync = importListStatus . Value + importListLocal . MinRefreshInterval ;
if ( DateTime . UtcNow < importListNextSync )
{
_logger . Trace ( "Skipping refresh of Import List {0} ({1}) due to minimum refresh interval. Next sync after {2}" , importList . Name , importListLocal . Definition . Name , importListNextSync ) ;
2023-08-22 03:02:16 +00:00
continue ;
2023-07-11 05:04:26 +00:00
}
2022-12-08 03:09:42 +00:00
}
2018-02-06 23:08:36 +00:00
2023-08-22 03:02:16 +00:00
var task = taskFactory . StartNew ( ( ) = >
{
try
{
var importListReports = importListLocal . Fetch ( ) ;
2022-12-08 03:09:42 +00:00
2023-08-22 03:02:16 +00:00
lock ( result )
{
_logger . Debug ( "Found {0} reports from {1} ({2})" , importListReports . Count , importList . Name , importListLocal . Definition . Name ) ;
2018-02-06 23:08:36 +00:00
2023-08-22 03:02:16 +00:00
result . AddRange ( importListReports ) ;
}
2018-02-06 23:08:36 +00:00
2023-08-22 03:02:16 +00:00
_importListStatusService . UpdateListSyncStatus ( importList . Definition . Id ) ;
}
catch ( Exception e )
{
_logger . Error ( e , "Error during Import List Sync of {0} ({1})" , importList . Name , importListLocal . Definition . Name ) ;
}
} ) . LogExceptions ( ) ;
taskList . Add ( task ) ;
}
Task . WaitAll ( taskList . ToArray ( ) ) ;
2018-02-06 23:08:36 +00:00
2020-01-03 12:49:24 +00:00
result = result . DistinctBy ( r = > new { r . Artist , r . Album } ) . ToList ( ) ;
2018-02-06 23:08:36 +00:00
2023-07-11 05:04:26 +00:00
_logger . Debug ( "Found {0} total reports from {1} lists" , result . Count , importLists . Count ) ;
2018-02-06 23:08:36 +00:00
return result ;
}
2018-05-10 23:06:02 +00:00
public List < ImportListItemInfo > FetchSingleList ( ImportListDefinition definition )
{
var result = new List < ImportListItemInfo > ( ) ;
var importList = _importListFactory . GetInstance ( definition ) ;
if ( importList = = null | | ! definition . EnableAutomaticAdd )
{
2023-07-11 05:04:26 +00:00
_logger . Debug ( "Import List {0} ({1}) is not enabled, skipping." , importList . Name , importList . Definition . Name ) ;
2018-05-10 23:06:02 +00:00
return result ;
}
2023-08-22 03:02:16 +00:00
var taskList = new List < Task > ( ) ;
var taskFactory = new TaskFactory ( TaskCreationOptions . LongRunning , TaskContinuationOptions . None ) ;
2018-05-10 23:06:02 +00:00
var importListLocal = importList ;
2023-08-22 03:02:16 +00:00
var task = taskFactory . StartNew ( ( ) = >
2018-05-10 23:06:02 +00:00
{
2023-08-22 03:02:16 +00:00
try
2018-05-10 23:06:02 +00:00
{
2023-08-22 03:02:16 +00:00
var importListReports = importListLocal . Fetch ( ) ;
lock ( result )
{
_logger . Debug ( "Found {0} reports from {1} ({2})" , importListReports . Count , importList . Name , importListLocal . Definition . Name ) ;
result . AddRange ( importListReports ) ;
}
2018-05-10 23:06:02 +00:00
2023-08-22 03:02:16 +00:00
_importListStatusService . UpdateListSyncStatus ( importList . Definition . Id ) ;
}
catch ( Exception e )
{
_logger . Error ( e , "Error during Import List Sync of {0} ({1})" , importList . Name , importListLocal . Definition . Name ) ;
2023-08-20 21:46:55 +00:00
}
2023-08-22 03:02:16 +00:00
} ) . LogExceptions ( ) ;
2018-05-10 23:06:02 +00:00
2023-08-22 03:02:16 +00:00
taskList . Add ( task ) ;
Task . WaitAll ( taskList . ToArray ( ) ) ;
2018-05-10 23:06:02 +00:00
result = result . DistinctBy ( r = > new { r . Artist , r . Album } ) . ToList ( ) ;
return result ;
}
2018-02-06 23:08:36 +00:00
}
}