using Common.Configuration;
using Common.Enums;
using Infrastructure.Events;
using Infrastructure.Http;
using Infrastructure.Interceptors;
using Infrastructure.Verticals.ContentBlocker;
using Infrastructure.Verticals.DownloadClient.Deluge;
using Infrastructure.Verticals.DownloadClient.QBittorrent;
using Infrastructure.Verticals.DownloadClient.Transmission;
using Infrastructure.Verticals.Files;
using Infrastructure.Verticals.ItemStriker;
using Microsoft.Extensions.Caching.Memory;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
namespace Infrastructure.Verticals.DownloadClient;
///
/// Factory responsible for creating download client service instances
///
public sealed class DownloadServiceFactory
{
private readonly IServiceProvider _serviceProvider;
private readonly ILogger _logger;
public DownloadServiceFactory(
IServiceProvider serviceProvider,
ILogger logger)
{
_serviceProvider = serviceProvider;
_logger = logger;
}
// ///
// /// Creates a download service using the specified client ID
// ///
// /// The client ID to create a service for
// /// An implementation of IDownloadService or null if the client is not available
// public IDownloadService? GetDownloadService(Guid clientId)
// {
// var config = _configManager.GetConfiguration();
// var clientConfig = config.GetClientConfig(clientId);
//
// if (clientConfig == null)
// {
// _logger.LogWarning("No download client configuration found for ID {clientId}", clientId);
// return null;
// }
//
// if (!clientConfig.Enabled)
// {
// _logger.LogWarning("Download client {clientId} is disabled", clientId);
// return null;
// }
//
// return GetDownloadService(clientConfig);
// }
///
/// Creates a download service using the specified client configuration
///
/// The client configuration to use
/// An implementation of IDownloadService or null if the client is not available
public IDownloadService GetDownloadService(DownloadClientConfig downloadClientConfig)
{
if (!downloadClientConfig.Enabled)
{
_logger.LogWarning("Download client {clientId} is disabled, but a service was requested", downloadClientConfig.Id);
}
return downloadClientConfig.TypeName switch
{
DownloadClientTypeName.QBittorrent => CreateQBitService(downloadClientConfig),
DownloadClientTypeName.Deluge => CreateDelugeService(downloadClientConfig),
DownloadClientTypeName.Transmission => CreateTransmissionService(downloadClientConfig),
_ => throw new NotSupportedException($"Download client type {downloadClientConfig.TypeName} is not supported")
};
}
private QBitService CreateQBitService(DownloadClientConfig downloadClientConfig)
{
var logger = _serviceProvider.GetRequiredService>();
var cache = _serviceProvider.GetRequiredService();
var filenameEvaluator = _serviceProvider.GetRequiredService();
var striker = _serviceProvider.GetRequiredService();
var dryRunInterceptor = _serviceProvider.GetRequiredService();
var hardLinkFileService = _serviceProvider.GetRequiredService();
var httpClientProvider = _serviceProvider.GetRequiredService();
var eventPublisher = _serviceProvider.GetRequiredService();
var blocklistProvider = _serviceProvider.GetRequiredService();
// Create the QBitService instance
QBitService service = new(
logger, cache, filenameEvaluator, striker, dryRunInterceptor,
hardLinkFileService, httpClientProvider, eventPublisher, blocklistProvider, downloadClientConfig
);
return service;
}
private DelugeService CreateDelugeService(DownloadClientConfig downloadClientConfig)
{
var logger = _serviceProvider.GetRequiredService>();
var filenameEvaluator = _serviceProvider.GetRequiredService();
var cache = _serviceProvider.GetRequiredService();
var striker = _serviceProvider.GetRequiredService();
var dryRunInterceptor = _serviceProvider.GetRequiredService();
var hardLinkFileService = _serviceProvider.GetRequiredService();
var httpClientProvider = _serviceProvider.GetRequiredService();
var eventPublisher = _serviceProvider.GetRequiredService();
var blocklistProvider = _serviceProvider.GetRequiredService();
// Create the DelugeService instance
DelugeService service = new(
logger, cache, filenameEvaluator, striker, dryRunInterceptor,
hardLinkFileService, httpClientProvider, eventPublisher, blocklistProvider, downloadClientConfig
);
return service;
}
private TransmissionService CreateTransmissionService(DownloadClientConfig downloadClientConfig)
{
var logger = _serviceProvider.GetRequiredService>();
var cache = _serviceProvider.GetRequiredService();
var filenameEvaluator = _serviceProvider.GetRequiredService();
var striker = _serviceProvider.GetRequiredService();
var dryRunInterceptor = _serviceProvider.GetRequiredService();
var hardLinkFileService = _serviceProvider.GetRequiredService();
var httpClientProvider = _serviceProvider.GetRequiredService();
var eventPublisher = _serviceProvider.GetRequiredService();
var blocklistProvider = _serviceProvider.GetRequiredService();
// Create the TransmissionService instance
TransmissionService service = new(
logger, cache, filenameEvaluator, striker, dryRunInterceptor,
hardLinkFileService, httpClientProvider, eventPublisher, blocklistProvider, downloadClientConfig
);
return service;
}
}