Jackett/src/Jackett.Common/Services/CacheService.cs

105 lines
3.6 KiB
C#
Raw Normal View History

2020-02-09 02:35:16 +00:00
using System;
2015-07-26 14:22:20 +00:00
using System.Collections.Generic;
using System.Linq;
using AutoMapper;
using Jackett.Common.Indexers;
using Jackett.Common.Models;
using Jackett.Common.Services.Interfaces;
2015-07-26 14:22:20 +00:00
namespace Jackett.Common.Services
2015-07-26 14:22:20 +00:00
{
public class CacheService : ICacheService
{
private readonly List<TrackerCache> cache = new List<TrackerCache>();
2015-08-07 21:40:45 +00:00
private readonly int MAX_RESULTS_PER_TRACKER = 1000;
2019-04-14 01:59:48 +00:00
private readonly TimeSpan AGE_LIMIT = new TimeSpan(0, 1, 0, 0);
2015-07-26 14:22:20 +00:00
2015-08-07 21:40:45 +00:00
public void CacheRssResults(IIndexer indexer, IEnumerable<ReleaseInfo> releases)
2015-07-26 14:22:20 +00:00
{
lock (cache)
{
var trackerCache = cache.FirstOrDefault(c => c.TrackerId == indexer.Id);
2015-07-26 14:22:20 +00:00
if (trackerCache == null)
{
trackerCache = new TrackerCache
{
TrackerId = indexer.Id,
TrackerName = indexer.DisplayName
};
2015-07-26 14:22:20 +00:00
cache.Add(trackerCache);
}
2020-02-09 02:35:16 +00:00
foreach (var release in releases.OrderByDescending(i => i.PublishDate))
2015-07-26 14:22:20 +00:00
{
var existingItem = trackerCache.Results.FirstOrDefault(i => i.Result.Guid == release.Guid);
2015-07-26 14:22:20 +00:00
if (existingItem == null)
{
existingItem = new CachedResult
{
Created = DateTime.Now
};
2015-07-26 14:22:20 +00:00
trackerCache.Results.Add(existingItem);
}
existingItem.Result = release;
2015-07-26 14:22:20 +00:00
}
// Prune cache
2020-02-09 02:35:16 +00:00
foreach (var tracker in cache)
2015-07-26 14:22:20 +00:00
{
2019-04-14 01:59:48 +00:00
tracker.Results = tracker.Results.Where(x => x.Created > DateTime.Now.Subtract(AGE_LIMIT)).OrderByDescending(i => i.Created).Take(MAX_RESULTS_PER_TRACKER).ToList();
2015-07-26 14:22:20 +00:00
}
2015-08-07 21:40:45 +00:00
}
}
public int GetNewItemCount(IIndexer indexer, IEnumerable<ReleaseInfo> releases)
{
lock (cache)
{
var newItemCount = 0;
var trackerCache = cache.FirstOrDefault(c => c.TrackerId == indexer.Id);
2015-08-07 21:40:45 +00:00
if (trackerCache != null)
{
foreach (var release in releases)
{
if (trackerCache.Results.Count(i => i.Result.Guid == release.Guid) == 0)
2015-08-07 21:40:45 +00:00
{
newItemCount++;
}
}
}
2020-02-09 02:35:16 +00:00
else
{
2015-08-07 21:40:45 +00:00
newItemCount++;
}
return newItemCount;
2015-07-26 14:22:20 +00:00
}
}
public List<TrackerCacheResult> GetCachedResults()
2015-07-26 14:22:20 +00:00
{
lock (cache)
{
var results = new List<TrackerCacheResult>();
2020-02-09 02:35:16 +00:00
foreach (var tracker in cache)
2015-07-26 14:22:20 +00:00
{
2020-02-09 02:35:16 +00:00
foreach (var release in tracker.Results.OrderByDescending(i => i.Result.PublishDate).Take(300))
2015-07-26 14:22:20 +00:00
{
var item = Mapper.Map<TrackerCacheResult>(release.Result);
item.FirstSeen = release.Created;
item.Tracker = tracker.TrackerName;
item.TrackerId = tracker.TrackerId;
2015-07-26 14:22:20 +00:00
item.Peers = item.Peers - item.Seeders; // Use peers as leechers
results.Add(item);
}
}
2020-02-09 02:35:16 +00:00
return results.Take(3000).OrderByDescending(i => i.PublishDate).ToList();
2015-07-26 14:22:20 +00:00
}
}
}
}