Jackett/src/Jackett/Services/CacheService.cs

92 lines
3.2 KiB
C#
Raw Normal View History

2015-07-26 14:22:20 +00:00
using AutoMapper;
using Jackett.Indexers;
2015-07-26 14:22:20 +00:00
using Jackett.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Jackett.Services
{
public interface ICacheService
{
int CacheRssResults(IIndexer indexer, IEnumerable<ReleaseInfo> releases);
List<TrackerCacheResult> GetCachedResults(string serverUrl);
2015-07-26 14:22:20 +00:00
}
public class CacheService : ICacheService
{
private readonly List<TrackerCache> cache = new List<TrackerCache>();
2015-08-02 17:39:32 +00:00
private readonly int MAX_RESULTS_PER_TRACKER = 250;
private readonly TimeSpan AGE_LIMIT = new TimeSpan(7, 0, 0, 0);
2015-07-26 14:22:20 +00:00
public int CacheRssResults(IIndexer indexer, IEnumerable<ReleaseInfo> releases)
2015-07-26 14:22:20 +00:00
{
lock (cache)
{
int newItemCount = 0;
var trackerCache = cache.Where(c => c.TrackerId == indexer.ID).FirstOrDefault();
2015-07-26 14:22:20 +00:00
if (trackerCache == null)
{
trackerCache = new TrackerCache();
trackerCache.TrackerId = indexer.ID;
trackerCache.TrackerName = indexer.DisplayName;
2015-07-26 14:22:20 +00:00
cache.Add(trackerCache);
}
foreach(var release in releases.OrderByDescending(i=>i.PublishDate))
{
// Skip old releases
if(release.PublishDate-DateTime.Now> AGE_LIMIT)
{
continue;
}
var existingItem = trackerCache.Results.Where(i => i.Result.Guid == release.Guid).FirstOrDefault();
if (existingItem == null)
{
existingItem = new CachedResult();
existingItem.Created = DateTime.Now;
trackerCache.Results.Add(existingItem);
newItemCount++;
2015-07-26 14:22:20 +00:00
}
existingItem.Result = release;
}
// Prune cache
foreach(var tracker in cache)
{
tracker.Results = tracker.Results.OrderByDescending(i => i.Created).Take(MAX_RESULTS_PER_TRACKER).ToList();
}
return newItemCount;
2015-07-26 14:22:20 +00:00
}
}
public List<TrackerCacheResult> GetCachedResults(string serverUrl)
2015-07-26 14:22:20 +00:00
{
lock (cache)
{
var results = new List<TrackerCacheResult>();
foreach(var tracker in cache)
{
foreach(var release in tracker.Results)
{
var item = Mapper.Map<TrackerCacheResult>(release.Result);
item.FirstSeen = release.Created;
item.Tracker = tracker.TrackerName;
2015-07-26 14:22:20 +00:00
item.Peers = item.Peers - item.Seeders; // Use peers as leechers
item.ConvertToProxyLink(serverUrl, tracker.TrackerId);
2015-07-26 14:22:20 +00:00
results.Add(item);
}
}
return results.OrderByDescending(i=>i.PublishDate).ToList();
}
}
}
}