using System.Net; using System; using NzbDrone.Common.Disk; using NzbDrone.Common.Http; using NzbDrone.Core.Exceptions; using NzbDrone.Core.Indexers; using NzbDrone.Core.Organizer; using NzbDrone.Core.Parser.Model; using NzbDrone.Core.ThingiProvider; using NzbDrone.Core.Configuration; using NLog; using NzbDrone.Core.RemotePathMappings; namespace NzbDrone.Core.Download { public abstract class UsenetClientBase : DownloadClientBase where TSettings : IProviderConfig, new() { protected readonly IHttpClient _httpClient; protected UsenetClientBase(IHttpClient httpClient, IConfigService configService, IDiskProvider diskProvider, IRemotePathMappingService remotePathMappingService, Logger logger) : base(configService, diskProvider, remotePathMappingService, logger) { _httpClient = httpClient; } public override DownloadProtocol Protocol => DownloadProtocol.Usenet; protected abstract string AddFromNzbFile(RemoteEpisode remoteEpisode, string filename, byte[] fileContents); protected abstract string AddFromNzbFile(RemoteMovie remoteMovie, string filename, byte[] fileContents); public override string Download(RemoteEpisode remoteEpisode) { var url = remoteEpisode.Release.DownloadUrl; var filename = FileNameBuilder.CleanFileName(remoteEpisode.Release.Title) + ".nzb"; byte[] nzbData; try { nzbData = _httpClient.Get(new HttpRequest(url)).ResponseData; _logger.Debug("Downloaded nzb for episode '{0}' finished ({1} bytes from {2})", remoteEpisode.Release.Title, nzbData.Length, url); } catch (HttpException ex) { if ((int)ex.Response.StatusCode == 429) { _logger.Error("API Grab Limit reached for {0}", url); } else { _logger.Error(ex, "Downloading nzb for episode '{0}' failed ({1})", remoteEpisode.Release.Title, url); } throw new ReleaseDownloadException(remoteEpisode.Release, "Downloading nzb failed", ex); } catch (WebException ex) { _logger.Error(ex, "Downloading nzb for episode '{0}' failed ({1})", remoteEpisode.Release.Title, url); throw new ReleaseDownloadException(remoteEpisode.Release, "Downloading nzb failed", ex); } _logger.Info("Adding report [{0}] to the queue.", remoteEpisode.Release.Title); return AddFromNzbFile(remoteEpisode, filename, nzbData); } public override string Download(RemoteMovie remoteEpisode) { var url = remoteEpisode.Release.DownloadUrl; var filename = FileNameBuilder.CleanFileName(remoteEpisode.Release.Title) + ".nzb"; byte[] nzbData; try { nzbData = _httpClient.Get(new HttpRequest(url)).ResponseData; _logger.Debug("Downloaded nzb for episode '{0}' finished ({1} bytes from {2})", remoteEpisode.Release.Title, nzbData.Length, url); } catch (HttpException ex) { if ((int)ex.Response.StatusCode == 429) { _logger.Error("API Grab Limit reached for {0}", url); } else { _logger.Error(ex, "Downloading nzb for episode '{0}' failed ({1})", remoteEpisode.Release.Title, url); } throw new ReleaseDownloadException(remoteEpisode.Release, "Downloading nzb failed", ex); } catch (WebException ex) { _logger.Error(ex, "Downloading nzb for episode '{0}' failed ({1})", remoteEpisode.Release.Title, url); throw new ReleaseDownloadException(remoteEpisode.Release, "Downloading nzb failed", ex); } _logger.Info("Adding report [{0}] to the queue.", remoteEpisode.Release.Title); return AddFromNzbFile(remoteEpisode, filename, nzbData); } } }