2017-11-16 17:32:31 +00:00
|
|
|
using System.Net;
|
2020-01-03 12:49:24 +00:00
|
|
|
using NLog;
|
2014-09-07 11:39:00 +00:00
|
|
|
using NzbDrone.Common.Disk;
|
2020-01-03 12:49:24 +00:00
|
|
|
using NzbDrone.Common.Extensions;
|
2014-09-07 11:39:00 +00:00
|
|
|
using NzbDrone.Common.Http;
|
2020-01-03 12:49:24 +00:00
|
|
|
using NzbDrone.Core.Configuration;
|
2014-09-07 11:39:00 +00:00
|
|
|
using NzbDrone.Core.Exceptions;
|
|
|
|
using NzbDrone.Core.Indexers;
|
|
|
|
using NzbDrone.Core.Organizer;
|
|
|
|
using NzbDrone.Core.Parser.Model;
|
2014-09-11 20:24:00 +00:00
|
|
|
using NzbDrone.Core.RemotePathMappings;
|
2020-01-03 12:49:24 +00:00
|
|
|
using NzbDrone.Core.ThingiProvider;
|
2014-09-07 11:39:00 +00:00
|
|
|
|
|
|
|
namespace NzbDrone.Core.Download
|
|
|
|
{
|
|
|
|
public abstract class UsenetClientBase<TSettings> : DownloadClientBase<TSettings>
|
|
|
|
where TSettings : IProviderConfig, new()
|
|
|
|
{
|
|
|
|
protected readonly IHttpClient _httpClient;
|
2017-11-26 03:55:50 +00:00
|
|
|
private readonly IValidateNzbs _nzbValidationService;
|
2014-09-07 11:39:00 +00:00
|
|
|
|
|
|
|
protected UsenetClientBase(IHttpClient httpClient,
|
2014-09-11 20:24:00 +00:00
|
|
|
IConfigService configService,
|
|
|
|
IDiskProvider diskProvider,
|
|
|
|
IRemotePathMappingService remotePathMappingService,
|
2017-11-26 03:55:50 +00:00
|
|
|
IValidateNzbs nzbValidationService,
|
2014-09-11 20:24:00 +00:00
|
|
|
Logger logger)
|
2014-10-13 21:11:35 +00:00
|
|
|
: base(configService, diskProvider, remotePathMappingService, logger)
|
2014-09-07 11:39:00 +00:00
|
|
|
{
|
|
|
|
_httpClient = httpClient;
|
2017-11-26 03:55:50 +00:00
|
|
|
_nzbValidationService = nzbValidationService;
|
2014-09-07 11:39:00 +00:00
|
|
|
}
|
2020-01-03 12:49:24 +00:00
|
|
|
|
2016-12-09 06:54:15 +00:00
|
|
|
public override DownloadProtocol Protocol => DownloadProtocol.Usenet;
|
2014-09-07 11:39:00 +00:00
|
|
|
|
2017-08-14 02:58:42 +00:00
|
|
|
protected abstract string AddFromNzbFile(RemoteAlbum remoteAlbum, string filename, byte[] fileContent);
|
2014-09-07 11:39:00 +00:00
|
|
|
|
2017-08-14 02:58:42 +00:00
|
|
|
public override string Download(RemoteAlbum remoteAlbum)
|
2014-09-07 11:39:00 +00:00
|
|
|
{
|
2017-08-14 02:58:42 +00:00
|
|
|
var url = remoteAlbum.Release.DownloadUrl;
|
2020-01-03 12:49:24 +00:00
|
|
|
var filename = FileNameBuilder.CleanFileName(remoteAlbum.Release.Title) + ".nzb";
|
2014-09-07 11:39:00 +00:00
|
|
|
|
2015-10-03 17:45:26 +00:00
|
|
|
byte[] nzbData;
|
2014-09-07 11:39:00 +00:00
|
|
|
|
|
|
|
try
|
|
|
|
{
|
2017-12-17 23:34:58 +00:00
|
|
|
var nzbDataRequest = new HttpRequest(url);
|
2021-03-07 23:28:37 +00:00
|
|
|
nzbDataRequest.RateLimitKey = remoteAlbum?.Release?.IndexerId.ToString();
|
2017-12-17 23:34:58 +00:00
|
|
|
|
|
|
|
// TODO: Look into moving download request handling to indexer
|
|
|
|
if (remoteAlbum.Release.BasicAuthString.IsNotNullOrWhiteSpace())
|
|
|
|
{
|
|
|
|
nzbDataRequest.Headers.Set("Authorization", "Basic " + remoteAlbum.Release.BasicAuthString);
|
|
|
|
}
|
2020-01-03 12:49:24 +00:00
|
|
|
|
2017-12-17 23:34:58 +00:00
|
|
|
nzbData = _httpClient.Get(nzbDataRequest).ResponseData;
|
2015-07-22 18:33:20 +00:00
|
|
|
|
2017-08-14 02:58:42 +00:00
|
|
|
_logger.Debug("Downloaded nzb for release '{0}' finished ({1} bytes from {2})", remoteAlbum.Release.Title, nzbData.Length, url);
|
2014-09-07 11:39:00 +00:00
|
|
|
}
|
2015-06-27 09:43:17 +00:00
|
|
|
catch (HttpException ex)
|
|
|
|
{
|
2017-11-16 17:32:31 +00:00
|
|
|
if (ex.Response.StatusCode == HttpStatusCode.NotFound)
|
|
|
|
{
|
|
|
|
_logger.Error(ex, "Downloading nzb file for album '{0}' failed since it no longer exists ({1})", remoteAlbum.Release.Title, url);
|
2020-04-16 20:16:50 +00:00
|
|
|
throw new ReleaseUnavailableException(remoteAlbum.Release, "Downloading nzb failed", ex);
|
2017-11-16 17:32:31 +00:00
|
|
|
}
|
|
|
|
|
2016-06-14 21:15:41 +00:00
|
|
|
if ((int)ex.Response.StatusCode == 429)
|
|
|
|
{
|
|
|
|
_logger.Error("API Grab Limit reached for {0}", url);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2017-08-14 02:58:42 +00:00
|
|
|
_logger.Error(ex, "Downloading nzb for release '{0}' failed ({1})", remoteAlbum.Release.Title, url);
|
2016-06-14 21:15:41 +00:00
|
|
|
}
|
2015-06-27 09:43:17 +00:00
|
|
|
|
2017-08-14 02:58:42 +00:00
|
|
|
throw new ReleaseDownloadException(remoteAlbum.Release, "Downloading nzb failed", ex);
|
2015-06-27 09:43:17 +00:00
|
|
|
}
|
2014-09-07 11:39:00 +00:00
|
|
|
catch (WebException ex)
|
|
|
|
{
|
2017-08-14 02:58:42 +00:00
|
|
|
_logger.Error(ex, "Downloading nzb for release '{0}' failed ({1})", remoteAlbum.Release.Title, url);
|
2014-09-07 11:39:00 +00:00
|
|
|
|
2017-08-14 02:58:42 +00:00
|
|
|
throw new ReleaseDownloadException(remoteAlbum.Release, "Downloading nzb failed", ex);
|
2014-09-07 11:39:00 +00:00
|
|
|
}
|
|
|
|
|
2017-11-26 03:55:50 +00:00
|
|
|
_nzbValidationService.Validate(filename, nzbData);
|
|
|
|
|
2017-08-14 02:58:42 +00:00
|
|
|
_logger.Info("Adding report [{0}] to the queue.", remoteAlbum.Release.Title);
|
|
|
|
return AddFromNzbFile(remoteAlbum, filename, nzbData);
|
2014-09-07 11:39:00 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|