|
|
|
@ -1,9 +1,8 @@
|
|
|
|
|
using System;
|
|
|
|
|
using System.Linq;
|
|
|
|
|
using NzbDrone.Common.Extensions;
|
|
|
|
|
using NzbDrone.Common.Cache;
|
|
|
|
|
using NzbDrone.Core.Datastore;
|
|
|
|
|
using NzbDrone.Core.Download.Clients;
|
|
|
|
|
using NzbDrone.Core.Indexers;
|
|
|
|
|
using NzbDrone.Core.Messaging.Events;
|
|
|
|
|
using NzbDrone.Core.Parser.Model;
|
|
|
|
|
|
|
|
|
|
namespace NzbDrone.Core.Indexers
|
|
|
|
@ -11,15 +10,20 @@ namespace NzbDrone.Core.Indexers
|
|
|
|
|
public interface ISeedConfigProvider
|
|
|
|
|
{
|
|
|
|
|
TorrentSeedConfiguration GetSeedConfiguration(RemoteEpisode release);
|
|
|
|
|
TorrentSeedConfiguration GetSeedConfiguration(int indexerId, bool fullSeason);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public class SeedConfigProvider : ISeedConfigProvider
|
|
|
|
|
public class SeedConfigProvider : ISeedConfigProvider, IHandle<IndexerSettingUpdatedEvent>
|
|
|
|
|
{
|
|
|
|
|
private readonly IIndexerFactory _indexerFactory;
|
|
|
|
|
|
|
|
|
|
public SeedConfigProvider(IIndexerFactory indexerFactory)
|
|
|
|
|
private readonly ICached<SeedCriteriaSettings> _cache;
|
|
|
|
|
|
|
|
|
|
public SeedConfigProvider(IIndexerFactory indexerFactory, ICacheManager cacheManager)
|
|
|
|
|
{
|
|
|
|
|
_indexerFactory = indexerFactory;
|
|
|
|
|
|
|
|
|
|
_cache = cacheManager.GetRollingCache<SeedCriteriaSettings>(GetType(), "criteriaByIndexer", TimeSpan.FromHours(1));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public TorrentSeedConfiguration GetSeedConfiguration(RemoteEpisode remoteEpisode)
|
|
|
|
@ -27,19 +31,23 @@ namespace NzbDrone.Core.Indexers
|
|
|
|
|
if (remoteEpisode.Release.DownloadProtocol != DownloadProtocol.Torrent) return null;
|
|
|
|
|
if (remoteEpisode.Release.IndexerId == 0) return null;
|
|
|
|
|
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
var indexer = _indexerFactory.Get(remoteEpisode.Release.IndexerId);
|
|
|
|
|
var torrentIndexerSettings = indexer.Settings as ITorrentIndexerSettings;
|
|
|
|
|
return GetSeedConfiguration(remoteEpisode.Release.IndexerId, remoteEpisode.ParsedEpisodeInfo.FullSeason);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (torrentIndexerSettings != null && torrentIndexerSettings.SeedCriteria != null)
|
|
|
|
|
public TorrentSeedConfiguration GetSeedConfiguration(int indexerId, bool fullSeason)
|
|
|
|
|
{
|
|
|
|
|
if (indexerId == 0) return null;
|
|
|
|
|
|
|
|
|
|
var seedCriteria = _cache.Get(indexerId.ToString(), () => FetchSeedCriteria(indexerId));
|
|
|
|
|
|
|
|
|
|
if (seedCriteria == null) return null;
|
|
|
|
|
|
|
|
|
|
var seedConfig = new TorrentSeedConfiguration
|
|
|
|
|
{
|
|
|
|
|
Ratio = torrentIndexerSettings.SeedCriteria.SeedRatio
|
|
|
|
|
Ratio = seedCriteria.SeedRatio
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
var seedTime = remoteEpisode.ParsedEpisodeInfo.FullSeason ? torrentIndexerSettings.SeedCriteria.SeasonPackSeedTime : torrentIndexerSettings.SeedCriteria.SeedTime;
|
|
|
|
|
var seedTime = fullSeason ? seedCriteria.SeasonPackSeedTime : seedCriteria.SeedTime;
|
|
|
|
|
if (seedTime.HasValue)
|
|
|
|
|
{
|
|
|
|
|
seedConfig.SeedTime = TimeSpan.FromMinutes(seedTime.Value);
|
|
|
|
@ -47,13 +55,25 @@ namespace NzbDrone.Core.Indexers
|
|
|
|
|
|
|
|
|
|
return seedConfig;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private SeedCriteriaSettings FetchSeedCriteria(int indexerId)
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
var indexer = _indexerFactory.Get(indexerId);
|
|
|
|
|
var torrentIndexerSettings = indexer.Settings as ITorrentIndexerSettings;
|
|
|
|
|
|
|
|
|
|
return torrentIndexerSettings?.SeedCriteria;
|
|
|
|
|
}
|
|
|
|
|
catch (ModelNotFoundException)
|
|
|
|
|
{
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return null;
|
|
|
|
|
public void Handle(IndexerSettingUpdatedEvent message)
|
|
|
|
|
{
|
|
|
|
|
_cache.Clear();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|