public TorrentSeedConfiguration GetSeedConfiguration(string infoHash) { if (infoHash.IsNullOrWhiteSpace()) { return(null); } infoHash = infoHash.ToUpper(); var cachedConfig = _cacheDownloads.Get(infoHash, () => FetchIndexer(infoHash)); if (cachedConfig == null) { return(null); } var seedConfig = _indexerSeedConfigProvider.GetSeedConfiguration(cachedConfig.IndexerId, cachedConfig.Discography); return(seedConfig); }
public void DownloadReport(RemoteAlbum remoteAlbum) { Ensure.That(remoteAlbum.Artist, () => remoteAlbum.Artist).IsNotNull(); Ensure.That(remoteAlbum.Albums, () => remoteAlbum.Albums).HasItems(); var downloadTitle = remoteAlbum.Release.Title; var downloadClient = _downloadClientProvider.GetDownloadClient(remoteAlbum.Release.DownloadProtocol); if (downloadClient == null) { throw new DownloadClientUnavailableException($"{remoteAlbum.Release.DownloadProtocol} Download client isn't configured yet"); } // Get the seed configuration for this release. remoteAlbum.SeedConfiguration = _seedConfigProvider.GetSeedConfiguration(remoteAlbum); // Limit grabs to 2 per second. if (remoteAlbum.Release.DownloadUrl.IsNotNullOrWhiteSpace() && !remoteAlbum.Release.DownloadUrl.StartsWith("magnet:")) { var url = new HttpUri(remoteAlbum.Release.DownloadUrl); _rateLimitService.WaitAndPulse(url.Host, TimeSpan.FromSeconds(2)); } string downloadClientId; try { downloadClientId = downloadClient.Download(remoteAlbum); _downloadClientStatusService.RecordSuccess(downloadClient.Definition.Id); _indexerStatusService.RecordSuccess(remoteAlbum.Release.IndexerId); } catch (ReleaseUnavailableException) { _logger.Trace("Release {0} no longer available on indexer.", remoteAlbum); throw; } catch (DownloadClientRejectedReleaseException) { _logger.Trace("Release {0} rejected by download client, possible duplicate.", remoteAlbum); throw; } catch (ReleaseDownloadException ex) { var http429 = ex.InnerException as TooManyRequestsException; if (http429 != null) { _indexerStatusService.RecordFailure(remoteAlbum.Release.IndexerId, http429.RetryAfter); } else { _indexerStatusService.RecordFailure(remoteAlbum.Release.IndexerId); } throw; } var albumGrabbedEvent = new AlbumGrabbedEvent(remoteAlbum); albumGrabbedEvent.DownloadClient = downloadClient.Name; if (!string.IsNullOrWhiteSpace(downloadClientId)) { albumGrabbedEvent.DownloadId = downloadClientId; } _logger.ProgressInfo("Report sent to {0}. {1}", downloadClient.Definition.Name, downloadTitle); _eventAggregator.PublishEvent(albumGrabbedEvent); }